@likec4/diagram 1.55.0 → 1.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/dist/LikeC4Diagram.js +148 -194
  2. package/dist/LikeC4ModelProvider.js +13 -9
  3. package/dist/LikeC4ProjectsOverview.js +24 -30
  4. package/dist/LikeC4ProjectsProvider.js +33 -26
  5. package/dist/LikeC4Styles.js +40 -57
  6. package/dist/LikeC4View.js +156 -196
  7. package/dist/ReactLikeC4.js +43 -65
  8. package/dist/StaticLikeC4Diagram.js +36 -41
  9. package/dist/_virtual/_rolldown/runtime.js +17 -0
  10. package/dist/adhoc-editor/EditorPanel.js +102 -101
  11. package/dist/adhoc-editor/ElementsTree.js +113 -139
  12. package/dist/adhoc-editor/LikeC4AdHocViewEditor.js +77 -70
  13. package/dist/adhoc-editor/components/Tree.d.ts +2 -2
  14. package/dist/adhoc-editor/components/Tree.js +205 -288
  15. package/dist/adhoc-editor/hooks.js +28 -23
  16. package/dist/adhoc-editor/index.js +2 -1
  17. package/dist/adhoc-editor/state/ActorProvider.js +33 -36
  18. package/dist/adhoc-editor/state/actor.editor.js +148 -186
  19. package/dist/adhoc-editor/state/actor.js +12 -14
  20. package/dist/adhoc-editor/state/actor.layouter.js +49 -65
  21. package/dist/adhoc-editor/state/actor.types.js +19 -23
  22. package/dist/adhoc-editor/state/panel.js +112 -127
  23. package/dist/adhoc-editor/state/utils.js +22 -29
  24. package/dist/adhoc-editor/useElementsTree.js +89 -121
  25. package/dist/base/Background.js +26 -29
  26. package/dist/base/Base.js +34 -41
  27. package/dist/base/BaseXYFlow.js +135 -165
  28. package/dist/base/const.js +18 -19
  29. package/dist/base/updateEdges.js +38 -57
  30. package/dist/base/updateNodes.js +46 -65
  31. package/dist/base-primitives/Markdown.d.ts +1 -1
  32. package/dist/base-primitives/Markdown.js +32 -47
  33. package/dist/base-primitives/NodeHandles.js +39 -49
  34. package/dist/base-primitives/compound/CompoundActionButton.js +49 -69
  35. package/dist/base-primitives/compound/CompoundDetailsButton.js +39 -64
  36. package/dist/base-primitives/compound/CompoundNodeContainer.js +46 -66
  37. package/dist/base-primitives/compound/CompoundTitle.js +15 -12
  38. package/dist/base-primitives/compound/actionbtns.css.js +9 -18
  39. package/dist/base-primitives/edge/EdgeActionButton.js +17 -19
  40. package/dist/base-primitives/edge/EdgeContainer.js +29 -48
  41. package/dist/base-primitives/edge/EdgeLabel.js +44 -65
  42. package/dist/base-primitives/edge/EdgeLabelContainer.d.ts +1 -1
  43. package/dist/base-primitives/edge/EdgeLabelContainer.js +35 -72
  44. package/dist/base-primitives/edge/EdgeMarkers.js +157 -215
  45. package/dist/base-primitives/edge/EdgePath.js +62 -115
  46. package/dist/base-primitives/element/ElementActionButtons.js +92 -81
  47. package/dist/base-primitives/element/ElementData.js +107 -126
  48. package/dist/base-primitives/element/ElementDetailsButton.js +78 -98
  49. package/dist/base-primitives/element/ElementNodeContainer.js +51 -82
  50. package/dist/base-primitives/element/ElementShape.js +331 -317
  51. package/dist/base-primitives/element/ElementTags.d.ts +1 -1
  52. package/dist/base-primitives/element/ElementTags.js +133 -193
  53. package/dist/base-primitives/memoEdge.js +11 -10
  54. package/dist/base-primitives/memoNode.js +16 -20
  55. package/dist/components/ErrorFallback.js +111 -75
  56. package/dist/components/GithubIcon.js +14 -16
  57. package/dist/components/Link.js +99 -113
  58. package/dist/components/Logo.js +38 -41
  59. package/dist/components/NavigationLink.js +15 -23
  60. package/dist/components/NavigationPanel.js +26 -47
  61. package/dist/components/PortalToContainer.js +16 -10
  62. package/dist/components/RootContainer.js +35 -31
  63. package/dist/components/SearchControl.css.js +65 -75
  64. package/dist/components/SearchControl.js +36 -14
  65. package/dist/components/ViewNotFound.js +22 -29
  66. package/dist/context/CurrentViewModelProvider.js +11 -9
  67. package/dist/context/DefaultMantineProvider.js +45 -72
  68. package/dist/context/DiagramEventHandlers.js +43 -48
  69. package/dist/context/DiagramFeatures.js +73 -69
  70. package/dist/context/EnsureMantine.js +13 -16
  71. package/dist/context/FramerMotionConfig.js +17 -11
  72. package/dist/context/IconRenderer.js +90 -106
  73. package/dist/context/LikeC4ModelContext.js +14 -10
  74. package/dist/context/LikeC4ProjectsContext.js +7 -6
  75. package/dist/context/RootContainerContext.d.ts +2 -5
  76. package/dist/context/RootContainerContext.js +24 -26
  77. package/dist/context/TagStylesContext.js +49 -57
  78. package/dist/custom/customNodes.js +224 -28
  79. package/dist/custom/index.js +41 -40
  80. package/dist/editor/LikeC4EditorCallbacks.js +4 -2
  81. package/dist/editor/LikeC4EditorProvider.js +32 -7
  82. package/dist/editor/applyChangesToManualLayout.js +144 -163
  83. package/dist/editor/editorActor.actions.js +122 -138
  84. package/dist/editor/editorActor.setup.js +30 -36
  85. package/dist/editor/editorActor.states.js +209 -263
  86. package/dist/editor/hotkeyActor.js +18 -17
  87. package/dist/editor/useEditorActorLogic.js +31 -43
  88. package/dist/hooks/safeContext.js +17 -17
  89. package/dist/hooks/useCallbackRef.js +18 -11
  90. package/dist/hooks/useCurrentView.js +16 -7
  91. package/dist/hooks/useCurrentViewModel.js +14 -9
  92. package/dist/hooks/useDiagram.js +55 -37
  93. package/dist/hooks/useDiagramCompareLayout.js +77 -81
  94. package/dist/hooks/useId.js +8 -6
  95. package/dist/hooks/useLikeC4ElementsTree.js +22 -21
  96. package/dist/hooks/useLikeC4Model.js +21 -20
  97. package/dist/hooks/useLikeC4Project.js +40 -29
  98. package/dist/hooks/useLikeC4Styles.js +6 -6
  99. package/dist/hooks/useMantinePortalProps.js +10 -6
  100. package/dist/hooks/useOverlaysActor.js +7 -6
  101. package/dist/hooks/useSearchActor.js +7 -6
  102. package/dist/hooks/useSetState.js +21 -19
  103. package/dist/hooks/useUpdateEffect.js +18 -29
  104. package/dist/hooks/useXYFlow.js +13 -15
  105. package/dist/index.js +24 -23
  106. package/dist/likec4diagram/DiagramUI.js +33 -37
  107. package/dist/likec4diagram/DiagramXYFlow.js +215 -224
  108. package/dist/likec4diagram/convert-to-xyflow.js +21 -22
  109. package/dist/likec4diagram/custom/edges/EdgeDrifts.js +22 -32
  110. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +275 -372
  111. package/dist/likec4diagram/custom/edges/SequenceStepEdge.js +71 -75
  112. package/dist/likec4diagram/custom/edges/edges.css.js +41 -47
  113. package/dist/likec4diagram/custom/edges/useControlPoints.js +52 -56
  114. package/dist/likec4diagram/custom/edges/useRelationshipEdgePath.js +54 -76
  115. package/dist/likec4diagram/custom/index.js +17 -17
  116. package/dist/likec4diagram/custom/nodes/CompoundActions.js +19 -26
  117. package/dist/likec4diagram/custom/nodes/ElementActions.js +131 -82
  118. package/dist/likec4diagram/custom/nodes/NodeDrifts.js +20 -26
  119. package/dist/likec4diagram/custom/nodes/NodeNotes.js +215 -273
  120. package/dist/likec4diagram/custom/nodes/SequenceActorNode.js +131 -147
  121. package/dist/likec4diagram/custom/nodes/nodes.js +135 -146
  122. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +155 -159
  123. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +58 -86
  124. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +108 -164
  125. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +56 -68
  126. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +3 -6
  127. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +97 -102
  128. package/dist/likec4diagram/custom/nodes/toolbar/styles.css.js +13 -13
  129. package/dist/likec4diagram/custom/nodes/toolbar/types.js +6 -5
  130. package/dist/likec4diagram/custom/nodes/toolbar/useHandlers.js +36 -41
  131. package/dist/likec4diagram/relationship-popover/RelationshipPopover.js +510 -534
  132. package/dist/likec4diagram/relationship-popover/actor.js +113 -152
  133. package/dist/likec4diagram/relationship-popover/components.js +39 -37
  134. package/dist/likec4diagram/state/DiagramActorProvider.js +135 -136
  135. package/dist/likec4diagram/state/aligners.js +283 -360
  136. package/dist/likec4diagram/state/assign.js +84 -108
  137. package/dist/likec4diagram/state/createViewChange.js +72 -92
  138. package/dist/likec4diagram/state/diagram-api.js +224 -152
  139. package/dist/likec4diagram/state/hotkeyActor.js +54 -45
  140. package/dist/likec4diagram/state/machine.actions.js +709 -821
  141. package/dist/likec4diagram/state/machine.actions.layout.js +154 -183
  142. package/dist/likec4diagram/state/machine.js +113 -134
  143. package/dist/likec4diagram/state/machine.setup.js +104 -113
  144. package/dist/likec4diagram/state/machine.state.initializing.js +54 -54
  145. package/dist/likec4diagram/state/machine.state.navigating.js +192 -227
  146. package/dist/likec4diagram/state/machine.state.ready.focused.js +72 -88
  147. package/dist/likec4diagram/state/machine.state.ready.idle.js +79 -98
  148. package/dist/likec4diagram/state/machine.state.ready.js +126 -202
  149. package/dist/likec4diagram/state/machine.state.ready.printing.js +38 -39
  150. package/dist/likec4diagram/state/machine.state.ready.walkthrough.js +153 -193
  151. package/dist/likec4diagram/state/mediaPrintActor.js +20 -16
  152. package/dist/likec4diagram/state/persistence.js +20 -21
  153. package/dist/likec4diagram/state/utils.js +131 -162
  154. package/dist/likec4diagram/ui/LayoutDriftFrame.js +53 -64
  155. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +58 -80
  156. package/dist/likec4diagram/ui/notation/NotationPanel.js +183 -214
  157. package/dist/likec4diagram/useLayoutConstraints.js +386 -433
  158. package/dist/likec4diagram/xyflow-diagram/diagram-view.js +216 -227
  159. package/dist/likec4diagram/xyflow-sequence/const.js +11 -7
  160. package/dist/likec4diagram/xyflow-sequence/sequence-layout.js +177 -180
  161. package/dist/navigationpanel/NavigationPanel.js +113 -123
  162. package/dist/navigationpanel/NavigationPanelControls.js +124 -150
  163. package/dist/navigationpanel/NavigationPanelDropdown.js +365 -477
  164. package/dist/navigationpanel/_common.d.ts +4 -10
  165. package/dist/navigationpanel/_common.js +57 -70
  166. package/dist/navigationpanel/actor.js +153 -236
  167. package/dist/navigationpanel/comparepanel/CompareActionsMenu.js +66 -83
  168. package/dist/navigationpanel/comparepanel/ComparePanel.js +135 -164
  169. package/dist/navigationpanel/comparepanel/ComparePanelControls.js +50 -58
  170. package/dist/navigationpanel/comparepanel/DriftsSummary.js +207 -254
  171. package/dist/navigationpanel/comparepanel/LayoutTypeSwitcher.js +33 -35
  172. package/dist/navigationpanel/controls/DetailsControls.js +219 -246
  173. package/dist/navigationpanel/controls/LayoutWarning.js +89 -100
  174. package/dist/navigationpanel/controls/LogoButton.js +46 -70
  175. package/dist/navigationpanel/controls/NavigationButtons.js +35 -52
  176. package/dist/navigationpanel/controls/OpenSource.js +27 -25
  177. package/dist/navigationpanel/controls/SearchControl.js +50 -61
  178. package/dist/navigationpanel/controls/ToggleReadonly.js +84 -81
  179. package/dist/navigationpanel/dropdown/ProjectsMenu.js +69 -87
  180. package/dist/navigationpanel/editorpanel/CenterCamera.js +17 -13
  181. package/dist/navigationpanel/editorpanel/ChangeAutoLayoutButton.js +182 -154
  182. package/dist/navigationpanel/editorpanel/EditorPanel.js +47 -45
  183. package/dist/navigationpanel/editorpanel/ManualLayoutToolsButton.js +122 -173
  184. package/dist/navigationpanel/editorpanel/ToggleReadonly.js +20 -13
  185. package/dist/navigationpanel/editorpanel/_common.d.ts +3 -6
  186. package/dist/navigationpanel/editorpanel/_common.js +13 -13
  187. package/dist/navigationpanel/editorpanel/styles.js +58 -75
  188. package/dist/navigationpanel/hooks.js +35 -29
  189. package/dist/navigationpanel/styles.css.js +20 -28
  190. package/dist/navigationpanel/walkthrough/ActiveWalkthroughControls.js +107 -134
  191. package/dist/navigationpanel/walkthrough/DynamicViewControls.d.ts +8 -8
  192. package/dist/navigationpanel/walkthrough/DynamicViewControls.js +105 -120
  193. package/dist/navigationpanel/walkthrough/WalkthroughPanel.js +75 -83
  194. package/dist/overlays/Overlays.js +94 -112
  195. package/dist/overlays/element-details/ElementDetails.js +22 -28
  196. package/dist/overlays/element-details/ElementDetailsCard.css.js +198 -219
  197. package/dist/overlays/element-details/ElementDetailsCard.js +517 -490
  198. package/dist/overlays/element-details/MetadataValue.js +210 -250
  199. package/dist/overlays/element-details/TabPanelDeployments.css.js +40 -60
  200. package/dist/overlays/element-details/TabPanelDeployments.js +185 -178
  201. package/dist/overlays/element-details/TabPanelRelationships.css.js +63 -71
  202. package/dist/overlays/element-details/TabPanelRelationships.js +155 -140
  203. package/dist/overlays/element-details/TabPanelStructure.css.js +29 -33
  204. package/dist/overlays/element-details/TabPanelStructure.js +93 -93
  205. package/dist/overlays/element-details/actor.js +45 -55
  206. package/dist/overlays/element-details/actorContext.js +12 -10
  207. package/dist/overlays/overlay/Overlay.js +104 -144
  208. package/dist/overlays/overlaysActor.js +213 -264
  209. package/dist/overlays/relationship-details/RelationshipDetails.js +270 -253
  210. package/dist/overlays/relationship-details/SelectEdge.css.js +62 -74
  211. package/dist/overlays/relationship-details/SelectEdge.js +146 -126
  212. package/dist/overlays/relationship-details/actor.js +242 -303
  213. package/dist/overlays/relationship-details/compute.js +109 -135
  214. package/dist/overlays/relationship-details/custom/ElementActions.js +43 -56
  215. package/dist/overlays/relationship-details/custom/edgeTypes.js +43 -49
  216. package/dist/overlays/relationship-details/custom/nodeTypes.js +93 -119
  217. package/dist/overlays/relationship-details/hooks.js +44 -38
  218. package/dist/overlays/relationship-details/layout-to-xyflow.js +119 -141
  219. package/dist/overlays/relationship-details/layout.js +275 -304
  220. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +319 -321
  221. package/dist/overlays/relationships-browser/SelectElement.css.js +18 -21
  222. package/dist/overlays/relationships-browser/SelectElement.js +192 -218
  223. package/dist/overlays/relationships-browser/actor.js +364 -462
  224. package/dist/overlays/relationships-browser/const.js +7 -6
  225. package/dist/overlays/relationships-browser/custom/ElementActions.js +60 -63
  226. package/dist/overlays/relationships-browser/custom/EmptyNode.js +25 -29
  227. package/dist/overlays/relationships-browser/custom/edgeTypes.js +66 -99
  228. package/dist/overlays/relationships-browser/custom/nodeTypes.js +98 -123
  229. package/dist/overlays/relationships-browser/hooks.js +49 -51
  230. package/dist/overlays/relationships-browser/layout.js +413 -465
  231. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +141 -157
  232. package/dist/projects-overview/ProjectsOverview.js +56 -55
  233. package/dist/projects-overview/ProjectsOverviewXY.js +105 -94
  234. package/dist/projects-overview/actor.js +252 -345
  235. package/dist/projects-overview/context.js +8 -7
  236. package/dist/projects-overview/custom/edgeTypes.js +22 -21
  237. package/dist/projects-overview/custom/nodeTypes.js +38 -42
  238. package/dist/projects-overview/hooks.js +9 -9
  239. package/dist/projects-overview/layouted-to-xyflow.js +46 -42
  240. package/dist/projects-overview/panel/ProjectsOverviewPanel.js +7 -9
  241. package/dist/projects-overview/persistence.js +22 -22
  242. package/dist/search/Search.js +199 -181
  243. package/dist/search/SearchContext.js +16 -15
  244. package/dist/search/XStateSearchAdapter.js +68 -62
  245. package/dist/search/components/ElementsColumn.css.js +50 -68
  246. package/dist/search/components/ElementsColumn.js +248 -290
  247. package/dist/search/components/PickView.js +116 -140
  248. package/dist/search/components/SearchByTags.js +76 -94
  249. package/dist/search/components/SearchInput.js +187 -209
  250. package/dist/search/components/ViewsColum.js +151 -141
  251. package/dist/search/components/ViewsColumn.css.js +12 -26
  252. package/dist/search/components/_shared.css.js +127 -153
  253. package/dist/search/components/styles.css.js +47 -53
  254. package/dist/search/components/utils.js +44 -47
  255. package/dist/search/hooks.js +10 -10
  256. package/dist/search/searchActor.js +93 -128
  257. package/dist/shadowroot/ShadowRoot.js +66 -78
  258. package/dist/shadowroot/styles.css.js +56 -66
  259. package/dist/styles-font2.js +4 -0
  260. package/dist/styles2.js +4 -0
  261. package/dist/utils/index.js +5 -0
  262. package/dist/utils/roundDpr.js +19 -15
  263. package/dist/utils/view-bounds.js +48 -55
  264. package/dist/utils/xyflow.js +143 -113
  265. package/package.json +15 -16
  266. package/panda.buildinfo.json +6 -3
  267. package/styles-font.css +1 -1
  268. package/styles-min.css +1 -1
  269. package/styles-xyflow.css +1 -1
  270. package/styles.css +1 -1
  271. package/dist/_virtual/_commonjsHelpers.js +0 -3
  272. package/dist/_virtual/assign-f10db67b.cjs.js +0 -3
  273. package/dist/_virtual/log-30abbb83.cjs.js +0 -3
  274. package/dist/_virtual/raise-f051f097.cjs.js +0 -3
  275. package/dist/_virtual/store-cfe7da62.cjs.js +0 -3
  276. package/dist/_virtual/xstate-actions.cjs.js +0 -5
  277. package/dist/_virtual/xstate-actions.cjs2.js +0 -3
  278. package/dist/_virtual/xstate-dev.cjs.js +0 -3
  279. package/dist/_virtual/xstate-guards.cjs.js +0 -5
  280. package/dist/_virtual/xstate-guards.cjs2.js +0 -3
  281. package/dist/_virtual/xstate-store-react.cjs.js +0 -5
  282. package/dist/_virtual/xstate-store-react.cjs2.js +0 -3
  283. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/createReactComponent.js +0 -41
  284. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.js +0 -30
  285. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertTriangle.js +0 -14
  286. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowDownRight.js +0 -14
  287. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowLeft.js +0 -14
  288. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js +0 -14
  289. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconBolt.js +0 -14
  290. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconBrowser.js +0 -14
  291. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js +0 -14
  292. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.js +0 -14
  293. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js +0 -14
  294. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js +0 -14
  295. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js +0 -14
  296. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconCylinder.js +0 -14
  297. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconDeviceMobile.js +0 -14
  298. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconDirectionSignFilled.js +0 -14
  299. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconExternalLink.js +0 -14
  300. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js +0 -14
  301. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconFileText.js +0 -14
  302. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconFocusCentered.js +0 -14
  303. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconFolderFilled.js +0 -14
  304. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconHelpCircle.js +0 -14
  305. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconId.js +0 -14
  306. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js +0 -14
  307. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignBottom.js +0 -14
  308. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignCenter.js +0 -14
  309. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignLeft.js +0 -14
  310. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignMiddle.js +0 -14
  311. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignRight.js +0 -14
  312. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignTop.js +0 -14
  313. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutBoardSplit.js +0 -14
  314. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutCollage.js +0 -14
  315. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutDashboard.js +0 -14
  316. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLink.js +0 -14
  317. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLock.js +0 -14
  318. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconLockOpen2.js +0 -14
  319. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerPlayFilled.js +0 -14
  320. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerSkipBackFilled.js +0 -14
  321. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerSkipForwardFilled.js +0 -14
  322. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerStopFilled.js +0 -14
  323. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconRectangularPrism.js +0 -14
  324. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconReorder.js +0 -14
  325. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconRouteOff.js +0 -14
  326. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js +0 -14
  327. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconSelector.js +0 -14
  328. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconStack2.js +0 -14
  329. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconStarFilled.js +0 -14
  330. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconTarget.js +0 -14
  331. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconTransform.js +0 -14
  332. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js +0 -14
  333. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconUser.js +0 -14
  334. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconX.js +0 -14
  335. package/dist/node_modules/.pnpm/@tabler_icons-react@3.40.0_react@19.2.4/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js +0 -14
  336. package/dist/node_modules/.pnpm/@xstate_store@3.17.1_react@19.2.4/node_modules/@xstate/store/dist/store-cfe7da62.cjs.js +0 -761
  337. package/dist/node_modules/.pnpm/@xstate_store@3.17.1_react@19.2.4/node_modules/@xstate/store/react/dist/xstate-store-react.cjs.js +0 -180
  338. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/actions/dist/xstate-actions.cjs.js +0 -37
  339. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dev/dist/xstate-dev.cjs.js +0 -59
  340. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/assign-f10db67b.cjs.js +0 -140
  341. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/log-30abbb83.cjs.js +0 -401
  342. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/dist/raise-f051f097.cjs.js +0 -2830
  343. package/dist/node_modules/.pnpm/xstate@5.30.0/node_modules/xstate/guards/dist/xstate-guards.cjs.js +0 -26
  344. package/dist/styles-font.css2.js +0 -3
  345. package/dist/styles.css2.js +0 -3
@@ -1,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 };