Back to blog
Design #motion#design system#animation

Motion Design Systems in 2026: Animation Tokens and Standards

Consistent motion creates cohesive products. A practical guide to building motion design tokens, easing curves, and animation standards.

14 min · January 24, 2026 · Updated January 27, 2026
Topic relevant background image

TL;DR

  • Motion design tokens standardize animation behavior across your product—just like color and typography tokens.
  • All animations have four components: trigger (what causes it), duration (how long), easing (acceleration curve), property (what changes).
  • Two motion styles: Productive (subtle, efficient, for task-focused moments) and Expressive (vibrant, for significant moments).
  • Natural motion follows physics: accelerate quickly, decelerate smoothly. Avoid linear movement and bounce effects.
  • Define tokens with intent (e.g., duration-quick) rather than raw values (e.g., duration-100ms).
  • CSS transitions handle simple cases. JavaScript libraries (Framer Motion) handle complex, physics-based animations.
  • Use motion sparingly—every animation should serve a purpose.

Why Motion Tokens Matter

Without standardized motion, teams create inconsistent animations:

ProblemImpact
Different durationsFeels disjointed
Mismatched easingBreaks visual rhythm
Random timingsDistracts users
Excessive motionCauses fatigue, accessibility issues

Motion tokens solve this by providing a shared vocabulary and consistent behavior.

The Four Animation Components

Every animation has these parts:

1. Trigger

What causes the animation to start:

  • User interaction (hover, click, focus)
  • State change (loading complete, error)
  • Page transition (navigation, modal open)
  • Time-based (after delay, on interval)

2. Duration

How long the animation takes:

TokenValueUse Case
duration-instant0msNo transition
duration-quick100msMicro-interactions (button states)
duration-moderate200msStandard transitions
duration-expressive300-400msSignificant changes
duration-slow500ms+Large transformations

3. Easing

How the animation accelerates and decelerates:

/* Standard easing curves */
--ease-standard: cubic-bezier(0.4, 0, 0.2, 1);   /* Both directions */
--ease-entrance: cubic-bezier(0.0, 0, 0.2, 1);   /* Elements entering */
--ease-exit: cubic-bezier(0.4, 0, 1, 1);         /* Elements leaving */
--ease-emphasis: cubic-bezier(0.4, 0, 0.6, 1);   /* Attention-grabbing */

4. Property

What characteristic changes:

  • Transform (position, scale, rotation)
  • Opacity
  • Color
  • Size (width, height)
  • Layout (margin, padding)

Motion Styles

Productive Motion

Subtle, efficient motion for task-focused moments:

Use CaseCharacteristics
Button statesQuick, understated
Form feedbackImmediate, clear
Dropdown menusSmooth, unobtrusive
Loading statesSubtle pulse/spin
Data table interactionsMinimal animation
.button {
  transition: 
    background-color var(--duration-quick) var(--ease-standard),
    transform var(--duration-quick) var(--ease-standard);
}

.button:hover {
  background-color: var(--color-primary-hover);
}

.button:active {
  transform: scale(0.98);
}

Expressive Motion

Vibrant, visible motion for significant moments:

Use CaseCharacteristics
Page transitionsSmooth, noticeable
Modal openingsClear entrance
Success celebrationsJoyful, memorable
OnboardingEngaging, helpful
Error statesAttention-grabbing
.modal {
  animation: modal-enter var(--duration-expressive) var(--ease-entrance);
}

@keyframes modal-enter {
  from {
    opacity: 0;
    transform: scale(0.95) translateY(10px);
  }
  to {
    opacity: 1;
    transform: scale(1) translateY(0);
  }
}

Rule: Use expressive motion sparingly. Overuse diminishes impact and fatigues users.

Token Structure

Intent-Based Naming

Name tokens by purpose, not value:

/* ❌ Value-based (what it is) */
--duration-100: 100ms;
--duration-200: 200ms;
--duration-300: 300ms;

/* ✅ Intent-based (what it's for) */
--duration-instant: 0ms;
--duration-quick: 100ms;
--duration-moderate: 200ms;
--duration-expressive: 350ms;

Intent-based naming communicates when to use each token.

Complete Token Set

:root {
  /* Durations */
  --duration-instant: 0ms;
  --duration-quick: 100ms;
  --duration-moderate: 200ms;
  --duration-standard: 250ms;
  --duration-expressive: 350ms;
  --duration-slow: 500ms;
  
  /* Easing curves */
  --ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
  --ease-entrance: cubic-bezier(0.0, 0, 0.2, 1);
  --ease-exit: cubic-bezier(0.4, 0, 1, 1);
  --ease-emphasis: cubic-bezier(0.4, 0, 0.6, 1);
  --ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
  
  /* Composite tokens */
  --transition-quick: var(--duration-quick) var(--ease-standard);
  --transition-moderate: var(--duration-moderate) var(--ease-standard);
  --transition-expressive: var(--duration-expressive) var(--ease-emphasis);
  
  /* Animation distances */
  --distance-small: 4px;
  --distance-medium: 8px;
  --distance-large: 16px;
}

Common Animation Patterns

Hover State

.card {
  transition: 
    transform var(--transition-quick),
    box-shadow var(--transition-quick);
}

.card:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-elevated);
}

Fade In/Out

.fade-enter {
  opacity: 0;
}

.fade-enter-active {
  opacity: 1;
  transition: opacity var(--transition-moderate);
}

.fade-exit {
  opacity: 1;
}

.fade-exit-active {
  opacity: 0;
  transition: opacity var(--transition-moderate);
}

Slide In

