layerchart 0.81.3 → 0.91.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.
- package/dist/components/Arc.svelte +49 -14
- package/dist/components/Area.svelte +35 -11
- package/dist/components/Bar.svelte +15 -10
- package/dist/components/Bars.svelte +3 -3
- package/dist/components/Brush.svelte +38 -33
- package/dist/components/Calendar.svelte +2 -2
- package/dist/components/Chart.svelte +17 -4
- package/dist/components/Chart.svelte.d.ts +21 -10
- package/dist/components/ChartClipPath.svelte +0 -1
- package/dist/components/ChartClipPath.svelte.d.ts +0 -2
- package/dist/components/ChartContext.svelte +4 -11
- package/dist/components/ChartContext.svelte.d.ts +1 -1
- package/dist/components/Circle.svelte +35 -11
- package/dist/components/ClipPath.svelte +1 -1
- package/dist/components/ClipPath.svelte.d.ts +0 -5
- package/dist/components/ForceSimulation.svelte +8 -12
- package/dist/components/ForceSimulation.svelte.d.ts +6 -8
- package/dist/components/Frame.svelte +4 -7
- package/dist/components/Frame.svelte.d.ts +1 -5
- package/dist/components/GeoCircle.svelte +7 -1
- package/dist/components/GeoCircle.svelte.d.ts +6 -7
- package/dist/components/GeoPath.svelte +68 -39
- package/dist/components/GeoPath.svelte.d.ts +6 -12
- package/dist/components/GeoPoint.svelte +3 -24
- package/dist/components/GeoPoint.svelte.d.ts +4 -5
- package/dist/components/Graticule.svelte.d.ts +12 -6
- package/dist/components/Group.svelte +26 -6
- package/dist/components/Highlight.svelte +22 -12
- package/dist/components/Hull.svelte +20 -15
- package/dist/components/Hull.svelte.d.ts +7 -9
- package/dist/components/Legend.svelte +7 -7
- package/dist/components/Legend.svelte.d.ts +3 -3
- package/dist/components/Line.svelte +35 -10
- package/dist/components/Link.svelte +16 -9
- package/dist/components/Points.svelte +24 -57
- package/dist/components/Points.svelte.d.ts +0 -1
- package/dist/components/Rect.svelte +46 -15
- package/dist/components/Sankey.svelte +3 -4
- package/dist/components/Sankey.svelte.d.ts +1 -2
- package/dist/components/Spline.svelte +47 -11
- package/dist/components/Text.svelte +12 -6
- package/dist/components/TransformContext.svelte +8 -10
- package/dist/components/TransformContext.svelte.d.ts +9 -9
- package/dist/components/Voronoi.svelte +62 -40
- package/dist/components/Voronoi.svelte.d.ts +14 -13
- package/dist/components/charts/AreaChart.svelte +25 -17
- package/dist/components/charts/BarChart.svelte +24 -11
- package/dist/components/charts/LineChart.svelte +25 -17
- package/dist/components/charts/PieChart.svelte +22 -15
- package/dist/components/charts/PieChart.svelte.d.ts +29 -7
- package/dist/components/charts/ScatterChart.svelte +15 -9
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.js +0 -1
- package/dist/components/layout/Canvas.svelte +148 -7
- package/dist/components/layout/Canvas.svelte.d.ts +15 -2
- package/dist/components/tooltip/TooltipContext.svelte +25 -20
- package/dist/components/tooltip/TooltipContext.svelte.d.ts +6 -2
- package/dist/utils/canvas.js +39 -33
- package/dist/utils/color.d.ts +15 -0
- package/dist/utils/color.js +15 -0
- package/package.json +1 -1
- package/dist/components/Brush.svelte.d.ts +0 -65
- package/dist/components/HitCanvas.svelte +0 -118
- package/dist/components/HitCanvas.svelte.d.ts +0 -32
|
@@ -66,12 +66,21 @@
|
|
|
66
66
|
/** Set to false to disable spring transitions */
|
|
67
67
|
export let motion = true;
|
|
68
68
|
|
|
69
|
-
export let
|
|
70
|
-
export let
|
|
71
|
-
|
|
72
|
-
export let
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
export let onareaclick: (e: MouseEvent, data: { data: any }) => void = () => {};
|
|
70
|
+
export let onbarclick: (e: MouseEvent, data: { data: any }) => void = () => {};
|
|
71
|
+
|
|
72
|
+
export let onpointclick: (
|
|
73
|
+
e: MouseEvent,
|
|
74
|
+
data: { point: (typeof _points)[number]; data: any }
|
|
75
|
+
) => void = () => {};
|
|
76
|
+
export let onpointenter: (
|
|
77
|
+
e: MouseEvent,
|
|
78
|
+
datae: { point: (typeof _points)[number]; data: any }
|
|
79
|
+
) => void = () => {};
|
|
80
|
+
export let onpointleave: (
|
|
81
|
+
e: MouseEvent,
|
|
82
|
+
datae: { point: (typeof _points)[number]; data: any }
|
|
83
|
+
) => void = () => {};
|
|
75
84
|
|
|
76
85
|
const _x = accessor(x);
|
|
77
86
|
const _y = accessor(y);
|
|
@@ -353,7 +362,7 @@
|
|
|
353
362
|
!area.fill && 'fill-surface-content/5',
|
|
354
363
|
typeof area === 'object' ? area.class : null
|
|
355
364
|
)}
|
|
356
|
-
|
|
365
|
+
onclick={(e) => onareaclick(e, { data: highlightData })}
|
|
357
366
|
/>
|
|
358
367
|
</slot>
|
|
359
368
|
{/if}
|
|
@@ -374,7 +383,7 @@
|
|
|
374
383
|
!bar.fill && 'fill-primary',
|
|
375
384
|
typeof bar === 'object' ? bar.class : null
|
|
376
385
|
)}
|
|
377
|
-
|
|
386
|
+
onclick={(e) => onbarclick(e, { data: highlightData })}
|
|
378
387
|
/>
|
|
379
388
|
</slot>
|
|
380
389
|
{/if}
|
|
@@ -407,15 +416,16 @@
|
|
|
407
416
|
cy={point.y}
|
|
408
417
|
fill={point.fill}
|
|
409
418
|
r={4}
|
|
419
|
+
strokeWidth={6}
|
|
410
420
|
{...typeof points === 'object' ? points : null}
|
|
411
421
|
class={cls(
|
|
412
|
-
'stroke-
|
|
422
|
+
'stroke-white [paint-order:stroke] drop-shadow',
|
|
413
423
|
!point.fill && (typeof points === 'boolean' || !points.fill) && 'fill-primary',
|
|
414
424
|
typeof points === 'object' ? points.class : null
|
|
415
425
|
)}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
426
|
+
onclick={(e) => onpointclick(e, { point, data: highlightData })}
|
|
427
|
+
onpointerenter={(e) => onpointenter(e, { point, data: highlightData })}
|
|
428
|
+
onpointerleave={(e) => onpointleave(e, { point, data: highlightData })}
|
|
419
429
|
/>
|
|
420
430
|
{/each}
|
|
421
431
|
</slot>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { type ComponentProps } from 'svelte';
|
|
3
3
|
import { min } from 'd3-array';
|
|
4
4
|
import { Delaunay } from 'd3-delaunay';
|
|
5
5
|
// @ts-expect-error
|
|
@@ -25,14 +25,19 @@
|
|
|
25
25
|
path?: string;
|
|
26
26
|
} = {};
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
export let onclick:
|
|
29
|
+
| ((e: MouseEvent, details: { points: [number, number][]; polygon: Delaunay.Polygon }) => void)
|
|
30
|
+
| undefined = undefined;
|
|
31
|
+
export let onpointermove:
|
|
32
|
+
| ((
|
|
33
|
+
e: PointerEvent,
|
|
34
|
+
details: {
|
|
35
|
+
points: [number, number][];
|
|
36
|
+
polygon: Delaunay.Polygon;
|
|
37
|
+
}
|
|
38
|
+
) => void)
|
|
39
|
+
| undefined = undefined;
|
|
40
|
+
export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
|
|
36
41
|
|
|
37
42
|
$: points = (data ?? $flatData).map((d: any) => {
|
|
38
43
|
const xValue = $xContext(d);
|
|
@@ -55,9 +60,9 @@
|
|
|
55
60
|
geojson={polygon}
|
|
56
61
|
{curve}
|
|
57
62
|
class={cls('fill-transparent', classes.path)}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
onclick={(e) => onclick?.(e, { points, polygon })}
|
|
64
|
+
onpointermove={(e) => onpointermove?.(e, { points, polygon })}
|
|
65
|
+
{onpointerleave}
|
|
61
66
|
/>
|
|
62
67
|
{:else}
|
|
63
68
|
{@const delaunay = Delaunay.from(points)}
|
|
@@ -68,9 +73,9 @@
|
|
|
68
73
|
y={(d) => d[1]}
|
|
69
74
|
{curve}
|
|
70
75
|
class={cls('fill-transparent', classes.path)}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
onclick={(e) => onclick?.(e, { points, polygon })}
|
|
77
|
+
onpointermove={(e) => onpointermove?.(e, { points, polygon })}
|
|
78
|
+
{onpointerleave}
|
|
74
79
|
/>
|
|
75
80
|
{/if}
|
|
76
81
|
</g>
|
|
@@ -9,19 +9,17 @@ declare const __propDef: {
|
|
|
9
9
|
root?: string;
|
|
10
10
|
path?: string;
|
|
11
11
|
} | undefined;
|
|
12
|
-
|
|
13
|
-
events: {
|
|
14
|
-
pointerleave: PointerEvent;
|
|
15
|
-
click: CustomEvent<{
|
|
12
|
+
onclick?: ((e: MouseEvent, details: {
|
|
16
13
|
points: [number, number][];
|
|
17
14
|
polygon: Delaunay.Polygon;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
event: PointerEvent;
|
|
15
|
+
}) => void) | undefined | undefined;
|
|
16
|
+
onpointermove?: ((e: PointerEvent, details: {
|
|
21
17
|
points: [number, number][];
|
|
22
18
|
polygon: Delaunay.Polygon;
|
|
23
|
-
}
|
|
24
|
-
|
|
19
|
+
}) => void) | undefined | undefined;
|
|
20
|
+
onpointerleave?: ((e: PointerEvent) => void) | undefined | undefined;
|
|
21
|
+
};
|
|
22
|
+
events: {
|
|
25
23
|
[evt: string]: CustomEvent<any>;
|
|
26
24
|
};
|
|
27
25
|
slots: {};
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
export let placement: Placement | undefined = undefined;
|
|
36
36
|
export let orientation: 'horizontal' | 'vertical' = 'horizontal';
|
|
37
37
|
|
|
38
|
-
export let
|
|
39
|
-
export let
|
|
40
|
-
export let
|
|
38
|
+
export let onclick: ((e: MouseEvent, detail: any) => any) | undefined = undefined;
|
|
39
|
+
export let onpointerenter: ((e: MouseEvent, detail: any) => any) | undefined = undefined;
|
|
40
|
+
export let onpointerleave: ((e: MouseEvent, detail: any) => any) | undefined = undefined;
|
|
41
41
|
|
|
42
42
|
/** Determine display ramp (individual color swatches or continuous ramp)*/
|
|
43
43
|
export let variant: 'ramp' | 'swatches' = 'ramp';
|
|
@@ -214,10 +214,10 @@
|
|
|
214
214
|
{@const color = _scale(tick)}
|
|
215
215
|
{@const item = { value: tick, color }}
|
|
216
216
|
<button
|
|
217
|
-
class={cls('flex gap-1', !
|
|
218
|
-
on:click={() =>
|
|
219
|
-
on:pointerenter={() =>
|
|
220
|
-
on:pointerleave={() =>
|
|
217
|
+
class={cls('flex gap-1', !onclick && 'cursor-auto', classes.item?.(item))}
|
|
218
|
+
on:click={(e) => onclick?.(e, item)}
|
|
219
|
+
on:pointerenter={(e) => onpointerenter?.(e, item)}
|
|
220
|
+
on:pointerleave={(e) => onpointerleave?.(e, item)}
|
|
221
221
|
>
|
|
222
222
|
<div
|
|
223
223
|
class={cls('h-4 w-4 rounded-full', classes.swatch)}
|
|
@@ -14,9 +14,9 @@ declare const __propDef: {
|
|
|
14
14
|
tickLength?: number | undefined;
|
|
15
15
|
placement?: ("center" | "bottom" | "left" | "right" | "top" | "top-left" | "top-right" | "bottom-left" | "bottom-right") | undefined;
|
|
16
16
|
orientation?: "horizontal" | "vertical" | undefined;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
onclick?: ((e: MouseEvent, detail: any) => any) | undefined | undefined;
|
|
18
|
+
onpointerenter?: ((e: MouseEvent, detail: any) => any) | undefined | undefined;
|
|
19
|
+
onpointerleave?: ((e: MouseEvent, detail: any) => any) | undefined | undefined;
|
|
20
20
|
variant?: "ramp" | "swatches" | undefined;
|
|
21
21
|
classes?: {
|
|
22
22
|
root?: string;
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
import { cls } from '@layerstack/tailwind';
|
|
5
5
|
import { uniqueId } from '@layerstack/utils';
|
|
6
6
|
import { objectId } from '@layerstack/utils/object';
|
|
7
|
+
import { merge } from 'lodash-es';
|
|
7
8
|
|
|
8
9
|
import { motionStore } from '../stores/motionStore.js';
|
|
9
10
|
|
|
10
11
|
import Marker from './Marker.svelte';
|
|
11
|
-
import { renderPathData } from '../utils/canvas.js';
|
|
12
|
+
import { renderPathData, type ComputedStylesOptions } from '../utils/canvas.js';
|
|
12
13
|
import { getCanvasContext } from './layout/Canvas.svelte';
|
|
13
14
|
|
|
14
15
|
export let x1: number;
|
|
@@ -30,6 +31,11 @@
|
|
|
30
31
|
let className: string | undefined = undefined;
|
|
31
32
|
export { className as class };
|
|
32
33
|
|
|
34
|
+
export let onclick: ((e: MouseEvent) => void) | undefined = undefined;
|
|
35
|
+
export let onpointerenter: ((e: PointerEvent) => void) | undefined = undefined;
|
|
36
|
+
export let onpointermove: ((e: PointerEvent) => void) | undefined = undefined;
|
|
37
|
+
export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
|
|
38
|
+
|
|
33
39
|
/** Marker to attach to start and end points of path */
|
|
34
40
|
export let marker: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
|
|
35
41
|
undefined;
|
|
@@ -61,12 +67,21 @@
|
|
|
61
67
|
const canvasContext = getCanvasContext();
|
|
62
68
|
const renderContext = canvasContext ? 'canvas' : 'svg';
|
|
63
69
|
|
|
64
|
-
function render(
|
|
70
|
+
function render(
|
|
71
|
+
ctx: CanvasRenderingContext2D,
|
|
72
|
+
styleOverrides: ComputedStylesOptions | undefined
|
|
73
|
+
) {
|
|
65
74
|
const pathData = `M ${$tweened_x1},${$tweened_y1} L ${$tweened_x2},${$tweened_y2}`;
|
|
66
|
-
renderPathData(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
75
|
+
renderPathData(
|
|
76
|
+
ctx,
|
|
77
|
+
pathData,
|
|
78
|
+
styleOverrides
|
|
79
|
+
? merge({ styles: { strokeWidth } }, styleOverrides)
|
|
80
|
+
: {
|
|
81
|
+
styles: { fill, stroke, strokeWidth },
|
|
82
|
+
classes: className,
|
|
83
|
+
}
|
|
84
|
+
);
|
|
70
85
|
}
|
|
71
86
|
|
|
72
87
|
// TODO: Use objectId to work around Svelte 4 reactivity issue (even when memoizing gradients)
|
|
@@ -88,7 +103,16 @@
|
|
|
88
103
|
|
|
89
104
|
let canvasUnregister: ReturnType<typeof canvasContext.register>;
|
|
90
105
|
$: if (renderContext === 'canvas') {
|
|
91
|
-
canvasUnregister = canvasContext.register({
|
|
106
|
+
canvasUnregister = canvasContext.register({
|
|
107
|
+
name: 'Line',
|
|
108
|
+
render,
|
|
109
|
+
events: {
|
|
110
|
+
click: onclick,
|
|
111
|
+
pointerenter: onpointerenter,
|
|
112
|
+
pointermove: onpointermove,
|
|
113
|
+
pointerleave: onpointerleave,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
92
116
|
}
|
|
93
117
|
|
|
94
118
|
onDestroy(() => {
|
|
@@ -112,9 +136,10 @@
|
|
|
112
136
|
marker-end={markerEndId ? `url(#${markerEndId})` : undefined}
|
|
113
137
|
class={cls(stroke === undefined && 'stroke-surface-content', className)}
|
|
114
138
|
{...$$restProps}
|
|
115
|
-
on:click
|
|
116
|
-
on:
|
|
117
|
-
on:
|
|
139
|
+
on:click={onclick}
|
|
140
|
+
on:pointerenter={onpointerenter}
|
|
141
|
+
on:pointermove={onpointermove}
|
|
142
|
+
on:pointerleave={onpointerleave}
|
|
118
143
|
/>
|
|
119
144
|
|
|
120
145
|
<slot name="markerStart" id={markerStartId}>
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import { uniqueId } from '@layerstack/utils';
|
|
23
23
|
|
|
24
24
|
import Marker from './Marker.svelte';
|
|
25
|
+
import Spline from './Spline.svelte';
|
|
25
26
|
|
|
26
27
|
// Override what is used from context
|
|
27
28
|
export let data: any = undefined; // TODO: Update Type
|
|
@@ -39,6 +40,13 @@
|
|
|
39
40
|
export let y = (d: any) => (sankey ? d[1] : orientation === 'horizontal' ? d.x : d.y);
|
|
40
41
|
export let curve = orientation === 'horizontal' ? curveBumpX : curveBumpY;
|
|
41
42
|
|
|
43
|
+
export let onclick: ((e: MouseEvent) => void) | undefined = undefined;
|
|
44
|
+
export let onpointerenter: ((e: PointerEvent) => void) | undefined = undefined;
|
|
45
|
+
export let onpointermove: ((e: PointerEvent) => void) | undefined = undefined;
|
|
46
|
+
export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
|
|
47
|
+
export let onpointerover: ((e: PointerEvent) => void) | undefined = undefined;
|
|
48
|
+
export let onpointerout: ((e: PointerEvent) => void) | undefined = undefined;
|
|
49
|
+
|
|
42
50
|
/** Marker to attach to start, mid, and end points of path */
|
|
43
51
|
export let marker: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
|
|
44
52
|
undefined;
|
|
@@ -69,20 +77,19 @@
|
|
|
69
77
|
}
|
|
70
78
|
</script>
|
|
71
79
|
|
|
72
|
-
|
|
73
|
-
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
74
|
-
<path
|
|
80
|
+
<Spline
|
|
75
81
|
class="path-link"
|
|
76
|
-
|
|
82
|
+
pathData={$tweened_d}
|
|
77
83
|
fill="none"
|
|
78
84
|
marker-start={markerStartId ? `url(#${markerStartId})` : undefined}
|
|
79
85
|
marker-mid={markerMidId ? `url(#${markerMidId})` : undefined}
|
|
80
86
|
marker-end={markerEndId ? `url(#${markerEndId})` : undefined}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
{onclick}
|
|
88
|
+
{onpointerenter}
|
|
89
|
+
{onpointermove}
|
|
90
|
+
{onpointerleave}
|
|
91
|
+
{onpointerover}
|
|
92
|
+
{onpointerout}
|
|
86
93
|
{...$$restProps}
|
|
87
94
|
/>
|
|
88
95
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
import {
|
|
6
|
+
import { type ComponentProps } from 'svelte';
|
|
7
7
|
import { extent } from 'd3-array';
|
|
8
8
|
import { pointRadial } from 'd3-shape';
|
|
9
9
|
import { notNull } from '@layerstack/utils';
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
import Circle from './Circle.svelte';
|
|
13
13
|
import Link from './Link.svelte';
|
|
14
14
|
import { isScaleBand, type AnyScale } from '../utils/scales.js';
|
|
15
|
-
import { getCanvasContext } from './layout/Canvas.svelte';
|
|
16
15
|
import { accessor, type Accessor } from '../utils/common.js';
|
|
17
16
|
|
|
18
17
|
const context = chartContext() as any;
|
|
@@ -52,10 +51,6 @@
|
|
|
52
51
|
export let stroke: string | undefined = undefined;
|
|
53
52
|
export let strokeWidth: number | undefined = undefined;
|
|
54
53
|
|
|
55
|
-
/** Render to canvas */
|
|
56
|
-
export let render: ((ctx: CanvasRenderingContext2D, points: Point[]) => any) | undefined =
|
|
57
|
-
undefined;
|
|
58
|
-
|
|
59
54
|
let className: string | undefined = undefined;
|
|
60
55
|
export { className as class };
|
|
61
56
|
|
|
@@ -168,59 +163,31 @@
|
|
|
168
163
|
};
|
|
169
164
|
}
|
|
170
165
|
});
|
|
171
|
-
|
|
172
|
-
const canvasContext = getCanvasContext();
|
|
173
|
-
const renderContext = canvasContext ? 'canvas' : 'svg';
|
|
174
|
-
|
|
175
|
-
function _render(ctx: CanvasRenderingContext2D) {
|
|
176
|
-
if (render) {
|
|
177
|
-
render(ctx, points);
|
|
178
|
-
} else {
|
|
179
|
-
// Rendered below
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
let canvasUnregister: ReturnType<typeof canvasContext.register>;
|
|
184
|
-
$: if (renderContext === 'canvas') {
|
|
185
|
-
canvasUnregister = canvasContext.register({ name: 'Points', render: _render });
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
onDestroy(() => {
|
|
189
|
-
if (renderContext === 'canvas') {
|
|
190
|
-
canvasUnregister();
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
166
|
</script>
|
|
194
167
|
|
|
195
168
|
<slot {points}>
|
|
196
|
-
{#if
|
|
197
|
-
{#
|
|
198
|
-
<
|
|
199
|
-
{
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
/>
|
|
205
|
-
{/each}
|
|
206
|
-
</g>
|
|
207
|
-
{/if}
|
|
208
|
-
|
|
209
|
-
<g class="point-group">
|
|
210
|
-
{#each points as point}
|
|
211
|
-
{@const radialPoint = pointRadial(point.x, point.y)}
|
|
212
|
-
<Circle
|
|
213
|
-
cx={$radial ? radialPoint[0] : point.x}
|
|
214
|
-
cy={$radial ? radialPoint[1] : point.y}
|
|
215
|
-
r={point.r}
|
|
216
|
-
fill={fill ?? ($config.c ? $cGet(point.data) : null)}
|
|
217
|
-
{fillOpacity}
|
|
218
|
-
{stroke}
|
|
219
|
-
{strokeWidth}
|
|
220
|
-
class={className}
|
|
221
|
-
{...$$restProps}
|
|
222
|
-
/>
|
|
223
|
-
{/each}
|
|
224
|
-
</g>
|
|
169
|
+
{#if links}
|
|
170
|
+
{#each _links as link}
|
|
171
|
+
<Link
|
|
172
|
+
data={link}
|
|
173
|
+
class="stroke-surface-content/50"
|
|
174
|
+
{...typeof links === 'object' ? links : null}
|
|
175
|
+
/>
|
|
176
|
+
{/each}
|
|
225
177
|
{/if}
|
|
178
|
+
|
|
179
|
+
{#each points as point}
|
|
180
|
+
{@const radialPoint = pointRadial(point.x, point.y)}
|
|
181
|
+
<Circle
|
|
182
|
+
cx={$radial ? radialPoint[0] : point.x}
|
|
183
|
+
cy={$radial ? radialPoint[1] : point.y}
|
|
184
|
+
r={point.r}
|
|
185
|
+
fill={fill ?? ($config.c ? $cGet(point.data) : null)}
|
|
186
|
+
{fillOpacity}
|
|
187
|
+
{stroke}
|
|
188
|
+
{strokeWidth}
|
|
189
|
+
class={className}
|
|
190
|
+
{...$$restProps}
|
|
191
|
+
/>
|
|
192
|
+
{/each}
|
|
226
193
|
</slot>
|
|
@@ -24,7 +24,6 @@ declare const __propDef: {
|
|
|
24
24
|
fillOpacity?: number | undefined | undefined;
|
|
25
25
|
stroke?: string | undefined | undefined;
|
|
26
26
|
strokeWidth?: number | undefined | undefined;
|
|
27
|
-
render?: ((ctx: CanvasRenderingContext2D, points: Point[]) => any) | undefined | undefined;
|
|
28
27
|
class?: string | undefined | undefined;
|
|
29
28
|
};
|
|
30
29
|
events: {
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { onDestroy, tick } from 'svelte';
|
|
3
|
+
import type { ClassValue } from 'svelte/elements';
|
|
3
4
|
import { cls } from '@layerstack/tailwind';
|
|
4
5
|
import { objectId } from '@layerstack/utils/object';
|
|
6
|
+
import { merge } from 'lodash-es';
|
|
5
7
|
|
|
6
8
|
import {
|
|
7
9
|
motionStore,
|
|
@@ -10,7 +12,10 @@
|
|
|
10
12
|
type TweenedOptions,
|
|
11
13
|
} from '../stores/motionStore.js';
|
|
12
14
|
import { getCanvasContext } from './layout/Canvas.svelte';
|
|
13
|
-
import { renderRect } from '../utils/canvas.js';
|
|
15
|
+
import { renderRect, type ComputedStylesOptions } from '../utils/canvas.js';
|
|
16
|
+
|
|
17
|
+
/** Undlying `<rect>` tag when using <Svg>. Useful for bindings. */
|
|
18
|
+
export let element: SVGRectElement | undefined = undefined;
|
|
14
19
|
|
|
15
20
|
export let x = 0;
|
|
16
21
|
export let initialX = x;
|
|
@@ -29,9 +34,17 @@
|
|
|
29
34
|
export let stroke: string | undefined = undefined;
|
|
30
35
|
export let strokeWidth: number | undefined = undefined;
|
|
31
36
|
|
|
32
|
-
let className:
|
|
37
|
+
let className: ClassValue | undefined = undefined;
|
|
33
38
|
export { className as class };
|
|
34
39
|
|
|
40
|
+
export let onclick: ((e: MouseEvent) => void) | undefined = undefined;
|
|
41
|
+
export let ondblclick: ((e: MouseEvent) => void) | undefined = undefined;
|
|
42
|
+
export let onpointerenter: ((e: PointerEvent) => void) | undefined = undefined;
|
|
43
|
+
export let onpointermove: ((e: PointerEvent) => void) | undefined = undefined;
|
|
44
|
+
export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
|
|
45
|
+
export let onpointerover: ((e: PointerEvent) => void) | undefined = undefined;
|
|
46
|
+
export let onpointerout: ((e: PointerEvent) => void) | undefined = undefined;
|
|
47
|
+
|
|
35
48
|
export let spring: boolean | SpringOptions | { [prop: string]: SpringOptions } = undefined;
|
|
36
49
|
export let tweened: boolean | TweenedOptions | { [prop: string]: TweenedOptions } = undefined;
|
|
37
50
|
|
|
@@ -50,14 +63,19 @@
|
|
|
50
63
|
const canvasContext = getCanvasContext();
|
|
51
64
|
const renderContext = canvasContext ? 'canvas' : 'svg';
|
|
52
65
|
|
|
53
|
-
function render(
|
|
66
|
+
function render(
|
|
67
|
+
ctx: CanvasRenderingContext2D,
|
|
68
|
+
styleOverrides: ComputedStylesOptions | undefined
|
|
69
|
+
) {
|
|
54
70
|
renderRect(
|
|
55
71
|
ctx,
|
|
56
72
|
{ x: $tweened_x, y: $tweened_y, width: $tweened_width, height: $tweened_height },
|
|
57
|
-
|
|
58
|
-
styles: {
|
|
59
|
-
|
|
60
|
-
|
|
73
|
+
styleOverrides
|
|
74
|
+
? merge({ styles: { strokeWidth } }, styleOverrides)
|
|
75
|
+
: {
|
|
76
|
+
styles: { fill, fillOpacity, stroke, strokeWidth },
|
|
77
|
+
classes: className,
|
|
78
|
+
}
|
|
61
79
|
);
|
|
62
80
|
}
|
|
63
81
|
|
|
@@ -80,7 +98,19 @@
|
|
|
80
98
|
|
|
81
99
|
let canvasUnregister: ReturnType<typeof canvasContext.register>;
|
|
82
100
|
$: if (renderContext === 'canvas') {
|
|
83
|
-
canvasUnregister = canvasContext.register({
|
|
101
|
+
canvasUnregister = canvasContext.register({
|
|
102
|
+
name: 'Rect',
|
|
103
|
+
render,
|
|
104
|
+
events: {
|
|
105
|
+
click: onclick,
|
|
106
|
+
dblclick: ondblclick,
|
|
107
|
+
pointerenter: onpointerenter,
|
|
108
|
+
pointermove: onpointermove,
|
|
109
|
+
pointerleave: onpointerleave,
|
|
110
|
+
pointerover: onpointerover,
|
|
111
|
+
pointerout: onpointerout,
|
|
112
|
+
},
|
|
113
|
+
});
|
|
84
114
|
}
|
|
85
115
|
|
|
86
116
|
onDestroy(() => {
|
|
@@ -104,12 +134,13 @@
|
|
|
104
134
|
stroke-width={strokeWidth}
|
|
105
135
|
class={cls(fill == null && 'fill-surface-content', className)}
|
|
106
136
|
{...$$restProps}
|
|
107
|
-
on:click
|
|
108
|
-
on:
|
|
109
|
-
on:
|
|
110
|
-
on:
|
|
111
|
-
on:
|
|
112
|
-
on:
|
|
113
|
-
on:
|
|
137
|
+
on:click={onclick}
|
|
138
|
+
on:dblclick={ondblclick}
|
|
139
|
+
on:pointerenter={onpointerenter}
|
|
140
|
+
on:pointerover={onpointerover}
|
|
141
|
+
on:pointermove={onpointermove}
|
|
142
|
+
on:pointerout={onpointerout}
|
|
143
|
+
on:pointerleave={onpointerleave}
|
|
144
|
+
bind:this={element}
|
|
114
145
|
/>
|
|
115
146
|
{/if}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
// https://github.com/d3/d3-sankey
|
|
3
|
-
import { createEventDispatcher } from 'svelte';
|
|
4
3
|
import {
|
|
5
4
|
sankey as d3Sankey,
|
|
6
5
|
sankeyLeft,
|
|
@@ -13,8 +12,6 @@
|
|
|
13
12
|
|
|
14
13
|
import { chartContext } from './ChartContext.svelte';
|
|
15
14
|
|
|
16
|
-
const dispatch = createEventDispatcher();
|
|
17
|
-
|
|
18
15
|
const { data, width, height } = chartContext();
|
|
19
16
|
|
|
20
17
|
export let nodes = (d: any) => d.nodes;
|
|
@@ -35,6 +32,8 @@
|
|
|
35
32
|
export let links = (d: any) => d.links;
|
|
36
33
|
export let linkSort = undefined;
|
|
37
34
|
|
|
35
|
+
export let onupdate: ((data: typeof sankeyData) => void) | undefined = undefined;
|
|
36
|
+
|
|
38
37
|
$: sankey = d3Sankey()
|
|
39
38
|
.size([$width, $height])
|
|
40
39
|
.nodes(nodes)
|
|
@@ -64,7 +63,7 @@
|
|
|
64
63
|
$: _nodes = sankeyData.nodes as SankeyNode<NodeExtraProperties, any>[];
|
|
65
64
|
$: _links = sankeyData.links as SankeyLink<NodeExtraProperties, any>[];
|
|
66
65
|
|
|
67
|
-
$:
|
|
66
|
+
$: onupdate?.(sankeyData);
|
|
68
67
|
</script>
|
|
69
68
|
|
|
70
69
|
<slot nodes={_nodes} links={_links} />
|
|
@@ -12,10 +12,9 @@ declare const __propDef: {
|
|
|
12
12
|
nodeSort?: undefined;
|
|
13
13
|
links?: (d: any) => any;
|
|
14
14
|
linkSort?: undefined;
|
|
15
|
+
onupdate?: ((data: import("d3-sankey").SankeyGraph<{}, {}>) => void) | undefined;
|
|
15
16
|
};
|
|
16
17
|
events: {
|
|
17
|
-
update: CustomEvent<any>;
|
|
18
|
-
} & {
|
|
19
18
|
[evt: string]: CustomEvent<any>;
|
|
20
19
|
};
|
|
21
20
|
slots: {
|