Skip to content

Motion

Motion is used to support clarity, not decoration. Most transitions in this UI system are subtle and functional, helping users understand state changes without adding noise.

Motion should feel like polish, not personality. If an animation draws attention to itself, it’s probably too much.

Transitions are most useful when they reinforce meaning:

  • hover and focus feedback
  • expanding/collapsing content
  • opening/closing overlays
  • loading states

If a user prefers reduced motion, transitions should be minimized or removed.

  • small color or opacity shifts
  • focus-visible rings
  • minimal transform (only when it helps affordance)

Use for UI that appears/disappears, like:

  • menus
  • popovers
  • dialogs
  • collapsible sections

Keep transitions short and consistent.

A few defaults I use often:

  • short transitions (duration-150 to duration-200)
  • simple easing (ease-out is usually enough)
  • opacity + small translate for menus/popovers (when used)

When motion is used, it should degrade gracefully.

For global styling, support:

  • prefers-reduced-motion: reduce

The goal is that the UI still works and still feels polished even when animations are turned off.

  • infinite animations (unless it’s a loading indicator)
  • bouncy/overshoot easing for system UI
  • motion that triggers on scroll
  • large transforms that shift layout

Motion is easy to overuse. This system treats it like seasoning: a little improves clarity, too much overwhelms the experience.