@cristianormazabal/triton-core 0.1.0 → 0.1.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 (627) hide show
  1. package/dist/contracts/anchors.js +20 -0
  2. package/dist/contracts/anchors.js.map +1 -0
  3. package/dist/contracts/animations.d.ts +5 -0
  4. package/dist/contracts/animations.d.ts.map +1 -0
  5. package/dist/contracts/animations.js +15 -0
  6. package/dist/contracts/animations.js.map +1 -0
  7. package/dist/contracts/crosslink.d.ts +21 -41
  8. package/dist/contracts/crosslink.d.ts.map +1 -1
  9. package/dist/contracts/crosslink.js +17 -0
  10. package/dist/contracts/crosslink.js.map +1 -0
  11. package/dist/contracts/diagram.js +24 -0
  12. package/dist/contracts/diagram.js.map +1 -0
  13. package/dist/contracts/index.d.ts +6 -3
  14. package/dist/contracts/index.d.ts.map +1 -1
  15. package/dist/contracts/index.js +21 -0
  16. package/dist/contracts/index.js.map +1 -0
  17. package/dist/contracts/overlay.js +22 -0
  18. package/dist/contracts/overlay.js.map +1 -0
  19. package/dist/contracts/primitives.js +13 -0
  20. package/dist/contracts/primitives.js.map +1 -0
  21. package/dist/contracts/renderer.js +15 -0
  22. package/dist/contracts/renderer.js.map +1 -0
  23. package/dist/contracts/result.js +26 -0
  24. package/dist/contracts/result.js.map +1 -0
  25. package/dist/contracts/routing.d.ts +4 -0
  26. package/dist/contracts/routing.d.ts.map +1 -1
  27. package/dist/contracts/routing.js +14 -0
  28. package/dist/contracts/routing.js.map +1 -0
  29. package/dist/contracts/scene.d.ts +5 -1
  30. package/dist/contracts/scene.d.ts.map +1 -1
  31. package/dist/contracts/scene.js +18 -0
  32. package/dist/contracts/scene.js.map +1 -0
  33. package/dist/contracts/theme.js +18 -0
  34. package/dist/contracts/theme.js.map +1 -0
  35. package/dist/crosslink/connectors.d.ts +66 -0
  36. package/dist/crosslink/connectors.d.ts.map +1 -0
  37. package/dist/crosslink/connectors.js +130 -0
  38. package/dist/crosslink/connectors.js.map +1 -0
  39. package/dist/crosslink/engine2.d.ts +2 -2
  40. package/dist/crosslink/engine2.d.ts.map +1 -1
  41. package/dist/crosslink/engine2.js +783 -0
  42. package/dist/crosslink/engine2.js.map +1 -0
  43. package/dist/crosslink/engine3.d.ts +2 -2
  44. package/dist/crosslink/engine3.d.ts.map +1 -1
  45. package/dist/crosslink/engine3.js +968 -0
  46. package/dist/crosslink/engine3.js.map +1 -0
  47. package/dist/crosslink/index.d.ts +2 -0
  48. package/dist/crosslink/index.d.ts.map +1 -1
  49. package/dist/crosslink/index.js +4 -0
  50. package/dist/crosslink/index.js.map +1 -0
  51. package/dist/crosslink/render.d.ts +2 -2
  52. package/dist/crosslink/render.d.ts.map +1 -1
  53. package/dist/crosslink/render.js +997 -0
  54. package/dist/crosslink/render.js.map +1 -0
  55. package/dist/crosslink/resolve.js +331 -0
  56. package/dist/crosslink/resolve.js.map +1 -0
  57. package/dist/diagrams/{c4 → mermaid/c4}/index.d.ts +1 -1
  58. package/dist/diagrams/mermaid/c4/index.d.ts.map +1 -0
  59. package/dist/diagrams/mermaid/c4/index.js +14 -0
  60. package/dist/diagrams/mermaid/c4/index.js.map +1 -0
  61. package/dist/diagrams/{c4 → mermaid/c4}/ir.d.ts +1 -1
  62. package/dist/diagrams/mermaid/c4/ir.d.ts.map +1 -0
  63. package/dist/diagrams/mermaid/c4/ir.js +2 -0
  64. package/dist/diagrams/mermaid/c4/ir.js.map +1 -0
  65. package/dist/diagrams/{c4 → mermaid/c4}/layout.d.ts +2 -2
  66. package/dist/diagrams/mermaid/c4/layout.d.ts.map +1 -0
  67. package/dist/diagrams/mermaid/c4/layout.js +110 -0
  68. package/dist/diagrams/mermaid/c4/layout.js.map +1 -0
  69. package/dist/diagrams/{class → mermaid/class}/index.d.ts +1 -1
  70. package/dist/diagrams/mermaid/class/index.d.ts.map +1 -0
  71. package/dist/diagrams/mermaid/class/index.js +14 -0
  72. package/dist/diagrams/mermaid/class/index.js.map +1 -0
  73. package/dist/diagrams/{class → mermaid/class}/ir.d.ts +1 -1
  74. package/dist/diagrams/mermaid/class/ir.d.ts.map +1 -0
  75. package/dist/diagrams/mermaid/class/ir.js +2 -0
  76. package/dist/diagrams/mermaid/class/ir.js.map +1 -0
  77. package/dist/diagrams/{class → mermaid/class}/layout.d.ts +2 -2
  78. package/dist/diagrams/mermaid/class/layout.d.ts.map +1 -0
  79. package/dist/diagrams/mermaid/class/layout.js +877 -0
  80. package/dist/diagrams/mermaid/class/layout.js.map +1 -0
  81. package/dist/diagrams/{er → mermaid/er}/index.d.ts +1 -1
  82. package/dist/diagrams/mermaid/er/index.d.ts.map +1 -0
  83. package/dist/diagrams/mermaid/er/index.js +14 -0
  84. package/dist/diagrams/mermaid/er/index.js.map +1 -0
  85. package/dist/diagrams/{er → mermaid/er}/ir.d.ts +1 -1
  86. package/dist/diagrams/mermaid/er/ir.d.ts.map +1 -0
  87. package/dist/diagrams/mermaid/er/ir.js +2 -0
  88. package/dist/diagrams/mermaid/er/ir.js.map +1 -0
  89. package/dist/diagrams/{er → mermaid/er}/layout.d.ts +2 -2
  90. package/dist/diagrams/mermaid/er/layout.d.ts.map +1 -0
  91. package/dist/diagrams/mermaid/er/layout.js +116 -0
  92. package/dist/diagrams/mermaid/er/layout.js.map +1 -0
  93. package/dist/diagrams/{flowchart → mermaid/flowchart}/index.d.ts +1 -1
  94. package/dist/diagrams/mermaid/flowchart/index.d.ts.map +1 -0
  95. package/dist/diagrams/mermaid/flowchart/index.js +24 -0
  96. package/dist/diagrams/mermaid/flowchart/index.js.map +1 -0
  97. package/dist/diagrams/{flowchart → mermaid/flowchart}/ir.d.ts +7 -1
  98. package/dist/diagrams/mermaid/flowchart/ir.d.ts.map +1 -0
  99. package/dist/diagrams/mermaid/flowchart/ir.js +2 -0
  100. package/dist/diagrams/mermaid/flowchart/ir.js.map +1 -0
  101. package/dist/diagrams/mermaid/flowchart/layout.d.ts +5 -0
  102. package/dist/diagrams/mermaid/flowchart/layout.d.ts.map +1 -0
  103. package/dist/diagrams/mermaid/flowchart/layout.js +652 -0
  104. package/dist/diagrams/mermaid/flowchart/layout.js.map +1 -0
  105. package/dist/diagrams/{gantt → mermaid/gantt}/index.d.ts +1 -1
  106. package/dist/diagrams/mermaid/gantt/index.d.ts.map +1 -0
  107. package/dist/diagrams/mermaid/gantt/index.js +89 -0
  108. package/dist/diagrams/mermaid/gantt/index.js.map +1 -0
  109. package/dist/diagrams/{gantt → mermaid/gantt}/ir.d.ts +1 -1
  110. package/dist/diagrams/mermaid/gantt/ir.d.ts.map +1 -0
  111. package/dist/diagrams/mermaid/gantt/ir.js +2 -0
  112. package/dist/diagrams/mermaid/gantt/ir.js.map +1 -0
  113. package/dist/diagrams/{gantt → mermaid/gantt}/layout.d.ts +2 -2
  114. package/dist/diagrams/mermaid/gantt/layout.d.ts.map +1 -0
  115. package/dist/diagrams/mermaid/gantt/layout.js +95 -0
  116. package/dist/diagrams/mermaid/gantt/layout.js.map +1 -0
  117. package/dist/diagrams/{gitgraph → mermaid/gitgraph}/index.d.ts +1 -1
  118. package/dist/diagrams/mermaid/gitgraph/index.d.ts.map +1 -0
  119. package/dist/diagrams/mermaid/gitgraph/index.js +58 -0
  120. package/dist/diagrams/mermaid/gitgraph/index.js.map +1 -0
  121. package/dist/diagrams/{gitgraph → mermaid/gitgraph}/ir.d.ts +1 -1
  122. package/dist/diagrams/mermaid/gitgraph/ir.d.ts.map +1 -0
  123. package/dist/diagrams/mermaid/gitgraph/ir.js +2 -0
  124. package/dist/diagrams/mermaid/gitgraph/ir.js.map +1 -0
  125. package/dist/diagrams/{gitgraph → mermaid/gitgraph}/layout.d.ts +2 -2
  126. package/dist/diagrams/mermaid/gitgraph/layout.d.ts.map +1 -0
  127. package/dist/diagrams/mermaid/gitgraph/layout.js +89 -0
  128. package/dist/diagrams/mermaid/gitgraph/layout.js.map +1 -0
  129. package/dist/diagrams/{journey → mermaid/journey}/index.d.ts +1 -1
  130. package/dist/diagrams/mermaid/journey/index.d.ts.map +1 -0
  131. package/dist/diagrams/mermaid/journey/index.js +14 -0
  132. package/dist/diagrams/mermaid/journey/index.js.map +1 -0
  133. package/dist/diagrams/{journey → mermaid/journey}/ir.d.ts +1 -1
  134. package/dist/diagrams/mermaid/journey/ir.d.ts.map +1 -0
  135. package/dist/diagrams/mermaid/journey/ir.js +2 -0
  136. package/dist/diagrams/mermaid/journey/ir.js.map +1 -0
  137. package/dist/diagrams/{journey → mermaid/journey}/layout.d.ts +2 -2
  138. package/dist/diagrams/mermaid/journey/layout.d.ts.map +1 -0
  139. package/dist/diagrams/mermaid/journey/layout.js +92 -0
  140. package/dist/diagrams/mermaid/journey/layout.js.map +1 -0
  141. package/dist/diagrams/{kanban → mermaid/kanban}/index.d.ts +1 -1
  142. package/dist/diagrams/mermaid/kanban/index.d.ts.map +1 -0
  143. package/dist/diagrams/mermaid/kanban/index.js +14 -0
  144. package/dist/diagrams/mermaid/kanban/index.js.map +1 -0
  145. package/dist/diagrams/{kanban → mermaid/kanban}/ir.d.ts +1 -1
  146. package/dist/diagrams/mermaid/kanban/ir.d.ts.map +1 -0
  147. package/dist/diagrams/mermaid/kanban/ir.js +2 -0
  148. package/dist/diagrams/mermaid/kanban/ir.js.map +1 -0
  149. package/dist/diagrams/{kanban → mermaid/kanban}/layout.d.ts +2 -2
  150. package/dist/diagrams/mermaid/kanban/layout.d.ts.map +1 -0
  151. package/dist/diagrams/mermaid/kanban/layout.js +68 -0
  152. package/dist/diagrams/mermaid/kanban/layout.js.map +1 -0
  153. package/dist/diagrams/{mindmap → mermaid/mindmap}/index.d.ts +1 -1
  154. package/dist/diagrams/mermaid/mindmap/index.d.ts.map +1 -0
  155. package/dist/diagrams/mermaid/mindmap/index.js +52 -0
  156. package/dist/diagrams/mermaid/mindmap/index.js.map +1 -0
  157. package/dist/diagrams/{mindmap → mermaid/mindmap}/ir.d.ts +1 -1
  158. package/dist/diagrams/mermaid/mindmap/ir.d.ts.map +1 -0
  159. package/dist/diagrams/mermaid/mindmap/ir.js +2 -0
  160. package/dist/diagrams/mermaid/mindmap/ir.js.map +1 -0
  161. package/dist/diagrams/{mindmap → mermaid/mindmap}/layout.d.ts +2 -2
  162. package/dist/diagrams/mermaid/mindmap/layout.d.ts.map +1 -0
  163. package/dist/diagrams/mermaid/mindmap/layout.js +100 -0
  164. package/dist/diagrams/mermaid/mindmap/layout.js.map +1 -0
  165. package/dist/diagrams/{pie → mermaid/pie}/index.d.ts +1 -1
  166. package/dist/diagrams/mermaid/pie/index.d.ts.map +1 -0
  167. package/dist/diagrams/mermaid/pie/index.js +14 -0
  168. package/dist/diagrams/mermaid/pie/index.js.map +1 -0
  169. package/dist/diagrams/{pie → mermaid/pie}/ir.d.ts +1 -1
  170. package/dist/diagrams/mermaid/pie/ir.d.ts.map +1 -0
  171. package/dist/diagrams/mermaid/pie/ir.js +2 -0
  172. package/dist/diagrams/mermaid/pie/ir.js.map +1 -0
  173. package/dist/diagrams/{pie → mermaid/pie}/layout.d.ts +2 -2
  174. package/dist/diagrams/mermaid/pie/layout.d.ts.map +1 -0
  175. package/dist/diagrams/mermaid/pie/layout.js +84 -0
  176. package/dist/diagrams/mermaid/pie/layout.js.map +1 -0
  177. package/dist/diagrams/{quadrant → mermaid/quadrant}/index.d.ts +1 -1
  178. package/dist/diagrams/mermaid/quadrant/index.d.ts.map +1 -0
  179. package/dist/diagrams/mermaid/quadrant/index.js +14 -0
  180. package/dist/diagrams/mermaid/quadrant/index.js.map +1 -0
  181. package/dist/diagrams/{quadrant → mermaid/quadrant}/ir.d.ts +1 -1
  182. package/dist/diagrams/mermaid/quadrant/ir.d.ts.map +1 -0
  183. package/dist/diagrams/mermaid/quadrant/ir.js +2 -0
  184. package/dist/diagrams/mermaid/quadrant/ir.js.map +1 -0
  185. package/dist/diagrams/{quadrant → mermaid/quadrant}/layout.d.ts +2 -2
  186. package/dist/diagrams/mermaid/quadrant/layout.d.ts.map +1 -0
  187. package/dist/diagrams/mermaid/quadrant/layout.js +83 -0
  188. package/dist/diagrams/mermaid/quadrant/layout.js.map +1 -0
  189. package/dist/diagrams/{radar → mermaid/radar}/index.d.ts +1 -1
  190. package/dist/diagrams/mermaid/radar/index.d.ts.map +1 -0
  191. package/dist/diagrams/mermaid/radar/index.js +14 -0
  192. package/dist/diagrams/mermaid/radar/index.js.map +1 -0
  193. package/dist/diagrams/{radar → mermaid/radar}/ir.d.ts +1 -1
  194. package/dist/diagrams/mermaid/radar/ir.d.ts.map +1 -0
  195. package/dist/diagrams/mermaid/radar/ir.js +2 -0
  196. package/dist/diagrams/mermaid/radar/ir.js.map +1 -0
  197. package/dist/diagrams/{radar → mermaid/radar}/layout.d.ts +2 -2
  198. package/dist/diagrams/mermaid/radar/layout.d.ts.map +1 -0
  199. package/dist/diagrams/mermaid/radar/layout.js +91 -0
  200. package/dist/diagrams/mermaid/radar/layout.js.map +1 -0
  201. package/dist/diagrams/{requirement → mermaid/requirement}/index.d.ts +1 -1
  202. package/dist/diagrams/mermaid/requirement/index.d.ts.map +1 -0
  203. package/dist/diagrams/mermaid/requirement/index.js +14 -0
  204. package/dist/diagrams/mermaid/requirement/index.js.map +1 -0
  205. package/dist/diagrams/{requirement → mermaid/requirement}/ir.d.ts +1 -1
  206. package/dist/diagrams/mermaid/requirement/ir.d.ts.map +1 -0
  207. package/dist/diagrams/mermaid/requirement/ir.js +2 -0
  208. package/dist/diagrams/mermaid/requirement/ir.js.map +1 -0
  209. package/dist/diagrams/{requirement → mermaid/requirement}/layout.d.ts +2 -2
  210. package/dist/diagrams/mermaid/requirement/layout.d.ts.map +1 -0
  211. package/dist/diagrams/mermaid/requirement/layout.js +79 -0
  212. package/dist/diagrams/mermaid/requirement/layout.js.map +1 -0
  213. package/dist/diagrams/{sankey → mermaid/sankey}/index.d.ts +1 -1
  214. package/dist/diagrams/mermaid/sankey/index.d.ts.map +1 -0
  215. package/dist/diagrams/mermaid/sankey/index.js +14 -0
  216. package/dist/diagrams/mermaid/sankey/index.js.map +1 -0
  217. package/dist/diagrams/{sankey → mermaid/sankey}/ir.d.ts +1 -1
  218. package/dist/diagrams/mermaid/sankey/ir.d.ts.map +1 -0
  219. package/dist/diagrams/mermaid/sankey/ir.js +2 -0
  220. package/dist/diagrams/mermaid/sankey/ir.js.map +1 -0
  221. package/dist/diagrams/{sankey → mermaid/sankey}/layout.d.ts +2 -2
  222. package/dist/diagrams/mermaid/sankey/layout.d.ts.map +1 -0
  223. package/dist/diagrams/mermaid/sankey/layout.js +124 -0
  224. package/dist/diagrams/mermaid/sankey/layout.js.map +1 -0
  225. package/dist/diagrams/{sequence → mermaid/sequence}/index.d.ts +1 -1
  226. package/dist/diagrams/mermaid/sequence/index.d.ts.map +1 -0
  227. package/dist/diagrams/mermaid/sequence/index.js +14 -0
  228. package/dist/diagrams/mermaid/sequence/index.js.map +1 -0
  229. package/dist/diagrams/{sequence → mermaid/sequence}/ir.d.ts +1 -1
  230. package/dist/diagrams/mermaid/sequence/ir.d.ts.map +1 -0
  231. package/dist/diagrams/mermaid/sequence/ir.js +2 -0
  232. package/dist/diagrams/mermaid/sequence/ir.js.map +1 -0
  233. package/dist/diagrams/{sequence → mermaid/sequence}/layout.d.ts +2 -2
  234. package/dist/diagrams/mermaid/sequence/layout.d.ts.map +1 -0
  235. package/dist/diagrams/mermaid/sequence/layout.js +168 -0
  236. package/dist/diagrams/mermaid/sequence/layout.js.map +1 -0
  237. package/dist/diagrams/{state → mermaid/state}/index.d.ts +1 -1
  238. package/dist/diagrams/mermaid/state/index.d.ts.map +1 -0
  239. package/dist/diagrams/mermaid/state/index.js +14 -0
  240. package/dist/diagrams/mermaid/state/index.js.map +1 -0
  241. package/dist/diagrams/{state → mermaid/state}/ir.d.ts +1 -1
  242. package/dist/diagrams/mermaid/state/ir.d.ts.map +1 -0
  243. package/dist/diagrams/mermaid/state/ir.js +2 -0
  244. package/dist/diagrams/mermaid/state/ir.js.map +1 -0
  245. package/dist/diagrams/{state → mermaid/state}/layout.d.ts +2 -2
  246. package/dist/diagrams/mermaid/state/layout.d.ts.map +1 -0
  247. package/dist/diagrams/mermaid/state/layout.js +172 -0
  248. package/dist/diagrams/mermaid/state/layout.js.map +1 -0
  249. package/dist/diagrams/{timeline → mermaid/timeline}/index.d.ts +1 -1
  250. package/dist/diagrams/mermaid/timeline/index.d.ts.map +1 -0
  251. package/dist/diagrams/mermaid/timeline/index.js +23 -0
  252. package/dist/diagrams/mermaid/timeline/index.js.map +1 -0
  253. package/dist/diagrams/{timeline → mermaid/timeline}/ir.d.ts +1 -1
  254. package/dist/diagrams/mermaid/timeline/ir.d.ts.map +1 -0
  255. package/dist/diagrams/mermaid/timeline/ir.js +2 -0
  256. package/dist/diagrams/mermaid/timeline/ir.js.map +1 -0
  257. package/dist/diagrams/mermaid/timeline/layout.d.ts +5 -0
  258. package/dist/diagrams/mermaid/timeline/layout.d.ts.map +1 -0
  259. package/dist/diagrams/mermaid/timeline/layout.js +228 -0
  260. package/dist/diagrams/mermaid/timeline/layout.js.map +1 -0
  261. package/dist/diagrams/{timeline → mermaid/timeline}/numbered.d.ts +2 -2
  262. package/dist/diagrams/mermaid/timeline/numbered.d.ts.map +1 -0
  263. package/dist/diagrams/mermaid/timeline/numbered.js +112 -0
  264. package/dist/diagrams/mermaid/timeline/numbered.js.map +1 -0
  265. package/dist/diagrams/{timeline → mermaid/timeline}/roadmap.d.ts +2 -2
  266. package/dist/diagrams/mermaid/timeline/roadmap.d.ts.map +1 -0
  267. package/dist/diagrams/mermaid/timeline/roadmap.js +125 -0
  268. package/dist/diagrams/mermaid/timeline/roadmap.js.map +1 -0
  269. package/dist/diagrams/{timeline → mermaid/timeline}/serpentine.d.ts +2 -2
  270. package/dist/diagrams/mermaid/timeline/serpentine.d.ts.map +1 -0
  271. package/dist/diagrams/mermaid/timeline/serpentine.js +152 -0
  272. package/dist/diagrams/mermaid/timeline/serpentine.js.map +1 -0
  273. package/dist/diagrams/{timeline → mermaid/timeline}/shared.d.ts +1 -1
  274. package/dist/diagrams/mermaid/timeline/shared.d.ts.map +1 -0
  275. package/dist/diagrams/mermaid/timeline/shared.js +47 -0
  276. package/dist/diagrams/mermaid/timeline/shared.js.map +1 -0
  277. package/dist/diagrams/{timeline → mermaid/timeline}/timeline-columns.d.ts +2 -2
  278. package/dist/diagrams/mermaid/timeline/timeline-columns.d.ts.map +1 -0
  279. package/dist/diagrams/mermaid/timeline/timeline-columns.js +136 -0
  280. package/dist/diagrams/mermaid/timeline/timeline-columns.js.map +1 -0
  281. package/dist/diagrams/{timeline → mermaid/timeline}/vertical-spine.d.ts +2 -2
  282. package/dist/diagrams/mermaid/timeline/vertical-spine.d.ts.map +1 -0
  283. package/dist/diagrams/mermaid/timeline/vertical-spine.js +136 -0
  284. package/dist/diagrams/mermaid/timeline/vertical-spine.js.map +1 -0
  285. package/dist/diagrams/{xychart → mermaid/xychart}/index.d.ts +1 -1
  286. package/dist/diagrams/mermaid/xychart/index.d.ts.map +1 -0
  287. package/dist/diagrams/mermaid/xychart/index.js +14 -0
  288. package/dist/diagrams/mermaid/xychart/index.js.map +1 -0
  289. package/dist/diagrams/{xychart → mermaid/xychart}/ir.d.ts +1 -1
  290. package/dist/diagrams/mermaid/xychart/ir.d.ts.map +1 -0
  291. package/dist/diagrams/mermaid/xychart/ir.js +2 -0
  292. package/dist/diagrams/mermaid/xychart/ir.js.map +1 -0
  293. package/dist/diagrams/{xychart → mermaid/xychart}/layout.d.ts +2 -2
  294. package/dist/diagrams/mermaid/xychart/layout.d.ts.map +1 -0
  295. package/dist/diagrams/mermaid/xychart/layout.js +120 -0
  296. package/dist/diagrams/mermaid/xychart/layout.js.map +1 -0
  297. package/dist/diagrams/{architecture → triton/architecture}/index.d.ts +1 -1
  298. package/dist/diagrams/triton/architecture/index.d.ts.map +1 -0
  299. package/dist/diagrams/triton/architecture/index.js +14 -0
  300. package/dist/diagrams/triton/architecture/index.js.map +1 -0
  301. package/dist/diagrams/{architecture → triton/architecture}/ir.d.ts +1 -1
  302. package/dist/diagrams/triton/architecture/ir.d.ts.map +1 -0
  303. package/dist/diagrams/triton/architecture/ir.js +2 -0
  304. package/dist/diagrams/triton/architecture/ir.js.map +1 -0
  305. package/dist/diagrams/{architecture → triton/architecture}/layout.d.ts +2 -2
  306. package/dist/diagrams/triton/architecture/layout.d.ts.map +1 -0
  307. package/dist/diagrams/triton/architecture/layout.js +124 -0
  308. package/dist/diagrams/triton/architecture/layout.js.map +1 -0
  309. package/dist/diagrams/{block → triton/block}/index.d.ts +1 -1
  310. package/dist/diagrams/triton/block/index.d.ts.map +1 -0
  311. package/dist/diagrams/triton/block/index.js +14 -0
  312. package/dist/diagrams/triton/block/index.js.map +1 -0
  313. package/dist/diagrams/{block → triton/block}/ir.d.ts +1 -1
  314. package/dist/diagrams/triton/block/ir.d.ts.map +1 -0
  315. package/dist/diagrams/triton/block/ir.js +2 -0
  316. package/dist/diagrams/triton/block/ir.js.map +1 -0
  317. package/dist/diagrams/{block → triton/block}/layout.d.ts +2 -2
  318. package/dist/diagrams/triton/block/layout.d.ts.map +1 -0
  319. package/dist/diagrams/triton/block/layout.js +73 -0
  320. package/dist/diagrams/triton/block/layout.js.map +1 -0
  321. package/dist/diagrams/{ds → triton/ds}/graph/graph.d.ts +1 -1
  322. package/dist/diagrams/triton/ds/graph/graph.d.ts.map +1 -0
  323. package/dist/diagrams/triton/ds/graph/graph.js +140 -0
  324. package/dist/diagrams/triton/ds/graph/graph.js.map +1 -0
  325. package/dist/diagrams/{ds → triton/ds}/hashmap/hashmap.d.ts +1 -1
  326. package/dist/diagrams/triton/ds/hashmap/hashmap.d.ts.map +1 -0
  327. package/dist/diagrams/triton/ds/hashmap/hashmap.js +131 -0
  328. package/dist/diagrams/triton/ds/hashmap/hashmap.js.map +1 -0
  329. package/dist/diagrams/{ds → triton/ds}/matrix/matrix.d.ts +1 -1
  330. package/dist/diagrams/triton/ds/matrix/matrix.d.ts.map +1 -0
  331. package/dist/diagrams/triton/ds/matrix/matrix.js +113 -0
  332. package/dist/diagrams/triton/ds/matrix/matrix.js.map +1 -0
  333. package/dist/diagrams/{ds → triton/ds}/queue/cqueue.d.ts +5 -3
  334. package/dist/diagrams/triton/ds/queue/cqueue.d.ts.map +1 -0
  335. package/dist/diagrams/triton/ds/queue/cqueue.js +195 -0
  336. package/dist/diagrams/triton/ds/queue/cqueue.js.map +1 -0
  337. package/dist/diagrams/{ds → triton/ds}/queue/deque.d.ts +3 -1
  338. package/dist/diagrams/triton/ds/queue/deque.d.ts.map +1 -0
  339. package/dist/diagrams/triton/ds/queue/deque.js +118 -0
  340. package/dist/diagrams/triton/ds/queue/deque.js.map +1 -0
  341. package/dist/diagrams/{ds → triton/ds}/queue/pqueue.d.ts +5 -3
  342. package/dist/diagrams/triton/ds/queue/pqueue.d.ts.map +1 -0
  343. package/dist/diagrams/triton/ds/queue/pqueue.js +129 -0
  344. package/dist/diagrams/triton/ds/queue/pqueue.js.map +1 -0
  345. package/dist/diagrams/{ds → triton/ds}/queue/queue.d.ts +3 -1
  346. package/dist/diagrams/triton/ds/queue/queue.d.ts.map +1 -0
  347. package/dist/diagrams/triton/ds/queue/queue.js +128 -0
  348. package/dist/diagrams/triton/ds/queue/queue.js.map +1 -0
  349. package/dist/diagrams/{ds → triton/ds}/queue/shared.d.ts +18 -2
  350. package/dist/diagrams/triton/ds/queue/shared.d.ts.map +1 -0
  351. package/dist/diagrams/triton/ds/queue/shared.js +186 -0
  352. package/dist/diagrams/triton/ds/queue/shared.js.map +1 -0
  353. package/dist/diagrams/{ds → triton/ds}/stack/stack.d.ts +3 -1
  354. package/dist/diagrams/triton/ds/stack/stack.d.ts.map +1 -0
  355. package/dist/diagrams/triton/ds/stack/stack.js +119 -0
  356. package/dist/diagrams/triton/ds/stack/stack.js.map +1 -0
  357. package/dist/diagrams/triton/ds/struct/array.d.ts +52 -0
  358. package/dist/diagrams/triton/ds/struct/array.d.ts.map +1 -0
  359. package/dist/diagrams/triton/ds/struct/array.js +491 -0
  360. package/dist/diagrams/triton/ds/struct/array.js.map +1 -0
  361. package/dist/diagrams/{ds → triton/ds}/struct/linkedlist.d.ts +1 -1
  362. package/dist/diagrams/triton/ds/struct/linkedlist.d.ts.map +1 -0
  363. package/dist/diagrams/triton/ds/struct/linkedlist.js +99 -0
  364. package/dist/diagrams/triton/ds/struct/linkedlist.js.map +1 -0
  365. package/dist/diagrams/{ds → triton/ds}/struct/memory.d.ts +1 -1
  366. package/dist/diagrams/triton/ds/struct/memory.d.ts.map +1 -0
  367. package/dist/diagrams/triton/ds/struct/memory.js +172 -0
  368. package/dist/diagrams/triton/ds/struct/memory.js.map +1 -0
  369. package/dist/diagrams/{ds → triton/ds}/struct/page.d.ts +1 -1
  370. package/dist/diagrams/triton/ds/struct/page.d.ts.map +1 -0
  371. package/dist/diagrams/triton/ds/struct/page.js +137 -0
  372. package/dist/diagrams/triton/ds/struct/page.js.map +1 -0
  373. package/dist/diagrams/triton/ds/struct/shared.d.ts +17 -0
  374. package/dist/diagrams/triton/ds/struct/shared.d.ts.map +1 -0
  375. package/dist/diagrams/triton/ds/struct/shared.js +60 -0
  376. package/dist/diagrams/triton/ds/struct/shared.js.map +1 -0
  377. package/dist/diagrams/{ds → triton/ds}/tree/avl.d.ts +1 -1
  378. package/dist/diagrams/triton/ds/tree/avl.d.ts.map +1 -0
  379. package/dist/diagrams/triton/ds/tree/avl.js +87 -0
  380. package/dist/diagrams/triton/ds/tree/avl.js.map +1 -0
  381. package/dist/diagrams/{ds → triton/ds}/tree/btree.d.ts +1 -1
  382. package/dist/diagrams/triton/ds/tree/btree.d.ts.map +1 -0
  383. package/dist/diagrams/triton/ds/tree/btree.js +76 -0
  384. package/dist/diagrams/triton/ds/tree/btree.js.map +1 -0
  385. package/dist/diagrams/triton/ds/tree/build.d.ts.map +1 -0
  386. package/dist/diagrams/triton/ds/tree/build.js +51 -0
  387. package/dist/diagrams/triton/ds/tree/build.js.map +1 -0
  388. package/dist/diagrams/{ds → triton/ds}/tree/heap.d.ts +1 -1
  389. package/dist/diagrams/triton/ds/tree/heap.d.ts.map +1 -0
  390. package/dist/diagrams/triton/ds/tree/heap.js +48 -0
  391. package/dist/diagrams/triton/ds/tree/heap.js.map +1 -0
  392. package/dist/diagrams/{ds → triton/ds}/tree/index.d.ts +1 -1
  393. package/dist/diagrams/triton/ds/tree/index.d.ts.map +1 -0
  394. package/dist/diagrams/triton/ds/tree/index.js +20 -0
  395. package/dist/diagrams/triton/ds/tree/index.js.map +1 -0
  396. package/dist/diagrams/{ds → triton/ds}/tree/ir.d.ts +1 -1
  397. package/dist/diagrams/triton/ds/tree/ir.d.ts.map +1 -0
  398. package/dist/diagrams/triton/ds/tree/ir.js +10 -0
  399. package/dist/diagrams/triton/ds/tree/ir.js.map +1 -0
  400. package/dist/diagrams/{ds → triton/ds}/tree/layout.d.ts +1 -1
  401. package/dist/diagrams/triton/ds/tree/layout.d.ts.map +1 -0
  402. package/dist/diagrams/triton/ds/tree/layout.js +281 -0
  403. package/dist/diagrams/triton/ds/tree/layout.js.map +1 -0
  404. package/dist/diagrams/{ds → triton/ds}/tree/plan.d.ts +1 -1
  405. package/dist/diagrams/triton/ds/tree/plan.d.ts.map +1 -0
  406. package/dist/diagrams/triton/ds/tree/plan.js +48 -0
  407. package/dist/diagrams/triton/ds/tree/plan.js.map +1 -0
  408. package/dist/diagrams/{ds → triton/ds}/tree/radix.d.ts +1 -1
  409. package/dist/diagrams/triton/ds/tree/radix.d.ts.map +1 -0
  410. package/dist/diagrams/triton/ds/tree/radix.js +88 -0
  411. package/dist/diagrams/triton/ds/tree/radix.js.map +1 -0
  412. package/dist/diagrams/{ds → triton/ds}/tree/rbtree.d.ts +1 -1
  413. package/dist/diagrams/triton/ds/tree/rbtree.d.ts.map +1 -0
  414. package/dist/diagrams/triton/ds/tree/rbtree.js +78 -0
  415. package/dist/diagrams/triton/ds/tree/rbtree.js.map +1 -0
  416. package/dist/diagrams/{ds → triton/ds}/tree/segtree.d.ts +1 -1
  417. package/dist/diagrams/triton/ds/tree/segtree.d.ts.map +1 -0
  418. package/dist/diagrams/triton/ds/tree/segtree.js +51 -0
  419. package/dist/diagrams/triton/ds/tree/segtree.js.map +1 -0
  420. package/dist/diagrams/{ds → triton/ds}/trie/trie.d.ts +1 -1
  421. package/dist/diagrams/triton/ds/trie/trie.d.ts.map +1 -0
  422. package/dist/diagrams/triton/ds/trie/trie.js +58 -0
  423. package/dist/diagrams/triton/ds/trie/trie.js.map +1 -0
  424. package/dist/diagrams/{ds → triton/ds}/unionfind/unionfind.d.ts +1 -1
  425. package/dist/diagrams/triton/ds/unionfind/unionfind.d.ts.map +1 -0
  426. package/dist/diagrams/triton/ds/unionfind/unionfind.js +110 -0
  427. package/dist/diagrams/triton/ds/unionfind/unionfind.js.map +1 -0
  428. package/dist/diagrams/{packet → triton/packet}/index.d.ts +1 -1
  429. package/dist/diagrams/triton/packet/index.d.ts.map +1 -0
  430. package/dist/diagrams/triton/packet/index.js +14 -0
  431. package/dist/diagrams/triton/packet/index.js.map +1 -0
  432. package/dist/diagrams/{packet → triton/packet}/ir.d.ts +1 -1
  433. package/dist/diagrams/triton/packet/ir.d.ts.map +1 -0
  434. package/dist/diagrams/triton/packet/ir.js +2 -0
  435. package/dist/diagrams/triton/packet/ir.js.map +1 -0
  436. package/dist/diagrams/{packet → triton/packet}/layout.d.ts +2 -2
  437. package/dist/diagrams/triton/packet/layout.d.ts.map +1 -0
  438. package/dist/diagrams/triton/packet/layout.js +69 -0
  439. package/dist/diagrams/triton/packet/layout.js.map +1 -0
  440. package/dist/diagrams/{poster → triton/poster}/index.d.ts +1 -1
  441. package/dist/diagrams/triton/poster/index.d.ts.map +1 -0
  442. package/dist/diagrams/triton/poster/index.js +127 -0
  443. package/dist/diagrams/triton/poster/index.js.map +1 -0
  444. package/dist/diagrams/{poster → triton/poster}/ir.d.ts +1 -3
  445. package/dist/diagrams/{poster → triton/poster}/ir.d.ts.map +1 -1
  446. package/dist/diagrams/triton/poster/ir.js +2 -0
  447. package/dist/diagrams/triton/poster/ir.js.map +1 -0
  448. package/dist/diagrams/{poster → triton/poster}/layout.d.ts +2 -2
  449. package/dist/diagrams/triton/poster/layout.d.ts.map +1 -0
  450. package/dist/diagrams/triton/poster/layout.js +517 -0
  451. package/dist/diagrams/triton/poster/layout.js.map +1 -0
  452. package/dist/diagrams/{topology → triton/topology}/topology.d.ts +2 -2
  453. package/dist/diagrams/triton/topology/topology.d.ts.map +1 -0
  454. package/dist/diagrams/triton/topology/topology.js +198 -0
  455. package/dist/diagrams/triton/topology/topology.js.map +1 -0
  456. package/dist/frontend/detect.js +94 -0
  457. package/dist/frontend/detect.js.map +1 -0
  458. package/dist/frontend/index.d.ts +4 -4
  459. package/dist/frontend/index.d.ts.map +1 -1
  460. package/dist/frontend/index.js +196 -0
  461. package/dist/frontend/index.js.map +1 -0
  462. package/dist/frontend/preprocess.d.ts +28 -0
  463. package/dist/frontend/preprocess.d.ts.map +1 -0
  464. package/dist/frontend/preprocess.js +60 -0
  465. package/dist/frontend/preprocess.js.map +1 -0
  466. package/dist/frontend/registry.js +25 -0
  467. package/dist/frontend/registry.js.map +1 -0
  468. package/dist/graph/connect.js +44 -0
  469. package/dist/graph/connect.js.map +1 -0
  470. package/dist/graph/layered.d.ts +65 -5
  471. package/dist/graph/layered.d.ts.map +1 -1
  472. package/dist/graph/layered.js +936 -0
  473. package/dist/graph/layered.js.map +1 -0
  474. package/dist/graph/tree.js +107 -0
  475. package/dist/graph/tree.js.map +1 -0
  476. package/dist/index.js +4691 -2735
  477. package/dist/index.js.map +4 -4
  478. package/dist/overlay/apply.js +22 -0
  479. package/dist/overlay/apply.js.map +1 -0
  480. package/dist/overlay/compiler.js +48 -0
  481. package/dist/overlay/compiler.js.map +1 -0
  482. package/dist/overlay/layout.js +242 -0
  483. package/dist/overlay/layout.js.map +1 -0
  484. package/dist/palette/categorical.js +21 -0
  485. package/dist/palette/categorical.js.map +1 -0
  486. package/dist/render/registry.js +22 -0
  487. package/dist/render/registry.js.map +1 -0
  488. package/dist/render/svg.d.ts.map +1 -1
  489. package/dist/render/svg.js +287 -0
  490. package/dist/render/svg.js.map +1 -0
  491. package/dist/routing/d3-curves.d.ts +31 -0
  492. package/dist/routing/d3-curves.d.ts.map +1 -0
  493. package/dist/routing/d3-curves.js +58 -0
  494. package/dist/routing/d3-curves.js.map +1 -0
  495. package/dist/routing/registry.js +22 -0
  496. package/dist/routing/registry.js.map +1 -0
  497. package/dist/routing/router.d.ts +3 -0
  498. package/dist/routing/router.d.ts.map +1 -1
  499. package/dist/routing/router.js +849 -0
  500. package/dist/routing/router.js.map +1 -0
  501. package/dist/scene/build.d.ts +3 -1
  502. package/dist/scene/build.d.ts.map +1 -1
  503. package/dist/scene/build.js +57 -0
  504. package/dist/scene/build.js.map +1 -0
  505. package/dist/scene/strip.js +46 -0
  506. package/dist/scene/strip.js.map +1 -0
  507. package/dist/style/cost.js +39 -0
  508. package/dist/style/cost.js.map +1 -0
  509. package/dist/text/metrics.js +62 -0
  510. package/dist/text/metrics.js.map +1 -0
  511. package/dist/text/wrap.js +84 -0
  512. package/dist/text/wrap.js.map +1 -0
  513. package/dist/theme/preset.d.ts +2 -0
  514. package/dist/theme/preset.d.ts.map +1 -1
  515. package/dist/theme/preset.js +295 -0
  516. package/dist/theme/preset.js.map +1 -0
  517. package/dist/theme/resolver.js +15 -0
  518. package/dist/theme/resolver.js.map +1 -0
  519. package/dist/time/dates.js +301 -0
  520. package/dist/time/dates.js.map +1 -0
  521. package/dist/util/round.js +17 -0
  522. package/dist/util/round.js.map +1 -0
  523. package/package.json +1 -1
  524. package/dist/diagrams/architecture/index.d.ts.map +0 -1
  525. package/dist/diagrams/architecture/ir.d.ts.map +0 -1
  526. package/dist/diagrams/architecture/layout.d.ts.map +0 -1
  527. package/dist/diagrams/block/index.d.ts.map +0 -1
  528. package/dist/diagrams/block/ir.d.ts.map +0 -1
  529. package/dist/diagrams/block/layout.d.ts.map +0 -1
  530. package/dist/diagrams/c4/index.d.ts.map +0 -1
  531. package/dist/diagrams/c4/ir.d.ts.map +0 -1
  532. package/dist/diagrams/c4/layout.d.ts.map +0 -1
  533. package/dist/diagrams/class/index.d.ts.map +0 -1
  534. package/dist/diagrams/class/ir.d.ts.map +0 -1
  535. package/dist/diagrams/class/layout.d.ts.map +0 -1
  536. package/dist/diagrams/ds/graph/graph.d.ts.map +0 -1
  537. package/dist/diagrams/ds/hashmap/hashmap.d.ts.map +0 -1
  538. package/dist/diagrams/ds/matrix/matrix.d.ts.map +0 -1
  539. package/dist/diagrams/ds/queue/cqueue.d.ts.map +0 -1
  540. package/dist/diagrams/ds/queue/deque.d.ts.map +0 -1
  541. package/dist/diagrams/ds/queue/pqueue.d.ts.map +0 -1
  542. package/dist/diagrams/ds/queue/queue.d.ts.map +0 -1
  543. package/dist/diagrams/ds/queue/shared.d.ts.map +0 -1
  544. package/dist/diagrams/ds/stack/stack.d.ts.map +0 -1
  545. package/dist/diagrams/ds/struct/array.d.ts +0 -28
  546. package/dist/diagrams/ds/struct/array.d.ts.map +0 -1
  547. package/dist/diagrams/ds/struct/linkedlist.d.ts.map +0 -1
  548. package/dist/diagrams/ds/struct/memory.d.ts.map +0 -1
  549. package/dist/diagrams/ds/struct/page.d.ts.map +0 -1
  550. package/dist/diagrams/ds/struct/shared.d.ts +0 -9
  551. package/dist/diagrams/ds/struct/shared.d.ts.map +0 -1
  552. package/dist/diagrams/ds/tree/avl.d.ts.map +0 -1
  553. package/dist/diagrams/ds/tree/btree.d.ts.map +0 -1
  554. package/dist/diagrams/ds/tree/build.d.ts.map +0 -1
  555. package/dist/diagrams/ds/tree/heap.d.ts.map +0 -1
  556. package/dist/diagrams/ds/tree/index.d.ts.map +0 -1
  557. package/dist/diagrams/ds/tree/ir.d.ts.map +0 -1
  558. package/dist/diagrams/ds/tree/layout.d.ts.map +0 -1
  559. package/dist/diagrams/ds/tree/plan.d.ts.map +0 -1
  560. package/dist/diagrams/ds/tree/radix.d.ts.map +0 -1
  561. package/dist/diagrams/ds/tree/rbtree.d.ts.map +0 -1
  562. package/dist/diagrams/ds/tree/segtree.d.ts.map +0 -1
  563. package/dist/diagrams/ds/trie/trie.d.ts.map +0 -1
  564. package/dist/diagrams/ds/unionfind/unionfind.d.ts.map +0 -1
  565. package/dist/diagrams/er/index.d.ts.map +0 -1
  566. package/dist/diagrams/er/ir.d.ts.map +0 -1
  567. package/dist/diagrams/er/layout.d.ts.map +0 -1
  568. package/dist/diagrams/flowchart/index.d.ts.map +0 -1
  569. package/dist/diagrams/flowchart/ir.d.ts.map +0 -1
  570. package/dist/diagrams/flowchart/layout.d.ts +0 -5
  571. package/dist/diagrams/flowchart/layout.d.ts.map +0 -1
  572. package/dist/diagrams/gantt/index.d.ts.map +0 -1
  573. package/dist/diagrams/gantt/ir.d.ts.map +0 -1
  574. package/dist/diagrams/gantt/layout.d.ts.map +0 -1
  575. package/dist/diagrams/gitgraph/index.d.ts.map +0 -1
  576. package/dist/diagrams/gitgraph/ir.d.ts.map +0 -1
  577. package/dist/diagrams/gitgraph/layout.d.ts.map +0 -1
  578. package/dist/diagrams/journey/index.d.ts.map +0 -1
  579. package/dist/diagrams/journey/ir.d.ts.map +0 -1
  580. package/dist/diagrams/journey/layout.d.ts.map +0 -1
  581. package/dist/diagrams/kanban/index.d.ts.map +0 -1
  582. package/dist/diagrams/kanban/ir.d.ts.map +0 -1
  583. package/dist/diagrams/kanban/layout.d.ts.map +0 -1
  584. package/dist/diagrams/mindmap/index.d.ts.map +0 -1
  585. package/dist/diagrams/mindmap/ir.d.ts.map +0 -1
  586. package/dist/diagrams/mindmap/layout.d.ts.map +0 -1
  587. package/dist/diagrams/packet/index.d.ts.map +0 -1
  588. package/dist/diagrams/packet/ir.d.ts.map +0 -1
  589. package/dist/diagrams/packet/layout.d.ts.map +0 -1
  590. package/dist/diagrams/pie/index.d.ts.map +0 -1
  591. package/dist/diagrams/pie/ir.d.ts.map +0 -1
  592. package/dist/diagrams/pie/layout.d.ts.map +0 -1
  593. package/dist/diagrams/poster/index.d.ts.map +0 -1
  594. package/dist/diagrams/poster/layout.d.ts.map +0 -1
  595. package/dist/diagrams/quadrant/index.d.ts.map +0 -1
  596. package/dist/diagrams/quadrant/ir.d.ts.map +0 -1
  597. package/dist/diagrams/quadrant/layout.d.ts.map +0 -1
  598. package/dist/diagrams/radar/index.d.ts.map +0 -1
  599. package/dist/diagrams/radar/ir.d.ts.map +0 -1
  600. package/dist/diagrams/radar/layout.d.ts.map +0 -1
  601. package/dist/diagrams/requirement/index.d.ts.map +0 -1
  602. package/dist/diagrams/requirement/ir.d.ts.map +0 -1
  603. package/dist/diagrams/requirement/layout.d.ts.map +0 -1
  604. package/dist/diagrams/sankey/index.d.ts.map +0 -1
  605. package/dist/diagrams/sankey/ir.d.ts.map +0 -1
  606. package/dist/diagrams/sankey/layout.d.ts.map +0 -1
  607. package/dist/diagrams/sequence/index.d.ts.map +0 -1
  608. package/dist/diagrams/sequence/ir.d.ts.map +0 -1
  609. package/dist/diagrams/sequence/layout.d.ts.map +0 -1
  610. package/dist/diagrams/state/index.d.ts.map +0 -1
  611. package/dist/diagrams/state/ir.d.ts.map +0 -1
  612. package/dist/diagrams/state/layout.d.ts.map +0 -1
  613. package/dist/diagrams/timeline/index.d.ts.map +0 -1
  614. package/dist/diagrams/timeline/ir.d.ts.map +0 -1
  615. package/dist/diagrams/timeline/layout.d.ts +0 -5
  616. package/dist/diagrams/timeline/layout.d.ts.map +0 -1
  617. package/dist/diagrams/timeline/numbered.d.ts.map +0 -1
  618. package/dist/diagrams/timeline/roadmap.d.ts.map +0 -1
  619. package/dist/diagrams/timeline/serpentine.d.ts.map +0 -1
  620. package/dist/diagrams/timeline/shared.d.ts.map +0 -1
  621. package/dist/diagrams/timeline/timeline-columns.d.ts.map +0 -1
  622. package/dist/diagrams/timeline/vertical-spine.d.ts.map +0 -1
  623. package/dist/diagrams/topology/topology.d.ts.map +0 -1
  624. package/dist/diagrams/xychart/index.d.ts.map +0 -1
  625. package/dist/diagrams/xychart/ir.d.ts.map +0 -1
  626. package/dist/diagrams/xychart/layout.d.ts.map +0 -1
  627. /package/dist/diagrams/{ds → triton/ds}/tree/build.d.ts +0 -0
