layerchart 0.54.0 → 0.55.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 (105) 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 +269 -112
  10. package/dist/components/Brush.svelte.d.ts +7 -0
  11. package/dist/components/Calendar.svelte +51 -38
  12. package/dist/components/Chart.svelte +295 -74
  13. package/dist/components/Chart.svelte.d.ts +17 -17
  14. package/dist/components/ChartClipPath.svelte +8 -5
  15. package/dist/components/ChartContext.svelte +243 -93
  16. package/dist/components/ChartContext.svelte.d.ts +15 -23
  17. package/dist/components/Circle.svelte +25 -16
  18. package/dist/components/CircleClipPath.svelte +16 -10
  19. package/dist/components/ClipPath.svelte +11 -7
  20. package/dist/components/ColorRamp.svelte +12 -10
  21. package/dist/components/ForceSimulation.svelte +185 -116
  22. package/dist/components/Frame.svelte +10 -6
  23. package/dist/components/GeoCircle.svelte +15 -9
  24. package/dist/components/GeoContext.svelte +109 -62
  25. package/dist/components/GeoEdgeFade.svelte +20 -14
  26. package/dist/components/GeoPath.svelte +107 -69
  27. package/dist/components/GeoPoint.svelte +32 -18
  28. package/dist/components/GeoSpline.svelte +30 -22
  29. package/dist/components/GeoTile.svelte +40 -30
  30. package/dist/components/GeoVisible.svelte +10 -7
  31. package/dist/components/Graticule.svelte +14 -8
  32. package/dist/components/Grid.svelte +75 -48
  33. package/dist/components/Group.svelte +43 -31
  34. package/dist/components/Highlight.svelte +284 -243
  35. package/dist/components/HitCanvas.svelte +75 -42
  36. package/dist/components/Hull.svelte +40 -20
  37. package/dist/components/Labels.svelte +81 -70
  38. package/dist/components/Legend.svelte +105 -74
  39. package/dist/components/Legend.svelte.d.ts +1 -1
  40. package/dist/components/Line.svelte +65 -19
  41. package/dist/components/Line.svelte.d.ts +13 -1
  42. package/dist/components/LinearGradient.svelte +21 -15
  43. package/dist/components/Link.svelte +94 -22
  44. package/dist/components/Link.svelte.d.ts +17 -1
  45. package/dist/components/Marker.svelte +81 -0
  46. package/dist/components/Marker.svelte.d.ts +28 -0
  47. package/dist/components/MonthPath.svelte +23 -16
  48. package/dist/components/MotionPath.svelte +34 -25
  49. package/dist/components/Pack.svelte +21 -14
  50. package/dist/components/Partition.svelte +35 -20
  51. package/dist/components/Pattern.svelte +8 -6
  52. package/dist/components/Pie.svelte +76 -57
  53. package/dist/components/Point.svelte +11 -7
  54. package/dist/components/Points.svelte +178 -143
  55. package/dist/components/RadialGradient.svelte +25 -18
  56. package/dist/components/Rect.svelte +33 -19
  57. package/dist/components/RectClipPath.svelte +16 -11
  58. package/dist/components/Rule.svelte +50 -42
  59. package/dist/components/Sankey.svelte +55 -30
  60. package/dist/components/Spline.svelte +167 -96
  61. package/dist/components/Spline.svelte.d.ts +15 -0
  62. package/dist/components/Text.svelte +137 -104
  63. package/dist/components/Threshold.svelte +18 -7
  64. package/dist/components/TileImage.svelte +56 -50
  65. package/dist/components/TransformContext.svelte +235 -135
  66. package/dist/components/TransformControls.svelte +57 -29
  67. package/dist/components/TransformControls.svelte.d.ts +1 -1
  68. package/dist/components/Tree.svelte +33 -23
  69. package/dist/components/Treemap.svelte +69 -41
  70. package/dist/components/Voronoi.svelte +55 -28
  71. package/dist/components/charts/AreaChart.svelte +138 -87
  72. package/dist/components/charts/AreaChart.svelte.d.ts +4 -4
  73. package/dist/components/charts/BarChart.svelte +179 -114
  74. package/dist/components/charts/BarChart.svelte.d.ts +4 -4
  75. package/dist/components/charts/LineChart.svelte +97 -53
  76. package/dist/components/charts/LineChart.svelte.d.ts +4 -4
  77. package/dist/components/charts/PieChart.svelte +104 -54
  78. package/dist/components/charts/PieChart.svelte.d.ts +3 -3
  79. package/dist/components/charts/ScatterChart.svelte +83 -48
  80. package/dist/components/charts/ScatterChart.svelte.d.ts +4 -4
  81. package/dist/components/layout/Canvas.svelte +63 -43
  82. package/dist/components/layout/Html.svelte +28 -18
  83. package/dist/components/layout/Svg.svelte +47 -32
  84. package/dist/components/tooltip/Tooltip.svelte +137 -91
  85. package/dist/components/tooltip/Tooltip.svelte.d.ts +1 -1
  86. package/dist/components/tooltip/TooltipContext.svelte +315 -249
  87. package/dist/components/tooltip/TooltipHeader.svelte +9 -3
  88. package/dist/components/tooltip/TooltipItem.svelte +17 -9
  89. package/dist/components/tooltip/TooltipList.svelte +2 -1
  90. package/dist/components/tooltip/TooltipSeparator.svelte +3 -2
  91. package/dist/docs/Blockquote.svelte +4 -3
  92. package/dist/docs/Code.svelte +15 -8
  93. package/dist/docs/CurveMenuField.svelte +17 -12
  94. package/dist/docs/GeoDebug.svelte +13 -9
  95. package/dist/docs/Header1.svelte +2 -1
  96. package/dist/docs/Json.svelte +6 -4
  97. package/dist/docs/Layout.svelte +6 -6
  98. package/dist/docs/PathDataMenuField.svelte +52 -44
  99. package/dist/docs/Preview.svelte +39 -33
  100. package/dist/docs/TilesetField.svelte +80 -62
  101. package/dist/docs/TransformDebug.svelte +8 -5
  102. package/dist/docs/ViewSourceButton.svelte +13 -9
  103. package/dist/stores/motionStore.d.ts +1 -1
  104. package/dist/utils/scales.d.ts +3 -3
  105. package/package.json +29 -30
