Subchapter 30.3
references/motion-language.mdMarkdown15 KBView on GitHub
The motion layer for Step 4 (Visual design). When you write a frame’s time-coded shot sequence, you name each scene’s move — a named palette of the moves the golden corpus actually uses. Each move carries the in this skill’s local ; cite that id so the move resolves to a real recipe when a implements it in Step 5 (the worker reads the rule body in — it reproduces the move, it does not guess from the name). You name motion by , never by raw GSAP curve, ms, or stagger formula — the worker maps the curve. Between-frame : story names , the harness injects it; that injected transition the frame’s exit. For cuts a worker builds INSIDE a frame (within-scene swaps, scene-to-scene seams), see the catalog in .
../hyperframes-animation/rules/../hyperframes-animation/rules/<id>.mdtransition_incut-catalog.mdA good code-change explainer feels like one continuous film — one camera, one motion feel, smooth and timed to the voiceover — not a pile of slides that animate once and freeze. In a PR explainer the development often is the reveal: the diff hunk typing in, the before→after morph, the impact stat landing. The doctrine in Part 2 is load-bearing: when in doubt, do what it says.
Reach into this palette when naming a scene’s motion. Pick the move that matches the beat, name it in the shot sequence, and cite the rule id after →. The blueprints (../hyperframes-animation/blueprints/) name these same moves in their rule mapping; you’re drawing from one shared palette. Compose 2–4 across a shot’s scenes (entrance → sequential reveal → settle), not all at once.
discrete-text-sequencediscrete-text-sequencedynamic-content-sequencingkinetic-beat-slamdiscrete-text-sequence (+ context-sensitive-cursor for the caret blink / color)discrete-text-sequence (+ context-sensitive-cursor)counting-dynamic-scalestat-bars-and-fillshacker-flip-3dsvg-path-drawmulti-phase-cameracoordinate-target-zoom.world wrapper to pan / zoom / lock onto a region. → viewport-changecamera-cursor-trackingcenter-outward-expansionorbit-3d-entrysplit-tilt-cardsavatar-cloud-network3d-page-scrollcursor-click-ripplepress-release-spring (or physics-press-reaction for a click that compresses cursor + target together)asr-keyword-glowscale-swap-transitionscale, not width/height). → card-morph-anchorThe velocity-matched cuts a worker authors between a frame’s own Scenes. Name the seam in the shot sequence; the recipe is in the catalog, not a single ../hyperframes-animation/rules/ id.
cut-catalog.mdcut-catalog.mdcut-catalog.mdcss-marker-patternssine-wave-loop (low-amplitude register)svg-icon-enrichmentsine-wave-loopFive moves the golden corpus needs were added to this skill’s ../hyperframes-animation/rules/, rounding out the vocabulary above:
depth-of-field-blurmotion-blur-streakdepth-scatter-assemblespring-pop-entranceambient-glow-bloomThese four rules are the difference between a clip that reads as a serious code-change explainer and one that reads as an agent-made PowerPoint. Follow them as written.
Elements should use long-tail decel curves that let them settle smoothly. power3 is enough in most cases. No bouncy, no overshoot, no back.out / bounce.out / elastic.out as a default.
Bouncy is the #1 instant turn-off in user-made Remotion / HyperFrames videos, and the agent almost never gets it right — it thinks bouncy adds emphasis, but it buys that emphasis at the cost of cleanliness. The serious motion-design shops feel the same. Smooth always wins. Overshoot is demoted to a rare, explicitly-playful exception (a consumer/fun logo slam, a deliberate bell-hit) — never the house style. Name the intent as a long-tail settle; the worker maps power3 (or expo.out on a fast arrival). See ../hyperframes-animation/rules/spring-pop-entrance.md — it now leads with the smooth settle. (The exact form of that settle is a critically-damped spring; the worker has a baked, seek-safe springEase — ζ=1 — in ../hyperframes-animation/adapters/gsap-easing-and-stagger.md → Spring Eases for when the settle is the hero. Real physics, same doctrine — not a license for bounce.)
This is the anti-PowerPoint mechanism — sharper than “put development in the middle.”
Practically: a frame’s shot sequence front-loads almost nothing — the entrance carries only what the VO is saying at t=0, and the rest of the elements wait in the timeline for their spoken cue. A reveal maps onto a development-class move from Part 1 (per-word staggered reveal, cluster→outward expansion, a count-up, an asr-keyword-glow synced to the word rail).
The agent’s two reflexive ways to fake “aliveness” both read cheap:
The fix for both is the same: stagger element reveals in time with the script (rule 2). And the governing principle: “I’d rather have NO motion than BAD motion.” A held, still frame is better than a frame kept “alive” by breathing or a drifting camera. The only sanctioned aliveness during a hold is subtle jitter — a small low-amplitude jitter that keeps a frame from feeling dead without looking weak (it’s in Code editorial videos now). Everything else holds.
When a frame has an internal seam — a within-scene swap, a Scene-to-Scene cut, a text-to-text line change — make it a velocity-matched cut, not a hard slideshow cut: cut at peak velocity, match direction and speed on both sides. The catalog (the four techniques, the blur logic, and which to use when) is cut-catalog.md; the moves are listed under Seam cuts in Part 1.
Smooth long-tail (power3) over bouncy; reveal sequentially in the back ~50% timed to the VO (not dumped in the first 25%); no lazy breathing and no bad slow pan/push — prefer stillness, with subtle jitter as the only aliveness; cut at peak velocity with matched direction/speed (→ cut-catalog.md).
The frame is a paused GSAP timeline seeked frame-by-frame, so some “continuous” intents from a real-time engine can’t render — don’t name them. These are non-negotiable regardless of doctrine.
repeat / yoyo.Math.random particle fields, no Date.now drift. Every render must be identical; name deterministic motion only (stagger and any variation derive from the element index).fromTo — state the from-state explicitly so a seek to t=0 lands the element correctly; never rely on a CSS-hidden start (it renders visible before the tween claims it, and flickers under seek).transition / @keyframes for motion — CSS animation runs on the browser clock, independent of the HF seek clock; it desyncs and flickers. Drive all motion inside the paused GSAP timeline.transition_in is the exit. Exit motion belongs only to the final frame. (Worker-built seam cuts in cut-catalog.md are within-frame, not the frame’s exit.)Slideshow (the primary failure): everything dumped on screen in the first ~25%; content enters then freezes; nothing revealed on its VO cue. Fix with rule 2 (sequential reveal timed to the VO).
Cheap aliveness: circular breathing as “life”; a slow pan/push in the back half disrupting the eye; many elements floating independently as “motion.” Fix with rule 3 (stillness + subtle jitter only).
Bouncy: back.out / bounce.out / elastic.out as the default entrance; hand-keyed overshoot. Fix with rule 1 (power3 long-tail; overshoot only when explicitly playful).
Always: no repeat / yoyo; no Math.random / Date.now; no all-elements-entering-simultaneously (sequence or stagger).
Scene 1 (0.0–1.0s): solid field; hero headline enters via per-word staggered reveal (
dynamic-content-sequencing) on a smooth long-tail settle (power3); slow push on the root (multi-phase-camera) holds steady — no back-half re-push. Scene 2 (1.0–3.0s): as the VO names each changed file, five file chips reveal sequentially via cluster→outward expansion (center-outward-expansion), then a value-scaled counter (counting-dynamic-scale) ticks the +/− line total up beneath them — the back-half reveal, timed to the script, not dumped at t=0. Scene 3 (3.0–4.2s): hold on the result; keyword glow (asr-keyword-glow) lands on the payoff word as the VO says it; settles and holds still — at most subtle jitter (sine-wave-loop, low amplitude) keeps it alive; no breathing, no drift.
Name the move + its rule id (or cut-catalog.md for a seam cut) per scene; let the worker pick curves, ms, and stagger — defaulting to power3.