0.4.3
Release notes for 0.4.3.
Released: 2026-07-04
Features
Dismiss-layer arbitration for layered surfaces. A shared dismiss-layer stack routes Escape to only the topmost open layer (nested popover → popover → panel), and all three modals gained gesture-aware backdrop dismissal (press+release must both land outside), fixing one-Escape-closes-everything, trigger-click reopen races, and text-selection drags closing modals (#446) (9119c7e, 8257b19)
CSS isolation architecture. Panel z-indexes are now a semantic token scale shared by CSS and TSX (shell renders above common host chrome), a
box-sizingreset is scoped to the panel subtree, panel geometry moved from rem to px so host root font-size cannot warp the panel, andcolor-schemeis declared on panel surfaces (#448) (62f8e4c)Visual-regression test tier. 8 Playwright baselines (palette chart, color-picker swatch + popover, panel chrome — light + dark) with a documented
test:vrt:updateflow, wired into CI (#454) (5241e02)Real lint + doc-link gates. oxlint wired for the panel and linkinator + html-validate for the doc site — the CI Lint step is no longer a no-op (#443) (4812160)
Fixed
configurePanelre-runs no longer throw when combined withsetPanelColorPresets(Astro view-transitions + lazy color presets recipe); sink instances seed frompanelSettings.colorSchemeinstead of the hostdata-theme; palette cssVar templates andcolorExtrasare validated at configure time (#440) (afe8a36, 87df039, 4d5e611)applyTokenOverridesno longer rewrites the wrong declaration when one custom-property name is a suffix of another —zdtp-servercould corrupt CSS files on disk (#441) (3be6865)Highlight subsystem: match cache is evicted on stylesheet changes (stale detached elements no longer stay highlighted), percentage values are classified as lengths, and a highlight probe runs one full-DOM walk instead of three (#442) (fc07e41)
PaletteSelector listbox is fully keyboard-operable; ApplyModal's
onAppliedcleanup contract now holds on every dismissal route (#446) (8257b19)State persistence: changing a palette's size no longer discards spacing/typography/size/tab overrides; restored positions are viewport-clamped and finite; fresh-mount toggle intent; window-resize handling debounced; imported palette values pass the seed-time sanitizer; dead
panelPositionpath removed (#447) (8f67382)Astro soft navigation unmounts/remounts all registered panel instances (was: default only — other instances leaked listeners per navigation and vanished until re-toggled), and persisted overrides are reapplied for every instance, including hidden ones (#449, #457) (908d6df, 8ce3d8b)
CSS accessibility:
:focus-visiblestyles for every native form control (hostoutline: noneresets can no longer hide focus), raw color literals replaced by--tokentweak-*tokens, 24×24 minimum hit areas,prefers-reduced-motionsupport (#450) (fa36675)The panel's SVG defensive reset now survives a hostile
svg { fill: red !important }host rule (#452) (6ac7129)Packaging: exports map gained
defaultconditions and a.export, broken declaration maps are no longer shipped, and a post-build check fails the build if any exports entry does not resolve against/ package. json dist/(#444) (13862a4)release.ymldry_runbuilds the package again, as its description advertises (8ce3d8b)
Other Changes
Docs now describe the real stylesheet mechanism — the panel self-injects its CSS via an inline import; no consumer CSS import is required — and stale pre-rename
packages/zudo-design-token-panel/paths are purged (#445) (54756a2)CI overhaul: PR branch filters cover live
base/**branches, tests gate main pushes andv*release tags, Playwright browsers are cached, duplicate builds removed, concurrency cancellation + job timeouts everywhere (#443) (dbf5704)New automated hostile-host isolation gate (Level 5): the panel's computed styles and viewport-fixed positioning are asserted inside a hostile host page, including a transform-ancestor scenario (#452) (6ac7129)
17 browser-mode gesture tests for panel drag-to-move / resize incl. viewport clamping and persistence (#453) (a4b25af)
Test-suite hygiene: the DOM-policy static gate covers every panel TSX file and the full blocked-tag list, the palette drag browser test asserts for real, shared effect-flush helper, and a
test:unitscript runs the non-browser projects without Chromium (#451) (ebe0018, 8a7ee63, 4682139, 9b6c989)Browser test files now run serially — parallel files share one origin and raced each other's localStorage (fd37774)
Deps: bump @takazudo/* toolchain (zfb next.76, zudo-doc 2.5.0) (62b62f6)