@krainovsd/graph 0.8.4 → 0.10.0-rc1

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 (55) hide show
  1. package/lib/cjs/index.cjs +2819 -1574
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/index.js +14 -4
  4. package/lib/esm/index.js.map +1 -1
  5. package/lib/esm/lib/draw-time.js +5 -1
  6. package/lib/esm/lib/draw-time.js.map +1 -1
  7. package/lib/esm/lib/get-controls-info.js +525 -151
  8. package/lib/esm/lib/get-controls-info.js.map +1 -1
  9. package/lib/esm/module/GraphCanvas/GraphCanvas.js +42 -746
  10. package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
  11. package/lib/esm/module/GraphCanvas/constants/settings.js +83 -39
  12. package/lib/esm/module/GraphCanvas/constants/settings.js.map +1 -1
  13. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js +10 -1
  14. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js.map +1 -1
  15. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js +270 -0
  16. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js.map +1 -0
  17. package/lib/esm/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.js +2 -2
  18. package/lib/esm/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.js.map +1 -1
  19. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js +19 -4
  20. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js.map +1 -1
  21. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js +29 -4
  22. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js.map +1 -1
  23. package/lib/esm/module/GraphCanvas/lib/utils/is-overlaps-node.js +53 -4
  24. package/lib/esm/module/GraphCanvas/lib/utils/is-overlaps-node.js.map +1 -1
  25. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js +55 -0
  26. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js.map +1 -0
  27. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js +3 -13
  28. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js.map +1 -1
  29. package/lib/esm/module/GraphCanvas/lib/utils/pointer-getter.js +8 -2
  30. package/lib/esm/module/GraphCanvas/lib/utils/pointer-getter.js.map +1 -1
  31. package/lib/esm/module/GraphCanvas/slices/draw-links.js +207 -0
  32. package/lib/esm/module/GraphCanvas/slices/draw-links.js.map +1 -0
  33. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js +342 -0
  34. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js.map +1 -0
  35. package/lib/esm/module/GraphCanvas/{lib/utils → slices}/draw-text.js +23 -6
  36. package/lib/esm/module/GraphCanvas/slices/draw-text.js.map +1 -0
  37. package/lib/esm/module/GraphCanvas/slices/init-area.js +31 -0
  38. package/lib/esm/module/GraphCanvas/slices/init-area.js.map +1 -0
  39. package/lib/esm/module/GraphCanvas/slices/init-dnd.js +62 -0
  40. package/lib/esm/module/GraphCanvas/slices/init-dnd.js.map +1 -0
  41. package/lib/esm/module/GraphCanvas/slices/init-draw.js +84 -0
  42. package/lib/esm/module/GraphCanvas/slices/init-draw.js.map +1 -0
  43. package/lib/esm/module/GraphCanvas/slices/init-pointer.js +211 -0
  44. package/lib/esm/module/GraphCanvas/slices/init-pointer.js.map +1 -0
  45. package/lib/esm/module/GraphCanvas/slices/init-resize.js +28 -0
  46. package/lib/esm/module/GraphCanvas/slices/init-resize.js.map +1 -0
  47. package/lib/esm/module/GraphCanvas/slices/init-simulation.js +172 -0
  48. package/lib/esm/module/GraphCanvas/slices/init-simulation.js.map +1 -0
  49. package/lib/esm/module/GraphCanvas/slices/init-zoom.js +36 -0
  50. package/lib/esm/module/GraphCanvas/slices/init-zoom.js.map +1 -0
  51. package/lib/index.d.ts +192 -114
  52. package/package.json +1 -1
  53. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.js +0 -20
  54. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.js.map +0 -1
  55. package/lib/esm/module/GraphCanvas/lib/utils/draw-text.js.map +0 -1
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { SimulationNodeDatum, SimulationLinkDatum, Simulation } from 'd3-force';
2
1
  import { D3ZoomEvent, ZoomTransform } from 'd3-zoom';
2
+ import { SimulationNodeDatum, SimulationLinkDatum, Simulation } from 'd3-force';
3
3
  import { D3DragEvent } from 'd3-drag';
4
4
 
5
5
  interface NodeInterface<NodeData extends Record<string, unknown>> extends SimulationNodeDatum {
@@ -8,12 +8,17 @@ interface NodeInterface<NodeData extends Record<string, unknown>> extends Simula
8
8
  group?: number | string;
9
9
  neighbors?: (string | number)[];
10
10
  _radius?: number;
11
+ _width?: number;
12
+ _height?: number;
13
+ _borderRadius?: number;
11
14
  _visible?: boolean;
15
+ _shape?: NodeShape;
12
16
  name?: string;
13
- data?: NodeData;
14
17
  drag?: boolean;
18
+ data?: NodeData;
15
19
  }
16
- type CachedNodeTextInterface = Record<string | number, string[]>;
20
+ type NodeShape = "circle" | "square" | "text" | "icon";
21
+ type CachedNodeTextInterface = Record<string | number, string[] | undefined>;
17
22
 
