# 大纲报告的设计约定

报告由 `scripts/novel-outline.mjs render --html` 生成，样式全部内联在 `renderHtml()` 里。**改样式只改那一处。**

## 它是什么

一份**业内评审用的单页报告**：读者拿它拍板砍不砍、排产备不备。页宽 1600，全部平铺可 Cmd+F，没有侧栏、没有折叠。视觉语言与 novel-characters 同一套：冷灰印张 + 铁锈红印记。

## 区块顺序（先交付后存档）

```
页眉        书名 · 参数行 · 质量门徽章（13/13）· 导出 JSON
KPI 带      六张统计卡：总集数 / 爽点 / 角色分档 / 主场景 / 生成难点 / 改编幅度
（病灶横幅） 质量门有未过项时才出现，列出每一条
01 爽点节奏  图/表 tab：默认时间轴，切到明细表看铺垫与兑现
02 分集概览  三列卡片（430px 起自适应），默认只显示前三集：
             底部渐隐 + 「▾ 展开全部 N 集」，点一下全展开不再收起；≤3 集不收
03 场景概览  整行，卡片多列网格（380px 起自适应）
04 关键决策  拍板过的三件事：砍了哪条线 / 合了哪些人 / 大爆点落在第几集
05 每集调度矩阵  整行——60 集 × 25 角色的矩阵天然吃满宽
06 资产量折算
07 人物表
08 改编说明  一句话核心 + 保留/砍掉/合并/风险四张表（evidence 用「」引文样式）
09 质量门    完整 ✓/✗ 清单
```

改编说明放最后是有意的：它是「为什么这么改」的存档，不是每次都要读的交付。

**屏幕上收，纸上全展开**：tab 只是屏幕上的收纳，`@media print` 里两个面板都打印、分集全部展开、tab 条和展开按钮隐藏。改折叠相关样式时 print 段要一起改，自测有断言盯着。

## 图表口径（按 dataviz 方法定的）

全部单色系，**配色跑过验证器**：大爆点 `#8a3324`、常规爽点 `#c56a4e`，在面板底色上六项检查全过。全部内联 SVG/CSS，**不引任何库**。

### 关键决策（04）

三栏卡。砍线/合人清单来自 `adaptation.cut/merge`；**角色位统计、主角组名单、大爆点列表是算出来的**。可选的 `adaptation.cutNote / mergeNote` 是模型写的结论句（"这意味着……"），铁锈红底。大爆点列表首末带「首个／终局」标记。

### 爽点节奏（01，图/表 tab）

剧情时间轴：一条地平线，爽点是轴上的节点（大爆点 r9 实心、常规 r6，带 2px 面板色描边圈），节点上标类型 + 铺垫摘句，**标签上下交替防撞**，同一集多个爽点时翻到对面。**空档直接标在轴上**（「— n 集空档 —」），超过 `maxBeatGap` 的空档变铁锈红——违规在图上自己喊。超过 20 集按每行 20 集折行。

⚠ **集刻度必须最后绘制**——它带面板色底衬（`paint-order:stroke`），压在节点竖线上仍可读；先画的话会被竖线盖住。

### 每集调度矩阵（05）

角色 + 场景同一张网格，**一列竖着读就是那一集的需求单**（要谁出场、在哪拍）。角色格深锈红、场景格浅锈色，分带行「场　景」隔开。一次性场景在合计列带 ⚠，复用方案落脚注。格宽随集数收（≤20 集 26px / ≤40 集 20px / ≤60 集 16px / 更多 12px），超宽横向滚动。

⚠ **矩阵和场景概览必须各占整行，不要并排。** 并排在小样例上好看，真实量级（60 集 × 25 角色 + 12 场景）下矩阵吃掉全部宽度、场景卡被挤成一条缝。另外 grid 里放内容超宽的滚动容器时列宽要用 `minmax(0,1fr)`——grid item 默认 `min-width:auto`，会被内容撑爆。

### 场景概览（03）

每场景一张卡：右上**浅灰剧集编号**（连续合写 `1–6`、离散 `1 · 6`、太散只报数量，见 `fmtEps`）、出现集微条、**承载爽点**（算出来的：爽点落点 × 场景出现集）、主场景列出场角色 / 一次性场景列复用方案（铁锈红）。**不用占比环**——比例不驱动决策，落在哪几集才驱动。

### 资产量折算（06）

纯表格。角色三档 + 场景环境 + 生成难点，全部由 `computeAssets` 折算，模型一个字不写。

## 质量门

页眉徽章常驻（通过绿、未过红）；有未过项时 KPI 带下方弹**病灶横幅**逐条列出；文末 09 是完整清单。✓/✗ 由 `gateReport()` 渲染时算好烘进页面，**不是模型自评**。未过不阻止渲染——体检模式要的就是把病灶摆出来。

## 界面文案

全部收在 `T` 表里，**别把字符串散进模板**。中文文案不用单字词（保留/砍掉/合并，不写保/砍/合）。v1 只有中文；要加语言时把 `T` 换成按 lang 取值的表。

## 导出 JSON

页眉按钮，下载的**就是 outline.json 原样**——内嵌在 `<script type="application/json" id="outline-data">`。两个坑：JSON 里的 `<` 要转成 `<`（防 `</script` 截断）；`revokeObjectURL` 要延后调（防 Safari 抢跑存出空文件）。

## 质量底线

- 不引任何外部资源，离线双击能开，自测正反两面盯着
- 大纲数据是模型生成的，一律 `esc()` 转义后拼进 HTML
- `@media print`：隐藏导出按钮、卡片不跨页断
- `prefers-reduced-motion` 关动效
