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
@@ -0,0 +1,221 @@
1
+ // 菱形進出組合視覺案 — 僅供 p10 套件(不進 p1~p9 矩陣)
2
+ // 規則(共進共出, 每側獨立): 出=一律由該側「頂點」分岔; 進=純進側匯「頂點」、混合側依「半側」匯「斜邊中點」。
3
+ // check 即規則之可執行翻譯: 斷言各邊實際繪製端點等於規劃錨點。
4
+ //
5
+ // 組合覆蓋說明(13 種進出組合):
6
+ // - 本檔為「ELK 佈局可自然構造」之 9 種視覺案(產標準圖供人工檢視)。
7
+ // - 純進側只在「頂側」可構造(分層佈局中, 菱形要位於來源上方就必有向下路徑=底側出)。
8
+ // - 「同半側」類組合(2進同半側+1出、2出同半側+1進、進出同/異交叉之 ds/sd)受 ELK 交叉最小化
9
+ // 埠序限制, 乾淨合成圖排不出來(實驗多種構圖皆收斂為置中/對稱分佈或 ss 型); 此 4 種組合
10
+ // 連同其餘 9 種, 全數由 p10.test.mjs 之「菱形 13 種進出組合規則(單元驗證)」直接對繪製函式驗證。
11
+ // - dia-2in-2out-ss 為單欄壅塞下自然出現之「進同半側+出同半側」實例(視覺可見共進共出)。
12
+
13
+ const EPS = 2.5
14
+ const near = (p, q) => !!p && !!q && Math.abs(p.x - q.x) <= EPS && Math.abs(p.y - q.y) <= EPS
15
+
16
+ // 菱形各錨點: 底/頂頂點, 底側左右半斜邊中點
17
+ function anchors(D) {
18
+ const cx = D.x + D.w / 2, cy = D.y + D.h / 2, hw = D.w / 2, hh = D.h / 2
19
+ return {
20
+ vB: { x: cx, y: D.y + D.h },
21
+ vT: { x: cx, y: D.y },
22
+ mBL: { x: cx - hw / 2, y: cy + hh / 2 },
23
+ mBR: { x: cx + hw / 2, y: cy + hh / 2 },
24
+ }
25
+ }
26
+ const edgeOf = (geom, id) => geom.edges.find(e => e.id === id)
27
+ const segStart = (geom, id) => { const g = edgeOf(geom, id); const s = g && g.segs[0]; return s && s[0] }
28
+ const segEnd = (geom, id) => { const g = edgeOf(geom, id); const s = g && g.segs[g.segs.length - 1]; return s && s[s.length - 1] }
29
+ const fmt = (p) => p ? `(${p.x.toFixed(1)},${p.y.toFixed(1)})` : '(無)'
30
+
31
+ // 通用斷言組合器
32
+ const outAtVB = (geom, h, id) => { const D = h.node('D'), A = anchors(D), s = segStart(geom, id); return { name: `${id} 出=底頂點`, pass: near(s, A.vB), detail: `${fmt(s)} vs ${fmt(A.vB)}` } }
33
+ const inAtVT = (geom, h, id) => { const D = h.node('D'), A = anchors(D), s = segEnd(geom, id); return { name: `${id} 進=頂點(純進側)`, pass: near(s, A.vT), detail: `${fmt(s)} vs ${fmt(A.vT)}` } }
34
+ const inAtMid = (geom, h, id) => { const D = h.node('D'), A = anchors(D), s = segEnd(geom, id); return { name: `${id} 進=半側斜邊中點(混合側)`, pass: near(s, A.mBL) || near(s, A.mBR), detail: `${fmt(s)} vs L${fmt(A.mBL)}/R${fmt(A.mBR)}` } }
35
+ const insSameMid = (geom, h, a, b) => { const sa = segEnd(geom, a), sb = segEnd(geom, b); return { name: `${a},${b} 共進同一匯點(同半側)`, pass: near(sa, sb), detail: `${fmt(sa)} vs ${fmt(sb)}` } }
36
+ const insDiffMid = (geom, h, a, b) => { const D = h.node('D'), A = anchors(D), sa = segEnd(geom, a), sb = segEnd(geom, b); const ok = (near(sa, A.mBL) && near(sb, A.mBR)) || (near(sa, A.mBR) && near(sb, A.mBL)); return { name: `${a},${b} 分匯左右斜邊中點(不同半側)`, pass: ok, detail: `${fmt(sa)} / ${fmt(sb)}` } }
37
+
38
+ export const DIAMOND_CASES = [
39
+
40
+ // 1) 純進側 1 進(頂側示範): 匯頂點
41
+ {
42
+ name: 'dia-1in', desc: '菱形純進側 — 1進(匯頂點)',
43
+ data: {
44
+ dir: 'TB',
45
+ nodes: [
46
+ { id: 'S', label: '來源', cls: 'blue' },
47
+ { id: 'D', label: '判斷?', cls: 'diamond' },
48
+ ],
49
+ edges: [{ from: 'S', to: 'D' }], //e0 頂側進
50
+ },
51
+ check: (spec, geom, h) => [inAtVT(geom, h, 'e0')],
52
+ },
53
+
54
+ // 2) 底側 1 出: 出=頂點
55
+ {
56
+ name: 'dia-1out', desc: '菱形底側 — 1出(頂點)',
57
+ data: {
58
+ dir: 'TB',
59
+ nodes: [
60
+ { id: 'S', label: '開始', cls: 'blue' },
61
+ { id: 'D', label: '判斷?', cls: 'diamond' },
62
+ { id: 'T', label: '結果', cls: 'green' },
63
+ ],
64
+ edges: [{ from: 'S', to: 'D' }, { from: 'D', to: 'T' }], //e0,e1
65
+ },
66
+ check: (spec, geom, h) => [outAtVB(geom, h, 'e1')],
67
+ },
68
+
69
+ // 3) 純進側 2 進(頂側示範): 共進頂點(共用末段, 箭頭重合)
70
+ {
71
+ name: 'dia-2in', desc: '菱形純進側 — 2進(共進頂點)',
72
+ data: {
73
+ dir: 'TB',
74
+ nodes: [
75
+ { id: 'S1', label: '來源一', cls: 'blue' },
76
+ { id: 'S2', label: '來源二', cls: 'purple' },
77
+ { id: 'D', label: '判斷?', cls: 'diamond' },
78
+ ],
79
+ edges: [{ from: 'S1', to: 'D' }, { from: 'S2', to: 'D' }], //e0,e1 頂側進
80
+ },
81
+ check: (spec, geom, h) => [inAtVT(geom, h, 'e0'), inAtVT(geom, h, 'e1')],
82
+ },
83
+
84
+ // 4) 底側 2 出: 共出頂點分岔
85
+ {
86
+ name: 'dia-2out', desc: '菱形底側 — 2出(共出頂點分岔)',
87
+ data: {
88
+ dir: 'TB',
89
+ nodes: [
90
+ { id: 'S', label: '開始', cls: 'blue' },
91
+ { id: 'D', label: '判斷?', cls: 'diamond' },
92
+ { id: 'T1', label: '結果一', cls: 'green' },
93
+ { id: 'T2', label: '結果二', cls: 'orange' },
94
+ ],
95
+ edges: [{ from: 'S', to: 'D' }, { from: 'D', to: 'T1', label: '是' }, { from: 'D', to: 'T2', label: '否' }], //e0,e1,e2
96
+ },
97
+ check: (spec, geom, h) => [outAtVB(geom, h, 'e1'), outAtVB(geom, h, 'e2')],
98
+ },
99
+
100
+ // 5) 底側 1進1出(混合): 出=頂點, 進=半側斜邊中點
101
+ {
102
+ name: 'dia-1in-1out', desc: '菱形底側 — 1進1出(出頂點/進斜邊中點)',
103
+ data: {
104
+ dir: 'TB',
105
+ nodes: [
106
+ { id: 'S', label: '開始', cls: 'blue' },
107
+ { id: 'D', label: '判斷?', cls: 'diamond' },
108
+ { id: 'T', label: '結果', cls: 'green' },
109
+ { id: 'X', label: '回饋來源', cls: 'red' },
110
+ ],
111
+ edges: [
112
+ { from: 'S', to: 'D' }, //e0
113
+ { from: 'D', to: 'T', label: '通過' }, //e1 底側出
114
+ { from: 'T', to: 'X' }, //e2
115
+ { from: 'X', to: 'D', kind: 'dashed', label: '退回' }, //e3 底側進
116
+ ],
117
+ },
118
+ check: (spec, geom, h) => [outAtVB(geom, h, 'e1'), inAtMid(geom, h, 'e3')],
119
+ },
120
+
121
+ // 6) 底側 2進1出(2進不同半側): 出=頂點, 兩進分匯左右斜邊中點
122
+ {
123
+ name: 'dia-2in-1out', desc: '菱形底側 — 2進1出(2進分匯左右)',
124
+ data: {
125
+ dir: 'TB',
126
+ nodes: [
127
+ { id: 'S', label: '開始', cls: 'blue' },
128
+ { id: 'D', label: '判斷?', cls: 'diamond' },
129
+ { id: 'T', label: '結果', cls: 'green' },
130
+ { id: 'X1', label: '來源一', cls: 'red' },
131
+ { id: 'X2', label: '來源二', cls: 'red' },
132
+ ],
133
+ edges: [
134
+ { from: 'S', to: 'D' }, //e0
135
+ { from: 'D', to: 'T' }, //e1 底側出
136
+ { from: 'T', to: 'X1' }, //e2(X1,X2 兄弟展開 → 進不同半側)
137
+ { from: 'T', to: 'X2' }, //e3
138
+ { from: 'X1', to: 'D', kind: 'dashed' }, //e4 底側進
139
+ { from: 'X2', to: 'D', kind: 'dashed' }, //e5 底側進
140
+ ],
141
+ },
142
+ check: (spec, geom, h) => [outAtVB(geom, h, 'e1'), insDiffMid(geom, h, 'e4', 'e5')],
143
+ },
144
+
145
+ // 7) 底側 1進2出(2出不同半側): 共出頂點左右分岔, 進=半側斜邊中點
146
+ {
147
+ name: 'dia-1in-2out', desc: '菱形底側 — 1進2出(2出左右分岔)',
148
+ data: {
149
+ dir: 'TB',
150
+ nodes: [
151
+ { id: 'S', label: '開始', cls: 'blue' },
152
+ { id: 'D', label: '判斷?', cls: 'diamond' },
153
+ { id: 'T1', label: '結果一', cls: 'green' },
154
+ { id: 'T2', label: '結果二', cls: 'orange' },
155
+ { id: 'X', label: '回饋來源', cls: 'red' },
156
+ ],
157
+ edges: [
158
+ { from: 'S', to: 'D' }, //e0
159
+ { from: 'D', to: 'T1', label: '是' }, //e1 底側出
160
+ { from: 'D', to: 'T2', label: '否' }, //e2 底側出
161
+ { from: 'T1', to: 'X' }, //e3
162
+ { from: 'X', to: 'D', kind: 'dashed' }, //e4 底側進
163
+ ],
164
+ },
165
+ check: (spec, geom, h) => [outAtVB(geom, h, 'e1'), outAtVB(geom, h, 'e2'), inAtMid(geom, h, 'e4')],
166
+ },
167
+
168
+ // 8) 底側 2進2出(單欄壅塞 → 自然形成進同半側+出同半側之實例)
169
+ {
170
+ name: 'dia-2in-2out-ss', desc: '菱形底側 — 2進2出(進同/出同)',
171
+ data: {
172
+ dir: 'TB',
173
+ nodes: [
174
+ { id: 'S', label: '開始', cls: 'blue' },
175
+ { id: 'D', label: '判斷?', cls: 'diamond' },
176
+ { id: 'T1', label: '結果一', cls: 'green' },
177
+ { id: 'T2', label: '結果二', cls: 'orange' },
178
+ { id: 'X1', label: '來源一', cls: 'red' },
179
+ { id: 'X2', label: '來源二', cls: 'red' },
180
+ ],
181
+ edges: [
182
+ { from: 'S', to: 'D' }, //e0
183
+ { from: 'D', to: 'T1' }, //e1 底側出
184
+ { from: 'D', to: 'T2' }, //e2 底側出(T 疊欄)
185
+ { from: 'T1', to: 'T2' }, //e3
186
+ { from: 'T2', to: 'X1' }, //e4
187
+ { from: 'X1', to: 'X2' }, //e5(X 疊欄)
188
+ { from: 'X1', to: 'D', kind: 'dashed' }, //e6 底側進
189
+ { from: 'X2', to: 'D', kind: 'dashed' }, //e7 底側進
190
+ ],
191
+ },
192
+ check: (spec, geom, h) => [outAtVB(geom, h, 'e1'), outAtVB(geom, h, 'e2'), insSameMid(geom, h, 'e6', 'e7'), inAtMid(geom, h, 'e6')],
193
+ },
194
+
195
+ // 9) 底側 2進2出(進不同半側, 出不同半側)
196
+ {
197
+ name: 'dia-2in-2out-dd', desc: '菱形底側 — 2進2出(進不同/出不同)',
198
+ data: {
199
+ dir: 'TB',
200
+ nodes: [
201
+ { id: 'S', label: '開始', cls: 'blue' },
202
+ { id: 'D', label: '判斷?', cls: 'diamond' },
203
+ { id: 'T1', label: '結果一', cls: 'green' },
204
+ { id: 'T2', label: '結果二', cls: 'orange' },
205
+ { id: 'X1', label: '來源一', cls: 'red' },
206
+ { id: 'X2', label: '來源二', cls: 'red' },
207
+ ],
208
+ edges: [
209
+ { from: 'S', to: 'D' }, //e0
210
+ { from: 'D', to: 'T1', label: '是' }, //e1 底側出
211
+ { from: 'D', to: 'T2', label: '否' }, //e2 底側出
212
+ { from: 'T1', to: 'X1' }, //e3
213
+ { from: 'T2', to: 'X2' }, //e4
214
+ { from: 'X1', to: 'D', kind: 'dashed' }, //e5 底側進
215
+ { from: 'X2', to: 'D', kind: 'dashed' }, //e6 底側進
216
+ ],
217
+ },
218
+ check: (spec, geom, h) => [outAtVB(geom, h, 'e1'), outAtVB(geom, h, 'e2'), insDiffMid(geom, h, 'e5', 'e6')],
219
+ },
220
+
221
+ ]
package/test/cases.mjs CHANGED
@@ -104,7 +104,23 @@ export const CASES = [
104
104
  },
