@likec4/diagram 1.19.2 → 1.20.1

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 (581) 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 -86
  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 +24 -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 -8
  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/utils/index.d.ts +4 -0
  250. package/dist/{xyflow/utils.d.ts → utils/xyflow.d.ts} +4 -4
  251. package/dist/{xyflow/utils.js → utils/xyflow.js} +14 -20
  252. package/package.json +23 -20
  253. package/src/LikeC4Diagram.css.ts +21 -15
  254. package/src/LikeC4Diagram.props.ts +14 -21
  255. package/src/LikeC4Diagram.tsx +105 -150
  256. package/src/LikeC4Search.tsx +21 -28
  257. package/src/StaticLikeC4Diagram.tsx +0 -1
  258. package/src/{xyflow/XYFlowBackground.tsx → base/Background.tsx} +8 -8
  259. package/src/base/BaseXYFlow.tsx +200 -0
  260. package/src/{xyflow → base}/const.ts +1 -1
  261. package/src/base/example/RelationshipsBrowser.tsx +62 -0
  262. package/src/base/example/_types.ts +71 -0
  263. package/src/base/example/custom.tsx +58 -0
  264. package/src/base/example/useViewToNodesEdges.ts +193 -0
  265. package/src/base/index.ts +10 -0
  266. package/src/base/primitives/NodeHandles.tsx +18 -0
  267. package/src/base/primitives/compound/CompoundActionButton.css.ts +55 -0
  268. package/src/base/primitives/compound/CompoundActionButton.tsx +52 -0
  269. package/src/base/primitives/compound/CompoundDetailsButton.css.ts +56 -0
  270. package/src/base/primitives/compound/CompoundDetailsButton.tsx +54 -0
  271. package/src/base/primitives/compound/CompoundNodeContainer.css.ts +161 -0
  272. package/src/base/primitives/compound/CompoundNodeContainer.tsx +95 -0
  273. package/src/base/primitives/compound/CompoundTitle.css.ts +43 -0
  274. package/src/base/primitives/compound/CompoundTitle.tsx +29 -0
  275. package/src/base/primitives/customEdge.ts +32 -0
  276. package/src/base/primitives/customNode.ts +21 -0
  277. package/src/base/primitives/edge/EdgeActionButton.tsx +27 -0
  278. package/src/base/primitives/edge/EdgeContainer.tsx +48 -0
  279. package/src/base/primitives/edge/EdgeLabel.css.ts +196 -0
  280. package/src/base/primitives/edge/EdgeLabel.tsx +136 -0
  281. package/src/{xyflow → base/primitives/edge}/EdgeMarkers.tsx +29 -1
  282. package/src/base/primitives/edge/EdgePath.tsx +89 -0
  283. package/src/base/primitives/edge/edge.css.ts +122 -0
  284. package/src/base/primitives/element/ElementActionButtons.css.ts +48 -0
  285. package/src/base/primitives/element/ElementActionButtons.tsx +73 -0
  286. package/src/base/primitives/element/ElementDetailsButton.css.ts +54 -0
  287. package/src/base/primitives/element/ElementDetailsButton.tsx +59 -0
  288. package/src/base/primitives/element/ElementNodeContainer.css.ts +47 -0
  289. package/src/base/primitives/element/ElementNodeContainer.tsx +72 -0
  290. package/src/base/primitives/element/ElementShape.css.ts +134 -0
  291. package/src/{xyflow/nodes/element/ElementShapeSvg.tsx → base/primitives/element/ElementShape.tsx} +64 -19
  292. package/src/base/primitives/element/ElementTitle.css.ts +156 -0
  293. package/src/base/primitives/element/ElementTitle.tsx +76 -0
  294. package/src/base/primitives/index.ts +17 -0
  295. package/src/base/types.ts +169 -0
  296. package/src/base/updateEdges.ts +40 -0
  297. package/src/base/updateNodes.ts +46 -0
  298. package/src/base/xyflowMachine.ts +75 -0
  299. package/src/context/DiagramEventHandlers.tsx +53 -0
  300. package/src/context/DiagramFeatures.tsx +162 -0
  301. package/src/{ui → context}/FramerMotionConfig.tsx +2 -6
  302. package/src/context/IconRenderer.tsx +45 -0
  303. package/src/context/RootContainer.tsx +31 -0
  304. package/src/context/index.ts +14 -0
  305. package/src/globals.css.ts +32 -32
  306. package/src/hooks/index.ts +7 -5
  307. package/src/hooks/useCurrentViewId.ts +8 -0
  308. package/src/hooks/useDiagram.ts +129 -0
  309. package/src/hooks/useDiagramActor.ts +25 -0
  310. package/src/hooks/useDiagramContext.ts +11 -0
  311. package/src/hooks/useMantinePortalProps.ts +2 -2
  312. package/src/hooks/useXYFlow.ts +12 -38
  313. package/src/index.ts +3 -7
  314. package/src/likec4diagram/DiagramActor.tsx +79 -0
  315. package/src/likec4diagram/DiagramUI.tsx +28 -0
  316. package/src/likec4diagram/XYFlow.tsx +137 -0
  317. package/src/likec4diagram/custom/edges/NotePopover.css.ts +27 -0
  318. package/src/likec4diagram/custom/edges/NotePopover.tsx +96 -0
  319. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +355 -0
  320. package/src/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.css.ts +7 -7
  321. package/src/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.tsx +91 -70
  322. package/src/likec4diagram/custom/edges/edges.css.ts +39 -0
  323. package/src/likec4diagram/custom/edges/utils.ts +125 -0
  324. package/src/likec4diagram/custom/index.tsx +8 -0
  325. package/src/likec4diagram/custom/nodes/CompoundActions.tsx +27 -0
  326. package/src/likec4diagram/custom/nodes/ElementActions.tsx +74 -0
  327. package/src/likec4diagram/custom/nodes/nodeTypes.tsx +107 -0
  328. package/src/likec4diagram/custom/nodes/toolbar/ColorButton.tsx +175 -0
  329. package/src/likec4diagram/custom/nodes/toolbar/CompoundToolbar.tsx +122 -0
  330. package/src/likec4diagram/custom/nodes/toolbar/ElementToolbar.tsx +140 -0
  331. package/src/likec4diagram/custom/nodes/toolbar/Toolbar.tsx +77 -0
  332. package/src/likec4diagram/custom/nodes/toolbar/_shared.tsx +143 -0
  333. package/src/likec4diagram/custom/nodes/toolbar/styles.css.ts +9 -0
  334. package/src/likec4diagram/state/actorContext.ts +8 -0
  335. package/src/{state → likec4diagram/state}/aligners.ts +67 -40
  336. package/src/likec4diagram/state/assign.ts +384 -0
  337. package/src/likec4diagram/state/hotkeyActor.ts +20 -0
  338. package/src/likec4diagram/state/inspector.ts +23 -0
  339. package/src/likec4diagram/state/machine.ts +946 -0
  340. package/src/likec4diagram/state/syncManualLayoutActor.ts +219 -0
  341. package/src/likec4diagram/state/utils.ts +52 -0
  342. package/src/likec4diagram/types.ts +144 -0
  343. package/src/{ui/top-left → likec4diagram/ui/controls}/ChangeAutoLayoutButton.tsx +32 -28
  344. package/src/likec4diagram/ui/controls/Controls.tsx +107 -0
  345. package/src/likec4diagram/ui/controls/LayoutDriftNotification.tsx +46 -0
  346. package/src/{ui/top-left → likec4diagram/ui/controls}/ManualLayoutToolsButton.tsx +16 -16
  347. package/src/likec4diagram/ui/controls/NavigationButtons.tsx +83 -0
  348. package/src/{ui/top-left → likec4diagram/ui/controls}/_shared.ts +4 -3
  349. package/src/{ui/top-left → likec4diagram/ui/controls}/styles.css.ts +17 -17
  350. package/src/{ui → likec4diagram/ui/diagram-title}/DiagramTitlePanel.css.ts +11 -11
  351. package/src/{ui → likec4diagram/ui/diagram-title}/DiagramTitlePanel.tsx +6 -5
  352. package/src/likec4diagram/ui/diagram-title/Link.tsx +40 -0
  353. package/src/likec4diagram/ui/index.ts +2 -0
  354. package/src/{ui → likec4diagram/ui}/notation/NotationPanel.css.ts +18 -18
  355. package/src/{ui → likec4diagram/ui}/notation/NotationPanel.tsx +44 -44
  356. package/src/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.css.ts +16 -16
  357. package/src/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.tsx +29 -49
  358. package/src/{xyflow → likec4diagram}/useLayoutConstraints.ts +54 -43
  359. package/src/likec4diagram/useViewToNodesEdges.ts +297 -0
  360. package/src/likec4model/index.ts +0 -6
  361. package/src/likec4model/useLikeC4Model.ts +1 -43
  362. package/src/overlays/Overlays.tsx +201 -147
  363. package/src/overlays/element-details/ElementDetailsCard.css.ts +58 -58
  364. package/src/overlays/element-details/ElementDetailsCard.tsx +143 -128
  365. package/src/overlays/element-details/TabPanelDeployments.css.ts +14 -14
  366. package/src/overlays/element-details/TabPanelDeployments.tsx +22 -22
  367. package/src/overlays/element-details/TabPanelRelationships.css.ts +19 -19
  368. package/src/overlays/element-details/TabPanelRelationships.tsx +45 -28
  369. package/src/overlays/element-details/TabPanelStructure.css.ts +7 -7
  370. package/src/overlays/element-details/TabPanelStructure.tsx +11 -11
  371. package/src/overlays/overlay/Overlay.css.ts +73 -0
  372. package/src/overlays/overlay/Overlay.tsx +99 -0
  373. package/src/overlays/relationship-details/RelationshipDetails.tsx +234 -0
  374. package/src/overlays/{edge-details → relationship-details}/SelectEdge.css.ts +20 -13
  375. package/src/overlays/{edge-details → relationship-details}/SelectEdge.tsx +14 -14
  376. package/src/overlays/relationship-details/_types.ts +73 -0
  377. package/src/overlays/relationship-details/actor.ts +162 -0
  378. package/src/overlays/relationship-details/custom/ElementActions.tsx +45 -0
  379. package/src/overlays/relationship-details/custom/edgeTypes.tsx +49 -0
  380. package/src/overlays/relationship-details/custom/index.tsx +2 -0
  381. package/src/overlays/relationship-details/custom/nodeTypes.tsx +108 -0
  382. package/src/overlays/relationship-details/custom/styles.css.ts +13 -0
  383. package/src/overlays/relationship-details/hooks.ts +48 -0
  384. package/src/overlays/{edge-details/use-layouted-edge-details.ts → relationship-details/useLayoutedDetails.ts} +128 -114
  385. package/src/overlays/relationships-browser/-useRelationshipsView.ts +642 -0
  386. package/src/overlays/relationships-browser/RelationshipsBrowser.tsx +247 -0
  387. package/src/overlays/{relationships-of → relationships-browser}/SelectElement.css.ts +12 -5
  388. package/src/overlays/{relationships-of → relationships-browser}/SelectElement.tsx +19 -18
  389. package/src/overlays/relationships-browser/_types.ts +89 -0
  390. package/src/overlays/relationships-browser/actor.ts +224 -0
  391. package/src/overlays/relationships-browser/custom/ElementActions.tsx +44 -0
  392. package/src/overlays/relationships-browser/custom/EmptyNode.tsx +18 -0
  393. package/src/overlays/relationships-browser/custom/edgeTypes.tsx +49 -0
  394. package/src/overlays/relationships-browser/custom/index.tsx +2 -0
  395. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +109 -0
  396. package/src/overlays/relationships-browser/custom/styles.css.ts +13 -0
  397. package/src/overlays/relationships-browser/hooks.ts +48 -0
  398. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +209 -0
  399. package/src/utils/index.ts +15 -0
  400. package/src/{xyflow/utils.ts → utils/xyflow.ts} +22 -8
  401. package/dist/_virtual/_commonjsHelpers.js +0 -6
  402. package/dist/controls/Text.d.ts +0 -2
  403. package/dist/controls/Text.js +0 -7
  404. package/dist/controls/action-button-bar/ActionButtonBar.css.d.ts +0 -1
  405. package/dist/controls/action-button-bar/ActionButtonBar.css.js +0 -5
  406. package/dist/controls/action-button-bar/ActionButtonBar.d.ts +0 -9
  407. package/dist/controls/action-button-bar/ActionButtonBar.js +0 -100
  408. package/dist/controls/action-button-bar/useActionButtonBarCtx.d.ts +0 -10
  409. package/dist/controls/action-button-bar/useActionButtonBarCtx.js +0 -9
  410. package/dist/controls/action-buttons/ActionButton.css.d.ts +0 -1
  411. package/dist/controls/action-buttons/ActionButton.css.js +0 -5
  412. package/dist/controls/action-buttons/ActionButton.d.ts +0 -9
  413. package/dist/controls/action-buttons/ActionButton.js +0 -66
  414. package/dist/controls/action-buttons/ActionButtons.d.ts +0 -12
  415. package/dist/controls/action-buttons/ActionButtons.js +0 -99
  416. package/dist/hooks/useDiagramState.d.ts +0 -6
  417. package/dist/hooks/useDiagramState.js +0 -27
  418. package/dist/overlays/OverlayContext.d.ts +0 -10
  419. package/dist/overlays/OverlayContext.js +0 -9
  420. package/dist/overlays/Overlays.css.d.ts +0 -3
  421. package/dist/overlays/Overlays.css.js +0 -7
  422. package/dist/overlays/edge-details/EdgeDetailsXYFlow.d.ts +0 -5
  423. package/dist/overlays/edge-details/EdgeDetailsXYFlow.js +0 -185
  424. package/dist/overlays/edge-details/SelectEdge.css.js +0 -17
  425. package/dist/overlays/edge-details/_types.d.ts +0 -14
  426. package/dist/overlays/edge-details/xyflow/CompoundNode.d.ts +0 -5
  427. package/dist/overlays/edge-details/xyflow/CompoundNode.js +0 -76
  428. package/dist/overlays/edge-details/xyflow/ElementNode.d.ts +0 -5
  429. package/dist/overlays/edge-details/xyflow/ElementNode.js +0 -159
  430. package/dist/overlays/edge-details/xyflow/RelationshipEdge.d.ts +0 -3
  431. package/dist/overlays/edge-details/xyflow/RelationshipEdge.js +0 -84
  432. package/dist/overlays/edge-details/xyflow/styles.css.d.ts +0 -9
  433. package/dist/overlays/edge-details/xyflow/styles.css.js +0 -21
  434. package/dist/overlays/index.d.ts +0 -1
  435. package/dist/overlays/relationships-of/RelationshipsOverlay.d.ts +0 -5
  436. package/dist/overlays/relationships-of/RelationshipsOverlay.js +0 -193
  437. package/dist/overlays/relationships-of/RelationshipsXYFlow.d.ts +0 -19
  438. package/dist/overlays/relationships-of/RelationshipsXYFlow.js +0 -290
  439. package/dist/overlays/relationships-of/SelectElement.css.js +0 -7
  440. package/dist/overlays/relationships-of/SelectElement.d.ts +0 -7
  441. package/dist/overlays/relationships-of/_types.d.ts +0 -28
  442. package/dist/overlays/relationships-of/use-layouted-relationships.d.ts +0 -22
  443. package/dist/overlays/relationships-of/use-layouted-relationships.js +0 -496
  444. package/dist/overlays/relationships-of/xyflow/CompoundNode.d.ts +0 -6
  445. package/dist/overlays/relationships-of/xyflow/CompoundNode.js +0 -120
  446. package/dist/overlays/relationships-of/xyflow/ElementNode.d.ts +0 -6
  447. package/dist/overlays/relationships-of/xyflow/ElementNode.js +0 -194
  448. package/dist/overlays/relationships-of/xyflow/EmptyNode.d.ts +0 -5
  449. package/dist/overlays/relationships-of/xyflow/RelationshipEdge.d.ts +0 -3
  450. package/dist/overlays/relationships-of/xyflow/RelationshipEdge.js +0 -123
  451. package/dist/overlays/relationships-of/xyflow/styles.css.d.ts +0 -14
  452. package/dist/overlays/relationships-of/xyflow/styles.css.js +0 -24
  453. package/dist/overlays/shared/xyflow/RelationshipEdge.css.d.ts +0 -4
  454. package/dist/overlays/shared/xyflow/RelationshipEdge.css.js +0 -12
  455. package/dist/overlays/shared/xyflow/_types.d.ts +0 -77
  456. package/dist/state/DiagramContext.d.ts +0 -1609
  457. package/dist/state/DiagramContext.js +0 -101
  458. package/dist/state/diagram-to-xyflow.d.ts +0 -11
  459. package/dist/state/diagram-to-xyflow.js +0 -113
  460. package/dist/state/diagramStore.d.ts +0 -1705
  461. package/dist/state/diagramStore.js +0 -808
  462. package/dist/state/diagramStore.layout.d.ts +0 -4
  463. package/dist/state/diagramStore.layout.js +0 -56
  464. package/dist/ui/DiagramTitlePanel.css.js +0 -11
  465. package/dist/ui/DiagramTitlePanel.d.ts +0 -1
  466. package/dist/ui/notation/NotationPanel.css.js +0 -16
  467. package/dist/ui/notation/NotationPanel.d.ts +0 -1
  468. package/dist/ui/top-left/TopLeftPanel.d.ts +0 -4
  469. package/dist/ui/top-left/TopLeftPanel.js +0 -211
  470. package/dist/ui/top-left/styles.css.js +0 -17
  471. package/dist/xyflow/FitviewOnDiagramChange.d.ts +0 -4
  472. package/dist/xyflow/FitviewOnDiagramChange.js +0 -72
  473. package/dist/xyflow/SelectEdgesOnNodeFocus.d.ts +0 -1
  474. package/dist/xyflow/SelectEdgesOnNodeFocus.js +0 -96
  475. package/dist/xyflow/XYFlow.d.ts +0 -8
  476. package/dist/xyflow/XYFlow.js +0 -145
  477. package/dist/xyflow/XYFlowBackground.d.ts +0 -10
  478. package/dist/xyflow/XYFlowInner.d.ts +0 -8
  479. package/dist/xyflow/XYFlowInner.js +0 -41
  480. package/dist/xyflow/edges/EdgeLabel.d.ts +0 -7
  481. package/dist/xyflow/edges/EdgeLabel.js +0 -160
  482. package/dist/xyflow/edges/RelationshipEdge.d.ts +0 -6
  483. package/dist/xyflow/edges/RelationshipEdge.js +0 -443
  484. package/dist/xyflow/edges/edges.css.js +0 -37
  485. package/dist/xyflow/edges/utils.d.ts +0 -16
  486. package/dist/xyflow/edges/utils.js +0 -24
  487. package/dist/xyflow/nodes/AnimateVariants.d.ts +0 -1313
  488. package/dist/xyflow/nodes/AnimateVariants.js +0 -123
  489. package/dist/xyflow/nodes/Node.css.d.ts +0 -3
  490. package/dist/xyflow/nodes/Node.css.js +0 -9
  491. package/dist/xyflow/nodes/compound/CompoundNode.css.d.ts +0 -14
  492. package/dist/xyflow/nodes/compound/CompoundNode.css.js +0 -27
  493. package/dist/xyflow/nodes/compound/CompoundNode.d.ts +0 -6
  494. package/dist/xyflow/nodes/compound/CompoundNode.js +0 -216
  495. package/dist/xyflow/nodes/compound/index.d.ts +0 -1
  496. package/dist/xyflow/nodes/element/ElementLink.css.d.ts +0 -3
  497. package/dist/xyflow/nodes/element/ElementLink.d.ts +0 -6
  498. package/dist/xyflow/nodes/element/ElementNode.d.ts +0 -6
  499. package/dist/xyflow/nodes/element/ElementNode.js +0 -190
  500. package/dist/xyflow/nodes/element/ElementShapeSvg.d.ts +0 -17
  501. package/dist/xyflow/nodes/element/element.css.d.ts +0 -18
  502. package/dist/xyflow/nodes/element/element.css.js +0 -31
  503. package/dist/xyflow/nodes/element/index.d.ts +0 -1
  504. package/dist/xyflow/nodes/shared/ElementIcon.d.ts +0 -8
  505. package/dist/xyflow/nodes/shared/Toolbar.d.ts +0 -9
  506. package/dist/xyflow/nodes/shared/Toolbar.js +0 -436
  507. package/dist/xyflow/types.d.ts +0 -36
  508. package/dist/xyflow/useXYFlowEvents.d.ts +0 -160
  509. package/dist/xyflow/useXYFlowEvents.js +0 -275
  510. package/src/controls/Text.ts +0 -5
  511. package/src/controls/action-button-bar/ActionButtonBar.css.ts +0 -13
  512. package/src/controls/action-button-bar/ActionButtonBar.tsx +0 -138
  513. package/src/controls/action-button-bar/useActionButtonBarCtx.ts +0 -13
  514. package/src/controls/action-buttons/ActionButton.css.ts +0 -29
  515. package/src/controls/action-buttons/ActionButton.tsx +0 -66
  516. package/src/controls/action-buttons/ActionButtons.tsx +0 -138
  517. package/src/hooks/useDiagramState.ts +0 -36
  518. package/src/overlays/OverlayContext.tsx +0 -11
  519. package/src/overlays/Overlays.css.ts +0 -136
  520. package/src/overlays/edge-details/EdgeDetailsXYFlow.tsx +0 -255
  521. package/src/overlays/edge-details/_types.ts +0 -18
  522. package/src/overlays/edge-details/xyflow/CompoundNode.tsx +0 -72
  523. package/src/overlays/edge-details/xyflow/ElementNode.tsx +0 -152
  524. package/src/overlays/edge-details/xyflow/RelationshipEdge.tsx +0 -85
  525. package/src/overlays/edge-details/xyflow/styles.css.ts +0 -144
  526. package/src/overlays/index.tsx +0 -1
  527. package/src/overlays/relationships-of/RelationshipsOverlay.tsx +0 -185
  528. package/src/overlays/relationships-of/RelationshipsXYFlow.tsx +0 -378
  529. package/src/overlays/relationships-of/_types.ts +0 -40
  530. package/src/overlays/relationships-of/use-layouted-relationships.ts +0 -699
  531. package/src/overlays/relationships-of/xyflow/CompoundNode.tsx +0 -124
  532. package/src/overlays/relationships-of/xyflow/ElementNode.tsx +0 -194
  533. package/src/overlays/relationships-of/xyflow/EmptyNode.tsx +0 -19
  534. package/src/overlays/relationships-of/xyflow/RelationshipEdge.tsx +0 -127
  535. package/src/overlays/relationships-of/xyflow/styles.css.ts +0 -214
  536. package/src/overlays/shared/xyflow/RelationshipEdge.css.ts +0 -60
  537. package/src/overlays/shared/xyflow/_types.ts +0 -87
  538. package/src/state/DiagramContext.tsx +0 -107
  539. package/src/state/diagram-to-xyflow.ts +0 -150
  540. package/src/state/diagramStore.layout.ts +0 -66
  541. package/src/state/diagramStore.ts +0 -1099
  542. package/src/ui/top-left/TopLeftPanel.tsx +0 -220
  543. package/src/xyflow/FitviewOnDiagramChange.tsx +0 -83
  544. package/src/xyflow/SelectEdgesOnNodeFocus.tsx +0 -106
  545. package/src/xyflow/XYFlow.tsx +0 -179
  546. package/src/xyflow/XYFlowInner.tsx +0 -48
  547. package/src/xyflow/edges/EdgeLabel.tsx +0 -193
  548. package/src/xyflow/edges/RelationshipEdge.tsx +0 -547
  549. package/src/xyflow/edges/edges.css.ts +0 -288
  550. package/src/xyflow/edges/utils.ts +0 -153
  551. package/src/xyflow/nodes/AnimateVariants.ts +0 -143
  552. package/src/xyflow/nodes/Node.css.ts +0 -44
  553. package/src/xyflow/nodes/compound/CompoundNode.css.ts +0 -258
  554. package/src/xyflow/nodes/compound/CompoundNode.tsx +0 -227
  555. package/src/xyflow/nodes/compound/index.ts +0 -1
  556. package/src/xyflow/nodes/element/ElementLink.css.ts +0 -67
  557. package/src/xyflow/nodes/element/ElementLink.tsx +0 -97
  558. package/src/xyflow/nodes/element/ElementNode.tsx +0 -209
  559. package/src/xyflow/nodes/element/element.css.ts +0 -369
  560. package/src/xyflow/nodes/element/index.ts +0 -1
  561. package/src/xyflow/nodes/shared/ElementIcon.tsx +0 -43
  562. package/src/xyflow/nodes/shared/Toolbar.tsx +0 -496
  563. package/src/xyflow/types.ts +0 -57
  564. package/src/xyflow/useXYFlowEvents.ts +0 -315
  565. /package/dist/{xyflow → base}/const.d.ts +0 -0
  566. /package/dist/{xyflow → base}/const.js +0 -0
  567. /package/dist/{ui → context}/EnsureMantine.d.ts +0 -0
  568. /package/dist/{ui → context}/EnsureMantine.js +0 -0
  569. /package/dist/{ui → context}/FramerMotionConfig.d.ts +0 -0
  570. /package/dist/{xyflow → likec4diagram/custom}/edges/RelationshipsDropdownMenu.css.d.ts +0 -0
  571. /package/dist/{ui/top-left → likec4diagram/ui/controls}/ChangeAutoLayoutButton.d.ts +0 -0
  572. /package/dist/{ui/top-left → likec4diagram/ui/controls}/ManualLayoutToolsButton.d.ts +0 -0
  573. /package/dist/{ui/top-left → likec4diagram/ui/controls}/_shared.d.ts +0 -0
  574. /package/dist/{ui → likec4diagram/ui/diagram-title}/DiagramTitlePanel.css.d.ts +0 -0
  575. /package/dist/{ui → likec4diagram/ui/diagram-title}/Link.js +0 -0
  576. /package/dist/{ui → likec4diagram/ui}/notation/NotationPanel.css.d.ts +0 -0
  577. /package/dist/{ui → likec4diagram/ui}/notation/index.d.ts +0 -0
  578. /package/dist/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.css.d.ts +0 -0
  579. /package/dist/{ui → likec4diagram/ui/walkthrough}/DynamicViewWalkthrough.d.ts +0 -0
  580. /package/src/{ui → context}/EnsureMantine.tsx +0 -0
  581. /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,125 @@
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
+ const xScale = (nodeMargin + (width || 0) / 2) / v.x
33
+ const yScale = (nodeMargin + (height || 0) / 2) / v.y
34
+
35
+ const scale = Math.min(Math.abs(xScale), Math.abs(yScale))
36
+
37
+ return vector(v).mul(scale).add(nodeCenter)
38
+ }
39
+
40
+ /**
41
+ * Helper function returns the intersection point
42
+ * of the line between the center of the intersectionNode and the target
43
+ *
44
+ * @param intersectionNode the node that is the center of the line
45
+ * @param targetNode the target node
46
+ * @returns coordinates of the intersection point
47
+ */
48
+ function getNodeIntersection(
49
+ intersectionNode: InternalNode,
50
+ targetNode: InternalNode,
51
+ ): XYPosition {
52
+ return getNodeIntersectionFromCenterToPoint(intersectionNode, getNodeCenter(targetNode))
53
+ }
54
+
55
+ // returns the position (top,right,bottom or right) passed node compared to the intersection point
56
+ export function getPointPosition(node: InternalNode, intersectionPoint: XYPosition) {
57
+ const n = {
58
+ // x: node.data.element.position[0],
59
+ // y: node.data.element.position[1],
60
+ ...node.internals.positionAbsolute,
61
+ ...getNodeDimensions(node),
62
+ }
63
+ const nx = Math.round(n.x)
64
+ const ny = Math.round(n.y)
65
+ const px = Math.round(intersectionPoint.x)
66
+ const py = Math.round(intersectionPoint.y)
67
+
68
+ let handlePosition = Position.Top
69
+ if (px <= nx + 1) {
70
+ handlePosition = Position.Left
71
+ } else if (px >= nx + n.width - 1) {
72
+ handlePosition = Position.Right
73
+ } else if (py <= ny + 1) {
74
+ handlePosition = Position.Top
75
+ } else if (py >= n.y + n.height - 1) {
76
+ handlePosition = Position.Bottom
77
+ }
78
+
79
+ let handleWidth = 8, handleHeight = 8
80
+
81
+ let offsetX = 0
82
+ let offsetY = 0
83
+
84
+ // this is a tiny detail to make the markerEnd of an edge visible.
85
+ // The handle position that gets calculated has the origin top-left, so depending which side we are using, we add a little offset
86
+ // 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
87
+ switch (handlePosition) {
88
+ case Position.Left:
89
+ offsetX = -handleWidth
90
+ break
91
+ case Position.Right:
92
+ offsetX = handleWidth
93
+ break
94
+ case Position.Top:
95
+ offsetY = -handleHeight
96
+ break
97
+ case Position.Bottom:
98
+ offsetY = handleHeight
99
+ break
100
+ }
101
+
102
+ return [
103
+ intersectionPoint.x + offsetX,
104
+ intersectionPoint.y + offsetY,
105
+ handlePosition,
106
+ ] as const
107
+ }
108
+
109
+ // returns the parameters (sx, sy, tx, ty, sourcePos, targetPos) you need to create an edge
110
+ export function getEdgeParams(source: InternalNode, target: InternalNode) {
111
+ const sourceIntersectionPoint = getNodeIntersection(source, target)
112
+ const targetIntersectionPoint = getNodeIntersection(target, source)
113
+
114
+ const [sx, sy, sourcePos] = getPointPosition(source, sourceIntersectionPoint)
115
+ const [tx, ty, targetPos] = getPointPosition(target, targetIntersectionPoint)
116
+
117
+ return {
118
+ sx,
119
+ sy,
120
+ tx,
121
+ ty,
122
+ sourcePos,
123
+ targetPos,
124
+ }
125
+ }
@@ -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 }