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.
Files changed (64) hide show
  1. package/dist/components/Arc.svelte +49 -14
  2. package/dist/components/Area.svelte +35 -11
  3. package/dist/components/Bar.svelte +15 -10
  4. package/dist/components/Bars.svelte +3 -3
  5. package/dist/components/Brush.svelte +20 -21
  6. package/dist/components/Calendar.svelte +2 -2
  7. package/dist/components/Chart.svelte +17 -4
  8. package/dist/components/Chart.svelte.d.ts +21 -10
  9. package/dist/components/ChartClipPath.svelte +0 -1
  10. package/dist/components/ChartClipPath.svelte.d.ts +0 -2
  11. package/dist/components/ChartContext.svelte +4 -11
  12. package/dist/components/ChartContext.svelte.d.ts +1 -1
  13. package/dist/components/Circle.svelte +35 -11
  14. package/dist/components/ClipPath.svelte +1 -1
  15. package/dist/components/ClipPath.svelte.d.ts +0 -5
  16. package/dist/components/ForceSimulation.svelte +8 -12
  17. package/dist/components/ForceSimulation.svelte.d.ts +6 -8
  18. package/dist/components/Frame.svelte +4 -7
  19. package/dist/components/Frame.svelte.d.ts +1 -5
  20. package/dist/components/GeoCircle.svelte +7 -1
  21. package/dist/components/GeoCircle.svelte.d.ts +6 -7
  22. package/dist/components/GeoPath.svelte +68 -39
  23. package/dist/components/GeoPath.svelte.d.ts +6 -12
  24. package/dist/components/GeoPoint.svelte +3 -24
  25. package/dist/components/GeoPoint.svelte.d.ts +4 -5
  26. package/dist/components/Graticule.svelte.d.ts +12 -6
  27. package/dist/components/Group.svelte +26 -6
  28. package/dist/components/Highlight.svelte +22 -12
  29. package/dist/components/Hull.svelte +20 -15
  30. package/dist/components/Hull.svelte.d.ts +7 -9
  31. package/dist/components/Legend.svelte +7 -7
  32. package/dist/components/Legend.svelte.d.ts +3 -3
  33. package/dist/components/Line.svelte +35 -10
  34. package/dist/components/Link.svelte +16 -9
  35. package/dist/components/Points.svelte +24 -57
  36. package/dist/components/Points.svelte.d.ts +0 -1
  37. package/dist/components/Rect.svelte +46 -15
  38. package/dist/components/Sankey.svelte +3 -4
  39. package/dist/components/Sankey.svelte.d.ts +1 -2
  40. package/dist/components/Spline.svelte +47 -11
  41. package/dist/components/Text.svelte +12 -6
  42. package/dist/components/TransformContext.svelte +8 -10
  43. package/dist/components/TransformContext.svelte.d.ts +9 -9
  44. package/dist/components/Voronoi.svelte +62 -40
  45. package/dist/components/Voronoi.svelte.d.ts +14 -13
  46. package/dist/components/charts/AreaChart.svelte +23 -15
  47. package/dist/components/charts/BarChart.svelte +24 -11
  48. package/dist/components/charts/LineChart.svelte +23 -15
  49. package/dist/components/charts/PieChart.svelte +24 -19
  50. package/dist/components/charts/PieChart.svelte.d.ts +29 -7
  51. package/dist/components/charts/ScatterChart.svelte +13 -7
  52. package/dist/components/index.d.ts +0 -1
  53. package/dist/components/index.js +0 -1
  54. package/dist/components/layout/Canvas.svelte +148 -7
  55. package/dist/components/layout/Canvas.svelte.d.ts +15 -2
  56. package/dist/components/tooltip/TooltipContext.svelte +25 -20
  57. package/dist/components/tooltip/TooltipContext.svelte.d.ts +6 -2
  58. package/dist/utils/canvas.js +39 -33
  59. package/dist/utils/color.d.ts +15 -0
  60. package/dist/utils/color.js +15 -0
  61. package/package.json +1 -1
  62. package/dist/components/Brush.svelte.d.ts +0 -65
  63. package/dist/components/HitCanvas.svelte +0 -118
  64. 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 onAreaClick: (e: { data: any }) => void = () => {};
