* feat(skills): product-launch-video + consolidate motion knowledge into hyperframes-animation
- Add the product-launch-video skill: shot-sequence architecture where each
visual frame is a time-coded shot sequence picked from a blueprint menu and
paced to the voiceover (anti-PowerPoint). Includes the frame-worker sub-agent,
story/visual/motion-design references, and audio/captions/transitions/
stage-assets/assemble-index scripts.
- Consolidate motion knowledge in hyperframes-animation as the single source of
truth: promote the updated atomic rules (31 -> 36) and rename product-launch-
video's archetypes into hyperframes-animation blueprints (13 -> 15, replacing
the old set). product-launch-video, faceless-explainer, and pr-to-video now
reference them via ../hyperframes-animation/{rules-index,blueprints-index}.md
and the rules/blueprints dirs. Fixes the discrete-text-sequence broken links;
blueprints no longer ship per-id runnable examples, so example references in
the consumers were dropped.
- Default HeyGen TTS voice to Marcia (deterministic; was the API's first English
voice, which drifts on catalog re-sort). Override with --voice.
- assemble-index pre-assembly frame guards: auto-repair a sub-comp root missing
canvas dims; hard-fail on <video>/<audio> inside a sub-comp; hard-fail on a
timed non-root element missing class="clip" or overlapping same-track clips.
- Lint/CLI: lint media inside sub-compositions as an error; stop false-positive
caption layout/lint findings; contrast/layout-audit skip elements hidden by an
invisible ancestor.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(skills): clear CodeQL alerts in assemble-index.mjs
- script/style blanking regex now matches closing tags with trailing
whitespace (</script >, </style >) — js/bad-tag-filter (high).
- drop the existsSync precheck before reading/repairing a frame file; read
directly and handle ENOENT, removing the check->write TOCTOU window —
js/file-system-race (high).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.0 KiB
cta-morph-press — CTA Morph & Press
intent: A resting brand mark condenses at the same screen center into a smaller, brighter CTA, then a cursor arrives from off-stage and lands a human-aimed click on it. The viewer's eye is walked from "this is who we are" to "and this is what you do." The morph and the click are the two headline beats.
roles served
- CTA (from
cta-morph-press): when the close moves from brand identity to a single user action, two elements share the same center sequentially (a morph, not a cut), and the payoff is a simulated click with physical feedback. Reach for it for a focused "click here" sign-off — no spatial set, no multi-step UI (that'scursor-ui-demo).
duration: 4–6s
shot structure (a [bg] canvas; hero and CTA are flex-centered siblings sharing one transform-origin)
- Scene 1 (0.0–~1.4s) — presence. The
[hero mark / brand lockup]holds dead-center, alive but resting — only a faint rotational breath on the mark; any title text under it stays rock-stable. Camera static. - Scene 2 (~1.4–2.4s) — the morph (signature move). The hero CONDENSES at the same screen center into a smaller, brighter
[CTA](button / card): the outgoing mark shrink-fades exactly as the CTA scales up in its place. Because they share onetransform-origin, the eye reads it as one element transforming, not a swap. - Scene 3 (~2.4–3.4s) — approach. A
[cursor]arrives from off-stage on a decelerating path (it "arrives," it does not pass through) and lands a few px off the CTA's geometric center, so the aim reads human, not scripted. - Scene 4 (~3.4–end) — press. The cursor lands a physical CLICK — cursor and CTA compress together in lockstep, then release with feedback (an optional ripple / glow bloom). Holds on the clicked state.
motion vocabulary: faint rotation-only resting breath (logo scope only); same-center morph-swap (shrink-fade ↔ scale-up sharing transform-origin); cursor decel-arrival from off-stage; off-center human aim; lockstep press compression; release feedback ripple / glow.
rule mapping
- hero → CTA condense at one center →
scale-swap-transition(sharedtransform-origin: 50% 50%is what sells the morph; CTAposition: absoluteso it doesn't shove the hero during the brief overlap) - resting-hero aliveness (rotation only, scoped to the mark so the Phase-2 scale doesn't fight it) →
sine-wave-loop(low-amplitude rotation register — subtle jitter, not a scale breath) - cursor press + release in lockstep (single-target-array so both compress together) →
physics-press-reaction(PRESS_DOWN + RELEASE portion) - cursor approach (decel from off-stage, off-center landing, hard-cut opacity in) →
gsap-effects(translate onpower2.out) - click ripple / release glow →
cursor-click-ripple(attack-decay ring) and/orambient-glow-bloom(release bloom)
camera modifier: camera-static — the morph and click happen in element space; a camera move would compete with the click as the climax.