@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,16 +1,15 @@
1
1
  import {
2
- type BBox,
2
+ type DiagramNode,
3
3
  type DiagramView,
4
4
  type EdgeId,
5
- type ElementNotation,
6
5
  type Fqn,
7
6
  type NodeId,
7
+ type NodeNotation as ElementNotation,
8
8
  type StepEdgeId,
9
9
  type ViewChange,
10
10
  type ViewId,
11
11
  type XYPoint,
12
- DiagramNode,
13
- getBBoxCenter,
12
+ BBox,
14
13
  getParallelStepsPrefix,
15
14
  invariant,
16
15
  isStepEdgeId,
@@ -26,6 +25,7 @@ import {
26
25
  } from '@xyflow/react'
27
26
  import { type EdgeChange, type NodeChange, type Rect, type Viewport, nodeToRect } from '@xyflow/system'
28
27
  import { clamp, first, hasAtLeast, prop } from 'remeda'
28
+ import type { PartialDeep } from 'type-fest'
29
29
  import {
30
30
  type ActorLogicFrom,
31
31
  type ActorRef,
@@ -50,6 +50,7 @@ import type { OpenSourceParams, PaddingWithUnit } from '../LikeC4Diagram.props'
50
50
  import type { Types } from '../likec4diagram/types'
51
51
  import { createLayoutConstraints } from '../likec4diagram/useLayoutConstraints'
52
52
  import { overlaysActorLogic } from '../overlays/overlaysActor'
53
+ import { searchActorLogic } from '../search/searchActor'
53
54
  import { type AlignmentMode, getAligner, toNodeRect } from './aligners'
54
55
  import {
55
56
  focusNodesEdges,
@@ -58,7 +59,6 @@ import {
58
59
  navigateBack,
59
60
  navigateForward,
60
61
  resetEdgeControlPoints,
61
- unfocusNodesEdges,
62
62
  updateActiveWalkthrough,
63
63
  updateEdgeData,
64
64
  updateNavigationHistory,
@@ -69,7 +69,7 @@ import { DiagramToggledFeaturesPersistence } from './persistence'
69
69
  import { type Events as SyncLayoutEvents, syncManualLayoutActorLogic } from './syncManualLayoutActor'
70
70
  import { findDiagramNode, focusedBounds, typedSystem } from './utils'
71
71
 
72
- type XYStoreApi = ReturnType<typeof useStoreApi<Types.Node, Types.Edge>>
72
+ export type XYStoreApi = ReturnType<typeof useStoreApi<Types.Node, Types.Edge>>
73
73
 
74
74
  export interface NavigationHistory {
75
75
  history: ReadonlyArray<{
@@ -89,7 +89,7 @@ export interface Input {
89
89
  nodesSelectable: boolean
90
90
  }
91
91
 
92
- type ToggledFeatures = Partial<EnabledFeatures>
92
+ export type ToggledFeatures = Partial<EnabledFeatures>
93
93
 
94
94
  export interface Context extends Input {
95
95
  xynodes: Types.Node[]
@@ -150,8 +150,8 @@ export type Events =
150
150
  | { type: 'xyflow.nodeMouseLeave'; node: Types.Node }
151
151
  | { type: 'xyflow.edgeMouseEnter'; edge: Types.Edge }
152
152
  | { type: 'xyflow.edgeMouseLeave'; edge: Types.Edge }
153
- | { type: 'update.nodeData'; nodeId: NodeId; data: Partial<Types.NodeData> }
154
- | { type: 'update.edgeData'; edgeId: EdgeId; data: Partial<Types.Edge['data']> }
153
+ | { type: 'update.nodeData'; nodeId: NodeId; data: PartialDeep<Types.NodeData> }
154
+ | { type: 'update.edgeData'; edgeId: EdgeId; data: PartialDeep<Types.EdgeData> }
155
155
  | { type: 'update.view'; view: DiagramView; xynodes: Types.Node[]; xyedges: Types.Edge[] }
156
156
  | { type: 'update.inputs'; inputs: Partial<Omit<Input, 'view' | 'xystore'>> }
157
157
  | { type: 'update.features'; features: EnabledFeatures }
@@ -160,6 +160,7 @@ export type Events =
160
160
  | { type: 'open.elementDetails'; fqn: Fqn; fromNode?: NodeId | undefined }
161
161
  | { type: 'open.relationshipDetails'; params: { edgeId: EdgeId } | { source: Fqn; target: Fqn } }
162
162
  | { type: 'open.relationshipsBrowser'; fqn: Fqn }
163
+ | { type: 'open.search'; search?: string }
163
164
  // | { type: 'close.overlay' }
164
165
  | { type: 'navigate.to'; viewId: ViewId; fromNode?: NodeId | undefined }
165
166
  | { type: 'navigate.back' }
@@ -174,12 +175,14 @@ export type Events =
174
175
  | { type: 'walkthrough.end' }
175
176
  | { type: 'notations.highlight'; notation: ElementNotation; kind?: string }
176
177
  | { type: 'notations.unhighlight' }
178
+ | { type: 'tag.highlight'; tag: string }
179
+ | { type: 'tag.unhighlight' }
177
180
  | { type: 'toggle.feature'; feature: FeatureName; forceValue?: boolean }
178
181
 
179
182
  export type ActionArg = { context: Context; event: Events }
180
183
 
181
184
  // TODO: naming convention for actors
182
- export const diagramMachine = setup({
185
+ const _diagramMachine = setup({
183
186
  types: {
184
187
  context: {} as Context,
185
188
  input: {} as Input,
@@ -187,6 +190,7 @@ export const diagramMachine = setup({
187
190
  syncLayout: 'syncManualLayoutActorLogic'
188
191
  hotkey: 'hotkeyActorLogic'
189
192
  overlays: 'overlaysActorLogic'
193
+ search: 'searchActorLogic'
190
194
  },
191
195
  events: {} as Events,
192
196
  },
@@ -194,6 +198,7 @@ export const diagramMachine = setup({
194
198
  syncManualLayoutActorLogic,
195
199
  hotkeyActorLogic,
196
200
  overlaysActorLogic,
201
+ searchActorLogic,
197
202
  },
198
203
  guards: {
199
204
  'isReady': ({ context }) => context.initialized.xydata && context.initialized.xyflow,
@@ -201,8 +206,9 @@ export const diagramMachine = setup({
201
206
  'enabled: FocusMode': ({ context }) => context.features.enableFocusMode,
202
207
  'enabled: Readonly': ({ context }) => context.features.enableReadOnly,
203
208
  'enabled: RelationshipDetails': ({ context }) => context.features.enableRelationshipDetails,
209
+ 'enabled: Search': ({ context }) => context.features.enableSearch,
204
210
  'not readonly': ({ context }) => !context.features.enableReadOnly,
205
- 'is dynamic view': ({ context }) => context.view.__ === 'dynamic',
211
+ 'is dynamic view': ({ context }) => context.view._type === 'dynamic',
206
212
  'is another view': ({ context, event }) => {
207
213
  assertEvent(event, ['update.view', 'navigate.to'])
208
214
  if (event.type === 'update.view') {
@@ -257,10 +263,10 @@ export const diagramMachine = setup({
257
263
  const diagramNode = findDiagramNode(context, nodeId)
258
264
  if (!diagramNode) return
259
265
 
260
- if (DiagramNode.deploymentRef(diagramNode)) {
261
- enqueue.raise({ type: 'open.source', deployment: DiagramNode.deploymentRef(diagramNode)! })
262
- } else if (DiagramNode.modelRef(diagramNode)) {
263
- enqueue.raise({ type: 'open.source', element: DiagramNode.modelRef(diagramNode)! })
266
+ if (diagramNode.deploymentRef) {
267
+ enqueue.raise({ type: 'open.source', deployment: diagramNode.deploymentRef })
268
+ } else if (diagramNode.modelRef) {
269
+ enqueue.raise({ type: 'open.source', element: diagramNode.modelRef })
264
270
  }
265
271
  }),
266
272
 
@@ -269,7 +275,7 @@ export const diagramMachine = setup({
269
275
  bounds = context.view.bounds,
270
276
  duration = 450,
271
277
  } = params ?? {}
272
- const { width, height, panZoom, transform } = context.xystore.getState()
278
+ const { width, height, panZoom, transform } = nonNullable(context.xystore).getState()
273
279
 
274
280
  const maxZoom = Math.max(1, transform[2])
275
281
  const viewport = getViewportForBounds(
@@ -287,7 +293,7 @@ export const diagramMachine = setup({
287
293
 
288
294
  'xyflow:fitFocusedBounds': ({ context }) => {
289
295
  const { bounds, duration = 450 } = focusedBounds({ context })
290
- const { width, height, panZoom, transform } = context.xystore.getState()
296
+ const { width, height, panZoom, transform } = nonNullable(context.xystore).getState()
291
297
 
292
298
  const maxZoom = Math.max(1, transform[2])
293
299
  const viewport = getViewportForBounds(
@@ -315,7 +321,7 @@ export const diagramMachine = setup({
315
321
  viewport,
316
322
  duration = 350,
317
323
  } = params
318
- const { panZoom } = context.xystore.getState()
324
+ const panZoom = context.xystore?.getState().panZoom
319
325
  panZoom?.setViewport(viewport, duration > 0 ? { duration } : undefined)
320
326
  },
321
327
 
@@ -332,12 +338,12 @@ export const diagramMachine = setup({
332
338
  x: Math.round(fromPos.x - toPos.x),
333
339
  y: Math.round(fromPos.y - toPos.y),
334
340
  }
335
- context.xystore.getState().panBy(diff)
341
+ context.xystore!.getState().panBy(diff)
336
342
  },
337
343
 
338
344
  'layout.align': ({ context }, params: { mode: AlignmentMode }) => {
339
345
  const { mode } = params
340
- const { xystore } = context
346
+ const xystore = nonNullable(context.xystore, 'xystore is not initialized')
341
347
  const { nodeLookup, parentLookup } = xystore.getState()
342
348
 
343
349
  const selectedNodes = new Set(nodeLookup.values().filter(n => n.selected).map(n => n.id))
@@ -364,14 +370,7 @@ export const diagramMachine = setup({
364
370
  }
365
371
  constraints.updateXYFlowNodes()
366
372
  },
367
-
368
- 'updateFeatures': enqueueActions(({ enqueue, system, event }) => {
369
- assertEvent(event, 'update.features')
370
- const { features } = event
371
- enqueue.assign({
372
- features: { ...features },
373
- })
374
-
373
+ 'ensure overlays actor state': enqueueActions(({ enqueue, context: { features }, system }) => {
375
374
  const enableOverlays = features.enableElementDetails || features.enableRelationshipDetails ||
376
375
  features.enableRelationshipBrowser
377
376
  const hasRunning = typedSystem(system).overlaysActorRef
@@ -386,14 +385,37 @@ export const diagramMachine = setup({
386
385
  enqueue.stopChild('overlays')
387
386
  }
388
387
  }),
389
-
388
+ 'ensure search actor state': enqueueActions(({ enqueue, context: { features: { enableSearch } }, system }) => {
389
+ const hasRunning = typedSystem(system).searchActorRef
390
+ if (enableSearch && !hasRunning) {
391
+ enqueue.spawnChild('searchActorLogic', { id: 'search', systemId: 'search' })
392
+ return
393
+ }
394
+ if (!enableSearch && hasRunning) {
395
+ enqueue.sendTo(hasRunning, {
396
+ type: 'close',
397
+ })
398
+ enqueue.stopChild('search')
399
+ }
400
+ }),
401
+ 'updateFeatures': assign(({ event }) => {
402
+ assertEvent(event, 'update.features')
403
+ return {
404
+ features: { ...event.features },
405
+ }
406
+ }),
407
+ 'closeSearch': sendTo(
408
+ ({ system }) => typedSystem(system).searchActorRef!,
409
+ {
410
+ type: 'close',
411
+ },
412
+ ),
390
413
  'closeAllOverlays': sendTo(
391
414
  ({ system }) => typedSystem(system).overlaysActorRef!,
392
415
  {
393
416
  type: 'close.all',
394
417
  },
395
418
  ),
396
-
397
419
  'startSyncLayout': assign(({ context, spawn, self }) => ({
398
420
  syncLayoutActorRef: spawn('syncManualLayoutActorLogic', {
399
421
  id: 'syncLayout',
@@ -449,6 +471,7 @@ export const diagramMachine = setup({
449
471
  }),
450
472
  }
451
473
  }),
474
+ 'focus on nodes and edges': assign(focusNodesEdges),
452
475
  'notations.highlight': assign(({ context }, params: { notation: ElementNotation; kind?: string }) => {
453
476
  const kinds = params.kind ? [params.kind] : params.notation.kinds
454
477
  const xynodes = context.xynodes.map((n) => {
@@ -469,10 +492,29 @@ export const diagramMachine = setup({
469
492
  xyedges: context.xyedges.map(Base.setDimmed('immediate')),
470
493
  }
471
494
  }),
495
+ 'tag.highlight': assign(({ context, event }) => {
496
+ assertEvent(event, 'tag.highlight')
497
+ return {
498
+ xynodes: context.xynodes.map((n) => {
499
+ if (n.data.tags?.includes(event.tag)) {
500
+ return Base.setDimmed(n, false)
501
+ }
502
+ return Base.setDimmed(n, 'immediate')
503
+ }),
504
+ }
505
+ }),
506
+ 'undim everything': assign(({ context }) => ({
507
+ xynodes: context.xynodes.map(Base.setDimmed(false)),
508
+ xyedges: context.xyedges.map(Base.setData({
509
+ dimmed: false,
510
+ active: false,
511
+ })),
512
+ })),
513
+ 'update active walkthrough': assign(updateActiveWalkthrough),
472
514
  },
473
515
  }).createMachine({
474
516
  initial: 'initializing',
475
- context: ({ input, self, spawn }) => ({
517
+ context: ({ input }): Context => ({
476
518
  ...input,
477
519
  xyedges: [],
478
520
  xynodes: [],
@@ -527,7 +569,7 @@ export const diagramMachine = setup({
527
569
  },
528
570
  },
529
571
  },
530
- 'isReady': {
572
+ isReady: {
531
573
  always: [{
532
574
  guard: 'isReady',
533
575
  actions: [
@@ -608,8 +650,8 @@ export const diagramMachine = setup({
608
650
  node: NodeId
609
651
  clientRect: Rect
610
652
  }
611
- const fromNodeId = event.fromNode ?? context.view.nodes.find(n => DiagramNode.modelRef(n) === event.fqn)?.id
612
- const internalNode = fromNodeId ? context.xystore.getState().nodeLookup.get(fromNodeId) : null
653
+ const fromNodeId = event.fromNode ?? context.view.nodes.find(n => n.modelRef === event.fqn)?.id
654
+ const internalNode = fromNodeId ? nonNullable(context.xystore).getState().nodeLookup.get(fromNodeId) : null
613
655
  if (fromNodeId && internalNode) {
614
656
  const nodeRect = nodeToRect(internalNode)
615
657
  const zoom = context.xyflow!.getZoom()
@@ -702,10 +744,13 @@ export const diagramMachine = setup({
702
744
  },
703
745
  },
704
746
  'notations.unhighlight': {
705
- actions: assign(({ context }) => ({
706
- xynodes: context.xynodes.map(Base.setDimmed(false)),
707
- xyedges: context.xyedges.map(Base.setDimmed(false)),
708
- })),
747
+ actions: 'undim everything',
748
+ },
749
+ 'tag.highlight': {
750
+ actions: 'tag.highlight',
751
+ },
752
+ 'tag.unhighlight': {
753
+ actions: 'undim everything',
709
754
  },
710
755
  'saveManualLayout.*': {
711
756
  guard: 'not readonly',
@@ -719,6 +764,13 @@ export const diagramMachine = setup({
719
764
  nonexhaustive(event)
720
765
  }),
721
766
  },
767
+ 'open.search': {
768
+ guard: 'enabled: Search',
769
+ actions: sendTo(({ system }) => typedSystem(system).searchActorRef!, ({ event }) => ({
770
+ type: 'open',
771
+ search: event.search,
772
+ })),
773
+ },
722
774
  },
723
775
  exit: [
724
776
  cancel('fitDiagram'),
@@ -797,8 +849,8 @@ export const diagramMachine = setup({
797
849
  },
798
850
  focused: {
799
851
  entry: [
852
+ 'focus on nodes and edges',
800
853
  assign(s => ({
801
- ...focusNodesEdges(s),
802
854
  viewportBeforeFocus: { ...s.context.viewport },
803
855
  })),
804
856
  'open source of focused or last clicked node',
@@ -810,10 +862,10 @@ export const diagramMachine = setup({
810
862
  if (context.viewportBeforeFocus) {
811
863
  enqueue({ type: 'xyflow:setViewport', params: { viewport: context.viewportBeforeFocus } })
812
864
  } else {
813
- enqueue({ type: 'xyflow:fitDiagram' })
865
+ enqueue('xyflow:fitDiagram')
814
866
  }
867
+ enqueue('undim everything')
815
868
  enqueue.assign({
816
- ...unfocusNodesEdges({ context, event }),
817
869
  viewportBeforeFocus: null,
818
870
  focusedNode: null,
819
871
  })
@@ -841,7 +893,7 @@ export const diagramMachine = setup({
841
893
  assign({
842
894
  focusedNode: ({ event }) => event.nodeId,
843
895
  }),
844
- assign(focusNodesEdges),
896
+ 'focus on nodes and edges',
845
897
  'open source of focused or last clicked node',
846
898
  'xyflow:fitFocusedBounds',
847
899
  ],
@@ -856,9 +908,10 @@ export const diagramMachine = setup({
856
908
  target: 'idle',
857
909
  },
858
910
  'notations.unhighlight': {
859
- actions: assign(s => ({
860
- ...focusNodesEdges(s),
861
- })),
911
+ actions: 'focus on nodes and edges',
912
+ },
913
+ 'tag.unhighlight': {
914
+ actions: 'focus on nodes and edges',
862
915
  },
863
916
  },
864
917
  },
@@ -876,7 +929,7 @@ export const diagramMachine = setup({
876
929
  }
877
930
  },
878
931
  }),
879
- assign(updateActiveWalkthrough),
932
+ 'update active walkthrough',
880
933
  'xyflow:fitFocusedBounds',
881
934
  ],
882
935
  on: {
@@ -907,7 +960,7 @@ export const diagramMachine = setup({
907
960
  parallelPrefix: getParallelStepsPrefix(nextStepId),
908
961
  },
909
962
  })
910
- enqueue.assign(updateActiveWalkthrough)
963
+ enqueue('update active walkthrough')
911
964
  enqueue('xyflow:fitFocusedBounds')
912
965
  }),
913
966
  },
@@ -924,14 +977,15 @@ export const diagramMachine = setup({
924
977
  },
925
978
  }
926
979
  }),
927
- assign(updateActiveWalkthrough),
980
+ 'update active walkthrough',
928
981
  'xyflow:fitFocusedBounds',
929
982
  ],
930
983
  },
931
984
  'notations.unhighlight': {
932
- actions: assign(s => ({
933
- ...updateActiveWalkthrough(s),
934
- })),
985
+ actions: 'update active walkthrough',
986
+ },
987
+ 'tag.unhighlight': {
988
+ actions: 'update active walkthrough',
935
989
  },
936
990
  'walkthrough.end': {
937
991
  target: 'idle',
@@ -951,11 +1005,11 @@ export const diagramMachine = setup({
951
1005
  if (context.viewportBeforeFocus) {
952
1006
  enqueue({ type: 'xyflow:setViewport', params: { viewport: context.viewportBeforeFocus } })
953
1007
  } else {
954
- enqueue({ type: 'xyflow:fitDiagram' })
1008
+ enqueue('xyflow:fitDiagram')
955
1009
  }
1010
+ enqueue('undim everything')
956
1011
  enqueue.assign({
957
1012
  activeWalkthrough: null,
958
- ...unfocusNodesEdges({ context, event }),
959
1013
  viewportBeforeFocus: null,
960
1014
  })
961
1015
  }),
@@ -967,6 +1021,7 @@ export const diagramMachine = setup({
967
1021
  id: 'navigating',
968
1022
  entry: [
969
1023
  'closeAllOverlays',
1024
+ 'closeSearch',
970
1025
  'stopSyncLayout',
971
1026
  {
972
1027
  type: 'trigger:NavigateTo',
@@ -993,7 +1048,7 @@ export const diagramMachine = setup({
993
1048
  } else {
994
1049
  enqueue({
995
1050
  type: 'xyflow:setViewportCenter',
996
- params: getBBoxCenter(event.view.bounds),
1051
+ params: BBox.center(event.view.bounds),
997
1052
  })
998
1053
  }
999
1054
  enqueue.assign(updateNavigationHistory)
@@ -1046,6 +1101,7 @@ export const diagramMachine = setup({
1046
1101
  const isAnotherView = check('is another view')
1047
1102
  if (isAnotherView) {
1048
1103
  enqueue('closeAllOverlays')
1104
+ enqueue('closeSearch')
1049
1105
  enqueue('stopSyncLayout')
1050
1106
  enqueue.assign({
1051
1107
  focusedNode: null,
@@ -1066,7 +1122,7 @@ export const diagramMachine = setup({
1066
1122
  } else {
1067
1123
  enqueue({
1068
1124
  type: 'xyflow:setViewportCenter',
1069
- params: getBBoxCenter(event.view.bounds),
1125
+ params: BBox.center(event.view.bounds),
1070
1126
  })
1071
1127
  enqueue.raise({ type: 'fitDiagram', duration: 200 }, { id: 'fitDiagram', delay: 25 })
1072
1128
  }
@@ -1090,13 +1146,19 @@ export const diagramMachine = setup({
1090
1146
  actions: assign(({ event }) => ({ ...event.inputs })),
1091
1147
  },
1092
1148
  'update.features': {
1093
- actions: 'updateFeatures',
1149
+ actions: [
1150
+ 'updateFeatures',
1151
+ 'ensure overlays actor state',
1152
+ 'ensure search actor state',
1153
+ ],
1094
1154
  },
1095
1155
  },
1096
1156
  exit: [
1097
1157
  'stopSyncLayout',
1098
1158
  cancel('fitDiagram'),
1099
1159
  stopChild('hotkey'),
1160
+ stopChild('overlays'),
1161
+ stopChild('search'),
1100
1162
  assign({
1101
1163
  xyflow: null,
1102
1164
  xystore: null as any,
@@ -1111,7 +1173,9 @@ export const diagramMachine = setup({
1111
1173
  ],
1112
1174
  })
1113
1175
 
1114
- const nodeRef = (node: DiagramNode) => DiagramNode.modelRef(node) ?? DiagramNode.deploymentRef(node)
1176
+ function nodeRef(node: DiagramNode) {
1177
+ return node.modelRef ?? node.deploymentRef
1178
+ }
1115
1179
  function findCorrespondingNode(context: Context, event: { view: DiagramView }) {
1116
1180
  const fromNodeId = context.lastOnNavigate?.fromNode
1117
1181
  const fromNode = fromNodeId && context.view.nodes.find(n => n.id === fromNodeId)
@@ -1120,6 +1184,10 @@ function findCorrespondingNode(context: Context, event: { view: DiagramView }) {
1120
1184
  return { fromNode, toNode }
1121
1185
  }
1122
1186
 
1123
- export type DiagramMachineLogic = ActorLogicFrom<typeof diagramMachine>
1124
- // export type MachineSnapshot = SnapshotFrom<Machine>
1125
- // export type LikeC4ViewActorRef = ActorRefFromLogic<Machine>
1187
+ /**
1188
+ * Here is a trick to reduce inference types
1189
+ */
1190
+ type InferredDiagramMachine = typeof _diagramMachine
1191
+ export interface DiagramMachine extends InferredDiagramMachine {}
1192
+ export const diagramMachine: DiagramMachine = _diagramMachine
1193
+ export interface DiagramMachineLogic extends ActorLogicFrom<DiagramMachine> {}
@@ -1,10 +1,12 @@
1
1
  import { getHotkeyHandler } from '@mantine/hooks'
2
2
  import type { KeyboardEvent } from 'react'
3
- import { type AnyEventObject, type NonReducibleUnknown, fromCallback } from 'xstate'
3
+ import { type AnyEventObject, type CallbackActorLogic, type NonReducibleUnknown, fromCallback } from 'xstate'
4
4
 
5
5
  export type HotKeyEvent = { type: 'key.esc' | `key.arrow.${'left' | 'right'}` }
6
6
 
7
- export const hotkeyActorLogic = fromCallback<AnyEventObject, NonReducibleUnknown, HotKeyEvent>(({ sendBack }: {
7
+ export interface HotkeyActorLogic extends CallbackActorLogic<AnyEventObject, NonReducibleUnknown, HotKeyEvent> {}
8
+
9
+ export const hotkeyActorLogic: HotkeyActorLogic = fromCallback(({ sendBack }: {
8
10
  sendBack: (event: HotKeyEvent) => void
9
11
  }) => {
10
12
  const escHandler = getHotkeyHandler([
@@ -1,4 +1,4 @@
1
- import type { ViewChange, ViewId } from '@likec4/core'
1
+ import type { ViewChange, ViewId } from '@likec4/core/types'
2
2
  import { type Rect, boxToRect, getBoundsOfRects, getNodeDimensions } from '@xyflow/system'
3
3
  import { hasAtLeast, reduce } from 'remeda'
4
4
  import {
@@ -12,6 +12,10 @@ import { bezierControlPoints, isSamePoint } from '../utils'
12
12
  import type { Context as DiagramContext, Events as DiagramEvents } from './diagram-machine'
13
13
 
14
14
  export type Input = {
15
+ /**
16
+ * Actually this is DiagramActorRef
17
+ * But we can't use it here due to circular type inference
18
+ */
15
19
  parent: ActorRef<
16
20
  MachineSnapshot<DiagramContext, DiagramEvents, any, any, any, any, any, any>,
17
21
  DiagramEvents,
@@ -29,8 +33,8 @@ export type Events =
29
33
  | { type: 'synced' }
30
34
  | { type: 'cancel' }
31
35
  | { type: 'stop' }
32
- // TODO: naming convention for actors
33
- export const syncManualLayoutActorLogic = setup({
36
+
37
+ const _syncManualLayoutActorLogic = setup({
34
38
  types: {
35
39
  context: {} as Context,
36
40
  input: {} as Input,
@@ -121,7 +125,9 @@ export const syncManualLayoutActorLogic = setup({
121
125
  },
122
126
  })
123
127
 
124
- export type SyncLayoutActorLogic = ActorLogicFrom<typeof syncManualLayoutActorLogic>
128
+ export interface SyncLayoutActorLogic extends ActorLogicFrom<typeof _syncManualLayoutActorLogic> {}
129
+
130
+ export const syncManualLayoutActorLogic: SyncLayoutActorLogic = _syncManualLayoutActorLogic
125
131
 
126
132
  function createViewChange(parentContext: DiagramContext): ViewChange.SaveManualLayout {
127
133
  const { view, xystore, xyflow } = parentContext
@@ -1,20 +1,28 @@
1
- import type { ActorRefFromLogic, ActorSystem, SnapshotFrom } from 'xstate'
1
+ import type { ActorRefFromLogic, ActorSystem, EventFromLogic, SnapshotFrom } from 'xstate'
2
2
  import type { OverlaysActorRef } from '../overlays/overlaysActor'
3
+ import type { SearchActorRef } from '../search/searchActor'
3
4
  import type { DiagramMachineLogic } from './diagram-machine'
4
5
  import type { SyncLayoutActorLogic } from './syncManualLayoutActor'
5
6
 
6
7
  export type System = ActorSystem<{
7
8
  actors: {
8
- diagram: DiagramActorRef
9
+ diagram: ActorRefFromLogic<DiagramMachineLogic>
9
10
  overlays: OverlaysActorRef
11
+ search: SearchActorRef
10
12
  }
11
13
  }>
12
14
 
13
- export type DiagramActorRef = Omit<ActorRefFromLogic<DiagramMachineLogic>, 'system'> & {
15
+ export interface DiagramActorRef extends ActorRefFromLogic<DiagramMachineLogic> {
14
16
  system: System
15
17
  }
18
+
19
+ // export type DiagramActorRef = Omit<ActorRefFromLogic<DiagramMachineLogic>, 'system'> & {
20
+ // system: System
21
+ // }
16
22
  export type DiagramActorSnapshot = SnapshotFrom<DiagramMachineLogic>
17
23
 
24
+ export type DiagramActorEvent = EventFromLogic<DiagramMachineLogic>
25
+
18
26
  export type { Context as DiagramContext } from './diagram-machine'
19
27
 
20
28
  export type SyncLayoutActorRef = Omit<ActorRefFromLogic<SyncLayoutActorLogic>, 'system'> & {
@@ -1,6 +1,7 @@
1
- import type { BBox, XYPoint } from '@likec4/core'
1
+ import type { BBox, DiagramEdge, DiagramNode, XYPoint } from '@likec4/core/types'
2
2
  import type { ActorSystem } from 'xstate'
3
3
  import type { OverlaysActorRef } from '../overlays/overlaysActor'
4
+ import type { SearchActorRef } from '../search/searchActor'
4
5
  import type { Context } from './diagram-machine'
5
6
  import type { DiagramActorRef, System } from './types'
6
7
 
@@ -12,14 +13,17 @@ export function typedSystem(system: ActorSystem<any>) {
12
13
  get diagramActorRef(): DiagramActorRef | null {
13
14
  return (system as System).get('diagram') ?? null
14
15
  },
16
+ get searchActorRef(): SearchActorRef | null {
17
+ return (system as System).get('search') ?? null
18
+ },
15
19
  }
16
20
  }
17
21
 
18
- export function findDiagramNode(ctx: Context, xynodeId: string) {
22
+ export function findDiagramNode(ctx: Context, xynodeId: string): DiagramNode | null {
19
23
  return ctx.view.nodes.find(n => n.id === xynodeId) ?? null
20
24
  }
21
25
 
22
- export function findDiagramEdge(ctx: Context, xyedgeId: string) {
26
+ export function findDiagramEdge(ctx: Context, xyedgeId: string): DiagramEdge | null {
23
27
  return ctx.view.edges.find(e => e.id === xyedgeId) ?? null
24
28
  }
25
29
 
@@ -0,0 +1,2 @@
1
+ @layer reset, base, mantine, xyflow, tokens, recipes, utilities;
2
+ @import "@xyflow/react/dist/style.css" layer(xyflow);
@@ -0,0 +1 @@
1
+ @import "@xyflow/react/dist/style.css" layer(xyflow);
@@ -1,5 +0,0 @@
1
- function getDefaultExportFromCjs (x) {
2
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
3
- }
4
-
5
- export { getDefaultExportFromCjs };
@@ -1,7 +0,0 @@
1
- import { getDefaultExportFromCjs } from './_commonjsHelpers.js';
2
- import { __require as requireDefaultMap } from '../node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/default-map.js';
3
-
4
- var defaultMapExports = /*@__PURE__*/ requireDefaultMap();
5
- const DefaultMap = /*@__PURE__*/getDefaultExportFromCjs(defaultMapExports);
6
-
7
- export { DefaultMap as default };
@@ -1,5 +0,0 @@
1
- import { __require as requireReact } from '../node_modules/.pnpm/react@19.1.0/node_modules/react/index.js';
2
-
3
- var reactExports = requireReact();
4
-
5
- export { reactExports as r };
@@ -1,3 +0,0 @@
1
- var react = {exports: {}};
2
-
3
- export { react as __module };
@@ -1,3 +0,0 @@
1
- var react_production = {};
2
-
3
- export { react_production as __exports };
@@ -1,5 +0,0 @@
1
- import { __require as requireSet } from '../node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/set.js';
2
-
3
- var setExports = /*@__PURE__*/ requireSet();
4
-
5
- export { setExports as s };
@@ -1,3 +0,0 @@
1
- var set = {};
2
-
3
- export { set as __exports };