From 31969b417dfd40a4e4a2a8b3c896408a8df54209 Mon Sep 17 00:00:00 2001 From: Tobias Leinss <7684178+leinss@users.noreply.github.com> Date: Wed, 26 Aug 2026 16:02:23 +0200 Subject: [PATCH 1/2] a11y: give every page an h1, and name the one unnamed link 35 of 82 pages had no h1 at all. PageLayout takes a `title` but only puts it in ``, so four templates rendered their page title in a styled `div` and the document had no top-level heading: the two dynamic routes, education and social. A screen reader user landing on a project page got a document whose first heading was an h2 belonging to the newsletter widget. Promotes the existing title element from `div` to `h1` rather than adding a second heading. Zero visual change, because Tailwind preflight resets heading font-size and margin and every class is carried over. Verified in the browser against the built site: the promoted h1 computes to font-size 18px, weight 600, margin-top 0, which is what the div rendered. Also adds alt text to the one image that had none, on the Farcaster project page. That image is the only content of a link to a YouTube video, so with no alt the link had no accessible name either. Not changed, having checked: twelve other image-only links were flagged by a first pass and are fine. An img with alt text names its wrapping link, and they all carry `alt="demo image"`. That alt is uninformative and worth improving as content, but it is not a missing name. Test plan: - [x] `pnpm run lint` and `pnpm run build` pass, 82 pages - [x] internal link check still 1760 links, none broken - [x] re-audit: pages with no h1 went 35 -> 0, images without alt 1 -> 0, genuinely unnamed links 1 -> 0 - [x] computed style of a promoted h1 read from the rendered page, not assumed --- src/content/projects/farcaster-hackathons/index.md | 2 +- src/pages/[...slug].astro | 4 ++-- src/pages/education/index.astro | 4 ++-- src/pages/projects/[...slug].astro | 4 ++-- src/pages/social.astro | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/projects/farcaster-hackathons/index.md b/src/content/projects/farcaster-hackathons/index.md index 6cc0461b0..363086ae5 100644 --- a/src/content/projects/farcaster-hackathons/index.md +++ b/src/content/projects/farcaster-hackathons/index.md @@ -11,7 +11,7 @@ repoURL: "" July 2024 - + Datalatte project backdrop — watch the demo video Datalatte is a DataDAO managing a community knowledge graph that integrates public and private personal knowledge graphs as its core asset. diff --git a/src/pages/[...slug].astro b/src/pages/[...slug].astro index 0ed981e4e..3e040f292 100644 --- a/src/pages/[...slug].astro +++ b/src/pages/[...slug].astro @@ -32,9 +32,9 @@ const { Content } = await render(post); {readingTime(post.body ?? "")} -
+

{post.data.title} -

+
diff --git a/src/pages/education/index.astro b/src/pages/education/index.astro index 43ecc824a..611e4c556 100644 --- a/src/pages/education/index.astro +++ b/src/pages/education/index.astro @@ -21,9 +21,9 @@ const education = await Promise.all(
-
+

🎓 Education -

+
    { education.map((entry) => ( diff --git a/src/pages/projects/[...slug].astro b/src/pages/projects/[...slug].astro index 4bcdbe7eb..dd481f6b9 100644 --- a/src/pages/projects/[...slug].astro +++ b/src/pages/projects/[...slug].astro @@ -44,9 +44,9 @@ const appSchema = softwareApplicationSchema(project, Astro.site); {readingTime(project.body ?? "")}
-
+

{project.data.title} -

+ {(project.data.demoURL || project.data.repoURL) && (