@@ -1,52 +1,102 @@
1
- <script generics="TData">import {} from 'svelte';
2
- import { sum } from 'd3-array';
3
- import { format } from '@layerstack/utils';
4
- import Arc from '../Arc.svelte';
5
- import Chart from '../Chart.svelte';
6
- import Group from '../Group.svelte';
7
- import Legend from '../Legend.svelte';
8
- import Pie from '../Pie.svelte';
9
- import Svg from '../layout/Svg.svelte';
10
- import * as Tooltip from '../tooltip/index.js';
11
- import { accessor, chartDataArray } from '../../utils/common.js';
12
- export let data = [];
13
- /** Key accessor */
14
- export let key = 'key';
15
- $: keyAccessor = accessor(key);
16
- /** Label accessor */
17
- export let label = 'label';
18
- $: labelAccessor = accessor(label);
19
- /** Value accessor */
20
- export let value = 'value';
21
- $: valueAccessor = accessor(value);
22
- /** Maximum possible value, useful when `data` is single item */
23
- export let maxValue = undefined;
24
- export let series = [{ key: 'default', value: value /*, color: 'hsl(var(--color-primary))'*/ }];
25
- export let legend = false;
26
- /**
27
- * Range [min,max] in degrees. See also startAngle/endAngle
28
- */
29
- export let range = [0, 360];
30
- /**
31
- * Define innerRadius.
32
- * value >= 1: discrete value
33
- * value > 0: percent of `outerRadius`
34
- * value < 0: offset of `outerRadius`
35
- * default: yRange min
36
- */
37
- export let innerRadius = undefined;
38
- /**
39
- * Define outerRadius. Defaults to yRange max/2 (ie. chart height / 2)
40
- */
41
- export let outerRadius = undefined;
42
- export let cornerRadius = 0;
43
- export let padAngle = 0;
44
- export let props = {};
45
- $: allSeriesData = series
1
+ <script lang="ts" generics="TData">
2
+ import { type ComponentProps } from 'svelte';
3
+ import { sum } from 'd3-array';
4
+ import { format } from '@layerstack/utils';
5
+
6
+ import Arc from '../Arc.svelte';
7
+ import Chart from '../Chart.svelte';
8
+ import Group from '../Group.svelte';
9
+ import Legend from '../Legend.svelte';
10
+ import Pie from '../Pie.svelte';
11
+ import Svg from '../layout/Svg.svelte';
12
+ import * as Tooltip from '../tooltip/index.js';
13
+
14
+ import { accessor, chartDataArray, type Accessor } from '../../utils/common.js';
15
+
16
+ type ChartProps = ComponentProps<Chart<TData>>;
17
+
18
+ interface $$Props extends ChartProps {
19
+ cornerRadius?: typeof cornerRadius;
20
+ innerRadius?: typeof innerRadius;
21
+ key?: typeof key;
22
+ label?: typeof label;
23
+ legend?: typeof legend;
24
+ maxValue?: typeof maxValue;
25
+ outerRadius?: typeof outerRadius;
26
+ padAngle?: typeof padAngle;
27
+ props?: typeof props;
28
+ range?: typeof range;
29
+ series?: typeof series;
30
+ value?: typeof label;
31
+ }
32
+
33
+ export let data: ChartProps['data'] = [];
34
+
35
+ /** Key accessor */
36
+ export let key: Accessor<TData> = 'key';
37
+ $: keyAccessor = accessor(key);
38
+
39
+ /** Label accessor */
40
+ export let label: Accessor<TData> = 'label';
41
+ $: labelAccessor = accessor(label);
42
+
43
+ /** Value accessor */
44
+ export let value: Accessor<TData> = 'value';
45
+ $: valueAccessor = accessor(value);
46
+
47
+ /** Maximum possible value, useful when `data` is single item */
48
+ export let maxValue: number | undefined = undefined;
49
+
50
+ export let series: {
51
+ key: string | number;
52
+ label?: string;
53
+ value?: Accessor<TData>;
54
+ /** Provider series data, else uses chart data (with value/key accessor) */
55
+ data?: TData[];
56
+ /** Maximum possible value, useful when `data` is single item */
57
+ maxValue?: number;
58
+ color?: string;
59
+ props?: Partial<ComponentProps<Arc>>;
60
+ }[] = [{ key: 'default', value: value /*, color: 'hsl(var(--color-primary))'*/ }];
61
+
62
+ export let legend: ComponentProps<Legend> | boolean = false;
63
+
64
+ /**
65
+ * Range [min,max] in degrees. See also startAngle/endAngle
66
+ */
67
+ export let range = [0, 360];
68
+
69
+ /**
70
+ * Define innerRadius.
71
+ * value >= 1: discrete value
72
+ * value > 0: percent of `outerRadius`
73
+ * value < 0: offset of `outerRadius`
74
+ * default: yRange min
75
+ */
76
+ export let innerRadius: number | undefined = undefined;
77
+
78
+ /**
79
+ * Define outerRadius. Defaults to yRange max/2 (ie. chart height / 2)
80
+ */
81
+ export let outerRadius: number | undefined = undefined;
82
+
83
+ export let cornerRadius = 0;
84
+ export let padAngle = 0;
85
+
86
+ export let props: {
87
+ pie?: Partial<ComponentProps<Pie>>;
88
+ group?: Partial<ComponentProps<Group>>;
89
+ arc?: Partial<ComponentProps<Arc>>;
90
+ legend?: Partial<ComponentProps<Legend>>;
91
+ } = {};
92
+
93
+ $: allSeriesData = series
46
94
  .flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d })))
