Conductor Motion
Generate the mid-layer animation patterns that make product marketing sites feel alive — typewriter simulations, progress bar choreography, staggered content reveals, Lottie sequencing, and scroll-driven animation compositions. These patterns simulate live software through animation alone.
Deconstructed from ConductorAI.com (Webflow, GSAP 3.15, Lottie, vanilla JS).
Quick Start
# Typewriter hero with word cycling
python3 scripts/conductor_motion_generator.py --mode typewriter \
--base-text "Accelerating" \
--words "complex approvals,investigations,e-discovery,FOIA review" \
--output typewriter.html
# Progress bar simulation
python3 scripts/conductor_motion_generator.py --mode progress \
--title "search initialization" --doc-count 1324 \
--rows "QUERY_RECEIVED,INPUT,ELECTRONIC SIGNATURE,JURISDICTION" \
--output progress.html
# File review state machine
python3 scripts/conductor_motion_generator.py --mode file-review \
--files "Report_Q4.xlsx,Contract_Draft.pdf,Audit_Log.csv" \
--output file-review.html
# Full landing page with all patterns
python3 scripts/conductor_motion_generator.py --mode full-page \
--output landing.html
# Effects catalog (all modes demonstrated)
python3 scripts/conductor_motion_generator.py --mode catalog --output catalog.html
Or let Claude generate directly from the templates and references.
Motion Interview
When invoked without --mode, the skill runs a brief motion interview:
- Content type — What are you animating? (hero section, product demo, status dashboard, landing page)
- Pacing — What tempo? (slow/deliberate, medium/professional, fast/urgent)
- Patterns — Which effects? (typewriter, progress, file-review, stagger, terminal, lottie, or all)
- Color scheme — Dark or light background?
- Design tokens — Use existing
DESIGN.md / .design-context.md, or defaults?
Output: .motion-context.md consumed by generation phase.
If .design-context.md exists with MOTION_INTENSITY dial set, skip the pacing question and derive from that value:
- MOTION_INTENSITY 1-3 → slow
- MOTION_INTENSITY 4-6 → medium
- MOTION_INTENSITY 7-10 → fast
Modes
| Mode |
Template |
Patterns Composed |
typewriter |
assets/templates/typewriter.html |
Hero rotator + type-on + blinking cursor |
progress |
assets/templates/progress.html |
Progress bar + counter + dot-leaders + processing dots + staggered rows |
file-review |
assets/templates/file-review.html |
File list + state machine (unreviewed→processing→reviewed) + status indicators |
stagger-reveal |
assets/templates/stagger-reveal.html |
Hero cascade + section reveals + IntersectionObserver scroll triggers |
terminal |
assets/templates/terminal.html |
Timestamps + status typing + search result counters + progress sync |
lottie-compose |
assets/templates/lottie-compose.html |
Lottie player + responsive variants + scroll-synced playback |
full-page |
assets/templates/full-page.html |
All patterns composed into a coherent landing section |
catalog |
assets/templates/catalog.html |
Visual reference with live demos of each pattern |
Color System
All effects read from --cm-* CSS custom properties. Override at :root to re-theme. Default: dark scheme with #4F7BF7 brand accent. Light scheme swaps bg/text polarity.
Full token reference (dark, light, easing, timing): references/design-tokens.md
Composition Parameters
| Parameter |
Range |
Default |
Effect |
--pacing |
slow | medium | fast |
medium |
Speed multiplier: slow=1.5x duration, fast=0.6x |
--stagger |
100–400 |
200 |
Milliseconds between sequential reveals |
--typing-speed |
20–80 |
45 |
Base ms per character typed |
--typing-variance |
0–40 |
18 |
Random variance added to typing speed |
--easing |
cubic | quart | linear |
cubic |
Primary easing: easeOutCubic, easeOutQuart, or linear |
--progress-duration |
2000–10000 |
6000 |
Total progress animation ms |
--hold-duration |
500–3000 |
1100 |
Ms to hold typed word before deleting |
--color-scheme |
dark | light |
dark |
Background/foreground polarity |
--font |
font name |
Geist |
Primary font (loaded via Google Fonts CDN) |
--accent |
hex color |
#4F7BF7 |
Override --cm-brand |
--lottie-cdn |
boolean |
false |
Include Lottie player CDN (lottie-compose mode only) |
Content Parameters (per mode)
typewriter: --base-text, --words (comma-separated), --cursor (char, default |), --loop (boolean)
progress: --title, --doc-count, --rows (comma-separated labels), --start-percent (default 5)
file-review: --files (comma-separated filenames with extensions), --review-speed (ms per file)
stagger-reveal: --items (comma-separated selectors or text blocks), --direction (up|down|left|right)
terminal: --status-items (comma-separated), --result-count, --result-label, --timestamps (boolean)
lottie-compose: --lottie-src (URL to .json), --lottie-loop, --lottie-autoplay, --responsive (boolean)
Architecture
┌──────────────────────┐
│ .design-context.md │ ← from /shape (optional)
│ DESIGN.md tokens │ ← from /design-md (optional)
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ Motion Interview │ ← asks pacing, patterns, content
│ (skip if --mode set) │
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ .motion-context.md │ ← pacing, patterns, content data
└──────────┬───────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────────┐
│ Template │ │ Token │ │ Content │
│ Selection │ │ Application│ │ Injection │
│ (mode→html) │ │ (--cm-*) │ │ (user data) │
└──────┬─────┘ └─────┬──────┘ └───────┬────────┘
│ │ │
└────────────────┼────────────────────┘
▼
┌──────────────────────┐
│ Single-file HTML │
│ (inline CSS + JS) │
│ CDN: fonts only │
│ (+ Lottie if needed)│
└──────────────────────┘
Animation Engine Internals
Easing functions, timing constants per mode, and pacing multiplier tables: references/design-tokens.md
Key: easeOutCubic (t => 1 - Math.pow(1-t, 3)) is the default. Pacing multiplier scales all durations — slow=1.5×, medium=1.0×, fast=0.6×. Stagger delays scale at 0.8× the multiplier.
Gotchas (What Claude Gets Wrong Without This Skill)
- Reaches for GSAP or Framer Motion. These patterns are vanilla JS — no framework needed. GSAP adds 30KB for effects achievable with
requestAnimationFrame and CSS transitions.
- Uses
transition: all for reveals. Triggers layout on every property. Explicitly list opacity and transform only.
- Forgets
prefers-reduced-motion. Every single effect must show its final state immediately under reduced motion. Claude skips this ~60% of the time.
- Uses
Date.now() in animation loops. Not monotonic, drifts on clock sync. Must use performance.now().
- Hardcodes colors instead of CSS custom properties. Makes re-theming impossible. All colors must go through
--cm-* tokens.
- Leaves
will-change on permanently. Reserves GPU memory for the life of the element. Add before animation, remove after.
- Generates typing effects without a cursor. The blinking cursor is what sells the illusion of a human typing. Without it, it looks like a broken render.
- Animates
width for progress bars via JS. CSS transition: width on the fill element handles this. JS should only set the target percentage.
- Puts stagger delays in JS
setTimeout chains. Use CSS transition-delay: calc(N * var(--cm-stagger)) so pacing changes propagate from one token.
- Builds file review UI with
innerHTML. XSS vector when filenames come from user input. Use textContent + DOM construction.
Implementation Rules
- Vanilla only. No React, Vue, Svelte, Angular. Plain HTML + CSS + JS. These are marketing page embeds — a framework adds 30-100KB for effects that need <2KB of JS.
- Single-file output. Everything in one HTML file. CDN imports for fonts only (+ Lottie when needed). Single-file means drag-and-drop into any CMS or Webflow embed block.
requestAnimationFrame only. Never setInterval for visual animation loops. setInterval permitted only for non-visual state cycling (e.g., "PROCESSING..." dot count).
performance.now() for timing. Never Date.now() in animation tick functions.
prefers-reduced-motion required. Every animated effect shows its final state immediately when reduced motion is preferred. No motion, no transitions.
- Visibility API integration. Pause all animation loops when
document.hidden === true. Resume on visibility change.
will-change lifecycle. Add will-change: opacity, transform before animation starts, remove after completion. Never leave it permanent.
--cm-* tokens everywhere. Never hardcode colors, timing, or typography — always reference custom properties.
- Guard double-initialization. Every init function checks
dataset.{name}Init === "true" before proceeding. Without this, hot-reload in dev tools or Webflow's live preview runs init twice, doubling all animations.
- Viewport meta required.
<meta name="viewport" content="width=device-width, initial-scale=1">. Without it, mobile browsers zoom to 980px default, breaking all clamp() sizing.
- Touch and resize handlers. Responsive recalculation on
resize (debounced 80ms). Touch-friendly interaction targets.
- Accessible by default.
aria-hidden="true" on decorative elements (cursors, spinners). role="progressbar" with aria-valuenow on progress bars. All content readable without JS.
- Font: Geist + Geist Mono. Via Google Fonts CDN.
-webkit-font-smoothing: antialiased. Geist's monospace numerals and tight letter-spacing match the ConductorAI source. The mono variant is essential for terminal displays and dot-leader alignment.
Anti-Patterns
- Never use
transition: all — explicitly list each property and duration
- Never animate
width, height, top, left, margin, padding — use transform and opacity only
- Never hardcode stagger delays in ms — use CSS custom property
--cm-stagger multiplied by index
- Never omit
prefers-reduced-motion — every effect needs it, no exceptions
- Never animate off-screen elements — guard with IntersectionObserver or page-load class toggle
- Never use
Date.now() in rAF loops — performance.now() is monotonic and sub-ms accurate
- Never leave
will-change on permanently — it reserves GPU memory; add before, remove after
- Never assume typing text is single-line — handle
white-space: nowrap on the typing container, not the parent
- Never use pure white
#FFFFFF as text in dark mode — use --cm-text (#E8ECF4) for less eye strain
- Never play Lottie animations eagerly on mobile if they're below the fold — use IntersectionObserver
- Never create typing effects without cursor — the cursor sells the illusion
- Never hardcode file extensions in the file-review pattern — parse from filename
See references/anti-patterns.md for expanded explanations with code examples.
Generator Script
python3 scripts/conductor_motion_generator.py \
--mode typewriter|progress|file-review|stagger-reveal|terminal|lottie-compose|full-page|catalog \
--pacing slow|medium|fast \
--stagger 200 \
--typing-speed 45 \
--easing cubic \
--color-scheme dark|light \
--accent "#4F7BF7" \
--output output.html
Mode-specific content flags documented under Composition Parameters.
Validation
python3 scripts/validate_conductor_motion.py output.html
Checks: viewport meta, --cm-* properties, no framework imports, requestAnimationFrame present, prefers-reduced-motion media query, performance.now() in animation code, font-smoothing, aria-hidden on cursors, document.hidden visibility check, no transition: all, no setInterval for animation (warning for any setInterval), no layout-triggering property animation.
References
Load on-demand when implementing specific patterns:
| Reference |
Covers |
references/design-tokens.md |
Full --cm-* token system: dark/light schemes, easing functions, timing constants per mode, pacing multiplier |
references/typewriter-patterns.md |
Hero rotator + type-on variants, timing constants, cursor styles, visibility API, word cycling state machine |
references/progress-simulation-patterns.md |
Progress bar, easeOutCubic tick, counters, dot-leaders, staggered rows, processing dots |
references/stagger-reveal-patterns.md |
Hero cascade, section reveals, IntersectionObserver, scroll-triggered, double-rAF technique |
references/file-review-patterns.md |
State machine (unreviewed→processing→reviewed), template cloning, status indicators, SVG icons |
references/terminal-display-patterns.md |
Status typing, timestamps, dot-leaders, search result counters, progress sync |
references/lottie-orchestration.md |
Lottie player setup, responsive variants, scroll-synced playback, data attributes |
references/scroll-driven-animations.md |
CSS animation-timeline, GSAP ScrollTrigger fallback, IntersectionObserver patterns |
references/anti-patterns.md |
Banned patterns with wrong/right code examples and rationale |
references/advanced-compositions.md |
Workflow graphs, multi-agent review, reviewer sidebar, search input sim, comparison bars, dot-matrix numbers, corner brackets |
Cross-Skill Relationships
- grainient: Grainient owns CSS surface effects (shadows, aurora, glass, ticker, hover-zoom). Conductor-motion owns behavioral animations (typing, progress, state machines, stagger sequences). Rule: if it simulates software behavior, it's conductor-motion; if it's a visual treatment, it's grainient.
- minoan-frontend-design: Creative direction and text-animation-catalog provide timing specs that conductor-motion implements as generators. MOTION_INTENSITY dial from
.design-context.md drives pacing selection.
- design-polish: Conductor-motion output must pass design-polish's motion checks (150–300ms state changes, ease-out-quart, transform+opacity only).
- design-audit: Output must pass accessibility checks (reduced-motion, aria attributes, contrast).
- threejs-particle-canvas: Boundary at "2D behavioral vs 3D visual." Loading spinners with parametric curves → threejs-particle-canvas. Progress bar simulations → conductor-motion.
- rocaille-shader: No overlap. Shaders are visual treatments, not behavioral simulations.
- shape: Upstream. Produces
.design-context.md that conductor-motion consumes for pacing and token context.
Attribution
Patterns deconstructed from ConductorAI.com (Webflow, May 2026). Technologies: GSAP 3.15 + ScrollTrigger, Lottie (lottie-web), Finsweet Attributes, vanilla JavaScript. Typography: Geist + Geist Mono via Google Fonts.
1---2name: conductor-motion3description: Generate hand-crafted web animation patterns as self-contained HTML: typewriter/rotator effects, progress bar simulations, file review state machines, staggered reveals, terminal status displays, Lottie orchestration, scroll-driven sequences. Behavioral animations that simulate live software. Triggers on typewriter effect, progress animation, stagger reveal, terminal animation, data simulation, product demo animation, loading sequence, conductor motion.4---5
6# Conductor Motion
7
8Generate the mid-layer animation patterns that make product marketing sites feel alive — typewriter simulations, progress bar choreography, staggered content reveals, Lottie sequencing, and scroll-driven animation compositions. These patterns simulate live software through animation alone.
9
10Deconstructed from [ConductorAI.com](https://www.conductorai.com/) (Webflow, GSAP 3.15, Lottie, vanilla JS).
11
12## Quick Start
13
14```bash
15# Typewriter hero with word cycling
16python3 scripts/conductor_motion_generator.py --mode typewriter \
17 --base-text "Accelerating" \
18 --words "complex approvals,investigations,e-discovery,FOIA review" \
19 --output typewriter.html
20
21# Progress bar simulation
22python3 scripts/conductor_motion_generator.py --mode progress \
23 --title "search initialization" --doc-count 1324 \
24 --rows "QUERY_RECEIVED,INPUT,ELECTRONIC SIGNATURE,JURISDICTION" \
25 --output progress.html
26
27# File review state machine
28python3 scripts/conductor_motion_generator.py --mode file-review \
29 --files "Report_Q4.xlsx,Contract_Draft.pdf,Audit_Log.csv" \
30 --output file-review.html
31
32# Full landing page with all patterns
33python3 scripts/conductor_motion_generator.py --mode full-page \
34 --output landing.html
35
36# Effects catalog (all modes demonstrated)
37python3 scripts/conductor_motion_generator.py --mode catalog --output catalog.html
38```
39
40Or let Claude generate directly from the templates and references.
41
42## Motion Interview
43
44When invoked without `--mode`, the skill runs a brief motion interview:
45
461. **Content type** — What are you animating? (hero section, product demo, status dashboard, landing page)
472. **Pacing** — What tempo? (slow/deliberate, medium/professional, fast/urgent)
483. **Patterns** — Which effects? (typewriter, progress, file-review, stagger, terminal, lottie, or all)
494. **Color scheme** — Dark or light background?
505. **Design tokens** — Use existing `DESIGN.md` / `.design-context.md`, or defaults?
51
52Output: `.motion-context.md` consumed by generation phase.
53
54If `.design-context.md` exists with MOTION_INTENSITY dial set, skip the pacing question and derive from that value:
55- MOTION_INTENSITY 1-3 → slow
56- MOTION_INTENSITY 4-6 → medium
57- MOTION_INTENSITY 7-10 → fast
58
59## Modes
60
61| Mode | Template | Patterns Composed |
62|------|----------|-------------------|
63| `typewriter` | `assets/templates/typewriter.html` | Hero rotator + type-on + blinking cursor |
64| `progress` | `assets/templates/progress.html` | Progress bar + counter + dot-leaders + processing dots + staggered rows |
65| `file-review` | `assets/templates/file-review.html` | File list + state machine (unreviewed→processing→reviewed) + status indicators |
66| `stagger-reveal` | `assets/templates/stagger-reveal.html` | Hero cascade + section reveals + IntersectionObserver scroll triggers |
67| `terminal` | `assets/templates/terminal.html` | Timestamps + status typing + search result counters + progress sync |
68| `lottie-compose` | `assets/templates/lottie-compose.html` | Lottie player + responsive variants + scroll-synced playback |
69| `full-page` | `assets/templates/full-page.html` | All patterns composed into a coherent landing section |
70| `catalog` | `assets/templates/catalog.html` | Visual reference with live demos of each pattern |
71
72## Color System
73
74All effects read from `--cm-*` CSS custom properties. Override at `:root` to re-theme. Default: dark scheme with `#4F7BF7` brand accent. Light scheme swaps bg/text polarity.
75
76Full token reference (dark, light, easing, timing): `references/design-tokens.md`
77
78## Composition Parameters
79
80| Parameter | Range | Default | Effect |
81|-----------|-------|---------|--------|
82| `--pacing` | `slow \| medium \| fast` | `medium` | Speed multiplier: slow=1.5x duration, fast=0.6x |
83| `--stagger` | `100–400` | `200` | Milliseconds between sequential reveals |
84| `--typing-speed` | `20–80` | `45` | Base ms per character typed |
85| `--typing-variance` | `0–40` | `18` | Random variance added to typing speed |
86| `--easing` | `cubic \| quart \| linear` | `cubic` | Primary easing: easeOutCubic, easeOutQuart, or linear |
87| `--progress-duration` | `2000–10000` | `6000` | Total progress animation ms |
88| `--hold-duration` | `500–3000` | `1100` | Ms to hold typed word before deleting |
89| `--color-scheme` | `dark \| light` | `dark` | Background/foreground polarity |
90| `--font` | font name | `Geist` | Primary font (loaded via Google Fonts CDN) |
91| `--accent` | hex color | `#4F7BF7` | Override `--cm-brand` |
92| `--lottie-cdn` | `boolean` | `false` | Include Lottie player CDN (lottie-compose mode only) |
93
94### Content Parameters (per mode)
95
96**typewriter**: `--base-text`, `--words` (comma-separated), `--cursor` (char, default `|`), `--loop` (boolean)
97**progress**: `--title`, `--doc-count`, `--rows` (comma-separated labels), `--start-percent` (default 5)
98**file-review**: `--files` (comma-separated filenames with extensions), `--review-speed` (ms per file)
99**stagger-reveal**: `--items` (comma-separated selectors or text blocks), `--direction` (up|down|left|right)
100**terminal**: `--status-items` (comma-separated), `--result-count`, `--result-label`, `--timestamps` (boolean)
101**lottie-compose**: `--lottie-src` (URL to .json), `--lottie-loop`, `--lottie-autoplay`, `--responsive` (boolean)
102
103## Architecture
104
105```
106 ┌──────────────────────┐
107 │ .design-context.md │ ← from /shape (optional)
108 │ DESIGN.md tokens │ ← from /design-md (optional)
109 └──────────┬───────────┘
110 │
111 ┌──────────▼───────────┐
112 │ Motion Interview │ ← asks pacing, patterns, content
113 │ (skip if --mode set) │
114 └──────────┬───────────┘
115 │
116 ┌──────────▼───────────┐
117 │ .motion-context.md │ ← pacing, patterns, content data
118 └──────────┬───────────┘
119 │
120 ┌─────────────────┼─────────────────┐
121 ▼ ▼ ▼
122 ┌────────────┐ ┌────────────┐ ┌────────────────┐
123 │ Template │ │ Token │ │ Content │
124 │ Selection │ │ Application│ │ Injection │
125 │ (mode→html) │ │ (--cm-*) │ │ (user data) │
126 └──────┬─────┘ └─────┬──────┘ └───────┬────────┘
127 │ │ │
128 └────────────────┼────────────────────┘
129 ▼
130 ┌──────────────────────┐
131 │ Single-file HTML │
132 │ (inline CSS + JS) │
133 │ CDN: fonts only │
134 │ (+ Lottie if needed)│
135 └──────────────────────┘
136```
137
138## Animation Engine Internals
139
140Easing functions, timing constants per mode, and pacing multiplier tables: `references/design-tokens.md`
141
142Key: `easeOutCubic` (`t => 1 - Math.pow(1-t, 3)`) is the default. Pacing multiplier scales all durations — slow=1.5×, medium=1.0×, fast=0.6×. Stagger delays scale at 0.8× the multiplier.
143
144## Gotchas (What Claude Gets Wrong Without This Skill)
145
1461. **Reaches for GSAP or Framer Motion.** These patterns are vanilla JS — no framework needed. GSAP adds 30KB for effects achievable with `requestAnimationFrame` and CSS transitions.
1472. **Uses `transition: all` for reveals.** Triggers layout on every property. Explicitly list `opacity` and `transform` only.
1483. **Forgets `prefers-reduced-motion`.** Every single effect must show its final state immediately under reduced motion. Claude skips this ~60% of the time.
1494. **Uses `Date.now()` in animation loops.** Not monotonic, drifts on clock sync. Must use `performance.now()`.
1505. **Hardcodes colors instead of CSS custom properties.** Makes re-theming impossible. All colors must go through `--cm-*` tokens.
1516. **Leaves `will-change` on permanently.** Reserves GPU memory for the life of the element. Add before animation, remove after.
1527. **Generates typing effects without a cursor.** The blinking cursor is what sells the illusion of a human typing. Without it, it looks like a broken render.
1538. **Animates `width` for progress bars via JS.** CSS `transition: width` on the fill element handles this. JS should only set the target percentage.
1549. **Puts stagger delays in JS `setTimeout` chains.** Use CSS `transition-delay: calc(N * var(--cm-stagger))` so pacing changes propagate from one token.
15510. **Builds file review UI with `innerHTML`.** XSS vector when filenames come from user input. Use `textContent` + DOM construction.
156
157## Implementation Rules
158
1591. **Vanilla only.** No React, Vue, Svelte, Angular. Plain HTML + CSS + JS. These are marketing page embeds — a framework adds 30-100KB for effects that need <2KB of JS.
1602. **Single-file output.** Everything in one HTML file. CDN imports for fonts only (+ Lottie when needed). Single-file means drag-and-drop into any CMS or Webflow embed block.
1613. **`requestAnimationFrame` only.** Never `setInterval` for visual animation loops. `setInterval` permitted only for non-visual state cycling (e.g., "PROCESSING..." dot count).
1624. **`performance.now()` for timing.** Never `Date.now()` in animation tick functions.
1635. **`prefers-reduced-motion` required.** Every animated effect shows its final state immediately when reduced motion is preferred. No motion, no transitions.
1646. **Visibility API integration.** Pause all animation loops when `document.hidden === true`. Resume on visibility change.
1657. **`will-change` lifecycle.** Add `will-change: opacity, transform` before animation starts, remove after completion. Never leave it permanent.
1668. **`--cm-*` tokens everywhere.** Never hardcode colors, timing, or typography — always reference custom properties.
1679. **Guard double-initialization.** Every init function checks `dataset.{name}Init === "true"` before proceeding. Without this, hot-reload in dev tools or Webflow's live preview runs init twice, doubling all animations.
16810. **Viewport meta required.** `<meta name="viewport" content="width=device-width, initial-scale=1">`. Without it, mobile browsers zoom to 980px default, breaking all clamp() sizing.
16911. **Touch and resize handlers.** Responsive recalculation on `resize` (debounced 80ms). Touch-friendly interaction targets.
17012. **Accessible by default.** `aria-hidden="true"` on decorative elements (cursors, spinners). `role="progressbar"` with `aria-valuenow` on progress bars. All content readable without JS.
17113. **Font: Geist + Geist Mono.** Via Google Fonts CDN. `-webkit-font-smoothing: antialiased`. Geist's monospace numerals and tight letter-spacing match the ConductorAI source. The mono variant is essential for terminal displays and dot-leader alignment.
172
173## Anti-Patterns
174
175- Never use `transition: all` — explicitly list each property and duration
176- Never animate `width`, `height`, `top`, `left`, `margin`, `padding` — use `transform` and `opacity` only
177- Never hardcode stagger delays in ms — use CSS custom property `--cm-stagger` multiplied by index
178- Never omit `prefers-reduced-motion` — every effect needs it, no exceptions
179- Never animate off-screen elements — guard with IntersectionObserver or page-load class toggle
180- Never use `Date.now()` in rAF loops — `performance.now()` is monotonic and sub-ms accurate
181- Never leave `will-change` on permanently — it reserves GPU memory; add before, remove after
182- Never assume typing text is single-line — handle `white-space: nowrap` on the typing container, not the parent
183- Never use pure white `#FFFFFF` as text in dark mode — use `--cm-text` (`#E8ECF4`) for less eye strain
184- Never play Lottie animations eagerly on mobile if they're below the fold — use IntersectionObserver
185- Never create typing effects without cursor — the cursor sells the illusion
186- Never hardcode file extensions in the file-review pattern — parse from filename
187
188See `references/anti-patterns.md` for expanded explanations with code examples.
189
190## Generator Script
191
192```bash
193python3 scripts/conductor_motion_generator.py \
194 --mode typewriter|progress|file-review|stagger-reveal|terminal|lottie-compose|full-page|catalog \
195 --pacing slow|medium|fast \
196 --stagger 200 \
197 --typing-speed 45 \
198 --easing cubic \
199 --color-scheme dark|light \
200 --accent "#4F7BF7" \
201 --output output.html
202```
203
204Mode-specific content flags documented under Composition Parameters.
205
206## Validation
207
208```bash
209python3 scripts/validate_conductor_motion.py output.html
210```
211
212Checks: viewport meta, `--cm-*` properties, no framework imports, `requestAnimationFrame` present, `prefers-reduced-motion` media query, `performance.now()` in animation code, font-smoothing, `aria-hidden` on cursors, `document.hidden` visibility check, no `transition: all`, no `setInterval` for animation (warning for any `setInterval`), no layout-triggering property animation.
213
214## References
215
216Load on-demand when implementing specific patterns:
217
218| Reference | Covers |
219|-----------|--------|
220| `references/design-tokens.md` | Full `--cm-*` token system: dark/light schemes, easing functions, timing constants per mode, pacing multiplier |
221| `references/typewriter-patterns.md` | Hero rotator + type-on variants, timing constants, cursor styles, visibility API, word cycling state machine |
222| `references/progress-simulation-patterns.md` | Progress bar, easeOutCubic tick, counters, dot-leaders, staggered rows, processing dots |
223| `references/stagger-reveal-patterns.md` | Hero cascade, section reveals, IntersectionObserver, scroll-triggered, double-rAF technique |
224| `references/file-review-patterns.md` | State machine (unreviewed→processing→reviewed), template cloning, status indicators, SVG icons |
225| `references/terminal-display-patterns.md` | Status typing, timestamps, dot-leaders, search result counters, progress sync |
226| `references/lottie-orchestration.md` | Lottie player setup, responsive variants, scroll-synced playback, data attributes |
227| `references/scroll-driven-animations.md` | CSS animation-timeline, GSAP ScrollTrigger fallback, IntersectionObserver patterns |
228| `references/anti-patterns.md` | Banned patterns with wrong/right code examples and rationale |
229| `references/advanced-compositions.md` | Workflow graphs, multi-agent review, reviewer sidebar, search input sim, comparison bars, dot-matrix numbers, corner brackets |
230
231## Cross-Skill Relationships
232
233- **grainient**: Grainient owns CSS surface effects (shadows, aurora, glass, ticker, hover-zoom). Conductor-motion owns behavioral animations (typing, progress, state machines, stagger sequences). Rule: if it simulates software behavior, it's conductor-motion; if it's a visual treatment, it's grainient.
234- **minoan-frontend-design**: Creative direction and text-animation-catalog provide timing specs that conductor-motion implements as generators. MOTION_INTENSITY dial from `.design-context.md` drives pacing selection.
235- **design-polish**: Conductor-motion output must pass design-polish's motion checks (150–300ms state changes, ease-out-quart, transform+opacity only).
236- **design-audit**: Output must pass accessibility checks (reduced-motion, aria attributes, contrast).
237- **threejs-particle-canvas**: Boundary at "2D behavioral vs 3D visual." Loading spinners with parametric curves → threejs-particle-canvas. Progress bar simulations → conductor-motion.
238- **rocaille-shader**: No overlap. Shaders are visual treatments, not behavioral simulations.
239- **shape**: Upstream. Produces `.design-context.md` that conductor-motion consumes for pacing and token context.
240
241## Attribution
242
243Patterns deconstructed from [ConductorAI.com](https://www.conductorai.com/) (Webflow, May 2026). Technologies: GSAP 3.15 + ScrollTrigger, Lottie (lottie-web), Finsweet Attributes, vanilla JavaScript. Typography: Geist + Geist Mono via Google Fonts.