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,32 @@
1
+ pageType: content
2
+ # 图表页母版(大字版:数字冲击 + 简图)
3
+ # 【2026-09-18】不预置"数据口径/来源/脱敏声明"占位块:依据写进页面 `source:` 字段(YAML,不进成品);
4
+ # 页面上只有读者确实需要知道口径时才留一行小字,不要逐页挂(见 ppt-studio-data §3)。
5
+ expectedOverlaps:
6
+ - {pair: [bigNumBg, bigNum]}
7
+ elements:
8
+ - elementId: kick
9
+ elementType: text
10
+ bounds: [60, 48, 400, 26]
11
+ content: {text: "03 · PROOF", style: "$caption", color: "$orange"}
12
+ - elementId: title
13
+ elementType: text
14
+ bounds: [60, 84, 840, 90]
15
+ content: {text: "数据证明:核心指标", style: "$title", color: "$ink", fontSize: 40}
16
+ - elementId: bigNumBg
17
+ elementType: shape
18
+ kind: rect
19
+ bounds: [60, 220, 340, 180]
20
+ fill: "$orange"
21
+ - elementId: bigNum
22
+ elementType: text
23
+ bounds: [80, 240, 300, 140]
24
+ content: {text: "10 倍\n(44pt 大数字)", style: "$title", color: "#FFFFFF", fontSize: 44}
25
+ - elementId: chartEl
26
+ elementType: chart
27
+ bounds: [460, 200, 440, 220]
28
+ chart: {type: bar, data: {cols: ["指标", "值"], rows: [["当前", 12], ["改进", 88]]}}
29
+ - elementId: footer
30
+ elementType: text
31
+ bounds: [60, 500, 300, 20]
32
+ content: {text: "第 4 页 · 公司名", style: "$caption"}
@@ -0,0 +1,36 @@
1
+ pageType: content
2
+ # 对比页母版(大字版:红黑对撞)
3
+ expectedOverlaps:
4
+ - {pair: [badBox, badT]}
5
+ - {pair: [goodBox, goodT]}
6
+ elements:
7
+ - elementId: kick
8
+ elementType: text
9
+ bounds: [60, 48, 400, 26]
10
+ content: {text: "04 · VS", style: "$caption", color: "$orange"}
11
+ - elementId: title
12
+ elementType: text
13
+ bounds: [60, 84, 840, 90]
14
+ content: {text: "对比:没有它 vs 有它", style: "$title", color: "$ink", fontSize: 40}
15
+ - elementId: badBox
16
+ elementType: shape
17
+ kind: rect
18
+ bounds: [60, 210, 390, 220]
19
+ fill: "$light"
20
+ - elementId: badT
21
+ elementType: text
22
+ bounds: [84, 234, 344, 180]
23
+ content: {text: "现状/痛点\n\n一句话:没有它时的问题", style: "$body", color: "$ink", fontSize: 18}
24
+ - elementId: goodBox
25
+ elementType: shape
26
+ kind: rect
27
+ bounds: [510, 210, 390, 220]
28
+ fill: "$orange"
29
+ - elementId: goodT
30
+ elementType: text
31
+ bounds: [534, 234, 344, 180]
32
+ content: {text: "有它/方案\n\n一句话:带来的改变", style: "$body", color: "#FFFFFF", fontSize: 18}
33
+ - elementId: footer
34
+ elementType: text
35
+ bounds: [60, 500, 300, 20]
36
+ content: {text: "第 5 页 · 公司名", style: "$caption"}
@@ -0,0 +1,58 @@
1
+ pageType: content
2
+ # 内容页骨架(大字版):大标题 + 三大要点(数字徽标 + 极简)
3
+ expectedOverlaps:
4
+ - {pair: [n1, n1T]}
5
+ - {pair: [n2, n2T]}
6
+ - {pair: [n3, n3T]}
7
+ elements:
8
+ - elementId: kick
9
+ elementType: text
10
+ bounds: [60, 48, 400, 26]
11
+ content: {text: "01 · WHY", style: "$caption", color: "$orange"}
12
+ - elementId: title
13
+ elementType: text
14
+ bounds: [60, 84, 840, 90]
15
+ content: {text: "大标题:三句话讲清一大点", style: "$title", color: "$ink", fontSize: 40}
16
+ - elementId: n1
17
+ elementType: shape
18
+ kind: ellipse
19
+ bounds: [60, 220, 64, 64]
20
+ fill: "$orange"
21
+ - elementId: n1T
22
+ elementType: text
23
+ bounds: [60, 220, 64, 64]
24
+ content: {text: "1", style: "$title", color: "#FFFFFF", fontSize: 28, align: center}
25
+ - elementId: p1
26
+ elementType: text
27
+ bounds: [60, 306, 260, 120]
28
+ content: {text: "要点一\n(18pt)一句话", style: "$body", color: "$ink", fontSize: 18}
29
+ - elementId: n2
30
+ elementType: shape
31
+ kind: ellipse
32
+ bounds: [350, 220, 64, 64]
33
+ fill: "$ink"
34
+ - elementId: n2T
35
+ elementType: text
36
+ bounds: [350, 220, 64, 64]
37
+ content: {text: "2", style: "$title", color: "#FFFFFF", fontSize: 28, align: center}
38
+ - elementId: p2
39
+ elementType: text
40
+ bounds: [350, 306, 260, 120]
41
+ content: {text: "要点二\n(18pt)一句话", style: "$body", color: "$ink", fontSize: 18}
42
+ - elementId: n3
43
+ elementType: shape
44
+ kind: ellipse
45
+ bounds: [640, 220, 64, 64]
46
+ fill: "$gray"
47
+ - elementId: n3T
48
+ elementType: text
49
+ bounds: [640, 220, 64, 64]
50
+ content: {text: "3", style: "$title", color: "#FFFFFF", fontSize: 28, align: center}
51
+ - elementId: p3
52
+ elementType: text
53
+ bounds: [640, 306, 260, 120]
54
+ content: {text: "要点三\n(18pt)一句话", style: "$body", color: "$ink", fontSize: 18}
55
+ - elementId: footer
56
+ elementType: text
57
+ bounds: [60, 500, 300, 20]
58
+ content: {text: "第 2 页 · 公司名", style: "$caption"}
@@ -0,0 +1,31 @@
1
+ pageType: cover
2
+ background: {type: solid, color: "$bg"}
3
+ safeArea: {top: 16, bottom: 16}
4
+ expectedOverlaps:
5
+ - {pair: [tag, tagT]}
6
+ elements:
7
+ - elementId: kick
8
+ elementType: text
9
+ bounds: [60, 70, 400, 30]
10
+ content: {text: "PITCH · 路演", style: "$caption", color: "$orange"}
11
+ - elementId: title
12
+ elementType: text
13
+ bounds: [60, 130, 840, 200]
14
+ content: {text: "一句话\n说清你做什么", style: "$title", color: "$ink", fontSize: 56, lineHeight: 1.2}
15
+ - elementId: sub
16
+ elementType: text
17
+ bounds: [60, 360, 840, 60]
18
+ content: {text: "副标题:为谁解决什么问题(18pt)", style: "$body", color: "$gray", fontSize: 18}
19
+ - elementId: tag
20
+ elementType: shape
21
+ kind: rect
22
+ bounds: [60, 452, 120, 36]
23
+ fill: "$orange"
24
+ - elementId: tagT
25
+ elementType: text
26
+ bounds: [60, 462, 120, 22]
27
+ content: {text: "公司名", style: "$label", color: "#FFFFFF", align: center}
28
+ - elementId: date
29
+ elementType: text
30
+ bounds: [200, 462, 300, 22]
31
+ content: {text: "日期 · 场合", style: "$caption"}
@@ -0,0 +1,27 @@
1
+ pageType: cover
2
+ background: {type: solid, color: "$bg"}
3
+ safeArea: {top: 16, bottom: 16}
4
+ expectedOverlaps:
5
+ - {pair: [tag, tagT]}
6
+ elements:
7
+ - elementId: title
8
+ elementType: text
9
+ bounds: [60, 130, 840, 200]
10
+ content: {text: "一起\n做成这件事", style: "$title", color: "$ink", fontSize: 56, lineHeight: 1.2}
11
+ - elementId: ask
12
+ elementType: text
13
+ bounds: [60, 360, 840, 40]
14
+ content: {text: "下一步:融资/合作/联系(18pt)", style: "$body", color: "$gray", fontSize: 18}
15
+ - elementId: tag
16
+ elementType: shape
17
+ kind: rect
18
+ bounds: [60, 452, 120, 36]
19
+ fill: "$orange"
20
+ - elementId: tagT
21
+ elementType: text
22
+ bounds: [60, 462, 120, 22]
23
+ content: {text: "公司名", style: "$label", color: "#FFFFFF", align: center}
24
+ - elementId: date
25
+ elementType: text
26
+ bounds: [200, 462, 300, 22]
27
+ content: {text: "联系邮箱 · 日期", style: "$caption"}
@@ -0,0 +1,46 @@
1
+ pageType: content
2
+ # 流程页母版(大字版:三闸门式)
3
+ expectedOverlaps:
4
+ - {pair: [s1, s1T]}
5
+ - {pair: [s2, s2T]}
6
+ - {pair: [s3, s3T]}
7
+ elements:
8
+ - elementId: kick
9
+ elementType: text
10
+ bounds: [60, 48, 400, 26]
11
+ content: {text: "02 · HOW", style: "$caption", color: "$orange"}
12
+ - elementId: title
13
+ elementType: text
14
+ bounds: [60, 84, 840, 90]
15
+ content: {text: "怎么做到:三步主线", style: "$title", color: "$ink", fontSize: 40}
16
+ - elementId: s1
17
+ elementType: shape
18
+ kind: rect
19
+ bounds: [60, 210, 250, 170]
20
+ fill: "$orange"
21
+ - elementId: s1T
22
+ elementType: text
23
+ bounds: [76, 226, 220, 140]
24
+ content: {text: "01 抓手\n\n一句话说明", style: "$body", color: "#FFFFFF", fontSize: 16}
25
+ - elementId: s2
26
+ elementType: shape
27
+ kind: rect
28
+ bounds: [355, 210, 250, 170]
29
+ fill: "$light"
30
+ - elementId: s2T
31
+ elementType: text
32
+ bounds: [371, 226, 220, 140]
33
+ content: {text: "02 引擎\n\n一句话说明", style: "$body", color: "$ink", fontSize: 16}
34
+ - elementId: s3
35
+ elementType: shape
36
+ kind: rect
37
+ bounds: [650, 210, 250, 170]
38
+ fill: "$light"
39
+ - elementId: s3T
40
+ elementType: text
41
+ bounds: [666, 226, 220, 140]
42
+ content: {text: "03 放大\n\n一句话说明", style: "$body", color: "$ink", fontSize: 16}
43
+ - elementId: footer
44
+ elementType: text
45
+ bounds: [60, 500, 300, 20]
46
+ content: {text: "第 3 页 · 公司名", style: "$caption"}
Binary file
@@ -0,0 +1,14 @@
1
+ id: pitch-bold
2
+ name: 路演大字
3
+ style: 路演 / 大字报 / 极简
4
+ scene: 融资路演、产品推介、开营大课
5
+ desc: 白底 + 超大字号(标题 44pt+)+ 单一强调色(橙红);每页一个核心信息,一屏一线索。
6
+ words: 大字 / 冲击 / 极简 / 一屏一信息
7
+ colors: ["#E4572E", "#1F2937", "#FFFFFF", "#F2F3F5", "#9AA1A9"]
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,24 @@
1
+ # 科技深色模板工作区骨架
2
+ version: 1
3
+ title: 未命名发布
4
+ size: [960, 540]
5
+ theme:
6
+ colors:
7
+ bg: "#0F1B2D" # 深底
8
+ cyan: "#22D3EE" # 强调青
9
+ card: "#1E3A5F" # 卡片
10
+ white: "#E2E8F0" # 正文
11
+ sub: "#8FA3BF" # 次要
12
+ chip: "#334155" # 点缀
13
+ textStyles:
14
+ title: {fontSize: 32, color: "$white", bold: true}
15
+ h2: {fontSize: 20, color: "$cyan", bold: true}
16
+ body: {fontSize: 14, color: "$white"}
17
+ label: {fontSize: 12, color: "$white"}
18
+ caption: {fontSize: 12, color: "$sub"}
19
+ safeArea: {top: 16, bottom: 16}
20
+ grid: {base: 8}
21
+ minFontSize: 12
22
+ pages:
23
+ - pages/_cover.yaml
24
+ - pages/_content.yaml
@@ -0,0 +1,27 @@
1
+ pageType: content
2
+ # 图表页母版(深色版)
3
+ # 【2026-09-18】不预置"数据口径/来源/脱敏声明"占位块:依据写进页面 `source:` 字段(YAML,不进成品);
4
+ # 页面上只有读者确实需要知道口径时才留一行小字,不要逐页挂(见 ppt-studio-data §3)。
5
+ expectedOutOfSafeArea: [accentBar, pageTitle]
6
+ elements:
7
+ - elementId: accentBar
8
+ elementType: shape
9
+ kind: rect
10
+ bounds: [0, 0, 8, 46]
11
+ fill: "$cyan"
12
+ - elementId: pageTitle
13
+ elementType: text
14
+ bounds: [20, 10, 700, 30]
15
+ content: {text: "数据表现:指标趋势", style: "$title", color: "$white", fontSize: 24}
16
+ - elementId: chartEl
17
+ elementType: chart
18
+ bounds: [60, 90, 620, 360]
19
+ chart: {type: bar, data: {cols: ["指标", "值"], rows: [["A", 45], ["B", 66], ["C", 52], ["D", 88]]}, colors: ["#22D3EE"]}
20
+ - elementId: ins
21
+ elementType: text
22
+ bounds: [720, 110, 180, 120]
23
+ content: {text: "读图结论\n(阈值点 88%)", style: "$label", color: "$cyan", bold: true}
24
+ - elementId: footer
25
+ elementType: text
26
+ bounds: [60, 505, 300, 18]
27
+ content: {text: "产品名 · 数据页", style: "$caption"}
@@ -0,0 +1,38 @@
1
+ pageType: content
2
+ # 对比页母版(深色版:亮暗面)
3
+ expectedOverlaps:
4
+ - {pair: [darkBox, darkT]}
5
+ - {pair: [lightBox, lightT]}
6
+ expectedOutOfSafeArea: [accentBar, pageTitle]
7
+ elements:
8
+ - elementId: accentBar
9
+ elementType: shape
10
+ kind: rect
11
+ bounds: [0, 0, 8, 46]
12
+ fill: "$cyan"
13
+ - elementId: pageTitle
14
+ elementType: text
15
+ bounds: [20, 10, 700, 30]
16
+ content: {text: "对比:现状 vs 方案", style: "$title", color: "$white", fontSize: 24}
17
+ - elementId: darkBox
18
+ elementType: shape
19
+ kind: roundRect
20
+ bounds: [60, 100, 390, 340]
21
+ fill: "$card"
22
+ - elementId: darkT
23
+ elementType: text
24
+ bounds: [84, 124, 340, 290]
25
+ content: {text: "现状/痛点\n\n- 问题 1:描述\n- 问题 2:描述\n- 问题 3:描述", style: "$body", color: "$sub", fontSize: 14}
26
+ - elementId: lightBox
27
+ elementType: shape
28
+ kind: roundRect
29
+ bounds: [510, 100, 390, 340]
30
+ fill: "$cyan"
31
+ - elementId: lightT
32
+ elementType: text
33
+ bounds: [534, 124, 340, 290]
34
+ content: {text: "方案/亮点\n\n- 亮点 1:描述\n- 亮点 2:描述\n- 亮点 3:描述", style: "$body", color: "#0F1B2D", fontSize: 14}
35
+ - elementId: vs
36
+ elementType: text
37
+ bounds: [452, 258, 56, 30]
38
+ content: {text: "VS", style: "$h2", color: "$white", align: center}
@@ -0,0 +1,51 @@
1
+ pageType: content
2
+ # 内容页骨架(深色版):左上角标 + 标题 + 大圆角卡片
3
+ expectedOverlaps:
4
+ - {pair: [accentBar, pageTitle]}
5
+ - {pair: [cardA, cardAT]}
6
+ - {pair: [cardB, cardBT]}
7
+ expectedOutOfSafeArea: [accentBar, pageTitle, pageNo]
8
+ elements:
9
+ - elementId: accentBar
10
+ elementType: shape
11
+ kind: rect
12
+ bounds: [0, 0, 8, 46]
13
+ fill: "$cyan"
14
+ - elementId: pageTitle
15
+ elementType: text
16
+ bounds: [20, 10, 700, 30]
17
+ content: {text: "章节标题", style: "$title", color: "$white", fontSize: 24}
18
+ - elementId: pageNo
19
+ elementType: text
20
+ bounds: [888, 12, 52, 24]
21
+ content: {text: "12", style: "$caption", align: right}
22
+ - elementId: cardA
23
+ elementType: shape
24
+ kind: roundRect
25
+ bounds: [60, 80, 410, 200]
26
+ fill: "$card"
27
+ - elementId: cardAT
28
+ elementType: text
29
+ bounds: [84, 104, 360, 150]
30
+ content: {text: "要点标题(14pt)\n要点正文:说明性文字,语义断点显式换行。", style: "$body", color: "$white"}
31
+ - elementId: cardB
32
+ elementType: shape
33
+ kind: roundRect
34
+ bounds: [500, 80, 400, 200]
35
+ fill: "$card"
36
+ - elementId: cardBT
37
+ elementType: text
38
+ bounds: [524, 104, 350, 150]
39
+ content: {text: "要点标题(14pt)\n要点正文:说明性文字,语义断点显式换行。", style: "$body", color: "$white"}
40
+ - elementId: metric
41
+ elementType: text
42
+ bounds: [60, 320, 300, 60]
43
+ content: {text: "关键指标 N1\n(大数字 20pt)", style: "$h2", color: "$cyan", fontSize: 20}
44
+ - elementId: metric2
45
+ elementType: text
46
+ bounds: [420, 320, 300, 60]
47
+ content: {text: "关键指标 N2\n(大数字 20pt)", style: "$h2", color: "$cyan", fontSize: 20}
48
+ - elementId: footer
49
+ elementType: text
50
+ bounds: [60, 505, 300, 18]
51
+ content: {text: "产品名 · 页", style: "$caption"}
@@ -0,0 +1,30 @@
1
+ pageType: cover
2
+ background: {type: solid, color: "$bg"}
3
+ safeArea: {top: 24, bottom: 24}
4
+ elements:
5
+ - elementId: kick
6
+ elementType: text
7
+ bounds: [60, 90, 500, 30]
8
+ content: {text: "PRODUCT · 产品/项目代号", style: "$caption", color: "$cyan"}
9
+ - elementId: title
10
+ elementType: text
11
+ bounds: [60, 140, 840, 130]
12
+ content: {text: "主标题:一句话讲清\n这次发布什么", style: "$title", color: "$white", fontSize: 44, lineHeight: 1.25}
13
+ - elementId: glow
14
+ elementType: shape
15
+ kind: rect
16
+ bounds: [60, 300, 140, 5]
17
+ fill: "$cyan"
18
+ - elementId: subtitle
19
+ elementType: text
20
+ bounds: [60, 330, 840, 40]
21
+ content: {text: "副标题:核心定位 / 一句话价值", style: "$body", color: "$sub", fontSize: 16}
22
+ - elementId: org
23
+ elementType: text
24
+ bounds: [60, 452, 700, 26]
25
+ content: {text: "团队 | 时间 | 版本", style: "$caption"}
26
+ - elementId: dot
27
+ elementType: shape
28
+ kind: ellipse
29
+ bounds: [880, 452, 20, 20]
30
+ fill: "$cyan"
@@ -0,0 +1,25 @@
1
+ pageType: cover
2
+ background: {type: solid, color: "$bg"}
3
+ safeArea: {top: 24, bottom: 24}
4
+ elements:
5
+ - elementId: kick
6
+ elementType: text
7
+ bounds: [60, 90, 500, 30]
8
+ content: {text: "THANK YOU · 感谢", style: "$caption", color: "$cyan"}
9
+ - elementId: title
10
+ elementType: text
11
+ bounds: [60, 140, 840, 90]
12
+ content: {text: "让数据说话,让方案落地", style: "$title", color: "$white", fontSize: 40, bold: true}
13
+ - elementId: glow
14
+ elementType: shape
15
+ kind: rect
16
+ bounds: [60, 260, 140, 5]
17
+ fill: "$cyan"
18
+ - elementId: cta
19
+ elementType: text
20
+ bounds: [60, 300, 840, 40]
21
+ content: {text: "下一步:试点 / 联系 / 答疑", style: "$body", color: "$sub", fontSize: 16}
22
+ - elementId: org
23
+ elementType: text
24
+ bounds: [60, 452, 840, 26]
25
+ content: {text: "团队 | 时间 | 版本", style: "$caption"}
@@ -0,0 +1,80 @@
1
+ pageType: content
2
+ # 流程页母版(深色版):数字节点 + 连线
3
+ expectedOverlaps:
4
+ - {pair: [n1, n1T]}
5
+ - {pair: [n2, n2T]}
6
+ - {pair: [n3, n3T]}
7
+ - {pair: [noteBar, noteT]}
8
+ - {pair: [noteBar, noteBg]}
9
+ expectedOutOfSafeArea: [accentBar, pageTitle]
10
+ elements:
11
+ - elementId: accentBar
12
+ elementType: shape
13
+ kind: rect
14
+ bounds: [0, 0, 8, 46]
15
+ fill: "$cyan"
16
+ - elementId: pageTitle
17
+ elementType: text
18
+ bounds: [20, 10, 700, 30]
19
+ content: {text: "技术流程:输入 → 处理 → 输出", style: "$title", color: "$white", fontSize: 24}
20
+ - elementId: n1
21
+ elementType: shape
22
+ kind: ellipse
23
+ bounds: [60, 120, 48, 48]
24
+ fill: "$cyan"
25
+ - elementId: n1T
26
+ elementType: text
27
+ bounds: [60, 120, 48, 48]
28
+ content: {text: "1", style: "$title", color: "#0F1B2D", fontSize: 20, align: center}
29
+ - elementId: n2
30
+ elementType: shape
31
+ kind: ellipse
32
+ bounds: [410, 120, 48, 48]
33
+ fill: "$cyan"
34
+ - elementId: n2T
35
+ elementType: text
36
+ bounds: [410, 120, 48, 48]
37
+ content: {text: "2", style: "$title", color: "#0F1B2D", fontSize: 20, align: center}
38
+ - elementId: n3
39
+ elementType: shape
40
+ kind: ellipse
41
+ bounds: [760, 120, 48, 48]
42
+ fill: "$cyan"
43
+ - elementId: n3T
44
+ elementType: text
45
+ bounds: [760, 120, 48, 48]
46
+ content: {text: "3", style: "$title", color: "#0F1B2D", fontSize: 20, align: center}
47
+ - elementId: l1
48
+ elementType: line
49
+ points: [[110, 144], [408, 144]]
50
+ line: {color: "$chip", width: 3}
51
+ - elementId: l2
52
+ elementType: line
53
+ points: [[460, 144], [758, 144]]
54
+ line: {color: "$chip", width: 3}
55
+ - elementId: s1
56
+ elementType: text
57
+ bounds: [50, 200, 260, 140]
58
+ content: {text: "输入数据/信号\n描述:来源与口径。", style: "$body", color: "$white", fontSize: 14}
59
+ - elementId: s2
60
+ elementType: text
61
+ bounds: [400, 200, 260, 140]
62
+ content: {text: "算法/模型处理\n描述:方法与参数。", style: "$body", color: "$white", fontSize: 14}
63
+ - elementId: s3
64
+ elementType: text
65
+ bounds: [760, 200, 190, 140]
66
+ content: {text: "结果/服务输出\n描述:形态与接入。", style: "$body", color: "$white", fontSize: 14}
67
+ - elementId: noteBar
68
+ elementType: shape
69
+ kind: roundRect
70
+ bounds: [60, 400, 840, 70]
71
+ fill: "$card"
72
+ - elementId: noteT
73
+ elementType: text
74
+ bounds: [84, 416, 800, 40]
75
+ content: {text: "一句话结论:该流程的关键价值", style: "$body", color: "$cyan"}
76
+ - elementId: noteBg
77
+ elementType: shape
78
+ kind: rect
79
+ bounds: [60, 400, 6, 70]
80
+ fill: "$cyan"
Binary file
@@ -0,0 +1,14 @@
1
+ id: tech-dark
2
+ name: 科技深色
3
+ style: 科技发布会 / 高对比
4
+ scene: 产品发布、技术方案、数据中台
5
+ desc: 深底(#0F1B2D)+ 青色强调 + 大圆角卡片 + 细发光线条;适合新技术/数字化主题。
6
+ words: 科技 / 前沿 / 高对比 / 数字化
7
+ colors: ["#0F1B2D", "#22D3EE", "#1E3A5F", "#E2E8F0", "#334155"]
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