@likec4/diagram 1.43.0 → 1.45.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 (349) hide show
  1. package/bundle/index.js +14727 -13166
  2. package/dist/LikeC4Diagram.d.ts +1 -1
  3. package/dist/LikeC4Diagram.js +14 -9
  4. package/dist/LikeC4Diagram.props.d.ts +25 -15
  5. package/dist/LikeC4ProjectsProvider.js +1 -1
  6. package/dist/LikeC4Styles.js +0 -3
  7. package/dist/LikeC4View.d.ts +8 -3
  8. package/dist/LikeC4View.js +29 -14
  9. package/dist/ReactLikeC4.d.ts +2 -2
  10. package/dist/ReactLikeC4.js +2 -2
  11. package/dist/StaticLikeC4Diagram.js +1 -1
  12. package/dist/_virtual/_commonjsHelpers.js +3 -0
  13. package/dist/_virtual/assign-dea9f7c8.cjs.js +3 -0
  14. package/dist/_virtual/log-ec8d4df4.cjs.js +3 -0
  15. package/dist/_virtual/raise-da5b247f.cjs.js +3 -0
  16. package/dist/_virtual/xstate-actions.cjs.js +5 -0
  17. package/dist/_virtual/xstate-actions.cjs2.js +3 -0
  18. package/dist/_virtual/xstate-dev.cjs.js +3 -0
  19. package/dist/_virtual/xstate-guards.cjs.js +5 -0
  20. package/dist/_virtual/xstate-guards.cjs2.js +3 -0
  21. package/dist/base/Background.d.ts +2 -1
  22. package/dist/base/Background.js +11 -2
  23. package/dist/base/Base.d.ts +28 -0
  24. package/dist/base/BaseXYFlow.d.ts +5 -5
  25. package/dist/base/BaseXYFlow.js +38 -44
  26. package/dist/base/index.d.ts +6 -2
  27. package/dist/base/types.d.ts +1 -28
  28. package/dist/base/updateEdges.js +25 -14
  29. package/dist/base/updateNodes.d.ts +14 -0
  30. package/dist/base/updateNodes.js +51 -17
  31. package/dist/base-primitives/Markdown.d.ts +30 -4
  32. package/dist/base-primitives/Markdown.js +3 -2
  33. package/dist/base-primitives/compound/CompoundActionButton.d.ts +3 -2
  34. package/dist/base-primitives/compound/CompoundActionButton.js +1 -1
  35. package/dist/base-primitives/compound/CompoundDetailsButton.d.ts +3 -2
  36. package/dist/base-primitives/compound/CompoundDetailsButton.js +1 -1
  37. package/dist/base-primitives/edge/EdgeActionButton.d.ts +3 -2
  38. package/dist/base-primitives/edge/EdgeActionButton.js +1 -1
  39. package/dist/base-primitives/edge/EdgeContainer.d.ts +1 -1
  40. package/dist/base-primitives/edge/EdgeContainer.js +8 -1
  41. package/dist/base-primitives/edge/EdgeLabel.d.ts +3 -2
  42. package/dist/base-primitives/edge/EdgeLabel.js +2 -0
  43. package/dist/base-primitives/edge/EdgeLabelContainer.d.ts +1 -1
  44. package/dist/base-primitives/edge/EdgeLabelContainer.js +4 -0
  45. package/dist/base-primitives/edge/EdgePath.d.ts +4 -0
  46. package/dist/base-primitives/edge/EdgePath.js +29 -5
  47. package/dist/base-primitives/element/ElementActionButtons.d.ts +6 -4
  48. package/dist/base-primitives/element/ElementActionButtons.js +3 -3
  49. package/dist/base-primitives/element/ElementData.d.ts +3 -3
  50. package/dist/base-primitives/element/ElementData.js +13 -7
  51. package/dist/base-primitives/element/ElementDetailsButton.d.ts +3 -2
  52. package/dist/base-primitives/element/ElementDetailsButton.js +5 -5
  53. package/dist/base-primitives/element/ElementNodeContainer.css.js +15 -27
  54. package/dist/base-primitives/element/ElementShape.js +5 -5
  55. package/dist/base-primitives/element/ElementTags.d.ts +6 -4
  56. package/dist/base-primitives/element/ElementTags.js +2 -1
  57. package/dist/base-primitives/memoEdge.js +4 -2
  58. package/dist/base-primitives/memoNode.d.ts +1 -1
  59. package/dist/base-primitives/memoNode.js +3 -3
  60. package/dist/components/ErrorFallback.js +52 -35
  61. package/dist/components/Link.js +2 -2
  62. package/dist/context/DiagramEventHandlers.js +2 -1
  63. package/dist/context/DiagramFeatures.d.ts +25 -6
  64. package/dist/context/DiagramFeatures.js +28 -56
  65. package/dist/context/IconRenderer.js +6 -6
  66. package/dist/context/LikeC4ModelContext.js +3 -10
  67. package/dist/context/TagStylesContext.js +3 -19
  68. package/dist/context/index.d.ts +1 -1
  69. package/dist/custom/customNodes.js +3 -2
  70. package/dist/custom/hooks.d.ts +3 -3
  71. package/dist/custom/index.d.ts +1 -1
  72. package/dist/custom/index.js +5 -5
  73. package/dist/editor/LikeC4EditorContext.d.ts +21 -0
  74. package/dist/editor/index.d.ts +2 -0
  75. package/dist/hooks/index.d.ts +4 -2
  76. package/dist/hooks/safeContext.d.ts +6 -3
  77. package/dist/hooks/safeContext.js +10 -3
  78. package/dist/hooks/useCallbackRef.d.ts +1 -0
  79. package/dist/hooks/useCallbackRef.js +13 -0
  80. package/dist/hooks/useCurrentView.d.ts +11 -0
  81. package/dist/hooks/{useCurrentViewId.js → useCurrentView.js} +7 -3
  82. package/dist/hooks/useCurrentViewModel.js +4 -1
  83. package/dist/hooks/useDiagram.d.ts +7 -113
  84. package/dist/hooks/useDiagram.js +7 -127
  85. package/dist/hooks/useDiagramCompareLayout.d.ts +35 -0
  86. package/dist/hooks/useDiagramCompareLayout.js +65 -0
  87. package/dist/hooks/useLikeC4Project.d.ts +6 -1
  88. package/dist/hooks/useLikeC4Project.js +14 -2
  89. package/dist/hooks/useMediaPrint.d.ts +6 -0
  90. package/dist/hooks/useUpdateEffect.js +2 -4
  91. package/dist/hooks/useXYFlow.d.ts +1 -0
  92. package/dist/hooks/useXYFlow.js +4 -7
  93. package/dist/index.d.ts +2 -2
  94. package/dist/index.js +4 -3
  95. package/dist/likec4diagram/DiagramUI.js +14 -7
  96. package/dist/likec4diagram/DiagramXYFlow.d.ts +2 -2
  97. package/dist/likec4diagram/DiagramXYFlow.js +60 -52
  98. package/dist/likec4diagram/convert-to-xyflow.d.ts +0 -1
  99. package/dist/likec4diagram/custom/edges/EdgeDrifts.d.ts +6 -0
  100. package/dist/likec4diagram/custom/edges/EdgeDrifts.js +38 -0
  101. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +256 -217
  102. package/dist/likec4diagram/custom/edges/SequenceStepEdge.js +9 -2
  103. package/dist/likec4diagram/custom/edges/edges.css.js +3 -4
  104. package/dist/likec4diagram/custom/edges/useControlPoints.d.ts +8 -0
  105. package/dist/likec4diagram/custom/edges/useControlPoints.js +58 -0
  106. package/dist/likec4diagram/custom/edges/useRelationshipEdgePath.d.ts +7 -0
  107. package/dist/likec4diagram/custom/edges/useRelationshipEdgePath.js +60 -0
  108. package/dist/likec4diagram/custom/edges/utils.d.ts +0 -12
  109. package/dist/likec4diagram/custom/nodes/CompoundActions.js +4 -1
  110. package/dist/likec4diagram/custom/nodes/ElementActions.d.ts +2 -1
  111. package/dist/likec4diagram/custom/nodes/ElementActions.js +15 -10
  112. package/dist/likec4diagram/custom/nodes/NodeDrifts.d.ts +6 -0
  113. package/dist/likec4diagram/custom/nodes/NodeDrifts.js +50 -0
  114. package/dist/likec4diagram/custom/nodes/SequenceActorNode.js +7 -2
  115. package/dist/likec4diagram/custom/nodes/index.d.ts +1 -0
  116. package/dist/likec4diagram/custom/nodes/nodes.d.ts +9 -1
  117. package/dist/likec4diagram/custom/nodes/nodes.js +74 -29
  118. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.d.ts +1 -1
  119. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +1 -1
  120. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +2 -1
  121. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +4 -3
  122. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +1 -11
  123. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +7 -51
  124. package/dist/likec4diagram/custom/nodes/toolbar/types.d.ts +5 -0
  125. package/dist/likec4diagram/custom/nodes/toolbar/types.js +7 -0
  126. package/dist/likec4diagram/custom/nodes/toolbar/useHandlers.d.ts +8 -0
  127. package/dist/likec4diagram/custom/nodes/toolbar/useHandlers.js +44 -0
  128. package/dist/likec4diagram/relationship-popover/RelationshipPopover.js +8 -10
  129. package/dist/likec4diagram/relationship-popover/actor.d.ts +1 -1
  130. package/dist/likec4diagram/state/DiagramActorProvider.d.ts +4 -3
  131. package/dist/likec4diagram/state/DiagramActorProvider.js +95 -70
  132. package/dist/likec4diagram/state/assign.d.ts +13 -7
  133. package/dist/likec4diagram/state/assign.js +43 -282
  134. package/dist/likec4diagram/state/createViewChange.d.ts +3 -0
  135. package/dist/likec4diagram/state/createViewChange.js +79 -0
  136. package/dist/likec4diagram/state/diagram-api.d.ts +109 -0
  137. package/dist/likec4diagram/state/diagram-api.js +126 -0
  138. package/dist/likec4diagram/state/machine.actions.d.ts +1783 -0
  139. package/dist/likec4diagram/state/machine.actions.js +644 -0
  140. package/dist/likec4diagram/state/machine.actions.layout.d.ts +579 -0
  141. package/dist/likec4diagram/state/machine.actions.layout.js +129 -0
  142. package/dist/likec4diagram/state/machine.d.ts +22 -0
  143. package/dist/likec4diagram/state/machine.js +127 -0
  144. package/dist/likec4diagram/state/machine.setup.d.ts +327 -0
  145. package/dist/likec4diagram/state/machine.setup.js +93 -0
  146. package/dist/likec4diagram/state/machine.state.initializing.d.ts +208 -0
  147. package/dist/likec4diagram/state/machine.state.initializing.js +55 -0
  148. package/dist/likec4diagram/state/machine.state.navigating.d.ts +14 -0
  149. package/dist/likec4diagram/state/machine.state.navigating.js +178 -0
  150. package/dist/likec4diagram/state/machine.state.ready.d.ts +3131 -0
  151. package/dist/likec4diagram/state/machine.state.ready.focused.d.ts +386 -0
  152. package/dist/likec4diagram/state/machine.state.ready.focused.js +85 -0
  153. package/dist/likec4diagram/state/machine.state.ready.idle.d.ts +474 -0
  154. package/dist/likec4diagram/state/machine.state.ready.idle.js +96 -0
  155. package/dist/likec4diagram/state/machine.state.ready.js +262 -0
  156. package/dist/likec4diagram/state/machine.state.ready.printing.d.ts +128 -0
  157. package/dist/likec4diagram/state/machine.state.ready.printing.js +40 -0
  158. package/dist/likec4diagram/state/machine.state.ready.walkthrough.d.ts +511 -0
  159. package/dist/likec4diagram/state/machine.state.ready.walkthrough.js +177 -0
  160. package/dist/likec4diagram/state/mediaPrintActor.d.ts +12 -0
  161. package/dist/likec4diagram/state/mediaPrintActor.js +18 -0
  162. package/dist/likec4diagram/state/syncManualLayoutActor.d.ts +31 -108
  163. package/dist/likec4diagram/state/syncManualLayoutActor.js +278 -142
  164. package/dist/likec4diagram/state/types.d.ts +7 -12
  165. package/dist/likec4diagram/state/utils.d.ts +19 -4
  166. package/dist/likec4diagram/state/utils.js +47 -4
  167. package/dist/likec4diagram/types.d.ts +8 -8
  168. package/dist/likec4diagram/ui/LayoutDriftFrame.d.ts +2 -0
  169. package/dist/likec4diagram/ui/LayoutDriftFrame.js +66 -0
  170. package/dist/likec4diagram/ui/index.d.ts +1 -0
  171. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +5 -2
  172. package/dist/likec4diagram/ui/notation/NotationPanel.js +5 -4
  173. package/dist/likec4diagram/useLayoutConstraints.d.ts +10 -5
  174. package/dist/likec4diagram/useLayoutConstraints.js +237 -61
  175. package/dist/likec4diagram/xyflow-diagram/diagram-view.d.ts +0 -1
  176. package/dist/likec4diagram/xyflow-diagram/diagram-view.js +14 -17
  177. package/dist/likec4diagram/xyflow-sequence/sequence-layout.js +11 -8
  178. package/dist/navigationpanel/NavigationPanel.js +16 -8
  179. package/dist/navigationpanel/NavigationPanelControls.d.ts +2 -1
  180. package/dist/navigationpanel/NavigationPanelControls.js +23 -17
  181. package/dist/navigationpanel/NavigationPanelDropdown.d.ts +2 -1
  182. package/dist/navigationpanel/NavigationPanelDropdown.js +62 -42
  183. package/dist/navigationpanel/_common.d.ts +1 -1
  184. package/dist/navigationpanel/_common.js +4 -2
  185. package/dist/navigationpanel/actor.d.ts +9 -205
  186. package/dist/navigationpanel/actor.js +6 -5
  187. package/dist/navigationpanel/comparepanel/CompareActionsMenu.d.ts +3 -0
  188. package/dist/navigationpanel/comparepanel/CompareActionsMenu.js +59 -0
  189. package/dist/navigationpanel/comparepanel/ComparePanel.d.ts +2 -0
  190. package/dist/navigationpanel/comparepanel/ComparePanel.js +42 -0
  191. package/dist/navigationpanel/comparepanel/ComparePanelControls.d.ts +1 -0
  192. package/dist/navigationpanel/comparepanel/ComparePanelControls.js +60 -0
  193. package/dist/navigationpanel/comparepanel/LayoutTypeSwitcher.d.ts +5 -0
  194. package/dist/navigationpanel/comparepanel/LayoutTypeSwitcher.js +38 -0
  195. package/dist/navigationpanel/comparepanel/index.d.ts +1 -0
  196. package/dist/navigationpanel/controls/{ViewDetailsCard.d.ts → DetailsControls.d.ts} +1 -1
  197. package/dist/navigationpanel/controls/{ViewDetailsCard.js → DetailsControls.js} +18 -14
  198. package/dist/navigationpanel/controls/LayoutWarning.d.ts +2 -0
  199. package/dist/navigationpanel/controls/LayoutWarning.js +102 -0
  200. package/dist/navigationpanel/controls/NavigationButtons.js +4 -3
  201. package/dist/navigationpanel/controls/OpenSource.js +2 -2
  202. package/dist/navigationpanel/controls/SearchControl.d.ts +2 -1
  203. package/dist/navigationpanel/controls/SearchControl.js +15 -17
  204. package/dist/navigationpanel/controls/ToggleReadonly.d.ts +1 -1
  205. package/dist/navigationpanel/controls/ToggleReadonly.js +26 -18
  206. package/dist/navigationpanel/controls/index.d.ts +2 -1
  207. package/dist/navigationpanel/dropdown/ProjectsMenu.d.ts +2 -2
  208. package/dist/navigationpanel/dropdown/ProjectsMenu.js +5 -5
  209. package/dist/navigationpanel/editorpanel/CenterCamera.js +5 -2
  210. package/dist/navigationpanel/editorpanel/ChangeAutoLayoutButton.d.ts +1 -1
  211. package/dist/navigationpanel/editorpanel/ChangeAutoLayoutButton.js +21 -20
  212. package/dist/navigationpanel/editorpanel/EditorPanel.js +3 -3
  213. package/dist/navigationpanel/editorpanel/ManualLayoutToolsButton.d.ts +2 -2
  214. package/dist/navigationpanel/editorpanel/ManualLayoutToolsButton.js +16 -13
  215. package/dist/navigationpanel/editorpanel/ToggleReadonly.d.ts +1 -0
  216. package/dist/navigationpanel/editorpanel/ToggleReadonly.js +15 -0
  217. package/dist/navigationpanel/styles.css.d.ts +2 -2
  218. package/dist/navigationpanel/styles.css.js +4 -4
  219. package/dist/navigationpanel/walkthrough/ActiveWalkthroughControls.js +14 -8
  220. package/dist/navigationpanel/walkthrough/DynamicViewControls.d.ts +66 -66
  221. package/dist/navigationpanel/walkthrough/DynamicViewControls.js +31 -14
  222. package/dist/navigationpanel/walkthrough/WalkthroughPanel.d.ts +2 -1
  223. package/dist/navigationpanel/walkthrough/WalkthroughPanel.js +68 -50
  224. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/actions/dist/xstate-actions.cjs.js +37 -0
  225. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/dev/dist/xstate-dev.cjs.js +59 -0
  226. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/dist/assign-dea9f7c8.cjs.js +140 -0
  227. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/dist/log-ec8d4df4.cjs.js +401 -0
  228. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/dist/raise-da5b247f.cjs.js +2716 -0
  229. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/guards/dist/xstate-guards.cjs.js +26 -0
  230. package/dist/overlays/element-details/ElementDetails.js +7 -7
  231. package/dist/overlays/element-details/ElementDetailsCard.css.js +3 -3
  232. package/dist/overlays/element-details/ElementDetailsCard.js +7 -5
  233. package/dist/overlays/element-details/MetadataValue.d.ts +2 -1
  234. package/dist/overlays/element-details/MetadataValue.js +2 -2
  235. package/dist/overlays/element-details/TabPanelDeployments.js +6 -4
  236. package/dist/overlays/element-details/TabPanelRelationships.js +3 -3
  237. package/dist/overlays/element-details/TabPanelStructure.js +1 -1
  238. package/dist/overlays/element-details/actor.d.ts +8 -82
  239. package/dist/overlays/element-details/actor.js +0 -8
  240. package/dist/overlays/overlay/Overlay.js +10 -10
  241. package/dist/overlays/overlaysActor.d.ts +7 -150
  242. package/dist/overlays/overlaysActor.js +183 -161
  243. package/dist/overlays/relationship-details/RelationshipDetails.js +4 -3
  244. package/dist/overlays/relationship-details/SelectEdge.js +2 -2
  245. package/dist/overlays/relationship-details/_types.d.ts +3 -4
  246. package/dist/overlays/relationship-details/actor.d.ts +6 -550
  247. package/dist/overlays/relationship-details/actor.js +18 -3
  248. package/dist/overlays/relationship-details/custom/ElementActions.js +8 -5
  249. package/dist/overlays/relationship-details/custom/edgeTypes.js +4 -1
  250. package/dist/overlays/relationship-details/custom/nodeTypes.js +4 -1
  251. package/dist/overlays/relationship-details/hooks.js +1 -1
  252. package/dist/overlays/relationship-details/layout-to-xyflow.js +3 -5
  253. package/dist/overlays/relationship-details/layout.d.ts +3 -3
  254. package/dist/overlays/relationship-details/layout.js +4 -4
  255. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +6 -4
  256. package/dist/overlays/relationships-browser/SelectElement.js +2 -2
  257. package/dist/overlays/relationships-browser/_types.d.ts +2 -3
  258. package/dist/overlays/relationships-browser/actor.d.ts +7 -673
  259. package/dist/overlays/relationships-browser/actor.js +132 -110
  260. package/dist/overlays/relationships-browser/custom/ElementActions.js +44 -37
  261. package/dist/overlays/relationships-browser/custom/edgeTypes.js +4 -1
  262. package/dist/overlays/relationships-browser/custom/nodeTypes.js +4 -1
  263. package/dist/overlays/relationships-browser/hooks.js +7 -6
  264. package/dist/overlays/relationships-browser/layout.d.ts +2 -2
  265. package/dist/overlays/relationships-browser/layout.js +3 -3
  266. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +0 -3
  267. package/dist/overlays/types.d.ts +12 -13
  268. package/dist/search/Search.js +2 -1
  269. package/dist/search/components/ElementsColumn.js +5 -3
  270. package/dist/search/components/PickView.js +1 -1
  271. package/dist/search/components/SearchByTags.js +21 -44
  272. package/dist/search/components/SearchInput.js +1 -1
  273. package/dist/search/components/ViewsColum.js +6 -4
  274. package/dist/search/components/_shared.css.d.ts +1 -1
  275. package/dist/search/searchActor.d.ts +3 -66
  276. package/dist/shadowroot/ShadowRoot.d.ts +5 -7
  277. package/dist/shadowroot/ShadowRoot.js +8 -6
  278. package/dist/styles.css2.js +1 -1
  279. package/dist/utils/index.d.ts +4 -4
  280. package/dist/utils/vector.d.ts +83 -21
  281. package/dist/utils/vector.js +98 -24
  282. package/dist/utils/view-bounds.d.ts +8 -0
  283. package/dist/utils/view-bounds.js +58 -0
  284. package/dist/utils/xyflow.d.ts +52 -8
  285. package/dist/utils/xyflow.js +31 -11
  286. package/package.json +26 -24
  287. package/panda.buildinfo.json +124 -71
  288. package/styles-min.css +1 -1
  289. package/styles.css +1 -1
  290. package/dist/hooks/useCurrentViewId.d.ts +0 -6
  291. package/dist/likec4diagram/custom/edges/utils.js +0 -23
  292. package/dist/likec4diagram/state/diagram-machine.d.ts +0 -2590
  293. package/dist/likec4diagram/state/diagram-machine.js +0 -1180
  294. package/dist/navigationpanel/editorpanel/LayoutDriftNotification.d.ts +0 -1
  295. package/dist/navigationpanel/editorpanel/LayoutDriftNotification.js +0 -56
  296. package/dist/utils/get-view-bounds.d.ts +0 -3
  297. package/dist/utils/get-view-bounds.js +0 -14
  298. /package/dist/base/{types.js → Base.js} +0 -0
  299. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/createReactComponent.js +0 -0
  300. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.js +0 -0
  301. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertTriangle.js +0 -0
  302. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowDownRight.js +0 -0
  303. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowLeft.js +0 -0
  304. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js +0 -0
  305. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconBolt.js +0 -0
  306. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconBrowser.js +0 -0
  307. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js +0 -0
  308. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.js +0 -0
  309. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js +0 -0
  310. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js +0 -0
  311. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js +0 -0
  312. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconCylinder.js +0 -0
  313. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconDeviceMobile.js +0 -0
  314. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconDirectionSignFilled.js +0 -0
  315. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconExternalLink.js +0 -0
  316. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js +0 -0
  317. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconFocusCentered.js +0 -0
  318. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconFolderFilled.js +0 -0
  319. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconHelpCircle.js +0 -0
  320. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconId.js +0 -0
  321. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js +0 -0
  322. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignBottom.js +0 -0
  323. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignCenter.js +0 -0
  324. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignLeft.js +0 -0
  325. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignMiddle.js +0 -0
  326. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignRight.js +0 -0
  327. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutAlignTop.js +0 -0
  328. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutBoardSplit.js +0 -0
  329. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutCollage.js +0 -0
  330. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLayoutDashboard.js +0 -0
  331. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLink.js +0 -0
  332. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLock.js +0 -0
  333. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconLockOpen2.js +0 -0
  334. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerPlayFilled.js +0 -0
  335. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerSkipBackFilled.js +0 -0
  336. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerSkipForwardFilled.js +0 -0
  337. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconPlayerStopFilled.js +0 -0
  338. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconRectangularPrism.js +0 -0
  339. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconReorder.js +0 -0
  340. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconRouteOff.js +0 -0
  341. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js +0 -0
  342. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconSelector.js +0 -0
  343. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconStack2.js +0 -0
  344. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconStarFilled.js +0 -0
  345. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconTarget.js +0 -0
  346. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconTransform.js +0 -0
  347. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconUser.js +0 -0
  348. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconX.js +0 -0
  349. /package/dist/node_modules/.pnpm/{@tabler_icons-react@3.35.0_react@19.1.1 → @tabler_icons-react@3.35.0_react@19.2.0}/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js +0 -0
