@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
@@ -0,0 +1,29 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Box } from '@likec4/styles/jsx';
3
+ import { Notification, ScrollAreaAutosize, Code, Group, Button } from '@mantine/core';
4
+ import { IconX } from '@tabler/icons-react';
5
+
6
+ function ErrorFallback({ error, resetErrorBoundary }) {
7
+ const errorString = error instanceof Error ? error.message : "Unknown error";
8
+ return /* @__PURE__ */ jsx(Box, { pos: "fixed", top: 0, left: 0, w: "100%", p: 0, style: { zIndex: 1e3 }, children: /* @__PURE__ */ jsxs(
9
+ Notification,
10
+ {
11
+ icon: /* @__PURE__ */ jsx(IconX, { style: { width: 16, height: 16 } }),
12
+ styles: {
13
+ icon: {
14
+ alignSelf: "flex-start"
15
+ }
16
+ },
17
+ color: "red",
18
+ title: "Oops, something went wrong",
19
+ p: "xl",
20
+ withCloseButton: false,
21
+ children: [
22
+ /* @__PURE__ */ jsx(ScrollAreaAutosize, { maw: "100%", mah: 400, children: /* @__PURE__ */ jsx(Code, { block: true, children: errorString }) }),
23
+ /* @__PURE__ */ jsx(Group, { gap: "xs", mt: "xl", children: /* @__PURE__ */ jsx(Button, { color: "gray", size: "xs", variant: "light", onClick: () => resetErrorBoundary(), children: "Reset" }) })
24
+ ]
25
+ }
26
+ ) });
27
+ }
28
+
29
+ export { ErrorFallback };
@@ -1,14 +1,15 @@
1
+ import { Any } from '@likec4/core/types';
1
2
  import { PropsWithChildren, RefObject } from 'react';
2
3
  import { LikeC4DiagramEventHandlers } from '../LikeC4Diagram.props';
3
4
  type RequiredOrNull<T> = {
4
5
  [P in keyof T]-?: NonNullable<T[P]> | null;
5
6
  };
