写演示:流程与规则

这份指南讲怎么用 slidehtml 写出一份合格的演示:先排故事线,再给每页配模板,把文字压进模板的内容上限,最后跑检查、看截图。每个模板的具体字段和上限见 components.md,放映与导出见 presenting.md,新增模板和风格见 contributing.md。

章节编号是固定的,其他文档会用“第 8 节”“§13”来引用。

节内容
0命令速查
1工作流
2故事线
3我要表达什么,用哪个模板
4新建一份演示
5文案规则
6视觉规则
7事实与来源
8QA 报错怎么修
9放映(见 presenting.md)
10扩展:Bento 的小图与详情
11新增模板(见 contributing.md)
12图标
13配色、深色页、强调色整页、风格
14逐条展开与翻页衔接
15图片

0. 命令速查

npx slidehtml new my-deck       # 从起步模板生成 src/decks/my-deck/index.tsx
npx slidehtml dev my-deck       # 开发预览:#/1 放映,#/kit 看模板库
npx slidehtml check my-deck     # 字体子集 → 类型检查 → 构建 → 自动 QA,最后一行是 PASS 或 FAIL
npx slidehtml build my-deck     # 产出 dist/my-deck.html(单文件,离线可用)
npx slidehtml docs              # 重新生成 components.md 和 skill 参考表
npx slidehtml photos            # 下载可选的氛围照片(见第 15 节)

check 的输出里会打印打包体积(其中约 3.6 MB 是内嵌字体)。最后一行是 PASS — all deterministic checks 才算通过;显示 FAIL (n) 时按 第 8 节 修复后重跑。


1. 工作流

按顺序做,不要跳步。

  1. 收集事实:把要讲的每一个数字、日期、版本号连同出处整理好。查不到出处的事实不要写。
  2. 写故事线:先写下“听众看完要记住的那一句话”,它就是最后一页 Closing 的 statement。再按 第 2 节 排出页序(短版 6–8 页,完整版 10–14 页,分章的长版 20–30 页),每页写一句该页要证明的观点。
  3. 给每页选模板:用 第 3 节 的决策表。同一个模板在一份演示里最多用两次(SectionBreak 每章一次,不受此限),Bento 最多用一次。
  4. 建 deck 文件:npx slidehtml new <name>,见 第 4 节。
  5. 填内容:每填完一页,就对照 components.md 里该模板的“内容上限”自查一遍。
  6. 跑检查:运行 npx slidehtml check <name>。只要出现 FAIL 就一定要修,修法见第 8 节。
  7. 看一遍截图:qa/slide-NN-1920x1080.png 是每页的截图。逐页确认没有空白过多、一页塞太满、重点不突出等问题。

2. 故事线

一份好演示是一条论证:是什么 → 有多大 / 多久 → 变了什么 → 对你意味着什么 → 怎么做 → 接下来 → 结论。下面三种结构可以直接套用。

A. 版本 / 产品发布解读(12 页短版)

#这一页回答模板
1这是什么Cover
2全貌:六个最重要的变化Bento
3规模有多大MetricBars
4能用多久 / 时间点Timeline
5最显眼的组件版本SpotlightList
6哪些默认行为变了CompareTable
7三四个同等重要的改进NumberedColumns
8谁该升级、谁该等VerdictColumns
9动手前要检查什么Checklist
10具体怎么做StepTrack
11下一个版本Teaser
12一句话结论Closing

B. 项目 / 季度汇报(10 页)

Cover(季度或项目代号)→ MetricBars(核心指标)→ CompareTable(目标 vs 实际)→ Timeline(里程碑)→ NumberedColumns(三项关键成果)→ SpotlightList(各团队或渠道数据)→ VerdictColumns(继续 / 调整 / 停止)→ StepTrack(下季度计划)→ Teaser(下一阶段)→ Closing

C. 技术方案评审(11 页)

Cover → Bento(方案全貌)→ CompareTable(现状 vs 方案)→ NumberedColumns(设计原则)→ MetricBars(性能或成本估算,标注“估算”)→ Timeline(迁移排期)→ VerdictColumns(适用 / 有条件 / 不适用的场景)→ Checklist(上线前检查)→ StepTrack(迁移步骤)→ Teaser(后续演进)→ Closing

D. 短版(6–8 页,5 分钟以内)

Cover → 一个数据页(MetricBars、Timeline 或 SpotlightList 任选其一)→ NumberedColumns 或 CompareTable → VerdictColumns → StepTrack 或 Checklist → Closing。时间更紧时去掉中间任意一页,但保留首尾。

E. 分章知识简报(20–30 页)

