@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
@@ -0,0 +1,219 @@
1
+ import type { ViewChange, ViewId } from '@likec4/core'
2
+ import { boxToRect, getBoundsOfRects, getNodeDimensions } from '@xyflow/system'
3
+ import { hasAtLeast, reduce } from 'remeda'
4
+ import {
5
+ type ActorRef,
6
+ type ActorRefFromLogic,
7
+ type MachineSnapshot,
8
+ type SnapshotFrom,
9
+ assign,
10
+ setup,
11
+ } from 'xstate'
12
+ import { bezierControlPoints, isSamePoint } from '../../utils'
13
+ import type * as Machine from './machine'
14
+
15
+ export type Input = {
16
+ parent: ActorRef<
17
+ MachineSnapshot<Machine.DiagramContext, Machine.Events, any, any, any, any, any, any>,
18
+ Machine.Events,
19
+ any
20
+ >
21
+ viewId: ViewId
22
+ }
23
+
24
+ export type Context = Readonly<
25
+ Input & {}
26
+ >
27
+
28
+ export type Events =
29
+ | { type: 'sync' }
30
+ | { type: 'synced' }
31
+ | { type: 'cancel' }
32
+ | { type: 'stop' }
33
+ // TODO: naming convention for actors
34
+ export const syncManualLayoutActor = setup({
35
+ types: {
36
+ context: {} as Context,
37
+ input: {} as Input,
38
+ events: {} as Events,
39
+ tags: '' as 'pending' | 'ready',
40
+ },
41
+ delays: {
42
+ 'timeout': 2_000,
43
+ },
44
+ actions: {
45
+ 'trigger:OnChange': (_, _params: { change: ViewChange }) => {
46
+ },
47
+ },
48
+ guards: {
49
+ 'same view': ({ context }) => context.parent.getSnapshot().context.view.id === context.viewId,
50
+ },
51
+ }).createMachine({
52
+ initial: 'idle',
53
+ context: ({ input }) => ({
54
+ ...input,
55
+ // parent: input.parent,
56
+ // viewId: input.parent.getSnapshot().context.view.id,
57
+ }),
58
+ states: {
59
+ idle: {
60
+ tags: 'ready',
61
+ on: {
62
+ sync: {
63
+ target: 'pending',
64
+ },
65
+ },
66
+ },
67
+ paused: {
68
+ tags: 'pending',
69
+ on: {
70
+ sync: {
71
+ target: 'pending',
72
+ },
73
+ },
74
+ },
75
+ pending: {
76
+ tags: 'pending',
77
+ on: {
78
+ sync: {
79
+ target: 'pending',
80
+ reenter: true,
81
+ },
82
+ cancel: {
83
+ target: 'paused',
84
+ },
85
+ },
86
+ after: {
87
+ 'timeout': [{
88
+ guard: 'same view',
89
+ actions: {
90
+ type: 'trigger:OnChange',
91
+ params: ({ context }) => {
92
+ const change = createViewChange(context.parent.getSnapshot().context)
93
+ return { change }
94
+ },
95
+ },
96
+ target: 'synced',
97
+ }, {
98
+ target: 'stopped',
99
+ }],
100
+ },
101
+ },
102
+ synced: {
103
+ tags: 'ready',
104
+ on: {
105
+ sync: {
106
+ target: 'pending',
107
+ },
108
+ },
109
+ },
110
+ 'stopped': {
111
+ entry: assign({
112
+ parent: null as any,
113
+ }),
114
+ type: 'final',
115
+ },
116
+ },
117
+ on: {
118
+ synced: {
119
+ target: '.synced',
120
+ },
121
+ stop: {
122
+ target: '.stopped',
123
+ },
124
+ },
125
+ })
126
+
127
+ export type SyncLayoutActorRef = ActorRefFromLogic<typeof syncManualLayoutActor>
128
+ export type SyncLayoutActorSnapshot = SnapshotFrom<typeof syncManualLayoutActor>
129
+
130
+ function createViewChange(parentContext: Machine.DiagramContext): ViewChange.SaveManualLayout {
131
+ const { view, xystore, xyflow } = parentContext
132
+
133
+ const { nodeLookup } = xystore.getState()
134
+ const movedNodes = new Set<string>()
135
+ let bounds = {
136
+ x: 0,
137
+ y: 0,
138
+ width: 1,
139
+ height: 1,
140
+ }
141
+
142
+ const nodes = reduce([...nodeLookup.values()], (acc, node) => {
143
+ const dimensions = getNodeDimensions(node)
144
+ if (
145
+ !isSamePoint(node.internals.positionAbsolute, node.data.position) || node.initialWidth !== dimensions.width ||
146
+ node.initialHeight !== dimensions.height
147
+ ) {
148
+ movedNodes.add(node.id)
149
+ }
150
+ const rect = acc[node.id] = {
151
+ isCompound: node.type !== 'element' && node.type !== 'deployment',
152
+ x: Math.floor(node.internals.positionAbsolute.x),
153
+ y: Math.floor(node.internals.positionAbsolute.y),
154
+ width: Math.ceil(dimensions.width),
155
+ height: Math.ceil(dimensions.height),
156
+ }
157
+ bounds = getBoundsOfRects(bounds, rect)
158
+ return acc
159
+ }, {} as ViewChange.SaveManualLayout['layout']['nodes'])
160
+
161
+ const edges = reduce(xyflow?.getEdges() ?? [], (acc, { source, target, data }) => {
162
+ let controlPoints = data.controlPoints ?? []
163
+ const sourceOrTargetMoved = movedNodes.has(source) || movedNodes.has(target)
164
+ // If edge control points are not set, but the source or target node was moved
165
+ if (controlPoints.length === 0 && sourceOrTargetMoved) {
166
+ controlPoints = bezierControlPoints(data)
167
+ }
168
+ if (data.points.length === 0 && controlPoints.length === 0) {
169
+ return acc
170
+ }
171
+ const _updated: ViewChange.SaveManualLayout['layout']['edges'][string] = acc[data.id] = {
172
+ points: data.points,
173
+ }
174
+ if (data.labelXY && data.labelBBox) {
175
+ _updated.labelBBox = {
176
+ ...data.labelBBox,
177
+ ...data.labelXY,
178
+ }
179
+ }
180
+ if (data.labelBBox) {
181
+ _updated.labelBBox ??= data.labelBBox
182
+ }
183
+ if (hasAtLeast(controlPoints, 1)) {
184
+ _updated.controlPoints = controlPoints
185
+ }
186
+ // if (!sourceOrTargetMoved && data.edge.dotpos) {
187
+ // _updated.dotpos = data.edge.dotpos
188
+ // }
189
+ const allX = [
190
+ ...data.points.map(p => p[0]),
191
+ ...controlPoints.map(p => p.x),
192
+ ...(_updated.labelBBox ? [_updated.labelBBox.x, _updated.labelBBox.x + _updated.labelBBox.width] : []),
193
+ ]
194
+ const allY = [
195
+ ...data.points.map(p => p[1]),
196
+ ...controlPoints.map(p => p.y),
197
+ ...(_updated.labelBBox ? [_updated.labelBBox.y, _updated.labelBBox.y + _updated.labelBBox.height] : []),
198
+ ]
199
+ const rect = boxToRect({
200
+ x: Math.floor(Math.min(...allX)),
201
+ y: Math.floor(Math.min(...allY)),
202
+ x2: Math.ceil(Math.max(...allX)),
203
+ y2: Math.ceil(Math.max(...allY)),
204
+ })
205
+ bounds = getBoundsOfRects(bounds, rect)
206
+ return acc
207
+ }, {} as ViewChange.SaveManualLayout['layout']['edges'])
208
+
209
+ return {
210
+ op: 'save-manual-layout',
211
+ layout: {
212
+ hash: view.hash,
213
+ autoLayout: view.autoLayout,
214
+ nodes,
215
+ edges,
216
+ ...bounds,
217
+ },
218
+ }
219
+ }
@@ -0,0 +1,52 @@
1
+ import type { BBox, XYPoint } from '@likec4/core'
2
+ import type { DiagramContext } from './machine'
3
+
4
+ export function focusedBounds(params: { context: DiagramContext }): { bounds: BBox; duration?: number } {
5
+ const knownAbsolutes = new Map<string, XYPoint>()
6
+
7
+ const b = params.context.xynodes.reduce((acc, node) => {
8
+ let position = node.position
9
+ if (node.parentId) {
10
+ const parent = knownAbsolutes.get(node.parentId) ?? { x: 0, y: 0 }
11
+ position = {
12
+ x: position.x + parent.x,
13
+ y: position.y + parent.y,
14
+ }
15
+ }
16
+ knownAbsolutes.set(node.id, position)
17
+
18
+ if (node.hidden || node.data.dimmed) {
19
+ return acc
20
+ }
21
+
22
+ const width = node.measured?.width ?? node.width ?? node.initialWidth
23
+ const height = node.measured?.height ?? node.height ?? node.initialHeight
24
+ return {
25
+ minX: Math.min(acc.minX, position.x),
26
+ minY: Math.min(acc.minY, position.y),
27
+ maxX: Math.max(acc.maxX, position.x + width),
28
+ maxY: Math.max(acc.maxY, position.y + height),
29
+ }
30
+ }, {
31
+ minX: Infinity,
32
+ minY: Infinity,
33
+ maxX: -Infinity,
34
+ maxY: -Infinity,
35
+ })
36
+
37
+ if (b.minX === Infinity) {
38
+ return {
39
+ bounds: params.context.view.bounds,
40
+ }
41
+ }
42
+
43
+ return {
44
+ duration: 350,
45
+ bounds: {
46
+ x: b.minX - 10,
47
+ y: b.minY - 10,
48
+ width: b.maxX - b.minX + 20,
49
+ height: b.maxY - b.minY + 20,
50
+ },
51
+ }
52
+ }
@@ -0,0 +1,144 @@
1
+ import type { DiagramEdge, DiagramNode, Fqn, ViewId } from '@likec4/core'
2
+ import type { XYPosition } from '@xyflow/system'
3
+ import type { OptionalKeysOf, Simplify } from 'type-fest'
4
+ import type { Base } from '../base'
5
+ import type { ReactFlowEdge, ReactFlowNode } from '../base/types'
6
+
7
+ type NonOptional<T extends object> = Simplify<
8
+ & {
9
+ [P in Exclude<keyof T, OptionalKeysOf<T>>]: T[P]
10
+ }
11
+ & {
12
+ [P in OptionalKeysOf<T>]-?: T[P] | undefined
13
+ }
14
+ >
15
+
16
+ export namespace Types {
17
+ export type LeafNodeData = Base.NodeData<
18
+ & NonOptional<
19
+ Pick<
20
+ DiagramNode,
21
+ | 'id'
22
+ | 'title'
23
+ | 'technology'
24
+ | 'description'
25
+ | 'color'
26
+ | 'shape'
27
+ | 'width'
28
+ | 'level'
29
+ | 'height'
30
+ | 'style'
31
+ | 'position'
32
+ >
33
+ >
34
+ & {
35
+ icon: string | null
36
+ }
37
+ >
38
+
39
+ /**
40
+ * Represents element from logical model
41
+ */
42
+ export type ElementNodeData = LeafNodeData & {
43
+ modelFqn: Fqn
44
+ deploymentFqn?: never
45
+ /**
46
+ * If set - this node has navigation to another view and diagram has handler for this
47
+ */
48
+ navigateTo: ViewId | null
49
+ }
50
+
51
+ /**
52
+ * Represents element from deployment model
53
+ */
54
+ export type DeploymentElementNodeData =
55
+ & LeafNodeData
56
+ & {
57
+ navigateTo: ViewId | null
58
+ deploymentFqn: Fqn
59
+ // If set - this node refers to a model element
60
+ modelFqn: Fqn | null
61
+ }
62
+
63
+ export type CompoundNodeData = Base.NodeData<
64
+ & NonOptional<
65
+ Pick<
66
+ DiagramNode,
67
+ | 'id'
68
+ | 'title'
69
+ | 'color'
70
+ | 'shape'
71
+ | 'style'
72
+ | 'position'
73
+ >
74
+ >
75
+ & {
76
+ depth: number
77
+ icon: string | null
78
+ }
79
+ >
80
+
81
+ export type CompoundElementNodeData = CompoundNodeData & {
82
+ modelFqn: Fqn
83
+ deploymentFqn?: never
84
+ /**
85
+ * If set - this node has navigation to another view and diagram has handler for this
86
+ */
87
+ navigateTo: ViewId | null
88
+ }
89
+
90
+ export type CompoundDeploymentNodeData = CompoundNodeData & {
91
+ deploymentFqn: Fqn
92
+ /**
93
+ * If set - this node refers to a model element
94
+ */
95
+ modelFqn: Fqn | null
96
+ /**
97
+ * If set - this node has navigation to another view and diagram has handler for this
98
+ */
99
+ navigateTo: ViewId | null
100
+ }
101
+
102
+ export type ViewGroupNodeData = CompoundNodeData & {
103
+ isViewGroup: true
104
+ }
105
+
106
+ // export type CompoundNode = ReactFlowNode<CompoundNodeData, 'compound'>
107
+
108
+ export type ElementNode = ReactFlowNode<ElementNodeData, 'element'>
109
+ export type DeploymentElementNode = ReactFlowNode<DeploymentElementNodeData, 'deployment'>
110
+ export type CompoundElementNode = ReactFlowNode<CompoundElementNodeData, 'compound-element'>
111
+ export type CompoundDeploymentNode = ReactFlowNode<CompoundDeploymentNodeData, 'compound-deployment'>
112
+ export type ViewGroupNode = ReactFlowNode<ViewGroupNodeData, 'view-group'>
113
+
114
+ export type Node = ElementNode | DeploymentElementNode | CompoundElementNode | CompoundDeploymentNode | ViewGroupNode
115
+
116
+ export type NodeData = Node['data']
117
+
118
+ export type RelationshipEdgeData = Base.EdgeData<
119
+ NonOptional<
120
+ Pick<
121
+ DiagramEdge,
122
+ | 'id'
123
+ | 'label'
124
+ | 'labelBBox'
125
+ | 'technology'
126
+ | 'points'
127
+ | 'dir'
128
+ | 'color'
129
+ | 'line'
130
+ | 'head'
131
+ | 'tail'
132
+ | 'navigateTo'
133
+ | 'notes'
134
+ >
135
+ > & {
136
+ labelXY: XYPosition | null
137
+ controlPoints: XYPosition[] | undefined | null
138
+ }
139
+ >
140
+
141
+ export type RelationshipEdge = ReactFlowEdge<RelationshipEdgeData, 'relationship'>
142
+
143
+ export type Edge = RelationshipEdge
144
+ }
@@ -1,43 +1,49 @@
1
1
  import type { AutoLayoutDirection } from '@likec4/core'
