layerchart 2.0.0-next.24 → 2.0.0-next.26
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.
- package/dist/components/charts/ArcChart.svelte +3 -1
- package/dist/components/charts/AreaChart.svelte +2 -1
- package/dist/components/charts/BarChart.svelte +1 -0
- package/dist/components/charts/LineChart.svelte +2 -1
- package/dist/components/charts/PieChart.svelte +3 -1
- package/dist/components/charts/ScatterChart.svelte +2 -1
- package/dist/components/tooltip/TooltipContext.svelte +22 -7
- package/dist/components/tooltip/TooltipContext.svelte.d.ts +1 -1
- package/dist/utils/array.d.ts +10 -0
- package/dist/utils/array.js +17 -0
- package/dist/utils/array.test.d.ts +1 -0
- package/dist/utils/array.test.js +162 -0
- package/package.json +2 -2
|
@@ -384,7 +384,9 @@
|
|
|
384
384
|
]}
|
|
385
385
|
padding={{ bottom: legend === true ? 32 : 0 }}
|
|
386
386
|
{...restProps}
|
|
387
|
-
tooltip={tooltip === false
|
|
387
|
+
tooltip={tooltip === false
|
|
388
|
+
? false
|
|
389
|
+
: { ...props.tooltip?.context, ...(typeof tooltip === 'object' ? tooltip : null) }}
|
|
388
390
|
>
|
|
389
391
|
{#snippet children({ context })}
|
|
390
392
|
{@const snippetProps = {
|
|
@@ -443,10 +443,11 @@
|
|
|
443
443
|
tooltip={tooltip === false
|
|
444
444
|
? false
|
|
445
445
|
: {
|
|
446
|
-
mode: '
|
|
446
|
+
mode: 'quadtree-x',
|
|
447
447
|
onclick: onTooltipClick,
|
|
448
448
|
debug,
|
|
449
449
|
...props.tooltip?.context,
|
|
450
|
+
...(typeof tooltip === 'object' ? tooltip : null),
|
|
450
451
|
}}
|
|
451
452
|
brush={brush && (brush === true || brush.mode == undefined || brush.mode === 'integrated')
|
|
452
453
|
? {
|
|
@@ -343,10 +343,11 @@
|
|
|
343
343
|
tooltip={tooltip === false
|
|
344
344
|
? false
|
|
345
345
|
: {
|
|
346
|
-
mode: '
|
|
346
|
+
mode: 'quadtree-x',
|
|
347
347
|
onclick: onTooltipClick,
|
|
348
348
|
debug,
|
|
349
349
|
...props.tooltip?.context,
|
|
350
|
+
...(typeof tooltip === 'object' ? tooltip : null),
|
|
350
351
|
}}
|
|
351
352
|
brush={brush && (brush === true || brush.mode == undefined || brush.mode === 'integrated')
|
|
352
353
|
? {
|
|
@@ -409,7 +409,9 @@
|
|
|
409
409
|
]}
|
|
410
410
|
padding={{ bottom: legend === true ? 32 : 0 }}
|
|
411
411
|
{...restProps}
|
|
412
|
-
tooltip={tooltip === false
|
|
412
|
+
tooltip={tooltip === false
|
|
413
|
+
? false
|
|
414
|
+
: { ...props.tooltip?.context, ...(typeof tooltip === 'object' ? tooltip : null) }}
|
|
413
415
|
>
|
|
414
416
|
{#snippet children({ context })}
|
|
415
417
|
{@const snippetProps = {
|
|
@@ -253,10 +253,11 @@
|
|
|
253
253
|
tooltip={tooltip === false
|
|
254
254
|
? false
|
|
255
255
|
: {
|
|
256
|
-
mode: '
|
|
256
|
+
mode: 'quadtree',
|
|
257
257
|
onclick: onTooltipClick,
|
|
258
258
|
debug,
|
|
259
259
|
...props.tooltip?.context,
|
|
260
|
+
...(typeof tooltip === 'object' ? tooltip : null),
|
|
260
261
|
}}
|
|
261
262
|
brush={brush && (brush === true || brush.mode == undefined || brush.mode === 'integrated')
|
|
262
263
|
? {
|
|
@@ -6,13 +6,15 @@
|
|
|
6
6
|
const _TooltipContext = new Context<TooltipContextValue>('TooltipContext');
|
|
7
7
|
|
|
8
8
|
type TooltipMode =
|
|
9
|
-
| 'bisect-x'
|
|
10
|
-
| 'bisect-y'
|
|
9
|
+
| 'bisect-x' // requires values to be sorted
|
|
10
|
+
| 'bisect-y' // requires values to be sorted
|
|
11
11
|
| 'band'
|
|
12
|
-
| 'bisect-band'
|
|
12
|
+
| 'bisect-band' // requires values to be sorted
|
|
13
13
|
| 'bounds'
|
|
14
14
|
| 'voronoi'
|
|
15
15
|
| 'quadtree'
|
|
16
|
+
| 'quadtree-x' // ignores y values (constant 0)
|
|
17
|
+
| 'quadtree-y' // ignores x values (constant 0)
|
|
16
18
|
| 'manual';
|
|
17
19
|
|
|
18
20
|
export type TooltipContextValue<T = any> = {
|
|
@@ -298,7 +300,6 @@
|
|
|
298
300
|
}
|
|
299
301
|
|
|
300
302
|
// If tooltipData not provided already (voronoi, etc), attempt to find it
|
|
301
|
-
// TODO: When using bisect-x/y/band, values should be sorted. Typically they are for `x`, but not `y` (and band depends on if x or y scale)
|
|
302
303
|
if (tooltipData == null) {
|
|
303
304
|
switch (mode) {
|
|
304
305
|
case 'bisect-x': {
|
|
@@ -311,6 +312,7 @@
|
|
|
311
312
|
xValueAtPoint = scaleInvert(ctx.xScale, point.x - ctx.padding.left);
|
|
312
313
|
}
|
|
313
314
|
|
|
315
|
+
// Requires values to be sorted
|
|
314
316
|
const index = bisectX(ctx.flatData, xValueAtPoint, 1);
|
|
315
317
|
const previousValue = ctx.flatData[index - 1];
|
|
316
318
|
const currentValue = ctx.flatData[index];
|
|
@@ -322,6 +324,7 @@
|
|
|
322
324
|
// `y` value at pointer coordinate
|
|
323
325
|
const yValueAtPoint = scaleInvert(ctx.yScale, point.y - ctx.padding.top);
|
|
324
326
|
|
|
327
|
+
// Requires values to be sorted
|
|
325
328
|
const index = bisectY(ctx.flatData, yValueAtPoint, 1);
|
|
326
329
|
const previousValue = ctx.flatData[index - 1];
|
|
327
330
|
const currentValue = ctx.flatData[index];
|
|
@@ -339,6 +342,7 @@
|
|
|
339
342
|
const bandData = ctx.flatData
|
|
340
343
|
.filter((d) => ctx.x(d) === xValueAtPoint)
|
|
341
344
|
.sort(sortFunc(ctx.y as () => any)); // sort for bisect
|
|
345
|
+
// Requires values to be sorted
|
|
342
346
|
const index = bisectY(bandData, yValueAtPoint, 1);
|
|
343
347
|
const previousValue = bandData[index - 1];
|
|
344
348
|
const currentValue = bandData[index];
|
|
@@ -348,6 +352,7 @@
|
|
|
348
352
|
const bandData = ctx.flatData
|
|
349
353
|
.filter((d) => ctx.y(d) === yValueAtPoint)
|
|
350
354
|
.sort(sortFunc(ctx.x as () => any)); // sort for bisect
|
|
355
|
+
// Requires values to be sorted
|
|
351
356
|
const index = bisectX(bandData, xValueAtPoint, 1);
|
|
352
357
|
const previousValue = bandData[index - 1];
|
|
353
358
|
const currentValue = bandData[index];
|
|
@@ -358,6 +363,8 @@
|
|
|
358
363
|
break;
|
|
359
364
|
}
|
|
360
365
|
|
|
366
|
+
case 'quadtree-x':
|
|
367
|
+
case 'quadtree-y':
|
|
361
368
|
case 'quadtree': {
|
|
362
369
|
tooltipData = quadtree?.find(
|
|
363
370
|
point.x - ctx.padding.left,
|
|
@@ -406,9 +413,13 @@
|
|
|
406
413
|
}
|
|
407
414
|
|
|
408
415
|
const quadtree: Quadtree<[number, number]> | undefined = $derived.by(() => {
|
|
409
|
-
if (
|
|
416
|
+
if (['quadtree', 'quadtree-x', 'quadtree-y'].includes(mode)) {
|
|
410
417
|
return d3Quadtree()
|
|
411
418
|
.x((d) => {
|
|
419
|
+
if (mode === 'quadtree-y') {
|
|
420
|
+
return 0;
|
|
421
|
+
}
|
|
422
|
+
|
|
412
423
|
if (geoCtx.projection) {
|
|
413
424
|
const lat = ctx.x(d);
|
|
414
425
|
const long = ctx.y(d);
|
|
@@ -429,6 +440,10 @@
|
|
|
429
440
|
}
|
|
430
441
|
})
|
|
431
442
|
.y((d) => {
|
|
443
|
+
if (mode === 'quadtree-x') {
|
|
444
|
+
return 0;
|
|
445
|
+
}
|
|
446
|
+
|
|
432
447
|
if (geoCtx.projection) {
|
|
433
448
|
const lat = ctx.x(d);
|
|
434
449
|
const long = ctx.y(d);
|
|
@@ -509,7 +524,7 @@
|
|
|
509
524
|
});
|
|
510
525
|
|
|
511
526
|
const triggerPointerEvents = $derived(
|
|
512
|
-
['bisect-x', 'bisect-y', 'bisect-band', 'quadtree'].includes(mode)
|
|
527
|
+
['bisect-x', 'bisect-y', 'bisect-band', 'quadtree', 'quadtree-x', 'quadtree-y'].includes(mode)
|
|
513
528
|
);
|
|
514
529
|
|
|
515
530
|
function onPointerEnter(e: PointerEvent | MouseEvent | TouchEvent) {
|
|
@@ -646,7 +661,7 @@
|
|
|
646
661
|
{/each}
|
|
647
662
|
</g>
|
|
648
663
|
</Svg>
|
|
649
|
-
{:else if
|
|
664
|
+
{:else if ['quadtree', 'quadtree-x', 'quadtree-y'].includes(mode) && debug}
|
|
650
665
|
<Svg pointerEvents={false}>
|
|
651
666
|
<ChartClipPath>
|
|
652
667
|
<g class={layerClass('tooltip-quadtree-g')}>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
2
2
|
import type { Without } from '../../utils/types.js';
|
|
3
|
-
type TooltipMode = 'bisect-x' | 'bisect-y' | 'band' | 'bisect-band' | 'bounds' | 'voronoi' | 'quadtree' | 'manual';
|
|
3
|
+
type TooltipMode = 'bisect-x' | 'bisect-y' | 'band' | 'bisect-band' | 'bounds' | 'voronoi' | 'quadtree' | 'quadtree-x' | 'quadtree-y' | 'manual';
|
|
4
4
|
export type TooltipContextValue<T = any> = {
|
|
5
5
|
x: number;
|
|
6
6
|
y: number;
|
package/dist/utils/array.d.ts
CHANGED
|
@@ -11,3 +11,13 @@ export declare function extent<T extends Numeric>(iterable: Parameters<typeof d3
|
|
|
11
11
|
* of making a set
|
|
12
12
|
*/
|
|
13
13
|
export declare function arraysEqual(arr1: unknown[], arr2: unknown[]): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Add `lanes` property to each element in the data array support densely packing.
|
|
16
|
+
* This is useful for visualizing overlapping events in a timeline / Gantt chart.
|
|
17
|
+
*/
|
|
18
|
+
export declare function applyLanes<T extends Record<string, any>>(data: T[], options?: {
|
|
19
|
+
start: keyof T;
|
|
20
|
+
end: keyof T;
|
|
21
|
+
}): (T & {
|
|
22
|
+
lane: number;
|
|
23
|
+
})[];
|
package/dist/utils/array.js
CHANGED
|
@@ -18,3 +18,20 @@ export function arraysEqual(arr1, arr2) {
|
|
|
18
18
|
return arr2.includes(k);
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Add `lanes` property to each element in the data array support densely packing.
|
|
23
|
+
* This is useful for visualizing overlapping events in a timeline / Gantt chart.
|
|
24
|
+
*/
|
|
25
|
+
export function applyLanes(data, options = { start: 'start', end: 'end' }) {
|
|
26
|
+
const result = [];
|
|
27
|
+
let stack = [];
|
|
28
|
+
for (const d of data) {
|
|
29
|
+
let lane = stack.findIndex((s) => s[options.end] <= d[options.start] && s[options.start] < d[options.start]);
|
|
30
|
+
if (lane === -1) {
|
|
31
|
+
lane = stack.length;
|
|
32
|
+
}
|
|
33
|
+
result.push({ ...d, lane });
|
|
34
|
+
stack[lane] = d;
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { applyLanes } from './array.js';
|
|
3
|
+
describe('applyLanes', () => {
|
|
4
|
+
it('should assign same lane to non-overlapping events', () => {
|
|
5
|
+
const data = [
|
|
6
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-02') },
|
|
7
|
+
{ id: 2, start: new Date('2023-01-03'), end: new Date('2023-01-05') },
|
|
8
|
+
{ id: 3, start: new Date('2023-01-06'), end: new Date('2023-01-08') },
|
|
9
|
+
];
|
|
10
|
+
const result = applyLanes(data);
|
|
11
|
+
expect(result).toEqual([
|
|
12
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-02'), lane: 0 },
|
|
13
|
+
{ id: 2, start: new Date('2023-01-03'), end: new Date('2023-01-05'), lane: 0 },
|
|
14
|
+
{ id: 3, start: new Date('2023-01-06'), end: new Date('2023-01-08'), lane: 0 },
|
|
15
|
+
]);
|
|
16
|
+
});
|
|
17
|
+
it('should assign different lanes to overlapping events', () => {
|
|
18
|
+
const data = [
|
|
19
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-03') },
|
|
20
|
+
{ id: 2, start: new Date('2023-01-02'), end: new Date('2023-01-04') },
|
|
21
|
+
{ id: 3, start: new Date('2023-01-02T12:00:00'), end: new Date('2023-01-05') },
|
|
22
|
+
];
|
|
23
|
+
const result = applyLanes(data);
|
|
24
|
+
expect(result).toEqual([
|
|
25
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-03'), lane: 0 },
|
|
26
|
+
{ id: 2, start: new Date('2023-01-02'), end: new Date('2023-01-04'), lane: 1 },
|
|
27
|
+
{ id: 3, start: new Date('2023-01-02T12:00:00'), end: new Date('2023-01-05'), lane: 2 },
|
|
28
|
+
]);
|
|
29
|
+
});
|
|
30
|
+
it('should reuse lanes when events no longer overlap', () => {
|
|
31
|
+
const data = [
|
|
32
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-02') },
|
|
33
|
+
{ id: 2, start: new Date('2023-01-01T12:00:00'), end: new Date('2023-01-03') },
|
|
34
|
+
{ id: 3, start: new Date('2023-01-04'), end: new Date('2023-01-06') }, // starts after id: 1 ends
|
|
35
|
+
{ id: 4, start: new Date('2023-01-05'), end: new Date('2023-01-07') }, // starts after id: 2 ends
|
|
36
|
+
];
|
|
37
|
+
const result = applyLanes(data);
|
|
38
|
+
expect(result).toEqual([
|
|
39
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-02'), lane: 0 },
|
|
40
|
+
{ id: 2, start: new Date('2023-01-01T12:00:00'), end: new Date('2023-01-03'), lane: 1 },
|
|
41
|
+
{ id: 3, start: new Date('2023-01-04'), end: new Date('2023-01-06'), lane: 0 }, // reuses lane 0
|
|
42
|
+
{ id: 4, start: new Date('2023-01-05'), end: new Date('2023-01-07'), lane: 1 }, // reuses lane 1
|
|
43
|
+
]);
|
|
44
|
+
});
|
|
45
|
+
it('should handle events that start exactly when another ends', () => {
|
|
46
|
+
const data = [
|
|
47
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-02') },
|
|
48
|
+
{ id: 2, start: new Date('2023-01-02'), end: new Date('2023-01-04') }, // starts exactly when id: 1 ends
|
|
49
|
+
{ id: 3, start: new Date('2023-01-01T12:00:00'), end: new Date('2023-01-03') }, // overlaps with both
|
|
50
|
+
];
|
|
51
|
+
const result = applyLanes(data);
|
|
52
|
+
expect(result).toEqual([
|
|
53
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-02'), lane: 0 },
|
|
54
|
+
{ id: 2, start: new Date('2023-01-02'), end: new Date('2023-01-04'), lane: 0 }, // can reuse lane 0
|
|
55
|
+
{ id: 3, start: new Date('2023-01-01T12:00:00'), end: new Date('2023-01-03'), lane: 1 }, // overlaps, needs new lane
|
|
56
|
+
]);
|
|
57
|
+
});
|
|
58
|
+
it('should work with string keys for start and end', () => {
|
|
59
|
+
const data = [
|
|
60
|
+
{ name: 'Task 1', startTime: new Date('2023-01-01'), endTime: new Date('2023-01-03') },
|
|
61
|
+
{ name: 'Task 2', startTime: new Date('2023-01-02'), endTime: new Date('2023-01-04') },
|
|
62
|
+
];
|
|
63
|
+
const result = applyLanes(data, { start: 'startTime', end: 'endTime' });
|
|
64
|
+
expect(result).toEqual([
|
|
65
|
+
{
|
|
66
|
+
name: 'Task 1',
|
|
67
|
+
startTime: new Date('2023-01-01'),
|
|
68
|
+
endTime: new Date('2023-01-03'),
|
|
69
|
+
lane: 0,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'Task 2',
|
|
73
|
+
startTime: new Date('2023-01-02'),
|
|
74
|
+
endTime: new Date('2023-01-04'),
|
|
75
|
+
lane: 1,
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
});
|
|
79
|
+
it('should handle empty array', () => {
|
|
80
|
+
const data = [];
|
|
81
|
+
const result = applyLanes(data);
|
|
82
|
+
expect(result).toEqual([]);
|
|
83
|
+
});
|
|
84
|
+
it('should handle single event', () => {
|
|
85
|
+
const data = [{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-02') }];
|
|
86
|
+
const result = applyLanes(data);
|
|
87
|
+
expect(result).toEqual([
|
|
88
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-02'), lane: 0 },
|
|
89
|
+
]);
|
|
90
|
+
});
|
|
91
|
+
it('should handle complex overlapping scenario', () => {
|
|
92
|
+
const data = [
|
|
93
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-05') }, // long event
|
|
94
|
+
{ id: 2, start: new Date('2023-01-02'), end: new Date('2023-01-03') }, // short event inside
|
|
95
|
+
{ id: 3, start: new Date('2023-01-02T12:00:00'), end: new Date('2023-01-04') }, // overlaps with both
|
|
96
|
+
{ id: 4, start: new Date('2023-01-03'), end: new Date('2023-01-04T12:00:00') }, // overlaps with 1 and 3
|
|
97
|
+
{ id: 5, start: new Date('2023-01-06'), end: new Date('2023-01-08') }, // separate event
|
|
98
|
+
];
|
|
99
|
+
const result = applyLanes(data);
|
|
100
|
+
expect(result).toEqual([
|
|
101
|
+
{ id: 1, start: new Date('2023-01-01'), end: new Date('2023-01-05'), lane: 0 },
|
|
102
|
+
{ id: 2, start: new Date('2023-01-02'), end: new Date('2023-01-03'), lane: 1 },
|
|
103
|
+
{ id: 3, start: new Date('2023-01-02T12:00:00'), end: new Date('2023-01-04'), lane: 2 },
|
|
104
|
+
{ id: 4, start: new Date('2023-01-03'), end: new Date('2023-01-04T12:00:00'), lane: 1 }, // can reuse lane 1 since id: 2 ended
|
|
105
|
+
{ id: 5, start: new Date('2023-01-06'), end: new Date('2023-01-08'), lane: 0 }, // can reuse lane 0 since id: 1 ended
|
|
106
|
+
]);
|
|
107
|
+
});
|
|
108
|
+
it('should preserve all original properties', () => {
|
|
109
|
+
const data = [
|
|
110
|
+
{
|
|
111
|
+
id: 1,
|
|
112
|
+
start: new Date('2023-01-01'),
|
|
113
|
+
end: new Date('2023-01-02'),
|
|
114
|
+
name: 'First',
|
|
115
|
+
priority: 'high',
|
|
116
|
+
metadata: { foo: 'bar' },
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 2,
|
|
120
|
+
start: new Date('2023-01-01T12:00:00'),
|
|
121
|
+
end: new Date('2023-01-03'),
|
|
122
|
+
name: 'Second',
|
|
123
|
+
priority: 'low',
|
|
124
|
+
metadata: { baz: 'qux' },
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
const result = applyLanes(data);
|
|
128
|
+
expect(result).toEqual([
|
|
129
|
+
{
|
|
130
|
+
id: 1,
|
|
131
|
+
start: new Date('2023-01-01'),
|
|
132
|
+
end: new Date('2023-01-02'),
|
|
133
|
+
name: 'First',
|
|
134
|
+
priority: 'high',
|
|
135
|
+
metadata: { foo: 'bar' },
|
|
136
|
+
lane: 0,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: 2,
|
|
140
|
+
start: new Date('2023-01-01T12:00:00'),
|
|
141
|
+
end: new Date('2023-01-03'),
|
|
142
|
+
name: 'Second',
|
|
143
|
+
priority: 'low',
|
|
144
|
+
metadata: { baz: 'qux' },
|
|
145
|
+
lane: 1,
|
|
146
|
+
},
|
|
147
|
+
]);
|
|
148
|
+
});
|
|
149
|
+
it('should work with numeric values', () => {
|
|
150
|
+
const data = [
|
|
151
|
+
{ id: 1, start: 0, end: 3 },
|
|
152
|
+
{ id: 2, start: 1, end: 4 },
|
|
153
|
+
{ id: 3, start: 5, end: 7 },
|
|
154
|
+
];
|
|
155
|
+
const result = applyLanes(data);
|
|
156
|
+
expect(result).toEqual([
|
|
157
|
+
{ id: 1, start: 0, end: 3, lane: 0 },
|
|
158
|
+
{ id: 2, start: 1, end: 4, lane: 1 },
|
|
159
|
+
{ id: 3, start: 5, end: 7, lane: 0 }, // can reuse lane 0 since id: 1 ended
|
|
160
|
+
]);
|
|
161
|
+
});
|
|
162
|
+
});
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"author": "Sean Lynch <techniq35@gmail.com>",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "techniq/layerchart",
|
|
7
|
-
"version": "2.0.0-next.
|
|
7
|
+
"version": "2.0.0-next.26",
|
|
8
8
|
"devDependencies": {
|
|
9
9
|
"@changesets/cli": "^2.29.4",
|
|
10
10
|
"@iconify-json/lucide": "^1.2.48",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"svelte": "5.34.1",
|
|
57
57
|
"svelte-check": "^4.2.1",
|
|
58
58
|
"svelte-json-tree": "^2.2.0",
|
|
59
|
-
"svelte-ux": "2.0.0-next.
|
|
59
|
+
"svelte-ux": "2.0.0-next.13",
|
|
60
60
|
"svelte2tsx": "^0.7.39",
|
|
61
61
|
"tailwindcss": "^4.1.10",
|
|
62
62
|
"topojson-client": "^3.1.0",
|