@likec4/diagram 1.55.1 → 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 (343) 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.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 +35 -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.js +73 -69
  69. package/dist/context/EnsureMantine.js +13 -16
  70. package/dist/context/FramerMotionConfig.js +17 -11
  71. package/dist/context/IconRenderer.js +90 -106
  72. package/dist/context/LikeC4ModelContext.js +14 -10
  73. package/dist/context/LikeC4ProjectsContext.js +7 -6
  74. package/dist/context/RootContainerContext.d.ts +2 -5
  75. package/dist/context/RootContainerContext.js +24 -26
  76. package/dist/context/TagStylesContext.js +49 -57
  77. package/dist/custom/customNodes.js +224 -28
  78. package/dist/custom/index.js +41 -40
  79. package/dist/editor/LikeC4EditorCallbacks.js +4 -2
  80. package/dist/editor/LikeC4EditorProvider.js +32 -7
  81. package/dist/editor/applyChangesToManualLayout.js +144 -163
  82. package/dist/editor/editorActor.actions.js +122 -138
  83. package/dist/editor/editorActor.setup.js +30 -36
  84. package/dist/editor/editorActor.states.js +209 -263
  85. package/dist/editor/hotkeyActor.js +18 -17
  86. package/dist/editor/useEditorActorLogic.js +31 -43
  87. package/dist/hooks/safeContext.js +17 -17
  88. package/dist/hooks/useCallbackRef.js +18 -11
  89. package/dist/hooks/useCurrentView.js +16 -7
  90. package/dist/hooks/useCurrentViewModel.js +14 -9
  91. package/dist/hooks/useDiagram.js +55 -37
  92. package/dist/hooks/useDiagramCompareLayout.js +77 -81
  93. package/dist/hooks/useId.js +8 -6
  94. package/dist/hooks/useLikeC4ElementsTree.js +22 -21
  95. package/dist/hooks/useLikeC4Model.js +21 -20
  96. package/dist/hooks/useLikeC4Project.js +40 -29
  97. package/dist/hooks/useLikeC4Styles.js +6 -6
  98. package/dist/hooks/useMantinePortalProps.js +10 -6
  99. package/dist/hooks/useOverlaysActor.js +7 -6
  100. package/dist/hooks/useSearchActor.js +7 -6
  101. package/dist/hooks/useSetState.js +21 -19
  102. package/dist/hooks/useUpdateEffect.js +18 -29
  103. package/dist/hooks/useXYFlow.js +13 -15
  104. package/dist/index.js +24 -23
  105. package/dist/likec4diagram/DiagramUI.js +33 -37
  106. package/dist/likec4diagram/DiagramXYFlow.js +215 -224
  107. package/dist/likec4diagram/convert-to-xyflow.js +21 -22
  108. package/dist/likec4diagram/custom/edges/EdgeDrifts.js +22 -32
  109. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +275 -372
  110. package/dist/likec4diagram/custom/edges/SequenceStepEdge.js +71 -75
  111. package/dist/likec4diagram/custom/edges/edges.css.js +41 -47
  112. package/dist/likec4diagram/custom/edges/useControlPoints.js +52 -56
  113. package/dist/likec4diagram/custom/edges/useRelationshipEdgePath.js +54 -76
  114. package/dist/likec4diagram/custom/index.js +17 -17
  115. package/dist/likec4diagram/custom/nodes/CompoundActions.js +19 -26
  116. package/dist/likec4diagram/custom/nodes/ElementActions.js +131 -82
  117. package/dist/likec4diagram/custom/nodes/NodeDrifts.js +20 -26
  118. package/dist/likec4diagram/custom/nodes/NodeNotes.js +215 -273
  119. package/dist/likec4diagram/custom/nodes/SequenceActorNode.js +131 -147
  120. package/dist/likec4diagram/custom/nodes/nodes.js +135 -146
  121. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +155 -159
  122. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +58 -86
  123. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +108 -164
  124. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +56 -68
  125. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +3 -6
  126. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +97 -102
  127. package/dist/likec4diagram/custom/nodes/toolbar/styles.css.js +13 -13
  128. package/dist/likec4diagram/custom/nodes/toolbar/types.js +6 -5
  129. package/dist/likec4diagram/custom/nodes/toolbar/useHandlers.js +36 -41
  130. package/dist/likec4diagram/relationship-popover/RelationshipPopover.js +510 -541
  131. package/dist/likec4diagram/relationship-popover/actor.js +113 -152
  132. package/dist/likec4diagram/relationship-popover/components.js +39 -43
  133. package/dist/likec4diagram/state/DiagramActorProvider.js +135 -136
  134. package/dist/likec4diagram/state/aligners.js +283 -360
  135. package/dist/likec4diagram/state/assign.js +84 -108
  136. package/dist/likec4diagram/state/createViewChange.js +72 -92
  137. package/dist/likec4diagram/state/diagram-api.js +224 -152
  138. package/dist/likec4diagram/state/hotkeyActor.js +54 -45
  139. package/dist/likec4diagram/state/machine.actions.js +709 -821
  140. package/dist/likec4diagram/state/machine.actions.layout.js +154 -183
  141. package/dist/likec4diagram/state/machine.js +113 -134
  142. package/dist/likec4diagram/state/machine.setup.js +104 -113
  143. package/dist/likec4diagram/state/machine.state.initializing.js +54 -54
  144. package/dist/likec4diagram/state/machine.state.navigating.js +192 -227
  145. package/dist/likec4diagram/state/machine.state.ready.focused.js +72 -88
  146. package/dist/likec4diagram/state/machine.state.ready.idle.js +79 -98
  147. package/dist/likec4diagram/state/machine.state.ready.js +126 -202
  148. package/dist/likec4diagram/state/machine.state.ready.printing.js +38 -39
  149. package/dist/likec4diagram/state/machine.state.ready.walkthrough.js +153 -193
  150. package/dist/likec4diagram/state/mediaPrintActor.js +20 -16
  151. package/dist/likec4diagram/state/persistence.js +20 -21
  152. package/dist/likec4diagram/state/utils.js +131 -162
  153. package/dist/likec4diagram/ui/LayoutDriftFrame.js +53 -64
  154. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +58 -80
  155. package/dist/likec4diagram/ui/notation/NotationPanel.js +183 -214
  156. package/dist/likec4diagram/useLayoutConstraints.js +386 -433
  157. package/dist/likec4diagram/xyflow-diagram/diagram-view.js +216 -227
  158. package/dist/likec4diagram/xyflow-sequence/const.js +11 -7
  159. package/dist/likec4diagram/xyflow-sequence/sequence-layout.js +177 -180
  160. package/dist/navigationpanel/NavigationPanel.js +113 -123
  161. package/dist/navigationpanel/NavigationPanelControls.js +124 -150
  162. package/dist/navigationpanel/NavigationPanelDropdown.js +365 -477
  163. package/dist/navigationpanel/_common.d.ts +4 -10
  164. package/dist/navigationpanel/_common.js +57 -70
  165. package/dist/navigationpanel/actor.js +153 -236
  166. package/dist/navigationpanel/comparepanel/CompareActionsMenu.js +66 -83
  167. package/dist/navigationpanel/comparepanel/ComparePanel.js +135 -164
  168. package/dist/navigationpanel/comparepanel/ComparePanelControls.js +50 -58
  169. package/dist/navigationpanel/comparepanel/DriftsSummary.js +207 -254
  170. package/dist/navigationpanel/comparepanel/LayoutTypeSwitcher.js +33 -35
  171. package/dist/navigationpanel/controls/DetailsControls.js +219 -246
  172. package/dist/navigationpanel/controls/LayoutWarning.js +89 -100
  173. package/dist/navigationpanel/controls/LogoButton.js +46 -70
  174. package/dist/navigationpanel/controls/NavigationButtons.js +35 -52
  175. package/dist/navigationpanel/controls/OpenSource.js +27 -25
  176. package/dist/navigationpanel/controls/SearchControl.js +50 -61
  177. package/dist/navigationpanel/controls/ToggleReadonly.js +84 -81
  178. package/dist/navigationpanel/dropdown/ProjectsMenu.js +69 -87
  179. package/dist/navigationpanel/editorpanel/CenterCamera.js +17 -13
  180. package/dist/navigationpanel/editorpanel/ChangeAutoLayoutButton.js +182 -154
  181. package/dist/navigationpanel/editorpanel/EditorPanel.js +47 -45
  182. package/dist/navigationpanel/editorpanel/ManualLayoutToolsButton.js +122 -173
  183. package/dist/navigationpanel/editorpanel/ToggleReadonly.js +20 -13
  184. package/dist/navigationpanel/editorpanel/_common.d.ts +3 -6
  185. package/dist/navigationpanel/editorpanel/_common.js +13 -13
  186. package/dist/navigationpanel/editorpanel/styles.js +58 -75
  187. package/dist/navigationpanel/hooks.js +35 -29
  188. package/dist/navigationpanel/styles.css.js +20 -28
  189. package/dist/navigationpanel/walkthrough/ActiveWalkthroughControls.js +107 -134
  190. package/dist/navigationpanel/walkthrough/DynamicViewControls.d.ts +8 -8
  191. package/dist/navigationpanel/walkthrough/DynamicViewControls.js +105 -120
  192. package/dist/navigationpanel/walkthrough/WalkthroughPanel.js +75 -83
  193. package/dist/overlays/Overlays.js +94 -112
  194. package/dist/overlays/element-details/ElementDetails.js +22 -28
  195. package/dist/overlays/element-details/ElementDetailsCard.css.js +198 -221
  196. package/dist/overlays/element-details/ElementDetailsCard.js +517 -499
  197. package/dist/overlays/element-details/MetadataValue.js +210 -250
  198. package/dist/overlays/element-details/TabPanelDeployments.css.js +40 -60
  199. package/dist/overlays/element-details/TabPanelDeployments.js +185 -178
  200. package/dist/overlays/element-details/TabPanelRelationships.css.js +63 -71
  201. package/dist/overlays/element-details/TabPanelRelationships.js +155 -140
  202. package/dist/overlays/element-details/TabPanelStructure.css.js +29 -33
  203. package/dist/overlays/element-details/TabPanelStructure.js +93 -93
  204. package/dist/overlays/element-details/actor.js +45 -55
  205. package/dist/overlays/element-details/actorContext.js +12 -10
  206. package/dist/overlays/overlay/Overlay.js +104 -151
  207. package/dist/overlays/overlaysActor.js +213 -264
  208. package/dist/overlays/relationship-details/RelationshipDetails.js +270 -253
  209. package/dist/overlays/relationship-details/SelectEdge.css.js +62 -74
  210. package/dist/overlays/relationship-details/SelectEdge.js +146 -126
  211. package/dist/overlays/relationship-details/actor.js +242 -303
  212. package/dist/overlays/relationship-details/compute.js +109 -135
  213. package/dist/overlays/relationship-details/custom/ElementActions.js +43 -56
  214. package/dist/overlays/relationship-details/custom/edgeTypes.js +43 -49
  215. package/dist/overlays/relationship-details/custom/nodeTypes.js +93 -119
  216. package/dist/overlays/relationship-details/hooks.js +44 -38
  217. package/dist/overlays/relationship-details/layout-to-xyflow.js +119 -141
  218. package/dist/overlays/relationship-details/layout.js +275 -304
  219. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +319 -321
  220. package/dist/overlays/relationships-browser/SelectElement.css.js +18 -21
  221. package/dist/overlays/relationships-browser/SelectElement.js +192 -218
  222. package/dist/overlays/relationships-browser/actor.js +364 -462
  223. package/dist/overlays/relationships-browser/const.js +7 -6
  224. package/dist/overlays/relationships-browser/custom/ElementActions.js +60 -63
  225. package/dist/overlays/relationships-browser/custom/EmptyNode.js +25 -29
  226. package/dist/overlays/relationships-browser/custom/edgeTypes.js +66 -99
  227. package/dist/overlays/relationships-browser/custom/nodeTypes.js +98 -123
  228. package/dist/overlays/relationships-browser/hooks.js +49 -51
  229. package/dist/overlays/relationships-browser/layout.js +413 -465
  230. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +141 -157
  231. package/dist/projects-overview/ProjectsOverview.js +56 -55
  232. package/dist/projects-overview/ProjectsOverviewXY.js +105 -94
  233. package/dist/projects-overview/actor.js +252 -345
  234. package/dist/projects-overview/context.js +8 -7
  235. package/dist/projects-overview/custom/edgeTypes.js +22 -21
  236. package/dist/projects-overview/custom/nodeTypes.js +38 -42
  237. package/dist/projects-overview/hooks.js +9 -9
  238. package/dist/projects-overview/layouted-to-xyflow.js +46 -42
  239. package/dist/projects-overview/panel/ProjectsOverviewPanel.js +7 -9
  240. package/dist/projects-overview/persistence.js +22 -22
  241. package/dist/search/Search.js +199 -181
  242. package/dist/search/SearchContext.js +16 -15
  243. package/dist/search/XStateSearchAdapter.js +68 -62
  244. package/dist/search/components/ElementsColumn.css.js +50 -68
  245. package/dist/search/components/ElementsColumn.js +248 -290
  246. package/dist/search/components/PickView.js +116 -140
  247. package/dist/search/components/SearchByTags.js +76 -94
  248. package/dist/search/components/SearchInput.js +187 -209
  249. package/dist/search/components/ViewsColum.js +151 -141
  250. package/dist/search/components/ViewsColumn.css.js +12 -26
  251. package/dist/search/components/_shared.css.js +127 -153
  252. package/dist/search/components/styles.css.js +47 -53
  253. package/dist/search/components/utils.js +44 -47
  254. package/dist/search/hooks.js +10 -10
  255. package/dist/search/searchActor.js +93 -128
  256. package/dist/shadowroot/ShadowRoot.js +66 -78
  257. package/dist/shadowroot/styles.css.js +56 -66
  258. package/dist/styles-font2.js +4 -0
  259. package/dist/styles2.js +4 -0
  260. package/dist/utils/index.js +5 -0
  261. package/dist/utils/roundDpr.js +19 -15
  262. package/dist/utils/view-bounds.js +48 -55
  263. package/dist/utils/xyflow.js +143 -113
  264. package/package.json +12 -13
  265. package/styles-font.css +1 -1
  266. package/styles-min.css +1 -1
  267. package/styles-xyflow.css +1 -1
  268. package/styles.css +1 -1
  269. package/dist/_virtual/_commonjsHelpers.js +0 -3
  270. package/dist/_virtual/assign-f10db67b.cjs.js +0 -3
  271. package/dist/_virtual/log-30abbb83.cjs.js +0 -3
  272. package/dist/_virtual/raise-f051f097.cjs.js +0 -3
  273. package/dist/_virtual/store-cfe7da62.cjs.js +0 -3
  274. package/dist/_virtual/xstate-actions.cjs.js +0 -5
  275. package/dist/_virtual/xstate-actions.cjs2.js +0 -3
  276. package/dist/_virtual/xstate-dev.cjs.js +0 -3
  277. package/dist/_virtual/xstate-guards.cjs.js +0 -5
  278. package/dist/_virtual/xstate-guards.cjs2.js +0 -3
  279. package/dist/_virtual/xstate-store-react.cjs.js +0 -5
  280. package/dist/_virtual/xstate-store-react.cjs2.js +0 -3
  281. 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
  282. 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
  283. 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
  284. 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
  285. 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
  286. 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
  287. 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
  288. 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
  289. 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
  290. 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
  291. 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
  292. 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
  293. 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
  294. 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
  295. 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
  296. 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
  297. 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
  298. 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
  299. 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
  300. 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
  301. 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
  302. 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
  303. 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
  304. 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
  305. 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
  306. 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
  307. 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
  308. 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
  309. 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
  310. 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
  311. 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
  312. 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
  313. 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
  314. 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
  315. 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
  316. 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
  317. 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
  318. 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
  319. 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
  320. 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
  321. 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
  322. 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
  323. 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
  324. 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
  325. 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
  326. 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
  327. 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
  328. 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
  329. 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
  330. 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
  331. 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
  332. 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
  333. 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
  334. 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
  335. 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
  336. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/actions/dist/xstate-actions.cjs.js +0 -37
  337. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dev/dist/xstate-dev.cjs.js +0 -59
  338. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/assign-f10db67b.cjs.js +0 -140
  339. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/log-30abbb83.cjs.js +0 -401
  340. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/raise-f051f097.cjs.js +0 -2830
  341. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/guards/dist/xstate-guards.cjs.js +0 -26
  342. package/dist/styles-font.css2.js +0 -3
  343. 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 };