Skip to content

Motion

Updated 2026-05-19

Motion tokens cover three dimensions: duration (how long), easing (how it accelerates), and delay (when it starts). All three must be specified together for any animated component.

duration

Duration controls the speed of a transition. Smaller, simpler components move faster; larger, complex surfaces take slightly more time to respect their physical weight.

TokenValueUsage
--zen-motion-duration-instant100msMicro-feedback: button hovers, checkbox toggles, radio buttons, focus rings
--zen-motion-duration-fast200msSmall scale: tooltip fade-ins, dropdown/select expansions, tag dismissals
--zen-motion-duration-base300msStructural changes: collapse/accordion expanding, toast notifications sliding in
--zen-motion-duration-slow400msLarge surfaces: modal scaling in, drawer (side panel) sliding in

easing

Easing curves give motion a natural, physical feel.

TokenValueUsage
--zen-motion-ease-entranceease-outFast start, slow finish. Objects entering the screen (e.g. modals, drawers). Feels responsive but settles smoothly.
--zen-motion-ease-exitease-inSlow start, fast finish. Objects leaving the screen (e.g. closing a side nav, dismissing a toast). Gets out of the user's way quickly.
--zen-motion-ease-standardease-in-outSmooth start and finish. Elements moving from point A to B, or expanding internally (e.g. accordions opening, progress bars filling).

delay

Delay dictates the pause before the motion duration begins.

TokenValueUsage
--zen-motion-delay-stagger20msChoreography: applied incrementally to list items, table rows, or search result cards as they enter the screen
--zen-motion-delay-intent300msHover protection: standard wait time before revealing a tooltip or complex glossary popover. Prevents accidental visual noise.
--zen-motion-delay-long500msFeedback holding: used for temporary success states before they auto-dismiss (e.g. a toast lingering before sliding out)

Drawer (open/close)

Slug: drawer-open-close

PhaseDurationEasingBehavior
Openduration-slowease-entranceSlides in from the right
Closeduration-baseease-exitSlides out to the right

Accordion (expand/collapse)

Slug: accordion-expand-collapse

PhaseDurationEasingBehavior
Expandduration-baseease-standardHeight animates open; content fades in (0→100% opacity) during final 150ms
Collapseduration-baseease-standardHeight animates closed; content fades out (100→0% opacity) during initial 100ms

Success Toast

Slug: success-toast

PhaseDurationEasingBehavior
Entryduration-baseease-entranceSlides in from the bottom
Holddelay-long (500ms as token; 4000ms total hold)Settle time after entry completes before auto-dismiss timer begins
Exitduration-fastease-exitFades out quickly

The "Anchor" Motion — Dropdowns, Popovers, and Tooltips

Slug: anchor-motion

PhaseDurationEasingBehavior
Openduration-baseease-entranceFades in (0→100% opacity) over full duration; element scales up from its trigger point while fading in
Closeduration-fastease-standardFades out (100→0% opacity) over full duration; element scales down and retracts back to its trigger point

Layered Overlays — Modals

Slug: layered-overlays-modals

PhaseDurationEasingBehavior
Openduration-slowease-entranceModal scales 95%→100% while background scrim fades in. The slow duration communicates that the user has entered a new, temporary top-level context.
Closeduration-fastease-exitModal scales 100%→95% and fades 100%→0%. Scrim fades 100%→0%, synchronized. Slower on open to help users track context; dismisses quickly once the decision is made.

Skeleton Loading

Slug: skeleton-loading

DurationEasingBehavior
2000ms (looping)linearA continuous, subtle gradient shimmer moving left-to-right. Not tokenized — value is fixed. Provides visual confirmation the system is active and reduces perceived wait time for data-heavy views.

Staggered Entrance — Lists, Table Rows, Search Cards

Slug: staggered-entrance

Per-item durationEasingDelay per item
duration-fastease-entrancedelay-stagger × item index (item 1: 0ms, item 2: 20ms, item 3: 40ms…)

State Transitions

Slug: state-transitions

StateDurationEasingBehavior
Hoverduration-instantease-standardSubtle background color shift via brightness filter
FocusNo motion tokens — instant high-contrast ring/border for accessibility and speed
Pressedduration-instantease-exitSubtle scale or brightness darkening
→ Selectedduration-fastease-standardSubtle background color shift and side stroke draw-in
→ Unselectedduration-instantease-exitRapid fade and stroke collapse