适合培训、研究综述、行业简报。先用 Agenda 列出 3–5 章,每章以 SectionBreak 开头,章内 4–6 页。

#这一页回答模板
1–2这是什么 / 分几章Cover → Agenda
章首这一章讲什么SectionBreak
概念这个词是什么意思QuoteHero
机制它是怎么运转的FlowDiagram
证据一个关键数字 / 一组变化 / 两种测法的差距 / 误差有多大BigStat / DeltaBars / Dumbbell / RangeBars
澄清流传的说法对不对ClaimCards
排查从外到内逐层要查什么LayerStack
对照谁在哪一类里叫什么Matrix
并列6–8 个对象各有什么特点IconGrid
背景事情是怎么一步步来的Milestones
计划接下来几周做什么Gantt
收尾每周 / 每月怎么做,一句话结论Checklist → Closing

F. 业务 / 运营手册(20–30 页)

适合上市计划、增长复盘、运营方案。行业数字写出处;示例公司和它的数字一律在 source 里标“示意”。

#这一页回答模板
1–2这是什么 / 分几章Cover → Agenda
客户买家怎样决策、谁参与BigStat / NumberedColumns / QuoteHero → PersonaCards
定位和谁比、站在哪FlowDiagram → Quadrant
定价按什么收、收多少MetricBars → PricingTiers
执行钱和时间怎么分、谁负责ShareBar → Gantt → StatusGrid → Matrix
衡量漏在哪、指标怎样、钱从哪来Funnel → KpiBoard → Waterfall
增长怎样形成闭环Cycle
收尾上线前检查、一句话结论Checklist → Closing

技术发布解读写长版(20 页以上)时,在 A 的基础上加:Agenda + 每章 SectionBreak、Milestones(发布历史)、Cycle(开发周期)、StatusGrid(平台支持)、SpecSheet(版本对照)、CodeDiff(配置格式变化)、Terminal(新命令)、Faq(升级问答)、Lanes(正在退场的功能)。

节奏规则

  • 相邻两页不要用同一个模板。
  • 数据页(MetricBars、Timeline、SpotlightList)和文字页(NumberedColumns、VerdictColumns)尽量交替出现。短版里至少放一个数据页。
  • 每页只证明一个观点。一页放不下时拆成两页,不要压缩字数硬塞。
  • 长演示里,图表页(BigStat、DeltaBars、Dumbbell、RangeBars、MetricBars、Funnel、Waterfall、ShareBar、KpiBoard)之间至少隔一页文字或图标页。

3. 我要表达什么,用哪个模板

