@likec4/diagram 1.31.0 → 1.32.1

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 (269) hide show
  1. package/bundle/{chunk-BBzMXzCg.js → chunk-DlHyKoeo.js} +1700 -1206
  2. package/bundle/custom.js +51 -47
  3. package/bundle/index.js +5495 -5428
  4. package/dist/LikeC4CustomColors.d.ts +2 -7
  5. package/dist/LikeC4CustomColors.js +17 -6
  6. package/dist/LikeC4Diagram.d.ts +3 -2
  7. package/dist/LikeC4Diagram.js +10 -14
  8. package/dist/LikeC4Diagram.props.d.ts +41 -24
  9. package/dist/LikeC4ModelProvider.d.ts +5 -4
  10. package/dist/StaticLikeC4Diagram.d.ts +3 -2
  11. package/dist/StaticLikeC4Diagram.js +2 -2
  12. package/dist/base/BaseXYFlow.js +5 -5
  13. package/dist/base/const.d.ts +1 -1
  14. package/dist/base/const.js +1 -1
  15. package/dist/base/index.d.ts +2 -1
  16. package/dist/base/primitives/compound/CompoundActionButton.js +2 -1
  17. package/dist/base/primitives/compound/CompoundDetailsButton.js +2 -1
  18. package/dist/base/primitives/compound/CompoundTitle.d.ts +1 -1
  19. package/dist/base/primitives/compound/CompoundTitle.js +2 -1
  20. package/dist/base/primitives/edge/EdgeContainer.d.ts +1 -1
  21. package/dist/base/primitives/edge/EdgeLabel.css.js +1 -0
  22. package/dist/base/primitives/edge/EdgeLabel.d.ts +3 -3
  23. package/dist/base/primitives/edge/EdgeLabel.js +6 -4
  24. package/dist/base/primitives/edge/EdgeLabelContainer.d.ts +1 -1
  25. package/dist/base/primitives/edge/EdgeMarkers.d.ts +1 -1
  26. package/dist/base/primitives/edge/EdgePath.d.ts +1 -1
  27. package/dist/base/primitives/element/ElementActionButtons.js +10 -9
  28. package/dist/base/primitives/element/ElementDetailsButton.js +2 -1
  29. package/dist/base/primitives/element/ElementShape.d.ts +1 -1
  30. package/dist/base/primitives/element/ElementTags.d.ts +14 -0
  31. package/dist/base/primitives/element/ElementTags.js +176 -0
  32. package/dist/base/primitives/element/ElementTitle.d.ts +5 -4
  33. package/dist/base/primitives/element/ElementTitle.js +6 -6
  34. package/dist/base/primitives/index.d.ts +1 -0
  35. package/dist/base/types.Base.d.ts +54 -0
  36. package/dist/base/types.Base.js +48 -0
  37. package/dist/base/types.d.ts +2 -52
  38. package/dist/bundle/LikeC4View.d.ts +2 -1
  39. package/dist/bundle/LikeC4View.js +22 -19
  40. package/dist/bundle/LikeC4View.props.d.ts +15 -4
  41. package/dist/bundle/ReactLikeC4.d.ts +4 -7
  42. package/dist/bundle/ReactLikeC4.js +10 -8
  43. package/dist/bundle/index.js +1 -1
  44. package/dist/components/ErrorFallback.d.ts +2 -0
  45. package/dist/components/ErrorFallback.js +29 -0
  46. package/dist/context/DiagramEventHandlers.d.ts +6 -5
  47. package/dist/context/DiagramFeatures.d.ts +2 -2
  48. package/dist/context/DiagramFeatures.js +3 -31
  49. package/dist/context/EnsureMantine.js +1 -1
  50. package/dist/context/IconRenderer.js +1 -4
  51. package/dist/context/RootContainer.js +5 -1
  52. package/dist/context/TagStylesContext.d.ts +7 -0
  53. package/dist/context/TagStylesContext.js +85 -0
  54. package/dist/custom/components.d.ts +1 -1
  55. package/dist/custom/customNodes.d.ts +32 -17
  56. package/dist/custom/hooks.d.ts +1 -1
  57. package/dist/hooks/index.d.ts +1 -1
  58. package/dist/hooks/useDiagram.d.ts +73 -38
  59. package/dist/hooks/useDiagram.js +7 -3
  60. package/dist/hooks/useMantinePortalProps.d.ts +2 -2
  61. package/dist/hooks/useSearchActor.d.ts +2 -0
  62. package/dist/hooks/useSearchActor.js +10 -0
  63. package/dist/hooks/useUpdateEffect.js +3 -0
  64. package/dist/hooks/useXYFlow.d.ts +39 -37
  65. package/dist/hooks/useXYFlow.js +5 -1
  66. package/dist/index.js +1 -1
  67. package/dist/likec4diagram/DiagramUI.js +7 -2
  68. package/dist/likec4diagram/DiagramXYFlow.d.ts +4 -3
  69. package/dist/likec4diagram/DiagramXYFlow.js +107 -110
  70. package/dist/likec4diagram/custom/edges/RelationshipEdge.d.ts +7 -6
  71. package/dist/likec4diagram/custom/edges/RelationshipEdge.js +8 -0
  72. package/dist/likec4diagram/custom/edges/RelationshipsDropdownMenu.js +7 -5
  73. package/dist/likec4diagram/custom/index.d.ts +7 -6
  74. package/dist/likec4diagram/custom/nodes/nodes.js +39 -26
  75. package/dist/likec4diagram/custom/nodes/toolbar/_shared.d.ts +7 -7
  76. package/dist/likec4diagram/types.d.ts +5 -5
  77. package/dist/likec4diagram/ui/controls/Controls.js +12 -4
  78. package/dist/likec4diagram/ui/notation/NotationPanel.js +1 -1
  79. package/dist/likec4diagram/useViewToNodesEdges.d.ts +5 -3
  80. package/dist/likec4diagram/useViewToNodesEdges.js +20 -30
  81. package/dist/likec4model/LikeC4ModelContext.d.ts +2 -2
  82. package/dist/likec4model/index.d.ts +1 -1
  83. package/dist/likec4model/useLikeC4ElementsTree.js +1 -1
  84. package/dist/likec4model/useLikeC4Model.d.ts +23 -10
  85. package/dist/likec4model/useLikeC4Model.js +22 -7
  86. package/dist/overlays/Overlays.js +4 -27
  87. package/dist/overlays/element-details/ElementDetailsCard.d.ts +1 -1
  88. package/dist/overlays/element-details/ElementDetailsCard.js +19 -12
  89. package/dist/overlays/element-details/TabPanelDeployments.d.ts +1 -1
  90. package/dist/overlays/element-details/TabPanelDeployments.js +1 -1
  91. package/dist/overlays/element-details/TabPanelRelationships.d.ts +1 -1
  92. package/dist/overlays/element-details/TabPanelStructure.d.ts +1 -1
  93. package/dist/overlays/element-details/actor.d.ts +288 -286
  94. package/dist/overlays/overlay/Overlay.css.d.ts +57 -2
  95. package/dist/overlays/overlay/Overlay.css.js +76 -39
  96. package/dist/overlays/overlay/Overlay.d.ts +12 -0
  97. package/dist/overlays/overlay/Overlay.js +58 -27
  98. package/dist/overlays/overlaysActor.d.ts +1 -1
  99. package/dist/overlays/relationship-details/RelationshipDetails.d.ts +3 -2
  100. package/dist/overlays/relationship-details/RelationshipDetails.js +3 -3
  101. package/dist/overlays/relationship-details/_types.d.ts +2 -2
  102. package/dist/overlays/relationship-details/actor.js +7 -7
  103. package/dist/overlays/relationship-details/custom/edgeTypes.d.ts +3 -2
  104. package/dist/overlays/relationship-details/custom/nodeTypes.js +4 -0
  105. package/dist/overlays/relationship-details/hooks.d.ts +10 -9
  106. package/dist/overlays/relationship-details/layout-to-xyflow.js +1 -0
  107. package/dist/overlays/relationship-details/layout.js +3 -1
  108. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +3 -2
  109. package/dist/overlays/relationships-browser/SelectElement.js +1 -1
  110. package/dist/overlays/relationships-browser/_types.d.ts +2 -2
  111. package/dist/overlays/relationships-browser/actor.d.ts +1 -1
  112. package/dist/overlays/relationships-browser/actor.js +7 -7
  113. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +3 -2
  114. package/dist/overlays/relationships-browser/custom/nodeTypes.d.ts +8 -5
  115. package/dist/overlays/relationships-browser/custom/nodeTypes.js +4 -0
  116. package/dist/overlays/relationships-browser/layout.d.ts +2 -2
  117. package/dist/overlays/relationships-browser/layout.js +10 -6
  118. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +4 -3
  119. package/dist/search/Search.d.ts +4 -0
  120. package/dist/search/Search.js +173 -0
  121. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.js +0 -1
  122. package/dist/search/components/ElementsColumn.d.ts +2 -0
  123. package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.js +26 -25
  124. package/dist/search/components/PickView.d.ts +4 -0
  125. package/dist/search/components/PickView.js +135 -0
  126. package/dist/search/components/SearchByTags.d.ts +1 -0
  127. package/dist/search/components/SearchByTags.js +119 -0
  128. package/dist/search/components/SearchInput.d.ts +2 -0
  129. package/dist/{likec4diagram/ui/search → search/components}/SearchInput.js +61 -40
  130. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.d.ts +3 -2
  131. package/dist/{likec4diagram/ui/search → search/components}/ViewsColum.js +25 -17
  132. package/dist/{likec4diagram/ui/search → search/components}/_shared.css.js +26 -35
  133. package/dist/{likec4diagram/ui/search/LikeC4Search.css.d.ts → search/components/styles.css.d.ts} +0 -2
  134. package/dist/search/components/styles.css.js +60 -0
  135. package/dist/search/components/utils.d.ts +5 -0
  136. package/dist/search/components/utils.js +58 -0
  137. package/dist/search/hooks.d.ts +10 -0
  138. package/dist/search/hooks.js +35 -0
  139. package/dist/search/searchActor.d.ts +90 -0
  140. package/dist/search/searchActor.js +75 -0
  141. package/dist/state/DiagramActorProvider.d.ts +9 -7
  142. package/dist/state/DiagramActorProvider.js +24 -18
  143. package/dist/state/assign.d.ts +0 -1
  144. package/dist/state/assign.js +9 -19
  145. package/dist/state/diagram-machine.d.ts +645 -183
  146. package/dist/state/diagram-machine.js +127 -60
  147. package/dist/state/syncManualLayoutActor.d.ts +2 -2
  148. package/dist/state/types.d.ts +2 -0
  149. package/dist/state/utils.d.ts +2 -0
  150. package/dist/state/utils.js +3 -0
  151. package/dist/styles-min.css +1 -1
  152. package/dist/styles-xyflow.css +1 -1
  153. package/dist/styles.css +1 -1
  154. package/dist/styles.css2.js +1 -1
  155. package/package.json +20 -19
  156. package/panda.buildinfo.json +171 -148
  157. package/src/LikeC4CustomColors.tsx +21 -6
  158. package/src/LikeC4Diagram.props.ts +48 -32
  159. package/src/LikeC4Diagram.tsx +19 -20
  160. package/src/LikeC4ModelProvider.tsx +6 -5
  161. package/src/StaticLikeC4Diagram.tsx +8 -6
  162. package/src/base/const.ts +1 -1
  163. package/src/base/index.ts +2 -1
  164. package/src/base/primitives/compound/CompoundActionButton.tsx +2 -1
  165. package/src/base/primitives/compound/CompoundDetailsButton.tsx +2 -1
  166. package/src/base/primitives/compound/CompoundTitle.tsx +3 -2
  167. package/src/base/primitives/edge/EdgeContainer.tsx +2 -1
  168. package/src/base/primitives/edge/EdgeLabel.css.ts +1 -0
  169. package/src/base/primitives/edge/EdgeLabel.tsx +20 -15
  170. package/src/base/primitives/edge/EdgeLabelContainer.tsx +1 -1
  171. package/src/base/primitives/edge/EdgeMarkers.tsx +2 -1
  172. package/src/base/primitives/edge/EdgePath.tsx +1 -1
  173. package/src/base/primitives/element/ElementActionButtons.tsx +11 -10
  174. package/src/base/primitives/element/ElementDetailsButton.tsx +2 -1
  175. package/src/base/primitives/element/ElementShape.tsx +2 -1
  176. package/src/base/primitives/element/ElementTags.tsx +182 -0
  177. package/src/base/primitives/element/ElementTitle.tsx +21 -15
  178. package/src/base/primitives/index.ts +1 -0
  179. package/src/base/types.Base.ts +104 -0
  180. package/src/base/types.ts +2 -99
  181. package/src/bundle/LikeC4View.props.ts +17 -4
  182. package/src/bundle/LikeC4View.tsx +27 -36
  183. package/src/bundle/ReactLikeC4.tsx +16 -36
  184. package/src/components/ErrorFallback.tsx +30 -0
  185. package/src/context/DiagramEventHandlers.tsx +5 -4
  186. package/src/context/DiagramFeatures.tsx +3 -22
  187. package/src/context/EnsureMantine.tsx +1 -1
  188. package/src/context/IconRenderer.tsx +1 -4
  189. package/src/context/RootContainer.tsx +9 -3
  190. package/src/context/TagStylesContext.tsx +96 -0
  191. package/src/custom/components.ts +2 -0
  192. package/src/custom/customNodes.tsx +29 -14
  193. package/src/custom/hooks.ts +2 -0
  194. package/src/hooks/index.ts +1 -1
  195. package/src/hooks/useCurrentViewId.ts +1 -4
  196. package/src/hooks/useDiagram.ts +104 -12
  197. package/src/hooks/useMantinePortalProps.ts +10 -1
  198. package/src/hooks/useSearchActor.ts +11 -0
  199. package/src/hooks/useUpdateEffect.ts +7 -4
  200. package/src/hooks/useXYFlow.ts +5 -0
  201. package/src/likec4diagram/DiagramUI.tsx +5 -0
  202. package/src/likec4diagram/DiagramXYFlow.tsx +118 -121
  203. package/src/likec4diagram/custom/edges/RelationshipEdge.tsx +9 -0
  204. package/src/likec4diagram/custom/edges/RelationshipsDropdownMenu.tsx +10 -9
  205. package/src/likec4diagram/custom/nodes/nodes.tsx +45 -43
  206. package/src/likec4diagram/custom/nodes/toolbar/_shared.tsx +11 -3
  207. package/src/likec4diagram/types.ts +5 -3
  208. package/src/likec4diagram/ui/controls/Controls.tsx +11 -4
  209. package/src/likec4diagram/ui/notation/NotationPanel.tsx +2 -2
  210. package/src/likec4diagram/useViewToNodesEdges.ts +34 -36
  211. package/src/likec4model/LikeC4ModelContext.ts +2 -2
  212. package/src/likec4model/index.ts +2 -0
  213. package/src/likec4model/useLikeC4ElementsTree.ts +1 -1
  214. package/src/likec4model/useLikeC4Model.ts +32 -16
  215. package/src/overlays/Overlays.tsx +5 -32
  216. package/src/overlays/element-details/ElementDetailsCard.tsx +25 -18
  217. package/src/overlays/element-details/TabPanelDeployments.tsx +3 -2
  218. package/src/overlays/element-details/TabPanelRelationships.tsx +2 -1
  219. package/src/overlays/element-details/TabPanelStructure.tsx +1 -1
  220. package/src/overlays/element-details/actor.ts +2 -2
  221. package/src/overlays/overlay/Overlay.css.ts +75 -38
  222. package/src/overlays/overlay/Overlay.tsx +61 -29
  223. package/src/overlays/overlaysActor.ts +1 -1
  224. package/src/overlays/relationship-details/RelationshipDetails.tsx +4 -4
  225. package/src/overlays/relationship-details/_types.ts +2 -1
  226. package/src/overlays/relationship-details/custom/nodeTypes.tsx +4 -0
  227. package/src/overlays/relationship-details/layout-to-xyflow.ts +1 -0
  228. package/src/overlays/relationship-details/layout.ts +3 -1
  229. package/src/overlays/relationships-browser/SelectElement.tsx +1 -1
  230. package/src/overlays/relationships-browser/_types.ts +2 -1
  231. package/src/overlays/relationships-browser/custom/nodeTypes.tsx +4 -0
  232. package/src/overlays/relationships-browser/layout.ts +12 -7
  233. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +4 -4
  234. package/src/search/Search.tsx +220 -0
  235. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.css.ts +0 -29
  236. package/src/{likec4diagram/ui/search → search/components}/ElementsColumn.tsx +28 -29
  237. package/src/search/components/PickView.tsx +134 -0
  238. package/src/search/components/SearchByTags.tsx +112 -0
  239. package/src/{likec4diagram/ui/search → search/components}/SearchInput.tsx +72 -42
  240. package/src/{likec4diagram/ui/search → search/components}/ViewsColum.tsx +29 -22
  241. package/src/{likec4diagram/ui/search → search/components}/_shared.css.ts +26 -37
  242. package/src/{likec4diagram/ui/search/LikeC4Search.css.ts → search/components/styles.css.ts} +9 -36
  243. package/src/search/components/utils.ts +64 -0
  244. package/src/search/hooks.ts +38 -0
  245. package/src/search/searchActor.ts +99 -0
  246. package/src/state/DiagramActorProvider.tsx +37 -25
  247. package/src/state/assign.ts +10 -10
  248. package/src/state/diagram-machine.ts +123 -58
  249. package/src/state/syncManualLayoutActor.ts +1 -1
  250. package/src/state/types.ts +2 -0
  251. package/src/state/utils.ts +4 -0
  252. package/dist/base/types.js +0 -54
  253. package/dist/likec4diagram/ui/search/ElementsColumn.d.ts +0 -1
  254. package/dist/likec4diagram/ui/search/LikeC4Search.css.js +0 -87
  255. package/dist/likec4diagram/ui/search/LikeC4Search.d.ts +0 -2
  256. package/dist/likec4diagram/ui/search/LikeC4Search.js +0 -267
  257. package/dist/likec4diagram/ui/search/SearchInput.d.ts +0 -1
  258. package/dist/likec4diagram/ui/search/state.d.ts +0 -19
  259. package/dist/likec4diagram/ui/search/state.js +0 -63
  260. package/dist/likec4diagram/ui/search/utils.d.ts +0 -3
  261. package/dist/likec4diagram/ui/search/utils.js +0 -20
  262. package/src/likec4diagram/ui/search/LikeC4Search.tsx +0 -301
  263. package/src/likec4diagram/ui/search/state.ts +0 -78
  264. package/src/likec4diagram/ui/search/utils.ts +0 -20
  265. /package/dist/{likec4diagram/ui/search → search/components}/ElementsColumn.css.d.ts +0 -0
  266. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.d.ts +0 -0
  267. /package/dist/{likec4diagram/ui/search → search/components}/ViewsColumn.css.js +0 -0
  268. /package/dist/{likec4diagram/ui/search → search/components}/_shared.css.d.ts +0 -0
  269. /package/src/{likec4diagram/ui/search → search/components}/ViewsColumn.css.ts +0 -0
