@likec4/diagram 1.26.1 → 1.27.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 (482) hide show
  1. package/README.md +1 -1
  2. package/bundle/index.js +48891 -0
  3. package/dist/LikeC4CustomColors.js +27 -23
  4. package/dist/LikeC4Diagram.d.ts +1 -1
  5. package/dist/LikeC4Diagram.js +37 -36
  6. package/dist/LikeC4Diagram.props.d.ts +6 -0
  7. package/dist/LikeC4ModelProvider.js +6 -6
  8. package/dist/StaticLikeC4Diagram.js +5 -5
  9. package/dist/_virtual/_commonjsHelpers.js +5 -0
  10. package/dist/_virtual/default-map.js +7 -0
  11. package/dist/base/Background.js +6 -6
  12. package/dist/base/BaseXYFlow.d.ts +1 -1
  13. package/dist/base/BaseXYFlow.js +75 -46
  14. package/dist/base/const.js +2 -5
  15. package/dist/base/primitives/NodeHandles.js +5 -5
  16. package/dist/base/primitives/compound/CompoundActionButton.js +60 -33
  17. package/dist/base/primitives/compound/CompoundDetailsButton.js +66 -35
  18. package/dist/base/primitives/compound/CompoundNodeContainer.css.d.ts +35 -7
  19. package/dist/base/primitives/compound/CompoundNodeContainer.css.js +131 -12
  20. package/dist/base/primitives/compound/CompoundNodeContainer.d.ts +4 -20
  21. package/dist/base/primitives/compound/CompoundNodeContainer.js +99 -97
  22. package/dist/base/primitives/compound/CompoundTitle.d.ts +1 -1
  23. package/dist/base/primitives/compound/CompoundTitle.js +74 -12
  24. package/dist/base/primitives/compound/actionbtns.css.d.ts +11 -0
  25. package/dist/base/primitives/compound/actionbtns.css.js +32 -0
  26. package/dist/base/primitives/customEdge.d.ts +5 -5
  27. package/dist/base/primitives/customEdge.js +6 -7
  28. package/dist/base/primitives/customNode.js +5 -6
  29. package/dist/base/primitives/edge/EdgeActionButton.js +10 -12
  30. package/dist/base/primitives/edge/EdgeContainer.d.ts +1 -1
  31. package/dist/base/primitives/edge/EdgeContainer.js +21 -15
  32. package/dist/base/primitives/edge/EdgeLabel.css.d.ts +24 -10
  33. package/dist/base/primitives/edge/EdgeLabel.css.js +133 -20
  34. package/dist/base/primitives/edge/EdgeLabel.d.ts +4 -44
  35. package/dist/base/primitives/edge/EdgeLabel.js +35 -88
  36. package/dist/base/primitives/edge/EdgeLabelContainer.d.ts +18 -0
  37. package/dist/base/primitives/edge/EdgeLabelContainer.js +91 -0
  38. package/dist/base/primitives/edge/EdgeMarkers.js +5 -6
  39. package/dist/base/primitives/edge/EdgePath.d.ts +7 -7
  40. package/dist/base/primitives/edge/EdgePath.js +17 -29
  41. package/dist/base/primitives/edge/edge.css.d.ts +2 -2
  42. package/dist/base/primitives/edge/edge.css.js +123 -12
  43. package/dist/base/primitives/edge/xyvars.d.ts +24 -0
  44. package/dist/base/primitives/element/ElementActionButtons.js +35 -17
  45. package/dist/base/primitives/element/ElementDetailsButton.js +34 -16
  46. package/dist/base/primitives/element/ElementNodeContainer.css.d.ts +0 -1
  47. package/dist/base/primitives/element/ElementNodeContainer.css.js +50 -5
  48. package/dist/base/primitives/element/ElementNodeContainer.d.ts +1 -1
  49. package/dist/base/primitives/element/ElementNodeContainer.js +28 -19
  50. package/dist/base/primitives/element/ElementShape.css.js +118 -15
  51. package/dist/base/primitives/element/ElementShape.js +8 -10
  52. package/dist/base/primitives/element/ElementTitle.css.d.ts +33 -8
  53. package/dist/base/primitives/element/ElementTitle.css.js +195 -20
  54. package/dist/base/primitives/element/ElementTitle.js +25 -24
  55. package/dist/base/primitives/index.d.ts +1 -0
  56. package/dist/base/types.js +4 -4
  57. package/dist/base/updateEdges.js +5 -5
  58. package/dist/base/updateNodes.js +6 -6
  59. package/dist/bundle/LikeC4ModelProvider.d.ts +9 -0
  60. package/dist/bundle/LikeC4ModelProvider.js +5 -0
  61. package/dist/bundle/LikeC4View.d.ts +2 -0
  62. package/dist/bundle/LikeC4View.js +176 -0
  63. package/dist/bundle/LikeC4View.props.d.ts +207 -0
  64. package/dist/bundle/ReactLikeC4.d.ts +36 -0
  65. package/dist/bundle/ReactLikeC4.js +90 -0
  66. package/dist/bundle/ShadowRoot.d.ts +12 -0
  67. package/dist/bundle/ShadowRoot.js +52 -0
  68. package/dist/bundle/ViewNotFound.d.ts +5 -0
  69. package/dist/bundle/ViewNotFound.js +30 -0
  70. package/dist/bundle/font.css.js +3 -0
  71. package/dist/bundle/index.d.ts +5 -0
  72. package/dist/bundle/index.js +4 -0
  73. package/dist/bundle/styles.css.d.ts +10 -0
  74. package/dist/bundle/styles.css.js +145 -0
  75. package/dist/components/Link.js +61 -12
  76. package/dist/components/SearchControl.css.js +72 -9
  77. package/dist/components/SearchControl.js +11 -11
  78. package/dist/context/ControlsCustomLayout.js +5 -6
  79. package/dist/context/DiagramEventHandlers.js +8 -13
  80. package/dist/context/DiagramFeatures.js +7 -12
  81. package/dist/context/EnsureMantine.js +6 -6
  82. package/dist/context/FramerMotionConfig.js +8 -9
  83. package/dist/context/IconRenderer.js +7 -9
  84. package/dist/context/ReduceGraphics.d.ts +4 -5
  85. package/dist/context/ReduceGraphics.js +11 -43
  86. package/dist/context/RootContainer.js +23 -10
  87. package/dist/hooks/safeContext.js +5 -7
  88. package/dist/hooks/useCurrentViewId.js +6 -6
  89. package/dist/hooks/useDiagram.d.ts +5020 -4373
  90. package/dist/hooks/useDiagram.js +13 -17
  91. package/dist/hooks/useMantinePortalProps.js +5 -5
  92. package/dist/hooks/useOverlaysActor.d.ts +2 -0
  93. package/dist/hooks/useOverlaysActor.js +10 -0
  94. package/dist/hooks/useReducedGraphics.d.ts +1 -1
  95. package/dist/hooks/useSetState.js +5 -5
  96. package/dist/hooks/useUpdateEffect.js +6 -7
  97. package/dist/hooks/useXYFlow.d.ts +28 -28
  98. package/dist/hooks/useXYFlow.js +7 -11
  99. package/dist/index.d.ts +0 -1
  100. package/dist/index.js +10 -26
  101. package/dist/likec4diagram/DiagramUI.js +13 -13
  102. package/dist/likec4diagram/DiagramXYFlow.d.ts +1 -4
  103. package/dist/likec4diagram/DiagramXYFlow.js +81 -36
  104. package/dist/likec4diagram/custom/edges/NotePopover.css.js +21 -7
  105. package/dist/likec4diagram/custom/edges/NotePopover.js +18 -27
  106. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +9 -9
  107. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +99 -83
  108. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.css.d.ts +1 -0
  109. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.css.js +38 -11
  110. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.d.ts +3 -3
  111. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +28 -30
  112. package/dist/likec4diagram/custom/edges/edges.css.js +44 -9
  113. package/dist/likec4diagram/custom/edges/utils.js +6 -7
  114. package/dist/likec4diagram/custom/index.d.ts +9 -9
  115. package/dist/likec4diagram/custom/index.js +5 -6
  116. package/dist/likec4diagram/custom/nodes/CompoundActions.js +7 -7
  117. package/dist/likec4diagram/custom/nodes/ElementActions.js +8 -9
  118. package/dist/likec4diagram/custom/nodes/nodeTypes.js +22 -26
  119. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +10 -13
  120. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +15 -16
  121. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +12 -13
  122. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.d.ts +1 -1
  123. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +17 -14
  124. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +15 -20
  125. package/dist/likec4diagram/custom/nodes/toolbar/styles.css.js +10 -5
  126. package/dist/likec4diagram/ui/controls/ChangeAutoLayoutButton.js +15 -15
  127. package/dist/likec4diagram/ui/controls/Controls.js +24 -24
  128. package/dist/likec4diagram/ui/controls/LayoutDriftNotification.js +8 -9
  129. package/dist/likec4diagram/ui/controls/ManualLayoutToolsButton.js +8 -8
  130. package/dist/likec4diagram/ui/controls/NavigationButtons.js +8 -8
  131. package/dist/likec4diagram/ui/controls/ToggleReadonly.js +7 -7
  132. package/dist/likec4diagram/ui/controls/_shared.js +4 -5
  133. package/dist/likec4diagram/ui/controls/styles.css.js +79 -17
  134. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.css.js +49 -9
  135. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.js +12 -12
  136. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +85 -15
  137. package/dist/likec4diagram/ui/notation/NotationPanel.js +32 -32
  138. package/dist/likec4diagram/ui/search/ElementsColumn.css.d.ts +0 -5
  139. package/dist/likec4diagram/ui/search/ElementsColumn.css.js +70 -30
  140. package/dist/likec4diagram/ui/search/ElementsColumn.js +40 -33
  141. package/dist/likec4diagram/ui/search/LikeC4Search.css.js +87 -20
  142. package/dist/likec4diagram/ui/search/LikeC4Search.js +18 -17
  143. package/dist/likec4diagram/ui/search/SearchInput.js +22 -24
  144. package/dist/likec4diagram/ui/search/ViewsColum.js +22 -22
  145. package/dist/likec4diagram/ui/search/ViewsColumn.css.d.ts +0 -2
  146. package/dist/likec4diagram/ui/search/ViewsColumn.css.js +29 -14
  147. package/dist/likec4diagram/ui/search/_shared.css.d.ts +3 -17
  148. package/dist/likec4diagram/ui/search/_shared.css.js +171 -0
  149. package/dist/likec4diagram/ui/search/state.js +12 -22
  150. package/dist/likec4diagram/ui/search/utils.js +2 -5
  151. package/dist/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.css.js +66 -10
  152. package/dist/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.js +18 -27
  153. package/dist/likec4diagram/useLayoutConstraints.js +39 -46
  154. package/dist/likec4diagram/useViewToNodesEdges.js +12 -13
  155. package/dist/likec4model/LikeC4ModelContext.js +4 -4
  156. package/dist/likec4model/useLikeC4ElementsTree.js +6 -7
  157. package/dist/likec4model/useLikeC4Model.js +6 -6
  158. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/default-map.js +172 -0
  159. package/dist/overlays/Overlays.js +21 -21
  160. package/dist/overlays/element-details/ElementDetails.js +9 -9
  161. package/dist/overlays/element-details/ElementDetailsCard.css.d.ts +2 -3
  162. package/dist/overlays/element-details/ElementDetailsCard.css.js +237 -35
  163. package/dist/overlays/element-details/ElementDetailsCard.js +44 -46
  164. package/dist/overlays/element-details/TabPanelDeployments.css.js +62 -11
  165. package/dist/overlays/element-details/TabPanelDeployments.js +11 -11
  166. package/dist/overlays/element-details/TabPanelRelationships.css.js +99 -9
  167. package/dist/overlays/element-details/TabPanelRelationships.js +41 -14
  168. package/dist/overlays/element-details/TabPanelStructure.css.js +36 -7
  169. package/dist/overlays/element-details/TabPanelStructure.js +8 -9
  170. package/dist/overlays/element-details/actor.d.ts +21892 -22686
  171. package/dist/overlays/element-details/actor.js +18 -19
  172. package/dist/overlays/element-details/actorContext.js +4 -5
  173. package/dist/overlays/overlay/Overlay.css.d.ts +2 -2
  174. package/dist/overlays/overlay/Overlay.css.js +57 -98
  175. package/dist/overlays/overlay/Overlay.d.ts +2 -2
  176. package/dist/overlays/overlay/Overlay.js +96 -94
  177. package/dist/overlays/overlaysActor.d.ts +6 -6
  178. package/dist/overlays/overlaysActor.js +17 -18
  179. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +49 -0
  180. package/dist/overlays/relationship-details/RelationshipDetails.js +24 -17
  181. package/dist/overlays/relationship-details/SelectEdge.css.js +82 -17
  182. package/dist/overlays/relationship-details/SelectEdge.js +15 -17
  183. package/dist/overlays/relationship-details/actor.js +9 -9
  184. package/dist/overlays/relationship-details/custom/ElementActions.js +8 -8
  185. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +44 -46
  186. package/dist/overlays/relationship-details/custom/edgeTypes.js +49 -50
  187. package/dist/overlays/relationship-details/custom/index.d.ts +2 -2
  188. package/dist/overlays/relationship-details/custom/nodeTypes.d.ts +28 -30
  189. package/dist/overlays/relationship-details/custom/nodeTypes.js +31 -35
  190. package/dist/overlays/relationship-details/hooks.js +9 -13
  191. package/dist/overlays/relationship-details/useLayoutedDetails.js +16 -18
  192. package/dist/overlays/relationships-browser/-useRelationshipsView.d.ts +8 -24
  193. package/dist/overlays/relationships-browser/-useRelationshipsView.js +50 -85
  194. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +48 -0
  195. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +101 -101
  196. package/dist/overlays/relationships-browser/SelectElement.css.js +22 -9
  197. package/dist/overlays/relationships-browser/SelectElement.d.ts +2 -7
  198. package/dist/overlays/relationships-browser/SelectElement.js +196 -112
  199. package/dist/overlays/relationships-browser/_types.d.ts +4 -1
  200. package/dist/overlays/relationships-browser/actor.d.ts +478 -351
  201. package/dist/overlays/relationships-browser/actor.js +108 -94
  202. package/dist/overlays/relationships-browser/const.d.ts +1 -1
  203. package/dist/overlays/relationships-browser/const.js +3 -4
  204. package/dist/overlays/relationships-browser/custom/ElementActions.js +9 -9
  205. package/dist/overlays/relationships-browser/custom/EmptyNode.js +6 -6
  206. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +43 -44
  207. package/dist/overlays/relationships-browser/custom/edgeTypes.js +97 -65
  208. package/dist/overlays/relationships-browser/custom/index.d.ts +2 -2
  209. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +37 -37
  210. package/dist/overlays/relationships-browser/custom/nodeTypes.js +36 -40
  211. package/dist/overlays/relationships-browser/custom/styles.css.js +14 -5
  212. package/dist/overlays/relationships-browser/hooks.d.ts +14 -6
  213. package/dist/overlays/relationships-browser/hooks.js +25 -16
  214. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +13 -18
  215. package/dist/packages/core/src/compute-view/relationships-view/compute.js +123 -0
  216. package/dist/packages/core/src/compute-view/relationships-view/utils.js +68 -0
  217. package/dist/packages/core/src/errors/index.js +15 -0
  218. package/dist/packages/core/src/utils/fqn.js +43 -0
  219. package/dist/packages/core/src/utils/guards.js +7 -0
  220. package/dist/packages/core/src/utils/iterable/filter.js +21 -0
  221. package/dist/packages/core/src/utils/iterable/map.js +18 -0
  222. package/dist/packages/core/src/utils/iterable/to.js +14 -0
  223. package/dist/src/index.ts.d.ts +2 -0
  224. package/dist/state/DiagramActorProvider.js +26 -27
  225. package/dist/state/aligners.js +22 -31
  226. package/dist/state/assign.js +11 -21
  227. package/dist/state/diagram-machine.d.ts +5155 -4470
  228. package/dist/state/diagram-machine.js +407 -337
  229. package/dist/state/hotkeyActor.js +5 -5
  230. package/dist/state/inspector.d.ts +1 -1
  231. package/dist/state/persistence.js +4 -4
  232. package/dist/state/syncManualLayoutActor.d.ts +1 -1
  233. package/dist/state/syncManualLayoutActor.js +10 -10
  234. package/dist/state/utils.js +4 -9
  235. package/dist/styles.css.js +3 -0
  236. package/dist/utils/vector.js +2 -4
  237. package/dist/utils/xyflow.js +7 -12
  238. package/package.json +43 -42
  239. package/src/LikeC4CustomColors.tsx +44 -20
  240. package/src/LikeC4Diagram.props.ts +32 -0
  241. package/src/LikeC4Diagram.tsx +16 -14
  242. package/src/base/BaseXYFlow.tsx +67 -43
  243. package/src/base/primitives/compound/CompoundActionButton.tsx +41 -20
  244. package/src/base/primitives/compound/CompoundDetailsButton.tsx +48 -25
  245. package/src/base/primitives/compound/CompoundNodeContainer.css.ts +111 -111
  246. package/src/base/primitives/compound/CompoundNodeContainer.tsx +92 -92
  247. package/src/base/primitives/compound/CompoundTitle.tsx +73 -7
  248. package/src/base/primitives/compound/actionbtns.css.ts +30 -0
  249. package/src/base/primitives/customEdge.ts +2 -3
  250. package/src/base/primitives/edge/EdgeActionButton.tsx +3 -5
  251. package/src/base/primitives/edge/EdgeContainer.tsx +17 -9
  252. package/src/base/primitives/edge/EdgeLabel.css.ts +113 -177
  253. package/src/base/primitives/edge/EdgeLabel.tsx +43 -114
  254. package/src/base/primitives/edge/EdgeLabelContainer.tsx +118 -0
  255. package/src/base/primitives/edge/EdgePath.tsx +31 -37
  256. package/src/base/primitives/edge/edge.css.ts +105 -132
  257. package/src/base/primitives/edge/xyvars.ts +31 -0
  258. package/src/base/primitives/element/ElementActionButtons.tsx +30 -10
  259. package/src/base/primitives/element/ElementDetailsButton.tsx +27 -8
  260. package/src/base/primitives/element/ElementNodeContainer.css.ts +43 -70
  261. package/src/base/primitives/element/ElementNodeContainer.tsx +18 -8
  262. package/src/base/primitives/element/ElementShape.css.ts +80 -113
  263. package/src/base/primitives/element/ElementShape.tsx +0 -1
  264. package/src/base/primitives/element/ElementTitle.css.ts +168 -124
  265. package/src/base/primitives/element/ElementTitle.tsx +16 -16
  266. package/src/base/primitives/index.ts +1 -0
  267. package/src/base/types.ts +5 -0
  268. package/src/bundle/LikeC4ModelProvider.tsx +12 -0
  269. package/src/bundle/LikeC4View.props.ts +249 -0
  270. package/src/bundle/LikeC4View.tsx +196 -0
  271. package/src/bundle/ReactLikeC4.tsx +148 -0
  272. package/src/bundle/ShadowRoot.tsx +60 -0
  273. package/src/bundle/ViewNotFound.tsx +25 -0
  274. package/src/bundle/font.css +251 -0
  275. package/src/bundle/index.ts +7 -0
  276. package/src/bundle/react-dom-server-mock.ts +3 -0
  277. package/src/bundle/styles.css.ts +168 -0
  278. package/src/components/Link.tsx +56 -5
  279. package/src/components/SearchControl.css.ts +52 -59
  280. package/src/components/SearchControl.tsx +2 -5
  281. package/src/context/ReduceGraphics.tsx +9 -47
  282. package/src/context/RootContainer.tsx +21 -5
  283. package/src/hooks/safeContext.tsx +2 -3
  284. package/src/hooks/useCurrentViewId.ts +4 -4
  285. package/src/hooks/useDiagram.ts +4 -3
  286. package/src/hooks/useOverlaysActor.ts +11 -0
  287. package/src/hooks/useReducedGraphics.ts +8 -1
  288. package/src/hooks/useXYFlow.ts +2 -2
  289. package/src/index.ts +1 -3
  290. package/src/likec4diagram/DiagramUI.tsx +2 -2
  291. package/src/likec4diagram/DiagramXYFlow.tsx +80 -26
  292. package/src/likec4diagram/custom/edges/NotePopover.css.ts +7 -13
  293. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +69 -42
  294. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.css.ts +23 -44
  295. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +26 -24
  296. package/src/likec4diagram/custom/edges/edges.css.ts +25 -32
  297. package/src/likec4diagram/custom/nodes/nodeTypes.tsx +2 -2
  298. package/src/likec4diagram/custom/nodes/toolbar/Toolbar.tsx +9 -5
  299. package/src/likec4diagram/custom/nodes/toolbar/styles.css.ts +3 -4
  300. package/src/likec4diagram/ui/controls/LayoutDriftNotification.tsx +2 -2
  301. package/src/likec4diagram/ui/controls/styles.css.ts +46 -57
  302. package/src/likec4diagram/ui/diagram-title/DiagramTitlePanel.css.ts +38 -34
  303. package/src/likec4diagram/ui/diagram-title/DiagramTitlePanel.tsx +4 -4
  304. package/src/likec4diagram/ui/notation/NotationPanel.css.ts +44 -56
  305. package/src/likec4diagram/ui/notation/NotationPanel.tsx +17 -14
  306. package/src/likec4diagram/ui/search/ElementsColumn.css.ts +80 -85
  307. package/src/likec4diagram/ui/search/ElementsColumn.tsx +21 -14
  308. package/src/likec4diagram/ui/search/LikeC4Search.css.ts +50 -67
  309. package/src/likec4diagram/ui/search/LikeC4Search.tsx +1 -2
  310. package/src/likec4diagram/ui/search/SearchInput.tsx +2 -2
  311. package/src/likec4diagram/ui/search/ViewsColum.tsx +10 -7
  312. package/src/likec4diagram/ui/search/ViewsColumn.css.ts +29 -28
  313. package/src/likec4diagram/ui/search/_shared.css.ts +158 -74
  314. package/src/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.css.ts +31 -34
  315. package/src/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.tsx +6 -6
  316. package/src/likec4diagram/useViewToNodesEdges.ts +2 -1
  317. package/src/overlays/Overlays.tsx +6 -4
  318. package/src/overlays/element-details/ElementDetailsCard.css.ts +143 -177
  319. package/src/overlays/element-details/ElementDetailsCard.tsx +29 -29
  320. package/src/overlays/element-details/TabPanelDeployments.css.ts +49 -54
  321. package/src/overlays/element-details/TabPanelRelationships.css.ts +62 -66
  322. package/src/overlays/element-details/TabPanelRelationships.tsx +32 -3
  323. package/src/overlays/element-details/TabPanelStructure.css.ts +26 -26
  324. package/src/overlays/element-details/actor.ts +4 -2
  325. package/src/overlays/overlay/Overlay.css.ts +34 -46
  326. package/src/overlays/overlay/Overlay.tsx +95 -97
  327. package/src/overlays/overlaysActor.ts +1 -0
  328. package/src/overlays/relationship-details/RelationshipDetails.tsx +15 -3
  329. package/src/overlays/relationship-details/SelectEdge.css.ts +52 -71
  330. package/src/overlays/relationship-details/SelectEdge.tsx +1 -2
  331. package/src/overlays/relationship-details/custom/edgeTypes.tsx +35 -30
  332. package/src/overlays/relationship-details/custom/index.ts +2 -0
  333. package/src/overlays/relationship-details/custom/nodeTypes.tsx +20 -24
  334. package/src/overlays/relationship-details/custom/styles.css.ts +8 -8
  335. package/src/overlays/relationships-browser/-useRelationshipsView.ts +55 -82
  336. package/src/overlays/relationships-browser/RelationshipsBrowser.tsx +39 -36
  337. package/src/overlays/relationships-browser/SelectElement.css.ts +9 -12
  338. package/src/overlays/relationships-browser/SelectElement.tsx +192 -105
  339. package/src/overlays/relationships-browser/_types.ts +4 -9
  340. package/src/overlays/relationships-browser/actor.ts +144 -123
  341. package/src/overlays/relationships-browser/const.ts +1 -1
  342. package/src/overlays/relationships-browser/custom/EmptyNode.tsx +2 -2
  343. package/src/overlays/relationships-browser/custom/edgeTypes.tsx +95 -59
  344. package/src/overlays/relationships-browser/custom/index.ts +2 -0
  345. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +25 -26
  346. package/src/overlays/relationships-browser/custom/styles.css.ts +5 -6
  347. package/src/overlays/relationships-browser/hooks.ts +17 -3
  348. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +4 -10
  349. package/src/state/DiagramActorProvider.tsx +17 -16
  350. package/src/state/diagram-machine.ts +395 -315
  351. package/src/state/inspector.ts +1 -1
  352. package/src/styles.css +3 -0
  353. package/dist/LikeC4Diagram.css.d.ts +0 -8
  354. package/dist/LikeC4Diagram.css.js +0 -11
  355. package/dist/base/example/RelationshipsBrowser.d.ts +0 -6
  356. package/dist/base/example/_types.d.ts +0 -20
  357. package/dist/base/example/custom.d.ts +0 -72
  358. package/dist/base/example/useViewToNodesEdges.d.ts +0 -6
  359. package/dist/base/primitives/compound/CompoundActionButton.css.d.ts +0 -2
  360. package/dist/base/primitives/compound/CompoundActionButton.css.js +0 -8
  361. package/dist/base/primitives/compound/CompoundDetailsButton.css.d.ts +0 -3
  362. package/dist/base/primitives/compound/CompoundDetailsButton.css.js +0 -8
  363. package/dist/base/primitives/compound/CompoundTitle.css.d.ts +0 -3
  364. package/dist/base/primitives/compound/CompoundTitle.css.js +0 -10
  365. package/dist/base/primitives/element/ElementActionButtons.css.d.ts +0 -3
  366. package/dist/base/primitives/element/ElementActionButtons.css.js +0 -10
  367. package/dist/base/primitives/element/ElementDetailsButton.css.d.ts +0 -3
  368. package/dist/base/primitives/element/ElementDetailsButton.css.js +0 -8
  369. package/dist/base/primitives/element/vars.css.d.ts +0 -3
  370. package/dist/base/primitives/element/vars.css.ts.vanilla.css.js +0 -1
  371. package/dist/components/Link.css.d.ts +0 -3
  372. package/dist/components/Link.css.js +0 -9
  373. package/dist/diagram.css +0 -1
  374. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Accordion/Accordion.module.css.mjs.vanilla.css.js +0 -1
  375. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/ActionIcon/ActionIcon.module.css.mjs.vanilla.css.js +0 -1
  376. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Affix/Affix.module.css.mjs.vanilla.css.js +0 -1
  377. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Alert/Alert.module.css.mjs.vanilla.css.js +0 -1
  378. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Anchor/Anchor.module.css.mjs.vanilla.css.js +0 -1
  379. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/AngleSlider/AngleSlider.module.css.mjs.vanilla.css.js +0 -1
  380. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/AppShell/AppShell.module.css.mjs.vanilla.css.js +0 -1
  381. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/AspectRatio/AspectRatio.module.css.mjs.vanilla.css.js +0 -1
  382. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Avatar/Avatar.module.css.mjs.vanilla.css.js +0 -1
  383. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/BackgroundImage/BackgroundImage.module.css.mjs.vanilla.css.js +0 -1
  384. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Badge/Badge.module.css.mjs.vanilla.css.js +0 -1
  385. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Blockquote/Blockquote.module.css.mjs.vanilla.css.js +0 -1
  386. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Breadcrumbs/Breadcrumbs.module.css.mjs.vanilla.css.js +0 -1
  387. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Burger/Burger.module.css.mjs.vanilla.css.js +0 -1
  388. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Button/Button.module.css.mjs.vanilla.css.js +0 -1
  389. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Card/Card.module.css.mjs.vanilla.css.js +0 -1
  390. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Center/Center.module.css.mjs.vanilla.css.js +0 -1
  391. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Checkbox/Checkbox.module.css.mjs.vanilla.css.js +0 -1
  392. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Checkbox/CheckboxCard/CheckboxCard.module.css.mjs.vanilla.css.js +0 -1
  393. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Checkbox/CheckboxIndicator/CheckboxIndicator.module.css.mjs.vanilla.css.js +0 -1
  394. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Chip/Chip.module.css.mjs.vanilla.css.js +0 -1
  395. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/CloseButton/CloseButton.module.css.mjs.vanilla.css.js +0 -1
  396. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Code/Code.module.css.mjs.vanilla.css.js +0 -1
  397. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/ColorInput/ColorInput.module.css.mjs.vanilla.css.js +0 -1
  398. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/ColorPicker/ColorPicker.module.css.mjs.vanilla.css.js +0 -1
  399. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/ColorSwatch/ColorSwatch.module.css.mjs.vanilla.css.js +0 -1
  400. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Combobox/Combobox.module.css.mjs.vanilla.css.js +0 -1
  401. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Container/Container.module.css.mjs.vanilla.css.js +0 -1
  402. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Dialog/Dialog.module.css.mjs.vanilla.css.js +0 -1
  403. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Divider/Divider.module.css.mjs.vanilla.css.js +0 -1
  404. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Drawer/Drawer.module.css.mjs.vanilla.css.js +0 -1
  405. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Fieldset/Fieldset.module.css.mjs.vanilla.css.js +0 -1
  406. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Flex/Flex.module.css.mjs.vanilla.css.js +0 -1
  407. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/FloatingIndicator/FloatingIndicator.module.css.mjs.vanilla.css.js +0 -1
  408. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Grid/Grid.module.css.mjs.vanilla.css.js +0 -1
  409. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Group/Group.module.css.mjs.vanilla.css.js +0 -1
  410. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Image/Image.module.css.mjs.vanilla.css.js +0 -1
  411. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Indicator/Indicator.module.css.mjs.vanilla.css.js +0 -1
  412. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/InlineInput/InlineInput.module.css.mjs.vanilla.css.js +0 -1
  413. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Input/Input.module.css.mjs.vanilla.css.js +0 -1
  414. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Kbd/Kbd.module.css.mjs.vanilla.css.js +0 -1
  415. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/List/List.module.css.mjs.vanilla.css.js +0 -1
  416. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Loader/Loader.module.css.mjs.vanilla.css.js +0 -1
  417. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/LoadingOverlay/LoadingOverlay.module.css.mjs.vanilla.css.js +0 -1
  418. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Mark/Mark.module.css.mjs.vanilla.css.js +0 -1
  419. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Menu/Menu.module.css.mjs.vanilla.css.js +0 -1
  420. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Modal/Modal.module.css.mjs.vanilla.css.js +0 -1
  421. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/ModalBase/ModalBase.module.css.mjs.vanilla.css.js +0 -1
  422. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/NavLink/NavLink.module.css.mjs.vanilla.css.js +0 -1
  423. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Notification/Notification.module.css.mjs.vanilla.css.js +0 -1
  424. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/NumberInput/NumberInput.module.css.mjs.vanilla.css.js +0 -1
  425. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Overlay/Overlay.module.css.mjs.vanilla.css.js +0 -1
  426. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Pagination/Pagination.module.css.mjs.vanilla.css.js +0 -1
  427. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Paper/Paper.module.css.mjs.vanilla.css.js +0 -1
  428. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/PasswordInput/PasswordInput.module.css.mjs.vanilla.css.js +0 -1
  429. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Pill/Pill.module.css.mjs.vanilla.css.js +0 -1
  430. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/PillsInput/PillsInput.module.css.mjs.vanilla.css.js +0 -1
  431. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/PinInput/PinInput.module.css.mjs.vanilla.css.js +0 -1
  432. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Popover/Popover.module.css.mjs.vanilla.css.js +0 -1
  433. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Progress/Progress.module.css.mjs.vanilla.css.js +0 -1
  434. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Radio/Radio.module.css.mjs.vanilla.css.js +0 -1
  435. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Radio/RadioCard/RadioCard.module.css.mjs.vanilla.css.js +0 -1
  436. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Radio/RadioIndicator/RadioIndicator.module.css.mjs.vanilla.css.js +0 -1
  437. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Rating/Rating.module.css.mjs.vanilla.css.js +0 -1
  438. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/RingProgress/RingProgress.module.css.mjs.vanilla.css.js +0 -1
  439. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/ScrollArea/ScrollArea.module.css.mjs.vanilla.css.js +0 -1
  440. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/SegmentedControl/SegmentedControl.module.css.mjs.vanilla.css.js +0 -1
  441. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/SemiCircleProgress/SemiCircleProgress.module.css.mjs.vanilla.css.js +0 -1
  442. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/SimpleGrid/SimpleGrid.module.css.mjs.vanilla.css.js +0 -1
  443. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Skeleton/Skeleton.module.css.mjs.vanilla.css.js +0 -1
  444. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Slider/Slider.module.css.mjs.vanilla.css.js +0 -1
  445. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Spoiler/Spoiler.module.css.mjs.vanilla.css.js +0 -1
  446. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Stack/Stack.module.css.mjs.vanilla.css.js +0 -1
  447. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Stepper/Stepper.module.css.mjs.vanilla.css.js +0 -1
  448. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Switch/Switch.module.css.mjs.vanilla.css.js +0 -1
  449. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Table/Table.module.css.mjs.vanilla.css.js +0 -1
  450. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/TableOfContents/TableOfContents.module.css.mjs.vanilla.css.js +0 -1
  451. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Tabs/Tabs.module.css.mjs.vanilla.css.js +0 -1
  452. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Text/Text.module.css.mjs.vanilla.css.js +0 -1
  453. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/ThemeIcon/ThemeIcon.module.css.mjs.vanilla.css.js +0 -1
  454. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Timeline/Timeline.module.css.mjs.vanilla.css.js +0 -1
  455. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Title/Title.module.css.mjs.vanilla.css.js +0 -1
  456. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Tooltip/Tooltip.module.css.mjs.vanilla.css.js +0 -1
  457. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/Tree/Tree.module.css.mjs.vanilla.css.js +0 -1
  458. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/TypographyStylesProvider/TypographyStylesProvider.module.css.mjs.vanilla.css.js +0 -1
  459. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/UnstyledButton/UnstyledButton.module.css.mjs.vanilla.css.js +0 -1
  460. package/dist/node_modules/.pnpm/@mantine_core@7.17.1_@mantine_hooks@7.17.1_react@19.0.0__@types_react@19.0.10_react-dom_fbfa2b80048a2180882527b4a447e1ea/node_modules/@mantine/core/esm/components/VisuallyHidden/VisuallyHidden.module.css.mjs.vanilla.css.js +0 -1
  461. package/dist/theme-vars.css.d.ts +0 -63
  462. package/dist/theme-vars.css.js +0 -7
  463. package/dist/theme-vars.css.ts.vanilla.css.js +0 -1
  464. package/dist/theme-vars.d.ts +0 -16
  465. package/dist/theme-vars.js +0 -7
  466. package/dist/utils/css.js +0 -10
  467. package/src/LikeC4Diagram.css.ts +0 -198
  468. package/src/base/example/RelationshipsBrowser.tsx +0 -62
  469. package/src/base/example/_types.ts +0 -72
  470. package/src/base/example/custom.tsx +0 -58
  471. package/src/base/example/useViewToNodesEdges.ts +0 -194
  472. package/src/base/primitives/compound/CompoundActionButton.css.ts +0 -52
  473. package/src/base/primitives/compound/CompoundDetailsButton.css.ts +0 -58
  474. package/src/base/primitives/compound/CompoundTitle.css.ts +0 -65
  475. package/src/base/primitives/element/ElementActionButtons.css.ts +0 -52
  476. package/src/base/primitives/element/ElementDetailsButton.css.ts +0 -50
  477. package/src/base/primitives/element/vars.css.ts +0 -5
  478. package/src/components/Link.css.ts +0 -49
  479. package/src/overlays/relationship-details/custom/index.tsx +0 -2
  480. package/src/overlays/relationships-browser/custom/index.tsx +0 -2
  481. package/src/theme-vars.css.ts +0 -69
  482. package/src/theme-vars.ts +0 -25
