Motion System
Human’s motion system applies Pixar’s 12 principles of animation to UI interactions. Every animation has purpose — it guides attention, confirms actions, and creates spatial coherence.
Core Durations
Section titled “Core Durations”| Token | Value | CSS Variable | Usage |
|---|---|---|---|
duration.instant | 100ms | --hu-duration-instant | Hovers, state toggles |
duration.fast | 150ms | --hu-duration-fast | Button presses, small reveals |
duration.normal | 250ms | --hu-duration-normal | Panel transitions, fades |
duration.slow | 400ms | --hu-duration-slow | Modal entrances, page transitions |
duration.slower | 600ms | --hu-duration-slower | Complex orchestrated sequences |
Easing Curves
Section titled “Easing Curves”| Token | Value | CSS Variable | Character |
|---|---|---|---|
ease.default | cubic-bezier(0.4, 0, 0.2, 1) | --hu-ease-default | Natural deceleration |
ease.in | cubic-bezier(0.4, 0, 1, 1) | --hu-ease-in | Accelerating exit |
ease.out | cubic-bezier(0, 0, 0.2, 1) | --hu-ease-out | Decelerating entrance |
ease.in-out | cubic-bezier(0.4, 0, 0.2, 1) | --hu-ease-in-out | Symmetric motion |
ease.spring | cubic-bezier(0.175, 0.885, 0.32, 1.275) | --hu-ease-spring | Bouncy overshoot |
ease.bounce | cubic-bezier(0.34, 1.56, 0.64, 1) | --hu-ease-bounce | Playful bounce |
Micro-Physics Presets (Pixar Principles)
Section titled “Micro-Physics Presets (Pixar Principles)”These presets encode Pixar animation principles as token-driven CSS keyframes.
Button Press — Squash & Stretch
Section titled “Button Press — Squash & Stretch”When pressed, buttons compress slightly (squash), then spring back with overshoot (stretch).
| Token | Value | Principle |
|---|---|---|
micro-physics.button-press.scale | 0.96 | Squash on press |
micro-physics.button-press.duration | 80ms | Fast physical response |
micro-physics.button-release.scale | 1.02 | Stretch on release |
micro-physics.button-release.duration | 200ms | Slower recovery |
.btn:active { transform: scale(var(--hu-physics-button-press-scale)); transition: transform var(--hu-physics-button-press-duration) var(--hu-ease-spring);}Modal Anticipation
Section titled “Modal Anticipation”Before appearing, modals briefly scale down (anticipation), then spring to full size.
| Token | Value | Principle |
|---|---|---|
micro-physics.modal-anticipation.scale | 0.95 | Preparatory pullback |
micro-physics.modal-anticipation.duration | 120ms | Brief setup |
Card Hover — Follow Through
Section titled “Card Hover — Follow Through”Cards lift slightly with a springy overshoot on hover, settling to final position.
| Token | Value | Principle |
|---|---|---|
micro-physics.card-hover.translate-y | -2px | Subtle lift |
micro-physics.card-hover.duration | 300ms | Gentle float |
Dropdown Anticipation
Section titled “Dropdown Anticipation”Dropdowns compress before expanding, giving a sense of stored energy.
| Token | Value | Principle |
|---|---|---|
micro-physics.dropdown-anticipation.scale-y | 0.95 | Vertical compression |
micro-physics.dropdown-anticipation.duration | 100ms | Quick wind-up |
Toggle Squash
Section titled “Toggle Squash”Toggle switches squash horizontally during state change.
| Token | Value | Principle |
|---|---|---|
micro-physics.toggle-squash.scale-x | 0.9 | Horizontal squash |
micro-physics.toggle-squash.duration | 150ms | Snappy |
Utility Classes
Section titled “Utility Classes”.hu-physics-press:active
Section titled “.hu-physics-press:active”Applies button press squash/stretch on any interactive element:
<button class="hu-physics-press">Click me</button>.hu-physics-hover
Section titled “.hu-physics-hover”Applies card hover lift with follow-through:
<div class="hu-physics-hover">Hoverable card</div>.hu-anticipate-enter
Section titled “.hu-anticipate-enter”Applies anticipation entrance animation on mount:
<dialog class="hu-anticipate-enter">Modal content</dialog>Reduced Motion
Section titled “Reduced Motion”All animations respect prefers-reduced-motion: reduce. When active:
- Durations are set to
0ms - Transforms are removed
- Only opacity transitions remain (they don’t cause motion sickness)
@media (prefers-reduced-motion: reduce) { .hu-physics-press:active, .hu-physics-hover:hover { transform: none !important; transition: none !important; }}When to Animate
Section titled “When to Animate”| Scenario | Duration | Easing | Principle |
|---|---|---|---|
| Button feedback | instant | spring | Squash & stretch |
| Card hover | normal | spring | Follow-through |
| Modal entrance | slow | bounce | Anticipation |
| Page transition | slow | ease-out | Staging |
| Toast appearance | fast | ease-out | Timing |
| Loading spinner | slower | linear | Secondary action |
When NOT to Animate
Section titled “When NOT to Animate”- Scrolling content into view (use CSS
scroll-behavior: smoothinstead) - Color theme transitions (instant swap, no fade)
- Error state changes (immediate, no delay)
- Content that hasn’t changed (don’t re-animate)