18
23
  interface LinkInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> extends SimulationLinkDatum<NodeInterface<NodeData>> {
19
24
  data?: LinkData;
@@ -22,11 +27,11 @@ interface LinkInterface<NodeData extends Record<string, unknown>, LinkData exten
22
27
  type ZoomEventInterface = D3ZoomEvent<HTMLCanvasElement, unknown>;
23
28
  type DragEventInterface<NodeData extends Record<string, unknown>> = D3DragEvent<HTMLElement, unknown, NodeInterface<NodeData>>;
24
29
  type ListenersInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
25
- onContextMenu?: (event: MouseEvent, node?: NodeInterface<NodeData>) => void;
26
- onClick?: (event: MouseEvent, node?: NodeInterface<NodeData>) => void;
27
- onDoubleClick?: (event: MouseEvent, node?: NodeInterface<NodeData>) => void;
28
- onWheelClick?: (event: MouseEvent, node?: NodeInterface<NodeData>) => void;
29
- onMove?: (event: MouseEvent, node?: NodeInterface<NodeData>) => void;
30
+ onContextMenu?: (event: MouseEvent, node: NodeInterface<NodeData> | undefined, link: LinkInterface<NodeData, LinkData> | undefined) => void;
31
+ onClick?: (event: MouseEvent | TouchEvent, node: NodeInterface<NodeData> | undefined, link: LinkInterface<NodeData, LinkData> | undefined) => void;
32
+ onDoubleClick?: (event: MouseEvent | TouchEvent, node: NodeInterface<NodeData> | undefined, link: LinkInterface<NodeData, LinkData> | undefined) => void;
33
+ onWheelClick?: (event: MouseEvent, node: NodeInterface<NodeData> | undefined, link: LinkInterface<NodeData, LinkData> | undefined) => void;
34
+ onMove?: (event: MouseEvent | TouchEvent, node: NodeInterface<NodeData> | undefined, link: LinkInterface<NodeData, LinkData> | undefined) => void;
30
35
  onZoom?: (event: ZoomEventInterface) => void;
31
36
  onDragSubject?: (event: DragEventInterface<NodeData>, state: GraphState<NodeData, LinkData>) => NodeInterface<NodeData> | undefined;
32
37
  onDraw?: (state: GraphState<NodeData, LinkData>, toggleHighlightStatus: (status: boolean) => void, clearHighlightState: () => void) => void;
@@ -38,22 +43,8 @@ type ListenersInterface<NodeData extends Record<string, unknown>, LinkData exten
38
43
  };
39
44
 
40
45
  type GraphSettingsInterface<NodeData extends Record<string, unknown>> = {
41
- highlightOnlyRoot?: boolean;
42
- highlightFadingMin?: number;
43
- highlightLinkFadingMin?: number;
44
- highlightArrowFadingMin?: number;
45
- highlightColorFadingMin?: number;
46
- highlightTextFadingMin?: number;
47
- highlightSizingAdditional?: number;
48
- highlightTextSizingAdditional?: number;
49
- highlightTextShiftXAdditional?: number;
50
- highlightTextShiftYAdditional?: number;
51
- highlightTextWeightAdditional?: number;
52
- highlightTextWidthAdditional?: number;
53
- highlightByHover?: boolean;
54
- highlightDownStep?: number;
55
- highlightUpStep?: number;
56
- stickAfterDrag?: boolean;
46
+ highlightDownFrames?: number;
47
+ highlightUpFrames?: number;
57
48
  zoomExtent?: [number, number];
58
49
  translateExtent?: [[number?, number?], [number?, number?]];
59
50
  translateExtentCoefficient?: number | [number, number];
@@ -63,16 +54,18 @@ type GraphSettingsInterface<NodeData extends Record<string, unknown>> = {
63
54
  x?: number;
64
55
  y?: number;
65
56
  } | null;
66
- dragPlaceCoefficient?: (node: NodeInterface<NodeData>, pxEvent: number, pyEvent: number, radius: number) => number | undefined;
67
- nodeRadiusInitial?: number;
68
- nodeRadiusCoefficient?: number;
69
- nodeRadiusFactor?: number;
70
- nodeRadiusFlexible?: boolean;
57
+ dragPlaceCoefficient?: (node: NodeInterface<NodeData>, pxEvent: number, pyEvent: number) => number | undefined;
71
58
  showDrawTime?: boolean;
72
59
  showDrawTimeEveryTick?: boolean;
73
60
  };
74
61
  type ForceSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
75
- collideOn?: boolean;
62
+ forces?: boolean;
63
+ xForce?: boolean;
64
+ yForce?: boolean;
65
+ chargeForce?: boolean;
66
+ centerForce?: boolean;
67
+ collideForce?: boolean;
68
+ linkForce?: boolean;
76
69
  collideOffMax?: {
77
70
  nodes: number;
78
71
  links: number;
@@ -92,14 +85,53 @@ type ForceSettingsInterface<NodeData extends Record<string, unknown>, LinkData e
92
85
  y?: number;
93
86
  };
94
87
  centerStrength?: number;
95
- xForce?: NodeIterationPropsInterface<NodeData, LinkData> | number;
88
+ xPosition?: NodeIterationPropsInterface<NodeData, LinkData> | number;
96
89
  xStrength?: NodeIterationPropsInterface<NodeData, LinkData> | number;
97
- yForce?: NodeIterationPropsInterface<NodeData, LinkData> | number;
90
+ yPosition?: NodeIterationPropsInterface<NodeData, LinkData> | number;
98
91
  yStrength?: NodeIterationPropsInterface<NodeData, LinkData> | number;
99
92
  };
100
93
  type NodeSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
101
94
  cache?: boolean;
