agentcss 0.0.0-stage → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/01-tokens/README.md +236 -0
  2. package/01-tokens/behavior/dismissable.js +132 -0
  3. package/01-tokens/behavior/emit.js +76 -0
  4. package/01-tokens/behavior/focus-return.js +81 -0
  5. package/01-tokens/behavior/roving.js +152 -0
  6. package/01-tokens/behavior/typeahead.js +124 -0
  7. package/01-tokens/focus-ring-demo.html +133 -0
  8. package/01-tokens/focus-ring.css +102 -0
  9. package/01-tokens/page.css +244 -0
  10. package/01-tokens/polyfill.js +116 -0
  11. package/01-tokens/responsive-demo.html +171 -0
  12. package/01-tokens/scrollbar-demo.html +194 -0
  13. package/01-tokens/scrollbar.css +179 -0
  14. package/01-tokens/theme-toggle.js +103 -0
  15. package/01-tokens/tokens.css +972 -0
  16. package/01-tokens/typography.css +156 -0
  17. package/02-primitives/badge/README.md +71 -0
  18. package/02-primitives/badge/badge.css +141 -0
  19. package/02-primitives/badge/demo.html +101 -0
  20. package/02-primitives/button/README.md +99 -0
  21. package/02-primitives/button/button.css +353 -0
  22. package/02-primitives/button/demo.html +200 -0
  23. package/02-primitives/card/README.md +145 -0
  24. package/02-primitives/card/card.css +246 -0
  25. package/02-primitives/card/demo.html +170 -0
  26. package/02-primitives/choice/README.md +161 -0
  27. package/02-primitives/choice/choice.css +395 -0
  28. package/02-primitives/choice/demo.html +277 -0
  29. package/02-primitives/combobox/README.md +79 -0
  30. package/02-primitives/combobox/combobox.css +223 -0
  31. package/02-primitives/combobox/combobox.js +485 -0
  32. package/02-primitives/combobox/demo.html +109 -0
  33. package/02-primitives/date-range/README.md +100 -0
  34. package/02-primitives/date-range/date-range.css +206 -0
  35. package/02-primitives/date-range/date-range.js +301 -0
  36. package/02-primitives/date-range/demo.html +104 -0
  37. package/02-primitives/input/README.md +170 -0
  38. package/02-primitives/input/demo.html +246 -0
  39. package/02-primitives/input/input.css +239 -0
  40. package/02-primitives/popover/README.md +80 -0
  41. package/02-primitives/popover/demo.html +150 -0
  42. package/02-primitives/popover/popover.css +187 -0
  43. package/02-primitives/popover/popover.js +331 -0
  44. package/02-primitives/progress/README.md +82 -0
  45. package/02-primitives/progress/demo.html +154 -0
  46. package/02-primitives/progress/progress.css +172 -0
  47. package/02-primitives/select/README.md +95 -0
  48. package/02-primitives/select/demo.html +121 -0
  49. package/02-primitives/select/select.css +151 -0
  50. package/02-primitives/select/select.js +549 -0
  51. package/02-primitives/separator/README.md +63 -0
  52. package/02-primitives/separator/demo.html +84 -0
  53. package/02-primitives/separator/separator.css +73 -0
  54. package/02-primitives/skeleton/README.md +69 -0
  55. package/02-primitives/skeleton/demo.html +110 -0
  56. package/02-primitives/skeleton/skeleton.css +96 -0
  57. package/02-primitives/switch/README.md +65 -0
  58. package/02-primitives/switch/demo.html +115 -0
  59. package/02-primitives/switch/switch.css +370 -0
  60. package/03-patterns/accordion/README.md +121 -0
  61. package/03-patterns/accordion/accordion.css +453 -0
  62. package/03-patterns/accordion/accordion.js +369 -0
  63. package/03-patterns/accordion/demo.html +223 -0
  64. package/03-patterns/content/README.md +103 -0
  65. package/03-patterns/content/content.css +286 -0
  66. package/03-patterns/content/demo.html +88 -0
  67. package/03-patterns/drawer/README.md +79 -0
  68. package/03-patterns/drawer/demo.html +101 -0
  69. package/03-patterns/drawer/drawer.css +129 -0
  70. package/03-patterns/drawer/drawer.js +258 -0
  71. package/03-patterns/dropdown/README.md +78 -0
  72. package/03-patterns/dropdown/demo.html +101 -0
  73. package/03-patterns/dropdown/dropdown.css +135 -0
  74. package/03-patterns/dropdown/dropdown.js +451 -0
  75. package/03-patterns/form-validation/README.md +147 -0
  76. package/03-patterns/form-validation/demo.html +280 -0
  77. package/03-patterns/form-validation/form-validation.css +263 -0
  78. package/03-patterns/list/README.md +150 -0
  79. package/03-patterns/list/demo.html +225 -0
  80. package/03-patterns/list/flip.js +201 -0
  81. package/03-patterns/list/list.css +162 -0
  82. package/03-patterns/nav/README.md +225 -0
  83. package/03-patterns/nav/demo.html +131 -0
  84. package/03-patterns/nav/nav.css +314 -0
  85. package/03-patterns/nav/nav.js +430 -0
  86. package/03-patterns/nav/toc.js +111 -0
  87. package/03-patterns/overlay/README.md +196 -0
  88. package/03-patterns/overlay/demo.html +241 -0
  89. package/03-patterns/overlay/overlay.css +319 -0
  90. package/03-patterns/overlay/overlay.js +563 -0
  91. package/03-patterns/pagination/README.md +114 -0
  92. package/03-patterns/pagination/demo.html +165 -0
  93. package/03-patterns/pagination/pagination.css +195 -0
  94. package/03-patterns/pagination/pagination.js +395 -0
  95. package/03-patterns/reveal/README.md +91 -0
  96. package/03-patterns/reveal/demo.html +106 -0
  97. package/03-patterns/reveal/reveal.css +93 -0
  98. package/03-patterns/reveal/reveal.js +172 -0
  99. package/03-patterns/states/README.md +141 -0
  100. package/03-patterns/states/demo.html +240 -0
  101. package/03-patterns/states/states.css +252 -0
  102. package/03-patterns/tabs/README.md +84 -0
  103. package/03-patterns/tabs/demo.html +139 -0
  104. package/03-patterns/tabs/tabs.css +172 -0
  105. package/03-patterns/tabs/tabs.js +307 -0
  106. package/03-patterns/tooltip/README.md +96 -0
  107. package/03-patterns/tooltip/demo.html +78 -0
  108. package/03-patterns/tooltip/tooltip.css +89 -0
  109. package/03-patterns/tooltip/tooltip.js +288 -0
  110. package/03-patterns/tree/README.md +94 -0
  111. package/03-patterns/tree/demo.html +138 -0
  112. package/03-patterns/tree/tree.css +113 -0
  113. package/03-patterns/tree/tree.js +456 -0
  114. package/04-recipes/analysis-report/README.md +80 -0
  115. package/04-recipes/analysis-report/analysis-report.css +187 -0
  116. package/04-recipes/analysis-report/demo.html +274 -0
  117. package/04-recipes/data-showcase/README.md +45 -0
  118. package/04-recipes/data-showcase/demo.html +247 -0
  119. package/04-recipes/detail-page/README.md +93 -0
  120. package/04-recipes/detail-page/demo.html +55 -0
  121. package/04-recipes/detail-page/detail-page.css +190 -0
  122. package/04-recipes/detail-page/full.html +60 -0
  123. package/04-recipes/detail-page/null.html +60 -0
  124. package/04-recipes/detail-page/partial.html +60 -0
  125. package/04-recipes/detail-page/verify-skeleton.py +19 -0
  126. package/04-recipes/longform/README.md +93 -0
  127. package/04-recipes/longform/agc-memory.svg +4 -0
  128. package/04-recipes/longform/content.html +610 -0
  129. package/04-recipes/longform/content.md +51 -0
  130. package/04-recipes/longform/longform.html +627 -0
  131. package/04-recipes/report/README.md +176 -0
  132. package/04-recipes/report/demo.html +355 -0
  133. package/04-recipes/report/report.css +364 -0
  134. package/04-recipes/table/README.md +103 -0
  135. package/04-recipes/table/demo.html +455 -0
  136. package/04-recipes/table/table.css +372 -0
  137. package/04-recipes/tierA-tokens.css +189 -0
  138. package/09-assets/README.md +74 -0
  139. package/09-assets/bar/README.md +94 -0
  140. package/09-assets/bar/bar.css +166 -0
  141. package/09-assets/bar/bar.js +320 -0
  142. package/09-assets/bar/demo.html +176 -0
  143. package/09-assets/echarts-adapter/demo.html +192 -0
  144. package/09-assets/echarts-adapter/echarts-adapter.js +277 -0
  145. package/09-assets/model-viewer/README.md +155 -0
  146. package/09-assets/model-viewer/demo.html +105 -0
  147. package/09-assets/model-viewer/model-viewer.css +143 -0
  148. package/09-assets/model-viewer/model-viewer.js +423 -0
  149. package/09-assets/scientific-plot/README.md +94 -0
  150. package/09-assets/scientific-plot/demo.html +252 -0
  151. package/09-assets/scientific-plot/scientific-plot.css +141 -0
  152. package/09-assets/scientific-plot/scientific-plot.js +610 -0
  153. package/09-assets/sparkline/README.md +153 -0
  154. package/09-assets/sparkline/demo.html +163 -0
  155. package/09-assets/sparkline/sparkline.css +158 -0
  156. package/09-assets/sparkline/sparkline.js +508 -0
  157. package/API.md +332 -0
  158. package/CHANGELOG.md +3116 -0
  159. package/CODE_OF_CONDUCT.md +64 -0
  160. package/CONTRIBUTING.md +89 -0
  161. package/ERRORS.md +1658 -0
  162. package/LICENSE +21 -0
  163. package/README.md +491 -2
  164. package/SECURITY.md +72 -0
  165. package/START-HERE.md +164 -0
  166. package/SUPPORT.md +109 -0
  167. package/adapters/presentation/README.md +113 -0
  168. package/adapters/presentation/check.js +101 -0
  169. package/adapters/presentation/deck.schema.json +74 -0
  170. package/adapters/presentation/to-doc.js +138 -0
  171. package/ai/START-HERE.md +104 -0
  172. package/ai/behaviors.json +380 -0
  173. package/ai/behaviors.schema.json +61 -0
  174. package/ai/capabilities.json +56 -0
  175. package/ai/cli.js +387 -0
  176. package/ai/components.json +1944 -0
  177. package/ai/components.meta.json +168 -0
  178. package/ai/components.schema.json +220 -0
  179. package/ai/contract.schema.json +147 -0
  180. package/ai/deprecations.json +55 -0
  181. package/ai/deprecations.schema.json +85 -0
  182. package/ai/motion-policy.json +22 -0
  183. package/ai/patch.js +323 -0
  184. package/ai/patch.schema.json +63 -0
  185. package/ai/profiles.json +92 -0
  186. package/ai/tokens.audience.json +55 -0
  187. package/ai/tokens.audience.schema.json +73 -0
  188. package/ai/tokens.json +762 -0
  189. package/ai/tokens.schema.json +58 -0
  190. package/ai/tokens.tree.json +752 -0
  191. package/ai/tokens.tree.schema.json +56 -0
  192. package/ai/validate.js +383 -0
  193. package/dist/01-tokens/behavior/dismissable.js +60 -0
  194. package/dist/01-tokens/behavior/emit.js +21 -0
  195. package/dist/01-tokens/behavior/focus-return.js +31 -0
  196. package/dist/01-tokens/behavior/roving.js +77 -0
  197. package/dist/01-tokens/behavior/typeahead.js +61 -0
  198. package/dist/01-tokens/focus-ring.css +1 -0
  199. package/dist/01-tokens/page.css +1 -0
  200. package/dist/01-tokens/polyfill.js +78 -0
  201. package/dist/01-tokens/scrollbar.css +1 -0
  202. package/dist/01-tokens/theme-toggle.js +61 -0
  203. package/dist/01-tokens/tokens.css +1 -0
  204. package/dist/01-tokens/typography.css +1 -0
  205. package/dist/02-primitives/badge/badge.css +1 -0
  206. package/dist/02-primitives/button/button.css +1 -0
  207. package/dist/02-primitives/card/card.css +1 -0
  208. package/dist/02-primitives/choice/choice.css +1 -0
  209. package/dist/02-primitives/combobox/combobox.css +1 -0
  210. package/dist/02-primitives/combobox/combobox.js +439 -0
  211. package/dist/02-primitives/date-range/date-range.css +1 -0
  212. package/dist/02-primitives/date-range/date-range.js +267 -0
  213. package/dist/02-primitives/input/input.css +1 -0
  214. package/dist/02-primitives/popover/popover.css +1 -0
  215. package/dist/02-primitives/popover/popover.js +257 -0
  216. package/dist/02-primitives/progress/progress.css +1 -0
  217. package/dist/02-primitives/select/select.css +1 -0
  218. package/dist/02-primitives/select/select.js +449 -0
  219. package/dist/02-primitives/separator/separator.css +1 -0
  220. package/dist/02-primitives/skeleton/skeleton.css +1 -0
  221. package/dist/02-primitives/switch/switch.css +1 -0
  222. package/dist/03-patterns/accordion/accordion.css +1 -0
  223. package/dist/03-patterns/accordion/accordion.js +219 -0
  224. package/dist/03-patterns/content/content.css +1 -0
  225. package/dist/03-patterns/drawer/drawer.css +1 -0
  226. package/dist/03-patterns/drawer/drawer.js +229 -0
  227. package/dist/03-patterns/dropdown/dropdown.css +1 -0
  228. package/dist/03-patterns/dropdown/dropdown.js +365 -0
  229. package/dist/03-patterns/form-validation/form-validation.css +1 -0
  230. package/dist/03-patterns/list/flip.js +117 -0
  231. package/dist/03-patterns/list/list.css +1 -0
  232. package/dist/03-patterns/nav/nav.css +1 -0
  233. package/dist/03-patterns/nav/nav.js +322 -0
  234. package/dist/03-patterns/nav/toc.js +76 -0
  235. package/dist/03-patterns/overlay/overlay.css +1 -0
  236. package/dist/03-patterns/overlay/overlay.js +398 -0
  237. package/dist/03-patterns/pagination/pagination.css +1 -0
  238. package/dist/03-patterns/pagination/pagination.js +273 -0
  239. package/dist/03-patterns/reveal/reveal.css +1 -0
  240. package/dist/03-patterns/reveal/reveal.js +138 -0
  241. package/dist/03-patterns/states/states.css +1 -0
  242. package/dist/03-patterns/tabs/tabs.css +1 -0
  243. package/dist/03-patterns/tabs/tabs.js +242 -0
  244. package/dist/03-patterns/tooltip/tooltip.css +1 -0
  245. package/dist/03-patterns/tooltip/tooltip.js +213 -0
  246. package/dist/03-patterns/tree/tree.css +1 -0
  247. package/dist/03-patterns/tree/tree.js +383 -0
  248. package/dist/04-recipes/analysis-report/analysis-report.css +1 -0
  249. package/dist/04-recipes/detail-page/detail-page.css +1 -0
  250. package/dist/04-recipes/report/report.css +1 -0
  251. package/dist/04-recipes/table/table.css +1 -0
  252. package/dist/04-recipes/tierA-tokens.css +1 -0
  253. package/dist/09-assets/bar/bar.css +1 -0
  254. package/dist/09-assets/bar/bar.js +222 -0
  255. package/dist/09-assets/echarts-adapter/echarts-adapter.js +185 -0
  256. package/dist/09-assets/model-viewer/model-viewer.css +1 -0
  257. package/dist/09-assets/model-viewer/model-viewer.js +320 -0
  258. package/dist/09-assets/scientific-plot/scientific-plot.css +1 -0
  259. package/dist/09-assets/scientific-plot/scientific-plot.js +568 -0
  260. package/dist/09-assets/sparkline/sparkline.css +1 -0
  261. package/dist/09-assets/sparkline/sparkline.js +265 -0
  262. package/dist/COSTS.md +56 -0
  263. package/docs/AI-CONTRACT.md +197 -0
  264. package/docs/BACKLOG.md +127 -0
  265. package/docs/BENCHMARK.md +252 -0
  266. package/docs/GUIDANCE.md +154 -0
  267. package/docs/INVARIANT.md +372 -0
  268. package/docs/LAYER-BASELINE.md +158 -0
  269. package/docs/RELEASING.md +275 -0
  270. package/docs/RFC-THEME-SCOPE.md +141 -0
  271. package/docs/ROADMAP.md +182 -0
  272. package/index.html +82 -0
  273. package/package.json +107 -4
  274. package/types/index.d.ts +310 -0
