@likec4/diagram 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/KeepAspectRatioContainer.d.ts +1 -1
  2. package/dist/LikeC4Diagram.d.ts +1 -1
  3. package/dist/LikeC4Diagram.props.d.ts +22 -12
  4. package/dist/StaticLikeC4Diagram.d.ts +1 -1
  5. package/dist/index.d.ts +0 -1
  6. package/dist/index.mjs +2209 -706
  7. package/dist/mantine/EnsureMantine.d.ts +1 -1
  8. package/dist/state/DiagramContext.d.ts +2143 -19
  9. package/dist/state/WhenInitialized.d.ts +1 -1
  10. package/dist/state/diagramStore.d.ts +2152 -19
  11. package/dist/state/useDiagramStore.d.ts +2142 -18
  12. package/dist/style.css +256 -118
  13. package/dist/theme.css.d.ts +1 -0
  14. package/dist/ui/DiagramTitlePanel.css.d.ts +4 -0
  15. package/dist/ui/DiagramTitlePanel.d.ts +1 -0
  16. package/dist/ui/DynamicViewWalkthrough.css.d.ts +3 -0
  17. package/dist/ui/DynamicViewWalkthrough.d.ts +1 -0
  18. package/dist/ui/OptionsPanel.d.ts +1 -3
  19. package/dist/ui/index.d.ts +1 -0
  20. package/dist/ui/options/NodeOptions.d.ts +1 -2
  21. package/dist/xyflow/FitviewOnDiagramChange.d.ts +4 -2
  22. package/dist/xyflow/SelectEdgesOnNodeFocus.d.ts +1 -0
  23. package/dist/xyflow/SyncWithDiagram.d.ts +1 -2
  24. package/dist/xyflow/XYFlow.d.ts +4 -7
  25. package/dist/xyflow/XYFlowBackground.d.ts +5 -4
  26. package/dist/xyflow/XYFlowEvents.d.ts +84 -84
  27. package/dist/xyflow/XYFlowInner.d.ts +11 -0
  28. package/dist/xyflow/diagram-to-xyflow.d.ts +1 -1
  29. package/dist/xyflow/edges/RelationshipEdge.d.ts +14 -14
  30. package/dist/xyflow/edges/edges.css.d.ts +5 -2
  31. package/dist/xyflow/edges/utils.d.ts +2 -0
  32. package/dist/xyflow/hooks/useXYFlow.d.ts +126 -126
  33. package/dist/xyflow/nodes/compound/CompoundNode.css.d.ts +1 -0
  34. package/dist/xyflow/nodes/element/ElementIcon.d.ts +1 -1
  35. package/dist/xyflow/nodes/element/ElementLink.d.ts +1 -1
  36. package/dist/xyflow/nodes/element/ElementNode.d.ts +1 -1
  37. package/dist/xyflow/nodes/element/ElementShapeSvg.d.ts +2 -2
  38. package/dist/xyflow/nodes/element/element.css.d.ts +2 -1
  39. package/dist/xyflow/nodes/shared/NavigateToBtn.d.ts +1 -2
  40. package/dist/xyflow/types.d.ts +18 -18
  41. package/package.json +21 -16
  42. package/src/KeepAspectRatioContainer.tsx +1 -1
  43. package/src/LikeC4Diagram.css.ts +4 -1
  44. package/src/LikeC4Diagram.props.ts +24 -14
  45. package/src/LikeC4Diagram.tsx +18 -9
  46. package/src/StaticLikeC4Diagram.tsx +2 -0
  47. package/src/globals.css.ts +7 -1
  48. package/src/index.ts +0 -3
  49. package/src/state/DiagramContext.tsx +21 -12
  50. package/src/state/diagramStore.ts +275 -98
  51. package/src/theme.css.ts +1 -0
  52. package/src/ui/DiagramTitlePanel.css.ts +33 -0
  53. package/src/ui/DiagramTitlePanel.tsx +138 -0
  54. package/src/ui/DynamicViewWalkthrough.css.ts +46 -0
  55. package/src/ui/DynamicViewWalkthrough.tsx +86 -0
  56. package/src/ui/OptionsPanel.tsx +7 -24
  57. package/src/ui/index.ts +1 -0
  58. package/src/ui/options/NodeOptions.tsx +103 -27
  59. package/src/xyflow/FitviewOnDiagramChange.tsx +89 -69
  60. package/src/xyflow/SelectEdgesOnNodeFocus.tsx +75 -0
  61. package/src/xyflow/SyncWithDiagram.tsx +55 -101
  62. package/src/xyflow/XYFlow.tsx +52 -32
  63. package/src/xyflow/XYFlowBackground.tsx +7 -5
  64. package/src/xyflow/XYFlowEvents.tsx +150 -104
  65. package/src/xyflow/XYFlowInner.tsx +50 -0
  66. package/src/xyflow/diagram-to-xyflow.ts +16 -21
  67. package/src/xyflow/edges/RelationshipEdge.tsx +102 -70
  68. package/src/xyflow/edges/edges.css.ts +128 -53
  69. package/src/xyflow/edges/utils.ts +31 -0
  70. package/src/xyflow/nodes/compound/CompoundNode.css.ts +20 -12
  71. package/src/xyflow/nodes/compound/CompoundNode.tsx +6 -3
  72. package/src/xyflow/nodes/element/ElementLink.tsx +13 -3
  73. package/src/xyflow/nodes/element/ElementNode.tsx +24 -19
  74. package/src/xyflow/nodes/element/element.css.ts +10 -2
  75. package/src/xyflow/nodes/shared/NavigateToBtn.tsx +1 -0
  76. package/src/xyflow/types.ts +7 -8
