Storyboard Shot → HTML
Turn one shot (video prompt + narration) into a single-file HTML animation you can open in a browser — a motion sketch of the intended frame, not a real video render.
Companion to storyboard. Does not call video/image generation APIs.
Inputs
Accept any of:
| Input |
How to use |
Storyboard .md + shot id (01, Shot 02, …) |
Parse that shot’s Video prompt, Chinese / English, Visual, Camera, Duration, Visual Style |
| Pasted shot block |
Same fields if present |
| Raw video prompt (± narration) |
Prompt = visual source; narration = meaning layer to research |
If multiple shots and no id → ask once, or do Shot 01 only when the user clearly wants a quick sample.
Delivery
| Mode |
Behavior |
User gives an .html path |
Write there |
| User gives a directory |
Write <dir>/shot-<id>-preview.html (shot-01-preview.html if no id) |
| Storyboard path known, no output path |
Write next to the .md: <stem>-shot-<id>-preview.html |
| Raw prompt only |
Write test/manual/<slug>-preview.html (or user-named file) |
Rules:
- Always write the full HTML file (UTF-8). Chat: short confirm only (path, shot id, research notes, how to open).
- Prefer one self-contained
.html (inline CSS/JS). No build step, no CDN frameworks required. Google Fonts OK if useful.
- Fullscreen by default (see below) — first paint is the stage filling the browser; no document scroll of title/meta under the frame.
- After write: open in the system browser (
Start-Process / open / xdg-open). If file:// is flaky, serve the parent dir with a tiny static server and open http://127.0.0.1:<port>/<file>.
- Never overwrite the storyboard
.md.
Fullscreen (required)
The preview must play as a full-viewport cinematic stage, not a letterboxed card on a scrolling page.
| Requirement |
Detail |
| Viewport fill |
html, body { height:100%; overflow:hidden }; stage covers 100vw × 100vh |
| Aspect |
Keep storyboard aspect (default 16:9) with cover (crop) or letterbox on black — prefer cover so the frame fills the screen |
| No below-fold chrome |
Title, tags, original prompt must not sit under the stage in normal flow |
| Overlay meta |
Put prompt / research in a hidden overlay (I or ? to toggle; Esc closes). Do not burn VO/narration onto the stage — narration is for analysis only, not on-screen text |
| Space to play |
Animations stay paused on load (first frame / idle pose). Space starts playback once. Do not autoplay on open. Hint text: Space to play · Click / F fullscreen · I prompt (may also mention Space to start) |
| Play once |
Shot timeline is one-shot — no infinite / alternate loop on the main beat. When duration ends, hold the final frame (animation-fill-mode: forwards or equivalent). Do not restart on a second Space, and do not auto-replay |
| Browser Fullscreen API |
On click (or F), call element.requestFullscreen() on the stage root. Show a brief hint until entered (Click / F fullscreen · Space to play). Esc exits native fullscreen |
| Open behavior |
After writing the file, open it so the user lands on the fullscreen-ready paused page; wait for Space to play |
Workflow
Task Progress:
- [ ] Parse shot (prompt + VO + camera/duration/style)
- [ ] Analyze narration → concepts to ground
- [ ] Search related info / usage (when needed)
- [ ] Plan motion layers (camera / subject / secondary / light / micro) + timing beats
- [ ] Design rich stage from prompt + research (depth planes, staggers, payoff hold)
- [ ] Write HTML; open in browser
- [ ] Chat: path + what the demo shows
1. Parse the shot
Extract:
- Video prompt (primary visual / motion spec)
- Chinese / English VO (meaning, pacing;
(no VO) = skip that language)
- Visual, Camera, Duration, piece-level Visual Style when available
Map duration to animation timing when sensible (~5s → ~5s one-shot timeline, then hold). Playback starts only on Space (paused until then); never loop or auto-replay.
2. Analyze narration (required)
From VO, list concrete concepts that affect what the viewer should understand:
- Product / feature / API / workflow names
- Places, eras, UI metaphors, audience takeaway
- Claims that need accurate depiction (do not invent)
If VO only restates mood already in the prompt, research may be light — still state that explicitly in chat.
3. Search related info / usage
When concepts are factual, technical, or product-specific:
- Use WebSearch / WebFetch (or project docs) for short, trustworthy cues: what it is, how it’s used, typical UI/visual metaphors.
- Fold only what helps the HTML stage (labels, layout metaphors, correct terminology, iconic shapes).
- Do not invent logos, prices, legal claims, or competitor branding.
- If search fails or materials already suffice, proceed with prompt-only visuals; note gaps briefly.
Skip heavy research for pure mood/atmosphere shots with no domain claims.
4. Build the HTML animation
Goal: one composition that reads as the shot at first viewport — animated stand-in for the video prompt. Aim for a rich motion sketch (layered beats + secondary life), not a flat poster that barely moves.
| Prefer |
Avoid |
| Full-viewport stage (100vw×100vh) + Fullscreen API |
Inset card + scrolling meta under the hero |
| Aspect-locked cover (16:9 default) filling the screen |
Dashboard clutter, card grids in the hero |
CSS/@keyframes one-shot until end, paused until Space |
Autoplay, infinite / looping shot timelines, Space restart |
| Layered camera + light + subject + micro-UI + atmosphere |
Single fade-in with nothing else moving |
| Staggered reveals, easing, hold on end frame |
Everything popping at t=0 then freezing |
Prompt / research in toggle overlay (I / ?) |
Fake photoreal video, watermarked stock embeds |
| Expressive fonts when they serve mood |
Default system-only stacks for cinematic shots |
Sync with VO meaning: if narration teaches a step or names a UI, show that metaphor on stage (even abstractly). Mood-only VO → prioritize prompt cinematography.
Language: Prefer English for all on-stage chrome, labels, badges, chat bubbles, code comments, and hint text. Do not default to Chinese even when Chinese VO is present. Never put spoken narration / VO lines on the stage. Keep the original prompt + VO text (Chinese and English) only in the toggle overlay. Overlay headings and research notes should also be English.
Typography / readable stage text (required):
Stage labels are viewed fullscreen — do not ship micro-UI. Anything the viewer should parse (chrome titles, badges, graph nodes, file cards, status chips, code lines, gate names) must stay large enough at 16:9 cover.
| Element |
Minimum size guidance |
| Primary labels (badges, thesis chips, CTA, key nodes) |
clamp(14px, 1.8vw, 20px) or larger |
| Secondary UI (window chrome, folder/file names, status) |
clamp(13px, 1.5vw, 17px) |
| Micro ornament only (optional ticks, tiny meters) |
may go smaller — but never put critical meaning there |
Hint bar (.fs-hint) |
≥14–15px |
- Prefer fewer, larger labels over dense 8–10px walls.
- When enlarging type, also bump padding / card height so text is not cramped.
- Anti-pattern:
font-size: 7px–11px clamps on graph nodes, code, or badges “to fit more” — cut content instead.
4a. Animation richness (required)
Ship a dense but readable stage. Thin “one transform + one opacity” demos are not enough.
Motion budget (minimum):
| Layer |
Role |
Examples |
| 1. Camera |
Energy only if the shot’s Camera line calls for it; otherwise lock or micro-parallax |
Push-in / pull-back / pan / dutch / orbital when Camera says so; locked multilayer HUD when it doesn’t |
| 2. Primary subject |
What the shot is about |
Prototype appearing, module docking, graph exploding, gate locking, code lines revealing |
| 3. Secondary / support |
Proof the world is alive |
Sibling UI panels, folder tree growth, packet lanes, platform pieces |
| 4. Light & atmosphere |
Mood continuity from Visual Style |
Lamp pulse, monitor bloom, volumetric haze drift, vignette breathe, rim-light shift |
| 5. Micro-detail |
Texture without stealing focus |
Cursor blink, scrubber/knob, floating code bits, dust/particles, soft shadow crawl |
Require at least 4 of these 5 layers on every shot, and ≥5 distinct animated properties after Space (e.g. code line stagger + tree stagger + platforms + clock scrub + play-view bloom — not a default whole-frame scale). Ambient loops (infinite lamp flicker, dust) are OK only if subtle and do not read as the shot replaying; the main narrative beat stays one-shot + forwards.
Camera vs readable content (priority):
When the stage shows important content — real project code / API call sites, terminal output, labeled architecture, readable UI chrome the viewer must parse — prefer readability over cinematic camera:
- Do not default to whole-frame push-in / zoom / orbit on
.scene just to “have a Camera layer.”
- Prefer locked camera (or tiny parallax / drift that does not shrink text) or a local emphasis on the important block (scale/highlight that one panel or code card — not the entire stage).
- Whole-frame camera moves are allowed only when the shot’s Camera line explicitly asks (push-in, pull-back, orbital, tracking, etc.) and they won’t make the key text/code illegible.
- If Camera is composite / multilayer / locked-off (“parallel HUD”, “static board”, …), treat Camera as depth + panel energy, not zoom.
Depth & layering:
- Build ≥3 depth planes (bg / mid / fg or room / screens / desk props). Parallax them slightly when there is a camera move (different translate amounts — avoid scale that eats readability).
- Prefer real structure (monitor bezels, desk, lamp, HUD chrome) over a single flat rectangle with text.
- Use soft masks, inset bezels, bloom, and gradient haze so the frame doesn’t look like clipped divs on black.
Timing craft (map to Duration):
- Idle (pre-Space): readable establishing frame — lights on, subjects in start pose, no story progress.
- Setup (first ~20–30%): environment wakes — UI populates, secondary elements stagger in (
animation-delay cascade).
- Development (middle): primary transformation from the video prompt (build / collapse / reveal / dock).
- Accent (~last 20%): punch the Camera/VO payoff (RUN success, shockwave, CTA hold, badge snap).
- Hold: freeze the end pose (
forwards); no rewind.
Use staggers (40–120ms steps) for lists, folders, packets, checkmarks. Prefer cubic-bezier / ease-out on arrivals; reserve snappy ease for hits and smash cuts. If Duration is ~8s, keep the CSS timeline ≈8s — don’t compress a whole story into 2s then dead-air.
Detail recipes (pick what fits the prompt):
| Shot type |
Enrich with |
| Desk / editor / IDE |
Dual screens, sidebar tree stagger, typed/fading code lines, blinking caret, playview empty→alive, clock or timeline scrub, warm lamp + cool monitor mix; keep code readable — local emphasis on the editor, not whole-frame zoom |
| Architecture / graph |
Nodes lighting in sequence, edges drawing, local cyan vs global fog, camera pull-back revealing scale, soft particle drift |
| Chaos / debt |
Multiplying clones, spaghetti cables growing, amber warning pulses, dutch tilt increasing, denser particle rain — still graphic-clean, not illegible spam |
| Product / module dock |
Orbital turntable, modules easing into sockets with short “dock” scale settle, rim light pass, label fades (short, abstract) |
| Pipeline / steps |
Lateral track or stepped gates lighting cyan as a token passes; each gate a micro-animation, not one long slide |
| Game-feel montage |
Meter needles, multi-hit sparks, toast slide+fade, one-shot VFX sheet burst — cut accents on beats, no seizure strobe |
CSS/JS practical rules:
- Gate story animations behind
.is-playing (or equivalent). Idle may use only tiny ambient loops.
- Prefer
transform + opacity (+ filter sparingly) for performance; avoid layout thrash.
- Name keyframes by intent (
cameraPush, platformGrow, badgeIn) so timing stays editable.
- Optional tiny JS for clocks, counters, or step indices — keep logic short; CSS owns most motion.
- No on-stage VO captions, karaoke, or subtitle bars.
Anti-patterns (reject before shipping):
- Only opacity fade on the whole stage
- Static screenshot look after play starts
- All elements sharing one identical delay/duration
- Busy infinite loops that feel like a GIF restart
- Unreadable micro-text walls or fake brand logos
- Stage chrome / nodes / badges at ~7–11px (too small for fullscreen; enlarge or drop labels)
- Burning narration into the frame
- Default whole-frame
scale / push-in while code or other critical text is on stage (zooms away readability)
- Inventing camera moves not present in the shot’s Camera line
4b. Pre-flight motion checklist
Before writing the file, briefly plan (internally or in overlay research notes):
- Camera from the shot’s Camera line — if important code/content is on stage, choose lock / local zoom on that content, not whole-frame push
- Primary beat from the Video prompt
- Two secondary enrichments (UI / props / particles)
- Light or atmosphere continuity from Visual Style
- End-frame hold that matches the payoff
If any item is missing, add it before coding.
5. Suggested HTML skeleton
Adapt freely; keep fullscreen structure:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>[Shot title] · preview</title>
<style>
html, body { height: 100%; margin: 0; overflow: hidden; background: #000; }
.stage {
position: fixed; inset: 0; width: 100vw; height: 100vh;
/* 16:9 cover inside .frame */
}
.frame {
position: absolute; inset: 0; margin: auto;
width: 100vw; height: 56.25vw; /* 16:9 */
max-height: 100vh; max-width: 177.78vh;
overflow: hidden;
}
.hud { position: fixed; /* hint + overlay; hidden by default */ }
</style>
</head>
<body>
<div class="stage" id="stage">
<div class="frame"><!-- scene layers only — no VO caption --></div>
</div>
<div class="fs-hint">Space to play · Click / F fullscreen · I prompt</div>
<aside class="overlay" hidden><!-- title, prompt, research — toggle with I / ? --></aside>
<script>
// Space adds .is-playing once; keyframes use forwards; no loop / no Space restart
// click/F → requestFullscreen; I → overlay
</script>
</body>
</html>
Multi-shot (optional)
Only if the user asks for a full board:
- One HTML with shot tabs or sequential stages timed to each
Duration
- Still one file unless they request a folder of per-shot previews
- Research once per distinct domain concept (don’t repeat identical searches)
Quality bar
CLI
Copy-paste commands: cli/storyboard-shot-to-html.md
1---2name: storyboard-shot-to-html3description: Turns a storyboard shot (video prompt + narration) into a self-contained fullscreen HTML CSS animation for the browser. Analyzes VO/narration, searches related facts and usage cues, then builds a rich layered stage (camera, subject, secondary UI, light, micro-detail) with Fullscreen API and Space-to-play. Use when the user wants storyboard-shot-to-html, HTML animation preview, prompt-to-HTML, storyboard to HTML, prompt animation demo, narration visualization, fullscreen preview, Space to play, or a web demo of a video prompt / shot.4---56# Storyboard Shot → HTML78Turn **one shot** (video prompt + narration) into a **single-file HTML** animation you can open in a browser — a motion sketch of the intended frame, not a real video render.910Companion to **[storyboard](../storyboard/SKILL.md)**. Does **not** call video/image generation APIs.1112## Inputs1314Accept any of:1516| Input | How to use |17|-------|------------|18| Storyboard `.md` + shot id (`01`, `Shot 02`, …) | Parse that shot’s `Video prompt`, `Chinese` / `English`, `Visual`, `Camera`, `Duration`, Visual Style |19| Pasted shot block | Same fields if present |20| Raw video prompt (± narration) | Prompt = visual source; narration = meaning layer to research |2122If multiple shots and no id → ask once, or do **Shot 01** only when the user clearly wants a quick sample.2324## Delivery2526| Mode | Behavior |27|------|----------|28| User gives an `.html` path | Write there |29| User gives a directory | Write `<dir>/shot-<id>-preview.html` (`shot-01-preview.html` if no id) |30| Storyboard path known, no output path | Write next to the `.md`: `<stem>-shot-<id>-preview.html` |31| Raw prompt only | Write `test/manual/<slug>-preview.html` (or user-named file) |3233**Rules:**3435- Always **write the full HTML file** (UTF-8). Chat: short confirm only (path, shot id, research notes, how to open).36- Prefer **one self-contained `.html`** (inline CSS/JS). No build step, no CDN frameworks required. Google Fonts OK if useful.37- **Fullscreen by default** (see below) — first paint is the stage filling the browser; no document scroll of title/meta under the frame.38- After write: **open in the system browser** (`Start-Process` / `open` / `xdg-open`). If `file://` is flaky, serve the parent dir with a tiny static server and open `http://127.0.0.1:<port>/<file>`.39- Never overwrite the storyboard `.md`.4041### Fullscreen (required)4243The preview must play as a **full-viewport cinematic stage**, not a letterboxed card on a scrolling page.4445| Requirement | Detail |46|-------------|--------|47| Viewport fill | `html, body { height:100%; overflow:hidden }`; stage covers **100vw × 100vh** |48| Aspect | Keep storyboard aspect (default **16:9**) with **cover** (crop) or letterbox on black — prefer **cover** so the frame fills the screen |49| No below-fold chrome | Title, tags, original prompt must **not** sit under the stage in normal flow |50| Overlay meta | Put prompt / research in a **hidden overlay** (`I` or `?` to toggle; `Esc` closes). **Do not** burn VO/narration onto the stage — narration is for analysis only, not on-screen text |51| **Space to play** | Animations stay **paused** on load (first frame / idle pose). **`Space`** starts playback **once**. Do not autoplay on open. Hint text: `Space to play · Click / F fullscreen · I prompt` (may also mention Space to start) |52| **Play once** | Shot timeline is **one-shot** — no `infinite` / `alternate` loop on the main beat. When duration ends, **hold the final frame** (`animation-fill-mode: forwards` or equivalent). Do **not** restart on a second `Space`, and do not auto-replay |53| Browser Fullscreen API | On click (or `F`), call `element.requestFullscreen()` on the stage root. Show a brief hint until entered (`Click / F fullscreen · Space to play`). `Esc` exits native fullscreen |54| Open behavior | After writing the file, open it so the user lands on the fullscreen-ready **paused** page; wait for `Space` to play |5556## Workflow5758```59Task Progress:60- [ ] Parse shot (prompt + VO + camera/duration/style)61- [ ] Analyze narration → concepts to ground62- [ ] Search related info / usage (when needed)63- [ ] Plan motion layers (camera / subject / secondary / light / micro) + timing beats64- [ ] Design rich stage from prompt + research (depth planes, staggers, payoff hold)65- [ ] Write HTML; open in browser66- [ ] Chat: path + what the demo shows67```6869### 1. Parse the shot7071Extract:7273- **Video prompt** (primary visual / motion spec)74- **Chinese** / **English** VO (meaning, pacing; `(no VO)` = skip that language)75- **Visual**, **Camera**, **Duration**, piece-level **Visual Style** when available7677Map duration to animation timing when sensible (`~5s` → ~5s **one-shot** timeline, then hold). Playback starts only on **`Space`** (paused until then); never loop or auto-replay.7879### 2. Analyze narration (required)8081From VO, list **concrete concepts** that affect what the viewer should understand:8283- Product / feature / API / workflow names84- Places, eras, UI metaphors, audience takeaway85- Claims that need accurate depiction (do not invent)8687If VO only restates mood already in the prompt, research may be light — still state that explicitly in chat.8889### 3. Search related info / usage9091When concepts are factual, technical, or product-specific:92931. Use **WebSearch** / **WebFetch** (or project docs) for short, trustworthy cues: what it is, how it’s used, typical UI/visual metaphors.942. Fold **only** what helps the HTML stage (labels, layout metaphors, correct terminology, iconic shapes).953. Do **not** invent logos, prices, legal claims, or competitor branding.964. If search fails or materials already suffice, proceed with prompt-only visuals; note gaps briefly.9798Skip heavy research for pure mood/atmosphere shots with no domain claims.99100### 4. Build the HTML animation101102Goal: **one composition** that reads as the shot at first viewport — animated stand-in for the video prompt. Aim for a **rich motion sketch** (layered beats + secondary life), not a flat poster that barely moves.103104| Prefer | Avoid |105|--------|--------|106| Full-viewport stage (100vw×100vh) + Fullscreen API | Inset card + scrolling meta under the hero |107| Aspect-locked cover (16:9 default) filling the screen | Dashboard clutter, card grids in the hero |108| CSS/`@keyframes` one-shot until end, paused until `Space` | Autoplay, `infinite` / looping shot timelines, Space restart |109| Layered camera + light + subject + micro-UI + atmosphere | Single fade-in with nothing else moving |110| Staggered reveals, easing, hold on end frame | Everything popping at t=0 then freezing |111| Prompt / research in toggle overlay (`I` / `?`) | Fake photoreal video, watermarked stock embeds |112| Expressive fonts when they serve mood | Default system-only stacks for cinematic shots |113114**Sync with VO meaning:** if narration teaches a step or names a UI, show that metaphor on stage (even abstractly). Mood-only VO → prioritize prompt cinematography.115116**Language:** **Prefer English** for all on-stage chrome, labels, badges, chat bubbles, code comments, and hint text. Do not default to Chinese even when Chinese VO is present. **Never** put spoken narration / VO lines on the stage. Keep the **original prompt + VO text** (Chinese and English) only in the toggle overlay. Overlay headings and research notes should also be English.117118**Typography / readable stage text (required):**119120Stage labels are viewed fullscreen — **do not ship micro-UI**. Anything the viewer should parse (chrome titles, badges, graph nodes, file cards, status chips, code lines, gate names) must stay large enough at 16:9 cover.121122| Element | Minimum size guidance |123|---------|----------------------|124| Primary labels (badges, thesis chips, CTA, key nodes) | `clamp(14px, 1.8vw, 20px)` or larger |125| Secondary UI (window chrome, folder/file names, status) | `clamp(13px, 1.5vw, 17px)` |126| Micro ornament only (optional ticks, tiny meters) | may go smaller — but **never** put critical meaning there |127| Hint bar (`.fs-hint`) | ≥14–15px |128129- Prefer fewer, larger labels over dense 8–10px walls.130- When enlarging type, also bump padding / card height so text is not cramped.131- Anti-pattern: `font-size: 7px`–`11px` clamps on graph nodes, code, or badges “to fit more” — cut content instead.132133### 4a. Animation richness (required)134135Ship a **dense but readable** stage. Thin “one transform + one opacity” demos are not enough.136137**Motion budget (minimum):**138139| Layer | Role | Examples |140|-------|------|----------|141| 1. Camera | Energy **only if** the shot’s Camera line calls for it; otherwise lock or micro-parallax | Push-in / pull-back / pan / dutch / orbital **when Camera says so**; locked multilayer HUD when it doesn’t |142| 2. Primary subject | What the shot is about | Prototype appearing, module docking, graph exploding, gate locking, **code lines revealing** |143| 3. Secondary / support | Proof the world is alive | Sibling UI panels, folder tree growth, packet lanes, platform pieces |144| 4. Light & atmosphere | Mood continuity from Visual Style | Lamp pulse, monitor bloom, volumetric haze drift, vignette breathe, rim-light shift |145| 5. Micro-detail | Texture without stealing focus | Cursor blink, scrubber/knob, floating code bits, dust/particles, soft shadow crawl |146147Require **at least 4 of these 5 layers** on every shot, and **≥5 distinct animated properties** after `Space` (e.g. code line stagger + tree stagger + platforms + clock scrub + play-view bloom — **not** a default whole-frame scale). Ambient loops (`infinite` lamp flicker, dust) are OK **only if subtle** and do **not** read as the shot replaying; the **main narrative beat stays one-shot + forwards**.148149**Camera vs readable content (priority):**150151When the stage shows **important content** — real project code / API call sites, terminal output, labeled architecture, readable UI chrome the viewer must parse — **prefer readability over cinematic camera**:1521531. **Do not** default to whole-frame push-in / zoom / orbit on `.scene` just to “have a Camera layer.”1542. Prefer **locked camera** (or tiny parallax / drift that does not shrink text) **or** a **local emphasis** on the important block (scale/highlight that one panel or code card — not the entire stage).1553. Whole-frame camera moves are allowed only when the shot’s **Camera** line explicitly asks (push-in, pull-back, orbital, tracking, etc.) **and** they won’t make the key text/code illegible.1564. If Camera is composite / multilayer / locked-off (“parallel HUD”, “static board”, …), treat Camera as **depth + panel energy**, not zoom.157158**Depth & layering:**159160- Build **≥3 depth planes** (bg / mid / fg or room / screens / desk props). Parallax them slightly **when** there is a camera move (different translate amounts — avoid scale that eats readability).161- Prefer real structure (monitor bezels, desk, lamp, HUD chrome) over a single flat rectangle with text.162- Use soft masks, inset bezels, bloom, and gradient haze so the frame doesn’t look like clipped divs on black.163164**Timing craft (map to Duration):**1651661. **Idle (pre-Space):** readable establishing frame — lights on, subjects in start pose, no story progress.1672. **Setup (first ~20–30%):** environment wakes — UI populates, secondary elements stagger in (`animation-delay` cascade).1683. **Development (middle):** primary transformation from the video prompt (build / collapse / reveal / dock).1694. **Accent (~last 20%):** punch the Camera/VO payoff (RUN success, shockwave, CTA hold, badge snap).1705. **Hold:** freeze the end pose (`forwards`); no rewind.171172Use **staggers** (40–120ms steps) for lists, folders, packets, checkmarks. Prefer `cubic-bezier` / ease-out on arrivals; reserve snappy ease for hits and smash cuts. If Duration is `~8s`, keep the CSS timeline ≈8s — don’t compress a whole story into 2s then dead-air.173174**Detail recipes (pick what fits the prompt):**175176| Shot type | Enrich with |177|-----------|-------------|178| Desk / editor / IDE | Dual screens, sidebar tree stagger, typed/fading code lines, blinking caret, playview empty→alive, clock or timeline scrub, warm lamp + cool monitor mix; **keep code readable** — local emphasis on the editor, not whole-frame zoom |179| Architecture / graph | Nodes lighting in sequence, edges drawing, local cyan vs global fog, camera pull-back revealing scale, soft particle drift |180| Chaos / debt | Multiplying clones, spaghetti cables growing, amber warning pulses, dutch tilt increasing, denser particle rain — still graphic-clean, not illegible spam |181| Product / module dock | Orbital turntable, modules easing into sockets with short “dock” scale settle, rim light pass, label fades (short, abstract) |182| Pipeline / steps | Lateral track or stepped gates lighting cyan as a token passes; each gate a micro-animation, not one long slide |183| Game-feel montage | Meter needles, multi-hit sparks, toast slide+fade, one-shot VFX sheet burst — cut accents on beats, no seizure strobe |184185**CSS/JS practical rules:**186187- Gate story animations behind `.is-playing` (or equivalent). Idle may use only tiny ambient loops.188- Prefer `transform` + `opacity` (+ `filter` sparingly) for performance; avoid layout thrash.189- Name keyframes by intent (`cameraPush`, `platformGrow`, `badgeIn`) so timing stays editable.190- Optional tiny JS for clocks, counters, or step indices — keep logic short; CSS owns most motion.191- **No** on-stage VO captions, karaoke, or subtitle bars.192193**Anti-patterns (reject before shipping):**194195- Only opacity fade on the whole stage196- Static screenshot look after play starts197- All elements sharing one identical delay/duration198- Busy infinite loops that feel like a GIF restart199- Unreadable micro-text walls or fake brand logos200- Stage chrome / nodes / badges at ~7–11px (too small for fullscreen; enlarge or drop labels)201- Burning narration into the frame202- Default whole-frame `scale` / push-in while code or other critical text is on stage (zooms away readability)203- Inventing camera moves not present in the shot’s **Camera** line204205### 4b. Pre-flight motion checklist206207Before writing the file, briefly plan (internally or in overlay research notes):2082091. Camera from the shot’s **Camera** line — if important code/content is on stage, choose **lock / local zoom on that content**, not whole-frame push 2102. Primary beat from the **Video prompt** 2113. Two secondary enrichments (UI / props / particles) 2124. Light or atmosphere continuity from **Visual Style** 2135. End-frame hold that matches the payoff 214215If any item is missing, add it before coding.216217### 5. Suggested HTML skeleton218219Adapt freely; keep **fullscreen** structure:220221```html222<!DOCTYPE html>223<html lang="en">224<head>225 <meta charset="UTF-8" />226 <meta name="viewport" content="width=device-width, initial-scale=1" />227 <title>[Shot title] · preview</title>228 <style>229 html, body { height: 100%; margin: 0; overflow: hidden; background: #000; }230 .stage {231 position: fixed; inset: 0; width: 100vw; height: 100vh;232 /* 16:9 cover inside .frame */233 }234 .frame {235 position: absolute; inset: 0; margin: auto;236 width: 100vw; height: 56.25vw; /* 16:9 */237 max-height: 100vh; max-width: 177.78vh;238 overflow: hidden;239 }240 .hud { position: fixed; /* hint + overlay; hidden by default */ }241 </style>242</head>243<body>244 <div class="stage" id="stage">245 <div class="frame"><!-- scene layers only — no VO caption --></div>246 </div>247 <div class="fs-hint">Space to play · Click / F fullscreen · I prompt</div>248 <aside class="overlay" hidden><!-- title, prompt, research — toggle with I / ? --></aside>249 <script>250 // Space adds .is-playing once; keyframes use forwards; no loop / no Space restart251 // click/F → requestFullscreen; I → overlay252 </script>253</body>254</html>255```256257## Multi-shot (optional)258259Only if the user asks for a full board:260261- One HTML with shot tabs **or** sequential stages timed to each `Duration`262- Still one file unless they request a folder of per-shot previews263- Research once per distinct domain concept (don’t repeat identical searches)264265## Quality bar266267- [ ] HTML file written to disk; browser opened (or clear open instructions)268- [ ] **Fullscreen:** stage fills viewport; Fullscreen API on click/`F`; no scrolling meta under the frame269- [ ] **Space to play:** paused on load; `Space` starts once; no autoplay; no on-stage VO text270- [ ] **Play once:** no loop; end frame held; no auto-replay / Space restart after finish271- [ ] Stage matches prompt subject, camera energy, and aspect272- [ ] Narration concepts analyzed; factual/usage gaps researched when needed273- [ ] **Rich motion:** ≥4 of 5 layers (camera / primary / secondary / light / micro); ≥5 animated properties; ≥3 depth planes274- [ ] **Readable priority:** important code/content → locked camera or local emphasis; no default whole-frame zoom that shrinks text275- [ ] **Typography:** on-stage labels use large clamps (primary ≥~14–20px, secondary ≥~13–17px); no critical 7–11px micro-text276- [ ] Timing follows Duration (setup → development → accent → hold); staggers on lists/UI; not one global fade277- [ ] Visible continuous life after play starts (not a still poster); ambient loops stay subtle278- [ ] Self-contained; no storyboard overwrite; no video API calls279- [ ] Chat stays short: path + shot + research takeaway280281## CLI282283Copy-paste commands: [cli/storyboard-shot-to-html.md](../../../cli/storyboard-shot-to-html.md)