@yh-ui/flow 0.1.21

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 (354) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist/Flow.d.vue.ts +306 -0
  4. package/dist/Flow.vue +959 -0
  5. package/dist/Flow.vue.d.ts +306 -0
  6. package/dist/__tests__/ai-workflow.ssr.test.cjs +352 -0
  7. package/dist/__tests__/ai-workflow.ssr.test.d.ts +1 -0
  8. package/dist/__tests__/ai-workflow.ssr.test.mjs +283 -0
  9. package/dist/__tests__/ai-workflow.test.cjs +109 -0
  10. package/dist/__tests__/ai-workflow.test.d.ts +1 -0
  11. package/dist/__tests__/ai-workflow.test.mjs +112 -0
  12. package/dist/__tests__/bpmn.ssr.test.cjs +278 -0
  13. package/dist/__tests__/bpmn.ssr.test.d.ts +1 -0
  14. package/dist/__tests__/bpmn.ssr.test.mjs +237 -0
  15. package/dist/__tests__/bpmn.test.cjs +103 -0
  16. package/dist/__tests__/bpmn.test.d.ts +1 -0
  17. package/dist/__tests__/bpmn.test.mjs +106 -0
  18. package/dist/__tests__/custom-types.test.cjs +300 -0
  19. package/dist/__tests__/custom-types.test.d.ts +1 -0
  20. package/dist/__tests__/custom-types.test.mjs +248 -0
  21. package/dist/__tests__/edge.test.cjs +56 -0
  22. package/dist/__tests__/edge.test.d.ts +1 -0
  23. package/dist/__tests__/edge.test.mjs +69 -0
  24. package/dist/__tests__/event-bus.test.cjs +80 -0
  25. package/dist/__tests__/event-bus.test.d.ts +1 -0
  26. package/dist/__tests__/event-bus.test.mjs +51 -0
  27. package/dist/__tests__/flow.ssr.test.cjs +156 -0
  28. package/dist/__tests__/flow.ssr.test.d.ts +1 -0
  29. package/dist/__tests__/flow.ssr.test.mjs +112 -0
  30. package/dist/__tests__/geometry.test.cjs +191 -0
  31. package/dist/__tests__/geometry.test.d.ts +1 -0
  32. package/dist/__tests__/geometry.test.mjs +105 -0
  33. package/dist/__tests__/graph.test.cjs +115 -0
  34. package/dist/__tests__/graph.test.d.ts +1 -0
  35. package/dist/__tests__/graph.test.mjs +85 -0
  36. package/dist/__tests__/history-plugin.test.cjs +191 -0
  37. package/dist/__tests__/history-plugin.test.d.ts +1 -0
  38. package/dist/__tests__/history-plugin.test.mjs +161 -0
  39. package/dist/__tests__/history.test.cjs +81 -0
  40. package/dist/__tests__/history.test.d.ts +1 -0
  41. package/dist/__tests__/history.test.mjs +43 -0
  42. package/dist/__tests__/layout.test.cjs +213 -0
  43. package/dist/__tests__/layout.test.d.ts +1 -0
  44. package/dist/__tests__/layout.test.mjs +170 -0
  45. package/dist/__tests__/node-edit-panel.ssr.test.cjs +168 -0
  46. package/dist/__tests__/node-edit-panel.ssr.test.d.ts +1 -0
  47. package/dist/__tests__/node-edit-panel.ssr.test.mjs +118 -0
  48. package/dist/__tests__/node-group-plugin.test.cjs +235 -0
  49. package/dist/__tests__/node-group-plugin.test.d.ts +1 -0
  50. package/dist/__tests__/node-group-plugin.test.mjs +187 -0
  51. package/dist/__tests__/node-handles.test.cjs +340 -0
  52. package/dist/__tests__/node-handles.test.d.ts +1 -0
  53. package/dist/__tests__/node-handles.test.mjs +230 -0
  54. package/dist/__tests__/plugin.test.cjs +151 -0
  55. package/dist/__tests__/plugin.test.d.ts +1 -0
  56. package/dist/__tests__/plugin.test.mjs +116 -0
  57. package/dist/__tests__/transform.test.cjs +58 -0
  58. package/dist/__tests__/transform.test.d.ts +1 -0
  59. package/dist/__tests__/transform.test.mjs +38 -0
  60. package/dist/__tests__/useAlignment.test.cjs +91 -0
  61. package/dist/__tests__/useAlignment.test.d.ts +1 -0
  62. package/dist/__tests__/useAlignment.test.mjs +52 -0
  63. package/dist/__tests__/useEdges.test.cjs +117 -0
  64. package/dist/__tests__/useEdges.test.d.ts +1 -0
  65. package/dist/__tests__/useEdges.test.mjs +80 -0
  66. package/dist/__tests__/useKeyboard.test.cjs +88 -0
  67. package/dist/__tests__/useKeyboard.test.d.ts +1 -0
  68. package/dist/__tests__/useKeyboard.test.mjs +56 -0
  69. package/dist/__tests__/useNodes.test.cjs +150 -0
  70. package/dist/__tests__/useNodes.test.d.ts +1 -0
  71. package/dist/__tests__/useNodes.test.mjs +80 -0
  72. package/dist/__tests__/useSelection.test.cjs +112 -0
  73. package/dist/__tests__/useSelection.test.d.ts +1 -0
  74. package/dist/__tests__/useSelection.test.mjs +76 -0
  75. package/dist/__tests__/useViewport.test.cjs +171 -0
  76. package/dist/__tests__/useViewport.test.d.ts +1 -0
  77. package/dist/__tests__/useViewport.test.mjs +82 -0
  78. package/dist/__tests__/utils/ssr.cjs +124 -0
  79. package/dist/__tests__/utils/ssr.d.ts +33 -0
  80. package/dist/__tests__/utils/ssr.mjs +129 -0
  81. package/dist/__tests__/validation.test.cjs +95 -0
  82. package/dist/__tests__/validation.test.d.ts +1 -0
  83. package/dist/__tests__/validation.test.mjs +36 -0
  84. package/dist/components/AiNodeEditPanel.d.vue.ts +13 -0
  85. package/dist/components/AiNodeEditPanel.vue +413 -0
  86. package/dist/components/AiNodeEditPanel.vue.d.ts +13 -0
  87. package/dist/components/EdgeEditPanel.d.vue.ts +14 -0
  88. package/dist/components/EdgeEditPanel.vue +205 -0
  89. package/dist/components/EdgeEditPanel.vue.d.ts +14 -0
  90. package/dist/components/NodeEditPanel.d.vue.ts +13 -0
  91. package/dist/components/NodeEditPanel.vue +214 -0
  92. package/dist/components/NodeEditPanel.vue.d.ts +13 -0
  93. package/dist/components/edges/BaseEdge.d.vue.ts +23 -0
  94. package/dist/components/edges/BaseEdge.vue +55 -0
  95. package/dist/components/edges/BaseEdge.vue.d.ts +23 -0
  96. package/dist/components/edges/BezierEdge.d.vue.ts +22 -0
  97. package/dist/components/edges/BezierEdge.vue +57 -0
  98. package/dist/components/edges/BezierEdge.vue.d.ts +22 -0
  99. package/dist/components/edges/DataFlowEdge.d.vue.ts +41 -0
  100. package/dist/components/edges/DataFlowEdge.vue +211 -0
  101. package/dist/components/edges/DataFlowEdge.vue.d.ts +41 -0
  102. package/dist/components/edges/SmoothEdge.d.vue.ts +22 -0
  103. package/dist/components/edges/SmoothEdge.vue +53 -0
  104. package/dist/components/edges/SmoothEdge.vue.d.ts +22 -0
  105. package/dist/components/edges/StepEdge.d.vue.ts +22 -0
  106. package/dist/components/edges/StepEdge.vue +42 -0
  107. package/dist/components/edges/StepEdge.vue.d.ts +22 -0
  108. package/dist/components/edges/index.cjs +41 -0
  109. package/dist/components/edges/index.d.ts +5 -0
  110. package/dist/components/edges/index.mjs +5 -0
  111. package/dist/components/nodes/BaseNode.d.vue.ts +25 -0
  112. package/dist/components/nodes/BaseNode.vue +93 -0
  113. package/dist/components/nodes/BaseNode.vue.d.ts +25 -0
  114. package/dist/components/nodes/CustomNode.d.vue.ts +36 -0
  115. package/dist/components/nodes/CustomNode.vue +44 -0
  116. package/dist/components/nodes/CustomNode.vue.d.ts +36 -0
  117. package/dist/components/nodes/DatabaseNode.d.vue.ts +19 -0
  118. package/dist/components/nodes/DatabaseNode.vue +62 -0
  119. package/dist/components/nodes/DatabaseNode.vue.d.ts +19 -0
  120. package/dist/components/nodes/DiamondNode.d.vue.ts +19 -0
  121. package/dist/components/nodes/DiamondNode.vue +62 -0
  122. package/dist/components/nodes/DiamondNode.vue.d.ts +19 -0
  123. package/dist/components/nodes/GroupNode.d.vue.ts +31 -0
  124. package/dist/components/nodes/GroupNode.vue +48 -0
  125. package/dist/components/nodes/GroupNode.vue.d.ts +31 -0
  126. package/dist/components/nodes/InputNode.d.vue.ts +23 -0
  127. package/dist/components/nodes/InputNode.vue +63 -0
  128. package/dist/components/nodes/InputNode.vue.d.ts +23 -0
  129. package/dist/components/nodes/NodeResizer.d.vue.ts +27 -0
  130. package/dist/components/nodes/NodeResizer.vue +89 -0
  131. package/dist/components/nodes/NodeResizer.vue.d.ts +27 -0
  132. package/dist/components/nodes/NodeToolbar.d.vue.ts +32 -0
  133. package/dist/components/nodes/NodeToolbar.vue +101 -0
  134. package/dist/components/nodes/NodeToolbar.vue.d.ts +32 -0
  135. package/dist/components/nodes/OutputNode.d.vue.ts +21 -0
  136. package/dist/components/nodes/OutputNode.vue +53 -0
  137. package/dist/components/nodes/OutputNode.vue.d.ts +21 -0
  138. package/dist/components/nodes/ai-workflow/AiAgentNode.d.vue.ts +20 -0
  139. package/dist/components/nodes/ai-workflow/AiAgentNode.vue +59 -0
  140. package/dist/components/nodes/ai-workflow/AiAgentNode.vue.d.ts +20 -0
  141. package/dist/components/nodes/ai-workflow/AiConditionNode.d.vue.ts +19 -0
  142. package/dist/components/nodes/ai-workflow/AiConditionNode.vue +65 -0
  143. package/dist/components/nodes/ai-workflow/AiConditionNode.vue.d.ts +19 -0
  144. package/dist/components/nodes/ai-workflow/AiEndNode.d.vue.ts +19 -0
  145. package/dist/components/nodes/ai-workflow/AiEndNode.vue +47 -0
  146. package/dist/components/nodes/ai-workflow/AiEndNode.vue.d.ts +19 -0
  147. package/dist/components/nodes/ai-workflow/AiLlmNode.d.vue.ts +19 -0
  148. package/dist/components/nodes/ai-workflow/AiLlmNode.vue +64 -0
  149. package/dist/components/nodes/ai-workflow/AiLlmNode.vue.d.ts +19 -0
  150. package/dist/components/nodes/ai-workflow/AiMemoryNode.d.vue.ts +19 -0
  151. package/dist/components/nodes/ai-workflow/AiMemoryNode.vue +59 -0
  152. package/dist/components/nodes/ai-workflow/AiMemoryNode.vue.d.ts +19 -0
  153. package/dist/components/nodes/ai-workflow/AiPromptNode.d.vue.ts +19 -0
  154. package/dist/components/nodes/ai-workflow/AiPromptNode.vue +61 -0
  155. package/dist/components/nodes/ai-workflow/AiPromptNode.vue.d.ts +19 -0
  156. package/dist/components/nodes/ai-workflow/AiStartNode.d.vue.ts +19 -0
  157. package/dist/components/nodes/ai-workflow/AiStartNode.vue +47 -0
  158. package/dist/components/nodes/ai-workflow/AiStartNode.vue.d.ts +19 -0
  159. package/dist/components/nodes/ai-workflow/AiToolNode.d.vue.ts +19 -0
  160. package/dist/components/nodes/ai-workflow/AiToolNode.vue +59 -0
  161. package/dist/components/nodes/ai-workflow/AiToolNode.vue.d.ts +19 -0
  162. package/dist/components/nodes/ai-workflow/index.cjs +109 -0
  163. package/dist/components/nodes/ai-workflow/index.d.ts +23 -0
  164. package/dist/components/nodes/ai-workflow/index.mjs +37 -0
  165. package/dist/components/nodes/bpmn/BpmnEndEvent.d.vue.ts +19 -0
  166. package/dist/components/nodes/bpmn/BpmnEndEvent.vue +50 -0
  167. package/dist/components/nodes/bpmn/BpmnEndEvent.vue.d.ts +19 -0
  168. package/dist/components/nodes/bpmn/BpmnExclusiveGateway.d.vue.ts +19 -0
  169. package/dist/components/nodes/bpmn/BpmnExclusiveGateway.vue +60 -0
  170. package/dist/components/nodes/bpmn/BpmnExclusiveGateway.vue.d.ts +19 -0
  171. package/dist/components/nodes/bpmn/BpmnInclusiveGateway.d.vue.ts +19 -0
  172. package/dist/components/nodes/bpmn/BpmnInclusiveGateway.vue +60 -0
  173. package/dist/components/nodes/bpmn/BpmnInclusiveGateway.vue.d.ts +19 -0
  174. package/dist/components/nodes/bpmn/BpmnParallelGateway.d.vue.ts +19 -0
  175. package/dist/components/nodes/bpmn/BpmnParallelGateway.vue +60 -0
  176. package/dist/components/nodes/bpmn/BpmnParallelGateway.vue.d.ts +19 -0
  177. package/dist/components/nodes/bpmn/BpmnServiceTask.d.vue.ts +19 -0
  178. package/dist/components/nodes/bpmn/BpmnServiceTask.vue +55 -0
  179. package/dist/components/nodes/bpmn/BpmnServiceTask.vue.d.ts +19 -0
  180. package/dist/components/nodes/bpmn/BpmnStartEvent.d.vue.ts +19 -0
  181. package/dist/components/nodes/bpmn/BpmnStartEvent.vue +50 -0
  182. package/dist/components/nodes/bpmn/BpmnStartEvent.vue.d.ts +19 -0
  183. package/dist/components/nodes/bpmn/BpmnTask.d.vue.ts +19 -0
  184. package/dist/components/nodes/bpmn/BpmnTask.vue +54 -0
  185. package/dist/components/nodes/bpmn/BpmnTask.vue.d.ts +19 -0
  186. package/dist/components/nodes/bpmn/BpmnUserTask.d.vue.ts +19 -0
  187. package/dist/components/nodes/bpmn/BpmnUserTask.vue +55 -0
  188. package/dist/components/nodes/bpmn/BpmnUserTask.vue.d.ts +19 -0
  189. package/dist/components/nodes/bpmn/index.cjs +109 -0
  190. package/dist/components/nodes/bpmn/index.d.ts +23 -0
  191. package/dist/components/nodes/bpmn/index.mjs +37 -0
  192. package/dist/components/nodes/index.cjs +246 -0
  193. package/dist/components/nodes/index.d.ts +13 -0
  194. package/dist/components/nodes/index.mjs +44 -0
  195. package/dist/core/FlowContext.cjs +21 -0
  196. package/dist/core/FlowContext.d.ts +10 -0
  197. package/dist/core/FlowContext.mjs +13 -0
  198. package/dist/core/index.cjs +104 -0
  199. package/dist/core/index.d.ts +9 -0
  200. package/dist/core/index.mjs +9 -0
  201. package/dist/core/useAlignment.cjs +81 -0
  202. package/dist/core/useAlignment.d.ts +33 -0
  203. package/dist/core/useAlignment.mjs +71 -0
  204. package/dist/core/useEdges.cjs +132 -0
  205. package/dist/core/useEdges.d.ts +29 -0
  206. package/dist/core/useEdges.mjs +89 -0
  207. package/dist/core/useFlow.cjs +40 -0
  208. package/dist/core/useFlow.d.ts +31 -0
  209. package/dist/core/useFlow.mjs +32 -0
  210. package/dist/core/useHistory.cjs +63 -0
  211. package/dist/core/useHistory.d.ts +15 -0
  212. package/dist/core/useHistory.mjs +54 -0
  213. package/dist/core/useKeyboard.cjs +54 -0
  214. package/dist/core/useKeyboard.d.ts +18 -0
  215. package/dist/core/useKeyboard.mjs +45 -0
  216. package/dist/core/useNodeDistribution.cjs +171 -0
  217. package/dist/core/useNodeDistribution.d.ts +12 -0
  218. package/dist/core/useNodeDistribution.mjs +145 -0
  219. package/dist/core/useNodes.cjs +146 -0
  220. package/dist/core/useNodes.d.ts +26 -0
  221. package/dist/core/useNodes.mjs +101 -0
  222. package/dist/core/useSelection.cjs +83 -0
  223. package/dist/core/useSelection.d.ts +18 -0
  224. package/dist/core/useSelection.mjs +53 -0
  225. package/dist/core/useViewport.cjs +157 -0
  226. package/dist/core/useViewport.d.ts +65 -0
  227. package/dist/core/useViewport.mjs +125 -0
  228. package/dist/flow.cjs +240 -0
  229. package/dist/flow.d.ts +276 -0
  230. package/dist/flow.mjs +230 -0
  231. package/dist/index.cjs +378 -0
  232. package/dist/index.d.ts +28 -0
  233. package/dist/index.mjs +50 -0
  234. package/dist/plugins/index.cjs +96 -0
  235. package/dist/plugins/index.d.ts +34 -0
  236. package/dist/plugins/index.mjs +47 -0
  237. package/dist/plugins/plugin.cjs +117 -0
  238. package/dist/plugins/plugin.d.ts +72 -0
  239. package/dist/plugins/plugin.mjs +110 -0
  240. package/dist/plugins/plugins/controls.cjs +38 -0
  241. package/dist/plugins/plugins/controls.d.ts +12 -0
  242. package/dist/plugins/plugins/controls.mjs +28 -0
  243. package/dist/plugins/plugins/export.cjs +102 -0
  244. package/dist/plugins/plugins/export.d.ts +12 -0
  245. package/dist/plugins/plugins/export.mjs +89 -0
  246. package/dist/plugins/plugins/grid.cjs +36 -0
  247. package/dist/plugins/plugins/grid.d.ts +11 -0
  248. package/dist/plugins/plugins/grid.mjs +26 -0
  249. package/dist/plugins/plugins/history.cjs +140 -0
  250. package/dist/plugins/plugins/history.d.ts +53 -0
  251. package/dist/plugins/plugins/history.mjs +132 -0
  252. package/dist/plugins/plugins/index.cjs +104 -0
  253. package/dist/plugins/plugins/index.d.ts +9 -0
  254. package/dist/plugins/plugins/index.mjs +9 -0
  255. package/dist/plugins/plugins/keyboard.cjs +27 -0
  256. package/dist/plugins/plugins/keyboard.d.ts +10 -0
  257. package/dist/plugins/plugins/keyboard.mjs +18 -0
  258. package/dist/plugins/plugins/layout.cjs +275 -0
  259. package/dist/plugins/plugins/layout.d.ts +34 -0
  260. package/dist/plugins/plugins/layout.mjs +246 -0
  261. package/dist/plugins/plugins/minimap.cjs +60 -0
  262. package/dist/plugins/plugins/minimap.d.ts +25 -0
  263. package/dist/plugins/plugins/minimap.mjs +50 -0
  264. package/dist/plugins/plugins/node-group.cjs +209 -0
  265. package/dist/plugins/plugins/node-group.d.ts +26 -0
  266. package/dist/plugins/plugins/node-group.mjs +178 -0
  267. package/dist/plugins/plugins/snap.cjs +36 -0
  268. package/dist/plugins/plugins/snap.d.ts +12 -0
  269. package/dist/plugins/plugins/snap.mjs +26 -0
  270. package/dist/renderer/AlignmentLines.d.vue.ts +5 -0
  271. package/dist/renderer/AlignmentLines.vue +113 -0
  272. package/dist/renderer/AlignmentLines.vue.d.ts +5 -0
  273. package/dist/renderer/Background.d.vue.ts +7 -0
  274. package/dist/renderer/Background.vue +86 -0
  275. package/dist/renderer/Background.vue.d.ts +7 -0
  276. package/dist/renderer/Controls.d.vue.ts +13 -0
  277. package/dist/renderer/Controls.vue +82 -0
  278. package/dist/renderer/Controls.vue.d.ts +13 -0
  279. package/dist/renderer/EdgeHandlesRenderer.d.vue.ts +11 -0
  280. package/dist/renderer/EdgeHandlesRenderer.vue +75 -0
  281. package/dist/renderer/EdgeHandlesRenderer.vue.d.ts +11 -0
  282. package/dist/renderer/EdgeRenderer.d.vue.ts +39 -0
  283. package/dist/renderer/EdgeRenderer.vue +204 -0
  284. package/dist/renderer/EdgeRenderer.vue.d.ts +39 -0
  285. package/dist/renderer/FlowBackground.d.vue.ts +11 -0
  286. package/dist/renderer/FlowBackground.vue +82 -0
  287. package/dist/renderer/FlowBackground.vue.d.ts +11 -0
  288. package/dist/renderer/Minimap.d.vue.ts +30 -0
  289. package/dist/renderer/Minimap.vue +290 -0
  290. package/dist/renderer/Minimap.vue.d.ts +30 -0
  291. package/dist/renderer/NodeRenderer.d.vue.ts +56 -0
  292. package/dist/renderer/NodeRenderer.vue +328 -0
  293. package/dist/renderer/NodeRenderer.vue.d.ts +56 -0
  294. package/dist/renderer/SelectionBox.d.vue.ts +11 -0
  295. package/dist/renderer/SelectionBox.vue +28 -0
  296. package/dist/renderer/SelectionBox.vue.d.ts +11 -0
  297. package/dist/types/edge.cjs +13 -0
  298. package/dist/types/edge.d.ts +65 -0
  299. package/dist/types/edge.mjs +6 -0
  300. package/dist/types/events.cjs +1 -0
  301. package/dist/types/events.d.ts +115 -0
  302. package/dist/types/events.mjs +0 -0
  303. package/dist/types/index.cjs +1 -0
  304. package/dist/types/index.d.ts +366 -0
  305. package/dist/types/index.mjs +0 -0
  306. package/dist/types/node.cjs +9 -0
  307. package/dist/types/node.d.ts +90 -0
  308. package/dist/types/node.mjs +3 -0
  309. package/dist/types/viewport.cjs +42 -0
  310. package/dist/types/viewport.d.ts +62 -0
  311. package/dist/types/viewport.mjs +36 -0
  312. package/dist/utils/bpmn-engine.cjs +390 -0
  313. package/dist/utils/bpmn-engine.d.ts +164 -0
  314. package/dist/utils/bpmn-engine.mjs +378 -0
  315. package/dist/utils/bpmn.cjs +492 -0
  316. package/dist/utils/bpmn.d.ts +53 -0
  317. package/dist/utils/bpmn.mjs +430 -0
  318. package/dist/utils/collaboration.cjs +537 -0
  319. package/dist/utils/collaboration.d.ts +189 -0
  320. package/dist/utils/collaboration.mjs +521 -0
  321. package/dist/utils/custom-types.cjs +138 -0
  322. package/dist/utils/custom-types.d.ts +78 -0
  323. package/dist/utils/custom-types.mjs +108 -0
  324. package/dist/utils/edge.cjs +235 -0
  325. package/dist/utils/edge.d.ts +79 -0
  326. package/dist/utils/edge.mjs +172 -0
  327. package/dist/utils/event-bus.cjs +91 -0
  328. package/dist/utils/event-bus.d.ts +39 -0
  329. package/dist/utils/event-bus.mjs +82 -0
  330. package/dist/utils/geometry.cjs +178 -0
  331. package/dist/utils/geometry.d.ts +186 -0
  332. package/dist/utils/geometry.mjs +144 -0
  333. package/dist/utils/graph.cjs +158 -0
  334. package/dist/utils/graph.d.ts +40 -0
  335. package/dist/utils/graph.mjs +147 -0
  336. package/dist/utils/index.cjs +137 -0
  337. package/dist/utils/index.d.ts +12 -0
  338. package/dist/utils/index.mjs +12 -0
  339. package/dist/utils/performance.cjs +94 -0
  340. package/dist/utils/performance.d.ts +18 -0
  341. package/dist/utils/performance.mjs +82 -0
  342. package/dist/utils/screenshot.cjs +87 -0
  343. package/dist/utils/screenshot.d.ts +22 -0
  344. package/dist/utils/screenshot.mjs +66 -0
  345. package/dist/utils/theme.cjs +228 -0
  346. package/dist/utils/theme.d.ts +92 -0
  347. package/dist/utils/theme.mjs +217 -0
  348. package/dist/utils/transform.cjs +76 -0
  349. package/dist/utils/transform.d.ts +45 -0
  350. package/dist/utils/transform.mjs +57 -0
  351. package/dist/utils/validation.cjs +107 -0
  352. package/dist/utils/validation.d.ts +29 -0
  353. package/dist/utils/validation.mjs +85 -0
  354. package/package.json +61 -0
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useHistory = useHistory;
7
+ var _vue = require("vue");
8
+ function useHistory(nodes, edges, options = {}) {
9
+ const {
10
+ maxHistory = 50,
11
+ onHistoryChange
12
+ } = options;
13
+ const history = (0, _vue.shallowRef)([]);
14
+ const historyPointer = (0, _vue.ref)(-1);
15
+ const canUndo = (0, _vue.computed)(() => historyPointer.value > 0);
16
+ const canRedo = (0, _vue.computed)(() => historyPointer.value < history.value.length - 1);
17
+ const push = state => {
18
+ const newHistory = history.value.slice(0, historyPointer.value + 1);
19
+ newHistory.push({
20
+ nodes: JSON.parse(JSON.stringify(state.nodes)),
21
+ edges: JSON.parse(JSON.stringify(state.edges))
22
+ });
23
+ if (newHistory.length > maxHistory) {
24
+ newHistory.shift();
25
+ }
26
+ history.value = newHistory;
27
+ historyPointer.value = newHistory.length - 1;
28
+ onHistoryChange?.(canUndo.value, canRedo.value);
29
+ };
30
+ const undo = () => {
31
+ if (!canUndo.value) return;
32
+ historyPointer.value--;
33
+ const prevState = history.value[historyPointer.value];
34
+ if (prevState) {
35
+ nodes.value = JSON.parse(JSON.stringify(prevState.nodes));
36
+ edges.value = JSON.parse(JSON.stringify(prevState.edges));
37
+ }
38
+ onHistoryChange?.(canUndo.value, canRedo.value);
39
+ };
40
+ const redo = () => {
41
+ if (!canRedo.value) return;
42
+ historyPointer.value++;
43
+ const nextState = history.value[historyPointer.value];
44
+ if (nextState) {
45
+ nodes.value = JSON.parse(JSON.stringify(nextState.nodes));
46
+ edges.value = JSON.parse(JSON.stringify(nextState.edges));
47
+ }
48
+ onHistoryChange?.(canUndo.value, canRedo.value);
49
+ };
50
+ const clear = () => {
51
+ history.value = [];
52
+ historyPointer.value = -1;
53
+ onHistoryChange?.(false, false);
54
+ };
55
+ return {
56
+ canUndo,
57
+ canRedo,
58
+ undo,
59
+ redo,
60
+ push,
61
+ clear
62
+ };
63
+ }
@@ -0,0 +1,15 @@
1
+ import { type Ref } from 'vue';
2
+ import type { Node, Edge, HistoryState } from '../types';
3
+ export interface UseHistoryOptions {
4
+ maxHistory?: number;
5
+ onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;
6
+ }
7
+ export interface UseHistoryReturn {
8
+ canUndo: Ref<boolean>;
9
+ canRedo: Ref<boolean>;
10
+ undo: () => void;
11
+ redo: () => void;
12
+ push: (state: HistoryState) => void;
13
+ clear: () => void;
14
+ }
15
+ export declare function useHistory(nodes: Ref<Node[]>, edges: Ref<Edge[]>, options?: UseHistoryOptions): UseHistoryReturn;
@@ -0,0 +1,54 @@
1
+ import { ref, computed, shallowRef } from "vue";
2
+ export function useHistory(nodes, edges, options = {}) {
3
+ const { maxHistory = 50, onHistoryChange } = options;
4
+ const history = shallowRef([]);
5
+ const historyPointer = ref(-1);
6
+ const canUndo = computed(() => historyPointer.value > 0);
7
+ const canRedo = computed(() => historyPointer.value < history.value.length - 1);
8
+ const push = (state) => {
9
+ const newHistory = history.value.slice(0, historyPointer.value + 1);
10
+ newHistory.push({
11
+ nodes: JSON.parse(JSON.stringify(state.nodes)),
12
+ edges: JSON.parse(JSON.stringify(state.edges))
13
+ });
14
+ if (newHistory.length > maxHistory) {
15
+ newHistory.shift();
16
+ }
17
+ history.value = newHistory;
18
+ historyPointer.value = newHistory.length - 1;
19
+ onHistoryChange?.(canUndo.value, canRedo.value);
20
+ };
21
+ const undo = () => {
22
+ if (!canUndo.value) return;
23
+ historyPointer.value--;
24
+ const prevState = history.value[historyPointer.value];
25
+ if (prevState) {
26
+ nodes.value = JSON.parse(JSON.stringify(prevState.nodes));
27
+ edges.value = JSON.parse(JSON.stringify(prevState.edges));
28
+ }
29
+ onHistoryChange?.(canUndo.value, canRedo.value);
30
+ };
31
+ const redo = () => {
32
+ if (!canRedo.value) return;
33
+ historyPointer.value++;
34
+ const nextState = history.value[historyPointer.value];
35
+ if (nextState) {
36
+ nodes.value = JSON.parse(JSON.stringify(nextState.nodes));
37
+ edges.value = JSON.parse(JSON.stringify(nextState.edges));
38
+ }
39
+ onHistoryChange?.(canUndo.value, canRedo.value);
40
+ };
41
+ const clear = () => {
42
+ history.value = [];
43
+ historyPointer.value = -1;
44
+ onHistoryChange?.(false, false);
45
+ };
46
+ return {
47
+ canUndo,
48
+ canRedo,
49
+ undo,
50
+ redo,
51
+ push,
52
+ clear
53
+ };
54
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useKeyboard = useKeyboard;
7
+ function useKeyboard(options = {}) {
8
+ const {
9
+ enabled = true,
10
+ onDelete,
11
+ onCopy,
12
+ onPaste,
13
+ onUndo,
14
+ onRedo,
15
+ onSelectAll,
16
+ onEscape
17
+ } = options;
18
+ const handleKeyDown = event => {
19
+ if (!enabled) return;
20
+ const key = event.key;
21
+ const ctrl = event.ctrlKey || event.metaKey;
22
+ if ((key === "Delete" || key === "Backspace") && !event.target?.toString().includes("Input")) {
23
+ event.preventDefault();
24
+ onDelete?.();
25
+ }
26
+ if (ctrl && key === "c") {
27
+ onCopy?.();
28
+ }
29
+ if (ctrl && key === "v") {
30
+ onPaste?.({
31
+ nodes: [],
32
+ edges: []
33
+ });
34
+ }
35
+ if (ctrl && key === "z" && !event.shiftKey) {
36
+ event.preventDefault();
37
+ onUndo?.();
38
+ }
39
+ if (ctrl && key === "z" && event.shiftKey || ctrl && key === "y") {
40
+ event.preventDefault();
41
+ onRedo?.();
42
+ }
43
+ if (ctrl && key === "a") {
44
+ event.preventDefault();
45
+ onSelectAll?.();
46
+ }
47
+ if (key === "Escape") {
48
+ onEscape?.();
49
+ }
50
+ };
51
+ return {
52
+ handleKeyDown
53
+ };
54
+ }
@@ -0,0 +1,18 @@
1
+ import type { Node, Edge } from '../types';
2
+ export interface UseKeyboardOptions {
3
+ enabled?: boolean;
4
+ onDelete?: () => void;
5
+ onCopy?: () => void;
6
+ onPaste?: (data: {
7
+ nodes: Node[];
8
+ edges: Edge[];
9
+ }) => void;
10
+ onUndo?: () => void;
11
+ onRedo?: () => void;
12
+ onSelectAll?: () => void;
13
+ onEscape?: () => void;
14
+ }
15
+ export interface UseKeyboardReturn {
16
+ handleKeyDown: (event: KeyboardEvent) => void;
17
+ }
18
+ export declare function useKeyboard(options?: UseKeyboardOptions): UseKeyboardReturn;
@@ -0,0 +1,45 @@
1
+ export function useKeyboard(options = {}) {
2
+ const {
3
+ enabled = true,
4
+ onDelete,
5
+ onCopy,
6
+ onPaste,
7
+ onUndo,
8
+ onRedo,
9
+ onSelectAll,
10
+ onEscape
11
+ } = options;
12
+ const handleKeyDown = (event) => {
13
+ if (!enabled) return;
14
+ const key = event.key;
15
+ const ctrl = event.ctrlKey || event.metaKey;
16
+ if ((key === "Delete" || key === "Backspace") && !event.target?.toString().includes("Input")) {
17
+ event.preventDefault();
18
+ onDelete?.();
19
+ }
20
+ if (ctrl && key === "c") {
21
+ onCopy?.();
22
+ }
23
+ if (ctrl && key === "v") {
24
+ onPaste?.({ nodes: [], edges: [] });
25
+ }
26
+ if (ctrl && key === "z" && !event.shiftKey) {
27
+ event.preventDefault();
28
+ onUndo?.();
29
+ }
30
+ if (ctrl && key === "z" && event.shiftKey || ctrl && key === "y") {
31
+ event.preventDefault();
32
+ onRedo?.();
33
+ }
34
+ if (ctrl && key === "a") {
35
+ event.preventDefault();
36
+ onSelectAll?.();
37
+ }
38
+ if (key === "Escape") {
39
+ onEscape?.();
40
+ }
41
+ };
42
+ return {
43
+ handleKeyDown
44
+ };
45
+ }
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useNodeDistribution = useNodeDistribution;
7
+ function useNodeDistribution(options) {
8
+ const {
9
+ nodes
10
+ } = options;
11
+ const distributeHorizontally = (nodeIds, gap = 50) => {
12
+ const targetNodeIds = nodeIds || nodes.value.filter(n => n.selected).map(n => n.id);
13
+ if (targetNodeIds.length < 3) return;
14
+ const targetNodes = nodes.value.filter(n => targetNodeIds.includes(n.id));
15
+ targetNodes.sort((a, b) => a.position.x - b.position.x);
16
+ const firstNode = targetNodes[0];
17
+ const lastNode = targetNodes[targetNodes.length - 1];
18
+ const lastWidth = lastNode.width || 200;
19
+ const totalWidth = targetNodes.reduce((sum, n) => sum + (n.width || 200), 0);
20
+ const totalGap = gap * (targetNodes.length - 1);
21
+ const availableSpace = lastNode.position.x + lastWidth - firstNode.position.x - totalWidth - totalGap;
22
+ if (availableSpace <= 0) {
23
+ let currentX = firstNode.position.x;
24
+ targetNodes.forEach(node => {
25
+ const nodeIndex = nodes.value.findIndex(n => n.id === node.id);
26
+ if (nodeIndex >= 0) {
27
+ nodes.value[nodeIndex] = {
28
+ ...nodes.value[nodeIndex],
29
+ position: {
30
+ ...nodes.value[nodeIndex].position,
31
+ x: currentX
32
+ }
33
+ };
34
+ }
35
+ currentX += (node.width || 200) + gap;
36
+ });
37
+ } else {
38
+ let currentX = firstNode.position.x;
39
+ targetNodes.forEach(node => {
40
+ const nodeIndex = nodes.value.findIndex(n => n.id === node.id);
41
+ if (nodeIndex >= 0) {
42
+ nodes.value[nodeIndex] = {
43
+ ...nodes.value[nodeIndex],
44
+ position: {
45
+ ...nodes.value[nodeIndex].position,
46
+ x: currentX
47
+ }
48
+ };
49
+ }
50
+ currentX += (node.width || 200) + gap;
51
+ });
52
+ }
53
+ };
54
+ const distributeVertically = (nodeIds, gap = 50) => {
55
+ const targetNodeIds = nodeIds || nodes.value.filter(n => n.selected).map(n => n.id);
56
+ if (targetNodeIds.length < 3) return;
57
+ const targetNodes = nodes.value.filter(n => targetNodeIds.includes(n.id));
58
+ targetNodes.sort((a, b) => a.position.y - b.position.y);
59
+ const firstNode = targetNodes[0];
60
+ const lastNode = targetNodes[targetNodes.length - 1];
61
+ const lastHeight = lastNode.height || 50;
62
+ const totalHeight = targetNodes.reduce((sum, n) => sum + (n.height || 50), 0);
63
+ const totalGap = gap * (targetNodes.length - 1);
64
+ const availableSpace = lastNode.position.y + lastHeight - firstNode.position.y - totalHeight - totalGap;
65
+ if (availableSpace <= 0) {
66
+ let currentY = firstNode.position.y;
67
+ targetNodes.forEach(node => {
68
+ const nodeIndex = nodes.value.findIndex(n => n.id === node.id);
69
+ if (nodeIndex >= 0) {
70
+ nodes.value[nodeIndex] = {
71
+ ...nodes.value[nodeIndex],
72
+ position: {
73
+ ...nodes.value[nodeIndex].position,
74
+ y: currentY
75
+ }
76
+ };
77
+ }
78
+ currentY += (node.height || 50) + gap;
79
+ });
80
+ } else {
81
+ let currentY = firstNode.position.y;
82
+ targetNodes.forEach(node => {
83
+ const nodeIndex = nodes.value.findIndex(n => n.id === node.id);
84
+ if (nodeIndex >= 0) {
85
+ nodes.value[nodeIndex] = {
86
+ ...nodes.value[nodeIndex],
87
+ position: {
88
+ ...nodes.value[nodeIndex].position,
89
+ y: currentY
90
+ }
91
+ };
92
+ }
93
+ currentY += (node.height || 50) + gap;
94
+ });
95
+ }
96
+ };
97
+ const alignNodesHorizontal = (nodeIds, alignment = "left") => {
98
+ const targetNodeIds = nodeIds || nodes.value.filter(n => n.selected).map(n => n.id);
99
+ if (targetNodeIds.length < 2) return;
100
+ const targetNodes = nodes.value.filter(n => targetNodeIds.includes(n.id));
101
+ let referenceX;
102
+ if (alignment === "left") {
103
+ referenceX = Math.min(...targetNodes.map(n => n.position.x));
104
+ } else if (alignment === "right") {
105
+ referenceX = Math.max(...targetNodes.map(n => n.position.x + (n.width || 200)));
106
+ } else {
107
+ const centers = targetNodes.map(n => n.position.x + (n.width || 200) / 2);
108
+ referenceX = centers.reduce((a, b) => a + b, 0) / centers.length;
109
+ }
110
+ targetNodes.forEach(node => {
111
+ const nodeIndex = nodes.value.findIndex(n => n.id === node.id);
112
+ if (nodeIndex >= 0) {
113
+ let newX;
114
+ if (alignment === "left") {
115
+ newX = referenceX;
116
+ } else if (alignment === "right") {
117
+ newX = referenceX - (node.width || 200);
118
+ } else {
119
+ newX = referenceX - (node.width || 200) / 2;
120
+ }
121
+ nodes.value[nodeIndex] = {
122
+ ...nodes.value[nodeIndex],
123
+ position: {
124
+ ...nodes.value[nodeIndex].position,
125
+ x: newX
126
+ }
127
+ };
128
+ }
129
+ });
130
+ };
131
+ const alignNodesVertical = (nodeIds, alignment = "top") => {
132
+ const targetNodeIds = nodeIds || nodes.value.filter(n => n.selected).map(n => n.id);
133
+ if (targetNodeIds.length < 2) return;
134
+ const targetNodes = nodes.value.filter(n => targetNodeIds.includes(n.id));
135
+ let referenceY;
136
+ if (alignment === "top") {
137
+ referenceY = Math.min(...targetNodes.map(n => n.position.y));
138
+ } else if (alignment === "bottom") {
139
+ referenceY = Math.max(...targetNodes.map(n => n.position.y + (n.height || 50)));
140
+ } else {
141
+ const middles = targetNodes.map(n => n.position.y + (n.height || 50) / 2);
142
+ referenceY = middles.reduce((a, b) => a + b, 0) / middles.length;
143
+ }
144
+ targetNodes.forEach(node => {
145
+ const nodeIndex = nodes.value.findIndex(n => n.id === node.id);
146
+ if (nodeIndex >= 0) {
147
+ let newY;
148
+ if (alignment === "top") {
149
+ newY = referenceY;
150
+ } else if (alignment === "bottom") {
151
+ newY = referenceY - (node.height || 50);
152
+ } else {
153
+ newY = referenceY - (node.height || 50) / 2;
154
+ }
155
+ nodes.value[nodeIndex] = {
156
+ ...nodes.value[nodeIndex],
157
+ position: {
158
+ ...nodes.value[nodeIndex].position,
159
+ y: newY
160
+ }
161
+ };
162
+ }
163
+ });
164
+ };
165
+ return {
166
+ distributeHorizontally,
167
+ distributeVertically,
168
+ alignNodesHorizontal,
169
+ alignNodesVertical
170
+ };
171
+ }
@@ -0,0 +1,12 @@
1
+ import { type Ref } from 'vue';
2
+ import type { Node } from '../types';
3
+ export interface UseNodeDistributionOptions {
4
+ nodes: Ref<Node[]>;
5
+ }
6
+ export interface UseNodeDistributionReturn {
7
+ distributeHorizontally: (nodeIds?: string[], gap?: number) => void;
8
+ distributeVertically: (nodeIds?: string[], gap?: number) => void;
9
+ alignNodesHorizontal: (nodeIds?: string[], alignment?: 'left' | 'center' | 'right') => void;
10
+ alignNodesVertical: (nodeIds?: string[], alignment?: 'top' | 'middle' | 'bottom') => void;
11
+ }
12
+ export declare function useNodeDistribution(options: UseNodeDistributionOptions): UseNodeDistributionReturn;
@@ -0,0 +1,145 @@
1
+ export function useNodeDistribution(options) {
2
+ const { nodes } = options;
3
+ const distributeHorizontally = (nodeIds, gap = 50) => {
4
+ const targetNodeIds = nodeIds || nodes.value.filter((n) => n.selected).map((n) => n.id);
5
+ if (targetNodeIds.length < 3) return;
6
+ const targetNodes = nodes.value.filter((n) => targetNodeIds.includes(n.id));
7
+ targetNodes.sort((a, b) => a.position.x - b.position.x);
8
+ const firstNode = targetNodes[0];
9
+ const lastNode = targetNodes[targetNodes.length - 1];
10
+ const lastWidth = lastNode.width || 200;
11
+ const totalWidth = targetNodes.reduce((sum, n) => sum + (n.width || 200), 0);
12
+ const totalGap = gap * (targetNodes.length - 1);
13
+ const availableSpace = lastNode.position.x + lastWidth - firstNode.position.x - totalWidth - totalGap;
14
+ if (availableSpace <= 0) {
15
+ let currentX = firstNode.position.x;
16
+ targetNodes.forEach((node) => {
17
+ const nodeIndex = nodes.value.findIndex((n) => n.id === node.id);
18
+ if (nodeIndex >= 0) {
19
+ nodes.value[nodeIndex] = {
20
+ ...nodes.value[nodeIndex],
21
+ position: { ...nodes.value[nodeIndex].position, x: currentX }
22
+ };
23
+ }
24
+ currentX += (node.width || 200) + gap;
25
+ });
26
+ } else {
27
+ let currentX = firstNode.position.x;
28
+ targetNodes.forEach((node) => {
29
+ const nodeIndex = nodes.value.findIndex((n) => n.id === node.id);
30
+ if (nodeIndex >= 0) {
31
+ nodes.value[nodeIndex] = {
32
+ ...nodes.value[nodeIndex],
33
+ position: { ...nodes.value[nodeIndex].position, x: currentX }
34
+ };
35
+ }
36
+ currentX += (node.width || 200) + gap;
37
+ });
38
+ }
39
+ };
40
+ const distributeVertically = (nodeIds, gap = 50) => {
41
+ const targetNodeIds = nodeIds || nodes.value.filter((n) => n.selected).map((n) => n.id);
42
+ if (targetNodeIds.length < 3) return;
43
+ const targetNodes = nodes.value.filter((n) => targetNodeIds.includes(n.id));
44
+ targetNodes.sort((a, b) => a.position.y - b.position.y);
45
+ const firstNode = targetNodes[0];
46
+ const lastNode = targetNodes[targetNodes.length - 1];
47
+ const lastHeight = lastNode.height || 50;
48
+ const totalHeight = targetNodes.reduce((sum, n) => sum + (n.height || 50), 0);
49
+ const totalGap = gap * (targetNodes.length - 1);
50
+ const availableSpace = lastNode.position.y + lastHeight - firstNode.position.y - totalHeight - totalGap;
51
+ if (availableSpace <= 0) {
52
+ let currentY = firstNode.position.y;
53
+ targetNodes.forEach((node) => {
54
+ const nodeIndex = nodes.value.findIndex((n) => n.id === node.id);
55
+ if (nodeIndex >= 0) {
56
+ nodes.value[nodeIndex] = {
57
+ ...nodes.value[nodeIndex],
58
+ position: { ...nodes.value[nodeIndex].position, y: currentY }
59
+ };
60
+ }
61
+ currentY += (node.height || 50) + gap;
62
+ });
63
+ } else {
64
+ let currentY = firstNode.position.y;
65
+ targetNodes.forEach((node) => {
66
+ const nodeIndex = nodes.value.findIndex((n) => n.id === node.id);
67
+ if (nodeIndex >= 0) {
68
+ nodes.value[nodeIndex] = {
69
+ ...nodes.value[nodeIndex],
70
+ position: { ...nodes.value[nodeIndex].position, y: currentY }
71
+ };
72
+ }
73
+ currentY += (node.height || 50) + gap;
74
+ });
75
+ }
76
+ };
77
+ const alignNodesHorizontal = (nodeIds, alignment = "left") => {
78
+ const targetNodeIds = nodeIds || nodes.value.filter((n) => n.selected).map((n) => n.id);
79
+ if (targetNodeIds.length < 2) return;
80
+ const targetNodes = nodes.value.filter((n) => targetNodeIds.includes(n.id));
81
+ let referenceX;
82
+ if (alignment === "left") {
83
+ referenceX = Math.min(...targetNodes.map((n) => n.position.x));
84
+ } else if (alignment === "right") {
85
+ referenceX = Math.max(...targetNodes.map((n) => n.position.x + (n.width || 200)));
86
+ } else {
87
+ const centers = targetNodes.map((n) => n.position.x + (n.width || 200) / 2);
88
+ referenceX = centers.reduce((a, b) => a + b, 0) / centers.length;
89
+ }
90
+ targetNodes.forEach((node) => {
91
+ const nodeIndex = nodes.value.findIndex((n) => n.id === node.id);
92
+ if (nodeIndex >= 0) {
93
+ let newX;
94
+ if (alignment === "left") {
95
+ newX = referenceX;
96
+ } else if (alignment === "right") {
97
+ newX = referenceX - (node.width || 200);
98
+ } else {
99
+ newX = referenceX - (node.width || 200) / 2;
100
+ }
101
+ nodes.value[nodeIndex] = {
102
+ ...nodes.value[nodeIndex],
103
+ position: { ...nodes.value[nodeIndex].position, x: newX }
104
+ };
105
+ }
106
+ });
107
+ };
108
+ const alignNodesVertical = (nodeIds, alignment = "top") => {
109
+ const targetNodeIds = nodeIds || nodes.value.filter((n) => n.selected).map((n) => n.id);
110
+ if (targetNodeIds.length < 2) return;
111
+ const targetNodes = nodes.value.filter((n) => targetNodeIds.includes(n.id));
112
+ let referenceY;
113
+ if (alignment === "top") {
114
+ referenceY = Math.min(...targetNodes.map((n) => n.position.y));
115
+ } else if (alignment === "bottom") {
116
+ referenceY = Math.max(...targetNodes.map((n) => n.position.y + (n.height || 50)));
117
+ } else {
118
+ const middles = targetNodes.map((n) => n.position.y + (n.height || 50) / 2);
119
+ referenceY = middles.reduce((a, b) => a + b, 0) / middles.length;
120
+ }
121
+ targetNodes.forEach((node) => {
122
+ const nodeIndex = nodes.value.findIndex((n) => n.id === node.id);
123
+ if (nodeIndex >= 0) {
124
+ let newY;
125
+ if (alignment === "top") {
126
+ newY = referenceY;
127
+ } else if (alignment === "bottom") {
128
+ newY = referenceY - (node.height || 50);
129
+ } else {
130
+ newY = referenceY - (node.height || 50) / 2;
131
+ }
132
+ nodes.value[nodeIndex] = {
133
+ ...nodes.value[nodeIndex],
134
+ position: { ...nodes.value[nodeIndex].position, y: newY }
135
+ };
136
+ }
137
+ });
138
+ };
139
+ return {
140
+ distributeHorizontally,
141
+ distributeVertically,
142
+ alignNodesHorizontal,
143
+ alignNodesVertical
144
+ };
145
+ }