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.
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:
| Problem | Impact |
|---|---|
| Different durations | Feels disjointed |
| Mismatched easing | Breaks visual rhythm |
| Random timings | Distracts users |
| Excessive motion | Causes 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:
| Token | Value | Use Case |
|---|---|---|
duration-instant | 0ms | No transition |
duration-quick | 100ms | Micro-interactions (button states) |
duration-moderate | 200ms | Standard transitions |
duration-expressive | 300-400ms | Significant changes |
duration-slow | 500ms+ | 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 Case | Characteristics |
|---|---|
| Button states | Quick, understated |
| Form feedback | Immediate, clear |
| Dropdown menus | Smooth, unobtrusive |
| Loading states | Subtle pulse/spin |
| Data table interactions | Minimal 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 Case | Characteristics |
|---|---|
| Page transitions | Smooth, noticeable |
| Modal openings | Clear entrance |
| Success celebrations | Joyful, memorable |
| Onboarding | Engaging, helpful |
| Error states | Attention-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
| Do | Don’t |
|---|---|
| Provide reduced-motion alternatives | Force animations on all users |
| Keep motion subtle and purposeful | Use excessive or distracting motion |
| Use motion to enhance understanding | Use motion purely for decoration |
| Test with motion sensitivity users | Ignore 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