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

Play it herePress the button, then race the six durations.
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
The Playground on an iPhoneRuns live on a cloud iPhone. No install, try it yourself.Open in Prototo ↗
target
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
  1. 01

    Matching parameter names didn’t guarantee matching movement. The handoff had to be a behaviour contract, not a list of numbers.

  2. 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.

  3. 03

    Reduced Motion needs a named policy per action — opacity only, instant feedback, settle without overshoot — not a global off switch.

  4. 04

    Tests prove the contract holds; only hands-on review proves it feels right. 10 of 15 patterns have passed that review so far.