@likec4/diagram 1.27.1 → 1.27.3

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 (123) hide show
  1. package/bundle/index.js +2152 -6757
  2. package/dist/LikeC4Diagram.js +1 -1
  3. package/dist/LikeC4Diagram.props.d.ts +5 -3
  4. package/dist/StaticLikeC4Diagram.js +1 -1
  5. package/dist/_virtual/set.js +5 -0
  6. package/dist/_virtual/set2.js +3 -0
  7. package/dist/base/BaseXYFlow.d.ts +2 -1
  8. package/dist/base/primitives/compound/CompoundNodeContainer.d.ts +1 -1
  9. package/dist/base/primitives/compound/CompoundNodeContainer.js +0 -1
  10. package/dist/base/primitives/edge/EdgeLabelContainer.js +3 -2
  11. package/dist/base/primitives/element/ElementActionButtons.js +8 -11
  12. package/dist/base/primitives/element/ElementNodeContainer.css.js +4 -4
  13. package/dist/base/updateEdges.js +1 -9
  14. package/dist/base/updateNodes.js +1 -12
  15. package/dist/bundle/LikeC4View.js +2 -2
  16. package/dist/bundle/LikeC4View.props.d.ts +7 -7
  17. package/dist/hooks/useCurrentViewId.js +8 -2
  18. package/dist/hooks/useDiagram.d.ts +1522 -685
  19. package/dist/hooks/useDiagram.js +21 -24
  20. package/dist/likec4diagram/DiagramXYFlow.js +6 -6
  21. package/dist/likec4diagram/ui/notation/NotationPanel.css.js +3 -3
  22. package/dist/likec4diagram/ui/notation/NotationPanel.js +10 -4
  23. package/dist/node_modules/.pnpm/mnemonist@0.40.3_patch_hash_5c12abb43fcff6fd81e53021b89075d53249640d165a2556cc1e58d71201a13a/node_modules/mnemonist/set.js +369 -0
  24. package/dist/overlays/Overlays.js +3 -1
  25. package/dist/overlays/element-details/actor.d.ts +2769 -173
  26. package/dist/overlays/overlay/Overlay.css.d.ts +26 -2
  27. package/dist/overlays/overlay/Overlay.css.js +66 -18
  28. package/dist/overlays/overlay/Overlay.d.ts +7 -6
  29. package/dist/overlays/overlay/Overlay.js +12 -10
  30. package/dist/overlays/overlaysActor.js +2 -2
  31. package/dist/overlays/relationship-details/RelationshipDetails.js +113 -70
  32. package/dist/overlays/relationship-details/SelectEdge.d.ts +1 -1
  33. package/dist/overlays/relationship-details/SelectEdge.js +15 -9
  34. package/dist/overlays/relationship-details/_types.d.ts +4 -1
  35. package/dist/overlays/relationship-details/actor.d.ts +425 -128
  36. package/dist/overlays/relationship-details/actor.js +157 -53
  37. package/dist/overlays/relationship-details/compute.d.ts +12 -0
  38. package/dist/overlays/relationship-details/compute.js +139 -0
  39. package/dist/overlays/relationship-details/custom/ElementActions.js +27 -5
  40. package/dist/overlays/relationship-details/custom/edgeTypes.js +1 -1
  41. package/dist/overlays/relationship-details/custom/nodeTypes.d.ts +2 -1
  42. package/dist/overlays/relationship-details/hooks.d.ts +336 -6
  43. package/dist/overlays/relationship-details/hooks.js +11 -12
  44. package/dist/overlays/relationship-details/layout-to-xyflow.d.ts +12 -0
  45. package/dist/overlays/relationship-details/layout-to-xyflow.js +145 -0
  46. package/dist/overlays/relationship-details/layout.d.ts +22 -0
  47. package/dist/overlays/relationship-details/layout.js +314 -0
  48. package/dist/overlays/relationships-browser/RelationshipsBrowser.d.ts +3 -1
  49. package/dist/overlays/relationships-browser/RelationshipsBrowser.js +2 -2
  50. package/dist/overlays/relationships-browser/_types.d.ts +2 -0
  51. package/dist/overlays/relationships-browser/actor.d.ts +130 -14
  52. package/dist/overlays/relationships-browser/actor.js +30 -16
  53. package/dist/overlays/relationships-browser/custom/ElementActions.js +5 -3
  54. package/dist/overlays/relationships-browser/custom/edgeTypes.d.ts +3 -1
  55. package/dist/overlays/relationships-browser/custom/edgeTypes.js +1 -1
  56. package/dist/overlays/relationships-browser/hooks.d.ts +3 -1
  57. package/dist/overlays/relationships-browser/hooks.js +6 -9
  58. package/dist/overlays/relationships-browser/{-useRelationshipsView.d.ts → layout.d.ts} +3 -1
  59. package/dist/overlays/relationships-browser/{-useRelationshipsView.js → layout.js} +21 -8
  60. package/dist/overlays/relationships-browser/useViewToNodesEdges.d.ts +1 -1
  61. package/dist/overlays/relationships-browser/useViewToNodesEdges.js +3 -1
  62. package/dist/packages/core/src/compute-view/relationships-view/compute.js +1 -1
  63. package/dist/packages/core/src/model/connection/model/ConnectionModel.js +121 -0
  64. package/dist/packages/core/src/model/connection/model/find.js +39 -0
  65. package/dist/packages/core/src/model/connection/ops.js +7 -0
  66. package/dist/packages/core/src/utils/const.js +3 -0
  67. package/dist/packages/core/src/utils/fqn.js +9 -1
  68. package/dist/packages/core/src/utils/iterable/find.js +21 -0
  69. package/dist/packages/core/src/utils/iterable/some.js +21 -0
  70. package/dist/packages/core/src/utils/set.js +48 -0
  71. package/dist/packages/core/src/utils/string-hash.js +13 -0
  72. package/dist/state/diagram-machine.d.ts +1552 -703
  73. package/dist/state/diagram-machine.js +39 -3
  74. package/dist/state/syncManualLayoutActor.d.ts +1 -1
  75. package/dist/styles.css.js +1 -1
  76. package/dist/utils/index.d.ts +0 -1
  77. package/package.json +11 -11
  78. package/src/LikeC4Diagram.props.ts +7 -3
  79. package/src/LikeC4Diagram.tsx +1 -1
  80. package/src/StaticLikeC4Diagram.tsx +1 -1
  81. package/src/base/BaseXYFlow.tsx +2 -1
  82. package/src/base/primitives/compound/CompoundNodeContainer.tsx +0 -2
  83. package/src/base/primitives/edge/EdgeLabelContainer.tsx +7 -5
  84. package/src/base/primitives/element/ElementActionButtons.tsx +10 -11
  85. package/src/base/primitives/element/ElementNodeContainer.css.ts +4 -4
  86. package/src/base/updateEdges.ts +8 -8
  87. package/src/base/updateNodes.ts +11 -11
  88. package/src/bundle/LikeC4View.props.ts +7 -7
  89. package/src/bundle/LikeC4View.tsx +2 -2
  90. package/src/hooks/useCurrentViewId.ts +4 -2
  91. package/src/hooks/useDiagram.ts +22 -24
  92. package/src/likec4diagram/DiagramXYFlow.tsx +6 -6
  93. package/src/likec4diagram/ui/notation/NotationPanel.css.ts +2 -2
  94. package/src/likec4diagram/ui/notation/NotationPanel.tsx +8 -6
  95. package/src/overlays/Overlays.tsx +4 -2
  96. package/src/overlays/overlay/Overlay.css.ts +67 -17
  97. package/src/overlays/overlay/Overlay.tsx +27 -24
  98. package/src/overlays/overlaysActor.ts +1 -1
  99. package/src/overlays/relationship-details/RelationshipDetails.tsx +131 -68
  100. package/src/overlays/relationship-details/SelectEdge.tsx +19 -12
  101. package/src/overlays/relationship-details/_types.ts +3 -1
  102. package/src/overlays/relationship-details/actor.ts +212 -68
  103. package/src/overlays/relationship-details/compute.ts +186 -0
  104. package/src/overlays/relationship-details/custom/ElementActions.tsx +27 -18
  105. package/src/overlays/relationship-details/custom/edgeTypes.tsx +1 -1
  106. package/src/overlays/relationship-details/hooks.ts +12 -13
  107. package/src/overlays/relationship-details/layout-to-xyflow.ts +172 -0
  108. package/src/overlays/relationship-details/layout.ts +470 -0
  109. package/src/overlays/relationships-browser/RelationshipsBrowser.tsx +2 -2
  110. package/src/overlays/relationships-browser/_types.ts +2 -0
  111. package/src/overlays/relationships-browser/actor.ts +39 -14
  112. package/src/overlays/relationships-browser/custom/ElementActions.tsx +5 -3
  113. package/src/overlays/relationships-browser/custom/edgeTypes.tsx +1 -1
  114. package/src/overlays/relationships-browser/hooks.ts +7 -10
  115. package/src/overlays/relationships-browser/{-useRelationshipsView.ts → layout.ts} +26 -33
  116. package/src/overlays/relationships-browser/useViewToNodesEdges.ts +3 -1
  117. package/src/state/diagram-machine.ts +51 -6
  118. package/src/utils/index.ts +0 -1
  119. package/dist/overlays/relationship-details/useLayoutedDetails.d.ts +0 -19
  120. package/dist/overlays/relationship-details/useLayoutedDetails.js +0 -267
  121. package/dist/utils/types.d.ts +0 -8
  122. package/src/overlays/relationship-details/useLayoutedDetails.ts +0 -376
  123. package/src/utils/types.ts +0 -6