@@ -42,6 +42,7 @@ import {
42
42
  stopChild,
43
43
  } from 'xstate'
44
44
  import { MinZoom } from '../base/const'
45
+ import { Base } from '../base/types'
45
46
  import { type EnabledFeatures, type FeatureName, AllDisabled } from '../context/DiagramFeatures'
46
47
  import type { OpenSourceParams } from '../LikeC4Diagram.props'
47
48
  import type { Types } from '../likec4diagram/types'
@@ -139,6 +140,10 @@ export type Events =
139
140
  | { type: 'xyflow.paneClick' }
140
141
  | { type: 'xyflow.paneDblClick' }
141
142
  | { type: 'xyflow.resized' }
143
+ | { type: 'xyflow.nodeMouseEnter'; node: Types.Node }
144
+ | { type: 'xyflow.nodeMouseLeave'; node: Types.Node }
145
+ | { type: 'xyflow.edgeMouseEnter'; edge: Types.Edge }
146
+ | { type: 'xyflow.edgeMouseLeave'; edge: Types.Edge }
142
147
  | { type: 'update.nodeData'; nodeId: NodeId; data: Partial<Types.NodeData> }
143
148
  | { type: 'update.edgeData'; edgeId: EdgeId; data: Partial<Types.Edge['data']> }
