layerchart 0.54.0 → 0.54.1

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 (99) hide show
  1. package/dist/components/Arc.svelte +170 -144
  2. package/dist/components/Area.svelte +96 -67
  3. package/dist/components/Area.svelte.d.ts +1 -0
  4. package/dist/components/Axis.svelte +205 -155
  5. package/dist/components/Bar.svelte +72 -45
  6. package/dist/components/Bars.svelte +45 -34
  7. package/dist/components/Blur.svelte +5 -3
  8. package/dist/components/Bounds.svelte +37 -21
  9. package/dist/components/Brush.svelte +181 -110
  10. package/dist/components/Calendar.svelte +51 -38
  11. package/dist/components/Chart.svelte +295 -74
  12. package/dist/components/Chart.svelte.d.ts +17 -17
  13. package/dist/components/ChartClipPath.svelte +8 -5
  14. package/dist/components/ChartContext.svelte +243 -93
  15. package/dist/components/ChartContext.svelte.d.ts +15 -23
  16. package/dist/components/Circle.svelte +25 -16
  17. package/dist/components/CircleClipPath.svelte +16 -10
  18. package/dist/components/ClipPath.svelte +11 -7
  19. package/dist/components/ColorRamp.svelte +12 -10
  20. package/dist/components/ForceSimulation.svelte +185 -116
  21. package/dist/components/Frame.svelte +10 -6
  22. package/dist/components/GeoCircle.svelte +15 -9
  23. package/dist/components/GeoContext.svelte +109 -62
  24. package/dist/components/GeoEdgeFade.svelte +20 -14
  25. package/dist/components/GeoPath.svelte +107 -69
  26. package/dist/components/GeoPoint.svelte +32 -18
  27. package/dist/components/GeoSpline.svelte +30 -22
  28. package/dist/components/GeoTile.svelte +40 -30
  29. package/dist/components/GeoVisible.svelte +10 -7
  30. package/dist/components/Graticule.svelte +14 -8
  31. package/dist/components/Grid.svelte +75 -48
  32. package/dist/components/Group.svelte +43 -31
  33. package/dist/components/Highlight.svelte +284 -243
  34. package/dist/components/HitCanvas.svelte +75 -42
  35. package/dist/components/Hull.svelte +40 -20
  36. package/dist/components/Labels.svelte +81 -70
  37. package/dist/components/Legend.svelte +105 -74
  38. package/dist/components/Legend.svelte.d.ts +1 -1
  39. package/dist/components/Line.svelte +29 -19
  40. package/dist/components/LinearGradient.svelte +21 -15
  41. package/dist/components/Link.svelte +44 -22
  42. package/dist/components/MonthPath.svelte +23 -16
  43. package/dist/components/MotionPath.svelte +34 -25
  44. package/dist/components/Pack.svelte +21 -14
  45. package/dist/components/Partition.svelte +35 -20
  46. package/dist/components/Pattern.svelte +8 -6
  47. package/dist/components/Pie.svelte +76 -57
  48. package/dist/components/Point.svelte +11 -7
  49. package/dist/components/Points.svelte +178 -143
  50. package/dist/components/RadialGradient.svelte +25 -18
  51. package/dist/components/Rect.svelte +33 -19
  52. package/dist/components/RectClipPath.svelte +16 -11
  53. package/dist/components/Rule.svelte +50 -42
  54. package/dist/components/Sankey.svelte +55 -30
  55. package/dist/components/Spline.svelte +118 -96
  56. package/dist/components/Text.svelte +137 -104
  57. package/dist/components/Threshold.svelte +18 -7
  58. package/dist/components/TileImage.svelte +56 -50
  59. package/dist/components/TransformContext.svelte +235 -135
  60. package/dist/components/TransformControls.svelte +57 -29
  61. package/dist/components/TransformControls.svelte.d.ts +1 -1
  62. package/dist/components/Tree.svelte +33 -23
  63. package/dist/components/Treemap.svelte +69 -41
  64. package/dist/components/Voronoi.svelte +55 -28
  65. package/dist/components/charts/AreaChart.svelte +128 -77
  66. package/dist/components/charts/AreaChart.svelte.d.ts +1 -1
  67. package/dist/components/charts/BarChart.svelte +169 -104
  68. package/dist/components/charts/BarChart.svelte.d.ts +1 -1
  69. package/dist/components/charts/LineChart.svelte +87 -43
  70. package/dist/components/charts/LineChart.svelte.d.ts +1 -1
  71. package/dist/components/charts/PieChart.svelte +102 -52
  72. package/dist/components/charts/PieChart.svelte.d.ts +1 -1
  73. package/dist/components/charts/ScatterChart.svelte +73 -38
  74. package/dist/components/charts/ScatterChart.svelte.d.ts +1 -1
  75. package/dist/components/layout/Canvas.svelte +63 -43
  76. package/dist/components/layout/Html.svelte +28 -18
  77. package/dist/components/layout/Svg.svelte +47 -32
  78. package/dist/components/tooltip/Tooltip.svelte +137 -91
  79. package/dist/components/tooltip/Tooltip.svelte.d.ts +1 -1
  80. package/dist/components/tooltip/TooltipContext.svelte +315 -249
  81. package/dist/components/tooltip/TooltipHeader.svelte +9 -3
  82. package/dist/components/tooltip/TooltipItem.svelte +17 -9
  83. package/dist/components/tooltip/TooltipList.svelte +2 -1
  84. package/dist/components/tooltip/TooltipSeparator.svelte +3 -2
  85. package/dist/docs/Blockquote.svelte +4 -3
  86. package/dist/docs/Code.svelte +15 -8
  87. package/dist/docs/CurveMenuField.svelte +17 -12
  88. package/dist/docs/GeoDebug.svelte +13 -9
  89. package/dist/docs/Header1.svelte +2 -1
  90. package/dist/docs/Json.svelte +6 -4
  91. package/dist/docs/Layout.svelte +6 -6
  92. package/dist/docs/PathDataMenuField.svelte +52 -44
  93. package/dist/docs/Preview.svelte +39 -33
  94. package/dist/docs/TilesetField.svelte +80 -62
  95. package/dist/docs/TransformDebug.svelte +8 -5
  96. package/dist/docs/ViewSourceButton.svelte +13 -9
  97. package/dist/stores/motionStore.d.ts +1 -1
  98. package/dist/utils/scales.d.ts +3 -3
  99. package/package.json +29 -30
