@topmindspace/tms-skills 0.1.18 → 0.2.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.
- package/CHANGELOG.md +66 -0
- package/README.en.md +6 -3
- package/README.md +6 -3
- package/package.json +5 -2
- package/top-ppt-html/README.en.md +2 -2
- package/top-ppt-html/README.md +1 -1
- package/top-ppt-html/SKILL.md +4 -4
- package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +24 -12
- package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.html +24 -12
- package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.html +24 -12
- package/top-ppt-html/assets/examples/2026-09-26-topmind-tms-skills-showcase.html +94 -165
- package/top-ppt-html/assets/examples/2026-09-26-topmind-tms-skills-showcase.model.json +32 -38
- package/top-ppt-html/assets/pptx-export.js +3 -2
- package/top-ppt-html/assets/style-gallery.html +2 -1
- package/top-ppt-html/assets/templates/architecture.html +38 -15
- package/top-ppt-html/assets/templates/engine.css +20 -9
- package/top-ppt-html/assets/templates/presentation.html +38 -17
- package/top-ppt-html/assets/templates/research.html +44 -23
- package/top-ppt-html/package-lock.json +2 -2
- package/top-ppt-html/package.json +1 -1
- package/top-ppt-html/references/components-atoms.md +1 -1
- package/top-ppt-html/references/content-rules.md +17 -11
- package/top-ppt-html/references/failure-modes.md +6 -4
- package/top-ppt-html/references/high-fidelity.md +14 -1
- package/top-ppt-html/references/icons.md +2 -2
- package/top-ppt-html/references/layout-grammar.md +3 -1
- package/top-ppt-html/references/layouts-research.md +1 -1
- package/top-ppt-html/references/pptx-export.md +2 -2
- package/top-ppt-html/references/tech-design.md +2 -0
- package/top-ppt-html/scripts/build_icon_assets.js +92 -0
- package/top-ppt-html/scripts/build_pptx.js +125 -29
- package/top-ppt-html/scripts/extract_model.py +21 -1
- package/top-ppt-html/scripts/icon_lib.js +53 -0
- package/top-ppt-html/scripts/icon_raster.js +86 -0
- package/top-ppt-html/scripts/layout-constants.json +4 -1
- package/top-ppt-html/scripts/lib_layout_regions.js +3 -1
- package/top-ppt-html/scripts/model-schema.json +7 -3
- package/top-ppt-html/scripts/package_skill.py +1 -0
- package/top-ppt-html/scripts/render_from_model.py +125 -24
- package/top-ppt-html/scripts/scaffold_report.py +47 -24
- package/top-ppt-html/scripts/sync_runtime.py +2 -1
- package/top-ppt-html/scripts/validate_pptx.py +14 -3
- package/top-ppt-html/scripts/validate_report.py +1 -1
- package/topmind-cover/README.md +40 -0
- package/topmind-cover/SKILL.md +66 -0
- package/topmind-cover/package-lock.json +16 -0
- package/topmind-cover/package.json +16 -0
- package/topmind-cover/references/cover-styles.md +40 -0
- package/topmind-cover/scripts/audit_css.py +39 -0
- package/topmind-cover/scripts/audit_docs.py +58 -0
- package/topmind-cover/scripts/audit_skill.py +60 -0
- package/topmind-cover/scripts/audit_styles.py +54 -0
- package/topmind-cover/scripts/crop-cover.py +69 -0
- package/topmind-cover/scripts/negative_tests.py +71 -0
- package/topmind-cover/scripts/package_skill.py +188 -0
- package/topmind-wechat-post/README.md +49 -0
- package/topmind-wechat-post/SKILL.md +208 -0
- package/topmind-wechat-post/assets/themes/amber-review.json +35 -0
- package/topmind-wechat-post/assets/themes/graphite.json +35 -0
- package/topmind-wechat-post/assets/themes/minimal-ink.json +35 -0
- package/topmind-wechat-post/assets/themes/newsprint.json +35 -0
- package/topmind-wechat-post/assets/themes/tech-blue.json +35 -0
- package/topmind-wechat-post/package-lock.json +16 -0
- package/topmind-wechat-post/package.json +16 -0
- package/topmind-wechat-post/references/design.md +50 -0
- package/topmind-wechat-post/references/element-spec.md +162 -0
- package/topmind-wechat-post/references/known-pits.md +86 -0
- package/topmind-wechat-post/references/theme-map.md +139 -0
- package/topmind-wechat-post/references/typography-rules.md +62 -0
- package/topmind-wechat-post/references/wechat-constraints.md +106 -0
- package/topmind-wechat-post/references/workflow.md +102 -0
- package/topmind-wechat-post/references/writing-quality.md +129 -0
- package/topmind-wechat-post/scripts/audit_css.py +39 -0
- package/topmind-wechat-post/scripts/audit_docs.py +58 -0
- package/topmind-wechat-post/scripts/audit_skill.py +60 -0
- package/topmind-wechat-post/scripts/audit_styles.py +54 -0
- package/topmind-wechat-post/scripts/lint-wechat.py +446 -0
- package/topmind-wechat-post/scripts/md2wechat.py +1602 -0
- package/topmind-wechat-post/scripts/negative_tests.py +65 -0
- package/topmind-wechat-post/scripts/new-article.py +183 -0
- package/topmind-wechat-post/scripts/package_skill.py +188 -0
- package/topmind-wechat-post/scripts/push-to-topstream.py +226 -0
- package/topmind-wechat-post/scripts/scan_ai_flavor.py +464 -0
- package/topmind-wechat-post/scripts/sync-mapping.py +220 -0
- package/topmind-wechat-post/scripts/sync-status.py +187 -0
- package/topmind-x-article/README.md +40 -0
- package/topmind-x-article/SKILL.md +62 -0
- package/topmind-x-article/package-lock.json +16 -0
- package/topmind-x-article/package.json +16 -0
- package/topmind-x-article/references/publish-checklist.md +24 -0
- package/topmind-x-article/references/x-format.md +24 -0
- package/topmind-x-article/scripts/audit_css.py +39 -0
- package/topmind-x-article/scripts/audit_docs.py +58 -0
- package/topmind-x-article/scripts/audit_skill.py +60 -0
- package/topmind-x-article/scripts/audit_styles.py +54 -0
- package/topmind-x-article/scripts/md2x.py +121 -0
- package/topmind-x-article/scripts/negative_tests.py +74 -0
- package/topmind-x-article/scripts/package_skill.py +188 -0
|
@@ -330,7 +330,13 @@ border-color:color-mix(in srgb,var(--accent-on) 20%,transparent);color:var(--acc
|
|
|
330
330
|
rows-2 / rows-3:等高行分区(纵向节奏,替代等高卡片堆叠) */
|
|
331
331
|
.g-211{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr)}
|
|
332
332
|
.g-121{grid-template-columns:minmax(0,1fr) minmax(0,2fr) minmax(0,1fr)}
|
|
333
|
-
.g-quad{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(
|
|
333
|
+
.g-quad{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(min-content,1fr);align-items:stretch}
|
|
334
|
+
.g-half{grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);align-items:stretch}
|
|
335
|
+
@media (max-width:1180px){.g-half{grid-template-columns:1fr}}
|
|
336
|
+
.g-2--equal,.g-3--equal,.g-4--equal{grid-auto-rows:minmax(min-content,1fr);align-items:stretch}
|
|
337
|
+
.grid.g-2>.card,.grid.g-3>.card,.grid.g-4>.card,
|
|
338
|
+
.grid.g-quad>.card,.grid.g-half>.card,.grid.g-2--equal>.card,
|
|
339
|
+
.grid.g-3--equal>.card,.grid.g-4--equal>.card{align-self:stretch}
|
|
334
340
|
.g-aside{grid-template-columns:minmax(0,1fr) minmax(200px,.36fr);align-items:start}
|
|
335
341
|
.g-aside__side{position:sticky;top:calc(var(--bar-h) + 16px)}
|
|
336
342
|
.g-mosaic{grid-template-columns:repeat(3,minmax(0,1fr));
|
|
@@ -346,7 +352,7 @@ grid-template-areas:"main main main" "s1 s2 s3"}
|
|
|
346
352
|
.kv--2col{grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr)}
|
|
347
353
|
/* ── 拼贴栅格 g-bento(Bento / 马赛克):4 列基准 + 跨列/跨行工具类 ──
|
|
348
354
|
.sp-2/.sp-3/.sp-4 跨列(span),.rw-2 跨行;窄屏自动降列并收敛 span。 */
|
|
349
|
-
.g-bento{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(
|
|
355
|
+
.g-bento{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(min-content,1fr)}
|
|
350
356
|
.sp-2{grid-column:span 2}.sp-3{grid-column:span 3}.sp-4{grid-column:span 4}
|
|
351
357
|
.rw-2{grid-row:span 2}
|
|
352
358
|
@media (max-width:1180px){.g-bento{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
@@ -381,19 +387,21 @@ background:color-mix(in srgb,var(--bg) 86%,transparent);
|
|
|
381
387
|
backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);
|
|
382
388
|
border-bottom:1px solid var(--border-soft);
|
|
383
389
|
transition:height var(--dur-medium) var(--ease-standard)}
|
|
384
|
-
.bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4)}
|
|
385
|
-
.brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0}
|
|
390
|
+
.bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);overflow:hidden}
|
|
391
|
+
.brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0;flex:1 1 auto;overflow:hidden}
|
|
386
392
|
.brand__mark{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent);
|
|
387
393
|
color:var(--accent-on);display:grid;place-items:center;font-size:13px;font-weight:700}
|
|
394
|
+
.brand__txt{min-width:0;overflow:hidden;flex:1 1 auto}
|
|
388
395
|
.brand__title{font-size:var(--fs-sm);font-weight:600;color:var(--text);white-space:nowrap;
|
|
389
|
-
overflow:hidden;text-overflow:ellipsis}
|
|
396
|
+
overflow:hidden;text-overflow:ellipsis;max-width:100%}
|
|
390
397
|
.brand__sub{font-size:var(--fs-xs);color:var(--text-3);white-space:nowrap;overflow:hidden;
|
|
391
|
-
text-overflow:ellipsis}
|
|
392
|
-
.nav{display:flex;align-items:center;gap:var(--sp-1)}
|
|
398
|
+
text-overflow:ellipsis;max-width:100%}
|
|
399
|
+
.nav{display:flex;align-items:center;gap:var(--sp-1);flex:0 1 auto;min-width:0;overflow:hidden}
|
|
393
400
|
.nav a{padding:8px 14px;border-radius:var(--r-full);color:var(--text-2);text-decoration:none;
|
|
394
401
|
font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background-color var(--dur-short),color var(--dur-short)}
|
|
395
402
|
.nav a:hover{background:var(--surface-2);color:var(--text)}
|
|
396
403
|
@media (max-width:1180px){.nav{display:none}}
|
|
404
|
+
@media (max-width:1360px){.brand__sub{display:none}}
|
|
397
405
|
.iconbtn{width:40px;height:40px;flex:none;display:grid;place-items:center;
|
|
398
406
|
border:1px solid var(--border);border-radius:var(--r-full);background:transparent;
|
|
399
407
|
color:var(--text-2);cursor:pointer;transition:background-color var(--dur-short),color var(--dur-short)}
|
|
@@ -448,12 +456,15 @@ transition:background-color var(--dur-short),box-shadow var(--dur-short),transfo
|
|
|
448
456
|
.btn--ghost{background:transparent;color:var(--text);border-color:var(--border)}
|
|
449
457
|
.btn--onDark{background:var(--surface);color:var(--text)}
|
|
450
458
|
.card{background:var(--surface);border:1px solid var(--border-soft);border-radius:var(--r-lg);
|
|
451
|
-
padding:clamp(20px,2vw,30px);transition:border-color var(--dur-short),box-shadow var(--dur-short),background-color var(--dur-medium)
|
|
459
|
+
padding:clamp(20px,2vw,30px);transition:border-color var(--dur-short),box-shadow var(--dur-short),background-color var(--dur-medium);
|
|
460
|
+
display:flex;flex-direction:column;min-width:0}
|
|
452
461
|
.card:hover{border-color:var(--border);box-shadow:var(--shadow-1)}
|
|
453
462
|
.card--flat{background:var(--surface-1);border-color:transparent}
|
|
454
463
|
.card--flat:hover{background:var(--surface-2)}
|
|
455
464
|
.card--accent{background:var(--accent-soft);border-color:transparent}
|
|
456
|
-
.card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}
|
|
465
|
+
.card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3);flex:none}
|
|
466
|
+
.card>.ul,.card>.t-body,.card>.t-sm{flex:1 1 auto}
|
|
467
|
+
.card>.so-what,.card>.tbd-legend,.card>.flagbar{flex:none;margin-top:auto}
|
|
457
468
|
.card__ico{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent-soft);
|
|
458
469
|
color:var(--accent-text);display:grid;place-items:center;font-size:15px;font-weight:600}
|
|
459
470
|
.card__ico svg{width:18px;height:18px}
|
|
@@ -1140,7 +1151,8 @@ background:var(--surface-2);border-radius:6px;padding:2px 7px;color:var(--text)}
|
|
|
1140
1151
|
</div>
|
|
1141
1152
|
</section>
|
|
1142
1153
|
|
|
1143
|
-
<!-- ══
|
|
1154
|
+
<!-- ══ 参考资料(只列真实来源;无真实来源时整节删除,并去掉正文 [n] 与导航入口) ══ -->
|
|
1155
|
+
<!-- 示例条目(交付时替换为真实机构/报告/文档名,禁止「来源名称」占位串):
|
|
1144
1156
|
<section class="band band--tint" id="refs">
|
|
1145
1157
|
<div class="wrap">
|
|
1146
1158
|
<div class="shead rv">
|
|
@@ -1153,16 +1165,24 @@ background:var(--surface-2);border-radius:6px;padding:2px 7px;color:var(--text)}
|
|
|
1153
1165
|
<th style="width:14%">时间</th><th>口径说明</th></tr></thead>
|
|
1154
1166
|
<tbody>
|
|
1155
1167
|
<tr id="ref-1"><td class="k">[1]</td>
|
|
1156
|
-
<td><a class="ref-link" href="https://
|
|
1168
|
+
<td><a class="ref-link" href="https://www.gartner.com" target="_blank" rel="noopener">Gartner:Agentic AI 技术成熟度曲线
|
|
1157
1169
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><path d="M15 3h6v6M10 14 21 3"/></svg></a></td>
|
|
1158
|
-
<td>
|
|
1159
|
-
<tr id="ref-2"><td class="k">[2]</td><td>无链接的内部来源(纯文本)</td>
|
|
1160
|
-
<td>YYYY-MM</td><td>内部实测口径</td></tr>
|
|
1170
|
+
<td>2026-04</td><td>全球企业智能体采用率;口径 = 调研样本企业占比</td></tr>
|
|
1161
1171
|
</tbody>
|
|
1162
1172
|
</table>
|
|
1163
1173
|
</div>
|
|
1164
1174
|
</div>
|
|
1165
1175
|
</section>
|
|
1176
|
+
-->
|
|
1177
|
+
<section class="band band--tint" id="refs" hidden data-ref-policy="real-sources-only">
|
|
1178
|
+
<div class="wrap">
|
|
1179
|
+
<div class="shead rv">
|
|
1180
|
+
<div class="t-eyebrow">参考资料</div>
|
|
1181
|
+
<h2 class="t-h1 shead__title">数据来源与口径说明</h2>
|
|
1182
|
+
</div>
|
|
1183
|
+
<p class="t-body rv">(占位节:交付前填入真实来源条目,或整节删除并去掉正文 [n] 与导航「参考资料」入口。禁止「来源名称,时间;口径。」占位条目。)</p>
|
|
1184
|
+
</div>
|
|
1185
|
+
</section>
|
|
1166
1186
|
|
|
1167
1187
|
<!-- ══ 页脚 ══ -->
|
|
1168
1188
|
<footer class="foot">
|
|
@@ -1806,7 +1826,7 @@ window.REPORT_MODEL = {
|
|
|
1806
1826
|
|
|
1807
1827
|
/* __TOPPPT_RUNTIME_START__ */
|
|
1808
1828
|
/* ══ PPTX 导出运行时(assets/pptx-export.js 的内联副本 · 由 scripts/sync_runtime.py 注入,禁止手改) ══ */
|
|
1809
|
-
/* __TOPPPT_RUNTIME_SHA__:
|
|
1829
|
+
/* __TOPPPT_RUNTIME_SHA__:af6e25f25fd2e116 */
|
|
1810
1830
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
1811
1831
|
* TopPPT HTML· 浏览器端 PPTX 预览运行时
|
|
1812
1832
|
* 零依赖、随报告单文件分发;OOXML 序列化器(仅供预览,页面不导出文件)。
|
|
@@ -1930,7 +1950,8 @@ function regionOf(pageType, slotId, opts) {
|
|
|
1930
1950
|
if (type === 'bar' && slot === 'primary') {
|
|
1931
1951
|
var by = P.chartY || 2.95;
|
|
1932
1952
|
var bb = opts.bottom != null ? opts.bottom : bottomDefault;
|
|
1933
|
-
|
|
1953
|
+
/* chartX/chartW 历史误用已纠正:与 donut/table/hbar/exhibit 同口径,图表盒对齐版心 (MX, CW) */
|
|
1954
|
+
return { x: MX, y: by, w: CW, h: Math.max(1.2, bb - by) };
|
|
1934
1955
|
}
|
|
1935
1956
|
if (type === 'bar' && slot === 'hbar') {
|
|
1936
1957
|
var y0 = P.hbarY0 || 2.6;
|
|
@@ -2042,7 +2063,7 @@ function regionOf(pageType, slotId, opts) {
|
|
|
2042
2063
|
/* __TOPPPT_SCHEMA_START__ */
|
|
2043
2064
|
/* ── 由 scripts/sync_runtime.py 从 scripts/model-schema.json 注入 · 禁止手改 ── */
|
|
2044
2065
|
/* DSL schema 单源:浏览器端 validateModel 与 scripts/extract_model.py 消费同一份定义 */
|
|
2045
|
-
var MODEL_SCHEMA = {"version":"0.1","modes":["presentation","research","architecture"],"model":{"required":["title","sections:array","closing.title","closing.points:array"],"optional":["mode","style","theme","subtitle","meta","agenda:array"],"agendaMin":{"presentation":3,"research":3,"architecture":0},"sectionsMin":1,"sectionsRecommended":3,"agendaComfortMax":
|
|
2066
|
+
var MODEL_SCHEMA = {"version":"0.1","modes":["presentation","research","architecture"],"model":{"required":["title","sections:array","closing.title","closing.points:array"],"optional":["mode","style","theme","subtitle","meta","agenda:array"],"agendaMin":{"presentation":3,"research":3,"architecture":0},"agendaMax":7,"agendaMaxWithRefs":8,"agendaHint":"agenda 条目 = 章(篇/section),3–7 条;每章可含多页(sections[] 按页建模)。禁止把逐页标题当大纲。sections[].eyebrow 的 `NN ·` 前缀 = 章键,须与某条 agenda 对应;跳转锚点 = 该章第一页。含「参考资料」条目时 +1 仍 ≤8。","sectionsMin":1,"sectionsRecommended":3,"agendaComfortMax":8},"commonSectionFields":["eyebrow","title","lead","soWhat","footnote","flags","image","exhibitNo","layoutPreset"],"mutualExclusionHint":"verdict 与 soWhat 互斥:二者共用 annotation 结论条槽位,同页双填必叠印。comparison 页填 verdict 时不要再填 soWhat(渲染器已自动二选一,但模型侧应只给一个)。","flagsHint":"flags = 待核实/待二次修改条目字符串数组(如 '2027 增速 xx%(口径未定)');渲染为 accent 强调色标注行,提示用户核对。","imageHint":"image = 素材图片/配图占位对象。三选一必填:src(用户图,data: 内联或相对路径,零外链铁律禁 http(s))|items(多图版式:grid/compare/wall,元素 {src?, alt?, caption?, placeholder?})|placeholder:true(无图时出配图占位,原生形状渲染、pictures 不增)。其余可选:layout(full/half/bleed/grid/compare/wall,见 layout-constants.json imageSpec.layouts)、fit(cover 默认 / contain)、caption、alt、hint、ratio。","imageLayoutHint":"layout 与 HTML 版式对应:full=版心全宽图|half=左图右注(points 为右栏注解)|bleed=通栏出血|grid=多图网格(items 2/3/4/6 张)|compare=双图 A/B 对比(items 2 张)|wall=Logo 墙(items 3–12 张小图)。占位符标签文本由双引擎按 imageSpec 拼同一串,保证 A/B 通道逐页文本一致。","chartTypes":["bar","hbar","stack","stackline","line","dualline","area","donut","multidonut","pie","radar","scatter","bubble","waterfall","gauge","pareto","funnel","gantt","vsbar","progress","sparkline","slope","dumbbell","lollipop","dotplot","bulletchart","waffle","radialbar","rose","candlestick"],"chartTypesHint":"chart.type 可取值 = 本表(30 类:16 原生 + 14 形状还原)。其余 6 类复杂信息图(sankey/treemap/boxplot/network/marimekko/streamgraph)是**专属页型**而非 chart.type——它们要按列/段/节点等结构化载荷表达,故走 sections[].type。不变量:charts.registry.types == chartTypes ∪ 上述 6 类页型(sync_runtime.py 校验)。","chartDataTable":{"enum":["notes","inline","appendix","off"],"default":"notes","rule":"非原生图表(registry.pptx=shape)的 dataTable 不得为 off;缺失时按 registry 默认值补齐。"},"pageTypes":{"points":{"label":"要点列表页","modes":["presentation","research","architecture"],"required":["points:array"],"optional":["metrics:array"]},"metrics":{"label":"指标带页(4–6 个核心数字)","modes":["presentation","research"],"required":["metrics:array"]},"kpi":{"label":"大数指标页(hero 大数字 + 支撑指标行)","modes":["presentation","research"],"required":["hero:array"],"optional":["metrics:array"]},"table":{"label":"对比表页","modes":["presentation","research","architecture"],"required":["table.head:array","table.rows:array"],"optional":["table.colW:array"]},"timeline":{"label":"时间线 / 路线页","modes":["presentation","research"],"required":["phases:array"]},"steps":{"label":"步骤条页(N 步横排 + 箭头,可分组)","modes":["presentation","research","architecture"],"required":["steps:array"],"optional":["groups:array","note"]},"bar":{"label":"图表页(chart.type 见 chartTypes;native 通道走原生数据图表,shape 通道走高保真形状还原 + 数据表)","modes":["presentation","research"],"required":["chart.labels:array","chart.values:array"],"optional":["chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.start:array","chart.target:array","chart.dataTable","note"]},"donut":{"label":"环形图页(原生 pie 楔形 + 图例)","modes":["presentation","research"],"required":["chart.labels:array","chart.values:array"],"optional":["chart.unit","chart.centerLabel","chart.colors:array","chart.dataTable","note"]},"heatmap":{"label":"热力矩阵页(行 × 列 + 强度色阶)","modes":["presentation","research"],"required":["rowHeads:array","colHeads:array","cells:array"],"optional":["unit","scaleLabel:array","note"]},"bullet":{"label":"达成对比页(实际 vs 目标条)","modes":["presentation","research"],"required":["items:array"],"optional":["unit","max","note"]},"pyramid":{"label":"金字塔页(层级递进,顶层最窄)","modes":["presentation","research","architecture"],"required":["levels:array"],"optional":["note"]},"image":{"label":"素材图片页(full/half/bleed/grid/compare/wall,效果与位置锁定;支持配图占位)","modes":["presentation","research","architecture"],"required":["anyof:image.src:str|image.items:array|image.placeholder"],"optional":["image.caption","image.alt","image.layout","image.fit","image.ratio","image.hint","points:array","note"]},"cards":{"label":"卡片网格页(cards 元素须为 {title, points:[[k,v]…], icon?},不接受元组)","modes":["presentation","research"],"required":["cards:array"],"optional":["columns"],"cardItemHint":"cards[] 元素:{title:str, points:[[k,v]…]|[{t,d}…]|[str…], icon?:str}。icon = 语义图标名(icon_lib.js 键:增长/下降/数据/图表/趋势/占比/表格/效率/成果/安全/权限/检查/风险/团队/流程/计划/智能/洞察/工具/清单),HTML 与 PPTX 同名真导出;缺省按标题语义自动挑选。"},"split":{"label":"双区组合页(left / right 各可为 要点|图表|表格|图片:type = points(默认)| table | image | 图表类型名;图表/表格字段直接挂在对应侧)","modes":["presentation","research"],"required":["anyof:left.points:array|left.type:str"],"optional":["left.cap","left.image","left.labels:array","left.values:array","left.series:array","left.points:array","left.max","left.unit","left.colors:array","left.dataTable","left.head:array","left.rows:array","left.colW:array","right.type","right.cap","right.image","right.labels:array","right.values:array","right.series:array","right.points:array","right.max","right.unit","right.colors:array","right.dataTable","right.head:array","right.rows:array","right.colW:array"]},"comparison":{"label":"对比页(左右双栏 + 可选结论条)","modes":["presentation","research"],"required":["left.title","left.points:array","right.title","right.points:array"],"optional":["verdict"]},"quote":{"label":"引用 / 金句页(深色全幅)","modes":["presentation","research"],"required":["quote","author"],"optional":["context"]},"diagram":{"label":"分层架构页(architecture 模式走全幅几何)","modes":["presentation","research","architecture"],"required":["layers:array"],"optional":["legend:array"]},"exhibit":{"label":"Exhibit 编号图表页(research R2)","modes":["research"],"required":["chart.labels:array","chart.values:array"],"optional":["exhibitNo","chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.dataTable","note"]},"twocol":{"label":"双栏论证页(research R1)","modes":["research"],"required":["paragraphs:array"]},"threecol":{"label":"三栏证据页(research R6)","modes":["research"],"required":["paragraphs:array"]},"halftable":{"label":"半表半图页(research R7)","modes":["research"],"required":["table.head:array","table.rows:array","chart.labels:array","chart.values:array"],"optional":["table.colW:array","chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.dataTable","note"]},"matrix":{"label":"矩阵图页(research R8)","modes":["research"],"required":["rowHeads:array","colHeads:array","cells:array"]},"lane":{"label":"泳道页(architecture A2)","modes":["architecture"],"required":["lanes:array"]},"sankey":{"label":"桑基图页(节点-流带,流向与流量)","modes":["research","architecture"],"required":["flows:array"],"optional":["unit","chart.dataTable","note"]},"treemap":{"label":"树图页(面积编码的层级构成)","modes":["research","architecture"],"required":["items:array"],"optional":["unit","chart.dataTable","note"]},"boxplot":{"label":"箱线图页(分布对比:min/q1/median/q3/max)","modes":["research","architecture"],"required":["groups:array"],"optional":["unit","chart.dataTable","note"]},"network":{"label":"关系网络页(节点-边拓扑)","modes":["research","architecture"],"required":["nodes:array","edges:array"],"optional":["chart.dataTable","note"]},"marimekko":{"label":"马赛克图页(列宽 × 列高双重编码)","modes":["research","architecture"],"required":["cols:array","cells:array"],"optional":["unit","chart.dataTable","note"]},"streamgraph":{"label":"流带图页(时间上的构成演变)","modes":["research","architecture"],"required":["series:array"],"optional":["labels:array","chart.dataTable","note"]}}};
|
|
2046
2067
|
/* __TOPPPT_SCHEMA_END__ */
|
|
2047
2068
|
|
|
2048
2069
|
var _mode = 'presentation'; /* 当前模式(slidesOf 里按 model.mode 设置) */
|
|
@@ -333,7 +333,13 @@ border-color:color-mix(in srgb,var(--accent-on) 20%,transparent);color:var(--acc
|
|
|
333
333
|
rows-2 / rows-3:等高行分区(纵向节奏,替代等高卡片堆叠) */
|
|
334
334
|
.g-211{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr)}
|
|
335
335
|
.g-121{grid-template-columns:minmax(0,1fr) minmax(0,2fr) minmax(0,1fr)}
|
|
336
|
-
.g-quad{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(
|
|
336
|
+
.g-quad{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(min-content,1fr);align-items:stretch}
|
|
337
|
+
.g-half{grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);align-items:stretch}
|
|
338
|
+
@media (max-width:1180px){.g-half{grid-template-columns:1fr}}
|
|
339
|
+
.g-2--equal,.g-3--equal,.g-4--equal{grid-auto-rows:minmax(min-content,1fr);align-items:stretch}
|
|
340
|
+
.grid.g-2>.card,.grid.g-3>.card,.grid.g-4>.card,
|
|
341
|
+
.grid.g-quad>.card,.grid.g-half>.card,.grid.g-2--equal>.card,
|
|
342
|
+
.grid.g-3--equal>.card,.grid.g-4--equal>.card{align-self:stretch}
|
|
337
343
|
.g-aside{grid-template-columns:minmax(0,1fr) minmax(200px,.36fr);align-items:start}
|
|
338
344
|
.g-aside__side{position:sticky;top:calc(var(--bar-h) + 16px)}
|
|
339
345
|
.g-mosaic{grid-template-columns:repeat(3,minmax(0,1fr));
|
|
@@ -349,7 +355,7 @@ grid-template-areas:"main main main" "s1 s2 s3"}
|
|
|
349
355
|
.kv--2col{grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr)}
|
|
350
356
|
/* ── 拼贴栅格 g-bento(Bento / 马赛克):4 列基准 + 跨列/跨行工具类 ──
|
|
351
357
|
.sp-2/.sp-3/.sp-4 跨列(span),.rw-2 跨行;窄屏自动降列并收敛 span。 */
|
|
352
|
-
.g-bento{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(
|
|
358
|
+
.g-bento{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(min-content,1fr)}
|
|
353
359
|
.sp-2{grid-column:span 2}.sp-3{grid-column:span 3}.sp-4{grid-column:span 4}
|
|
354
360
|
.rw-2{grid-row:span 2}
|
|
355
361
|
@media (max-width:1180px){.g-bento{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
@@ -384,19 +390,21 @@ background:color-mix(in srgb,var(--bg) 86%,transparent);
|
|
|
384
390
|
backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);
|
|
385
391
|
border-bottom:1px solid var(--border-soft);
|
|
386
392
|
transition:height var(--dur-medium) var(--ease-standard)}
|
|
387
|
-
.bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4)}
|
|
388
|
-
.brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0}
|
|
393
|
+
.bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);overflow:hidden}
|
|
394
|
+
.brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0;flex:1 1 auto;overflow:hidden}
|
|
389
395
|
.brand__mark{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent);
|
|
390
396
|
color:var(--accent-on);display:grid;place-items:center;font-size:13px;font-weight:700}
|
|
397
|
+
.brand__txt{min-width:0;overflow:hidden;flex:1 1 auto}
|
|
391
398
|
.brand__title{font-size:var(--fs-sm);font-weight:600;color:var(--text);white-space:nowrap;
|
|
392
|
-
overflow:hidden;text-overflow:ellipsis}
|
|
399
|
+
overflow:hidden;text-overflow:ellipsis;max-width:100%}
|
|
393
400
|
.brand__sub{font-size:var(--fs-xs);color:var(--text-3);white-space:nowrap;overflow:hidden;
|
|
394
|
-
text-overflow:ellipsis}
|
|
395
|
-
.nav{display:flex;align-items:center;gap:var(--sp-1)}
|
|
401
|
+
text-overflow:ellipsis;max-width:100%}
|
|
402
|
+
.nav{display:flex;align-items:center;gap:var(--sp-1);flex:0 1 auto;min-width:0;overflow:hidden}
|
|
396
403
|
.nav a{padding:8px 14px;border-radius:var(--r-full);color:var(--text-2);text-decoration:none;
|
|
397
404
|
font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background-color var(--dur-short),color var(--dur-short)}
|
|
398
405
|
.nav a:hover{background:var(--surface-2);color:var(--text)}
|
|
399
406
|
@media (max-width:1180px){.nav{display:none}}
|
|
407
|
+
@media (max-width:1360px){.brand__sub{display:none}}
|
|
400
408
|
.iconbtn{width:40px;height:40px;flex:none;display:grid;place-items:center;
|
|
401
409
|
border:1px solid var(--border);border-radius:var(--r-full);background:transparent;
|
|
402
410
|
color:var(--text-2);cursor:pointer;transition:background-color var(--dur-short),color var(--dur-short)}
|
|
@@ -451,12 +459,15 @@ transition:background-color var(--dur-short),box-shadow var(--dur-short),transfo
|
|
|
451
459
|
.btn--ghost{background:transparent;color:var(--text);border-color:var(--border)}
|
|
452
460
|
.btn--onDark{background:var(--surface);color:var(--text)}
|
|
453
461
|
.card{background:var(--surface);border:1px solid var(--border-soft);border-radius:var(--r-lg);
|
|
454
|
-
padding:clamp(20px,2vw,30px);transition:border-color var(--dur-short),box-shadow var(--dur-short),background-color var(--dur-medium)
|
|
462
|
+
padding:clamp(20px,2vw,30px);transition:border-color var(--dur-short),box-shadow var(--dur-short),background-color var(--dur-medium);
|
|
463
|
+
display:flex;flex-direction:column;min-width:0}
|
|
455
464
|
.card:hover{border-color:var(--border);box-shadow:var(--shadow-1)}
|
|
456
465
|
.card--flat{background:var(--surface-1);border-color:transparent}
|
|
457
466
|
.card--flat:hover{background:var(--surface-2)}
|
|
458
467
|
.card--accent{background:var(--accent-soft);border-color:transparent}
|
|
459
|
-
.card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}
|
|
468
|
+
.card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3);flex:none}
|
|
469
|
+
.card>.ul,.card>.t-body,.card>.t-sm{flex:1 1 auto}
|
|
470
|
+
.card>.so-what,.card>.tbd-legend,.card>.flagbar{flex:none;margin-top:auto}
|
|
460
471
|
.card__ico{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent-soft);
|
|
461
472
|
color:var(--accent-text);display:grid;place-items:center;font-size:15px;font-weight:600}
|
|
462
473
|
.card__ico svg{width:18px;height:18px}
|
|
@@ -931,7 +942,7 @@ font-size:var(--fs-xs);color:var(--text-3);line-height:1.5}
|
|
|
931
942
|
/* ── 结论条 .sowhat 已迁入 engine.css(MD3 衬条 · 无 So what 标签)── */
|
|
932
943
|
|
|
933
944
|
/* ── research 组件:半表半图分栏(R7) ── */
|
|
934
|
-
.g-half{grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);align-items:
|
|
945
|
+
.g-half{grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);align-items:stretch}
|
|
935
946
|
@media (max-width:1180px){.g-half{grid-template-columns:1fr}}
|
|
936
947
|
|
|
937
948
|
/* ── research 组件:矩阵图(R8) ── */
|
|
@@ -1153,7 +1164,7 @@ transition:color .18s,background-color .18s}
|
|
|
1153
1164
|
<rect x="80" y="37" width="126" height="15" rx="7.5" class="f-acc"/>
|
|
1154
1165
|
<text x="450" y="49" text-anchor="end" class="f-txt" font-size="12" font-weight="600">35%</text>
|
|
1155
1166
|
</svg>
|
|
1156
|
-
<div class="exhibit__src"
|
|
1167
|
+
<div class="exhibit__src">来源:<真实来源名>,YYYY-MM;口径 = 分子 / 分母一行说明</div>
|
|
1157
1168
|
</div>
|
|
1158
1169
|
<ul class="ul rv" style="margin-top:var(--sp-5)">
|
|
1159
1170
|
<li><strong>解读一。</strong>图表给出的一条关键解读。</li>
|
|
@@ -1249,7 +1260,7 @@ transition:color .18s,background-color .18s}
|
|
|
1249
1260
|
<text data-anim="fade" x="338" y="180" text-anchor="middle" class="f-txt3" font-size="11">三季度</text>
|
|
1250
1261
|
<text data-anim="fade" x="458" y="180" text-anchor="middle" class="f-txt3" font-size="11">四季度</text>
|
|
1251
1262
|
</svg>
|
|
1252
|
-
<div class="exhibit__src"
|
|
1263
|
+
<div class="exhibit__src">来源:<真实来源名>,YYYY-MM;口径说明</div>
|
|
1253
1264
|
</div>
|
|
1254
1265
|
</div>
|
|
1255
1266
|
<div class="sowhat rv">
|
|
@@ -1315,7 +1326,7 @@ transition:color .18s,background-color .18s}
|
|
|
1315
1326
|
<text x="270" y="170" text-anchor="middle" class="f-txt3" font-size="11">Q3</text>
|
|
1316
1327
|
<text x="380" y="170" text-anchor="middle" class="f-txt3" font-size="11">Q4</text>
|
|
1317
1328
|
</svg>
|
|
1318
|
-
<div class="exhibit__src"
|
|
1329
|
+
<div class="exhibit__src">来源:<真实来源名>,YYYY-MM;口径说明</div>
|
|
1319
1330
|
</div>
|
|
1320
1331
|
</div>
|
|
1321
1332
|
<div class="sowhat rv">
|
|
@@ -1386,7 +1397,8 @@ transition:color .18s,background-color .18s}
|
|
|
1386
1397
|
</div>
|
|
1387
1398
|
</section>
|
|
1388
1399
|
|
|
1389
|
-
<!-- ══
|
|
1400
|
+
<!-- ══ 参考资料(只列真实来源;无真实来源时整节删除,并去掉正文 [n] 与导航入口) ══ -->
|
|
1401
|
+
<!-- 示例条目(交付时替换为真实机构/报告/文档名,禁止「来源名称」占位串):
|
|
1390
1402
|
<section class="band band--tint" id="refs">
|
|
1391
1403
|
<div class="wrap">
|
|
1392
1404
|
<div class="shead rv">
|
|
@@ -1399,16 +1411,24 @@ transition:color .18s,background-color .18s}
|
|
|
1399
1411
|
<th style="width:14%">时间</th><th>口径说明</th></tr></thead>
|
|
1400
1412
|
<tbody>
|
|
1401
1413
|
<tr id="ref-1"><td class="k">[1]</td>
|
|
1402
|
-
<td><a class="ref-link" href="https://
|
|
1414
|
+
<td><a class="ref-link" href="https://www.gartner.com" target="_blank" rel="noopener">Gartner:Agentic AI 技术成熟度曲线
|
|
1403
1415
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><path d="M15 3h6v6M10 14 21 3"/></svg></a></td>
|
|
1404
|
-
<td>
|
|
1405
|
-
<tr id="ref-2"><td class="k">[2]</td><td>无链接的内部来源(纯文本)</td>
|
|
1406
|
-
<td>YYYY-MM</td><td>内部实测口径</td></tr>
|
|
1416
|
+
<td>2026-04</td><td>全球企业智能体采用率;口径 = 调研样本企业占比</td></tr>
|
|
1407
1417
|
</tbody>
|
|
1408
1418
|
</table>
|
|
1409
1419
|
</div>
|
|
1410
1420
|
</div>
|
|
1411
1421
|
</section>
|
|
1422
|
+
-->
|
|
1423
|
+
<section class="band band--tint" id="refs" hidden data-ref-policy="real-sources-only">
|
|
1424
|
+
<div class="wrap">
|
|
1425
|
+
<div class="shead rv">
|
|
1426
|
+
<div class="t-eyebrow">参考资料</div>
|
|
1427
|
+
<h2 class="t-h1 shead__title">数据来源与口径说明</h2>
|
|
1428
|
+
</div>
|
|
1429
|
+
<p class="t-body rv">(占位节:交付前填入真实来源条目,或整节删除并去掉正文 [n] 与导航「参考资料」入口。禁止「来源名称,时间;口径。」占位条目。)</p>
|
|
1430
|
+
</div>
|
|
1431
|
+
</section>
|
|
1412
1432
|
|
|
1413
1433
|
<!-- ══ 页脚 ══ -->
|
|
1414
1434
|
<footer class="foot">
|
|
@@ -2049,12 +2069,12 @@ window.REPORT_MODEL = {
|
|
|
2049
2069
|
["证据", "引用口径与对照数据,外部数据带 [1]。"],
|
|
2050
2070
|
["含义", "这一发现意味着什么,下一步动作。"]],
|
|
2051
2071
|
"soWhat": "一行含义或建议(≤60 字)。",
|
|
2052
|
-
"footnote": "
|
|
2072
|
+
"footnote": "来源:<真实来源名>,YYYY-MM。" },
|
|
2053
2073
|
{ "type": "exhibit", "eyebrow": "02 · 章节名", "title": "行动标题:一句话给出该图的核心结论",
|
|
2054
2074
|
"exhibitNo": "Exhibit 1",
|
|
2055
2075
|
"chart": { "type": "hbar", "labels": ["项目一", "项目二"], "values": [76, 35], "max": 100, "unit": "%" },
|
|
2056
2076
|
"soWhat": "这页证据意味着什么、建议做什么。",
|
|
2057
|
-
"footnote": "
|
|
2077
|
+
"footnote": "来源:<真实来源名>,YYYY-MM;口径 = 分子 / 分母一行说明" },
|
|
2058
2078
|
{ "type": "table", "eyebrow": "03 · 章节名", "title": "行动标题:这张表的核心结论是什么",
|
|
2059
2079
|
"table": { "head": ["维度", "现状", "目标", "结论"], "rows": [["维度一", "现状描述", "目标描述", "结论一"]] },
|
|
2060
2080
|
"footnote": "注:表格口径与数据期间说明一行。" },
|
|
@@ -2079,7 +2099,7 @@ window.REPORT_MODEL = {
|
|
|
2079
2099
|
|
|
2080
2100
|
/* __TOPPPT_RUNTIME_START__ */
|
|
2081
2101
|
/* ══ PPTX 导出运行时(assets/pptx-export.js 的内联副本 · 由 scripts/sync_runtime.py 注入,禁止手改) ══ */
|
|
2082
|
-
/* __TOPPPT_RUNTIME_SHA__:
|
|
2102
|
+
/* __TOPPPT_RUNTIME_SHA__:af6e25f25fd2e116 */
|
|
2083
2103
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2084
2104
|
* TopPPT HTML· 浏览器端 PPTX 预览运行时
|
|
2085
2105
|
* 零依赖、随报告单文件分发;OOXML 序列化器(仅供预览,页面不导出文件)。
|
|
@@ -2203,7 +2223,8 @@ function regionOf(pageType, slotId, opts) {
|
|
|
2203
2223
|
if (type === 'bar' && slot === 'primary') {
|
|
2204
2224
|
var by = P.chartY || 2.95;
|
|
2205
2225
|
var bb = opts.bottom != null ? opts.bottom : bottomDefault;
|
|
2206
|
-
|
|
2226
|
+
/* chartX/chartW 历史误用已纠正:与 donut/table/hbar/exhibit 同口径,图表盒对齐版心 (MX, CW) */
|
|
2227
|
+
return { x: MX, y: by, w: CW, h: Math.max(1.2, bb - by) };
|
|
2207
2228
|
}
|
|
2208
2229
|
if (type === 'bar' && slot === 'hbar') {
|
|
2209
2230
|
var y0 = P.hbarY0 || 2.6;
|
|
@@ -2315,7 +2336,7 @@ function regionOf(pageType, slotId, opts) {
|
|
|
2315
2336
|
/* __TOPPPT_SCHEMA_START__ */
|
|
2316
2337
|
/* ── 由 scripts/sync_runtime.py 从 scripts/model-schema.json 注入 · 禁止手改 ── */
|
|
2317
2338
|
/* DSL schema 单源:浏览器端 validateModel 与 scripts/extract_model.py 消费同一份定义 */
|
|
2318
|
-
var MODEL_SCHEMA = {"version":"0.1","modes":["presentation","research","architecture"],"model":{"required":["title","sections:array","closing.title","closing.points:array"],"optional":["mode","style","theme","subtitle","meta","agenda:array"],"agendaMin":{"presentation":3,"research":3,"architecture":0},"sectionsMin":1,"sectionsRecommended":3,"agendaComfortMax":
|
|
2339
|
+
var MODEL_SCHEMA = {"version":"0.1","modes":["presentation","research","architecture"],"model":{"required":["title","sections:array","closing.title","closing.points:array"],"optional":["mode","style","theme","subtitle","meta","agenda:array"],"agendaMin":{"presentation":3,"research":3,"architecture":0},"agendaMax":7,"agendaMaxWithRefs":8,"agendaHint":"agenda 条目 = 章(篇/section),3–7 条;每章可含多页(sections[] 按页建模)。禁止把逐页标题当大纲。sections[].eyebrow 的 `NN ·` 前缀 = 章键,须与某条 agenda 对应;跳转锚点 = 该章第一页。含「参考资料」条目时 +1 仍 ≤8。","sectionsMin":1,"sectionsRecommended":3,"agendaComfortMax":8},"commonSectionFields":["eyebrow","title","lead","soWhat","footnote","flags","image","exhibitNo","layoutPreset"],"mutualExclusionHint":"verdict 与 soWhat 互斥:二者共用 annotation 结论条槽位,同页双填必叠印。comparison 页填 verdict 时不要再填 soWhat(渲染器已自动二选一,但模型侧应只给一个)。","flagsHint":"flags = 待核实/待二次修改条目字符串数组(如 '2027 增速 xx%(口径未定)');渲染为 accent 强调色标注行,提示用户核对。","imageHint":"image = 素材图片/配图占位对象。三选一必填:src(用户图,data: 内联或相对路径,零外链铁律禁 http(s))|items(多图版式:grid/compare/wall,元素 {src?, alt?, caption?, placeholder?})|placeholder:true(无图时出配图占位,原生形状渲染、pictures 不增)。其余可选:layout(full/half/bleed/grid/compare/wall,见 layout-constants.json imageSpec.layouts)、fit(cover 默认 / contain)、caption、alt、hint、ratio。","imageLayoutHint":"layout 与 HTML 版式对应:full=版心全宽图|half=左图右注(points 为右栏注解)|bleed=通栏出血|grid=多图网格(items 2/3/4/6 张)|compare=双图 A/B 对比(items 2 张)|wall=Logo 墙(items 3–12 张小图)。占位符标签文本由双引擎按 imageSpec 拼同一串,保证 A/B 通道逐页文本一致。","chartTypes":["bar","hbar","stack","stackline","line","dualline","area","donut","multidonut","pie","radar","scatter","bubble","waterfall","gauge","pareto","funnel","gantt","vsbar","progress","sparkline","slope","dumbbell","lollipop","dotplot","bulletchart","waffle","radialbar","rose","candlestick"],"chartTypesHint":"chart.type 可取值 = 本表(30 类:16 原生 + 14 形状还原)。其余 6 类复杂信息图(sankey/treemap/boxplot/network/marimekko/streamgraph)是**专属页型**而非 chart.type——它们要按列/段/节点等结构化载荷表达,故走 sections[].type。不变量:charts.registry.types == chartTypes ∪ 上述 6 类页型(sync_runtime.py 校验)。","chartDataTable":{"enum":["notes","inline","appendix","off"],"default":"notes","rule":"非原生图表(registry.pptx=shape)的 dataTable 不得为 off;缺失时按 registry 默认值补齐。"},"pageTypes":{"points":{"label":"要点列表页","modes":["presentation","research","architecture"],"required":["points:array"],"optional":["metrics:array"]},"metrics":{"label":"指标带页(4–6 个核心数字)","modes":["presentation","research"],"required":["metrics:array"]},"kpi":{"label":"大数指标页(hero 大数字 + 支撑指标行)","modes":["presentation","research"],"required":["hero:array"],"optional":["metrics:array"]},"table":{"label":"对比表页","modes":["presentation","research","architecture"],"required":["table.head:array","table.rows:array"],"optional":["table.colW:array"]},"timeline":{"label":"时间线 / 路线页","modes":["presentation","research"],"required":["phases:array"]},"steps":{"label":"步骤条页(N 步横排 + 箭头,可分组)","modes":["presentation","research","architecture"],"required":["steps:array"],"optional":["groups:array","note"]},"bar":{"label":"图表页(chart.type 见 chartTypes;native 通道走原生数据图表,shape 通道走高保真形状还原 + 数据表)","modes":["presentation","research"],"required":["chart.labels:array","chart.values:array"],"optional":["chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.start:array","chart.target:array","chart.dataTable","note"]},"donut":{"label":"环形图页(原生 pie 楔形 + 图例)","modes":["presentation","research"],"required":["chart.labels:array","chart.values:array"],"optional":["chart.unit","chart.centerLabel","chart.colors:array","chart.dataTable","note"]},"heatmap":{"label":"热力矩阵页(行 × 列 + 强度色阶)","modes":["presentation","research"],"required":["rowHeads:array","colHeads:array","cells:array"],"optional":["unit","scaleLabel:array","note"]},"bullet":{"label":"达成对比页(实际 vs 目标条)","modes":["presentation","research"],"required":["items:array"],"optional":["unit","max","note"]},"pyramid":{"label":"金字塔页(层级递进,顶层最窄)","modes":["presentation","research","architecture"],"required":["levels:array"],"optional":["note"]},"image":{"label":"素材图片页(full/half/bleed/grid/compare/wall,效果与位置锁定;支持配图占位)","modes":["presentation","research","architecture"],"required":["anyof:image.src:str|image.items:array|image.placeholder"],"optional":["image.caption","image.alt","image.layout","image.fit","image.ratio","image.hint","points:array","note"]},"cards":{"label":"卡片网格页(cards 元素须为 {title, points:[[k,v]…], icon?},不接受元组)","modes":["presentation","research"],"required":["cards:array"],"optional":["columns"],"cardItemHint":"cards[] 元素:{title:str, points:[[k,v]…]|[{t,d}…]|[str…], icon?:str}。icon = 语义图标名(icon_lib.js 键:增长/下降/数据/图表/趋势/占比/表格/效率/成果/安全/权限/检查/风险/团队/流程/计划/智能/洞察/工具/清单),HTML 与 PPTX 同名真导出;缺省按标题语义自动挑选。"},"split":{"label":"双区组合页(left / right 各可为 要点|图表|表格|图片:type = points(默认)| table | image | 图表类型名;图表/表格字段直接挂在对应侧)","modes":["presentation","research"],"required":["anyof:left.points:array|left.type:str"],"optional":["left.cap","left.image","left.labels:array","left.values:array","left.series:array","left.points:array","left.max","left.unit","left.colors:array","left.dataTable","left.head:array","left.rows:array","left.colW:array","right.type","right.cap","right.image","right.labels:array","right.values:array","right.series:array","right.points:array","right.max","right.unit","right.colors:array","right.dataTable","right.head:array","right.rows:array","right.colW:array"]},"comparison":{"label":"对比页(左右双栏 + 可选结论条)","modes":["presentation","research"],"required":["left.title","left.points:array","right.title","right.points:array"],"optional":["verdict"]},"quote":{"label":"引用 / 金句页(深色全幅)","modes":["presentation","research"],"required":["quote","author"],"optional":["context"]},"diagram":{"label":"分层架构页(architecture 模式走全幅几何)","modes":["presentation","research","architecture"],"required":["layers:array"],"optional":["legend:array"]},"exhibit":{"label":"Exhibit 编号图表页(research R2)","modes":["research"],"required":["chart.labels:array","chart.values:array"],"optional":["exhibitNo","chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.dataTable","note"]},"twocol":{"label":"双栏论证页(research R1)","modes":["research"],"required":["paragraphs:array"]},"threecol":{"label":"三栏证据页(research R6)","modes":["research"],"required":["paragraphs:array"]},"halftable":{"label":"半表半图页(research R7)","modes":["research"],"required":["table.head:array","table.rows:array","chart.labels:array","chart.values:array"],"optional":["table.colW:array","chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.dataTable","note"]},"matrix":{"label":"矩阵图页(research R8)","modes":["research"],"required":["rowHeads:array","colHeads:array","cells:array"]},"lane":{"label":"泳道页(architecture A2)","modes":["architecture"],"required":["lanes:array"]},"sankey":{"label":"桑基图页(节点-流带,流向与流量)","modes":["research","architecture"],"required":["flows:array"],"optional":["unit","chart.dataTable","note"]},"treemap":{"label":"树图页(面积编码的层级构成)","modes":["research","architecture"],"required":["items:array"],"optional":["unit","chart.dataTable","note"]},"boxplot":{"label":"箱线图页(分布对比:min/q1/median/q3/max)","modes":["research","architecture"],"required":["groups:array"],"optional":["unit","chart.dataTable","note"]},"network":{"label":"关系网络页(节点-边拓扑)","modes":["research","architecture"],"required":["nodes:array","edges:array"],"optional":["chart.dataTable","note"]},"marimekko":{"label":"马赛克图页(列宽 × 列高双重编码)","modes":["research","architecture"],"required":["cols:array","cells:array"],"optional":["unit","chart.dataTable","note"]},"streamgraph":{"label":"流带图页(时间上的构成演变)","modes":["research","architecture"],"required":["series:array"],"optional":["labels:array","chart.dataTable","note"]}}};
|
|
2319
2340
|
/* __TOPPPT_SCHEMA_END__ */
|
|
2320
2341
|
|
|
2321
2342
|
var _mode = 'presentation'; /* 当前模式(slidesOf 里按 model.mode 设置) */
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "top-ppt-html",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "top-ppt-html",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.19",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"pptxgenjs": "^4.0.0"
|
|
@@ -541,7 +541,7 @@ python scripts/prepare_images.py ./photos --layout grid --mode path # 大图
|
|
|
541
541
|
}
|
|
542
542
|
```
|
|
543
543
|
|
|
544
|
-
> **阈值(layout-constants `contentQuality.agenda
|
|
544
|
+
> **阈值(layout-constants `contentQuality.agenda`)**:**大纲 = 章(3–7 条),不是页目录**;每章 1+ 页,页标题不进 Agenda。≤8 单列;仅异常超 8 才 `.agenda--2col`;PPTX 自动分页只是安全网。单条标题 ≤36 字(`titleMaxChars`,超长截断+全称沉 notes)。放不下先归并回章,禁逐页罗列撑爆一屏。
|
|
545
545
|
> 条目仍偏高:压缩 `.agenda__a` 的 `padding`(如 `clamp(12px,1.6vh,18px)`)。
|
|
546
546
|
|
|
547
547
|
---
|
|
@@ -258,12 +258,14 @@ DGIG: 数据 = 能自我增强的生产资料
|
|
|
258
258
|
|
|
259
259
|
> 反向情况——内容明显不足一屏且接近满屏观感更好时(Hero/Agenda/收尾章/大指标页),给该页加 `band--fit` 垂直居中,避免"上半页挤、下半页空"。
|
|
260
260
|
|
|
261
|
-
### Agenda
|
|
262
|
-
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
-
|
|
266
|
-
-
|
|
261
|
+
### Agenda = 章节大纲(3–7 章,不是页目录)
|
|
262
|
+
|
|
263
|
+
- **条目 = 章(篇 / section),不是页**。每章含 1+ 页;页标题逐页出现,章标题只在 Agenda 出现一次。
|
|
264
|
+
- **条数预算:3–7 章**(演示 3–5 章;研究 4–7 章;含「参考资料」条目时 +1,仍 ≤8)。
|
|
265
|
+
- 章标题 = 该章结论(行动句),一句话说明 = 该章关键证据预告(`outline-design.md` ⑤)。
|
|
266
|
+
- **出现 8 条以上 = 你在列页**:按 eyebrow 章前缀(如 `01 · 范式`)归并回章;禁止把逐页标题当大纲。
|
|
267
|
+
- 排版:≤8 条单列;仅当章节化后仍 >8(异常)才 `.agenda--2col`。PPTX 自动分页只是安全网,不是设计目标。
|
|
268
|
+
- 跳转锚点 = 该章第一页;校验器查锚点与章标题闭环。
|
|
267
269
|
- 单条标题 **≤36 字**(`titleMaxChars`):超长截断、全称沉演讲者备注。
|
|
268
270
|
|
|
269
271
|
---
|
|
@@ -348,18 +350,22 @@ DGIG: 数据 = 能自我增强的生产资料
|
|
|
348
350
|
1. **外部数据、行业预测、他人研究** → 数值后加 `[n]` 上标。
|
|
349
351
|
2. **内部实测** → 标来源与日期,**不加** `[n]`。
|
|
350
352
|
3. **推算 / 待确认** → 显式标注口径,或用 `xx` 占位。
|
|
351
|
-
4.
|
|
353
|
+
4. **「参考资料」只列真实来源**:
|
|
354
|
+
- 材料/正文引用了真实来源(报告名、机构、文档、URL、内部调研名)→ 列条目:`[n] 来源名(机构),时间;口径;链接(如有)`。
|
|
355
|
+
- **没有真实来源 → 整节省略**(并删正文 `[n]`/`.ref-link`;导航与收尾的「参考资料」入口一并去掉)。
|
|
356
|
+
- **禁止占位条目**:「来源名称,时间;口径。」「来源 N(替换为真实来源名称)」「某行业报告」等模板串一旦出现在交付物即 FAIL——宁缺毋假,不得误导读者以为存在可追溯来源。
|
|
357
|
+
- 无外部引用但需交代内部口径 → 用各页 `.footnote` / `.exhibit__src` / `.media__src`,不设空的「参考资料」页。
|
|
352
358
|
5. **来源带链接的保留链接效果** —— 外部 URL 或可追溯的内部文档,来源名做成可点击链接 `<a class="ref-link" href="…" target="_blank" rel="noopener">`,新窗口打开;无链接来源保持纯文本。
|
|
353
359
|
|
|
354
|
-
**✗
|
|
360
|
+
**✗ 无效引用**:① 正文 `[3]` 但文末只有 2 条(编号错配,校验 FAIL);② 条目只写「某行业报告」(无时间无口径,不可追溯);③ 内部实测也挂 `[n]`(应标「内部实测 · 2026-08」);④ 条目是「来源名称,时间;口径。」占位串(交付物出现即 FAIL)。
|
|
355
361
|
|
|
356
362
|
上标样式与参考资料章节代码见 `components.md`;`.ref-link` 样式见 `design-system.md`。
|
|
357
363
|
|
|
358
364
|
### `.ref-link` 用法
|
|
359
365
|
|
|
360
366
|
```html
|
|
361
|
-
<td><a class="ref-link" href="https://
|
|
362
|
-
|
|
367
|
+
<td><a class="ref-link" href="https://www.gartner.com/en/newsroom" target="_blank" rel="noopener">
|
|
368
|
+
Gartner:Agentic AI 技术成熟度曲线
|
|
363
369
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
|
364
370
|
stroke-linecap="round" stroke-linejoin="round">
|
|
365
371
|
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>
|
|
@@ -414,7 +420,7 @@ DGIG: 数据 = 能自我增强的生产资料
|
|
|
414
420
|
[主体] 图 / 表 / 列表
|
|
415
421
|
```
|
|
416
422
|
|
|
417
|
-
结尾章:**下一步 3
|
|
423
|
+
结尾章:**下一步 3 条**(列表)(+ 参考资料——仅当存在真实来源)。
|
|
418
424
|
|
|
419
425
|
|
|
420
426
|
## 六-b、Mode A 主张 / 行动标题(action title)
|
|
@@ -238,16 +238,18 @@
|
|
|
238
238
|
|
|
239
239
|
**根因**:几何算法与内容量脱钩(固定偏移、单栏宽当总宽、同槽位无仲裁)。**门禁**:`validate_pptx.py --strict` 已含 `ELEMENT_OVERLAP` / `LAYOUT_FILL` / `ANNOTATION_BAND_OVERLAP`;`cross_verify` 比对 Agenda 阅读顺序、图片数、图表数据标签。
|
|
240
240
|
|
|
241
|
-
## F20 · Agenda 溢出 / 图表退化 /
|
|
241
|
+
## F20 · Agenda 溢出 / 图表退化 / 图标跨通道(v9.2 · 容量与跨通道)
|
|
242
242
|
|
|
243
243
|
| 信号 | 错误码 | 修复 |
|
|
244
244
|
|------|--------|------|
|
|
245
|
-
| Agenda
|
|
245
|
+
| Agenda 列成页目录(>8 条) | `Agenda 条数 ≤16`(validate_report);`contentQuality.agenda.chapterMax=7` | 按 eyebrow 章前缀归并回章(3–7 条);禁止逐页标题当大纲 |
|
|
246
246
|
| Agenda 单条标题 >36 字 | `Agenda 单条标题 ≤36 字`(WARN) | 截断+全称沉 notes;或精炼标题 |
|
|
247
247
|
| Agenda 两通道阅读顺序不一致 | `Agenda序=DRIFT`(cross_verify) | 列优先(先左列后右列);HTML 用 `column-count`,PPTX 用列填充 |
|
|
248
248
|
| low 图型无数据表 | `图表 PPTX 还原度提示`(WARN) | area/radar/treemap/sankey/streamgraph/marimekko/boxplot/network 在 PPTX 显著退化——改 bar/line/hbar/donut 或 `dataTable=inline` |
|
|
249
|
-
| ≥2 卡且无 `.card__ico` | `要点/卡片页含 .card__ico`(WARN) | 从 `icons.md` 取语义图标(`render_from_model.py` 已内置 `card_head()`
|
|
249
|
+
| ≥2 卡且无 `.card__ico` | `要点/卡片页含 .card__ico`(WARN) | 从 `icons.md` 取语义图标(`render_from_model.py` 已内置 `card_head()` 自动出图标 + `data-icon`) |
|
|
250
|
+
| PPTX 卡片头是方块不是图标 | `icon_pictures=0`(validate_pptx summary) | 跑 `node scripts/build_icon_assets.js` 生成 `icon-assets.json`(需 sharp);确认模型 `cards[].icon` 有值。缺资产时引擎回落 accent 方块(可扫读,但非真图标) |
|
|
251
|
+
| 图标 PNG 进了内容图门禁 | `PICTURES_NOT_DECLARED` 误报 | 图标 `objectName` 必须以 `icon:` 开头;`validate_pptx` 按前缀分流到 `icon_pictures` |
|
|
250
252
|
| 图片占位标签 A/B 不同串 | `图片数=DRIFT` / 文本覆盖不足 | 占位标签由 `imageSpec` 同源拼接;`render_from_model` 与 PPTX `imgPlaceholderLabel` 必须同串 |
|
|
251
253
|
|
|
252
|
-
**根因**:页型容量契约缺失 + 图表双通道无还原度约定 + 图标/占位文本两处手写。**门禁**:`contentQuality.agenda`(singleMax/splitMax/titleMaxChars)、`charts.fidelityMap`、`cross_verify --full-ab`
|
|
254
|
+
**根因**:页型容量契约缺失 + 图表双通道无还原度约定 + 图标/占位文本两处手写。**门禁**:`contentQuality.agenda`(singleMax/splitMax/titleMaxChars/chapterMax)、`charts.fidelityMap`、`cross_verify --full-ab`、`icon_pictures` 分流计数。
|
|
253
255
|
|
|
@@ -120,8 +120,21 @@ python scripts/render_compare.py "报告.pptx" --html "报告.html" --out "rende
|
|
|
120
120
|
|
|
121
121
|
| 业界做法 | 不采纳原因 |
|
|
122
122
|
|---------|-----------|
|
|
123
|
-
| ImageGen 逐页蓝图(生成 16:9 位图再逐页还原) |
|
|
123
|
+
| ImageGen 逐页蓝图(生成 16:9 位图再逐页还原) | 环境依赖重;且与「单文件零外链 + pictures=0 默认」冲突。本技能以「锁定版式 + 常量单源 + 形状还原规则」达成同等的版式可复现性。 |
|
|
124
124
|
| PowerPoint COM 渲染回归作为**硬门禁** | 需本机 PowerPoint;降级为可选路径(本文 §六),日常由 A 通道预览 + python-pptx 双裁判覆盖。 |
|
|
125
125
|
| SHA-256 冻结签名 + 逐页人工验收确认 | 交互轮次与耗时显著增加,与「一次问询 + 自动生成 + 校验闭环」定位冲突;改为 manifest 登记(可复现、无需冻结)。 |
|
|
126
126
|
| 禁止 `python-pptx`(必须只用 pptxgenjs) | 本技能用 pptxgenjs 做**生成**,用 python-pptx 做**第三方裁判**(`cross_verify.py`)——职责分离比"单一引擎"更能暴露问题(实测抓出两处 OOXML 规范缺陷)。 |
|
|
127
127
|
| 联网检索素材(web_search 脚本) | 越出"报告生成"边界;外部数据由用户提供或由 AI 在对话中检索,来源须可追溯(`[n]` + 参考资料)。 |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 九、已落地的高保真增强(对照业界混合通道)
|
|
132
|
+
|
|
133
|
+
| 增强 | 做法 | 业界参照 |
|
|
134
|
+
|------|------|---------|
|
|
135
|
+
| **图标真导出** | `icon_lib.js` + sharp 栅格化 PNG,`objectName: icon:*`,`icon_pictures` 单独计数 | Slidev `pptx-editable`:SVG/canvas 按元素降级为图,整页不动 |
|
|
136
|
+
| **发射前叠印断言** | `assertNoOverlap` / `rectsOverlap` 在 addShape 前自检组合布局(图表∩inline 数据表等),计入 `OVERLAP_PREEMIT` | IR band allocator;事后裁判(`ELEMENT_OVERLAP`)仍保留 |
|
|
137
|
+
| **表格行高自适应** | `addTable` 超容量压到 hardFloor / 整体缩放;表头独立 `headRowH`;`fit:'shrink'` | Measured `colW[]`/`rowH[]`;文本 `fit:'shrink'` |
|
|
138
|
+
| **图表区对齐版心** | `regionOf('bar')` 纠正 chartX/chartW 双偏移,与标题/表格左边距一致 | 坐标区域映射的静默漂移防护 |
|
|
139
|
+
| **图例收进图高** | waffle/marimekko/slope 图例带含在 `h` 内,与 inline 数据表留间隙 | 几何铁律②「类目标签含在图高 h 内」 |
|
|
140
|
+
| **文本自动收缩** | 标题/卡片/结论条/页脚加 `fit:'shrink'`(PowerPoint 字体度量 ≠ 浏览器) | `fit:'shrink'` + 高度余量 |
|