@wick-charts/vue 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +45 -6
  2. package/dist/BarSeries.vue.js +26 -20
  3. package/dist/CandlestickSeries.vue.js +30 -24
  4. package/dist/ChartContainer.vue.js +125 -72
  5. package/dist/HeatmapSeries.vue.js +40 -0
  6. package/dist/HeatmapSeries.vue2.js +4 -0
  7. package/dist/LineSeries.vue.js +26 -20
  8. package/dist/PieSeries.vue.js +24 -18
  9. package/dist/core/dist/animation/animator.js +21 -21
  10. package/dist/core/dist/animation/config.js +114 -87
  11. package/dist/core/dist/animation/easing.js +3 -1
  12. package/dist/core/dist/animation/intro-wave.js +68 -0
  13. package/dist/core/dist/axis/dom-labels.js +13 -14
  14. package/dist/core/dist/chart/badge-animator.js +56 -0
  15. package/dist/core/dist/chart/edge-indicators.js +28 -13
  16. package/dist/core/dist/chart/last-value.js +18 -17
  17. package/dist/core/dist/chart/options.js +27 -16
  18. package/dist/core/dist/chart/y-target.js +13 -12
  19. package/dist/core/dist/chart.js +868 -441
  20. package/dist/core/dist/components/annotation-chip.js +28 -0
  21. package/dist/core/dist/components/crosshair.js +8 -6
  22. package/dist/core/dist/components/edge-indicator.js +58 -26
  23. package/dist/core/dist/components/loading-indicator.js +46 -0
  24. package/dist/core/dist/components/marker.js +49 -31
  25. package/dist/core/dist/components/reference-line.js +27 -36
  26. package/dist/core/dist/components/time-region.js +30 -28
  27. package/dist/core/dist/data/store.js +38 -19
  28. package/dist/core/dist/data/sync.js +60 -38
  29. package/dist/core/dist/heatmap-tooltip.js +16 -0
  30. package/dist/core/dist/interactions/handler.js +86 -46
  31. package/dist/core/dist/perf/perf-hud.js +5 -5
  32. package/dist/core/dist/scales/x-scale.js +85 -37
  33. package/dist/core/dist/scales/y-scale.js +38 -27
  34. package/dist/core/dist/series/bar-intro.js +18 -0
  35. package/dist/core/dist/series/bar.js +337 -205
  36. package/dist/core/dist/series/base-multi-layer.js +224 -96
  37. package/dist/core/dist/series/candlestick-intro.js +57 -0
  38. package/dist/core/dist/series/candlestick.js +454 -276
  39. package/dist/core/dist/series/heatmap.js +387 -0
  40. package/dist/core/dist/series/line-intro.js +85 -0
  41. package/dist/core/dist/series/line.js +590 -282
  42. package/dist/core/dist/series/painters/builtins.js +2 -2
  43. package/dist/core/dist/series/pie.js +396 -259
  44. package/dist/core/dist/series/register-builtins.js +8 -7
  45. package/dist/core/dist/series/types.js +6 -0
  46. package/dist/core/dist/series/wave-intro.js +26 -0
  47. package/dist/core/dist/theme/create.js +69 -63
  48. package/dist/core/dist/theme/themes/mint-breeze.js +2 -2
  49. package/dist/core/dist/theme/themes/sand-dune.js +2 -2
  50. package/dist/core/dist/utils/color.js +109 -34
  51. package/dist/core/dist/utils/deep-equal.js +18 -0
  52. package/dist/core/dist/utils/time.js +25 -19
  53. package/dist/index.d.ts +1494 -122
  54. package/dist/index.js +177 -130
  55. package/dist/ui/Crosshair.vue.js +20 -21
  56. package/dist/ui/HeatmapTooltip.vue.js +96 -0
  57. package/dist/ui/HeatmapTooltip.vue2.js +4 -0
  58. package/dist/ui/InfoBar.vue.js +46 -47
  59. package/dist/ui/Legend.vue.js +80 -79
  60. package/dist/ui/PieLegend.vue.js +5 -5
  61. package/dist/ui/PieTooltip.vue.js +77 -67
  62. package/dist/ui/Tooltip.vue.js +60 -60
  63. package/dist/ui/YAxis.vue.js +2 -2
  64. package/dist/ui/YLabel.vue.js +94 -61
  65. package/package.json +2 -2
  66. package/src/BarSeries.vue +23 -7
  67. package/src/CandlestickSeries.vue +23 -7
  68. package/src/ChartContainer.vue +250 -13
  69. package/src/HeatmapSeries.vue +69 -0
  70. package/src/LineSeries.vue +23 -7
  71. package/src/PieSeries.vue +22 -6
  72. package/src/index.ts +84 -3
  73. package/src/ui/Crosshair.vue +1 -2
  74. package/src/ui/HeatmapTooltip.vue +144 -0
  75. package/src/ui/InfoBar.vue +1 -2
  76. package/src/ui/Legend.vue +13 -0
  77. package/src/ui/Marker.vue +1 -1
  78. package/src/ui/PieTooltip.vue +10 -0
  79. package/src/ui/ReferenceLine.vue +2 -2
  80. package/src/ui/TimeRegion.vue +2 -2
  81. package/src/ui/Tooltip.vue +2 -2
  82. package/src/ui/YLabel.vue +123 -8
package/dist/index.d.ts CHANGED
@@ -6,8 +6,15 @@ import { Ref } from 'vue';
6
6
  import { ShallowRef } from 'vue';
7
7
 
8
8
  declare const __VLS_component: DefineComponent<__VLS_Props_3, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_3> & Readonly<{}>, {
9
+ fade: boolean | {
10
+ top?: number;
11
+ overlap?: number;
12
+ right?: number;
13
+ left?: number;
14
+ };
9
15
  theme: ChartTheme;
10
16
  gradient: boolean;
17
+ interactive: boolean;
11
18
  headerLayout: "overlay" | "inline";
12
19
  }, {}, {}, {}, string, ComponentProvideOptions, false, {
13
20
  titleAnchor: HTMLDivElement;
@@ -19,30 +26,30 @@ legendAnchor: HTMLDivElement;
19
26
  navigatorAnchor: HTMLDivElement;
20
27
  }, HTMLDivElement>;
21
28
 
22
- declare const __VLS_component_2: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_6> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
29
+ declare const __VLS_component_2: DefineComponent<__VLS_Props_8, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_8> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
23
30
 
