Magazine Web Ppt
这个 Skill 做什么
生成一份单文件 HTML的横向翻页 PPT,提供两种可选的视觉基调:
风格 A · 电子杂志 × 电子墨水(默认)
- WebGL 流体 / 等高线 / 色散背景(hero 页可见)
- 衬线标题(中文衬线栈 + Playfair Display)+ 非衬线正文 + 等宽元数据
- 适合:人文分享、行业观察、商业发布、需要"杂志感"的演讲
- 模板:
assets/template.html · 主题色:references/themes.md · 布局:references/layouts.md
- 美学锚点:像 Monocle 杂志贴上了代码
风格 B · 瑞士国际主义(Swiss Style)
- WebGL 极细网格 + 点阵背景(信息驱动设计)
- 全程无衬线(Inter + Helvetica + 中文无衬线栈)+ 极致字号对比
- 高反差功能色:克莱因蓝 IKB / 柠檬黄 / 柠檬绿 / 安全橙(四选一)
- 适合:科技产品、数据汇报、设计/工程领域分享、年度总结
- 模板:
assets/template-swiss.html · 主题色:references/themes-swiss.md · 布局:references/layouts-swiss.md
- 美学锚点:像 Massimo Vignelli + Helvetica Forever
两种风格共享:横向翻页(键盘 ← →、滚轮、触屏、ESC 索引)、Lucide 图标、内嵌关键西文字体、中文系统字体栈、Motion One 入场动效(本地分发,可离线运行)。
何时使用
合适的场景:
- 线下分享 / 行业内部讲话 / 私享会
- AI 新产品发布 / demo day
- 带有强烈个人风格的演讲
- 需要"一次做完,不用翻页工具"的网页版 slides
不合适的场景:
- 大段表格数据、图表叠加(用常规 PPT)
- 培训课件(信息密度不够)
- 需要多人协作编辑(这是静态 HTML)
工作流
Step 1 · 需求澄清(动手前必做)
如果用户已经给了完整的大纲 + 图片,可以跳过直接进 Step 2。
如果用户只给了主题或一个模糊想法,用这 6 个问题逐个对齐后再动手。不要基于猜测就开始写 slide——一旦结构定错,后期翻修代价很高:
运行环境适配
- 在 WeClaws / FastAgent / Codex 这类 agent 环境里,用普通对话直接询问用户,不要依赖平台专属的
ask_question 一类交互机制。
- 一次最多问 1-3 个最关键问题;如果信息缺口不影响开工,先做合理假设并在回复里说明。
7 问澄清清单
| # |
问题 |
为什么要问 |
| 1 |
风格 A 还是 B?(电子杂志风 / 瑞士国际主义风) |
必须先问,决定用哪个 template + layouts + themes 文件 |
| 2 |
受众是谁?分享场景?(行业内部 / 商业发布 / demo day / 私享会) |
决定语言风格和深度 |
| 3 |
分享时长? |
15 分钟 ≈ 10 页,30 分钟 ≈ 20 页,45 分钟 ≈ 25-30 页 |
| 4 |
有没有原始素材?(文档 / 数据 / 旧 PPT / 文章链接) |
有素材就基于素材,没有就帮他搭 |
| 5 |
有没有图片?放在哪? |
详见下方"图片约定" |
| 6 |
想要哪套主题色? |
杂志风 5 套(themes.md) / 瑞士风 4 套(themes-swiss.md),挑一 |
| 7 |
有没有硬约束?(必须包含 XX 数据 / 不能出现 YY) |
避免返工 |
风格选择参考(问题 1)
| 如果用户说... |
推荐风格 |
| "杂志感" / "人文" / "Monocle 风" / 不指定 |
A · 电子杂志风 |
| "瑞士风" / "Swiss Style" / "Helvetica" / "极简" / "网格" / "信息图" / "数据驱动" |
B · 瑞士国际主义风 |
| 内容是 AI 产品 / 技术 / 工程 / 数据汇报 |
B 更合适 |
| 内容是行业观察 / 人文 / 故事 / 文化 |
A 更合适 |
| 用户给了大量 KPI 数字 / 路线图 / 流程 |
B 更合适(Data Hero 布局是瑞士风专长) |
| 用户给了大量纪实照片 / 人文图片 |
A 更合适(图片网格、左文右图是杂志风专长) |
| 用户需要 GPT-M 2.0 生成截图再设计 / 信息图 / 证据墙 |
B 也很合适(P23/P24 是瑞士风图片专用版式) |
大纲协助(如果用户没有大纲)
用"叙事弧"模板搭骨架,再填内容:
钩子(Hook) → 1 页 : 抛一个反差 / 问题 / 硬数据让人停下来
定调(Context) → 1-2 页 : 说明背景 / 你是谁 / 为什么讲这个
主体(Core) → 3-5 页 : 核心内容,用 Layout 4/5/6/9/10 穿插
转折(Shift) → 1 页 : 打破预期 / 提出新观点
收束(Takeaway) → 1-2 页 : 金句 / 悬念问题 / 行动建议
叙事弧 + 页数规划 + 主题节奏表(见 layouts.md),三张表对齐后再进 Step 2。
大纲建议保存为 项目记录.md 或 大纲-v1.md,便于后续迭代。
图片约定(告知用户)
在动手前向用户说清:
- 文件夹位置:
项目/XXX/ppt/images/ 下(和 index.html 同级)
- 命名规范:
{页号}-{语义}.{ext},例如 01-cover.jpg / 03-figma.jpg / 05-dashboard.png
- 页号补零便于排序
- 语义用英文,短、具体、和内容对应
- 规格建议:
- 单张 ≥ 1600px 宽(避免大屏模糊)
- JPG 用于照片/截图,PNG 用于透明 UI/图表
- 总大小控制在 10MB 内(影响翻页流畅度)
- 如何替换:保持同名覆盖最稳(HTML 里不用改路径);如果文件名变了,记得全局搜
images/旧名 改成新名
- 没图怎么办:和用户对齐,可以先用占位色块生成结构,等图片后期补;但要告知 layout 4/5/10 等图文混排页没图就没法验证视觉效果
Codex 配图生成(可选)
如果当前运行环境是 Codex,完成 deck 初稿后,主动问用户是否需要用 GPT-M 2.0 生成配图并插入 PPT。不要默认生成。
推荐询问方式:
要不要为这份 PPT 生成几张配图?可以做成人文纪实照片、杂志风信息图、流程/对比/系统关系图,或把截图再设计成统一的杂志风视觉。
如果用户确认生成,再问他想要哪种图片类型或风格;如果用户没有偏好,根据页面内容自行推荐 1-3 张最值得生成的配图。
生成配图时遵守:
- 提示词保持简短,只框定主题、用途、风格和比例,不要写长篇摄影指导
- 图片风格必须贴合当前 deck 风格:风格 A 用"电子杂志 × 电子墨水";风格 B 用"瑞士国际主义 / Swiss Style"
- 信息图、图表、截图再设计里的文字语言必须跟随用户正在使用的语言;中文 deck 用中文,英文 deck 用英文
- 先看
references/image-prompts.md 选择图片类型和基础提示词
- 配图比例必须匹配最终落位:主视觉 16:9,左文右图 16:10 / 4:3,信息图 16:9 / 16:10,截图再设计 16:10,图文混排小图 3:2 / 3:4,网格图统一高度裁切
- 生成后的图片放到
images/ 下,命名遵守 {页号}-{语义}.{ext}
Step 2 · 拷贝模板
根据 Step 1 选定的风格,拷贝对应的模板到目标位置(通常是 项目/XXX/ppt/index.html),同时在同级准备 images/ 和 assets/ 两个目录。assets/ 必须和 index.html 同级存在,因为模板会从那里读取本地 motion / lucide 运行时文件。
mkdir -p "项目/XXX/ppt/images" "项目/XXX/ppt/assets"
# 风格 A · 电子杂志风
cp "<SKILL_ROOT>/assets/template.html" "项目/XXX/ppt/index.html"
# 或 风格 B · 瑞士国际主义风
cp "<SKILL_ROOT>/assets/template-swiss.html" "项目/XXX/ppt/index.html"
# 两种风格都要带上本地运行时资产
cp "<SKILL_ROOT>/assets/motion.min.js" "项目/XXX/ppt/assets/motion.min.js"
cp "<SKILL_ROOT>/assets/lucide.min.js" "项目/XXX/ppt/assets/lucide.min.js"
两个 template*.html 都是完整可运行的种子文件——CSS、WebGL shader、翻页 JS、关键西文字体内嵌、中文系统字体栈与图标脚本都已预设好,只有 <!-- SLIDES_HERE --> 占位符等待你填充 slide 内容。最终交付目录的最小结构是 index.html + images/ + assets/;不要把 assets/ 改名,也不要把 motion.min.js / lucide.min.js 挪走。
注意:风格 A 和 B 不能混用。layouts.md 里的类(如 .h-hero 衬线大标题、.display-zh 等)只在 template.html 有定义;layouts-swiss.md 里的类(如 .kpi-hero、.accent-block、.span-N、.dots 等)只在 template-swiss.html 有定义。一份 deck 只能选一套。
2.1 · 必改占位符(容易漏)
拷贝后立刻改掉以下占位符,否则浏览器 Tab 会显示"[必填] 替换为 PPT 标题"这种尴尬文字:
| 位置 |
原始 |
需改为 |
<title> |
[必填] 替换为 PPT 标题 · Deck Title |
实际 deck 标题(如 一种新的工作方式 · Luke Wroblewski) |
每次拷贝完 index.html 第一件事:grep 一下"[必填]" 确认全部替换完。
2.2 · 选定主题色(5 套预设 · 不允许自定义)
本 skill 只允许从 5 套精心调配的预设里选一套,不接受用户自定义 hex 值——颜色搭配错了画面瞬间变丑,保护美学比给自由更重要。
| # |
主题 |
适合 |
| 1 |
🖋 墨水经典 |
通用 / 商业发布 / 不知道选啥的默认 |
| 2 |
🌊 靛蓝瓷 |
科技 / 研究 / 数据 / 技术发布会 |
| 3 |
🌿 森林墨 |
自然 / 可持续 / 文化 / 非虚构 |
| 4 |
🍂 牛皮纸 |
怀旧 / 人文 / 文学 / 独立杂志 |
| 5 |
🌙 沙丘 |
艺术 / 设计 / 创意 / 画廊 |
操作:
- 基于内容主题推荐一套,或直接问用户选哪一套
- 打开
references/themes.md,找到对应主题的 :root 块
- 整体替换
项目/XXX/ppt/index.html 开头 :root{ 块里标有"主题色"注释的那几行(--ink / --ink-rgb / --paper / --paper-rgb / --paper-tint / --ink-tint)
- 其他 CSS 都走
var(--...),无需任何其他改动
硬规则:
- 一份 deck 只用一套主题,不要中途换色
- 不要接受用户给的任意 hex 值——委婉拒绝并展示 5 套让选
- 不要混搭(例如 ink 取墨水经典、paper 取沙丘)——会彻底违和
Step 3 · 填充内容
3.0 · 预检:类名必须在模板的 <style> 里有定义(最重要)
这是所有生成问题的源头。layouts 骨架使用了很多类名,如果模板的 <style> 里没有对应定义,浏览器会 fallback 到默认样式——大标题字体错、卡片挤成一团、pipeline 糊成一行、图片堆到页面底部。
两种风格类名互不通用(再次强调):
- 风格 A 模板里有
h-hero(衬线)、stat-card、grid-2-7-5、frame 等
- 风格 B 模板里有
h-hero(无衬线)、kpi-hero、accent-block、span-N、dots、grid-12 等
- 同名 class 在两个模板里视觉表现完全不同(例:风格 A 的
h-hero 是中文衬线栈 + Playfair 气质,风格 B 的 h-hero 是 Inter 无衬线)
在写任何 slide 代码之前:
- 先 Read 当前正在编辑的 deck 文件(通常是
项目/XXX/ppt/index.html,至少读到 <style> 块末尾)
- 对照对应 layouts 文件的 Pre-flight 列表,确认你要用的每个类都在
<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-min
- 排版:
h-hero(无衬线 7.4vw weight 200) / h-statement(9.6vw) / h-xl / h-md / t-cat(SemiBold 600 小标) / t-meta(mono uppercase) / lead / num-mega / mono
- 卡片(四类互斥):
card-ink / card-accent / card-fill / card-outlined
- 网格:
grid-12 / grid-2-9 / grid-2-9-5 / span-N
- 时间线:
timeline-v + tl-node + tl-axis + dot / timeline-h + tl-h-node + tl-h-axis
- 图表:
kpi-tower-row + bar-tower / h-bar-chart + bar-row + bar-fill / spec-bars + bar-vert
- 装饰:
dot-mat(SVG mask 实心点)/ ring-mat(描边圆)/ cross-mat(× 网格)/ hr-hairline
- 版式专属:
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
- 图片混排:
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 · 规划主题节奏(和类预检同等重要)
在挑布局之前,必须先列出每一页的主题 class(hero dark / hero light / light / dark)并写到文档或草稿里对齐。详细规则看 references/layouts.md 开头的"主题节奏规划"一节。
强制规则:
- 每页 section 必须带
light / dark / hero light / hero dark 之一,不要只写 hero
- 连续 3 页以上同主题 = 视觉疲劳,不允许
- 8 页以上必须有 ≥1 个
hero dark + ≥1 个 hero light
- 整个 deck 不能只有
light 正文页,必须有 dark 正文页制造呼吸
- 每 3-4 页插入 1 个 hero 页(封面/幕封/问题/大引用)
生成后自检:grep 'class="slide' index.html 列出所有主题,人工确认节奏合理再交付。
3.1 · 挑布局
不要从零写 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:
- 正文页只能使用原始参考 PPT 登记的 22 个版式
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 之外的正文结构,除非用户明确要求实验版式。
- 顶部中文标题默认左对齐、处在左上内容轴。不要把小标题放左列、大标题放右列,造成视觉居中;只有原始 statement/split 版式允许强中心叙事。
- SVG 只负责几何图形。不要在 SVG 里写文字标签,所有标签改用 HTML 网格/卡片/caption。
原始 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 |
选对应 layout,粘过去,改文案和图片路径即可。务必先完成 3.0 预检。
风格 B 版式多样性硬规则:
- 7-8 页 deck 至少使用 6 个不同 S 编号版式;10 页以上至少使用 8 个不同版式。
- 如果用户说"测试模板 / 看看效果 / 多一点版式",必须覆盖:一个封面、一个收尾、至少 1 个对比或时间线(S08/S11/S02)、至少 1 个结构图(S14/S17/S15)、至少 1 个图片版式(S22 或 S15/S16 图片格改造)。
- 不允许连续 3 页使用同一种主体结构,例如连续三页
head + grid + card。
- 图片页不能偷懒发明新结构。2-3 张图时,用 S15/S16 的原始网格骨架改造成图片格;单张大图用 S22。
- 开写 HTML 前先列一张
页码 → data-layout → 选用理由 → 图片槽位 草稿;交付前运行 node <SKILL_ROOT>/scripts/validate-swiss-deck.mjs index.html。
3.2 · 图片比例规范
永远用标准比例,不要用原图奇葩比例(如 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 已预设)让图片贴顶即可;只有风格 B 的 P23 可以用 .swiss-img-split.align-image-bottom,因为模板已经给它内置了 --nav-safe-bottom 安全区。
风格 B 瑞士风额外规则:
- 单张大图用 S22;多图测试用 S15/S16 的原始卡片网格改造,不要用未登记的 P23/P24
- 生成图片前先写
data-image-slot:例如 s22-hero-21x9 / s15-grid-21x9 / s16-brief-21x9
- S22 配图默认生成 21:9,提示词必须包含
subject centered in the safe middle area;照片容器用 object-position:center 35%,不要用 top center
- 图片容器必须直角、无阴影、无圆角;默认背景用白色
var(--paper),不要用灰底包白底信息图
- 白底 GPT 信息图/流程图/UI 图默认不要加外框描边,不要随手套
.swiss-keyline;需要强调时只用 .swiss-lined 的顶部 accent 线
- UI/信息图如果是用户原始截图或文字密集图,才用
.fit-contain;如果已按 S15/S16 槽位重生成,必须用 .frame-img.r-21x9 / .frame-img.r-16x10 铺满容器,不要固定 height:18vh 后把图缩小
- 多图同组必须统一图片槽位、比例和高度,不能混用
- GPT-M 2.0 生成图使用
image-prompts.md 的"风格 B:瑞士国际主义配图规则"
- 任何图片、caption、timeline label、footnote 的最低处都不能进入底部分页区域;需要贴底时用
.nav-safe-bottom / .nav-safe-bottom-tight,不要手写 bottom:2vh
3.2.1 · 中文大标题字号分档(风格 B 必做)
中文方块字视觉面积大,不能直接套英文 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) |
如果标题挤占了图片或正文区域,先压缩标题文案,再降字号;不要靠把下方内容推到底来硬塞。
组件细节(字体、颜色、网格、图标、callout、stat-card 等)在 references/components.md。
Step 4 · 对照检查清单自检
生成完一定要打开 references/checklist.md,逐项对照。P0 级别的问题(emoji、图片撑破、标题换行、字体分工)必须全部通过。
4.0 · 不只看代码:必须打开网页做视觉核对
代码只能证明类名和结构存在,不能证明版式舒服。生成后必须打开网页逐页看:
- 同时打开当前模板、生成页和对应参考页做并排视觉核对。
- 截图前等入场动效稳定(约 1-2 秒),不要把动画中间态当成版式问题。
- 先看视觉:大标题字重、标题与内容间距、图片是否与正文对齐、图片/说明是否碰到底部分页组件。
- 再看代码:确认该页选用的版式与内容形状匹配,没有把数据专用版式拿来讲概念,也没有把可选组件堆成装饰。
- 对照原始参考模板时,以实际页面用法为准,不要只看 CSS helper 定义;原始页面的大字实际多为 200/300,不要被 raw CSS 里的 700/800/900 带偏。
- 如果页面别扭,先判断是版式选错、必选组件缺失、可选组件滥用,还是间距/安全区问题;不要直接靠加 margin 硬救。
风格 A · 电子杂志风必查
- 大标题必须是衬线字体——如果显示成非衬线,99% 是 Step 3.0 预检没做,
h-hero 类在 template.html 里缺失
- 图片网格里只用
height:Nvh,不用 aspect-ratio(会撑破)
- 图片不能堆到页面底部——不要用
align-self:end,用 grid + align-items:start(见 Step 3.2)
- 图片只能用标准比例(16:10 / 4:3 / 3:2 / 1:1 / 16:9),不要复制原图的奇葩比例
- 中文大标题 ≤ 5 字且
nowrap(避免 1 字 1 行)
- 用 Lucide,不用 emoji
- 标题用衬线,正文用非衬线,元数据用等宽
风格 B · 瑞士国际主义必查
- 全程无衬线——任何衬线字体出现都是错的(检查
font-family 没用 --serif 类变量)
- 只有一个 accent 色——一份 deck 不能同时出现 IKB 蓝 + 柠檬黄 + 安全橙等多个高亮色
- 不允许渐变 / 阴影 / 圆角——所有色块直角纯色,任何
box-shadow / linear-gradient / border-radius > 0 都要砍掉(rule 横线除外)
- 极致字号对比——主标题与正文比例 ≥ 8:1
- 大字号必须双约束限高——
font-size:min(Xvw, Yvh),只用 vw 在标准 16:9 屏会溢出(吸取 P15/P20/P22 教训)
- 大字字重 200(ExtraLight)——字号越大越细,瑞士风灵魂;禁止 600/700/800 大字
- 卡片填充类型互斥——
card-ink / card-accent / card-fill / card-outlined 四类不能混用(禁止"蓝底+蓝描边"、"灰底+描边"等)
- 多卡并列时统一样式——3-12 张卡用同一类(优先
card-fill 灰底);只突出一项时单独换 card-accent,且只允许一张
- 直角到底——任何
border-radius 都不允许;装饰用 8×8 直角小方块,不要 9px 圆形点
- 图标用 lucide,不自己画 SVG——
<i data-lucide="name"></i> + lucide.createIcons(),选棱角风格(避免圆胖)
- 时间线对齐——axis 列固定 12px + dot 绝对定位,不要用 grid
justify-self(会与虚线错位)
- 章节级标题与内容间距 ≥ 9vh——避免拥挤(吸取 P15/P16 教训)
- 每页一个语义化动效 recipe——不是统一 fade-up,数字 scale 弹入、bar scaleY 拉起、SVG stroke 描线、节点序列点亮等;禁止所有页用同一个 generic 配方
- playSlide 入口 reveal 容器——
[data-anim] 容器先强制 opacity:1,recipe 内再用 motion {opacity:[0,1]} 覆盖,否则有些页会"看不见"
- ESC 索引页可见性——cloned slide 必须有 CSS override 让
[data-anim] 在缩略图里 opacity:1
- 中文字体必须走系统栈——Windows 用户没有"苹方",必须 fallback 到
"Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑";不要把整包 CJK 字体塞进模板
- 字体粗细体例:大字 200 / 正文 300 /
t-cat SemiBold 600 / t-meta mono uppercase
- 保留低功耗快捷键——右下角必须提示
B 静态;按 B 切换 body.low-power,停止 WebGL/ASCII canvas RAF 和 Motion 入场动画
- 装饰元素严格在 grid 内——bars 矩阵、点阵、ring-mat 不能贴边或溢出页面
- 底部内容预留 nav 空间——nav 在 ~97vh,内容收尾不要过 93vh(吸取 P22 KPI 大字溢底教训)
- 图片容器直角无阴影——
.frame-img 不加 border-radius / box-shadow;边界只用 hairline
- P23/P24 图片同组一致——同一组图片统一比例、高度、边距、线条粗细;信息图/UI 图加
.fit-contain
- 组件角色要正确——P23/P24 的 caption 是必选信息锚点;P22 的 KPI/说明是必选;数据专用版式必须有真实数据,不能靠文案硬填
- 通用/非通用版式要分清——P3/P8/P11/P19/P23 较通用;P6/P7/P20/P21/P22 是数据/案例专用;P14/P15/P17 是结构专用
Step 5 · 预览与交付
默认产物是 workspace 里的 index.html 和同级 images/ 目录。
- 优先把这两个产物作为最终交付物返回给用户,或交给用户放到本地浏览器、静态站点或任意可访问的 HTTP 地址中打开。
- 不要假设 WeClaws 的 remote sandbox 能直接对
file:// 本地路径做浏览器预览。
- 如果确实需要远程浏览器验证,优先先把 deck 放到可访问的 HTTP 地址,再用远程浏览器检查翻页、动效和图片加载。
- 图片继续走相对路径
images/xxx.png。
Step 6 · 迭代
根据用户反馈修改——模板的 CSS 已经高度参数化,90% 的调整都是改 inline style(字号 font-size:Xvw / 高度 height:Yvh / 间距 gap:Zvh)。
资源文件导览
ppt-skill/
├── SKILL.md ← 你正在读
├── assets/
│ ├── template.html ← 风格 A · 电子杂志风模板(种子文件)
│ ├── template-swiss.html ← 风格 B · 瑞士国际主义风模板(种子文件)
│ ├── motion.min.js ← Motion One 本地副本(离线兜底,约 64KB,共用)
│ └── lucide.min.js ← Lucide 本地副本(离线图标渲染)
├── licenses/
│ ├── lucide-LICENSE.txt ← Lucide 许可证文本
│ └── motion-LICENSE.md ← Motion 许可证文本
├── THIRD_PARTY_NOTICES.md ← Vendored runtime assets 来源说明
├── scripts/
│ └── validate-swiss-deck.mjs ← 风格 B 静态校验:登记版式、图片槽位、SVG 文本、标题对齐
└── references/
├── components.md ← 组件手册(字体、色、网格、图标、callout、stat、pipeline、动效... 风格 A 适用)
├── layouts.md ← 风格 A · 10 种页面布局骨架(可直接粘贴,含动效标记)
├── swiss-layout-lock.md ← 风格 B · 原始 22P 版式锁,正文页必须按这里登记
├── layouts-swiss.md ← 风格 B · 原始 22P 骨架说明 + 少量明确标注的实验区
├── themes.md ← 风格 A · 5 套主题色预设(只能选不能自定义)
├── themes-swiss.md ← 风格 B · 4 套瑞士风主题色预设(IKB / 柠檬黄 / 柠檬绿 / 安全橙)
├── image-prompts.md ← GPT-M 2.0 配图类型、比例和基础提示词
└── checklist.md ← 质量检查清单(P0/P1/P2/P3 分级)
加载顺序建议:
- 先读完
SKILL.md(这个文件)了解整体
- Step 1 需求澄清第一问先确定风格 A 还是 B,然后:
- 风格 A:读
themes.md 帮用户选一套主题色
- 风格 B:读
themes-swiss.md 帮用户选一套主题色
- 动手前 Read 生成后的
项目/XXX/ppt/index.html 的 <style> 块——这是当前 deck 类名的唯一来源,缺类会导致整页样式崩
- 读对应的 layouts 文件挑布局:
- 风格 A →
layouts.md(顶部有 Pre-flight 类名清单、主题节奏规划、动效 recipe 决策树)
- 风格 B → 先读
swiss-layout-lock.md,再读 layouts-swiss.md;正文页必须从 S01-S22 选择,每页写 data-layout
- 如果在 Codex 中生成配图,读
image-prompts.md 挑图片类型、比例和基础提示词
- 细节调整时读
components.md 查组件(含 Motion 动效系统章节,主要服务风格 A;风格 B 的组件细节在 layouts-swiss.md 附录)
- 生成后先运行
node scripts/validate-swiss-deck.mjs path/to/index.html,再读 checklist.md 自检
动效相关:模板已把 Motion One 的加载和 recipe 逻辑内嵌到底部 module script。你不需要改 JS,只需要按 layouts.md / layouts-swiss.md 的骨架在 HTML 里加 data-anim / data-animate 即可。离线演示依赖同级 assets/motion.min.js 和 assets/lucide.min.js;本地资产缺失时会直接降级为"无动画 / 无图标但内容可读"。风格 B 模板必须保留 B 键低功耗模式:切换后停止 WebGL/ASCII canvas RAF,取消正在运行的 Web Animations,并把当前页内容直接 reveal 到静态最终态。
核心设计原则
风格 A · 电子杂志风
违反其中任何一条,杂志感都会垮。
- 克制优于炫技 — WebGL 背景只在 hero 页透出,普通页几乎看不见
- 结构优于装饰 — 不用阴影、不用浮动卡片、不用 padding box,一切信息靠大字号 + 字体对比 + 网格留白
- 内容层级由字号和字体共同定义 — 最大衬线 = 主标题,中衬线 = 副标,大非衬线 = lead,小非衬线 = body,等宽 = 元数据
- 图片是第一公民 — 图片只裁底部,保证顶部和左右完整;网格用
height:Nvh 固定,不要用 aspect-ratio 撑
- 节奏靠 hero 页 — hero 和 non-hero 交替,才不累眼睛
- 术语统一 — Skills 就是 Skills,不要中英混合翻译
风格 B · 瑞士国际主义风
违反其中任何一条,画面瞬间从瑞士掉到 PowerPoint。
- 单一锚点色 — 一份 deck 只用一个 accent,不允许多色高亮拼贴
- 极致字号对比 — 主标题与正文比例 ≥ 8:1,KPI 必须是"Data Hero"(屏幕宽度的 18-22%)
- 无衬线只此一家 — Inter / Helvetica / 中文无衬线系统栈,任何衬线都是错的
- 直角纯色 — 不允许渐变 / 阴影 / 圆角(rule 横线除外)
- 网格至上 — 所有元素吸附到 12-col grid,左对齐 + 大幅留白做非对称美学
- Hairline 是手术刀 — 1px 的极细分割线就够,不要加粗、不要加阴影
- 点阵装饰只在 hero 页透出 — 正文页保持纯净底色
风格锚点
- 风格 A 关注杂志感叙事、衬线标题、图片主导和较强的版面节奏。
- 风格 B 关注无衬线、单一 accent、严格网格、发丝线和高对比信息表达。
1---2name: ppt-skill3description: 当用户需要制作分享、演讲、发布会风格的单文件 HTML 网页 PPT,或提到“杂志风 PPT”、“瑞士风 PPT”、“Swiss Style”、“horizontal swipe deck”时使用。提供电子杂志风与瑞士国际主义两套模板、配图提示词、主题色预设和静态校验脚本。4---56# Magazine Web Ppt78## 这个 Skill 做什么910生成一份**单文件 HTML**的横向翻页 PPT,提供两种可选的视觉基调:1112### 风格 A · 电子杂志 × 电子墨水(默认)1314- **WebGL 流体 / 等高线 / 色散背景**(hero 页可见)15- **衬线标题(中文衬线栈 + Playfair Display)+ 非衬线正文 + 等宽元数据**16- 适合:人文分享、行业观察、商业发布、需要"杂志感"的演讲17- 模板:`assets/template.html` · 主题色:`references/themes.md` · 布局:`references/layouts.md`18- 美学锚点:像 *Monocle* 杂志贴上了代码1920### 风格 B · 瑞士国际主义(Swiss Style)2122- **WebGL 极细网格 + 点阵背景**(信息驱动设计)23- **全程无衬线(Inter + Helvetica + 中文无衬线栈)+ 极致字号对比**24- **高反差功能色**:克莱因蓝 IKB / 柠檬黄 / 柠檬绿 / 安全橙(四选一)25- 适合:科技产品、数据汇报、设计/工程领域分享、年度总结26- 模板:`assets/template-swiss.html` · 主题色:`references/themes-swiss.md` · 布局:`references/layouts-swiss.md`27- 美学锚点:像 Massimo Vignelli + Helvetica Forever2829**两种风格共享**:横向翻页(键盘 ← →、滚轮、触屏、ESC 索引)、Lucide 图标、内嵌关键西文字体、中文系统字体栈、Motion One 入场动效(本地分发,可离线运行)。3031## 何时使用3233**合适的场景**:34- 线下分享 / 行业内部讲话 / 私享会35- AI 新产品发布 / demo day36- 带有强烈个人风格的演讲37- 需要"一次做完,不用翻页工具"的网页版 slides3839**不合适的场景**:40- 大段表格数据、图表叠加(用常规 PPT)41- 培训课件(信息密度不够)42- 需要多人协作编辑(这是静态 HTML)4344## 工作流4546### Step 1 · 需求澄清(**动手前必做**)4748**如果用户已经给了完整的大纲 + 图片**,可以跳过直接进 Step 2。4950**如果用户只给了主题或一个模糊想法**,用这 6 个问题逐个对齐后再动手。不要基于猜测就开始写 slide——一旦结构定错,后期翻修代价很高:5152#### 运行环境适配5354- 在 WeClaws / FastAgent / Codex 这类 agent 环境里,用普通对话直接询问用户,不要依赖平台专属的 `ask_question` 一类交互机制。55- 一次最多问 1-3 个最关键问题;如果信息缺口不影响开工,先做合理假设并在回复里说明。5657#### 7 问澄清清单5859| # | 问题 | 为什么要问 |60|---|------|-----------|61| 1 | **风格 A 还是 B?**(电子杂志风 / 瑞士国际主义风) | **必须先问**,决定用哪个 template + layouts + themes 文件 |62| 2 | **受众是谁?分享场景?**(行业内部 / 商业发布 / demo day / 私享会) | 决定语言风格和深度 |63| 3 | **分享时长?** | 15 分钟 ≈ 10 页,30 分钟 ≈ 20 页,45 分钟 ≈ 25-30 页 |64| 4 | **有没有原始素材?**(文档 / 数据 / 旧 PPT / 文章链接) | 有素材就基于素材,没有就帮他搭 |65| 5 | **有没有图片?放在哪?** | 详见下方"图片约定" |66| 6 | **想要哪套主题色?** | 杂志风 5 套(`themes.md`) / 瑞士风 4 套(`themes-swiss.md`),挑一 |67| 7 | **有没有硬约束?**(必须包含 XX 数据 / 不能出现 YY) | 避免返工 |6869#### 风格选择参考(问题 1)7071| 如果用户说... | 推荐风格 |72|---|---|73| "杂志感" / "人文" / "Monocle 风" / 不指定 | **A · 电子杂志风** |74| "瑞士风" / "Swiss Style" / "Helvetica" / "极简" / "网格" / "信息图" / "数据驱动" | **B · 瑞士国际主义风** |75| 内容是 AI 产品 / 技术 / 工程 / 数据汇报 | B 更合适 |76| 内容是行业观察 / 人文 / 故事 / 文化 | A 更合适 |77| 用户给了大量 KPI 数字 / 路线图 / 流程 | B 更合适(`Data Hero` 布局是瑞士风专长) |78| 用户给了大量纪实照片 / 人文图片 | A 更合适(图片网格、左文右图是杂志风专长) |79| 用户需要 GPT-M 2.0 生成截图再设计 / 信息图 / 证据墙 | B 也很合适(P23/P24 是瑞士风图片专用版式) |8081#### 大纲协助(如果用户没有大纲)8283用"叙事弧"模板搭骨架,再填内容:8485```86钩子(Hook) → 1 页 : 抛一个反差 / 问题 / 硬数据让人停下来87定调(Context) → 1-2 页 : 说明背景 / 你是谁 / 为什么讲这个88主体(Core) → 3-5 页 : 核心内容,用 Layout 4/5/6/9/10 穿插89转折(Shift) → 1 页 : 打破预期 / 提出新观点90收束(Takeaway) → 1-2 页 : 金句 / 悬念问题 / 行动建议91```9293叙事弧 + 页数规划 + 主题节奏表(见 `layouts.md`),**三张表对齐后**再进 Step 2。9495大纲建议保存为 `项目记录.md` 或 `大纲-v1.md`,便于后续迭代。9697#### 图片约定(告知用户)9899在动手前向用户说清:100101- **文件夹位置**:`项目/XXX/ppt/images/` 下(和 `index.html` 同级)102- **命名规范**:`{页号}-{语义}.{ext}`,例如 `01-cover.jpg` / `03-figma.jpg` / `05-dashboard.png`103 - 页号补零便于排序104 - 语义用英文,短、具体、和内容对应105- **规格建议**:106 - 单张 ≥ 1600px 宽(避免大屏模糊)107 - JPG 用于照片/截图,PNG 用于透明 UI/图表108 - 总大小控制在 10MB 内(影响翻页流畅度)109- **如何替换**:保持**同名覆盖**最稳(HTML 里不用改路径);如果文件名变了,记得全局搜 `images/旧名` 改成新名110- **没图怎么办**:和用户对齐,可以先用占位色块生成结构,等图片后期补;但要告知 layout 4/5/10 等图文混排页没图就没法验证视觉效果111112#### Codex 配图生成(可选)113114如果当前运行环境是 **Codex**,完成 deck 初稿后,主动问用户是否需要用 GPT-M 2.0 生成配图并插入 PPT。不要默认生成。115116推荐询问方式:117118> 要不要为这份 PPT 生成几张配图?可以做成人文纪实照片、杂志风信息图、流程/对比/系统关系图,或把截图再设计成统一的杂志风视觉。119120如果用户确认生成,再问他想要哪种图片类型或风格;如果用户没有偏好,根据页面内容自行推荐 1-3 张最值得生成的配图。121122生成配图时遵守:123124- 提示词保持简短,只框定主题、用途、风格和比例,不要写长篇摄影指导125- 图片风格必须贴合当前 deck 风格:风格 A 用"电子杂志 × 电子墨水";风格 B 用"瑞士国际主义 / Swiss Style"126- 信息图、图表、截图再设计里的文字语言必须跟随用户正在使用的语言;中文 deck 用中文,英文 deck 用英文127- 先看 `references/image-prompts.md` 选择图片类型和基础提示词128- 配图比例必须匹配最终落位:主视觉 16:9,左文右图 16:10 / 4:3,信息图 16:9 / 16:10,截图再设计 16:10,图文混排小图 3:2 / 3:4,网格图统一高度裁切129- 生成后的图片放到 `images/` 下,命名遵守 `{页号}-{语义}.{ext}`130131### Step 2 · 拷贝模板132133**根据 Step 1 选定的风格,拷贝对应的模板**到目标位置(通常是 `项目/XXX/ppt/index.html`),同时在同级准备 `images/` 和 `assets/` 两个目录。`assets/` 必须和 `index.html` 同级存在,因为模板会从那里读取本地 `motion` / `lucide` 运行时文件。134135```bash136mkdir -p "项目/XXX/ppt/images" "项目/XXX/ppt/assets"137138# 风格 A · 电子杂志风139cp "<SKILL_ROOT>/assets/template.html" "项目/XXX/ppt/index.html"140141# 或 风格 B · 瑞士国际主义风142cp "<SKILL_ROOT>/assets/template-swiss.html" "项目/XXX/ppt/index.html"143144# 两种风格都要带上本地运行时资产145cp "<SKILL_ROOT>/assets/motion.min.js" "项目/XXX/ppt/assets/motion.min.js"146cp "<SKILL_ROOT>/assets/lucide.min.js" "项目/XXX/ppt/assets/lucide.min.js"147```148149两个 `template*.html` 都是**完整可运行**的种子文件——CSS、WebGL shader、翻页 JS、关键西文字体内嵌、中文系统字体栈与图标脚本都已预设好,只有 `<!-- SLIDES_HERE -->` 占位符等待你填充 slide 内容。最终交付目录的最小结构是 `index.html + images/ + assets/`;不要把 `assets/` 改名,也不要把 `motion.min.js` / `lucide.min.js` 挪走。150151**注意**:风格 A 和 B **不能混用**。layouts.md 里的类(如 `.h-hero` 衬线大标题、`.display-zh` 等)只在 template.html 有定义;layouts-swiss.md 里的类(如 `.kpi-hero`、`.accent-block`、`.span-N`、`.dots` 等)只在 template-swiss.html 有定义。一份 deck 只能选一套。152153#### 2.1 · 必改占位符(**容易漏**)154155拷贝后立刻改掉以下占位符,否则浏览器 Tab 会显示"[必填] 替换为 PPT 标题"这种尴尬文字:156157| 位置 | 原始 | 需改为 |158|------|------|--------|159| `<title>` | `[必填] 替换为 PPT 标题 · Deck Title` | 实际 deck 标题(如 `一种新的工作方式 · Luke Wroblewski`) |160161每次拷贝完 `index.html` 第一件事:grep 一下"[必填]" 确认全部替换完。162163#### 2.2 · 选定主题色(5 套预设 · 不允许自定义)164165本 skill **只允许从 5 套精心调配的预设里选一套**,不接受用户自定义 hex 值——颜色搭配错了画面瞬间变丑,保护美学比给自由更重要。166167| # | 主题 | 适合 |168|---|------|------|169| 1 | 🖋 墨水经典 | 通用 / 商业发布 / 不知道选啥的默认 |170| 2 | 🌊 靛蓝瓷 | 科技 / 研究 / 数据 / 技术发布会 |171| 3 | 🌿 森林墨 | 自然 / 可持续 / 文化 / 非虚构 |172| 4 | 🍂 牛皮纸 | 怀旧 / 人文 / 文学 / 独立杂志 |173| 5 | 🌙 沙丘 | 艺术 / 设计 / 创意 / 画廊 |174175**操作**:1761. 基于内容主题推荐一套,或直接问用户选哪一套1772. 打开 `references/themes.md`,找到对应主题的 `:root` 块1783. **整体替换** `项目/XXX/ppt/index.html` 开头 `:root{` 块里标有"主题色"注释的那几行(`--ink` / `--ink-rgb` / `--paper` / `--paper-rgb` / `--paper-tint` / `--ink-tint`)1794. 其他 CSS 都走 `var(--...)`,无需任何其他改动180181**硬规则**:182- 一份 deck 只用一套主题,不要中途换色183- 不要接受用户给的任意 hex 值——委婉拒绝并展示 5 套让选184- 不要混搭(例如 ink 取墨水经典、paper 取沙丘)——会彻底违和185186### Step 3 · 填充内容187188#### 3.0 · 预检:类名必须在模板的 `<style>` 里有定义(**最重要**)189190**这是所有生成问题的源头**。layouts 骨架使用了很多类名,如果模板的 `<style>` 里没有对应定义,浏览器会 fallback 到默认样式——大标题字体错、卡片挤成一团、pipeline 糊成一行、图片堆到页面底部。191192**两种风格类名互不通用**(再次强调):193- 风格 A 模板里有 `h-hero`(衬线)、`stat-card`、`grid-2-7-5`、`frame` 等194- 风格 B 模板里有 `h-hero`(无衬线)、`kpi-hero`、`accent-block`、`span-N`、`dots`、`grid-12` 等195- 同名 class 在两个模板里**视觉表现完全不同**(例:风格 A 的 `h-hero` 是中文衬线栈 + Playfair 气质,风格 B 的 `h-hero` 是 Inter 无衬线)196197**在写任何 slide 代码之前:**1981991. **先 Read 当前正在编辑的 deck 文件**(通常是 `项目/XXX/ppt/index.html`,至少读到 `<style>` 块末尾)2002. **对照对应 layouts 文件的 Pre-flight 列表**,确认你要用的每个类都在 `<style>` 里存在2013. 如果某个类缺失:**在模板的 `<style>` 里补上**,不要在每个 slide 里 inline 重写2024. **模板是唯一的类名来源**——不要发明新类名,如需自定义用 `style="..."` inline203204**风格 A 常见容易遗漏的类**:205`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`206207**风格 B 常见容易遗漏的类**(2026-05 重构后):208- 画布:`canvas-card` / `chrome-min`209- 排版:`h-hero`(无衬线 7.4vw weight 200) / `h-statement`(9.6vw) / `h-xl` / `h-md` / `t-cat`(SemiBold 600 小标) / `t-meta`(mono uppercase) / `lead` / `num-mega` / `mono`210- 卡片(四类互斥):`card-ink` / `card-accent` / `card-fill` / `card-outlined`211- 网格:`grid-12` / `grid-2-9` / `grid-2-9-5` / `span-N`212- 时间线:`timeline-v` + `tl-node` + `tl-axis` + `dot` / `timeline-h` + `tl-h-node` + `tl-h-axis`213- 图表:`kpi-tower-row` + `bar-tower` / `h-bar-chart` + `bar-row` + `bar-fill` / `spec-bars` + `bar-vert`214- 装饰:`dot-mat`(SVG mask 实心点)/ `ring-mat`(描边圆)/ `cross-mat`(× 网格)/ `hr-hairline`215- 版式专属:`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`216- 图片混排:`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`217- spacing token:`--sp-3`...`--sp-13`(8/12/16/24/32/40/48/64/80/96/160 px)218219#### 3.0.5 · 规划主题节奏(**和类预检同等重要**)220221**在挑布局之前**,必须先列出每一页的主题 class(`hero dark` / `hero light` / `light` / `dark`)并写到文档或草稿里对齐。详细规则看 `references/layouts.md` 开头的"主题节奏规划"一节。222223**强制规则**:224225- 每页 section 必须带 `light` / `dark` / `hero light` / `hero dark` 之一,不要只写 `hero`226- 连续 3 页以上同主题 = 视觉疲劳,不允许227- 8 页以上必须有 ≥1 个 `hero dark` + ≥1 个 `hero light`228- 整个 deck 不能只有 `light` 正文页,必须有 `dark` 正文页制造呼吸229- 每 3-4 页插入 1 个 hero 页(封面/幕封/问题/大引用)230231**生成后自检**:`grep 'class="slide' index.html` 列出所有主题,人工确认节奏合理再交付。232233#### 3.1 · 挑布局234235**不要从零写 slide**。打开对应的 layouts 文件,里面有 10 种现成布局骨架,每种都是完整可粘贴的 `<section>` 代码块。236237**风格 A** → `references/layouts.md`:238239| Layout | 用途 |240|---|---|241| 1. 开场封面 | 第 1 页 |242| 2. 章节幕封 | 每幕开场 |243| 3. 数据大字报 | 抛硬数据 |244| 4. 左文右图(Quote + Image) | 身份反差 / 故事 |245| 5. 图片网格 | 多图对比 / 截图实证 |246| 6. 两列流水线(Pipeline) | 工作流程 |247| 7. 悬念收束 / 问题页 | 幕末 / 收尾 |248| 8. 大引用页(Big Quote) | 衬线金句 / takeaway |249| 9. 并列对比(Before / After) | 旧模式 vs 新模式 |250| 10. 图文混排(Lead Image + Side Text) | 信息密集的图文页 |251252**风格 B** → 先读 `references/swiss-layout-lock.md`,再读 `references/layouts-swiss.md`。253254瑞士主题默认进入 **Swiss locked mode**:255256- 正文页只能使用原始参考 PPT 登记的 22 个版式 `S01-S22`;新增首页/尾页只能使用 Skill 明确提供的 `SWISS-COVER-ASCII` / `SWISS-CLOSING-ASCII`。257- 每个 `<section class="slide">` 必须写 `data-layout="Sxx"`。没有 `data-layout` 就视为未登记版式。258- 不允许临时发明 `P23/P24`、`Swiss Image Split`、`Evidence Grid` 这类原始 22P 之外的正文结构,除非用户明确要求实验版式。259- 顶部中文标题默认左对齐、处在左上内容轴。不要把小标题放左列、大标题放右列,造成视觉居中;只有原始 statement/split 版式允许强中心叙事。260- SVG 只负责几何图形。不要在 SVG 里写文字标签,所有标签改用 HTML 网格/卡片/caption。261262原始 22 个正文版式如下:263264| Layout | 用途 |265|---|---|266| S01 Index Cover | 原始索引封面 |267| S02 Vertical Timeline + KPI | 演化对比 / 年代变迁 |268| S03 Split Statement | 核心论点 / 左右分屏 |269| S04 Six Cells | 6 项概念定义 |270| S05 Three Layers | 三层架构 |271| S06 KPI Tower | 4 项数据视觉化高度差 |272| S07 H-Bar Chart | 5-10 项排名比较 |273| S08 Duo Compare | Before/After 对照 |274| S09 Dot Matrix Statement | 大引述 / statement |275| S10 Split Closing | 收束页 |276| S11 Horizontal Timeline | 4-7 步流程 |277| S12 Manifesto + Ink Banner | 阶段性结论 |278| S13 Three Forces | 3 个对等概念深化 |279| S14 Loop Form | 自学闭环 / 自动化 |280| S15 Matrix + Hero Stat | 8-12 项矩阵 + 总数据 |281| S16 Multi-card Brief | 6 项快讯小卡 |282| S17 System Diagram | 三层架构 / 生态地图 |283| S18 Why Now | 三论点 + 数据支撑 |284| S19 Four Cards | 4 项等权特性 |285| S20 Stacked KPI Ledger | 纵向账单数据 |286| S21 Tech Spec Sheet | 产品规格 / benchmark |287| S22 Image Hero | 21:9 顶图 + 标题块 + 三列 KPI |288289选对应 layout,粘过去,改文案和图片路径即可。**务必先完成 3.0 预检**。290291**风格 B 版式多样性硬规则**:292- 7-8 页 deck 至少使用 **6 个不同 S 编号版式**;10 页以上至少使用 8 个不同版式。293- 如果用户说"测试模板 / 看看效果 / 多一点版式",必须覆盖:一个封面、一个收尾、至少 1 个对比或时间线(S08/S11/S02)、至少 1 个结构图(S14/S17/S15)、至少 1 个图片版式(S22 或 S15/S16 图片格改造)。294- 不允许连续 3 页使用同一种主体结构,例如连续三页 `head + grid + card`。295- 图片页不能偷懒发明新结构。2-3 张图时,用 S15/S16 的原始网格骨架改造成图片格;单张大图用 S22。296- 开写 HTML 前先列一张 `页码 → data-layout → 选用理由 → 图片槽位` 草稿;交付前运行 `node <SKILL_ROOT>/scripts/validate-swiss-deck.mjs index.html`。297298#### 3.2 · 图片比例规范299300永远用**标准比例**,不要用原图奇葩比例(如 `2592/1798`):301302| 场景 | 推荐比例 |303|------|---------|304| S22 顶部主图 | **21:9**;照片关键主体放中央安全区 |305| S15/S16 多图格 | 统一 21:9 或统一 16:10,不能混用 |306| 左文右图 主图(风格 A) | 16:10 或 4:3 + `max-height:56vh` |307| 图片网格(风格 A) | **固定 `height:26vh`**,不用 aspect-ratio |308| 左小图 + 右文字 | 1:1 或 3:2 |309| 全屏主视觉 | 16:9 + `max-height:64vh` |310| 图文混排小插图 | 3:2 或 3:4 |311312**默认不要让图片 `align-self:end`**——会滑到页面底部,很容易碰到分页组件。用 grid 容器 + `align-items:start`(template 已预设)让图片贴顶即可;只有风格 B 的 P23 可以用 `.swiss-img-split.align-image-bottom`,因为模板已经给它内置了 `--nav-safe-bottom` 安全区。313314**风格 B 瑞士风额外规则**:315- 单张大图用 S22;多图测试用 S15/S16 的原始卡片网格改造,不要用未登记的 P23/P24316- 生成图片前先写 `data-image-slot`:例如 `s22-hero-21x9` / `s15-grid-21x9` / `s16-brief-21x9`317- S22 配图默认生成 21:9,提示词必须包含 `subject centered in the safe middle area`;照片容器用 `object-position:center 35%`,不要用 `top center`318- 图片容器必须直角、无阴影、无圆角;默认背景用白色 `var(--paper)`,不要用灰底包白底信息图319- 白底 GPT 信息图/流程图/UI 图默认不要加外框描边,不要随手套 `.swiss-keyline`;需要强调时只用 `.swiss-lined` 的顶部 accent 线320- UI/信息图如果是用户原始截图或文字密集图,才用 `.fit-contain`;如果已按 S15/S16 槽位重生成,必须用 `.frame-img.r-21x9` / `.frame-img.r-16x10` 铺满容器,不要固定 `height:18vh` 后把图缩小321- 多图同组必须统一图片槽位、比例和高度,不能混用322- GPT-M 2.0 生成图使用 `image-prompts.md` 的"风格 B:瑞士国际主义配图规则"323- 任何图片、caption、timeline label、footnote 的最低处都不能进入底部分页区域;需要贴底时用 `.nav-safe-bottom` / `.nav-safe-bottom-tight`,不要手写 `bottom:2vh`324325#### 3.2.1 · 中文大标题字号分档(风格 B 必做)326327中文方块字视觉面积大,不能直接套英文 hero 的 6.8-7vw。写中文大标题前先分档:328329| 标题形态 | 推荐字号 |330|---|---|331| 1 行,≤ 8 个中文字符 | `min(6.4vw,11.2vh)` |332| 2 行,每行≤ 8 个中文字符 | `min(5.8vw,10.2vh)` |333| 2 行,任一行 9-12 个中文字符 | `min(5.2vw,9.2vh)` |334| 3 行或更长 | 优先改写标题;不得已用 `min(4.6vw,8.2vh)` |335336如果标题挤占了图片或正文区域,先压缩标题文案,再降字号;不要靠把下方内容推到底来硬塞。337338组件细节(字体、颜色、网格、图标、callout、stat-card 等)在 `references/components.md`。339340### Step 4 · 对照检查清单自检341342生成完一定要打开 `references/checklist.md`,逐项对照。P0 级别的问题(emoji、图片撑破、标题换行、字体分工)必须全部通过。343344#### 4.0 · 不只看代码:必须打开网页做视觉核对345346代码只能证明类名和结构存在,不能证明版式舒服。生成后必须打开网页逐页看:3473481. 同时打开当前模板、生成页和对应参考页做并排视觉核对。3492. 截图前等入场动效稳定(约 1-2 秒),不要把动画中间态当成版式问题。3503. 先看视觉:大标题字重、标题与内容间距、图片是否与正文对齐、图片/说明是否碰到底部分页组件。3514. 再看代码:确认该页选用的版式与内容形状匹配,没有把数据专用版式拿来讲概念,也没有把可选组件堆成装饰。3525. 对照原始参考模板时,以实际页面用法为准,不要只看 CSS helper 定义;原始页面的大字实际多为 200/300,不要被 raw CSS 里的 700/800/900 带偏。3536. 如果页面别扭,先判断是版式选错、必选组件缺失、可选组件滥用,还是间距/安全区问题;不要直接靠加 margin 硬救。354355#### 风格 A · 电子杂志风必查3563571. **大标题必须是衬线字体**——如果显示成非衬线,99% 是 Step 3.0 预检没做,`h-hero` 类在 template.html 里缺失3582. **图片网格里只用 `height:Nvh`,不用 `aspect-ratio`**(会撑破)3593. **图片不能堆到页面底部**——不要用 `align-self:end`,用 grid + `align-items:start`(见 Step 3.2)3604. **图片只能用标准比例**(16:10 / 4:3 / 3:2 / 1:1 / 16:9),不要复制原图的奇葩比例3615. **中文大标题 ≤ 5 字且 `nowrap`**(避免 1 字 1 行)3626. **用 Lucide,不用 emoji**3637. **标题用衬线,正文用非衬线,元数据用等宽**364365#### 风格 B · 瑞士国际主义必查3663671. **全程无衬线**——任何衬线字体出现都是错的(检查 `font-family` 没用 `--serif` 类变量)3682. **只有一个 accent 色**——一份 deck 不能同时出现 IKB 蓝 + 柠檬黄 + 安全橙等多个高亮色3693. **不允许渐变 / 阴影 / 圆角**——所有色块直角纯色,任何 `box-shadow` / `linear-gradient` / `border-radius` > 0 都要砍掉(rule 横线除外)3704. **极致字号对比**——主标题与正文比例 ≥ 8:13715. **大字号必须双约束限高**——`font-size:min(Xvw, Yvh)`,只用 vw 在标准 16:9 屏会溢出(吸取 P15/P20/P22 教训)3726. **大字字重 200**(ExtraLight)——字号越大越细,瑞士风灵魂;**禁止** 600/700/800 大字3737. **卡片填充类型互斥**——`card-ink` / `card-accent` / `card-fill` / `card-outlined` 四类**不能混用**(禁止"蓝底+蓝描边"、"灰底+描边"等)3748. **多卡并列时统一样式**——3-12 张卡用同一类(优先 `card-fill` 灰底);只突出一项时单独换 `card-accent`,且**只允许一张**3759. **直角到底**——任何 `border-radius` 都不允许;装饰用 8×8 直角小方块,**不要** 9px 圆形点37610. **图标用 lucide,不自己画 SVG**——`<i data-lucide="name"></i>` + `lucide.createIcons()`,选棱角风格(避免圆胖)37711. **时间线对齐**——axis 列固定 12px + dot 绝对定位,**不要**用 grid `justify-self`(会与虚线错位)37812. **章节级标题与内容间距 ≥ 9vh**——避免拥挤(吸取 P15/P16 教训)37913. **每页一个语义化动效 recipe**——不是统一 fade-up,数字 scale 弹入、bar scaleY 拉起、SVG stroke 描线、节点序列点亮等;**禁止**所有页用同一个 generic 配方38014. **playSlide 入口 reveal 容器**——`[data-anim]` 容器先强制 opacity:1,recipe 内再用 motion `{opacity:[0,1]}` 覆盖,否则有些页会"看不见"38115. **ESC 索引页可见性**——cloned slide 必须有 CSS override 让 `[data-anim]` 在缩略图里 opacity:138216. **中文字体必须走系统栈**——Windows 用户没有"苹方",必须 fallback 到 `"Microsoft YaHei UI", "Microsoft YaHei", "微软雅黑"`;不要把整包 CJK 字体塞进模板38317. **字体粗细体例**:大字 200 / 正文 300 / `t-cat` SemiBold 600 / `t-meta` mono uppercase38418. **保留低功耗快捷键**——右下角必须提示 `B 静态`;按 `B` 切换 `body.low-power`,停止 WebGL/ASCII canvas RAF 和 Motion 入场动画38519. **装饰元素严格在 grid 内**——bars 矩阵、点阵、ring-mat 不能贴边或溢出页面38620. **底部内容预留 nav 空间**——nav 在 ~97vh,内容收尾不要过 93vh(吸取 P22 KPI 大字溢底教训)38721. **图片容器直角无阴影**——`.frame-img` 不加 `border-radius` / `box-shadow`;边界只用 hairline38822. **P23/P24 图片同组一致**——同一组图片统一比例、高度、边距、线条粗细;信息图/UI 图加 `.fit-contain`38923. **组件角色要正确**——P23/P24 的 caption 是必选信息锚点;P22 的 KPI/说明是必选;数据专用版式必须有真实数据,不能靠文案硬填39024. **通用/非通用版式要分清**——P3/P8/P11/P19/P23 较通用;P6/P7/P20/P21/P22 是数据/案例专用;P14/P15/P17 是结构专用391392### Step 5 · 预览与交付393394默认产物是 workspace 里的 `index.html` 和同级 `images/` 目录。395396- 优先把这两个产物作为最终交付物返回给用户,或交给用户放到本地浏览器、静态站点或任意可访问的 HTTP 地址中打开。397- 不要假设 WeClaws 的 remote sandbox 能直接对 `file://` 本地路径做浏览器预览。398- 如果确实需要远程浏览器验证,优先先把 deck 放到可访问的 HTTP 地址,再用远程浏览器检查翻页、动效和图片加载。399- 图片继续走相对路径 `images/xxx.png`。400401### Step 6 · 迭代402403根据用户反馈修改——模板的 CSS 已经高度参数化,90% 的调整都是改 inline style(字号 `font-size:Xvw` / 高度 `height:Yvh` / 间距 `gap:Zvh`)。404405---406407## 资源文件导览408409```410ppt-skill/411├── SKILL.md ← 你正在读412├── assets/413│ ├── template.html ← 风格 A · 电子杂志风模板(种子文件)414│ ├── template-swiss.html ← 风格 B · 瑞士国际主义风模板(种子文件)415│ ├── motion.min.js ← Motion One 本地副本(离线兜底,约 64KB,共用)416│ └── lucide.min.js ← Lucide 本地副本(离线图标渲染)417├── licenses/418│ ├── lucide-LICENSE.txt ← Lucide 许可证文本419│ └── motion-LICENSE.md ← Motion 许可证文本420├── THIRD_PARTY_NOTICES.md ← Vendored runtime assets 来源说明421├── scripts/422│ └── validate-swiss-deck.mjs ← 风格 B 静态校验:登记版式、图片槽位、SVG 文本、标题对齐423└── references/424 ├── components.md ← 组件手册(字体、色、网格、图标、callout、stat、pipeline、动效... 风格 A 适用)425 ├── layouts.md ← 风格 A · 10 种页面布局骨架(可直接粘贴,含动效标记)426 ├── swiss-layout-lock.md ← 风格 B · 原始 22P 版式锁,正文页必须按这里登记427 ├── layouts-swiss.md ← 风格 B · 原始 22P 骨架说明 + 少量明确标注的实验区428 ├── themes.md ← 风格 A · 5 套主题色预设(只能选不能自定义)429 ├── themes-swiss.md ← 风格 B · 4 套瑞士风主题色预设(IKB / 柠檬黄 / 柠檬绿 / 安全橙)430 ├── image-prompts.md ← GPT-M 2.0 配图类型、比例和基础提示词431 └── checklist.md ← 质量检查清单(P0/P1/P2/P3 分级)432```433434**加载顺序建议**:4351. 先读完 `SKILL.md`(这个文件)了解整体4362. Step 1 需求澄清**第一问**先确定风格 A 还是 B,然后:437 - 风格 A:读 `themes.md` 帮用户选一套主题色438 - 风格 B:读 `themes-swiss.md` 帮用户选一套主题色4393. **动手前 Read 生成后的 `项目/XXX/ppt/index.html` 的 `<style>` 块**——这是当前 deck 类名的唯一来源,缺类会导致整页样式崩4404. 读对应的 layouts 文件挑布局:441 - 风格 A → `layouts.md`(顶部有 Pre-flight 类名清单、主题节奏规划、动效 recipe 决策树)442 - 风格 B → **先读 `swiss-layout-lock.md`**,再读 `layouts-swiss.md`;正文页必须从 S01-S22 选择,每页写 `data-layout`4435. 如果在 Codex 中生成配图,读 `image-prompts.md` 挑图片类型、比例和基础提示词4446. 细节调整时读 `components.md` 查组件(含 Motion 动效系统章节,主要服务风格 A;风格 B 的组件细节在 `layouts-swiss.md` 附录)4457. 生成后先运行 `node scripts/validate-swiss-deck.mjs path/to/index.html`,再读 `checklist.md` 自检446447**动效相关**:模板已把 Motion One 的加载和 recipe 逻辑内嵌到底部 module script。你不需要改 JS,只需要按 `layouts.md` / `layouts-swiss.md` 的骨架在 HTML 里加 `data-anim` / `data-animate` 即可。离线演示依赖同级 `assets/motion.min.js` 和 `assets/lucide.min.js`;本地资产缺失时会直接降级为"无动画 / 无图标但内容可读"。风格 B 模板必须保留 `B` 键低功耗模式:切换后停止 WebGL/ASCII canvas RAF,取消正在运行的 Web Animations,并把当前页内容直接 reveal 到静态最终态。448449## 核心设计原则450451### 风格 A · 电子杂志风452453> 违反其中任何一条,杂志感都会垮。4544551. **克制优于炫技** — WebGL 背景只在 hero 页透出,普通页几乎看不见4562. **结构优于装饰** — 不用阴影、不用浮动卡片、不用 padding box,一切信息靠**大字号 + 字体对比 + 网格留白**4573. **内容层级由字号和字体共同定义** — 最大衬线 = 主标题,中衬线 = 副标,大非衬线 = lead,小非衬线 = body,等宽 = 元数据4584. **图片是第一公民** — 图片只裁底部,保证顶部和左右完整;网格用 `height:Nvh` 固定,不要用 `aspect-ratio` 撑4595. **节奏靠 hero 页** — hero 和 non-hero 交替,才不累眼睛4606. **术语统一** — Skills 就是 Skills,不要中英混合翻译461462### 风格 B · 瑞士国际主义风463464> 违反其中任何一条,画面瞬间从瑞士掉到 PowerPoint。4654661. **单一锚点色** — 一份 deck 只用一个 accent,不允许多色高亮拼贴4672. **极致字号对比** — 主标题与正文比例 ≥ 8:1,KPI 必须是"Data Hero"(屏幕宽度的 18-22%)4683. **无衬线只此一家** — Inter / Helvetica / 中文无衬线系统栈,任何衬线都是错的4694. **直角纯色** — 不允许渐变 / 阴影 / 圆角(rule 横线除外)4705. **网格至上** — 所有元素吸附到 12-col grid,左对齐 + 大幅留白做非对称美学4716. **Hairline 是手术刀** — 1px 的极细分割线就够,不要加粗、不要加阴影4727. **点阵装饰只在 hero 页透出** — 正文页保持纯净底色473474## 风格锚点475476- 风格 A 关注杂志感叙事、衬线标题、图片主导和较强的版面节奏。477- 风格 B 关注无衬线、单一 accent、严格网格、发丝线和高对比信息表达。