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.
Files changed (222) hide show
  1. package/dist/Mark.svelte +42 -25
  2. package/dist/Mark.svelte.d.ts +111 -32
  3. package/dist/Plot.svelte +21 -15
  4. package/dist/core/Facet.svelte +1 -1
  5. package/dist/core/FacetAxes.svelte +13 -8
  6. package/dist/core/FacetGrid.svelte +4 -4
  7. package/dist/core/Plot.svelte +41 -35
  8. package/dist/helpers/autoScales.d.ts +3 -3
  9. package/dist/helpers/autoScales.js +28 -18
  10. package/dist/helpers/autoTicks.js +2 -0
  11. package/dist/helpers/callWithProps.d.ts +1 -2
  12. package/dist/helpers/facets.js +0 -1
  13. package/dist/helpers/index.js +1 -1
  14. package/dist/helpers/mergeDeep.d.ts +1 -3
  15. package/dist/helpers/mergeDeep.js +15 -16
  16. package/dist/helpers/projection.d.ts +4 -3
  17. package/dist/helpers/projection.js +17 -5
  18. package/dist/helpers/reduce.d.ts +4 -4
  19. package/dist/helpers/reduce.js +6 -4
  20. package/dist/helpers/regressionLoess.js +2 -1
  21. package/dist/helpers/resolve.d.ts +6 -3
  22. package/dist/helpers/resolve.js +25 -16
  23. package/dist/helpers/scales.d.ts +10 -10
  24. package/dist/helpers/scales.js +43 -13
  25. package/dist/helpers/time.d.ts +10 -3
  26. package/dist/helpers/time.js +2 -1
  27. package/dist/hooks/index.d.ts +2 -0
  28. package/dist/hooks/index.js +2 -0
  29. package/dist/hooks/plotDefaults.d.ts +3 -1
  30. package/dist/hooks/plotDefaults.js +33 -1
  31. package/dist/hooks/usePlot.svelte.d.ts +10 -25
  32. package/dist/hooks/usePlot.svelte.js +8 -7
  33. package/dist/index.d.ts +1 -2
  34. package/dist/index.js +1 -3
  35. package/dist/marks/Area.svelte +24 -13
  36. package/dist/marks/Area.svelte.d.ts +118 -34
  37. package/dist/marks/AreaX.svelte +42 -8
  38. package/dist/marks/AreaX.svelte.d.ts +154 -71
  39. package/dist/marks/AreaY.svelte +42 -8
  40. package/dist/marks/AreaY.svelte.d.ts +154 -71
  41. package/dist/marks/Arrow.svelte +42 -23
  42. package/dist/marks/Arrow.svelte.d.ts +114 -35
  43. package/dist/marks/AxisX.svelte +43 -28
  44. package/dist/marks/AxisX.svelte.d.ts +125 -40
  45. package/dist/marks/AxisY.svelte +43 -26
  46. package/dist/marks/AxisY.svelte.d.ts +127 -40
  47. package/dist/marks/BarX.svelte +12 -10
  48. package/dist/marks/BarX.svelte.d.ts +104 -32
  49. package/dist/marks/BarY.svelte +11 -10
  50. package/dist/marks/BarY.svelte.d.ts +106 -34
  51. package/dist/marks/BollingerX.svelte +4 -7
  52. package/dist/marks/BollingerX.svelte.d.ts +105 -30
  53. package/dist/marks/BollingerY.svelte +3 -0
  54. package/dist/marks/BollingerY.svelte.d.ts +105 -30
  55. package/dist/marks/BoxX.svelte +3 -3
  56. package/dist/marks/BoxY.svelte +12 -9
  57. package/dist/marks/BoxY.svelte.d.ts +128 -53
  58. package/dist/marks/Brush.svelte +26 -21
  59. package/dist/marks/Brush.svelte.d.ts +119 -60
  60. package/dist/marks/Cell.svelte +13 -9
  61. package/dist/marks/Cell.svelte.d.ts +105 -30
  62. package/dist/marks/CellX.svelte +2 -1
  63. package/dist/marks/CellX.svelte.d.ts +105 -32
  64. package/dist/marks/CellY.svelte +2 -1
  65. package/dist/marks/CellY.svelte.d.ts +105 -32
  66. package/dist/marks/ColorLegend.svelte +24 -13
  67. package/dist/marks/ColorLegend.svelte.d.ts +1 -0
  68. package/dist/marks/CustomMark.svelte +16 -10
  69. package/dist/marks/CustomMark.svelte.d.ts +112 -31
  70. package/dist/marks/CustomMarkHTML.svelte +8 -2
  71. package/dist/marks/CustomMarkHTML.svelte.d.ts +8 -2
  72. package/dist/marks/DifferenceY.svelte +31 -20
  73. package/dist/marks/DifferenceY.svelte.d.ts +134 -55
  74. package/dist/marks/Dot.svelte +21 -11
  75. package/dist/marks/Dot.svelte.d.ts +117 -38
  76. package/dist/marks/DotX.svelte +2 -0
  77. package/dist/marks/DotX.svelte.d.ts +136 -62
  78. package/dist/marks/DotY.svelte +1 -0
  79. package/dist/marks/DotY.svelte.d.ts +135 -62
  80. package/dist/marks/Frame.svelte +47 -9
  81. package/dist/marks/Frame.svelte.d.ts +124 -41
  82. package/dist/marks/Geo.svelte +21 -12
  83. package/dist/marks/Geo.svelte.d.ts +105 -30
  84. package/dist/marks/Graticule.svelte +3 -0
  85. package/dist/marks/Graticule.svelte.d.ts +3 -0
  86. package/dist/marks/GridX.svelte +31 -16
  87. package/dist/marks/GridX.svelte.d.ts +108 -32
  88. package/dist/marks/GridY.svelte +30 -15
  89. package/dist/marks/GridY.svelte.d.ts +108 -32
  90. package/dist/marks/HTMLTooltip.svelte +14 -7
  91. package/dist/marks/HTMLTooltip.svelte.d.ts +7 -0
  92. package/dist/marks/Image.svelte +50 -25
  93. package/dist/marks/Image.svelte.d.ts +117 -35
  94. package/dist/marks/Line.svelte +67 -44
  95. package/dist/marks/Line.svelte.d.ts +119 -30
  96. package/dist/marks/LineX.svelte +2 -1
  97. package/dist/marks/LineX.svelte.d.ts +142 -69
  98. package/dist/marks/LineY.svelte +2 -1
  99. package/dist/marks/LineY.svelte.d.ts +142 -69
  100. package/dist/marks/Link.svelte +70 -46
  101. package/dist/marks/Link.svelte.d.ts +126 -41
  102. package/dist/marks/Pointer.svelte +24 -15
  103. package/dist/marks/Pointer.svelte.d.ts +7 -0
  104. package/dist/marks/Rect.svelte +13 -5
  105. package/dist/marks/Rect.svelte.d.ts +116 -35
  106. package/dist/marks/RectX.svelte +6 -3
  107. package/dist/marks/RectX.svelte.d.ts +158 -12
  108. package/dist/marks/RectY.svelte +6 -3
  109. package/dist/marks/RectY.svelte.d.ts +158 -12
  110. package/dist/marks/RegressionX.svelte +13 -6
  111. package/dist/marks/RegressionX.svelte.d.ts +8 -3
  112. package/dist/marks/RegressionY.svelte +13 -6
  113. package/dist/marks/RegressionY.svelte.d.ts +8 -3
  114. package/dist/marks/RuleX.svelte +18 -11
  115. package/dist/marks/RuleX.svelte.d.ts +112 -32
  116. package/dist/marks/RuleY.svelte +19 -12
  117. package/dist/marks/RuleY.svelte.d.ts +114 -34
  118. package/dist/marks/Spike.svelte +11 -5
  119. package/dist/marks/Spike.svelte.d.ts +146 -68
  120. package/dist/marks/Text.svelte +24 -7
  121. package/dist/marks/Text.svelte.d.ts +253 -75
  122. package/dist/marks/TickX.svelte +56 -48
  123. package/dist/marks/TickX.svelte.d.ts +114 -40
  124. package/dist/marks/TickY.svelte +59 -51
  125. package/dist/marks/TickY.svelte.d.ts +117 -43
  126. package/dist/marks/Trail.svelte +25 -13
  127. package/dist/marks/Trail.svelte.d.ts +116 -33
  128. package/dist/marks/Vector.svelte +20 -11
  129. package/dist/marks/Vector.svelte.d.ts +116 -35
  130. package/dist/marks/WaffleX.svelte +18 -16
  131. package/dist/marks/WaffleX.svelte.d.ts +131 -57
  132. package/dist/marks/WaffleY.svelte +16 -15
  133. package/dist/marks/WaffleY.svelte.d.ts +129 -56
  134. package/dist/marks/helpers/Anchor.svelte +17 -2
  135. package/dist/marks/helpers/Anchor.svelte.d.ts +16 -1
  136. package/dist/marks/helpers/AreaCanvas.svelte +8 -8
  137. package/dist/marks/helpers/BaseAxisX.svelte +38 -41
  138. package/dist/marks/helpers/BaseAxisX.svelte.d.ts +11 -17
  139. package/dist/marks/helpers/BaseAxisY.svelte +35 -35
  140. package/dist/marks/helpers/BaseAxisY.svelte.d.ts +12 -15
  141. package/dist/marks/helpers/Box.svelte +35 -28
  142. package/dist/marks/helpers/Box.svelte.d.ts +122 -50
  143. package/dist/marks/helpers/DotCanvas.svelte +11 -9
  144. package/dist/marks/helpers/GeoCanvas.svelte +7 -6
  145. package/dist/marks/helpers/LineCanvas.svelte +7 -7
  146. package/dist/marks/helpers/LinearGradientX.svelte +2 -2
  147. package/dist/marks/helpers/LinearGradientX.svelte.d.ts +1 -1
  148. package/dist/marks/helpers/LinearGradientY.svelte +2 -2
  149. package/dist/marks/helpers/LinearGradientY.svelte.d.ts +1 -1
  150. package/dist/marks/helpers/Marker.svelte +2 -2
  151. package/dist/marks/helpers/MarkerPath.svelte +15 -12
  152. package/dist/marks/helpers/MarkerPath.svelte.d.ts +105 -32
  153. package/dist/marks/helpers/MultilineText.svelte +24 -17
  154. package/dist/marks/helpers/MultilineText.svelte.d.ts +1 -1
  155. package/dist/marks/helpers/RectCanvas.svelte +31 -26
  156. package/dist/marks/helpers/RectPath.svelte +2 -2
  157. package/dist/marks/helpers/Regression.svelte +176 -86
  158. package/dist/marks/helpers/Regression.svelte.d.ts +20 -8
  159. package/dist/marks/helpers/RuleCanvas.svelte +9 -6
  160. package/dist/marks/helpers/TextCanvas.svelte +13 -9
  161. package/dist/marks/helpers/TextCanvas.svelte.d.ts +6 -6
  162. package/dist/marks/helpers/TickCanvas.svelte +6 -5
  163. package/dist/marks/helpers/TrailCanvas.svelte +16 -18
  164. package/dist/marks/helpers/TrailCanvas.svelte.d.ts +3 -5
  165. package/dist/marks/helpers/canvas.js +16 -9
  166. package/dist/marks/helpers/events.d.ts +2 -2
  167. package/dist/marks/helpers/events.js +14 -7
  168. package/dist/marks/helpers/waffle.d.ts +3 -3
  169. package/dist/marks/helpers/waffle.js +6 -4
  170. package/dist/regression/polynomial.d.ts +1 -1
  171. package/dist/regression/polynomial.js +5 -5
  172. package/dist/regression/utils/determination.d.ts +1 -1
  173. package/dist/regression/utils/determination.js +1 -1
  174. package/dist/regression/utils/geometry.d.ts +1 -1
  175. package/dist/regression/utils/interpose.d.ts +1 -1
  176. package/dist/regression/utils/interpose.js +1 -1
  177. package/dist/regression/utils/points.d.ts +1 -1
  178. package/dist/transforms/bin.d.ts +3 -3
  179. package/dist/transforms/bin.js +29 -20
  180. package/dist/transforms/bollinger.d.ts +8 -0
  181. package/dist/transforms/bollinger.js +9 -1
  182. package/dist/transforms/centroid.d.ts +4 -0
  183. package/dist/transforms/centroid.js +4 -0
  184. package/dist/transforms/density.d.ts +4 -4
  185. package/dist/transforms/density.js +20 -13
  186. package/dist/transforms/dodge.d.ts +12 -1
  187. package/dist/transforms/dodge.js +15 -6
  188. package/dist/transforms/group.d.ts +141 -4
  189. package/dist/transforms/group.js +4 -1
  190. package/dist/transforms/interval.d.ts +204 -60
  191. package/dist/transforms/jitter.d.ts +421 -4
  192. package/dist/transforms/jitter.js +10 -1
  193. package/dist/transforms/map.d.ts +412 -4
  194. package/dist/transforms/map.js +3 -3
  195. package/dist/transforms/normalize.d.ts +276 -5
  196. package/dist/transforms/normalize.js +5 -3
  197. package/dist/transforms/recordize.d.ts +17 -5
  198. package/dist/transforms/recordize.js +13 -9
  199. package/dist/transforms/rename.d.ts +11 -4
  200. package/dist/transforms/rename.js +7 -2
  201. package/dist/transforms/select.d.ts +722 -210
  202. package/dist/transforms/select.js +13 -1
  203. package/dist/transforms/shift.d.ts +8 -0
  204. package/dist/transforms/shift.js +20 -6
  205. package/dist/transforms/sort.d.ts +13 -258
  206. package/dist/transforms/sort.js +13 -10
  207. package/dist/transforms/stack.d.ts +58 -9
  208. package/dist/transforms/stack.js +27 -11
  209. package/dist/transforms/window.d.ts +221 -66
  210. package/dist/transforms/window.js +8 -2
  211. package/dist/types/axes.d.ts +43 -0
  212. package/dist/types/axes.js +1 -0
  213. package/dist/types/channel.d.ts +30 -2
  214. package/dist/types/data.d.ts +14 -1
  215. package/dist/types/facet.d.ts +5 -0
  216. package/dist/types/index.d.ts +33 -8
  217. package/dist/types/index.js +11 -7
  218. package/dist/types/mark.d.ts +124 -35
  219. package/dist/types/plot.d.ts +118 -16
  220. package/dist/types/scale.d.ts +125 -8
  221. package/package.json +178 -175
  222. package/dist/helpers/autoTicks.d.ts +0 -12
