@likec4/diagram 1.17.1 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/LICENSE +1 -1
  2. package/dist/LikeC4CustomColors.d.ts +7 -0
  3. package/dist/LikeC4CustomColors.js +30 -0
  4. package/dist/LikeC4Diagram.css.d.ts +5 -0
  5. package/dist/LikeC4Diagram.css.js +13 -0
  6. package/dist/LikeC4Diagram.d.ts +6 -0
  7. package/dist/LikeC4Diagram.js +194 -0
  8. package/dist/LikeC4Diagram.props.d.ts +166 -0
  9. package/dist/LikeC4ModelProvider.d.ts +9 -0
  10. package/dist/LikeC4ModelProvider.js +12 -0
  11. package/dist/LikeC4Search.css.d.ts +1 -0
  12. package/dist/LikeC4Search.css.js +5 -0
  13. package/dist/LikeC4Search.d.ts +2 -0
  14. package/dist/LikeC4Search.js +96 -0
  15. package/dist/StaticLikeC4Diagram.d.ts +3 -0
  16. package/dist/StaticLikeC4Diagram.js +41 -0
  17. package/dist/_virtual/_commonjsHelpers.js +6 -0
  18. package/dist/controls/Text.d.ts +2 -0
  19. package/dist/controls/Text.js +7 -0
  20. package/dist/controls/action-button-bar/ActionButtonBar.css.d.ts +1 -0
  21. package/dist/controls/action-button-bar/ActionButtonBar.css.js +5 -0
  22. package/dist/controls/action-button-bar/ActionButtonBar.d.ts +9 -0
  23. package/dist/controls/action-button-bar/ActionButtonBar.js +100 -0
  24. package/dist/controls/action-button-bar/useActionButtonBarCtx.d.ts +10 -0
  25. package/dist/controls/action-button-bar/useActionButtonBarCtx.js +9 -0
  26. package/dist/controls/action-buttons/ActionButton.css.d.ts +1 -0
  27. package/dist/controls/action-buttons/ActionButton.css.js +5 -0
  28. package/dist/controls/action-buttons/ActionButton.d.ts +9 -0
  29. package/dist/controls/action-buttons/ActionButton.js +66 -0
  30. package/dist/controls/action-buttons/ActionButtons.d.ts +12 -0
  31. package/dist/controls/action-buttons/ActionButtons.js +99 -0
  32. package/dist/globals.css.d.ts +1 -0
  33. package/dist/globals.css.js +92 -0
  34. package/dist/hooks/index.d.ts +5 -0
  35. package/dist/hooks/useDiagramState.d.ts +6 -0
  36. package/dist/hooks/useDiagramState.js +27 -0
  37. package/dist/hooks/useMantinePortalProps.d.ts +9 -0
  38. package/dist/hooks/useMantinePortalProps.js +9 -0
  39. package/dist/hooks/useSetState.d.ts +2 -0
  40. package/dist/hooks/useSetState.js +19 -0
  41. package/dist/hooks/useUpdateEffect.d.ts +4 -0
  42. package/dist/hooks/useUpdateEffect.js +32 -0
  43. package/dist/hooks/useXYFlow.d.ts +270 -0
  44. package/dist/hooks/useXYFlow.js +20 -0
  45. package/dist/index.d.ts +11 -0
  46. package/dist/index.js +25 -0
  47. package/dist/likec4model/LikeC4ModelContext.d.ts +3 -0
  48. package/dist/likec4model/LikeC4ModelContext.js +5 -0
  49. package/dist/likec4model/index.d.ts +2 -0
  50. package/dist/likec4model/useLikeC4ElementsTree.d.ts +12 -0
  51. package/dist/likec4model/useLikeC4ElementsTree.js +25 -0
  52. package/dist/likec4model/useLikeC4Model.d.ts +20 -0
  53. package/dist/likec4model/useLikeC4Model.js +55 -0
  54. package/dist/overlays/OverlayContext.d.ts +10 -0
  55. package/dist/overlays/OverlayContext.js +9 -0
  56. package/dist/overlays/Overlays.css.d.ts +3 -0
  57. package/dist/overlays/Overlays.css.js +7 -0
  58. package/dist/overlays/Overlays.d.ts +2 -0
  59. package/dist/overlays/Overlays.js +137 -0
  60. package/dist/overlays/edge-details/EdgeDetailsXYFlow.d.ts +5 -0
  61. package/dist/overlays/edge-details/EdgeDetailsXYFlow.js +185 -0
  62. package/dist/overlays/edge-details/SelectEdge.css.d.ts +7 -0
  63. package/dist/overlays/edge-details/SelectEdge.css.js +17 -0
  64. package/dist/overlays/edge-details/SelectEdge.d.ts +5 -0
  65. package/dist/overlays/edge-details/SelectEdge.js +129 -0
  66. package/dist/overlays/edge-details/_types.d.ts +14 -0
  67. package/dist/overlays/edge-details/use-layouted-edge-details.d.ts +21 -0
  68. package/dist/overlays/edge-details/use-layouted-edge-details.js +270 -0
  69. package/dist/overlays/edge-details/xyflow/CompoundNode.d.ts +5 -0
  70. package/dist/overlays/edge-details/xyflow/CompoundNode.js +76 -0
  71. package/dist/overlays/edge-details/xyflow/ElementNode.d.ts +5 -0
  72. package/dist/overlays/edge-details/xyflow/ElementNode.js +159 -0
  73. package/dist/overlays/edge-details/xyflow/RelationshipEdge.d.ts +3 -0
  74. package/dist/overlays/edge-details/xyflow/RelationshipEdge.js +84 -0
  75. package/dist/overlays/edge-details/xyflow/styles.css.d.ts +9 -0
  76. package/dist/overlays/edge-details/xyflow/styles.css.js +21 -0
  77. package/dist/overlays/element-details/ElementDetailsCard.css.d.ts +16 -0
  78. package/dist/overlays/element-details/ElementDetailsCard.css.js +33 -0
  79. package/dist/overlays/element-details/ElementDetailsCard.d.ts +7 -0
  80. package/dist/overlays/element-details/ElementDetailsCard.js +484 -0
  81. package/dist/overlays/element-details/TabPanelDeployments.css.d.ts +4 -0
  82. package/dist/overlays/element-details/TabPanelDeployments.css.js +11 -0
  83. package/dist/overlays/element-details/TabPanelDeployments.d.ts +7 -0
  84. package/dist/overlays/element-details/TabPanelDeployments.js +173 -0
  85. package/dist/overlays/element-details/TabPanelRelationships.css.d.ts +5 -0
  86. package/dist/overlays/element-details/TabPanelRelationships.css.js +11 -0
  87. package/dist/overlays/element-details/TabPanelRelationships.d.ts +8 -0
  88. package/dist/overlays/element-details/TabPanelRelationships.js +157 -0
  89. package/dist/overlays/element-details/TabPanelStructure.css.d.ts +2 -0
  90. package/dist/overlays/element-details/TabPanelStructure.css.js +7 -0
  91. package/dist/overlays/element-details/TabPanelStructure.d.ts +25 -0
  92. package/dist/overlays/element-details/TabPanelStructure.js +91 -0
  93. package/dist/overlays/index.d.ts +1 -0
  94. package/dist/overlays/relationships-of/RelationshipsOverlay.d.ts +5 -0
  95. package/dist/overlays/relationships-of/RelationshipsOverlay.js +193 -0
  96. package/dist/overlays/relationships-of/RelationshipsXYFlow.d.ts +19 -0
  97. package/dist/overlays/relationships-of/RelationshipsXYFlow.js +290 -0
  98. package/dist/overlays/relationships-of/SelectElement.css.d.ts +2 -0
  99. package/dist/overlays/relationships-of/SelectElement.css.js +7 -0
  100. package/dist/overlays/relationships-of/SelectElement.d.ts +7 -0
  101. package/dist/overlays/relationships-of/SelectElement.js +126 -0
  102. package/dist/overlays/relationships-of/_types.d.ts +28 -0
  103. package/dist/overlays/relationships-of/use-layouted-relationships.d.ts +22 -0
  104. package/dist/overlays/relationships-of/use-layouted-relationships.js +496 -0
  105. package/dist/overlays/relationships-of/xyflow/CompoundNode.d.ts +6 -0
  106. package/dist/overlays/relationships-of/xyflow/CompoundNode.js +120 -0
  107. package/dist/overlays/relationships-of/xyflow/ElementNode.d.ts +6 -0
  108. package/dist/overlays/relationships-of/xyflow/ElementNode.js +194 -0
  109. package/dist/overlays/relationships-of/xyflow/EmptyNode.d.ts +5 -0
  110. package/dist/overlays/relationships-of/xyflow/EmptyNode.js +18 -0
  111. package/dist/overlays/relationships-of/xyflow/RelationshipEdge.d.ts +3 -0
  112. package/dist/overlays/relationships-of/xyflow/RelationshipEdge.js +123 -0
  113. package/dist/overlays/relationships-of/xyflow/styles.css.d.ts +14 -0
  114. package/dist/overlays/relationships-of/xyflow/styles.css.js +24 -0
  115. package/dist/overlays/shared/xyflow/RelationshipEdge.css.d.ts +4 -0
  116. package/dist/overlays/shared/xyflow/RelationshipEdge.css.js +12 -0
  117. package/dist/overlays/shared/xyflow/_types.d.ts +77 -0
  118. package/dist/state/DiagramContext.d.ts +1609 -0
  119. package/dist/state/DiagramContext.js +101 -0
  120. package/dist/state/aligners.d.ts +42 -0
  121. package/dist/state/aligners.js +349 -0
  122. package/dist/state/diagram-to-xyflow.d.ts +11 -0
  123. package/dist/state/diagram-to-xyflow.js +113 -0
  124. package/dist/state/diagramStore.d.ts +1705 -0
  125. package/dist/state/diagramStore.js +808 -0
  126. package/dist/state/diagramStore.layout.d.ts +4 -0
  127. package/dist/state/diagramStore.layout.js +56 -0
  128. package/dist/style.css +1 -0
  129. package/dist/theme-vars.css.d.ts +72 -0
  130. package/dist/theme-vars.css.js +6 -0
  131. package/dist/theme-vars.css.ts.vanilla.css.js +1 -0
  132. package/dist/theme-vars.d.ts +3 -0
  133. package/dist/theme-vars.js +5 -0
  134. package/dist/ui/DiagramTitlePanel.css.d.ts +4 -0
  135. package/dist/ui/DiagramTitlePanel.css.js +11 -0
  136. package/dist/ui/DiagramTitlePanel.d.ts +1 -0
  137. package/dist/ui/DiagramTitlePanel.js +159 -0
  138. package/dist/ui/DynamicViewWalkthrough.css.d.ts +4 -0
  139. package/dist/ui/DynamicViewWalkthrough.css.js +11 -0
  140. package/dist/ui/DynamicViewWalkthrough.d.ts +1 -0
  141. package/dist/ui/DynamicViewWalkthrough.js +156 -0
  142. package/dist/ui/EnsureMantine.d.ts +7 -0
  143. package/dist/ui/EnsureMantine.js +14 -0
  144. package/dist/ui/FramerMotionConfig.d.ts +2 -0
  145. package/dist/ui/FramerMotionConfig.js +14 -0
  146. package/dist/ui/Link.d.ts +4 -0
  147. package/dist/ui/Link.js +36 -0
  148. package/dist/ui/notation/NotationPanel.css.d.ts +6 -0
  149. package/dist/ui/notation/NotationPanel.css.js +16 -0
  150. package/dist/ui/notation/NotationPanel.d.ts +1 -0
  151. package/dist/ui/notation/NotationPanel.js +250 -0
  152. package/dist/ui/notation/index.d.ts +1 -0
  153. package/dist/ui/top-left/ChangeAutoLayoutButton.d.ts +2 -0
  154. package/dist/ui/top-left/ChangeAutoLayoutButton.js +159 -0
  155. package/dist/ui/top-left/ManualLayoutToolsButton.d.ts +2 -0
  156. package/dist/ui/top-left/ManualLayoutToolsButton.js +137 -0
  157. package/dist/ui/top-left/TopLeftPanel.d.ts +4 -0
  158. package/dist/ui/top-left/TopLeftPanel.js +211 -0
  159. package/dist/ui/top-left/_shared.d.ts +7 -0
  160. package/dist/ui/top-left/_shared.js +22 -0
  161. package/dist/ui/top-left/styles.css.d.ts +8 -0
  162. package/dist/ui/top-left/styles.css.js +17 -0
  163. package/dist/utils/types.d.ts +8 -0
  164. package/dist/utils/vector.d.ts +24 -0
  165. package/dist/utils/vector.js +55 -0
  166. package/dist/xyflow/EdgeMarkers.d.ts +12 -0
  167. package/dist/xyflow/EdgeMarkers.js +192 -0
  168. package/dist/xyflow/FitviewOnDiagramChange.d.ts +4 -0
  169. package/dist/xyflow/FitviewOnDiagramChange.js +72 -0
  170. package/dist/xyflow/SelectEdgesOnNodeFocus.d.ts +1 -0
  171. package/dist/xyflow/SelectEdgesOnNodeFocus.js +96 -0
  172. package/dist/xyflow/XYFlow.d.ts +8 -0
  173. package/dist/xyflow/XYFlow.js +145 -0
  174. package/dist/xyflow/XYFlowBackground.d.ts +10 -0
  175. package/dist/xyflow/XYFlowBackground.js +25 -0
  176. package/dist/xyflow/XYFlowInner.d.ts +8 -0
  177. package/dist/xyflow/XYFlowInner.js +41 -0
  178. package/dist/xyflow/const.d.ts +7 -0
  179. package/dist/xyflow/const.js +12 -0
  180. package/dist/xyflow/edges/EdgeLabel.d.ts +7 -0
  181. package/dist/xyflow/edges/EdgeLabel.js +160 -0
  182. package/dist/xyflow/edges/RelationshipEdge.d.ts +6 -0
  183. package/dist/xyflow/edges/RelationshipEdge.js +443 -0
  184. package/dist/xyflow/edges/RelationshipsDropdownMenu.css.d.ts +4 -0
  185. package/dist/xyflow/edges/RelationshipsDropdownMenu.css.js +11 -0
  186. package/dist/xyflow/edges/RelationshipsDropdownMenu.d.ts +13 -0
  187. package/dist/xyflow/edges/RelationshipsDropdownMenu.js +211 -0
  188. package/dist/xyflow/edges/edges.css.d.ts +17 -0
  189. package/dist/xyflow/edges/edges.css.js +37 -0
  190. package/dist/xyflow/edges/utils.d.ts +16 -0
  191. package/dist/xyflow/edges/utils.js +24 -0
  192. package/dist/xyflow/nodes/AnimateVariants.d.ts +1313 -0
  193. package/dist/xyflow/nodes/AnimateVariants.js +123 -0
  194. package/dist/xyflow/nodes/Node.css.d.ts +3 -0
  195. package/dist/xyflow/nodes/Node.css.js +9 -0
  196. package/dist/xyflow/nodes/compound/CompoundNode.css.d.ts +14 -0
  197. package/dist/xyflow/nodes/compound/CompoundNode.css.js +27 -0
  198. package/dist/xyflow/nodes/compound/CompoundNode.d.ts +6 -0
  199. package/dist/xyflow/nodes/compound/CompoundNode.js +216 -0
  200. package/dist/xyflow/nodes/compound/index.d.ts +1 -0
  201. package/dist/xyflow/nodes/element/ElementLink.css.d.ts +3 -0
  202. package/dist/xyflow/nodes/element/ElementLink.d.ts +6 -0
  203. package/dist/xyflow/nodes/element/ElementNode.d.ts +6 -0
  204. package/dist/xyflow/nodes/element/ElementNode.js +190 -0
  205. package/dist/xyflow/nodes/element/ElementShapeSvg.d.ts +17 -0
  206. package/dist/xyflow/nodes/element/ElementShapeSvg.js +175 -0
  207. package/dist/xyflow/nodes/element/element.css.d.ts +18 -0
  208. package/dist/xyflow/nodes/element/element.css.js +31 -0
  209. package/dist/xyflow/nodes/element/index.d.ts +1 -0
  210. package/dist/xyflow/nodes/shared/ElementIcon.d.ts +8 -0
  211. package/dist/xyflow/nodes/shared/ElementIcon.js +38 -0
  212. package/dist/xyflow/nodes/shared/Toolbar.d.ts +9 -0
  213. package/dist/xyflow/nodes/shared/Toolbar.js +436 -0
  214. package/dist/xyflow/types.d.ts +36 -0
  215. package/dist/xyflow/useLayoutConstraints.d.ts +42 -0
  216. package/dist/xyflow/useLayoutConstraints.js +226 -0
  217. package/dist/xyflow/useXYFlowEvents.d.ts +160 -0
  218. package/dist/xyflow/useXYFlowEvents.js +275 -0
  219. package/dist/xyflow/utils.d.ts +22 -0
  220. package/dist/xyflow/utils.js +72 -0
  221. package/package.json +40 -31
  222. package/src/LikeC4Diagram.props.ts +21 -12
  223. package/src/LikeC4Diagram.tsx +8 -10
  224. package/src/LikeC4Search.css.ts +12 -0
  225. package/src/LikeC4Search.tsx +45 -93
  226. package/src/controls/Text.ts +5 -0
  227. package/src/controls/action-button-bar/ActionButtonBar.css.ts +13 -0
  228. package/src/controls/action-button-bar/ActionButtonBar.tsx +138 -0
  229. package/src/controls/action-button-bar/useActionButtonBarCtx.ts +13 -0
  230. package/src/controls/action-buttons/ActionButton.css.ts +29 -0
  231. package/src/controls/action-buttons/ActionButton.tsx +66 -0
  232. package/src/controls/action-buttons/ActionButtons.tsx +138 -0
  233. package/src/hooks/useDiagramState.ts +8 -3
  234. package/src/hooks/useXYFlow.ts +9 -8
  235. package/src/index.ts +12 -6
  236. package/src/likec4model/index.ts +12 -2
  237. package/src/likec4model/useLikeC4ElementsTree.ts +6 -13
  238. package/src/likec4model/useLikeC4Model.ts +21 -11
  239. package/src/overlays/Overlays.tsx +96 -63
  240. package/src/overlays/edge-details/EdgeDetailsXYFlow.tsx +18 -10
  241. package/src/overlays/edge-details/_types.ts +13 -33
  242. package/src/overlays/edge-details/use-layouted-edge-details.ts +35 -26
  243. package/src/overlays/edge-details/xyflow/CompoundNode.tsx +3 -11
  244. package/src/overlays/edge-details/xyflow/ElementNode.tsx +8 -13
  245. package/src/overlays/edge-details/xyflow/RelationshipEdge.tsx +7 -7
  246. package/src/overlays/edge-details/xyflow/styles.css.ts +1 -59
  247. package/src/overlays/element-details/ElementDetailsCard.tsx +91 -78
  248. package/src/overlays/element-details/TabPanelDeployments.css.ts +69 -0
  249. package/src/overlays/element-details/TabPanelDeployments.tsx +217 -0
  250. package/src/overlays/element-details/TabPanelRelationships.tsx +8 -9
  251. package/src/overlays/element-details/TabPanelStructure.tsx +10 -10
  252. package/src/overlays/relationships-of/RelationshipsOverlay.tsx +1 -1
  253. package/src/overlays/relationships-of/RelationshipsXYFlow.tsx +26 -34
  254. package/src/overlays/relationships-of/SelectElement.tsx +2 -2
  255. package/src/overlays/relationships-of/_types.ts +20 -58
  256. package/src/overlays/relationships-of/use-layouted-relationships.ts +54 -59
  257. package/src/overlays/relationships-of/xyflow/CompoundNode.tsx +10 -16
  258. package/src/overlays/relationships-of/xyflow/ElementNode.tsx +24 -21
  259. package/src/overlays/relationships-of/xyflow/EmptyNode.tsx +4 -7
  260. package/src/overlays/relationships-of/xyflow/RelationshipEdge.tsx +16 -15
  261. package/src/overlays/shared/xyflow/RelationshipEdge.css.ts +60 -0
  262. package/src/overlays/shared/xyflow/_types.ts +87 -0
  263. package/src/state/diagram-to-xyflow.ts +6 -7
  264. package/src/state/diagramStore.layout.ts +3 -4
  265. package/src/state/diagramStore.ts +63 -48
  266. package/src/theme-vars.css.ts +81 -0
  267. package/src/theme-vars.ts +8 -81
  268. package/src/ui/DiagramTitlePanel.tsx +7 -34
  269. package/src/ui/Link.tsx +40 -0
  270. package/src/ui/notation/NotationPanel.tsx +4 -2
  271. package/src/ui/top-left/ChangeAutoLayoutButton.tsx +2 -2
  272. package/src/ui/top-left/TopLeftPanel.tsx +5 -5
  273. package/src/utils/types.ts +6 -0
  274. package/src/xyflow/SelectEdgesOnNodeFocus.tsx +3 -3
  275. package/src/xyflow/XYFlow.tsx +2 -2
  276. package/src/xyflow/edges/EdgeLabel.tsx +26 -19
  277. package/src/xyflow/edges/RelationshipEdge.tsx +5 -3
  278. package/src/xyflow/edges/RelationshipsDropdownMenu.tsx +23 -10
  279. package/src/xyflow/edges/edges.css.ts +68 -74
  280. package/src/xyflow/edges/utils.ts +6 -6
  281. package/src/xyflow/nodes/AnimateVariants.ts +143 -0
  282. package/src/xyflow/nodes/Node.css.ts +44 -0
  283. package/src/xyflow/nodes/compound/CompoundNode.css.ts +27 -75
  284. package/src/xyflow/nodes/compound/CompoundNode.tsx +82 -163
  285. package/src/xyflow/nodes/element/ElementLink.tsx +2 -3
  286. package/src/xyflow/nodes/element/ElementNode.tsx +73 -252
  287. package/src/xyflow/nodes/element/element.css.ts +40 -64
  288. package/src/xyflow/nodes/shared/ElementIcon.tsx +1 -1
  289. package/src/xyflow/nodes/shared/Toolbar.tsx +51 -35
  290. package/src/xyflow/types.ts +48 -51
  291. package/src/xyflow/useLayoutConstraints.ts +10 -10
  292. package/src/xyflow/useXYFlowEvents.ts +31 -35
  293. package/src/xyflow/utils.ts +2 -2
  294. package/src/ui/OptionsPanel.css.ts +0 -9
  295. package/src/ui/OptionsPanel.tsx +0 -70
  296. package/src/ui/options/EdgeOptions.tsx +0 -142
  297. package/src/ui/options/NodeOptions.tsx +0 -362
  298. package/src/xyflow/nodes/element/ElementDetails.css.ts +0 -101
  299. package/src/xyflow/nodes/element/ElementDetails.tsx +0 -393
  300. package/src/xyflow/nodes/use-animate-variants.tsx +0 -64
