@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,413 @@
1
+ <script setup>
2
+ import { ref, watch, computed } from "vue";
3
+ const props = defineProps({
4
+ node: { type: [Object, null], required: true },
5
+ visible: { type: Boolean, required: true }
6
+ });
7
+ const emit = defineEmits(["update", "close"]);
8
+ const localNode = ref({
9
+ label: "",
10
+ description: ""
11
+ });
12
+ const isAiWorkflowNode = computed(() => {
13
+ if (!props.node) return false;
14
+ const type = props.node.type;
15
+ return type?.startsWith("ai-");
16
+ });
17
+ const isAiLlmNode = computed(() => props.node?.type === "ai-llm");
18
+ const isAiPromptNode = computed(() => props.node?.type === "ai-prompt");
19
+ const isAiAgentNode = computed(() => props.node?.type === "ai-agent");
20
+ const isAiToolNode = computed(() => props.node?.type === "ai-tool");
21
+ const isAiConditionNode = computed(() => props.node?.type === "ai-condition");
22
+ const isAiMemoryNode = computed(() => props.node?.type === "ai-memory");
23
+ const llmModels = [
24
+ { value: "gpt-4", label: "GPT-4" },
25
+ { value: "gpt-4-turbo", label: "GPT-4 Turbo" },
26
+ { value: "gpt-3.5-turbo", label: "GPT-3.5 Turbo" },
27
+ { value: "claude-3-opus", label: "Claude 3 Opus" },
28
+ { value: "claude-3-sonnet", label: "Claude 3 Sonnet" },
29
+ { value: "claude-3-haiku", label: "Claude 3 Haiku" }
30
+ ];
31
+ const availableTools = [
32
+ { value: "search", label: "\u{1F50D} \u641C\u7D22" },
33
+ { value: "calculator", label: "\u{1F9EE} \u8BA1\u7B97\u5668" },
34
+ { value: "weather", label: "\u{1F324}\uFE0F \u5929\u6C14\u67E5\u8BE2" },
35
+ { value: "code_interpreter", label: "\u{1F4BB} \u4EE3\u7801\u6267\u884C" },
36
+ { value: "web_fetch", label: "\u{1F310} \u7F51\u9875\u83B7\u53D6" }
37
+ ];
38
+ const memoryTypes = [
39
+ { value: "short", label: "\u77ED\u671F\u8BB0\u5FC6" },
40
+ { value: "long", label: "\u957F\u671F\u8BB0\u5FC6" },
41
+ { value: "session", label: "\u4F1A\u8BDD\u8BB0\u5FC6" }
42
+ ];
43
+ watch(
44
+ () => props.node,
45
+ (node) => {
46
+ if (node) {
47
+ const data = node.data;
48
+ const displayLabel = data.label || data.title || data.name || data.text || node.id;
49
+ localNode.value = {
50
+ label: String(displayLabel),
51
+ description: data.description || data.desc || "",
52
+ style: { ...node.style },
53
+ width: node.width,
54
+ height: node.height,
55
+ type: node.type,
56
+ // AI workflow fields - explicitly cast to correct types
57
+ model: data?.model || "gpt-4",
58
+ prompt: data?.prompt || "",
59
+ temperature: data?.temperature ?? 0.7,
60
+ maxTokens: data?.maxTokens ?? 2e3,
61
+ tools: data?.tools || [],
62
+ toolName: data?.toolName || "",
63
+ condition: data?.condition || "",
64
+ memoryType: data?.memoryType || "short",
65
+ status: data?.status || "pending",
66
+ streamOutput: data?.streamOutput || ""
67
+ };
68
+ }
69
+ },
70
+ { immediate: true }
71
+ );
72
+ const updateField = (field, value) => {
73
+ const updateData = { ...props.node?.data };
74
+ updateData[field] = value;
75
+ emit("update", { data: updateData });
76
+ };
77
+ const handleLabelBlur = () => {
78
+ if (!props.node) return;
79
+ const data = { ...props.node.data };
80
+ if ("label" in data || !("title" in data || "name" in data || "text" in data)) {
81
+ data.label = localNode.value.label;
82
+ } else if ("title" in data) {
83
+ data.title = localNode.value.label;
84
+ } else if ("name" in data) {
85
+ data.name = localNode.value.label;
86
+ } else if ("text" in data) {
87
+ data.text = localNode.value.label;
88
+ }
89
+ emit("update", { data });
90
+ };
91
+ const handleModelChange = (event) => {
92
+ const value = event.target.value;
93
+ updateField("model", value);
94
+ };
95
+ const handlePromptBlur = () => {
96
+ updateField("prompt", localNode.value.prompt);
97
+ };
98
+ const handleTemperatureChange = (event) => {
99
+ const value = parseFloat(event.target.value);
100
+ updateField("temperature", value);
101
+ };
102
+ const handleMaxTokensChange = (event) => {
103
+ const value = parseInt(event.target.value);
104
+ updateField("maxTokens", value);
105
+ };
106
+ const toggleTool = (toolValue) => {
107
+ const currentTools = localNode.value.tools || [];
108
+ const newTools = currentTools.includes(toolValue) ? currentTools.filter((t) => t !== toolValue) : [...currentTools, toolValue];
109
+ localNode.value.tools = newTools;
110
+ updateField("tools", newTools);
111
+ };
112
+ const handleToolNameBlur = () => {
113
+ updateField("toolName", localNode.value.toolName);
114
+ };
115
+ const handleConditionBlur = () => {
116
+ updateField("condition", localNode.value.condition);
117
+ };
118
+ const handleMemoryTypeChange = (event) => {
119
+ const value = event.target.value;
120
+ updateField("memoryType", value);
121
+ };
122
+ const handleClose = () => {
123
+ emit("close");
124
+ };
125
+ const updateStyle = (key, value) => {
126
+ const newStyle = { ...props.node?.style, [key]: value };
127
+ emit("update", { style: newStyle });
128
+ };
129
+ const updateSize = () => {
130
+ emit("update", {
131
+ width: localNode.value.width,
132
+ height: localNode.value.height
133
+ });
134
+ };
135
+ const colors = [
136
+ "#fff",
137
+ "#f8f9fa",
138
+ "#e9ecef",
139
+ "#dee2e6",
140
+ "#ced4da",
141
+ "#3b82f6",
142
+ "#10b981",
143
+ "#f59e0b",
144
+ "#ef4444",
145
+ "#8b5cf6"
146
+ ];
147
+ const borderColors = [
148
+ "#ddd",
149
+ "#3b82f6",
150
+ "#10b981",
151
+ "#f59e0b",
152
+ "#ef4444",
153
+ "#8b5cf6",
154
+ "#ec4899",
155
+ "#06b6d4"
156
+ ];
157
+ </script>
158
+
159
+ <template>
160
+ <Teleport to="body">
161
+ <Transition name="slide-fade">
162
+ <div v-if="visible && node" class="ai-node-edit-panel">
163
+ <div class="panel-header">
164
+ <span class="panel-title">
165
+ <span v-if="isAiLlmNode">🧠 LLM 配置</span>
166
+ <span v-else-if="isAiPromptNode">💬 提示词配置</span>
167
+ <span v-else-if="isAiAgentNode">🤖 Agent 配置</span>
168
+ <span v-else-if="isAiToolNode">🔧 工具配置</span>
169
+ <span v-else-if="isAiConditionNode">🔀 条件配置</span>
170
+ <span v-else-if="isAiMemoryNode">💾 记忆配置</span>
171
+ <span v-else>编辑节点</span>
172
+ </span>
173
+ <button class="close-btn" @click="handleClose">×</button>
174
+ </div>
175
+
176
+ <div class="panel-content">
177
+ <!-- 通用字段 -->
178
+ <div class="form-group">
179
+ <label>标签</label>
180
+ <input
181
+ v-model="localNode.label"
182
+ type="text"
183
+ placeholder="节点标签"
184
+ @blur="handleLabelBlur"
185
+ @keyup.enter="handleLabelBlur"
186
+ />
187
+ </div>
188
+
189
+ <!-- LLM 节点配置 -->
190
+ <template v-if="isAiLlmNode">
191
+ <div class="form-group">
192
+ <label>模型</label>
193
+ <select :value="localNode.model" class="form-select" @change="handleModelChange">
194
+ <option v-for="model in llmModels" :key="model.value" :value="model.value">
195
+ {{ model.label }}
196
+ </option>
197
+ </select>
198
+ </div>
199
+
200
+ <div class="form-group">
201
+ <label>Temperature ({{ localNode.temperature }})</label>
202
+ <input
203
+ :value="localNode.temperature"
204
+ type="range"
205
+ min="0"
206
+ max="2"
207
+ step="0.1"
208
+ @input="handleTemperatureChange"
209
+ />
210
+ <div class="range-labels">
211
+ <span>精确</span>
212
+ <span>创意</span>
213
+ </div>
214
+ </div>
215
+
216
+ <div class="form-group">
217
+ <label>Max Tokens</label>
218
+ <input
219
+ :value="localNode.maxTokens"
220
+ type="number"
221
+ min="100"
222
+ max="32000"
223
+ @change="handleMaxTokensChange"
224
+ />
225
+ </div>
226
+
227
+ <div class="form-group">
228
+ <label>状态</label>
229
+ <div class="status-badges">
230
+ <span
231
+ class="status-badge"
232
+ :class="{
233
+ active: localNode.status === 'pending',
234
+ 'status-pending': true
235
+ }"
236
+ >○ 待运行</span
237
+ >
238
+ <span
239
+ class="status-badge"
240
+ :class="{
241
+ active: localNode.status === 'running',
242
+ 'status-running': true
243
+ }"
244
+ >● 运行中</span
245
+ >
246
+ <span
247
+ class="status-badge"
248
+ :class="{
249
+ active: localNode.status === 'success',
250
+ 'status-success': true
251
+ }"
252
+ >✓ 成功</span
253
+ >
254
+ <span
255
+ class="status-badge"
256
+ :class="{
257
+ active: localNode.status === 'error',
258
+ 'status-error': true
259
+ }"
260
+ >✗ 错误</span
261
+ >
262
+ </div>
263
+ </div>
264
+
265
+ <!-- 流式输出预览 -->
266
+ <div class="form-group" v-if="localNode.status === 'running'">
267
+ <label>流式输出</label>
268
+ <div class="stream-preview">
269
+ <span class="streaming-cursor">▊</span>
270
+ <span class="stream-text">{{ localNode.streamOutput || "\u6B63\u5728\u751F\u6210..." }}</span>
271
+ </div>
272
+ </div>
273
+ </template>
274
+
275
+ <!-- 提示词节点配置 -->
276
+ <template v-if="isAiPromptNode">
277
+ <div class="form-group">
278
+ <label>提示词内容</label>
279
+ <textarea
280
+ v-model="localNode.prompt"
281
+ placeholder="输入提示词模板,可以使用 &#123;&#123;variable&#125;&#125; 语法"
282
+ rows="6"
283
+ @blur="handlePromptBlur"
284
+ />
285
+ <div class="form-hint">支持 &#123;&#123;variable&#125;&#125; 变量语法</div>
286
+ </div>
287
+ </template>
288
+
289
+ <!-- Agent 节点配置 -->
290
+ <template v-if="isAiAgentNode">
291
+ <div class="form-group">
292
+ <label>选择工具</label>
293
+ <div class="tools-checkboxes">
294
+ <label v-for="tool in availableTools" :key="tool.value" class="tool-checkbox">
295
+ <input
296
+ type="checkbox"
297
+ :checked="localNode.tools?.includes(tool.value)"
298
+ @change="toggleTool(tool.value)"
299
+ />
300
+ <span>{{ tool.label }}</span>
301
+ </label>
302
+ </div>
303
+ </div>
304
+ </template>
305
+
306
+ <!-- 工具节点配置 -->
307
+ <template v-if="isAiToolNode">
308
+ <div class="form-group">
309
+ <label>工具名称</label>
310
+ <input
311
+ v-model="localNode.toolName"
312
+ type="text"
313
+ placeholder="输入工具名称"
314
+ @blur="handleToolNameBlur"
315
+ />
316
+ </div>
317
+ </template>
318
+
319
+ <!-- 条件节点配置 -->
320
+ <template v-if="isAiConditionNode">
321
+ <div class="form-group">
322
+ <label>条件表达式</label>
323
+ <input
324
+ v-model="localNode.condition"
325
+ type="text"
326
+ placeholder="例如: score > 60"
327
+ @blur="handleConditionBlur"
328
+ />
329
+ <div class="form-hint">满足条件走下方输出,不满足走右侧输出</div>
330
+ </div>
331
+ </template>
332
+
333
+ <!-- 记忆节点配置 -->
334
+ <template v-if="isAiMemoryNode">
335
+ <div class="form-group">
336
+ <label>记忆类型</label>
337
+ <select
338
+ :value="localNode.memoryType"
339
+ class="form-select"
340
+ @change="handleMemoryTypeChange"
341
+ >
342
+ <option v-for="mem in memoryTypes" :key="mem.value" :value="mem.value">
343
+ {{ mem.label }}
344
+ </option>
345
+ </select>
346
+ </div>
347
+ </template>
348
+
349
+ <!-- 通用样式配置 -->
350
+ <template v-if="!isAiWorkflowNode">
351
+ <div class="form-group">
352
+ <label>尺寸</label>
353
+ <div class="size-inputs">
354
+ <input
355
+ v-model.number="localNode.width"
356
+ type="number"
357
+ min="50"
358
+ max="800"
359
+ @blur="updateSize"
360
+ />
361
+ <span>×</span>
362
+ <input
363
+ v-model.number="localNode.height"
364
+ type="number"
365
+ min="30"
366
+ max="600"
367
+ @blur="updateSize"
368
+ />
369
+ </div>
370
+ </div>
371
+
372
+ <div class="form-group">
373
+ <label>背景色</label>
374
+ <div class="color-picker">
375
+ <button
376
+ v-for="color in colors"
377
+ :key="color"
378
+ class="color-swatch"
379
+ :class="{
380
+ active: node.style?.backgroundColor === color
381
+ }"
382
+ :style="{
383
+ backgroundColor: color
384
+ }"
385
+ @click="updateStyle('backgroundColor', color)"
386
+ />
387
+ </div>
388
+ </div>
389
+
390
+ <div class="form-group">
391
+ <label>边框颜色</label>
392
+ <div class="color-picker">
393
+ <button
394
+ v-for="color in borderColors"
395
+ :key="color"
396
+ class="color-swatch"
397
+ :style="{
398
+ backgroundColor: color
399
+ }"
400
+ @click="updateStyle('border', `1px solid ${color}`)"
401
+ />
402
+ </div>
403
+ </div>
404
+ </template>
405
+ </div>
406
+ </div>
407
+ </Transition>
408
+ </Teleport>
409
+ </template>
410
+
411
+ <style scoped>
412
+ .ai-node-edit-panel{background:#fff;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,.12);position:fixed;right:20px;top:100px;width:320px;z-index:1000}.panel-header{align-items:center;background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:1px solid #eee;border-radius:12px 12px 0 0;color:#fff;display:flex;justify-content:space-between;padding:14px 18px}.panel-title{font-size:14px;font-weight:600}.close-btn{background:hsla(0,0%,100%,.2);border:none;border-radius:4px;color:#fff;cursor:pointer;font-size:18px;line-height:1;padding:4px 8px}.close-btn:hover{background:hsla(0,0%,100%,.3)}.panel-content{max-height:70vh;overflow-y:auto;padding:18px}.form-group{margin-bottom:18px}.form-group label{color:#374151;display:block;font-size:12px;font-weight:500;margin-bottom:6px}.form-group input[type=number],.form-group input[type=text],.form-group textarea,.form-select{border:1px solid #d1d5db;border-radius:6px;box-sizing:border-box;font-size:13px;padding:10px 12px;transition:border-color .2s,box-shadow .2s;width:100%}.form-group input:focus,.form-group textarea:focus,.form-select:focus{border-color:#8b5cf6;box-shadow:0 0 0 3px rgba(139,92,246,.1);outline:none}.form-group textarea{font-family:Monaco,Consolas,monospace;resize:vertical}.form-hint{color:#9ca3af;font-size:11px;margin-top:4px}.form-group input[type=range]{width:100%}.range-labels{color:#9ca3af;display:flex;font-size:11px;justify-content:space-between;margin-top:4px}.status-badges{display:flex;flex-wrap:wrap;gap:8px}.status-badge{border-radius:12px;cursor:pointer;font-size:12px;opacity:.5;padding:4px 10px;transition:all .2s}.status-badge.active{opacity:1}.status-badge.status-pending{background:#f3f4f6;color:#6b7280}.status-badge.status-running{background:#fef3c7;color:#d97706}.status-badge.status-success{background:#d1fae5;color:#059669}.status-badge.status-error{background:#fee2e2;color:#dc2626}.stream-preview{background:#1f2937;border-radius:6px;color:#10b981;font-family:monospace;font-size:12px;min-height:60px;padding:12px}.streaming-cursor{animation:blink 1s infinite}@keyframes blink{0%,50%{opacity:1}51%,to{opacity:0}}.tools-checkboxes{display:flex;flex-direction:column;gap:8px}.tool-checkbox{align-items:center;cursor:pointer;display:flex;font-size:13px;gap:8px}.tool-checkbox input{width:auto}.size-inputs{align-items:center;display:flex;gap:8px}.size-inputs input{flex:1}.size-inputs span{color:#9ca3af}.color-picker{display:flex;flex-wrap:wrap;gap:6px}.color-swatch{border:2px solid transparent;border-radius:6px;cursor:pointer;height:28px;padding:0;transition:transform .2s;width:28px}.color-swatch:hover{transform:scale(1.1)}.color-swatch.active{border-color:#8b5cf6}.slide-fade-enter-active,.slide-fade-leave-active{transition:all .3s ease}.slide-fade-enter-from,.slide-fade-leave-to{opacity:0;transform:translateX(20px)}
413
+ </style>
@@ -0,0 +1,13 @@
1
+ import type { Node, NodeData } from '../types';
2
+ type __VLS_Props = {
3
+ node: Node | null;
4
+ visible: boolean;
5
+ };
6
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
7
+ close: () => any;
8
+ update: (node: Partial<Node<NodeData>>) => any;
9
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
10
+ onClose?: (() => any) | undefined;
11
+ onUpdate?: ((node: Partial<Node<NodeData>>) => any) | undefined;
12
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ export default _default;
@@ -0,0 +1,14 @@
1
+ import type { Edge, EdgeTypes } from '../types';
2
+ type __VLS_Props = {
3
+ edge: Edge | null;
4
+ visible: boolean;
5
+ edgeTypes?: EdgeTypes;
6
+ };
7
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
8
+ close: () => any;
9
+ update: (edge: Partial<Edge<import("../types").EdgeData>>) => any;
10
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
11
+ onClose?: (() => any) | undefined;
12
+ onUpdate?: ((edge: Partial<Edge<import("../types").EdgeData>>) => any) | undefined;
13
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ export default _default;
@@ -0,0 +1,205 @@
1
+ <script setup>
2
+ import { ref, watch, computed } from "vue";
3
+ import { getAllCustomEdges, getAllEdgeTemplates } from "../utils/custom-types";
4
+ const props = defineProps({
5
+ edge: { type: [Object, null], required: true },
6
+ visible: { type: Boolean, required: true },
7
+ edgeTypes: { type: Object, required: false }
8
+ });
9
+ const emit = defineEmits(["update", "close"]);
10
+ const localEdge = ref({});
11
+ watch(
12
+ () => props.edge,
13
+ (edge) => {
14
+ if (edge) {
15
+ localEdge.value = {
16
+ label: edge.label || "",
17
+ type: edge.type || "bezier",
18
+ animated: edge.animated || false,
19
+ style: { ...edge.style },
20
+ labelStyle: { ...edge.labelStyle },
21
+ labelColor: edge.labelColor || "#000000",
22
+ labelShowBg: !!edge.labelShowBg,
23
+ labelBgColor: edge.labelBgColor || "#ffffff"
24
+ };
25
+ }
26
+ },
27
+ { immediate: true }
28
+ );
29
+ const updateLabel = () => {
30
+ emit("update", { label: localEdge.value.label });
31
+ };
32
+ const updateType = () => {
33
+ emit("update", { type: localEdge.value.type });
34
+ };
35
+ const updateAnimated = () => {
36
+ emit("update", { animated: localEdge.value.animated });
37
+ };
38
+ const updateStyle = (key, value) => {
39
+ const newStyle = { ...props.edge?.style, [key]: value };
40
+ emit("update", { style: newStyle });
41
+ };
42
+ const updateLabelColor = (color) => {
43
+ localEdge.value.labelColor = color;
44
+ emit("update", { labelColor: color });
45
+ };
46
+ const updateLabelBg = (color) => {
47
+ if (color === null) {
48
+ localEdge.value.labelShowBg = false;
49
+ emit("update", { labelShowBg: false });
50
+ } else {
51
+ localEdge.value.labelShowBg = true;
52
+ localEdge.value.labelBgColor = color;
53
+ emit("update", { labelShowBg: true, labelBgColor: color });
54
+ }
55
+ };
56
+ const handleClose = () => {
57
+ emit("close");
58
+ };
59
+ const handleStrokeWidth = (event) => {
60
+ const value = parseFloat(event.target.value);
61
+ updateStyle("strokeWidth", value);
62
+ };
63
+ const allEdgeTypes = computed(() => {
64
+ const typeMap = /* @__PURE__ */ new Map();
65
+ const presets = [
66
+ { value: "bezier", label: "\u8D1D\u585E\u5C14\u66F2\u7EBF" },
67
+ { value: "smoothstep", label: "\u5E73\u6ED1\u9636\u68AF" },
68
+ { value: "step", label: "\u9636\u68AF" },
69
+ { value: "straight", label: "\u76F4\u7EBF" }
70
+ ];
71
+ presets.forEach((p) => typeMap.set(p.value, p));
72
+ getAllCustomEdges().forEach((e) => {
73
+ if (!typeMap.has(e.type)) {
74
+ typeMap.set(e.type, { value: e.type, label: e.label || `\u81EA\u5B9A\u4E49: ${e.type}` });
75
+ }
76
+ });
77
+ getAllEdgeTemplates().forEach((t) => {
78
+ if (!typeMap.has(t.type)) {
79
+ typeMap.set(t.type, { value: t.type, label: t.label || `\u6A21\u677F: ${t.type}` });
80
+ }
81
+ });
82
+ if (props.edgeTypes) {
83
+ Object.keys(props.edgeTypes).forEach((type) => {
84
+ if (!typeMap.has(type)) {
85
+ typeMap.set(type, { value: type, label: `\u5C40\u90E8\u7EC4\u4EF6: ${type}` });
86
+ }
87
+ });
88
+ }
89
+ if (props.edge?.type && !typeMap.has(props.edge.type)) {
90
+ typeMap.set(props.edge.type, { value: props.edge.type, label: `\u672A\u77E5\u7C7B\u578B: ${props.edge.type}` });
91
+ }
92
+ return Array.from(typeMap.values());
93
+ });
94
+ </script>
95
+
96
+ <template>
97
+ <Teleport to="body">
98
+ <Transition name="slide-fade">
99
+ <div v-if="visible && edge" class="edge-edit-panel">
100
+ <div class="panel-header">
101
+ <span class="panel-title">编辑连线</span>
102
+ <button class="close-btn" @click="handleClose">×</button>
103
+ </div>
104
+
105
+ <div class="panel-content">
106
+ <div class="form-group">
107
+ <label>标签</label>
108
+ <input
109
+ v-model="localEdge.label"
110
+ type="text"
111
+ placeholder="连线标签"
112
+ @blur="updateLabel"
113
+ @keyup.enter="updateLabel"
114
+ />
115
+ </div>
116
+
117
+ <div class="form-group">
118
+ <label>连线类型</label>
119
+ <select v-model="localEdge.type" @change="updateType">
120
+ <option v-for="t in allEdgeTypes" :key="t.value" :value="t.value">
121
+ {{ t.label }}
122
+ </option>
123
+ </select>
124
+ </div>
125
+
126
+ <div class="form-group">
127
+ <label class="checkbox-label">
128
+ <input v-model="localEdge.animated" type="checkbox" @change="updateAnimated" />
129
+ 动画连线
130
+ </label>
131
+ </div>
132
+
133
+ <div class="form-group">
134
+ <label>线条颜色</label>
135
+ <div class="color-picker-row">
136
+ <input
137
+ type="color"
138
+ :value="edge.style?.stroke || '#b1b1b7'"
139
+ class="modern-color-picker"
140
+ @input="e => updateStyle('stroke', e.target.value)"
141
+ />
142
+ <span class="color-value">{{ edge.style?.stroke || "#b1b1b7" }}</span>
143
+ </div>
144
+ </div>
145
+
146
+ <div class="form-group">
147
+ <label>线条宽度</label>
148
+ <input
149
+ :value="edge.style?.strokeWidth || 1.5"
150
+ type="range"
151
+ min="1"
152
+ max="6"
153
+ step="0.5"
154
+ @input="handleStrokeWidth"
155
+ />
156
+ </div>
157
+
158
+ <div class="form-group">
159
+ <label>标签文字颜色</label>
160
+ <div class="color-picker-row">
161
+ <input
162
+ type="color"
163
+ :value="localEdge.labelColor"
164
+ class="modern-color-picker"
165
+ @input="e => updateLabelColor(e.target.value)"
166
+ />
167
+ <span class="color-value">{{ localEdge.labelColor }}</span>
168
+ </div>
169
+ </div>
170
+
171
+ <div class="form-group">
172
+ <label>标签背景颜色</label>
173
+ <div class="color-picker-row">
174
+ <button
175
+ class="color-swatch none-swatch"
176
+ :class="{
177
+ active: !localEdge.labelShowBg
178
+ }"
179
+ @click="updateLabelBg(null)"
180
+ >
181
+ ×
182
+ </button>
183
+ <template v-if="localEdge.labelShowBg">
184
+ <input
185
+ type="color"
186
+ v-model="localEdge.labelBgColor"
187
+ class="modern-color-picker"
188
+ @input="updateLabelBg(localEdge.labelBgColor || '#ffffff')"
189
+ />
190
+ <span class="color-value">{{ localEdge.labelBgColor }}</span>
191
+ </template>
192
+ <button v-else class="add-bg-btn" @click="updateLabelBg('#ffffff')">
193
+ 启用背景
194
+ </button>
195
+ </div>
196
+ </div>
197
+ </div>
198
+ </div>
199
+ </Transition>
200
+ </Teleport>
201
+ </template>
202
+
203
+ <style scoped>
204
+ .edge-edit-panel{background:#fff;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.15);position:fixed;right:20px;top:100px;width:280px;z-index:1000}.panel-header{align-items:center;border-bottom:1px solid #eee;display:flex;justify-content:space-between;padding:12px 16px}.panel-title{color:#333;font-size:14px;font-weight:600}.close-btn{background:none;border:none;color:#999;cursor:pointer;font-size:20px;line-height:1;padding:0}.close-btn:hover{color:#333}.panel-content{max-height:70vh;overflow-y:auto;padding:16px}.form-group{margin-bottom:16px}.form-group label{color:#666;display:block;font-size:12px;margin-bottom:6px}.form-group input[type=text],.form-group select{border:1px solid #ddd;border-radius:4px;box-sizing:border-box;font-size:13px;padding:8px 10px;width:100%}.form-group input:focus,.form-group select:focus{border-color:#3b82f6;outline:none}.checkbox-label{align-items:center;cursor:pointer;display:flex!important;gap:8px}.checkbox-label input[type=checkbox]{width:auto}.color-picker-row{align-items:center;display:flex;gap:12px}.modern-color-picker{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:none;cursor:pointer;height:36px;padding:0;width:36px}.modern-color-picker::-webkit-color-swatch{border:1px solid #e2e8f0;border-radius:6px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.modern-color-picker::-moz-color-swatch{border:1px solid #e2e8f0;border-radius:6px}.color-value{color:#64748b;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px;text-transform:uppercase}.add-bg-btn{background:#fff;border:1px solid #3b82f6;border-radius:4px;color:#3b82f6;cursor:pointer;font-size:12px;padding:6px 12px;transition:all .2s}.add-bg-btn:hover{background:#eff6ff;border-color:#2563eb;color:#2563eb}.color-swatch{border:2px solid transparent;border-radius:4px;cursor:pointer;height:32px;padding:0;width:32px}.color-swatch.active{border-color:#3b82f6!important;box-shadow:0 0 0 2px rgba(59,130,246,.3)}.none-swatch{align-items:center;background:#f8f9fa;border:1px dashed #ccc!important;color:#999;display:flex;font-size:16px;font-weight:700;justify-content:center}.form-group input[type=range]{width:100%}.form-group input[type=color]{border:1px solid #ddd;border-radius:4px;cursor:pointer;height:32px;padding:2px;width:100%}.slide-fade-enter-active,.slide-fade-leave-active{transition:all .3s ease}.slide-fade-enter-from,.slide-fade-leave-to{opacity:0;transform:translateX(20px)}
205
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { Edge, EdgeTypes } from '../types';
2
+ type __VLS_Props = {
3
+ edge: Edge | null;
4
+ visible: boolean;
5
+ edgeTypes?: EdgeTypes;
6
+ };
7
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
8
+ close: () => any;
9
+ update: (edge: Partial<Edge<import("../types").EdgeData>>) => any;
10
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
11
+ onClose?: (() => any) | undefined;
12
+ onUpdate?: ((edge: Partial<Edge<import("../types").EdgeData>>) => any) | undefined;
13
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ export default _default;
@@ -0,0 +1,13 @@
1
+ import type { Node, NodeData } from '../types';
2
+ type __VLS_Props = {
3
+ node: Node | null;
4
+ visible: boolean;
5
+ };
6
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
7
+ close: () => any;
8
+ update: (node: Partial<Node<NodeData>>) => any;
9
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
10
+ onClose?: (() => any) | undefined;
11
+ onUpdate?: ((node: Partial<Node<NodeData>>) => any) | undefined;
12
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ export default _default;