@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
@@ -1,117 +1,30 @@
1
- import { type ThemeColor } from '@likec4/core'
2
- import { ActionIcon, Box, Group, Text as MantineText, Tooltip } from '@mantine/core'
1
+ import { type ThemeColor, DiagramNode } from '@likec4/core'
2
+ import { Box } from '@mantine/core'
3
3
  import { useDebouncedValue } from '@mantine/hooks'
4
- import { IconId, IconTransform, IconZoomScan } from '@tabler/icons-react'
5
- import { Handle, type NodeProps, Position } from '@xyflow/react'
4
+ import { type NodeProps, Handle, Position } from '@xyflow/react'
6
5
  import clsx from 'clsx'
7
6
  import { deepEqual as eq } from 'fast-equals'
8
- import { m, type Variants } from 'framer-motion'
9
- import React, { memo, useCallback, useState } from 'react'
10
- import { isNumber, isTruthy } from 'remeda'
7
+ import { m } from 'framer-motion'
8
+ import { memo, useState } from 'react'
9
+ import { isTruthy } from 'remeda'
10
+ import { ActionButtonBar } from '../../../controls/action-button-bar/ActionButtonBar'
11
+ import {
12
+ BrowseRelationshipsButton,
13
+ NavigateToButton,
14
+ OpenDetailsButton,
15
+ } from '../../../controls/action-buttons/ActionButtons'
16
+ import { Text } from '../../../controls/Text'
11
17
  import { useDiagramState } from '../../../hooks/useDiagramState'
12
- import type { ElementXYFlowNode } from '../../types'
13
- import { stopPropagation, toDomPrecision } from '../../utils'
18
+ import type { DiagramFlowTypes } from '../../types'
19
+ import { toDomPrecision } from '../../utils'
20
+ import { type VariantKeys, NodeVariants, useFramerAnimateVariants } from '../AnimateVariants'
21
+ import * as nodeCss from '../Node.css'
14
22
  import { ElementIcon } from '../shared/ElementIcon'
15
23
  import { ElementToolbar } from '../shared/Toolbar'
16
- import { useFramerAnimateVariants } from '../use-animate-variants'
17
24
  import * as css from './element.css'
18
25
  import { ElementShapeSvg, SelectedIndicator } from './ElementShapeSvg'
19
26
 