6
- type DiagramEventHandlersContextValue = RequiredOrNull<LikeC4DiagramEventHandlers> & {
7
- handlersRef: RefObject<LikeC4DiagramEventHandlers>;
7
+ type DiagramEventHandlersContextValue = RequiredOrNull<LikeC4DiagramEventHandlers<Any>> & {
8
+ handlersRef: RefObject<LikeC4DiagramEventHandlers<Any>>;
8
9
  };
9
- export declare function DiagramEventHandlers({ handlers, children, }: PropsWithChildren<{
10
- handlers: LikeC4DiagramEventHandlers;
10
+ export declare function DiagramEventHandlers<A extends Any>({ handlers, children, }: PropsWithChildren<{
11
+ handlers: LikeC4DiagramEventHandlers<A>;
11
12
  }>): import("react/jsx-runtime").JSX.Element;
12
13
  export declare function useDiagramEventHandlers(): DiagramEventHandlersContextValue;
13
- export declare function useDiagramEventHandlersRef(): RefObject<LikeC4DiagramEventHandlers>;
14
+ export declare function useDiagramEventHandlersRef(): RefObject<LikeC4DiagramEventHandlers<Any>>;
14
15
  export {};
@@ -1,6 +1,6 @@
1
- import { ExclusiveUnion } from '@likec4/core';
1
+ import { ExclusiveUnion } from '@likec4/core/types';
2
2
  import { PropsWithChildren } from 'react';
3
- declare const FeatureNames: readonly ["Controls", "ReadOnly", "FocusMode", "NavigateTo", "ElementDetails", "RelationshipDetails", "RelationshipBrowser", "Search", "NavigationButtons", "Notations", "DynamicViewWalkthrough", "EdgeEditing", "ViewTitle", "FitView", "LikeC4Model", "Vscode"];
3
+ declare const FeatureNames: readonly ["Controls", "ReadOnly", "FocusMode", "NavigateTo", "ElementDetails", "RelationshipDetails", "RelationshipBrowser", "Search", "NavigationButtons", "Notations", "DynamicViewWalkthrough", "EdgeEditing", "ViewTitle", "FitView", "Vscode", "ElementTags"];
4
4
  export type FeatureName = typeof FeatureNames[number];
5
5
  export type EnabledFeatures = {
6
6
  [P in `enable${FeatureName}`]: boolean;
@@ -18,14 +18,11 @@ const FeatureNames = [
18
18
  "EdgeEditing",
19
19
  "ViewTitle",
20
20
  "FitView",
21
- /**
22
- * LikeC4Model is available in context
23
- */
24
- "LikeC4Model",
25
21
  /**
26
22
  * Running in VSCode
27
23
  */
28
- "Vscode"
24
+ "Vscode",
25
+ "ElementTags"
29
26
  ];
30
27
  const AllDisabled = mapToObj(
31
28
  FeatureNames,
@@ -35,30 +32,14 @@ const DiagramFeaturesContext = createContext(AllDisabled);
35
32
  const validate = (features) => {
36
33
  let {
37
34
  enableReadOnly,
38
- enableLikeC4Model,
39
- enableElementDetails,
40
- enableRelationshipDetails,
41
- enableRelationshipBrowser,
42
- enableSearch,
43
35
  enableEdgeEditing,
44
36
  ...rest
45
37
  } = features;
46
- if (!enableLikeC4Model) {
47
- enableElementDetails = false;
48
- enableRelationshipDetails = false;
49
- enableRelationshipBrowser = false;
50
- enableSearch = false;
51
- }
52
38
  if (enableReadOnly) {
53
39
  enableEdgeEditing = false;
54
40
  }
55
41
  return {
56
42
  enableReadOnly,
57
- enableLikeC4Model,
58
- enableElementDetails,
59
- enableRelationshipDetails,
60
- enableRelationshipBrowser,
61
- enableSearch,
62
43
  enableEdgeEditing,
63
44
  ...rest
64
45
  };
@@ -109,14 +90,5 @@ function IfEnabled({
109
90
  const enabled = useEnabledFeatures()[`enable${feature}`] === true;
110
91
  return enabled && and ? /* @__PURE__ */ jsx(Fragment, { children }) : null;
111
92
  }
112
- function IfNotReadOnly({
113
- children
114
- }) {
115
- const isReadOnly = useEnabledFeatures()[`enableReadOnly`] === true;
116
- if (isReadOnly) {
117
- return null;
118
- }
119
- return /* @__PURE__ */ jsx(Fragment, { children });
120
- }
121
93
 
122
- export { AllDisabled, DiagramFeatures, IfEnabled, IfNotReadOnly, useEnabledFeatures };
94
+ export { AllDisabled, DiagramFeatures, IfEnabled, useEnabledFeatures };
@@ -10,7 +10,7 @@ function EnsureMantine({ children }) {
10
10
  }
11
11
  }, []);
12
12
  if (!mantineCtx) {
13
- return /* @__PURE__ */ jsx(MantineProvider, { children });
13
+ return /* @__PURE__ */ jsx(MantineProvider, { defaultColorScheme: "auto", children });
14
14
  }
15
15
  return /* @__PURE__ */ jsx(Fragment, { children });
16
16
  }
@@ -56,10 +56,7 @@ function IconOrShapeRenderer({
56
56
  element,
57
57
  className
58
58
  }) {
59
- const icon = IconRenderer({
60
- element,
61
- className
62
- });
59
+ const icon = /* @__PURE__ */ jsx(IconRenderer, { element, className });
63
60
  if (icon) {
64
61
  return icon;
65
62
  }
@@ -1,8 +1,10 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { cx } from '@likec4/styles/css';
3
3
  import { Box } from '@likec4/styles/jsx';
4
+ import { useId } from '@mantine/hooks';
4
5
  import { useRef, useEffect, createContext, useContext, createRef } from 'react';
5
6
  import { usePanningAtom } from './ReduceGraphics.js';
7
+ import { TagStylesProvider } from './TagStylesContext.js';
6
8
 
7
9
  const RootContainerContext = createContext(createRef());
8
10
  function RootContainer({
@@ -10,6 +12,7 @@ function RootContainer({
10
12
  reduceGraphics = false,
11
13
  children
12
14
  }) {
15
+ const id = useId();
13
16
  const ref = useRef(null);
14
17
  const $isPanning = usePanningAtom();
15
18
  useEffect(() => {
@@ -24,12 +27,13 @@ function RootContainer({
24
27
  return /* @__PURE__ */ jsx(
25
28
  Box,
26
29
  {
30
+ id,
27
31
  className: cx("likec4-root", className),
28
32
  ref,
29
33
  ...reduceGraphics && {
30
34
  ["data-likec4-reduced-graphics"]: true
31
35
  },
32
- children: /* @__PURE__ */ jsx(RootContainerContext.Provider, { value: ref, children })
36
+ children: /* @__PURE__ */ jsx(TagStylesProvider, { rootSelector: `#${id}`, children: /* @__PURE__ */ jsx(RootContainerContext.Provider, { value: ref, children }) })
33
37
  }
34
38
  );
35
39
  }
@@ -0,0 +1,7 @@
1
+ import { TagSpecification } from '@likec4/core';
2
+ import { PropsWithChildren } from 'react';
3
+ export declare function TagStylesProvider({ children, rootSelector }: PropsWithChildren<{
4
+ rootSelector: string;
5
+ }>): import("react/jsx-runtime").JSX.Element;
6
+ export declare function useTagSpecifications(): Record<string, TagSpecification>;
7
+ export declare function useTagSpecification(tag: string): TagSpecification;
@@ -0,0 +1,85 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { isTagColorSpecified } from '@likec4/core';
3
+ import { useMantineStyleNonce } from '@mantine/core';
4
+ import { useDeepCompareMemo } from '@react-hookz/web';
5
+ import { createContext, useContext } from 'react';
6
+ import { pipe, entries, flatMap, join } from 'remeda';
7
+ import { useLikeC4Specification } from '../likec4model/useLikeC4Model.js';
8
+
9
+ const TagStylesContext = createContext({});
10
+ const radixColors = [
11
+ "yellow",
12
+ "orange",
13
+ "amber",
14
+ "tomato",
15
+ "red",
16
+ "ruby",
17
+ "crimson",
18
+ "pink",
19
+ "pink",
20
+ "purple",
21
+ "violet",
22
+ "indigo",
23
+ "blue",
24
+ "teal",
25
+ "grass",
26
+ "lime"
27
+ ];
28
+ const generateColorVars = (spec) => {
29
+ const color = spec.color;
30
+ if (isTagColorSpecified(spec)) {
31
+ return `
32
+ --colors-likec4-tag-bg: ${color};
33
+ --colors-likec4-tag-bg-hover: color-mix(in srgb, ${color}, var(--colors-likec4-mix-color) 20%);
34
+ `;
35
+ }
36
+ if (!radixColors.includes(color)) {
37
+ return "";
38
+ }
39
+ let textcolor = "12";
40
+ if (["mint", "grass", "lime", "yellow", "amber"].includes(color)) {
41
+ textcolor = "dark-2";
42
+ }
43
+ return `
44
+ --colors-likec4-tag-border: var(--colors-${color}-8);
45
+ --colors-likec4-tag-bg: var(--colors-${color}-9);
46
+ --colors-likec4-tag-bg-hover: var(--colors-${color}-10);
47
+ --colors-likec4-tag-text: var(--colors-${color}-${textcolor});
48
+ `;
49
+ };
50
+ function TagStylesProvider({ children, rootSelector }) {
51
+ const tags = useLikeC4Specification().tags;
52
+ const { specs, stylesheet } = useDeepCompareMemo(() => {
53
+ if (!tags) {
54
+ return { specs: {}, stylesheet: "" };
55
+ }
56
+ return {
57
+ specs: tags,
58
+ stylesheet: pipe(
59
+ entries(tags),
60
+ flatMap(([tag, spec]) => [
61
+ `:is(${rootSelector} [data-likec4-tag="${tag}"]) {`,
62
+ generateColorVars(spec),
63
+ "}"
64
+ ]),
65
+ join("\n")
66
+ )
67
+ };
68
+ }, [tags, rootSelector]);
69
+ return /* @__PURE__ */ jsxs(TagStylesContext.Provider, { value: specs, children: [
70
+ stylesheet !== "" && /* @__PURE__ */ jsx(TagStylesheet, { stylesheet }),
71
+ children
72
+ ] });
73
+ }
74
+ function TagStylesheet({ stylesheet }) {
75
+ const nonce = useMantineStyleNonce()?.();
76
+ return /* @__PURE__ */ jsx("style", { "data-likec4-tag-stylesheet": true, type: "text/css", dangerouslySetInnerHTML: { __html: stylesheet }, nonce });
77
+ }
78
+ function useTagSpecification(tag) {
79
+ const specs = useContext(TagStylesContext);
80
+ return specs[tag] ?? {
81
+ color: "tomato"
82
+ };
83
+ }
84
+
85
+ export { TagStylesProvider, useTagSpecification };
@@ -1,4 +1,4 @@
1
- export { CompoundActionButton, CompoundDetailsButton, CompoundNodeContainer, CompoundTitle, DefaultHandles, ElementActionButtons, ElementDetailsButton, ElementNodeContainer, ElementShape, ElementTitle, } from '../base/primitives';
1
+ export { CompoundActionButton, CompoundDetailsButton, CompoundNodeContainer, CompoundTitle, DefaultHandles, ElementActionButtons, ElementDetailsButton, ElementNodeContainer, ElementShape, ElementTag, ElementTags, ElementTitle, } from '../base/primitives';
2
2
  export { IconOrShapeRenderer, IconRenderer, IconRendererProvider, } from '../context/IconRenderer';
3
3
  export { CompoundActions, CompoundDeploymentNode, CompoundDeploymentToolbar, CompoundDetailsButtonWithHandler, CompoundElementNode, CompoundElementToolbar, DeploymentElementActions, DeploymentElementToolbar, DeploymentNode, ElementActions, ElementDetailsButtonWithHandler, ElementNode, ElementToolbar, Toolbar, ViewGroupNode, } from '../likec4diagram/custom/nodes';
4
4
  export { IfEnabled, IfNotEnabled, IfNotReadOnly, } from '../context/DiagramFeatures';
@@ -1,11 +1,11 @@
1
- import { AnyAux, NodeModel } from '@likec4/core/model';
2
- import { DiagramView } from '@likec4/core/types';
1
+ import { NodeModel } from '@likec4/core/model';
2
+ import { Any } from '@likec4/core/types';
3
3
  import { ReactNode } from 'react';
4
4
  import { NodeProps } from '../base/types';
5
5
  import { Types } from '../likec4diagram/types';
6
- export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
6
+ export type CustomElementNodeProps<M extends Any = Any> = {
7
7
  nodeProps: NodeProps<Types.ElementNodeData, 'element'>;
8
- nodeModel: NodeModel.WithElement<M, DiagramView>;
8
+ nodeModel: NodeModel.WithElement<M>;
9
9
  };
10
10
  /**
11
11
  * Node that will be used to render the element from the model.
@@ -15,6 +15,8 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
15
15
  * - `nodeProps`: props from XYFlow
16
16
  * - `nodeModel`: LikeC4 {@link NodeModel.WithElement}
17
17
  *
18
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
19
+ *
18
20
  * @example
19
21
  * ```tsx
20
22
  * import {
@@ -24,15 +26,20 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
24
26
  * ElementTitle,
25
27
  * ElementActions,
26
28
  * ElementDetailsButtonWithHandler,
29
+ * IfEnabled,
27
30
  * IfNotReadOnly,
28
31
  * ElementToolbar,
29
32
  * DefaultHandles,
33
+ * ElementTags
30
34
  * } from '@likec4/diagram/custom'
31
35
  *
32
36
  * const CustomElementNode = elementNode(({ nodeProps, nodeModel }) => (
33
37
  * <ElementNodeContainer nodeProps={nodeProps}>
34
38
  * <ElementShape {...nodeProps} />
35
39
  * <ElementTitle {...nodeProps} />
40
+ * <IfEnabled feature="ElementTags">
41
+ * <ElementTags {...nodeProps} />
42
+ * </IfEnabled>
36
43
  * <ElementActions
37
44
  * {...nodeProps}
38
45
  * extraButtons={[
@@ -53,10 +60,10 @@ export type CustomElementNodeProps<M extends AnyAux = AnyAux> = {
53
60
  * ))
54
61
  * ```
55
62
  */
56
- export declare const elementNode: (Node: (props: CustomElementNodeProps<AnyAux>) => ReactNode) => (props: NodeProps<Types.ElementNodeData, "element">) => ReactNode;
57
- export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
63
+ export declare const elementNode: (Node: (props: CustomElementNodeProps<Any>) => ReactNode) => (props: NodeProps<Types.ElementNodeData, "element">) => ReactNode;
64
+ export type CustomDeploymentNodeProps<M extends Any = Any> = {
58
65
  nodeProps: NodeProps<Types.DeploymentElementNodeData, 'deployment'>;
59
- nodeModel: NodeModel.WithDeploymentElement<M, DiagramView>;
66
+ nodeModel: NodeModel.WithDeploymentElement<M>;
60
67
  };
61
68
  /**
62
69
  * Node that will be used to render the element from deployment model.
@@ -67,6 +74,8 @@ export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
67
74
  * - `nodeProps`: props from XYFlow
68
75
  * - `nodeModel`: {@link NodeModel.WithDeploymentElement}
69
76
  *
77
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
78
+ *
70
79
  * @example
71
80
  * ```tsx
72
81
  * import {
@@ -104,10 +113,10 @@ export type CustomDeploymentNodeProps<M extends AnyAux = AnyAux> = {
104
113
  * ))
105
114
  * ```
106
115
  */
107
- export declare const deploymentNode: (Node: (props: CustomDeploymentNodeProps<AnyAux>) => ReactNode) => (props: NodeProps<Types.DeploymentElementNodeData, "deployment">) => ReactNode;
108
- export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
116
+ export declare const deploymentNode: (Node: (props: CustomDeploymentNodeProps<Any>) => ReactNode) => (props: NodeProps<Types.DeploymentElementNodeData, "deployment">) => ReactNode;
117
+ export type CustomCompoundElementNodeProps<M extends Any = Any> = {
109
118
  nodeProps: NodeProps<Types.CompoundElementNodeData, 'compound-element'>;
110
- nodeModel: NodeModel.WithElement<M, DiagramView>;
119
+ nodeModel: NodeModel.WithElement<M>;
111
120
  };
112
121
  /**
113
122
  * Node that will be used to render the compound element from the model.
@@ -117,6 +126,8 @@ export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
117
126
  * - `nodeProps`: props from XYFlow
118
127
  * - `nodeModel`: LikeC4 {@link NodeModel.WithElement}
119
128
  *
129
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
130
+ *
120
131
  * @example
121
132
  * ```tsx
122
133
  * import {
@@ -145,10 +156,10 @@ export type CustomCompoundElementNodeProps<M extends AnyAux = AnyAux> = {
145
156
  * ))
146
157
  * ```
147
158
  */
148
- export declare const compoundElementNode: (Node: (props: CustomCompoundElementNodeProps<AnyAux>) => ReactNode) => (props: NodeProps<Types.CompoundElementNodeData, "compound-element">) => ReactNode;
149
- export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
159
+ export declare const compoundElementNode: (Node: (props: CustomCompoundElementNodeProps<Any>) => ReactNode) => (props: NodeProps<Types.CompoundElementNodeData, "compound-element">) => ReactNode;
160
+ export type CustomCompoundDeploymentNodeProps<M extends Any = Any> = {
150
161
  nodeProps: NodeProps<Types.CompoundDeploymentNodeData, 'compound-deployment'>;
151
- nodeModel: NodeModel.WithDeploymentElement<M, DiagramView>;
162
+ nodeModel: NodeModel.WithDeploymentElement<M>;
152
163
  };
153
164
  /**
154
165
  * Node that will be used to render the compound from the deployment model.
@@ -158,6 +169,8 @@ export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
158
169
  * - `nodeProps`: props from XYFlow
159
170
  * - `nodeModel`: LikeC4 {@link NodeModel.WithDeploymentElement}
160
171
  *
172
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
173
+ *
161
174
  * @example
162
175
  * ```tsx
163
176
  * import {
@@ -180,10 +193,10 @@ export type CustomCompoundDeploymentNodeProps<M extends AnyAux = AnyAux> = {
180
193
  * </CompoundNodeContainer>
181
194
  * ```
182
195
  */
183
- export declare const compoundDeploymentNode: (Node: (props: CustomCompoundDeploymentNodeProps<AnyAux>) => ReactNode) => (props: NodeProps<Types.CompoundDeploymentNodeData, "compound-deployment">) => ReactNode;
184
- export type CustomViewGroupNodeProps<M extends AnyAux = AnyAux> = {
196
+ export declare const compoundDeploymentNode: (Node: (props: CustomCompoundDeploymentNodeProps<Any>) => ReactNode) => (props: NodeProps<Types.CompoundDeploymentNodeData, "compound-deployment">) => ReactNode;
197
+ export type CustomViewGroupNodeProps<M extends Any = Any> = {
185
198
  nodeProps: NodeProps<Types.ViewGroupNodeData, 'view-group'>;
186
- nodeModel: NodeModel.IsGroup<M, DiagramView>;
199
+ nodeModel: NodeModel.IsGroup<M>;
187
200
  };
188
201
  /**
189
202
  * Node that will be used to render the view group from the model.
@@ -192,6 +205,8 @@ export type CustomViewGroupNodeProps<M extends AnyAux = AnyAux> = {
192
205
  * - `nodeProps`: props from XYFlow
193
206
  * - `nodeModel`: LikeC4 {@link NodeModel.IsGroup}
194
207
  *
208
+ * @see [Default implementation](https://github.com/likec4/likec4/blob/main/packages/diagram/src/likec4diagram/custom/nodes/nodes.tsx)
209
+ *
195
210
  * @example
196
211
  * ```tsx
197
212
  * import {
@@ -208,7 +223,7 @@ export type CustomViewGroupNodeProps<M extends AnyAux = AnyAux> = {
208
223
  * </CompoundNodeContainer>
209
224
  * ```
210
225
  */
211
- export declare const viewGroupNode: (Node: (props: CustomViewGroupNodeProps<AnyAux>) => ReactNode) => (props: NodeProps<Types.ViewGroupNodeData, "view-group">) => ReactNode;
226
+ export declare const viewGroupNode: (Node: (props: CustomViewGroupNodeProps<Any>) => ReactNode) => (props: NodeProps<Types.ViewGroupNodeData, "view-group">) => ReactNode;
212
227
  export interface CustomNodes {
213
228
  element?: undefined | ((props: NodeProps<Types.ElementNodeData, 'element'>) => ReactNode);
214
229
  deployment?: undefined | ((props: NodeProps<Types.DeploymentElementNodeData, 'deployment'>) => ReactNode);
@@ -4,7 +4,7 @@ export { type EnabledFeatures, useEnabledFeatures, } from '../context/DiagramFea
4
4
  export { useCurrentViewId, } from '../hooks/useCurrentViewId';
5
5
  export { useDiagram, useDiagramContext, } from '../hooks/useDiagram';
6
6
  export { useXYFlow, useXYInternalNode, useXYStore, useXYStoreApi, } from '../hooks/useXYFlow';
7
- export { useLikeC4Model, } from '../likec4model/useLikeC4Model';
7
+ export { useLikeC4Model, useLikeC4Specification, useLikeC4ViewModel, } from '../likec4model/useLikeC4Model';
8
8
  export { useMantinePortalProps } from '../hooks/useMantinePortalProps';
9
9
  export { useSetState } from '../hooks/useSetState';
10
10
  export { useUpdateEffect } from '../hooks/useUpdateEffect';
@@ -1,5 +1,5 @@
1
1
  export { useMantinePortalProps } from './useMantinePortalProps';
2
2
  export { useSetState } from './useSetState';
3
3
  export { useUpdateEffect } from './useUpdateEffect';
4
- export { useXYFlow, useXYInternalNode, useXYStore, useXYStoreApi } from './useXYFlow';
4
+ export { useCurrentZoom, useIsZoomTooSmall, useXYFlow, useXYInternalNode, useXYStore, useXYStoreApi } from './useXYFlow';
5
5
  export type { XYStoreApi } from './useXYFlow';
@@ -1,67 +1,102 @@
1
- import { DiagramEdge, DiagramNode, DiagramView, EdgeId, ElementNotation, Fqn, NodeId, ViewId } from '@likec4/core';
1
+ import { aux, DiagramEdge, DiagramNode, DiagramView, NodeId, NodeNotation as ElementNotation, scalar } from '@likec4/core/types';
2
+ import { DependencyList } from 'react';
2
3
  import { PartialDeep } from 'type-fest';
3
4
  import { FeatureName } from '../context/DiagramFeatures';
4
5
  import { OpenSourceParams } from '../LikeC4Diagram.props';
5
6
  import { Types } from '../likec4diagram/types';
6
7
  import { AlignmentMode } from '../state/aligners';
7
- import { DiagramActorEvent, DiagramActorSnapshot, DiagramContext, SyncLayoutActorSnapshot } from '../state/types';
8
+ import { DiagramActorEvent, DiagramActorRef, DiagramActorSnapshot, DiagramContext, SyncLayoutActorSnapshot } from '../state/types';
8
9
  import { useDiagramActorRef } from './safeContext';
9
- import { DiagramActorRef } from '..';
10
10
  export { useDiagramActorRef };
11
- /**
12
- * Diagram API
13
- * Mostly for internal use
14
- */
15
- export declare function useDiagram(): {
16
- actor: DiagramActorRef;
17
- send: (event: DiagramActorEvent) => void;
18
- navigateTo: (viewId: ViewId, fromNode?: NodeId) => void;
19
- navigate: (direction: "back" | "forward") => void;
20
- fitDiagram: (duration?: number) => void;
21
- openRelationshipsBrowser: (fqn: Fqn) => void;
22
- openSource: (params: OpenSourceParams) => void;
23
- openElementDetails: (fqn: Fqn, fromNode?: NodeId) => void;
24
- openRelationshipDetails: (...params: [edgeId: EdgeId] | [source: Fqn, target: Fqn]) => void;
25
- updateNodeData: (nodeId: NodeId, data: PartialDeep<Types.NodeData>) => void;
26
- updateEdgeData: (edgeId: EdgeId, data: PartialDeep<Types.EdgeData>) => void;
27
- scheduleSaveManualLayout: () => void;
11
+ export interface DiagramApi {
12
+ readonly actor: DiagramActorRef;
13
+ /**
14
+ * @warning Do not use in render phase
15
+ */
16
+ readonly currentView: DiagramView;
17
+ /**
18
+ * Send event to diagram actor
19
+ */
20
+ send(event: DiagramActorEvent): void;
21
+ /**
22
+ * Navigate to view
23
+ */
24
+ navigateTo(viewId: scalar.ViewId, fromNode?: scalar.NodeId): void;
25
+ /**
26
+ * Navigate back or forward in history
27
+ */
28
+ navigate(direction: 'back' | 'forward'): void;
29
+ /**
30
+ * Fit diagram to view
31
+ */
32
+ fitDiagram(duration?: number): void;
33
+ /**
34
+ * Open relationships browser
35
+ */
36
+ openRelationshipsBrowser(fqn: scalar.Fqn): void;
37
+ /**
38
+ * If running in editor, trigger opening source file
39
+ */
40
+ openSource(params: OpenSourceParams<aux.Unknown>): void;
41
+ /**
42
+ * Open element details card
43
+ */
44
+ openElementDetails(fqn: scalar.Fqn, fromNode?: scalar.NodeId): void;
45
+ openRelationshipDetails(...params: [edgeId: scalar.EdgeId] | [source: scalar.Fqn, target: scalar.Fqn]): void;
46
+ updateNodeData(nodeId: scalar.NodeId, data: PartialDeep<Types.NodeData>): void;
47
+ updateEdgeData(edgeId: scalar.EdgeId, data: PartialDeep<Types.EdgeData>): void;
48
+ /**
49
+ * Schedule save manual layout
50
+ */
51
+ scheduleSaveManualLayout(): void;
28
52
  /**
29
53
  * @returns true if there was pending request to save layout
30
54
  */
31
- cancelSaveManualLayout: () => boolean;
32
- align: (mode: AlignmentMode) => void;
33
- resetEdgeControlPoints: () => void;
34
- focusNode: (nodeId: NodeId) => void;
55
+ cancelSaveManualLayout(): boolean;
35
56
  /**
36
- * @warning Do not use in render phase
57
+ * Align nodes
37
58
  */
38
- readonly currentView: DiagramView;
59
+ align(mode: AlignmentMode): void;
60
+ /**
61
+ * Reset edge control points
62
+ */
63
+ resetEdgeControlPoints(): void;
64
+ /**
65
+ * Focus node
66
+ */
67
+ focusNode(nodeId: NodeId): void;
39
68
  /**
40
69
  * @warning Do not use in render phase
41
70
  */
42
- getSnapshot: () => DiagramActorSnapshot;
71
+ getSnapshot(): DiagramActorSnapshot;
43
72
  /**
44
73
  * @warning Do not use in render phase
45
74
  */
46
- getContext: () => DiagramContext;
75
+ getContext(): DiagramContext;
47
76
  /**
48
77
  * @warning Do not use in render phase
49
78
  */
50
- findDiagramNode: (xynodeId: string) => DiagramNode | null;
79
+ findDiagramNode(xynodeId: string): DiagramNode | null;
51
80
  /**
52
81
  * @warning Do not use in render phase
53
82
  */
54
- findDiagramEdge: (xyedgeId: string) => DiagramEdge | null;
55
- startWalkthrough: () => void;
56
- walkthroughStep: (direction?: "next" | "previous") => void;
57
- stopWalkthrough: () => void;
58
- toggleFeature: (feature: FeatureName, forceValue?: boolean) => void;
59
- highlightNotation: (notation: ElementNotation, kind?: string) => void;
60
- unhighlightNotation: () => void;
61
- };
83
+ findDiagramEdge(xyedgeId: string): DiagramEdge | null;
84
+ startWalkthrough(): void;
85
+ walkthroughStep(direction?: 'next' | 'previous'): void;
86
+ stopWalkthrough(): void;
87
+ toggleFeature(feature: FeatureName, forceValue?: boolean): void;
88
+ highlightNotation(notation: ElementNotation, kind?: string): void;
89
+ unhighlightNotation(): void;
90
+ openSearch(searchValue?: string): void;
91
+ }
92
+ /**
93
+ * Diagram API
94
+ * Mostly for internal use
95
+ */
96
+ export declare function useDiagram(): DiagramApi;
62
97
  export declare function useDiagramActorSnapshot<T = unknown>(selector: (state: DiagramActorSnapshot) => T, compare?: (a: NoInfer<T>, b: NoInfer<T>) => boolean): T;
63
98
  export declare function useDiagramSyncLayoutState<T = unknown>(selector: (state: SyncLayoutActorSnapshot) => T, compare?: (a: NoInfer<T>, b: NoInfer<T>) => boolean): T;
64
99
  /**
65
100
  * Read diagram context
66
101
  */
67
- export declare function useDiagramContext<T = unknown>(selector: (context: DiagramContext) => T, compare?: (a: NoInfer<T>, b: NoInfer<T>) => boolean): T;
102
+ export declare function useDiagramContext<T = unknown>(selector: (context: DiagramContext) => T, compare?: (a: NoInfer<T>, b: NoInfer<T>) => boolean, deps?: DependencyList): T;
@@ -1,7 +1,7 @@
1
1
  import { useCallbackRef } from '@mantine/hooks';
2
2
  import { useSelector } from '@xstate/react';
3
3
  import { shallowEqual } from 'fast-equals';
4
- import { useMemo } from 'react';
4
+ import { useMemo, useCallback } from 'react';
5
5
  import { findDiagramEdge, findDiagramNode } from '../state/utils.js';
6
6
  import { useDiagramActorRef } from './safeContext.js';
7
7
 
@@ -112,6 +112,9 @@ function useDiagram() {
112
112
  },
113
113
  unhighlightNotation: () => {
114
114
  actor.send({ type: "notations.unhighlight" });
115
+ },
116
+ openSearch: (searchValue) => {
117
+ actor.send({ type: "open.search", ...searchValue && { search: searchValue } });
115
118
  }
116
119
  }), [actor]);
117
120
  }
@@ -123,9 +126,10 @@ function useDiagramSyncLayoutState(selector, compare = shallowEqual) {
123
126
  const syncLayoutActorRef = useDiagramActorSnapshot((s) => s.context.syncLayoutActorRef);
124
127
  return useSelector(syncLayoutActorRef, useCallbackRef(selector), compare);
125
128
  }
126
- function useDiagramContext(selector, compare = shallowEqual) {
129
+ function useDiagramContext(selector, compare = shallowEqual, deps) {
127
130
  const actorRef = useDiagramActorRef();
128
- return useSelector(actorRef, useCallbackRef((s) => selector(s.context)), compare);
131
+ const select = useCallback((s) => selector(s.context), deps ?? []);
132
+ return useSelector(actorRef, select, compare);
129
133
  }
130
134
 
131
135
  export { useDiagram, useDiagramActorRef, useDiagramActorSnapshot, useDiagramContext, useDiagramSyncLayoutState };
@@ -2,8 +2,8 @@ export declare function useMantinePortalProps(): {
2
2
  portalProps: {
3
3
  target: HTMLDivElement;
4
4
  };
5
- withinPortal: boolean;
5
+ withinPortal: true;
6
6
  } | {
7
- withinPortal: boolean;
7
+ withinPortal: false;
8
8
  portalProps?: never;
9
9
  };
@@ -0,0 +1,2 @@
1
+ import { SearchActorRef } from '../search/searchActor';
2
+ export declare function useSearchActorRef(): SearchActorRef | null;
@@ -0,0 +1,10 @@
1
+ import { useDiagramActorSnapshot } from './useDiagram.js';
2
+
3
+ const select = (s) => {
4
+ return s.children.search ?? null;
5
+ };
6
+ function useSearchActorRef() {
7
+ return useDiagramActorSnapshot(select, Object.is);
8
+ }
9
+
10
+ export { useSearchActorRef };