vaweGitHub

Video componentsEnd a film

CTA pop

End a filmfield1.8 s

cta-pop.md

CTA pop: final frame of the end card animation
00:00.0000:01.80
Tap the clip to play it.

When to use

Use when the film ends on an action. The line is already on screen; the button pops in under it on the overshoot curve, growing from the line’s left edge and 3vh below its slot, and it is the only accent in the frame. After it lands the arrow leans right and returns twice, so the button invites a click and the tail is never still.

The code

html
<h1>Your first film<br>is one page away.</h1>
<div class="cta"><span>Start free</span><svg viewBox="0 0 24 24"><path class="arrow" d="M4 12 H19 M13 6 L19 12 L13 18"/></svg></div>
<style>
.cta { display: inline-flex; align-items: center; gap: 2.4vh; padding: 3.8vh 6vh 3.8vh 7vh; border-radius: 999px;
       background: var(--accent); color: #fff; transform-origin: 0 50%; opacity: 0; }
.cta path { fill: none; stroke: #fff; stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; }
</style>
<script type="module">
import { EASE } from '../../core/motion/presets.js';
cta.animate([{ scale: '0.86', translate: '0 3vh' }, { scale: '1', translate: '0 0' }], { duration: 650, delay: 300, easing: EASE.pop, fill: 'both' });
cta.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 100, delay: 300, easing: 'linear', fill: 'both' });
[1200, 1600].forEach((at) => arrow.animate([{ translate: '0 0' }, { translate: '4px 0', offset: 0.4 }, { translate: '0 0' }],
  { duration: 520, delay: at, easing: EASE.landSoft, fill: 'both' }));
</script>

Easing

Each ease is a pair of After Effects handles from core/motion/presets.js. Every curve as CSS.

EaseLeaving a keyArriving at a key
landSoft20% influence, speed 2.575% influence, speed 0
pop12% influence, speed 4.835% influence, speed -1.5

Notes

The start scale is 0.86, never 0 (taste rule 5). The recoil of the overshoot curve is the pop; use it on this one element only, since a second bouncy thing in the frame turns the beat into a toy. The button is 8.4vh type in one solid colour with no glow, so the label stays readable when it lands. The arrow moves 4 units in a 24-unit box; more than that reads as a wiggle, less is lost at 640 px. Give the pop 300 ms of head start so the line is read before the button asks for a click.

Looks (ground, type, radius, accent) live in demo/demo.css; this snippet keeps neutral tokens.

Sound

Sound: droplet at 0.45 s into the move, when the button crosses its full size on the overshoot (default gain).

Chain it into a film.

Copy chains of video components from the recipes.