20
- const Text = MantineText.withProps({
21
- component: 'div'
22
- })
23
-
24
- const selectedScale = 1.015
25
-
26
- // Frame-motion variants
27
-
28
- const VariantsRoot = {
29
- idle: (_, { scale }) => ({
30
- scale: 1,
31
- transition: isNumber(scale) && scale > selectedScale
32
- ? {
33
- delay: 0.1,
34
- delayChildren: 0.06
35
- // staggerChildren: 0.07,
36
- // staggerDirection: -1
37
- }
38
- : {}
39
- }),
40
- selected: {
41
- scale: selectedScale
42
- },
43
- hovered: (_, { scale }) => ({
44
- scale: 1.06,
45
- transition: !isNumber(scale) || (scale >= 1 && scale < 1.06)
46
- ? {
47
- // delay: 0.09,
48
- delayChildren: 0.08
49
- }
50
- : {}
51
- }),
52
- tap: {
53
- scale: 0.975
54
- }
55
- } satisfies Variants
56
-
57
- const VariantsNavigateBtn = {
58
- idle: {
59
- '--ai-bg': 'var(--ai-bg-idle)',
60
- scale: 1,
61
- opacity: 0.5,
62
- originY: 0.5
63
- },
64
- selected: {},
65
- hovered: {
66
- '--ai-bg': 'var(--ai-bg-hover)',
67
- scale: 1.35,
68
- opacity: 1
69
- }
70
- } satisfies Variants
71
- VariantsNavigateBtn['selected'] = VariantsNavigateBtn['hovered']
72
-
73
- const VariantsNavigate = {
74
- ...VariantsNavigateBtn,
75
- 'hovered:navigate': {
76
- scale: 1.42
77
- },
78
- 'tap:navigate': {
79
- scale: 1.15
80
- }
81
- } satisfies Variants
82
-
83
- const VariantRealationships = {
84
- ...VariantsNavigateBtn,
85
- 'hovered:relationships': {
86
- scale: 1.42
87
- },
88
- 'tap:relationships': {
89
- scale: 1.15
90
- }
91
- } satisfies Variants
92
-
93
- const VariantsDetailsBtn = {
94
- idle: {
95
- '--ai-bg': 'var(--ai-bg-idle)',
96
- scale: 1,
97
- opacity: 0.5
98
- },
99
- selected: {},
100
- hovered: {
101
- scale: 1.2,
102
- opacity: 0.7
103
- },
104
- 'hovered:details': {
105
- scale: 1.42,
106
- opacity: 1
107
- },
108
- 'tap:details': {
109
- scale: 1.15
110
- }
111
- } satisfies Variants
112
- VariantsDetailsBtn['selected'] = VariantsDetailsBtn['hovered']
113
-
114
- type ElementNodeProps = NodeProps<ElementXYFlowNode>
27
+ type ElementNodeProps = NodeProps<DiagramFlowTypes.ElementNode>
115
28
  const isEqualProps = (prev: ElementNodeProps, next: ElementNodeProps) => (
116
29
  prev.id === next.id
117
30
  && eq(prev.selected ?? false, next.selected ?? false)
@@ -124,112 +37,90 @@ const isEqualProps = (prev: ElementNodeProps, next: ElementNodeProps) => (
124
37
  export const ElementNodeMemo = memo<ElementNodeProps>(function ElementNode({
125
38
  id,
126
39
  data: {
127
- element
40
+ element,
128
41
  },
129
42
  dragging,
130
43
  selected = false,
131
44
  width,
132
- height
45
+ height,
133
46
  }) {
47
+ const modelRef = DiagramNode.modelRef(element)
48
+ // const deploymentRef = DiagramNode.deploymentRef(element)
134
49
  const {
135
50
  viewId,
136
51
  isEditable,
137
- isHovered,
138
52
  isDimmed,
139
53
  isNavigable,
140
54
  isInteractive,
141
55
  enableElementDetails,
142
56
  enableRelationshipBrowser,
143
- triggerOnNavigateTo,
144
- openOverlay,
145
57
  isInActiveOverlay,
146
- renderIcon
58
+ renderIcon,
147
59
  } = useDiagramState(s => ({
148
60
  viewId: s.view.id,
149
61
  isEditable: s.readonly !== true,
150
- isHovered: s.hoveredNodeId === id,
151
62
  isDimmed: s.dimmed.has(id),
152
63
  isInteractive: s.nodesDraggable || s.nodesSelectable || s.enableElementDetails || s.enableRelationshipBrowser
153
64
  || (!!s.onNavigateTo && !!element.navigateTo),
154
65
  isNavigable: (!!s.onNavigateTo && !!element.navigateTo),
155
66
  enableElementDetails: s.enableElementDetails,
156
67
  enableRelationshipBrowser: s.enableRelationshipBrowser,
157
- triggerOnNavigateTo: s.triggerOnNavigateTo,
158
68
  openOverlay: s.openOverlay,
159
69
  isInActiveOverlay: (s.activeOverlay?.elementDetails ?? s.activeOverlay?.relationshipsOf) === id,
160
- renderIcon: s.renderIcon
70
+ renderIcon: s.renderIcon,
161
71
  }))
162
- // For development purposes, show the toolbar when the element is selected
163
- const isHoveredOrSelected = isHovered || (import.meta.env.DEV && selected)
164
- const _isToolbarVisible = isEditable && isHoveredOrSelected
165
- const [isToolbarVisible] = useDebouncedValue(_isToolbarVisible, _isToolbarVisible ? 500 : 300)
166
72
 
167
73
  const w = toDomPrecision(width ?? element.width)
168
74
  const h = toDomPrecision(height ?? element.height)
169
75
 
170
- const [animateVariants, animateHandlers] = useFramerAnimateVariants()
171
-
172
- let animate: keyof typeof VariantsRoot
76
+ let animateVariant: VariantKeys | string[]
173
77
  switch (true) {
174
78
  case isInActiveOverlay:
175
- animate = 'idle'
79
+ animateVariant = 'idle'
176
80
  break
177
81
  case dragging && selected:
178
- animate = 'selected'
82
+ animateVariant = 'selected'
179
83
  break
180
84
  case dragging:
181
- animate = 'idle'
85
+ animateVariant = 'idle'
182
86
  break
183
- case isInteractive && isHovered:
184
- animate = 'hovered'
87
+ case isDimmed:
88
+ animateVariant = 'dimmed'
185
89
  break
186
90
  case selected:
187
- animate = 'selected'
91
+ animateVariant = 'selected'
188
92
  break
189
93
  default:
190
- animate = 'idle'
94
+ animateVariant = 'idle'
95
+ }
96
+
97
+ const [animateVariants, animateHandlers] = useFramerAnimateVariants()
98
+ if (!dragging && !isInActiveOverlay) {
99
+ animateVariant = animateVariants ?? animateVariant
191
100
  }
192
101
 
102
+ const isHovered = !!animateVariants && animateVariants.includes('hovered')
103
+
104
+ const _isToolbarVisible = (selected && !dragging) || isHovered
105
+ const [isToolbarVisible] = useDebouncedValue(_isToolbarVisible, _isToolbarVisible ? 500 : 300)
106
+
193
107
  const elementIcon = ElementIcon({
194
108
  element,
195
109
  viewId,
196
110
  className: css.elementIcon,
197
- renderIcon
111
+ renderIcon,
198
112
  })
199
113
 
200
114
  const [previewColor, setPreviewColor] = useState<ThemeColor | null>(null)
201
115
 
202
- const onNavigateTo = useCallback((e: React.MouseEvent) => {
203
- e.stopPropagation()
204
- triggerOnNavigateTo(id, e)
205
- }, [triggerOnNavigateTo, id])
206
-
207
- const onOpenDetails = useCallback((e: React.MouseEvent) => {
208
- e.stopPropagation()
209
- openOverlay({ elementDetails: element.id })
210
- }, [openOverlay, element.id])
211
-
212
- const onOpenRelationships = useCallback((e: React.MouseEvent) => {
213
- e.stopPropagation()
214
- openOverlay({ relationshipsOf: element.id })
215
- }, [openOverlay, element.id])
216
-
217
116
  return (
218
117
  <>
219
- {isToolbarVisible && (
220
- <ElementToolbar
221
- element={element}
222
- isVisible={isToolbarVisible}
223
- onColorPreview={setPreviewColor}
224
- />
225
- )}
226
118
  <Box
227
119
  component={m.div}
228
120
  className={clsx([
229
121
  css.container,
230
- isDimmed && css.dimmed,
231
- animate !== 'idle' && css.containerAnimated,
232
- 'likec4-element-node'
122
+ animateVariant !== 'idle' && css.containerAnimated,
123
+ 'likec4-element-node',
233
124
  ])}
234
125
  key={`${viewId}:element:${id}`}
235
126
  layoutId={`${viewId}:element:${id}`}
@@ -238,15 +129,19 @@ export const ElementNodeMemo = memo<ElementNodeProps>(function ElementNode({
238
129
  data-likec4-shape={element.shape}
239
130
  data-animate-target=""
240
131
  initial={false}
241
- variants={VariantsRoot}
242
- animate={(isHovered && !dragging && !isInActiveOverlay) ? (animateVariants ?? animate) : animate}
132
+ variants={NodeVariants(w, h)}
133
+ animate={animateVariant}
134
+ {...isInteractive && animateHandlers}
243
135
  tabIndex={-1}
244
- {...(isInteractive && {
245
- onTapStart: animateHandlers.onTapStart,
246
- onTap: animateHandlers.onTap,
247
- onTapCancel: animateHandlers.onTapCancel
248
- })}
249
136
  >
137
+ {isEditable && (
138
+ <ElementToolbar
139
+ element={element}
140
+ isVisible={isToolbarVisible}
141
+ align="start"
142
+ onColorPreview={setPreviewColor}
143
+ />
144
+ )}
250
145
  <svg
251
146
  className={clsx(css.shapeSvg)}
252
147
  viewBox={`0 0 ${w} ${h}`}>
@@ -259,7 +154,7 @@ export const ElementNodeMemo = memo<ElementNodeProps>(function ElementNode({
259
154
  className={clsx(
260
155
  css.elementDataContainer,
261
156
  isTruthy(elementIcon) && css.hasIcon,
262
- 'likec4-element'
157
+ 'likec4-element',
263
158
  )}
264
159
  >
265
160
  {elementIcon}
@@ -284,65 +179,26 @@ export const ElementNodeMemo = memo<ElementNodeProps>(function ElementNode({
284
179
  )}
285
180
  </Box>
286
181
  </Box>
287
- {/* {isHovercards && element.links && <ElementLink element={element} />} */}
288
-
289
- {(enableRelationshipBrowser || isNavigable) && (
290
- <Group className={css.navigateBtnBox} align="center">
291
- {enableRelationshipBrowser && (
292
- <ActionIcon
293
- component={m.div}
294
- variants={VariantRealationships}
295
- data-animate-target="relationships"
296
- className={clsx('nodrag nopan', css.navigateBtn)}
297
- radius="md"
298
- role="button"
299
- onClick={onOpenRelationships}
300
- onDoubleClick={stopPropagation}
182
+ <Box className={clsx(nodeCss.bottomBtnContainer)}>
183
+ <ActionButtonBar shiftY="bottom">
184
+ {isNavigable && (
185
+ <NavigateToButton
186
+ xynodeId={id}
301
187
  {...isInteractive && animateHandlers}
302
- >
303
- <IconTransform style={{ width: '75%' }} />
304
- </ActionIcon>
188
+ />
305
189
  )}
306
- {isNavigable && (
307
- <ActionIcon
308
- component={m.div}
309
- variants={VariantsNavigate}
310
- data-animate-target="navigate"
311
- className={clsx('nodrag nopan', css.navigateBtn)}
312
- radius="md"
313
- role="button"
314
- onClick={onNavigateTo}
315
- onDoubleClick={stopPropagation}
190
+ {enableRelationshipBrowser && !!modelRef && (
191
+ <BrowseRelationshipsButton
192
+ fqn={modelRef}
316
193
  {...isInteractive && animateHandlers}
317
- >
318
- <IconZoomScan style={{ width: '75%' }} />
319
- </ActionIcon>
194
+ />
320
195
  )}
321
- </Group>
322
- )}
323
- {enableElementDetails && (
324
- <Tooltip
325
- fz="xs"
326
- color="dark"
327
- label="Open details"
328
- withinPortal={false}
329
- offset={2}
330
- openDelay={600}>
331
- <ActionIcon
332
- component={m.div}
333
- variants={VariantsDetailsBtn}
334
- data-animate-target="details"
335
- className={clsx('nodrag nopan', css.detailsBtn)}
336
- radius="md"
337
- style={{ zIndex: 100 }}
338
- role="button"
339
- onClick={onOpenDetails}
340
- onDoubleClick={stopPropagation}
341
- {...isInteractive && animateHandlers}
342
- >
343
- <IconId stroke={1.8} style={{ width: '75%' }} />
344
- </ActionIcon>
345
- </Tooltip>
196
+ </ActionButtonBar>
197
+ </Box>
198
+ {enableElementDetails && !!modelRef && (
199
+ <Box className={clsx(nodeCss.topRightBtnContainer)}>
200
+ <OpenDetailsButton fqn={modelRef} {...isInteractive && animateHandlers} />
201
+ </Box>
346
202
  )}
347
203
  </Box>
348
204
  <Handle type="target" position={Position.Top} className={css.handleCenter} />
@@ -350,38 +206,3 @@ export const ElementNodeMemo = memo<ElementNodeProps>(function ElementNode({
350
206
  </>
351
207
  )
352
208
  }, isEqualProps)
353
-
354
- // const ElementIcon = (
355
- // { element, viewId, renderIcon: RenderIcon }: {
356
- // element: DiagramNode
357
- // viewId: string
358
- // renderIcon: ElementIconRenderer | null
359
- // }
360
- // ) => {
361
- // if (!element.icon) {
362
- // return null
363
- // }
364
- // let icon = null as React.ReactNode
365
- // if (element.icon.startsWith('http://') || element.icon.startsWith('https://')) {
366
- // icon = <img src={element.icon} alt={element.title} />
367
- // } else if (RenderIcon) {
368
- // icon = <RenderIcon node={element} />
369
- // }
370
-
371
- // if (!icon) {
372
- // return null
373
- // }
374
- // return (
375
- // <m.div
376
- // // key={`${viewId}:element:icon:${element.id}`}
377
- // layoutId={`${viewId}:element:icon:${element.id}`}
378
- // className={clsx(
379
- // css.elementIcon,
380
- // 'likec4-element-icon'
381
- // )}
382
- // data-likec4-icon={element.icon}
383
- // >
384
- // {icon}
385
- // </m.div>
386
- // )
387
- // }
@@ -21,9 +21,6 @@ export const container = style({
21
21
  selectors: {
22
22
  ':where(.react-flow__node.selected) &': {
23
23
  willChange: 'transform'
24
- },
25
- '&[data-hovered="true"]': {
26
- willChange: 'transform'
27
24
  }
28
25
  },
29
26
  // Catch pointer below the element
@@ -49,16 +46,6 @@ export const containerAnimated = style({
49
46
  willChange: 'transform'
50
47
  })
51
48
 
52
- export const dimmed = style({})
53
-
54
- globalStyle(`.react-flow__node-element:has(${dimmed})`, {
55
- opacity: 0.25,
56
- transition: 'opacity 400ms ease-in-out, filter 500ms ease-in-out',
57
- transitionDelay: '50ms',
58
- filter: `grayscale(0.85) ${fallbackVar(vars.safariAnimationHook, 'blur(2px)')}`,
59
- willChange: 'opacity, filter'
60
- })
61
-
62
49
  const indicatorKeyframes = keyframes({
63
50
  'from': {
64
51
  strokeOpacity: 0.8
@@ -106,10 +93,6 @@ export const indicator = style({
106
93
  vars: {
107
94
  [indicatorStroke]: `color-mix(in srgb, ${vars.element.fill} 50%, #3c3c3c)`
108
95
  }
109
- },
110
- [`${dimmed} &`]: {
111
- visibility: 'hidden',
112
- display: 'none'
113
96
  }
114
97
  }
115
98
  })
@@ -141,7 +124,8 @@ export const title = style({
141
124
  fontSize: 19,
142
125
  lineHeight: 1.15,
143
126
  textWrap: 'balance',
144
- color: vars.element.hiContrast
127
+ color: vars.element.hiContrast,
128
+ whiteSpaceCollapse: 'preserve-breaks'
145
129
  })
146
130
 
147
131
  export const description = style({
@@ -301,10 +285,6 @@ export const shapeSvgMultiple = style({
301
285
  },
302
286
  ':where([data-likec4-shape="queue"]) &': {
303
287
  transform: 'translate(-10px,8px)'
304
- },
305
- ':where([data-hovered="true"]) &': {
306
- transition: 'opacity 300ms ease-in',
307
- opacity: 0.2
308
288
  }
309
289
  }
310
290
  })
@@ -338,56 +318,52 @@ export const shapeSvg = style({
338
318
  }
339
319
  })
340
320
 
341
- const btn = style({
342
- pointerEvents: 'all',
343
- color: vars.element.loContrast,
344
- cursor: 'pointer',
345
- backgroundColor: 'var(--ai-bg)',
346
- 'vars': {
347
- '--ai-bg-idle': `color-mix(in srgb , ${vars.element.fill}, transparent 99%)`,
348
- '--ai-bg': `var(--ai-bg-idle)`,
349
- '--ai-bg-hover': `color-mix(in srgb , ${vars.element.fill} 65%, ${vars.element.stroke})`,
350
- '--ai-hover': `color-mix(in srgb , ${vars.element.fill} 50%, ${vars.element.stroke})`
351
- },
352
- ':hover': {
353
- boxShadow: mantine.shadows.md
354
- }
355
- })
356
-
357
- export const navigateBtnBox = style({
321
+ export const bottomButtonsContainer = style({
358
322
  zIndex: 100,
359
323
  position: 'absolute',
360
- left: '50%',
324
+ left: 0,
325
+ width: '100%',
361
326
  bottom: 2,
362
- transform: 'translate(-50%, 0%)',
363
- gap: 0,
327
+ display: 'flex',
328
+ flexDirection: 'row',
329
+ flexWrap: 'nowrap',
330
+ alignItems: 'center',
331
+ gap: 2,
332
+ justifyContent: 'center',
333
+ pointerEvents: 'none',
364
334
  selectors: {
365
335
  [`:where([data-likec4-shape='browser']) &`]: {
366
336
  bottom: 4
367
337
  }
368
338
  }
369
339
  })
370
- globalStyle(`:where(.react-flow__node:hover) ${navigateBtnBox}`, {
371
- transitionDelay: '20ms',
372
- gap: 16
373
- })
374
340
 
375
- export const navigateBtn = style([btn, {}])
341
+ // --group-gap: var(--mantine-spacing-md);
342
+ // --group-align: center;
343
+ // --group-justify: flex-start;
344
+ // --group-wrap: wrap;
345
+ // gap: 0px;
346
+ // }
347
+ // <style>
348
+ // .element_bottomButtonsContainer__14yllojn {
349
+ // z-index: 100;
350
+ // position: absolute;
351
+ // left: 50%;
352
+ // bottom: 2px;
353
+ // transform: translate(-50%, 0%);
354
+ // }
376
355
 
377
- export const detailsBtn = style([btn, {
378
- position: 'absolute',
379
- top: 2,
380
- right: 2,
381
- selectors: {
382
- [`:where([data-likec4-shape='browser']) &`]: {
383
- right: 5
384
- },
385
- ':where([data-likec4-shape="cylinder"], [data-likec4-shape="storage"]) &': {
386
- top: 14
387
- },
388
- ':where([data-likec4-shape="queue"]) &': {
389
- top: 1,
390
- right: 12
391
- }
392
- }
393
- }])
356
+ // <style>
357
+ // .m_4081bf90 {
358
+ // display: flex
359
+ // ;
360
+ // flex-direction: row;
361
+ // flex-wrap: var(--group-wrap, wrap);
362
+ // justify-content: var(--group-justify, flex-start);
363
+ // align-items: var(--group-align, center);
364
+ // gap: var(--group-gap, var(--mantine-spacing-md));
365
+ // }
366
+ // globalStyle(`:where(.react-flow__node:hover) ${bottomButtonsContainer}`, {
367
+ // transitionDelay: '20ms',
368
+ // gap: 16
369
+ // })
@@ -14,7 +14,7 @@ export const ElementIcon = ({
14
14
  className: string
15
15
  renderIcon: ElementIconRenderer | null
16
16
  }) => {
17
- if (!element.icon) {
17
+ if (!element.icon || element.icon === 'none') {
18
18
  return null
19
19
  }
20
20
  let icon = null as React.ReactNode