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