Working prototype · iOSRegistry primitives · playable below
Motion playground
Can a motion spec be something you run, not just read?
The executable side of the Botim Motion System. Case study · The story
press the surface — values read from the registry
The duration scale, raced
duration/quick
100ms
duration/short
150ms
duration/medium
200ms
duration/standard
250ms
duration/long
400ms
duration/expressive
600ms
raced on easing/enter · grey = defined, not yet used by a pattern
position / time — 51 samples exported from Figma500ms segment
toastspring/settle
figma bounce 0.206
peak 1.6% past target
What I built · Figma → Registry → Prototo
- Registry
- 15 patterns and 26 primitives as one contract. Every value points back to the Figma node it came from.
- Runtime
- Native adapters own what Figma can’t say: state, measured geometry, and what happens when a motion is interrupted.
- Playground
- A Prototo app that runs each pattern in Standard and Reduced, with controls to interrupt, repeat and reset it.
- Springs
- Figma springs are a single bounce value. The runtime plays the 51 samples Figma exports instead of converting them.
What I learned · from the build notes
- 01
Matching parameter names didn’t guarantee matching movement. The handoff had to be a behaviour contract, not a list of numbers.
- 02
Interruption is where motion specs go quiet — a toast replaced mid-exit, a row removed while the list resets. The Playground exists to break those on purpose.
- 03
Reduced Motion needs a named policy per action — opacity only, instant feedback, settle without overshoot — not a global off switch.
- 04
Tests prove the contract holds; only hands-on review proves it feels right. 10 of 15 patterns have passed that review so far.