@@ -1,14 +1,23 @@
1
- import { EdgeId, RelationId, Color, ViewId, RelationshipLineType } from '@likec4/core';
2
- import { RelationshipDetailsActorRef, RelationshipDetailsSnapshot, Input, Events } from './actor';
1
+ import { EdgeId, Fqn, ViewId, RelationId, Color, RelationshipLineType, BBox } from '@likec4/core';
2
+ import { RelationshipDetailsActorRef, RelationshipDetailsSnapshot, Events } from './actor';
3
3
  import { Context, ReactNode, CSSProperties } from 'react';
4
- import { GeneralHelpers, ViewportHelperFunctions } from '@xyflow/react';
4
+ import { GeneralHelpers, ViewportHelperFunctions, ReactFlowState } from '@xyflow/react';
5
5
  import { EdgeMarkerType, HandleType } from '@xyflow/system';
6
6
  export declare const RelationshipDetailsActorContext: Context<RelationshipDetailsActorRef | null>;
7
7
  export declare function useRelationshipDetailsActor(): RelationshipDetailsActorRef;
8
8
  export declare function useRelationshipDetailsState<T = unknown>(selector: (state: RelationshipDetailsSnapshot) => T, compare?: (a: NoInfer<T>, b: NoInfer<T>) => boolean): T;
