From 8dca3f9df5e13eedb0e59bccfaca1e7b53902d67 Mon Sep 17 00:00:00 2001 From: Antoine van der Lee <4329185+AvdLee@users.noreply.github.com> Date: Sun, 24 May 2026 13:39:36 +0200 Subject: [PATCH 1/8] Improve site-wide SEO metadata and JSON-LD defaults --- docs/src/components/starlight/Head.astro | 37 ++++++++++++++++++- docs/src/layouts/components/SEO.astro | 19 +++++----- .../layouts/components/StructuredData.astro | 14 +++---- docs/src/lib/utils/seo.ts | 18 +++++++++ 4 files changed, 68 insertions(+), 20 deletions(-) create mode 100644 docs/src/lib/utils/seo.ts diff --git a/docs/src/components/starlight/Head.astro b/docs/src/components/starlight/Head.astro index 957280dc..7c9c71bd 100644 --- a/docs/src/components/starlight/Head.astro +++ b/docs/src/components/starlight/Head.astro @@ -6,8 +6,25 @@ import Default from "@astrojs/starlight/components/Head.astro"; import PlausibleAnalytics from "@/components/PlausibleAnalytics.astro"; import config from "@/config/config.json"; +import { normalizeCanonicalUrl, toAbsoluteUrl } from "@/lib/utils/seo"; -const ogImage = `${config.site.base_url}${config.metadata.meta_image}`; +const ogImage = + toAbsoluteUrl(config.metadata.meta_image) || + `${config.site.base_url}/images/rocketsim-app-icon.png`; +const canonicalUrl = normalizeCanonicalUrl(Astro.url.href); +const pathParts = Astro.url.pathname + .split("/") + .filter(Boolean) + .map((segment) => decodeURIComponent(segment)); +const breadcrumbItems = pathParts.map((segment, index) => { + const href = `${config.site.base_url}/${pathParts.slice(0, index + 1).join("/")}/`; + return { + "@type": "ListItem", + position: index + 1, + name: segment.replace(/-/g, " "), + item: href, + }; +}); --- @@ -27,9 +44,25 @@ const ogImage = `${config.site.base_url}${config.metadata.meta_image}`; + - + + + +{ + Astro.url.pathname.startsWith("/docs") && breadcrumbItems.length > 0 && ( +