@likec4/diagram 1.19.2 → 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 (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 +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/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 +126 -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 -17
  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
@@ -0,0 +1,247 @@
1
+ import type { Fqn } from '@likec4/core'
2
+ import { ActionIcon, Box, Group } from '@mantine/core'
3
+ import { useCallbackRef, useStateHistory } from '@mantine/hooks'
4
+ import { IconChevronLeft, IconChevronRight, IconX } from '@tabler/icons-react'
5
+ import { Panel, ReactFlowProvider } from '@xyflow/react'
6
+ import clsx from 'clsx'
7
+ import { AnimatePresence, LayoutGroup, m } from 'framer-motion'
8
+ import { memo, useEffect, useRef } from 'react'
9
+ import type { SnapshotFrom } from 'xstate'
10
+ import { BaseXYFlow } from '../../base/BaseXYFlow'
11
+ import { useRelationshipsView } from './-useRelationshipsView'
12
+ import type { RelationshipsBrowserTypes as Types } from './_types'
13
+ import type { RelationshipsBrowserActorRef } from './actor'
14
+ import { edgeTypes } from './custom/edgeTypes'
15
+ import { nodeTypes } from './custom/nodeTypes'
16
+ import {
17
+ RelationshipsBrowserActorContext,
18
+ useRelationshipsBrowser,
19
+ useRelationshipsBrowserState,
20
+ } from './hooks'
21
+ import { SelectElement } from './SelectElement'
22
+
23
+ export type RelationshipsBrowserProps = {
24
+ actorRef: RelationshipsBrowserActorRef
25
+ }
26
+ export function RelationshipsBrowser({ actorRef }: RelationshipsBrowserProps) {
27
+ // const actorRef = useDiagramActorState(s => s.children.relationshipsBrowser)
28
+ // if (actorRef == null) {
29
+ // return null
30
+ // }
31
+ const initialRef = useRef<{
32
+ defaultNodes: Types.Node[]
33
+ defaultEdges: Types.Edge[]
34
+ }>(null)
35
+
36
+ if (initialRef.current == null) {
37
+ initialRef.current = {
38
+ defaultNodes: [],
39
+ defaultEdges: [],
40
+ }
41
+ }
42
+
43
+ return (
44
+ <RelationshipsBrowserActorContext.Provider value={actorRef}>
45
+ <ReactFlowProvider {...initialRef.current}>
46
+ <RelationshipsBrowserInner />
47
+ </ReactFlowProvider>
48
+ </RelationshipsBrowserActorContext.Provider>
49
+ )
50
+ }
51
+
52
+ const selector = (state: SnapshotFrom<RelationshipsBrowserActorRef>) => ({
53
+ subjectId: state.context.subject,
54
+ initialized: state.context.initialized,
55
+ scope: state.context.scope,
56
+ nodes: state.context.xynodes,
57
+ edges: state.context.xyedges,
58
+ closeable: state.context.closeable,
59
+ enableNavigationMenu: state.context.enableNavigationMenu,
60
+ })
61
+
62
+ const RelationshipsBrowserInner = memo(() => {
63
+ const browser = useRelationshipsBrowser()
64
+ const {
65
+ subjectId,
66
+ initialized,
67
+ scope,
68
+ nodes,
69
+ edges,
70
+ closeable,
71
+ enableNavigationMenu,
72
+ } = useRelationshipsBrowserState(selector)
73
+
74
+ const layouted = useRelationshipsView(subjectId)
75
+ const [historySubjectId, historyOps, { history, current }] = useStateHistory(subjectId)
76
+
77
+ useEffect(() => {
78
+ if (historySubjectId !== subjectId) {
79
+ historyOps.set(subjectId)
80
+ }
81
+ }, [subjectId])
82
+
83
+ useEffect(() => {
84
+ if (historySubjectId !== subjectId) {
85
+ browser.navigateTo(historySubjectId)
86
+ }
87
+ }, [historySubjectId])
88
+
89
+ useEffect(() => {
90
+ browser.send({ type: 'update.view', layouted })
91
+ }, [layouted])
92
+
93
+ const hasStepBack = current > 0
94
+ const hasStepForward = current + 1 < history.length
95
+
96
+ return (
97
+ <LayoutGroup>
98
+ <BaseXYFlow<Types.Node, Types.Edge>
99
+ id="relationships-browser"
100
+ nodes={nodes}
101
+ edges={edges}
102
+ className={clsx(initialized ? 'initialized' : 'not-initialized')}
103
+ nodeTypes={nodeTypes}
104
+ edgeTypes={edgeTypes}
105
+ fitViewPadding={0.05}
106
+ onInit={useCallbackRef((instance) => {
107
+ browser.send({ type: 'xyflow.init', instance })
108
+ })}
109
+ onNodeClick={useCallbackRef((e, node) => {
110
+ e.stopPropagation()
111
+ browser.send({ type: 'xyflow.nodeClick', node })
112
+ })}
113
+ onEdgeClick={useCallbackRef((e, edge) => {
114
+ e.stopPropagation()
115
+ browser.send({ type: 'xyflow.edgeClick', edge })
116
+ })}
117
+ onPaneClick={useCallbackRef((e) => {
118
+ e.stopPropagation()
119
+ browser.send({ type: 'xyflow.paneClick' })
120
+ })}
121
+ onDoubleClick={useCallbackRef(e => {
122
+ e.stopPropagation()
123
+ browser.send({ type: 'xyflow.paneDblClick' })
124
+ })}
125
+ onViewportResize={() => {
126
+ browser.send({ type: 'xyflow.resized' })
127
+ }}
128
+ onNodesChange={useCallbackRef((changes) => {
129
+ browser.send({ type: 'xyflow.applyNodeChages', changes })
130
+ })}
131
+ onEdgesChange={useCallbackRef((changes) => {
132
+ browser.send({ type: 'xyflow.applyEdgeChages', changes })
133
+ })}
134
+ nodesDraggable={false}
135
+ fitView={false}
136
+ pannable
137
+ zoomable
138
+ >
139
+ <TopLeftPanel
140
+ enableNavigationMenu={enableNavigationMenu}
141
+ subjectId={subjectId}
142
+ hasStepBack={hasStepBack}
143
+ hasStepForward={hasStepForward}
144
+ onStepBack={() => historyOps.back()}
145
+ onStepForward={() => historyOps.forward()}
146
+ />
147
+ {closeable && (
148
+ <Panel position="top-right">
149
+ <ActionIcon
150
+ variant="default"
151
+ color="gray"
152
+ // color="gray"
153
+ // size={'lg'}
154
+ // data-autofocus
155
+ // autoFocus
156
+ onClick={(e) => {
157
+ e.stopPropagation()
158
+ browser.close()
159
+ }}>
160
+ <IconX />
161
+ </ActionIcon>
162
+ </Panel>
163
+ )}
164
+ </BaseXYFlow>
165
+ </LayoutGroup>
166
+ )
167
+ })
168
+
169
+ type TopLeftPanelProps = {
170
+ enableNavigationMenu: boolean
171
+ subjectId: Fqn
172
+ hasStepBack: boolean
173
+ hasStepForward: boolean
174
+ onStepBack: () => void
175
+ onStepForward: () => void
176
+ }
177
+ const TopLeftPanel = ({
178
+ enableNavigationMenu,
179
+ subjectId,
180
+ hasStepBack,
181
+ hasStepForward,
182
+ onStepBack,
183
+ onStepForward,
184
+ }: TopLeftPanelProps) => {
185
+ const browser = useRelationshipsBrowser()
186
+ return (
187
+ <Panel position="top-left">
188
+ <Group gap={4} wrap={'nowrap'}>
189
+ <AnimatePresence mode="popLayout">
190
+ {hasStepBack && (
191
+ <m.div
192
+ layout
193
+ initial={{ opacity: 0.05, transform: 'translateX(-5px)' }}
194
+ animate={{ opacity: 1, transform: 'translateX(0)' }}
195
+ exit={{
196
+ opacity: 0.05,
197
+ transform: 'translateX(-10px)',
198
+ }}
199
+ key={'back'}>
200
+ <ActionIcon
201
+ variant="default"
202
+ color="gray"
203
+ onClick={e => {
204
+ e.stopPropagation()
205
+ onStepBack()
206
+ }}>
207
+ <IconChevronLeft />
208
+ </ActionIcon>
209
+ </m.div>
210
+ )}
211
+ {hasStepForward && (
212
+ <m.div
213
+ layout
214
+ initial={{ opacity: 0.05, transform: 'translateX(5px)' }}
215
+ animate={{ opacity: 1, transform: 'translateX(0)' }}
216
+ exit={{
217
+ opacity: 0,
218
+ transform: 'translateX(5px)',
219
+ }}
220
+ key={'forward'}>
221
+ <ActionIcon
222
+ variant="default"
223
+ color="gray"
224
+ onClick={e => {
225
+ e.stopPropagation()
226
+ onStepForward()
227
+ }}>
228
+ <IconChevronRight />
229
+ </ActionIcon>
230
+ </m.div>
231
+ )}
232
+ {enableNavigationMenu && (
233
+ <Group gap={'xs'} wrap={'nowrap'} ml={'sm'}>
234
+ <Box fz={'xs'} fw={'500'} style={{ whiteSpace: 'nowrap', userSelect: 'none' }}>Relationships of</Box>
235
+ <SelectElement
236
+ subjectId={subjectId}
237
+ onSelect={(id) => browser.navigateTo(id)}
238
+ viewId={browser.getState().scope?.id ?? '' as any}
239
+ scope={'global'}
240
+ />
241
+ </Group>
242
+ )}
243
+ </AnimatePresence>
244
+ </Group>
245
+ </Panel>
246
+ )
247
+ }
@@ -2,17 +2,24 @@ import { style } from '@vanilla-extract/css'
2
2
  import { mantine, whereDark } from '../../theme-vars'
3
3
 
4
4
  export const node = style({
5
- margin: 0
5
+ margin: 0,
6
6
  })
7
7
 
8
8
  export const label = style({
9
9
  ':hover': {
10
- backgroundColor: mantine.colors.gray[0]
10
+ backgroundColor: mantine.colors.gray[0],
11
11
  },
12
12
  selectors: {
13
13
  [`${whereDark} &:hover`]: {
14
14
  backgroundColor: mantine.colors.defaultHover,
15
- color: mantine.colors.white
16
- }
17
- }
15
+ color: mantine.colors.white,
16
+ },
17
+ },
18
+ })
19
+
20
+ export const scrollArea = style({
21
+ maxHeight: [
22
+ '70vh',
23
+ 'calc(100cqh - 70px)',
24
+ ],
18
25
  })
