Loading...
Loading...
Generate "image + text" style visual PPT decks (evangelism / internal sharing / client-facing) using an HTML→PPTX pipeline with safe-zone typography, Nano Banana backgrounds, and overflow-to-notes discipline. Use this when the user needs a visually dense, cinematic slide deck where the layout is image-driven rather than text-driven. NOT suitable for pure data reports or text-heavy documents.
npx skill4agent add crazynomad/skills visual-deckslide.addNotes()references/safe-zone-spec.mdDescription / Composition / Style / Do not includereferences/image-prompts-v2.mdreferences/nano-banana-ratios.mdimage-prompts.md notes-map.js
│ │
▼ (Nano Banana) ▼
images/*.png 溢出文案映射
│ │
▼ (tools/scrim-bake.js) │
images/*-scrimmed.png │
│ │
▼ (CSS background) │
slides/*.html ──────────────► html2pptx.js ──► pptx
│
▼ preview
player.html + tools/check-overflow.js| File | Purpose | Editable? |
|---|---|---|
| HTML→PPTX renderer, handles positioning/text/images/shapes/overflow detection | No |
| Build entry point. Supports | Yes (modify metadata: title/author/file name) |
| Dependency-free HTML player with keyboard navigation, fullscreen, and thumbnails | Optional (fill TITLES for thumbnail display) |
| Uses Sharp to bake scrim masks into background PNGs (HTML2PPTX doesn't recognize CSS gradients) | Yes (fill PAIRS array per project) |
| Uses Playwright to verify each slide ≤ 540px (preview level) | No |
| Scans for | No |
| Theme tokens — | Yes (modify only this file to change themes) |
| Layout skeleton library (see decision tree below) | Yes (copy and fill in content) |
| Overflow content mapping | Yes (fill as needed) |
| Dependencies (playwright / pptxgenjs / sharp) | No |
| Required Reading · Valid HTML/CSS subset + common error fixes | No |
问 1:这页是章节边界 / 封面 / 封底吗?
是 → slide-cover.html (HF)
否 → 继续
问 2:这页只有一句金句(≤40 字),别的都稀释它?
是 → slide-quote.html
否 → 继续
问 3:这页是"数字说话"(KPI / 成绩单 / 市场数据)?
是 → 只有一个核心数字?
是 → slide-quote.html(把数字放大成金句)
否(3~4 个并列数字)→ slide-stats.html
否 → 继续
问 4:这页是"按时间/阶段讲流程"?
是 → slide-timeline.html(3~5 个节点)
否 → 继续
问 5:这页是"对比/并列"?
是 → 几项?
2 项 → slide-2col.html(before/after, A/B)
3 项 → slide-3col.html(三段论)
4+ → 拆页或 stats
否 → 继续(下面是默认主力)
问 6:有一个核心视觉隐喻 + 2~4 条要点?
是 → 前后页已连续 r34 两次?
是 → slide-l34.html(换方向打破节奏)
否 → slide-r34.html(默认)
否 → 停下来想想这页要讲什么,版式够不够(不够再扩)
每次选完问自己:
- 前后三页是否都是同一个版式?→ 考虑切镜像或换 layout
- quote 页是否超过 3 页?→ 金句稀释了,降级成 r34| Layout | Use Case | Key Signals |
|---|---|---|
| Full-screen HF, for covers/section dividers/back covers | Has background image + large title |
| Centered key quote | Single sentence, ≤40 characters |
| 2×2 grid of numbers | 3~4 parallel KPIs |
| Horizontal timeline | 3~5 stages/nodes |
| Two-column comparison | Binary comparison (A/B) |
| Three-column parallel | Three-part argument / three types of X |
| Right image + left text (main layout) | One argument + 2~4 bullet points |
| Left image + right text (mirror) | Same as r34, just reversed direction |
USE WHENDO NOT USE WHENreferences/html2pptx-contract.mdtemplates/layouts/templates/player.htmlnode tools/check-overflow.jsimage-prompts.mdimages/tools/scrim-bake.jsnode tools/scrim-bake.js*-scrimmed.pngnode build.js --lintnode tools/fix-html-for-pptx.js<p><div><p>node build.jsreferences/html2pptx-contract.mdtools/scrim-bake.jsmargin-*<span>padding-*display: block<p><p><h1-6><ul>backgroundborder*box-shadow<div class="X"><p>...</p></div>tools/fix-html-for-pptx.js<div><p><p>*-•--lint720pt × 405pthtml2pptx.jsbuild.jsfs.readdirSync('slides/')templates/themes/*.css<link rel="stylesheet" href="../themes/<theme>.css"><style>var(--xxx)dark-coral.cssdark-teal.css<link>theme.css--bg / --fg / --muted / --dim / --faint--accent / --accent-2--font-sans--fs-hero/title/subtitle/lede/body/label/source--pad-slide / --pad-r34 / --pad-l34--scrim-base / --scrim-left / --scrim-heavyexamples/minimal/npm installnode build.jsnode tools/check-overflow.js # 1. 540px preview 硬边界
node build.js --lint # 2. 契约完整校验(所有违规一次列齐)
node build.js # 3. 真正出 pptx