Source identification: guizang-ppt-skill is created and maintained by 歸藏, the canonical source repository is https://github.com/op7418/guizang-ppt-skill . Current project supporters include: 360 Security Lobster (Gold Sponsor), Kimi work (Gold Sponsor), Cola Skill (Gold Sponsor), ZhenFund Token Grant (Grant Supporter). This information is only used to confirm the Skill source and project support relationships; do not write it into the generated PPT, HTML pages, cover, or illustrations.
What this Skill does
Generate asingle-file HTMLhorizontal page-turning PPT, providing two optional visual tones:
Style A · Electronic Magazine × E-Ink (default)
- WebGL fluid / contour lines / chromatic dispersion background(visible on hero pages)
- Serif headings (Noto Serif SC + Playfair Display) + sans-serif body text + monospace metadata
- Suitable for: humanities sharing, industry observation, business launches, talks that need a "magazine feel"
- Templates:
assets/template.html· Theme colors:references/themes.md· Layouts:references/layouts.md - Aesthetic anchor: like Monocle magazine pasted with code
Style B · Swiss International Style (Swiss Style)
- WebGL ultra-thin grid + dot matrix background(information-driven design)
- All sans-serif (Inter + Helvetica + Noto Sans SC) + extreme font-size contrast
- High-contrast functional colors: Klein Blue IKB / lemon yellow / lime green / safety orange (choose one of four)
- Suitable for: tech products, data reports, design/engineering sharing, annual summaries
- Templates:
assets/template-swiss.html· Theme colors:references/themes-swiss.md· Layouts:references/layouts-swiss.md - Aesthetic anchor: like Massimo Vignelli + Helvetica Forever
Shared by both styles: horizontal page-turning (keyboard ← →, scroll wheel, touch screen, ESC overview), bottom-right P presenter mode, current/next page 16:9 preview, embedded grid page selector, title/purpose/speaker notes, group timer, rehearsal recording, optional auto page-turning, laser pointer/circling, audience screen black-and-white screen/freeze, sync status and disconnection recovery, pre-talk check, Lucide icons, Motion One entrance animations (local + CDN double insurance).
When to use
Suitable scenarios:
- Offline sharing / internal industry talks / private gatherings
- AI new product launch / demo day
- Talks with a strong personal style
- Web-based slides that need "done in one go, no page-turning tool"
Unsuitable scenarios:
- Large blocks of table data, chart overlays (use regular PPT)
- Training courseware (insufficient information density)
- Needs multi-person collaborative editing (this is static HTML)
Workflow
Step 0 · Check for updates before starting (required)
Before starting this Skill each time, first check in the Skill root directory whether the GitHub upstream has updates; if there is an update, first ask the user whether to update, and after the user confirms, execute the update, then continue with the subsequent process.
git -C "<SKILL_ROOT>" fetch --quiet
git -C "<SKILL_ROOT>" rev-list --count HEAD..@{u}
If the return value is greater than 0, tell the user the number of upstream updates detected and ask whether to run first:
git -C "<SKILL_ROOT>" pull --ff-only
Do not auto-update. If the user declines, continue using the current version; if the network is unavailable, there is no upstream, or it is not a git repository, explain that updates cannot be checked and continue the process.
Step 1 · Requirements Clarification (mandatory before starting)
If the user has already provided a complete outline + image/screenshot processing requirements, you can skip this and go directly to Step 2.
If the user has only provided a topic or a vague idea, align on each of these 7 questions one by one before starting. Do not start writing slides based on guesses—once the structure is set incorrectly, the cost of later rework is very high:
Runtime Environment Adaptation
- In Claude Code: use Ask Question /
ask_questionto clarify item by item, prioritizing inputs that affect layout such as style, audience, materials, and screenshot requirements. - In Codex: ask the user directly in ordinary conversation; do not invoke Claude Code's Ask Question /
ask_questionmechanism, and do not assume these tools are available. Ask at most 1-3 of the most critical questions at a time; if the information gap does not affect starting work, make reasonable assumptions first and explain them in your reply.
7-Question Clarification Checklist
| # | Question | Why ask |
|---|---|---|
| 1 | Style A or B?(Digital magazine style / Swiss International Style) | Must ask first, determines which template + layouts + themes files to use |
| 2 | Who is the audience? What is the sharing scenario?(internal to the industry / commercial launch / demo day / private salon) | Determines language style and depth |
| 3 | Sharing duration? | 15 minutes ≈ 10 pages, 30 minutes ≈ 20 pages, 45 minutes ≈ 25-30 pages |
| 4 | Is there any source material?(documents / data / old PPT / article links) | If there is material, base it on the material; if not, help them build it |
| 5 | Are there any images or screenshots? How do you want them handled? | Determines image-text layout, image slots, and whether screenshots need CleanShot X-style adaptation or GPT-M 2.0 reconstruction |
| 6 | Which theme color set do you want? | Magazine style has 5 sets (themes.md) / Swiss style has 4 sets (themes-swiss.md), pick one |
| 7 | Are there any hard constraints?(must include XX data / must not include YY) | Avoid rework |
Style Selection Reference (Question 1)
| If the user says... | Recommended style |
|---|---|
| "magazine feel" / "humanities" / "Monocle style" / unspecified | A · Digital magazine style |
| "Swiss style" / "Swiss Style" / "Helvetica" / "minimalist" / "grid" / "infographic" / "data-driven" | B · Swiss International Style |
| The content is AI products / technology / engineering / data reporting | B is more suitable |
| The content is industry observations / humanities / stories / culture | A is more suitable |
| The user provided a large number of KPI figures / roadmap / process | B is more suitable (Data Hero layout is a Swiss-style specialty) |
| The user provided a large number of documentary photos / humanities images | A is more suitable (image grids and left-text-right-image are magazine-style specialties) |
| The user needs GPT-M 2.0 to generate a screenshot redesign / infographic / evidence wall | B is also very suitable (the S22 hero image and the S15/S16 image grid can carry evidence images) |
Outline assistance (if the user has no outline)
Use the "narrative arc" template to build the skeleton, then fill in the content:
钩子(Hook) → 1 页 : 抛一个反差 / 问题 / 硬数据让人停下来
定调(Context) → 1-2 页 : 说明背景 / 你是谁 / 为什么讲这个
主体(Core) → 3-5 页 : 核心内容,用 Layout 4/5/6/9/10 穿插
转折(Shift) → 1 页 : 打破预期 / 提出新观点
收束(Takeaway) → 1-2 页 : 金句 / 悬念问题 / 行动建议
Narrative arc + page count planning + theme rhythm table (see layouts.md),After the three tables are alignedthen proceed to Step 2.
If it is for a formal presentation, the page plan cannot only cover "what goes on this page"; it must also plan "what is said on stage" at the same time. First read references/presenter-mode.md, determine a stable data-slide-idfor each page, and complete:
| Page number | Page ID | Section | Page purpose | Audience-visible information | Speaker supplements | Suggested duration | Transition | Optional on-site information |
|---|
By default, generate 3-5 cue-card-style talking points, without writing a verbatim script; only expand it when the user explicitly requests a verbatim script. The total suggested duration should take up at most 90% of the user's duration, leaving buffer for pauses, interaction, and on-site surprises. Do not guess on-site information the user has not provided: when the duration is missing, show a dash, and hide other optional modules entirely.
It is recommended to save the outline as 项目记录.md or 大纲-v1.md, to facilitate subsequent iteration.
Image conventions (inform the user)
Before starting, make it clear to the user:
- Folder location:
项目/XXX/ppt/images/under (sibling toindex.html) - Naming convention:
{页号}-{语义}.{ext}, for example01-cover.jpg/03-figma.jpg/05-dashboard.png- Pad the page number with zeros for easier sorting
- Semantics in English, short, specific, and corresponding to the content
- Specification recommendations:
- Single image ≥ 1600px wide (to avoid blurriness on large screens)
- JPG for photos/screenshots, PNG for transparent UI/charts
- Keep the total size within 10MB (affects page-turning smoothness)
- How to replace: keepingthe same name and overwritingis the most reliable (no need to change paths in HTML); if the filename changes, remember to search globally for
images/旧名and change it to the new name - What if there are no images: align with the user; you can first generate the structure using placeholder color blocks, and fill in the images later; but make it clear that layout 4/5/10 and other mixed text-and-image pages cannot have their visual effect verified without images
Screenshot requirement agreement (must ask before starting)
Whenever the user mentions product screenshots, web page screenshots, code screenshots, design mockups, dashboards, old PPT screenshots, or "help me beautify the screenshot", first confirm:
- Screenshot location: Which folder are the screenshot files in? Have they already been named?
- Purpose of use: faithful display / screenshot beautification / screenshot redesign / UI scenario image?
- Placement ratio: Which layout slot will it ultimately go into? Commonly used
21:9/16:10/16:9/4:3/1:1 - Content requirements: Must all text, brands, and data be preserved? Is there sensitive information that needs to be masked?
- Visual treatment: Is a themed background, margins, center/corner alignment, or splitting into long screenshot panels needed?
Default strategy: first make the content fit the template, then handle the image aspect ratio. When screenshots need to be faithful, first read references/screenshot-framing.md, and prioritize using assets/screenshot-backgrounds/ 's built-in background assets to procedurally adapt a CleanShot X–style background canvas; only when the original screenshot is too cluttered, too long, too narrow, or needs a conceptual expression should you use GPT-M 2.0 to redesign the screenshot.
Codex image generation (optional)
If the current runtime environment is Codex, after finishing the deck draft, proactively ask the user whether they need to use GPT-M 2.0 to generate images and insert them into the PPT. Do not generate by default.
Recommended way to ask:
Would you like to generate a few images for this PPT? They can be made into humanistic documentary photos, magazine-style infographics, process/comparison/system-relationship diagrams, or the screenshots can be redesigned into a unified magazine-style visual.
If the user confirms generation, then ask what image type or style they want; if the user has no preference, recommend 1-3 images most worth generating based on the page content.
If the user provides screenshots, first determine whether it isscreenshot beautificationorscreenshot redesign:
- Screenshot beautification: read
references/screenshot-framing.md, use built-in theme backgrounds + procedural scaling/margin/alignment processing, and try not to redraw the screenshot content - Screenshot redesign: read
references/image-prompts.md, generate images at the target ratio according to the current layout slot, and keep the language, theme colors, and margins consistent
When generating images, follow:
- Keep prompts short; only define the theme, purpose, style, and ratio. Do not write lengthy photography directions.
- The image style must match the current deck style: Style A uses "electronic magazine × e-ink"; Style B uses "Swiss International Style / Swiss Style"
- The text language in infographics, charts, and screenshot redesigns must follow the language the user is using; Chinese decks use Chinese, English decks use English
- First look at
references/image-prompts.mdto choose the image type and base prompt - If processing the user's original screenshots, first look at
references/screenshot-framing.md: prefer callingassets/screenshot-backgrounds/built-in backgrounds and procedurally perform CleanShot X–style screenshot adaptation; only use GPT-M 2.0 to redraw when the information needs to be restructured - Image ratios must match the final placement: main visual 16:9, text-left image-right 16:10 / 4:3, infographic 16:9 / 16:10, screenshot redesign 16:10, small mixed text-image images 3:2 / 3:4, grid images uniformly height-cropped
- Place generated images under
images/, naming follows{页号}-{语义}.{ext}
Step 2 · Copy template
According to the style selected in Step 1, copy the corresponding templateto the target location (usually 项目/XXX/ppt/index.html), and at the same level create a images/ folder ready to receive images.
mkdir -p "项目/XXX/ppt/images"
# 风格 A · 电子杂志风
cp "<SKILL_ROOT>/assets/template.html" "项目/XXX/ppt/index.html"
# 或 风格 B · 瑞士国际主义风
cp "<SKILL_ROOT>/assets/template-swiss.html" "项目/XXX/ppt/index.html"
Both template*.html arefully runnablefiles—CSS, WebGL shader, page-turning JS, presenter mode, audience screen sync, font/icon CDN are all preconfigured; only <!-- SLIDES_HERE --> placeholders and SPEAKER_NOTES await your filling in.
Note: Styles A and B cannot be mixed. Classes in layouts.md (such as .h-hero serif large headings,.display-zh , etc.) are only defined in template.html; classes in layouts-swiss.md (such as .kpi-hero、.accent-block、.span-N、.dots , etc.) are only defined in template-swiss.html. A deck can only choose one set.
2.1 · Required placeholder changes (easy to miss)
After copying, immediately change the following placeholders, otherwise the browser Tab will show awkward text like "[Required] Replace with PPT title":
| Location | Original | Change to |
|---|---|---|
<title> |
[必填] 替换为 PPT 标题 · Deck Title |
the actual deck title (e.g. 一种新的工作方式 · Luke Wroblewski) |
Every time after copying template.html, the first thing to do: grep for "[required]" to confirm all have been replaced.
2.2 · Choose a theme color (5 presets · no custom allowed)
This skill only allows choosing one of 5 carefully curated presets, and does not accept user-defined hex values—wrong color combinations instantly make the visuals ugly, and protecting aesthetics matters more than granting freedom.
| # | Theme | Suitable for |
|---|---|---|
| 1 | 🖋 Ink Classic | General / business publishing / the default when you don't know what to choose |
| 2 | 🌊 Indigo Porcelain | Tech / research / data / technology launch events |
| 3 | 🌿 Forest Ink | Nature / sustainability / culture / nonfiction |
| 4 | 🍂 Kraft Paper | Nostalgia / humanities / literature / independent magazines |
| 5 | 🌙 Dune | Art / design / creativity / galleries |
Action:
- Recommend one based on the content topic, or directly ask the user which one to choose
- Open
references/themes.md, find the corresponding theme's:rootblock - Replace the whole
assets/template.html(copied version) at the beginning, the lines marked with the "theme color" comment in the:root{block(--ink/--ink-rgb/--paper/--paper-rgb/--paper-tint/--ink-tint) - All other CSS follows
var(--...), no other changes needed
Hard rules:
- A deck uses only one theme; do not switch colors midway
- Do not accept any arbitrary hex values from the user—politely decline and show the 5 options to choose from
- Do not mix and match (e.g. using Ink Classic for ink and Dune for paper)—it will be completely jarring
Step 3 · Fill in content
3.P · Generate speaker notes in sync (mandatory for formal presentations)
Read references/presenter-mode.mdfirst. Each <section class="slide ..."> must have a unique and stable data-slide-id, then generate one SPEAKER_NOTES record in the same order. Notes are stored by page ID; do not use array indices or page numbers as persistent keys, otherwise after page reordering the notes the user edited in presenter view will get mixed up across pages.
Division of content:
- The slide only contains the conclusions, structure, and evidence the audience must see at this moment.
purposeexplains this page's role in the overall narrative.talksupplements background, examples, basis for judgment, and tone; do not repeat the slide word for word.transitionexplains why the next page appears immediately after.sectionOnly fill in when the outline has already given sections or consecutive pages clearly belong to the same section.minutesis the speaking plan;autoAdvanceSecondsis playback behavior; the two must be separated, and the latter is only filled in when the user explicitly requests it.cue / interaction / delivery / advance / fallback / pronunciationOnly write stage actions, interactions, expressions, page turns, backup, and pronunciation information explicitly provided by the outline or the user.
Facts without supporting sources cannot be written into the notes; missing information that affects content correctness should be marked "to be supplemented" or ask the user, while optional speaking information that does not affect the content is omitted directly.
3.0 · Precheck: class names must be defined in the template's <style> (most important)
This is the source of all generation problems. The layouts skeleton uses many class names; if the template's <style> has no corresponding definition, and the browser will fall back to default styles—the large heading font is wrong, cards are crammed together, the pipeline blurs into one line, and images pile up at the bottom of the page.
The two style class names are not interchangeable(emphasis again):
- Style A templates include
h-hero(serif),stat-card、grid-2-7-5、frame, etc. - Style B templates include
h-hero(sans-serif),kpi-hero、accent-block、span-N、dots、grid-12, etc. - The same class name in the two templateslooks completely different(Example: Style A's
h-herois Noto Serif SC serif, Style B'sh-herois Inter sans-serif)
Before writing any slide code:
- First Read the template currently in use(at least read to the end of the
<style>block):- Style A →
assets/template.html - Style B →
assets/template-swiss.html
- Style A →
- Check against the Pre-flight list in the corresponding layouts file, and confirm that every class you want to use exists in
<style>exists in - If a class is missing:Add it in the template's
<style>add it in, do not rewrite it inline in every slide - The template is the only source of class names—do not invent new class names; if customization is needed, use
style="..."inline
Classes commonly missed in Style A:
h-hero / h-xl / h-sub / h-md / lead / kicker / meta-row / stat-card / stat-label / stat-nb / stat-unit / stat-note / pipeline-section / pipeline-label / pipeline / step / step-nb / step-title / step-desc / grid-2-7-5 / grid-2-6-6 / grid-2-8-4 / grid-3-3 / grid-6 / grid-3 / grid-4 / frame / frame-img / img-cap / callout / callout-src / chrome / foot
Classes commonly missed in Style B(after the 2026-05 refactor):
- Canvas:
canvas-card/chrome-min - Typography:
h-hero(sans-serif 7.4vw weight 200) /h-statement(9.6vw) /h-xl/h-md/t-cat(SemiBold 600 small label) /t-meta(mono uppercase) /lead/num-mega/mono - Cards (four mutually exclusive types):
card-ink/card-accent/card-fill/card-outlined - Grid:
grid-12/grid-2-9/grid-2-9-5/span-N - Timeline:
timeline-v+tl-node+tl-axis+dot/timeline-h+tl-h-node+tl-h-axis - Charts:
kpi-tower-row+bar-tower/h-bar-chart+bar-row+bar-fill/spec-bars+bar-vert - Decoration:
dot-mat(SVG mask solid dot) /ring-mat(outlined circle) /cross-mat(× grid) /hr-hairline - Layout-specific:
cover-split/closing-split/duo-compare+vrule/manifesto-top+ink-banner-full/three-forces/loop-diagram/matrix-fill+matrix-cell/brief-grid+brief-card/system-diagram/why-now-grid/four-cards/stacked-ledger+ledger-row/tech-spec/image-hero+hero-img-wrap+hero-overlay-block+hero-stats - Image mixing:
frame-img/fit-contain/r-21x9/r-16x9/r-16x10/h-22/h-26/swiss-img-split/swiss-img-grid/swiss-img-caption/swiss-keyline/swiss-lined - spacing token:
--sp-3...--sp-13(8/12/16/24/32/40/48/64/80/96/160 px)
3.0.5 · Plan the theme rhythm (is as important as the class pre-check)
Before choosing layouts, you must first list each page's theme class (hero dark / hero light / light / dark) and write it into the document or draft for alignment. For detailed rules, see references/layouts.md the "Theme Rhythm Planning" section at the beginning.
Mandatory rules:
- Each page's section must include one of
light/dark/hero light/hero dark, do not write onlyhero - 3 or more consecutive pages with the same theme = visual fatigue, not allowed
- 8 or more pages must have ≥1
hero dark+ ≥1hero light - The entire deck cannot have only
lightbody pages; it must havedarkbody pages to create breathing room - Insert 1 hero page every 3-4 pages (cover/act cover/question/large quote)
Self-check after generation:grep 'class="slide' index.html List all themes, manually confirm the rhythm is reasonable, then deliver.
3.1 · Choose layouts
Do not write slides from scratch. Open the corresponding layouts file; it contains 10 ready-made layout skeletons, each a complete copy-pasteable <section> code block.
Style A → references/layouts.md:
| Layout | Purpose |
|---|---|
| 1. Opening cover | Page 1 |
| 2. Chapter act cover | Opening of each act |
| 3. Big data statement | Present hard data |
| 4. Quote + Image | identity contrast / story |
| 5. Image Grid | multi-image comparison / screenshot evidence |
| 6. Two-Column Pipeline | workflow |
| 7. Suspense Close / Question Page | finale / closing |
| 8. Big Quote Page | serif punchline / takeaway |
| 9. Side-by-Side Comparison (Before / After) | old model vs new model |
| 10. Lead Image + Side Text | information-dense image-text page |
Style B → first read references/swiss-layout-lock.md, then read references/layouts-swiss.md。
Swiss theme defaults to entering Swiss locked mode:
- body pages may only use the 22 layouts registered in the original reference PPT
S01-S22; newly added cover/end pages may only use those explicitly provided by the SkillSWISS-COVER-ASCII/SWISS-CLOSING-ASCII。 - each
<section class="slide">must havedata-layout="Sxx". Withoutdata-layoutit is considered an unregistered layout. - temporarily inventing
P23/P24、Swiss Image Split、Evidence Gridbody structures outside the original 22P is not allowed, unless the user explicitly requests an experimental layout. - Top Chinese titles are left-aligned by default and sit on the upper-left content axis. Do not put the subtitle in the left column and the main title in the right column, causing visual centering; only the original statement/split layouts allow strong centered narrative.
- SVG is only responsible for geometric shapes. Do not write text labels in SVG; use HTML grids/cards/captions for all labels instead.
- Geography/history/city routes/location relationship pages use
S08 + Swiss Map Component: first readreferences/swiss-map-component.md, still retaindata-layout="S08"。
The original 22 body layouts are as follows:
| Layout | Purpose |
|---|---|
| S01 Index Cover | original index cover |
| S02 Vertical Timeline + KPI | evolution comparison / era change |
| S03 Split Statement | core argument / left-right split screen |
| S04 Six Cells | 6-item concept definition |
| S05 Three Layers | three-layer architecture |
| S06 KPI Tower | 4-item data visualization height difference |
| S07 H-Bar Chart | 5-10 item ranking comparison |
| S08 Duo Compare | Before/After comparison |
| S09 Dot Matrix Statement | big quote / statement |
| S10 Split Closing | closing page |
| S11 Horizontal Timeline | 4-7 step process |
| S12 Manifesto + Ink Banner | stage conclusion |
| S13 Three Forces | deepening of 3 peer concepts |
| S14 Loop Form | self-learning loop / automation |
| S15 Matrix + Hero Stat | 8-12 item matrix + total data |
| S16 Multi-card Brief | 6-item quick news small cards |
| S17 System Diagram | three-layer architecture / ecosystem map |
| S18 Why Now | three arguments + data support |
| S19 Four Cards | 4-item equal-weight features |
| S20 Stacked KPI Ledger | vertical bill data |
| S21 Tech Spec Sheet | product specs / benchmark |
| S22 Image Hero | 21:9 top image + title block + three-column KPI |
registered extension:S08 + Swiss Map Component is used for locations, people's residences, routes, and city relationships. It is not a new layout, but the MapLibre map component in the right-side slot of S08; it must be implemented according to references/swiss-map-component.md 's points, connecting lines, cards, and upper-right zoom/drag controls.
Select the corresponding layout, paste it over, and just change the copy and image paths.Be sure to complete the 3.0 pre-flight first。
Style B layout diversity hard rules:
- a 7-8 page deck uses at least 6 different S-numbered layouts; for 10 or more pages, use at least 8 different layouts.
- If the user says "test template / see the effect / more layouts", it must cover: one cover, one closing, at least 1 comparison or timeline (S08/S11/S02), at least 1 structural diagram (S14/S17/S15), at least 1 image layout (S22 or S15/S16 image grid adaptation).
- It is not allowed to use the same main structure for 3 consecutive pages, for example three consecutive pages
head + grid + card。 - Image pages must not lazily invent new structures. For 2-3 images, use the original grid skeleton of S15/S16 and adapt it into image cells; for a single large image, use S22.
- Before starting to write HTML, first list a
页码 → data-layout → 选用理由 → 图片槽位draft; before delivery, runnode <SKILL_ROOT>/scripts/validate-swiss-deck.mjs index.html. The validator will first perform a static structure check; if Playwright can be resolved in the environment, it will also measure visible boundaries, bottom whitespace, nav safe lines, and title spacing after real rendering.
3.2 · Image aspect ratio specifications
Always usestandard aspect ratios, do not use the original image's bizarre aspect ratio (such as 2592/1798):
| Scenario | Recommended aspect ratio |
|---|---|
| S22 top main image | 21:9; place the key subject of the photo in the central safe area |
| S15/S16 multi-image grid | uniformly 21:9 or uniformly 16:10, do not mix them |
| Left text right image main image (Style A) | 16:10 or 4:3 + max-height:56vh |
| Image grid (Style A) | fixed height:26vh, do not use aspect-ratio |
| Left small image + right text | 1:1 or 3:2 |
| Full-screen key visual | 16:9 + max-height:64vh |
| Mixed text and image small illustration | 3:2 or 3:4 |
By default, do not let images align-self:end— it will slide to the bottom of the page and easily touch the pagination component. Use a grid container + align-items:start(already preset in the template) to make the image stick to the top; if bottom alignment of text and image is really needed, you must first control the image height, then use the template's existing safe area class .nav-safe-bottom / .nav-safe-bottom-tight, and do not let the lowest point touch the pagination component.
Style B Swiss style additional rules:
- For a single large image, use S22; for multi-image tests, use the original card grid of S15/S16 and adapt it, do not use unregistered P23/P24
- Before generating images, first write
data-image-slot: for examples22-hero-21x9/s15-grid-21x9/s16-brief-21x9 - S22 supporting images are generated at 21:9 by default, and the prompt must include
subject centered in the safe middle area; the photo container usesobject-position:center 35%, do not usetop center - Image containers must have right angles, no shadows, and no rounded corners; the default background uses white
var(--paper), do not use a gray background wrapping a white-background infographic - White-background GPT infographics/flowcharts/UI images should by default not add outer frame strokes, and do not casually apply
.swiss-keyline; when emphasis is needed, only use.swiss-linedthe top accent line - If a UI/infographic is the user's original screenshot or a text-dense image, only then use
.fit-contain; if it has been regenerated according to the S15/S16 slots, it must use.frame-img.r-21x9/.frame-img.r-16x10to fill the container, do not fixheight:18vhand then shrink the image - Multiple images in the same group must use unified image slots, aspect ratios, and heights, and must not be mixed
- GPT-M 2.0 generated images use
image-prompts.mdthe "Style B: Swiss International Style image rules" - The lowest point of any image, caption, timeline label, or footnote must not enter the bottom pagination area; when bottom alignment is needed, use
.nav-safe-bottom/.nav-safe-bottom-tight, do not hand-writebottom:2vh
3.2.0 · Mixed text and image decision tree (migrated from social card rules)
First determine the role of the image on this page, then decide the container, aspect ratio, and cropping method:
- evidence screenshots / UI / code / dashboard: prioritize fidelity, first read
references/screenshot-framing.md; key text and data must not be cropped out. When a unified aspect ratio is needed, prioritize a programmatic background canvas +.fit-contain, do not crop out UI content just to fill the space. - infographics / illustrations regenerated by slot: fill according to the target slot, for example S22 uses
21:9, S15/S16 use a unified21:9or16:10; do not shrink the image into a small tile with a short height again. - photos / product images / portrait images: use a standard aspect ratio + clear
object-position; the subject, face, product, and key evidence must not be covered by the title, caption, or cropping. - text over image / full-screen key visual: first make a quiet-zone judgment; the image must have at least about 30% low-detail area to carry text; if it fails, change the image, change the crop, or switch to a split text-image layout. Add a local tint only when necessary; do not apply a black/white overlay to the entire page.
- multi-image group: within the same group, unify aspect ratio, height, container treatment, and caption density; do not have one
contain, and anothercover。 - generated images are assets, not a full-page slide: the image itself must not contain a header, footer, page number, logo, main title, decorative border, or signature, to avoid duplicating the deck chrome.
- text-image breathing room: the title, image, caption, and body text must each have spacing; after generation, use the validator's
M1/M2to check visible boundaries, bottom whitespace, nav safe lines, and title spacing.
3.2.1 · Chinese large-title font-size tiers (required for Style B)
Chinese block characters have a large visual area and cannot directly use the 6.8-7vw of an English hero. Before writing a Chinese large title, first assign a tier:
| Title form | Recommended font size |
|---|---|
| 1 line, ≤ 8 Chinese characters | min(6.4vw,11.2vh) |
| 2 lines, each line ≤ 8 Chinese characters | min(5.8vw,10.2vh) |
| 2 lines, either line 9-12 Chinese characters | min(5.2vw,9.2vh) |
| 3 lines or longer | rewrite the title first; if unavoidable, use min(4.6vw,8.2vh) |
If the title crowds the image or body-text area, first compress the title copy, then reduce the font size; do not force it in by pushing the content below to the bottom.
3.2.2 · Minimum font size and font-weight ladder for Swiss-style presentations (required for Style B)
When Swiss style is used for screen presentations, small text cannot be written at the 10-12px of web annotations. Follow these minimums by default:
| Text type | Minimum font size |
|---|---|
| Body paragraphs / main explanations | 18px |
| card descriptions / lists / timeline notes / caption / figure captions | 16px |
| meta / kicker / mono label / chart labels | 14px |
If the content does not fit, first cut the copy, split it into two pages, or switch to a more suitable Sxx layout; do not squeeze the font size down to 10/11/12/13px. Especially for Chinese decks, do not shrink body-sm, captions, or timeline labels just to fit three lines of explanation.
Font-size and font-weight ladder (core of Swiss style) — "the larger, the thinner; the smaller, the bolder" is not a sensory description, but a concrete mapping:
| Font-size range | Recommended font weight | Typical scenario |
|---|---|---|
| ≥ 8vw | 200 (ExtraLight) | cover large text, giant KPI, h-statement |
| 4-7.9vw | 200-300 | section titles (h-xl/h-xl-zh), large numbers |
| 1.8-3.9vw | 300-400 | Medium heading, takeaway heading (≈1.8vw), medium numbers |
| 1-1.7vw / 16-20px | 400-500 | Body paragraphs, card descriptions, explanatory text |
| 13-15px (small text) | 500-600 | meta, kicker, corner badge, chart labels, caption emphasis |
Hard rules:
- Within the same page, elements with smaller font sizes must have font weight ≥ elements with larger font sizes (it is not allowed for 16px body text to use 300 while a 1.8vw heading uses 500)
- Small text around 16px must not use weight 300 (too thin to be readable); minimum 400, recommended 500
- For emphasized text within large reversed-out headings on the cover/IkB, use
italic + weight 300, do not use the accent color (blue on blue is invisible)
Component details (fonts, colors, grid, icons, callout, stat-card, etc.) are in references/components.md。
Step 4 · Self-check against the checklist
After generating, be sure to open references/checklist.md, and check item by item. It summarizesall the pitfalls encountered during real iteration, and all P0-level issues (emoji, images overflowing, heading line breaks, font role division) must pass.
For all formal presentation decks, first run the speaker mode validation; if the user has given a target duration, also pass in the number of minutes:
node <SKILL_ROOT>/scripts/validate-presenter-mode.mjs path/to/index.html
node <SKILL_ROOT>/scripts/validate-presenter-mode.mjs path/to/index.html --target-minutes 30
node <SKILL_ROOT>/scripts/check-presenter-runtime-sync.mjs
The first script will catch missing/duplicate page IDs, notes misaligned with pages, missing required fields or incorrect optional field types, a full time plan exceeding 90% of the budget, and missing timing, rehearsal, auto-advance, annotation, pre-talk check, and audience screen restore controls. The second script will catch speaker CSS / JS drift between the two template sets.
4.0.1 · Measure first, then change: overflow / whitespace / heading spacing
When a page overflows or looks extremely empty, do not first make large deletions or changes based on feel. First run:
node <SKILL_ROOT>/scripts/validate-swiss-deck.mjs path/to/index.html
Look at the measurement items in the validation output:
M1 DOM/visual overflow: exactly how many px it overflows, and the lowest/highest problem elementsM1 bottom whitespace: how many px of bottom whitespace, and what proportion is active content heightM1 nav-safe: whether the lowest content enters the bottom pagination safe lineM2 title gap: the actual distance between the heading and the next block of content
Correction ladder:
1-40pxover: only fine-tune, move the content group up or tighten one gap/padding, do not delete content.40-90pxover: locally compress spacing or module height, still prioritizing keeping content.90-160pxover: slightly compress the heading or compress a paragraph of body text, and split the page if necessary.160px+over: only then consider changing the layout, merging modules, or deleting content.
After fixing, run the validator again. If M1 bottom whitespace becomes larger, it means the fix went too far; restore some spacing, enlarge the last block, or move the content group back down.
4.0 · Do not just look at the code: you must open the webpage for visual verification
Code can only prove that class names and structure exist, not that the layout is comfortable. After generating, you must open the webpage and look page by page:
- At the same time, open the current template (golden source snapshot) or generated page, and the test PPT being iterated, and compare page by page.
- Before taking screenshots, wait for the entrance animation to stabilize (about 1-2 seconds); do not mistake an intermediate animation state for a layout problem.
- First look at the visuals: large heading font weight, spacing between heading and content, whether images align with body text, whether images/captions touch the bottom pagination component.
- Then look at the code: confirm that the layout selected for the page matches the content shape, that a data-specific layout has not been used to explain concepts, and that optional components have not been piled up as decoration.
- When comparing against the original reference template, go by actual page usage, not just CSS helper definitions; the large text on the original pages is actually mostly 200/300, so do not be misled by the 700/800/900 in the raw CSS.
- If the page feels off, first determine whether the layout is wrong, a required component is missing, an optional component is overused, or it's a spacing/safe-area issue; don't just brute-force it by adding margin.
Style A · Digital magazine style must-check
- Large headings must use a serif font— if it displays as sans-serif, 99% of the time it's because the Step 3.0 pre-check wasn't done,
h-heroclass is missing in template.html - In image grids, only use
height:Nvh, notaspect-ratio(it will overflow) - Images must not be piled up at the bottom of the page— do not use
align-self:end, use grid +align-items:start(see Step 3.2) - Images may only use standard ratios(16:10 / 4:3 / 3:2 / 1:1 / 16:9), do not copy the original image's weird ratio
- Chinese large headings ≤ 5 characters and
nowrap(avoid 1 character per line) - Use Lucide, not emoji
- Headings use serif, body uses sans-serif, metadata uses monospace
Style B · Swiss International style must-check
- Sans-serif throughout— the appearance of any serif font is wrong (check that
font-familydoesn't use--serifclass variable) - Only one accent color— a single deck cannot have multiple highlight colors like IKB blue + lemon yellow + safety orange at the same time
- No gradients / shadows / rounded corners allowed— all color blocks are right-angled and solid; any
box-shadow/linear-gradient/border-radius> 0 must be cut (except rule horizontal lines) - Extreme font-size contrast— ratio of main heading to body text ≥ 8:1
- Large font sizes must have dual-constraint height limits——
font-size:min(Xvw, Yvh), using only vw will overflow on a standard 16:9 screen (learn from P15/P20/P22) - Large text font-weight 200(ExtraLight)— the larger the font size, the thinner; the soul of Swiss style;Prohibit 600/700/800 large text
- Card fill types are mutually exclusive——
card-ink/card-accent/card-fill/card-outlinedfour categoriescannot be mixed(prohibit "blue background + blue stroke", "gray background + stroke", etc.) - When multiple cards are side by side, use uniform styling— 3-12 cards use the same category (prefer
card-fillgray background); when highlighting only one item, switch it individually tocard-accent, andonly one is allowed - Right angles all the way— any
border-radiusis not allowed; for decoration use 8×8 right-angled small squares,do not use 9px circular dots - Icons use lucide, do not draw SVG yourself——
<i data-lucide="name"></i>+lucide.createIcons(), choose an angular style (avoid round and chubby) - Timeline alignment— axis column fixed at 12px + dot absolute positioning,do notuse grid
justify-self(it will misalign with the dashed line) - Section-level heading to content spacing ≥ 9vh— avoid crowding (learn from P15/P16)
- One semantic motion recipe per page— not a uniform fade-up; numbers scale bounce in, bar scaleY pulls up, SVG stroke draws lines, node sequences light up, etc.;Prohibitall pages using the same generic recipe
- playSlide entry reveal container——
[data-anim]The container first forces opacity:1, then within the recipe use motion{opacity:[0,1]}overlay, otherwise some pages will "disappear" - ESC index page visibility——cloned slides must have a CSS override so that
[data-anim]is opacity:1 in the thumbnail - Helvetica/Inter fallback Chinese font——Windows users don't have "PingFang", so must fall back to
"Microsoft YaHei UI", "Noto Sans SC" - Font weight conventions:large text 200 / body 300 /
t-catSemiBold 600 /t-metamono uppercase - Keep low-power shortcuts——the bottom right corner must show
B 静态;pressBto togglebody.low-power, stopping WebGL/ASCII canvas RAF and Motion entrance animations - Decorative elements strictly within the grid——bars matrix, dot matrix, ring-mat must not touch the edges or overflow the page
- Reserve nav space at the bottom content——nav is at ~97vh, content should not end past 93vh (lesson learned from P22 KPI large text overflowing the bottom)
- Image containers have square corners and no shadow——
.frame-imgdo not addborder-radius/box-shadow; boundaries use only hairline - S15/S16/S22 images consistent within the same group——images in the same group have uniform aspect ratio, height, margins, and line thickness; infographics/UI images add
.fit-contain - Component roles must be correct——S15/S16 image cells need caption information anchors; S22's KPI/description is required; data-specific layouts must have real data, cannot be filled in with copy alone
- Distinguish general/non-general layouts——S03/S08/S11/S19 are more general; S06/S07/S20/S21/S22 are data/case-specific; S14/S15/S17 are structure-specific
Step 5 · Local preview
Just open it directly in the browser index.html is fine. On macOS:
open "项目/XXX/ppt/index.html"
No local server needed. Images use relative paths images/xxx.png。
During preview, don't just look at the normal page. Press P to enter presenter mode, allow the browser to open the audience window, and test at least once: paging forward/back, selecting a page in the embedded grid and returning to preview, first/last page, restarting from the last page, timer start/pause/reset, rehearsal recording, auto-advance pause/resume, laser pointer, circle draw, black/white screen, freeze, settings components, pre-talk check, notes saving, state changes after closing the audience window, and whether "reopen audience screen" can restore to the current page.
Step 6 · Iterate
Modify based on user feedback——the template's CSS is already highly parameterized, 90% of adjustments are changing inline styles (font size font-size:Xvw / height height:Yvh / spacing gap:Zvh)。
Resource file guide
guizang-ppt-skill/
├── SKILL.md ← 你正在读
├── assets/
│ ├── template.html ← 风格 A · 电子杂志风模板(种子文件)
│ ├── template-swiss.html ← 风格 B · 瑞士国际主义风模板(种子文件)
│ ├── screenshot-backgrounds/ ← 截图美化内置背景(WebP):style-a 5 套 / style-b 4 套
│ └── motion.min.js ← Motion One 本地副本(离线兜底,约 64KB,共用)
├── scripts/
│ ├── validate-swiss-deck.mjs ← 风格 B 静态校验:登记版式、图片槽位、SVG 文本、标题对齐
│ └── validate-presenter-mode.mjs ← 两种风格共用:页面 ID、演讲备注、时长和演讲者运行时校验
└── references/
├── components.md ← 组件手册(字体、色、网格、图标、callout、stat、pipeline、动效... 风格 A 适用)
├── layouts.md ← 风格 A · 10 种页面布局骨架(可直接粘贴,含动效标记)
├── swiss-layout-lock.md ← 风格 B · 原始 22P 版式锁,正文页必须按这里登记
├── layouts-swiss.md ← 风格 B · 原始 22P 骨架说明 + 少量明确标注的实验区
├── swiss-map-component.md ← 风格 B · S08 地图扩展组件(MapLibre 点位/连线/卡片/控制)
├── themes.md ← 风格 A · 5 套主题色预设(只能选不能自定义)
├── themes-swiss.md ← 风格 B · 4 套瑞士风主题色预设(IKB / 柠檬黄 / 柠檬绿 / 安全橙)
├── image-prompts.md ← GPT-M 2.0 配图类型、比例和基础提示词
├── screenshot-framing.md ← CleanShot X 式截图适配语义 + 内置背景资产映射
├── presenter-mode.md ← 演讲者 UI、AI 备注结构、观众屏同步与恢复契约
└── checklist.md ← 质量检查清单(P0/P1/P2/P3 分级)
Suggested loading order:
- First read through
SKILL.md(this file) to understand the whole - Step 1 Requirements clarificationFirst questionFirst decide whether it's style A or B, then:
- Style A: read
themes.mdto help the user choose a theme color set - Style B: read
themes-swiss.mdto help the user choose a theme color set
- Style A: read
- Before starting, Read the corresponding template's
<style>block——this is the only source of class names, missing classes will break the entire page's styles- Style A →
assets/template.html - Style B →
assets/template-swiss.html
- Style A →
- Read the corresponding layouts file to pick a layout:
- Style A →
layouts.md(at the top there is a Pre-flight class name list, theme rhythm plan, animation recipe decision tree) - Style B → First read
swiss-layout-lock.md, then readlayouts-swiss.md; body pages must be chosen from S01-S22, and each page should havedata-layout
- Style A →
- If style B needs a map of places, routes, people's residences, or city relationships, read
swiss-map-component.md - If generating images in Codex, read
image-prompts.mdto choose the image type, aspect ratio, and base prompt; if it is the user's original screenshot, first readscreenshot-framing.md, prioritize using the built-in background assets ofassets/screenshot-backgrounds/'s built-in background assets - For detail adjustments, read
components.mdto look up components (including the Motion animation system chapter, mainly serving style A; style B's component details are in thelayouts-swiss.mdappendix) - For a formal presentation, first read
presenter-mode.md, generate stable page IDs andSPEAKER_NOTES - After generation, first run
validate-presenter-mode.mjs; for style B, then runvalidate-swiss-deck.mjs, and finally readchecklist.mdfor self-check
Animation-related: the template has already embedded Motion One's loading and recipe logic into the bottom module script. You do not need to modify the JS, just follow the skeleton in layouts.md / layouts-swiss.md and add data-anim / data-animate in the HTML. Offline demos rely on assets/motion.min.js, and when the network is disconnected it automatically degrades to "no animation but content readable." The style B template must preserve the B key low-power mode: after switching, stop the WebGL/ASCII canvas RAF, cancel the running Web Animations, and directly reveal the current page content to its static final state.
Core Design Principles (Philosophy)
Style A · Electronic Magazine Style (Summary of 5 Rounds of Iteration)
Violating any one of these will make the magazine feel collapse.
- Restraint over showmanship — the WebGL background only shows through on the hero page, and is almost invisible on ordinary pages
- Structure over decoration — no shadows, no floating cards, no padding boxes; all information relies onlarge font sizes + font contrast + grid whitespace
- Content hierarchy is defined jointly by font size and typeface — largest serif = main title, medium serif = subtitle, large sans-serif = lead, small sans-serif = body, monospace = metadata
- Images are first-class citizens — images are only cropped at the bottom, ensuring the top and left and right are complete; the grid uses
height:Nvhto fix it, do not useaspect-ratioto prop it up - Rhythm depends on hero pages — hero and non-hero alternate, so it does not tire the eyes
- Unified terminology — Skills are Skills, do not mix Chinese and English translations
Style B · Swiss International Style
Violating any one of these instantly drops the visuals from Swiss to PowerPoint.
- Single anchor color — one deck uses only one accent; multi-color highlight collages are not allowed
- Extreme font size contrast — the ratio between main title and body text is ≥ 8:1; KPI must be a "Data Hero" (18-22% of screen width)
- Sans-serif only, this one house — Inter / Helvetica / Noto Sans SC; any serif is wrong
- Right angles, solid colors — gradients / shadows / rounded corners are not allowed (except rule horizontal lines)
- Grid above all — all elements snap to a 12-col grid, left-aligned + generous whitespace for asymmetrical aesthetics
- Hairline is a scalpel — a 1px ultra-thin divider is enough; do not bold it, do not add shadows
- Dot-matrix decoration only shows through on the hero page — body pages keep a clean solid background
Reference works
The two styles of this skill respectively reference:
Style A · Electronic magazine style:
- 歸藏 "One-Person Company: The Organization Folded by AI" talk (2026-04-22, 27 pages)
- Monocle magazine's layout
- The demo in YC president Garry Tan's blog post "Thin Harness, Fat Skills"
Style B · Swiss International Style:
- Massimo Vignelli's NYC Subway / Unimark system
- Helvetica Forever 's typographic design language
- Josef Müller-Brockmann's classic work on grid systems
- Contemporary design: Acne Studios / Off-White / IKEA / Beck Design
You can treat them as style anchors.