@@ -236,11 +236,13 @@ function layoutRelationshipDetails(data, scope) {
236
236
  return {
237
237
  id,
238
238
  parent: parentId ?? null,
239
+ x: position.x,
240
+ y: position.y,
239
241
  position: [position.x, position.y],
240
242
  title: element.title,
241
243
  description: element.description,
242
244
  technology: element.technology,
243
- tags: null,
245
+ tags: [...element.tags],
244
246
  links: null,
245
247
  color: inheritFromNodeOrAncestor?.color ?? element.color,
246
248
  shape: inheritFromNode?.shape ?? element.shape,
@@ -1,6 +1,7 @@
1
1
  import { RelationshipsBrowserActorRef } from './actor';
2
2
  import { FunctionComponent, CSSProperties, ReactNode } from 'react';
3
3
  import { Position } from '@xyflow/system';
4
+ import { EdgeData, Dimmed } from '../../base/types.Base';
4
5
  import { Fqn, NonEmptyArray, RelationId, Color, ViewId, RelationshipLineType } from '@likec4/core';
5
6
  export declare const edgeTypes: {
6
7
  relationship: FunctionComponent<{
@@ -30,10 +31,10 @@ export declare const edgeTypes: {
30
31
  markerEnd?: string;
31
32
  pathOptions?: any;
32
33
  interactionWidth?: number;
33
- data: import("../../base").Base.EdgeData & {
34
+ data: EdgeData & {
34
35
  hovered?: boolean;
35
36
  active?: boolean;
36
- dimmed?: import("../../base").Base.Dimmed;
37
+ dimmed?: Dimmed;
37
38
  sourceFqn: Fqn;
38
39
  targetFqn: Fqn;
39
40
  relations: NonEmptyArray<RelationId>;
@@ -34,7 +34,7 @@ const SelectElement = memo(() => {
34
34
  } = useRelationshipsBrowserState(selector2);
35
35
  const root = useRef(null);
36
36
  const viewport = useRef(null);
37
- const model = useLikeC4Model(true);
37
+ const model = useLikeC4Model();
38
38
  const subject = model.findElement(subjectId);
39
39
  const data = useLikeC4ElementsTree(scope === "view" && viewId ? viewId : void 0);
40
40
  const tree = useTree({
@@ -1,4 +1,4 @@
1
- import { Color, DiagramNode, Fqn, IconUrl, NonEmptyArray, RelationId, RelationshipLineType, ViewId } from '@likec4/core';
1
+ import { Color, DiagramNode, Fqn, IconUrl, NonEmptyArray, RelationId, RelationshipLineType, ViewId } from '@likec4/core/types';
2
2
  import { Simplify } from 'type-fest';
3
3
  import { Base, NonOptional, ReactFlowEdge, ReactFlowNode } from '../../base/types';
4
4
  export declare namespace RelationshipsBrowserTypes {
@@ -10,7 +10,7 @@ export declare namespace RelationshipsBrowserTypes {
10
10
  in: string[];
11
11
  out: string[];
12
12
  };
13
- type ElementNodeData = Simplify<Base.NodeData & NonOptional<Pick<DiagramNode, 'title' | 'technology' | 'description' | 'color' | 'shape' | 'style' | 'width' | 'height' | 'navigateTo'>> & {
13
+ type ElementNodeData = Simplify<Base.NodeData & NonOptional<Pick<DiagramNode, 'title' | 'technology' | 'description' | 'color' | 'shape' | 'style' | 'width' | 'height' | 'tags' | 'navigateTo'>> & {
14
14
  column: Column;
15
15
  fqn: Fqn;
16
16
  icon: string | null;
@@ -352,7 +352,7 @@ export declare const relationshipsBrowserLogic: StateMachine<Context, Events, {
352
352
  }) => {
353
353
  subject: Fqn;
354
354
  viewId: ViewId | null;
355
- scope: "global" | "view";
355
+ scope: "view" | "global";
356
356
  closeable: boolean;
357
357
  enableSelectSubject: boolean;
358
358
  enableChangeScope: boolean;
@@ -9,8 +9,8 @@ import { updateNodes } from '../../base/updateNodes.js';
9
9
  import { typedSystem } from '../../state/utils.js';
10
10
  import { ViewPadding } from './const.js';
11
11
  import { viewToNodesEdge } from './useViewToNodesEdges.js';
12
- import { Base } from '../../base/types.js';
13
12
  import { centerXYInternalNode } from '../../utils/xyflow.js';
13
+ import { setDimmed, setHovered, setData } from '../../base/types.Base.js';
14
14
 
15
15
  const findRootSubject = (nodes) => nodes.find(
16
16
  (n) => n.data.column === "subjects" && isNullish(n.parentId)
@@ -104,7 +104,7 @@ const layouter = fromPromise(async ({ input, self, signal }) => {
104
104
  xyedges: []
105
105
  });
106
106
  await delay(120);
107
- next.xynodes = next.xynodes.map(Base.setDimmed(false));
107
+ next.xynodes = next.xynodes.map(setDimmed(false));
108
108
  if (signal.aborted) {
109
109
  return updateXYData();
110
110
  }
@@ -334,12 +334,12 @@ const relationshipsBrowserLogic = setup({
334
334
  const hasDimmed = context.xyedges.some((edge) => edge.data.dimmed !== false || edge.selected);
335
335
  return context.xyedges.map((edge) => {
336
336
  if (edge.id === event.edge.id) {
337
- return Base.setData(edge, {
337
+ return setData(edge, {
338
338
  hovered: true,
339
339
  dimmed: false
340
340
  });
341
341
  }
342
- return hasDimmed && !edge.selected ? Base.setDimmed(edge, "immediate") : edge;
342
+ return hasDimmed && !edge.selected ? setDimmed(edge, "immediate") : edge;
343
343
  });
344
344
  }
345
345
  }),
@@ -354,7 +354,7 @@ const relationshipsBrowserLogic = setup({
354
354
  xyedges: ({ context, event }) => {
355
355
  return context.xyedges.map((edge) => {
356
356
  if (edge.id === event.edge.id) {
357
- return Base.setHovered(edge, false);
357
+ return setHovered(edge, false);
358
358
  }
359
359
  return edge;
360
360
  });
@@ -367,14 +367,14 @@ const relationshipsBrowserLogic = setup({
367
367
  "dim.nonhovered.edges": {
368
368
  actions: assign({
369
369
  xyedges: ({ context }) => context.xyedges.map(
370
- (edge) => edge.data.hovered ? edge : Base.setDimmed(edge, edge.data.dimmed === "immediate" ? "immediate" : true)
370
+ (edge) => edge.data.hovered ? edge : setDimmed(edge, edge.data.dimmed === "immediate" ? "immediate" : true)
371
371
  )
372
372
  })
373
373
  },
374
374
  "undim.edges": {
375
375
  actions: assign({
376
376
  xyedges: ({ context }) => {
377
- return context.xyedges.map(Base.setDimmed(false));
377
+ return context.xyedges.map(setDimmed(false));
378
378
  }
379
379
  })
380
380
  },
@@ -1,5 +1,6 @@
1
1
  import { FunctionComponent, CSSProperties, ReactNode } from 'react';
2
2
  import { Position } from '@xyflow/system';
3
+ import { EdgeData, Dimmed } from '../../../base/types.Base';
3
4
  import { Fqn, NonEmptyArray, RelationId, Color, ViewId, RelationshipLineType } from '@likec4/core';
4
5
  export declare const RelationshipEdge: FunctionComponent<{
5
6
  id: string;
@@ -28,10 +29,10 @@ export declare const RelationshipEdge: FunctionComponent<{
28
29
  markerEnd?: string;
29
30
  pathOptions?: any;
30
31
  interactionWidth?: number;
31
- data: import("../../../base").Base.EdgeData & {
32
+ data: EdgeData & {
32
33
  hovered?: boolean;
33
34
  active?: boolean;
34
- dimmed?: import("../../../base").Base.Dimmed;
35
+ dimmed?: Dimmed;
35
36
  sourceFqn: Fqn;
36
37
  targetFqn: Fqn;
37
38
  relations: NonEmptyArray<RelationId>;
@@ -1,18 +1,21 @@
1
1
  import { NodeProps } from '../../../base';
2
2
  import { RelationshipsBrowserTypes } from '../_types';
3
3
  import { MemoExoticComponent } from 'react';
4
- import { ElementStyle, Color, ViewId, Fqn, IconUrl } from '@likec4/core';
4
+ import { Dimmed } from '../../../base/types.Base';
5
+ import { ElementStyle, Color, Any, ViewId, Fqn, IconUrl } from '@likec4/core';
6
+ import { Tags } from '@likec4/core/types/aux';
5
7
  export declare const ElementNode: MemoExoticComponent<(props: NodeProps<{
6
8
  hovered?: boolean;
7
- dimmed?: import("../../../base").Base.Dimmed;
9
+ dimmed?: Dimmed;
8
10
  width: number;
9
11
  height: number;
10
12
  style: ElementStyle;
11
13
  color: Color;
12
14
  title: string;
13
- technology: string | null;
14
- description: string | null;
15
15
  shape: "rectangle" | "person" | "browser" | "mobile" | "cylinder" | "storage" | "queue";
16
+ tags: Tags<Any>;
17
+ technology: string | null | undefined;
18
+ description: string | null | undefined;
16
19
  navigateTo: ViewId<string> | null | undefined;
17
20
  column: RelationshipsBrowserTypes.Column;
18
21
  fqn: Fqn;
@@ -22,7 +25,7 @@ export declare const ElementNode: MemoExoticComponent<(props: NodeProps<{
22
25
  }, string>) => import("react/jsx-runtime").JSX.Element>;
23
26
  export declare const CompoundNode: MemoExoticComponent<(props: NodeProps<{
24
27
  hovered?: boolean;
25
- dimmed?: import("../../../base").Base.Dimmed;
28
+ dimmed?: Dimmed;
26
29
  style: ElementStyle;
27
30
  color: Color;
28
31
  title: string;
@@ -1,6 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { Handle } from '@xyflow/react';
3
3
  import { Position } from '@xyflow/system';
4
+ import { useEnabledFeatures } from '../../../context/DiagramFeatures.js';
4
5
  import { useDiagram } from '../../../hooks/useDiagram.js';
5
6
  import { ElementActions } from './ElementActions.js';
6
7
  import { EmptyNode as EmptyNode$1 } from './EmptyNode.js';
@@ -10,6 +11,7 @@ import { CompoundTitle } from '../../../base/primitives/compound/CompoundTitle.j
10
11
  import { ElementNodeContainer } from '../../../base/primitives/element/ElementNodeContainer.js';
11
12
  import { ElementShape } from '../../../base/primitives/element/ElementShape.js';
12
13
  import { ElementTitle } from '../../../base/primitives/element/ElementTitle.js';
14
+ import { ElementTags } from '../../../base/primitives/element/ElementTags.js';
13
15
  import { ElementDetailsButton } from '../../../base/primitives/element/ElementDetailsButton.js';
14
16
 
15
17
  const ElementDetailsButtonWithHandler = (props) => {
@@ -26,9 +28,11 @@ const ElementDetailsButtonWithHandler = (props) => {
26
28
  );
27
29
  };
28
30
  const ElementNode = customNode((props) => {
31
+ const { enableElementTags } = useEnabledFeatures();
29
32
  return /* @__PURE__ */ jsxs(ElementNodeContainer, { layoutId: props.id, nodeProps: props, children: [
30
33
  /* @__PURE__ */ jsx(ElementShape, { ...props }),
31
34
  /* @__PURE__ */ jsx(ElementTitle, { ...props }),
35
+ enableElementTags && /* @__PURE__ */ jsx(ElementTags, { ...props }),
32
36
  /* @__PURE__ */ jsx(ElementDetailsButtonWithHandler, { ...props }),
33
37
  /* @__PURE__ */ jsx(ElementActions, { ...props }),
34
38
  /* @__PURE__ */ jsx(ElementPorts, { ...props })
@@ -1,6 +1,6 @@
1
1
  import { RelationshipsViewData } from '@likec4/core/compute-view/relationships';
2
2
  import { DiagramEdge, DiagramNode, DiagramView, ElementKind, Fqn, ViewId } from '@likec4/core/types';
3
- import { AnyAux, LikeC4ViewModel } from '@likec4/core/model';
3
+ import { LikeC4ViewModel } from '@likec4/core/model';
4
4
  import { RelationshipsBrowserTypes } from './_types';
5
5
  export type LayoutRelationshipsViewResult = {
6
6
  subject: Fqn;
@@ -24,5 +24,5 @@ export declare namespace LayoutRelationshipsViewResult {
24
24
  existsInCurrentView: boolean;
25
25
  };
26
26
  }
27
- export declare function layoutRelationshipsView(data: RelationshipsViewData, scope: LikeC4ViewModel<AnyAux> | null): Omit<LayoutRelationshipsViewResult, 'subject'>;
27
+ export declare function layoutRelationshipsView(data: RelationshipsViewData, scope: LikeC4ViewModel | null): Omit<LayoutRelationshipsViewResult, 'subject'>;
28
28
  export declare function useRelationshipsView(subject: Fqn, viewId: ViewId | null, scope: 'global' | 'view'): LayoutRelationshipsViewResult;
@@ -1,7 +1,7 @@
1
1
  import { computeRelationshipsView, treeFromElements } from '@likec4/core/compute-view/relationships';
2
2
  import { useMemo } from 'react';
3
3
  import dagre from '@dagrejs/dagre';
4
- import { toArray, invariant, ifind, DefaultMap } from '@likec4/core';
4
+ import { toArray, invariant, ifind, nonNullable, DefaultMap } from '@likec4/core';
5
5
  import { pipe, concat, map, groupBy, prop, forEachObj, filter, mapToObj, find, only, unique, tap, reduce, sortBy } from 'remeda';
6
6
  import { useLikeC4Model } from '../../likec4model/useLikeC4Model.js';
7
7
 
@@ -325,12 +325,14 @@ function layoutRelationshipsView(data, scope) {
325
325
  return {
326
326
  id,
327
327
  parent: null,
328
+ x: position.x,
329
+ y: position.y,
328
330
  position: [position.x, position.y],
329
331
  title: "empty node",
330
332
  description: null,
331
333
  technology: null,
332
- tags: null,
333
- links: null,
334
+ tags: [],
335
+ links: [],
334
336
  color: "muted",
335
337
  shape: "rectangle",
336
338
  style: {
@@ -367,11 +369,13 @@ function layoutRelationshipsView(data, scope) {
367
369
  return {
368
370
  id,
369
371
  parent: parentId ?? null,
372
+ x: position.x,
373
+ y: position.y,
370
374
  position: [position.x, position.y],
371
375
  title: element.title,
372
376
  description: element.description,
373
377
  technology: element.technology,
374
- tags: null,
378
+ tags: [...element.tags],
375
379
  links: null,
376
380
  color: inheritFromNodeOrAncestor?.color ?? element.color,
377
381
  shape: inheritFromNode?.shape ?? element.shape,
@@ -426,7 +430,7 @@ function layoutRelationshipsView(data, scope) {
426
430
  relations,
427
431
  sourceHandle,
428
432
  targetHandle
429
- } = find(edges, (e2) => e2.name === ename);
433
+ } = nonNullable(find(edges, (e2) => e2.name === ename));
430
434
  const onlyRelation = only(relations);
431
435
  const label = onlyRelation?.title ?? "untitled";
432
436
  const isMultiple = relations.length > 1;
@@ -452,7 +456,7 @@ function layoutRelationshipsView(data, scope) {
452
456
  };
453
457
  }
454
458
  function useRelationshipsView(subject, viewId, scope) {
455
- const model = useLikeC4Model(true);
459
+ const model = useLikeC4Model();
456
460
  return useMemo(() => {
457
461
  const view = viewId ? model.findView(viewId) : null;
458
462
  const data = layoutRelationshipsView(
@@ -1,4 +1,4 @@
1
- import { Queue, ElementKind, nonNullable, DiagramNode, invariant } from '@likec4/core';
1
+ import { Queue, GroupElementKind, nonNullable, invariant } from '@likec4/core';
2
2
  import '@react-hookz/web';
3
3
  import { hasAtLeast } from 'remeda';
4
4
  import { ZIndexes } from '../../base/const.js';
@@ -21,7 +21,7 @@ function viewToNodesEdge(view) {
21
21
  let next;
22
22
  while (next = queue.dequeue()) {
23
23
  const { node, parent } = next;
24
- const isCompound = hasAtLeast(node.children, 1) || node.kind == ElementKind.Group;
24
+ const isCompound = hasAtLeast(node.children, 1) || node.kind == GroupElementKind;
25
25
  if (isCompound) {
26
26
  for (const child of node.children) {
27
27
  queue.enqueue({ node: nodeById(child), parent: node });
@@ -53,7 +53,7 @@ function viewToNodesEdge(view) {
53
53
  parentId: ns + parent.id
54
54
  }
55
55
  };
56
- const fqn = DiagramNode.modelRef(node);
56
+ const fqn = node.modelRef ?? null;
57
57
  const navigateTo = { navigateTo: node.navigateTo ?? null };
58
58
  switch (true) {
59
59
  case node.kind === LayoutRelationshipsViewResult.Empty: {
@@ -110,6 +110,7 @@ function viewToNodesEdge(view) {
110
110
  ports: node.ports,
111
111
  style: node.style,
112
112
  existsInCurrentView: node.existsInCurrentView,
113
+ tags: node.tags,
113
114
  ...navigateTo
114
115
  }
115
116
  }
@@ -0,0 +1,4 @@
1
+ import { SearchActorRef } from './searchActor';
2
+ export declare function Search({ searchActorRef }: {
3
+ searchActorRef: SearchActorRef;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,173 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { css } from '@likec4/styles/css';
3
+ import { Box, VStack } from '@likec4/styles/jsx';
4
+ import { Group, Grid, GridCol, Title, ScrollArea } from '@mantine/core';
5
+ import { useCallbackRef, useHotkeys } from '@mantine/hooks';
6
+ import { useTimeoutEffect } from '@react-hookz/web';
7
+ import { useSelector } from '@xstate/react';
8
+ import { AnimatePresence, LayoutGroup } from 'motion/react';
9
+ import { useRef } from 'react';
10
+ import { ErrorBoundary } from 'react-error-boundary';
11
+ import { isTruthy } from 'remeda';
12
+ import { ErrorFallback } from '../components/ErrorFallback.js';
13
+ import { DiagramFeatures } from '../context/DiagramFeatures.js';
14
+ import { Overlay } from '../overlays/overlay/Overlay.js';
15
+ import { ElementsColumn } from './components/ElementsColumn.js';
16
+ import { PickView } from './components/PickView.js';
17
+ import { SearchByTags } from './components/SearchByTags.js';
18
+ import { LikeC4SearchInput } from './components/SearchInput.js';
19
+ import { focusToFirstFoundElement, moveFocusToSearchInput } from './components/utils.js';
20
+ import { ViewsColumn } from './components/ViewsColum.js';
21
+ import { SearchActorContext, usePickViewFor } from './hooks.js';
22
+
23
+ const dialog = css({
24
+ backgroundColor: `[rgb(34 34 34 / var(--_opacity, 95%))]`,
25
+ _light: {
26
+ backgroundColor: `[rgb(250 250 250 / var(--_opacity, 95%))]`
27
+ },
28
+ backdropFilter: "auto",
29
+ backdropBlur: "var(--_blur, 10px)"
30
+ // base: `[rgb(34 34 34 / var(${backdropOpacity}))]`,
31
+ // _light: `[rgb(255 255 255/ var(${backdropOpacity}))]`,
32
+ // },
33
+ });
34
+ const body = css({
35
+ // containerName: 'likec4-search',
36
+ // containerType: 'size',
37
+ // position: 'fixed',
38
+ // zIndex: 901,
39
+ // top: 0,
40
+ // left: 0,
41
+ width: "100%",
42
+ height: "100%",
43
+ maxHeight: "100vh",
44
+ overflow: "hidden",
45
+ display: "flex",
46
+ flexDirection: "column",
47
+ justifyContent: "stretch",
48
+ gap: "sm",
49
+ paddingTop: 20,
50
+ paddingLeft: 16,
51
+ paddingRight: 16,
52
+ paddingBottom: 8,
53
+ background: "[transparent]"
54
+ // backgroundColor: {
55
+ // _dark: `[rgb(34 34 34 / 0.95)]`,
56
+ // _light: `[rgb(255 255 255/ 0.95)]`,
57
+ // },
58
+ });
59
+ const selectIsOpened = (s) => !s.matches("inactive");
60
+ function Search({ searchActorRef }) {
61
+ const isOpened = useSelector(searchActorRef, selectIsOpened);
62
+ const openSearch = () => {
63
+ searchActorRef.send({ type: "open" });
64
+ };
65
+ const close = useCallbackRef(() => {
66
+ searchActorRef.send({ type: "close" });
67
+ });
68
+ useHotkeys([
69
+ ["mod+k", openSearch, {
70
+ preventDefault: true
71
+ }],
72
+ ["mod+f", openSearch, {
73
+ preventDefault: true
74
+ }]
75
+ ]);
76
+ return /* @__PURE__ */ jsx(SearchActorContext, { value: searchActorRef, children: /* @__PURE__ */ jsx(DiagramFeatures.Overlays, { children: /* @__PURE__ */ jsx(ErrorBoundary, { FallbackComponent: ErrorFallback, onReset: close, children: /* @__PURE__ */ jsx(AnimatePresence, { children: isOpened && /* @__PURE__ */ jsx(
77
+ Overlay,
78
+ {
79
+ fullscreen: true,
80
+ withBackdrop: false,
81
+ backdrop: {
82
+ opacity: 0.9
83
+ },
84
+ classes: {
85
+ dialog,
86
+ body
87
+ },
88
+ openDelay: 0,
89
+ onClose: close,
90
+ "data-likec4-search": "true",
91
+ children: /* @__PURE__ */ jsx(SearchOverlay, { searchActorRef })
92
+ }
93
+ ) }) }) }) });
94
+ }
95
+ const scrollArea = css({
96
+ height: [
97
+ "100%",
98
+ "100cqh"
99
+ ],
100
+ "& .mantine-ScrollArea-viewport": {
101
+ minHeight: "100%",
102
+ "& > div": {
103
+ minHeight: "100%",
104
+ height: "100%"
105
+ }
106
+ }
107
+ });
108
+ const SearchOverlay = ({ searchActorRef }) => {
109
+ const ref = useRef(null);
110
+ const pickViewFor = usePickViewFor();
111
+ useTimeoutEffect(() => {
112
+ if (isTruthy(searchActorRef.getSnapshot().context.openedWithSearch)) {
113
+ focusToFirstFoundElement(ref.current);
114
+ }
115
+ }, 150);
116
+ return /* @__PURE__ */ jsxs(Box, { ref, display: "contents", children: [
117
+ /* @__PURE__ */ jsx(
118
+ Group,
119
+ {
120
+ className: "group",
121
+ wrap: "nowrap",
122
+ onClick: (e) => {
123
+ e.stopPropagation();
124
+ moveFocusToSearchInput(ref.current);
125
+ },
126
+ children: /* @__PURE__ */ jsxs(VStack, { flex: 1, px: "sm", children: [
127
+ /* @__PURE__ */ jsx(LikeC4SearchInput, {}),
128
+ /* @__PURE__ */ jsx(SearchByTags, {})
129
+ ] })
130
+ }
131
+ ),
132
+ /* @__PURE__ */ jsxs(Grid, { children: [
133
+ /* @__PURE__ */ jsx(GridCol, { span: 6, children: /* @__PURE__ */ jsx(Title, { component: "div", order: 6, c: "dimmed", pl: "sm", children: "Elements" }) }),
134
+ /* @__PURE__ */ jsx(GridCol, { span: 6, children: /* @__PURE__ */ jsx(Title, { component: "div", order: 6, c: "dimmed", pl: "sm", children: "Views" }) })
135
+ ] }),
136
+ /* @__PURE__ */ jsxs(
137
+ Grid,
138
+ {
139
+ className: css({
140
+ containerName: "likec4-search-elements",
141
+ containerType: "size",
142
+ overflow: "hidden",
143
+ flexGrow: 1
144
+ }),
145
+ children: [
146
+ /* @__PURE__ */ jsx(GridCol, { span: 6, children: /* @__PURE__ */ jsx(
147
+ ScrollArea,
148
+ {
149
+ type: "scroll",
150
+ className: scrollArea,
151
+ pr: "xs",
152
+ scrollbars: "y",
153
+ children: /* @__PURE__ */ jsx(AnimatePresence, { children: /* @__PURE__ */ jsx(LayoutGroup, { id: "likec4-search-elements", children: /* @__PURE__ */ jsx(ElementsColumn, {}) }) })
154
+ }
155
+ ) }),
156
+ /* @__PURE__ */ jsx(GridCol, { span: 6, children: /* @__PURE__ */ jsx(
157
+ ScrollArea,
158
+ {
159
+ type: "scroll",
160
+ className: scrollArea,
161
+ pr: "xs",
162
+ scrollbars: "y",
163
+ children: /* @__PURE__ */ jsx(AnimatePresence, { children: /* @__PURE__ */ jsx(LayoutGroup, { id: "likec4-search-views", children: /* @__PURE__ */ jsx(ViewsColumn, {}) }) })
164
+ }
165
+ ) })
166
+ ]
167
+ }
168
+ ),
169
+ pickViewFor && /* @__PURE__ */ jsx(PickView, { elementFqn: pickViewFor })
170
+ ] });
171
+ };
172
+
173
+ export { Search };
@@ -11,7 +11,6 @@ const treeRoot = css(
11
11
  containerName: "likec4-tree"
12
12
  }),
13
13
  {
14
- overflow: "hidden",
15
14
  containerType: "inline-size",
16
15
  height: "100%"
17
16
  }
@@ -0,0 +1,2 @@
1
+ import { MemoExoticComponent } from 'react';
2
+ export declare const ElementsColumn: MemoExoticComponent<() => import("react/jsx-runtime").JSX.Element>;
@@ -5,25 +5,26 @@ import { useTree, Tree, ActionIcon, UnstyledButton, Box, Group, Highlight, Toolt
5
5
  import { useCallbackRef } from '@mantine/hooks';
6
6
  import { IconChevronRight } from '@tabler/icons-react';
7
7
  import * as m from 'motion/react-m';
8
- import { useMemo, useCallback, useEffect } from 'react';
9
- import { isEmpty, pipe, reduce, only, partition, first } from 'remeda';
10
- import { IconOrShapeRenderer } from '../../../context/IconRenderer.js';
11
- import { sortByLabel } from '../../../likec4model/useLikeC4ElementsTree.js';
12
- import { useLikeC4Model } from '../../../likec4model/useLikeC4Model.js';
8
+ import { memo, useMemo, useEffect } from 'react';
9
+ import { isEmpty, pipe, reduce, only, first } from 'remeda';
10
+ import { IconOrShapeRenderer } from '../../context/IconRenderer.js';
11
+ import { useDiagram } from '../../hooks/useDiagram.js';
12
+ import { sortByLabel } from '../../likec4model/useLikeC4ElementsTree.js';
13
+ import { useLikeC4Model } from '../../likec4model/useLikeC4Model.js';
14
+ import { useNormalizedSearch, useSearchActor } from '../hooks.js';
13
15
  import { focusable, buttonsva } from './_shared.css.js';
14
16
  import { treeSubtree, treeLabel, treeRoot, treeNode, elementIcon, elementExpandIcon, elementTitleAndId, elementId, elementViewsCount } from './ElementsColumn.css.js';
15
- import { useNormalizedSearch, useCloseSearchAndNavigateTo, setPickView } from './state.js';
16
- import { stopAndPrevent, moveFocusToSearchInput, centerY } from './utils.js';
17
+ import { stopAndPrevent, moveFocusToSearchInput, queryAllFocusable, centerY } from './utils.js';
17
18
  import { NothingFound } from './ViewsColum.js';
18
19
 
19
20
  const btn = buttonsva();
20
- function ElementsColumn() {
21
+ const ElementsColumn = memo(() => {
22
+ const model = useLikeC4Model();
21
23
  const search = useNormalizedSearch();
22
- const model = useLikeC4Model(true);
23
24
  const data = useMemo(() => {
24
25
  const searchTerms = search.split(".");
25
26
  let elements;
26
- if (isEmpty(search) || search === "kind:") {
27
+ if (isEmpty(searchTerms) || searchTerms[0] === "kind:") {
27
28
  elements = model.elements();
28
29
  } else {
29
30
  elements = ifilter(model.elements(), (element) => {
@@ -76,7 +77,7 @@ function ElementsColumn() {
76
77
  return /* @__PURE__ */ jsx(NothingFound, {});
77
78
  }
78
79
  return /* @__PURE__ */ jsx(ElementsTree, { data, handleClick });
79
- }
80
+ });
80
81
  const setHoveredNode = () => {
81
82
  };
82
83
  function ElementsTree({
@@ -107,7 +108,7 @@ function ElementsTree({
107
108
  if (e.key === "ArrowUp") {
108
109
  if (id === roots[0]?.value) {
109
110
  stopAndPrevent(e);
110
- moveFocusToSearchInput();
111
+ moveFocusToSearchInput(target);
111
112
  }
112
113
  return;
113
114
  }
@@ -118,9 +119,7 @@ function ElementsTree({
118
119
  }
119
120
  const label = e.target.querySelector(".mantine-Tree-label") ?? target;
120
121
  const maxY = label.getBoundingClientRect().y;
121
- const viewButtons = [...document.querySelectorAll(
122
- `[data-likec4-search-views] .${focusable}`
123
- )];
122
+ const viewButtons = queryAllFocusable(target, "views");
124
123
  let view = viewButtons.length > 1 ? viewButtons.find((el, i, all2) => centerY(el) > maxY || i === all2.length - 1) : null;
125
124
  view ??= first(viewButtons);
126
125
  if (view) {
@@ -200,6 +199,7 @@ function ElementTreeNode({ node, elementProps, hasChildren, expanded }) {
200
199
  component: m.button,
201
200
  layout: true,
202
201
  tabIndex: -1,
202
+ "data-value": element.id,
203
203
  className: cx(btn.root, "group", "likec4-element-button"),
204
204
  ...views.length > 0 && {
205
205
  onClick: (e) => {
@@ -237,24 +237,25 @@ function ElementTreeNode({ node, elementProps, hasChildren, expanded }) {
237
237
  ] });
238
238
  }
239
239
  function useHandleElementSelection() {
240
- const navigateTo = useCloseSearchAndNavigateTo();
241
- return useCallback((element) => {
240
+ const diagram = useDiagram();
241
+ const searchActorRef = useSearchActor();
242
+ return useCallbackRef((element) => {
242
243
  const views = [...element.views()];
243
244
  if (views.length === 0) {
244
245
  return;
245
246
  }
246
247
  const singleView = only(views);
247
248
  if (singleView) {
248
- navigateTo(singleView.id, element.id);
249
+ searchActorRef.send({ type: "close" });
250
+ if (singleView.id !== diagram.currentView.id) {
251
+ setTimeout(() => {
252
+ diagram.navigateTo(singleView.id);
253
+ }, 100);
254
+ }
249
255
  return;
250
256
  }
251
- const [scoped, others] = partition(views, (v) => v.viewOf?.id === element.id);
252
- setPickView({
253
- elementFqn: element.id,
254
- scoped,
255
- others
256
- });
257
- }, [setPickView, navigateTo]);
257
+ searchActorRef.send({ type: "pickview.open", elementFqn: element.id });
258
+ });
258
259
  }
259
260
 
260
261
  export { ElementsColumn };
@@ -0,0 +1,4 @@
1
+ import { Fqn } from '@likec4/core/types';
2
+ export declare function PickView({ elementFqn }: {
3
+ elementFqn: Fqn;
4
+ }): import("react/jsx-runtime").JSX.Element;