47
- .filter((d) => d);
48
- $: chartData = (allSeriesData.length ? allSeriesData : chartDataArray(data));
49
- $: seriesColors = series.map((s) => s.color).filter((d) => d != null);
95
+ .filter((d) => d) as Array<TData>;
96
+
97
+ $: chartData = (allSeriesData.length ? allSeriesData : chartDataArray(data)) as Array<TData>;
98
+
99
+ $: seriesColors = series.map((s) => s.color).filter((d) => d != null);
50
100
  </script>
51
101
 
52
102
  <Chart
@@ -94,7 +144,7 @@ $: seriesColors = series.map((s) => s.color).filter((d) => d != null);
94
144
  }}
95
145
  <slot {...slotProps}>
96
146
  <Svg center>
97
- <slot name="below-marks" {...slotProps} />
147
+ <slot name="belowMarks" {...slotProps} />
98
148
 
99
149
  <slot name="marks" {...slotProps}>
100
150
  <Group {...props.group}>
@@ -110,8 +160,8 @@ $: seriesColors = series.map((s) => s.color).filter((d) => d != null);
110
160
  outerRadius={(outerRadius ?? 0) < 0 ? i * (outerRadius ?? 0) : outerRadius}
111
161
  {cornerRadius}
112
162
  {padAngle}