我手上的内容用不要用
演示的第一页Cover
一句话结论,要单独立住、给密集内容之间一个停顿Statement一份演示超过 3 页;句子超过 28 字
6 个并列主题,其中 1 个最重要,每个都有能展开讲的图或表Bento不足 6 个时不要凑数
2–4 个能放在一起比较大小的数量MetricBars单位不同的数字
起止日期、阶段、支持期、排期Timeline只有一个日期
一组“名称 → 数值”,其中一项是重点SpotlightList需要展示前后变化时
改版前 / 改版后,逐项对比CompareTable只有 1–2 处变化
3–4 个同等重要、没有先后顺序的要点NumberedColumns有先后顺序时
“推荐 / 有条件 / 不推荐”的分组建议VerdictColumns没有明确结论时
可以逐项打勾的准备工作,每项都有命令或动作Checklist有严格顺序时
必须按顺序完成的 3–5 步流程StepTrack超过 5 步
下一版本、下一阶段、路线图Teaser确定的结论
15 页以上演示的章节目录Agenda10 页以下
每章的第一页SectionBreak没有 Agenda 的短演示
一个术语的定义,或一句有出处的原话QuoteHero超过 64 字的段落
系统或机制的运转过程,其中一步是重点FlowDiagram听众要照做的步骤(用 StepTrack)
一组流行说法,逐条给出结论与证据ClaimCards没有出处的“辟谣”
层层依赖、要从外到内排查的环节LayerStack没有先后关系的清单
对象 × 类别的短标识对照(厂商 × 用途)Matrix格子里要写句子
6 或 8 个并列对象,各一两句话IconGrid3–4 个(用 NumberedColumns)
一个数字就是论点BigStat几个数字同等重要
带正负号的变化量DeltaBars都是正的总量
同一指标两种条件下的值,差距是重点Dumbbell只有一种条件
估计值和它的误差范围RangeBars没有误差数据
以周或冲刺为单位的行动计划Gantt有真实日期的长期周期(用 Timeline)
4–7 个有日期的事件Milestones需要按时间比例表现间隔
3–4 条要在终端里敲的独立命令Terminal有先后依赖的流程(用 StepTrack)
同一份配置或代码的新旧写法CodeDiff只是几个值变了(用 CompareTable)
6–10 个对象各自的支持 / 就绪状态StatusGrid每个对象要比多个维度(用 Matrix)
一批组件的新旧版本号SpecSheet值是行为描述而不是版本号
首尾相接、会循环的阶段Cycle只走一遍的流程(用 FlowDiagram)
4 或 6 个常见问题,各一两句回答Faq在核查说法真假(用 ClaimCards)
按时间范围分组的事项:现在 / 下一步 / 之后Lanes有确切日期(用 Gantt)
逐级转化的流程,要指出先修哪一级Funnel各级不是包含关系
两个维度上的竞争定位Quadrant只比较一个维度
同一笔采购里的三个角色PersonaCards三个细分市场(用 IconGrid)
3–4 档价格方案PricingTiers竞品价格对比(用 Matrix)
一个北极星指标加 4–6 个输入指标KpiBoard只有 1–3 个数字
加起来是 100% 的构成,几行对比ShareBar各部分不构成整体
从期初到期末的增减拆解Waterfall各项不是加减关系
4–12 个时间点的变化趋势LineChart只有 2–3 个点(用 MetricBars)
两个维度交叉的数值:分批留存、渠道 × 阶段Heatmap只有一行或一列
一个要回答的问题,拆成 2–4 个互不重叠的分支IssueTree分支之间有先后顺序(用 FlowDiagram)
季度粒度的路线图,带进度Roadmap按周排期(用 Gantt)
4、6 或 8 个人或角色,各自负责什么Team要写清每件事谁拍板(用 Matrix 做 RACI)
3 或 5 句能逐字引用的原话QuoteWall只有一句(用 QuoteHero);查不到原文
一张真实的产品截图,要指出 3–5 个位置Screenshot没有真实截图
同一画面两种状态的真实截图BeforeAfter两张图构图不同
封面要有记忆点,主题能用 4–8 个图标概括HangingCover正式汇报(用 Cover)
3–4 个功能,各配一小块能看懂的界面(列表、大数字、柱、进度、换算、标签)PanelCards界面里没有真实数据
一个问题和三个并列答案,每个有数字和一组小柱AskAnswer答案不能用数字比较
一个承诺加证据:几行参数、两个数字、两条保证ProofSplit证据少于两条
4 个话题,一次讲一个(配 build: 'focus')IndexStack话题需要同时对比
结尾留联系方式或入口,带一个动作ContactPanel没有可以给出的入口
一个核心和 4–8 个围绕它的部件Orbit部件之间有先后顺序(用 FlowDiagram)
一个数字开场,后面一句话解释它NumberOpener数字没有出处
章节页,要让听众知道讲到第几章ChapterProgress少于 3 章
抛出一个问题,下一页回答Question一份演示超过 2 页
一句旧说法被一句新说法取代Contrast两边不是同一件事
一章或整份演示的小结,3 条加“下一步”Recap超过 3 条
产品封面:深色主卡 + 一张真实截图 + 2–3 条可核实的成绩HeroPanel没有真实截图
同一产品的 2–4 张截图,点分段切换TabbedShot截图之间没有关系
字体、颜色和尺寸规范BrandKit非设计话题
3–4 条有出处的奖项、评分或硬指标Laurels编不出出处的“荣誉”
一张真实截图铺满整页,配一句话(tone: 'dark')FullBleed截图细节很多、需要标注(用 Screenshot)
工作室风的致谢页,列 2–4 个联系入口Thanks已经用了 ContactPanel
创意或品牌提案的封面:两个巨字 + 2–3 张真实截图SplitWord正式汇报
等宽黑风格的章节页PillAgenda少于 3 章
3–4 个并列的规模数字,可附一排工具名StatRow一个数字就是论点(用 BigStat)
一个指标的前后两个值,变化就是结论CountCompare超过两个数
一个整体分成 2–5 部分,只强调一部分Donut超过 5 部分
2–8 个类别的数量,可分组或堆叠BarChart只有 2–4 个数(用 MetricBars);时间趋势
对象在两个连续指标上的位置,可加第三个量Bubble只有两个类别(用 Quadrant)
一个值相对上限或目标Gauge没有上限
4–6 件事,每件一个词就能说清ServiceList每项要两句以上
恰好三句有出处的原话QuoteArc查不到出处
3–4 个作品或方案,各一个词WorkCards需要说明文字
等宽黑风格的结束页RepeatClosing要列联系方式
轻松场合的封面,有一张真实截图StickerCover正式汇报
4–10 个关键词:技能、主题WordBlocks每项要解释
3–4 个项目逐个讲,各有截图(配 build: 'focus')FolderCards要并排比较
3–4 个指标各带一串历史值SparkCards没有历史值(用 StatRow)
比例说成“每 10 / 100 个里有几个”Pictogram部分超过 3 个
两个时间点或两种口径下的名次SlopeRank要看具体数值(用 Dumbbell)
贴纸风格的结束页,带一个行动号召PixelClosing正式场合
品牌或发布会封面,有一个代表数字FloatCover正式汇报
6 或 9 个功能、零件,各一个词TileWall每项要解释(用 IconGrid)
3–4 个步骤或服务,各一两句说明ServiceIndex步骤间要画箭头(用 StepTrack)
当前这一项和下一项GlowStack超过两项(用 Roadmap)
两个方案或两种用法,各一个代表数字DuoCards三档(用 PricingTiers)
桌面风格的封面或目录Desktop正式汇报
2–3 个步骤,各对应一个文件或工具WindowStack超过 3 步
默认设置、功能开关ToggleCard要讲状态好坏(用 StatusGrid)
层层依赖的前提条件Pyramid数量逐级减少(用 Funnel)
两三个维度的交集,定性Venn要比大小(用 Donut)
从核心到外围的包含关系Concentric平级的卫星(用 Orbit)
按是 / 否条件选方案,最多两层DecisionTree拆解原因(用 IssueTree)
一个问题的 4–6 类成因Fishbone有层层因果(用 IssueTree)
跨角色的流程和交接Swimlane只有一个角色(用 StepTrack)
系统或组织的 3–5 层结构ArchLayers要讲数据流(用 FlowDiagram)
优缺点、成本与收益的权衡Balance逐项对比属性(用 CompareTable)
两组对象经过同样几个阶段DoubleFunnel只有一组(用 Funnel)
发布会开场、新版本揭幕KeyReveal需要解释细节:用 Cover
产品规格、关键指标KeySpec要比较多个数:用 StatRow
品牌、创意、功能发布的封面OrbCover正式汇报:用 Cover
3 个并列的功能、开关、选项GradientCards有先后:用 StepTrack
3–4 个同样重要的数字BlockStats要比较大小:用 MetricBars
封面、口号、规则宣讲PopPoster需要论证:用 Statement
产品或项目的一页总览BentoBoard要点击展开详情:用 Bento
介绍一个功能、一个文件、一条命令BentoSpotlight多个并列功能:用 IconGrid
评审、培训、答疑这类要约时间的安排SlotPicker真实的长期排期:用 Gantt 或 Timeline
上手、设置、新建这类三步流程UiSteps步骤带命令且超过 3 步:用 StepTrack
AI、语音、工具类产品的开场FloatHero正式汇报:用 Cover
引用一段录音、访谈或讲解TranscriptCard只有一句引语:用 QuoteHero
按角色、阶段、场景分组的清单RetroTabs只有一组:用 IconGrid
版本更新、阶段回顾RetroLog要按真实时间比例:用 Timeline
有一个最想让人记住的数字GlowMetric数字要对比:用 CountCompare
4 或 6 个并列的功能、字段、能力HairlineGrid每项一个词就够:用 TileWall
培训、活动、对外介绍的封面RibbonCover正式汇报:用 Cover
分章的演示,每章开头RibbonSection不分章的短演示
新手常见问题、用户提问ChatThread问题超过 3 个且要标出处:用 Faq
3–4 条规则、小贴士、注意事项NoteCards正式场合:用 NumberedColumns
最后一页Closing