70
- export let onBarClick: (e: { data: any }) => void = () => {};
71
-
72
- export let onPointClick: (e: { point: (typeof _points)[number]; data: any }) => void = () => {};
73
- export let onPointEnter: (e: { point: (typeof _points)[number]; data: any }) => void = () => {};
74
- export let onPointLeave: (e: { point: (typeof _points)[number]; data: any }) => void = () => {};
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
- on:click={() => onAreaClick({ data: highlightData })}
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
- on:click={() => onBarClick({ data: highlightData })}
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-[6] stroke-white [paint-order:stroke] drop-shadow',
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
- on:click={() => onPointClick({ point, data: highlightData })}
417
- on:pointerenter={() => onPointEnter({ point, data: highlightData })}
418
- on:pointerleave={() => onPointLeave({ point, data: highlightData })}
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 { createEventDispatcher, type ComponentProps } from 'svelte';
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
- const dispatch = createEventDispatcher<{
29
- click: { points: [number, number][]; polygon: Delaunay.Polygon };
30
- pointermove: {
31
- event: PointerEvent;
32
- points: [number, number][];
33
- polygon: Delaunay.Polygon;
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
- on:pointermove={(e) => dispatch('pointermove', { event: e, points, polygon })}
59
- on:pointerleave
60
- on:click={(e) => dispatch('click', { points, polygon })}
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
- on:pointermove={(e) => dispatch('pointermove', { event: e, points, polygon })}
72
- on:pointerleave
73
- on:click={(e) => dispatch('click', { points, polygon })}
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
- pointermove: CustomEvent<{
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 onClick: ((item: any) => any) | undefined = undefined;
39
- export let onPointerEnter: ((item: any) => any) | undefined = undefined;
40
- export let onPointerLeave: ((item: any) => any) | undefined = undefined;
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', !onClick && 'cursor-auto', classes.item?.(item))}
218
- on:click={() => onClick?.(item)}
219
- on:pointerenter={() => onPointerEnter?.(item)}
220
- on:pointerleave={() => onPointerLeave?.(item)}
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
- onClick?: ((item: any) => any) | undefined | undefined;
18
- onPointerEnter?: ((item: any) => any) | undefined | undefined;
19
- onPointerLeave?: ((item: any) => any) | undefined | undefined;
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(ctx: CanvasRenderingContext2D) {
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(ctx, pathData, {
67
- styles: { fill, stroke, strokeWidth },
68
- classes: className,
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({ name: 'Line', render });
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:pointermove
117
- on:pointerleave
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
- <!-- svelte-ignore a11y-mouse-events-have-key-events -->
73
- <!-- svelte-ignore a11y-no-static-element-interactions -->
74
- <path
80
+ <Spline
75
81
  class="path-link"
76
- d={$tweened_d}
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
- on:click
82
- on:pointerover
83
- on:pointermove
84
- on:pointerout
85
- on:pointerleave
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 { onDestroy, type ComponentProps } from 'svelte';
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 renderContext === 'svg' || (renderContext === 'canvas' && !render)}
197
- {#if links}
198
- <g class="link-group">
199
- {#each _links as link}
200
- <Link
201
- data={link}
202
- class="stroke-surface-content/50"
203
- {...typeof links === 'object' ? links : null}
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: string | undefined = undefined;
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(ctx: CanvasRenderingContext2D) {
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: { fill, fillOpacity, stroke, strokeWidth },
59
- classes: className,
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({ name: 'Rect', render });
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:pointerenter
109
- on:pointerover
110
- on:pointermove
111
- on:pointerout
112
- on:pointerleave
113
- on:dblclick
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
- $: dispatch('update', sankeyData);
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: {