113
- fill={s.color ?? cScale(c(d))}
114
- track={{ fill: s.color ?? cScale(c(d)), 'fill-opacity': 0.1 }}
163
+ fill={s.color ?? cScale?.(c(d))}
164
+ track={{ fill: s.color ?? cScale?.(c(d)), 'fill-opacity': 0.1 }}
115
165
  {tooltip}
116
166
  data={d}
117
167
  {...props.arc}
@@ -136,7 +186,7 @@ $: seriesColors = series.map((s) => s.color).filter((d) => d != null);
136
186
  {innerRadius}
137
187
  {cornerRadius}
138
188
  {padAngle}
139
- fill={cScale(c(arc.data))}
189
+ fill={cScale?.(c(arc.data))}
140
190
  data={arc.data}
141
191
  {tooltip}
142
192
  {...props.arc}
@@ -149,7 +199,7 @@ $: seriesColors = series.map((s) => s.color).filter((d) => d != null);
149
199
  </Group>
150
200
  </slot>
151
201
 
152
- <slot name="above-marks" {...slotProps} />
202
+ <slot name="aboveMarks" {...slotProps} />
153
203
  </Svg>
154
204
 
155
205
  <slot name="legend" {...slotProps}>
@@ -173,7 +223,7 @@ $: seriesColors = series.map((s) => s.color).filter((d) => d != null);
173
223
  <Tooltip.Item
174
224
  label={labelAccessor(data) || keyAccessor(data)}
175
225
  value={valueAccessor(data)}
176
- color={cScale(c(data))}
226
+ color={cScale?.(c(data))}
177
227
  {format}
178
228
  />
179
229
  </Tooltip.List>
