From: Kai Moritz Date: Sun, 5 Jul 2026 17:56:45 +0000 (+0000) Subject: rename BlogNav.astro → SitemapNav.astro X-Git-Url: https://juplo.de/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Fcontent--via-astro;p=website rename BlogNav.astro → SitemapNav.astro Die Komponente verwaltet die Navigation für alle drei Hauptbereiche (Blog, Projects, About) — nicht nur den Blog. Der neue Name spiegelt den tatsächlichen Zweck als seitenweite Sitemap-Navigation wider. Co-Authored-By: Claude Sonnet 4.6 --- diff --git a/CLAUDE.md b/CLAUDE.md index 88e62686..b4ce2aa1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -23,7 +23,7 @@ src/ content/ blog/ ← Blog-Artikel als Markdown (Content Collection, glob-Loader) projects/ ← Projektdokumentation als HTML + YAML-Frontmatter (Custom Loader) - components/ ← Wiederverwendbare Astro-Komponenten (BlogNav.astro, ProjectPage.astro, …) + components/ ← Wiederverwendbare Astro-Komponenten (SitemapNav.astro, ProjectPage.astro, …) lib/ ← Shared TypeScript-Helpers (posts.ts, projects.ts) styles/ ← SCSS-Quellen public/ @@ -50,7 +50,7 @@ body └── footer#footer Copyright + Footer-Links ``` -Seiten befüllen die Slots mit ``. Den `menu`-Slot übernimmt immer `BlogNav.astro`. +Seiten befüllen die Slots mit ``. Den `menu`-Slot übernimmt immer `SitemapNav.astro`. --- @@ -85,9 +85,9 @@ Das Menü unter `nav#nav` ist bewusst am **Ende des HTML** platziert und dient p Ein `ul.s` ohne `active` blendet sich **nicht selbst** aus — nur `li.s.off` ist hidden. -### Implementierung: `BlogNav.astro` +### Implementierung: `SitemapNav.astro` -`BlogNav.astro` empfängt `currentUrl` als Parameter und berechnet daraus vollständig in TypeScript alle Navigationszustände (`onBlog`, `onArchive`, `onCategoriesIndex`, `onProjectsSection` etc.). Alle CSS-Klassen werden direkt aus diesen Variablen abgeleitet. Nie werden Items per `{condition &&
  • }` weggelassen — nur die `off`-Klasse steuert die Sichtbarkeit via CSS. +`SitemapNav.astro` empfängt `currentUrl` als Parameter und berechnet daraus vollständig in TypeScript alle Navigationszustände (`onBlog`, `onArchive`, `onCategoriesIndex`, `onProjectsSection` etc.). Alle CSS-Klassen werden direkt aus diesen Variablen abgeleitet. Nie werden Items per `{condition &&
  • }` weggelassen — nur die `off`-Klasse steuert die Sichtbarkeit via CSS. ### Section-`off`-Logik @@ -122,7 +122,7 @@ Dabei ist `isSibling` nur aktiv, wenn die aktuelle Seite kein Section-Index-Node ### About-Bereich: Seitenstruktur -Der About-Seitenbaum ist statisch in `BlogNav.astro` als TypeScript-Konstante (`NavPage[]`) definiert. Sortiert nach weight: +Der About-Seitenbaum ist statisch in `SitemapNav.astro` als TypeScript-Konstante (`NavPage[]`) definiert. Sortiert nach weight: ``` /about.html @@ -152,7 +152,7 @@ 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). +In `SitemapNav.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 im Classic-Layout ausgeblendet (da `navigation.scss` unter `:root[data-layout="classic"]` eingebunden ist — siehe Abschnitt „CSS-Layouts" unten). Der kanonische Eintrag erhält keinen Hinweis. @@ -171,7 +171,7 @@ Alias-Nodes erhalten zusätzlich einen Barrierefreiheits-Hinweis im Markup: `[]> = {}; -for (const post of allPosts) { - const year = post.data.date.getFullYear().toString(); - if (!postsByYear[year]) postsByYear[year] = []; - postsByYear[year].push(post); -} -const years = Object.keys(postsByYear).sort((a, b) => Number(b) - Number(a)); - -// Collect unique categories and tags from all posts -const categorySet = new Map(); -const tagSet = new Map(); -for (const post of allPosts) { - for (const cat of post.data.categories ?? []) { - categorySet.set(cat, (categorySet.get(cat) ?? 0) + 1); - } - for (const tag of post.data.tags ?? []) { - tagSet.set(tag, (tagSet.get(tag) ?? 0) + 1); - } -} - -const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1); -const categories = [...categorySet.entries()].map(([name, count]) => ({ - name, - displayName: capitalize(name), - url: `/categories/${name}/`, - count, -})).sort((a, b) => a.displayName.localeCompare(b.displayName)); -const tags = [...tagSet.entries()].map(([name, count]) => ({ - name, - displayName: capitalize(name), - url: `/tags/${name}/`, - count, -})).sort((a, b) => a.displayName.localeCompare(b.displayName)); - -// ── Shared nav helpers ──────────────────────────────────────────────────────── - -// Generic tree traversal — works for both NavPage and ProjectNavNode -function inSubtree(node: T, url: string): boolean { - if (node.url === url) return true; - return (node.children ?? []).some(c => inSubtree(c, url)); -} - -// 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 = !isAlias && nodeUrl === currentUrl; - const isAncestor = !isAlias && inPath && !isCurrent; - const isSibling = parentUrl === currentParentUrl && !currentIsNode; - const isChild = parentUrl === currentUrl; - return !(isCurrent || isAncestor || isSibling || isChild); -} - -// ── About section: static tree — see src/lib/about.ts ─────────────────────── -const _aboutPath = findAboutPath(aboutSection, currentUrl); -const onAboutSection = _aboutPath !== null; -const currentAboutParent = _aboutPath && _aboutPath.length >= 2 ? _aboutPath.at(-2)!.url : ''; -const currentAboutIsNode = _aboutPath ? (_aboutPath.at(-1)!.isNode ?? false) : false; - -// Partial application of nodeOff bound to the About subtree's current-page context -const aboutNodeOff = (nodeUrl: string, parentUrl: string, inPath: boolean) => - nodeOff(nodeUrl, parentUrl, inPath, currentAboutParent, currentAboutIsNode); - -// ── Projects section ────────────────────────────────────────────────────────── -const activeProject = await getActiveProject(currentUrl); -const onProjectsSection = currentUrl === '/projects/' || activeProject !== null; -// When on a SNAPSHOT page, render that version's tree; otherwise all visible trees. -const projectTrees = onProjectsSection && activeProject && !activeProject.isCurrent - ? [activeProject] - : await getVisibleProjectNavTrees(); - -// Single DFS pass: finds both the current node and its parent in a project tree -function findNodeAndParent( - node: ProjectNavNode, - url: string, - parent: ProjectNavNode | null = null, -): { node: ProjectNavNode; parent: ProjectNavNode | null } | null { - if (node.url === url) return { node, parent }; - for (const c of node.children) { - const r = findNodeAndParent(c, url, node); - if (r) return r; - } - return null; -} - -const _found = activeProject?.navRoot ? findNodeAndParent(activeProject.navRoot, currentUrl) : null; -const activeProjectCurrentNode = _found?.node ?? null; -const activeProjectCurrentParent = _found?.parent ?? null; -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, isAlias = false) => - nodeOff(nodeUrl, parentUrl, inPath, _projCurrentParentUrl, activeProjectCurrentIsNode, isAlias); - -// ── Blog URL classification ──────────────────────────────────────────────────── -const mainSections = [ - { name: 'blog', url: '/blog/', title: 'Blog' }, - { name: 'projects', url: '/projects/', title: 'Projects' }, - { name: 'about', url: '/about.html', title: 'About' }, -]; - -const onBlog = currentUrl === '/blog/'; -const isOnBlogPost = allPosts.some(p => (p.data.url ?? `/${p.id}/`) === currentUrl); -const onArchive = currentUrl.startsWith('/blog/archive/') || isOnBlogPost; -const onCategoriesIndex = currentUrl === '/blog/categories/'; -const onCategoryTerm = currentUrl.startsWith('/categories/'); -const onTagsIndex = currentUrl === '/blog/tags/'; -const onTagTerm = currentUrl.startsWith('/tags/'); -const blogSelected = onBlog || onArchive || onCategoriesIndex || onCategoryTerm || onTagsIndex || onTagTerm; - -const categoriesSelected = onCategoriesIndex || onCategoryTerm; -const tagsSelected = onTagsIndex || onTagTerm; - -const archiveOff = !blogSelected || onCategoryTerm || onTagTerm; -const categoriesOff = !blogSelected || onArchive || onTagTerm; -const tagsOff = !blogSelected || onArchive || onCategoryTerm; - -// Active section for #menu highlight -const activeSection = mainSections.find(s => { - if (s.name === 'blog') return blogSelected; - if (s.name === 'about') return onAboutSection; - if (s.name === 'projects') return onProjectsSection; - return currentUrl.startsWith(s.url); -})?.name ?? ''; - -// Top-level section off-logic -const blogSectionOff = onAboutSection || onProjectsSection; -const projectsSectionOff = blogSelected || onAboutSection; -const aboutOff = blogSelected || onProjectsSection; - -// Active year / taxonomy term helpers -function isActiveYear(year: string) { - return currentUrl === `/blog/archive/${year}/` || - postsByYear[year]?.some(p => postUrl(p) === currentUrl) === true; -} -const activeCatSlug = onCategoryTerm ? currentUrl.replace(/^\/categories\//, '').replace(/\/$/, '') : ''; -const activeTagSlug = onTagTerm ? currentUrl.replace(/^\/tags\//, '').replace(/\/$/, '') : ''; ---- - - - - diff --git a/src/components/ProjectPage.astro b/src/components/ProjectPage.astro index 74533f7e..e723a128 100644 --- a/src/components/ProjectPage.astro +++ b/src/components/ProjectPage.astro @@ -4,7 +4,7 @@ import { codeToHtml, bundledLanguages } from 'shiki'; import hljs from 'highlight.js'; import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { getActiveProject, findCanonicalPath } from '../lib/projects'; interface Props { @@ -119,6 +119,6 @@ const body = await highlightBody(entry.body); - + diff --git a/src/components/SitemapNav.astro b/src/components/SitemapNav.astro new file mode 100644 index 00000000..77d68054 --- /dev/null +++ b/src/components/SitemapNav.astro @@ -0,0 +1,486 @@ +--- +import type { CollectionEntry } from 'astro:content'; +import { getAllPosts, postUrl } from '../lib/posts'; +import { getActiveProject, getVisibleProjectNavTrees, type ProjectNavNode } from '../lib/projects'; +import { aboutSection, findAboutPath } from '../lib/about'; + +interface Props { + currentUrl: string; +} + +const { currentUrl } = Astro.props; + +const allPosts = await getAllPosts(); + +// Group posts by year, years sorted descending +const postsByYear: Record[]> = {}; +for (const post of allPosts) { + const year = post.data.date.getFullYear().toString(); + if (!postsByYear[year]) postsByYear[year] = []; + postsByYear[year].push(post); +} +const years = Object.keys(postsByYear).sort((a, b) => Number(b) - Number(a)); + +// Collect unique categories and tags from all posts +const categorySet = new Map(); +const tagSet = new Map(); +for (const post of allPosts) { + for (const cat of post.data.categories ?? []) { + categorySet.set(cat, (categorySet.get(cat) ?? 0) + 1); + } + for (const tag of post.data.tags ?? []) { + tagSet.set(tag, (tagSet.get(tag) ?? 0) + 1); + } +} + +const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1); +const categories = [...categorySet.entries()].map(([name, count]) => ({ + name, + displayName: capitalize(name), + url: `/categories/${name}/`, + count, +})).sort((a, b) => a.displayName.localeCompare(b.displayName)); +const tags = [...tagSet.entries()].map(([name, count]) => ({ + name, + displayName: capitalize(name), + url: `/tags/${name}/`, + count, +})).sort((a, b) => a.displayName.localeCompare(b.displayName)); + +// ── Shared nav helpers ──────────────────────────────────────────────────────── + +// Generic tree traversal — works for both NavPage and ProjectNavNode +function inSubtree(node: T, url: string): boolean { + if (node.url === url) return true; + return (node.children ?? []).some(c => inSubtree(c, url)); +} + +// 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 = !isAlias && nodeUrl === currentUrl; + const isAncestor = !isAlias && inPath && !isCurrent; + const isSibling = parentUrl === currentParentUrl && !currentIsNode; + const isChild = parentUrl === currentUrl; + return !(isCurrent || isAncestor || isSibling || isChild); +} + +// ── About section: static tree — see src/lib/about.ts ─────────────────────── +const _aboutPath = findAboutPath(aboutSection, currentUrl); +const onAboutSection = _aboutPath !== null; +const currentAboutParent = _aboutPath && _aboutPath.length >= 2 ? _aboutPath.at(-2)!.url : ''; +const currentAboutIsNode = _aboutPath ? (_aboutPath.at(-1)!.isNode ?? false) : false; + +// Partial application of nodeOff bound to the About subtree's current-page context +const aboutNodeOff = (nodeUrl: string, parentUrl: string, inPath: boolean) => + nodeOff(nodeUrl, parentUrl, inPath, currentAboutParent, currentAboutIsNode); + +// ── Projects section ────────────────────────────────────────────────────────── +const activeProject = await getActiveProject(currentUrl); +const onProjectsSection = currentUrl === '/projects/' || activeProject !== null; +// When on a SNAPSHOT page, render that version's tree; otherwise all visible trees. +const projectTrees = onProjectsSection && activeProject && !activeProject.isCurrent + ? [activeProject] + : await getVisibleProjectNavTrees(); + +// Single DFS pass: finds both the current node and its parent in a project tree +function findNodeAndParent( + node: ProjectNavNode, + url: string, + parent: ProjectNavNode | null = null, +): { node: ProjectNavNode; parent: ProjectNavNode | null } | null { + if (node.url === url) return { node, parent }; + for (const c of node.children) { + const r = findNodeAndParent(c, url, node); + if (r) return r; + } + return null; +} + +const _found = activeProject?.navRoot ? findNodeAndParent(activeProject.navRoot, currentUrl) : null; +const activeProjectCurrentNode = _found?.node ?? null; +const activeProjectCurrentParent = _found?.parent ?? null; +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, isAlias = false) => + nodeOff(nodeUrl, parentUrl, inPath, _projCurrentParentUrl, activeProjectCurrentIsNode, isAlias); + +// ── Blog URL classification ──────────────────────────────────────────────────── +const mainSections = [ + { name: 'blog', url: '/blog/', title: 'Blog' }, + { name: 'projects', url: '/projects/', title: 'Projects' }, + { name: 'about', url: '/about.html', title: 'About' }, +]; + +const onBlog = currentUrl === '/blog/'; +const isOnBlogPost = allPosts.some(p => (p.data.url ?? `/${p.id}/`) === currentUrl); +const onArchive = currentUrl.startsWith('/blog/archive/') || isOnBlogPost; +const onCategoriesIndex = currentUrl === '/blog/categories/'; +const onCategoryTerm = currentUrl.startsWith('/categories/'); +const onTagsIndex = currentUrl === '/blog/tags/'; +const onTagTerm = currentUrl.startsWith('/tags/'); +const blogSelected = onBlog || onArchive || onCategoriesIndex || onCategoryTerm || onTagsIndex || onTagTerm; + +const categoriesSelected = onCategoriesIndex || onCategoryTerm; +const tagsSelected = onTagsIndex || onTagTerm; + +const archiveOff = !blogSelected || onCategoryTerm || onTagTerm; +const categoriesOff = !blogSelected || onArchive || onTagTerm; +const tagsOff = !blogSelected || onArchive || onCategoryTerm; + +// Active section for #menu highlight +const activeSection = mainSections.find(s => { + if (s.name === 'blog') return blogSelected; + if (s.name === 'about') return onAboutSection; + if (s.name === 'projects') return onProjectsSection; + return currentUrl.startsWith(s.url); +})?.name ?? ''; + +// Top-level section off-logic +const blogSectionOff = onAboutSection || onProjectsSection; +const projectsSectionOff = blogSelected || onAboutSection; +const aboutOff = blogSelected || onProjectsSection; + +// Active year / taxonomy term helpers +function isActiveYear(year: string) { + return currentUrl === `/blog/archive/${year}/` || + postsByYear[year]?.some(p => postUrl(p) === currentUrl) === true; +} +const activeCatSlug = onCategoryTerm ? currentUrl.replace(/^\/categories\//, '').replace(/\/$/, '') : ''; +const activeTagSlug = onTagTerm ? currentUrl.replace(/^\/tags\//, '').replace(/\/$/, '') : ''; +--- + + + + diff --git a/src/pages/[slug].astro b/src/pages/[slug].astro index 147466cd..aad427fa 100644 --- a/src/pages/[slug].astro +++ b/src/pages/[slug].astro @@ -2,7 +2,7 @@ import { render } from 'astro:content'; import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import TaxonomyAside from '../components/TaxonomyAside.astro'; import { getAllPosts, postUrl as getPostUrl, getSummary } from '../lib/posts'; @@ -74,7 +74,7 @@ const dateDisplay = date.toLocaleDateString('en-US', { month: 'long', day: 'nume - + diff --git a/src/pages/about.html.astro b/src/pages/about.html.astro index 23920f6a..635ffa5c 100644 --- a/src/pages/about.html.astro +++ b/src/pages/about.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/about.html')!; @@ -58,7 +58,7 @@ const crumbs = [ - + diff --git a/src/pages/agb.html.astro b/src/pages/agb.html.astro index 1253ef18..46394619 100644 --- a/src/pages/agb.html.astro +++ b/src/pages/agb.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/agb.html')!; @@ -150,6 +150,6 @@ const crumbs = [ - + diff --git a/src/pages/blog/archive/[year].astro b/src/pages/blog/archive/[year].astro index 270f9823..be9d0bb3 100644 --- a/src/pages/blog/archive/[year].astro +++ b/src/pages/blog/archive/[year].astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../../../layouts/BaseLayout.astro'; import Breadcrumb from '../../../components/Breadcrumb.astro'; -import BlogNav from '../../../components/BlogNav.astro'; +import SitemapNav from '../../../components/SitemapNav.astro'; import { getAllPosts, postUrl, wordCount } from '../../../lib/posts'; export async function getStaticPaths() { @@ -62,6 +62,6 @@ const crumbs = [ - + diff --git a/src/pages/blog/archive/index.astro b/src/pages/blog/archive/index.astro index ac9dffd5..72e6917c 100644 --- a/src/pages/blog/archive/index.astro +++ b/src/pages/blog/archive/index.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../../../layouts/BaseLayout.astro'; import Breadcrumb from '../../../components/Breadcrumb.astro'; -import BlogNav from '../../../components/BlogNav.astro'; +import SitemapNav from '../../../components/SitemapNav.astro'; import { getAllPosts, postUrl, wordCount } from '../../../lib/posts'; const currentUrl = '/blog/archive/'; @@ -59,6 +59,6 @@ const crumbs = [ - + diff --git a/src/pages/blog/categories/index.astro b/src/pages/blog/categories/index.astro index 64d7e5f3..6c2e4b68 100644 --- a/src/pages/blog/categories/index.astro +++ b/src/pages/blog/categories/index.astro @@ -2,7 +2,7 @@ import { getCollection } from 'astro:content'; import BaseLayout from '../../../layouts/BaseLayout.astro'; import Breadcrumb from '../../../components/Breadcrumb.astro'; -import BlogNav from '../../../components/BlogNav.astro'; +import SitemapNav from '../../../components/SitemapNav.astro'; const currentUrl = '/blog/categories/'; @@ -47,6 +47,6 @@ const crumbs = [ - + diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro index cb2d7ae6..0e3ed5f8 100644 --- a/src/pages/blog/index.astro +++ b/src/pages/blog/index.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../../layouts/BaseLayout.astro'; import Breadcrumb from '../../components/Breadcrumb.astro'; -import BlogNav from '../../components/BlogNav.astro'; +import SitemapNav from '../../components/SitemapNav.astro'; import { getAllPosts, postUrl, getSummary, wordCount } from '../../lib/posts'; const currentUrl = '/blog/'; @@ -109,6 +109,6 @@ const crumbs = [ - + diff --git a/src/pages/blog/tags/index.astro b/src/pages/blog/tags/index.astro index 6a27f525..5c4d5570 100644 --- a/src/pages/blog/tags/index.astro +++ b/src/pages/blog/tags/index.astro @@ -2,7 +2,7 @@ import { getCollection } from 'astro:content'; import BaseLayout from '../../../layouts/BaseLayout.astro'; import Breadcrumb from '../../../components/Breadcrumb.astro'; -import BlogNav from '../../../components/BlogNav.astro'; +import SitemapNav from '../../../components/SitemapNav.astro'; const currentUrl = '/blog/tags/'; @@ -47,6 +47,6 @@ const crumbs = [ - + diff --git a/src/pages/categories/[term].astro b/src/pages/categories/[term].astro index 9505e9ae..14acd16c 100644 --- a/src/pages/categories/[term].astro +++ b/src/pages/categories/[term].astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../../layouts/BaseLayout.astro'; import Breadcrumb from '../../components/Breadcrumb.astro'; -import BlogNav from '../../components/BlogNav.astro'; +import SitemapNav from '../../components/SitemapNav.astro'; import { getAllPosts, postUrl, wordCount } from '../../lib/posts'; export async function getStaticPaths() { @@ -78,6 +78,6 @@ const crumbs = [ - + diff --git a/src/pages/contact.html.astro b/src/pages/contact.html.astro index 7cc610df..658a61a1 100644 --- a/src/pages/contact.html.astro +++ b/src/pages/contact.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/contact.html')!; @@ -44,6 +44,6 @@ const crumbs = [ - + diff --git a/src/pages/datenschutz.html.astro b/src/pages/datenschutz.html.astro index 25a87a30..89e89b89 100644 --- a/src/pages/datenschutz.html.astro +++ b/src/pages/datenschutz.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/datenschutz.html')!; @@ -107,7 +107,7 @@ const crumbs = [ - + diff --git a/src/pages/google-analytics.html.astro b/src/pages/google-analytics.html.astro index d505cd43..fa577b89 100644 --- a/src/pages/google-analytics.html.astro +++ b/src/pages/google-analytics.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/google-analytics.html')!; @@ -50,6 +50,6 @@ const crumbs = [ - + diff --git a/src/pages/haftung-inhalte.html.astro b/src/pages/haftung-inhalte.html.astro index 04bb17ec..7fae5a78 100644 --- a/src/pages/haftung-inhalte.html.astro +++ b/src/pages/haftung-inhalte.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/haftung-inhalte.html')!; @@ -33,6 +33,6 @@ const crumbs = [ - + diff --git a/src/pages/haftung-links.html.astro b/src/pages/haftung-links.html.astro index 2b77c912..1dbc88af 100644 --- a/src/pages/haftung-links.html.astro +++ b/src/pages/haftung-links.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/haftung-links.html')!; @@ -31,6 +31,6 @@ const crumbs = [ - + diff --git a/src/pages/impressum.html.astro b/src/pages/impressum.html.astro index b78e652f..e0550535 100644 --- a/src/pages/impressum.html.astro +++ b/src/pages/impressum.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/impressum.html')!; @@ -40,7 +40,7 @@ const crumbs = [ - + diff --git a/src/pages/index.astro b/src/pages/index.astro index 8d49bc90..9eb13e34 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,6 +1,6 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { getAllPosts, postUrl } from '../lib/posts'; const currentUrl = '/'; @@ -55,6 +55,6 @@ const recentPosts = (await getAllPosts()).slice(0, 5); - + diff --git a/src/pages/projects/index.astro b/src/pages/projects/index.astro index e7930bb6..978332f4 100644 --- a/src/pages/projects/index.astro +++ b/src/pages/projects/index.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../../layouts/BaseLayout.astro'; import Breadcrumb from '../../components/Breadcrumb.astro'; -import BlogNav from '../../components/BlogNav.astro'; +import SitemapNav from '../../components/SitemapNav.astro'; import { getVisibleProjectNavTrees } from '../../lib/projects'; const projects = await getVisibleProjectNavTrees(); @@ -26,6 +26,6 @@ const crumbs = [{ title: 'Home', url: '/' }, { title: 'Projects' }]; - + diff --git a/src/pages/tags/[term].astro b/src/pages/tags/[term].astro index e29b3bf0..29f942da 100644 --- a/src/pages/tags/[term].astro +++ b/src/pages/tags/[term].astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../../layouts/BaseLayout.astro'; import Breadcrumb from '../../components/Breadcrumb.astro'; -import BlogNav from '../../components/BlogNav.astro'; +import SitemapNav from '../../components/SitemapNav.astro'; import { getAllPosts, postUrl, wordCount } from '../../lib/posts'; export async function getStaticPaths() { @@ -78,6 +78,6 @@ const crumbs = [ - + diff --git a/src/pages/urheberrechte.html.astro b/src/pages/urheberrechte.html.astro index 8158ad93..550ee21b 100644 --- a/src/pages/urheberrechte.html.astro +++ b/src/pages/urheberrechte.html.astro @@ -1,7 +1,7 @@ --- import BaseLayout from '../layouts/BaseLayout.astro'; import Breadcrumb from '../components/Breadcrumb.astro'; -import BlogNav from '../components/BlogNav.astro'; +import SitemapNav from '../components/SitemapNav.astro'; import { aboutSection, findAboutPath } from '../lib/about'; const _path = findAboutPath(aboutSection, '/urheberrechte.html')!; @@ -33,6 +33,6 @@ const crumbs = [ - +