Files
MohZhuang 66b61002f2 chore: prepare html-explainer v1.2.2 for public release
First public release of the html-explainer skill: deterministic HTML-to-MP4 explainer video pipeline for AI coding agents.

Additions since v1.2.1:

- scripts/lint_frames.py: pre-render audit of the eight frame-contract rules
- scripts/peek_frame.mjs: single-scene screenshot preview (seconds, not minutes)
- scripts/check_integrity.py: version/catalog/count consistency + stray-CDN scan
- Bilingual README (README.md Chinese default, README.en.md English)
- LICENSE (MIT), THIRD_PARTY_NOTICES.md, licenses/Apache-2.0.txt
- CHANGELOG.md, CONTRIBUTING.md, .gitignore, .gitattributes
- GitHub CI workflow and issue/PR templates

Fixes and docs:

- document lint_frames.py and peek_frame.mjs, previously absent from the file table
- add the lint stage to the pipeline order
- remove references to private client projects so the skill can ship publicly
- record the full upstream attribution chain for the style catalog
- package_skill.py now excludes repo-hygiene files and keeps licence files
2026-09-21 12:46:23 +08:00

148 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 封面指南(cover-guide)
成片出来后**必须同时出两张封面**。这不是可选步骤——封面决定点击率,而成片
只决定完播率;一张被切掉半个钩子的封面会让整片白做。
## 一、为什么是「两张独立排版」而不是「一张裁两版」
成片画布 1920×1080。平台上主页栅格按 **3:4** 裁:
| 从 16:9 裁 3:4 的算法 | 结果 |
|---|---|
| `h=1080` → `w=810` | 丢掉 **1110px = 57.8%** 的画面宽度 |
| 钩子如果横跨全宽(大字常常如此) | **必被切**,只留中间一截 |
所以「兼容 3:4 的版本」定义是:**同一套视觉基因(配色/幕底/主视觉/钩子文案),
为 3:4 画幅重新排一次版**。两份是姊妹图,不是母子图。
```
frames/cover_169.html 1920×1080 → out/cover_169.png 抖音主封面(信息流/播放页)
frames/cover_34.html 1440×1080 → out/cover_34.png 主页栅格兼容(防切字)
```
## 二、两张封面各自的排版纪律
### A. 1920×1080(抖音主封面)
| 项 | 规格 |
|---|---|
| 钩子字号 | **≥96px**(建议 110–130px),全画面最大最亮 |
| 主体视觉 | 偏左或偏右,**不要居中**——信息流两侧会被 UI 压住 |
| 安全边距 | 四边 ≥96px;关键元素集中在**中间 80% 区域** |
| 悖论视觉 | 放右侧时数字可到 140–160px |
| 底部 | 可放角标/栏目名(16:9 版底部不会被裁成方图),但仍留 ≥96px |
### B. 1440×1080(兼容 3:4)
这是**真正的 3:4**(1440:1080 = 4:3,视觉上等价 3:4 的宽高比),不是裁出来的。
| 项 | 规格 |
|---|---|
| 钩子字号 | **120–150px** —— 画幅窄了,字必须更大才够冲击 |
| 布局 | **上中下三段式**:视觉在上 55%、钩子在下 45%,或反之 |
| 左右边距 | ≥110px(窄画幅比例上边距要更大) |
| 悖论视觉 | 改成**竖排堆叠**(16:9 是左右并置)——这是"重排"的核心动作 |
| 禁止 | 横跨全宽的细长元素(会被裁成断线);贴边文字 |
### 重排对照(同一份内容,两种摆法)
| 元素 | 16:9 版 | 3:4 版 |
|---|---|---|
| 悖论视觉 | 右侧,左右并置 | 上方,竖排堆叠 |
| 钩子 | 左下,两行 | 下方,三行 |
| 角标 | 左上 | 顶部居中或省略 |
| 主视觉字号 | 数字 150px | 数字 120px(画幅窄,缩一档) |
| 钩子字号 | 118px | 138px(放大,抢占视觉) |
## 三、封面三要素(缺一返工)
### A. 大字钩子
一句话让人停下。**必须含反差/悬念**,验证方法:把这句单独发出去,会不会有人点?
| 好钩子 | 坏钩子 |
|---|---|
| 同一件事,为什么两拨人的感受完全相反 | 关于 X 的几个事实 |
| 涨了 38%,他们却在退出 | XX 行业分析 |
| 这条规则,让所有人都在做同一件蠢事 | 今天聊聊 XX |
字号 ≥96px(3:4 版 ≥120px),关键词用 `<em>` + accent 色 + 柔光。
### B. 核心悖论视觉
画面主体本身要**在讲一个矛盾**——不是装饰图形。可选形态:
- **双数对照**:一升一降的两个数字(见模板 `.paradox`),最直接
- **分裂线**:一道斜切/裂缝把画面分成两半,两侧不同色
- **撞色块**:accent 与 signal 两个色块相互挤压/重叠
- **一明一暗**:主体一半在光里一半在暗处
**禁止**:中性几何装饰、无意义的曲线、跟内容无关的图标。
### C. 信息余量
平台四边会再裁一点(各平台 2–5% 不等)。
- 钩子距边 ≥96px(3:4 版 ≥110px)
- 不要有贴边文字、贴边细线
- 16:9 版的关键信息集中在中间 80%
## 四、尺寸与倍率
| 规格 | CSS 画布 | 实际输出像素 |
|---|---|---|
| `169` | 1920×1080 | **3840×2160**(`--scale 2` 默认,2 倍清晰度) |
| `34` | 1440×1080 | **2880×2160** |
2 倍是为了应付平台压缩和高分屏;字节数约 1–3MB,上传无压力。
要 1 倍原尺寸用 `--scale 1`。
## 五、用法
```bash
# ① 复制模板,做两份(改尺寸 + 重排版式 + 填真实钩子)
cp <skill>/assets/cover-template.html <项目>/frames/cover_169.html
cp <skill>/assets/cover-template.html <项目>/frames/cover_34.html
# ② 渲染(默认 seek 到时间轴末尾取完整态)
node <skill>/scripts/cover_build.mjs <项目>
# 常用变体
node <skill>/scripts/cover_build.mjs . --at 0.8 # 取入场动画中间态(更有张力)
node <skill>/scripts/cover_build.mjs . --only 169 # 只出 16:9
node <skill>/scripts/cover_build.mjs . --jpg # JPEG(体积小,平台都收)
node <skill>/scripts/cover_build.mjs . --scale 1 # 不要 2 倍
```
产出:`out/cover_169.png`、`out/cover_34.png`、`out/cover_report.md`
## 六、上传策略
| 场景 | 用哪张 |
|---|---|
| 抖音信息流 / 播放页主封面 | `cover_169.png`(选「横版封面」) |
| 抖音个人主页栅格 | `cover_34.png`(选「竖版封面」) |
| 平台只允许一张 | **用 `cover_34.png`** —— 多数主页栅格按 3:4 裁,16:9 会被切两侧 |
| 小红书 / 视频号 | 视平台;容器通常也接受 3:4,优先 `cover_34` |
**封面文字必须与视频首帧钩子一致**(或至少同义)——观众点进来看到的是同一个承诺,
不一致会立刻跳出。
## 七、自检清单(上传前逐条过)
> **先跑终态测量,再逐条肉眼过。** 封面排版验收**必须在时间轴终态下做**
> (`__MG_RENDER__=true` + `tl.pause(tl.duration(), false)`),否则量到的是
> 入场动画起始值,边距/行数全错(lessons #30)。可照 `scripts/lint_frames.py`
> 的思路自写一个十余行的测量器:行数 / 四边边距 / 元素重叠 / 钩子字号一次判完。
- [ ] 两张封面都出了,都是独立排版(不是裁切关系)
- [ ] 钩子字号:16:9 版 ≥96px、3:4 版 ≥120px
- [ ] 钩子在**任何画幅下都不被切**(四边留 ≥96px / ≥110px)
- [ ] 钩子每行 ≤ 上限(16:9 ≤7 字、3:4 ≤5 字);用「行宽 ≈ 字数×字号×(1+ls) ≤ 容器宽」反算,防孤字断行
- [ ] 悖论视觉是"真矛盾"(两个对数/一明一暗/分裂线),不是装饰
- [ ] 一份封面只有一个视觉焦点(大字钩子是最大的那个)
- [ ] 配色全部来自 `theme.css`(与成片同一主题,不串色)
- [ ] 没有贴边文字、没有横跨全宽的细线
- [ ] 封面文字 = 视频首帧钩子(同义)
- [ ] 3:4 版的数字/标签已按窄画幅缩一档、钩子放大一档