102
95
  idGetter?: NodeIterationPropsInterface<NodeData, LinkData, string | number>;
96
+ highlightByNodeOnlyRoot?: boolean;
97
+ highlightByNodeNodeFadingMin?: number;
98
+ highlightByNodeNodeColorFadingMin?: number;
99
+ highlightByNodeNodeSizingAdditional?: number;
100
+ highlightByNodeNodeSizingAdditionalCoefficient?: number;
101
+ highlightByNodeTextFadingMin?: number;
102
+ highlightByNodeTextSizingAdditional?: number;
103
+ highlightByNodeTextShiftXAdditional?: number;
104
+ highlightByNodeTextShiftYAdditional?: number;
105
+ highlightByNodeTextWeightAdditional?: number;
106
+ highlightByNodeTextWidthAdditional?: number;
107
+ highlightByLinkNodeFadingMin?: number;
108
+ highlightByLinkNodeColorFadingMin?: number;
109
+ highlightByLinkTextFadingMin?: number;
110
+ highlightByLinkNodeSizingAdditional?: number;
111
+ highlightByLinkNodeSizingAdditionalCoefficient?: number;
112
+ highlightByLinkTextSizingAdditional?: number;
113
+ highlightByLinkTextShiftXAdditional?: number;
114
+ highlightByLinkTextShiftYAdditional?: number;
115
+ highlightByLinkTextWeightAdditional?: number;
116
+ highlightByLinkTextWidthAdditional?: number;
117
+ highlightByHoverNode?: boolean;
118
+ highlightByNodeNodeFading?: boolean;
119
+ highlightByNodeNodeSizing?: boolean;
120
+ highlightByNodeTextFading?: boolean;
121
+ highlightByNodeTextSizing?: boolean;
122
+ highlightByNodeNodeColor?: boolean;
123
+ highlightByLinkNodeFading?: boolean;
124
+ highlightByLinkNodeSizing?: boolean;
125
+ highlightByLinkTextFading?: boolean;
126
+ highlightByLinkTextSizing?: boolean;
127
+ highlightByLinkNodeColor?: boolean;
128
+ nodeRadiusCoefficient?: number;
129
+ nodeRadiusFactor?: number;
130
+ nodeRadiusFlexible?: boolean;
131
+ nodeSizeFlexible?: boolean;
132
+ nodeSizeCoefficient?: number;
133
+ nodeSizeFactor?: number;
134
+ textNodeDebug?: boolean;
103
135
  options?: NodeIterationPropsInterface<NodeData, LinkData, NodeOptionsInterface<NodeData, LinkData>> | NodeOptionsInterface<NodeData, LinkData>;
104
136
  };
105
137
  type NodeOptionsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
@@ -107,16 +139,17 @@ type NodeOptionsInterface<NodeData extends Record<string, unknown>, LinkData ext
107
139
  textDraw?: ((node: NodeInterface<NodeData>, options: Required<NodeOptionsInterface<NodeData, LinkData>>, state: GraphState<NodeData, LinkData>) => void) | null;
108
140
  nodeExtraDraw?: ((node: NodeInterface<NodeData>, options: Required<NodeOptionsInterface<NodeData, LinkData>>, state: GraphState<NodeData, LinkData>) => void) | null;
109
141
  textExtraDraw?: ((node: NodeInterface<NodeData>, options: Required<NodeOptionsInterface<NodeData, LinkData>>, state: GraphState<NodeData, LinkData>) => void) | null;
110
- highlightFading?: boolean;
111
- highlightSizing?: boolean;
112
- highlightTextFading?: boolean;
113
- highlightTextSizing?: boolean;
114
- highlightColor?: boolean;
142
+ shape?: NodeShape;
143
+ width?: number;
144
+ height?: number;
145
+ borderRadius?: number;
115
146
  borderColor?: string;
116
147
  borderWidth?: number;
117
148
  radius?: number;
118
149
  alpha?: number;
119
150
  color?: string;
151
+ textNodeYPadding?: number;
152
+ textNodeXPadding?: number;
120
153
  textVisible?: boolean;
121
154
  text?: string | null;
122
155
  textAlpha?: number;
@@ -134,7 +167,22 @@ type NodeOptionsInterface<NodeData extends Record<string, unknown>, LinkData ext
134
167
  type NodeIterationPropsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Return = number> = (node: NodeInterface<NodeData>, i: number, nodes: NodeInterface<NodeData>[], state?: GraphState<NodeData, LinkData>) => Return;
135
168
  type LinkSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
136
169
  particles?: boolean;
170
+ pretty?: boolean;
171
+ arrow?: boolean;
172
+ arrowByHighlight?: boolean;
137
173
  cache?: boolean;
174
+ particleFlexSpeed?: boolean;
175
+ particleFlexSpeedCoefficient?: number;
176
+ highlightByNodeLinkFadingMin?: number;
177
+ highlightByNodeArrowFadingMin?: number;
178
+ highlightByLinkArrowFadingMin?: number;
179
+ highlightByLinkLinkFadingMin?: number;
180
+ highlightByHoverLink?: boolean;
181
+ highlightByNodeLinkFading?: boolean;
182
+ highlightByNodeArrowFading?: boolean;
183
+ highlightByLinkLinkFading?: boolean;
184
+ highlightByLinkArrowFading?: boolean;
185
+ hoverLinkThreshold?: number;
138
186
  options?: LinkIterationPropsInterface<NodeData, LinkData, LinkOptionsInterface<NodeData, LinkData>> | LinkOptionsInterface<NodeData, LinkData>;
