@likec4/diagram 1.30.0 → 1.32.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 (403) hide show
  1. package/README.md +324 -5
  2. package/bundle/chunk-BvTQaUYl.js +21851 -0
  3. package/bundle/custom.js +65 -0
  4. package/bundle/index.js +19910 -40570
  5. package/dist/LikeC4CustomColors.d.ts +2 -7
  6. package/dist/LikeC4CustomColors.js +17 -6
  7. package/dist/LikeC4Diagram.d.ts +3 -2
  8. package/dist/LikeC4Diagram.js +14 -16
  9. package/dist/LikeC4Diagram.props.d.ts +34 -23
  10. package/dist/LikeC4ModelProvider.d.ts +5 -4
  11. package/dist/LikeC4ModelProvider.js +0 -1
  12. package/dist/StaticLikeC4Diagram.d.ts +3 -2
  13. package/dist/StaticLikeC4Diagram.js +2 -2
  14. package/dist/base/BaseXYFlow.js +8 -8
  15. package/dist/base/const.d.ts +1 -1
  16. package/dist/base/const.js +1 -1
  17. package/dist/base/index.d.ts +2 -1
  18. package/dist/base/primitives/compound/CompoundActionButton.d.ts +3 -2
  19. package/dist/base/primitives/compound/CompoundActionButton.js +2 -1
  20. package/dist/base/primitives/compound/CompoundDetailsButton.d.ts +3 -2
  21. package/dist/base/primitives/compound/CompoundDetailsButton.js +2 -1
  22. package/dist/base/primitives/compound/CompoundNodeContainer.d.ts +7 -3
  23. package/dist/base/primitives/compound/CompoundNodeContainer.js +3 -2
  24. package/dist/base/primitives/compound/CompoundTitle.d.ts +1 -1
  25. package/dist/base/primitives/compound/CompoundTitle.js +2 -1
  26. package/dist/base/primitives/customEdge.d.ts +2 -35
  27. package/dist/base/primitives/customEdge.js +2 -2
  28. package/dist/base/primitives/customNode.d.ts +2 -2
  29. package/dist/base/primitives/customNode.js +9 -2
  30. package/dist/base/primitives/edge/EdgeContainer.d.ts +1 -1
  31. package/dist/base/primitives/edge/EdgeContainer.js +0 -1
  32. package/dist/base/primitives/edge/EdgeLabel.css.js +1 -0
  33. package/dist/base/primitives/edge/EdgeLabel.d.ts +3 -3
  34. package/dist/base/primitives/edge/EdgeLabel.js +6 -5
  35. package/dist/base/primitives/edge/EdgeLabelContainer.d.ts +1 -1
  36. package/dist/base/primitives/edge/EdgeLabelContainer.js +0 -2
  37. package/dist/base/primitives/edge/EdgeMarkers.d.ts +1 -1
  38. package/dist/base/primitives/edge/EdgePath.d.ts +1 -1
  39. package/dist/base/primitives/edge/EdgePath.js +2 -2
  40. package/dist/base/primitives/element/ElementActionButtons.js +10 -9
  41. package/dist/base/primitives/element/ElementDetailsButton.js +2 -1
  42. package/dist/base/primitives/element/ElementNodeContainer.d.ts +24 -22
  43. package/dist/base/primitives/element/ElementNodeContainer.js +66 -68
  44. package/dist/base/primitives/element/ElementShape.d.ts +8 -4
  45. package/dist/base/primitives/element/ElementShape.js +4 -3
  46. package/dist/base/primitives/element/ElementTags.d.ts +14 -0
  47. package/dist/base/primitives/element/ElementTags.js +176 -0
  48. package/dist/base/primitives/element/ElementTitle.css.d.ts +1 -1
  49. package/dist/base/primitives/element/ElementTitle.d.ts +5 -4
  50. package/dist/base/primitives/element/ElementTitle.js +6 -7
  51. package/dist/base/primitives/index.d.ts +1 -0
  52. package/dist/base/types.Base.d.ts +54 -0
  53. package/dist/base/types.Base.js +48 -0
  54. package/dist/base/types.d.ts +3 -53
  55. package/dist/bundle/LikeC4View.d.ts +2 -1
  56. package/dist/bundle/LikeC4View.js +13 -8
  57. package/dist/bundle/LikeC4View.props.d.ts +20 -5
  58. package/dist/bundle/ReactLikeC4.d.ts +4 -7
  59. package/dist/bundle/ReactLikeC4.js +4 -4
  60. package/dist/bundle/ShadowRoot.js +3 -3
  61. package/dist/bundle/custom.d.ts +1 -0
  62. package/dist/bundle/index.d.ts +3 -1
  63. package/dist/bundle/index.js +9 -0
  64. package/dist/bundle/styles.css.js +5 -5
  65. package/dist/components/ErrorFallback.d.ts +2 -0
  66. package/dist/components/ErrorFallback.js +29 -0
  67. package/dist/components/SearchControl.js +2 -2
  68. package/dist/context/ControlsCustomLayout.js +0 -1
  69. package/dist/context/DiagramEventHandlers.d.ts +6 -5
  70. package/dist/context/DiagramEventHandlers.js +5 -5
  71. package/dist/context/DiagramFeatures.d.ts +3 -5
  72. package/dist/context/DiagramFeatures.js +11 -40
  73. package/dist/context/EnsureMantine.js +9 -4
  74. package/dist/context/FramerMotionConfig.js +0 -1
  75. package/dist/context/IconRenderer.js +8 -11
  76. package/dist/context/ReduceGraphics.js +6 -6
  77. package/dist/context/RootContainer.js +10 -6
  78. package/dist/context/TagStylesContext.d.ts +7 -0
  79. package/dist/context/TagStylesContext.js +85 -0
  80. package/dist/context/index.d.ts +1 -1
  81. package/dist/custom/components.d.ts +5 -0
  82. package/dist/custom/customNodes.d.ts +228 -0
  83. package/dist/custom/hooks.d.ts +10 -0
  84. package/dist/custom/index.d.ts +4 -0
  85. package/dist/hooks/index.d.ts +1 -1
  86. package/dist/hooks/safeContext.js +3 -3
  87. package/dist/hooks/useCurrentViewId.d.ts +5 -1
  88. package/dist/hooks/useCurrentViewId.js +1 -2
  89. package/dist/hooks/useDiagram.d.ts +77 -12572
  90. package/dist/hooks/useDiagram.js +9 -7
  91. package/dist/hooks/useMantinePortalProps.d.ts +2 -2
  92. package/dist/hooks/useMantinePortalProps.js +2 -2
  93. package/dist/hooks/useSearchActor.d.ts +2 -0
  94. package/dist/hooks/useSearchActor.js +10 -0
  95. package/dist/hooks/useSetState.js +3 -3
  96. package/dist/hooks/useUpdateEffect.js +3 -1
  97. package/dist/hooks/useXYFlow.d.ts +75 -73
  98. package/dist/hooks/useXYFlow.js +7 -3
  99. package/dist/index.d.ts +2 -4
  100. package/dist/index.js +8 -3
  101. package/dist/likec4diagram/DiagramUI.js +9 -4
  102. package/dist/likec4diagram/DiagramXYFlow.d.ts +4 -3
  103. package/dist/likec4diagram/DiagramXYFlow.js +124 -109
  104. package/dist/likec4diagram/custom/edges/NotePopover.js +2 -2
  105. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +12 -15
  106. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +16 -8
  107. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +19 -15
  108. package/dist/likec4diagram/custom/index.d.ts +18 -21
  109. package/dist/likec4diagram/custom/index.js +3 -3
  110. package/dist/likec4diagram/custom/nodes/CompoundActions.js +2 -2
  111. package/dist/likec4diagram/custom/nodes/ElementActions.d.ts +27 -4
  112. package/dist/likec4diagram/custom/nodes/ElementActions.js +67 -53
  113. package/dist/likec4diagram/custom/nodes/index.d.ts +8 -0
  114. package/dist/likec4diagram/custom/nodes/nodes.d.ts +10 -0
  115. package/dist/likec4diagram/custom/nodes/nodes.js +105 -0
  116. package/dist/likec4diagram/custom/nodes/toolbar/ColorButton.js +2 -2
  117. package/dist/likec4diagram/custom/nodes/toolbar/CompoundToolbar.js +6 -7
  118. package/dist/likec4diagram/custom/nodes/toolbar/ElementToolbar.js +3 -3
  119. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.d.ts +3 -2
  120. package/dist/likec4diagram/custom/nodes/toolbar/Toolbar.js +2 -2
  121. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +5 -5
  122. package/dist/likec4diagram/custom/nodes/toolbar/_shared.js +2 -2
  123. package/dist/likec4diagram/types.d.ts +18 -10
  124. package/dist/likec4diagram/ui/controls/ChangeAutoLayoutButton.js +4 -4
  125. package/dist/likec4diagram/ui/controls/Controls.js +14 -6
  126. package/dist/likec4diagram/ui/diagram-title/DiagramTitlePanel.js +2 -2
  127. package/dist/likec4diagram/ui/notation/NotationPanel.js +7 -9
  128. package/dist/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.js +4 -4
  129. package/dist/likec4diagram/useLayoutConstraints.js +3 -4
  130. package/dist/likec4diagram/useViewToNodesEdges.d.ts +5 -3
  131. package/dist/likec4diagram/useViewToNodesEdges.js +22 -30
  132. package/dist/likec4model/LikeC4ModelContext.d.ts +2 -2
  133. package/dist/likec4model/LikeC4ModelContext.js +2 -2
  134. package/dist/likec4model/useLikeC4ElementsTree.d.ts +1 -1
  135. package/dist/likec4model/useLikeC4ElementsTree.js +4 -4
  136. package/dist/likec4model/useLikeC4Model.d.ts +22 -10
  137. package/dist/likec4model/useLikeC4Model.js +13 -9
  138. package/dist/overlays/Overlays.d.ts +2 -3
  139. package/dist/overlays/Overlays.js +9 -33
  140. package/dist/overlays/element-details/ElementDetailsCard.css.js +13 -9
  141. package/dist/overlays/element-details/ElementDetailsCard.d.ts +1 -1
  142. package/dist/overlays/element-details/ElementDetailsCard.js +110 -110
  143. package/dist/overlays/element-details/TabPanelDeployments.d.ts +1 -1
  144. package/dist/overlays/element-details/TabPanelDeployments.js +5 -5
  145. package/dist/overlays/element-details/TabPanelRelationships.d.ts +1 -1
  146. package/dist/overlays/element-details/TabPanelRelationships.js +2 -2
  147. package/dist/overlays/element-details/TabPanelStructure.d.ts +1 -1
  148. package/dist/overlays/element-details/TabPanelStructure.js +3 -3
  149. package/dist/overlays/element-details/actor.d.ts +5482 -18265
  150. package/dist/overlays/element-details/actor.js +0 -2
  151. package/dist/overlays/element-details/actorContext.js +3 -3
  152. package/dist/overlays/overlay/Overlay.css.d.ts +57 -2
  153. package/dist/overlays/overlay/Overlay.css.js +76 -39
  154. package/dist/overlays/overlay/Overlay.d.ts +23 -1
  155. package/dist/overlays/overlay/Overlay.js +40 -29
  156. package/dist/overlays/overlaysActor.d.ts +5 -3
  157. package/dist/overlays/overlaysActor.js +2 -1
  158. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +6 -9
  159. package/dist/overlays/relationship-details/RelationshipDetails.js +15 -15
  160. package/dist/overlays/relationship-details/SelectEdge.js +2 -3
  161. package/dist/overlays/relationship-details/_types.d.ts +7 -6
  162. package/dist/overlays/relationship-details/actor.d.ts +3 -3
  163. package/dist/overlays/relationship-details/actor.js +7 -7
  164. package/dist/overlays/relationship-details/compute.js +3 -3
  165. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +6 -9
  166. package/dist/overlays/relationship-details/custom/edgeTypes.js +2 -2
  167. package/dist/overlays/relationship-details/custom/nodeTypes.d.ts +3 -31
  168. package/dist/overlays/relationship-details/custom/nodeTypes.js +4 -0
  169. package/dist/overlays/relationship-details/hooks.d.ts +28 -27
  170. package/dist/overlays/relationship-details/hooks.js +4 -4
  171. package/dist/overlays/relationship-details/layout-to-xyflow.js +1 -0
  172. package/dist/overlays/relationship-details/layout.js +5 -4
  173. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +6 -9
  174. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +8 -8
  175. package/dist/overlays/relationships-browser/SelectElement.js +6 -6
  176. package/dist/overlays/relationships-browser/_types.d.ts +7 -6
  177. package/dist/overlays/relationships-browser/actor.d.ts +64 -429
  178. package/dist/overlays/relationships-browser/actor.js +7 -7
  179. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +6 -9
  180. package/dist/overlays/relationships-browser/custom/edgeTypes.js +2 -2
  181. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +17 -18
  182. package/dist/overlays/relationships-browser/custom/nodeTypes.js +5 -2
  183. package/dist/overlays/relationships-browser/hooks.d.ts +4 -61
  184. package/dist/overlays/relationships-browser/hooks.js +4 -4
  185. package/dist/overlays/relationships-browser/layout.d.ts +2 -2
  186. package/dist/overlays/relationships-browser/layout.js +13 -10
  187. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +4 -3
  188. package/dist/search/Search.d.ts +5 -0
  189. package/dist/search/Search.js +192 -0
  190. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.js +0 -1
  191. package/dist/search/components/ElementsColumn.d.ts +2 -0
  192. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.js +26 -25
  193. package/dist/search/components/PickView.d.ts +4 -0
  194. package/dist/search/components/PickView.js +135 -0
  195. package/dist/search/components/SearchByTags.d.ts +1 -0
  196. package/dist/search/components/SearchByTags.js +116 -0
  197. package/dist/search/components/SearchInput.d.ts +2 -0
  198. package/dist/{likec4diagram/ui/search → search/components}/SearchInput.js +53 -35
  199. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.d.ts +3 -2
  200. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.js +14 -13
  201. package/dist/search/components/_shared.css.d.ts +4 -0
  202. package/dist/{likec4diagram/ui/search → search/components}/_shared.css.js +26 -35
  203. package/dist/{likec4diagram/ui/search/LikeC4Search.css.d.ts → search/components/styles.css.d.ts} +0 -2
  204. package/dist/search/components/styles.css.js +60 -0
  205. package/dist/{likec4diagram/ui/search → search/components}/utils.d.ts +1 -0
  206. package/dist/{likec4diagram/ui/search → search/components}/utils.js +7 -1
  207. package/dist/search/hooks.d.ts +16 -0
  208. package/dist/search/hooks.js +35 -0
  209. package/dist/search/searchActor.d.ts +90 -0
  210. package/dist/search/searchActor.js +75 -0
  211. package/dist/state/DiagramActorProvider.d.ts +9 -7
  212. package/dist/state/DiagramActorProvider.js +24 -18
  213. package/dist/state/assign.d.ts +0 -1
  214. package/dist/state/assign.js +9 -19
  215. package/dist/state/diagram-machine.d.ts +749 -10678
  216. package/dist/state/diagram-machine.js +121 -55
  217. package/dist/state/hotkeyActor.d.ts +4 -2
  218. package/dist/state/syncManualLayoutActor.d.ts +15 -4
  219. package/dist/state/syncManualLayoutActor.js +2 -1
  220. package/dist/state/types.d.ts +7 -4
  221. package/dist/state/utils.d.ts +3 -1
  222. package/dist/state/utils.js +3 -0
  223. package/dist/styles-font.css +1 -0
  224. package/dist/styles-min.css +1 -0
  225. package/dist/styles-xyflow.css +1 -0
  226. package/dist/styles.css +1 -0
  227. package/dist/styles.css2.js +3 -0
  228. package/package.json +50 -25
  229. package/panda.buildinfo.json +1002 -0
  230. package/src/LikeC4CustomColors.tsx +21 -6
  231. package/src/LikeC4Diagram.props.ts +42 -31
  232. package/src/LikeC4Diagram.tsx +21 -20
  233. package/src/LikeC4ModelProvider.tsx +7 -6
  234. package/src/StaticLikeC4Diagram.tsx +9 -6
  235. package/src/base/Background.tsx +0 -4
  236. package/src/base/const.ts +1 -1
  237. package/src/base/index.ts +2 -1
  238. package/src/base/primitives/compound/CompoundActionButton.tsx +9 -5
  239. package/src/base/primitives/compound/CompoundDetailsButton.tsx +9 -5
  240. package/src/base/primitives/compound/CompoundNodeContainer.tsx +8 -7
  241. package/src/base/primitives/compound/CompoundTitle.tsx +3 -2
  242. package/src/base/primitives/customEdge.ts +1 -1
  243. package/src/base/primitives/{customNode.ts → customNode.tsx} +11 -3
  244. package/src/base/primitives/edge/EdgeContainer.tsx +2 -1
  245. package/src/base/primitives/edge/EdgeLabel.css.ts +1 -0
  246. package/src/base/primitives/edge/EdgeLabel.tsx +20 -15
  247. package/src/base/primitives/edge/EdgeLabelContainer.tsx +1 -1
  248. package/src/base/primitives/edge/EdgeMarkers.tsx +2 -1
  249. package/src/base/primitives/edge/EdgePath.tsx +1 -1
  250. package/src/base/primitives/element/ElementActionButtons.tsx +11 -10
  251. package/src/base/primitives/element/ElementDetailsButton.tsx +2 -1
  252. package/src/base/primitives/element/ElementNodeContainer.tsx +87 -80
  253. package/src/base/primitives/element/ElementShape.tsx +12 -10
  254. package/src/base/primitives/element/ElementTags.tsx +182 -0
  255. package/src/base/primitives/element/ElementTitle.tsx +21 -15
  256. package/src/base/primitives/index.ts +1 -0
  257. package/src/base/types.Base.ts +104 -0
  258. package/src/base/types.ts +4 -106
  259. package/src/bundle/LikeC4View.props.ts +23 -5
  260. package/src/bundle/LikeC4View.tsx +20 -19
  261. package/src/bundle/ReactLikeC4.tsx +15 -27
  262. package/src/bundle/custom.ts +1 -0
  263. package/src/bundle/index.ts +20 -1
  264. package/src/bundle/styles.css.ts +1 -1
  265. package/src/components/ErrorFallback.tsx +30 -0
  266. package/src/components/SearchControl.tsx +1 -1
  267. package/src/context/DiagramEventHandlers.tsx +5 -4
  268. package/src/context/DiagramFeatures.tsx +15 -30
  269. package/src/context/EnsureMantine.tsx +13 -3
  270. package/src/context/IconRenderer.tsx +2 -5
  271. package/src/context/ReduceGraphics.tsx +6 -6
  272. package/src/context/RootContainer.tsx +9 -3
  273. package/src/context/TagStylesContext.tsx +96 -0
  274. package/src/context/index.ts +0 -1
  275. package/src/custom/components.ts +49 -0
  276. package/src/custom/customNodes.tsx +254 -0
  277. package/src/custom/hooks.ts +36 -0
  278. package/src/custom/index.ts +5 -0
  279. package/src/hooks/index.ts +1 -1
  280. package/src/hooks/useCurrentViewId.ts +6 -1
  281. package/src/hooks/useDiagram.ts +131 -18
  282. package/src/hooks/useMantinePortalProps.ts +10 -1
  283. package/src/hooks/useSearchActor.ts +11 -0
  284. package/src/hooks/useUpdateEffect.ts +7 -4
  285. package/src/hooks/useXYFlow.ts +5 -0
  286. package/src/index.ts +4 -8
  287. package/src/likec4diagram/DiagramUI.tsx +5 -0
  288. package/src/likec4diagram/DiagramXYFlow.tsx +135 -115
  289. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +10 -1
  290. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +17 -14
  291. package/src/likec4diagram/custom/{index.tsx → index.ts} +2 -2
  292. package/src/likec4diagram/custom/nodes/CompoundActions.tsx +2 -2
  293. package/src/likec4diagram/custom/nodes/ElementActions.tsx +100 -57
  294. package/src/likec4diagram/custom/nodes/index.ts +17 -0
  295. package/src/likec4diagram/custom/nodes/nodes.tsx +127 -0
  296. package/src/likec4diagram/custom/nodes/toolbar/CompoundToolbar.tsx +3 -4
  297. package/src/likec4diagram/custom/nodes/toolbar/ElementToolbar.tsx +3 -3
  298. package/src/likec4diagram/custom/nodes/toolbar/Toolbar.tsx +5 -4
  299. package/src/likec4diagram/custom/nodes/toolbar/_shared.tsx +11 -3
  300. package/src/likec4diagram/types.ts +24 -12
  301. package/src/likec4diagram/ui/controls/Controls.tsx +11 -4
  302. package/src/likec4diagram/ui/diagram-title/DiagramTitlePanel.tsx +1 -1
  303. package/src/likec4diagram/ui/notation/NotationPanel.tsx +3 -4
  304. package/src/likec4diagram/ui/walkthrough/DynamicViewWalkthrough.tsx +1 -1
  305. package/src/likec4diagram/useViewToNodesEdges.ts +36 -36
  306. package/src/likec4model/LikeC4ModelContext.ts +2 -2
  307. package/src/likec4model/useLikeC4ElementsTree.ts +4 -2
  308. package/src/likec4model/useLikeC4Model.ts +18 -16
  309. package/src/overlays/Overlays.tsx +7 -35
  310. package/src/overlays/element-details/ElementDetailsCard.css.ts +14 -22
  311. package/src/overlays/element-details/ElementDetailsCard.tsx +43 -34
  312. package/src/overlays/element-details/TabPanelDeployments.tsx +3 -2
  313. package/src/overlays/element-details/TabPanelRelationships.tsx +2 -1
  314. package/src/overlays/element-details/TabPanelStructure.tsx +1 -1
  315. package/src/overlays/element-details/actor.ts +2 -2
  316. package/src/overlays/overlay/Overlay.css.ts +75 -38
  317. package/src/overlays/overlay/Overlay.tsx +45 -29
  318. package/src/overlays/overlaysActor.ts +5 -4
  319. package/src/overlays/relationship-details/RelationshipDetails.tsx +5 -5
  320. package/src/overlays/relationship-details/SelectEdge.tsx +0 -2
  321. package/src/overlays/relationship-details/_types.ts +18 -14
  322. package/src/overlays/relationship-details/custom/edgeTypes.tsx +2 -2
  323. package/src/overlays/relationship-details/custom/nodeTypes.tsx +4 -0
  324. package/src/overlays/relationship-details/layout-to-xyflow.ts +1 -0
  325. package/src/overlays/relationship-details/layout.ts +3 -1
  326. package/src/overlays/relationships-browser/SelectElement.tsx +1 -1
  327. package/src/overlays/relationships-browser/_types.ts +20 -16
  328. package/src/overlays/relationships-browser/actor.ts +2 -2
  329. package/src/overlays/relationships-browser/custom/edgeTypes.tsx +2 -2
  330. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +5 -2
  331. package/src/overlays/relationships-browser/layout.ts +12 -7
  332. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +4 -4
  333. package/src/search/Search.tsx +237 -0
  334. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.css.ts +0 -29
  335. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.tsx +25 -25
  336. package/src/search/components/PickView.tsx +140 -0
  337. package/src/search/components/SearchByTags.tsx +109 -0
  338. package/src/{likec4diagram/ui/search → search/components}/SearchInput.tsx +63 -36
  339. package/src/{likec4diagram/ui/search → search/components}/ViewsColum.tsx +17 -18
  340. package/src/{likec4diagram/ui/search → search/components}/_shared.css.ts +26 -37
  341. package/src/{likec4diagram/ui/search/LikeC4Search.css.ts → search/components/styles.css.ts} +9 -36
  342. package/src/{likec4diagram/ui/search → search/components}/utils.ts +7 -0
  343. package/src/search/hooks.ts +41 -0
  344. package/src/search/searchActor.ts +99 -0
  345. package/src/state/DiagramActorProvider.tsx +36 -25
  346. package/src/state/assign.ts +10 -10
  347. package/src/state/diagram-machine.ts +128 -60
  348. package/src/state/hotkeyActor.ts +4 -2
  349. package/src/state/syncManualLayoutActor.ts +10 -4
  350. package/src/state/types.ts +11 -3
  351. package/src/state/utils.ts +7 -3
  352. package/src/styles-min.css +2 -0
  353. package/src/styles-xyflow.css +1 -0
  354. package/dist/_virtual/_commonjsHelpers.js +0 -5
  355. package/dist/_virtual/default-map.js +0 -7
  356. package/dist/_virtual/index.js +0 -5
  357. package/dist/_virtual/index2.js +0 -3
  358. package/dist/_virtual/react.production.js +0 -3
  359. package/dist/_virtual/set.js +0 -5
  360. package/dist/_virtual/set2.js +0 -3
  361. package/dist/base/types.js +0 -54
  362. package/dist/base/xyflowMachine.d.ts +0 -212
  363. package/dist/likec4diagram/custom/nodes/nodeTypes.d.ts +0 -8
  364. package/dist/likec4diagram/custom/nodes/nodeTypes.js +0 -92
  365. package/dist/likec4diagram/ui/search/ElementsColumn.d.ts +0 -1
  366. package/dist/likec4diagram/ui/search/LikeC4Search.css.js +0 -87
  367. package/dist/likec4diagram/ui/search/LikeC4Search.d.ts +0 -2
  368. package/dist/likec4diagram/ui/search/LikeC4Search.js +0 -267
  369. package/dist/likec4diagram/ui/search/SearchInput.d.ts +0 -1
  370. package/dist/likec4diagram/ui/search/_shared.css.d.ts +0 -4
  371. package/dist/likec4diagram/ui/search/state.d.ts +0 -19
  372. package/dist/likec4diagram/ui/search/state.js +0 -64
  373. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/default-map.js +0 -172
  374. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/set.js +0 -369
  375. package/dist/node_modules/.pnpm/react@19.1.0/node_modules/react/cjs/react.production.js +0 -556
  376. package/dist/node_modules/.pnpm/react@19.1.0/node_modules/react/index.js +0 -15
  377. package/dist/packages/core/src/compute-view/relationships-view/compute.js +0 -123
  378. package/dist/packages/core/src/compute-view/relationships-view/utils.js +0 -68
  379. package/dist/packages/core/src/errors/index.js +0 -15
  380. package/dist/packages/core/src/model/connection/model/ConnectionModel.js +0 -121
  381. package/dist/packages/core/src/model/connection/model/find.js +0 -39
  382. package/dist/packages/core/src/model/connection/ops.js +0 -7
  383. package/dist/packages/core/src/utils/const.js +0 -3
  384. package/dist/packages/core/src/utils/fqn.js +0 -51
  385. package/dist/packages/core/src/utils/guards.js +0 -7
  386. package/dist/packages/core/src/utils/iterable/filter.js +0 -21
  387. package/dist/packages/core/src/utils/iterable/find.js +0 -21
  388. package/dist/packages/core/src/utils/iterable/map.js +0 -18
  389. package/dist/packages/core/src/utils/iterable/some.js +0 -21
  390. package/dist/packages/core/src/utils/iterable/to.js +0 -14
  391. package/dist/packages/core/src/utils/set.js +0 -48
  392. package/dist/packages/core/src/utils/string-hash.js +0 -13
  393. package/dist/styles.css.js +0 -3
  394. package/src/base/xyflowMachine.ts +0 -75
  395. package/src/likec4diagram/custom/nodes/nodeTypes.tsx +0 -109
  396. package/src/likec4diagram/ui/search/LikeC4Search.tsx +0 -301
  397. package/src/likec4diagram/ui/search/state.ts +0 -78
  398. /package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.d.ts +0 -0
  399. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.d.ts +0 -0
  400. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.js +0 -0
  401. /package/dist/{bundle/font.css.js → styles-font.css2.js} +0 -0
  402. /package/src/{likec4diagram/ui/search → search/components}/ViewsColumn.css.ts +0 -0
  403. /package/src/{bundle/font.css → styles-font.css} +0 -0