144
149
  | { type: 'update.view'; view: DiagramView; xynodes: Types.Node[]; xyedges: Types.Edge[] }
@@ -359,16 +364,19 @@ export const diagramMachine = setup({
359
364
  return
360
365
  }
361
366
  if (!enableOverlays && hasRunning) {
367
+ enqueue.sendTo(hasRunning, {
368
+ type: 'close.all',
369
+ })
362
370
  enqueue.stopChild('overlays')
363
371
  }
364
372
  }),
365
373
 
366
- 'closeAllOverlays': enqueueActions(({ system, enqueue }) => {
367
- const overlays = typedSystem(system).overlaysActorRef
368
- if (overlays) {
369
- enqueue.sendTo(overlays, { type: 'close.all' })
370
- }
371
- }),
374
+ 'closeAllOverlays': sendTo(
375
+ ({ system }) => typedSystem(system).overlaysActorRef!,
376
+ {
377
+ type: 'close.all',
378
+ },
379
+ ),
372
380
 
373
381
  'stopSyncLayout': enqueueActions(({ context, enqueue }) => {
374
382
  enqueue.sendTo(context.syncLayoutActorRef, { type: 'stop' })
@@ -377,6 +385,47 @@ export const diagramMachine = setup({
377
385
  syncLayoutActorRef: null as any,
378
386
  })
379
387
  }),
