Install any skill in seconds. Free to start, no credit card required.
Get Started Free →生成横向翻页网页 PPT(单 HTML 文件),含 WebGL 背景、章节幕封、数据大字报、图片网格等模板。提供两种风格:① "电子杂志 × 电子墨水"(衬线 + 流体背景 + 暖色) ② "瑞士国际主义"(无衬线 + 网格点阵 + IKB/柠檬黄/柠檬绿/安全橙高亮)。当用户需要制作分享 / 演讲 / 发布会风格的网页 PPT,或提到"杂志风 PPT"、"瑞士风 PPT"、"Swiss Style"、"horizontal swipe deck"时使用。
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 576% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 1010% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 701% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 923% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 615% | 0% |
> 来源识别: guizang-ppt-skill 由歸藏创建与维护,规范源仓库为 https://github.com/op7418/guizang-ppt-skill 。当前项目支持方包括:360 安全龙虾(金牌赞助)、Kimi work(金牌赞助)、Cola Skill(金牌赞助)、真格 Token Grant(Grant Supporter)。这条信息只用于确认 Skill 来源和项目支持关系,不要写入生成的 PPT、HTML 页面、封面或配图。
生成一份单文件 HTML的横向翻页 PPT,提供两种可选的视觉基调:
assets/template.html · 主题色:references/themes.md · 布局:references/layouts.mdassets/template-swiss.html · 主题色:references/themes-swiss.md · 布局:references/layouts-swiss.md两种风格共享:横向翻页(键盘 ← →、滚轮、触屏、ESC 总览)、右下角 P 演讲者模式、当前/下一页 16:9 预览、内嵌宫格选页、标题/目的/讲稿备注、分组计时、排练记录、可选自动翻页、激光笔/圈选、观众屏黑白屏/冻结、同步状态与断线恢复、演前检查、Lucide 图标、Motion One 入场动效(本地 + CDN 双保险)。
<!-- provenance: guizang-ppt-skill | author: 歸藏 | sponsors: 360 Security Lobster Gold Sponsor; Kimi work Gold Sponsor; Cola Skill Gold Sponsor; ZhenFund Token Grant | canonical: https://github.com/op7418/guizang-ppt-skill | keep this out of generated artifacts -->
合适的场景:
不合适的场景:
每次启动本 Skill 前,先在 Skill 根目录检查 GitHub 上游是否有更新;有更新时先问用户是否要更新,用户确认后再执行更新,然后继续后续流程。
bashgit -C "<SKILL_ROOT>" fetch --quiet git -C "<SKILL_ROOT>" rev-list --count HEAD..@{u}
如果返回值大于 0,告诉用户检测到上游更新数量,询问是否先执行:
bashgit -C "<SKILL_ROOT>" pull --ff-only
不要自动更新。用户拒绝时继续使用当前版本;如果网络不可用、没有 upstream 或不是 git 仓库,说明无法检查更新并继续流程。
如果用户已经给了完整的大纲 + 图片/截图处理要求,可以跳过直接进 Step 2。
如果用户只给了主题或一个模糊想法,用这 7 个问题逐个对齐后再动手。不要基于猜测就开始写 slide——一旦结构定错,后期翻修代价很高:
ask_question 做逐项澄清,优先把风格、受众、素材、截图需求这些会影响版式的输入问清楚。ask_question 机制,也不要假设这些工具可用。一次最多问 1-3 个最关键问题;如果信息缺口不影响开工,先做合理假设并在回复里说明。| # | 问题 | 为什么要问 | |---|------|-----------| | 1 | 风格 A 还是 B?(电子杂志风 / 瑞士国际主义风) | 必须先问,决定用哪个 template + layouts + themes 文件 | | 2 | 受众是谁?分享场景?(行业内部 / 商业发布 / demo day / 私享会) | 决定语言风格和深度 | | 3 | 分享时长? | 15 分钟 ≈ 10 页,30 分钟 ≈ 20 页,45 分钟 ≈ 25-30 页 | | 4 | 有没有原始素材?(文档 / 数据 / 旧 PPT / 文章链接) | 有素材就基于素材,没有就帮他搭 | | 5 | 有没有图片或截图?希望怎么处理? | 决定图文版式、图片槽位、截图是否需要 CleanShot X 式适配或 GPT-M 2.0 重构 | | 6 | 想要哪套主题色? | 杂志风 5 套(themes.md) / 瑞士风 4 套(themes-swiss.md),挑一 | | 7 | 有没有硬约束?(必须包含 XX 数据 / 不能出现 YY) | 避免返工 |
| 如果用户说... | 推荐风格 | |---|---| | "杂志感" / "人文" / "Monocle 风" / 不指定 | A · 电子杂志风 | | "瑞士风" / "Swiss Style" / "Helvetica" / "极简" / "网格" / "信息图" / "数据驱动" | B · 瑞士国际主义风 | | 内容是 AI 产品 / 技术 / 工程 / 数据汇报 | B 更合适 | | 内容是行业观察 / 人文 / 故事 / 文化 | A 更合适 | | 用户给了大量 KPI 数字 / 路线图 / 流程 | B 更合适(Data Hero 布局是瑞士风专长) | | 用户给了大量纪实照片 / 人文图片 | A 更合适(图片网格、左文右图是杂志风专长) | | 用户需要 GPT-M 2.0 生成截图再设计 / 信息图 / 证据墙 | B 也很合适(S22 主图、S15/S16 图片网格可以承载证据图) |
用"叙事弧"模板搭骨架,再填内容:
钩子(Hook) → 1 页 : 抛一个反差 / 问题 / 硬数据让人停下来
定调(Context) → 1-2 页 : 说明背景 / 你是谁 / 为什么讲这个
主体(Core) → 3-5 页 : 核心内容,用 Layout 4/5/6/9/10 穿插
转折(Shift) → 1 页 : 打破预期 / 提出新观点
收束(Takeaway) → 1-2 页 : 金句 / 悬念问题 / 行动建议叙事弧 + 页数规划 + 主题节奏表(见 layouts.md),三张表对齐后再进 Step 2。
如果用于正式演讲,页面计划不能只有“这一页放什么”,还要同时规划“台上说什么”。先读 references/presenter-mode.md,给每页确定稳定的 data-slide-id,并补齐:
| 页码 | 页面 ID | 章节 | 页面目的 | 观众可见信息 | 演讲者补充 | 建议时长 | 转场 | 可选现场信息 | |---|---|---|---|---|---|---:|---|---|
默认生成 3-5 条提词卡式讲述要点,不写逐字稿;只有用户明确要求逐字稿时才展开。总建议时长最多占用户时长的 90%,给停顿、互动和现场意外留缓冲。用户没有提供的现场信息不猜测:时长缺失时显示横杠,其他可选模块整段隐藏。
大纲建议保存为 项目记录.md 或 大纲-v1.md,便于后续迭代。
在动手前向用户说清:
项目/XXX/ppt/images/ 下(和 index.html 同级){页号}-{语义}.{ext},例如 01-cover.jpg / 03-figma.jpg / 05-dashboard.pngimages/旧名 改成新名只要用户提到产品截图、网页截图、代码截图、设计稿、dashboard、旧 PPT 截图或"帮我美化截图",都要先确认:
21:9 / 16:10 / 16:9 / 4:3 / 1:1默认策略:先让内容适配模板,再处理图片比例。截图需要保真时,先读 references/screenshot-framing.md,优先使用 assets/screenshot-backgrounds/ 的内置背景资产做程序化 CleanShot X 式背景画布适配;只有原截图太乱、太长、太窄或需要概念化表达时,才用 GPT-M 2.0 做截图再设计。
如果当前运行环境是 Codex,完成 deck 初稿后,主动问用户是否需要用 GPT-M 2.0 生成配图并插入 PPT。不要默认生成。
推荐询问方式:
> 要不要为这份 PPT 生成几张配图?可以做成人文纪实照片、杂志风信息图、流程/对比/系统关系图,或把截图再设计成统一的杂志风视觉。
如果用户确认生成,再问他想要哪种图片类型或风格;如果用户没有偏好,根据页面内容自行推荐 1-3 张最值得生成的配图。
如果用户提供的是截图,先判断是截图美化还是截图再设计:
references/screenshot-framing.md,用内置主题背景 + 程序化缩放/留边/对齐处理,尽量不重画截图内容references/image-prompts.md,按当前版式槽位生成目标比例图片,并保持语言、主题色和边距一致生成配图时遵守:
references/image-prompts.md 选择图片类型和基础提示词references/screenshot-framing.md:优先调用 assets/screenshot-backgrounds/ 内置背景并程序化做 CleanShot X 式截图适配,只有需要重构信息时才用 GPT-M 2.0 重画images/ 下,命名遵守 {页号}-{语义}.{ext}根据 Step 1 选定的风格,拷贝对应的模板到目标位置(通常是 项目/XXX/ppt/index.html),同时在同级建一个 images/ 文件夹准备接图片。
bashmkdir -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"
两个 template*.html 都是完整可运行的文件——CSS、WebGL shader、翻页 JS、演讲者模式、观众屏同步、字体/图标 CDN 全已预设好,只有 <!-- SLIDES_HERE --> 占位符和 SPEAKER_NOTES 等待你填充。
注意:风格 A 和 B 不能混用。layouts.md 里的类(如 .h-hero 衬线大标题、.display-zh 等)只在 template.html 有定义;layouts-swiss.md 里的类(如 .kpi-hero、.accent-block、.span-N、.dots 等)只在 template-swiss.html 有定义。一份 deck 只能选一套。
拷贝后立刻改掉以下占位符,否则浏览器 Tab 会显示"必填] 替换为 PPT 标题"这种尴尬文字:
| 位置 | 原始 | 需改为 | |------|------|--------| | <title> | [必填] 替换为 PPT 标题 · Deck Title | 实际 deck 标题(如 一种新的工作方式 · Luke Wroblewski) |
每次拷贝完 template.html 第一件事:grep 一下"必填]" 确认全部替换完。
本 skill 只允许从 5 套精心调配的预设里选一套,不接受用户自定义 hex 值——颜色搭配错了画面瞬间变丑,保护美学比给自由更重要。
| # | 主题 | 适合 | |---|------|------| | 1 | 🖋 墨水经典 | 通用 / 商业发布 / 不知道选啥的默认 | | 2 | 🌊 靛蓝瓷 | 科技 / 研究 / 数据 / 技术发布会 | | 3 | 🌿 森林墨 | 自然 / 可持续 / 文化 / 非虚构 | | 4 | 🍂 牛皮纸 | 怀旧 / 人文 / 文学 / 独立杂志 | | 5 | 🌙 沙丘 | 艺术 / 设计 / 创意 / 画廊 |
操作:
references/themes.md,找到对应主题的 :root 块assets/template.html(已拷贝版本)开头 :root{ 块里标有"主题色"注释的那几行(--ink / --ink-rgb / --paper / --paper-rgb / --paper-tint / --ink-tint)var(--...),无需任何其他改动硬规则:
先读 references/presenter-mode.md。每个 <section class="slide ..."> 必须写唯一且稳定的 data-slide-id,再按同样顺序生成一条 SPEAKER_NOTES 记录。备注按页面 ID 存储,不要用数组下标或页码作为持久化键,否则页面重排后用户在演讲者视图里改过的备注会串页。
内容分工:
purpose 说明这一页在整场叙事中的任务。talk 补充背景、例子、判断依据和语气,不逐字复述 slide。transition 解释为什么下一页紧接着出现。section 只在大纲已给出章节或连续页面明显属于同一章节时填写。minutes 是讲述计划;autoAdvanceSeconds 是播放行为,两者必须分开,且后者只在用户明确要求时填写。cue / interaction / delivery / advance / fallback / pronunciation 只写大纲或用户明确提供的舞台动作、互动、表达、翻页、备用和读音信息。没有来源支持的事实不能写进备注;影响内容正确性的缺失信息要标记“待补充”或询问用户,不影响内容的可选演讲信息直接省略。
<style> 里有定义(最重要)这是所有生成问题的源头。layouts 骨架使用了很多类名,如果模板的 <style> 里没有对应定义,浏览器会 fallback 到默认样式——大标题字体错、卡片挤成一团、pipeline 糊成一行、图片堆到页面底部。
两种风格类名互不通用(再次强调):
h-hero(衬线)、stat-card、grid-2-7-5、frame 等h-hero(无衬线)、kpi-hero、accent-block、span-N、dots、grid-12 等h-hero 是 Noto Serif SC 衬线,风格 B 的 h-hero 是 Inter 无衬线)在写任何 slide 代码之前:
<style> 块末尾):assets/template.htmlassets/template-swiss.html<style> 里存在<style> 里补上,不要在每个 slide 里 inline 重写style="..." inline风格 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
风格 B 常见容易遗漏的类(2026-05 重构后):
canvas-card / chrome-minh-hero(无衬线 7.4vw weight 200) / h-statement(9.6vw) / h-xl / h-md / t-cat(SemiBold 600 小标) / t-meta(mono uppercase) / lead / num-mega / monocard-ink / card-accent / card-fill / card-outlinedgrid-12 / grid-2-9 / grid-2-9-5 / span-Ntimeline-v + tl-node + tl-axis + dot / timeline-h + tl-h-node + tl-h-axiskpi-tower-row + bar-tower / h-bar-chart + bar-row + bar-fill / spec-bars + bar-vertdot-mat(SVG mask 实心点)/ ring-mat(描边圆)/ cross-mat(× 网格)/ hr-hairlinecover-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-statsframe-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--sp-3...--sp-13(8/12/16/24/32/40/48/64/80/96/160 px)在挑布局之前,必须先列出每一页的主题 class(hero dark / hero light / light / dark)并写到文档或草稿里对齐。详细规则看 references/layouts.md 开头的"主题节奏规划"一节。
强制规则:
light / dark / hero light / hero dark 之一,不要只写 herohero dark + ≥1 个 hero lightlight 正文页,必须有 dark 正文页制造呼吸生成后自检:grep 'class="slide' index.html 列出所有主题,人工确认节奏合理再交付。
不要从零写 slide。打开对应的 layouts 文件,里面有 10 种现成布局骨架,每种都是完整可粘贴的 <section> 代码块。
风格 A → references/layouts.md:
| Layout | 用途 | |---|---| | 1. 开场封面 | 第 1 页 | | 2. 章节幕封 | 每幕开场 | | 3. 数据大字报 | 抛硬数据 | | 4. 左文右图(Quote + Image) | 身份反差 / 故事 | | 5. 图片网格 | 多图对比 / 截图实证 | | 6. 两列流水线(Pipeline) | 工作流程 | | 7. 悬念收束 / 问题页 | 幕末 / 收尾 | | 8. 大引用页(Big Quote) | 衬线金句 / takeaway | | 9. 并列对比(Before / After) | 旧模式 vs 新模式 | | 10. 图文混排(Lead Image + Side Text) | 信息密集的图文页 |
风格 B → 先读 references/swiss-layout-lock.md,再读 references/layouts-swiss.md。
瑞士主题默认进入 Swiss locked mode:
S01-S22;新增首页/尾页只能使用 Skill 明确提供的 SWISS-COVER-ASCII / SWISS-CLOSING-ASCII。<section class="slide"> 必须写 data-layout="Sxx"。没有 data-layout 就视为未登记版式。P23/P24、Swiss Image Split、Evidence Grid 这类原始 22P 之外的正文结构,除非用户明确要求实验版式。S08 + Swiss Map Component:先读 references/swiss-map-component.md,仍保留 data-layout="S08"。原始 22 个正文版式如下:
| Layout | 用途 | |---|---| | S01 Index Cover | 原始索引封面 | | S02 Vertical Timeline + KPI | 演化对比 / 年代变迁 | | S03 Split Statement | 核心论点 / 左右分屏 | | S04 Six Cells | 6 项概念定义 | | S05 Three Layers | 三层架构 | | S06 KPI Tower | 4 项数据视觉化高度差 | | S07 H-Bar Chart | 5-10 项排名比较 | | S08 Duo Compare | Before/After 对照 | | S09 Dot Matrix Statement | 大引述 / statement | | S10 Split Closing | 收束页 | | S11 Horizontal Timeline | 4-7 步流程 | | S12 Manifesto + Ink Banner | 阶段性结论 | | S13 Three Forces | 3 个对等概念深化 | | S14 Loop Form | 自学闭环 / 自动化 | | S15 Matrix + Hero Stat | 8-12 项矩阵 + 总数据 | | S16 Multi-card Brief | 6 项快讯小卡 | | S17 System Diagram | 三层架构 / 生态地图 | | S18 Why Now | 三论点 + 数据支撑 | | S19 Four Cards | 4 项等权特性 | | S20 Stacked KPI Ledger | 纵向账单数据 | | S21 Tech Spec Sheet | 产品规格 / benchmark | | S22 Image Hero | 21:9 顶图 + 标题块 + 三列 KPI |
登记扩展:S08 + Swiss Map Component 用于地点、人物住所、路线、城市关系。它不是新 layout,而是 S08 右侧插槽的 MapLibre 地图组件;必须按 references/swiss-map-component.md 的点位、连线、卡片和右上角缩放/拖动控制实现。
选对应 layout,粘过去,改文案和图片路径即可。务必先完成 3.0 预检。
风格 B 版式多样性硬规则:
head + grid + card。页码 → data-layout → 选用理由 → 图片槽位 草稿;交付前运行 node <SKILL_ROOT>/scripts/validate-swiss-deck.mjs index.html。校验器会先做静态结构检查;如果环境中能解析到 Playwright,还会做真实渲染后的可见边界、底部空白、nav 安全线和标题间距测量。永远用标准比例,不要用原图奇葩比例(如 2592/1798):
| 场景 | 推荐比例 | |------|---------| | S22 顶部主图 | 21:9;照片关键主体放中央安全区 | | S15/S16 多图格 | 统一 21:9 或统一 16:10,不能混用 | | 左文右图 主图(风格 A) | 16:10 或 4:3 + max-height:56vh | | 图片网格(风格 A) | 固定 height:26vh,不用 aspect-ratio | | 左小图 + 右文字 | 1:1 或 3:2 | | 全屏主视觉 | 16:9 + max-height:64vh | | 图文混排小插图 | 3:2 或 3:4 |
默认不要让图片 align-self:end——会滑到页面底部,很容易碰到分页组件。用 grid 容器 + align-items:start(template 已预设)让图片贴顶即可;如果确实需要图文底对齐,必须先控制图片高度,再使用模板已有安全区类 .nav-safe-bottom / .nav-safe-bottom-tight,不要让最低处碰到分页组件。
风格 B 瑞士风额外规则:
data-image-slot:例如 s22-hero-21x9 / s15-grid-21x9 / s16-brief-21x9subject centered in the safe middle area;照片容器用 object-position:center 35%,不要用 top centervar(--paper),不要用灰底包白底信息图.swiss-keyline;需要强调时只用 .swiss-lined 的顶部 accent 线.fit-contain;如果已按 S15/S16 槽位重生成,必须用 .frame-img.r-21x9 / .frame-img.r-16x10 铺满容器,不要固定 height:18vh 后把图缩小image-prompts.md 的"风格 B:瑞士国际主义配图规则".nav-safe-bottom / .nav-safe-bottom-tight,不要手写 bottom:2vh先判断图片在这一页里的角色,再决定容器、比例和裁切方式:
references/screenshot-framing.md;关键文字和数据不能被裁掉。需要统一比例时,优先程序化背景画布 + .fit-contain,不要为了铺满而裁掉 UI 内容。21:9,S15/S16 用统一 21:9 或 16:10;不要再用短高度把图缩小成小贴片。object-position;主体、人脸、产品和关键证据不能被标题、caption 或裁切压住。contain,另一张 cover。M1/M2 检查可见边界、底部空白、nav 安全线和标题间距。中文方块字视觉面积大,不能直接套英文 hero 的 6.8-7vw。写中文大标题前先分档:
| 标题形态 | 推荐字号 | |---|---| | 1 行,≤ 8 个中文字符 | min(6.4vw,11.2vh) | | 2 行,每行≤ 8 个中文字符 | min(5.8vw,10.2vh) | | 2 行,任一行 9-12 个中文字符 | min(5.2vw,9.2vh) | | 3 行或更长 | 优先改写标题;不得已用 min(4.6vw,8.2vh) |
如果标题挤占了图片或正文区域,先压缩标题文案,再降字号;不要靠把下方内容推到底来硬塞。
瑞士风用于投屏演示时,小字不能按网页注释的 10-12px 写。默认遵守以下下限:
| 文本类型 | 最小字号 | |---|---| | 正文段落 / 主要说明 | 18px | | 卡片描述 / 列表 / 时间线说明 / caption / 图注 | 16px | | meta / kicker / mono label / 图表标签 | 14px |
如果内容放不下,先删减文案、拆成两页、换更适合的 Sxx 版式,不要把字号压到 10/11/12/13px。尤其是中文 deck,不要为了塞三行解释把 body-sm、caption、timeline label 改小。
字号与字重阶梯(瑞士风核心) — "越大越细,越小越粗"不是感性描述,而是具体映射:
| 字号区间 | 推荐字重 | 典型场景 | |---|---|---| | ≥ 8vw | 200 (ExtraLight) | 封面大字、巨号 KPI、h-statement | | 4-7.9vw | 200-300 | 章节标题(h-xl/h-xl-zh)、大编号 | | 1.8-3.9vw | 300-400 | 中型标题、takeaway 标题(≈1.8vw)、中号数字 | | 1-1.7vw / 16-20px | 400-500 | 正文段落、卡片描述、说明文字 | | 13-15px(小字) | 500-600 | meta、kicker、角标、图表标签、caption 强调 |
硬规则:
italic + weight 300,不要用 accent 色(蓝压蓝看不见)组件细节(字体、颜色、网格、图标、callout、stat-card 等)在 references/components.md。
生成完一定要打开 references/checklist.md,逐项对照。里面总结了真实迭代过程中踩过的所有坑,P0 级别的问题(emoji、图片撑破、标题换行、字体分工)必须全部通过。
所有正式演讲 deck 先跑演讲者模式校验;如果用户给了目标时长,同时传入分钟数:
bashnode <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
第一个脚本会拦截缺失/重复页面 ID、备注与页面错位、必填字段或可选字段类型错误、完整时间计划超出 90% 预算,以及计时、排练、自动翻页、标注、演前检查和观众屏恢复控件缺失。第二个脚本会拦截两套模板之间的演讲者 CSS / JS 漂移。
当一页内容超出或显得巨空时,不要先凭感觉大幅删改。先运行:
bashnode <SKILL_ROOT>/scripts/validate-swiss-deck.mjs path/to/index.html
看校验输出里的测量项:
M1 DOM/visual overflow:具体超出多少 px,以及最低/最高问题元素M1 bottom whitespace:底部空白多少 px,active content height 占比多少M1 nav-safe:最低内容是否进入底部分页安全线M2 title gap:标题和下一块内容之间的实际距离修正阶梯:
1-40px over:只微调,上移内容组或收紧一个 gap/padding,不要删内容。40-90px over:局部压缩间距或模块高度,仍优先保留内容。90-160px over:轻微压标题或压缩一段正文,必要时拆页。160px+ over:才考虑换版式、合并模块或删内容。修完再跑一次 validator。如果 M1 bottom whitespace 变大,说明修过头了;恢复部分间距、放大最后一块或把内容组向下回调。
代码只能证明类名和结构存在,不能证明版式舒服。生成后必须打开网页逐页看:
h-hero 类在 template.html 里缺失height:Nvh,不用 aspect-ratio(会撑破)align-self:end,用 grid + align-items:start(见 Step 3.2)nowrap(避免 1 字 1 行)font-family 没用 --serif 类变量)box-shadow / linear-gradient / border-radius > 0 都要砍掉(rule 横线除外)font-size:min(Xvw, Yvh),只用 vw 在标准 16:9 屏会溢出(吸取 P15/P20/P22 教训)card-ink / card-accent / card-fill / card-outlined 四类不能混用(禁止"蓝底+蓝描边"、"灰底+描边"等)card-fill 灰底);只突出一项时单独换 card-accent,且只允许一张border-radius 都不允许;装饰用 8×8 直角小方块,不要 9px 圆形点<i data-lucide="name"></i> + lucide.createIcons(),选棱角风格(避免圆胖)justify-self(会与虚线错位)[data-anim] 容器先强制 opacity:1,recipe 内再用 motion {opacity:[0,1]} 覆盖,否则有些页会"看不见"[data-anim] 在缩略图里 opacity:1"Microsoft YaHei UI", "Noto Sans SC"t-cat SemiBold 600 / t-meta mono uppercaseB 静态;按 B 切换 body.low-power,停止 WebGL/ASCII canvas RAF 和 Motion 入场动画.frame-img 不加 border-radius / box-shadow;边界只用 hairline.fit-contain直接在浏览器打开 index.html 就行。macOS 下:
bashopen "项目/XXX/ppt/index.html"
不需要本地服务器。图片走相对路径 images/xxx.png。
预览时不能只看普通页面。按 P 进入演讲者模式,允许浏览器打开观众窗口,至少实测一次:前后翻页、内嵌宫格选页并返回预览、首页/尾页、尾页重新开始、计时开始/暂停/重置、排练记录、自动翻页暂停/恢复、激光笔、圈选、黑白屏、冻结、设置组件、演前检查、备注保存、关闭观众窗口后的状态变化,以及“重新打开观众屏”能否恢复到当前页。
根据用户反馈修改——模板的 CSS 已经高度参数化,90% 的调整都是改 inline style(字号 font-size:Xvw / 高度 height:Yvh / 间距 gap:Zvh)。
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 分级)加载顺序建议:
SKILL.md(这个文件)了解整体themes.md 帮用户选一套主题色themes-swiss.md 帮用户选一套主题色<style> 块——这是类名的唯一来源,缺类会导致整页样式崩assets/template.htmlassets/template-swiss.htmllayouts.md(顶部有 Pre-flight 类名清单、主题节奏规划、动效 recipe 决策树)swiss-layout-lock.md,再读 layouts-swiss.md;正文页必须从 S01-S22 选择,每页写 data-layoutswiss-map-component.mdimage-prompts.md 挑图片类型、比例和基础提示词;如果是用户原始截图,先读 screenshot-framing.md,优先使用 assets/screenshot-backgrounds/ 的内置背景资产components.md 查组件(含 Motion 动效系统章节,主要服务风格 A;风格 B 的组件细节在 layouts-swiss.md 附录)presenter-mode.md,生成稳定页面 ID 和 SPEAKER_NOTESvalidate-presenter-mode.mjs;风格 B 再运行 validate-swiss-deck.mjs,最后读 checklist.md 自检动效相关:模板已把 Motion One 的加载和 recipe 逻辑内嵌到底部 module script。你不需要改 JS,只需要按 layouts.md / layouts-swiss.md 的骨架在 HTML 里加 data-anim / data-animate 即可。离线演示靠 assets/motion.min.js,断网时自动降级为"无动画但内容可读"。风格 B 模板必须保留 B 键低功耗模式:切换后停止 WebGL/ASCII canvas RAF,取消正在运行的 Web Animations,并把当前页内容直接 reveal 到静态最终态。
> 违反其中任何一条,杂志感都会垮。
height:Nvh 固定,不要用 aspect-ratio 撑> 违反其中任何一条,画面瞬间从瑞士掉到 PowerPoint。
本 skill 的两种风格分别参考了:
风格 A · 电子杂志风:
风格 B · 瑞士国际主义风:
可以把它们当做风格锚点。
Other measured skills in the registry, with their headline benchmark lift.