@@ -1,4 +1,4 @@
1
- import type { DiagramEdge } from '@likec4/core'
1
+ import type { DiagramEdge } from '@likec4/core/types'
2
2
  import { css, cx } from '@likec4/styles/css'
3
3
  import { type PointerEventHandler, forwardRef } from 'react'
4
4
  import type { UndefinedOnPartialDeep } from 'type-fest'
@@ -1,6 +1,7 @@
1
1
  import { css, cx } from '@likec4/styles/css'
2
+ import { Box } from '@likec4/styles/jsx'
2
3
  import { actionBtn } from '@likec4/styles/recipes'
3
- import { ActionIcon, Box } from '@mantine/core'
4
+ import { ActionIcon } from '@mantine/core'
4
5
  import { useId } from '@mantine/hooks'
5
6
  import * as m from 'motion/react-m'
6
7
  import { useIsZoomTooSmall } from '../../../hooks/useXYFlow'
@@ -13,11 +14,12 @@ type ElementActionButtonsProps = NodeProps & {
13
14
 
14
15
  const container = css({
15
16
  position: 'absolute',
16
- top: `calc(100% - 28px)`,
17
- // transform: 'translateY(-100%)',
18
- left: 0,
19
- width: '100%',
20
- minHeight: '28px',
17
+ zIndex: 1,
18
+ top: `calc(100% - 30px)`,
19
+ transform: 'translateX(-50%)',
20
+ left: `50%`,
21
+ width: 'auto',
22
+ minHeight: '30px',
21
23
  display: 'flex',
22
24
  justifyContent: 'center',
23
25
  alignItems: 'center',
@@ -47,14 +49,13 @@ export function ElementActionButtons({
47
49
  }
48
50
  return (
49
51
  <Box className={container}>
50
- <Box
51
- component={m.div}
52
+ <m.div
52
53
  layoutRoot
53
54
  key={`${id}-action-buttons`}
54
55
  initial={false}
55
56
  style={{
56
57
  originY: 0,
57
- gap: '8px',
58
+ gap: 6,
58
59
  }}
59
60
  animate={{
60
61
  opacity: (isHovered || selected) ? 1 : 0.75,
@@ -82,7 +83,7 @@ export function ElementActionButtons({
82
83
  {button.icon}
83
84
  </ActionIcon>
84
85
  ))}
85
- </Box>
86
+ </m.div>
86
87
  </Box>
87
88
  )
88
89
  }
@@ -1,6 +1,7 @@
1
1
  import { css, cx } from '@likec4/styles/css'
2
+ import { Box } from '@likec4/styles/jsx'
2
3
  import { actionBtn } from '@likec4/styles/recipes'
3
- import { ActionIcon, Box } from '@mantine/core'
4
+ import { ActionIcon } from '@mantine/core'
4
5
  import { useId } from '@mantine/hooks'
5
6
  import { IconId } from '@tabler/icons-react'
6
7
  import * as m from 'motion/react-m'
@@ -1,29 +1,33 @@
1
1
  import {
2
- type DiagramNode,
2
+ type Color,
3
+ type ElementShape,
3
4
  type ElementStyle,
4
5
  DefaultPaddingSize,
5
6
  DefaultShapeSize,
6
7
  DefaultTextSize,
7
- } from '@likec4/core'
8
+ } from '@likec4/core/types'
8
9
  import { css, cx } from '@likec4/styles/css'
9
- import { type BoxProps, Box, createPolymorphicComponent } from '@mantine/core'
10
+ import type { LayoutProps } from 'motion/react'
10
11
  import * as m from 'motion/react-m'
11
- import { type PropsWithChildren, forwardRef } from 'react'
12
+ import { type CSSProperties, type ReactNode, forwardRef } from 'react'
12
13
  import type { NodeProps } from '../../types'
13
14
  import * as styles from './ElementNodeContainer.css'
14
15
 
15
- type RequiredData = Pick<
16
- DiagramNode,
17
- | 'color'
18
- | 'shape'
19
- | 'style'
20
- >
16
+ export type RequiredData = {
17
+ color: Color
18
+ shape: ElementShape
19
+ style?: ElementStyle
20
+ }
21
21
 
22
- type ElementNodeContainerProps =
23
- & BoxProps
24
- & PropsWithChildren<{
22
+ export type ElementNodeContainerProps =
23
+ & {
25
24
  nodeProps: NodeProps<RequiredData>
26
- }>
25
+ children?: ReactNode | undefined
26
+ className?: string | undefined
27
+ style?: CSSProperties | undefined
28
+ [key: `data-${string}`]: string | undefined
29
+ }
30
+ & LayoutProps
27
31
 
28
32
  export function nodeSizes({
29
33
  size,
@@ -49,73 +53,76 @@ export function nodeSizes({
49
53
  }
50
54
  }
51
55
 
52
- export const ElementNodeContainer = createPolymorphicComponent<'div', ElementNodeContainerProps>(
53
- forwardRef<HTMLDivElement, ElementNodeContainerProps>(({
54
- nodeProps: {
55
- selected = false,
56
- selectable = false,
57
- data: {
58
- hovered: isHovered = false,
59
- dimmed: isDimmed = false,
60
- ...data
61
- },
56
+ /**
57
+ * Top-level primitive to compose leaf nodes renderers.
58
+ * This container provides the state via data-* attributes
59
+ */
60
+ export const ElementNodeContainer = forwardRef<HTMLDivElement, ElementNodeContainerProps>(({
61
+ nodeProps: {
62
+ selected = false,
63
+ selectable = false,
64
+ data: {
65
+ hovered: isHovered = false,
66
+ dimmed: isDimmed = false,
67
+ ...data
62
68
  },
63
- style,
64
- children,
65
- ...rest
66
- }, ref) => {
67
- let scale = 1
68
- switch (true) {
69
- case isHovered:
70
- scale = 1.05
71
- break
72
- case selected:
73
- scale = 1.02
74
- break
75
- }
69
+ },
70
+ className,
71
+ style,
72
+ children,
73
+ ...rest
74
+ }, ref) => {
75
+ let scale = 1
76
+ switch (true) {
77
+ case isHovered:
78
+ scale = 1.05
79
+ break
80
+ case selected:
81
+ scale = 1.02
82
+ break
83
+ }
76
84
 
77
- const {
78
- size,
79
- padding,
80
- textSize,
81
- } = nodeSizes(data.style)
85
+ const {
86
+ size,
87
+ padding,
88
+ textSize,
89
+ } = nodeSizes(data.style ?? {})
82
90
 
83
- return (
84
- <Box
85
- component={m.div}
86
- ref={ref}
87
- className={cx(
88
- css({
89
- likec4Palette: data.color,
90
- }),
91
- styles.container,
92
- 'group',
93
- 'likec4-element-node',
94
- )}
95
- initial={false}
96
- {...selectable && {
97
- animate: {
98
- scale,
99
- },
100
- whileTap: { scale: 0.98 },
101
- }}
102
- data-likec4-hovered={isHovered}
103
- data-likec4-color={data.color}
104
- data-likec4-shape={data.shape}
105
- data-likec4-shape-size={size}
106
- data-likec4-spacing={padding}
107
- data-likec4-text-size={textSize}
108
- {...(isDimmed !== false && {
109
- 'data-likec4-dimmed': isDimmed,
110
- })}
111
- style={{
112
- ...style,
113
- }}
114
- {...rest}
115
- >
116
- {children}
117
- </Box>
118
- )
119
- }),
120
- )
91
+ return (
92
+ <m.div
93
+ ref={ref}
94
+ className={cx(
95
+ css({
96
+ likec4Palette: data.color,
97
+ }),
98
+ styles.container,
99
+ 'group',
100
+ 'likec4-element-node',
101
+ className,
102
+ )}
103
+ initial={false}
104
+ {...selectable && {
105
+ animate: {
106
+ scale,
107
+ },
108
+ whileTap: { scale: 0.98 },
109
+ }}
110
+ data-likec4-hovered={isHovered}
111
+ data-likec4-color={data.color}
112
+ data-likec4-shape={data.shape}
113
+ data-likec4-shape-size={size}
114
+ data-likec4-spacing={padding}
115
+ data-likec4-text-size={textSize}
116
+ {...(isDimmed !== false && {
117
+ 'data-likec4-dimmed': isDimmed,
118
+ })}
119
+ style={{
120
+ ...style as any,
121
+ }}
122
+ {...rest}
123
+ >
124
+ {children}
125
+ </m.div>
126
+ )
127
+ })
121
128
  ElementNodeContainer.displayName = 'ElementNodeContainer'
@@ -1,5 +1,6 @@
1
- import { type DiagramNode, type ElementShape, nonexhaustive } from '@likec4/core'
2
- import clsx from 'clsx'
1
+ import { nonexhaustive } from '@likec4/core'
2
+ import type { ElementShape, ElementStyle } from '@likec4/core/types'
3
+ import { cx as clsx } from '@likec4/styles/css'
3
4
  import { toDomPrecision } from '../../../utils/xyflow'
4
5
  import * as css from './ElementShape.css'
5
6
 
@@ -157,19 +158,19 @@ function ElementShapeSvg({ shape, w, h }: ElementShapeProps) {
157
158
  }
158
159
  }
159
160
 
160
- type Data = Pick<
161
- DiagramNode,
162
- | 'shape'
163
- | 'width'
164
- | 'height'
165
- >
161
+ type Data = {
162
+ shape: ElementShape
163
+ width: number
164
+ height: number
165
+ style?: ElementStyle
166
+ }
166
167
 
167
168
  // type ElementShapePrimitiveProps = NodeProps<Data> & {
168
169
  type ElementShapePrimitiveProps = {
169
170
  data: Data
170
171
  width?: number
171
172
  height?: number
172
- isMultiple?: boolean | undefined
173
+ // isMultiple?: boolean | undefined
173
174
  /**
174
175
  * @default true
175
176
  */
@@ -177,10 +178,11 @@ type ElementShapePrimitiveProps = {
177
178
  }
178
179
 
179
180
  export function ElementShape(
180
- { data, width, height, isMultiple = false, withSelectedIndicator = true }: ElementShapePrimitiveProps,
181
+ { data, width, height, withSelectedIndicator = true }: ElementShapePrimitiveProps,
181
182
  ) {
182
183
  let w = !!width && width > 10 ? width : data.width
183
184
  let h = !!height && height > 10 ? height : data.height
185
+ const isMultiple = data.style?.multiple ?? false
184
186
  return (
185
187
  <>
186
188
  {isMultiple && (
@@ -0,0 +1,182 @@
1
+ import { isTagColorSpecified } from '@likec4/core'
2
+ import { css, cx } from '@likec4/styles/css'
3
+ import { type BoxProps, Box, HStack } from '@likec4/styles/jsx'
4
+ import { hstack } from '@likec4/styles/patterns'
5
+ import { likec4tag } from '@likec4/styles/recipes'
6
+ import { HoverCard } from '@mantine/core'
7
+ import { deepEqual } from 'fast-equals'
8
+ import { forwardRef, memo, useCallback } from 'react'
9
+ import { useTagSpecification } from '../../../context/TagStylesContext'
10
+ import { useDiagram } from '../../../hooks/useDiagram'
11
+ import { useMantinePortalProps } from '../../../hooks/useMantinePortalProps'
12
+ import { useCurrentZoom } from '../../../hooks/useXYFlow'
13
+ import { stopPropagation } from '../../../utils/xyflow'
14
+ import type { NodeProps } from '../../types'
15
+
16
+ export type ElementTagProps = {
17
+ tag: string
18
+ } & Omit<BoxProps, 'children'>
19
+
20
+ export const ElementTag = forwardRef<HTMLDivElement, ElementTagProps>(
21
+ ({ tag, className, ...props }, ref) => {
22
+ const spec = useTagSpecification(tag)
23
+ return (
24
+ <Box
25
+ ref={ref}
26
+ data-likec4-tag={tag}
27
+ className={cx(
28
+ likec4tag({
29
+ autoTextColor: isTagColorSpecified(spec),
30
+ }),
31
+ className,
32
+ )}
33
+ {...props}
34
+ >
35
+ <span style={{ opacity: 0.7, fontSize: '1.05em' }}>#</span>
36
+ <span>{tag}</span>
37
+ </Box>
38
+ )
39
+ },
40
+ )
41
+
42
+ type Data = {
43
+ tags: readonly string[] | null | undefined
44
+ width: number
45
+ }
46
+ type ElementTagsProps = NodeProps<Data>
47
+
48
+ const propsAreEqual = (prev: ElementTagsProps, next: ElementTagsProps) => {
49
+ return prev.data.width === next.data.width && deepEqual(prev.data.tags, next.data.tags)
50
+ }
51
+ export const ElementTags = memo(({ id, data: { tags, width } }: ElementTagsProps) => {
52
+ const zoom = useCurrentZoom()
53
+ const zoomIsLargeEnough = zoom > 1.2
54
+ const portalProps = useMantinePortalProps()
55
+ if (!tags || tags.length === 0) {
56
+ return null
57
+ }
58
+ const maxWidth = Math.max(Math.round(width * zoom) - 10, 200)
59
+
60
+ return (
61
+ <HoverCard
62
+ {...portalProps}
63
+ floatingStrategy="fixed"
64
+ position="bottom-start"
65
+ offset={{
66
+ alignmentAxis: Math.round(4 * zoom),
67
+ mainAxis: 8,
68
+ }}
69
+ keepMounted={false}
70
+ openDelay={300}
71
+ closeDelay={500}
72
+ >
73
+ <HoverCard.Target>
74
+ <div
75
+ className={cx(
76
+ 'likec4-element-tags',
77
+ hstack({
78
+ pointerEvents: 'all',
79
+ gap: 4,
80
+ alignItems: 'flex-end',
81
+ justifyItems: 'stretch',
82
+ position: 'absolute',
83
+ width: '100%',
84
+ bottom: 0,
85
+ left: 0,
86
+ padding: 4,
87
+ _shapeCylinder: {
88
+ bottom: 5,
89
+ },
90
+ _shapeStorage: {
91
+ bottom: 5,
92
+ },
93
+ _shapeQueue: {
94
+ bottom: 0,
95
+ paddingLeft: 14,
96
+ },
97
+ }),
98
+ )}
99
+ onClick={stopPropagation}
100
+ >
101
+ {tags.map((tag) => (
102
+ <Box
103
+ key={id + '#' + tag}
104
+ data-likec4-tag={tag}
105
+ className={css({
106
+ layerStyle: 'likec4.tag',
107
+ flex: 1,
108
+ display: 'flex',
109
+ alignItems: 'center',
110
+ justifyContent: 'center',
111
+ maxWidth: 50,
112
+ height: 5,
113
+ _whenHovered: {
114
+ height: 12,
115
+ borderRadius: 4,
116
+ transitionDelay: '.08s',
117
+ },
118
+ transition: 'fast',
119
+ })}
120
+ />
121
+ ))}
122
+ </div>
123
+ </HoverCard.Target>
124
+ <HoverCard.Dropdown
125
+ p={0}
126
+ w={'auto'}
127
+ maw={maxWidth}
128
+ className={css({
129
+ background: 'transparent',
130
+ border: 'none',
131
+ })}
132
+ >
133
+ <ElementTagsDropdown tags={tags} zoomIsLargeEnough={zoomIsLargeEnough} />
134
+ </HoverCard.Dropdown>
135
+ </HoverCard>
136
+ )
137
+ }, propsAreEqual)
138
+ ElementTags.displayName = 'ElementTags'
139
+
140
+ function ElementTagsDropdown({ tags, zoomIsLargeEnough }: { tags: readonly string[]; zoomIsLargeEnough: boolean }) {
141
+ const diagram = useDiagram()
142
+
143
+ const onHover = (tag: string) => {
144
+ diagram.send({ type: 'tag.highlight', tag })
145
+ }
146
+
147
+ const onLeave = useCallback(() => {
148
+ diagram.send({ type: 'tag.unhighlight' })
149
+ }, [])
150
+
151
+ return (
152
+ <HStack
153
+ css={{
154
+ gap: 4,
155
+ flexWrap: 'wrap',
156
+ pb: 'sm',
157
+ }}
158
+ >
159
+ {tags.map((tag) => (
160
+ <ElementTag
161
+ key={tag}
162
+ tag={tag}
163
+ className={css({
164
+ userSelect: 'none',
165
+ cursor: 'pointer',
166
+ ...(zoomIsLargeEnough && {
167
+ fontSize: 'lg',
168
+ borderRadius: 4,
169
+ px: 6,
170
+ }),
171
+ })}
172
+ onClick={e => {
173
+ e.stopPropagation()
174
+ diagram.openSearch(`#${tag}`)
175
+ }}
176
+ onMouseEnter={() => onHover(tag)}
177
+ onMouseLeave={onLeave}
178
+ />
179
+ ))}
180
+ </HStack>
181
+ )
182
+ }
@@ -1,24 +1,29 @@
1
- import { type DiagramNode } from '@likec4/core'
1
+ import type { DiagramNode } from '@likec4/core/types'
2
2
  import { cx } from '@likec4/styles/css'
3
- import { Box, Text } from '@mantine/core'
3
+ import { Box } from '@likec4/styles/jsx'
4
+ import { Text } from '@mantine/core'
4
5
  import { isEmpty, isNumber, isTruthy } from 'remeda'
6
+ import type { Simplify } from 'type-fest'
5
7
  import { IconRenderer } from '../../../context/IconRenderer'
6
- import type { NodeProps } from '../../types'
8
+ import type { NodeProps, NonOptional } from '../../types'
7
9
  import { nodeSizes } from './ElementNodeContainer'
8
10
  import * as styles from './ElementTitle.css'
9
11
 
10
- type Data =
11
- & Pick<
12
- DiagramNode,
13
- | 'title'
14
- | 'technology'
15
- | 'description'
16
- | 'color'
17
- | 'style'
12
+ type Data = Simplify<
13
+ & NonOptional<
14
+ Pick<
15
+ DiagramNode,
16
+ | 'title'
17
+ | 'technology'
18
+ | 'description'
19
+ | 'color'
20
+ | 'style'
21
+ >
18
22
  >
19
23
  & {
20
24
  icon?: string | null
21
25
  }
26
+ >
22
27
 
23
28
  type ElementTitleProps = NodeProps<Data> & {
24
29
  iconSize?: number
@@ -47,11 +52,12 @@ export function ElementTitle({ id, data, iconSize }: ElementTitleProps) {
47
52
  classes.root,
48
53
  'likec4-element',
49
54
  )}
50
- style={{
51
- ...isNumber(iconSize) && {
55
+ style={isNumber(iconSize)
56
+ ? {
57
+ // @ts-ignore
52
58
  [styles.iconSize]: `${iconSize}px`,
53
- },
54
- }}
59
+ }
60
+ : undefined}
55
61
  >
56
62
  {elementIcon}
57
63
  <Box className={cx(classes.textContainer, 'likec4-element-main-props')}>
@@ -14,5 +14,6 @@ export { ElementActionButtons } from './element/ElementActionButtons'
14
14
  export { ElementDetailsButton } from './element/ElementDetailsButton'
15
15
  export { ElementNodeContainer } from './element/ElementNodeContainer'
16
16
  export { ElementShape } from './element/ElementShape'
17
+ export { ElementTag, ElementTags } from './element/ElementTags'
17
18
  export { ElementTitle } from './element/ElementTitle'
18
19
  export { DefaultHandles } from './NodeHandles'
@@ -0,0 +1,104 @@
1
+ import type {
2
+ Edge as RFEdge,
3
+ Node as RFNode,
4
+ NodeProps as ReactFlowNodeProps,
5
+ } from '@xyflow/react'
6
+ import { hasSubObject } from 'remeda'
7
+ import type { Simplify } from 'type-fest'
8
+
9
+ // 'immediate' means that the node is dimmed without delay
10
+ export type Dimmed = 'immediate' | boolean
11
+
12
+ export type NodeData = {
13
+ /**
14
+ * Whether the cursor is hovering over the node
15
+ */
16
+ hovered?: boolean
17
+ /**
18
+ * Whether the node is dimmed
19
+ * 'immediate' means that the node is dimmed without delay
20
+ */
21
+ dimmed?: Dimmed
22
+ }
23
+ export type Node = RFNode<NodeData>
24
+
25
+ export type NodeProps = ReactFlowNodeProps<RFNode<NodeData, any>>
26
+
27
+ export type EdgeData = {
28
+ /**
29
+ * Whether the cursor is hovering over the edge
30
+ */
31
+ hovered?: boolean
32
+ /**
33
+ * Whether the edge is active (animated and highlighted)
34
+ */
35
+ active?: boolean
36
+ /**
37
+ * Whether the edge is dimmed
38
+ * 'immediate' means that the edge is dimmed without delay
39
+ */
40
+ dimmed?: Dimmed
41
+ }
42
+
43
+ // export type Edge = SetRequired<ReactFlowEdge<EdgeData, 'relation'>, 'data' | 'type'>
44
+ export type Edge = Simplify<Omit<RFEdge, 'data'> & { data: EdgeData }>
45
+
46
+ type WithDimmed = { data: { dimmed?: Dimmed } }
47
+ type WithHovered = { data: { hovered?: boolean } }
48
+
49
+ const _setDimmed = <T extends WithDimmed>(v: T, dimmed: Dimmed): T =>
50
+ (v.data.dimmed ?? false) === dimmed ? v : ({
51
+ ...v,
52
+ data: {
53
+ ...v.data,
54
+ dimmed,
55
+ },
56
+ })
57
+
58
+ export function setDimmed<T extends WithDimmed>(value: T, dimmed: 'immediate' | boolean): T
59
+ export function setDimmed(dimmed: 'immediate' | boolean): <T extends WithDimmed>(value: T) => T
60
+ export function setDimmed<T extends WithDimmed>(arg1: T | Dimmed, arg2?: Dimmed) {
61
+ if (arg2 !== undefined) {
62
+ return _setDimmed(arg1 as T, arg2)
63
+ }
64
+ return (v: T) => _setDimmed(v, arg1 as Dimmed)
65
+ }
66
+
67
+ const _setHovered = <T extends WithHovered>(v: T, hovered: boolean): T =>
68
+ (v.data.hovered ?? false) === hovered ? v : ({
69
+ ...v,
70
+ data: {
71
+ ...v.data,
72
+ hovered,
73
+ },
74
+ })
75
+ export function setHovered<T extends WithHovered>(value: T, hovered: boolean): T
76
+ export function setHovered(hovered: boolean): <T extends WithHovered>(value: T) => T
77
+ export function setHovered<T extends WithHovered>(arg1: T | boolean, arg2?: boolean) {
78
+ if (arg2 !== undefined) {
79
+ return _setHovered(arg1 as T, arg2)
80
+ }
81
+ return (v: T) => _setHovered(v, arg1 as boolean)
82
+ }
83
+
84
+ type WithData<D> = { data: D }
85
+ function _setData<D, E extends WithData<D>>(value: E, state: Partial<NoInfer<D>>): E {
86
+ if (hasSubObject(value.data as any, state as any)) {
87
+ return value
88
+ }
89
+ return {
90
+ ...value,
91
+ data: {
92
+ ...value.data,
93
+ ...state,
94
+ },
95
+ }
96
+ }
97
+ export function setData<E extends WithData<any>>(value: E, state: Partial<E['data']>): E
98
+ export function setData<E extends WithData<any>>(state: Partial<E['data']>): (value: E) => E
99
+ export function setData<E extends WithData<any>>(arg1: E | Partial<E['data']>, arg2?: any) {
100
+ if (arg2 !== undefined) {
101
+ return _setData(arg1 as E, arg2)
102
+ }
103
+ return (edge: E) => _setData(edge, arg1 as Partial<EdgeData>)
104
+ }