@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,137 @@
1
+ import { type EdgeId, type NodeId, nonNullable } from '@likec4/core'
2
+ import { useCallbackRef } from '@mantine/hooks'
3
+ import clsx from 'clsx'
4
+ import type { EnforceOptional } from 'type-fest/source/enforce-optional'
5
+ import { BaseXYFlow } from '../base'
6
+ import { useDiagramEventHandlers, useEnabledFeature } from '../context'
7
+ import { useDiagram } from '../hooks/useDiagram'
8
+ import { useDiagramContext } from '../hooks/useDiagramContext'
9
+ import type { LikeC4DiagramProperties } from '../LikeC4Diagram.props'
10
+ import { edgeTypes, nodeTypes } from './custom'
11
+ import type { DiagramContext } from './state/machine'
12
+ import type { Types } from './types'
13
+ import { useLayoutConstraints } from './useLayoutConstraints'
14
+
15
+ const selectXYProps = (ctx: DiagramContext) => ({
16
+ initialized: ctx.initialized,
17
+ nodes: ctx.xynodes,
18
+ edges: ctx.xyedges,
19
+ pannable: ctx.pannable,
20
+ zoomable: ctx.zoomable,
21
+ fitViewPadding: ctx.fitViewPadding,
22
+ })
23
+
24
+ type Picked = EnforceOptional<
25
+ Pick<
26
+ LikeC4DiagramProperties,
27
+ | 'background'
28
+ | 'nodesDraggable'
29
+ | 'nodesSelectable'
30
+ >
31
+ >
32
+ export type LikeC4DiagramXYFlowProps = Required<Picked>
33
+
34
+ export const LikeC4DiagramXYFlow = ({ background, ...rest }: LikeC4DiagramXYFlowProps) => {
35
+ const diagram = useDiagram()
36
+ const {
37
+ initialized,
38
+ nodes,
39
+ edges,
40
+ ...props
41
+ } = useDiagramContext(selectXYProps)
42
+
43
+ const {
44
+ onNodeContextMenu,
45
+ onCanvasContextMenu,
46
+ onEdgeContextMenu,
47
+ onNodeClick,
48
+ onEdgeClick,
49
+ onCanvasClick,
50
+ onCanvasDblClick,
51
+ } = useDiagramEventHandlers()
52
+
53
+ const {
54
+ enableFitView,
55
+ enableReadOnly,
56
+ } = useEnabledFeature('ReadOnly', 'FitView')
57
+
58
+ const notReadOnly = !enableReadOnly
59
+
60
+ const layoutConstraints = useLayoutConstraints()
61
+
62
+ return (
63
+ <BaseXYFlow<Types.Node, Types.Edge>
64
+ nodes={nodes}
65
+ edges={edges}
66
+ className={clsx(initialized ? 'initialized' : 'not-initialized')}
67
+ nodeTypes={nodeTypes}
68
+ edgeTypes={edgeTypes}
69
+ onNodesChange={useCallbackRef((changes) => {
70
+ diagram.send({ type: 'xyflow.applyNodeChages', changes })
71
+ })}
72
+ onEdgesChange={useCallbackRef((changes) => {
73
+ diagram.send({ type: 'xyflow.applyEdgeChages', changes })
74
+ })}
75
+ background={initialized ? background : 'transparent'}
76
+ // Fitview is handled in onInit
77
+ fitView={false}
78
+ onNodeClick={useCallbackRef((e, node) => {
79
+ e.stopPropagation()
80
+ diagram.send({ type: 'xyflow.nodeClick', node })
81
+ onNodeClick?.(diagram.findDiagramNode(node.id as NodeId)!, e)
82
+ })}
83
+ onEdgeClick={useCallbackRef((e, edge) => {
84
+ e.stopPropagation()
85
+ diagram.send({ type: 'xyflow.edgeClick', edge })
86
+ onEdgeClick?.(diagram.findDiagramEdge(edge.id as EdgeId)!, e)
87
+ })}
88
+ onPaneClick={useCallbackRef((e) => {
89
+ e.stopPropagation()
90
+ diagram.send({ type: 'xyflow.paneClick' })
91
+ onCanvasClick?.(e as any)
92
+ })}
93
+ onDoubleClick={useCallbackRef(e => {
94
+ e.stopPropagation()
95
+ diagram.send({ type: 'xyflow.paneDblClick' })
96
+ onCanvasDblClick?.(e as any)
97
+ })}
98
+ onMoveEnd={useCallbackRef((event, viewport) => {
99
+ // if event is present, the move was triggered by user
100
+ diagram.send({ type: 'xyflow.viewportMoved', viewport, manually: !!event })
101
+ })}
102
+ onInit={useCallbackRef((instance) => {
103
+ diagram.send({ type: 'xyflow.init', instance })
104
+ })}
105
+ {...onNodeContextMenu && {
106
+ onNodeContextMenu: useCallbackRef((event, node) => {
107
+ const diagramNode = nonNullable(
108
+ diagram.findDiagramNode(node.id as NodeId),
109
+ `diagramNode ${node.id} not found`,
110
+ )
111
+ onNodeContextMenu(diagramNode, event)
112
+ }),
113
+ }}
114
+ {...onEdgeContextMenu && {
115
+ onEdgeContextMenu: useCallbackRef((event, edge) => {
116
+ const diagramEdge = nonNullable(
117
+ diagram.findDiagramEdge(edge.id as EdgeId),
118
+ `diagramEdge ${edge.id} not found`,
119
+ )
120
+ onEdgeContextMenu(diagramEdge, event)
121
+ }),
122
+ }}
123
+ {...onCanvasContextMenu && {
124
+ onPaneContextMenu: useCallbackRef((event) => {
125
+ onCanvasContextMenu(event as any)
126
+ }),
127
+ }}
128
+ {...enableFitView && {
129
+ onViewportResize: () => {
130
+ diagram.send({ type: 'xyflow.resized' })
131
+ },
132
+ }}
133
+ {...(notReadOnly && rest.nodesDraggable && layoutConstraints)}
134
+ {...props}
135
+ {...rest} />
136
+ )
137
+ }
@@ -0,0 +1,27 @@
1
+ import { style } from '@vanilla-extract/css'
2
+ import { mantine } from '../../../theme-vars'
3
+
4
+ export const edgeNoteCloseButton = style({
5
+ position: 'absolute',
6
+ top: 1,
7
+ right: 1,
8
+ zIndex: 9,
9
+ })
10
+
11
+ export const edgeNoteText = style({
12
+ userSelect: 'all',
13
+ textAlign: 'left',
14
+ whiteSpaceCollapse: 'preserve-breaks',
15
+ textWrap: 'pretty',
16
+ lineHeight: 1.25,
17
+ vars: {
18
+ '--text-fz': mantine.fontSizes.sm,
19
+ },
20
+ '@media': {
21
+ [mantine.largerThan('md')]: {
22
+ vars: {
23
+ '--text-fz': mantine.fontSizes.md,
24
+ },
25
+ },
26
+ },
27
+ })
@@ -0,0 +1,96 @@
1
+ import {
2
+ Button,
3
+ CloseButton,
4
+ Group,
5
+ Popover,
6
+ PopoverDropdown,
7
+ PopoverTarget,
8
+ ScrollAreaAutosize,
9
+ Stack,
10
+ Text,
11
+ } from '@mantine/core'
12
+ import { useDebouncedEffect } from '@react-hookz/web'
13
+ import { type PropsWithChildren, useState } from 'react'
14
+ import { isNonNull, isTruthy } from 'remeda'
15
+ import { useMantinePortalProps } from '../../../hooks'
16
+ import { useDiagram } from '../../../hooks/useDiagram'
17
+ import { useDiagramContext } from '../../../hooks/useDiagramContext'
18
+ import { stopPropagation } from '../../../utils'
19
+ import * as edgesCss from './NotePopover.css'
20
+
21
+ export const NotePopover = ({ notes, children }: PropsWithChildren<{ notes: string }>) => {
22
+ const {
23
+ isActive,
24
+ isParallel,
25
+ hasNext,
26
+ hasPrevious,
27
+ } = useDiagramContext(s => ({
28
+ isActive: isNonNull(s.activeWalkthrough),
29
+ isParallel: isTruthy(s.activeWalkthrough?.parallelPrefix),
30
+ hasNext: s.xyedges.findIndex(e => e.id === s.activeWalkthrough?.stepId) < s.xyedges.length - 1,
31
+ hasPrevious: s.xyedges.findIndex(e => e.id === s.activeWalkthrough?.stepId) > 0,
32
+ }))
33
+
34
+ const diagram = useDiagram()
35
+ const [isOpened, setIsOpened] = useState(false)
36
+ const portalProps = useMantinePortalProps()
37
+
38
+ useDebouncedEffect(
39
+ () => {
40
+ setIsOpened(true)
41
+ },
42
+ [],
43
+ 300,
44
+ )
45
+
46
+ return (
47
+ <Popover
48
+ shadow="xs"
49
+ offset={16}
50
+ opened={isOpened}
51
+ closeOnClickOutside={false}
52
+ {...portalProps}>
53
+ <PopoverTarget>
54
+ {children}
55
+ </PopoverTarget>
56
+ <PopoverDropdown
57
+ component={Stack}
58
+ p={'xs'}
59
+ onPointerDownCapture={stopPropagation}
60
+ onClick={stopPropagation}
61
+ onDoubleClick={stopPropagation}
62
+ >
63
+ <ScrollAreaAutosize miw={180} maw={450} mah={350} type="scroll" mx={'auto'} mt={2}>
64
+ <Text component="div" className={edgesCss.edgeNoteText} p={4}>{notes}</Text>
65
+ </ScrollAreaAutosize>
66
+ <CloseButton
67
+ size={'xs'}
68
+ className={edgesCss.edgeNoteCloseButton}
69
+ onClick={() => setIsOpened(false)}
70
+ />
71
+ {(hasPrevious || hasNext) && (
72
+ <Group gap={0} justify={hasPrevious ? 'flex-start' : 'flex-end'}>
73
+ {hasPrevious && (
74
+ <Button
75
+ variant="subtle"
76
+ radius={'xs'}
77
+ size="compact-xs"
78
+ onClick={() => diagram.walkthroughStep('previous')}>
79
+ back
80
+ </Button>
81
+ )}
82
+ {hasNext && (
83
+ <Button
84
+ variant="subtle"
85
+ radius={'xs'}
86
+ size="compact-xs"
87
+ onClick={() => diagram.walkthroughStep('next')}>
88
+ next
89
+ </Button>
90
+ )}
91
+ </Group>
92
+ )}
93
+ </PopoverDropdown>
94
+ </Popover>
95
+ )
96
+ }
@@ -0,0 +1,355 @@
1
+ import {
2
+ type EdgeId,
3
+ type NodeId,
4
+ isStepEdgeId,
5
+ nonNullable,
6
+ } from '@likec4/core'
7
+ import { useDebouncedEffect } from '@react-hookz/web'
8
+ import type { XYPosition } from '@xyflow/react'
9
+ import clsx from 'clsx'
10
+ import { curveCatmullRomOpen, line as d3line } from 'd3-shape'
11
+ import { type PointerEvent as ReactPointerEvent, useEffect, useRef, useState } from 'react'
12
+ import { first, isTruthy, last } from 'remeda'
13
+ import { customEdge, EdgeActionButton, EdgeContainer, EdgeLabel, EdgePath } from '../../../base/primitives'
14
+ import { useEnabledFeature } from '../../../context'
15
+ import { useXYFlow, useXYInternalNode, useXYStoreApi } from '../../../hooks'
16
+ import { useDiagram } from '../../../hooks/useDiagram'
17
+ import { vector, VectorImpl } from '../../../utils/vector'
18
+ import { bezierControlPoints, bezierPath, isSamePoint } from '../../../utils/xyflow'
19
+ import type { Types } from '../../types'
20
+ import * as edgesCss from './edges.css'
21
+ import { NotePopover } from './NotePopover'
22
+ import { RelationshipsDropdownMenu } from './RelationshipsDropdownMenu'
23
+ import { getNodeIntersectionFromCenterToPoint } from './utils'
24
+
25
+ const curve = d3line<XYPosition>()
26
+ .curve(curveCatmullRomOpen)
27
+ .x(d => d.x)
28
+ .y(d => d.y)
29
+
30
+ export const RelationshipEdge = customEdge<Types.RelationshipEdgeData>((props) => {
31
+ const [isControlPointDragging, setIsControlPointDragging] = useState(false)
32
+ const xyflowStore = useXYStoreApi()
33
+ const xyflow = useXYFlow()
34
+ const diagram = useDiagram()
35
+ const { enableNavigateTo, enableEdgeEditing, enableRelationshipDetails } = useEnabledFeature(
36
+ 'NavigateTo',
37
+ 'EdgeEditing',
38
+ 'RelationshipDetails',
39
+ )
40
+ const {
41
+ id,
42
+ source,
43
+ sourceX,
44
+ sourceY,
45
+ target,
46
+ targetX,
47
+ targetY,
48
+ data: {
49
+ id: edgeId,
50
+ navigateTo,
51
+ points,
52
+ active = false,
53
+ dimmed = false,
54
+ labelBBox,
55
+ labelXY,
56
+ ...data
57
+ },
58
+ } = props
59
+
60
+ const sourceNode = nonNullable(useXYInternalNode(source)!, `source node ${source} not found`)
61
+ const targetNode = nonNullable(useXYInternalNode(target)!, `target node ${target} not found`)
62
+
63
+ const isModified = isTruthy(data.controlPoints)
64
+ || !isSamePoint(sourceNode.internals.positionAbsolute, sourceNode.data.position)
65
+ || !isSamePoint(targetNode.internals.positionAbsolute, targetNode.data.position)
66
+
67
+ let controlPoints = data.controlPoints ?? bezierControlPoints(props.data)
68
+
69
+ let edgePath: string
70
+
71
+ if (isModified) {
72
+ const sourceCenterPos = { x: sourceX, y: sourceY }
73
+ const targetCenterPos = { x: targetX, y: targetY }
74
+
75
+ const nodeMargin = 6
76
+ const points = data.dir === 'back'
77
+ ? [
78
+ targetCenterPos,
79
+ getNodeIntersectionFromCenterToPoint(targetNode, first(controlPoints) ?? sourceCenterPos, nodeMargin),
80
+ ...controlPoints,
81
+ getNodeIntersectionFromCenterToPoint(sourceNode, last(controlPoints) ?? targetCenterPos, nodeMargin),
82
+ sourceCenterPos,
83
+ ]
84
+ : [
85
+ sourceCenterPos,
86
+ getNodeIntersectionFromCenterToPoint(sourceNode, first(controlPoints) ?? targetCenterPos, nodeMargin),
87
+ ...controlPoints,
88
+ getNodeIntersectionFromCenterToPoint(targetNode, last(controlPoints) ?? sourceCenterPos, nodeMargin),
89
+ targetCenterPos,
90
+ ]
91
+
92
+ edgePath = nonNullable(curve(points))
93
+ } else {
94
+ edgePath = bezierPath(points)
95
+ }
96
+
97
+ let labelX = labelBBox?.x ?? 0,
98
+ labelY = labelBBox?.y ?? 0
99
+
100
+ const [labelPos, setLabelPos] = useState<XYPosition>({
101
+ x: labelXY?.x ?? labelX,
102
+ y: labelXY?.y ?? labelY,
103
+ })
104
+
105
+ const svgPathRef = useRef<SVGPathElement>(null)
106
+ useEffect(() => {
107
+ const path = svgPathRef.current
108
+ if (!path) return
109
+ const dompoint = path.getPointAtLength(path.getTotalLength() * 0.5)
110
+ const point = {
111
+ x: Math.round(dompoint.x),
112
+ y: Math.round(dompoint.y),
113
+ }
114
+ setLabelPos(current => isSamePoint(current, point) ? current : point)
115
+ }, [edgePath])
116
+
117
+ useDebouncedEffect(
118
+ () => {
119
+ if (!labelBBox || labelBBox.x === labelPos.x && labelBBox.y === labelPos.y) {
120
+ return
121
+ }
122
+ // This update stays only in internal xystate, not in diagram xstate
123
+ xyflow.updateEdgeData(id, {
124
+ labelXY: {
125
+ x: labelPos.x,
126
+ y: labelPos.y,
127
+ },
128
+ })
129
+ },
130
+ [labelPos],
131
+ 50,
132
+ 300,
133
+ )
134
+
135
+ if (isModified || isControlPointDragging) {
136
+ labelX = labelPos.x
137
+ labelY = labelPos.y
138
+ }
139
+
140
+ const onLmbControlPointerDown = (index: number, e: ReactPointerEvent<SVGCircleElement>, domNode: HTMLDivElement) => {
141
+ const { addSelectedEdges } = xyflowStore.getState()
142
+
143
+ addSelectedEdges([id])
144
+
145
+ const wasCanceled = diagram.cancelSaveManualLayout()
146
+ e.stopPropagation()
147
+ let hasMoved = false
148
+ let pointer = { x: e.clientX, y: e.clientY }
149
+
150
+ const onPointerMove = (e: PointerEvent) => {
151
+ const clientPoint = {
152
+ x: e.clientX,
153
+ y: e.clientY,
154
+ }
155
+ if (!isSamePoint(pointer, clientPoint)) {
156
+ setIsControlPointDragging(true)
157
+ hasMoved = true
158
+ pointer = clientPoint
159
+ const { x, y } = xyflow.screenToFlowPosition(pointer, { snapToGrid: false })
160
+ xyflow.updateEdgeData(id, xyedge => {
161
+ const cp = (xyedge.data.controlPoints ?? controlPoints).slice()
162
+ cp[index] = {
163
+ x: Math.round(x),
164
+ y: Math.round(y),
165
+ }
166
+ return {
167
+ controlPoints: cp,
168
+ }
169
+ })
170
+ }
171
+ e.stopPropagation()
172
+ }
173
+
174
+ const onPointerUp = (e: PointerEvent) => {
175
+ domNode.removeEventListener('pointermove', onPointerMove, {
176
+ capture: true,
177
+ })
178
+ if (hasMoved) {
179
+ e.stopPropagation()
180
+ }
181
+ if (hasMoved || wasCanceled) {
182
+ diagram.scheduleSaveManualLayout()
183
+ }
184
+ setIsControlPointDragging(false)
185
+ }
186
+
187
+ domNode.addEventListener('pointermove', onPointerMove, {
188
+ capture: true,
189
+ })
190
+ domNode.addEventListener('pointerup', onPointerUp, {
191
+ once: true,
192
+ capture: true,
193
+ })
194
+ }
195
+
196
+ const onRmbControlPointerDown = (index: number, e: ReactPointerEvent<SVGCircleElement>, domNode: HTMLDivElement) => {
197
+ if (controlPoints.length <= 1) {
198
+ return
199
+ }
200
+
201
+ const onPointerUp = (e: PointerEvent) => {
202
+ const newControlPoints = controlPoints.slice()
203
+ newControlPoints.splice(index, 1)
204
+ e.stopPropagation()
205
+ // Defer the update to avoid conflict with the pointerup event
206
+ setTimeout(() => {
207
+ xyflow.updateEdgeData(id as EdgeId, { controlPoints: newControlPoints })
208
+ diagram.scheduleSaveManualLayout()
209
+ }, 10)
210
+
211
+ domNode.removeEventListener('pointerup', onPointerUp, {
212
+ capture: true,
213
+ })
214
+ e.stopPropagation()
215
+ }
216
+
217
+ domNode.addEventListener('pointerup', onPointerUp, {
218
+ once: true,
219
+ capture: true,
220
+ })
221
+
222
+ e.stopPropagation()
223
+ }
224
+
225
+ const onControlPointerDown = (index: number, e: ReactPointerEvent<SVGCircleElement>) => {
226
+ const { domNode } = xyflowStore.getState()
227
+ if (!domNode || e.pointerType !== 'mouse') {
228
+ return
229
+ }
230
+
231
+ switch (e.button) {
232
+ case 0:
233
+ onLmbControlPointerDown(index, e, domNode)
234
+ break
235
+ case 2:
236
+ onRmbControlPointerDown(index, e, domNode)
237
+ break
238
+ }
239
+ }
240
+
241
+ const onEdgePointerDown = (e: ReactPointerEvent<SVGElement>) => {
242
+ const { domNode } = xyflowStore.getState()
243
+
244
+ if (!domNode || e.pointerType !== 'mouse') {
245
+ return
246
+ }
247
+ if (e.button !== 2) {
248
+ return
249
+ }
250
+
251
+ xyflow.updateEdgeData(id, edge => {
252
+ const points: VectorImpl[] = [
253
+ new VectorImpl(sourceX, sourceY),
254
+ ...controlPoints.map(vector) || [],
255
+ new VectorImpl(targetX, targetY),
256
+ ]
257
+
258
+ let pointer = { x: e.clientX, y: e.clientY }
259
+ const newPoint = vector(xyflow.screenToFlowPosition(pointer, { snapToGrid: false }))
260
+
261
+ let insertionIndex = 0
262
+ let minDistance = Infinity
263
+ for (let i = 0; i < points.length - 1; i++) {
264
+ const a = points[i]!, b = points[i + 1]!
265
+ const fromCurrentToNext = b.sub(a)
266
+ const fromCurrentToNew = newPoint.sub(a)
267
+ const fromNextToNew = newPoint.sub(b)
268
+
269
+ // Is pointer above the current segment?
270
+ if (fromCurrentToNext.dot(fromCurrentToNew) * fromCurrentToNext.dot(fromNextToNew) < 0) {
271
+ // Calculate distance by approximating edge segment with a staight line
272
+ const distanceToEdge = Math.abs(fromCurrentToNext.cross(fromCurrentToNew).abs() / fromCurrentToNext.abs())
273
+
274
+ if (distanceToEdge < minDistance) {
275
+ minDistance = distanceToEdge
276
+ insertionIndex = i
277
+ }
278
+ }
279
+ }
280
+
281
+ const newControlPoints = edge.data.controlPoints?.slice() || []
282
+ newControlPoints.splice(insertionIndex, 0, newPoint)
283
+
284
+ return { controlPoints: newControlPoints }
285
+ })
286
+
287
+ diagram.scheduleSaveManualLayout()
288
+
289
+ e.stopPropagation()
290
+ }
291
+
292
+ let renderLabel: undefined | ((props: any) => any)
293
+ if (!isControlPointDragging) {
294
+ const notes = props.data.notes
295
+ if (notes && isStepEdgeId(props.id) && diagram.getState().context.activeWalkthrough?.stepId === props.id) {
296
+ renderLabel = (props: any) => (
297
+ <NotePopover notes={notes}>
298
+ <div {...props} />
299
+ </NotePopover>
300
+ )
301
+ } else if (enableRelationshipDetails) {
302
+ renderLabel = (props: any) => (
303
+ <RelationshipsDropdownMenu
304
+ disabled={!!dimmed}
305
+ source={source}
306
+ target={target}
307
+ edgeId={edgeId}>
308
+ <div {...props} />
309
+ </RelationshipsDropdownMenu>
310
+ )
311
+ }
312
+ }
313
+
314
+ return (
315
+ <EdgeContainer {...props} className={clsx(isControlPointDragging && edgesCss.controlDragging)}>
316
+ <EdgePath {...props} svgPath={edgePath} ref={svgPathRef} onEdgePointerDown={onEdgePointerDown} />
317
+ {enableEdgeEditing && (
318
+ <g
319
+ onContextMenu={e => {
320
+ e.preventDefault()
321
+ e.stopPropagation()
322
+ }}>
323
+ {controlPoints.map((p, i) => (
324
+ <circle
325
+ onPointerDown={e => onControlPointerDown(i, e)}
326
+ className={edgesCss.controlPoint}
327
+ key={i}
328
+ cx={p.x}
329
+ cy={p.y}
330
+ r={3}
331
+ />
332
+ ))}
333
+ </g>
334
+ )}
335
+ <EdgeLabel
336
+ edgeProps={props}
337
+ labelPosition={{
338
+ x: labelX,
339
+ y: labelY,
340
+ translate: isModified ? 'translate(-50%, 0)' : undefined,
341
+ }}
342
+ {...renderLabel && { renderRoot: renderLabel }}
343
+ >
344
+ {!isControlPointDragging && enableNavigateTo && navigateTo && (
345
+ <EdgeActionButton
346
+ {...props}
347
+ onClick={e => {
348
+ e.stopPropagation()
349
+ diagram.navigateTo(navigateTo)
350
+ }} />
351
+ )}
352
+ </EdgeLabel>
353
+ </EdgeContainer>
354
+ )
355
+ })
@@ -1,9 +1,9 @@
1
1
  import { style } from '@vanilla-extract/css'
