# Layouts · 风格 B 瑞士国际主义 22 个原始登记版式 · 严格模块化网格 · 每个版式说明用途、骨架、关键类名、专属动效。 > ⚠️ 这套版式与风格 A(电子杂志/电子墨水)**不通用**。类名同名但语义不同(例如 `h-hero` 在风格 A 是衬线,在风格 B 是无衬线极细 200)。一份 deck 只能选一套。 --- ## Swiss locked mode(必须先读) 本主题的 golden source 是: `/Users/guohao/Documents/op7418的仓库/项目/Thin-Harness-Fat-Skills/ppt/index.html` 生成正文页时不要把 Swiss 当成“自由组合的风格包”。默认只能使用 `references/swiss-layout-lock.md` 登记的 `S01-S22`。每个 slide 都必须在 `
` 上写 `data-layout="Sxx"`。 **关键约束**: - 顶部中文标题默认左对齐并处在左上内容轴;不要把标题放到页面中间。 - 不允许临时发明原始 22P 之外的正文结构。本文档末尾的 P23/P24 属于历史实验区,默认禁用。 - 需要单张大图时使用 `S22 Image Hero`;需要多图时用 `S15/S16` 的原始矩阵/小报骨架改造成图片格。 - 地点、路线、人物住所、城市关系页使用 `S08 + Swiss Map Component`;这仍然是 S08 的右侧插槽扩展,不是新正文页。先读 `swiss-map-component.md`。 - SVG 只画几何,不写可见文字。标签放 HTML 里。 - 生成完成后运行 `node scripts/validate-swiss-deck.mjs index.html`。 --- ## 设计语言基线 **配色**(`--accent` 由主题决定,见 `themes-swiss.md`) - `--paper` 纸白底 #ffffff(主背景) - `--ink` 黑墨字 #0a0a0a(主文字 / Ink 反转块) - `--accent` 单色锚点(IKB 蓝默认 / 黄 / 绿 / 橙 四套) - `--text-primary / secondary / helper` 三级文字灰阶 - `--border-subtle` 1px 发丝细线 #e0e0e0 **排版** - 字体:`var(--sans)` Inter / Helvetica Neue + `var(--mono)` JetBrains Mono - 字重:**200 (ExtraLight) 大字** / **300 (Light) 正文** / **600 (SemiBold) t-cat 小标** - 大标题遵循原始 PPT 的实际页面用法:主标题 `font-weight:200`,重点词/数字 `font-weight:300`;不要因为旧 CSS helper 里残留过 800/900 就把 Swiss 大标题加粗 - 大字号收紧:`letter-spacing:-.04em` / `line-height:.9` - mono 数字:`font-feature-settings:"tnum","ss01"` **中文大标题字号分档** 中文方块字的视觉面积比英文更重,不能直接套英文页的 `6.8vw-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)` | 规则:中文标题优先改短,其次降字号;不要让标题挤占下方图文区域。英文、数字型 hero 可以更大,中文方法论页必须更克制。 **演示最小字号与字重阶梯** 瑞士风不是网页说明页,投屏时不能出现 10-12px 的注释字。默认下限: | 文本类型 | 最小字号 | |---|---| | 正文段落 / 主要说明 | `18px` | | 卡片描述 / 列表 / 时间线说明 / caption / 图注 | `16px` | | meta / kicker / mono label / 图表标签 | `14px` | 内容过多时,先压缩文案、拆页或更换 Sxx 版式;禁止靠降低小字字号解决拥挤。图注、时间线说明、KPI 注释、底部 note 尤其要守住这个下限。 **字号与字重阶梯(瑞士风核心)** — "越大越细,越小越粗"不是感性描述: | 字号区间 | 推荐字重 | 典型场景 | |---|---|---| | ≥ 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 强调 | **硬规则:** - 同一页内,字号越小的元素字重必须 ≥ 字号越大的元素(不允许 16px 正文用 300 而 1.8vw 标题用 500) - 16px 左右的小字拒绝使用 weight 300(太细不可读),最低 400,推荐 500 - 封面/IKB 反白大标题内强调字用 `italic + weight 300`,不要用 accent 色(蓝压蓝看不见) **网格**(IBM Carbon 2x Grid 改造) - 16 列 grid:`grid-template-columns:repeat(16,1fr)` + `gap:16px` - spacing token:`--sp-3` 8 / `--sp-4` 12 / `--sp-5` 16 / `--sp-6` 24 / `--sp-7` 32 / `--sp-8` 40 / `--sp-9` 48 / `--sp-10` 64 / `--sp-11` 80 / `--sp-12` 96 / `--sp-13` 160 **画布** - `.canvas-card`:`100vw × 100vh`,直角无圆角,padding `5.6vh 5vw 4.4vh` - `body{background:var(--paper)}` — 不用 WebGL 背景 - 必须保留右下角 `B 静态` 快捷键。低功耗模式使用 `body.low-power`,停止 WebGL/ASCII canvas RAF 与 Motion 入场动画,刷新后通过 `localStorage` 保持用户选择。 --- ### P0 对齐法则(每生成一页都先过这 4 条,违反 = 整页报废) **1. 不要二次叠加水平 padding** ⚠️ 最常踩 `.canvas-card` 已自带 `padding:5.6vh 5vw 4.4vh`。 chrome-min(页眉)、主体内容、底部 footnote 都是 canvas-card 的子元素,**共用同一条 5vw 边线**。 如果在主体那层再写 `padding:5vh 5vw 4vh`,水平方向就变成 `5vw + 5vw = 10vw`,主体比 chrome-min 多内缩一圈,左右对不齐。 ```html
...
主体内容
...
主体内容
``` 例外:`.slide.split .canvas-card{padding:0}` 已被 CSS 覆盖,split 模式下两个 `.half` 自己控制 padding(常用 `5.6vh 3.6vw 4.4vh`),与本法则不冲突。 **2. kicker 必须在大标题"上方",不要压成左右** 小标题(`.t-meta` / `.t-cat`)与大标题之间是从属关系,版式上必须**上下结构**。 ```html
METHODOLOGY · 03