@@ -1,16 +1,16 @@
1
- import { invariant, nonNullable, delay } from '@likec4/core/utils';
1
+ import { nonNullable, invariant, delay } from '@likec4/core/utils';
2
2
  import { applyEdgeChanges, applyNodeChanges } from '@xyflow/react';
3
3
  import { getViewportForBounds } from '@xyflow/system';
4
- import { prop, omit, isNullish } from 'remeda';
5
- import { setup, assign, fromPromise, assertEvent, enqueueActions, cancel, raise } from 'xstate';
4
+ import { hasAtLeast, omit, isNullish } from 'remeda';
5
+ import { setup, assign, enqueueActions, cancel, raise, fromPromise, assertEvent } from 'xstate';
6
6
  import { MinZoom, ZIndexes } from '../../base/const.js';
7
7
  import { updateEdges } from '../../base/updateEdges.js';
8
8
  import { updateNodes } from '../../base/updateNodes.js';
9
9
  import { typedSystem } from '../../likec4diagram/state/utils.js';
10
+ import { getNodeCenter } from '../../utils/xyflow.js';
10
11
  import { ViewPadding } from './const.js';
11
12
  import { viewToNodesEdge } from './useViewToNodesEdges.js';
12
- import { Base } from '../../base/types.js';
13
- import { centerXYInternalNode } from '../../utils/xyflow.js';
13
+ import { Base } from '../../base/Base.js';
14
14
 
