svelteplot 0.12.0 → 0.14.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 (54) hide show
  1. package/dist/core/Plot.svelte +3 -6
  2. package/dist/helpers/group.d.ts +1 -1
  3. package/dist/helpers/group.js +3 -3
  4. package/dist/helpers/scales.js +8 -0
  5. package/dist/helpers/vectorShapes.d.ts +13 -0
  6. package/dist/helpers/vectorShapes.js +57 -0
  7. package/dist/marks/Arrow.svelte +70 -59
  8. package/dist/marks/Arrow.svelte.d.ts +2 -0
  9. package/dist/marks/ColorLegend.svelte +7 -3
  10. package/dist/marks/Contour.svelte +684 -0
  11. package/dist/marks/Contour.svelte.d.ts +152 -0
  12. package/dist/marks/DelaunayLink.svelte +127 -0
  13. package/dist/marks/DelaunayLink.svelte.d.ts +175 -0
  14. package/dist/marks/DelaunayMesh.svelte +102 -0
  15. package/dist/marks/DelaunayMesh.svelte.d.ts +172 -0
  16. package/dist/marks/Density.svelte +461 -0
  17. package/dist/marks/Density.svelte.d.ts +87 -0
  18. package/dist/marks/Hull.svelte +103 -0
  19. package/dist/marks/Hull.svelte.d.ts +175 -0
  20. package/dist/marks/Image.svelte +37 -27
  21. package/dist/marks/Image.svelte.d.ts +2 -0
  22. package/dist/marks/Link.svelte +68 -50
  23. package/dist/marks/Link.svelte.d.ts +2 -0
  24. package/dist/marks/Raster.svelte +6 -1
  25. package/dist/marks/Vector.svelte +12 -81
  26. package/dist/marks/Vector.svelte.d.ts +2 -4
  27. package/dist/marks/Voronoi.svelte +118 -0
  28. package/dist/marks/Voronoi.svelte.d.ts +172 -0
  29. package/dist/marks/VoronoiMesh.svelte +109 -0
  30. package/dist/marks/VoronoiMesh.svelte.d.ts +172 -0
  31. package/dist/marks/helpers/ArrowCanvas.svelte +132 -0
  32. package/dist/marks/helpers/ArrowCanvas.svelte.d.ts +39 -0
  33. package/dist/marks/helpers/BaseAxisX.svelte +5 -7
  34. package/dist/marks/helpers/DensityCanvas.svelte +118 -0
  35. package/dist/marks/helpers/DensityCanvas.svelte.d.ts +18 -0
  36. package/dist/marks/helpers/GeoPathCanvas.svelte +125 -0
  37. package/dist/marks/helpers/GeoPathCanvas.svelte.d.ts +24 -0
  38. package/dist/marks/helpers/GeoPathGroup.svelte +103 -0
  39. package/dist/marks/helpers/GeoPathGroup.svelte.d.ts +37 -0
  40. package/dist/marks/helpers/ImageCanvas.svelte +126 -0
  41. package/dist/marks/helpers/ImageCanvas.svelte.d.ts +34 -0
  42. package/dist/marks/helpers/LinkCanvas.svelte +103 -0
  43. package/dist/marks/helpers/LinkCanvas.svelte.d.ts +32 -0
  44. package/dist/marks/helpers/PathGroup.svelte +100 -0
  45. package/dist/marks/helpers/PathGroup.svelte.d.ts +16 -0
  46. package/dist/marks/helpers/PathItems.svelte +112 -0
  47. package/dist/marks/helpers/PathItems.svelte.d.ts +16 -0
  48. package/dist/marks/helpers/VectorCanvas.svelte +127 -0
  49. package/dist/marks/helpers/VectorCanvas.svelte.d.ts +36 -0
  50. package/dist/marks/index.d.ts +7 -0
  51. package/dist/marks/index.js +7 -0
  52. package/dist/types/mark.d.ts +1 -1
  53. package/dist/types/plot.d.ts +33 -1
  54. package/package.json +185 -181