@@ -207,7 +207,7 @@ declare class __sveltets_Render<TData> {
207
207
  tickValues?: any[] | undefined;
208
208
  tickFontSize?: number | undefined;
209
209
  tickLength?: number | undefined;
210
- placement?: ("left" | "right" | "center" | "bottom" | "top" | "top-left" | "top-right" | "bottom-left" | "bottom-right") | undefined;
210
+ placement?: ("center" | "left" | "right" | "bottom" | "top" | "top-left" | "top-right" | "bottom-left" | "bottom-right") | undefined;
211
211
  orientation?: ("horizontal" | "vertical") | undefined;
212
212
  variant?: ("ramp" | "swatches") | undefined;
213
213
  classes?: {
@@ -247,9 +247,9 @@ declare class __sveltets_Render<TData> {
247
247
  };
248
248
  slots(): {
249
249
  default: any;
250
- 'below-marks': any;
250
+ belowMarks: any;
251
251
  marks: any;
252
- 'above-marks': any;
252
+ aboveMarks: any;
253
253
  legend: any;
254
254
  tooltip: any;
255
255
  };
@@ -1,44 +1,79 @@
1
- <script generics="TData">import {} from 'svelte';
2
- import { scaleLinear, scaleOrdinal, scaleTime } from 'd3-scale';
3
- import { format } from '@layerstack/utils';
4
- import Axis from '../Axis.svelte';
5
- import Chart from '../Chart.svelte';
6
- import Grid from '../Grid.svelte';
7
- import Highlight from '../Highlight.svelte';
8
- import Labels from '../Labels.svelte';
9
- import Legend from '../Legend.svelte';
10
- import Points from '../Points.svelte';
11
- import Rule from '../Rule.svelte';
12
- import Svg from '../layout/Svg.svelte';
13
- import * as Tooltip from '../tooltip/index.js';
14
- import { accessor, chartDataArray } from '../../utils/common.js';
15
- export let data = [];
16
- export let x = undefined;
17
- export let y = undefined;
18
- export let series = [{ key: 'default', data: chartDataArray(data), color: 'hsl(var(--color-primary))' }];
19
- $: isDefaultSeries = series.length === 1 && series[0].key === 'default';
20
- export let axis = true;
21
- export let grid = true;
22
- export let labels = false;
23
- export let legend = false;
24
- export let rule = true;
25
- export let props = {};
26
- // Default xScale based on first data's `x` value
27
- $: xScale = accessor(x)(chartDataArray(data)[0]) instanceof Date ? scaleTime() : scaleLinear();
28
- let chartData = series
1
+ <script lang="ts" generics="TData">
2
+ import { type ComponentProps } from 'svelte';
3
+ import { scaleLinear, scaleOrdinal, scaleTime } from 'd3-scale';
4
+ import { format } from '@layerstack/utils';
5
+
6
+ import Axis from '../Axis.svelte';
7
+ import Chart from '../Chart.svelte';
8
+ import Grid from '../Grid.svelte';
9
+ import Highlight from '../Highlight.svelte';
10
+ import Labels from '../Labels.svelte';
11
+ import Legend from '../Legend.svelte';
12
+ import Points from '../Points.svelte';
13
+ import Rule from '../Rule.svelte';
14
+ import Svg from '../layout/Svg.svelte';
15
+ import * as Tooltip from '../tooltip/index.js';
16
+
17
+ import { accessor, chartDataArray, type Accessor } from '../../utils/common.js';
18
+
19
+ interface $$Props extends ComponentProps<Chart<TData>> {
20
+ axis?: typeof axis;
21
+ grid?: typeof grid;
22
+ labels?: typeof labels;
23
+ legend?: typeof legend;
24
+ props?: typeof props;
25
+ series?: typeof series;
26
+ }
27
+
28
+ export let data: $$Props['data'] = [];
29
+ export let x: Accessor<TData> = undefined;
30
+ export let y: Accessor<TData> = undefined;
31
+
32
+ export let series: {
33
+ key: string;
34
+ label?: string;
35
+ data: TData[];
36
+ color?: string;
37
+ props?: Partial<ComponentProps<Points>>;
38
+ }[] = [{ key: 'default', data: chartDataArray(data), color: 'hsl(var(--color-primary))' }];
39
+ $: isDefaultSeries = series.length === 1 && series[0].key === 'default';
40
+
41
+ export let axis: ComponentProps<Axis> | 'x' | 'y' | boolean = true;
42
+ export let grid: ComponentProps<Grid> | boolean = true;
43
+ export let labels: ComponentProps<Labels> | boolean = false;
44
+ export let legend: ComponentProps<Legend> | boolean = false;
45
+ export let rule: ComponentProps<Rule> | boolean = true;
46
+
47
+ export let props: {
48
+ xAxis?: Partial<ComponentProps<Axis>>;
49
+ yAxis?: Partial<ComponentProps<Axis>>;
50
+ grid?: Partial<ComponentProps<Grid>>;
51
+ points?: Partial<ComponentProps<Points>>;
52
+ highlight?: Partial<ComponentProps<Highlight>>;
53
+ labels?: Partial<ComponentProps<Labels>>;
54
+ legend?: Partial<ComponentProps<Legend>>;
55
+ rule?: Partial<ComponentProps<Rule>>;
56
+ } = {};
57
+
58
+ // Default xScale based on first data's `x` value
59
+ $: xScale = accessor(x)(chartDataArray(data)[0]) instanceof Date ? scaleTime() : scaleLinear();
60
+
61
+ let chartData = series
29
62
  .flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d })))
