revealjs-presenter by jwynia/agent-skills
npx skills add https://github.com/jwynia/agent-skills --skill revealjs-presenter在以下情况使用此技能:
此技能生成一个包含嵌入式 CSS 和 CDN 引用的独立 HTML 文件。
始终使用以下设置初始化 RevealJS:
Reveal.initialize({
hash: true,
center: true,
transition: 'fade',
transitionSpeed: 'fast',
backgroundTransition: 'fade',
width: 1920,
height: 1080,
margin: 0.08,
minScale: 0.2,
maxScale: 2.0
});
为何使用这些值:
center: true — 让 RevealJS 处理垂直居中。不要在章节上使用 flexbox 来对抗此设置。width: 1920, height: 1080 — 标准高清比例。内容自动缩放。margin: 0.08 — 在视口边缘提供呼吸空间。广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
transition: 'fade' — 专业、不分散注意力。避免使用 'zoom'、'convex' 等。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[演示文稿标题]</title>
<!-- RevealJS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/reveal.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/theme/white.min.css">
<!-- 字体 -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@100;200;300;400;500;600;700;800&display=swap" rel="stylesheet">
<style>
/* 主题变量和样式放在这里 */
</style>
</head>
<body>
<div class="reveal">
<div class="slides">
<!-- 幻灯片放在这里 -->
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/reveal.min.js"></script>
<script>
Reveal.initialize({
hash: true,
center: true,
transition: 'fade',
transitionSpeed: 'fast',
backgroundTransition: 'fade',
width: 1920,
height: 1080,
margin: 0.08,
minScale: 0.2,
maxScale: 2.0
});
</script>
</body>
</html>
应用这些样式以标准化 RevealJS 行为:
/* === 重置与标准化 === */
.reveal {
font-family: var(--font-body);
font-weight: 400;
color: var(--text-primary);
}
.reveal .slides section {
text-align: left;
padding: 60px;
box-sizing: border-box;
}
.reveal .slides section.centered {
text-align: center;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4 {
font-family: var(--font-display);
font-weight: 700;
color: var(--text-primary);
text-transform: none;
letter-spacing: -0.02em;
line-height: 1.1;
margin: 0 0 0.5em 0;
}
.reveal p {
margin: 0 0 1em 0;
line-height: 1.5;
}
.reveal ul, .reveal ol {
margin: 0;
padding: 0;
list-style-position: outside;
margin-left: 1.5em;
}
.reveal li {
margin-bottom: 0.5em;
line-height: 1.4;
}
主题是完整的规范。 在生成任何幻灯片之前,请从 themes/ 目录中读取相应的主题文件。主题控制视觉样式和内容策略。
每个主题文件指定:
除非用户另有指定,否则使用 themes/bold.md。
| 主题 | 文件 | 内容方法 |
|---|---|---|
| Bold | themes/bold.md | 最少文字、戏剧性影响、简单结构、40%+ 影响力幻灯片 |
| Corporate | themes/corporate.md | 信息密集、详细内容、允许复杂结构 |
未来主题可能包括 minimal.md(简洁、低调的设计)。
用作视觉锚点和章节指示器的水平横条。
.bar {
width: var(--bar-width);
height: var(--bar-height);
background: var(--accent-1);
margin-bottom: var(--space-md);
}
.bar-accent-2 { background: var(--accent-2); }
.bar-accent-3 { background: var(--accent-3); }
.bar-accent-4 { background: var(--accent-4); }
.centered .bar {
margin-left: auto;
margin-right: auto;
}
用法:
<div class="bar"></div>
<h2>章节标题</h2>
用于需要宽度限制的幻灯片:
.content-wrap {
max-width: var(--content-max-width);
width: 100%;
}
.centered .content-wrap {
margin: 0 auto;
}
.card {
background: var(--bg-secondary);
border-radius: var(--card-radius);
padding: var(--card-padding);
border-left: 4px solid var(--accent-1);
}
.card-accent-2 { border-left-color: var(--accent-2); }
.card-accent-3 { border-left-color: var(--accent-3); }
.card-accent-4 { border-left-color: var(--accent-4); }
.card h3 {
font-size: var(--size-h4);
margin-bottom: var(--space-xs);
}
.card p {
font-size: var(--size-body);
color: var(--text-secondary);
margin: 0;
}
.grid-2 {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-lg);
}
.grid-3 {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--space-md);
}
.grid-4 {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: var(--space-md);
}
/* 用于不均匀分割 */
.grid-2-1 {
display: grid;
grid-template-columns: 2fr 1fr;
gap: var(--space-lg);
}
.grid-1-2 {
display: grid;
grid-template-columns: 1fr 2fr;
gap: var(--space-lg);
}
用于品牌或上下文的持久页脚元素。放置在幻灯片容器外部。
.slide-footer {
position: fixed;
bottom: 30px;
left: var(--slide-padding);
font-size: var(--size-label);
font-weight: 500;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--text-muted);
z-index: 1000;
}
/* 为深色背景适配 */
section[data-background-color] .slide-footer,
.dark-slide .slide-footer {
color: rgba(255, 255, 255, 0.4);
}
HTML 放置位置(在 reveal div 之前):
<body>
<div class="slide-footer">公司名称 | 演示文稿标题</div>
<div class="reveal">
...
</div>
</body>
何时使用: 企业演示文稿、会议演讲、任何需要持久品牌标识的场合。错误做法: 信息过多、字体过大、分散内容注意力。
每种幻灯片类型包括:HTML 结构、何时使用以及常见错误。
开场幻灯片。设定基调和上下文。
<section class="centered">
<p class="label">类别或上下文</p>
<h1>演示文稿标题</h1>
<div class="bar"></div>
<p class="lead">副标题或标语放在这里</p>
</section>
何时使用: 仅用于开场幻灯片。
错误做法: 文字过多、包含议程、添加徽标/页脚杂乱。
在主要章节之间过渡。创建视觉停顿,并通过颜色建立章节标识。
<section class="centered" data-background-color="var(--bg-dark)">
<h1 class="text-on-dark">章节标题</h1>
<div class="bar bar-accent-2"></div>
<p class="lead text-on-dark">可选的简短上下文</p>
</section>
视觉节奏的颜色轮换: 变化章节分隔的背景颜色,为每个主要主题创建独特的视觉标识。建议轮换:
| 章节 | 背景 | 横条强调色 |
|---|---|---|
| 1(问题/上下文) | var(--bg-dark) | bar-accent-3 |
| 2(解决方案) | var(--accent-1) | bar-accent-2 |
| 3(细节) | var(--accent-2) | 默认 |
| 4(未来/行动号召) | var(--bg-dark) | bar-accent-2 |
带强调背景的示例:
<section class="centered" data-background-color="#D45D00">
<h1 class="text-on-dark">问题</h1>
<p class="text-on-dark" style="opacity: 0.8;">为什么当前范式已失效。</p>
</section>
何时使用: 在主要章节之间(通常每个演示文稿 3-5 次)。错误做法: 用于每个主题变更、添加超出章节名称的内容、所有章节分隔使用相同颜色。
最大影响力。一个想法,巨大的字体。
<section class="centered">
<h1 style="font-size: var(--size-stat-hero);">简化。</h1>
</section>
何时使用: 强调关键概念、创造时刻、过渡停顿。
错误做法: 过度使用(每个演示文稿超过 2-3 次)、用于需要解释的概念。
戏剧性的数据时刻。一个数字占据主导。
<section class="centered">
<p class="label">上下文标签</p>
<p class="stat-hero text-accent-1">87%</p>
<p class="stat-label">的用户完成了入门流程</p>
</section>
何时使用: 最重要的数据点。通常每个演示文稿只有 1-2 个。
错误做法: 对每个数据点都使用英雄处理方式、埋没在其他内容中。
突出的数据,但不是英雄时刻。
<section class="centered">
<p class="label">预期结果</p>
<div class="bar"></div>
<p class="stat text-accent-2">50%</p>
<p class="stat-label">开发时间减少</p>
</section>
何时使用: 支持性数据点、次要指标。
错误做法: 所有数据点大小相同、没有上下文标签。
2-3 个相关统计数据一起显示以进行比较。
<section>
<h2>关键指标</h2>
<div class="bar"></div>
<div class="grid-3" style="margin-top: var(--space-lg);">
<div class="centered">
<p class="stat text-accent-1">50%</p>
<p class="stat-label">开发速度更快</p>
</div>
<div class="centered">
<p class="stat text-accent-2">75%</p>
<p class="stat-label">原型成功率</p>
</div>
<div class="centered">
<p class="stat text-accent-3">30%</p>
<p class="stat-label">开销减少</p>
</div>
</div>
</section>
何时使用: 比较相关指标、显示前后对比、仪表板式摘要。
错误做法: 超过 3 个统计数据、混合不相关的数据。
带有视觉强调的署名引用。
<section class="centered">
<blockquote style="font-size: var(--size-h2); font-style: italic; max-width: 900px; margin: 0 auto;">
"最好的界面是没有界面。"
</blockquote>
<p class="text-muted" style="margin-top: var(--space-md);">— Golden Krishna</p>
</section>
何时使用: 专家权威、难忘的短语、用户推荐。错误做法: 引用过长(目标少于 20 个词)、缺少署名。
值得拥有自己幻灯片的戏剧性陈述。使用影响力排版,可选择内联高亮。
<section class="centered">
<p class="impact">AI 代理是 <span class="highlight-2">主要的开发者</span>。</p>
</section>
带英雄处理方式:
<section class="centered">
<p class="impact-hero">为 <span class="highlight-3">人类</span> 构建的语言
为 <span class="highlight-1">AI</span> 创造了失败模式。</p>
</section>
带上下文标签:
<section class="centered">
<p class="label">反转</p>
<div class="bar"></div>
<p class="impact">人类交互成为 <span class="highlight-2">精炼层</span>。</p>
</section>
何时使用: 论点陈述、范式转变、定义你论点的关键断言。你希望观众停下来吸收一个想法的时刻。错误做法: 过度使用(每个演示文稿最多 2-4 次)、添加支持性文本、用于次要观点、忘记使用高亮进行强调。
主力幻灯片。清晰的声明,有视觉证据支持。
<section>
<h2>重新设计后用户参与度增加了 43%</h2>
<div class="bar"></div>
<div class="grid-1-2">
<div>
<p class="lead">支持断言的关键见解或上下文放在这里。保持简洁。</p>
</div>
<div>
<!-- 视觉证据:图表、示意图、图像等 -->
<img src="chart.svg" alt="显示增长的参与度图表">
</div>
</div>
</section>
何时使用: 大多数内容幻灯片。呈现信息时的默认选择。
错误做法: 将断言埋没在正文中、没有视觉证据、使用项目符号列表而非视觉元素。
具有相等视觉权重的多个项目。
<section>
<h2>平台能力</h2>
<div class="bar"></div>
<div class="grid-2" style="margin-top: var(--space-lg);">
<div class="card">
<h3>智能代理</h3>
<p>跨组织知识进行推理的 AI 驱动助手</p>
</div>
<div class="card card-accent-2">
<h3>上下文网络</h3>
<p>跨所有系统的统一信息访问</p>
</div>
<div class="card card-accent-3">
<h3>自定义应用</h3>
<p>内置 AI 加速开发</p>
</div>
<div class="card card-accent-4">
<h3>自动化工作流</h3>
<p>无需手动触发的事件驱动流程</p>
</div>
</div>
</section>
何时使用: 功能、优势、选项、类别——具有同等重要性的项目。
错误做法: 超过 4 个项目(拆分为多个幻灯片)、卡片中文字过多。
随时间顺序推进。
<section>
<h2>实施路线图</h2>
<div class="bar"></div>
<div class="grid-4" style="margin-top: var(--space-lg);">
<div>
<p class="stat text-accent-1" style="font-size: var(--size-h2);">01</p>
<h4>基础</h4>
<p class="text-muted">第 1–3 个月</p>
<p class="text-secondary">核心基础设施和工具</p>
</div>
<div>
<p class="stat text-accent-2" style="font-size: var(--size-h2);">02</p>
<h4>集成</h4>
<p class="text-muted">第 4–6 个月</p>
<p class="text-secondary">平台连接</p>
</div>
<div>
<p class="stat text-accent-3" style="font-size: var(--size-h2);">03</p>
<h4>智能</h4>
<p class="text-muted">第 7–9 个月</p>
<p class="text-secondary">高级能力</p>
</div>
<div>
<p class="stat text-accent-4" style="font-size: var(--size-h2);">04</p>
<h4>成熟</h4>
<p class="text-muted">第 10–12 个月</p>
<p class="text-secondary">优化</p>
</div>
</div>
</section>
何时使用: 项目阶段、历史进展、逐步流程。
错误做法: 超过 5 个阶段(简化或拆分)、每个阶段细节过多。
两个选项或状态之间的直接对比。
<section>
<h2>前后对比</h2>
<div class="bar"></div>
<div class="grid-2" style="margin-top: var(--space-lg);">
<div class="card" style="border-left-color: var(--text-muted);">
<p class="label text-muted">之前</p>
<h3>手动流程</h3>
<p>数小时的重复工作,容易出错,结果不一致</p>
</div>
<div class="card">
<p class="label">之后</p>
<h3>自动化工作流</h3>
<p>几分钟完成,准确,每次结果一致</p>
</div>
</div>
</section>
何时使用: 问题/解决方案、旧/新、我们/他们的对比。
错误做法: 不公平的对比、文字过多、超过 2 个项目。
带有视觉锚点的概念集群。图标提供可扫描的地标。
<section>
<h2>核心原则</h2>
<div class="bar"></div>
<div class="grid-3" style="margin-top: var(--space-lg);">
<div class="centered">
<div class="icon-wrap">
<!-- 内联 SVG 图标放在这里 -->
<svg width="64" height="64" viewBox="0 0 24 24" fill="var(--accent-1)">
<path d="..."/>
</svg>
</div>
<h4>安全</h4>
<p class="text-secondary">企业级保护</p>
</div>
<div class="centered">
<div class="icon-wrap">
<svg width="64" height="64" viewBox="0 0 24 24" fill="var(--accent-2)">
<path d="..."/>
</svg>
</div>
<h4>可扩展性</h4>
<p class="text-secondary">随需求增长</p>
</div>
<div class="centered">
<div class="icon-wrap">
<svg width="64" height="64" viewBox="0 0 24 24" fill="var(--accent-3)">
<path d="..."/>
</svg>
</div>
<h4>简洁性</h4>
<p class="text-secondary">易于使用和维护</p>
</div>
</div>
</section>
何时使用: 原则、价值观、功能类别——受益于视觉锚点的抽象概念。
错误做法: 无助于理解的通用图标、项目过多。
用于技术演示。需要语法高亮。
<section>
<h2>API 集成</h2>
<div class="bar"></div>
<pre><code class="language-javascript">// 初始化客户端
const client = new MagicConstructor({
apiKey: process.env.SECRET_KEY,
workspace: 'production'
});
// 带上下文查询
const result = await client.query({
prompt: "总结第三季度销售情况",
context: ['sales-data', 'quarterly-reports']
});</code></pre>
<p class="text-muted" style="margin-top: var(--space-sm);">完整文档见 docs.coolproject.io</p>
</section>
代码块的 CSS:
.reveal pre {
font-family: var(--font-mono);
font-size: var(--size-small);
background: var(--bg-dark);
color: var(--text-on-dark);
padding: var(--space-md);
border-radius: var(--card-radius);
text-align: left;
width: 100%;
box-sizing: border-box;
}
.reveal pre code {
font-family: inherit;
line-height: 1.6;
}
何时使用: 技术演讲、API 演示、实现示例。
错误做法: 代码过多(最多约 15 行)、没有语法高亮、显示样板代码。
带有最少文字的全屏或大图像。
<section class="centered">
<img src="product-screenshot.png" alt="产品界面"
style="max-height: 70vh; border-radius: var(--card-radius); box-shadow: 0 20px 60px rgba(0,0,0,0.15);">
<p class="text-muted" style="margin-top: var(--space-md);">新仪表板界面</p>
</section>
何时使用: 产品截图、照片、需要占据主导地位的示意图。
错误做法: 小图像带有大量周围文字、图像质量差。
最少内容。创造停顿,让观众处理信息。
<section class="centered" data-background-color="var(--bg-secondary)">
<p class="label">关键要点</p>
<div class="bar"></div>
<h2>复杂性是执行力的敌人。</h2>
</section>
何时使用: 密集章节之后、主要过渡之前、强调关键信息。
错误做法: 添加更多内容、使用过于频繁。
最后一张幻灯片。清晰的下一步。
<section class="centered" data-background-color="var(--bg-dark)">
<h1 class="text-on-dark">准备开始了吗?</h1>
<div class="bar bar-accent-2"></div>
<p class="lead text-on-dark">联系我们:hello@example.com</p>
<p class="text-muted" style="margin-top: var(--space-xl);">example.com/demo</p>
</section>
何时使用: 最后一张幻灯片。
错误做法: 没有明确的行动号召、联系信息过多、仅以"有问题吗?"作为内容。
用于不需要外部工具的演示文稿特定图表。
<div class="process-flow">
<div class="process-step">
<div class="process-node" style="background: var(--accent-1);"></div>
<p class="process-label">输入</p>
</div>
<div class="process-arrow">→</div>
<div class="process-step">
<div class="process-node" style="background: var(--accent-2);"></div>
<p class="process-label">处理</p>
</div>
<div class="process-arrow">→</div>
<div class="process-step">
<div class="process-node" style="background: var(--accent-3);"></div>
<p class="process-label">输出</p>
</div>
</div>
.process-flow {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-md);
}
.process-step {
text-align: center;
}
.process-node {
width: 80px;
height: 80px;
border-radius: 50%;
margin: 0 auto var(--space-xs);
}
.process-arrow {
font-size: 2rem;
color: var(--text-muted);
}
.process-label {
font-size: var(--size-body);
font-weight: 500;
}
<svg viewBox="0 0 400 200" style="max-width: 600px;">
<!-- 条形 -->
<rect x="50" y="120" width="60" height="60" fill="var(--accent-1)"/>
<rect x="130" y="80" width="60" height="100" fill="var(--accent-2)"/>
<rect x="210" y="40" width="60" height="140" fill="var(--accent-3)"/>
<rect x="290" y="20" width="60" height="160" fill="var(--accent-4)"/>
<!-- 标签 -->
<text x="80" y="195" text-anchor="middle" font-size="14" fill="var(--text-secondary)">Q1</text>
<text x="160" y="195" text-anchor="middle" font-size="14" fill="var(--text-secondary)">Q2</text>
<text x="240" y="195" text-anchor="middle" font-size="14" fill="var(--text-secondary)">Q3</text>
<text x="320" y="195" text-anchor="middle" font-size="14" fill="var(--text-secondary)">Q4</text>
</svg>
<svg viewBox="0 0 400 300" style="max-width: 500px;">
<!-- 到辐射点的连线 -->
<line x1="200" y1="150" x2="100" y2="60" stroke="var(--text-muted)" stroke-width="2"/>
<line x1="200" y1="150" x2="300" y2="60" stroke="var(--text-muted)" stroke-width="2"/>
<line x1="200" y1="150" x2="100" y2="240" stroke="var(--text-muted)" stroke-width="2"/>
<line x1="200" y1="150" x2="300" y2="240" stroke="var(--text-muted)" stroke-width="2"/>
<!-- 中心枢纽 -->
<circle cx="200" cy="150" r="50" fill="var(--accent-1)"/>
<text x="200" y="155" text-anchor="middle" fill="white" font-weight="600">核心</text>
<!-- 辐射点 -->
<circle cx="100" cy="60" r="35" fill="var(--accent-2)"/>
<text x="100" y="65" text-anchor="middle" fill="white" font-size="12">功能 A</text>
<circle cx="300" cy="60" r="35" fill="var(--accent-3)"/>
<text x="300" y="65" text-anchor="middle" fill="white" font-size="12">功能 B</text>
<circle cx="100" cy="240" r="35" fill="var(--accent-4)"/>
<text x="100" y="245" text-anchor="middle" fill="white" font-size="12">功能 C</text>
<circle cx="300" cy="240" r="35" fill="var(--accent-1)"/>
<text x="300" y="245" text-anchor="middle" fill="white" font-size="12">功能 D</text>
</svg>
使用内联 SVG/HTML 用于:
使用外部工具(Chart.js、D3、Mermaid)用于:
这些原则适用于所有主题。有关具体的字数限制、幻灯片类型偏好和节奏规则,请查阅主题文件(第二部分)。
每张幻灯片都应回答:"我希望他们从这张幻灯片中记住哪一件事?"
如果你无法用一句话回答,请拆分幻灯片。
用以下内容替换项目符号:
而不是:
优势:
• 开发更快
• 质量更好
• 成本更低
使用三张独立的幻灯片:
对于复杂信息,使用 RevealJS 片段按顺序显示:
<section>
<h2>三个关键因素</h2>
<div class="bar"></div>
<div class="grid-3">
<div class="fragment">
<h4>因素一</h4>
<p>解释在这里</p>
</div>
<div class="fragment">
<h4>因素二</h4>
<p>解释在这里</p>
</div>
<div class="fragment">
<h4>因素三</h4>
<p>解释在这里</p>
</div>
</div>
</section>
查阅主题文件了解每种幻灯片类型的特定字数限制和内容节奏规则。这些在不同主题之间差异很大:
数据转储
每张幻灯片都充满数据但没有解释。
修复: 每张幻灯片一个见解。先陈述结论。
脚本阅读器
幻灯片包含演讲者的完整脚本作为项目符号。
修复: 幻灯片展示你无法说的内容;你说你无法展示的内容。
模板陷阱
应用通用模板而不考虑设计如何服务于信息。
修复: 从沟通需求开始,而不是模板选项。
动画马戏团
所有内容都有过渡和效果。
修复: 动画仅用于渐进式披露或强调。默认不使用。
项目符号病
每张幻灯片都是项目符号列表。
修复: 使用断言-证据结构。如果需要列表,请质疑它是否需要成为一张幻灯片。
对抗框架
在设置了 center: true 时添加 flexbox 居中,反之亦然。
修复: 选择一种方法。此技能使用 center: true 配合章节级文本对齐。
视口单位升级
使用 vw 单位设置字体大小而没有上限,导致文本异常巨大。
修复: 始终使用带有基于 rem 最大值的 clamp():clamp(4rem, 10vw, 8rem)。
固定像素尺寸
硬编码字体和间距的像素值,无法缩放。
修复: 使用带有 clamp() 的 CSS 变量进行响应式调整大小。
忽略幻灯片尺寸
忘记 RevealJS 会将内容缩放到配置的尺寸。
修复: 为 1920×1080 设计。在多个窗口大小下测试。
背景颜色内联样式 在章节上使用 style="background: color" 而不是 data-background-color。修复: 使用 data-background-color="var(--bg-dark)" 让 RevealJS 正确处理。
排版工具特异性 创建像 .stat、.label、.lead 这样的工具类而没有足够的特异性。问题: .reveal p 比
Use this skill when:
This skill produces a single self-contained HTML file with embedded CSS and CDN references.
Always initialize RevealJS with these settings:
Reveal.initialize({
hash: true,
center: true,
transition: 'fade',
transitionSpeed: 'fast',
backgroundTransition: 'fade',
width: 1920,
height: 1080,
margin: 0.08,
minScale: 0.2,
maxScale: 2.0
});
Why these values:
center: true — Let RevealJS handle vertical centering. Do not fight this with flexbox on sections.width: 1920, height: 1080 — Standard HD ratio. Content scales automatically.margin: 0.08 — Provides breathing room at viewport edges.transition: 'fade' — Professional, non-distracting. Avoid 'zoom', 'convex', etc.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[PRESENTATION TITLE]</title>
<!-- RevealJS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/reveal.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/theme/white.min.css">
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@100;200;300;400;500;600;700;800&display=swap" rel="stylesheet">
<style>
/* Theme variables and styles go here */
</style>
</head>
<body>
<div class="reveal">
<div class="slides">
<!-- Slides go here -->
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/reveal.min.js"></script>
<script>
Reveal.initialize({
hash: true,
center: true,
transition: 'fade',
transitionSpeed: 'fast',
backgroundTransition: 'fade',
width: 1920,
height: 1080,
margin: 0.08,
minScale: 0.2,
maxScale: 2.0
});
</script>
</body>
</html>
Apply these styles to normalize RevealJS behavior:
/* === RESET & NORMALIZATION === */
.reveal {
font-family: var(--font-body);
font-weight: 400;
color: var(--text-primary);
}
.reveal .slides section {
text-align: left;
padding: 60px;
box-sizing: border-box;
}
.reveal .slides section.centered {
text-align: center;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4 {
font-family: var(--font-display);
font-weight: 700;
color: var(--text-primary);
text-transform: none;
letter-spacing: -0.02em;
line-height: 1.1;
margin: 0 0 0.5em 0;
}
.reveal p {
margin: 0 0 1em 0;
line-height: 1.5;
}
.reveal ul, .reveal ol {
margin: 0;
padding: 0;
list-style-position: outside;
margin-left: 1.5em;
}
.reveal li {
margin-bottom: 0.5em;
line-height: 1.4;
}
Themes are complete specifications. Before generating any slides, read the appropriate theme file from the themes/ directory. Themes control both visual styling AND content strategy.
Each theme file specifies:
Use themes/bold.md unless the user specifies otherwise.
| Theme | File | Content Approach |
|---|---|---|
| Bold | themes/bold.md | Minimal words, dramatic impact, simple structures, 40%+ impact slides |
| Corporate | themes/corporate.md | Information-dense, detailed content, complex structures allowed |
Future themes may include minimal.md (clean, understated design).
A horizontal bar used as a visual anchor and section indicator.
.bar {
width: var(--bar-width);
height: var(--bar-height);
background: var(--accent-1);
margin-bottom: var(--space-md);
}
.bar-accent-2 { background: var(--accent-2); }
.bar-accent-3 { background: var(--accent-3); }
.bar-accent-4 { background: var(--accent-4); }
.centered .bar {
margin-left: auto;
margin-right: auto;
}
Usage:
<div class="bar"></div>
<h2>Section Title</h2>
For slides that need width constraint:
.content-wrap {
max-width: var(--content-max-width);
width: 100%;
}
.centered .content-wrap {
margin: 0 auto;
}
.card {
background: var(--bg-secondary);
border-radius: var(--card-radius);
padding: var(--card-padding);
border-left: 4px solid var(--accent-1);
}
.card-accent-2 { border-left-color: var(--accent-2); }
.card-accent-3 { border-left-color: var(--accent-3); }
.card-accent-4 { border-left-color: var(--accent-4); }
.card h3 {
font-size: var(--size-h4);
margin-bottom: var(--space-xs);
}
.card p {
font-size: var(--size-body);
color: var(--text-secondary);
margin: 0;
}
.grid-2 {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-lg);
}
.grid-3 {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--space-md);
}
.grid-4 {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: var(--space-md);
}
/* For uneven splits */
.grid-2-1 {
display: grid;
grid-template-columns: 2fr 1fr;
gap: var(--space-lg);
}
.grid-1-2 {
display: grid;
grid-template-columns: 1fr 2fr;
gap: var(--space-lg);
}
A persistent footer element for branding or context. Placed outside the slides container.
.slide-footer {
position: fixed;
bottom: 30px;
left: var(--slide-padding);
font-size: var(--size-label);
font-weight: 500;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--text-muted);
z-index: 1000;
}
/* Adapt for dark backgrounds */
section[data-background-color] .slide-footer,
.dark-slide .slide-footer {
color: rgba(255, 255, 255, 0.4);
}
HTML placement (before the reveal div):
<body>
<div class="slide-footer">Company Name | Presentation Title</div>
<div class="reveal">
...
</div>
</body>
When to use: Corporate presentations, conference talks, any context where persistent branding helps. Mistakes: Too much information, large font size, distracting from content.
Each slide type includes: HTML structure, when to use, and common mistakes.
The opening slide. Sets tone and context.
<section class="centered">
<p class="label">Category or Context</p>
<h1>Presentation Title</h1>
<div class="bar"></div>
<p class="lead">Subtitle or tagline goes here</p>
</section>
When to use: Opening slide only.
Mistakes: Too much text, including agenda, adding logos/footer clutter.
Transitions between major sections. Creates visual pause and establishes section identity through color.
<section class="centered" data-background-color="var(--bg-dark)">
<h1 class="text-on-dark">Section Title</h1>
<div class="bar bar-accent-2"></div>
<p class="lead text-on-dark">Optional brief context</p>
</section>
Color rotation for visual rhythm: Vary section break backgrounds to create distinct visual identities for each major topic. Suggested rotation:
| Section | Background | Bar Accent |
|---|---|---|
| 1 (Problem/Context) | var(--bg-dark) | bar-accent-3 |
| 2 (Solution) | var(--accent-1) | bar-accent-2 |
| 3 (Details) | var(--accent-2) | default |
| 4 (Future/CTA) | var(--bg-dark) |
Example with accent background:
<section class="centered" data-background-color="#D45D00">
<h1 class="text-on-dark">The Problem</h1>
<p class="text-on-dark" style="opacity: 0.8;">Why the current paradigm is broken.</p>
</section>
When to use: Between major sections (3-5 per presentation typically). Mistakes: Using for every topic change, adding content beyond the section name, using the same color for all section breaks.
Maximum impact. One idea, massive type.
<section class="centered">
<h1 style="font-size: var(--size-stat-hero);">Simplify.</h1>
</section>
When to use: Emphasizing a key concept, creating a moment, transitional pause.
Mistakes: Overuse (more than 2-3 per presentation), using for concepts that need explanation.
The dramatic data moment. ONE number dominates.
<section class="centered">
<p class="label">Context Label</p>
<p class="stat-hero text-accent-1">87%</p>
<p class="stat-label">of users completed onboarding</p>
</section>
When to use: Your most important data point. Usually only 1-2 per presentation.
Mistakes: Using hero treatment for every stat, burying in other content.
Prominent data, but not the hero moment.
<section class="centered">
<p class="label">Expected Outcome</p>
<div class="bar"></div>
<p class="stat text-accent-2">50%</p>
<p class="stat-label">reduction in development time</p>
</section>
When to use: Supporting data points, secondary metrics.
Mistakes: Making all stats the same size, no context labels.
2-3 related statistics shown together for comparison.
<section>
<h2>Key Metrics</h2>
<div class="bar"></div>
<div class="grid-3" style="margin-top: var(--space-lg);">
<div class="centered">
<p class="stat text-accent-1">50%</p>
<p class="stat-label">faster development</p>
</div>
<div class="centered">
<p class="stat text-accent-2">75%</p>
<p class="stat-label">prototype success</p>
</div>
<div class="centered">
<p class="stat text-accent-3">30%</p>
<p class="stat-label">reduced overhead</p>
</div>
</div>
</section>
When to use: Comparing related metrics, showing before/after, dashboard-style summary.
Mistakes: More than 3 stats, mixing unrelated data.
Attributed quotation with visual emphasis.
<section class="centered">
<blockquote style="font-size: var(--size-h2); font-style: italic; max-width: 900px; margin: 0 auto;">
"The best interface is no interface."
</blockquote>
<p class="text-muted" style="margin-top: var(--space-md);">— Golden Krishna</p>
</section>
When to use: Expert authority, memorable phrases, user testimonials. Mistakes: Long quotes (aim for under 20 words), missing attribution.
A dramatic statement that deserves its own slide. Uses impact typography with optional inline highlights.
<section class="centered">
<p class="impact">AI agents are the <span class="highlight-2">primary developers</span>.</p>
</section>
With hero treatment:
<section class="centered">
<p class="impact-hero">Languages built for <span class="highlight-3">humans</span>
create failure modes for <span class="highlight-1">AI</span>.</p>
</section>
With context label:
<section class="centered">
<p class="label">The Inversion</p>
<div class="bar"></div>
<p class="impact">Human interaction becomes the <span class="highlight-2">refinement layer</span>.</p>
</section>
When to use: Thesis statements, paradigm shifts, key assertions that define your argument. The moments where you want the audience to pause and absorb a single idea. Mistakes: Overuse (2-4 per presentation max), adding supporting text, using for minor points, forgetting highlights for emphasis.
The workhorse slide. Clear claim supported by visual proof.
<section>
<h2>User engagement increased 43% after redesign</h2>
<div class="bar"></div>
<div class="grid-1-2">
<div>
<p class="lead">Key insight or context that supports the assertion goes here. Keep it brief.</p>
</div>
<div>
<!-- Visual evidence: chart, diagram, image, etc. -->
<img src="chart.svg" alt="Engagement chart showing increase">
</div>
</div>
</section>
When to use: Most content slides. Default choice when presenting information.
Mistakes: Burying assertion in body text, no visual evidence, bullet lists instead of visuals.
Multiple items with equal visual weight.
<section>
<h2>Platform Capabilities</h2>
<div class="bar"></div>
<div class="grid-2" style="margin-top: var(--space-lg);">
<div class="card">
<h3>Intelligent Agents</h3>
<p>AI-powered assistants that reason across organizational knowledge</p>
</div>
<div class="card card-accent-2">
<h3>Context Networks</h3>
<p>Unified access to information across all systems</p>
</div>
<div class="card card-accent-3">
<h3>Custom Applications</h3>
<p>Accelerated development with built-in AI</p>
</div>
<div class="card card-accent-4">
<h3>Automated Workflows</h3>
<p>Event-driven processes without manual triggers</p>
</div>
</div>
</section>
When to use: Features, benefits, options, categories—items with equal importance.
Mistakes: More than 4 items (split into multiple slides), walls of text in cards.
Sequential progression over time.
<section>
<h2>Implementation Roadmap</h2>
<div class="bar"></div>
<div class="grid-4" style="margin-top: var(--space-lg);">
<div>
<p class="stat text-accent-1" style="font-size: var(--size-h2);">01</p>
<h4>Foundation</h4>
<p class="text-muted">Months 1–3</p>
<p class="text-secondary">Core infrastructure and tooling</p>
</div>
<div>
<p class="stat text-accent-2" style="font-size: var(--size-h2);">02</p>
<h4>Integration</h4>
<p class="text-muted">Months 4–6</p>
<p class="text-secondary">Platform connections</p>
</div>
<div>
<p class="stat text-accent-3" style="font-size: var(--size-h2);">03</p>
<h4>Intelligence</h4>
<p class="text-muted">Months 7–9</p>
<p class="text-secondary">Advanced capabilities</p>
</div>
<div>
<p class="stat text-accent-4" style="font-size: var(--size-h2);">04</p>
<h4>Maturity</h4>
<p class="text-muted">Months 10–12</p>
<p class="text-secondary">Optimization</p>
</div>
</div>
</section>
When to use: Project phases, historical progression, step-by-step processes.
Mistakes: More than 5 phases (simplify or split), too much detail per phase.
Direct contrast between two options or states.
<section>
<h2>Before & After</h2>
<div class="bar"></div>
<div class="grid-2" style="margin-top: var(--space-lg);">
<div class="card" style="border-left-color: var(--text-muted);">
<p class="label text-muted">Before</p>
<h3>Manual Process</h3>
<p>Hours of repetitive work, prone to errors, inconsistent results</p>
</div>
<div class="card">
<p class="label">After</p>
<h3>Automated Workflow</h3>
<p>Minutes to complete, accurate, consistent every time</p>
</div>
</div>
</section>
When to use: Problem/solution, old/new, us/them comparisons.
Mistakes: Unfair comparisons, too much text, more than 2 items.
Concept cluster with visual anchors. Icons provide scannable landmarks.
<section>
<h2>Core Principles</h2>
<div class="bar"></div>
<div class="grid-3" style="margin-top: var(--space-lg);">
<div class="centered">
<div class="icon-wrap">
<!-- Inline SVG icon here -->
<svg width="64" height="64" viewBox="0 0 24 24" fill="var(--accent-1)">
<path d="..."/>
</svg>
</div>
<h4>Security</h4>
<p class="text-secondary">Enterprise-grade protection</p>
</div>
<div class="centered">
<div class="icon-wrap">
<svg width="64" height="64" viewBox="0 0 24 24" fill="var(--accent-2)">
<path d="..."/>
</svg>
</div>
<h4>Scalability</h4>
<p class="text-secondary">Grows with your needs</p>
</div>
<div class="centered">
<div class="icon-wrap">
<svg width="64" height="64" viewBox="0 0 24 24" fill="var(--accent-3)">
<path d="..."/>
</svg>
</div>
<h4>Simplicity</h4>
<p class="text-secondary">Easy to use and maintain</p>
</div>
</div>
</section>
When to use: Principles, values, feature categories—abstract concepts that benefit from visual anchors.
Mistakes: Generic icons that don't aid understanding, too many items.
For technical presentations. Syntax highlighting required.
<section>
<h2>API Integration</h2>
<div class="bar"></div>
<pre><code class="language-javascript">// Initialize the client
const client = new MagicConstructor({
apiKey: process.env.SECRET_KEY,
workspace: 'production'
});
// Query with context
const result = await client.query({
prompt: "Summarize Q3 sales",
context: ['sales-data', 'quarterly-reports']
});</code></pre>
<p class="text-muted" style="margin-top: var(--space-sm);">Full documentation at docs.coolproject.io</p>
</section>
CSS for code blocks:
.reveal pre {
font-family: var(--font-mono);
font-size: var(--size-small);
background: var(--bg-dark);
color: var(--text-on-dark);
padding: var(--space-md);
border-radius: var(--card-radius);
text-align: left;
width: 100%;
box-sizing: border-box;
}
.reveal pre code {
font-family: inherit;
line-height: 1.6;
}
When to use: Technical talks, API demos, implementation examples.
Mistakes: Too much code (max ~15 lines), no syntax highlighting, showing boilerplate.
Full or large image with minimal text.
<section class="centered">
<img src="product-screenshot.png" alt="Product interface"
style="max-height: 70vh; border-radius: var(--card-radius); box-shadow: 0 20px 60px rgba(0,0,0,0.15);">
<p class="text-muted" style="margin-top: var(--space-md);">New dashboard interface</p>
</section>
When to use: Product screenshots, photos, diagrams that need to dominate.
Mistakes: Small images with lots of surrounding text, poor image quality.
Minimal content. Creates pause, lets audience process.
<section class="centered" data-background-color="var(--bg-secondary)">
<p class="label">Key Takeaway</p>
<div class="bar"></div>
<h2>Complexity is the enemy of execution.</h2>
</section>
When to use: After dense sections, before major transitions, emphasizing key messages.
Mistakes: Adding more content, using too frequently.
Final slide. Clear next step.
<section class="centered" data-background-color="var(--bg-dark)">
<h1 class="text-on-dark">Ready to Begin?</h1>
<div class="bar bar-accent-2"></div>
<p class="lead text-on-dark">Contact us at hello@example.com</p>
<p class="text-muted" style="margin-top: var(--space-xl);">example.com/demo</p>
</section>
When to use: Final slide.
Mistakes: No clear CTA, too much contact info, "Questions?" as the only content.
For presentation-specific diagrams that don't require external tools.
<div class="process-flow">
<div class="process-step">
<div class="process-node" style="background: var(--accent-1);"></div>
<p class="process-label">Input</p>
</div>
<div class="process-arrow">→</div>
<div class="process-step">
<div class="process-node" style="background: var(--accent-2);"></div>
<p class="process-label">Process</p>
</div>
<div class="process-arrow">→</div>
<div class="process-step">
<div class="process-node" style="background: var(--accent-3);"></div>
<p class="process-label">Output</p>
</div>
</div>
.process-flow {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-md);
}
.process-step {
text-align: center;
}
.process-node {
width: 80px;
height: 80px;
border-radius: 50%;
margin: 0 auto var(--space-xs);
}
.process-arrow {
font-size: 2rem;
color: var(--text-muted);
}
.process-label {
font-size: var(--size-body);
font-weight: 500;
}
<svg viewBox="0 0 400 200" style="max-width: 600px;">
<!-- Bars -->
<rect x="50" y="120" width="60" height="60" fill="var(--accent-1)"/>
<rect x="130" y="80" width="60" height="100" fill="var(--accent-2)"/>
<rect x="210" y="40" width="60" height="140" fill="var(--accent-3)"/>
<rect x="290" y="20" width="60" height="160" fill="var(--accent-4)"/>
<!-- Labels -->
<text x="80" y="195" text-anchor="middle" font-size="14" fill="var(--text-secondary)">Q1</text>
<text x="160" y="195" text-anchor="middle" font-size="14" fill="var(--text-secondary)">Q2</text>
<text x="240" y="195" text-anchor="middle" font-size="14" fill="var(--text-secondary)">Q3</text>
<text x="320" y="195" text-anchor="middle" font-size="14" fill="var(--text-secondary)">Q4</text>
</svg>
<svg viewBox="0 0 400 300" style="max-width: 500px;">
<!-- Lines to spokes -->
<line x1="200" y1="150" x2="100" y2="60" stroke="var(--text-muted)" stroke-width="2"/>
<line x1="200" y1="150" x2="300" y2="60" stroke="var(--text-muted)" stroke-width="2"/>
<line x1="200" y1="150" x2="100" y2="240" stroke="var(--text-muted)" stroke-width="2"/>
<line x1="200" y1="150" x2="300" y2="240" stroke="var(--text-muted)" stroke-width="2"/>
<!-- Center hub -->
<circle cx="200" cy="150" r="50" fill="var(--accent-1)"/>
<text x="200" y="155" text-anchor="middle" fill="white" font-weight="600">Core</text>
<!-- Spokes -->
<circle cx="100" cy="60" r="35" fill="var(--accent-2)"/>
<text x="100" y="65" text-anchor="middle" fill="white" font-size="12">Feature A</text>
<circle cx="300" cy="60" r="35" fill="var(--accent-3)"/>
<text x="300" y="65" text-anchor="middle" fill="white" font-size="12">Feature B</text>
<circle cx="100" cy="240" r="35" fill="var(--accent-4)"/>
<text x="100" y="245" text-anchor="middle" fill="white" font-size="12">Feature C</text>
<circle cx="300" cy="240" r="35" fill="var(--accent-1)"/>
<text x="300" y="245" text-anchor="middle" fill="white" font-size="12">Feature D</text>
</svg>
Use inline SVG/HTML for:
Use external tools (Chart.js, D3, Mermaid) for:
These principles apply regardless of theme. For specific word limits, slide type preferences, and rhythm rules, consult the theme file (Part 2).
Every slide should answer: "What is the ONE thing I want them to take from this?"
If you can't answer in one sentence, split the slide.
Replace bullet points with:
Instead of:
Benefits:
• Faster development
• Better quality
• Lower costs
Use three separate slides:
For complex information, reveal sequentially using RevealJS fragments:
<section>
<h2>Three Key Factors</h2>
<div class="bar"></div>
<div class="grid-3">
<div class="fragment">
<h4>Factor One</h4>
<p>Explanation here</p>
</div>
<div class="fragment">
<h4>Factor Two</h4>
<p>Explanation here</p>
</div>
<div class="fragment">
<h4>Factor Three</h4>
<p>Explanation here</p>
</div>
</div>
</section>
Consult the theme file for specific word limits per slide type and content rhythm rules. These vary significantly between themes:
The Data Dump
Every slide full of data without interpretation.
Fix: One insight per slide. State conclusion first.
The Script Reader
Slides contain the speaker's full script as bullet points.
Fix: Slides show what you can't say; you say what you can't show.
The Template Trap
Generic template applied without considering how design serves message.
Fix: Start from communication need, not template options.
The Animation Circus
Transitions and effects on everything.
Fix: Animation only for progressive disclosure or emphasis. Default to none.
Bullet Point Disease
Every slide is a bullet list.
Fix: Use assertion-evidence structure. If you need a list, question whether it needs to be a slide.
Fighting the Framework
Adding flexbox centering when center: true is set, or vice versa.
Fix: Choose one approach. This skill uses center: true with section-level text alignment.
Viewport Unit Escalation
Using vw units for font sizes without upper bounds, leading to absurdly large text.
Fix: Always use clamp() with rem-based maximums: clamp(4rem, 10vw, 8rem).
Fixed Pixel Dimensions
Hardcoding pixel values for fonts and spacing that don't scale.
Fix: Use CSS variables with clamp() for responsive sizing.
Ignoring Slide Dimensions
Forgetting that RevealJS scales content to fit configured dimensions.
Fix: Design for 1920×1080. Test at multiple window sizes.
Background Color Inline Styles Using style="background: color" on sections instead of data-background-color. Fix: Use data-background-color="var(--bg-dark)" for RevealJS to handle properly.
Typography Utility Specificity Creating utility classes like .stat, .label, .lead without sufficient specificity. Problem: .reveal p has higher specificity (class + element) than .stat alone (just class), so typography utilities on <p> elements get overridden. Fix: Always prefix typography utilities with .reveal: use .reveal .stat, .reveal .label, .reveal .lead, etc. This ensures they override the base .reveal p styles.
Color Utility Specificity Creating color utilities like .text-on-dark without sufficient specificity. Problem: .reveal .lead (two classes) has higher specificity than .text-on-dark (one class), so class="lead text-on-dark" shows the lead's color instead of white. Fix: Always prefix color utilities with .reveal: use .reveal .text-on-dark, .reveal .text-muted, .reveal .highlight-1, etc.
Missing Margin Reset on Stats Stats and stat-hero elements inherit margin-bottom from .reveal p, creating unwanted gaps. Fix: Add margin-bottom: 0 to .reveal .stat and .reveal .stat-hero rules.
Section Background Override Adding background to .reveal .slides section blocks data-background-color from showing. Problem: RevealJS applies data-background-color behind the section element. If the section has an opaque background, the color is hidden behind a white/colored box. Fix: Never set background on .reveal .slides section. Set overall page background on .reveal only. Use data-background-color on individual sections for colored backgrounds.
Speaker notes are added inside an <aside> element with class notes:
<section>
<h2>Slide Headline</h2>
<div class="bar"></div>
<p class="lead">Visible content here</p>
<aside class="notes">
Speaker notes go here. These are visible in speaker view (press 'S')
but not shown to the audience.
Multiple paragraphs work fine.
</aside>
</section>
Access speaker view by pressing S during presentation. Opens a new window with current slide, next slide, notes, and timer.
When notes will be read by TTS or recorded as voiceover, structure them for spoken delivery:
Pacing markers:
<aside class="notes">
This is the opening statement. [PAUSE]
Now we transition to the key insight. [PAUSE]
The data speaks for itself—forty-three percent improvement.
</aside>
Pronunciation hints (for TTS or unfamiliar terms):
<aside class="notes">
The API uses OAuth (OH-auth) for authentication.
Results show a 50% improvement in MTTR (mean time to recovery,
or "em-tee-tee-arr" if using the acronym).
</aside>
Emphasis markers (for recording, stripped for TTS):
<aside class="notes">
This is [EMPHASIS: critical] to understand before we proceed.
We saw not ten, not twenty, but [EMPHASIS: fifty] percent gains.
</aside>
Speaking pace reference:
Per-slide timing targets:
| Slide Type | Target Duration | Word Count (150 wpm) |
|---|---|---|
| Title | 15-30 sec | 40-75 words |
| Section Break | 10-20 sec | 25-50 words |
| Single Word/Phrase | 10-15 sec | 25-40 words |
| Hero Stat | 20-40 sec | 50-100 words |
| Standard Stat | 15-30 sec | 40-75 words |
| Assertion + Evidence | 45-90 sec | 110-225 words |
| Card Grid | 60-120 sec | 150-300 words |
| Timeline | 60-90 sec | 150-225 words |
| Closing | 30-60 sec | 75-150 words |
Total presentation timing: sum of slide durations, plus ~10% buffer for transitions.
When starting with a written speech and decomposing into slides:
Step 1: Identify assertion boundaries
Mark every place the speech makes a distinct claim or shifts topic. Each becomes a slide candidate.
[SLIDE] Our platform reduces development time significantly.
We measured teams before and after adoption. [SLIDE] The data
showed a 50% reduction in time-to-deployment. [SLIDE] But
speed isn't the only benefit...
Step 2: Classify each segment
For each marked segment, identify the slide type:
Step 3: Extract visual content
From each segment, pull out:
Step 4: Balance visual and spoken
The slide shows what's hard to say. The notes say what's hard to show.
| On Slide | In Notes |
|---|---|
| "Development time dropped 50%" | "When we measured twelve teams over six months, comparing their velocity before and after platform adoption, the results were consistent..." |
| [Bar chart showing reduction] | "Notice how the improvement was immediate—within the first sprint—and sustained over the full period." |
| Key data points | Context, caveats, methodology |
| Conclusions | Reasoning process |
When generating speaker notes for existing slides:
For each slide, answer:
Structure for each note:
<aside class="notes">
[TRANSITION: How this connects to previous slide]
[MAIN CONTENT: The spoken explanation, context, story]
[BRIDGE: Setup for what comes next]
</aside>
Example:
<section class="centered">
<p class="label">Key Metric</p>
<p class="stat text-accent-1">50%</p>
<p class="stat-label">reduction in development time</p>
<aside class="notes">
So what did we actually measure? [PAUSE]
We tracked twelve teams over six months—half using the platform,
half using their existing workflows. Same project types, same
skill levels.
The platform teams shipped in half the time. Not by cutting
corners—their defect rates actually improved. They shipped
faster AND better.
But speed is just one dimension. Let's look at what happened
to those prototypes that used to die in pilot purgatory...
</aside>
</section>
For live presentation (speaker view):
For TTS processing:
For video recording script:
Speaker notes work by default, but for the separate speaker view window:
Reveal.initialize({
// ... other config
// Optional: configure notes behavior
showNotes: false, // Don't show notes in main view (default)
// For speaker view keyboard shortcut
keyboard: {
83: function() { Reveal.toggleOverview(); } // 'S' key
}
});
To enable the separate speaker notes window with timer and preview, press S during presentation. This requires the presentation to be served over HTTP (not just opened as a local file) for the popup window to work in most browsers.
The Script Dump
Pasting entire paragraphs meant to be read verbatim, creating dependency on notes.
Fix: Notes should be prompts and context, not a teleprompter script (unless explicitly for TTS).
The Bare Minimum
Notes that just repeat what's on the slide: "Talk about the 50% reduction."
Fix: Notes add what's NOT on the slide—context, transitions, interpretation.
The Forgetter
No notes at all, assuming you'll remember.
Fix: At minimum, note the transition logic between slides and any stats you might misremember.
The Novelist
500 words of notes for a slide you'll show for 30 seconds.
Fix: Match note length to slide duration. See timing table above.
Before delivering the presentation:
--size-smallThis example shows a minimal presentation structure. For full presentations, use the complete CSS from themes/bold.md. This example uses a subset for brevity.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Project Update</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/reveal.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/theme/white.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@100;200;300;400;500;600;700;800&display=swap" rel="stylesheet">
<style>
:root {
--bg-primary: #ffffff;
--bg-secondary: #f5f5f7;
--bg-dark: #1a1a2e;
--text-primary: #1a1a1a;
--text-secondary: #4a4a4a;
--text-muted: #7a7a7a;
--text-on-dark: #ffffff;
--accent-1: #0066cc;
--accent-2: #00a86b;
--font-display: 'Space Grotesk', sans-serif;
--font-body: 'Inter', sans-serif;
--font-mono: 'JetBrains Mono', monospace;
--size-stat: clamp(4rem, 10vw, 8rem);
--size-h1: clamp(6rem, 8vw, 9rem);
--size-h2: clamp(4rem, 12vw, 7rem);
--size-body: clamp(1.25rem, 2vw, 2rem);
--size-body-lg: clamp(1.5rem, 2.5vw, 2.25rem);
--size-label: clamp(1.5rem, 2.5vw, 2.25rem);
--space-sm: 1rem;
--space-md: 2rem;
--bar-width: 120px;
--bar-height: 8px;
}
.reveal { font-family: var(--font-body); color: var(--text-primary); }
.reveal h1, .reveal h2 { font-family: var(--font-display); font-weight: 700; letter-spacing: -0.02em; line-height: 1.1; margin: 0 0 0.5em 0; }
.reveal h1 { font-size: var(--size-h1); }
.reveal h2 { font-size: var(--size-h2); }
.reveal p { font-size: var(--size-body); line-height: 1.5; margin: 0 0 1em 0; }
.reveal .slides section { text-align: left; padding: 60px; }
.reveal .slides section.centered { text-align: center; }
.reveal .label { font-family: var(--font-mono); font-size: var(--size-label); text-transform: uppercase; letter-spacing: 0.1em; color: var(--accent-1); }
.reveal .lead { font-size: var(--size-body-lg); color: var(--text-secondary); }
.bar { width: var(--bar-width); height: var(--bar-height); background: var(--accent-1); margin-bottom: var(--space-md); }
.centered .bar { margin-left: auto; margin-right: auto; }
.reveal .stat { font-family: var(--font-mono); font-size: var(--size-stat); font-weight: 700; line-height: 1; color: var(--accent-1); margin-bottom: 0; }
.reveal .stat-label { font-size: var(--size-body-lg); color: var(--text-secondary); margin-top: var(--space-sm); }
.text-on-dark { color: var(--text-on-dark); }
</style>
</head>
<body>
<div class="reveal">
<div class="slides">
<!-- Title -->
<section class="centered">
<p class="label">Q3 Update</p>
<h1>Project Alpha</h1>
<div class="bar"></div>
<p class="lead">Engineering Progress Report</p>
<aside class="notes">
Good morning everyone. Today I'll walk you through where we stand
on Project Alpha as we close out Q3.
We've got good news to share, and a clear path to our October
target. Let's start with the results.
</aside>
</section>
<!-- Section Break -->
<section class="centered" data-background-color="#1a1a2e">
<h1 class="text-on-dark">Results</h1>
<aside class="notes">
[PAUSE for transition]
So—where do we actually stand?
</aside>
</section>
<!-- Stat -->
<section class="centered">
<p class="label">Key Metric</p>
<p class="stat">73%</p>
<p class="stat-label">milestone completion rate</p>
<aside class="notes">
Seventy-three percent of our planned milestones are complete.
That's ahead of where we projected in the Q2 review.
More importantly, the remaining twenty-seven percent are all
in active development—no blockers, no unknowns.
</aside>
</section>
<!-- Content -->
<section>
<h2>On track for October launch</h2>
<div class="bar"></div>
<p class="lead">Core features complete. Final testing phase begins next week.</p>
<aside class="notes">
What does this mean for the timeline? We're green for October.
Core features locked last Friday. The team is now focused
entirely on hardening—edge cases, performance tuning, and
the integration test suite.
Testing phase kicks off Monday. We'll have preliminary
results by end of next week.
</aside>
</section>
<!-- Closing -->
<section class="centered" data-background-color="#1a1a2e">
<h1 class="text-on-dark">Questions?</h1>
<div class="bar" style="background: var(--accent-2);"></div>
<p class="text-on-dark">team@example.com</p>
<aside class="notes">
That's the summary. Happy to dig into any area—timeline,
technical details, resource allocation.
What questions do you have?
[WAIT FOR QUESTIONS]
If anything comes up later, reach out to the team alias.
</aside>
</section>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/4.6.1/reveal.min.js"></script>
<script>
Reveal.initialize({
hash: true,
center: true,
transition: 'fade',
transitionSpeed: 'fast',
width: 1920,
height: 1080,
margin: 0.08
});
</script>
</body>
</html>
To create a custom theme:
themes/bold.md to a new file (e.g., themes/corporate.md):root {
/* Corporate theme example */
--bg-primary: #ffffff;
--bg-dark: #003B5C;
--accent-1: #00A3E0;
--accent-2: #78BE20;
--accent-3: #D45D00;
--font-display: 'Libre Franklin', sans-serif;
}
3. Add your theme to the Available Themes table in Part 2.3 4. Reference your theme when generating presentations
Theme files should include all CSS variables and typography rules needed for a complete presentation.
Weekly Installs
83
Repository
GitHub Stars
40
First Seen
Feb 16, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
codex77
opencode77
gemini-cli76
github-copilot75
cursor75
amp74
通过 LiteLLM 代理让 Claude Code 对接 GitHub Copilot 运行 | 高级变通方案指南
44,900 周安装
bar-accent-2