svelteplot 0.10.3 → 0.11.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.
- package/dist/Mark.svelte +42 -25
- package/dist/Mark.svelte.d.ts +111 -32
- package/dist/Plot.svelte +21 -15
- package/dist/core/Facet.svelte +1 -1
- package/dist/core/FacetAxes.svelte +13 -8
- package/dist/core/FacetGrid.svelte +4 -4
- package/dist/core/Plot.svelte +41 -35
- package/dist/helpers/autoScales.d.ts +3 -3
- package/dist/helpers/autoScales.js +28 -18
- package/dist/helpers/autoTicks.js +2 -0
- package/dist/helpers/callWithProps.d.ts +1 -2
- package/dist/helpers/facets.js +0 -1
- package/dist/helpers/index.js +1 -1
- package/dist/helpers/mergeDeep.d.ts +1 -3
- package/dist/helpers/mergeDeep.js +15 -16
- package/dist/helpers/projection.d.ts +4 -3
- package/dist/helpers/projection.js +17 -5
- package/dist/helpers/reduce.d.ts +4 -4
- package/dist/helpers/reduce.js +6 -4
- package/dist/helpers/regressionLoess.js +2 -1
- package/dist/helpers/resolve.d.ts +6 -3
- package/dist/helpers/resolve.js +25 -16
- package/dist/helpers/scales.d.ts +10 -10
- package/dist/helpers/scales.js +43 -13
- package/dist/helpers/time.d.ts +10 -3
- package/dist/helpers/time.js +2 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/plotDefaults.d.ts +3 -1
- package/dist/hooks/plotDefaults.js +33 -1
- package/dist/hooks/usePlot.svelte.d.ts +10 -25
- package/dist/hooks/usePlot.svelte.js +8 -7
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -3
- package/dist/marks/Area.svelte +24 -13
- package/dist/marks/Area.svelte.d.ts +118 -34
- package/dist/marks/AreaX.svelte +42 -8
- package/dist/marks/AreaX.svelte.d.ts +154 -71
- package/dist/marks/AreaY.svelte +42 -8
- package/dist/marks/AreaY.svelte.d.ts +154 -71
- package/dist/marks/Arrow.svelte +42 -23
- package/dist/marks/Arrow.svelte.d.ts +114 -35
- package/dist/marks/AxisX.svelte +43 -28
- package/dist/marks/AxisX.svelte.d.ts +125 -40
- package/dist/marks/AxisY.svelte +43 -26
- package/dist/marks/AxisY.svelte.d.ts +127 -40
- package/dist/marks/BarX.svelte +12 -10
- package/dist/marks/BarX.svelte.d.ts +104 -32
- package/dist/marks/BarY.svelte +11 -10
- package/dist/marks/BarY.svelte.d.ts +106 -34
- package/dist/marks/BollingerX.svelte +4 -7
- package/dist/marks/BollingerX.svelte.d.ts +105 -30
- package/dist/marks/BollingerY.svelte +3 -0
- package/dist/marks/BollingerY.svelte.d.ts +105 -30
- package/dist/marks/BoxX.svelte +3 -3
- package/dist/marks/BoxY.svelte +12 -9
- package/dist/marks/BoxY.svelte.d.ts +128 -53
- package/dist/marks/Brush.svelte +26 -21
- package/dist/marks/Brush.svelte.d.ts +119 -60
- package/dist/marks/Cell.svelte +13 -9
- package/dist/marks/Cell.svelte.d.ts +105 -30
- package/dist/marks/CellX.svelte +2 -1
- package/dist/marks/CellX.svelte.d.ts +105 -32
- package/dist/marks/CellY.svelte +2 -1
- package/dist/marks/CellY.svelte.d.ts +105 -32
- package/dist/marks/ColorLegend.svelte +24 -13
- package/dist/marks/ColorLegend.svelte.d.ts +1 -0
- package/dist/marks/CustomMark.svelte +16 -10
- package/dist/marks/CustomMark.svelte.d.ts +112 -31
- package/dist/marks/CustomMarkHTML.svelte +8 -2
- package/dist/marks/CustomMarkHTML.svelte.d.ts +8 -2
- package/dist/marks/DifferenceY.svelte +31 -20
- package/dist/marks/DifferenceY.svelte.d.ts +134 -55
- package/dist/marks/Dot.svelte +21 -11
- package/dist/marks/Dot.svelte.d.ts +117 -38
- package/dist/marks/DotX.svelte +2 -0
- package/dist/marks/DotX.svelte.d.ts +136 -62
- package/dist/marks/DotY.svelte +1 -0
- package/dist/marks/DotY.svelte.d.ts +135 -62
- package/dist/marks/Frame.svelte +47 -9
- package/dist/marks/Frame.svelte.d.ts +124 -41
- package/dist/marks/Geo.svelte +21 -12
- package/dist/marks/Geo.svelte.d.ts +105 -30
- package/dist/marks/Graticule.svelte +3 -0
- package/dist/marks/Graticule.svelte.d.ts +3 -0
- package/dist/marks/GridX.svelte +31 -16
- package/dist/marks/GridX.svelte.d.ts +108 -32
- package/dist/marks/GridY.svelte +30 -15
- package/dist/marks/GridY.svelte.d.ts +108 -32
- package/dist/marks/HTMLTooltip.svelte +14 -7
- package/dist/marks/HTMLTooltip.svelte.d.ts +7 -0
- package/dist/marks/Image.svelte +50 -25
- package/dist/marks/Image.svelte.d.ts +117 -35
- package/dist/marks/Line.svelte +67 -44
- package/dist/marks/Line.svelte.d.ts +119 -30
- package/dist/marks/LineX.svelte +2 -1
- package/dist/marks/LineX.svelte.d.ts +142 -69
- package/dist/marks/LineY.svelte +2 -1
- package/dist/marks/LineY.svelte.d.ts +142 -69
- package/dist/marks/Link.svelte +70 -46
- package/dist/marks/Link.svelte.d.ts +126 -41
- package/dist/marks/Pointer.svelte +24 -15
- package/dist/marks/Pointer.svelte.d.ts +7 -0
- package/dist/marks/Rect.svelte +13 -5
- package/dist/marks/Rect.svelte.d.ts +116 -35
- package/dist/marks/RectX.svelte +6 -3
- package/dist/marks/RectX.svelte.d.ts +158 -12
- package/dist/marks/RectY.svelte +6 -3
- package/dist/marks/RectY.svelte.d.ts +158 -12
- package/dist/marks/RegressionX.svelte +13 -6
- package/dist/marks/RegressionX.svelte.d.ts +8 -3
- package/dist/marks/RegressionY.svelte +13 -6
- package/dist/marks/RegressionY.svelte.d.ts +8 -3
- package/dist/marks/RuleX.svelte +18 -11
- package/dist/marks/RuleX.svelte.d.ts +112 -32
- package/dist/marks/RuleY.svelte +19 -12
- package/dist/marks/RuleY.svelte.d.ts +114 -34
- package/dist/marks/Spike.svelte +11 -5
- package/dist/marks/Spike.svelte.d.ts +146 -68
- package/dist/marks/Text.svelte +24 -7
- package/dist/marks/Text.svelte.d.ts +253 -75
- package/dist/marks/TickX.svelte +56 -48
- package/dist/marks/TickX.svelte.d.ts +114 -40
- package/dist/marks/TickY.svelte +59 -51
- package/dist/marks/TickY.svelte.d.ts +117 -43
- package/dist/marks/Trail.svelte +25 -13
- package/dist/marks/Trail.svelte.d.ts +116 -33
- package/dist/marks/Vector.svelte +20 -11
- package/dist/marks/Vector.svelte.d.ts +116 -35
- package/dist/marks/WaffleX.svelte +18 -16
- package/dist/marks/WaffleX.svelte.d.ts +131 -57
- package/dist/marks/WaffleY.svelte +16 -15
- package/dist/marks/WaffleY.svelte.d.ts +129 -56
- package/dist/marks/helpers/Anchor.svelte +17 -2
- package/dist/marks/helpers/Anchor.svelte.d.ts +16 -1
- package/dist/marks/helpers/AreaCanvas.svelte +8 -8
- package/dist/marks/helpers/BaseAxisX.svelte +38 -41
- package/dist/marks/helpers/BaseAxisX.svelte.d.ts +11 -17
- package/dist/marks/helpers/BaseAxisY.svelte +35 -35
- package/dist/marks/helpers/BaseAxisY.svelte.d.ts +12 -15
- package/dist/marks/helpers/Box.svelte +35 -28
- package/dist/marks/helpers/Box.svelte.d.ts +122 -50
- package/dist/marks/helpers/DotCanvas.svelte +11 -9
- package/dist/marks/helpers/GeoCanvas.svelte +7 -6
- package/dist/marks/helpers/LineCanvas.svelte +7 -7
- package/dist/marks/helpers/LinearGradientX.svelte +2 -2
- package/dist/marks/helpers/LinearGradientX.svelte.d.ts +1 -1
- package/dist/marks/helpers/LinearGradientY.svelte +2 -2
- package/dist/marks/helpers/LinearGradientY.svelte.d.ts +1 -1
- package/dist/marks/helpers/Marker.svelte +2 -2
- package/dist/marks/helpers/MarkerPath.svelte +15 -12
- package/dist/marks/helpers/MarkerPath.svelte.d.ts +105 -32
- package/dist/marks/helpers/MultilineText.svelte +24 -17
- package/dist/marks/helpers/MultilineText.svelte.d.ts +1 -1
- package/dist/marks/helpers/RectCanvas.svelte +31 -26
- package/dist/marks/helpers/RectPath.svelte +2 -2
- package/dist/marks/helpers/Regression.svelte +176 -86
- package/dist/marks/helpers/Regression.svelte.d.ts +20 -8
- package/dist/marks/helpers/RuleCanvas.svelte +9 -6
- package/dist/marks/helpers/TextCanvas.svelte +13 -9
- package/dist/marks/helpers/TextCanvas.svelte.d.ts +6 -6
- package/dist/marks/helpers/TickCanvas.svelte +6 -5
- package/dist/marks/helpers/TrailCanvas.svelte +16 -18
- package/dist/marks/helpers/TrailCanvas.svelte.d.ts +3 -5
- package/dist/marks/helpers/canvas.js +16 -9
- package/dist/marks/helpers/events.d.ts +2 -2
- package/dist/marks/helpers/events.js +14 -7
- package/dist/marks/helpers/waffle.d.ts +3 -3
- package/dist/marks/helpers/waffle.js +6 -4
- package/dist/regression/polynomial.d.ts +1 -1
- package/dist/regression/polynomial.js +5 -5
- package/dist/regression/utils/determination.d.ts +1 -1
- package/dist/regression/utils/determination.js +1 -1
- package/dist/regression/utils/geometry.d.ts +1 -1
- package/dist/regression/utils/interpose.d.ts +1 -1
- package/dist/regression/utils/interpose.js +1 -1
- package/dist/regression/utils/points.d.ts +1 -1
- package/dist/transforms/bin.d.ts +3 -3
- package/dist/transforms/bin.js +29 -20
- package/dist/transforms/bollinger.d.ts +8 -0
- package/dist/transforms/bollinger.js +9 -1
- package/dist/transforms/centroid.d.ts +4 -0
- package/dist/transforms/centroid.js +4 -0
- package/dist/transforms/density.d.ts +4 -4
- package/dist/transforms/density.js +20 -13
- package/dist/transforms/dodge.d.ts +12 -1
- package/dist/transforms/dodge.js +15 -6
- package/dist/transforms/group.d.ts +141 -4
- package/dist/transforms/group.js +4 -1
- package/dist/transforms/interval.d.ts +204 -60
- package/dist/transforms/jitter.d.ts +421 -4
- package/dist/transforms/jitter.js +10 -1
- package/dist/transforms/map.d.ts +412 -4
- package/dist/transforms/map.js +3 -3
- package/dist/transforms/normalize.d.ts +276 -5
- package/dist/transforms/normalize.js +5 -3
- package/dist/transforms/recordize.d.ts +17 -5
- package/dist/transforms/recordize.js +13 -9
- package/dist/transforms/rename.d.ts +11 -4
- package/dist/transforms/rename.js +7 -2
- package/dist/transforms/select.d.ts +722 -210
- package/dist/transforms/select.js +13 -1
- package/dist/transforms/shift.d.ts +8 -0
- package/dist/transforms/shift.js +20 -6
- package/dist/transforms/sort.d.ts +13 -258
- package/dist/transforms/sort.js +13 -10
- package/dist/transforms/stack.d.ts +58 -9
- package/dist/transforms/stack.js +27 -11
- package/dist/transforms/window.d.ts +221 -66
- package/dist/transforms/window.js +8 -2
- package/dist/types/axes.d.ts +43 -0
- package/dist/types/axes.js +1 -0
- package/dist/types/channel.d.ts +30 -2
- package/dist/types/data.d.ts +14 -1
- package/dist/types/facet.d.ts +5 -0
- package/dist/types/index.d.ts +33 -8
- package/dist/types/index.js +11 -7
- package/dist/types/mark.d.ts +124 -35
- package/dist/types/plot.d.ts +118 -16
- package/dist/types/scale.d.ts +125 -8
- package/package.json +178 -175
- package/dist/helpers/autoTicks.d.ts +0 -12
package/dist/marks/AxisX.svelte
CHANGED
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
RawValue,
|
|
11
11
|
ConstantAccessor,
|
|
12
12
|
FacetContext,
|
|
13
|
-
ChannelName
|
|
13
|
+
ChannelName,
|
|
14
|
+
TickFormatFunction,
|
|
15
|
+
DataRecord,
|
|
16
|
+
ScaledChannelName
|
|
14
17
|
} from '../types/index.js';
|
|
15
18
|
import type * as CSS from 'csstype';
|
|
16
19
|
import autoTimeFormat from '../helpers/autoTimeFormat.js';
|
|
@@ -22,24 +25,37 @@
|
|
|
22
25
|
|
|
23
26
|
interface AxisXMarkProps extends Omit<
|
|
24
27
|
BaseMarkProps<Datum>,
|
|
25
|
-
'fillOpacity' | 'paintOrder' | 'title' | 'href' | 'target'
|
|
28
|
+
'fillOpacity' | 'paintOrder' | 'title' | 'href' | 'target' | 'textAnchor'
|
|
26
29
|
> {
|
|
30
|
+
/** custom tick values to display on the axis */
|
|
27
31
|
data?: Datum[];
|
|
32
|
+
/** whether this axis was automatically added by the Plot component */
|
|
28
33
|
automatic?: boolean;
|
|
34
|
+
/** the axis title label; set to false or null to hide */
|
|
29
35
|
title?: string | false | null;
|
|
36
|
+
/** which edge of the plot the axis appears on */
|
|
30
37
|
anchor?: 'top' | 'bottom';
|
|
38
|
+
/** the interval between ticks, e.g. "day", "month", or a number */
|
|
31
39
|
interval?: string | number;
|
|
40
|
+
/** controls which facet edge displays this axis */
|
|
32
41
|
facetAnchor?: 'auto' | 'top-empty' | 'bottom-empty' | 'top' | 'bottom';
|
|
42
|
+
/** horizontal alignment of the axis title */
|
|
33
43
|
labelAnchor?: 'auto' | 'left' | 'center' | 'right';
|
|
44
|
+
/** the length of tick marks in pixels */
|
|
34
45
|
tickSize?: number;
|
|
46
|
+
/** font size for tick labels */
|
|
35
47
|
tickFontSize?: ConstantAccessor<number, Datum>;
|
|
48
|
+
/** font size for the axis title */
|
|
36
49
|
titleFontSize?: number;
|
|
50
|
+
/** spacing between tick marks and tick labels in pixels */
|
|
37
51
|
tickPadding?: number;
|
|
52
|
+
/** formatter for tick labels; can be "auto", an Intl format options object, or a custom function */
|
|
38
53
|
tickFormat?:
|
|
39
54
|
| 'auto'
|
|
40
55
|
| Intl.DateTimeFormatOptions
|
|
41
56
|
| Intl.NumberFormatOptions
|
|
42
|
-
|
|
|
57
|
+
| TickFormatFunction;
|
|
58
|
+
/** CSS class applied to each tick label */
|
|
43
59
|
tickClass?: ConstantAccessor<string, Datum>;
|
|
44
60
|
/** ticks is a shorthand for defining data, tickCount or interval */
|
|
45
61
|
ticks?: number | string | Datum[];
|
|
@@ -59,7 +75,7 @@
|
|
|
59
75
|
|
|
60
76
|
let markProps: AxisXMarkProps = $props();
|
|
61
77
|
|
|
62
|
-
const DEFAULTS
|
|
78
|
+
const DEFAULTS = {
|
|
63
79
|
tickSize: 6,
|
|
64
80
|
tickPadding: 3,
|
|
65
81
|
tickFontSize: 11,
|
|
@@ -74,7 +90,7 @@
|
|
|
74
90
|
const { ticks: magicTicks } = $derived({ ...DEFAULTS, ...markProps });
|
|
75
91
|
|
|
76
92
|
const {
|
|
77
|
-
data,
|
|
93
|
+
data = [] as Datum[],
|
|
78
94
|
automatic = false,
|
|
79
95
|
title,
|
|
80
96
|
anchor,
|
|
@@ -92,12 +108,12 @@
|
|
|
92
108
|
text = true,
|
|
93
109
|
...options
|
|
94
110
|
}: AxisXMarkProps = $derived({
|
|
95
|
-
data: Array.isArray(magicTicks) ? magicTicks : [],
|
|
111
|
+
data: (Array.isArray(magicTicks) ? magicTicks : []) as Datum[],
|
|
96
112
|
tickCount: typeof magicTicks === 'number' ? magicTicks : undefined,
|
|
97
113
|
interval: typeof magicTicks === 'string' ? magicTicks : undefined,
|
|
98
114
|
...DEFAULTS,
|
|
99
115
|
...markProps
|
|
100
|
-
});
|
|
116
|
+
} as AxisXMarkProps);
|
|
101
117
|
|
|
102
118
|
const plot = usePlot();
|
|
103
119
|
|
|
@@ -125,15 +141,14 @@
|
|
|
125
141
|
);
|
|
126
142
|
|
|
127
143
|
const useCompactNotation = $derived.by(() => {
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const crossesZero = range[0] <= 0 && range[1] >= 0;
|
|
144
|
+
const numericDomain = plot.scales.x.domain.filter(
|
|
145
|
+
(d): d is number => typeof d === 'number' && Number.isFinite(d)
|
|
146
|
+
);
|
|
147
|
+
if (numericDomain.length < 2) return false;
|
|
148
|
+
const [min, max] = extent(numericDomain) as [number, number];
|
|
149
|
+
const crossesZero = min <= 0 && max >= 0;
|
|
135
150
|
if (crossesZero) return true;
|
|
136
|
-
const magnitudes =
|
|
151
|
+
const magnitudes = [min, max].map((d) =>
|
|
137
152
|
d === 0 ? -Infinity : Math.floor(Math.log10(Math.abs(d)))
|
|
138
153
|
);
|
|
139
154
|
return magnitudes[0] !== magnitudes[1];
|
|
@@ -145,7 +160,7 @@
|
|
|
145
160
|
typeof tickFmt === 'function'
|
|
146
161
|
? tickFmt
|
|
147
162
|
: plot.scales.x.type === 'band' || plot.scales.x.type === 'point'
|
|
148
|
-
? (d) => d
|
|
163
|
+
? (d: RawValue) => String(d)
|
|
149
164
|
: plot.scales.x.type === 'time'
|
|
150
165
|
? // time scale
|
|
151
166
|
typeof tickFmt === 'object'
|
|
@@ -159,9 +174,9 @@
|
|
|
159
174
|
Intl.NumberFormat(plot.options.locale, {
|
|
160
175
|
// use compact notation if range covers multiple magnitudes
|
|
161
176
|
...(useCompactNotation ? { notation: 'compact' } : {}),
|
|
162
|
-
...
|
|
177
|
+
...getPlotDefaults().numberFormat,
|
|
163
178
|
style: plot.options.x.percent ? 'percent' : 'decimal'
|
|
164
|
-
}).format(d)
|
|
179
|
+
}).format(d as number)
|
|
165
180
|
);
|
|
166
181
|
|
|
167
182
|
const optionsLabel = $derived(plot.options?.x?.label);
|
|
@@ -195,7 +210,7 @@
|
|
|
195
210
|
const useFacetAnchor = $derived(
|
|
196
211
|
facetAnchor !== 'auto' ? facetAnchor : anchor === 'bottom' ? 'bottom-empty' : 'top-empty'
|
|
197
212
|
);
|
|
198
|
-
const
|
|
213
|
+
const showFacetAnchoredAxis = $derived(
|
|
199
214
|
useFacetAnchor === 'top'
|
|
200
215
|
? top
|
|
201
216
|
: useFacetAnchor === 'bottom'
|
|
@@ -204,19 +219,20 @@
|
|
|
204
219
|
? topEmpty
|
|
205
220
|
: bottomEmpty
|
|
206
221
|
);
|
|
222
|
+
const showAxis = $derived(showFacetAnchoredAxis);
|
|
207
223
|
</script>
|
|
208
224
|
|
|
209
225
|
<Mark
|
|
210
226
|
type="axisX"
|
|
211
227
|
data={data.length ? data.map((tick) => ({ __x: tick })) : []}
|
|
212
228
|
channels={['x']}
|
|
213
|
-
{...options}
|
|
229
|
+
{...options as any}
|
|
214
230
|
x="__x"
|
|
215
231
|
{automatic}>
|
|
216
232
|
{#if left && top && useTitle}
|
|
217
233
|
<text
|
|
218
234
|
style={resolveScaledStyles(
|
|
219
|
-
|
|
235
|
+
{} as DataRecord,
|
|
220
236
|
{
|
|
221
237
|
opacity: 0.8,
|
|
222
238
|
...options,
|
|
@@ -229,7 +245,7 @@
|
|
|
229
245
|
? 'middle'
|
|
230
246
|
: 'start'
|
|
231
247
|
},
|
|
232
|
-
{},
|
|
248
|
+
{} as Record<ScaledChannelName, boolean>,
|
|
233
249
|
plot,
|
|
234
250
|
'fill'
|
|
235
251
|
)}
|
|
@@ -245,12 +261,11 @@
|
|
|
245
261
|
<BaseAxisX
|
|
246
262
|
{anchor}
|
|
247
263
|
class={className}
|
|
248
|
-
{
|
|
249
|
-
options={{ ...options, ...plot.options.x }}
|
|
264
|
+
options={{ ...(options as any), ...plot.options.x }}
|
|
250
265
|
{plot}
|
|
251
266
|
{text}
|
|
252
|
-
{tickClass}
|
|
253
|
-
{tickFontSize}
|
|
267
|
+
tickClass={tickClass as ConstantAccessor<string>}
|
|
268
|
+
tickFontSize={tickFontSize as ConstantAccessor<number>}
|
|
254
269
|
{tickPadding}
|
|
255
270
|
{ticks}
|
|
256
271
|
{tickSize}
|
|
@@ -258,8 +273,8 @@
|
|
|
258
273
|
marginTop={plot.options.marginTop}
|
|
259
274
|
scaleFn={plot.scales.x.fn}
|
|
260
275
|
scaleType={plot.scales.x.type}
|
|
261
|
-
tickFormat={useTickFormat}
|
|
262
|
-
title={useTitle} />
|
|
276
|
+
tickFormat={useTickFormat as TickFormatFunction}
|
|
277
|
+
title={useTitle as string | null} />
|
|
263
278
|
{/if}
|
|
264
279
|
</Mark>
|
|
265
280
|
|
|
@@ -1,82 +1,167 @@
|
|
|
1
|
-
import type { RawValue, ConstantAccessor } from '../types/index.js';
|
|
1
|
+
import type { RawValue, ConstantAccessor, TickFormatFunction } from '../types/index.js';
|
|
2
2
|
import type * as CSS from 'csstype';
|
|
3
3
|
declare function $$render<Datum extends RawValue>(): {
|
|
4
4
|
props: Omit<Partial<{
|
|
5
5
|
filter: ConstantAccessor<boolean, Datum>;
|
|
6
6
|
facet: "auto" | "include" | "exclude";
|
|
7
|
-
fx: import("../types/channel").ChannelAccessor<Datum>;
|
|
8
|
-
fy: import("../types/channel").ChannelAccessor<Datum>;
|
|
7
|
+
fx: import("../types/channel.js").ChannelAccessor<Datum>;
|
|
8
|
+
fy: import("../types/channel.js").ChannelAccessor<Datum>;
|
|
9
9
|
dx: ConstantAccessor<number, Datum>;
|
|
10
10
|
dy: ConstantAccessor<number, Datum>;
|
|
11
|
-
dodgeX: import("../transforms/dodge").DodgeXOptions;
|
|
12
|
-
dodgeY: import("../transforms/dodge").DodgeYOptions;
|
|
13
|
-
fill: import("../types/channel").ChannelAccessor<Datum>;
|
|
11
|
+
dodgeX: import("../transforms/dodge.js").DodgeXOptions;
|
|
12
|
+
dodgeY: import("../transforms/dodge.js").DodgeYOptions;
|
|
13
|
+
fill: import("../types/channel.js").ChannelAccessor<Datum>;
|
|
14
14
|
fillOpacity: ConstantAccessor<number, Datum>;
|
|
15
|
+
fontFamily: ConstantAccessor<CSS.Property.FontFamily, Datum>;
|
|
16
|
+
fontSize: ConstantAccessor<number | "-moz-initial" | "inherit" | "initial" | "revert" | "revert-layer" | "unset" | "math" | (string & {}) | "large" | "medium" | "small" | "x-large" | "x-small" | "xx-large" | "xx-small" | "xxx-large" | "larger" | "smaller", Datum>;
|
|
17
|
+
fontStyle: ConstantAccessor<CSS.Property.FontStyle, Datum>;
|
|
18
|
+
fontVariant: ConstantAccessor<CSS.Property.FontVariant, Datum>;
|
|
19
|
+
fontWeight: ConstantAccessor<CSS.Property.FontWeight, Datum>;
|
|
20
|
+
letterSpacing: ConstantAccessor<CSS.Property.LetterSpacing<0 | (string & {})>, Datum>;
|
|
21
|
+
wordSpacing: ConstantAccessor<CSS.Property.WordSpacing<0 | (string & {})>, Datum>;
|
|
22
|
+
textAnchor: ConstantAccessor<CSS.Property.TextAnchor, Datum>;
|
|
23
|
+
textTransform: ConstantAccessor<CSS.Property.TextTransform, Datum>;
|
|
24
|
+
textDecoration: ConstantAccessor<CSS.Property.TextDecoration<0 | (string & {})>, Datum>;
|
|
15
25
|
sort: ((a: RawValue, b: RawValue) => number) | {
|
|
16
26
|
channel: string;
|
|
17
27
|
order?: "ascending" | "descending";
|
|
18
28
|
} | ConstantAccessor<RawValue, Datum>;
|
|
19
|
-
stroke: import("../types/channel").ChannelAccessor<Datum>;
|
|
29
|
+
stroke: import("../types/channel.js").ChannelAccessor<Datum>;
|
|
20
30
|
strokeWidth: ConstantAccessor<number, Datum>;
|
|
21
31
|
strokeOpacity: ConstantAccessor<number, Datum>;
|
|
22
32
|
strokeLinejoin: ConstantAccessor<CSS.Property.StrokeLinejoin, Datum>;
|
|
23
33
|
strokeLinecap: ConstantAccessor<CSS.Property.StrokeLinecap, Datum>;
|
|
24
34
|
strokeMiterlimit: ConstantAccessor<number, Datum>;
|
|
25
|
-
opacity: import("../types/channel").ChannelAccessor<Datum>;
|
|
35
|
+
opacity: import("../types/channel.js").ChannelAccessor<Datum>;
|
|
26
36
|
strokeDasharray: ConstantAccessor<string, Datum>;
|
|
27
37
|
strokeDashoffset: ConstantAccessor<number, Datum>;
|
|
38
|
+
blend: ConstantAccessor<CSS.Property.MixBlendMode, Datum>;
|
|
28
39
|
mixBlendMode: ConstantAccessor<CSS.Property.MixBlendMode, Datum>;
|
|
29
40
|
clipPath: string;
|
|
30
41
|
mask: string;
|
|
31
42
|
imageFilter: ConstantAccessor<string, Datum>;
|
|
32
43
|
shapeRendering: ConstantAccessor<CSS.Property.ShapeRendering, Datum>;
|
|
33
44
|
paintOrder: ConstantAccessor<string, Datum>;
|
|
34
|
-
onclick:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
45
|
+
onclick: (event: Event & {
|
|
46
|
+
currentTarget: SVGPathElement;
|
|
47
|
+
}, datum: Datum, index: number) => void;
|
|
48
|
+
ondblclick: (event: Event & {
|
|
49
|
+
currentTarget: SVGPathElement;
|
|
50
|
+
}, datum: Datum, index: number) => void;
|
|
51
|
+
onmouseup: (event: Event & {
|
|
52
|
+
currentTarget: SVGPathElement;
|
|
53
|
+
}, datum: Datum, index: number) => void;
|
|
54
|
+
onmousedown: (event: Event & {
|
|
55
|
+
currentTarget: SVGPathElement;
|
|
56
|
+
}, datum: Datum, index: number) => void;
|
|
57
|
+
onmouseenter: (event: Event & {
|
|
58
|
+
currentTarget: SVGPathElement;
|
|
59
|
+
}, datum: Datum, index: number) => void;
|
|
60
|
+
onmousemove: (event: Event & {
|
|
61
|
+
currentTarget: SVGPathElement;
|
|
62
|
+
}, datum: Datum, index: number) => void;
|
|
63
|
+
onmouseleave: (event: Event & {
|
|
64
|
+
currentTarget: SVGPathElement;
|
|
65
|
+
}, datum: Datum, index: number) => void;
|
|
66
|
+
onmouseout: (event: Event & {
|
|
67
|
+
currentTarget: SVGPathElement;
|
|
68
|
+
}, datum: Datum, index: number) => void;
|
|
69
|
+
onmouseover: (event: Event & {
|
|
70
|
+
currentTarget: SVGPathElement;
|
|
71
|
+
}, datum: Datum, index: number) => void;
|
|
72
|
+
onpointercancel: (event: Event & {
|
|
73
|
+
currentTarget: SVGPathElement;
|
|
74
|
+
}, datum: Datum, index: number) => void;
|
|
75
|
+
onpointerdown: (event: Event & {
|
|
76
|
+
currentTarget: SVGPathElement;
|
|
77
|
+
}, datum: Datum, index: number) => void;
|
|
78
|
+
onpointerup: (event: Event & {
|
|
79
|
+
currentTarget: SVGPathElement;
|
|
80
|
+
}, datum: Datum, index: number) => void;
|
|
81
|
+
onpointerenter: (event: Event & {
|
|
82
|
+
currentTarget: SVGPathElement;
|
|
83
|
+
}, datum: Datum, index: number) => void;
|
|
84
|
+
onpointerleave: (event: Event & {
|
|
85
|
+
currentTarget: SVGPathElement;
|
|
86
|
+
}, datum: Datum, index: number) => void;
|
|
87
|
+
onpointermove: (event: Event & {
|
|
88
|
+
currentTarget: SVGPathElement;
|
|
89
|
+
}, datum: Datum, index: number) => void;
|
|
90
|
+
onpointerover: (event: Event & {
|
|
91
|
+
currentTarget: SVGPathElement;
|
|
92
|
+
}, datum: Datum, index: number) => void;
|
|
93
|
+
onpointerout: (event: Event & {
|
|
94
|
+
currentTarget: SVGPathElement;
|
|
95
|
+
}, datum: Datum, index: number) => void;
|
|
96
|
+
ondrag: (event: Event & {
|
|
97
|
+
currentTarget: SVGPathElement;
|
|
98
|
+
}, datum: Datum, index: number) => void;
|
|
99
|
+
ondrop: (event: Event & {
|
|
100
|
+
currentTarget: SVGPathElement;
|
|
101
|
+
}, datum: Datum, index: number) => void;
|
|
102
|
+
ondragstart: (event: Event & {
|
|
103
|
+
currentTarget: SVGPathElement;
|
|
104
|
+
}, datum: Datum, index: number) => void;
|
|
105
|
+
ondragenter: (event: Event & {
|
|
106
|
+
currentTarget: SVGPathElement;
|
|
107
|
+
}, datum: Datum, index: number) => void;
|
|
108
|
+
ondragleave: (event: Event & {
|
|
109
|
+
currentTarget: SVGPathElement;
|
|
110
|
+
}, datum: Datum, index: number) => void;
|
|
111
|
+
ondragover: (event: Event & {
|
|
112
|
+
currentTarget: SVGPathElement;
|
|
113
|
+
}, datum: Datum, index: number) => void;
|
|
114
|
+
ondragend: (event: Event & {
|
|
115
|
+
currentTarget: SVGPathElement;
|
|
116
|
+
}, datum: Datum, index: number) => void;
|
|
117
|
+
ontouchstart: (event: Event & {
|
|
118
|
+
currentTarget: SVGPathElement;
|
|
119
|
+
}, datum: Datum, index: number) => void;
|
|
120
|
+
ontouchmove: (event: Event & {
|
|
121
|
+
currentTarget: SVGPathElement;
|
|
122
|
+
}, datum: Datum, index: number) => void;
|
|
123
|
+
ontouchend: (event: Event & {
|
|
124
|
+
currentTarget: SVGPathElement;
|
|
125
|
+
}, datum: Datum, index: number) => void;
|
|
126
|
+
ontouchcancel: (event: Event & {
|
|
127
|
+
currentTarget: SVGPathElement;
|
|
128
|
+
}, datum: Datum, index: number) => void;
|
|
129
|
+
oncontextmenu: (event: Event & {
|
|
130
|
+
currentTarget: SVGPathElement;
|
|
131
|
+
}, datum: Datum, index: number) => void;
|
|
132
|
+
onwheel: (event: Event & {
|
|
133
|
+
currentTarget: SVGPathElement;
|
|
134
|
+
}, datum: Datum, index: number) => void;
|
|
64
135
|
class: string;
|
|
65
136
|
style: string;
|
|
66
137
|
cursor: ConstantAccessor<CSS.Property.Cursor, Datum>;
|
|
67
|
-
|
|
138
|
+
title: ConstantAccessor<string, Datum>;
|
|
139
|
+
}>, "fillOpacity" | "textAnchor" | "paintOrder" | "title" | "href" | "target"> & {
|
|
140
|
+
/** custom tick values to display on the axis */
|
|
68
141
|
data?: Datum[];
|
|
142
|
+
/** whether this axis was automatically added by the Plot component */
|
|
69
143
|
automatic?: boolean;
|
|
144
|
+
/** the axis title label; set to false or null to hide */
|
|
70
145
|
title?: string | false | null;
|
|
146
|
+
/** which edge of the plot the axis appears on */
|
|
71
147
|
anchor?: "top" | "bottom";
|
|
148
|
+
/** the interval between ticks, e.g. "day", "month", or a number */
|
|
72
149
|
interval?: string | number;
|
|
150
|
+
/** controls which facet edge displays this axis */
|
|
73
151
|
facetAnchor?: "auto" | "top-empty" | "bottom-empty" | "top" | "bottom";
|
|
152
|
+
/** horizontal alignment of the axis title */
|
|
74
153
|
labelAnchor?: "auto" | "left" | "center" | "right";
|
|
154
|
+
/** the length of tick marks in pixels */
|
|
75
155
|
tickSize?: number;
|
|
156
|
+
/** font size for tick labels */
|
|
76
157
|
tickFontSize?: ConstantAccessor<number, Datum>;
|
|
158
|
+
/** font size for the axis title */
|
|
77
159
|
titleFontSize?: number;
|
|
160
|
+
/** spacing between tick marks and tick labels in pixels */
|
|
78
161
|
tickPadding?: number;
|
|
79
|
-
|
|
162
|
+
/** formatter for tick labels; can be "auto", an Intl format options object, or a custom function */
|
|
163
|
+
tickFormat?: "auto" | Intl.DateTimeFormatOptions | Intl.NumberFormatOptions | TickFormatFunction;
|
|
164
|
+
/** CSS class applied to each tick label */
|
|
80
165
|
tickClass?: ConstantAccessor<string, Datum>;
|
|
81
166
|
/** ticks is a shorthand for defining data, tickCount or interval */
|
|
82
167
|
ticks?: number | string | Datum[];
|
package/dist/marks/AxisY.svelte
CHANGED
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
RawValue,
|
|
11
11
|
FacetContext,
|
|
12
12
|
ChannelName,
|
|
13
|
-
ConstantAccessor
|
|
13
|
+
ConstantAccessor,
|
|
14
|
+
TickFormatFunction,
|
|
15
|
+
DataRecord,
|
|
16
|
+
ScaledChannelName
|
|
14
17
|
} from '../types/index.js';
|
|
15
18
|
import autoTimeFormat from '../helpers/autoTimeFormat.js';
|
|
16
19
|
import { autoTicks } from '../helpers/autoTicks.js';
|
|
@@ -21,26 +24,41 @@
|
|
|
21
24
|
|
|
22
25
|
interface AxisYMarkProps extends Omit<
|
|
23
26
|
BaseMarkProps<Datum>,
|
|
24
|
-
'fillOpacity' | 'paintOrder' | 'title' | 'href' | 'target'
|
|
27
|
+
'fillOpacity' | 'paintOrder' | 'title' | 'href' | 'target' | 'textAnchor'
|
|
25
28
|
> {
|
|
29
|
+
/** custom tick values to display on the axis */
|
|
26
30
|
data?: Datum[];
|
|
31
|
+
/** whether this axis was automatically added by the Plot component */
|
|
27
32
|
automatic?: boolean;
|
|
33
|
+
/** the axis title label; set to false or null to hide */
|
|
28
34
|
title?: string | false | null;
|
|
35
|
+
/** which edge of the plot the axis appears on */
|
|
29
36
|
anchor?: 'left' | 'right';
|
|
37
|
+
/** controls which facet edge displays this axis */
|
|
30
38
|
facetAnchor?: 'auto' | 'left' | 'right' | 'left-empty' | 'right-empty';
|
|
39
|
+
/** vertical alignment of tick labels relative to the tick position */
|
|
31
40
|
lineAnchor?: 'top' | 'center' | 'bottom';
|
|
41
|
+
/** the interval between ticks, e.g. "day", "month", or a number */
|
|
32
42
|
interval?: string | number;
|
|
43
|
+
/** horizontal alignment of the axis title */
|
|
33
44
|
labelAnchor?: 'auto' | 'left' | 'center' | 'right';
|
|
45
|
+
/** text anchor for tick labels */
|
|
34
46
|
textAnchor?: 'auto' | 'start' | 'middle' | 'end';
|
|
47
|
+
/** the length of tick marks in pixels */
|
|
35
48
|
tickSize?: number;
|
|
49
|
+
/** font size for tick labels */
|
|
36
50
|
tickFontSize?: ConstantAccessor<number, Datum>;
|
|
51
|
+
/** font size for the axis title */
|
|
37
52
|
titleFontSize?: number;
|
|
53
|
+
/** spacing between tick marks and tick labels in pixels */
|
|
38
54
|
tickPadding?: number;
|
|
55
|
+
/** formatter for tick labels; can be "auto", an Intl format options object, or a custom function */
|
|
39
56
|
tickFormat?:
|
|
40
57
|
| 'auto'
|
|
41
58
|
| Intl.DateTimeFormatOptions
|
|
42
59
|
| Intl.NumberFormatOptions
|
|
43
|
-
|
|
|
60
|
+
| TickFormatFunction;
|
|
61
|
+
/** CSS class applied to each tick label */
|
|
44
62
|
tickClass?: ConstantAccessor<string, Datum>;
|
|
45
63
|
/** ticks is a shorthand for defining data, tickCount or interval */
|
|
46
64
|
ticks?: number | string | Datum[];
|
|
@@ -54,7 +72,7 @@
|
|
|
54
72
|
|
|
55
73
|
let markProps: AxisYMarkProps = $props();
|
|
56
74
|
|
|
57
|
-
const DEFAULTS
|
|
75
|
+
const DEFAULTS = {
|
|
58
76
|
tickSize: 6,
|
|
59
77
|
tickPadding: 3,
|
|
60
78
|
tickFontSize: 11,
|
|
@@ -68,7 +86,7 @@
|
|
|
68
86
|
const { ticks: magicTicks } = $derived({ ...DEFAULTS, ...markProps });
|
|
69
87
|
|
|
70
88
|
const {
|
|
71
|
-
data,
|
|
89
|
+
data = [] as Datum[],
|
|
72
90
|
automatic = false,
|
|
73
91
|
title,
|
|
74
92
|
anchor = 'left',
|
|
@@ -87,12 +105,12 @@
|
|
|
87
105
|
text = true,
|
|
88
106
|
...options
|
|
89
107
|
}: AxisYMarkProps = $derived({
|
|
90
|
-
data: Array.isArray(magicTicks) ? magicTicks : [],
|
|
108
|
+
data: (Array.isArray(magicTicks) ? magicTicks : []) as Datum[],
|
|
91
109
|
tickCount: typeof magicTicks === 'number' ? magicTicks : undefined,
|
|
92
110
|
interval: typeof magicTicks === 'string' ? magicTicks : undefined,
|
|
93
111
|
...DEFAULTS,
|
|
94
112
|
...markProps
|
|
95
|
-
});
|
|
113
|
+
} as AxisYMarkProps);
|
|
96
114
|
|
|
97
115
|
const plot = usePlot();
|
|
98
116
|
|
|
@@ -120,15 +138,14 @@
|
|
|
120
138
|
);
|
|
121
139
|
|
|
122
140
|
const useCompactNotation = $derived.by(() => {
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const crossesZero = range[0] <= 0 && range[1] >= 0;
|
|
141
|
+
const numericDomain = plot.scales.y.domain.filter(
|
|
142
|
+
(d): d is number => typeof d === 'number' && Number.isFinite(d)
|
|
143
|
+
);
|
|
144
|
+
if (numericDomain.length < 2) return false;
|
|
145
|
+
const [min, max] = extent(numericDomain) as [number, number];
|
|
146
|
+
const crossesZero = min <= 0 && max >= 0;
|
|
130
147
|
if (crossesZero) return true;
|
|
131
|
-
const magnitudes =
|
|
148
|
+
const magnitudes = [min, max].map((d) =>
|
|
132
149
|
d === 0 ? -Infinity : Math.floor(Math.log10(Math.abs(d)))
|
|
133
150
|
);
|
|
134
151
|
return magnitudes[0] !== magnitudes[1];
|
|
@@ -140,7 +157,7 @@
|
|
|
140
157
|
typeof tickFmt === 'function'
|
|
141
158
|
? tickFmt
|
|
142
159
|
: plot.scales.y.type === 'band' || plot.scales.y.type === 'point'
|
|
143
|
-
? (d) => d
|
|
160
|
+
? (d: RawValue) => String(d)
|
|
144
161
|
: plot.scales.y.type === 'time'
|
|
145
162
|
? // time scale
|
|
146
163
|
typeof tickFmt === 'object'
|
|
@@ -154,9 +171,9 @@
|
|
|
154
171
|
Intl.NumberFormat(plot.options.locale, {
|
|
155
172
|
// use compact notation if range covers multiple magnitudes
|
|
156
173
|
...(useCompactNotation ? { notation: 'compact' } : {}),
|
|
157
|
-
...
|
|
174
|
+
...getPlotDefaults().numberFormat,
|
|
158
175
|
style: plot.options.y.percent ? 'percent' : 'decimal'
|
|
159
|
-
}).format(d)
|
|
176
|
+
}).format(d as number)
|
|
160
177
|
);
|
|
161
178
|
|
|
162
179
|
const optionsLabel = $derived(plot.options.y.label);
|
|
@@ -195,12 +212,12 @@
|
|
|
195
212
|
type="axisY"
|
|
196
213
|
data={data.length ? data.map((tick) => ({ __y: tick })) : []}
|
|
197
214
|
channels={['y']}
|
|
198
|
-
{...{ ...options, y: '__y' }}
|
|
215
|
+
{...{ ...options, y: '__y' } as any}
|
|
199
216
|
{automatic}>
|
|
200
217
|
{#if left && top && useTitle}
|
|
201
218
|
<text
|
|
202
219
|
style={resolveScaledStyles(
|
|
203
|
-
|
|
220
|
+
{} as DataRecord,
|
|
204
221
|
{
|
|
205
222
|
opacity: 0.8,
|
|
206
223
|
...options,
|
|
@@ -209,7 +226,7 @@
|
|
|
209
226
|
stroke: null,
|
|
210
227
|
textAnchor: anchor === 'left' ? 'start' : 'end'
|
|
211
228
|
},
|
|
212
|
-
{},
|
|
229
|
+
{} as Record<ScaledChannelName, boolean>,
|
|
213
230
|
plot,
|
|
214
231
|
'fill'
|
|
215
232
|
)}
|
|
@@ -224,7 +241,7 @@
|
|
|
224
241
|
class={className}
|
|
225
242
|
{lineAnchor}
|
|
226
243
|
options={{
|
|
227
|
-
...options,
|
|
244
|
+
...(options as any),
|
|
228
245
|
textAnchor:
|
|
229
246
|
textAnchor == null || textAnchor === 'auto'
|
|
230
247
|
? anchor === 'left'
|
|
@@ -234,16 +251,16 @@
|
|
|
234
251
|
}}
|
|
235
252
|
{plot}
|
|
236
253
|
{text}
|
|
237
|
-
{tickClass}
|
|
238
|
-
{tickFontSize}
|
|
254
|
+
tickClass={tickClass as ConstantAccessor<string>}
|
|
255
|
+
tickFontSize={tickFontSize as ConstantAccessor<number>}
|
|
239
256
|
{tickPadding}
|
|
240
257
|
{ticks}
|
|
241
258
|
{tickSize}
|
|
242
259
|
marginLeft={plot.options.marginLeft}
|
|
243
260
|
scaleFn={plot.scales.y.fn}
|
|
244
261
|
scaleType={plot.scales.y.type}
|
|
245
|
-
tickFormat={useTickFormat}
|
|
246
|
-
title={useTitle}
|
|
262
|
+
tickFormat={useTickFormat as TickFormatFunction}
|
|
263
|
+
title={useTitle as string | null}
|
|
247
264
|
width={plot.facetWidth} />
|
|
248
265
|
{/if}
|
|
249
266
|
</Mark>
|