24
- declare const __VLS_component_3: DefineComponent<__VLS_Props_7, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_7> & Readonly<{}>, {
31
+ declare const __VLS_component_3: DefineComponent<__VLS_Props_9, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_9> & Readonly<{}>, {
25
32
  position: "bottom" | "right";
26
33
  mode: LegendMode;
27
34
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
28
35
 
29
- declare const __VLS_component_4: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {
36
+ declare const __VLS_component_4: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {
30
37
  position: PieLegendPosition;
31
38
  format: ValueFormatter;
32
39
  mode: PieLegendMode;
33
40
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
34
41
 
35
- declare const __VLS_component_5: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
42
+ declare const __VLS_component_5: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
36
43
  containerRef: HTMLDivElement;
37
44
  }, any>;
38
45
 
39
- declare const __VLS_component_6: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
46
+ declare const __VLS_component_6: DefineComponent<__VLS_Props_18, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_18> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
40
47
 
41
- declare const __VLS_component_7: DefineComponent<__VLS_Props_17, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_17> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
48
+ declare const __VLS_component_7: DefineComponent<__VLS_Props_19, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_19> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
42
49
  containerRef: HTMLDivElement;
43
50
  }, any>;
44
51
 
45
- declare const __VLS_component_8: DefineComponent<__VLS_Props_19, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_19> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
52
+ declare const __VLS_component_8: DefineComponent<__VLS_Props_21, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_21> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
46
53
 
47
54
  declare type __VLS_Props = {
48
55
  /** Flat `TimePoint[]`, `TimePoint[][]`, or named `{ label, color?, data }` layers. Time accepts ms or `Date`. */
@@ -50,9 +57,34 @@ declare type __VLS_Props = {
50
57
  options?: Partial<BarSeriesOptions>;
51
58
  /** Stable series ID — same value across remounts. */
52
59
  id?: string;
60
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
61
+ visible?: boolean;
53
62
  };
54
63
 
55
64
  declare type __VLS_Props_10 = {
65
+ /** X anchor — epoch ms or a `Date`. */
66
+ time: TimeValue;
67
+ /** Y anchor as a data value. Omit and set `seriesId` to snap to that series' value at `time`. */
68
+ value?: number;
69
+ /** Snap Y to this series' value at `time` when `value` is omitted. Also the default color source. */
70
+ seriesId?: string;
71
+ /** Glyph at the anchor. Default: `'dot'`. Arrows point their tip at the anchor. */
72
+ shape?: MarkerShape;
73
+ /** Reuse the line pulse halo around the anchor. Default: `false`. */
74
+ pulse?: boolean;
75
+ /** Optional text label drawn as a callout chip whose tail points at the anchor. */
76
+ label?: string;
77
+ /** Color override. Falls back to the series color (when `seriesId` is set), then the theme line color. */
78
+ color?: string;
79
+ };
80
+
81
+ declare type __VLS_Props_11 = {
82
+ data: NavigatorData;
83
+ /** Strip height in CSS pixels. Defaults to `theme.navigator.height` (60). */
84
+ height?: number;
85
+ };
86
+
87
+ declare type __VLS_Props_12 = {
56
88
  value: number;
57
89
  /**
58
90
  * Value-to-string formatter. Defaults to the current locale's
@@ -64,7 +96,7 @@ declare type __VLS_Props_10 = {
64
96
  spinDuration?: number;
65
97
  };
66
98
 
67
- declare type __VLS_Props_11 = {
99
+ declare type __VLS_Props_13 = {
68
100
  /**
69
101
  * Owning series id. **Optional** — when omitted, the first visible pie
70
102
  * series is picked.
@@ -78,7 +110,7 @@ declare type __VLS_Props_11 = {
78
110
  position?: PieLegendPosition;
79
111
  };
80
112
 
81
- declare type __VLS_Props_12 = {
113
+ declare type __VLS_Props_14 = {
82
114
  /**
83
115
  * Owning series id. **Optional** — when omitted, the first visible pie
84
116
  * series is picked.
@@ -88,14 +120,14 @@ declare type __VLS_Props_12 = {
88
120
  format?: ValueFormatter;
89
121
  };
90
122
 
91
- declare type __VLS_Props_13 = {
123
+ declare type __VLS_Props_15 = {
92
124
  /** Horizontal line at this Y data value. Mutually exclusive with `time`. */
93
125
  value?: number;
94
126
  /** Vertical line at this `time` (epoch ms or `Date`). Mutually exclusive with `value`. */
95
127
  time?: TimeValue;
96
- /** Line and label-pill color. Default: the theme line color. */
128
+ /** Line and label-chip accent color. Default: the theme line color. */
97
129
  color?: string;
98
- /** Optional text label drawn in a pill at the line's near end. */
130
+ /** Optional text label drawn in an annotation chip at the line's near end. */
99
131
  label?: string;
100
132
  /** Dash style. Default: `'dashed'`. */
101
133
  style?: ReferenceLineStyle;
@@ -103,27 +135,27 @@ declare type __VLS_Props_13 = {
103
135
  width?: number;
104
136
  };
105
137
 
106
- declare type __VLS_Props_14 = {
138
+ declare type __VLS_Props_16 = {
107
139
  /** Desired number of labels (≥ 2). Overrides chart-level `axis.x.labelCount`. */
108
140
  labelCount?: number;
109
141
  /** Minimum pixel gap between adjacent labels (hard floor). Overrides chart-level. */
110
142
  minLabelSpacing?: number;
111
143
  };
112
144
 
113
- declare type __VLS_Props_15 = {
145
+ declare type __VLS_Props_17 = {
114
146
  /** Left edge — epoch ms or a `Date`. */
115
147
  from: TimeValue;
116
148
  /** Right edge — epoch ms or a `Date`. Omit (or pass `'now'`) for an open-ended band to the right edge. */
117
149
  to?: TimeRegionEnd;
118
150
  /** Band fill — any CSS color, typically translucent. Default: a faint tint of `color`. */
119
151
  fill?: string;
120
- /** Optional text label drawn in a pill at the top of the band. */
152
+ /** Optional text label drawn in an annotation chip at the top of the band. */
121
153
  label?: string;
122
- /** Edge-line and label-pill accent. Default: the theme's muted axis text color. */
154
+ /** Edge-line and label-chip accent. Default: the theme's muted axis text color. */
123
155
  color?: string;
124
156
  };
125
157
 
126
- declare type __VLS_Props_16 = {
158
+ declare type __VLS_Props_18 = {
127
159
  /**
128
160
  * @deprecated Use the named `sub` slot instead — it accepts arbitrary
129
161
  * inline markup (icons, badges, formatted text) to mirror React's
@@ -137,12 +169,22 @@ declare type __VLS_Props_16 = {
137
169
  sub?: string;
138
170
  };
139
171
 
140
- declare type __VLS_Props_17 = {
172
+ declare type __VLS_Props_19 = {
141
173
  sort?: SnapshotSort;
142
174
  format?: TooltipFormatter;
143
175
  };
144
176
 
145
- declare type __VLS_Props_18 = {
177
+ declare type __VLS_Props_2 = {
178
+ /** Flat `OHLCInput[]`, or `{ label, data }` to name the stream. */
179
+ data: CandlestickData;
180
+ options?: Partial<CandlestickSeriesOptions>;
181
+ /** Stable series ID — same value across remounts. */
182
+ id?: string;
183
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
184
+ visible?: boolean;
185
+ };
186
+
187
+ declare type __VLS_Props_20 = {
146
188
  /** Custom tick-label formatter. Overrides the built-in range-adaptive default. */
147
189
  format?: ValueFormatter;
148
190
  /**
@@ -154,7 +196,7 @@ declare type __VLS_Props_18 = {
154
196
  minLabelSpacing?: number;
155
197
  };
156
198
 
157
- declare type __VLS_Props_19 = {
199
+ declare type __VLS_Props_21 = {
158
200
  /**
159
201
  * Owning series id. **Optional** — when omitted, the first visible
160
202
  * single-layer time series is picked, falling back to the first visible
@@ -164,18 +206,17 @@ declare type __VLS_Props_19 = {
164
206
  color?: string;
165
207
  /** Custom formatter; routed through NumberFlow's `formatter` so the digit animation still plays. */
166
208
  format?: ValueFormatter;
167
- };
168
-
169
- declare type __VLS_Props_2 = {
170
- /** Flat `OHLCInput[]`, or `{ label, data }` to name the stream. */
171
- data: CandlestickData;
172
- options?: Partial<CandlestickSeriesOptions>;
173
- /** Stable series ID — same value across remounts. */
174
- id?: string;
209
+ /**
210
+ * Badge motion. `true` (default) glides + counts up + fades in with the
211
+ * intro; `false` snaps with no easing; an object tunes individual parts.
212
+ */
213
+ animate?: YLabelAnimate;
175
214
  };
176
215
 
177
216
  declare type __VLS_Props_3 = {
217
+ /** Visual theme. Live — changing this at runtime updates all themed elements. */
178
218
  theme?: ChartTheme;
219
+ /** Grouped axis configuration (Y/X visibility, bounds, sizing). Live. */
179
220
  axis?: AxisConfig;
180
221
  /**
181
222
  * Viewport padding. `top`/`bottom` are in pixels. `left`/`right` accept either pixels (`50`)
@@ -215,16 +256,62 @@ declare type __VLS_Props_3 = {
215
256
  */
216
257
  initialRange?: VisibleRangeSpec;
217
258
  };
218
- /** Show the chart background gradient. Defaults to true. */
259
+ /**
260
+ * Controlled visible range. Same shape as the imperative
261
+ * `chart.setVisibleRange` — a bar count, an explicit `{from, to}` window,
262
+ * or `{from, bars}`. Every reference/value change applies via
263
+ * `chart.setVisibleRange`, so pair it with `onVisibleRangeChange` for a
264
+ * two-way binding; a same-value literal (compared structurally) is a
265
+ * no-op, so an inline object doesn't re-apply on every render.
266
+ *
267
+ * For a one-shot initial window that isn't re-applied on every prop
268
+ * change, use `viewport.initialRange` instead.
269
+ */
270
+ visibleRange?: VisibleRangeSpec;
271
+ /** Show the chart background gradient. Live. Defaults to true. */
219
272
  gradient?: boolean;
220
- /** Enable zoom, pan, and crosshair interactions. Defaults to true. */
273
+ /**
274
+ * Enable zoom, pan, and crosshair interactions. Defaults to true.
275
+ *
276
+ * Mount-only — core has no `setInteractive`, so changing this prop after
277
+ * mount is ignored.
278
+ */
221
279
  interactive?: boolean;
222
- /** Background grid configuration. Default: `{ visible: true }`. */
280
+ /** Background grid configuration. Live. Default: `{ visible: true }`. */
223
281
  grid?: {
224
282
  visible: boolean;
225
283
  };
226
284
  /**
227
- * How `<Title>` and `<InfoBar>` are positioned relative to the canvas.
285
+ * Soft fade-out at the top of the plot area, so series content dissolves
286
+ * under a floating `<Title>` / `<InfoBar>` instead of colliding with it.
287
+ * The mask erases canvas alpha rather than painting a cover color, so it
288
+ * stays correct over the default background gradient. Live.
289
+ *
290
+ * Two directions, independently controlled:
291
+ *
292
+ * **X (under the axis)** — panning content slides under the Y-axis
293
+ * column and dissolves instead of hard-clipping at the pane edge. **On
294
+ * by default** as a 60px ramp that finishes just inside the axis
295
+ * column, before the label glyphs; `{ right }` overrides the total
296
+ * ramp width in CSS px (`0` disables). `{ left }` adds the mirror zone
297
+ * at the left pane edge (default off).
298
+ *
299
+ * **Top (under the header)** — opt-in. `true` enables the auto zone
300
+ * (measured header + 24px run-out, half the header fold-in released so
301
+ * data rides up into the zone at rest), `{ top }` sets the zone height
302
+ * explicitly, and `{ overlap }` tunes how many px of the fold-in to
303
+ * release (0 keeps the strict fold-in). Off unless one of those is set.
304
+ *
305
+ * `false` — every mask off, strict edges everywhere.
306
+ */
307
+ fade?: boolean | {
308
+ top?: number;
309
+ overlap?: number;
310
+ right?: number;
311
+ left?: number;
312
+ };
313
+ /**
314
+ * How `<Title>` and `<InfoBar>` are positioned relative to the canvas. Live.
228
315
  * - `'overlay'` (default): absolute overlays on top of the canvas.
229
316
  * - `'inline'`: flex siblings above the canvas — the canvas (and grid) shift down.
230
317
  */
@@ -235,10 +322,10 @@ declare type __VLS_Props_3 = {
235
322
  * `<CandlestickSeries>` / `<BarSeries>` override these chart-level
236
323
  * defaults unless the category here is explicitly `false`.
237
324
  *
238
- * **Init-only by reference identity.** A new `animations` reference
239
- * recreates the underlying `ChartInstance`. Hoist the object outside
240
- * the render scope — an inline literal tears the chart down on every
241
- * re-render.
325
+ * **Init-only, but diffed by value, not reference.** A same-value
326
+ * inline object literal is a no-op — only a genuine change to the
327
+ * resolved config recreates the underlying `ChartInstance`, since the
328
+ * animation engine doesn't support live reconfiguration yet.
242
329
  */
243
330
  animations?: boolean | AnimationsConfig;
244
331
  /**
@@ -253,56 +340,94 @@ declare type __VLS_Props_3 = {
253
340
  * the prop identity later is ignored.
254
341
  */
255
342
  onEdgeReached?: (info: EdgeReachedInfo) => void;
343
+ /**
344
+ * Fired on a click (or tap) on the chart canvas that isn't the tail end
345
+ * of a pan drag. `info.spatialHit` resolves a pie/heatmap/custom-spatial
346
+ * series directly under the pointer; for a time-series series, resolve
347
+ * the point yourself from `info.time` (`chart.getDataAtTime` /
348
+ * `buildHoverSnapshots`). Live — the latest callback is always used.
349
+ */
350
+ onPointClick?: (info: PointClickInfo) => void;
351
+ /**
352
+ * Fired on a double-click on the chart canvas. The chart also responds
353
+ * by calling `fitContent()`. Live — the latest callback is always used.
354
+ */
355
+ onPointDoubleClick?: (info: PointClickInfo) => void;
356
+ /**
357
+ * Fired when the spatially-hovered series/index changes (pie, heatmap,
358
+ * or a custom spatial kind) — `null` when the pointer leaves every hit
359
+ * area. Live — the latest callback is always used.
360
+ */
361
+ onSeriesHover?: (hit: SeriesHoverInfo | null) => void;
362
+ /**
363
+ * Fired once the underlying `ChartInstance` is constructed — on mount,
364
+ * and again if the chart is ever rebuilt (a genuine `animations` value
365
+ * change). Live — the latest callback is always used for the next rebuild.
366
+ */
367
+ onReady?: (chart: ChartInstance) => void;
368
+ /**
369
+ * Fired whenever the committed visible range changes — pan, zoom,
370
+ * `fitContent()`, a data update that shifts the tail-scroll window, or a
371
+ * `visibleRange` prop change. Live — the latest callback is always used.
372
+ */
373
+ onVisibleRangeChange?: (range: VisibleRange) => void;
374
+ /**
375
+ * Fired on every crosshair move, with `null` when the pointer leaves the
376
+ * chart. Live — the latest callback is always used.
377
+ */
378
+ onCrosshairMove?: (position: CrosshairPosition | null) => void;
256
379
  };
257
380
 
258
381
  declare type __VLS_Props_4 = {
382
+ data: HeatmapCellData[];
383
+ options?: Partial<HeatmapSeriesOptions>;
384
+ /** Stable series ID — same value across remounts. */
385
+ id?: string;
386
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
387
+ visible?: boolean;
388
+ };
389
+
390
+ declare type __VLS_Props_5 = {
259
391
  /** Flat `TimePoint[]`, `TimePoint[][]`, or named `{ label, color?, data }` layers. Time accepts ms or `Date`. */
260
392
  data: MultiLayerData;
261
393
  options?: Partial<LineSeriesOptions>;
262
394
  /** Stable series ID — same value across remounts. */
263
395
  id?: string;
396
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
397
+ visible?: boolean;
264
398
  };
265
399
 
266
- declare type __VLS_Props_5 = {
400
+ declare type __VLS_Props_6 = {
267
401
  data: PieSliceData[];
268
402
  options?: Partial<PieSeriesOptions>;
269
403
  /** Stable series ID — same value across remounts. */
270
404
  id?: string;
405
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
406
+ visible?: boolean;
271
407
  };
272
408
 
273
- declare type __VLS_Props_6 = {
409
+ declare type __VLS_Props_7 = {
410
+ /**
411
+ * Owning series id. **Optional** — when omitted, the first visible heatmap
412
+ * series is picked.
413
+ */
414
+ seriesId?: string;
415
+ /** Custom formatter for the cell value. Default: plain integers, compact decimals. */
416
+ format?: ValueFormatter;
417
+ };
418
+
419
+ declare type __VLS_Props_8 = {
274
420
  sort?: SnapshotSort;
275
421
  format?: TooltipFormatter;
276
422
  };
277
423
 
278
- declare type __VLS_Props_7 = {
424
+ declare type __VLS_Props_9 = {
279
425
  items?: LegendItemOverride[];
280
426
  position?: 'bottom' | 'right';
281
427
  /** `'isolate'` shows only the clicked item; `'solo'` is a @deprecated alias. */
282
428
  mode?: LegendMode;
283
- };
284
-
285
- declare type __VLS_Props_8 = {
286
- /** X anchor — epoch ms or a `Date`. */
287
- time: TimeValue;
288
- /** Y anchor as a data value. Omit and set `seriesId` to snap to that series' value at `time`. */
289
- value?: number;
290
- /** Snap Y to this series' value at `time` when `value` is omitted. Also the default color source. */
291
- seriesId?: string;
292
- /** Glyph at the anchor. Default: `'dot'`. Arrows point their tip at the anchor. */
293
- shape?: MarkerShape;
294
- /** Reuse the line pulse halo around the anchor. Default: `false`. */
295
- pulse?: boolean;
296
- /** Optional text label drawn in a pill next to the anchor. */
297
- label?: string;
298
- /** Color override. Falls back to the series color (when `seriesId` is set), then the theme line color. */
299
- color?: string;
300
- };
301
-
302
- declare type __VLS_Props_9 = {
303
- data: NavigatorData;
304
- /** Strip height in CSS pixels. Defaults to `theme.navigator.height` (60). */
305
- height?: number;
429
+ /** Fired after a click changes series visibility — via the built-in UI or a custom slot calling `item.toggle()`/`isolate()` directly. */
430
+ onToggle?: (info: LegendToggleInfo) => void;
306
431
  };
307
432
 
308
433
  declare function __VLS_template(): {
@@ -452,6 +577,7 @@ declare function __VLS_template_8(): {
452
577
  isLive: boolean;
453
578
  direction: YLabelDirection;
454
579
  format: ValueFormatter;
580
+ opacity: number;
455
581
  }): unknown;
456
582
  }> & {
457
583
  default?(ctx: {
@@ -461,6 +587,7 @@ declare function __VLS_template_8(): {
461
587
  isLive: boolean;
462
588
  direction: YLabelDirection;
463
589
  format: ValueFormatter;
590
+ opacity: number;
464
591
  }): unknown;
465
592
  };
466
593
  refs: {};
@@ -542,7 +669,7 @@ export declare const andromeda: ThemePreset;
542
669
  * - `axis.ticks` — axis tick label cross-fade.
543
670
  * - `toggle` — series visibility (alpha fade + Y re-fit, locked to one
544
671
  * duration so they finish on the same frame).
545
- * - `series.{line,candlestick,bar,pie}` — per-series-type data tweens.
672
+ * - `series.{line,candlestick,bar,pie,heatmap}` — per-series-type data tweens.
546
673
  *
547
674
  * Top-level `false` disables every animation category. `axis: false`
548
675
  * disables both axes and ticks. `axis.y: false` / `axis.x: false` disables
@@ -555,7 +682,7 @@ export declare const andromeda: ThemePreset;
555
682
  * own override; an explicit `series.<type>: false` (or top-level `false`)
556
683
  * is a hard disable that overrides per-series.
557
684
  */
558
- declare interface AnimationsConfig {
685
+ export declare interface AnimationsConfig {
559
686
  /**
560
687
  * Axis-level animation. `false` collapses both axes and ticks to instant.
561
688
  */
@@ -664,6 +791,15 @@ declare interface AnimationsConfig {
664
791
  * @default {@link DEFAULT_LINE_ENTRY}
665
792
  */
666
793
  entry?: AnimationTime;
794
+ /**
795
+ * Initial-load reveal — the line draws itself left-to-right
796
+ * on the first data seed, with a glowing head riding the
797
+ * reveal front. The value is the per-element wave duration;
798
+ * the full sweep lasts ~2×. `false` / `0` disables the intro.
799
+ *
800
+ * @default {@link DEFAULT_LINE_INTRO}
801
+ */
802
+ intro?: AnimationTime;
667
803
  /**
668
804
  * Last-value chase duration on `updateLastPoint`. `false` /
669
805
  * `0` snaps to the target instantly.
@@ -691,6 +827,15 @@ declare interface AnimationsConfig {
691
827
  * @default {@link DEFAULT_CANDLESTICK_ENTRY}
692
828
  */
693
829
  entry?: AnimationTime;
830
+ /**
831
+ * Initial-load reveal — candles unfold in a left-to-right
832
+ * wave on the first data seed. The value is the per-candle
833
+ * wave duration; the full wave lasts ~2×. `false` / `0`
834
+ * disables the intro.
835
+ *
836
+ * @default {@link DEFAULT_CANDLESTICK_INTRO}
837
+ */
838
+ intro?: AnimationTime;
694
839
  /**
695
840
  * Live OHLC chase duration on `updateLastPoint`. `false` / `0`
696
841
  * snaps to the target instantly.
@@ -710,6 +855,15 @@ declare interface AnimationsConfig {
710
855
  * @default {@link DEFAULT_BAR_ENTRY}
711
856
  */
712
857
  entry?: AnimationTime;
858
+ /**
859
+ * Initial-load reveal — bars grow from the baseline in a
860
+ * left-to-right wave on the first data seed. The value is the
861
+ * per-bar wave duration; the full wave lasts ~2×. `false` /
862
+ * `0` disables the intro.
863
+ *
864
+ * @default {@link DEFAULT_BAR_INTRO}
865
+ */
866
+ intro?: AnimationTime;
713
867
  /**
714
868
  * Live value chase duration on `updateLastPoint`. `false` /
715
869
  * `0` snaps to the target instantly.
@@ -719,13 +873,15 @@ declare interface AnimationsConfig {
719
873
  smooth?: AnimationTime;
720
874
  };
721
875
  /**
722
- * Pie segment entry/update tweens. Parsed at config-time; the actual
723
- * wiring lands in a later phase — providing a value here today is a
724
- * no-op but the shape is stable.
876
+ * Pie segment entry/update tweens. `false` disables the slice
877
+ * entry sweep (`update` is still parse-only; wiring lands in a
878
+ * later phase).
725
879
  */
726
880
  pie?: false | {
727
881
  /**
728
- * Slice grow-in duration on first paint.
882
+ * Initial-load reveal — slices unfurl clockwise over this
883
+ * total duration on the first data seed, then the outside
884
+ * labels chain in. `false` / `0` disables the intro.
729
885
  *
730
886
  * @default {@link DEFAULT_PIE_ENTRY}
731
887
  */
@@ -737,6 +893,25 @@ declare interface AnimationsConfig {
737
893
  */
738
894
  update?: AnimationTime;
739
895
  };
896
+ /**
897
+ * Heatmap tweens. `false` disables the entrance wave, value tween,
898
+ * and hover lift.
899
+ */
900
+ heatmap?: false | {
901
+ /**
902
+ * Per-cell entrance duration — the diagonal reveal wave on
903
+ * first paint / grid-shape change.
904
+ *
905
+ * @default {@link DEFAULT_HEATMAP_ENTRY}
906
+ */
907
+ entry?: AnimationTime;
908
+ /**
909
+ * In-place value/color tween and hover-lift ease.
910
+ *
911
+ * @default {@link DEFAULT_HEATMAP_UPDATE}
912
+ */
913
+ update?: AnimationTime;
914
+ };
740
915
  };
741
916
  }
742
917
 
@@ -757,7 +932,7 @@ declare interface AnimationState {
757
932
  * - `string` in `<n>ms` or `<n>s` form (`"250ms"`, `"1s"`, `"2.5s"`)
758
933
  * - `false` — disable (equivalent to `0`)
759
934
  */
760
- declare type AnimationTime = Milliseconds | string | false;
935
+ export declare type AnimationTime = Milliseconds | string | false;
761
936
 
762
937
  /**
763
938
  * Build a 2-stop candle-body gradient around a single hex color — a lightened
@@ -853,6 +1028,21 @@ declare interface AxisTickTrackerOptions {
853
1028
 
854
1029
  export declare const ayuMirage: ThemePreset;
855
1030
 
1031
+ /**
1032
+ * History back-fill: the reveal front sweeps from the data boundary into
1033
+ * the prepended span. Meant for the `historyReveal` option, whose localized
1034
+ * frame interprets clip coordinates in reveal space — `x = 0` at the
1035
+ * boundary, increasing toward the older end, `width` = the prepended span's
1036
+ * bitmap width — so the line reads as plotting itself backwards. The
1037
+ * default `historyReveal` for the line series.
1038
+ */
1039
+ export declare function backfillSweepIntro(): LineIntroFn;
1040
+
1041
+ /** Declarative per-bar transform — translation and opacity only; growth is
1042
+ * expressed through {@link BarIntroDirectives.value} instead so stacked
1043
+ * columns rise as one attached unit. */
1044
+ export declare type BarElementTransform = WaveIntroTransform;
1045
+
856
1046
  /**
857
1047
  * Entrance animation styles for bars.
858
1048
  * - `'none'` — no animation.
@@ -861,7 +1051,7 @@ export declare const ayuMirage: ThemePreset;
861
1051
  * - `'slide'` — translates in from the right with a fade.
862
1052
  * - `'fade-grow'` *(default)* — fade + grow combined.
863
1053
  */
864
- declare type BarEntryAnimation = 'none' | 'fade' | 'grow' | 'slide' | 'fade-grow';
1054
+ export declare type BarEntryAnimation = 'none' | 'fade' | 'grow' | 'slide' | 'fade-grow';
865
1055
 
866
1056
  /** Post-transform bitmap rectangle a bar painter fills. */
867
1057
  declare interface BarGeometry {
@@ -873,6 +1063,57 @@ declare interface BarGeometry {
873
1063
  baselineY: number;
874
1064
  }
875
1065
 
1066
+ /** What one intro frame should look like. */
1067
+ export declare interface BarIntroDirectives {
1068
+ /** Horizontal clip window in bitmap px applied to the whole pass.
1069
+ * Omitted sides default to the pane edges. */
1070
+ clip?: {
1071
+ fromX?: number;
1072
+ toX?: number;
1073
+ };
1074
+ /** Per-value transform applied before geometry and stacking. Scaling the
1075
+ * value grows the bar from the baseline on every render path. */
1076
+ value?: (args: BarIntroValueArgs) => number;
1077
+ /** Per-bar transform applied after the geometry is resolved. */
1078
+ element?: (el: BarIntroElement) => BarElementTransform;
1079
+ }
1080
+
1081
+ /** Arguments handed to {@link BarIntroDirectives.element} per drawn bar. */
1082
+ export declare interface BarIntroElement extends WaveIntroElement {
1083
+ /** Settled left edge in bitmap px. */
1084
+ x: number;
1085
+ /** Settled top edge in bitmap px. */
1086
+ topY: number;
1087
+ /** Settled bar height in bitmap px. */
1088
+ barHeight: number;
1089
+ /** Y the bar grows from — the zero line, or the segment's own base for
1090
+ * stacked bars. */
1091
+ baselineY: number;
1092
+ /** Bar body width in bitmap px. */
1093
+ barWidth: number;
1094
+ }
1095
+
1096
+ /** One frame of bar intro choreography. */
1097
+ export declare type BarIntroFn = (frame: BarIntroFrame) => BarIntroDirectives;
1098
+
1099
+ /** Read view of one bar intro frame. */
1100
+ export declare interface BarIntroFrame extends WaveIntroFrame {
1101
+ /** Time → bitmap X through the live time scale. */
1102
+ timeToX(time: number): number;
1103
+ }
1104
+
1105
+ /** Arguments handed to {@link BarIntroDirectives.value} for every rendered value. */
1106
+ export declare interface BarIntroValueArgs {
1107
+ layerIndex: number;
1108
+ time: number;
1109
+ /** The value the renderer would draw without the intro (live smoothing included). */
1110
+ value: number;
1111
+ /** Normalized x-position across the visible window, clamped to `[0, 1]`. */
1112
+ position: number;
1113
+ /** Eased wave progress for this value, staggered left → right. */
1114
+ progress: number;
1115
+ }
1116
+
876
1117
  /** Arguments handed to a {@link BarPainter} once per bar / stacked segment. */
877
1118
  export declare interface BarPaintArgs {
878
1119
  geom: BarGeometry;
@@ -898,7 +1139,9 @@ export declare interface BarPaintArgs {
898
1139
  /** Paints one bar / stacked segment. Owns its fill — it calls `ctx.fill()`. */
899
1140
  export declare type BarPainter = (env: PaintEnv, args: BarPaintArgs) => void;
900
1141
 
901
- export declare const BarSeries: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1142
+ export declare const BarSeries: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
1143
+ visible: boolean;
1144
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
902
1145
 
903
1146
  /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
904
1147
  * so hosts that never render bars don't bundle this module. */
@@ -938,6 +1181,63 @@ export declare interface BarSeriesOptions {
938
1181
  * @see BarSeriesOptions.entryAnimation
939
1182
  */
940
1183
  entryMs?: number | false;
1184
+ /**
1185
+ * Initial-load intro animation — a `BarIntroFn`, usually one of the
1186
+ * shipped factories: `growIntro()` (the default), `springIntro()`,
1187
+ * `riseIntro()`, `fadeIntro()`, `wipeIntro()`. Independent of
1188
+ * `entryAnimation` — the intro plays once on the first data seed,
1189
+ * streaming entrances keep their own style.
1190
+ *
1191
+ * @see introMs — cross-linked duration for this animation.
1192
+ */
1193
+ introAnimation?: BarIntroFn;
1194
+ /**
1195
+ * Initial-load reveal duration in milliseconds. On the first data seed
1196
+ * (empty → non-empty) bars reveal in a left-to-right wave: each bar
1197
+ * tweens for `introMs`, starts staggered across another `introMs`, so
1198
+ * the full wave lasts ~2×. The visual style is picked by
1199
+ * `introAnimation`. Default: `500`.
1200
+ *
1201
+ * ```
1202
+ * // Per-series override:
1203
+ * <BarSeries options={{ introMs: 800 }} data={data} />
1204
+ *
1205
+ * // Chart-level default:
1206
+ * <ChartContainer animations={{ series: { bar: { intro: 800 } } }}>
1207
+ * <BarSeries data={data} />
1208
+ * </ChartContainer>
1209
+ * ```
1210
+ *
1211
+ * `false` or `0` disables the intro. Bulk re-seeds of a non-empty series
1212
+ * never replay it. Skipped entirely under `prefers-reduced-motion`.
1213
+ */
1214
+ introMs?: number | false;
1215
+ /**
1216
+ * History-prepend reveal — plays when older points land at the front of
1217
+ * the series (the `EdgeLoader` load-more-on-scroll path). A wave sweeps
1218
+ * from the data boundary into the new history; each bar's stagger
1219
+ * position is `0` at the boundary and `1` at the deepest new point, so
1220
+ * intro factories that read `el.progress` (`fadeIntro()` — the default,
1221
+ * `riseIntro()`, `growIntro()`, `springIntro()`) work here unchanged.
1222
+ * Clip directives are interpreted in reveal space: `x = 0` at the
1223
+ * boundary, increasing toward the older end.
1224
+ *
1225
+ * The fn receives a localized frame: `range` is the prepended time span
1226
+ * (not the visible window) and `width` is that span's bitmap width.
1227
+ *
1228
+ * `'none'` disables the reveal — prepended points appear instantly.
1229
+ *
1230
+ * @see historyRevealMs — cross-linked duration for this animation.
1231
+ */
1232
+ historyReveal?: BarIntroFn | 'none';
1233
+ /**
1234
+ * History-prepend reveal duration in milliseconds — the per-bar wave
1235
+ * duration; the full reveal lasts ~2×. Default: `400`. `false` or `0`
1236
+ * disables the reveal. Skipped entirely under `prefers-reduced-motion`.
1237
+ *
1238
+ * @see BarSeriesOptions.historyReveal
1239
+ */
1240
+ historyRevealMs?: number | false;
941
1241
  /**
942
1242
  * How long the displayed bar value takes to catch up to the actual one
943
1243
  * on every `updateLastPoint`. Default: `250` ms.
@@ -995,10 +1295,11 @@ export declare interface BarSeriesOptions {
995
1295
  * Multi-layer renderers (Line, Bar) override them against each internal store.
996
1296
  *
997
1297
  * Time-series data queries are NOT here — they live on {@link TimeSeriesRenderer}
998
- * as required methods, so Chart narrows via `kind !== 'pie'` and calls them
999
- * directly (no optional chaining).
1298
+ * as required methods, so Chart narrows via {@link isTimeSeriesRenderer} and
1299
+ * calls them directly (no optional chaining). Never narrow by comparing `kind`
1300
+ * against a single spatial value — new spatial kinds slip through such guards.
1000
1301
  */
1001
- declare interface BaseSeriesRenderer {
1302
+ export declare interface BaseSeriesRenderer {
1002
1303
  /** Paint the series on the main layer. */
1003
1304
  render(ctx: SeriesRenderContext): void;
1004
1305
  /**
@@ -1008,6 +1309,21 @@ declare interface BaseSeriesRenderer {
1008
1309
  setData(data: unknown, layerIndex?: number): void;
1009
1310
  /** Append a single point (real-time tick). Optional — not all renderers support streaming. */
1010
1311
  appendPoint?(point: unknown, layerIndex?: number): void;
1312
+ /**
1313
+ * Insert older points at the front of the series (history prepend / load-more).
1314
+ * The suffix already on screen is untouched, so — unlike {@link setData} — this
1315
+ * does NOT re-arm the intro, clear entrance/chase state, or force a Y snap.
1316
+ * Optional; not all renderers support it.
1317
+ */
1318
+ prependPoints?(points: unknown[], layerIndex?: number): void;
1319
+ /**
1320
+ * Seed the placeholder shapes a loading indicator was showing at the data
1321
+ * boundary, called by the chart right before the matching
1322
+ * {@link prependPoints}. A history reveal that supports morphing (e.g.
1323
+ * `skeletonMorphIntro`) grows the real elements out of these shapes; a
1324
+ * renderer that doesn't implement this simply plays its plain reveal.
1325
+ */
1326
+ setHistoryHandoff?(bars: PlaceholderBar[]): void;
1011
1327
  /** Replace the last point in place (live candle update). Optional. */
1012
1328
  updateLastPoint?(point: unknown, layerIndex?: number): void;
1013
1329
  /**
@@ -1077,6 +1393,14 @@ declare interface BaseSeriesRenderer {
1077
1393
  value: number;
1078
1394
  isLive: boolean;
1079
1395
  } | null;
1396
+ /**
1397
+ * Stacked value at an arbitrary `time` — the cumulative stack top at that
1398
+ * sample, mirroring {@link getStackedLastValue} but anywhere in the window
1399
+ * (used for the YLabel intro count-up start so it shares the stack basis).
1400
+ * Single-layer renderers return the nearest sample's value; `null` when no
1401
+ * layer has a sample near `time`.
1402
+ */
1403
+ getStackedValueAtTime?(time: number, interval: number): number | null;
1080
1404
  /**
1081
1405
  * Per-layer last snapshots, each with its own `time`. Useful for ragged
1082
1406
  * multi-layer series where layers advance independently — last-mode
@@ -1124,6 +1448,13 @@ declare interface BaseSeriesRenderer {
1124
1448
  getLayerAlpha?(index: number): number;
1125
1449
  /** True while the renderer has an active animation (Chart polls per frame). */
1126
1450
  readonly needsAnimation?: boolean;
1451
+ /**
1452
+ * Reveal-front position in `[0, 1]` of the initial-load intro across the
1453
+ * visible window — `1` once settled (or when the renderer has no intro).
1454
+ * Overlays (the Y-label badge, annotations) key their own entrance off this
1455
+ * so they reveal in step with the series draw. Omitted → treated as `1`.
1456
+ */
1457
+ getIntroFront?(): number;
1127
1458
  /**
1128
1459
  * Optional overlay hook. Chart invokes this during the overlay pass so each
1129
1460
  * renderer can paint type-specific overlays (crosshair dots, pulse dots).
@@ -1146,7 +1477,7 @@ declare interface BaseSeriesRenderer {
1146
1477
  dispose(): void;
1147
1478
  }
1148
1479
 
1149
- declare interface BitmapCoordinateSpace {
1480
+ export declare interface BitmapCoordinateSpace {
1150
1481
  context: CanvasRenderingContext2D;
1151
1482
  bitmapSize: {
1152
1483
  width: number;
@@ -1204,6 +1535,24 @@ export declare interface BuildLastSnapshotsArgs {
1204
1535
  cacheKey: string;
1205
1536
  }
1206
1537
 
1538
+ /** What one element should look like this frame. Every field is optional —
1539
+ * an empty object renders the element settled. */
1540
+ export declare interface CandleElementTransform extends WaveIntroTransform {
1541
+ /** Lerp factor from `anchorY` toward the settled edges: `0` = collapsed
1542
+ * at the anchor, `1` = settled. Applied before the offsets. */
1543
+ unfold?: number;
1544
+ /** Absolute top edge override in bitmap px — replaces the `unfold` math
1545
+ * for this frame (the offsets still apply). Lets a morph start from
1546
+ * arbitrary geometry instead of the anchor. */
1547
+ topY?: number;
1548
+ /** Absolute bottom edge override in bitmap px — see {@link topY}. */
1549
+ bottomY?: number;
1550
+ /** Blend of the element's fill toward the theme's muted placeholder gray
1551
+ * (the axis text color): `0` = the candle's own color, `1` = fully
1552
+ * placeholder-colored. Volume bars ignore it. */
1553
+ tint?: number;
1554
+ }
1555
+
1207
1556
  /** Post-transform bitmap rectangle a candle-body painter fills. */
1208
1557
  declare interface CandleGeometry {
1209
1558
  x: number;
@@ -1212,6 +1561,51 @@ declare interface CandleGeometry {
1212
1561
  height: number;
1213
1562
  }
1214
1563
 
1564
+ /** What one intro frame should look like. */
1565
+ export declare interface CandleIntroDirectives {
1566
+ /** Horizontal clip window in bitmap px applied to the whole pass (volume
1567
+ * band included). Omitted sides default to the pane edges. */
1568
+ clip?: {
1569
+ fromX?: number;
1570
+ toX?: number;
1571
+ };
1572
+ /** Per-element transform — called for every wick, body, and volume bar. */
1573
+ element?: (el: CandleIntroElement) => CandleElementTransform;
1574
+ }
1575
+
1576
+ /** Arguments handed to {@link CandleIntroDirectives.element} per element. */
1577
+ export declare interface CandleIntroElement extends WaveIntroElement {
1578
+ /** Which candle element is being transformed. */
1579
+ element: 'wick' | 'body' | 'volume';
1580
+ /** Settled left edge in bitmap px. */
1581
+ x: number;
1582
+ /** Settled top edge in bitmap px. */
1583
+ topY: number;
1584
+ /** Settled bottom edge in bitmap px. */
1585
+ bottomY: number;
1586
+ /** Y the element unfolds around — the open price for wick/body, the band
1587
+ * baseline for volume. */
1588
+ anchorY: number;
1589
+ /** Element width in bitmap px. */
1590
+ barWidth: number;
1591
+ }
1592
+
1593
+ /** One frame of candlestick intro choreography. */
1594
+ export declare type CandleIntroFn = (frame: CandleIntroFrame) => CandleIntroDirectives;
1595
+
1596
+ /** Read view of one candlestick intro frame. */
1597
+ export declare interface CandleIntroFrame extends WaveIntroFrame {
1598
+ /** Time → bitmap X through the live time scale. */
1599
+ timeToX(time: number): number;
1600
+ /**
1601
+ * Placeholder shapes the loading indicator was showing when this history
1602
+ * reveal armed — present only on a history-reveal frame that followed a
1603
+ * loading-indicator hand-off (see `skeletonMorphIntro`). Absent on
1604
+ * initial-load intro frames and on reveals with no hand-off.
1605
+ */
1606
+ placeholders?: readonly MorphPlaceholder[];
1607
+ }
1608
+
1215
1609
  /** Arguments handed to a {@link CandlePainter} once per candle body. */
1216
1610
  export declare interface CandlePaintArgs {
1217
1611
  geom: CandleGeometry;
@@ -1265,9 +1659,11 @@ declare interface CandlestickDirectionColors {
1265
1659
  * - `'fade-unfold'` *(default)* — fade + unfold combined; the default because a lone fade is
1266
1660
  * hard to notice in streaming demos, while the body-unfold gives a clear visual anchor.
1267
1661
  */
1268
- declare type CandlestickEntryAnimation = 'none' | 'fade' | 'unfold' | 'slide' | 'fade-unfold';
1662
+ export declare type CandlestickEntryAnimation = 'none' | 'fade' | 'unfold' | 'slide' | 'fade-unfold';
1269
1663
 
1270
- export declare const CandlestickSeries: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1664
+ export declare const CandlestickSeries: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{}>, {
1665
+ visible: boolean;
1666
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1271
1667
 
1272
1668
  /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
1273
1669
  * so hosts that never render candles don't bundle this module. */
@@ -1310,6 +1706,63 @@ export declare interface CandlestickSeriesOptions {
1310
1706
  * @see CandlestickSeriesOptions.entryAnimation
1311
1707
  */
1312
1708
  entryMs?: number | false;
1709
+ /**
1710
+ * Initial-load intro animation — a `CandleIntroFn`, usually one of the
1711
+ * shipped factories: `candleUnfoldIntro()` (the default),
1712
+ * `wickBodyIntro()`, `riseIntro()`, `fadeIntro()`. Independent of
1713
+ * `entryAnimation` — the intro plays once on the first data seed,
1714
+ * streaming entrances keep their own style.
1715
+ *
1716
+ * @see introMs — cross-linked duration for this animation.
1717
+ */
1718
+ introAnimation?: CandleIntroFn;
1719
+ /**
1720
+ * Initial-load reveal duration in milliseconds. On the first data seed
1721
+ * (empty → non-empty) candles reveal in a left-to-right wave: each candle
1722
+ * tweens for `introMs`, starts staggered across another `introMs`, so the
1723
+ * full wave lasts ~2×. The visual style is picked by `introAnimation`.
1724
+ * Default: `500`.
1725
+ *
1726
+ * ```
1727
+ * // Per-series override:
1728
+ * <CandlestickSeries options={{ introMs: 800 }} data={data} />
1729
+ *
1730
+ * // Chart-level default:
1731
+ * <ChartContainer animations={{ series: { candlestick: { intro: 800 } } }}>
1732
+ * <CandlestickSeries data={data} />
1733
+ * </ChartContainer>
1734
+ * ```
1735
+ *
1736
+ * `false` or `0` disables the intro. Bulk re-seeds of a non-empty series
1737
+ * never replay it. Skipped entirely under `prefers-reduced-motion`.
1738
+ */
1739
+ introMs?: number | false;
1740
+ /**
1741
+ * History-prepend reveal — plays when older points land at the front of
1742
+ * the series (the `EdgeLoader` load-more-on-scroll path). A wave sweeps
1743
+ * from the data boundary into the new history; each candle's stagger
1744
+ * position is `0` at the boundary and `1` at the deepest new point, so
1745
+ * intro factories that read `el.progress` (`fadeIntro()` — the default,
1746
+ * `riseIntro()`, `candleUnfoldIntro()`, `wickBodyIntro()`) work here
1747
+ * unchanged. Clip directives are interpreted in reveal space: `x = 0` at
1748
+ * the boundary, increasing toward the older end.
1749
+ *
1750
+ * The fn receives a localized frame: `range` is the prepended time span
1751
+ * (not the visible window) and `width` is that span's bitmap width.
1752
+ *
1753
+ * `'none'` disables the reveal — prepended points appear instantly.
1754
+ *
1755
+ * @see historyRevealMs — cross-linked duration for this animation.
1756
+ */
1757
+ historyReveal?: CandleIntroFn | 'none';
1758
+ /**
1759
+ * History-prepend reveal duration in milliseconds — the per-candle wave
1760
+ * duration; the full reveal lasts ~2×. Default: `400`. `false` or `0`
1761
+ * disables the reveal. Skipped entirely under `prefers-reduced-motion`.
1762
+ *
1763
+ * @see CandlestickSeriesOptions.historyReveal
1764
+ */
1765
+ historyRevealMs?: number | false;
1313
1766
  /**
1314
1767
  * How long the displayed OHLC takes to catch up to the actual last value
1315
1768
  * on every `updateLastPoint`. Default: `250` ms.
@@ -1349,13 +1802,36 @@ export declare interface CandlestickSeriesOptions {
1349
1802
  candlePainter?: CandlePainter;
1350
1803
  }
1351
1804
 
1805
+ /** Each candle unfolds from its open price in a left-to-right wave — the
1806
+ * default intro. Alpha rides the same progress as the unfold so a candle
1807
+ * still waiting for the wave front stays invisible instead of painting as
1808
+ * a flat, min-height line at its open price. */
1809
+ export declare function candleUnfoldIntro(): CandleIntroFn;
1810
+
1352
1811
  export declare const catppuccin: ThemePreset;
1353
1812
 
1813
+ /**
1814
+ * Center-out reveal: the clip window opens from the pane's horizontal
1815
+ * center outward, a glowing head riding each front.
1816
+ */
1817
+ export declare function centerOutIntro(): LineIntroFn;
1818
+
1354
1819
  export declare const ChartContainer: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
1355
1820
 
1356
1821
  /** Events emitted by {@link ChartInstance}. */
1357
1822
  declare interface ChartEvents {
1358
1823
  crosshairMove: (pos: CrosshairPosition | null) => void;
1824
+ /** Fired on a click (or tap) on the chart canvas that isn't the tail end of a pan drag. */
1825
+ pointClick: (info: PointClickInfo) => void;
1826
+ /** Fired on a double-click on the chart canvas. Chart also responds by calling `fitContent()`. */
1827
+ pointDoubleClick: (info: PointClickInfo) => void;
1828
+ /**
1829
+ * Fired when the spatially-hovered series/index changes (pie, heatmap, or
1830
+ * a custom spatial kind) — `null` when the pointer leaves every hit area.
1831
+ * Time-series series have no pixel geometry to hover this way; read
1832
+ * `crosshairMove` + `getDataAtTime`/`buildHoverSnapshots` for those.
1833
+ */
1834
+ seriesHover: (hit: SeriesHoverInfo | null) => void;
1359
1835
  viewportChange: () => void;
1360
1836
  dataUpdate: () => void;
1361
1837
  seriesChange: () => void;
@@ -1422,6 +1898,10 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1422
1898
  id?: string;
1423
1899
  label?: string;
1424
1900
  }>): string;
1901
+ addSeries(type: 'heatmap', options?: Partial<HeatmapSeriesOptions & {
1902
+ id?: string;
1903
+ label?: string;
1904
+ }>): string;
1425
1905
  addSeries<O>(def: SeriesDefinition<O>, options?: Partial<O> & {
1426
1906
  layers?: number;
1427
1907
  id?: string;
@@ -1488,6 +1968,14 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1488
1968
  * underlying animator mutates between frames.
1489
1969
  */
1490
1970
  getAnimationState(): AnimationState;
1971
+ /**
1972
+ * Reveal-front position in `[0, 1]` of any in-flight initial-load intro.
1973
+ * With a `seriesId`, that series' own front; without, the minimum across
1974
+ * every visible time series — overlays wait for the slowest reveal. `1`
1975
+ * whenever nothing is introing. Overlay components (the Y-label badge,
1976
+ * annotations) read this to reveal their entrance in step with the draw.
1977
+ */
1978
+ getIntroFront(seriesId?: string): number;
1491
1979
  /**
1492
1980
  * Replace all data for a series.
1493
1981
  *
@@ -1500,6 +1988,20 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1500
1988
  setSeriesData(id: string, data: unknown, layerIndex?: number): void;
1501
1989
  /** Append a new data point to the end of a series (real-time tick). */
1502
1990
  appendData(id: string, point: OHLCInput | TimePointInput, layerIndex?: number): void;
1991
+ /**
1992
+ * Prepend older points to the front of a series — the "load more history on
1993
+ * scroll" path. Unlike {@link setSeriesData}, this deliberately does NOT set
1994
+ * `#dataReplaceSnapPending`: the visible window and the data inside it don't
1995
+ * change, so the viewport must stay put (X) and the Y axis eases if newly
1996
+ * revealed history shifts the range — instead of the full-span re-fit and
1997
+ * instant dual-axis snap a bulk `setSeriesData` replace would force. Routes
1998
+ * through the streaming `onPointAppended` engine signal via `onDataChanged`.
1999
+ *
2000
+ * `points` must be sorted ascending and sit strictly before the current
2001
+ * first point; the sync reconciler guarantees this before calling here.
2002
+ * No-op if the renderer doesn't support prepend.
2003
+ */
2004
+ prependData(id: string, points: (OHLCInput | TimePointInput)[], layerIndex?: number): void;
1503
2005
  /** Update the last data point of a series in place (e.g. live candle update). */
1504
2006
  updateData(id: string, point: OHLCInput | TimePointInput, layerIndex?: number): void;
1505
2007
  /**
@@ -1517,7 +2019,7 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1517
2019
  */
1518
2020
  keepLast(id: string, count: number, layerIndex?: number): void;
1519
2021
  /** Update visual options (color, width, etc.) for an existing series. */
1520
- updateSeriesOptions(id: string, options: Partial<CandlestickSeriesOptions> | Partial<LineSeriesOptions> | Partial<BarSeriesOptions> | Partial<PieSeriesOptions>): void;
2022
+ updateSeriesOptions(id: string, options: Partial<CandlestickSeriesOptions> | Partial<LineSeriesOptions> | Partial<BarSeriesOptions> | Partial<PieSeriesOptions> | Partial<HeatmapSeriesOptions>): void;
1521
2023
  /**
1522
2024
  * Batch multiple updates: suppress recomputes until `fn` returns. Exceptions
1523
2025
  * inside `fn` still flush the batch so counters don't leak across calls.
@@ -1651,15 +2153,24 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1651
2153
  }[] | null;
1652
2154
  getSeriesIds(): string[];
1653
2155
  /**
1654
- * Filter `getSeriesIds()` by renderer type. `'pie'` returns pie series,
1655
- * `'time'` returns line/bar/candlestick.
2156
+ * Whether pan/zoom gestures currently apply — true when any visible series
2157
+ * has a time axis. Part of the {@link PanZoomTarget} surface: on a
2158
+ * spatial-only chart (pie, heatmap) the interaction layer stops capturing
2159
+ * wheel and touch events, so the page scrolls normally under the cursor.
2160
+ */
2161
+ canPanZoom(): boolean;
2162
+ /**
2163
+ * Filter `getSeriesIds()` by renderer type. A concrete kind (`'pie'`,
2164
+ * `'heatmap'`, a custom kind, …) returns series of that exact kind;
2165
+ * `'time'` returns every time-axis series (line/bar/candlestick and any
2166
+ * custom time-series kind).
1656
2167
  *
1657
2168
  * - `opts.visibleOnly` — exclude series with `isSeriesVisible=false`; for
1658
2169
  * multi-layer series also exclude when every layer is hidden.
1659
2170
  * - `opts.singleLayerOnly` — exclude series with more than one layer.
1660
2171
  * Useful for YLabel fallback priority (stick to a single line first).
1661
2172
  */
1662
- getSeriesIdsByType(type: 'pie' | 'time', opts?: {
2173
+ getSeriesIdsByType(type: SeriesKind | 'time', opts?: {
1663
2174
  visibleOnly?: boolean;
1664
2175
  singleLayerOnly?: boolean;
1665
2176
  }): string[];
@@ -1673,6 +2184,14 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1673
2184
  value: number;
1674
2185
  isLive: boolean;
1675
2186
  } | null;
2187
+ /**
2188
+ * Stacked value at an arbitrary `time` — the cumulative stack top at that
2189
+ * sample, sharing a basis with {@link getStackedLastValue}. Falls back to the
2190
+ * nearest raw sample (close / value) for renderers without a stacked concept
2191
+ * (Candlestick, single-layer Line/Bar). Returns `null` for unknown ids or
2192
+ * when no sample sits near `time`. Used by the YLabel intro count-up start.
2193
+ */
2194
+ getStackedValueAtTime(seriesId: string, time: number): number | null;
1676
2195
  /**
1677
2196
  * Per-layer last snapshots with each layer's own `time`. Returns `null`
1678
2197
  * for single-layer renderers or when no visible layer has data. Used by
@@ -1717,6 +2236,12 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1717
2236
  /** Apply a new theme and update series colors where appropriate. */
1718
2237
  setTheme(theme: ChartTheme): void;
1719
2238
  getTheme(): ChartTheme;
2239
+ /** BCP 47 locale applied to the built-in time-axis / tooltip / crosshair formatting. */
2240
+ setLocale(locale: string | undefined): void;
2241
+ getLocale(): string | undefined;
2242
+ /** IANA timezone applied to the same built-in date-time formatting. */
2243
+ setTimeZone(timeZone: string | undefined): void;
2244
+ getTimeZone(): string | undefined;
1720
2245
  /** Update axis configuration and re-render. */
1721
2246
  setAxis(config: AxisConfig): void;
1722
2247
  /**
@@ -1751,6 +2276,14 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1751
2276
  setGrid(grid: {
1752
2277
  visible: boolean;
1753
2278
  }): void;
2279
+ /**
2280
+ * Set or clear the edge fade masks (see {@link ChartOptions.fade}).
2281
+ * Content the main layer draws inside a zone dissolves toward that edge.
2282
+ * `right` omitted re-arms its default (track the Y-axis width); pass
2283
+ * `{ top: 0, right: 0, left: 0 }` to turn every mask off. Takes effect on
2284
+ * the next render frame.
2285
+ */
2286
+ setFade(fade: ChartOptions['fade']): void;
1754
2287
  /**
1755
2288
  * Set the visual state for one side of the chart. Typically called in
1756
2289
  * response to the `onEdgeReached` callback:
@@ -1764,7 +2297,14 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1764
2297
  /** Read the current host-declared state for a given edge. */
1765
2298
  getEdgeState(side: EdgeSide): EdgeState;
1766
2299
  /**
1767
- * Notify chart that a YLabel overlay is mounted / unmounted. Currently a
2300
+ * Swap the painter used for a side's `loading` spinner — the same
2301
+ * pluggable-function contract as the series intro animations. `null`
2302
+ * (default) falls back to the built-in three-dot spinner. Takes effect
2303
+ * immediately if that side is currently in the `loading` state.
2304
+ */
2305
+ setEdgeIndicator(side: EdgeSide, indicator: LoadingIndicatorFn | null): void;
2306
+ /**
2307
+ * Notify chart that a YLabel overlay is mounted / unmounted. Currently a
1768
2308
  * no-op — placeholder for the right-padding reflow that will adjust the
1769
2309
  * chart area to make room for the badge.
1770
2310
  * TODO: implement reflow.
@@ -1867,10 +2407,35 @@ export declare interface ChartOptions {
1867
2407
  };
1868
2408
  /** Enable zoom, pan, and crosshair interactions. Defaults to true. */
1869
2409
  interactive?: boolean;
2410
+ /**
2411
+ * BCP 47 locale applied to the built-in time-axis / tooltip / crosshair
2412
+ * date-time formatting (e.g. `'de-DE'`). Default: `'en-US'`. Live —
2413
+ * `chart.setLocale()` updates it after construction. Ignored for a series
2414
+ * that installs a custom formatter via `chart.timeScale.setFormat()`.
2415
+ */
2416
+ locale?: string;
2417
+ /**
2418
+ * IANA timezone applied to the same built-in date-time formatting (e.g.
2419
+ * `'America/New_York'`). Default: the browser's local timezone. Live —
2420
+ * `chart.setTimeZone()` updates it after construction.
2421
+ */
2422
+ timeZone?: string;
1870
2423
  /** Background grid configuration. Default: `{ visible: true }`. */
1871
2424
  grid?: {
1872
2425
  visible: boolean;
1873
2426
  };
2427
+ /**
2428
+ * Soft alpha fade applied at the edges of the plot area. Anything the main
2429
+ * layer draws inside a zone (series, grid, time-region bands) dissolves to
2430
+ * transparent as it approaches the edge: horizontally sliding under the
2431
+ * Y-axis labels on the right (`right`, **on by default**), toward a
2432
+ * floating Title / InfoBar at the top (`top`), or out the left edge
2433
+ * (`left`). The mask *erases* pixels rather than painting a cover color,
2434
+ * so it stays correct over any container background — including the
2435
+ * default CSS gradient. Live — `chart.setFade()` updates it after
2436
+ * construction.
2437
+ */
2438
+ fade?: FadeConfig;
1874
2439
  /**
1875
2440
  * Animation control. Grouped as `axis: { y, x, ticks }` (axis-side
1876
2441
  * behaviour), `toggle` (series visibility — alpha + Y refit), and
@@ -1993,6 +2558,20 @@ export declare interface ChartTheme {
1993
2558
  */
1994
2559
  otherColor: string;
1995
2560
  };
2561
+ /**
2562
+ * Heatmap sequential ramp. Optional so hand-built theme literals keep
2563
+ * compiling — the renderer falls back to a ramp derived from
2564
+ * {@link ChartTheme.line} `color` and the background at render time.
2565
+ */
2566
+ heatmap?: {
2567
+ /**
2568
+ * Ramp stops, low → high, interpolated perceptually. {@link createTheme}
2569
+ * derives a two-stop single-hue ramp: a faint accent wash near the
2570
+ * surface up to the full accent — which flips anchor automatically with
2571
+ * theme polarity (low values sink into the background in both modes).
2572
+ */
2573
+ colors: string[];
2574
+ };
1996
2575
  /** Bollinger band / envelope fill colors. */
1997
2576
  bands: {
1998
2577
  /** Fill for the upper band region (above the middle band). */
@@ -2163,12 +2742,38 @@ export declare interface CrosshairPosition {
2163
2742
  /** Path-shape selector for {@link tracePath}. */
2164
2743
  export declare type CurveKind = 'straight' | 'smooth' | 'stepped';
2165
2744
 
2745
+ /**
2746
+ * A custom spatial renderer with no time axis — implement this (rather than
2747
+ * {@link PieSeriesRenderer} / {@link HeatmapSeriesRenderer}, which are reserved
2748
+ * for the built-ins) when writing a new non-time-axis series from scratch,
2749
+ * e.g. a radar or treemap chart. Pick any `kind` that isn't a built-in one.
2750
+ */
2751
+ export declare interface CustomSpatialSeriesRenderer extends BaseSeriesRenderer {
2752
+ readonly kind: string;
2753
+ }
2754
+
2755
+ /**
2756
+ * Structural equality for plain option bags that may carry function-valued
2757
+ * fields (e.g. `AnimationsConfig.axis.y.curve`, a transition factory).
2758
+ * Functions (and any other non-plain value) compare by reference — only
2759
+ * arrays and plain objects recurse. Used to tell a caller's brand-new inline
2760
+ * object literal (same values, new reference) apart from a genuine option
2761
+ * change, so wrappers can skip an expensive rebuild in the former case.
2762
+ */
2763
+ export declare function deepEqual(a: unknown, b: unknown): boolean;
2764
+
2765
+ declare const _default: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
2766
+ containerRef: HTMLDivElement;
2767
+ }, HTMLDivElement>;
2768
+ export { _default as TimeAxis }
2769
+ export { _default as XAxis }
2770
+
2166
2771
  export declare function detectInterval(times: number[]): number;
2167
2772
 
2168
2773
  export declare const dracula: ThemePreset;
2169
2774
 
2170
2775
  /** Payload for {@link ChartOptions.onEdgeReached}. */
2171
- declare interface EdgeReachedInfo {
2776
+ export declare interface EdgeReachedInfo {
2172
2777
  side: EdgeSide;
2173
2778
  /** Time units the user pulled past the soft bound. */
2174
2779
  overshoot: number;
@@ -2177,7 +2782,9 @@ declare interface EdgeReachedInfo {
2177
2782
  }
2178
2783
 
2179
2784
  /** Which data side the user pulled past during a gesture. */
2180
- declare type EdgeSide = 'left' | 'right';
2785
+ export declare type EdgeSide = 'left' | 'right';
2786
+
2787
+ declare type EdgeSide_2 = 'left' | 'right';
2181
2788
 
2182
2789
  /**
2183
2790
  * Host-controlled visual state for a chart edge:
@@ -2186,7 +2793,7 @@ declare type EdgeSide = 'left' | 'right';
2186
2793
  * - `no-data`: a dashed boundary line + "No more data" label appears at the data edge.
2187
2794
  * - `has-more`: reserved — currently behaves like `idle`. Use when more data exists but is not being fetched.
2188
2795
  */
2189
- declare type EdgeState = 'idle' | 'loading' | 'no-data' | 'has-more';
2796
+ export declare type EdgeState = 'idle' | 'loading' | 'no-data' | 'has-more';
2190
2797
 
2191
2798
  declare class EventEmitter<Events = Record<string, Listener>> {
2192
2799
  private listeners;
@@ -2196,6 +2803,33 @@ declare class EventEmitter<Events = Record<string, Listener>> {
2196
2803
  removeAllListeners(): void;
2197
2804
  }
2198
2805
 
2806
+ /** Shape of {@link ChartOptions.fade}. */
2807
+ declare interface FadeConfig {
2808
+ /** Fade-zone height in CSS pixels, measured down from the top of the plot
2809
+ * area. `0` / omitted disables the mask. */
2810
+ top?: number;
2811
+ /**
2812
+ * Total width in CSS pixels of the horizontal dissolve at the right edge.
2813
+ * The ramp finishes just inside the Y-axis column — 12px past the pane
2814
+ * edge, before the right-anchored label glyphs start — so content melts
2815
+ * on approach (pan / tail-scroll exit) and is fully gone before it can
2816
+ * cross any axis text; the rest of the width runs backward into the pane
2817
+ * as a soft lead-in. **Defaults to a 60px ramp** — on out of the box;
2818
+ * `0` disables. A no-op while the Y axis is hidden.
2819
+ */
2820
+ right?: number;
2821
+ /** Fade-zone width in CSS pixels at the left pane edge — content panning
2822
+ * out to the left dissolves instead of hard-clipping at the canvas
2823
+ * boundary. `0` / omitted disables. */
2824
+ left?: number;
2825
+ }
2826
+
2827
+ /**
2828
+ * Plain staggered fade-in, no geometry motion. Works for both bar and
2829
+ * candlestick series.
2830
+ */
2831
+ export declare function fadeIntro(): WaveIntroFn;
2832
+
2199
2833
  /**
2200
2834
  * Fill a rounded rectangle with per-corner masking, using manual `arcTo` so the
2201
2835
  * output is deterministic and independent of `CanvasRenderingContext2D.roundRect`
@@ -2218,7 +2852,7 @@ export declare function formatCompact(v: number, opts?: {
2218
2852
  decimals?: number;
2219
2853
  }): string;
2220
2854
 
2221
- export declare function formatDate(timestamp: number): string;
2855
+ export declare function formatDate(timestamp: number, opts?: TimeFormatOptions): string;
2222
2856
 
2223
2857
  /**
2224
2858
  * Full-precision display that adapts decimal count to the value's magnitude.
@@ -2227,7 +2861,7 @@ export declare function formatDate(timestamp: number): string;
2227
2861
  */
2228
2862
  export declare function formatPriceAdaptive(v: number): string;
2229
2863
 
2230
- export declare function formatTime(timestamp: number, interval: number): string;
2864
+ export declare function formatTime(timestamp: number, interval: number, opts?: TimeFormatOptions): string;
2231
2865
 
2232
2866
  declare type FrameKind = 'main' | 'overlay';
2233
2867
 
@@ -2242,10 +2876,103 @@ declare interface FrameTimingSample {
2242
2876
 
2243
2877
  export declare const githubLight: ThemePreset;
2244
2878
 
2879
+ /** Bars fade-grow up from the baseline in a left-to-right wave — the
2880
+ * default intro. */
2881
+ export declare function growIntro(): BarIntroFn;
2882
+
2245
2883
  export declare const gruvbox: ThemePreset;
2246
2884
 
2247
2885
  export declare const handwritten: ThemePreset;
2248
2886
 
2887
+ /** One cell of a heatmap matrix — a (column, row) coordinate with a magnitude. */
2888
+ export declare interface HeatmapCellData {
2889
+ /** Column key. Column order follows first appearance unless {@link HeatmapSeriesOptions.columns} pins it. */
2890
+ x: string;
2891
+ /** Row key. Row order follows first appearance unless {@link HeatmapSeriesOptions.rows} pins it. */
2892
+ y: string;
2893
+ /** Magnitude mapped onto the sequential color ramp. */
2894
+ value: number;
2895
+ /** Explicit fill override for this cell. Skips the ramp entirely. */
2896
+ color?: string;
2897
+ }
2898
+
2899
+ /** Per-cell value labels drawn inside heatmap cells. */
2900
+ export declare interface HeatmapCellLabelsOptions {
2901
+ /** Font size in CSS pixels. Default: 10. */
2902
+ fontSize?: number;
2903
+ /**
2904
+ * Value formatter. Default: decimals adapt to the value domain — 2 for
2905
+ * unit-scale domains (correlations), integers for wide ones, compact
2906
+ * notation (`1.2K`) past 1000.
2907
+ */
2908
+ format?: (value: number) => string;
2909
+ }
2910
+
2911
+ export declare const HeatmapSeries: DefineComponent<__VLS_Props_4, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_4> & Readonly<{}>, {
2912
+ visible: boolean;
2913
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2914
+
2915
+ /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
2916
+ * so hosts that never render heatmaps don't bundle this module. */
2917
+ export declare const HeatmapSeriesDef: SeriesDefinition<HeatmapSeriesOptions>;
2918
+
2919
+ /** Visual options for a heatmap series. */
2920
+ export declare interface HeatmapSeriesOptions {
2921
+ /**
2922
+ * Sequential ramp stops, low → high, interpolated perceptually (OKLab).
2923
+ * Two stops give a classic single-hue ramp; three make a diverging scale.
2924
+ * Default: derived from the theme — a faint wash of the accent color near
2925
+ * the surface up to the full accent (`theme.heatmap.colors` when present).
2926
+ */
2927
+ colors?: string[];
2928
+ /** Domain minimum mapped to the first ramp stop. Default: the data minimum. */
2929
+ min?: number;
2930
+ /** Domain maximum mapped to the last ramp stop. Default: the data maximum. */
2931
+ max?: number;
2932
+ /** Surface gap between adjacent cells in CSS pixels. Default: 2. */
2933
+ gap?: number;
2934
+ /** Cell corner radius in CSS pixels. Default: 3. */
2935
+ cornerRadius?: number;
2936
+ /** Draw row labels (left) and column labels (bottom). Default: true. */
2937
+ axisLabels?: boolean;
2938
+ /** Draw the value inside each cell (auto-skipped when it doesn't fit). Default: false. */
2939
+ cellLabels?: boolean | HeatmapCellLabelsOptions;
2940
+ /** Explicit column order. Keys absent from the data render as empty columns. */
2941
+ columns?: string[];
2942
+ /** Explicit row order. Keys absent from the data render as empty rows. */
2943
+ rows?: string[];
2944
+ /**
2945
+ * Entrance duration per cell in milliseconds — the diagonal reveal wave on
2946
+ * first paint / grid-shape change. `0` paints instantly.
2947
+ * Default: chart animation config (600).
2948
+ */
2949
+ entryMs?: number;
2950
+ /**
2951
+ * Value/color tween duration when a cell's value changes in place, and the
2952
+ * hover-lift ease. `0` snaps. Default: chart animation config (300).
2953
+ */
2954
+ updateMs?: number;
2955
+ }
2956
+
2957
+ /** A spatial matrix renderer with no time axis (Heatmap). Has no time-series queries. */
2958
+ export declare interface HeatmapSeriesRenderer extends BaseSeriesRenderer {
2959
+ readonly kind: 'heatmap';
2960
+ }
2961
+
2962
+ export declare const HeatmapTooltip: DefineComponent<__VLS_Props_7, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_7> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2963
+
2964
+ /**
2965
+ * Velocity-matched cubic Hermite Y transition. Direction-aware: per-call
2966
+ * `expandMs` (outward, default 250 ms via the engine) and `contractMs`
2967
+ * (inward, default 2500 ms — sticky-Y) are supplied through `retarget()`.
2968
+ *
2969
+ * Default Y transition. Bounded duration — after the supplied settle each
2970
+ * side lands exactly at the target with zero velocity, unlike spring's
2971
+ * asymptotic approach. Predictable for animations whose end-state matters
2972
+ * (axis labels can settle in a known time).
2973
+ */
2974
+ export declare function hermite(): TransitionFactory<YRange>;
2975
+
2249
2976
  export declare const highContrast: ThemePreset;
2250
2977
 
2251
2978
  /** Horizontal padding expressed as a fixed pixel offset or a number of data intervals. */
@@ -2263,6 +2990,17 @@ export declare interface HoverInfo {
2263
2990
 
2264
2991
  export declare const InfoBar: __VLS_WithTemplateSlots_2<typeof __VLS_component_2, __VLS_TemplateResult_2["slots"]>;
2265
2992
 
2993
+ export declare function isDarkBg(bg: string): boolean;
2994
+
2995
+ /**
2996
+ * Narrow a renderer to the time-axis variant. A capability check, not a
2997
+ * `kind` allowlist — any renderer implementing the required time-series
2998
+ * queries (own a `getTimeBounds()`) counts, including custom series kinds.
2999
+ * The chart's viewport, crosshair, interval detection, and Y autoscale all
3000
+ * dispatch through this guard.
3001
+ */
3002
+ export declare function isTimeSeriesRenderer(renderer: SeriesRenderer): renderer is TimeSeriesRenderer;
3003
+
2266
3004
  export declare const lavenderMist: ThemePreset;
2267
3005
 
2268
3006
  export declare const Legend: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
@@ -2312,6 +3050,14 @@ declare interface LegendItemOverride {
2312
3050
 
2313
3051
  declare type LegendMode = 'toggle' | 'isolate' | 'solo';
2314
3052
 
3053
+ /** Payload for the `onToggle` prop — one entry per user click, regardless of built-in vs custom rendering. */
3054
+ declare interface LegendToggleInfo {
3055
+ /** The clicked item's id (matches {@link LegendItem.id}). */
3056
+ id: string;
3057
+ /** Which interaction produced this change. */
3058
+ action: 'toggle' | 'isolate' | 'unisolate';
3059
+ }
3060
+
2315
3061
  export declare const lightPink: ThemePreset;
2316
3062
 
2317
3063
  /** Internal bookkeeping for a registered reference line. `coord` is a Y value (horizontal) or normalized epoch ms (vertical). */
@@ -2333,6 +3079,91 @@ declare interface LineEntry {
2333
3079
  */
2334
3080
  declare type LineEntryAnimation = 'none' | 'grow' | 'fade';
2335
3081
 
3082
+ /** What one intro frame should look like. Every field is optional — an empty
3083
+ * object renders the frame settled. */
3084
+ export declare interface LineIntroDirectives {
3085
+ /**
3086
+ * Horizontal clip window in bitmap pixels. Omitted sides default to the
3087
+ * pane edges, so `{ toX }` is a left-to-right reveal and `{ fromX }` a
3088
+ * right-to-left one.
3089
+ */
3090
+ clip?: {
3091
+ fromX?: number;
3092
+ toX?: number;
3093
+ };
3094
+ /**
3095
+ * Draw a stroke-only ghost of the full line under the main pass at this
3096
+ * alpha (the area fill is left to the main pass).
3097
+ */
3098
+ ghostAlpha?: number;
3099
+ /**
3100
+ * Head-glow anchors — the renderer draws a pulse dot per visible layer at
3101
+ * each head's `time` (bell-faded over the intro window). Heads are
3102
+ * skipped for stacked series, where a single layer's Y is meaningless.
3103
+ */
3104
+ heads?: Array<{
3105
+ x: number;
3106
+ time: number;
3107
+ }>;
3108
+ /**
3109
+ * Per-value transform applied to every rendered value (stroke, area,
3110
+ * stacked cumulative, trailing endpoint, overlay pulse) via the
3111
+ * renderer's `effectiveValue` hook.
3112
+ */
3113
+ value?: (args: LineIntroValueArgs) => number;
3114
+ }
3115
+
3116
+ /** One frame of intro choreography. See the module docs for the contract. */
3117
+ export declare type LineIntroFn = (frame: LineIntroFrame) => LineIntroDirectives;
3118
+
3119
+ /** Read view of one intro frame — everything a {@link LineIntroFn} may need. */
3120
+ export declare interface LineIntroFrame {
3121
+ /** Linear intro progress in `[0, 1]` over the whole reveal window. */
3122
+ progress: number;
3123
+ /** Visible time range. */
3124
+ range: VisibleRange;
3125
+ /**
3126
+ * Plot-area width in bitmap pixels — the span `timeToX` maps the visible
3127
+ * range onto (excludes the Y-axis strip sharing the canvas).
3128
+ */
3129
+ width: number;
3130
+ /** Plot-area height in bitmap pixels (excludes the X-axis strip). */
3131
+ height: number;
3132
+ /** The series' stacking mode — path-based intros usually degrade to a plain clip when stacked. */
3133
+ stacking: StackingMode;
3134
+ /** Time → bitmap X through the live time scale. */
3135
+ timeToX(time: number): number;
3136
+ /** Bitmap X → time — the inverse of {@link timeToX}, for mapping a clip front back into the time domain. */
3137
+ xToTime(x: number): number;
3138
+ /** Value → bitmap Y through the live Y scale. */
3139
+ valueToY(value: number): number;
3140
+ /** Number of layers in the series. */
3141
+ layerCount: number;
3142
+ /** Visible data of one layer (memoized per frame). */
3143
+ layerData(layerIndex: number): readonly TimePoint[];
3144
+ /** Mean of the layer's visible finite values, or `null` for an empty/poisoned layer (memoized per frame). */
3145
+ layerMean(layerIndex: number): number | null;
3146
+ /**
3147
+ * Bitmap-space polyline of the first visible layer (finite values only,
3148
+ * memoized per frame), or `null` when no layer has two drawable points.
3149
+ */
3150
+ primaryPath(): ReadonlyArray<{
3151
+ x: number;
3152
+ y: number;
3153
+ time: number;
3154
+ }> | null;
3155
+ }
3156
+
3157
+ /** Arguments handed to {@link LineIntroDirectives.value} for every rendered value. */
3158
+ export declare interface LineIntroValueArgs {
3159
+ layerIndex: number;
3160
+ time: number;
3161
+ /** The value the renderer would draw without the intro (live smoothing included). */
3162
+ value: number;
3163
+ /** Normalized x-position of `time` across the visible range, clamped to `[0, 1]`. */
3164
+ position: number;
3165
+ }
3166
+
2336
3167
  /** Arguments handed to a {@link LinePainter} once per finite run. */
2337
3168
  export declare interface LinePaintArgs {
2338
3169
  /**
@@ -2372,7 +3203,9 @@ declare interface LinePoint {
2372
3203
  y: number;
2373
3204
  }
2374
3205
 
2375
- export declare const LineSeries: DefineComponent<__VLS_Props_4, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_4> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3206
+ export declare const LineSeries: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_5> & Readonly<{}>, {
3207
+ visible: boolean;
3208
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2376
3209
 
2377
3210
  /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
2378
3211
  * so hosts that never render lines don't bundle this module. */
@@ -2441,6 +3274,66 @@ export declare interface LineSeriesOptions {
2441
3274
  * @see LineSeriesOptions.entryAnimation
2442
3275
  */
2443
3276
  entryMs?: number | false;
3277
+ /**
3278
+ * Initial-load reveal duration in milliseconds. On the first data seed
3279
+ * (empty → non-empty) the line draws itself left-to-right — stroke and
3280
+ * area sweep in behind a glowing head that rides the reveal front. The
3281
+ * full sweep lasts ~2× `introMs`. Default: `500`.
3282
+ *
3283
+ * ```
3284
+ * // Per-series override:
3285
+ * <LineSeries options={{ introMs: 800 }} data={data} />
3286
+ *
3287
+ * // Chart-level default:
3288
+ * <ChartContainer animations={{ series: { line: { intro: 800 } } }}>
3289
+ * <LineSeries data={data} />
3290
+ * </ChartContainer>
3291
+ * ```
3292
+ *
3293
+ * `false` or `0` disables the intro. Bulk re-seeds of a non-empty series
3294
+ * never replay it. Skipped entirely under `prefers-reduced-motion`.
3295
+ */
3296
+ introMs?: number | false;
3297
+ /**
3298
+ * Initial-load reveal choreography — a `LineIntroFn` called once per
3299
+ * frame while the intro plays. The shipped styles are factories over the
3300
+ * same contract: `unfoldIntro()` (the default — amplitude springs from
3301
+ * the mean into shape), `sweepIntro()` (left-to-right draw-on with a
3302
+ * glowing head), `traceIntro()` (faint ghost, then an ink sweep),
3303
+ * `plotterIntro()` (head advances at constant path speed), `centerOutIntro()`
3304
+ * (clip opens from the pane's center outward). Style is specific to the
3305
+ * line series; there is no chart-level override for style — only for
3306
+ * duration (`introMs`).
3307
+ *
3308
+ * @see LineIntroFn — the custom-fn contract (frame → directives).
3309
+ * @see introMs — cross-linked duration for this animation.
3310
+ */
3311
+ introAnimation?: LineIntroFn;
3312
+ /**
3313
+ * History-prepend reveal — plays when older points land at the front of
3314
+ * the series (the `EdgeLoader` load-more-on-scroll path). Default: the
3315
+ * line back-fills itself from the data boundary into the new history
3316
+ * behind a moving clip front (`backfillSweepIntro()`).
3317
+ *
3318
+ * A custom `LineIntroFn` receives a localized frame: `range` is the
3319
+ * prepended time span with `range.to` at the data boundary (not the
3320
+ * visible window), `width` is that span's bitmap width, and `progress`
3321
+ * runs over the reveal. Value-transform directives are applied to the
3322
+ * prepended points only.
3323
+ *
3324
+ * `'none'` disables the reveal — prepended points appear instantly.
3325
+ *
3326
+ * @see historyRevealMs — cross-linked duration for this animation.
3327
+ */
3328
+ historyReveal?: LineIntroFn | 'none';
3329
+ /**
3330
+ * History-prepend reveal duration in milliseconds — the full sweep lasts
3331
+ * ~2×. Default: `400`. `false` or `0` disables the reveal. Skipped
3332
+ * entirely under `prefers-reduced-motion`.
3333
+ *
3334
+ * @see LineSeriesOptions.historyReveal
3335
+ */
3336
+ historyRevealMs?: number | false;
2444
3337
  /**
2445
3338
  * How long the displayed last value takes to catch up to the actual one
2446
3339
  * on every `updateLastPoint`. Default: `250` ms.
@@ -2502,11 +3395,90 @@ export declare interface LineSeriesOptions {
2502
3395
  /** Color below the threshold. Default: the series' resolved color. */
2503
3396
  below?: string;
2504
3397
  };
3398
+ /**
3399
+ * Dot markers at each data point. Hidden by default.
3400
+ *
3401
+ * Dots ride the same animated geometry as the stroke (entrance unfurl,
3402
+ * live-value smoothing, stacked cumulative), so they glide with the line
3403
+ * instead of snapping. When the visible points sit too dense to read as
3404
+ * discrete markers (average spacing under ~1.5 dot diameters, e.g. zoomed
3405
+ * far out), the dots are skipped for that frame — they'd merge into a fat
3406
+ * line and hide the stroke. Zooming back in brings them back.
3407
+ *
3408
+ * ```
3409
+ * <LineSeries data={data} options={{ points: { visible: true } }} />
3410
+ * ```
3411
+ */
3412
+ points?: {
3413
+ /** Whether a dot is drawn at each data point. */
3414
+ visible: boolean;
3415
+ /** Dot radius in CSS pixels. Default: `3`. */
3416
+ radius?: number;
3417
+ /** Fill color override. Default: the layer's resolved series color. */
3418
+ color?: string;
3419
+ };
2505
3420
  }
2506
3421
 
2507
3422
  declare type Listener = (...args: any[]) => void;
2508
3423
 
2509
- export declare const Marker: DefineComponent<__VLS_Props_8, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_8> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3424
+ /** Read view of one loading-indicator frame — everything a {@link LoadingIndicatorFn} may need. */
3425
+ export declare interface LoadingIndicatorArgs {
3426
+ scope: BitmapCoordinateSpace;
3427
+ theme: ChartTheme;
3428
+ /**
3429
+ * Plot-area size in CSS/media pixels (excludes the axis bands) — multiply
3430
+ * by the scope's pixel ratios to get bitmap units.
3431
+ */
3432
+ chartMediaWidth: number;
3433
+ chartMediaHeight: number;
3434
+ /** Animation timestamp, typically `performance.now()`. */
3435
+ now: number;
3436
+ /**
3437
+ * Which edge this indicator's stage is anchored to. `'left'` means the
3438
+ * data boundary sits at local x = `chartMediaWidth` (the stage extends
3439
+ * further away from the data as x decreases); `'right'` means the
3440
+ * boundary sits at local x = `0`. Present only when painted by
3441
+ * `chart.setEdgeIndicator` — absent for a hypothetical future non-edge
3442
+ * caller.
3443
+ */
3444
+ side?: EdgeSide_2;
3445
+ /**
3446
+ * Y position (media px, within `[0, chartMediaHeight]`) of the boundary
3447
+ * point on the chart's primary visible time series — lets an indicator
3448
+ * start exactly where the real data leaves off. `undefined` when there's
3449
+ * no visible time series or no data resolvable at the boundary.
3450
+ */
3451
+ edgeValueY?: number;
3452
+ /**
3453
+ * Media px between adjacent bars at the chart's current zoom level — lets
3454
+ * an indicator size its placeholder shapes to match the real candles/bars
3455
+ * that will render once data lands. `undefined` when not resolvable (e.g.
3456
+ * a chart with no meaningful viewport span yet).
3457
+ */
3458
+ barSpacing?: number;
3459
+ /**
3460
+ * Kind of the primary visible time series (`'candlestick'`, `'line'`,
3461
+ * `'bar'`, ...) — lets an indicator adapt its shape to what's actually
3462
+ * loading instead of always drawing one fixed shape. `undefined` when
3463
+ * unresolvable.
3464
+ */
3465
+ seriesKind?: SeriesKind;
3466
+ /**
3467
+ * Report the placeholder shapes drawn this frame. The chart snapshots the
3468
+ * latest report and, when the fetched history lands, hands it to the
3469
+ * series' history reveal — a morph-style reveal (`skeletonMorphIntro`)
3470
+ * grows the real candles out of these exact placeholders instead of
3471
+ * cross-fading. Optional both ways: an indicator that never reports (or
3472
+ * a chart caller that doesn't collect) simply falls back to the plain
3473
+ * reveal.
3474
+ */
3475
+ reportPlaceholders?(bars: PlaceholderBar[]): void;
3476
+ }
3477
+
3478
+ /** Pure function contract for a pluggable loading indicator. */
3479
+ export declare type LoadingIndicatorFn = (args: LoadingIndicatorArgs) => void;
3480
+
3481
+ export declare const Marker: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2510
3482
 
2511
3483
  /**
2512
3484
  * A point annotation pinned to a `time` (X) and a `value` (Y) — "anomaly opened
@@ -2528,7 +3500,12 @@ export declare interface MarkerConfig {
2528
3500
  shape?: MarkerShape;
2529
3501
  /** Reuse the line pulse halo around the anchor. Default: `false`. */
2530
3502
  pulse?: boolean;
2531
- /** Optional text label drawn in a pill next to the anchor. */
3503
+ /**
3504
+ * Optional text label, drawn as a callout chip whose tail points at the
3505
+ * anchor — above it for `arrow-down` / `dot` / `circle`, below for
3506
+ * `arrow-up`, flipping when the plot edge would cut it off. On arrow
3507
+ * shapes the tail replaces the glyph.
3508
+ */
2532
3509
  label?: string;
2533
3510
  /** Color override. Falls back to the series color (when `seriesId` is set), then the theme line color. */
2534
3511
  color?: string;
@@ -2546,7 +3523,13 @@ declare interface MarkerEntry {
2546
3523
  color?: string;
2547
3524
  }
2548
3525
 
2549
- /** Glyph drawn at the marker anchor. Arrows point their tip *at* the anchor point. */
3526
+ /**
3527
+ * Glyph drawn at the marker anchor. On a bare marker, arrows point their tip
3528
+ * *at* the anchor point. On a labeled marker the callout tail does the
3529
+ * pointing instead — the arrow glyph is dropped and the shape only picks the
3530
+ * callout's side: above the anchor for `arrow-down`, below for `arrow-up`.
3531
+ * `dot` and `circle` keep their glyph under the callout.
3532
+ */
2550
3533
  export declare type MarkerShape = 'dot' | 'circle' | 'arrow-up' | 'arrow-down';
2551
3534
 
2552
3535
  export declare const materialPalenight: ThemePreset;
@@ -2564,8 +3547,37 @@ export declare const minimalLight: ThemePreset;
2564
3547
 
2565
3548
  export declare const mintBreeze: ThemePreset;
2566
3549
 
3550
+ /**
3551
+ * Blend two colors perceptually (OKLab), `t` in [0, 1]. Accepts `#rgb`,
3552
+ * `#rrggbb`, and `rgb()/rgba()` inputs; anything else (named colors,
3553
+ * `hsl()`) falls back to a hard switch at `t = 0.5` — it never produces a
3554
+ * NaN canvas fill. An `rgba()` input's alpha interpolates linearly alongside
3555
+ * the OKLab channels — the result is an `rgba()` string whenever either
3556
+ * endpoint is translucent, an opaque hex otherwise. Results are cached on a
3557
+ * quantized `t` (1/256 steps), so per-frame per-cell sampling stays
3558
+ * allocation-free after the first frame.
3559
+ */
3560
+ export declare function mixColors(from: string, to: string, t: number): string;
3561
+
2567
3562
  export declare const monokaiPro: ThemePreset;
2568
3563
 
3564
+ /**
3565
+ * One placeholder shape a loading indicator painted at the data boundary,
3566
+ * mapped into bitmap space — what a morph-style history reveal grows the
3567
+ * real candles out of. Re-anchored to the boundary every frame, so the
3568
+ * morph stays glued while the user keeps panning.
3569
+ */
3570
+ declare interface MorphPlaceholder {
3571
+ /** Bar center X, bitmap px. */
3572
+ x: number;
3573
+ /** Bar center Y, bitmap px. */
3574
+ y: number;
3575
+ /** Half the body height, bitmap px. */
3576
+ halfHeight: number;
3577
+ /** Body width, bitmap px. */
3578
+ width: number;
3579
+ }
3580
+
2569
3581
  /**
2570
3582
  * Omnivorous `data` shape for line and bar series. Accepts, interchangeably:
2571
3583
  * - `TimePointInput[]` — one auto-named layer (the common single-series case);
@@ -2576,9 +3588,9 @@ export declare const monokaiPro: ThemePreset;
2576
3588
  * Everything normalizes to `SeriesLayer[]` internally (see `toLayers`). Time
2577
3589
  * accepts epoch milliseconds or a `Date` on every point.
2578
3590
  */
2579
- declare type MultiLayerData = TimePointInput[] | SeriesLayer<TimePointInput> | Array<TimePointInput[] | SeriesLayer<TimePointInput>>;
3591
+ export declare type MultiLayerData = TimePointInput[] | SeriesLayer<TimePointInput> | Array<TimePointInput[] | SeriesLayer<TimePointInput>>;
2580
3592
 
2581
- declare const Navigator_2: DefineComponent<__VLS_Props_9, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_9> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
3593
+ declare const Navigator_2: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
2582
3594
  stripRef: HTMLDivElement;
2583
3595
  }, any>;
2584
3596
  export { Navigator_2 as Navigator }
@@ -2670,7 +3682,7 @@ export declare const nightOwl: ThemePreset;
2670
3682
  /** Convert a {@link TimeValue} (number ms or Date) to a millisecond timestamp. */
2671
3683
  export declare function normalizeTime(t: TimeValue): number;
2672
3684
 
2673
- export declare const NumberFlow: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {
3685
+ export declare const NumberFlow: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {
2674
3686
  locale: string;
2675
3687
  spinDuration: number;
2676
3688
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
@@ -2693,7 +3705,7 @@ export declare type OHLCInput = Omit<OHLCData, 'time'> & {
2693
3705
  export declare const oneDarkPro: ThemePreset;
2694
3706
 
2695
3707
  /** Overlay render state passed to {@link SeriesRenderer.drawOverlay}. */
2696
- declare interface OverlayRenderContext {
3708
+ export declare interface OverlayRenderContext {
2697
3709
  scope: BitmapCoordinateSpace;
2698
3710
  timeScale: XScale;
2699
3711
  yScale: YScale;
@@ -2751,8 +3763,22 @@ declare interface PanZoomTarget {
2751
3763
  * `chartWidth` participates in soft-bound math the same way as in `pan`.
2752
3764
  */
2753
3765
  zoomAt(centerTime: number, factor: number, chartWidth?: number): void;
3766
+ /**
3767
+ * Whether pan/zoom gestures currently apply to this target. A spatial-only
3768
+ * chart (pie, heatmap) has no time axis to gesture on, so the interaction
3769
+ * layer leaves wheel and touch events to the page — scrolling past the
3770
+ * chart keeps working. Targets that omit the hook are always pan/zoomable.
3771
+ */
3772
+ canPanZoom?(): boolean;
2754
3773
  }
2755
3774
 
3775
+ /**
3776
+ * Parse an {@link AnimationTime} to milliseconds. Invalid strings throw at
3777
+ * config-resolution time, so a typo surfaces at startup, not silently as zero
3778
+ * animation later. Used once per field in `resolveAnimationsConfig`.
3779
+ */
3780
+ export declare function parseAnimationTime(value: AnimationTime): Milliseconds;
3781
+
2756
3782
  export declare const peachCream: ThemePreset;
2757
3783
 
2758
3784
  /**
@@ -2968,7 +3994,9 @@ declare interface PieOtherOptions {
2968
3994
  color?: string;
2969
3995
  }
2970
3996
 
2971
- export declare const PieSeries: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_5> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3997
+ export declare const PieSeries: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_6> & Readonly<{}>, {
3998
+ visible: boolean;
3999
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2972
4000
 
2973
4001
  /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
2974
4002
  * so hosts that never render pies don't bundle this module. */
@@ -2982,6 +4010,16 @@ export declare interface PieSeriesOptions {
2982
4010
  innerRadiusRatio: number;
2983
4011
  /** Gap between slices in degrees. Default: 1.15° (≈ 0.02 rad). */
2984
4012
  padAngle: number;
4013
+ /**
4014
+ * Rounds each slice's corners in CSS pixels — the two where the outer rim
4015
+ * meets the straight edges, plus two more on the inner rim once
4016
+ * `innerRadiusRatio > 0` carves out a donut hole. Default: 3 (matching the
4017
+ * bar/candlestick families); pass 0 for sharp wedges. Thin rings and narrow
4018
+ * slices automatically clamp the radius down to whatever they can fit
4019
+ * without the corners overlapping, so a value that's too large for a given
4020
+ * slice degrades gracefully instead of producing a malformed shape.
4021
+ */
4022
+ cornerRadius?: number;
2985
4023
  /** Display the label shown in the tooltip. */
2986
4024
  label?: string;
2987
4025
  /** Per-slice label rendering on the pie itself. See {@link PieLabelsOptions}. */
@@ -3002,6 +4040,27 @@ export declare interface PieSeriesOptions {
3002
4040
  * value.
3003
4041
  */
3004
4042
  animate?: boolean;
4043
+ /**
4044
+ * Initial-load reveal duration in milliseconds. On the first data seed
4045
+ * (empty → non-empty) slices unfurl clockwise over this total duration,
4046
+ * then the outside labels draw in. Default: `600`.
4047
+ *
4048
+ * ```
4049
+ * // Per-series override:
4050
+ * <PieSeries options={{ entryMs: 900 }} data={data} />
4051
+ *
4052
+ * // Chart-level default:
4053
+ * <ChartContainer animations={{ series: { pie: { entry: 900 } } }}>
4054
+ * <PieSeries data={data} />
4055
+ * </ChartContainer>
4056
+ * ```
4057
+ *
4058
+ * `false` or `0` disables the intro (a chart-level
4059
+ * `animations.series.pie: false` also force-disables it). Bulk re-seeds
4060
+ * of a non-empty series never replay it. Skipped entirely under
4061
+ * `prefers-reduced-motion`.
4062
+ */
4063
+ entryMs?: number | false;
3005
4064
  /**
3006
4065
  * Per-slice radial *depth* gradient — a subtle lightening from the slice
3007
4066
  * center toward its edge that gives the pie a soft 3D sheen. On by default.
@@ -3046,7 +4105,7 @@ export declare interface PieSeriesOptions {
3046
4105
  }
3047
4106
 
3048
4107
  /** A spatial renderer with no time axis (Pie). Has no time-series queries. */
3049
- declare interface PieSeriesRenderer extends BaseSeriesRenderer {
4108
+ export declare interface PieSeriesRenderer extends BaseSeriesRenderer {
3050
4109
  readonly kind: 'pie';
3051
4110
  }
3052
4111
 
@@ -3061,6 +4120,51 @@ export declare interface PieSliceData {
3061
4120
 
3062
4121
  export declare const PieTooltip: __VLS_WithTemplateSlots_5<typeof __VLS_component_5, __VLS_TemplateResult_5["slots"]>;
3063
4122
 
4123
+ /**
4124
+ * One placeholder shape a loading indicator painted, in chart-media pixels
4125
+ * relative to the data boundary — the hand-off currency between an edge
4126
+ * indicator and a series' history reveal. `offsetX` grows away from the
4127
+ * data (into the overshoot zone), so the geometry stays glued to the
4128
+ * boundary while the user keeps panning.
4129
+ */
4130
+ declare interface PlaceholderBar {
4131
+ /** Distance from the data boundary to the bar's center, media px, ≥ 0. */
4132
+ offsetX: number;
4133
+ /** Bar center Y, media px within the plot area. */
4134
+ y: number;
4135
+ /** Half the body height, media px. */
4136
+ halfHeight: number;
4137
+ /** Body width, media px. */
4138
+ width: number;
4139
+ }
4140
+
4141
+ /**
4142
+ * Chart-recorder pen: the reveal front advances at constant speed along the
4143
+ * polyline's arc length (bitmap space), so it decelerates through volatile
4144
+ * stretches and races across flat ones. Falls back to the plain sweep for
4145
+ * stacked series and degenerate paths.
4146
+ */
4147
+ export declare function plotterIntro(): LineIntroFn;
4148
+
4149
+ /**
4150
+ * Payload for `pointClick` / `pointDoubleClick`. `spatialHit` resolves a
4151
+ * no-time-axis series (pie, heatmap, or a custom spatial kind) directly
4152
+ * under the pointer — for time-series series (line/bar/candlestick, or a
4153
+ * custom time-axis kind), resolve the point yourself from `time`, e.g. via
4154
+ * `buildHoverSnapshots(chart, { time: info.time, cacheKey: '…' })` or
4155
+ * `chart.getDataAtTime(seriesId, info.time)`.
4156
+ */
4157
+ export declare interface PointClickInfo {
4158
+ mediaX: number;
4159
+ mediaY: number;
4160
+ time: number;
4161
+ y: number;
4162
+ spatialHit: {
4163
+ seriesId: string;
4164
+ index: number;
4165
+ } | null;
4166
+ }
4167
+
3064
4168
  export declare const quietLight: ThemePreset;
3065
4169
 
3066
4170
  /** Axis-aligned rectangle in media (CSS) coordinates. */
@@ -3071,7 +4175,7 @@ declare interface Rect {
3071
4175
  height: number;
3072
4176
  }
3073
4177
 
3074
- export declare const ReferenceLine: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
4178
+ export declare const ReferenceLine: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3075
4179
 
3076
4180
  /**
3077
4181
  * A straight reference line across the plot — a horizontal threshold / baseline
@@ -3086,9 +4190,9 @@ export declare interface ReferenceLineConfig {
3086
4190
  value?: number;
3087
4191
  /** Vertical line at this `time` (epoch ms or `Date`). Mutually exclusive with {@link value}. */
3088
4192
  time?: TimeValue;
3089
- /** Line and label-pill color. Default: the theme line color. */
4193
+ /** Line and label-chip accent color. Default: the theme line color. */
3090
4194
  color?: string;
3091
- /** Optional text label drawn in a pill at the line's near end. */
4195
+ /** Optional text label drawn in an annotation chip at the line's near end. */
3092
4196
  label?: string;
3093
4197
  /** Dash style. Default: `'dashed'`. */
3094
4198
  style?: ReferenceLineStyle;
@@ -3113,7 +4217,7 @@ declare interface RegionEntry {
3113
4217
  }
3114
4218
 
3115
4219
  /**
3116
- * Register the four built-in series so the string form
4220
+ * Register the five built-in series so the string form
3117
4221
  * `chart.addSeries('line', …)` resolves. Call it once at startup.
3118
4222
  *
3119
4223
  * Importing this helper pulls every renderer into the bundle — hosts that
@@ -3143,7 +4247,7 @@ export declare function registerSeriesDefinition(def: SeriesDefinition): void;
3143
4247
  * but spatial renderers (Pie) need the raw pixel reservation to keep their
3144
4248
  * layout out of the Title / InfoBar overlay regions.
3145
4249
  */
3146
- declare interface RenderPadding {
4250
+ export declare interface RenderPadding {
3147
4251
  top: number;
3148
4252
  bottom: number;
3149
4253
  }
@@ -3202,6 +4306,14 @@ declare interface RetargetOptions {
3202
4306
  contractMs?: number;
3203
4307
  }
3204
4308
 
4309
+ /**
4310
+ * Elements float up into place from below, fading in along the wave.
4311
+ * Works for both bar and candlestick series.
4312
+ */
4313
+ export declare function riseIntro(options?: {
4314
+ travel?: number;
4315
+ }): WaveIntroFn;
4316
+
3205
4317
  export declare const rosePineDawn: ThemePreset;
3206
4318
 
3207
4319
  /** DEFAULT bar painter (registered as `'rounded'`). Trusts the engine-supplied
@@ -3225,6 +4337,13 @@ export declare interface RoundedRectArgs {
3225
4337
  corners: CornerMask;
3226
4338
  }
3227
4339
 
4340
+ /**
4341
+ * Sample a multi-stop ramp at `t` in [0, 1] with perceptual interpolation
4342
+ * between adjacent stops. A single-stop ramp returns that stop; an empty
4343
+ * ramp returns transparent black (defensive — resolved options never allow it).
4344
+ */
4345
+ export declare function sampleRamp(stops: readonly string[], t: number): string;
4346
+
3228
4347
  export declare const sandDune: ThemePreset;
3229
4348
 
3230
4349
  /** Environment the chart hands a {@link SeriesDefinition} when constructing its renderer. */
@@ -3250,6 +4369,20 @@ export declare interface SeriesDefinition<O = Record<string, unknown>> {
3250
4369
  create(env: SeriesCreateEnv, options: Partial<O>): SeriesRenderer;
3251
4370
  }
3252
4371
 
4372
+ /** Which spatial series (pie, heatmap, or a custom spatial kind) is currently hovered, and its slice/cell info. */
4373
+ export declare interface SeriesHoverInfo {
4374
+ seriesId: string;
4375
+ index: number;
4376
+ info: HoverInfo | null;
4377
+ }
4378
+
4379
+ /**
4380
+ * Discriminant for the {@link SeriesRenderer} union. Open-ended — a custom
4381
+ * series (see {@link CustomSpatialSeriesRenderer} / {@link TimeSeriesRenderer})
4382
+ * picks any string that isn't one of the built-ins.
4383
+ */
4384
+ export declare type SeriesKind = 'candlestick' | 'line' | 'bar' | 'pie' | 'heatmap' | (string & {});
4385
+
3253
4386
  /**
3254
4387
  * A single named (and optionally colored) layer. Carries the layer's display
3255
4388
  * name and color *alongside* its data, so `Tooltip` / `Legend` show per-layer
@@ -3265,7 +4398,7 @@ declare interface SeriesLayer<T> {
3265
4398
  data: T[];
3266
4399
  }
3267
4400
 
3268
- declare interface SeriesRenderContext {
4401
+ export declare interface SeriesRenderContext {
3269
4402
  scope: BitmapCoordinateSpace;
3270
4403
  timeScale: XScale;
3271
4404
  yScale: YScale;
@@ -3289,9 +4422,10 @@ declare interface SeriesRenderContext {
3289
4422
 
3290
4423
  /**
3291
4424
  * Every series renderer is one of these. Discriminated on `kind`: narrow with
3292
- * `kind === 'pie'` (or `!== 'pie'`) to reach the variant-specific surface.
4425
+ * {@link isTimeSeriesRenderer} to reach the time-axis surface — spatial kinds
4426
+ * (pie, heatmap, and any custom spatial kind) have no time-series queries.
3293
4427
  */
3294
- declare type SeriesRenderer = TimeSeriesRenderer | PieSeriesRenderer;
4428
+ export declare type SeriesRenderer = TimeSeriesRenderer | PieSeriesRenderer | HeatmapSeriesRenderer | CustomSpatialSeriesRenderer;
3295
4429
 
3296
4430
  /**
3297
4431
  * Frozen, per-row snapshot of a series at a single point in time. The shape
@@ -3319,8 +4453,8 @@ export declare interface SeriesSnapshot {
3319
4453
  readonly color: string;
3320
4454
  }
3321
4455
 
3322
- /** Supported primary series types. */
3323
- export declare type SeriesType = 'candlestick' | 'line' | 'bar' | 'pie';
4456
+ /** Primary series types. Open-ended — a custom {@link SeriesDefinition} picks any string that isn't a built-in. */
4457
+ export declare type SeriesType = 'candlestick' | 'line' | 'bar' | 'pie' | 'heatmap' | (string & {});
3324
4458
 
3325
4459
  /** Width and height pair. */
3326
4460
  declare interface Size {
@@ -3328,17 +4462,97 @@ declare interface Size {
3328
4462
  height: number;
3329
4463
  }
3330
4464
 
4465
+ /**
4466
+ * "Chart skeleton" — muted placeholder candle shapes with a soft shimmer
4467
+ * band sweeping across them, the classic skeleton-screen pattern adapted for
4468
+ * a time-series stage. The bar nearest the boundary is centered on the real
4469
+ * {@link LoadingIndicatorArgs.edgeValueY} so it still visually picks up
4470
+ * where the chart leaves off; the rest are honest placeholders (a gentle
4471
+ * taper), not a prediction. Falls back to mid-height when no boundary value
4472
+ * is resolvable (e.g. an empty chart).
4473
+ *
4474
+ * Placeholder size tracks {@link LoadingIndicatorArgs.barSpacing} — the
4475
+ * chart's actual current zoom level — so bars don't visually "pop" to a
4476
+ * different size once real data lands; when it isn't resolvable, falls back
4477
+ * to a fixed gap. Wick stubs only draw for `seriesKind === 'candlestick'`
4478
+ * (or when the kind isn't resolvable, since candlestick is the common case);
4479
+ * a `'line'`/`'bar'` series gets a plain placeholder body instead, since a
4480
+ * wick reads as OHLC-specific.
4481
+ */
4482
+ export declare const skeletonLoadingIndicator: LoadingIndicatorFn;
4483
+
4484
+ /**
4485
+ * Skeleton morph: candles that land where the loading indicator's
4486
+ * placeholder bars stood grow out of those exact shapes — geometry eases
4487
+ * from the placeholder body to the real OHLC, fill blends from the muted
4488
+ * placeholder gray to the candle's own color. Candles outside the
4489
+ * placeholder zone (and any reveal with no hand-off, e.g. a custom
4490
+ * indicator that never reports its shapes) play the `fallback` instead —
4491
+ * `fadeIntro()` unless overridden.
4492
+ *
4493
+ * Meant for the `historyReveal` option, paired with an `EdgeLoader` whose
4494
+ * indicator reports placeholders (`skeletonLoadingIndicator` does).
4495
+ */
4496
+ export declare function skeletonMorphIntro(options?: {
4497
+ fallback?: CandleIntroFn;
4498
+ }): CandleIntroFn;
4499
+
3331
4500
  export declare type SliceInfo = HoverInfo;
3332
4501
 
3333
4502
  /** `curve: 'smooth'` — monotone cubic. The in-flight last segment stays straight
3334
4503
  * while the trailing endpoint is growing so the head can't wobble / overshoot. */
3335
4504
  export declare const smoothCurve: LinePainter;
3336
4505
 
4506
+ /**
4507
+ * Snap factory — no animation, no parameters. Generic so it works for both
4508
+ * Y and X. Exposed so power users can opt out of axis motion without
4509
+ * disabling other animations:
4510
+ *
4511
+ * ```
4512
+ * animations: { axis: { y: { curve: snap() } } }
4513
+ * ```
4514
+ */
4515
+ export declare function snap<T extends YRange | VisibleRange = YRange>(): TransitionFactory<T>;
4516
+
3337
4517
  /** Sort order applied to a snapshot list by the helper. */
3338
4518
  export declare type SnapshotSort = 'none' | 'asc' | 'desc';
3339
4519
 
3340
4520
  export declare const solarizedLight: ThemePreset;
3341
4521
 
4522
+ /**
4523
+ * Critically-damped spring transition factory. Generic over the value type
4524
+ * so the same factory works for both Y (`YRange`) and X (`VisibleRange`).
4525
+ *
4526
+ * The factory dispatches at construction time based on the shape of the
4527
+ * initial value:
4528
+ *
4529
+ * - `{ min, max }` → {@link YRangeSpring} (direction-aware ω: expand vs
4530
+ * contract, used by the sticky-Y mechanism).
4531
+ * - `{ from, to }` → {@link VisibleRangeSpring} (single ω, no direction
4532
+ * asymmetry — X has no analog of sticky-Y).
4533
+ *
4534
+ * Both implementations carry velocity through mid-flight retargets so
4535
+ * wheel-zoom sequences and rapid streaming ticks stay continuous.
4536
+ *
4537
+ * Usage:
4538
+ * ```ts
4539
+ * animations: {
4540
+ * axis: {
4541
+ * y: { curve: spring() },
4542
+ * x: { curve: spring() },
4543
+ * },
4544
+ * }
4545
+ * ```
4546
+ *
4547
+ * The engine is the single source of truth for the per-call durations —
4548
+ * settle times come through `RetargetOptions.expandMs` / `contractMs`.
4549
+ */
4550
+ export declare function spring<T extends YRange | VisibleRange = YRange>(): TransitionFactory<T>;
4551
+
4552
+ /** Bars grow from the baseline with a soft ease-out-back overshoot past
4553
+ * their final height before settling. */
4554
+ export declare function springIntro(): BarIntroFn;
4555
+
3342
4556
  /** Stacking mode for bar/line series: off (overlap), normal (stacked), percent (100% stacked). */
3343
4557
  export declare type StackingMode = 'off' | 'normal' | 'percent';
3344
4558
 
@@ -3349,6 +4563,11 @@ export declare const steppedCurve: LinePainter;
3349
4563
  * the pre-feature stroke path. */
3350
4564
  export declare const straightCurve: LinePainter;
3351
4565
 
4566
+ /** Left-to-right draw-on behind a clip edge with a glowing head. */
4567
+ export declare function sweepIntro(options?: {
4568
+ head?: boolean;
4569
+ }): LineIntroFn;
4570
+
3352
4571
  /**
3353
4572
  * Input config for {@link createTheme}. Mirrors the structure of {@link ChartTheme}
3354
4573
  * but everything is optional except `background`. Missing values are derived automatically.
@@ -3368,6 +4587,7 @@ export declare interface ThemeConfig {
3368
4587
  seriesColors?: string[];
3369
4588
  bar?: Partial<NonNullable<ChartTheme['bar']>>;
3370
4589
  pie?: Partial<NonNullable<ChartTheme['pie']>>;
4590
+ heatmap?: Partial<NonNullable<ChartTheme['heatmap']>>;
3371
4591
  bands?: Partial<ChartTheme['bands']>;
3372
4592
  crosshair?: Partial<ChartTheme['crosshair']>;
3373
4593
  axis?: Partial<ChartTheme['axis']>;
@@ -3431,9 +4651,18 @@ declare interface TickTrackerSnapshot {
3431
4651
  readonly isAnimating: boolean;
3432
4652
  }
3433
4653
 
3434
- export declare const TimeAxis: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
3435
- containerRef: HTMLDivElement;
3436
- }, HTMLDivElement>;
4654
+ /** Locale / timezone override for {@link formatTime} / {@link formatDate}. Any field omitted keeps the built-in default. */
4655
+ export declare interface TimeFormatOptions {
4656
+ /** BCP 47 locale tag (e.g. `'de-DE'`). Default: `'en-US'`. */
4657
+ locale?: string;
4658
+ /** IANA timezone name (e.g. `'America/New_York'`). Default: the browser's local timezone. */
4659
+ timeZone?: string;
4660
+ /** 12-hour clock. Default: `false` (24-hour), preserved from the original hardcoded behavior. */
4661
+ hour12?: boolean;
4662
+ }
4663
+
4664
+ /** Custom time-tick formatter, mirroring {@link YScale}'s `ValueFormatter` contract. */
4665
+ export declare type TimeFormatter = (timestamp: number, interval: number) => string;
3437
4666
 
3438
4667
  /** A single time-value data point for line and bar series. Time is a timestamp in milliseconds. */
3439
4668
  export declare interface TimePoint {
@@ -3446,7 +4675,7 @@ export declare type TimePointInput = Omit<TimePoint, 'time'> & {
3446
4675
  time: TimeValue;
3447
4676
  };
3448
4677
 
3449
- export declare const TimeRegion: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
4678
+ export declare const TimeRegion: DefineComponent<__VLS_Props_17, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_17> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3450
4679
 
3451
4680
  /**
3452
4681
  * A translucent vertical band shading the interval `[from, to]` — Grafana's
@@ -3465,9 +4694,9 @@ export declare interface TimeRegionConfig {
3465
4694
  to?: TimeRegionEnd;
3466
4695
  /** Band fill — any CSS color, typically translucent. Default: a faint tint of `color`. */
3467
4696
  fill?: string;
3468
- /** Optional text label drawn in a pill at the top of the band. */
4697
+ /** Optional text label drawn in an annotation chip at the top of the band. */
3469
4698
  label?: string;
3470
- /** Edge-line and label-pill accent. Default: the theme's muted axis text color. */
4699
+ /** Edge-line and label-chip accent. Default: the theme's muted axis text color. */
3471
4700
  color?: string;
3472
4701
  }
3473
4702
 
@@ -3485,8 +4714,8 @@ export declare type TimeRegionEnd = TimeValue | 'now';
3485
4714
  * `getLastDataPoint` / `getSecondLastDataPoint` / `getVisibleDataPoints` are
3486
4715
  * pinned to layer 0 (see {@link BaseMultiLayerSeries}).
3487
4716
  */
3488
- declare interface TimeSeriesRenderer extends BaseSeriesRenderer {
3489
- readonly kind: 'candlestick' | 'line' | 'bar';
4717
+ export declare interface TimeSeriesRenderer extends BaseSeriesRenderer {
4718
+ readonly kind: 'candlestick' | 'line' | 'bar' | (string & {});
3490
4719
  /** Earliest/latest sample time across all owned layers, or null when empty. */
3491
4720
  getTimeBounds(): {
3492
4721
  first: number;
@@ -3507,6 +4736,9 @@ declare interface TimeSeriesRenderer extends BaseSeriesRenderer {
3507
4736
  } | null;
3508
4737
  }
3509
4738
 
4739
+ /** Custom tick-value generator — replaces the built-in `niceTimeIntervals` tier resolution entirely when installed. */
4740
+ export declare type TimeTickGenerator = (range: XRange, dataInterval: number) => number[];
4741
+
3510
4742
  /**
3511
4743
  * Accepted time input: a timestamp in **milliseconds** (like `Date.now()`) or a `Date` object.
3512
4744
  * `Date` values are converted to milliseconds internally via `Date.getTime()`.
@@ -3557,6 +4789,15 @@ export declare interface TooltipPositionArgs {
3557
4789
  offsetY?: number;
3558
4790
  }
3559
4791
 
4792
+ /**
4793
+ * Blueprint → ink: a faint stroke-only ghost of the whole line shows from
4794
+ * the first frame, while the full-color pass (area included) sweeps across
4795
+ * behind the same front as `'sweep'`.
4796
+ */
4797
+ export declare function traceIntro(options?: {
4798
+ ghostAlpha?: number;
4799
+ }): LineIntroFn;
4800
+
3560
4801
  /**
3561
4802
  * Emit path commands for one run of points onto `env.ctx`. Issues only
3562
4803
  * `moveTo` / `lineTo` / `bezierCurveTo`; it never opens or closes a path, so the
@@ -3591,7 +4832,7 @@ export declare interface TracePathArgs {
3591
4832
  * Other animation math (entry tweens, pulse, axis tick fade) stays
3592
4833
  * engine-fixed.
3593
4834
  */
3594
- declare interface Transition<T> {
4835
+ export declare interface Transition<T> {
3595
4836
  /** Current sampled position. Read by renderers on every frame. */
3596
4837
  readonly current: T;
3597
4838
  /** Active retarget destination. May equal `current` after settle. */
@@ -3617,7 +4858,7 @@ declare interface Transition<T> {
3617
4858
  * Holds the initial value so the produced transition starts pinned to
3618
4859
  * the same value the chart will render on its first frame.
3619
4860
  */
3620
- declare interface TransitionContext<T> {
4861
+ export declare interface TransitionContext<T> {
3621
4862
  initial: T;
3622
4863
  }
3623
4864
 
@@ -3627,7 +4868,7 @@ declare interface TransitionContext<T> {
3627
4868
  * smoothing strategy. Built-in factories: {@link hermite} (Y default),
3628
4869
  * {@link spring} (X default, also valid for Y), {@link snap} (no animation).
3629
4870
  */
3630
- declare type TransitionFactory<T> = (ctx: TransitionContext<T>) => Transition<T>;
4871
+ export declare type TransitionFactory<T> = (ctx: TransitionContext<T>) => Transition<T>;
3631
4872
 
3632
4873
  /** Font family and base font size used across the chart. */
3633
4874
  export declare interface Typography {
@@ -3637,6 +4878,17 @@ export declare interface Typography {
3637
4878
  fontSize: number;
3638
4879
  }
3639
4880
 
4881
+ /**
4882
+ * Amplitude unfold: every value lerps from its layer's visible mean toward
4883
+ * its real value with a soft ease-out-back overshoot, staggered
4884
+ * left-to-right by `stagger` (fraction of the window; default 0.35,
4885
+ * clamped to `[0, 0.9]` — at 1 the rightmost points would never finish
4886
+ * their tween and snap on settle).
4887
+ */
4888
+ export declare function unfoldIntro(options?: {
4889
+ stagger?: number;
4890
+ }): LineIntroFn;
4891
+
3640
4892
  export declare function useChartInstance(): ChartInstance;
3641
4893
 
3642
4894
  export declare function useCrosshairPosition(chart: ChartInstance): Ref<CrosshairPosition | null>;
@@ -3685,6 +4937,9 @@ declare type ValueColor = string | ((value: number) => string);
3685
4937
  /** Signature for a value-to-string formatter (YAxis, YLabel, Pie, Sparkline, NumberFlow). */
3686
4938
  export declare type ValueFormatter = (value: number) => string;
3687
4939
 
4940
+ /** Custom tick-value generator — replaces the built-in {1,2,5}×10^k resolution entirely when installed. */
4941
+ export declare type ValueTickGenerator = (range: YRange) => number[];
4942
+
3688
4943
  /** @deprecated Use {@link XRange} instead. Visible time range of the chart. */
3689
4944
  export declare type VisibleRange = XRange;
3690
4945
 
@@ -3698,7 +4953,7 @@ export declare type VisibleRange = XRange;
3698
4953
  * right by `bars` data intervals. Useful for "show N bars starting
3699
4954
  * here" patterns (warm-up windows for streaming charts, etc.).
3700
4955
  */
3701
- declare type VisibleRangeSpec = number | {
4956
+ export declare type VisibleRangeSpec = number | {
3702
4957
  from: TimeValue;
3703
4958
  to: TimeValue;
3704
4959
  } | {
@@ -3706,6 +4961,70 @@ declare type VisibleRangeSpec = number | {
3706
4961
  bars: number;
3707
4962
  };
3708
4963
 
4964
+ /** Directives shape common to both series (each extends it with its own
4965
+ * element/value callbacks). */
4966
+ export declare interface WaveIntroDirectives {
4967
+ /**
4968
+ * Horizontal clip window in bitmap pixels applied to the whole series
4969
+ * pass. Omitted sides default to the pane edges, so `{ toX }` is a
4970
+ * left-to-right reveal.
4971
+ */
4972
+ clip?: {
4973
+ fromX?: number;
4974
+ toX?: number;
4975
+ };
4976
+ element?: (el: WaveIntroElement) => WaveIntroTransform;
4977
+ }
4978
+
4979
+ /** Per-element fields common to the bar and candlestick intro contracts. */
4980
+ export declare interface WaveIntroElement {
4981
+ /** Eased wave progress for this element, staggered left → right. */
4982
+ progress: number;
4983
+ /** Normalized x-position across the visible window, clamped to `[0, 1]`. */
4984
+ position: number;
4985
+ /** The element's time coordinate. */
4986
+ time: number;
4987
+ }
4988
+
4989
+ /** An intro function built only from the shared fields — assignable to both
4990
+ * `BarIntroFn` and `CandleIntroFn`. */
4991
+ export declare type WaveIntroFn = (frame: WaveIntroFrame) => WaveIntroDirectives;
4992
+
4993
+ /** Frame fields common to the bar and candlestick intro contracts. */
4994
+ export declare interface WaveIntroFrame {
4995
+ /** Linear intro progress in `[0, 1]` over the whole reveal window. */
4996
+ progress: number;
4997
+ /**
4998
+ * Plot-area width in bitmap pixels — the span the time scale maps the
4999
+ * visible range onto (excludes the Y-axis strip sharing the canvas).
5000
+ */
5001
+ width: number;
5002
+ /** Plot-area height in bitmap pixels (excludes the X-axis strip). */
5003
+ height: number;
5004
+ /** Visible time range. */
5005
+ range: VisibleRange;
5006
+ }
5007
+
5008
+ /** Declarative transform understood by both series' element callbacks. */
5009
+ export declare interface WaveIntroTransform {
5010
+ /** Horizontal translation in bitmap px. */
5011
+ offsetX?: number;
5012
+ /** Vertical translation in bitmap px. */
5013
+ offsetY?: number;
5014
+ /** Opacity multiplier in `[0, 1]`. */
5015
+ alpha?: number;
5016
+ }
5017
+
5018
+ /** Two-phase reveal: wicks needle out first as a skeleton, then bodies (and
5019
+ * volume) unfold over them from the open price. */
5020
+ export declare function wickBodyIntro(): CandleIntroFn;
5021
+
5022
+ /**
5023
+ * A hard reveal front sweeps left to right; elements appear fully formed
5024
+ * behind it. Works for both bar and candlestick series.
5025
+ */
5026
+ export declare function wipeIntro(): WaveIntroFn;
5027
+
3709
5028
  /** Configuration for the X (time) axis. */
3710
5029
  export declare interface XAxisConfig {
3711
5030
  /** Height in CSS pixels. Default: 30. */
@@ -3720,7 +5039,7 @@ declare interface XRange {
3720
5039
  to: number;
3721
5040
  }
3722
5041
 
3723
- declare class XScale {
5042
+ export declare class XScale {
3724
5043
  /**
3725
5044
  * Shared fade state for time ticks. Grid lines (canvas) and DOM tick labels
3726
5045
  * read opacity from the same tracker, so a tick fading in/out looks
@@ -3734,6 +5053,12 @@ declare class XScale {
3734
5053
  private dataInterval;
3735
5054
  private labelCountHintValue;
3736
5055
  private minSpacingValue;
5056
+ /** Custom formatter (driven by `setFormat` / a future `<TimeAxis format=…>`). */
5057
+ private customFormat;
5058
+ /** Custom tick generator — bypasses tier resolution in `niceTickValues` when set. */
5059
+ private customTickGenerator;
5060
+ private localeValue;
5061
+ private timeZoneValue;
3737
5062
  private resolvedInterval;
3738
5063
  private lastInterval;
3739
5064
  /**
@@ -3750,6 +5075,28 @@ declare class XScale {
3750
5075
  update(range: XRange, mediaWidth: number, pixelRatio: number, dataInterval?: number): void;
3751
5076
  setLabelCount(n: number | null | undefined): void;
3752
5077
  setMinSpacing(px: number | null | undefined): void;
5078
+ /** Install (or clear) a custom tick-label formatter. */
5079
+ setFormat(fn: TimeFormatter | null): void;
5080
+ /** Read back the currently installed formatter — null when the built-in is active. */
5081
+ getFormat(): TimeFormatter | null;
5082
+ /**
5083
+ * Install (or clear) a custom tick-value generator. When set, it replaces
5084
+ * `niceTimeIntervals` tier resolution entirely — `niceTickValues` calls it
5085
+ * directly with the current range and reports its own tick spacing.
5086
+ */
5087
+ setTickGenerator(fn: TimeTickGenerator | null): void;
5088
+ /** BCP 47 locale applied to the built-in formatter. Ignored while a custom `setFormat` is installed. */
5089
+ setLocale(locale: string | undefined): void;
5090
+ getLocale(): string | undefined;
5091
+ /** IANA timezone applied to the built-in formatter. Ignored while a custom `setFormat` is installed. */
5092
+ setTimeZone(timeZone: string | undefined): void;
5093
+ getTimeZone(): string | undefined;
5094
+ /**
5095
+ * Format a tick timestamp for display. A custom formatter (via
5096
+ * {@link setFormat}) wins; otherwise falls back to the built-in
5097
+ * `formatTime`, applying the installed locale/timezone.
5098
+ */
5099
+ formatX(timestamp: number, interval: number): string;
3753
5100
  private resetHysteresis;
3754
5101
  timeToX(time: number): number;
3755
5102
  timeToBitmapX(time: number): number;
@@ -3777,7 +5124,7 @@ declare class XScale {
3777
5124
  private countTicks;
3778
5125
  }
3779
5126
 
3780
- export declare const YAxis: DefineComponent<__VLS_Props_18, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_18> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
5127
+ export declare const YAxis: DefineComponent<__VLS_Props_20, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_20> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
3781
5128
  containerRef: HTMLDivElement;
3782
5129
  }, HTMLDivElement>;
3783
5130
 
@@ -3795,6 +5142,23 @@ export declare interface YAxisConfig {
3795
5142
 
3796
5143
  export declare const YLabel: __VLS_WithTemplateSlots_8<typeof __VLS_component_8, __VLS_TemplateResult_8["slots"]>;
3797
5144
 
5145
+ /**
5146
+ * Badge motion: `true` (default) glides + counts up + fades in with the intro;
5147
+ * `false` snaps with no easing (the pre-animation behavior); an object tunes
5148
+ * individual parts.
5149
+ */
5150
+ declare type YLabelAnimate = boolean | YLabelAnimateOptions;
5151
+
5152
+ /** Fine-grained badge motion tuning. See the framework `YLabel`'s `animate` prop. */
5153
+ declare interface YLabelAnimateOptions {
5154
+ /** Glide the badge vertically across value jumps instead of snapping. Default `true`. */
5155
+ glide?: boolean;
5156
+ /** Count the value up from the first visible sample to the last during the initial reveal. Default `true`. */
5157
+ countUp?: boolean;
5158
+ /** Settle time (ms) for the vertical glide. Default {@link DEFAULT_SETTLE_MS}. */
5159
+ settleMs?: number;
5160
+ }
5161
+
3798
5162
  /** Direction of the current value vs. previous close. Drives the badge color in the default UI. */
3799
5163
  declare type YLabelDirection = 'up' | 'down' | 'neutral';
3800
5164
 
@@ -3811,7 +5175,7 @@ export declare interface YRange {
3811
5175
  * Maps values to vertical pixel positions (and vice versa).
3812
5176
  * Also provides tick generation and value formatting for the Y axis.
3813
5177
  */
3814
- declare class YScale {
5178
+ export declare class YScale {
3815
5179
  /** Shared fade state for Y ticks; see {@link TimeScale.tickTracker}. */
3816
5180
  readonly tickTracker: AxisTickTracker;
3817
5181
  private min;
@@ -3834,6 +5198,8 @@ declare class YScale {
3834
5198
  private lastRawInterval;
3835
5199
  /** Custom formatter (driven by `<YAxis format=…>`). */
3836
5200
  private customFormat;
5201
+ /** Custom tick generator — bypasses {1,2,5}×10^k resolution in `niceTickValues` when set. */
5202
+ private customTickGenerator;
3837
5203
  private get labelCountHint();
3838
5204
  private get minLabelSpacing();
3839
5205
  /** Recalculate the scale with a new Y range, chart height, and device pixel ratio. */
@@ -3847,6 +5213,12 @@ declare class YScale {
3847
5213
  setFormat(fn: ValueFormatter | null): void;
3848
5214
  /** Read back the currently installed formatter — null when the built-in is active. */
3849
5215
  getFormat(): ValueFormatter | null;
5216
+ /**
5217
+ * Install (or clear) a custom tick-value generator. When set, it replaces
5218
+ * {1,2,5}×10^k resolution entirely — `niceTickValues` calls it directly
5219
+ * with the current range.
5220
+ */
5221
+ setTickGenerator(fn: ValueTickGenerator | null): void;
3850
5222
  /** Convert a value to a Y position in CSS (media) pixels. */
3851
5223
  valueToY(value: number): number;
3852
5224
  /** Convert a value to a Y position in physical (bitmap) pixels. */