@@ -11,8 +11,10 @@ import {
11
11
  ViewportPortal
12
12
  } from '@xyflow/react'
13
13
  import { memo, useEffect } from 'react'
14
+ import { only } from 'remeda'
14
15
  import { useDiagramStoreApi } from '../../hooks/useDiagramState'
15
- import type { XYFlowTypes } from './_types'
16
+ import type { SharedFlowTypes } from '../shared/xyflow/_types'
17
+ import type { EdgeDetailsFlowTypes } from './_types'
16
18
  import { SelectEdge } from './SelectEdge'
17
19
  import * as css from './SelectEdge.css'
18
20
  import { useLayoutedEdgeDetails, ZIndexes } from './use-layouted-edge-details'
@@ -28,7 +30,7 @@ const edgeTypes = {
28
30
  relation: RelationshipEdge
29
31
  }
30
32
 
31
- const resetDimmedAndHovered = (xyflow: ReactFlowInstance<XYFlowTypes.Node, XYFlowTypes.Edge>) => {
33
+ const resetDimmedAndHovered = (xyflow: ReactFlowInstance<SharedFlowTypes.Node, EdgeDetailsFlowTypes.Edge>) => {
32
34
  xyflow.setEdges(edges =>
33
35
  edges.map(edge => ({
34
36
  ...edge,
@@ -49,12 +51,12 @@ const resetDimmedAndHovered = (xyflow: ReactFlowInstance<XYFlowTypes.Node, XYFlo
49
51
  dimmed: false,
50
52
  hovered: false
51
53
  }
52
- }) as XYFlowTypes.Node
54
+ }) as SharedFlowTypes.Node
53
55
  )
54
56
  )