30
- .filter((d) => d);
31
- function getPointsProps(s, i) {
32
- const pointsProps = {
33
- data: s.data,
34
- stroke: s.color,
35
- fill: s.color,
36
- 'fill-opacity': 0.3,
37
- ...props.points,
38
- ...s.props,
63
+ .filter((d) => d) as Array<TData>;
64
+
65
+ function getPointsProps(s: (typeof series)[number], i: number) {
66
+ const pointsProps: ComponentProps<Points> = {
67
+ data: s.data,
68
+ stroke: s.color,
69
+ fill: s.color,
70
+ 'fill-opacity': 0.3,
71
+ ...props.points,
72
+ ...s.props,
39
73
  };
74
+
40
75
  return pointsProps;
41
- }
76
+ }
42
77
  </script>
43
78
 
44
79
  <Chart
@@ -81,6 +116,16 @@ function getPointsProps(s, i) {
81
116
  {/if}
82
117
  </slot>
83
118
 
119
+ <slot name="belowMarks" {...slotProps} />
120
+
121
+ <slot name="marks" {...slotProps}>
122
+ {#each series as s, i}
123
+ <Points {...getPointsProps(s, i)} />
124
+ {/each}
125
+ </slot>
126
+
127
+ <slot name="aboveMarks" {...slotProps} />
128
+
84
129
  <slot name="axis" {...slotProps}>
85
130
  {#if axis}
86
131
  {#if axis !== 'x'}
@@ -107,16 +152,6 @@ function getPointsProps(s, i) {
107
152
  {/if}
108
153
  </slot>
109
154
 
110
- <slot name="below-marks" {...slotProps} />
111
-
112
- <slot name="marks" {...slotProps}>
113
- {#each series as s, i}
114
- <Points {...getPointsProps(s, i)} />
115
- {/each}
116
- </slot>
117
-
118
- <slot name="above-marks" {...slotProps} />
119
-
120
155
  <slot name="highlight" {...slotProps}>
121
156
  <Highlight points={{ fill: activeSeries?.color }} lines axis="both" {...props.highlight} />
122
157
  </slot>
@@ -252,7 +252,7 @@ declare class __sveltets_Render<TData> {
252
252
  tickValues?: any[] | undefined;
253
253
  tickFontSize?: number | undefined;
254
254
  tickLength?: number | undefined;
255
- placement?: ("left" | "right" | "center" | "bottom" | "top" | "top-left" | "top-right" | "bottom-left" | "bottom-right") | undefined;
255
+ placement?: ("center" | "left" | "right" | "bottom" | "top" | "top-left" | "top-right" | "bottom-left" | "bottom-right") | undefined;
256
256
  orientation?: ("horizontal" | "vertical") | undefined;
257
257
  variant?: ("ramp" | "swatches") | undefined;
258
258
  classes?: {
@@ -288,10 +288,10 @@ declare class __sveltets_Render<TData> {
288
288
  slots(): {
289
289
  default: any;
290
290
  grid: any;
291
- axis: any;
292
- 'below-marks': any;
291
+ belowMarks: any;
293
292
  marks: any;
294
- 'above-marks': any;
293
+ aboveMarks: any;
294
+ axis: any;
295
295
  highlight: any;
296
296
  legend: any;
297
297
  tooltip: any;
@@ -1,53 +1,73 @@
1
- <script>import { onMount, setContext } from 'svelte';
2
- import { writable } from 'svelte/store';
3
- import { scaleCanvas } from 'layercake';
4
- import { cls } from '@layerstack/tailwind';
5
- import { chartContext } from '../ChartContext.svelte';
6
- import { transformContext } from '../TransformContext.svelte';
7
- const { width, height, containerWidth, containerHeight, padding } = chartContext();
8
- /** The `<canvas>` tag. Useful for bindings. */
9
- export let element = undefined;
10
- /** The `<canvas>`'s 2d context. Useful for bindings. */
11
- // @ts-expect-error: set during onMount()
12
- export let context = undefined;
13
- /** Force the use of a software (instead of hardware accelerated) 2D canvas and can save memory when calling getImageData() frequently.
14
- * see: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext#willreadfrequently */
15
- export let willReadFrequently = false;
16
- /** The layer's z-index. */
17
- export let zIndex = undefined;
18
- /** Set this to `false` to set `pointer-events: none;` on the entire layer. */
19
- export let pointerEvents = undefined;
20
- /** Text to display if the browser won't render a canvas tag. You can also set arbitrary HTML via the "fallback" slot but this is fine if you just need text. If you use the "fallback" slot, this prop is ignored. */
21
- export let fallback = '';
22
- /** A string passed to the `aria-label` on the `<canvas>` tag. */
23
- export let label = undefined;
24
- /** A string passed to the `aria-labelledby` on the `<canvas>` tag. */
25
- export let labelledBy = undefined;
26
- /** A string passed to `aria-describedby` property on the `<canvas>` tag. */
27
- export let describedBy = undefined;
28
- const ctx = writable({});
29
- onMount(() => {
30
- context = element?.getContext('2d', { willReadFrequently });
31
- });
32
- const { mode, scale, translate } = transformContext();
33
- $: if (context) {
1
+ <script lang="ts">
2
+ import { onMount, setContext } from 'svelte';
3
+ import { writable } from 'svelte/store';
4
+ import { scaleCanvas } from 'layercake';
5
+ import { cls } from '@layerstack/tailwind';
6
+
7
+ import { chartContext } from '../ChartContext.svelte';
8
+ import { transformContext } from '../TransformContext.svelte';
9
+
10
+ const { width, height, containerWidth, containerHeight, padding } = chartContext();
11
+
12
+ /** The `<canvas>` tag. Useful for bindings. */
13
+ export let element: HTMLCanvasElement | undefined = undefined;
14
+
15
+ /** The `<canvas>`'s 2d context. Useful for bindings. */
16
+ // @ts-expect-error: set during onMount()
17
+ export let context: CanvasRenderingContext2D = undefined;
18
+
19
+ /** Force the use of a software (instead of hardware accelerated) 2D canvas and can save memory when calling getImageData() frequently.
20
+ * see: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext#willreadfrequently */
21
+ export let willReadFrequently = false;
22
+
23
+ /** The layer's z-index. */
24
+ export let zIndex = undefined;
25
+
26
+ /** Set this to `false` to set `pointer-events: none;` on the entire layer. */
27
+ export let pointerEvents: boolean | undefined = undefined;
28
+
29
+ /** Text to display if the browser won't render a canvas tag. You can also set arbitrary HTML via the "fallback" slot but this is fine if you just need text. If you use the "fallback" slot, this prop is ignored. */
30
+ export let fallback = '';
31
+
32
+ /** A string passed to the `aria-label` on the `<canvas>` tag. */
33
+ export let label: string | undefined = undefined;
34
+
35
+ /** A string passed to the `aria-labelledby` on the `<canvas>` tag. */
36
+ export let labelledBy: string | undefined = undefined;
37
+
38
+ /** A string passed to `aria-describedby` property on the `<canvas>` tag. */
39
+ export let describedBy: string | undefined = undefined;
40
+
41
+ const ctx = writable({});
42
+
43
+ onMount(() => {
44
+ context = element?.getContext('2d', { willReadFrequently }) as CanvasRenderingContext2D;
45
+ });
46
+
47
+ const { mode, scale, translate } = transformContext();
48
+
49
+ $: if (context) {
34
50
  scaleCanvas(context, $containerWidth, $containerHeight);
35
51
  context.clearRect(0, 0, $containerWidth, $containerHeight);
52
+
36
53
  context.translate($padding.left ?? 0, $padding.top ?? 0);
54
+
37
55
  if (mode === 'canvas') {
38
- const center = { x: $width / 2, y: $height / 2 };
39
- const newTranslate = {
40
- x: $translate.x * $scale + center.x - center.x * $scale,
41
- y: $translate.y * $scale + center.y - center.y * $scale,
42
- };
43
- context.translate(newTranslate.x, newTranslate.y);
44
- context.scale($scale, $scale);
56
+ const center = { x: $width / 2, y: $height / 2 };
57
+ const newTranslate = {
58
+ x: $translate.x * $scale + center.x - center.x * $scale,
59
+ y: $translate.y * $scale + center.y - center.y * $scale,
60
+ };
61
+ context.translate(newTranslate.x, newTranslate.y);
62
+ context.scale($scale, $scale);
45
63
  }
64
+
46
65
  // Force children to re-draw
47
66
  $ctx = context;
48
- }
49
- $: ctx.set(context);
50
- setContext('canvas', { ctx });
67
+ }
68
+
69
+ $: ctx.set(context);
70
+ setContext('canvas', { ctx });
51
71
  </script>
52
72
 
53
73
  <canvas
@@ -1,21 +1,31 @@
1
- <script>import { cls } from '@layerstack/tailwind';
2
- import { chartContext } from '../ChartContext.svelte';
3
- /** The layer's outermost `<div>` tag. Useful for bindings. */
4
- export let element = undefined;
5
- /** The layer's z-index. */
6
- export let zIndex = undefined;
7
- /** Set this to `false` to set `pointer-events: none;` on the entire layer. */
8
- export let pointerEvents = undefined;
9
- /** A string passed to the `aria-role` on the `<div>` tag. This is `undefined` by default but will be set by default to `'figure'` if `label`, `labelledby` or `describedby` is set. That default will be overridden by whatever is passed in. */
10
- export let role = undefined;
11
- /** A string passed to the `aria-label` property on the `<div>` tag. */
12
- export let label = undefined;
13
- /** A string passed to the `aria-labelledby property` on the `<div>` tag. */
14
- export let labelledBy = undefined;
15
- /** A string passed to the `aria-describedby` property on the `<div>` tag. */
16
- export let describedBy = undefined;
17
- const { padding } = chartContext();
18
- $: roleVal = role || (label || labelledBy || describedBy ? 'figure' : undefined);
1
+ <script lang="ts">
2
+ import { cls } from '@layerstack/tailwind';
3
+ import { chartContext } from '../ChartContext.svelte';
4
+
5
+ /** The layer's outermost `<div>` tag. Useful for bindings. */
6
+ export let element: HTMLDivElement | undefined = undefined;
7
+
8
+ /** The layer's z-index. */
9
+ export let zIndex = undefined;
10
+
11
+ /** Set this to `false` to set `pointer-events: none;` on the entire layer. */
12
+ export let pointerEvents: boolean | undefined = undefined;
13
+
14
+ /** A string passed to the `aria-role` on the `<div>` tag. This is `undefined` by default but will be set by default to `'figure'` if `label`, `labelledby` or `describedby` is set. That default will be overridden by whatever is passed in. */
15
+ export let role: string | undefined = undefined;
16
+
17
+ /** A string passed to the `aria-label` property on the `<div>` tag. */
18
+ export let label: string | undefined = undefined;
19
+
20
+ /** A string passed to the `aria-labelledby property` on the `<div>` tag. */
21
+ export let labelledBy: string | undefined = undefined;
22
+
23
+ /** A string passed to the `aria-describedby` property on the `<div>` tag. */
24
+ export let describedBy: string | undefined = undefined;
25
+
26
+ const { padding } = chartContext();
27
+
28
+ $: roleVal = role || (label || labelledBy || describedBy ? 'figure' : undefined);
19
29
  </script>
20
30
 
21
31
  <div