likec4 0.41.0 → 0.42.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 (144) hide show
  1. package/README.md +108 -0
  2. package/dist/__app__/src/App.jsx +1 -1
  3. package/dist/__app__/src/components/view-page/ExportDiagram.jsx +72 -0
  4. package/dist/__app__/src/components/view-page/ViewActionsToolbar.jsx +38 -12
  5. package/dist/cli/index.js +53 -53
  6. package/package.json +6 -6
  7. package/dist/@likec4/diagrams/cjs/components/EmbeddedDiagram.js +0 -83
  8. package/dist/@likec4/diagrams/cjs/components/FullscreenDiagramBrowser.js +0 -50
  9. package/dist/@likec4/diagrams/cjs/components/index.js +0 -49
  10. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/CloseButton.js +0 -44
  11. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/FullscreenDiagram.js +0 -110
  12. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/FullscreenDiagramTitle.js +0 -39
  13. package/dist/@likec4/diagrams/cjs/components/primitives/index.js +0 -38
  14. package/dist/@likec4/diagrams/cjs/components/primitives/responsive/ResponsiveDiagram.js +0 -56
  15. package/dist/@likec4/diagrams/cjs/components/types.js +0 -1
  16. package/dist/@likec4/diagrams/cjs/diagram/Diagram.js +0 -326
  17. package/dist/@likec4/diagrams/cjs/diagram/Edges.js +0 -121
  18. package/dist/@likec4/diagrams/cjs/diagram/Nodes.js +0 -204
  19. package/dist/@likec4/diagrams/cjs/diagram/icons/BrainIcon.js +0 -25
  20. package/dist/@likec4/diagrams/cjs/diagram/icons/ExternalLink.js +0 -82
  21. package/dist/@likec4/diagrams/cjs/diagram/icons/index.js +0 -27
  22. package/dist/@likec4/diagrams/cjs/diagram/index.js +0 -27
  23. package/dist/@likec4/diagrams/cjs/diagram/shapes/Browser.js +0 -67
  24. package/dist/@likec4/diagrams/cjs/diagram/shapes/Compound.js +0 -55
  25. package/dist/@likec4/diagrams/cjs/diagram/shapes/Cylinder.js +0 -71
  26. package/dist/@likec4/diagrams/cjs/diagram/shapes/Edge.js +0 -62
  27. package/dist/@likec4/diagrams/cjs/diagram/shapes/Mobile.js +0 -45
  28. package/dist/@likec4/diagrams/cjs/diagram/shapes/NodeIcon.js +0 -38
  29. package/dist/@likec4/diagrams/cjs/diagram/shapes/NodeLabel.js +0 -62
  30. package/dist/@likec4/diagrams/cjs/diagram/shapes/Person.js +0 -48
  31. package/dist/@likec4/diagrams/cjs/diagram/shapes/Queue.js +0 -72
  32. package/dist/@likec4/diagrams/cjs/diagram/shapes/Rectangle.js +0 -30
  33. package/dist/@likec4/diagrams/cjs/diagram/shapes/index.js +0 -54
  34. package/dist/@likec4/diagrams/cjs/diagram/shapes/types.js +0 -1
  35. package/dist/@likec4/diagrams/cjs/diagram/shapes/utils.js +0 -19
  36. package/dist/@likec4/diagrams/cjs/diagram/springs.js +0 -61
  37. package/dist/@likec4/diagrams/cjs/diagram/state/atoms.js +0 -63
  38. package/dist/@likec4/diagrams/cjs/diagram/state/gestures.js +0 -26
  39. package/dist/@likec4/diagrams/cjs/diagram/state/hooks.js +0 -36
  40. package/dist/@likec4/diagrams/cjs/diagram/state/index.js +0 -38
  41. package/dist/@likec4/diagrams/cjs/diagram/state/provider.js +0 -18
  42. package/dist/@likec4/diagrams/cjs/diagram/types.js +0 -1
  43. package/dist/@likec4/diagrams/cjs/hooks/index.js +0 -49
  44. package/dist/@likec4/diagrams/cjs/hooks/useDarkMode.js +0 -11
  45. package/dist/@likec4/diagrams/cjs/hooks/useDiagramApi.js +0 -27
  46. package/dist/@likec4/diagrams/cjs/hooks/useImageLoader.js +0 -68
  47. package/dist/@likec4/diagrams/cjs/hooks/useViewIdFromHash.js +0 -93
  48. package/dist/@likec4/diagrams/cjs/index.js +0 -51
  49. package/dist/@likec4/diagrams/cjs/konva-html.js +0 -93
  50. package/dist/@likec4/diagrams/cjs/konva-portal.js +0 -50
  51. package/dist/@likec4/diagrams/cjs/konva.js +0 -102
  52. package/dist/@likec4/diagrams/cjs/likec4.js +0 -91
  53. package/dist/@likec4/diagrams/components/EmbeddedDiagram.mjs +0 -77
  54. package/dist/@likec4/diagrams/components/FullscreenDiagramBrowser.mjs +0 -52
  55. package/dist/@likec4/diagrams/components/index.mjs +0 -4
  56. package/dist/@likec4/diagrams/components/primitives/fullscreen/CloseButton.mjs +0 -43
  57. package/dist/@likec4/diagrams/components/primitives/fullscreen/FullscreenDiagram.mjs +0 -116
  58. package/dist/@likec4/diagrams/components/primitives/fullscreen/FullscreenDiagramTitle.mjs +0 -32
  59. package/dist/@likec4/diagrams/components/primitives/index.mjs +0 -3
  60. package/dist/@likec4/diagrams/components/primitives/responsive/ResponsiveDiagram.mjs +0 -42
  61. package/dist/@likec4/diagrams/components/types.mjs +0 -0
  62. package/dist/@likec4/diagrams/diagram/Diagram.mjs +0 -307
  63. package/dist/@likec4/diagrams/diagram/Edges.mjs +0 -117
  64. package/dist/@likec4/diagrams/diagram/Nodes.mjs +0 -178
  65. package/dist/@likec4/diagrams/diagram/icons/BrainIcon.mjs +0 -20
  66. package/dist/@likec4/diagrams/diagram/icons/ExternalLink.mjs +0 -90
  67. package/dist/@likec4/diagrams/diagram/icons/index.mjs +0 -2
  68. package/dist/@likec4/diagrams/diagram/index.mjs +0 -2
  69. package/dist/@likec4/diagrams/diagram/shapes/Browser.mjs +0 -49
  70. package/dist/@likec4/diagrams/diagram/shapes/Compound.mjs +0 -48
  71. package/dist/@likec4/diagrams/diagram/shapes/Cylinder.mjs +0 -57
  72. package/dist/@likec4/diagrams/diagram/shapes/Edge.mjs +0 -63
  73. package/dist/@likec4/diagrams/diagram/shapes/Mobile.mjs +0 -33
  74. package/dist/@likec4/diagrams/diagram/shapes/NodeIcon.mjs +0 -28
  75. package/dist/@likec4/diagrams/diagram/shapes/NodeLabel.mjs +0 -59
  76. package/dist/@likec4/diagrams/diagram/shapes/Person.mjs +0 -42
  77. package/dist/@likec4/diagrams/diagram/shapes/Queue.mjs +0 -58
  78. package/dist/@likec4/diagrams/diagram/shapes/Rectangle.mjs +0 -20
  79. package/dist/@likec4/diagrams/diagram/shapes/index.mjs +0 -7
  80. package/dist/@likec4/diagrams/diagram/shapes/types.mjs +0 -0
  81. package/dist/@likec4/diagrams/diagram/shapes/utils.mjs +0 -12
  82. package/dist/@likec4/diagrams/diagram/springs.mjs +0 -57
  83. package/dist/@likec4/diagrams/diagram/state/atoms.mjs +0 -71
  84. package/dist/@likec4/diagrams/diagram/state/gestures.mjs +0 -19
  85. package/dist/@likec4/diagrams/diagram/state/hooks.mjs +0 -28
  86. package/dist/@likec4/diagrams/diagram/state/index.mjs +0 -3
  87. package/dist/@likec4/diagrams/diagram/state/provider.mjs +0 -7
  88. package/dist/@likec4/diagrams/diagram/types.mjs +0 -0
  89. package/dist/@likec4/diagrams/esm/components/EmbeddedDiagram.js +0 -77
  90. package/dist/@likec4/diagrams/esm/components/FullscreenDiagramBrowser.js +0 -52
  91. package/dist/@likec4/diagrams/esm/components/index.js +0 -4
  92. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/CloseButton.js +0 -43
  93. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/FullscreenDiagram.js +0 -116
  94. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/FullscreenDiagramTitle.js +0 -32
  95. package/dist/@likec4/diagrams/esm/components/primitives/index.js +0 -3
  96. package/dist/@likec4/diagrams/esm/components/primitives/responsive/ResponsiveDiagram.js +0 -42
  97. package/dist/@likec4/diagrams/esm/components/types.js +0 -0
  98. package/dist/@likec4/diagrams/esm/diagram/Diagram.js +0 -307
  99. package/dist/@likec4/diagrams/esm/diagram/Edges.js +0 -117
  100. package/dist/@likec4/diagrams/esm/diagram/Nodes.js +0 -178
  101. package/dist/@likec4/diagrams/esm/diagram/icons/BrainIcon.js +0 -20
  102. package/dist/@likec4/diagrams/esm/diagram/icons/ExternalLink.js +0 -90
  103. package/dist/@likec4/diagrams/esm/diagram/icons/index.js +0 -2
  104. package/dist/@likec4/diagrams/esm/diagram/index.js +0 -2
  105. package/dist/@likec4/diagrams/esm/diagram/shapes/Browser.js +0 -49
  106. package/dist/@likec4/diagrams/esm/diagram/shapes/Compound.js +0 -48
  107. package/dist/@likec4/diagrams/esm/diagram/shapes/Cylinder.js +0 -57
  108. package/dist/@likec4/diagrams/esm/diagram/shapes/Edge.js +0 -63
  109. package/dist/@likec4/diagrams/esm/diagram/shapes/Mobile.js +0 -33
  110. package/dist/@likec4/diagrams/esm/diagram/shapes/NodeIcon.js +0 -28
  111. package/dist/@likec4/diagrams/esm/diagram/shapes/NodeLabel.js +0 -59
  112. package/dist/@likec4/diagrams/esm/diagram/shapes/Person.js +0 -42
  113. package/dist/@likec4/diagrams/esm/diagram/shapes/Queue.js +0 -58
  114. package/dist/@likec4/diagrams/esm/diagram/shapes/Rectangle.js +0 -20
  115. package/dist/@likec4/diagrams/esm/diagram/shapes/index.js +0 -7
  116. package/dist/@likec4/diagrams/esm/diagram/shapes/types.js +0 -0
  117. package/dist/@likec4/diagrams/esm/diagram/shapes/utils.js +0 -12
  118. package/dist/@likec4/diagrams/esm/diagram/springs.js +0 -57
  119. package/dist/@likec4/diagrams/esm/diagram/state/atoms.js +0 -71
  120. package/dist/@likec4/diagrams/esm/diagram/state/gestures.js +0 -19
  121. package/dist/@likec4/diagrams/esm/diagram/state/hooks.js +0 -28
  122. package/dist/@likec4/diagrams/esm/diagram/state/index.js +0 -3
  123. package/dist/@likec4/diagrams/esm/diagram/state/provider.js +0 -7
  124. package/dist/@likec4/diagrams/esm/diagram/types.js +0 -0
  125. package/dist/@likec4/diagrams/esm/hooks/index.js +0 -4
  126. package/dist/@likec4/diagrams/esm/hooks/useDarkMode.js +0 -5
  127. package/dist/@likec4/diagrams/esm/hooks/useDiagramApi.js +0 -27
  128. package/dist/@likec4/diagrams/esm/hooks/useImageLoader.js +0 -64
  129. package/dist/@likec4/diagrams/esm/hooks/useViewIdFromHash.js +0 -87
  130. package/dist/@likec4/diagrams/esm/index.js +0 -4
  131. package/dist/@likec4/diagrams/esm/konva-html.js +0 -74
  132. package/dist/@likec4/diagrams/esm/konva-portal.js +0 -34
  133. package/dist/@likec4/diagrams/esm/konva.js +0 -22
  134. package/dist/@likec4/diagrams/esm/likec4.js +0 -54
  135. package/dist/@likec4/diagrams/hooks/index.mjs +0 -4
  136. package/dist/@likec4/diagrams/hooks/useDarkMode.mjs +0 -5
  137. package/dist/@likec4/diagrams/hooks/useDiagramApi.mjs +0 -27
  138. package/dist/@likec4/diagrams/hooks/useImageLoader.mjs +0 -64
  139. package/dist/@likec4/diagrams/hooks/useViewIdFromHash.mjs +0 -87
  140. package/dist/@likec4/diagrams/index.mjs +0 -4
  141. package/dist/@likec4/diagrams/konva-html.mjs +0 -74
  142. package/dist/@likec4/diagrams/konva-portal.mjs +0 -34
  143. package/dist/@likec4/diagrams/konva.mjs +0 -33
  144. package/dist/@likec4/diagrams/likec4.mjs +0 -54