2
2
  import {
3
+ type PopoverProps,
3
4
  Box,
4
5
  Flex,
5
6
  FloatingIndicator,
6
7
  Popover,
7
8
  PopoverDropdown,
8
- type PopoverProps,
9
9
  PopoverTarget,
10
10
  Text,
11
- UnstyledButton
11
+ UnstyledButton,
12
12
  } from '@mantine/core'
13
13
  import {
14
+ type UseMovePosition,
14
15
  clampUseMovePosition,
15
16
  useHover,
16
17
  useMergedRef,
17
18
  useMove,
18
- type UseMovePosition,
19
- useUncontrolled
19
+ useUncontrolled,
20
20
  } from '@mantine/hooks'
21
21
  import { useDebouncedCallback } from '@react-hookz/web'
22
22
  import { IconLayoutDashboard } from '@tabler/icons-react'
23
23
  import { forwardRef, useState } from 'react'
24
- import { type DiagramState, useDiagramState, useDiagramStoreApi } from '../../hooks/useDiagramState'
24
+ import { useDiagramEventHandlers } from '../../../context'
25
+ import { useDiagram } from '../../../hooks/useDiagram'
26
+ import { useDiagramContext } from '../../../hooks/useDiagramContext'
27
+ import type { DiagramContext } from '../../state/machine'
25
28
  import { ActionIcon, Tooltip } from './_shared'
