Clone-fidelity fix waves 1-3 (+ wave 4 in flight): capture settling, media, iframes

Fixes from the cropin.com / ooni.com audit reviews:
- walker: preserve whitespace-only text in inline elements ("ofthe" bug);
  capture ::placeholder styles for inputs
- css: emit visibility (hidden-at-rest wordmark artifact); exempt list
  markers from inherited elision (lost bullets); ::placeholder rules
- seo: sanitize og:type to Next's enum (render crash -> dev badge leak);
  generated next.config disables devIndicators
- capture/stabilize: promote lazy-loader data attrs before snapshots
  (collapsed sections, viewport-inconsistent captures); settle autoplay
  carousels to home slide before every snapshot; force-reveal hidden
  videos for poster shots + log failures
- generate: ship downloaded video files as local <video src>; keep
  picture>source through IR prune with srcset rewrite (mobile-crop-on-
  desktop heroes); pin Tailwind named screens to computeBands boundaries
- capture/graft: capture cross-origin iframe subtrees (Klaviyo signup
  forms) with element-screenshot fallback; asset download retry +
  visual-assets-missing reporting

Checkpoint commit: wave 4 (reveal settling, 206 range-response fix,
hidden-geometry banding, bare-zero utility gating) is mid-implementation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Samraaj Bath
2026-07-03 17:45:42 -07:00
co-authored by Claude Fable 5
parent da537e68b8
commit 9aed2540aa
31 changed files with 2579 additions and 121 deletions
+3 -5
View File
@@ -96,11 +96,9 @@ export function materializeAssets(graph: AssetGraph, sourceDir: string, appPubli
for (const e of graph.entries) {
if (e.classification !== "downloaded" || !e.storedFile || !e.localPath) continue;
if (e.type === "css") continue; // not served by the app
// A <video> is rendered as its poster still (streaming sources are dropped in
// generation), so the materialized video file is never referenced — skip
// copying it to public/ to save disk and build time. Its first-frame poster is
// a separate image asset that is still materialized.
if (e.type === "video") continue;
// Video files ARE copied: generation emits a local <video src>/<source src>
// whenever the file materialized (only streaming/undownloaded videos fall back
// to poster-only rendering).
if (seenPublicPaths?.has(e.localPath)) continue;
const src = join(storeDir, e.storedFile);
const from = fileExists(src) ? src : join(cssDir, e.storedFile);