File-based routes for the site and their client-side interactivity. Covers the blog/ route subfolder (no separate doc).
Owns the route files under src/pages/. Composes components (../components), layouts (../layouts), and content (../content) into pages. Most site features start here.
index.astro → /, cv.astro → /cv, blog/index.astro → /blog, blog/[slug].astro → /blog/<slug>/, 404.astro → builds to /404.html (wired in nginx.conf — keep names in sync). There is no /projects route and must not be one.getStaticPaths and filter drafts: getCollection("blog", ({ data }) => !data.draft).<script> (no framework): blog/home search + tag filter reads .post-card data-* attributes; the collapsible Topics/Skills sidebars use a pure-CSS checkbox toggle, media-query driven (open on desktop, collapsible under 768px). Don’t gate the collapse on a min-width force-open rule — <details> can’t be forced open by CSS and broke before.text-align: justify + hyphens: manual; never hyphens: auto (breaks words mid-stem in real browsers — looks fine only in the VS Code preview, which lacks a hyphenation dictionary).blog/[slug].astro emits BlogPosting structured data and passes ogType="article".index.astro. Files: ../components/Hero.astro, ../components/PostCard.astro.blog/index.astro. Files: ../components/PostCard.astro.blog/[slug].astro. Files: ../layouts/Prose.astro, ../content/blog.cv.astro. Files: ../content/cv/cv.json, ../components/KpiStat.tsx.404.astro.