# 场景帧契约(frame-contract)
一个场景 = 一个自包含 HTML 文件 `frames/.html`,1920×1080,GSAP 时间轴驱动。
渲染器逐帧 `tl.pause(t, false)` 确定性截图 —— 与实时录制的根本区别:**任何「依赖墙钟」的东西都会失控**。
> **画面从哪来?** 先看 **`references/style-catalog.md`** —— html-video 的 23 个模板风格
> (8 个类别,含每种画布/字体/时间轴/配色规范)。改编三步法与挑风格建议见
> **`references/template-guide.md`**。从零设计画面是最后选项,不是第一选项。
模板:`assets/frame-template.html`(复制后改内容,契约注释在文件头)。
## 八条硬性契约
| # | 契约 | 违反后果 |
|---|------|----------|
| 1 | 画布 1920×1080(或 project.json 声明的尺寸),系统字体栈 | 渲染视口即画布 |
| 2 | 绝不引外部字体/Google Fonts(渲染器 5s 字体硬顶) | 整帧退化或首帧字体错 |
| 3 | 颜色全部取 `../theme.css` 的 CSS 变量,禁止字面量 | 换主题 = 半换皮 |
| 4 | 动画只用 GSAP:`var tl = gsap.timeline({paused:true}); window.__tl = tl;` | 渲染器找不到时间轴 → 报错 |
| 5 | 节拍用 `B('块文本')` 对齐吐字 | 画面与配音两张皮 |
| 6 | 底部 80–170px 是字幕带,内容收在 `bottom ≥ 170px` | 字幕压字,两边都读不清 |
| 7 | 每帧一个视觉焦点:主角 ≥170px 或大字 ≥96px 带 accent 柔光;配角不发光;文字 ≥22px | QC 退回 |
| 8 | GSAP `