1 · Hover lift
Button rises 2px on hover. Affordance hint — element is interactive.
transform · 120ms · ease-out trigger: :hoverCowork UI Kit's motion vocabulary — durations, easings, choreography. All tokens respect prefers-reduced-motion per WCAG 2.2.
| Token | Value | Use |
|---|---|---|
--duration-instant | 0ms | Snap (a11y fallback) |
--duration-fast | 120ms | Hover, tap, exit |
--duration-normal | 200ms | Default · color, tooltip |
--duration-slow | 320ms | Modal, drawer enter |
--duration-slower | 480ms | Page surface change |
--duration-deliberate | 800ms | Hero, full route |
| Token | Curve | Use |
|---|---|---|
--ease-out | 0.16, 1, 0.3, 1 | Most exits, modal in |
--ease-in | 0.7, 0, 0.84, 0 | Most entries, modal out |
--ease-in-out | 0.65, 0, 0.35, 1 | Accordion, tab |
--ease-snap | 0.4, 0, 0.2, 1 | Utility default (M3 std) |
--ease-spring | 0.34, 1.56, 0.64, 1 | Confirm, success |
--ease-emphasized | 0.2, 0, 0, 1 | Hero, page transition |
--ease-linear | linear | Spinner, progress |
Button rises 2px on hover. Affordance hint — element is interactive.
transform · 120ms · ease-out trigger: :hoverButton compresses on press. Tactile feedback for fingers/cursor.
transform · 120ms · ease-snap trigger: :activeBackdrop fades + dialog scales 0.92 → 1. Slow + emphasized for focal moment.
opacity + scale · 320ms · ease-emphasizedSnackbar enters from bottom with fade. Non-blocking confirmation.
opacity + slide 16px · 200ms · ease-outGradient slides across placeholder. Loading state — essential, exempt from reduce.
background-position · 1.4s · linear · loopgrid-template-rows trick animates height without JS measurement. Symmetric ease.
grid-template-rows · 200ms · ease-in-outSide panel enters from right edge. M3 emphasized curve for focal surface change.
translateX · 320ms · ease-emphasizedUnderline slides under active tab. Spatial continuity — tab is one shared element.
transform + width · 200ms · ease-outRing fades in instead of jumping. Visible focus is mandatory (WCAG 2.4.7).
outline · 120ms · ease-out trigger: :focusIndeterminate loading. Linear so it doesn't seem to speed up/slow down.
rotate · 0.8s · linear · loopBar fills with ease-in-out so deceleration suggests target. Indeterminate variant loops.
width · 2.4s · ease-in-out · loopList items appear sequentially. 50ms delay between each item — perceived as orchestrated.
opacity + slide · 200ms · ease-out · 50ms staggerSuccess checkmark overshoots then settles. Delight for completed action.
scale 0→1 · 320ms · ease-springOutgoing page slides up + fades, incoming slides up into place. Deliberate hero motion.
opacity + slide 32px · 800ms · ease-emphasizedCard scales 1.03 + tonal shadow. Brand-tinted shadow signals depth, not just elevation.
transform + shadow · 200ms · ease-out