dsh-ppt-studio 1.1.5 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +4 -1
  2. package/docs/00-/350/256/276/350/256/241/346/272/220.md +4 -0
  3. package/docs/02-/346/212/200/346/234/257/346/212/245/345/221/212.md +114 -1
  4. package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +149 -0
  5. package/docs/05-/350/277/255/344/273/243/346/265/201/347/250/213.md +23 -0
  6. package/docs/06-/350/257/204/345/256/241/344/270/216/346/265/213/350/257/225.md +2 -1
  7. package/docs/07-/345/244/215/346/235/202/345/233/276/350/203/275/345/212/233/347/253/213/351/241/271/344/270/216/351/243/216/351/231/251/347/231/273/350/256/260.md +319 -0
  8. package/docs/08-/351/230/266/346/256/265A/350/256/276/350/256/241/350/257/264/346/230/216-/347/273/223/346/236/204/345/205/263/347/263/273/344/270/216/345/233/276/344/270/223/345/261/236/346/240/241/351/252/214.md +306 -0
  9. package/docs/09-/344/273/243/347/240/201/345/234/260/345/233/276/344/270/216/346/250/241/345/235/227/350/201/214/350/264/243.md +148 -0
  10. package/docs/10-/345/256/277/344/270/273/350/200/246/345/220/210/347/202/271/346/270/205/345/215/225.md +49 -0
  11. package/docs/11-/346/234/257/350/257/255/350/241/250.md +42 -0
  12. package/docs/12-/345/244/215/346/235/202/345/233/276/351/200/232/350/267/257/347/232/204/351/200/211/346/213/251/344/270/216/351/252/214/346/224/266.md +65 -0
  13. package/docs/13-/345/217/221/347/211/210/345/207/206/345/244/207/350/256/241/345/210/222.md +79 -0
  14. package/docs/14-/345/217/221/345/270/203/346/270/205/345/215/225/357/274/210/350/215/211/347/250/277/357/274/211.md +37 -0
  15. package/docs/17-/346/211/213/347/224/27313/351/241/265/350/255/246/345/221/212/351/200/220/346/235/241/345/244/204/347/275/256.md +102 -0
  16. package/examples/fx/fx-pro/preview/layout.json +12 -0
  17. package/examples/fx/fx-pro/preview/measured.json +1 -1
  18. package/examples/fx/fx-pro.pptx +0 -0
  19. package/examples/fx/seed.pptx +0 -0
  20. package/examples/fx/single.pptx +0 -0
  21. package/examples/fx/spliced.pptx +0 -0
  22. package/examples/smoke/imported/preview-rt/layout.json +3 -0
  23. package/examples/smoke/imported/source.pptx +0 -0
  24. package/examples/smoke/out-smoke.pptx +0 -0
  25. package/examples/smoke/preview/layout.json +3 -0
  26. package/lib/group-render.js +177 -0
  27. package/lib/msrender.js +27 -12
  28. package/lib/pptd/blocks.js +52 -0
  29. package/lib/pptd/export-pptx.js +266 -11
  30. package/lib/pptd/layout.js +54 -3
  31. package/lib/pptd/line-rules.js +259 -0
  32. package/lib/pptd/line-text-rule.js +90 -0
  33. package/lib/pptd/relations.js +615 -0
  34. package/lib/pptd/render-html.js +19 -1
  35. package/lib/pptd/route-geometry.js +120 -0
  36. package/lib/pptd/schema.js +146 -11
  37. package/lib/pptd/style-profile.js +133 -0
  38. package/lib/scaffold.js +54 -1
  39. package/lib/tools.js +20 -2
  40. package/lib/verify.js +69 -1
  41. package/package.json +20 -3
  42. package/scripts/audit-manual-facts.mjs +15 -3
  43. package/scripts/bench-diagram-scale.mjs +165 -0
  44. package/scripts/check-generators.mjs +22 -0
  45. package/scripts/check-lib-sync.mjs +33 -0
  46. package/scripts/check-line-text.mjs +30 -0
  47. package/scripts/check-package.mjs +60 -0
  48. package/scripts/check-removed-traces.mjs +37 -0
  49. package/scripts/check-syntax.mjs +44 -0
  50. package/scripts/check-unknown-keys.mjs +114 -0
  51. package/scripts/fixtures/handdrawn-baseline.json +177 -0
  52. package/scripts/fixtures/prompt-cost-baseline.json +178 -0
  53. package/scripts/handdrawn-option-probe.mjs +78 -0
  54. package/scripts/probe-prompt-cost.mjs +127 -0
  55. package/scripts/red-probe.mjs +75 -0
  56. package/scripts/render-group.mjs +72 -0
  57. package/scripts/smoke.mjs +183 -12
  58. package/scripts/test-fast.mjs +108 -0
  59. package/scripts/test-map.mjs +162 -0
  60. package/scripts/test-release.mjs +64 -0
  61. package/scripts/verify-diagram-relations.mjs +405 -0
  62. package/scripts/verify-handdrawn.mjs +115 -0
  63. package/scripts/verify-handwritten.mjs +203 -0
  64. package/scripts/verify-primitives.mjs +714 -0
  65. package/scripts/verify-products.mjs +37 -0
  66. package/scripts/verify-shape.mjs +84 -0
  67. package/scripts/visual-pair-batch.mjs +77 -0
  68. package/skills/diagram-drawing/SKILL.md +23 -0
  69. package/skills/diagram-drawing/capability-matrix.md +22 -0
  70. package/skills/diagram-drawing/composition.md +22 -0
  71. package/skills/diagram-drawing/mechanisms.md +141 -0
  72. package/skills/diagram-drawing/pitfalls.md +89 -0
  73. package/skills/diagram-drawing/routing.md +17 -0
  74. package/skills/diagram-drawing/text-and-spacing.md +16 -0
  75. package/skills/diagram-drawing/verify.md +50 -0
  76. package/skills/diagrams/compare.md +24 -0
  77. package/skills/diagrams/flow.md +24 -0
  78. package/skills/diagrams/funnel.md +25 -0
  79. package/skills/diagrams/layers.md +18 -0
  80. package/skills/diagrams/loop.md +25 -0
  81. package/skills/diagrams/matrix.md +23 -0
  82. package/skills/diagrams/sequence.md +17 -0
  83. package/skills/diagrams/state.md +34 -0
  84. package/skills/diagrams/steps-ring.md +24 -0
  85. package/skills/diagrams/swimlane.md +23 -0
  86. package/skills/diagrams/timeline.md +24 -0
  87. package/skills/diagrams/tree.md +24 -0
  88. package/skills/ppt-studio-manual/SKILL.md +2 -2
  89. package/templates/academic-white/preview.png +0 -0
  90. package/templates/business-blue/preview.png +0 -0
  91. package/templates/pitch-bold/preview.png +0 -0
  92. package/templates/tech-dark/preview.png +0 -0