388
+
389
+ 'onNodeMouseEnter': assign(({ context }, params: { node: Types.Node }) => {
390
+ return {
391
+ xynodes: context.xynodes.map(n => {
392
+ if (n.id === params.node.id) {
393
+ return Base.setHovered(n, true)
394
+ }
395
+ return n
396
+ }),
397
+ }
398
+ }),
399
+ 'onNodeMouseLeave': assign(({ context }, params: { node: Types.Node }) => {
400
+ return {
401
+ xynodes: context.xynodes.map(n => {
402
+ if (n.id === params.node.id) {
403
+ return Base.setHovered(n, false)
404
+ }
405
+ return n
406
+ }),
407
+ }
408
+ }),
409
+ 'onEdgeMouseEnter': assign(({ context }, params: { edge: Types.Edge }) => {
410
+ return {
411
+ xyedges: context.xyedges.map(e => {
412
+ if (e.id === params.edge.id) {
413
+ return Base.setHovered(e, true)
414
+ }
415
+ return e
416
+ }),
417
+ }
418
+ }),
419
+ 'onEdgeMouseLeave': assign(({ context }, params: { edge: Types.Edge }) => {
420
+ return {
421
+ xyedges: context.xyedges.map(e => {
422
+ if (e.id === params.edge.id) {
423
+ return Base.setHovered(e, false)
424
+ }
425
+ return e
426
+ }),
427
+ }
428
+ }),
380
429
  },
