Files
13649c6cc6 feat(producer): auto-fallback screenshot capture for raf and iframes (#331)
* fix(core): drive adapter seeks when composition has no GSAP timeline

renderSeek returned early when deps.getTimeline() was null, skipping the
onDeterministicSeek call that drives all frame adapters (CSS, WAAPI,
Lottie, Three.js). That meant compositions using any non-GSAP animation
primitive froze on their initial frame during capture.

Now we still quantize the seek time and fire onDeterministicSeek even
without a timeline, so each adapter gets a chance to advance.

GSAP compositions are unaffected — timeline-driven seek still takes the
same path it did before.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* feat(producer): auto-fallback screenshot capture for raf and iframes

Co-Authored-By: Codex <[email protected]>

* test(producer): add render compatibility regression fixtures

Co-Authored-By: Codex <[email protected]>

* fix(core): scrub CSS animations via WAAPI currentTime

Co-Authored-By: Codex <[email protected]>

* test(producer): cover css keyframe renders

Co-Authored-By: Codex <[email protected]>

* fix(producer): propagate virtual time into iframe documents

Co-Authored-By: Codex <[email protected]>

* test(producer): refresh iframe docker golden

Co-Authored-By: Codex <[email protected]>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
Co-authored-by: Codex <[email protected]>
2026-04-18 15:08:52 -07:00

22 lines
1011 B
HTML

<!DOCTYPE html>
<html>
<head>
<style>
body { margin: 0; background: #0a0a0f; width: 1920px; height: 1080px; color: #e0e0e0; font-family: system-ui, sans-serif; }
.stage { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 60px; }
.spinner { width: 200px; height: 200px; border: 16px solid rgba(255,255,255,0.12); border-top-color: #5eead4; border-radius: 50%; animation: spin 1s linear infinite; }
.label { font-size: 40px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; }
@keyframes spin { to { transform: rotate(360deg); } }
</style>
</head>
<body>
<div id="root" data-composition-id="css-spinner" data-width="1920" data-height="1080" data-start="0" data-duration="5">
<div class="stage clip" data-start="0" data-duration="5">
<div class="spinner"></div>
<div class="label">Loading</div>
</div>
</div>
<script>window.__timelines = window.__timelines || {};</script></body>
</html>