@topmindspace/tms-skills 0.1.13 → 0.1.14
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 +26 -0
- package/README.en.md +3 -3
- package/README.md +3 -3
- package/package.json +1 -1
- package/top-ppt-html/README.en.md +2 -2
- package/top-ppt-html/README.md +1 -1
- package/top-ppt-html/SKILL.md +3 -3
- package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +59 -20
- package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.html +64 -26
- package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.html +64 -42
- package/top-ppt-html/assets/examples/2026-09-26-topmind-tms-skills-showcase.html +85 -46
- package/top-ppt-html/assets/examples/2026-09-26-topmind-tms-skills-showcase.model.json +1 -1
- package/top-ppt-html/assets/pptx-export.js +40 -17
- package/top-ppt-html/assets/showcase/showcase-charts.png +0 -0
- package/top-ppt-html/assets/showcase/showcase-cover.png +0 -0
- package/top-ppt-html/assets/showcase/showcase-gates.png +0 -0
- package/top-ppt-html/assets/showcase/showcase-modes.png +0 -0
- package/top-ppt-html/assets/showcase/showcase-positioning.png +0 -0
- package/top-ppt-html/assets/showcase/showcase-split.png +0 -0
- package/top-ppt-html/assets/showcase/showcase-toolbar.png +0 -0
- package/top-ppt-html/assets/style-gallery.html +3 -3
- package/top-ppt-html/assets/templates/architecture.html +59 -20
- package/top-ppt-html/assets/templates/engine.css +17 -1
- package/top-ppt-html/assets/templates/presentation.html +59 -20
- package/top-ppt-html/assets/templates/research.html +60 -27
- package/top-ppt-html/assets/templates/ui.js +1 -1
- 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 +14 -1
- package/top-ppt-html/references/content-rules.md +1 -1
- package/top-ppt-html/references/design-system.md +1 -1
- package/top-ppt-html/references/icons.md +19 -0
- package/top-ppt-html/references/layout-grammar.md +17 -0
- package/top-ppt-html/references/layouts-combo.md +2 -4
- package/top-ppt-html/references/modes.md +1 -1
- package/top-ppt-html/references/pptx-export.md +1 -1
- package/top-ppt-html/scripts/build_pptx.js +50 -22
- package/top-ppt-html/scripts/layout-constants.json +18 -6
- package/top-ppt-html/scripts/quality_gate.py +2 -2
- package/top-ppt-html/scripts/render_from_model.py +2 -4
- package/top-ppt-html/scripts/scaffold_report.py +4 -10
- package/top-ppt-html/scripts/test_feedback_gates.py +2 -2
- package/top-ppt-html/scripts/validate_pptx.py +27 -11
- package/top-ppt-html/scripts/validate_report.py +27 -5
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
.pv__hfill{height:100%;border-radius:999px;background:var(--pa)}
|
|
87
87
|
.pv__hval{font-size:10px;font-weight:700;color:var(--ptxt);width:28px;text-align:right;flex:none}
|
|
88
88
|
.pv__src{font-size:9px;color:var(--ptxt2);border-top:1px solid var(--pbd);padding-top:5px;margin-top:2px}
|
|
89
|
-
.pv__sowhat{display:flex;align-items:
|
|
89
|
+
.pv__sowhat{display:flex;align-items:flex-start;gap:8px;margin-top:16px;padding:12px 16px;border-left:4px solid var(--pa);border-radius:8px;
|
|
90
90
|
background:var(--pas);border-radius:0 6px 6px 0;padding:6px 10px;margin-bottom:10px}
|
|
91
91
|
.pv__swK{font-size:8.5px;font-weight:700;letter-spacing:.1em;color:var(--pa);flex:none}
|
|
92
92
|
.pv__swV{font-size:10px;font-weight:500;color:var(--ptxt);line-height:1.5}
|
|
@@ -206,7 +206,7 @@ var PRESETS_DARK = {
|
|
|
206
206
|
var STYLE_DATA_COLORS = {"business-blue":["1a73e8","3526bb","21a199","b77148","99983d"],"apple-mono":["1d1d1f","0071e3","0f7b6c","c2410c","7c3aed"],"mckinsey":["003a70","2826bb","21a18e","b76848","99903d"],"brand-red":["d0021b","bb6326","d634ae","40a182","438aa8"],"warm-sand":["96681f","839324","cf3b3e","4d88b2","4a47a4"],"deep-teal":["0f6b5c","2683bb","22aa3e","b74870","a85c43"],"graphite-dark":["0369a1","2637bb","1f9977","b75948","a18a40"],"indigo-violet":["5b5bd6","7432ae","4197c8","a08f4b","7ca04b"],"spectrum":["4563ef","5b26bb","269ebb","af8746","83993d"]};
|
|
207
207
|
var STYLE_DATA_COLORS_DARK = {"business-blue":["8ab4f8","7966e0","88e7e5","d4ad91","cbce83"],"apple-mono":["f5f5f7","2997ff","2dd4bf","ff9f0a","bf5af2"],"mckinsey":["7fb2e5","6f6bdb","8ce3d8","d1a694","cbc586"],"brand-red":["ff5a66","e09e66","e788cb","91d4c2","83b4ce"],"warm-sand":["d9b36a","c2d571","df9391","97b5ce","8e89c7"],"deep-teal":["4fc3b0","7aaecd","97d8a4","c99cac","c29c8f"],"graphite-dark":["4da3ff","6c66e0","88e7dc","d4a691","cec983"],"indigo-violet":["a5a4f0","a967e0","89c3e7","d3c792","aece83"],"spectrum":["8ba0f8","9066e0","88d6e7","d4ba91","bdce83"]};
|
|
208
208
|
var GRID = {"columns":12,"gutter":0.16,"colW":0.8644,"x":[0.6,1.6244,2.6488,3.6732,4.6976,5.722,6.7464,7.7708,8.7952,9.8196,10.844,11.8684,12.733],"y":[2.35,3.27,4.19,5.11,6.03,6.9],"safe":{"top":0.4,"bottom":0.4,"left":0.6,"right":0.6}};
|
|
209
|
-
var TYPO = {"levels":[{"id":"C0","name":"封面/章节幕标题","role":"coverTitle","usage":"封面主标题、章节幕标题"},{"id":"T1","name":"页码/章节徽章","role":"caption","usage":"页码徽章、章节编号"},{"id":"T2","name":"页面主标题/结论标题","role":"h1","usage":"每页顶部结论句(research 行动标题)"},{"id":"T3","name":"副标题/语境说明","role":"lead","usage":"主标题下方导语"},{"id":"T4","name":"模块标题/图表标题","role":"h2","usage":"卡片标题、图表标题、面板标题"},{"id":"T5","name":"证据编号/轻量标签","role":"micro","usage":"Exhibit 编号、状态标签"},{"id":"T6","name":"证据块标题/小节标题","role":"h2","usage":"分栏小标题、证据块标题"},{"id":"T7","name":"正文解释段落","role":"body","usage":"证据解释、管理解读正文、表格正文"},{"id":"T8","name":"结论条文字","role":"body","usage":"
|
|
209
|
+
var TYPO = {"levels":[{"id":"C0","name":"封面/章节幕标题","role":"coverTitle","usage":"封面主标题、章节幕标题"},{"id":"T1","name":"页码/章节徽章","role":"caption","usage":"页码徽章、章节编号"},{"id":"T2","name":"页面主标题/结论标题","role":"h1","usage":"每页顶部结论句(research 行动标题)"},{"id":"T3","name":"副标题/语境说明","role":"lead","usage":"主标题下方导语"},{"id":"T4","name":"模块标题/图表标题","role":"h2","usage":"卡片标题、图表标题、面板标题"},{"id":"T5","name":"证据编号/轻量标签","role":"micro","usage":"Exhibit 编号、状态标签"},{"id":"T6","name":"证据块标题/小节标题","role":"h2","usage":"分栏小标题、证据块标题"},{"id":"T7","name":"正文解释段落","role":"body","usage":"证据解释、管理解读正文、表格正文"},{"id":"T8","name":"结论条文字","role":"body","usage":"结论条、核心结论框"},{"id":"T9","name":"结论条标签(可选·默认隐藏)","role":"caption","usage":"结论条可选标签(默认不显示)"},{"id":"T10","name":"结论条正文/业务含义","role":"body","usage":"结论条正文、行动含义、表格行动项"},{"id":"T11","name":"图表轴/图例/刻度/微标签","role":"micro","usage":"坐标轴、图例、刻度、单位(禁用于表格正文与完整短句)"},{"id":"T12","name":"图表数据标签","role":"caption","usage":"折线点值、柱形标签、百分比标注"},{"id":"T13","name":"关键 KPI 大数字","role":"h1","usage":"KPI 大数字、hero 数值"},{"id":"T14","name":"注释/口径/来源/页脚","role":"micro","usage":"footnote、来源行、页脚、小页码"}],"tableSemanticRule":{"body":["T7","T10"],"microAllowed":["T11"],"microForbiddenFor":["表格正文","行动项","风险项","解释句","建议句","长项目符号","完整短句"]}};
|
|
210
210
|
var CONT = {"pad":{"card":0.18,"panel":0.2,"cell":0.08,"band":0.16,"soWhat":0.16,"kpi":0.18,"chart":0.1,"head":0.05,"footer":0.05,"node":0.06},"minPad":0.06,"textMetrics":{"lineFactor":1.45,"emAsciiRatio":0.52},"overflowRule":"溢出处置优先级(禁静默截断):① 重构承载(列表/卡片/表/图/组合版式)→ ② 拆页/分章(议程→主张→证据卡→明细;01a/01b;信息须完整)→ ③ 换布局形态(V1–V4/多列/卡栅格)→ ④ 有限 fontShrink(阶梯内、模式 floor 以上、最多 4 档)→ ⑤ 禁止:静默截断、砍 so-what/证据/口径、为审美稀疏删决策必需信息。单页字数预算是预警不是删字许可证。","fontShrink":{"ladder":[15,14,13.5,13,12.5,12,11.5,11,10.5,10,9.5,9,8.5],"maxShrinkSteps":4,"floorPt":{"presentation":10,"research":9,"architecture":10},"preferContentFirst":true,"warnBelow":9.5},"continuousTextRule":"语义连续的一句话 / so-what 主句 / 结论句 / 表格单元格正文不得拆成多个独立文本框(避免异常空格、断句、基线漂移);局部加粗高亮必须用同一文本框内富文本。"};
|
|
211
211
|
var REG = {"bar":{"html":"svg-bars","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":160}},"hbar":{"html":"svg-hbars","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":100}},"stack":{"html":"svg-stack","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":160},"nativeOpt":{"barGrouping":"stacked"}},"stackline":{"html":"svg-stackline","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":40},"nativeOpt":{"barGrouping":"percentStacked"}},"line":{"html":"svg-line","pptx":"native","nativeType":"line","dataTable":"notes","min":{"vbHeightMin":160}},"dualline":{"html":"svg-dualline","pptx":"native","nativeType":"line","dataTable":"notes","min":{"vbHeightMin":160}},"area":{"html":"svg-area","pptx":"native","nativeType":"area","dataTable":"notes","min":{"vbHeightMin":160}},"donut":{"html":"svg-donut","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":140}},"multidonut":{"html":"svg-mdonut","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":140}},"pie":{"html":"svg-pie","pptx":"native","nativeType":"pie","dataTable":"notes","min":{"pxWidthMin":140}},"radar":{"html":"svg-radar","pptx":"native","nativeType":"radar","dataTable":"notes","min":{"pxWidthMin":220}},"scatter":{"html":"svg-scatter","pptx":"native","nativeType":"scatter","dataTable":"notes","min":{"vbHeightMin":180}},"bubble":{"html":"svg-bubble","pptx":"native","nativeType":"bubble","dataTable":"notes","min":{"vbHeightMin":180}},"waterfall":{"html":"svg-wf","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":170},"nativeTrick":"stacked+hiddenBase+connector"},"gauge":{"html":"svg-gauge","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":180},"nativeTrick":"doughnut+firstSliceAng+hiddenRemainder"},"pareto":{"html":"svg-pareto","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":180},"nativeTrick":"multiType+bar+line"},"gantt":{"html":"svg-gantt","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":130},"path":{"forbidPresetShapes":true}},"vsbar":{"html":"svg-vsbar","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":100},"path":{"forbidPresetShapes":true}},"progress":{"html":"svg-progress","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":100},"path":{"forbidPresetShapes":true}},"sparkline":{"html":"svg-spark","pptx":"shape","dataTable":"off","min":{"vbHeightMin":20},"path":{"forbidPresetShapes":true}},"funnel":{"html":"svg-funnel","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"minSamplePoints":8,"forbidPresetShapes":true}},"treemap":{"html":"svg-treemap","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":170},"path":{"forbidPresetShapes":true}},"marimekko":{"html":"svg-marimekko","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"boxplot":{"html":"svg-boxplot","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}},"network":{"html":"svg-network","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":200},"path":{"forbidPresetShapes":true}},"sankey":{"html":"svg-sankey","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":200},"path":{"minSamplePoints":16,"trackBothEdges":true,"forbidPresetShapes":true}},"streamgraph":{"html":"svg-stream","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":160},"path":{"minSamplePoints":24,"trackBothEdges":true,"forbidPresetShapes":true}},"slope":{"html":"svg-slope","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}},"dumbbell":{"html":"svg-dumbbell","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"lollipop":{"html":"svg-lollipop","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":140},"path":{"forbidPresetShapes":true}},"dotplot":{"html":"svg-dotplot","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":120},"path":{"forbidPresetShapes":true}},"bulletchart":{"html":"svg-bullet","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":140},"path":{"forbidPresetShapes":true}},"waffle":{"html":"svg-waffle","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"radialbar":{"html":"svg-radialbar","pptx":"shape","dataTable":"notes","min":{"pxWidthMin":200},"path":{"minSamplePoints":16,"forbidPresetShapes":true}},"rose":{"html":"svg-rose","pptx":"shape","dataTable":"notes","min":{"pxWidthMin":180},"path":{"minSamplePoints":16,"forbidPresetShapes":true}},"candlestick":{"html":"svg-candle","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}}};
|
|
212
212
|
var DEEP = {"triggers":["高保真","1:1","一比一","精确还原","按图还原","正式交付","不能偏移","像素级","严格对照","逐页验收"],"complexCharts":["sankey","streamgraph","treemap","marimekko","boxplot","network","rose","radialbar","candlestick","funnel"],"checks":{"anchors":true,"containerOverflow":true,"renderCompare":true,"manifest":true},"renderCompare":{"engine":"soffice","fallback":"powerpoint-com","skipIfMissing":true,"dpi":96}};
|
|
@@ -481,7 +481,7 @@ function pvBody(s,mode){
|
|
|
481
481
|
hbarRow('客服',72,100,pal?pal[0]:null)+hbarRow('财务',57,100,pal?pal[1]:null)+
|
|
482
482
|
hbarRow('营销',48,100,pal?pal[2]:null)+hbarRow('研发',38,100,pal?pal[3]:null)+
|
|
483
483
|
'<div class="pv__src">来源:企业智能体发展调研,2026-08;口径说明一行</div></div>'+
|
|
484
|
-
'<div class="pv__sowhat"
|
|
484
|
+
'<div class="pv__sowhat">'+
|
|
485
485
|
'<span class="pv__swV">研发域势能最大,工具链补齐后有望反超客服域。</span></div>'+
|
|
486
486
|
'<div class="pv__cols"><p><b>发现。</b>试点率 61%,规模化仅 18%。</p>'+
|
|
487
487
|
'<p><b>证据。</b>37/42 家卡在权限与集成。</p>'+
|
|
@@ -263,7 +263,8 @@ section.band{scroll-snap-align:start}
|
|
|
263
263
|
svh 兼容移动端浏览器工具栏;旧浏览器落到 100vh。 */
|
|
264
264
|
.band{padding-block:var(--band-pad);min-height:var(--band-min);
|
|
265
265
|
display:flex;flex-direction:column;justify-content:center}
|
|
266
|
-
.band>.wrap{width:100
|
|
266
|
+
.band>.wrap{width:100%;min-height:0}
|
|
267
|
+
.band>.wrap>.grid,.band>.wrap>.stack,.band>.wrap>.fig,.band>.wrap>.cols-2,.band>.wrap>.cols-3,.band>.wrap>.exhibit{min-height:0}
|
|
267
268
|
.band--top{justify-content:flex-start} /* 内容约六七成屏:贴顶 + 底部自然留白 */
|
|
268
269
|
.band--fit{justify-content:center} /* 内容接近一屏:垂直居中(默认行为,保留以兼容旧报告) */
|
|
269
270
|
.band--flow{min-height:0;justify-content:flex-start} /* 长内容页(附录/全量参考)显式退出固定页高 */
|
|
@@ -504,6 +505,21 @@ tbody tr:hover{background:var(--surface-1)}
|
|
|
504
505
|
td strong{color:var(--text);font-weight:600}
|
|
505
506
|
td.k{color:var(--text);font-weight:500;white-space:nowrap}
|
|
506
507
|
td.num{font-variant-numeric:tabular-nums}
|
|
508
|
+
/* ── 结论条(MD3 tonal strip · 本页重点收口;默认不显示「So what」标签) ──
|
|
509
|
+
与上方主内容呼吸间距 ≥ --sp-6;flex:none 防止被主内容挤压;一屏页不得压进注释带。 */
|
|
510
|
+
.band>.wrap:has(>.sowhat),.band>.wrap:has(>.note){display:flex;flex-direction:column}
|
|
511
|
+
.sowhat{display:flex;align-items:flex-start;gap:var(--sp-3);flex:none;
|
|
512
|
+
margin-top:clamp(28px,3.6vh,48px); /* ≥ --sp-6 量级,修「贴底」 */
|
|
513
|
+
padding:var(--sp-4) var(--sp-5);background:var(--accent-soft);border:1px solid var(--accent-soft-2);
|
|
514
|
+
border-left:4px solid var(--accent);border-radius:var(--r-md);max-width:100%}
|
|
515
|
+
.sowhat__k{display:none}
|
|
516
|
+
.sowhat--labeled .sowhat__k{display:inline;font-size:var(--fs-xs);font-weight:700;letter-spacing:.1em;
|
|
517
|
+
text-transform:uppercase;color:var(--accent-text);white-space:nowrap;flex:none;padding-top:.15em}
|
|
518
|
+
.sowhat__v,.sowhat>:not(.sowhat__k){font-size:var(--fs-h3);color:var(--text);font-weight:var(--fw-title);
|
|
519
|
+
line-height:1.55;flex:1;min-width:0}
|
|
520
|
+
.sowhat__v p,.sowhat__stack{margin:0}
|
|
521
|
+
.sowhat__stack{display:flex;flex-direction:column;gap:var(--sp-2)}
|
|
522
|
+
|
|
507
523
|
.note{display:flex;gap:var(--sp-4);padding:clamp(20px,2vw,28px);border-radius:var(--r-lg);
|
|
508
524
|
background:var(--accent-soft);border-left:3px solid var(--accent)}
|
|
509
525
|
.note__ico{width:26px;height:26px;flex:none;border-radius:50%;background:var(--accent);
|
|
@@ -1498,7 +1514,7 @@ if(e.isIntersecting){e.target.classList.add('in');o.unobserve(e.target)}})},
|
|
|
1498
1514
|
var PROMPT=[
|
|
1499
1515
|
'请为这份 HTML 报告生成可编辑 PPTX 并交付:',
|
|
1500
1516
|
'1) 阅读 references/pptx-export.md 与 references/modes.md(三模式独立规则);',
|
|
1501
|
-
'2) 核对/补全 window.REPORT_MODEL 为与正文严格一致的内容(含 mode/style/theme/title/agenda/sections/closing;theme 为 light 或 dark、与页面 data-theme 一致——PPTX 按此导出亮色版或深色版;29 种页型字段与 30 类 chart.type 见 scripts/model-schema.json;research 关键图表页用 type:"exhibit" 并填 exhibitNo/soWhat/footnote);',
|
|
1517
|
+
'2) 核对/补全 window.REPORT_MODEL 为与正文严格一致的内容(含 mode/style/theme/title/agenda/sections/closing;theme 为 light 或 dark、与页面 data-theme 一致——PPTX 按此导出亮色版或深色版;29 种页型字段与 30 类 chart.type 见 scripts/model-schema.json;research 关键图表页用 type:"exhibit" 并填 exhibitNo/soWhat(结论条)/footnote);',
|
|
1502
1518
|
'3) 运行 python scripts/validate_report.py <报告.html> 直到全 PASS(含模型一致性检查);',
|
|
1503
1519
|
'4) 智能体精导并质检(0/0 才交付):python scripts/extract_model.py <报告.html> → NODE_PATH=<pptxgenjs 所在 node_modules> node scripts/build_pptx.js <报告.pptx> --model=<报告.model.json>(如需覆盖模型主题可加 --theme=light|dark) → python scripts/validate_pptx.py <报告.pptx> --strict --model=<报告.model.json>。',
|
|
1504
1520
|
'报告文件:<请填写报告.html 的路径>'
|
|
@@ -1778,7 +1794,7 @@ window.REPORT_MODEL = {
|
|
|
1778
1794
|
|
|
1779
1795
|
/* __TOPPPT_RUNTIME_START__ */
|
|
1780
1796
|
/* ══ PPTX 导出运行时(assets/pptx-export.js 的内联副本 · 由 scripts/sync_runtime.py 注入,禁止手改) ══ */
|
|
1781
|
-
/* __TOPPPT_RUNTIME_SHA__:
|
|
1797
|
+
/* __TOPPPT_RUNTIME_SHA__:f4dc2ab366ea79c4 */
|
|
1782
1798
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
1783
1799
|
* TopPPT HTML· 浏览器端 PPTX 预览运行时
|
|
1784
1800
|
* 零依赖、随报告单文件分发;OOXML 序列化器(仅供预览,页面不导出文件)。
|
|
@@ -1859,7 +1875,7 @@ var PRESETS_DARK = {
|
|
|
1859
1875
|
var STYLE_DATA_COLORS = {"business-blue":["1a73e8","3526bb","21a199","b77148","99983d"],"apple-mono":["1d1d1f","0071e3","0f7b6c","c2410c","7c3aed"],"mckinsey":["003a70","2826bb","21a18e","b76848","99903d"],"brand-red":["d0021b","bb6326","d634ae","40a182","438aa8"],"warm-sand":["96681f","839324","cf3b3e","4d88b2","4a47a4"],"deep-teal":["0f6b5c","2683bb","22aa3e","b74870","a85c43"],"graphite-dark":["0369a1","2637bb","1f9977","b75948","a18a40"],"indigo-violet":["5b5bd6","7432ae","4197c8","a08f4b","7ca04b"],"spectrum":["4563ef","5b26bb","269ebb","af8746","83993d"]};
|
|
1860
1876
|
var STYLE_DATA_COLORS_DARK = {"business-blue":["8ab4f8","7966e0","88e7e5","d4ad91","cbce83"],"apple-mono":["f5f5f7","2997ff","2dd4bf","ff9f0a","bf5af2"],"mckinsey":["7fb2e5","6f6bdb","8ce3d8","d1a694","cbc586"],"brand-red":["ff5a66","e09e66","e788cb","91d4c2","83b4ce"],"warm-sand":["d9b36a","c2d571","df9391","97b5ce","8e89c7"],"deep-teal":["4fc3b0","7aaecd","97d8a4","c99cac","c29c8f"],"graphite-dark":["4da3ff","6c66e0","88e7dc","d4a691","cec983"],"indigo-violet":["a5a4f0","a967e0","89c3e7","d3c792","aece83"],"spectrum":["8ba0f8","9066e0","88d6e7","d4ba91","bdce83"]};
|
|
1861
1877
|
var GRID = {"columns":12,"gutter":0.16,"colW":0.8644,"x":[0.6,1.6244,2.6488,3.6732,4.6976,5.722,6.7464,7.7708,8.7952,9.8196,10.844,11.8684,12.733],"y":[2.35,3.27,4.19,5.11,6.03,6.9],"safe":{"top":0.4,"bottom":0.4,"left":0.6,"right":0.6}};
|
|
1862
|
-
var TYPO = {"levels":[{"id":"C0","name":"封面/章节幕标题","role":"coverTitle","usage":"封面主标题、章节幕标题"},{"id":"T1","name":"页码/章节徽章","role":"caption","usage":"页码徽章、章节编号"},{"id":"T2","name":"页面主标题/结论标题","role":"h1","usage":"每页顶部结论句(research 行动标题)"},{"id":"T3","name":"副标题/语境说明","role":"lead","usage":"主标题下方导语"},{"id":"T4","name":"模块标题/图表标题","role":"h2","usage":"卡片标题、图表标题、面板标题"},{"id":"T5","name":"证据编号/轻量标签","role":"micro","usage":"Exhibit 编号、状态标签"},{"id":"T6","name":"证据块标题/小节标题","role":"h2","usage":"分栏小标题、证据块标题"},{"id":"T7","name":"正文解释段落","role":"body","usage":"证据解释、管理解读正文、表格正文"},{"id":"T8","name":"结论条文字","role":"body","usage":"
|
|
1878
|
+
var TYPO = {"levels":[{"id":"C0","name":"封面/章节幕标题","role":"coverTitle","usage":"封面主标题、章节幕标题"},{"id":"T1","name":"页码/章节徽章","role":"caption","usage":"页码徽章、章节编号"},{"id":"T2","name":"页面主标题/结论标题","role":"h1","usage":"每页顶部结论句(research 行动标题)"},{"id":"T3","name":"副标题/语境说明","role":"lead","usage":"主标题下方导语"},{"id":"T4","name":"模块标题/图表标题","role":"h2","usage":"卡片标题、图表标题、面板标题"},{"id":"T5","name":"证据编号/轻量标签","role":"micro","usage":"Exhibit 编号、状态标签"},{"id":"T6","name":"证据块标题/小节标题","role":"h2","usage":"分栏小标题、证据块标题"},{"id":"T7","name":"正文解释段落","role":"body","usage":"证据解释、管理解读正文、表格正文"},{"id":"T8","name":"结论条文字","role":"body","usage":"结论条、核心结论框"},{"id":"T9","name":"结论条标签(可选·默认隐藏)","role":"caption","usage":"结论条可选标签(默认不显示)"},{"id":"T10","name":"结论条正文/业务含义","role":"body","usage":"结论条正文、行动含义、表格行动项"},{"id":"T11","name":"图表轴/图例/刻度/微标签","role":"micro","usage":"坐标轴、图例、刻度、单位(禁用于表格正文与完整短句)"},{"id":"T12","name":"图表数据标签","role":"caption","usage":"折线点值、柱形标签、百分比标注"},{"id":"T13","name":"关键 KPI 大数字","role":"h1","usage":"KPI 大数字、hero 数值"},{"id":"T14","name":"注释/口径/来源/页脚","role":"micro","usage":"footnote、来源行、页脚、小页码"}],"tableSemanticRule":{"body":["T7","T10"],"microAllowed":["T11"],"microForbiddenFor":["表格正文","行动项","风险项","解释句","建议句","长项目符号","完整短句"]}};
|
|
1863
1879
|
var CONT = {"pad":{"card":0.18,"panel":0.2,"cell":0.08,"band":0.16,"soWhat":0.16,"kpi":0.18,"chart":0.1,"head":0.05,"footer":0.05,"node":0.06},"minPad":0.06,"textMetrics":{"lineFactor":1.45,"emAsciiRatio":0.52},"overflowRule":"溢出处置优先级(禁静默截断):① 重构承载(列表/卡片/表/图/组合版式)→ ② 拆页/分章(议程→主张→证据卡→明细;01a/01b;信息须完整)→ ③ 换布局形态(V1–V4/多列/卡栅格)→ ④ 有限 fontShrink(阶梯内、模式 floor 以上、最多 4 档)→ ⑤ 禁止:静默截断、砍 so-what/证据/口径、为审美稀疏删决策必需信息。单页字数预算是预警不是删字许可证。","fontShrink":{"ladder":[15,14,13.5,13,12.5,12,11.5,11,10.5,10,9.5,9,8.5],"maxShrinkSteps":4,"floorPt":{"presentation":10,"research":9,"architecture":10},"preferContentFirst":true,"warnBelow":9.5},"continuousTextRule":"语义连续的一句话 / so-what 主句 / 结论句 / 表格单元格正文不得拆成多个独立文本框(避免异常空格、断句、基线漂移);局部加粗高亮必须用同一文本框内富文本。"};
|
|
1864
1880
|
var REG = {"bar":{"html":"svg-bars","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":160}},"hbar":{"html":"svg-hbars","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":100}},"stack":{"html":"svg-stack","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":160},"nativeOpt":{"barGrouping":"stacked"}},"stackline":{"html":"svg-stackline","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":40},"nativeOpt":{"barGrouping":"percentStacked"}},"line":{"html":"svg-line","pptx":"native","nativeType":"line","dataTable":"notes","min":{"vbHeightMin":160}},"dualline":{"html":"svg-dualline","pptx":"native","nativeType":"line","dataTable":"notes","min":{"vbHeightMin":160}},"area":{"html":"svg-area","pptx":"native","nativeType":"area","dataTable":"notes","min":{"vbHeightMin":160}},"donut":{"html":"svg-donut","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":140}},"multidonut":{"html":"svg-mdonut","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":140}},"pie":{"html":"svg-pie","pptx":"native","nativeType":"pie","dataTable":"notes","min":{"pxWidthMin":140}},"radar":{"html":"svg-radar","pptx":"native","nativeType":"radar","dataTable":"notes","min":{"pxWidthMin":220}},"scatter":{"html":"svg-scatter","pptx":"native","nativeType":"scatter","dataTable":"notes","min":{"vbHeightMin":180}},"bubble":{"html":"svg-bubble","pptx":"native","nativeType":"bubble","dataTable":"notes","min":{"vbHeightMin":180}},"waterfall":{"html":"svg-wf","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":170},"nativeTrick":"stacked+hiddenBase+connector"},"gauge":{"html":"svg-gauge","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":180},"nativeTrick":"doughnut+firstSliceAng+hiddenRemainder"},"pareto":{"html":"svg-pareto","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":180},"nativeTrick":"multiType+bar+line"},"gantt":{"html":"svg-gantt","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":130},"path":{"forbidPresetShapes":true}},"vsbar":{"html":"svg-vsbar","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":100},"path":{"forbidPresetShapes":true}},"progress":{"html":"svg-progress","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":100},"path":{"forbidPresetShapes":true}},"sparkline":{"html":"svg-spark","pptx":"shape","dataTable":"off","min":{"vbHeightMin":20},"path":{"forbidPresetShapes":true}},"funnel":{"html":"svg-funnel","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"minSamplePoints":8,"forbidPresetShapes":true}},"treemap":{"html":"svg-treemap","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":170},"path":{"forbidPresetShapes":true}},"marimekko":{"html":"svg-marimekko","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"boxplot":{"html":"svg-boxplot","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}},"network":{"html":"svg-network","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":200},"path":{"forbidPresetShapes":true}},"sankey":{"html":"svg-sankey","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":200},"path":{"minSamplePoints":16,"trackBothEdges":true,"forbidPresetShapes":true}},"streamgraph":{"html":"svg-stream","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":160},"path":{"minSamplePoints":24,"trackBothEdges":true,"forbidPresetShapes":true}},"slope":{"html":"svg-slope","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}},"dumbbell":{"html":"svg-dumbbell","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"lollipop":{"html":"svg-lollipop","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":140},"path":{"forbidPresetShapes":true}},"dotplot":{"html":"svg-dotplot","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":120},"path":{"forbidPresetShapes":true}},"bulletchart":{"html":"svg-bullet","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":140},"path":{"forbidPresetShapes":true}},"waffle":{"html":"svg-waffle","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"radialbar":{"html":"svg-radialbar","pptx":"shape","dataTable":"notes","min":{"pxWidthMin":200},"path":{"minSamplePoints":16,"forbidPresetShapes":true}},"rose":{"html":"svg-rose","pptx":"shape","dataTable":"notes","min":{"pxWidthMin":180},"path":{"minSamplePoints":16,"forbidPresetShapes":true}},"candlestick":{"html":"svg-candle","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}}};
|
|
1865
1881
|
var DEEP = {"triggers":["高保真","1:1","一比一","精确还原","按图还原","正式交付","不能偏移","像素级","严格对照","逐页验收"],"complexCharts":["sankey","streamgraph","treemap","marimekko","boxplot","network","rose","radialbar","candlestick","funnel"],"checks":{"anchors":true,"containerOverflow":true,"renderCompare":true,"manifest":true},"renderCompare":{"engine":"soffice","fallback":"powerpoint-com","skipIfMissing":true,"dpi":96}};
|
|
@@ -2110,7 +2126,7 @@ function fitRowH(avail, n, pref, floor) {
|
|
|
2110
2126
|
function chartBottom(hasSoWhat, hasFootnote) {
|
|
2111
2127
|
/* D8: tightest of soWhat/footnote/contentBottomWithNote — no short-circuit */
|
|
2112
2128
|
var bot = CONTENT_BOTTOM;
|
|
2113
|
-
if (hasSoWhat) bot = Math.min(bot, PT.exhibit.soWhatY - 0.
|
|
2129
|
+
if (hasSoWhat) bot = Math.min(bot, PT.exhibit.soWhatY - 0.20);
|
|
2114
2130
|
if (hasFootnote) bot = Math.min(bot, PT.exhibit.footnoteY - 0.12);
|
|
2115
2131
|
if (hasSoWhat || hasFootnote) bot = Math.min(bot, CONTENT_BOTTOM_NOTE);
|
|
2116
2132
|
return bot;
|
|
@@ -2194,24 +2210,31 @@ function donutWedges(labels, values) {
|
|
|
2194
2210
|
});
|
|
2195
2211
|
return segs;
|
|
2196
2212
|
}
|
|
2197
|
-
function donutChart(sh, ec, S, dcols) {
|
|
2213
|
+
function donutChart(sh, ec, S, dcols, bottomY) {
|
|
2198
2214
|
var d = PT.donut, labels = ec.labels || [], values = ec.values || [];
|
|
2199
2215
|
var segs = donutWedges(labels, values);
|
|
2200
|
-
var
|
|
2216
|
+
var r = d.r;
|
|
2217
|
+
if (bottomY != null && d.centerY + r > bottomY) {
|
|
2218
|
+
r = Math.max(0.9, bottomY - d.centerY - 0.04);
|
|
2219
|
+
}
|
|
2220
|
+
var holeR = d.holeR * (r / d.r);
|
|
2221
|
+
var bx = d.centerX - r, by = d.centerY - r, bw = r * 2;
|
|
2201
2222
|
segs.forEach(function (sg) {
|
|
2202
2223
|
sh.push(shape('pie', bx, by, bw, bw, dcols[sg[2] % dcols.length], { av: pieAv(sg[0], sg[1]) }));
|
|
2203
2224
|
});
|
|
2204
|
-
var hb =
|
|
2205
|
-
sh.push(shape('ellipse', d.centerX -
|
|
2225
|
+
var hb = holeR * 2;
|
|
2226
|
+
sh.push(shape('ellipse', d.centerX - holeR, d.centerY - holeR, hb, hb, S.bg));
|
|
2206
2227
|
var total = 0; values.forEach(function (v) { total += Math.max(0, v); });
|
|
2207
2228
|
var totalStr = (Math.round(total * 10) / 10) + (ec.unit || '');
|
|
2208
|
-
sh.push(txSp(d.centerX -
|
|
2229
|
+
sh.push(txSp(d.centerX - holeR, d.centerY - 0.42, hb, 0.5,
|
|
2209
2230
|
[[{ t: totalStr, sz: 20, b: 1, col: S.ink, font: S.fontDisplay }]], { align: 'ctr', anchor: 'ctr' }));
|
|
2210
|
-
sh.push(txSp(d.centerX -
|
|
2231
|
+
sh.push(txSp(d.centerX - holeR, d.centerY + 0.08, hb, 0.35,
|
|
2211
2232
|
[[{ t: ec.centerLabel || '合计', sz: 9.5, col: S.faint, font: S.font }]], { align: 'ctr', anchor: 'ctr' }));
|
|
2212
2233
|
var n = Math.max(1, labels.length);
|
|
2213
|
-
var
|
|
2234
|
+
var maxLegH = (bottomY != null) ? Math.max(1.2, bottomY - (d.centerY - 1.7)) : 3.4;
|
|
2235
|
+
var rowH = Math.min(d.legendRowH, maxLegH / n, 3.4 / n);
|
|
2214
2236
|
var ly0 = d.centerY - (n * rowH) / 2 + 0.1;
|
|
2237
|
+
if (bottomY != null) ly0 = Math.min(ly0, bottomY - n * rowH - 0.04);
|
|
2215
2238
|
var sum2 = total || 1;
|
|
2216
2239
|
labels.forEach(function (lb, i) {
|
|
2217
2240
|
var v = values[i] || 0;
|
|
@@ -2268,14 +2291,13 @@ function table(x, y, w, colW, rows, S, opts) {
|
|
|
2268
2291
|
function soWhatBar(sh, text, S) {
|
|
2269
2292
|
var R = (typeof regionOf === 'function') ? regionOf('exhibit', 'annotation')
|
|
2270
2293
|
: { x: MX, y: PT.exhibit.soWhatY, w: CW, h: 0.62 };
|
|
2271
|
-
/*
|
|
2272
|
-
var bodyW = Math.max(2.5, R.w - 0.44
|
|
2273
|
-
var fzB = fitFont([String(text || '')], bodyW, R.h - 0.14, { max:
|
|
2294
|
+
/* MD3 结论条:衬底 + 左 accent 轨 + 正文(不绘制「SO WHAT」标签字样) */
|
|
2295
|
+
var bodyW = Math.max(2.5, R.w - 0.44);
|
|
2296
|
+
var fzB = fitFont([String(text || '')], bodyW, R.h - 0.14, { max: 14, gapFactor: 0.2, maxShrinkSteps: 3 });
|
|
2274
2297
|
sh.push(shape('rect', R.x, R.y, R.w, R.h, S.soft));
|
|
2275
2298
|
sh.push(shape('rect', R.x, R.y, 0.06, R.h, S.accent));
|
|
2276
2299
|
sh.push(txSp(R.x + 0.22, R.y + 0.06, R.w - 0.44, R.h - 0.12,
|
|
2277
|
-
[[{ t:
|
|
2278
|
-
{ t: text, sz: fzB, col: S.ink, font: S.font }]], { anchor: 'ctr' }));
|
|
2300
|
+
[[{ t: String(text || ''), sz: fzB, b: 1, col: S.ink, font: S.font }]], { anchor: 'ctr' }));
|
|
2279
2301
|
}
|
|
2280
2302
|
function footnoteLine(sh, text, S) {
|
|
2281
2303
|
var R = (typeof regionOf === 'function') ? regionOf('exhibit', 'footnote')
|
|
@@ -3135,7 +3157,7 @@ function slidesOf(model, S) {
|
|
|
3135
3157
|
if (img.caption) sh.push(txSp(MX, capYImg + 0.04, CW, capH2, [[{ t: img.caption, sz: 10.5, col: S.faint, font: S.font }]]));
|
|
3136
3158
|
} else if (type === 'donut') {
|
|
3137
3159
|
var dcn = sec.chart || {};
|
|
3138
|
-
if (dcn.labels && dcn.values) donutChart(sh, dcn, S, dcn.colors || donutColors(model.style, S, model.theme));
|
|
3160
|
+
if (dcn.labels && dcn.values) donutChart(sh, dcn, S, dcn.colors || donutColors(model.style, S, model.theme), bodyBottom);
|
|
3139
3161
|
if (sec.note) sh.push(txSp(MX, PT.note.y, CW, PT.note.h, [[{ t: sec.note, sz: 11, col: S.faint, font: S.font }]]));
|
|
3140
3162
|
} else if (type === 'heatmap') {
|
|
3141
3163
|
var H = PT.heatmap;
|
|
@@ -3288,10 +3310,27 @@ function slidesOf(model, S) {
|
|
|
3288
3310
|
var bRR = regOf('bar', isHBar ? 'hbar' : 'primary', { bottom: botY }) ||
|
|
3289
3311
|
{ x: isHBar ? MX : MX + PT.bar.chartX, y: isHBar ? PT.bar.hbarY0 : PT.bar.chartY,
|
|
3290
3312
|
w: isHBar ? CW : CW - PT.bar.chartW, h: 3 };
|
|
3313
|
+
var ptsB = (sec.points || []).filter(Boolean);
|
|
3314
|
+
var bx = bRR.x, bw = bRR.w;
|
|
3315
|
+
if (ptsB.length && !isHBar) {
|
|
3316
|
+
var sideW = Math.min(3.6, Math.max(2.6, bRR.w * 0.30));
|
|
3317
|
+
bw = Math.max(3.2, bRR.w - sideW - 0.28);
|
|
3318
|
+
var sx = bRR.x + bw + 0.28;
|
|
3319
|
+
var rowHb = Math.min(0.72, (bRR.h - 0.1) / Math.max(1, ptsB.length));
|
|
3320
|
+
ptsB.slice(0, 6).forEach(function (p, i) {
|
|
3321
|
+
var k = Array.isArray(p) ? String(p[0] || '') : String((p && p.t) || '');
|
|
3322
|
+
var v = Array.isArray(p) ? String(p[1] || '') : String((p && p.d) || '');
|
|
3323
|
+
var y = bRR.y + i * rowHb;
|
|
3324
|
+
sh.push(shape('rect', sx, y + 0.12, 0.08, 0.08, S.accent));
|
|
3325
|
+
sh.push(txSp(sx + 0.2, y, sideW - 0.25, rowHb,
|
|
3326
|
+
[[{ t: k + (v ? ' ' : ''), sz: 12, b: 1, col: S.ink, font: S.font },
|
|
3327
|
+
{ t: v, sz: 11, col: S.body, font: S.font }]], { anchor: 'ctr' }));
|
|
3328
|
+
});
|
|
3329
|
+
}
|
|
3291
3330
|
if (isHBar) {
|
|
3292
|
-
chartBlockShapes(sh, ch, S,
|
|
3331
|
+
chartBlockShapes(sh, ch, S, bx, bRR.y, bw, bRR.h, dcols2);
|
|
3293
3332
|
} else {
|
|
3294
|
-
chartBlockShapes(sh, ch, S,
|
|
3333
|
+
chartBlockShapes(sh, ch, S, bx, bRR.y, bw, Math.max(1.5, bRR.h), dcols2);
|
|
3295
3334
|
}
|
|
3296
3335
|
if (sec.note) sh.push(txSp(MX, PT.note.y, CW, PT.note.h, [[{ t: sec.note, sz: 11, col: S.faint, font: S.font }]]));
|
|
3297
3336
|
} else if (type === 'twocol' || type === 'threecol') {
|
|
@@ -237,7 +237,8 @@ section.band{scroll-snap-align:start}
|
|
|
237
237
|
svh 兼容移动端浏览器工具栏;旧浏览器落到 100vh。 */
|
|
238
238
|
.band{padding-block:var(--band-pad);min-height:var(--band-min);
|
|
239
239
|
display:flex;flex-direction:column;justify-content:center}
|
|
240
|
-
.band>.wrap{width:100
|
|
240
|
+
.band>.wrap{width:100%;min-height:0}
|
|
241
|
+
.band>.wrap>.grid,.band>.wrap>.stack,.band>.wrap>.fig,.band>.wrap>.cols-2,.band>.wrap>.cols-3,.band>.wrap>.exhibit{min-height:0}
|
|
241
242
|
.band--top{justify-content:flex-start} /* 内容约六七成屏:贴顶 + 底部自然留白 */
|
|
242
243
|
.band--fit{justify-content:center} /* 内容接近一屏:垂直居中(默认行为,保留以兼容旧报告) */
|
|
243
244
|
.band--flow{min-height:0;justify-content:flex-start} /* 长内容页(附录/全量参考)显式退出固定页高 */
|
|
@@ -478,6 +479,21 @@ tbody tr:hover{background:var(--surface-1)}
|
|
|
478
479
|
td strong{color:var(--text);font-weight:600}
|
|
479
480
|
td.k{color:var(--text);font-weight:500;white-space:nowrap}
|
|
480
481
|
td.num{font-variant-numeric:tabular-nums}
|
|
482
|
+
/* ── 结论条(MD3 tonal strip · 本页重点收口;默认不显示「So what」标签) ──
|
|
483
|
+
与上方主内容呼吸间距 ≥ --sp-6;flex:none 防止被主内容挤压;一屏页不得压进注释带。 */
|
|
484
|
+
.band>.wrap:has(>.sowhat),.band>.wrap:has(>.note){display:flex;flex-direction:column}
|
|
485
|
+
.sowhat{display:flex;align-items:flex-start;gap:var(--sp-3);flex:none;
|
|
486
|
+
margin-top:clamp(28px,3.6vh,48px); /* ≥ --sp-6 量级,修「贴底」 */
|
|
487
|
+
padding:var(--sp-4) var(--sp-5);background:var(--accent-soft);border:1px solid var(--accent-soft-2);
|
|
488
|
+
border-left:4px solid var(--accent);border-radius:var(--r-md);max-width:100%}
|
|
489
|
+
.sowhat__k{display:none}
|
|
490
|
+
.sowhat--labeled .sowhat__k{display:inline;font-size:var(--fs-xs);font-weight:700;letter-spacing:.1em;
|
|
491
|
+
text-transform:uppercase;color:var(--accent-text);white-space:nowrap;flex:none;padding-top:.15em}
|
|
492
|
+
.sowhat__v,.sowhat>:not(.sowhat__k){font-size:var(--fs-h3);color:var(--text);font-weight:var(--fw-title);
|
|
493
|
+
line-height:1.55;flex:1;min-width:0}
|
|
494
|
+
.sowhat__v p,.sowhat__stack{margin:0}
|
|
495
|
+
.sowhat__stack{display:flex;flex-direction:column;gap:var(--sp-2)}
|
|
496
|
+
|
|
481
497
|
.note{display:flex;gap:var(--sp-4);padding:clamp(20px,2vw,28px);border-radius:var(--r-lg);
|
|
482
498
|
background:var(--accent-soft);border-left:3px solid var(--accent)}
|
|
483
499
|
.note__ico{width:26px;height:26px;flex:none;border-radius:50%;background:var(--accent);
|
|
@@ -261,7 +261,8 @@ section.band{scroll-snap-align:start}
|
|
|
261
261
|
svh 兼容移动端浏览器工具栏;旧浏览器落到 100vh。 */
|
|
262
262
|
.band{padding-block:var(--band-pad);min-height:var(--band-min);
|
|
263
263
|
display:flex;flex-direction:column;justify-content:center}
|
|
264
|
-
.band>.wrap{width:100
|
|
264
|
+
.band>.wrap{width:100%;min-height:0}
|
|
265
|
+
.band>.wrap>.grid,.band>.wrap>.stack,.band>.wrap>.fig,.band>.wrap>.cols-2,.band>.wrap>.cols-3,.band>.wrap>.exhibit{min-height:0}
|
|
265
266
|
.band--top{justify-content:flex-start} /* 内容约六七成屏:贴顶 + 底部自然留白 */
|
|
266
267
|
.band--fit{justify-content:center} /* 内容接近一屏:垂直居中(默认行为,保留以兼容旧报告) */
|
|
267
268
|
.band--flow{min-height:0;justify-content:flex-start} /* 长内容页(附录/全量参考)显式退出固定页高 */
|
|
@@ -502,6 +503,21 @@ tbody tr:hover{background:var(--surface-1)}
|
|
|
502
503
|
td strong{color:var(--text);font-weight:600}
|
|
503
504
|
td.k{color:var(--text);font-weight:500;white-space:nowrap}
|
|
504
505
|
td.num{font-variant-numeric:tabular-nums}
|
|
506
|
+
/* ── 结论条(MD3 tonal strip · 本页重点收口;默认不显示「So what」标签) ──
|
|
507
|
+
与上方主内容呼吸间距 ≥ --sp-6;flex:none 防止被主内容挤压;一屏页不得压进注释带。 */
|
|
508
|
+
.band>.wrap:has(>.sowhat),.band>.wrap:has(>.note){display:flex;flex-direction:column}
|
|
509
|
+
.sowhat{display:flex;align-items:flex-start;gap:var(--sp-3);flex:none;
|
|
510
|
+
margin-top:clamp(28px,3.6vh,48px); /* ≥ --sp-6 量级,修「贴底」 */
|
|
511
|
+
padding:var(--sp-4) var(--sp-5);background:var(--accent-soft);border:1px solid var(--accent-soft-2);
|
|
512
|
+
border-left:4px solid var(--accent);border-radius:var(--r-md);max-width:100%}
|
|
513
|
+
.sowhat__k{display:none}
|
|
514
|
+
.sowhat--labeled .sowhat__k{display:inline;font-size:var(--fs-xs);font-weight:700;letter-spacing:.1em;
|
|
515
|
+
text-transform:uppercase;color:var(--accent-text);white-space:nowrap;flex:none;padding-top:.15em}
|
|
516
|
+
.sowhat__v,.sowhat>:not(.sowhat__k){font-size:var(--fs-h3);color:var(--text);font-weight:var(--fw-title);
|
|
517
|
+
line-height:1.55;flex:1;min-width:0}
|
|
518
|
+
.sowhat__v p,.sowhat__stack{margin:0}
|
|
519
|
+
.sowhat__stack{display:flex;flex-direction:column;gap:var(--sp-2)}
|
|
520
|
+
|
|
505
521
|
.note{display:flex;gap:var(--sp-4);padding:clamp(20px,2vw,28px);border-radius:var(--r-lg);
|
|
506
522
|
background:var(--accent-soft);border-left:3px solid var(--accent)}
|
|
507
523
|
.note__ico{width:26px;height:26px;flex:none;border-radius:50%;background:var(--accent);
|
|
@@ -1504,7 +1520,7 @@ if(e.isIntersecting){e.target.classList.add('in');o.unobserve(e.target)}})},
|
|
|
1504
1520
|
var PROMPT=[
|
|
1505
1521
|
'请为这份 HTML 报告生成可编辑 PPTX 并交付:',
|
|
1506
1522
|
'1) 阅读 references/pptx-export.md 与 references/modes.md(三模式独立规则);',
|
|
1507
|
-
'2) 核对/补全 window.REPORT_MODEL 为与正文严格一致的内容(含 mode/style/theme/title/agenda/sections/closing;theme 为 light 或 dark、与页面 data-theme 一致——PPTX 按此导出亮色版或深色版;29 种页型字段与 30 类 chart.type 见 scripts/model-schema.json;research 关键图表页用 type:"exhibit" 并填 exhibitNo/soWhat/footnote);',
|
|
1523
|
+
'2) 核对/补全 window.REPORT_MODEL 为与正文严格一致的内容(含 mode/style/theme/title/agenda/sections/closing;theme 为 light 或 dark、与页面 data-theme 一致——PPTX 按此导出亮色版或深色版;29 种页型字段与 30 类 chart.type 见 scripts/model-schema.json;research 关键图表页用 type:"exhibit" 并填 exhibitNo/soWhat(结论条)/footnote);',
|
|
1508
1524
|
'3) 运行 python scripts/validate_report.py <报告.html> 直到全 PASS(含模型一致性检查);',
|
|
1509
1525
|
'4) 智能体精导并质检(0/0 才交付):python scripts/extract_model.py <报告.html> → NODE_PATH=<pptxgenjs 所在 node_modules> node scripts/build_pptx.js <报告.pptx> --model=<报告.model.json>(如需覆盖模型主题可加 --theme=light|dark) → python scripts/validate_pptx.py <报告.pptx> --strict --model=<报告.model.json>。',
|
|
1510
1526
|
'报告文件:<请填写报告.html 的路径>'
|
|
@@ -1788,7 +1804,7 @@ window.REPORT_MODEL = {
|
|
|
1788
1804
|
|
|
1789
1805
|
/* __TOPPPT_RUNTIME_START__ */
|
|
1790
1806
|
/* ══ PPTX 导出运行时(assets/pptx-export.js 的内联副本 · 由 scripts/sync_runtime.py 注入,禁止手改) ══ */
|
|
1791
|
-
/* __TOPPPT_RUNTIME_SHA__:
|
|
1807
|
+
/* __TOPPPT_RUNTIME_SHA__:f4dc2ab366ea79c4 */
|
|
1792
1808
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
1793
1809
|
* TopPPT HTML· 浏览器端 PPTX 预览运行时
|
|
1794
1810
|
* 零依赖、随报告单文件分发;OOXML 序列化器(仅供预览,页面不导出文件)。
|
|
@@ -1869,7 +1885,7 @@ var PRESETS_DARK = {
|
|
|
1869
1885
|
var STYLE_DATA_COLORS = {"business-blue":["1a73e8","3526bb","21a199","b77148","99983d"],"apple-mono":["1d1d1f","0071e3","0f7b6c","c2410c","7c3aed"],"mckinsey":["003a70","2826bb","21a18e","b76848","99903d"],"brand-red":["d0021b","bb6326","d634ae","40a182","438aa8"],"warm-sand":["96681f","839324","cf3b3e","4d88b2","4a47a4"],"deep-teal":["0f6b5c","2683bb","22aa3e","b74870","a85c43"],"graphite-dark":["0369a1","2637bb","1f9977","b75948","a18a40"],"indigo-violet":["5b5bd6","7432ae","4197c8","a08f4b","7ca04b"],"spectrum":["4563ef","5b26bb","269ebb","af8746","83993d"]};
|
|
1870
1886
|
var STYLE_DATA_COLORS_DARK = {"business-blue":["8ab4f8","7966e0","88e7e5","d4ad91","cbce83"],"apple-mono":["f5f5f7","2997ff","2dd4bf","ff9f0a","bf5af2"],"mckinsey":["7fb2e5","6f6bdb","8ce3d8","d1a694","cbc586"],"brand-red":["ff5a66","e09e66","e788cb","91d4c2","83b4ce"],"warm-sand":["d9b36a","c2d571","df9391","97b5ce","8e89c7"],"deep-teal":["4fc3b0","7aaecd","97d8a4","c99cac","c29c8f"],"graphite-dark":["4da3ff","6c66e0","88e7dc","d4a691","cec983"],"indigo-violet":["a5a4f0","a967e0","89c3e7","d3c792","aece83"],"spectrum":["8ba0f8","9066e0","88d6e7","d4ba91","bdce83"]};
|
|
1871
1887
|
var GRID = {"columns":12,"gutter":0.16,"colW":0.8644,"x":[0.6,1.6244,2.6488,3.6732,4.6976,5.722,6.7464,7.7708,8.7952,9.8196,10.844,11.8684,12.733],"y":[2.35,3.27,4.19,5.11,6.03,6.9],"safe":{"top":0.4,"bottom":0.4,"left":0.6,"right":0.6}};
|
|
1872
|
-
var TYPO = {"levels":[{"id":"C0","name":"封面/章节幕标题","role":"coverTitle","usage":"封面主标题、章节幕标题"},{"id":"T1","name":"页码/章节徽章","role":"caption","usage":"页码徽章、章节编号"},{"id":"T2","name":"页面主标题/结论标题","role":"h1","usage":"每页顶部结论句(research 行动标题)"},{"id":"T3","name":"副标题/语境说明","role":"lead","usage":"主标题下方导语"},{"id":"T4","name":"模块标题/图表标题","role":"h2","usage":"卡片标题、图表标题、面板标题"},{"id":"T5","name":"证据编号/轻量标签","role":"micro","usage":"Exhibit 编号、状态标签"},{"id":"T6","name":"证据块标题/小节标题","role":"h2","usage":"分栏小标题、证据块标题"},{"id":"T7","name":"正文解释段落","role":"body","usage":"证据解释、管理解读正文、表格正文"},{"id":"T8","name":"结论条文字","role":"body","usage":"
|
|
1888
|
+
var TYPO = {"levels":[{"id":"C0","name":"封面/章节幕标题","role":"coverTitle","usage":"封面主标题、章节幕标题"},{"id":"T1","name":"页码/章节徽章","role":"caption","usage":"页码徽章、章节编号"},{"id":"T2","name":"页面主标题/结论标题","role":"h1","usage":"每页顶部结论句(research 行动标题)"},{"id":"T3","name":"副标题/语境说明","role":"lead","usage":"主标题下方导语"},{"id":"T4","name":"模块标题/图表标题","role":"h2","usage":"卡片标题、图表标题、面板标题"},{"id":"T5","name":"证据编号/轻量标签","role":"micro","usage":"Exhibit 编号、状态标签"},{"id":"T6","name":"证据块标题/小节标题","role":"h2","usage":"分栏小标题、证据块标题"},{"id":"T7","name":"正文解释段落","role":"body","usage":"证据解释、管理解读正文、表格正文"},{"id":"T8","name":"结论条文字","role":"body","usage":"结论条、核心结论框"},{"id":"T9","name":"结论条标签(可选·默认隐藏)","role":"caption","usage":"结论条可选标签(默认不显示)"},{"id":"T10","name":"结论条正文/业务含义","role":"body","usage":"结论条正文、行动含义、表格行动项"},{"id":"T11","name":"图表轴/图例/刻度/微标签","role":"micro","usage":"坐标轴、图例、刻度、单位(禁用于表格正文与完整短句)"},{"id":"T12","name":"图表数据标签","role":"caption","usage":"折线点值、柱形标签、百分比标注"},{"id":"T13","name":"关键 KPI 大数字","role":"h1","usage":"KPI 大数字、hero 数值"},{"id":"T14","name":"注释/口径/来源/页脚","role":"micro","usage":"footnote、来源行、页脚、小页码"}],"tableSemanticRule":{"body":["T7","T10"],"microAllowed":["T11"],"microForbiddenFor":["表格正文","行动项","风险项","解释句","建议句","长项目符号","完整短句"]}};
|
|
1873
1889
|
var CONT = {"pad":{"card":0.18,"panel":0.2,"cell":0.08,"band":0.16,"soWhat":0.16,"kpi":0.18,"chart":0.1,"head":0.05,"footer":0.05,"node":0.06},"minPad":0.06,"textMetrics":{"lineFactor":1.45,"emAsciiRatio":0.52},"overflowRule":"溢出处置优先级(禁静默截断):① 重构承载(列表/卡片/表/图/组合版式)→ ② 拆页/分章(议程→主张→证据卡→明细;01a/01b;信息须完整)→ ③ 换布局形态(V1–V4/多列/卡栅格)→ ④ 有限 fontShrink(阶梯内、模式 floor 以上、最多 4 档)→ ⑤ 禁止:静默截断、砍 so-what/证据/口径、为审美稀疏删决策必需信息。单页字数预算是预警不是删字许可证。","fontShrink":{"ladder":[15,14,13.5,13,12.5,12,11.5,11,10.5,10,9.5,9,8.5],"maxShrinkSteps":4,"floorPt":{"presentation":10,"research":9,"architecture":10},"preferContentFirst":true,"warnBelow":9.5},"continuousTextRule":"语义连续的一句话 / so-what 主句 / 结论句 / 表格单元格正文不得拆成多个独立文本框(避免异常空格、断句、基线漂移);局部加粗高亮必须用同一文本框内富文本。"};
|
|
1874
1890
|
var REG = {"bar":{"html":"svg-bars","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":160}},"hbar":{"html":"svg-hbars","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":100}},"stack":{"html":"svg-stack","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":160},"nativeOpt":{"barGrouping":"stacked"}},"stackline":{"html":"svg-stackline","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":40},"nativeOpt":{"barGrouping":"percentStacked"}},"line":{"html":"svg-line","pptx":"native","nativeType":"line","dataTable":"notes","min":{"vbHeightMin":160}},"dualline":{"html":"svg-dualline","pptx":"native","nativeType":"line","dataTable":"notes","min":{"vbHeightMin":160}},"area":{"html":"svg-area","pptx":"native","nativeType":"area","dataTable":"notes","min":{"vbHeightMin":160}},"donut":{"html":"svg-donut","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":140}},"multidonut":{"html":"svg-mdonut","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":140}},"pie":{"html":"svg-pie","pptx":"native","nativeType":"pie","dataTable":"notes","min":{"pxWidthMin":140}},"radar":{"html":"svg-radar","pptx":"native","nativeType":"radar","dataTable":"notes","min":{"pxWidthMin":220}},"scatter":{"html":"svg-scatter","pptx":"native","nativeType":"scatter","dataTable":"notes","min":{"vbHeightMin":180}},"bubble":{"html":"svg-bubble","pptx":"native","nativeType":"bubble","dataTable":"notes","min":{"vbHeightMin":180}},"waterfall":{"html":"svg-wf","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":170},"nativeTrick":"stacked+hiddenBase+connector"},"gauge":{"html":"svg-gauge","pptx":"native","nativeType":"doughnut","dataTable":"notes","min":{"pxWidthMin":180},"nativeTrick":"doughnut+firstSliceAng+hiddenRemainder"},"pareto":{"html":"svg-pareto","pptx":"native","nativeType":"bar","dataTable":"notes","min":{"vbHeightMin":180},"nativeTrick":"multiType+bar+line"},"gantt":{"html":"svg-gantt","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":130},"path":{"forbidPresetShapes":true}},"vsbar":{"html":"svg-vsbar","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":100},"path":{"forbidPresetShapes":true}},"progress":{"html":"svg-progress","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":100},"path":{"forbidPresetShapes":true}},"sparkline":{"html":"svg-spark","pptx":"shape","dataTable":"off","min":{"vbHeightMin":20},"path":{"forbidPresetShapes":true}},"funnel":{"html":"svg-funnel","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"minSamplePoints":8,"forbidPresetShapes":true}},"treemap":{"html":"svg-treemap","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":170},"path":{"forbidPresetShapes":true}},"marimekko":{"html":"svg-marimekko","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"boxplot":{"html":"svg-boxplot","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}},"network":{"html":"svg-network","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":200},"path":{"forbidPresetShapes":true}},"sankey":{"html":"svg-sankey","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":200},"path":{"minSamplePoints":16,"trackBothEdges":true,"forbidPresetShapes":true}},"streamgraph":{"html":"svg-stream","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":160},"path":{"minSamplePoints":24,"trackBothEdges":true,"forbidPresetShapes":true}},"slope":{"html":"svg-slope","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}},"dumbbell":{"html":"svg-dumbbell","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"lollipop":{"html":"svg-lollipop","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":140},"path":{"forbidPresetShapes":true}},"dotplot":{"html":"svg-dotplot","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":120},"path":{"forbidPresetShapes":true}},"bulletchart":{"html":"svg-bullet","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":140},"path":{"forbidPresetShapes":true}},"waffle":{"html":"svg-waffle","pptx":"shape","dataTable":"notes","min":{"vbHeightMin":160},"path":{"forbidPresetShapes":true}},"radialbar":{"html":"svg-radialbar","pptx":"shape","dataTable":"notes","min":{"pxWidthMin":200},"path":{"minSamplePoints":16,"forbidPresetShapes":true}},"rose":{"html":"svg-rose","pptx":"shape","dataTable":"notes","min":{"pxWidthMin":180},"path":{"minSamplePoints":16,"forbidPresetShapes":true}},"candlestick":{"html":"svg-candle","pptx":"shape","dataTable":"appendix","min":{"vbHeightMin":180},"path":{"forbidPresetShapes":true}}};
|
|
1875
1891
|
var DEEP = {"triggers":["高保真","1:1","一比一","精确还原","按图还原","正式交付","不能偏移","像素级","严格对照","逐页验收"],"complexCharts":["sankey","streamgraph","treemap","marimekko","boxplot","network","rose","radialbar","candlestick","funnel"],"checks":{"anchors":true,"containerOverflow":true,"renderCompare":true,"manifest":true},"renderCompare":{"engine":"soffice","fallback":"powerpoint-com","skipIfMissing":true,"dpi":96}};
|
|
@@ -2120,7 +2136,7 @@ function fitRowH(avail, n, pref, floor) {
|
|
|
2120
2136
|
function chartBottom(hasSoWhat, hasFootnote) {
|
|
2121
2137
|
/* D8: tightest of soWhat/footnote/contentBottomWithNote — no short-circuit */
|
|
2122
2138
|
var bot = CONTENT_BOTTOM;
|
|
2123
|
-
if (hasSoWhat) bot = Math.min(bot, PT.exhibit.soWhatY - 0.
|
|
2139
|
+
if (hasSoWhat) bot = Math.min(bot, PT.exhibit.soWhatY - 0.20);
|
|
2124
2140
|
if (hasFootnote) bot = Math.min(bot, PT.exhibit.footnoteY - 0.12);
|
|
2125
2141
|
if (hasSoWhat || hasFootnote) bot = Math.min(bot, CONTENT_BOTTOM_NOTE);
|
|
2126
2142
|
return bot;
|
|
@@ -2204,24 +2220,31 @@ function donutWedges(labels, values) {
|
|
|
2204
2220
|
});
|
|
2205
2221
|
return segs;
|
|
2206
2222
|
}
|
|
2207
|
-
function donutChart(sh, ec, S, dcols) {
|
|
2223
|
+
function donutChart(sh, ec, S, dcols, bottomY) {
|
|
2208
2224
|
var d = PT.donut, labels = ec.labels || [], values = ec.values || [];
|
|
2209
2225
|
var segs = donutWedges(labels, values);
|
|
2210
|
-
var
|
|
2226
|
+
var r = d.r;
|
|
2227
|
+
if (bottomY != null && d.centerY + r > bottomY) {
|
|
2228
|
+
r = Math.max(0.9, bottomY - d.centerY - 0.04);
|
|
2229
|
+
}
|
|
2230
|
+
var holeR = d.holeR * (r / d.r);
|
|
2231
|
+
var bx = d.centerX - r, by = d.centerY - r, bw = r * 2;
|
|
2211
2232
|
segs.forEach(function (sg) {
|
|
2212
2233
|
sh.push(shape('pie', bx, by, bw, bw, dcols[sg[2] % dcols.length], { av: pieAv(sg[0], sg[1]) }));
|
|
2213
2234
|
});
|
|
2214
|
-
var hb =
|
|
2215
|
-
sh.push(shape('ellipse', d.centerX -
|
|
2235
|
+
var hb = holeR * 2;
|
|
2236
|
+
sh.push(shape('ellipse', d.centerX - holeR, d.centerY - holeR, hb, hb, S.bg));
|
|
2216
2237
|
var total = 0; values.forEach(function (v) { total += Math.max(0, v); });
|
|
2217
2238
|
var totalStr = (Math.round(total * 10) / 10) + (ec.unit || '');
|
|
2218
|
-
sh.push(txSp(d.centerX -
|
|
2239
|
+
sh.push(txSp(d.centerX - holeR, d.centerY - 0.42, hb, 0.5,
|
|
2219
2240
|
[[{ t: totalStr, sz: 20, b: 1, col: S.ink, font: S.fontDisplay }]], { align: 'ctr', anchor: 'ctr' }));
|
|
2220
|
-
sh.push(txSp(d.centerX -
|
|
2241
|
+
sh.push(txSp(d.centerX - holeR, d.centerY + 0.08, hb, 0.35,
|
|
2221
2242
|
[[{ t: ec.centerLabel || '合计', sz: 9.5, col: S.faint, font: S.font }]], { align: 'ctr', anchor: 'ctr' }));
|
|
2222
2243
|
var n = Math.max(1, labels.length);
|
|
2223
|
-
var
|
|
2244
|
+
var maxLegH = (bottomY != null) ? Math.max(1.2, bottomY - (d.centerY - 1.7)) : 3.4;
|
|
2245
|
+
var rowH = Math.min(d.legendRowH, maxLegH / n, 3.4 / n);
|
|
2224
2246
|
var ly0 = d.centerY - (n * rowH) / 2 + 0.1;
|
|
2247
|
+
if (bottomY != null) ly0 = Math.min(ly0, bottomY - n * rowH - 0.04);
|
|
2225
2248
|
var sum2 = total || 1;
|
|
2226
2249
|
labels.forEach(function (lb, i) {
|
|
2227
2250
|
var v = values[i] || 0;
|
|
@@ -2278,14 +2301,13 @@ function table(x, y, w, colW, rows, S, opts) {
|
|
|
2278
2301
|
function soWhatBar(sh, text, S) {
|
|
2279
2302
|
var R = (typeof regionOf === 'function') ? regionOf('exhibit', 'annotation')
|
|
2280
2303
|
: { x: MX, y: PT.exhibit.soWhatY, w: CW, h: 0.62 };
|
|
2281
|
-
/*
|
|
2282
|
-
var bodyW = Math.max(2.5, R.w - 0.44
|
|
2283
|
-
var fzB = fitFont([String(text || '')], bodyW, R.h - 0.14, { max:
|
|
2304
|
+
/* MD3 结论条:衬底 + 左 accent 轨 + 正文(不绘制「SO WHAT」标签字样) */
|
|
2305
|
+
var bodyW = Math.max(2.5, R.w - 0.44);
|
|
2306
|
+
var fzB = fitFont([String(text || '')], bodyW, R.h - 0.14, { max: 14, gapFactor: 0.2, maxShrinkSteps: 3 });
|
|
2284
2307
|
sh.push(shape('rect', R.x, R.y, R.w, R.h, S.soft));
|
|
2285
2308
|
sh.push(shape('rect', R.x, R.y, 0.06, R.h, S.accent));
|
|
2286
2309
|
sh.push(txSp(R.x + 0.22, R.y + 0.06, R.w - 0.44, R.h - 0.12,
|
|
2287
|
-
[[{ t:
|
|
2288
|
-
{ t: text, sz: fzB, col: S.ink, font: S.font }]], { anchor: 'ctr' }));
|
|
2310
|
+
[[{ t: String(text || ''), sz: fzB, b: 1, col: S.ink, font: S.font }]], { anchor: 'ctr' }));
|
|
2289
2311
|
}
|
|
2290
2312
|
function footnoteLine(sh, text, S) {
|
|
2291
2313
|
var R = (typeof regionOf === 'function') ? regionOf('exhibit', 'footnote')
|
|
@@ -3145,7 +3167,7 @@ function slidesOf(model, S) {
|
|
|
3145
3167
|
if (img.caption) sh.push(txSp(MX, capYImg + 0.04, CW, capH2, [[{ t: img.caption, sz: 10.5, col: S.faint, font: S.font }]]));
|
|
3146
3168
|
} else if (type === 'donut') {
|
|
3147
3169
|
var dcn = sec.chart || {};
|
|
3148
|
-
if (dcn.labels && dcn.values) donutChart(sh, dcn, S, dcn.colors || donutColors(model.style, S, model.theme));
|
|
3170
|
+
if (dcn.labels && dcn.values) donutChart(sh, dcn, S, dcn.colors || donutColors(model.style, S, model.theme), bodyBottom);
|
|
3149
3171
|
if (sec.note) sh.push(txSp(MX, PT.note.y, CW, PT.note.h, [[{ t: sec.note, sz: 11, col: S.faint, font: S.font }]]));
|
|
3150
3172
|
} else if (type === 'heatmap') {
|
|
3151
3173
|
var H = PT.heatmap;
|
|
@@ -3298,10 +3320,27 @@ function slidesOf(model, S) {
|
|
|
3298
3320
|
var bRR = regOf('bar', isHBar ? 'hbar' : 'primary', { bottom: botY }) ||
|
|
3299
3321
|
{ x: isHBar ? MX : MX + PT.bar.chartX, y: isHBar ? PT.bar.hbarY0 : PT.bar.chartY,
|
|
3300
3322
|
w: isHBar ? CW : CW - PT.bar.chartW, h: 3 };
|
|
3323
|
+
var ptsB = (sec.points || []).filter(Boolean);
|
|
3324
|
+
var bx = bRR.x, bw = bRR.w;
|
|
3325
|
+
if (ptsB.length && !isHBar) {
|
|
3326
|
+
var sideW = Math.min(3.6, Math.max(2.6, bRR.w * 0.30));
|
|
3327
|
+
bw = Math.max(3.2, bRR.w - sideW - 0.28);
|
|
3328
|
+
var sx = bRR.x + bw + 0.28;
|
|
3329
|
+
var rowHb = Math.min(0.72, (bRR.h - 0.1) / Math.max(1, ptsB.length));
|
|
3330
|
+
ptsB.slice(0, 6).forEach(function (p, i) {
|
|
3331
|
+
var k = Array.isArray(p) ? String(p[0] || '') : String((p && p.t) || '');
|
|
3332
|
+
var v = Array.isArray(p) ? String(p[1] || '') : String((p && p.d) || '');
|
|
3333
|
+
var y = bRR.y + i * rowHb;
|
|
3334
|
+
sh.push(shape('rect', sx, y + 0.12, 0.08, 0.08, S.accent));
|
|
3335
|
+
sh.push(txSp(sx + 0.2, y, sideW - 0.25, rowHb,
|
|
3336
|
+
[[{ t: k + (v ? ' ' : ''), sz: 12, b: 1, col: S.ink, font: S.font },
|
|
3337
|
+
{ t: v, sz: 11, col: S.body, font: S.font }]], { anchor: 'ctr' }));
|
|
3338
|
+
});
|
|
3339
|
+
}
|
|
3301
3340
|
if (isHBar) {
|
|
3302
|
-
chartBlockShapes(sh, ch, S,
|
|
3341
|
+
chartBlockShapes(sh, ch, S, bx, bRR.y, bw, bRR.h, dcols2);
|
|
3303
3342
|
} else {
|
|
3304
|
-
chartBlockShapes(sh, ch, S,
|
|
3343
|
+
chartBlockShapes(sh, ch, S, bx, bRR.y, bw, Math.max(1.5, bRR.h), dcols2);
|
|
3305
3344
|
}
|
|
3306
3345
|
if (sec.note) sh.push(txSp(MX, PT.note.y, CW, PT.note.h, [[{ t: sec.note, sz: 11, col: S.faint, font: S.font }]]));
|
|
3307
3346
|
} else if (type === 'twocol' || type === 'threecol') {
|