9
9
  export declare function useRelationshipDetails(): {
10
10
  actor: RelationshipDetailsActorRef;
11
- getState: () => Readonly< Input & {
11
+ readonly rootElementId: string;
12
+ getState: () => Readonly<{
13
+ subject: {
14
+ edgeId: EdgeId;
15
+ } | {
16
+ source: Fqn;
17
+ target: Fqn;
18
+ edgeId?: never;
19
+ };
20
+ viewId: ViewId;
12
21
  xyflow: ( GeneralHelpers<import("./_types").RelationshipDetailsTypes.Node, {
13
22
  id: string;
14
23
  source: string;
@@ -51,12 +60,333 @@ export declare function useRelationshipDetails(): {
51
60
  }> & Omit< ViewportHelperFunctions, "initialized"> & {
52
61
  viewportInitialized: boolean;
53
62
  }) | null;
54
- initialized: boolean;
63
+ xystore: {
64
+ getState: () => ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
65
+ id: string;
66
+ source: string;
67
+ target: string;
68
+ sourceHandle?: string | null;
69
+ targetHandle?: string | null;
70
+ animated?: boolean;
71
+ hidden?: boolean;
72
+ deletable?: boolean;
73
+ selectable?: boolean;
74
+ selected?: boolean;
75
+ markerStart?: EdgeMarkerType;
76
+ markerEnd?: EdgeMarkerType;
77
+ zIndex?: number;
78
+ ariaLabel?: string;
79
+ interactionWidth?: number;
80
+ label?: ReactNode;
81
+ labelStyle?: CSSProperties;
82
+ labelShowBg?: boolean;
83
+ labelBgStyle?: CSSProperties;
84
+ labelBgPadding?: [number, number];
85
+ labelBgBorderRadius?: number;
86
+ style?: CSSProperties;
87
+ className?: string;
88
+ reconnectable?: boolean | HandleType;
89
+ focusable?: boolean;
90
+ type: "relationship";
91
+ data: {
92
+ relationId: RelationId;
93
+ color: Color | undefined;
94
+ label: string | null;
95
+ technology?: string | undefined | undefined;
96
+ description?: string | undefined | undefined;
97
+ navigateTo: ViewId | null;
98
+ line: RelationshipLineType;
99
+ hovered?: boolean;
100
+ active?: boolean;
101
+ dimmed?: import("../../base").Base.Dimmed;
102
+ };
103
+ }>;
104
+ setState: (partial: ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
105
+ id: string;
106
+ source: string;
107
+ target: string;
108
+ sourceHandle?: string | null;
109
+ targetHandle?: string | null;
110
+ animated?: boolean;
111
+ hidden?: boolean;
112
+ deletable?: boolean;
113
+ selectable?: boolean;
114
+ selected?: boolean;
115
+ markerStart?: EdgeMarkerType;
116
+ markerEnd?: EdgeMarkerType;
117
+ zIndex?: number;
118
+ ariaLabel?: string;
119
+ interactionWidth?: number;
120
+ label?: ReactNode;
121
+ labelStyle?: CSSProperties;
122
+ labelShowBg?: boolean;
123
+ labelBgStyle?: CSSProperties;
124
+ labelBgPadding?: [number, number];
125
+ labelBgBorderRadius?: number;
126
+ style?: CSSProperties;
127
+ className?: string;
128
+ reconnectable?: boolean | HandleType;
129
+ focusable?: boolean;
130
+ type: "relationship";
131
+ data: {
132
+ relationId: RelationId;
133
+ color: Color | undefined;
134
+ label: string | null;
135
+ technology?: string | undefined | undefined;
136
+ description?: string | undefined | undefined;
137
+ navigateTo: ViewId | null;
138
+ line: RelationshipLineType;
139
+ hovered?: boolean;
140
+ active?: boolean;
141
+ dimmed?: import("../../base").Base.Dimmed;
142
+ };
143
+ }> | Partial< ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
144
+ id: string;
145
+ source: string;
146
+ target: string;
147
+ sourceHandle?: string | null;
148
+ targetHandle?: string | null;
149
+ animated?: boolean;
150
+ hidden?: boolean;
151
+ deletable?: boolean;
152
+ selectable?: boolean;
153
+ selected?: boolean;
154
+ markerStart?: EdgeMarkerType;
155
+ markerEnd?: EdgeMarkerType;
156
+ zIndex?: number;
157
+ ariaLabel?: string;
158
+ interactionWidth?: number;
159
+ label?: ReactNode;
160
+ labelStyle?: CSSProperties;
161
+ labelShowBg?: boolean;
162
+ labelBgStyle?: CSSProperties;
163
+ labelBgPadding?: [number, number];
164
+ labelBgBorderRadius?: number;
165
+ style?: CSSProperties;
166
+ className?: string;
167
+ reconnectable?: boolean | HandleType;
168
+ focusable?: boolean;
169
+ type: "relationship";
170
+ data: {
171
+ relationId: RelationId;
172
+ color: Color | undefined;
173
+ label: string | null;
174
+ technology?: string | undefined | undefined;
175
+ description?: string | undefined | undefined;
176
+ navigateTo: ViewId | null;
177
+ line: RelationshipLineType;
178
+ hovered?: boolean;
179
+ active?: boolean;
180
+ dimmed?: import("../../base").Base.Dimmed;
181
+ };
182
+ }>> | ((state: ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
183
+ id: string;
184
+ source: string;
185
+ target: string;
186
+ sourceHandle?: string | null;
187
+ targetHandle?: string | null;
188
+ animated?: boolean;
189
+ hidden?: boolean;
190
+ deletable?: boolean;
191
+ selectable?: boolean;
192
+ selected?: boolean;
193
+ markerStart?: EdgeMarkerType;
194
+ markerEnd?: EdgeMarkerType;
195
+ zIndex?: number;
196
+ ariaLabel?: string;
197
+ interactionWidth?: number;
198
+ label?: ReactNode;
199
+ labelStyle?: CSSProperties;
200
+ labelShowBg?: boolean;
201
+ labelBgStyle?: CSSProperties;
202
+ labelBgPadding?: [number, number];
203
+ labelBgBorderRadius?: number;
204
+ style?: CSSProperties;
205
+ className?: string;
206
+ reconnectable?: boolean | HandleType;
207
+ focusable?: boolean;
208
+ type: "relationship";
209
+ data: {
210
+ relationId: RelationId;
211
+ color: Color | undefined;
212
+ label: string | null;
213
+ technology?: string | undefined | undefined;
214
+ description?: string | undefined | undefined;
215
+ navigateTo: ViewId | null;
216
+ line: RelationshipLineType;
217
+ hovered?: boolean;
218
+ active?: boolean;
219
+ dimmed?: import("../../base").Base.Dimmed;
220
+ };
221
+ }>) => ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
222
+ id: string;
223
+ source: string;
224
+ target: string;
225
+ sourceHandle?: string | null;
226
+ targetHandle?: string | null;
227
+ animated?: boolean;
228
+ hidden?: boolean;
229
+ deletable?: boolean;
230
+ selectable?: boolean;
231
+ selected?: boolean;
232
+ markerStart?: EdgeMarkerType;
233
+ markerEnd?: EdgeMarkerType;
234
+ zIndex?: number;
235
+ ariaLabel?: string;
236
+ interactionWidth?: number;
237
+ label?: ReactNode;
238
+ labelStyle?: CSSProperties;
239
+ labelShowBg?: boolean;
240
+ labelBgStyle?: CSSProperties;
241
+ labelBgPadding?: [number, number];
242
+ labelBgBorderRadius?: number;
243
+ style?: CSSProperties;
244
+ className?: string;
245
+ reconnectable?: boolean | HandleType;
246
+ focusable?: boolean;
247
+ type: "relationship";
248
+ data: {
249
+ relationId: RelationId;
250
+ color: Color | undefined;
251
+ label: string | null;
252
+ technology?: string | undefined | undefined;
253
+ description?: string | undefined | undefined;
254
+ navigateTo: ViewId | null;
255
+ line: RelationshipLineType;
256
+ hovered?: boolean;
257
+ active?: boolean;
258
+ dimmed?: import("../../base").Base.Dimmed;
259
+ };
260
+ }> | Partial< ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
261
+ id: string;
262
+ source: string;
263
+ target: string;
264
+ sourceHandle?: string | null;
265
+ targetHandle?: string | null;
266
+ animated?: boolean;
267
+ hidden?: boolean;
268
+ deletable?: boolean;
269
+ selectable?: boolean;
270
+ selected?: boolean;
271
+ markerStart?: EdgeMarkerType;
272
+ markerEnd?: EdgeMarkerType;
273
+ zIndex?: number;
274
+ ariaLabel?: string;
275
+ interactionWidth?: number;
276
+ label?: ReactNode;
277
+ labelStyle?: CSSProperties;
278
+ labelShowBg?: boolean;
279
+ labelBgStyle?: CSSProperties;
280
+ labelBgPadding?: [number, number];
281
+ labelBgBorderRadius?: number;
282
+ style?: CSSProperties;
283
+ className?: string;
284
+ reconnectable?: boolean | HandleType;
285
+ focusable?: boolean;
286
+ type: "relationship";
287
+ data: {
288
+ relationId: RelationId;
289
+ color: Color | undefined;
290
+ label: string | null;
291
+ technology?: string | undefined | undefined;
292
+ description?: string | undefined | undefined;
293
+ navigateTo: ViewId | null;
294
+ line: RelationshipLineType;
295
+ hovered?: boolean;
296
+ active?: boolean;
297
+ dimmed?: import("../../base").Base.Dimmed;
298
+ };
299
+ }>>), replace?: boolean | undefined) => void;
300
+ subscribe: (listener: (state: ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
301
+ id: string;
302
+ source: string;
303
+ target: string;
304
+ sourceHandle?: string | null;
305
+ targetHandle?: string | null;
306
+ animated?: boolean;
307
+ hidden?: boolean;
308
+ deletable?: boolean;
309
+ selectable?: boolean;
310
+ selected?: boolean;
311
+ markerStart?: EdgeMarkerType;
312
+ markerEnd?: EdgeMarkerType;
313
+ zIndex?: number;
314
+ ariaLabel?: string;
315
+ interactionWidth?: number;
316
+ label?: ReactNode;
317
+ labelStyle?: CSSProperties;
318
+ labelShowBg?: boolean;
319
+ labelBgStyle?: CSSProperties;
320
+ labelBgPadding?: [number, number];
321
+ labelBgBorderRadius?: number;
322
+ style?: CSSProperties;
323
+ className?: string;
324
+ reconnectable?: boolean | HandleType;
325
+ focusable?: boolean;
326
+ type: "relationship";
327
+ data: {
328
+ relationId: RelationId;
329
+ color: Color | undefined;
330
+ label: string | null;
331
+ technology?: string | undefined | undefined;
332
+ description?: string | undefined | undefined;
333
+ navigateTo: ViewId | null;
334
+ line: RelationshipLineType;
335
+ hovered?: boolean;
336
+ active?: boolean;
337
+ dimmed?: import("../../base").Base.Dimmed;
338
+ };
339
+ }>, prevState: ReactFlowState<import("./_types").RelationshipDetailsTypes.Node, {
340
+ id: string;
341
+ source: string;
342
+ target: string;
343
+ sourceHandle?: string | null;
344
+ targetHandle?: string | null;
345
+ animated?: boolean;
346
+ hidden?: boolean;
347
+ deletable?: boolean;
348
+ selectable?: boolean;
349
+ selected?: boolean;
350
+ markerStart?: EdgeMarkerType;
351
+ markerEnd?: EdgeMarkerType;
352
+ zIndex?: number;
353
+ ariaLabel?: string;
354
+ interactionWidth?: number;
355
+ label?: ReactNode;
356
+ labelStyle?: CSSProperties;
357
+ labelShowBg?: boolean;
358
+ labelBgStyle?: CSSProperties;
359
+ labelBgPadding?: [number, number];
360
+ labelBgBorderRadius?: number;
361
+ style?: CSSProperties;
362
+ className?: string;
363
+ reconnectable?: boolean | HandleType;
364
+ focusable?: boolean;
365
+ type: "relationship";
366
+ data: {
367
+ relationId: RelationId;
368
+ color: Color | undefined;
369
+ label: string | null;
370
+ technology?: string | undefined | undefined;
371
+ description?: string | undefined | undefined;
372
+ navigateTo: ViewId | null;
373
+ line: RelationshipLineType;
374
+ hovered?: boolean;
375
+ active?: boolean;
376
+ dimmed?: import("../../base").Base.Dimmed;
377
+ };
378
+ }>) => void) => () => void;
379
+ } | null;
380
+ initialized: {
381
+ xydata: boolean;
382
+ xyflow: boolean;
383
+ };
55
384
  xynodes: import("./_types").RelationshipDetailsTypes.Node[];
