Status: Canonical (v1.0)
Last updated: December 21, 2025
Audience: Design Systems, Product Design, Front-End Engineering
Applies to: UI animation timing (durations and easing curves)
Companion specs:
cem-colors) — color transition timingcem-dimension) — spacing animation timingcem-coupling) — density transition timingcem-shape) — bend/morph animation timingcem-layering) — lift/drop transitions, reduced-motion behaviorcem-stroke) — focus/selection transition timingThis spec defines the CEM contract surface for motion timing:
Related dimensions:
CEM duration names reflect how users perceive timing:
Easing names reflect intent:
| Token | Value | Description | tier |
|---|---|---|---|
--cem-duration-instant |
50ms |
Blink; do not interrupt flow | required |
--cem-duration-noticeable |
250ms |
Registerable but not slow | required |
--cem-duration-lingering |
300ms |
Large change; allow user to track | required |
--cem-duration-action |
var(--cem-duration-noticeable) |
Default for interactive state changes | recommended |
--cem-duration-overlay |
var(--cem-duration-lingering) |
Default for overlay entry/exit | recommended |
Normative rules:
instant < noticeable < lingering.0ms), but MUST preserve relative ordering.Easing tokens are expressed as CSS timing functions. R-D7-1 resolved: highlighted curves now use
Material 3 “Emphasized” cubic-beziers — visibly more deliberate than smooth. Adapters SHOULD replace these with
platform-appropriate emphasized curves.
| Token | Value | Description | tier |
|---|---|---|---|
--cem-easing-smooth |
ease-in-out |
Default; everyday unobtrusive motion | required |
--cem-easing-start-smooth |
ease-in |
Entrance motion | required |
--cem-easing-end-smooth |
ease-out |
Dismissal motion | required |
--cem-easing-highlighted |
cubic-bezier(0.2, 0, 0, 1) |
Attention-drawing motion (M3 Emphasized) | required |
--cem-easing-highlighted-start |
cubic-bezier(0.3, 0, 0.8, 0.15) |
Highlighted entrance (M3 Emphasized Accelerate) | required |
--cem-easing-highlighted-end |
cubic-bezier(0.05, 0.7, 0.1, 1) |
Highlighted dismissal (M3 Emphasized Decelerate) | required |
--cem-easing-uniform |
linear |
Neutral/mechanical (e.g. indeterminate progress) | required |
--cem-easing-classic |
ease |
Legacy compatibility | required |
Normative rules:
smooth MUST be suitable as the default.highlighted* MUST be visibly more pronounced than the corresponding smooth* curves in the same implementation.
The defaults use M3 Emphasized curves; adapters SHOULD provide platform-appropriate equivalents.R-D7-2 is resolved by not defining or reserving canonical --cem-spring-* custom properties in v1.
Reason:
stiffness, damping, and mass.Adapter guidance:
instant | noticeable | lingering) and easing intent
(smooth | highlighted) in their documentation.Normative rules (if springs are implemented):
instant | noticeable | lingering MUST preserve perceived ordering from fastest to slowest.delight MAY overshoot/bounce; functional SHOULD minimize overshoot.When prefers-reduced-motion: reduce is active, duration tokens are overridden to dramatically shorter values
while preserving their relative ordering (instant < noticeable < lingering). Alias tokens (--cem-duration-action,
--cem-duration-overlay) inherit automatically via var() and need no explicit override. Easing tokens are unaffected.
| Token | reduced-motion value | Description |
|---|---|---|
--cem-duration-instant |
0ms |
Off entirely — motion is imperceptible |
--cem-duration-noticeable |
50ms |
Dramatically shortened; signals “something happened” |
--cem-duration-lingering |
100ms |
Dramatically shortened; ordering preserved |
Easing selection:
Treat D7 tokens as contract-level once canonical.
Breaking (MAJOR):
instant < noticeable < lingering)Non-breaking (MINOR/PATCH):
Token tier is encoded in the tier column of each source table. The manifest validator derives expected token names
from these tables using the same XPath pattern as cem-timing.html.
| Source table h6 id | Tokens covered | Validator derivation |
|---|---|---|
cem-timing-durations |
--cem-duration-* (5 tokens: 3 required + 2 recommended aliases) |
one token per row |
cem-timing-easings |
--cem-easing-* (8 tokens: all required) |
one token per row |
Reduced-motion overrides (cem-timing-reduced-motion) produce no new token names — they override core duration
tokens within @media (prefers-reduced-motion: reduce). Spring tokens (--cem-spring-*) are intentionally absent
from the v1 manifest and default CSS output; spring motion is adapter-local until CEM defines a portable concrete
encoding.