@@ -0,0 +1,127 @@
1
+ <!--
2
+ @component
3
+ Helper component for rendering Vector marks in canvas
4
+ -->
5
+ <script lang="ts" generics="Datum extends DataRecord">
6
+ interface VectorCanvasProps {
7
+ data: ScaledDataRecord<Datum>[];
8
+ options: BaseMarkProps<Datum> & {
9
+ rotate?: ChannelAccessor<Datum>;
10
+ r?: number;
11
+ anchor?: 'start' | 'middle' | 'end';
12
+ shape?: 'arrow' | 'spike' | 'arrow-filled' | ShapeRenderer;
13
+ };
14
+ usedScales: UsedScales;
15
+ }
16
+
17
+ import type {
18
+ BaseMarkProps,
19
+ ChannelAccessor,
20
+ DataRecord,
21
+ ScaledDataRecord,
22
+ UsedScales
23
+ } from '../../types/index.js';
24
+ import { resolveProp, resolveScaledStyleProps } from '../../helpers/resolve.js';
25
+ import { defaultRadius, shapePath, type ShapeRenderer } from '../../helpers/vectorShapes.js';
26
+ import type { Attachment } from 'svelte/attachments';
27
+ import { devicePixelRatio } from 'svelte/reactivity/window';
28
+ import CanvasLayer from './CanvasLayer.svelte';
29
+ import { resolveColor } from './canvas.js';
30
+ import { usePlot } from '../../hooks/usePlot.svelte.js';
31
+
32
+ const plot = usePlot();
33
+
34
+ let { data, options, usedScales }: VectorCanvasProps = $props();
35
+
36
+ const render: Attachment = (canvasEl: Element) => {
37
+ const canvas = canvasEl as HTMLCanvasElement;
38
+ const context = canvas.getContext('2d');
39
+
40
+ $effect(() => {
41
+ if (context) {
42
+ context.resetTransform();
43
+ context.scale(devicePixelRatio.current ?? 1, devicePixelRatio.current ?? 1);
44
+
45
+ const shape = options.shape ?? 'arrow';
46
+ const anchor = options.anchor ?? 'middle';
47
+ const defaultColorProp = shape === 'arrow-filled' ? 'fill' : 'stroke';
48
+
49
+ for (const d of data) {
50
+ if (!d.valid) continue;
51
+
52
+ const datum = d.datum as unknown as Datum;
53
+ const length = d.length as number;
54
+ const r = (d.r as number) ?? defaultRadius;
55
+
56
+ if (length == null || r == null) continue;
57
+
58
+ const styleProps = resolveScaledStyleProps(
59
+ d.datum,
60
+ options,
61
+ usedScales,
62
+ plot,
63
+ defaultColorProp
64
+ ) as Record<string, unknown>;
65
+
66
+ const opacity = +(styleProps['opacity'] ?? 1);
67
+ const fillOpacity = +(styleProps['fill-opacity'] ?? 1);
68
+ const strokeOpacity = +(styleProps['stroke-opacity'] ?? 1);
69
+ const fill = resolveColor(String(styleProps.fill || 'none'), canvas);
70
+ const stroke = resolveColor(String(styleProps.stroke || 'none'), canvas);
71
+
72
+ const hasFill = fill && fill !== 'none';
73
+ const hasStroke = stroke && stroke !== 'none';
74
+
75
+ if (!hasFill && !hasStroke) continue;
76
+
77
+ const rotateDeg = (resolveProp(options.rotate, datum, 0) ?? 0) as number;
78
+ const rotateRad = (rotateDeg * Math.PI) / 180;
79
+
80
+ const anchorOffset =
81
+ anchor === 'start' ? 0 : anchor === 'end' ? length : length / 2;
82
+
83
+ const pathStr = shapePath(shape, length, r);
84
+ if (!pathStr) continue;
85
+ const path2d = new Path2D(pathStr);
86
+
87
+ const strokeWidth = (resolveProp(options.strokeWidth, datum, 1.5) ??
88
+ 1.5) as number;
89
+
90
+ context.save();
91
+ context.translate(d.x as number, d.y as number);
92
+ context.rotate(rotateRad);
93
+ context.translate(0, anchorOffset);
94
+
95
+ context.lineWidth = strokeWidth;
96
+ context.lineCap = 'round';
97
+ context.lineJoin = 'round';
98
+
99
+ if (hasFill) {
100
+ context.fillStyle = fill as string;
101
+ context.globalAlpha = opacity * fillOpacity;
102
+ context.fill(path2d);
103
+ }
104
+
105
+ if (hasStroke) {
106
+ context.strokeStyle = stroke as string;
107
+ context.globalAlpha = opacity * strokeOpacity;
108
+ context.stroke(path2d);
109
+ }
110
+
111
+ context.restore();
112
+ }
113
+ }
114
+
115
+ return () => {
116
+ context?.clearRect(
117
+ 0,
118
+ 0,
119
+ plot.width * (devicePixelRatio.current ?? 1),
120
+ plot.height * (devicePixelRatio.current ?? 1)
121
+ );
122
+ };
123
+ });
124
+ };
125
+ </script>
126
+
127
+ <CanvasLayer {@attach render} />
@@ -0,0 +1,36 @@
1
+ import type { BaseMarkProps, ChannelAccessor, DataRecord, ScaledDataRecord, UsedScales } from '../../types/index.js';
2
+ import { type ShapeRenderer } from '../../helpers/vectorShapes.js';
3
+ declare function $$render<Datum extends DataRecord>(): {
4
+ props: {
5
+ data: ScaledDataRecord<Datum>[];
6
+ options: BaseMarkProps<Datum> & {
7
+ rotate?: ChannelAccessor<Datum>;
8
+ r?: number;
9
+ anchor?: "start" | "middle" | "end";
10
+ shape?: "arrow" | "spike" | "arrow-filled" | ShapeRenderer;
11
+ };
12
+ usedScales: UsedScales;
13
+ };
14
+ exports: {};
15
+ bindings: "";
16
+ slots: {};
17
+ events: {};
18
+ };
19
+ declare class __sveltets_Render<Datum extends DataRecord> {
20
+ props(): ReturnType<typeof $$render<Datum>>['props'];
21
+ events(): ReturnType<typeof $$render<Datum>>['events'];
22
+ slots(): ReturnType<typeof $$render<Datum>>['slots'];
23
+ bindings(): "";
24
+ exports(): {};
25
+ }
26
+ interface $$IsomorphicComponent {
27
+ new <Datum extends DataRecord>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Datum>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Datum>['props']>, ReturnType<__sveltets_Render<Datum>['events']>, ReturnType<__sveltets_Render<Datum>['slots']>> & {
28
+ $$bindings?: ReturnType<__sveltets_Render<Datum>['bindings']>;
29
+ } & ReturnType<__sveltets_Render<Datum>['exports']>;
30
+ <Datum extends DataRecord>(internal: unknown, props: ReturnType<__sveltets_Render<Datum>['props']> & {}): ReturnType<__sveltets_Render<Datum>['exports']>;
31
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
32
+ }
33
+ /** Helper component for rendering Vector marks in canvas */
34
+ declare const VectorCanvas: $$IsomorphicComponent;
35
+ type VectorCanvas<Datum extends DataRecord> = InstanceType<typeof VectorCanvas<Datum>>;
36
+ export default VectorCanvas;
@@ -16,8 +16,12 @@ export { default as BrushY } from './BrushY.svelte';
16
16
  export { default as Cell } from './Cell.svelte';