@@ -1,4 +1,4 @@
1
- import { ancestorsFqn, type Element, type Fqn, type ViewId } from '@likec4/core'
1
+ import { type Fqn, type ViewId, ancestorsFqn } from '@likec4/core'
2
2
  import {
3
3
  ActionIcon,
4
4
  Box,
@@ -11,36 +11,38 @@ import {
11
11
  Text,
12
12
  Tree,
13
13
  useComputedColorScheme,
14
- useTree
14
+ useTree,
15
15
  } from '@mantine/core'
16
16
  import { IconChevronRight, IconSelector } from '@tabler/icons-react'
17
17
  import { useEffect, useRef } from 'react'
18
- import { useLikeC4ElementsTree } from '../../likec4model'
18
+ import { useLikeC4ElementsTree, useLikeC4Model } from '../../likec4model'
19
19
  import * as classes from './SelectElement.css'
20
20
 
21
21
  export const SelectElement = ({
22
- subject,
22
+ subjectId,
23
23
  viewId,
24
24
  scope,
25
- onSelect
25
+ onSelect,
26
26
  }: {
27
- subject: Element
27
+ subjectId: Fqn
28
28
  viewId: ViewId
29
29
  scope: 'global' | 'view'
30
30
  onSelect: (id: Fqn) => void
31
31
  }) => {
32
32
  const viewport = useRef<HTMLDivElement>(null)
33
+ const model = useLikeC4Model(true)
34
+ const subject = model.findElement(subjectId)
33
35
  const data = useLikeC4ElementsTree(scope === 'view' ? viewId : undefined)
34
36
  const tree = useTree({
35
- multiple: false
37
+ multiple: false,
36
38
  })
37
39
 
38
40
  useEffect(() => {
39
- ancestorsFqn(subject.id).reverse().forEach(id => {
41
+ ancestorsFqn(subjectId).reverse().forEach(id => {
40
42
  tree.expand(id)
41
43
  })
42
- tree.select(subject.id)
43
- }, [subject.id])
44
+ tree.select(subjectId)
45
+ }, [subjectId])
44
46
 
45
47
  const theme = useComputedColorScheme()
46
48
 
@@ -54,7 +56,7 @@ export const SelectElement = ({
54
56
  clickOutsideEvents={['pointerdown', 'mousedown', 'click']}
55
57
  onOpen={() => {
56
58
  setTimeout(() => {
57
- const item = viewport.current?.querySelector(`[data-value="${subject.id}"]`)
59
+ const item = viewport.current?.querySelector(`[data-value="${subjectId}"]`)
58
60
  console.log('item', item)
59
61
  item?.scrollIntoView({ behavior: 'instant', block: 'nearest' })
60
62
  }, 100)
@@ -70,11 +72,11 @@ export const SelectElement = ({
70
72
  style={{ padding: '0.25rem 0.75rem' }}
71
73
  rightSection={<IconSelector size={16} />}
72
74
  >
73
- {subject.title}
75
+ {subject?.title ?? '???'}
74
76
  </Button>
75
77
  </PopoverTarget>
76
78
  <PopoverDropdown p={0} miw={250} maw={400}>
77
- <ScrollAreaAutosize mah={'70vh'} scrollbars="y" type="never" viewportRef={viewport}>
79
+ <ScrollAreaAutosize scrollbars="y" type="never" viewportRef={viewport} className={classes.scrollArea}>
78
80
  <Tree
79
81
  allowRangeSelection={false}
80
82
  selectOnClick={false}
@@ -85,8 +87,8 @@ export const SelectElement = ({
85
87
  styles={{
86
88
  label: {
87
89
  paddingTop: 5,
88
- paddingBottom: 6
89
- }
90
+ paddingBottom: 6,
91
+ },
90
92
  }}
91
93
  renderNode={({ node, selected, expanded, elementProps, hasChildren }) => (
92
94
  <Group gap={2} wrap="nowrap" {...elementProps} py="3">
@@ -96,14 +98,14 @@ export const SelectElement = ({
96
98
  // color={theme === 'light' ? 'gray' : 'gray'}
97
99
  c={'dimmed'}
98
100
  style={{
99
- visibility: hasChildren ? 'visible' : 'hidden'
101
+ visibility: hasChildren ? 'visible' : 'hidden',
100
102
  }}>
101
103
  <IconChevronRight
102
104
  stroke={3.5}
103
105
  style={{
104
106
  transition: 'transform 150ms ease',
105
107
  transform: `rotate(${expanded ? '90deg' : '0'})`,
106
- width: '80%'
108
+ width: '80%',
107
109
  }} />
108
110
  </ActionIcon>
109
111
  <Box
@@ -0,0 +1,89 @@
1
+ import type { Color, DiagramNode, Fqn, RelationshipLineType, ViewId } from '@likec4/core'
2
+ import type { Base, NonOptional, ReactFlowEdge, ReactFlowNode } from '../../base/types'
3
+
4
+ export namespace RelationshipsBrowserTypes {
5
+ export type Column = 'incomers' | 'subjects' | 'outgoers'
6
+
7
+ /**
8
+ * The node's incoming and outgoing ports
9
+ */
10
+ export type Ports = {
11
+ in: string[]
12
+ out: string[]
13
+ }
14
+
15
+ export type ElementNodeData = Base.NodeData<
16
+ & NonOptional<
17
+ Pick<
18
+ DiagramNode,
19
+ | 'title'
20
+ | 'technology'
21
+ | 'description'
22
+ | 'color'
23
+ | 'shape'
24
+ | 'width'
25
+ | 'height'
26
+ | 'navigateTo'
27
+ >
28
+ >
29
+ & {
30
+ column: Column
31
+ fqn: Fqn
32
+ icon: string | null
33
+ ports: Ports
34
+ }
35
+ >
36
+
37
+ export type CompoundNodeData = Base.NodeData<
38
+ & NonOptional<
39
+ Pick<
40
+ DiagramNode,
41
+ | 'title'
42
+ | 'color'
43
+ | 'shape'
44
+ | 'style'
45
+ >
46
+ >
47
+ & {
48
+ column: Column
49
+ fqn: Fqn
50
+ depth: number
51
+ icon: string | null
52
+ ports: Ports
53
+ }
54
+ >
55
+
56
+ export type ElementNode = ReactFlowNode<ElementNodeData, 'element'>
57
+
58
+ export type CompoundNode = ReactFlowNode<CompoundNodeData, 'compound'>
59
+
60
+ // export type NonEmptyNode = ElementNode | CompoundNode
61
+
62
+ export type EmptyNodeData = Base.NodeData<{
63
+ column: Column
64
+ }>
65
+
66
+ export type EmptyNode = ReactFlowNode<EmptyNodeData, 'empty'>
67
+
68
+ export type Node = ElementNode | CompoundNode | EmptyNode
69
+ export type NodeData = Node['data']
70
+
71
+ /**
72
+ * Data that is exclusive to the relationships-of overlay. It will be merged into the edge types
73
+ * provided by SharedFlowTypes.
74
+ */
75
+ type RelationshipsOfEdgeData = {
76
+ existsInCurrentView: boolean
77
+ }
78
+
79
+ // Extend the edge types provided by SharedFlowTypes with RelationshipsOfEdgeData
80
+
81
+ export type EdgeData = Base.EdgeData<{
82
+ color: Color | undefined
83
+ label: string | null
84
+ navigateTo: ViewId | null
85
+ line: RelationshipLineType
86
+ }>
87
+
88
+ export type Edge = ReactFlowEdge<EdgeData, 'relationships'>
89
+ }
@@ -0,0 +1,224 @@
1
+ import { type BBox, type DiagramView, type Fqn, invariant } from '@likec4/core'
2
+ import {
3
+ type EdgeChange,
4
+ type NodeChange,
5
+ type ReactFlowInstance,
6
+ applyEdgeChanges,
7
+ applyNodeChanges,
8
+ } from '@xyflow/react'
9
+ import { prop } from 'remeda'
10
+ import {
11
+ type ActorLogic,
12
+ type ActorRefFromLogic,
13
+ type MachineSnapshot,
14
+ type SnapshotFrom,
15
+ assign,
16
+ cancel,
17
+ enqueueActions,
18
+ raise,
19
+ setup,
20
+ } from 'xstate'
21
+ import { MinZoom } from '../../base/const'
22
+ import { updateEdges } from '../../base/updateEdges'
23
+ import { updateNodes } from '../../base/updateNodes'
24
+ import type { LayoutRelationshipsViewResult } from './-useRelationshipsView'
25
+ import type { RelationshipsBrowserTypes } from './_types'
26
+ import { viewToNodesEdge } from './useViewToNodesEdges'
27
+
28
+ type XYFLowInstance = ReactFlowInstance<RelationshipsBrowserTypes.Node, RelationshipsBrowserTypes.Edge>
29
+
30
+ export type Input = {
31
+ subject: Fqn
32
+ scope?: DiagramView | null
33
+ closeable?: boolean
34
+ enableNavigationMenu?: boolean
35
+ // parentRef?: AnyActorRef| null
36
+ }
37
+
38
+ export type Context = Readonly<
39
+ Input & {
40
+ closeable: boolean
41
+ enableNavigationMenu: boolean
42
+ // parentRef: AnyActorRef | null
43
+ xyflow: XYFLowInstance | null
44
+ initialized: boolean
45
+ layouted: LayoutRelationshipsViewResult | null
46
+ xynodes: RelationshipsBrowserTypes.Node[]
47
+ xyedges: RelationshipsBrowserTypes.Edge[]
48
+ }
49
+ >
50
+
51
+ export type Events =
52
+ | { type: 'xyflow.init'; instance: XYFLowInstance }
53
+ | { type: 'xyflow.nodeClick'; node: RelationshipsBrowserTypes.Node }
54
+ | { type: 'xyflow.edgeClick'; edge: RelationshipsBrowserTypes.Edge }
55
+ | { type: 'xyflow.applyNodeChages'; changes: NodeChange<RelationshipsBrowserTypes.Node>[] }
56
+ | { type: 'xyflow.applyEdgeChages'; changes: EdgeChange<RelationshipsBrowserTypes.Edge>[] }
57
+ | { type: 'xyflow.paneClick' }
58
+ | { type: 'xyflow.paneDblClick' }
59
+ | { type: 'xyflow.resized' }
60
+ | { type: 'xyflow.edgeMouseEnter'; edge: RelationshipsBrowserTypes.Edge }
61
+ | { type: 'xyflow.edgeMouseLeave'; edge: RelationshipsBrowserTypes.Edge }
62
+ | { type: 'fitDiagram'; duration?: number; bounds?: BBox }
63
+ | { type: 'navigate.to'; subject: Fqn }
64
+ | { type: 'update.view'; layouted: LayoutRelationshipsViewResult }
65
+ | { type: 'close' }
66
+
67
+ export const relationshipsBrowserActor = setup({
68
+ types: {
69
+ context: {} as Context,
70
+ input: {} as Input,
71
+ events: {} as Events,
72
+ },
73
+ actions: {
74
+ 'xyflow:fitDiagram': ({ context }, params?: { duration?: number; bounds?: BBox }) => {
75
+ const {
76
+ duration = 450,
77
+ bounds,
78
+ } = params ?? {}
79
+ const { xyflow } = context
80
+ invariant(xyflow, 'xyflow is not initialized')
81
+ if (bounds) {
82
+ xyflow.fitBounds(bounds, duration > 0 ? { duration } : undefined)
83
+ } else {
84
+ const maxZoom = Math.max(xyflow.getZoom(), 1)
85
+ xyflow.fitView({
86
+ minZoom: MinZoom,
87
+ maxZoom,
88
+ padding: 0.1,
89
+ ...(duration > 0 && { duration }),
90
+ })
91
+ }
92
+ },
93
+ },
94
+ guards: {
95
+ 'enable: navigate.to': () => true,
96
+ },
97
+ }).createMachine({
98
+ initial: 'waiting-data',
99
+ context: ({ input }) => ({
100
+ ...input,
101
+ closeable: input.closeable ?? true,
102
+ enableNavigationMenu: input.enableNavigationMenu ?? true,
103
+ initialized: false,
104
+ xyflow: null,
105
+ layouted: null,
106
+ xynodes: [],
107
+ xyedges: [],
108
+ }),
109
+ states: {
110
+ 'waiting-data': {
111
+ on: {
112
+ 'update.view': {
113
+ actions: assign(({ event }) => {
114
+ return {
115
+ layouted: event.layouted,
116
+ ...viewToNodesEdge(event.layouted),
117
+ }
118
+ }),
119
+ target: 'opening',
120
+ },
121
+ },
122
+ },
123
+ 'opening': {
124
+ on: {
125
+ 'xyflow.init': {
126
+ actions: assign({
127
+ initialized: true,
128
+ xyflow: ({ event }) => event.instance,
129
+ }),
130
+ target: 'active',
131
+ },
132
+ 'close': {
133
+ target: 'closed',
134
+ },
135
+ },
136
+ },
137
+ 'active': {
138
+ entry: {
139
+ type: 'xyflow:fitDiagram',
140
+ params: { duration: 0 },
141
+ },
142
+ on: {
143
+ 'xyflow.nodeClick': {
144
+ guard: 'enable: navigate.to',
145
+ actions: enqueueActions(({ event, enqueue }) => {
146
+ if ('fqn' in event.node.data) {
147
+ const fqn = event.node.data.fqn
148
+ enqueue.assign({
149
+ subject: fqn,
150
+ })
151
+ }
152
+ }),
153
+ },
154
+ 'navigate.to': {
155
+ guard: 'enable: navigate.to',
156
+ actions: [
157
+ assign({
158
+ subject: ({ event }) => event.subject,
159
+ }),
160
+ ],
161
+ },
162
+ 'xyflow.paneDblClick': {
163
+ actions: 'xyflow:fitDiagram',
164
+ },
165
+ 'update.view': {
166
+ actions: enqueueActions(({ context, event, enqueue }) => {
167
+ const updated = viewToNodesEdge(event.layouted)
168
+ enqueue.assign({
169
+ layouted: event.layouted,
170
+ xynodes: updateNodes(context.xynodes, updated.xynodes),
171
+ xyedges: updateEdges(context.xyedges, updated.xyedges),
172
+ })
173
+ enqueue.raise({ type: 'fitDiagram' }, { delay: 50 })
174
+ }),
175
+ },
176
+ 'close': {
177
+ guard: ({ context }) => context.closeable,
178
+ target: 'closed',
179
+ },
180
+ },
181
+ exit: assign({
182
+ initialized: false,
183
+ xyflow: null,
184
+ }),
185
+ },
186
+ 'closed': {
187
+ type: 'final',
188
+ },
189
+ },
190
+ on: {
191
+ 'fitDiagram': {
192
+ actions: {
193
+ type: 'xyflow:fitDiagram',
194
+ params: prop('event'),
195
+ },
196
+ },
197
+ 'xyflow.resized': {
198
+ actions: [
199
+ cancel('fitDiagram'),
200
+ raise({ type: 'fitDiagram' }, { id: 'fitDiagram', delay: 200 }),
201
+ ],
202
+ },
203
+ 'xyflow.applyNodeChages': {
204
+ actions: assign({
205
+ xynodes: ({ context, event }) => applyNodeChanges(event.changes, context.xynodes),
206
+ }),
207
+ },
208
+ 'xyflow.applyEdgeChages': {
209
+ actions: assign({
210
+ xyedges: ({ context, event }) => applyEdgeChanges(event.changes, context.xyedges),
211
+ }),
212
+ },
213
+ },
214
+ }) as unknown as ActorLogic<
215
+ MachineSnapshot<Context, Events, any, 'opening' | 'active' | 'closed', any, any, any, any>,
216
+ Events,
217
+ Input,
218
+ any,
219
+ any
220
+ > // TODO reduce type inference by forcing the types
221
+
222
+ export type RelationshipsBrowserLogic = typeof relationshipsBrowserActor
223
+ export type RelationshipsBrowserActorRef = ActorRefFromLogic<typeof relationshipsBrowserActor>
224
+ export type RelationshipsBrowserSnapshot = SnapshotFrom<RelationshipsBrowserActorRef>