@@ -1,61 +1,67 @@
1
- <script context="module">"use strict";
2
- let tileCache = new Map();
1
+ <script context="module" lang="ts">
2
+ let tileCache = new Map<string, Promise<string>>();
3
3
  </script>
4
4
 
5
- <script>import Text from './Text.svelte';
6
- export let x;
7
- export let y;
8
- export let z;
9
- /** translate x */
10
- export let tx;
11
- /** translate y */
12
- export let ty;
13
- export let scale;
14
- export let disableCache = false;
15
- export let debug = false;
16
- export let url;
17
- // if disable cache, set href immediately, otherwise set from cache / dataUri
18
- let href = disableCache ? url(x, y, z) : '';
19
- function loadImage(url) {
5
+ <script lang="ts">
6
+ import Text from './Text.svelte';
7
+
8
+ export let x: number;
9
+ export let y: number;
10
+ export let z: number;
11
+ /** translate x */
12
+ export let tx: number;
13
+ /** translate y */
14
+ export let ty: number;
15
+ export let scale: number;
16
+
17
+ export let disableCache = false;
18
+ export let debug = false;
19
+
20
+ export let url: (x: number, y: number, z: number) => string;
21
+
22
+ // if disable cache, set href immediately, otherwise set from cache / dataUri
23
+ let href = disableCache ? url(x, y, z) : '';
24
+ function loadImage(url: string) {
20
25
  // const key = [x, y, z].join('-');
21
26
  const key = url;
27
+
22
28
  if (tileCache.has(key)) {
23
- tileCache.get(key)?.then((dataUri) => {
24
- // console.log('from cache', { x, y, z });
25
- href = dataUri;
26
- });
27
- }
28
- else {
29
- const promise = new Promise((resolve, reject) => {
30
- const img = new Image();
31
- img.crossOrigin = 'anonymous';
32
- img.onload = function () {
33
- var canvas = document.createElement('canvas');
34
- var context = canvas.getContext('2d');
35
- // @ts-expect-error
36
- canvas.height = this.naturalHeight;
37
- // @ts-expect-error
38
- canvas.width = this.naturalWidth;
39
- // @ts-expect-error
40
- context.drawImage(this, 0, 0);
41
- var dataUri = canvas.toDataURL('image/jpeg');
42
- // console.log('from load', { x, y, z });
43
- href = dataUri;
44
- resolve(dataUri);
45
- };
46
- img.onerror = (err) => {
47
- tileCache.delete(key);
48
- reject(err);
49
- };
50
- img.src = url;
51
- });
52
- tileCache.set(key, promise);
29
+ tileCache.get(key)?.then((dataUri) => {
30
+ // console.log('from cache', { x, y, z });
31
+ href = dataUri;
32
+ });
33
+ } else {
34
+ const promise = new Promise<string>((resolve, reject) => {
35
+ const img = new Image();
36
+ img.crossOrigin = 'anonymous';
37
+ img.onload = function () {
38
+ var canvas = document.createElement('canvas');
39
+ var context = canvas.getContext('2d')!;
40
+ // @ts-expect-error
41
+ canvas.height = this.naturalHeight;
42
+ // @ts-expect-error
43
+ canvas.width = this.naturalWidth;
44
+ // @ts-expect-error
45
+ context.drawImage(this, 0, 0);
46
+ var dataUri = canvas.toDataURL('image/jpeg');
47
+ // console.log('from load', { x, y, z });
48
+ href = dataUri;
49
+ resolve(dataUri);
50
+ };
51
+ img.onerror = (err) => {
52
+ tileCache.delete(key);
53
+ reject(err);
54
+ };
55
+ img.src = url;
56
+ });
57
+ tileCache.set(key, promise);
53
58
  }
54
- }
55
- $: if (!disableCache) {
59
+ }
60
+
61
+ $: if (!disableCache) {
56
62
  // load using cache
57
63
  loadImage(url(x, y, z));
58
- }
64
+ }
59
65
  </script>
