summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorJoão Augusto Costa Branco Marado Torres <torres.dev@disroot.org>2025-07-06 22:27:04 -0300
committerJoão Augusto Costa Branco Marado Torres <torres.dev@disroot.org>2025-07-06 22:27:04 -0300
commit449f71511e539878af4c65f073cdc373b469c45e (patch)
tree6c264a77426284d97d1c9b9d7a27a6015c3077a8 /src/components
parent4ae2b810b68538ba4c287b0c80d6c2e002fe9ddd (diff)
feat: more structured data
Signed-off-by: João Augusto Costa Branco Marado Torres <torres.dev@disroot.org>
Diffstat (limited to 'src/components')
-rw-r--r--src/components/BaseHead.astro15
-rw-r--r--src/components/Footer.astro25
-rw-r--r--src/components/Header.astro3
-rw-r--r--src/components/organisms/Date.astro3
-rw-r--r--src/components/organisms/KeywordsList.astro2
-rw-r--r--src/components/templates/MicroBlog.astro27
-rw-r--r--src/components/templates/Search.astro15
-rw-r--r--src/components/templates/SimplePostList.astro33
8 files changed, 90 insertions, 33 deletions
diff --git a/src/components/BaseHead.astro b/src/components/BaseHead.astro
index 885447c..b57127a 100644
--- a/src/components/BaseHead.astro
+++ b/src/components/BaseHead.astro
@@ -58,13 +58,22 @@ const {
type="text/html"
title={`${isOnion ? "Clearnet" : "Tor"} version`}
>
+<link
+ rel="license"
+ href="https://www.gnu.org/licenses/agpl-3.0.html"
+ itemprop="license"
+/>
<!-- Primary Meta Tags -->
<title>{title}</title>
-<meta name="title" content={title} />
-<meta name="description" content={description} />
+<meta name="title" content={title} itemprop="name" />
+<meta name="description" content={description} itemprop="description" />
<meta name="author" content={PUBLIC_SITE_AUTHOR} />
-{keywords.length > 0 && <meta name="keywords" content={keywords.join(",")} />}
+{
+ keywords.length > 0 && (
+ <meta name="keywords" content={keywords.join(",")} itemprop="keywords" />
+ )
+}
<meta name="theme-color" content="oklch(0.4564 0.1835 20.81)" />
<meta
name="theme-color"
diff --git a/src/components/Footer.astro b/src/components/Footer.astro
index 3238c50..f69ba8a 100644
--- a/src/components/Footer.astro
+++ b/src/components/Footer.astro
@@ -22,10 +22,20 @@ const git = isOnion ? PUBLIC_GIT_TOR_URL ?? PUBLIC_GIT_URL : PUBLIC_GIT_URL;
</p>
)
}
- <address>
+ <address
+ itemprop="maintainer author"
+ itemscope
+ itemtype="https://schema.org/Person"
+ >
+ <link href={site} rel="author" itemprop="url" />
<p>
- Sítio web de <a href={site} target="_blank" rel="author"
- >João Augusto Costa Branco Marado Torres</a>
+ Sítio web de <a href={site} target="_blank" rel="author" itemprop="name"
+ >João Augusto Costa Branco Marado Torres</a> &lt;<a
+ href="mailto:torres.dev@disroot.pt"
+ target="_blank"
+ rel="author"
+ itemprop="email"
+ >torres.dev@disroot.pt</a>&gt;
</p>
{
PUBLIC_SIMPLE_X_ADDRESS && (
@@ -42,10 +52,15 @@ const git = isOnion ? PUBLIC_GIT_TOR_URL ?? PUBLIC_GIT_URL : PUBLIC_GIT_URL;
</p>
<section id="copying" class="mute">
<h2 class="sr-only">Licença de <span lang="en">Software</span></h2>
- <div lang="en">
+ <div lang="en" itemprop="copyrightNotice">
<p>
&lt;<a href="/" hreflang="pt-PT">cravodeabril.pt</a>&gt; Copyright
- &copy; 2025 João Augusto Costa Branco Marado Torres
+ &copy; <time datetime="2025" itemprop="copyrightYear">2025</time> <span
+ itemprop="copyrightHolder"
+ itemscope
+ itemtype="Person"
+ ><span itemprop="name"
+ >João Augusto Costa Branco Marado Torres</span></span>
</p>
<p>
This program is free software: you can redistribute it and/or modify it
diff --git a/src/components/Header.astro b/src/components/Header.astro
index 496337f..39fe35f 100644
--- a/src/components/Header.astro
+++ b/src/components/Header.astro
@@ -5,7 +5,8 @@ import Search from "./templates/Search.astro";
<header>
<h1>
- <span class="bracket">&lt;</span><a href="/">cravodeabril.pt</a><span
+ <span class="bracket">&lt;</span><a itemprop="url" href="/"
+ >cravodeabril.pt</a><span
class="bracket"
>&gt;</span>
</h1>
diff --git a/src/components/organisms/Date.astro b/src/components/organisms/Date.astro
index c1ec7e5..960cfb7 100644
--- a/src/components/organisms/Date.astro
+++ b/src/components/organisms/Date.astro
@@ -1,8 +1,11 @@
---
+import type { HTMLAttributes } from "astro/types";
+
interface Props {
date: Date;
locales: Intl.LocalesArgument;
options: Intl.DateTimeFormatOptions;
+ itemprop: HTMLAttributes<"time">["itemprop"];
}
const { date, locales, options } = Astro.props;
diff --git a/src/components/organisms/KeywordsList.astro b/src/components/organisms/KeywordsList.astro
index 4d4b140..d3b9e7f 100644
--- a/src/components/organisms/KeywordsList.astro
+++ b/src/components/organisms/KeywordsList.astro
@@ -7,7 +7,7 @@ const { keywords } = Astro.props;
---
<p>
- {keywords.map((x) => <span>#<b>{x}</b></span>)}
+ {keywords.map((x) => <span>#<b itemprop="keywords">{x}</b></span>)}
</p>
<style>
diff --git a/src/components/templates/MicroBlog.astro b/src/components/templates/MicroBlog.astro
index c16155e..88321dc 100644
--- a/src/components/templates/MicroBlog.astro
+++ b/src/components/templates/MicroBlog.astro
@@ -2,12 +2,9 @@
import Date from "@components/organisms/Date.astro";
import KeywordsList from "@components/organisms/KeywordsList.astro";
import { getFirstUserID, getLastUpdate } from "@lib/collection/helpers";
-import { Micro } from "@lib/collection/schemas";
-import type { CollectionEntry, z } from "astro:content";
+import type { Micro, MicroEntry } from "@lib/collection/schemas";
-interface Props extends CollectionEntry<"blog"> {
- data: z.infer<typeof Micro>;
-}
+interface Props extends MicroEntry {}
const micro = Astro.props;
const { id, data, rendered } = micro;
@@ -19,10 +16,14 @@ const [first, ...names] = display.split(/\s/);
const last = names.length > 0 ? names[names.length - 1] : "";
const little = ((first?.[0] ?? "") + (last?.[0] ?? "")).slice(0, 2);
---
-<article>
+<article
+ itemprop="blogPost"
+ itemscope
+ itemtype="https://schema.org/BlogPosting"
+>
<header>
<h3 class="title">
- <a href={`/blog/read/${id}`}>{title}</a>
+ <a href={`/blog/read/${id}`} itemprop="headline name">{title}</a>
</h3>
<span class="profile_picture">{
user?.website ? <a href={user.website}>{little}</a> : (
@@ -30,15 +31,21 @@ const little = ((first?.[0] ?? "") + (last?.[0] ?? "")).slice(0, 2);
)
}</span>
<div>
- {first} {last} <small>· <Date
+ <span
+ itemprop="author"
+ itemscope
+ itemtype="https://schema.org/Person"
+ ><span itemprop="alternateName">{first} {last}</span></span>
+ <span class="small">· <Date
{date}
locales={lang}
options={{ month: "short", day: "numeric" }}
- /></small>
+ itemprop="dateModified"
+ /></span>
</div>
</header>
<div class="content small">
- <div {lang}>
+ <div {lang} itemprop="articleBody text">
<Fragment set:html={rendered?.html} />
</div>
<footer>
diff --git a/src/components/templates/Search.astro b/src/components/templates/Search.astro
index 5245643..ae80d32 100644
--- a/src/components/templates/Search.astro
+++ b/src/components/templates/Search.astro
@@ -2,8 +2,16 @@
const { site } = Astro;
---
-<search>
- <link rel="dns-prefetch" href="https://www.google.com/search">
+<search
+ itemprop="potentialAction"
+ itemscope
+ itemtype="https://schema.org/SearchAction"
+>
+ <link
+ rel="dns-prefetch"
+ href="https://www.google.com/search"
+ itemprop="target"
+ >
<form
action="https://www.google.com/search"
target="_blank"
@@ -13,7 +21,7 @@ const { site } = Astro;
name="search"
>
<details>
- <summary>Pesquisar no website</summary>
+ <summary itemprop="description">Pesquisar no website</summary>
<div class="details">
<p>
<label>Barra de pesquisa <input
@@ -25,6 +33,7 @@ const { site } = Astro;
title={`"site:${site} " é usado para que os resultados da pesquisa fiquem restritos a este website`}
pattern={`site:${site} .+`}
size={`site:${site} .+`.length}
+ itemprop="query"
/></label>
</p>
<p class="mute">
diff --git a/src/components/templates/SimplePostList.astro b/src/components/templates/SimplePostList.astro
index c2c002b..164b32b 100644
--- a/src/components/templates/SimplePostList.astro
+++ b/src/components/templates/SimplePostList.astro
@@ -21,14 +21,22 @@ const { posts } = Astro.props;
const display = name ?? email ?? entity;
return (
<li>
- <article>
- <h3><a href={`/blog/read/${id}`}>{title}</a></h3>
- {
- description &&
- description.split("\n\n").map((paragraph) => (
- <p class="small">{paragraph}</p>
- ))
- }
+ <article
+ itemprop="blogPost"
+ itemscope
+ itemtype="https://schema.org/BlogPosting"
+ >
+ <h3>
+ <a href={`/blog/read/${id}`} itemprop="headline name">{title}</a>
+ </h3>
+ <div itemprop="abstract">
+ {
+ description &&
+ description.split("\n\n").map((paragraph) => (
+ <p class="small">{paragraph}</p>
+ ))
+ }
+ </div>
<footer class="small">
<Date
@@ -39,7 +47,12 @@ const { posts } = Astro.props;
month: "long",
day: "numeric",
}}
- />{display}
+ itemprop="dateModified"
+ /><span
+ itemprop="author"
+ itemscope
+ itemtype="https://schema.org/Person"
+ ><span itemprop="alternateName">{display}</span></span>
<KeywordsList {keywords} />
</footer>
</article>
@@ -58,7 +71,7 @@ const { posts } = Astro.props;
& > article {
padding-inline-end: calc(var(--size-9) * 1em);
- & > p:not(:first-of-type) {
+ & > [itemprop="abstract"] > p:not(:first-of-type) {
margin-block-start: 1.5em;
}