@@ -0,0 +1,936 @@
1
+ /**
2
+ * @file graph/layered.ts — Sugiyama layered graph placement kernel.
3
+ *
4
+ * Implements the full Sugiyama framework, with Phase 3 and Phase 4 ported
5
+ * faithfully from dagre (https://github.com/dagrejs/dagre):
6
+ * 1. Longest-path layer assignment
7
+ * 2a. DFS back-edge detection (proper cycle identification)
8
+ * 2b. Dummy node insertion for skip edges (spans > 1 layer)
9
+ * 3. Dagre-faithful crossing minimisation — DFS initOrder, bi-directional
10
+ * barycenter sweeps with biasRight, dagre's sort() with unsortable-node
11
+ * interleaving, BIT-based cross-count feedback loop; keeps best ordering seen
12
+ * 4. Dagre-faithful Brandes–Köpf coordinate assignment — type-1 conflict
13
+ * detection, vertical alignment with NO isDummy guard (real↔dummy blocks),
14
+ * horizontal compaction (block graph, two-pass), 4 sweep directions,
15
+ * smallest-width selection, balance; plus our obstacle-aware dummy snap
16
+ * 5. Dummy node removal + bend point extraction (edgeBends on LayeredResult)
17
+ *
18
+ * Shared by the node-link / UML diagram layouts (class, state, er, c4,
19
+ * architecture, requirement, ds) so they all inherit crossing minimisation
20
+ * and improved coordinate assignment automatically. Edge routing is left to
21
+ * callers (they connect the returned boxes via the routing module).
22
+ *
23
+ * Deterministic: stable insertion order within a layer, no clock, no randomness.
24
+ * Termination guaranteed: crossing-min loop exits after 4 non-improving sweeps.
25
+ */
26
+ import { orthogonalRouter } from '../routing/router.js';
27
+ import { borderPoint } from './connect.js';
28
+ function makeDummy(edgeIdx, segIdx) {
29
+ return { id: `__dummy_${edgeIdx}_${segIdx}`, width: 0, height: 0, isDummy: true, originalEdgeIndex: edgeIdx, segmentIndex: segIdx };
30
+ }
31
+ // ─── Phase 1: Layer Assignment ────────────────────────────────────────────────
32
+ /** Assign each node a layer via longest-path; cycles are broken by a pass cap. */
33
+ function assignLayers(nodes, edges) {
34
+ const layer = new Map();
35
+ for (const n of nodes)
36
+ layer.set(n.id, 0);
37
+ const present = (id) => layer.has(id);
38
+ // Relax edges up to N passes (caps cycles).
39
+ for (let pass = 0; pass < nodes.length; pass++) {
40
+ let changed = false;
41
+ for (const e of edges) {
42
+ if (!present(e.from) || !present(e.to))
43
+ continue;
44
+ const want = layer.get(e.from) + 1;
45
+ if (layer.get(e.to) < want) {
46
+ layer.set(e.to, want);
47
+ changed = true;
48
+ }
49
+ }
50
+ if (!changed)
51
+ break;
52
+ }
53
+ return layer;
54
+ }
55
+ // ─── Phase 2a: DFS Back-Edge Detection ───────────────────────────────────────
56
+ /**
57
+ * Identify back-edges using DFS: an edge u→v is a back-edge when v is already
58
+ * on the DFS stack (i.e. v is an ancestor of u). This correctly handles cycles
59
+ * regardless of layer assignment, and correctly classifies self-loops (u→u).
60
+ *
61
+ * Uses an iterative DFS to avoid call-stack overflow on deep graphs.
62
+ * Returns a set of indices into `edges`.
63
+ */
64
+ function detectBackEdges(nodes, edges) {
65
+ // Build adjacency list: node id → [{to, edgeIdx}]
66
+ const adj = new Map();
67
+ for (const n of nodes)
68
+ adj.set(n.id, []);
69
+ edges.forEach((e, i) => {
70
+ const list = adj.get(e.from);
71
+ if (list)
72
+ list.push({ to: e.to, edgeIdx: i });
73
+ });
74
+ const visited = new Set();
75
+ const onStack = new Set();
76
+ const backEdges = new Set();
77
+ for (const startNode of nodes) {
78
+ if (visited.has(startNode.id))
79
+ continue;
80
+ // Iterative DFS: each stack frame tracks [nodeId, neighborIndex].
81
+ const stack = [];
82
+ visited.add(startNode.id);
83
+ onStack.add(startNode.id);
84
+ stack.push({ id: startNode.id, adjIdx: 0 });
85
+ while (stack.length > 0) {
86
+ const frame = stack[stack.length - 1];
87
+ const neighbors = adj.get(frame.id) ?? [];
88
+ if (frame.adjIdx >= neighbors.length) {
89
+ onStack.delete(frame.id);
90
+ stack.pop();
91
+ }
92
+ else {
93
+ const { to, edgeIdx } = neighbors[frame.adjIdx];
94
+ frame.adjIdx++;
95
+ if (onStack.has(to)) {
96
+ backEdges.add(edgeIdx); // back edge (cycle or self-loop)
97
+ }
98
+ else if (!visited.has(to)) {
99
+ visited.add(to);
100
+ onStack.add(to);
101
+ stack.push({ id: to, adjIdx: 0 });
102
+ }
103
+ }
104
+ }
105
+ }
106
+ return backEdges;
107
+ }
108
+ // ─── Phase 2b: Dummy Node Insertion ──────────────────────────────────────────
109
+ /**
110
+ * For every forward edge u→v spanning more than 1 layer, replace it with a
111
+ * chain of virtual edges through dummy nodes inserted at each intermediate layer.
112
+ *
113
+ * Back edges are kept as-is (they are not expanded).
114
+ *
115
+ * Returns:
116
+ * - newNodes: original nodes + all dummy nodes
117
+ * - newEdges: replacement edge array (back edges preserved, skip edges replaced
118
+ * by chains of adjacent-layer segment edges)
119
+ * - newBackEdgeSet: back-edge indices in the newEdges array
120
+ * - dummyChains: original edge index → ordered list of dummy node ids
121
+ *
122
+ * The caller-supplied `layer` Map is mutated to include dummy node layer entries.
123
+ */
124
+ function insertDummyNodes(nodes, edges, layer, backEdgeSet) {
125
+ const newNodes = [...nodes];
126
+ const newEdges = [];
127
+ const newBackEdgeSet = new Set();
128
+ const dummyChains = new Map();
129
+ for (let i = 0; i < edges.length; i++) {
130
+ const e = edges[i];
131
+ if (backEdgeSet.has(i)) {
132
+ // Keep back edges as-is, recording new index.
133
+ newBackEdgeSet.add(newEdges.length);
134
+ newEdges.push(e);
135
+ continue;
136
+ }
137
+ const lu = layer.get(e.from) ?? 0;
138
+ const lv = layer.get(e.to) ?? 0;
139
+ const span = lv - lu;
140
+ if (span <= 1) {
141
+ // Adjacent-layer or same-layer forward edge: no expansion needed.
142
+ newEdges.push(e);
143
+ continue;
144
+ }
145
+ // Skip edge: create (span-1) dummy nodes at layers lu+1 … lv-1.
146
+ const dummies = [];
147
+ for (let seg = 0; seg < span - 1; seg++) {
148
+ const d = makeDummy(i, seg);
149
+ newNodes.push(d);
150
+ layer.set(d.id, lu + 1 + seg);
151
+ dummies.push(d.id);
152
+ }
153
+ dummyChains.set(i, dummies);
154
+ // Replace original edge with a chain: u → d0 → d1 → … → v
155
+ const chain = [e.from, ...dummies, e.to];
156
+ for (let s = 0; s < chain.length - 1; s++) {
157
+ newEdges.push({ from: chain[s], to: chain[s + 1] });
158
+ }
159
+ }
160
+ return { newNodes, newEdges, newBackEdgeSet, dummyChains };
161
+ }
162
+ // ─── Phase 3 Helper: BIT-Based Crossing Count ────────────────────────────────
163
+ /**
164
+ * Count weighted edge crossings across all adjacent layer pairs.
165
+ * Uses the O(E log N) BIT algorithm from Barth et al., "Bilayer Cross Counting."
166
+ * All edge weights are uniform (1). Back-edges and self-loops are excluded.
167
+ */
168
+ function crossCount(byLayer, edges, backEdgeSet) {
169
+ const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);
170
+ const succList = new Map();
171
+ for (const [, ns] of byLayer)
172
+ for (const n of ns)
173
+ succList.set(n.id, []);
174
+ edges.forEach((e, i) => {
175
+ if (backEdgeSet.has(i) || e.from === e.to)
176
+ return;
177
+ succList.get(e.from)?.push(e.to);
178
+ });
179
+ let cc = 0;
180
+ for (let i = 1; i < layerKeys.length; i++) {
181
+ cc += bilayerCrossCount(byLayer.get(layerKeys[i - 1]), byLayer.get(layerKeys[i]), succList);
182
+ }
183
+ return cc;
184
+ }
185
+ function bilayerCrossCount(northLayer, southLayer, succList) {
186
+ if (southLayer.length === 0)
187
+ return 0;
188
+ const southPos = new Map();
189
+ southLayer.forEach((n, i) => southPos.set(n.id, i));
190
+ const positions = northLayer.flatMap(n => (succList.get(n.id) ?? [])
191
+ .filter(sid => southPos.has(sid))
192
+ .map(sid => southPos.get(sid))
193
+ .sort((a, b) => a - b));
194
+ if (positions.length === 0)
195
+ return 0;
196
+ let firstIndex = 1;
197
+ while (firstIndex < southLayer.length)
198
+ firstIndex <<= 1;
199
+ const treeSize = 2 * firstIndex - 1;
200
+ firstIndex -= 1;
201
+ const tree = new Array(treeSize).fill(0);
202
+ let cc = 0;
203
+ for (const pos of positions) {
204
+ let idx = pos + firstIndex;
205
+ tree[idx] = (tree[idx] ?? 0) + 1;
206
+ let weightSum = 0;
207
+ while (idx > 0) {
208
+ if (idx % 2 === 1)
209
+ weightSum += tree[idx + 1];
210
+ idx = (idx - 1) >> 1;
211
+ tree[idx] = (tree[idx] ?? 0) + 1;
212
+ }
213
+ cc += weightSum;
214
+ }
215
+ return cc;
216
+ }
217
+ // ─── Phase 3: Barycentric Crossing Minimisation ───────────────────────────────
218
+ /**
219
+ * Reorder nodes within each layer to reduce edge crossings (Sugiyama Phase 3).
220
+ * Uses the barycentric heuristic with bi-directional sweeps.
221
+ *
222
+ * - Back-edges and self-loops are excluded from barycenter computation.
223
+ * - Nodes without neighbours in the reference layer keep their current relative
224
+ * order (their current position index is used as the barycenter).
225
+ * - Tie-breaking uses the original insertion index — deterministic and stable.
226
+ * - Sweeps continue until no strict improvement for 4 consecutive passes
227
+ * (measured via BIT-based cross-count); best ordering is returned.
228
+ */
229
+ /**
230
+ * Port of dagre's order() — barycentric crossing minimisation.
231
+ *
232
+ * Uses DFS-based initOrder (from dagre's init-order.ts) then bi-directional
233
+ * barycenter sweeps with dagre's sort logic: nodes without neighbours in the
234
+ * reference layer ("unsortable") are re-inserted at their original index rather
235
+ * than being sorted with an arbitrary barycenter value.
236
+ */
237
+ function minimizeCrossings(byLayer, edges, backEdgeSet) {
238
+ const predIds = new Map();
239
+ const succIds = new Map();
240
+ for (const [, ns] of byLayer) {
241
+ for (const n of ns) {
242
+ predIds.set(n.id, []);
243
+ succIds.set(n.id, []);
244
+ }
245
+ }
246
+ edges.forEach((e, i) => {
247
+ if (backEdgeSet.has(i) || e.from === e.to)
248
+ return;
249
+ predIds.get(e.to)?.push(e.from);
250
+ succIds.get(e.from)?.push(e.to);
251
+ });
252
+ const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);
253
+ const nodeById2 = new Map();
254
+ const nodeLayer2 = new Map();
255
+ for (const [lk, ns] of byLayer)
256
+ for (const n of ns) {
257
+ nodeById2.set(n.id, n);
258
+ nodeLayer2.set(n.id, lk);
259
+ }
260
+ // initOrder: DFS-based initial ordering (port of dagre's init-order.ts).
261
+ // Nodes visited first via DFS end up earlier in their layer, correlating
262
+ // initial order with edge directions and reducing starting crossings.
263
+ function initOrder() {
264
+ const visited = new Set();
265
+ const layers = new Map();
266
+ for (const k of layerKeys)
267
+ layers.set(k, []);
268
+ function dfs(v) {
269
+ if (visited.has(v))
270
+ return;
271
+ visited.add(v);
272
+ const lk = nodeLayer2.get(v);
273
+ if (lk !== undefined)
274
+ layers.get(lk)?.push(nodeById2.get(v));
275
+ for (const w of (succIds.get(v) ?? []))
276
+ dfs(w);
277
+ }
278
+ // Visit all nodes sorted by layer (ascending) so DFS starts from roots first.
279
+ const allNodes = [...nodeById2.keys()].sort((a, b) => (nodeLayer2.get(a) ?? 0) - (nodeLayer2.get(b) ?? 0));
280
+ for (const v of allNodes)
281
+ dfs(v);
282
+ return layers;
283
+ }
284
+ const order = initOrder();
285
+ const posInLayer = new Map();
286
+ function rebuildPos() {
287
+ for (const [, ns] of order)
288
+ ns.forEach((n, i) => posInLayer.set(n.id, i));
289
+ }
290
+ rebuildPos();
291
+ // Port of dagre's sort() — separates sortable (have barycenter) from unsortable
292
+ // (no neighbours) entries, then interleaves unsortable nodes at their original
293
+ // positions rather than lumping them at arbitrary barycenters.
294
+ function sortLayer(layerIdx, neighborMap, biasRight) {
295
+ const curr = order.get(layerIdx);
296
+ const entries = curr.map((node, origIdx) => {
297
+ const nbrs = (neighborMap.get(node.id) ?? []).filter(w => posInLayer.has(w));
298
+ if (nbrs.length === 0)
299
+ return { node, barycenter: undefined, origIdx };
300
+ const sum = nbrs.reduce((s, nid) => s + posInLayer.get(nid), 0);
301
+ return { node, barycenter: sum / nbrs.length, origIdx };
302
+ });
303
+ const sortable = entries.filter(e => e.barycenter !== undefined);
304
+ const unsortable = entries
305
+ .filter(e => e.barycenter === undefined)
306
+ .sort((a, b) => b.origIdx - a.origIdx); // descending → pop from end gives ascending
307
+ sortable.sort((a, b) => {
308
+ if (a.barycenter !== b.barycenter)
309
+ return a.barycenter - b.barycenter;
310
+ return biasRight ? b.origIdx - a.origIdx : a.origIdx - b.origIdx;
311
+ });
312
+ const result = [];
313
+ let vsIndex = 0;
314
+ // Re-insert unsortable nodes at their original position indices (dagre's consumeUnsortable).
315
+ function consumeUnsortable() {
316
+ while (unsortable.length && unsortable[unsortable.length - 1].origIdx <= vsIndex) {
317
+ result.push(unsortable.pop().node);
318
+ vsIndex++;
319
+ }
320
+ }
321
+ consumeUnsortable();
322
+ for (const entry of sortable) {
323
+ result.push(entry.node);
324
+ vsIndex++;
325
+ consumeUnsortable();
326
+ }
327
+ order.set(layerIdx, result);
328
+ rebuildPos();
329
+ }
330
+ let bestCC = crossCount(order, edges, backEdgeSet);
331
+ const best = new Map();
332
+ for (const [k, v] of order)
333
+ best.set(k, [...v]);
334
+ for (let pass = 0, lastBest = 0; lastBest < 4; pass++, lastBest++) {
335
+ const biasRight = pass % 4 >= 2;
336
+ if (pass % 2 === 0) {
337
+ // Down sweep: fix each layer using its predecessors.
338
+ for (let li = 1; li < layerKeys.length; li++)
339
+ sortLayer(layerKeys[li], predIds, biasRight);
340
+ }
341
+ else {
342
+ // Up sweep: fix each layer using its successors.
343
+ for (let li = layerKeys.length - 2; li >= 0; li--)
344
+ sortLayer(layerKeys[li], succIds, biasRight);
345
+ }
346
+ const cc = crossCount(order, edges, backEdgeSet);
347
+ if (cc < bestCC) {
348
+ lastBest = 0;
349
+ bestCC = cc;
350
+ for (const [k, v] of order)
351
+ best.set(k, [...v]);
352
+ }
353
+ else if (cc === bestCC) {
354
+ for (const [k, v] of order)
355
+ best.set(k, [...v]);
356
+ }
357
+ }
358
+ return best;
359
+ }
360
+ // ─── Phase 4: Full Brandes–Köpf Coordinate Assignment ────────────────────────
361
+ /**
362
+ * Assign cross-axis positions using the full Brandes–Köpf algorithm adapted for
363
+ * Triton's data structures (Map<number, GraphNode[]>, no Graph object).
364
+ *
365
+ * Steps: (1) type-1 conflict detection, (2) vertical alignment (block chains),
366
+ * (3) horizontal compaction (block graph, two-pass min then compact) — run for
367
+ * 4 sweep directions (ul, ur, dl, dr). Then (4) pick tightest layout, (5) align
368
+ * all 4 to share its min/max, (6) balance each node as median of 4 aligned values.
369
+ */
370
+ function assignCoordinatesBK4(byLayer, edges, backEdgeSet, isLR, nodeGap, layerGap, margin) {
371
+ const cross = (n) => isLR ? n.height : n.width;
372
+ const along = (n) => isLR ? n.width : n.height;
373
+ const isDummy = (id) => id.startsWith('__dummy_');
374
+ const nodeById = new Map();
375
+ for (const [, ns] of byLayer)
376
+ for (const n of ns)
377
+ nodeById.set(n.id, n);
378
+ // Minimum centre-to-centre separation between adjacent nodes in a layer.
379
+ // Zero-width dummy nodes are invisible waypoints; they impose no gap on
380
+ // neighbouring real nodes so that real nodes can align freely.
381
+ function sep(a, b) {
382
+ if (isDummy(a) || isDummy(b))
383
+ return 0;
384
+ const an = nodeById.get(a);
385
+ const bn = nodeById.get(b);
386
+ return cross(an) / 2 + nodeGap + cross(bn) / 2;
387
+ }
388
+ const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);
389
+ const numLayers = layerKeys.length;
390
+ const baseLayers = layerKeys.map(lk => byLayer.get(lk).map(n => n.id));
391
+ // Map each node id → its layer position index (0-based).
392
+ const nodeLayerIdx = new Map();
393
+ for (let li = 0; li < numLayers; li++) {
394
+ for (const id of baseLayers[li])
395
+ nodeLayerIdx.set(id, li);
396
+ }
397
+ const predMap = new Map();
398
+ const succMap = new Map();
399
+ for (const [, ns] of byLayer)
400
+ for (const n of ns) {
401
+ predMap.set(n.id, []);
402
+ succMap.set(n.id, []);
403
+ }
404
+ edges.forEach((e, i) => {
405
+ if (backEdgeSet.has(i) || e.from === e.to)
406
+ return;
407
+ predMap.get(e.to)?.push(e.from);
408
+ succMap.get(e.from)?.push(e.to);
409
+ });
410
+ // ── BK Step 1: Type-1 Conflict Detection ─────────────────────────────────────
411
+ // A type-1 conflict: a non-inner edge crosses an inner segment (dummy→dummy).
412
+ const conflicts = new Set();
413
+ const ck = (u, v) => u < v ? `${u}\0${v}` : `${v}\0${u}`;
414
+ const addConflict = (u, v) => conflicts.add(ck(u, v));
415
+ const hasConflict = (u, v) => conflicts.has(ck(u, v));
416
+ for (let li = 1; li < numLayers; li++) {
417
+ const prevLayer = baseLayers[li - 1];
418
+ const layer = baseLayers[li];
419
+ const prevPos = new Map();
420
+ prevLayer.forEach((id, i) => prevPos.set(id, i));
421
+ let k0 = 0;
422
+ let scanPos = 0;
423
+ const lastNode = layer[layer.length - 1];
424
+ layer.forEach((v, i) => {
425
+ let innerPredPos;
426
+ if (isDummy(v)) {
427
+ for (const u of (predMap.get(v) ?? [])) {
428
+ if (isDummy(u) && prevPos.has(u)) {
429
+ innerPredPos = prevPos.get(u);
430
+ break;
431
+ }
432
+ }
433
+ }
434
+ const k1 = innerPredPos !== undefined ? innerPredPos : prevLayer.length;
435
+ if (innerPredPos !== undefined || v === lastNode) {
436
+ for (let si = scanPos; si <= i; si++) {
437
+ const sn = layer[si];
438
+ for (const u of (predMap.get(sn) ?? [])) {
439
+ if (!prevPos.has(u))
440
+ continue;
441
+ const uPos = prevPos.get(u);
442
+ if ((uPos < k0 || uPos > k1) && !(isDummy(u) && isDummy(sn))) {
443
+ addConflict(u, sn);
444
+ }
445
+ }
446
+ }
447
+ scanPos = i + 1;
448
+ k0 = k1;
449
+ }
450
+ });
451
+ }
452
+ // ── BK Step 2: Vertical Alignment ────────────────────────────────────────────
453
+ // ── BK Step 2: Vertical Alignment (port of dagre's bk.ts verticalAlignment) ──
454
+ // Dagre has NO isDummy guard here — real↔dummy alignment is intentional:
455
+ // it forms the block chains that make skip-edge segments travel in straight lines.
456
+ function verticalAlignment(sweepLayers, neighborFn) {
457
+ const root = new Map();
458
+ const align = new Map();
459
+ const pos = new Map();
460
+ for (const layer of sweepLayers) {
461
+ layer.forEach((v, i) => { root.set(v, v); align.set(v, v); pos.set(v, i); });
462
+ }
463
+ for (const layer of sweepLayers) {
464
+ let prevIdx = -1;
465
+ for (const v of layer) {
466
+ // All nodes participate — dummies form blocks with real nodes to straighten skip edges.
467
+ const wsRaw = neighborFn(v);
468
+ if (!wsRaw.length)
469
+ continue;
470
+ const ws = wsRaw.filter(w => pos.has(w)).sort((a, b) => pos.get(a) - pos.get(b));
471
+ if (ws.length === 0)
472
+ continue;
473
+ const mp = (ws.length - 1) / 2;
474
+ for (let mi = Math.floor(mp), mEnd = Math.ceil(mp); mi <= mEnd; mi++) {
475
+ const w = ws[mi];
476
+ const wPos = pos.get(w);
477
+ if (align.get(v) === v && prevIdx < wPos && !hasConflict(v, w)) {
478
+ align.set(w, v);
479
+ root.set(v, root.get(w));
480
+ align.set(v, root.get(v));
481
+ prevIdx = wPos;
482
+ }
483
+ }
484
+ }
485
+ }
486
+ return { root, align };
487
+ }
488
+ // ── BK Step 3: Horizontal Compaction ─────────────────────────────────────────
489
+ function horizontalCompaction(sweepLayers, root) {
490
+ const blockSucc = new Map();
491
+ const blockPred = new Map();
492
+ function ensureBlock(r) {
493
+ if (!blockSucc.has(r)) {
494
+ blockSucc.set(r, new Map());
495
+ blockPred.set(r, new Map());
496
+ }
497
+ }
498
+ for (const layer of sweepLayers) {
499
+ let prevId;
500
+ for (const v of layer) {
501
+ const rv = root.get(v);
502
+ ensureBlock(rv);
503
+ if (prevId !== undefined) {
504
+ const rp = root.get(prevId);
505
+ if (rp !== rv) {
506
+ const w = sep(prevId, v);
507
+ const curW = blockSucc.get(rp).get(rv) ?? 0;
508
+ if (w > curW) {
509
+ blockSucc.get(rp).set(rv, w);
510
+ blockPred.get(rv).set(rp, w);
511
+ }
512
+ }
513
+ }
514
+ prevId = v;
515
+ }
516
+ }
517
+ const xs = new Map();
518
+ function iterate(applyFn, nextFn) {
519
+ const stack = [...blockSucc.keys()];
520
+ const visited = new Set();
521
+ while (stack.length > 0) {
522
+ const elem = stack[stack.length - 1];
523
+ if (visited.has(elem)) {
524
+ stack.pop();
525
+ applyFn(elem);
526
+ }
527
+ else {
528
+ visited.add(elem);
529
+ for (const nxt of nextFn(elem))
530
+ stack.push(nxt);
531
+ }
532
+ }
533
+ }
534
+ // Pass 1: assign minimum coordinates.
535
+ iterate(elem => {
536
+ let max = 0;
537
+ for (const [from, w] of (blockPred.get(elem) ?? new Map()))
538
+ max = Math.max(max, (xs.get(from) ?? 0) + w);
539
+ xs.set(elem, max);
540
+ }, elem => blockPred.get(elem)?.keys() ?? []);
541
+ // Pass 2: compact rightward (remove slack).
542
+ iterate(elem => {
543
+ const succs = blockSucc.get(elem);
544
+ if (succs && succs.size > 0) {
545
+ let min = Infinity;
546
+ for (const [to, w] of succs)
547
+ min = Math.min(min, (xs.get(to) ?? 0) - w);
548
+ if (min !== Infinity)
549
+ xs.set(elem, Math.max(xs.get(elem) ?? 0, min));
550
+ }
551
+ }, elem => blockSucc.get(elem)?.keys() ?? []);
552
+ // Propagate block-root coordinates to all member nodes.
553
+ for (const layer of sweepLayers) {
554
+ for (const v of layer)
555
+ xs.set(v, xs.get(root.get(v)));
556
+ }
557
+ return xs;
558
+ }
559
+ // ── BK Step 4: Run 4 independent sweeps ──────────────────────────────────────
560
+ const xss = new Map();
561
+ for (const vert of ['u', 'd']) {
562
+ const vertLayers = vert === 'u' ? baseLayers : [...baseLayers].reverse();
563
+ for (const horiz of ['l', 'r']) {
564
+ const sweepLayers = horiz === 'r'
565
+ ? vertLayers.map(layer => [...layer].reverse())
566
+ : vertLayers;
567
+ const neighborFn = vert === 'u'
568
+ ? (v) => predMap.get(v) ?? []
569
+ : (v) => succMap.get(v) ?? [];
570
+ const { root } = verticalAlignment(sweepLayers, neighborFn);
571
+ let xs = horizontalCompaction(sweepLayers, root);
572
+ if (horiz === 'r') {
573
+ // RL compaction works in a reversed coordinate space; negate to restore.
574
+ const neg = new Map();
575
+ for (const [k, v] of xs)
576
+ neg.set(k, -v);
577
+ xs = neg;
578
+ }
579
+ xss.set(vert + horiz, xs);
580
+ }
581
+ }
582
+ // Capture pre-balance x values for every dummy node across the 4 sweeps.
583
+ // Sweep key order: ul=0, ur=1, dl=2, dr=3.
584
+ const SWEEP_KEYS = ['ul', 'ur', 'dl', 'dr'];
585
+ const dummySweepXs = new Map();
586
+ for (const id of nodeById.keys()) {
587
+ if (!isDummy(id))
588
+ continue;
589
+ const vals = SWEEP_KEYS.map(k => xss.get(k)?.get(id) ?? 0);
590
+ dummySweepXs.set(id, vals);
591
+ }
592
+ // ── BK Step 5: Find smallest-width alignment ──────────────────────────────────
593
+ let minSpan = Infinity;
594
+ let smallestXs = xss.get('ul');
595
+ for (const [, xs] of xss) {
596
+ let lo = Infinity, hi = -Infinity;
597
+ for (const [id, x] of xs) {
598
+ const n = nodeById.get(id);
599
+ if (!n)
600
+ continue;
601
+ const half = cross(n) / 2;
602
+ lo = Math.min(lo, x - half);
603
+ hi = Math.max(hi, x + half);
604
+ }
605
+ if (hi - lo < minSpan) {
606
+ minSpan = hi - lo;
607
+ smallestXs = xs;
608
+ }
609
+ }
610
+ // ── BK Step 6: Align all 4 layouts to the smallest-width one ─────────────────
611
+ const refVals = [...smallestXs.values()];
612
+ const refMin = Math.min(...refVals);
613
+ const refMax = Math.max(...refVals);
614
+ for (const [key, xs] of xss) {
615
+ if (xs === smallestXs)
616
+ continue;
617
+ const vals = [...xs.values()];
618
+ const isRight = key.endsWith('r');
619
+ const delta = isRight
620
+ ? refMax - Math.max(...vals)
621
+ : refMin - Math.min(...vals);
622
+ if (delta !== 0) {
623
+ const shifted = new Map();
624
+ for (const [id, x] of xs)
625
+ shifted.set(id, x + delta);
626
+ xss.set(key, shifted);
627
+ }
628
+ }
629
+ // ── BK Step 7: Balance — per-node median of the 4 aligned values ─────────────
630
+ const balanced = new Map();
631
+ for (const [id] of xss.get('ul')) {
632
+ const vals = ([...xss.values()].map(xs => xs.get(id) ?? 0)).sort((a, b) => a - b);
633
+ balanced.set(id, ((vals[1] ?? 0) + (vals[2] ?? 0)) / 2);
634
+ }
635
+ // ── Column snap: align directly-connected adjacent-layer node chains ─────────
636
+ // Build chains (union-find) over direct edges between adjacent layers where the
637
+ // BK misalignment is small. Then snap each chain to the median balanced x of its
638
+ // members. Running per-edge would cause double-snap interference on multi-node
639
+ // chains (e.g. A→B and B→C would shift B twice with different partners).
640
+ const COLUMN_SNAP_EPSILON = 6; // px — only snap if misalignment is smaller than this
641
+ const csParent = new Map();
642
+ const csFind = (id) => {
643
+ let r = csParent.get(id) ?? id;
644
+ while (csParent.get(r) !== undefined && csParent.get(r) !== r)
645
+ r = csParent.get(r);
646
+ csParent.set(id, r);
647
+ return r;
648
+ };
649
+ const csUnion = (a, b) => {
650
+ const ra = csFind(a), rb = csFind(b);
651
+ if (ra !== rb)
652
+ csParent.set(ra, rb);
653
+ };
654
+ edges.forEach((edge, i) => {
655
+ if (backEdgeSet.has(i) || edge.from === edge.to)
656
+ return;
657
+ if (isDummy(edge.from) || isDummy(edge.to))
658
+ return;
659
+ const fromLayer = nodeLayerIdx.get(edge.from);
660
+ const toLayer = nodeLayerIdx.get(edge.to);
661
+ if (fromLayer === undefined || toLayer === undefined)
662
+ return;
663
+ if (Math.abs(toLayer - fromLayer) !== 1)
664
+ return;
665
+ const fromX = balanced.get(edge.from);
666
+ const toX = balanced.get(edge.to);
667
+ if (fromX === undefined || toX === undefined)
668
+ return;
669
+ if (Math.abs(fromX - toX) > COLUMN_SNAP_EPSILON)
670
+ return;
671
+ csUnion(edge.from, edge.to);
672
+ });
673
+ // Group chain members and snap each chain to its median balanced x.
674
+ const csGroups = new Map();
675
+ for (const id of balanced.keys()) {
676
+ if (isDummy(id))
677
+ continue;
678
+ const root = csFind(id);
679
+ if (!csGroups.has(root))
680
+ csGroups.set(root, []);
681
+ csGroups.get(root).push(id);
682
+ }
683
+ for (const members of csGroups.values()) {
684
+ if (members.length < 2)
685
+ continue;
686
+ const xs = members.map(id => balanced.get(id)).sort((a, b) => a - b);
687
+ const medX = xs.length % 2 === 1
688
+ ? xs[Math.floor(xs.length / 2)]
689
+ : (xs[xs.length / 2 - 1] + xs[xs.length / 2]) / 2;
690
+ for (const id of members)
691
+ balanced.set(id, medX);
692
+ }
693
+ // Shift so the leftmost node's left edge sits at `margin`.
694
+ let minLeft = Infinity;
695
+ for (const [id, cx] of balanced) {
696
+ const n = nodeById.get(id);
697
+ if (n)
698
+ minLeft = Math.min(minLeft, cx - cross(n) / 2);
699
+ }
700
+ const shift = margin - (isFinite(minLeft) ? minLeft : 0);
701
+ // ── Build NodeBox results ─────────────────────────────────────────────────────
702
+ const nodePos = new Map();
703
+ let alongCursor = margin;
704
+ for (let li = 0; li < numLayers; li++) {
705
+ const layerIdx = layerKeys[li];
706
+ const ns = byLayer.get(layerIdx);
707
+ const layerSize = ns.length > 0 ? Math.max(...ns.map(along)) : 0;
708
+ for (const node of ns) {
709
+ const cx = (balanced.get(node.id) ?? 0) + shift;
710
+ const crossLeft = cx - cross(node) / 2;
711
+ const alongPos = (isDummy(node.id) && li > 0)
712
+ ? alongCursor - layerGap / 2
713
+ : alongCursor + (layerSize - along(node)) / 2;
714
+ nodePos.set(node.id, {
715
+ id: node.id,
716
+ x: isLR ? alongPos : crossLeft,
717
+ y: isLR ? crossLeft : alongPos,
718
+ width: node.width,
719
+ height: node.height,
720
+ });
721
+ }
722
+ alongCursor += layerSize + layerGap;
723
+ }
724
+ return { boxes: nodePos, dummySweepXs };
725
+ }
726
+ // ─── Public Entry ─────────────────────────────────────────────────────────────
727
+ export function layeredLayout(nodes, edges, options = {}) {
728
+ const direction = options.direction ?? 'TB';
729
+ const layerGap = options.layerGap ?? 70;
730
+ const nodeGap = options.nodeGap ?? 40;
731
+ const margin = options.margin ?? 32;
732
+ const isLR = direction === 'LR';
733
+ if (nodes.length === 0)
734
+ return { boxes: new Map(), width: margin * 2, height: margin * 2, edgeBends: new Map(), dummySweepXs: new Map(), dummyChainIds: new Map() };
735
+ // Phase 1: Layer assignment.
736
+ const layer = assignLayers(nodes, edges);
737
+ // Phase 2a: Back-edge detection (DFS).
738
+ const backEdges = detectBackEdges(nodes, edges);
739
+ // Phase 2b: Dummy node insertion for skip edges (spans > 1 layer).
740
+ // `layer` is mutated to include dummy node layer assignments.
741
+ const { newNodes, newEdges, newBackEdgeSet, dummyChains } = insertDummyNodes(nodes, edges, layer, backEdges);
742
+ // Rebuild byLayer with all nodes (real + dummy).
743
+ const newMaxLayer = Math.max(...newNodes.map(n => layer.get(n.id)));
744
+ const byLayerArr = new Map();
745
+ for (let i = 0; i <= newMaxLayer; i++)
746
+ byLayerArr.set(i, []);
747
+ for (const n of newNodes)
748
+ byLayerArr.get(layer.get(n.id)).push(n);
749
+ // Phase 3: Crossing minimisation (barycentric, bi-directional sweeps).
750
+ const orderedByLayer = minimizeCrossings(byLayerArr, newEdges, newBackEdgeSet);
751
+ // Phase 4: Full 4-layout B–K coordinate assignment (variable node sizes).
752
+ const { boxes: allBoxesMap, dummySweepXs } = assignCoordinatesBK4(orderedByLayer, newEdges, newBackEdgeSet, isLR, nodeGap, layerGap, margin);
753
+ // Phase 5: Extract bend points from dummy node positions.
754
+ const edgeBends = new Map();
755
+ for (const [origEdgeIdx, dummyIds] of dummyChains) {
756
+ const bends = dummyIds.map(id => {
757
+ const b = allBoxesMap.get(id);
758
+ return { x: b.x + b.width / 2, y: b.y + b.height / 2 };
759
+ });
760
+ edgeBends.set(origEdgeIdx, bends);
761
+ }
762
+ // Remove dummy nodes from result boxes (callers only see real nodes).
763
+ const boxes = new Map();
764
+ for (const [id, box] of allBoxesMap) {
765
+ if (!id.startsWith('__dummy_'))
766
+ boxes.set(id, box);
767
+ }
768
+ // Phase 6: Compact gaps between disconnected subgraphs.
769
+ if (boxes.size > 1) {
770
+ const uf = new Map(nodes.map(n => [n.id, n.id]));
771
+ const find = (x) => {
772
+ while (uf.get(x) !== x) {
773
+ uf.set(x, uf.get(uf.get(x)));
774
+ x = uf.get(x);
775
+ }
776
+ return x;
777
+ };
778
+ for (const e of edges) {
779
+ if (boxes.has(e.from) && boxes.has(e.to)) {
780
+ const ra = find(e.from), rb = find(e.to);
781
+ if (ra !== rb)
782
+ uf.set(ra, rb);
783
+ }
784
+ }
785
+ const comps = new Map();
786
+ for (const id of boxes.keys()) {
787
+ const r = find(id);
788
+ if (!comps.has(r))
789
+ comps.set(r, []);
790
+ comps.get(r).push(id);
791
+ }
792
+ if (comps.size > 1) {
793
+ const compInfos = [...comps.values()].map(ids => ({
794
+ ids,
795
+ left: Math.min(...ids.map(id => boxes.get(id).x)),
796
+ right: Math.max(...ids.map(id => boxes.get(id).x + boxes.get(id).width)),
797
+ })).sort((a, b) => a.left - b.left);
798
+ let cursor = compInfos[0].right;
799
+ for (let ci = 1; ci < compInfos.length; ci++) {
800
+ const comp = compInfos[ci];
801
+ const gap = comp.left - cursor;
802
+ const targetGap = nodeGap * 2;
803
+ if (gap > targetGap) {
804
+ const dx = -(gap - targetGap);
805
+ for (const id of comp.ids) {
806
+ const b = boxes.get(id);
807
+ boxes.set(id, { id: b.id, x: b.x + dx, y: b.y, width: b.width, height: b.height });
808
+ }
809
+ comp.left += dx;
810
+ comp.right += dx;
811
+ }
812
+ cursor = comp.right;
813
+ }
814
+ }
815
+ }
816
+ // Compute total diagram dimensions from placed real boxes.
817
+ const allBoxes = [...boxes.values()];
818
+ const width = allBoxes.length > 0
819
+ ? Math.max(...allBoxes.map(b => b.x + b.width)) + margin
820
+ : margin * 2;
821
+ const height = allBoxes.length > 0
822
+ ? Math.max(...allBoxes.map(b => b.y + b.height)) + margin
823
+ : margin * 2;
824
+ return { boxes, width, height, edgeBends, dummySweepXs, dummyChainIds: dummyChains };
825
+ }
826
+ // ─── Straight-line obstacle check ────────────────────────────────────────────
827
+ /**
828
+ * Returns true if segment p1→p2 does not pass through the strict interior of
829
+ * any obstacle (with padding). Uses Liang–Barsky clipping.
830
+ */
831
+ function straightLineObstacleFree(p1, p2, obstacles, padding) {
832
+ const dx = p2.x - p1.x, dy = p2.y - p1.y;
833
+ for (const obs of obstacles) {
834
+ const xmin = obs.x - padding, xmax = obs.x + obs.width + padding;
835
+ const ymin = obs.y - padding, ymax = obs.y + obs.height + padding;
836
+ let tmin = 0, tmax = 1;
837
+ const clips = [
838
+ { p: -dx, q: p1.x - xmin },
839
+ { p: dx, q: xmax - p1.x },
840
+ { p: -dy, q: p1.y - ymin },
841
+ { p: dy, q: ymax - p1.y },
842
+ ];
843
+ let crosses = true;
844
+ for (const { p, q } of clips) {
845
+ if (Math.abs(p) < 1e-10) {
846
+ if (q <= 0) {
847
+ crosses = false;
848
+ break;
849
+ }
850
+ }
851
+ else {
852
+ const t = q / p;
853
+ if (p < 0)
854
+ tmin = Math.max(tmin, t);
855
+ else
856
+ tmax = Math.min(tmax, t);
857
+ if (tmin >= tmax) {
858
+ crosses = false;
859
+ break;
860
+ }
861
+ }
862
+ }
863
+ if (crosses)
864
+ return false; // this obstacle blocks the straight line
865
+ }
866
+ return true;
867
+ }
868
+ // ─── Obstacle-Avoiding Edge Routing ───────────────────────────────────────────
869
+ /**
870
+ * Route an edge between two node boxes with obstacle avoidance.
871
+ *
872
+ * If a straight line from `fromPt` to `toPt` is unobstructed, it is used
873
+ * directly. Otherwise the orthogonal router produces a bent path.
874
+ *
875
+ * @param fromBox Source node box (in laid.boxes coordinates).
876
+ * @param toBox Target node box (in laid.boxes coordinates).
877
+ * @param allBoxes All node boxes in the diagram (obstacles are inferred from these).
878
+ * @param yOff Vertical offset to apply (e.g. title height) when computing world coords.
879
+ * @param fromPt Optional explicit source attachment point (overrides borderPoint).
880
+ * @param toPt Optional explicit target attachment point (overrides borderPoint).
881
+ */
882
+ export function routeEdge(fromBox, toBox, allBoxes, yOff = 0, fromPt, toPt, forceOrthogonal = false) {
883
+ const fromRect = { x: fromBox.x, y: fromBox.y + yOff, width: fromBox.width, height: fromBox.height };
884
+ const toRect = { x: toBox.x, y: toBox.y + yOff, width: toBox.width, height: toBox.height };
885
+ const fromCx = fromRect.x + fromRect.width / 2;
886
+ const fromCy = fromRect.y + fromRect.height / 2;
887
+ const toCx = toRect.x + toRect.width / 2;
888
+ const toCy = toRect.y + toRect.height / 2;
889
+ // Infer port directions from geometry (favour dominant axis).
890
+ const dx = toCx - fromCx;
891
+ const dy = toCy - fromCy;
892
+ let fromDir;
893
+ let toDir;
894
+ if (Math.abs(dy) >= Math.abs(dx)) {
895
+ fromDir = dy > 0 ? 'S' : 'N';
896
+ toDir = dy > 0 ? 'N' : 'S';
897
+ }
898
+ else {
899
+ fromDir = dx > 0 ? 'E' : 'W';
900
+ toDir = dx > 0 ? 'W' : 'E';
901
+ }
902
+ // Use caller-supplied attachment points when provided; otherwise clip to border.
903
+ const pa = fromPt ?? borderPoint(fromRect, toCx, toCy);
904
+ const pb = toPt ?? borderPoint(toRect, fromCx, fromCy);
905
+ // Every box that is neither the source nor the target is an obstacle.
906
+ const fromId = fromBox.id;
907
+ const toId = toBox.id;
908
+ const obstacles = allBoxes
909
+ .filter(b => b.id !== fromId && b.id !== toId)
910
+ .map(b => ({ x: b.x, y: b.y + yOff, width: b.width, height: b.height }));
911
+ // Fast path: use a straight line when no obstacle blocks it.
912
+ // Skipped when forceOrthogonal=true (e.g. class diagrams require rectilinear routing).
913
+ if (!forceOrthogonal &&
914
+ (obstacles.length === 0 || straightLineObstacleFree(pa, pb, obstacles, 10))) {
915
+ return {
916
+ path: `M ${pa.x} ${pa.y} L ${pb.x} ${pb.y}`,
917
+ labelMidpoint: { x: (pa.x + pb.x) / 2, y: (pa.y + pb.y) / 2 },
918
+ };
919
+ }
920
+ const route = orthogonalRouter.route({
921
+ from: pa, to: pb,
922
+ style: 'orthogonal',
923
+ obstacles,
924
+ padding: 10,
925
+ fromDir,
926
+ toDir,
927
+ });
928
+ // Fallback: if the router produces an empty path, use a straight line.
929
+ // When forceOrthogonal is set, prefer a degenerate orthogonal path (V+H) over diagonal.
930
+ const path = route.path
931
+ || (forceOrthogonal
932
+ ? `M ${pa.x} ${pa.y} L ${pa.x} ${pb.y} L ${pb.x} ${pb.y}`
933
+ : `M ${pa.x} ${pa.y} L ${pb.x} ${pb.y}`);
934
+ return { path, labelMidpoint: route.labelPosition };
935
+ }
936
+ //# sourceMappingURL=layered.js.map