@@ -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
- | ((d: RawValue, i: number) => string);
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: Omit<AxisXMarkProps, 'data' | ChannelName> = {
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 range =
129
- extent(plot.scales.x.domain).filter(
130
- (d): d is number => typeof d === 'number' && Number.isFinite(d)
131
- ) ?? [];
132
-
133
- if (range[0] === undefined || range[1] === undefined) return false;
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 = range.map((d) =>
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
- ...DEFAULTS.numberFormat,
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 showAxis = $derived(
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
- null,
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
- {labelAnchor}
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: import("svelte/elements").MouseEventHandler<SVGPathElement>;
35
- ondblclick: import("svelte/elements").MouseEventHandler<SVGPathElement>;
36
- onmouseup: import("svelte/elements").MouseEventHandler<SVGPathElement>;
37
- onmousedown: import("svelte/elements").MouseEventHandler<SVGPathElement>;
38
- onmouseenter: import("svelte/elements").MouseEventHandler<SVGPathElement>;
39
- onmousemove: import("svelte/elements").MouseEventHandler<SVGPathElement>;
40
- onmouseleave: import("svelte/elements").MouseEventHandler<SVGPathElement>;
41
- onmouseout: import("svelte/elements").MouseEventHandler<SVGPathElement>;
42
- onmouseover: import("svelte/elements").MouseEventHandler<SVGPathElement>;
43
- onpointercancel: import("svelte/elements").MouseEventHandler<SVGPathElement>;
44
- onpointerdown: import("svelte/elements").MouseEventHandler<SVGPathElement>;
45
- onpointerup: import("svelte/elements").MouseEventHandler<SVGPathElement>;
46
- onpointerenter: import("svelte/elements").MouseEventHandler<SVGPathElement>;
47
- onpointerleave: import("svelte/elements").MouseEventHandler<SVGPathElement>;
48
- onpointermove: import("svelte/elements").MouseEventHandler<SVGPathElement>;
49
- onpointerover: import("svelte/elements").MouseEventHandler<SVGPathElement>;
50
- onpointerout: import("svelte/elements").MouseEventHandler<SVGPathElement>;
51
- ondrag: import("svelte/elements").MouseEventHandler<SVGPathElement>;
52
- ondrop: import("svelte/elements").MouseEventHandler<SVGPathElement>;
53
- ondragstart: import("svelte/elements").MouseEventHandler<SVGPathElement>;
54
- ondragenter: import("svelte/elements").MouseEventHandler<SVGPathElement>;
55
- ondragleave: import("svelte/elements").MouseEventHandler<SVGPathElement>;
56
- ondragover: import("svelte/elements").MouseEventHandler<SVGPathElement>;
57
- ondragend: import("svelte/elements").MouseEventHandler<SVGPathElement>;
58
- ontouchstart: import("svelte/elements").MouseEventHandler<SVGPathElement>;
59
- ontouchmove: import("svelte/elements").MouseEventHandler<SVGPathElement>;
60
- ontouchend: import("svelte/elements").MouseEventHandler<SVGPathElement>;
61
- ontouchcancel: import("svelte/elements").MouseEventHandler<SVGPathElement>;
62
- oncontextmenu: import("svelte/elements").MouseEventHandler<SVGPathElement>;
63
- onwheel: import("svelte/elements").MouseEventHandler<SVGPathElement>;
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
- }>, "fillOpacity" | "paintOrder" | "href" | "target" | "title"> & {
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
- tickFormat?: "auto" | Intl.DateTimeFormatOptions | Intl.NumberFormatOptions | ((d: RawValue, i: number) => string);
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[];
@@ -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
- | ((d: RawValue) => string);
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: Omit<AxisYMarkProps, 'data' | ChannelName> = {
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 range =
124
- extent(plot.scales.y.domain).filter(
125
- (d): d is number => typeof d === 'number' && Number.isFinite(d)
126
- ) ?? [];
127
-
128
- if (range[0] === undefined || range[1] === undefined) return false;
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 = range.map((d) =>
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
- ...DEFAULTS.numberFormat,
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
- null,
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>