WnBreadcrumb._onSlot inserted separator <span>s into its own light DOM on
slotchange but cleaned up in the shadow DOM, so they were never removed — each
insertion re-fired slotchange, looping the main thread and wedging the showcase
page. Made _onSlot idempotent: exclude own separators when reading items, and
mutate only when separators are not already correct.
- Un-fixme the showcase visual test; add a warm-up full-page capture so
deviceScaleFactor-2 sub-pixel snapping settles before the assertion. All 5
visual tests pass.
- Remove the dead Google-Fonts @import from colors_and_type.css (token stacks are
system-ui; webfont unused + a CI-flake source; no visual change).
- Unblocks WHYNOT-WP-0003 T08 (showcase = per-version visual catalog); both T11
and T08 marked done.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Regenerate the four whynot-control visual baselines against the T06 token
regen, and make the harness render deterministically:
- serve.json (cleanUrls:false): serve was 301-redirecting /…/index.html and
stripping the trailing slash, shifting the document base so every relative
asset 404'd (also broke `pnpm showcase` in a browser).
- examples/whynot-control/index.html: token stylesheet pointed at a
non-existent root path; repoint to ../../src/styles/colors_and_type.css so
the page actually loads the T06 tokens.
- examples/vendor/lit.js: vendor a self-contained esbuild lit bundle and point
the showcase importmap at it, removing the multi-hop live esm.sh dependency.
- tests/visual/ui-kit.spec.mjs: abort the unused Google-Fonts CDN (fonts are
system-ui post-IBM-Plex); a hung font request blocked module execution.
The showcase "every component" test is marked test.fixme: that page wedges the
renderer main thread (a demo composition loops) and has never produced a
baseline. Tracked as WHYNOT-WP-0002-T11. Components + vendored lit render fine
in isolation; the four control baselines pass deterministically.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>