@likec4/diagram 1.55.1 → 1.57.0

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 (384) hide show
  1. package/dist/LikeC4Diagram.js +150 -194
  2. package/dist/LikeC4ModelProvider.js +13 -9
  3. package/dist/LikeC4ProjectsOverview.js +24 -30
  4. package/dist/LikeC4ProjectsProvider.js +33 -26
  5. package/dist/LikeC4Styles.js +40 -57
  6. package/dist/LikeC4View.js +148 -196
  7. package/dist/ReactLikeC4.js +43 -65
  8. package/dist/StaticLikeC4Diagram.js +36 -41
  9. package/dist/_virtual/_rolldown/runtime.js +17 -0
  10. package/dist/adhoc-editor/EditorPanel.js +102 -101
  11. package/dist/adhoc-editor/ElementsTree.js +109 -139
  12. package/dist/adhoc-editor/LikeC4AdHocViewEditor.js +77 -70
  13. package/dist/adhoc-editor/components/Tree.d.ts +2 -2
  14. package/dist/adhoc-editor/components/Tree.js +205 -288
  15. package/dist/adhoc-editor/hooks.js +28 -23
  16. package/dist/adhoc-editor/index.js +2 -1
  17. package/dist/adhoc-editor/state/ActorProvider.js +33 -36
  18. package/dist/adhoc-editor/state/actor.editor.js +148 -186
  19. package/dist/adhoc-editor/state/actor.js +12 -14
  20. package/dist/adhoc-editor/state/actor.layouter.js +49 -65
  21. package/dist/adhoc-editor/state/actor.types.js +19 -23
  22. package/dist/adhoc-editor/state/panel.js +112 -127
  23. package/dist/adhoc-editor/state/utils.js +22 -29
  24. package/dist/adhoc-editor/useElementsTree.js +89 -121
  25. package/dist/base/Background.js +26 -29
  26. package/dist/base/Base.js +34 -41
  27. package/dist/base/BaseXYFlow.js +135 -165
  28. package/dist/base/const.js +18 -19
  29. package/dist/base/updateEdges.js +38 -57
  30. package/dist/base/updateNodes.js +46 -65
  31. package/dist/base-primitives/Markdown.d.ts +1 -1
  32. package/dist/base-primitives/Markdown.js +32 -47
  33. package/dist/base-primitives/NodeHandles.js +39 -49
  34. package/dist/base-primitives/compound/CompoundActionButton.js +49 -69
  35. package/dist/base-primitives/compound/CompoundDetailsButton.js +39 -64
  36. package/dist/base-primitives/compound/CompoundNodeContainer.js +46 -66
  37. package/dist/base-primitives/compound/CompoundTitle.js +15 -12
  38. package/dist/base-primitives/compound/actionbtns.css.js +9 -18
  39. package/dist/base-primitives/edge/EdgeActionButton.js +17 -19
  40. package/dist/base-primitives/edge/EdgeContainer.js +29 -48
  41. package/dist/base-primitives/edge/EdgeLabel.js +44 -65
  42. package/dist/base-primitives/edge/EdgeLabelContainer.js +35 -73
  43. package/dist/base-primitives/edge/EdgeMarkers.js +157 -215
  44. package/dist/base-primitives/edge/EdgePath.js +62 -115
  45. package/dist/base-primitives/element/ElementActionButtons.js +92 -81
  46. package/dist/base-primitives/element/ElementData.js +107 -126
  47. package/dist/base-primitives/element/ElementDetailsButton.js +78 -98
  48. package/dist/base-primitives/element/ElementNodeContainer.js +51 -82
  49. package/dist/base-primitives/element/ElementShape.js +331 -317
  50. package/dist/base-primitives/element/ElementTags.d.ts +1 -1
  51. package/dist/base-primitives/element/ElementTags.js +133 -193
  52. package/dist/base-primitives/memoEdge.js +11 -10
  53. package/dist/base-primitives/memoNode.js +16 -20
  54. package/dist/components/ErrorFallback.js +111 -75
  55. package/dist/components/GithubIcon.js +14 -16
  56. package/dist/components/Link.js +99 -113
  57. package/dist/components/Logo.js +38 -41
  58. package/dist/components/NavigationLink.js +15 -23
  59. package/dist/components/NavigationPanel.js +26 -47
  60. package/dist/components/PortalToContainer.js +16 -10
  61. package/dist/components/RootContainer.js +36 -31
  62. package/dist/components/SearchControl.css.js +65 -75
  63. package/dist/components/SearchControl.js +36 -14
  64. package/dist/components/ViewNotFound.js +22 -29
  65. package/dist/context/CurrentViewModelProvider.js +11 -9
  66. package/dist/context/DefaultMantineProvider.js +45 -72
  67. package/dist/context/DiagramEventHandlers.js +43 -48
  68. package/dist/context/DiagramFeatures.d.ts +1 -1
  69. package/dist/context/DiagramFeatures.js +78 -69
  70. package/dist/context/EnsureMantine.js +13 -16
  71. package/dist/context/FramerMotionConfig.js +17 -11
  72. package/dist/context/IconRenderer.js +90 -106
  73. package/dist/context/LikeC4ModelContext.js +14 -10
  74. package/dist/context/LikeC4ProjectsContext.js +7 -6
  75. package/dist/context/RootContainerContext.d.ts +9 -19
  76. package/dist/context/RootContainerContext.js +14 -28
  77. package/dist/context/TagStylesContext.js +49 -57
  78. package/dist/custom/customNodes.js +224 -28
  79. package/dist/custom/index.d.ts +1 -1
  80. package/dist/custom/index.js +40 -40
  81. package/dist/editor/LikeC4EditorCallbacks.d.ts +5 -0
  82. package/dist/editor/LikeC4EditorCallbacks.js +4 -2
  83. package/dist/editor/LikeC4EditorProvider.js +32 -7
  84. package/dist/editor/actor/actions.d.ts +115 -0
  85. package/dist/editor/actor/actions.js +122 -0
  86. package/dist/editor/{hotkeyActor.d.ts → actor/hotkey.d.ts} +1 -1
  87. package/dist/editor/actor/hotkey.js +20 -0
  88. package/dist/editor/actor/machine.d.ts +11 -0
  89. package/dist/editor/actor/machine.js +22 -0
  90. package/dist/editor/{editorActor.setup.d.ts → actor/setup.d.ts} +13 -49
  91. package/dist/editor/actor/setup.js +35 -0
  92. package/dist/editor/actor/state.editor.d.ts +97 -0
  93. package/dist/editor/actor/state.editor.js +55 -0
  94. package/dist/editor/actor/state.sync-queue.d.ts +420 -0
  95. package/dist/editor/actor/state.sync-queue.js +235 -0
  96. package/dist/editor/actor/types.d.ts +59 -0
  97. package/dist/editor/actor/types.js +5 -0
  98. package/dist/editor/applyChangesToManualLayout.js +144 -163
  99. package/dist/editor/index.d.ts +2 -1
  100. package/dist/editor/useEditorActorLogic.d.ts +8 -2
  101. package/dist/editor/useEditorActorLogic.js +51 -43
  102. package/dist/hooks/safeContext.js +17 -17
  103. package/dist/hooks/useCallbackRef.js +18 -11
  104. package/dist/hooks/useCurrentView.js +16 -7
  105. package/dist/hooks/useCurrentViewModel.js +14 -9
  106. package/dist/hooks/useDiagram.js +60 -37
  107. package/dist/hooks/useDiagramCompareLayout.js +77 -81
  108. package/dist/hooks/useEditorActor.d.ts +4 -0
  109. package/dist/hooks/useEditorActor.js +26 -0
  110. package/dist/hooks/useId.js +8 -6
  111. package/dist/hooks/useLikeC4ElementsTree.d.ts +3 -2
  112. package/dist/hooks/useLikeC4ElementsTree.js +24 -21
  113. package/dist/hooks/useLikeC4Model.js +21 -20
  114. package/dist/hooks/useLikeC4Project.js +40 -29
  115. package/dist/hooks/useLikeC4Styles.js +6 -6
  116. package/dist/hooks/useMantinePortalProps.js +10 -6
  117. package/dist/hooks/useSetState.js +21 -19
  118. package/dist/hooks/useUpdateEffect.js +18 -29
  119. package/dist/hooks/useXYFlow.js +13 -15
  120. package/dist/index.js +24 -23
  121. package/dist/likec4diagram/DiagramUI.js +37 -37
  122. package/dist/likec4diagram/DiagramXYFlow.js +215 -224
  123. package/dist/likec4diagram/convert-to-xyflow.js +21 -22
  124. package/dist/likec4diagram/custom/edges/EdgeDrifts.js +22 -32
  125. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +275 -372
  126. package/dist/likec4diagram/custom/edges/SequenceStepEdge.js +71 -75
  127. package/dist/likec4diagram/custom/edges/edges.css.js +41 -47
  128. package/dist/likec4diagram/custom/edges/useControlPoints.js +52 -56
  129. package/dist/likec4diagram/custom/edges/useRelationshipEdgePath.js +54 -76
  130. package/dist/likec4diagram/custom/index.js +17 -17
  131. package/dist/likec4diagram/custom/nodes/CompoundActions.js +19 -26
  132. package/dist/likec4diagram/custom/nodes/ElementActions.js +131 -82
  133. package/dist/likec4diagram/custom/nodes/NodeDrifts.js +20 -26
  134. package/dist/likec4diagram/custom/nodes/NodeNotes.js +215 -273
  135. package/dist/likec4diagram/custom/nodes/SequenceActorNode.js +131 -147
  136. package/dist/likec4diagram/custom/nodes/nodes.js +135 -146
  137. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +155 -159
  138. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +58 -86
  139. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +108 -164
  140. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +56 -68
  141. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +3 -6
  142. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +97 -102
  143. package/dist/likec4diagram/custom/nodes/toolbar/styles.css.js +13 -13
  144. package/dist/likec4diagram/custom/nodes/toolbar/types.js +6 -5
  145. package/dist/likec4diagram/custom/nodes/toolbar/useHandlers.js +36 -41
  146. package/dist/likec4diagram/relationship-popover/RelationshipPopover.js +510 -541
  147. package/dist/likec4diagram/relationship-popover/actor.js +113 -152
  148. package/dist/likec4diagram/relationship-popover/components.js +39 -43
  149. package/dist/likec4diagram/state/DiagramActorProvider.js +135 -136
  150. package/dist/likec4diagram/state/aligners.js +286 -360
  151. package/dist/likec4diagram/state/assign.js +84 -108
  152. package/dist/likec4diagram/state/createViewChange.js +72 -92
  153. package/dist/likec4diagram/state/diagram-api.d.ts +16 -0
  154. package/dist/likec4diagram/state/diagram-api.js +230 -152
  155. package/dist/likec4diagram/state/hotkeyActor.js +54 -45
  156. package/dist/likec4diagram/state/machine.actions.js +708 -821
  157. package/dist/likec4diagram/state/machine.actions.layout.js +154 -183
  158. package/dist/likec4diagram/state/machine.d.ts +1 -1
  159. package/dist/likec4diagram/state/machine.js +113 -134
  160. package/dist/likec4diagram/state/machine.setup.js +104 -113
  161. package/dist/likec4diagram/state/machine.state.initializing.js +54 -54
  162. package/dist/likec4diagram/state/machine.state.navigating.js +192 -227
  163. package/dist/likec4diagram/state/machine.state.ready.focused.js +72 -88
  164. package/dist/likec4diagram/state/machine.state.ready.idle.js +79 -98
  165. package/dist/likec4diagram/state/machine.state.ready.js +126 -202
  166. package/dist/likec4diagram/state/machine.state.ready.printing.js +38 -39
  167. package/dist/likec4diagram/state/machine.state.ready.walkthrough.js +153 -193
  168. package/dist/likec4diagram/state/mediaPrintActor.js +20 -16
  169. package/dist/likec4diagram/state/persistence.js +20 -21
  170. package/dist/likec4diagram/state/types.d.ts +1 -1
  171. package/dist/likec4diagram/state/utils.d.ts +1 -1
  172. package/dist/likec4diagram/state/utils.js +131 -162
  173. package/dist/likec4diagram/ui/LayoutDriftFrame.js +53 -64
  174. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +58 -80
  175. package/dist/likec4diagram/ui/notation/NotationPanel.js +183 -214
  176. package/dist/likec4diagram/useLayoutConstraints.js +388 -433
  177. package/dist/likec4diagram/xyflow-diagram/diagram-view.js +216 -227
  178. package/dist/likec4diagram/xyflow-sequence/const.js +11 -7
  179. package/dist/likec4diagram/xyflow-sequence/sequence-layout.js +177 -180
  180. package/dist/navigationpanel/NavigationPanel.js +113 -123
  181. package/dist/navigationpanel/NavigationPanelControls.js +124 -150
  182. package/dist/navigationpanel/NavigationPanelDropdown.js +365 -477
  183. package/dist/navigationpanel/_common.d.ts +4 -10
  184. package/dist/navigationpanel/_common.js +57 -70
  185. package/dist/navigationpanel/actor.js +153 -236
  186. package/dist/navigationpanel/comparepanel/CompareActionsMenu.js +66 -83
  187. package/dist/navigationpanel/comparepanel/ComparePanel.js +135 -164
  188. package/dist/navigationpanel/comparepanel/ComparePanelControls.js +50 -58
  189. package/dist/navigationpanel/comparepanel/DriftsSummary.js +207 -254
  190. package/dist/navigationpanel/comparepanel/LayoutTypeSwitcher.js +33 -35
  191. package/dist/navigationpanel/controls/DetailsControls.js +219 -246
  192. package/dist/navigationpanel/controls/LayoutWarning.js +89 -100
  193. package/dist/navigationpanel/controls/LogoButton.js +46 -70
  194. package/dist/navigationpanel/controls/NavigationButtons.js +35 -52
  195. package/dist/navigationpanel/controls/OpenSource.js +27 -25
  196. package/dist/navigationpanel/controls/SearchControl.js +50 -61
  197. package/dist/navigationpanel/controls/ToggleReadonly.js +86 -81
  198. package/dist/navigationpanel/dropdown/ProjectsMenu.js +69 -87
  199. package/dist/navigationpanel/editorpanel/ApplySemanticLayout.d.ts +4 -0
  200. package/dist/navigationpanel/editorpanel/ApplySemanticLayout.js +36 -0
  201. package/dist/navigationpanel/editorpanel/CenterCamera.js +17 -13
  202. package/dist/navigationpanel/editorpanel/ChangeAutoLayoutButton.js +182 -154
  203. package/dist/navigationpanel/editorpanel/EditorPanel.js +59 -45
  204. package/dist/navigationpanel/editorpanel/ManualLayoutToolsButton.js +122 -173
  205. package/dist/navigationpanel/editorpanel/ToggleReadonly.js +20 -13
  206. package/dist/navigationpanel/editorpanel/_common.d.ts +3 -6
  207. package/dist/navigationpanel/editorpanel/_common.js +13 -13
  208. package/dist/navigationpanel/editorpanel/styles.js +58 -75
  209. package/dist/navigationpanel/hooks.js +35 -29
  210. package/dist/navigationpanel/styles.css.js +20 -28
  211. package/dist/navigationpanel/walkthrough/ActiveWalkthroughControls.js +107 -134
  212. package/dist/navigationpanel/walkthrough/DynamicViewControls.d.ts +65 -65
  213. package/dist/navigationpanel/walkthrough/DynamicViewControls.js +105 -120
  214. package/dist/navigationpanel/walkthrough/WalkthroughPanel.js +75 -83
  215. package/dist/overlays/Overlays.js +94 -112
  216. package/dist/overlays/element-details/ElementDetails.js +22 -28
  217. package/dist/overlays/element-details/ElementDetailsCard.css.js +198 -221
  218. package/dist/overlays/element-details/ElementDetailsCard.js +517 -499
  219. package/dist/overlays/element-details/MetadataValue.js +210 -250
  220. package/dist/overlays/element-details/TabPanelDeployments.css.js +40 -60
  221. package/dist/overlays/element-details/TabPanelDeployments.js +185 -178
  222. package/dist/overlays/element-details/TabPanelRelationships.css.js +63 -71
  223. package/dist/overlays/element-details/TabPanelRelationships.js +155 -140
  224. package/dist/overlays/element-details/TabPanelStructure.css.js +29 -33
  225. package/dist/overlays/element-details/TabPanelStructure.js +93 -93
  226. package/dist/overlays/element-details/actor.js +45 -55
  227. package/dist/overlays/element-details/actorContext.js +12 -10
  228. package/dist/overlays/overlay/Overlay.d.ts +16 -0
  229. package/dist/overlays/overlay/Overlay.js +102 -151
  230. package/dist/overlays/overlaysActor.js +215 -265
  231. package/dist/overlays/relationship-details/RelationshipDetails.js +270 -253
  232. package/dist/overlays/relationship-details/SelectEdge.css.js +62 -74
  233. package/dist/overlays/relationship-details/SelectEdge.js +146 -126
  234. package/dist/overlays/relationship-details/actor.js +242 -303
  235. package/dist/overlays/relationship-details/compute.js +109 -135
  236. package/dist/overlays/relationship-details/custom/ElementActions.js +43 -56
  237. package/dist/overlays/relationship-details/custom/edgeTypes.js +43 -49
  238. package/dist/overlays/relationship-details/custom/nodeTypes.d.ts +4 -5
  239. package/dist/overlays/relationship-details/custom/nodeTypes.js +96 -121
  240. package/dist/overlays/relationship-details/hooks.js +44 -38
  241. package/dist/overlays/relationship-details/layout-to-xyflow.js +119 -141
  242. package/dist/overlays/relationship-details/layout.js +275 -304
  243. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +319 -321
  244. package/dist/overlays/relationships-browser/SelectElement.css.js +18 -21
  245. package/dist/overlays/relationships-browser/SelectElement.js +192 -218
  246. package/dist/overlays/relationships-browser/actor.js +364 -462
  247. package/dist/overlays/relationships-browser/const.js +7 -6
  248. package/dist/overlays/relationships-browser/custom/ElementActions.js +60 -63
  249. package/dist/overlays/relationships-browser/custom/EmptyNode.js +25 -29
  250. package/dist/overlays/relationships-browser/custom/edgeTypes.js +66 -99
  251. package/dist/overlays/relationships-browser/custom/nodeTypes.js +98 -123
  252. package/dist/overlays/relationships-browser/hooks.js +49 -51
  253. package/dist/overlays/relationships-browser/layout.js +413 -465
  254. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +141 -157
  255. package/dist/projects-overview/ProjectsOverview.js +56 -55
  256. package/dist/projects-overview/ProjectsOverviewXY.js +105 -94
  257. package/dist/projects-overview/actor.js +252 -345
  258. package/dist/projects-overview/context.js +8 -7
  259. package/dist/projects-overview/custom/edgeTypes.js +22 -21
  260. package/dist/projects-overview/custom/nodeTypes.js +38 -42
  261. package/dist/projects-overview/hooks.js +9 -9
  262. package/dist/projects-overview/layouted-to-xyflow.js +46 -42
  263. package/dist/projects-overview/panel/ProjectsOverviewPanel.js +7 -9
  264. package/dist/projects-overview/persistence.js +22 -22
  265. package/dist/search/Search.d.ts +6 -3
  266. package/dist/search/Search.js +189 -182
  267. package/dist/search/SearchContext.js +16 -15
  268. package/dist/search/XStateSearchAdapter.js +68 -62
  269. package/dist/search/components/ElementsColumn.css.js +50 -68
  270. package/dist/search/components/ElementsColumn.js +253 -291
  271. package/dist/search/components/PickView.js +116 -140
  272. package/dist/search/components/SearchByTags.js +76 -94
  273. package/dist/search/components/SearchInput.js +187 -209
  274. package/dist/search/components/ViewsColum.js +151 -141
  275. package/dist/search/components/ViewsColumn.css.js +12 -26
  276. package/dist/search/components/_shared.css.js +127 -153
  277. package/dist/search/components/styles.css.js +47 -53
  278. package/dist/search/components/utils.js +44 -47
  279. package/dist/search/hooks.js +10 -10
  280. package/dist/search/searchActor.js +97 -128
  281. package/dist/shadowroot/ShadowRoot.d.ts +7 -6
  282. package/dist/shadowroot/ShadowRoot.js +106 -79
  283. package/dist/shadowroot/styles.css.d.ts +10 -2
  284. package/dist/shadowroot/styles.css.js +56 -69
  285. package/dist/styles-font2.js +4 -0
  286. package/dist/styles2.js +4 -0
  287. package/dist/utils/index.js +5 -0
  288. package/dist/utils/roundDpr.js +19 -15
  289. package/dist/utils/view-bounds.js +48 -55
  290. package/dist/utils/xyflow.js +143 -113
  291. package/package.json +18 -25
  292. package/panda.buildinfo.json +15 -15
  293. package/src/styles-font.css +114 -0
  294. package/src/styles-min.css +2 -0
  295. package/src/styles-xyflow.css +1 -0
  296. package/src/styles.css +3 -0
  297. package/styles-font.css +1 -1
  298. package/styles-min.css +1 -1
  299. package/styles-xyflow.css +1 -1
  300. package/styles.css +1 -1
  301. package/dist/_virtual/_commonjsHelpers.js +0 -3
  302. package/dist/_virtual/assign-f10db67b.cjs.js +0 -3
  303. package/dist/_virtual/log-30abbb83.cjs.js +0 -3
  304. package/dist/_virtual/raise-f051f097.cjs.js +0 -3
  305. package/dist/_virtual/store-cfe7da62.cjs.js +0 -3
  306. package/dist/_virtual/xstate-actions.cjs.js +0 -5
  307. package/dist/_virtual/xstate-actions.cjs2.js +0 -3
  308. package/dist/_virtual/xstate-dev.cjs.js +0 -3
  309. package/dist/_virtual/xstate-guards.cjs.js +0 -5
  310. package/dist/_virtual/xstate-guards.cjs2.js +0 -3
  311. package/dist/_virtual/xstate-store-react.cjs.js +0 -5
  312. package/dist/_virtual/xstate-store-react.cjs2.js +0 -3
  313. package/dist/bundle/index.d.ts +0 -1
  314. package/dist/editor/editorActor.actions.d.ts +0 -153
  315. package/dist/editor/editorActor.actions.js +0 -149
  316. package/dist/editor/editorActor.setup.js +0 -38
  317. package/dist/editor/editorActor.states.d.ts +0 -9
  318. package/dist/editor/editorActor.states.js +0 -273
  319. package/dist/editor/hotkeyActor.js +0 -19
  320. package/dist/hooks/useOverlaysActor.js +0 -10
  321. package/dist/hooks/useSearchActor.js +0 -10
  322. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/createReactComponent.js +0 -41
  323. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.js +0 -30
  324. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertTriangle.js +0 -14
  325. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowDownRight.js +0 -14
  326. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowLeft.js +0 -14
  327. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js +0 -14
  328. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconBolt.js +0 -14
  329. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconBrowser.js +0 -14
  330. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js +0 -14
  331. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.js +0 -14
  332. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js +0 -14
  333. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js +0 -14
  334. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js +0 -14
  335. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconCylinder.js +0 -14
  336. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconDeviceMobile.js +0 -14
  337. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconDirectionSignFilled.js +0 -14
  338. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconExternalLink.js +0 -14
  339. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js +0 -14
  340. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconFileText.js +0 -14
  341. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconFocusCentered.js +0 -14
  342. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconFolderFilled.js +0 -14
  343. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconHelpCircle.js +0 -14
  344. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconId.js +0 -14
  345. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js +0 -14
  346. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignBottom.js +0 -14
  347. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignCenter.js +0 -14
  348. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignLeft.js +0 -14
  349. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignMiddle.js +0 -14
  350. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignRight.js +0 -14
  351. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignTop.js +0 -14
  352. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutBoardSplit.js +0 -14
  353. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutCollage.js +0 -14
  354. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutDashboard.js +0 -14
  355. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLink.js +0 -14
  356. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLock.js +0 -14
  357. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLockOpen2.js +0 -14
  358. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerPlayFilled.js +0 -14
  359. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerSkipBackFilled.js +0 -14
  360. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerSkipForwardFilled.js +0 -14
  361. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerStopFilled.js +0 -14
  362. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconRectangularPrism.js +0 -14
  363. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconReorder.js +0 -14
  364. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconRouteOff.js +0 -14
  365. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js +0 -14
  366. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconSelector.js +0 -14
  367. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconStack2.js +0 -14
  368. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconStarFilled.js +0 -14
  369. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconTarget.js +0 -14
  370. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconTransform.js +0 -14
  371. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js +0 -14
  372. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconUser.js +0 -14
  373. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconX.js +0 -14
  374. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js +0 -14
  375. package/dist/node_modules/.pnpm/@xstate_store@3.17.1_react@19.2.4/node_modules/@xstate/store/dist/store-cfe7da62.cjs.js +0 -761
  376. package/dist/node_modules/.pnpm/@xstate_store@3.17.1_react@19.2.4/node_modules/@xstate/store/react/dist/xstate-store-react.cjs.js +0 -180
  377. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/actions/dist/xstate-actions.cjs.js +0 -37
  378. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dev/dist/xstate-dev.cjs.js +0 -59
  379. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/assign-f10db67b.cjs.js +0 -140
  380. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/log-30abbb83.cjs.js +0 -401
  381. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/raise-f051f097.cjs.js +0 -2830
  382. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/guards/dist/xstate-guards.cjs.js +0 -26
  383. package/dist/styles-font.css2.js +0 -3
  384. package/dist/styles.css2.js +0 -3
