Motion
Scroll-reveal, orchestration, and pointer-follow primitives from @idinstudio/ui — the building blocks behind every landing-page preset's entrance choreography.
prefers-reduced-motion and renders instantly, fully visible, with no transition at all when it's set.FadeIn
Scroll-reveal wrapper — animates from an offset, transparent starting position to fully visible once in view (IntersectionObserver-backed whileInView).
Built for teams that ship
Every primitive here is scroll-triggered, not autoplaying.
Reveal
A more dramatic scroll-triggered entrance than FadeIn — wipes its children into view with a clip-path mask instead of a fade/translate.
Design systems that ship
Stagger / StaggerItem
Orchestrated children reveal. Stagger triggers a shared visible state on view-enter; each StaggerItem inherits it, offset by staggerDelay per item.
Fast
Ship an MVP in weeks, not quarters.
Accessible
WCAG AA baseline on every component.
Token-driven
Re-skin the whole system from one config.
Parallax
Shifts children vertically as the viewport scrolls past them, tracked against the element's own scroll progress. Positive speed lags behind scroll, negative leads it.
Foreground layer — speed -0.5 (leads the scroll)
Background layer — speed 0.5 (lags the scroll)
Magnetic
Pointer-follow magnetic hover for a single child. As the pointer moves over the wrapper, the child drifts toward it, clamped to maxDistance. Disabled on touch/pen and under prefers-reduced-motion.
Marquee
Infinite horizontal scroller — a pure CSS keyframe loop, no JS animation frame, no motion.dev import. Pauses on hover and on focus-within so a keyboard user can stop it to read.
SmoothScroll
Lenis provider for the whole app/page — attaches a global inertial-scroll instance on mount, renders no DOM of its own. Wrap once at the layout root, not per-section.
/system shell scrolls inside its own contained region rather than the window, so wrapping a demo here wouldn't reproduce the real product-page feel. Reach for it in an actual app/marketing root layout to feel the inertial scroll — it no-ops under prefers-reduced-motion and on the server, so it is always safe to wrap unconditionally.