layerchart 0.81.3 → 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 +22 -15
  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
@@ -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 { motionStore } from '../stores/motionStore.js';
8
9
  import { getCanvasContext } from './layout/Canvas.svelte';
9
10
  import { circlePath } from '../utils/path.js';
10
- import { renderPathData } from '../utils/canvas.js';
11
+ import { renderPathData, type ComputedStylesOptions } from '../utils/canvas.js';
11
12
 
12
13
  export let cx: number = 0;
13
14
  export let initialCx = cx;
@@ -29,6 +30,11 @@
29
30
  let className: string | undefined = undefined;
30
31
  export { className as class };
31
32
 
33
+ export let onclick: ((e: MouseEvent) => void) | undefined = undefined;
34
+ export let onpointerenter: ((e: PointerEvent) => void) | undefined = undefined;
35
+ export let onpointermove: ((e: PointerEvent) => void) | undefined = undefined;
36
+ export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
37
+
32
38
  let tweened_cx = motionStore(initialCx, { spring, tweened });
33
39
  let tweened_cy = motionStore(initialCy, { spring, tweened });
34
40
  let tweened_r = motionStore(initialR, { spring, tweened });
@@ -42,12 +48,21 @@
42
48
  const canvasContext = getCanvasContext();
43
49
  const renderContext = canvasContext ? 'canvas' : 'svg';
44
50
 
