@topmindspace/tms-skills 2.0.1 → 2.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 (95) hide show
  1. package/CHANGELOG.md +145 -134
  2. package/README.md +1 -1
  3. package/bin/tms-skills.js +160 -160
  4. package/package.json +48 -48
  5. package/top-ppt-html/README.md +254 -254
  6. package/top-ppt-html/SKILL.md +111 -111
  7. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +3926 -3926
  8. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.model.json +167 -167
  9. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.html +3926 -3926
  10. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.model.json +167 -167
  11. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.html +4325 -4325
  12. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.model.json +320 -320
  13. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.html +4325 -4325
  14. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.model.json +320 -320
  15. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.html +4325 -4325
  16. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.model.json +320 -320
  17. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.html +5527 -5527
  18. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.model.json +913 -913
  19. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.html +5527 -5527
  20. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.model.json +913 -913
  21. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.html +5527 -5527
  22. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.model.json +913 -913
  23. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.html +5527 -5527
  24. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.model.json +913 -913
  25. package/top-ppt-html/assets/pptx-export.js +1944 -1944
  26. package/top-ppt-html/assets/style-gallery.html +589 -589
  27. package/top-ppt-html/assets/templates/architecture.html +3728 -3728
  28. package/top-ppt-html/assets/templates/engine.css +840 -840
  29. package/top-ppt-html/assets/templates/presentation.html +3738 -3738
  30. package/top-ppt-html/assets/templates/research.html +4017 -4017
  31. package/top-ppt-html/assets/templates/ui.js +520 -520
  32. package/top-ppt-html/evals/prompts.csv +15 -15
  33. package/top-ppt-html/evals/rubric.schema.json +25 -25
  34. package/top-ppt-html/evals/run_evals.py +220 -220
  35. package/top-ppt-html/evals/trace.example.json +16 -16
  36. package/top-ppt-html/package-lock.json +207 -0
  37. package/top-ppt-html/package.json +35 -35
  38. package/top-ppt-html/references/charts-basic.md +624 -624
  39. package/top-ppt-html/references/charts-discipline.md +108 -108
  40. package/top-ppt-html/references/charts-extended.md +482 -482
  41. package/top-ppt-html/references/charts.md +28 -28
  42. package/top-ppt-html/references/components-atoms.md +624 -624
  43. package/top-ppt-html/references/components.md +30 -30
  44. package/top-ppt-html/references/content-rules.md +490 -490
  45. package/top-ppt-html/references/design-system-engine.md +235 -235
  46. package/top-ppt-html/references/design-system.md +478 -478
  47. package/top-ppt-html/references/failure-modes.md +214 -214
  48. package/top-ppt-html/references/high-fidelity.md +127 -127
  49. package/top-ppt-html/references/icons.md +397 -397
  50. package/top-ppt-html/references/industry-benchmark.md +105 -105
  51. package/top-ppt-html/references/infographics-stats.md +308 -308
  52. package/top-ppt-html/references/infographics-structure.md +226 -226
  53. package/top-ppt-html/references/infographics.md +43 -43
  54. package/top-ppt-html/references/layout-grammar.md +315 -315
  55. package/top-ppt-html/references/layouts-architecture.md +108 -108
  56. package/top-ppt-html/references/layouts-combo.md +600 -600
  57. package/top-ppt-html/references/layouts-research.md +160 -160
  58. package/top-ppt-html/references/modes.md +254 -254
  59. package/top-ppt-html/references/outline-design.md +275 -275
  60. package/top-ppt-html/references/playbook.md +266 -266
  61. package/top-ppt-html/references/pptx-export.md +209 -209
  62. package/top-ppt-html/references/reform-plan.md +252 -252
  63. package/top-ppt-html/references/styles.md +370 -370
  64. package/top-ppt-html/references/tech-design.md +138 -138
  65. package/top-ppt-html/scripts/audit_css.py +109 -109
  66. package/top-ppt-html/scripts/audit_docs.py +176 -176
  67. package/top-ppt-html/scripts/audit_skill.py +220 -220
  68. package/top-ppt-html/scripts/audit_styles.py +351 -351
  69. package/top-ppt-html/scripts/build_examples.py +2276 -2276
  70. package/top-ppt-html/scripts/build_pptx.js +2380 -2380
  71. package/top-ppt-html/scripts/capture_theme_overview.js +78 -78
  72. package/top-ppt-html/scripts/checks_html.py +127 -127
  73. package/top-ppt-html/scripts/cross_verify.py +294 -294
  74. package/top-ppt-html/scripts/env_probe.py +158 -158
  75. package/top-ppt-html/scripts/extract_model.py +210 -210
  76. package/top-ppt-html/scripts/extract_snippet.py +374 -374
  77. package/top-ppt-html/scripts/gen_channel_a.js +214 -214
  78. package/top-ppt-html/scripts/layout-constants.json +3377 -3377
  79. package/top-ppt-html/scripts/layout_slots.json +830 -830
  80. package/top-ppt-html/scripts/lib_layout_regions.js +412 -412
  81. package/top-ppt-html/scripts/measure_height.py +178 -178
  82. package/top-ppt-html/scripts/model-schema.json +547 -547
  83. package/top-ppt-html/scripts/negative_tests.py +307 -307
  84. package/top-ppt-html/scripts/package_skill.py +291 -291
  85. package/top-ppt-html/scripts/prepare_images.py +341 -341
  86. package/top-ppt-html/scripts/probe_image_export.py +188 -188
  87. package/top-ppt-html/scripts/quality_gate.py +301 -301
  88. package/top-ppt-html/scripts/regression.py +308 -308
  89. package/top-ppt-html/scripts/render_compare.py +275 -275
  90. package/top-ppt-html/scripts/render_from_model.py +698 -698
  91. package/top-ppt-html/scripts/scaffold_report.py +1054 -1054
  92. package/top-ppt-html/scripts/section-file-map.json +104 -104
  93. package/top-ppt-html/scripts/sync_runtime.py +662 -662
  94. package/top-ppt-html/scripts/validate_pptx.py +1510 -1510
  95. package/top-ppt-html/scripts/validate_report.py +1456 -1456
@@ -1,235 +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` 注入),含主题切换、滚动显现、方向键翻页、页码指示生成。
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` 注入),含主题切换、滚动显现、方向键翻页、页码指示生成。