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,187 @@
1
+ /* ============================================================================
2
+ analysis-report/analysis-report.css — 研究报告 recipe 的局部样式
3
+ ============================================================================
4
+ 依赖:01-tokens/tokens.css(只消费令牌,不写死颜色/间距)
5
+ 01-tokens/page.css(提供 .page / .wrap / .lede / .note 骨架)
6
+
7
+ 🔴 这个 recipe 存在的意义:证明本库能组合出**不只是单栏长文**的页面。
8
+ longform 证明的是长文排版;这里要证明:
9
+ · 正文 + 辅助栏的**并排**布局(窄屏自然退回单栏,不是缩小桌面版)
10
+ · 关键发现区、数据区、引用区的**信息层级**
11
+ · 表格 / 图表 / 代码块在同一页里**协调**而不是各说各话
12
+ ============================================================================ */
13
+
14
+ /* 报告比普通长文宽:正文列 + 15rem 辅助栏 */
15
+ .report { max-width: calc(var(--measure-page) + 16rem); }
16
+
17
+ /* ---------- 页头 ---------- */
18
+ .report__kicker {
19
+ margin: 0 0 var(--sp-2);
20
+ font-size: var(--fs-xs);
21
+ letter-spacing: .08em;
22
+ text-transform: uppercase;
23
+ color: var(--text-tertiary);
24
+ }
25
+ .report__meta {
26
+ display: flex;
27
+ flex-wrap: wrap;
28
+ gap: var(--sp-1) var(--sp-4);
29
+ margin: var(--sp-4) 0 0;
30
+ padding-top: var(--sp-3);
31
+ border-top: 1px solid var(--border-decor);
32
+ font-size: var(--fs-xs);
33
+ color: var(--text-tertiary);
34
+ }
35
+ .report__meta b { font-weight: 500; color: var(--text-secondary); }
36
+
37
+ /* ---------- 主体:桌面并排,窄屏单栏 ---------- */
38
+ .report__body {
39
+ display: grid;
40
+ grid-template-columns: minmax(0, 1fr); /* 默认单栏 —— 窄屏天然成立 */
41
+ gap: var(--sp-6);
42
+ margin-top: var(--sp-6);
43
+ }
44
+
45
+ /* 🔴 断点写不了 var():--bp-lg = 64rem = 1024px(见 tokens.css)
46
+ 并排是"内容有位置放"之后才发生的事,不是把所有东西缩小塞进去 */
47
+ @media (min-width: 64rem) {
48
+ .report__body {
49
+ grid-template-columns: minmax(0, 1fr) 15rem;
50
+ gap: var(--sp-7);
51
+ }
52
+ .report__aside {
53
+ position: sticky;
54
+ top: var(--sp-4);
55
+ align-self: start; /* sticky 要在 grid 里生效必须写这句 */
56
+ max-height: calc(100vh - var(--sp-8));
57
+ overflow: auto;
58
+ }
59
+ }
60
+
61
+ /* ---------- 正文节奏 ---------- */
62
+ .report__main > section + section { margin-top: var(--sp-6); }
63
+ .report__main h2 { margin-top: 0; }
64
+ .report__main p { margin: var(--sp-3) 0; }
65
+ .report__main ul,
66
+ .report__main ol { margin: var(--sp-3) 0; padding-inline-start: var(--sp-5); }
67
+ .report__main li + li { margin-top: var(--sp-1); }
68
+
69
+ /* ---------- 关键发现区 ---------- */
70
+ /* 🔴 关键发现:竖条 → 淡色底 + 圆角(0.8.4 · 统一竖条政策)
71
+ 原来这里是 `border-inline-start: 3px solid var(--accent)`,
72
+ 而全库另外三处(typography / form-validation / overlay)**都已经删掉竖条**,
73
+ 理由写在各自的注释里:
74
+ ① 竖条在页面上拉出一条**与内容无关的硬边**,视觉噪声大于信息量
75
+ ② 真实产品(GitHub callout / Vercel / Stripe)都是纯底色 + 圆角
76
+ ⇒ 这个组件是"该次清理漏掉的原始设计",不是有意为之的特例。
77
+ 颜色没有被丢掉,只是**从竖条转移进底色**(info-bg),语义强度不变。
78
+ ⚠️ 顺带修一个性质差异:原来用的 `border-inline-start`(逻辑属性,RTL 自动镜像)
79
+ 已不需要—— 因为不再有竖条。 */
80
+ .kf {
81
+ margin: var(--sp-4) 0;
82
+ padding: var(--sp-4);
83
+ background: var(--info-bg);
84
+ border-radius: var(--r-md);
85
+ }
86
+ .kf__title {
87
+ margin: 0 0 var(--sp-2);
88
+ font-size: var(--fs-sm);
89
+ font-weight: 600;
90
+ color: var(--text-secondary);
91
+ }
92
+ .kf ol { margin: 0; padding-inline-start: var(--sp-5); }
93
+ .kf li { margin-top: var(--sp-2); }
94
+ .kf strong { color: var(--text-primary); }
95
+
96
+ /* ---------- 引用块 ---------- */
97
+ /* 🔴 引语块:竖条保留但降级(0.8.4 · 统一竖条政策)
98
+ 引语块是**唯一**竖条有语义的地方 —— 竖条标记"这是别人说的话",
99
+ 是内容属性不是装饰(学术排版里这个惯例也很稳)。
100
+ 但它原来用 `var(--border-decor-str)`,对比度太弱、存在感太轻,
101
+ 读者会以为这是普通段落的缩进。
102
+ ⇒ 改用`--border-decor`(明确的分隔线色)+ 保留逻辑属性(RTL 自动镜像)。
103
+ ⚠️ 这条是**本库唯一保留的竖条**,理由已写在这里;
104
+ 以后新增竖条必须同样写明"为什么它不是装饰"。 */
105
+ .report__quote {
106
+ margin: var(--sp-4) 0;
107
+ padding: var(--sp-3) var(--sp-4);
108
+ border-inline-start: 3px solid var(--border-decor);
109
+ color: var(--text-secondary);
110
+ font-style: italic;
111
+ }
112
+ .report__quote cite {
113
+ display: block;
114
+ margin-top: var(--sp-2);
115
+ font-size: var(--fs-xs);
116
+ font-style: normal;
117
+ color: var(--text-tertiary);
118
+ }
119
+
120
+ /* ---------- 代码块:承载"实验参数"这类结构化信息 ---------- */
121
+ .report__code {
122
+ margin: var(--sp-4) 0;
123
+ padding: var(--sp-3) var(--sp-4);
124
+ background: var(--surface-sunken);
125
+ border: 1px solid var(--border-decor);
126
+ border-radius: var(--r-md);
127
+ overflow-x: auto;
128
+ font-family: var(--mono);
129
+ font-size: var(--fs-xs);
130
+ line-height: var(--lh-loose);
131
+ color: var(--text-secondary);
132
+ white-space: pre;
133
+ }
134
+
135
+ /* ---------- 辅助栏 ----------
136
+ 🔴 用现有 card 组件(02-primitives/card),不另造一个"侧栏卡片" ——
137
+ 重复造会在换主题时多一个不一致的源头。
138
+ 这里只补排布与紧凑排版。 */
139
+ .report__aside .card + .card { margin-top: var(--sp-3); }
140
+ .report__aside .card__title {
141
+ font-size: var(--fs-xs);
142
+ letter-spacing: .04em;
143
+ text-transform: uppercase;
144
+ color: var(--text-tertiary);
145
+ }
146
+ .report__aside dl { margin: var(--sp-2) 0 0; font-size: var(--fs-sm); }
147
+ .report__aside dt {
148
+ margin-top: var(--sp-2);
149
+ font-size: var(--fs-xs);
150
+ color: var(--text-tertiary);
151
+ }
152
+ .report__aside dd { margin: 0; color: var(--text-primary); }
153
+ /* 🔴 不用 inline style 写字号颜色:inline 的优先级高于一切样式表(INVARIANT I-4),
154
+ 使用者想覆盖它只能再加 !important —— 演示页不该教这个。 */
155
+ .report__aside p { margin: 0; font-size: var(--fs-sm); color: var(--text-secondary); }
156
+
157
+ /* ---------- 图表容器 ---------- */
158
+ .report__fig {
159
+ margin: var(--sp-5) 0;
160
+ padding: var(--sp-3);
161
+ background: var(--surface);
162
+ border: 1px solid var(--border-decor);
163
+ border-radius: var(--r-md);
164
+ overflow-x: auto;
165
+ }
166
+ .report__fig figcaption {
167
+ margin-top: var(--sp-2);
168
+ font-size: var(--fs-xs);
169
+ color: var(--text-tertiary);
170
+ }
171
+
172
+ /* ---------- 页脚来源 ---------- */
173
+ .report__foot {
174
+ margin-top: var(--sp-8);
175
+ padding-top: var(--sp-4);
176
+ border-top: 1px solid var(--border-decor);
177
+ font-size: var(--fs-xs);
178
+ color: var(--text-tertiary);
179
+ }
180
+ .report__foot ol { padding-inline-start: var(--sp-5); }
181
+ .report__foot li + li { margin-top: var(--sp-1); }
182
+
183
+ /* ---------- 打印:辅助栏不再粘住,避免整页错位 ---------- */
184
+ @media print {
185
+ .report__aside { position: static; max-height: none; overflow: visible; }
186
+ .report__body { grid-template-columns: 1fr; }
187
+ }
@@ -0,0 +1,274 @@
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>analysis-report · 组合型研究报告 · frontend-lib</title>
8
+
9
+ <!-- 骨架必须在组件之前:组件靠"后来者同特异性胜出"覆盖骨架,不用 !important -->
10
+ <link rel="stylesheet" href="../../01-tokens/tokens.css">
11
+ <link rel="stylesheet" href="../../01-tokens/typography.css">
12
+ <link rel="stylesheet" href="../../01-tokens/focus-ring.css">
13
+ <link rel="stylesheet" href="../../01-tokens/page.css">
14
+
15
+ <link rel="stylesheet" href="../../02-primitives/card/card.css">
16
+ <link rel="stylesheet" href="../../02-primitives/badge/badge.css">
17
+ <link rel="stylesheet" href="../../04-recipes/table/table.css">
18
+ <link rel="stylesheet" href="../../09-assets/scientific-plot/scientific-plot.css">
19
+
20
+ <link rel="stylesheet" href="analysis-report.css">
21
+ </head>
22
+ <body class="page">
23
+ <main class="wrap report">
24
+
25
+ <!-- ============================================================ 页头 -->
26
+ <header>
27
+ <p class="report__kicker">材料科学 · 实验报告</p>
28
+ <h1>高镍正极材料在高电压下的循环衰减与表面包覆效果</h1>
29
+ <p class="lede">
30
+ 对比三种表面处理方案在 4.4&nbsp;V 截止电压下的 300 周容量保持表现,
31
+ 并给出可复现的实验条件。
32
+ </p>
33
+ <p class="report__meta">
34
+ <span><b>报告编号</b> MR-2026-0417</span>
35
+ <span><b>版本</b> v1.2</span>
36
+ <span><b>状态</b> <span class="badge badge--warning">待同行评议</span></span>
37
+ <span><b>数据截止</b> 2026-04-10</span>
38
+ </p>
39
+ </header>
40
+
41
+ <div class="report__body">
42
+
43
+ <!-- ======================================================== 正文 -->
44
+ <article class="report__main">
45
+
46
+ <section>
47
+ <h2>1 · 摘要</h2>
48
+ <p>
49
+ 高镍层状氧化物(LiNi<sub>0.8</sub>Co<sub>0.1</sub>Mn<sub>0.1</sub>O<sub>2</sub>,下称 NCM811)
50
+ 在提升能量密度的同时,其高电压循环下的界面副反应会加速容量衰减。
51
+ 本报告比较未包覆、Al<sub>2</sub>O<sub>3</sub> 包覆与
52
+ Li<sub>3</sub>PO<sub>4</sub> 包覆三种方案,在相同电解液体系与截止电压下的循环表现。
53
+ </p>
54
+
55
+ <div class="kf">
56
+ <p class="kf__title">关键发现</p>
57
+ <ol>
58
+ <li>
59
+ 300 周后容量保持率:未包覆 <strong>57.3%</strong>、
60
+ Al<sub>2</sub>O<sub>3</sub> <strong>76.4%</strong>、
61
+ Li<sub>3</sub>PO<sub>4</sub> <strong>82.1%</strong>。
62
+ </li>
63
+ <li>
64
+ 两种包覆方案在 <strong>前 50 周</strong>差异不显著(&lt; 1 个百分点),
65
+ 分化主要发生在 100 周之后。
66
+ </li>
67
+ <li>
68
+ 首次库仑效率的差异(87.2% / 88.1% / 89.3%)<strong>不足以</strong>
69
+ 单独解释 300 周时的容量差距 —— 包覆主要影响的是<strong>衰减速率</strong>,不是起始容量。
70
+ </li>
71
+ <li>
72
+ 本报告<strong>不主张</strong>任何方案具备统计显著性:
73
+ 每组仅 2 个平行电池,样本量不足以做显著性检验。
74
+ </li>
75
+ </ol>
76
+ </div>
77
+ </section>
78
+
79
+ <section>
80
+ <h2>2 · 方法与实验条件</h2>
81
+ <p>
82
+ 所有样品采用同一来源前驱体,包覆在流化床中进行。电化学测试使用扣式电池,
83
+ 每组成 2 个平行样,取算术平均。
84
+ </p>
85
+
86
+ <pre class="report__code">电解液 1 M LiPF6 in EC:EMC:DMC = 3:5:2 (v/v) + 2 wt% VC
87
+ 截止电压 3.0 – 4.4 V (vs. Li/Li+)
88
+ 倍率 0.5C 充电 / 1.0C 放电
89
+ 温度 25 ± 1 °C
90
+ 包覆量 Al2O3 0.8 wt% · Li3PO4 1.0 wt%(以正极活性物质计)</pre>
91
+
92
+ <p>三种样品的基础电化学参数如下:</p>
93
+
94
+ <div class="table table--financial" tabindex="0" role="region" aria-label="财务数据表(可横向滚动)">
95
+ <table>
96
+ <caption class="table__cap">表 1 · 三种样品的基础电化学参数(每组 n = 2,取算术平均)</caption>
97
+ <thead>
98
+ <tr>
99
+ <th scope="col">样品</th>
100
+ <th scope="col">首次放电容量 <span class="table__unit">mAh/g</span></th>
101
+ <th scope="col">首次库仑效率 <span class="table__unit">%</span></th>
102
+ <th scope="col">300 周容量保持率 <span class="table__unit">%</span></th>
103
+ <th scope="col">平均粒径 <span class="table__unit">µm</span></th>
104
+ </tr>
105
+ </thead>
106
+ <tbody>
107
+ <tr>
108
+ <th scope="row">未包覆</th>
109
+ <td class="num">208</td><td class="num">87.2</td>
110
+ <td class="num">57.3</td><td class="num">11.2</td>
111
+ </tr>
112
+ <tr>
113
+ <th scope="row">Al<sub>2</sub>O<sub>3</sub> 包覆</th>
114
+ <td class="num">204</td><td class="num">88.1</td>
115
+ <td class="num">76.4</td><td class="num">11.5</td>
116
+ </tr>
117
+ <tr>
118
+ <th scope="row">Li<sub>3</sub>PO<sub>4</sub> 包覆</th>
119
+ <td class="num">206</td><td class="num">89.3</td>
120
+ <td class="num">82.1</td><td class="num">11.3</td>
121
+ </tr>
122
+ </tbody>
123
+ </table>
124
+ </div>
125
+ <p class="table__foot">
126
+ 注:容量保持率以第 1 周放电容量为基准归一化。粒径为激光粒度仪 D50。
127
+ </p>
128
+ </section>
129
+
130
+ <section>
131
+ <h2>3 · 结果</h2>
132
+ <p>
133
+ 下图给出三种方案的容量保持率随循环次数的变化。阴影带为两个平行样之间的
134
+ 极差范围 —— 它是<strong>两个测量值之间的实际差异</strong>,不是置信区间。
135
+ </p>
136
+
137
+ <figure class="report__fig">
138
+ <div id="cycleChart"></div>
139
+ <figcaption>
140
+ 图 1 · 300 周循环容量保持率。阴影为两个平行样之间的极差(n = 2)。
141
+ 数据为示例,用于演示本库的组合排版。
142
+ </figcaption>
143
+ </figure>
144
+
145
+ <p>
146
+ 值得注意的不是三条曲线的<strong>位置</strong>,而是它们的<strong>斜率</strong>:
147
+ 未包覆样品在 100 周后开始出现明显加速衰减,而两种包覆样品的衰减速率在
148
+ 150–300 周区间基本保持线性。
149
+ </p>
150
+ </section>
151
+
152
+ <section>
153
+ <h2>4 · 讨论</h2>
154
+ <p>
155
+ 界面包覆的常见解释是抑制电解液与高活性表面的直接接触,从而减缓
156
+ Ni<sup>2+</sup>/Ni<sup>4+</sup> 的可逆性损失。本报告的数据与这一机制方向一致,
157
+ 但<strong>不足以证明</strong>因果 —— 缺少表面成分与阻抗谱的对照数据。
158
+ </p>
159
+
160
+ <blockquote class="report__quote">
161
+ 「包覆层的核心作用是延缓界面副反应的累积,而不是提高材料的本征容量。
162
+ 因此评估包覆效果时,循环后期的衰减速率比首周容量更具信息量。」
163
+ <cite>— 引自内部技术备忘录 TM-2026-003</cite>
164
+ </blockquote>
165
+
166
+ <p>
167
+ 本次未测量交流阻抗与表面 XPS,因此无法把衰减速率差异归因到具体的界面反应路径。
168
+ 后续计划补充这两项表征。
169
+ </p>
170
+ </section>
171
+
172
+ </article>
173
+
174
+ <!-- ======================================================== 辅助栏 -->
175
+ <aside class="report__aside">
176
+ <section class="card card--compact">
177
+ <div class="card__body">
178
+ <h3 class="card__title">数据速览</h3>
179
+ <dl>
180
+ <dt>样品数</dt><dd>3 组 × 2 平行样</dd>
181
+ <dt>循环周数</dt><dd>300</dd>
182
+ <dt>截止电压</dt><dd>4.4 V</dd>
183
+ <dt>最高保持率</dt><dd>82.1%(Li<sub>3</sub>PO<sub>4</sub>)</dd>
184
+ <dt>最低保持率</dt><dd>57.3%(未包覆)</dd>
185
+ </dl>
186
+ </div>
187
+ </section>
188
+
189
+ <section class="card card--compact">
190
+ <div class="card__body">
191
+ <h3 class="card__title">术语</h3>
192
+ <dl>
193
+ <dt>NCM811</dt><dd>LiNi<sub>0.8</sub>Co<sub>0.1</sub>Mn<sub>0.1</sub>O<sub>2</sub></dd>
194
+ <dt>首效</dt><dd>首次库仑效率</dd>
195
+ <dt>D50</dt><dd>体积分布中位径</dd>
196
+ <dt>极差</dt><dd>最大值与最小值之差</dd>
197
+ </dl>
198
+ </div>
199
+ </section>
200
+
201
+ <section class="card card--compact">
202
+ <div class="card__body">
203
+ <h3 class="card__title">本报告不承诺</h3>
204
+ <p>
205
+ 不做统计显著性判断(n = 2 不足);
206
+ 不外推至其他截止电压或电解液体系;
207
+ 不给出循环寿命预测。
208
+ </p>
209
+ </div>
210
+ </section>
211
+ </aside>
212
+
213
+ </div>
214
+
215
+ <!-- ============================================================ 页脚 -->
216
+ <footer class="report__foot">
217
+ <p><strong>数据来源与限制</strong></p>
218
+ <ol>
219
+ <li>全部数值为演示用示例数据,<strong>不是真实实验结果</strong>。</li>
220
+ <li>每组样本量 n = 2,不足以支持任何统计推断。</li>
221
+ <li>本页同时演示本库的表格、图表、并排布局与辅助栏,不代表任何材料学结论。</li>
222
+ </ol>
223
+ </footer>
224
+
225
+ </main>
226
+
227
+ <script src="../../09-assets/scientific-plot/scientific-plot.js"></script>
228
+ <script>
229
+ (function () {
230
+ 'use strict';
231
+ if (!window.ScientificPlot) return;
232
+
233
+ /* 循环数据:容量保持率(%) */
234
+ var CYC = [0, 50, 100, 150, 200, 250, 300];
235
+ var BARE = [100, 92.1, 85.3, 78.0, 70.8, 63.9, 57.3];
236
+ var AL2O = [100, 96.2, 92.4, 88.1, 84.3, 80.2, 76.4];
237
+ var LPO4 = [100, 97.1, 94.0, 91.2, 88.4, 85.3, 82.1];
238
+
239
+ /* 极差半宽(两个平行样之间的实际差异 / 2)—— 是**测量值**,不是统计区间 */
240
+ var HW = [0, 0.9, 1.3, 1.6, 1.9, 2.2, 2.4];
241
+
242
+ function pts(arr) { return CYC.map(function (c, i) { return [c, arr[i]]; }); }
243
+ function band(arr) {
244
+ return CYC.map(function (c, i) {
245
+ var hw = HW[i] * (arr === BARE ? 1.4 : arr === AL2O ? 1.0 : 0.8);
246
+ return [c, arr[i] - hw, arr[i] + hw];
247
+ });
248
+ }
249
+
250
+ window.ScientificPlot.render(document.getElementById('cycleChart'), {
251
+ width: 700, height: 360,
252
+ title: '容量保持率随循环次数的变化',
253
+ desc: '三组包覆方案,阴影为平行样极差',
254
+ x: { label: '循环次数', unit: '周', scale: 'linear', domain: [0, 300] },
255
+ y: { label: '容量保持率', unit: '%', scale: 'linear', domain: [50, 102] },
256
+ /* 🔴 **每条 series 都要给 `name`** —— 这是"逻辑系列"的身份。
257
+ 同一材料的「区间带」和「曲线」必须写**同一个名字**:
258
+ · 写了 ⇒ 它们共用一个色号,读者一看就知道这个带属于这条线
259
+ · 不写 ⇒ 每条记录各吃一个色号 ⇒ 带是红的、线是绿的,看着像两种材料
260
+ (评审 VIZ-REPORT-01 · P0-2 抓的正是"不写 ⇒ 六条同色",
261
+ 而"每条一个色"是另一个反方向的错误 —— 两边都不能要。) */
262
+ series: [
263
+ { type: 'band', data: band(BARE), name: '未包覆' },
264
+ { type: 'band', data: band(AL2O), name: 'Al₂O₃ 包覆' },
265
+ { type: 'band', data: band(LPO4), name: 'Li₃PO₄ 包覆' },
266
+ { type: 'line', data: pts(BARE), name: '未包覆' },
267
+ { type: 'line', data: pts(AL2O), name: 'Al₂O₃ 包覆' },
268
+ { type: 'line', data: pts(LPO4), name: 'Li₃PO₄ 包覆' }
269
+ ]
270
+ });
271
+ })();
272
+ </script>
273
+ </body>
274
+ </html>
@@ -0,0 +1,45 @@
1
+ # data-showcase · 数据展示能力对照
2
+
3
+ 一页对照四种数据表达方式,用来回答「我该用哪个」。
4
+
5
+ | 表达方式 | 组件 | 回答的问题 |
6
+ |---|---|---|
7
+ | 迷你趋势 | `09-assets/sparkline` | 指标是涨还是跌 |
8
+ | 科学坐标图 | `09-assets/scientific-plot` | 值落在哪、误差多大 |
9
+ | 学术表格 | `04-recipes/table`(`--academic`) | 哪个方案在哪个指标上更好 |
10
+ | 统计结果表 | `04-recipes/table`(`--stats`) | 效应大小与确定程度 |
11
+
12
+ 它们**共享**设计令牌、字体、容器与响应式基础,
13
+ 但**不共享**坐标规则与数据格式 —— 所以是四个用途,不是同一个组件的四种皮肤。
14
+
15
+ ## 文件
16
+
17
+ | 文件 | 说明 |
18
+ |---|---|
19
+ | `demo.html` | 对照示例页(可直接打开) |
20
+
21
+ 样式全部复用库内已有资产,本示例页只用了 `<style>` 里少量排布规则(KPI 卡、图表框),
22
+ 没有新增运行时依赖。
23
+
24
+ ## 依赖
25
+
26
+ ```
27
+ 01-tokens/tokens.css
28
+ 01-tokens/typography.css
29
+ 01-tokens/page.css
30
+ 09-assets/sparkline/sparkline.css + .js
31
+ 09-assets/scientific-plot/scientific-plot.css + .js
32
+ 04-recipes/table/table.css
33
+ ```
34
+
35
+ ## 预览
36
+
37
+ ```bash
38
+ python -m http.server 8000
39
+ # http://127.0.0.1:8000/04-recipes/data-showcase/demo.html
40
+ ```
41
+
42
+ ## 说明
43
+
44
+ 页面内所有数值均为**示例数据**,不构成任何业务或科研结论。
45
+ 留这句是因为「长得像真实数据」的示例最容易被误引用。