45
- function render(ctx: CanvasRenderingContext2D) {
51
+ function render(
52
+ ctx: CanvasRenderingContext2D,
53
+ styleOverrides: ComputedStylesOptions | undefined
54
+ ) {
46
55
  const pathData = circlePath({ cx: $tweened_cx, cy: $tweened_cy, r: $tweened_r });
47
- renderPathData(ctx, pathData, {
48
- styles: { fill, fillOpacity, stroke, strokeWidth },
49
- classes: $$props.class,
50
- });
56
+ renderPathData(
57
+ ctx,
58
+ pathData,
59
+ styleOverrides
60
+ ? merge({ styles: { strokeWidth } }, styleOverrides)
61
+ : {
62
+ styles: { fill, fillOpacity, stroke, strokeWidth },
63
+ classes: className,
64
+ }
65
+ );
51
66
  }
52
67
 
53
68
  // TODO: Use objectId to work around Svelte 4 reactivity issue (even when memoizing gradients)
@@ -69,7 +84,16 @@
69
84
 
70
85
  let canvasUnregister: ReturnType<typeof canvasContext.register>;
71
86
  $: if (renderContext === 'canvas') {
72
- canvasUnregister = canvasContext.register({ name: 'Circle', render });
87
+ canvasUnregister = canvasContext.register({
88
+ name: 'Circle',
89
+ render,
90
+ events: {
91
+ click: onclick,
92
+ pointerenter: onpointerenter,
93
+ pointermove: onpointermove,
94
+ pointerleave: onpointerleave,
95
+ },
96
+ });
73
97
  }
74
98
 
75
99
  onDestroy(() => {
@@ -91,9 +115,9 @@
91
115
  stroke-width={strokeWidth}
92
116
  class={cls(fill == null && 'fill-surface-content', className)}
93
117
  {...$$restProps}
94
- on:click
95
- on:pointermove
96
- on:pointerenter
97
- on:pointerleave
118
+ on:click={onclick}
119
+ on:pointerenter={onpointerenter}
120
+ on:pointermove={onpointermove}
121
+ on:pointerleave={onpointerleave}
98
122
  />
99
123
  {/if}
@@ -26,7 +26,7 @@
26
26
  <slot />
27
27
  {:else}
28
28
  <!-- svelte-ignore a11y-no-static-element-interactions -->
29
- <g style:clip-path="url(#{id})" on:click on:pointermove on:pointerleave on:keydown>
29
+ <g style:clip-path="url(#{id})">
30
30
  <slot {id} url="url(#{id})" {useId} />
31
31
  </g>
32
32
  {/if}
@@ -7,11 +7,6 @@ declare const __propDef: {
7
7
  disabled?: boolean | undefined;
8
8
  };
9
9
  events: {
10
- click: MouseEvent;
11
- pointermove: PointerEvent;
12
- pointerleave: PointerEvent;
13
- keydown: KeyboardEvent;
14
- } & {
15
10
  [evt: string]: CustomEvent<any>;
16
11
  };
17
12
  slots: {
@@ -1,18 +1,9 @@
1
1
  <script lang="ts">
2
- import { createEventDispatcher } from 'svelte';
3
-
4
2
  import { forceSimulation, type Force } from 'd3-force';
5
3
  import { chartContext } from './ChartContext.svelte';
6
4
 
7
5
  const { data } = chartContext();
8
6
 
9
- const dispatch = createEventDispatcher<{
10
- start: null;
11
- tick: { alpha: number; alphaTarget: number };
12
- change: null;
13
- end: null;
14
- }>();
15
-
16
7
  // MARK: Public Props
17
8
 
18
9
  type Forces = Record<string, Force<any, any>>;
@@ -35,6 +26,11 @@
35
26
  /** Clone data since simulation mutates original */
36
27
  export const cloneData: boolean = false;
37
28
 
29
+ export let onstart: (() => void) | undefined = undefined;
30
+ export let ontick: ((e: { alpha: number; alphaTarget: number }) => void) | undefined = undefined;
31
+ // export let onchange: | (() => void) | undefined = undefined;
32
+ export let onend: (() => void) | undefined = undefined;
33
+
38
34
  // MARK: Private Props
39
35
 
40
36
  let nodes: any[] = [];
@@ -248,14 +244,14 @@
248
244
  }
249
245
 
250
246
  paused = false;
251
- dispatch('start');
247
+ onstart?.();
252
248
  }
253
249
 
254
250
  function onTick() {
255
251
  pullNodesFromSimulation();
256
252
  pullAlphaFromSimulation();
257
253
 
258
- dispatch('tick', {
254
+ ontick?.({
259
255
  alpha,
260
256
  alphaTarget,
261
257
  });
@@ -268,7 +264,7 @@
268
264
  }
269
265
 
270
266
  paused = true;
271
- dispatch('end');
267
+ onend?.();
272
268
  }
273
269
  </script>
274
270
 
@@ -11,16 +11,14 @@ declare const __propDef: {
11
11
  /** Stop simulation */ stopped?: boolean;
12
12
  /** If true, will only update nodes after simulation has completed */ static?: boolean;
13
13
  /** Clone data since simulation mutates original */ cloneData?: boolean;
14
- };
15
- events: {
16
- start: CustomEvent<null>;
17
- tick: CustomEvent<{
14
+ onstart?: (() => void) | undefined;
15
+ ontick?: ((e: {
18
16
  alpha: number;
19
17
  alphaTarget: number;
20
- }>;
21
- change: CustomEvent<null>;
22
- end: CustomEvent<null>;
23
- } & {
18
+ }) => void) | undefined;
19
+ onend?: (() => void) | undefined;
20
+ };
21
+ events: {
24
22
  [evt: string]: CustomEvent<any>;
25
23
  };
26
24
  slots: {
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { chartContext } from './ChartContext.svelte';
3
+ import Rect from './Rect.svelte';
3
4
 
4
5
  const { width, height, padding } = chartContext();
5
6
 
@@ -7,18 +8,14 @@
7
8
  export let full = false;
8
9
 
9
10
  /** Access underlying `<rect>` element */
10
- export let rectEl: SVGRectElement | undefined = undefined;
11
+ export let element: SVGRectElement | undefined = undefined;
11
12
  </script>
12
13
 
13
- <!-- svelte-ignore a11y-no-static-element-interactions -->
14
- <rect
14
+ <Rect
15
15
  x={full && $padding?.left ? -$padding.left : 0}
16
16
  y={full && $padding?.top ? -$padding.top : 0}
17
17
  width={$width + (full ? ($padding?.left ?? 0) + ($padding?.right ?? 0) : 0)}
18
18
  height={$height + (full ? ($padding?.top ?? 0) + ($padding?.bottom ?? 0) : 0)}
19
- on:click
20
- on:pointerdown
21
- on:dblclick
22
- bind:this={rectEl}
19
+ bind:element
23
20
  {...$$restProps}
24
21
  />
@@ -3,13 +3,9 @@ declare const __propDef: {
3
3
  props: {
4
4
  [x: string]: any;
5
5
  full?: boolean | undefined;
6
- rectEl?: SVGRectElement | undefined;
6
+ element?: SVGRectElement | undefined;
7
7
  };
8
8
  events: {
9
- click: MouseEvent;
10
- pointerdown: PointerEvent;
11
- dblclick: MouseEvent;
12
- } & {
13
9
  [evt: string]: CustomEvent<any>;
14
10
  };
15
11
  slots: {};
@@ -2,6 +2,7 @@
2
2
  import { geoCircle } from 'd3-geo';
3
3
 
4
4
  import GeoPath from './GeoPath.svelte';
5
+ import type { ComponentProps } from 'svelte';
5
6
 
6
7
  /** Radius in degrees. Default: 90 */
7
8
  export let radius = 90;
@@ -12,7 +13,12 @@
12
13
  /** sets the circle precision to the specified angle in degrees */
13
14
  export let precision = 6;
14
15
 
16
+ export let onclick: ComponentProps<typeof GeoPath>['onclick'] = undefined;
17
+ export let onpointerenter: ComponentProps<typeof GeoPath>['onpointerenter'] = undefined;
18
+ export let onpointermove: ComponentProps<typeof GeoPath>['onpointermove'] = undefined;
19
+ export let onpointerleave: ComponentProps<typeof GeoPath>['onpointerleave'] = undefined;
20
+
15
21
  $: geojson = geoCircle().radius(radius).center(center).precision(precision)();
16
22
  </script>
17
23
 
18
- <GeoPath {geojson} {...$$restProps} on:pointermove on:pointerleave on:click />
24
+ <GeoPath {geojson} {onclick} {onpointerenter} {onpointermove} {onpointerleave} {...$$restProps} />
@@ -1,19 +1,18 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
+ import GeoPath from './GeoPath.svelte';
3
+ import type { ComponentProps } from 'svelte';
2
4
  declare const __propDef: {
3
5
  props: {
4
6
  [x: string]: any;
5
7
  radius?: number | undefined;
6
8
  center?: [number, number] | undefined;
7
9
  precision?: number | undefined;
10
+ onclick?: ComponentProps<typeof GeoPath>["onclick"] | undefined;
11
+ onpointerenter?: ComponentProps<typeof GeoPath>["onpointerenter"] | undefined;
12
+ onpointermove?: ComponentProps<typeof GeoPath>["onpointermove"] | undefined;
13
+ onpointerleave?: ComponentProps<typeof GeoPath>["onpointerleave"] | undefined;
8
14
  };
9
15
  events: {
10
- pointermove: PointerEvent;
11
- pointerleave: PointerEvent;
12
- click: CustomEvent<{
13
- geoPath: ReturnType<typeof import("..").geoCurvePath>;
14
- event: MouseEvent;
15
- }>;
16
- } & {
17
16
  [evt: string]: CustomEvent<any>;
18
17
  };
19
18
  slots: {};
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { createEventDispatcher, onDestroy } from 'svelte';
2
+ import { onDestroy } from 'svelte';
3
3
  import {
4
4
  geoTransform as d3geoTransform,
5
5
  type GeoIdentityTransform,
@@ -8,34 +8,36 @@
8
8
  type GeoTransformPrototype,
9
9
  } from 'd3-geo';
10
10
  import { cls } from '@layerstack/tailwind';
11
+ import { merge } from 'lodash-es';
11
12
 
12
13
  import { geoContext } from './GeoContext.svelte';
13
14
  import type { TooltipContextValue } from './tooltip/TooltipContext.svelte';
14
15
  import { curveLinearClosed, type CurveFactory, type CurveFactoryLineOnly } from 'd3-shape';
15
16
  import { geoCurvePath } from '../utils/geo.js';
16
- import { renderPathData } from '../utils/canvas.js';
17
+ import { renderPathData, type ComputedStylesOptions } from '../utils/canvas.js';
17
18
  import { getCanvasContext } from './layout/Canvas.svelte';
18
19
  import { objectId } from '@layerstack/utils/object';
19
20
 
20
21
  export let geojson: GeoPermissibleObjects | null | undefined = undefined;
21
22
 
22
- /** Render to canvas */
23
- export let render:
24
- | ((
25
- ctx: CanvasRenderingContext2D,
26
- options: { newGeoPath: () => ReturnType<typeof geoCurvePath> }
27
- ) => any)
28
- | undefined = undefined;
29
-
30
23
  export let fill: string | undefined = undefined;
31
24
  export let stroke: string | undefined = undefined;
32
25
  export let strokeWidth: number | undefined = undefined;
33
26
 
34
27
  /**
35
- * Tooltip context to setup mouse events to show tooltip for related data
28
+ * Tooltip context to setup pointer events to show tooltip for related data
36
29
  */
37
30
  export let tooltip: TooltipContextValue | undefined = undefined;
38
31
 
32
+ export let onclick:
33
+ | ((e: MouseEvent, geoPath: ReturnType<typeof geoCurvePath>) => void)
34
+ | 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
+ export let onpointerdown: ((e: PointerEvent) => void) | undefined = undefined;
39
+ export let ontouchmove: ((e: TouchEvent) => void) | undefined = undefined;
40
+
39
41
  /**
40
42
  * Curve of path drawn. Imported via d3-shape.
41
43
  *
@@ -50,10 +52,6 @@
50
52
  let className: string | undefined = undefined;
51
53
  export { className as class };
52
54
 
53
- const dispatch = createEventDispatcher<{
54
- click: { geoPath: ReturnType<typeof geoCurvePath>; event: MouseEvent };
55
- }>();
56
-
57
55
  const geo = geoContext();
58
56
 
59
57
  /**
@@ -76,17 +74,22 @@
76
74
  const canvasContext = getCanvasContext();
77
75
  const renderContext = canvasContext ? 'canvas' : 'svg';
78
76
 
79
- function _render(ctx: CanvasRenderingContext2D) {
80
- if (render) {
81
- render(ctx, { newGeoPath: () => geoCurvePath(_projection, curve) });
82
- } else {
83
- if (geojson) {
84
- const pathData = geoPath(geojson);
85
- renderPathData(ctx, pathData, {
86
- styles: { fill, stroke, strokeWidth },
87
- classes: className,
88
- });
89
- }
77
+ function render(
78
+ ctx: CanvasRenderingContext2D,
79
+ styleOverrides: ComputedStylesOptions | undefined
80
+ ) {
81
+ if (geojson) {
82
+ const pathData = geoPath(geojson);
83
+ renderPathData(
84
+ ctx,
85
+ pathData,
86
+ styleOverrides
87
+ ? merge({ styles: { strokeWidth } }, styleOverrides)
88
+ : {
89
+ styles: { fill, stroke, strokeWidth },
90
+ classes: className,
91
+ }
92
+ );
90
93
  }
91
94
  }
92
95
 
@@ -100,9 +103,37 @@
100
103
  canvasContext.invalidate();
101
104
  }
102
105
 
106
+ // Hide `geoPath` and `tooltip` reactivity
107
+ function _onClick(e: MouseEvent) {
108
+ onclick?.(e, geoPath);
109
+ }
110
+ function _onPointerEnter(e: PointerEvent) {
111
+ onpointerenter?.(e);
112
+ tooltip?.show(e, geojson);
113
+ }
114
+ function _onPointerMove(e: PointerEvent) {
115
+ onpointermove?.(e);
116
+ tooltip?.show(e, geojson);
117
+ }
118
+ function _onPointerLeave(e: PointerEvent) {
119
+ onpointerleave?.(e);
120
+ tooltip?.hide();
121
+ }
122
+
103
123
  let canvasUnregister: ReturnType<typeof canvasContext.register>;
104
124
  $: if (renderContext === 'canvas') {
105
- canvasUnregister = canvasContext.register({ name: 'GeoPath', render: _render });
125
+ canvasUnregister = canvasContext.register({
126
+ name: 'GeoPath',
127
+ render,
128
+ events: {
129
+ click: _onClick,
130
+ pointerenter: _onPointerEnter,
131
+ pointermove: _onPointerMove,
132
+ pointerleave: _onPointerLeave,
133
+ pointerdown: onpointerdown,
134
+ touchmove: ontouchmove,
135
+ },
136
+ });
106
137
  }
107
138
 
108
139
  onDestroy(() => {
@@ -113,23 +144,21 @@
113
144
  </script>
114
145
 
115
146
  <!-- svelte-ignore a11y-no-static-element-interactions -->
116
- {#if renderContext === 'svg'}
117
- <slot {geoPath}>
147
+ <slot {geoPath}>
148
+ {#if renderContext === 'svg'}
118
149
  <path
119
150
  {...$$restProps}
120
151
  d={geojson ? geoPath(geojson) : ''}
121
152
  {fill}
122
153
  {stroke}
123
154
  stroke-width={strokeWidth}
124
- on:pointerenter={(e) => tooltip?.show(e, geojson)}
125
- on:pointerenter
126
- on:pointermove={(e) => tooltip?.show(e, geojson)}
127
- on:pointermove
128
- on:pointerleave={(e) => tooltip?.hide()}
129
- on:pointerleave
130
- on:pointerdown
131
- on:click={(event) => dispatch('click', { geoPath, event })}
155
+ on:click={_onClick}
156
+ on:pointerenter={_onPointerEnter}
157
+ on:pointermove={_onPointerMove}
158
+ on:pointerleave={_onPointerLeave}
159
+ on:pointerdown={onpointerdown}
160
+ on:touchmove={ontouchmove}
132
161
  class={cls(fill == null && 'fill-transparent', className)}
133
162
  />
134
- </slot>
135
- {/if}
163
+ {/if}
164
+ </slot>
@@ -7,27 +7,21 @@ declare const __propDef: {
7
7
  props: {
8
8
  [x: string]: any;
9
9
  geojson?: GeoPermissibleObjects | null | undefined;
10
- render?: ((ctx: CanvasRenderingContext2D, options: {
11
- newGeoPath: () => ReturnType<typeof geoCurvePath>;
12
- }) => any) | undefined | undefined;
13
10
  fill?: string | undefined | undefined;
14
11
  stroke?: string | undefined | undefined;
15
12
  strokeWidth?: number | undefined | undefined;
16
13
  tooltip?: TooltipContextValue | undefined;
14
+ onclick?: ((e: MouseEvent, geoPath: ReturnType<typeof geoCurvePath>) => void) | undefined | undefined;
15
+ onpointerenter?: ((e: PointerEvent) => void) | undefined | undefined;
16
+ onpointermove?: ((e: PointerEvent) => void) | undefined | undefined;
17
+ onpointerleave?: ((e: PointerEvent) => void) | undefined | undefined;
18
+ onpointerdown?: ((e: PointerEvent) => void) | undefined | undefined;
19
+ ontouchmove?: ((e: TouchEvent) => void) | undefined | undefined;
17
20
  curve?: (CurveFactory | CurveFactoryLineOnly) | undefined;
18
21
  class?: string | undefined | undefined;
19
22
  geoTransform?: ((projection: GeoProjection | GeoIdentityTransform) => GeoTransformPrototype) | undefined | undefined;
20
23
  };
21
24
  events: {
22
- pointerenter: PointerEvent;
23
- pointermove: PointerEvent;
24
- pointerleave: PointerEvent;
25
- pointerdown: PointerEvent;
26
- click: CustomEvent<{
27
- geoPath: ReturnType<typeof geoCurvePath>;
28
- event: MouseEvent;
29
- }>;
30
- } & {
31
25
  [evt: string]: CustomEvent<any>;
32
26
  };
33
27
  slots: {
@@ -11,39 +11,18 @@
11
11
  /** Longitude */
12
12
  export let long: number;
13
13
 
14
- /** Render to canvas */
15
- export let render: (
16
- ctx: CanvasRenderingContext2D,
17
- coords: { x: number; y: number }
18
- ) => any = () => {};
19
-
20
14
  const geo = geoContext();
21
15
 
22
16
  $: [x, y] = $geo([long, lat]) ?? [0, 0];
23
17
 
24
18
  const canvasContext = getCanvasContext();
25
19
  const renderContext = canvasContext ? 'canvas' : 'svg';
26
-
27
- function _render(ctx: CanvasRenderingContext2D) {
28
- render(ctx, { x, y });
29
- }
30
-
31
- let canvasUnregister: ReturnType<typeof canvasContext.register>;
32
- $: if (renderContext === 'canvas') {
33
- canvasUnregister = canvasContext.register({ name: 'GeoPoint', render: _render });
34
- }
35
-
36
- onDestroy(() => {
37
- if (renderContext === 'canvas') {
38
- canvasUnregister();
39
- }
40
- });
41
20
  </script>
42
21
 
43
22
  {#if renderContext === 'svg'}
44
23
  {#if $$slots.default}
45
24
  <Group {x} {y} {...$$restProps}>
46
- <slot />
25
+ <slot {x} {y} />
47
26
  </Group>
48
27
  {:else}
49
28
  <Circle cx={x} cy={y} {...$$restProps} />
@@ -52,9 +31,9 @@
52
31
 
53
32
  {#if renderContext === 'canvas'}
54
33
  {#if $$slots.default}
55
- <!-- TODO: Handle Canvas translation. Conslidate with svg use case above (if `render` is not defined) -->
34
+ <!-- TODO: Handle Canvas translation. Conslidate with svg use case above -->
56
35
  <!-- <Group {x} {y} {...$$restProps}> -->
57
- <slot />
36
+ <slot {x} {y} />
58
37
  <!-- </Group> -->
59
38
  {:else}
60
39
  <Circle cx={x} cy={y} {...$$restProps} />
@@ -4,16 +4,15 @@ declare const __propDef: {
4
4
  [x: string]: any;
5
5
  lat: number;
6
6
  long: number;
7
- render?: ((ctx: CanvasRenderingContext2D, coords: {
8
- x: number;
9
- y: number;
10
- }) => any) | undefined;
11
7
  };
12
8
  events: {
13
9
  [evt: string]: CustomEvent<any>;
14
10
  };
15
11
  slots: {
16
- default: {};
12
+ default: {
13
+ x: any;
14
+ y: any;
15
+ };
17
16
  };
18
17
  };
19
18
  export type GeoPointProps = typeof __propDef.props;
@@ -5,13 +5,16 @@ declare const __propDef: {
5
5
  lines?: boolean | Partial<{
6
6
  [x: string]: any;
7
7
  geojson?: import("d3-geo").GeoPermissibleObjects | null | undefined;
8
- render?: ((ctx: CanvasRenderingContext2D, options: {
9
- newGeoPath: () => ReturnType<typeof import("..").geoCurvePath>;
10
- }) => any) | undefined | undefined;
11
8
  fill?: string | undefined | undefined;
12
9
  stroke?: string | undefined | undefined;
13
10
  strokeWidth?: number | undefined | undefined;
14
11
  tooltip?: import("./tooltip/TooltipContext.svelte").TooltipContextValue | undefined;
12
+ onclick?: ((e: MouseEvent, geoPath: ReturnType<typeof import("..").geoCurvePath>) => void) | undefined | undefined;
13
+ onpointerenter?: ((e: PointerEvent) => void) | undefined | undefined;
14
+ onpointermove?: ((e: PointerEvent) => void) | undefined | undefined;
15
+ onpointerleave?: ((e: PointerEvent) => void) | undefined | undefined;
16
+ onpointerdown?: ((e: PointerEvent) => void) | undefined | undefined;
17
+ ontouchmove?: ((e: TouchEvent) => void) | undefined | undefined;
15
18
  curve?: (import("d3-shape").CurveFactory | import("d3-shape").CurveFactoryLineOnly) | undefined;
16
19
  class?: string | undefined | undefined;
17
20
  geoTransform?: ((projection: import("d3-geo").GeoProjection | import("d3-geo").GeoIdentityTransform) => import("d3-geo").GeoTransformPrototype) | undefined | undefined;
@@ -19,13 +22,16 @@ declare const __propDef: {
19
22
  outline?: boolean | Partial<{
20
23
  [x: string]: any;
21
24
  geojson?: import("d3-geo").GeoPermissibleObjects | null | undefined;
22
- render?: ((ctx: CanvasRenderingContext2D, options: {
23
- newGeoPath: () => ReturnType<typeof import("..").geoCurvePath>;
24
- }) => any) | undefined | undefined;
25
25
  fill?: string | undefined | undefined;
26
26
  stroke?: string | undefined | undefined;
27
27
  strokeWidth?: number | undefined | undefined;
28
28
  tooltip?: import("./tooltip/TooltipContext.svelte").TooltipContextValue | undefined;
29
+ onclick?: ((e: MouseEvent, geoPath: ReturnType<typeof import("..").geoCurvePath>) => void) | undefined | undefined;
30
+ onpointerenter?: ((e: PointerEvent) => void) | undefined | undefined;
31
+ onpointermove?: ((e: PointerEvent) => void) | undefined | undefined;
32
+ onpointerleave?: ((e: PointerEvent) => void) | undefined | undefined;
33
+ onpointerdown?: ((e: PointerEvent) => void) | undefined | undefined;
34
+ ontouchmove?: ((e: TouchEvent) => void) | undefined | undefined;
29
35
  curve?: (import("d3-shape").CurveFactory | import("d3-shape").CurveFactoryLineOnly) | undefined;
30
36
  class?: string | undefined | undefined;
31
37
  geoTransform?: ((projection: import("d3-geo").GeoProjection | import("d3-geo").GeoIdentityTransform) => import("d3-geo").GeoTransformPrototype) | undefined | undefined;
@@ -30,6 +30,13 @@
30
30
  */
31
31
  export let preventTouchMove = false;
32
32
 
33
+ export let onclick: ((e: MouseEvent) => void) | undefined = undefined;
34
+ export let ondblclick: ((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
+ export let onpointerdown: ((e: PointerEvent) => void) | undefined = undefined;
39
+
33
40
  export let spring: boolean | Parameters<typeof springStore>[1] = undefined;
34
41
  export let tweened: boolean | Parameters<typeof tweenedStore>[1] = undefined;
35
42
 
@@ -60,7 +67,19 @@
60
67
 
61
68
  let canvasUnregister: ReturnType<typeof canvasContext.register>;
62
69
  $: if (renderContext === 'canvas') {
63
- canvasUnregister = canvasContext.register({ name: 'Group', render, retainState: true });
70
+ canvasUnregister = canvasContext.register({
71
+ name: 'Group',
72
+ render,
73
+ retainState: true,
74
+ events: {
75
+ click: onclick,
76
+ dblclick: ondblclick,
77
+ pointerenter: onpointerenter,
78
+ pointermove: onpointermove,
79
+ pointerleave: onpointerleave,
80
+ pointerdown: onpointerdown,
81
+ },
82
+ });
64
83
  }
65
84
 
66
85
  onDestroy(() => {
@@ -77,11 +96,12 @@
77
96
  <g
78
97
  {transform}
79
98
  {...$$restProps}
80
- on:click
81
- on:pointerdown
82
- on:pointerenter
83
- on:pointermove
84
- on:pointerleave
99
+ on:click={onclick}
100
+ on:dblclick={ondblclick}
101
+ on:pointerenter={onpointerenter}
102
+ on:pointermove={onpointermove}
103
+ on:pointerleave={onpointerleave}
104
+ on:pointerdown={onpointerdown}
85
105
  on:touchmove={(e) => {
86
106
  if (preventTouchMove) {
87
107
  // Prevent touch to not interfer with pointer