Slide Maker
Make presentation slides that look genuinely impressive and stay on-brand — from a
single slide to a full deck, with a review loop and HTML/PDF/PPTX export. The skill
ships everything: a token-driven design kit, a craft guide, a slop validator, a
ready-made React deck, edit-mode collaboration, and the exporters. It works with
whatever design system the deck needs — yours, a suggested one, or a neutral default.
It works as job-specific workflows. Figure out which job the user is on (below),
then open that workflow file and follow it. The natural order is
brainstorm → generate → export, but the user can jump straight to any step (e.g. "export
this deck to PDF" on a deck that already exists).
Pick the workflow
| The user wants to… |
Workflow |
| figure out what the deck should say / its structure (vague idea, "I need a deck for X") |
slide-brainstorm |
| build the actual slides and iterate on them (generate, review, revise) |
slide-generate |
| get an editable PowerPoint (recipient edits text/shapes) |
export-editable-pptx |
| get a pixel-perfect, view-only PowerPoint |
export-image-pptx |
| get a single self-contained HTML file (opens offline) |
export-standalone-html |
| get a PDF (print/handout) |
export-pdf |
brainstorm ──▶ generate ──▶ ┬─▶ editable PPTX
(idea→skeleton) (HTML deck, ├─▶ image PPTX
review loop) ├─▶ standalone HTML
└─▶ PDF
Each workflow ends by pointing to the next. If a request is ambiguous about which job,
ask one quick question rather than guessing — brainstorming a deck and exporting one are
very different work. If the user's idea is still vague and they ask to "make slides,"
start at brainstorm (don't generate from an unexamined idea).
Resolve the design system (run at the START of brainstorm/generate)
The layouts are token-driven: color, type, and spacing come from a theme file, never
from hardcoded values in the slides. Before you build anything, resolve which design
system supplies those tokens. Run this flow in order and stop at the first branch
that applies:
- Ask the user if they have their own design system / brand tokens. If yes → map its
colors/type/spacing into the token contract by writing them into
design-system/themes/clean-light.css (or a new theme file that the entry point
imports). Layouts never change; only the theme file's token values do.
- Else, check if
nextlevelbuilder/ui-ux-pro-max-skill is installed. If yes → invoke
it to suggest the best-fit design system for the deck's content/idea, then map that
suggestion into the theme file.
- Else, recommend it and guide a permanent install from
https://github.com/nextlevelbuilder/ui-ux-pro-max-skill — this is the preferred
path.
- Else (user won't install permanently): ASK FIRST, then do a shallow
git clone https://github.com/nextlevelbuilder/ui-ux-pro-max-skill into /tmp, use it
for THIS TURN ONLY, and do not persist it into the skill or the user's project.
Never run this network fetch without explicit consent — always ask before cloning.
- Else (user declines the fetch too): use the bundled
clean-light theme.
clean-light is the guaranteed floor — the flow always ends in a working theme, so
the skill never blocks. Whatever the outcome, the active theme file is the single source
of truth for color/type: read it, and write token values into it rather than hardcoding
into layouts.
Choose where to write the deck (start of generate)
Before scaffolding, ask the user where the deck should live. Propose a default and
let them override:
- Default output dir:
./slides/<deck-name>/ in the user's current project.
- Exports:
./slides/<deck-name>/export/.
- Copy the
deck-template/ scaffold to that location — NOT into the skill directory.
This keeps the skill install clean and lets multiple decks coexist side by side. The
skill's own deck-template/ is a pristine template; the working copy lives in the
user's project.
The other use: supply only the design layer
This skill can also feed just the design layer (tokens, components, patterns) to a
different slide generator (e.g. slides-generator). That generator runs its own
workflow but pulls its theme from here instead of picking a generic vibe:
- React + Tailwind → drop the theme block from
tailwind-theme.md into
tailwind.config.js and import
the active font. Then the Tailwind utilities resolve to the active design system's tokens.
- Plain HTML/CSS → link
<skill>/design-system/styles.css; style with the CSS custom
properties it exposes (e.g. var(--fs-h1), var(--space-8), the theme's color tokens),
never with literal hex values.
Design kit (the source of truth — read these, don't guess)
Ships inside this skill, so it's standalone:
<skill>/design-system/
├── styles.css ← token entry point (imports tokens + the active theme; link for HTML slides)
├── tokens/ ← colors, typography, spacing, fonts — THE source of truth
├── themes/clean-light.css ← the active theme (bundled neutral default; the guaranteed floor)
├── slides/*.html ← 34 premade slide layouts (the catalog)
└── assets/logos/ ← mark.svg, logo-full.svg (neutral placeholders; swap for the deck's real logos)
The active theme file wins for color/type. If a layout appears to disagree with the
tokens, the tokens/theme win — open and read them. Never hardcode a hex or a font into a
layout; change the theme file instead.
Craft rules (apply in every workflow, regardless of who's driving)
- The active design system is the source of truth for color and type. Layouts are
token-driven — never hardcode a hex or a font. Change the theme file's token values,
not the layouts. If unsure of a value, read
<skill>/design-system/tokens/ and the
active theme.
- Default font is a system stack. The PPTX exporter embeds Inter (SIL OFL) so the
editable output renders consistently on machines that lack the deck's fonts.
- One focal point, real whitespace. Every slide: one hero dominates, a clear
eyebrow→title→rule→body rhythm, ≥35% whitespace, calm motion. Depth and restraint over
decoration. Not every slide needs a heavy full-bleed treatment — reserve those for
dividers, section rails, and the close, so they carry weight by contrast.
- Make it wow, not just compliant. On-brand ≠ impressive. Wow = restraint + ONE focal
point + depth. The craft guide is the ceiling: wow-guide.md.
The
check-slop.mjs validator is the floor.
- "Done" = the user's request restated as a passing test, shown with numbers. Not "I'm
fairly sure" / "looks right now." Write the acceptance criterion in the user's words
before fixing ("align arena with last step" →
arena.bottom == step.bottom ±2px AND footer.bottom ≤ 648), and only claim done when it provably passes. If two requirements
conflict (align A to B and keep the footer in-frame ⇒ content too tall), say so and
propose the trade — don't ship an overlap and call it done.
Verification — three checks, each blind to what the next one catches
Run all three; doing more of one never substitutes for another.
| Trigger |
Do this |
Catches what the others miss |
| You rendered slides |
LOOK — batch subagents over the PNGs, a few slides each |
A hero gone tiny, a clipped chip, lost rounding. Checkers verify only what they were told to; the gate passing is exactly when drift hides. |
| Request says align / same height / equal / overlap / fit / edge / below / above / touching / clipped / margin |
MEASURE — inspect.mjs → geometry.json, assert the inequality (y+h ≤ 648, abs(A.bottom − B.bottom) ≤ 2) |
A 10–30px miss, invisible in a full-slide PNG. Numbers beat eyes; report the number, never a vibe. |
| You produced an export file |
DIFF — node scripts/verify-export.mjs, report mean and worst |
Uniform drift (every block a few px low, one column narrow) — plausible on every slide, obvious in the ranked table. |
Inspecting XML, rendering and looking, and re-checking the slides you changed all confirm
the change you meant to make happened. The diff is what finds what you didn't mean to
do. Method, canonical bounds, and layout recipes (no magic-pixel heights;
items-stretch for equal columns; footer in flow with mt-auto):
visual-review.md — the
geometry gate and
reviewing an export.
Reference library (workflows link the ones they need)
| File |
What it covers |
| house-style.md |
The 34 premade layouts, when to use each, token-driven styling, patterns, logo usage |
| wow-guide.md |
Presentation craft: hierarchy, data-viz, depth, motion, density, typography + snippets |
| tailwind-theme.md |
Drop-in tailwind.config.js theme block + the chart-series palette |
| validation.md |
check-slop.mjs: what each check means + the AI-slop tells to self-catch |
| diagrams.md |
When to hand-write an SVG diagram vs. generate it, the conventions that make one readable, a worked example |
| visual-review.md |
LOOK, MEASURE, DIFF — self-reviewing rendered slides, the geometry gate, and reviewing an export against the HTML |
| deck-template.md |
The ready-made React deck shell: structure, dev, edit mode, HTML/PDF/image export |
| edit-mode.md |
The point-and-comment feedback overlay + programmatic inspect API |
| pptx-editable.md |
Editable-PPTX deep dive: measure→OOXML, the validation gate + acknowledgement system, fonts, gotchas |
To render the 34 layout previews for review, use deck-template/scripts/shoot-layouts.mjs.
research/ holds dated proposals that were evaluated but not
built — read one only when deciding whether to take that change on.
1---2name: slide-maker3description: Make impressive, on-brand presentation slides and decks end-to-end, for ANY design system. Use this skill whenever the user wants to brainstorm, build, design, generate, review, or export a slide, deck, presentation, pitch, or company/product/sales deck. It runs as job-specific WORKFLOWS: brainstorm a deck's structure, generate the HTML deck with a review loop, and export to editable PPTX, image PPTX, standalone HTML, or PDF. It is design-system-agnostic — it uses the user's own design system if they have one, a `nextlevelbuilder/ui-ux-pro-max-skill` suggestion if that's installed, or a bundled neutral default theme — and drives everything from design tokens (never hardcoded colors or fonts). It ships a token-driven brand kit (tokens, fonts, logos, 34 premade layouts), a "wow" craft guide, an anti-slop validator, a ready-made React deck template, point-and-comment edit mode, and a validated editable-PPTX pipeline. It can also supply just the design layer (tokens, components, patterns) to another slide generat4---5
6# Slide Maker
7
8Make presentation slides that look genuinely impressive and stay on-brand — from a
9single slide to a full deck, with a review loop and HTML/PDF/PPTX export. The skill
10ships everything: a token-driven design kit, a craft guide, a slop validator, a
11ready-made React deck, edit-mode collaboration, and the exporters. It works with
12**whatever design system the deck needs** — yours, a suggested one, or a neutral default.
13
14**It works as job-specific workflows.** Figure out which job the user is on (below),
15then open that workflow file and follow it. The natural order is
16brainstorm → generate → export, but the user can jump straight to any step (e.g. "export
17this deck to PDF" on a deck that already exists).
18
19## Pick the workflow
20
21| The user wants to… | Workflow |
22|---|---|
23| figure out what the deck should say / its structure (vague idea, "I need a deck for X") | [slide-brainstorm](references/workflows/slide-brainstorm.md) |
24| build the actual slides and iterate on them (generate, review, revise) | [slide-generate](references/workflows/slide-generate.md) |
25| get an **editable** PowerPoint (recipient edits text/shapes) | [export-editable-pptx](references/workflows/export-editable-pptx.md) |
26| get a **pixel-perfect, view-only** PowerPoint | [export-image-pptx](references/workflows/export-image-pptx.md) |
27| get a single self-contained **HTML** file (opens offline) | [export-standalone-html](references/workflows/export-standalone-html.md) |
28| get a **PDF** (print/handout) | [export-pdf](references/workflows/export-pdf.md) |
29
30```
31brainstorm ──▶ generate ──▶ ┬─▶ editable PPTX
32(idea→skeleton) (HTML deck, ├─▶ image PPTX
33 review loop) ├─▶ standalone HTML
34 └─▶ PDF
35```
36Each workflow ends by pointing to the next. If a request is ambiguous about which job,
37ask one quick question rather than guessing — brainstorming a deck and exporting one are
38very different work. If the user's idea is still vague and they ask to "make slides,"
39start at **brainstorm** (don't generate from an unexamined idea).
40
41## Resolve the design system (run at the START of brainstorm/generate)
42
43The layouts are token-driven: color, type, and spacing come from a **theme file**, never
44from hardcoded values in the slides. Before you build anything, resolve which design
45system supplies those tokens. Run this flow **in order** and stop at the first branch
46that applies:
47
481. **Ask the user if they have their own design system / brand tokens.** If yes → map its
49 colors/type/spacing into the token contract by writing them into
50 `design-system/themes/clean-light.css` (or a new theme file that the entry point
51 imports). Layouts never change; only the theme file's token *values* do.
522. **Else, check if `nextlevelbuilder/ui-ux-pro-max-skill` is installed.** If yes → invoke
53 it to suggest the best-fit design system for the deck's content/idea, then map that
54 suggestion into the theme file.
553. **Else, recommend it and guide a permanent install** from
56 `https://github.com/nextlevelbuilder/ui-ux-pro-max-skill` — **this is the preferred
57 path.**
584. **Else (user won't install permanently): ASK FIRST, then** do a shallow
59 `git clone https://github.com/nextlevelbuilder/ui-ux-pro-max-skill` into `/tmp`, use it
60 for **THIS TURN ONLY**, and do **not** persist it into the skill or the user's project.
61 **Never run this network fetch without explicit consent** — always ask before cloning.
625. **Else (user declines the fetch too): use the bundled `clean-light` theme.**
63
64`clean-light` is the **guaranteed floor** — the flow always ends in a working theme, so
65the skill never blocks. Whatever the outcome, the active theme file is the single source
66of truth for color/type: read it, and write token values into it rather than hardcoding
67into layouts.
68
69## Choose where to write the deck (start of generate)
70
71Before scaffolding, **ask the user where the deck should live**. Propose a default and
72let them override:
73
74- **Default output dir:** `./slides/<deck-name>/` in the user's current project.
75- **Exports:** `./slides/<deck-name>/export/`.
76- **Copy the `deck-template/` scaffold to that location — NOT into the skill directory.**
77 This keeps the skill install clean and lets multiple decks coexist side by side. The
78 skill's own `deck-template/` is a pristine template; the working copy lives in the
79 user's project.
80
81## The other use: supply only the design layer
82
83This skill can also feed just the **design layer** (tokens, components, patterns) to a
84*different* slide generator (e.g. `slides-generator`). That generator runs its own
85workflow but pulls its theme from here instead of picking a generic vibe:
86- **React + Tailwind** → drop the theme block from
87 [tailwind-theme.md](references/tailwind-theme.md) into `tailwind.config.js` and import
88 the active font. Then the Tailwind utilities resolve to the active design system's tokens.
89- **Plain HTML/CSS** → link `<skill>/design-system/styles.css`; style with the CSS custom
90 properties it exposes (e.g. `var(--fs-h1)`, `var(--space-8)`, the theme's color tokens),
91 never with literal hex values.
92
93## Design kit (the source of truth — read these, don't guess)
94
95Ships **inside this skill**, so it's standalone:
96```
97<skill>/design-system/
98├── styles.css ← token entry point (imports tokens + the active theme; link for HTML slides)
99├── tokens/ ← colors, typography, spacing, fonts — THE source of truth
100├── themes/clean-light.css ← the active theme (bundled neutral default; the guaranteed floor)
101├── slides/*.html ← 34 premade slide layouts (the catalog)
102└── assets/logos/ ← mark.svg, logo-full.svg (neutral placeholders; swap for the deck's real logos)
103```
104> The **active theme file wins** for color/type. If a layout appears to disagree with the
105> tokens, the tokens/theme win — open and read them. Never hardcode a hex or a font into a
106> layout; change the theme file instead.
107
108## Craft rules (apply in every workflow, regardless of who's driving)
109
110- **The active design system is the source of truth for color and type.** Layouts are
111 **token-driven — never hardcode a hex or a font.** Change the theme file's token values,
112 not the layouts. If unsure of a value, read `<skill>/design-system/tokens/` and the
113 active theme.
114- **Default font is a system stack.** The PPTX exporter embeds **Inter** (SIL OFL) so the
115 editable output renders consistently on machines that lack the deck's fonts.
116- **One focal point, real whitespace.** Every slide: one hero dominates, a clear
117 eyebrow→title→rule→body rhythm, ≥35% whitespace, calm motion. Depth and restraint over
118 decoration. Not every slide needs a heavy full-bleed treatment — reserve those for
119 dividers, section rails, and the close, so they carry weight by contrast.
120- **Make it wow, not just compliant.** On-brand ≠ impressive. Wow = restraint + ONE focal
121 point + depth. The craft guide is the ceiling: [wow-guide.md](references/wow-guide.md).
122 The `check-slop.mjs` validator is the floor.
123- **"Done" = the user's request restated as a passing test, shown with numbers.** Not "I'm
124 fairly sure" / "looks right now." Write the acceptance criterion in the user's words
125 before fixing ("align arena with last step" → `arena.bottom == step.bottom ±2px AND
126 footer.bottom ≤ 648`), and only claim done when it provably passes. If two requirements
127 conflict (align A to B *and* keep the footer in-frame ⇒ content too tall), say so and
128 propose the trade — don't ship an overlap and call it done.
129
130### Verification — three checks, each blind to what the next one catches
131
132Run all three; doing more of one never substitutes for another.
133
134| Trigger | Do this | Catches what the others miss |
135|---|---|---|
136| You rendered slides | **LOOK** — batch subagents over the PNGs, a few slides each | A hero gone tiny, a clipped chip, lost rounding. Checkers verify only what they were told to; the gate passing is exactly when drift hides. |
137| Request says **align / same height / equal / overlap / fit / edge / below / above / touching / clipped / margin** | **MEASURE** — `inspect.mjs` → `geometry.json`, assert the inequality (`y+h ≤ 648`, `abs(A.bottom − B.bottom) ≤ 2`) | A 10–30px miss, invisible in a full-slide PNG. Numbers beat eyes; report the number, never a vibe. |
138| You produced an **export file** | **DIFF** — `node scripts/verify-export.mjs`, report mean and worst | Uniform drift (every block a few px low, one column narrow) — plausible on every slide, obvious in the ranked table. |
139
140Inspecting XML, rendering and looking, and re-checking the slides you changed all confirm
141*the change you meant to make happened*. The diff is what finds what you didn't mean to
142do. Method, canonical bounds, and layout recipes (no magic-pixel heights;
143`items-stretch` for equal columns; footer in flow with `mt-auto`):
144[visual-review.md](references/visual-review.md) — the
145[geometry gate](references/visual-review.md#the-geometry-gate-measure-dont-eyeball) and
146[reviewing an export](references/visual-review.md#reviewing-an-export-is-a-different-job--diff-it-dont-browse-it).
147
148## Reference library (workflows link the ones they need)
149
150| File | What it covers |
151|------|----------------|
152| [house-style.md](references/house-style.md) | The 34 premade layouts, when to use each, token-driven styling, patterns, logo usage |
153| [wow-guide.md](references/wow-guide.md) | Presentation craft: hierarchy, data-viz, depth, motion, density, typography + snippets |
154| [tailwind-theme.md](references/tailwind-theme.md) | Drop-in `tailwind.config.js` theme block + the chart-series palette |
155| [validation.md](references/validation.md) | `check-slop.mjs`: what each check means + the AI-slop tells to self-catch |
156| [diagrams.md](references/diagrams.md) | When to hand-write an SVG diagram vs. generate it, the conventions that make one readable, a worked example |
157| [visual-review.md](references/visual-review.md) | LOOK, MEASURE, DIFF — self-reviewing rendered slides, the geometry gate, and reviewing an export against the HTML |
158| [deck-template.md](references/deck-template.md) | The ready-made React deck shell: structure, dev, edit mode, HTML/PDF/image export |
159| [edit-mode.md](references/edit-mode.md) | The point-and-comment feedback overlay + programmatic inspect API |
160| [pptx-editable.md](references/pptx-editable.md) | Editable-PPTX deep dive: measure→OOXML, the validation gate + acknowledgement system, fonts, gotchas |
161
162> To render the 34 layout previews for review, use `deck-template/scripts/shoot-layouts.mjs`.
163>
164> [`research/`](research/README.md) holds dated proposals that were **evaluated but not
165> built** — read one only when deciding whether to take that change on.