What Figma Motion does well:
You can enter any cubic-bezier you want, per keyframe. It isn't a preset menu.
HOLD steps a value instead of interpolating it. I used it a lot.
Auto-layout properties animate — spacing, padding, gaps. I didn't need it here.
Iterating is fast once the layers are named.
What Figma Motion doesn't do yet:
No triggers. No click, no scroll, no transitions between frames. You get a loop.
You can't animate text content, image fills, component variants or vector paths.
The timeline doesn't snap reliably and values drift slightly. It's a beta.
Things that
tripped me up:
One timeline per top-level frame. The frame owns the timeline and can't be animated itself. Everything you keyframe lives inside it.
Transforms are relative, the rest aren't.TRANSLATION_Y adds to the layer's current position, neutral 0. SCALE multiplies, neutral 1. OPACITY, WIDTH, HEIGHT and CORNER_RADIUS replace the value. Place each layer where it should finish and animate the offset backwards.
First keyframe applies backwards to 0:00. A track starting at 1.5s is already correct before 1.5s. If its first keyframe isn't the resting value, the layer sits in the wrong place for half the timeline.
Duration defaults to 2 seconds. I forgot to change it twice.
Where the curves
came from
The brand's motion guidance is a page of text and a dozen After Effects renders. Nothing a machine can read.
I pulled the principles out of it and wrote them down as two files: a motion language doc, and an agents.md the agent loads before it touches the Figma file. The next section that needs motion starts from those instead of from scratch.
Packaged as a skill
The build is a skill now. It reads the motion language first, authors the keyframes, exports the asset pack, and runs the brand conformance check before anything ships.
Running that check against this build turned up two things. The curve table is wider than the language allows, and the language names uniformity as the intent rather than variety. And the crossfade above solves a problem the brand avoids by not stacking imagery at all. Their answer is a match cut at the fastest point of the move, which leaks nothing because nothing is ever blended. Both are logged against the next build.
A Figma plugin that applies the checked curve set directly in the file is the next step.



