@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,824 +1,712 @@
1
- import { exact, nonNullable, nonexhaustive, invariant } from '@likec4/core';
2
- import { BBox } from '@likec4/core/geometry';
3
- import { difference } from '@likec4/core/utils';
4
- import { nodeToRect } from '@xyflow/system';
5
- import { produce } from 'immer';
6
- import { hasAtLeast, isTruthy } from 'remeda';
7
- import { assertEvent } from 'xstate';
8
- import { convertToXYFlow } from '../convert-to-xyflow.js';
9
- import { createLayoutConstraints } from '../useLayoutConstraints.js';
10
- import { getAligner, toNodeRect } from './aligners.js';
11
- import { resetEdgeControlPoints, mergeXYNodesEdges, focusNodesEdges } from './assign.js';
12
- import { setViewport, setViewportCenter, cancelFitDiagram, raiseFitDiagram } from './machine.actions.layout.js';
13
- export { assignViewportBefore, centerOnNodeOrEdge, fitDiagram, fitFocusedBounds, raiseSetViewport, raiseUpdateView, returnViewportBefore } from './machine.actions.layout.js';
14
- import { machine } from './machine.setup.js';
15
- import { typedSystem, findDiagramNode, findDiagramEdge, viewBounds } from './utils.js';
16
- import { Base } from '../../base/Base.js';
17
-
18
- const disableCompareWithLatest = () => machine.assign(({ context }) => {
19
- return {
20
- toggledFeatures: {
21
- ...context.toggledFeatures,
22
- enableCompareWithLatest: false
23
- },
24
- viewportOnAutoLayout: null,
25
- viewportOnManualLayout: null
26
- };
27
- });
28
- const onEdgeDoubleClick = () => machine.assign(({ context, event }) => {
29
- assertEvent(event, "xyflow.edgeDoubleClick");
30
- if (!event.edge.data.controlPoints) {
31
- return {};
32
- }
33
- const { nodeLookup } = context.xystore.getState();
34
- return {
35
- xyedges: context.xyedges.map((e) => {
36
- if (e.id !== event.edge.id) {
37
- return e;
38
- }
39
- const controlPoints = resetEdgeControlPoints(nodeLookup, e);
40
- const pt = controlPoints[0];
41
- return {
42
- ...e,
43
- data: {
44
- ...e.data,
45
- controlPoints,
46
- labelBBox: e.data.labelBBox ? { ...e.data.labelBBox, ...pt } : null,
47
- labelXY: null
48
- }
49
- };
50
- })
51
- };
52
- });
53
- const assignLastClickedNode = () => machine.assign(({ context, event }) => {
54
- assertEvent(event, "xyflow.nodeClick");
55
- const { lastClickedNode } = context;
56
- if (!lastClickedNode || lastClickedNode.id !== event.node.id) {
57
- return {
58
- lastClickedNode: {
59
- id: event.node.id,
60
- clicks: 1,
61
- timestamp: Date.now()
62
- }
63
- };
64
- }
65
- return {
66
- lastClickedNode: {
67
- id: lastClickedNode.id,
68
- clicks: lastClickedNode.clicks + 1,
69
- timestamp: Date.now()
70
- }
71
- };
72
- });
73
- const assignFocusedNode = () => machine.assign(({ event }) => {
74
- let focusedNode;
75
- let autoUnfocusTimer = false;
76
- switch (event.type) {
77
- case "xyflow.nodeClick":
78
- focusedNode = event.node.data.id;
79
- break;
80
- case "focus.node": {
81
- focusedNode = event.nodeId;
82
- autoUnfocusTimer = event.autoUnfocus === true;
83
- break;
84
- }
85
- default:
86
- throw new Error(`Unexpected event type: ${event.type} in action 'assign: focusedNode'`);
87
- }
88
- return {
89
- focusedNode,
90
- autoUnfocusTimer
91
- };
92
- });
93
- const resetLastClickedNode = () => machine.assign(() => ({
94
- lastClickedNode: null
1
+ import "../../_virtual/_rolldown/runtime.js";
2
+ import { Base } from "../../base/Base.js";
3
+ import { findDiagramEdge, findDiagramNode, typedSystem, viewBounds } from "./utils.js";
4
+ import { machine } from "./machine.setup.js";
5
+ import { createLayoutConstraints } from "../useLayoutConstraints.js";
6
+ import { focusNodesEdges, mergeXYNodesEdges, resetEdgeControlPoints } from "./assign.js";
7
+ import { convertToXYFlow } from "../convert-to-xyflow.js";
8
+ import { getAligner, toNodeRect } from "./aligners.js";
9
+ import { cancelFitDiagram, raiseFitDiagram, setViewport, setViewportCenter } from "./machine.actions.layout.js";
10
+ import { hasAtLeast, isTruthy } from "remeda";
11
+ import { exact, invariant, nonNullable, nonexhaustive } from "@likec4/core";
12
+ import { BBox as BBox$1 } from "@likec4/core/geometry";
13
+ import { difference as difference$1 } from "@likec4/core/utils";
14
+ import { nodeToRect } from "@xyflow/system";
15
+ import { assertEvent } from "xstate";
16
+ import { produce } from "immer";
17
+ //#region src/likec4diagram/state/machine.actions.ts
18
+ var disableCompareWithLatest = () => machine.assign(({ context }) => {
19
+ return {
20
+ toggledFeatures: {
21
+ ...context.toggledFeatures,
22
+ enableCompareWithLatest: false
23
+ },
24
+ viewportOnAutoLayout: null,
25
+ viewportOnManualLayout: null
26
+ };
27
+ });
28
+ var onEdgeDoubleClick = () => machine.assign(({ context, event }) => {
29
+ assertEvent(event, "xyflow.edgeDoubleClick");
30
+ if (!event.edge.data.controlPoints) return {};
31
+ const { nodeLookup } = context.xystore.getState();
32
+ return { xyedges: context.xyedges.map((e) => {
33
+ if (e.id !== event.edge.id) return e;
34
+ const controlPoints = resetEdgeControlPoints(nodeLookup, e);
35
+ const pt = controlPoints[0];
36
+ return {
37
+ ...e,
38
+ data: {
39
+ ...e.data,
40
+ controlPoints,
41
+ labelBBox: e.data.labelBBox ? {
42
+ ...e.data.labelBBox,
43
+ ...pt
44
+ } : null,
45
+ labelXY: null
46
+ }
47
+ };
48
+ }) };
49
+ });
50
+ var assignLastClickedNode = () => machine.assign(({ context, event }) => {
51
+ assertEvent(event, "xyflow.nodeClick");
52
+ const { lastClickedNode } = context;
53
+ if (!lastClickedNode || lastClickedNode.id !== event.node.id) return { lastClickedNode: {
54
+ id: event.node.id,
55
+ clicks: 1,
56
+ timestamp: Date.now()
57
+ } };
58
+ return { lastClickedNode: {
59
+ id: lastClickedNode.id,
60
+ clicks: lastClickedNode.clicks + 1,
61
+ timestamp: Date.now()
62
+ } };
63
+ });
64
+ var assignFocusedNode = () => machine.assign(({ event }) => {
65
+ let focusedNode;
66
+ let autoUnfocusTimer = false;
67
+ switch (event.type) {
68
+ case "xyflow.nodeClick":
69
+ focusedNode = event.node.data.id;
70
+ break;
71
+ case "focus.node":
72
+ focusedNode = event.nodeId;
73
+ autoUnfocusTimer = event.autoUnfocus === true;
74
+ break;
75
+ default: throw new Error(`Unexpected event type: ${event.type} in action 'assign: focusedNode'`);
76
+ }
77
+ return {
78
+ focusedNode,
79
+ autoUnfocusTimer
80
+ };
81
+ });
82
+ var resetLastClickedNode = () => machine.assign(() => ({ lastClickedNode: null }));
83
+ var updateFeatures = () => machine.assign(({ context, event }) => {
84
+ assertEvent(event, "update.features");
85
+ return { features: {
86
+ ...context.features,
87
+ ...event.features
88
+ } };
89
+ });
90
+ var updateInputs = () => machine.assign(({ event }) => {
91
+ assertEvent(event, "update.inputs");
92
+ return exact({ ...event.inputs });
93
+ });
94
+ var assignXYDataFromView = (view) => machine.assign(({ context, event }) => {
95
+ let xydata;
96
+ if (view) xydata = convertToXYFlow({
97
+ currentViewId: context.view.id,
98
+ dynamicViewVariant: context.dynamicViewVariant,
99
+ view,
100
+ where: context.where
101
+ });
102
+ else {
103
+ assertEvent(event, "update.view");
104
+ xydata = "xynodes" in event ? event : convertToXYFlow({
105
+ currentViewId: context.view.id,
106
+ dynamicViewVariant: context.dynamicViewVariant,
107
+ view: event.view,
108
+ where: context.where
109
+ });
110
+ }
111
+ const update = mergeXYNodesEdges(context, xydata);
112
+ let { lastClickedNode, focusedNode, activeWalkthrough } = context;
113
+ if (lastClickedNode || focusedNode || activeWalkthrough) {
114
+ const nodeIds = new Set(update.xynodes.map((n) => n.id));
115
+ if (lastClickedNode && !nodeIds.has(lastClickedNode.id)) lastClickedNode = null;
116
+ if (focusedNode && !nodeIds.has(focusedNode)) focusedNode = null;
117
+ const stepId = activeWalkthrough?.stepId;
118
+ if (stepId && !update.xyedges.some((e) => e.id === stepId)) activeWalkthrough = null;
119
+ return {
120
+ ...update,
121
+ lastClickedNode,
122
+ focusedNode,
123
+ activeWalkthrough
124
+ };
125
+ }
126
+ return update;
127
+ });
128
+ var focusOnNodesAndEdges = () => machine.enqueueActions(({ context, enqueue }) => {
129
+ const next = focusNodesEdges(context);
130
+ if (next) enqueue.assign(next);
131
+ else enqueue.raise({ type: "key.esc" });
132
+ });
133
+ var undimEverything = () => machine.assign(({ context }) => ({
134
+ xynodes: context.xynodes.map(Base.setDimmed(false)),
135
+ xyedges: context.xyedges.map(Base.setData({
136
+ dimmed: false,
137
+ active: false
138
+ }))
95
139
  }));
96
- const updateFeatures = () => machine.assign(({ context, event }) => {
97
- assertEvent(event, "update.features");
98
- return {
99
- features: {
100
- ...context.features,
101
- ...event.features
102
- }
103
- };
104
- });
105
- const updateInputs = () => machine.assign(({ event }) => {
106
- assertEvent(event, "update.inputs");
107
- return exact({ ...event.inputs });
108
- });
109
- const assignXYDataFromView = (view) => machine.assign(({ context, event }) => {
110
- let xydata;
111
- {
112
- assertEvent(event, "update.view");
113
- xydata = "xynodes" in event ? event : convertToXYFlow({
114
- currentViewId: context.view.id,
115
- dynamicViewVariant: context.dynamicViewVariant,
116
- view: event.view,
117
- where: context.where
118
- });
119
- }
120
- const update = mergeXYNodesEdges(context, xydata);
121
- let { lastClickedNode, focusedNode, activeWalkthrough } = context;
122
- if (lastClickedNode || focusedNode || activeWalkthrough) {
123
- const nodeIds = new Set(update.xynodes.map((n) => n.id));
124
- if (lastClickedNode && !nodeIds.has(lastClickedNode.id)) {
125
- lastClickedNode = null;
126
- }
127
- if (focusedNode && !nodeIds.has(focusedNode)) {
128
- focusedNode = null;
129
- }
130
- const stepId = activeWalkthrough?.stepId;
131
- if (stepId && !update.xyedges.some((e) => e.id === stepId)) {
132
- activeWalkthrough = null;
133
- }
134
- return {
135
- ...update,
136
- lastClickedNode,
137
- focusedNode,
138
- activeWalkthrough
139
- };
140
- }
141
- return update;
142
- });
143
- const focusOnNodesAndEdges = () => machine.enqueueActions(({ context, enqueue }) => {
144
- const next = focusNodesEdges(context);
145
- if (next) {
146
- enqueue.assign(next);
147
- } else {
148
- enqueue.raise({ type: "key.esc" });
149
- }
150
- });
151
- const undimEverything = () => machine.assign(({ context }) => ({
152
- xynodes: context.xynodes.map(Base.setDimmed(false)),
153
- xyedges: context.xyedges.map(Base.setData({
154
- dimmed: false,
155
- active: false
156
- }))
140
+ var assignDynamicViewVariant = () => machine.assign(({ event }) => {
141
+ assertEvent(event, "switch.dynamicViewVariant");
142
+ return { dynamicViewVariant: event.variant };
143
+ });
144
+ var onNodeMouseEnter = (params) => machine.assign(({ context, event }) => {
145
+ let node = params?.node;
146
+ if (!node) {
147
+ assertEvent(event, "xyflow.nodeMouseEnter");
148
+ node = event.node;
149
+ }
150
+ return { xynodes: context.xynodes.map((n) => {
151
+ if (n.id === node.id) return Base.setHovered(n, true);
152
+ return n;
153
+ }) };
154
+ });
155
+ var onNodeMouseLeave = (params) => machine.assign(({ context, event }) => {
156
+ let node = params?.node;
157
+ if (!node) {
158
+ assertEvent(event, "xyflow.nodeMouseLeave");
159
+ node = event.node;
160
+ }
161
+ return { xynodes: context.xynodes.map((n) => {
162
+ if (n.id === node.id) return Base.setHovered(n, false);
163
+ return n;
164
+ }) };
165
+ });
166
+ var emitPaneClick = () => machine.emit(() => ({ type: "paneClick" }));
167
+ var emitOpenSource = (params) => machine.emit(({ event }) => {
168
+ if (params) return {
169
+ type: "openSource",
170
+ params
171
+ };
172
+ assertEvent(event, "open.source");
173
+ return {
174
+ type: "openSource",
175
+ params: event
176
+ };
177
+ });
178
+ var emitOpenSourceOfView = () => machine.emit(({ context }) => ({
179
+ type: "openSource",
180
+ params: { view: context.view.id }
157
181
  }));
158
- const assignDynamicViewVariant = () => machine.assign(({ event }) => {
159
- assertEvent(event, "switch.dynamicViewVariant");
160
- return {
161
- dynamicViewVariant: event.variant
162
- };
163
- });
164
- const onNodeMouseEnter = (params) => machine.assign(({ context, event }) => {
165
- let node = params?.node;
166
- if (!node) {
167
- assertEvent(event, "xyflow.nodeMouseEnter");
168
- node = event.node;
169
- }
170
- return {
171
- xynodes: context.xynodes.map((n) => {
172
- if (n.id === node.id) {
173
- return Base.setHovered(n, true);
174
- }
175
- return n;
176
- })
177
- };
178
- });
179
- const onNodeMouseLeave = (params) => machine.assign(({ context, event }) => {
180
- let node = params?.node;
181
- if (!node) {
182
- assertEvent(event, "xyflow.nodeMouseLeave");
183
- node = event.node;
184
- }
185
- return {
186
- xynodes: context.xynodes.map((n) => {
187
- if (n.id === node.id) {
188
- return Base.setHovered(n, false);
189
- }
190
- return n;
191
- })
192
- };
193
- });
194
- const emitPaneClick = () => machine.emit(() => ({
195
- type: "paneClick"
182
+ var emitInitialized = () => machine.emit(({ context }) => {
183
+ invariant(context.xyflow, "XYFlow instance not found");
184
+ return {
185
+ type: "initialized",
186
+ instance: context.xyflow
187
+ };
188
+ });
189
+ var emitNodeClick = () => machine.emit(({ context, event }) => {
190
+ assertEvent(event, "xyflow.nodeClick");
191
+ return {
192
+ type: "nodeClick",
193
+ node: nonNullable(findDiagramNode(context, event.node.id), `Node ${event.node.id} not found in diagram`),
194
+ xynode: event.node
195
+ };
196
+ });
197
+ var emitNavigateTo = (params) => machine.emit(({ context }) => ({
198
+ type: "navigateTo",
199
+ viewId: params?.viewId ?? nonNullable(context.lastOnNavigate, "Invalid state, lastOnNavigate is null").toView
196
200
  }));
197
- const emitOpenSource = (params) => machine.emit(({ event }) => {
198
- assertEvent(event, "open.source");
199
- return {
200
- type: "openSource",
201
- params: event
202
- };
203
- });
204
- const emitOpenSourceOfView = () => machine.emit(({ context }) => ({
205
- type: "openSource",
206
- params: {
207
- view: context.view.id
208
- }
209
- }));
210
- const emitInitialized = () => machine.emit(({ context }) => {
211
- invariant(context.xyflow, "XYFlow instance not found");
212
- return {
213
- type: "initialized",
214
- instance: context.xyflow
215
- };
216
- });
217
- const emitNodeClick = () => machine.emit(({ context, event }) => {
218
- assertEvent(event, "xyflow.nodeClick");
219
- const node = nonNullable(findDiagramNode(context, event.node.id), `Node ${event.node.id} not found in diagram`);
220
- return {
221
- type: "nodeClick",
222
- node,
223
- xynode: event.node
224
- };
225
- });
226
- const emitNavigateTo = (params) => machine.emit(({ context }) => ({
227
- type: "navigateTo",
228
- viewId: params?.viewId ?? nonNullable(context.lastOnNavigate, "Invalid state, lastOnNavigate is null").toView
229
- }));
230
- const emitEdgeClick = () => machine.emit(({ context, event }) => {
231
- assertEvent(event, "xyflow.edgeClick");
232
- const edge = nonNullable(findDiagramEdge(context, event.edge.id), `Edge ${event.edge.id} not found in diagram`);
233
- return {
234
- type: "edgeClick",
235
- edge,
236
- xyedge: event.edge
237
- };
238
- });
239
- const triggerChange = (viewChange) => machine.enqueueActions(({ event, enqueue }) => {
240
- let change = viewChange;
241
- if (!change) {
242
- assertEvent(event, "trigger.change");
243
- change = event.change;
244
- }
245
- enqueue.assign({
246
- viewportChangedManually: true
247
- });
248
- enqueue.sendTo(
249
- typedSystem.editorActor,
250
- {
251
- type: "change",
252
- change
253
- }
254
- );
255
- });
256
- const emitOnLayoutTypeChange = () => machine.enqueueActions(({ event, system, context, enqueue }) => {
257
- if (!context.features.enableCompareWithLatest) {
258
- console.warn("Layout type cannot be changed while CompareWithLatest feature is disabled");
259
- return;
260
- }
261
- const currentLayoutType = context.view._layout;
262
- let nextLayoutType = currentLayoutType === "auto" ? "manual" : "auto";
263
- if (event.type === "emit.onLayoutTypeChange") {
264
- nextLayoutType = event.layoutType;
265
- }
266
- if (currentLayoutType === nextLayoutType) {
267
- console.warn("Ignoring layout type change event, layout type is already", currentLayoutType);
268
- return;
269
- }
270
- if (context.toggledFeatures.enableCompareWithLatest === true) {
271
- if (currentLayoutType === "manual" && nextLayoutType === "auto") {
272
- typedSystem(system).editorActorRef?.send({
273
- type: "cancel"
274
- });
275
- }
276
- const currentViewport = context.viewport;
277
- if (currentLayoutType === "auto") {
278
- enqueue.assign({
279
- viewportOnAutoLayout: currentViewport
280
- });
281
- }
282
- if (currentLayoutType === "manual") {
283
- enqueue.assign({
284
- viewportOnManualLayout: currentViewport
285
- });
286
- }
287
- }
288
- enqueue.emit({
289
- type: "onLayoutTypeChange",
290
- layoutType: nextLayoutType
291
- });
292
- });
293
- const layoutAlign = (params) => machine.createAction(({ context, event }) => {
294
- let mode;
295
- {
296
- assertEvent(event, "layout.align");
297
- mode = event.mode;
298
- }
299
- const xystore = nonNullable(context.xystore, "xystore is not initialized");
300
- const { nodeLookup, parentLookup } = xystore.getState();
301
- const selectedNodes = new Set(nodeLookup.values().filter((n) => n.selected).map((n) => n.id));
302
- const nodesToAlign = [...difference(selectedNodes, new Set(parentLookup.keys()))];
303
- if (!hasAtLeast(nodesToAlign, 2)) {
304
- console.warn("At least 2 nodes must be selected to align");
305
- return;
306
- }
307
- const constraints = createLayoutConstraints(xystore, nodesToAlign);
308
- const aligner = getAligner(mode);
309
- const nodes = nodesToAlign.map((id) => ({
310
- node: nonNullable(nodeLookup.get(id)),
311
- rect: nonNullable(constraints.rects.get(id))
312
- }));
313
- aligner.computeLayout(nodes.map(({ node }) => toNodeRect(node)));
314
- for (const { rect, node } of nodes) {
315
- rect.positionAbsolute = {
316
- ...rect.positionAbsolute,
317
- ...aligner.applyPosition(toNodeRect(node))
318
- };
319
- }
320
- constraints.updateXYFlow();
321
- });
322
- const resetEdgesControlPoints = () => machine.assign(({ context }) => {
323
- const { nodeLookup } = context.xystore.getState();
324
- return {
325
- xyedges: context.xyedges.map((edge) => {
326
- if (!edge.data.controlPoints) {
327
- return edge;
328
- }
329
- const controlPoints = resetEdgeControlPoints(nodeLookup, edge);
330
- const pt = controlPoints[0];
331
- return {
332
- ...edge,
333
- data: {
334
- ...edge.data,
335
- controlPoints,
336
- labelBBox: edge.data.labelBBox ? { ...edge.data.labelBBox, x: pt.x, y: pt.y } : null,
337
- labelXY: edge.data.labelXY ? pt : null
338
- }
339
- };
340
- })
341
- };
342
- });
343
- const notationsHighlight = () => machine.assign(({ context, event }) => {
344
- assertEvent(event, "notations.highlight");
345
- const { notation, kind } = event;
346
- const targetKinds = kind ? [kind] : notation.kinds;
347
- const shouldHighlight = (node) => node.notation === notation.title && node.shape === notation.shape && node.color === notation.color && targetKinds.includes(node.kind);
348
- const xynodes = context.xynodes.map((n) => {
349
- const node = findDiagramNode(context, n.id);
350
- const highlighted = node && shouldHighlight(node);
351
- return Base.setDimmed(n, highlighted ? false : "immediate");
352
- });
353
- const xyedges = context.xyedges.map((edge) => {
354
- return Base.setDimmed(edge, true);
355
- });
356
- return { xynodes, xyedges };
357
- });
358
- const tagHighlight = () => machine.assign(({ context, event }) => {
359
- assertEvent(event, "tag.highlight");
360
- return {
361
- xynodes: context.xynodes.map((n) => {
362
- if (n.data.tags?.includes(event.tag)) {
363
- return Base.setDimmed(n, false);
364
- }
365
- return Base.setDimmed(n, true);
366
- })
367
- };
368
- });
369
- const highlightNodeOrEdge = () => machine.assign(({ context, event }) => {
370
- assertEvent(event, ["highlight.edge", "highlight.node"]);
371
- switch (event.type) {
372
- case "highlight.node": {
373
- const nodeId = event.nodeId;
374
- const node = context.xynodes.find((n) => n.id === nodeId);
375
- if (!node) {
376
- console.warn(`Node with id ${nodeId} not found for highlighting`);
377
- return {};
378
- }
379
- return {
380
- xynodes: context.xynodes.map((n) => {
381
- return Base.setDimmed(n, n.id === nodeId ? false : true);
382
- }),
383
- xyedges: context.xyedges.map(Base.setData({
384
- dimmed: true,
385
- active: false
386
- }))
387
- };
388
- }
389
- case "highlight.edge": {
390
- const edgeId = event.edgeId;
391
- let edge = context.xyedges.find((e) => e.id === edgeId);
392
- if (!edge) {
393
- console.warn(`Edge with id ${edgeId} not found for highlighting`);
394
- return {};
395
- }
396
- return {
397
- xynodes: context.xynodes.map((n) => {
398
- return Base.setDimmed(n, edge.source !== n.id && edge.target !== n.id);
399
- }),
400
- xyedges: context.xyedges.map((e) => {
401
- return Base.setData(e, {
402
- dimmed: e.id !== edgeId,
403
- active: e.id === edgeId
404
- });
405
- })
406
- };
407
- }
408
- default:
409
- nonexhaustive(event);
410
- }
411
- });
412
- const assignToggledFeatures = () => machine.assign(({ context, event }) => {
413
- assertEvent(event, "toggle.feature");
414
- const feature = `enable${event.feature}`;
415
- const currentValue = context.toggledFeatures[feature] ?? context.features[feature];
416
- const nextValue = event.forceValue ?? !currentValue;
417
- return {
418
- toggledFeatures: {
419
- ...context.toggledFeatures,
420
- [feature]: nextValue
421
- }
422
- };
423
- });
424
- const closeSearch = () => machine.sendTo(
425
- typedSystem.searchActor,
426
- {
427
- type: "close"
428
- }
429
- );
430
- const closeAllOverlays = () => machine.sendTo(
431
- typedSystem.overlaysActor,
432
- {
433
- type: "close.all"
434
- }
435
- );
436
- const stopEditorActor = () => machine.enqueueActions(({ enqueue, system }) => {
437
- const actor = typedSystem(system).editorActorRef;
438
- if (!actor) return;
439
- enqueue.stopChild(actor);
440
- });
441
- const ensureEditorActor = () => machine.enqueueActions(({ enqueue, context, system, check }) => {
442
- const hasEditor = check("enabled: Editor");
443
- const editor = typedSystem(system).editorActorRef;
444
- if (!hasEditor && editor) {
445
- enqueue.stopChild(editor);
446
- return;
447
- }
448
- if (hasEditor && !editor) {
449
- enqueue.spawnChild("editorActor", {
450
- id: "editor",
451
- systemId: "editor",
452
- input: {
453
- viewId: context.view.id
454
- },
455
- syncSnapshot: true
456
- });
457
- }
458
- });
459
- const startEditing = (subject = "node") => machine.sendTo(
460
- typedSystem.editorActor,
461
- {
462
- type: "edit.start",
463
- subject
464
- }
465
- );
466
- const sendSynced = () => machine.sendTo(
467
- typedSystem.editorActor,
468
- {
469
- type: "synced"
470
- }
471
- );
472
- const stopEditing = (wasChanged = false) => machine.sendTo(
473
- typedSystem.editorActor,
474
- {
475
- type: "edit.finish",
476
- wasChanged
477
- }
478
- );
479
- const cancelEditing = () => machine.sendTo(
480
- typedSystem.editorActor,
481
- {
482
- type: "cancel"
483
- }
484
- );
485
- const hasModelFqn = (node) => "modelFqn" in node.data && isTruthy(node.data.modelFqn);
486
- const openElementDetails = (params) => machine.enqueueActions(({ context, event, enqueue }) => {
487
- let initiatedFrom = null;
488
- let fromNodeId, subject;
489
- switch (true) {
490
- // Use from params if available
491
- case false: {
492
- subject = params.fqn;
493
- fromNodeId = params.fromNode ?? context.view.nodes.find((n) => n.modelRef === params.fqn)?.id;
494
- break;
495
- }
496
- case event.type === "xyflow.nodeClick": {
497
- if (!hasModelFqn(event.node)) {
498
- console.warn("No modelFqn in clicked node data");
499
- return;
500
- }
501
- subject = event.node.data.modelFqn;
502
- fromNodeId = event.node.data.id;
503
- break;
504
- }
505
- case event.type === "open.elementDetails": {
506
- subject = event.fqn;
507
- fromNodeId = event.fromNode;
508
- break;
509
- }
510
- default: {
511
- if (!context.lastClickedNode) {
512
- console.warn("No last clicked node");
513
- return;
514
- }
515
- fromNodeId = context.lastClickedNode.id;
516
- const node = context.xynodes.find((n) => n.id === fromNodeId);
517
- if (!node || !hasModelFqn(node)) {
518
- console.warn("No modelFqn in last clicked node");
519
- return;
520
- }
521
- subject = node.data.modelFqn;
522
- break;
523
- }
524
- }
525
- const internalNode = fromNodeId ? context.xystore.getState().nodeLookup.get(fromNodeId) : null;
526
- if (fromNodeId && internalNode) {
527
- const nodeRect = nodeToRect(internalNode);
528
- const zoom = context.xyflow.getZoom();
529
- const clientRect = {
530
- ...context.xyflow.flowToScreenPosition(nodeRect),
531
- width: nodeRect.width * zoom,
532
- height: nodeRect.height * zoom
533
- };
534
- initiatedFrom = {
535
- node: fromNodeId,
536
- clientRect
537
- };
538
- }
539
- enqueue.sendTo(
540
- typedSystem.overlaysActor,
541
- {
542
- type: "open.elementDetails",
543
- subject,
544
- currentView: context.view,
545
- ...initiatedFrom && { initiatedFrom }
546
- }
547
- );
548
- });
549
- const openOverlay = () => machine.enqueueActions(({ context, event, enqueue, check }) => {
550
- assertEvent(event, ["open.relationshipsBrowser", "open.relationshipDetails", "open.elementDetails"]);
551
- if (!check("enabled: Overlays")) {
552
- console.warn("Overlays feature is disabled");
553
- return;
554
- }
555
- switch (event.type) {
556
- case "open.elementDetails": {
557
- check("enabled: ElementDetails") ? enqueue(openElementDetails()) : console.warn("ElementDetails feature is disabled");
558
- break;
559
- }
560
- case "open.relationshipsBrowser": {
561
- if (!context.features.enableRelationshipBrowser) {
562
- console.warn("RelationshipBrowser feature is disabled");
563
- return;
564
- }
565
- enqueue.sendTo(
566
- typedSystem.overlaysActor,
567
- {
568
- type: "open.relationshipsBrowser",
569
- subject: event.fqn,
570
- viewId: context.view.id,
571
- scope: "view",
572
- closeable: true,
573
- enableChangeScope: true,
574
- enableSelectSubject: true
575
- }
576
- );
577
- break;
578
- }
579
- case "open.relationshipDetails": {
580
- if (!context.features.enableRelationshipDetails) {
581
- console.warn("RelationshipDetails feature is disabled");
582
- return;
583
- }
584
- enqueue.sendTo(
585
- typedSystem.overlaysActor,
586
- {
587
- type: "open.relationshipDetails",
588
- viewId: context.view.id,
589
- ...event.params
590
- }
591
- );
592
- break;
593
- }
594
- default:
595
- nonexhaustive(event);
596
- }
597
- });
598
- const openSourceOfFocusedOrLastClickedNode = () => machine.enqueueActions(({ context, enqueue }) => {
599
- const nodeId = context.focusedNode ?? context.lastClickedNode?.id;
600
- if (!nodeId || !context.features.enableVscode) return;
601
- const diagramNode = findDiagramNode(context, nodeId);
602
- if (!diagramNode) return;
603
- if (diagramNode.deploymentRef) {
604
- enqueue.raise({ type: "open.source", deployment: diagramNode.deploymentRef });
605
- } else if (diagramNode.modelRef) {
606
- enqueue.raise({ type: "open.source", element: diagramNode.modelRef });
607
- }
608
- });
609
- const ensureOverlaysActor = () => machine.enqueueActions(({ enqueue, check, system }) => {
610
- const enabled = check("enabled: Overlays");
611
- const running = typedSystem(system).overlaysActorRef;
612
- if (enabled && !running) {
613
- enqueue.spawnChild("overlaysActorLogic", {
614
- id: "overlays",
615
- systemId: "overlays",
616
- syncSnapshot: true
617
- });
618
- return;
619
- }
620
- if (!enabled && running) {
621
- enqueue.sendTo(running, {
622
- type: "close.all"
623
- });
624
- enqueue.stopChild(running);
625
- }
626
- });
627
- const ensureSearchActor = () => machine.enqueueActions(({ enqueue, check, system }) => {
628
- const enabled = check("enabled: Search");
629
- const running = typedSystem(system).searchActorRef;
630
- if (enabled && !running) {
631
- enqueue.spawnChild("searchActorLogic", {
632
- id: "search",
633
- systemId: "search",
634
- syncSnapshot: true
635
- });
636
- return;
637
- }
638
- if (!enabled && running) {
639
- enqueue.sendTo(running, {
640
- type: "close"
641
- });
642
- enqueue.stopChild(running);
643
- }
644
- });
645
- const onEdgeMouseEnter = () => machine.enqueueActions(({ enqueue, context, event }) => {
646
- assertEvent(event, "xyflow.edgeMouseEnter");
647
- let edge = event.edge;
648
- enqueue.assign({
649
- xyedges: context.xyedges.map((e) => {
650
- if (e.id === event.edge.id) {
651
- edge = Base.setHovered(e, true);
652
- return edge;
653
- }
654
- return e;
655
- })
656
- });
657
- enqueue.emit({
658
- type: "edgeMouseEnter",
659
- edge,
660
- event: event.event
661
- });
662
- });
663
- const onEdgeMouseLeave = () => machine.enqueueActions(({ enqueue, context, event }) => {
664
- assertEvent(event, "xyflow.edgeMouseLeave");
665
- let edge = event.edge;
666
- enqueue.assign({
667
- xyedges: context.xyedges.map((e) => {
668
- if (e.id === event.edge.id) {
669
- edge = Base.setHovered(e, false);
670
- return edge;
671
- }
672
- return e;
673
- })
674
- });
675
- enqueue.emit({
676
- type: "edgeMouseLeave",
677
- edge,
678
- event: event.event
679
- });
680
- });
681
- const startHotKeyActor = () => machine.spawnChild("hotkeyActorLogic", { id: "hotkey" });
682
- const stopHotKeyActor = () => machine.stopChild("hotkey");
683
- const AUTO_UNFOCUS_DELAY = 3e3;
684
- const startAutoUnfocusTimer = () => machine.enqueueActions(({ context, enqueue }) => {
685
- if (context.autoUnfocusTimer && AUTO_UNFOCUS_DELAY > 0) {
686
- enqueue.raise({ type: "focus.autoUnfocus" }, { delay: AUTO_UNFOCUS_DELAY, id: "autoUnfocusTimer" });
687
- }
688
- });
689
- const cancelAutoUnfocusTimer = () => machine.cancel("autoUnfocusTimer");
690
- const handleNavigate = () => machine.enqueueActions(({ enqueue, context, event }) => {
691
- assertEvent(event, ["navigate.to", "navigate.back", "navigate.forward"]);
692
- const {
693
- view,
694
- focusedNode,
695
- activeWalkthrough,
696
- dynamicViewVariant,
697
- viewport,
698
- viewportChangedManually,
699
- viewportBefore,
700
- navigationHistory
701
- } = context;
702
- let { currentIndex, history: _history } = navigationHistory;
703
- let history = _history;
704
- if (currentIndex < _history.length) {
705
- const updatedEntry = produce(_history.at(currentIndex) ?? {}, (draft) => {
706
- draft.viewport = { ...viewport };
707
- draft.viewportChangedManually = viewportChangedManually;
708
- draft.focusedNode = focusedNode;
709
- if (view._type === "dynamic") {
710
- draft.activeWalkthrough = activeWalkthrough?.stepId ?? null;
711
- draft.dynamicViewVariant = dynamicViewVariant;
712
- } else {
713
- draft.activeWalkthrough = null;
714
- draft.dynamicViewVariant = null;
715
- }
716
- if (viewportBefore) {
717
- draft.viewportBefore = structuredClone(viewportBefore);
718
- } else {
719
- delete draft.viewportBefore;
720
- }
721
- });
722
- history = [..._history];
723
- history[currentIndex] = updatedEntry;
724
- }
725
- switch (event.type) {
726
- case "navigate.to": {
727
- enqueue.assign({
728
- navigationHistory: {
729
- currentIndex,
730
- history
731
- },
732
- lastOnNavigate: {
733
- fromView: context.view.id,
734
- toView: event.viewId,
735
- fromNode: event.fromNode ?? null,
736
- focusOnElement: event.focusOnElement ?? null
737
- }
738
- });
739
- enqueue(emitNavigateTo());
740
- break;
741
- }
742
- case "navigate.back": {
743
- invariant(currentIndex > 0, "Cannot navigate back");
744
- const stepBack = history[currentIndex - 1];
745
- enqueue.assign({
746
- navigationHistory: {
747
- currentIndex: currentIndex - 1,
748
- history
749
- },
750
- lastOnNavigate: null
751
- });
752
- enqueue(emitNavigateTo({ viewId: stepBack.viewId }));
753
- break;
754
- }
755
- case "navigate.forward": {
756
- invariant(currentIndex < history.length - 1, "Cannot navigate forward");
757
- const stepForward = history[currentIndex + 1];
758
- enqueue.assign({
759
- navigationHistory: {
760
- currentIndex: currentIndex + 1,
761
- history
762
- },
763
- lastOnNavigate: null
764
- });
765
- enqueue(emitNavigateTo({ viewId: stepForward.viewId }));
766
- break;
767
- }
768
- default:
769
- nonexhaustive(event);
770
- }
771
- });
772
- const updateView = () => machine.enqueueActions(
773
- ({ enqueue, event, context }) => {
774
- if (event.type !== "update.view") {
775
- console.warn(`Ignoring unexpected event type: ${event.type} in action 'update.view'`);
776
- return;
777
- }
778
- const nextView = event.view;
779
- const isAnotherView = nextView.id !== context.view.id;
780
- if (isAnotherView) {
781
- console.warn("updateView called for another view - ignoring", { event });
782
- return;
783
- }
784
- enqueue(assignXYDataFromView());
785
- if (event.source === "editor") {
786
- return;
787
- }
788
- enqueue(sendSynced());
789
- if (context.toggledFeatures.enableCompareWithLatest === true && context.view._layout !== nextView._layout) {
790
- if (nextView._layout === "auto" && context.viewportOnAutoLayout) {
791
- enqueue(
792
- setViewport({
793
- viewport: context.viewportOnAutoLayout,
794
- duration: 0
795
- })
796
- );
797
- return;
798
- }
799
- if (nextView._layout === "manual" && context.viewportOnManualLayout) {
800
- enqueue(
801
- setViewport({
802
- viewport: context.viewportOnManualLayout,
803
- duration: 0
804
- })
805
- );
806
- return;
807
- }
808
- }
809
- let recenter = !context.viewportChangedManually && !context.focusedNode && !context.activeWalkthrough;
810
- recenter = recenter || context.toggledFeatures.enableCompareWithLatest === true && !!nextView._layout && context.view._layout !== nextView._layout;
811
- if (nextView._type === "dynamic" && context.view._type === "dynamic") {
812
- if (nextView.variant === context.view.variant && nextView.variant !== context.dynamicViewVariant) {
813
- const nextCenter = BBox.center(viewBounds(context, nextView));
814
- enqueue(setViewportCenter(nextCenter));
815
- }
816
- }
817
- if (recenter) {
818
- enqueue(cancelFitDiagram());
819
- enqueue(raiseFitDiagram());
820
- }
821
- }
822
- );
823
-
824
- export { assignDynamicViewVariant, assignFocusedNode, assignLastClickedNode, assignToggledFeatures, assignXYDataFromView, cancelAutoUnfocusTimer, cancelEditing, cancelFitDiagram, closeAllOverlays, closeSearch, disableCompareWithLatest, emitEdgeClick, emitInitialized, emitNavigateTo, emitNodeClick, emitOnLayoutTypeChange, emitOpenSource, emitOpenSourceOfView, emitPaneClick, ensureEditorActor, ensureOverlaysActor, ensureSearchActor, focusOnNodesAndEdges, handleNavigate, highlightNodeOrEdge, layoutAlign, notationsHighlight, onEdgeDoubleClick, onEdgeMouseEnter, onEdgeMouseLeave, onNodeMouseEnter, onNodeMouseLeave, openElementDetails, openOverlay, openSourceOfFocusedOrLastClickedNode, raiseFitDiagram, resetEdgesControlPoints, resetLastClickedNode, sendSynced, setViewport, setViewportCenter, startAutoUnfocusTimer, startEditing, startHotKeyActor, stopEditing, stopEditorActor, stopHotKeyActor, tagHighlight, triggerChange, undimEverything, updateFeatures, updateInputs, updateView };
201
+ var emitEdgeClick = () => machine.emit(({ context, event }) => {
202
+ assertEvent(event, "xyflow.edgeClick");
203
+ return {
204
+ type: "edgeClick",
205
+ edge: nonNullable(findDiagramEdge(context, event.edge.id), `Edge ${event.edge.id} not found in diagram`),
206
+ xyedge: event.edge
207
+ };
208
+ });
209
+ var triggerChange = (viewChange) => machine.enqueueActions(({ event, enqueue }) => {
210
+ let change = viewChange;
211
+ if (!change) {
212
+ assertEvent(event, "trigger.change");
213
+ change = event.change;
214
+ }
215
+ enqueue.assign({ viewportChangedManually: true });
216
+ enqueue.sendTo(typedSystem.editorActor, {
217
+ type: "change",
218
+ change
219
+ });
220
+ });
221
+ var emitOnLayoutTypeChange = () => machine.enqueueActions(({ event, system, context, enqueue }) => {
222
+ if (!context.features.enableCompareWithLatest) {
223
+ console.warn("Layout type cannot be changed while CompareWithLatest feature is disabled");
224
+ return;
225
+ }
226
+ const currentLayoutType = context.view._layout;
227
+ let nextLayoutType = currentLayoutType === "auto" ? "manual" : "auto";
228
+ if (event.type === "emit.onLayoutTypeChange") nextLayoutType = event.layoutType;
229
+ if (currentLayoutType === nextLayoutType) {
230
+ console.warn("Ignoring layout type change event, layout type is already", currentLayoutType);
231
+ return;
232
+ }
233
+ if (context.toggledFeatures.enableCompareWithLatest === true) {
234
+ if (currentLayoutType === "manual" && nextLayoutType === "auto") typedSystem(system).editorActorRef?.send({ type: "cancel" });
235
+ const currentViewport = context.viewport;
236
+ if (currentLayoutType === "auto") enqueue.assign({ viewportOnAutoLayout: currentViewport });
237
+ if (currentLayoutType === "manual") enqueue.assign({ viewportOnManualLayout: currentViewport });
238
+ }
239
+ enqueue.emit({
240
+ type: "onLayoutTypeChange",
241
+ layoutType: nextLayoutType
242
+ });
243
+ });
244
+ var layoutAlign = (params) => machine.createAction(({ context, event }) => {
245
+ let mode;
246
+ if (params) mode = params.mode;
247
+ else {
248
+ assertEvent(event, "layout.align");
249
+ mode = event.mode;
250
+ }
251
+ const xystore = nonNullable(context.xystore, "xystore is not initialized");
252
+ const { nodeLookup, parentLookup } = xystore.getState();
253
+ const nodesToAlign = [...difference$1(new Set(nodeLookup.values().filter((n) => n.selected).map((n) => n.id)), new Set(parentLookup.keys()))];
254
+ if (!hasAtLeast(nodesToAlign, 2)) {
255
+ console.warn("At least 2 nodes must be selected to align");
256
+ return;
257
+ }
258
+ const constraints = createLayoutConstraints(xystore, nodesToAlign);
259
+ const aligner = getAligner(mode);
260
+ const nodes = nodesToAlign.map((id) => ({
261
+ node: nonNullable(nodeLookup.get(id)),
262
+ rect: nonNullable(constraints.rects.get(id))
263
+ }));
264
+ aligner.computeLayout(nodes.map(({ node }) => toNodeRect(node)));
265
+ for (const { rect, node } of nodes) rect.positionAbsolute = {
266
+ ...rect.positionAbsolute,
267
+ ...aligner.applyPosition(toNodeRect(node))
268
+ };
269
+ constraints.updateXYFlow();
270
+ });
271
+ var resetEdgesControlPoints = () => machine.assign(({ context }) => {
272
+ const { nodeLookup } = context.xystore.getState();
273
+ return { xyedges: context.xyedges.map((edge) => {
274
+ if (!edge.data.controlPoints) return edge;
275
+ const controlPoints = resetEdgeControlPoints(nodeLookup, edge);
276
+ const pt = controlPoints[0];
277
+ return {
278
+ ...edge,
279
+ data: {
280
+ ...edge.data,
281
+ controlPoints,
282
+ labelBBox: edge.data.labelBBox ? {
283
+ ...edge.data.labelBBox,
284
+ x: pt.x,
285
+ y: pt.y
286
+ } : null,
287
+ labelXY: edge.data.labelXY ? pt : null
288
+ }
289
+ };
290
+ }) };
291
+ });
292
+ var notationsHighlight = () => machine.assign(({ context, event }) => {
293
+ assertEvent(event, "notations.highlight");
294
+ const { notation, kind } = event;
295
+ const targetKinds = kind ? [kind] : notation.kinds;
296
+ const shouldHighlight = (node) => node.notation === notation.title && node.shape === notation.shape && node.color === notation.color && targetKinds.includes(node.kind);
297
+ return {
298
+ xynodes: context.xynodes.map((n) => {
299
+ const node = findDiagramNode(context, n.id);
300
+ const highlighted = node && shouldHighlight(node);
301
+ return Base.setDimmed(n, highlighted ? false : "immediate");
302
+ }),
303
+ xyedges: context.xyedges.map((edge) => {
304
+ return Base.setDimmed(edge, true);
305
+ })
306
+ };
307
+ });
308
+ var tagHighlight = () => machine.assign(({ context, event }) => {
309
+ assertEvent(event, "tag.highlight");
310
+ return { xynodes: context.xynodes.map((n) => {
311
+ if (n.data.tags?.includes(event.tag)) return Base.setDimmed(n, false);
312
+ return Base.setDimmed(n, true);
313
+ }) };
314
+ });
315
+ var highlightNodeOrEdge = () => machine.assign(({ context, event }) => {
316
+ assertEvent(event, ["highlight.edge", "highlight.node"]);
317
+ switch (event.type) {
318
+ case "highlight.node": {
319
+ const nodeId = event.nodeId;
320
+ if (!context.xynodes.find((n) => n.id === nodeId)) {
321
+ console.warn(`Node with id ${nodeId} not found for highlighting`);
322
+ return {};
323
+ }
324
+ return {
325
+ xynodes: context.xynodes.map((n) => {
326
+ return Base.setDimmed(n, n.id === nodeId ? false : true);
327
+ }),
328
+ xyedges: context.xyedges.map(Base.setData({
329
+ dimmed: true,
330
+ active: false
331
+ }))
332
+ };
333
+ }
334
+ case "highlight.edge": {
335
+ const edgeId = event.edgeId;
336
+ let edge = context.xyedges.find((e) => e.id === edgeId);
337
+ if (!edge) {
338
+ console.warn(`Edge with id ${edgeId} not found for highlighting`);
339
+ return {};
340
+ }
341
+ return {
342
+ xynodes: context.xynodes.map((n) => {
343
+ return Base.setDimmed(n, edge.source !== n.id && edge.target !== n.id);
344
+ }),
345
+ xyedges: context.xyedges.map((e) => {
346
+ return Base.setData(e, {
347
+ dimmed: e.id !== edgeId,
348
+ active: e.id === edgeId
349
+ });
350
+ })
351
+ };
352
+ }
353
+ default: nonexhaustive(event);
354
+ }
355
+ });
356
+ var assignToggledFeatures = () => machine.assign(({ context, event }) => {
357
+ assertEvent(event, "toggle.feature");
358
+ const feature = `enable${event.feature}`;
359
+ const currentValue = context.toggledFeatures[feature] ?? context.features[feature];
360
+ const nextValue = event.forceValue ?? !currentValue;
361
+ return { toggledFeatures: {
362
+ ...context.toggledFeatures,
363
+ [feature]: nextValue
364
+ } };
365
+ });
366
+ var closeSearch = () => machine.sendTo(typedSystem.searchActor, { type: "close" });
367
+ var closeAllOverlays = () => machine.sendTo(typedSystem.overlaysActor, { type: "close.all" });
368
+ var stopEditorActor = () => machine.enqueueActions(({ enqueue, system }) => {
369
+ const actor = typedSystem(system).editorActorRef;
370
+ if (!actor) return;
371
+ enqueue.stopChild(actor);
372
+ });
373
+ /**
374
+ * Ensure that the sync layout actor is running or stopped based on the read-only state
375
+ */
376
+ var ensureEditorActor = () => machine.enqueueActions(({ enqueue, context, system, check }) => {
377
+ const hasEditor = check("enabled: Editor");
378
+ const editor = typedSystem(system).editorActorRef;
379
+ if (!hasEditor && editor) {
380
+ enqueue.stopChild(editor);
381
+ return;
382
+ }
383
+ if (hasEditor && !editor) enqueue.spawnChild("editorActor", {
384
+ id: "editor",
385
+ systemId: "editor",
386
+ input: { viewId: context.view.id },
387
+ syncSnapshot: true
388
+ });
389
+ });
390
+ var startEditing = (subject = "node") => machine.sendTo(typedSystem.editorActor, {
391
+ type: "edit.start",
392
+ subject
393
+ });
394
+ var sendSynced = () => machine.sendTo(typedSystem.editorActor, { type: "synced" });
395
+ var stopEditing = (wasChanged = false) => machine.sendTo(typedSystem.editorActor, {
396
+ type: "edit.finish",
397
+ wasChanged
398
+ });
399
+ var cancelEditing = () => machine.sendTo(typedSystem.editorActor, { type: "cancel" });
400
+ var hasModelFqn = (node) => "modelFqn" in node.data && isTruthy(node.data.modelFqn);
401
+ var openElementDetails = (params) => machine.enqueueActions(({ context, event, enqueue }) => {
402
+ let initiatedFrom = null;
403
+ let fromNodeId;
404
+ let subject;
405
+ switch (true) {
406
+ case !!params:
407
+ subject = params.fqn;
408
+ fromNodeId = params.fromNode ?? context.view.nodes.find((n) => n.modelRef === params.fqn)?.id;
409
+ break;
410
+ case event.type === "xyflow.nodeClick":
411
+ if (!hasModelFqn(event.node)) {
412
+ console.warn("No modelFqn in clicked node data");
413
+ return;
414
+ }
415
+ subject = event.node.data.modelFqn;
416
+ fromNodeId = event.node.data.id;
417
+ break;
418
+ case event.type === "open.elementDetails":
419
+ subject = event.fqn;
420
+ fromNodeId = event.fromNode;
421
+ break;
422
+ default: {
423
+ if (!context.lastClickedNode) {
424
+ console.warn("No last clicked node");
425
+ return;
426
+ }
427
+ fromNodeId = context.lastClickedNode.id;
428
+ const node = context.xynodes.find((n) => n.id === fromNodeId);
429
+ if (!node || !hasModelFqn(node)) {
430
+ console.warn("No modelFqn in last clicked node");
431
+ return;
432
+ }
433
+ subject = node.data.modelFqn;
434
+ break;
435
+ }
436
+ }
437
+ const internalNode = fromNodeId ? context.xystore.getState().nodeLookup.get(fromNodeId) : null;
438
+ if (fromNodeId && internalNode) {
439
+ const nodeRect = nodeToRect(internalNode);
440
+ const zoom = context.xyflow.getZoom();
441
+ const clientRect = {
442
+ ...context.xyflow.flowToScreenPosition(nodeRect),
443
+ width: nodeRect.width * zoom,
444
+ height: nodeRect.height * zoom
445
+ };
446
+ initiatedFrom = {
447
+ node: fromNodeId,
448
+ clientRect
449
+ };
450
+ }
451
+ enqueue.sendTo(typedSystem.overlaysActor, {
452
+ type: "open.elementDetails",
453
+ subject,
454
+ currentView: context.view,
455
+ ...initiatedFrom && { initiatedFrom }
456
+ });
457
+ });
458
+ var openOverlay = () => machine.enqueueActions(({ context, event, enqueue, check }) => {
459
+ assertEvent(event, [
460
+ "open.relationshipsBrowser",
461
+ "open.relationshipDetails",
462
+ "open.elementDetails"
463
+ ]);
464
+ if (!check("enabled: Overlays")) {
465
+ console.warn("Overlays feature is disabled");
466
+ return;
467
+ }
468
+ switch (event.type) {
469
+ case "open.elementDetails":
470
+ check("enabled: ElementDetails") ? enqueue(openElementDetails()) : console.warn("ElementDetails feature is disabled");
471
+ break;
472
+ case "open.relationshipsBrowser":
473
+ if (!context.features.enableRelationshipBrowser) {
474
+ console.warn("RelationshipBrowser feature is disabled");
475
+ return;
476
+ }
477
+ enqueue.sendTo(typedSystem.overlaysActor, {
478
+ type: "open.relationshipsBrowser",
479
+ subject: event.fqn,
480
+ viewId: context.view.id,
481
+ scope: "view",
482
+ closeable: true,
483
+ enableChangeScope: true,
484
+ enableSelectSubject: true
485
+ });
486
+ break;
487
+ case "open.relationshipDetails":
488
+ if (!context.features.enableRelationshipDetails) {
489
+ console.warn("RelationshipDetails feature is disabled");
490
+ return;
491
+ }
492
+ enqueue.sendTo(typedSystem.overlaysActor, {
493
+ type: "open.relationshipDetails",
494
+ viewId: context.view.id,
495
+ ...event.params
496
+ });
497
+ break;
498
+ default: nonexhaustive(event);
499
+ }
500
+ });
501
+ var openSourceOfFocusedOrLastClickedNode = () => machine.enqueueActions(({ context, enqueue }) => {
502
+ const nodeId = context.focusedNode ?? context.lastClickedNode?.id;
503
+ if (!nodeId || !context.features.enableVscode) return;
504
+ const diagramNode = findDiagramNode(context, nodeId);
505
+ if (!diagramNode) return;
506
+ if (diagramNode.deploymentRef) enqueue.raise({
507
+ type: "open.source",
508
+ deployment: diagramNode.deploymentRef
509
+ });
510
+ else if (diagramNode.modelRef) enqueue.raise({
511
+ type: "open.source",
512
+ element: diagramNode.modelRef
513
+ });
514
+ });
515
+ /**
516
+ * Ensure that the overlays actor is running or stopped based on the current feature flags
517
+ */
518
+ var ensureOverlaysActor = () => machine.enqueueActions(({ enqueue, check, system }) => {
519
+ const enabled = check("enabled: Overlays");
520
+ const running = typedSystem(system).overlaysActorRef;
521
+ if (enabled && !running) {
522
+ enqueue.spawnChild("overlaysActorLogic", {
523
+ id: "overlays",
524
+ systemId: "overlays",
525
+ syncSnapshot: true
526
+ });
527
+ return;
528
+ }
529
+ if (!enabled && running) {
530
+ enqueue.sendTo(running, { type: "close.all" });
531
+ enqueue.stopChild(running);
532
+ }
533
+ });
534
+ /**
535
+ * Ensure that the search actor is running or stopped based on the current feature flags
536
+ */
537
+ var ensureSearchActor = () => machine.enqueueActions(({ enqueue, check, system }) => {
538
+ const enabled = check("enabled: Search");
539
+ const running = typedSystem(system).searchActorRef;
540
+ if (enabled && !running) {
541
+ enqueue.spawnChild("searchActorLogic", {
542
+ id: "search",
543
+ systemId: "search",
544
+ syncSnapshot: true
545
+ });
546
+ return;
547
+ }
548
+ if (!enabled && running) {
549
+ enqueue.sendTo(running, { type: "close" });
550
+ enqueue.stopChild(running);
551
+ }
552
+ });
553
+ var onEdgeMouseEnter = () => machine.enqueueActions(({ enqueue, context, event }) => {
554
+ assertEvent(event, "xyflow.edgeMouseEnter");
555
+ let edge = event.edge;
556
+ enqueue.assign({ xyedges: context.xyedges.map((e) => {
557
+ if (e.id === event.edge.id) {
558
+ edge = Base.setHovered(e, true);
559
+ return edge;
560
+ }
561
+ return e;
562
+ }) });
563
+ enqueue.emit({
564
+ type: "edgeMouseEnter",
565
+ edge,
566
+ event: event.event
567
+ });
568
+ });
569
+ var onEdgeMouseLeave = () => machine.enqueueActions(({ enqueue, context, event }) => {
570
+ assertEvent(event, "xyflow.edgeMouseLeave");
571
+ let edge = event.edge;
572
+ enqueue.assign({ xyedges: context.xyedges.map((e) => {
573
+ if (e.id === event.edge.id) {
574
+ edge = Base.setHovered(e, false);
575
+ return edge;
576
+ }
577
+ return e;
578
+ }) });
579
+ enqueue.emit({
580
+ type: "edgeMouseLeave",
581
+ edge,
582
+ event: event.event
583
+ });
584
+ });
585
+ var startHotKeyActor = () => machine.spawnChild("hotkeyActorLogic", { id: "hotkey" });
586
+ var stopHotKeyActor = () => machine.stopChild("hotkey");
587
+ /**
588
+ * Auto-unfocus timer duration in milliseconds.
589
+ * Set to 0 to disable auto-unfocus (focus remains until user clicks elsewhere).
590
+ * Used for focusing nodes from search results.
591
+ */
592
+ var AUTO_UNFOCUS_DELAY = 3e3;
593
+ var startAutoUnfocusTimer = () => machine.enqueueActions(({ context, enqueue }) => {
594
+ if (context.autoUnfocusTimer && AUTO_UNFOCUS_DELAY > 0) enqueue.raise({ type: "focus.autoUnfocus" }, {
595
+ delay: AUTO_UNFOCUS_DELAY,
596
+ id: "autoUnfocusTimer"
597
+ });
598
+ });
599
+ var cancelAutoUnfocusTimer = () => machine.cancel("autoUnfocusTimer");
600
+ var handleNavigate = () => machine.enqueueActions(({ enqueue, context, event }) => {
601
+ assertEvent(event, [
602
+ "navigate.to",
603
+ "navigate.back",
604
+ "navigate.forward"
605
+ ]);
606
+ const { view, focusedNode, activeWalkthrough, dynamicViewVariant, viewport, viewportChangedManually, viewportBefore, navigationHistory } = context;
607
+ let { currentIndex, history: _history } = navigationHistory;
608
+ let history = _history;
609
+ if (currentIndex < _history.length) {
610
+ const updatedEntry = produce(_history.at(currentIndex) ?? {}, (draft) => {
611
+ draft.viewport = { ...viewport };
612
+ draft.viewportChangedManually = viewportChangedManually;
613
+ draft.focusedNode = focusedNode;
614
+ if (view._type === "dynamic") {
615
+ draft.activeWalkthrough = activeWalkthrough?.stepId ?? null;
616
+ draft.dynamicViewVariant = dynamicViewVariant;
617
+ } else {
618
+ draft.activeWalkthrough = null;
619
+ draft.dynamicViewVariant = null;
620
+ }
621
+ if (viewportBefore) draft.viewportBefore = structuredClone(viewportBefore);
622
+ else delete draft.viewportBefore;
623
+ });
624
+ history = [..._history];
625
+ history[currentIndex] = updatedEntry;
626
+ }
627
+ switch (event.type) {
628
+ case "navigate.to":
629
+ enqueue.assign({
630
+ navigationHistory: {
631
+ currentIndex,
632
+ history
633
+ },
634
+ lastOnNavigate: {
635
+ fromView: context.view.id,
636
+ toView: event.viewId,
637
+ fromNode: event.fromNode ?? null,
638
+ focusOnElement: event.focusOnElement ?? null
639
+ }
640
+ });
641
+ enqueue(emitNavigateTo());
642
+ break;
643
+ case "navigate.back": {
644
+ invariant(currentIndex > 0, "Cannot navigate back");
645
+ const stepBack = history[currentIndex - 1];
646
+ enqueue.assign({
647
+ navigationHistory: {
648
+ currentIndex: currentIndex - 1,
649
+ history
650
+ },
651
+ lastOnNavigate: null
652
+ });
653
+ enqueue(emitNavigateTo({ viewId: stepBack.viewId }));
654
+ break;
655
+ }
656
+ case "navigate.forward": {
657
+ invariant(currentIndex < history.length - 1, "Cannot navigate forward");
658
+ const stepForward = history[currentIndex + 1];
659
+ enqueue.assign({
660
+ navigationHistory: {
661
+ currentIndex: currentIndex + 1,
662
+ history
663
+ },
664
+ lastOnNavigate: null
665
+ });
666
+ enqueue(emitNavigateTo({ viewId: stepForward.viewId }));
667
+ break;
668
+ }
669
+ default: nonexhaustive(event);
670
+ }
671
+ });
672
+ var updateView = () => machine.enqueueActions(({ enqueue, event, context }) => {
673
+ if (event.type !== "update.view") {
674
+ console.warn(`Ignoring unexpected event type: ${event.type} in action 'update.view'`);
675
+ return;
676
+ }
677
+ const nextView = event.view;
678
+ if (nextView.id !== context.view.id) {
679
+ console.warn("updateView called for another view - ignoring", { event });
680
+ return;
681
+ }
682
+ enqueue(assignXYDataFromView());
683
+ if (event.source === "editor") return;
684
+ enqueue(sendSynced());
685
+ if (context.toggledFeatures.enableCompareWithLatest === true && context.view._layout !== nextView._layout) {
686
+ if (nextView._layout === "auto" && context.viewportOnAutoLayout) {
687
+ enqueue(setViewport({
688
+ viewport: context.viewportOnAutoLayout,
689
+ duration: 0
690
+ }));
691
+ return;
692
+ }
693
+ if (nextView._layout === "manual" && context.viewportOnManualLayout) {
694
+ enqueue(setViewport({
695
+ viewport: context.viewportOnManualLayout,
696
+ duration: 0
697
+ }));
698
+ return;
699
+ }
700
+ }
701
+ let recenter = !context.viewportChangedManually && !context.focusedNode && !context.activeWalkthrough;
702
+ recenter = recenter || context.toggledFeatures.enableCompareWithLatest === true && !!nextView._layout && context.view._layout !== nextView._layout;
703
+ if (nextView._type === "dynamic" && context.view._type === "dynamic") {
704
+ if (nextView.variant === context.view.variant && nextView.variant !== context.dynamicViewVariant) enqueue(setViewportCenter(BBox$1.center(viewBounds(context, nextView))));
705
+ }
706
+ if (recenter) {
707
+ enqueue(cancelFitDiagram());
708
+ enqueue(raiseFitDiagram());
709
+ }
710
+ });
711
+ //#endregion
712
+ export { assignDynamicViewVariant, assignFocusedNode, assignLastClickedNode, assignToggledFeatures, assignXYDataFromView, cancelAutoUnfocusTimer, cancelEditing, closeAllOverlays, closeSearch, disableCompareWithLatest, emitEdgeClick, emitInitialized, emitNodeClick, emitOnLayoutTypeChange, emitOpenSource, emitOpenSourceOfView, emitPaneClick, ensureEditorActor, ensureOverlaysActor, ensureSearchActor, focusOnNodesAndEdges, handleNavigate, highlightNodeOrEdge, layoutAlign, notationsHighlight, onEdgeDoubleClick, onEdgeMouseEnter, onEdgeMouseLeave, onNodeMouseEnter, onNodeMouseLeave, openElementDetails, openOverlay, openSourceOfFocusedOrLastClickedNode, resetEdgesControlPoints, resetLastClickedNode, startAutoUnfocusTimer, startEditing, startHotKeyActor, stopEditing, stopEditorActor, stopHotKeyActor, tagHighlight, triggerChange, undimEverything, updateFeatures, updateInputs, updateView };