@likec4/diagram 1.19.1 → 1.20.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 (582) hide show
  1. package/dist/LikeC4Diagram.css.d.ts +0 -1
  2. package/dist/LikeC4Diagram.css.js +1 -5
  3. package/dist/LikeC4Diagram.d.ts +1 -4
  4. package/dist/LikeC4Diagram.js +102 -147
  5. package/dist/LikeC4Diagram.props.d.ts +10 -16
  6. package/dist/LikeC4Search.js +7 -15
  7. package/dist/StaticLikeC4Diagram.d.ts +1 -1
  8. package/dist/base/Background.d.ts +7 -0
  9. package/dist/{xyflow/XYFlowBackground.js → base/Background.js} +5 -6
  10. package/dist/base/BaseXYFlow.d.ts +14 -0
  11. package/dist/base/BaseXYFlow.js +146 -0
  12. package/dist/base/example/RelationshipsBrowser.d.ts +6 -0
  13. package/dist/base/example/_types.d.ts +20 -0
  14. package/dist/base/example/custom.d.ts +71 -0
  15. package/dist/base/example/useViewToNodesEdges.d.ts +6 -0
  16. package/dist/base/index.d.ts +2 -0
  17. package/dist/base/primitives/NodeHandles.d.ts +4 -0
  18. package/dist/base/primitives/NodeHandles.js +14 -0
  19. package/dist/base/primitives/compound/CompoundActionButton.css.d.ts +3 -0
  20. package/dist/base/primitives/compound/CompoundActionButton.css.js +9 -0
  21. package/dist/base/primitives/compound/CompoundActionButton.d.ts +7 -0
  22. package/dist/base/primitives/compound/CompoundActionButton.js +48 -0
  23. package/dist/base/primitives/compound/CompoundDetailsButton.css.d.ts +3 -0
  24. package/dist/base/primitives/compound/CompoundDetailsButton.css.js +9 -0
  25. package/dist/base/primitives/compound/CompoundDetailsButton.d.ts +7 -0
  26. package/dist/base/primitives/compound/CompoundDetailsButton.js +50 -0
  27. package/dist/base/primitives/compound/CompoundNodeContainer.css.d.ts +9 -0
  28. package/dist/base/primitives/compound/CompoundNodeContainer.css.js +17 -0
  29. package/dist/base/primitives/compound/CompoundNodeContainer.d.ts +26 -0
  30. package/dist/base/primitives/compound/CompoundNodeContainer.js +86 -0
  31. package/dist/base/primitives/compound/CompoundTitle.css.d.ts +2 -0
  32. package/dist/base/primitives/compound/CompoundTitle.css.js +7 -0
  33. package/dist/base/primitives/compound/CompoundTitle.d.ts +6 -0
  34. package/dist/base/primitives/compound/CompoundTitle.js +20 -0
  35. package/dist/base/primitives/customEdge.d.ts +41 -0
  36. package/dist/base/primitives/customEdge.js +13 -0
  37. package/dist/base/primitives/customNode.d.ts +7 -0
  38. package/dist/base/primitives/customNode.js +10 -0
  39. package/dist/base/primitives/edge/EdgeActionButton.d.ts +7 -0
  40. package/dist/base/primitives/edge/EdgeActionButton.js +24 -0
  41. package/dist/base/primitives/edge/EdgeContainer.d.ts +10 -0
  42. package/dist/base/primitives/edge/EdgeContainer.js +35 -0
  43. package/dist/{xyflow/edges/edges.css.d.ts → base/primitives/edge/EdgeLabel.css.d.ts} +5 -9
  44. package/dist/base/primitives/edge/EdgeLabel.css.js +25 -0
  45. package/dist/base/primitives/edge/EdgeLabel.d.ts +51 -0
  46. package/dist/base/primitives/edge/EdgeLabel.js +90 -0
  47. package/dist/{xyflow → base/primitives/edge}/EdgeMarkers.d.ts +2 -0
  48. package/dist/{xyflow → base/primitives/edge}/EdgeMarkers.js +29 -1
  49. package/dist/base/primitives/edge/EdgePath.d.ts +44 -0
  50. package/dist/base/primitives/edge/EdgePath.js +77 -0
  51. package/dist/base/primitives/edge/edge.css.d.ts +6 -0
  52. package/dist/base/primitives/edge/edge.css.js +14 -0
  53. package/dist/base/primitives/element/ElementActionButtons.css.d.ts +3 -0
  54. package/dist/base/primitives/element/ElementActionButtons.css.js +9 -0
  55. package/dist/base/primitives/element/ElementActionButtons.d.ts +13 -0
  56. package/dist/base/primitives/element/ElementActionButtons.js +62 -0
  57. package/dist/base/primitives/element/ElementDetailsButton.css.d.ts +3 -0
  58. package/dist/base/primitives/element/ElementDetailsButton.css.js +9 -0
  59. package/dist/base/primitives/element/ElementDetailsButton.d.ts +7 -0
  60. package/dist/base/primitives/element/ElementDetailsButton.js +54 -0
  61. package/dist/base/primitives/element/ElementNodeContainer.css.d.ts +3 -0
  62. package/dist/base/primitives/element/ElementNodeContainer.css.js +7 -0
  63. package/dist/base/primitives/element/ElementNodeContainer.d.ts +26 -0
  64. package/dist/base/primitives/element/ElementNodeContainer.js +60 -0
  65. package/dist/base/primitives/element/ElementShape.css.d.ts +6 -0
  66. package/dist/base/primitives/element/ElementShape.css.js +14 -0
  67. package/dist/base/primitives/element/ElementShape.d.ts +28 -0
  68. package/dist/{xyflow/nodes/element/ElementShapeSvg.js → base/primitives/element/ElementShape.js} +23 -7
  69. package/dist/base/primitives/element/ElementTitle.css.d.ts +8 -0
  70. package/dist/base/primitives/element/ElementTitle.css.js +19 -0
  71. package/dist/base/primitives/element/ElementTitle.d.ts +10 -0
  72. package/dist/base/primitives/element/ElementTitle.js +66 -0
  73. package/dist/base/primitives/index.d.ts +17 -0
  74. package/dist/base/types.d.ts +90 -0
  75. package/dist/base/types.js +54 -0
  76. package/dist/base/updateEdges.d.ts +3 -0
  77. package/dist/base/updateEdges.js +31 -0
  78. package/dist/base/updateNodes.d.ts +3 -0
  79. package/dist/base/updateNodes.js +36 -0
  80. package/dist/base/xyflowMachine.d.ts +212 -0
  81. package/dist/context/DiagramEventHandlers.d.ts +10 -0
  82. package/dist/context/DiagramEventHandlers.js +49 -0
  83. package/dist/context/DiagramFeatures.d.ts +31 -0
  84. package/dist/context/DiagramFeatures.js +140 -0
  85. package/dist/{ui → context}/FramerMotionConfig.js +2 -4
  86. package/dist/context/IconRenderer.d.ts +11 -0
  87. package/dist/{xyflow/nodes/shared/ElementIcon.js → context/IconRenderer.js} +14 -14
  88. package/dist/context/RootContainer.d.ts +9 -0
  89. package/dist/context/RootContainer.js +20 -0
  90. package/dist/context/index.d.ts +7 -0
  91. package/dist/globals.css.js +0 -87
  92. package/dist/hooks/index.d.ts +7 -5
  93. package/dist/hooks/useCurrentViewId.d.ts +2 -0
  94. package/dist/hooks/useCurrentViewId.js +8 -0
  95. package/dist/hooks/useDiagram.d.ts +10725 -0
  96. package/dist/hooks/useDiagram.js +119 -0
  97. package/dist/hooks/useDiagramActor.d.ts +5 -0
  98. package/dist/hooks/useDiagramActor.js +21 -0
  99. package/dist/hooks/useDiagramContext.d.ts +3 -0
  100. package/dist/hooks/useDiagramContext.js +10 -0
  101. package/dist/hooks/useMantinePortalProps.js +2 -2
  102. package/dist/hooks/useXYFlow.d.ts +195 -37
  103. package/dist/hooks/useXYFlow.js +4 -6
  104. package/dist/index.d.ts +3 -2
  105. package/dist/index.js +5 -6
  106. package/dist/likec4diagram/DiagramActor.d.ts +7 -0
  107. package/dist/likec4diagram/DiagramActor.js +71 -0
  108. package/dist/likec4diagram/DiagramUI.d.ts +2 -0
  109. package/dist/likec4diagram/DiagramUI.js +22 -0
  110. package/dist/likec4diagram/XYFlow.d.ts +6 -0
  111. package/dist/likec4diagram/XYFlow.js +122 -0
  112. package/dist/likec4diagram/custom/edges/NotePopover.css.d.ts +2 -0
  113. package/dist/likec4diagram/custom/edges/NotePopover.css.js +7 -0
  114. package/dist/likec4diagram/custom/edges/NotePopover.d.ts +4 -0
  115. package/dist/likec4diagram/custom/edges/NotePopover.js +101 -0
  116. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +55 -0
  117. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +307 -0
  118. package/dist/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.css.js +4 -4
  119. package/dist/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.d.ts +5 -5
  120. package/dist/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.js +51 -53
  121. package/dist/likec4diagram/custom/edges/edges.css.d.ts +2 -0
  122. package/dist/likec4diagram/custom/edges/edges.css.js +7 -0
  123. package/dist/likec4diagram/custom/edges/utils.d.ts +22 -0
  124. package/dist/likec4diagram/custom/edges/utils.js +25 -0
  125. package/dist/likec4diagram/custom/index.d.ts +57 -0
  126. package/dist/likec4diagram/custom/index.js +7 -0
  127. package/dist/likec4diagram/custom/nodes/CompoundActions.d.ts +5 -0
  128. package/dist/likec4diagram/custom/nodes/CompoundActions.js +25 -0
  129. package/dist/likec4diagram/custom/nodes/ElementActions.d.ts +7 -0
  130. package/dist/likec4diagram/custom/nodes/ElementActions.js +69 -0
  131. package/dist/likec4diagram/custom/nodes/nodeTypes.d.ts +10 -0
  132. package/dist/likec4diagram/custom/nodes/nodeTypes.js +94 -0
  133. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.d.ts +21 -0
  134. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +159 -0
  135. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.d.ts +7 -0
  136. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +128 -0
  137. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.d.ts +7 -0
  138. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +149 -0
  139. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.d.ts +8 -0
  140. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +66 -0
  141. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +40 -0
  142. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +131 -0
  143. package/dist/likec4diagram/custom/nodes/toolbar/styles.css.d.ts +1 -0
  144. package/dist/likec4diagram/custom/nodes/toolbar/styles.css.js +5 -0
  145. package/dist/likec4diagram/state/actorContext.d.ts +50849 -0
  146. package/dist/likec4diagram/state/actorContext.js +12 -0
  147. package/dist/{state → likec4diagram/state}/aligners.d.ts +4 -1
  148. package/dist/{state → likec4diagram/state}/aligners.js +31 -5
  149. package/dist/likec4diagram/state/assign.d.ts +18 -0
  150. package/dist/likec4diagram/state/assign.js +343 -0
  151. package/dist/likec4diagram/state/hotkeyActor.d.ts +5 -0
  152. package/dist/likec4diagram/state/hotkeyActor.js +18 -0
  153. package/dist/likec4diagram/state/inspector.d.ts +5 -0
  154. package/dist/likec4diagram/state/machine.d.ts +10751 -0
  155. package/dist/likec4diagram/state/machine.js +783 -0
  156. package/dist/likec4diagram/state/syncManualLayoutActor.d.ts +113 -0
  157. package/dist/likec4diagram/state/syncManualLayoutActor.js +178 -0
  158. package/dist/likec4diagram/state/utils.d.ts +8 -0
  159. package/dist/likec4diagram/state/utils.js +48 -0
  160. package/dist/likec4diagram/types.d.ts +74 -0
  161. package/dist/{ui/top-left → likec4diagram/ui/controls}/ChangeAutoLayoutButton.js +11 -10
  162. package/dist/likec4diagram/ui/controls/Controls.d.ts +2 -0
  163. package/dist/likec4diagram/ui/controls/Controls.js +102 -0
  164. package/dist/likec4diagram/ui/controls/LayoutDriftNotification.d.ts +2 -0
  165. package/dist/likec4diagram/ui/controls/LayoutDriftNotification.js +43 -0
  166. package/dist/{ui/top-left → likec4diagram/ui/controls}/ManualLayoutToolsButton.js +11 -11
  167. package/dist/likec4diagram/ui/controls/NavigationButtons.d.ts +1 -0
  168. package/dist/likec4diagram/ui/controls/NavigationButtons.js +92 -0
  169. package/dist/{ui/top-left → likec4diagram/ui/controls}/_shared.js +2 -1
  170. package/dist/{ui/top-left → likec4diagram/ui/controls}/styles.css.d.ts +1 -1
  171. package/dist/likec4diagram/ui/controls/styles.css.js +17 -0
  172. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.css.js +11 -0
  173. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.d.ts +1 -0
  174. package/dist/{ui → likec4diagram/ui/diagram-title}/DiagramTitlePanel.js +3 -3
  175. package/dist/likec4diagram/ui/diagram-title/Link.d.ts +4 -0
  176. package/dist/likec4diagram/ui/index.d.ts +2 -0
  177. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +13 -0
  178. package/dist/likec4diagram/ui/notation/NotationPanel.d.ts +2 -0
  179. package/dist/{ui → likec4diagram/ui}/notation/NotationPanel.js +23 -31
  180. package/dist/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.css.js +4 -4
  181. package/dist/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.js +19 -44
  182. package/dist/{xyflow → likec4diagram}/useLayoutConstraints.d.ts +11 -6
  183. package/dist/{xyflow → likec4diagram}/useLayoutConstraints.js +17 -12
  184. package/dist/likec4diagram/useViewToNodesEdges.d.ts +11 -0
  185. package/dist/likec4diagram/useViewToNodesEdges.js +245 -0
  186. package/dist/likec4model/index.d.ts +1 -1
  187. package/dist/likec4model/useLikeC4Model.d.ts +1 -11
  188. package/dist/likec4model/useLikeC4Model.js +1 -39
  189. package/dist/overlays/Overlays.js +61 -105
  190. package/dist/overlays/element-details/ElementDetailsCard.js +111 -116
  191. package/dist/overlays/element-details/TabPanelDeployments.js +4 -7
  192. package/dist/overlays/element-details/TabPanelRelationships.css.js +0 -2
  193. package/dist/overlays/element-details/TabPanelRelationships.d.ts +1 -1
  194. package/dist/overlays/element-details/TabPanelRelationships.js +35 -64
  195. package/dist/overlays/element-details/TabPanelStructure.d.ts +2 -2
  196. package/dist/overlays/element-details/TabPanelStructure.js +1 -1
  197. package/dist/overlays/overlay/Overlay.css.d.ts +2 -0
  198. package/dist/overlays/overlay/Overlay.css.js +93 -0
  199. package/dist/overlays/overlay/Overlay.d.ts +8 -0
  200. package/dist/overlays/overlay/Overlay.js +86 -0
  201. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +5 -0
  202. package/dist/overlays/relationship-details/RelationshipDetails.js +189 -0
  203. package/dist/overlays/{edge-details → relationship-details}/SelectEdge.css.d.ts +1 -0
  204. package/dist/overlays/relationship-details/SelectEdge.css.js +17 -0
  205. package/dist/overlays/{edge-details → relationship-details}/SelectEdge.d.ts +1 -1
  206. package/dist/overlays/{edge-details → relationship-details}/SelectEdge.js +8 -8
  207. package/dist/overlays/relationship-details/_types.d.ts +36 -0
  208. package/dist/overlays/relationship-details/actor.d.ts +41 -0
  209. package/dist/overlays/relationship-details/actor.js +113 -0
  210. package/dist/overlays/relationship-details/custom/ElementActions.d.ts +5 -0
  211. package/dist/overlays/relationship-details/custom/ElementActions.js +33 -0
  212. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +49 -0
  213. package/dist/overlays/relationship-details/custom/edgeTypes.js +51 -0
  214. package/dist/overlays/relationship-details/custom/index.d.ts +2 -0
  215. package/dist/overlays/relationship-details/custom/nodeTypes.d.ts +39 -0
  216. package/dist/overlays/relationship-details/custom/nodeTypes.js +89 -0
  217. package/dist/overlays/relationship-details/custom/styles.css.d.ts +1 -0
  218. package/dist/overlays/relationship-details/hooks.d.ts +59 -0
  219. package/dist/overlays/relationship-details/hooks.js +46 -0
  220. package/dist/overlays/{edge-details/use-layouted-edge-details.d.ts → relationship-details/useLayoutedDetails.d.ts} +4 -6
  221. package/dist/overlays/{edge-details/use-layouted-edge-details.js → relationship-details/useLayoutedDetails.js} +68 -64
  222. package/dist/overlays/relationships-browser/-useRelationshipsView.d.ts +39 -0
  223. package/dist/overlays/relationships-browser/-useRelationshipsView.js +488 -0
  224. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +5 -0
  225. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +209 -0
  226. package/dist/overlays/{relationships-of → relationships-browser}/SelectElement.css.d.ts +1 -0
  227. package/dist/overlays/relationships-browser/SelectElement.css.js +9 -0
  228. package/dist/overlays/relationships-browser/SelectElement.d.ts +7 -0
  229. package/dist/overlays/{relationships-of → relationships-browser}/SelectElement.js +11 -7
  230. package/dist/overlays/relationships-browser/_types.d.ts +40 -0
  231. package/dist/overlays/relationships-browser/actor.d.ts +66 -0
  232. package/dist/overlays/relationships-browser/actor.js +159 -0
  233. package/dist/overlays/relationships-browser/custom/ElementActions.d.ts +5 -0
  234. package/dist/overlays/relationships-browser/custom/ElementActions.js +43 -0
  235. package/dist/overlays/relationships-browser/custom/EmptyNode.d.ts +5 -0
  236. package/dist/overlays/{relationships-of/xyflow → relationships-browser/custom}/EmptyNode.js +1 -3
  237. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +46 -0
  238. package/dist/overlays/relationships-browser/custom/edgeTypes.js +51 -0
  239. package/dist/overlays/relationships-browser/custom/index.d.ts +2 -0
  240. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +45 -0
  241. package/dist/overlays/relationships-browser/custom/nodeTypes.js +93 -0
  242. package/dist/overlays/relationships-browser/custom/styles.css.d.ts +1 -0
  243. package/dist/overlays/relationships-browser/custom/styles.css.js +5 -0
  244. package/dist/overlays/relationships-browser/hooks.d.ts +62 -0
  245. package/dist/overlays/relationships-browser/hooks.js +46 -0
  246. package/dist/overlays/relationships-browser/useViewToNodesEdges.d.ts +10 -0
  247. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +160 -0
  248. package/dist/style.css +1 -1
  249. package/dist/theme-vars.css.js +1 -0
  250. package/dist/utils/index.d.ts +4 -0
  251. package/dist/{xyflow/utils.d.ts → utils/xyflow.d.ts} +4 -4
  252. package/dist/{xyflow/utils.js → utils/xyflow.js} +14 -20
  253. package/package.json +24 -21
  254. package/src/LikeC4Diagram.css.ts +21 -15
  255. package/src/LikeC4Diagram.props.ts +14 -21
  256. package/src/LikeC4Diagram.tsx +105 -150
  257. package/src/LikeC4Search.tsx +21 -28
  258. package/src/StaticLikeC4Diagram.tsx +0 -1
  259. package/src/{xyflow/XYFlowBackground.tsx → base/Background.tsx} +8 -8
  260. package/src/base/BaseXYFlow.tsx +200 -0
  261. package/src/{xyflow → base}/const.ts +1 -1
  262. package/src/base/example/RelationshipsBrowser.tsx +62 -0
  263. package/src/base/example/_types.ts +71 -0
  264. package/src/base/example/custom.tsx +58 -0
  265. package/src/base/example/useViewToNodesEdges.ts +193 -0
  266. package/src/base/index.ts +10 -0
  267. package/src/base/primitives/NodeHandles.tsx +18 -0
  268. package/src/base/primitives/compound/CompoundActionButton.css.ts +55 -0
  269. package/src/base/primitives/compound/CompoundActionButton.tsx +52 -0
  270. package/src/base/primitives/compound/CompoundDetailsButton.css.ts +56 -0
  271. package/src/base/primitives/compound/CompoundDetailsButton.tsx +54 -0
  272. package/src/base/primitives/compound/CompoundNodeContainer.css.ts +161 -0
  273. package/src/base/primitives/compound/CompoundNodeContainer.tsx +95 -0
  274. package/src/base/primitives/compound/CompoundTitle.css.ts +43 -0
  275. package/src/base/primitives/compound/CompoundTitle.tsx +29 -0
  276. package/src/base/primitives/customEdge.ts +32 -0
  277. package/src/base/primitives/customNode.ts +21 -0
  278. package/src/base/primitives/edge/EdgeActionButton.tsx +27 -0
  279. package/src/base/primitives/edge/EdgeContainer.tsx +48 -0
  280. package/src/base/primitives/edge/EdgeLabel.css.ts +196 -0
  281. package/src/base/primitives/edge/EdgeLabel.tsx +136 -0
  282. package/src/{xyflow → base/primitives/edge}/EdgeMarkers.tsx +29 -1
  283. package/src/base/primitives/edge/EdgePath.tsx +89 -0
  284. package/src/base/primitives/edge/edge.css.ts +122 -0
  285. package/src/base/primitives/element/ElementActionButtons.css.ts +48 -0
  286. package/src/base/primitives/element/ElementActionButtons.tsx +73 -0
  287. package/src/base/primitives/element/ElementDetailsButton.css.ts +54 -0
  288. package/src/base/primitives/element/ElementDetailsButton.tsx +59 -0
  289. package/src/base/primitives/element/ElementNodeContainer.css.ts +47 -0
  290. package/src/base/primitives/element/ElementNodeContainer.tsx +72 -0
  291. package/src/base/primitives/element/ElementShape.css.ts +134 -0
  292. package/src/{xyflow/nodes/element/ElementShapeSvg.tsx → base/primitives/element/ElementShape.tsx} +64 -19
  293. package/src/base/primitives/element/ElementTitle.css.ts +156 -0
  294. package/src/base/primitives/element/ElementTitle.tsx +76 -0
  295. package/src/base/primitives/index.ts +17 -0
  296. package/src/base/types.ts +169 -0
  297. package/src/base/updateEdges.ts +40 -0
  298. package/src/base/updateNodes.ts +46 -0
  299. package/src/base/xyflowMachine.ts +75 -0
  300. package/src/context/DiagramEventHandlers.tsx +53 -0
  301. package/src/context/DiagramFeatures.tsx +162 -0
  302. package/src/{ui → context}/FramerMotionConfig.tsx +2 -6
  303. package/src/context/IconRenderer.tsx +45 -0
  304. package/src/context/RootContainer.tsx +31 -0
  305. package/src/context/index.ts +14 -0
  306. package/src/globals.css.ts +32 -32
  307. package/src/hooks/index.ts +7 -5
  308. package/src/hooks/useCurrentViewId.ts +8 -0
  309. package/src/hooks/useDiagram.ts +129 -0
  310. package/src/hooks/useDiagramActor.ts +25 -0
  311. package/src/hooks/useDiagramContext.ts +11 -0
  312. package/src/hooks/useMantinePortalProps.ts +2 -2
  313. package/src/hooks/useXYFlow.ts +12 -38
  314. package/src/index.ts +3 -7
  315. package/src/likec4diagram/DiagramActor.tsx +79 -0
  316. package/src/likec4diagram/DiagramUI.tsx +28 -0
  317. package/src/likec4diagram/XYFlow.tsx +137 -0
  318. package/src/likec4diagram/custom/edges/NotePopover.css.ts +27 -0
  319. package/src/likec4diagram/custom/edges/NotePopover.tsx +96 -0
  320. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +355 -0
  321. package/src/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.css.ts +7 -7
  322. package/src/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.tsx +91 -70
  323. package/src/likec4diagram/custom/edges/edges.css.ts +39 -0
  324. package/src/likec4diagram/custom/edges/utils.ts +126 -0
  325. package/src/likec4diagram/custom/index.tsx +8 -0
  326. package/src/likec4diagram/custom/nodes/CompoundActions.tsx +27 -0
  327. package/src/likec4diagram/custom/nodes/ElementActions.tsx +74 -0
  328. package/src/likec4diagram/custom/nodes/nodeTypes.tsx +107 -0
  329. package/src/likec4diagram/custom/nodes/toolbar/ColorButton.tsx +175 -0
  330. package/src/likec4diagram/custom/nodes/toolbar/CompoundToolbar.tsx +122 -0
  331. package/src/likec4diagram/custom/nodes/toolbar/ElementToolbar.tsx +140 -0
  332. package/src/likec4diagram/custom/nodes/toolbar/Toolbar.tsx +77 -0
  333. package/src/likec4diagram/custom/nodes/toolbar/_shared.tsx +143 -0
  334. package/src/likec4diagram/custom/nodes/toolbar/styles.css.ts +9 -0
  335. package/src/likec4diagram/state/actorContext.ts +8 -0
  336. package/src/{state → likec4diagram/state}/aligners.ts +67 -40
  337. package/src/likec4diagram/state/assign.ts +384 -0
  338. package/src/likec4diagram/state/hotkeyActor.ts +20 -0
  339. package/src/likec4diagram/state/inspector.ts +23 -0
  340. package/src/likec4diagram/state/machine.ts +946 -0
  341. package/src/likec4diagram/state/syncManualLayoutActor.ts +219 -0
  342. package/src/likec4diagram/state/utils.ts +52 -0
  343. package/src/likec4diagram/types.ts +144 -0
  344. package/src/{ui/top-left → likec4diagram/ui/controls}/ChangeAutoLayoutButton.tsx +32 -28
  345. package/src/likec4diagram/ui/controls/Controls.tsx +107 -0
  346. package/src/likec4diagram/ui/controls/LayoutDriftNotification.tsx +46 -0
  347. package/src/{ui/top-left → likec4diagram/ui/controls}/ManualLayoutToolsButton.tsx +16 -16
  348. package/src/likec4diagram/ui/controls/NavigationButtons.tsx +83 -0
  349. package/src/{ui/top-left → likec4diagram/ui/controls}/_shared.ts +4 -3
  350. package/src/{ui/top-left → likec4diagram/ui/controls}/styles.css.ts +17 -17
  351. package/src/{ui → likec4diagram/ui/diagram-title}/DiagramTitlePanel.css.ts +11 -11
  352. package/src/{ui → likec4diagram/ui/diagram-title}/DiagramTitlePanel.tsx +6 -5
  353. package/src/likec4diagram/ui/diagram-title/Link.tsx +40 -0
  354. package/src/likec4diagram/ui/index.ts +2 -0
  355. package/src/{ui → likec4diagram/ui}/notation/NotationPanel.css.ts +18 -18
  356. package/src/{ui → likec4diagram/ui}/notation/NotationPanel.tsx +44 -44
  357. package/src/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.css.ts +16 -16
  358. package/src/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.tsx +29 -49
  359. package/src/{xyflow → likec4diagram}/useLayoutConstraints.ts +54 -43
  360. package/src/likec4diagram/useViewToNodesEdges.ts +297 -0
  361. package/src/likec4model/index.ts +0 -6
  362. package/src/likec4model/useLikeC4Model.ts +1 -43
  363. package/src/overlays/Overlays.tsx +201 -147
  364. package/src/overlays/element-details/ElementDetailsCard.css.ts +58 -58
  365. package/src/overlays/element-details/ElementDetailsCard.tsx +143 -128
  366. package/src/overlays/element-details/TabPanelDeployments.css.ts +14 -14
  367. package/src/overlays/element-details/TabPanelDeployments.tsx +22 -22
  368. package/src/overlays/element-details/TabPanelRelationships.css.ts +19 -19
  369. package/src/overlays/element-details/TabPanelRelationships.tsx +45 -28
  370. package/src/overlays/element-details/TabPanelStructure.css.ts +7 -7
  371. package/src/overlays/element-details/TabPanelStructure.tsx +11 -11
  372. package/src/overlays/overlay/Overlay.css.ts +73 -0
  373. package/src/overlays/overlay/Overlay.tsx +99 -0
  374. package/src/overlays/relationship-details/RelationshipDetails.tsx +234 -0
  375. package/src/overlays/{edge-details → relationship-details}/SelectEdge.css.ts +20 -13
  376. package/src/overlays/{edge-details → relationship-details}/SelectEdge.tsx +14 -14
  377. package/src/overlays/relationship-details/_types.ts +73 -0
  378. package/src/overlays/relationship-details/actor.ts +162 -0
  379. package/src/overlays/relationship-details/custom/ElementActions.tsx +45 -0
  380. package/src/overlays/relationship-details/custom/edgeTypes.tsx +49 -0
  381. package/src/overlays/relationship-details/custom/index.tsx +2 -0
  382. package/src/overlays/relationship-details/custom/nodeTypes.tsx +108 -0
  383. package/src/overlays/relationship-details/custom/styles.css.ts +13 -0
  384. package/src/overlays/relationship-details/hooks.ts +48 -0
  385. package/src/overlays/{edge-details/use-layouted-edge-details.ts → relationship-details/useLayoutedDetails.ts} +128 -114
  386. package/src/overlays/relationships-browser/-useRelationshipsView.ts +642 -0
  387. package/src/overlays/relationships-browser/RelationshipsBrowser.tsx +247 -0
  388. package/src/overlays/{relationships-of → relationships-browser}/SelectElement.css.ts +12 -5
  389. package/src/overlays/{relationships-of → relationships-browser}/SelectElement.tsx +19 -17
  390. package/src/overlays/relationships-browser/_types.ts +89 -0
  391. package/src/overlays/relationships-browser/actor.ts +224 -0
  392. package/src/overlays/relationships-browser/custom/ElementActions.tsx +44 -0
  393. package/src/overlays/relationships-browser/custom/EmptyNode.tsx +18 -0
  394. package/src/overlays/relationships-browser/custom/edgeTypes.tsx +49 -0
  395. package/src/overlays/relationships-browser/custom/index.tsx +2 -0
  396. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +109 -0
  397. package/src/overlays/relationships-browser/custom/styles.css.ts +13 -0
  398. package/src/overlays/relationships-browser/hooks.ts +48 -0
  399. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +209 -0
  400. package/src/utils/index.ts +15 -0
  401. package/src/{xyflow/utils.ts → utils/xyflow.ts} +22 -8
  402. package/dist/_virtual/_commonjsHelpers.js +0 -6
  403. package/dist/controls/Text.d.ts +0 -2
  404. package/dist/controls/Text.js +0 -7
  405. package/dist/controls/action-button-bar/ActionButtonBar.css.d.ts +0 -1
  406. package/dist/controls/action-button-bar/ActionButtonBar.css.js +0 -5
  407. package/dist/controls/action-button-bar/ActionButtonBar.d.ts +0 -9
  408. package/dist/controls/action-button-bar/ActionButtonBar.js +0 -100
  409. package/dist/controls/action-button-bar/useActionButtonBarCtx.d.ts +0 -10
  410. package/dist/controls/action-button-bar/useActionButtonBarCtx.js +0 -9
  411. package/dist/controls/action-buttons/ActionButton.css.d.ts +0 -1
  412. package/dist/controls/action-buttons/ActionButton.css.js +0 -5
  413. package/dist/controls/action-buttons/ActionButton.d.ts +0 -9
  414. package/dist/controls/action-buttons/ActionButton.js +0 -66
  415. package/dist/controls/action-buttons/ActionButtons.d.ts +0 -12
  416. package/dist/controls/action-buttons/ActionButtons.js +0 -99
  417. package/dist/hooks/useDiagramState.d.ts +0 -6
  418. package/dist/hooks/useDiagramState.js +0 -27
  419. package/dist/overlays/OverlayContext.d.ts +0 -10
  420. package/dist/overlays/OverlayContext.js +0 -9
  421. package/dist/overlays/Overlays.css.d.ts +0 -3
  422. package/dist/overlays/Overlays.css.js +0 -7
  423. package/dist/overlays/edge-details/EdgeDetailsXYFlow.d.ts +0 -5
  424. package/dist/overlays/edge-details/EdgeDetailsXYFlow.js +0 -185
  425. package/dist/overlays/edge-details/SelectEdge.css.js +0 -17
  426. package/dist/overlays/edge-details/_types.d.ts +0 -14
  427. package/dist/overlays/edge-details/xyflow/CompoundNode.d.ts +0 -5
  428. package/dist/overlays/edge-details/xyflow/CompoundNode.js +0 -76
  429. package/dist/overlays/edge-details/xyflow/ElementNode.d.ts +0 -5
  430. package/dist/overlays/edge-details/xyflow/ElementNode.js +0 -159
  431. package/dist/overlays/edge-details/xyflow/RelationshipEdge.d.ts +0 -3
  432. package/dist/overlays/edge-details/xyflow/RelationshipEdge.js +0 -84
  433. package/dist/overlays/edge-details/xyflow/styles.css.d.ts +0 -9
  434. package/dist/overlays/edge-details/xyflow/styles.css.js +0 -21
  435. package/dist/overlays/index.d.ts +0 -1
  436. package/dist/overlays/relationships-of/RelationshipsOverlay.d.ts +0 -5
  437. package/dist/overlays/relationships-of/RelationshipsOverlay.js +0 -193
  438. package/dist/overlays/relationships-of/RelationshipsXYFlow.d.ts +0 -19
  439. package/dist/overlays/relationships-of/RelationshipsXYFlow.js +0 -290
  440. package/dist/overlays/relationships-of/SelectElement.css.js +0 -7
  441. package/dist/overlays/relationships-of/SelectElement.d.ts +0 -7
  442. package/dist/overlays/relationships-of/_types.d.ts +0 -28
  443. package/dist/overlays/relationships-of/use-layouted-relationships.d.ts +0 -22
  444. package/dist/overlays/relationships-of/use-layouted-relationships.js +0 -496
  445. package/dist/overlays/relationships-of/xyflow/CompoundNode.d.ts +0 -6
  446. package/dist/overlays/relationships-of/xyflow/CompoundNode.js +0 -120
  447. package/dist/overlays/relationships-of/xyflow/ElementNode.d.ts +0 -6
  448. package/dist/overlays/relationships-of/xyflow/ElementNode.js +0 -194
  449. package/dist/overlays/relationships-of/xyflow/EmptyNode.d.ts +0 -5
  450. package/dist/overlays/relationships-of/xyflow/RelationshipEdge.d.ts +0 -3
  451. package/dist/overlays/relationships-of/xyflow/RelationshipEdge.js +0 -123
  452. package/dist/overlays/relationships-of/xyflow/styles.css.d.ts +0 -14
  453. package/dist/overlays/relationships-of/xyflow/styles.css.js +0 -24
  454. package/dist/overlays/shared/xyflow/RelationshipEdge.css.d.ts +0 -4
  455. package/dist/overlays/shared/xyflow/RelationshipEdge.css.js +0 -12
  456. package/dist/overlays/shared/xyflow/_types.d.ts +0 -77
  457. package/dist/state/DiagramContext.d.ts +0 -1609
  458. package/dist/state/DiagramContext.js +0 -101
  459. package/dist/state/diagram-to-xyflow.d.ts +0 -11
  460. package/dist/state/diagram-to-xyflow.js +0 -113
  461. package/dist/state/diagramStore.d.ts +0 -1705
  462. package/dist/state/diagramStore.js +0 -808
  463. package/dist/state/diagramStore.layout.d.ts +0 -4
  464. package/dist/state/diagramStore.layout.js +0 -56
  465. package/dist/ui/DiagramTitlePanel.css.js +0 -11
  466. package/dist/ui/DiagramTitlePanel.d.ts +0 -1
  467. package/dist/ui/notation/NotationPanel.css.js +0 -16
  468. package/dist/ui/notation/NotationPanel.d.ts +0 -1
  469. package/dist/ui/top-left/TopLeftPanel.d.ts +0 -4
  470. package/dist/ui/top-left/TopLeftPanel.js +0 -211
  471. package/dist/ui/top-left/styles.css.js +0 -17
  472. package/dist/xyflow/FitviewOnDiagramChange.d.ts +0 -4
  473. package/dist/xyflow/FitviewOnDiagramChange.js +0 -72
  474. package/dist/xyflow/SelectEdgesOnNodeFocus.d.ts +0 -1
  475. package/dist/xyflow/SelectEdgesOnNodeFocus.js +0 -96
  476. package/dist/xyflow/XYFlow.d.ts +0 -8
  477. package/dist/xyflow/XYFlow.js +0 -145
  478. package/dist/xyflow/XYFlowBackground.d.ts +0 -10
  479. package/dist/xyflow/XYFlowInner.d.ts +0 -8
  480. package/dist/xyflow/XYFlowInner.js +0 -41
  481. package/dist/xyflow/edges/EdgeLabel.d.ts +0 -7
  482. package/dist/xyflow/edges/EdgeLabel.js +0 -160
  483. package/dist/xyflow/edges/RelationshipEdge.d.ts +0 -6
  484. package/dist/xyflow/edges/RelationshipEdge.js +0 -443
  485. package/dist/xyflow/edges/edges.css.js +0 -37
  486. package/dist/xyflow/edges/utils.d.ts +0 -16
  487. package/dist/xyflow/edges/utils.js +0 -24
  488. package/dist/xyflow/nodes/AnimateVariants.d.ts +0 -1313
  489. package/dist/xyflow/nodes/AnimateVariants.js +0 -123
  490. package/dist/xyflow/nodes/Node.css.d.ts +0 -3
  491. package/dist/xyflow/nodes/Node.css.js +0 -9
  492. package/dist/xyflow/nodes/compound/CompoundNode.css.d.ts +0 -14
  493. package/dist/xyflow/nodes/compound/CompoundNode.css.js +0 -27
  494. package/dist/xyflow/nodes/compound/CompoundNode.d.ts +0 -6
  495. package/dist/xyflow/nodes/compound/CompoundNode.js +0 -216
  496. package/dist/xyflow/nodes/compound/index.d.ts +0 -1
  497. package/dist/xyflow/nodes/element/ElementLink.css.d.ts +0 -3
  498. package/dist/xyflow/nodes/element/ElementLink.d.ts +0 -6
  499. package/dist/xyflow/nodes/element/ElementNode.d.ts +0 -6
  500. package/dist/xyflow/nodes/element/ElementNode.js +0 -190
  501. package/dist/xyflow/nodes/element/ElementShapeSvg.d.ts +0 -17
  502. package/dist/xyflow/nodes/element/element.css.d.ts +0 -18
  503. package/dist/xyflow/nodes/element/element.css.js +0 -31
  504. package/dist/xyflow/nodes/element/index.d.ts +0 -1
  505. package/dist/xyflow/nodes/shared/ElementIcon.d.ts +0 -8
  506. package/dist/xyflow/nodes/shared/Toolbar.d.ts +0 -9
  507. package/dist/xyflow/nodes/shared/Toolbar.js +0 -436
  508. package/dist/xyflow/types.d.ts +0 -36
  509. package/dist/xyflow/useXYFlowEvents.d.ts +0 -160
  510. package/dist/xyflow/useXYFlowEvents.js +0 -275
  511. package/src/controls/Text.ts +0 -5
  512. package/src/controls/action-button-bar/ActionButtonBar.css.ts +0 -13
  513. package/src/controls/action-button-bar/ActionButtonBar.tsx +0 -138
  514. package/src/controls/action-button-bar/useActionButtonBarCtx.ts +0 -13
  515. package/src/controls/action-buttons/ActionButton.css.ts +0 -29
  516. package/src/controls/action-buttons/ActionButton.tsx +0 -66
  517. package/src/controls/action-buttons/ActionButtons.tsx +0 -138
  518. package/src/hooks/useDiagramState.ts +0 -36
  519. package/src/overlays/OverlayContext.tsx +0 -11
  520. package/src/overlays/Overlays.css.ts +0 -136
  521. package/src/overlays/edge-details/EdgeDetailsXYFlow.tsx +0 -255
  522. package/src/overlays/edge-details/_types.ts +0 -18
  523. package/src/overlays/edge-details/xyflow/CompoundNode.tsx +0 -72
  524. package/src/overlays/edge-details/xyflow/ElementNode.tsx +0 -152
  525. package/src/overlays/edge-details/xyflow/RelationshipEdge.tsx +0 -85
  526. package/src/overlays/edge-details/xyflow/styles.css.ts +0 -144
  527. package/src/overlays/index.tsx +0 -1
  528. package/src/overlays/relationships-of/RelationshipsOverlay.tsx +0 -185
  529. package/src/overlays/relationships-of/RelationshipsXYFlow.tsx +0 -378
  530. package/src/overlays/relationships-of/_types.ts +0 -40
  531. package/src/overlays/relationships-of/use-layouted-relationships.ts +0 -699
  532. package/src/overlays/relationships-of/xyflow/CompoundNode.tsx +0 -124
  533. package/src/overlays/relationships-of/xyflow/ElementNode.tsx +0 -194
  534. package/src/overlays/relationships-of/xyflow/EmptyNode.tsx +0 -19
  535. package/src/overlays/relationships-of/xyflow/RelationshipEdge.tsx +0 -127
  536. package/src/overlays/relationships-of/xyflow/styles.css.ts +0 -214
  537. package/src/overlays/shared/xyflow/RelationshipEdge.css.ts +0 -60
  538. package/src/overlays/shared/xyflow/_types.ts +0 -87
  539. package/src/state/DiagramContext.tsx +0 -107
  540. package/src/state/diagram-to-xyflow.ts +0 -150
  541. package/src/state/diagramStore.layout.ts +0 -66
  542. package/src/state/diagramStore.ts +0 -1099
  543. package/src/ui/top-left/TopLeftPanel.tsx +0 -220
  544. package/src/xyflow/FitviewOnDiagramChange.tsx +0 -83
  545. package/src/xyflow/SelectEdgesOnNodeFocus.tsx +0 -106
  546. package/src/xyflow/XYFlow.tsx +0 -179
  547. package/src/xyflow/XYFlowInner.tsx +0 -48
  548. package/src/xyflow/edges/EdgeLabel.tsx +0 -193
  549. package/src/xyflow/edges/RelationshipEdge.tsx +0 -547
  550. package/src/xyflow/edges/edges.css.ts +0 -288
  551. package/src/xyflow/edges/utils.ts +0 -153
  552. package/src/xyflow/nodes/AnimateVariants.ts +0 -143
  553. package/src/xyflow/nodes/Node.css.ts +0 -44
  554. package/src/xyflow/nodes/compound/CompoundNode.css.ts +0 -258
  555. package/src/xyflow/nodes/compound/CompoundNode.tsx +0 -226
  556. package/src/xyflow/nodes/compound/index.ts +0 -1
  557. package/src/xyflow/nodes/element/ElementLink.css.ts +0 -67
  558. package/src/xyflow/nodes/element/ElementLink.tsx +0 -97
  559. package/src/xyflow/nodes/element/ElementNode.tsx +0 -208
  560. package/src/xyflow/nodes/element/element.css.ts +0 -369
  561. package/src/xyflow/nodes/element/index.ts +0 -1
  562. package/src/xyflow/nodes/shared/ElementIcon.tsx +0 -43
  563. package/src/xyflow/nodes/shared/Toolbar.tsx +0 -496
  564. package/src/xyflow/types.ts +0 -57
  565. package/src/xyflow/useXYFlowEvents.ts +0 -315
  566. /package/dist/{xyflow → base}/const.d.ts +0 -0
  567. /package/dist/{xyflow → base}/const.js +0 -0
  568. /package/dist/{ui → context}/EnsureMantine.d.ts +0 -0
  569. /package/dist/{ui → context}/EnsureMantine.js +0 -0
  570. /package/dist/{ui → context}/FramerMotionConfig.d.ts +0 -0
  571. /package/dist/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.css.d.ts +0 -0
  572. /package/dist/{ui/top-left → likec4diagram/ui/controls}/ChangeAutoLayoutButton.d.ts +0 -0
  573. /package/dist/{ui/top-left → likec4diagram/ui/controls}/ManualLayoutToolsButton.d.ts +0 -0
  574. /package/dist/{ui/top-left → likec4diagram/ui/controls}/_shared.d.ts +0 -0
  575. /package/dist/{ui → likec4diagram/ui/diagram-title}/DiagramTitlePanel.css.d.ts +0 -0
  576. /package/dist/{ui → likec4diagram/ui/diagram-title}/Link.js +0 -0
  577. /package/dist/{ui → likec4diagram/ui}/notation/NotationPanel.css.d.ts +0 -0
  578. /package/dist/{ui → likec4diagram/ui}/notation/index.d.ts +0 -0
  579. /package/dist/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.css.d.ts +0 -0
  580. /package/dist/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.d.ts +0 -0
  581. /package/src/{ui → context}/EnsureMantine.tsx +0 -0
  582. /package/src/{ui → likec4diagram/ui}/notation/index.ts +0 -0