17
17
  export { default as CellX } from './CellX.svelte';
18
18
  export { default as CellY } from './CellY.svelte';
19
+ export { default as Contour } from './Contour.svelte';
19
20
  export { default as CustomMark } from './CustomMark.svelte';
20
21
  export { default as CustomMarkHTML } from './CustomMarkHTML.svelte';
22
+ export { default as DelaunayLink } from './DelaunayLink.svelte';
23
+ export { default as DelaunayMesh } from './DelaunayMesh.svelte';
24
+ export { default as Density } from './Density.svelte';
21
25
  export { default as DifferenceY } from './DifferenceY.svelte';
22
26
  export { default as Dot } from './Dot.svelte';
23
27
  export { default as DotX } from './DotX.svelte';
@@ -27,6 +31,7 @@ export { default as Geo } from './Geo.svelte';
27
31
  export { default as Graticule } from './Graticule.svelte';
28
32
  export { default as GridX } from './GridX.svelte';
29
33
  export { default as GridY } from './GridY.svelte';
34
+ export { default as Hull } from './Hull.svelte';
30
35
  export { default as Image } from './Image.svelte';
31
36
  export { default as Line } from './Line.svelte';
32
37
  export { default as LineX } from './LineX.svelte';
@@ -48,6 +53,8 @@ export { default as TickX } from './TickX.svelte';
48
53
  export { default as TickY } from './TickY.svelte';
49
54
  export { default as Trail } from './Trail.svelte';
50
55
  export { default as Vector } from './Vector.svelte';