55
57
  }
56
58
 
57
- const animateEdge = (node: XYFlowTypes.Node, animated = true) => (edges: XYFlowTypes.Edge[]) => {
59
+ const animateEdge = (node: SharedFlowTypes.Node, animated = true) => (edges: EdgeDetailsFlowTypes.Edge[]) => {
58
60
  return edges.map(edge => {
59
61
  const isConnected = edge.source === node.id || edge.target === node.id || isAncestor(node.id, edge.source)
60
62
  || isAncestor(node.id, edge.target)
@@ -78,8 +80,8 @@ export const EdgeDetailsXYFlow = memo<{ edgeId: EdgeId }>(function EdgeDetailsXY
78
80
 
79
81
  const boundsRef = useSyncedRef(bounds)
80
82
 
81
- const xyflow = useReactFlow<XYFlowTypes.Node, XYFlowTypes.Edge>()
82
- const xystore = useStoreApi<XYFlowTypes.Node, XYFlowTypes.Edge>()
83
+ const xyflow = useReactFlow<SharedFlowTypes.Node, EdgeDetailsFlowTypes.Edge>()
84
+ const xystore = useStoreApi<SharedFlowTypes.Node, EdgeDetailsFlowTypes.Edge>()
83
85
 
84
86
  const fitview = useDebouncedCallback(
85
87
  () => {
@@ -115,8 +117,8 @@ export const EdgeDetailsXYFlow = memo<{ edgeId: EdgeId }>(function EdgeDetailsXY
115
117
 
116
118
  return (
117
119
  <ReactFlow
118
- defaultEdges={[] as XYFlowTypes.Edge[]}
119
- defaultNodes={[] as XYFlowTypes.Node[]}
120
+ defaultEdges={[] as EdgeDetailsFlowTypes.Edge[]}
121
+ defaultNodes={[] as SharedFlowTypes.Node[]}
120
122
  nodeTypes={nodeTypes}
121
123
  edgeTypes={edgeTypes}
122
124
  defaultMarkerColor="var(--xy-edge-stroke)"
@@ -168,7 +170,7 @@ export const EdgeDetailsXYFlow = memo<{ edgeId: EdgeId }>(function EdgeDetailsXY
168
170
  ...n.data,
169
171
  dimmed: n.id !== edge.source && n.id !== edge.target
170
172
  }
171
- } as XYFlowTypes.Node))
173
+ } as SharedFlowTypes.Node))
172
174
  )
173
175
  }}