为什么是 N+1

METHODOLOGY · 03

为什么是 N+1

``` **3. 双约束限高 `min(Xvw, Yvh)` 中 Y ≥ X × 1.6** 标准 16:9 屏 1vw : 1vh ≈ 1.78,如果 Y 太严(例如 `min(7vw, 10vh)`),大字号会被高度上限截断到 10vh,不再受 7vw 主导,显得整体缩小。 经验数值: | 用途 | 推荐 | |---|---| | h-hero 巨字宣言 | `min(11.6vw, 19vh)` | | h-xl 章节标题 | `min(7vw, 12vh)` ~ `min(7.4vw, 13vh)` | | 大数字 KPI | `min(8.4vw, 14vh)` | | 中数字 / 编号 | `min(4.6vw, 8.5vh)` ~ `min(5.6vw, 10vh)` | **4. canvas-card 子元素之间用 grid `gap`,不要靠 margin/padding 堆** `.canvas-card` 默认 `display:flex;flex-direction:column`,chrome-min 自带 `margin-bottom:48px`(`--sp-9`)。 主体区往下排几行(head / 内容 / footnote),**首选** `display:grid;grid-template-rows:...;gap:Nvh`,**次选** flex column + gap,**禁用** 在每个子块里加 `margin-top` / `padding-top` 调间距(会和 chrome-min 的 margin-bottom 重叠或撕裂)。 **5. 底部分页安全区:主内容最低处不要触及 nav** 底部分页 dot 固定在 `bottom:2vh`,视觉上占据约 `93vh` 之后的区域。主内容、图片 caption、图表说明、timeline label 的最低处必须停在安全区上方。 - 模板提供 `--nav-safe-bottom:8vh`,可用 `.nav-safe-bottom` / `.nav-safe-bottom-tight` - P23 使用 `.swiss-img-split.align-image-bottom` 时,模板会自动给底部加安全区,避免图片 caption 被分页组件挡住 - 如果为某页手写 `align-items:end` / `margin-top:auto` / `position:absolute;bottom:...`,必须肉眼检查最低处是否越过 nav - 视觉自检:打开页面到该页,确认内容最低边缘与分页 dot 之间至少有 `3vh` 呼吸空间 --- **卡片填充规则(必须遵守)** | 类型 | 类名 | 角色 | 用法 | |---|---|---|---| | Ink 黑底 | `.card-ink` | 反转 / 宣言 | hero 块、收束页一半 | | Accent 蓝填充 | `.card-accent` | 唯一焦点 | 一组中突出一项 | | Grey 灰底 | `.card-fill` | 默认中性 | 多卡并列、统计卡 | | Outlined 描边 | `.card-outlined` | 锚点(非卡片) | hairline 分割框 | ❌ 禁止混用(蓝色背景+蓝色描边、灰底+描边等) **装饰极简原则** - 1px hairline 分隔(`hr-hairline` / `border-bottom`) - 8×8 / 12×12 直角小方块替代圆点 - 点阵 `dot-mat` / 描边圆 `ring-mat` / 叉 `cross-mat`(SVG mask) **图片使用原则(Swiss + GPT-M 2.0)** - 图片是网格中的"证据块",不是装饰背景;必须有明确功能:案例、实拍证据、UI 截图、系统图、概念信息图 - 所有图片容器保持直角、无阴影、无圆角;默认**不加图片外框**,让 caption 或页面网格承担层级 - 白底信息图 / 流程图 / UI 图:容器背景必须是 `var(--paper)`,不要用灰底包白图,也不要加 `.swiss-keyline` 描边 - 只有当图片本身边缘无法和页面区分时,才用 `.swiss-lined` 加一条顶部 accent 线;不要给每张图都套边框 - 纪实照片用 `object-fit:cover` 只裁底部/边缘;原始截图或文字密集图用 `.fit-contain`,避免文字被裁 - 如果信息图、流程图、UI 情景图是按 S15/S16 槽位重新生成的,必须用 `.frame-img.r-21x9` / `.frame-img.r-16x10` 铺满槽位;不要再加 `.fit-contain`,否则会变成小图漂在白框里 - 瑞士风图片优先比例:S22 顶部横幅 `21:9`;S15/S16 多图格统一 `21:9` 或统一 `16:10` - 生成 2-3 张配图时,必须先绑定原始版式槽位:单张大图 = S22;多图 = S15/S16 网格改造;不要使用未登记的 P23/P24 - S22 的照片主体必须位于中央安全区,HTML 用 `object-position:center 35%` 或 `center center`,不要用 `top center` 截人脸 - GPT-M 2.0 生成图必须遵守单一 accent 色、Helvetica/Inter 气质、12/16 列网格、直角纯色、无渐变/阴影/圆角 - 生成图只保留核心图像本身,不要把页眉、页脚、标题、页码、角标、边框、署名画进图片里 **版式多样性硬规则** Swiss 主题有 22 个登记版式,生成时要主动展示版式系统,不要把所有内容都做成 `head + grid-reveal + card`: - 7-8 页 deck 至少使用 **6 个不同 S 编号版式** - 不允许连续 3 页使用同一种主体结构(如三页连续 S19 / 普通卡片) - 如果是"测试模板"或"我想看看效果",必须覆盖:封面、收尾、至少 1 个对比/时间线(S08/S11/S02)、至少 1 个结构图(S14/S17/S15)、至少 1 个图片版式(S22 或 S15/S16 图片格) - 图片页不等于新发明一页。单图用 S22,多图用 S15/S16 的原始网格骨架改造 - 每页写代码前先列 `页码 → data-layout → 为什么选它 → 图片槽位`;生成后用 validator 检查 **动效原则(每页一个语义化 recipe)** - 不是统一 fade-up,而是**与图形语义耦合**:数字 scale 弹入、bar scaleY 拉起、SVG 圆环 stroke-dashoffset 描线、时间线节点序列点亮 - 缓动:`EASE_PROD` `cubic-bezier(.2,0,.38,.9)` 用于 productive(120-240ms)、`EASE_ENTRY` `cubic-bezier(0,0,.3,1)` 用于 expressive(400-700ms) - playSlide 入口要 reveal 所有 `[data-anim]` 容器到 opacity:1,recipe 内再用 motion `{opacity:[0,1]}` 覆盖 --- ## 视觉 + 代码双维审核(生成后必须做) 不要只看 HTML/CSS。Swiss 模板的还原度要同时从**浏览器视觉**和**代码结构**判断: 1. 同时打开三份页面:原始参考 PPT、当前 `template-swiss.html` 或生成页、正在修改的测试 PPT。原始参考路径是 `/Users/guohao/Documents/op7418的仓库/项目/Thin-Harness-Fat-Skills/ppt/index.html`。 2. 截图前先等入场动效稳定(约 1-2 秒)。不要把动画中间态误判成"内容缺失"或"版式空白"。 3. 先看视觉:标题重量、头部距离、图片落位、底部安全区、caption 是否被 nav 挡住。 4. 对照原始参考 PPT 的同类版式,不要只对照 CSS helper;以实际页面结构和视觉结果为准。 5. 再回到代码,检查该页是否误用了不属于该版式的组件,例如把 P24 的三图证据墙塞进 P23,或把 P7 图表用于没有真实数值的概念列表。 6. 若视觉不一致,优先判断是**版式选择错**、**必选组件缺失**、**可选组件滥用**还是**间距/安全区问题**,不要直接靠调 `margin` 硬救。 7. 修改模板时,新增能力必须用新类隔离;不要因为一页出问题去改全局基座类。 ### 原始 PPT 视觉锚点(对照时优先看这些) | 视觉锚点 | 原始 PPT 的实际做法 | 生成时的规则 | |---|---|---| | 大标题重量 | 实际页面大量使用 `font-weight:200/300`;即使 raw CSS helper 里有 700/800/900,也不能直接当视觉标准 | 大标题保持轻字重,字号越大越细 | | 留白 | 页面经常只占上半屏或中部,底部留给 nav 和少量 footnote | 不要为了"填满"而把内容推到底 | | 分割线 | 只在章节边界、证据墙、卡片层级处使用 1px hairline | 不要给每个内容块都加线 | | 标题与内容 | 标题区和正文/图表之间有明显空气感 | 复杂页用 grid `gap`,不要让内容贴着标题 | | Timeline | 轴线在中下部,但 label 不碰底部 nav | 横向 timeline 必须同时检查上下 label 和 nav 安全区 | | 图片页 | 图片是证据块,要么做 S22 主视觉,要么放进 S15/S16 原始网格 | 不要使用未登记图文结构 | ### 组件必选 / 可选 / 可省略 | 组件 | 规则 | |---|---| | `.canvas-card` / `.chrome-min` | 基础页必选;split 页左右 half 各自有 chrome-min | | `t-meta` / `t-cat` kicker | head 区必选,但正文卡片内可省略;必须在大标题上方 | | 大标题 | 章节/论点页必选;列表型小卡页可以用较小标题,但不能缺页级信息锚点 | | `lead` 说明 | 可选;如果标题已经解释清楚,可以省略,但不能用长段正文贴着标题 | | 图片 caption | S15/S16 多图格必选;S22 大图可选,因为图已经是主视觉且下方有 KPI/说明 | | 发丝线 / border-bottom | 可选;只能用于建立层级,不能为了装饰堆线 | | KPI / 数字 | 只在有真实数据时使用;不要为概念解释编造数值 | | `footnote` / 底部说明 | 可选;如果使用,必须避开 nav 安全区 | | `S08 + Swiss Map Component` | 地点/路线/人物住所关系专用;右侧地图必须有点、连线、卡片和 `+` / `-` / `DRAG` 控制,详见 `swiss-map-component.md` | ### 通用版式 / 非通用版式 | 类型 | 版式 | 使用边界 | |---|---|---| | 通用 | S01, S03, S08, S09, S10, S11, S19 | 大多数叙事 deck 都能用,但仍要满足内容形状 | | 条件通用 | S04, S05, S13, S16 | 取决于数量是否刚好匹配:3/4/6 项 | | 数据专用 | S02, S06, S07, S18, S20, S21, S22 | 必须有真实时间、数值、指标或案例数据 | | 结构专用 | S14, S15, S17 | 必须有闭环、矩阵、层级/生态关系;不适合普通段落 | --- ## 22 个登记版式 ### P1 · Cover · 封面页 **用途**:整套 deck 起手 / 主题宣言。 **适用内容类型**:封面 / 章节首页 / 主题宣言。**纯文字结构**(主标题 + 副标 + 元信息),不承载数据。 **默认推荐:IKB 满屏 + ASCII 呼吸场** ⭐ - `
` 满屏 IKB,**不是** light 白底 - `.canvas-card` 内首位插入 `