Skip to content

Motion

Motion is tokenised and named by intent, not scattered as magic numbers.

TokenValueUse
--dur-1120msmicro-interactions (hover, toggle)
--dur-2180msoverlays appearing (modal, popover, cmdk)
--dur-3250mslarger transitions (drawer, sheet)
--easecubic-bezier(.22,1,.36,1)the house easing curve
transition: transform var(--dur-1) var(--ease);

Every animation is wrapped so it collapses to nothing when the user asks for it:

@media (prefers-reduced-motion: reduce) {
.modal-scrim.is-open,
.modal-scrim.is-open .modal-dialog { animation: none; }
}

Follow the same pattern for any new animated component — the harness and review expect it.

  • High-impact moments over scattered micro-interactions. One well-orchestrated reveal beats ten twitchy ones.
  • Transform/opacity only for anything that animates frequently — keep it on the compositor, off the layout thread.