@topmindspace/tms-skills 0.1.0

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 (99) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +21 -0
  3. package/README.md +102 -0
  4. package/bin/tms-skills.js +160 -0
  5. package/package.json +48 -0
  6. package/top-ppt-html/README.md +254 -0
  7. package/top-ppt-html/SKILL.md +111 -0
  8. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +3926 -0
  9. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.model.json +168 -0
  10. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.html +3926 -0
  11. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.model.json +168 -0
  12. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.html +4325 -0
  13. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.model.json +321 -0
  14. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.html +4325 -0
  15. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.model.json +321 -0
  16. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.html +4325 -0
  17. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.model.json +321 -0
  18. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.html +5527 -0
  19. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.model.json +914 -0
  20. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.html +5527 -0
  21. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.model.json +914 -0
  22. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.html +5527 -0
  23. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.model.json +914 -0
  24. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.html +5527 -0
  25. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.model.json +914 -0
  26. package/top-ppt-html/assets/pptx-export.js +1944 -0
  27. package/top-ppt-html/assets/style-gallery.html +589 -0
  28. package/top-ppt-html/assets/templates/architecture.html +3728 -0
  29. package/top-ppt-html/assets/templates/engine.css +840 -0
  30. package/top-ppt-html/assets/templates/presentation.html +3738 -0
  31. package/top-ppt-html/assets/templates/research.html +4017 -0
  32. package/top-ppt-html/assets/templates/ui.js +520 -0
  33. package/top-ppt-html/assets/theme-overview-architecture.png +0 -0
  34. package/top-ppt-html/assets/theme-overview-presentation.png +0 -0
  35. package/top-ppt-html/assets/theme-overview-research.png +0 -0
  36. package/top-ppt-html/assets/theme-overview.png +0 -0
  37. package/top-ppt-html/evals/prompts.csv +15 -0
  38. package/top-ppt-html/evals/rubric.schema.json +25 -0
  39. package/top-ppt-html/evals/run_evals.py +220 -0
  40. package/top-ppt-html/evals/trace.example.json +16 -0
  41. package/top-ppt-html/package.json +35 -0
  42. package/top-ppt-html/references/charts-basic.md +624 -0
  43. package/top-ppt-html/references/charts-discipline.md +108 -0
  44. package/top-ppt-html/references/charts-extended.md +482 -0
  45. package/top-ppt-html/references/charts.md +28 -0
  46. package/top-ppt-html/references/components-atoms.md +624 -0
  47. package/top-ppt-html/references/components.md +30 -0
  48. package/top-ppt-html/references/content-rules.md +490 -0
  49. package/top-ppt-html/references/design-system-engine.md +235 -0
  50. package/top-ppt-html/references/design-system.md +478 -0
  51. package/top-ppt-html/references/failure-modes.md +214 -0
  52. package/top-ppt-html/references/high-fidelity.md +127 -0
  53. package/top-ppt-html/references/icons.md +397 -0
  54. package/top-ppt-html/references/industry-benchmark.md +105 -0
  55. package/top-ppt-html/references/infographics-stats.md +308 -0
  56. package/top-ppt-html/references/infographics-structure.md +226 -0
  57. package/top-ppt-html/references/infographics.md +43 -0
  58. package/top-ppt-html/references/layout-grammar.md +315 -0
  59. package/top-ppt-html/references/layouts-architecture.md +108 -0
  60. package/top-ppt-html/references/layouts-combo.md +600 -0
  61. package/top-ppt-html/references/layouts-research.md +160 -0
  62. package/top-ppt-html/references/modes.md +254 -0
  63. package/top-ppt-html/references/outline-design.md +275 -0
  64. package/top-ppt-html/references/playbook.md +266 -0
  65. package/top-ppt-html/references/pptx-export.md +209 -0
  66. package/top-ppt-html/references/reform-plan.md +252 -0
  67. package/top-ppt-html/references/styles.md +370 -0
  68. package/top-ppt-html/references/tech-design.md +138 -0
  69. package/top-ppt-html/scripts/audit_css.py +109 -0
  70. package/top-ppt-html/scripts/audit_docs.py +176 -0
  71. package/top-ppt-html/scripts/audit_skill.py +220 -0
  72. package/top-ppt-html/scripts/audit_styles.py +351 -0
  73. package/top-ppt-html/scripts/build_examples.py +2276 -0
  74. package/top-ppt-html/scripts/build_pptx.js +2380 -0
  75. package/top-ppt-html/scripts/capture_theme_overview.js +78 -0
  76. package/top-ppt-html/scripts/checks_html.py +127 -0
  77. package/top-ppt-html/scripts/cross_verify.py +294 -0
  78. package/top-ppt-html/scripts/env_probe.py +158 -0
  79. package/top-ppt-html/scripts/extract_model.py +210 -0
  80. package/top-ppt-html/scripts/extract_snippet.py +374 -0
  81. package/top-ppt-html/scripts/gen_channel_a.js +214 -0
  82. package/top-ppt-html/scripts/layout-constants.json +3377 -0
  83. package/top-ppt-html/scripts/layout_slots.json +830 -0
  84. package/top-ppt-html/scripts/lib_layout_regions.js +412 -0
  85. package/top-ppt-html/scripts/measure_height.py +178 -0
  86. package/top-ppt-html/scripts/model-schema.json +547 -0
  87. package/top-ppt-html/scripts/negative_tests.py +307 -0
  88. package/top-ppt-html/scripts/package_skill.py +291 -0
  89. package/top-ppt-html/scripts/prepare_images.py +341 -0
  90. package/top-ppt-html/scripts/probe_image_export.py +188 -0
  91. package/top-ppt-html/scripts/quality_gate.py +301 -0
  92. package/top-ppt-html/scripts/regression.py +308 -0
  93. package/top-ppt-html/scripts/render_compare.py +275 -0
  94. package/top-ppt-html/scripts/render_from_model.py +698 -0
  95. package/top-ppt-html/scripts/scaffold_report.py +1054 -0
  96. package/top-ppt-html/scripts/section-file-map.json +105 -0
  97. package/top-ppt-html/scripts/sync_runtime.py +662 -0
  98. package/top-ppt-html/scripts/validate_pptx.py +1510 -0
  99. package/top-ppt-html/scripts/validate_report.py +1456 -0