56
385
  xyedges: import("./_types").RelationshipDetailsTypes.Edge[];
386
+ bounds: BBox;
57
387
  }>;
58
388
  send: (event: Events) => void;
59
- navigateTo: (edgeId: EdgeId) => void;
389
+ navigateTo: (...params: [edgeId: EdgeId] | [source: Fqn, target: Fqn]) => void;
60
390
  fitDiagram: () => void;
61
391
  close: () => void;
62
392
  };
@@ -2,7 +2,7 @@ import { nonNullable } from '@likec4/core';
2
2
  import { useCallbackRef } from '@mantine/hooks';
3
3
  import { useSelector } from '@xstate/react';
4
4
  import { shallowEqual } from 'fast-equals';
5
- import { createContext, useTransition, useMemo, useContext } from 'react';
5
+ import { createContext, useMemo, useContext } from 'react';
6
6
 
7
7
  const RelationshipDetailsActorContext = createContext(null);
8
8
  function useRelationshipDetailsActor() {
@@ -15,23 +15,22 @@ function useRelationshipDetailsState(selector, compare = shallowEqual) {
15
15
  }
16
16
  function useRelationshipDetails() {
17
17
  const actor = useRelationshipDetailsActor();
18
- const [, startTransition] = useTransition();
19
18
  return useMemo(() => ({
20
19
  actor,
20
+ get rootElementId() {
21
+ return `relationship-details-${actor.sessionId.replaceAll(":", "_")}`;
22
+ },
21
23
  getState: () => actor.getSnapshot().context,
22
24
  send: actor.send,
23
- navigateTo: (edgeId) => {
24
- startTransition(() => {
25
- actor.send({
26
- type: "navigate.to",
27
- edgeId
28
- });
29
- });
25
+ navigateTo: (...params) => {
26
+ if (params.length === 1) {
27
+ actor.send({ type: "navigate.to", params: { edgeId: params[0] } });
28
+ } else {
29
+ actor.send({ type: "navigate.to", params: { source: params[0], target: params[1] } });
30
+ }
30
31
  },
31
32
  fitDiagram: () => {
32
- startTransition(() => {
33
- actor.send({ type: "fitDiagram" });
34
- });
33
+ actor.send({ type: "fitDiagram" });
35
34
  },
36
35
  close: () => {
37
36
  if (actor._parent) {
@@ -0,0 +1,12 @@
1
+ import { RelationshipDetailsTypes } from './_types';
2
+ import { LayoutResult } from './layout';
3
+ export declare function layoutResultToXYFlow(layout: LayoutResult): {
4
+ xynodes: RelationshipDetailsTypes.Node[];
5
+ xyedges: RelationshipDetailsTypes.Edge[];
6
+ bounds: {
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ };
12
+ };
@@ -0,0 +1,145 @@
1
+ import { Queue, nonNullable } from '@likec4/core';
2
+ import { hasAtLeast } from 'remeda';
3
+ import { ZIndexes } from '../../base/const.js';
4
+
5
+ function layoutResultToXYFlow(layout) {
6
+ const xynodes = [], xyedges = [], nodeLookup = /* @__PURE__ */ new Map();
7
+ const queue = Queue.from(layout.nodes.reduce(
8
+ (acc, node) => {
9
+ nodeLookup.set(node.id, node);
10
+ if (!node.parent) {
11
+ acc.push({ node, parent: null });
12
+ }
13
+ return acc;
14
+ },
15
+ []
16
+ ));
17
+ const ns = "";
18
+ const nodeById = (id) => nonNullable(nodeLookup.get(id), `Node not found: ${id}`);
19
+ let next;
20
+ while (next = queue.dequeue()) {
21
+ const { node, parent } = next;
22
+ const isCompound = hasAtLeast(node.children, 1);
23
+ if (isCompound) {
24
+ for (const child of node.children) {
25
+ queue.enqueue({ node: nodeById(child), parent: node });
26
+ }
27
+ }
28
+ const position = {
29
+ x: node.position[0],
30
+ y: node.position[1]
31
+ };
32
+ if (parent) {
33
+ position.x -= parent.position[0];
34
+ position.y -= parent.position[1];
35
+ }
36
+ const id = ns + node.id;
37
+ const base = {
38
+ id,
39
+ draggable: false,
40
+ selectable: true,
41
+ focusable: true,
42
+ deletable: false,
43
+ position,
44
+ zIndex: isCompound ? ZIndexes.Compound : ZIndexes.Element,
45
+ style: {
46
+ width: node.width,
47
+ height: node.height
48
+ },
49
+ initialWidth: node.width,
50
+ initialHeight: node.height,
51
+ ...parent && {
52
+ parentId: ns + parent.id
53
+ }
54
+ };
55
+ const fqn = node.modelRef;
56
+ const navigateTo = { navigateTo: node.navigateTo ?? null };
57
+ switch (true) {
58
+ case isCompound: {
59
+ xynodes.push(
60
+ {
61
+ ...base,
62
+ type: "compound",
63
+ data: {
64
+ column: node.column,
65
+ title: node.title,
66
+ color: node.color,
67
+ style: node.style,
68
+ depth: node.depth ?? 0,
69
+ icon: node.icon ?? "none",
70
+ ports: node.ports,
71
+ fqn,
72
+ ...navigateTo
73
+ }
74
+ }
75
+ );
76
+ break;
77
+ }
78
+ default: {
79
+ xynodes.push(
80
+ {
81
+ ...base,
82
+ type: "element",
83
+ data: {
84
+ column: node.column,
85
+ fqn,
86
+ title: node.title,
87
+ technology: node.technology,
88
+ description: node.description,
89
+ height: node.height,
90
+ width: node.width,
91
+ color: node.color,
92
+ shape: node.shape,
93
+ icon: node.icon ?? "none",
94
+ ports: node.ports,
95
+ style: node.style,
96
+ ...navigateTo
97
+ }
98
+ }
99
+ );
100
+ }
101
+ }
102
+ }
103
+ for (const {
104
+ source,
105
+ target,
106
+ relationId,
107
+ label,
108
+ technology,
109
+ description,
110
+ navigateTo = null,
111
+ color = "gray",
112
+ line = "dashed",
113
+ ...edge
114
+ } of layout.edges) {
115
+ const id = ns + edge.id;
116
+ xyedges.push({
117
+ id,
118
+ type: "relationship",
119
+ source: ns + source,
120
+ target: ns + target,
121
+ sourceHandle: edge.sourceHandle,
122
+ targetHandle: edge.targetHandle,
123
+ zIndex: ZIndexes.Edge,
124
+ // selectable: selectable,
125
+ // hidden: !visiblePredicate(edge),
126
+ deletable: false,
127
+ data: {
128
+ relationId,
129
+ label,
130
+ color,
131
+ navigateTo,
132
+ line,
133
+ ...technology && { technology },
134
+ ...description && { description }
135
+ }
136
+ });
137
+ }
138
+ return {
139
+ xynodes,
140
+ xyedges,
141
+ bounds: layout.bounds
142
+ };
143
+ }
144
+
145
+ export { layoutResultToXYFlow };
@@ -0,0 +1,22 @@
1
+ import { DiagramEdge, DiagramNode, DiagramView, Fqn, RelationId } from '@likec4/core/types';
2
+ import { AnyAux, LikeC4ViewModel } from '@likec4/core/model';
3
+ import { RelationshipDetailsTypes } from './_types';
4
+ import { RelationshipDetailsViewData } from './compute';
5
+ export type LayoutResult = {
6
+ nodes: LayoutResult.Node[];
7
+ edges: LayoutResult.Edge[];
8
+ bounds: DiagramView['bounds'];
9
+ };
10
+ export declare namespace LayoutResult {
11
+ type Node = Omit<DiagramNode, 'modelRef' | 'deploymentRef' | 'inEdges' | 'outEdges'> & {
12
+ modelRef: Fqn;
13
+ column: RelationshipDetailsTypes.Column;
14
+ ports: RelationshipDetailsTypes.Ports;
15
+ };
16
+ type Edge = Omit<DiagramEdge, 'relations'> & {
17
+ relationId: RelationId;
18
+ sourceHandle: string;
19
+ targetHandle: string;
20
+ };
21
+ }
22
+ export declare function layoutRelationshipDetails(data: RelationshipDetailsViewData, scope: LikeC4ViewModel<AnyAux> | null): LayoutResult;