v4.20.3
·
39 commits
to main
since this release
Focus: Hydration-clean international visitors and a shift-free first paint on every viewport.
Changes
- 🌐 Fixed the hydration mismatch every non-default-language visitor hit: the i18n boot used to pick the browser language, hydrating all text against default-language markup — hydration now starts in the serialized language and the visitor's language applies right after mount
- 🖥️ Fixed desktop CLS (≈ 0.9 → ≈ 0.00): QDrawer always serializes closed and QLayout applies header offsets and container paddings client-side only — pre-hydration CSS now paints the final desktop geometry (open menu drawer, anchor rail, header offset) and hands it to QLayout pixel-identical, while small screens neutralize the assumption
- 📱 Moved brand and submenu breakpoint styling from
$q.screenclass bindings to CSS media queries: they hold from the very first server-rendered paint instead of settling after Screen measures (mobile CLS from the previous fix: 0.18 → 0.01) - 🎨 Extended the SSR-safe two-pass theme flag to the remaining components that serialize theme into markup (menu, timeline, file blocks, code examples, page-bar chat icons)
- ✅ Validated: zero hydration mismatches across routes, viewports and a pt-BR + dark + persisted-assistant profile; CLS 0.002 (desktop) / 0.012 (throttled mobile); 335 passing tests