139
187
  };
140
188
  type LinkOptionsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
@@ -143,14 +191,13 @@ type LinkOptionsInterface<NodeData extends Record<string, unknown>, LinkData ext
143
191
  alpha?: number;
144
192
  color?: string;
145
193
  width?: number;
146
- highlightFading?: boolean;
147
- pretty?: boolean;
148
- arrow?: boolean;
149
194
  arrowAlpha?: number;
150
195
  arrowColor?: string;
151
196
  arrowSize?: number;
152
- arrowHighlightFading?: boolean;
153
- arrowReverseAppear?: boolean;
197
+ arrowBorderColor?: string;
198
+ arrowBorderWidth?: number;
199
+ particleBorderColor?: string;
200
+ particleBorderWidth?: number;
154
201
  particleAlpha?: number;
155
202
  particleColor?: string;
156
203
  particleRadius?: number;
@@ -180,6 +227,7 @@ type GraphState<NodeData extends Record<string, unknown>, LinkData extends Recor
180
227
  simulationWorking: boolean;
181
228
  isDragging: boolean;
182
229
  highlightedNode: NodeInterface<NodeData> | null;
230
+ highlightedLink: LinkInterface<NodeData, LinkData> | null;
183
231
  highlightedNeighbors: Set<string | number> | null;
184
232
  highlightProgress: number;
185
233
  highlightWorking: boolean;
@@ -200,47 +248,50 @@ type RGB = {
200
248
  };
201
249
  type GraphParticle = {
202
250
  step: number;
203
- wait: number;
251
+ index: number;
252
+ prev: GraphParticle | undefined;
253
+ next: GraphParticle | undefined;
204
254
  x?: number;
205
255
  y?: number;
206
- sourceId: number;
207
- targetId: number;
256
+ sourceId: string | number;
257
+ targetId: string | number;
208
258
  };
209
259
 
210
260
  declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> {
211
261
  /** initial data */
212
- private nodes;
213
- private links;
214
- private particles;
215
- private width;
216
- private height;
217
- private root;
218
- private container;
219
- private area;
262
+ protected nodes: NodeInterface<NodeData>[];
263
+ protected links: LinkInterface<NodeData, LinkData>[];
264
+ protected particles: Record<string, GraphParticle[]>;
265
+ protected width: number;
266
+ protected height: number;
267
+ protected root: HTMLElement;
268
+ protected container: HTMLDivElement | undefined | null;
269
+ protected area: HTMLCanvasElement | null | undefined;
220
270
  /** settings */
221
- private graphSettings;
222
- private forceSettings;
223
- private nodeSettings;
224
- private linkSettings;
225
- private listeners;
271
+ protected graphSettings: Required<GraphSettingsInterface<NodeData>>;
272
+ protected forceSettings: Required<ForceSettingsInterface<NodeData, LinkData>>;
273
+ protected nodeSettings: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, "options">> & Pick<NodeSettingsInterface<NodeData, LinkData>, "options">;
274
+ protected linkSettings: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, "options">> & Pick<LinkSettingsInterface<NodeData, LinkData>, "options">;
275
+ protected listeners: ListenersInterface<NodeData, LinkData>;
226
276
  /** service */
227
- private context;
228
- private simulation;
229
- private areaTransform;
230
- private areaRect;
231
- private draw;
232
- private eventAbortController;
233
- private cachedNodeText;
234
- private linkOptionsCache;
235
- private nodeOptionsCache;
236
- private isDragging;
237
- private highlightedNode;
238
- private highlightedNeighbors;
239
- private highlightProgress;
240
- private highlightWorking;
241
- private highlightDrawing;
242
- private get simulationWorking();
243
- private get state();
277
+ protected context: CanvasRenderingContext2D | null | undefined;
278
+ protected simulation: GraphCanvasSimulation<NodeData, LinkData> | undefined;
279
+ protected areaTransform: ZoomTransform;
280
+ protected areaRect: DOMRect | undefined;
281
+ protected draw: (this: GraphCanvas<NodeData, LinkData>) => void;
282
+ protected eventAbortController: AbortController;
283
+ protected cachedNodeText: CachedNodeTextInterface;
284
+ protected linkOptionsCache: Record<string, Required<LinkOptionsInterface<NodeData, LinkData>>>;
285
+ protected nodeOptionsCache: Record<string, Required<NodeOptionsInterface<NodeData, LinkData>>>;
286
+ protected isDragging: boolean;
287
+ protected highlightedNode: NodeInterface<NodeData> | null;
288
+ protected highlightedLink: LinkInterface<NodeData, LinkData> | null;
289
+ protected highlightedNeighbors: Set<string | number> | null;
290
+ protected highlightProgress: number;
291
+ protected highlightWorking: boolean;
292
+ protected highlightDrawing: boolean;
293
+ protected get simulationWorking(): boolean;
294
+ protected get state(): GraphState<NodeData, LinkData>;
244
295
  constructor({ links, nodes, root, forceSettings, linkSettings, listeners, nodeSettings, graphSettings, }: GraphCanvasInterface<NodeData, LinkData>);
245
296
  get dpi(): number;
246
297
  getData(): Pick<GraphCanvasInterface<NodeData, LinkData>, "nodes" | "links">;
@@ -254,22 +305,13 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
254
305
  stop(): void;
255
306
  create(): void;
256
307
  destroy(): void;
257
- private clearHTMLElements;
258
- private updateSimulation;
259
- private clearState;
260
- private clearDataDependencies;
261
- private updateData;
262
- private updateSize;
263
- private init;
264
- private initSimulation;
265
- private initSimulationForces;
266
- private initCollideForce;
267
- private initArea;
268
- private initDraw;
269
- private initResize;
270
- private initPointer;
271
- private initDnd;
272
- private initZoom;
308
+ protected clearHTMLElements(): void;
309
+ protected updateSimulation(): void;
310
+ protected clearState(): void;
311
+ protected clearDataDependencies(): void;
312
+ protected updateData(alpha?: number): void;
313
+ protected updateSize(): void;
314
+ protected init(): void;
273
315
  }