56
+ export { default as Voronoi } from './Voronoi.svelte';
57
+ export { default as VoronoiMesh } from './VoronoiMesh.svelte';
51
58
  export { default as WaffleX } from './WaffleX.svelte';
52
59
  export { default as WaffleY } from './WaffleY.svelte';
53
60
  export { default as ColorLegend } from './ColorLegend.svelte';
@@ -16,8 +16,12 @@ export { default as BrushY } from './BrushY.svelte';
16
16
  export { default as Cell } from './Cell.svelte';
17
17
  export { default as CellX } from './CellX.svelte';
18
18
  export { default as CellY } from './CellY.svelte';
19
+ export { default as Contour } from './Contour.svelte';
19
20
  export { default as CustomMark } from './CustomMark.svelte';
20
21
  export { default as CustomMarkHTML } from './CustomMarkHTML.svelte';
22
+ export { default as DelaunayLink } from './DelaunayLink.svelte';
23
+ export { default as DelaunayMesh } from './DelaunayMesh.svelte';
24
+ export { default as Density } from './Density.svelte';
21
25
  export { default as DifferenceY } from './DifferenceY.svelte';
22
26
  export { default as Dot } from './Dot.svelte';
23
27
  export { default as DotX } from './DotX.svelte';
@@ -27,6 +31,7 @@ export { default as Geo } from './Geo.svelte';
27
31
  export { default as Graticule } from './Graticule.svelte';
28
32
  export { default as GridX } from './GridX.svelte';
29
33
  export { default as GridY } from './GridY.svelte';
34
+ export { default as Hull } from './Hull.svelte';
30
35
  export { default as Image } from './Image.svelte';
31
36
  export { default as Line } from './Line.svelte';
32
37
  export { default as LineX } from './LineX.svelte';
@@ -48,6 +53,8 @@ export { default as TickX } from './TickX.svelte';
48
53
  export { default as TickY } from './TickY.svelte';
49
54
  export { default as Trail } from './Trail.svelte';
50
55
  export { default as Vector } from './Vector.svelte';
56
+ export { default as Voronoi } from './Voronoi.svelte';
57
+ export { default as VoronoiMesh } from './VoronoiMesh.svelte';
51
58
  export { default as WaffleX } from './WaffleX.svelte';
52
59
  export { default as WaffleY } from './WaffleY.svelte';
53
60
  // HTML marks
@@ -6,7 +6,7 @@ export type Mark<T> = {
6
6
  data: DataRecord<T>[];
7
7
  options: T;
8
8
  };
9
- export type MarkType = 'area' | 'arrow' | 'axisX' | 'axisY' | 'barX' | 'barY' | 'cell' | 'custom' | 'dot' | 'vector' | 'frame' | 'geo' | 'gridX' | 'gridY' | 'image' | 'link' | 'line' | 'raster' | 'rect' | 'regression' | 'ruleX' | 'ruleY' | 'swoopyArrow' | 'text' | 'tickX' | 'tickY' | 'trail' | 'waffleX' | 'waffleY';
9
+ export type MarkType = 'area' | 'arrow' | 'axisX' | 'axisY' | 'barX' | 'barY' | 'cell' | 'contour' | 'custom' | 'delaunayLink' | 'delaunayMesh' | 'density' | 'dot' | 'vector' | 'frame' | 'geo' | 'gridX' | 'gridY' | 'hull' | 'image' | 'link' | 'line' | 'raster' | 'rect' | 'regression' | 'ruleX' | 'ruleY' | 'swoopyArrow' | 'text' | 'tickX' | 'tickY' | 'trail' | 'voronoi' | 'voronoiMesh' | 'waffleX' | 'waffleY';
10
10
  export type MarkStyleProps = 'strokeDasharray' | 'strokeLinejoin' | 'strokeLinecap' | 'opacity' | 'cursor' | 'pointerEvents' | 'blend' | 'fill' | 'fillOpacity' | 'fontFamily' | 'fontWeight' | 'fontVariant' | 'fontSize' | 'fontStyle' | 'letterSpacing' | 'wordSpacing' | 'stroke' | 'strokeWidth' | 'strokeOpacity' | 'x' | 'y' | 'clipPath' | 'mask' | 'filter' | 'angle' | 'radius' | 'symbol' | 'textAnchor' | 'textTransform' | 'textDecoration' | 'width';
11
11
  import type { ChannelAccessor, ConstantAccessor, DataRecord, RawValue } from './index.js';
12
12
  import type * as CSS from 'csstype';
