@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,3377 @@
1
+ {
2
+ "$comment": "TopPPT HTML 版式常量单源 —— 页面几何 / 12 列网格 / 语义字阶 C0–T14 / 三模式独立排版比例尺 / 页型几何 / 9 风格 token + 编码色板 / 图表登记四元组 / 容器内边距 / 锚点容差 / 图片准入门与图片规格 imageSpec / 校验预算 / 强调色表 / 去AI味词表 / 深度模式。改这里,然后跑 python scripts/sync_runtime.py 注入 build_pptx.js(require)/ pptx-export.js(常量块)/ 三模板(引擎·UI·运行时内联副本)。禁止手改各处副本。页型字段约束见 scripts/model-schema.json(DSL schema 单源,两端页型须同步增减)。",
3
+ "version": "0.1",
4
+ "page": {
5
+ "pw": 13.333,
6
+ "ph": 7.5,
7
+ "mx": 0.6,
8
+ "emu": 914400
9
+ },
10
+ "grid": {
11
+ "$comment": "12 列网格 + 安全边距(英寸)。x = 13 条列轨左边界(x[0] = 版心左、x[12] = 版心右);跨列 i..j 的框 = { x: x[i], w: x[j+1] - x[i] }。y = 内容区 6 条行基线。safe = 绝对安全边距(任何元素不得越过)。HTML 侧对应 engine.css 的 .g12/.c-3/.c-4/.c-6/.c-8 工具类;PPTX 侧由 build_pptx.js 的 span(i,j) 消费。",
12
+ "columns": 12,
13
+ "gutter": 0.16,
14
+ "colW": 0.8644,
15
+ "x": [
16
+ 0.6,
17
+ 1.6244,
18
+ 2.6488,
19
+ 3.6732,
20
+ 4.6976,
21
+ 5.722,
22
+ 6.7464,
23
+ 7.7708,
24
+ 8.7952,
25
+ 9.8196,
26
+ 10.844,
27
+ 11.8684,
28
+ 12.733
29
+ ],
30
+ "y": [
31
+ 2.35,
32
+ 3.27,
33
+ 4.19,
34
+ 5.11,
35
+ 6.03,
36
+ 6.9
37
+ ],
38
+ "safe": {
39
+ "top": 0.4,
40
+ "bottom": 0.4,
41
+ "left": 0.6,
42
+ "right": 0.6
43
+ }
44
+ },
45
+ "typeScale": {
46
+ "$comment": "PPTX 排版比例尺基准(pt,presentation 基准)。各模式拥有独立比例尺(modeTypeScale)。",
47
+ "coverTitle": 44,
48
+ "coverSub": 18,
49
+ "h1": 30,
50
+ "h2": 17,
51
+ "lead": 14,
52
+ "body": 13,
53
+ "caption": 11,
54
+ "micro": 10
55
+ },
56
+ "modeTypeScale": {
57
+ "$comment": "三模式独立排版比例尺(pt)。research=咨询密排(正文 10.5pt、标题 22pt);architecture 与 presentation 同基。序列化器按「调用点基准 pt → 最接近 typeScale 角色」映射到当前模式取值。",
58
+ "presentation": {
59
+ "coverTitle": 44,
60
+ "coverSub": 18,
61
+ "h1": 30,
62
+ "h2": 17,
63
+ "lead": 14,
64
+ "body": 13,
65
+ "caption": 11,
66
+ "micro": 10
67
+ },
68
+ "research": {
69
+ "coverTitle": 36,
70
+ "coverSub": 14,
71
+ "h1": 22,
72
+ "h2": 13.5,
73
+ "lead": 11.5,
74
+ "body": 10.5,
75
+ "caption": 9,
76
+ "micro": 8.5
77
+ },
78
+ "architecture": {
79
+ "coverTitle": 44,
80
+ "coverSub": 19,
81
+ "h1": 30,
82
+ "h2": 17,
83
+ "lead": 14,
84
+ "body": 13,
85
+ "caption": 11,
86
+ "micro": 10
87
+ }
88
+ },
89
+ "typography": {
90
+ "$comment": "语义字阶(C0–T14):把 modeTypeScale 的 8 个角色展开为 15 个语义层级,供 HTML 组件类与 PPTX 调用点对齐。pt 值仍以 modeTypeScale 为唯一来源(role 字段指向它),本表只做语义映射与用法约束,不重复存 pt。",
91
+ "levels": [
92
+ {
93
+ "id": "C0",
94
+ "name": "封面/章节幕标题",
95
+ "role": "coverTitle",
96
+ "usage": "封面主标题、章节幕标题"
97
+ },
98
+ {
99
+ "id": "T1",
100
+ "name": "页码/章节徽章",
101
+ "role": "caption",
102
+ "usage": "页码徽章、章节编号"
103
+ },
104
+ {
105
+ "id": "T2",
106
+ "name": "页面主标题/结论标题",
107
+ "role": "h1",
108
+ "usage": "每页顶部结论句(research 行动标题)"
109
+ },
110
+ {
111
+ "id": "T3",
112
+ "name": "副标题/语境说明",
113
+ "role": "lead",
114
+ "usage": "主标题下方导语"
115
+ },
116
+ {
117
+ "id": "T4",
118
+ "name": "模块标题/图表标题",
119
+ "role": "h2",
120
+ "usage": "卡片标题、图表标题、面板标题"
121
+ },
122
+ {
123
+ "id": "T5",
124
+ "name": "证据编号/轻量标签",
125
+ "role": "micro",
126
+ "usage": "Exhibit 编号、状态标签"
127
+ },
128
+ {
129
+ "id": "T6",
130
+ "name": "证据块标题/小节标题",
131
+ "role": "h2",
132
+ "usage": "分栏小标题、证据块标题"
133
+ },
134
+ {
135
+ "id": "T7",
136
+ "name": "正文解释段落",
137
+ "role": "body",
138
+ "usage": "证据解释、管理解读正文、表格正文"
139
+ },
140
+ {
141
+ "id": "T8",
142
+ "name": "结论条文字",
143
+ "role": "body",
144
+ "usage": "so-what 结论条、核心结论框"
145
+ },
146
+ {
147
+ "id": "T9",
148
+ "name": "SO WHAT 标签",
149
+ "role": "caption",
150
+ "usage": "so-what 标签行"
151
+ },
152
+ {
153
+ "id": "T10",
154
+ "name": "SO WHAT 正文/业务含义",
155
+ "role": "body",
156
+ "usage": "so-what 正文、行动含义、表格行动项"
157
+ },
158
+ {
159
+ "id": "T11",
160
+ "name": "图表轴/图例/刻度/微标签",
161
+ "role": "micro",
162
+ "usage": "坐标轴、图例、刻度、单位(禁用于表格正文与完整短句)"
163
+ },
164
+ {
165
+ "id": "T12",
166
+ "name": "图表数据标签",
167
+ "role": "caption",
168
+ "usage": "折线点值、柱形标签、百分比标注"
169
+ },
170
+ {
171
+ "id": "T13",
172
+ "name": "关键 KPI 大数字",
173
+ "role": "h1",
174
+ "usage": "KPI 大数字、hero 数值"
175
+ },
176
+ {
177
+ "id": "T14",
178
+ "name": "注释/口径/来源/页脚",
179
+ "role": "micro",
180
+ "usage": "footnote、来源行、页脚、小页码"
181
+ }
182
+ ],
183
+ "tableSemanticRule": {
184
+ "$comment": "表格语义字号门:表格文字须先按语义分类再套字阶。body 类必须用 T7/T10;micro 仅限轴标签/刻度/图例/极短表格标签/单位/列短标签。",
185
+ "body": [
186
+ "T7",
187
+ "T10"
188
+ ],
189
+ "microAllowed": [
190
+ "T11"
191
+ ],
192
+ "microForbiddenFor": [
193
+ "表格正文",
194
+ "行动项",
195
+ "风险项",
196
+ "解释句",
197
+ "建议句",
198
+ "长项目符号",
199
+ "完整短句"
200
+ ]
201
+ }
202
+ },
203
+ "pageTypes": {
204
+ "$comment": "页型几何(英寸):各页型锁定版式的坐标常量,HTML 版式与 PPTX 页型同源。contentBottom 为内容安全下界(页码区之上)。",
205
+ "layout": {
206
+ "contentTop": 2.35,
207
+ "contentBottom": 6.9,
208
+ "contentBottomWithNote": 6.4,
209
+ "pageNumY": 7.0
210
+ },
211
+ "common": {
212
+ "headEyebrowY": 0.48,
213
+ "headTitleY": 0.82,
214
+ "headRuleY": 1.72,
215
+ "leadY": 1.88,
216
+ "bodyY": 2.35,
217
+ "bodyYWithLead": 2.55,
218
+ "pagerY": 7.0
219
+ },
220
+ "cover": {
221
+ "metaY": 0.7,
222
+ "titleY": 2.4,
223
+ "titleH": 2.0,
224
+ "subtitleY": 4.5,
225
+ "subtitleH": 0.8
226
+ },
227
+ "closing": {
228
+ "eyebrowY": 0.7,
229
+ "titleY": 1.2,
230
+ "titleH": 1.2,
231
+ "pointsY": 3.0,
232
+ "pointTitleH": 0.6,
233
+ "pointBodyH": 1.2
234
+ },
235
+ "points": {
236
+ "listY": 2.5,
237
+ "rowH": 0.72,
238
+ "rowHMin": 0.5,
239
+ "markSize": 0.14,
240
+ "metricY": 4.7,
241
+ "metricW": 2.6,
242
+ "metricValH": 0.9,
243
+ "metricCapY": 5.6
244
+ },
245
+ "metrics": {
246
+ "bandY": 3.1,
247
+ "cardH": 2.3,
248
+ "valY": 3.45,
249
+ "valH": 1.1,
250
+ "capY": 4.55,
251
+ "capH": 0.7,
252
+ "gap": 0.3,
253
+ "maxW": 2.9
254
+ },
255
+ "table": {
256
+ "y": 2.5,
257
+ "rowH": 0.55,
258
+ "rowHMin": 0.32,
259
+ "headRowH": 0.5
260
+ },
261
+ "bar": {
262
+ "hbarY0": 2.6,
263
+ "hbarY1": 6.25,
264
+ "chartX": 0.6,
265
+ "chartY": 2.95,
266
+ "chartW": 1.2,
267
+ "chartH": 3.35,
268
+ "noteY": 6.55
269
+ },
270
+ "note": {
271
+ "y": 6.55,
272
+ "h": 0.4
273
+ },
274
+ "exhibit": {
275
+ "badgeY": 2.35,
276
+ "chartY": 2.75,
277
+ "chartH": 3.25,
278
+ "soWhatY": 6.05,
279
+ "footnoteY": 6.72
280
+ },
281
+ "twocol": {
282
+ "colGap": 0.5,
283
+ "bodyH": 3.6,
284
+ "rowHMin": 0.5
285
+ },
286
+ "hbar": {
287
+ "labelW": 1.9,
288
+ "valW": 1.0,
289
+ "rowH": 0.55,
290
+ "barRatio": 0.5
291
+ },
292
+ "diagram": {
293
+ "layerBarW": 1.35,
294
+ "layerGap": 0.15,
295
+ "nodeGap": 0.15,
296
+ "bodyStartY": 2.9,
297
+ "maxLayerH": 1.15,
298
+ "nodeMaxW": 2.2
299
+ },
300
+ "split": {
301
+ "$comment": "双区组合页几何(英寸比例,相对版心 CW)。**左宽右窄**,与 HTML 侧 `.grid.g-side`(1.35fr : 1fr)同源——v8 修正了 v7 的左右反向(HTML 左宽 / PPTX 左窄,跨通道文本比对查不出,属静默漂移)。左区与右区各可为 要点/图表/表格/图片。",
302
+ "leftW": 0.55,
303
+ "rightW": 0.415,
304
+ "rightX": 0.585,
305
+ "pointsY": 2.7,
306
+ "rowH": 0.78,
307
+ "capY": 2.55,
308
+ "chartY": 3.0,
309
+ "chartH": 3.7,
310
+ "tableY": 2.7,
311
+ "tableRowH": 0.5
312
+ },
313
+ "cards": {
314
+ "startY": 3.0,
315
+ "gap": 0.25,
316
+ "maxH": 2.0,
317
+ "titleH": 0.4
318
+ },
319
+ "timeline": {
320
+ "labelY": 2.95,
321
+ "axisY": 3.58,
322
+ "dotY": 3.51,
323
+ "dotR": 0.18,
324
+ "nameY": 3.9,
325
+ "descY": 4.45,
326
+ "descH": 1.2
327
+ },
328
+ "research": {
329
+ "$comment": "research 密排页型几何(R6–R8):三栏栏距 / 矩阵单元格 / 密表起点与行高 / 半表半图分栏。",
330
+ "col3Gap": 0.38,
331
+ "matrixLabelW": 1.5,
332
+ "matrixCellH": 0.85,
333
+ "matrixY": 2.2,
334
+ "denseTableY": 2.2,
335
+ "denseRowH": 0.42,
336
+ "halfTableW": 0.52,
337
+ "halfChartX": 0.57,
338
+ "halfChartW": 0.43
339
+ },
340
+ "arch": {
341
+ "$comment": "architecture 全幅图页型:图为王,图区从 fullStartY 到 fullEndY 占版面主体。",
342
+ "fullStartY": 2.1,
343
+ "fullEndY": 6.9,
344
+ "laneH": 0.72,
345
+ "laneHMin": 0.5,
346
+ "laneGap": 0.14,
347
+ "laneHeadW": 1.3,
348
+ "stepGap": 0.12,
349
+ "stepMaxW": 1.9
350
+ },
351
+ "kpi": {
352
+ "$comment": "大数指标页:hero 巨号数字(左)+ 竖分隔线 + 右列支撑指标。dividerX 为版心内横向占比。",
353
+ "heroY": 2.9,
354
+ "heroW": 0.52,
355
+ "heroH": 1.6,
356
+ "dividerX": 0.56,
357
+ "metricY0": 2.95,
358
+ "metricRowH": 0.85
359
+ },
360
+ "comparison": {
361
+ "$comment": "对比页:左右双面板(左 surface 现状 / 右 soft 目标)+ 可选结论条(复用 soWhatY 槽位)。",
362
+ "panelGap": 0.4,
363
+ "panelY": 2.55,
364
+ "panelH": 3.4,
365
+ "titleH": 0.45,
366
+ "rowH": 0.62
367
+ },
368
+ "quote": {
369
+ "$comment": "引用页(深色全幅):大引号 + 引言 + 署名 + 语境。",
370
+ "markY": 1.75,
371
+ "textY": 2.7,
372
+ "textH": 2.3,
373
+ "authorY": 5.25,
374
+ "contextY": 5.8
375
+ },
376
+ "donut": {
377
+ "$comment": "环形图页:pie 楔形(12 点钟起顺时针)+ 背景色圆挖孔 + 中心合计 + 右侧图例。坐标为英寸绝对值。",
378
+ "centerX": 3.05,
379
+ "centerY": 4.6,
380
+ "r": 1.6,
381
+ "holeR": 0.95,
382
+ "legendX": 5.6,
383
+ "legendRowH": 0.55,
384
+ "legendLabelW": 3.4,
385
+ "legendValW": 1.3,
386
+ "legendPctX": 5.3,
387
+ "legendPctW": 1.3
388
+ },
389
+ "steps": {
390
+ "$comment": "步骤条页:N 步横排(序号 + 标题 + 说明),步间箭头;可按 group 分段(phase 标签)。",
391
+ "y": 3.05,
392
+ "barH": 1.35,
393
+ "gap": 0.12,
394
+ "arrowW": 0.3,
395
+ "numH": 0.3,
396
+ "titleH": 0.34,
397
+ "pad": 0.08,
398
+ "maxPerRow": 6
399
+ },
400
+ "heatmap": {
401
+ "$comment": "热力矩阵页:行标签 × 列标签网格,单元格按强度取色阶(accent 明度阶梯,不引入第二色相)。",
402
+ "y": 2.6,
403
+ "labelW": 1.7,
404
+ "headH": 0.42,
405
+ "cellH": 0.6,
406
+ "cellGap": 0.06,
407
+ "legendW": 1.6
408
+ },
409
+ "pyramid": {
410
+ "$comment": "金字塔页:自上而下逐层加宽(顶层最窄),层内左对齐标题 + 右侧说明。",
411
+ "y": 2.35,
412
+ "rowH": 0.72,
413
+ "gap": 0.08,
414
+ "minW": 0.34,
415
+ "labelW": 3.2
416
+ },
417
+ "bullet": {
418
+ "$comment": "达成对比页:每行 = 标签 + 底槽 + 实际条 + 目标刻度线 + 数值(实际/目标)。",
419
+ "y": 2.6,
420
+ "rowH": 0.8,
421
+ "labelW": 2.4,
422
+ "valW": 1.7,
423
+ "barH": 0.26
424
+ },
425
+ "image": {
426
+ "$comment": "素材图片页:多版式锁定几何——full 版心全宽 / half 左图右注 / bleed 通栏出血 / grid 多图网格 / compare 双图对比 / wall Logo 墙。效果(圆角/比例/裁切 fit/图注/占位符)与位置同源;双引擎按同一套常量渲染。图片源仅允许 data: 内联或相对路径(零外链铁律);无图时走配图占位(原生形状,pictures 不增)。",
427
+ "y": 2.3,
428
+ "h": 4.2,
429
+ "halfW": 0.56,
430
+ "halfGap": 0.06,
431
+ "capY": 6.6,
432
+ "capH": 0.3,
433
+ "radius": 0.09,
434
+ "noteRowH": 0.62,
435
+ "gridGap": 0.16,
436
+ "gridCols": {
437
+ "2": 2,
438
+ "3": 3,
439
+ "4": 4,
440
+ "6": 3
441
+ },
442
+ "gridCapH": 0.28,
443
+ "compareGap": 0.3,
444
+ "compareTagH": 0.26,
445
+ "wallCellH": 0.92,
446
+ "wallGap": 0.18,
447
+ "wallMaxRows": 2
448
+ },
449
+ "flagbar": {
450
+ "$comment": "待核实清单条(accent 强调色标注):accent-soft 底 + 左侧 accent 竖条 + 逐项列表;底对齐 contentBottom,正文区随之下移。与 so-what 同页时校验器告警(槽位冲突)。",
451
+ "hdH": 0.26,
452
+ "rowH": 0.24,
453
+ "maxRows": 3,
454
+ "gap": 0.12
455
+ },
456
+ "sankey": {
457
+ "$comment": "桑基图页:左→右分层节点-流带图。节点 ≤12、流带 ≤24;流带宽度按流量线性编码;流带边界用 SVG path(贝塞尔/三次样条)分别追踪上下边界,采样点 ≥16。",
458
+ "y": 2.45,
459
+ "h": 4.1,
460
+ "nodeW": 0.32,
461
+ "nodeGap": 0.14,
462
+ "labelW": 1.55,
463
+ "minBandH": 0.22,
464
+ "maxNodes": 12,
465
+ "maxFlows": 24
466
+ },
467
+ "treemap": {
468
+ "$comment": "树图页:面积编码的矩形切分(squarified treemap)。层级 ≤3、叶节点 ≤16;间隙用 gap 分隔;面积与数值严格成比例。",
469
+ "y": 2.45,
470
+ "h": 4.1,
471
+ "gap": 0.05,
472
+ "labelMinH": 0.34,
473
+ "maxLeaves": 16,
474
+ "maxDepth": 3
475
+ },
476
+ "boxplot": {
477
+ "$comment": "箱线图页:分组箱体(min/q1/median/q3/max)+ 可选异常点。组数 ≤8;箱宽按分组数自适应,须保留须线端帽。",
478
+ "y": 2.7,
479
+ "h": 3.7,
480
+ "labelW": 1.5,
481
+ "groupGap": 0.3,
482
+ "boxMaxW": 0.9,
483
+ "whiskerCapW": 0.34,
484
+ "maxGroups": 8
485
+ },
486
+ "network": {
487
+ "$comment": "关系网络页:节点-边拓扑(确定性环形布局 + 同环内按度数排序,不用随机力导向)。节点 ≤18、边 ≤30;节点半径按权重线性映射。",
488
+ "y": 2.4,
489
+ "h": 4.2,
490
+ "nodeR": 0.28,
491
+ "nodeRMin": 0.18,
492
+ "labelMaxW": 1.4,
493
+ "maxNodes": 18,
494
+ "maxEdges": 30
495
+ },
496
+ "marimekko": {
497
+ "$comment": "马赛克图页:列宽按列总量、列高按 100% 构成的双重编码。列 ≤6、每列段 ≤4;列间 gap 分隔,底部图例一行。",
498
+ "y": 2.6,
499
+ "h": 3.75,
500
+ "labelW": 1.55,
501
+ "colGap": 0.06,
502
+ "legendH": 0.42,
503
+ "maxCols": 6,
504
+ "maxSegs": 4
505
+ },
506
+ "streamgraph": {
507
+ "$comment": "流带图页:堆叠平滑带(基线居中、上下对称展开)。系列 ≤6;带宽按数值编码;带边界用三次样条分别追踪上下边界,采样点 ≥24。",
508
+ "y": 2.6,
509
+ "h": 3.75,
510
+ "labelW": 1.4,
511
+ "bandMinH": 0.12,
512
+ "maxSeries": 6
513
+ }
514
+ },
515
+ "pageTypeGeometry": {
516
+ "$comment": "schema 页型 → 本文件 pageTypes 几何组 的映射(sync_runtime.py 用它校验「页型四件套」不缺几何)。新增页型必须同时出现在 model-schema.json 的 pageTypes 与这里。",
517
+ "points": "points",
518
+ "metrics": "metrics",
519
+ "kpi": "kpi",
520
+ "table": "table",
521
+ "timeline": "timeline",
522
+ "steps": "steps",
523
+ "bar": "bar",
524
+ "donut": "donut",
525
+ "heatmap": "heatmap",
526
+ "bullet": "bullet",
527
+ "pyramid": "pyramid",
528
+ "image": "image",
529
+ "cards": "cards",
530
+ "split": "split",
531
+ "comparison": "comparison",
532
+ "quote": "quote",
533
+ "diagram": "diagram",
534
+ "exhibit": "exhibit",
535
+ "twocol": "twocol",
536
+ "threecol": "twocol",
537
+ "halftable": "research",
538
+ "matrix": "research",
539
+ "lane": "arch",
540
+ "sankey": "sankey",
541
+ "treemap": "treemap",
542
+ "boxplot": "boxplot",
543
+ "network": "network",
544
+ "marimekko": "marimekko",
545
+ "streamgraph": "streamgraph"
546
+ },
547
+ "charts": {
548
+ "$comment": "图表登记表(单源):validate_report.py 按 data-chart 类型核对最小尺寸;charts.md 的实现清单与之一致。pxWidthMin = 内联 width:NNNpx 硬下限(FAIL);vbHeightMin = 通宽图 viewBox 高度建议下限(WARN)。sizeByComplexity = 面积随信息复杂度(v9,治简单图放大)。",
549
+ "sizeByComplexity": {
550
+ "$comment": "图表面积跟随信息复杂度(治「简单图放大成一页大图」)。bands 为占内容区高度比例区间。",
551
+ "bands": [
552
+ {
553
+ "maxCats": 2,
554
+ "maxPts": 2,
555
+ "heightPct": [
556
+ 18,
557
+ 28
558
+ ],
559
+ "prefer": [
560
+ "kpi",
561
+ "progress",
562
+ "vsbar"
563
+ ],
564
+ "forbid": [
565
+ "donut",
566
+ "pie",
567
+ "treemap",
568
+ "sankey"
569
+ ]
570
+ },
571
+ {
572
+ "maxCats": 5,
573
+ "maxPts": 8,
574
+ "heightPct": [
575
+ 35,
576
+ 55
577
+ ],
578
+ "prefer": [
579
+ "donut",
580
+ "hbar",
581
+ "bar",
582
+ "line"
583
+ ],
584
+ "forbid": []
585
+ },
586
+ {
587
+ "maxCats": 99,
588
+ "maxPts": 99,
589
+ "heightPct": [
590
+ 55,
591
+ 85
592
+ ],
593
+ "prefer": [
594
+ "line",
595
+ "stack",
596
+ "exhibit",
597
+ "info"
598
+ ],
599
+ "forbid": []
600
+ }
601
+ ]
602
+ },
603
+ "types": [
604
+ "donut",
605
+ "multidonut",
606
+ "radar",
607
+ "gauge",
608
+ "bar",
609
+ "stack",
610
+ "stackline",
611
+ "waterfall",
612
+ "line",
613
+ "dualline",
614
+ "area",
615
+ "scatter",
616
+ "bubble",
617
+ "funnel",
618
+ "gantt",
619
+ "hbar",
620
+ "vsbar",
621
+ "treemap",
622
+ "progress",
623
+ "sparkline",
624
+ "sankey",
625
+ "slope",
626
+ "dumbbell",
627
+ "lollipop",
628
+ "marimekko",
629
+ "rose",
630
+ "dotplot",
631
+ "bulletchart",
632
+ "waffle",
633
+ "boxplot",
634
+ "pareto",
635
+ "radialbar",
636
+ "streamgraph",
637
+ "candlestick",
638
+ "pie",
639
+ "network"
640
+ ],
641
+ "minSize": {
642
+ "donut": {
643
+ "pxWidthMin": 140
644
+ },
645
+ "pie": {
646
+ "pxWidthMin": 140
647
+ },
648
+ "multidonut": {
649
+ "pxWidthMin": 140
650
+ },
651
+ "radar": {
652
+ "pxWidthMin": 220
653
+ },
654
+ "gauge": {
655
+ "pxWidthMin": 180
656
+ },
657
+ "rose": {
658
+ "pxWidthMin": 180
659
+ },
660
+ "treemap": {
661
+ "vbHeightMin": 170
662
+ },
663
+ "bar": {
664
+ "vbHeightMin": 160
665
+ },
666
+ "stack": {
667
+ "vbHeightMin": 160
668
+ },
669
+ "waterfall": {
670
+ "vbHeightMin": 170
671
+ },
672
+ "line": {
673
+ "vbHeightMin": 160
674
+ },
675
+ "dualline": {
676
+ "vbHeightMin": 160
677
+ },
678
+ "area": {
679
+ "vbHeightMin": 160
680
+ },
681
+ "scatter": {
682
+ "vbHeightMin": 180
683
+ },
684
+ "bubble": {
685
+ "vbHeightMin": 180
686
+ },
687
+ "funnel": {
688
+ "vbHeightMin": 160
689
+ },
690
+ "gantt": {
691
+ "vbHeightMin": 130
692
+ },
693
+ "progress": {
694
+ "vbHeightMin": 100
695
+ },
696
+ "hbar": {
697
+ "vbHeightMin": 100
698
+ },
699
+ "vsbar": {
700
+ "vbHeightMin": 100
701
+ },
702
+ "stackline": {
703
+ "vbHeightMin": 40
704
+ },
705
+ "sparkline": {
706
+ "vbHeightMin": 20
707
+ },
708
+ "sankey": {
709
+ "vbHeightMin": 200
710
+ },
711
+ "slope": {
712
+ "vbHeightMin": 180
713
+ },
714
+ "dumbbell": {
715
+ "vbHeightMin": 160
716
+ },
717
+ "lollipop": {
718
+ "vbHeightMin": 140
719
+ },
720
+ "marimekko": {
721
+ "vbHeightMin": 160
722
+ },
723
+ "dotplot": {
724
+ "vbHeightMin": 120
725
+ },
726
+ "bulletchart": {
727
+ "vbHeightMin": 140
728
+ },
729
+ "waffle": {
730
+ "vbHeightMin": 160
731
+ },
732
+ "boxplot": {
733
+ "vbHeightMin": 180
734
+ },
735
+ "pareto": {
736
+ "vbHeightMin": 180
737
+ },
738
+ "radialbar": {
739
+ "pxWidthMin": 200
740
+ },
741
+ "streamgraph": {
742
+ "vbHeightMin": 160
743
+ },
744
+ "candlestick": {
745
+ "vbHeightMin": 180
746
+ },
747
+ "network": {
748
+ "vbHeightMin": 200
749
+ }
750
+ },
751
+ "scaffold": {
752
+ "$comment": "scaffold_report.py 骨架图表默认尺寸(唯一事实源;须 ≥ minSize 同口径阈值,sync_runtime.py 校验)。viewBoxHeight = 骨架 svg 的 viewBox 高(通宽图);pxWidth = 圆形/迷你图需显式内联宽度(无则通宽);infoTypes = 信息图专属页型全幅骨架(宽×高),亦是 extract_snippet --chart 的信息图路由判据。",
753
+ "viewBoxHeight": {
754
+ "donut": 150,
755
+ "pie": 150,
756
+ "multidonut": 160,
757
+ "radar": 240,
758
+ "gauge": 120,
759
+ "rose": 200,
760
+ "bar": 220,
761
+ "stack": 220,
762
+ "stackline": 60,
763
+ "line": 220,
764
+ "dualline": 200,
765
+ "area": 200,
766
+ "scatter": 260,
767
+ "bubble": 220,
768
+ "waterfall": 230,
769
+ "funnel": 240,
770
+ "gantt": 190,
771
+ "hbar": 150,
772
+ "vsbar": 140,
773
+ "progress": 150,
774
+ "sparkline": 28,
775
+ "slope": 200,
776
+ "dumbbell": 180,
777
+ "lollipop": 160,
778
+ "dotplot": 150,
779
+ "bulletchart": 160,
780
+ "waffle": 190,
781
+ "pareto": 200,
782
+ "radialbar": 240,
783
+ "candlestick": 200
784
+ },
785
+ "pxWidth": {
786
+ "donut": 160,
787
+ "pie": 160,
788
+ "multidonut": 170,
789
+ "radar": 230,
790
+ "gauge": 210,
791
+ "rose": 200,
792
+ "radialbar": 240,
793
+ "sparkline": 120
794
+ },
795
+ "infoTypes": {
796
+ "sankey": [
797
+ 900,
798
+ 340
799
+ ],
800
+ "treemap": [
801
+ 900,
802
+ 320
803
+ ],
804
+ "boxplot": [
805
+ 900,
806
+ 300
807
+ ],
808
+ "network": [
809
+ 900,
810
+ 340
811
+ ],
812
+ "marimekko": [
813
+ 900,
814
+ 320
815
+ ],
816
+ "streamgraph": [
817
+ 900,
818
+ 320
819
+ ]
820
+ }
821
+ },
822
+ "variety": {
823
+ "$comment": "图表多样性预算(validate_report.py 与 evals/run_evals.py 消费)——治「图表定义 36 种、实际只用 bar/line/donut」。类型数下限 = min(minTypes[模式], max(1, ⌈图表页数 × minTypesRatio⌉));noRepeatAdjacent = 相邻图表页不得同 data-chart;compositeMinRatio/compositeModes = 组合版式(内容页含 ≥2 种承载类型)比例下限与适用模式(治「单件页当默认」,只对 research 生效:A 演示按契约每屏一主张,C 架构恒为一页一图)。判据与选型见 references/playbook.md §四/§五。",
824
+ "minTypes": {
825
+ "presentation": 4,
826
+ "research": 6,
827
+ "architecture": 3
828
+ },
829
+ "minTypesRatio": 0.6,
830
+ "noRepeatAdjacent": true,
831
+ "compositeMinRatio": 0.3,
832
+ "compositeModes": [
833
+ "research"
834
+ ]
835
+ },
836
+ "registry": {
837
+ "$comment": "图表登记四元组:pptx=native 走 addChart(真 chart part + 内嵌 Excel,双击可编辑数据);pptx=shape 走 OOXML 原生形状/SVG path 高保真还原,且**必须**按 dataTable 策略附数据表保证数据可追溯;nativeTrick = 用原生图表技巧实现的类型;path = 形状还原的几何约束(采样点下限 / 双边界追踪 / 禁预设形状)。build_pptx.js 与 pptx-export.js 双引擎按本表分派,validate_pptx.py 按本表断言。",
838
+ "bar": {
839
+ "html": "svg-bars",
840
+ "pptx": "native",
841
+ "nativeType": "bar",
842
+ "dataTable": "notes",
843
+ "min": {
844
+ "vbHeightMin": 160
845
+ }
846
+ },
847
+ "hbar": {
848
+ "html": "svg-hbars",
849
+ "pptx": "native",
850
+ "nativeType": "bar",
851
+ "dataTable": "notes",
852
+ "min": {
853
+ "vbHeightMin": 100
854
+ }
855
+ },
856
+ "stack": {
857
+ "html": "svg-stack",
858
+ "pptx": "native",
859
+ "nativeType": "bar",
860
+ "dataTable": "notes",
861
+ "min": {
862
+ "vbHeightMin": 160
863
+ },
864
+ "nativeOpt": {
865
+ "barGrouping": "stacked"
866
+ }
867
+ },
868
+ "stackline": {
869
+ "html": "svg-stackline",
870
+ "pptx": "native",
871
+ "nativeType": "bar",
872
+ "dataTable": "notes",
873
+ "min": {
874
+ "vbHeightMin": 40
875
+ },
876
+ "nativeOpt": {
877
+ "barGrouping": "percentStacked"
878
+ }
879
+ },
880
+ "line": {
881
+ "html": "svg-line",
882
+ "pptx": "native",
883
+ "nativeType": "line",
884
+ "dataTable": "notes",
885
+ "min": {
886
+ "vbHeightMin": 160
887
+ }
888
+ },
889
+ "dualline": {
890
+ "html": "svg-dualline",
891
+ "pptx": "native",
892
+ "nativeType": "line",
893
+ "dataTable": "notes",
894
+ "min": {
895
+ "vbHeightMin": 160
896
+ }
897
+ },
898
+ "area": {
899
+ "html": "svg-area",
900
+ "pptx": "native",
901
+ "nativeType": "area",
902
+ "dataTable": "notes",
903
+ "min": {
904
+ "vbHeightMin": 160
905
+ }
906
+ },
907
+ "donut": {
908
+ "html": "svg-donut",
909
+ "pptx": "native",
910
+ "nativeType": "doughnut",
911
+ "dataTable": "notes",
912
+ "min": {
913
+ "pxWidthMin": 140
914
+ }
915
+ },
916
+ "multidonut": {
917
+ "html": "svg-mdonut",
918
+ "pptx": "native",
919
+ "nativeType": "doughnut",
920
+ "dataTable": "notes",
921
+ "min": {
922
+ "pxWidthMin": 140
923
+ }
924
+ },
925
+ "pie": {
926
+ "html": "svg-pie",
927
+ "pptx": "native",
928
+ "nativeType": "pie",
929
+ "dataTable": "notes",
930
+ "min": {
931
+ "pxWidthMin": 140
932
+ }
933
+ },
934
+ "radar": {
935
+ "html": "svg-radar",
936
+ "pptx": "native",
937
+ "nativeType": "radar",
938
+ "dataTable": "notes",
939
+ "min": {
940
+ "pxWidthMin": 220
941
+ }
942
+ },
943
+ "scatter": {
944
+ "html": "svg-scatter",
945
+ "pptx": "native",
946
+ "nativeType": "scatter",
947
+ "dataTable": "notes",
948
+ "min": {
949
+ "vbHeightMin": 180
950
+ }
951
+ },
952
+ "bubble": {
953
+ "html": "svg-bubble",
954
+ "pptx": "native",
955
+ "nativeType": "bubble",
956
+ "dataTable": "notes",
957
+ "min": {
958
+ "vbHeightMin": 180
959
+ }
960
+ },
961
+ "waterfall": {
962
+ "html": "svg-wf",
963
+ "pptx": "native",
964
+ "nativeType": "bar",
965
+ "dataTable": "notes",
966
+ "min": {
967
+ "vbHeightMin": 170
968
+ },
969
+ "nativeTrick": "stacked+hiddenBase+connector"
970
+ },
971
+ "gauge": {
972
+ "html": "svg-gauge",
973
+ "pptx": "native",
974
+ "nativeType": "doughnut",
975
+ "dataTable": "notes",
976
+ "min": {
977
+ "pxWidthMin": 180
978
+ },
979
+ "nativeTrick": "doughnut+firstSliceAng+hiddenRemainder"
980
+ },
981
+ "pareto": {
982
+ "html": "svg-pareto",
983
+ "pptx": "native",
984
+ "nativeType": "bar",
985
+ "dataTable": "notes",
986
+ "min": {
987
+ "vbHeightMin": 180
988
+ },
989
+ "nativeTrick": "multiType+bar+line"
990
+ },
991
+ "gantt": {
992
+ "html": "svg-gantt",
993
+ "pptx": "shape",
994
+ "dataTable": "notes",
995
+ "min": {
996
+ "vbHeightMin": 130
997
+ },
998
+ "path": {
999
+ "forbidPresetShapes": true
1000
+ }
1001
+ },
1002
+ "vsbar": {
1003
+ "html": "svg-vsbar",
1004
+ "pptx": "shape",
1005
+ "dataTable": "notes",
1006
+ "min": {
1007
+ "vbHeightMin": 100
1008
+ },
1009
+ "path": {
1010
+ "forbidPresetShapes": true
1011
+ }
1012
+ },
1013
+ "progress": {
1014
+ "html": "svg-progress",
1015
+ "pptx": "shape",
1016
+ "dataTable": "notes",
1017
+ "min": {
1018
+ "vbHeightMin": 100
1019
+ },
1020
+ "path": {
1021
+ "forbidPresetShapes": true
1022
+ }
1023
+ },
1024
+ "sparkline": {
1025
+ "html": "svg-spark",
1026
+ "pptx": "shape",
1027
+ "dataTable": "off",
1028
+ "min": {
1029
+ "vbHeightMin": 20
1030
+ },
1031
+ "path": {
1032
+ "forbidPresetShapes": true
1033
+ }
1034
+ },
1035
+ "funnel": {
1036
+ "html": "svg-funnel",
1037
+ "pptx": "shape",
1038
+ "dataTable": "notes",
1039
+ "min": {
1040
+ "vbHeightMin": 160
1041
+ },
1042
+ "path": {
1043
+ "minSamplePoints": 8,
1044
+ "forbidPresetShapes": true
1045
+ }
1046
+ },
1047
+ "treemap": {
1048
+ "html": "svg-treemap",
1049
+ "pptx": "shape",
1050
+ "dataTable": "appendix",
1051
+ "min": {
1052
+ "vbHeightMin": 170
1053
+ },
1054
+ "path": {
1055
+ "forbidPresetShapes": true
1056
+ }
1057
+ },
1058
+ "marimekko": {
1059
+ "html": "svg-marimekko",
1060
+ "pptx": "shape",
1061
+ "dataTable": "appendix",
1062
+ "min": {
1063
+ "vbHeightMin": 160
1064
+ },
1065
+ "path": {
1066
+ "forbidPresetShapes": true
1067
+ }
1068
+ },
1069
+ "boxplot": {
1070
+ "html": "svg-boxplot",
1071
+ "pptx": "shape",
1072
+ "dataTable": "appendix",
1073
+ "min": {
1074
+ "vbHeightMin": 180
1075
+ },
1076
+ "path": {
1077
+ "forbidPresetShapes": true
1078
+ }
1079
+ },
1080
+ "network": {
1081
+ "html": "svg-network",
1082
+ "pptx": "shape",
1083
+ "dataTable": "appendix",
1084
+ "min": {
1085
+ "vbHeightMin": 200
1086
+ },
1087
+ "path": {
1088
+ "forbidPresetShapes": true
1089
+ }
1090
+ },
1091
+ "sankey": {
1092
+ "html": "svg-sankey",
1093
+ "pptx": "shape",
1094
+ "dataTable": "appendix",
1095
+ "min": {
1096
+ "vbHeightMin": 200
1097
+ },
1098
+ "path": {
1099
+ "minSamplePoints": 16,
1100
+ "trackBothEdges": true,
1101
+ "forbidPresetShapes": true
1102
+ }
1103
+ },
1104
+ "streamgraph": {
1105
+ "html": "svg-stream",
1106
+ "pptx": "shape",
1107
+ "dataTable": "appendix",
1108
+ "min": {
1109
+ "vbHeightMin": 160
1110
+ },
1111
+ "path": {
1112
+ "minSamplePoints": 24,
1113
+ "trackBothEdges": true,
1114
+ "forbidPresetShapes": true
1115
+ }
1116
+ },
1117
+ "slope": {
1118
+ "html": "svg-slope",
1119
+ "pptx": "shape",
1120
+ "dataTable": "notes",
1121
+ "min": {
1122
+ "vbHeightMin": 180
1123
+ },
1124
+ "path": {
1125
+ "forbidPresetShapes": true
1126
+ }
1127
+ },
1128
+ "dumbbell": {
1129
+ "html": "svg-dumbbell",
1130
+ "pptx": "shape",
1131
+ "dataTable": "notes",
1132
+ "min": {
1133
+ "vbHeightMin": 160
1134
+ },
1135
+ "path": {
1136
+ "forbidPresetShapes": true
1137
+ }
1138
+ },
1139
+ "lollipop": {
1140
+ "html": "svg-lollipop",
1141
+ "pptx": "shape",
1142
+ "dataTable": "notes",
1143
+ "min": {
1144
+ "vbHeightMin": 140
1145
+ },
1146
+ "path": {
1147
+ "forbidPresetShapes": true
1148
+ }
1149
+ },
1150
+ "dotplot": {
1151
+ "html": "svg-dotplot",
1152
+ "pptx": "shape",
1153
+ "dataTable": "notes",
1154
+ "min": {
1155
+ "vbHeightMin": 120
1156
+ },
1157
+ "path": {
1158
+ "forbidPresetShapes": true
1159
+ }
1160
+ },
1161
+ "bulletchart": {
1162
+ "html": "svg-bullet",
1163
+ "pptx": "shape",
1164
+ "dataTable": "notes",
1165
+ "min": {
1166
+ "vbHeightMin": 140
1167
+ },
1168
+ "path": {
1169
+ "forbidPresetShapes": true
1170
+ }
1171
+ },
1172
+ "waffle": {
1173
+ "html": "svg-waffle",
1174
+ "pptx": "shape",
1175
+ "dataTable": "notes",
1176
+ "min": {
1177
+ "vbHeightMin": 160
1178
+ },
1179
+ "path": {
1180
+ "forbidPresetShapes": true
1181
+ }
1182
+ },
1183
+ "radialbar": {
1184
+ "html": "svg-radialbar",
1185
+ "pptx": "shape",
1186
+ "dataTable": "notes",
1187
+ "min": {
1188
+ "pxWidthMin": 200
1189
+ },
1190
+ "path": {
1191
+ "minSamplePoints": 16,
1192
+ "forbidPresetShapes": true
1193
+ }
1194
+ },
1195
+ "rose": {
1196
+ "html": "svg-rose",
1197
+ "pptx": "shape",
1198
+ "dataTable": "notes",
1199
+ "min": {
1200
+ "pxWidthMin": 180
1201
+ },
1202
+ "path": {
1203
+ "minSamplePoints": 16,
1204
+ "forbidPresetShapes": true
1205
+ }
1206
+ },
1207
+ "candlestick": {
1208
+ "html": "svg-candle",
1209
+ "pptx": "shape",
1210
+ "dataTable": "appendix",
1211
+ "min": {
1212
+ "vbHeightMin": 180
1213
+ },
1214
+ "path": {
1215
+ "forbidPresetShapes": true
1216
+ }
1217
+ }
1218
+ }
1219
+ },
1220
+ "checkBudgets": {
1221
+ "$comment": "单页预算(validate_report.py 消费):char 单页纯文字上限 / unit 并列单元上限 / empty 过空页阈值 / fit 满屏页文字上限 / wrap 版心宽度断言 / trow 表格行数上限。bodyPx 供页高溢出静态估算(HTML 正文基准 px,与 modes 契约一致)。",
1222
+ "presentation": {
1223
+ "char": 1500,
1224
+ "unit": 8,
1225
+ "empty": 80,
1226
+ "fit": 1000,
1227
+ "wrap": 1400,
1228
+ "trow": 8,
1229
+ "bodyPx": 17
1230
+ },
1231
+ "research": {
1232
+ "char": 3200,
1233
+ "unit": 12,
1234
+ "empty": 120,
1235
+ "fit": 2200,
1236
+ "wrap": 1240,
1237
+ "trow": 16,
1238
+ "bodyPx": 15
1239
+ },
1240
+ "architecture": {
1241
+ "char": 600,
1242
+ "unit": 3,
1243
+ "empty": 60,
1244
+ "fit": 600,
1245
+ "wrap": 1600,
1246
+ "trow": 6,
1247
+ "bodyPx": 17
1248
+ }
1249
+ },
1250
+ "pageHeightEstimate": {
1251
+ "$comment": "HTML 页高溢出静态估算参数(validate_report.py 消费)。screenBudgetPx=1080p 内容预算(约 830px + 容差);wrapInsetPx=版心左右内边距合计;sheadPx=章节头固定高;unitPx=每个并列组件估算高;lineFactor=行高系数。真值以浏览器布局为准,本表只做交付前硬门禁的保守估算。",
1252
+ "screenBudgetPx": 1000,
1253
+ "wrapInsetPx": 112,
1254
+ "sheadPx": 190,
1255
+ "unitPx": 170,
1256
+ "lineFactor": 1.65
1257
+ },
1258
+ "emphasis": {
1259
+ "$comment": "强调带约束(validate_report.py 消费)。band--accent = 主题一致强调带(浅色/深色同向,用于收尾/CTA);band--accent--solid = 强调色实底带(引言/金句);band--deep = 反相强调页(浅色主题下渲染为深色,仅限显式选择)。deepMaxPages 限制反相页数量,deepForbiddenLast 禁止末页反相(否则浅色模式末尾出现深色页)。",
1260
+ "deepMaxPages": 1,
1261
+ "deepForbiddenLast": true,
1262
+ "deepAllowedIds": [
1263
+ "quote",
1264
+ "cover"
1265
+ ]
1266
+ },
1267
+ "annotations": {
1268
+ "$comment": "待核实标注(validate_report.py 消费)。.tbd 内联标注需配 .tbd-legend(页级图例)或 .flagbar(块级清单)说明,否则提示;flagMaxPerPage 单页标注上限。",
1269
+ "flagMaxPerPage": 12,
1270
+ "requireLegend": true
1271
+ },
1272
+ "contentQuality": {
1273
+ "$comment": "内容级质量门禁(validate_report.py 消费)——结构校验回答「有没有做」,本节回答「做得像不像专业材料」。rhythm.maxSameLayoutStreak = 同一版式签名连续页上限(超过 WARN);sowhat.minChars/forbidden = so-what 结论条禁空洞套话;researchTitle.requireDigitOrJudgment = research 行动标题须含数字或判断词(治「主题词式短标题」)。阈值只改这里。",
1274
+ "rhythm": {
1275
+ "maxSameLayoutStreak": 2,
1276
+ "skipIds": [
1277
+ "cover",
1278
+ "agenda",
1279
+ "refs",
1280
+ "appendix",
1281
+ "next"
1282
+ ]
1283
+ },
1284
+ "sowhat": {
1285
+ "minChars": 12,
1286
+ "maxChars": 90,
1287
+ "forbidden": [
1288
+ "需要持续关注",
1289
+ "值得进一步研究",
1290
+ "有待观察",
1291
+ "持续关注",
1292
+ "值得关注",
1293
+ "深入分析",
1294
+ "进一步研究",
1295
+ "需要进一步",
1296
+ "保持关注"
1297
+ ]
1298
+ },
1299
+ "researchTitle": {
1300
+ "$comment": "判断词负向前瞻(应用/需求/一览/将来…)不可省:去掉后『智能体平台的应用架构说明』这类主题词式长标题会因命中单字『应』而被误判为结论句,门禁形同虚设。",
1301
+ "minChars": 12,
1302
+ "requireDigitOrJudgment": true,
1303
+ "judgmentPattern": "\\d|[二两三四五六七八九十半]|一(?!览|体|致|直|些|般|系列|同|起|方面)|是(?!否)|应(?!用|急|对|届)|需(?!求)|将(?!来|近)|增|降|优先|瓶颈|关键|高于|低于|快于|慢于|第一|唯一|从.{1,12}到|翻倍|过半|不足|领先|落后|卡在|分化|出现|成为|仍|并非|必须|才能|才是|最大|最浅|最深|马当先|明显|尚在|已(?!知)|提升|贡献|占比|领跑|先行|滞后|分野|显著|差异|穿越|兑现|放量|[::—–]"
1304
+ }
1305
+ },
1306
+ "containers": {
1307
+ "$comment": "容器语义与内边距。文字是否溢出按「归属容器」判定(卡片/面板/图表区/单元格/结论条/so-what/标题区/页脚区/KPI 框),**不按整页画布**——即使未越出页面,越过归属容器即失败。pad = 容器内边距下限(英寸),validate_pptx.py 的容器级溢出检查按容器类型扣对应 pad;双引擎自适应排版共用本表。",
1308
+ "pad": {
1309
+ "card": 0.18,
1310
+ "panel": 0.2,
1311
+ "cell": 0.08,
1312
+ "band": 0.16,
1313
+ "soWhat": 0.16,
1314
+ "kpi": 0.18,
1315
+ "chart": 0.1,
1316
+ "head": 0.05,
1317
+ "footer": 0.05,
1318
+ "node": 0.06
1319
+ },
1320
+ "minPad": 0.06,
1321
+ "textMetrics": {
1322
+ "$comment": "PPTX 侧文本度量单源(build_pptx.js estTextH/fitFont 与 validate_pptx.py 溢出估算共用)。lineFactor 偏小会让校验器比生成引擎更宽松,造成溢出假阴——两侧必须同值。emAsciiRatio = 拉丁/数字相对 CJK 的字宽比。",
1323
+ "lineFactor": 1.45,
1324
+ "emAsciiRatio": 0.52
1325
+ },
1326
+ "overflowRule": "溢出处置优先级:① 优化内容(列表化/精炼/合并/拆页/换组合版式)→ ② 调整容器尺寸与行宽 → ③ 有限度缩小字号(见 fontShrink)→ ④ 仍装不下则拆页。禁止无限缩字号硬塞,也禁止把「精简」当第一手段砍掉决策必需信息。",
1327
+ "fontShrink": {
1328
+ "$comment": "有限缩字号策略(v8.2 放松)。内容确实偏多、优化格式与措辞后仍装不下时,允许在阶梯内下探;绝对下限按模式。优先顺序永远是:列表化/精炼 → 换组合/拆页 → 最后才缩字号。",
1329
+ "ladder": [
1330
+ 15,
1331
+ 14,
1332
+ 13.5,
1333
+ 13,
1334
+ 12.5,
1335
+ 12,
1336
+ 11.5,
1337
+ 11,
1338
+ 10.5,
1339
+ 10,
1340
+ 9.5,
1341
+ 9,
1342
+ 8.5
1343
+ ],
1344
+ "maxShrinkSteps": 4,
1345
+ "floorPt": {
1346
+ "presentation": 10,
1347
+ "research": 9,
1348
+ "architecture": 10
1349
+ },
1350
+ "preferContentFirst": true,
1351
+ "warnBelow": 9.5
1352
+ },
1353
+ "continuousTextRule": "语义连续的一句话 / so-what 主句 / 结论句 / 表格单元格正文不得拆成多个独立文本框(避免异常空格、断句、基线漂移);局部加粗高亮必须用同一文本框内富文本。"
1354
+ },
1355
+ "anchorTolerance": {
1356
+ "$comment": "空间锚点容差(深度模式)。centerPct = 中心点偏差上限(占参考框局部宽高比例);keyPx = 关键锚点(图标/标签/箭头端点)偏差上限(px,按 1280×720 参考图计);exactPx = 用户要求 1:1 时的上限。",
1357
+ "centerPct": 2.0,
1358
+ "keyPx": 6,
1359
+ "exactPx": 3,
1360
+ "priority": {
1361
+ "P0": {
1362
+ "tolerancePx": 3,
1363
+ "maxPx": 6,
1364
+ "fail": "Critical",
1365
+ "elements": "标题 / 主图 / so-what / 页脚 / 关键数字 / 核心面板"
1366
+ },
1367
+ "P1": {
1368
+ "tolerancePx": 4,
1369
+ "maxPx": 8,
1370
+ "fail": "High",
1371
+ "elements": "普通卡片 / 图标 / 标签 / 箭头 / 表格 / 分隔线"
1372
+ },
1373
+ "P2": {
1374
+ "tolerancePx": 6,
1375
+ "maxPx": 12,
1376
+ "fail": "Medium",
1377
+ "elements": "装饰线 / 点阵 / 纹理 / 重复刻度 / 背景纹样"
1378
+ }
1379
+ }
1380
+ },
1381
+ "layoutSystem": {
1382
+ "$comment": "布局语法单源(layout-grammar.md):预设骨架 P1–P12 / 元素规格 / 填充率 / 对齐。validate_report LAYOUT_* 与生成选型共用。",
1383
+ "presets": {
1384
+ "P1": {
1385
+ "name": "主从图文",
1386
+ "cols": [
1387
+ 7,
1388
+ 5
1389
+ ],
1390
+ "html": [
1391
+ "g-side",
1392
+ "g-side--rev"
1393
+ ],
1394
+ "weight": [
1395
+ 60,
1396
+ 40
1397
+ ],
1398
+ "pptx": [
1399
+ "split"
1400
+ ],
1401
+ "fill": [
1402
+ 62,
1403
+ 78
1404
+ ]
1405
+ },
1406
+ "P2": {
1407
+ "name": "通栏+底带",
1408
+ "cols": [
1409
+ 12
1410
+ ],
1411
+ "html": [
1412
+ "g-hero-full",
1413
+ "g-3",
1414
+ "rows-2"
1415
+ ],
1416
+ "weight": [
1417
+ 55,
1418
+ 45
1419
+ ],
1420
+ "pptx": [
1421
+ "bar",
1422
+ "diagram",
1423
+ "cards"
1424
+ ],
1425
+ "fill": [
1426
+ 70,
1427
+ 80
1428
+ ]
1429
+ },
1430
+ "P3": {
1431
+ "name": "大数佐证",
1432
+ "cols": [
1433
+ 5,
1434
+ 7
1435
+ ],
1436
+ "html": [
1437
+ "g-hero",
1438
+ "g-41",
1439
+ "g-14"
1440
+ ],
1441
+ "weight": [
1442
+ 45,
1443
+ 55
1444
+ ],
1445
+ "pptx": [
1446
+ "kpi"
1447
+ ],
1448
+ "fill": [
1449
+ 60,
1450
+ 70
1451
+ ]
1452
+ },
1453
+ "P4": {
1454
+ "name": "对称对照",
1455
+ "cols": [
1456
+ 6,
1457
+ 6
1458
+ ],
1459
+ "html": [
1460
+ "g-2",
1461
+ "g-half",
1462
+ "comparison"
1463
+ ],
1464
+ "weight": [
1465
+ 50,
1466
+ 50
1467
+ ],
1468
+ "pptx": [
1469
+ "comparison"
1470
+ ],
1471
+ "fill": [
1472
+ 70,
1473
+ 80
1474
+ ]
1475
+ },
1476
+ "P5": {
1477
+ "name": "三栏并列",
1478
+ "cols": [
1479
+ 4,
1480
+ 4,
1481
+ 4
1482
+ ],
1483
+ "html": [
1484
+ "g-3"
1485
+ ],
1486
+ "weight": [
1487
+ 33,
1488
+ 33,
1489
+ 34
1490
+ ],
1491
+ "pptx": [
1492
+ "cards",
1493
+ "threecol"
1494
+ ],
1495
+ "fill": [
1496
+ 70,
1497
+ 80
1498
+ ]
1499
+ },
1500
+ "P6": {
1501
+ "name": "四象限",
1502
+ "cols": [
1503
+ 6,
1504
+ 6
1505
+ ],
1506
+ "html": [
1507
+ "g-2",
1508
+ "g-quad"
1509
+ ],
1510
+ "weight": [
1511
+ 50,
1512
+ 50
1513
+ ],
1514
+ "pptx": [
1515
+ "cards",
1516
+ "split"
1517
+ ],
1518
+ "fill": [
1519
+ 75,
1520
+ 85
1521
+ ]
1522
+ },
1523
+ "P7": {
1524
+ "name": "侧栏主区",
1525
+ "cols": [
1526
+ 3,
1527
+ 6,
1528
+ 3
1529
+ ],
1530
+ "html": [
1531
+ "g-aside",
1532
+ "g-211"
1533
+ ],
1534
+ "weight": [
1535
+ 25,
1536
+ 55,
1537
+ 20
1538
+ ],
1539
+ "pptx": [
1540
+ "split"
1541
+ ],
1542
+ "fill": [
1543
+ 65,
1544
+ 75
1545
+ ]
1546
+ },
1547
+ "P8": {
1548
+ "name": "主区+注解列",
1549
+ "cols": [
1550
+ 8,
1551
+ 4
1552
+ ],
1553
+ "html": [
1554
+ "g-side",
1555
+ "g-31"
1556
+ ],
1557
+ "weight": [
1558
+ 70,
1559
+ 30
1560
+ ],
1561
+ "pptx": [
1562
+ "exhibit",
1563
+ "split"
1564
+ ],
1565
+ "fill": [
1566
+ 70,
1567
+ 80
1568
+ ]
1569
+ },
1570
+ "P9": {
1571
+ "name": "全幅结构",
1572
+ "cols": [
1573
+ 12
1574
+ ],
1575
+ "html": [
1576
+ "g-hero-full",
1577
+ "arch",
1578
+ "fig--full"
1579
+ ],
1580
+ "weight": [
1581
+ 100
1582
+ ],
1583
+ "pptx": [
1584
+ "diagram",
1585
+ "image",
1586
+ "lane"
1587
+ ],
1588
+ "fill": [
1589
+ 75,
1590
+ 90
1591
+ ]
1592
+ },
1593
+ "P10": {
1594
+ "name": "拼贴Bento",
1595
+ "cols": [
1596
+ 4
1597
+ ],
1598
+ "html": [
1599
+ "g-bento"
1600
+ ],
1601
+ "weight": [
1602
+ 40,
1603
+ 20,
1604
+ 20,
1605
+ 20
1606
+ ],
1607
+ "pptx": [
1608
+ "cards"
1609
+ ],
1610
+ "fill": [
1611
+ 75,
1612
+ 85
1613
+ ]
1614
+ },
1615
+ "P11": {
1616
+ "name": "主+双辅",
1617
+ "cols": [
1618
+ 2,
1619
+ 1,
1620
+ 1
1621
+ ],
1622
+ "html": [
1623
+ "g-211"
1624
+ ],
1625
+ "weight": [
1626
+ 50,
1627
+ 25,
1628
+ 25
1629
+ ],
1630
+ "pptx": [
1631
+ "split"
1632
+ ],
1633
+ "fill": [
1634
+ 70,
1635
+ 80
1636
+ ]
1637
+ },
1638
+ "P12": {
1639
+ "name": "双辅+主",
1640
+ "cols": [
1641
+ 1,
1642
+ 1,
1643
+ 2
1644
+ ],
1645
+ "html": [
1646
+ "g-121"
1647
+ ],
1648
+ "weight": [
1649
+ 25,
1650
+ 25,
1651
+ 50
1652
+ ],
1653
+ "pptx": [
1654
+ "split"
1655
+ ],
1656
+ "fill": [
1657
+ 70,
1658
+ 80
1659
+ ]
1660
+ }
1661
+ },
1662
+ "vMap": {
1663
+ "V1": "P1",
1664
+ "V2": "P2",
1665
+ "V3": "P3",
1666
+ "V4": "P4"
1667
+ },
1668
+ "pageToPreset": {
1669
+ "points": "P4",
1670
+ "cards": "P5",
1671
+ "metrics": "P2",
1672
+ "kpi": "P3",
1673
+ "table": "P8",
1674
+ "bar": "P8",
1675
+ "donut": "P3",
1676
+ "exhibit": "P8",
1677
+ "twocol": "P4",
1678
+ "threecol": "P5",
1679
+ "halftable": "P8",
1680
+ "matrix": "P7",
1681
+ "heatmap": "P7",
1682
+ "bullet": "P8",
1683
+ "pyramid": "P3",
1684
+ "timeline": "P2",
1685
+ "steps": "P2",
1686
+ "comparison": "P4",
1687
+ "split": "P1",
1688
+ "quote": "P3",
1689
+ "image": "P1",
1690
+ "diagram": "P9",
1691
+ "lane": "P9",
1692
+ "sankey": "P9",
1693
+ "treemap": "P9",
1694
+ "boxplot": "P9",
1695
+ "network": "P9",
1696
+ "marimekko": "P9",
1697
+ "streamgraph": "P9"
1698
+ },
1699
+ "defaultCharts": [
1700
+ "bar",
1701
+ "hbar",
1702
+ "line",
1703
+ "donut",
1704
+ "progress",
1705
+ "area",
1706
+ "stack",
1707
+ "dualline"
1708
+ ],
1709
+ "advancedCharts": [
1710
+ "waterfall",
1711
+ "gantt",
1712
+ "funnel",
1713
+ "slope",
1714
+ "dumbbell",
1715
+ "lollipop",
1716
+ "dotplot",
1717
+ "bulletchart",
1718
+ "waffle",
1719
+ "radialbar",
1720
+ "rose",
1721
+ "candlestick",
1722
+ "pareto",
1723
+ "gauge",
1724
+ "scatter",
1725
+ "bubble",
1726
+ "radar",
1727
+ "multidonut",
1728
+ "pie",
1729
+ "stackline",
1730
+ "vsbar",
1731
+ "sparkline"
1732
+ ],
1733
+ "fillTarget": {
1734
+ "presentation": [
1735
+ 62,
1736
+ 78
1737
+ ],
1738
+ "research": [
1739
+ 70,
1740
+ 85
1741
+ ],
1742
+ "architecture": [
1743
+ 75,
1744
+ 90
1745
+ ]
1746
+ },
1747
+ "zones": {
1748
+ "chromePct": [
1749
+ 18,
1750
+ 24
1751
+ ],
1752
+ "bodyPct": [
1753
+ 58,
1754
+ 70
1755
+ ],
1756
+ "annotationPct": [
1757
+ 10,
1758
+ 18
1759
+ ]
1760
+ },
1761
+ "elements": {
1762
+ "icon": {
1763
+ "sizesPx": [
1764
+ 16,
1765
+ 18,
1766
+ 20,
1767
+ 24
1768
+ ],
1769
+ "stroke": 1.8,
1770
+ "textGapPx": 8,
1771
+ "perScreen": [
1772
+ 3,
1773
+ 8
1774
+ ]
1775
+ },
1776
+ "list": {
1777
+ "maxItemLines": 2,
1778
+ "maxItemChars": 45,
1779
+ "itemGap": "sp-3",
1780
+ "maxPerCard": 4
1781
+ },
1782
+ "card": {
1783
+ "padToken": "sp-5",
1784
+ "equalHeight": true,
1785
+ "maxBullets": 4
1786
+ },
1787
+ "metric": {
1788
+ "perRow": [
1789
+ 4,
1790
+ 6
1791
+ ],
1792
+ "unitScale": 0.45,
1793
+ "tabular": true
1794
+ },
1795
+ "chart": {
1796
+ "labelNoOverlap": true,
1797
+ "labelMinPadPx": 8,
1798
+ "donutMaxHeightPct": 45,
1799
+ "simpleMaxHeightPct": 28
1800
+ },
1801
+ "media": {
1802
+ "ratioLocked": true,
1803
+ "align": "top",
1804
+ "caption": "below"
1805
+ },
1806
+ "info": {
1807
+ "connector": "orthogonal",
1808
+ "maxNodes": 24,
1809
+ "nodePadPx": [
1810
+ 8,
1811
+ 12
1812
+ ]
1813
+ }
1814
+ },
1815
+ "spacingTokens": [
1816
+ "sp-1",
1817
+ "sp-2",
1818
+ "sp-3",
1819
+ "sp-4",
1820
+ "sp-5",
1821
+ "sp-6",
1822
+ "sp-7",
1823
+ "sp-8",
1824
+ "gap",
1825
+ "band-pad"
1826
+ ],
1827
+ "multiFocus": {
1828
+ "$comment": "同页大件判定:图显示宽>版心55% 或 metric 字号>40px 或 全幅媒体。≥2 个大件且无主从权重声明 → LAYOUT_MULTI_FOCUS。",
1829
+ "chartWidthPct": 55,
1830
+ "metricFontPx": 40,
1831
+ "maxPrimary": 1
1832
+ },
1833
+ "align": {
1834
+ "mixedGridClasses": [
1835
+ "a-start",
1836
+ "a-c",
1837
+ "a-end",
1838
+ "align-items"
1839
+ ],
1840
+ "requireOnMixed": true
1841
+ }
1842
+ },
1843
+ "qualityGates": {
1844
+ "$comment": "v9 硬门禁阈值(validate_report / validate_pptx / quality_gate 消费)。tagLeakPatterns = 可见文本中禁止出现的 HTML 源码片段;titleOnly = 去页头后正文字符上限(低于即 TITLE_ONLY_PAGE);underfillCarriers = 承载组件数下限;roundtripMin = 模型代表性文本落页覆盖率下限(原 0.50 过松,放行截断);chartSkew = 极偏占比禁 donut/pie;chartOversize = 简单图占内容区面积上限。",
1845
+ "tagLeakPatterns": [
1846
+ "<a ",
1847
+ "</a>",
1848
+ "class=\"cite\"",
1849
+ "class='cite'",
1850
+ "href=",
1851
+ "<strong",
1852
+ "</strong>",
1853
+ "<span",
1854
+ "</span>",
1855
+ "<div",
1856
+ "</div>"
1857
+ ],
1858
+ "titleOnly": {
1859
+ "minBodyChars": 40
1860
+ },
1861
+ "underfill": {
1862
+ "minCarriers": 2,
1863
+ "exemptIds": [
1864
+ "quote",
1865
+ "cover",
1866
+ "refs",
1867
+ "appendix",
1868
+ "next",
1869
+ "closing"
1870
+ ]
1871
+ },
1872
+ "roundtripMin": 0.8,
1873
+ "chartSkew": {
1874
+ "$comment": "donut/pie/multidonut:最小扇区占比下限;maxMinRatio = 最大/最小超过该值则极偏,应改 KPI/进度/对比条。",
1875
+ "minSectorPct": 5,
1876
+ "maxMinRatio": 20,
1877
+ "types": [
1878
+ "donut",
1879
+ "pie",
1880
+ "multidonut"
1881
+ ]
1882
+ },
1883
+ "chartOversize": {
1884
+ "$comment": "简单图(类别≤simpleMaxCats 或数据点≤simpleMaxPts)占内容区面积上限;全幅仅限结构/全景/素材。",
1885
+ "simpleMaxCats": 2,
1886
+ "simpleMaxPts": 3,
1887
+ "maxContentAreaPct": 55
1888
+ }
1889
+ },
1890
+ "imageAdmission": {
1891
+ "$comment": "图片资产准入门。forbidden = 禁止图片化的区域(主信息层与简单图表必须原生重建);allowed = 可保留为图片的复杂视觉资产;maxPageAreaPct = 单页图片覆盖面积上限(超过须逐项说明);fullSlideRiskPct = 按整页背景风险处理阈值(内容页默认失败);placeholderIsNative = 配图占位由原生形状渲染(不是图片,不触发 pictures 门禁)。",
1892
+ "forbidden": [
1893
+ "标题",
1894
+ "副标题",
1895
+ "正文",
1896
+ "关键数字",
1897
+ "页脚",
1898
+ "页码",
1899
+ "so-what",
1900
+ "折线图",
1901
+ "柱状图",
1902
+ "坐标轴",
1903
+ "标签",
1904
+ "对比条",
1905
+ "简单流程箭头",
1906
+ "基础表格"
1907
+ ],
1908
+ "allowed": [
1909
+ "照片",
1910
+ "官方 Logo",
1911
+ "产品 UI",
1912
+ "复杂插画",
1913
+ "复杂纹理",
1914
+ "3D",
1915
+ "玻璃拟态",
1916
+ "光影材质"
1917
+ ],
1918
+ "maxPageAreaPct": 40,
1919
+ "fullSlideRiskPct": 90,
1920
+ "placeholderIsNative": true
1921
+ },
1922
+ "imageSpec": {
1923
+ "$comment": "素材图片规格与配图占位约定(HTML 与 PPTX 双引擎共用)。layouts = 支持的 image.layout 取值;multiLayouts = 支持 image.items 多图的版式;fitEnum = 裁切策略(cover 裁切填满 / contain 完整显示留白);recommendedSizePx = 各版式建议像素尺寸(占位符提示文本与 prepare_images.py 检查共用同一份);maxInlineBytes = 单图 data: 内联体积上限;maxTotalInlineBytes = 单份报告内联总量上限(超限改用相对路径);maxPerPage = 单页图片数上限;placeholderLabel/placeholderHintPrefix/Suffix 由双引擎拼接同一占位文本(cross_verify 逐页文本一致)。",
1924
+ "layouts": [
1925
+ "full",
1926
+ "half",
1927
+ "bleed",
1928
+ "grid",
1929
+ "compare",
1930
+ "wall"
1931
+ ],
1932
+ "multiLayouts": [
1933
+ "grid",
1934
+ "compare",
1935
+ "wall"
1936
+ ],
1937
+ "fitEnum": [
1938
+ "cover",
1939
+ "contain"
1940
+ ],
1941
+ "fitDefault": "cover",
1942
+ "formats": [
1943
+ "png",
1944
+ "jpeg",
1945
+ "jpg",
1946
+ "webp",
1947
+ "svg"
1948
+ ],
1949
+ "ratioDefault": {
1950
+ "full": "3:1",
1951
+ "half": "4:3",
1952
+ "bleed": "21:9",
1953
+ "grid": "4:3",
1954
+ "compare": "4:3",
1955
+ "wall": "1:1"
1956
+ },
1957
+ "ratioCssClass": {
1958
+ "full": "media--r3-1",
1959
+ "half": "media--r4-3",
1960
+ "bleed": "media--r21-9",
1961
+ "grid": "media--r4-3",
1962
+ "compare": "media--r4-3",
1963
+ "wall": "media--r1-1"
1964
+ },
1965
+ "recommendedSizePx": {
1966
+ "full": "2400×800",
1967
+ "half": "1400×1050",
1968
+ "bleed": "2560×1100",
1969
+ "grid": "900×675",
1970
+ "compare": "1400×1050",
1971
+ "wall": "480×480"
1972
+ },
1973
+ "maxInlineBytes": 1572864,
1974
+ "maxTotalInlineBytes": 8388608,
1975
+ "maxPerPage": 6,
1976
+ "placeholderLabel": "配图占位",
1977
+ "placeholderHintPrefix": "建议 ",
1978
+ "placeholderHintSuffix": "px",
1979
+ "zeroExternal": true,
1980
+ "qualityRule": "位图优先提供 ≥2× 显示尺寸;截图用 16:9 或 4:3 锁定比例;数据图不要用截图(应用内联 SVG 图表,可随主题变色)。"
1981
+ },
1982
+ "deepMode": {
1983
+ "$comment": "按需深度模式。触发词命中或页面含复杂信息图时自动升级:启用锚点注册、容器级溢出、渲染对照与 manifest 输出。默认关闭(保持轻量:一次问询 + 自动生成 + 校验闭环)。",
1984
+ "triggers": [
1985
+ "高保真",
1986
+ "1:1",
1987
+ "一比一",
1988
+ "精确还原",
1989
+ "按图还原",
1990
+ "正式交付",
1991
+ "不能偏移",
1992
+ "像素级",
1993
+ "严格对照",
1994
+ "逐页验收"
1995
+ ],
1996
+ "complexCharts": [
1997
+ "sankey",
1998
+ "streamgraph",
1999
+ "treemap",
2000
+ "marimekko",
2001
+ "boxplot",
2002
+ "network",
2003
+ "rose",
2004
+ "radialbar",
2005
+ "candlestick",
2006
+ "funnel"
2007
+ ],
2008
+ "checks": {
2009
+ "anchors": true,
2010
+ "containerOverflow": true,
2011
+ "renderCompare": true,
2012
+ "manifest": true
2013
+ },
2014
+ "renderCompare": {
2015
+ "engine": "soffice",
2016
+ "fallback": "powerpoint-com",
2017
+ "skipIfMissing": true,
2018
+ "dpi": 96
2019
+ }
2020
+ },
2021
+ "styleAccents": {
2022
+ "$comment": "各风格「强调色族」全部合法 hex(light/dark 主色 + 派生 hover/active 色)。validate_report.py 用它做「单一强调色」检查:正文出现其它风格的强调色即第二色相。audit_styles.py 校验本表覆盖 styles/stylesDark 的 accent。",
2023
+ "business-blue": [
2024
+ "1a73e8",
2025
+ "8ab4f8",
2026
+ "1b66c9",
2027
+ "4285f4",
2028
+ "a8c7fa"
2029
+ ],
2030
+ "apple-mono": [
2031
+ "1d1d1f",
2032
+ "f5f5f7",
2033
+ "0071e3",
2034
+ "2997ff",
2035
+ "e8e8ed"
2036
+ ],
2037
+ "mckinsey": [
2038
+ "003a70",
2039
+ "7fb2e5",
2040
+ "002a52",
2041
+ "a3c7ea"
2042
+ ],
2043
+ "brand-red": [
2044
+ "d0021b",
2045
+ "ff5a66",
2046
+ "b00217",
2047
+ "ff7a83"
2048
+ ],
2049
+ "warm-sand": [
2050
+ "96681f",
2051
+ "b07d2b",
2052
+ "d9b36a",
2053
+ "8f6117",
2054
+ "e0c184"
2055
+ ],
2056
+ "deep-teal": [
2057
+ "0f6b5c",
2058
+ "4fc3b0",
2059
+ "0d5a4e",
2060
+ "66cfbd"
2061
+ ],
2062
+ "graphite-dark": [
2063
+ "0369a1",
2064
+ "4da3ff",
2065
+ "075985",
2066
+ "6fb2ff"
2067
+ ],
2068
+ "indigo-violet": [
2069
+ "5b5bd6",
2070
+ "a5a4f0",
2071
+ "4848c0",
2072
+ "b6b5f5"
2073
+ ],
2074
+ "spectrum": [
2075
+ "4563ef",
2076
+ "8ba0f8",
2077
+ "3d5bef",
2078
+ "93a7f9"
2079
+ ]
2080
+ },
2081
+ "aiFlavor": {
2082
+ "$comment": "去AI味高危词(validate_report.py 与 content-rules.md 共用同一份;正则为子串/表达式)。",
2083
+ "words": [
2084
+ "赋能",
2085
+ "彰显",
2086
+ "凸显",
2087
+ "格局",
2088
+ "不仅",
2089
+ "大幅提升",
2090
+ "显著提升",
2091
+ "深刻",
2092
+ "至关重要",
2093
+ "无缝",
2094
+ "极致",
2095
+ "未来可期",
2096
+ "迈上新",
2097
+ "开启新",
2098
+ "见证了",
2099
+ "标志着",
2100
+ "充满活力",
2101
+ "值得一提",
2102
+ "众所周知",
2103
+ "毫无疑问",
2104
+ "随着.{0,6}的不断",
2105
+ "在.{0,6}的背景下"
2106
+ ]
2107
+ },
2108
+ "stylesFontPolicy": "PPTX font/fontDisplay 一律 Microsoft YaHei(Windows/Mac Office 可用;禁 PingFang SC / SimSun 单点)。HTML 侧 engine.css 用完整 fallback 栈承载风格字体语汇(衬线/系统栈/字阶/字距/圆角/密度),色 token 与本表双源一致。PPTX 不跟 HTML 换字体族——投影可读性优先于字体个性。",
2109
+ "styleIdentity": {
2110
+ "$comment": "HTML 侧风格语汇清单(与 engine.css 的 html[data-style=X] 覆盖块一一对应)。audit_styles.py 校验:每套至少含 font-body / font-display / radius;声明 serifDisplay 的必须是 serif 栈;声明 typeBoost 的必须覆盖 fs-display;声明 link 的必须有 --link。改语汇改 engine.css + 本表 + styles.md 三处,再跑 sync_runtime + audit_styles。",
2111
+ "business-blue": {
2112
+ "radius": "16px",
2113
+ "serifDisplay": false,
2114
+ "typeBoost": false,
2115
+ "density": "normal",
2116
+ "mood": "google-material"
2117
+ },
2118
+ "apple-mono": {
2119
+ "radius": "20px",
2120
+ "serifDisplay": false,
2121
+ "typeBoost": true,
2122
+ "density": "airy",
2123
+ "link": "#0071e3",
2124
+ "mood": "apple-minimal"
2125
+ },
2126
+ "mckinsey": {
2127
+ "radius": "6px",
2128
+ "serifDisplay": true,
2129
+ "typeBoost": false,
2130
+ "density": "dense",
2131
+ "letterEyebrow": ".14em",
2132
+ "mood": "consulting"
2133
+ },
2134
+ "brand-red": {
2135
+ "radius": "14px",
2136
+ "serifDisplay": false,
2137
+ "typeBoost": false,
2138
+ "density": "normal",
2139
+ "mood": "formal-brand"
2140
+ },
2141
+ "warm-sand": {
2142
+ "radius": "12px",
2143
+ "serifDisplay": true,
2144
+ "typeBoost": false,
2145
+ "density": "airy",
2146
+ "mood": "editorial"
2147
+ },
2148
+ "deep-teal": {
2149
+ "radius": "12px",
2150
+ "serifDisplay": false,
2151
+ "typeBoost": false,
2152
+ "density": "normal",
2153
+ "mood": "trust-finance"
2154
+ },
2155
+ "graphite-dark": {
2156
+ "radius": "14px",
2157
+ "serifDisplay": false,
2158
+ "typeBoost": false,
2159
+ "density": "dense",
2160
+ "mood": "immersive-graphite"
2161
+ },
2162
+ "indigo-violet": {
2163
+ "radius": "16px",
2164
+ "serifDisplay": false,
2165
+ "typeBoost": false,
2166
+ "density": "normal",
2167
+ "mood": "tech-frontier"
2168
+ },
2169
+ "spectrum": {
2170
+ "radius": "14px",
2171
+ "serifDisplay": false,
2172
+ "typeBoost": false,
2173
+ "density": "dense",
2174
+ "mood": "data-board"
2175
+ }
2176
+ },
2177
+ "styles": {
2178
+ "business-blue": {
2179
+ "accent": "1A73E8",
2180
+ "ink": "202124",
2181
+ "body": "5F6368",
2182
+ "faint": "80868B",
2183
+ "bg": "FFFFFF",
2184
+ "surface": "F8F9FA",
2185
+ "line": "DADCE0",
2186
+ "soft": "E8F0FE",
2187
+ "onAccent": "FFFFFF",
2188
+ "font": "Microsoft YaHei",
2189
+ "fontDisplay": "Microsoft YaHei"
2190
+ },
2191
+ "apple-mono": {
2192
+ "accent": "1D1D1F",
2193
+ "ink": "1D1D1F",
2194
+ "body": "6E6E73",
2195
+ "faint": "86868B",
2196
+ "bg": "FFFFFF",
2197
+ "surface": "F5F5F7",
2198
+ "line": "D2D2D7",
2199
+ "soft": "F5F5F7",
2200
+ "onAccent": "FFFFFF",
2201
+ "font": "Microsoft YaHei",
2202
+ "fontDisplay": "Microsoft YaHei"
2203
+ },
2204
+ "mckinsey": {
2205
+ "accent": "003A70",
2206
+ "ink": "101828",
2207
+ "body": "475467",
2208
+ "faint": "667085",
2209
+ "bg": "FFFFFF",
2210
+ "surface": "F2F4F7",
2211
+ "line": "D0D5DD",
2212
+ "soft": "EEF4FB",
2213
+ "onAccent": "FFFFFF",
2214
+ "font": "Microsoft YaHei",
2215
+ "fontDisplay": "Microsoft YaHei"
2216
+ },
2217
+ "brand-red": {
2218
+ "accent": "D0021B",
2219
+ "ink": "1F1A1B",
2220
+ "body": "5D5456",
2221
+ "faint": "8A8083",
2222
+ "bg": "FFFFFF",
2223
+ "surface": "FAF7F7",
2224
+ "line": "E2D9DA",
2225
+ "soft": "FBECEC",
2226
+ "onAccent": "FFFFFF",
2227
+ "font": "Microsoft YaHei",
2228
+ "fontDisplay": "Microsoft YaHei"
2229
+ },
2230
+ "warm-sand": {
2231
+ "accent": "96681F",
2232
+ "ink": "2A2521",
2233
+ "body": "6B5F52",
2234
+ "faint": "93836F",
2235
+ "bg": "FBF9F6",
2236
+ "surface": "F6F2EC",
2237
+ "line": "E0D7C9",
2238
+ "soft": "F3ECDD",
2239
+ "onAccent": "FFFFFF",
2240
+ "font": "Microsoft YaHei",
2241
+ "fontDisplay": "Microsoft YaHei"
2242
+ },
2243
+ "deep-teal": {
2244
+ "accent": "0F6B5C",
2245
+ "ink": "14201E",
2246
+ "body": "4A5A57",
2247
+ "faint": "73837F",
2248
+ "bg": "FFFFFF",
2249
+ "surface": "F2F6F5",
2250
+ "line": "CFDEDC",
2251
+ "soft": "E4F1EE",
2252
+ "onAccent": "FFFFFF",
2253
+ "font": "Microsoft YaHei",
2254
+ "fontDisplay": "Microsoft YaHei"
2255
+ },
2256
+ "graphite-dark": {
2257
+ "accent": "0369A1",
2258
+ "ink": "1A1D21",
2259
+ "body": "4B5158",
2260
+ "faint": "767C84",
2261
+ "bg": "F4F5F7",
2262
+ "surface": "ECEEF1",
2263
+ "line": "CED1D6",
2264
+ "soft": "E2EFF7",
2265
+ "onAccent": "FFFFFF",
2266
+ "font": "Microsoft YaHei",
2267
+ "fontDisplay": "Microsoft YaHei"
2268
+ },
2269
+ "indigo-violet": {
2270
+ "accent": "5B5BD6",
2271
+ "ink": "1B1A2E",
2272
+ "body": "52506B",
2273
+ "faint": "7A779A",
2274
+ "bg": "FFFFFF",
2275
+ "surface": "F4F4FB",
2276
+ "line": "D7D7E8",
2277
+ "soft": "ECECF9",
2278
+ "onAccent": "FFFFFF",
2279
+ "font": "Microsoft YaHei",
2280
+ "fontDisplay": "Microsoft YaHei"
2281
+ },
2282
+ "spectrum": {
2283
+ "accent": "4563EF",
2284
+ "ink": "171A21",
2285
+ "body": "4D5566",
2286
+ "faint": "7B8494",
2287
+ "bg": "FBFCFE",
2288
+ "surface": "F4F6FA",
2289
+ "line": "D6DCE6",
2290
+ "soft": "ECEEFF",
2291
+ "onAccent": "FFFFFF",
2292
+ "font": "Microsoft YaHei",
2293
+ "fontDisplay": "Microsoft YaHei"
2294
+ }
2295
+ },
2296
+ "stylesDark": {
2297
+ "business-blue": {
2298
+ "accent": "8AB4F8",
2299
+ "ink": "E8EAED",
2300
+ "body": "ADB4BD",
2301
+ "faint": "868D96",
2302
+ "bg": "0D0F13",
2303
+ "surface": "191D23",
2304
+ "line": "2F353D",
2305
+ "soft": "16243A",
2306
+ "onAccent": "0D1B2E",
2307
+ "font": "Microsoft YaHei",
2308
+ "fontDisplay": "Microsoft YaHei"
2309
+ },
2310
+ "apple-mono": {
2311
+ "accent": "F5F5F7",
2312
+ "ink": "F5F5F7",
2313
+ "body": "A1A1A6",
2314
+ "faint": "86868B",
2315
+ "bg": "000000",
2316
+ "surface": "161617",
2317
+ "line": "38383D",
2318
+ "soft": "1D1D1F",
2319
+ "onAccent": "000000",
2320
+ "font": "Microsoft YaHei",
2321
+ "fontDisplay": "Microsoft YaHei"
2322
+ },
2323
+ "mckinsey": {
2324
+ "accent": "7FB2E5",
2325
+ "ink": "E4E7EC",
2326
+ "body": "AAB3C2",
2327
+ "faint": "8A94A6",
2328
+ "bg": "0C1116",
2329
+ "surface": "12181F",
2330
+ "line": "2A3342",
2331
+ "soft": "12233A",
2332
+ "onAccent": "0C1A2E",
2333
+ "font": "Microsoft YaHei",
2334
+ "fontDisplay": "Microsoft YaHei"
2335
+ },
2336
+ "brand-red": {
2337
+ "accent": "FF5A66",
2338
+ "ink": "F3ECEC",
2339
+ "body": "C4B6B7",
2340
+ "faint": "9A8D8E",
2341
+ "bg": "130D0E",
2342
+ "surface": "1A1213",
2343
+ "line": "37272A",
2344
+ "soft": "331518",
2345
+ "onAccent": "2A0D10",
2346
+ "font": "Microsoft YaHei",
2347
+ "fontDisplay": "Microsoft YaHei"
2348
+ },
2349
+ "warm-sand": {
2350
+ "accent": "D9B36A",
2351
+ "ink": "ECE5DB",
2352
+ "body": "C4B8A8",
2353
+ "faint": "9B8D7A",
2354
+ "bg": "15120E",
2355
+ "surface": "1D1913",
2356
+ "line": "3A3128",
2357
+ "soft": "2E2417",
2358
+ "onAccent": "2A1F10",
2359
+ "font": "Microsoft YaHei",
2360
+ "fontDisplay": "Microsoft YaHei"
2361
+ },
2362
+ "deep-teal": {
2363
+ "accent": "4FC3B0",
2364
+ "ink": "E2ECEA",
2365
+ "body": "B3C2BF",
2366
+ "faint": "86948F",
2367
+ "bg": "0D1312",
2368
+ "surface": "131B1A",
2369
+ "line": "293834",
2370
+ "soft": "12312C",
2371
+ "onAccent": "0C2420",
2372
+ "font": "Microsoft YaHei",
2373
+ "fontDisplay": "Microsoft YaHei"
2374
+ },
2375
+ "graphite-dark": {
2376
+ "accent": "4DA3FF",
2377
+ "ink": "EEF2F6",
2378
+ "body": "B9C2CD",
2379
+ "faint": "85909D",
2380
+ "bg": "0B0E12",
2381
+ "surface": "171D24",
2382
+ "line": "2B3540",
2383
+ "soft": "132841",
2384
+ "onAccent": "07182B",
2385
+ "font": "Microsoft YaHei",
2386
+ "fontDisplay": "Microsoft YaHei"
2387
+ },
2388
+ "indigo-violet": {
2389
+ "accent": "A5A4F0",
2390
+ "ink": "E6E5F5",
2391
+ "body": "B6B4D4",
2392
+ "faint": "8B89B0",
2393
+ "bg": "100F1C",
2394
+ "surface": "171629",
2395
+ "line": "322F52",
2396
+ "soft": "232146",
2397
+ "onAccent": "171631",
2398
+ "font": "Microsoft YaHei",
2399
+ "fontDisplay": "Microsoft YaHei"
2400
+ },
2401
+ "spectrum": {
2402
+ "accent": "8BA0F8",
2403
+ "ink": "E8EBF2",
2404
+ "body": "A7AFBF",
2405
+ "faint": "7E8798",
2406
+ "bg": "0E1116",
2407
+ "surface": "171C26",
2408
+ "line": "2B3342",
2409
+ "soft": "1B2242",
2410
+ "onAccent": "141A38",
2411
+ "font": "Microsoft YaHei",
2412
+ "fontDisplay": "Microsoft YaHei"
2413
+ }
2414
+ },
2415
+ "styleDataColors": {
2416
+ "$comment": "编码色板(单源):**每套风格各自的 5 色数据系列色板**,供多系列图表(多段环形/分组柱/多折线/散点分组/桑基流带/马赛克段)使用,经 .f-c1~c5 / .s-c1~c5 语义类生效(HTML)与 dataColors()(PPTX 双引擎)。与结构色纪律正交:结构色(标题/正文/边框/按钮/大面积底色)永远中性 + 单一强调色,编码色只出现在数据本体。c1 恒等于该风格强调色;c2/c3 为近似色,c4/c5 为降饱和补色。**色值一律为不带 # 的裸 hex**(与 styles / stylesDark / styleAccents 同口径)——# 前缀会原样流入 OOXML srgbClr val 造成非法色值;HTML 侧由 engine.css 覆盖块补 #。改色值改这里,再跑 sync_runtime.py + audit_styles.py。",
2417
+ "business-blue": [
2418
+ "1a73e8",
2419
+ "3526bb",
2420
+ "21a199",
2421
+ "b77148",
2422
+ "99983d"
2423
+ ],
2424
+ "apple-mono": [
2425
+ "1d1d1f",
2426
+ "0071e3",
2427
+ "0f7b6c",
2428
+ "c2410c",
2429
+ "7c3aed"
2430
+ ],
2431
+ "mckinsey": [
2432
+ "003a70",
2433
+ "2826bb",
2434
+ "21a18e",
2435
+ "b76848",
2436
+ "99903d"
2437
+ ],
2438
+ "brand-red": [
2439
+ "d0021b",
2440
+ "bb6326",
2441
+ "d634ae",
2442
+ "40a182",
2443
+ "438aa8"
2444
+ ],
2445
+ "warm-sand": [
2446
+ "96681f",
2447
+ "839324",
2448
+ "cf3b3e",
2449
+ "4d88b2",
2450
+ "4a47a4"
2451
+ ],
2452
+ "deep-teal": [
2453
+ "0f6b5c",
2454
+ "2683bb",
2455
+ "22aa3e",
2456
+ "b74870",
2457
+ "a85c43"
2458
+ ],
2459
+ "graphite-dark": [
2460
+ "0369a1",
2461
+ "2637bb",
2462
+ "1f9977",
2463
+ "b75948",
2464
+ "a18a40"
2465
+ ],
2466
+ "indigo-violet": [
2467
+ "5b5bd6",
2468
+ "7432ae",
2469
+ "4197c8",
2470
+ "a08f4b",
2471
+ "7ca04b"
2472
+ ],
2473
+ "spectrum": [
2474
+ "4563ef",
2475
+ "5b26bb",
2476
+ "269ebb",
2477
+ "af8746",
2478
+ "83993d"
2479
+ ]
2480
+ },
2481
+ "styleDataColorsDark": {
2482
+ "$comment": "编码色板 · 深色主题版(同一套风格的深色变体,明度抬高以保证在近黑底上可辨)。HTML 侧由 engine.css 的 [data-theme=dark] 覆盖块消费;PPTX 侧按 model.theme 选择本表或 styleDataColors。",
2483
+ "business-blue": [
2484
+ "8ab4f8",
2485
+ "7966e0",
2486
+ "88e7e5",
2487
+ "d4ad91",
2488
+ "cbce83"
2489
+ ],
2490
+ "apple-mono": [
2491
+ "f5f5f7",
2492
+ "2997ff",
2493
+ "2dd4bf",
2494
+ "ff9f0a",
2495
+ "bf5af2"
2496
+ ],
2497
+ "mckinsey": [
2498
+ "7fb2e5",
2499
+ "6f6bdb",
2500
+ "8ce3d8",
2501
+ "d1a694",
2502
+ "cbc586"
2503
+ ],
2504
+ "brand-red": [
2505
+ "ff5a66",
2506
+ "e09e66",
2507
+ "e788cb",
2508
+ "91d4c2",
2509
+ "83b4ce"
2510
+ ],
2511
+ "warm-sand": [
2512
+ "d9b36a",
2513
+ "c2d571",
2514
+ "df9391",
2515
+ "97b5ce",
2516
+ "8e89c7"
2517
+ ],
2518
+ "deep-teal": [
2519
+ "4fc3b0",
2520
+ "7aaecd",
2521
+ "97d8a4",
2522
+ "c99cac",
2523
+ "c29c8f"
2524
+ ],
2525
+ "graphite-dark": [
2526
+ "4da3ff",
2527
+ "6c66e0",
2528
+ "88e7dc",
2529
+ "d4a691",
2530
+ "cec983"
2531
+ ],
2532
+ "indigo-violet": [
2533
+ "a5a4f0",
2534
+ "a967e0",
2535
+ "89c3e7",
2536
+ "d3c792",
2537
+ "aece83"
2538
+ ],
2539
+ "spectrum": [
2540
+ "8ba0f8",
2541
+ "9066e0",
2542
+ "88d6e7",
2543
+ "d4ba91",
2544
+ "bdce83"
2545
+ ]
2546
+ },
2547
+ "layoutSlots": {
2548
+ "$comment": "页型布局 IR(Layout Intermediate Representation):全部可交付页型的语义槽位。双通道按同一槽位语义落位;坐标以 layout-constants.json pageTypes 为唯一几何源,scripts/lib_layout_regions.js 将槽位映射为英寸矩形。role: primary/secondary/annotation/chrome。required: true 表示缺了即不合格。",
2549
+ "version": "0.1",
2550
+ "pageTypes": {
2551
+ "points": {
2552
+ "mode": [
2553
+ "presentation",
2554
+ "research",
2555
+ "architecture"
2556
+ ],
2557
+ "slots": [
2558
+ {
2559
+ "id": "head",
2560
+ "role": "chrome",
2561
+ "required": true,
2562
+ "html": ".shead",
2563
+ "pptx": "head()"
2564
+ },
2565
+ {
2566
+ "id": "primary",
2567
+ "role": "primary",
2568
+ "required": true,
2569
+ "html": ".grid.g-2 / .card / .ul",
2570
+ "pptx": "points columns",
2571
+ "minUnits": 1
2572
+ },
2573
+ {
2574
+ "id": "annotation",
2575
+ "role": "annotation",
2576
+ "required": false,
2577
+ "html": ".sowhat / .note",
2578
+ "pptx": "soWhatBar / footnoteLine"
2579
+ }
2580
+ ]
2581
+ },
2582
+ "metrics": {
2583
+ "mode": [
2584
+ "presentation",
2585
+ "research"
2586
+ ],
2587
+ "slots": [
2588
+ {
2589
+ "id": "head",
2590
+ "role": "chrome",
2591
+ "required": true,
2592
+ "html": ".shead",
2593
+ "pptx": "head()"
2594
+ },
2595
+ {
2596
+ "id": "primary",
2597
+ "role": "primary",
2598
+ "required": true,
2599
+ "html": ".metric",
2600
+ "pptx": "metric row",
2601
+ "minUnits": 4
2602
+ },
2603
+ {
2604
+ "id": "annotation",
2605
+ "role": "annotation",
2606
+ "required": false,
2607
+ "html": "口径行 / .sowhat",
2608
+ "pptx": "footnoteLine / soWhatBar"
2609
+ }
2610
+ ]
2611
+ },
2612
+ "kpi": {
2613
+ "mode": [
2614
+ "presentation",
2615
+ "research"
2616
+ ],
2617
+ "slots": [
2618
+ {
2619
+ "id": "head",
2620
+ "role": "chrome",
2621
+ "required": true,
2622
+ "html": ".shead",
2623
+ "pptx": "head()"
2624
+ },
2625
+ {
2626
+ "id": "hero",
2627
+ "role": "primary",
2628
+ "required": true,
2629
+ "html": ".t-metric hero",
2630
+ "pptx": "hero number"
2631
+ },
2632
+ {
2633
+ "id": "metrics",
2634
+ "role": "secondary",
2635
+ "required": false,
2636
+ "html": ".metric",
2637
+ "pptx": "support metrics"
2638
+ },
2639
+ {
2640
+ "id": "annotation",
2641
+ "role": "annotation",
2642
+ "required": false,
2643
+ "html": ".sowhat / .note",
2644
+ "pptx": "soWhatBar"
2645
+ }
2646
+ ]
2647
+ },
2648
+ "exhibit": {
2649
+ "mode": [
2650
+ "research",
2651
+ "presentation"
2652
+ ],
2653
+ "slots": [
2654
+ {
2655
+ "id": "head",
2656
+ "role": "chrome",
2657
+ "required": true,
2658
+ "html": ".shead / .exhibit__hd",
2659
+ "pptx": "head()"
2660
+ },
2661
+ {
2662
+ "id": "primary",
2663
+ "role": "primary",
2664
+ "required": true,
2665
+ "html": "svg[data-chart] / .exhibit",
2666
+ "pptx": "nativeChart | shapeChart",
2667
+ "channel": "registry"
2668
+ },
2669
+ {
2670
+ "id": "secondary",
2671
+ "role": "secondary",
2672
+ "required": false,
2673
+ "html": "要点列表",
2674
+ "pptx": "side bullets"
2675
+ },
2676
+ {
2677
+ "id": "annotation",
2678
+ "role": "annotation",
2679
+ "required": true,
2680
+ "html": ".exhibit__src / .sowhat",
2681
+ "pptx": "footnoteLine / soWhatBar / notes"
2682
+ }
2683
+ ]
2684
+ },
2685
+ "split": {
2686
+ "mode": [
2687
+ "presentation",
2688
+ "research",
2689
+ "architecture"
2690
+ ],
2691
+ "slots": [
2692
+ {
2693
+ "id": "head",
2694
+ "role": "chrome",
2695
+ "required": true,
2696
+ "html": ".shead",
2697
+ "pptx": "head()"
2698
+ },
2699
+ {
2700
+ "id": "left",
2701
+ "role": "primary",
2702
+ "required": true,
2703
+ "html": "左区(points/table/image/chart)",
2704
+ "pptx": "left zone"
2705
+ },
2706
+ {
2707
+ "id": "right",
2708
+ "role": "secondary",
2709
+ "required": true,
2710
+ "html": "右区(points/table/image/chart)",
2711
+ "pptx": "right zone"
2712
+ },
2713
+ {
2714
+ "id": "annotation",
2715
+ "role": "annotation",
2716
+ "required": false,
2717
+ "html": ".sowhat / .note",
2718
+ "pptx": "soWhatBar"
2719
+ }
2720
+ ]
2721
+ },
2722
+ "table": {
2723
+ "mode": [
2724
+ "presentation",
2725
+ "research"
2726
+ ],
2727
+ "slots": [
2728
+ {
2729
+ "id": "head",
2730
+ "role": "chrome",
2731
+ "required": true,
2732
+ "html": ".shead",
2733
+ "pptx": "head()"
2734
+ },
2735
+ {
2736
+ "id": "primary",
2737
+ "role": "primary",
2738
+ "required": true,
2739
+ "html": ".tbl-wrap table",
2740
+ "pptx": "addTable",
2741
+ "maxRows": {
2742
+ "presentation": 8,
2743
+ "research": 16
2744
+ }
2745
+ },
2746
+ {
2747
+ "id": "annotation",
2748
+ "role": "annotation",
2749
+ "required": false,
2750
+ "html": ".sowhat / .note",
2751
+ "pptx": "soWhatBar / footnoteLine"
2752
+ }
2753
+ ]
2754
+ },
2755
+ "bar": {
2756
+ "mode": [
2757
+ "presentation",
2758
+ "research",
2759
+ "architecture"
2760
+ ],
2761
+ "slots": [
2762
+ {
2763
+ "id": "head",
2764
+ "role": "chrome",
2765
+ "required": true,
2766
+ "html": ".shead",
2767
+ "pptx": "head()"
2768
+ },
2769
+ {
2770
+ "id": "primary",
2771
+ "role": "primary",
2772
+ "required": true,
2773
+ "html": "svg[data-chart]",
2774
+ "pptx": "nativeChart | shapeChart",
2775
+ "channel": "registry"
2776
+ },
2777
+ {
2778
+ "id": "annotation",
2779
+ "role": "annotation",
2780
+ "required": true,
2781
+ "html": "note / dataTable",
2782
+ "pptx": "footnoteLine / notes / inline table"
2783
+ }
2784
+ ]
2785
+ },
2786
+ "donut": {
2787
+ "mode": [
2788
+ "presentation",
2789
+ "research"
2790
+ ],
2791
+ "slots": [
2792
+ {
2793
+ "id": "head",
2794
+ "role": "chrome",
2795
+ "required": true,
2796
+ "html": ".shead",
2797
+ "pptx": "head()"
2798
+ },
2799
+ {
2800
+ "id": "primary",
2801
+ "role": "primary",
2802
+ "required": true,
2803
+ "html": "svg[data-chart=donut]",
2804
+ "pptx": "addChart doughnut"
2805
+ },
2806
+ {
2807
+ "id": "annotation",
2808
+ "role": "annotation",
2809
+ "required": false,
2810
+ "html": "中心合计 / 图例 / .note",
2811
+ "pptx": "center label / legend / notes"
2812
+ }
2813
+ ]
2814
+ },
2815
+ "twocol": {
2816
+ "mode": [
2817
+ "research"
2818
+ ],
2819
+ "slots": [
2820
+ {
2821
+ "id": "head",
2822
+ "role": "chrome",
2823
+ "required": true,
2824
+ "html": ".shead",
2825
+ "pptx": "head()"
2826
+ },
2827
+ {
2828
+ "id": "primary",
2829
+ "role": "primary",
2830
+ "required": true,
2831
+ "html": ".cols-2",
2832
+ "pptx": "two text columns"
2833
+ },
2834
+ {
2835
+ "id": "annotation",
2836
+ "role": "annotation",
2837
+ "required": false,
2838
+ "html": ".sowhat",
2839
+ "pptx": "soWhatBar"
2840
+ }
2841
+ ]
2842
+ },
2843
+ "threecol": {
2844
+ "mode": [
2845
+ "research"
2846
+ ],
2847
+ "slots": [
2848
+ {
2849
+ "id": "head",
2850
+ "role": "chrome",
2851
+ "required": true,
2852
+ "html": ".shead",
2853
+ "pptx": "head()"
2854
+ },
2855
+ {
2856
+ "id": "primary",
2857
+ "role": "primary",
2858
+ "required": true,
2859
+ "html": ".cols-3",
2860
+ "pptx": "three text columns"
2861
+ },
2862
+ {
2863
+ "id": "annotation",
2864
+ "role": "annotation",
2865
+ "required": false,
2866
+ "html": ".sowhat",
2867
+ "pptx": "soWhatBar"
2868
+ }
2869
+ ]
2870
+ },
2871
+ "halftable": {
2872
+ "mode": [
2873
+ "research"
2874
+ ],
2875
+ "slots": [
2876
+ {
2877
+ "id": "head",
2878
+ "role": "chrome",
2879
+ "required": true,
2880
+ "html": ".shead",
2881
+ "pptx": "head()"
2882
+ },
2883
+ {
2884
+ "id": "primary",
2885
+ "role": "primary",
2886
+ "required": true,
2887
+ "html": "左表",
2888
+ "pptx": "addTable left"
2889
+ },
2890
+ {
2891
+ "id": "secondary",
2892
+ "role": "secondary",
2893
+ "required": true,
2894
+ "html": "右图",
2895
+ "pptx": "chart right"
2896
+ },
2897
+ {
2898
+ "id": "annotation",
2899
+ "role": "annotation",
2900
+ "required": false,
2901
+ "html": ".sowhat",
2902
+ "pptx": "soWhatBar"
2903
+ }
2904
+ ]
2905
+ },
2906
+ "matrix": {
2907
+ "mode": [
2908
+ "research"
2909
+ ],
2910
+ "slots": [
2911
+ {
2912
+ "id": "head",
2913
+ "role": "chrome",
2914
+ "required": true,
2915
+ "html": ".shead",
2916
+ "pptx": "head()"
2917
+ },
2918
+ {
2919
+ "id": "primary",
2920
+ "role": "primary",
2921
+ "required": true,
2922
+ "html": ".matrix",
2923
+ "pptx": "matrix cells"
2924
+ },
2925
+ {
2926
+ "id": "annotation",
2927
+ "role": "annotation",
2928
+ "required": false,
2929
+ "html": ".sowhat",
2930
+ "pptx": "soWhatBar"
2931
+ }
2932
+ ]
2933
+ },
2934
+ "comparison": {
2935
+ "mode": [
2936
+ "presentation",
2937
+ "research"
2938
+ ],
2939
+ "slots": [
2940
+ {
2941
+ "id": "head",
2942
+ "role": "chrome",
2943
+ "required": true,
2944
+ "html": ".shead",
2945
+ "pptx": "head()"
2946
+ },
2947
+ {
2948
+ "id": "left",
2949
+ "role": "primary",
2950
+ "required": true,
2951
+ "html": "左面板",
2952
+ "pptx": "left panel"
2953
+ },
2954
+ {
2955
+ "id": "right",
2956
+ "role": "secondary",
2957
+ "required": true,
2958
+ "html": "右面板",
2959
+ "pptx": "right panel"
2960
+ },
2961
+ {
2962
+ "id": "annotation",
2963
+ "role": "annotation",
2964
+ "required": false,
2965
+ "html": "verdict / .sowhat",
2966
+ "pptx": "verdict bar"
2967
+ }
2968
+ ]
2969
+ },
2970
+ "quote": {
2971
+ "mode": [
2972
+ "presentation",
2973
+ "research"
2974
+ ],
2975
+ "slots": [
2976
+ {
2977
+ "id": "head",
2978
+ "role": "chrome",
2979
+ "required": true,
2980
+ "html": ".shead",
2981
+ "pptx": "head()"
2982
+ },
2983
+ {
2984
+ "id": "primary",
2985
+ "role": "primary",
2986
+ "required": true,
2987
+ "html": "金句正文",
2988
+ "pptx": "quote text"
2989
+ }
2990
+ ]
2991
+ },
2992
+ "timeline": {
2993
+ "mode": [
2994
+ "presentation",
2995
+ "research"
2996
+ ],
2997
+ "slots": [
2998
+ {
2999
+ "id": "head",
3000
+ "role": "chrome",
3001
+ "required": true,
3002
+ "html": ".shead",
3003
+ "pptx": "head()"
3004
+ },
3005
+ {
3006
+ "id": "primary",
3007
+ "role": "primary",
3008
+ "required": true,
3009
+ "html": ".tl",
3010
+ "pptx": "timeline axis"
3011
+ }
3012
+ ]
3013
+ },
3014
+ "steps": {
3015
+ "mode": [
3016
+ "presentation",
3017
+ "architecture"
3018
+ ],
3019
+ "slots": [
3020
+ {
3021
+ "id": "head",
3022
+ "role": "chrome",
3023
+ "required": true,
3024
+ "html": ".shead",
3025
+ "pptx": "head()"
3026
+ },
3027
+ {
3028
+ "id": "primary",
3029
+ "role": "primary",
3030
+ "required": true,
3031
+ "html": ".steps",
3032
+ "pptx": "step row"
3033
+ }
3034
+ ]
3035
+ },
3036
+ "cards": {
3037
+ "mode": [
3038
+ "presentation",
3039
+ "research"
3040
+ ],
3041
+ "slots": [
3042
+ {
3043
+ "id": "head",
3044
+ "role": "chrome",
3045
+ "required": true,
3046
+ "html": ".shead",
3047
+ "pptx": "head()"
3048
+ },
3049
+ {
3050
+ "id": "primary",
3051
+ "role": "primary",
3052
+ "required": true,
3053
+ "html": ".card grid",
3054
+ "pptx": "card grid"
3055
+ }
3056
+ ]
3057
+ },
3058
+ "heatmap": {
3059
+ "mode": [
3060
+ "presentation",
3061
+ "research"
3062
+ ],
3063
+ "slots": [
3064
+ {
3065
+ "id": "head",
3066
+ "role": "chrome",
3067
+ "required": true,
3068
+ "html": ".shead",
3069
+ "pptx": "head()"
3070
+ },
3071
+ {
3072
+ "id": "primary",
3073
+ "role": "primary",
3074
+ "required": true,
3075
+ "html": ".heat",
3076
+ "pptx": "heat cells"
3077
+ }
3078
+ ]
3079
+ },
3080
+ "bullet": {
3081
+ "mode": [
3082
+ "presentation",
3083
+ "research"
3084
+ ],
3085
+ "slots": [
3086
+ {
3087
+ "id": "head",
3088
+ "role": "chrome",
3089
+ "required": true,
3090
+ "html": ".shead",
3091
+ "pptx": "head()"
3092
+ },
3093
+ {
3094
+ "id": "primary",
3095
+ "role": "primary",
3096
+ "required": true,
3097
+ "html": ".bul",
3098
+ "pptx": "bullet rows"
3099
+ }
3100
+ ]
3101
+ },
3102
+ "pyramid": {
3103
+ "mode": [
3104
+ "presentation",
3105
+ "research"
3106
+ ],
3107
+ "slots": [
3108
+ {
3109
+ "id": "head",
3110
+ "role": "chrome",
3111
+ "required": true,
3112
+ "html": ".shead",
3113
+ "pptx": "head()"
3114
+ },
3115
+ {
3116
+ "id": "primary",
3117
+ "role": "primary",
3118
+ "required": true,
3119
+ "html": ".pyr",
3120
+ "pptx": "pyramid layers"
3121
+ }
3122
+ ]
3123
+ },
3124
+ "image": {
3125
+ "mode": [
3126
+ "presentation",
3127
+ "research",
3128
+ "architecture"
3129
+ ],
3130
+ "slots": [
3131
+ {
3132
+ "id": "head",
3133
+ "role": "chrome",
3134
+ "required": true,
3135
+ "html": ".shead",
3136
+ "pptx": "head()"
3137
+ },
3138
+ {
3139
+ "id": "primary",
3140
+ "role": "primary",
3141
+ "required": true,
3142
+ "html": ".media*",
3143
+ "pptx": "imageLayoutShapes"
3144
+ }
3145
+ ]
3146
+ },
3147
+ "diagram": {
3148
+ "mode": [
3149
+ "architecture",
3150
+ "research"
3151
+ ],
3152
+ "slots": [
3153
+ {
3154
+ "id": "head",
3155
+ "role": "chrome",
3156
+ "required": true,
3157
+ "html": ".shead",
3158
+ "pptx": "head()"
3159
+ },
3160
+ {
3161
+ "id": "primary",
3162
+ "role": "primary",
3163
+ "required": true,
3164
+ "html": ".arch / layers",
3165
+ "pptx": "layered nodes + edges",
3166
+ "maxNodes": 24,
3167
+ "maxLayers": 4
3168
+ },
3169
+ {
3170
+ "id": "annotation",
3171
+ "role": "annotation",
3172
+ "required": false,
3173
+ "html": ".arch__legend / .note",
3174
+ "pptx": "legend chips / notes"
3175
+ }
3176
+ ]
3177
+ },
3178
+ "lane": {
3179
+ "mode": [
3180
+ "architecture",
3181
+ "research"
3182
+ ],
3183
+ "slots": [
3184
+ {
3185
+ "id": "head",
3186
+ "role": "chrome",
3187
+ "required": true,
3188
+ "html": ".shead",
3189
+ "pptx": "head()"
3190
+ },
3191
+ {
3192
+ "id": "primary",
3193
+ "role": "primary",
3194
+ "required": true,
3195
+ "html": ".lane",
3196
+ "pptx": "lanes + steps"
3197
+ }
3198
+ ]
3199
+ },
3200
+ "sankey": {
3201
+ "mode": [
3202
+ "research",
3203
+ "architecture"
3204
+ ],
3205
+ "slots": [
3206
+ {
3207
+ "id": "head",
3208
+ "role": "chrome",
3209
+ "required": true,
3210
+ "html": ".shead",
3211
+ "pptx": "head()"
3212
+ },
3213
+ {
3214
+ "id": "primary",
3215
+ "role": "primary",
3216
+ "required": true,
3217
+ "html": "svg[data-chart=sankey]",
3218
+ "pptx": "infoSankey",
3219
+ "maxNodes": 12
3220
+ },
3221
+ {
3222
+ "id": "annotation",
3223
+ "role": "annotation",
3224
+ "required": true,
3225
+ "html": "dataTable / .note",
3226
+ "pptx": "notes"
3227
+ }
3228
+ ]
3229
+ },
3230
+ "treemap": {
3231
+ "mode": [
3232
+ "research",
3233
+ "architecture"
3234
+ ],
3235
+ "slots": [
3236
+ {
3237
+ "id": "head",
3238
+ "role": "chrome",
3239
+ "required": true,
3240
+ "html": ".shead",
3241
+ "pptx": "head()"
3242
+ },
3243
+ {
3244
+ "id": "primary",
3245
+ "role": "primary",
3246
+ "required": true,
3247
+ "html": "svg[data-chart=treemap]",
3248
+ "pptx": "infoTreemap"
3249
+ },
3250
+ {
3251
+ "id": "annotation",
3252
+ "role": "annotation",
3253
+ "required": true,
3254
+ "html": "dataTable / .note",
3255
+ "pptx": "notes"
3256
+ }
3257
+ ]
3258
+ },
3259
+ "boxplot": {
3260
+ "mode": [
3261
+ "research",
3262
+ "architecture"
3263
+ ],
3264
+ "slots": [
3265
+ {
3266
+ "id": "head",
3267
+ "role": "chrome",
3268
+ "required": true,
3269
+ "html": ".shead",
3270
+ "pptx": "head()"
3271
+ },
3272
+ {
3273
+ "id": "primary",
3274
+ "role": "primary",
3275
+ "required": true,
3276
+ "html": "svg[data-chart=boxplot]",
3277
+ "pptx": "infoBoxplot"
3278
+ },
3279
+ {
3280
+ "id": "annotation",
3281
+ "role": "annotation",
3282
+ "required": true,
3283
+ "html": "dataTable / .note",
3284
+ "pptx": "notes"
3285
+ }
3286
+ ]
3287
+ },
3288
+ "network": {
3289
+ "mode": [
3290
+ "research",
3291
+ "architecture"
3292
+ ],
3293
+ "slots": [
3294
+ {
3295
+ "id": "head",
3296
+ "role": "chrome",
3297
+ "required": true,
3298
+ "html": ".shead",
3299
+ "pptx": "head()"
3300
+ },
3301
+ {
3302
+ "id": "primary",
3303
+ "role": "primary",
3304
+ "required": true,
3305
+ "html": "svg[data-chart=network]",
3306
+ "pptx": "infoNetwork"
3307
+ },
3308
+ {
3309
+ "id": "annotation",
3310
+ "role": "annotation",
3311
+ "required": true,
3312
+ "html": "dataTable / .note",
3313
+ "pptx": "notes"
3314
+ }
3315
+ ]
3316
+ },
3317
+ "marimekko": {
3318
+ "mode": [
3319
+ "research",
3320
+ "architecture"
3321
+ ],
3322
+ "slots": [
3323
+ {
3324
+ "id": "head",
3325
+ "role": "chrome",
3326
+ "required": true,
3327
+ "html": ".shead",
3328
+ "pptx": "head()"
3329
+ },
3330
+ {
3331
+ "id": "primary",
3332
+ "role": "primary",
3333
+ "required": true,
3334
+ "html": "svg[data-chart=marimekko]",
3335
+ "pptx": "infoMarimekko"
3336
+ },
3337
+ {
3338
+ "id": "annotation",
3339
+ "role": "annotation",
3340
+ "required": true,
3341
+ "html": "dataTable / .note",
3342
+ "pptx": "notes"
3343
+ }
3344
+ ]
3345
+ },
3346
+ "streamgraph": {
3347
+ "mode": [
3348
+ "research",
3349
+ "architecture"
3350
+ ],
3351
+ "slots": [
3352
+ {
3353
+ "id": "head",
3354
+ "role": "chrome",
3355
+ "required": true,
3356
+ "html": ".shead",
3357
+ "pptx": "head()"
3358
+ },
3359
+ {
3360
+ "id": "primary",
3361
+ "role": "primary",
3362
+ "required": true,
3363
+ "html": "svg[data-chart=streamgraph]",
3364
+ "pptx": "infoStreamgraph"
3365
+ },
3366
+ {
3367
+ "id": "annotation",
3368
+ "role": "annotation",
3369
+ "required": true,
3370
+ "html": "dataTable / .note",
3371
+ "pptx": "notes"
3372
+ }
3373
+ ]
3374
+ }
3375
+ }
3376
+ }
3377
+ }