- Overlay detection resolves effective z-index through stacking ancestors,
treats a zero-size max-z wrapper plus its full-viewport descendant as one
removable unit, pierces open shadow roots, and relaxes the z floor when
the page is scroll-locked; a lock persisting after dismissal reports
blocking even with no detected overlay
- clickDismiss runs in every frame (close buttons live in cross-origin
popup iframes), matches decline/no-thanks/aria-label close affordances,
and re-runs before every snapshot AND screenshot to catch late-mounting
dialogs
- rootUnclamp triggers from IR content extent (a scroll-lock collapses
captured scrollHeight) and strips vendor-injected body position/overflow
locks when firing
- Pollution gate fails on the scroll-lock contradiction: scrollHeight
pinned to one viewport while IR content spans multiple
- Frame graft skips popup-creative vendor hosts; inline embedded signup
forms remain graftable (regression-tested)
322 tests pass (24 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Nodes carrying an infinite CSS animation at ANY viewport get their frozen
mid-animation transform zeroed at EVERY viewport (the @keyframes owns the
property at runtime); animOwnedProps is now viewport-aware so breakpoint-
gated marquees can't bake a mid-scroll translateX into other bands
- contentSizedFlexRow/contentSizedFlexItemAuto honor the sizing probe: a
flex item whose captured width the probe proved load-bearing
(wAuto=false) is never converted to width:auto, preserving narrow
centered text columns
247 tests pass (7 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- DittoWire/Accordion/DropdownMenu runtime templates: AbortController-based
listener cleanup, idempotent effects, orphan panel removal on unmount
- Emit a single src/lib/utils.ts cn() instead of a copy per component file
- Collapse captured whitespace runs under white-space:normal (pre* preserved)
- Tag source-injected font-metric probe nodes at capture; drop them from IR
- Snap sub-pixel arbitrary lengths (integer within 0.1px, else 1 decimal)
- Emit SITE_ORIGIN (src/lib/site.ts, env-overridable): sitemap/robots/
canonical/og:url/JSON-LD resolve against the clone's own origin instead of
the source domain
- Pin lottie-web in generated package.json whenever DittoLottie is emitted
144 tests pass (21 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>