@@ -5,7 +5,7 @@ import type { ChannelAccessor, ChannelName, ColorScaleOptions, DataRecord, Legen
5
5
  import type { Snippet } from 'svelte';
6
6
  import type { GenericMarkOptions, Mark } from './index.js';
7
7
  import type { Clip } from '../helpers/projection.js';
8
- import type { Area, AreaX, AreaY, Arrow, AxisX, AxisY, BarX, BarY, BoxX, BoxY, Brush, BrushX, BrushY, Cell, DifferenceY, Dot, Frame, Geo, Graticule, GridX, GridY, Image, Line, Link, Pointer, Rect, RectX, RectY, RuleX, RuleY, Sphere, Spike, Text, TickX, TickY, Trail, Vector } from '../marks/index.js';
8
+ import type { Area, AreaX, AreaY, Arrow, AxisX, AxisY, BarX, BarY, BoxX, BoxY, Brush, BrushX, BrushY, Cell, Contour, DelaunayLink, DelaunayMesh, Density, DifferenceY, Dot, Frame, Geo, Graticule, GridX, GridY, Hull, Image, Line, Link, Pointer, Raster, Rect, RectX, RectY, RuleX, RuleY, Sphere, Spike, Text, TickX, TickY, Trail, Vector, Voronoi, VoronoiMesh } from '../marks/index.js';
9
9
  import type WaffleX from '../marks/WaffleX.svelte';
10
10
  import type WaffleY from '../marks/WaffleY.svelte';
11
11
  import type BaseAxisX from '../marks/helpers/BaseAxisX.svelte';
@@ -204,6 +204,22 @@ export type PlotDefaults = {
204
204
  * default props for cell marks
205
205
  */
206
206
  cell: Partial<Omit<ComponentProps<typeof Cell>, IgnoreDefaults>>;
207
+ /**
208
+ * default props for contour marks
209
+ */
210
+ contour: Partial<Omit<ComponentProps<typeof Contour>, IgnoreDefaults>>;
211
+ /**
212
+ * default props for delaunayLink marks
213
+ */
214
+ delaunayLink: Partial<Omit<ComponentProps<typeof DelaunayLink>, IgnoreDefaults>>;
215
+ /**
216
+ * default props for delaunayMesh marks
217
+ */
218
+ delaunayMesh: Partial<Omit<ComponentProps<typeof DelaunayMesh>, IgnoreDefaults>>;
219
+ /**
220
+ * default props for density marks
221
+ */
222
+ density: Partial<Omit<ComponentProps<typeof Density>, IgnoreDefaults>>;
207
223
  /**
208
224
  * default props for dot marks
209
225
  */
@@ -244,6 +260,10 @@ export type PlotDefaults = {
244
260
  gridY: Partial<Omit<ComponentProps<typeof GridY>, IgnoreDefaults> & {
245
261
  implicit: boolean;
246
262
  }> | true;
263
+ /**
264
+ * default props for hull marks
265
+ */
266
+ hull: Partial<Omit<ComponentProps<typeof Hull>, IgnoreDefaults>>;
247
267
  /**
248
268
  * default props for image marks
249
269
  */
@@ -260,6 +280,10 @@ export type PlotDefaults = {
260
280
  * default props for pointer marks
261
281
  */
262
282
  pointer: Partial<Omit<ComponentProps<typeof Pointer>, IgnoreDefaults>>;
283
+ /**
284
+ * default props for raster marks
285
+ */
286
+ raster: Partial<Omit<ComponentProps<typeof Raster>, IgnoreDefaults>>;
263
287
  /**
264
288
  * default props for rect marks, applied to rect and rectX marks
265
289
  */
@@ -316,6 +340,14 @@ export type PlotDefaults = {
316
340
  * default props for vector marks
317
341
  */
318
342
  vector: Partial<Omit<ComponentProps<typeof Vector>, IgnoreDefaults>>;
343
+ /**
344
+ * default props for voronoi marks
345
+ */
346
+ voronoi: Partial<Omit<ComponentProps<typeof Voronoi>, IgnoreDefaults>>;
347
+ /**
348
+ * default props for voronoiMesh marks
349
+ */
350
+ voronoiMesh: Partial<Omit<ComponentProps<typeof VoronoiMesh>, IgnoreDefaults>>;
319
351
  /**
320
352
  * default props for waffle marks, applied to both waffleX and waffleY marks
321
353
  */