@@ -1,442 +1,397 @@
1
- import { DefaultMap, nonNullable } from '@likec4/core';
2
- import { vector, BBox } from '@likec4/core/geometry';
3
- import { invariant, isome } from '@likec4/core/utils';
4
- import { getNodeDimensions } from '@xyflow/system';
5
- import { produce } from 'immer';
6
- import { useRef, useMemo } from 'react';
7
- import { pipe, filter, map, hasAtLeast, flatMap, unique, difference, clamp } from 'remeda';
8
- import '@xstate/react';
9
- import 'fast-equals';
10
- import { useDiagram } from '../hooks/safeContext.js';
11
- import { nodeToRect, bezierControlPoints } from '../utils/xyflow.js';
12
- import { useXYStoreApi } from '../hooks/useXYFlow.js';
13
-
14
- class Rect {
15
- static LeftPadding = 42;
16
- static RightPadding = 42;
17
- static TopPadding = 60;
18
- static BottomPadding = 42;
19
- id;
20
- minX = Infinity;
21
- minY = Infinity;
22
- maxX = -Infinity;
23
- maxY = -Infinity;
24
- // Initial position absolute and dimensions
25
- initial;
26
- get positionAbsolute() {
27
- return {
28
- x: this.minX,
29
- y: this.minY
30
- };
31
- }
32
- set positionAbsolute(pos) {
33
- const x = Math.trunc(pos.x);
34
- const y = Math.trunc(pos.y);
35
- this.maxX += x - this.minX;
36
- this.maxY += y - this.minY;
37
- this.minX = x;
38
- this.minY = y;
39
- }
40
- get dimensions() {
41
- return {
42
- width: Math.ceil(this.maxX - this.minX),
43
- height: Math.ceil(this.maxY - this.minY)
44
- };
45
- }
46
- get diff() {
47
- const { x, y } = this.positionAbsolute;
48
- return {
49
- x: Math.trunc(x - this.initial.x),
50
- y: Math.trunc(y - this.initial.y)
51
- };
52
- }
53
- get isMoved() {
54
- const diff = this.diff;
55
- return diff.x !== 0 || diff.y !== 0;
56
- }
57
- get isResized() {
58
- const dim = this.dimensions;
59
- return dim.width !== this.initial.width || dim.height !== this.initial.height;
60
- }
61
- // Position relative to parent
62
- get position() {
63
- const positionAbsolute = this.positionAbsolute;
64
- if (!this.parent) {
65
- return positionAbsolute;
66
- }
67
- const parentPosition = this.parent.positionAbsolute;
68
- return {
69
- x: positionAbsolute.x - parentPosition.x,
70
- y: positionAbsolute.y - parentPosition.y
71
- };
72
- }
73
- constructor(xynode, parent = null) {
74
- this.id = xynode.id;
75
- this.positionAbsolute = !parent ? xynode.position : {
76
- x: xynode.position.x + parent.minX,
77
- y: xynode.position.y + parent.minY
78
- };
79
- const { width, height } = getNodeDimensions(xynode);
80
- this.maxX = this.minX + Math.ceil(width);
81
- this.maxY = this.minY + Math.ceil(height);
82
- this.initial = {
83
- x: this.minX,
84
- y: this.minY,
85
- width: Math.ceil(width),
86
- height: Math.ceil(height)
87
- };
88
- if (parent) {
89
- parent.children.push(this);
90
- }
91
- }
92
- }
93
- class CompoundRect extends Rect {
94
- constructor(xynode, parent = null) {
95
- super(xynode, parent);
96
- this.parent = parent;
97
- }
98
- children = [];
99
- }
100
- class Leaf extends Rect {
101
- constructor(xynode, parent = null) {
102
- super(xynode, parent);
103
- this.parent = parent;
104
- }
105
- }
1
+ import "../_virtual/_rolldown/runtime.js";
2
+ import { useXYStoreApi } from "../hooks/useXYFlow.js";
3
+ import { bezierControlPoints, nodeToRect as nodeToRect$1 } from "../utils/xyflow.js";
4
+ import { useDiagram } from "../hooks/safeContext.js";
5
+ import { vector as vector$1 } from "../utils/index.js";
6
+ import { useMemo, useRef } from "react";
7
+ import { clamp, difference, filter, flatMap, hasAtLeast, map, pipe, unique } from "remeda";
8
+ import { DefaultMap, nonNullable } from "@likec4/core";
9
+ import { BBox as BBox$1 } from "@likec4/core/geometry";
10
+ import { invariant as invariant$1, isome } from "@likec4/core/utils";
11
+ import { getNodeDimensions } from "@xyflow/system";
12
+ import { produce } from "immer";
13
+ //#region src/likec4diagram/useLayoutConstraints.ts
14
+ var Rect = class {
15
+ static LeftPadding = 42;
16
+ static RightPadding = 42;
17
+ static TopPadding = 60;
18
+ static BottomPadding = 42;
19
+ id;
20
+ minX = Infinity;
21
+ minY = Infinity;
22
+ maxX = -Infinity;
23
+ maxY = -Infinity;
24
+ initial;
25
+ get positionAbsolute() {
26
+ return {
27
+ x: this.minX,
28
+ y: this.minY
29
+ };
30
+ }
31
+ set positionAbsolute(pos) {
32
+ const x = Math.trunc(pos.x);
33
+ const y = Math.trunc(pos.y);
34
+ this.maxX += x - this.minX;
35
+ this.maxY += y - this.minY;
36
+ this.minX = x;
37
+ this.minY = y;
38
+ }
39
+ get dimensions() {
40
+ return {
41
+ width: Math.ceil(this.maxX - this.minX),
42
+ height: Math.ceil(this.maxY - this.minY)
43
+ };
44
+ }
45
+ get diff() {
46
+ const { x, y } = this.positionAbsolute;
47
+ return {
48
+ x: Math.trunc(x - this.initial.x),
49
+ y: Math.trunc(y - this.initial.y)
50
+ };
51
+ }
52
+ get isMoved() {
53
+ const diff = this.diff;
54
+ return diff.x !== 0 || diff.y !== 0;
55
+ }
56
+ get isResized() {
57
+ const dim = this.dimensions;
58
+ return dim.width !== this.initial.width || dim.height !== this.initial.height;
59
+ }
60
+ get position() {
61
+ const positionAbsolute = this.positionAbsolute;
62
+ if (!this.parent) return positionAbsolute;
63
+ const parentPosition = this.parent.positionAbsolute;
64
+ return {
65
+ x: positionAbsolute.x - parentPosition.x,
66
+ y: positionAbsolute.y - parentPosition.y
67
+ };
68
+ }
69
+ constructor(xynode, parent = null) {
70
+ this.id = xynode.id;
71
+ this.positionAbsolute = !parent ? xynode.position : {
72
+ x: xynode.position.x + parent.minX,
73
+ y: xynode.position.y + parent.minY
74
+ };
75
+ const { width, height } = getNodeDimensions(xynode);
76
+ this.maxX = this.minX + Math.ceil(width);
77
+ this.maxY = this.minY + Math.ceil(height);
78
+ this.initial = {
79
+ x: this.minX,
80
+ y: this.minY,
81
+ width: Math.ceil(width),
82
+ height: Math.ceil(height)
83
+ };
84
+ if (parent) parent.children.push(this);
85
+ }
86
+ };
87
+ var CompoundRect = class extends Rect {
88
+ parent;
89
+ children = [];
90
+ constructor(xynode, parent = null) {
91
+ super(xynode, parent);
92
+ this.parent = parent;
93
+ }
94
+ };
95
+ var Leaf = class extends Rect {
96
+ parent;
97
+ constructor(xynode, parent = null) {
98
+ super(xynode, parent);
99
+ this.parent = parent;
100
+ }
101
+ };
102
+ /**
103
+ * Creates a modifier function that moves edge points according to the given rectangle's diff.
104
+ */
106
105
  function makeEdgeModifier(edge, anchor) {
107
- const controlPoints = edge.data.controlPoints ?? null;
108
- return (edgeLookup) => {
109
- const current = nonNullable(edgeLookup.get(edge.id), `Edge ${edge.id} not found`);
110
- const { x: dx, y: dy } = anchor.diff;
111
- if (dx === 0 && dy === 0) {
112
- return {
113
- id: edge.id,
114
- type: "replace",
115
- item: produce(current, (draft) => {
116
- draft.data.points = edge.data.points;
117
- draft.data.controlPoints = controlPoints;
118
- draft.data.labelBBox = edge.data.labelBBox;
119
- })
120
- };
121
- }
122
- return {
123
- id: edge.id,
124
- type: "replace",
125
- item: produce(current, (draft) => {
126
- draft.data.points = map(edge.data.points, (pt) => [pt[0] + dx, pt[1] + dy]);
127
- if (controlPoints) {
128
- draft.data.controlPoints = controlPoints.map((pt) => ({
129
- x: pt.x + dx,
130
- y: pt.y + dy
131
- }));
132
- } else {
133
- draft.data.controlPoints = null;
134
- }
135
- if (edge.data.labelBBox) {
136
- draft.data.labelBBox ??= edge.data.labelBBox;
137
- draft.data.labelBBox.x = edge.data.labelBBox.x + dx;
138
- draft.data.labelBBox.y = edge.data.labelBBox.y + dy;
139
- }
140
- })
141
- };
142
- };
106
+ const controlPoints = edge.data.controlPoints ?? null;
107
+ return (edgeLookup) => {
108
+ const current = nonNullable(edgeLookup.get(edge.id), `Edge ${edge.id} not found`);
109
+ const { x: dx, y: dy } = anchor.diff;
110
+ if (dx === 0 && dy === 0) return {
111
+ id: edge.id,
112
+ type: "replace",
113
+ item: produce(current, (draft) => {
114
+ draft.data.points = edge.data.points;
115
+ draft.data.controlPoints = controlPoints;
116
+ draft.data.labelBBox = edge.data.labelBBox;
117
+ })
118
+ };
119
+ return {
120
+ id: edge.id,
121
+ type: "replace",
122
+ item: produce(current, (draft) => {
123
+ draft.data.points = map(edge.data.points, (pt) => [pt[0] + dx, pt[1] + dy]);
124
+ if (controlPoints) draft.data.controlPoints = controlPoints.map((pt) => ({
125
+ x: pt.x + dx,
126
+ y: pt.y + dy
127
+ }));
128
+ else draft.data.controlPoints = null;
129
+ if (edge.data.labelBBox) {
130
+ draft.data.labelBBox ??= edge.data.labelBBox;
131
+ draft.data.labelBBox.x = edge.data.labelBBox.x + dx;
132
+ draft.data.labelBBox.y = edge.data.labelBBox.y + dy;
133
+ }
134
+ })
135
+ };
136
+ };
143
137
  }
