Every adapter shares one playback surface, built on the core’s Ticker. The examples below use @blinn-motion/dom, but the API is identical for Canvas, React / Vue / Angular / Lit (refs & methods), Svelte (getBlinnHandle), and React Native.

Play, pause, toggle

Seeking

Seeking works whether or not the player is running — it resamples and repaints a single frame.

Progress-driven (scroll · gesture · state)

When motion should follow an external signal instead of the wall clock, drive setProgress(0…1). Helpers live in @blinn-motion/core:

React controlled prop

Looping

Speed

Set the playback rate with the rate option (a multiplier on real time):

Build a scrubber

Use onframe to keep a slider and timecode in sync, and seekFraction on input. Pause while the user drags, so playback doesn’t fight the scrub.
This is exactly how the live demo on the Blinn Motion site drives its keyframe timeline — onframe moves the playhead, and dragging it calls seekFraction.