174
176
  onEdgeMouseLeave={() => {
@@ -194,7 +196,13 @@ export const EdgeDetailsXYFlow = memo<{ edgeId: EdgeId }>(function EdgeDetailsXY
194
196
  // }}
195
197
  onEdgeClick={(e, edge) => {
196
198
  e.stopPropagation()
197
- diagramStore.getState().onOpenSourceRelation?.(edge.data.relation.id)
199
+ // edge-details only ever deals with edges that represent only one relation
200
+ let relationId = only(edge.data.relations)?.id
201
+ if (relationId) {
202
+ diagramStore.getState().onOpenSource?.({
203
+ relation: relationId
204
+ })
205
+ }
198
206
  }}
199
207
  // onEdgeClick={(e, edge) => {
200
208
  // e.stopPropagation()
@@ -1,38 +1,18 @@
1
- import type { ComputedNode, Fqn, Relation, ViewID } from '@likec4/core'
2
- import type { Edge as ReactFlowEdge, Node as ReactFlowNode, ReactFlowInstance } from '@xyflow/react'
3
- import type { SetRequired } from 'type-fest'
1
+ import type { AddEdgeData } from '../../utils/types'
2
+ import type { SharedFlowTypes } from '../shared/xyflow/_types'
4
3
 
5
- export namespace XYFlowTypes {
6
- type NodeProps = {
7
- fqn: Fqn
8
- element: Pick<ComputedNode, 'color' | 'title' | 'description' | 'shape' | 'kind'>
9
- ports: {
10
- in: string[]
11
- out: string[]
12
- }
13
- navigateTo: ViewID | null
14
- hovered?: boolean
15
- /**
16
- * Whether the node is dimmed
17
- * 'immediate' means that the node is dimmed without delay
18
- */
19
- dimmed?: 'immediate' | boolean
20
- }
21
-
22
- export type ElementNode = SetRequired<ReactFlowNode<NodeProps, 'element'>, 'type'>
23
-
24
- export type CompoundNode = SetRequired<ReactFlowNode<NodeProps, 'compound'>, 'type'>
4
+ export namespace EdgeDetailsFlowTypes {
25
5
 
26
- export type Node = ElementNode | CompoundNode
27
-
28
- export type Edge = Omit<ReactFlowEdge, 'data' | 'type'> & {
29
- data: {
30
- relation: Relation
31
- hovered?: boolean
32
- dimmed?: boolean
33
- }
34
- type: 'relation'
6
+ /**
7
+ * Data that is exclusive to the edge-details overlay. It will be merged into the edge types
8
+ * provided by SharedFlowTypes.
9
+ */
10
+ type EdgeDetailsEdgeData = {
11
+ technology: string | null
12
+ description: string | null
35
13
  }
36
14
 
37
- export type Instance = ReactFlowInstance<Node, Edge>
15
+ // Extend the edge types provided by SharedFlowTypes with EdgeDetailsEdgeData
16
+
17
+ export type Edge = AddEdgeData<SharedFlowTypes.Edge, EdgeDetailsEdgeData>
38
18
  }
@@ -1,5 +1,6 @@
1
1
  import dagre, { type GraphLabel, type Label } from '@dagrejs/dagre'
2
2
  import {
3
+ type AbstractRelation,
3
4
  compareFqnHierarchically,
4
5
  compareRelations,
5
6
  type DiagramEdge,
@@ -16,7 +17,8 @@ import { useMemo } from 'react'
16
17
  import { filter, first, forEach, isTruthy, map, pipe, prop, reverse, sort, sortBy, takeWhile } from 'remeda'
17
18
  import { useDiagramState } from '../../hooks/useDiagramState'
18
19
  import { useLikeC4Model } from '../../likec4model'
19
- import type { XYFlowTypes } from './_types'
20
+ import type { SharedFlowTypes } from '../shared/xyflow/_types'
21
+ import type { EdgeDetailsFlowTypes } from './_types'
20
22
 
21
23
  /**
22
24
  * All constants related to the layout
@@ -67,16 +69,16 @@ function createGraph() {
67
69
  type Context = {
68
70
  g: dagre.graphlib.Graph
69
71
  diagramNodes: Map<Fqn, DiagramNode>
70
- xynodes: Map<Fqn, XYFlowTypes.Node>
72
+ xynodes: Map<Fqn, SharedFlowTypes.NonEmptyNode>
71
73
  edge: DiagramEdge
72
- edges: XYFlowTypes.Edge[]
74
+ edges: EdgeDetailsFlowTypes.Edge[]
73
75
  }
74
76
  const sized = (height: number = Sizes.hodeHeight) => ({
75
77
  width: Sizes.nodeWidth,
76
78
  height
77
79
  })
78
80
 
79
- const graphId = (node: XYFlowTypes.Node) => ({
81
+ const graphId = (node: SharedFlowTypes.Node) => ({
80
82
  id: node.id,
81
83
  port: node.type === 'compound' ? `${node.id}::port` : node.id,
82
84
  body: `${node.id}`,
@@ -84,16 +86,16 @@ const graphId = (node: XYFlowTypes.Node) => ({
84
86
  })
85
87
 
86
88
  function nodeData(
87
- element: LikeC4Model.ElementModel,
89
+ element: LikeC4Model.Element,
88
90
  ctx: Context
89
- ): Omit<XYFlowTypes.Node['data'], 'column'> {
91
+ ): SharedFlowTypes.OverlayNodeData {
90
92
  // We try to inherit style from existing diagram node
91
93
  let diagramNode = ctx.diagramNodes.get(element.id)
92
94
 
93
95
  // Ansector separetely, because we want to inherit
94
96
  // color from it if there is no diagram node
95
97
  const ancestor = diagramNode ?? pipe(
96
- element.ancestors(),
98
+ element.ancestors().toArray(),
97
99
  map(ancestor => ctx.diagramNodes.get(ancestor.id)),
98
100
  filter(isTruthy),
99
101
  first()
@@ -104,11 +106,11 @@ function nodeData(
104
106
  element: {
105
107
  kind: element.kind,
106
108
  title: diagramNode?.title ?? element.title,
107
- description: diagramNode?.description ?? element.element.description,
109
+ description: diagramNode?.description ?? element.description,
108
110
  color: diagramNode?.color ?? ancestor?.color ?? element.color,
109
111
  shape: diagramNode?.shape ?? element.shape
110
112
  },
111
- navigateTo: diagramNode?.navigateTo ?? first(element.viewsOf())?.id ?? null,
113
+ navigateTo: diagramNode?.navigateTo ?? first(element.scopedViews().take(1).toArray())?.id ?? null,
112
114
  ports: {
113
115
  in: [],
114
116
  out: []
@@ -117,10 +119,10 @@ function nodeData(
117
119
  }
118
120
 
119
121
  function createNode(
120
- nodeType: XYFlowTypes.Node['type'],
121
- element: LikeC4Model.ElementModel,
122
+ nodeType: SharedFlowTypes.NonEmptyNode['type'],
123
+ element: LikeC4Model.Element,
122
124
  ctx: Context
123
- ): XYFlowTypes.Node {
125
+ ): SharedFlowTypes.Node {
124
126
  let node = ctx.xynodes.get(element.id)
125
127
  if (node) {
126
128
  return node
@@ -129,13 +131,13 @@ function createNode(
129
131
 
130
132
  // Create parent node
131
133
  const parent = pipe(
132
- element.ancestors(),
134
+ element.ancestors().toArray(),
133
135
  takeWhile(ancestor => !isAncestor(ancestor.id, ctx.edge.source) && !isAncestor(ancestor.id, ctx.edge.target)),
134
136
  first(),
135
137
  found => found ? createNode('compound', found, ctx) : null
136
138
  )
137
139
 
138
- const xynode: XYFlowTypes.Node = {
140
+ const xynode: SharedFlowTypes.NonEmptyNode = {
139
141
  type: nodeType,
140
142
  id: element.id,
141
143
  position: { x: 0, y: 0 },
@@ -181,7 +183,7 @@ function createNode(
181
183
  * And return a function to get node bounds for xyflow
182
184
  */
183
185
  function applyDagreLayout(g: dagre.graphlib.Graph) {
184
- type NodeBounds = Required<Pick<XYFlowTypes.Node, 'position' | 'width' | 'height'>>
186
+ type NodeBounds = Required<Pick<SharedFlowTypes.Node, 'position' | 'width' | 'height'>>
185
187
  dagre.layout(g)
186
188
  return function nodeBounds(nodeId: string, relativeTo?: string): NodeBounds {
187
189
  const { x, y, width, height } = g.node(nodeId)
@@ -215,8 +217,8 @@ function layout(
215
217
  ): {
216
218
  view: DiagramView
217
219
  edge: DiagramEdge
218
- nodes: XYFlowTypes.Node[]
219
- edges: XYFlowTypes.Edge[]
220
+ nodes: SharedFlowTypes.Node[]
221
+ edges: EdgeDetailsFlowTypes.Edge[]
220
222
  bounds: { x: number; y: number; width: number; height: number }
221
223
  } {
222
224
  const edge = view.edges.find(e => e.id === edgeId)
@@ -225,10 +227,14 @@ function layout(
225
227
 
226
228
  const relations = edge.relations
227
229
  .map(r => {
228
- const relation = likec4model.relationship(r).relationship
229
- all.add(relation.source)
230
- all.add(relation.target)
231
- return relation
230
+ const relation = likec4model.relationship(r)
231
+ all.add(relation.source.id)
232
+ all.add(relation.target.id)
233
+ return {
234
+ source: relation.source.id,
235
+ target: relation.target.id,
236
+ relation: relation.$relationship as AbstractRelation
237
+ }
232
238
  })
233
239
  .sort(compareRelations)
234
240
  .reverse()
@@ -258,17 +264,17 @@ function layout(
258
264
  g.setDefaultEdgeLabel(() => ({ width: 250 }))
259
265
  }
260
266
 
261
- for (const relation of relations) {
262
- const source = ctx.xynodes.get(relation.source)
267
+ for (const { relation, ...points } of relations) {
268
+ const source = ctx.xynodes.get(points.source)
263
269
  invariant(source, 'source node not found')
264
- const target = ctx.xynodes.get(relation.target)
270
+ const target = ctx.xynodes.get(points.target)
265
271
  invariant(target, 'target node not found')
266
272
 
267
273
  source.data.ports.out.push(target.id)
268
274
  target.data.ports.in.push(source.id)
269
275
 
270
276
  g.setEdge(graphId(source).port, graphId(target).port)
271
- const edge: XYFlowTypes.Edge = {
277
+ const edge: EdgeDetailsFlowTypes.Edge = {
272
278
  id: relation.id,
273
279
  type: 'relation',
274
280
  source: source.id,
@@ -276,7 +282,10 @@ function layout(
276
282
  sourceHandle: target.id,
277
283
  targetHandle: source.id,
278
284
  data: {
279
- relation
285
+ relations: [relation],
286
+ navigateTo: relation.navigateTo ?? null,
287
+ technology: relation.technology ?? null,
288
+ description: relation.description ?? null
280
289
  },
281
290
  label: relation.title,
282
291
  zIndex: ZIndexes.edge,
@@ -1,15 +1,11 @@
1
- import { Text as MantineText } from '@mantine/core'
2
1
  import { Handle, type NodeProps, Position } from '@xyflow/react'
3
2
  import clsx from 'clsx'
4
3
  import { m } from 'framer-motion'
5
- import type { XYFlowTypes } from '../_types'
4
+ import type { SharedFlowTypes } from '../../shared/xyflow/_types'
6
5
  import * as css from './styles.css'
6
+ import { Text } from '../../../controls/Text'
7
7
 
8
- const Text = MantineText.withProps({
9
- component: 'div'
10
- })
11
-
12
- type CompoundNodeProps = NodeProps<XYFlowTypes.CompoundNode>
8
+ type CompoundNodeProps = NodeProps<SharedFlowTypes.CompoundNode>
13
9
 
14
10
  export function CompoundNode({
15
11
  data: {
@@ -71,10 +67,6 @@ export function CompoundNode({
71
67
  top: `${16 + 20 * i}px`
72
68
  }} />
73
69
  ))}
74
- {
75
- /* <Handle type="target" position={Position.Left}/>
76
- <Handle type="source" position={Position.Right}/> */
77
- }
78
70
  </>
79
71
  )
80
72
  }
@@ -1,4 +1,4 @@
1
- import { ActionIcon, Box, Group, Text as MantineText } from '@mantine/core'
1
+ import { ActionIcon, Box, Group } from '@mantine/core'
2
2
  import { IconFileSymlink, IconTransform, IconZoomScan } from '@tabler/icons-react'
3
3
  import { Handle, type NodeProps, Position } from '@xyflow/react'
4
4
  import clsx from 'clsx'
@@ -7,8 +7,9 @@ import { type DiagramState, useDiagramState } from '../../../hooks'
7
7
  import { ElementShapeSvg } from '../../../xyflow/nodes/element/ElementShapeSvg'
8
8
  import { stopPropagation } from '../../../xyflow/utils'
9
9
  import { useOverlayDialog } from '../../OverlayContext'
10
- import type { XYFlowTypes } from '../_types'
10
+ import type { SharedFlowTypes } from '../../shared/xyflow/_types'
11
11
  import * as css from './styles.css'
12
+ import { Text } from '../../../controls/Text'
12
13
 
13
14
  const Action = ActionIcon.withProps({
14
15
  className: 'nodrag nopan ' + css.navigateBtn,
@@ -18,18 +19,14 @@ const Action = ActionIcon.withProps({
18
19
  onPointerDownCapture: stopPropagation
19
20
  })
20
21
 
21
- const Text = MantineText.withProps({
22
- component: 'div'
23
- })
24
-
25
- type ElementNodeProps = NodeProps<XYFlowTypes.ElementNode>
22
+ type ElementNodeProps = NodeProps<SharedFlowTypes.ElementNode>
26
23
 
27
24
  function selector(s: DiagramState) {
28
25
  return {
29
26
  currentViewId: s.view.id,
30
27
  enableRelationshipBrowser: s.enableRelationshipBrowser,
31
28
  onNavigateTo: s.onNavigateTo,
32
- onOpenSource: s.onOpenSourceElement
29
+ onOpenSource: s.onOpenSource
33
30
  }
34
31
  }
35
32
 
@@ -119,7 +116,9 @@ export function ElementNode({
119
116
  <Action
120
117
  onClick={(event) => {
121
118
  event.stopPropagation()
122
- onOpenSource(data.fqn)
119
+ onOpenSource({
120
+ element: data.fqn
121
+ })
123
122
  }}>
124
123
  <IconFileSymlink stroke={1.8} style={{ width: '72%' }} />
125
124
  </Action>
@@ -148,10 +147,6 @@ export function ElementNode({
148
147
  top: `${15 + (i + 1) * ((h - 30) / (ports.in.length + 1))}px`
149
148
  }} />
150
149
  ))}
151
- {
152
- /* <Handle type="target" position={Position.Left} />
153
- <Handle type="source" position={Position.Right} /> */
154
- }
155
150
  </>
156
151
  )
157
152
  }
@@ -2,22 +2,22 @@ import { ActionIcon, Box, Stack, Text } from '@mantine/core'
2
2
  import { IconZoomScan } from '@tabler/icons-react'
3
3
  import { BaseEdge, EdgeLabelRenderer, type EdgeProps, getBezierPath } from '@xyflow/react'
4
4
  import clsx from 'clsx'
5
- import { useDiagramState, useDiagramStoreApi } from '../../../hooks/useDiagramState'
5
+ import { useDiagramState } from '../../../hooks/useDiagramState'
6
6
  import { stopPropagation } from '../../../xyflow/utils'
7
7
  import { useOverlayDialog } from '../../OverlayContext'
8
- import type { XYFlowTypes } from '../_types'
8
+ import * as css from '../../shared/xyflow/RelationshipEdge.css'
9
+ import type { EdgeDetailsFlowTypes } from '../_types'
9
10
  import { ZIndexes } from '../use-layouted-edge-details'
10
- import * as css from './styles.css'
11
11
 
12
12
  export function RelationshipEdge({
13
13
  data,
14
14
  label,
15
15
  ...props
16
- }: EdgeProps<XYFlowTypes.Edge>) {
16
+ }: EdgeProps<EdgeDetailsFlowTypes.Edge>) {
17
17
  const overlay = useOverlayDialog()
18
18
  const onNavigateTo = useDiagramState(s => s.onNavigateTo)
19
19
  const [edgePath, labelX, labelY] = getBezierPath(props)
20
- const navigateTo = data.relation.navigateTo
20
+ const navigateTo = data.navigateTo
21
21
  return (
22
22
  <>
23
23
  <g
@@ -51,10 +51,10 @@ export function RelationshipEdge({
51
51
  {label}
52
52
  </Text>
53
53
  )}
54
- {data.relation.technology && (
54
+ {data.technology && (
55
55
  <Text component={'div'} className={css.edgeLabelTechnology}>
56
56
  {'[ '}
57
- {data.relation.technology}
57
+ {data.technology}
58
58
  {' ]'}
59
59
  </Text>
60
60
  )}
@@ -1,6 +1,5 @@
1
1
  import { globalStyle, style } from '@vanilla-extract/css'
2
- import { mantine, transitions, vars, whereDark, xyvars } from '../../../theme-vars'
3
- import { mixColor } from '../../Overlays.css'
2
+ import { mantine, vars } from '../../../theme-vars'
4
3
 
5
4
  export const elementNode = style({
6
5
  width: '100%',
@@ -84,63 +83,6 @@ export const cssShapeSvg = style({
84
83
  zIndex: -1
85
84
  })
86
85
 
87
- const DimmedTransitionDelay = '400ms'
88
-
89
- export const edgeContainer = style({
90
- opacity: 1,
91
- transition: transitions.fast,
92
- vars: {
93
- [xyvars.edge.stroke]: vars.relation.lineColor,
94
- [xyvars.edge.strokeSelected]: `color-mix(in srgb, ${vars.relation.lineColor}, ${mixColor} 35%)`,
95
- [xyvars.edge.labelColor]: `color-mix(in srgb, ${vars.relation.labelColor}, rgba(255 255 255 / 0.85) 50%)`,
96
- [xyvars.edge.labelBgColor]: `color-mix(in srgb, ${vars.relation.labelBgColor}, transparent 20%)`
97
- },
98
- selectors: {
99
- [`&[data-edge-dimmed='true']`]: {
100
- opacity: 0.2,
101
- transitionDelay: DimmedTransitionDelay
102
- },
103
- [`&[data-edge-dimmed='immediate']`]: {
104
- opacity: 0.2
105
- },
106
- [`${whereDark} &`]: {
107
- vars: {
108
- [xyvars.edge.labelBgColor]: `color-mix(in srgb, ${vars.relation.labelBgColor}, transparent 50%)`
109
- }
110
- }
111
- }
112
- })
113
-
114
- export const edgeLabel = style([edgeContainer, {
115
- padding: '2px 5px',
116
- fontFamily: vars.likec4.font,
117
- position: 'absolute',
118
- cursor: 'pointer',
119
- width: 'fit-content',
120
- color: xyvars.edge.labelColor,
121
- backgroundColor: xyvars.edge.labelBgColor,
122
- borderRadius: 4,
123
- // everything inside EdgeLabelRenderer has no pointer events by default
124
- // if you have an interactive element, set pointer-events: all
125
- pointerEvents: 'all',
126
- textWrap: 'pretty',
127
- whiteSpace: 'preserve-breaks'
128
- }])
129
-
130
- export const edgeLabelText = style({
131
- textAlign: 'center',
132
- whiteSpaceCollapse: 'preserve-breaks',
133
- fontSize: mantine.fontSizes.md,
134
- lineHeight: mantine.lineHeights.xs
135
- })
136
-
137
- export const edgeLabelTechnology = style({
138
- textAlign: 'center',
139
- whiteSpaceCollapse: 'preserve-breaks',
140
- fontSize: mantine.fontSizes.sm,
141
- lineHeight: 1
142
- })
143
-
144
86
  export const navigateBtnBox = style({
145
87
  zIndex: 100,
146
88
  position: 'absolute',