@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,13 +1,12 @@
1
1
  import {
2
- type Fqn,
3
- type LikeC4Model,
4
2
  ifilter,
5
3
  isAncestor,
6
4
  nameFromFqn,
7
5
  sortParentsFirst,
8
- toArray,
9
6
  } from '@likec4/core'
10
- import { cx } from '@likec4/styles/css'
7
+ import type { LikeC4Model } from '@likec4/core/model'
8
+ import type { Fqn } from '@likec4/core/types'
9
+ import { cx, cx as clsx } from '@likec4/styles/css'
11
10
  import {
12
11
  type RenderTreeNodePayload,
13
12
  ActionIcon,
@@ -22,16 +21,16 @@ import {
22
21
  } from '@mantine/core'
23
22
  import { useCallbackRef } from '@mantine/hooks'
24
23
  import { IconChevronRight } from '@tabler/icons-react'
25
- import clsx from 'clsx'
26
24
  import * as m from 'motion/react-m'
27
- import { type KeyboardEventHandler, useCallback, useEffect, useMemo } from 'react'
28
- import { first, indexBy, isEmpty, only, partition, pipe, prop, reduce } from 'remeda'
29
- import { IconOrShapeRenderer } from '../../../context/IconRenderer'
30
- import { sortByLabel } from '../../../likec4model/useLikeC4ElementsTree'
31
- import { useLikeC4Model } from '../../../likec4model/useLikeC4Model'
25
+ import { type KeyboardEventHandler, memo, useCallback, useEffect, useMemo } from 'react'
26
+ import { first, isEmpty, only, pipe, reduce } from 'remeda'
27
+ import { IconOrShapeRenderer } from '../../context/IconRenderer'
28
+ import { useDiagram } from '../../hooks/useDiagram'
29
+ import { sortByLabel } from '../../likec4model/useLikeC4ElementsTree'
30
+ import { useLikeC4Model } from '../../likec4model/useLikeC4Model'
31
+ import { useNormalizedSearch, useSearchActor } from '../hooks'
32
32
  import { buttonsva } from './_shared.css'
33
33
  import * as styles from './ElementsColumn.css'
34
- import { setPickView, useCloseSearchAndNavigateTo, useNormalizedSearch } from './state'
35
34
  import { centerY, moveFocusToSearchInput, stopAndPrevent } from './utils'
36
35
  import { NothingFound } from './ViewsColum'
37
36
 
@@ -58,14 +57,13 @@ function buildNode(
58
57
 
59
58
  const btn = buttonsva()
60
59
 
61
- export function ElementsColumn() {
60
+ export const ElementsColumn = memo(() => {
61
+ const model = useLikeC4Model()
62
62
  const search = useNormalizedSearch()
63
- const model = useLikeC4Model(true)
64
-
65
63
  const data = useMemo(() => {
66
64
  const searchTerms = search.split('.')
67
65
  let elements
68
- if (isEmpty(search) || search === 'kind:') {
66
+ if (isEmpty(searchTerms) || searchTerms[0] === 'kind:') {
69
67
  elements = model.elements()
70
68
  } else {
71
69
  elements = ifilter(model.elements(), element => {
@@ -122,7 +120,7 @@ export function ElementsColumn() {
122
120
  }
123
121
 
124
122
  return <ElementsTree data={data} handleClick={handleClick} />
125
- }
123
+ })
126
124
 
127
125
  const setHoveredNode = () => {}
128
126
 
@@ -256,6 +254,7 @@ function ElementTreeNode(
256
254
  component={m.button}
257
255
  layout
258
256
  tabIndex={-1}
257
+ data-value={element.id}
259
258
  className={clsx(btn.root, 'group', 'likec4-element-button')}
260
259
  {...views.length > 0 && {
261
260
  onClick: (e) => {
@@ -299,7 +298,9 @@ function ElementTreeNode(
299
298
  }
300
299
 
301
300
  function useHandleElementSelection() {
302
- const navigateTo = useCloseSearchAndNavigateTo()
301
+ const diagram = useDiagram()
302
+ const { searchActorRef } = useSearchActor()
303
+ // const naviconst { searchActorRef } = useSearchActor(gateTo = useCloseSearchAndNavigateTo()
303
304
 
304
305
  return useCallback((element: LikeC4Model.Element) => {
305
306
  const views = [...element.views()]
@@ -308,14 +309,13 @@ function useHandleElementSelection() {
308
309
  }
309
310
  const singleView = only(views)
310
311
  if (singleView) {
311
- navigateTo(singleView.id, element.id)
312
+ if (singleView.id === diagram.currentView.id) {
313
+ searchActorRef.send({ type: 'close' })
314
+ } else {
315
+ diagram.navigateTo(singleView.id)
316
+ }
312
317
  return
313
318
  }
314
- const [scoped, others] = partition(views, v => v.viewOf?.id === element.id)
315
- setPickView({
316
- elementFqn: element.id,
317
- scoped,
318
- others,
319
- })
320
- }, [setPickView, navigateTo])
319
+ searchActorRef.send({ type: 'pickview.open', elementFqn: element.id })
320
+ }, [])
321
321
  }
@@ -0,0 +1,140 @@
1
+ import type { LikeC4ViewModel } from '@likec4/core/model'
2
+ import type { Fqn } from '@likec4/core/types'
3
+ import { ActionIcon, FocusTrap, Group, ScrollAreaAutosize, Stack, Title } from '@mantine/core'
4
+ import { useWindowEvent } from '@mantine/hooks'
5
+ import { IconX } from '@tabler/icons-react'
6
+ import * as m from 'motion/react-m'
7
+ import { useLikeC4Model } from '../../likec4model'
8
+ import { useSearchActor } from '../hooks'
9
+ import * as styles from './styles.css'
10
+ import { ViewButton } from './ViewsColum'
11
+
12
+ export function PickView({ elementFqn }: { elementFqn: Fqn }) {
13
+ const { searchActorRef } = useSearchActor()
14
+ const element = useLikeC4Model().element(elementFqn)
15
+ // const pickview = usePickView()
16
+ // const navigateTo = useCloseSearchAndNavigateTo()
17
+ // const focusTrapRef = useFocusTrap(!!pickview)
18
+ // useFocusReturn({
19
+ // opened: !!pickview,
20
+ // })
21
+ const scoped = [] as LikeC4ViewModel[]
22
+ const others = [] as LikeC4ViewModel[]
23
+
24
+ for (const view of element.views()) {
25
+ if (view.viewOf === element) {
26
+ scoped.push(view)
27
+ } else {
28
+ others.push(view)
29
+ }
30
+ }
31
+
32
+ const closePickView = () => {
33
+ searchActorRef.send({ type: 'pickview.close' })
34
+ }
35
+
36
+ useWindowEvent(
37
+ 'keydown',
38
+ (event) => {
39
+ try {
40
+ if (event.key === 'Escape') {
41
+ event.stopPropagation()
42
+ event.preventDefault()
43
+ closePickView()
44
+ }
45
+ } catch (e) {
46
+ console.warn(e)
47
+ }
48
+ },
49
+ {
50
+ capture: true,
51
+ },
52
+ )
53
+
54
+ return (
55
+ <>
56
+ <m.div
57
+ key="pickview-backdrop"
58
+ className={styles.pickviewBackdrop}
59
+ onClick={e => {
60
+ e.stopPropagation()
61
+ closePickView()
62
+ }}>
63
+ </m.div>
64
+ <m.div
65
+ key="pickview"
66
+ initial={{
67
+ opacity: 0,
68
+ scale: 0.95,
69
+ originY: 0,
70
+ translateX: '-50%',
71
+ translateY: -20,
72
+ }}
73
+ animate={{
74
+ opacity: 1,
75
+ scale: 1,
76
+ translateY: 0,
77
+ }}
78
+ exit={{
79
+ opacity: 0,
80
+ scale: 0.98,
81
+ translateY: -20,
82
+ transition: {
83
+ duration: 0.1,
84
+ },
85
+ }}
86
+ className={styles.pickview}
87
+ data-likec4-search-views>
88
+ <Group px="sm" py="md" justify="space-between">
89
+ <Title order={2} lh={1}>Select view</Title>
90
+ <ActionIcon
91
+ size={'md'}
92
+ variant="default"
93
+ onClick={(e) => {
94
+ e.stopPropagation()
95
+ closePickView()
96
+ }}>
97
+ <IconX />
98
+ </ActionIcon>
99
+ </Group>
100
+ <FocusTrap>
101
+ <ScrollAreaAutosize mah={'calc(100vh - 8rem - 50px)'} type="never">
102
+ {scoped.length > 0 && (
103
+ <Stack gap={'sm'} px={'sm'} className={styles.pickviewGroup}>
104
+ <Title order={6} c={'dimmed'}>scoped views of the element</Title>
105
+ {scoped.map((view, i) => (
106
+ <ViewButton
107
+ key={view.id}
108
+ view={view}
109
+ search={''}
110
+ loop
111
+ mod={{
112
+ autofocus: i === 0,
113
+ }}
114
+ />
115
+ ))}
116
+ </Stack>
117
+ )}
118
+
119
+ {others.length > 0 && (
120
+ <Stack gap={'sm'} px={'sm'} className={styles.pickviewGroup}>
121
+ <Title order={6} c={'dimmed'}>views including this element</Title>
122
+ {others.map((view, i) => (
123
+ <ViewButton
124
+ key={view.id}
125
+ view={view}
126
+ search={''}
127
+ loop
128
+ mod={{
129
+ autofocus: i === 0 && scoped.length === 0,
130
+ }}
131
+ />
132
+ ))}
133
+ </Stack>
134
+ )}
135
+ </ScrollAreaAutosize>
136
+ </FocusTrap>
137
+ </m.div>
138
+ </>
139
+ )
140
+ }
@@ -0,0 +1,109 @@
1
+ import { css } from '@likec4/styles/css'
2
+ import { HStack } from '@likec4/styles/jsx'
3
+ import { Button } from '@mantine/core'
4
+ import { IconX } from '@tabler/icons-react'
5
+ import { ElementTag } from '../../base/primitives'
6
+ import { useLikeC4Model } from '../../likec4model/useLikeC4Model'
7
+ import { useNormalizedSearch, useUpdateSearch } from '../hooks'
8
+ import { focusToFirstFoundElement, moveFocusToSearchInput } from './utils'
9
+
10
+ export function SearchByTags() {
11
+ let tags = useLikeC4Model().tagsSortedByUsage
12
+ let setSearch = useUpdateSearch()
13
+ let search = useNormalizedSearch()
14
+ let countBefore = tags.length
15
+ if (search.startsWith('#')) {
16
+ const searchTag = search.slice(1)
17
+ tags = tags.filter(({ tag }) => tag.toLocaleLowerCase().includes(searchTag))
18
+ }
19
+ if (tags.length === 0) {
20
+ return null
21
+ }
22
+
23
+ const isFiltered = tags.length !== countBefore
24
+
25
+ return (
26
+ <HStack
27
+ css={{
28
+ gap: 'md',
29
+ paddingLeft: 48,
30
+ flexWrap: 'nowrap',
31
+ }}
32
+ >
33
+ <HStack
34
+ css={{
35
+ gap: 6,
36
+ flexWrap: 'wrap',
37
+ opacity: isFiltered ? 1 : .3,
38
+ grayscale: isFiltered ? 0 : .9,
39
+ filter: 'auto',
40
+ transition: 'fast',
41
+ _groupHover: {
42
+ opacity: 1,
43
+ grayscale: 0,
44
+ },
45
+ _groupFocusWithin: {
46
+ opacity: 1,
47
+ grayscale: 0,
48
+ },
49
+ }}
50
+ >
51
+ {tags.map(({ tag }) => (
52
+ // <Pill
53
+ // key={tag}
54
+ // data-likec4-tag={tag}
55
+ // className={cx(
56
+ // likec4tag(),
57
+ // css({
58
+ // minWidth: 'unset',
59
+ // cursor: 'pointer',
60
+ // }),
61
+ // )}
62
+ // onClick={(e) => {
63
+ // e.stopPropagation()
64
+ // setSearch(`#${tag}`)
65
+ // }}
66
+ // onRemove={() => {
67
+ // setSearch('#')
68
+ // moveFocusToSearchInput()
69
+ // }}
70
+ // withRemoveButton={tag === `${search.slice(1)}`}
71
+ // >
72
+ // <span style={{ opacity: 0.7, fontSize: '1.05em' }}>#</span>
73
+ // {tag}
74
+ // </Pill>
75
+ <ElementTag
76
+ key={tag}
77
+ tag={tag}
78
+ className={css({
79
+ userSelect: 'none',
80
+ cursor: 'pointer',
81
+ })}
82
+ onClick={(e) => {
83
+ e.stopPropagation()
84
+ setSearch(`#${tag}`)
85
+ // Let react to display filtered elements
86
+ setTimeout(() => {
87
+ focusToFirstFoundElement()
88
+ }, 350)
89
+ }}
90
+ />
91
+ ))}
92
+ </HStack>
93
+ {isFiltered && (
94
+ <Button
95
+ size="compact-xs"
96
+ variant="light"
97
+ onClick={(e) => {
98
+ e.stopPropagation()
99
+ setSearch('')
100
+ moveFocusToSearchInput()
101
+ }}
102
+ rightSection={<IconX size={14} />}
103
+ >
104
+ Clear
105
+ </Button>
106
+ )}
107
+ </HStack>
108
+ )
109
+ }
@@ -1,4 +1,3 @@
1
- import { compareNatural } from '@likec4/core'
2
1
  import {
3
2
  Combobox,
4
3
  ComboboxDropdown,
@@ -12,15 +11,15 @@ import {
12
11
  Text,
13
12
  useCombobox,
14
13
  } from '@mantine/core'
15
- import { useDebouncedValue, useFocusWithin, useIsFirstRender, useWindowEvent } from '@mantine/hooks'
14
+ import { useFocusWithin, useWindowEvent } from '@mantine/hooks'
16
15
  import { usePreviousDistinct } from '@react-hookz/web'
17
16
  import { IconSearch } from '@tabler/icons-react'
18
- import { type ReactNode } from 'react'
19
- import { isString, keys, only } from 'remeda'
20
- import { useLikeC4Model } from '../../../likec4model/useLikeC4Model'
21
- import * as css from './LikeC4Search.css'
22
- import { setSearch, useIsPickViewActive, useSearch } from './state'
23
- import { moveFocusToSearchInput, stopAndPrevent } from './utils'
17
+ import { type ReactNode, memo } from 'react'
18
+ import { keys, only } from 'remeda'
19
+ import { useLikeC4Model } from '../../likec4model/useLikeC4Model'
20
+ import { useSearch, useSearchActor } from '../hooks'
21
+ import * as css from './styles.css'
22
+ import { focusToFirstFoundElement, moveFocusToSearchInput, stopAndPrevent } from './utils'
24
23
 
25
24
  function startingWithKind(search: string) {
26
25
  return search.match(/^(k|ki|kin|kind|kind:)$/) != null
@@ -28,25 +27,34 @@ function startingWithKind(search: string) {
28
27
 
29
28
  const SEARCH_PREFIXES = ['#', 'kind:']
30
29
 
31
- export function LikeC4SearchInput() {
32
- const isPickViewActive = useIsPickViewActive()
33
- const likec4model = useLikeC4Model(true)
34
- const combobox = useCombobox({
35
- scrollBehavior: 'smooth',
36
- })
30
+ export const LikeC4SearchInput = memo(() => {
31
+ const { close, searchActorRef } = useSearchActor()
32
+ const likec4model = useLikeC4Model()
37
33
  const { ref, focused } = useFocusWithin<HTMLInputElement>()
38
- const search = useSearch()
34
+ const [search, setSearch] = useSearch()
39
35
  const previous = usePreviousDistinct(search)
40
- const isFirstRender = useIsFirstRender()
41
36
 
42
- const [isEmptyForSomeTime] = useDebouncedValue(search === '' && !isFirstRender, isString(previous) ? 500 : 2000)
37
+ // const [isEmptyForSomeTime, cancel] = useDebouncedValue(
38
+ // focused ? search : 'rstrs',
39
+ // 2000,
40
+ // )
41
+ // // useF
42
+ // // const isEmptyForSomeTime = debouncedSearch === ''
43
+ // useEffect(() => {
44
+ // // cancel()
45
+ // }, [])
46
+
47
+ const combobox = useCombobox({
48
+ scrollBehavior: 'smooth',
49
+ loop: false,
50
+ })
43
51
 
44
52
  useWindowEvent(
45
53
  'keydown',
46
54
  (event) => {
47
55
  try {
48
56
  if (
49
- !focused && !isPickViewActive && (
57
+ !focused && (
50
58
  event.key === 'Backspace' ||
51
59
  event.key.startsWith('Arrow') ||
52
60
  event.key.match(/^\p{L}$/u)
@@ -64,20 +72,18 @@ export function LikeC4SearchInput() {
64
72
  let isExactMatch = false
65
73
 
66
74
  switch (true) {
67
- case search === '' && (isEmptyForSomeTime || SEARCH_PREFIXES.includes(previous ?? '')): {
68
- options = SEARCH_PREFIXES.map((prefix) => (
69
- <ComboboxOption value={prefix} key={prefix}>
70
- <Text component="span" opacity={.5} mr={4} fz={'sm'}>Search by</Text>
71
- {prefix}
72
- </ComboboxOption>
73
- ))
74
- break
75
- }
75
+ // case search === '' && isEmptyForSomeTime === '': {
76
+ // options = SEARCH_PREFIXES.map((prefix) => (
77
+ // <ComboboxOption value={prefix} key={prefix}>
78
+ // <Text component="span" opacity={.5} mr={4} fz={'sm'}>Search by</Text>
79
+ // {prefix}
80
+ // </ComboboxOption>
81
+ // ))
82
+ // break
83
+ // }
76
84
  case search.startsWith('#'): {
77
85
  const searchTag = search.toLocaleLowerCase().slice(1)
78
- const alloptions = likec4model.allTags().filter((tag) => tag.toLocaleLowerCase().includes(searchTag)).sort(
79
- compareNatural,
80
- )
86
+ const alloptions = likec4model.tags.filter((tag) => tag.toLocaleLowerCase().includes(searchTag))
81
87
  isExactMatch = only(alloptions)?.toLocaleLowerCase() === searchTag
82
88
  if (alloptions.length === 0) {
83
89
  options = [
@@ -98,7 +104,7 @@ export function LikeC4SearchInput() {
98
104
  case search.startsWith('kind:'):
99
105
  case startingWithKind(search): {
100
106
  const term = search.length > 5 ? search.slice(5).toLocaleLowerCase() : ''
101
- let alloptions = keys(likec4model.$model.specification.elements)
107
+ let alloptions = keys(likec4model.specification.elements)
102
108
  if (term) {
103
109
  alloptions = alloptions.filter((kind) => kind.toLocaleLowerCase().includes(term))
104
110
  isExactMatch = only(alloptions)?.toLocaleLowerCase() === term
@@ -130,8 +136,8 @@ export function LikeC4SearchInput() {
130
136
  combobox.closeDropdown()
131
137
  // Let react to display filtered elements
132
138
  setTimeout(() => {
133
- document.querySelector<HTMLButtonElement>(`[data-likec4-search] .${css.focusable}`)?.focus()
134
- }, 50)
139
+ focusToFirstFoundElement()
140
+ }, 350)
135
141
  }
136
142
  }}
137
143
  width={'max-content'}
@@ -149,13 +155,27 @@ export function LikeC4SearchInput() {
149
155
  ref={ref}
150
156
  id="likec4searchinput"
151
157
  placeholder="Search by title, description or start with # or kind:"
158
+ autoFocus
152
159
  tabIndex={0}
153
160
  classNames={{
154
161
  input: css.input,
155
162
  }}
156
- size="xl"
163
+ size="lg"
157
164
  value={search}
158
165
  leftSection={<IconSearch style={{ width: rem(20) }} stroke={2} />}
166
+ rightSection={
167
+ <Input.ClearButton
168
+ onClick={(e) => {
169
+ e.stopPropagation()
170
+ const openedWithSearch = searchActorRef.getSnapshot().context.openedWithSearch
171
+ if (search === '' || search === openedWithSearch) {
172
+ close()
173
+ } else {
174
+ setSearch('')
175
+ }
176
+ }} />
177
+ }
178
+ rightSectionPointerEvents="auto"
159
179
  onChange={(event) => {
160
180
  setSearch(event.currentTarget.value)
161
181
  combobox.openDropdown()
@@ -207,6 +227,13 @@ export function LikeC4SearchInput() {
207
227
  combobox.closeDropdown()
208
228
  return
209
229
  }
230
+ if (
231
+ e.key === 'ArrowUp' && combobox.dropdownOpened && search === '' && combobox.getSelectedOptionIndex() === 0
232
+ ) {
233
+ combobox.closeDropdown()
234
+ stopAndPrevent(e)
235
+ return
236
+ }
210
237
  if (
211
238
  e.key === 'ArrowDown' && (
212
239
  !combobox.dropdownOpened ||
@@ -217,7 +244,7 @@ export function LikeC4SearchInput() {
217
244
  ) {
218
245
  combobox.closeDropdown()
219
246
  stopAndPrevent(e)
220
- document.querySelector<HTMLButtonElement>(`[data-likec4-search] .${css.focusable}`)?.focus()
247
+ focusToFirstFoundElement()
221
248
  return
222
249
  }
223
250
  }} />
@@ -232,4 +259,4 @@ export function LikeC4SearchInput() {
232
259
  </ComboboxDropdown>
233
260
  </Combobox>
234
261
  )
235
- }
262
+ })
@@ -1,8 +1,4 @@
1
- import {
2
- type LikeC4Model,
3
- type Tag,
4
- isDeploymentView,
5
- } from '@likec4/core'
1
+ import type { LikeC4Model } from '@likec4/core/model'
6
2
  import { cx } from '@likec4/styles/css'
7
3
  import { Box } from '@likec4/styles/jsx'
8
4
  import {
@@ -19,11 +15,13 @@ import {
19
15
  } from '@mantine/core'
20
16
  import { IconStack2, IconZoomScan } from '@tabler/icons-react'
21
17
  import * as m from 'motion/react-m'
18
+ import { memo } from 'react'
22
19
  import { first } from 'remeda'
23
- import { useCurrentViewId } from '../../../hooks/useCurrentViewId'
24
- import { useLikeC4Model } from '../../../likec4model/useLikeC4Model'
20
+ import { useCurrentViewId } from '../../hooks/useCurrentViewId'
21
+ import { useDiagram } from '../../hooks/useDiagram'
22
+ import { useLikeC4Model } from '../../likec4model/useLikeC4Model'
23
+ import { useNormalizedSearch } from '../hooks'
25
24
  import { buttonsva } from './_shared.css'
26
- import { useCloseSearchAndNavigateTo, useNormalizedSearch } from './state'
27
25
  import { centerY, moveFocusToSearchInput } from './utils'
28
26
  import * as styles from './ViewsColumn.css'
29
27
 
@@ -33,16 +31,16 @@ export const NothingFound = () => (
33
31
  </Box>
34
32
  )
35
33
 
36
- export function ViewsColumn() {
37
- const search = useNormalizedSearch()
38
- let views = [...useLikeC4Model(true).views()]
34
+ export const ViewsColumn = memo(() => {
35
+ let views = [...useLikeC4Model().views()]
36
+ let search = useNormalizedSearch()
39
37
  if (search) {
40
38
  if (search.startsWith('kind:')) {
41
39
  views = []
42
40
  } else {
43
41
  views = views.filter(view => {
44
42
  if (search.startsWith('#')) {
45
- return view.tags.some((tag: Tag) => tag.toLocaleLowerCase().includes(search.slice(1)))
43
+ return view.tags.some((tag) => tag.toLocaleLowerCase().includes(search.slice(1)))
46
44
  }
47
45
  return (view.title ?? '' + view.$view.description ?? '').toLocaleLowerCase().includes(search)
48
46
  })
@@ -58,7 +56,7 @@ export function ViewsColumn() {
58
56
  if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
59
57
  const maxY = (e.target as HTMLElement).getBoundingClientRect().y
60
58
  const elementButtons = [...document.querySelectorAll<HTMLButtonElement>(
61
- `[data-likec4-search-elements] .likec4-element-button`,
59
+ `[data-likec4-search-elements] .likec4-focusable`,
62
60
  )]
63
61
  let elementButton = elementButtons.length > 1
64
62
  ? elementButtons.find((el, i, all) => centerY(el) > maxY || i === all.length - 1)
@@ -95,7 +93,7 @@ export function ViewsColumn() {
95
93
  ))}
96
94
  </Stack>
97
95
  )
98
- }
96
+ })
99
97
 
100
98
  const btn = buttonsva()
101
99
 
@@ -109,7 +107,8 @@ export function ViewButton(
109
107
  & UnstyledButtonProps
110
108
  & ElementProps<'button'>,
111
109
  ) {
112
- const navigateTo = useCloseSearchAndNavigateTo()
110
+ const diagram = useDiagram()
111
+ // const navigateTo = useCloseSearchAndNavigateTo()
113
112
  const currentViewId = useCurrentViewId()
114
113
  const isCurrentView = view.id === currentViewId
115
114
  return (
@@ -120,7 +119,7 @@ export function ViewButton(
120
119
  {...isCurrentView && { 'data-disabled': true }}
121
120
  onClick={(e) => {
122
121
  e.stopPropagation()
123
- navigateTo(view.id)
122
+ diagram.navigateTo(view.id)
124
123
  }}
125
124
  onKeyDown={createScopedKeydownHandler({
126
125
  siblingSelector: '[data-likec4-view]',
@@ -131,12 +130,12 @@ export function ViewButton(
131
130
  onKeyDown: (e) => {
132
131
  if (e.nativeEvent.code === 'Space') {
133
132
  e.stopPropagation()
134
- navigateTo(view.id)
133
+ diagram.navigateTo(view.id)
135
134
  }
136
135
  },
137
136
  })}>
138
137
  <ThemeIcon variant="transparent" className={btn.icon!}>
139
- {isDeploymentView(view)
138
+ {view.isDeploymentView()
140
139
  ? <IconStack2 stroke={1.8} />
141
140
  : <IconZoomScan stroke={1.8} />}
142
141
  </ThemeIcon>