2
- import { mantine, vars } from '../../theme-vars'
2
+ import { mantine, vars } from '../../../theme-vars'
3
3
 
4
4
  export const menuDropdown = style({
5
5
  minWidth: 250,
6
- maxWidth: 'min(90vw, 500px)'
6
+ maxWidth: 'min(90vw, 500px)',
7
7
  })
8
8
 
9
9
  export const menuItemRelationship = style({
@@ -12,7 +12,7 @@ export const menuItemRelationship = style({
12
12
  // borderRadius: mantine.radius.sm,
13
13
  // paddingTop: mantine.spacing.xs,
14
14
  // paddingBottom: mantine.spacing.xs,
15
- gap: 4
15
+ gap: 4,
16
16
  // cursor: 'pointer',
17
17
  // ':hover': {
18
18
  // borderColor: mantine.colors.gray.light,
@@ -40,14 +40,14 @@ export const endpoint = style({
40
40
  lineHeight: 1.1,
41
41
  selectors: {
42
42
  [`:where([data-mantine-color-scheme="dark"]) &`]: {
43
- color: vars.element.loContrast
44
- }
45
- }
43
+ color: vars.element.loContrast,
44
+ },
45
+ },
46
46
  })
47
47
 
48
48
  export const title = style({
49
49
  whiteSpaceCollapse: 'preserve-breaks',
50
- fontSize: mantine.fontSizes.sm
50
+ fontSize: mantine.fontSizes.sm,
51
51
  })
52
52
  //
53
53
  // export const sourceId = style({