274
316
 
275
317
  declare function linkOptionsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(_: LinkInterface<NodeData, LinkData>, __: number, ___: LinkInterface<NodeData, LinkData>[], state?: GraphState<NodeData, LinkData>): Required<LinkOptionsInterface<NodeData, LinkData>>;
@@ -287,32 +329,23 @@ declare function nodeRadiusGetter({ radiusFlexible, radiusInitial, linkCount, ra
287
329
  declare function linkIterationExtractor<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Result extends string | number | boolean | Record<string, unknown> | unknown[]>(link: LinkInterface<NodeData, LinkData>, i: number, links: LinkInterface<NodeData, LinkData>[], state: GraphState<NodeData, LinkData>, option: LinkIterationPropsInterface<NodeData, LinkData, Result> | Result, optionConstantGetter: undefined): Result;
288
330
  declare function linkIterationExtractor<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Result extends string | number | boolean | Record<string, unknown> | unknown[]>(link: LinkInterface<NodeData, LinkData>, i: number, links: LinkInterface<NodeData, LinkData>[], state: GraphState<NodeData, LinkData>, option: LinkIterationPropsInterface<NodeData, LinkData, Result> | Result, optionConstantGetter: LinkIterationPropsInterface<NodeData, LinkData, Required<Result>> | Required<Result>): Required<Result>;
289
331
 
332
+ type NodeByPointerGetterOptions<NodeData extends Record<string, unknown>> = {
333
+ mouseEvent: MouseEvent | TouchEvent;
334
+ areaRect: DOMRect | undefined;
335
+ areaTransform: ZoomTransform;
336
+ nodes: NodeInterface<NodeData>[];
337
+ };
338
+ declare function nodeByPointerGetter<NodeData extends Record<string, unknown>>({ areaRect, areaTransform, mouseEvent, nodes, }: NodeByPointerGetterOptions<NodeData>): NodeInterface<NodeData> | undefined;
339
+
290
340
  declare function nodeIterationExtractor<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Result extends string | number | boolean | Record<string, unknown> | unknown[] | undefined | null>(node: NodeInterface<NodeData>, i: number, nodes: NodeInterface<NodeData>[], state: GraphState<NodeData, LinkData>, option: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result, optionConstantGetter: undefined): Result;
291
341
  declare function nodeIterationExtractor<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Result extends string | number | boolean | Record<string, unknown> | unknown[] | undefined | null>(node: NodeInterface<NodeData>, i: number, nodes: NodeInterface<NodeData>[], state: GraphState<NodeData, LinkData>, option: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result, optionConstantGetter: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result): Required<Result>;
292
342
 
293
- type DrawTextOptions = {
294
- id: string | number;
295
- x: number;
296
- y: number;
297
- text: string;
298
- textSize: number;
299
- textStyle: TextStyleEnum;
300
- textWeight: number;
301
- textFont: string;
302
- textColor: string;
303
- textGap: number;
304
- textAlign: CanvasTextAlign;
305
- context: CanvasRenderingContext2D;
306
- cachedNodeText: CachedNodeTextInterface;
307
- maxWidth?: number;
308
- };
309
- declare function drawText({ context, id, textAlign, textColor, textFont, textStyle, textGap, textWeight, textSize, text, x, y, cachedNodeText, maxWidth, }: DrawTextOptions): void;
310
-
311
- declare function calculateLinkPositionByRadius<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(link: LinkInterface<NodeData, LinkData>, arrowSize?: number): {
343
+ declare function calculateLinkPositionByNode<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(link: LinkInterface<NodeData, LinkData>, arrowSize?: number): {
312
344
  x1: number;
313
345
  y1: number;
314
346
  x2: number;
315
347
  y2: number;
348
+ distance: number;
316
349
  } | null;
317
350
 
318
351
  declare function animationByProgress(initial: number, additional: number, progress: number): number;
@@ -324,9 +357,42 @@ type GetParticlePositionOptions = {
324
357
  xEnd: number;
325
358
  yEnd: number;
326
359
  totalSteps: number;
360
+ totalCount: number;
361
+ distance: number;
327
362
  };
328
363
  declare function getParticlePosition(opts: GetParticlePositionOptions): void;
329
364
 
365
+ type LinkByPointerGetterOptions<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
366
+ mouseEvent: MouseEvent | TouchEvent;
367
+ areaRect: DOMRect | undefined;
368
+ areaTransform: ZoomTransform;
369
+ links: LinkInterface<NodeData, LinkData>[];
370
+ linkSettings: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, "options">> & Pick<LinkSettingsInterface<NodeData, LinkData>, "options">;
371
+ };
372
+ declare function linkByPointerGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>({ areaRect, areaTransform, mouseEvent, links, linkSettings, }: LinkByPointerGetterOptions<NodeData, LinkData>): LinkInterface<NodeData, LinkData> | undefined;
373
+
374
+ declare function getDrawLink<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(state: GraphState<NodeData, LinkData>): (this: GraphCanvas<NodeData, LinkData>, link: LinkInterface<NodeData, LinkData>, index: number) => void;
375
+
376
+ declare function getDrawNode<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(nodeRenders: (() => void)[], textRenders: (() => void)[], state: GraphState<NodeData, LinkData>): (this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>, index: number) => void;
377
+
378
+ type DrawTextOptions = {
379
+ id: string | number;
380
+ x: number;
381
+ y: number;
382
+ text: string;
383
+ textSize: number;
384
+ textStyle: TextStyleEnum;
385
+ textWeight: number;
386
+ textFont: string;
387
+ textColor: string;
388
+ textGap: number;
389
+ textAlign: CanvasTextAlign;
390
+ context: CanvasRenderingContext2D;
391
+ cachedNodeText: CachedNodeTextInterface;
392
+ maxWidth?: number;
393
+ };
394
+ declare function drawText({ context, id, textAlign, textColor, textFont, textStyle, textGap, textWeight, textSize, text, x, y, cachedNodeText, maxWidth, }: DrawTextOptions): void;
395
+
330
396
  declare function colorToRgb(color: string): string | null;
331
397
 
332
398
  declare function extractRgb(color: string | null): {
@@ -360,11 +426,23 @@ type GraphSettingsInputColorBox<I extends string> = {
360
426
  initialValue: string;
361
427
  label: string;
362
428
  };
363
- type GraphSettingsInputInterface<I extends string> = GraphSettingsInputRange<I> | GraphSettingsInputCheckBox<I> | GraphSettingsInputColorBox<I>;
429
+ type GraphSettingsInputSelect<I extends string> = {
430
+ type: "select";
431
+ id: I;
432
+ initialValue: string;
433
+ label: string;
434
+ options: {
435
+ label: string;
436
+ value: string;
437
+ }[];
438
+ };
439
+ type GraphSettingsInputInterface<I extends string> = GraphSettingsInputRange<I> | GraphSettingsInputCheckBox<I> | GraphSettingsInputColorBox<I> | GraphSettingsInputSelect<I>;
364
440
 
365
441
  declare function getForceControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: (keyof ForceSettingsInterface<NodeData, LinkData>)[]): GraphSettingsInputInterface<keyof ForceSettingsInterface<NodeData, LinkData>>[];
366
442
  declare function getGraphControls<NodeData extends Record<string, unknown>>(keys?: (keyof GraphSettingsInterface<NodeData>)[]): GraphSettingsInputInterface<keyof GraphSettingsInterface<NodeData>>[];
367
- declare function getNodeControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: (keyof NodeOptionsInterface<NodeData, LinkData>)[]): GraphSettingsInputInterface<keyof NodeOptionsInterface<NodeData, LinkData>>[];
368
- declare function getLinkControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: (keyof LinkOptionsInterface<NodeData, LinkData>)[]): GraphSettingsInputInterface<keyof LinkOptionsInterface<NodeData, LinkData>>[];
443
+ declare function getNodeSettingControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: keyof Omit<Required<NodeSettingsInterface<NodeData, LinkData>>, "options" | "idGetter">): GraphSettingsInputInterface<"cache" | "highlightByNodeOnlyRoot" | "highlightByNodeNodeFadingMin" | "highlightByNodeNodeColorFadingMin" | "highlightByNodeNodeSizingAdditional" | "highlightByNodeNodeSizingAdditionalCoefficient" | "highlightByNodeTextFadingMin" | "highlightByNodeTextSizingAdditional" | "highlightByNodeTextShiftXAdditional" | "highlightByNodeTextShiftYAdditional" | "highlightByNodeTextWeightAdditional" | "highlightByNodeTextWidthAdditional" | "highlightByLinkNodeFadingMin" | "highlightByLinkNodeColorFadingMin" | "highlightByLinkTextFadingMin" | "highlightByLinkNodeSizingAdditional" | "highlightByLinkNodeSizingAdditionalCoefficient" | "highlightByLinkTextSizingAdditional" | "highlightByLinkTextShiftXAdditional" | "highlightByLinkTextShiftYAdditional" | "highlightByLinkTextWeightAdditional" | "highlightByLinkTextWidthAdditional" | "highlightByHoverNode" | "highlightByNodeNodeFading" | "highlightByNodeNodeSizing" | "highlightByNodeTextFading" | "highlightByNodeTextSizing" | "highlightByNodeNodeColor" | "highlightByLinkNodeFading" | "highlightByLinkNodeSizing" | "highlightByLinkTextFading" | "highlightByLinkTextSizing" | "highlightByLinkNodeColor" | "nodeRadiusCoefficient" | "nodeRadiusFactor" | "nodeRadiusFlexible" | "nodeSizeFlexible" | "nodeSizeCoefficient" | "nodeSizeFactor" | "textNodeDebug">[];
444
+ declare function getNodeOptionsControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: (keyof NodeOptionsInterface<NodeData, LinkData>)[]): GraphSettingsInputInterface<keyof NodeOptionsInterface<NodeData, LinkData>>[];
445
+ declare function getLinkSettingsControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: keyof Omit<Required<LinkSettingsInterface<NodeData, LinkData>>, "options">): GraphSettingsInputInterface<"cache" | "particles" | "pretty" | "arrow" | "arrowByHighlight" | "particleFlexSpeed" | "particleFlexSpeedCoefficient" | "highlightByNodeLinkFadingMin" | "highlightByNodeArrowFadingMin" | "highlightByLinkArrowFadingMin" | "highlightByLinkLinkFadingMin" | "highlightByHoverLink" | "highlightByNodeLinkFading" | "highlightByNodeArrowFading" | "highlightByLinkLinkFading" | "highlightByLinkArrowFading" | "hoverLinkThreshold">[];
446
+ declare function getLinkOptionsControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: (keyof LinkOptionsInterface<NodeData, LinkData>)[]): GraphSettingsInputInterface<keyof LinkOptionsInterface<NodeData, LinkData>>[];
369
447
 