@@ -0,0 +1,24 @@
1
+ # 流程图(flow)· 手画配方
2
+
3
+ ## 骨架
4
+ 横向流程:起止 roundRect、中间 rect;末步 accent;**异常分支用回边并标条件**。
5
+
6
+ ## 配方数值
7
+ 节点 150×64 @ y=208,x=60 起、间距 22(5 个正好排满 60..898);节点文字 14pt bold 白字居中。
8
+ 主链箭头 accent 宽 2、端点贴卡边。
9
+ 回边:自前一步**底边**下探到 y=360 车道 → 左行 → 上扎目标步底边;虚线 + 末端箭头;条件标签放车道**上方**(y=332)。
10
+
11
+ ## 专属坑
12
+ 1. 回边竖管与标签必须分离(标签独占车道上方的行)。
13
+ 2. 分支多时改用"菱形节点 + 两条出边",别把回边画在流程带中间。
14
+
15
+ ## 验收清单
16
+ - [ ] 门禁 0 错;[ ] 主链方向一致;[ ] 回边有明确条件标签。
17
+
18
+ ## 本族应调用的机制(先读 mechanisms.md)
19
+
20
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
21
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
22
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
23
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
24
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -0,0 +1,25 @@
1
+ # 漏斗(funnel)· 手画配方
2
+
3
+ ## 骨架
4
+ 用 **custGeom 梯形**逐段收窄(矩形堆叠是台阶,不是漏斗)。
5
+
6
+ ## 配方数值
7
+ 段 bounds [80, 148+i×70, 800, 70];段内标签**限宽** = min(上宽,下宽) − 60 且居中。
8
+ 示例上/下宽:760→560→360→200→100(末段 accent)。
9
+ path:w:800、h:70;moveTo[(800−wTop)/2,0] → lnTo[(800+wTop)/2,0] → lnTo[(800+wBot)/2,70] → lnTo[(800−wBot)/2,70] → close。
10
+
11
+ ## 专属坑
12
+ 1. 段间边界相接(下段上宽 = 上段下宽),相接不算重叠。
13
+ 2. 标签必须落在梯形内部 ⇒ 必须限宽。
14
+ 3. 段太薄时宁可省略段内文字。
15
+
16
+ ## 验收清单
17
+ - [ ] 门禁 0 错;[ ] 两侧斜边连续;[ ] 每段文字在梯形内。
18
+
19
+ ## 本族应调用的机制(先读 mechanisms.md)
20
+
21
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
22
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
23
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
24
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
25
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -0,0 +1,18 @@
1
+ # 分层架构(layers)· 手画配方
2
+
3
+ ## 骨架
4
+ 左侧**层标签芯片**(窄条)+ 右侧**层内容带**(长条,软填充),自上而下 N 层;层间用竖直箭头表示"上行/下行"。
5
+ - 标题 (60,34);层带 x=150,w=740,h=72,y=130 起,层距 88。
6
+ - 层芯片:x=70,w=70,h=72,fill 主色,白字 13pt(竖排或居中均可)。
7
+ - 层带:fill 暖白/浅紫(如 #EDE9FE),**必须把芯片与带内卡片写进 contains**。
8
+ - 带内卡片:白底 roundRect(h=44,y=层带+14),文字 12pt 深色;一个带放 1–2 张。
9
+ - 层间箭头:从上一带底边中点到下一带顶边,**端点正好落在带边**,宽 2,主色。
10
+
11
+ ## 专属坑
12
+ 1. **带内卡片压带边**:卡片要留 14px 内边距;带内卡片也各写自己的 contains。
13
+ 2. **层间箭头穿过带**:箭头只在带与带之间的空隙里,不要跨带。
14
+ 3. 层数 ≥5 时把 h 压到 62、层距压到 74,否则底部溢出安全区。
15
+
16
+ ## 验收清单
17
+ - [ ] 每层"芯片 + 带 + 带内卡片"三层包含关系都声明;[ ] 层间箭头两端贴带边;
18
+ - [ ] 看图能一眼数清层数;[ ] 带内文字对比度 ≥3:1(浅底用深字)。
@@ -0,0 +1,25 @@
1
+ # 闭环(loop)· 手画配方
2
+
3
+ ## 骨架
4
+ N 个步骤卡沿**椭圆环**分布,箭头沿环指向下一步;环心留空(放文字会被线压)。
5
+
6
+ ## 配方数值
7
+ 中心 (480,320),rx=250、ry=132;卡 170×52;角度 = −90° + i×(360/N)。
8
+ 卡 x = 480 + rx·cosθ − 85,y = 320 + ry·sinθ − 26。
9
+ 箭头沿"卡心→下一卡心"方向,从**卡边**裁剪(off≈96)到下一卡卡边;高亮其中一步。
10
+
11
+ ## 专属坑
12
+ 1. 端点必须落在卡边(落卡内 ⇒ 门禁报"卡 × 线")。
13
+ 2. 环心留白;必须有中心文字时把箭头改走环外侧。
14
+ 3. N≥5 时 rx 加到 270、卡宽降到 150。
15
+
16
+ ## 验收清单
17
+ - [ ] 门禁 0 错;[ ] 箭头首尾接成环;[ ] 环心无遮挡。
18
+
19
+ ## 本族应调用的机制(先读 mechanisms.md)
20
+
21
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
22
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
23
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
24
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
25
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -0,0 +1,23 @@
1
+ # 矩阵(matrix)· 手画配方
2
+
3
+ ## 骨架
4
+ **列 = 处置力度,行 = 频次**;每个条目独占一格(别用通用象限名代替处置档,否则丢信息维度)。
5
+
6
+ ## 配方数值
7
+ 列头 14pt bold @ y=158、宽 230 居中;行标 13pt bold @ x=60、宽 90、行内垂直居中。
8
+ 格 roundRect 230×120:列 x=160/410/660,行 y=190/330;最高优先级那格用 accent,其余主色;格内 15pt bold 白字。
9
+
10
+ ## 专属坑
11
+ 1. 每格写进自身 contains;若用外层容器,容器要登记所有格。
12
+ 2. 3 列 × 230 已是安全区上限。
13
+
14
+ ## 验收清单
15
+ - [ ] 门禁 0 错;[ ] 列头/行标齐备;[ ] 高亮唯一。
16
+
17
+ ## 本族应调用的机制(先读 mechanisms.md)
18
+
19
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
20
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
21
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
22
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
23
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -0,0 +1,17 @@
1
+ # 时序图(sequence)· 手画配方
2
+
3
+ ## 骨架
4
+ 顶部一排**参与者头卡**(等宽)+ 每人一条**虚线生命线**(垂直到页底)+ 自上而下的**消息箭头**(实线,标签在箭头上方)。
5
+ - 标题 (60,34);头卡 w=170,h=48,y=110,x=70 起,间距 35(4 人占 70..890)。
6
+ - 生命线:从头卡底边中点到 y=470,`dash: dash`,颜色 #94A3B8,宽 1。
7
+ - 消息:y=200/245/290/335/380 逐条下移;从发送者生命线到接收者生命线,**端点正好落在生命线上**,end 箭头;
8
+ 标签放在箭头**上方 6px**、居中于两端之间,宽 = |x2−x1|,11pt。
9
+ - 自环消息(自己给自己):向右折 30px 再回来(三折线),标签放右侧。
10
+
11
+ ## 专属坑
12
+ 1. **箭头压生命线**:箭头端点落在线上即可,不要越过。
13
+ 2. **标签互相压**:相邻两条消息的 y 至少差 40;标签只占箭头正上方一行。
14
+ 3. **消息方向看错**:箭头必须在**接收者**那一端(`arrow: true` + points 的终点是接收者)。
15
+
16
+ ## 验收清单
17
+ - [ ] 每条消息能读出"谁→谁、什么消息";[ ] 生命线不被文字压;[ ] 头和生命线同一条 x 中心。
@@ -0,0 +1,34 @@
1
+ # 状态机(state)· 手画配方
2
+
3
+ ## 骨架
4
+ 横向一行状态卡 + 卡间箭头 + **回边(返工/异常)走卡片外侧车道**;或竖向一列(见下)。
5
+ - 5 状态:卡 150×84,y=240,x=60 起,间距 20 ⇒ 卡心 y=282,卡底 y=324。
6
+ - 卡内:标题 16pt bold(居中或齐左)+ 副标题 11pt 灰;**卡内文字必须写进卡的 `contains`**。
7
+ - 卡间:短箭头,端点**正好落在卡右边到下一卡左边**,y=卡心;颜色取 accent,宽 1.5–2。
8
+ - 回边:从源卡**下边**出 → 下垂到 **y=400 车道** → 左行 → 上扎到目标卡**下边**;虚线 + 末端箭头。
9
+ - 回边标签放在**车道上方**(如 y=372,高 20),**绝不放车道上**(会压线)。
10
+
11
+ ## 标签(最容易漏)
12
+ **主链每条转移都要标签**,放在箭头**上方**(y = 卡顶 − 28),宽 80 居中于箭头中点;只标回边不标主链 ⇒ 内容就丢了(实测)。
13
+
14
+ ## 竖向变体(状态多、副标题长时更好看)
15
+ 一列 5 卡(470×68 / gap 26 / x=300);内联编号圆徽 24px @ (x+16, y+12);标题 x+50/y+10 16pt bold;副标题 x+50/y+38 11pt;卡间用**向下**箭头 3px;回边走左侧 x−40 虚线。
16
+ > 实测:这一版观感明显好于横向行(层级清楚、留白够)。优先考虑竖向。
17
+
18
+ ## 该族专属坑
19
+ 1. **回边竖管压标签带**:竖管必须让开卡下标签带;把车道整体下移(≥ 标签带高 + 8px)。
20
+ 2. **回边端点画在卡内**(如 x+6)⇒ 门禁报 `unexpected-overlap`;端点必须**落在卡边**。
21
+ 3. **箭头值只有** `true|false|'end'|'both'`;`'start'` 非法。
22
+ 4. 自环/回边**不要跨过卡片区**;多回边时按 18px 递增错开车道。
23
+
24
+ ## 验收清单
25
+ - [ ] `verifyDeck` 0 错;[ ] 每条边都能**用眼睛指出**从哪张卡到哪张卡;
26
+ - [ ] 回边车道不压任何文字;[ ] 卡内文字不溢出(长标签要缩字号或加宽卡)。
27
+
28
+ ## 本族应调用的机制(先读 mechanisms.md)
29
+
30
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
31
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
32
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
33
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
34
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -0,0 +1,24 @@
1
+ # 步骤环(steps-ring)· 手画配方
2
+
3
+ ## 两种画法
4
+ 1. **卡片环**(快):N 张卡沿椭圆分布 + 沿环直箭头(数值见 loop.md)。
5
+ 2. **真圆 + 编号点**(更雅,旧版用的,**优先**):ellipse 浅填充+主色描边 + 圆周上编号小圆点 + 圆外标签。
6
+
7
+ ## 真圆数值
8
+ 圆 ellipse 中心 (480,300)、r=190 ⇒ bounds [290,110,380,380];fill 浅紫、line 主色 1.5。
9
+ 编号点 ellipse 46×46 在圆周(角度 = −90° + i×360/N),点内序号 bold 白字;标签在半径+70 处 12pt。
10
+
11
+ ## 专属坑
12
+ 1. 编号点写进圆的 contains,或干脆都不声明 contains(避免"未真正包含")。
13
+ 2. 标签与编号点至少留 24px。
14
+
15
+ ## 验收清单
16
+ - [ ] 门禁 0 错;[ ] 序号顺序可读;[ ] 圆与点同心。
17
+
18
+ ## 本族应调用的机制(先读 mechanisms.md)
19
+
20
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
21
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
22
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
23
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
24
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -0,0 +1,23 @@
1
+ # 泳道图(swimlane)· 手画配方
2
+
3
+ ## 骨架
4
+ 左泳道名芯片 + 右侧泳道带;任务卡按角色落到对应道;跨道连线允许穿带(**必须声明**)。
5
+
6
+ ## 配方数值
7
+ 芯片 roundRect 96×72 @ x=60;道 i 的 y=156+i×84。带 rect 780×72 @ x=156(同 y),奇数道浅紫、偶数道白底。
8
+ 任务卡 roundRect 110×44(文字 11pt bold),首卡 x=176、间距 124。
9
+
10
+ ## 专属坑
11
+ 1. **带的 contains 要列出本道全部任务卡与其文字**(否则报"背景压内容")。
12
+ 2. 跨道连线只把**真正相交**的对写进 expectedOverlaps(过声明会产生 declared-stale 噪音)。
13
+
14
+ ## 验收清单
15
+ - [ ] 门禁 0 错;[ ] 归属一眼可辨;[ ] 声明清单无 stale。
16
+
17
+ ## 本族应调用的机制(先读 mechanisms.md)
18
+
19
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
20
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
21
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
22
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
23
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -0,0 +1,24 @@
1
+ # 时间轴(timeline)· 手画配方
2
+
3
+ ## 骨架
4
+ 水平主轴 + 等距里程碑点 + 标签**上下交替**。
5
+
6
+ ## 配方数值
7
+ 主轴 line @ y=300、x 70→890、宽 3;里程碑 ellipse 18×18,x=90 起、间距 156。
8
+ 标签宽 140 居中:名称 14pt bold + 说明 11pt 灰;奇数在上(y=300−96),偶数在下(y=300+34);刻度短线 1px。
9
+ **只高亮一个**关键节点(accent)。
10
+
11
+ ## 专属坑
12
+ 1. 6 个以上要缩间距或改两行;标签超 140 宽会互压。
13
+ 2. 全部高亮 = 没有重点。
14
+
15
+ ## 验收清单
16
+ - [ ] 门禁 0 错;[ ] 标签不重叠;[ ] 高亮唯一。
17
+
18
+ ## 本族应调用的机制(先读 mechanisms.md)
19
+
20
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
21
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
22
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
23
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
24
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -0,0 +1,24 @@
1
+ # 层级树(tree)· 手画配方
2
+
3
+ ## 骨架
4
+ 根居顶中 → 一级一行 → 叶一行;连线用**正交折线 + 箭头**。
5
+
6
+ ## 配方数值(安全区 60..900 / 60..480)
7
+ 根 roundRect 200×64 @ (380,124);一级 170×52 @ y=258(x=90/395/700);叶 150×48 @ y=380。
8
+ 连线自根底边 y=188 起 → 主干 y=220 → 落到子节点顶边;**arrow: true**。
9
+
10
+ ## 专属坑
11
+ 1. 同组子树应加**分组容器**(旧版胜过手画版之处);容器要把内部所有元素写进 contains,连线穿容器按纪律精确声明。
12
+ 2. 父盒加高后子文本要一起重排,否则 contains 不成立。
13
+ 3. 连线端点落在**卡边**,不要落在卡内。
14
+
15
+ ## 验收清单
16
+ - [ ] 门禁 0 错;[ ] 每条连线有箭头且贴边;[ ] 组容器登记了内部元素。
17
+
18
+ ## 本族应调用的机制(先读 mechanisms.md)
19
+
20
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
21
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
22
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
23
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
24
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
@@ -48,7 +48,7 @@ DSH 上做 PPT 的工作区:说需求 → 四类任务工作流 → 「数字
48
48
  - 元素通用:`elementId`(页内唯一)、`elementType: text|shape|line|image|table|chart`、`bounds: [x,y,w,h]`(line 可省,由 points 推导)、`role: background|content|decoration`。
49
49
  - text:`content: {text, style: "$name" 或内联样式键}`;**样式键必须在 content 内**。
50
50
  - shape:`kind: rect|roundRect|ellipse|triangle + prst(箭头/菱形/五边形/flowchart…) + custGeom path`;`fill #hex | {color,alpha} | {type: gradient, stops: [{pos,color,alpha}], angle}`;`line {color,width}`;`rotation`。
51
- - line:`points: [[x1,y1],[x2,y2]]`(**每条只有两点**,多点折线不支持——时间轴/折线拆成首尾相接的多条 line);`arrow: true`(箭头在第二个点那一端)。
51
+ - line:`points: [[x1,y1],…]`(≥2 点,>2 点为折线);`arrow: true|'both'`;`line.dash`;`attach` 可锚到元素边(阶段 A)。
52
52
  - image:`src: "media/xx.png"`;`fit: cover|contain|fill`。
53
53
  - table:`cols: [列名...]`、`rows: [[..]]`、`header: true|false`。
54
54
  - chart:`chart: {type: bar|line|pie, data: {cols: [列名…], rows: [[…]]}, series: [{name,x,y}](多系列时显式写), colors}`。
@@ -97,7 +97,7 @@ DSH 上做 PPT 的工作区:说需求 → 四类任务工作流 → 「数字
97
97
  ## 7. 开发维护(仅改插件时用)
98
98
 
99
99
  - 改码:`src/` → `node scripts/build.mjs` → **重启 host**(插件经 agent preset 会话装配;`dev_reload_package` 只覆盖注入器装配包,且注入器 junction 已存在时会指向旧安装根)。
100
- - 回归:`node scripts/smoke.mjs`(303 断言)→ `node scripts/preflight-1.0.mjs`(发布预检)→ `node scripts/regression-real.mjs`。
100
+ - 回归:`node scripts/smoke.mjs`(322 断言)→ `node scripts/preflight-1.0.mjs`(发布预检)→ `node scripts/regression-real.mjs`。
101
101
  - 跨层验证纪律:**预览层与成品层必须互相验证**——`ppt_render`+`ppt_verify` 只管 HTML/估算层,OOXML 层靠 `ppt_export` 的 parity 自证(表/图/线方向)+ `ppt_visual` 真渲染抽检;只跑单层会漏掉"预览对、成品错"(2026-09-14 连线方向事故)。
102
102
  - 文档链:改需求/决策 → docs/01;改机制 → docs/02;每次 → docs/03;验收 → docs/04;发布前 → docs/06。
103
103
  - 装配:**默认装法是 npm 包名**(`dsh plugin --profile <p> add dsh-ppt-studio`,profile 级、随 profile 启动装配;**桌面端**在插件管理里填同一个包名 `dsh-ppt-studio`;GitHub Release 的资产 URL 与 `scripts/install*.mjs` 是离线/归档备选)。装完**必须重启 host**。排查:`dsh plugin --profile web list` → `dsh --profile web --dump-config` 找 `ppt-studio` 行。preset 插件行只在"离线 junction"场景用,与 bundle 装法**互斥**。
Binary file
Binary file
Binary file