@@ -0,0 +1,176 @@
1
+ # report · 报告版式系统 v1
2
+
3
+ 给「有结论、有数据、有出处」的材料用的一套**排版约定**:实验报告、技术评估、
4
+ 产业跟踪、金融研究。它解决的不是"怎么把字变好看",而是
5
+ **同一份内容在三种不同目的的阅读场景下,各自该长什么样、又各自放弃了什么**。
6
+
7
+ ## 它不是什么(边界先划清,免得当万能模板用)
8
+
9
+ | 不是 | 说明 |
10
+ |---|---|
11
+ | 不是 CMS / 出版引擎 | 没有内容管理、没有模板继承、没有构建步骤 |
12
+ | 不是「喂 Markdown 出 PDF」 | 不接受任何输入格式,只有 CSS |
13
+ | **不做分页 PDF / 印刷分页** | 页边距、页眉页脚、页码、跨页控制**一律没有**,也不假装有。见下「明确不做」 |
14
+
15
+ ## 文件
16
+
17
+ | 文件 | 说明 |
18
+ |---|---|
19
+ | `report.css` | 全部版式(共享基础 + 科研技术 profile + 三套版式) |
20
+ | `demo.html` | 三套版式各一个完整实例,可直接打开 |
21
+ | `README.md` | 本文件 |
22
+
23
+ ## 依赖
24
+
25
+ **零新增运行时依赖。** 只引用库内已有资产:
26
+
27
+ ```
28
+ 01-tokens/tokens.css ← 设计令牌
29
+ 01-tokens/typography.css ← 排版基线
30
+ 01-tokens/page.css ← 页面骨架(.page / .wrap)
31
+ 04-recipes/table/table.css ← 数据表格(复用,不另造)
32
+ 09-assets/scientific-plot/… ← 图表(复用,不另造)
33
+ report.css ← 本系统
34
+ ```
35
+
36
+ ## 一 · 共享基础:六个可变量
37
+
38
+ 整套系统的行为由**六个变量**决定。换版式=改这六个,不改选择器。
39
+
40
+ | 变量 | 管什么 | 默认 |
41
+ |---|---|---|
42
+ | `--rep-measure` | 正文行长(最关键的一个数) | `--measure-prose` |
43
+ | `--rep-body-fs` | 正文字号 | `--fs-base` |
44
+ | `--rep-title-fs` | 文章标题字号 | `--fs-2xl` |
45
+ | `--rep-lead-fs` | 导语字号 | `--fs-lg` |
46
+ | `--rep-body-lh` | 行距 | `--lh-base` |
47
+ | `--rep-sec-num` | 章节编号前缀(`''` = 不编号) | `''` |
48
+
49
+ 另外定义**六种字体角色**,不多不少:
50
+
51
+ `.rep__kicker`(眉题)· `.rep__meta`(作者/日期/版本)· `.rep__cap`(图表说明)·
52
+ `.rep__source`(来源脚注)· `.rep__note`(编者注)· `.rep__risk`(风险披露)
53
+
54
+ > ⭐ 为什么钉死六种:报告里每多一种"自创角色",读者的解读负担就多一分。
55
+ > 发现自己在写第七种时,应该回头用**结构**(列表、表格、引用)而不是字号表达。
56
+
57
+ ### 标记骨架
58
+
59
+ ```html
60
+ <article class="rep rep--technical"> <!-- 或 rep--magazine / rep--finance -->
61
+ <header>
62
+ <p class="rep__kicker">栏目</p>
63
+ <h2 class="rep__title">标题</h2> <!-- 🔴 必须是 h2 -->
64
+ <p class="rep__standfirst">导语</p>
65
+ <ul class="rep__meta"><li>作者</li><li>日期</li></ul>
66
+ </header>
67
+
68
+ <div class="rep__grid"> <!-- 正文 + 边注,窄屏自动堆叠 -->
69
+ <div class="rep__body">
70
+ <section class="rep__sec">
71
+ <h3>小节</h3> <!-- 🔴 用 h3,不是 h4 -->
72
+ <p>…</p>
73
+ <figure class="rep__fig">
74
+ <div id="chart"></div>
75
+ <figcaption class="rep__cap">图说</figcaption>
76
+ </figure>
77
+ </section>
78
+ </div>
79
+ <aside class="rep__aside">短提醒 / 次要读数</aside>
80
+ </div>
81
+ </article>
82
+ ```
83
+
84
+ **只用两级标题**:`h2` 是文章标题,`h3` 是小节。出现第四级通常意味着该拆的是**文档**
85
+ 而不是再给一级字号 —— 所以 CSS 里刻意没有 `h4` 的规则,没定义就是没定义。
86
+
87
+ ## 二 · 三种版式的取舍
88
+
89
+ | | `rep--magazine` | `rep--technical` | `rep--finance` |
90
+ |---|---|---|---|
91
+ | **给谁看** | 通读一遍的人 | 要逐条核对的人 | 要快速比数字的人 |
92
+ | 正文行长 | 42em(最宽) | 34em | 30em |
93
+ | 正文字号 | 基准 | 基准 | 小一档(`--fs-sm`) |
94
+ | 行距 | 基准 | **最松**(`--lh-loose`) | 基准 |
95
+ | 图/表编号 | 不要 | **自动编号**(fig / tab 两路) | 不要 |
96
+ | 章节编号 | 不要 | 可选(默认开) | 不要 |
97
+ | 必有件 | 引语块 / 出血宽图 | 来源脚注 / 方法写明 | 关键数字条 / 风险披露 |
98
+ | **它放弃了** | 审计级追溯(没编号就引用不了"第几图") | 快速通读(窄行长 + 松行距,读得慢) | 长论证(超过两屏的推理会被跳过) |
99
+
100
+ 三种取舍都是**真取舍**,不是文案差异 —— 每一条都有门禁判据盯着:
101
+
102
+ - 正文行长按**各版自身字号**换算成 em 后必须严格递减(42 > 34 > 30)
103
+ - 文章标题字号必须真的随 profile 变化(金融版明显小于另两版)
104
+ - 金融版正文字号必须小于另两版;科研版行距比必须最松
105
+ - 编号必须是"该编号的有、不该编号的没有"(technical 的正文小节有、文章标题与边注标题没有)
106
+
107
+ ### 编号:为什么用 CSS counter
108
+
109
+ ```css
110
+ .rep--technical .rep__sec > h3::before { content: counter(rep-sec) ' · '; }
111
+ .rep--technical .rep__cap::before { content: '图 ' counter(rep-fig) ' · '; }
112
+ .rep--technical .rep__cap--table::before { content: '表 ' counter(rep-tab) ' · '; }
113
+ ```
114
+
115
+ 写死编号会在改稿后全部错位;counter 由 CSS 自己维护。
116
+ **图与表走两路独立计数** —— "图 3"和"表 3"不是同一个东西。
117
+ 表格说明加 `rep__cap--table` 即可;同一个标记在 financial 版里不出编号,
118
+ 因为那是 **profile 说了算,不是标记说了算**。
119
+
120
+ ## 三 · 与 `04-recipes/analysis-report` 的分工
121
+
122
+ | | `analysis-report` | `report`(本系统) |
123
+ |---|---|---|
124
+ | 是什么 | 一份**具体实例**(一种固定版式的完整页面) | 一套**版式系统**(共享基础 + 三种可选 profile) |
125
+ | 解决的问题 | 组合能力:正文 + 辅助栏 + 表格 + 图表怎么拼 | 取舍:同内容在三种阅读目的下各自长什么样 |
126
+ | 换版式 | 改 CSS | 只换 `rep--*` 一个类 |
127
+
128
+ **两者不互相替代。** 如果只需要一种固定版式,用 `analysis-report` 更省事;
129
+ 需要"同一批内容按不同目的重新排"时,用本系统。
130
+
131
+ ## 四 · 🔴 本轮明确不做
132
+
133
+ 1. **分页 PDF / 印刷分页**:`@page` 页边距、页眉页脚、页码、跨页不断行、孤行寡行控制
134
+ —— 全部不在本版范围内,它需要 `@page`、实物打样与 PDF 引擎验证。
135
+ CSS 里只有 `@media print` 的**最小保障**(隐藏边注、图表与表格不跨撕裂),
136
+ 那是"不更糟",**不是"能出版"**。
137
+ 门禁里有一条**反向判据**盯着这件事:`report.css` 一旦出现 `@page` 或
138
+ `break-after: page` 就报红 —— 谁偷偷做了一半,谁这条就红。
139
+ 2. **自动目录、脚注尾注、交叉引用、参考文献样式**:编号只做到"写第几就显示第几",
140
+ 再往上的引用维护("详见第 3 图"自动跟随)不支持。
141
+ 3. **Markdown / 文档输入、CMS、多语言排版(竖排、RTL)**:不是本系统的目标。
142
+
143
+ ## 五 · 已知限制(实测记录,不是"也许")
144
+
145
+ - **边注列只有 14em(252px)**:正文 + 边注共享库的标准页宽 832px,
146
+ 取库默认的 `--measure-aside`(32em=576px)会把正文压到 **220px ≈ 12em**(一行 12 字,读不了)。
147
+ ⇒ 就地收窄到 14em,正文恢复到 30em。**代价:边注装不下大图表** ——
148
+ 大图请放进正文流,不要塞进边注。
149
+ - **宽图 / 宽表要走 `--wide` 通道**:正文行长(`--rep-measure`)默认施加在所有内容块上,
150
+ 图也不例外 —— 一张 1800 宽的折线图被压到 420px 时,图里的刻度字会跟着缩到 6px。
151
+ 需要看清细节时给 `figure` 加 `rep__fig--wide`、给表格容器加 `rep__wide`:
152
+ ```html
153
+ <figure class="rep__fig rep__fig--wide">…</figure>
154
+ <div class="table rep__wide">…</div>
155
+ ```
156
+ 两者是**同一个开关**(`.rep__fig--wide, .rep__wide { max-width: none }`)。
157
+ ⚠️ 它只放宽到**正文列**为止,不越过边注 —— 越过边注是整页版式的事,不是一张图的事。
158
+ ⚠️ 0.11.2 之前这个类**是空的**:当时正文列整体被 `max-width` 压着,
159
+ 子元素再宽也越不过父容器。现在行长改施加在内容块上,通道才真的通。
160
+ - **边注折叠在 62rem** 以下:窄屏没有边注,只有正文流。
161
+ - **CSS counter 的具体数字无法被自动断言**:`::before` 的生成文字既不在 DOM 里,
162
+ 也不在无障碍树里(实测 `accessibility.snapshot()` 抓不到)。
163
+ 门禁能验证的是「规则命中 + 用对了哪一路计数器 + 生成框真的占了像素」,
164
+ **数字本身("图 1"里的 1)属于未验证项**,不拿绿色冒充。
165
+
166
+ ## 六 · 门禁
167
+
168
+ ```bash
169
+ node 05-audit/report-check.js # 单独跑
170
+ bash 05-audit/check-all.sh # 全量
171
+ ```
172
+
173
+ `report-check.js` 复用 `contract-kit.js`(通用 7 类判据)**加 17 条本系统专属判据**,
174
+ 全部读**计算值/几何**而不是 CSS 文本 —— 因为"写了 ≠ 生效"在本系统上翻过车:
175
+ `.rep h2 / .rep h3`(特异度 0,1,1)曾经压过 `.rep__title`(0,1,0),
176
+ 使 `--rep-title-fs` 静默失效、三套版式的标题被钉死在同一个字号。
@@ -0,0 +1,355 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <link rel="icon" href="data:,">
7
+ <title>report · 报告版式系统 v1 · frontend-lib</title>
8
+ <link rel="stylesheet" href="../../01-tokens/tokens.css">
9
+ <link rel="stylesheet" href="../../01-tokens/typography.css">
10
+ <link rel="stylesheet" href="../../01-tokens/page.css">
11
+ <link rel="stylesheet" href="../table/table.css">
12
+ <link rel="stylesheet" href="../../09-assets/scientific-plot/scientific-plot.css">
13
+ <link rel="stylesheet" href="report.css">
14
+ <!-- 本页不写内联 <style>:所有版式都来自 report.css。
15
+ 内联写成活的那一刻,它就不再是这个系统的一部分了。 -->
16
+ </head>
17
+ <body class="page">
18
+ <main class="wrap">
19
+
20
+ <h1>report · 报告版式系统 v1</h1>
21
+
22
+ <p class="note">
23
+ 三套版式共用一份<strong>基础</strong>(字体角色、正文行长、页面网格、间距层级、
24
+ 图表说明、来源脚注),各自再决定"行长多宽、字号多大、要不要编号、要不要风险披露"。
25
+ <br>🔴 这一版只对<strong>屏幕阅读</strong>负责。<strong>分页 PDF 与印刷不在本轮范围内</strong>
26
+ —— 见文末「本轮明确不做」。没有的东西写清楚,比默认它有要紧。
27
+ </p>
28
+
29
+ <!-- ======================================================================== -->
30
+ <h2 class="rule-top">先看取舍:三套版式各自放弃了什么</h2>
31
+
32
+ <div class="table"><table>
33
+ <caption class="table__cap">表 A · 三种 profile 的结构差异(判据可验证,不是文案差异)</caption>
34
+ <thead><tr>
35
+ <th scope="col">profile</th>
36
+ <th scope="col">正文行长</th>
37
+ <th scope="col">正文字号</th>
38
+ <th scope="col">图/表编号</th>
39
+ <th scope="col">必须有</th>
40
+ <th scope="col">它放弃了</th>
41
+ </tr></thead>
42
+ <tbody>
43
+ <tr><th scope="row">杂志编辑</th>
44
+ <td class="num">42em</td><td class="num">基准</td>
45
+ <td>不要</td><td>引语块 / 出血宽图</td>
46
+ <td>审计级追溯(没编号就引用不了第几图)</td></tr>
47
+ <tr><th scope="row">科研技术</th>
48
+ <td class="num">34em</td><td class="num">基准</td>
49
+ <td>自动编号</td><td>来源脚注 / 方法写明</td>
50
+ <td>快速通读(窄行长 + 松行距,读起来慢)</td></tr>
51
+ <tr><th scope="row">金融研究</th>
52
+ <td class="num">30em</td><td class="num">小一档</td>
53
+ <td>不要</td><td>关键数字条 / 风险披露</td>
54
+ <td>长论证(超过两屏的推理会被跳过)</td></tr>
55
+ </tbody>
56
+ </table></div>
57
+
58
+ <!-- ======================================================================== -->
59
+ <h2 class="rule-top">1 · 杂志编辑版(rep--magazine)</h2>
60
+ <p class="note">宽行长、大标题、引语块,图可以出血到正文之外。<strong>没有图编号</strong> —— 那是技术文档的语法。</p>
61
+
62
+ <article class="rep rep--magazine" id="mag">
63
+ <header>
64
+ <p class="rep__kicker">产业观察</p>
65
+ <h2 class="rep__title">三条产线,三种寿命:被低估的其实是包覆工艺</h2>
66
+ <p class="rep__standfirst">
67
+ 同一批电芯、同一份配方,只在包覆环节差了一步,300 周之后的容量保持率能差出 25 个百分点。
68
+ </p>
69
+ <ul class="rep__meta">
70
+ <li>张彻 · 产业分析师</li>
71
+ <li>2026-10-10</li>
72
+ <li>示例文本,非真实评测</li>
73
+ </ul>
74
+ </header>
75
+
76
+ <div class="rep__grid">
77
+ <div class="rep__body">
78
+ <section class="rep__sec">
79
+ <p>
80
+ 过去两年讨论最多的,是哪家的正极材料能量密度更高。可真正决定一块电池能撑多久的,
81
+ 往往不是那个写在规格书第一行的大数字,而是交付时被一笔带过的那层几十纳米的包覆。
82
+ </p>
83
+ <blockquote class="rep__pull">
84
+ 包覆不是"加一道工序",它是把材料的衰退从"突然坏掉"变成"慢慢变老"。
85
+ </blockquote>
86
+ <p>
87
+ 我们把三条工艺线的循环数据放在同一坐标下看了很久。区别不在起点 —— 前 50 周几乎重合;
88
+ 区别在斜率开始变陡的那一刻。未包覆的那条在 150 周左右就明显掉队,
89
+ 而做了磷酸锂包覆的那条到 300 周仍然走在 80% 以上。
90
+ </p>
91
+ </section>
92
+
93
+ <!-- 🔴 出血宽图放在**正文流内**,不在边注里。
94
+ 边注列只有 14em(252px):一张图塞进去会被压成缩略图,
95
+ 那就不是"出血"而是"缩水"。 ⇒ 大图一律走这里。 -->
96
+ <figure class="rep__fig rep__fig--wide">
97
+ <div id="magChart"></div>
98
+ <figcaption class="rep__cap">
99
+ 未包覆工艺在 150 周后掉队;两种包覆方案维持线性衰退(示例数据)。
100
+ </figcaption>
101
+ </figure>
102
+
103
+ <section class="rep__sec">
104
+ <h3>接下来要看什么</h3>
105
+ <p>
106
+ 真正的分水岭可能出现在下一代工艺上:如果包覆的成本能降到当前的六成,
107
+ "多撑两年"这件事就从实验室指标变成了合同条款。
108
+ </p>
109
+ </section>
110
+ </div>
111
+
112
+ <aside class="rep__aside">
113
+ <p class="rep__note">
114
+ 边注只用来放<strong>短</strong>东西:一句提醒、一条术语、一个次要读数。
115
+ 它挤得下的字数是有限的 —— 想放大件东西,那是正文流的活。
116
+ </p>
117
+ </aside>
118
+ </div>
119
+ </article>
120
+
121
+ <!-- ======================================================================== -->
122
+ <h2 class="rule-top">2 · 科研技术版(rep--technical)</h2>
123
+ <p class="note">
124
+ 图与表<strong>自动编号</strong>(CSS counter,写死编号会在改稿后全部错位)、章节编号可选。
125
+ 代价:行长最窄、行距最松 —— 技术报告的正确读法是逐段核对。
126
+ </p>
127
+
128
+ <article class="rep rep--technical" id="tech">
129
+ <header>
130
+ <p class="rep__kicker">实验报告</p>
131
+ <h2 class="rep__title">包覆工艺对正极材料循环稳定性的影响</h2>
132
+ <ul class="rep__meta">
133
+ <li>材料表征组</li>
134
+ <li>2026-10-10</li>
135
+ <li>版本 v1.0</li>
136
+ <li><strong>示例数据,不可用于定量结论</strong></li>
137
+ </ul>
138
+ </header>
139
+
140
+ <div class="rep__grid">
141
+ <div class="rep__body">
142
+ <section class="rep__sec">
143
+ <h3>方法</h3>
144
+ <p>
145
+ 三组样品均取自同一批次的正极粉体,区别在于包覆工序:BARE 不做处理,
146
+ AL₂O₃ 与 Li₃PO₄ 分别为两种包覆方案。每组的<strong>平行样极差</strong>直接标注在图上
147
+ —— 它由两次独立测量的差值给出,<strong>不是</strong>统计意义上的置信区间。
148
+ </p>
149
+ </section>
150
+
151
+ <section class="rep__sec">
152
+ <h3>结果</h3>
153
+ <p>
154
+ 循环至 300 周时,三组的容量保持率分别为 57.3%、76.4% 与 82.1%。
155
+ 差异在前 50 周不显著,从 150 周开始拉开(图 1)。
156
+ </p>
157
+ <figure class="rep__fig">
158
+ <div id="techChart"></div>
159
+ <figcaption class="rep__cap">
160
+ 三种方案的容量保持率随循环次数变化,阴影为平行样极差。
161
+ </figcaption>
162
+ </figure>
163
+ </section>
164
+
165
+ <section class="rep__sec">
166
+ <h3>讨论</h3>
167
+ <p>
168
+ 需要说明的是:本轮实验<strong>未做</strong>温度加速,也未控制电解液批次差异。
169
+ 因此这里的排序只在这三批样品内部成立,不宜外推到供应商层面。
170
+ </p>
171
+ </section>
172
+ </div>
173
+
174
+ <aside class="rep__aside">
175
+ <h3>关键读数</h3>
176
+ <!-- 🔴 表格说明走 `rep__cap--table`:图与表各用一路计数(rep-fig / rep-tab),
177
+ 因为「图 3」和「表 3」不是同一个东西。编号由 CSS counter 给,
178
+ 写死数字的话,插入一张新图后面全会错位。
179
+ 同一句标记放在 financial 版里不会出编号 —— 那是 profile 决定的,不是标记决定的。 -->
180
+ <figure class="rep__fig">
181
+ <div class="table"><table>
182
+ <thead><tr>
183
+ <th scope="col">方案</th>
184
+ <th scope="col">保持率</th>
185
+ </tr></thead>
186
+ <tbody>
187
+ <tr><th scope="row">未包覆</th><td class="num">57.3%</td></tr>
188
+ <tr><th scope="row">Al₂O₃</th><td class="num">76.4%</td></tr>
189
+ <tr><th scope="row">Li₃PO₄</th><td class="num">82.1%</td></tr>
190
+ </tbody>
191
+ </table></div>
192
+ <figcaption class="rep__cap rep__cap--table">
193
+ 第 300 周的容量保持率(示例数据)
194
+ </figcaption>
195
+ </figure>
196
+ </aside>
197
+ </div>
198
+
199
+ <footer class="rep__sources">
200
+ <h3>来源</h3>
201
+ <ol class="rep__source">
202
+ <li>循环数据由本实验室测得,原始记录在 LIMS 批次 <code>Q3-2026-041</code>。</li>
203
+ <li>平行样极差 = 两次独立测量值之差的一半,未按标准误处理。</li>
204
+ <li>本示例中的所有数值均为演示用构造值,不得引用。</li>
205
+ </ol>
206
+ </footer>
207
+ </article>
208
+
209
+ <!-- ======================================================================== -->
210
+ <h2 class="rule-top">3 · 金融研究版(rep--finance)</h2>
211
+ <p class="note">
212
+ 字号与行距各降一档 ⇒ 一屏塞得下更多数字;<strong>关键数字条</strong>放在最前面;
213
+ <strong>风险披露不是可选项</strong> —— 缺了它,这份材料在法律意义上是不完整的。
214
+ </p>
215
+
216
+ <article class="rep rep--finance" id="fin">
217
+ <header>
218
+ <p class="rep__kicker">产业跟踪</p>
219
+ <h2 class="rep__title">包覆工艺渗透率:对正极材料毛利率的敏感性测算</h2>
220
+ <ul class="rep__meta">
221
+ <li>研究部</li>
222
+ <li>2026-10-10</li>
223
+ <li>示例数据,非投资建议</li>
224
+ </ul>
225
+ </header>
226
+
227
+ <dl class="rep__keyline">
228
+ <div><dt>目标良率</dt><dd>94.5%</dd></div>
229
+ <div><dt>测算毛利率</dt><dd>23.1%</dd></div>
230
+ <div><dt>渗透率假设</dt><dd>38%</dd></div>
231
+ <div><dt>敏感性区间</dt><dd>18–26%</dd></div>
232
+ </dl>
233
+
234
+ <div class="rep__grid">
235
+ <div class="rep__body">
236
+ <section class="rep__sec">
237
+ <h3>结论先行</h3>
238
+ <p>
239
+ 在良率维持 94.5%、渗透率 38% 的假设下,测算毛利率 23.1%。
240
+ 敏感性区间的下限(18%)出现在良率下滑 2 个百分点、且包覆材料采购价上行的情形。
241
+ </p>
242
+ </section>
243
+
244
+ <section class="rep__sec">
245
+ <h3>关键假设</h3>
246
+ <!-- 同一句标记放在 finance 版:没有编号,因为 financial profile 不开 counter -->
247
+ <figure class="rep__fig">
248
+ <div class="table"><table>
249
+ <thead><tr>
250
+ <th scope="col">情形</th>
251
+ <th scope="col">良率</th>
252
+ <th scope="col">毛利率</th>
253
+ </tr></thead>
254
+ <tbody>
255
+ <tr><th scope="row">悲观</th><td class="num">92.5%</td><td class="num">18.0%</td></tr>
256
+ <tr><th scope="row">中性</th><td class="num">94.5%</td><td class="num">23.1%</td></tr>
257
+ <tr><th scope="row">乐观</th><td class="num">96.0%</td><td class="num">26.4%</td></tr>
258
+ </tbody>
259
+ </table></div>
260
+ <figcaption class="rep__cap rep__cap--table">
261
+ 敏感性测算的关键假设与结果(示例)
262
+ </figcaption>
263
+ </figure>
264
+ </section>
265
+
266
+ <p class="rep__source">
267
+ 数据来源:公司公开披露的季度产能口径(示例),测算过程见内部模型
268
+ <code>mod-sensitivity-041</code>。
269
+ </p>
270
+ </div>
271
+
272
+ <aside class="rep__aside">
273
+ <p class="rep__note">
274
+ 本页面的数字均为<strong>演示用构造值</strong>,用于说明版式,不代表任何真实公司或标的。
275
+ </p>
276
+ </aside>
277
+ </div>
278
+
279
+ <p class="rep__risk">
280
+ <strong>风险披露:</strong>本报告为示例文本,不构成投资建议。测算结果对良率与采购价假设高度敏感,
281
+ 假设的任何变动都可能使结论不成立。读者应自行核实数据来源,
282
+ 并对据此作出的决策独立承担责任。
283
+ </p>
284
+ </article>
285
+
286
+ <!-- ======================================================================== -->
287
+ <h2 class="rule-top">4 · 🔴 本轮明确不做(不是"还没做",是"这一版不管")</h2>
288
+ <ol>
289
+ <li><strong>分页 PDF / 印刷分页</strong>: @page 页边距、页眉页脚、页码、跨页不断行、
290
+ 孤行寡行控制 —— 全部不在本版范围内,需要 `@page`、实物打样与 PDF 引擎验证。
291
+ CSS 里只保留了"打印时不更糟"的最小保障(隐藏边注、图表不跨撕裂)。</li>
292
+ <li><strong>自动目录、尾注/脚注、交叉引用、参考文献样式</strong>:图/表编号用 CSS counter
293
+ 做到"写第几就显示第几",再往上的引用图(「详见图 3」这种自动维护)不支持。</li>
294
+ <li><strong>Markdown/文档输入、CMS、多语言排版(竖排、阿拉伯文 RTL)</strong>:不是本系统的目标。</li>
295
+ </ol>
296
+
297
+ <p class="note">
298
+ 相关的既有清单在 <code>README.md</code>:包含三种 profile 的完整取舍、
299
+ 共享基础的六个可变量,以及与 <code>04-recipes/analysis-report</code>(一份具体实例)的分工。
300
+ </p>
301
+
302
+ </main>
303
+
304
+ <script src="../../09-assets/scientific-plot/scientific-plot.js"></script>
305
+ <script>
306
+ (function () {
307
+ 'use strict';
308
+ if (!window.ScientificPlot) return;
309
+
310
+ /* 循环数据(示例):与 analysis-report 里的是同一组构造值 */
311
+ var CYC = [0, 50, 100, 150, 200, 250, 300];
312
+ var BARE = [100, 92.1, 85.3, 78.0, 70.8, 63.9, 57.3];
313
+ var AL2O = [100, 96.2, 92.4, 88.1, 84.3, 80.2, 76.4];
314
+ var LPO4 = [100, 97.1, 94.0, 91.2, 88.4, 85.3, 82.1];
315
+
316
+ function pts(a) { return CYC.map(function (c, i) { return [c, a[i]]; }); }
317
+
318
+ /* 杂志版:宽图、不要编号、只要趋势 ⇒ 只画两条线,不画误差带 */
319
+ window.ScientificPlot.render(document.getElementById('magChart'), {
320
+ width: 460, height: 260,
321
+ legend: false, /* 编辑稿里图注已经说清了,图例是多余的 */
322
+ title: '容量保持率随循环次数的变化',
323
+ x: { label: '循环次数', unit: '周', scale: 'linear', domain: [0, 300] },
324
+ y: { label: '容量保持率', unit: '%', scale: 'linear', domain: [50, 102] },
325
+ series: [
326
+ { type: 'line', data: pts(BARE), name: '未包覆' },
327
+ { type: 'line', data: pts(LPO4), name: 'Li₃PO₄ 包覆' }
328
+ ]
329
+ });
330
+
331
+ /* 技术版:三组材料,带/线共用身份才不会看错(见 VIZ-REPORT-01 · P0-2) */
332
+ var HW = [0, 0.9, 1.3, 1.6, 1.9, 2.2, 2.4];
333
+ function band(a) {
334
+ var f = a === BARE ? 1.4 : a === AL2O ? 1.0 : 0.8;
335
+ return CYC.map(function (c, i) { return [c, a[i] - HW[i] * f, a[i] + HW[i] * f]; });
336
+ }
337
+ window.ScientificPlot.render(document.getElementById('techChart'), {
338
+ width: 620, height: 320,
339
+ title: '三种方案的容量保持率',
340
+ desc: '阴影为平行样极差',
341
+ x: { label: '循环次数', unit: '周', scale: 'linear', domain: [0, 300] },
342
+ y: { label: '容量保持率', unit: '%', scale: 'linear', domain: [50, 102] },
343
+ series: [
344
+ { type: 'band', data: band(BARE), name: '未包覆' },
345
+ { type: 'band', data: band(AL2O), name: 'Al₂O₃ 包覆' },
346
+ { type: 'band', data: band(LPO4), name: 'Li₃PO₄ 包覆' },
347
+ { type: 'line', data: pts(BARE), name: '未包覆' },
348
+ { type: 'line', data: pts(AL2O), name: 'Al₂O₃ 包覆' },
349
+ { type: 'line', data: pts(LPO4), name: 'Li₃PO₄ 包覆' }
350
+ ]
351
+ });
352
+ })();
353
+ </script>
354
+ </body>
355
+ </html>