找不到合适的模板时,先改内容去适配模板(拆页、合并、换个角度),而不是去写新的版式。


4. 新建一份演示

npx slidehtml new my-deck

这会把起步模板 src/decks/starter/ 复制成 src/decks/my-deck/index.tsx。起步模板只依赖 src/kit,生成后就能编译。需要别的模板时,到 components.md 里找对应模板的示例,或者从 src/decks/ 下的示例演示里复制那一页的 { id, label, render } 整块再改内容。不要整份复制使用了 Bento 的示例:它依赖同目录下的 content.ts、minis.tsx 和 details.tsx。

npx slidehtml dev、check、build 都按名字选择演示,不需要手动改 src/decks/active.ts。开发时也可以直接打开 http://localhost:5173/?deck=my-deck。

deck 文件的骨架如下。每一页就是一个模板,所有内容都通过 props 传入:

import type { DeckDef } from '../../kit'
import { Cover, MetricBars, Closing } from '../../kit'

export const deck: DeckDef = {
  title: 'Q3 Platform Review',          // 每页左上角显示,英文或短中文,≤ 32 个字符
  theme: 'crimson',                      // 配色,见第 13 节
  style: 'standard',                     // 风格,见第 13 节
  iconStyle: 'line-duotone',             // 图标系列,见第 12 节
  slides: [
    {
      id: 'cover',                       // 唯一,只用小写字母和连字符
      label: '封面',                      // 页眉和进度条提示里显示,2–6 字
      notes: '开场先讲季度目标。',          // 演讲备注,可选
      render: () => (
        <Cover
          kicker="Quarterly Review · 季度回顾"
          title="平台组 Q3"
          subtitle="steady"
          lead="……"
          facts={[{ label: '周期', value: '07–09 月' }, { label: '发布', value: '14 次' }]}
          numeral="Q3"
        />
      ),
    },
    // …
  ],
}