26
29
  import * as css from './styles.css'
27
30
 
28
- const selector = (state: DiagramState) => ({
31
+ const selector = (state: DiagramContext) => ({
29
32
  viewId: state.view.id,
30
- autoLayout: state.view.autoLayout
33
+ autoLayout: state.view.autoLayout,
31
34
  })
32
35
 
33
36
  export const ChangeAutoLayoutButton = (props: PopoverProps) => {
34
- const store = useDiagramStoreApi()
37
+ const {
38
+ onChange,
39
+ } = useDiagramEventHandlers()
40
+ const diagram = useDiagram()
35
41
  const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null)
36
42
  const [controlsRefs, setControlsRefs] = useState<Record<AutoLayoutDirection, HTMLButtonElement | null>>({} as any)
37
43
  const {
38
44
  autoLayout,
39
- viewId
40
- } = useDiagramState(selector)
45
+ viewId,
46
+ } = useDiagramContext(selector)
41
47
 
42
48
  const { ref, hovered: isSpacingHovered } = useHover()
43
49
 
@@ -48,31 +54,29 @@ export const ChangeAutoLayoutButton = (props: PopoverProps) => {
48
54
 
49
55
  const setAutoLayout = (direction: AutoLayoutDirection) => (event: React.MouseEvent<HTMLButtonElement>) => {
50
56
  event.stopPropagation()
51
- store.getState().onChange?.({
57
+ onChange?.({
52
58
  change: {
53
59
  op: 'change-autolayout',
54
60
  layout: {
55
61
  ...autoLayout,
56
- direction
57
- }
58
- }
62
+ direction,
63
+ },
64
+ },
59
65
  })
60
66
  }
61
67
 
62
68
  const setSpacing = (nodeSep: number | null, rankSep: number | null) => {
63
69
  // Force fitDiagram
64
- store.setState({
65
- viewportChanged: false
66
- })
67
- store.getState().onChange?.({
70
+ diagram.fitDiagram()
71
+ onChange?.({
68
72
  change: {
69
73
  op: 'change-autolayout',
70
74
  layout: {
71
75
  ...autoLayout,
72
76
  nodeSep,
73
- rankSep
74
- }
75
- }
77
+ rankSep,
78
+ },
79
+ },
76
80
  })
77
81
  }
78
82
 
@@ -80,12 +84,12 @@ export const ChangeAutoLayoutButton = (props: PopoverProps) => {
80
84
  <Popover
81
85
  position="right-start"
82
86
  clickOutsideEvents={[
83
- 'pointerdown'
87
+ 'pointerdown',
84
88
  ]}
85
89
  radius="xs"
86
90
  shadow="lg"
87
91
  offset={{
88
- mainAxis: 10
92
+ mainAxis: 10,
89
93
  }}
90
94
  {...props}>
91
95
  <PopoverTarget>
@@ -146,7 +150,7 @@ const SpacingSliders = forwardRef<HTMLDivElement | null, {
146
150
  isVertical,
147
151
  nodeSep,
148
152
  rankSep,
149
- onChange
153
+ onChange,
150
154
  }, _ref) => {
151
155
  if (!isVertical) {
152
156
  ;[nodeSep, rankSep] = [rankSep, nodeSep]
@@ -161,15 +165,15 @@ const SpacingSliders = forwardRef<HTMLDivElement | null, {
161
165
  },
162
166
  [onChange, isVertical],
163
167
  250,
164
- 2000
168
+ 2000,
165
169
  )
166
170
 
167
171
  const [value, setValue] = useUncontrolled({
168
172
  defaultValue: clampUseMovePosition({
169
173
  x: (nodeSep ?? 100) / MAX_SPACING,
170
- y: (rankSep ?? 120) / MAX_SPACING
174
+ y: (rankSep ?? 120) / MAX_SPACING,
171
175
  }),
172
- onChange: propagateChange
176
+ onChange: propagateChange,
173
177
  })
174
178
 
175
179
  const { ref } = useMove(setValue)
@@ -188,7 +192,7 @@ const SpacingSliders = forwardRef<HTMLDivElement | null, {
188
192
  className={css.spacingSliderThumb}
189
193
  style={{
190
194
  left: `${value.x * 100}%`,
191
- top: `${value.y * 100}%`
195
+ top: `${value.y * 100}%`,
192
196
  }}
193
197
  />
194
198
  <Box pos={'absolute'} left={2} bottom={2}>
@@ -0,0 +1,107 @@
1
+ import { ActionIconGroup, Badge, Loader, Stack } from '@mantine/core'
2
+ import { openSpotlight } from '@mantine/spotlight'
3
+ import { IconFileSymlink, IconFocusCentered, IconSearch } from '@tabler/icons-react'
4
+ import { clsx } from 'clsx'
5
+ import { memo } from 'react'
6
+ import { IfNotEnabled, useDiagramEventHandlers, useEnabledFeatures } from '../../../context'
7
+ import { useMantinePortalProps } from '../../../hooks'
8
+ import { useDiagram } from '../../../hooks/useDiagram'
9
+ import { useDiagramSyncLayoutState } from '../../../hooks/useDiagramActor'
10
+ import { useDiagramContext } from '../../../hooks/useDiagramContext'
11
+ import { stopPropagation } from '../../../utils'
12
+ import { ActionIcon, Tooltip } from './_shared'
13
+ import { ChangeAutoLayoutButton } from './ChangeAutoLayoutButton'
14
+ import { LayoutDriftNotification } from './LayoutDriftNotification'
15
+ import { ManualLayoutToolsButton } from './ManualLayoutToolsButton'
16
+ import { NavigationButtons } from './NavigationButtons'
17
+ import * as css from './styles.css'
18
+
19
+ export const Controls = memo(() => {
20
+ const { viewId, hasLayoutDrift, viewportChanged } = useDiagramContext(c => ({
21
+ viewId: c.view.id,
22
+ hasLayoutDrift: c.view.hasLayoutDrift ?? false,
23
+ viewportChanged: c.viewportChangedManually,
24
+ }))
25
+ const diagram = useDiagram()
26
+ const {
27
+ onOpenSource,
28
+ } = useDiagramEventHandlers()
29
+ const {
30
+ enableControls,
31
+ enableSearch,
32
+ enableNavigationButtons,
33
+ enableReadOnly,
34
+ enableEdgeEditing,
35
+ enableVscode,
36
+ } = useEnabledFeatures()
37
+ const notReadOnly = !enableReadOnly
38
+ const portalProps = useMantinePortalProps()
39
+ return (
40
+ <>
41
+ <Stack
42
+ className={clsx(
43
+ 'react-flow__panel',
44
+ css.panel,
45
+ 'likec4-top-left-panel',
46
+ )}
47
+ align="flex-start"
48
+ onClick={stopPropagation}
49
+ gap={'xs'}>
50
+ {enableNavigationButtons && <NavigationButtons />}
51
+ <ActionIconGroup className={css.actionIconGroup} orientation="vertical">
52
+ {enableControls && enableSearch && (
53
+ <Tooltip label="Search (Ctrl+F or ⌘+F)" {...portalProps}>
54
+ <ActionIcon
55
+ onClick={e => {
56
+ e.stopPropagation()
57
+ openSpotlight()
58
+ }}>
59
+ <IconSearch />
60
+ </ActionIcon>
61
+ </Tooltip>
62
+ )}
63
+ {enableVscode && (
64
+ <Tooltip label="Open source" {...portalProps}>
65
+ <ActionIcon
66
+ onClick={e => {
67
+ e.stopPropagation()
68
+ onOpenSource?.({ view: viewId })
69
+ }}>
70
+ <IconFileSymlink stroke={1.5} />
71
+ </ActionIcon>
72
+ </Tooltip>
73
+ )}
74
+ {enableControls && hasLayoutDrift && <LayoutDriftNotification {...portalProps} />}
75
+ {enableControls && notReadOnly && (
76
+ <>
77
+ <ChangeAutoLayoutButton {...portalProps} />
78
+ <ManualLayoutToolsButton {...portalProps} />
79
+ </>
80
+ )}
81
+ {enableControls && (
82
+ <Tooltip label={viewportChanged ? 'Center camera' : 'Camera is centered'} {...portalProps}>
83
+ <ActionIcon
84
+ onClick={e => {
85
+ e.stopPropagation()
86
+ diagram.fitDiagram()
87
+ }}>
88
+ <IconFocusCentered />
89
+ </ActionIcon>
90
+ </Tooltip>
91
+ )}
92
+ </ActionIconGroup>
93
+ {notReadOnly && <SyncLayoutBadge />}
94
+ </Stack>
95
+ </>
96
+ )
97
+ })
98
+
99
+ const SyncLayoutBadge = () => {
100
+ const isPending = useDiagramSyncLayoutState(s => s.hasTag('pending'))
101
+ if (!isPending) return null
102
+ return (
103
+ <Badge color="pink" radius={'xs'} size="xs" variant="light" leftSection={<Loader color={'orange'} size={8} />}>
104
+ Pending...
105
+ </Badge>
106
+ )
107
+ }