105
105
  check(spec, geom, h) {
106
106
  const D = h.node('D')
107
- return [{ name: 'D 為菱形', pass: !!D && D.kind === 'diamond', detail: D && `kind=${D.kind}` }]
107
+ const out = [{ name: 'D 為菱形', pass: !!D && D.kind === 'diamond', detail: D && `kind=${D.kind}` }]
108
+ // 菱形多條外連邊皆由底部「頂點」連出(不與斜邊空接; e1=D→Y, e2=D→N)
109
+ if (D) {
110
+ const vx = D.x + D.w / 2, vy = D.y + D.h
111
+ for (const eid of ['e1', 'e2']) {
112
+ const ge = geom.edges.find(e => e.id === eid)
113
+ const s0 = ge && ge.segs[0] && ge.segs[0][0]
114
+ out.push({ name: `${eid} 由菱形底角連出`, pass: !!s0 && Math.abs(s0.x - vx) <= 2 && Math.abs(s0.y - vy) <= 2, detail: s0 && `s0=(${s0.x.toFixed(1)},${s0.y.toFixed(1)}) 頂點=(${vx.toFixed(1)},${vy.toFixed(1)})` })
115
+ }
116
+ // 連入邊終點貼菱形「斜邊」(菱形方程 |dx|/hw+|dy|/hh ≈ 1; e0=P→D)
117
+ const ge0 = geom.edges.find(e => e.id === 'e0')
118
+ const seg0 = ge0 && ge0.segs[0]
119
+ const pE = seg0 && seg0[seg0.length - 1]
120
+ const eq = pE && (Math.abs(pE.x - (D.x + D.w / 2)) / (D.w / 2) + Math.abs(pE.y - (D.y + D.h / 2)) / (D.h / 2))
121
+ out.push({ name: 'e0 連入端點貼斜邊', pass: !!pE && eq > 0.9 && eq < 1.1, detail: pE && `eq=${eq.toFixed(3)}` })
122
+ }
123
+ return out
108
124
  },
