Status: Canonical (v1.0)
Last updated: August 10, 2026
Audience: Design Systems, Product Design, Front-End Engineering
Applies to: UI animation timing (durations and easing curves)
Companion specs:
cem-colors.md) — color transition timingcem-dimension.md) — spacing animation timingcem-coupling.md) — density transition timingcem-shape.md) — bend/morph animation timingcem-layering.md) — lift/drop transitions, reduced-motion behaviorcem-stroke.md) — 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 |
--cem-duration-pending-cycle | 2000ms | One seamless cycle of the pending background gradient; repetition stops under reduced motion | recommended |
--cem-duration-continuous-cycle | 1000ms | One neutral cycle of repeated status motion, such as indeterminate progress | recommended |
Normative rules:
instant < noticeable < lingering.0ms), but MUST preserve relative ordering.pending-cycle is a dedicated two-second continuous status cycle, with uniform easing.
Hover and focus must not restart it; clearing busy stops it. Reduced motion
stops repetition and preserves the static gradient.continuous-cycle is outside the one-shot ordering scale. A component that repeats it automatically MUST stop the
repetition under prefers-reduced-motion: reduce rather than shortening the cycle.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.
--cem-duration-continuous-cycle is intentionally not shortened: consumers must remove automatic repetition and
retain a static status graphic under reduced motion.
| 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-* (6 tokens: 3 required + 3 recommended semantic endpoints) | 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.