注意以下几点:

  • 需要 Bento 时,把示例里 Bento 页用到的 content.ts、minis.tsx 和 details.tsx 一起复制过来改写,详情页和卡片小图按 第 10 节 来写。
  • title 可以传字符串数组,用来手动断行,例如 title={['新版本', '首次进入稳定通道']}。较长的中文标题请都这样处理,避免浏览器把一两个字挤到第二行。

5. 文案规则

长度怎么数:“字”指一个汉字;两个英文字母、数字或空格算一个字。“个字符”指每个字符都算一个,用于数字、代号、命令等字段。例如 Deck Kit 是 4 字,也是 8 个字符。

  1. 标题是观点,不是话题。比如写“旧版本已转入长期维护”,不要写“支持周期介绍”。标题不超过 16 个字。
  2. kicker 是话题,2–8 字,例如“支持周期”“升级前”。
  3. lead 是证据或背景,一到两句,不超过 60 字。lead 不要复述标题。
  4. 数字要带单位和口径:“超过 14,000 个”“≈ 20%”“计划日期”。估算值标“估算”,示意图标“示意”。
  5. 中文与英文、数字之间留一个半角空格,例如“版本 13 的 64 位 time_t”。标点使用全角中文标点。
  6. 不要写空话:去掉“全面升级”“赋能”“无缝”“极致”这类词。用具体的名词和数字来写。
  7. 命令和文件名照原样写,并放进 cmd、mono、tag 这些等宽字段,不要放在正文里。
  8. 正文里避免一串长英文标识符。组件名、包名、路径不能在中间断行,三个连在一起就会把一行撑满,所以放进 tag、cmd 这些字段,或者只留一个。
  9. 一段话的最后一行不要只剩一两个字。标题可以用数组断行;正文字段不能手动断行,只能改写句子,缩短或加长几个字。
  10. 同一个概念全篇只用一种叫法。前面叫“LTS”,后面就不要改叫“长期维护版”。

6. 视觉规则

这些是模板已经做好的事,不要破坏。

  • 不要写自定义 CSS,也不要加内联样式。字号、间距和颜色都在模板里。需要不同的视觉效果时,换一个模板。
  • 强调色只由模板来用。颜色由 DeckDef.theme 决定(见 第 13 节),默认绯红 #e00052。它出现在两类地方:一类是系统标记,比如每页的 kicker、编号、计数器、来源前的横线;另一类是每页唯一的焦点,比如 Cover 的大数字、MetricBars 的合计、SpotlightList 的第一项、StepTrack 的最后一步、VerdictColumns 的“推荐”组。你要做的只有一件事:不要在内容里另外加颜色、加粗或使用 HTML 标签来制造第二个焦点。
  • 图标只用内置图标(见 第 12 节),通过模板的 icon 字段传入名称。不要放别的图标库或 emoji。其余图形都用 DOM/CSS 绘制,以保证离线、清晰和缩放一致。
  • 不要引用任何远程资源(字体、图片、脚本)。构建时会直接报错。
  • 画布固定为 1920 × 1080,自动等比缩放。在 CSS 里 24u 表示设计稿上的 24px。不要使用 px、vw 写布局。
  • 最小字号是 17u,QA 会检查。
  • 强调要对上文字:说“最长”就高亮最大的那一项,说“进行到第 3 步”就只填到第 3 步。

7. 事实与来源

  • 页面上有数据或事实时,必须填写 source,写明文档名加章节,例如 2025 年度报告 §4.3。
  • 例外:Cover 和 Closing 没有 source 字段。封面上的事实必须在后面某一页再次出现并带上出处;Closing 的 refs 就是它的出处。
  • 查不到的事实不要写。没有把握的地方,宁可删掉那一页。不要编造客户评价、Logo、奖项。
  • 会随时间变化的内容(“已结束”“还剩 N 个月”)用 Timeline 的 today 和 countdowns 计算,不要写死在文字里。
  • 示意性质的图形要在图注里写“示意”,示例公司和它的数字一律在 source 里标“示意”。

