html-ppt — HTML PPT Studio
Author professional HTML presentations as static files. One theme file = one
look. One layout file = one page type. One animation class = one entry effect.
All pages share a token-based design system in assets/base.css.
Install
npx skills add https://github.com/lewislulu/html-ppt-skill
One command, no build. Pure static HTML/CSS/JS with only CDN webfonts.
What the skill gives you
- 36 themes (
assets/themes/*.css) — minimal-white, editorial-serif, soft-pastel, sharp-mono, arctic-cool, sunset-warm, catppuccin-latte/mocha, dracula, tokyo-night, nord, solarized-light, gruvbox-dark, rose-pine, neo-brutalism, glassmorphism, bauhaus, swiss-grid, terminal-green, xiaohongshu-white, rainbow-gradient, aurora, blueprint, memphis-pop, cyberpunk-neon, y2k-chrome, retro-tv, japanese-minimal, vaporwave, midcentury, corporate-clean, academic-paper, news-broadcast, pitch-deck-vc, magazine-bold, engineering-whiteprint
- 15 full-deck templates (
templates/full-decks/<name>/) — complete multi-slide decks with scoped .tpl-<name> CSS. 8 extracted from real-world decks (xhs-white-editorial, graphify-dark-graph, knowledge-arch-blueprint, hermes-cyber-terminal, obsidian-claude-gradient, testing-safety-alert, xhs-pastel-card, dir-key-nav-minimal), 7 scenario scaffolds (pitch-deck, product-launch, tech-sharing, weekly-report, xhs-post 3:4, course-module, presenter-mode-reveal — 演讲者模式专用)
- 31 layouts (
templates/single-page/*.html) with realistic demo data
- 27 CSS animations (
assets/animations/animations.css) via data-anim
- 20 canvas FX animations (
assets/animations/fx/*.js) via data-fx — particle-burst, confetti-cannon, firework, starfield, matrix-rain, knowledge-graph (force-directed), neural-net (pulses), constellation, orbit-ring, galaxy-swirl, word-cascade, letter-explode, chain-react, magnetic-field, data-stream, gradient-blob, sparkle-trail, shockwave, typewriter-multi, counter-explosion
- Keyboard runtime (
assets/runtime.js) — arrows, T (theme), A (anim), F/O, S (presenter mode: magnetic-card popup with CURRENT / NEXT / SCRIPT / TIMER cards), N (notes drawer), R (reset timer in presenter)
- FX runtime (
assets/animations/fx-runtime.js) — auto-inits [data-fx] on slide enter, cleans up on leave
- Showcase decks for themes / layouts / animations / full-decks gallery
- Managed Chromium render script for PNG export
When to use
Use when the user asks for any kind of slide-based output or wants to turn
text/notes into a presentable deck. Prefer this over building from scratch.
🎤 Presenter Mode (演讲者模式 + 逐字稿)
If the user mentions any of: 演讲 / 分享 / 讲稿 / 逐字稿 / speaker notes / presenter view / 演讲者视图 / 提词器, or says things like "我要去给团队讲 xxx", "要做一场技术分享", "怕讲不流畅", "想要一份带逐字稿的 PPT" — use the presenter-mode-reveal full-deck template and write 150–300 words of 逐字稿 in each slide's <aside class="notes">.
See references/presenter-mode.md for the full authoring guide including the 3 rules of speaker script writing:
- 不是讲稿,是提示信号 — 加粗核心词 + 过渡句独立成段
- 每页 150–300 字 — 2–3 分钟/页的节奏
- 用口语,不用书面语 — "因此"→"所以","该方案"→"这个方案"
All full-deck templates support the S key presenter mode (it's built into runtime.js). S opens a new popup window with 4 magnetic cards:
- 🔵 CURRENT — pixel-perfect iframe preview of the current slide
- 🟣 NEXT — pixel-perfect iframe preview of the next slide
- 🟠 SPEAKER SCRIPT — large-font 逐字稿 (scrollable)
- 🟢 TIMER — elapsed time + slide counter + prev/next/reset buttons
Each card is draggable by its header and resizable by the bottom-right corner handle. Card positions/sizes persist to localStorage per deck. A "Reset layout" button restores the default arrangement.
Why the previews are pixel-perfect: each preview is an <iframe> that loads the actual deck HTML with a ?preview=N query param; runtime.js detects this and renders only slide N with no chrome. So the preview uses the same CSS, theme, fonts, and viewport as the audience view — colors and layout are guaranteed identical.
Smooth navigation: on slide change, the presenter window sends postMessage({type:'preview-goto', idx:N}) to each iframe. The iframe just toggles .is-active between slides — no reload, no flicker. The two windows also stay in sync via BroadcastChannel.
Only presenter-mode-reveal is designed from the ground up around the feature with proper example 逐字稿 on every slide.
Keyboard in presenter window: ← → navigate (syncs audience) · R reset timer · Esc close popup.
Keyboard in audience window: S open presenter · T cycle theme · ← → navigate (syncs presenter) · F fullscreen · O overview.
Before you author anything — infer first, ask only when blocked
Before writing slides, resolve the three decisions below from the user's brief,
project metadata, supplied content, and conversation. If they are sufficiently
clear, choose a tasteful default and proceed without waiting for confirmation;
state the choices briefly in the plan. Ask one consolidated clarification only
when a missing answer would materially change the deck.
- Content & audience. What's the deck about, how many slides, who's
watching (engineers / execs / 小红书读者 / 学生 / VC)?
- Style / theme. Which of the 36 themes fits? If unsure, recommend 2-3
candidates based on tone:
- Business / investor pitch →
pitch-deck-vc, corporate-clean, swiss-grid
- Tech sharing / engineering →
tokyo-night, dracula, catppuccin-mocha,
terminal-green, blueprint
- 小红书图文 →
xiaohongshu-white, soft-pastel, rainbow-gradient,
magazine-bold
- Academic / report →
academic-paper, editorial-serif, minimal-white
- Edgy / cyber / launch →
cyberpunk-neon, vaporwave, y2k-chrome,
neo-brutalism
- Starting point. One of the 14 full-deck templates, or scratch? Choose
the closest
templates/full-decks/<name>/. If the
user's content suggests something obvious (e.g. "我要做产品发布会" →
product-launch), use it confidently instead of asking blindly.
A good clarification, when one is actually needed, follows the active
discovery-question-form protocol and contains only unresolved fields. For
example, if content and audience are known but the requested tone spans
incompatible themes, ask one theme question with 2–3 recommended options. Do
not repeat the form as a markdown checklist.
If the known context already resolves them, scaffold the deck and start writing
immediately.
Quick start
- Scaffold a new deck. From the repo root:
./scripts/new-deck.sh my-talk
open examples/my-talk/index.html
- Pick a theme. Open the deck and press
T to cycle. Or hard-code it:<link rel="stylesheet" id="theme-link" href="../assets/themes/aurora.css">
Catalog in references/themes.md.
- Pick layouts. Copy
<section class="slide">...</section> blocks out of
files in templates/single-page/ into your deck. Replace the demo data.
Catalog in references/layouts.md.
- Add animations. Put
data-anim="fade-up" (or class="anim-fade-up") on
any element. On <ul>/grids, use anim-stagger-list for sequenced reveals.
For canvas FX, use <div data-fx="knowledge-graph">...</div> and include
<script src="../assets/animations/fx-runtime.js"></script>.
Catalog in references/animations.md.
- Use a full-deck template. Copy
templates/full-decks/<name>/ into
examples/my-talk/ as a starting point. Each folder is self-contained with
scoped CSS. Catalog in references/full-decks.md
and gallery at templates/full-decks-index.html.
- Render to PNG.
./scripts/render.sh templates/theme-showcase.html # one shot
./scripts/render.sh examples/my-talk/index.html 12 # 12 slides
Authoring rules (important)
- Always start from a template. Don't author slides from scratch — copy the
closest layout from
templates/single-page/ first, then replace content.
- Use tokens, not literal colors. Every color, radius, shadow should come
from CSS variables defined in
assets/base.css and overridden by a theme.
Good: color: var(--text-1). Bad: color: #111.
- Don't invent new layout files. Prefer composing existing ones. Only add
a new
templates/single-page/*.html if none of the 30 fit.
- Respect chrome slots.
.deck-header, .deck-footer, .slide-number
and the progress bar are provided by assets/base.css + runtime.js.
- Keyboard-first. Always include
<script src="../assets/runtime.js"></script>
so the deck supports ← → / T / A / F / S / O / hash deep-links.
- One
.slide per logical page. runtime.js makes .slide.is-active
visible; all others are hidden.
- Supply notes. Wrap speaker notes in
<div class="notes">…</div> inside
each slide. Press S to open the overlay.
- NEVER put presenter-only text on the slide itself. Descriptive text like
"这一页展示了……" or "Speaker: 这里可以补充……" or small explanatory captions
aimed at the presenter MUST go inside
<div class="notes">, NOT as visible
<p> / <span> elements on the slide. The .notes class is display:none
by default — it only appears in the S overlay. Slides should contain ONLY
audience-facing content (titles, bullet points, data, charts, images).
Writing guide
See references/authoring-guide.md for a
step-by-step walkthrough: file structure, naming, how to transform an outline
into a deck, how to choose layouts and themes per audience, how to do a
Chinese + English deck, and how to export.
Catalogs (load when needed)
- references/themes.md — all 36 themes with when-to-use.
- references/layouts.md — all 31 layout types.
- references/animations.md — 27 CSS + 20 canvas FX animations.
- references/full-decks.md — all 15 full-deck templates.
- references/presenter-mode.md — 演讲者模式 + 逐字稿编写指南(技术分享/演讲必看).
- references/authoring-guide.md — full workflow.
File structure
html-ppt/
├── SKILL.md (this file)
├── references/ (detailed catalogs, load as needed)
├── assets/
│ ├── base.css (tokens + primitives — do not edit per deck)
│ ├── fonts.css (webfont imports)
│ ├── runtime.js (keyboard + presenter + overview + theme cycle)
│ ├── themes/*.css (36 token overrides, one per theme)
│ └── animations/
│ ├── animations.css (27 named CSS entry animations)
│ ├── fx-runtime.js (auto-init [data-fx] on slide enter)
│ └── fx/*.js (20 canvas FX modules: particles/graph/fireworks…)
├── templates/
│ ├── deck.html (minimal 6-slide starter)
│ ├── theme-showcase.html (36 slides, iframe-isolated per theme)
│ ├── layout-showcase.html (iframe tour of all 31 layouts)
│ ├── animation-showcase.html (20 FX + 27 CSS animation slides)
│ ├── full-decks-index.html (gallery of all 14 full-deck templates)
│ ├── full-decks/<name>/ (14 scoped multi-slide deck templates)
│ └── single-page/*.html (31 layout files with demo data)
├── scripts/
│ ├── new-deck.sh (scaffold a deck from deck.html)
│ └── render.sh (managed Chromium → PNG)
└── examples/demo-deck/ (complete working deck)
Rendering to PNG
scripts/render.sh uses Playwright's managed Chromium renderer. Do not call the
user's installed Google Chrome directly for PNG export, especially on macOS
desktop builds where Crashpad/profile permissions can abort Chrome before a
screenshot is written. If the managed renderer fails once, surface that error
and stop instead of retrying alternate Chrome launch commands.
For multi-slide capture, runtime.js exposes #/N deep-links, and render.sh
iterates 1..N.
./scripts/render.sh templates/single-page/kpi-grid.html # single page
./scripts/render.sh examples/demo-deck/index.html 8 out-dir # 8 slides, custom dir
Keyboard cheat sheet
← → Space PgUp PgDn Home End navigate
F fullscreen
S open presenter window (magnetic cards: current/next/script/timer)
N quick notes drawer (bottom overlay)
R reset timer (in presenter window)
?preview=N URL param — force preview-only mode (single slide, no chrome)
O slide overview grid
T cycle themes (reads data-themes attr)
A cycle demo animation on current slide
#/N in URL deep-link to slide N
Esc close all overlays
License & author
MIT. Copyright (c) 2026 lewis <sudolewis@gmail.com>.
1---2name: html-ppt3description: For consulting delivery work: turn diagnosis, frameworks, and project work into a client-adoptable action plan. Built around the core query "consulting-final-deck", with engagement manager judgment, buyer-ready proof, and this outcome: accept the recommendation and commit owners to the roadmap.4---5
6# html-ppt — HTML PPT Studio
7
8Author professional HTML presentations as static files. One theme file = one
9look. One layout file = one page type. One animation class = one entry effect.
10All pages share a token-based design system in `assets/base.css`.
11
12## Install
13
14```bash
15npx skills add https://github.com/lewislulu/html-ppt-skill
16```
17
18One command, no build. Pure static HTML/CSS/JS with only CDN webfonts.
19
20## What the skill gives you
21
22- **36 themes** (`assets/themes/*.css`) — minimal-white, editorial-serif, soft-pastel, sharp-mono, arctic-cool, sunset-warm, catppuccin-latte/mocha, dracula, tokyo-night, nord, solarized-light, gruvbox-dark, rose-pine, neo-brutalism, glassmorphism, bauhaus, swiss-grid, terminal-green, xiaohongshu-white, rainbow-gradient, aurora, blueprint, memphis-pop, cyberpunk-neon, y2k-chrome, retro-tv, japanese-minimal, vaporwave, midcentury, corporate-clean, academic-paper, news-broadcast, pitch-deck-vc, magazine-bold, engineering-whiteprint
23- **15 full-deck templates** (`templates/full-decks/<name>/`) — complete multi-slide decks with scoped `.tpl-<name>` CSS. 8 extracted from real-world decks (xhs-white-editorial, graphify-dark-graph, knowledge-arch-blueprint, hermes-cyber-terminal, obsidian-claude-gradient, testing-safety-alert, xhs-pastel-card, dir-key-nav-minimal), 7 scenario scaffolds (pitch-deck, product-launch, tech-sharing, weekly-report, xhs-post 3:4, course-module, **presenter-mode-reveal** — 演讲者模式专用)
24- **31 layouts** (`templates/single-page/*.html`) with realistic demo data
25- **27 CSS animations** (`assets/animations/animations.css`) via `data-anim`
26- **20 canvas FX animations** (`assets/animations/fx/*.js`) via `data-fx` — particle-burst, confetti-cannon, firework, starfield, matrix-rain, knowledge-graph (force-directed), neural-net (pulses), constellation, orbit-ring, galaxy-swirl, word-cascade, letter-explode, chain-react, magnetic-field, data-stream, gradient-blob, sparkle-trail, shockwave, typewriter-multi, counter-explosion
27- **Keyboard runtime** (`assets/runtime.js`) — arrows, T (theme), A (anim), F/O, **S (presenter mode: magnetic-card popup with CURRENT / NEXT / SCRIPT / TIMER cards)**, N (notes drawer), R (reset timer in presenter)
28- **FX runtime** (`assets/animations/fx-runtime.js`) — auto-inits `[data-fx]` on slide enter, cleans up on leave
29- **Showcase decks** for themes / layouts / animations / full-decks gallery
30- **Managed Chromium render script** for PNG export
31
32## When to use
33
34Use when the user asks for any kind of slide-based output or wants to turn
35text/notes into a presentable deck. Prefer this over building from scratch.
36
37### 🎤 Presenter Mode (演讲者模式 + 逐字稿)
38
39If the user mentions any of: **演讲 / 分享 / 讲稿 / 逐字稿 / speaker notes / presenter view / 演讲者视图 / 提词器**, or says things like "我要去给团队讲 xxx", "要做一场技术分享", "怕讲不流畅", "想要一份带逐字稿的 PPT" — **use the `presenter-mode-reveal` full-deck template** and write 150–300 words of 逐字稿 in each slide's `<aside class="notes">`.
40
41See [references/presenter-mode.md](references/presenter-mode.md) for the full authoring guide including the 3 rules of speaker script writing:
421. **不是讲稿,是提示信号** — 加粗核心词 + 过渡句独立成段
432. **每页 150–300 字** — 2–3 分钟/页的节奏
443. **用口语,不用书面语** — "因此"→"所以","该方案"→"这个方案"
45
46All full-deck templates support the S key presenter mode (it's built into `runtime.js`). **S opens a new popup window with 4 magnetic cards**:
47- 🔵 **CURRENT** — pixel-perfect iframe preview of the current slide
48- 🟣 **NEXT** — pixel-perfect iframe preview of the next slide
49- 🟠 **SPEAKER SCRIPT** — large-font 逐字稿 (scrollable)
50- 🟢 **TIMER** — elapsed time + slide counter + prev/next/reset buttons
51
52Each card is **draggable by its header** and **resizable by the bottom-right corner handle**. Card positions/sizes persist to `localStorage` per deck. A "Reset layout" button restores the default arrangement.
53
54**Why the previews are pixel-perfect**: each preview is an `<iframe>` that loads the actual deck HTML with a `?preview=N` query param; `runtime.js` detects this and renders only slide N with no chrome. So the preview uses the **same CSS, theme, fonts, and viewport as the audience view** — colors and layout are guaranteed identical.
55
56**Smooth navigation**: on slide change, the presenter window sends `postMessage({type:'preview-goto', idx:N})` to each iframe. The iframe just toggles `.is-active` between slides — **no reload, no flicker**. The two windows also stay in sync via `BroadcastChannel`.
57
58Only `presenter-mode-reveal` is designed from the ground up around the feature with proper example 逐字稿 on every slide.
59
60Keyboard in presenter window: `← →` navigate (syncs audience) · `R` reset timer · `Esc` close popup.
61Keyboard in audience window: `S` open presenter · `T` cycle theme · `← →` navigate (syncs presenter) · `F` fullscreen · `O` overview.
62
63## Before you author anything — infer first, ask only when blocked
64
65Before writing slides, resolve the three decisions below from the user's brief,
66project metadata, supplied content, and conversation. If they are sufficiently
67clear, choose a tasteful default and proceed without waiting for confirmation;
68state the choices briefly in the plan. Ask one consolidated clarification only
69when a missing answer would materially change the deck.
70
711. **Content & audience.** What's the deck about, how many slides, who's
72 watching (engineers / execs / 小红书读者 / 学生 / VC)?
732. **Style / theme.** Which of the 36 themes fits? If unsure, recommend 2-3
74 candidates based on tone:
75 - Business / investor pitch → `pitch-deck-vc`, `corporate-clean`, `swiss-grid`
76 - Tech sharing / engineering → `tokyo-night`, `dracula`, `catppuccin-mocha`,
77 `terminal-green`, `blueprint`
78 - 小红书图文 → `xiaohongshu-white`, `soft-pastel`, `rainbow-gradient`,
79 `magazine-bold`
80 - Academic / report → `academic-paper`, `editorial-serif`, `minimal-white`
81 - Edgy / cyber / launch → `cyberpunk-neon`, `vaporwave`, `y2k-chrome`,
82 `neo-brutalism`
833. **Starting point.** One of the 14 full-deck templates, or scratch? Choose
84 the closest `templates/full-decks/<name>/`. If the
85 user's content suggests something obvious (e.g. "我要做产品发布会" →
86 `product-launch`), use it confidently instead of asking blindly.
87
88A good clarification, when one is actually needed, follows the active
89`discovery-question-form` protocol and contains only unresolved fields. For
90example, if content and audience are known but the requested tone spans
91incompatible themes, ask one theme question with 2–3 recommended options. Do
92not repeat the form as a markdown checklist.
93
94If the known context already resolves them, scaffold the deck and start writing
95immediately.
96
97## Quick start
98
991. **Scaffold a new deck.** From the repo root:
100 ```bash
101 ./scripts/new-deck.sh my-talk
102 open examples/my-talk/index.html
103 ```
1042. **Pick a theme.** Open the deck and press `T` to cycle. Or hard-code it:
105 ```html
106 <link rel="stylesheet" id="theme-link" href="../assets/themes/aurora.css">
107 ```
108 Catalog in [references/themes.md](references/themes.md).
1093. **Pick layouts.** Copy `<section class="slide">...</section>` blocks out of
110 files in `templates/single-page/` into your deck. Replace the demo data.
111 Catalog in [references/layouts.md](references/layouts.md).
1124. **Add animations.** Put `data-anim="fade-up"` (or `class="anim-fade-up"`) on
113 any element. On `<ul>`/grids, use `anim-stagger-list` for sequenced reveals.
114 For canvas FX, use `<div data-fx="knowledge-graph">...</div>` and include
115 `<script src="../assets/animations/fx-runtime.js"></script>`.
116 Catalog in [references/animations.md](references/animations.md).
1175. **Use a full-deck template.** Copy `templates/full-decks/<name>/` into
118 `examples/my-talk/` as a starting point. Each folder is self-contained with
119 scoped CSS. Catalog in [references/full-decks.md](references/full-decks.md)
120 and gallery at `templates/full-decks-index.html`.
1216. **Render to PNG.**
122 ```bash
123 ./scripts/render.sh templates/theme-showcase.html # one shot
124 ./scripts/render.sh examples/my-talk/index.html 12 # 12 slides
125 ```
126
127## Authoring rules (important)
128
129- **Always start from a template.** Don't author slides from scratch — copy the
130 closest layout from `templates/single-page/` first, then replace content.
131- **Use tokens, not literal colors.** Every color, radius, shadow should come
132 from CSS variables defined in `assets/base.css` and overridden by a theme.
133 Good: `color: var(--text-1)`. Bad: `color: #111`.
134- **Don't invent new layout files.** Prefer composing existing ones. Only add
135 a new `templates/single-page/*.html` if none of the 30 fit.
136- **Respect chrome slots.** `.deck-header`, `.deck-footer`, `.slide-number`
137 and the progress bar are provided by `assets/base.css` + `runtime.js`.
138- **Keyboard-first.** Always include `<script src="../assets/runtime.js"></script>`
139 so the deck supports ← → / T / A / F / S / O / hash deep-links.
140- **One `.slide` per logical page.** `runtime.js` makes `.slide.is-active`
141 visible; all others are hidden.
142- **Supply notes.** Wrap speaker notes in `<div class="notes">…</div>` inside
143 each slide. Press S to open the overlay.
144- **NEVER put presenter-only text on the slide itself.** Descriptive text like
145 "这一页展示了……" or "Speaker: 这里可以补充……" or small explanatory captions
146 aimed at the presenter MUST go inside `<div class="notes">`, NOT as visible
147 `<p>` / `<span>` elements on the slide. The `.notes` class is `display:none`
148 by default — it only appears in the S overlay. Slides should contain ONLY
149 audience-facing content (titles, bullet points, data, charts, images).
150
151## Writing guide
152
153See [references/authoring-guide.md](references/authoring-guide.md) for a
154step-by-step walkthrough: file structure, naming, how to transform an outline
155into a deck, how to choose layouts and themes per audience, how to do a
156Chinese + English deck, and how to export.
157
158## Catalogs (load when needed)
159
160- [references/themes.md](references/themes.md) — all 36 themes with when-to-use.
161- [references/layouts.md](references/layouts.md) — all 31 layout types.
162- [references/animations.md](references/animations.md) — 27 CSS + 20 canvas FX animations.
163- [references/full-decks.md](references/full-decks.md) — all 15 full-deck templates.
164- [references/presenter-mode.md](references/presenter-mode.md) — **演讲者模式 + 逐字稿编写指南(技术分享/演讲必看)**.
165- [references/authoring-guide.md](references/authoring-guide.md) — full workflow.
166
167## File structure
168
169```
170html-ppt/
171├── SKILL.md (this file)
172├── references/ (detailed catalogs, load as needed)
173├── assets/
174│ ├── base.css (tokens + primitives — do not edit per deck)
175│ ├── fonts.css (webfont imports)
176│ ├── runtime.js (keyboard + presenter + overview + theme cycle)
177│ ├── themes/*.css (36 token overrides, one per theme)
178│ └── animations/
179│ ├── animations.css (27 named CSS entry animations)
180│ ├── fx-runtime.js (auto-init [data-fx] on slide enter)
181│ └── fx/*.js (20 canvas FX modules: particles/graph/fireworks…)
182├── templates/
183│ ├── deck.html (minimal 6-slide starter)
184│ ├── theme-showcase.html (36 slides, iframe-isolated per theme)
185│ ├── layout-showcase.html (iframe tour of all 31 layouts)
186│ ├── animation-showcase.html (20 FX + 27 CSS animation slides)
187│ ├── full-decks-index.html (gallery of all 14 full-deck templates)
188│ ├── full-decks/<name>/ (14 scoped multi-slide deck templates)
189│ └── single-page/*.html (31 layout files with demo data)
190├── scripts/
191│ ├── new-deck.sh (scaffold a deck from deck.html)
192│ └── render.sh (managed Chromium → PNG)
193└── examples/demo-deck/ (complete working deck)
194```
195
196## Rendering to PNG
197
198`scripts/render.sh` uses Playwright's managed Chromium renderer. Do not call the
199user's installed Google Chrome directly for PNG export, especially on macOS
200desktop builds where Crashpad/profile permissions can abort Chrome before a
201screenshot is written. If the managed renderer fails once, surface that error
202and stop instead of retrying alternate Chrome launch commands.
203
204For multi-slide capture, runtime.js exposes `#/N` deep-links, and render.sh
205iterates 1..N.
206
207```bash
208./scripts/render.sh templates/single-page/kpi-grid.html # single page
209./scripts/render.sh examples/demo-deck/index.html 8 out-dir # 8 slides, custom dir
210```
211
212## Keyboard cheat sheet
213
214```
215← → Space PgUp PgDn Home End navigate
216F fullscreen
217S open presenter window (magnetic cards: current/next/script/timer)
218N quick notes drawer (bottom overlay)
219R reset timer (in presenter window)
220?preview=N URL param — force preview-only mode (single slide, no chrome)
221O slide overview grid
222T cycle themes (reads data-themes attr)
223A cycle demo animation on current slide
224#/N in URL deep-link to slide N
225Esc close all overlays
226```
227
228## License & author
229
230MIT. Copyright (c) 2026 lewis <sudolewis@gmail.com>.