@@ -1,42 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { useMeasure } from "@react-hookz/web/esm";
3
- import { forwardRef } from "react";
4
- import { Diagram } from "../../../diagram/index.mjs";
5
- export const ResponsiveDiagram = /* @__PURE__ */ forwardRef(
6
- ({ diagram, animate = false, className, diagramClassName, style, ...props }, ref) => {
7
- const [measures, containerRef] = useMeasure();
8
- const w = diagram.width, h = diagram.height;
9
- return /* @__PURE__ */ jsx(
10
- "div",
11
- {
12
- style: {
13
- position: "relative",
14
- display: "flex",
15
- aspectRatio: `${w} / ${h}`,
16
- width: "100%",
17
- height: "auto",
18
- marginLeft: "auto",
19
- marginRight: "auto",
20
- padding: 0,
21
- maxWidth: w,
22
- boxSizing: "border-box",
23
- ...style
24
- },
25
- className,
26
- children: /* @__PURE__ */ jsx("div", { ref: containerRef, style: { flex: "1 1 100%", overflow: "hidden" }, children: measures && /* @__PURE__ */ jsx(
27
- Diagram,
28
- {
29
- ref,
30
- width: Math.floor(measures.width),
31
- height: Math.floor(measures.height),
32
- diagram,
33
- className: diagramClassName,
34
- animate,
35
- ...props
36
- }
37
- ) })
38
- }
39
- );
40
- }
41
- );
42
- ResponsiveDiagram.displayName = "ResponsiveDiagram";
File without changes
@@ -1,307 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { nonNullable, defaultTheme as theme } from "@likec4/core";
3
- import { useHookableRef, useUpdateEffect } from "@react-hookz/web/esm";
4
- import { easings, useSpring } from "@react-spring/konva";
5
- import { clamp } from "rambdax";
6
- import { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
7
- import { AnimatedStage, Layer } from "../konva.mjs";
8
- import { Edges } from "./Edges.mjs";
9
- import { createUseGesture, dragAction, pinchAction } from "@use-gesture/react";
10
- import { Nodes } from "./Nodes.mjs";
11
- import { DiagramGesture } from "./state/index.mjs";
12
- const useGesture = createUseGesture([dragAction, pinchAction]);
13
- const useSyncedRef = (value) => {
14
- const ref = useRef(value);
15
- Object.assign(ref.current, value);
16
- return ref;
17
- };
18
- const NoPadding = [0, 0, 0, 0];
19
- function diagramNodeId(konvaNode) {
20
- let shape = konvaNode;
21
- while (shape && shape.nodeType !== "Stage") {
22
- const name = shape.name();
23
- if (name !== "") {
24
- return name;
25
- }
26
- shape = shape.parent;
27
- }
28
- return null;
29
- }
30
- export const Diagram = /* @__PURE__ */ forwardRef(
31
- ({
32
- diagram,
33
- padding: _padding = NoPadding,
34
- pannable = true,
35
- zoomable = true,
36
- animate = true,
37
- initialPosition,
38
- onEdgeClick,
39
- onNodeClick,
40
- onNodeContextMenu,
41
- onStageClick,
42
- onStageContextMenu,
43
- width: _width,
44
- height: _height,
45
- ...props
46
- }, ref) => {
47
- const immediate = !animate;
48
- const id = diagram.id;
49
- const containerRef = useRef(null);
50
- const stageRef = useHookableRef(null, (value) => {
51
- containerRef.current = value?.container() ?? null;
52
- if (containerRef.current) {
53
- containerRef.current.style.touchAction = "none";
54
- }
55
- return value;
56
- });
57
- const width = _width ?? diagram.width;
58
- const height = _height ?? diagram.height;
59
- const toCenterOnRect = (centerTo) => {
60
- const [paddingTop, paddingRight, paddingBottom, paddingLeft] = Array.isArray(_padding) ? _padding : [_padding, _padding, _padding, _padding];
61
- const container = stageRef.current?.container();
62
- const viewRect = {
63
- width: Math.min(container?.clientWidth ?? width, width) - paddingLeft - paddingRight,
64
- height: Math.min(container?.clientHeight ?? height, height) - paddingTop - paddingBottom
65
- }, viewScale = Math.min(viewRect.width / centerTo.width, viewRect.height / centerTo.height), scale = clamp(0.1, 1, viewScale), centeringAjustment = {
66
- x: ((width - centerTo.width) * scale + viewRect.width) / 2,
67
- y: ((height - centerTo.height) * scale + viewRect.height) / 2
68
- }, finalPosition = {
69
- x: Math.ceil(paddingLeft + centeringAjustment.x - centerTo.x * scale),
70
- y: Math.ceil(paddingTop + centeringAjustment.y - centerTo.y * scale)
71
- };
72
- return {
73
- ...finalPosition,
74
- scale
75
- };
76
- };
77
- const toFitDiagram = () => toCenterOnRect({ x: 0, y: 0, width: diagram.width, height: diagram.height });
78
- const [stageProps, stageSpringApi] = useSpring(
79
- () => initialPosition ? {
80
- from: initialPosition,
81
- to: toFitDiagram()
82
- } : {
83
- from: toFitDiagram(),
84
- immediate
85
- }
86
- );
87
- const centerOnRect = (centerTo) => {
88
- stageSpringApi.start({
89
- to: toCenterOnRect(centerTo),
90
- immediate
91
- });
92
- return;
93
- };
94
- const centerAndFit = (delay = 70, durationMs) => {
95
- stageSpringApi.start({
96
- to: toFitDiagram(),
97
- delay,
98
- config: durationMs ? {
99
- duration: durationMs,
100
- easing: easings.easeInOutCubic
101
- } : {},
102
- immediate
103
- });
104
- return;
105
- };
106
- const resetStageZoom = (_immediate) => {
107
- stageSpringApi.start({
108
- to: {
109
- x: 0,
110
- y: 0,
111
- scale: 1
112
- },
113
- immediate
114
- });
115
- return;
116
- };
117
- const refs = useSyncedRef({
118
- diagram,
119
- width,
120
- height,
121
- centerOnRect,
122
- centerAndFit,
123
- resetStageZoom
124
- });
125
- useImperativeHandle(
126
- ref,
127
- () => ({
128
- get stage() {
129
- return nonNullable(stageRef.current, "not mounted");
130
- },
131
- get diagramView() {
132
- return refs.current.diagram;
133
- },
134
- get container() {
135
- return nonNullable(stageRef.current?.container(), "not mounted");
136
- },
137
- resetStageZoom: (_immediate) => {
138
- refs.current.resetStageZoom(_immediate);
139
- },
140
- centerOnNode: (node) => refs.current.centerOnRect({
141
- x: node.position[0],
142
- y: node.position[1],
143
- width: node.size.width,
144
- height: node.size.height
145
- }),
146
- centerAndFit: () => refs.current.centerAndFit()
147
- }),
148
- [refs, id, stageRef]
149
- );
150
- useUpdateEffect(() => {
151
- refs.current.centerAndFit(80, 650);
152
- }, [id, height, width]);
153
- useEffect(() => {
154
- if (!zoomable) {
155
- return;
156
- }
157
- const handler = (e) => e.preventDefault();
158
- document.addEventListener("gesturestart", handler);
159
- document.addEventListener("gesturechange", handler);
160
- return () => {
161
- document.removeEventListener("gesturestart", handler);
162
- document.removeEventListener("gesturechange", handler);
163
- };
164
- }, [zoomable]);
165
- useGesture(
166
- {
167
- onDragEnd: () => {
168
- DiagramGesture.isDragging = false;
169
- },
170
- onDrag: (state) => {
171
- const {
172
- pinching,
173
- down,
174
- cancel,
175
- intentional,
176
- offset: [x, y]
177
- } = state;
178
- if (pinching) {
179
- return cancel();
180
- }
181
- if (intentional) {
182
- DiagramGesture.isDragging = true;
183
- stageSpringApi.start({
184
- to: {
185
- x,
186
- y
187
- },
188
- immediate: immediate || down
189
- });
190
- }
191
- },
192
- onPinch: ({ memo, first, last, origin: [ox, oy], movement: [ms], offset: [scale] }) => {
193
- if (first) {
194
- const stage = nonNullable(stageRef.current);
195
- const { x: x2, y: y2 } = stage.getAbsolutePosition();
196
- const tx = Math.round(ox - x2);
197
- const ty = Math.round(oy - y2);
198
- memo = [stage.x(), stage.y(), tx, ty];
199
- }
200
- const x = Math.round(memo[0] - (ms - 1) * memo[2]);
201
- const y = Math.round(memo[1] - (ms - 1) * memo[3]);
202
- stageSpringApi.start({
203
- to: {
204
- x,
205
- y,
206
- scale
207
- },
208
- immediate: immediate || !last || !first
209
- });
210
- return memo;
211
- }
212
- },
213
- {
214
- target: containerRef,
215
- drag: {
216
- enabled: pannable,
217
- threshold: 4,
218
- from: () => [stageProps.x.get(), stageProps.y.get()],
219
- pointer: {
220
- buttons: -1,
221
- keys: false
222
- }
223
- },
224
- pinch: {
225
- pointer: {
226
- touch: true
227
- },
228
- enabled: zoomable,
229
- scaleBounds: { min: 0.2, max: 1.15 },
230
- rubberband: 0.05,
231
- pinchOnWheel: true
232
- }
233
- }
234
- );
235
- const sharedProps = {
236
- animate,
237
- theme,
238
- diagram
239
- };
240
- return /* @__PURE__ */ jsxs(
241
- AnimatedStage,
242
- {
243
- ref: stageRef,
244
- width,
245
- height,
246
- offsetX: width / 2,
247
- offsetY: height / 2,
248
- x: stageProps.x,
249
- y: stageProps.y,
250
- scaleX: stageProps.scale,
251
- scaleY: stageProps.scale,
252
- ...(onStageContextMenu || onNodeContextMenu) && {
253
- onContextMenu: (e) => {
254
- if (DiagramGesture.isDragging || !stageRef.current) {
255
- return;
256
- }
257
- if (e.target === stageRef.current || !onNodeContextMenu) {
258
- e.cancelBubble = true;
259
- onStageContextMenu?.(stageRef.current, e);
260
- return;
261
- }
262
- if (onNodeContextMenu) {
263
- const nodeId = diagramNodeId(e.target);
264
- const node = nodeId && refs.current.diagram.nodes.find((n) => n.id === nodeId);
265
- if (node) {
266
- e.cancelBubble = true;
267
- onNodeContextMenu(node, e);
268
- return;
269
- }
270
- }
271
- }
272
- },
273
- ...onStageClick && {
274
- onPointerClick: (e) => {
275
- if (DiagramGesture.isDragging || e.evt.button !== 0 || !stageRef.current) {
276
- return;
277
- }
278
- if (e.target === stageRef.current) {
279
- e.cancelBubble = true;
280
- onStageClick(stageRef.current, e);
281
- }
282
- }
283
- },
284
- ...zoomable && {
285
- onPointerDblClick: (e) => {
286
- if (DiagramGesture.isDragging || e.evt.button !== 0 || !stageRef.current) {
287
- return;
288
- }
289
- if (e.target === stageRef.current) {
290
- e.cancelBubble = true;
291
- centerAndFit();
292
- }
293
- }
294
- },
295
- ...props,
296
- children: [
297
- /* @__PURE__ */ jsxs(Layer, { children: [
298
- /* @__PURE__ */ jsx(Nodes, { ...sharedProps, onNodeClick }),
299
- /* @__PURE__ */ jsx(Edges, { ...sharedProps, onEdgeClick })
300
- ] }),
301
- /* @__PURE__ */ jsx(Layer, { name: "top" })
302
- ]
303
- }
304
- );
305
- }
306
- );
307
- Diagram.displayName = "Diagram";
@@ -1,117 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { useMemo } from "react";
3
- import { Group } from "../konva.mjs";
4
- import { EdgeShape } from "./shapes/Edge.mjs";
5
- import { mouseDefault, mousePointer } from "./shapes/utils.mjs";
6
- import { DiagramGesture, useHoveredEdgeId, useSetHoveredEdge } from "./state/index.mjs";
7
- import { useTransition } from "@react-spring/konva";
8
- import { scale, toHex } from "khroma";
9
- const edgeColors = ({ relation: { lineColor, labelColor } }, isHovered = false) => {
10
- if (Array.isArray(lineColor)) {
11
- lineColor = isHovered ? lineColor[1].onHover : lineColor[0];
12
- } else if (isHovered) {
13
- lineColor = toHex(
14
- scale(lineColor, {
15
- l: 35,
16
- s: -5
17
- })
18
- );
19
- }
20
- if (Array.isArray(labelColor)) {
21
- labelColor = isHovered ? labelColor[1].onHover : labelColor[0];
22
- } else if (isHovered) {
23
- labelColor = toHex(
24
- scale(labelColor, {
25
- l: 50
26
- })
27
- );
28
- }
29
- return {
30
- lineColor,
31
- labelColor
32
- };
33
- };
34
- export function Edges({ animate, theme, diagram, onEdgeClick }) {
35
- const hoveredEdgeId = useHoveredEdgeId();
36
- const setHoveredEdge = useSetHoveredEdge();
37
- const colors = useMemo(
38
- () => ({
39
- base: edgeColors(theme),
40
- onHover: edgeColors(theme, true)
41
- }),
42
- [theme]
43
- );
44
- const edgeTransitions = useTransition(diagram.edges, {
45
- initial: {
46
- opacity: 1,
47
- lineWidth: 2,
48
- ...colors.base
49
- },
50
- from: {
51
- opacity: 0.15,
52
- lineWidth: 2,
53
- ...colors.base
54
- },
55
- update: (edge) => {
56
- const isHovered = hoveredEdgeId === edge.id;
57
- return {
58
- opacity: 1,
59
- lineWidth: isHovered ? 3 : 2,
60
- ...isHovered ? colors.onHover : colors.base
61
- };
62
- },
63
- enter: {
64
- opacity: 1
65
- },
66
- leave: {
67
- opacity: 0.05,
68
- lineWidth: 2,
69
- ...colors.base
70
- },
71
- expires: true,
72
- exitBeforeEnter: true,
73
- immediate: !animate,
74
- // delay: 30,
75
- config: {
76
- duration: 160,
77
- precision: 5e-3
78
- },
79
- // unique edge key, scoped to this diagram
80
- // to avoid any issues with diagram-to-diagram transitions
81
- keys: (e) => e.id + diagram.id
82
- });
83
- return edgeTransitions((springs, edge, { key }) => /* @__PURE__ */ jsx(
84
- Group,
85
- {
86
- ...onEdgeClick && {
87
- onPointerClick: (e) => {
88
- if (DiagramGesture.isDragging || e.evt.button !== 0) {
89
- return;
90
- }
91
- e.cancelBubble = true;
92
- onEdgeClick(edge, e);
93
- },
94
- onPointerEnter: (e) => {
95
- if (animate) {
96
- setHoveredEdge(edge);
97
- mousePointer(e);
98
- }
99
- },
100
- onPointerLeave: (e) => {
101
- setHoveredEdge(null);
102
- mouseDefault(e);
103
- }
104
- },
105
- children: /* @__PURE__ */ jsx(
106
- EdgeShape,
107
- {
108
- edge,
109
- isHovered: hoveredEdgeId === edge.id,
110
- theme,
111
- springs
112
- }
113
- )
114
- },
115
- key
116
- ));
117
- }
@@ -1,178 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { nonexhaustive } from "@likec4/core";
3
- import { useTransition } from "@react-spring/konva";
4
- import { useRef } from "react";
5
- import { AnimatedGroup } from "../konva.mjs";
6
- import { Portal } from "../konva-portal.mjs";
7
- import { CylinderShape, MobileShape, PersonShape, QueueShape, RectangleShape } from "./shapes/index.mjs";
8
- import { BrowserShape } from "./shapes/Browser.mjs";
9
- import { CompoundShape } from "./shapes/Compound.mjs";
10
- import { mouseDefault, mousePointer } from "./shapes/utils.mjs";
11
- import { useNodeSpringsFn } from "./springs.mjs";
12
- import { DiagramGesture, useHoveredNodeId, useSetHoveredNode } from "./state/index.mjs";
13
- function nodeShape({ shape }) {
14
- switch (shape) {
15
- case "cylinder":
16
- case "storage": {
17
- return CylinderShape;
18
- }
19
- case "queue": {
20
- return QueueShape;
21
- }
22
- case "browser": {
23
- return BrowserShape;
24
- }
25
- case "person": {
26
- return PersonShape;
27
- }
28
- case "rectangle": {
29
- return RectangleShape;
30
- }
31
- case "mobile": {
32
- return MobileShape;
33
- }
34
- default: {
35
- return nonexhaustive(shape);
36
- }
37
- }
38
- }
39
- const isCompound = (node) => {
40
- return node.children.length > 0;
41
- };
42
- const keyOf = (node) => {
43
- const key = (node.parent ? node.parent + "-" : "") + node.id;
44
- if (isCompound(node)) {
45
- return "compound-" + key;
46
- }
47
- return key;
48
- };
49
- export function Nodes({ animate, theme, diagram, onNodeClick }) {
50
- const _prev = useRef(/* @__PURE__ */ new Map());
51
- const _last = useRef(diagram);
52
- if (_last.current.id !== diagram.id) {
53
- _prev.current = new Map(_last.current.nodes.map((n) => [n.id, n]));
54
- }
55
- _last.current = diagram;
56
- const prevNodes = _prev.current;
57
- const hoveredNodeId = useHoveredNodeId();
58
- const nodeSprings = useNodeSpringsFn(theme);
59
- const nodeTransitions = useTransition(diagram.nodes, {
60
- initial: nodeSprings,
61
- from: (node) => {
62
- const prevNode = prevNodes.get(node.id);
63
- if (prevNode) {
64
- return nodeSprings(prevNode);
65
- }
66
- return {
67
- ...nodeSprings(node),
68
- opacity: 0,
69
- scaleX: isCompound(node) ? 0.85 : 0.6,
70
- scaleY: isCompound(node) ? 0.85 : 0.6
71
- };
72
- },
73
- enter: (node) => {
74
- const isReplacing = prevNodes.has(node.id);
75
- return {
76
- ...nodeSprings(node),
77
- delay: isReplacing ? 50 : 70
78
- };
79
- },
80
- // update: nodeSprings(),
81
- update: (node) => {
82
- const scale = !isCompound(node) && hoveredNodeId === node.id && animate ? 1.08 : 1;
83
- return {
84
- ...nodeSprings(node),
85
- scaleX: scale,
86
- scaleY: scale
87
- };
88
- },
89
- leave: (node) => {
90
- const replacedWith = diagram.nodes.find((n) => n.id === node.id);
91
- if (replacedWith && keyOf(node) !== keyOf(replacedWith)) {
92
- return {
93
- opacity: 0,
94
- immediate: true
95
- };
96
- }
97
- return {
98
- opacity: 0,
99
- scaleX: isCompound(node) ? 0.7 : 0.5,
100
- scaleY: isCompound(node) ? 0.7 : 0.5,
101
- config: {
102
- duration: 120
103
- }
104
- };
105
- },
106
- sort: (a, b) => {
107
- if (isCompound(a) === isCompound(b)) {
108
- return a.level - b.level;
109
- }
110
- return isCompound(a) ? -1 : 1;
111
- },
112
- expires: true,
113
- immediate: !animate,
114
- keys: keyOf
115
- });
116
- return nodeTransitions((_, node, { key, ctrl, expired }) => /* @__PURE__ */ jsx(
117
- NodeSnape,
118
- {
119
- animate,
120
- node,
121
- theme,
122
- ctrl,
123
- expired,
124
- onNodeClick,
125
- isHovered: node.id === hoveredNodeId
126
- },
127
- key
128
- ));
129
- }
130
- function NodeSnape({
131
- animate,
132
- node,
133
- ctrl,
134
- theme,
135
- isHovered,
136
- expired,
137
- onNodeClick
138
- }) {
139
- const setHoveredNode = useSetHoveredNode();
140
- const Shape = isCompound(node) ? CompoundShape : nodeShape(node);
141
- const springs = ctrl.springs;
142
- return /* @__PURE__ */ jsx(Portal, { selector: ".top", enabled: isHovered && !isCompound(node), children: /* @__PURE__ */ jsx(
143
- AnimatedGroup,
144
- {
145
- name: node.id,
146
- visible: expired !== true,
147
- onPointerEnter: (e) => {
148
- if (animate) {
149
- setHoveredNode(node);
150
- onNodeClick && mousePointer(e);
151
- }
152
- },
153
- onPointerLeave: (e) => {
154
- setHoveredNode(null);
155
- mouseDefault(e);
156
- },
157
- ...onNodeClick && {
158
- onPointerClick: (e) => {
159
- if (DiagramGesture.isDragging || e.evt.button !== 0) {
160
- return;
161
- }
162
- e.cancelBubble = true;
163
- onNodeClick(node, e);
164
- }
165
- },
166
- x: springs.x,
167
- y: springs.y,
168
- offsetX: springs.offsetX,
169
- offsetY: springs.offsetY,
170
- width: springs.width,
171
- height: springs.height,
172
- scaleX: springs.scaleX,
173
- scaleY: springs.scaleY,
174
- opacity: springs.opacity,
175
- children: /* @__PURE__ */ jsx(Shape, { node, theme, springs, isHovered })
176
- }
177
- ) });
178
- }
@@ -1,20 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- export const BrainIcon = () => /* @__PURE__ */ jsxs(
3
- "svg",
4
- {
5
- xmlns: "http://www.w3.org/2000/svg",
6
- width: "24",
7
- height: "24",
8
- viewBox: "0 0 24 24",
9
- fill: "none",
10
- stroke: "#dedede",
11
- strokeWidth: "2",
12
- strokeLinecap: "round",
13
- strokeLinejoin: "round",
14
- className: "lucide lucide-brain",
15
- children: [
16
- /* @__PURE__ */ jsx("path", { d: "M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z" }),
17
- /* @__PURE__ */ jsx("path", { d: "M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z" })
18
- ]
19
- }
20
- );