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