w-flowchart 1.0.0 → 1.0.2

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 (435) hide show
  1. package/README.md +5 -1
  2. package/dist/w-flowchart.umd.js +2 -2
  3. package/dist/w-flowchart.umd.js.map +1 -1
  4. package/docs/WFlowchart.mjs.html +169 -0
  5. package/docs/global.html +657 -0
  6. package/docs/index.html +2 -2
  7. package/package.json +52 -49
  8. package/src/WFlowchart.mjs +97 -0
  9. package/src/p1/README.md +2 -2
  10. package/src/p1/gen.mjs +54 -20
  11. package/src/p10/README.md +6 -2
  12. package/src/p10/gen.mjs +235 -15
  13. package/src/p2/README.md +1 -1
  14. package/src/p2/gen.mjs +52 -7
  15. package/src/p3/README.md +1 -1
  16. package/src/p3/gen.mjs +24 -2
  17. package/src/p4/README.md +1 -1
  18. package/src/p4/gen.mjs +36 -10
  19. package/src/p5/README.md +1 -1
  20. package/src/p5/gen.mjs +45 -18
  21. package/src/p6/README.md +1 -1
  22. package/src/p6/gen.mjs +108 -5
  23. package/src/p7/README.md +1 -1
  24. package/src/p7/gen.mjs +42 -3
  25. package/src/p8/README.md +1 -1
  26. package/src/p8/gen.mjs +41 -2
  27. package/src/p9/README.md +1 -1
  28. package/src/p9/gen.mjs +14 -7
  29. package/src/p9/page9.html +13 -5
  30. package/test/cases-diamond.mjs +221 -0
  31. package/test/cases.mjs +17 -1
  32. package/test/data//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.json +43 -0
  33. package/test/data//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.json +132 -0
  34. package/test/data//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.json +27 -0
  35. package/test/data//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.json +111 -0
  36. package/test/data//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.json +117 -0
  37. package/test/data//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.json +203 -0
  38. package/test/data//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.json +156 -0
  39. package/test/data//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.json +46 -0
  40. package/test/data//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.json +137 -0
  41. package/test/data//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.json +28 -0
  42. package/test/data//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.json +134 -0
  43. package/test/data//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.json +178 -0
  44. package/test/figures.mjs +3 -2
  45. package/test/lib.mjs +3 -1
  46. package/test/p1.test.mjs +5 -0
  47. package/test/p10.test.mjs +54 -2
  48. package/test/p2.test.mjs +5 -0
  49. package/test/p3.test.mjs +5 -0
  50. package/test/p4.test.mjs +5 -0
  51. package/test/p5.test.mjs +6 -0
  52. package/test/p6.test.mjs +5 -0
  53. package/test/p7.test.mjs +5 -0
  54. package/test/p8.test.mjs +5 -0
  55. package/test/p9.test.mjs +5 -0
  56. package/test/pics/p1/cycle.png +0 -0
  57. package/test/pics/p1/deep-nest.png +0 -0
  58. package/test/pics/p1/diamond.png +0 -0
  59. package/test/pics/p1/edges-mix.png +0 -0
  60. package/test/pics/p1/english.png +0 -0
  61. package/test/pics/p1/flat-tb.png +0 -0
  62. package/test/pics/p1/fold-tall.png +0 -0
  63. package/test/pics/p1/fold-wide.png +0 -0
  64. package/test/pics/p1/group-edge.png +0 -0
  65. package/test/pics/p1/items-node.png +0 -0
  66. package/test/pics/p1/long-label.png +0 -0
  67. package/test/pics/p1/lr-flat.png +0 -0
  68. package/test/pics/p1/nested-group.png +0 -0
  69. package/test/pics/p1/no-edges.png +0 -0
  70. package/test/pics/p1/title-overflow.png +0 -0
  71. package/test/pics/p1/valign.png +0 -0
  72. package/test/pics/p1//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  73. package/test/pics/p1//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  74. package/test/pics/p1//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  75. package/test/pics/p1//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  76. package/test/pics/p1//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  77. package/test/pics/p1//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  78. package/test/pics/p1//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  79. package/test/pics/p1//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  80. package/test/pics/p1//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  81. package/test/pics/p1//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  82. package/test/pics/p1//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  83. package/test/pics/p1//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  84. package/test/pics/p10/cycle.png +0 -0
  85. package/test/pics/p10/cycle.svg +1 -0
  86. package/test/pics/p10/deep-nest.svg +1 -0
  87. package/test/pics/p10/dia-1in-1out.png +0 -0
  88. package/test/pics/p10/dia-1in-1out.svg +1 -0
  89. package/test/pics/p10/dia-1in-2out.png +0 -0
  90. package/test/pics/p10/dia-1in-2out.svg +1 -0
  91. package/test/pics/p10/dia-1in.png +0 -0
  92. package/test/pics/p10/dia-1in.svg +1 -0
  93. package/test/pics/p10/dia-1out.png +0 -0
  94. package/test/pics/p10/dia-1out.svg +1 -0
  95. package/test/pics/p10/dia-2in-1out.png +0 -0
  96. package/test/pics/p10/dia-2in-1out.svg +1 -0
  97. package/test/pics/p10/dia-2in-2out-dd.png +0 -0
  98. package/test/pics/p10/dia-2in-2out-dd.svg +1 -0
  99. package/test/pics/p10/dia-2in-2out-ss.png +0 -0
  100. package/test/pics/p10/dia-2in-2out-ss.svg +1 -0
  101. package/test/pics/p10/dia-2in.png +0 -0
  102. package/test/pics/p10/dia-2in.svg +1 -0
  103. package/test/pics/p10/dia-2out.png +0 -0
  104. package/test/pics/p10/dia-2out.svg +1 -0
  105. package/test/pics/p10/diamond.png +0 -0
  106. package/test/pics/p10/diamond.svg +1 -0
  107. package/test/pics/p10/edges-mix.png +0 -0
  108. package/test/pics/p10/edges-mix.svg +1 -0
  109. package/test/pics/p10/english.png +0 -0
  110. package/test/pics/p10/english.svg +1 -0
  111. package/test/pics/p10/flat-tb.svg +1 -0
  112. package/test/pics/p10/fold-tall.svg +1 -0
  113. package/test/pics/p10/fold-wide.svg +1 -0
  114. package/test/pics/p10/group-edge.png +0 -0
  115. package/test/pics/p10/group-edge.svg +1 -0
  116. package/test/pics/p10/items-node.svg +1 -0
  117. package/test/pics/p10/long-label.svg +1 -0
  118. package/test/pics/p10/lr-flat.svg +1 -0
  119. package/test/pics/p10/nested-group.png +0 -0
  120. package/test/pics/p10/nested-group.svg +1 -0
  121. package/test/pics/p10/no-edges.svg +1 -0
  122. package/test/pics/p10/title-overflow.svg +1 -0
  123. package/test/pics/p10/valign.svg +1 -0
  124. package/test/pics/p10//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  125. package/test/pics/p10//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.svg +1 -0
  126. package/test/pics/p10//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  127. package/test/pics/p10//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.svg +1 -0
  128. package/test/pics/p10//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  129. package/test/pics/p10//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.svg +1 -0
  130. package/test/pics/p10//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  131. package/test/pics/p10//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.svg +1 -0
  132. package/test/pics/p10//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  133. package/test/pics/p10//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.svg +1 -0
  134. package/test/pics/p10//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  135. package/test/pics/p10//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.svg +1 -0
  136. package/test/pics/p10//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  137. package/test/pics/p10//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.svg +1 -0
  138. package/test/pics/p10//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  139. package/test/pics/p10//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.svg +1 -0
  140. package/test/pics/p10//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  141. package/test/pics/p10//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.svg +1 -0
  142. package/test/pics/p10//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  143. package/test/pics/p10//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.svg +1 -0
  144. package/test/pics/p10//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  145. package/test/pics/p10//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.svg +1 -0
  146. package/test/pics/p10//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  147. package/test/pics/p10//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.svg +1 -0
  148. package/test/pics/p2/cycle.png +0 -0
  149. package/test/pics/p2/deep-nest.png +0 -0
  150. package/test/pics/p2/diamond.png +0 -0
  151. package/test/pics/p2/edges-mix.png +0 -0
  152. package/test/pics/p2/english.png +0 -0
  153. package/test/pics/p2/flat-tb.png +0 -0
  154. package/test/pics/p2/fold-tall.png +0 -0
  155. package/test/pics/p2/fold-wide.png +0 -0
  156. package/test/pics/p2/group-edge.png +0 -0
  157. package/test/pics/p2/items-node.png +0 -0
  158. package/test/pics/p2/long-label.png +0 -0
  159. package/test/pics/p2/lr-flat.png +0 -0
  160. package/test/pics/p2/nested-group.png +0 -0
  161. package/test/pics/p2/no-edges.png +0 -0
  162. package/test/pics/p2/title-overflow.png +0 -0
  163. package/test/pics/p2/valign.png +0 -0
  164. package/test/pics/p2//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  165. package/test/pics/p2//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  166. package/test/pics/p2//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  167. package/test/pics/p2//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  168. package/test/pics/p2//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  169. package/test/pics/p2//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  170. package/test/pics/p2//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  171. package/test/pics/p2//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  172. package/test/pics/p2//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  173. package/test/pics/p2//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  174. package/test/pics/p2//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  175. package/test/pics/p2//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  176. package/test/pics/p3/cycle.png +0 -0
  177. package/test/pics/p3/deep-nest.png +0 -0
  178. package/test/pics/p3/diamond.png +0 -0
  179. package/test/pics/p3/edges-mix.png +0 -0
  180. package/test/pics/p3/english.png +0 -0
  181. package/test/pics/p3/flat-tb.png +0 -0
  182. package/test/pics/p3/fold-tall.png +0 -0
  183. package/test/pics/p3/fold-wide.png +0 -0
  184. package/test/pics/p3/group-edge.png +0 -0
  185. package/test/pics/p3/items-node.png +0 -0
  186. package/test/pics/p3/long-label.png +0 -0
  187. package/test/pics/p3/lr-flat.png +0 -0
  188. package/test/pics/p3/nested-group.png +0 -0
  189. package/test/pics/p3/no-edges.png +0 -0
  190. package/test/pics/p3/title-overflow.png +0 -0
  191. package/test/pics/p3/valign.png +0 -0
  192. package/test/pics/p3//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  193. package/test/pics/p3//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  194. package/test/pics/p3//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  195. package/test/pics/p3//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  196. package/test/pics/p3//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  197. package/test/pics/p3//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  198. package/test/pics/p3//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  199. package/test/pics/p3//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  200. package/test/pics/p3//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  201. package/test/pics/p3//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  202. package/test/pics/p3//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  203. package/test/pics/p3//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  204. package/test/pics/p4/cycle.png +0 -0
  205. package/test/pics/p4/deep-nest.png +0 -0
  206. package/test/pics/p4/diamond.png +0 -0
  207. package/test/pics/p4/edges-mix.png +0 -0
  208. package/test/pics/p4/english.png +0 -0
  209. package/test/pics/p4/flat-tb.png +0 -0
  210. package/test/pics/p4/fold-tall.png +0 -0
  211. package/test/pics/p4/fold-wide.png +0 -0
  212. package/test/pics/p4/group-edge.png +0 -0
  213. package/test/pics/p4/items-node.png +0 -0
  214. package/test/pics/p4/long-label.png +0 -0
  215. package/test/pics/p4/lr-flat.png +0 -0
  216. package/test/pics/p4/nested-group.png +0 -0
  217. package/test/pics/p4/no-edges.png +0 -0
  218. package/test/pics/p4/title-overflow.png +0 -0
  219. package/test/pics/p4/valign.png +0 -0
  220. package/test/pics/p4//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  221. package/test/pics/p4//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  222. package/test/pics/p4//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  223. package/test/pics/p4//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  224. package/test/pics/p4//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  225. package/test/pics/p4//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  226. package/test/pics/p4//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  227. package/test/pics/p4//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  228. package/test/pics/p4//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  229. package/test/pics/p4//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  230. package/test/pics/p4//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  231. package/test/pics/p4//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  232. package/test/pics/p5/cycle.png +0 -0
  233. package/test/pics/p5/deep-nest.png +0 -0
  234. package/test/pics/p5/diamond.png +0 -0
  235. package/test/pics/p5/edges-mix.png +0 -0
  236. package/test/pics/p5/english.png +0 -0
  237. package/test/pics/p5/flat-tb.png +0 -0
  238. package/test/pics/p5/fold-tall.png +0 -0
  239. package/test/pics/p5/fold-wide.png +0 -0
  240. package/test/pics/p5/group-edge.png +0 -0
  241. package/test/pics/p5/items-node.png +0 -0
  242. package/test/pics/p5/long-label.png +0 -0
  243. package/test/pics/p5/lr-flat.png +0 -0
  244. package/test/pics/p5/nested-group.png +0 -0
  245. package/test/pics/p5/no-edges.png +0 -0
  246. package/test/pics/p5/title-overflow.png +0 -0
  247. package/test/pics/p5/valign.png +0 -0
  248. package/test/pics/p5//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  249. package/test/pics/p5//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  250. package/test/pics/p5//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  251. package/test/pics/p5//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  252. package/test/pics/p5//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  253. package/test/pics/p5//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  254. package/test/pics/p5//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  255. package/test/pics/p5//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  256. package/test/pics/p5//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  257. package/test/pics/p5//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  258. package/test/pics/p5//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  259. package/test/pics/p5//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  260. package/test/pics/p6/cycle.png +0 -0
  261. package/test/pics/p6/deep-nest.png +0 -0
  262. package/test/pics/p6/diamond.png +0 -0
  263. package/test/pics/p6/edges-mix.png +0 -0
  264. package/test/pics/p6/english.png +0 -0
  265. package/test/pics/p6/flat-tb.png +0 -0
  266. package/test/pics/p6/fold-tall.png +0 -0
  267. package/test/pics/p6/fold-wide.png +0 -0
  268. package/test/pics/p6/group-edge.png +0 -0
  269. package/test/pics/p6/items-node.png +0 -0
  270. package/test/pics/p6/long-label.png +0 -0
  271. package/test/pics/p6/lr-flat.png +0 -0
  272. package/test/pics/p6/nested-group.png +0 -0
  273. package/test/pics/p6/no-edges.png +0 -0
  274. package/test/pics/p6/title-overflow.png +0 -0
  275. package/test/pics/p6/valign.png +0 -0
  276. package/test/pics/p6//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  277. package/test/pics/p6//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  278. package/test/pics/p6//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  279. package/test/pics/p6//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  280. package/test/pics/p6//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  281. package/test/pics/p6//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.alt.png +0 -0
  282. package/test/pics/p6//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.new.png +0 -0
  283. package/test/pics/p6//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  284. package/test/pics/p6//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  285. package/test/pics/p6//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  286. package/test/pics/p6//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  287. package/test/pics/p6//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  288. package/test/pics/p6//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  289. package/test/pics/p6//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  290. package/test/pics/p7/cycle.png +0 -0
  291. package/test/pics/p7/deep-nest.png +0 -0
  292. package/test/pics/p7/diamond.png +0 -0
  293. package/test/pics/p7/edges-mix.png +0 -0
  294. package/test/pics/p7/english.png +0 -0
  295. package/test/pics/p7/flat-tb.png +0 -0
  296. package/test/pics/p7/fold-tall.png +0 -0
  297. package/test/pics/p7/fold-wide.png +0 -0
  298. package/test/pics/p7/group-edge.png +0 -0
  299. package/test/pics/p7/items-node.png +0 -0
  300. package/test/pics/p7/long-label.png +0 -0
  301. package/test/pics/p7/lr-flat.png +0 -0
  302. package/test/pics/p7/nested-group.png +0 -0
  303. package/test/pics/p7/no-edges.png +0 -0
  304. package/test/pics/p7/title-overflow.png +0 -0
  305. package/test/pics/p7/valign.png +0 -0
  306. package/test/pics/p7//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  307. package/test/pics/p7//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  308. package/test/pics/p7//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  309. package/test/pics/p7//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  310. package/test/pics/p7//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  311. package/test/pics/p7//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  312. package/test/pics/p7//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  313. package/test/pics/p7//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  314. package/test/pics/p7//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  315. package/test/pics/p7//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  316. package/test/pics/p7//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  317. package/test/pics/p7//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  318. package/test/pics/p8/cycle.png +0 -0
  319. package/test/pics/p8/deep-nest.png +0 -0
  320. package/test/pics/p8/diamond.png +0 -0
  321. package/test/pics/p8/edges-mix.png +0 -0
  322. package/test/pics/p8/english.png +0 -0
  323. package/test/pics/p8/flat-tb.png +0 -0
  324. package/test/pics/p8/fold-tall.png +0 -0
  325. package/test/pics/p8/fold-wide.png +0 -0
  326. package/test/pics/p8/group-edge.png +0 -0
  327. package/test/pics/p8/items-node.png +0 -0
  328. package/test/pics/p8/long-label.png +0 -0
  329. package/test/pics/p8/lr-flat.png +0 -0
  330. package/test/pics/p8/nested-group.png +0 -0
  331. package/test/pics/p8/no-edges.png +0 -0
  332. package/test/pics/p8/title-overflow.png +0 -0
  333. package/test/pics/p8/valign.png +0 -0
  334. package/test/pics/p8//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  335. package/test/pics/p8//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  336. package/test/pics/p8//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  337. package/test/pics/p8//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  338. package/test/pics/p8//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  339. package/test/pics/p8//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  340. package/test/pics/p8//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  341. package/test/pics/p8//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  342. package/test/pics/p8//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  343. package/test/pics/p8//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  344. package/test/pics/p8//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  345. package/test/pics/p8//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  346. package/test/pics/p9/cycle.png +0 -0
  347. package/test/pics/p9/deep-nest.png +0 -0
  348. package/test/pics/p9/diamond.png +0 -0
  349. package/test/pics/p9/edges-mix.png +0 -0
  350. package/test/pics/p9/english.png +0 -0
  351. package/test/pics/p9/flat-tb.png +0 -0
  352. package/test/pics/p9/fold-tall.png +0 -0
  353. package/test/pics/p9/fold-wide.png +0 -0
  354. package/test/pics/p9/group-edge.png +0 -0
  355. package/test/pics/p9/items-node.png +0 -0
  356. package/test/pics/p9/long-label.png +0 -0
  357. package/test/pics/p9/lr-flat.png +0 -0
  358. package/test/pics/p9/nested-group.png +0 -0
  359. package/test/pics/p9/no-edges.png +0 -0
  360. package/test/pics/p9/title-overflow.png +0 -0
  361. package/test/pics/p9/valign.png +0 -0
  362. package/test/pics/p9//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  363. package/test/pics/p9//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
  364. package/test/pics/p9//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
  365. package/test/pics/p9//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
  366. package/test/pics/p9//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
  367. package/test/pics/p9//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  368. package/test/pics/p9//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  369. package/test/pics/p9//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  370. package/test/pics/p9//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
  371. package/test/pics/p9//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
  372. package/test/pics/p9//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
  373. package/test/pics/p9//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
  374. package/test/snapshot.mjs +67 -0
  375. package/test/wflowchart.test.mjs +57 -11
  376. package/toolg/gDistRollup.mjs +3 -0
  377. package/test/data//344/275/234/346/245/255/346/265/201/347/250/213/345/234/226.json +0 -92
  378. package/test/data//345/211/215/347/253/257/346/236/266/346/247/213/350/210/207/350/263/207/346/226/231/346/265/201/345/234/226.json +0 -112
  379. package/test/data//345/276/214/347/253/257/346/234/215/345/213/231/347/265/204/346/210/220/345/234/226.json +0 -116
  380. package/test/data//346/211/271/346/254/241/344/270/212/345/202/263/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.json +0 -251
  381. package/test/data//347/250/213/345/274/217/345/205/203/344/273/266/347/265/204/346/210/220/345/234/226.json +0 -126
  382. package/test/data//347/250/213/345/274/217/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.json +0 -133
  383. package/test/data//347/263/273/347/265/261/346/236/266/346/247/213/345/234/226.json +0 -102
  384. package/test/data//347/263/273/347/265/261/351/227/234/350/201/257/345/234/226.json +0 -117
  385. package/test/data//347/267/232/344/270/212/347/225/253/351/235/242/351/227/234/350/201/257/345/234/226.json +0 -162
  386. package/test/pics/cycle.png +0 -0
  387. package/test/pics/cycle.svg +0 -1
  388. package/test/pics/deep-nest.svg +0 -1
  389. package/test/pics/diamond.png +0 -0
  390. package/test/pics/diamond.svg +0 -1
  391. package/test/pics/edges-mix.png +0 -0
  392. package/test/pics/edges-mix.svg +0 -1
  393. package/test/pics/english.png +0 -0
  394. package/test/pics/english.svg +0 -1
  395. package/test/pics/flat-tb.svg +0 -1
  396. package/test/pics/fold-tall.svg +0 -1
  397. package/test/pics/fold-wide.svg +0 -1
  398. package/test/pics/group-edge.png +0 -0
  399. package/test/pics/group-edge.svg +0 -1
  400. package/test/pics/items-node.svg +0 -1
  401. package/test/pics/long-label.svg +0 -1
  402. package/test/pics/lr-flat.svg +0 -1
  403. package/test/pics/nested-group.png +0 -0
  404. package/test/pics/nested-group.svg +0 -1
  405. package/test/pics/no-edges.svg +0 -1
  406. package/test/pics/title-overflow.svg +0 -1
  407. package/test/pics/valign.svg +0 -1
  408. package/test/pics//344/275/234/346/245/255/346/265/201/347/250/213/345/234/226.png +0 -0
  409. package/test/pics//344/275/234/346/245/255/346/265/201/347/250/213/345/234/226.svg +0 -1
  410. package/test/pics//345/211/215/347/253/257/346/236/266/346/247/213/350/210/207/350/263/207/346/226/231/346/265/201/345/234/226.png +0 -0
  411. package/test/pics//345/211/215/347/253/257/346/236/266/346/247/213/350/210/207/350/263/207/346/226/231/346/265/201/345/234/226.svg +0 -1
  412. package/test/pics//345/276/214/347/253/257/346/234/215/345/213/231/347/265/204/346/210/220/345/234/226.png +0 -0
  413. package/test/pics//345/276/214/347/253/257/346/234/215/345/213/231/347/265/204/346/210/220/345/234/226.svg +0 -1
  414. package/test/pics//346/211/271/346/254/241/344/270/212/345/202/263/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
  415. package/test/pics//346/211/271/346/254/241/344/270/212/345/202/263/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.svg +0 -1
  416. package/test/pics//347/250/213/345/274/217/345/205/203/344/273/266/347/265/204/346/210/220/345/234/226.png +0 -0
  417. package/test/pics//347/250/213/345/274/217/345/205/203/344/273/266/347/265/204/346/210/220/345/234/226.svg +0 -1
  418. package/test/pics//347/250/213/345/274/217/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
  419. package/test/pics//347/250/213/345/274/217/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.svg +0 -1
  420. package/test/pics//347/263/273/347/265/261/346/236/266/346/247/213/345/234/226.png +0 -0
  421. package/test/pics//347/263/273/347/265/261/346/236/266/346/247/213/345/234/226.svg +0 -1
  422. package/test/pics//347/263/273/347/265/261/351/227/234/350/201/257/345/234/226.png +0 -0
  423. package/test/pics//347/263/273/347/265/261/351/227/234/350/201/257/345/234/226.svg +0 -1
  424. package/test/pics//347/267/232/344/270/212/347/225/253/351/235/242/351/227/234/350/201/257/345/234/226.png +0 -0
  425. package/test/pics//347/267/232/344/270/212/347/225/253/351/235/242/351/227/234/350/201/257/345/234/226.svg +0 -1
  426. /package/test/pics/{deep-nest.png → p10/deep-nest.png} +0 -0
  427. /package/test/pics/{flat-tb.png → p10/flat-tb.png} +0 -0
  428. /package/test/pics/{fold-tall.png → p10/fold-tall.png} +0 -0
  429. /package/test/pics/{fold-wide.png → p10/fold-wide.png} +0 -0
  430. /package/test/pics/{items-node.png → p10/items-node.png} +0 -0
  431. /package/test/pics/{long-label.png → p10/long-label.png} +0 -0
  432. /package/test/pics/{lr-flat.png → p10/lr-flat.png} +0 -0
  433. /package/test/pics/{no-edges.png → p10/no-edges.png} +0 -0
  434. /package/test/pics/{title-overflow.png → p10/title-overflow.png} +0 -0
  435. /package/test/pics/{valign.png → p10/valign.png} +0 -0