60
66
 
61
67
  <!-- To avoid aliasing artifacts (thin white lines) between tiles, two layers of tiles are drawn, with the lower layer’s tiles enlarged by one pixel -->
@@ -1,9 +1,34 @@
1
- <script context="module">import { getContext, setContext } from 'svelte';
2
- import { writable, derived } from 'svelte/store';
3
- export const transformContextKey = Symbol();
4
- const defaultTranslate = writable({ x: 0, y: 0 });
5
- const defaultScale = writable(1);
6
- const defaultContext = {
1
+ <script lang="ts" context="module">
2
+ import { getContext, setContext } from 'svelte';
3
+ import { writable, type Readable, type Writable, derived } from 'svelte/store';
4
+
5
+ export const transformContextKey = Symbol();
6
+
7
+ type TransformMode = 'canvas' | 'manual' | 'none';
8
+ type TransformScrollMode = 'scale' | 'translate' | 'none';
9
+
10
+ export type TransformContextValue = {
11
+ mode: TransformMode;
12
+ scale: Writable<number>;
13
+ setScale(value: number, options?: MotionOptions): void;
14
+ translate: Writable<{ x: number; y: number }>;
15
+ setTranslate(point: { x: number; y: number }, options?: MotionOptions): void;
16
+ moving: Readable<boolean>;
17
+ dragging: Readable<boolean>;
18
+ scrollMode: Readable<TransformScrollMode>;
19
+ setScrollMode(mode: TransformScrollMode): void;
20
+ reset(): void;
21
+ zoomIn(): void;
22
+ zoomOut(): void;
23
+ translateCenter(): void;
24
+ zoomTo(center: { x: number; y: number }, rect?: { width: number; height: number }): void;
25
+ };
26
+
27
+ export type TransformContext = TransformContextValue;
28
+
29
+ const defaultTranslate = writable({ x: 0, y: 0 });
30
+ const defaultScale = writable(1);
31
+ const defaultContext: TransformContext = {
7
32
  mode: 'none',
8
33
  scale: defaultScale,
9
34
  setScale: defaultScale.set,
@@ -12,194 +37,269 @@ const defaultContext = {
12
37
  moving: writable(false),
13
38
  dragging: writable(false),
14
39
  scrollMode: writable('none'),
15
- setScrollMode: () => { },
16
- reset: () => { },
17
- zoomIn: () => { },
18
- zoomOut: () => { },
19
- translateCenter: () => { },
20
- zoomTo: () => { },
21
- };
22
- export function transformContext() {
23
- return getContext(transformContextKey) ?? defaultContext;
24
- }
25
- function setTransformContext(transform) {
40
+ setScrollMode: () => {},
41
+ reset: () => {},
42
+ zoomIn: () => {},
43
+ zoomOut: () => {},
44
+ translateCenter: () => {},
45
+ zoomTo: () => {},
46
+ };
47
+ export function transformContext() {
48
+ return getContext<TransformContext>(transformContextKey) ?? defaultContext;
49
+ }
50
+
51
+ function setTransformContext(transform: TransformContext) {
26
52
  setContext(transformContextKey, transform);
27
- }
53
+ }
28
54
  </script>
29
55
 
30
- <script>import { createEventDispatcher } from 'svelte';
31
- import { chartContext } from './ChartContext.svelte';
32
- import { motionStore, motionFinishHandler } from '../stores/motionStore.js';
33
- const { width, height } = chartContext();
34
- export let mode = 'none';
35
- /** Translate towards point (ex. mouse cursor/center) while zooming in/out */
36
- export let translateOnScale = false;
37
- export let spring = undefined;
38
- export let tweened = undefined;
39
- export let processTranslate = (x, y, deltaX, deltaY, scale) => {
56
+ <script lang="ts">
57
+ import { createEventDispatcher } from 'svelte';
58
+
59
+ import { chartContext } from './ChartContext.svelte';
60
+ import { motionStore, type MotionOptions, motionFinishHandler } from '../stores/motionStore.js';
61
+
62
+ const { width, height } = chartContext();
63
+
64
+ export let mode: TransformMode = 'none';
65
+ /** Translate towards point (ex. mouse cursor/center) while zooming in/out */
66
+ export let translateOnScale = false;
67
+
68
+ export let spring: boolean | Parameters<typeof motionStore>[1]['spring'] = undefined;
69
+ export let tweened: boolean | Parameters<typeof motionStore>[1]['tweened'] = undefined;
70
+
71
+ export let processTranslate = (
72
+ x: number,
73
+ y: number,
74
+ deltaX: number,
75
+ deltaY: number,
76
+ scale: number
77
+ ) => {
40
78
  return {
41
- x: x + deltaX / scale,
42
- y: y + deltaY / scale,
79
+ x: x + deltaX / scale,
80
+ y: y + deltaY / scale,
43
81
  };
44
- };
45
- /** Disable pointer events including move/dragging. Useful for `mode="canvas" but only want zoomTo() interactions */
46
- export let disablePointer = false;
47
- /** Action to take during wheel scroll */
48
- export let initialScrollMode = 'none';
49
- /** Distance/threshold to consider drag vs click (disable click propagation) */
50
- export let clickDistance = 10;
51
- const dispatch = createEventDispatcher();
52
- let pointerDown = false;
53
- const dragging = writable(false);
54
- const scrollMode = writable(initialScrollMode);
55
- const DEFAULT_TRANSLATE = { x: 0, y: 0 };
56
- export let initialTranslate = undefined;
57
- export const translate = motionStore(initialTranslate ?? DEFAULT_TRANSLATE, { spring, tweened });
58
- const DEFAULT_SCALE = 1;
59
- export let initialScale = undefined;
60
- export const scale = motionStore(initialScale ?? DEFAULT_SCALE, { spring, tweened });
61
- let startPoint = { x: 0, y: 0 };
62
- let startTranslate = { x: 0, y: 0 };
63
- export function setScrollMode(mode) {
82
+ };
83
+
84
+ /** Disable pointer events including move/dragging. Useful for `mode="canvas" but only want zoomTo() interactions */
85
+ export let disablePointer = false;
86
+
87
+ /** Action to take during wheel scroll */
88
+ export let initialScrollMode: TransformScrollMode = 'none';
89
+
90
+ /** Distance/threshold to consider drag vs click (disable click propagation) */
91
+ export let clickDistance = 10;
92
+
93
+ const dispatch = createEventDispatcher<{
94
+ dragstart: null;
95
+ dragend: null;
96
+ transform: { scale: number; translate: { x: number; y: number } };
97
+ }>();
98
+
99
+ let pointerDown = false;
100
+ const dragging = writable(false);
101
+ const scrollMode = writable<TransformScrollMode>(initialScrollMode);
102
+
103
+ const DEFAULT_TRANSLATE = { x: 0, y: 0 };
104
+ export let initialTranslate: { x: number; y: number } | undefined = undefined;
105
+ export const translate = motionStore(initialTranslate ?? DEFAULT_TRANSLATE, { spring, tweened });
106
+
107
+ const DEFAULT_SCALE = 1;
108
+ export let initialScale: number | undefined = undefined;
109
+ export const scale = motionStore(initialScale ?? DEFAULT_SCALE, { spring, tweened });
110
+
111
+ let startPoint: { x: number; y: number } = { x: 0, y: 0 };
112
+ let startTranslate: { x: number; y: number } = { x: 0, y: 0 };
113
+
114
+ export function setScrollMode(mode: TransformScrollMode) {
64
115
  $scrollMode = mode;
65
- }
66
- export function reset() {
116
+ }
117
+
118
+ export function reset() {
67
119
  $translate = initialTranslate ?? DEFAULT_TRANSLATE;
68
120
  $scale = initialScale ?? DEFAULT_SCALE;
69
- }
70
- export function zoomIn() {
121
+ }
122
+
123
+ export function zoomIn() {
71
124
  scaleTo(1.25, { x: $width / 2, y: $height / 2 });
72
- }
73
- export function zoomOut() {
125
+ }
126
+
127
+ export function zoomOut() {
74
128
  scaleTo(0.8, { x: $width / 2, y: $height / 2 });
75
- }
76
- export function translateCenter() {
129
+ }
130
+
131
+ export function translateCenter() {
77
132
  $translate = {
78
- x: 0,
79
- y: 0,
133
+ x: 0,
134
+ y: 0,
80
135
  };
81
- }
82
- export function zoomTo(center, rect) {
136
+ }
137
+
138
+ export function zoomTo(
139
+ center: { x: number; y: number },
140
+ rect?: { width: number; height: number }
141
+ ) {
83
142
  // TODO: Improve with geo/projection
143
+
84
144
  $translate = {
85
- x: $width / 2 - center.x,
86
- y: $height / 2 - center.y,
145
+ x: $width / 2 - center.x,
146
+ y: $height / 2 - center.y,
87
147
  };
148
+
88
149
  if (rect) {
89
- $scale = $width < $height ? $width / rect.width : $height / rect.height;
150
+ $scale = $width < $height ? $width / rect.width : $height / rect.height;
90
151
  }
91
- }
92
- function onPointerDown(e) {
93
- if (mode === 'none' || disablePointer)
94
- return;
152
+ }
153
+
154
+ function onPointerDown(e: PointerEvent & { currentTarget: HTMLDivElement }) {
155
+ if (mode === 'none' || disablePointer) return;
156
+
95
157
  e.preventDefault();
158
+
96
159
  pointerDown = true;
97
160
  $dragging = false;
98
161
  startPoint = localPoint(e);
99
162
  startTranslate = $translate;
163
+
100
164
  dispatch('dragstart');
101
- }
102
- function onPointerMove(e) {
103
- if (!pointerDown)
104
- return;
165
+ }
166
+
167
+ function onPointerMove(e: PointerEvent) {
168
+ if (!pointerDown) return;
169
+
105
170
  e.preventDefault(); // Stop text selection
171
+
106
172
  const endPoint = localPoint(e);
107
173
  const deltaX = endPoint.x - startPoint.x;
108
174
  const deltaY = endPoint.y - startPoint.y;
175
+
109
176
  if (!$dragging) {
110
- // If dragged beyond threshold, disable click propagation
111
- $dragging = deltaX * deltaX + deltaY * deltaY > clickDistance;
177
+ // If dragged beyond threshold, disable click propagation
178
+ $dragging = deltaX * deltaX + deltaY * deltaY > clickDistance;
112
179
  }
180
+
113
181
  if ($dragging) {
114
- e.stopPropagation(); // Stop tooltip from trigging (along with `capture: true`)
115
- // @ts-expect-error
116
- e.currentTarget?.setPointerCapture(e.pointerId);
117
- setTranslate(processTranslate(startTranslate.x, startTranslate.y, deltaX, deltaY, $scale),
182
+ e.stopPropagation(); // Stop tooltip from trigging (along with `capture: true`)
183
+ // @ts-expect-error
184
+ e.currentTarget?.setPointerCapture(e.pointerId);
185
+
186
+ setTranslate(
187
+ processTranslate(startTranslate.x, startTranslate.y, deltaX, deltaY, $scale),
118
188
  // @ts-expect-error
119
- spring ? { hard: true } : tweened ? { duration: 0 } : undefined);
189
+ spring ? { hard: true } : tweened ? { duration: 0 } : undefined
190
+ );
120
191
  }
121
- }
122
- function onPointerUp(e) {
192
+ }
193
+
194
+ function onPointerUp(e: PointerEvent) {
123
195
  pointerDown = false;
124
196
  $dragging = false;
125
197
  dispatch('dragend');
126
- }
127
- function onClick(e) {
198
+ }
199
+
200
+ function onClick(e: MouseEvent) {
128
201
  if ($dragging) {
129
- // Do not propagate click event to children if drag/moved. Registered in capture phase (top-down)
130
- e.stopPropagation();
202
+ // Do not propagate click event to children if drag/moved. Registered in capture phase (top-down)
203
+ e.stopPropagation();
131
204
  }
132
- }
133
- function onDoubleClick(e) {
134
- if (mode === 'none' || disablePointer)
135
- return;
205
+ }
206
+
207
+ function onDoubleClick(e: MouseEvent) {
208
+ if (mode === 'none' || disablePointer) return;
136
209
  const point = localPoint(e);
137
210
  scaleTo(e.shiftKey ? 0.5 : 2, point);
138
- }
139
- function onWheel(e) {
140
- if (mode === 'none' || disablePointer || $scrollMode === 'none')
141
- return;
211
+ }
212
+
213
+ function onWheel(e: WheelEvent) {
214
+ if (mode === 'none' || disablePointer || $scrollMode === 'none') return;
215
+
142
216
  e.preventDefault();
217
+
143
218
  const point = (startPoint = localPoint(e));
219
+
144
220
  // Pinch to zoom is registered as a wheel event with control key
145
221
  const pinchToZoom = e.ctrlKey;
222
+
146
223
  if ($scrollMode === 'scale' || pinchToZoom) {
147
- // https://github.com/d3/d3-zoom#zoom_wheelDelta
148
- const scaleBy = -e.deltaY * (e.deltaMode === 1 ? 0.05 : e.deltaMode ? 1 : 0.002) * (e.ctrlKey ? 10 : 1);
149
- scaleTo(Math.pow(2, scaleBy), point,
224
+ // https://github.com/d3/d3-zoom#zoom_wheelDelta
225
+ const scaleBy =
226
+ -e.deltaY * (e.deltaMode === 1 ? 0.05 : e.deltaMode ? 1 : 0.002) * (e.ctrlKey ? 10 : 1);
227
+
228
+ scaleTo(
229
+ Math.pow(2, scaleBy),
230
+ point,
150
231
  // @ts-expect-error
151
- spring ? { hard: true } : tweened ? { duration: 0 } : undefined);
152
- }
153
- else if ($scrollMode === 'translate') {
154
- translate.update((startTranslate) => processTranslate(startTranslate.x, startTranslate.y, -e.deltaX, -e.deltaY, $scale),
232
+ spring ? { hard: true } : tweened ? { duration: 0 } : undefined
233
+ );
234
+ } else if ($scrollMode === 'translate') {
235
+ translate.update(
236
+ (startTranslate) =>
237
+ processTranslate(startTranslate.x, startTranslate.y, -e.deltaX, -e.deltaY, $scale),
155
238
  // @ts-expect-error
156
- spring ? { hard: true } : tweened ? { duration: 0 } : undefined);
239
+ spring ? { hard: true } : tweened ? { duration: 0 } : undefined
240
+ );
157
241
  }
158
- }
159
- /**
160
- * Apply scale and translate towards point
161
- */
162
- function scaleTo(value, point, options = undefined) {
242
+ }
243
+
244
+ /**
245
+ * Apply scale and translate towards point
246
+ */
247
+ function scaleTo(
248
+ value: number,
249
+ point: { x: number; y: number },
250
+ options: Parameters<typeof motionStore>[1] | undefined = undefined
251
+ ) {
163
252
  const currentScale = $scale;
164
253
  const newScale = $scale * value;
165
254
  setScale(newScale, options);
255
+
166
256
  if (translateOnScale) {
167
- // Translate towards point (ex. mouse cursor/center) while zooming in/out
168
- const invertTransformPoint = {
169
- x: (point.x - $translate.x) / currentScale,
170
- y: (point.y - $translate.y) / currentScale,
171
- };
172
- const newTranslate = {
173
- x: point.x - invertTransformPoint.x * newScale,
174
- y: point.y - invertTransformPoint.y * newScale,
175
- };
176
- setTranslate(newTranslate, options);
257
+ // Translate towards point (ex. mouse cursor/center) while zooming in/out
258
+ const invertTransformPoint = {
259
+ x: (point.x - $translate.x) / currentScale,
260
+ y: (point.y - $translate.y) / currentScale,
261
+ };
262
+ const newTranslate = {
263
+ x: point.x - invertTransformPoint.x * newScale,
264
+ y: point.y - invertTransformPoint.y * newScale,
265
+ };
266
+ setTranslate(newTranslate, options);
177
267
  }
178
- }
179
- const translating = motionFinishHandler();
180
- const scaling = motionFinishHandler();
181
- const moving = derived([dragging, translating, scaling], ([dragging, translating, scaling]) => dragging || translating || scaling);
182
- export function setTranslate(point, options) {
268
+ }
269
+
270
+ const translating = motionFinishHandler();
271
+ const scaling = motionFinishHandler();
272
+ const moving = derived(
273
+ [dragging, translating, scaling],
274
+ ([dragging, translating, scaling]) => dragging || translating || scaling
275
+ );
276
+ export function setTranslate(point: { x: number; y: number }, options?: MotionOptions) {
183
277
  // @ts-expect-error
184
278
  translating.handle(translate.set(point, options));
185
- }
186
- export function setScale(value, options) {
279
+ }
280
+
281
+ export function setScale(value: number, options?: MotionOptions) {
187
282
  // @ts-expect-error
188
283
  scaling.handle(scale.set(value, options));
189
- }
190
- function localPoint(e) {
284
+ }
285
+
286
+ function localPoint(e: PointerEvent | MouseEvent | WheelEvent) {
191
287
  return {
192
- x: e.offsetX,
193
- y: e.offsetY,
288
+ x: e.offsetX,
289
+ y: e.offsetY,
194
290
  };
195
- }
196
- $: center = { x: $width / 2, y: $height / 2 };
197
- $: viewportCenter = {
291
+ }
292
+
293
+ $: center = { x: $width / 2, y: $height / 2 };
294
+
295
+ $: viewportCenter = {
198
296
  x: center.x - $translate.x,
199
297
  y: center.y - $translate.y,
200
- };
201
- $: dispatch('transform', { scale: $scale, translate: $translate });
202
- setTransformContext({
298
+ };
299
+
300
+ $: dispatch('transform', { scale: $scale, translate: $translate });
301
+
302
+ setTransformContext({
203
303
  mode,
204
304
  scale,
205
305
  setScale,
@@ -214,7 +314,7 @@ setTransformContext({
214
314
  zoomTo,
215
315
  scrollMode,
216
316
  setScrollMode,
217
- });
317
+ });
218
318
  </script>
219
319
 
220
320
  <!-- svelte-ignore a11y-no-static-element-interactions -->
@@ -1,36 +1,64 @@
1
- <script>import { Button, Icon, MenuButton, Tooltip } from 'svelte-ux';
2
- import { cls } from '@layerstack/tailwind';
3
- import { mdiArrowULeftTop, mdiMagnifyPlusOutline, mdiMagnifyMinusOutline, mdiImageFilterCenterFocus, mdiChevronDown, mdiResize, mdiArrowExpandAll, mdiCancel, } from '@mdi/js';
4
- import { transformContext } from './TransformContext.svelte';
5
- export let placement = 'top-right';
6
- export let orientation = 'vertical';
7
- export let show = ['zoomIn', 'zoomOut', 'center', 'reset', 'scrollMode'];
8
- $: menuPlacementByOrientationAndPlacement = {
1
+ <script lang="ts">
2
+ import { Button, Icon, MenuButton, Tooltip } from 'svelte-ux';
3
+ import { cls } from '@layerstack/tailwind';
4
+
5
+ import {
6
+ mdiArrowULeftTop,
7
+ mdiMagnifyPlusOutline,
8
+ mdiMagnifyMinusOutline,
9
+ mdiImageFilterCenterFocus,
10
+ mdiChevronDown,
11
+ mdiResize,
12
+ mdiArrowExpandAll,
13
+ mdiCancel,
14
+ } from '@mdi/js';
15
+
16
+ import { transformContext } from './TransformContext.svelte';
17
+
18
+ type Placement =
19
+ | 'top-left'
20
+ | 'top'
21
+ | 'top-right'
22
+ | 'left'
23
+ | 'center'
24
+ | 'right'
25
+ | 'bottom-left'
26
+ | 'bottom'
27
+ | 'bottom-right';
28
+
29
+ export let placement: Placement = 'top-right';
30
+ export let orientation: 'horizontal' | 'vertical' = 'vertical';
31
+
32
+ type Actions = 'zoomIn' | 'zoomOut' | 'center' | 'reset' | 'scrollMode';
33
+ export let show: Actions[] = ['zoomIn', 'zoomOut', 'center', 'reset', 'scrollMode'];
34
+
35
+ $: menuPlacementByOrientationAndPlacement = {
9
36
  horizontal: {
10
- 'top-left': 'bottom-end',
11
- top: 'bottom-end',
12
- 'top-right': 'bottom-end',
13
- left: 'bottom-end',
14
- center: 'bottom-end',
15
- right: 'bottom-end',
16
- 'bottom-left': 'top-end',
17
- bottom: 'top-end',
18
- 'bottom-right': 'top-end',
37
+ 'top-left': 'bottom-end',
38
+ top: 'bottom-end',
39
+ 'top-right': 'bottom-end',
40
+ left: 'bottom-end',
41
+ center: 'bottom-end',
42
+ right: 'bottom-end',
43
+ 'bottom-left': 'top-end',
44
+ bottom: 'top-end',
45
+ 'bottom-right': 'top-end',
19
46
  },
20
47
  vertical: {
21
- 'top-left': 'right-start',
22
- top: 'right-start',
23
- 'top-right': 'left-start',
24
- left: 'right-start',
25
- center: 'right-start',
26
- right: 'left-start',
27
- 'bottom-left': 'right-end',
28
- bottom: 'right-end',
29
- 'bottom-right': 'left-end',
48
+ 'top-left': 'right-start',
49
+ top: 'right-start',
50
+ 'top-right': 'left-start',
51
+ left: 'right-start',
52
+ center: 'right-start',
53
+ right: 'left-start',
54
+ 'bottom-left': 'right-end',
55
+ bottom: 'right-end',
56
+ 'bottom-right': 'left-end',
30
57
  },
31
- };
32
- const transform = transformContext();
33
- const scrollMode = transform.scrollMode;
58
+ } as const;
59
+
60
+ const transform = transformContext();
61
+ const scrollMode = transform.scrollMode;
34
62
  </script>
35
63
 
36
64
  <!-- svelte-ignore a11y-no-static-element-interactions -->