@@ -1,5 +1,13 @@
1
- import { type DiagramNode, invariant, LikeC4Model, nameFromFqn } from '@likec4/core'
2
1
  import {
2
+ type DiagramEdge,
3
+ type EdgeId,
4
+ type NodeId,
5
+ DiagramNode,
6
+ LikeC4Model,
7
+ nameFromFqn,
8
+ } from '@likec4/core'
9
+ import {
10
+ type StackProps,
3
11
  ActionIcon,
4
12
  Box,
5
13
  Group,
@@ -11,19 +19,21 @@ import {
11
19
  MenuTarget,
12
20
  Space,
13
21
  Stack,
14
- type StackProps,
15
22
  Text,
16
23
  Tooltip as MantineTooltip,
17
- TooltipGroup
24
+ TooltipGroup,
18
25
  } from '@mantine/core'
19
26
  import { IconArrowRight, IconFileSymlink, IconInfoCircle, IconZoomScan } from '@tabler/icons-react'
20
27
  import clsx from 'clsx'
21
- import { forwardRef, Fragment, type MouseEventHandler, type PropsWithChildren, useCallback } from 'react'
22
- import { filter, isTruthy, map, partition, pick, pipe } from 'remeda'
23
- import { useDiagramState, useDiagramStoreApi, useMantinePortalProps, useXYNodesData } from '../../hooks'
24
- import { Link } from '../../ui/Link'
28
+ import { type MouseEventHandler, type PropsWithChildren, forwardRef, Fragment, useCallback } from 'react'
29
+ import { filter, isTruthy, map, partition, pipe } from 'remeda'
30
+ import { IfEnabled, useDiagramEventHandlers, useEnabledFeature } from '../../../context'
31
+ import { useMantinePortalProps } from '../../../hooks'
32
+ import { useDiagram } from '../../../hooks/useDiagram'
33
+ import { DiagramContext, useDiagramContext } from '../../../hooks/useDiagramContext'
34
+ import { useLikeC4Model } from '../../../likec4model'
35
+ import { Link } from '../../ui/diagram-title/Link'
25
36
  import * as css from './RelationshipsDropdownMenu.css'
26
- import type { DiagramFlowTypes } from '../types'
27
37
 
28
38
  const stopPropagation: MouseEventHandler = (e) => e.stopPropagation()
29
39
 
@@ -35,56 +45,62 @@ export const Tooltip = MantineTooltip.withProps({
35
45
  label: '',
36
46
  children: null,
37
47
  offset: 8,
38
- withinPortal: false
48
+ withinPortal: false,
39
49
  })
40
50
 
41
51
  export function RelationshipsDropdownMenu({
42
- edge,
52
+ edgeId,
53
+ source,
54
+ target,
43
55
  disabled = false,
44
- likec4model,
45
- children
56
+ children,
46
57
  }: PropsWithChildren<{
47
- edge: DiagramFlowTypes.DiagramEdgeData['edge']
58
+ edgeId: EdgeId
59
+ source: string
60
+ target: string
48
61
  disabled?: boolean | undefined
49
- likec4model: LikeC4Model
50
62
  }>) {
51
- const {
52
- openOverlay,
53
- enableRelationshipBrowser
54
- } = useDiagramState(pick(['openOverlay', 'enableRelationshipBrowser']))
63
+ const { diagramEdge, sourceNode, targetNode } = useDiagramContext(ctx => ({
64
+ diagramEdge: DiagramContext.findDiagramEdge(ctx, edgeId),
65
+ sourceNode: DiagramContext.findDiagramNode(ctx, source),
66
+ targetNode: DiagramContext.findDiagramNode(ctx, target),
67
+ }))
68
+ const likec4model = useLikeC4Model(true)
69
+ const diagram = useDiagram()
70
+
55
71
  const portalProps = useMantinePortalProps()
56
- const [sourceXYNode, targetXYNode] = useXYNodesData([edge.source, edge.target])
72
+ const onClickOpenOverlay = useCallback((e: React.MouseEvent): void => {
73
+ e.stopPropagation()
74
+ diagram.openRelationshipDetails(edgeId)
75
+ }, [edgeId])
76
+
77
+ if (!diagramEdge || !sourceNode || !targetNode) {
78
+ return <>{children}</>
79
+ }
57
80
 
58
- invariant(sourceXYNode, `Source XYNode ${edge.source} not found for edge ${edge.id}`)
59
- invariant(targetXYNode, `Target XYNode ${edge.target} not found for edge ${edge.id}`)
81
+ // const { source, target } = diagramEdge
82
+
83
+ // invariant(sourceNode.type !== 'view-group', 'View group node cannot have relationships')
84
+ // invariant(targetNode.type !== 'view-group', 'View group node cannot have relationships')
60
85
 
61
86
  const [direct, nested] = pipe(
62
- edge.relations,
87
+ diagramEdge.relations,
63
88
  map(id => {
64
89
  try {
65
90
  return likec4model.relationship(id)
66
91
  } catch (e) {
67
92
  // View was cached, but likec4model based on new data
68
93
  console.error(
69
- `View is cached and likec4model missing relationship ${id} from ${edge.source} -> ${edge.target}`,
70
- e
94
+ `View is cached and likec4model missing relationship ${id} from ${sourceNode.id} -> ${targetNode.id}`,
95
+ e,
71
96
  )
72
97
  return null
73
98
  }
74
99
  }),
75
100
  filter(isTruthy),
76
- partition(r => r.source.id === edge.source && r.target.id === edge.target)
101
+ partition(r => r.source.id === sourceNode.id && r.target.id === targetNode.id),
77
102
  )
78
103
 
79
- const onClickOpenOverlay = useCallback((e: React.MouseEvent): void => {
80
- e.stopPropagation()
81
- if (enableRelationshipBrowser) {
82
- openOverlay({
83
- edgeDetails: edge.id
84
- })
85
- }
86
- }, [edge.id, openOverlay, enableRelationshipBrowser])
87
-
88
104
  const renderRelationship = (relationship: LikeC4Model.AnyRelation, index: number) => (
89
105
  <Fragment key={relationship.id}>
90
106
  {index > 0 && <MenuDivider opacity={0.65} />}
@@ -92,9 +108,9 @@ export function RelationshipsDropdownMenu({
92
108
  onClick={onClickOpenOverlay}
93
109
  component={Relationship}
94
110
  relationship={relationship}
95
- sourceNode={sourceXYNode.data.element}
96
- targetNode={targetXYNode.data.element}
97
- edge={edge} />
111
+ sourceNode={sourceNode}
112
+ targetNode={targetNode}
113
+ edge={diagramEdge} />
98
114
  </Fragment>
99
115
  )
100
116
 
@@ -107,12 +123,12 @@ export function RelationshipsDropdownMenu({
107
123
  trigger={'click-hover'}
108
124
  openDelay={300}
109
125
  closeDelay={450}
110
- floatingStrategy={'fixed'}
111
126
  closeOnClickOutside
112
127
  clickOutsideEvents={['pointerdown', 'mousedown', 'click']}
113
128
  closeOnEscape
114
129
  closeOnItemClick={false}
115
130
  disabled={disabled}
131
+ position="bottom-start"
116
132
  {...portalProps}
117
133
  >
118
134
  <MenuTarget>
@@ -137,17 +153,15 @@ export function RelationshipsDropdownMenu({
137
153
  {nested.map(renderRelationship)}
138
154
  </>
139
155
  )}
140
- {enableRelationshipBrowser && (
141
- <Box pos={'absolute'} top={5} right={6}>
142
- <ActionIcon
143
- size={24}
144
- variant="subtle"
145
- onClick={onClickOpenOverlay}
146
- >
147
- <IconInfoCircle style={{ width: '70%' }} />
148
- </ActionIcon>
149
- </Box>
150
- )}
156
+ <Box pos={'absolute'} top={5} right={6}>
157
+ <ActionIcon
158
+ size={24}
159
+ variant="subtle"
160
+ onClick={onClickOpenOverlay}
161
+ >
162
+ <IconInfoCircle style={{ width: '70%' }} />
163
+ </ActionIcon>
164
+ </Box>
151
165
  </MenuDropdown>
152
166
  </Menu>
153
167
  )
@@ -157,7 +171,7 @@ const Relationship = forwardRef<
157
171
  HTMLDivElement,
158
172
  StackProps & {
159
173
  relationship: LikeC4Model.AnyRelation
160
- edge: DiagramFlowTypes.DiagramEdgeData['edge']
174
+ edge: DiagramEdge
161
175
  sourceNode: DiagramNode
162
176
  targetNode: DiagramNode
163
177
  }
@@ -169,19 +183,14 @@ const Relationship = forwardRef<
169
183
  targetNode,
170
184
  ...props
171
185
  }, ref) => {
172
- const diagramApi = useDiagramStoreApi()
173
- const {
174
- viewId,
175
- hasOnOpenSourceRelation,
176
- hasOnNavigateTo
177
- } = useDiagramState(s => ({
178
- viewId: s.view.id,
179
- hasOnOpenSourceRelation: !!s.onOpenSource,
180
- hasOnNavigateTo: !!s.onNavigateTo
181
- }))
182
- const sourceId = nameFromFqn(edge.source) + r.source.id.slice(edge.source.length)
183
- const targetId = nameFromFqn(edge.target) + r.target.id.slice(edge.target.length)
184
- const navigateTo = hasOnNavigateTo && r.navigateTo?.id !== viewId ? r.navigateTo?.id : undefined
186
+ const diagram = useDiagram()
187
+ const { enableNavigateTo } = useEnabledFeature('NavigateTo')
188
+ const { onOpenSource } = useDiagramEventHandlers()
189
+ const viewId = diagram.currentView().id
190
+
191
+ const sourceId = getShortId(r, r.source.id, sourceNode)
192
+ const targetId = getShortId(r, r.target.id, targetNode)
193
+ const navigateTo = enableNavigateTo && r.navigateTo?.id !== viewId ? r.navigateTo?.id : undefined
185
194
  const links = r.links
186
195
 
187
196
  return (
@@ -194,7 +203,7 @@ const Relationship = forwardRef<
194
203
  <Text component="div" className={css.endpoint} data-likec4-color={targetNode.color}>
195
204
  {targetId}
196
205
  </Text>
197
- {(navigateTo || hasOnOpenSourceRelation) && (
206
+ {(navigateTo || !!onOpenSource) && (
198
207
  <TooltipGroup openDelay={100}>
199
208
  <Space w={'xs'} />
200
209
  {navigateTo && (
@@ -207,7 +216,7 @@ const Relationship = forwardRef<
207
216
  onPointerDownCapture={stopPropagation}
208
217
  onClick={event => {
209
218
  event.stopPropagation()
210
- diagramApi.getState().onNavigateTo?.(navigateTo, event)
219
+ diagram.navigateTo(navigateTo)
211
220
  }}
212
221
  role="button"
213
222
  >
@@ -215,7 +224,7 @@ const Relationship = forwardRef<
215
224
  </ActionIcon>
216
225
  </Tooltip>
217
226
  )}
218
- {hasOnOpenSourceRelation && (
227
+ <IfEnabled feature="Vscode">
219
228
  <Tooltip label={'Open source'}>
220
229
  <ActionIcon
221
230
  className={clsx('nodrag nopan')}
@@ -225,16 +234,14 @@ const Relationship = forwardRef<
225
234
  onPointerDownCapture={stopPropagation}
226
235
  onClick={event => {
227
236
  event.stopPropagation()
228
- diagramApi.getState().onOpenSource?.({
229
- relation: r.id
230
- })
237
+ diagram.openSource({ relation: r.id })
231
238
  }}
232
239
  role="button"
233
240
  >
234
241
  <IconFileSymlink size="80%" stroke={2} />
235
242
  </ActionIcon>
236
243
  </Tooltip>
237
- )}
244
+ </IfEnabled>
238
245
  </TooltipGroup>
239
246
  )}
240
247
  </Group>
@@ -251,3 +258,17 @@ const Relationship = forwardRef<
251
258
  </Stack>
252
259
  )
253
260
  })
261
+
262
+ function getShortId(
263
+ r: LikeC4Model.AnyRelation<LikeC4Model.Any>,
264
+ actualEndpointId: NodeId<string>,
265
+ diagramNode: DiagramNode,
266
+ ) {
267
+ const diagramNodeId = r.isDeploymentRelation()
268
+ // Relation defined in deployment model. Use id of the deployment node as is.
269
+ ? diagramNode.id
270
+ // Relation defined in model. Get id of the model element
271
+ : DiagramNode.modelRef(diagramNode) || ''
272
+
273
+ return nameFromFqn(diagramNodeId) + actualEndpointId.slice(diagramNodeId.length)
274
+ }
@@ -0,0 +1,39 @@
1
+ import { globalStyle, style } from '@vanilla-extract/css'
2
+ import { mantine, xyvars } from '../../../theme-vars'
3
+
4
+ const isSelected = '.react-flow__edge.selected'
5
+
6
+ export const controlPoint = style({
7
+ fill: xyvars.edge.stroke,
8
+ stroke: xyvars.edge.stroke,
9
+ fillOpacity: 0.75,
10
+ strokeWidth: 1,
11
+ cursor: 'grab',
12
+ pointerEvents: 'auto',
13
+ visibility: 'hidden',
14
+ ':hover': {
15
+ stroke: mantine.colors.primaryColors.filledHover,
16
+ strokeWidth: 9,
17
+ transition: 'stroke 100ms ease-out, stroke-width 100ms ease-out',
18
+ },
19
+ selectors: {
20
+ [`:where(${isSelected}, [data-edge-hovered='true']) &`]: {
21
+ visibility: 'visible',
22
+ transition: 'fill-opacity 150ms ease-out, stroke 150ms ease-out, stroke-width 150ms ease-out',
23
+ transitionDelay: '50ms',
24
+ fillOpacity: 1,
25
+ strokeWidth: 5,
26
+ },
27
+ },
28
+ })
29
+
30
+ export const controlDragging = style({
31
+ cursor: 'grabbing',
32
+ })
33
+
34
+ globalStyle(`${controlDragging} *`, {
35
+ cursor: 'grabbing !important',
36
+ })
37
+ globalStyle(`${controlDragging} .react-flow__edge-interaction`, {
38
+ cursor: 'grabbing !important',
39
+ })
@@ -0,0 +1,126 @@
1
+ import { type InternalNode, type XYPosition, Position } from '@xyflow/react'
2
+ import { getNodeDimensions } from '@xyflow/system'
3
+ import { vector, VectorImpl } from '../../../utils'
4
+
5
+ export function getNodeCenter(node: InternalNode): XYPosition {
6
+ const { width, height } = getNodeDimensions(node)
7
+ const { x, y } = node.internals.positionAbsolute
8
+
9
+ return {
10
+ x: x + width / 2,
11
+ y: y + height / 2,
12
+ }
13
+ }
14
+
15
+ /**
16
+ * Helper function returns the intersection point
17
+ * of the line between the center of the intersectionNode and the target
18
+ *
19
+ * @param intersectionNode the node that is the center of the line
20
+ * @param target position of the target
21
+ * @param nodeMargin the margin of the intersectionNode. The point will be placed at nodeMargin distance from the border of the node
22
+ * @returns coordinates of the intersection point
23
+ */
24
+ export function getNodeIntersectionFromCenterToPoint(
25
+ intersectionNode: InternalNode,
26
+ target: XYPosition,
27
+ nodeMargin: number = 0,
28
+ ) {
29
+ const nodeCenter = getNodeCenter(intersectionNode)
30
+ const { width, height } = getNodeDimensions(intersectionNode)
31
+ const v = new VectorImpl(target.x, target.y).sub(nodeCenter)
32
+ console.log(intersectionNode)
33
+ const xScale = (nodeMargin + (width || 0) / 2) / v.x
34
+ const yScale = (nodeMargin + (height || 0) / 2) / v.y
35
+
36
+ const scale = Math.min(Math.abs(xScale), Math.abs(yScale))
37
+
38
+ return vector(v).mul(scale).add(nodeCenter)
39
+ }
40
+
41
+ /**
42
+ * Helper function returns the intersection point
43
+ * of the line between the center of the intersectionNode and the target
44
+ *
45
+ * @param intersectionNode the node that is the center of the line
46
+ * @param targetNode the target node
47
+ * @returns coordinates of the intersection point
48
+ */
49
+ function getNodeIntersection(
50
+ intersectionNode: InternalNode,
51
+ targetNode: InternalNode,
52
+ ): XYPosition {
53
+ return getNodeIntersectionFromCenterToPoint(intersectionNode, getNodeCenter(targetNode))
54
+ }
55
+
56
+ // returns the position (top,right,bottom or right) passed node compared to the intersection point
57
+ export function getPointPosition(node: InternalNode, intersectionPoint: XYPosition) {
58
+ const n = {
59
+ // x: node.data.element.position[0],
60
+ // y: node.data.element.position[1],
61
+ ...node.internals.positionAbsolute,
62
+ ...getNodeDimensions(node),
63
+ }
64
+ const nx = Math.round(n.x)
65
+ const ny = Math.round(n.y)
66
+ const px = Math.round(intersectionPoint.x)
67
+ const py = Math.round(intersectionPoint.y)
68
+
69
+ let handlePosition = Position.Top
70
+ if (px <= nx + 1) {
71
+ handlePosition = Position.Left
72
+ } else if (px >= nx + n.width - 1) {
73
+ handlePosition = Position.Right
74
+ } else if (py <= ny + 1) {
75
+ handlePosition = Position.Top
76
+ } else if (py >= n.y + n.height - 1) {
77
+ handlePosition = Position.Bottom
78
+ }
79
+
80
+ let handleWidth = 8, handleHeight = 8
81
+
82
+ let offsetX = 0
83
+ let offsetY = 0
84
+
85
+ // this is a tiny detail to make the markerEnd of an edge visible.
86
+ // The handle position that gets calculated has the origin top-left, so depending which side we are using, we add a little offset
87
+ // when the handlePosition is Position.Right for example, we need to add an offset as big as the handle itself in order to get the correct position
88
+ switch (handlePosition) {
89
+ case Position.Left:
90
+ offsetX = -handleWidth
91
+ break
92
+ case Position.Right:
93
+ offsetX = handleWidth
94
+ break
95
+ case Position.Top:
96
+ offsetY = -handleHeight
97
+ break
98
+ case Position.Bottom:
99
+ offsetY = handleHeight
100
+ break
101
+ }
102
+
103
+ return [
104
+ intersectionPoint.x + offsetX,
105
+ intersectionPoint.y + offsetY,
106
+ handlePosition,
107
+ ] as const
108
+ }
109
+
110
+ // returns the parameters (sx, sy, tx, ty, sourcePos, targetPos) you need to create an edge
111
+ export function getEdgeParams(source: InternalNode, target: InternalNode) {
112
+ const sourceIntersectionPoint = getNodeIntersection(source, target)
113
+ const targetIntersectionPoint = getNodeIntersection(target, source)
114
+
115
+ const [sx, sy, sourcePos] = getPointPosition(source, sourceIntersectionPoint)
116
+ const [tx, ty, targetPos] = getPointPosition(target, targetIntersectionPoint)
117
+
118
+ return {
119
+ sx,
120
+ sy,
121
+ tx,
122
+ ty,
123
+ sourcePos,
124
+ targetPos,
125
+ }
126
+ }
@@ -0,0 +1,8 @@
1
+ import type { Types } from '../types'
2
+ import { RelationshipEdge } from './edges/RelationshipEdge'
3
+
4
+ export { nodeTypes } from './nodes/nodeTypes'
5
+
6
+ export const edgeTypes = {
7
+ relationship: RelationshipEdge,
8
+ } satisfies { [key in Types.Edge['type']]: any }
@@ -0,0 +1,27 @@
1
+ import type { NodeId } from '@likec4/core'
2
+ import { CompoundActionButton } from '../../../base/primitives'
3
+ import type { NodeProps } from '../../../base/types'
4
+ import { useEnabledFeature } from '../../../context'
5
+ import { useDiagram } from '../../../hooks/useDiagram'
6
+ import type { Types } from '../../types'
7
+
8
+ type CompoundActionsProps = NodeProps<Types.CompoundElementNodeData | Types.CompoundDeploymentNodeData>
9
+
10
+ export const CompoundActions = (props: CompoundActionsProps) => {
11
+ const { enableNavigateTo } = useEnabledFeature('NavigateTo')
12
+ const diagram = useDiagram()
13
+
14
+ const { navigateTo } = props.data
15
+ if (navigateTo && enableNavigateTo) {
16
+ return (
17
+ <CompoundActionButton
18
+ onClick={(e) => {
19
+ e.stopPropagation()
20
+ diagram.navigateTo(navigateTo, props.id as NodeId)
21
+ }}
22
+ {...props}
23
+ />
24
+ )
25
+ }
26
+ return null
27
+ }
@@ -0,0 +1,74 @@
1
+ import type { NodeId } from '@likec4/core'
2
+ import { IconTransform, IconZoomScan } from '@tabler/icons-react'
3
+ import { ElementActionButtons } from '../../../base/primitives'
4
+ import type { NodeProps } from '../../../base/types'
5
+ import { useEnabledFeature } from '../../../context'
6
+ import { useDiagram } from '../../../hooks/useDiagram'
7
+ import type { Types } from '../../types'
8
+
9
+ type ElementActionsProps = NodeProps<Types.ElementNodeData>
10
+ export const ElementActions = (props: ElementActionsProps) => {
11
+ const { enableNavigateTo, enableRelationshipBrowser } = useEnabledFeature('RelationshipBrowser', 'NavigateTo')
12
+ const diagram = useDiagram()
13
+
14
+ const buttons = [] as ElementActionButtons.Item[]
15
+
16
+ const { navigateTo, modelFqn } = props.data
17
+ if (navigateTo && enableNavigateTo) {
18
+ buttons.push({
19
+ key: 'navigate',
20
+ icon: <IconZoomScan />,
21
+ onClick: (e) => {
22
+ e.stopPropagation()
23
+ diagram.navigateTo(navigateTo, props.id as NodeId)
24
+ },
25
+ })
26
+ }
27
+ if (enableRelationshipBrowser) {
28
+ buttons.push({
29
+ key: 'relationships',
30
+ icon: <IconTransform />,
31
+ onClick: (e) => {
32
+ e.stopPropagation()
33
+ diagram.openRelationshipsBrowser(modelFqn)
34
+ },
35
+ })
36
+ }
37
+ return (
38
+ <ElementActionButtons
39
+ buttons={buttons}
40
+ {...props}
41
+ />
42
+ )
43
+ }
44
+
45
+ type DeploymentElementActionsProps = NodeProps<Types.DeploymentElementNodeData>
46
+ export const DeploymentElementActions = (props: DeploymentElementActionsProps) => {
47
+ const { enableNavigateTo, enableRelationshipBrowser } = useEnabledFeature('NavigateTo', 'RelationshipBrowser')
48
+ const diagram = useDiagram()
49
+
50
+ const buttons = [] as ElementActionButtons.Item[]
51
+
52
+ const { navigateTo, modelFqn } = props.data
53
+ if (navigateTo && enableNavigateTo) {
54
+ buttons.push({
55
+ key: 'navigate',
56
+ icon: <IconZoomScan />,
57
+ onClick: (e) => {
58
+ e.stopPropagation()
59
+ diagram.navigateTo(navigateTo, props.id as NodeId)
60
+ },
61
+ })
62
+ }
63
+ if (enableRelationshipBrowser && !!modelFqn) {
64
+ buttons.push({
65
+ key: 'relationships',
66
+ icon: <IconTransform />,
67
+ onClick: (e) => {
68
+ e.stopPropagation()
69
+ diagram.openRelationshipsBrowser(modelFqn)
70
+ },
71
+ })
72
+ }
73
+ return <ElementActionButtons buttons={buttons} {...props} />
74
+ }
@@ -0,0 +1,107 @@
1
+ import { type Fqn, type NodeId } from '@likec4/core'
2
+ import type { NodeProps } from '../../../base'
3
+ import {
4
+ CompoundDetailsButton,
5
+ CompoundNodeContainer,
6
+ CompoundTitle,
7
+ customNode,
8
+ DefaultHandles,
9
+ ElementDetailsButton,
10
+ ElementNodeContainer,
11
+ ElementShape,
12
+ ElementTitle,
13
+ } from '../../../base/primitives'
14
+ import { IfEnabled, IfNotEnabled, useEnabledFeature } from '../../../context'
15
+ import { useDiagram } from '../../../hooks/useDiagram'
16
+ import type { Types } from '../../types'
17
+ import { CompoundActions } from './CompoundActions'
18
+ import { DeploymentElementActions, ElementActions } from './ElementActions'
19
+ import { CompoundDeploymentToolbar, CompoundElementToolbar } from './toolbar/CompoundToolbar'
20
+ import { DeploymentElementToolbar, ElementToolbar } from './toolbar/ElementToolbar'
21
+
22
+ const ElementDetailsButtonWithHandler = ({ fqn, ...props }: NodeProps<Types.NodeData> & { fqn: Fqn }) => {
23
+ const { enableElementDetails } = useEnabledFeature('ElementDetails')
24
+ const diagram = useDiagram()
25
+
26
+ if (!enableElementDetails) return null
27
+
28
+ return (
29
+ <ElementDetailsButton
30
+ {...props}
31
+ onClick={e => {
32
+ e.stopPropagation()
33
+ diagram.openElementDetails(fqn, props.id as NodeId)
34
+ }}
35
+ />
36
+ )
37
+ }
38
+
39
+ export const nodeTypes = {
40
+ element: customNode<Types.ElementNodeData>((props) => (
41
+ <ElementNodeContainer nodeProps={props}>
42
+ <ElementShape {...props} />
43
+ <ElementTitle {...props} />
44
+ <ElementActions {...props} />
45
+ <ElementDetailsButtonWithHandler
46
+ fqn={props.data.modelFqn}
47
+ {...props} />
48
+ <IfNotEnabled feature="ReadOnly">
49
+ <ElementToolbar {...props} />
50
+ </IfNotEnabled>
51
+ <DefaultHandles />
52
+ </ElementNodeContainer>
53
+ )),
54
+ deployment: customNode<Types.DeploymentElementNodeData>((props) => (
55
+ <ElementNodeContainer nodeProps={props}>
56
+ <ElementShape {...props} />
57
+ <ElementTitle {...props} />
58
+ <DeploymentElementActions {...props} />
59
+ {!!props.data.modelFqn && (
60
+ <ElementDetailsButtonWithHandler
61
+ fqn={props.data.modelFqn}
62
+ {...props} />
63
+ )}
64
+ <IfNotEnabled feature="ReadOnly">
65
+ <DeploymentElementToolbar {...props} />
66
+ </IfNotEnabled>
67
+ <DefaultHandles />
68
+ </ElementNodeContainer>
69
+ )),
70
+ 'compound-element': customNode<Types.CompoundElementNodeData>((props) => {
71
+ const diagram = useDiagram()
72
+ return (
73
+ <CompoundNodeContainer nodeProps={props}>
74
+ <CompoundTitle {...props} />
75
+ <CompoundActions {...props} />
76
+ <IfEnabled feature="ElementDetails">
77
+ <CompoundDetailsButton
78
+ {...props}
79
+ onClick={e => {
80
+ e.stopPropagation()
81
+ diagram.openElementDetails(props.data.modelFqn, props.id as NodeId)
82
+ }} />
83
+ </IfEnabled>
84
+ <IfNotEnabled feature="ReadOnly">
85
+ <CompoundElementToolbar {...props} />
86
+ </IfNotEnabled>
87
+ <DefaultHandles />
88
+ </CompoundNodeContainer>
89
+ )
90
+ }),
91
+ 'compound-deployment': customNode<Types.CompoundDeploymentNodeData>((props) => (
92
+ <CompoundNodeContainer nodeProps={props}>
93
+ <CompoundTitle {...props} />
94
+ <CompoundActions {...props} />
95
+ <IfNotEnabled feature="ReadOnly">
96
+ <CompoundDeploymentToolbar {...props} />
97
+ </IfNotEnabled>
98
+ <DefaultHandles />
99
+ </CompoundNodeContainer>
100
+ )),
101
+ 'view-group': customNode<Types.ViewGroupNodeData>((props) => (
102
+ <CompoundNodeContainer nodeProps={props}>
103
+ <CompoundTitle {...props} />
104
+ <DefaultHandles />
105
+ </CompoundNodeContainer>
106
+ )),
107
+ } satisfies { [key in Types.Node['type']]: any }