15
15
  const findRootSubject = (nodes) => nodes.find(
16
16
  (n) => n.data.column === "subjects" && isNullish(n.parentId)
@@ -54,7 +54,7 @@ const layouter = fromPromise(async ({ input, self, signal }) => {
54
54
  y: nextSubjectNode.position.y + (nextSubjectNode.initialHeight ?? 0) / 2
55
55
  };
56
56
  const currentSubjectInternalNode = xyflow.getInternalNode(currentSubjectNode.id);
57
- const currentSubjectCenter = centerXYInternalNode(currentSubjectInternalNode);
57
+ const currentSubjectCenter = getNodeCenter(currentSubjectInternalNode);
58
58
  const nested = /* @__PURE__ */ new Set();
59
59
  currentNodes.forEach((n) => {
60
60
  if (n.id === existingNode.id) {
@@ -108,17 +108,20 @@ const layouter = fromPromise(async ({ input, self, signal }) => {
108
108
  if (signal.aborted) {
109
109
  return updateXYData();
110
110
  }
111
- await xyflow.setCenter(currentSubjectCenter.x, currentSubjectCenter.y, { zoom, duration: 300 });
111
+ const duration = 300;
112
+ xyflow.setCenter(currentSubjectCenter.x, currentSubjectCenter.y, { zoom, duration, interpolate: "smooth" });
113
+ await delay(duration);
112
114
  await xyflow.setCenter(nextSubjectCenter.x, nextSubjectCenter.y, { zoom });
113
115
  return updateXYData();
114
116
  });
115
- const _relationshipsBrowserLogic = setup({
117
+ const machine = setup({
116
118
  types: {
117
119
  context: {},
118
120
  tags: "",
119
121
  children: {},
120
122
  input: {},
121
123
  events: {}
124
+ // emitted: {} as EmittedEvents,
122
125
  },
123
126
  actors: {
124
127
  layouter
@@ -133,73 +136,93 @@ const _relationshipsBrowserLogic = setup({
133
136
  }
134
137
  return false;
135
138
  }
136
- },
137
- actions: {
138
- "xyflow.init": assign(({ event }) => {
139
- assertEvent(event, "xyflow.init");
140
- return {
141
- xyflow: event.instance,
142
- xystore: event.store
143
- };
144
- }),
145
- "update.view": assign(({ event }) => {
146
- assertEvent(event, "update.view");
147
- return {
148
- layouted: event.layouted,
149
- ...viewToNodesEdge(event.layouted)
150
- };
151
- }),
152
- "xyflow:updateNodeInternals": ({ context }) => {
153
- invariant(context.xystore, "xystore is not initialized");
154
- const { domNode, updateNodeInternals } = context.xystore.getState();
155
- const nodeIds = new Set(context.xyedges.flatMap((e) => [e.source, e.target]));
156
- if (nodeIds.size === 0 || !domNode) {
157
- return;
158
- }
159
- const updates = /* @__PURE__ */ new Map();
160
- for (const updateId of nodeIds) {
161
- const nodeElement = domNode.querySelector(`.react-flow__node[data-id="${updateId}"]`);
162
- if (nodeElement) {
163
- updates.set(updateId, { id: updateId, nodeElement, force: true });
164
- }
165
- }
166
- updateNodeInternals(updates, { triggerFitView: false });
167
- },
168
- "xyflow:fitDiagram": ({ context }, params) => {
169
- let { duration, bounds } = params ?? {};
170
- duration ??= 450;
171
- const { xyflow, xystore } = context;
172
- invariant(xyflow, "xyflow is not initialized");
173
- invariant(xystore, "xystore is not initialized");
174
- bounds ??= context.layouted?.bounds;
175
- const maxZoom = Math.max(xyflow.getZoom(), 1);
176
- if (bounds) {
177
- const { width, height } = xystore.getState();
178
- const viewport = getViewportForBounds(bounds, width, height, MinZoom, maxZoom, ViewPadding);
179
- xyflow.setViewport(viewport, duration > 0 ? { duration } : void 0).catch(console.error);
180
- } else {
181
- xyflow.fitView({
182
- minZoom: MinZoom,
183
- maxZoom,
184
- padding: ViewPadding,
185
- ...duration > 0 && { duration }
186
- }).catch(console.error);
187
- }
188
- },
189
- "xyflow.applyNodeChanges": assign(({ context, event }) => {
190
- assertEvent(event, "xyflow.applyNodeChanges");
191
- return {
192
- xynodes: applyNodeChanges(event.changes, context.xynodes)
193
- };
194
- }),
195
- "xyflow.applyEdgeChanges": assign(({ context, event }) => {
196
- assertEvent(event, "xyflow.applyEdgeChanges");
197
- return {
198
- xyedges: applyEdgeChanges(event.changes, context.xyedges)
199
- };
200
- })
201
139
  }
202
- }).createMachine({
140
+ });
141
+ const xyflowInit = () => machine.assign(({ event }) => {
142
+ assertEvent(event, "xyflow.init");
143
+ return {
144
+ xyflow: event.instance,
145
+ xystore: event.store
146
+ };
147
+ });
148
+ const updateView = () => machine.assign(({ event }) => {
149
+ assertEvent(event, "update.view");
150
+ return {
151
+ layouted: event.layouted,
152
+ ...viewToNodesEdge(event.layouted)
153
+ };
154
+ });
155
+ const xyflowUpdateNodeInternals = () => machine.createAction(({ context }) => {
156
+ invariant(context.xystore, "xystore is not initialized");
157
+ const { domNode, updateNodeInternals } = context.xystore.getState();
158
+ const nodeIds = new Set(context.xyedges.flatMap((e) => [e.source, e.target]));
159
+ if (nodeIds.size === 0 || !domNode) {
160
+ return;
161
+ }
162
+ const updates = /* @__PURE__ */ new Map();
163
+ const domNodes = domNode.querySelectorAll(".react-flow__node");
164
+ for (const nodeElement of domNodes) {
165
+ const nodeId = nodeElement.getAttribute("data-id");
166
+ if (nodeId && nodeIds.has(nodeId)) {
167
+ updates.set(nodeId, { id: nodeId, nodeElement, force: true });
168
+ }
169
+ }
170
+ updateNodeInternals(updates, { triggerFitView: false });
171
+ });
172
+ const xyflowFitDiagram = (params) => machine.createAction(({ context, event }) => {
173
+ params ??= event.type === "fitDiagram" ? event : {};
174
+ let { duration, bounds } = params ?? {};
175
+ duration ??= 450;
176
+ const { xyflow, xystore } = context;
177
+ invariant(xyflow, "xyflow is not initialized");
178
+ invariant(xystore, "xystore is not initialized");
179
+ bounds ??= context.layouted?.bounds;
180
+ const maxZoom = Math.max(xyflow.getZoom(), 1);
181
+ if (bounds) {
182
+ const { width, height } = xystore.getState();
183
+ const viewport = getViewportForBounds(bounds, width, height, MinZoom, maxZoom, ViewPadding);
184
+ xyflow.setViewport(viewport, duration > 0 ? { duration, interpolate: "smooth" } : void 0).catch(
185
+ console.error
186
+ );
187
+ } else {
188
+ xyflow.fitView({
189
+ minZoom: MinZoom,
190
+ maxZoom,
191
+ padding: ViewPadding,
192
+ ...duration > 0 && { duration, interpolate: "smooth" }
193
+ }).catch(console.error);
194
+ }
195
+ });
196
+ const xyflowApplyNodeChanges = () => machine.assign(({ context, event }) => {
197
+ assertEvent(event, "xyflow.applyNodeChanges");
198
+ return {
199
+ xynodes: applyNodeChanges(event.changes, context.xynodes)
200
+ };
201
+ });
202
+ const xyflowApplyEdgeChanges = () => machine.assign(({ context, event }) => {
203
+ assertEvent(event, "xyflow.applyEdgeChanges");
204
+ return {
205
+ xyedges: applyEdgeChanges(event.changes, context.xyedges)
206
+ };
207
+ });
208
+ const openRelationshipSource = () => machine.enqueueActions(({ system, event }) => {
209
+ if (event.type !== "xyflow.edgeClick") {
210
+ return;
211
+ }
212
+ const diagramActor = typedSystem(system).diagramActorRef;
213
+ const relations = event.edge.data.relations;
214
+ if (hasAtLeast(relations, 1)) {
215
+ diagramActor.send({ type: "open.source", relation: relations[0] });
216
+ }
217
+ });
218
+ const dispose = () => machine.assign({
219
+ xyflow: null,
220
+ layouted: null,
221
+ xystore: null,
222
+ xyedges: [],
223
+ xynodes: []
224
+ });
225
+ const _relationshipsBrowserLogic = machine.createMachine({
203
226
  id: "relationships-browser",
204
227
  context: ({ input }) => ({
205
228
  subject: input.subject,
@@ -218,21 +241,21 @@ const _relationshipsBrowserLogic = setup({
218
241
  initial: "initializing",
219
242
  on: {
220
243
  "xyflow.applyNodeChanges": {
221
- actions: "xyflow.applyNodeChanges"
244
+ actions: xyflowApplyNodeChanges()
222
245
  },
223
246
  "xyflow.applyEdgeChanges": {
224
- actions: "xyflow.applyEdgeChanges"
247
+ actions: xyflowApplyEdgeChanges()
225
248
  }
226
249
  },
227
250
  states: {
228
251
  initializing: {
229
252
  on: {
230
253
  "xyflow.init": {
231
- actions: "xyflow.init",
254
+ actions: xyflowInit(),
232
255
  target: "isReady"
233
256
  },
234
257
  "update.view": {
235
- actions: "update.view",
258
+ actions: updateView(),
236
259
  target: "isReady"
237
260
  },
238
261
  "stop": "closed",
@@ -243,7 +266,7 @@ const _relationshipsBrowserLogic = setup({
243
266
  always: [{
244
267
  guard: "isReady",
245
268
  actions: [
246
- { type: "xyflow:fitDiagram", params: { duration: 0 } },
269
+ xyflowFitDiagram({ duration: 0 }),
247
270
  raise({ type: "xyflow.updateNodeInternals" }, { delay: 150 })
248
271
  ],
249
272
  target: "active"
@@ -267,19 +290,26 @@ const _relationshipsBrowserLogic = setup({
267
290
  }
268
291
  })
269
292
  },
270
- "xyflow.edgeClick": {
271
- guard: "hasViewId",
272
- actions: enqueueActions(({ event, context, system, enqueue }) => {
273
- if (event.edge.selected || event.edge.data.relations.length > 1) {
274
- enqueue.sendTo(typedSystem(system).overlaysActorRef, {
275
- type: "open.relationshipDetails",
276
- viewId: context.viewId,
277
- source: event.edge.data.sourceFqn,
278
- target: event.edge.data.targetFqn
279
- });
280
- }
281
- })
282
- },
293
+ "xyflow.edgeClick": [
294
+ {
295
+ guard: "hasViewId",
296
+ actions: enqueueActions(({ event, context, system, enqueue }) => {
297
+ if (event.edge.selected || event.edge.data.relations.length > 1) {
298
+ enqueue.sendTo(typedSystem(system).overlaysActorRef, {
299
+ type: "open.relationshipDetails",
300
+ viewId: context.viewId,
301
+ source: event.edge.data.sourceFqn,
302
+ target: event.edge.data.targetFqn
303
+ });
304
+ } else {
305
+ enqueue(openRelationshipSource());
306
+ }
307
+ })
308
+ },
309
+ {
310
+ actions: openRelationshipSource()
311
+ }
312
+ ],
283
313
  "navigate.to": {
284
314
  actions: [
285
315
  assign({
@@ -290,10 +320,10 @@ const _relationshipsBrowserLogic = setup({
290
320
  ]
291
321
  },
292
322
  "xyflow.paneDblClick": {
293
- actions: "xyflow:fitDiagram"
323
+ actions: xyflowFitDiagram()
294
324
  },
295
325
  "update.view": {
296
- actions: "update.view",
326
+ actions: updateView(),
297
327
  target: ".layouting"
298
328
  },
299
329
  "change.scope": {
@@ -302,13 +332,10 @@ const _relationshipsBrowserLogic = setup({
302
332
  })
303
333
  },
304
334
  "xyflow.updateNodeInternals": {
305
- actions: "xyflow:updateNodeInternals"
335
+ actions: xyflowUpdateNodeInternals()
306
336
  },
307
337
  "fitDiagram": {
308
- actions: {
309
- type: "xyflow:fitDiagram",
310
- params: prop("event")
311
- }
338
+ actions: xyflowFitDiagram()
312
339
  },
313
340
  "xyflow.resized": {
314
341
  actions: [
@@ -317,7 +344,7 @@ const _relationshipsBrowserLogic = setup({
317
344
  ]
318
345
  },
319
346
  "xyflow.init": {
320
- actions: "xyflow.init"
347
+ actions: xyflowInit()
321
348
  },
322
349
  "xyflow.unmount": {
323
350
  target: "initializing"
@@ -409,8 +436,8 @@ const _relationshipsBrowserLogic = setup({
409
436
  navigateFromNode: null
410
437
  });
411
438
  enqueue.raise({ type: "fitDiagram", duration: 200 }, { id: "fitDiagram", delay: 50 });
412
- for (let i = 0; i < 6; i++) {
413
- enqueue.raise({ type: "xyflow.updateNodeInternals" }, { delay: 100 + i * 100 });
439
+ for (let i = 1; i < 8; i++) {
440
+ enqueue.raise({ type: "xyflow.updateNodeInternals" }, { delay: 120 + i * 75 });
414
441
  }
415
442
  })
416
443
  }
@@ -434,16 +461,11 @@ const _relationshipsBrowserLogic = setup({
434
461
  },
435
462
  closed: {
436
463
  id: "closed",
437
- type: "final"
464
+ type: "final",
465
+ entry: dispose()
438
466
  }
439
467
  },
440
- exit: assign({
441
- xyflow: null,
442
- layouted: null,
443
- xystore: null,
444
- xyedges: [],
445
- xynodes: []
446
- })
468
+ exit: dispose()
447
469
  });
448
470
  const relationshipsBrowserLogic = _relationshipsBrowserLogic;
449
471
 
@@ -1,51 +1,58 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
+ import { useMemo } from 'react';
2
3
  import { useEnabledFeatures } from '../../../context/DiagramFeatures.js';
3
- import { useCurrentViewId } from '../../../hooks/useCurrentViewId.js';
4
- import { useDiagram } from '../../../hooks/useDiagram.js';
4
+ import { useCurrentViewId } from '../../../hooks/useCurrentView.js';
5
+ import '@xstate/react';
6
+ import 'fast-equals';
7
+ import { useDiagram } from '../../../hooks/safeContext.js';
5
8
  import { useRelationshipsBrowser, useRelationshipsBrowserState } from '../hooks.js';
9
+ import IconZoomScan from '../../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.2.0/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js';
10
+ import IconTransform from '../../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.2.0/node_modules/@tabler/icons-react/dist/esm/icons/IconTransform.js';
11
+ import IconFileSymlink from '../../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.2.0/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js';
6
12
  import { ElementActionButtons } from '../../../base-primitives/element/ElementActionButtons.js';
7
- import IconZoomScan from '../../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconZoomScan.js';
8
- import IconTransform from '../../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconTransform.js';
9
- import IconFileSymlink from '../../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconFileSymlink.js';
10
13
 
14
+ const selectSubject = (state) => state.context.subject;
11
15
  const ElementActions = (props) => {
12
16
  const { enableNavigateTo, enableVscode } = useEnabledFeatures();
13
17
  const diagram = useDiagram();
14
18
  const currentViewId = useCurrentViewId();
15
19
  const browser = useRelationshipsBrowser();
16
- const subject = useRelationshipsBrowserState((s) => s.context.subject);
17
- const buttons = [];
20
+ const subject = useRelationshipsBrowserState(selectSubject);
18
21
  const { navigateTo, fqn } = props.data;
19
- if (navigateTo && enableNavigateTo && currentViewId !== navigateTo) {
20
- buttons.push({
21
- key: "navigate",
22
- icon: /* @__PURE__ */ jsx(IconZoomScan, {}),
23
- onClick: (e) => {
24
- e.stopPropagation();
25
- diagram.navigateTo(navigateTo);
26
- }
27
- });
28
- }
29
- if (fqn !== subject) {
30
- buttons.push({
31
- key: "relationships",
32
- icon: /* @__PURE__ */ jsx(IconTransform, {}),
33
- onClick: (e) => {
34
- e.stopPropagation();
35
- browser.navigateTo(fqn, props.id);
36
- }
37
- });
38
- }
39
- if (enableVscode) {
40
- buttons.push({
41
- key: "goToSource",
42
- icon: /* @__PURE__ */ jsx(IconFileSymlink, {}),
43
- onClick: (e) => {
44
- e.stopPropagation();
45
- diagram.openSource({ element: fqn });
46
- }
47
- });
48
- }
22
+ const buttons = useMemo(() => {
23
+ const buttons2 = [];
24
+ if (navigateTo && enableNavigateTo && currentViewId !== navigateTo) {
25
+ buttons2.push({
26
+ key: "navigate",
27
+ icon: /* @__PURE__ */ jsx(IconZoomScan, {}),
28
+ onClick: (e) => {
29
+ e.stopPropagation();
30
+ diagram.navigateTo(navigateTo);
31
+ }
32
+ });
33
+ }
34
+ if (fqn !== subject) {
35
+ buttons2.push({
36
+ key: "relationships",
37
+ icon: /* @__PURE__ */ jsx(IconTransform, {}),
38
+ onClick: (e) => {
39
+ e.stopPropagation();
40
+ browser.navigateTo(fqn, props.id);
41
+ }
42
+ });
43
+ }
44
+ if (enableVscode) {
45
+ buttons2.push({
46
+ key: "goToSource",
47
+ icon: /* @__PURE__ */ jsx(IconFileSymlink, {}),
48
+ onClick: (e) => {
49
+ e.stopPropagation();
50
+ diagram.openSource({ element: fqn });
51
+ }
52
+ });
53
+ }
54
+ return buttons2;
55
+ }, [navigateTo, enableNavigateTo, currentViewId, fqn, subject, enableVscode, diagram, browser, props.id]);
49
56
  return /* @__PURE__ */ jsx(
50
57
  ElementActionButtons,
51
58
  {
@@ -2,7 +2,10 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { css } from '@likec4/styles/css';
3
3
  import { Tooltip } from '@mantine/core';
4
4
  import { getBezierPath } from '@xyflow/system';
5
- import { useDiagram } from '../../../hooks/useDiagram.js';
5
+ import '@xstate/react';
6
+ import 'fast-equals';
7
+ import 'react';
8
+ import { useDiagram } from '../../../hooks/safeContext.js';
6
9
  import { useRelationshipsBrowser } from '../hooks.js';
7
10
  import { memoEdge } from '../../../base-primitives/memoEdge.js';
8
11
  import { useEnabledFeatures } from '../../../context/DiagramFeatures.js';
@@ -1,7 +1,10 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { Handle, Position } from '@xyflow/react';
3
3
  import { useEnabledFeatures } from '../../../context/DiagramFeatures.js';
4
- import { useDiagram } from '../../../hooks/useDiagram.js';
4
+ import '@xstate/react';
5
+ import 'fast-equals';
6
+ import 'react';
7
+ import { useDiagram } from '../../../hooks/safeContext.js';
5
8
  import { ElementActions } from './ElementActions.js';
6
9
  import { CompoundNodeContainer } from '../../../base-primitives/compound/CompoundNodeContainer.js';
7
10
  import { CompoundTitle } from '../../../base-primitives/compound/CompoundTitle.js';
@@ -1,5 +1,4 @@
1
1
  import { nonNullable } from '@likec4/core';
2
- import { useCallbackRef } from '@mantine/hooks';
3
2
  import { useSelector } from '@xstate/react';
4
3
  import { shallowEqual } from 'fast-equals';
5
4
  import { createContext, useMemo, useContext } from 'react';
@@ -10,7 +9,7 @@ function useRelationshipsBrowserActor() {
10
9
  }
11
10
  function useRelationshipsBrowserState(selector, compare = shallowEqual) {
12
11
  const actor = useRelationshipsBrowserActor();
13
- return useSelector(actor, useCallbackRef(selector), compare);
12
+ return useSelector(actor, selector, compare);
14
13
  }
15
14
  function useRelationshipsBrowser() {
16
15
  const actor = useRelationshipsBrowserActor();
@@ -22,10 +21,12 @@ function useRelationshipsBrowser() {
22
21
  getState: () => actor.getSnapshot().context,
23
22
  send: actor.send,
24
23
  updateView: (layouted) => {
25
- actor.send({
26
- type: "update.view",
27
- layouted
28
- });
24
+ if (actor.getSnapshot().status === "active") {
25
+ actor.send({
26
+ type: "update.view",
27
+ layouted
28
+ });
29
+ }
29
30
  },
30
31
  changeScope: (scope) => {
31
32
  actor.send({
@@ -1,5 +1,5 @@
1
1
  import { RelationshipsViewData } from '@likec4/core/compute-view/relationships';
2
- import { DiagramEdge, DiagramNode, DiagramView, ElementKind, Fqn, RichTextOrEmpty, ViewId } from '@likec4/core/types';
2
+ import { DiagramEdge, DiagramNode, DiagramView, ElementKind, Fqn, MarkdownOrString, ViewId } from '@likec4/core/types';
3
3
  import { LikeC4ViewModel } from '@likec4/core/model';
4
4
  import { RelationshipsBrowserTypes } from './_types';
5
5
  export type LayoutRelationshipsViewResult = {
@@ -12,7 +12,7 @@ export type LayoutRelationshipsViewResult = {
12
12
  export declare namespace LayoutRelationshipsViewResult {
13
13
  const Empty: ElementKind;
14
14
  type Node = Omit<DiagramNode, 'deploymentRef' | 'description' | 'inEdges' | 'outEdges'> & {
15
- description: RichTextOrEmpty;
15
+ description: MarkdownOrString | null;
16
16
  column: RelationshipsBrowserTypes.Column;
17
17
  ports: RelationshipsBrowserTypes.Ports;
18
18
  existsInCurrentView: boolean;
@@ -1,7 +1,7 @@
1
1
  import { computeRelationshipsView, treeFromElements } from '@likec4/core/compute-view/relationships';
2
2
  import { useMemo } from 'react';
3
3
  import dagre from '@dagrejs/dagre';
4
- import { RichText, exact } from '@likec4/core/types';
4
+ import { preferSummary, exact } from '@likec4/core/types';
5
5
  import { toArray, invariant, ifind, nonNullable, DefaultMap } from '@likec4/core/utils';
6
6
  import { pipe, concat, map, groupBy, prop, forEachObj, filter, mapToObj, omit, find, only, unique, tap, reduce, sortBy } from 'remeda';
7
7
  import { useLikeC4Model } from '../../hooks/useLikeC4Model.js';
@@ -329,7 +329,7 @@ function layoutRelationshipsView(data, scope) {
329
329
  x: position.x,
330
330
  y: position.y,
331
331
  title: "empty node",
332
- description: RichText.EMPTY,
332
+ description: null,
333
333
  technology: null,
334
334
  tags: [],
335
335
  links: [],
@@ -372,7 +372,7 @@ function layoutRelationshipsView(data, scope) {
372
372
  x: position.x,
373
373
  y: position.y,
374
374
  title: element.title,
375
- description: element.summary,
375
+ description: preferSummary(element.$element) ?? null,
376
376
  technology: element.technology,
377
377
  tags: [...element.tags],
378
378
  links: null,
@@ -37,9 +37,6 @@ function viewToNodesEdge(view) {
37
37
  const id = node.id;
38
38
  const base = {
39
39
  id,
40
- draggable: false,
41
- selectable: true,
42
- focusable: true,
43
40
  position,
44
41
  zIndex: isCompound ? ZIndexes.Compound : ZIndexes.Element,
45
42
  style: {
@@ -1,29 +1,28 @@
1
- import { ActorRefFrom } from 'xstate';
2
- import { ElementDetailsLogic, Events as ElementDetailsEvents, Input as ElementDetailsInput } from './element-details/actor';
3
- import { Events as RelationshipDetailsEvents, Input as RelationshipDetailsInput, RelationshipDetailsLogic } from './relationship-details/actor';
4
- import { Events as RelationshipsBrowserEvents, Input as RelationshipsBrowserInput, RelationshipsBrowserLogic } from './relationships-browser/actor';
1
+ import { ElementDetailsActorRef, ElementDetailsInput, ElementDetailsLogic } from './element-details/actor';
2
+ import { RelationshipDetailsActorRef, RelationshipDetailsInput, RelationshipDetailsLogic } from './relationship-details/actor';
3
+ import { RelationshipsBrowserActorRef, RelationshipsBrowserInput, RelationshipsBrowserLogic } from './relationships-browser/actor';
5
4
  export declare namespace Overlays {
6
5
  namespace ElementDetails {
7
- type Events = ElementDetailsEvents;
8
- type Input = ElementDetailsInput;
9
- type Logic = ElementDetailsLogic;
10
- interface ActorRef extends ActorRefFrom<ElementDetailsLogic> {
6
+ interface Input extends ElementDetailsInput {
7
+ }
8
+ interface Logic extends ElementDetailsLogic {
9
+ }
10
+ interface ActorRef extends ElementDetailsActorRef {
11
11
  }
12
12
  }
13
13
  namespace RelationshipDetails {
14
- type Events = RelationshipDetailsEvents;
15
14
  type Input = RelationshipDetailsInput;
16
15
  interface Logic extends RelationshipDetailsLogic {
17
16
  }
18
- interface ActorRef extends ActorRefFrom<RelationshipDetailsLogic> {
17
+ interface ActorRef extends RelationshipDetailsActorRef {
19
18
  }
20
19
  }
21
20
  namespace RelationshipsBrowser {
22
- type Events = RelationshipsBrowserEvents;
23
- type Input = RelationshipsBrowserInput;
21
+ interface Input extends RelationshipsBrowserInput {
22
+ }
24
23
  interface Logic extends RelationshipsBrowserLogic {
25
24
  }
26
- interface ActorRef extends ActorRefFrom<RelationshipsBrowserLogic> {
25
+ interface ActorRef extends RelationshipsBrowserActorRef {
27
26
  }
28
27
  }
29
28
  }
@@ -2,7 +2,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { css } from '@likec4/styles/css';
3
3
  import { Box, VStack } from '@likec4/styles/jsx';
4
4
  import { Group, Grid, GridCol, Title, ScrollArea } from '@mantine/core';
5
- import { useCallbackRef, useHotkeys } from '@mantine/hooks';
5
+ import { useHotkeys } from '@mantine/hooks';
6
6
  import { useTimeoutEffect } from '@react-hookz/web';
7
7
  import { useSelector } from '@xstate/react';
8
8
  import { AnimatePresence, LayoutGroup } from 'motion/react';
@@ -11,6 +11,7 @@ import { ErrorBoundary } from 'react-error-boundary';
11
11
  import { isTruthy } from 'remeda';
12
12
  import { ErrorFallback } from '../components/ErrorFallback.js';
13
13
  import { DiagramFeatures } from '../context/DiagramFeatures.js';
14
+ import { useCallbackRef } from '../hooks/useCallbackRef.js';
14
15
  import { Overlay } from '../overlays/overlay/Overlay.js';
15
16
  import { ElementsColumn } from './components/ElementsColumn.js';
16
17
  import { PickView } from './components/PickView.js';
@@ -2,12 +2,14 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { ifilter, sortParentsFirst, isAncestor, nameFromFqn } from '@likec4/core/utils';
3
3
  import { cx } from '@likec4/styles/css';
4
4
  import { useTree, Tree, ActionIcon, UnstyledButton, Box, Group, Highlight, Tooltip, Text } from '@mantine/core';
5
- import { useCallbackRef } from '@mantine/hooks';
6
5
  import * as m from 'motion/react-m';
7
6
  import { memo, useMemo, useEffect } from 'react';
8
7
  import { isEmpty, pipe, reduce, only, first } from 'remeda';
9
8
  import { IconOrShapeRenderer } from '../../context/IconRenderer.js';
10
- import { useDiagram } from '../../hooks/useDiagram.js';
9
+ import { useCallbackRef } from '../../hooks/useCallbackRef.js';
10
+ import '@xstate/react';
11
+ import 'fast-equals';
12
+ import { useDiagram } from '../../hooks/safeContext.js';
11
13
  import { sortByLabel } from '../../hooks/useLikeC4ElementsTree.js';
12
14
  import { useLikeC4Model } from '../../hooks/useLikeC4Model.js';
13
15
  import { useNormalizedSearch, useSearchActor } from '../hooks.js';
@@ -15,7 +17,7 @@ import { focusable, buttonsva } from './_shared.css.js';
15
17
  import { treeSubtree, treeLabel, treeRoot, treeNode, elementIcon, elementExpandIcon, elementTitleAndId, elementId, elementViewsCount } from './ElementsColumn.css.js';
16
18
  import { stopAndPrevent, moveFocusToSearchInput, queryAllFocusable, centerY } from './utils.js';
17
19
  import { NothingFound } from './ViewsColum.js';
18
- import IconChevronRight from '../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js';
20
+ import IconChevronRight from '../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.2.0/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.js';
19
21
 
20
22
  const btn = buttonsva();
21
23
  const ElementsColumn = memo(() => {
@@ -6,7 +6,7 @@ import { useLikeC4Model } from '../../hooks/useLikeC4Model.js';
6
6
  import { useSearchActor } from '../hooks.js';
7
7
  import { pickviewBackdrop, pickview, pickviewGroup } from './styles.css.js';
8
8
  import { ViewButton } from './ViewsColum.js';
9
- import IconX from '../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.1.1/node_modules/@tabler/icons-react/dist/esm/icons/IconX.js';
9
+ import IconX from '../../node_modules/.pnpm/@tabler_icons-react@3.35.0_react@19.2.0/node_modules/@tabler/icons-react/dist/esm/icons/IconX.js';
10
10
 
11
11
  function PickView({ elementFqn }) {
12
12
  const searchActorRef = useSearchActor();