8. QA 报错怎么修

npx slidehtml check 的最后一步是自动 QA:在 1920×1080、1366×768、2560×1440、1440×900 四种窗口下逐页检查,截图存到 qa/,详细结果写入 qa/report.json。

报错原因修法
text "…" outside the safe area文字超出画布安全区按该模板的“内容上限”缩短文字,或减少行数、条目数
text collision: "A" × "B"两段文字重叠了在 deck 文件里搜索 A 的开头几个字,找到对应的字段,把它缩短到下限和上限之间。常见情况有三种:标题太长换成了两行(改用数组断行);正文里堆了长英文标识符(移到 tag 或删减);某一列条目太多(删掉一条)。"1"、"2" 这类单个数字通常是 NumberedColumns 底部的大编号,说明那一列的 body 太长
… clips content内容超出容器被裁切缩短那个字段,常见于 Timeline 段内的 label 太长
font 15.0u too small用了自定义的小字号删掉自定义样式
font cjk400 not loaded,或页面上出现方框、字体粗细不一新文字不在字体子集里重新运行 npx slidehtml check(第一步就是重新裁剪字体子集)
external requests …引用了网络资源删掉远程图片、字体或链接资源
navigation: …交互元素拦截了翻页键自定义组件不要监听全局键盘事件
detail …: card did not return改动了 Bento 内部撤销对 src/kit/Bento.tsx 的修改
gallery …模板库页面出错检查 src/kit/catalog.ts 的 demo 是否对应 deck 字段所指示例演示中存在的页面 id
类型错误 Type '"xxx"' is not assignable to type IconName图标名写错,或不在精选集里到 #/kit/icons 查名字;确实需要新图标时按第 12 节添加

WARN:QA 还会输出不算失败的提醒,例如 slide 4: content ends at y=640 … looks empty,意思是这一页下半部分基本是空的。看到这类提醒,按下面的截图自查处理。

截图自查(QA 不一定报,但会影响质量):

  • 整页超过一半是空的:加一个 pull、detail、countdowns 这类可选块,或者换成信息更密的模板。
  • 某一列明显比其他列长或短(例如一组只有 1 项):精简长的那一列,或者给短的列补一条,让各列项数相差不超过 1。
  • 正文最后一行只剩一两个字:改写句子,见第 5 节第 9 条。
  • 中文标题第二行只有一两个字:改用数组手动断行。
  • 装饰件(手绘圈、高亮、箭头)放大 2 倍看一遍:位置要对准,强调的内容要和文字一致。

PASS 并且每页截图都看过,才算完成。

9. 放映

快捷键、演讲者视图、导出 PDF、纹理和翻页方式见 presenting.md。

10. 扩展:Bento 的小图与详情

Bento 每张卡片可以带两块自定义内容:

  • mini:卡片上的小图形,用于第 2–6 格。参考示例演示 Bento 页旁边的 minis.tsx:纯 DOM 加已有的 mini-* 样式,不超过卡片的视觉区。
  • detail:展开后的右栏,必填。参考同目录的 details.tsx,可以复用这些样式类:
类名用途
dv-label小节标签(等宽小字)
dv-flow2–3 个并排的大数字统计
dv-notes(dl > dt/dd)键值说明列表
dv-code 系列前后代码对照面板
dv-stack 系列两列版本对照表

写完后在放映里打开每张卡片,确认详情没有超出卡片。QA 也会逐张检查。

11. 新增模板

只有当某类内容反复出现、现有模板都放不下时,才考虑新增模板。步骤见 contributing.md。写演示时不要改模板。

12. 图标

图标来自 Solar Icons(CC BY 4.0,模板库页脚已署名)。src/kit/icon-set.ts 精选了一组图标,分组整理;#/kit/icons 可以浏览全部图标,点击复制名称。components.md 最后的“图标”一节也列出了全部名称。

选系列:每个图标有 6 个系列,整份演示用同一个,写在 DeckDef 上:

export const deck: DeckDef = {
  title: '…',
  iconStyle: 'line-duotone', // 默认值;可选 bold-duotone、linear、outline、broken、bold
  slides: [ … ],
}

模板库左侧(窄屏在页首)的“图标系列”切换器会把所有预览换成对应系列,用来挑选。

