Releases: docsector/docsector-reader
Releases · docsector/docsector-reader
Release list
v4.21.8
Focus: The on-load sidebar scroll now glides like route changes.
Changes
- 🧭 The load-time sidebar centering (introduced in v4.21.7) now uses the same 300 ms smooth glide the after-route scroll performs, instead of an instant jump
- ✅ Verified by sampling the drawer scroll position over time (progressive glide to the same centered position, menu still un-hydrated); 337 tests passing
v4.21.7
Focus: The sidebar centers the active page on load again.
Changes
- 🧭 Fixed the sidebar not scrolling to the active page on load: the menu hydrates on interaction only, so its mounted scroll-to-active never ran for a fresh visit (it only fired after a hover) — the scroll routine now lives in a shared composable and the layout, which hydrates immediately, centers the active item on the server-rendered markup without waking the menu
- ✅ Verified with an interaction-free probe (deep route loads with the drawer pre-scrolled and the active item centered, menu still un-hydrated); 337 tests passing
v4.21.6
Focus: Roboto on first visit and canonical trailing-slash URLs.
Changes
- 🔤 Switched the self-hosted Roboto faces from
font-display: optionaltofont-display: fallback: without a font preload, Chrome'soptionalonly consults the disk cache at style resolution, so first-time visitors kept the Arial-metric fallback and only saw Roboto after a reload —fallbackswaps Roboto in when it arrives, with zero layout shift thanks to the size-adjusted metric fallback, while keeping the font out of Lighthouse's text-LCP dependency graph - 🔗 Canonical URLs: every prerendered page emits
<link rel="canonical">and a matchingog:urlin the trailing-slash form, consolidating the slash-less and slashed variants of a route into a single indexable page - 🗺️ Sitemap routes are listed in their canonical trailing-slash form (file-like paths such as
llms.txtstay untouched), so the listed URLs never redirect - ✅ Verified with DevTools platform-font inspection (cold profile renders Roboto), median-of-3 Lighthouse runs (score/FCP/LCP/CLS unchanged) and sitemap/canonical specs; 337 tests passing
v4.21.4
Focus: SEO hygiene — one title and one meta set per prerendered head.
Changes
- 🧹 Fixed duplicated
<title>and description/OG/Twitter meta tags in SSR-prerendered heads:useMetarenders the per-route tags but the template's static defaults stayed behind them — the rendered (data-qmeta) tag now wins and its static twin is dropped, while statics without a rendered counterpart survive as fallbacks - ✅ Verified across prerendered routes (single title with the per-route value, unique meta set, viewport untouched); 335 tests passing
v4.21.3
Focus: Dark-theme polish — no more white flash on server-rendered code blocks.
Changes
- 🎨 Fixed dark-theme code blocks painting a light first frame: the tone classes hydrate as the serialized
whiteand only flip todarkpost-mount, so the light/dark palettes are now keyed on the body theme too —whiterules apply only underbody:not(.body--dark)and the dark surface/token palette also applies underbody.body--dark, making the server-rendered markup born dark and the class flip a visual no-op - ✅ Verified with a serialized-markup fixture (frame, gutter and Prism token colors all compute the dark palette pre-hydration) and screenshots in both themes; 335 tests passing
v4.21.2
Focus: Unchain webfonts from the text LCP — SSR builds no longer emit font preloads.
Changes
- 🔤 SSR-prerendered pages no longer emit
<link rel="preload" as="font">: withfont-display: optionalthe first paint always uses the metric-matched fallback, but a preloaded font gets chained into the text-LCP dependency graph by Lighthouse's simulator — measured ≈600ms lower LCP without the preload, with identical real-world rendering (the@font-facefetch still warms the cache for later views) - 🧹
preloadTagreduced to stylesheets only (JS modulepreloads were already stripped in v4.21.0) - ✅ Validated with median-of-3 Lighthouse mobile runs and a live probe confirming the font still loads via CSS and applies on fast connections; 335 tests passing
v4.21.1
Focus: Dark sidebar polish — the standard-field underline on the un-hydrated markup.
Changes
- 🎨 Fixed the sidebar search and version-select underline being invisible for dark visitors: the
.q-field__control:beforeborder serializes with the light black-alpha tone and only gainsq-field--darkon hydration —body--darkCSS now paints Quasar's dark border color (rgba(255,255,255,.6)), scoped with:not(.q-field--dark)so hydration takes over without conflicts - ✅ Verified via computed-style measurement on the pure server markup (335 tests passing)
v4.21.0
Focus: Content-first mobile delivery — about 1s faster FCP/LCP on slow connections for SSR builds.
Changes
- 📱 Content-first mobile delivery: SSR-prerendered pages no longer emit any JS
modulepreloadlink (22 per page before) and the entry module is fetched withfetchpriority=low— the render-blocking CSS now owns slow links, since the first paint ships as server-rendered HTML and needs no JavaScript - 🔤 Font preloads slimmed to the latin subset only, at
fetchpriority=low— latin-ext glyphs still load on demand viaunicode-range - ⚡ Early Hints are now stylesheet-only and finally include the bundler's main CSS (the previous quote-sensitive regex missed minified attributes)
- 🐢 Below-the-fold code blocks and tables lazy-render on phones via
content-visibility: auto(anchors, find-in-page and scroll integrity verified; prose stays eager to keep scroll anchoring stable) - 🔕 The SPA-era route-preload plugin stays quiet in SSR builds (its modulepreloads are counterproductive there)
- ✅ Validated on slow-4G emulation with median-of-3 Lighthouse runs: mobile score 69 → 81 (home) and 87 (guide page), FCP −990ms, LCP −908ms, CLS unchanged; 335 tests passing
v4.20.7
Focus: Dark sidebar polish — field text colors on the un-hydrated markup.
Changes
- 🎨 Fixed the sidebar search placeholder and version-select text being nearly invisible for dark visitors: Quasar fields serialize with light text colors and only gain
q-field--darkvia JS on hydration —body--darkCSS now themes the field text directly, scoped with:not(.q-field--dark)so hydration takes over without conflicts - ✅ Validated pixel-identical to the hydrated state on the pure server markup (335 passing tests)
v4.20.6
Focus: The sidebar search is part of the server-rendered markup.
Changes
- 🔍 Fixed the sidebar search bar being invisible until the menu hydrates: Vue SSR renders
<transition appear>as an inert<template>tag, so the serialized input never painted — the wrapper only provided a cosmetic entrance animation and was removed - ✅ Validated on the un-hydrated server markup: search bar visible with full dark contrast, zero interaction required (335 passing tests)