138
+ /**
139
+ * Creates a modifier function that moves edge points when one of its nodes is moved.
140
+ */
144
141
  function makeRelativeEdgeModifier(edge, movingRect, anchorNode, staticNode) {
145
- const controlPoints = edge.data.controlPoints ?? bezierControlPoints(edge.data.points);
146
- const anchorV = vector(BBox.center(anchorNode));
147
- const staticV = vector(BBox.center(staticNode));
148
- const staticToAnchor = anchorV.subtract(staticV);
149
- const staticToAnchorLength = staticToAnchor.length();
150
- return (edgeLookup) => {
151
- const current = nonNullable(edgeLookup.get(edge.id), `Edge ${edge.id} not found`);
152
- const { x: dx, y: dy } = movingRect.diff;
153
- if (dx === 0 && dy === 0) {
154
- return {
155
- id: edge.id,
156
- type: "replace",
157
- item: produce(current, (draft) => {
158
- draft.data.points = edge.data.points;
159
- draft.data.controlPoints = edge.data.controlPoints;
160
- draft.data.labelBBox = edge.data.labelBBox;
161
- })
162
- };
163
- }
164
- const d = vector(dx, dy);
165
- const relativePoint = (pt) => {
166
- const point = vector(pt);
167
- const staticToP = point.subtract(staticV);
168
- const projLength = staticToP.dot(staticToAnchor);
169
- const coeff = clamp(projLength / staticToAnchorLength ** 2, {
170
- min: -1,
171
- max: 1
172
- });
173
- const newPoint = point.add(d.multiply(coeff)).trunc();
174
- return {
175
- x: newPoint.x,
176
- y: newPoint.y
177
- };
178
- };
179
- return {
180
- id: edge.id,
181
- type: "replace",
182
- item: produce(current, (draft) => {
183
- draft.data.controlPoints = controlPoints.map(relativePoint);
184
- if (edge.data.labelBBox) {
185
- draft.data.labelBBox ??= edge.data.labelBBox;
186
- const { x, y } = relativePoint(edge.data.labelBBox);
187
- draft.data.labelBBox.x = x;
188
- draft.data.labelBBox.y = y;
189
- }
190
- })
191
- };
192
- };
142
+ const controlPoints = edge.data.controlPoints ?? bezierControlPoints(edge.data.points);
143
+ const anchorV = vector$1(BBox$1.center(anchorNode));
144
+ const staticV = vector$1(BBox$1.center(staticNode));
145
+ const staticToAnchor = anchorV.subtract(staticV);
146
+ const staticToAnchorLength = staticToAnchor.length();
147
+ return (edgeLookup) => {
148
+ const current = nonNullable(edgeLookup.get(edge.id), `Edge ${edge.id} not found`);
149
+ const { x: dx, y: dy } = movingRect.diff;
150
+ if (dx === 0 && dy === 0) return {
151
+ id: edge.id,
152
+ type: "replace",
153
+ item: produce(current, (draft) => {
154
+ draft.data.points = edge.data.points;
155
+ draft.data.controlPoints = edge.data.controlPoints;
156
+ draft.data.labelBBox = edge.data.labelBBox;
157
+ })
158
+ };
159
+ const d = vector$1(dx, dy);
160
+ const relativePoint = (pt) => {
161
+ const point = vector$1(pt);
162
+ const coeff = clamp(point.subtract(staticV).dot(staticToAnchor) / staticToAnchorLength ** 2, {
163
+ min: -1,
164
+ max: 1
165
+ });
166
+ const newPoint = point.add(d.multiply(coeff)).trunc();
167
+ return {
168
+ x: newPoint.x,
169
+ y: newPoint.y
170
+ };
171
+ };
172
+ return {
173
+ id: edge.id,
174
+ type: "replace",
175
+ item: produce(current, (draft) => {
176
+ draft.data.controlPoints = controlPoints.map(relativePoint);
177
+ if (edge.data.labelBBox) {
178
+ draft.data.labelBBox ??= edge.data.labelBBox;
179
+ const { x, y } = relativePoint(edge.data.labelBBox);
180
+ draft.data.labelBBox.x = x;
181
+ draft.data.labelBBox.y = y;
182
+ }
183
+ })
184
+ };
185
+ };
193
186
  }