370
- export { type CachedNodeTextInterface, type DragEventInterface, type ForceSettingsInterface, GraphCanvas, type GraphCanvasInterface, type GraphCanvasSimulation, type GraphParticle, type GraphSettingsInterface, type GraphState, type LinkInterface, type LinkIterationPropsInterface, type LinkOptionsInterface, type LinkSettingsInterface, type ListenersInterface, type NodeInterface, type NodeIterationPropsInterface, type NodeOptionsInterface, type NodeSettingsInterface, type RGB, type TextStyleEnum, type ZoomEventInterface, animationByProgress, calculateLinkPositionByRadius, colorToRgb, drawText, extractRgb, fadeRgb, getForceControls, getGraphControls, getLinkControls, getNodeControls, getParticlePosition, linkIterationExtractor, linkOptionsGetter, nodeIterationExtractor, nodeOptionsGetter, nodeRadiusGetter, rgbAnimationByProgress };
448
+ export { type CachedNodeTextInterface, type DragEventInterface, type ForceSettingsInterface, GraphCanvas, type GraphCanvasInterface, type GraphCanvasSimulation, type GraphParticle, type GraphSettingsInterface, type GraphState, type LinkInterface, type LinkIterationPropsInterface, type LinkOptionsInterface, type LinkSettingsInterface, type ListenersInterface, type NodeInterface, type NodeIterationPropsInterface, type NodeOptionsInterface, type NodeSettingsInterface, type NodeShape, type RGB, type TextStyleEnum, type ZoomEventInterface, animationByProgress, calculateLinkPositionByNode, colorToRgb, drawText, extractRgb, fadeRgb, getDrawLink, getDrawNode, getForceControls, getGraphControls, getLinkOptionsControls, getLinkSettingsControls, getNodeOptionsControls, getNodeSettingControls, getParticlePosition, linkByPointerGetter, linkIterationExtractor, linkOptionsGetter, nodeByPointerGetter, nodeIterationExtractor, nodeOptionsGetter, nodeRadiusGetter, rgbAnimationByProgress };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krainovsd/graph",
3
- "version": "0.8.4",
3
+ "version": "0.10.0-rc1",
4
4
  "description": "Krainov graph",
