agentcss 0.0.0-stage → 0.11.3
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.
- package/01-tokens/README.md +236 -0
- package/01-tokens/behavior/dismissable.js +132 -0
- package/01-tokens/behavior/emit.js +76 -0
- package/01-tokens/behavior/focus-return.js +81 -0
- package/01-tokens/behavior/roving.js +152 -0
- package/01-tokens/behavior/typeahead.js +124 -0
- package/01-tokens/focus-ring-demo.html +133 -0
- package/01-tokens/focus-ring.css +102 -0
- package/01-tokens/page.css +244 -0
- package/01-tokens/polyfill.js +116 -0
- package/01-tokens/responsive-demo.html +171 -0
- package/01-tokens/scrollbar-demo.html +194 -0
- package/01-tokens/scrollbar.css +179 -0
- package/01-tokens/theme-toggle.js +103 -0
- package/01-tokens/tokens.css +972 -0
- package/01-tokens/typography.css +156 -0
- package/02-primitives/badge/README.md +71 -0
- package/02-primitives/badge/badge.css +141 -0
- package/02-primitives/badge/demo.html +101 -0
- package/02-primitives/button/README.md +99 -0
- package/02-primitives/button/button.css +353 -0
- package/02-primitives/button/demo.html +200 -0
- package/02-primitives/card/README.md +145 -0
- package/02-primitives/card/card.css +246 -0
- package/02-primitives/card/demo.html +170 -0
- package/02-primitives/choice/README.md +161 -0
- package/02-primitives/choice/choice.css +395 -0
- package/02-primitives/choice/demo.html +277 -0
- package/02-primitives/combobox/README.md +79 -0
- package/02-primitives/combobox/combobox.css +223 -0
- package/02-primitives/combobox/combobox.js +485 -0
- package/02-primitives/combobox/demo.html +109 -0
- package/02-primitives/date-range/README.md +100 -0
- package/02-primitives/date-range/date-range.css +206 -0
- package/02-primitives/date-range/date-range.js +301 -0
- package/02-primitives/date-range/demo.html +104 -0
- package/02-primitives/input/README.md +170 -0
- package/02-primitives/input/demo.html +246 -0
- package/02-primitives/input/input.css +239 -0
- package/02-primitives/popover/README.md +80 -0
- package/02-primitives/popover/demo.html +150 -0
- package/02-primitives/popover/popover.css +187 -0
- package/02-primitives/popover/popover.js +331 -0
- package/02-primitives/progress/README.md +82 -0
- package/02-primitives/progress/demo.html +154 -0
- package/02-primitives/progress/progress.css +172 -0
- package/02-primitives/select/README.md +95 -0
- package/02-primitives/select/demo.html +121 -0
- package/02-primitives/select/select.css +151 -0
- package/02-primitives/select/select.js +549 -0
- package/02-primitives/separator/README.md +63 -0
- package/02-primitives/separator/demo.html +84 -0
- package/02-primitives/separator/separator.css +73 -0
- package/02-primitives/skeleton/README.md +69 -0
- package/02-primitives/skeleton/demo.html +110 -0
- package/02-primitives/skeleton/skeleton.css +96 -0
- package/02-primitives/switch/README.md +65 -0
- package/02-primitives/switch/demo.html +115 -0
- package/02-primitives/switch/switch.css +370 -0
- package/03-patterns/accordion/README.md +121 -0
- package/03-patterns/accordion/accordion.css +453 -0
- package/03-patterns/accordion/accordion.js +369 -0
- package/03-patterns/accordion/demo.html +223 -0
- package/03-patterns/content/README.md +103 -0
- package/03-patterns/content/content.css +286 -0
- package/03-patterns/content/demo.html +88 -0
- package/03-patterns/drawer/README.md +79 -0
- package/03-patterns/drawer/demo.html +101 -0
- package/03-patterns/drawer/drawer.css +129 -0
- package/03-patterns/drawer/drawer.js +258 -0
- package/03-patterns/dropdown/README.md +78 -0
- package/03-patterns/dropdown/demo.html +101 -0
- package/03-patterns/dropdown/dropdown.css +135 -0
- package/03-patterns/dropdown/dropdown.js +451 -0
- package/03-patterns/form-validation/README.md +147 -0
- package/03-patterns/form-validation/demo.html +280 -0
- package/03-patterns/form-validation/form-validation.css +263 -0
- package/03-patterns/list/README.md +150 -0
- package/03-patterns/list/demo.html +225 -0
- package/03-patterns/list/flip.js +201 -0
- package/03-patterns/list/list.css +162 -0
- package/03-patterns/nav/README.md +225 -0
- package/03-patterns/nav/demo.html +131 -0
- package/03-patterns/nav/nav.css +314 -0
- package/03-patterns/nav/nav.js +430 -0
- package/03-patterns/nav/toc.js +111 -0
- package/03-patterns/overlay/README.md +196 -0
- package/03-patterns/overlay/demo.html +241 -0
- package/03-patterns/overlay/overlay.css +319 -0
- package/03-patterns/overlay/overlay.js +563 -0
- package/03-patterns/pagination/README.md +114 -0
- package/03-patterns/pagination/demo.html +165 -0
- package/03-patterns/pagination/pagination.css +195 -0
- package/03-patterns/pagination/pagination.js +395 -0
- package/03-patterns/reveal/README.md +91 -0
- package/03-patterns/reveal/demo.html +106 -0
- package/03-patterns/reveal/reveal.css +93 -0
- package/03-patterns/reveal/reveal.js +172 -0
- package/03-patterns/states/README.md +141 -0
- package/03-patterns/states/demo.html +240 -0
- package/03-patterns/states/states.css +252 -0
- package/03-patterns/tabs/README.md +84 -0
- package/03-patterns/tabs/demo.html +139 -0
- package/03-patterns/tabs/tabs.css +172 -0
- package/03-patterns/tabs/tabs.js +307 -0
- package/03-patterns/tooltip/README.md +96 -0
- package/03-patterns/tooltip/demo.html +78 -0
- package/03-patterns/tooltip/tooltip.css +89 -0
- package/03-patterns/tooltip/tooltip.js +288 -0
- package/03-patterns/tree/README.md +94 -0
- package/03-patterns/tree/demo.html +138 -0
- package/03-patterns/tree/tree.css +113 -0
- package/03-patterns/tree/tree.js +456 -0
- package/04-recipes/analysis-report/README.md +80 -0
- package/04-recipes/analysis-report/analysis-report.css +187 -0
- package/04-recipes/analysis-report/demo.html +274 -0
- package/04-recipes/data-showcase/README.md +45 -0
- package/04-recipes/data-showcase/demo.html +247 -0
- package/04-recipes/detail-page/README.md +93 -0
- package/04-recipes/detail-page/demo.html +55 -0
- package/04-recipes/detail-page/detail-page.css +190 -0
- package/04-recipes/detail-page/full.html +60 -0
- package/04-recipes/detail-page/null.html +60 -0
- package/04-recipes/detail-page/partial.html +60 -0
- package/04-recipes/detail-page/verify-skeleton.py +19 -0
- package/04-recipes/longform/README.md +93 -0
- package/04-recipes/longform/agc-memory.svg +4 -0
- package/04-recipes/longform/content.html +610 -0
- package/04-recipes/longform/content.md +51 -0
- package/04-recipes/longform/longform.html +627 -0
- package/04-recipes/report/README.md +176 -0
- package/04-recipes/report/demo.html +355 -0
- package/04-recipes/report/report.css +364 -0
- package/04-recipes/table/README.md +103 -0
- package/04-recipes/table/demo.html +455 -0
- package/04-recipes/table/table.css +372 -0
- package/04-recipes/tierA-tokens.css +189 -0
- package/09-assets/README.md +74 -0
- package/09-assets/bar/README.md +94 -0
- package/09-assets/bar/bar.css +166 -0
- package/09-assets/bar/bar.js +320 -0
- package/09-assets/bar/demo.html +176 -0
- package/09-assets/echarts-adapter/demo.html +192 -0
- package/09-assets/echarts-adapter/echarts-adapter.js +277 -0
- package/09-assets/model-viewer/README.md +155 -0
- package/09-assets/model-viewer/demo.html +105 -0
- package/09-assets/model-viewer/model-viewer.css +143 -0
- package/09-assets/model-viewer/model-viewer.js +423 -0
- package/09-assets/scientific-plot/README.md +94 -0
- package/09-assets/scientific-plot/demo.html +252 -0
- package/09-assets/scientific-plot/scientific-plot.css +141 -0
- package/09-assets/scientific-plot/scientific-plot.js +610 -0
- package/09-assets/sparkline/README.md +153 -0
- package/09-assets/sparkline/demo.html +163 -0
- package/09-assets/sparkline/sparkline.css +158 -0
- package/09-assets/sparkline/sparkline.js +508 -0
- package/API.md +332 -0
- package/CHANGELOG.md +3138 -0
- package/CODE_OF_CONDUCT.md +64 -0
- package/CONTRIBUTING.md +89 -0
- package/ERRORS.md +1658 -0
- package/LICENSE +21 -0
- package/README.md +497 -2
- package/SECURITY.md +72 -0
- package/START-HERE.md +164 -0
- package/SUPPORT.md +109 -0
- package/adapters/presentation/README.md +113 -0
- package/adapters/presentation/check.js +101 -0
- package/adapters/presentation/deck.schema.json +74 -0
- package/adapters/presentation/to-doc.js +138 -0
- package/ai/START-HERE.md +104 -0
- package/ai/behaviors.json +380 -0
- package/ai/behaviors.schema.json +61 -0
- package/ai/capabilities.json +56 -0
- package/ai/cli.js +387 -0
- package/ai/components.json +1944 -0
- package/ai/components.meta.json +168 -0
- package/ai/components.schema.json +220 -0
- package/ai/contract.schema.json +147 -0
- package/ai/deprecations.json +55 -0
- package/ai/deprecations.schema.json +85 -0
- package/ai/motion-policy.json +22 -0
- package/ai/patch.js +323 -0
- package/ai/patch.schema.json +63 -0
- package/ai/profiles.json +92 -0
- package/ai/tokens.audience.json +55 -0
- package/ai/tokens.audience.schema.json +73 -0
- package/ai/tokens.json +762 -0
- package/ai/tokens.schema.json +58 -0
- package/ai/tokens.tree.json +752 -0
- package/ai/tokens.tree.schema.json +56 -0
- package/ai/validate.js +383 -0
- package/dist/01-tokens/behavior/dismissable.js +60 -0
- package/dist/01-tokens/behavior/emit.js +21 -0
- package/dist/01-tokens/behavior/focus-return.js +31 -0
- package/dist/01-tokens/behavior/roving.js +77 -0
- package/dist/01-tokens/behavior/typeahead.js +61 -0
- package/dist/01-tokens/focus-ring.css +1 -0
- package/dist/01-tokens/page.css +1 -0
- package/dist/01-tokens/polyfill.js +78 -0
- package/dist/01-tokens/scrollbar.css +1 -0
- package/dist/01-tokens/theme-toggle.js +61 -0
- package/dist/01-tokens/tokens.css +1 -0
- package/dist/01-tokens/typography.css +1 -0
- package/dist/02-primitives/badge/badge.css +1 -0
- package/dist/02-primitives/button/button.css +1 -0
- package/dist/02-primitives/card/card.css +1 -0
- package/dist/02-primitives/choice/choice.css +1 -0
- package/dist/02-primitives/combobox/combobox.css +1 -0
- package/dist/02-primitives/combobox/combobox.js +439 -0
- package/dist/02-primitives/date-range/date-range.css +1 -0
- package/dist/02-primitives/date-range/date-range.js +267 -0
- package/dist/02-primitives/input/input.css +1 -0
- package/dist/02-primitives/popover/popover.css +1 -0
- package/dist/02-primitives/popover/popover.js +257 -0
- package/dist/02-primitives/progress/progress.css +1 -0
- package/dist/02-primitives/select/select.css +1 -0
- package/dist/02-primitives/select/select.js +449 -0
- package/dist/02-primitives/separator/separator.css +1 -0
- package/dist/02-primitives/skeleton/skeleton.css +1 -0
- package/dist/02-primitives/switch/switch.css +1 -0
- package/dist/03-patterns/accordion/accordion.css +1 -0
- package/dist/03-patterns/accordion/accordion.js +219 -0
- package/dist/03-patterns/content/content.css +1 -0
- package/dist/03-patterns/drawer/drawer.css +1 -0
- package/dist/03-patterns/drawer/drawer.js +229 -0
- package/dist/03-patterns/dropdown/dropdown.css +1 -0
- package/dist/03-patterns/dropdown/dropdown.js +365 -0
- package/dist/03-patterns/form-validation/form-validation.css +1 -0
- package/dist/03-patterns/list/flip.js +117 -0
- package/dist/03-patterns/list/list.css +1 -0
- package/dist/03-patterns/nav/nav.css +1 -0
- package/dist/03-patterns/nav/nav.js +322 -0
- package/dist/03-patterns/nav/toc.js +76 -0
- package/dist/03-patterns/overlay/overlay.css +1 -0
- package/dist/03-patterns/overlay/overlay.js +398 -0
- package/dist/03-patterns/pagination/pagination.css +1 -0
- package/dist/03-patterns/pagination/pagination.js +273 -0
- package/dist/03-patterns/reveal/reveal.css +1 -0
- package/dist/03-patterns/reveal/reveal.js +138 -0
- package/dist/03-patterns/states/states.css +1 -0
- package/dist/03-patterns/tabs/tabs.css +1 -0
- package/dist/03-patterns/tabs/tabs.js +242 -0
- package/dist/03-patterns/tooltip/tooltip.css +1 -0
- package/dist/03-patterns/tooltip/tooltip.js +213 -0
- package/dist/03-patterns/tree/tree.css +1 -0
- package/dist/03-patterns/tree/tree.js +383 -0
- package/dist/04-recipes/analysis-report/analysis-report.css +1 -0
- package/dist/04-recipes/detail-page/detail-page.css +1 -0
- package/dist/04-recipes/report/report.css +1 -0
- package/dist/04-recipes/table/table.css +1 -0
- package/dist/04-recipes/tierA-tokens.css +1 -0
- package/dist/09-assets/bar/bar.css +1 -0
- package/dist/09-assets/bar/bar.js +222 -0
- package/dist/09-assets/echarts-adapter/echarts-adapter.js +185 -0
- package/dist/09-assets/model-viewer/model-viewer.css +1 -0
- package/dist/09-assets/model-viewer/model-viewer.js +320 -0
- package/dist/09-assets/scientific-plot/scientific-plot.css +1 -0
- package/dist/09-assets/scientific-plot/scientific-plot.js +568 -0
- package/dist/09-assets/sparkline/sparkline.css +1 -0
- package/dist/09-assets/sparkline/sparkline.js +265 -0
- package/dist/COSTS.md +56 -0
- package/docs/AI-CONTRACT.md +197 -0
- package/docs/BACKLOG.md +127 -0
- package/docs/BENCHMARK.md +252 -0
- package/docs/GUIDANCE.md +154 -0
- package/docs/INVARIANT.md +372 -0
- package/docs/LAYER-BASELINE.md +158 -0
- package/docs/RELEASING.md +311 -0
- package/docs/RFC-THEME-SCOPE.md +141 -0
- package/docs/ROADMAP.md +182 -0
- package/index.html +82 -0
- package/package.json +107 -4
- package/types/index.d.ts +310 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
report.css — 报告版式系统 v1(Report Design System)
|
|
3
|
+
============================================================================
|
|
4
|
+
|
|
5
|
+
🔴 它**不是**什么(边界写清楚,免得被当成万能模板)
|
|
6
|
+
---------------------------------------------------------------------------
|
|
7
|
+
不是 CMS / 不是出版引擎 / 不是「传个 Markdown 就出 PDF」的黑箱。
|
|
8
|
+
它只负责**一件**事:把"有结论、有数据、有出处"的内容排成能读、
|
|
9
|
+
且能被人逐条核对的样子。
|
|
10
|
+
|
|
11
|
+
🔴 它**是**什么
|
|
12
|
+
---------------------------------------------------------------------------
|
|
13
|
+
① 一份**共享基础**:字体角色、正文行长、页面网格、间距层级、
|
|
14
|
+
图表/表格说明、来源脚注 —— 六种东西,六种写法,一次定好
|
|
15
|
+
② 一个**科研 / 技术报告 profile**:图与表自动编号、章节可编号
|
|
16
|
+
③ 三套**版式**:杂志编辑 / 科研技术 / 金融研究
|
|
17
|
+
每套都有自己的取舍,README.md 里逐条写明"它放弃了什么"
|
|
18
|
+
|
|
19
|
+
🔴🔴 本轮**明确不做**(不要当成"还没实现")
|
|
20
|
+
---------------------------------------------------------------------------
|
|
21
|
+
· 分页 PDF / 印刷分页(页眉页脚、页边距、跨页不断行、孤行寡行控制)
|
|
22
|
+
⇒ 那是**独立目标**:它需要 @page / 实物打样 / PDF 引擎验证,
|
|
23
|
+
本文件一行都没有写,也不假装支持。
|
|
24
|
+
· 自动目录、脚注尾注、交叉引用、参考文献样式(BibTeX 之类)
|
|
25
|
+
⇒ 现在能给的只有 @media print 的**最小可读保障**
|
|
26
|
+
(去掉屏幕专属装饰、表格与图表不跨撕裂),那是"不更糟",不是"能出版"。
|
|
27
|
+
|
|
28
|
+
依赖:01-tokens/tokens.css(颜色、间距、字号、行长全部走令牌)
|
|
29
|
+
用法:ES3 级 CSS,零运行时依赖,纯样式
|
|
30
|
+
========================================================================== */
|
|
31
|
+
|
|
32
|
+
/* ==========================================================================
|
|
33
|
+
一 · 共享基础(三套版式共用,profile 只改变量与少数特性)
|
|
34
|
+
========================================================================== */
|
|
35
|
+
|
|
36
|
+
.rep {
|
|
37
|
+
/* --------- 六个可变量:改这六个就能换一套版式 --------- */
|
|
38
|
+
--rep-measure: var(--measure-prose); /* ① 正文行长:整套系统最关键的一个数 */
|
|
39
|
+
--rep-body-fs: var(--fs-base); /* ② 正文字号(金融版会往下压) */
|
|
40
|
+
--rep-title-fs: var(--fs-2xl); /* ③ 标题字号 */
|
|
41
|
+
--rep-lead-fs: var(--fs-lg); /* ④ 导语字号 */
|
|
42
|
+
--rep-body-lh: var(--lh-base); /* ⑤ 行距 */
|
|
43
|
+
--rep-sec-num: ''; /* ⑥ 章节是否编号(''= 不编号) */
|
|
44
|
+
|
|
45
|
+
font-family: var(--sans);
|
|
46
|
+
color: var(--text-primary);
|
|
47
|
+
font-size: var(--rep-body-fs);
|
|
48
|
+
line-height: var(--rep-body-lh);
|
|
49
|
+
max-width: 100%;
|
|
50
|
+
|
|
51
|
+
/* 🔴 边注列宽必须**在这里就地**收窄,不能沿用 --measure-aside(32em)。
|
|
52
|
+
把账算给自己看:库的标准页宽 `--measure-page` = 832px,
|
|
53
|
+
而正文 + 边注 + 间距 **共享这 832px**。取 32em(=576px) 当边注时,
|
|
54
|
+
正文只剩 832 − 576 − 36 = **220px ≈ 12em**(一行 12 个字,读不了)。
|
|
55
|
+
↑ 这是实测值不是推测:门禁里有一条判据专门盯这个数。
|
|
56
|
+
⇒ 边注定为 **14em**:832 − 252 − 36 = 544px ≈ **30em**,正文这一档才立得住。
|
|
57
|
+
代价:**14em 装不下大图表** ⇒ 大图请放进正文流里出血,别塞进边注。 */
|
|
58
|
+
--measure-aside: 14em;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* --------- 字体角色:六种,不多不少 ---------
|
|
62
|
+
⭐ 为什么钉死六种:报告里每多一种"自创角色",读者的解读负担就多一分。
|
|
63
|
+
发现自己在写第七种时,应该回头用**结构**(列表、表格、引用)而不是字号表达。 */
|
|
64
|
+
.rep__kicker, /* 眉题 / 栏目名 */
|
|
65
|
+
.rep__meta, /* 作者 · 日期 · 版本 */
|
|
66
|
+
.rep__cap, /* 图表说明 */
|
|
67
|
+
.rep__source, /* 来源脚注 */
|
|
68
|
+
.rep__note, /* 编者注 / 译者注 */
|
|
69
|
+
.rep__risk { /* 风险 / 合规披露 */
|
|
70
|
+
font-size: var(--fs-xs);
|
|
71
|
+
color: var(--text-secondary);
|
|
72
|
+
line-height: var(--lh-base);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* 🔴🔴 专门写成 `.rep .rep__title`(0,2,0)而不是 `.rep__title`(0,1,0):
|
|
76
|
+
下面是一个世纪的坑 —— 后文的 `.rep h2` / `.rep h3` 是 (0,1,1),
|
|
77
|
+
**单类名选择器会被它们压过去**。写成一层类是不够的,必须靠 descendant 提权,
|
|
78
|
+
否则 `--rep-title-fs` 这个「换版式的关键变量」会静默失效,标题被钉死在 fs-lg。
|
|
79
|
+
(实测取证:三套 profile 的标题都变成同一个 24px,变量一个都没生效。) */
|
|
80
|
+
.rep .rep__title {
|
|
81
|
+
font-size: var(--rep-title-fs);
|
|
82
|
+
line-height: var(--lh-tight);
|
|
83
|
+
letter-spacing: -0.01em;
|
|
84
|
+
max-width: var(--measure-title); /* 标题比正文窄:大字长时间扫视会累 */
|
|
85
|
+
margin: var(--sp-2) 0 0;
|
|
86
|
+
font-weight: 700;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.rep__kicker {
|
|
90
|
+
margin: 0;
|
|
91
|
+
color: var(--text-tertiary);
|
|
92
|
+
font-weight: 600;
|
|
93
|
+
letter-spacing: .06em;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.rep__standfirst, /* 导语 / 摘要首段 */
|
|
97
|
+
.rep__lede {
|
|
98
|
+
font-size: var(--rep-lead-fs);
|
|
99
|
+
line-height: var(--lh-loose);
|
|
100
|
+
max-width: var(--measure-lede);
|
|
101
|
+
color: var(--text-secondary);
|
|
102
|
+
margin: var(--sp-3) 0 0;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.rep__meta {
|
|
106
|
+
display: flex;
|
|
107
|
+
flex-wrap: wrap;
|
|
108
|
+
gap: var(--sp-1) var(--sp-3);
|
|
109
|
+
margin: var(--sp-3) 0 0;
|
|
110
|
+
padding: 0;
|
|
111
|
+
list-style: none;
|
|
112
|
+
color: var(--text-tertiary);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* --------- 页面网格:正文 + 边注 ---------
|
|
116
|
+
🔴 `minmax(0, 1fr)` 不是笔误:`1fr` 的最小值是 `auto`,
|
|
117
|
+
遇到宽表格会把整页撑出横向滚动条(本库踩过,analysis-report 里写明了)。 */
|
|
118
|
+
.rep__grid {
|
|
119
|
+
display: grid;
|
|
120
|
+
grid-template-columns: minmax(0, 1fr);
|
|
121
|
+
gap: var(--sp-4);
|
|
122
|
+
margin-top: var(--sp-5);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@media (min-width: 62rem) {
|
|
126
|
+
.rep__grid {
|
|
127
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, var(--measure-aside));
|
|
128
|
+
gap: var(--sp-6);
|
|
129
|
+
align-items: start;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* --------- 行长:施加在**内容块**上,不是施加在列容器上 ---------
|
|
134
|
+
🔴 为什么不能在 .rep__body 上压 max-width(0.11.2 改)
|
|
135
|
+
容器一压,任何子元素都不可能比它更宽 —— 于是 `.rep__fig--wide`
|
|
136
|
+
(README 里写着"大图请放进正文流")**永远是个空类**:
|
|
137
|
+
`max-width:none` 对一个本来就比父容器窄的元素毫无作用。
|
|
138
|
+
实测:金融版行长 30em@14px = 420px,1800 宽的折线图被压到 420px,
|
|
139
|
+
刻度字缩到 6px。当时是靠"把 --rep-measure 改成 50em"绕过去的,
|
|
140
|
+
那等于**把整页正文也放宽** —— 用错误换错误。
|
|
141
|
+
⇒ 正确做法:行长逐块施加(这也是 tokens.css 里 h1/p 的既有写法)。
|
|
142
|
+
文字保持 30em,图/表默认跟行长,加 `--wide` 才用满正文列。
|
|
143
|
+
⚠️ 只施加在 **font-size = 基准** 的块上:`30em` 里的 em 跟着**元素自身**
|
|
144
|
+
字号走,套到 h2(1.5rem)上会静默变成 30×1.5rem=720px。
|
|
145
|
+
标题本来就由 `--measure-title` 管,这里不重复。 */
|
|
146
|
+
.rep__body { max-width: none; }
|
|
147
|
+
|
|
148
|
+
.rep__body p,
|
|
149
|
+
.rep__body ul,
|
|
150
|
+
.rep__body ol,
|
|
151
|
+
.rep__body dl,
|
|
152
|
+
.rep__body .rep__fig,
|
|
153
|
+
.rep__body .table,
|
|
154
|
+
.rep__body .kf,
|
|
155
|
+
.rep__body .accordion,
|
|
156
|
+
.rep__body .rep__note,
|
|
157
|
+
.rep__body .rep__risk,
|
|
158
|
+
.rep__body .rep__keyline { max-width: var(--rep-measure); }
|
|
159
|
+
|
|
160
|
+
/* ⭐ 宽图 / 宽表通道:唯一的开关。
|
|
161
|
+
默认跟行长(读者不必左右甩头),需要看清细节时才用满正文列。
|
|
162
|
+
⚠️ 它只放宽到**正文列**为止,不越过边注 —— 越过边注是整页版式的事,
|
|
163
|
+
不是一张图的事。
|
|
164
|
+
🔴 特异性必须写成 `.rep__body .rep__wide`(0,2,0)而不是裸类(0,1,0):
|
|
165
|
+
上面那条压缩正文的规则是 0,2,0,裸类压不过它 ——
|
|
166
|
+
**加了 class 却没生效**,是比没有这个 class 更难查的一种失败。
|
|
167
|
+
(实测:写成裸类时 `.rep__fig--wide` 的量出来还是 420px。) */
|
|
168
|
+
.rep__body .rep__fig--wide,
|
|
169
|
+
.rep__body .rep__wide { max-width: none; }
|
|
170
|
+
.rep__aside { color: var(--text-secondary); }
|
|
171
|
+
|
|
172
|
+
/* --------- 间距层级:五级,全部走令牌 ---------
|
|
173
|
+
section > figure > paragraph。**层级之间用间距表达**,不靠加分割线。 */
|
|
174
|
+
.rep__sec { margin-top: var(--sp-7); }
|
|
175
|
+
.rep__sec > :first-child { margin-top: 0; }
|
|
176
|
+
|
|
177
|
+
/* --------- 小节标题:只支持两级(h2 用作文章标题,h3 用作小节)---------
|
|
178
|
+
🔴 为什么钉死两级:报告里出现第四级标题,通常意味着该拆的是**文档**,
|
|
179
|
+
而不是再给一级字号。这里刻意**不给 h4 及更深层级写任何规则** ——
|
|
180
|
+
没定义就是没定义,不要靠浏览器默认值蒙混过去。 */
|
|
181
|
+
.rep h2 {
|
|
182
|
+
font-size: var(--fs-xl);
|
|
183
|
+
line-height: var(--lh-tight);
|
|
184
|
+
margin: 0 0 var(--sp-3);
|
|
185
|
+
max-width: var(--measure-title);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.rep h3 {
|
|
189
|
+
font-size: var(--fs-lg);
|
|
190
|
+
line-height: var(--lh-tight);
|
|
191
|
+
margin: var(--sp-5) 0 var(--sp-2);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.rep__body p { margin: 0 0 var(--sp-3); }
|
|
195
|
+
.rep__body p:last-child { margin-bottom: 0; }
|
|
196
|
+
|
|
197
|
+
/* --------- 图表与表格的说明:说明不是装饰,是**可核对性** ---------
|
|
198
|
+
⭐ 一条说明必须回答三件事:这是什么、数从哪来、有没有被处理过。
|
|
199
|
+
三件事少一件,这张图就没法被别人复核。 */
|
|
200
|
+
.rep__fig {
|
|
201
|
+
margin: var(--sp-5) 0;
|
|
202
|
+
padding: 0;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.rep__cap {
|
|
206
|
+
margin: var(--sp-2) 0 0;
|
|
207
|
+
/* 🔴 technical profile 会在这里加"图 N ·"前缀(见下) */
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.rep__source {
|
|
211
|
+
margin: var(--sp-2) 0 0;
|
|
212
|
+
padding: var(--sp-2) 0 0;
|
|
213
|
+
border-top: 1px solid var(--border-decor);
|
|
214
|
+
color: var(--text-tertiary);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.rep__source ol,
|
|
218
|
+
.rep__source ul { margin: var(--sp-1) 0 0; padding-inline-start: 1.4em; }
|
|
219
|
+
.rep__source li { margin-bottom: var(--sp-1); }
|
|
220
|
+
|
|
221
|
+
/* --------- 来源脚注(整篇):列编号,方便别人按号去查 --------- */
|
|
222
|
+
.rep__sources { margin-top: var(--sp-7); }
|
|
223
|
+
|
|
224
|
+
/* ==========================================================================
|
|
225
|
+
二 · profile:科研 / 技术报告
|
|
226
|
+
--------------------------------------------------------------------------
|
|
227
|
+
启用的两件事:**图/表自动编号** + **章节编号**。
|
|
228
|
+
代价:正文行长被压到最窄、行距最松 —— 这是故意的,
|
|
229
|
+
技术报告的正确读法是被逐段核对,不是被快速通读。
|
|
230
|
+
========================================================================== */
|
|
231
|
+
|
|
232
|
+
.rep--technical {
|
|
233
|
+
--rep-measure: var(--measure-prose);
|
|
234
|
+
--rep-body-lh: var(--lh-loose);
|
|
235
|
+
--rep-sec-num: counter(rep-sec, decimal) ' · ';
|
|
236
|
+
counter-reset: rep-sec rep-fig rep-tab;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/* 🔴 只对**正文小节**编号,不编号文章标题(`h2.rep__title`)、也不编号
|
|
240
|
+
边注与来源区。写成 `.rep__sec > h3` 而不是 `h3`:前者表达的是
|
|
241
|
+
「属于正文的一个小节」,后者会把边注里的「关键读数」也算成第几节。 */
|
|
242
|
+
.rep--technical .rep__sec > h3::before {
|
|
243
|
+
content: var(--rep-sec-num);
|
|
244
|
+
counter-increment: rep-sec;
|
|
245
|
+
color: var(--text-tertiary);
|
|
246
|
+
font-variant-numeric: tabular-nums;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.rep--technical .rep__cap::before {
|
|
250
|
+
content: '图 ' counter(rep-fig) ' · ';
|
|
251
|
+
counter-increment: rep-fig;
|
|
252
|
+
font-weight: 600;
|
|
253
|
+
color: var(--text-tertiary);
|
|
254
|
+
font-variant-numeric: tabular-nums;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* 表格说明单独一路计数:图 3 和表 3 不是同一个东西 */
|
|
258
|
+
.rep--technical .rep__cap--table::before {
|
|
259
|
+
content: '表 ' counter(rep-tab) ' · ';
|
|
260
|
+
counter-increment: rep-tab;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/* ==========================================================================
|
|
264
|
+
三 · profile:杂志 / 编辑向
|
|
265
|
+
--------------------------------------------------------------------------
|
|
266
|
+
取舍:行长放宽(读起来快)、标题最大、允许跨栏出血的宽图与引语块。
|
|
267
|
+
**不给图编号**(编号是技术文档的语法,放在这里只会打断阅读节奏)。
|
|
268
|
+
⇒ 代价:不适合承担审计级追溯。要追溯请换 technical。
|
|
269
|
+
========================================================================== */
|
|
270
|
+
|
|
271
|
+
.rep--magazine {
|
|
272
|
+
--rep-measure: 42em;
|
|
273
|
+
/* 刻意**不改** --rep-title-fs:基础值(fs-2xl)已经是三套里最大的一档,
|
|
274
|
+
杂志版的气口在「行长放宽 + 导语放大 + 出血图」三处,不在标题字号。
|
|
275
|
+
🟡 上一版这里把 fs-2xl 抄了一遍 = 与基础值重复,删掉:重复的声明
|
|
276
|
+
会让人误以为「杂志版专门调过标题」,实际调是没调。 */
|
|
277
|
+
--rep-lead-fs: var(--fs-xl);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* 🟡 删掉 `.rep--magazine .rep__fig--wide { max-width: none }`(0.11.2):
|
|
281
|
+
它注释写着"出血:图可以比正文宽",但当时正文列整体被压到 42em,
|
|
282
|
+
子元素再宽的 max-width 也越不过父容器 ⇒ 这条规则**从来没有生效过**。
|
|
283
|
+
现在宽图通道在基础层统一实现(见上方 `.rep__fig--wide, .rep__wide`),
|
|
284
|
+
三个 profile 共用,不需要每套再写一遍。 */
|
|
285
|
+
|
|
286
|
+
/* 🔴 为什么这里保留彩色竖条(0.8.4 · 全库竖条政策)
|
|
287
|
+
本库整体立场是去掉纯装饰竖条(见 typography.css 的删除记录)。
|
|
288
|
+
引语块是**例外**,因为竖条在这里是**内容标记**:
|
|
289
|
+
"这是摘出来的原话",与 `.prose > blockquote`(content.css)同一个惯例。
|
|
290
|
+
去掉它,引语就只是"字号大一点的正文",读者要靠缩进猜它是引的。 */
|
|
291
|
+
.rep__pull {
|
|
292
|
+
margin: var(--sp-5) 0;
|
|
293
|
+
padding-inline-start: var(--sp-4);
|
|
294
|
+
border-inline-start: 3px solid var(--accent);
|
|
295
|
+
font-size: var(--fs-xl);
|
|
296
|
+
line-height: var(--lh-tight);
|
|
297
|
+
color: var(--text-primary);
|
|
298
|
+
max-width: var(--measure-pull);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/* ==========================================================================
|
|
302
|
+
四 · profile:金融研究
|
|
303
|
+
--------------------------------------------------------------------------
|
|
304
|
+
取舍:字号与行距往下压 ⇒ 一屏塞得下更多数字;
|
|
305
|
+
正文列更窄 ⇒ 读者能在数字和文字之间快速来回。
|
|
306
|
+
**必须有风险披露区** —— 没有它的研究报告是不完整的作品。
|
|
307
|
+
⇒ 代价:不适合长论证。超过两屏的推理在这里会被读者跳过。
|
|
308
|
+
========================================================================== */
|
|
309
|
+
|
|
310
|
+
.rep--finance {
|
|
311
|
+
--rep-measure: 30em;
|
|
312
|
+
--rep-body-fs: var(--fs-sm);
|
|
313
|
+
--rep-body-lh: var(--lh-base);
|
|
314
|
+
--rep-title-fs: var(--fs-xl);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/* 关键数字条:整篇的结论先摆在前面(AI 和人都先看这行) */
|
|
318
|
+
.rep__keyline {
|
|
319
|
+
display: grid;
|
|
320
|
+
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
|
|
321
|
+
gap: var(--sp-3);
|
|
322
|
+
margin: var(--sp-4) 0;
|
|
323
|
+
padding: var(--sp-3);
|
|
324
|
+
background: var(--surface-sunken);
|
|
325
|
+
border-radius: var(--r-md);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.rep__keyline dt {
|
|
329
|
+
font-size: var(--fs-xs);
|
|
330
|
+
color: var(--text-tertiary);
|
|
331
|
+
margin: 0;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.rep__keyline dd {
|
|
335
|
+
margin: var(--sp-1) 0 0;
|
|
336
|
+
font-size: var(--fs-lg);
|
|
337
|
+
font-weight: 700;
|
|
338
|
+
font-variant-numeric: tabular-nums; /* 数字要能竖着比 */
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.rep__risk {
|
|
342
|
+
margin-top: var(--sp-5);
|
|
343
|
+
padding: var(--sp-3);
|
|
344
|
+
border: 1px solid var(--border-decor);
|
|
345
|
+
border-radius: var(--r-md);
|
|
346
|
+
color: var(--text-secondary);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.rep__risk strong { color: var(--text-primary); }
|
|
350
|
+
|
|
351
|
+
/* ==========================================================================
|
|
352
|
+
五 · 打印:只做"不更糟",**不做分页**
|
|
353
|
+
--------------------------------------------------------------------------
|
|
354
|
+
⚠️ 这是本轮对打印的全部承诺:**去掉屏幕专属装饰**、
|
|
355
|
+
**图表与表格不跨撕裂**。关于 @page / 页眉页脚 / 页码 / 跨页控制,
|
|
356
|
+
本版本一律不管 —— 那是独立的"分页 PDF"目标。
|
|
357
|
+
========================================================================== */
|
|
358
|
+
@media print {
|
|
359
|
+
.rep__aside { display: none; } /* 屏幕边注在纸上没地方放 */
|
|
360
|
+
.rep__grid { display: block; }
|
|
361
|
+
.rep__fig,
|
|
362
|
+
.rep table { break-inside: avoid; }
|
|
363
|
+
.rep__pull { border-inline-start-width: 2px; }
|
|
364
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# table · 专业数据表格
|
|
2
|
+
|
|
3
|
+
一套表格基础 + 三种用途预设。**数字怎么显示由列定义决定**,不由数值大小猜测。
|
|
4
|
+
|
|
5
|
+
## 文件
|
|
6
|
+
|
|
7
|
+
| 文件 | 说明 |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `table.css` | 表格基础样式 + 三种预设 + 多级表头 / 表题 / 脚注 |
|
|
10
|
+
| `demo.html` | 可运行示例(含格式自证区) |
|
|
11
|
+
| `README.md` | 本文件 |
|
|
12
|
+
|
|
13
|
+
无 JS 依赖:所有交互逻辑在示例页里演示,组件本身是纯 CSS。
|
|
14
|
+
|
|
15
|
+
## 三种预设
|
|
16
|
+
|
|
17
|
+
| 预设 | 用于 | 关键差异 |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| (默认 / `.table--financial`) | 业务与财务数据 | 粘性表头、数字右对齐 + 等宽数字、行高亮 |
|
|
20
|
+
| `.table--academic` | 学术出版 | **三线表**:去掉竖线/斑马纹/行分隔线,只留顶线、表头下线、底线 |
|
|
21
|
+
| `.table--stats` | 统计与实验结果 | 估计值 / 标准误 / 置信区间 / p 值各有位置与样式 |
|
|
22
|
+
|
|
23
|
+
## 列定义(示例页里的用法)
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
var COLS = [
|
|
27
|
+
{ key: 'revenue', label: '营业收入', format: 'currency', precision: 0, unit: '万元' },
|
|
28
|
+
{ key: 'margin', label: '毛利率', format: 'percent', precision: 1 },
|
|
29
|
+
{ key: 'change', label: '同比', format: 'signed-percent', precision: 1 },
|
|
30
|
+
{ key: 'temp', label: '温度', format: 'decimal', precision: 2, unit: '°C' }
|
|
31
|
+
];
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
| `format` | 输入 → 显示 | 正数加 `+`? |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| `text` | 原样 | — |
|
|
37
|
+
| `integer` | `1505600` → `1,505,600` | 否 |
|
|
38
|
+
| `decimal` | `0.25` → `0.25`(**绝不**乘 100) | 否 |
|
|
39
|
+
| `currency` | `1505600` → `1,505,600`(金额) | **否** |
|
|
40
|
+
| `percent` | `0.854` → `85.4%`(输入是比例) | **否** |
|
|
41
|
+
| `signed-percent` | `0.163` → `+16.3%` / `-0.008` → `−0.8%` | **是** |
|
|
42
|
+
|
|
43
|
+
两条硬规则:
|
|
44
|
+
|
|
45
|
+
1. **不按数值大小推断语义**。`0.25` 是比例还是普通测量值,只能由列定义说,
|
|
46
|
+
不能靠「小于 1 就乘以 100」。示例页第 4 节就是这条的自证。
|
|
47
|
+
2. **正负号只按列语义**。营收、成本、毛利率这类「量」的正数**没有** `+`;
|
|
48
|
+
只有 `signed-*`(同比/变化量)才加。负数一律用真减号 `−`(不是连字符 `-`)。
|
|
49
|
+
|
|
50
|
+
## 无障碍
|
|
51
|
+
|
|
52
|
+
- 数据表用 `<th scope="col">` / `<th scope="row">`;多级表头第一层用 `scope="colgroup"`。
|
|
53
|
+
复杂表格可用 `id` + `headers` 建立显式关联(本示例未用到,但结构支持)。
|
|
54
|
+
- 排序状态放在 `<th aria-sort="ascending|descending">`,**不是**放在按钮上。
|
|
55
|
+
- 正负**不只靠颜色**:颜色之外还有 `+` / `−` 符号(WCAG 1.4.1)。
|
|
56
|
+
- 粘性表头的 `z-index` 走令牌;`border-collapse: separate` 是 sticky 生效的前提。
|
|
57
|
+
|
|
58
|
+
## 已知限制
|
|
59
|
+
|
|
60
|
+
- 不做虚拟滚动。行数上限交给调用方(> 200 行请配合分页)。
|
|
61
|
+
- 排序 / 筛选 / 分页行为**不与样式层捆绑** —— 需要时由调用方接自己的数据层。
|
|
62
|
+
- 单位默认标在**列头**,不是每格重复(一列 20 个「万元」只会增加噪音)。
|
|
63
|
+
若某列确需逐格带单位,调用方自行在格式化时拼接。
|
|
64
|
+
|
|
65
|
+
### 🔴 单位的写法:列名 +(单位),括号不能省
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
✅ 抗拉强度 (MPa) 伸长率 (%) 时效 (100 °C)
|
|
69
|
+
❌ 抗拉强度 MPa 伸长率 % 时效 100 °C
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**这不是审美选择,是学科规范要求**,五处权威口径一致:
|
|
73
|
+
|
|
74
|
+
| 来源 | 要求 |
|
|
75
|
+
|---|---|
|
|
76
|
+
| **GB/T 7713.2-2022**《学术论文编写规则》 | 同时用量与单位表示时,采用「**量的符号或名称/单位符号**」的标准化形式 |
|
|
77
|
+
| **CY/T 170—2019**《学术出版规范 表格》 | 表头用「量的名称或符号/单位符号」;且表身单元格内**不宜带单位** |
|
|
78
|
+
| **Science** Author Guidelines | every column should have a heading, **followed by a unit of measure (if any) in parentheses** |
|
|
79
|
+
| **IEEE** Standards Style Manual 14.3.1 | units shall be provided **in parentheses**, or preceded by a solidus(`E (V)` / `E/V`)|
|
|
80
|
+
|
|
81
|
+
另外两条同源要求,本组件一并遵守:
|
|
82
|
+
|
|
83
|
+
- **同栏单位不得变化**(IEEE:不得把 Ω 与 MΩ 混用、mm 与 cm 混用)
|
|
84
|
+
- **表身单元格内不带单位**——只在列头标一次
|
|
85
|
+
|
|
86
|
+
### 为什么括号和同字号都很重要
|
|
87
|
+
|
|
88
|
+
- **括号**:它把"列名"与"单位"在语法上分成两截。裸写 `抗拉强度 MPa`
|
|
89
|
+
读起来是两个并列的词,读者要停下来判断哪个是量名。
|
|
90
|
+
- **同字号**(`font-size: inherit`):单位若比列名小一号,视觉上就成了
|
|
91
|
+
"另一行的小注"而不是"这一列的量纲"。规范里单位与列名同字号,
|
|
92
|
+
只用**括号**(或可选斜体)区分即可。
|
|
93
|
+
|
|
94
|
+
`.table__unit` 自带 `margin-inline-start`,所以源码里写
|
|
95
|
+
`<span class="table__unit">MPa</span>` 渲染出来就是 `抗拉强度 (MPa)` ——
|
|
96
|
+
**组件负责加括号,不要求每个调用方记得加**(要求调用方做,迟早漏一处)。
|
|
97
|
+
|
|
98
|
+
## 预览
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
python -m http.server 8000
|
|
102
|
+
# http://127.0.0.1:8000/04-recipes/table/demo.html
|
|
103
|
+
```
|