用法:模板里的 icon 字段直接写名称,例如 icon: 'radar'。在 Bento 详情等自定义区域里可以用 <Icon>:

写法效果
<Icon name="radar" />48u,跟随 iconStyle,副色层是半透明墨色
<Icon name="radar" size={36} />尺寸按设计单位,常用 30–48
<Icon name="radar" tone="accent" />副色层换成强调色。每页最多一个,模板已经替焦点位置处理好了
<Icon name="radar" tone="mute" />灰色,用于装饰
<Icon name="radar" variant="bold" />只让这一个图标换系列,一般不需要

挑图标的规则

  1. 按含义挑,不按好看挑:讲“社区”用 users,讲“检索”用 database。
  2. 同一页里不要重复用同一个图标。
  3. 图标是辅助,不能代替文字:每个图标旁边都要有标题。
  4. 精选集里没有合适的,按 contributing.md 添加。

13. 配色、深色页与风格

每份演示选一套强调色,写在 DeckDef.theme 上。模板里所有强调色位置(kicker、焦点数字、焦点条、浅色底、终端提示符)都会一起换:

export const deck: DeckDef = {
  title: '…',
  theme: 'cobalt', // crimson(默认)· amber · cobalt · emerald · violet
  slides: [ … ],
}
名称色值
crimson 绯红#e00052
amber 橙#eb5a0c
cobalt 钴蓝#2457f5
emerald 翠绿#0c9366
violet 紫#6c3cf0

模板库左侧的“强调色”切换器可以把所有预览临时换成某一套,选“随演示”则各自使用所属演示的配色。

每套配色还带一组 paper:底色、卡片、分隔线都往强调色的方向偏一点,橙色配暖米色,钴蓝配冷白,翠绿配灰绿。换配色时底色会一起换,不需要另外设置。

深色页

单独一页可以设成深色,整块画布(包括页眉和进度条)都会反白,翻页时平滑过渡:

{ id: 'ch1', label: '看清买家', tone: 'dark', render: () => <SectionBreak … /> }

只在这几个模板上用,它们都在深色下检查过:SectionBreak、QuoteHero、Teaser、Closing、Statement。FullBleed 必须写 tone: 'dark'。其余模板有深色卡片或白字,放在深色页上会看不清。一份演示里深色页不要超过三分之一,最适合放在每章的第一页和最后一页,形成明暗节奏。

强调色整页

tone: 'accent' 把整页铺满主题色,文字反白,原来用强调色的地方(小标签、关键词)变成白色。它是最强的停顿,一份演示最多 2 页,只用在 SectionBreak、Statement、Closing 上。最典型的用法是一页 Statement 把上一页数据的结论单独立住。

风格

DeckDef.style 决定标题和大数字的字体、圆角、底色和装饰,正文、字号、间距都不变,所以每个模板的内容上限照旧有效。它和配色互相独立,任意组合。共 23 种:

场合风格
正式汇报standard(默认)、editorial、calm
发布会与品牌keynote、toy3d、poster、gradient、warm-dark、nuance、agency、halo、electric
产品与工具studio-dark、bento、soft-saas、float-ui、wallpaper、desktop
轻松分享sticker、playful、pop、ribbon、mono-studio

每种风格的字体、底色和适合场合见 skills/slidehtml/references/styles.md(由代码生成)。

mono-studio、keynote、warm-dark 整份默认深色,不用写 tone;某一页要换回浅色时写 tone: 'light'。默认深色的风格里只用深色下检查过的模板:上面列出的五个,加上各图表模板。

风格专属模板(例如 FloatCover、Desktop、KeyReveal)尽量只在对应风格里用;它们在 components.md 的“适合”一行会写明风格。

每种风格还提供 6 个点缀色 --spot-1 … 6(1 是主题色),只给图标方块(IconTile)和迷你界面的标签用,不要用在正文上。

选风格之前先看样张:打开 #/kit/styles(风格样张墙),同一页按每种风格各排一遍并排对比;也可以用左侧的“风格”切换器把所有预览换成某一种风格。

展示字体只裁剪了 src/ 里出现过的字,npx slidehtml check 会先重新裁剪;在浏览器里临时改标题时,新打的字可能回落到黑体。

14. 逐条展开与翻页衔接

逐条展开

给一页加 build,讲的时候就能一项一项出现:

{ id: 'funnel', label: '转化漏斗', build: 'reveal', render: () => <Funnel … /> }
  • 'reveal':还没讲到的项先压暗,每按一次 → 出现一项。
  • 'focus':已经讲过的也压暗,只有当前这一项是亮的。适合一次只讲一件事的页面,比如 Faq、Cycle、IssueTree、FlowDiagram、IndexStack、FolderCards。

