@blinn-motion/core. The format is
intentionally small, time-based (seconds), renderer-agnostic, and human-readable enough
to hand-author for tests.
Design goal: anything the engine can play, the Figma converter can emit — and the format
stays readable. See the full schema for every field.
Top level
Layers nest
A layer’sbase position is relative to its parent’s box (top-level layers are relative
to the stage). Children inherit the parent’s animated transform — exactly like the DOM. That
nesting is why a card can move and its badge moves with it.
Tracks animate one property
Each track drives a single normalized property over the base value. Theop decides how the
sampled value combines with the base:
op | result | meaning |
|---|---|---|
set | v | absolute |
offset | base + v | additive |
scale | base * v | multiplier |
Keyframes hold a value at a time
tis absolute time on the timeline, in seconds.vis anumber, a[x, y]vector, a"#RRGGBBAA"color, a boolean, or a string.easinggoverns interpolation from this keyframe to the next (out-interpolation, like CSStransition-timing-function). The last keyframe’s easing is ignored.
A complete tiny example
This is a real, playable MotionDoc — a card that springs up and fades in while a badge spins.card.motion.json