Motion

Motion communicates relationships and reinforces hierarchy. Use the right token for the right moment — fast for press states, slow for reveals — and combine duration with easing to shape how an element arrives or departs.

Duration

Five steps, each tuned to a specific interaction type. Heavier geometry and content reveals warrant longer durations; micro-interactions should be nearly invisible.

TokenValuePreviewUse
--duration-fast 80ms Press / active states
--duration-base 120ms Standard hover interactions
--duration-slow 200ms Fill, colour, and indicator transitions
--duration-enter 250ms Enter / exit geometry — drawers, panels
--duration-reveal 400ms Content reveal and stagger animations

Usage rules

Easing

All three easings are one-directional — they describe how something arrives, not how it oscillates. The preview below shows each curve in the direction it is designed to be used.

TokenValuePreviewUse
--ease-default ease General transitions with no strong directional intent
--ease-out ease-out Elements entering the screen — decelerate into position
--ease-spring cubic-bezier(0.16, 1, 0.3, 1) Expressive, high-attention moments — drawers, modals, reveals

Usage rules

Pairing guide

SituationDurationEasing
Button press / active--duration-fast--ease-default
Hover colour shift--duration-base--ease-out
Panel / drawer enter--duration-enter--ease-spring
Panel / drawer exit--duration-enter--ease-out
Content reveal--duration-reveal--ease-out

Code example

.panel {
  transform: translateY(8px);
  opacity: 0;
  transition:
    transform var(--duration-enter) var(--ease-spring),
    opacity   var(--duration-enter) var(--ease-out);
}

.panel.is-open {
  transform: translateY(0);
  opacity: 1;
}