dsh-ppt-studio 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +480 -0
  3. package/agent-presets/ppt/agent.cordis.yml +308 -0
  4. package/agent-presets/ppt/preset.yml +3 -0
  5. package/cordis.patch.yml +29 -0
  6. package/docs/00-/350/256/276/350/256/241/346/272/220.md +537 -0
  7. package/docs/01-/351/234/200/346/261/202/344/270/216/347/233/256/346/240/207.md +136 -0
  8. package/docs/02-/346/212/200/346/234/257/346/212/245/345/221/212.md +483 -0
  9. package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +2898 -0
  10. package/docs/04-/350/267/257/347/272/277/345/233/276/344/270/216/351/207/214/347/250/213/347/242/221.md +113 -0
  11. package/docs/05-/350/277/255/344/273/243/346/265/201/347/250/213.md +210 -0
  12. package/docs/06-/350/257/204/345/256/241/344/270/216/346/265/213/350/257/225.md +296 -0
  13. package/docs/fidelity-report.md +225 -0
  14. package/examples/fx/fx-mini/deck.yaml +39 -0
  15. package/examples/fx/fx-mini/pages/01.yaml +6 -0
  16. package/examples/fx/fx-mini/pages/02.yaml +2 -0
  17. package/examples/fx/fx-mini/pages/03.yaml +6 -0
  18. package/examples/fx/fx-pro/deck.yaml +48 -0
  19. package/examples/fx/fx-pro/pages/01_cover.yaml +40 -0
  20. package/examples/fx/fx-pro/pages/02_arch.yaml +55 -0
  21. package/examples/fx/fx-pro/pages/03_table.yaml +20 -0
  22. package/examples/fx/fx-pro/pages/04_chart.yaml +40 -0
  23. package/examples/fx/fx-pro/pages/05_timeline.yaml +71 -0
  24. package/examples/fx/fx-pro/pages/06_longtext.yaml +13 -0
  25. package/examples/fx/fx-pro/pages/07_safearea.yaml +33 -0
  26. package/examples/fx/fx-pro/pages/08_contrast.yaml +22 -0
  27. package/examples/fx/fx-pro/pages/09_custgeom.yaml +32 -0
  28. package/examples/fx/fx-pro/pages/10_numbers.yaml +25 -0
  29. package/examples/fx/fx-pro/pages/11_section.yaml +20 -0
  30. package/examples/fx/fx-pro/pages/12_summary.yaml +57 -0
  31. package/examples/fx/fx-pro/preview/01_pages_01_cover.html +1 -0
  32. package/examples/fx/fx-pro/preview/02_pages_02_arch.html +3 -0
  33. package/examples/fx/fx-pro/preview/03_pages_03_table.html +1 -0
  34. package/examples/fx/fx-pro/preview/04_pages_04_chart.html +3 -0
  35. package/examples/fx/fx-pro/preview/05_pages_05_timeline.html +2 -0
  36. package/examples/fx/fx-pro/preview/06_pages_06_longtext.html +4 -0
  37. package/examples/fx/fx-pro/preview/07_pages_07_safearea.html +2 -0
  38. package/examples/fx/fx-pro/preview/08_pages_08_contrast.html +1 -0
  39. package/examples/fx/fx-pro/preview/09_pages_09_custgeom.html +1 -0
  40. package/examples/fx/fx-pro/preview/10_pages_10_numbers.html +1 -0
  41. package/examples/fx/fx-pro/preview/11_pages_11_section.html +1 -0
  42. package/examples/fx/fx-pro/preview/12_pages_12_summary.html +1 -0
  43. package/examples/fx/fx-pro/preview/deck.html +10 -0
  44. package/examples/fx/fx-pro/preview/layout.json +2325 -0
  45. package/examples/fx/fx-pro/preview/measured.json +814 -0
  46. package/examples/fx/fx-pro.pptx +0 -0
  47. package/examples/fx/ren-single/01.png +0 -0
  48. package/examples/fx/ren-spliced/01.png +0 -0
  49. package/examples/fx/ren-spliced/03.png +0 -0
  50. package/examples/fx/seed.pptx +0 -0
  51. package/examples/fx/single.pptx +0 -0
  52. package/examples/fx/spliced.pptx +0 -0
  53. package/examples/smoke/deck.yaml +26 -0
  54. package/examples/smoke/imported/deck.yaml +30 -0
  55. package/examples/smoke/imported/import-styles.json +126 -0
  56. package/examples/smoke/imported/pages/slide_01.yaml +31 -0
  57. package/examples/smoke/imported/pages/slide_02.yaml +38 -0
  58. package/examples/smoke/imported/pages/slide_03.yaml +55 -0
  59. package/examples/smoke/imported/preview-rt/01_pages_slide_01.html +1 -0
  60. package/examples/smoke/imported/preview-rt/02_pages_slide_02.html +1 -0
  61. package/examples/smoke/imported/preview-rt/03_pages_slide_03.html +1 -0
  62. package/examples/smoke/imported/preview-rt/deck.html +1 -0
  63. package/examples/smoke/imported/preview-rt/layout.json +434 -0
  64. package/examples/smoke/imported/reference/previews/01.png +0 -0
  65. package/examples/smoke/imported/reference/previews/02.png +0 -0
  66. package/examples/smoke/imported/reference/previews/03.png +0 -0
  67. package/examples/smoke/imported/source.pptx +0 -0
  68. package/examples/smoke/media-test.png +0 -0
  69. package/examples/smoke/out-smoke.pptx +0 -0
  70. package/examples/smoke/pages/01_cover.yaml +27 -0
  71. package/examples/smoke/pages/02_content.yaml +42 -0
  72. package/examples/smoke/pages/03_chart.yaml +35 -0
  73. package/examples/smoke/preview/01_pages_01_cover.html +1 -0
  74. package/examples/smoke/preview/02_pages_02_content.html +1 -0
  75. package/examples/smoke/preview/03_pages_03_chart.html +1 -0
  76. package/examples/smoke/preview/deck.html +1 -0
  77. package/examples/smoke/preview/layout.json +378 -0
  78. package/lib/autodeclare.js +40 -0
  79. package/lib/commands.js +161 -0
  80. package/lib/crosscheck.js +300 -0
  81. package/lib/imgmeta.js +55 -0
  82. package/lib/index.js +239 -0
  83. package/lib/measurement.js +209 -0
  84. package/lib/msrender.js +123 -0
  85. package/lib/pptd/export-pptx.js +686 -0
  86. package/lib/pptd/import-pptx.js +774 -0
  87. package/lib/pptd/layout.js +209 -0
  88. package/lib/pptd/render-html.js +254 -0
  89. package/lib/pptd/schema.js +518 -0
  90. package/lib/pptd/svgCharts.js +147 -0
  91. package/lib/pptxPy.js +205 -0
  92. package/lib/preset-delivery.js +195 -0
  93. package/lib/preview-server.js +164 -0
  94. package/lib/router.js +165 -0
  95. package/lib/scaffold.js +315 -0
  96. package/lib/skill.js +174 -0
  97. package/lib/splice.js +219 -0
  98. package/lib/state.js +88 -0
  99. package/lib/surgical.js +369 -0
  100. package/lib/templates.js +400 -0
  101. package/lib/tools.js +955 -0
  102. package/lib/verify.js +828 -0
  103. package/lib/xmljs.js +112 -0
  104. package/lib/zips.js +117 -0
  105. package/package.json +81 -0
  106. package/scripts/audit-manual-facts.mjs +294 -0
  107. package/scripts/audit-template-fidelity.mjs +162 -0
  108. package/scripts/bench-m2.mjs +48 -0
  109. package/scripts/build-templates.mjs +63 -0
  110. package/scripts/build.mjs +14 -0
  111. package/scripts/build.sh +7 -0
  112. package/scripts/check-lib-freshness.mjs +70 -0
  113. package/scripts/check-preset.mjs +189 -0
  114. package/scripts/check-tracked-lf.mjs +84 -0
  115. package/scripts/dbg-import.mjs +13 -0
  116. package/scripts/dbg-media.mjs +10 -0
  117. package/scripts/dbg-tpl-inventory.mjs +23 -0
  118. package/scripts/dump-workflow-baseline.mjs +38 -0
  119. package/scripts/e2e-1.0.mjs +129 -0
  120. package/scripts/eval-skills-blind.mjs +91 -0
  121. package/scripts/eval-skills-score.mjs +129 -0
  122. package/scripts/export-orig-templates.ps1 +17 -0
  123. package/scripts/fixtures/workflow-baseline.json +300 -0
  124. package/scripts/fixtures.mjs +501 -0
  125. package/scripts/import-user-templates.mjs +60 -0
  126. package/scripts/install-desktop.mjs +312 -0
  127. package/scripts/install.mjs +209 -0
  128. package/scripts/migrate-templates-dualtrack.mjs +71 -0
  129. package/scripts/preflight-1.0.mjs +198 -0
  130. package/scripts/probe-asset-freshness.mjs +57 -0
  131. package/scripts/probe-effect-semantics.mjs +69 -0
  132. package/scripts/probe-reparse-safety.mjs +32 -0
  133. package/scripts/rebuild-templates-c11.mjs +69 -0
  134. package/scripts/regression-real.mjs +84 -0
  135. package/scripts/release-sync.mjs +425 -0
  136. package/scripts/shot-templates.mjs +49 -0
  137. package/scripts/smoke.mjs +2512 -0
  138. package/scripts/verify-bundle-install.mjs +281 -0
  139. package/scripts/verify-fresh-install.mjs +260 -0
  140. package/skills/ppt-studio-copy/SKILL.md +139 -0
  141. package/skills/ppt-studio-craft/SKILL.md +171 -0
  142. package/skills/ppt-studio-data/SKILL.md +173 -0
  143. package/skills/ppt-studio-manual/SKILL.md +104 -0
  144. package/templates/academic-white/deck.yaml +24 -0
  145. package/templates/academic-white/pages/_chart.yaml +43 -0
  146. package/templates/academic-white/pages/_compare.yaml +37 -0
  147. package/templates/academic-white/pages/_content.yaml +35 -0
  148. package/templates/academic-white/pages/_cover.yaml +28 -0
  149. package/templates/academic-white/pages/_ending.yaml +28 -0
  150. package/templates/academic-white/pages/_flow.yaml +61 -0
  151. package/templates/academic-white/preview.png +0 -0
  152. package/templates/academic-white/template.yaml +14 -0
  153. package/templates/business-blue/deck.yaml +28 -0
  154. package/templates/business-blue/pages/_chart.yaml +36 -0
  155. package/templates/business-blue/pages/_compare.yaml +45 -0
  156. package/templates/business-blue/pages/_content.yaml +80 -0
  157. package/templates/business-blue/pages/_cover.yaml +39 -0
  158. package/templates/business-blue/pages/_ending.yaml +32 -0
  159. package/templates/business-blue/pages/_flow.yaml +87 -0
  160. package/templates/business-blue/preview.png +0 -0
  161. package/templates/business-blue/template.yaml +14 -0
  162. package/templates/pitch-bold/deck.yaml +23 -0
  163. package/templates/pitch-bold/pages/_chart.yaml +32 -0
  164. package/templates/pitch-bold/pages/_compare.yaml +36 -0
  165. package/templates/pitch-bold/pages/_content.yaml +58 -0
  166. package/templates/pitch-bold/pages/_cover.yaml +31 -0
  167. package/templates/pitch-bold/pages/_ending.yaml +27 -0
  168. package/templates/pitch-bold/pages/_flow.yaml +46 -0
  169. package/templates/pitch-bold/preview.png +0 -0
  170. package/templates/pitch-bold/template.yaml +14 -0
  171. package/templates/tech-dark/deck.yaml +24 -0
  172. package/templates/tech-dark/pages/_chart.yaml +27 -0
  173. package/templates/tech-dark/pages/_compare.yaml +38 -0
  174. package/templates/tech-dark/pages/_content.yaml +51 -0
  175. package/templates/tech-dark/pages/_cover.yaml +30 -0
  176. package/templates/tech-dark/pages/_ending.yaml +25 -0
  177. package/templates/tech-dark/pages/_flow.yaml +80 -0
  178. package/templates/tech-dark/preview.png +0 -0
  179. package/templates/tech-dark/template.yaml +14 -0