@@ -1,3 +1 @@
1
- /// <reference types="react" />
2
- declare const OptionsPanelMemo: import('react').NamedExoticComponent<object>;
3
- export default OptionsPanelMemo;
1
+ export default function OptionsPanel(): import("react/jsx-runtime").JSX.Element;
@@ -1 +1,2 @@
1
+ export * from './DynamicViewWalkthrough';
1
2
  export { default as OptionsPanel } from './OptionsPanel';
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export declare const themedColors: ({
3
2
  key: "primary";
4
3
  value: "#3b82f6";
@@ -17,4 +16,4 @@ export type ThemeColorKey = typeof themedColors[0]['key'];
17
16
  export type ColorKey = typeof colors[0]['key'];
18
17
  export declare function NodeOptions({ selectedNodeIds }: {
19
18
  selectedNodeIds: string[];
20
- }): JSX.Element | null;
19
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -1,2 +1,4 @@
1
- /// <reference types="react" />
2
- export declare const FitViewOnDiagramChange: import('react').MemoExoticComponent<() => JSX.Element | null>;
1
+ /**
2
+ * Fits the view when the view changes and nodes are initialized
3
+ */
4
+ export declare function FitViewOnDiagramChange(): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1 @@
1
+ export declare function SelectEdgesOnNodeFocus(): null;
@@ -1,5 +1,4 @@
1
- /// <reference types="react" />
2
1
  /**
3
2
  * Syncs the diagram state with the XYFlow instance
4
3
  */
5
- export declare const SyncWithDiagram: import('react').MemoExoticComponent<() => null>;
4
+ export declare function SyncWithDiagram(): null;
@@ -1,14 +1,11 @@
1
1
  import { XYFlowEdge, XYFlowNode } from './types';
2
- import { LikeC4DiagramProperties } from '../LikeC4Diagram.props';
3
- import { SetNonNullable, Simplify } from 'type-fest';
4
2
  import { CSSProperties, PropsWithChildren } from 'react';
5
3
 
6
- type OnlyExpectedProps = Required<Pick<LikeC4DiagramProperties, 'className' | 'controls' | 'background'>>;
7
- type XYFlowWrapperProps = Simplify<PropsWithChildren<SetNonNullable<OnlyExpectedProps> & {
4
+ type XYFlowWrapperProps = PropsWithChildren<{
5
+ className?: string | undefined;
8
6
  defaultNodes: XYFlowNode[];
9
7
  defaultEdges: XYFlowEdge[];
10
8
  style?: CSSProperties | undefined;
11
- }>>;
12
- declare function XYFlowWrapper({ className, children, defaultNodes, defaultEdges, controls, background, style }: XYFlowWrapperProps): JSX.Element;
13
- export declare const XYFlow: typeof XYFlowWrapper;
9
+ }>;
10
+ export declare function XYFlow({ className, children, defaultNodes, defaultEdges, style }: XYFlowWrapperProps): import("react/jsx-runtime").JSX.Element;
14
11
  export {};
@@ -2,9 +2,10 @@ import { OverrideProperties } from 'type-fest';
2
2
  import { BackgroundProps } from '@xyflow/react';
3
3
 
4
4
  export type XYBackgroundVariant = 'dots' | 'lines' | 'cross';
5
- export type XYBackgroundProps = XYBackgroundVariant | OverrideProperties<BackgroundProps, {
5
+ export type XYBackground = XYBackgroundVariant | OverrideProperties<BackgroundProps, {
6
6
  variant: XYBackgroundVariant;
7
7
  }>;
8
- export declare const XYFlowBackground: import('react').NamedExoticComponent<{
9
- background: XYBackgroundProps;
10
- }>;
8
+ export type XYBackgroundProps = {
9
+ background: XYBackground;
10
+ };
11
+ export declare function XYFlowBackground({ background }: XYBackgroundProps): import("react/jsx-runtime").JSX.Element;
@@ -1,129 +1,129 @@
1
1
  import { XYFlowNode } from './types';
2
2
 
3
3
  export declare function useXYFlowEvents(): {
4
- onDoubleClick: import('react').MouseEventHandler<HTMLDivElement> | undefined;
5
- onNodeClick: import('@xyflow/react').NodeMouseHandler<XYFlowNode>;
6
- onNodeContextMenu: import('@xyflow/react').NodeMouseHandler<XYFlowNode>;
7
- onEdgeClick: (event: import('react').MouseEvent<Element, MouseEvent>, edge: {
4
+ onDoubleClick: (event: import('react').MouseEvent<HTMLDivElement, MouseEvent>) => void;
5
+ onPaneClick: (event: import('react').MouseEvent<Element, MouseEvent>) => void;
6
+ onNodeContextMenu: (event: import('react').MouseEvent<Element, MouseEvent>, xynode: XYFlowNode) => void;
7
+ onPaneContextMenu: (event: MouseEvent | import('react').MouseEvent<Element, MouseEvent>) => void;
8
+ onEdgeContextMenu: (event: import('react').MouseEvent<Element, MouseEvent>, xyedge: {
8
9
  source: string;
9
10
  target: string;
10
- style?: import('react').CSSProperties;
11
- id: string;
12
- zIndex?: number;
13
- markerEnd?: import('@xyflow/react').EdgeMarkerType;
14
- markerStart?: import('@xyflow/react').EdgeMarkerType;
15
- hidden?: boolean;
16
- className?: string;
17
- label?: import('react').ReactNode;
18
- selected?: boolean;
19
- selectable?: boolean;
20
- deletable?: boolean;
21
- ariaLabel?: string;
22
- focusable?: boolean;
23
11
  sourceHandle?: string | null;
24
12
  targetHandle?: string | null;
25
13
  animated?: boolean;
14
+ hidden?: boolean;
15
+ deletable?: boolean;
16
+ selectable?: boolean;
17
+ selected?: boolean;
18
+ markerStart?: import('@xyflow/react').EdgeMarkerType;
19
+ markerEnd?: import('@xyflow/react').EdgeMarkerType;
20
+ zIndex?: number;
21
+ ariaLabel?: string;
26
22
  interactionWidth?: number;
23
+ label?: import('react').ReactNode;
27
24
  labelStyle?: import('react').CSSProperties;
28
25
  labelShowBg?: boolean;
29
26
  labelBgStyle?: import('react').CSSProperties;
30
27
  labelBgPadding?: [number, number];
31
28
  labelBgBorderRadius?: number;
29
+ style?: import('react').CSSProperties;
30
+ className?: string;
32
31
  updatable?: import('@xyflow/react').EdgeUpdatable;
32
+ focusable?: boolean;
33
33
  data: import('./types').RelationshipData;
34
- type: "relationship";
34
+ readonly id: string;
35
+ readonly type: "relationship";
35
36
  }) => void;
36
- onEdgeContextMenu: import('@xyflow/react').EdgeMouseHandler<{
37
+ onNodeClick: (event: import('react').MouseEvent<Element, MouseEvent>, xynode: XYFlowNode) => void;
38
+ onNodeDoubleClick: (event: import('react').MouseEvent<Element, MouseEvent>, xynode: XYFlowNode) => void;
39
+ onEdgeClick: (event: import('react').MouseEvent<Element, MouseEvent>, xyedge: {
37
40
  source: string;
38
41
  target: string;
39
- style?: import("react").CSSProperties;
40
- id: string;
41
- zIndex?: number;
42
- markerEnd?: import("@xyflow/react").EdgeMarkerType;
43
- markerStart?: import("@xyflow/react").EdgeMarkerType;
44
- hidden?: boolean;
45
- className?: string;
46
- label?: import("react").ReactNode;
47
- selected?: boolean;
48
- selectable?: boolean;
49
- deletable?: boolean;
50
- ariaLabel?: string;
51
- focusable?: boolean;
52
42
  sourceHandle?: string | null;
53
43
  targetHandle?: string | null;
54
44
  animated?: boolean;
45
+ hidden?: boolean;
46
+ deletable?: boolean;
47
+ selectable?: boolean;
48
+ selected?: boolean;
49
+ markerStart?: import('@xyflow/react').EdgeMarkerType;
50
+ markerEnd?: import('@xyflow/react').EdgeMarkerType;
51
+ zIndex?: number;
52
+ ariaLabel?: string;
55
53
  interactionWidth?: number;
56
- labelStyle?: import("react").CSSProperties;
54
+ label?: import('react').ReactNode;
55
+ labelStyle?: import('react').CSSProperties;
57
56
  labelShowBg?: boolean;
58
- labelBgStyle?: import("react").CSSProperties;
57
+ labelBgStyle?: import('react').CSSProperties;
59
58
  labelBgPadding?: [number, number];
60
59
  labelBgBorderRadius?: number;
61
- updatable?: import("@xyflow/react").EdgeUpdatable;
62
- data: import("./types").RelationshipData;
63
- type: "relationship";
64
- }>;
65
- onMoveEnd: import('@xyflow/react').OnMove;
66
- onNodeDoubleClick: import('@xyflow/react').NodeMouseHandler<XYFlowNode>;
67
- onNodeMouseEnter: import('@xyflow/react').NodeMouseHandler<XYFlowNode>;
68
- onNodeMouseLeave: import('@xyflow/react').NodeMouseHandler<XYFlowNode>;
69
- onEdgeMouseEnter: import('@xyflow/react').EdgeMouseHandler<{
70
- source: string;
71
- target: string;
72
- style?: import("react").CSSProperties;
73
- id: string;
74
- zIndex?: number;
75
- markerEnd?: import("@xyflow/react").EdgeMarkerType;
76
- markerStart?: import("@xyflow/react").EdgeMarkerType;
77
- hidden?: boolean;
60
+ style?: import('react').CSSProperties;
78
61
  className?: string;
79
- label?: import("react").ReactNode;
80
- selected?: boolean;
81
- selectable?: boolean;
82
- deletable?: boolean;
83
- ariaLabel?: string;
62
+ updatable?: import('@xyflow/react').EdgeUpdatable;
84
63
  focusable?: boolean;
64
+ data: import('./types').RelationshipData;
65
+ readonly id: string;
66
+ readonly type: "relationship";
67
+ }) => void;
68
+ onMoveEnd: (event: MouseEvent | TouchEvent | null, _viewport: import('@xyflow/react').Viewport) => void;
69
+ onNodeMouseEnter: (event: import('react').MouseEvent<Element, MouseEvent>, xynode: XYFlowNode) => void;
70
+ onNodeMouseLeave: (event: import('react').MouseEvent<Element, MouseEvent>, xynode: XYFlowNode) => void;
71
+ onEdgeMouseEnter: (event: import('react').MouseEvent<Element, MouseEvent>, { id, source, target }: {
72
+ source: string;
73
+ target: string;
85
74
  sourceHandle?: string | null;
86
75
  targetHandle?: string | null;
87
76
  animated?: boolean;
77
+ hidden?: boolean;
78
+ deletable?: boolean;
79
+ selectable?: boolean;
80
+ selected?: boolean;
81
+ markerStart?: import('@xyflow/react').EdgeMarkerType;
82
+ markerEnd?: import('@xyflow/react').EdgeMarkerType;
83
+ zIndex?: number;
84
+ ariaLabel?: string;
88
85
  interactionWidth?: number;
89
- labelStyle?: import("react").CSSProperties;
86
+ label?: import('react').ReactNode;
87
+ labelStyle?: import('react').CSSProperties;
90
88
  labelShowBg?: boolean;
91
- labelBgStyle?: import("react").CSSProperties;
89
+ labelBgStyle?: import('react').CSSProperties;
92
90
  labelBgPadding?: [number, number];
93
91
  labelBgBorderRadius?: number;
94
- updatable?: import("@xyflow/react").EdgeUpdatable;
95
- data: import("./types").RelationshipData;
96
- type: "relationship";
97
- }>;
98
- onEdgeMouseLeave: import('@xyflow/react').EdgeMouseHandler<{
99
- source: string;
100
- target: string;
101
- style?: import("react").CSSProperties;
102
- id: string;
103
- zIndex?: number;
104
- markerEnd?: import("@xyflow/react").EdgeMarkerType;
105
- markerStart?: import("@xyflow/react").EdgeMarkerType;
106
- hidden?: boolean;
92
+ style?: import('react').CSSProperties;
107
93
  className?: string;
108
- label?: import("react").ReactNode;
109
- selected?: boolean;
110
- selectable?: boolean;
111
- deletable?: boolean;
112
- ariaLabel?: string;
94
+ updatable?: import('@xyflow/react').EdgeUpdatable;
113
95
  focusable?: boolean;
96
+ data: import('./types').RelationshipData;
97
+ readonly id: string;
98
+ readonly type: "relationship";
99
+ }) => void;
100
+ onEdgeMouseLeave: (event: import('react').MouseEvent<Element, MouseEvent>, xyedge: {
101
+ source: string;
102
+ target: string;
114
103
  sourceHandle?: string | null;
115
104
  targetHandle?: string | null;
116
105
  animated?: boolean;
106
+ hidden?: boolean;
107
+ deletable?: boolean;
108
+ selectable?: boolean;
109
+ selected?: boolean;
110
+ markerStart?: import('@xyflow/react').EdgeMarkerType;
111
+ markerEnd?: import('@xyflow/react').EdgeMarkerType;
112
+ zIndex?: number;
113
+ ariaLabel?: string;
117
114
  interactionWidth?: number;
118
- labelStyle?: import("react").CSSProperties;
115
+ label?: import('react').ReactNode;
116
+ labelStyle?: import('react').CSSProperties;
119
117
  labelShowBg?: boolean;
120
- labelBgStyle?: import("react").CSSProperties;
118
+ labelBgStyle?: import('react').CSSProperties;
121
119
  labelBgPadding?: [number, number];
122
120
  labelBgBorderRadius?: number;
123
- updatable?: import("@xyflow/react").EdgeUpdatable;
124
- data: import("./types").RelationshipData;
125
- type: "relationship";
126
- }>;
127
- onPaneClick: (event: import('react').MouseEvent<Element, MouseEvent>) => void;
128
- onPaneContextMenu: (event: MouseEvent | import('react').MouseEvent<Element, MouseEvent>) => void;
121
+ style?: import('react').CSSProperties;
122
+ className?: string;
123
+ updatable?: import('@xyflow/react').EdgeUpdatable;
124
+ focusable?: boolean;
125
+ data: import('./types').RelationshipData;
126
+ readonly id: string;
127
+ readonly type: "relationship";
128
+ }) => void;
129
129
  };
@@ -0,0 +1,11 @@
1
+ import { LikeC4DiagramProperties } from '../LikeC4Diagram.props';
2
+ import { PropsWithChildren } from 'react';
3
+
4
+ type XYFlowInnerProps = PropsWithChildren<{
5
+ background: NonNullable<LikeC4DiagramProperties['background']>;
6
+ controls: boolean;
7
+ showDiagramTitle: boolean;
8
+ enableDynamicViewWalkthrough: boolean;
9
+ }>;
10
+ export declare function XYFlowInner({ children, background, controls, showDiagramTitle, enableDynamicViewWalkthrough }: XYFlowInnerProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -1,7 +1,7 @@
1
1
  import { XYFlowData } from '../xyflow/types';
2
2
  import { DiagramView } from '@likec4/core';
3
3
 
4
- export declare function diagramViewToXYFlowData(view: Pick<DiagramView, 'nodes' | 'edges'>, opts: {
4
+ export declare function diagramViewToXYFlowData(view: Pick<DiagramView, 'nodes' | 'edges' | '__'>, opts: {
5
5
  draggable: boolean;
6
6
  selectable: boolean;
7
7
  }): XYFlowData;
@@ -4,29 +4,29 @@ import { EdgeProps } from '@xyflow/react';
4
4
  export declare const RelationshipEdge: import('react').NamedExoticComponent<EdgeProps<{
5
5
  source: string;
6
6
  target: string;
7
- style?: CSSProperties;
8
- id: string;
9
- zIndex?: number;
10
- markerEnd?: import("@xyflow/react").EdgeMarkerType;
11
- markerStart?: import("@xyflow/react").EdgeMarkerType;
12
- hidden?: boolean;
13
- className?: string;
14
- label?: import("react").ReactNode;
15
- selected?: boolean;
16
- selectable?: boolean;
17
- deletable?: boolean;
18
- ariaLabel?: string;
19
- focusable?: boolean;
20
7
  sourceHandle?: string | null;
21
8
  targetHandle?: string | null;
22
9
  animated?: boolean;
10
+ hidden?: boolean;
11
+ deletable?: boolean;
12
+ selectable?: boolean;
13
+ selected?: boolean;
14
+ markerStart?: import("@xyflow/react").EdgeMarkerType;
15
+ markerEnd?: import("@xyflow/react").EdgeMarkerType;
16
+ zIndex?: number;
17
+ ariaLabel?: string;
23
18
  interactionWidth?: number;
19
+ label?: import("react").ReactNode;
24
20
  labelStyle?: CSSProperties;
25
21
  labelShowBg?: boolean;
26
22
  labelBgStyle?: CSSProperties;
27
23
  labelBgPadding?: [number, number];
28
24
  labelBgBorderRadius?: number;
25
+ style?: CSSProperties;
26
+ className?: string;
29
27
  updatable?: import("@xyflow/react").EdgeUpdatable;
28
+ focusable?: boolean;
30
29
  data: import("../types").RelationshipData;
31
- type: "relationship";
30
+ readonly id: string;
31
+ readonly type: "relationship";
32
32
  }>>;
@@ -1,8 +1,11 @@
1
1
  export declare const container: string;
2
+ export declare const dimmed: string;
2
3
  export declare const edgePathBg: string;
3
- export declare const fillStrokeCtx: string;
4
+ export declare const markerContext: string;
5
+ export declare const controlPoint: string;
4
6
  export declare const cssEdgePath: string;
5
7
  export declare const varLabelX: `var(--${string})` | `var(--${string}, ${string})` | `var(--${string}, ${number})`;
6
8
  export declare const varLabelY: `var(--${string})` | `var(--${string}, ${string})` | `var(--${string}, ${number})`;
7
9
  export declare const edgeLabel: string;
8
- export declare const edgeLabelBody: string;
10
+ export declare const stepEdgeNumber: string;
11
+ export declare const edgeLabelText: string;
@@ -1,6 +1,8 @@
1
1
  import { InternalXYFlowNode } from '../types';
2
2
  import { Position, XYPosition } from '@xyflow/react';
3
+ import { Point } from '@likec4/core';
3
4
 
5
+ export declare function getNodeIntersectionFromCenterToPoint(intersectionNode: InternalXYFlowNode, [x1, y1]: Point): readonly [number, number];
4
6
  export declare function getPointPosition(node: InternalXYFlowNode, intersectionPoint: XYPosition): readonly [number, number, Position];
5
7
  export declare function getEdgeParams(source: InternalXYFlowNode, target: InternalXYFlowNode): {
6
8
  sx: number;