The core resolves a MotionDoc to a tree of final numbers. An adapter is a thin painter that walks that tree and draws it for one backend. Because they all paint the same tree, an animation looks and times identically wherever it runs.

@blinn-motion/dom

Full-fidelity CSS: nested divs, gradients, SVG vector paths, masks and shaders.

@blinn-motion/canvas

A pure-JS 2D canvas painter — one immediate-mode draw per frame, zero DOM nodes.

@blinn-motion/react

A declarative <BlinnMotion /> component with a swappable renderer.

@blinn-motion/react-native

The same timing on native <View> / <Text> — no native module.

Same control surface

Every adapter exposes the same playback API, because they all build on the core’s Ticker:
MethodDoes
play() / pause() / toggle()start, stop, flip playback
seek(t)jump to t seconds
seekFraction(f)jump to 0..1 of the duration
loopget/set looping

Fidelity at a glance

FeatureDOMCanvasReactReact Native
Transforms & opacity
Gradients⚠️
SVG vector paths + arrowheads⚠️
Masks / clip shapes⚠️⚠️
Procedural shaders⚠️
The DOM adapter is the fidelity reference — it implements the widest set of paint features. Canvas and React Native trade some of the rarer effects for portability.