381
430
  }).createMachine({
382
431
  initial: 'initializing',
@@ -410,72 +459,175 @@ export const diagramMachine = setup({
410
459
  initializing: {
411
460
  on: {
412
461
  'xyflow.init': {
413
- actions: enqueueActions(({ enqueue, check }) => {
414
- enqueue.assign({
462
+ actions: [
463
+ assign(({ context, event }) => ({
415
464
  initialized: true,
416
- xyflow: ({ event }) => event.instance,
417
- navigationHistory: ({ context, event }) => ({
465
+ xyflow: event.instance,
466
+ navigationHistory: {
418
467
  currentIndex: 0,
419
468
  history: [{
420
469
  viewId: context.view.id,
421
470
  fromNode: null,
422
471
  viewport: { ...event.instance.getViewport() },
423
472
  }],
424
- }),
425
- })
426
- if (check('enabled: FitView')) {
427
- enqueue({
428
- type: 'xyflow:fitDiagram',
429
- params: { duration: 0 },
430
- })
431
- }
432
- }),
433
- target: 'idle',
473
+ },
474
+ })),
475
+ enqueueActions(({ enqueue, check }) => {
476
+ if (check('enabled: FitView')) {
477
+ enqueue({
478
+ type: 'xyflow:fitDiagram',
479
+ params: { duration: 0 },
480
+ })
481
+ }
482
+ }),
483
+ ],
484
+ target: 'ready',
434
485
  },
435
486
  },
436
487
  },
437
- idle: {
438
- id: 'idle',
488
+ ready: {
489
+ initial: 'idle',
439
490
  on: {
440
- 'xyflow.nodeClick': [
441
- {
442
- // TODO: xstate fails to infer the type of the guard
443
- guard: and([
444
- 'enabled: FocusMode',
445
- 'click: node has connections',
446
- or([
447
- 'click: same node',
448
- 'click: selected node',
449
- ]),
450
- ]) as any,
451
- actions: [
452
- assign({
453
- lastClickedNode,
454
- focusedNode: ({ event }) => event.node.id as NodeId,
455
- }),
456
- ],
457
- target: 'focused',
458
- },
459
- {
460
- actions: [
461
- 'assign lastClickedNode',
462
- 'open source of focused or last clicked node',
463
- ],
464
- },
465
- ],
466
- 'xyflow.paneClick': {
467
- actions: [
468
- assign({
469
- lastClickedNode: null,
491
+ 'navigate.to': {
492
+ guard: 'is another view',
493
+ actions: assign({
494
+ lastOnNavigate: ({ context, event }) => ({
495
+ fromView: context.view.id,
496
+ toView: event.viewId,
497
+ fromNode: event.fromNode ?? null,
470
498
  }),
499
+ }),
500
+ target: '#navigating',
501
+ },
502
+ 'navigate.back': {
503
+ guard: ({ context }: ActionArg) => context.navigationHistory.currentIndex > 0,
504
+ actions: assign(navigateBack),
505
+ target: '#navigating',
506
+ },
507
+ 'navigate.forward': {
508
+ guard: ({ context }: ActionArg) =>
509
+ context.navigationHistory.currentIndex < context.navigationHistory.history.length - 1,
510
+ actions: assign(navigateForward),
511
+ target: '#navigating',
512
+ },
513
+ 'layout.align': {
514
+ guard: 'not readonly',
515
+ actions: [
516
+ {
517
+ type: 'layout.align',
518
+ params: ({ event }) => ({ mode: event.mode }),
519
+ },
520
+ raise({ type: 'saveManualLayout.schedule' }),
471
521
  ],
472
522
  },
473
- 'xyflow.paneDblClick': {
523
+ 'layout.resetEdgeControlPoints': {
524
+ guard: 'not readonly',
474
525
  actions: [
475
- { type: 'xyflow:fitDiagram' },
476
- { type: 'trigger:OpenSource', params: ({ context }) => ({ view: context.view.id }) },
526
+ assign(resetEdgeControlPoints),
527
+ raise({ type: 'saveManualLayout.schedule' }),
477
528
  ],
478
529
  },
530
+ 'xyflow.resized': {
531
+ guard: ({ context }: { context: Context }) =>
532
+ context.features.enableFitView && !context.viewportChangedManually,
533
+ actions: [
534
+ cancel('fitDiagram'),
535
+ raise({ type: 'fitDiagram' }, { id: 'fitDiagram', delay: 200 }),
536
+ ],
537
+ },
538
+ 'open.elementDetails': {
539
+ actions: sendTo(({ system }) => typedSystem(system).overlaysActorRef!, ({ context, event }) => {
540
+ let initiatedFrom = null as null | {
541
+ node: NodeId
542
+ clientRect: Rect
543
+ }
544
+ const fromNodeId = event.fromNode ?? context.view.nodes.find(n => DiagramNode.modelRef(n) === event.fqn)?.id
545
+ const internalNode = fromNodeId ? context.xystore.getState().nodeLookup.get(fromNodeId) : null
546
+ if (fromNodeId && internalNode) {
547
+ const nodeRect = nodeToRect(internalNode)
548
+ const zoom = context.xyflow!.getZoom()
549
+
550
+ const clientRect = {
551
+ ...context.xyflow!.flowToScreenPosition(nodeRect),
552
+ width: nodeRect.width * zoom,
553
+ height: nodeRect.height * zoom,
554
+ }
555
+ initiatedFrom = {
556
+ node: fromNodeId,
557
+ clientRect,
558
+ }
559
+ }
560
+ return ({
561
+ type: 'open.elementDetails' as const,
562
+ subject: event.fqn,
563
+ currentView: context.view,
564
+ ...(initiatedFrom && { initiatedFrom }),
565
+ })
566
+ }),
567
+ },
568
+ 'open.relationshipsBrowser': {
569
+ actions: sendTo(({ system }) => typedSystem(system).overlaysActorRef!, ({ context, event }) => ({
570
+ type: 'open.relationshipsBrowser',
571
+ subject: event.fqn,
572
+ viewId: context.view.id,
573
+ scope: 'view' as const,
574
+ closeable: true,
575
+ enableChangeScope: true,
576
+ enableSelectSubject: true,
577
+ })),
578
+ },
579
+ 'open.relationshipDetails': {
580
+ actions: sendTo(({ system }) => typedSystem(system).overlaysActorRef!, ({ context, event }) => ({
581
+ type: 'open.relationshipDetails',
582
+ view: context.view,
583
+ edgeId: event.edgeId,
584
+ })),
585
+ },
586
+ 'open.source': {
587
+ actions: {
588
+ type: 'trigger:OpenSource',
589
+ params: prop('event'),
590
+ },
591
+ },
592
+ 'walkthrough.start': {
593
+ guard: 'is dynamic view',
594
+ target: '.walkthrough',
595
+ },
596
+ 'toggle.feature': {
597
+ actions: assign({
598
+ toggledFeatures: ({ context, event }) => {
599
+ return DiagramToggledFeaturesPersistence.write({
600
+ ...context.toggledFeatures,
601
+ [`enable${event.feature}`]: event.forceValue ??
602
+ !(context.toggledFeatures[`enable${event.feature}`] ?? context.features[`enable${event.feature}`]),
603
+ })
604
+ },
605
+ }),
606
+ },
607
+ 'xyflow.nodeMouseEnter': {
608
+ actions: {
609
+ type: 'onNodeMouseEnter',
610
+ params: prop('event'),
611
+ },
612
+ },
613
+ 'xyflow.nodeMouseLeave': {
614
+ actions: {
615
+ type: 'onNodeMouseLeave',
616
+ params: prop('event'),
617
+ },
618
+ },
619
+ 'xyflow.edgeMouseEnter': {
620
+ actions: {
621
+ type: 'onEdgeMouseEnter',
622
+ params: prop('event'),
623
+ },
624
+ },
625
+ 'xyflow.edgeMouseLeave': {
626
+ actions: {
627
+ type: 'onEdgeMouseLeave',
628
+ params: prop('event'),
629
+ },
630
+ },
479
631
  'saveManualLayout.*': {
480
632
  guard: 'not readonly',
481
633
  actions: sendTo((c) => c.context.syncLayoutActorRef, ({ event }) => {
@@ -488,91 +640,205 @@ export const diagramMachine = setup({
488
640
  nonexhaustive(event)
489
641
  }),
490
642
  },
491
- 'focus.node': {
492
- guard: 'enabled: FocusMode',
493
- actions: assign({
494
- focusedNode: ({ event }) => event.nodeId as NodeId,
495
- }),
496
- target: 'focused',
497
- },
498
643
  },
499
- },
500
- focused: {
501
- entry: [
502
- assign(s => ({
503
- ...focusNodesEdges(s),
504
- viewportBeforeFocus: { ...s.context.viewport },
505
- })),
506
- 'open source of focused or last clicked node',
507
- spawnChild('hotkeyActorLogic', { id: 'hotkey' }),
508
- 'xyflow:fitFocusedBounds',
644
+ exit: [
645
+ cancel('fitDiagram'),
509
646
  ],
510
- exit: enqueueActions(({ enqueue, context }) => {
511
- enqueue.stopChild('hotkey')
512
- if (context.viewportBeforeFocus) {
513
- enqueue({ type: 'xyflow:setViewport', params: { viewport: context.viewportBeforeFocus } })
514
- } else {
515
- enqueue({ type: 'xyflow:fitDiagram' })
516
- }
517
- enqueue.assign((s) => ({
518
- ...unfocusNodesEdges(s),
519
- viewportBeforeFocus: null,
520
- focusedNode: null,
521
- }))
522
- }),
523
- on: {
524
- 'xyflow.nodeClick': [
525
- {
526
- guard: 'click: focused node',
527
- target: '#idle',
528
- },
529
- {
530
- actions: [
531
- assign({
532
- lastClickedNode,
533
- }),
534
- raise(({ event }) => ({
535
- type: 'focus.node',
536
- nodeId: event.node.id as NodeId,
537
- })),
647
+ states: {
648
+ idle: {
649
+ id: 'idle',
650
+ on: {
651
+ 'xyflow.nodeClick': [
652
+ {
653
+ // TODO: xstate fails to infer the type of the guard
654
+ guard: and([
655
+ 'enabled: FocusMode',
656
+ 'click: node has connections',
657
+ or([
658
+ 'click: same node',
659
+ 'click: selected node',
660
+ ]),
661
+ ]) as any,
662
+ actions: [
663
+ assign({
664
+ lastClickedNode,
665
+ focusedNode: ({ event }) => event.node.id as NodeId,
666
+ }),
667
+ ],
668
+ target: 'focused',
669
+ },
670
+ {
671
+ actions: [
672
+ 'assign lastClickedNode',
673
+ 'open source of focused or last clicked node',
674
+ ],
675
+ },
538
676
  ],
677
+ 'xyflow.paneClick': {
678
+ actions: [
679
+ assign({
680
+ lastClickedNode: null,
681
+ }),
682
+ ],
683
+ },
684
+ 'xyflow.paneDblClick': {
685
+ actions: [
686
+ { type: 'xyflow:fitDiagram' },
687
+ { type: 'trigger:OpenSource', params: ({ context }) => ({ view: context.view.id }) },
688
+ ],
689
+ },
690
+ 'focus.node': {
691
+ guard: 'enabled: FocusMode',
692
+ actions: assign({
693
+ focusedNode: ({ event }) => event.nodeId as NodeId,
694
+ }),
695
+ target: 'focused',
696
+ },
539
697
  },
540
- ],
541
- 'focus.node': {
542
- actions: [
543
- assign({
544
- focusedNode: ({ event }) => event.nodeId,
545
- }),
546
- assign(focusNodesEdges),
698
+ },
699
+ focused: {
700
+ entry: [
701
+ assign(s => ({
702
+ ...focusNodesEdges(s),
703
+ viewportBeforeFocus: { ...s.context.viewport },
704
+ })),
547
705
  'open source of focused or last clicked node',
706
+ spawnChild('hotkeyActorLogic', { id: 'hotkey' }),
548
707
  'xyflow:fitFocusedBounds',
549
708
  ],
550
- },
551
- 'key.esc': {
552
- target: 'idle',
553
- },
554
- 'xyflow.paneClick': {
555
- actions: assign({
556
- lastClickedNode: null,
709
+ exit: enqueueActions(({ enqueue, context }) => {
710
+ enqueue.stopChild('hotkey')
711
+ if (context.viewportBeforeFocus) {
712
+ enqueue({ type: 'xyflow:setViewport', params: { viewport: context.viewportBeforeFocus } })
713
+ } else {
714
+ enqueue({ type: 'xyflow:fitDiagram' })
715
+ }
716
+ enqueue.assign((s) => ({
717
+ ...unfocusNodesEdges(s),
718
+ viewportBeforeFocus: null,
719
+ focusedNode: null,
720
+ }))
557
721
  }),
558
- target: 'idle',
722
+ on: {
723
+ 'xyflow.nodeClick': [
724
+ {
725
+ guard: 'click: focused node',
726
+ target: '#idle',
727
+ },
728
+ {
729
+ actions: [
730
+ assign({
731
+ lastClickedNode,
732
+ }),
733
+ raise(({ event }) => ({
734
+ type: 'focus.node',
735
+ nodeId: event.node.id as NodeId,
736
+ })),
737
+ ],
738
+ },
739
+ ],
740
+ 'focus.node': {
741
+ actions: [
742
+ assign({
743
+ focusedNode: ({ event }) => event.nodeId,
744
+ }),
745
+ assign(focusNodesEdges),
746
+ 'open source of focused or last clicked node',
747
+ 'xyflow:fitFocusedBounds',
748
+ ],
749
+ },
750
+ 'key.esc': {
751
+ target: 'idle',
752
+ },
753
+ 'xyflow.paneClick': {
754
+ actions: assign({
755
+ lastClickedNode: null,
756
+ }),
757
+ target: 'idle',
758
+ },
759
+ },
559
760
  },
560
- 'saveManualLayout.*': {
561
- guard: 'not readonly',
562
- actions: sendTo(c => c.context.syncLayoutActorRef, ({ event }) => {
563
- if (event.type === 'saveManualLayout.schedule') {
564
- return { type: 'sync' }
565
- }
566
- if (event.type === 'saveManualLayout.cancel') {
567
- return { type: 'cancel' }
761
+ walkthrough: {
762
+ entry: [
763
+ spawnChild('hotkeyActorLogic', { id: 'hotkey' }),
764
+ assign({
765
+ viewportBeforeFocus: ({ context }) => context.viewport,
766
+ activeWalkthrough: ({ context, event }) => {
767
+ assertEvent(event, 'walkthrough.start')
768
+ const stepId = event.stepId ?? first(context.xyedges)!.id as StepEdgeId
769
+ return {
770
+ stepId,
771
+ parallelPrefix: getParallelStepsPrefix(stepId),
772
+ }
773
+ },
774
+ }),
775
+ assign(updateActiveWalkthrough),
776
+ 'xyflow:fitFocusedBounds',
777
+ ],
778
+ on: {
779
+ 'key.esc': {
780
+ target: 'idle',
781
+ },
782
+ 'key.arrow.left': {
783
+ actions: raise({ type: 'walkthrough.step', direction: 'previous' }),
784
+ },
785
+ 'key.arrow.right': {
786
+ actions: raise({ type: 'walkthrough.step', direction: 'next' }),
787
+ },
788
+ 'walkthrough.step': {
789
+ actions: enqueueActions(({ enqueue, context, event }) => {
790
+ const { stepId } = context.activeWalkthrough!
791
+ const stepIndex = context.xyedges.findIndex(e => e.id === stepId)
792
+ const nextStepIndex = clamp(event.direction === 'next' ? stepIndex + 1 : stepIndex - 1, {
793
+ min: 0,
794
+ max: context.xyedges.length - 1,
795
+ })
796
+ if (nextStepIndex === stepIndex) {
797
+ return
798
+ }
799
+ const nextStepId = context.xyedges[nextStepIndex]!.id as StepEdgeId
800
+ enqueue.assign({
801
+ activeWalkthrough: {
802
+ stepId: nextStepId,
803
+ parallelPrefix: getParallelStepsPrefix(nextStepId),
804
+ },
805
+ })
806
+ enqueue.assign(updateActiveWalkthrough)
807
+ enqueue('xyflow:fitFocusedBounds')
808
+ }),
809
+ },
810
+ 'walkthrough.end': {
811
+ target: 'idle',
812
+ },
813
+ 'xyflow.paneDblClick': {
814
+ target: 'idle',
815
+ },
816
+ // We received another view, close overlay and process event again
817
+ 'update.view': {
818
+ guard: 'is another view',
819
+ actions: raise(({ event }) => event, { delay: 50 }),
820
+ target: 'idle',
821
+ },
822
+ },
823
+ exit: enqueueActions(({ enqueue, context, event }) => {
824
+ enqueue.stopChild('hotkey')
825
+ if (context.viewportBeforeFocus) {
826
+ enqueue({ type: 'xyflow:setViewport', params: { viewport: context.viewportBeforeFocus } })
827
+ } else {
828
+ enqueue({ type: 'xyflow:fitDiagram' })
568
829
  }
569
- nonexhaustive(event)
830
+ enqueue.assign({
831
+ activeWalkthrough: null,
832
+ ...unfocusNodesEdges({ context, event }),
833
+ viewportBeforeFocus: null,
834
+ })
570
835
  }),
571
836
  },
572
837
  },
573
838
  },
574
839
  // Navigating to another view (after `navigateTo` event)
575
840
  navigating: {
841
+ id: 'navigating',
576
842
  entry: [
577
843
  'closeAllOverlays',
578
844
  'stopSyncLayout',
@@ -625,82 +891,6 @@ export const diagramMachine = setup({
625
891
  },
626
892
  },
627
893
  },
628
- walkthrough: {
629
- entry: [
630
- spawnChild('hotkeyActorLogic', { id: 'hotkey' }),
631
- assign({
632
- viewportBeforeFocus: ({ context }) => context.viewport,
633
- activeWalkthrough: ({ context, event }) => {
634
- assertEvent(event, 'walkthrough.start')
635
- const stepId = event.stepId ?? first(context.xyedges)!.id as StepEdgeId
636
- return {
637
- stepId,
638
- parallelPrefix: getParallelStepsPrefix(stepId),
639
- }
640
- },
641
- }),
642
- assign(updateActiveWalkthrough),
643
- 'xyflow:fitFocusedBounds',
644
- ],
645
- on: {
646
- 'key.esc': {
647
- target: 'idle',
648
- },
649
- 'key.arrow.left': {
650
- actions: raise({ type: 'walkthrough.step', direction: 'previous' }),
651
- },
652
- 'key.arrow.right': {
653
- actions: raise({ type: 'walkthrough.step', direction: 'next' }),
654
- },
655
- 'walkthrough.step': {
656
- actions: enqueueActions(({ enqueue, context, event }) => {
657
- const { stepId } = context.activeWalkthrough!
658
- const stepIndex = context.xyedges.findIndex(e => e.id === stepId)
659
- const nextStepIndex = clamp(event.direction === 'next' ? stepIndex + 1 : stepIndex - 1, {
660
- min: 0,
661
- max: context.xyedges.length - 1,
662
- })
663
- if (nextStepIndex === stepIndex) {
664
- return
665
- }
666
- const nextStepId = context.xyedges[nextStepIndex]!.id as StepEdgeId
667
- enqueue.assign({
668
- activeWalkthrough: {
669
- stepId: nextStepId,
670
- parallelPrefix: getParallelStepsPrefix(nextStepId),
671
- },
672
- })
673
- enqueue.assign(updateActiveWalkthrough)
674
- enqueue('xyflow:fitFocusedBounds')
675
- }),
676
- },
677
- 'walkthrough.end': {
678
- target: 'idle',
679
- },
680
- 'xyflow.paneDblClick': {
681
- target: 'idle',
682
- },
683
- // We received another view, close overlay and process event again
684
- 'update.view': {
685
- guard: 'is another view',
686
- actions: raise(({ event }) => event, { delay: 50 }),
687
- target: 'idle',
688
- },
689
- },
690
- exit: enqueueActions(({ enqueue, context, event }) => {
691
- enqueue.stopChild('hotkey')
692
- if (context.viewportBeforeFocus) {
693
- enqueue({ type: 'xyflow:setViewport', params: { viewport: context.viewportBeforeFocus } })
694
- } else {
695
- enqueue({ type: 'xyflow:fitDiagram' })
696
- }
697
- enqueue.assign({
698
- activeWalkthrough: null,
699
- ...unfocusNodesEdges({ context, event }),
700
- viewportBeforeFocus: null,
701
- })
702
- }),
703
- },
704
894
  },
705
895
  on: {
706
896
  'xyflow.applyNodeChanges': {
@@ -726,27 +916,11 @@ export const diagramMachine = setup({
726
916
  params: prop('event'),
727
917
  },
728
918
  },
729
- 'navigate.to': {
730
- guard: 'is another view',
731
- actions: assign({
732
- lastOnNavigate: ({ context, event }) => ({
733
- fromView: context.view.id,
734
- toView: event.viewId,
735
- fromNode: event.fromNode ?? null,
736
- }),
737
- }),
738
- target: '.navigating',
739
- },
740
- 'navigate.back': {
741
- guard: ({ context }: ActionArg) => context.navigationHistory.currentIndex > 0,
742
- actions: assign(navigateBack),
743
- target: '.navigating',
919
+ 'update.nodeData': {
920
+ actions: assign(updateNodeData),
744
921
  },
745
- 'navigate.forward': {
746
- guard: ({ context }: ActionArg) =>
747
- context.navigationHistory.currentIndex < context.navigationHistory.history.length - 1,
748
- actions: assign(navigateForward),
749
- target: '.navigating',
922
+ 'update.edgeData': {
923
+ actions: assign(updateEdgeData),
750
924
  },
751
925
  'update.view': {
752
926
  actions: [
@@ -805,104 +979,10 @@ export const diagramMachine = setup({
805
979
  'update.features': {
806
980
  actions: 'updateFeatures',
807
981
  },
808
- 'update.nodeData': {
809
- actions: assign(updateNodeData),
810
- },
811
- 'update.edgeData': {
812
- actions: assign(updateEdgeData),
813
- },
814
- 'layout.align': {
815
- guard: 'not readonly',
816
- actions: [
817
- {
818
- type: 'layout.align',
819
- params: ({ event }) => ({ mode: event.mode }),
820
- },
821
- raise({ type: 'saveManualLayout.schedule' }),
822
- ],
823
- },
824
- 'layout.resetEdgeControlPoints': {
825
- guard: 'not readonly',
826
- actions: [
827
- assign(resetEdgeControlPoints),
828
- raise({ type: 'saveManualLayout.schedule' }),
829
- ],
830
- },
831
- 'xyflow.resized': {
832
- guard: ({ context }: { context: Context }) => context.features.enableFitView && !context.viewportChangedManually,
833
- actions: [
834
- cancel('fitDiagram'),
835
- raise({ type: 'fitDiagram' }, { id: 'fitDiagram', delay: 200 }),
836
- ],
837
- },
838
- 'open.elementDetails': {
839
- actions: sendTo(({ system }) => typedSystem(system).overlaysActorRef!, ({ context, event }) => {
840
- let initiatedFrom = null as null | {
841
- node: NodeId
842
- clientRect: Rect
843
- }
844
- const fromNodeId = event.fromNode ?? context.view.nodes.find(n => DiagramNode.modelRef(n) === event.fqn)?.id
845
- const internalNode = fromNodeId ? context.xystore.getState().nodeLookup.get(fromNodeId) : null
846
- if (fromNodeId && internalNode) {
847
- const nodeRect = nodeToRect(internalNode)
848
- const zoom = context.xyflow!.getZoom()
849
-
850
- const clientRect = {
851
- ...context.xyflow!.flowToScreenPosition(nodeRect),
852
- width: nodeRect.width * zoom,
853
- height: nodeRect.height * zoom,
854
- }
855
- initiatedFrom = {
856
- node: fromNodeId,
857
- clientRect,
858
- }
859
- }
860
- return ({
861
- type: 'open.elementDetails' as const,
862
- subject: event.fqn,
863
- currentView: context.view,
864
- ...(initiatedFrom && { initiatedFrom }),
865
- })
866
- }),
867
- },
868
- 'open.relationshipsBrowser': {
869
- actions: sendTo(({ system }) => typedSystem(system).overlaysActorRef!, ({ context, event }) => ({
870
- type: 'open.relationshipsBrowser',
871
- subject: event.fqn,
872
- scope: context.view,
873
- })),
874
- },
875
- 'open.relationshipDetails': {
876
- actions: sendTo(({ system }) => typedSystem(system).overlaysActorRef!, ({ context, event }) => ({
877
- type: 'open.relationshipDetails',
878
- view: context.view,
879
- edgeId: event.edgeId,
880
- })),
881
- },
882
- 'open.source': {
883
- actions: {
884
- type: 'trigger:OpenSource',
885
- params: prop('event'),
886
- },
887
- },
888
- 'walkthrough.start': {
889
- guard: 'is dynamic view',
890
- target: '.walkthrough',
891
- },
892
- 'toggle.feature': {
893
- actions: assign({
894
- toggledFeatures: ({ context, event }) => {
895
- return DiagramToggledFeaturesPersistence.write({
896
- ...context.toggledFeatures,
897
- [`enable${event.feature}`]: event.forceValue ??
898
- !(context.toggledFeatures[`enable${event.feature}`] ?? context.features[`enable${event.feature}`]),
899
- })
900
- },
901
- }),
902
- },
903
982
  },
904
983
  exit: [
905
984
  'stopSyncLayout',
985
+ cancel('fitDiagram'),
906
986
  stopChild('hotkey'),
907
987
  assign({
908
988
  xyflow: null,