@likec4/diagram 1.42.1 → 1.44.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 (309) hide show
  1. package/bundle/index.js +6198 -4860
  2. package/dist/LikeC4Diagram.d.ts +1 -1
  3. package/dist/LikeC4Diagram.js +15 -12
  4. package/dist/LikeC4Diagram.props.d.ts +28 -14
  5. package/dist/LikeC4ProjectsProvider.js +1 -1
  6. package/dist/LikeC4View.d.ts +28 -4
  7. package/dist/LikeC4View.js +28 -17
  8. package/dist/ReactLikeC4.d.ts +1 -1
  9. package/dist/ReactLikeC4.js +5 -7
  10. package/dist/StaticLikeC4Diagram.js +2 -2
  11. package/dist/_virtual/_commonjsHelpers.js +3 -0
  12. package/dist/_virtual/assign-dea9f7c8.cjs.js +3 -0
  13. package/dist/_virtual/log-ec8d4df4.cjs.js +3 -0
  14. package/dist/_virtual/raise-da5b247f.cjs.js +3 -0
  15. package/dist/_virtual/xstate-actions.cjs.js +5 -0
  16. package/dist/_virtual/xstate-actions.cjs2.js +3 -0
  17. package/dist/_virtual/xstate-dev.cjs.js +3 -0
  18. package/dist/_virtual/xstate-guards.cjs.js +5 -0
  19. package/dist/_virtual/xstate-guards.cjs2.js +3 -0
  20. package/dist/base/Background.d.ts +2 -1
  21. package/dist/base/Background.js +11 -2
  22. package/dist/base/Base.d.ts +28 -0
  23. package/dist/base/BaseXYFlow.d.ts +5 -5
  24. package/dist/base/BaseXYFlow.js +38 -44
  25. package/dist/base/const.d.ts +1 -1
  26. package/dist/base/const.js +1 -1
  27. package/dist/base/index.d.ts +6 -2
  28. package/dist/base/types.d.ts +1 -28
  29. package/dist/base/updateEdges.js +4 -3
  30. package/dist/base/updateNodes.js +3 -2
  31. package/dist/base-primitives/compound/CompoundActionButton.js +1 -1
  32. package/dist/base-primitives/compound/CompoundDetailsButton.js +1 -1
  33. package/dist/base-primitives/edge/EdgeActionButton.js +1 -1
  34. package/dist/base-primitives/edge/EdgeContainer.d.ts +1 -1
  35. package/dist/base-primitives/edge/EdgeContainer.js +4 -0
  36. package/dist/base-primitives/edge/EdgeLabel.d.ts +1 -0
  37. package/dist/base-primitives/edge/EdgeLabel.js +2 -0
  38. package/dist/base-primitives/edge/EdgeLabelContainer.d.ts +1 -1
  39. package/dist/base-primitives/edge/EdgeLabelContainer.js +4 -0
  40. package/dist/base-primitives/edge/EdgePath.d.ts +4 -0
  41. package/dist/base-primitives/edge/EdgePath.js +9 -5
  42. package/dist/base-primitives/element/ElementActionButtons.d.ts +3 -2
  43. package/dist/base-primitives/element/ElementActionButtons.js +1 -1
  44. package/dist/base-primitives/element/ElementDetailsButton.js +2 -5
  45. package/dist/base-primitives/element/ElementNodeContainer.css.js +15 -27
  46. package/dist/base-primitives/element/ElementTags.js +2 -1
  47. package/dist/base-primitives/memoEdge.js +4 -2
  48. package/dist/base-primitives/memoNode.d.ts +1 -1
  49. package/dist/base-primitives/memoNode.js +3 -3
  50. package/dist/components/ErrorFallback.js +52 -35
  51. package/dist/components/Link.js +2 -2
  52. package/dist/context/DiagramEventHandlers.js +2 -1
  53. package/dist/context/DiagramFeatures.d.ts +24 -6
  54. package/dist/context/DiagramFeatures.js +28 -56
  55. package/dist/context/IconRenderer.js +6 -6
  56. package/dist/context/LikeC4ModelContext.js +3 -10
  57. package/dist/context/TagStylesContext.js +2 -18
  58. package/dist/context/index.d.ts +1 -1
  59. package/dist/custom/customNodes.js +3 -2
  60. package/dist/custom/hooks.d.ts +1 -1
  61. package/dist/custom/index.d.ts +1 -1
  62. package/dist/custom/index.js +4 -4
  63. package/dist/editor/LikeC4EditorContext.d.ts +21 -0
  64. package/dist/editor/index.d.ts +2 -0
  65. package/dist/hooks/index.d.ts +2 -1
  66. package/dist/hooks/safeContext.d.ts +6 -3
  67. package/dist/hooks/safeContext.js +10 -3
  68. package/dist/hooks/useCallbackRef.d.ts +1 -0
  69. package/dist/hooks/useCallbackRef.js +13 -0
  70. package/dist/hooks/useCurrentView.d.ts +11 -0
  71. package/dist/hooks/{useCurrentViewId.js → useCurrentView.js} +7 -3
  72. package/dist/hooks/useCurrentViewModel.js +4 -1
  73. package/dist/hooks/useDiagram.d.ts +7 -113
  74. package/dist/hooks/useDiagram.js +7 -127
  75. package/dist/hooks/useDiagramCompareLayout.d.ts +35 -0
  76. package/dist/hooks/useDiagramCompareLayout.js +60 -0
  77. package/dist/hooks/useUpdateEffect.js +2 -4
  78. package/dist/hooks/useXYFlow.d.ts +1 -0
  79. package/dist/hooks/useXYFlow.js +4 -7
  80. package/dist/index.d.ts +2 -2
  81. package/dist/index.js +4 -3
  82. package/dist/likec4diagram/DiagramUI.js +14 -7
  83. package/dist/likec4diagram/DiagramXYFlow.d.ts +2 -2
  84. package/dist/likec4diagram/DiagramXYFlow.js +54 -51
  85. package/dist/likec4diagram/convert-to-xyflow.d.ts +0 -1
  86. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +249 -220
  87. package/dist/likec4diagram/custom/edges/SequenceStepEdge.js +7 -2
  88. package/dist/likec4diagram/custom/edges/edges.css.js +3 -4
  89. package/dist/likec4diagram/custom/edges/useControlPoints.d.ts +8 -0
  90. package/dist/likec4diagram/custom/edges/useControlPoints.js +58 -0
  91. package/dist/likec4diagram/custom/edges/useRelationshipEdgePath.d.ts +7 -0
  92. package/dist/likec4diagram/custom/edges/useRelationshipEdgePath.js +60 -0
  93. package/dist/likec4diagram/custom/edges/utils.d.ts +0 -12
  94. package/dist/likec4diagram/custom/nodes/CompoundActions.js +4 -1
  95. package/dist/likec4diagram/custom/nodes/ElementActions.d.ts +2 -1
  96. package/dist/likec4diagram/custom/nodes/ElementActions.js +15 -10
  97. package/dist/likec4diagram/custom/nodes/ElementNodeDrifts.d.ts +4 -0
  98. package/dist/likec4diagram/custom/nodes/ElementNodeDrifts.js +46 -0
  99. package/dist/likec4diagram/custom/nodes/SequenceActorNode.js +4 -1
  100. package/dist/likec4diagram/custom/nodes/nodes.d.ts +9 -1
  101. package/dist/likec4diagram/custom/nodes/nodes.js +13 -9
  102. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.d.ts +1 -1
  103. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +1 -1
  104. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +2 -1
  105. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +4 -3
  106. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +1 -11
  107. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +7 -51
  108. package/dist/likec4diagram/custom/nodes/toolbar/types.d.ts +5 -0
  109. package/dist/likec4diagram/custom/nodes/toolbar/types.js +7 -0
  110. package/dist/likec4diagram/custom/nodes/toolbar/useHandlers.d.ts +8 -0
  111. package/dist/likec4diagram/custom/nodes/toolbar/useHandlers.js +44 -0
  112. package/dist/likec4diagram/relationship-popover/RelationshipPopover.js +5 -7
  113. package/dist/likec4diagram/state/DiagramActorProvider.d.ts +3 -2
  114. package/dist/likec4diagram/state/DiagramActorProvider.js +96 -70
  115. package/dist/likec4diagram/state/assign.d.ts +4 -2
  116. package/dist/likec4diagram/state/assign.js +39 -103
  117. package/dist/likec4diagram/state/createViewChange.d.ts +3 -0
  118. package/dist/likec4diagram/state/createViewChange.js +90 -0
  119. package/dist/likec4diagram/state/diagram-api.d.ts +113 -0
  120. package/dist/likec4diagram/state/diagram-api.js +134 -0
  121. package/dist/likec4diagram/state/hotkeyActor.d.ts +7 -0
  122. package/dist/likec4diagram/state/hotkeyActor.js +17 -1
  123. package/dist/likec4diagram/state/machine.actions.d.ts +2099 -0
  124. package/dist/likec4diagram/state/machine.actions.js +735 -0
  125. package/dist/likec4diagram/state/machine.d.ts +3717 -0
  126. package/dist/likec4diagram/state/machine.js +141 -0
  127. package/dist/likec4diagram/state/machine.setup.d.ts +284 -0
  128. package/dist/likec4diagram/state/machine.setup.js +71 -0
  129. package/dist/likec4diagram/state/machine.state.initializing.d.ts +183 -0
  130. package/dist/likec4diagram/state/machine.state.initializing.js +55 -0
  131. package/dist/likec4diagram/state/machine.state.navigating.d.ts +117 -0
  132. package/dist/likec4diagram/state/machine.state.navigating.js +45 -0
  133. package/dist/likec4diagram/state/machine.state.ready.d.ts +3666 -0
  134. package/dist/likec4diagram/state/machine.state.ready.js +437 -0
  135. package/dist/likec4diagram/state/syncManualLayoutActor.d.ts +220 -63
  136. package/dist/likec4diagram/state/syncManualLayoutActor.js +218 -143
  137. package/dist/likec4diagram/state/types.d.ts +4 -7
  138. package/dist/likec4diagram/state/utils.d.ts +4 -2
  139. package/dist/likec4diagram/state/utils.js +4 -1
  140. package/dist/likec4diagram/types.d.ts +6 -1
  141. package/dist/likec4diagram/ui/LayoutDriftFrame.d.ts +2 -0
  142. package/dist/likec4diagram/ui/LayoutDriftFrame.js +66 -0
  143. package/dist/likec4diagram/ui/index.d.ts +1 -0
  144. package/dist/likec4diagram/ui/notation/NotationPanel.js +10 -12
  145. package/dist/likec4diagram/useLayoutConstraints.d.ts +10 -5
  146. package/dist/likec4diagram/useLayoutConstraints.js +225 -54
  147. package/dist/likec4diagram/xyflow-diagram/diagram-view.d.ts +0 -1
  148. package/dist/likec4diagram/xyflow-diagram/diagram-view.js +15 -15
  149. package/dist/navigationpanel/NavigationPanel.js +11 -7
  150. package/dist/navigationpanel/NavigationPanelControls.d.ts +2 -1
  151. package/dist/navigationpanel/NavigationPanelControls.js +23 -17
  152. package/dist/navigationpanel/NavigationPanelDropdown.d.ts +2 -1
  153. package/dist/navigationpanel/NavigationPanelDropdown.js +62 -42
  154. package/dist/navigationpanel/_common.d.ts +1 -1
  155. package/dist/navigationpanel/_common.js +4 -2
  156. package/dist/navigationpanel/actor.d.ts +11 -7
  157. package/dist/navigationpanel/actor.js +5 -4
  158. package/dist/navigationpanel/comparepanel/CompareActionsMenu.d.ts +3 -0
  159. package/dist/navigationpanel/comparepanel/CompareActionsMenu.js +59 -0
  160. package/dist/navigationpanel/comparepanel/ComparePanel.d.ts +2 -0
  161. package/dist/navigationpanel/comparepanel/ComparePanel.js +42 -0
  162. package/dist/navigationpanel/comparepanel/ComparePanelControls.d.ts +1 -0
  163. package/dist/navigationpanel/comparepanel/ComparePanelControls.js +60 -0
  164. package/dist/navigationpanel/comparepanel/LayoutTypeSwitcher.d.ts +5 -0
  165. package/dist/navigationpanel/comparepanel/LayoutTypeSwitcher.js +38 -0
  166. package/dist/navigationpanel/comparepanel/index.d.ts +1 -0
  167. package/dist/navigationpanel/controls/{ViewDetailsCard.d.ts → DetailsControls.d.ts} +1 -1
  168. package/dist/navigationpanel/controls/{ViewDetailsCard.js → DetailsControls.js} +18 -14
  169. package/dist/navigationpanel/controls/LayoutWarning.d.ts +2 -0
  170. package/dist/navigationpanel/controls/LayoutWarning.js +102 -0
  171. package/dist/navigationpanel/controls/NavigationButtons.js +4 -3
  172. package/dist/navigationpanel/controls/OpenSource.js +2 -2
  173. package/dist/navigationpanel/controls/SearchControl.d.ts +2 -1
  174. package/dist/navigationpanel/controls/SearchControl.js +15 -17
  175. package/dist/navigationpanel/controls/ToggleReadonly.d.ts +1 -1
  176. package/dist/navigationpanel/controls/ToggleReadonly.js +19 -16
  177. package/dist/navigationpanel/controls/index.d.ts +2 -1
  178. package/dist/navigationpanel/dropdown/ProjectsMenu.d.ts +2 -2
  179. package/dist/navigationpanel/dropdown/ProjectsMenu.js +5 -5
  180. package/dist/navigationpanel/editorpanel/CenterCamera.js +5 -2
  181. package/dist/navigationpanel/editorpanel/ChangeAutoLayoutButton.d.ts +1 -1
  182. package/dist/navigationpanel/editorpanel/ChangeAutoLayoutButton.js +21 -20
  183. package/dist/navigationpanel/editorpanel/EditorPanel.js +3 -3
  184. package/dist/navigationpanel/editorpanel/ManualLayoutToolsButton.d.ts +2 -2
  185. package/dist/navigationpanel/editorpanel/ManualLayoutToolsButton.js +16 -13
  186. package/dist/navigationpanel/editorpanel/ToggleReadonly.d.ts +1 -0
  187. package/dist/navigationpanel/editorpanel/ToggleReadonly.js +15 -0
  188. package/dist/navigationpanel/styles.css.d.ts +2 -2
  189. package/dist/navigationpanel/styles.css.js +4 -4
  190. package/dist/navigationpanel/walkthrough/ActiveWalkthroughControls.js +14 -8
  191. package/dist/navigationpanel/walkthrough/DynamicViewControls.d.ts +10 -10
  192. package/dist/navigationpanel/walkthrough/DynamicViewControls.js +31 -14
  193. package/dist/navigationpanel/walkthrough/WalkthroughPanel.d.ts +2 -1
  194. package/dist/navigationpanel/walkthrough/WalkthroughPanel.js +66 -49
  195. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/actions/dist/xstate-actions.cjs.js +37 -0
  196. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/dev/dist/xstate-dev.cjs.js +59 -0
  197. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/dist/assign-dea9f7c8.cjs.js +140 -0
  198. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/dist/log-ec8d4df4.cjs.js +401 -0
  199. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/dist/raise-da5b247f.cjs.js +2716 -0
  200. package/dist/node_modules/.pnpm/xstate@5.24.0_patch_hash_3a1bd6d012ec67bf6e38a00c3226d1be77089442f83aeb6e424b00ca2a11d21c/node_modules/xstate/guards/dist/xstate-guards.cjs.js +26 -0
  201. package/dist/overlays/element-details/ElementDetails.js +7 -7
  202. package/dist/overlays/element-details/ElementDetailsCard.js +18 -88
  203. package/dist/overlays/element-details/MetadataValue.d.ts +9 -0
  204. package/dist/overlays/element-details/MetadataValue.js +261 -0
  205. package/dist/overlays/element-details/TabPanelDeployments.js +6 -4
  206. package/dist/overlays/element-details/TabPanelRelationships.js +3 -3
  207. package/dist/overlays/element-details/TabPanelStructure.js +1 -1
  208. package/dist/overlays/element-details/actor.d.ts +3 -2
  209. package/dist/overlays/overlaysActor.d.ts +304 -62
  210. package/dist/overlays/overlaysActor.js +132 -131
  211. package/dist/overlays/relationship-details/RelationshipDetails.js +4 -3
  212. package/dist/overlays/relationship-details/SelectEdge.js +2 -2
  213. package/dist/overlays/relationship-details/actor.d.ts +14 -2
  214. package/dist/overlays/relationship-details/actor.js +23 -5
  215. package/dist/overlays/relationship-details/custom/ElementActions.js +8 -5
  216. package/dist/overlays/relationship-details/custom/edgeTypes.js +4 -1
  217. package/dist/overlays/relationship-details/custom/nodeTypes.js +4 -1
  218. package/dist/overlays/relationship-details/hooks.js +1 -1
  219. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +6 -4
  220. package/dist/overlays/relationships-browser/SelectElement.js +2 -2
  221. package/dist/overlays/relationships-browser/actor.d.ts +239 -173
  222. package/dist/overlays/relationships-browser/actor.js +132 -110
  223. package/dist/overlays/relationships-browser/const.d.ts +3 -3
  224. package/dist/overlays/relationships-browser/const.js +3 -3
  225. package/dist/overlays/relationships-browser/custom/ElementActions.js +44 -37
  226. package/dist/overlays/relationships-browser/custom/edgeTypes.js +4 -1
  227. package/dist/overlays/relationships-browser/custom/nodeTypes.js +4 -1
  228. package/dist/overlays/relationships-browser/hooks.js +7 -6
  229. package/dist/search/Search.js +2 -1
  230. package/dist/search/components/ElementsColumn.js +5 -3
  231. package/dist/search/components/PickView.js +1 -1
  232. package/dist/search/components/SearchByTags.js +21 -44
  233. package/dist/search/components/SearchInput.js +1 -1
  234. package/dist/search/components/ViewsColum.js +6 -4
  235. package/dist/shadowroot/ShadowRoot.js +53 -12
  236. package/dist/shadowroot/styles.css.d.ts +0 -4
  237. package/dist/shadowroot/styles.css.js +1 -41
  238. package/dist/styles.css2.js +1 -1
  239. package/dist/utils/index.d.ts +4 -4
  240. package/dist/utils/vector.d.ts +78 -21
  241. package/dist/utils/vector.js +91 -24
  242. package/dist/utils/view-bounds.d.ts +8 -0
  243. package/dist/utils/view-bounds.js +57 -0
  244. package/dist/utils/xyflow.d.ts +49 -7
  245. package/dist/utils/xyflow.js +63 -11
  246. package/package.json +28 -27
  247. package/panda.buildinfo.json +140 -83
  248. package/styles-min.css +1 -1
  249. package/styles.css +1 -1
  250. package/dist/hooks/useCurrentViewId.d.ts +0 -6
  251. package/dist/likec4diagram/custom/edges/utils.js +0 -23
  252. package/dist/likec4diagram/state/diagram-machine.d.ts +0 -2590
  253. package/dist/likec4diagram/state/diagram-machine.js +0 -1180
  254. package/dist/navigationpanel/editorpanel/LayoutDriftNotification.d.ts +0 -1
  255. package/dist/navigationpanel/editorpanel/LayoutDriftNotification.js +0 -56
  256. package/dist/utils/get-view-bounds.d.ts +0 -3
  257. package/dist/utils/get-view-bounds.js +0 -14
  258. /package/dist/base/{types.js → Base.js} +0 -0
  259. /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
  260. /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
  261. /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
  262. /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
  263. /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
  264. /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
  265. /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
  266. /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
  267. /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
  268. /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
  269. /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
  270. /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
  271. /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
  272. /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
  273. /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
  274. /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
  275. /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
  276. /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
  277. /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
  278. /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
  279. /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
  280. /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
  281. /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
  282. /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
  283. /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
  284. /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
  285. /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
  286. /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
  287. /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
  288. /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
  289. /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
  290. /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
  291. /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
  292. /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
  293. /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
  294. /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
  295. /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
  296. /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
  297. /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
  298. /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
  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/icons/IconReorder.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/icons/IconRouteOff.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/IconSearch.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/IconSelector.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/IconStack2.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/IconStarFilled.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/IconTarget.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/IconTransform.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/IconUser.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/IconX.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/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,6 +1,6 @@
1
1
  export declare const ViewPadding: {
2
2
  readonly top: "40px";
3
- readonly bottom: "16px";
4
- readonly left: "16px";
5
- readonly right: "16px";
3
+ readonly bottom: "22px";
4
+ readonly left: "22px";
5
+ readonly right: "22px";
6
6
  };
@@ -1,8 +1,8 @@
1
1
  const ViewPadding = {
2
2
  top: "40px",
3
- bottom: "16px",
4
- left: "16px",
5
- right: "16px"
3
+ bottom: "22px",
4
+ left: "22px",
5
+ right: "22px"
6
6
  };
7
7
 
8
8
  export { ViewPadding };
@@ -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({
@@ -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();