109
125
  },
110
126
 
@@ -0,0 +1,43 @@
1
+ {
2
+ "dir": "TB",
3
+ "nodes": [
4
+ { "id": "FRONT", "label": "前台受理", "cls": "blueG" },
5
+ { "id": "f1", "label": "客戶提出報修申請", "cls": "blue", "group": "FRONT" },
6
+ { "id": "f2", "label": "客服人員登錄工單", "cls": "blue", "group": "FRONT" },
7
+ { "id": "f6", "label": "確認聯絡方式與地址", "cls": "blue", "group": "FRONT" },
8
+ { "id": "d1", "label": "案件類型判斷", "cls": "diamond", "group": "FRONT" },
9
+ { "id": "f3", "label": "標記為一般排程", "cls": "green", "group": "FRONT" },
10
+ { "id": "f4", "label": "標記為優先處理", "cls": "orange", "group": "FRONT" },
11
+ { "id": "f4c", "label": "轉交專案小組評估", "cls": "orange", "group": "FRONT" },
12
+ { "id": "BACK", "label": "後台處理", "cls": "purpleG" },
13
+ { "id": "b1", "label": "派工人員指派", "cls": "purple", "group": "BACK" },
14
+ { "id": "b2", "label": "技術人員到場檢修", "cls": "purple", "group": "BACK" },
15
+ { "id": "d2", "label": "是否修復成功", "cls": "diamond", "group": "BACK" },
16
+ { "id": "b3", "label": "更換零件", "cls": "red", "group": "BACK" },
17
+ { "id": "b4", "label": "填寫維修報告", "cls": "green", "group": "BACK" },
18
+ { "id": "b6", "label": "拍照存證並歸檔", "cls": "green", "group": "BACK" },
19
+ { "id": "b5", "label": "回報前台結案", "cls": "green", "group": "BACK" },
20
+ { "id": "f5", "label": "通知客戶結案", "cls": "blue" },
21
+ { "id": "end", "label": "工單結案", "cls": "done" }
22
+ ],
23
+ "edges": [
24
+ { "from": "f1", "to": "f2" },
25
+ { "from": "f2", "to": "f6" },
26
+ { "from": "f6", "to": "d1" },
27
+ { "from": "d1", "to": "f3", "label": "一般" },
28
+ { "from": "d1", "to": "f4", "label": "緊急" },
29
+ { "from": "d1", "to": "f4c", "label": "特殊申訴" },
30
+ { "from": "f3", "to": "b1", "label": "派工" },
31
+ { "from": "f4", "to": "b1", "label": "派工" },
32
+ { "from": "f4c", "to": "b1", "label": "派工" },
33
+ { "from": "b1", "to": "b2" },
34
+ { "from": "b2", "to": "d2" },
35
+ { "from": "d2", "to": "b4", "label": "是" },
36
+ { "from": "d2", "to": "b3", "label": "否" },
37
+ { "from": "b3", "to": "b2", "kind": "dashed", "label": "退回重測" },
38
+ { "from": "b4", "to": "b6" },
39
+ { "from": "b6", "to": "b5" },
40
+ { "from": "b5", "to": "f5", "label": "結案回報" },
41
+ { "from": "f5", "to": "end" }
42
+ ]
43
+ }
@@ -0,0 +1,132 @@
1
+ {
2
+ "dir": "TB",
3
+ "nodes": [
4
+ {
5
+ "id": "CLU",
6
+ "label": "服務叢集",
7
+ "cls": "blueG"
8
+ },
9
+ {
10
+ "id": "NS1",
11
+ "label": "訂單命名空間",
12
+ "cls": "greenG",
13
+ "group": "CLU"
14
+ },
15
+ {
16
+ "id": "NS2",
17
+ "label": "帳務命名空間",
18
+ "cls": "greenG",
19
+ "group": "CLU"
20
+ },
21
+ {
22
+ "id": "SG1",
23
+ "label": "訂單服務群",
24
+ "cls": "orangeG",
25
+ "group": "NS1"
26
+ },
27
+ {
28
+ "id": "SG2",
29
+ "label": "庫存服務群",
30
+ "cls": "orangeG",
31
+ "group": "NS1"
32
+ },
33
+ {
34
+ "id": "SG3",
35
+ "label": "帳務服務群",
36
+ "cls": "orangeG",
37
+ "group": "NS2"
38
+ },
39
+ {
40
+ "id": "o1",
41
+ "label": "訂單 API",
42
+ "cls": "orange",
43
+ "group": "SG1"
44
+ },
45
+ {
46
+ "id": "o2",
47
+ "title": "訂單背景任務",
48
+ "items": [
49
+ "排程掃描",
50
+ "失敗重試"
51
+ ],
52
+ "cls": "orange",
53
+ "group": "SG1"
54
+ },
55
+ {
56
+ "id": "i1",
57
+ "label": "庫存 API",
58
+ "cls": "orange",
59
+ "group": "SG2"
60
+ },
61
+ {
62
+ "id": "i2",
63
+ "label": "庫存快取",
64
+ "cls": "orange",
65
+ "group": "SG2"
66
+ },
67
+ {
68
+ "id": "p1",
69
+ "title": "付款服務",
70
+ "items": [
71
+ "扣款",
72
+ "對帳"
73
+ ],
74
+ "cls": "orange",
75
+ "group": "SG3"
76
+ },
77
+ {
78
+ "id": "p2",
79
+ "label": "帳務 API",
80
+ "cls": "orange",
81
+ "group": "SG3"
82
+ },
83
+ {
84
+ "id": "GW",
85
+ "label": "API 閘道",
86
+ "cls": "purple"
87
+ },
88
+ {
89
+ "id": "MQ",
90
+ "label": "訊息佇列",
91
+ "cls": "purple"
92
+ }
93
+ ],
94
+ "edges": [
95
+ {
96
+ "from": "GW",
97
+ "to": "NS1",
98
+ "label": "路由請求"
99
+ },
100
+ {
101
+ "from": "GW",
102
+ "to": "NS2",
103
+ "label": "路由請求"
104
+ },
105
+ {
106
+ "from": "SG1",
107
+ "to": "SG2",
108
+ "label": "查詢庫存"
109
+ },
110
+ {
111
+ "from": "SG1",
112
+ "to": "MQ",
113
+ "label": "發布訂單事件",
114
+ "kind": "dashed"
115
+ },
116
+ {
117
+ "from": "SG3",
118
+ "to": "MQ",
119
+ "label": "訂閱付款事件",
120
+ "kind": "dashed"
121
+ },
122
+ {
123
+ "from": "o1",
124
+ "to": "i1",
125
+ "label": "扣減庫存"
126
+ },
127
+ {
128
+ "from": "p1",
129
+ "to": "p2"
130
+ }
131
+ ]
132
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "dir": "TB",
3
+ "nodes": [
4
+ { "id": "GRP", "label": "會員註冊流程", "cls": "blueG" },
5
+ { "id": "n1", "label": "使用者進入註冊頁", "cls": "blue", "group": "GRP" },
6
+ { "id": "n2", "label": "填寫帳號密碼與信箱", "cls": "blue", "group": "GRP" },
7
+ { "id": "d1", "label": "格式驗證是否通過", "cls": "diamond", "group": "GRP" },
8
+ { "id": "n3", "label": "顯示錯誤提示", "cls": "red", "group": "GRP" },
9
+ { "id": "n4", "label": "檢查帳號是否已存在", "cls": "green", "group": "GRP" },
10
+ { "id": "d2", "label": "帳號是否重複", "cls": "diamond", "group": "GRP" },
11
+ { "id": "n5", "label": "建立會員資料並寄送驗證信", "cls": "green", "group": "GRP" },
12
+ { "id": "n6", "label": "使用者點擊驗證連結啟用帳號", "cls": "orange", "group": "GRP" },
13
+ { "id": "end", "label": "註冊完成", "cls": "done", "group": "GRP" }
14
+ ],
15
+ "edges": [
16
+ { "from": "n1", "to": "n2" },
17
+ { "from": "n2", "to": "d1" },
18
+ { "from": "d1", "to": "n4", "label": "是" },
19
+ { "from": "d1", "to": "n3", "label": "否" },
20
+ { "from": "n3", "to": "n2", "kind": "dashed" },
21
+ { "from": "n4", "to": "d2" },
22
+ { "from": "d2", "to": "n5", "label": "否" },
23
+ { "from": "d2", "to": "n3", "label": "是" },
24
+ { "from": "n5", "to": "n6" },
25
+ { "from": "n6", "to": "end" }
26
+ ]
27
+ }
@@ -0,0 +1,111 @@
1
+ {
2
+ "dir": "TB",
3
+ "nodes": [
4
+ {
5
+ "id": "G1",
6
+ "label": "使用者模組",
7
+ "cls": "blueG"
8
+ },
9
+ {
10
+ "id": "G2",
11
+ "label": "訂單模組",
12
+ "cls": "greenG"
13
+ },
14
+ {
15
+ "id": "G3",
16
+ "label": "共用模組",
17
+ "cls": "orangeG"
18
+ },
19
+ {
20
+ "id": "g1a",
21
+ "title": "帳號管理",
22
+ "items": [
23
+ "註冊",
24
+ "登入",
25
+ "密碼重設",
26
+ "權限設定"
27
+ ],
28
+ "cls": "blue",
29
+ "group": "G1"
30
+ },
31
+ {
32
+ "id": "g1b",
33
+ "title": "個人資料",
34
+ "items": [
35
+ "基本資料",
36
+ "收件地址",
37
+ "偏好設定"
38
+ ],
39
+ "cls": "blue",
40
+ "group": "G1"
41
+ },
42
+ {
43
+ "id": "g2a",
44
+ "title": "訂單處理",
45
+ "items": [
46
+ "建立訂單",
47
+ "訂單查詢",
48
+ "訂單取消",
49
+ "訂單狀態"
50
+ ],
51
+ "cls": "green",
52
+ "group": "G2"
53
+ },
54
+ {
55
+ "id": "g2b",
56
+ "title": "金流處理",
57
+ "items": [
58
+ "付款",
59
+ "退款",
60
+ "發票開立"
61
+ ],
62
+ "cls": "green",
63
+ "group": "G2"
64
+ },
65
+ {
66
+ "id": "g3a",
67
+ "title": "訊息通知",
68
+ "items": [
69
+ "站內信",
70
+ "電子郵件",
71
+ "簡訊"
72
+ ],
73
+ "cls": "orange",
74
+ "group": "G3"
75
+ },
76
+ {
77
+ "id": "g3b",
78
+ "title": "紀錄稽核",
79
+ "items": [
80
+ "操作紀錄",
81
+ "錯誤紀錄"
82
+ ],
83
+ "cls": "orange",
84
+ "group": "G3"
85
+ }
86
+ ],
87
+ "edges": [
88
+ {
89
+ "from": "G1",
90
+ "to": "G3",
91
+ "label": "呼叫共用"
92
+ },
93
+ {
94
+ "from": "G2",
95
+ "to": "G3",
96
+ "label": "觸發通知"
97
+ },
98
+ {
99
+ "from": "g2a",
100
+ "to": "g3a",
101
+ "label": "訂單通知",
102
+ "kind": "dashed"
103
+ },
104
+ {
105
+ "from": "g1a",
106
+ "to": "g3b",
107
+ "label": "登入紀錄",
108
+ "kind": "dashed"
109
+ }
110
+ ]
111
+ }