Unreleased
#In progressAdded
- ?theme=dark|light is the source of truth for color scheme (URL → localStorage → OS prefers-color-scheme → dark); the header toggle and command-palette action replaceUrl the query
- Theme and language toggles announce the new mode/language through the existing live region (Dark/Light and English/Español), without noisy announcements on init
- Sitemap lastmod (W3C Datetime) for /, /changelog, and /colophon generated from the build timestamp at deploy time
- Post-deploy S3 header smoke (scripts/smoke-s3-headers.js): after header rewrite, assert index.html is max-age=0, must-revalidate, one hashed *.js is 1y immutable, and one *.woff2 is font/woff2 (non-zero exit on mismatch)
- CI coverage floors for ng test --coverage (statements 70%, branches 65%, functions 70%, lines 70%) with a json-summary artifact
- Checked-in coverage-baseline/ json-summary floor and CI job-summary comparison so reviewers can compare PRs without running tests locally
- Featured project UA 571-C (live WASM console + GitHub) on the home showcase and terminal projects command
- /changelog page (lazy, prerendered) rendering this file in Kinetic Grid style, with command palette + footer links
- Scroll-depth indicator: max explored percent in the footer and command palette (reuses the existing progress-bar listener)
- Dismissible PWA update banner when the service worker reports VERSION_READY (Reload / Dismiss, EN/ES, reduced-motion safe)
Changed
- Bump sharp to ^0.35.4 and vitest / @vitest/coverage-v8 to ^4.1.11 (Dependabot #16/#17/#19)
- npm overrides for js-yaml 4.3.2, smol-toml 1.7.1, svgo 4.1.0, and hono 4.13.5 (Dependabot #11–#15, #18, #20)
- Web Vitals tracking now observes real INP via Event Timing (event) instead of a FID/first-input approximation, and exposes last LCP/INP/CLS values for a future overlay
- Replaced Space Grotesk and Inter with IBM Plex Sans across the site, including the loading and offline experiences.
- Shell loading spinner is a sharp Kinetic Grid square (was circular) and pauses when prefers-reduced-motion is set.
- Cut main-bundle weight from Helm paths: hlm() no longer ships tailwind-merge, and [hlmTooltip] uses a Kinetic Grid body-portal instead of CDK overlay. Budgets unchanged.
- Globe canvas stays static (one paint, no continuous rAF spin) when prefers-reduced-motion, Save-Data, or coarse low device memory is set.
Fixed
- Command palette restores focus on close, marks the background inert/aria-hidden, and keeps Tab inside the dialog
- Lazy route navigations (colophon, changelog, 404) show an in-outlet loading state instead of a blank content pane
- Lazy-route loading hides the previous page instead of stacking the spinner above it
- Route loading indicator is gated to loadComponent path changes (fragment/query-only jumps no longer flash it)
- Command palette empty state uses translated copy (EN/ES)
- Opening the mobile menu moves keyboard focus into the menu and restores it to the toggle on close
- Translation API failures show a polite "Showing offline translations" notice while keeping the static fallback
- Header and command palette Home/About/Connect/Projects links now go to /#section when those ids are not on the current page (e.g. /changelog, /colophon)
- Restored floating positioning on the back-to-top button (fixed bottom-6 right-6 z-40)
- Skip-to-social-links now goes to /#social-links when that id is not on the current page
- Skip links become visible on keyboard focus (focus-within:not-sr-only on the skip-nav wrapper)