package/README.md CHANGED
@@ -43,7 +43,11 @@ let inp = {
43
43
  ],
44
44
  }
45
45
 
46
- let buf = await WFlowchart('p10', inp) //mode 可選 'p1'~'p10', 各對應一套繪圖引擎產線
46
+ let buf = await WFlowchart(inp) //預設 opt.mode 為 'p10'; 可用 WFlowchart(inp, { mode: 'p3' }) 指定產線('p1'~'p10' 各對應一套繪圖引擎)
47
47
  fs.writeFileSync('flowchart.png', buf)
48
48
  // => 產出 flowchart.png
49
+
50
+ let svg = await WFlowchart(inp, { output: 'svg' }) //輸出 standalone SVG 字串(p1~p8 與 p10 支援; p9 不支援)
51
+ fs.writeFileSync('flowchart.svg', svg)
52
+ // => 產出 flowchart.svg
49
53
  ```
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * w-flowchart v1.0.0
2
+ * w-flowchart v1.0.2
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
6
- !function(n){"function"==typeof define&&define.amd?define(n):n()}(function(){});
6
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("playwright"),require("fs"),require("url"),require("path")):"function"==typeof define&&define.amd?define(["playwright","fs","url","path"],n):(e="undefined"!=typeof globalThis?globalThis:e||self)["w-flowchart"]=n(e.playwright,e.fs,e.url,e.path)}(this,function(e,n,t,r){"use strict";var o="undefined"!=typeof document?document.currentScript:null,a=Array.isArray,i="object"==typeof global&&global&&global.Object===Object&&global,s="object"==typeof self&&self&&self.Object===Object&&self,l=i||s||Function("return this")(),c=l.Symbol,d=Object.prototype,p=d.hasOwnProperty,f=d.toString,u=c?c.toStringTag:void 0;var h=Object.prototype.toString;var g=c?c.toStringTag:void 0;function y(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":g&&g in Object(e)?function(e){var n=p.call(e,u),t=e[u];try{e[u]=void 0;var r=!0}catch(e){}var o=f.call(e);return r&&(n?e[u]=t:delete e[u]),o}(e):function(e){return h.call(e)}(e)}function b(e){return null!=e&&"object"==typeof e}function m(e){return"symbol"==typeof e||b(e)&&"[object Symbol]"==y(e)}var x=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,w=/^\w*$/;function v(e){var n=typeof e;return null!=e&&("object"==n||"function"==n)}function k(e){if(!v(e))return!1;var n=y(e);return"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n}var _,E=l["__core-js_shared__"],S=(_=/[^.]+$/.exec(E&&E.keys&&E.keys.IE_PROTO||""))?"Symbol(src)_1."+_:"";var O=Function.prototype.toString;function I(e){if(null!=e){try{return O.call(e)}catch(e){}try{return e+""}catch(e){}}return""}var j=/^\[object .+?Constructor\]$/,A=Function.prototype,M=Object.prototype,L=A.toString,P=M.hasOwnProperty,B=RegExp("^"+L.call(P).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function F(e){return!(!v(e)||(n=e,S&&S in n))&&(k(e)?B:j).test(I(e));var n}function D(e,n){var t=function(e,n){return null==e?void 0:e[n]}(e,n);return F(t)?t:void 0}var N=D(Object,"create");var $=Object.prototype.hasOwnProperty;var G=Object.prototype.hasOwnProperty;function T(e){var n=-1,t=null==e?0:e.length;for(this.clear();++n<t;){var r=e[n];this.set(r[0],r[1])}}function C(e,n){return e===n||e!=e&&n!=n}function R(e,n){for(var t=e.length;t--;)if(C(e[t][0],n))return t;return-1}T.prototype.clear=function(){this.__data__=N?N(null):{},this.size=0},T.prototype.delete=function(e){var n=this.has(e)&&delete this.__data__[e];return this.size-=n?1:0,n},T.prototype.get=function(e){var n=this.__data__;if(N){var t=n[e];return"__lodash_hash_undefined__"===t?void 0:t}return $.call(n,e)?n[e]:void 0},T.prototype.has=function(e){var n=this.__data__;return N?void 0!==n[e]:G.call(n,e)},T.prototype.set=function(e,n){var t=this.__data__;return this.size+=this.has(e)?0:1,t[e]=N&&void 0===n?"__lodash_hash_undefined__":n,this};var H=Array.prototype.splice;function z(e){var n=-1,t=null==e?0:e.length;for(this.clear();++n<t;){var r=e[n];this.set(r[0],r[1])}}z.prototype.clear=function(){this.__data__=[],this.size=0},z.prototype.delete=function(e){var n=this.__data__,t=R(n,e);return!(t<0)&&(t==n.length-1?n.pop():H.call(n,t,1),--this.size,!0)},z.prototype.get=function(e){var n=this.__data__,t=R(n,e);return t<0?void 0:n[t][1]},z.prototype.has=function(e){return R(this.__data__,e)>-1},z.prototype.set=function(e,n){var t=this.__data__,r=R(t,e);return r<0?(++this.size,t.push([e,n])):t[r][1]=n,this};var W=D(l,"Map");function q(e,n){var t,r,o=e.__data__;return("string"==(r=typeof(t=n))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==t:null===t)?o["string"==typeof n?"string":"hash"]:o.map}function J(e){var n=-1,t=null==e?0:e.length;for(this.clear();++n<t;){var r=e[n];this.set(r[0],r[1])}}J.prototype.clear=function(){this.size=0,this.__data__={hash:new T,map:new(W||z),string:new T}},J.prototype.delete=function(e){var n=q(this,e).delete(e);return this.size-=n?1:0,n},J.prototype.get=function(e){return q(this,e).get(e)},J.prototype.has=function(e){return q(this,e).has(e)},J.prototype.set=function(e,n){var t=q(this,e),r=t.size;return t.set(e,n),this.size+=t.size==r?0:1,this};function U(e,n){if("function"!=typeof e||null!=n&&"function"!=typeof n)throw new TypeError("Expected a function");var t=function(){var r=arguments,o=n?n.apply(this,r):r[0],a=t.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return t.cache=a.set(o,i)||a,i};return t.cache=new(U.Cache||J),t}U.Cache=J;var X,Y,V,Z=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,K=/\\(\\)?/g,Q=(X=function(e){var n=[];return 46===e.charCodeAt(0)&&n.push(""),e.replace(Z,function(e,t,r,o){n.push(r?o.replace(K,"$1"):t||e)}),n},Y=U(X,function(e){return 500===V.size&&V.clear(),e}),V=Y.cache,Y),ee=Q;var ne=c?c.prototype:void 0,te=ne?ne.toString:void 0;function re(e){if("string"==typeof e)return e;if(a(e))return function(e,n){for(var t=-1,r=null==e?0:e.length,o=Array(r);++t<r;)o[t]=n(e[t],t,e);return o}(e,re)+"";if(m(e))return te?te.call(e):"";var n=e+"";return"0"==n&&1/e==-1/0?"-0":n}function oe(e,n){return a(e)?e:function(e,n){if(a(e))return!1;var t=typeof e;return!("number"!=t&&"symbol"!=t&&"boolean"!=t&&null!=e&&!m(e))||w.test(e)||!x.test(e)||null!=n&&e in Object(n)}(e,n)?[e]:ee(function(e){return null==e?"":re(e)}(e))}function ae(e){if("string"==typeof e||m(e))return e;var n=e+"";return"0"==n&&1/e==-1/0?"-0":n}function ie(e,n,t){var r=null==e?void 0:function(e,n){for(var t=0,r=(n=oe(n,e)).length;null!=e&&t<r;)e=e[ae(n[t++])];return t&&t==r?e:void 0}(e,n);return void 0===r?t:r}function se(e){var n=this.__data__=new z(e);this.size=n.size}se.prototype.clear=function(){this.__data__=new z,this.size=0},se.prototype.delete=function(e){var n=this.__data__,t=n.delete(e);return this.size=n.size,t},se.prototype.get=function(e){return this.__data__.get(e)},se.prototype.has=function(e){return this.__data__.has(e)},se.prototype.set=function(e,n){var t=this.__data__;if(t instanceof z){var r=t.__data__;if(!W||r.length<199)return r.push([e,n]),this.size=++t.size,this;t=this.__data__=new J(r)}return t.set(e,n),this.size=t.size,this};var le=function(){try{var e=D(Object,"defineProperty");return e({},"",{}),e}catch(e){}}(),ce=le;function de(e,n,t){"__proto__"==n&&ce?ce(e,n,{configurable:!0,enumerable:!0,value:t,writable:!0}):e[n]=t}var pe=Object.prototype.hasOwnProperty;function fe(e,n,t){var r=e[n];pe.call(e,n)&&C(r,t)&&(void 0!==t||n in e)||de(e,n,t)}function ue(e,n,t,r){var o=!t;t||(t={});for(var a=-1,i=n.length;++a<i;){var s=n[a],l=r?r(t[s],e[s],s,t,e):void 0;void 0===l&&(l=e[s]),o?de(t,s,l):fe(t,s,l)}return t}function he(e){return b(e)&&"[object Arguments]"==y(e)}var ge=Object.prototype,ye=ge.hasOwnProperty,be=ge.propertyIsEnumerable,me=he(function(){return arguments}())?he:function(e){return b(e)&&ye.call(e,"callee")&&!be.call(e,"callee")},xe=me;var we="object"==typeof exports&&exports&&!exports.nodeType&&exports,ve=we&&"object"==typeof module&&module&&!module.nodeType&&module,ke=ve&&ve.exports===we?l.Buffer:void 0,_e=(ke?ke.isBuffer:void 0)||function(){return!1},Ee=/^(?:0|[1-9]\d*)$/;function Se(e,n){var t=typeof e;return!!(n=null==n?9007199254740991:n)&&("number"==t||"symbol"!=t&&Ee.test(e))&&e>-1&&e%1==0&&e<n}function Oe(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}var Ie={};function je(e){return function(n){return e(n)}}Ie["[object Float32Array]"]=Ie["[object Float64Array]"]=Ie["[object Int8Array]"]=Ie["[object Int16Array]"]=Ie["[object Int32Array]"]=Ie["[object Uint8Array]"]=Ie["[object Uint8ClampedArray]"]=Ie["[object Uint16Array]"]=Ie["[object Uint32Array]"]=!0,Ie["[object Arguments]"]=Ie["[object Array]"]=Ie["[object ArrayBuffer]"]=Ie["[object Boolean]"]=Ie["[object DataView]"]=Ie["[object Date]"]=Ie["[object Error]"]=Ie["[object Function]"]=Ie["[object Map]"]=Ie["[object Number]"]=Ie["[object Object]"]=Ie["[object RegExp]"]=Ie["[object Set]"]=Ie["[object String]"]=Ie["[object WeakMap]"]=!1;var Ae="object"==typeof exports&&exports&&!exports.nodeType&&exports,Me=Ae&&"object"==typeof module&&module&&!module.nodeType&&module,Le=Me&&Me.exports===Ae&&i.process,Pe=function(){try{var e=Me&&Me.require&&Me.require("util").types;return e||Le&&Le.binding&&Le.binding("util")}catch(e){}}(),Be=Pe&&Pe.isTypedArray,Fe=Be?je(Be):function(e){return b(e)&&Oe(e.length)&&!!Ie[y(e)]},De=Object.prototype.hasOwnProperty;function Ne(e,n){var t=a(e),r=!t&&xe(e),o=!t&&!r&&_e(e),i=!t&&!r&&!o&&Fe(e),s=t||r||o||i,l=s?function(e,n){for(var t=-1,r=Array(e);++t<e;)r[t]=n(t);return r}(e.length,String):[],c=l.length;for(var d in e)!n&&!De.call(e,d)||s&&("length"==d||o&&("offset"==d||"parent"==d)||i&&("buffer"==d||"byteLength"==d||"byteOffset"==d)||Se(d,c))||l.push(d);return l}var $e=Object.prototype;function Ge(e){var n=e&&e.constructor;return e===("function"==typeof n&&n.prototype||$e)}function Te(e,n){return function(t){return e(n(t))}}var Ce=Te(Object.keys,Object),Re=Object.prototype.hasOwnProperty;function He(e){return null!=e&&Oe(e.length)&&!k(e)}function ze(e){return He(e)?Ne(e):function(e){if(!Ge(e))return Ce(e);var n=[];for(var t in Object(e))Re.call(e,t)&&"constructor"!=t&&n.push(t);return n}(e)}var We=Object.prototype.hasOwnProperty;function qe(e){if(!v(e))return function(e){var n=[];if(null!=e)for(var t in Object(e))n.push(t);return n}(e);var n=Ge(e),t=[];for(var r in e)("constructor"!=r||!n&&We.call(e,r))&&t.push(r);return t}function Je(e){return He(e)?Ne(e,!0):qe(e)}var Ue="object"==typeof exports&&exports&&!exports.nodeType&&exports,Xe=Ue&&"object"==typeof module&&module&&!module.nodeType&&module,Ye=Xe&&Xe.exports===Ue?l.Buffer:void 0,Ve=Ye?Ye.allocUnsafe:void 0;function Ze(){return[]}var Ke=Object.prototype.propertyIsEnumerable,Qe=Object.getOwnPropertySymbols,en=Qe?function(e){return null==e?[]:(e=Object(e),function(e,n){for(var t=-1,r=null==e?0:e.length,o=0,a=[];++t<r;){var i=e[t];n(i,t,e)&&(a[o++]=i)}return a}(Qe(e),function(n){return Ke.call(e,n)}))}:Ze,nn=en;function tn(e,n){for(var t=-1,r=n.length,o=e.length;++t<r;)e[o+t]=n[t];return e}var rn=Te(Object.getPrototypeOf,Object),on=Object.getOwnPropertySymbols?function(e){for(var n=[];e;)tn(n,nn(e)),e=rn(e);return n}:Ze,an=on;function sn(e,n,t){var r=n(e);return a(e)?r:tn(r,t(e))}function ln(e){return sn(e,ze,nn)}function cn(e){return sn(e,Je,an)}var dn=D(l,"DataView"),pn=D(l,"Promise"),fn=D(l,"Set"),un=D(l,"WeakMap"),hn="[object Map]",gn="[object Promise]",yn="[object Set]",bn="[object WeakMap]",mn="[object DataView]",xn=I(dn),wn=I(W),vn=I(pn),kn=I(fn),_n=I(un),En=y;(dn&&En(new dn(new ArrayBuffer(1)))!=mn||W&&En(new W)!=hn||pn&&En(pn.resolve())!=gn||fn&&En(new fn)!=yn||un&&En(new un)!=bn)&&(En=function(e){var n=y(e),t="[object Object]"==n?e.constructor:void 0,r=t?I(t):"";if(r)switch(r){case xn:return mn;case wn:return hn;case vn:return gn;case kn:return yn;case _n:return bn}return n});var Sn=En,On=Object.prototype.hasOwnProperty;var In=l.Uint8Array;function jn(e){var n=new e.constructor(e.byteLength);return new In(n).set(new In(e)),n}var An=/\w*$/;var Mn=c?c.prototype:void 0,Ln=Mn?Mn.valueOf:void 0;function Pn(e,n,t){var r,o=e.constructor;switch(n){case"[object ArrayBuffer]":return jn(e);case"[object Boolean]":case"[object Date]":return new o(+e);case"[object DataView]":return function(e,n){var t=n?jn(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.byteLength)}(e,t);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return function(e,n){var t=n?jn(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.length)}(e,t);case"[object Map]":case"[object Set]":return new o;case"[object Number]":case"[object String]":return new o(e);case"[object RegExp]":return function(e){var n=new e.constructor(e.source,An.exec(e));return n.lastIndex=e.lastIndex,n}(e);case"[object Symbol]":return r=e,Ln?Object(Ln.call(r)):{}}}var Bn=Object.create,Fn=function(){function e(){}return function(n){if(!v(n))return{};if(Bn)return Bn(n);e.prototype=n;var t=new e;return e.prototype=void 0,t}}(),Dn=Fn;var Nn=Pe&&Pe.isMap,$n=Nn?je(Nn):function(e){return b(e)&&"[object Map]"==Sn(e)};var Gn=Pe&&Pe.isSet,Tn=Gn?je(Gn):function(e){return b(e)&&"[object Set]"==Sn(e)},Cn="[object Arguments]",Rn="[object Function]",Hn="[object Object]",zn={};function Wn(e,n,t,r,o,i){var s,l=1&n,c=2&n,d=4&n;if(t&&(s=o?t(e,r,o,i):t(e)),void 0!==s)return s;if(!v(e))return e;var p=a(e);if(p){if(s=function(e){var n=e.length,t=new e.constructor(n);return n&&"string"==typeof e[0]&&On.call(e,"index")&&(t.index=e.index,t.input=e.input),t}(e),!l)return function(e,n){var t=-1,r=e.length;for(n||(n=Array(r));++t<r;)n[t]=e[t];return n}(e,s)}else{var f=Sn(e),u=f==Rn||"[object GeneratorFunction]"==f;if(_e(e))return function(e,n){if(n)return e.slice();var t=e.length,r=Ve?Ve(t):new e.constructor(t);return e.copy(r),r}(e,l);if(f==Hn||f==Cn||u&&!o){if(s=c||u?{}:function(e){return"function"!=typeof e.constructor||Ge(e)?{}:Dn(rn(e))}(e),!l)return c?function(e,n){return ue(e,an(e),n)}(e,function(e,n){return e&&ue(n,Je(n),e)}(s,e)):function(e,n){return ue(e,nn(e),n)}(e,function(e,n){return e&&ue(n,ze(n),e)}(s,e))}else{if(!zn[f])return o?e:{};s=Pn(e,f,l)}}i||(i=new se);var h=i.get(e);if(h)return h;i.set(e,s),Tn(e)?e.forEach(function(r){s.add(Wn(r,n,t,r,e,i))}):$n(e)&&e.forEach(function(r,o){s.set(o,Wn(r,n,t,o,e,i))});var g=p?void 0:(d?c?cn:ln:c?Je:ze)(e);return function(e,n){for(var t=-1,r=null==e?0:e.length;++t<r&&!1!==n(e[t],t,e););}(g||e,function(r,o){g&&(r=e[o=r]),fe(s,o,Wn(r,n,t,o,e,i))}),s}zn[Cn]=zn["[object Array]"]=zn["[object ArrayBuffer]"]=zn["[object DataView]"]=zn["[object Boolean]"]=zn["[object Date]"]=zn["[object Float32Array]"]=zn["[object Float64Array]"]=zn["[object Int8Array]"]=zn["[object Int16Array]"]=zn["[object Int32Array]"]=zn["[object Map]"]=zn["[object Number]"]=zn[Hn]=zn["[object RegExp]"]=zn["[object Set]"]=zn["[object String]"]=zn["[object Symbol]"]=zn["[object Uint8Array]"]=zn["[object Uint8ClampedArray]"]=zn["[object Uint16Array]"]=zn["[object Uint32Array]"]=!0,zn["[object Error]"]=zn[Rn]=zn["[object WeakMap]"]=!1;function qn(e){return"[object String]"===Object.prototype.toString.call(e)}function Jn(e){return!(!qn(e)||""===e)}function Un(e){return"[object Object]"===Object.prototype.toString.call(e)}function Xn(e){return"[object Array]"===Object.prototype.toString.call(e)}function Yn(e){return!!function(e){return"[object Undefined]"===Object.prototype.toString.call(e)}(e)||(!!function(e){return"[object Null]"===Object.prototype.toString.call(e)}(e)||(!!function(e){if(Un(e)){for(let n in e)return!1;return!0}return!1}(e)||(!!function(e){return!(!qn(e)||""!==e)}(e)||(!!function(e){return!!Xn(e)&&0===e.length}(e)||!!function(e){return e!=e}(e)))))}const Vn={p1:()=>Promise.resolve().then(function(){return pt}),p2:()=>Promise.resolve().then(function(){return gt}),p3:()=>Promise.resolve().then(function(){return wt}),p4:()=>Promise.resolve().then(function(){return jt}),p5:()=>Promise.resolve().then(function(){return Tt}),p6:()=>Promise.resolve().then(function(){return Ut}),p7:()=>Promise.resolve().then(function(){return Qt}),p8:()=>Promise.resolve().then(function(){return lr}),p9:()=>Promise.resolve().then(function(){return pr}),p10:()=>Promise.resolve().then(function(){return gr})},Zn=["p1","p2","p3","p4","p5","p6","p7","p8","p10"];const Kn={blue:{fill:"#eef4fb",stroke:"#3f6fb0",text:"#1c2b36",shape:"box"},green:{fill:"#eaf4ef",stroke:"#348a5c",text:"#1c2b36",shape:"box"},orange:{fill:"#fcf0e2",stroke:"#c46e1a",text:"#1c2b36",shape:"box"},purple:{fill:"#f4f0fa",stroke:"#8163ad",text:"#23303a",shape:"box"},red:{fill:"#fbecea",stroke:"#c0392b",text:"#23303a",shape:"box"},done:{fill:"#eaf4ef",stroke:"#256046",text:"#256046",shape:"box"},diamond:{fill:"#fcf0e2",stroke:"#c46e1a",text:"#23303a",shape:"diamond"},blueG:{fill:"#f5f9fe",stroke:"#3f6fb0",text:"#3f6fb0",group:!0},blueG2:{fill:"#eef4fb",stroke:"#3f6fb0",text:"#3f6fb0",group:!0},greenG:{fill:"#f0f7f3",stroke:"#348a5c",text:"#348a5c",group:!0},greenG2:{fill:"#eaf4ef",stroke:"#348a5c",text:"#348a5c",group:!0},orangeG:{fill:"#fdf6ec",stroke:"#c46e1a",text:"#c46e1a",group:!0},purpleG:{fill:"#faf7fd",stroke:"#8163ad",text:"#8163ad",group:!0}},Qn={line:"#44505a",text:"#4a5560",textBg:"transparent",haloColor:"#ffffff",haloWidth:3.5},et="'Microsoft JhengHei', sans-serif",nt=e=>/G2?$/.test(e||""),tt=e=>Kn[e]||Kn.blue,rt=r.dirname(t.fileURLToPath("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:o&&"SCRIPT"===o.tagName.toUpperCase()&&o.src||new URL("w-flowchart.umd.js",document.baseURI).href));function ot(e){let t=rt;for(let o=0;o<10;o++){const o=r.join(t,"node_modules",e);if(n.existsSync(o))return o;const a=r.dirname(t);if(a===t)break;t=a}throw new Error("找不到本機套件檔案 node_modules/"+e)}function at(e){return n.readFileSync(ot(e),"utf8").replace(/<\/script/gi,"<\\/script")}function it(e){return n.readFileSync(ot(e),"utf8")}const st=at("mermaid10/dist/mermaid.min.js");function lt(e,n){return"diamond"===e.cls?`${n(e.id)}{"${e.label}"}`:`${n(e.id)}["${e.label}"]`}function ct(e){const{dir:n,nodes:t,edges:r}=e,o=new Set,a={},i=e=>{if(a[e])return a[e];const n="n_"+String(e).replace(/[^A-Za-z0-9_]/g,"_");let t=n,r=2;for(;o.has(t);)t=n+"_"+r++;return o.add(t),a[e]=t,t},s={};for(const e of t)s[e.id]=e;new Set(t.filter(e=>nt(e.cls)).map(e=>e.id));const l=new Set(t.map(e=>e.cls)),c=[];for(const e of l){const n=Kn[e]||Kn.blue;nt(e)?c.push(` classDef ${e} fill:${n.fill},stroke:${n.stroke},stroke-width:1.8px,color:${n.text}`):"diamond"===e?c.push(` classDef ${e} fill:${n.fill},stroke:${n.stroke},stroke-width:1.6px,color:${n.text}`):c.push(` classDef ${e} fill:${n.fill},stroke:${n.stroke},stroke-width:1.5px,color:${n.text}`)}const d={};for(const e of t)d[e.cls]||(d[e.cls]=[]),d[e.cls].push(e.id);const p=[];for(const[e,n]of Object.entries(d))p.push(` class ${n.map(i).join(",")} ${e}`);const f=t.filter(e=>nt(e.cls)&&!e.group).map(e=>e.id),u=t.filter(e=>!nt(e.cls)&&!e.group);function h(e,n){const r=s[e],o=[];o.push(`${n}subgraph ${i(e)}["${r.label}"]`);const a=t.filter(n=>n.group===e&&!nt(n.cls));for(const e of a)o.push(`${n} ${lt(e,i)}`);const l=t.filter(n=>nt(n.cls)&&n.group===e);for(const e of l)o.push(...h(e.id,n+" "));return o.push(`${n}end`),o}const g=[];for(const e of r){const n="dashed"===e.kind?"-..->":"--\x3e",t=e.label?`|"${e.label}"| `:"";g.push(` ${i(e.from)} ${n} ${t}${i(e.to)}`)}const y=[`flowchart ${n}`];for(const e of u)y.push(` ${lt(e,i)}`);for(const e of f)y.push(...h(e," "));return y.push(...g),y.push(...c),y.push(...p),y.join("\n")}async function dt(n){const t=await e.chromium.launch();try{const e=await t.newPage({deviceScaleFactor:4});await e.setContent(function(e){return`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${st}<\/script>\n</head><body style="margin:0;background:#fff;font-family:'微軟正黑體','Microsoft JhengHei',sans-serif">\n<div id="box" style="display:inline-block;padding:24px"></div>\n<script>\nmermaid.initialize({ startOnLoad:false, theme:'base', themeVariables:{ fontFamily:"'Microsoft JhengHei','微軟正黑體',sans-serif", fontSize:'17px', primaryColor:'#eef4fb', primaryBorderColor:'#3f6fb0', lineColor:'#44505a', primaryTextColor:'#1c2b36' }, themeCSS: '.flowchart-link{stroke:#44505a !important;stroke-width:2.5px !important;} .edgePaths .path{stroke:#44505a !important;stroke-width:2.5px !important;} .marker,.marker path{fill:#44505a !important;stroke:#44505a !important;} .edgeLabel .label{background:transparent !important;} .edgeLabel{background:transparent !important;} .edgeLabel rect{fill:transparent !important;opacity:0 !important;} .label foreignObject{overflow:visible;} .cluster-label text,.cluster-label span,.cluster-label div,.edgeLabel span{font-family:"Microsoft JhengHei","微軟正黑體",sans-serif !important;}' });\n(async () => {\n try {\n const { svg } = await mermaid.render('g', ${JSON.stringify(e)})\n document.getElementById('box').innerHTML = svg\n const DK = '#333333', W = '3px'\n document.querySelectorAll('#box .edgePaths path, #box .edgePath path, #box path.flowchart-link, #box g.edgePaths path').forEach((p) => { p.style.setProperty('stroke', DK, 'important'); p.style.setProperty('stroke-width', W, 'important') })\n document.querySelectorAll('#box marker path, #box .marker, #box .marker path').forEach((m) => { m.style.setProperty('fill', DK, 'important'); m.style.setProperty('stroke', DK, 'important') })\n document.querySelectorAll('#box .node rect, #box .node polygon, #box .node circle, #box .node path').forEach((n) => { n.style.setProperty('stroke-width', '2px', 'important') })\n document.querySelectorAll('#box .cluster rect, #box .cluster polygon, #box .cluster path').forEach((c) => { c.style.setProperty('stroke', '#777777', 'important'); c.style.setProperty('stroke-width', '1.5px', 'important') })\n // 修正 A: 邊標籤背景透明 + 白色光暈(透過 foreignObject 內 span 的 CSS)\n document.querySelectorAll('#box .edgeLabel rect, #box .edgeLabel .label').forEach((el) => {\n el.style.setProperty('fill', 'transparent', 'important')\n el.style.setProperty('background', 'transparent', 'important')\n el.style.setProperty('opacity', '1', 'important')\n })\n document.querySelectorAll('#box .edgeLabel foreignObject').forEach((fo) => {\n fo.style.setProperty('overflow', 'visible', 'important')\n })\n document.querySelectorAll('#box .edgeLabel span, #box .edgeLabel .edgeLabel').forEach((sp) => {\n sp.style.setProperty('background', 'transparent', 'important')\n sp.style.setProperty('color', '#4a5560', 'important')\n // 字型覆蓋: 邊標籤 span 可能繼承系統字型, 強制指定\n sp.style.setProperty('font-family', "'Microsoft JhengHei', '微軟正黑體', sans-serif", 'important')\n // 白色光暈: CSS text-shadow 多向\n sp.style.setProperty('text-shadow', '-1.5px -1.5px 0 #fff, 1.5px -1.5px 0 #fff, -1.5px 1.5px 0 #fff, 1.5px 1.5px 0 #fff, 0 -2px 0 #fff, 0 2px 0 #fff, -2px 0 0 #fff, 2px 0 0 #fff', 'important')\n // 修正 B: 英數識別字不攔腰斷\n sp.style.setProperty('word-break', 'normal', 'important')\n sp.style.setProperty('overflow-wrap', 'break-word', 'important')\n })\n // 字型覆蓋: cluster(subgraph)標題文字 — mermaid@10 的 .cluster-label text/span 不繼承 fontFamily themeVariable\n document.querySelectorAll('#box .cluster-label text, #box .cluster-label span, #box .cluster-label div').forEach((el) => {\n el.style.setProperty('font-family', "'Microsoft JhengHei', '微軟正黑體', sans-serif", 'important')\n })\n document.title = 'DONE'\n }\n catch (e) {\n document.title = 'FAIL'\n console.log('mmErr', e.message)\n }\n})()\n<\/script></body></html>`}(n),{waitUntil:"load"}),await e.waitForFunction(()=>"DONE"===document.title||"FAIL"===document.title,{timeout:3e4});if("DONE"!==await e.title()){const n=await e.evaluate(()=>{const e=document.getElementById("box");return e?e.innerText:""});throw new Error(`mermaid render failed: ${n}`)}return await e.evaluate(()=>document.fonts.ready),{browser:t,page:e}}catch(e){throw await t.close(),e}}var pt=Object.freeze({__proto__:null,genPng:async function(e,n={}){const{browser:t,page:r}=await dt(ct(e));try{return await r.locator("#box svg").screenshot()}finally{await t.close()}},genSvg:async function(e,n={}){const{browser:t,page:r}=await dt(ct(e));try{return(await r.evaluate(()=>{const e=document.querySelector("#box svg"),n=e.viewBox.baseVal;return e.style.maxWidth="none",e.setAttribute("width",Math.ceil(n.width)),e.setAttribute("height",Math.ceil(n.height)),document.getElementById("box").innerHTML})).replace(/&nbsp;/g,"&#160;").trim()}finally{await t.close()}}});const ft="https://pkg.local/";function ut(e){const n=e.dir||"TB",t="TB"===n?"LR":"TB",r=new Set,o={},a=e=>{if(o[e])return o[e];const n="n_"+String(e).replace(/[^A-Za-z0-9_]/g,"_");let t=n,a=2;for(;r.has(t);)t=n+"_"+a++;return r.add(t),o[e]=t,t},i={},s={};for(const n of e.nodes)s[n.id]=n,n.group&&(i[n.group]||(i[n.group]=[]),i[n.group].push(n.id));const l=e.nodes.filter(e=>!e.group),c=[];function d(e,n){const r=" ".repeat(n);if(nt(e.cls)){c.push(`${r}subgraph ${a(e.id)}["${e.label}"]`),c.push(`${r} direction ${t}`);const o=i[e.id]||[];for(const e of o)d(s[e],n+1);c.push(`${r}end`)}else{const n="diamond"===e.cls?`{${e.label}}`:`["${e.label}"]`;c.push(`${r}${a(e.id)}${n}`)}}c.push(`flowchart ${n}`);for(const e of l)d(e,1);for(const n of e.edges){const e="dashed"===n.kind?"-.->":"--\x3e",t=n.label?`|"${n.label}"|`:"";c.push(` ${a(n.from)} ${e}${t} ${a(n.to)}`)}const p=new Set(e.nodes.map(e=>e.cls)),f={};for(const n of e.nodes)f[n.cls]||(f[n.cls]=[]),f[n.cls].push(n.id);for(const e of p){const n=Kn[e]||Kn.blue,t=n.fill,r=n.stroke,o=n.text,a=(nt(e),"1.5px");c.push(` classDef ${e} fill:${t},stroke:${r},stroke-width:${a},color:${o};`)}for(const[e,n]of Object.entries(f))c.push(` class ${n.map(a).join(",")} ${e};`);return c.join("\n")}async function ht(t){const r="---\nconfig:\n layout: elk\n---\n"+ut(t),o=await e.chromium.launch();try{const e=await o.newPage({deviceScaleFactor:2});await async function(e){await e.route(ft+"**",e=>{const t=decodeURIComponent(e.request().url().slice(18).split("?")[0]);try{e.fulfill({body:n.readFileSync(ot(t)),contentType:t.endsWith(".css")?"text/css":"text/javascript"})}catch(n){e.fulfill({status:404,body:String(n&&n.message||n)})}})}(e),await e.setContent("<!doctype html><html lang=\"zh-Hant\"><head><meta charset=\"utf-8\">\n<style>\n /* 修正 A: 邊標籤光暈 — paint-order + stroke 白邊讓線段透出、文字仍清晰 */\n .edgeLabel text, .edgeLabel tspan {\n paint-order: stroke fill;\n stroke: #ffffff;\n stroke-width: 3.5px;\n stroke-linejoin: round;\n }\n /* 修正 A: 邊標籤背景框透明(移除不透明白底, 否則會遮斷轉折線) */\n .edgeLabel rect, .edgeLabel .label-container {\n fill: transparent !important;\n fill-opacity: 0 !important;\n stroke: none !important;\n }\n /* 修正 B: 節點標籤禁止英數識別字被攔腰斷行 */\n .node foreignObject div, .node foreignObject span,\n .label foreignObject div, .label foreignObject span {\n word-break: keep-all;\n overflow-wrap: break-word;\n white-space: normal;\n }\n /* 修正 C: 字型全覆蓋 — subgraph/容器標題(cluster-label)強制 Microsoft JhengHei */\n .cluster-label foreignObject div, .cluster-label foreignObject span,\n .cluster-label text, .cluster-label tspan,\n .nodeLabel, .nodeLabel span, text, tspan {\n font-family: 'Microsoft JhengHei','微軟正黑體',sans-serif !important;\n }\n</style>\n</head>\n<body style=\"margin:0;background:#fff;font-family:'微軟正黑體','Microsoft JhengHei',sans-serif\">\n<div id=\"box\" style=\"display:inline-block;padding:24px\"></div>\n<script type=\"module\">\ntry {\n const mermaid = (await import('https://pkg.local/mermaid11/dist/mermaid.esm.min.mjs')).default\n const elk = (await import('https://pkg.local/@mermaid-js/layout-elk/dist/mermaid-layout-elk.esm.min.mjs')).default\n mermaid.registerLayoutLoaders(elk)\n mermaid.initialize({ startOnLoad:false, theme:'base', flowchart:{ useMaxWidth:false }, themeVariables:{ fontFamily:\"'微軟正黑體','Microsoft JhengHei',sans-serif\", fontSize:'17px', primaryColor:'#eef4fb', primaryBorderColor:'#3f6fb0', lineColor:'#44505a', primaryTextColor:'#1c2b36' } })\n window.renderFig = async (code, idx) => {\n try {\n const { svg } = await mermaid.render('g'+idx, code)\n const box = document.getElementById('box'); box.innerHTML = svg\n const svgEl = box.querySelector('svg')\n try {\n const vb = svgEl.viewBox && svgEl.viewBox.baseVal\n let w = vb && vb.width, h = vb && vb.height\n if (!w || !h) { const bb = svgEl.getBBox(); w = bb.width; h = bb.height }\n svgEl.style.maxWidth = 'none'\n svgEl.setAttribute('width', Math.ceil(w))\n svgEl.setAttribute('height', Math.ceil(h))\n } catch(e){}\n const DK='#333333', W='3px'\n box.querySelectorAll('.edgePaths path, .edgePath path, path.flowchart-link, g.edgePaths path').forEach(p=>{p.style.setProperty('stroke',DK,'important');p.style.setProperty('stroke-width',W,'important')})\n box.querySelectorAll('marker path, .marker, .marker path').forEach(m=>{m.style.setProperty('fill',DK,'important');m.style.setProperty('stroke',DK,'important')})\n box.querySelectorAll('.node rect, .node polygon, .node circle, .node path').forEach(n=>n.style.setProperty('stroke-width','2px','important'))\n box.querySelectorAll('.cluster rect, .cluster polygon, .cluster path').forEach(c=>{c.style.setProperty('stroke','#777','important');c.style.setProperty('stroke-width','1.5px','important')})\n // 修正 A (JS 層): 邊標籤背景矩形透明 + 文字白色光暈(JS inline style 強制覆蓋 mermaid 注入的樣式)\n box.querySelectorAll('.edgeLabel rect, .edgeLabel .label-container').forEach(r=>{\n r.style.setProperty('fill','transparent','important')\n r.style.setProperty('fill-opacity','0','important')\n r.style.setProperty('stroke','none','important')\n })\n box.querySelectorAll('.edgeLabel text, .edgeLabel tspan').forEach(t=>{\n t.style.setProperty('paint-order','stroke fill','important')\n t.style.setProperty('stroke','#ffffff','important')\n t.style.setProperty('stroke-width','3.5px','important')\n t.style.setProperty('stroke-linejoin','round','important')\n })\n // 修正 C (JS 層): 字型全覆蓋 — subgraph/容器標題 cluster-label + 所有 SVG text/tspan\n const FF = \"'Microsoft JhengHei','微軟正黑體',sans-serif\"\n box.querySelectorAll('.cluster-label foreignObject div, .cluster-label foreignObject span').forEach(el=>{\n el.style.setProperty('font-family',FF,'important')\n })\n box.querySelectorAll('text, tspan').forEach(el=>{\n el.style.setProperty('font-family',FF,'important')\n })\n if (document.fonts && document.fonts.ready) await document.fonts.ready\n return { ok:true }\n } catch(e){ return { ok:false, err:(e&&(e.message||e.stack))||String(e) } }\n }\n window.__ready = true\n} catch(e){ window.__setupErr = (e&&(e.message||e.stack))||String(e) }\n<\/script></body></html>",{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready||window.__setupErr,{timeout:9e4}).catch(()=>{});const t=await e.evaluate(()=>window.__setupErr);if(t)throw new Error(t);const a=await e.evaluate(([e,n])=>window.renderFig(e,n),[r,0]);if(!a.ok)throw new Error(a.err);return await e.waitForTimeout(250),{browser:o,page:e}}catch(e){throw await o.close(),e}}var gt=Object.freeze({__proto__:null,genPng:async function(e,n={}){const{browser:t,page:r}=await ht(e);try{return await r.locator("#box svg").screenshot()}finally{await t.close()}},genSvg:async function(e,n={}){const{browser:t,page:r}=await ht(e);try{return(await r.evaluate(()=>{const e=document.querySelector("#box svg"),n=Array.from(document.querySelectorAll("head style")).map(e=>e.textContent).join("\n"),t=document.createElementNS("http://www.w3.org/2000/svg","style");t.textContent=n,e.insertBefore(t,e.firstChild);const r=document.getElementById("box").innerHTML;return t.remove(),r})).replace(/&nbsp;/g,"&#160;").trim()}finally{await t.close()}},translate:ut});function yt(e){return String(e).toLowerCase().replace(/[^a-z]/g,e=>"2"===e?"b":"g")}function bt(e){const n="LR"===e.dir?"right":"down",t=function(){const e=[];for(const[n,t]of Object.entries(Kn))"diamond"!==n&&e.push(`#.${yt(n)}: fill=${t.fill} stroke=${t.stroke}`);return e.join("\n")}(),r={};for(const n of e.nodes)r[n.id]=n;return`#direction: ${n}\n#font: Microsoft JhengHei\n${t}\n${e.nodes.map(e=>{return`[${n=e.cls,"diamond"===n?"<choice>":`<${yt(n)}>`}${e.label}]`;var n}).join("\n")}\n${e.nodes.filter(e=>e.group&&r[e.group]).map(e=>`[${r[e.group].label}] --\x3e [${e.label}]`).join("\n")}\n${e.edges.map(e=>{const n=r[e.from]?.label??e.from,t=r[e.to]?.label??e.to,o="dashed"===e.kind?"--\x3e":"->";return`[${n}]${e.label?` ${e.label} `:" "}${o} [${t}]`}).join("\n")}`}const mt=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${at("graphre/dist/graphre.js")}<\/script>\n<script>${at("nomnoml/dist/nomnoml.js")}<\/script>\n</head><body style="margin:0;background:#fff;font-family:'Microsoft JhengHei',sans-serif">\n<div id="box" style="display:inline-block;padding:20px"></div>\n<script>\nvar HALO_COLOR = ${JSON.stringify(Qn.haloColor)}, HALO_W = ${Qn.haloWidth}\nfunction applyEdgeLabelHalo(box){\n // 邊標籤 = <text> 無 data-name(節點內標籤皆帶 data-name)。\n var svg = box.querySelector('svg')\n var ts = Array.prototype.slice.call(box.querySelectorAll('svg text'))\n ts.forEach(function(t){\n if (t.hasAttribute('data-name')) return // 節點標籤, 不處理\n // (A) 白描邊 + paint-order:stroke 使描邊在字下方\n t.setAttribute('paint-order','stroke')\n t.setAttribute('stroke', HALO_COLOR)\n t.setAttribute('stroke-width', HALO_W)\n t.setAttribute('stroke-linejoin','round')\n // (B) z-order: 移至 svg 尾端 → 最後繪製, 永不被節點 rect/容器填色蓋住\n svg.appendChild(t)\n })\n}\nwindow.renderAndDetect = function(src){\n try {\n var svg = window.nomnoml.renderSvg(src)\n var box = document.getElementById('box'); box.innerHTML = svg\n applyEdgeLabelHalo(box)\n var texts = Array.prototype.slice.call(box.querySelectorAll('svg text'))\n var R = texts.map(function(t){ return t.getBoundingClientRect() })\n // 只計「節點×節點」文字重疊驅動間距(原則2/3): 節點標籤帶 data-name; 邊標籤無 data-name。\n // 凡牽涉邊標籤之重疊(邊標籤×節點 / 邊標籤×邊標籤)一律「不算碰撞」——其可讀性已由\n // halo(白描邊)+ z-order(提至最上層)保證, 不該用「加大間距」處理(否則 進度回報×Worker Thread\n // 這類邊標籤壓節點之 bbox 重疊會把圖撐爆)。唯有節點本體互疊才是 z-order 無法解、須間距處理者。\n var isNode = texts.map(function(t){ return t.hasAttribute('data-name') })\n var col = 0, details = []\n for (var i=0;i<R.length;i++) for (var j=i+1;j<R.length;j++){\n if (!(isNode[i] && isNode[j])) continue // 任一方為邊標籤 → 交給 halo+z-order, 不驅動間距\n var a=R[i], b=R[j]\n var ix = Math.min(a.right,b.right)-Math.max(a.left,b.left)\n var iy = Math.min(a.bottom,b.bottom)-Math.max(a.top,b.top)\n if (ix>2 && iy>2){ col++; if(details.length<3) details.push(((texts[i].textContent||'').trim().slice(0,6))+'×'+((texts[j].textContent||'').trim().slice(0,6))) }\n }\n return { ok:true, collisions: col, details: details }\n } catch(e){ return { ok:false, err:(e&&(e.message||e.stack))||String(e) } }\n}\nwindow.__ready = true\n<\/script></body></html>`;async function xt(n){const t=await e.chromium.launch();try{const e=await t.newPage({deviceScaleFactor:2});await e.setContent(mt,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{});const r=bt(n),o=await async function(e,n){const t=[40,60,85];let r=null;for(const o of t){const t=await e.evaluate(e=>window.renderAndDetect(e),"#spacing: "+o+"\n"+n);if(!t.ok)return{ok:!1,err:String(t.err).split("\n")[0]};if((null===r||t.collisions<r.collisions)&&(r={spacing:o,collisions:t.collisions,details:t.details}),0===t.collisions){r={spacing:o,collisions:0,details:[]};break}}return{ok:!0,...r}}(e,r);if(!o.ok)throw new Error(o.err);return await e.evaluate(e=>window.renderAndDetect(e),"#spacing: "+o.spacing+"\n"+r),await e.evaluate(()=>document.fonts&&document.fonts.ready),await e.waitForTimeout(180),{browser:t,page:e}}catch(e){throw await t.close(),e}}var wt=Object.freeze({__proto__:null,genPng:async function(e,n={}){const{browser:t,page:r}=await xt(e);try{return await r.locator("#box svg").screenshot()}finally{await t.close()}},genSvg:async function(e,n={}){const{browser:t,page:r}=await xt(e);try{return(await r.evaluate(()=>document.getElementById("box").innerHTML)).replace(/&nbsp;/g,"&#160;").trim()}finally{await t.close()}}});const vt=at("cytoscape/dist/cytoscape.min.js"),kt=at("dagre/dist/dagre.min.js"),_t=at("cytoscape-dagre/dist/cytoscape-dagre.js"),Et=at("cytoscape-svg/cytoscape-svg.js");function St(e){const n=[];for(const t of e.nodes)n.push({data:{id:t.id,label:t.label,parent:t.group},classes:t.cls});for(const t of e.edges)n.push({data:{source:t.from,target:t.to,label:t.label},classes:"dashed"===t.kind?"dashed":void 0});return n}const Ot=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${vt}<\/script>\n<script>${kt}<\/script>\n<script>${_t}<\/script>\n<script>${Et}<\/script>\n</head><body style="margin:0;background:#fff">\n<div id="cy" style="width:1400px;height:1400px;background:#fff"></div>\n<script>\nif (window.cytoscapeDagre) { try { cytoscape.use(window.cytoscapeDagre) } catch(e){} }\nif (window.cytoscapeSvg) { try { cytoscape.use(window.cytoscapeSvg) } catch(e){} }\n// mode: 'png'(預設) 或 'svg' — 版面/元素/樣式建置流程共用, 僅末端輸出格式不同(genPng 行為不變)\nwindow.renderFig = function(els, styleJson, rankDir, mode){ return new Promise(function(resolve){\n try {\n var cy = cytoscape({ container: document.getElementById('cy'), elements: els, style: JSON.parse(styleJson) })\n els.forEach(function(x){ if (x.classes && x.data && x.data.id) cy.getElementById(x.data.id).addClass(x.classes) })\n var l = cy.layout({ name:'dagre', rankDir:rankDir, nodeSep:42, rankSep:55, edgeSep:18 })\n l.promiseOn('layoutstop').then(function(){\n setTimeout(function(){\n try {\n var bb=cy.elements().boundingBox()\n if (mode === 'svg') { window.__svg = cy.svg({ full:true, scale:2, bg:'#ffffff' }) }\n else { window.__png = cy.png({ full:true, scale:2, bg:'#ffffff', output:'base64' }) }\n resolve({ ok:true, w:Math.round(bb.w), h:Math.round(bb.h) })\n }\n catch(e){ resolve({ ok:false, err:String(e.message||e) }) }\n }, 250)\n })\n l.run()\n } catch(e){ resolve({ ok:false, err:String(e.message||e) }) }\n})}\nwindow.__ready = true\n<\/script></body></html>`;async function It(n,t){const r=await e.chromium.launch();try{const e=await r.newPage({deviceScaleFactor:1});await e.setContent(Ot,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o=await e.evaluate(([e,n,t,r])=>window.renderFig(e,n,t,r),[St(n),'[\n { "selector":"node", "style":{ "shape":"round-rectangle","background-color":"#eef4fb","border-color":"#3f6fb0","border-width":1.8,"label":"data(label)","text-valign":"center","text-halign":"center","font-family":"Microsoft JhengHei, sans-serif","font-size":14,"color":"#1c2b36","width":"label","height":"label","padding":"10px","text-wrap":"wrap","text-max-width":"360px" } },\n { "selector":"node.green", "style":{ "background-color":"#eaf4ef","border-color":"#348a5c" } },\n { "selector":"node.orange", "style":{ "background-color":"#fcf0e2","border-color":"#c46e1a" } },\n { "selector":"node.purple", "style":{ "background-color":"#f4f0fa","border-color":"#8163ad" } },\n { "selector":"node.red", "style":{ "background-color":"#fbecea","border-color":"#c0392b" } },\n { "selector":"node.done", "style":{ "background-color":"#eaf4ef","border-color":"#256046","color":"#256046" } },\n { "selector":"node.diamond", "style":{ "shape":"diamond","background-color":"#fcf0e2","border-color":"#c46e1a","padding":"34px","text-max-width":"120px" } },\n { "selector":":parent", "style":{ "text-valign":"top","text-halign":"center","font-family":"Microsoft JhengHei, sans-serif","font-weight":"bold","padding":"16px","background-opacity":0.35,"border-width":2,"z-compound-depth":"bottom" } },\n { "selector":"node.blueG", "style":{ "background-color":"#f5f9fe","border-color":"#3f6fb0","color":"#3f6fb0" } },\n { "selector":"node.blueG2", "style":{ "background-color":"#eef4fb","border-color":"#3f6fb0","color":"#3f6fb0" } },\n { "selector":"node.greenG", "style":{ "background-color":"#f0f7f3","border-color":"#348a5c","color":"#348a5c" } },\n { "selector":"node.greenG2", "style":{ "background-color":"#eaf4ef","border-color":"#348a5c","color":"#348a5c" } },\n { "selector":"node.orangeG", "style":{ "background-color":"#fdf6ec","border-color":"#c46e1a","color":"#c46e1a" } },\n { "selector":"node.purpleG", "style":{ "background-color":"#faf7fd","border-color":"#8163ad","color":"#8163ad" } },\n { "selector":"edge", "style":{ "width":2.2,"line-color":"#44505a","target-arrow-color":"#44505a","target-arrow-shape":"triangle","curve-style":"bezier","label":"data(label)","font-family":"Microsoft JhengHei, sans-serif","font-size":12.5,"color":"#4a5560","text-background-opacity":0,"text-outline-color":"#ffffff","text-outline-width":3,"text-margin-y":-2 } },\n { "selector":"edge.dashed", "style":{ "line-style":"dashed" } }\n]',n.dir,t]);if(!o.ok)throw new Error(o.err);return await e.evaluate(e=>"svg"===e?window.__svg:window.__png,t)}finally{await r.close()}}var jt=Object.freeze({__proto__:null,genPng:async function(e,n={}){const t=await It(e,"png");return Buffer.from(t,"base64")},genSvg:async function(e,n={}){let t=await It(e,"svg");return t=t.replace(/&nbsp;/g,"&#160;"),/\sxmlns=/.test(t)||(t=t.replace("<svg",'<svg xmlns="http://www.w3.org/2000/svg"')),/font-family/.test(t)||(t=t.replace(">","><style>text{font-family:'Microsoft JhengHei',sans-serif}</style>")),t}});const At='"Microsoft JhengHei","Microsoft YaHei",sans-serif',Mt=`<style>text,.text-bold,.text-italic,.text-underline,tspan{font-family:${At} !important;}.text-bold{font-weight:bold !important;}</style>`;const Lt="<style>.text-italic{paint-order:stroke;stroke:#ffffff;stroke-width:3.5px;}</style>";const Pt=e=>String(e).replace(/\$/g,"\\$"),Bt={TB:"down",LR:"right",BT:"up",RL:"left"};function Ft(e,n){const t=tt(e),r=[];return r.push(` style.fill: "${t.fill}"`),r.push(` style.stroke: "${t.stroke}"`),t.text&&(n||"done"===e)&&r.push(` style.font-color: "${t.text}"`),n&&r.push(" style.bold: true"),"diamond"===t.shape&&r.push(" shape: diamond"),r}function Dt(e,n,t){const r=[];let o=e;for(;o;)r.unshift(o),o=n[o];return r.map(t).join(".")}function Nt(e,n,t,r,o,a){const i=" ".repeat(o),s=[];if(nt(e.cls)){s.push(`${i}${a(e.id)}: "${Pt(e.label)}" {`);const l=n[e.id]||[];l.length>0&&s.push(`${i} direction: ${Bt[r]||"down"}`);for(const n of Ft(e.cls,!0))s.push(`${i}${n}`);for(const e of l)s.push(Nt(e,n,t,r,o+2,a));s.push(`${i}}`)}else{s.push(`${i}${a(e.id)}: "${Pt(e.label)}" {`);for(const n of Ft(e.cls,!1))s.push(`${i}${n}`);s.push(`${i}}`)}return s.join("\n")}const $t={layout:"dagre",pad:40,themeID:0};async function Gt(e){const{D2:n}=await import("@terrastruct/d2"),t=new n;try{const n=function(e){const n=new Set,t={},r=e=>{if(t[e])return t[e];const r="n_"+String(e).replace(/[^A-Za-z0-9_]/g,"_");let o=r,a=2;for(;n.has(o);)o=r+"_"+a++;return n.add(o),t[e]=o,o},o={},a={};for(const n of e.nodes)n.group&&(o[n.id]=n.group,a[n.group]||(a[n.group]=[]),a[n.group].push(n));const i=e.nodes.filter(e=>!e.group),s=[];s.push(`direction: ${Bt[e.dir]||"down"}`);for(const n of i)s.push(Nt(n,a,o,e.dir,0,r));for(const n of e.edges){let e=`${Dt(n.from,o,r)} -> ${Dt(n.to,o,r)}`;n.label&&(e+=`: "${Pt(n.label)}"`),"dashed"===n.kind&&(e+=" { style.stroke-dash: 4 }"),s.push(e)}return s.join("\n\n")}(e),r=await t.compile({fs:{index:n},options:$t});let o=await t.render(r.diagram,r.renderOptions);return o=function(e){const n=(e=e.replace(/<mask\b([^>]*)>([\s\S]*?)<\/mask>/g,(e,n,t)=>`<mask${n}>${t.replace(/<rect[^>]*fill="black"[^>]*><\/rect>/g,"")}</mask>`)).indexOf("<style");if(n>=0)return e.slice(0,n)+Lt+e.slice(n);const t=e.indexOf(">");return e.slice(0,t+1)+Lt+e.slice(t+1)}(o),o=function(e){const n=(e=(e=e.replace(/font-family\s*:\s*[^;}<]+/gi,`font-family:${At}`)).replace(/font-family\s*=\s*"[^"]*"/gi,`font-family="${At}"`)).indexOf("<style");if(n>=0)return e.slice(0,n)+Mt+e.slice(n);const t=e.indexOf(">");return e.slice(0,t+1)+Mt+e.slice(t+1)}(o),o}finally{await t.ready.catch(()=>{}),t.worker&&t.worker.terminate&&await t.worker.terminate()}}var Tt=Object.freeze({__proto__:null,genPng:async function(e,n={}){const{default:t}=await import("sharp"),r=await Gt(e),o=r.match(/viewBox="0 0 (\d+(?:\.\d+)?) (\d+(?:\.\d+)?)"/),a=o?parseFloat(o[1]):1e3,i=96*Math.min(2.4,Math.max(1.4,1700/a));return await t(Buffer.from(r),{density:i}).png().toBuffer()},genSvg:async function(e,n={}){return await Gt(e)}});const Ct=at("@antv/g6/dist/g6.min.js"),Rt=at("@antv/g-lite/dist/index.umd.min.js"),Ht=at("@antv/g-svg/dist/index.umd.min.js");function zt(e){const n=String(e).split("\n");return[Math.round(Math.max(...n.map(e=>[...e].reduce((e,n)=>e+(/[一-鿿()/]/.test(n)?15.5:8.5),0)))+34),Math.round(26*n.length+20)]}function Wt(e){const n=[],t=[],r=new Set(e.nodes.filter(e=>nt(e.cls)).map(e=>e.id)),o={};for(const n of e.nodes)n.group&&(o[n.group]=o[n.group]||[]).push(n);const a=e=>{for(const n of o[e]||[]){if(!nt(n.cls))return n.id;const e=a(n.id);if(e)return e}return null},i=e=>r.has(e)&&a(e)||e;for(const r of e.nodes){const e=tt(r.cls);if(nt(r.cls)){t.push({id:r.id,combo:r.group,type:"rect",style:{zIndex:-10,labelText:r.label,labelPlacement:"top",labelFontFamily:et,labelFontSize:15,labelFontWeight:700,labelFill:e.text,fill:e.fill,fillOpacity:.3,stroke:e.stroke,lineWidth:2}});continue}const o="diamond"===e.shape;let[a,i]=zt(r.label);o&&(a+=60,i+=50),n.push({id:r.id,combo:r.group,type:o?"diamond":"rect",style:{size:[a,i],radius:o?0:6,lineWidth:1.8,fill:e.fill,stroke:e.stroke,labelText:r.label,labelPlacement:"center",labelFill:e.text,labelFontSize:14,labelFontFamily:et}})}let s=0;return{nodes:n,combos:t,edges:e.edges.map(e=>{s++;const n="dashed"===e.kind;return{id:"e"+s,source:i(e.from),target:i(e.to),style:{zIndex:100,lineWidth:2.2,endArrow:!0,stroke:n?tt("orange").stroke:Qn.line,lineDash:n?[7,5]:void 0,labelText:e.label||"",labelFontFamily:et,labelFontSize:12.5,labelFill:Qn.text,labelBackground:!1,labelStroke:Qn.haloColor,labelLineWidth:Qn.haloWidth,labelPaintOrder:"stroke",labelAutoRotate:!1}}})}}const qt=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${Ct}<\/script>\n</head><body style="margin:0;background:#fff">\n<div id="g6" style="background:#fff"></div>\n<script>\nwindow.renderFig = async function(g, rankdir, nodesep, ranksep, canvas, font, comboZ, edgeZ){\n try {\n const el = document.getElementById('g6')\n el.style.width = canvas + 'px'; el.style.height = canvas + 'px'\n if (window.__graph) { try { window.__graph.destroy() } catch(e){} }\n const graph = new G6.Graph({\n container: el, width: canvas, height: canvas, autoFit:'view',\n data: { nodes: g.nodes, edges: g.edges, combos: g.combos },\n layout: { type:'antv-dagre', rankdir: rankdir, nodesep: nodesep, ranksep: ranksep, sortByCombo: (g.combos && g.combos.length>0) },\n // 原則2:combo 墊底、edge 最上層之 graph 預設(各元素 style 已設, 此處兜底)\n combo: { type:'rect', style:{ zIndex: comboZ, padding:[30,18,18,18], labelPlacement:'top', labelFontFamily: font } },\n edge: { type:'polyline', style:{ zIndex: edgeZ, lineWidth:2.2, endArrow:true, labelFontFamily: font } },\n // 原則1:node/edge/combo 三層 graph 預設字型統一(JhengHei), 全覆蓋兜底\n node: { style:{ labelFontFamily: font } },\n })\n window.__graph = graph\n await graph.render()\n await new Promise(r=>setTimeout(r,300))\n return { ok:true }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\n// 以目前已渲染之圖截圖\nwindow.snap = async function(){\n try {\n await new Promise(r=>setTimeout(r,200))\n const png = await window.__graph.toDataURL({ mode:'overall' })\n return { ok:true, png }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\nwindow.__ready=true\n<\/script></body></html>`;const Jt=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${Rt}<\/script>\n<script>${Ht}<\/script>\n<script>${Ct}<\/script>\n</head><body style="margin:0;background:#fff">\n<div id="g6" style="background:#fff"></div>\n<script>\nwindow.renderFigSvg = async function(g, rankdir, nodesep, ranksep, canvas, font, comboZ, edgeZ){\n try {\n const el = document.getElementById('g6')\n el.style.width = canvas + 'px'; el.style.height = canvas + 'px'\n if (window.__graph) { try { window.__graph.destroy() } catch(e){} }\n const graph = new G6.Graph({\n container: el, width: canvas, height: canvas, autoFit:'view',\n renderer: () => new window.G.SVG.Renderer(),\n data: { nodes: g.nodes, edges: g.edges, combos: g.combos },\n layout: { type:'antv-dagre', rankdir: rankdir, nodesep: nodesep, ranksep: ranksep, sortByCombo: (g.combos && g.combos.length>0) },\n combo: { type:'rect', style:{ zIndex: comboZ, padding:[30,18,18,18], labelPlacement:'top', labelFontFamily: font } },\n edge: { type:'polyline', style:{ zIndex: edgeZ, lineWidth:2.2, endArrow:true, labelFontFamily: font } },\n node: { style:{ labelFontFamily: font } },\n })\n window.__graph = graph\n await graph.render()\n await new Promise(r=>setTimeout(r,300))\n return { ok:true }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\n// 取 main layer 之 SVG DOM(SVG renderer 下唯一承載節點/邊/combo 之 layer, background/label/transient 三層無內容),\n// 以 canvas.getBounds() 對齊 toDataURL({mode:'overall'}) 之緊裁切邊界改寫 viewBox/width/height, 補白底矩形。\nwindow.snapSvg = async function(){\n try {\n await new Promise(r=>setTimeout(r,200))\n const canvas = window.__graph.getCanvas()\n const bounds = canvas.getBounds()\n const minX = bounds.min[0], minY = bounds.min[1]\n const w = bounds.max[0] - minX, h = bounds.max[1] - minY\n const mainEl = canvas.getLayer('main').getContextService().getDomElement()\n const svg = mainEl.cloneNode(true)\n // canvas.getBounds() 回傳世界座標(排版原始座標, 未經 camera 縮放平移); 但複製之 DOM 內容掛在\n // #g-svg-camera 群組下, 帶有互動視圖之 camera transform(autoFit:'view' 縮放平移)。\n // 兩者座標系不同, 混用會裁切錯位, 故先歸零 camera transform, 使內容回到與 bounds 相同之世界座標。\n const cameraEl = svg.querySelector('#g-svg-camera')\n if (cameraEl) cameraEl.removeAttribute('transform')\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n svg.setAttribute('viewBox', minX + ' ' + minY + ' ' + w + ' ' + h)\n svg.setAttribute('width', String(Math.ceil(w)))\n svg.setAttribute('height', String(Math.ceil(h)))\n svg.removeAttribute('tabindex')\n svg.style.background = ''\n svg.style.pointerEvents = ''\n svg.style.gridArea = ''\n svg.style.outline = ''\n const bgRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n bgRect.setAttribute('x', String(minX)); bgRect.setAttribute('y', String(minY))\n bgRect.setAttribute('width', String(w)); bgRect.setAttribute('height', String(h))\n bgRect.setAttribute('fill', '#fff')\n svg.insertBefore(bgRect, svg.firstChild)\n const out = svg.outerHTML.replace(/&nbsp;/g, '&#160;')\n return { ok:true, svg: out }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\nwindow.__readySvg=true\n<\/script></body></html>`;var Ut=Object.freeze({__proto__:null,genPng:async function(n,t={}){const r=await e.chromium.launch();try{const e=await r.newPage({deviceScaleFactor:2}),t=[];e.on("pageerror",e=>t.push(e.message)),e.on("console",e=>{"error"===e.type()&&t.push("c:"+e.text())}),await e.setContent(qt,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o=Wt(n),a=await e.evaluate(([e,n,t,r,o,a,i,s])=>window.renderFig(e,n,t,r,o,a,i,s),[o,n.dir,28,60,2200,et,-10,100]);if(!a.ok)throw new Error("renderFig failed :: "+String(a.err).split("\n")[0]);const i=await e.evaluate(()=>window.snap());if(!i.ok)throw new Error("snap failed :: "+i.err);return Buffer.from(i.png.split(",")[1],"base64")}finally{await r.close()}},genSvg:async function(n,t={}){const r=await e.chromium.launch();try{const e=await r.newPage(),t=[];e.on("pageerror",e=>t.push(e.message)),e.on("console",e=>{"error"===e.type()&&t.push("c:"+e.text())}),await e.setContent(Jt,{waitUntil:"load"}),await e.waitForFunction(()=>window.__readySvg,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o=Wt(n),a=await e.evaluate(([e,n,t,r,o,a,i,s])=>window.renderFigSvg(e,n,t,r,o,a,i,s),[o,n.dir,28,60,2200,et,-10,100]);if(!a.ok)throw new Error("renderFigSvg failed :: "+String(a.err).split("\n")[0]);const i=await e.evaluate(()=>window.snapSvg());if(!i.ok)throw new Error("snapSvg failed :: "+i.err);return i.svg}finally{await r.close()}}});const Xt=at("@joint/core/dist/joint.min.js"),Yt=at("dagre/dist/dagre.min.js"),Vt=Object.fromEntries(Object.entries(Kn).map(([e,n])=>{const t={fill:n.fill,stroke:n.stroke,color:n.text};return"diamond"===n.shape&&(t.shape="diamond"),n.group&&(t.group=!0),[e,t]}));const Zt=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${Xt}<\/script>\n<script>${Yt}<\/script>\n</head><body style="margin:0;background:#fff">\n<div id="paper" style="background:#fff"></div>\n<script>\nvar CLS = ${JSON.stringify(Vt)}\nvar FONT = 'Microsoft JhengHei, "Microsoft JhengHei", sans-serif'\nvar FS = 14, FSG = 14.5, FSL = 12.5\n\n// 量測文字寬度(canvas)\nvar __cv = document.createElement('canvas'); var __cx = __cv.getContext('2d')\nfunction measure(text, fs){ __cx.font = fs + 'px ' + FONT; return __cx.measureText(text).width }\n\n// 依字寬自動換行(回傳 lines 陣列 + 最大寬)\nfunction wrapText(text, fs, maxW){\n // 先嘗試以全形分隔符/括號斷點,否則逐字\n var lines = [], cur = ''\n for (var i = 0; i < text.length; i++){\n var ch = text[i]\n var test = cur + ch\n if (measure(test, fs) > maxW && cur !== ''){ lines.push(cur); cur = ch }\n else cur = test\n }\n if (cur) lines.push(cur)\n var w = 0; lines.forEach(function(l){ w = Math.max(w, measure(l, fs)) })\n return { lines: lines, w: w }\n}\n\nfunction renderFig(els, rankDir, sep){\n return new Promise(function(resolve){\n try {\n var NODESEP = (sep && sep.nodesep) || 32 // 同層節點間距(緊湊固定基準)\n var RANKSEP = (sep && sep.ranksep) || 48 // 層間距(緊湊固定基準)\n var nodes = els.filter(function(x){ return x.id !== undefined })\n var edges = els.filter(function(x){ return x.source !== undefined })\n var nodeById = {}; nodes.forEach(function(nn){ nodeById[nn.id] = nn })\n\n // 分類:群組(parent)與一般節點\n var groups = nodes.filter(function(nn){ return CLS[nn.cls] && CLS[nn.cls].group })\n var groupIds = {}; groups.forEach(function(g){ groupIds[g.id] = true })\n var leaves = nodes.filter(function(nn){ return !groupIds[nn.id] })\n\n // 量測 leaf 節點尺寸(含換行)\n var maxLeafW = 480\n var sizing = {}\n leaves.forEach(function(nn){\n var st = CLS[nn.cls] || CLS.blue\n var wr = wrapText(nn.label, FS, maxLeafW)\n var w, h\n if (st.shape === 'diamond'){\n var tw = wr.w + 24, th = wr.lines.length * (FS + 6) + 16\n w = Math.max(tw * 1.9, 130); h = Math.max(th * 1.9, 90)\n } else {\n w = Math.max(wr.w + 34, 90); h = wr.lines.length * (FS + 7) + 24\n }\n sizing[nn.id] = { w: Math.round(w), h: Math.round(h), lines: wr.lines }\n })\n\n // ── 兩段式 layout(避開 dagre compound 對「群組為邊端點」的 rank bug)──\n // 巢狀關係:childrenOf[parentId] = [子節點...];topLevel = 無 parent 者\n var GPAD = 16 // 群組內距(標題列高 titleH 依群組各自動態計算)\n var childrenOf = {}\n nodes.forEach(function(nn){ var p = nn.parent || '__root'; (childrenOf[p] = childrenOf[p] || []).push(nn) })\n var grpById = {}; groups.forEach(function(gp){ grpById[gp.id] = gp })\n var parentOf = {}; nodes.forEach(function(nn){ parentOf[nn.id] = nn.parent || '__root' })\n // 將節點往上抬升,直到其 parent 為指定容器(回傳該容器之直接子);無則回 null\n function liftTo(nodeId, containerId){\n var cur = nodeId\n while (cur != null){\n if (parentOf[cur] === containerId) return cur\n cur = (parentOf[cur] === '__root') ? null : parentOf[cur]\n }\n return null\n }\n\n // size[id] = {w,h}:leaf 直接取量測;group 需先排內部子圖才得知\n var size = {}\n leaves.forEach(function(nn){ size[nn.id] = { w: sizing[nn.id].w, h: sizing[nn.id].h } })\n // 群組內每個子節點相對群組內容左上角的偏移\n var innerPos = {} // innerPos[childId] = {x,y} 相對其 parent 內容區\n var groupContentW = {}, groupContentH = {}\n var titleH = {}, titleLines = {} // 每個群組標題列高度與換行\n\n // 對一個容器(root 或 group)內的直接子節點做 dagre 排版,回傳 {w,h} 內容尺寸\n function layoutContainer(containerId){\n var kids = (childrenOf[containerId] || [])\n // 先遞迴排子群組,取得其尺寸\n kids.forEach(function(k){ if (grpById[k.id]) { var s = layoutContainer(k.id); size[k.id] = { w: s.w, h: s.h } } })\n var dg = new dagre.graphlib.Graph()\n dg.setGraph({ rankdir: rankDir, nodesep: NODESEP, ranksep: RANKSEP, marginx: 0, marginy: 0, ranker: 'tight-tree' })\n dg.setDefaultEdgeLabel(function(){ return {} })\n var kidSet = {}; kids.forEach(function(k){ kidSet[k.id] = true; dg.setNode(k.id, { width: size[k.id].w, height: size[k.id].h }) })\n // 納入「抬升至本容器直接子」後兩端相異之邊(含跨群組邊),避免重複\n var seen = {}\n edges.forEach(function(ed){\n var s = liftTo(ed.source, containerId), t = liftTo(ed.target, containerId)\n if (s && t && s !== t && kidSet[s] && kidSet[t]){\n var key = s + '' + t\n if (!seen[key]){ seen[key] = true; dg.setEdge(s, t) }\n }\n })\n dagre.layout(dg)\n var minX = 1e9, minY = 1e9, maxX = -1e9, maxY = -1e9\n kids.forEach(function(k){\n var p = dg.node(k.id)\n minX = Math.min(minX, p.x - p.width/2); minY = Math.min(minY, p.y - p.height/2)\n maxX = Math.max(maxX, p.x + p.width/2); maxY = Math.max(maxY, p.y + p.height/2)\n })\n if (kids.length === 0){ minX = minY = maxX = maxY = 0 }\n kids.forEach(function(k){\n var p = dg.node(k.id)\n innerPos[k.id + '@' + containerId] = { x: p.x - p.width/2 - minX, y: p.y - p.height/2 - minY }\n })\n var cw = (maxX - minX), ch = (maxY - minY)\n if (containerId !== '__root'){\n cw += GPAD * 2\n // 標題依群組內寬換行,動態決定標題列高度\n var gp = grpById[containerId]\n var twr = wrapText(gp.label, FSG, cw - GPAD * 2)\n var th = twr.lines.length * (FSG + 4) + 12\n titleH[containerId] = th; titleLines[containerId] = twr.lines\n ch += GPAD * 2 + th // 群組外框含內距與標題列\n }\n groupContentW[containerId] = cw; groupContentH[containerId] = ch\n return { w: cw, h: ch }\n }\n layoutContainer('__root')\n\n // 由 root 內容起,遞迴攤平出每個節點的絕對 (x,y)=中心點\n var pos = {} // pos[id] = {x,y,w,h}(x,y 為中心)\n function place(containerId, originX, originY){\n // originX/originY = 此容器內容區左上角絕對座標\n var kids = (childrenOf[containerId] || [])\n kids.forEach(function(k){\n var off = innerPos[k.id + '@' + containerId]\n var w = size[k.id].w, h = size[k.id].h\n var topLeftX = originX + off.x, topLeftY = originY + off.y\n pos[k.id] = { x: topLeftX + w/2, y: topLeftY + h/2, w: w, h: h }\n if (grpById[k.id]){\n // 群組內容區左上角 = 群組左上角 + 內距 +(標題列)\n place(k.id, topLeftX + GPAD, topLeftY + GPAD + titleH[k.id])\n }\n })\n }\n place('__root', 0, 0)\n\n // 建 JointJS graph\n var graph = new joint.dia.Graph({}, { cellNamespace: joint.shapes })\n var cells = []\n var cellById = {}\n\n // 群組容器(先畫,置底);標題用獨立 TextBlock 置於頂部中央\n var groupTitleCells = []\n groups.forEach(function(gp){\n var p = pos[gp.id]\n var st = CLS[gp.cls]\n var x = p.x - p.w/2, y = p.y - p.h/2\n var r = new joint.shapes.standard.Rectangle()\n r.position(x, y); r.resize(p.w, p.h)\n r.attr({\n body: { fill: st.fill, stroke: st.stroke, strokeWidth: 2, rx: 8, ry: 8, fillOpacity: 0.5 },\n label: { text: '' }\n })\n cells.push(r); cellById[gp.id] = r\n // 標題(獨立元件,置頂中央)\n var th = titleH[gp.id]\n var tb = new joint.shapes.standard.TextBlock()\n tb.resize(p.w - 16, th)\n tb.position(x + 8, y + 4)\n tb.attr({\n body: { fill: 'none', stroke: 'none' },\n // TextBlock 以 foreignObject<div> 渲染: font-family 屬性對 HTML div 無效(會落回瀏覽器預設 Times New Roman),\n // 字型必須寫進 style(JointJS 將 style keys 複製為 div inline CSS)才會套用 → 群組標題與全圖統一 JhengHei\n label: { text: (titleLines[gp.id] || [gp.label]).join('\\n'), fontFamily: FONT, fontSize: FSG, fontWeight: 'bold', fill: st.color,\n style: { color: st.color, fontWeight: 'bold', fontFamily: FONT } }\n })\n groupTitleCells.push(tb)\n })\n\n // leaf 節點\n leaves.forEach(function(nn){\n var p = pos[nn.id]\n var st = CLS[nn.cls] || CLS.blue\n var sz = sizing[nn.id]\n var cell\n if (st.shape === 'diamond'){\n cell = new joint.shapes.standard.Polygon()\n cell.attr('body/refPoints', '50,0 100,50 50,100 0,50')\n } else {\n cell = new joint.shapes.standard.Rectangle()\n cell.attr('body/rx', 6); cell.attr('body/ry', 6)\n }\n cell.position(p.x - p.w/2, p.y - p.h/2)\n cell.resize(p.w, p.h)\n cell.attr('body/fill', st.fill)\n cell.attr('body/stroke', st.stroke)\n cell.attr('body/strokeWidth', 1.8)\n cell.attr('label/text', sz.lines.join('\\n'))\n cell.attr('label/fontFamily', FONT)\n cell.attr('label/fontSize', FS)\n cell.attr('label/fill', st.color)\n cell.attr('label/lineHeight', (FS + 7) + 'px')\n cells.push(cell); cellById[nn.id] = cell\n })\n\n // 邊\n edges.forEach(function(ed){\n var s = cellById[ed.source], t = cellById[ed.target]\n if (!s || !t) return\n var l = new joint.shapes.standard.Link()\n l.source(s); l.target(t)\n var dashed = ed.cls === 'dashed'\n l.attr({\n line: {\n stroke: '#44505a', strokeWidth: 2.2,\n strokeDasharray: dashed ? '6,4' : null,\n targetMarker: { type: 'path', d: 'M 10 -5 0 0 10 5 z', fill: '#44505a' }\n }\n })\n l.router('normal'); l.connector('rounded', { radius: 6 })\n if (ed.label){\n // 邊標籤距離: 預設置中(0.5); 虛線(跨群組/驗證類)靠來源端;\n // 跨群組邊(端點落在不同容器)把標籤推向「位於容器外」的一端, 避免疊到群組內節點。\n var srcIn = parentOf[ed.source] && parentOf[ed.source] !== '__root'\n var tgtIn = parentOf[ed.target] && parentOf[ed.target] !== '__root'\n var dist = 0.5\n if (dashed) dist = 0.32\n else if (tgtIn && !srcIn) dist = 0.26 // 進入群組: 標籤靠來源(群組外)\n else if (srcIn && !tgtIn) dist = 0.74 // 離開群組: 標籤靠目標(群組外)\n // 全域修正 A: 背景框透明(不遮轉折線), 文字以白色光暈/描邊保持清晰\n // SVG paint-order:stroke → 先描白邊再填字 → 線段能透出、文字仍清晰\n l.labels([{\n markup: [{ tagName: 'text', selector: 'lbl' }],\n attrs: {\n lbl: { text: ed.label, fontFamily: FONT, fontSize: FSL, fill: '#4a5560',\n stroke: '#ffffff', strokeWidth: 3.5, paintOrder: 'stroke', strokeLinejoin: 'round',\n textAnchor: 'middle', textVerticalAnchor: 'middle' }\n },\n position: { distance: dist }\n }])\n }\n cells.push(l)\n })\n\n // 群組標題置於最上層\n groupTitleCells.forEach(function(tb){ cells.push(tb) })\n\n var paper = document.getElementById('paper')\n var P = new joint.dia.Paper({\n el: paper, model: graph,\n width: 100, height: 100, background: { color: '#ffffff' },\n cellViewNamespace: joint.shapes\n })\n graph.resetCells(cells)\n // 確保群組在底層\n groups.forEach(function(gp){ cellById[gp.id].toBack() })\n P.fitToContent({ padding: 28, allowNewOrigin: 'any', useModelGeometry: true })\n\n // ── 碰撞偵測(通用機制, 對所有圖一致) ─────────────────────────────\n // 量測「節點 bounding box」與「邊標籤 bounding box」, 兩兩偵測重疊(>2px 計碰撞)。\n // 群組容器刻意包住其子節點, 故排除「容器 ↔ 其後代」之合法重疊; 其餘皆計入。\n // 座標一律取 getBoundingClientRect()(同一螢幕座標系, 跨節點/標籤可直接比對, paper 未縮放故相對關係即真實版面)。\n // 容器後代集合(供排除合法包含)\n var descOf = {}\n function collectDesc(gid){\n var set = {}; var stack = (childrenOf[gid] || []).slice()\n while (stack.length){ var c = stack.pop(); set[c.id] = true; if (grpById[c.id]) (childrenOf[c.id] || []).forEach(function(k){ stack.push(k) }) }\n return set\n }\n groups.forEach(function(gp){ descOf[gp.id] = collectDesc(gp.id) })\n function toRect(dom, kind, id){\n var r = dom.getBoundingClientRect()\n return { kind: kind, id: id, x: r.left, y: r.top, w: r.width, h: r.height }\n }\n // 收集矩形: 節點(cellView body 之 client rect), 群組亦納入(偵測容器 ↔ 無關節點/容器)\n var rects = []\n nodes.forEach(function(nn){\n var c = cellById[nn.id]; if (!c) return\n var cv = P.findViewByModel(c); if (!cv) return\n // 群組量「外框 body」, 不含其內子節點; 一般節點量整個 cell\n var dom = grpById[nn.id] ? (cv.el.querySelector('[joint-selector="body"], rect') || cv.el) : cv.el\n rects.push(toRect(dom, grpById[nn.id] ? 'group' : 'node', nn.id))\n })\n // 邊標籤: 取其 label <text>(同一連線之 halo+fill 為單一 text, 不重複計)\n var labelRects = []\n cells.forEach(function(c){\n if (!(c.isLink && c.isLink())) return\n if (!(c.attributes.labels && c.attributes.labels.length)) return\n var lv = P.findViewByModel(c); if (!lv) return\n var tnodes = lv.el.querySelectorAll('[joint-selector="lbl"]')\n if (!tnodes.length) tnodes = lv.el.querySelectorAll('.labels text, .label text')\n for (var ti = 0; ti < tnodes.length; ti++){\n var r = tnodes[ti].getBoundingClientRect()\n if (r.width < 1) continue\n labelRects.push({ kind: 'label', id: c.id + ':' + ti, x: r.left, y: r.top, w: r.width, h: r.height })\n }\n })\n function overlapPx(a, b){\n var ix = Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x)\n var iy = Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y)\n return { ix: ix, iy: iy }\n }\n var allRects = rects.concat(labelRects)\n var collisions = 0, minGap = 1e9, details = []\n for (var i = 0; i < allRects.length; i++) for (var j = i + 1; j < allRects.length; j++){\n var A = allRects[i], B = allRects[j]\n // 排除合法包含: 容器 ↔ 其後代節點\n if (A.kind === 'group' && descOf[A.id] && descOf[A.id][B.id]) continue\n if (B.kind === 'group' && descOf[B.id] && descOf[B.id][A.id]) continue\n // 排除「群組外框 ↔ 邊標籤」: 群組為半透明色塊背景(swimlane), 標籤帶白色光暈疊於其上仍清晰,\n // 且跨群組邊必然穿越群組邊界 → 不計為碰撞(真正要避免的是標籤疊到節點文字/其他標籤)\n if ((A.kind === 'group' && B.kind === 'label') || (B.kind === 'group' && A.kind === 'label')) continue\n var ov = overlapPx(A, B)\n if (ov.ix > 2 && ov.iy > 2){\n collisions++\n if (details.length < 4) details.push((A.kind[0]) + A.id.slice(0, 6) + '×' + (B.kind[0]) + B.id.slice(0, 6))\n } else if (ov.ix > -200 && ov.iy > -200){\n // 估「最近可見間隙」: 兩矩形在分離軸上的最小正向距離(僅在另一軸有重疊時才算同列/同行相鄰)\n if (ov.ix <= 2 && ov.iy > 2) minGap = Math.min(minGap, -ov.ix)\n if (ov.iy <= 2 && ov.ix > 2) minGap = Math.min(minGap, -ov.iy)\n }\n }\n if (!isFinite(minGap)) minGap = 999\n resolve({ ok: true, w: Math.round(P.options.width), h: Math.round(P.options.height),\n collisions: collisions, minGap: Math.round(minGap), details: details })\n } catch(e){ resolve({ ok: false, err: String(e.message || e), stack: String(e.stack) }) }\n })\n}\nwindow.renderFig = renderFig\nwindow.__ready = true\n<\/script></body></html>`;async function Kt(n){const t=await e.chromium.launch();try{const e=await t.newPage({deviceScaleFactor:2}),r=[];e.on("pageerror",e=>r.push(e.message)),e.on("console",e=>{"error"===e.type()&&r.push("c:"+e.text())}),await e.setContent(Zt,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o={nodesep:32,ranksep:48},{els:a,rankDir:i}=function(e){const n=[];for(const t of e.nodes)n.push({id:t.id,label:t.label,cls:t.cls||"blue",parent:t.group||null});for(const t of e.edges)n.push({source:t.from,target:t.to,label:t.label||"",cls:"dashed"===t.kind?"dashed":""});return{els:n,rankDir:e.dir}}(n),s=await e.evaluate(([e,n,t])=>window.renderFig(e,n,t),[a,i,o]);if(!s.ok)throw new Error(s.err+(s.stack?"\n"+s.stack:""));return{browser:t,page:e,res:s}}catch(e){throw await t.close(),e}}var Qt=Object.freeze({__proto__:null,genPng:async function(e,n={}){const{browser:t,page:r}=await Kt(e);try{const e=await r.$("#paper svg");return await e.screenshot()}finally{await t.close()}},genSvg:async function(e,n={}){const{browser:t,page:r,res:o}=await Kt(e);try{let e=await r.$eval("#paper svg",e=>e.outerHTML);return e=e.replace(/^<svg([^>]*)>/,(e,n)=>{let t=n;return/\bxmlns=/.test(t)||(t=' xmlns="http://www.w3.org/2000/svg"'+t),t=t.replace(/\swidth="100%"/,` width="${o.w}"`),t=t.replace(/\sheight="100%"/,` height="${o.h}"`),t=t.replace(/position:\s*absolute;\s*inset:\s*[^;]*;\s*/,""),`<svg${t}>`}),e.replace(/&nbsp;/g,"&#160;").trim()}finally{await t.close()}}});const er=it("@logicflow/core/dist/index.css"),nr=at("@logicflow/core/dist/index.min.js"),tr=at("dagre/dist/dagre.min.js");const rr=Object.fromEntries(Object.entries(Kn).map(([e,n])=>[e,{fill:n.fill,stroke:n.stroke,text:n.text}])),or=JSON.stringify(rr),ar=JSON.stringify(Qn),ir=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<style>${er}</style>\n<script>${nr}<\/script>\n<script>${tr}<\/script>\n<style>\n * { font-family: ${et}; }\n html,body{ margin:0; background:#fff; }\n #app { background:#fff; }\n .lf-grid { display:none !important; }\n</style>\n</head><body>\n<div id="app"></div>\n<script>\nvar PAL = ${or}\nvar EDGE = ${ar}\nvar FONT = ${JSON.stringify(`14px ${et}`)} // canvas 量測用之 font 短語\nvar FONT_FAMILY = ${JSON.stringify(et)} // 純 font-family(供 SVG text 明確指定, 字型全覆蓋)\n\n// ---- 通用版面常數(非逐圖; 皆為與內容無關之全域預設) ----\nvar FONT_SIZE = 14, LINE_H = 22 // 節點字級 / 行高\nvar NODE_MAXW = 230, DIAMOND_MAXW = 110 // 換行最大寬度(矩形 / 菱形)\nvar PAD_X = 28, PAD_Y = 22 // 矩形內距\nvar DIA_PAD_X = 60, DIA_PAD_Y = 46 // 菱形內距(對角需較大留白)\nvar NODE_MINW = 120, NODE_MINH = 56 // 矩形最小尺寸\nvar DIA_MINW = 150, DIA_MINH = 110 // 菱形最小尺寸\nvar MARGIN = 20 // dagre 邊距\nvar GROUP_TITLE = 26 // 群組容器標題列高\nvar CANVAS_MARGIN = 60 // 畫布外緣留白\nvar LABEL_GAP = 28, LABEL_BIAS = 0.62 // 跨界邊標籤離容器框間隙 / 偏容器側權重\n\n// ---- 緊湊固定間距(通用機制, 對所有圖一致; 不做「掃描放大 until 零碰撞」) ----\n// 一律以單一緊湊間距排版, 維持報告可用的緊湊尺寸; 不因避碰撞而把圖撐大。\n// 文字遮蔽改由繪製順序(z-order)解決(群組墊底 / 節點居中 / 邊與邊標籤置頂), 不靠加大間距。\n// LR 層距略大於 TB(水平向標籤較長), 仍為固定值。\nvar SEP_TB = [36, 55] // [nodesep, ranksep] — 上下向緊湊間距\nvar SEP_LR = [36, 82] // [nodesep, ranksep] — 左右向緊湊間距\nvar COLLIDE_TOL = 2 // 重疊 >此像素 才計為碰撞(僅供回報用, 不再驅動間距放大)\n\n// 量測文字寬度\nvar _cv = document.createElement('canvas'); var _cx = _cv.getContext('2d')\nfunction measure(t, font){ _cx.font = font; return _cx.measureText(t).width }\n\n// 將長 label 依最大寬度斷行: 中文逐字可斷; 連續英數識別字(token)視為不可攔腰斷之整體, 整段超寬才獨佔一行。\nfunction wrap(label, maxW, font){\n _cx.font = font\n // 先切成 token: 連續英數(含 . _ / 等識別字常見字元)為一個 token, 其餘(中文/標點/空白)逐字\n var chars = Array.from(label)\n var tokens = [], buf = ''\n function isWordChar(c){ return /[0-9A-Za-z._/\\-]/.test(c) }\n for (var i=0;i<chars.length;i++){\n if (isWordChar(chars[i])){ buf += chars[i] }\n else { if (buf){ tokens.push(buf); buf='' } tokens.push(chars[i]) }\n }\n if (buf) tokens.push(buf)\n var lines = [], cur = ''\n for (var k=0;k<tokens.length;k++){\n var tk = tokens[k]\n var test = cur + tk\n if (_cx.measureText(test).width > maxW && cur.length>0){ lines.push(cur); cur = tk }\n else cur = test\n }\n if (cur) lines.push(cur)\n // 去除純空白造成的行首空白\n return lines.map(function(l){ return l.replace(/^\\s+/, '') }).filter(function(l){ return l.length>0 })\n}\n\n// 依 label 自動推算節點尺寸(寬: 依最寬一行字寬 + 內距; 高: 依行數 + 內距; 皆套最小值)\nfunction sizeOf(label, isDiamond){\n var maxW = isDiamond ? DIAMOND_MAXW : NODE_MAXW\n var lines = wrap(label, maxW, FONT)\n if (!lines.length) lines = [label]\n var w = 0\n lines.forEach(function(l){ w = Math.max(w, measure(l, FONT)) })\n var padX = isDiamond ? DIA_PAD_X : PAD_X, padY = isDiamond ? DIA_PAD_Y : PAD_Y\n var W = Math.ceil(w + padX*2)\n var H = Math.ceil(lines.length*LINE_H + padY*2)\n if (isDiamond){ W = Math.max(W, DIA_MINW); H = Math.max(H, DIA_MINH) }\n else { W = Math.max(W, NODE_MINW); H = Math.max(H, NODE_MINH) }\n return { w: W, h: H, text: lines.join('\\n') }\n}\n\n// 兩矩形重疊量(回傳 {ix,iy} 為水平/垂直交集像素, 皆>0 才重疊)\nfunction overlap(a, b){\n var ix = Math.min(a.x+a.w/2, b.x+b.w/2) - Math.max(a.x-a.w/2, b.x-b.w/2)\n var iy = Math.min(a.y+a.h/2, b.y+b.h/2) - Math.max(a.y-a.h/2, b.y-b.h/2)\n return { ix: ix, iy: iy }\n}\n\n// ---- 解析 fig 為內部結構 + 量測尺寸(只做一次, 不隨間距改變) ----\nfunction prepare(fig){\n var els = fig.els\n var nodes = els.filter(function(x){ return !('source' in x) })\n var edges = els.filter(function(x){ return ('source' in x) })\n var byId = {}; nodes.forEach(function(nd){ byId[nd.id] = nd })\n var groupIds = {}; nodes.forEach(function(nd){ if (nd.parent) groupIds[nd.parent] = true })\n nodes.forEach(function(nd){\n if (groupIds[nd.id]) return\n var sz = sizeOf(nd.label, nd.cls === 'diamond')\n nd._w = sz.w; nd._h = sz.h; nd._text = sz.text\n })\n return { nodes: nodes, edges: edges, byId: byId, groupIds: groupIds, rankDir: fig.rankDir }\n}\n\n// ---- 以給定間距做 dagre compound 排版, 回傳座標/群組框/邊標籤座標(供偵測與渲染) ----\nfunction layout(P, nodeSep, rankSep){\n var nodes = P.nodes, edges = P.edges, byId = P.byId, groupIds = P.groupIds\n var g = new dagre.graphlib.Graph({ compound:true })\n g.setGraph({ rankdir: P.rankDir, nodesep: nodeSep, ranksep: rankSep, marginx: MARGIN, marginy: MARGIN })\n g.setDefaultEdgeLabel(function(){ return {} })\n Object.keys(groupIds).forEach(function(gid){ g.setNode(gid, { label: gid }) })\n Object.keys(groupIds).forEach(function(gid){\n var gp = byId[gid] && byId[gid].parent\n if (gp && groupIds[gp]) g.setParent(gid, gp)\n })\n nodes.forEach(function(nd){\n if (groupIds[nd.id]) return\n g.setNode(nd.id, { width: nd._w, height: nd._h })\n if (nd.parent) g.setParent(nd.id, nd.parent)\n })\n function repLeaf(gid){\n var c = nodes.filter(function(x){ return x.parent === gid && !groupIds[x.id] })\n return c.length ? c[0].id : null\n }\n edges.forEach(function(ed){\n var sG = groupIds[ed.source], tG = groupIds[ed.target]\n if (!sG && !tG){ g.setEdge(ed.source, ed.target); return }\n var s = sG ? repLeaf(ed.source) : ed.source\n var t = tG ? repLeaf(ed.target) : ed.target\n if (s && t) g.setEdge(s, t)\n })\n dagre.layout(g)\n\n // leaf 節點座標\n var lfNodes = []\n nodes.forEach(function(nd){\n if (groupIds[nd.id]) return\n var p = g.node(nd.id)\n var pal = PAL[nd.cls] || PAL.blue\n var type = nd.cls === 'diamond' ? 'diamond' : 'rect'\n lfNodes.push({ id: nd.id, type: type, x: Math.round(p.x), y: Math.round(p.y), text: nd._text, _pal: pal, _w: nd._w, _h: nd._h })\n })\n // 群組容器框(dagre cluster bbox)\n function depth(gid){ var d=0,p=byId[gid]&&byId[gid].parent; while(p){ d++; p=byId[p]&&byId[p].parent } return d }\n var lfGroupNodes = []\n Object.keys(groupIds).sort(function(a,b){ return depth(a)-depth(b) }).forEach(function(gid){\n var gn = g.node(gid)\n var pal = PAL[byId[gid].cls] || PAL.blue\n lfGroupNodes.push({ id: gid, label: byId[gid].label, _pal: pal,\n x: Math.round(gn.x), y: Math.round(gn.y), _w: Math.round(gn.width), _h: Math.round(gn.height) })\n })\n\n // 幾何查詢\n var geo = {}\n lfNodes.forEach(function(nd){ geo[nd.id]={ x:nd.x, y:nd.y, w:nd._w, h:nd._h } })\n lfGroupNodes.forEach(function(b){ geo[b.id]={ x:b.x, y:b.y, w:b._w, h:b._h } })\n var parentBox = {}\n nodes.forEach(function(nd){ if (nd.parent && geo[nd.parent]) parentBox[nd.id] = geo[nd.parent] })\n function inGroup(id){ return !!parentBox[id] }\n\n // 跨界邊標籤座標(落在外部節點與群組框之間淨空)\n function labelPos(ed){\n if (!ed.label) return null\n var sIn = inGroup(ed.source) || groupIds[ed.source]\n var tIn = inGroup(ed.target) || groupIds[ed.target]\n var outId = null, inId = null\n if (sIn && !tIn){ inId=ed.source; outId=ed.target }\n else if (!sIn && tIn){ outId=ed.source; inId=ed.target }\n else {\n var s = geo[ed.source], t = geo[ed.target]\n if (!s || !t) return null\n var mx = (s.x+t.x)/2, my = (s.y+t.y)/2\n var hit = null\n lfGroupNodes.forEach(function(b){\n if (mx > b.x-b._w/2 && mx < b.x+b._w/2 && my > b.y-b._h/2 && my < b.y+b._h/2) hit = b\n })\n if (!hit) return null\n return { x: Math.round(hit.x - hit._w/2 - LABEL_GAP), y: Math.round(my) }\n }\n var o = geo[outId], box = parentBox[inId] || geo[inId]\n var tgt = geo[ed.target] || geo[inId]\n if (!o || !box || !tgt) return null\n var bias = LABEL_BIAS, obias = 1 - LABEL_BIAS\n if (P.rankDir === 'LR'){\n var boxEdgeX = (o.x < box.x) ? (box.x - box.w/2) : (box.x + box.w/2)\n var oInnerX = o.x + (o.x<box.x ? o.w/2 : -o.w/2)\n var lx = boxEdgeX*bias + oInnerX*obias\n return { x: Math.round(lx), y: Math.round(tgt.y) }\n } else {\n var boxEdgeY = (o.y < box.y) ? (box.y - box.h/2) : (box.y + box.h/2)\n var oInnerY = o.y + (o.y<box.y ? o.h/2 : -o.h/2)\n var ly = boxEdgeY*bias + oInnerY*obias\n return { x: Math.round(tgt.x), y: Math.round(ly) }\n }\n }\n\n // 邊 + 標籤框(供偵測). 標籤框尺寸依文字量測。\n var lfEdges = [], labelBoxes = []\n edges.forEach(function(ed, i){\n var lp = labelPos(ed)\n var txt = ed.label ? (lp ? { value: ed.label, x: lp.x, y: lp.y } : ed.label) : ''\n lfEdges.push({ id:'e'+i, sourceNodeId: ed.source, targetNodeId: ed.target, text: txt, _dashed: ed.dashed })\n if (ed.label){\n // 標籤未指定座標時, 取兩端中點估其位置(供偵測)\n var lx, ly\n if (lp){ lx = lp.x; ly = lp.y }\n else { var s=geo[ed.source], t=geo[ed.target]; if(!s||!t) return; lx=(s.x+t.x)/2; ly=(s.y+t.y)/2 }\n var lw = measure(ed.label, FONT) + 14, lh = LINE_H\n labelBoxes.push({ x: lx, y: ly, w: lw, h: lh, _label: true })\n }\n })\n\n return { lfNodes: lfNodes, lfGroupNodes: lfGroupNodes, lfEdges: lfEdges, labelBoxes: labelBoxes,\n byId: byId, parentBox: parentBox }\n}\n\n// ---- 偵測重疊: leaf↔leaf、group↔group(非巢狀)、leaf↔group(非歸屬)、邊標籤↔節點/其他標籤 ----\n// 回傳 { collisions, minGap(零碰撞時計區塊間最小可見間隙) }\nfunction detect(L){\n var byId = L.byId\n // 取某 leaf/group 的祖先群組鏈(含自身), 用於排除「容器內含其成員」的合法重疊\n function ancestors(id){ var arr=[id], p=byId[id]&&byId[id].parent; while(p){ arr.push(p); p=byId[p]&&byId[p].parent } return arr }\n // 判 a 是否為 b 之祖先或同一(容器包含成員 → 非碰撞)\n function related(idA, idB){\n var ca = ancestors(idA), cb = ancestors(idB)\n return ca.indexOf(idB) >= 0 || cb.indexOf(idA) >= 0\n }\n // 待偵測之矩形集合(節點 + 群組框, 各帶 id; 標籤無 id)\n var rects = []\n L.lfNodes.forEach(function(n){ rects.push({ id:n.id, x:n.x, y:n.y, w:n._w, h:n._h, kind:'node' }) })\n L.lfGroupNodes.forEach(function(b){ rects.push({ id:b.id, x:b.x, y:b.y, w:b._w, h:b._h, kind:'group' }) })\n var labels = L.labelBoxes.map(function(l){ return { x:l.x, y:l.y, w:l.w, h:l.h, kind:'label' } })\n\n var collisions = 0, minGap = Infinity\n // 節點/群組 兩兩(排除容器-成員關係)\n for (var i=0;i<rects.length;i++){\n for (var j=i+1;j<rects.length;j++){\n var A=rects[i], B=rects[j]\n if (related(A.id, B.id)) continue\n var ov = overlap(A, B)\n if (ov.ix > COLLIDE_TOL && ov.iy > COLLIDE_TOL){ collisions++ }\n else {\n // 未重疊: 取較近軸向之間隙(僅在另一軸有投影重疊時才計, 否則為斜對角不相鄰)\n if (ov.ix > 0) minGap = Math.min(minGap, -ov.iy) // 水平有交集 → 垂直間隙\n else if (ov.iy > 0) minGap = Math.min(minGap, -ov.ix) // 垂直有交集 → 水平間隙\n }\n }\n }\n // 邊標籤 ↔ 節點/群組(群組框為淺底大容器, 標籤落其內屬正常 → 僅與 leaf 節點及其他標籤計碰撞)\n for (var li=0;li<labels.length;li++){\n var lab = labels[li]\n for (var ri=0;ri<rects.length;ri++){\n if (rects[ri].kind !== 'node') continue\n var ovl = overlap(lab, rects[ri])\n if (ovl.ix > COLLIDE_TOL && ovl.iy > COLLIDE_TOL) collisions++\n }\n for (var lj=li+1;lj<labels.length;lj++){\n var ovll = overlap(lab, labels[lj])\n if (ovll.ix > COLLIDE_TOL && ovll.iy > COLLIDE_TOL) collisions++\n }\n }\n if (!isFinite(minGap)) minGap = 0 // 無相鄰對(單一節點等)\n return { collisions: collisions, minGap: minGap }\n}\n\n// ---- 把一份 layout 結果實際畫到 LF 並截圖前準備(回傳畫布尺寸) ----\nfunction renderLayout(L){\n var lfNodes = L.lfNodes, lfGroupNodes = L.lfGroupNodes, lfEdges = L.lfEdges\n\n // 整體 bbox → 畫布尺寸\n var minX=1e9,minY=1e9,maxX=-1e9,maxY=-1e9\n lfGroupNodes.concat(lfNodes).forEach(function(nd){\n minX=Math.min(minX, nd.x-nd._w/2); maxX=Math.max(maxX, nd.x+nd._w/2)\n minY=Math.min(minY, nd.y-nd._h/2); maxY=Math.max(maxY, nd.y+nd._h/2)\n })\n var M = CANVAS_MARGIN\n var W = Math.ceil(maxX-minX+M*2), H = Math.ceil(maxY-minY+M*2)\n var app = document.getElementById('app')\n app.innerHTML = ''\n app.style.width = W+'px'; app.style.height = H+'px'\n\n var G = window.Core || window.LogicFlow\n var LF = G.default || G.LogicFlow || G\n var RectNode = G.RectNode, RectNodeModel = G.RectNodeModel\n var DiamondNode = G.DiamondNode, DiamondNodeModel = G.DiamondNodeModel\n\n var lf = new LF({ container: app, grid:false, background:false, isSilentMode:true, stopScrollGraph:true, stopZoomGraph:true, adjustEdge:false,\n style: {\n rect: { rx: 7, ry: 7 },\n polyline: { stroke: EDGE.line, strokeWidth: 1.8 },\n nodeText: { color:'#1c2b36', fontFamily: FONT_FAMILY, fontSize: FONT_SIZE, overflowMode:'autoWrap', lineHeight: 1.4 },\n },\n })\n\n function makeRect(name){\n lf.register({ type: name, view: RectNode, model: class extends RectNodeModel {\n setAttributes(){ var p=this.properties||{}; if(p.width)this.width=p.width; if(p.height)this.height=p.height; this.radius=7 }\n getNodeStyle(){ var s=super.getNodeStyle(); var pal=this.properties._pal||PAL.blue; s.fill=pal.fill; s.stroke=pal.stroke; s.strokeWidth=this.properties.isGroup?2:1.8; if(this.properties.isGroup){s.fillOpacity=0.45} return s }\n getTextStyle(){ var s=super.getTextStyle(); var pal=this.properties._pal||PAL.blue; s.color=pal.text; s.fontFamily=FONT_FAMILY; s.fontSize=this.properties.isGroup?15:FONT_SIZE; if(this.properties.isGroup){s.fontWeight=700} s.overflowMode='autoWrap'; s.lineHeight=1.35; if(this.width)s.wrapPadding='0px'; return s }\n }})\n }\n function makeDiamond(name){\n lf.register({ type: name, view: DiamondNode, model: class extends DiamondNodeModel {\n setAttributes(){ var p=this.properties||{}; if(p.width)this.rx=p.width/2; if(p.height)this.ry=p.height/2 }\n getNodeStyle(){ var s=super.getNodeStyle(); var pal=this.properties._pal||PAL.diamond; s.fill=pal.fill; s.stroke=pal.stroke; s.strokeWidth=1.8; return s }\n getTextStyle(){ var s=super.getTextStyle(); var pal=this.properties._pal||PAL.diamond; s.color=pal.text; s.fontFamily=FONT_FAMILY; s.fontSize=FONT_SIZE; s.overflowMode='autoWrap'; return s }\n }})\n }\n makeRect('cRect'); makeDiamond('cDiamond')\n\n // 邊標籤樣式(全域修正 A): 背景透明(不遮轉折線) + 文字白色光暈(paint-order:stroke + stroke=白)\n function edgeText(s){\n s.color=EDGE.text; s.fontFamily=FONT_FAMILY; s.fontSize=12.5; s.overflowMode='default'; s.textWidth=400\n s.background={ fill:'transparent', stroke:'none' } // 透明底: 線段能透出, 不被白底遮斷\n s.stroke=EDGE.haloColor; s.strokeWidth=EDGE.haloWidth; s.paintOrder='stroke' // 白光暈描邊(描在文字下方)\n return s\n }\n var PolylineEdge=G.PolylineEdge, PolylineEdgeModel=G.PolylineEdgeModel\n lf.register({ type:'cDash', view:PolylineEdge, model: class extends PolylineEdgeModel {\n getEdgeStyle(){ var s=super.getEdgeStyle(); s.stroke='#7a8690'; s.strokeWidth=1.8; s.strokeDasharray='6 4'; return s }\n getTextStyle(){ return edgeText(super.getTextStyle()) }\n }})\n lf.register({ type:'cLine', view:PolylineEdge, model: class extends PolylineEdgeModel {\n getEdgeStyle(){ var s=super.getEdgeStyle(); s.stroke=EDGE.line; s.strokeWidth=1.8; return s }\n getTextStyle(){ return edgeText(super.getTextStyle()) }\n }})\n\n var graphNodes = []\n lfGroupNodes.forEach(function(b){\n graphNodes.push({ id:b.id, type:'cRect', x:b.x, y:b.y,\n text:{ value: b.label, x: b.x, y: Math.round(b.y - b._h/2 + GROUP_TITLE/2 + 4) },\n properties:{ width:b._w, height:b._h, isGroup:true, _pal:b._pal } })\n })\n lfNodes.forEach(function(nd){\n graphNodes.push({ id:nd.id, type: nd.type==='diamond'?'cDiamond':'cRect', x:nd.x, y:nd.y, text:nd.text, properties:{ width:nd._w, height:nd._h, _pal:nd._pal } })\n })\n var graphEdges = lfEdges.map(function(ed){\n return { id:ed.id, type: ed._dashed?'cDash':'cLine', sourceNodeId:ed.sourceNodeId, targetNodeId:ed.targetNodeId, text: ed.text||'' }\n })\n\n lf.render({ nodes: graphNodes, edges: graphEdges })\n\n // ---- 繪製順序(z-order, 原則2) ----\n // LF 預設把邊畫在節點下方, 群組(node)與節點同層; 文字會被節點/群組底色蓋住。\n // 以 setElementZIndex 數值分層強制: 群組容器=底(Z_GROUP) → 節點=中(Z_NODE) → 邊與邊標籤=頂(Z_EDGE),\n // 確保任何文字(節點文字 / 群組標題 / 邊標籤)都不被容器填色或其他區塊遮住。\n var Z_GROUP = 1, Z_NODE = 10, Z_EDGE = 100\n lfGroupNodes.forEach(function(b){ lf.setElementZIndex(b.id, Z_GROUP) }) // 半透明容器墊最底\n lfNodes.forEach(function(nd){ lf.setElementZIndex(nd.id, Z_NODE) }) // 節點居中\n graphEdges.forEach(function(ed){ lf.setElementZIndex(ed.id, Z_EDGE) }) // 邊與邊標籤置頂\n\n return { w: W, h: H, nNodes: graphNodes.length, nEdges: graphEdges.length }\n}\n\n// ---- 對外: 解析 → 以單一緊湊固定間距排版 → 實際渲染(z-order 處理遮蔽, 不掃描放大間距) ----\nwindow.renderFig = function(fig){ return new Promise(function(resolve){\n try {\n var P = prepare(fig)\n var sep = (P.rankDir === 'LR') ? SEP_LR : SEP_TB\n var L = layout(P, sep[0], sep[1])\n var d = detect(L) // 僅供回報(碰撞數/最小間隙), 不驅動任何放大\n var info = renderLayout(L)\n setTimeout(function(){ resolve({ ok:true, w:info.w, h:info.h, nNodes:info.nNodes, nEdges:info.nEdges,\n nodeSep:sep[0], rankSep:sep[1], collisions:d.collisions, minGap:Math.round(d.minGap) }) }, 200)\n } catch(e){ resolve({ ok:false, err: String(e && (e.stack||e.message||e)) }) }\n})}\nwindow.__ready = true\n<\/script></body></html>`;async function sr(n){const t=await e.chromium.launch();try{const e=await t.newPage({deviceScaleFactor:2}),r=[];e.on("pageerror",e=>r.push(e.message)),e.on("console",e=>{"error"===e.type()&&r.push("console:"+e.text())}),await e.setContent(ir,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:3e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o=function(e){const n=[];for(const t of e.nodes)n.push({id:t.id,label:t.label,cls:t.cls||"blue",parent:t.group});for(const t of e.edges)n.push({source:t.from,target:t.to,label:t.label||"",dashed:"dashed"===t.kind});return{rankDir:e.dir,els:n}}(n),a=await e.evaluate(e=>window.renderFig(e),o);if(!a.ok)throw new Error(a.err||"renderFig failed");return await e.evaluate(()=>document.fonts&&document.fonts.ready),{browser:t,page:e,res:a}}catch(e){throw await t.close(),e}}var lr=Object.freeze({__proto__:null,genPng:async function(e,n={}){const{browser:t,page:r}=await sr(e);try{return await r.locator("#app").screenshot()}finally{await t.close()}},genSvg:async function(e,n={}){const{browser:t,page:r,res:o}=await sr(e);try{let e=await r.evaluate(()=>document.querySelector("svg.lf-canvas-overlay").outerHTML);const n=e.match(/^<svg[^>]*>/);if(!n)throw new Error("genSvg: 找不到圖面 svg 根元素");let t=n[0].replace('width="100%"',`width="${o.w}"`).replace('height="100%"',`height="${o.h}"`);t=t.replace(/>$/,` viewBox="0 0 ${o.w} ${o.h}">`),e=t+e.slice(n[0].length);const a=`<style>${er}\n* { font-family: ${et}; }</style><rect x="0" y="0" width="${o.w}" height="${o.h}" fill="#fff"></rect>`;return e=e.replace("<g transform",a+"<g transform"),e=e.replace(/&nbsp;/g,"&#160;"),e}finally{await t.close()}}});const cr=r.dirname(t.fileURLToPath("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:o&&"SCRIPT"===o.tagName.toUpperCase()&&o.src||new URL("w-flowchart.umd.js",document.baseURI).href));let dr=null;var pr=Object.freeze({__proto__:null,genPng:async function(t,r={}){const o=await e.chromium.launch();try{const e=await o.newPage({deviceScaleFactor:2}),r=[];e.on("pageerror",e=>r.push(e.message)),e.on("console",e=>{"error"===e.type()&&r.push("c:"+e.text().slice(0,200))}),await e.setContent((null===dr&&(dr=n.readFileSync(`${cr}/page9.html`,"utf8").replace("/*__XYFLOW_CSS__*/",()=>it("@xyflow/react/dist/style.css")).replace("/*__REACT_JS__*/",()=>at("react/umd/react.production.min.js")).replace("/*__REACT_DOM_JS__*/",()=>at("react-dom/umd/react-dom.production.min.js")).replace("/*__XYFLOW_JS__*/",()=>at("@xyflow/react/dist/umd/index.js")).replace("/*__DAGRE_JS__*/",()=>at("@dagrejs/dagre/dist/dagre.min.js"))),dr),{waitUntil:"load"}),await e.waitForFunction(()=>"READY"===document.title||"FAIL"===document.title,{timeout:6e4}).catch(()=>{});const a=await e.evaluate(()=>({t:document.title,err:window.__err}));if("READY"!==a.t)throw new Error("BOOT FAIL :: "+a.err+" | "+r.slice(0,6).join(" | "));const i=function(e){const n=e.nodes.map(e=>{const n={id:e.id,label:e.label,kind:e.cls};return e.group&&(n.parent=e.group),n}),t=e.edges.map(e=>{const n={s:e.from,t:e.to};return e.label&&(n.l=e.label),"dashed"===e.kind&&(n.dashed=!0),n});return{layout:"dagrec",rankDir:e.dir||"TB",nodesep:38,ranksep:44,nodes:n,edges:t}}(t),s=await e.evaluate(e=>window.renderFig(e),i);if(!s.ok)throw new Error("FAIL :: "+s.err);return await e.evaluate(()=>document.fonts&&document.fonts.ready),await e.waitForTimeout(250),await e.locator("#shot").screenshot()}finally{await o.close()}}});function fr(e){const n=e.nodes.filter(e=>nt(e.cls)).map(n=>{const t=tt(n.cls);return{id:n.id,label:n.label,parent:n.group||null,align:n.align,mi:e.nodes.indexOf(n),fill:t.fill,stroke:t.stroke,font:t.text}}),t=e.nodes.filter(e=>!nt(e.cls)).map(n=>{const t=tt(n.cls);return{id:n.id,label:n.label,title:n.title,items:n.items,parent:n.group||null,mi:e.nodes.indexOf(n),diamond:"diamond"===t.shape,fill:t.fill,stroke:t.stroke,font:t.text}}),r=e.edges.map((e,n)=>({id:"e"+n,from:e.from,to:e.to,label:e.label||"",dashed:"dashed"===e.kind})),o={};n.forEach(e=>o[e.id]=e.parent),t.forEach(e=>o[e.id]=e.parent);const a=e=>{const n=[];let t=o[e];for(;t;)n.push(t),t=o[t];return n};return r.forEach(e=>{const n=new Set(a(e.to));e.container=a(e.from).find(e=>n.has(e))||null}),{dir:e.dir||"TB",nodes:t,groups:n,edges:r}}const ur=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${at("elkjs/lib/elk.bundled.js")}<\/script>\n<style>body{margin:0;background:#fff} .lbl{font-family:'Microsoft JhengHei','微軟正黑體',sans-serif}</style>\n</head><body>\n<div id="meas" style="position:absolute;left:-99999px;top:0;font-family:'Microsoft JhengHei',sans-serif;visibility:hidden"></div>\n<div id="stage"></div>\n<script>\nconst FONT = "'Microsoft JhengHei','微軟正黑體',sans-serif"\nconst EDGE_LINE = '${Qn.line}', EDGE_TEXT = '${Qn.text}', HALO = '${Qn.haloColor}'\nconst FS = 14, GFS = 15, EFS = 12.5, MAXW = 200\n// 容器內矩形框之垂直對齊: 預設 top; 可於數據之群組節點設 align:'top'|'center'|'bottom' 個別覆寫(改 DEF_VALIGN 改全域預設)\nconst VALIGN = { top:'TOP', center:'CENTER', bottom:'BOTTOM' }, DEF_VALIGN = 'top'\nconst meas = document.getElementById('meas')\nfunction measure(label, fs, maxW){\n const d=document.createElement('div')\n d.style.cssText='display:inline-block;white-space:normal;overflow-wrap:break-word;word-break:normal;text-align:center;line-height:1.4;font-size:'+fs+'px;max-width:'+maxW+'px;padding:0;font-family:'+FONT\n d.textContent=label; meas.appendChild(d); const r=d.getBoundingClientRect(); meas.removeChild(d)\n return { w:Math.ceil(r.width), h:Math.ceil(r.height) }\n}\n// 量整塊 items 尺寸: 完全比照渲染(line-height 1.55、各項 nowrap)→ 直接得 items 區實際高度, 避免逐項估高(用錯 line-height)累積成底部多餘留白\nfunction measureItems(items, fs){\n const d=document.createElement('div')\n d.style.cssText='display:inline-block;font-size:'+fs+'px;line-height:1.55;font-family:'+FONT\n d.innerHTML=items.map(it=>'<div style="white-space:nowrap">•&#160;'+String(it).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')+'</div>').join('')\n meas.appendChild(d); const r=d.getBoundingClientRect(); meas.removeChild(d)\n return { w:Math.ceil(r.width), h:Math.ceil(r.height) }\n}\nconst esc = s => String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')\nconst mix = (a,b,t) => { const pa=[1,3,5].map(i=>parseInt(a.slice(i,i+2),16)), pb=[1,3,5].map(i=>parseInt(b.slice(i,i+2),16)); return '#'+pa.map((x,i)=>Math.round(x*(1-t)+pb[i]*t).toString(16).padStart(2,'0')).join('') }\n// 確保「起點後第一段」與「終點前最後一段」之直線長度 >= MIN(轉折不貼端點, 維持箭頭指向性)。\n// 做法: 末段過短時, 沿趨近軸向把「最後轉角」與「其前一轉角」一起後移(兩者同移=保正交); 需 >=4 點才不動端點。\n// ── 菱形端點貼齊(ELK 以外接矩形算端點, 落在矩形邊上非頂點處會與菱形斜邊「空接」) ──\n// 規則(共進共出, 每側獨立; 詳 p10/README):\n// R1 共出: 該側所有「出」一律由該側「頂點」出發, 多條共用首段後於各自高度 90 度轉出(分岔)。\n// R2 共進: 該側「無出」→ 全部匯入「頂點」(各自橫移至中軸, 共用末段, 箭頭重合);\n// 該側「有出」→ 依「半側」匯入該半側「斜邊中點」(頂點讓給出, 進出不同點)。\n// 正交線交叉允許存在(正交路由常態), 一致性優先。\n\n// 判定端點落在外接矩形哪一側; 回 { ax, sg, v }(離開軸/正負/該側頂點), 不在邊上回 null\nfunction diamondSide(p, box){\n const cx = box.x + box.w/2, cy = box.y + box.h/2, EPS = 1.5\n if (Math.abs(p.y - (box.y + box.h)) < EPS) return { ax: 'y', sg: 1, v: { x: cx, y: box.y + box.h } }\n if (Math.abs(p.y - box.y) < EPS) return { ax: 'y', sg: -1, v: { x: cx, y: box.y } }\n if (Math.abs(p.x - box.x) < EPS) return { ax: 'x', sg: -1, v: { x: box.x, y: cy } }\n if (Math.abs(p.x - (box.x + box.w)) < EPS) return { ax: 'x', sg: 1, v: { x: box.x + box.w, y: cy } }\n return null\n}\n\n// 該側某「半側」之斜邊中點(混合側的進匯點); half=+1 取座標較大半側, -1 反之\nfunction diamondSlantMid(box, side, half){\n const cx = box.x + box.w/2, cy = box.y + box.h/2, hw = box.w/2, hh = box.h/2\n if (side.ax === 'y') return { x: cx + half * hw / 2, y: cy + side.sg * hh / 2 }\n return { x: cx + side.sg * hw / 2, y: cy + half * hh / 2 }\n}\n\n// R1 共出: 出邊起點改自「頂點」出發\nfunction routeOutFromVertex(pts, side){\n const p0 = pts[0], p1 = pts[1]\n const EPS = 1.5, J = 18\n const v = side.v\n const off = side.ax === 'y' ? Math.abs(p0.x - v.x) : Math.abs(p0.y - v.y)\n if (off < EPS) return // 已在頂點(置中), 不動\n const alongAxis = side.ax === 'y' ? Math.abs(p1.x - p0.x) < EPS : Math.abs(p1.y - p0.y) < EPS\n if (!alongAxis) { pts.unshift(v); return } // 原首段即沿側邊橫走: 自頂點先橫走接回\n if (pts.length > 2) {\n // 有後續轉折: 頂點 → 沿軸行至原首個轉折高度 → 橫向接回(單一 L 型; 轉折可貼近頂點)\n const q1 = side.ax === 'y' ? { x: v.x, y: p1.y } : { x: p1.x, y: v.y }\n pts.splice(0, 1, v, q1)\n return\n }\n // 無轉折之直線邊: 於頂點外側作雙直角接回各自路線(距離取 J 與可用長度之小者)\n const segLen = side.ax === 'y' ? (p1.y - p0.y) * side.sg : (p1.x - p0.x) * side.sg\n const j = Math.min(J, Math.max(4, segLen / 2))\n const q1 = side.ax === 'y' ? { x: v.x, y: v.y + side.sg * j } : { x: v.x + side.sg * j, y: v.y }\n const q2 = side.ax === 'y' ? { x: p0.x, y: v.y + side.sg * j } : { x: v.x + side.sg * j, y: p0.y }\n pts.splice(0, 1, v, q1, q2)\n}\n\n// R2 決策: 進匯點 = 該側無出 → 頂點; 有出 → 依端點所在半側之斜邊中點\nfunction diamondInAnchor(box, side, hasOutOnSide, pE){\n if(!hasOutOnSide) return { x: side.v.x, y: side.v.y }\n const half = (side.ax === 'y' ? (pE.x - (box.x + box.w/2)) : (pE.y - (box.y + box.h/2))) >= 0 ? 1 : -1\n return diamondSlantMid(box, side, half)\n}\n\n// R2 共進: 進邊終點改匯入 anchor(頂點或半側斜邊中點)\n// 橫向差距小且末段前為可伸縮橫向段 → 整段末端直線「平移」對齊 anchor 軸線(零多餘轉折);\n// 否則於側外 J 處橫移 bus 再沿軸進入 anchor。\nfunction routeInToAnchor(pts, side, anchor){\n const pE = pts[pts.length - 1], pP = pts[pts.length - 2]\n const EPS = 1.5, J = 18, SLIDE = 40 // SLIDE: 可平移之最大橫向差距(過大恐撞鄰近元素, 改走 bus)\n const alongAxis = side.ax === 'y' ? Math.abs(pP.x - pE.x) < EPS : Math.abs(pP.y - pE.y) < EPS\n if (!alongAxis) return // 末段非沿進入軸(罕見), 保留原路由\n const lateral = side.ax === 'y' ? Math.abs(pE.x - anchor.x) : Math.abs(pE.y - anchor.y)\n if (lateral < EPS) {\n pts[pts.length - 1] = { x: anchor.x, y: anchor.y } // 已在 anchor 軸線上: 直接沿軸進入\n return\n }\n if (lateral <= SLIDE && pts.length >= 3) {\n const pP2 = pts[pts.length - 3]\n const prevHorizontal = side.ax === 'y' ? Math.abs(pP2.y - pP.y) < EPS : Math.abs(pP2.x - pP.x) < EPS\n if (prevHorizontal) {\n if (side.ax === 'y') pP.x = anchor.x; else pP.y = anchor.y\n pts[pts.length - 1] = { x: anchor.x, y: anchor.y }\n return\n }\n }\n const Lv = side.ax === 'y' ? side.v.y + side.sg * J : side.v.x + side.sg * J // 側外橫移層\n const segOK = side.ax === 'y' ? (pP.y - Lv) * side.sg > 2 : (pP.x - Lv) * side.sg > 2 // 原末段須延伸到橫移層之外\n if (!segOK) { pts[pts.length - 1] = { x: anchor.x, y: anchor.y }; return } // 空間不足: 直接斜線前最短接入(極罕見)\n const b1 = side.ax === 'y' ? { x: pE.x, y: Lv } : { x: Lv, y: pE.y }\n const b2 = side.ax === 'y' ? { x: anchor.x, y: Lv } : { x: Lv, y: anchor.y }\n pts.splice(pts.length - 1, 1, b1, b2, { x: anchor.x, y: anchor.y })\n}\n\nfunction ensureStub(pts, MIN, skipStart){\n function fixEnd(p){\n const n=p.length; if(n<4) return\n const C=p[n-1], B=p[n-2]\n const dx=C.x-B.x, dy=C.y-B.y, len=Math.abs(dx)+Math.abs(dy)\n if(len>=MIN || len<0.5) return\n const need=MIN-len, ux=dx/len, uy=dy/len\n p[n-2]={x:B.x-ux*need, y:B.y-uy*need}\n p[n-3]={x:p[n-3].x-ux*need, y:p[n-3].y-uy*need}\n }\n // 終點端(箭頭側)一律套最低門檻——含菱形貼齊後之路徑(bus 支線本給滿 J; 平移/保留支線之轉角平移不破壞正交)\n fixEnd(pts)\n // 起點端僅於「菱形頂點分岔」時跳過(分岔轉折貼近頂點屬預期; 後移轉角會與其後路徑段脫勾扭出斜線)\n if(!skipStart){ pts.reverse(); fixEnd(pts); pts.reverse() }\n return pts\n}\n\n// 供測試直接驗證菱形端點規則之純函式(不影響渲染)\nwindow.__dia = { diamondSide, diamondSlantMid, diamondInAnchor, routeOutFromVertex, routeInToAnchor }\n\nwindow.renderFig = async function(spec){\n try {\n const dir = spec.dir==='LR' ? 'RIGHT' : 'DOWN'\n const nById={}, gById={}\n spec.nodes.forEach(n=>nById[n.id]=n); spec.groups.forEach(g=>gById[g.id]=g)\n\n // 節點尺寸量測\n const size={}\n spec.nodes.forEach(n=>{\n if(n.items && n.items.length){ // 標題+項目節點(類 UML class box): 量標題與各項目 → 框寬=最寬列+邊距, 框高=標題列+各項目列\n const tm=measure(n.title||n.label, FS, 250), im=measureItems(n.items, FS-1)\n const headH=tm.h+12 // 標題列高(框頂到分隔線), 供分層繪製定位\n size[n.id]={ w:Math.max(tm.w, im.w)+30, h:headH+im.h+10, headH } // items 區高 = 實量塊高 + 上下 padding(6+4), 與渲染一致無多餘留白\n } else { const m=measure(n.label, FS, n.diamond?150:MAXW); if(n.diamond){ const d=Math.round(Math.max(m.w,m.h)*1.5+34); size[n.id]={w:d,h:d} } else size[n.id]={w:m.w+24,h:m.h+16} }\n })\n\n // 遞迴建 ELK 子樹(群組含 children)\n // 保序: 數據之節點順序=語義順序(選單/報告章節順序), 令 ELK 同層節點依 model order 排列, 不因交叉最小化重排(如 GIS2D/GIS3D 被拆開)。\n // considerModelOrder/forceNodeModelOrder 於 elkjs + INCLUDE_CHILDREN(巢狀)會內部崩潰, 故改用 semiInteractive:\n // crossingMinimization.semiInteractive + 各葉節點 elk.position 位置提示(以數據序為序), 同層節點依提示排序, 巢狀圖亦支援。\n // 例外: 含循環(如流程之退回邊)的圖, 位置提示會干擾分層使入口節點偏離頂端 → 根層不加提示(容器內仍保序)。\n const ORDER_OPTS = { 'elk.layered.crossingMinimization.semiInteractive':'true' }\n const hasCycle = (() => { const adj={}; spec.edges.forEach(e=>{ (adj[e.from]=adj[e.from]||[]).push(e.to) }); const st={}; const dfs=(u)=>{ st[u]=1; for(const v of (adj[u]||[])){ if(st[v]===1) return true; if(!st[v] && dfs(v)) return true } st[u]=2; return false }; return Object.keys(adj).some(u=>!st[u]&&dfs(u)) })()\n const gOpts = { 'elk.layered.nodePlacement.bk.fixedAlignment':'BALANCED', 'elk.padding':'[top=10,left=14,bottom=14,right=14]', 'elk.nodeLabels.placement':'[H_CENTER, V_TOP, INSIDE]', 'elk.algorithm':'layered', 'elk.direction':dir, 'elk.edgeRouting':'ORTHOGONAL', 'elk.hierarchyHandling':'INCLUDE_CHILDREN', 'elk.spacing.nodeNode':'28', 'elk.layered.spacing.nodeNodeBetweenLayers':'30', 'elk.spacing.edgeEdge':'22', 'elk.layered.spacing.edgeEdgeBetweenLayers':'24', ...ORDER_OPTS }\n function elkEdge(e){ const lab = e.label ? [{ text:e.label, width: measure(e.label,EFS,300).w, height:18 }] : []; return { id:e.id, sources:[e.from], targets:[e.to], labels:lab } }\n function build(parentId, padMap, wrapAR){\n const children=[], edges=[]\n spec.groups.filter(g=>g.parent===parentId).forEach(g=>{ const sub=build(g.id, padMap, wrapAR); const gm=measure(g.label,GFS,400)\n // 第二趟: 標題比容器寬時加大該容器左右 padding 撐寬(ELK 尊重複合容器 padding; 巢狀父容器自動跟著變寬, 不溢出又不過寬)\n const ex=(padMap&&padMap[g.id])||0\n const go={ ...gOpts, 'elk.padding':'[top=10,left='+(14+ex)+',bottom=14,right='+(14+ex)+']' }\n // A4 折排: 該容器被挑中時設 aspectRatio 觸發 ELK wrapping, 把線性鏈折成多欄/列(跨欄/列連接線由 ELK 自動正交路由)\n const ar=wrapAR&&wrapAR[g.id]; if(ar){ go['elk.aspectRatio']=String(ar); go['elk.layered.wrapping.strategy']='SINGLE_EDGE' }\n if(parentId || !hasCycle){ go['elk.position']='('+g.mi+','+g.mi+')' }\n children.push({ id:g.id, labels:[{text:g.label, width:gm.w+12, height:gm.h+6}], layoutOptions:go, children:sub.children, edges:sub.edges }) })\n spec.nodes.filter(n=>n.parent===parentId).forEach(n=>{ const va=VALIGN[(gById[parentId]&&gById[parentId].align)||DEF_VALIGN]||'TOP'; const lo={ 'elk.alignment':va }; if(parentId || !hasCycle){ lo['elk.position']='('+n.mi+','+n.mi+')' } children.push({ id:n.id, width:size[n.id].w, height:size[n.id].h, layoutOptions:lo }) })\n spec.edges.filter(e=>e.container===parentId).forEach(e=>{ edges.push(elkEdge(e)) })\n return { children, edges }\n }\n const rootOpts = { 'elk.layered.nodePlacement.bk.fixedAlignment':'BALANCED', 'elk.algorithm':'layered', 'elk.direction':dir, 'elk.edgeRouting':'ORTHOGONAL', 'elk.hierarchyHandling':'INCLUDE_CHILDREN', 'elk.spacing.nodeNode':'30', 'elk.layered.spacing.nodeNodeBetweenLayers':'34', 'elk.spacing.edgeNode':'24', 'elk.spacing.edgeEdge':'22', 'elk.layered.spacing.edgeEdgeBetweenLayers':'24', 'elk.layered.spacing.edgeNodeBetweenLayers':'26', ...(hasCycle ? { 'elk.layered.cycleBreaking.strategy':'MODEL_ORDER' } : ORDER_OPTS) }\n const elk = new ELK()\n const mkGraph = (pm, war) => { const rb = build(null, pm, war); return { id:'root', layoutOptions:rootOpts, children:rb.children, edges:rb.edges } }\n let res = await elk.layout(mkGraph({}, {}))\n // 第二趟: 偵測「標題寬 > 容器寬」之容器 → 加大其左右 padding 撐寬, 重新佈局(巢狀父容器自動跟進; 標題不溢出又不過寬)\n const padMap = {}\n ;(function collect(cell){ (cell.children||[]).forEach(ch=>{ if(gById[ch.id]){ const lw=(ch.labels&&ch.labels[0]&&ch.labels[0].width)||0; if(lw>(ch.width||0)) padMap[ch.id]=Math.ceil((lw-ch.width)/2)+6; collect(ch) } }) })(res)\n if(Object.keys(padMap).length) res = await elk.layout(mkGraph(padMap, {}))\n // ---- A4 長寬比自動折排 ----\n // A4 直式 h/w≈1.414、橫式≈0.707. 過高(R>HIGH)→挑最高之多子容器折成多欄縮高; 過寬(R<LOW)→挑最寬者折成多列增高.\n // 折排引擎=ELK wrapping(設 aspectRatio 觸發, 自動正交畫跨欄/列連接線); 逐次加深直到落入 A4 區間 / 無可折 / 達上限.\n const A4HIGH=1.45, A4LOW=0.70, wrapAR={}\n const foldable = () => { const out=[]; (function w(cell){ (cell.children||[]).forEach(ch=>{ if(gById[ch.id]){ if((ch.children||[]).length>=4) out.push({id:ch.id, w:ch.width||0, h:ch.height||0}); w(ch) } }) })(res); return out }\n for(let it=0; it<8; it++){\n const R=(res.height||1)/(res.width||1)\n if(R<=A4HIGH && R>=A4LOW) break\n const fs=foldable(); if(!fs.length) break\n let pick\n if(R>A4HIGH){ fs.sort((a,b)=>b.h-a.h); pick=fs.find(g=>(wrapAR[g.id]||0.6)<6) }\n else { fs.sort((a,b)=>b.w-a.w); pick=fs.find(g=>(wrapAR[g.id]||3.5)>0.22) }\n if(!pick) break\n wrapAR[pick.id] = R>A4HIGH ? (wrapAR[pick.id]||0.6)*1.9 : (wrapAR[pick.id]||3.5)/1.9\n res = await elk.layout(mkGraph(padMap, wrapAR))\n }\n\n // 遞迴收集: 容器(深度序)、節點(絕對座標)、邊(以容器絕對座標 + section 點)\n const groupsOut=[], nodesOut=[], edgesOut=[]\n function walk(cell, ox, oy, depth){\n ;(cell.children||[]).forEach(ch=>{\n const ax=ox+(ch.x||0), ay=oy+(ch.y||0)\n if (gById[ch.id]) { groupsOut.push({ g:gById[ch.id], x:ax, y:ay, w:ch.width, h:ch.height, depth, lbl:(ch.labels&&ch.labels[0])||null }); walk(ch, ax, ay, depth+1) }\n else if (nById[ch.id]) nodesOut.push({ n:nById[ch.id], x:ax, y:ay, w:ch.width, h:ch.height })\n })\n ;(cell.edges||[]).forEach(e=>{ edgesOut.push({ e:e, ox:ox, oy:oy }) })\n }\n walk(res, 0, 0, 0)\n\n const W=Math.ceil(res.width), H=Math.ceil(res.height), PAD=18\n let svg=''\n // 1) 容器(外層先畫=墊底; depth 小先畫)\n groupsOut.sort((a,b)=>a.depth-b.depth).forEach(o=>{\n svg+='<rect x="'+(o.x)+'" y="'+(o.y)+'" width="'+o.w+'" height="'+o.h+'" rx="8" fill="'+o.g.fill+'" fill-opacity="0.38" stroke="'+o.g.stroke+'" stroke-width="2"/>'\n const tw=o.lbl?o.lbl.width+12:o.w, th=o.lbl?o.lbl.height+6:24, tx=o.x+Math.max(0,(o.w-tw)/2), ty=o.y+(o.lbl?o.lbl.y:5)\n svg+='<foreignObject x="'+tx+'" y="'+ty+'" width="'+tw+'" height="'+th+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="text-align:center;font-weight:bold;font-size:'+GFS+'px;color:'+o.g.stroke+';line-height:1.3;overflow-wrap:break-word;word-break:normal">'+esc(o.g.label)+'</div></foreignObject>'\n })\n // 2) 邊(在節點之下、容器之上)\n const nodeBoxById={}; nodesOut.forEach(o=>{ nodeBoxById[o.n.id]={ x:o.x, y:o.y, w:o.w, h:o.h, diamond:!!o.n.diamond } })\n const specEdgeById={}; spec.edges.forEach(se=>{ specEdgeById[se.id]=se })\n // 2a) 蒐集各 section 絕對路徑點 + 統計各菱形「各側」進出數(側=上/下/左/右, key: nodeId|軸|正負)。\n // 規則: 純出側→全部由頂點分岔; 純入側→各自貼斜邊; 混合側→全部貼斜邊\n // (混合側若連出走頂點+橫向接回, 橫向段必與夾在中間的連入直線交叉; 全貼斜邊則零共用點、零新增交叉)\n const drawList=[], sideMix={}\n edgesOut.forEach(o=>{\n const e=o.e, se=specEdgeById[e.id]\n const srcBox=se&&nodeBoxById[se.from], tgtBox=se&&nodeBoxById[se.to]\n const secs=(e.sections||[]).map(sec=>{\n const pts=[sec.startPoint].concat(sec.bendPoints||[]).concat([sec.endPoint]).map(p=>({x:o.ox+p.x, y:o.oy+p.y}))\n const item={ pts }\n if(srcBox&&srcBox.diamond){ item.srcSide=diamondSide(pts[0], srcBox); if(item.srcSide){ const k=se.from+'|'+item.srcSide.ax+item.srcSide.sg; (sideMix[k]=sideMix[k]||{in:0,out:0}).out++ } }\n if(tgtBox&&tgtBox.diamond){ item.tgtSide=diamondSide(pts[pts.length-1], tgtBox); if(item.tgtSide){ const k=se.to+'|'+item.tgtSide.ax+item.tgtSide.sg; (sideMix[k]=sideMix[k]||{in:0,out:0}).in++ } }\n return item\n })\n drawList.push({ o, e, se, srcBox, tgtBox, secs })\n })\n // 2a-2) 通用路徑化簡: ELK 階層邊(INCLUDE_CHILDREN)常見「先繞反方向再折返」之 S/U 形繞行,\n // 反覆對「三段式窗」(平行-垂直-平行)嘗試收斂成兩段, 僅在碰撞偵測全過才接受:\n // 不撞節點框/容器標題帶/邊標籤、不與他邊平行段貼齊併線; 端點段軸向與方向不可翻轉(維持節點進出方向,\n // 化簡先於菱形貼齊故不干擾貼齊規則); 本邊標籤若因化簡脫離路徑則整段還原(標籤座標由 ELK 依原路徑決定)。\n const obstacles=[]\n nodesOut.forEach(o=>{ obstacles.push({ x:o.x-8, y:o.y-8, w:o.w+16, h:o.h+16 }) })\n groupsOut.forEach(o=>{ if(!o.lbl) return; const tw=o.lbl.width+12, th=o.lbl.height+6, tx=o.x+Math.max(0,(o.w-tw)/2), ty=o.y+o.lbl.y; obstacles.push({ x:tx-4, y:ty-4, w:tw+8, h:th+8 }) })\n const labelBoxes=[]\n drawList.forEach(dd=>{ (dd.e.labels||[]).forEach(l=>{ if(!l.text) return; labelBoxes.push({ x:dd.o.ox+(l.x||0)-2, y:dd.o.oy+(l.y||0)-2, w:(l.width||40)+10, h:(l.height||18)+8 }) }) })\n function segHitsBox(a,b,box){ // 軸對齊線段 vs 矩形(線段必水平或垂直)\n const x1=Math.min(a.x,b.x), x2=Math.max(a.x,b.x), y1=Math.min(a.y,b.y), y2=Math.max(a.y,b.y)\n return x2>box.x && x1<box.x+box.w && y2>box.y && y1<box.y+box.h\n }\n function segOverlapsOther(a,b,selfItem){ // 與他邊平行段貼齊重疊(側距<6 且共線範圍>10)→ 視覺併線, 拒絕\n const horiz = Math.abs(a.y-b.y)<0.5\n for(const dd of drawList) for(const it of dd.secs){ if(it===selfItem) continue\n const q=it.pts\n for(let k=0;k+1<q.length;k++){ const c=q[k], d=q[k+1]\n if(horiz && Math.abs(c.y-d.y)<0.5 && Math.abs(c.y-a.y)<6){ const lo=Math.max(Math.min(a.x,b.x),Math.min(c.x,d.x)), hi=Math.min(Math.max(a.x,b.x),Math.max(c.x,d.x)); if(hi-lo>10) return true }\n if(!horiz && Math.abs(c.x-d.x)<0.5 && Math.abs(c.x-a.x)<6){ const lo=Math.max(Math.min(a.y,b.y),Math.min(c.y,d.y)), hi=Math.min(Math.max(a.y,b.y),Math.max(c.y,d.y)); if(hi-lo>10) return true }\n }\n }\n return false\n }\n // 標籤一律為硬障礙(含本邊自己的): ELK 邊標籤是「先佔位、路徑繞標籤走」, 原路的 jog 即標籤讓位,\n // 拉直會從自家標籤正中穿過(且「脫離才還原」守門對「穿過=距離變近」無感), 故不可豁免自家標籤\n function segClear(a,b,selfItem){\n for(const ob of obstacles) if(segHitsBox(a,b,ob)) return false\n for(const lb of labelBoxes) if(segHitsBox(a,b,lb)) return false\n return !segOverlapsOther(a,b,selfItem)\n }\n function mergeColl(p){ // 去重合點 + 併共線(含同線折返, 折返僅由化簡產生)\n for(let i=p.length-2;i>=0;i--) if(Math.abs(p[i].x-p[i+1].x)<0.5 && Math.abs(p[i].y-p[i+1].y)<0.5) p.splice(i,1)\n for(let i=p.length-2;i>=1;i--){ const A=p[i-1],B=p[i],C=p[i+1]\n if((Math.abs(A.x-B.x)<0.5 && Math.abs(B.x-C.x)<0.5) || (Math.abs(A.y-B.y)<0.5 && Math.abs(B.y-C.y)<0.5)) p.splice(i,1) }\n }\n function distToPoly(pt,p){ let d=Infinity\n for(let i=0;i+1<p.length;i++){ const a=p[i], b=p[i+1]\n const len2=Math.max(1,(b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y))\n const t=Math.max(0,Math.min(1, ((pt.x-a.x)*(b.x-a.x)+(pt.y-a.y)*(b.y-a.y))/len2 ))\n const qx=a.x+t*(b.x-a.x), qy=a.y+t*(b.y-a.y); d=Math.min(d, Math.hypot(pt.x-qx, pt.y-qy)) }\n return d\n }\n function simplifyOrtho(item, labels){\n const p=item.pts\n const before=p.map(q=>({x:q.x,y:q.y}))\n mergeColl(p)\n for(let pass=0; pass<20; pass++){\n let changed=false\n for(let i=0;i+3<p.length;i++){\n const isStart=(i===0), isEnd=(i+3===p.length-1)\n if(isStart && isEnd) continue // 4 點路徑已極簡, 兩端軸向無法同時保持\n const A=p[i], B=p[i+1], C=p[i+2], D=p[i+3]\n const s1h=Math.abs(A.y-B.y)<0.5\n // 取代點取窗之一角: 一般保持首段軸向; 末端窗改保持末段軸向(箭頭進入方向不可變)\n const P = isEnd ? (s1h ? {x:A.x,y:D.y} : {x:D.x,y:A.y}) : (s1h ? {x:D.x,y:A.y} : {x:A.x,y:D.y})\n if(isStart){ const sg0=s1h?Math.sign(B.x-A.x):Math.sign(B.y-A.y), sgN=s1h?Math.sign(P.x-A.x):Math.sign(P.y-A.y); if(sgN!==sg0) continue }\n if(isEnd){ const s3h=Math.abs(C.y-D.y)<0.5, sg0=s3h?Math.sign(D.x-C.x):Math.sign(D.y-C.y), sgN=s3h?Math.sign(D.x-P.x):Math.sign(D.y-P.y); if(sgN!==sg0) continue }\n if(!segClear(A,P,item) || !segClear(P,D,item)) continue\n p.splice(i+1, 2, P)\n mergeColl(p)\n changed=true\n break\n }\n if(!changed) break\n }\n // 標籤守門: 化簡若令本邊任一標籤脫離路徑(距離顯著變大), 整段還原\n if(labels.length && p.length !== before.length){\n for(const l of labels){\n if(distToPoly(l,p) > distToPoly(l,before)+2){ p.length=0; before.forEach(q=>p.push(q)); return }\n }\n }\n }\n drawList.forEach(dd=>{\n const labs=(dd.e.labels||[]).filter(l=>l.text).map(l=>({ x:dd.o.ox+(l.x||0)+(l.width||40)/2, y:dd.o.oy+(l.y||0)+(l.height||18)/2 }))\n dd.secs.forEach(item=>{ if(item.pts.length>=5) simplifyOrtho(item, labs) })\n })\n // 2b) 依側別規則貼齊並繪製\n const procSegsById={} // 實際繪製之路徑點(含菱形貼齊與 ensureStub), 供 geom 輸出一致\n drawList.forEach(dd=>{\n const o=dd.o, e=dd.e\n dd.secs.forEach(item=>{\n const pts=item.pts\n if(item.srcSide && pts.length >= 2) routeOutFromVertex(pts, item.srcSide) // R1: 出永遠自該側頂點\n if(item.tgtSide && pts.length >= 2){\n // R2: 純進側匯「頂點」; 混合側依「半側」匯「斜邊中點」(進出不同點)\n const m=sideMix[dd.se.to+'|'+item.tgtSide.ax+item.tgtSide.sg]\n const anchor=diamondInAnchor(dd.tgtBox, item.tgtSide, !!(m && m.out > 0), pts[pts.length-1])\n routeInToAnchor(pts, item.tgtSide, anchor)\n }\n // 分岔/匯入重排後清除共線折返: 頂點分岔之「接回原路第一轉折層」若跨過下一轉點, 會多走再折回疊出短勾, 併共線即塌縮為直接連線\n if(item.srcSide || item.tgtSide) mergeColl(pts)\n ensureStub(pts, 18, !!item.srcSide)\n ;(procSegsById[e.id]=procSegsById[e.id]||[]).push(pts)\n let d='M '+pts[0].x+' '+pts[0].y; for(let i=1;i<pts.length;i++) d+=' L '+pts[i].x+' '+pts[i].y\n const dash = (e.id && spec.edges.find(x=>x.id===e.id) && spec.edges.find(x=>x.id===e.id).dashed) ? ' stroke-dasharray="6 4"' : ''\n svg+='<path d="'+d+'" fill="none" stroke="'+EDGE_LINE+'" stroke-width="2"'+dash+'/>'\n // 箭頭(終點)\n const a=pts[pts.length-2], b=pts[pts.length-1], ang=Math.atan2(b.y-a.y,b.x-a.x), L=9, w=4\n const x1=b.x-L*Math.cos(ang)+w*Math.sin(ang), y1=b.y-L*Math.sin(ang)-w*Math.cos(ang)\n const x2=b.x-L*Math.cos(ang)-w*Math.sin(ang), y2=b.y-L*Math.sin(ang)+w*Math.cos(ang)\n svg+='<path d="M '+b.x+' '+b.y+' L '+x1+' '+y1+' L '+x2+' '+y2+' Z" fill="'+EDGE_LINE+'"/>'\n })\n // 邊標籤(白光暈)\n ;(e.labels||[]).forEach(l=>{ if(!l.text) return; const lx=o.ox+(l.x||0), ly=o.oy+(l.y||0), lw=l.width||40, lh=l.height||18\n svg+='<foreignObject x="'+lx+'" y="'+ly+'" width="'+(lw+6)+'" height="'+(lh+4)+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="font-size:'+EFS+'px;color:'+EDGE_TEXT+';text-shadow:0 0 3px '+HALO+',0 0 3px '+HALO+',0 0 3px '+HALO+',0 0 3px '+HALO+';white-space:nowrap">'+esc(l.text)+'</div></foreignObject>' })\n })\n // 3) 節點(最上)。各文字 div 之斷行 CSS(overflow-wrap:break-word + word-break:normal)須與 measure()/measureItems() 一致,\n // 否則長英文識別字量測時折行、渲染時不折 → 單行溢出 foreignObject 被裁切\n nodesOut.forEach(o=>{\n const n=o.n\n if(n.items && n.items.length){ // 標題+項目框: 依序分層(框背景→標題背景→框線→分隔線→標題→items), 使框線置頂不被標題背景遮蔽、線寬完整\n const headH=(size[n.id]&&size[n.id].headH)||26, r=7, sep=o.y+headH\n const lis=n.items.map(it=>'<div style="white-space:nowrap">•&#160;'+esc(it)+'</div>').join('')\n svg+='<rect x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'" rx="'+r+'" fill="'+n.fill+'"/>' // 1 框背景\n svg+='<path d="M '+(o.x+r)+' '+o.y+' H '+(o.x+o.w-r)+' A '+r+' '+r+' 0 0 1 '+(o.x+o.w)+' '+(o.y+r)+' V '+sep+' H '+o.x+' V '+(o.y+r)+' A '+r+' '+r+' 0 0 1 '+(o.x+r)+' '+o.y+' Z" fill="'+mix(n.fill,n.stroke,0.16)+'"/>' // 2 標題背景(上圓角下平)\n svg+='<rect x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'" rx="'+r+'" fill="none" stroke="'+n.stroke+'" stroke-width="1.6"/>' // 3 框線(頂層)\n svg+='<line x1="'+o.x+'" y1="'+sep+'" x2="'+(o.x+o.w)+'" y2="'+sep+'" stroke="'+n.stroke+'" stroke-width="1"/>' // 4 分隔線\n svg+='<foreignObject x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+headH+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;font-weight:bold;font-size:'+FS+'px;color:'+n.font+'"><div style="width:100%;min-width:0;overflow-wrap:break-word;word-break:normal">'+esc(n.title||n.label)+'</div></div></foreignObject>' // 5 標題文字\n svg+='<foreignObject x="'+o.x+'" y="'+sep+'" width="'+o.w+'" height="'+(o.h-headH)+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="font-size:'+(FS-1)+'px;line-height:1.55;padding:6px 9px 4px;text-align:left;color:'+n.font+'">'+lis+'</div></foreignObject>' // 6 items文字\n } else if(n.diamond){ const cx=o.x+o.w/2, cy=o.y+o.h/2\n svg+='<polygon points="'+cx+','+o.y+' '+(o.x+o.w)+','+cy+' '+cx+','+(o.y+o.h)+' '+o.x+','+cy+'" fill="'+n.fill+'" stroke="'+n.stroke+'" stroke-width="1.8"/>'\n svg+='<foreignObject x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;font-size:'+FS+'px;color:'+n.font+';line-height:1.4;padding:0 4px;box-sizing:border-box"><div style="width:100%;min-width:0;overflow-wrap:break-word;word-break:normal">'+esc(n.label)+'</div></div></foreignObject>'\n } else {\n svg+='<rect x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'" rx="7" fill="'+n.fill+'" stroke="'+n.stroke+'" stroke-width="1.6"/>'\n svg+='<foreignObject x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;font-size:'+FS+'px;color:'+n.font+';line-height:1.4;padding:0 4px;box-sizing:border-box"><div style="width:100%;min-width:0;overflow-wrap:break-word;word-break:normal">'+esc(n.label)+'</div></div></foreignObject>'\n }\n })\n\n const full='<svg xmlns="http://www.w3.org/2000/svg" width="'+(W+PAD*2)+'" height="'+(H+PAD*2)+'" viewBox="'+(-PAD)+' '+(-PAD)+' '+(W+PAD*2)+' '+(H+PAD*2)+'" style="background:#fff">'+svg+'</svg>'\n document.getElementById('stage').innerHTML = full\n // 幾何輸出(供 test 斷言: 存在性/包含/標題不溢出/重疊/A4比例/items框高); 不影響 SVG/PNG\n const geom = {\n W:W+PAD*2, H:H+PAD*2,\n nodes: nodesOut.map(o=>({ id:o.n.id, x:o.x, y:o.y, w:o.w, h:o.h, parent:o.n.parent||null, kind:(o.n.items&&o.n.items.length)?'items':(o.n.diamond?'diamond':'box'), headH:(size[o.n.id]&&size[o.n.id].headH)||null })),\n groups: groupsOut.map(o=>({ id:o.g.id, x:o.x, y:o.y, w:o.w, h:o.h, depth:o.depth, parent:o.g.parent||null, labelW:(o.lbl&&o.lbl.width)||0 })),\n edges: edgesOut.map(o=>({ id:o.e.id, segs: procSegsById[o.e.id]||[] }))\n }\n return { ok:true, w:W+PAD*2, h:H+PAD*2, geom }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\nwindow.__ready = true\n<\/script></body></html>`;async function hr(n){const t=await e.chromium.launch();try{const e=await t.newPage({deviceScaleFactor:2});await e.setContent(ur,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const r=await e.evaluate(e=>window.renderFig(e),fr(n));if(!r.ok)throw new Error("p10 render failed: "+r.err);return await e.evaluate(()=>document.fonts&&document.fonts.ready),await e.waitForTimeout(150),{browser:t,page:e}}catch(e){throw await t.close(),e}}var gr=Object.freeze({__proto__:null,PAGE_HTML:ur,genPng:async function(e,n={}){const{browser:t,page:r}=await hr(e);try{return await r.locator("#stage svg").screenshot()}finally{await t.close()}},genSvg:async function(e,n={}){const{browser:t,page:r}=await hr(e);try{return(await r.evaluate(()=>document.getElementById("stage").innerHTML)).replace(/&nbsp;/g,"&#160;").trim()}finally{await t.close()}},translate:fr});return async function(e,n={}){let t=ie(n,"mode");Jn(t)||(t="p10");const r=t.trim().toLowerCase();if(!Vn[r])throw new Error(`invalid opt.mode[${t}], 須為 ${Object.keys(Vn).join(", ")} 之一`);let o=ie(n,"output");Jn(o)||(o="png");const a=o.trim().toLowerCase();if("png"!==a&&"svg"!==a)throw new Error(`invalid opt.output[${o}], 須為 png 或 svg`);if("svg"===a&&!Zn.includes(r))throw new Error(`mode[${r}] 不支援 svg 輸出, 支援: ${Zn.join(", ")}`);if(!function(e){if(Un(e)){for(let n in e)return!0;return!1}return!1}(e))throw new Error("invalid inp, 須為 { dir, nodes, edges } 正規化繪圖數據");if(!Xn(i=e.nodes)||0===i.length||1===i.length&&Yn(i[0]))throw new Error("invalid inp.nodes, 須為非空陣列");var i;if(!Xn(e.edges))throw new Error("invalid inp.edges, 須為陣列");const s=((l=Wn(e,5)).nodes.forEach(e=>{e.title&&null==e.label&&(e.label=e.title+(e.items&&e.items.length?" ("+e.items.join("/")+")":""))}),l);var l;const c=await Vn[r]();return await("svg"===a?c.genSvg:c.genPng)(s,n)}});
7
7
  //# sourceMappingURL=w-flowchart.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"w-flowchart.umd.js","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"w-flowchart.umd.js","sources":["../node_modules/lodash-es/isArray.js","../node_modules/lodash-es/_freeGlobal.js","../node_modules/lodash-es/_root.js","../node_modules/lodash-es/_Symbol.js","../node_modules/lodash-es/_getRawTag.js","../node_modules/lodash-es/_objectToString.js","../node_modules/lodash-es/_baseGetTag.js","../node_modules/lodash-es/isObjectLike.js","../node_modules/lodash-es/isSymbol.js","../node_modules/lodash-es/_isKey.js","../node_modules/lodash-es/isObject.js","../node_modules/lodash-es/isFunction.js","../node_modules/lodash-es/_coreJsData.js","../node_modules/lodash-es/_isMasked.js","../node_modules/lodash-es/_toSource.js","../node_modules/lodash-es/_baseIsNative.js","../node_modules/lodash-es/_getNative.js","../node_modules/lodash-es/_getValue.js","../node_modules/lodash-es/_nativeCreate.js","../node_modules/lodash-es/_hashGet.js","../node_modules/lodash-es/_hashHas.js","../node_modules/lodash-es/_Hash.js","../node_modules/lodash-es/eq.js","../node_modules/lodash-es/_assocIndexOf.js","../node_modules/lodash-es/_hashClear.js","../node_modules/lodash-es/_hashDelete.js","../node_modules/lodash-es/_hashSet.js","../node_modules/lodash-es/_listCacheDelete.js","../node_modules/lodash-es/_ListCache.js","../node_modules/lodash-es/_listCacheClear.js","../node_modules/lodash-es/_listCacheGet.js","../node_modules/lodash-es/_listCacheHas.js","../node_modules/lodash-es/_listCacheSet.js","../node_modules/lodash-es/_Map.js","../node_modules/lodash-es/_getMapData.js","../node_modules/lodash-es/_isKeyable.js","../node_modules/lodash-es/_MapCache.js","../node_modules/lodash-es/_mapCacheClear.js","../node_modules/lodash-es/_mapCacheDelete.js","../node_modules/lodash-es/_mapCacheGet.js","../node_modules/lodash-es/_mapCacheHas.js","../node_modules/lodash-es/_mapCacheSet.js","../node_modules/lodash-es/memoize.js","../node_modules/lodash-es/_stringToPath.js","../node_modules/lodash-es/_memoizeCapped.js","../node_modules/lodash-es/_baseToString.js","../node_modules/lodash-es/_arrayMap.js","../node_modules/lodash-es/_castPath.js","../node_modules/lodash-es/toString.js","../node_modules/lodash-es/_toKey.js","../node_modules/lodash-es/get.js","../node_modules/lodash-es/_baseGet.js","../node_modules/lodash-es/_Stack.js","../node_modules/lodash-es/_stackClear.js","../node_modules/lodash-es/_stackDelete.js","../node_modules/lodash-es/_stackGet.js","../node_modules/lodash-es/_stackHas.js","../node_modules/lodash-es/_stackSet.js","../node_modules/lodash-es/_defineProperty.js","../node_modules/lodash-es/_baseAssignValue.js","../node_modules/lodash-es/_assignValue.js","../node_modules/lodash-es/_copyObject.js","../node_modules/lodash-es/_baseIsArguments.js","../node_modules/lodash-es/isArguments.js","../node_modules/lodash-es/isBuffer.js","../node_modules/lodash-es/stubFalse.js","../node_modules/lodash-es/_isIndex.js","../node_modules/lodash-es/isLength.js","../node_modules/lodash-es/_baseIsTypedArray.js","../node_modules/lodash-es/_baseUnary.js","../node_modules/lodash-es/_nodeUtil.js","../node_modules/lodash-es/isTypedArray.js","../node_modules/lodash-es/_arrayLikeKeys.js","../node_modules/lodash-es/_baseTimes.js","../node_modules/lodash-es/_isPrototype.js","../node_modules/lodash-es/_overArg.js","../node_modules/lodash-es/_nativeKeys.js","../node_modules/lodash-es/_baseKeys.js","../node_modules/lodash-es/isArrayLike.js","../node_modules/lodash-es/keys.js","../node_modules/lodash-es/_baseKeysIn.js","../node_modules/lodash-es/_nativeKeysIn.js","../node_modules/lodash-es/keysIn.js","../node_modules/lodash-es/_cloneBuffer.js","../node_modules/lodash-es/stubArray.js","../node_modules/lodash-es/_getSymbols.js","../node_modules/lodash-es/_arrayFilter.js","../node_modules/lodash-es/_arrayPush.js","../node_modules/lodash-es/_getPrototype.js","../node_modules/lodash-es/_getSymbolsIn.js","../node_modules/lodash-es/_baseGetAllKeys.js","../node_modules/lodash-es/_getAllKeys.js","../node_modules/lodash-es/_getAllKeysIn.js","../node_modules/lodash-es/_DataView.js","../node_modules/lodash-es/_Promise.js","../node_modules/lodash-es/_Set.js","../node_modules/lodash-es/_WeakMap.js","../node_modules/lodash-es/_getTag.js","../node_modules/lodash-es/_initCloneArray.js","../node_modules/lodash-es/_Uint8Array.js","../node_modules/lodash-es/_cloneArrayBuffer.js","../node_modules/lodash-es/_cloneRegExp.js","../node_modules/lodash-es/_cloneSymbol.js","../node_modules/lodash-es/_initCloneByTag.js","../node_modules/lodash-es/_cloneDataView.js","../node_modules/lodash-es/_cloneTypedArray.js","../node_modules/lodash-es/_baseCreate.js","../node_modules/lodash-es/isMap.js","../node_modules/lodash-es/_baseIsMap.js","../node_modules/lodash-es/isSet.js","../node_modules/lodash-es/_baseIsSet.js","../node_modules/lodash-es/_baseClone.js","../node_modules/lodash-es/_copyArray.js","../node_modules/lodash-es/_initCloneObject.js","../node_modules/lodash-es/_copySymbolsIn.js","../node_modules/lodash-es/_baseAssignIn.js","../node_modules/lodash-es/_copySymbols.js","../node_modules/lodash-es/_baseAssign.js","../node_modules/lodash-es/_arrayEach.js","../node_modules/wsemi/src/isstr.mjs","../node_modules/wsemi/src/isestr.mjs","../node_modules/wsemi/src/isobj.mjs","../node_modules/wsemi/src/isarr.mjs","../node_modules/wsemi/src/iser.mjs","../node_modules/wsemi/src/isundefined.mjs","../node_modules/wsemi/src/isnull.mjs","../node_modules/wsemi/src/isobj0.mjs","../node_modules/wsemi/src/isstr0.mjs","../node_modules/wsemi/src/isarr0.mjs","../node_modules/wsemi/src/isnan.mjs","../src/WFlowchart.mjs","../src/common/palette.mjs","../src/common/pkg.mjs","../src/p1/gen.mjs","../src/p2/gen.mjs","../src/p3/gen.mjs","../src/p4/gen.mjs","../src/p5/gen.mjs","../src/p6/gen.mjs","../src/p7/gen.mjs","../src/p8/gen.mjs","../src/p9/gen.mjs","../src/p10/gen.mjs","../node_modules/wsemi/src/iseobj.mjs","../node_modules/wsemi/src/isearr.mjs","../src/common/derive.mjs","../node_modules/lodash-es/cloneDeep.js"],"sourcesContent":null,"names":["isArray$1","Array","isArray","freeGlobal$1","global","Object","freeSelf","self","root$1","freeGlobal","Function","Symbol$1","root","Symbol","objectProto","prototype","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","baseGetTag","value","isOwn","call","tag","unmasked","e","result","getRawTag","objectToString","isObjectLike","isSymbol","reIsDeepProp","reIsPlainProp","isObject","type","isFunction","uid","coreJsData$1","maskSrcKey","exec","coreJsData","keys","IE_PROTO","funcToString","toSource","func","reIsHostCtor","funcProto","reIsNative","RegExp","replace","baseIsNative","test","getNative","object","key","getValue","nativeCreate$1","Hash","entries","index","length","this","clear","entry","set","eq","other","assocIndexOf","array","__data__","nativeCreate","size","has","get","data","splice","ListCache","pop","push","Map$1","getMapData","map","MapCache","hash","Map","string","memoize","resolver","TypeError","memoized","args","arguments","apply","cache","Cache","rePropName","reEscapeChar","stringToPath","charCodeAt","match","number","quote","subString","stringToPath$1","symbolProto","symbolToString","baseToString","iteratee","arrayMap","castPath","isKey","toKey","path","defaultValue","baseGet","Stack","pairs","LARGE_ARRAY_SIZE","defineProperty","defineProperty$1","baseAssignValue","configurable","enumerable","writable","assignValue","objValue","copyObject","source","props","customizer","isNew","newValue","baseIsArguments","propertyIsEnumerable","isArguments","isArguments$1","freeExports","exports","nodeType","freeModule","module","Buffer","isBuffer$1","isBuffer","reIsUint","isIndex","isLength","typedArrayTags","baseUnary","freeProcess","process","nodeUtil$1","types","require","binding","nodeIsTypedArray","nodeUtil","isTypedArray","isTypedArray$1","arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","n","baseTimes","String","isPrototype","Ctor","constructor","overArg","transform","arg","nativeKeys$1","isArrayLike","nativeKeys","baseKeys","baseKeysIn","nativeKeysIn","isProto","keysIn","allocUnsafe","stubArray","nativeGetSymbols","getOwnPropertySymbols","getSymbols","predicate","resIndex","arrayFilter","symbol","getSymbols$1","arrayPush","values","offset","getPrototype$1","getPrototypeOf","getSymbolsIn","getPrototype","getSymbolsIn$1","baseGetAllKeys","keysFunc","symbolsFunc","getAllKeys","getAllKeysIn","DataView$1","Promise$2","Set$2","WeakMap$1","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","DataView","mapCtorString","promiseCtorString","Promise","setCtorString","Set","weakMapCtorString","WeakMap","getTag","ArrayBuffer","resolve","ctorString","getTag$1","Uint8Array$1","Uint8Array","cloneArrayBuffer","arrayBuffer","byteLength","reFlags","symbolValueOf","valueOf","initCloneByTag","isDeep","dataView","buffer","byteOffset","cloneDataView","typedArray","cloneTypedArray","regexp","lastIndex","cloneRegExp","objectCreate","create","baseCreate","proto","baseCreate$1","nodeIsMap","isMap","isMap$1","nodeIsSet","isSet","isSet$1","argsTag","funcTag","objectTag","cloneableTags","baseClone","bitmask","stack","isFlat","isFull","input","initCloneArray","copyArray","isFunc","slice","copy","cloneBuffer","initCloneObject","copySymbolsIn","baseAssignIn","copySymbols","baseAssign","stacked","forEach","subValue","add","arrayEach","isstr","v","isestr","isobj","isarr","iser","isundefined","isnull","k","isobj0","isstr0","isarr0","isnan","LOADERS","p1","then","gen$9","p2","gen$8","p3","gen$7","p4","gen$6","p5","gen$5","p6","gen$4","p7","gen$3","p8","gen$2","p9","gen$1","p10","gen","SVG_MODES","PALETTE","blue","fill","stroke","text","shape","green","orange","purple","red","done","diamond","blueG","group","blueG2","greenG","greenG2","orangeG","purpleG","EDGE","line","textBg","haloColor","haloWidth","FONT","isGroupCls","cls","colorOf","__dir","dirname","fileURLToPath","import","pkgFile","rel","dir","i","fp","join","fs","existsSync","up","Error","pkgScript","readFileSync","pkgText","MERMAID_JS","nodeShape","nd","qid","id","label","translate","nodes","edges","used","qidMap","base","q","byId","filter","clsSet","classDefLines","p","clsToIds","classLines","ids","topGroupIds","standaloneNodes","renderSubgraph","gid","indent","g","lines","directChildren","nestedGroups","ng","edgeLines","ed","arrow","kind","lbl","from","to","async","renderFigPage","code","browser","chromium","launch","page","newPage","deviceScaleFactor","setContent","JSON","stringify","mermaidHtml","waitUntil","waitForFunction","document","title","timeout","msg","evaluate","el","getElementById","innerText","fonts","ready","err","close","opt","locator","screenshot","querySelector","vb","viewBox","baseVal","style","maxWidth","setAttribute","Math","ceil","width","height","innerHTML","trim","PKG_ORIGIN","innerDir","childrenOf","nodeById","topNodes","renderNode","sp","repeat","kids","cid","clsByNodes","fillColor","strokeColor","textColor","sw","route","decodeURIComponent","request","url","split","fulfill","body","contentType","endsWith","status","message","routeLocalPkgs","window","__ready","__setupErr","catch","setupErr","r","c","idx","renderFig","ok","waitForTimeout","css","querySelectorAll","s","textContent","st","createElementNS","insertBefore","firstChild","out","remove","clsAlias","toLowerCase","clsDirs","buildClsDirectives","fromLabel","toLabel","setup","src","fx","sweep","best","x","renderAndDetect","collisions","spacing","details","autofix","CYTOSCAPE_JS","DAGRE_JS","CYTOSCAPE_DAGRE_JS","CYTOSCAPE_SVG_JS","toEls","els","parent","classes","target","html","renderPage","mode","res","rd","md","m","__svg","__png","b64","svg","FONT_FAMILY","FONT_OVERRIDE","EDGE_HALO_STYLE","esc","DIR_MAP","TB","LR","BT","RL","styLines","isGroup","qualifiedId","nodeId","parentMap","parts","cur","unshift","childrenMap","dataDir","pad","sl","kid","baseOpt","layout","themeID","d2Svg","D2","d2inst","d2src","blocks","compile","options","render","diagram","renderOptions","maskBlock","attrs","inner","indexOf","injectEdgeLabelHalo","injectFont","worker","terminate","default","sharp","w","parseFloat","density","min","max","png","toBuffer","G6_JS","G_LITE_JS","G_SVG_JS","measure","round","reduce","a","ch","combos","comboIds","firstLeaf","resolveEnd","combo","zIndex","labelText","labelPlacement","labelFontFamily","labelFontSize","labelFontWeight","labelFill","fillOpacity","lineWidth","isDiamond","h","radius","eid","dashed","endArrow","lineDash","labelBackground","labelStroke","labelLineWidth","labelPaintOrder","labelAutoRotate","htmlSvg","errs","on","gg","ns","rs","cv","ft","cz","ez","snap","__readySvg","renderFigSvg","snapSvg","JOINT_JS","CLS","fromEntries","o","color","ex","SEP","nodesep","ranksep","rankDir","$","outer","$eval","outerHTML","m0","LOGICFLOW_CSS","LOGICFLOW_JS","PAL","PAL_JSON","EDGE_JSON","renderToReadyPage","fig","openTagMatch","openTag","inject","_html","boot","t","__err","spec","l","groups","align","mi","font","items","parentOf","anc","at","container","find","PAGE_HTML","inp","output","includes","iseobj","d","CLONE_DEEP_FLAG","genSvg","genPng"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,143,144,146]}