Also enforces the ban on the AI motion signature (opacity:0 + translateY(20px) + ease-in-out applied uniformly to every entrance).
Runs only after the static body/component exists (design-web, design-webapp, design-ios, design-android) — never used to hide or compensate for an unfinished layout.
Design Motion — Timing, Easing, Materials, Restraint
When
After the static body/component exists. Motion is applied on top of a settled layout —
never used to compensate for or distract from an unfinished one. Hands off to
design-review next (Part 1 checks the reduced-motion fallback + transform/opacity
discipline; Part 2's motion-verdict.md issues the Block/Approve).
Input
design-system.md motion personality / MOTION_INTENSITY dial (1-10).
- The static markup/components to animate.
The animation gate — before writing any motion code
Run every candidate through references/animation-decision-framework.md's 4 questions,
in order: (1) should this animate at all — frequency decides, never animate
keyboard-initiated or 100+/day actions; (2) what's the one-sentence purpose (spatial
consistency / state indication / explanation / feedback / preventing jarring change); (3)
what easing; (4) what duration. Most "let's animate this" ideas should die at question 1
— that is the point, not a formality to skip.
Materials — transform/opacity first, other properties gated
Default to transform and opacity — they skip layout and paint and run on the GPU.
Animating width/height/top/left/margin/padding triggers layout+paint+composite
and drops frames; see references/motion-performance.md for the Framer Motion shorthand
caveat (x/y/scale shorthands are NOT hardware-accelerated, use the full transform
string), the CSS-var recalc trap (never drive child transforms via a custom property on
the parent), CSS transitions vs. keyframes for interruptible UI, and velocity-based drag
dismissal (~0.11 threshold, not distance alone). Other atmospheric materials — blur,
backdrop-filter, clip-path, shadow bloom, masks — are allowed when they demonstrably read
as premium and stay smooth on the target viewports, verified in-browser, never a default
reach; keep expensive effects bounded to small/isolated areas. references/motion-physics.md
covers physical-correctness rules for whichever material is used: never scale(0),
origin-aware popovers, asymmetric enter/exit timing (exit ~75% of enter duration),
staggered lists (cap total stagger time), blur masking, @starting-style.
Durations — the 100/300/500 rule
| Tier |
Duration |
Use |
| Micro |
100-150ms |
button press, toggle, instant feedback |
| State |
200-300ms |
menu open, tooltip, hover states |
| Layout |
300-500ms |
accordion, modal, drawer |
| Entrance |
500-800ms |
page load, hero reveal |
Exit animations run at ~75% of the matching enter duration. Hard rule for anything that
isn't a marketing/explanatory sequence: UI feedback stays under 300ms — a 180ms
dropdown reads as more responsive than a 400ms one
(references/animation-decision-framework.md §4).
Easing — exponential/emphasized, no bounce
Entering/exiting → ease-out. Moving/morphing on-screen (A→B) or state toggles →
ease-in-out. Hover/color change → ease. Constant motion (marquee, progress) →
linear. Never ease-in on UI — it delays the exact moment the user is watching
most closely. Use the strong custom curves in references/motion-tokens.md
(--ease-out: cubic-bezier(0.23, 1, 0.32, 1), --ease-in-out, --ease-drawer) or the
exponential/quint-out family (cubic-bezier(0.16, 1, 0.3, 1) and similar) — never the
weak built-in CSS easings. Bounce and elastic curves are banned outright — they read
as a toy interaction, not a premium one. Hard mechanical gate, zero tolerance: any
cubic-bezier with a y-control-point > 1, or the literal elastic/bounce keywords,
fails design-review/references/pre-flight-checklist.md check 9. Springs (when used —
gesture-driven/interruptible motion only) keep bounce in 0.1-0.3, biased toward 0.1
for dashboards/product register and up to 0.3 for playful/brand register.
Reduced motion — mandatory, not optional
Every animated deliverable ships a prefers-reduced-motion: reduce fallback in the same
commit — never a follow-up pass. Full patterns: references/reduced-motion.md (global
override, Framer Motion's useReducedMotion()/MotionConfig, per-animation-type
disable-vs-simplify table, WCAG 2.2 SC 2.3.3/2.3.1/2.2.2). Disable spatial movement
entirely (parallax, auto-playing carousels, zoom/scale transitions — vestibular risk);
simplify functional feedback rather than remove it (progress bars and loading spinners
stay, slowed and non-spatial; page-slide transitions become an instant swap that keeps
navigation feedback). ~35% of adults over 40 are affected by vestibular disorders — this
is not an edge case. design-review Part 1 treats a missing reduced-motion fallback as a
Critical-severity finding (audit-checklist.md Motion row) that blocks the review.
Ban — the AI motion signature
The single most common AI-generated motion tell: opacity: 0 + translateY(20px) +
ease-in-out, applied uniformly to every entrance on the page with zero variation by
element role. (No figure is attached to this one: the "~83%" belongs to the
palette/font/radius triad and to it alone — see ../design-method/SKILL.md
§Absolute bans. Never borrow it for another ban or detector.) Vary
instead: stagger timing and entrance direction/distance by section role, easing chosen
per the Q3 decision table above, duration chosen per the tier table above — never one
blanket transition rule copy-pasted down every section. design-review catches leftovers
of this at pre-flight-checklist.md check 4 (motion-claimed-motion-shown: a declared
MOTION_INTENSITY > 4 must ship actual motion code) and check 10 (layout-property
animation, warning-tier), plus the co-occurrence detectors in anti-ai-slop-audit.md.
Steps
- Gate every candidate animation through
references/animation-decision-framework.md.
- Pick the duration tier (table above) and the easing token from
references/motion-tokens.md.
- Choose the material —
transform/opacity by default; consult
references/motion-physics.md for physical correctness and
references/motion-performance.md for the GPU/perf guardrails before reaching for
anything else.
- Apply the category pattern:
references/entrance-patterns.md (stagger/fade/slide/scale),
references/micro-interactions.md (buttons/toggles/copy actions/loading),
references/page-transitions.md (route changes/drill-down/modal),
references/patterns-buttons.md / references/patterns-cards.md /
references/patterns-navigation.md / references/patterns-microinteractions.md for
component-specific treatments, references/interactive-states-ref.md for
hover/active/focus/disabled/loading state choreography.
references/gsap-scroll-skeletons.md for pinned/scroll-driven sections (Sticky-Stack,
Horizontal-Pan) — carries the same motion-claimed/motion-shown honesty rule as the ban
above. references/glassmorphism-advanced-ref.md and
references/layered-backgrounds-ref.md are gated-use references (blur/layering
effects), never a default reach — see design-method's cluster 4 AI-slop warning
(glassmorphism + rounded-2xl applied everywhere instead of gated).
- Ship the reduced-motion fallback in the same pass — not a follow-up.
- Name every effect in the handoff/spec using
references/animation-glossary.md's
feel→term vocabulary ("the springy thing when a popover opens" → the exact word) —
precise handoff, not vibes.
Failure Handling
- An effect needs blur/filter/backdrop-filter and visibly drops frames on target
viewports → fall back to transform/opacity only, note the tradeoff in the handoff.
- A purely spatial effect (e.g. parallax) has no sane reduced form → disable entirely
under the media query rather than approximate a "lite" version.
Output
- Animated component/page reusing motion tokens (durations/easings) from
references/motion-tokens.md — never hand-rolled per instance.
prefers-reduced-motion fallback shipped in the same pass.
- Effects named per
references/animation-glossary.md for handoff to design-review or
another agent.
Next → design-review — Part 1 checks the reduced-motion fallback and the
transform/opacity discipline mechanically; Part 2's motion-verdict.md issues the
Block/Approve on feel, physicality, and accessibility.
References
| File |
Purpose |
references/animation-decision-framework.md |
The 4-question gate — run first, every time |
references/motion-performance.md |
GPU/perf guardrails, Framer Motion caveat, drag velocity |
references/motion-tokens.md |
Named easing curves + spring configs (the token layer) |
references/motion-physics.md |
Physical-correctness rules (never scale(0), origin, stagger, @starting-style) |
references/reduced-motion.md |
Mandatory — media query, Framer Motion hooks, WCAG 2.2, disable-vs-simplify table |
references/animation-glossary.md |
Feel → term vocabulary for specs/handoff |
references/entrance-patterns.md |
Stagger/fade/slide/scale entrance patterns |
references/micro-interactions.md |
Button/toggle/copy-action/loading micro-animations |
references/page-transitions.md |
Route changes, drill-down, modal transitions |
references/patterns-buttons.md |
Button component motion patterns |
references/patterns-cards.md |
Card motion/hover patterns |
references/patterns-navigation.md |
Navigation/responsive-navbar motion |
references/patterns-microinteractions.md |
Broader micro-interaction/transition patterns |
references/interactive-states-ref.md |
Hover/active/focus/disabled/loading state choreography |
references/motion-principles.md |
Motion hierarchy, duration scale, easing — general principles |
references/motion-patterns.md |
Framer Motion pattern library, timing guidelines |
references/gsap-scroll-skeletons.md |
Scroll-driven/pinned skeletons + motion-claimed/motion-shown rule |
references/glassmorphism-advanced-ref.md |
Gated-use glass effects (blur/layering) — never default |
references/layered-backgrounds-ref.md |
Gated-use gradient orbs/blur layers/noise textures |
1---2name: design-motion3description: Use when adding or reviewing motion on an already-settled layout or component — never to hide or compensate for an unfinished one.4---56<objective>7A motion pass applied on top of an already-settled layout: the animation-decision gate (should this even animate, what's its purpose, what easing, what duration), transform/opacity-first materials, the 100/300/500ms duration scale, exponential/emphasized easing curves (bounce and elastic are banned outright), and the mandatory `prefers-reduced-motion` fallback shipped in the same pass.89Also enforces the ban on the AI motion signature (`opacity:0 + translateY(20px) + ease-in-out` applied uniformly to every entrance).1011Runs only after the static body/component exists (`design-web`, `design-webapp`, `design-ios`, `design-android`) — never used to hide or compensate for an unfinished layout.12</objective>1314## Design Motion — Timing, Easing, Materials, Restraint1516### When17After the static body/component exists. Motion is applied on top of a settled layout —18never used to compensate for or distract from an unfinished one. Hands off to19`design-review` next (Part 1 checks the reduced-motion fallback + transform/opacity20discipline; Part 2's `motion-verdict.md` issues the Block/Approve).2122### Input23- `design-system.md` motion personality / `MOTION_INTENSITY` dial (1-10).24- The static markup/components to animate.2526### The animation gate — before writing any motion code27Run every candidate through `references/animation-decision-framework.md`'s 4 questions,28in order: (1) should this animate at all — frequency decides, never animate29keyboard-initiated or 100+/day actions; (2) what's the one-sentence purpose (spatial30consistency / state indication / explanation / feedback / preventing jarring change); (3)31what easing; (4) what duration. Most "let's animate this" ideas should die at question 132— that is the point, not a formality to skip.3334### Materials — transform/opacity first, other properties gated35Default to `transform` and `opacity` — they skip layout and paint and run on the GPU.36Animating `width`/`height`/`top`/`left`/`margin`/`padding` triggers layout+paint+composite37and drops frames; see `references/motion-performance.md` for the Framer Motion shorthand38caveat (`x`/`y`/`scale` shorthands are NOT hardware-accelerated, use the full `transform`39string), the CSS-var recalc trap (never drive child transforms via a custom property on40the parent), CSS transitions vs. keyframes for interruptible UI, and velocity-based drag41dismissal (~0.11 threshold, not distance alone). Other atmospheric materials — blur,42backdrop-filter, clip-path, shadow bloom, masks — are allowed when they demonstrably read43as premium and stay smooth on the target viewports, verified in-browser, never a default44reach; keep expensive effects bounded to small/isolated areas. `references/motion-physics.md`45covers physical-correctness rules for whichever material is used: never `scale(0)`,46origin-aware popovers, asymmetric enter/exit timing (exit ~75% of enter duration),47staggered lists (cap total stagger time), blur masking, `@starting-style`.4849### Durations — the 100/300/500 rule5051| Tier | Duration | Use |52|---|---|---|53| Micro | 100-150ms | button press, toggle, instant feedback |54| State | 200-300ms | menu open, tooltip, hover states |55| Layout | 300-500ms | accordion, modal, drawer |56| Entrance | 500-800ms | page load, hero reveal |5758Exit animations run at ~75% of the matching enter duration. Hard rule for anything that59isn't a marketing/explanatory sequence: **UI feedback stays under 300ms** — a 180ms60dropdown reads as more responsive than a 400ms one61(`references/animation-decision-framework.md` §4).6263### Easing — exponential/emphasized, no bounce64Entering/exiting → `ease-out`. Moving/morphing on-screen (A→B) or state toggles →65`ease-in-out`. Hover/color change → `ease`. Constant motion (marquee, progress) →66`linear`. **Never `ease-in` on UI** — it delays the exact moment the user is watching67most closely. Use the strong custom curves in `references/motion-tokens.md`68(`--ease-out: cubic-bezier(0.23, 1, 0.32, 1)`, `--ease-in-out`, `--ease-drawer`) or the69exponential/quint-out family (`cubic-bezier(0.16, 1, 0.3, 1)` and similar) — never the70weak built-in CSS easings. **Bounce and elastic curves are banned outright** — they read71as a toy interaction, not a premium one. Hard mechanical gate, zero tolerance: any72`cubic-bezier` with a y-control-point > 1, or the literal `elastic`/`bounce` keywords,73fails `design-review/references/pre-flight-checklist.md` check 9. Springs (when used —74gesture-driven/interruptible motion only) keep `bounce` in **0.1-0.3**, biased toward 0.175for dashboards/product register and up to 0.3 for playful/brand register.7677### Reduced motion — mandatory, not optional78Every animated deliverable ships a `prefers-reduced-motion: reduce` fallback in the same79commit — never a follow-up pass. Full patterns: `references/reduced-motion.md` (global80override, Framer Motion's `useReducedMotion()`/`MotionConfig`, per-animation-type81disable-vs-simplify table, WCAG 2.2 SC 2.3.3/2.3.1/2.2.2). Disable spatial movement82entirely (parallax, auto-playing carousels, zoom/scale transitions — vestibular risk);83simplify functional feedback rather than remove it (progress bars and loading spinners84stay, slowed and non-spatial; page-slide transitions become an instant swap that keeps85navigation feedback). ~35% of adults over 40 are affected by vestibular disorders — this86is not an edge case. `design-review` Part 1 treats a missing reduced-motion fallback as a87**Critical**-severity finding (`audit-checklist.md` Motion row) that blocks the review.8889### Ban — the AI motion signature90The single most common AI-generated motion tell: `opacity: 0` + `translateY(20px)` +91`ease-in-out`, applied uniformly to every entrance on the page with zero variation by92element role. (No figure is attached to this one: the "~83%" belongs to the93palette/font/radius triad and to it alone — see `../design-method/SKILL.md`94§Absolute bans. Never borrow it for another ban or detector.) Vary95instead: stagger timing and entrance direction/distance by section role, easing chosen96per the Q3 decision table above, duration chosen per the tier table above — never one97blanket transition rule copy-pasted down every section. `design-review` catches leftovers98of this at `pre-flight-checklist.md` check 4 (motion-claimed-motion-shown: a declared99`MOTION_INTENSITY > 4` must ship actual motion code) and check 10 (layout-property100animation, warning-tier), plus the co-occurrence detectors in `anti-ai-slop-audit.md`.101102### Steps1031. Gate every candidate animation through `references/animation-decision-framework.md`.1042. Pick the duration tier (table above) and the easing token from `references/motion-tokens.md`.1053. Choose the material — `transform`/`opacity` by default; consult106 `references/motion-physics.md` for physical correctness and107 `references/motion-performance.md` for the GPU/perf guardrails before reaching for108 anything else.1094. Apply the category pattern: `references/entrance-patterns.md` (stagger/fade/slide/scale),110 `references/micro-interactions.md` (buttons/toggles/copy actions/loading),111 `references/page-transitions.md` (route changes/drill-down/modal),112 `references/patterns-buttons.md` / `references/patterns-cards.md` /113 `references/patterns-navigation.md` / `references/patterns-microinteractions.md` for114 component-specific treatments, `references/interactive-states-ref.md` for115 hover/active/focus/disabled/loading state choreography.116 `references/gsap-scroll-skeletons.md` for pinned/scroll-driven sections (Sticky-Stack,117 Horizontal-Pan) — carries the same motion-claimed/motion-shown honesty rule as the ban118 above. `references/glassmorphism-advanced-ref.md` and119 `references/layered-backgrounds-ref.md` are gated-use references (blur/layering120 effects), never a default reach — see design-method's cluster 4 AI-slop warning121 (glassmorphism + `rounded-2xl` applied everywhere instead of gated).1225. Ship the reduced-motion fallback in the same pass — not a follow-up.1236. Name every effect in the handoff/spec using `references/animation-glossary.md`'s124 feel→term vocabulary ("the springy thing when a popover opens" → the exact word) —125 precise handoff, not vibes.126127### Failure Handling128- An effect needs blur/filter/backdrop-filter and visibly drops frames on target129 viewports → fall back to transform/opacity only, note the tradeoff in the handoff.130- A purely spatial effect (e.g. parallax) has no sane reduced form → disable entirely131 under the media query rather than approximate a "lite" version.132133### Output134- Animated component/page reusing motion tokens (durations/easings) from135 `references/motion-tokens.md` — never hand-rolled per instance.136- `prefers-reduced-motion` fallback shipped in the same pass.137- Effects named per `references/animation-glossary.md` for handoff to `design-review` or138 another agent.139140### Next → `design-review` — Part 1 checks the reduced-motion fallback and the141transform/opacity discipline mechanically; Part 2's `motion-verdict.md` issues the142Block/Approve on feel, physicality, and accessibility.143144### References145| File | Purpose |146|------|---------|147| `references/animation-decision-framework.md` | **The 4-question gate — run first, every time** |148| `references/motion-performance.md` | GPU/perf guardrails, Framer Motion caveat, drag velocity |149| `references/motion-tokens.md` | Named easing curves + spring configs (the token layer) |150| `references/motion-physics.md` | Physical-correctness rules (never `scale(0)`, origin, stagger, `@starting-style`) |151| `references/reduced-motion.md` | **Mandatory** — media query, Framer Motion hooks, WCAG 2.2, disable-vs-simplify table |152| `references/animation-glossary.md` | Feel → term vocabulary for specs/handoff |153| `references/entrance-patterns.md` | Stagger/fade/slide/scale entrance patterns |154| `references/micro-interactions.md` | Button/toggle/copy-action/loading micro-animations |155| `references/page-transitions.md` | Route changes, drill-down, modal transitions |156| `references/patterns-buttons.md` | Button component motion patterns |157| `references/patterns-cards.md` | Card motion/hover patterns |158| `references/patterns-navigation.md` | Navigation/responsive-navbar motion |159| `references/patterns-microinteractions.md` | Broader micro-interaction/transition patterns |160| `references/interactive-states-ref.md` | Hover/active/focus/disabled/loading state choreography |161| `references/motion-principles.md` | Motion hierarchy, duration scale, easing — general principles |162| `references/motion-patterns.md` | Framer Motion pattern library, timing guidelines |163| `references/gsap-scroll-skeletons.md` | Scroll-driven/pinned skeletons + motion-claimed/motion-shown rule |164| `references/glassmorphism-advanced-ref.md` | Gated-use glass effects (blur/layering) — never default |165| `references/layered-backgrounds-ref.md` | Gated-use gradient orbs/blur layers/noise textures |