From: Kai Moritz Date: Fri, 19 Jun 2026 10:22:34 +0000 (+0200) Subject: Alias-Hinweis im Sitemap-Menü für Barrierefreiheit X-Git-Url: https://juplo.de/gitweb/?a=commitdiff_plain;h=294fbef62526e7b6f116284530cbd9e496f7c187;p=website Alias-Hinweis im Sitemap-Menü für Barrierefreiheit Alias-Einträge im Sitemap-Menü erhalten jetzt einen Hinweis-Span '(Schnellzugriff)' direkt nach dem Titel-Element, außerhalb von . Dadurch ist der Hinweis nie fett – auch nicht wenn die Seite aktiv ist. Im CSS (base/navigation.scss) wird #submenu .alias-hint ausgeblendet, sodass der Hinweis nur im Layout 'None' (kein CSS) sichtbar bleibt – für Screen-Reader und Text-Browser. Co-Authored-By: Claude Sonnet 4.6 --- diff --git a/CLAUDE.md b/CLAUDE.md index a8f7fbc8..78481cdc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -138,7 +138,9 @@ Der Projects-Bereich unterscheidet zwischen **sichtbaren** und **nicht sichtbare **Alias-Einträge (`params.alias: true`):** Seiten, die in `stili-json` in mehreren `childs`-Listen auftauchen, werden vom Import-Skript an mehreren Stellen im Content-Tree abgelegt. Die primäre Datei (kanonischer Ort, mit Body + Routing) folgt den `crumbs`/`path`-Feldern. Zusätzliche **Stub-Dateien** (leer, kein Routing) entstehen an den weiteren Positionen und erhalten `params.alias: true`. -In `BlogNav.astro` werden Alias-Nodes mit der CSS-Klasse `alias` versehen. In der `off`-Berechnung überspringen Alias-Nodes `isCurrent` und `isAncestor` — dadurch sind sie im Classic-Layout versteckt, wenn die Seite aktiv ist (der kanonische Eintrag übernimmt die Darstellung). Sichtbar sind sie als Geschwister (normale `isSibling`-Logik). Im Layout „None" (kein CSS) erscheinen alle Einträge, kanonischer und Alias-Eintrag beide fett. +In `BlogNav.astro` werden Alias-Nodes mit der CSS-Klasse `alias` versehen. In der `off`-Berechnung überspringen Alias-Nodes `isCurrent` und `isAncestor` — dadurch sind sie im Classic-Layout versteckt, wenn die Seite aktiv ist (der kanonische Eintrag übernimmt die Darstellung). Sichtbar sind sie als Geschwister (normale `isSibling`-Logik). + +Alias-Nodes erhalten zusätzlich einen Barrierefreiheits-Hinweis im Markup: ` (Schnellzugriff)` direkt nach dem Titel-Element (`` oder ``). Der Hinweis steht **außerhalb** von `` und ist damit nie fett — auch nicht wenn die Seite aktiv ist. Im Layout „None" (kein CSS) erscheint der Hinweis, damit Nutzende von Text-Browsern und Screen-Readern erkennen, dass dieser Eintrag ein Zusatzzugang zu einer auch anderswo gelisteten Seite ist. Im CSS (`base/navigation.scss`: `#submenu .alias-hint { display: none }`) wird er in allen Screen-Layouts ausgeblendet. Der kanonische Eintrag erhält keinen Hinweis. **Generierte Inhalte (apidocs, xref etc.):** Maven-Site-Outputs liegen fertig generiert in `public/projects/PROJEKT_NAME/VERSION/` und werden als statische Dateien ausgeliefert — ohne Astro-Layout, ohne HTML-Anpassungen, ohne Routing-Dateien in `src/pages/`. `src/lib/projects.ts` (`generatedDocNodes()`) erkennt diese Verzeichnisse zur Build-Zeit automatisch und fügt sie als Nav-Blatteinträge hinzu: diff --git a/src/components/BlogNav.astro b/src/components/BlogNav.astro index 8508f2aa..b398e671 100644 --- a/src/components/BlogNav.astro +++ b/src/components/BlogNav.astro @@ -57,15 +57,18 @@ function inSubtree(node: T, url: stri // A nav item is visible (not off) when it is: current, ancestor of current, // sibling of current (only when current is not a section-index node), or child of current. // `inPath` = inSubtree(node, currentUrl), pre-computed by the caller to avoid double traversal. +// `isAlias` = true for nav-only stub entries: isCurrent and isAncestor are suppressed so the +// alias is hidden in Classic layout when its page is active (the canonical entry handles that). function nodeOff( nodeUrl: string, parentUrl: string, inPath: boolean, currentParentUrl: string, currentIsNode: boolean, + isAlias = false, ): boolean { - const isCurrent = nodeUrl === currentUrl; - const isAncestor = inPath && !isCurrent; + const isCurrent = !isAlias && nodeUrl === currentUrl; + const isAncestor = !isAlias && inPath && !isCurrent; const isSibling = parentUrl === currentParentUrl && !currentIsNode; const isChild = parentUrl === currentUrl; return !(isCurrent || isAncestor || isSibling || isChild); @@ -142,8 +145,8 @@ const activeProjectCurrentIsNode = activeProjectCurrentNode?.isNode ?? false; // Partial application of nodeOff bound to the Projects subtree's current-page context const _projCurrentParentUrl = activeProjectCurrentParent?.url ?? ''; -const projNodeOff = (nodeUrl: string, parentUrl: string, inPath: boolean) => - nodeOff(nodeUrl, parentUrl, inPath, _projCurrentParentUrl, activeProjectCurrentIsNode); +const projNodeOff = (nodeUrl: string, parentUrl: string, inPath: boolean, isAlias = false) => + nodeOff(nodeUrl, parentUrl, inPath, _projCurrentParentUrl, activeProjectCurrentIsNode, isAlias); // ── Blog URL classification ──────────────────────────────────────────────────── const mainSections = [ @@ -355,10 +358,10 @@ const activeTagSlug = onTagTerm ? currentUrl.replace(/^\/tags\//, '').repl