@@ -0,0 +1,24 @@
1
+ # 学术会议模板工作区骨架
2
+ version: 1
3
+ title: 未命名报告
4
+ size: [960, 540]
5
+ theme:
6
+ colors:
7
+ navy: "#16355C" # 藏青(标题/强调)
8
+ ink: "#1F2937" # 正文
9
+ gray: "#6B7280" # 次要文字
10
+ light: "#E5E9F0" # 细分隔/浅衬底
11
+ bg: "#FFFFFF"
12
+ accent: "#8C1D40" # 强调红(极少量亮点)
13
+ textStyles:
14
+ title: {fontSize: 30, color: "$navy", bold: true}
15
+ h2: {fontSize: 20, color: "$navy", bold: true}
16
+ body: {fontSize: 16, color: "$ink", lineHeight: 1.5}
17
+ label: {fontSize: 13, color: "$ink"}
18
+ caption: {fontSize: 12, color: "$gray"}
19
+ safeArea: {top: 40, bottom: 24}
20
+ grid: {base: 8}
21
+ minFontSize: 12
22
+ pages:
23
+ - pages/_cover.yaml
24
+ - pages/_content.yaml
@@ -0,0 +1,43 @@
1
+ pageType: content
2
+ # 图表页母版(学术版:大图表 + 结论区)
3
+ # 【2026-09-18】不再预置"数据说明:口径/来源/n/置信/脱敏声明"占位块:依据写进页面 `source:` 字段(YAML,不进成品);
4
+ # 页面上只有读者确实需要知道口径时才留一行小字,不要逐页挂(见 ppt-studio-data §3)。
5
+ elements:
6
+ - elementId: pageNo
7
+ elementType: text
8
+ bounds: [20, 50, 70, 24]
9
+ content: {text: "6", style: "$caption"}
10
+ - elementId: pageTitle
11
+ elementType: text
12
+ bounds: [100, 44, 700, 36]
13
+ content: {text: "结果:数据可视化与解读", style: "$title", color: "$navy", fontSize: 24}
14
+ - elementId: divider
15
+ elementType: line
16
+ points: [[60, 92], [900, 92]]
17
+ line: {color: "$light", width: 1}
18
+ - elementId: chartEl
19
+ elementType: chart
20
+ bounds: [60, 120, 620, 340]
21
+ chart: {type: line, data: {cols: ["时间", "值"], rows: [["T1", 20], ["T2", 42], ["T3", 38], ["T4", 61]]}}
22
+ - elementId: axis
23
+ elementType: text
24
+ bounds: [60, 470, 620, 24]
25
+ content: {text: "横轴:时间 | 纵轴:指标值(示例数据)", style: "$caption"}
26
+ - elementId: conclusion
27
+ elementType: shape
28
+ kind: rect
29
+ bounds: [720, 348, 180, 110]
30
+ fill: "$light"
31
+ - elementId: conclusionT
32
+ elementType: text
33
+ bounds: [734, 362, 152, 82]
34
+ content: {text: "结论\n曲线拐点对应……", style: "$label", color: "$navy", bold: true}
35
+ - elementId: conBar
36
+ elementType: shape
37
+ kind: rect
38
+ bounds: [720, 348, 6, 110]
39
+ fill: "$navy"
40
+ expectedOverlaps:
41
+ - {pair: [conBar, conclusion]}
42
+ - {pair: [conBar, conclusionT]}
43
+ - {pair: [conclusion, conclusionT]}
@@ -0,0 +1,37 @@
1
+ pageType: content
2
+ # 对比页母版(学术版:两栏细线 + 表格式对比)
3
+ expectedOverlaps:
4
+ - {pair: [tblCol, tblTitle]}
5
+ - {pair: [tblCol, tblRows]}
6
+ expectedOutOfSafeArea: [footer]
7
+ elements:
8
+ - elementId: pageNo
9
+ elementType: text
10
+ bounds: [20, 50, 70, 24]
11
+ content: {text: "7", style: "$caption"}
12
+ - elementId: pageTitle
13
+ elementType: text
14
+ bounds: [100, 44, 700, 36]
15
+ content: {text: "对比:方法/方案权衡", style: "$title", color: "$navy", fontSize: 24}
16
+ - elementId: divider
17
+ elementType: line
18
+ points: [[60, 92], [900, 92]]
19
+ line: {color: "$light", width: 1}
20
+ - elementId: tblCol
21
+ elementType: shape
22
+ kind: rect
23
+ bounds: [60, 130, 840, 300]
24
+ fill: "$bg"
25
+ line: {color: "$light", width: 1}
26
+ - elementId: tblTitle
27
+ elementType: text
28
+ bounds: [80, 150, 800, 40]
29
+ content: {text: "维度 方案 A 方案 B", style: "$h2", color: "$navy", fontSize: 16}
30
+ - elementId: tblRows
31
+ elementType: text
32
+ bounds: [80, 210, 800, 200]
33
+ content: {text: "适用场景:描述……\n精度/效果:A …… / B ……\n成本/复杂度:A …… / B ……\n结论倾向:……", style: "$body", fontSize: 14, lineHeight: 1.7}
34
+ - elementId: footer
35
+ elementType: text
36
+ bounds: [60, 496, 300, 20]
37
+ content: {text: "研究/项目名称 · 对比", style: "$caption"}
@@ -0,0 +1,35 @@
1
+ pageType: content
2
+ # 内容页骨架:左上页码 + 左对齐标题 + 正文区(细线分区)
3
+ expectedOverlaps:
4
+ - {pair: [quoteBar, quoteT]}
5
+ expectedOutOfSafeArea: [footer]
6
+ elements:
7
+ - elementId: pageNo
8
+ elementType: text
9
+ bounds: [20, 50, 70, 24]
10
+ content: {text: "3", style: "$caption"}
11
+ - elementId: pageTitle
12
+ elementType: text
13
+ bounds: [100, 44, 700, 36]
14
+ content: {text: "章节标题:研究问题与方法", style: "$title", color: "$navy", fontSize: 24}
15
+ - elementId: divider
16
+ elementType: line
17
+ points: [[60, 92], [900, 92]]
18
+ line: {color: "$light", width: 1}
19
+ - elementId: bodyText
20
+ elementType: text
21
+ bounds: [60, 120, 840, 260]
22
+ content: {text: "正文区(16pt,行高 1.5):\n1. 要点一:说明研究问题与背景\n2. 要点二:方法与数据来源\n3. 要点三:初步结论", style: "$body"}
23
+ - elementId: quoteBar
24
+ elementType: shape
25
+ kind: rect
26
+ bounds: [60, 420, 6, 56]
27
+ fill: "$navy"
28
+ - elementId: quoteT
29
+ elementType: text
30
+ bounds: [86, 424, 800, 40]
31
+ content: {text: "核心观点/定义句(引用样式):一句话说清本章结论。", style: "$label", color: "$gray"}
32
+ - elementId: footer
33
+ elementType: text
34
+ bounds: [60, 496, 300, 20]
35
+ content: {text: "研究/项目名称 · 章节", style: "$caption"}
@@ -0,0 +1,28 @@
1
+ pageType: cover
2
+ background: {type: solid, color: "$bg"}
3
+ safeArea: {top: 40, bottom: 24}
4
+ elements:
5
+ - elementId: topLine
6
+ elementType: line
7
+ points: [[60, 60], [900, 60]]
8
+ line: {color: "$navy", width: 3}
9
+ - elementId: title
10
+ elementType: text
11
+ bounds: [60, 100, 840, 120]
12
+ content: {text: "报告题目:所在研究/项目名称", style: "$title", color: "$navy", fontSize: 36, lineHeight: 1.35}
13
+ - elementId: subtitle
14
+ elementType: text
15
+ bounds: [60, 250, 840, 40]
16
+ content: {text: "副标题:研究定位 / 一句话摘要", style: "$body", color: "$gray"}
17
+ - elementId: authors
18
+ elementType: text
19
+ bounds: [60, 330, 840, 30]
20
+ content: {text: "作者:xxx | 单位:xxx | 日期", style: "$label", color: "$ink"}
21
+ - elementId: footLine
22
+ elementType: line
23
+ points: [[60, 480], [900, 480]]
24
+ line: {color: "$light", width: 1}
25
+ - elementId: venue
26
+ elementType: text
27
+ bounds: [60, 492, 840, 20]
28
+ content: {text: "会议/汇报名称 · 地点", style: "$caption"}
@@ -0,0 +1,28 @@
1
+ pageType: cover
2
+ background: {type: solid, color: "$bg"}
3
+ safeArea: {top: 40, bottom: 24}
4
+ elements:
5
+ - elementId: topLine
6
+ elementType: line
7
+ points: [[60, 60], [900, 60]]
8
+ line: {color: "$navy", width: 3}
9
+ - elementId: thanks
10
+ elementType: text
11
+ bounds: [60, 140, 840, 80]
12
+ content: {text: "谢谢 / Questions?", style: "$title", color: "$navy", fontSize: 40, bold: true}
13
+ - elementId: summary
14
+ elementType: text
15
+ bounds: [60, 250, 840, 80]
16
+ content: {text: "核心结论:研究回答了什么问题;下一步计划:……", style: "$body", color: "$ink"}
17
+ - elementId: contact
18
+ elementType: text
19
+ bounds: [60, 360, 840, 30]
20
+ content: {text: "答疑与讨论:作者 / 单位 / 邮箱", style: "$label", color: "$gray"}
21
+ - elementId: footLine
22
+ elementType: line
23
+ points: [[60, 480], [900, 480]]
24
+ line: {color: "$light", width: 1}
25
+ - elementId: venue
26
+ elementType: text
27
+ bounds: [60, 492, 840, 20]
28
+ content: {text: "会议/汇报名称 · 地点", style: "$caption"}
@@ -0,0 +1,61 @@
1
+ pageType: content
2
+ # 流程页母版(学术版:步骤 + 细箭头,无实色大块)
3
+ expectedOverlaps:
4
+ - {pair: [s1, s1T]}
5
+ - {pair: [s2, s2T]}
6
+ - {pair: [s3, s3T]}
7
+ elements:
8
+ - elementId: pageNo
9
+ elementType: text
10
+ bounds: [20, 50, 70, 24]
11
+ content: {text: "5", style: "$caption"}
12
+ - elementId: pageTitle
13
+ elementType: text
14
+ bounds: [100, 44, 700, 36]
15
+ content: {text: "研究流程:从数据到结论", style: "$title", color: "$navy", fontSize: 24}
16
+ - elementId: divider
17
+ elementType: line
18
+ points: [[60, 92], [900, 92]]
19
+ line: {color: "$light", width: 1}
20
+ - elementId: s1
21
+ elementType: shape
22
+ kind: rect
23
+ bounds: [60, 140, 260, 220]
24
+ fill: "$bg"
25
+ line: {color: "$navy", width: 1}
26
+ - elementId: s2
27
+ elementType: shape
28
+ kind: rect
29
+ bounds: [350, 140, 260, 220]
30
+ fill: "$bg"
31
+ line: {color: "$navy", width: 1}
32
+ - elementId: s3
33
+ elementType: shape
34
+ kind: rect
35
+ bounds: [640, 140, 260, 220]
36
+ fill: "$bg"
37
+ line: {color: "$navy", width: 1}
38
+ - elementId: s1T
39
+ elementType: text
40
+ bounds: [76, 160, 230, 180]
41
+ content: {text: "① 数据准备\n描述:数据来源/清洗/口径。", style: "$body", fontSize: 14}
42
+ - elementId: s2T
43
+ elementType: text
44
+ bounds: [366, 160, 230, 180]
45
+ content: {text: "② 建模分析\n描述:方法/参数/校验。", style: "$body", fontSize: 14}
46
+ - elementId: s3T
47
+ elementType: text
48
+ bounds: [656, 160, 230, 180]
49
+ content: {text: "③ 验证结论\n描述:结果/敏感性/局限。", style: "$body", fontSize: 14}
50
+ - elementId: a1
51
+ elementType: line
52
+ points: [[322, 250], [348, 250]]
53
+ arrow: true
54
+ line: {color: "$navy", width: 2}
55
+ - elementId: a2
56
+ elementType: line
57
+ points: [[612, 250], [638, 250]]
58
+ arrow: true
59
+ line: {color: "$navy", width: 2}
60
+ # 【2026-09-18】删掉原来的"注:流程涉及的口径/假设在此说明"占位块(footnote):
61
+ # 要交代口径就写页面 `source:` 字段(YAML,不进成品);页面上只在读者确实需要时留一行小字,不要逐页挂。
@@ -0,0 +1,14 @@
1
+ id: academic-white
2
+ name: 学术会议
3
+ style: 学术汇报 / 理性克制
4
+ scene: 学位答辩、学术会议、项目评审
5
+ desc: 白底大留白,藏青副色 + 细线分隔;标题严格左对齐,页码左上角;适合图表密集的严谨内容。
6
+ words: 理性 / 克制 / 数据 / 大留白
7
+ colors: ["#16355C", "#1F2937", "#6B7280", "#E5E9F0", "#FFFFFF"]
8
+ pages:
9
+ - pages/_cover.yaml
10
+ - pages/_content.yaml
11
+ - pages/_flow.yaml
12
+ - pages/_chart.yaml
13
+ - pages/_compare.yaml
14
+ - pages/_ending.yaml
@@ -0,0 +1,28 @@
1
+ # 商务蓝模板工作区骨架(复制后按需增删页;母版页可用于新页版式参照)
2
+ version: 1
3
+ title: 未命名演示
4
+ size: [960, 540]
5
+ theme:
6
+ colors:
7
+ primary: "#1E4E8C" # 主色(标题栏/强调)
8
+ deep: "#16355C" # 深蓝(页脚带/封面底)
9
+ accent: "#F59E0B" # 强调金(亮点/徽标)
10
+ ink: "#1F2937" # 正文
11
+ bg: "#FFFFFF"
12
+ light: "#EAF1F8" # 浅底(卡片衬底)
13
+ steel: "#9DB4D0" # 页眉带次要文字/分割
14
+ edge: "#C9D8EA" # 白底卡片描边/页脚细线
15
+ steel2: "#4A6FA5" # 封面装饰点
16
+ gray3: "#64748B" # 页面脚注/说明小字
17
+ textStyles:
18
+ title: {fontSize: 28, color: "$primary", bold: true}
19
+ h2: {fontSize: 20, color: "$primary", bold: true}
20
+ body: {fontSize: 14, color: "$ink"}
21
+ label: {fontSize: 12, color: "$ink"}
22
+ caption: {fontSize: 12, color: "#64748B"}
23
+ safeArea: {top: 16, bottom: 16}
24
+ grid: {base: 8}
25
+ minFontSize: 12
26
+ pages:
27
+ - pages/_cover.yaml
28
+ - pages/_content.yaml
@@ -0,0 +1,36 @@
1
+ pageType: content
2
+ # 图表页母版:标题 + 图表区(chart 元素占位)+ 读图结论
3
+ # 【2026-09-18】不再预置"数据口径/来源/脱敏声明"占位块:依据写进页面 `source:` 字段(YAML,不进成品);
4
+ # 页面上只有读者确实需要知道口径时(引用外部数据、口径有歧义)才留一行小字,不要逐页挂(见 ppt-studio-data §3)。
5
+ expectedOverlaps:
6
+ - {pair: [chartBox, chartEl]}
7
+ - {pair: [headbar, pageTitle]}
8
+ expectedOutOfSafeArea: [headbar, pageTitle]
9
+ elements:
10
+ - elementId: headbar
11
+ elementType: shape
12
+ kind: rect
13
+ bounds: [0, 0, 960, 46]
14
+ fill: "$deep"
15
+ - elementId: pageTitle
16
+ elementType: text
17
+ bounds: [60, 10, 700, 30]
18
+ content: {text: "图表标题:数据支撑论点", style: "$title", color: "#FFFFFF", fontSize: 22}
19
+ - elementId: chartBox
20
+ elementType: shape
21
+ kind: rect
22
+ bounds: [60, 80, 600, 360]
23
+ fill: "$bg"
24
+ line: {color: "#C9D8EA", width: 1}
25
+ - elementId: chartEl
26
+ elementType: chart
27
+ bounds: [80, 100, 560, 320]
28
+ chart: {type: bar, data: {cols: ["指标", "值"], rows: [["A", 72], ["B", 55], ["C", 40], ["D", 88]]}}
29
+ - elementId: insight
30
+ elementType: text
31
+ bounds: [700, 100, 200, 120]
32
+ content: {text: "读图结论\n(12pt)", style: "$label", color: "$primary", bold: true}
33
+ - elementId: footerLine
34
+ elementType: line
35
+ points: [[60, 505], [900, 505]]
36
+ line: {color: "#C9D8EA", width: 1}
@@ -0,0 +1,45 @@
1
+ pageType: content
2
+ # 对比页母版:现状 vs 改进(或方案 A vs B)
3
+ expectedOverlaps:
4
+ - {pair: [headbar, pageTitle]}
5
+ - {pair: [leftBox, leftT]}
6
+ - {pair: [rightBox, rightT]}
7
+ - {pair: [vsBadge, vsT]}
8
+ expectedOutOfSafeArea: [headbar, pageTitle]
9
+ elements:
10
+ - elementId: headbar
11
+ elementType: shape
12
+ kind: rect
13
+ bounds: [0, 0, 960, 46]
14
+ fill: "$deep"
15
+ - elementId: pageTitle
16
+ elementType: text
17
+ bounds: [60, 10, 700, 30]
18
+ content: {text: "对比标题:改进前后", style: "$title", color: "#FFFFFF", fontSize: 22}
19
+ - elementId: leftBox
20
+ elementType: shape
21
+ kind: roundRect
22
+ bounds: [60, 100, 390, 340]
23
+ fill: "$light"
24
+ - elementId: leftT
25
+ elementType: text
26
+ bounds: [84, 124, 350, 290]
27
+ content: {text: "改进前\n\n- 问题 1:描述\n- 问题 2:描述\n- 问题 3:描述", style: "$body"}
28
+ - elementId: rightBox
29
+ elementType: shape
30
+ kind: roundRect
31
+ bounds: [510, 100, 390, 340]
32
+ fill: "$primary"
33
+ - elementId: rightT
34
+ elementType: text
35
+ bounds: [534, 124, 350, 290]
36
+ content: {text: "改进后\n\n- 亮点 1:描述\n- 亮点 2:描述\n- 亮点 3:描述", style: "$body", color: "#FFFFFF"}
37
+ - elementId: vsBadge
38
+ elementType: shape
39
+ kind: ellipse
40
+ bounds: [452, 250, 56, 56]
41
+ fill: "$accent"
42
+ - elementId: vsT
43
+ elementType: text
44
+ bounds: [452, 262, 56, 30]
45
+ content: {text: "VS", style: "$h2", color: "#1F2937", align: center}
@@ -0,0 +1,80 @@
1
+ pageType: content
2
+ # 内容页骨架:页眉标题栏 + 正文区(示例卡片)+ 页脚页码带
3
+ # 新页复制本母版:把 "3" 处示例卡片替换为实际内容;页眉/页脚元素保留(跨页一致性)
4
+ expectedOverlaps:
5
+ - {pair: [headbar, pageTitle]}
6
+ - {pair: [headbar, pageNo]}
7
+ - {pair: [cardA, cardAT]}
8
+ - {pair: [cardB, cardBT]}
9
+ - {pair: [cardC, cardCT]}
10
+ - {pair: [cardD, cardDT]}
11
+ expectedOutOfSafeArea:
12
+ - headbar # 页眉带满幅出血:模板标准形态(有意贴顶)
13
+ - pageTitle # 在页眉带内
14
+ - pageNo # 在页眉带内
15
+ elements:
16
+ - elementId: headbar
17
+ elementType: shape
18
+ kind: rect
19
+ bounds: [0, 0, 960, 46]
20
+ fill: "$deep"
21
+ - elementId: pageTitle
22
+ elementType: text
23
+ bounds: [60, 10, 700, 30]
24
+ content: {text: "本章标题:一句话点题", style: "$title", color: "#FFFFFF", fontSize: 22}
25
+ - elementId: pageNo
26
+ elementType: text
27
+ bounds: [888, 12, 52, 24]
28
+ content: {text: "2", style: "$label", color: "#9DB4D0", align: right}
29
+ - elementId: cardA
30
+ elementType: shape
31
+ kind: roundRect
32
+ bounds: [60, 80, 410, 180]
33
+ fill: "$light"
34
+ - elementId: cardAT
35
+ elementType: text
36
+ bounds: [84, 104, 360, 130]
37
+ content: {text: "要点标题(14pt)\n要点正文:说明性文字,语义断点显式换行。", style: "$body"}
38
+ - elementId: cardB
39
+ elementType: shape
40
+ kind: roundRect
41
+ bounds: [500, 80, 400, 180]
42
+ fill: "$light"
43
+ - elementId: cardBT
44
+ elementType: text
45
+ bounds: [524, 104, 350, 130]
46
+ content: {text: "要点标题(14pt)\n要点正文:说明性文字,语义断点显式换行。", style: "$body"}
47
+ - elementId: cardC
48
+ elementType: shape
49
+ kind: roundRect
50
+ bounds: [60, 292, 410, 180]
51
+ fill: "$bg"
52
+ line: {color: "#C9D8EA", width: 1}
53
+ - elementId: cardCT
54
+ elementType: text
55
+ bounds: [84, 316, 360, 130]
56
+ content: {text: "白底卡片要点标题\n正文:用于对比/补充信息。", style: "$body"}
57
+ - elementId: cardD
58
+ elementType: shape
59
+ kind: roundRect
60
+ bounds: [500, 292, 400, 180]
61
+ fill: "$bg"
62
+ line: {color: "#C9D8EA", width: 1}
63
+ - elementId: cardDT
64
+ elementType: text
65
+ bounds: [524, 316, 350, 130]
66
+ content: {text: "白底卡片要点标题\n正文:用于对比/补充信息。", style: "$body"}
67
+ - elementId: footerLine
68
+ elementType: line
69
+ points: [[60, 505], [900, 505]]
70
+ line: {color: "#C9D8EA", width: 1}
71
+ - elementId: footerLogo
72
+ elementType: shape
73
+ kind: rect
74
+ bounds: [60, 512, 8, 8]
75
+ fill: "$accent"
76
+ - elementId: footerText
77
+ elementType: text
78
+ bounds: [80, 508, 300, 16]
79
+ content: {text: "公司名称 · 项目名称", style: "$caption"}
80
+
@@ -0,0 +1,39 @@
1
+ pageType: cover
2
+ background: {type: solid, color: "$deep"}
3
+ safeArea: {top: 24, bottom: 24}
4
+ elements:
5
+ - elementId: brand
6
+ elementType: text
7
+ bounds: [60, 70, 300, 30]
8
+ content: {text: "BRAND · 品牌标识位", style: "$label", color: "#9DB4D0"}
9
+ - elementId: rule
10
+ elementType: line
11
+ points: [[60, 118], [900, 118]]
12
+ line: {color: "#9DB4D0", width: 1}
13
+ - elementId: title
14
+ elementType: text
15
+ bounds: [60, 170, 840, 110]
16
+ content: {text: "主标题:一句话说清楚汇报主题", style: "$title", color: "#FFFFFF", fontSize: 40, bold: true, lineHeight: 1.3}
17
+ - elementId: subtitle
18
+ elementType: text
19
+ bounds: [60, 300, 840, 36]
20
+ content: {text: "副标题:项目/报告名称、时间区间、核心结论", style: "$body", color: "#C9D8EA", fontSize: 16}
21
+ - elementId: accentLine
22
+ elementType: shape
23
+ kind: rect
24
+ bounds: [60, 350, 80, 6]
25
+ fill: "$accent"
26
+ - elementId: org
27
+ elementType: text
28
+ bounds: [60, 452, 700, 28]
29
+ content: {text: "组织/部门 | 汇报人 | 日期", style: "$label", color: "#9DB4D0"}
30
+ - elementId: decoDots
31
+ elementType: shape
32
+ kind: ellipse
33
+ bounds: [840, 452, 20, 20]
34
+ fill: "$accent"
35
+ - elementId: decoDot2
36
+ elementType: shape
37
+ kind: ellipse
38
+ bounds: [868, 452, 12, 12]
39
+ fill: "#4A6FA5"
@@ -0,0 +1,32 @@
1
+ pageType: cover
2
+ # 结尾页母版:结论句 + 行动号召
3
+ background: {type: solid, color: "$deep"}
4
+ safeArea: {top: 24, bottom: 24}
5
+ expectedOverlaps:
6
+ - {pair: [action, actionT]}
7
+ elements:
8
+ - elementId: rule
9
+ elementType: line
10
+ points: [[60, 150], [900, 150]]
11
+ line: {color: "#9DB4D0", width: 1}
12
+ - elementId: thanks
13
+ elementType: text
14
+ bounds: [60, 190, 840, 70]
15
+ content: {text: "谢谢观看", style: "$title", color: "#FFFFFF", fontSize: 40, bold: true}
16
+ - elementId: takeaway
17
+ elementType: text
18
+ bounds: [60, 280, 840, 60]
19
+ content: {text: "核心结论一句:可执行建议 / 下一步行动", style: "$body", color: "#C9D8EA", fontSize: 16}
20
+ - elementId: action
21
+ elementType: shape
22
+ kind: rect
23
+ bounds: [60, 360, 240, 44]
24
+ fill: "$accent"
25
+ - elementId: actionT
26
+ elementType: text
27
+ bounds: [60, 372, 240, 24]
28
+ content: {text: "请联系:联系方式 / 讨论", style: "$label", color: "#1F2937", align: center}
29
+ - elementId: org
30
+ elementType: text
31
+ bounds: [60, 452, 840, 28]
32
+ content: {text: "组织/部门 | 汇报人 | 日期", style: "$label", color: "#9DB4D0"}
@@ -0,0 +1,87 @@
1
+ pageType: content
2
+ # 流程页母版:步骤横向流程(3-5 步;边框=箭头)
3
+ expectedOverlaps:
4
+ - {pair: [headbar, pageTitle]}
5
+ - {pair: [s1, s1T]}
6
+ - {pair: [s2, s2T]}
7
+ - {pair: [s3, s3T]}
8
+ - {pair: [s4, s4T]}
9
+ - {pair: [s1, a1]}
10
+ - {pair: [s2, a2]}
11
+ - {pair: [s3, a3]}
12
+ - {pair: [noteBar, noteT]}
13
+ expectedOutOfSafeArea: [headbar, pageTitle]
14
+ elements:
15
+ - elementId: headbar
16
+ elementType: shape
17
+ kind: rect
18
+ bounds: [0, 0, 960, 46]
19
+ fill: "$deep"
20
+ - elementId: pageTitle
21
+ elementType: text
22
+ bounds: [60, 10, 700, 30]
23
+ content: {text: "流程标题:从输入到输出", style: "$title", color: "#FFFFFF", fontSize: 22}
24
+ - elementId: s1
25
+ elementType: shape
26
+ kind: roundRect
27
+ bounds: [60, 100, 190, 150]
28
+ fill: "$light"
29
+ - elementId: s2
30
+ elementType: shape
31
+ kind: roundRect
32
+ bounds: [300, 100, 190, 150]
33
+ fill: "$light"
34
+ - elementId: s3
35
+ elementType: shape
36
+ kind: roundRect
37
+ bounds: [540, 100, 190, 150]
38
+ fill: "$light"
39
+ - elementId: s4
40
+ elementType: shape
41
+ kind: roundRect
42
+ bounds: [780, 100, 130, 150]
43
+ fill: "$accent"
44
+ - elementId: s1T
45
+ elementType: text
46
+ bounds: [76, 118, 160, 110]
47
+ content: {text: "步骤一(14pt)\n描述:输入与准备。", style: "$body", bold: true}
48
+ - elementId: s2T
49
+ elementType: text
50
+ bounds: [316, 118, 160, 110]
51
+ content: {text: "步骤二(14pt)\n描述:处理与转换。", style: "$body", bold: true}
52
+ - elementId: s3T
53
+ elementType: text
54
+ bounds: [556, 118, 160, 110]
55
+ content: {text: "步骤三(14pt)\n描述:验证与优化。", style: "$body", bold: true}
56
+ - elementId: s4T
57
+ elementType: text
58
+ bounds: [794, 118, 102, 110]
59
+ content: {text: "输出\n(12pt)", style: "$label", color: "#1F2937", bold: true}
60
+ - elementId: a1
61
+ elementType: line
62
+ points: [[252, 175], [298, 175]]
63
+ arrow: true
64
+ line: {color: "$primary", width: 2}
65
+ - elementId: a2
66
+ elementType: line
67
+ points: [[492, 175], [538, 175]]
68
+ arrow: true
69
+ line: {color: "$primary", width: 2}
70
+ - elementId: a3
71
+ elementType: line
72
+ points: [[732, 175], [778, 175]]
73
+ arrow: true
74
+ line: {color: "$primary", width: 2}
75
+ - elementId: detail
76
+ elementType: text
77
+ bounds: [60, 300, 840, 120]
78
+ content: {text: "细节说明区:每步的输入/输出/关键指标可在此展开。", style: "$body"}
79
+ - elementId: noteBar
80
+ elementType: shape
81
+ kind: rect
82
+ bounds: [60, 448, 840, 46]
83
+ fill: "$deep"
84
+ - elementId: noteT
85
+ elementType: text
86
+ bounds: [84, 458, 800, 26]
87
+ content: {text: "结论一句:流程串联的成果/价值", style: "$body", color: "#FFFFFF"}
@@ -0,0 +1,14 @@
1
+ id: business-blue
2
+ name: 商务蓝
3
+ style: 企业汇报 / 严谨商务
4
+ scene: 经营分析、项目汇报、方案推介
5
+ desc: 浅底深蓝主色,8px 网格 + 模块化卡片,页眉标题栏 + 页脚页码带;适合信息层级多的严谨汇报。
6
+ words: 严谨 / 专业 / 稳重 / 信息密度高
7
+ colors: ["#1E4E8C", "#16355C", "#F59E0B", "#1F2937", "#EAF1F8"]
8
+ pages:
9
+ - pages/_cover.yaml
10
+ - pages/_content.yaml
11
+ - pages/_flow.yaml
12
+ - pages/_chart.yaml
13
+ - pages/_compare.yaml
14
+ - pages/_ending.yaml
@@ -0,0 +1,23 @@
1
+ # 路演大字模板工作区骨架
2
+ version: 1
3
+ title: 未命名路演
4
+ size: [960, 540]
5
+ theme:
6
+ colors:
7
+ orange: "#E4572E" # 强调(唯一)
8
+ ink: "#1F2937" # 正文
9
+ bg: "#FFFFFF"
10
+ light: "#F2F3F5" # 浅衬底
11
+ gray: "#9AA1A9" # 次要
12
+ textStyles:
13
+ title: {fontSize: 44, color: "$ink", bold: true, lineHeight: 1.2}
14
+ h2: {fontSize: 24, color: "$ink", bold: true}
15
+ body: {fontSize: 18, color: "$ink", lineHeight: 1.5}
16
+ label: {fontSize: 14, color: "$ink"}
17
+ caption: {fontSize: 13, color: "$gray"}
18
+ safeArea: {top: 16, bottom: 16}
19
+ grid: {base: 8}
20
+ minFontSize: 12
21
+ pages:
22
+ - pages/_cover.yaml
23
+ - pages/_content.yaml