Operator console · motion primitives
Small moves, real physics.
A governed kit — pure CSS, the View Transitions API, and three tiny hooks. Every duration has a role, every curve is a sampled spring, and every animation degrades to the correct static reading.
Two vocabularies, never mixed: springs move chrome — buttons, panels, menus, badges, indicators. Instruments never overshoot — numbers, gauges, rings and sparklines ride a soft ease, and figures snap.
Tokens & curves
Three real underdamped springs sampled into linear(), plus the closed duration vocabulary.
Tactile controls
Press in 80ms, release on the full pop spring. Focus rings that lock in.
Entrances & exits
The keyframe library: calm text, spring panels, bounce toasts, flat 100ms exits.
Overlay lifecycle
Two-phase mount→closing→unmount, a single-open bus, menus that hinge and dialogs that scale.
List stagger
CSS-only --i stagger with a 360ms cap so long lists never hide their tail.
Reveal on view
An observer that only sets data-attributes — it can delay a reveal, never lose content.
Scroll-driven
Marks that draw as they're seen, and edge fades wired to scroll position. Linear only.
View transitions
Nested crossfade boundaries, a traveling indicator, and a shared-element morph.
Route progress
Grace delay, surge, endless crawl, snap finish — JS only flips one attribute.
FLIP reorder
WAAPI rides the exact CSS curves: the acted item bounces, neighbors spring.
Metric flash
Figures snap — never a count-up. One 200ms wash is the whole story.
Progress ring
A zero-JS conic instrument: @property + @starting-style, soft ease, no overshoot.