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
@@ -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(ctx: CanvasRenderingContext2D) {
171
- renderPathData(ctx, $tweened_d, {
172
- styles: { stroke, fill, strokeWidth, opacity },
173
- classes: className,
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({ name: 'Spline', render });
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(ctx: CanvasRenderingContext2D) {
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: { fill, fillOpacity, stroke, strokeWidth, paintOrder: 'stroke', textAnchor },
199
- classes: cls(fill === undefined && 'fill-surface-content', className),
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
- const dispatch = createEventDispatcher<{
94
- dragstart: null;
95
- dragend: null;
96
- transform: { scale: number; translate: { x: number; y: number } };
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
- dispatch('dragstart');
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
- dispatch('dragend');
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
- $: dispatch('transform', { scale: $scale, translate: $translate });
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
- const dispatch = createEventDispatcher<{
27
- click: { data: any; point?: [number, number]; feature?: GeoPermissibleObjects };
28
- pointerenter: {
29
- event: PointerEvent;
30
- data: any;
31
- point?: [number, number];
32
- feature?: GeoPermissibleObjects;
33
- };
34
- pointermove: {
35
- event: PointerEvent;
36
- data: any;
37
- point?: [number, number];
38
- feature?: GeoPermissibleObjects;
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
- on:pointerenter={(e) =>
76
- dispatch('pointerenter', { event: e, data: feature.properties.site.data, feature })}
77
- on:pointermove={(e) =>
78
- dispatch('pointermove', { event: e, data: feature.properties.site.data, feature })}
79
- on:pointerleave
80
- on:touchmove={(e) => {
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
- <!-- svelte-ignore a11y-click-events-have-key-events -->
92
- <!-- svelte-ignore a11y-no-static-element-interactions -->
93
- <path
94
- d={voronoi.renderCell(i)}
95
- class={cls('fill-transparent', classes.path)}
96
- on:pointerenter={(e) => dispatch('pointerenter', { event: e, data: point.data, point })}
97
- on:pointermove={(e) => dispatch('pointermove', { event: e, data: point.data, point })}
98
- on:pointerleave
99
- on:touchmove={(e) => {
100
- // Prevent touch to not interfer with pointer
101
- e.preventDefault();
102
- }}
103
- on:pointerdown
104
- on:click={(e) => dispatch('click', { data: point.data, point })}
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
- pointerenter: CustomEvent<{
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
- pointermove: CustomEvent<{
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
- onPointClick?: typeof onPointClick;
49
- onTooltipClick?: typeof onTooltipClick;
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 onTooltipClick: (e: { data: any }) => void = () => {};
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 onPointClick: (e: {
90
- data: HighlightPointData;
91
- series: (typeof series)[number];
92
- }) => void = () => {};
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
- onClick: onTooltipClick,
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
- onPointClick={(e) => onPointClick({ ...e, series: s })}
385
- onPointEnter={() => (highlightSeriesKey = s.key)}
386
- onPointLeave={() => (highlightSeriesKey = null)}
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
- onClick={(item) => $selectedSeries.toggleSelected(item.value)}
428
- onPointerEnter={(item) => (highlightSeriesKey = item.value)}
429
- onPointerLeave={(item) => (highlightSeriesKey = null)}
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 '../../index.js/utils/rect.js';
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
- onBarClick?: typeof onBarClick;
50
- onTooltipClick?: typeof onTooltipClick;
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 onTooltipClick: (e: { data: any }) => void = () => {};
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 onBarClick: (e: { data: any; series: (typeof series)[number] }) => void = () => {};
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
- onBarClick: (e) => onBarClick({ data: e.data, series: s }),
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
- : { mode: 'band', onClick: onTooltipClick, ...props.tooltip?.context, ...$$props.tooltip }}
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
- onClick={(item) => $selectedSeries.toggleSelected(item.value)}
424
- onPointerEnter={(item) => (highlightSeriesKey = item.value)}
425
- onPointerLeave={(item) => (highlightSeriesKey = null)}
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={{