.slide-enter {
  transform: translateY(var(--distance-large));
  opacity: 0;
}

.slide-enter-active {
  transform: translateY(0);
  opacity: 1;
  transition: 
    transform var(--transition-expressive),
    opacity var(--transition-expressive);
}

Scale Feedback

.button:active {
  transform: scale(0.97);
  transition: transform var(--duration-instant);
}

.button:not(:active) {
  transition: transform var(--transition-quick);
}

Collapse/Expand

.accordion-content {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows var(--transition-moderate);
}

.accordion-content.open {
  grid-template-rows: 1fr;
}

.accordion-content > div {
  overflow: hidden;
}

CSS vs. JavaScript

Use CSS For

  • Simple state transitions (hover, focus, active)
  • Single-property animations
  • Performance-critical animations (transform, opacity)
  • Keyframe animations with known sequences
/* CSS handles this well */
.element {
  transition: transform 200ms ease-out;
}

.element:hover {
  transform: scale(1.05);
}

Use JavaScript For

  • Physics-based animations (spring, momentum)
  • Complex choreography (multiple elements)
  • Gesture-driven animations (drag, swipe)
  • Animations that need JavaScript state
  • Interrupt-able animations
// Framer Motion for complex cases
import { motion } from 'framer-motion';

function Card({ isOpen }: { isOpen: boolean }) {
  return (
    <motion.div
      animate={{
        height: isOpen ? 'auto' : 0,
        opacity: isOpen ? 1 : 0,
      }}
      transition={{
        type: 'spring',
        stiffness: 300,
        damping: 30,
      }}
    />
  );
}

Accessibility Considerations

Respect User Preferences

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

Best Practices

DoDon’t
Provide reduced-motion alternativesForce animations on all users
Keep motion subtle and purposefulUse excessive or distracting motion
Use motion to enhance understandingUse motion purely for decoration
Test with motion sensitivity usersIgnore accessibility feedback

Testing

  • Enable “Reduce motion” in OS settings
  • Test with screen readers
  • Check animation doesn’t interfere with focus
  • Verify animations don’t cause seizures (no rapid flashing)

Documentation

Animation Documentation Template

## Hover Elevation

**Purpose:** Indicate interactive elements when hovered

**Trigger:** Mouse hover on card components

**Properties:**
- Transform: translateY(-2px)
- Box-shadow: elevated shadow

**Duration:** Quick (100ms)

**Easing:** Standard

**Usage:**
```css
.card {
  transition: 
    transform var(--transition-quick),
    box-shadow var(--transition-quick);
}

.card:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-elevated);
}

Accessibility: Reduced to no movement with prefers-reduced-motion


## Implementation Checklist

### Token Definition

- [ ] Define duration tokens (instant through slow)
- [ ] Define easing curves (standard, entrance, exit, emphasis)
- [ ] Create composite transition tokens
- [ ] Document usage guidelines

### Component Integration

- [ ] Apply tokens to button states
- [ ] Apply tokens to form elements
- [ ] Apply tokens to cards and lists
- [ ] Apply tokens to modals and overlays
- [ ] Apply tokens to navigation

### Accessibility

- [ ] Implement prefers-reduced-motion
- [ ] Test with motion sensitivity users
- [ ] Document accessibility considerations
- [ ] Review for excessive motion

### Documentation

- [ ] Document each animation pattern
- [ ] Provide code examples
- [ ] Include do/don't guidelines
- [ ] Create motion storybook/playground

## FAQ

### How do I choose the right duration?

Quick (100ms) for micro-interactions. Moderate (200ms) for state changes. Expressive (300-400ms) for significant transitions. Test and adjust based on feel.

### Should I use CSS or JavaScript animations?

CSS for simple, performance-critical animations. JavaScript for complex, physics-based, or gesture-driven animations. When in doubt, start with CSS.

### How do I handle reduced motion?

Respect `prefers-reduced-motion`. Either eliminate motion entirely or provide subtle, instant alternatives. Never ignore this preference.

### What's the difference between easing curves?

Standard: balanced, for persistent elements. Entrance: starts slow, for appearing elements. Exit: starts fast, for disappearing elements. Emphasis: dramatic, for attention-grabbing.

### How many tokens do I need?

Start minimal: 3-4 durations, 3-4 easing curves. Add more only when you have clear use cases. Too many tokens create confusion.

### How do I maintain consistency across teams?

Document thoroughly. Provide code snippets. Create linting rules. Review animations in design reviews. Use a shared motion library.

## Sources & Further Reading

- [Animation Design Tokens for Complex Design Systems](https://prototypr.io/post/animation-design-tokens) — Token patterns
- [Carbon Design System Motion](https://carbondesignsystem.com/elements/motion/overview/) — IBM's motion guidelines
- [Design Systems & Tokens Guide](https://design.dev/guides/design-systems/) — Token fundamentals
- [HackerNoon Animation Tokens](https://hackernoon.com/using-animationmotion-design-tokens-for-more-complex-and-sophisticated-design-zy3t33y5) — Implementation patterns
- [Hover Motion Tokens](https://design-system.hover.to/foundation/tokens/motion) — Example token set
- [Microinteractions](/blog/microinteractions-2026) — Related: animation timing
- [Design System Zero to One](/blog/zero-to-one-design-system-2026) — Related: building systems

Interested in our research?

We share our work openly. If you'd like to collaborate or discuss ideas — we'd love to hear from you.

Get in Touch

Let's build
something real.

No more slide decks. No more "maybe next quarter".
Let's ship your MVP in weeks.

Start Building Now