194
187
  function createLayoutConstraints(xyflowApi, editingNodeIds) {
195
- const { parentLookup, nodeLookup, edges } = xyflowApi.getState();
196
- const rects = /* @__PURE__ */ new Map();
197
- const ancestorsOf = new DefaultMap((nodeId) => {
198
- const xynode = nodeLookup.get(nodeId);
199
- let parent = xynode?.parentId;
200
- if (!parent) {
201
- return [];
202
- }
203
- return [parent, ...ancestorsOf.get(parent)];
204
- });
205
- const nestedOf = new DefaultMap((nodeId) => {
206
- const children = parentLookup.get(nodeId);
207
- if (!children || children.size === 0) {
208
- return /* @__PURE__ */ new Set();
209
- }
210
- const nested = /* @__PURE__ */ new Set();
211
- for (const child of children.values()) {
212
- nested.add(child.id);
213
- for (const desc of nestedOf.get(child.id)) {
214
- nested.add(desc);
215
- }
216
- }
217
- return nested;
218
- });
219
- if (hasAtLeast(editingNodeIds, 2)) {
220
- const leafsOnly = pipe(
221
- editingNodeIds,
222
- flatMap((id) => [...nestedOf.get(id)]),
223
- unique(),
224
- (exclude) => difference(editingNodeIds, exclude)
225
- );
226
- invariant(hasAtLeast(leafsOnly, 1), "All editing nodes are nested within each other");
227
- editingNodeIds = leafsOnly;
228
- }
229
- const ancestorsOfDraggingNodes = new Set(
230
- editingNodeIds.flatMap((i) => ancestorsOf.get(i))
231
- );
232
- const traverse = [...nodeLookup.values()].flatMap(
233
- (x) => !x.parentId ? { xynode: x, parent: null } : []
234
- );
235
- while (traverse.length > 0) {
236
- const { xynode, parent } = traverse.shift();
237
- const isEditing = editingNodeIds.includes(xynode.id);
238
- const shouldTraverse = !isEditing && ancestorsOfDraggingNodes.has(xynode.id);
239
- if (shouldTraverse) {
240
- const rect = new CompoundRect(xynode, parent);
241
- rects.set(xynode.id, rect);
242
- parentLookup.get(xynode.id)?.forEach((child) => {
243
- traverse.push({
244
- xynode: child,
245
- parent: rect
246
- });
247
- });
248
- continue;
249
- }
250
- rects.set(xynode.id, new Leaf(xynode, parent));
251
- }
252
- const rectsToUpdate = [...rects.values()];
253
- const edgeModifiers = /* @__PURE__ */ new Map();
254
- const findMovingAncestor = (nodeId) => {
255
- const r = rects.get(nodeId);
256
- if (r) {
257
- return r;
258
- }
259
- for (const parent of ancestorsOf.get(nodeId)) {
260
- const rect = rects.get(parent);
261
- if (rect) {
262
- return rect;
263
- }
264
- }
265
- return null;
266
- };
267
- const movingNodes = new Set(editingNodeIds.flatMap((id) => [id, ...nestedOf.get(id)]));
268
- for (const edge of edges) {
269
- const isSourceMoving = movingNodes.has(edge.source);
270
- const isTargetMoving = movingNodes.has(edge.target);
271
- if (!isSourceMoving && !isTargetMoving) {
272
- continue;
273
- }
274
- if (isSourceMoving && isTargetMoving) {
275
- let r = rects.get(edge.source) ?? rects.get(edge.target) ?? findMovingAncestor(edge.source) ?? findMovingAncestor(edge.target);
276
- invariant(!!r, "At least one of the edge nodes should have a moving ancestor");
277
- edgeModifiers.set(edge, makeEdgeModifier(edge, r));
278
- continue;
279
- }
280
- invariant(isSourceMoving !== isTargetMoving, "Logic error");
281
- const movingRect = isSourceMoving ? findMovingAncestor(edge.source) : findMovingAncestor(edge.target);
282
- invariant(!!movingRect, "Moving endpoint should be found");
283
- const [sourceNode, targetNode] = pipe(
284
- [edge.source, edge.target],
285
- map((id) => nonNullable(nodeLookup.get(id), `Node ${id} not found`)),
286
- map(nodeToRect)
287
- );
288
- const [anchorNode, staticNode] = isSourceMoving ? [sourceNode, targetNode] : [targetNode, sourceNode];
289
- edgeModifiers.set(
290
- edge,
291
- makeRelativeEdgeModifier(
292
- edge,
293
- movingRect,
294
- anchorNode,
295
- staticNode
296
- )
297
- );
298
- }
299
- function applyConstraints(targets) {
300
- for (const r of targets) {
301
- if (!(r instanceof CompoundRect)) {
302
- continue;
303
- }
304
- applyConstraints(r.children);
305
- const childrenBB = {
306
- minX: Infinity,
307
- minY: Infinity,
308
- maxX: -Infinity,
309
- maxY: -Infinity
310
- };
311
- for (const child of r.children) {
312
- childrenBB.minX = Math.min(childrenBB.minX, child.minX);
313
- childrenBB.minY = Math.min(childrenBB.minY, child.minY);
314
- childrenBB.maxX = Math.max(childrenBB.maxX, child.maxX);
315
- childrenBB.maxY = Math.max(childrenBB.maxY, child.maxY);
316
- }
317
- r.minX = childrenBB.minX - Rect.LeftPadding;
318
- r.minY = childrenBB.minY - Rect.TopPadding;
319
- r.maxX = childrenBB.maxX + Rect.RightPadding;
320
- r.maxY = childrenBB.maxY + Rect.BottomPadding;
321
- }
322
- }
323
- const _edgeModifiers = [...edgeModifiers.values()];
324
- function syncFromXYFlow() {
325
- const { nodeLookup: nodeLookup2 } = xyflowApi.getState();
326
- for (const id of editingNodeIds) {
327
- const rect = rects.get(id);
328
- if (!rect) {
329
- console.warn(`Rect not found for id ${id}`);
330
- continue;
331
- }
332
- const node = nodeLookup2.get(id);
333
- if (!node) {
334
- console.warn(`Node not found for id ${id}`);
335
- continue;
336
- }
337
- rect.positionAbsolute = node.internals.positionAbsolute;
338
- }
339
- }
340
- function updateXYFlow() {
341
- const { edgeLookup, triggerNodeChanges, triggerEdgeChanges } = xyflowApi.getState();
342
- applyConstraints(rectsToUpdate);
343
- const nodeUpdates = [];
344
- const edgeUpdates = [];
345
- for (const r of rectsToUpdate) {
346
- nodeUpdates.push({
347
- id: r.id,
348
- type: "position",
349
- dragging: false,
350
- position: r.position,
351
- positionAbsolute: r.positionAbsolute
352
- });
353
- if (r instanceof CompoundRect) {
354
- nodeUpdates.push({
355
- id: r.id,
356
- type: "dimensions",
357
- setAttributes: true,
358
- resizing: false,
359
- dimensions: r.dimensions
360
- });
361
- }
362
- }
363
- if (nodeUpdates.length > 0) {
364
- triggerNodeChanges(nodeUpdates);
365
- }
366
- for (const fm of _edgeModifiers) {
367
- edgeUpdates.push(fm(edgeLookup));
368
- }
369
- if (edgeUpdates.length > 0) {
370
- triggerEdgeChanges(edgeUpdates);
371
- }
372
- }
373
- let animationFrameId = null;
374
- function cancelPending() {
375
- if (animationFrameId !== null) {
376
- cancelAnimationFrame(animationFrameId);
377
- animationFrameId = null;
378
- }
379
- }
380
- function flushPending() {
381
- cancelPending();
382
- syncFromXYFlow();
383
- updateXYFlow();
384
- }
385
- function onMove() {
386
- animationFrameId ??= requestAnimationFrame(() => {
387
- animationFrameId = null;
388
- syncFromXYFlow();
389
- updateXYFlow();
390
- });
391
- }
392
- function hasChanges() {
393
- return isome(rectsToUpdate, (r) => r.isMoved || r.isResized);
394
- }
395
- return {
396
- rects,
397
- onMove,
398
- updateXYFlow,
399
- hasChanges,
400
- cancelPending,
401
- flushPending
402
- };
188
+ const { parentLookup, nodeLookup, edges } = xyflowApi.getState();
189
+ const rects = /* @__PURE__ */ new Map();
190
+ /** Maps node id to all its ancestors */
191
+ const ancestorsOf = new DefaultMap((nodeId) => {
192
+ let parent = nodeLookup.get(nodeId)?.parentId;
193
+ if (!parent) return [];
194
+ return [parent, ...ancestorsOf.get(parent)];
195
+ });
196
+ /** Maps node id to all its nested descendants */
197
+ const nestedOf = new DefaultMap((nodeId) => {
198
+ const children = parentLookup.get(nodeId);
199
+ if (!children || children.size === 0) return /* @__PURE__ */ new Set();
200
+ const nested = /* @__PURE__ */ new Set();
201
+ for (const child of children.values()) {
202
+ nested.add(child.id);
203
+ for (const desc of nestedOf.get(child.id)) nested.add(desc);
204
+ }
205
+ return nested;
206
+ });
207
+ if (hasAtLeast(editingNodeIds, 2)) {
208
+ const leafsOnly = pipe(editingNodeIds, flatMap((id) => [...nestedOf.get(id)]), unique(), (exclude) => difference(editingNodeIds, exclude));
209
+ invariant$1(hasAtLeast(leafsOnly, 1), "All editing nodes are nested within each other");
210
+ editingNodeIds = leafsOnly;
211
+ }
212
+ const ancestorsOfDraggingNodes = new Set(editingNodeIds.flatMap((i) => ancestorsOf.get(i)));
213
+ const traverse = [...nodeLookup.values()].flatMap((x) => !x.parentId ? {
214
+ xynode: x,
215
+ parent: null
216
+ } : []);
217
+ while (traverse.length > 0) {
218
+ const { xynode, parent } = traverse.shift();
219
+ if (!editingNodeIds.includes(xynode.id) && ancestorsOfDraggingNodes.has(xynode.id)) {
220
+ const rect = new CompoundRect(xynode, parent);
221
+ rects.set(xynode.id, rect);
222
+ parentLookup.get(xynode.id)?.forEach((child) => {
223
+ traverse.push({
224
+ xynode: child,
225
+ parent: rect
226
+ });
227
+ });
228
+ continue;
229
+ }
230
+ rects.set(xynode.id, new Leaf(xynode, parent));
231
+ }
232
+ const rectsToUpdate = [...rects.values()];
233
+ /**
234
+ * Edges that need to be updated because both source and target are moved
235
+ * - source and target are inside a compound node that is moved
236
+ * - source and target are selected and moved
237
+ */
238
+ const edgeModifiers = /* @__PURE__ */ new Map();
239
+ const findMovingAncestor = (nodeId) => {
240
+ const r = rects.get(nodeId);
241
+ if (r) return r;
242
+ for (const parent of ancestorsOf.get(nodeId)) {
243
+ const rect = rects.get(parent);
244
+ if (rect) return rect;
245
+ }
246
+ return null;
247
+ };
248
+ const movingNodes = new Set(editingNodeIds.flatMap((id) => [id, ...nestedOf.get(id)]));
249
+ for (const edge of edges) {
250
+ const isSourceMoving = movingNodes.has(edge.source);
251
+ const isTargetMoving = movingNodes.has(edge.target);
252
+ if (!isSourceMoving && !isTargetMoving) continue;
253
+ if (isSourceMoving && isTargetMoving) {
254
+ let r = rects.get(edge.source) ?? rects.get(edge.target) ?? findMovingAncestor(edge.source) ?? findMovingAncestor(edge.target);
255
+ invariant$1(!!r, "At least one of the edge nodes should have a moving ancestor");
256
+ edgeModifiers.set(edge, makeEdgeModifier(edge, r));
257
+ continue;
258
+ }
259
+ invariant$1(isSourceMoving !== isTargetMoving, "Logic error");
260
+ const movingRect = isSourceMoving ? findMovingAncestor(edge.source) : findMovingAncestor(edge.target);
261
+ invariant$1(!!movingRect, "Moving endpoint should be found");
262
+ const [sourceNode, targetNode] = pipe([edge.source, edge.target], map((id) => nonNullable(nodeLookup.get(id), `Node ${id} not found`)), map(nodeToRect$1));
263
+ const [anchorNode, staticNode] = isSourceMoving ? [sourceNode, targetNode] : [targetNode, sourceNode];
264
+ edgeModifiers.set(edge, makeRelativeEdgeModifier(edge, movingRect, anchorNode, staticNode));
265
+ }
266
+ function applyConstraints(targets) {
267
+ for (const r of targets) {
268
+ if (!(r instanceof CompoundRect)) continue;
269
+ applyConstraints(r.children);
270
+ const childrenBB = {
271
+ minX: Infinity,
272
+ minY: Infinity,
273
+ maxX: -Infinity,
274
+ maxY: -Infinity
275
+ };
276
+ for (const child of r.children) {
277
+ childrenBB.minX = Math.min(childrenBB.minX, child.minX);
278
+ childrenBB.minY = Math.min(childrenBB.minY, child.minY);
279
+ childrenBB.maxX = Math.max(childrenBB.maxX, child.maxX);
280
+ childrenBB.maxY = Math.max(childrenBB.maxY, child.maxY);
281
+ }
282
+ r.minX = childrenBB.minX - Rect.LeftPadding;
283
+ r.minY = childrenBB.minY - Rect.TopPadding;
284
+ r.maxX = childrenBB.maxX + Rect.RightPadding;
285
+ r.maxY = childrenBB.maxY + Rect.BottomPadding;
286
+ }
287
+ }
288
+ const _edgeModifiers = [...edgeModifiers.values()];
289
+ /**
290
+ * Read current node positions from XYFlow internal state into rects.
291
+ * Only needed for drag operations where XYFlow already has the updated positions.
292
+ */
293
+ function syncFromXYFlow() {
294
+ const { nodeLookup } = xyflowApi.getState();
295
+ for (const id of editingNodeIds) {
296
+ const rect = rects.get(id);
297
+ if (!rect) {
298
+ console.warn(`Rect not found for id ${id}`);
299
+ continue;
300
+ }
301
+ const node = nodeLookup.get(id);
302
+ if (!node) {
303
+ console.warn(`Node not found for id ${id}`);
304
+ continue;
305
+ }
306
+ rect.positionAbsolute = node.internals.positionAbsolute;
307
+ }
308
+ }
309
+ function updateXYFlow() {
310
+ const { edgeLookup, triggerNodeChanges, triggerEdgeChanges } = xyflowApi.getState();
311
+ applyConstraints(rectsToUpdate);
312
+ const nodeUpdates = [];
313
+ const edgeUpdates = [];
314
+ for (const r of rectsToUpdate) {
315
+ nodeUpdates.push({
316
+ id: r.id,
317
+ type: "position",
318
+ dragging: false,
319
+ position: r.position,
320
+ positionAbsolute: r.positionAbsolute
321
+ });
322
+ if (r instanceof CompoundRect) nodeUpdates.push({
323
+ id: r.id,
324
+ type: "dimensions",
325
+ setAttributes: true,
326
+ resizing: false,
327
+ dimensions: r.dimensions
328
+ });
329
+ }
330
+ if (nodeUpdates.length > 0) triggerNodeChanges(nodeUpdates);
331
+ for (const fm of _edgeModifiers) edgeUpdates.push(fm(edgeLookup));
332
+ if (edgeUpdates.length > 0) triggerEdgeChanges(edgeUpdates);
333
+ }
334
+ let animationFrameId = null;
335
+ function cancelPending() {
336
+ if (animationFrameId !== null) {
337
+ cancelAnimationFrame(animationFrameId);
338
+ animationFrameId = null;
339
+ }
340
+ }
341
+ function flushPending() {
342
+ cancelPending();
343
+ syncFromXYFlow();
344
+ updateXYFlow();
345
+ }
346
+ function onMove() {
347
+ animationFrameId ??= requestAnimationFrame(() => {
348
+ animationFrameId = null;
349
+ syncFromXYFlow();
350
+ updateXYFlow();
351
+ });
352
+ }
353
+ function hasChanges() {
354
+ return isome(rectsToUpdate, (r) => r.isMoved || r.isResized);
355
+ }
356
+ return {
357
+ rects,
358
+ onMove,
359
+ updateXYFlow,
360
+ hasChanges,
361
+ cancelPending,
362
+ flushPending
363
+ };
403
364
  }
