Skill 18 · Hyperframes Animation
Subchapter 18.22
blueprints/camera-journey.mdMarkdown13 KBView on GitHub
intent: The real viewport camera is the STORYTELLER — a multi-leg journey (dive in → a mid-journey beat fires → travel to the consequence / reposition → landing push, at rest) across ONE continuous world, where the travel itself carries the narrative. Two folded sub-shapes: — the camera dives into a UI panel, a cursor/typed action fires, and the camera swoops/pans to another region where the consequence renders as element motion; — pure cinematic 3D flight (motion blur, depth-of-field, tilt-to-flatten rotations) over static or self-animating content, no cursor anywhere.
boundary: This is NOT cursor-ui-demo — there the camera chases the cursor (a servo following the actor); here the camera IS the actor, moving on its own narrative motivation, and in sub-shape A the cursor acts only at the leg hinge (in B it never appears). This is NOT device-surface-showcase — there one DEVICE/surface is hero and the camera merely presents it; here no single surface is hero — the journey traverses multiple regions/panels/depth planes and the traversal is the story. This is NOT spatial-pan-stations — there pre-placed stations on a flat canvas are visited by repeated pans of the same type; here the legs are heterogeneous (push-in, swoop, pull-back-rotate, whip, dive) and each leg is motivated (by a fired action, or by the reveal it lands on).
roles served
camera-swoop-panel-action-roundtrip): when the benefit IS a cause→effect round trip — “do this small thing here, get this big thing there” (comment → chart morphs; agent finding → verified commit; chat message → receipt + ledger). The camera physically connects the action to its payoff, so the viewer travels the value chain instead of being told it.cursorless-camera-flight): when the feature should feel cinematic and inevitable — a payout form or a generated content-plan calendar explored by a flying camera (dives, whip sweeps, tilt-to-flatten, violent final push onto the CTA/hero card), the content acting by itself (a dropdown self-selects; keyword cards simply exist in depth) with no hand on the wheel.duration: 5.6–11.1s (sub-shape A 5.6–9.0s: 001 5.6s · 066 8.6s · 004 9.0s; sub-shape B 6.3–11.1s: Outrank 6.3s · 094 11.1s)
shot structure (one oversized [world] — a [UI canvas: design tool / GitHub + agent panels / phone + desktop ledger] (A) or a [3D-laid-out space: floating form card / calendar grid with standing keyword cards] (B) — wrapped by a single virtual camera; content animates as elements inside the world while the camera travels; every leg is a sequential tween on the same camera state)
Scene 0 (optional, 0.0–~1.8s) — static prologue. Camera locked on a [prologue beat: static promo card with a floating 3D product card / typed headline with an accent word / wide establishing shot of the app]. A typewriter line may finish ([headline] types on, accent word in [accent color]). The prologue BREAKS by a hard cut or by the headline shrinking and slipping away as the first dive begins — the stillness exists to make the journey’s launch land.
Scene 1 (~0.5–2.0s) — LEG 1: dive in. The camera pushes in FAST and TIGHT onto [the focal element]:
[an actionable element: comment box / agent panel / chat bubble] where [typed text] finishes typing or [response text] streams in. The header/context leaves the frame — commitment, not a polite zoom.[the form region / the calendar grid], foreground elements motion-blurred during the travel, neighbors soft under depth-of-field. A huge [foreground prop: date number / field label] may dominate the frame, blurred by speed.Scene 2 (~1.5–6.0s) — LEG 2: the mid-journey beat (the hinge). The camera holds, drifts, or pulls slowly while the content ACTS:
[cursor] clicks [Send / Create PR] (or a [message] sends implicitly) and the acted element CLEARS/vanishes. Optional theater before the click: a [status spinner] cycles [status words], [to-do items] strike through, [response text] streams. The click is the hinge that motivates the next leg.[dropdown] expands by itself (pushing [the field below] down), shows a [row hover highlight] with no cursor, and collapses with the new value selected; OR the flight decelerates INTO FOCUS on [one card] — its [metrics] sharp, neighboring cards blurred.Scene 3 (~4.0–8.0s) — LEG 3: travel to the consequence / reposition.
[region B] while the CONSEQUENCE builds as element motion — [bars shrink into the baseline while a node-dotted line draws left→right / a verified commit row slides into the timeline + a reaction pill pops / a receipt card expands row-by-row from a skeleton]. An optional SECOND leg extends the trip: [pan up-right to a toolbar → a dropdown cascades open / match cut into an extreme close-up → a fast decelerating zoom-out reveals a ledger table].[a month calendar / the full card]. On the flat hold, quiet element beats may play: a thin [focus outline] fades in around one [field] and sweeps down to the next; the card keeps a near-imperceptible tilt/scale drift so the hold never dies.Scene 4 (final ~1–2s) — LEG 4: landing. The journey resolves on the payoff:
[cursor] hovers or drifts toward [the payoff: an open Export menu item / the commit link / the View-transaction button]; ends still, on the changed state — the world is visibly different from where the trip began.[the CTA button scaled huge in frame / the hero keyword card], ending holding tight — or holding MID-DIVE (the last frames are still traveling; the flat overview is explicitly not the final image).motion vocabulary: whole-viewport camera push-in (fast/tight and slow/subtle); camera pull-back reframe; camera pan up/right/down; dive/swoop between stacked panels; fast decelerating zoom-out to rest; sudden violent push-in onto a button scaled huge; continuous 3D flight through a card grid; dive into an angled 3D close-up; slow pull-back that rotates/flattens the world to straight-on; heavily motion-blurred whip sweep; motion blur on camera travel; depth-of-field with blurred neighbors; decelerate-into-focus; hard cut / match cut into extreme close-up; near-imperceptible tilt/scale drift on holds; typed text finishing in an input; typewriter headline; headline shrinks and slips away as the camera dives; streaming AI response text; status-word spinner cycling labels; to-do strikethrough draw; cursor click; clicked element clears/vanishes; dropdown cascades open / self-expands and collapses with a row hover highlight (displacing the field below); bar-to-line chart morph (bars shrink into the baseline while a node-dotted line draws left→right, labels persist); commit row slide-in on a timeline; reaction pill appears; skeleton→content card build; receipt/label rows expand row-by-row; thin focus outline fades in and sweeps between fields; camera drift toward a button; 3D card subtle float; cursor hover at rest.
rule mapping
multi-phase-camera (phase sequencing + drift) over viewport-change (the base virtual-camera primitive: single .world wrapper, one cam {scale,x,y} state — one source of truth for every leg)coordinate-target-zoom (scale + counter-translate; measure the target, don’t hand-derive — a journey amplifies centering error on every leg)coordinate-target-zoom zoom-out variation / multi-phase-camera (pull phase, hard power4.out)motion-blur-streak (Camera-travel carve-out — the blur envelope rides the .world wrapper during a leg: the world never leaves frame, the blur peaks at peak velocity and resolves sharp at each landing)depth-of-field-blur (focal pull + blur-the-cluster-while-pushing-in are explicitly in scope; run the DoF tween at the same position as the camera leg)rotateX/rotateY/translateZ through a 3D-laid-out world: the dive into an angled calendar grid, the tilt-to-flatten pull-back (angled 3D → straight-on 2D), the continuous flight between standing cards → 3d-camera-flight (perspective wrapper + preserve-3d; the 2D camera rules keep owning any flat legs)nudge-curve (burst-dominant tuning of the slow-fast-slow slide, applied to the world) + motion-blur-streak (camera-travel carve-out) on the same window[status words]; skeleton→content state swap → discrete-text-sequence (+ gsap-effects typewriter; context-sensitive-cursor for the input caret)dynamic-content-sequencing[Send / Create PR] (sub-shape A’s hinge) → cursor-click-ripple + press-release-spring (or physics-press-reaction for a weightier press)scale-swap-transition / card-morph-anchorcss-marker-patterns (strike-through) · asr-keyword-glow (accent glow on the hovered/selected row)stat-bars-and-fills (bars scaleY → baseline) + svg-path-draw (node-dotted line draws left→right) at the same timeline position — no single rule names the coordinated chart-type morph, but no new rule neededspring-pop-entrance (single arrivals) / waterfall-entry (the row-by-row cascade)anchored-layout-expand (the masked edge-anchored expansion of the dropdown body — never tween height) + reactive-displacement (the expansion tween drives the sibling’s displacement)From, then sweeps down onto Amount) → ai-tracking-box restyled as a plain outline (offsets baked at setup; size morphed via scale, never width/height)sine-wave-loop (+ multi-phase-camera‘s drift for the camera-side micro-motion; the tilt component of the drift belongs to 3d-camera-flight)multi-phase-camera (steady-push mode, tiny spread)camera grammar (the defining layer — this blueprint IS its camera): every leg is a tween on ONE camera state (viewport-change‘s single .world wrapper / cam object), sequenced by multi-phase-camera, aimed by coordinate-target-zoom. Legs must be motivated: sub-shape A moves because an action fired (click → swoop to the consequence); sub-shape B moves because the next reveal demands it (dive → focus → reposition → final dive). Vary the leg verbs — a journey of four identical pushes reads as a slideshow. Ease law: hard out-family on dives and landings (power4.out — violent arrival, sharp settle), power2.inOut on repositioning legs; spring/back easing on a camera feels wrong (per multi-phase-camera). Sub-shape B layers 3d-camera-flight‘s perspective wrapper under the same single-state discipline.
Seek-safety (non-negotiable for this much camera): the entire journey — every leg, every blur envelope, every DoF pull — lives on the ONE paused GSAP timeline, so any frame seek reproduces the exact mid-leg camera pose. One camera state object, transform composed in a single writer (applyCamera()), no CSS transition anywhere near the wrapper, blur via proxy-tweened attributes / --dof vars (both seek-safe), and ending mid-dive is fine — a seek to the last frame just lands mid-tween. Per-leg targets are measured ONCE at setup (after fonts.ready) and baked; never getBoundingClientRect in onUpdate.
Overflow (required for a clean check): a traveling camera deliberately moves world content past the frame edges on every leg. Keep overflow: hidden on the scene root AND mark the moving .world wrapper with data-layout-allow-overflow — otherwise check reports text_box_overflow / container_overflow for every panel the journey leaves behind (see the same note on device-surface-showcase).