5
5
  "type": "module",
6
6
  "author": "KrainovSD <denislosev48@gmail.com>",
@@ -1,20 +0,0 @@
1
- function calculateLinkPositionByRadius(link, arrowSize = 0) {
2
- const source = link.source;
3
- const target = link.target;
4
- if (typeof source != "object" || typeof target != "object")
5
- return null;
6
- const dx = (target.x ?? 0) - (source.x ?? 0);
7
- const dy = (target.y ?? 0) - (source.y ?? 0);
8
- const dr = Math.sqrt(dx * dx + dy * dy);
9
- const sourceRadius = source._radius ?? 0;
10
- const targetRadius = (target._radius ?? 0) + (arrowSize > 0 ? arrowSize * 0.85 : 0);
11
- return {
12
- x1: (source.x ?? 0) + (dx * sourceRadius) / dr,
13
- y1: (source.y ?? 0) + (dy * sourceRadius) / dr,
14
- x2: (target.x ?? 0) - (dx * targetRadius) / dr,
15
- y2: (target.y ?? 0) - (dy * targetRadius) / dr,
16
- };
17
- }
18
-
19
- export { calculateLinkPositionByRadius };
20
- //# sourceMappingURL=calculate-link-position-by-radius.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculate-link-position-by-radius.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.ts"],"sourcesContent":["import type { LinkInterface } from \"@/types\";\n\nexport function calculateLinkPositionByRadius<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(link: LinkInterface<NodeData, LinkData>, arrowSize = 0) {\n const source = link.source;\n const target = link.target;\n\n if (typeof source != \"object\" || typeof target != \"object\") return null;\n\n const dx = (target.x ?? 0) - (source.x ?? 0);\n const dy = (target.y ?? 0) - (source.y ?? 0);\n const dr = Math.sqrt(dx * dx + dy * dy);\n const sourceRadius = source._radius ?? 0;\n const targetRadius = (target._radius ?? 0) + (arrowSize > 0 ? arrowSize * 0.85 : 0);\n\n return {\n x1: (source.x ?? 0) + (dx * sourceRadius) / dr,\n y1: (source.y ?? 0) + (dy * sourceRadius) / dr,\n x2: (target.x ?? 0) - (dx * targetRadius) / dr,\n y2: (target.y ?? 0) - (dy * targetRadius) / dr,\n };\n}\n"],"names":[],"mappings":"SAEgB,6BAA6B,CAG3C,IAAuC,EAAE,SAAS,GAAG,CAAC,EAAA;AACtD,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;IAE1B,IAAI,OAAO,MAAM,IAAI,QAAQ,IAAI,OAAO,MAAM,IAAI,QAAQ;AAAE,QAAA,OAAO,IAAI;AAEvE,IAAA,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5C,IAAA,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5C,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACvC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC;IACxC,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;IAEnF,OAAO;AACL,QAAA,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,IAAI,EAAE;AAC9C,QAAA,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,IAAI,EAAE;AAC9C,QAAA,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,IAAI,EAAE;AAC9C,QAAA,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,IAAI,EAAE;KAC/C;AACH;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"draw-text.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/draw-text.ts"],"sourcesContent":["import type { CachedNodeTextInterface } from \"@/types\";\nimport type { TextStyleEnum } from \"../../types\";\n\nexport type DrawTextOptions = {\n id: string | number;\n x: number;\n y: number;\n text: string;\n textSize: number;\n textStyle: TextStyleEnum;\n textWeight: number;\n textFont: string;\n textColor: string;\n textGap: number;\n textAlign: CanvasTextAlign;\n context: CanvasRenderingContext2D;\n cachedNodeText: CachedNodeTextInterface;\n maxWidth?: number;\n};\n\nconst SPACE = \" \";\n\nexport function drawText({\n context,\n id,\n textAlign,\n textColor,\n textFont,\n textStyle,\n textGap,\n textWeight,\n textSize,\n text,\n x,\n y,\n cachedNodeText,\n maxWidth,\n}: DrawTextOptions) {\n context.font = `${textStyle} normal ${textWeight} ${textSize}px ${textFont}`;\n context.fillStyle = textColor;\n context.textAlign = textAlign;\n\n if (cachedNodeText[id] != undefined) {\n cachedNodeText[id].forEach((line, index) => {\n context.fillText(line, x, y + index * textSize + index * textGap);\n });\n\n return;\n }\n\n if (maxWidth == undefined || context.measureText(text).width <= maxWidth) {\n cachedNodeText[id] = [text];\n context.fillText(text, x, y);\n\n return;\n }\n\n const spaceWidth = context.measureText(\" \").width;\n const lines: string[] = [];\n let lineWidth = 0;\n let line = \"\";\n\n for (const word of text.split(\" \")) {\n const size = context.measureText(word).width;\n lineWidth += size;\n\n if (line === \"\") {\n line = word;\n\n continue;\n }\n if (lineWidth > maxWidth) {\n lineWidth = 0;\n lines.push(line);\n line = word;\n } else {\n lineWidth += spaceWidth;\n line += `${SPACE}${word}`;\n }\n }\n\n if (line !== \"\") lines.push(line);\n\n cachedNodeText[id] = lines;\n lines.forEach((line, index) => {\n context.fillText(line, x, y + index * textSize + index * textGap);\n });\n}\n"],"names":[],"mappings":"AAoBA,MAAM,KAAK,GAAG,GAAG;AAED,SAAA,QAAQ,CAAC,EACvB,OAAO,EACP,EAAE,EACF,SAAS,EACT,SAAS,EACT,QAAQ,EACR,SAAS,EACT,OAAO,EACP,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,CAAC,EACD,CAAC,EACD,cAAc,EACd,QAAQ,GACQ,EAAA;AAChB,IAAA,OAAO,CAAC,IAAI,GAAG,CAAA,EAAG,SAAS,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAE;AAC5E,IAAA,OAAO,CAAC,SAAS,GAAG,SAAS;AAC7B,IAAA,OAAO,CAAC,SAAS,GAAG,SAAS;AAE7B,IAAA,IAAI,cAAc,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE;QACnC,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACzC,YAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;AACnE,SAAC,CAAC;QAEF;;AAGF,IAAA,IAAI,QAAQ,IAAI,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,QAAQ,EAAE;AACxE,QAAA,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAE5B;;IAGF,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK;IACjD,MAAM,KAAK,GAAa,EAAE;IAC1B,IAAI,SAAS,GAAG,CAAC;IACjB,IAAI,IAAI,GAAG,EAAE;IAEb,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK;QAC5C,SAAS,IAAI,IAAI;AAEjB,QAAA,IAAI,IAAI,KAAK,EAAE,EAAE;YACf,IAAI,GAAG,IAAI;YAEX;;AAEF,QAAA,IAAI,SAAS,GAAG,QAAQ,EAAE;YACxB,SAAS,GAAG,CAAC;AACb,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAChB,IAAI,GAAG,IAAI;;aACN;YACL,SAAS,IAAI,UAAU;AACvB,YAAA,IAAI,IAAI,CAAG,EAAA,KAAK,CAAG,EAAA,IAAI,EAAE;;;IAI7B,IAAI,IAAI,KAAK,EAAE;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAEjC,IAAA,cAAc,CAAC,EAAE,CAAC,GAAG,KAAK;IAC1B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC5B,QAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;AACnE,KAAC,CAAC;AACJ;;;;"}