365
+ /**
366
+ * Keeps the layout constraints (parent nodes and children) when dragging a node
367
+ */
404
368
  function useLayoutConstraints() {
405
- const xystore = useXYStoreApi();
406
- const diagram = useDiagram();
407
- const solverRef = useRef(void 0);
408
- return useMemo(() => {
409
- return {
410
- onNodeDragStart: (_event, xynode) => {
411
- const { nodeLookup } = xystore.getState();
412
- const draggingNodes = pipe(
413
- Array.from(nodeLookup.values()),
414
- filter((n) => n.dragging === true || n.id === xynode.id || n.selected === true),
415
- map((n) => n.id)
416
- );
417
- if (hasAtLeast(draggingNodes, 1)) {
418
- diagram.startEditing("node");
419
- solverRef.current = createLayoutConstraints(xystore, draggingNodes);
420
- }
421
- },
422
- onNodeDrag: (_event) => {
423
- solverRef.current?.onMove();
424
- },
425
- onNodeDragStop: (_event) => {
426
- if (!solverRef.current) {
427
- return;
428
- }
429
- const hasChanges = solverRef.current.hasChanges();
430
- if (hasChanges) {
431
- solverRef.current.flushPending();
432
- } else {
433
- solverRef.current.cancelPending();
434
- }
435
- diagram.stopEditing(hasChanges);
436
- solverRef.current = void 0;
437
- }
438
- };
439
- }, [xystore, diagram]);
369
+ const xystore = useXYStoreApi();
370
+ const diagram = useDiagram();
371
+ const solverRef = useRef(void 0);
372
+ return useMemo(() => {
373
+ return {
374
+ onNodeDragStart: (_event, xynode) => {
375
+ const { nodeLookup } = xystore.getState();
376
+ const draggingNodes = pipe(Array.from(nodeLookup.values()), filter((n) => n.dragging === true || n.id === xynode.id || n.selected === true), map((n) => n.id));
377
+ if (hasAtLeast(draggingNodes, 1)) {
378
+ diagram.startEditing("node");
379
+ solverRef.current = createLayoutConstraints(xystore, draggingNodes);
380
+ }
381
+ },
382
+ onNodeDrag: (_event) => {
383
+ solverRef.current?.onMove();
384
+ },
385
+ onNodeDragStop: (_event) => {
386
+ if (!solverRef.current) return;
387
+ const hasChanges = solverRef.current.hasChanges();
388
+ if (hasChanges) solverRef.current.flushPending();
389
+ else solverRef.current.cancelPending();
390
+ diagram.stopEditing(hasChanges);
391
+ solverRef.current = void 0;
392
+ }
393
+ };
394
+ }, [xystore, diagram]);
440
395
  }
441
-
396
+ //#endregion
442
397
  export { createLayoutConstraints, useLayoutConstraints };