# 质量检查清单(Checklist) 这个清单来自"一人公司"分享 PPT 的真实迭代过程。每一条都是踩过坑之后总结的,按重要性排序。 生成 PPT 前,先通读一遍;生成后,逐项自检。 --- ## 🔴 P0 · 一定不能犯的错 ### 0-S. Swiss locked mode:正文页必须来自原始 22P **现象**:颜色、字体看起来像 Swiss,但标题跑到中间、图片不在网格上、页面结构和原始 22P 完全不是一套东西。 **根因**:生成时把 Swiss 当成风格包,自由组合了新的 P23/P24/自绘 SVG 页面,没有从原始参考 PPT 的 22 个登记版式里选。 **做法**: - 先读 `references/swiss-layout-lock.md` - 正文页只能使用 `S01-S22`;新增首页/尾页只能使用 `SWISS-COVER-ASCII` / `SWISS-CLOSING-ASCII` - 每个 `
` 必须写 `data-layout="Sxx"` - 生成后必须运行: ```bash node /scripts/validate-swiss-deck.mjs path/to/index.html ``` **校验会拦截**: - 未登记版式 / 缺少 `data-layout` - P23/P24 实验结构 - SVG 里写可见文字 - S22 图片未绑定 `s22-hero-21x9` - S22 照片使用 `object-position:top center` ### 0-S-2. Swiss 顶部标题默认左上,不是居中 **现象**:最顶上的中文标题在页面中间,像一页自制海报,不再像原始 PPT。 **做法**: - 除 `S03/S09/S10` 这类 statement/split 版式外,顶部标题必须贴原始模板的左上内容轴。 - 不要把小标题放左列、大标题放右侧大列,这会导致标题视觉居中。 - 如果需要标题 + 说明两列,必须复制原始 `S11` 或 `S17` 的骨架,不要自写 `4fr 8fr`。 ### 0-S-3. Swiss 地图页必须用 S08 Map Component **现象**:地点/历史内容只画了简易 SVG 地图,没有真实点位、关系卡片、缩放/拖动控制,或滚轮触发了 PPT 翻页。 **做法**: - 使用 `data-layout="S08"`。 - 先读 `references/swiss-map-component.md`。 - 右侧地图组件必须包含 marker 点、连接线、地点卡片、`+` / `-` / `DRAG` 控制。 - 默认禁用 scroll zoom 和 drag pan;用户点击 `DRAG` 后才允许拖动。 - 必须保留静态 fallback,地图 CDN 或瓦片失败时仍可读。 **检查**: - `grep -n "data-map-ctrl" index.html` - `grep -n "maplibregl.Map" index.html` - 浏览器实测 `+` 可放大,`DRAG` 可切换为 `DRAG ON` ### 0-S-4. Swiss 演示字号不能小到看不清 + 字重阶梯必须遵守 **现象**:瑞士风页面整体结构没问题,但图注、说明、时间线、KPI note、卡片小字在投屏时看不清;或者 16px 小字用了 weight 300 导致又小又细。 **做法(字号下限)**: - 正文段落 / 主要说明 ≥ `18px` - 卡片描述 / 列表 / 时间线说明 / caption / 图注 ≥ `16px` - meta / kicker / mono label / 图表标签 ≥ `14px` - 内容超出时,先删减文案、拆页或换 Sxx 版式,不要用 10/11/12/13px 小字硬塞。 **做法(字重阶梯 ⭐)**: 瑞士风坚持"越大越细,越小越粗",字号与字重必须成反比阶梯: - ≥ 8vw → weight **200**(ExtraLight) - 4-7.9vw → weight **200-300** - 1.8-3.9vw → weight **300-400** - 1-1.7vw / 16-20px → weight **400-500** - 13-15px → weight **500-600** - 同一页内,字号小的元素字重必须 ≥ 字号大的元素。 - **16px 左右小字禁止使用 weight 300**(太细不可读),最低 400,推荐 500。 - 封面/IKB 反白大标题内强调字用 `italic + weight 300`,不要用 accent 色。 **检查**: - `rg -n "font-size:(10px|11px|12px|13px)|max\\((9|10|11|12|13)px" index.html` - `rg -n "font-weight:(300)" index.html | rg -v "min\(|h-xl|h-hero|h-statement|num-mega|kpi-thin|name-mega|8vw|9vw|1[1-9]vw|cover-|\.multi"` —— 检查 weight 300 是否落在了小字号上 - 浏览器以 100% 缩放查看,底部 note、caption、timeline label、卡片描述仍能一眼读清。 ### 0-A. 瑞士风画布对齐法则(每一页必查 · 最常踩) **现象**:页眉 chrome-min 和底部 footer 都靠在 5vw 的边线上,但中间区域往内缩了一截,左右对不齐。 **根因**:`.canvas-card` 已经自带 `padding:5.6vh 5vw 4.4vh`。如果在主体区再写 `padding:5vh 5vw 4vh`,水平方向就变成 `5vw + 5vw = 10vw`,主体比 chrome-min 多内缩 5vw。 **做法**: - 主体那层 `padding:0`,只用 grid `gap` 控垂直间距 - chrome-min 与主体之间的间距由 `.chrome-min{margin-bottom:48px}` 提供,**不要**在主体顶部叠 `margin-top` / `padding-top` - split 模式例外:`.slide.split .canvas-card{padding:0}`,两个 `.half` 自己定 `padding:5.6vh 3.6vw 4.4vh` ```html
...
主体
...
主体
``` **自检命令**:`grep "padding:.*5vw" index.html`,如果命中 `padding:Xvh 5vw Yvh` 在 canvas-card 直系子元素里,就是错的(.half / 装饰层除外)。 ### 0-B. 瑞士风 head 区:kicker 必须在大标题"上方"(不要左右排) **现象**:小标题(`.t-meta` / `.t-cat`)和大标题被挤在同一行,左侧一坨小字、右侧一坨大字,头部失去层级。 **根因**:`grid-template-columns:auto 1fr` 把两个本该上下叠的元素压成左右两列。 **做法**: ```html
METHODOLOGY · 03