只有用 → 或 Space 进入这一页时才逐条展开。用进度条、目录、总览或 #/N 跳过来时直接显示全部内容,所以 QA 截图和模板库里看到的都是完整的页面。

哪些元素算一项由模板决定:列表、卡片、表格行、漏斗的每一级、热力表的每一行、截图的每个标注。写 deck 时只需要加 build,不用管模板内部。

一页里少于 3 项时不要加 build。整份演示里逐条展开的页不要超过三分之一,否则讲的人要按太多次键。

翻页衔接

目录里的章节编号会飞到下一页章节页的大号数字上(反过来也一样)。这是 Agenda 和 SectionBreak 自带的,不需要设置。

逐字出现的一句话用 RevealStatement 模板。

15. 图片

Screenshot、BeforeAfter、HeroPanel、TabbedShot、FullBleed 和部分封面、章节页用到图片。图片只有三类,都用 import 引入,其他来源的图片不要用:

类型文件名放在哪能做什么
真实截图任意deck 目录的 assets/可以当证据
图库照片photo- 开头src/assets/photos/只营造氛围(封面、章节页、场景配图)
装饰插图decor- 开头deck 目录的 assets/只做装饰(背景、氛围)
  • 真实截图:没有截图就换模板,不要拿示意图冒充产品界面。source 写清楚截的是什么、什么时候截的、怎么截的。
  • photo- 照片来自 Unsplash,不能冒充“我们的客户、团队、产品、办公室”。source 里写“图:Unsplash / 作者名”,作者和原链接记在 src/assets/photos/credits.json。照片不随项目分发:运行 npx slidehtml photos,用你自己的 UNSPLASH_ACCESS_KEY 下载到 src/assets/photos/,同时写好 credits.json。
  • decor- 插图是 AI 生成的装饰图,不能当截图、证据或数据图,也不能出现真实品牌。
  • 引入方式:import shot from './assets/x.webp'。打包时会内联进单个 HTML 文件。
  • 用 WebP,单张 200 KB 以内。宽 1440–1600 像素足够。
  • ratio 填图片真实的宽高比;BeforeAfter 的两张图尺寸和构图必须一致。

16. Emoji

在任何格式的任何文字字段里直接打 emoji 就行:演示、报告、简历、卡片、视频、课件和展示屏都支持,不用改模板。emoji 由 slidehtml 内置的素材绘制,换机器、导出都长一样。文件里只打包实际用到的 emoji。

export const deck: DeckDef = { title: '…', emojiStyle: 'fluent', slides: [ … ] }
emojiStyle样子适合
fluent(默认)柔和、有立体感屏幕、卡片、视频、普通 PDF
flat扁平色块、文件小小尺寸、大幅印刷
noto圆润可爱大幅印刷

想单独摆一个 emoji 或指定大小,用 kit 里的 <Emoji e="🚀" size={64} />。卡片封面可以用贴纸式主图:motif: { kind: 'emoji', e: '🎤', around: ['✨', '💡'] }。在预览地址后加 ?emoji=noto 可以对比系列。全部 emoji 可以在开发预览的 #/kit/emoji 浏览和搜索。

限制:

  • 不含国旗和肤色变体。用了会中止构建,并在报错里指出是哪一个。
  • 用 SVG 文字画的图表标签放不了图片,写了 emoji 会让 QA 失败。把它放到标题或正文里。
  • fluent 用了模糊效果,导出 PDF 时会变成 300 ppi 的图片,文字大小下足够清晰。flat 和 noto 始终是矢量,大幅印刷请用这两种。

用量要克制:一页一两个,放在希望被记住的地方,放在文字前面,不要代替文字。财报、法务文件和事故通报里不要用。社交卡片可以多放一些。

文件地图

src/
  deck/            放映引擎:画布缩放、翻页、逐条展开、翻页衔接、总览、演讲者视图(一般不用改)
  kit/             231 个模板 + catalog.ts(模板说明的唯一来源)+ theme.ts(配色与风格)+ Icon.tsx / icon-set.ts(图标)
  decks/
    starter/       起步模板,npx slidehtml new 从这里复制
    <name>/        每份演示一个目录;assets/ 放截图和装饰图
  assets/photos/   npx slidehtml photos 下载的氛围照片和 credits.json
  gallery/         #/kit 模板库页面
  styles/          模板与风格的样式
cli/               slidehtml 命令行
scripts/           自动 QA、文档生成、字体子集
docs/<语言>/        文档;components.md 由代码生成
skills/slidehtml/  给 AI 助手的 skill 与参考表