Text over a photograph fights the photograph: the checker failed the orange kicker at 1.9:1 contrast (55%-black panel over a bright sky) and the white layer tags sat on pale sky. Fixed as a class — 78% panel behind the title block, dark chips behind the layer tags — and the re-check reports 0 errors.
Accepted check warnings: the closing chip's hold reads about 1.9s by the checker's reading-speed rule, over a settled end frame; the nested-div timeline rows are cosmetic.
Banned list —Beat grid —Build method —Self-review —
<direction>
Build a 1280x720, 11-second 2.5D parallax photo animation in HyperFrames + GSAP: ONE still photo, split into three feathered depth layers (far / mid / foreground), first pulls apart vertically for one beat so the audience SEES the layers, then settles into a single slow push-in where every layer travels at its own speed — the foreground moves most, the far mountains least — until the still feels like a camera move. House style: background #0a0a0a, white type, ONE orange accent #ff5c1a, Arial/Helvetica bold, NO webfonts, no glows, no 3D. The photo is a sample and the footer says so: "SAMPLE PHOTO (AI) — SWAP IN YOUR OWN PHOTO + MASKS".
Subject photo: Mountain lake at golden hour — snow peaks (far), forested ridge (mid), rocky shore with pines (foreground)
Stat callouts (value — label, three of them): 3 — depth layers, 1 — still photo, 8% — slow push-in
Banned: video footage (the whole point is a still), extra colours in the UI, text sitting directly on bright photo areas without a dark panel behind it, drift so large the layer seams show.
</direction>
<structure>
0.0-1.0s: the photo fades in whole; a flat dark panel slides in top-left carrying the orange kicker "PARALLAX PHOTO ANIMATION — SAMPLE RUN" and the title "ONE PHOTO, THREE DEPTHS"; the bottom panel and footer settle.
1.6-3.8s: THE SPLIT — the far layer lifts, the foreground drops, and the FAR / MID / FOREGROUND tags (on dark chips) name each layer; then the layers glide back together.
3.4-11.0s: THE PUSH-IN — one continuous camera move at three speeds (far scale to 1.05, mid to 1.09, foreground to 1.14 with the largest lateral drift); the three stat chips land across the move and the closing caption "ONE PHOTO · THREE DEPTHS · NO VIDEO FOOTAGE" closes over the settled frame.
</structure>
<build>
Layers are cut as horizontal depth bands with FEATHERED alpha ramps (100px gradients), not hard edges: because all three layers carry the same pixels, the photo is pixel-perfect at rest and the feathers hide the seams while drifting. Every layer is overscanned (105% size, centred) and total drift stays under ~26px, so no edge ever exposes the background. Real object-edge masks are the hero upgrade; bands are the honest fast version and the notes say so. Text never sits on raw photo: the title block rides a flat 78%-black panel and the layer tags ride dark chips — a bright sky will fail contrast checks otherwise (it did: 1.9:1, fixed, re-checked at 0 errors). One paused GSAP timeline registered as window.__timelines["main"]; the push-in is three same-duration, same-ease tweens differing only in scale/drift, started on one timestamp.
</build>
Show the trick before you use it: the one-beat layer split is what turns a subtle effect into a shareable demo — viewers who have seen the layers separated read the push-in as depth instead of zoom. And keep the drift honest: feathered bands forgive about 25px of travel; past that, cut real object masks.