layerchart 0.81.2 → 0.90.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 +20 -21
- 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 +23 -15
- package/dist/components/charts/BarChart.svelte +24 -11
- package/dist/components/charts/LineChart.svelte +23 -15
- package/dist/components/charts/PieChart.svelte +24 -19
- package/dist/components/charts/PieChart.svelte.d.ts +29 -7
- package/dist/components/charts/ScatterChart.svelte +13 -7
- 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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { tweened as tweenedStore } from 'svelte/motion';
|
|
5
5
|
import { draw as _drawTransition } from 'svelte/transition';
|
|
6
6
|
import { cubicInOut } from 'svelte/easing';
|
|
7
|
+
import { merge } from 'lodash-es';
|
|
7
8
|
|
|
8
9
|
import { line as d3Line, lineRadial } from 'd3-shape';
|
|
9
10
|
import type { CurveFactory, CurveFactoryLineOnly, Line } from 'd3-shape';
|
|
@@ -22,8 +23,8 @@
|
|
|
22
23
|
import { accessor, type Accessor } from '../utils/common.js';
|
|
23
24
|
import { isScaleBand } from '../utils/scales.js';
|
|
24
25
|
import { flattenPathData } from '../utils/path.js';
|
|
25
|
-
import { renderPathData } from '../utils/canvas.js';
|
|
26
26
|
import { getCanvasContext } from './layout/Canvas.svelte';
|
|
27
|
+
import { renderPathData, type ComputedStylesOptions } from '../utils/canvas.js';
|
|
27
28
|
|
|
28
29
|
const {
|
|
29
30
|
data: contextData,
|
|
@@ -72,6 +73,15 @@
|
|
|
72
73
|
let className: string | undefined = undefined;
|
|
73
74
|
export { className as class };
|
|
74
75
|
|
|
76
|
+
export let onclick: ((e: MouseEvent) => void) | undefined = undefined;
|
|
77
|
+
export let onpointerenter: ((e: PointerEvent) => void) | undefined = undefined;
|
|
78
|
+
export let onpointermove: ((e: PointerEvent) => void) | undefined = undefined;
|
|
79
|
+
export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
|
|
80
|
+
export let onpointerdown: ((e: PointerEvent) => void) | undefined = undefined;
|
|
81
|
+
export let ontouchmove: ((e: TouchEvent) => void) | undefined = undefined;
|
|
82
|
+
export let onpointerover: ((e: PointerEvent) => void) | undefined = undefined;
|
|
83
|
+
export let onpointerout: ((e: PointerEvent) => void) | undefined = undefined;
|
|
84
|
+
|
|
75
85
|
/** Marker to attach to start, mid, and end points of path */
|
|
76
86
|
export let marker: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
|
|
77
87
|
undefined;
|
|
@@ -167,11 +177,20 @@
|
|
|
167
177
|
const canvasContext = getCanvasContext();
|
|
168
178
|
const renderContext = canvasContext ? 'canvas' : 'svg';
|
|
169
179
|
|
|
170
|
-
function render(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
180
|
+
function render(
|
|
181
|
+
ctx: CanvasRenderingContext2D,
|
|
182
|
+
styleOverrides: ComputedStylesOptions | undefined
|
|
183
|
+
) {
|
|
184
|
+
renderPathData(
|
|
185
|
+
ctx,
|
|
186
|
+
$tweened_d,
|
|
187
|
+
styleOverrides
|
|
188
|
+
? merge({ styles: { strokeWidth } }, styleOverrides)
|
|
189
|
+
: {
|
|
190
|
+
styles: { fill, stroke, strokeWidth, opacity },
|
|
191
|
+
classes: className,
|
|
192
|
+
}
|
|
193
|
+
);
|
|
175
194
|
}
|
|
176
195
|
|
|
177
196
|
// TODO: Use objectId to work around Svelte 4 reactivity issue (even when memoizing gradients)
|
|
@@ -186,7 +205,20 @@
|
|
|
186
205
|
|
|
187
206
|
let canvasUnregister: ReturnType<typeof canvasContext.register>;
|
|
188
207
|
$: if (renderContext === 'canvas') {
|
|
189
|
-
canvasUnregister = canvasContext.register({
|
|
208
|
+
canvasUnregister = canvasContext.register({
|
|
209
|
+
name: 'Spline',
|
|
210
|
+
render,
|
|
211
|
+
events: {
|
|
212
|
+
click: onclick,
|
|
213
|
+
pointerenter: onpointerenter,
|
|
214
|
+
pointermove: onpointermove,
|
|
215
|
+
pointerleave: onpointerleave,
|
|
216
|
+
pointerdown: onpointerdown,
|
|
217
|
+
pointerover: onpointerover,
|
|
218
|
+
pointerout: onpointerout,
|
|
219
|
+
touchmove: ontouchmove,
|
|
220
|
+
},
|
|
221
|
+
});
|
|
190
222
|
}
|
|
191
223
|
|
|
192
224
|
onDestroy(() => {
|
|
@@ -244,10 +276,14 @@
|
|
|
244
276
|
marker-mid={markerMidId ? `url(#${markerMidId})` : undefined}
|
|
245
277
|
marker-end={markerEndId ? `url(#${markerEndId})` : undefined}
|
|
246
278
|
in:drawTransition|global={typeof draw === 'object' ? draw : undefined}
|
|
247
|
-
on:click
|
|
248
|
-
on:pointerenter
|
|
249
|
-
on:pointermove
|
|
250
|
-
on:pointerleave
|
|
279
|
+
on:click={onclick}
|
|
280
|
+
on:pointerenter={onpointerenter}
|
|
281
|
+
on:pointermove={onpointermove}
|
|
282
|
+
on:pointerleave={onpointerleave}
|
|
283
|
+
on:pointerdown={onpointerdown}
|
|
284
|
+
on:pointerover={onpointerover}
|
|
285
|
+
on:pointerout={onpointerout}
|
|
286
|
+
on:touchmove={ontouchmove}
|
|
251
287
|
bind:this={pathEl}
|
|
252
288
|
/>
|
|
253
289
|
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
import type { spring as springStore, tweened as tweenedStore } from 'svelte/motion';
|
|
4
4
|
import { cls } from '@layerstack/tailwind';
|
|
5
5
|
import { objectId } from '@layerstack/utils/object';
|
|
6
|
+
import { merge } from 'lodash-es';
|
|
6
7
|
|
|
7
8
|
import { getStringWidth } from '../utils/string.js';
|
|
8
9
|
import { motionStore } from '../stores/motionStore.js';
|
|
9
10
|
import { getCanvasContext } from './layout/Canvas.svelte';
|
|
10
|
-
import { renderText } from '../utils/canvas.js';
|
|
11
|
+
import { renderText, type ComputedStylesOptions } from '../utils/canvas.js';
|
|
11
12
|
|
|
12
13
|
/*
|
|
13
14
|
TODO:
|
|
@@ -182,7 +183,10 @@
|
|
|
182
183
|
const canvasContext = getCanvasContext();
|
|
183
184
|
const renderContext = canvasContext ? 'canvas' : 'svg';
|
|
184
185
|
|
|
185
|
-
function render(
|
|
186
|
+
function render(
|
|
187
|
+
ctx: CanvasRenderingContext2D,
|
|
188
|
+
styleOverrides: ComputedStylesOptions | undefined
|
|
189
|
+
) {
|
|
186
190
|
wordsByLines.forEach((line, index) => {
|
|
187
191
|
renderText(
|
|
188
192
|
ctx,
|
|
@@ -194,10 +198,12 @@
|
|
|
194
198
|
getPixelValue(dy) +
|
|
195
199
|
(index === 0 ? startDy : getPixelValue(lineHeight)),
|
|
196
200
|
},
|
|
197
|
-
|
|
198
|
-
styles: {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
+
styleOverrides
|
|
202
|
+
? merge({ styles: { strokeWidth } }, styleOverrides)
|
|
203
|
+
: {
|
|
204
|
+
styles: { fill, fillOpacity, stroke, strokeWidth, paintOrder: 'stroke', textAnchor },
|
|
205
|
+
classes: cls(fill === undefined && 'fill-surface-content', className),
|
|
206
|
+
}
|
|
201
207
|
);
|
|
202
208
|
});
|
|
203
209
|
}
|
|
@@ -54,8 +54,6 @@
|
|
|
54
54
|
</script>
|
|
55
55
|
|
|
56
56
|
<script lang="ts">
|
|
57
|
-
import { createEventDispatcher } from 'svelte';
|
|
58
|
-
|
|
59
57
|
import { chartContext } from './ChartContext.svelte';
|
|
60
58
|
import { motionStore, type MotionOptions, motionFinishHandler } from '../stores/motionStore.js';
|
|
61
59
|
|
|
@@ -90,11 +88,11 @@
|
|
|
90
88
|
/** Distance/threshold to consider drag vs click (disable click propagation) */
|
|
91
89
|
export let clickDistance = 10;
|
|
92
90
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
export let ondragstart: (() => void) | undefined = undefined;
|
|
92
|
+
export let ondragend: (() => void) | undefined = undefined;
|
|
93
|
+
export let ontransform:
|
|
94
|
+
| ((e: { scale: number; translate: { x: number; y: number } }) => void)
|
|
95
|
+
| undefined = undefined;
|
|
98
96
|
|
|
99
97
|
let pointerDown = false;
|
|
100
98
|
const dragging = writable(false);
|
|
@@ -161,7 +159,7 @@
|
|
|
161
159
|
startPoint = localPoint(e);
|
|
162
160
|
startTranslate = $translate;
|
|
163
161
|
|
|
164
|
-
|
|
162
|
+
ondragstart?.();
|
|
165
163
|
}
|
|
166
164
|
|
|
167
165
|
function onPointerMove(e: PointerEvent) {
|
|
@@ -194,7 +192,7 @@
|
|
|
194
192
|
function onPointerUp(e: PointerEvent) {
|
|
195
193
|
pointerDown = false;
|
|
196
194
|
$dragging = false;
|
|
197
|
-
|
|
195
|
+
ondragend?.();
|
|
198
196
|
}
|
|
199
197
|
|
|
200
198
|
function onClick(e: MouseEvent) {
|
|
@@ -297,7 +295,7 @@
|
|
|
297
295
|
y: center.y - $translate.y,
|
|
298
296
|
};
|
|
299
297
|
|
|
300
|
-
$:
|
|
298
|
+
$: ontransform?.({ scale: $scale, translate: $translate });
|
|
301
299
|
|
|
302
300
|
setTransformContext({
|
|
303
301
|
mode,
|
|
@@ -47,6 +47,15 @@ declare const __propDef: {
|
|
|
47
47
|
/** Disable pointer events including move/dragging. Useful for `mode="canvas" but only want zoomTo() interactions */ disablePointer?: boolean;
|
|
48
48
|
/** Action to take during wheel scroll */ initialScrollMode?: TransformScrollMode;
|
|
49
49
|
/** Distance/threshold to consider drag vs click (disable click propagation) */ clickDistance?: number;
|
|
50
|
+
ondragstart?: (() => void) | undefined;
|
|
51
|
+
ondragend?: (() => void) | undefined;
|
|
52
|
+
ontransform?: ((e: {
|
|
53
|
+
scale: number;
|
|
54
|
+
translate: {
|
|
55
|
+
x: number;
|
|
56
|
+
y: number;
|
|
57
|
+
};
|
|
58
|
+
}) => void) | undefined;
|
|
50
59
|
initialTranslate?: {
|
|
51
60
|
x: number;
|
|
52
61
|
y: number;
|
|
@@ -86,15 +95,6 @@ declare const __propDef: {
|
|
|
86
95
|
keydown: KeyboardEvent;
|
|
87
96
|
keyup: KeyboardEvent;
|
|
88
97
|
keypress: KeyboardEvent;
|
|
89
|
-
dragstart: CustomEvent<null>;
|
|
90
|
-
dragend: CustomEvent<null>;
|
|
91
|
-
transform: CustomEvent<{
|
|
92
|
-
scale: number;
|
|
93
|
-
translate: {
|
|
94
|
-
x: number;
|
|
95
|
-
y: number;
|
|
96
|
-
};
|
|
97
|
-
}>;
|
|
98
98
|
} & {
|
|
99
99
|
[evt: string]: CustomEvent<any>;
|
|
100
100
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { createEventDispatcher } from 'svelte';
|
|
3
2
|
import { min } from 'd3-array';
|
|
4
3
|
import { Delaunay } from 'd3-delaunay';
|
|
5
4
|
import type { GeoPermissibleObjects } from 'd3-geo';
|
|
@@ -11,6 +10,7 @@
|
|
|
11
10
|
import { chartContext } from './ChartContext.svelte';
|
|
12
11
|
import GeoPath from './GeoPath.svelte';
|
|
13
12
|
import { geoContext, type GeoContext } from './GeoContext.svelte';
|
|
13
|
+
import Spline from './Spline.svelte';
|
|
14
14
|
|
|
15
15
|
const { flatData, xGet, yGet, x: xContext, y: yContext, width, height, radial } = chartContext();
|
|
16
16
|
const geo = geoContext() as GeoContext | undefined;
|
|
@@ -23,21 +23,43 @@
|
|
|
23
23
|
path?: string;
|
|
24
24
|
} = {};
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
export let onclick:
|
|
27
|
+
| ((
|
|
28
|
+
e: MouseEvent,
|
|
29
|
+
details: { data: any; point?: [number, number]; feature?: GeoPermissibleObjects }
|
|
30
|
+
) => void)
|
|
31
|
+
| undefined = undefined;
|
|
32
|
+
export let onpointerenter:
|
|
33
|
+
| ((
|
|
34
|
+
e: PointerEvent,
|
|
35
|
+
details: {
|
|
36
|
+
data: any;
|
|
37
|
+
point?: [number, number];
|
|
38
|
+
feature?: GeoPermissibleObjects;
|
|
39
|
+
}
|
|
40
|
+
) => void)
|
|
41
|
+
| undefined = undefined;
|
|
42
|
+
export let onpointermove:
|
|
43
|
+
| ((
|
|
44
|
+
e: PointerEvent,
|
|
45
|
+
details: {
|
|
46
|
+
data: any;
|
|
47
|
+
point?: [number, number];
|
|
48
|
+
feature?: GeoPermissibleObjects;
|
|
49
|
+
}
|
|
50
|
+
) => void)
|
|
51
|
+
| undefined = undefined;
|
|
52
|
+
export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
|
|
53
|
+
export let onpointerdown:
|
|
54
|
+
| ((
|
|
55
|
+
e: PointerEvent,
|
|
56
|
+
details: {
|
|
57
|
+
data: any;
|
|
58
|
+
point?: [number, number];
|
|
59
|
+
feature?: GeoPermissibleObjects;
|
|
60
|
+
}
|
|
61
|
+
) => void)
|
|
62
|
+
| undefined = undefined;
|
|
41
63
|
|
|
42
64
|
$: points = (data ?? $flatData).map((d: any) => {
|
|
43
65
|
// geo voronoi needs raw latitude/longtude, not mapped to range (chart dimensions)
|
|
@@ -71,38 +93,38 @@
|
|
|
71
93
|
{#each polygons.features as feature}
|
|
72
94
|
<GeoPath
|
|
73
95
|
geojson={feature}
|
|
74
|
-
class={cls('fill-transparent', classes.path)}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
96
|
+
class={cls('fill-transparent stroke-transparent', classes.path)}
|
|
97
|
+
onclick={(e) => onclick?.(e, { data: feature.properties.site.data, feature })}
|
|
98
|
+
onpointerenter={(e) => onpointerenter?.(e, { data: feature.properties.site.data, feature })}
|
|
99
|
+
onpointermove={(e) => onpointermove?.(e, { data: feature.properties.site.data, feature })}
|
|
100
|
+
onpointerdown={(e) => onpointerdown?.(e, { data: feature.properties.site.data, feature })}
|
|
101
|
+
{onpointerleave}
|
|
102
|
+
ontouchmove={(e) => {
|
|
81
103
|
// Prevent touch to not interfer with pointer
|
|
82
104
|
e.preventDefault();
|
|
83
105
|
}}
|
|
84
|
-
on:pointerdown
|
|
85
|
-
on:click={(e) => dispatch('click', { data: feature.properties.site.data, feature })}
|
|
86
106
|
/>
|
|
87
107
|
{/each}
|
|
88
108
|
{:else}
|
|
89
109
|
{@const voronoi = Delaunay.from(points).voronoi([0, 0, boundWidth, boundHeight])}
|
|
90
110
|
{#each points as point, i}
|
|
91
|
-
|
|
92
|
-
<!--
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
e.
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
{@const pathData = voronoi.renderCell(i)}
|
|
112
|
+
<!-- Wait to render Spline until pathData is available to fix path artifacts from injected tweened points in Spline -->
|
|
113
|
+
{#if pathData}
|
|
114
|
+
<Spline
|
|
115
|
+
{pathData}
|
|
116
|
+
class={cls('fill-transparent stroke-transparent', classes.path)}
|
|
117
|
+
onclick={(e) => onclick?.(e, { data: point.data, point })}
|
|
118
|
+
onpointerenter={(e) => onpointerenter?.(e, { data: point.data, point })}
|
|
119
|
+
onpointermove={(e) => onpointermove?.(e, { data: point.data, point })}
|
|
120
|
+
{onpointerleave}
|
|
121
|
+
onpointerdown={(e) => onpointerdown?.(e, { data: point.data, point })}
|
|
122
|
+
ontouchmove={(e) => {
|
|
123
|
+
// Prevent touch to not interfer with pointer
|
|
124
|
+
e.preventDefault();
|
|
125
|
+
}}
|
|
126
|
+
/>
|
|
127
|
+
{/if}
|
|
106
128
|
{/each}
|
|
107
129
|
{/if}
|
|
108
130
|
</g>
|
|
@@ -8,28 +8,29 @@ declare const __propDef: {
|
|
|
8
8
|
root?: string;
|
|
9
9
|
path?: string;
|
|
10
10
|
} | undefined;
|
|
11
|
-
|
|
12
|
-
events: {
|
|
13
|
-
pointerleave: PointerEvent;
|
|
14
|
-
pointerdown: PointerEvent;
|
|
15
|
-
click: CustomEvent<{
|
|
11
|
+
onclick?: ((e: MouseEvent, details: {
|
|
16
12
|
data: any;
|
|
17
13
|
point?: [number, number];
|
|
18
14
|
feature?: GeoPermissibleObjects;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
event: PointerEvent;
|
|
15
|
+
}) => void) | undefined | undefined;
|
|
16
|
+
onpointerenter?: ((e: PointerEvent, details: {
|
|
22
17
|
data: any;
|
|
23
18
|
point?: [number, number];
|
|
24
19
|
feature?: GeoPermissibleObjects;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
event: PointerEvent;
|
|
20
|
+
}) => void) | undefined | undefined;
|
|
21
|
+
onpointermove?: ((e: PointerEvent, details: {
|
|
28
22
|
data: any;
|
|
29
23
|
point?: [number, number];
|
|
30
24
|
feature?: GeoPermissibleObjects;
|
|
31
|
-
}
|
|
32
|
-
|
|
25
|
+
}) => void) | undefined | undefined;
|
|
26
|
+
onpointerleave?: ((e: PointerEvent) => void) | undefined | undefined;
|
|
27
|
+
onpointerdown?: ((e: PointerEvent, details: {
|
|
28
|
+
data: any;
|
|
29
|
+
point?: [number, number];
|
|
30
|
+
feature?: GeoPermissibleObjects;
|
|
31
|
+
}) => void) | undefined | undefined;
|
|
32
|
+
};
|
|
33
|
+
events: {
|
|
33
34
|
[evt: string]: CustomEvent<any>;
|
|
34
35
|
};
|
|
35
36
|
slots: {};
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
interface $$Props extends ComponentProps<Chart<TData>> {
|
|
36
36
|
axis?: typeof axis;
|
|
37
37
|
brush?: typeof brush;
|
|
38
|
+
debug?: typeof debug;
|
|
38
39
|
grid?: typeof grid;
|
|
39
40
|
labels?: typeof labels;
|
|
40
41
|
legend?: typeof legend;
|
|
@@ -45,8 +46,8 @@
|
|
|
45
46
|
series?: typeof series;
|
|
46
47
|
seriesLayout?: typeof seriesLayout;
|
|
47
48
|
renderContext?: typeof renderContext;
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
onpointclick?: typeof onpointclick;
|
|
50
|
+
ontooltipclick?: typeof ontooltipclick;
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
export let data: $$Props['data'] = [];
|
|
@@ -83,13 +84,16 @@
|
|
|
83
84
|
export let rule: ComponentProps<Rule> | boolean = true;
|
|
84
85
|
|
|
85
86
|
/** Event dispatched with current tooltip data */
|
|
86
|
-
export let
|
|
87
|
+
export let ontooltipclick: (e: MouseEvent, details: { data: any }) => void = () => {};
|
|
87
88
|
|
|
88
89
|
/** Event dispatched when Highlight point is clicked (useful with multiple series) */
|
|
89
|
-
export let
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
export let onpointclick: (
|
|
91
|
+
e: MouseEvent,
|
|
92
|
+
details: {
|
|
93
|
+
data: HighlightPointData;
|
|
94
|
+
series: (typeof series)[number];
|
|
95
|
+
}
|
|
96
|
+
) => void = () => {};
|
|
93
97
|
|
|
94
98
|
export let props: {
|
|
95
99
|
area?: Partial<ComponentProps<Area>>;
|
|
@@ -118,6 +122,9 @@
|
|
|
118
122
|
/** Log initial render performance using `console.time` */
|
|
119
123
|
export let profile = false;
|
|
120
124
|
|
|
125
|
+
/** Enable debug mode */
|
|
126
|
+
export let debug = false;
|
|
127
|
+
|
|
121
128
|
$: allSeriesData = visibleSeries
|
|
122
129
|
.flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d })))
|
|
123
130
|
.filter((d) => d) as Array<TData & { stackData?: any }>;
|
|
@@ -274,7 +281,8 @@
|
|
|
274
281
|
? false
|
|
275
282
|
: {
|
|
276
283
|
mode: 'bisect-x',
|
|
277
|
-
|
|
284
|
+
onclick: ontooltipclick,
|
|
285
|
+
debug,
|
|
278
286
|
...props.tooltip?.context,
|
|
279
287
|
...$$props.tooltip,
|
|
280
288
|
}}
|
|
@@ -308,7 +316,7 @@
|
|
|
308
316
|
}}
|
|
309
317
|
|
|
310
318
|
<slot {...slotProps}>
|
|
311
|
-
<svelte:component this={renderContext === 'canvas' ? Canvas : Svg} center={radial}>
|
|
319
|
+
<svelte:component this={renderContext === 'canvas' ? Canvas : Svg} center={radial} {debug}>
|
|
312
320
|
<slot name="grid" {...slotProps}>
|
|
313
321
|
{#if grid}
|
|
314
322
|
<Grid x={radial} y {...typeof grid === 'object' ? grid : null} {...props.grid} />
|
|
@@ -381,9 +389,9 @@
|
|
|
381
389
|
),
|
|
382
390
|
}}
|
|
383
391
|
lines={i == 0}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
392
|
+
onpointclick={(e, detail) => onpointclick(e, { ...detail, series: s })}
|
|
393
|
+
onpointenter={() => (highlightSeriesKey = s.key)}
|
|
394
|
+
onpointleave={() => (highlightSeriesKey = null)}
|
|
387
395
|
{...props.highlight}
|
|
388
396
|
/>
|
|
389
397
|
{/each}
|
|
@@ -424,9 +432,9 @@
|
|
|
424
432
|
tickFormat={(key) => series.find((s) => s.key === key)?.label ?? key}
|
|
425
433
|
placement="bottom"
|
|
426
434
|
variant="swatches"
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
435
|
+
onclick={(e, item) => $selectedSeries.toggleSelected(item.value)}
|
|
436
|
+
onpointerenter={(e, item) => (highlightSeriesKey = item.value)}
|
|
437
|
+
onpointerleave={(e) => (highlightSeriesKey = null)}
|
|
430
438
|
{...props.legend}
|
|
431
439
|
{...typeof legend === 'object' ? legend : null}
|
|
432
440
|
classes={{
|
|
@@ -27,12 +27,13 @@
|
|
|
27
27
|
type Accessor,
|
|
28
28
|
} from '../../utils/common.js';
|
|
29
29
|
import { asAny } from '../../utils/types.js';
|
|
30
|
-
import type { Insets } from '../../
|
|
30
|
+
import type { Insets } from '../../utils/rect.js';
|
|
31
31
|
|
|
32
32
|
type ChartProps = ComponentProps<Chart<TData>>;
|
|
33
33
|
|
|
34
34
|
interface $$Props extends ChartProps {
|
|
35
35
|
axis?: typeof axis;
|
|
36
|
+
debug?: typeof debug;
|
|
36
37
|
grid?: typeof grid;
|
|
37
38
|
bandPadding?: typeof bandPadding;
|
|
38
39
|
groupPadding?: typeof groupPadding;
|
|
@@ -46,8 +47,8 @@
|
|
|
46
47
|
series?: typeof series;
|
|
47
48
|
seriesLayout?: typeof seriesLayout;
|
|
48
49
|
renderContext?: typeof renderContext;
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
onbarclick?: typeof onbarclick;
|
|
51
|
+
ontooltipclick?: typeof ontooltipclick;
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
export let data: $$Props['data'] = [];
|
|
@@ -93,11 +94,14 @@
|
|
|
93
94
|
export let stackPadding = 0;
|
|
94
95
|
|
|
95
96
|
/** Event dispatched with current tooltip data */
|
|
96
|
-
export let
|
|
97
|
+
export let ontooltipclick: (e: MouseEvent, detail: { data: any }) => void = () => {};
|
|
97
98
|
|
|
98
99
|
// TODO: Need to find a way to have this play nice with `tooltip={{ mode: 'band' }}`
|
|
99
100
|
/** Event dispatched when individual Bar is clicked (useful with multiple series) */
|
|
100
|
-
export let
|
|
101
|
+
export let onbarclick: (
|
|
102
|
+
e: MouseEvent,
|
|
103
|
+
detail: { data: any; series: (typeof series)[number] }
|
|
104
|
+
) => void = () => {};
|
|
101
105
|
|
|
102
106
|
$: xScale = $$props.xScale ?? (isVertical ? scaleBand().padding(bandPadding) : scaleLinear());
|
|
103
107
|
$: xBaseline = isVertical ? undefined : 0;
|
|
@@ -150,6 +154,9 @@
|
|
|
150
154
|
/** Log initial render performance using `console.time` */
|
|
151
155
|
export let profile = false;
|
|
152
156
|
|
|
157
|
+
/** Enable debug mode */
|
|
158
|
+
export let debug = false;
|
|
159
|
+
|
|
153
160
|
$: allSeriesData = visibleSeries
|
|
154
161
|
.flatMap((s) =>
|
|
155
162
|
s.data?.map((d) => {
|
|
@@ -226,7 +233,7 @@
|
|
|
226
233
|
strokeWidth: 1,
|
|
227
234
|
insets: stackInsets,
|
|
228
235
|
fill: s.color,
|
|
229
|
-
|
|
236
|
+
onbarclick: (e, detail) => onbarclick(e, { ...detail, series: s }),
|
|
230
237
|
...props.bars,
|
|
231
238
|
...s.props,
|
|
232
239
|
class: cls(
|
|
@@ -303,7 +310,13 @@
|
|
|
303
310
|
{...$$restProps}
|
|
304
311
|
tooltip={$$props.tooltip === false
|
|
305
312
|
? false
|
|
306
|
-
: {
|
|
313
|
+
: {
|
|
314
|
+
mode: 'band',
|
|
315
|
+
onclick: ontooltipclick,
|
|
316
|
+
debug,
|
|
317
|
+
...props.tooltip?.context,
|
|
318
|
+
...$$props.tooltip,
|
|
319
|
+
}}
|
|
307
320
|
let:x
|
|
308
321
|
let:xScale
|
|
309
322
|
let:y
|
|
@@ -332,7 +345,7 @@
|
|
|
332
345
|
getLabelsProps,
|
|
333
346
|
}}
|
|
334
347
|
<slot {...slotProps}>
|
|
335
|
-
<svelte:component this={renderContext === 'canvas' ? Canvas : Svg}>
|
|
348
|
+
<svelte:component this={renderContext === 'canvas' ? Canvas : Svg} {debug}>
|
|
336
349
|
<slot name="grid" {...slotProps}>
|
|
337
350
|
{#if grid}
|
|
338
351
|
<Grid
|
|
@@ -420,9 +433,9 @@
|
|
|
420
433
|
tickFormat={(key) => series.find((s) => s.key === key)?.label ?? key}
|
|
421
434
|
placement="bottom"
|
|
422
435
|
variant="swatches"
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
436
|
+
onclick={(e, item) => $selectedSeries.toggleSelected(item.value)}
|
|
437
|
+
onpointerenter={(e, item) => (highlightSeriesKey = item.value)}
|
|
438
|
+
onpointerleave={(e) => (highlightSeriesKey = null)}
|
|
426
439
|
{...props.legend}
|
|
427
440
|
{...typeof legend === 'object' ? legend : null}
|
|
428
441
|
classes={{
|