Setting the file. One moment.
Subchapter 28.1
references/builder-contract.mdMarkdown3 KBView on GitHub
Root #stage (data-composition-id) needs position: relative; width: <W>px; height: <H>px. Without a resolved height, flex children collapse to ~0 and content piles into the top-left. Automated gates may miss it, so inspect proof snapshots.
.scene-content fills the scene with padding, not offsets:
display: flex;
flex-direction: column;
justify-content: center;
width: 100%;
height: 100%;
padding: 120px 160px;
gap: 24px;
box-sizing: border-box;position:absolute; top:Npx on a content container (it overflows). Reserve absolute for decoratives. Keep ≥80px padding (title-safe margin).gsap.from() only for a non-clip element active from t=0. Inside .clip, in sub-compositions, and for later entrances, use explicit fromTo(). The CSS position is ground truth; the tween is the journey to it.gsap.timeline({paused:true}) on window.__timelines["<id>"]; tl.seek(0); never tl.play().class="clip" + data-start/data-duration/data-track-index + a stable id. Timeline-driven groups inside one full-duration clip don’t each need timing attrs.Date.now() / Math.random() / network. Count-ups tween a proxy object via onUpdate (seek-safe), never a wall-clock counter.fromTo() with an explicit { autoAlpha: 0 } start and { autoAlpha: 1, ... } end. Do not page-load gsap.set() a later .clip, and never target .clip visibility; the framework owns its lifecycle. (Eval finding.)onUpdate; they only render when the host advances the timeline with events enabled (tl.time() / non-suppressed seek). A bare seek(t, true) freezes them at 0 — the HF render host must seek with events on. (Eval finding.)power1–4, back, bounce, circ, elastic, expo, sine (.in/.out/.inOut).hyperframes check; mark intentional overflow data-layout-allow-overflow="true".palette object / CSS custom properties — no inline hex scattered through the markup (for asset-fusion, eyedropper the palette from the asset).