@@ -0,0 +1,235 @@
1
+ # 设计系统 · 引擎 CSS 实现目录(维护者 / 深挖时读)
2
+
3
+ > 顶栏 / 卡片 / 列表 / 表格 / 章节头 / 页脚 / Agenda / 动效等**类实现细节**。
4
+ > 生成报告请用 `components-atoms.md` / `layouts-*.md` 的写法;本文件对应
5
+ > `assets/templates/engine.css` 注入源,改 CSS 后必跑 `sync_runtime.py`。
6
+ > **禁止**把本文件当生成时的默认阅读对象。
7
+
8
+ ## 5. 顶栏 + 主题切换
9
+
10
+ ```css
11
+ .bar{position:sticky;top:0;z-index:50;height:var(--bar-h);
12
+ background:color-mix(in srgb,var(--bg) 86%,transparent);
13
+ backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);
14
+ border-bottom:1px solid var(--border-soft)}
15
+ .bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4)}
16
+ .brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0}
17
+ .brand__mark{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent);
18
+ color:var(--accent-on);display:grid;place-items:center;font-size:13px;font-weight:700}
19
+ .brand__title{font-size:var(--fs-sm);font-weight:600;color:var(--text);
20
+ white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
21
+ .brand__sub{font-size:var(--fs-xs);color:var(--text-3);
22
+ white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
23
+ .nav{display:flex;align-items:center;gap:var(--sp-1)}
24
+ .nav a{padding:8px 14px;border-radius:var(--r-full);color:var(--text-2);text-decoration:none;
25
+ font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background-color .18s,color .18s}
26
+ .nav a:hover{background:var(--surface-2);color:var(--text)}
27
+ @media (max-width:1120px){.nav{display:none}}
28
+ .iconbtn{width:40px;height:40px;flex:none;display:grid;place-items:center;
29
+ border:1px solid var(--border);border-radius:var(--r-full);background:transparent;
30
+ color:var(--text-2);cursor:pointer;transition:background-color .18s,color .18s}
31
+ .iconbtn:hover{background:var(--surface-2);color:var(--text)}
32
+ .iconbtn svg{width:19px;height:19px}
33
+ .icon-sun,.icon-moon{display:none}
34
+ html[data-theme="light"] .icon-moon{display:block}
35
+ html[data-theme="dark"] .icon-sun{display:block}
36
+ ```
37
+
38
+ ## 6. 卡片 / 按钮 / 徽标 / 指标卡
39
+
40
+ ```css
41
+ .card{background:var(--surface);border:1px solid var(--border-soft);border-radius:var(--r-lg);
42
+ padding:clamp(20px,2vw,30px);transition:border-color .2s,box-shadow .2s,background-color .28s}
43
+ .card:hover{border-color:var(--border);box-shadow:var(--shadow-1)}
44
+ .card--flat{background:var(--surface-1);border-color:transparent}
45
+ .card--flat:hover{background:var(--surface-2)}
46
+ .card--accent{background:var(--accent-soft);border-color:transparent}
47
+ .card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}
48
+ .card__ico{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent-soft);
49
+ color:var(--accent-text);display:grid;place-items:center}
50
+ .card__ico svg{width:18px;height:18px}
51
+
52
+ .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:48px;
53
+ padding-inline:26px;border-radius:var(--r-full);font-size:var(--fs-sm);font-weight:500;
54
+ text-decoration:none;cursor:pointer;white-space:nowrap;border:1px solid transparent;
55
+ transition:background-color .2s,box-shadow .2s,transform .2s}
56
+ .btn:hover{transform:translateY(-1px)}
57
+ .btn--primary{background:var(--accent);color:var(--accent-on)}
58
+ .btn--primary:hover{box-shadow:var(--shadow-2)}
59
+ .btn--soft{background:var(--accent-soft);color:var(--accent-text)}
60
+ .btn--ghost{background:transparent;color:var(--text);border-color:var(--border)}
61
+ .btn--onDark{background:var(--surface);color:var(--text)}
62
+
63
+ .chip{display:inline-flex;align-items:center;gap:6px;height:30px;padding-inline:13px;
64
+ border-radius:var(--r-full);background:var(--surface-2);color:var(--text-2);
65
+ font-size:var(--fs-xs);font-weight:500;white-space:nowrap}
66
+ .chip--accent{background:var(--accent-soft);color:var(--accent-text)}
67
+ .chip--line{background:transparent;border:1px solid var(--border);color:var(--text-2)}
68
+
69
+ .metric{background:var(--surface);border:1px solid var(--border-soft);border-radius:var(--r-lg);
70
+ padding:clamp(18px,1.7vw,26px);display:flex;flex-direction:column;gap:var(--sp-2)}
71
+ .metric:hover{border-color:var(--border);box-shadow:var(--shadow-1)}
72
+ .metric__v{display:flex;align-items:baseline;gap:4px;color:var(--text)}
73
+ .metric__v small{font-size:.42em;font-weight:500;letter-spacing:0;color:var(--text-3)}
74
+ .metric__k{font-size:var(--fs-sm);color:var(--text-2);font-weight:500}
75
+ .metric__n{font-size:var(--fs-xs);color:var(--text-3);line-height:1.5}
76
+ .metric--warn .metric__v{color:var(--accent)}
77
+ ```
78
+
79
+ ## 7. 列表(含流程箭头 / 对勾 / 序号)
80
+
81
+ ```css
82
+ .ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--sp-4)}
83
+ .ul li{position:relative;padding-left:30px;color:var(--text-2);font-size:var(--fs-body);line-height:1.65}
84
+ .ul li::before{content:"";position:absolute;left:0;top:.52em;width:7px;height:7px;
85
+ border-radius:50%;background:var(--accent)}
86
+ .ul li strong{color:var(--text);font-weight:600}
87
+ .ul--flow li::before{content:"→";width:auto;height:auto;background:none;color:var(--accent);
88
+ font-weight:700;top:0;left:0}
89
+ .ul--check li::before{width:18px;height:18px;top:.18em;background:var(--accent-soft);
90
+ color:var(--accent-text);content:"✓";font-size:11px;font-weight:700;display:grid;place-items:center}
91
+ .ul--num{counter-reset:n}.ul--num li{padding-left:34px;counter-increment:n}
92
+ .ul--num li::before{content:counter(n);width:22px;height:22px;top:.06em;border-radius:50%;
93
+ background:var(--accent-soft);color:var(--accent-text);font-size:11px;font-weight:700;
94
+ display:grid;place-items:center}
95
+ ```
96
+
97
+ ## 8. 表格 / 引言 / 时间线 / 图示
98
+
99
+ ```css
100
+ .tbl-wrap{border:1px solid var(--border-soft);border-radius:var(--r-lg);overflow:hidden;
101
+ background:var(--surface);overflow-x:auto}
102
+ table{width:100%;border-collapse:collapse;min-width:min(720px,100%)}
103
+ thead th{background:var(--surface-1);color:var(--text-2);font-size:var(--fs-xs);font-weight:600;
104
+ letter-spacing:.04em;text-transform:uppercase;text-align:left;padding:15px 20px;
105
+ border-bottom:1px solid var(--border);white-space:nowrap}
106
+ tbody td{padding:17px 20px;border-bottom:1px solid var(--border-soft);font-size:var(--fs-sm);
107
+ color:var(--text-2);vertical-align:top;line-height:1.6}
108
+ tbody tr:last-child td{border-bottom:none}
109
+ tbody tr:hover{background:var(--surface-1)}
110
+ td strong{color:var(--text);font-weight:600}
111
+ td.k{color:var(--text);font-weight:500;white-space:nowrap}
112
+ td.num{font-variant-numeric:tabular-nums}
113
+
114
+ .note{display:flex;gap:var(--sp-4);padding:clamp(20px,2vw,28px);border-radius:var(--r-lg);
115
+ background:var(--accent-soft);border-left:3px solid var(--accent)}
116
+ .note__ico{width:26px;height:26px;flex:none;border-radius:50%;background:var(--accent);
117
+ color:var(--accent-on);display:grid;place-items:center;font-size:13px;font-weight:700;font-style:normal}
118
+ .note__t{font-size:var(--fs-h3);font-weight:600;color:var(--text);margin-bottom:6px}
119
+
120
+ .tl{position:relative;padding-left:30px}
121
+ .tl::before{content:"";position:absolute;left:7px;top:10px;bottom:10px;width:2px;
122
+ background:var(--border);border-radius:2px}
123
+ .tl__i{position:relative;padding-bottom:var(--sp-6)}
124
+ .tl__i:last-child{padding-bottom:0}
125
+ .tl__d{position:absolute;left:-30px;top:5px;width:16px;height:16px;border-radius:50%;
126
+ background:var(--surface);border:3px solid var(--border)}
127
+ .tl__i--now .tl__d{border-color:var(--accent);background:var(--accent)}
128
+ .tl__i--done .tl__d{border-color:var(--accent)}
129
+ .tl__t{font-size:var(--fs-h3);font-weight:600;color:var(--text);margin-bottom:6px}
130
+ .tl__l{font-size:var(--fs-xs);font-weight:700;letter-spacing:.08em;text-transform:uppercase;
131
+ color:var(--accent-text);margin-bottom:2px}
132
+
133
+ .fig{background:var(--surface);border:1px solid var(--border-soft);border-radius:var(--r-xl);
134
+ padding:clamp(20px,2.2vw,36px);overflow:hidden}
135
+ .fig__cap{text-align:center;margin-bottom:var(--sp-4);font-size:var(--fs-sm);
136
+ color:var(--text-3);font-weight:500}
137
+ .fig svg{display:block;width:100%;height:auto}
138
+ ```
139
+
140
+ ## 10. 章节头 / 页脚 / 动效 / 打印
141
+
142
+ ```css
143
+ .shead{margin-bottom:clamp(28px,3.4vh,48px);max-width:940px}
144
+ .shead__title{margin-block:var(--sp-3) var(--sp-4)}
145
+ .shead__desc{max-width:900px}
146
+ .shead--center{margin-inline:auto;text-align:center}
147
+ .shead--center .shead__desc{margin-inline:auto}
148
+ .band--deep .t-lead,.band--deep .t-body{color:var(--deep-fg-2)}
149
+ .band--deep .t-eyebrow{color:color-mix(in srgb,var(--accent) 40%,#fff)}
150
+
151
+ .foot{padding-block:clamp(40px,5vh,64px);border-top:1px solid var(--border-soft);
152
+ background:var(--surface-1)}
153
+ .foot__in{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-5);flex-wrap:wrap}
154
+
155
+ @media (prefers-reduced-motion:no-preference){.rv{opacity:0;transform:translateY(14px)}
156
+ .rv.in{opacity:1;transform:none;transition:opacity var(--dur-long) var(--ease-emphasized),
157
+ transform var(--dur-long) var(--ease-emphasized)}}
158
+ @media (prefers-reduced-motion:reduce){.rv{opacity:1;transform:none}html{scroll-behavior:auto}}
159
+ @media print{.rv{opacity:1!important;transform:none!important}
160
+ .band{padding-block:24px;break-inside:avoid}body{background:#fff;color:#000}
161
+ .pager{display:none!important}}
162
+ ```
163
+
164
+ ## 11. PPT 翻页导航(页码指示)
165
+
166
+ 右侧固定页码圆点 + 计数,点击跳转;方向键翻页由公共 UI 脚本(`assets/templates/ui.js`,注入各模板)驱动。
167
+
168
+ ```css
169
+ /* 页码指示(固定右侧) */
170
+ .pager{position:fixed;right:clamp(10px,1.6vw,26px);top:50%;transform:translateY(-50%);
171
+ z-index:60;display:flex;flex-direction:column;align-items:center;gap:10px}
172
+ .pager__count{font-size:var(--fs-xs);font-weight:600;color:var(--text-3);
173
+ font-variant-numeric:tabular-nums;letter-spacing:.04em}
174
+ .pager__dots{display:flex;flex-direction:column;gap:8px}
175
+ .pager__dot{width:9px;height:9px;border-radius:50%;border:1px solid var(--border);
176
+ background:transparent;cursor:pointer;padding:0;transition:background-color .2s,transform .2s,border-color .2s}
177
+ .pager__dot:hover{transform:scale(1.3);border-color:var(--accent)}
178
+ .pager__dot.on{background:var(--accent);border-color:var(--accent);transform:scale(1.25)}
179
+ @media (max-width:760px){.pager{right:6px;gap:6px}.pager__dot{width:7px;height:7px}}
180
+ @media (prefers-reduced-motion:reduce){.pager__dot{transition:none}}
181
+ ```
182
+
183
+ > 结构:`<aside class="pager"><div class="pager__count">3 / 10</div><div class="pager__dots">…每页一个 .pager__dot…</div></aside>`,由脚本生成。
184
+
185
+ ## 12. Agenda 大纲页(第二页)
186
+
187
+ 首页后必须是 Agenda。大编号 + 标题 + 一句话说明,整行可点击跳转。
188
+
189
+ ```css
190
+ .agenda{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
191
+ .agenda__i{border-top:1px solid var(--border-soft)}
192
+ .agenda__i:last-child{border-bottom:1px solid var(--border-soft)}
193
+ .agenda__a{display:grid;grid-template-columns:auto 1fr auto;align-items:center;
194
+ gap:clamp(16px,2.4vw,36px);padding:clamp(18px,2.2vh,26px) clamp(4px,.6vw,12px);
195
+ text-decoration:none;color:inherit;transition:background-color .18s}
196
+ .agenda__a:hover{background:var(--surface-1)}
197
+ .agenda__n{font-size:clamp(1.4rem,2vw,1.9rem);font-weight:var(--fw-display);
198
+ color:var(--accent);font-variant-numeric:tabular-nums;line-height:1;min-width:2.2em}
199
+ .agenda__t{font-size:var(--fs-h3);font-weight:var(--fw-title);color:var(--text);margin-bottom:3px}
200
+ .agenda__d{font-size:var(--fs-sm);color:var(--text-3)}
201
+ .agenda__go{color:var(--text-3);transition:color .18s,transform .18s}
202
+ .agenda__a:hover .agenda__go{color:var(--accent);transform:translateX(4px)}
203
+ .agenda__go svg{width:20px;height:20px;display:block}
204
+ ```
205
+
206
+ > 结构:`<ol class="agenda"><li class="agenda__i"><a class="agenda__a" href="#why"><span class="agenda__n">01</span><span><span class="agenda__t">周期意义</span><span class="agenda__d">治理为何进入智能增长周期</span></span><span class="agenda__go">→</span></a></li>…</ol>`
207
+
208
+ ## 13. 图表尺寸与优雅规范
209
+
210
+ > 丰富但克制:一屏 1–2 个图,图表服务数据,不堆砌。
211
+ > 完整图表代码(含漏斗/甘特/散点/瀑布/双向条形/多段环形)见 `components.md` 第二部分;尺寸下限的**硬约束与校验规则**见 `components.md` 第 35 节(校验脚本按 `data-chart` 类型核对)。
212
+
213
+ | 图表 | 用途 | 建议高度 / 占比 |
214
+ |------|------|----------------|
215
+ | 环形/仪表盘 | 占比、达成度 | 直径 140–180px,配中心大数字 |
216
+ | 柱状图 | 分阶段目标、对比 | 高 200–240px,柱圆角 5–6px |
217
+ | 横向条形 / 棒棒糖 | 排名、覆盖率 | 行高 28–34px,条圆角 |
218
+ | 折线/面积 | 时间趋势 | 高 200–240px,面积用 `fill-opacity:.12` 的 accent |
219
+ | 斜率图 | 两期升降(谁升谁降) | 高 180–220px,两端都标数值 |
220
+ | 雷达图 / 玫瑰图 | 多维能力 | 直径 220–260 / 180–220px,≤ 6 维 |
221
+ | 堆叠条 / 马赛克图 | 构成(马赛克含规模维度) | 条高 24–32px;马赛克高 160–200px |
222
+ | 瀑布图 | 增减归因 | 高 200–230px |
223
+ | 漏斗图 / 桑基图 | 转化、流向归因 | 高 200–240px,≤ 5 层 / ≤ 8 带 |
224
+ | 甘特图 | 计划排期 | 高 160–200px |
225
+ | 散点/气泡 | 双维分布 | 高 220–260px |
226
+ | 哑铃图 | 前后 / 两地对比 | 高 160–200px,行高 34–38px |
227
+ | 子弹图 | 目标 vs 实际(含区间) | 高 140–180px,行高 32–36px |
228
+ | 点图 | 分布 / 离散度 | 高 120–160px,行高 28px |
229
+
230
+ **通用**:图表标签 `.f-txt3`(弱化),数值 `.f-txt` 加粗(突出);网格线 `.s-bds` 细线;数据系列用 `f-acc`(强调)+ `f-s3`(次要),多系列时同族明度递减、**不引入第二色相**。图与图之间留白 ≥ `--sp-6`。
231
+ **信息量纪律**:系列 >5 合并"其他";类别 >8 取 Top 7 + 附录密表;时间点 >8 改折线/按季聚合;一屏一图一重心。完整规则见 `components.md` `charts.md` §64。
232
+
233
+ ## 14. 主题切换 + 翻页脚本(与风格无关)
234
+
235
+ 见任一模式模板(`assets/templates/*.html`)底部注入的公共 UI 脚本(源文件 `assets/templates/ui.js`,由 `sync_runtime.py` 注入),含主题切换、滚动显现、方向键翻页、页码指示生成。