为什么是 N+1

METHODOLOGY · 03

为什么是 N+1

``` 例外:head 一行同时承载"左:kicker+大标题(自己上下叠)"和"右:小注脚",外层可以用 `display:grid;grid-template-columns:1fr auto`,但**内层**仍要保持 flex column。 ### 0-B-2. 瑞士风封面 / 封底默认:IKB 满屏 + ASCII 呼吸场 + 白色 weight 200(强制) **现象**:封面用 `slide light` 白底 + 黑字 + 一个大大的"01"——同时 chrome 角标已经写了 `01 / 07`,屏幕上出现两个"01",视觉重复;白底太普通,完全没有"开场打招呼"的仪式感。 **根因**:layouts-swiss.md 旧版默认推荐左 ink + 右 paper 对开,实操中容易写成"白底 + 黑大字 + 编号大字",失去 IKB 这个标志色的开场冲击。 **做法**(瑞士风必守): - **封面强制 `
`**(满屏 IKB),不要 `slide.light`,也不要 `slide.dark`;在 `.canvas-card` 内**第一个子元素**插入 ``(ASCII 字符呼吸场,模板自带 IIFE 自动激活) - **不要再写"01"等编号大字**:`.chrome-min` 已经显示 `01 / N`,封面再放一个巨大的"01"=同义重复,直接删掉 - **强调字必须用斜体**:`font-style:italic;font-weight:300`,**禁止**用 `color:var(--accent)`——IKB 蓝压 IKB 蓝,人眼看不见任何强调 - **封底强制 `slide.split`** 双半屏,左半 `.half.b-accent` + ASCII canvas(与封面色彩闭环),右半 paper 白底放 3 条 takeaway;**第 03 条**用 `var(--accent)` 上色,完成"开场全 IKB ↔ 收尾半 IKB"的色彩闭环 - ASCII canvas 在模板的 `