@wick-charts/vue 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +18 -3
  2. package/dist/BarSeries.vue.js +26 -20
  3. package/dist/CandlestickSeries.vue.js +30 -24
  4. package/dist/ChartContainer.vue.js +88 -65
  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/y-target.js +13 -12
  18. package/dist/core/dist/chart.js +679 -452
  19. package/dist/core/dist/components/annotation-chip.js +28 -0
  20. package/dist/core/dist/components/edge-indicator.js +58 -26
  21. package/dist/core/dist/components/loading-indicator.js +46 -0
  22. package/dist/core/dist/components/marker.js +49 -31
  23. package/dist/core/dist/components/reference-line.js +27 -36
  24. package/dist/core/dist/components/time-region.js +30 -28
  25. package/dist/core/dist/data/store.js +38 -19
  26. package/dist/core/dist/data/sync.js +60 -38
  27. package/dist/core/dist/heatmap-tooltip.js +16 -0
  28. package/dist/core/dist/interactions/handler.js +67 -43
  29. package/dist/core/dist/perf/perf-hud.js +5 -5
  30. package/dist/core/dist/scales/x-scale.js +85 -37
  31. package/dist/core/dist/scales/y-scale.js +38 -27
  32. package/dist/core/dist/series/bar-intro.js +18 -0
  33. package/dist/core/dist/series/bar.js +337 -205
  34. package/dist/core/dist/series/base-multi-layer.js +224 -96
  35. package/dist/core/dist/series/candlestick-intro.js +57 -0
  36. package/dist/core/dist/series/candlestick.js +454 -276
  37. package/dist/core/dist/series/heatmap.js +387 -0
  38. package/dist/core/dist/series/line-intro.js +85 -0
  39. package/dist/core/dist/series/line.js +590 -282
  40. package/dist/core/dist/series/painters/builtins.js +2 -2
  41. package/dist/core/dist/series/pie.js +396 -259
  42. package/dist/core/dist/series/register-builtins.js +8 -7
  43. package/dist/core/dist/series/types.js +6 -0
  44. package/dist/core/dist/series/wave-intro.js +26 -0
  45. package/dist/core/dist/theme/create.js +69 -63
  46. package/dist/core/dist/theme/themes/mint-breeze.js +2 -2
  47. package/dist/core/dist/theme/themes/sand-dune.js +2 -2
  48. package/dist/core/dist/utils/color.js +109 -34
  49. package/dist/core/dist/utils/deep-equal.js +18 -0
  50. package/dist/core/dist/utils/time.js +25 -19
  51. package/dist/index.d.ts +1405 -123
  52. package/dist/index.js +177 -130
  53. package/dist/ui/Crosshair.vue.js +20 -21
  54. package/dist/ui/HeatmapTooltip.vue.js +96 -0
  55. package/dist/ui/HeatmapTooltip.vue2.js +4 -0
  56. package/dist/ui/InfoBar.vue.js +46 -47
  57. package/dist/ui/Legend.vue.js +80 -79
  58. package/dist/ui/PieLegend.vue.js +5 -5
  59. package/dist/ui/PieTooltip.vue.js +77 -67
  60. package/dist/ui/Tooltip.vue.js +60 -60
  61. package/dist/ui/YAxis.vue.js +2 -2
  62. package/dist/ui/YLabel.vue.js +94 -61
  63. package/package.json +2 -2
  64. package/src/BarSeries.vue +23 -7
  65. package/src/CandlestickSeries.vue +23 -7
  66. package/src/ChartContainer.vue +134 -12
  67. package/src/HeatmapSeries.vue +69 -0
  68. package/src/LineSeries.vue +23 -7
  69. package/src/PieSeries.vue +22 -6
  70. package/src/index.ts +84 -3
  71. package/src/ui/Crosshair.vue +1 -2
  72. package/src/ui/HeatmapTooltip.vue +144 -0
  73. package/src/ui/InfoBar.vue +1 -2
  74. package/src/ui/Legend.vue +13 -0
  75. package/src/ui/Marker.vue +1 -1
  76. package/src/ui/PieTooltip.vue +10 -0
  77. package/src/ui/ReferenceLine.vue +2 -2
  78. package/src/ui/TimeRegion.vue +2 -2
  79. package/src/ui/Tooltip.vue +2 -2
  80. package/src/ui/YLabel.vue +123 -8
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ import { ShallowRef } from 'vue';
8
8
  declare const __VLS_component: DefineComponent<__VLS_Props_3, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_3> & Readonly<{}>, {
9
9
  theme: ChartTheme;
10
10
  gradient: boolean;
11
+ interactive: boolean;
11
12
  headerLayout: "overlay" | "inline";
12
13
  }, {}, {}, {}, string, ComponentProvideOptions, false, {
13
14
  titleAnchor: HTMLDivElement;
@@ -19,30 +20,30 @@ legendAnchor: HTMLDivElement;
19
20
  navigatorAnchor: HTMLDivElement;
20
21
  }, HTMLDivElement>;
21
22
 
22
- declare const __VLS_component_2: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_6> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
23
+ declare const __VLS_component_2: DefineComponent<__VLS_Props_8, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_8> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
23
24
 
24
- declare const __VLS_component_3: DefineComponent<__VLS_Props_7, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_7> & Readonly<{}>, {
25
+ declare const __VLS_component_3: DefineComponent<__VLS_Props_9, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_9> & Readonly<{}>, {
25
26
  position: "bottom" | "right";
26
27
  mode: LegendMode;
27
28
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
28
29
 
29
- declare const __VLS_component_4: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {
30
+ declare const __VLS_component_4: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {
30
31
  position: PieLegendPosition;
31
32
  format: ValueFormatter;
32
33
  mode: PieLegendMode;
33
34
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
34
35
 
35
- declare const __VLS_component_5: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
36
+ declare const __VLS_component_5: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
36
37
  containerRef: HTMLDivElement;
37
38
  }, any>;
38
39
 
39
- declare const __VLS_component_6: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
40
+ declare const __VLS_component_6: DefineComponent<__VLS_Props_18, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_18> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
40
41
 
41
- declare const __VLS_component_7: DefineComponent<__VLS_Props_17, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_17> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
42
+ declare const __VLS_component_7: DefineComponent<__VLS_Props_19, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_19> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
42
43
  containerRef: HTMLDivElement;
43
44
  }, any>;
44
45
 
45
- declare const __VLS_component_8: DefineComponent<__VLS_Props_19, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_19> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
46
+ declare const __VLS_component_8: DefineComponent<__VLS_Props_21, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_21> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
46
47
 
47
48
  declare type __VLS_Props = {
48
49
  /** Flat `TimePoint[]`, `TimePoint[][]`, or named `{ label, color?, data }` layers. Time accepts ms or `Date`. */
@@ -50,9 +51,34 @@ declare type __VLS_Props = {
50
51
  options?: Partial<BarSeriesOptions>;
51
52
  /** Stable series ID — same value across remounts. */
52
53
  id?: string;
54
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
55
+ visible?: boolean;
53
56
  };
54
57
 
55
58
  declare type __VLS_Props_10 = {
59
+ /** X anchor — epoch ms or a `Date`. */
60
+ time: TimeValue;
61
+ /** Y anchor as a data value. Omit and set `seriesId` to snap to that series' value at `time`. */
62
+ value?: number;
63
+ /** Snap Y to this series' value at `time` when `value` is omitted. Also the default color source. */
64
+ seriesId?: string;
65
+ /** Glyph at the anchor. Default: `'dot'`. Arrows point their tip at the anchor. */
66
+ shape?: MarkerShape;
67
+ /** Reuse the line pulse halo around the anchor. Default: `false`. */
68
+ pulse?: boolean;
69
+ /** Optional text label drawn as a callout chip whose tail points at the anchor. */
70
+ label?: string;
71
+ /** Color override. Falls back to the series color (when `seriesId` is set), then the theme line color. */
72
+ color?: string;
73
+ };
74
+
75
+ declare type __VLS_Props_11 = {
76
+ data: NavigatorData;
77
+ /** Strip height in CSS pixels. Defaults to `theme.navigator.height` (60). */
78
+ height?: number;
79
+ };
80
+
81
+ declare type __VLS_Props_12 = {
56
82
  value: number;
57
83
  /**
58
84
  * Value-to-string formatter. Defaults to the current locale's
@@ -64,7 +90,7 @@ declare type __VLS_Props_10 = {
64
90
  spinDuration?: number;
65
91
  };
66
92
 
67
- declare type __VLS_Props_11 = {
93
+ declare type __VLS_Props_13 = {
68
94
  /**
69
95
  * Owning series id. **Optional** — when omitted, the first visible pie
70
96
  * series is picked.
@@ -78,7 +104,7 @@ declare type __VLS_Props_11 = {
78
104
  position?: PieLegendPosition;
79
105
  };
80
106
 
81
- declare type __VLS_Props_12 = {
107
+ declare type __VLS_Props_14 = {
82
108
  /**
83
109
  * Owning series id. **Optional** — when omitted, the first visible pie
84
110
  * series is picked.
@@ -88,14 +114,14 @@ declare type __VLS_Props_12 = {
88
114
  format?: ValueFormatter;
89
115
  };
90
116
 
91
- declare type __VLS_Props_13 = {
117
+ declare type __VLS_Props_15 = {
92
118
  /** Horizontal line at this Y data value. Mutually exclusive with `time`. */
93
119
  value?: number;
94
120
  /** Vertical line at this `time` (epoch ms or `Date`). Mutually exclusive with `value`. */
95
121
  time?: TimeValue;
96
- /** Line and label-pill color. Default: the theme line color. */
122
+ /** Line and label-chip accent color. Default: the theme line color. */
97
123
  color?: string;
98
- /** Optional text label drawn in a pill at the line's near end. */
124
+ /** Optional text label drawn in an annotation chip at the line's near end. */
99
125
  label?: string;
100
126
  /** Dash style. Default: `'dashed'`. */
101
127
  style?: ReferenceLineStyle;
@@ -103,27 +129,27 @@ declare type __VLS_Props_13 = {
103
129
  width?: number;
104
130
  };
105
131
 
106
- declare type __VLS_Props_14 = {
132
+ declare type __VLS_Props_16 = {
107
133
  /** Desired number of labels (≥ 2). Overrides chart-level `axis.x.labelCount`. */
108
134
  labelCount?: number;
109
135
  /** Minimum pixel gap between adjacent labels (hard floor). Overrides chart-level. */
110
136
  minLabelSpacing?: number;
111
137
  };
112
138
 
113
- declare type __VLS_Props_15 = {
139
+ declare type __VLS_Props_17 = {
114
140
  /** Left edge — epoch ms or a `Date`. */
115
141
  from: TimeValue;
116
142
  /** Right edge — epoch ms or a `Date`. Omit (or pass `'now'`) for an open-ended band to the right edge. */
117
143
  to?: TimeRegionEnd;
118
144
  /** Band fill — any CSS color, typically translucent. Default: a faint tint of `color`. */
119
145
  fill?: string;
120
- /** Optional text label drawn in a pill at the top of the band. */
146
+ /** Optional text label drawn in an annotation chip at the top of the band. */
121
147
  label?: string;
122
- /** Edge-line and label-pill accent. Default: the theme's muted axis text color. */
148
+ /** Edge-line and label-chip accent. Default: the theme's muted axis text color. */
123
149
  color?: string;
124
150
  };
125
151
 
126
- declare type __VLS_Props_16 = {
152
+ declare type __VLS_Props_18 = {
127
153
  /**
128
154
  * @deprecated Use the named `sub` slot instead — it accepts arbitrary
129
155
  * inline markup (icons, badges, formatted text) to mirror React's
@@ -137,12 +163,22 @@ declare type __VLS_Props_16 = {
137
163
  sub?: string;
138
164
  };
139
165
 
140
- declare type __VLS_Props_17 = {
166
+ declare type __VLS_Props_19 = {
141
167
  sort?: SnapshotSort;
142
168
  format?: TooltipFormatter;
143
169
  };
144
170
 
145
- declare type __VLS_Props_18 = {
171
+ declare type __VLS_Props_2 = {
172
+ /** Flat `OHLCInput[]`, or `{ label, data }` to name the stream. */
173
+ data: CandlestickData;
174
+ options?: Partial<CandlestickSeriesOptions>;
175
+ /** Stable series ID — same value across remounts. */
176
+ id?: string;
177
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
178
+ visible?: boolean;
179
+ };
180
+
181
+ declare type __VLS_Props_20 = {
146
182
  /** Custom tick-label formatter. Overrides the built-in range-adaptive default. */
147
183
  format?: ValueFormatter;
148
184
  /**
@@ -154,7 +190,7 @@ declare type __VLS_Props_18 = {
154
190
  minLabelSpacing?: number;
155
191
  };
156
192
 
157
- declare type __VLS_Props_19 = {
193
+ declare type __VLS_Props_21 = {
158
194
  /**
159
195
  * Owning series id. **Optional** — when omitted, the first visible
160
196
  * single-layer time series is picked, falling back to the first visible
@@ -164,18 +200,17 @@ declare type __VLS_Props_19 = {
164
200
  color?: string;
165
201
  /** Custom formatter; routed through NumberFlow's `formatter` so the digit animation still plays. */
166
202
  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;
203
+ /**
204
+ * Badge motion. `true` (default) glides + counts up + fades in with the
205
+ * intro; `false` snaps with no easing; an object tunes individual parts.
206
+ */
207
+ animate?: YLabelAnimate;
175
208
  };
176
209
 
177
210
  declare type __VLS_Props_3 = {
211
+ /** Visual theme. Live — changing this at runtime updates all themed elements. */
178
212
  theme?: ChartTheme;
213
+ /** Grouped axis configuration (Y/X visibility, bounds, sizing). Live. */
179
214
  axis?: AxisConfig;
180
215
  /**
181
216
  * Viewport padding. `top`/`bottom` are in pixels. `left`/`right` accept either pixels (`50`)
@@ -215,16 +250,33 @@ declare type __VLS_Props_3 = {
215
250
  */
216
251
  initialRange?: VisibleRangeSpec;
217
252
  };
218
- /** Show the chart background gradient. Defaults to true. */
253
+ /**
254
+ * Controlled visible range. Same shape as the imperative
255
+ * `chart.setVisibleRange` — a bar count, an explicit `{from, to}` window,
256
+ * or `{from, bars}`. Every reference/value change applies via
257
+ * `chart.setVisibleRange`, so pair it with `onVisibleRangeChange` for a
258
+ * two-way binding; a same-value literal (compared structurally) is a
259
+ * no-op, so an inline object doesn't re-apply on every render.
260
+ *
261
+ * For a one-shot initial window that isn't re-applied on every prop
262
+ * change, use `viewport.initialRange` instead.
263
+ */
264
+ visibleRange?: VisibleRangeSpec;
265
+ /** Show the chart background gradient. Live. Defaults to true. */
219
266
  gradient?: boolean;
220
- /** Enable zoom, pan, and crosshair interactions. Defaults to true. */
267
+ /**
268
+ * Enable zoom, pan, and crosshair interactions. Defaults to true.
269
+ *
270
+ * Mount-only — core has no `setInteractive`, so changing this prop after
271
+ * mount is ignored.
272
+ */
221
273
  interactive?: boolean;
222
- /** Background grid configuration. Default: `{ visible: true }`. */
274
+ /** Background grid configuration. Live. Default: `{ visible: true }`. */
223
275
  grid?: {
224
276
  visible: boolean;
225
277
  };
226
278
  /**
227
- * How `<Title>` and `<InfoBar>` are positioned relative to the canvas.
279
+ * How `<Title>` and `<InfoBar>` are positioned relative to the canvas. Live.
228
280
  * - `'overlay'` (default): absolute overlays on top of the canvas.
229
281
  * - `'inline'`: flex siblings above the canvas — the canvas (and grid) shift down.
230
282
  */
@@ -235,10 +287,10 @@ declare type __VLS_Props_3 = {
235
287
  * `<CandlestickSeries>` / `<BarSeries>` override these chart-level
236
288
  * defaults unless the category here is explicitly `false`.
237
289
  *
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.
290
+ * **Init-only, but diffed by value, not reference.** A same-value
291
+ * inline object literal is a no-op — only a genuine change to the
292
+ * resolved config recreates the underlying `ChartInstance`, since the
293
+ * animation engine doesn't support live reconfiguration yet.
242
294
  */
243
295
  animations?: boolean | AnimationsConfig;
244
296
  /**
@@ -253,56 +305,94 @@ declare type __VLS_Props_3 = {
253
305
  * the prop identity later is ignored.
254
306
  */
255
307
  onEdgeReached?: (info: EdgeReachedInfo) => void;
308
+ /**
309
+ * Fired on a click (or tap) on the chart canvas that isn't the tail end
310
+ * of a pan drag. `info.spatialHit` resolves a pie/heatmap/custom-spatial
311
+ * series directly under the pointer; for a time-series series, resolve
312
+ * the point yourself from `info.time` (`chart.getDataAtTime` /
313
+ * `buildHoverSnapshots`). Live — the latest callback is always used.
314
+ */
315
+ onPointClick?: (info: PointClickInfo) => void;
316
+ /**
317
+ * Fired on a double-click on the chart canvas. The chart also responds
318
+ * by calling `fitContent()`. Live — the latest callback is always used.
319
+ */
320
+ onPointDoubleClick?: (info: PointClickInfo) => void;
321
+ /**
322
+ * Fired when the spatially-hovered series/index changes (pie, heatmap,
323
+ * or a custom spatial kind) — `null` when the pointer leaves every hit
324
+ * area. Live — the latest callback is always used.
325
+ */
326
+ onSeriesHover?: (hit: SeriesHoverInfo | null) => void;
327
+ /**
328
+ * Fired once the underlying `ChartInstance` is constructed — on mount,
329
+ * and again if the chart is ever rebuilt (a genuine `animations` value
330
+ * change). Live — the latest callback is always used for the next rebuild.
331
+ */
332
+ onReady?: (chart: ChartInstance) => void;
333
+ /**
334
+ * Fired whenever the committed visible range changes — pan, zoom,
335
+ * `fitContent()`, a data update that shifts the tail-scroll window, or a
336
+ * `visibleRange` prop change. Live — the latest callback is always used.
337
+ */
338
+ onVisibleRangeChange?: (range: VisibleRange) => void;
339
+ /**
340
+ * Fired on every crosshair move, with `null` when the pointer leaves the
341
+ * chart. Live — the latest callback is always used.
342
+ */
343
+ onCrosshairMove?: (position: CrosshairPosition | null) => void;
256
344
  };
257
345
 
258
346
  declare type __VLS_Props_4 = {
347
+ data: HeatmapCellData[];
348
+ options?: Partial<HeatmapSeriesOptions>;
349
+ /** Stable series ID — same value across remounts. */
350
+ id?: string;
351
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
352
+ visible?: boolean;
353
+ };
354
+
355
+ declare type __VLS_Props_5 = {
259
356
  /** Flat `TimePoint[]`, `TimePoint[][]`, or named `{ label, color?, data }` layers. Time accepts ms or `Date`. */
260
357
  data: MultiLayerData;
261
358
  options?: Partial<LineSeriesOptions>;
262
359
  /** Stable series ID — same value across remounts. */
263
360
  id?: string;
361
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
362
+ visible?: boolean;
264
363
  };
265
364
 
266
- declare type __VLS_Props_5 = {
365
+ declare type __VLS_Props_6 = {
267
366
  data: PieSliceData[];
268
367
  options?: Partial<PieSeriesOptions>;
269
368
  /** Stable series ID — same value across remounts. */
270
369
  id?: string;
370
+ /** Show/hide the series without unmounting it — excludes it from the Y-range fit and tooltip/legend. Default `true`. Live. */
371
+ visible?: boolean;
271
372
  };
272
373
 
273
- declare type __VLS_Props_6 = {
374
+ declare type __VLS_Props_7 = {
375
+ /**
376
+ * Owning series id. **Optional** — when omitted, the first visible heatmap
377
+ * series is picked.
378
+ */
379
+ seriesId?: string;
380
+ /** Custom formatter for the cell value. Default: plain integers, compact decimals. */
381
+ format?: ValueFormatter;
382
+ };
383
+
384
+ declare type __VLS_Props_8 = {
274
385
  sort?: SnapshotSort;
275
386
  format?: TooltipFormatter;
276
387
  };
277
388
 
278
- declare type __VLS_Props_7 = {
389
+ declare type __VLS_Props_9 = {
279
390
  items?: LegendItemOverride[];
280
391
  position?: 'bottom' | 'right';
281
392
  /** `'isolate'` shows only the clicked item; `'solo'` is a @deprecated alias. */
282
393
  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;
394
+ /** Fired after a click changes series visibility — via the built-in UI or a custom slot calling `item.toggle()`/`isolate()` directly. */
395
+ onToggle?: (info: LegendToggleInfo) => void;
306
396
  };
307
397
 
308
398
  declare function __VLS_template(): {
@@ -452,6 +542,7 @@ declare function __VLS_template_8(): {
452
542
  isLive: boolean;
453
543
  direction: YLabelDirection;
454
544
  format: ValueFormatter;
545
+ opacity: number;
455
546
  }): unknown;
456
547
  }> & {
457
548
  default?(ctx: {
@@ -461,6 +552,7 @@ declare function __VLS_template_8(): {
461
552
  isLive: boolean;
462
553
  direction: YLabelDirection;
463
554
  format: ValueFormatter;
555
+ opacity: number;
464
556
  }): unknown;
465
557
  };
466
558
  refs: {};
@@ -542,7 +634,7 @@ export declare const andromeda: ThemePreset;
542
634
  * - `axis.ticks` — axis tick label cross-fade.
543
635
  * - `toggle` — series visibility (alpha fade + Y re-fit, locked to one
544
636
  * duration so they finish on the same frame).
545
- * - `series.{line,candlestick,bar,pie}` — per-series-type data tweens.
637
+ * - `series.{line,candlestick,bar,pie,heatmap}` — per-series-type data tweens.
546
638
  *
547
639
  * Top-level `false` disables every animation category. `axis: false`
548
640
  * disables both axes and ticks. `axis.y: false` / `axis.x: false` disables
@@ -555,7 +647,7 @@ export declare const andromeda: ThemePreset;
555
647
  * own override; an explicit `series.<type>: false` (or top-level `false`)
556
648
  * is a hard disable that overrides per-series.
557
649
  */
558
- declare interface AnimationsConfig {
650
+ export declare interface AnimationsConfig {
559
651
  /**
560
652
  * Axis-level animation. `false` collapses both axes and ticks to instant.
561
653
  */
@@ -664,6 +756,15 @@ declare interface AnimationsConfig {
664
756
  * @default {@link DEFAULT_LINE_ENTRY}
665
757
  */
666
758
  entry?: AnimationTime;
759
+ /**
760
+ * Initial-load reveal — the line draws itself left-to-right
761
+ * on the first data seed, with a glowing head riding the
762
+ * reveal front. The value is the per-element wave duration;
763
+ * the full sweep lasts ~2×. `false` / `0` disables the intro.
764
+ *
765
+ * @default {@link DEFAULT_LINE_INTRO}
766
+ */
767
+ intro?: AnimationTime;
667
768
  /**
668
769
  * Last-value chase duration on `updateLastPoint`. `false` /
669
770
  * `0` snaps to the target instantly.
@@ -691,6 +792,15 @@ declare interface AnimationsConfig {
691
792
  * @default {@link DEFAULT_CANDLESTICK_ENTRY}
692
793
  */
693
794
  entry?: AnimationTime;
795
+ /**
796
+ * Initial-load reveal — candles unfold in a left-to-right
797
+ * wave on the first data seed. The value is the per-candle
798
+ * wave duration; the full wave lasts ~2×. `false` / `0`
799
+ * disables the intro.
800
+ *
801
+ * @default {@link DEFAULT_CANDLESTICK_INTRO}
802
+ */
803
+ intro?: AnimationTime;
694
804
  /**
695
805
  * Live OHLC chase duration on `updateLastPoint`. `false` / `0`
696
806
  * snaps to the target instantly.
@@ -710,6 +820,15 @@ declare interface AnimationsConfig {
710
820
  * @default {@link DEFAULT_BAR_ENTRY}
711
821
  */
712
822
  entry?: AnimationTime;
823
+ /**
824
+ * Initial-load reveal — bars grow from the baseline in a
825
+ * left-to-right wave on the first data seed. The value is the
826
+ * per-bar wave duration; the full wave lasts ~2×. `false` /
827
+ * `0` disables the intro.
828
+ *
829
+ * @default {@link DEFAULT_BAR_INTRO}
830
+ */
831
+ intro?: AnimationTime;
713
832
  /**
714
833
  * Live value chase duration on `updateLastPoint`. `false` /
715
834
  * `0` snaps to the target instantly.
@@ -719,13 +838,15 @@ declare interface AnimationsConfig {
719
838
  smooth?: AnimationTime;
720
839
  };
721
840
  /**
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.
841
+ * Pie segment entry/update tweens. `false` disables the slice
842
+ * entry sweep (`update` is still parse-only; wiring lands in a
843
+ * later phase).
725
844
  */
726
845
  pie?: false | {
727
846
  /**
728
- * Slice grow-in duration on first paint.
847
+ * Initial-load reveal — slices unfurl clockwise over this
848
+ * total duration on the first data seed, then the outside
849
+ * labels chain in. `false` / `0` disables the intro.
729
850
  *
730
851
  * @default {@link DEFAULT_PIE_ENTRY}
731
852
  */
@@ -737,6 +858,25 @@ declare interface AnimationsConfig {
737
858
  */
738
859
  update?: AnimationTime;
739
860
  };
861
+ /**
862
+ * Heatmap tweens. `false` disables the entrance wave, value tween,
863
+ * and hover lift.
864
+ */
865
+ heatmap?: false | {
866
+ /**
867
+ * Per-cell entrance duration — the diagonal reveal wave on
868
+ * first paint / grid-shape change.
869
+ *
870
+ * @default {@link DEFAULT_HEATMAP_ENTRY}
871
+ */
872
+ entry?: AnimationTime;
873
+ /**
874
+ * In-place value/color tween and hover-lift ease.
875
+ *
876
+ * @default {@link DEFAULT_HEATMAP_UPDATE}
877
+ */
878
+ update?: AnimationTime;
879
+ };
740
880
  };
741
881
  }
742
882
 
@@ -757,7 +897,7 @@ declare interface AnimationState {
757
897
  * - `string` in `<n>ms` or `<n>s` form (`"250ms"`, `"1s"`, `"2.5s"`)
758
898
  * - `false` — disable (equivalent to `0`)
759
899
  */
760
- declare type AnimationTime = Milliseconds | string | false;
900
+ export declare type AnimationTime = Milliseconds | string | false;
761
901
 
762
902
  /**
763
903
  * Build a 2-stop candle-body gradient around a single hex color — a lightened
@@ -853,6 +993,21 @@ declare interface AxisTickTrackerOptions {
853
993
 
854
994
  export declare const ayuMirage: ThemePreset;
855
995
 
996
+ /**
997
+ * History back-fill: the reveal front sweeps from the data boundary into
998
+ * the prepended span. Meant for the `historyReveal` option, whose localized
999
+ * frame interprets clip coordinates in reveal space — `x = 0` at the
1000
+ * boundary, increasing toward the older end, `width` = the prepended span's
1001
+ * bitmap width — so the line reads as plotting itself backwards. The
1002
+ * default `historyReveal` for the line series.
1003
+ */
1004
+ export declare function backfillSweepIntro(): LineIntroFn;
1005
+
1006
+ /** Declarative per-bar transform — translation and opacity only; growth is
1007
+ * expressed through {@link BarIntroDirectives.value} instead so stacked
1008
+ * columns rise as one attached unit. */
1009
+ export declare type BarElementTransform = WaveIntroTransform;
1010
+
856
1011
  /**
857
1012
  * Entrance animation styles for bars.
858
1013
  * - `'none'` — no animation.
@@ -861,7 +1016,7 @@ export declare const ayuMirage: ThemePreset;
861
1016
  * - `'slide'` — translates in from the right with a fade.
862
1017
  * - `'fade-grow'` *(default)* — fade + grow combined.
863
1018
  */
864
- declare type BarEntryAnimation = 'none' | 'fade' | 'grow' | 'slide' | 'fade-grow';
1019
+ export declare type BarEntryAnimation = 'none' | 'fade' | 'grow' | 'slide' | 'fade-grow';
865
1020
 
866
1021
  /** Post-transform bitmap rectangle a bar painter fills. */
867
1022
  declare interface BarGeometry {
@@ -873,6 +1028,57 @@ declare interface BarGeometry {
873
1028
  baselineY: number;
874
1029
  }
875
1030
 
1031
+ /** What one intro frame should look like. */
1032
+ export declare interface BarIntroDirectives {
1033
+ /** Horizontal clip window in bitmap px applied to the whole pass.
1034
+ * Omitted sides default to the pane edges. */
1035
+ clip?: {
1036
+ fromX?: number;
1037
+ toX?: number;
1038
+ };
1039
+ /** Per-value transform applied before geometry and stacking. Scaling the
1040
+ * value grows the bar from the baseline on every render path. */
1041
+ value?: (args: BarIntroValueArgs) => number;
1042
+ /** Per-bar transform applied after the geometry is resolved. */
1043
+ element?: (el: BarIntroElement) => BarElementTransform;
1044
+ }
1045
+
1046
+ /** Arguments handed to {@link BarIntroDirectives.element} per drawn bar. */
1047
+ export declare interface BarIntroElement extends WaveIntroElement {
1048
+ /** Settled left edge in bitmap px. */
1049
+ x: number;
1050
+ /** Settled top edge in bitmap px. */
1051
+ topY: number;
1052
+ /** Settled bar height in bitmap px. */
1053
+ barHeight: number;
1054
+ /** Y the bar grows from — the zero line, or the segment's own base for
1055
+ * stacked bars. */
1056
+ baselineY: number;
1057
+ /** Bar body width in bitmap px. */
1058
+ barWidth: number;
1059
+ }
1060
+
1061
+ /** One frame of bar intro choreography. */
1062
+ export declare type BarIntroFn = (frame: BarIntroFrame) => BarIntroDirectives;
1063
+
1064
+ /** Read view of one bar intro frame. */
1065
+ export declare interface BarIntroFrame extends WaveIntroFrame {
1066
+ /** Time → bitmap X through the live time scale. */
1067
+ timeToX(time: number): number;
1068
+ }
1069
+
1070
+ /** Arguments handed to {@link BarIntroDirectives.value} for every rendered value. */
1071
+ export declare interface BarIntroValueArgs {
1072
+ layerIndex: number;
1073
+ time: number;
1074
+ /** The value the renderer would draw without the intro (live smoothing included). */
1075
+ value: number;
1076
+ /** Normalized x-position across the visible window, clamped to `[0, 1]`. */
1077
+ position: number;
1078
+ /** Eased wave progress for this value, staggered left → right. */
1079
+ progress: number;
1080
+ }
1081
+
876
1082
  /** Arguments handed to a {@link BarPainter} once per bar / stacked segment. */
877
1083
  export declare interface BarPaintArgs {
878
1084
  geom: BarGeometry;
@@ -898,7 +1104,9 @@ export declare interface BarPaintArgs {
898
1104
  /** Paints one bar / stacked segment. Owns its fill — it calls `ctx.fill()`. */
899
1105
  export declare type BarPainter = (env: PaintEnv, args: BarPaintArgs) => void;
900
1106
 
901
- export declare const BarSeries: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1107
+ export declare const BarSeries: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
1108
+ visible: boolean;
1109
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
902
1110
 
903
1111
  /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
904
1112
  * so hosts that never render bars don't bundle this module. */
@@ -938,6 +1146,63 @@ export declare interface BarSeriesOptions {
938
1146
  * @see BarSeriesOptions.entryAnimation
939
1147
  */
940
1148
  entryMs?: number | false;
1149
+ /**
1150
+ * Initial-load intro animation — a `BarIntroFn`, usually one of the
1151
+ * shipped factories: `growIntro()` (the default), `springIntro()`,
1152
+ * `riseIntro()`, `fadeIntro()`, `wipeIntro()`. Independent of
1153
+ * `entryAnimation` — the intro plays once on the first data seed,
1154
+ * streaming entrances keep their own style.
1155
+ *
1156
+ * @see introMs — cross-linked duration for this animation.
1157
+ */
1158
+ introAnimation?: BarIntroFn;
1159
+ /**
1160
+ * Initial-load reveal duration in milliseconds. On the first data seed
1161
+ * (empty → non-empty) bars reveal in a left-to-right wave: each bar
1162
+ * tweens for `introMs`, starts staggered across another `introMs`, so
1163
+ * the full wave lasts ~2×. The visual style is picked by
1164
+ * `introAnimation`. Default: `500`.
1165
+ *
1166
+ * ```
1167
+ * // Per-series override:
1168
+ * <BarSeries options={{ introMs: 800 }} data={data} />
1169
+ *
1170
+ * // Chart-level default:
1171
+ * <ChartContainer animations={{ series: { bar: { intro: 800 } } }}>
1172
+ * <BarSeries data={data} />
1173
+ * </ChartContainer>
1174
+ * ```
1175
+ *
1176
+ * `false` or `0` disables the intro. Bulk re-seeds of a non-empty series
1177
+ * never replay it. Skipped entirely under `prefers-reduced-motion`.
1178
+ */
1179
+ introMs?: number | false;
1180
+ /**
1181
+ * History-prepend reveal — plays when older points land at the front of
1182
+ * the series (the `EdgeLoader` load-more-on-scroll path). A wave sweeps
1183
+ * from the data boundary into the new history; each bar's stagger
1184
+ * position is `0` at the boundary and `1` at the deepest new point, so
1185
+ * intro factories that read `el.progress` (`fadeIntro()` — the default,
1186
+ * `riseIntro()`, `growIntro()`, `springIntro()`) work here unchanged.
1187
+ * Clip directives are interpreted in reveal space: `x = 0` at the
1188
+ * boundary, increasing toward the older end.
1189
+ *
1190
+ * The fn receives a localized frame: `range` is the prepended time span
1191
+ * (not the visible window) and `width` is that span's bitmap width.
1192
+ *
1193
+ * `'none'` disables the reveal — prepended points appear instantly.
1194
+ *
1195
+ * @see historyRevealMs — cross-linked duration for this animation.
1196
+ */
1197
+ historyReveal?: BarIntroFn | 'none';
1198
+ /**
1199
+ * History-prepend reveal duration in milliseconds — the per-bar wave
1200
+ * duration; the full reveal lasts ~2×. Default: `400`. `false` or `0`
1201
+ * disables the reveal. Skipped entirely under `prefers-reduced-motion`.
1202
+ *
1203
+ * @see BarSeriesOptions.historyReveal
1204
+ */
1205
+ historyRevealMs?: number | false;
941
1206
  /**
942
1207
  * How long the displayed bar value takes to catch up to the actual one
943
1208
  * on every `updateLastPoint`. Default: `250` ms.
@@ -995,10 +1260,11 @@ export declare interface BarSeriesOptions {
995
1260
  * Multi-layer renderers (Line, Bar) override them against each internal store.
996
1261
  *
997
1262
  * 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).
1263
+ * as required methods, so Chart narrows via {@link isTimeSeriesRenderer} and
1264
+ * calls them directly (no optional chaining). Never narrow by comparing `kind`
1265
+ * against a single spatial value — new spatial kinds slip through such guards.
1000
1266
  */
1001
- declare interface BaseSeriesRenderer {
1267
+ export declare interface BaseSeriesRenderer {
1002
1268
  /** Paint the series on the main layer. */
1003
1269
  render(ctx: SeriesRenderContext): void;
1004
1270
  /**
@@ -1008,6 +1274,21 @@ declare interface BaseSeriesRenderer {
1008
1274
  setData(data: unknown, layerIndex?: number): void;
1009
1275
  /** Append a single point (real-time tick). Optional — not all renderers support streaming. */
1010
1276
  appendPoint?(point: unknown, layerIndex?: number): void;
1277
+ /**
1278
+ * Insert older points at the front of the series (history prepend / load-more).
1279
+ * The suffix already on screen is untouched, so — unlike {@link setData} — this
1280
+ * does NOT re-arm the intro, clear entrance/chase state, or force a Y snap.
1281
+ * Optional; not all renderers support it.
1282
+ */
1283
+ prependPoints?(points: unknown[], layerIndex?: number): void;
1284
+ /**
1285
+ * Seed the placeholder shapes a loading indicator was showing at the data
1286
+ * boundary, called by the chart right before the matching
1287
+ * {@link prependPoints}. A history reveal that supports morphing (e.g.
1288
+ * `skeletonMorphIntro`) grows the real elements out of these shapes; a
1289
+ * renderer that doesn't implement this simply plays its plain reveal.
1290
+ */
1291
+ setHistoryHandoff?(bars: PlaceholderBar[]): void;
1011
1292
  /** Replace the last point in place (live candle update). Optional. */
1012
1293
  updateLastPoint?(point: unknown, layerIndex?: number): void;
1013
1294
  /**
@@ -1077,6 +1358,14 @@ declare interface BaseSeriesRenderer {
1077
1358
  value: number;
1078
1359
  isLive: boolean;
1079
1360
  } | null;
1361
+ /**
1362
+ * Stacked value at an arbitrary `time` — the cumulative stack top at that
1363
+ * sample, mirroring {@link getStackedLastValue} but anywhere in the window
1364
+ * (used for the YLabel intro count-up start so it shares the stack basis).
1365
+ * Single-layer renderers return the nearest sample's value; `null` when no
1366
+ * layer has a sample near `time`.
1367
+ */
1368
+ getStackedValueAtTime?(time: number, interval: number): number | null;
1080
1369
  /**
1081
1370
  * Per-layer last snapshots, each with its own `time`. Useful for ragged
1082
1371
  * multi-layer series where layers advance independently — last-mode
@@ -1124,6 +1413,13 @@ declare interface BaseSeriesRenderer {
1124
1413
  getLayerAlpha?(index: number): number;
1125
1414
  /** True while the renderer has an active animation (Chart polls per frame). */
1126
1415
  readonly needsAnimation?: boolean;
1416
+ /**
1417
+ * Reveal-front position in `[0, 1]` of the initial-load intro across the
1418
+ * visible window — `1` once settled (or when the renderer has no intro).
1419
+ * Overlays (the Y-label badge, annotations) key their own entrance off this
1420
+ * so they reveal in step with the series draw. Omitted → treated as `1`.
1421
+ */
1422
+ getIntroFront?(): number;
1127
1423
  /**
1128
1424
  * Optional overlay hook. Chart invokes this during the overlay pass so each
1129
1425
  * renderer can paint type-specific overlays (crosshair dots, pulse dots).
@@ -1146,7 +1442,7 @@ declare interface BaseSeriesRenderer {
1146
1442
  dispose(): void;
1147
1443
  }
1148
1444
 
1149
- declare interface BitmapCoordinateSpace {
1445
+ export declare interface BitmapCoordinateSpace {
1150
1446
  context: CanvasRenderingContext2D;
1151
1447
  bitmapSize: {
1152
1448
  width: number;
@@ -1204,6 +1500,24 @@ export declare interface BuildLastSnapshotsArgs {
1204
1500
  cacheKey: string;
1205
1501
  }
1206
1502
 
1503
+ /** What one element should look like this frame. Every field is optional —
1504
+ * an empty object renders the element settled. */
1505
+ export declare interface CandleElementTransform extends WaveIntroTransform {
1506
+ /** Lerp factor from `anchorY` toward the settled edges: `0` = collapsed
1507
+ * at the anchor, `1` = settled. Applied before the offsets. */
1508
+ unfold?: number;
1509
+ /** Absolute top edge override in bitmap px — replaces the `unfold` math
1510
+ * for this frame (the offsets still apply). Lets a morph start from
1511
+ * arbitrary geometry instead of the anchor. */
1512
+ topY?: number;
1513
+ /** Absolute bottom edge override in bitmap px — see {@link topY}. */
1514
+ bottomY?: number;
1515
+ /** Blend of the element's fill toward the theme's muted placeholder gray
1516
+ * (the axis text color): `0` = the candle's own color, `1` = fully
1517
+ * placeholder-colored. Volume bars ignore it. */
1518
+ tint?: number;
1519
+ }
1520
+
1207
1521
  /** Post-transform bitmap rectangle a candle-body painter fills. */
1208
1522
  declare interface CandleGeometry {
1209
1523
  x: number;
@@ -1212,6 +1526,51 @@ declare interface CandleGeometry {
1212
1526
  height: number;
1213
1527
  }
1214
1528
 
1529
+ /** What one intro frame should look like. */
1530
+ export declare interface CandleIntroDirectives {
1531
+ /** Horizontal clip window in bitmap px applied to the whole pass (volume
1532
+ * band included). Omitted sides default to the pane edges. */
1533
+ clip?: {
1534
+ fromX?: number;
1535
+ toX?: number;
1536
+ };
1537
+ /** Per-element transform — called for every wick, body, and volume bar. */
1538
+ element?: (el: CandleIntroElement) => CandleElementTransform;
1539
+ }
1540
+
1541
+ /** Arguments handed to {@link CandleIntroDirectives.element} per element. */
1542
+ export declare interface CandleIntroElement extends WaveIntroElement {
1543
+ /** Which candle element is being transformed. */
1544
+ element: 'wick' | 'body' | 'volume';
1545
+ /** Settled left edge in bitmap px. */
1546
+ x: number;
1547
+ /** Settled top edge in bitmap px. */
1548
+ topY: number;
1549
+ /** Settled bottom edge in bitmap px. */
1550
+ bottomY: number;
1551
+ /** Y the element unfolds around — the open price for wick/body, the band
1552
+ * baseline for volume. */
1553
+ anchorY: number;
1554
+ /** Element width in bitmap px. */
1555
+ barWidth: number;
1556
+ }
1557
+
1558
+ /** One frame of candlestick intro choreography. */
1559
+ export declare type CandleIntroFn = (frame: CandleIntroFrame) => CandleIntroDirectives;
1560
+
1561
+ /** Read view of one candlestick intro frame. */
1562
+ export declare interface CandleIntroFrame extends WaveIntroFrame {
1563
+ /** Time → bitmap X through the live time scale. */
1564
+ timeToX(time: number): number;
1565
+ /**
1566
+ * Placeholder shapes the loading indicator was showing when this history
1567
+ * reveal armed — present only on a history-reveal frame that followed a
1568
+ * loading-indicator hand-off (see `skeletonMorphIntro`). Absent on
1569
+ * initial-load intro frames and on reveals with no hand-off.
1570
+ */
1571
+ placeholders?: readonly MorphPlaceholder[];
1572
+ }
1573
+
1215
1574
  /** Arguments handed to a {@link CandlePainter} once per candle body. */
1216
1575
  export declare interface CandlePaintArgs {
1217
1576
  geom: CandleGeometry;
@@ -1265,9 +1624,11 @@ declare interface CandlestickDirectionColors {
1265
1624
  * - `'fade-unfold'` *(default)* — fade + unfold combined; the default because a lone fade is
1266
1625
  * hard to notice in streaming demos, while the body-unfold gives a clear visual anchor.
1267
1626
  */
1268
- declare type CandlestickEntryAnimation = 'none' | 'fade' | 'unfold' | 'slide' | 'fade-unfold';
1627
+ export declare type CandlestickEntryAnimation = 'none' | 'fade' | 'unfold' | 'slide' | 'fade-unfold';
1269
1628
 
1270
- export declare const CandlestickSeries: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1629
+ export declare const CandlestickSeries: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{}>, {
1630
+ visible: boolean;
1631
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1271
1632
 
1272
1633
  /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
1273
1634
  * so hosts that never render candles don't bundle this module. */
@@ -1310,6 +1671,63 @@ export declare interface CandlestickSeriesOptions {
1310
1671
  * @see CandlestickSeriesOptions.entryAnimation
1311
1672
  */
1312
1673
  entryMs?: number | false;
1674
+ /**
1675
+ * Initial-load intro animation — a `CandleIntroFn`, usually one of the
1676
+ * shipped factories: `candleUnfoldIntro()` (the default),
1677
+ * `wickBodyIntro()`, `riseIntro()`, `fadeIntro()`. Independent of
1678
+ * `entryAnimation` — the intro plays once on the first data seed,
1679
+ * streaming entrances keep their own style.
1680
+ *
1681
+ * @see introMs — cross-linked duration for this animation.
1682
+ */
1683
+ introAnimation?: CandleIntroFn;
1684
+ /**
1685
+ * Initial-load reveal duration in milliseconds. On the first data seed
1686
+ * (empty → non-empty) candles reveal in a left-to-right wave: each candle
1687
+ * tweens for `introMs`, starts staggered across another `introMs`, so the
1688
+ * full wave lasts ~2×. The visual style is picked by `introAnimation`.
1689
+ * Default: `500`.
1690
+ *
1691
+ * ```
1692
+ * // Per-series override:
1693
+ * <CandlestickSeries options={{ introMs: 800 }} data={data} />
1694
+ *
1695
+ * // Chart-level default:
1696
+ * <ChartContainer animations={{ series: { candlestick: { intro: 800 } } }}>
1697
+ * <CandlestickSeries data={data} />
1698
+ * </ChartContainer>
1699
+ * ```
1700
+ *
1701
+ * `false` or `0` disables the intro. Bulk re-seeds of a non-empty series
1702
+ * never replay it. Skipped entirely under `prefers-reduced-motion`.
1703
+ */
1704
+ introMs?: number | false;
1705
+ /**
1706
+ * History-prepend reveal — plays when older points land at the front of
1707
+ * the series (the `EdgeLoader` load-more-on-scroll path). A wave sweeps
1708
+ * from the data boundary into the new history; each candle's stagger
1709
+ * position is `0` at the boundary and `1` at the deepest new point, so
1710
+ * intro factories that read `el.progress` (`fadeIntro()` — the default,
1711
+ * `riseIntro()`, `candleUnfoldIntro()`, `wickBodyIntro()`) work here
1712
+ * unchanged. Clip directives are interpreted in reveal space: `x = 0` at
1713
+ * the boundary, increasing toward the older end.
1714
+ *
1715
+ * The fn receives a localized frame: `range` is the prepended time span
1716
+ * (not the visible window) and `width` is that span's bitmap width.
1717
+ *
1718
+ * `'none'` disables the reveal — prepended points appear instantly.
1719
+ *
1720
+ * @see historyRevealMs — cross-linked duration for this animation.
1721
+ */
1722
+ historyReveal?: CandleIntroFn | 'none';
1723
+ /**
1724
+ * History-prepend reveal duration in milliseconds — the per-candle wave
1725
+ * duration; the full reveal lasts ~2×. Default: `400`. `false` or `0`
1726
+ * disables the reveal. Skipped entirely under `prefers-reduced-motion`.
1727
+ *
1728
+ * @see CandlestickSeriesOptions.historyReveal
1729
+ */
1730
+ historyRevealMs?: number | false;
1313
1731
  /**
1314
1732
  * How long the displayed OHLC takes to catch up to the actual last value
1315
1733
  * on every `updateLastPoint`. Default: `250` ms.
@@ -1349,13 +1767,36 @@ export declare interface CandlestickSeriesOptions {
1349
1767
  candlePainter?: CandlePainter;
1350
1768
  }
1351
1769
 
1770
+ /** Each candle unfolds from its open price in a left-to-right wave — the
1771
+ * default intro. Alpha rides the same progress as the unfold so a candle
1772
+ * still waiting for the wave front stays invisible instead of painting as
1773
+ * a flat, min-height line at its open price. */
1774
+ export declare function candleUnfoldIntro(): CandleIntroFn;
1775
+
1352
1776
  export declare const catppuccin: ThemePreset;
1353
1777
 
1778
+ /**
1779
+ * Center-out reveal: the clip window opens from the pane's horizontal
1780
+ * center outward, a glowing head riding each front.
1781
+ */
1782
+ export declare function centerOutIntro(): LineIntroFn;
1783
+
1354
1784
  export declare const ChartContainer: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
1355
1785
 
1356
1786
  /** Events emitted by {@link ChartInstance}. */
1357
1787
  declare interface ChartEvents {
1358
1788
  crosshairMove: (pos: CrosshairPosition | null) => void;
1789
+ /** Fired on a click (or tap) on the chart canvas that isn't the tail end of a pan drag. */
1790
+ pointClick: (info: PointClickInfo) => void;
1791
+ /** Fired on a double-click on the chart canvas. Chart also responds by calling `fitContent()`. */
1792
+ pointDoubleClick: (info: PointClickInfo) => void;
1793
+ /**
1794
+ * Fired when the spatially-hovered series/index changes (pie, heatmap, or
1795
+ * a custom spatial kind) — `null` when the pointer leaves every hit area.
1796
+ * Time-series series have no pixel geometry to hover this way; read
1797
+ * `crosshairMove` + `getDataAtTime`/`buildHoverSnapshots` for those.
1798
+ */
1799
+ seriesHover: (hit: SeriesHoverInfo | null) => void;
1359
1800
  viewportChange: () => void;
1360
1801
  dataUpdate: () => void;
1361
1802
  seriesChange: () => void;
@@ -1422,6 +1863,10 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1422
1863
  id?: string;
1423
1864
  label?: string;
1424
1865
  }>): string;
1866
+ addSeries(type: 'heatmap', options?: Partial<HeatmapSeriesOptions & {
1867
+ id?: string;
1868
+ label?: string;
1869
+ }>): string;
1425
1870
  addSeries<O>(def: SeriesDefinition<O>, options?: Partial<O> & {
1426
1871
  layers?: number;
1427
1872
  id?: string;
@@ -1488,6 +1933,14 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1488
1933
  * underlying animator mutates between frames.
1489
1934
  */
1490
1935
  getAnimationState(): AnimationState;
1936
+ /**
1937
+ * Reveal-front position in `[0, 1]` of any in-flight initial-load intro.
1938
+ * With a `seriesId`, that series' own front; without, the minimum across
1939
+ * every visible time series — overlays wait for the slowest reveal. `1`
1940
+ * whenever nothing is introing. Overlay components (the Y-label badge,
1941
+ * annotations) read this to reveal their entrance in step with the draw.
1942
+ */
1943
+ getIntroFront(seriesId?: string): number;
1491
1944
  /**
1492
1945
  * Replace all data for a series.
1493
1946
  *
@@ -1500,6 +1953,20 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1500
1953
  setSeriesData(id: string, data: unknown, layerIndex?: number): void;
1501
1954
  /** Append a new data point to the end of a series (real-time tick). */
1502
1955
  appendData(id: string, point: OHLCInput | TimePointInput, layerIndex?: number): void;
1956
+ /**
1957
+ * Prepend older points to the front of a series — the "load more history on
1958
+ * scroll" path. Unlike {@link setSeriesData}, this deliberately does NOT set
1959
+ * `#dataReplaceSnapPending`: the visible window and the data inside it don't
1960
+ * change, so the viewport must stay put (X) and the Y axis eases if newly
1961
+ * revealed history shifts the range — instead of the full-span re-fit and
1962
+ * instant dual-axis snap a bulk `setSeriesData` replace would force. Routes
1963
+ * through the streaming `onPointAppended` engine signal via `onDataChanged`.
1964
+ *
1965
+ * `points` must be sorted ascending and sit strictly before the current
1966
+ * first point; the sync reconciler guarantees this before calling here.
1967
+ * No-op if the renderer doesn't support prepend.
1968
+ */
1969
+ prependData(id: string, points: (OHLCInput | TimePointInput)[], layerIndex?: number): void;
1503
1970
  /** Update the last data point of a series in place (e.g. live candle update). */
1504
1971
  updateData(id: string, point: OHLCInput | TimePointInput, layerIndex?: number): void;
1505
1972
  /**
@@ -1517,7 +1984,7 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1517
1984
  */
1518
1985
  keepLast(id: string, count: number, layerIndex?: number): void;
1519
1986
  /** Update visual options (color, width, etc.) for an existing series. */
1520
- updateSeriesOptions(id: string, options: Partial<CandlestickSeriesOptions> | Partial<LineSeriesOptions> | Partial<BarSeriesOptions> | Partial<PieSeriesOptions>): void;
1987
+ updateSeriesOptions(id: string, options: Partial<CandlestickSeriesOptions> | Partial<LineSeriesOptions> | Partial<BarSeriesOptions> | Partial<PieSeriesOptions> | Partial<HeatmapSeriesOptions>): void;
1521
1988
  /**
1522
1989
  * Batch multiple updates: suppress recomputes until `fn` returns. Exceptions
1523
1990
  * inside `fn` still flush the batch so counters don't leak across calls.
@@ -1651,15 +2118,17 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1651
2118
  }[] | null;
1652
2119
  getSeriesIds(): string[];
1653
2120
  /**
1654
- * Filter `getSeriesIds()` by renderer type. `'pie'` returns pie series,
1655
- * `'time'` returns line/bar/candlestick.
2121
+ * Filter `getSeriesIds()` by renderer type. A concrete kind (`'pie'`,
2122
+ * `'heatmap'`, a custom kind, …) returns series of that exact kind;
2123
+ * `'time'` returns every time-axis series (line/bar/candlestick and any
2124
+ * custom time-series kind).
1656
2125
  *
1657
2126
  * - `opts.visibleOnly` — exclude series with `isSeriesVisible=false`; for
1658
2127
  * multi-layer series also exclude when every layer is hidden.
1659
2128
  * - `opts.singleLayerOnly` — exclude series with more than one layer.
1660
2129
  * Useful for YLabel fallback priority (stick to a single line first).
1661
2130
  */
1662
- getSeriesIdsByType(type: 'pie' | 'time', opts?: {
2131
+ getSeriesIdsByType(type: SeriesKind | 'time', opts?: {
1663
2132
  visibleOnly?: boolean;
1664
2133
  singleLayerOnly?: boolean;
1665
2134
  }): string[];
@@ -1673,6 +2142,14 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1673
2142
  value: number;
1674
2143
  isLive: boolean;
1675
2144
  } | null;
2145
+ /**
2146
+ * Stacked value at an arbitrary `time` — the cumulative stack top at that
2147
+ * sample, sharing a basis with {@link getStackedLastValue}. Falls back to the
2148
+ * nearest raw sample (close / value) for renderers without a stacked concept
2149
+ * (Candlestick, single-layer Line/Bar). Returns `null` for unknown ids or
2150
+ * when no sample sits near `time`. Used by the YLabel intro count-up start.
2151
+ */
2152
+ getStackedValueAtTime(seriesId: string, time: number): number | null;
1676
2153
  /**
1677
2154
  * Per-layer last snapshots with each layer's own `time`. Returns `null`
1678
2155
  * for single-layer renderers or when no visible layer has data. Used by
@@ -1717,6 +2194,12 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1717
2194
  /** Apply a new theme and update series colors where appropriate. */
1718
2195
  setTheme(theme: ChartTheme): void;
1719
2196
  getTheme(): ChartTheme;
2197
+ /** BCP 47 locale applied to the built-in time-axis / tooltip / crosshair formatting. */
2198
+ setLocale(locale: string | undefined): void;
2199
+ getLocale(): string | undefined;
2200
+ /** IANA timezone applied to the same built-in date-time formatting. */
2201
+ setTimeZone(timeZone: string | undefined): void;
2202
+ getTimeZone(): string | undefined;
1720
2203
  /** Update axis configuration and re-render. */
1721
2204
  setAxis(config: AxisConfig): void;
1722
2205
  /**
@@ -1763,6 +2246,13 @@ export declare class ChartInstance extends EventEmitter<ChartEvents> implements
1763
2246
  setEdgeState(side: EdgeSide, state: EdgeState): void;
1764
2247
  /** Read the current host-declared state for a given edge. */
1765
2248
  getEdgeState(side: EdgeSide): EdgeState;
2249
+ /**
2250
+ * Swap the painter used for a side's `loading` spinner — the same
2251
+ * pluggable-function contract as the series intro animations. `null`
2252
+ * (default) falls back to the built-in three-dot spinner. Takes effect
2253
+ * immediately if that side is currently in the `loading` state.
2254
+ */
2255
+ setEdgeIndicator(side: EdgeSide, indicator: LoadingIndicatorFn | null): void;
1766
2256
  /**
1767
2257
  * Notify chart that a YLabel overlay is mounted / unmounted. Currently a
1768
2258
  * no-op — placeholder for the right-padding reflow that will adjust the
@@ -1867,6 +2357,19 @@ export declare interface ChartOptions {
1867
2357
  };
1868
2358
  /** Enable zoom, pan, and crosshair interactions. Defaults to true. */
1869
2359
  interactive?: boolean;
2360
+ /**
2361
+ * BCP 47 locale applied to the built-in time-axis / tooltip / crosshair
2362
+ * date-time formatting (e.g. `'de-DE'`). Default: `'en-US'`. Live —
2363
+ * `chart.setLocale()` updates it after construction. Ignored for a series
2364
+ * that installs a custom formatter via `chart.timeScale.setFormat()`.
2365
+ */
2366
+ locale?: string;
2367
+ /**
2368
+ * IANA timezone applied to the same built-in date-time formatting (e.g.
2369
+ * `'America/New_York'`). Default: the browser's local timezone. Live —
2370
+ * `chart.setTimeZone()` updates it after construction.
2371
+ */
2372
+ timeZone?: string;
1870
2373
  /** Background grid configuration. Default: `{ visible: true }`. */
1871
2374
  grid?: {
1872
2375
  visible: boolean;
@@ -1993,6 +2496,20 @@ export declare interface ChartTheme {
1993
2496
  */
1994
2497
  otherColor: string;
1995
2498
  };
2499
+ /**
2500
+ * Heatmap sequential ramp. Optional so hand-built theme literals keep
2501
+ * compiling — the renderer falls back to a ramp derived from
2502
+ * {@link ChartTheme.line} `color` and the background at render time.
2503
+ */
2504
+ heatmap?: {
2505
+ /**
2506
+ * Ramp stops, low → high, interpolated perceptually. {@link createTheme}
2507
+ * derives a two-stop single-hue ramp: a faint accent wash near the
2508
+ * surface up to the full accent — which flips anchor automatically with
2509
+ * theme polarity (low values sink into the background in both modes).
2510
+ */
2511
+ colors: string[];
2512
+ };
1996
2513
  /** Bollinger band / envelope fill colors. */
1997
2514
  bands: {
1998
2515
  /** Fill for the upper band region (above the middle band). */
@@ -2163,12 +2680,38 @@ export declare interface CrosshairPosition {
2163
2680
  /** Path-shape selector for {@link tracePath}. */
2164
2681
  export declare type CurveKind = 'straight' | 'smooth' | 'stepped';
2165
2682
 
2166
- export declare function detectInterval(times: number[]): number;
2167
-
2683
+ /**
2684
+ * A custom spatial renderer with no time axis — implement this (rather than
2685
+ * {@link PieSeriesRenderer} / {@link HeatmapSeriesRenderer}, which are reserved
2686
+ * for the built-ins) when writing a new non-time-axis series from scratch,
2687
+ * e.g. a radar or treemap chart. Pick any `kind` that isn't a built-in one.
2688
+ */
2689
+ export declare interface CustomSpatialSeriesRenderer extends BaseSeriesRenderer {
2690
+ readonly kind: string;
2691
+ }
2692
+
2693
+ /**
2694
+ * Structural equality for plain option bags that may carry function-valued
2695
+ * fields (e.g. `AnimationsConfig.axis.y.curve`, a transition factory).
2696
+ * Functions (and any other non-plain value) compare by reference — only
2697
+ * arrays and plain objects recurse. Used to tell a caller's brand-new inline
2698
+ * object literal (same values, new reference) apart from a genuine option
2699
+ * change, so wrappers can skip an expensive rebuild in the former case.
2700
+ */
2701
+ export declare function deepEqual(a: unknown, b: unknown): boolean;
2702
+
2703
+ declare const _default: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
2704
+ containerRef: HTMLDivElement;
2705
+ }, HTMLDivElement>;
2706
+ export { _default as TimeAxis }
2707
+ export { _default as XAxis }
2708
+
2709
+ export declare function detectInterval(times: number[]): number;
2710
+
2168
2711
  export declare const dracula: ThemePreset;
2169
2712
 
2170
2713
  /** Payload for {@link ChartOptions.onEdgeReached}. */
2171
- declare interface EdgeReachedInfo {
2714
+ export declare interface EdgeReachedInfo {
2172
2715
  side: EdgeSide;
2173
2716
  /** Time units the user pulled past the soft bound. */
2174
2717
  overshoot: number;
@@ -2177,7 +2720,9 @@ declare interface EdgeReachedInfo {
2177
2720
  }
2178
2721
 
2179
2722
  /** Which data side the user pulled past during a gesture. */
2180
- declare type EdgeSide = 'left' | 'right';
2723
+ export declare type EdgeSide = 'left' | 'right';
2724
+
2725
+ declare type EdgeSide_2 = 'left' | 'right';
2181
2726
 
2182
2727
  /**
2183
2728
  * Host-controlled visual state for a chart edge:
@@ -2186,7 +2731,7 @@ declare type EdgeSide = 'left' | 'right';
2186
2731
  * - `no-data`: a dashed boundary line + "No more data" label appears at the data edge.
2187
2732
  * - `has-more`: reserved — currently behaves like `idle`. Use when more data exists but is not being fetched.
2188
2733
  */
2189
- declare type EdgeState = 'idle' | 'loading' | 'no-data' | 'has-more';
2734
+ export declare type EdgeState = 'idle' | 'loading' | 'no-data' | 'has-more';
2190
2735
 
2191
2736
  declare class EventEmitter<Events = Record<string, Listener>> {
2192
2737
  private listeners;
@@ -2196,6 +2741,12 @@ declare class EventEmitter<Events = Record<string, Listener>> {
2196
2741
  removeAllListeners(): void;
2197
2742
  }
2198
2743
 
2744
+ /**
2745
+ * Plain staggered fade-in, no geometry motion. Works for both bar and
2746
+ * candlestick series.
2747
+ */
2748
+ export declare function fadeIntro(): WaveIntroFn;
2749
+
2199
2750
  /**
2200
2751
  * Fill a rounded rectangle with per-corner masking, using manual `arcTo` so the
2201
2752
  * output is deterministic and independent of `CanvasRenderingContext2D.roundRect`
@@ -2218,7 +2769,7 @@ export declare function formatCompact(v: number, opts?: {
2218
2769
  decimals?: number;
2219
2770
  }): string;
2220
2771
 
2221
- export declare function formatDate(timestamp: number): string;
2772
+ export declare function formatDate(timestamp: number, opts?: TimeFormatOptions): string;
2222
2773
 
2223
2774
  /**
2224
2775
  * Full-precision display that adapts decimal count to the value's magnitude.
@@ -2227,7 +2778,7 @@ export declare function formatDate(timestamp: number): string;
2227
2778
  */
2228
2779
  export declare function formatPriceAdaptive(v: number): string;
2229
2780
 
2230
- export declare function formatTime(timestamp: number, interval: number): string;
2781
+ export declare function formatTime(timestamp: number, interval: number, opts?: TimeFormatOptions): string;
2231
2782
 
2232
2783
  declare type FrameKind = 'main' | 'overlay';
2233
2784
 
@@ -2242,10 +2793,103 @@ declare interface FrameTimingSample {
2242
2793
 
2243
2794
  export declare const githubLight: ThemePreset;
2244
2795
 
2796
+ /** Bars fade-grow up from the baseline in a left-to-right wave — the
2797
+ * default intro. */
2798
+ export declare function growIntro(): BarIntroFn;
2799
+
2245
2800
  export declare const gruvbox: ThemePreset;
2246
2801
 
2247
2802
  export declare const handwritten: ThemePreset;
2248
2803
 
2804
+ /** One cell of a heatmap matrix — a (column, row) coordinate with a magnitude. */
2805
+ export declare interface HeatmapCellData {
2806
+ /** Column key. Column order follows first appearance unless {@link HeatmapSeriesOptions.columns} pins it. */
2807
+ x: string;
2808
+ /** Row key. Row order follows first appearance unless {@link HeatmapSeriesOptions.rows} pins it. */
2809
+ y: string;
2810
+ /** Magnitude mapped onto the sequential color ramp. */
2811
+ value: number;
2812
+ /** Explicit fill override for this cell. Skips the ramp entirely. */
2813
+ color?: string;
2814
+ }
2815
+
2816
+ /** Per-cell value labels drawn inside heatmap cells. */
2817
+ export declare interface HeatmapCellLabelsOptions {
2818
+ /** Font size in CSS pixels. Default: 10. */
2819
+ fontSize?: number;
2820
+ /**
2821
+ * Value formatter. Default: decimals adapt to the value domain — 2 for
2822
+ * unit-scale domains (correlations), integers for wide ones, compact
2823
+ * notation (`1.2K`) past 1000.
2824
+ */
2825
+ format?: (value: number) => string;
2826
+ }
2827
+
2828
+ export declare const HeatmapSeries: DefineComponent<__VLS_Props_4, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_4> & Readonly<{}>, {
2829
+ visible: boolean;
2830
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2831
+
2832
+ /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
2833
+ * so hosts that never render heatmaps don't bundle this module. */
2834
+ export declare const HeatmapSeriesDef: SeriesDefinition<HeatmapSeriesOptions>;
2835
+
2836
+ /** Visual options for a heatmap series. */
2837
+ export declare interface HeatmapSeriesOptions {
2838
+ /**
2839
+ * Sequential ramp stops, low → high, interpolated perceptually (OKLab).
2840
+ * Two stops give a classic single-hue ramp; three make a diverging scale.
2841
+ * Default: derived from the theme — a faint wash of the accent color near
2842
+ * the surface up to the full accent (`theme.heatmap.colors` when present).
2843
+ */
2844
+ colors?: string[];
2845
+ /** Domain minimum mapped to the first ramp stop. Default: the data minimum. */
2846
+ min?: number;
2847
+ /** Domain maximum mapped to the last ramp stop. Default: the data maximum. */
2848
+ max?: number;
2849
+ /** Surface gap between adjacent cells in CSS pixels. Default: 2. */
2850
+ gap?: number;
2851
+ /** Cell corner radius in CSS pixels. Default: 3. */
2852
+ cornerRadius?: number;
2853
+ /** Draw row labels (left) and column labels (bottom). Default: true. */
2854
+ axisLabels?: boolean;
2855
+ /** Draw the value inside each cell (auto-skipped when it doesn't fit). Default: false. */
2856
+ cellLabels?: boolean | HeatmapCellLabelsOptions;
2857
+ /** Explicit column order. Keys absent from the data render as empty columns. */
2858
+ columns?: string[];
2859
+ /** Explicit row order. Keys absent from the data render as empty rows. */
2860
+ rows?: string[];
2861
+ /**
2862
+ * Entrance duration per cell in milliseconds — the diagonal reveal wave on
2863
+ * first paint / grid-shape change. `0` paints instantly.
2864
+ * Default: chart animation config (600).
2865
+ */
2866
+ entryMs?: number;
2867
+ /**
2868
+ * Value/color tween duration when a cell's value changes in place, and the
2869
+ * hover-lift ease. `0` snaps. Default: chart animation config (300).
2870
+ */
2871
+ updateMs?: number;
2872
+ }
2873
+
2874
+ /** A spatial matrix renderer with no time axis (Heatmap). Has no time-series queries. */
2875
+ export declare interface HeatmapSeriesRenderer extends BaseSeriesRenderer {
2876
+ readonly kind: 'heatmap';
2877
+ }
2878
+
2879
+ export declare const HeatmapTooltip: DefineComponent<__VLS_Props_7, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_7> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2880
+
2881
+ /**
2882
+ * Velocity-matched cubic Hermite Y transition. Direction-aware: per-call
2883
+ * `expandMs` (outward, default 250 ms via the engine) and `contractMs`
2884
+ * (inward, default 2500 ms — sticky-Y) are supplied through `retarget()`.
2885
+ *
2886
+ * Default Y transition. Bounded duration — after the supplied settle each
2887
+ * side lands exactly at the target with zero velocity, unlike spring's
2888
+ * asymptotic approach. Predictable for animations whose end-state matters
2889
+ * (axis labels can settle in a known time).
2890
+ */
2891
+ export declare function hermite(): TransitionFactory<YRange>;
2892
+
2249
2893
  export declare const highContrast: ThemePreset;
2250
2894
 
2251
2895
  /** Horizontal padding expressed as a fixed pixel offset or a number of data intervals. */
@@ -2263,6 +2907,17 @@ export declare interface HoverInfo {
2263
2907
 
2264
2908
  export declare const InfoBar: __VLS_WithTemplateSlots_2<typeof __VLS_component_2, __VLS_TemplateResult_2["slots"]>;
2265
2909
 
2910
+ export declare function isDarkBg(bg: string): boolean;
2911
+
2912
+ /**
2913
+ * Narrow a renderer to the time-axis variant. A capability check, not a
2914
+ * `kind` allowlist — any renderer implementing the required time-series
2915
+ * queries (own a `getTimeBounds()`) counts, including custom series kinds.
2916
+ * The chart's viewport, crosshair, interval detection, and Y autoscale all
2917
+ * dispatch through this guard.
2918
+ */
2919
+ export declare function isTimeSeriesRenderer(renderer: SeriesRenderer): renderer is TimeSeriesRenderer;
2920
+
2266
2921
  export declare const lavenderMist: ThemePreset;
2267
2922
 
2268
2923
  export declare const Legend: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
@@ -2312,6 +2967,14 @@ declare interface LegendItemOverride {
2312
2967
 
2313
2968
  declare type LegendMode = 'toggle' | 'isolate' | 'solo';
2314
2969
 
2970
+ /** Payload for the `onToggle` prop — one entry per user click, regardless of built-in vs custom rendering. */
2971
+ declare interface LegendToggleInfo {
2972
+ /** The clicked item's id (matches {@link LegendItem.id}). */
2973
+ id: string;
2974
+ /** Which interaction produced this change. */
2975
+ action: 'toggle' | 'isolate' | 'unisolate';
2976
+ }
2977
+
2315
2978
  export declare const lightPink: ThemePreset;
2316
2979
 
2317
2980
  /** Internal bookkeeping for a registered reference line. `coord` is a Y value (horizontal) or normalized epoch ms (vertical). */
@@ -2333,6 +2996,91 @@ declare interface LineEntry {
2333
2996
  */
2334
2997
  declare type LineEntryAnimation = 'none' | 'grow' | 'fade';
2335
2998
 
2999
+ /** What one intro frame should look like. Every field is optional — an empty
3000
+ * object renders the frame settled. */
3001
+ export declare interface LineIntroDirectives {
3002
+ /**
3003
+ * Horizontal clip window in bitmap pixels. Omitted sides default to the
3004
+ * pane edges, so `{ toX }` is a left-to-right reveal and `{ fromX }` a
3005
+ * right-to-left one.
3006
+ */
3007
+ clip?: {
3008
+ fromX?: number;
3009
+ toX?: number;
3010
+ };
3011
+ /**
3012
+ * Draw a stroke-only ghost of the full line under the main pass at this
3013
+ * alpha (the area fill is left to the main pass).
3014
+ */
3015
+ ghostAlpha?: number;
3016
+ /**
3017
+ * Head-glow anchors — the renderer draws a pulse dot per visible layer at
3018
+ * each head's `time` (bell-faded over the intro window). Heads are
3019
+ * skipped for stacked series, where a single layer's Y is meaningless.
3020
+ */
3021
+ heads?: Array<{
3022
+ x: number;
3023
+ time: number;
3024
+ }>;
3025
+ /**
3026
+ * Per-value transform applied to every rendered value (stroke, area,
3027
+ * stacked cumulative, trailing endpoint, overlay pulse) via the
3028
+ * renderer's `effectiveValue` hook.
3029
+ */
3030
+ value?: (args: LineIntroValueArgs) => number;
3031
+ }
3032
+
3033
+ /** One frame of intro choreography. See the module docs for the contract. */
3034
+ export declare type LineIntroFn = (frame: LineIntroFrame) => LineIntroDirectives;
3035
+
3036
+ /** Read view of one intro frame — everything a {@link LineIntroFn} may need. */
3037
+ export declare interface LineIntroFrame {
3038
+ /** Linear intro progress in `[0, 1]` over the whole reveal window. */
3039
+ progress: number;
3040
+ /** Visible time range. */
3041
+ range: VisibleRange;
3042
+ /**
3043
+ * Plot-area width in bitmap pixels — the span `timeToX` maps the visible
3044
+ * range onto (excludes the Y-axis strip sharing the canvas).
3045
+ */
3046
+ width: number;
3047
+ /** Plot-area height in bitmap pixels (excludes the X-axis strip). */
3048
+ height: number;
3049
+ /** The series' stacking mode — path-based intros usually degrade to a plain clip when stacked. */
3050
+ stacking: StackingMode;
3051
+ /** Time → bitmap X through the live time scale. */
3052
+ timeToX(time: number): number;
3053
+ /** Bitmap X → time — the inverse of {@link timeToX}, for mapping a clip front back into the time domain. */
3054
+ xToTime(x: number): number;
3055
+ /** Value → bitmap Y through the live Y scale. */
3056
+ valueToY(value: number): number;
3057
+ /** Number of layers in the series. */
3058
+ layerCount: number;
3059
+ /** Visible data of one layer (memoized per frame). */
3060
+ layerData(layerIndex: number): readonly TimePoint[];
3061
+ /** Mean of the layer's visible finite values, or `null` for an empty/poisoned layer (memoized per frame). */
3062
+ layerMean(layerIndex: number): number | null;
3063
+ /**
3064
+ * Bitmap-space polyline of the first visible layer (finite values only,
3065
+ * memoized per frame), or `null` when no layer has two drawable points.
3066
+ */
3067
+ primaryPath(): ReadonlyArray<{
3068
+ x: number;
3069
+ y: number;
3070
+ time: number;
3071
+ }> | null;
3072
+ }
3073
+
3074
+ /** Arguments handed to {@link LineIntroDirectives.value} for every rendered value. */
3075
+ export declare interface LineIntroValueArgs {
3076
+ layerIndex: number;
3077
+ time: number;
3078
+ /** The value the renderer would draw without the intro (live smoothing included). */
3079
+ value: number;
3080
+ /** Normalized x-position of `time` across the visible range, clamped to `[0, 1]`. */
3081
+ position: number;
3082
+ }
3083
+
2336
3084
  /** Arguments handed to a {@link LinePainter} once per finite run. */
2337
3085
  export declare interface LinePaintArgs {
2338
3086
  /**
@@ -2372,7 +3120,9 @@ declare interface LinePoint {
2372
3120
  y: number;
2373
3121
  }
2374
3122
 
2375
- export declare const LineSeries: DefineComponent<__VLS_Props_4, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_4> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3123
+ export declare const LineSeries: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_5> & Readonly<{}>, {
3124
+ visible: boolean;
3125
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2376
3126
 
2377
3127
  /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
2378
3128
  * so hosts that never render lines don't bundle this module. */
@@ -2441,6 +3191,66 @@ export declare interface LineSeriesOptions {
2441
3191
  * @see LineSeriesOptions.entryAnimation
2442
3192
  */
2443
3193
  entryMs?: number | false;
3194
+ /**
3195
+ * Initial-load reveal duration in milliseconds. On the first data seed
3196
+ * (empty → non-empty) the line draws itself left-to-right — stroke and
3197
+ * area sweep in behind a glowing head that rides the reveal front. The
3198
+ * full sweep lasts ~2× `introMs`. Default: `500`.
3199
+ *
3200
+ * ```
3201
+ * // Per-series override:
3202
+ * <LineSeries options={{ introMs: 800 }} data={data} />
3203
+ *
3204
+ * // Chart-level default:
3205
+ * <ChartContainer animations={{ series: { line: { intro: 800 } } }}>
3206
+ * <LineSeries data={data} />
3207
+ * </ChartContainer>
3208
+ * ```
3209
+ *
3210
+ * `false` or `0` disables the intro. Bulk re-seeds of a non-empty series
3211
+ * never replay it. Skipped entirely under `prefers-reduced-motion`.
3212
+ */
3213
+ introMs?: number | false;
3214
+ /**
3215
+ * Initial-load reveal choreography — a `LineIntroFn` called once per
3216
+ * frame while the intro plays. The shipped styles are factories over the
3217
+ * same contract: `unfoldIntro()` (the default — amplitude springs from
3218
+ * the mean into shape), `sweepIntro()` (left-to-right draw-on with a
3219
+ * glowing head), `traceIntro()` (faint ghost, then an ink sweep),
3220
+ * `plotterIntro()` (head advances at constant path speed), `centerOutIntro()`
3221
+ * (clip opens from the pane's center outward). Style is specific to the
3222
+ * line series; there is no chart-level override for style — only for
3223
+ * duration (`introMs`).
3224
+ *
3225
+ * @see LineIntroFn — the custom-fn contract (frame → directives).
3226
+ * @see introMs — cross-linked duration for this animation.
3227
+ */
3228
+ introAnimation?: LineIntroFn;
3229
+ /**
3230
+ * History-prepend reveal — plays when older points land at the front of
3231
+ * the series (the `EdgeLoader` load-more-on-scroll path). Default: the
3232
+ * line back-fills itself from the data boundary into the new history
3233
+ * behind a moving clip front (`backfillSweepIntro()`).
3234
+ *
3235
+ * A custom `LineIntroFn` receives a localized frame: `range` is the
3236
+ * prepended time span with `range.to` at the data boundary (not the
3237
+ * visible window), `width` is that span's bitmap width, and `progress`
3238
+ * runs over the reveal. Value-transform directives are applied to the
3239
+ * prepended points only.
3240
+ *
3241
+ * `'none'` disables the reveal — prepended points appear instantly.
3242
+ *
3243
+ * @see historyRevealMs — cross-linked duration for this animation.
3244
+ */
3245
+ historyReveal?: LineIntroFn | 'none';
3246
+ /**
3247
+ * History-prepend reveal duration in milliseconds — the full sweep lasts
3248
+ * ~2×. Default: `400`. `false` or `0` disables the reveal. Skipped
3249
+ * entirely under `prefers-reduced-motion`.
3250
+ *
3251
+ * @see LineSeriesOptions.historyReveal
3252
+ */
3253
+ historyRevealMs?: number | false;
2444
3254
  /**
2445
3255
  * How long the displayed last value takes to catch up to the actual one
2446
3256
  * on every `updateLastPoint`. Default: `250` ms.
@@ -2502,11 +3312,90 @@ export declare interface LineSeriesOptions {
2502
3312
  /** Color below the threshold. Default: the series' resolved color. */
2503
3313
  below?: string;
2504
3314
  };
3315
+ /**
3316
+ * Dot markers at each data point. Hidden by default.
3317
+ *
3318
+ * Dots ride the same animated geometry as the stroke (entrance unfurl,
3319
+ * live-value smoothing, stacked cumulative), so they glide with the line
3320
+ * instead of snapping. When the visible points sit too dense to read as
3321
+ * discrete markers (average spacing under ~1.5 dot diameters, e.g. zoomed
3322
+ * far out), the dots are skipped for that frame — they'd merge into a fat
3323
+ * line and hide the stroke. Zooming back in brings them back.
3324
+ *
3325
+ * ```
3326
+ * <LineSeries data={data} options={{ points: { visible: true } }} />
3327
+ * ```
3328
+ */
3329
+ points?: {
3330
+ /** Whether a dot is drawn at each data point. */
3331
+ visible: boolean;
3332
+ /** Dot radius in CSS pixels. Default: `3`. */
3333
+ radius?: number;
3334
+ /** Fill color override. Default: the layer's resolved series color. */
3335
+ color?: string;
3336
+ };
2505
3337
  }
2506
3338
 
2507
3339
  declare type Listener = (...args: any[]) => void;
2508
3340
 
2509
- export declare const Marker: DefineComponent<__VLS_Props_8, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_8> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3341
+ /** Read view of one loading-indicator frame — everything a {@link LoadingIndicatorFn} may need. */
3342
+ export declare interface LoadingIndicatorArgs {
3343
+ scope: BitmapCoordinateSpace;
3344
+ theme: ChartTheme;
3345
+ /**
3346
+ * Plot-area size in CSS/media pixels (excludes the axis bands) — multiply
3347
+ * by the scope's pixel ratios to get bitmap units.
3348
+ */
3349
+ chartMediaWidth: number;
3350
+ chartMediaHeight: number;
3351
+ /** Animation timestamp, typically `performance.now()`. */
3352
+ now: number;
3353
+ /**
3354
+ * Which edge this indicator's stage is anchored to. `'left'` means the
3355
+ * data boundary sits at local x = `chartMediaWidth` (the stage extends
3356
+ * further away from the data as x decreases); `'right'` means the
3357
+ * boundary sits at local x = `0`. Present only when painted by
3358
+ * `chart.setEdgeIndicator` — absent for a hypothetical future non-edge
3359
+ * caller.
3360
+ */
3361
+ side?: EdgeSide_2;
3362
+ /**
3363
+ * Y position (media px, within `[0, chartMediaHeight]`) of the boundary
3364
+ * point on the chart's primary visible time series — lets an indicator
3365
+ * start exactly where the real data leaves off. `undefined` when there's
3366
+ * no visible time series or no data resolvable at the boundary.
3367
+ */
3368
+ edgeValueY?: number;
3369
+ /**
3370
+ * Media px between adjacent bars at the chart's current zoom level — lets
3371
+ * an indicator size its placeholder shapes to match the real candles/bars
3372
+ * that will render once data lands. `undefined` when not resolvable (e.g.
3373
+ * a chart with no meaningful viewport span yet).
3374
+ */
3375
+ barSpacing?: number;
3376
+ /**
3377
+ * Kind of the primary visible time series (`'candlestick'`, `'line'`,
3378
+ * `'bar'`, ...) — lets an indicator adapt its shape to what's actually
3379
+ * loading instead of always drawing one fixed shape. `undefined` when
3380
+ * unresolvable.
3381
+ */
3382
+ seriesKind?: SeriesKind;
3383
+ /**
3384
+ * Report the placeholder shapes drawn this frame. The chart snapshots the
3385
+ * latest report and, when the fetched history lands, hands it to the
3386
+ * series' history reveal — a morph-style reveal (`skeletonMorphIntro`)
3387
+ * grows the real candles out of these exact placeholders instead of
3388
+ * cross-fading. Optional both ways: an indicator that never reports (or
3389
+ * a chart caller that doesn't collect) simply falls back to the plain
3390
+ * reveal.
3391
+ */
3392
+ reportPlaceholders?(bars: PlaceholderBar[]): void;
3393
+ }
3394
+
3395
+ /** Pure function contract for a pluggable loading indicator. */
3396
+ export declare type LoadingIndicatorFn = (args: LoadingIndicatorArgs) => void;
3397
+
3398
+ export declare const Marker: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2510
3399
 
2511
3400
  /**
2512
3401
  * A point annotation pinned to a `time` (X) and a `value` (Y) — "anomaly opened
@@ -2528,7 +3417,12 @@ export declare interface MarkerConfig {
2528
3417
  shape?: MarkerShape;
2529
3418
  /** Reuse the line pulse halo around the anchor. Default: `false`. */
2530
3419
  pulse?: boolean;
2531
- /** Optional text label drawn in a pill next to the anchor. */
3420
+ /**
3421
+ * Optional text label, drawn as a callout chip whose tail points at the
3422
+ * anchor — above it for `arrow-down` / `dot` / `circle`, below for
3423
+ * `arrow-up`, flipping when the plot edge would cut it off. On arrow
3424
+ * shapes the tail replaces the glyph.
3425
+ */
2532
3426
  label?: string;
2533
3427
  /** Color override. Falls back to the series color (when `seriesId` is set), then the theme line color. */
2534
3428
  color?: string;
@@ -2546,7 +3440,13 @@ declare interface MarkerEntry {
2546
3440
  color?: string;
2547
3441
  }
2548
3442
 
2549
- /** Glyph drawn at the marker anchor. Arrows point their tip *at* the anchor point. */
3443
+ /**
3444
+ * Glyph drawn at the marker anchor. On a bare marker, arrows point their tip
3445
+ * *at* the anchor point. On a labeled marker the callout tail does the
3446
+ * pointing instead — the arrow glyph is dropped and the shape only picks the
3447
+ * callout's side: above the anchor for `arrow-down`, below for `arrow-up`.
3448
+ * `dot` and `circle` keep their glyph under the callout.
3449
+ */
2550
3450
  export declare type MarkerShape = 'dot' | 'circle' | 'arrow-up' | 'arrow-down';
2551
3451
 
2552
3452
  export declare const materialPalenight: ThemePreset;
@@ -2564,8 +3464,37 @@ export declare const minimalLight: ThemePreset;
2564
3464
 
2565
3465
  export declare const mintBreeze: ThemePreset;
2566
3466
 
3467
+ /**
3468
+ * Blend two colors perceptually (OKLab), `t` in [0, 1]. Accepts `#rgb`,
3469
+ * `#rrggbb`, and `rgb()/rgba()` inputs; anything else (named colors,
3470
+ * `hsl()`) falls back to a hard switch at `t = 0.5` — it never produces a
3471
+ * NaN canvas fill. An `rgba()` input's alpha interpolates linearly alongside
3472
+ * the OKLab channels — the result is an `rgba()` string whenever either
3473
+ * endpoint is translucent, an opaque hex otherwise. Results are cached on a
3474
+ * quantized `t` (1/256 steps), so per-frame per-cell sampling stays
3475
+ * allocation-free after the first frame.
3476
+ */
3477
+ export declare function mixColors(from: string, to: string, t: number): string;
3478
+
2567
3479
  export declare const monokaiPro: ThemePreset;
2568
3480
 
3481
+ /**
3482
+ * One placeholder shape a loading indicator painted at the data boundary,
3483
+ * mapped into bitmap space — what a morph-style history reveal grows the
3484
+ * real candles out of. Re-anchored to the boundary every frame, so the
3485
+ * morph stays glued while the user keeps panning.
3486
+ */
3487
+ declare interface MorphPlaceholder {
3488
+ /** Bar center X, bitmap px. */
3489
+ x: number;
3490
+ /** Bar center Y, bitmap px. */
3491
+ y: number;
3492
+ /** Half the body height, bitmap px. */
3493
+ halfHeight: number;
3494
+ /** Body width, bitmap px. */
3495
+ width: number;
3496
+ }
3497
+
2569
3498
  /**
2570
3499
  * Omnivorous `data` shape for line and bar series. Accepts, interchangeably:
2571
3500
  * - `TimePointInput[]` — one auto-named layer (the common single-series case);
@@ -2576,9 +3505,9 @@ export declare const monokaiPro: ThemePreset;
2576
3505
  * Everything normalizes to `SeriesLayer[]` internally (see `toLayers`). Time
2577
3506
  * accepts epoch milliseconds or a `Date` on every point.
2578
3507
  */
2579
- declare type MultiLayerData = TimePointInput[] | SeriesLayer<TimePointInput> | Array<TimePointInput[] | SeriesLayer<TimePointInput>>;
3508
+ export declare type MultiLayerData = TimePointInput[] | SeriesLayer<TimePointInput> | Array<TimePointInput[] | SeriesLayer<TimePointInput>>;
2580
3509
 
2581
- declare const Navigator_2: DefineComponent<__VLS_Props_9, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_9> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
3510
+ declare const Navigator_2: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
2582
3511
  stripRef: HTMLDivElement;
2583
3512
  }, any>;
2584
3513
  export { Navigator_2 as Navigator }
@@ -2670,7 +3599,7 @@ export declare const nightOwl: ThemePreset;
2670
3599
  /** Convert a {@link TimeValue} (number ms or Date) to a millisecond timestamp. */
2671
3600
  export declare function normalizeTime(t: TimeValue): number;
2672
3601
 
2673
- export declare const NumberFlow: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {
3602
+ export declare const NumberFlow: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {
2674
3603
  locale: string;
2675
3604
  spinDuration: number;
2676
3605
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
@@ -2693,7 +3622,7 @@ export declare type OHLCInput = Omit<OHLCData, 'time'> & {
2693
3622
  export declare const oneDarkPro: ThemePreset;
2694
3623
 
2695
3624
  /** Overlay render state passed to {@link SeriesRenderer.drawOverlay}. */
2696
- declare interface OverlayRenderContext {
3625
+ export declare interface OverlayRenderContext {
2697
3626
  scope: BitmapCoordinateSpace;
2698
3627
  timeScale: XScale;
2699
3628
  yScale: YScale;
@@ -2753,6 +3682,13 @@ declare interface PanZoomTarget {
2753
3682
  zoomAt(centerTime: number, factor: number, chartWidth?: number): void;
2754
3683
  }
2755
3684
 
3685
+ /**
3686
+ * Parse an {@link AnimationTime} to milliseconds. Invalid strings throw at
3687
+ * config-resolution time, so a typo surfaces at startup, not silently as zero
3688
+ * animation later. Used once per field in `resolveAnimationsConfig`.
3689
+ */
3690
+ export declare function parseAnimationTime(value: AnimationTime): Milliseconds;
3691
+
2756
3692
  export declare const peachCream: ThemePreset;
2757
3693
 
2758
3694
  /**
@@ -2968,7 +3904,9 @@ declare interface PieOtherOptions {
2968
3904
  color?: string;
2969
3905
  }
2970
3906
 
2971
- export declare const PieSeries: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_5> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3907
+ export declare const PieSeries: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_6> & Readonly<{}>, {
3908
+ visible: boolean;
3909
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
2972
3910
 
2973
3911
  /** Series definition for `chart.addSeries` — keeps the chart renderer-agnostic
2974
3912
  * so hosts that never render pies don't bundle this module. */
@@ -2982,6 +3920,16 @@ export declare interface PieSeriesOptions {
2982
3920
  innerRadiusRatio: number;
2983
3921
  /** Gap between slices in degrees. Default: 1.15° (≈ 0.02 rad). */
2984
3922
  padAngle: number;
3923
+ /**
3924
+ * Rounds each slice's corners in CSS pixels — the two where the outer rim
3925
+ * meets the straight edges, plus two more on the inner rim once
3926
+ * `innerRadiusRatio > 0` carves out a donut hole. Default: 3 (matching the
3927
+ * bar/candlestick families); pass 0 for sharp wedges. Thin rings and narrow
3928
+ * slices automatically clamp the radius down to whatever they can fit
3929
+ * without the corners overlapping, so a value that's too large for a given
3930
+ * slice degrades gracefully instead of producing a malformed shape.
3931
+ */
3932
+ cornerRadius?: number;
2985
3933
  /** Display the label shown in the tooltip. */
2986
3934
  label?: string;
2987
3935
  /** Per-slice label rendering on the pie itself. See {@link PieLabelsOptions}. */
@@ -3002,6 +3950,27 @@ export declare interface PieSeriesOptions {
3002
3950
  * value.
3003
3951
  */
3004
3952
  animate?: boolean;
3953
+ /**
3954
+ * Initial-load reveal duration in milliseconds. On the first data seed
3955
+ * (empty → non-empty) slices unfurl clockwise over this total duration,
3956
+ * then the outside labels draw in. Default: `600`.
3957
+ *
3958
+ * ```
3959
+ * // Per-series override:
3960
+ * <PieSeries options={{ entryMs: 900 }} data={data} />
3961
+ *
3962
+ * // Chart-level default:
3963
+ * <ChartContainer animations={{ series: { pie: { entry: 900 } } }}>
3964
+ * <PieSeries data={data} />
3965
+ * </ChartContainer>
3966
+ * ```
3967
+ *
3968
+ * `false` or `0` disables the intro (a chart-level
3969
+ * `animations.series.pie: false` also force-disables it). Bulk re-seeds
3970
+ * of a non-empty series never replay it. Skipped entirely under
3971
+ * `prefers-reduced-motion`.
3972
+ */
3973
+ entryMs?: number | false;
3005
3974
  /**
3006
3975
  * Per-slice radial *depth* gradient — a subtle lightening from the slice
3007
3976
  * center toward its edge that gives the pie a soft 3D sheen. On by default.
@@ -3046,7 +4015,7 @@ export declare interface PieSeriesOptions {
3046
4015
  }
3047
4016
 
3048
4017
  /** A spatial renderer with no time axis (Pie). Has no time-series queries. */
3049
- declare interface PieSeriesRenderer extends BaseSeriesRenderer {
4018
+ export declare interface PieSeriesRenderer extends BaseSeriesRenderer {
3050
4019
  readonly kind: 'pie';
3051
4020
  }
3052
4021
 
@@ -3061,6 +4030,51 @@ export declare interface PieSliceData {
3061
4030
 
3062
4031
  export declare const PieTooltip: __VLS_WithTemplateSlots_5<typeof __VLS_component_5, __VLS_TemplateResult_5["slots"]>;
3063
4032
 
4033
+ /**
4034
+ * One placeholder shape a loading indicator painted, in chart-media pixels
4035
+ * relative to the data boundary — the hand-off currency between an edge
4036
+ * indicator and a series' history reveal. `offsetX` grows away from the
4037
+ * data (into the overshoot zone), so the geometry stays glued to the
4038
+ * boundary while the user keeps panning.
4039
+ */
4040
+ declare interface PlaceholderBar {
4041
+ /** Distance from the data boundary to the bar's center, media px, ≥ 0. */
4042
+ offsetX: number;
4043
+ /** Bar center Y, media px within the plot area. */
4044
+ y: number;
4045
+ /** Half the body height, media px. */
4046
+ halfHeight: number;
4047
+ /** Body width, media px. */
4048
+ width: number;
4049
+ }
4050
+
4051
+ /**
4052
+ * Chart-recorder pen: the reveal front advances at constant speed along the
4053
+ * polyline's arc length (bitmap space), so it decelerates through volatile
4054
+ * stretches and races across flat ones. Falls back to the plain sweep for
4055
+ * stacked series and degenerate paths.
4056
+ */
4057
+ export declare function plotterIntro(): LineIntroFn;
4058
+
4059
+ /**
4060
+ * Payload for `pointClick` / `pointDoubleClick`. `spatialHit` resolves a
4061
+ * no-time-axis series (pie, heatmap, or a custom spatial kind) directly
4062
+ * under the pointer — for time-series series (line/bar/candlestick, or a
4063
+ * custom time-axis kind), resolve the point yourself from `time`, e.g. via
4064
+ * `buildHoverSnapshots(chart, { time: info.time, cacheKey: '…' })` or
4065
+ * `chart.getDataAtTime(seriesId, info.time)`.
4066
+ */
4067
+ export declare interface PointClickInfo {
4068
+ mediaX: number;
4069
+ mediaY: number;
4070
+ time: number;
4071
+ y: number;
4072
+ spatialHit: {
4073
+ seriesId: string;
4074
+ index: number;
4075
+ } | null;
4076
+ }
4077
+
3064
4078
  export declare const quietLight: ThemePreset;
3065
4079
 
3066
4080
  /** Axis-aligned rectangle in media (CSS) coordinates. */
@@ -3071,7 +4085,7 @@ declare interface Rect {
3071
4085
  height: number;
3072
4086
  }
3073
4087
 
3074
- export declare const ReferenceLine: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
4088
+ export declare const ReferenceLine: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3075
4089
 
3076
4090
  /**
3077
4091
  * A straight reference line across the plot — a horizontal threshold / baseline
@@ -3086,9 +4100,9 @@ export declare interface ReferenceLineConfig {
3086
4100
  value?: number;
3087
4101
  /** Vertical line at this `time` (epoch ms or `Date`). Mutually exclusive with {@link value}. */
3088
4102
  time?: TimeValue;
3089
- /** Line and label-pill color. Default: the theme line color. */
4103
+ /** Line and label-chip accent color. Default: the theme line color. */
3090
4104
  color?: string;
3091
- /** Optional text label drawn in a pill at the line's near end. */
4105
+ /** Optional text label drawn in an annotation chip at the line's near end. */
3092
4106
  label?: string;
3093
4107
  /** Dash style. Default: `'dashed'`. */
3094
4108
  style?: ReferenceLineStyle;
@@ -3113,7 +4127,7 @@ declare interface RegionEntry {
3113
4127
  }
3114
4128
 
3115
4129
  /**
3116
- * Register the four built-in series so the string form
4130
+ * Register the five built-in series so the string form
3117
4131
  * `chart.addSeries('line', …)` resolves. Call it once at startup.
3118
4132
  *
3119
4133
  * Importing this helper pulls every renderer into the bundle — hosts that
@@ -3143,7 +4157,7 @@ export declare function registerSeriesDefinition(def: SeriesDefinition): void;
3143
4157
  * but spatial renderers (Pie) need the raw pixel reservation to keep their
3144
4158
  * layout out of the Title / InfoBar overlay regions.
3145
4159
  */
3146
- declare interface RenderPadding {
4160
+ export declare interface RenderPadding {
3147
4161
  top: number;
3148
4162
  bottom: number;
3149
4163
  }
@@ -3202,6 +4216,14 @@ declare interface RetargetOptions {
3202
4216
  contractMs?: number;
3203
4217
  }
3204
4218
 
4219
+ /**
4220
+ * Elements float up into place from below, fading in along the wave.
4221
+ * Works for both bar and candlestick series.
4222
+ */
4223
+ export declare function riseIntro(options?: {
4224
+ travel?: number;
4225
+ }): WaveIntroFn;
4226
+
3205
4227
  export declare const rosePineDawn: ThemePreset;
3206
4228
 
3207
4229
  /** DEFAULT bar painter (registered as `'rounded'`). Trusts the engine-supplied
@@ -3225,6 +4247,13 @@ export declare interface RoundedRectArgs {
3225
4247
  corners: CornerMask;
3226
4248
  }
3227
4249
 
4250
+ /**
4251
+ * Sample a multi-stop ramp at `t` in [0, 1] with perceptual interpolation
4252
+ * between adjacent stops. A single-stop ramp returns that stop; an empty
4253
+ * ramp returns transparent black (defensive — resolved options never allow it).
4254
+ */
4255
+ export declare function sampleRamp(stops: readonly string[], t: number): string;
4256
+
3228
4257
  export declare const sandDune: ThemePreset;
3229
4258
 
3230
4259
  /** Environment the chart hands a {@link SeriesDefinition} when constructing its renderer. */
@@ -3250,6 +4279,20 @@ export declare interface SeriesDefinition<O = Record<string, unknown>> {
3250
4279
  create(env: SeriesCreateEnv, options: Partial<O>): SeriesRenderer;
3251
4280
  }
3252
4281
 
4282
+ /** Which spatial series (pie, heatmap, or a custom spatial kind) is currently hovered, and its slice/cell info. */
4283
+ export declare interface SeriesHoverInfo {
4284
+ seriesId: string;
4285
+ index: number;
4286
+ info: HoverInfo | null;
4287
+ }
4288
+
4289
+ /**
4290
+ * Discriminant for the {@link SeriesRenderer} union. Open-ended — a custom
4291
+ * series (see {@link CustomSpatialSeriesRenderer} / {@link TimeSeriesRenderer})
4292
+ * picks any string that isn't one of the built-ins.
4293
+ */
4294
+ export declare type SeriesKind = 'candlestick' | 'line' | 'bar' | 'pie' | 'heatmap' | (string & {});
4295
+
3253
4296
  /**
3254
4297
  * A single named (and optionally colored) layer. Carries the layer's display
3255
4298
  * name and color *alongside* its data, so `Tooltip` / `Legend` show per-layer
@@ -3265,7 +4308,7 @@ declare interface SeriesLayer<T> {
3265
4308
  data: T[];
3266
4309
  }
3267
4310
 
3268
- declare interface SeriesRenderContext {
4311
+ export declare interface SeriesRenderContext {
3269
4312
  scope: BitmapCoordinateSpace;
3270
4313
  timeScale: XScale;
3271
4314
  yScale: YScale;
@@ -3289,9 +4332,10 @@ declare interface SeriesRenderContext {
3289
4332
 
3290
4333
  /**
3291
4334
  * Every series renderer is one of these. Discriminated on `kind`: narrow with
3292
- * `kind === 'pie'` (or `!== 'pie'`) to reach the variant-specific surface.
4335
+ * {@link isTimeSeriesRenderer} to reach the time-axis surface — spatial kinds
4336
+ * (pie, heatmap, and any custom spatial kind) have no time-series queries.
3293
4337
  */
3294
- declare type SeriesRenderer = TimeSeriesRenderer | PieSeriesRenderer;
4338
+ export declare type SeriesRenderer = TimeSeriesRenderer | PieSeriesRenderer | HeatmapSeriesRenderer | CustomSpatialSeriesRenderer;
3295
4339
 
3296
4340
  /**
3297
4341
  * Frozen, per-row snapshot of a series at a single point in time. The shape
@@ -3319,8 +4363,8 @@ export declare interface SeriesSnapshot {
3319
4363
  readonly color: string;
3320
4364
  }
3321
4365
 
3322
- /** Supported primary series types. */
3323
- export declare type SeriesType = 'candlestick' | 'line' | 'bar' | 'pie';
4366
+ /** Primary series types. Open-ended — a custom {@link SeriesDefinition} picks any string that isn't a built-in. */
4367
+ export declare type SeriesType = 'candlestick' | 'line' | 'bar' | 'pie' | 'heatmap' | (string & {});
3324
4368
 
3325
4369
  /** Width and height pair. */
3326
4370
  declare interface Size {
@@ -3328,17 +4372,97 @@ declare interface Size {
3328
4372
  height: number;
3329
4373
  }
3330
4374
 
4375
+ /**
4376
+ * "Chart skeleton" — muted placeholder candle shapes with a soft shimmer
4377
+ * band sweeping across them, the classic skeleton-screen pattern adapted for
4378
+ * a time-series stage. The bar nearest the boundary is centered on the real
4379
+ * {@link LoadingIndicatorArgs.edgeValueY} so it still visually picks up
4380
+ * where the chart leaves off; the rest are honest placeholders (a gentle
4381
+ * taper), not a prediction. Falls back to mid-height when no boundary value
4382
+ * is resolvable (e.g. an empty chart).
4383
+ *
4384
+ * Placeholder size tracks {@link LoadingIndicatorArgs.barSpacing} — the
4385
+ * chart's actual current zoom level — so bars don't visually "pop" to a
4386
+ * different size once real data lands; when it isn't resolvable, falls back
4387
+ * to a fixed gap. Wick stubs only draw for `seriesKind === 'candlestick'`
4388
+ * (or when the kind isn't resolvable, since candlestick is the common case);
4389
+ * a `'line'`/`'bar'` series gets a plain placeholder body instead, since a
4390
+ * wick reads as OHLC-specific.
4391
+ */
4392
+ export declare const skeletonLoadingIndicator: LoadingIndicatorFn;
4393
+
4394
+ /**
4395
+ * Skeleton morph: candles that land where the loading indicator's
4396
+ * placeholder bars stood grow out of those exact shapes — geometry eases
4397
+ * from the placeholder body to the real OHLC, fill blends from the muted
4398
+ * placeholder gray to the candle's own color. Candles outside the
4399
+ * placeholder zone (and any reveal with no hand-off, e.g. a custom
4400
+ * indicator that never reports its shapes) play the `fallback` instead —
4401
+ * `fadeIntro()` unless overridden.
4402
+ *
4403
+ * Meant for the `historyReveal` option, paired with an `EdgeLoader` whose
4404
+ * indicator reports placeholders (`skeletonLoadingIndicator` does).
4405
+ */
4406
+ export declare function skeletonMorphIntro(options?: {
4407
+ fallback?: CandleIntroFn;
4408
+ }): CandleIntroFn;
4409
+
3331
4410
  export declare type SliceInfo = HoverInfo;
3332
4411
 
3333
4412
  /** `curve: 'smooth'` — monotone cubic. The in-flight last segment stays straight
3334
4413
  * while the trailing endpoint is growing so the head can't wobble / overshoot. */
3335
4414
  export declare const smoothCurve: LinePainter;
3336
4415
 
4416
+ /**
4417
+ * Snap factory — no animation, no parameters. Generic so it works for both
4418
+ * Y and X. Exposed so power users can opt out of axis motion without
4419
+ * disabling other animations:
4420
+ *
4421
+ * ```
4422
+ * animations: { axis: { y: { curve: snap() } } }
4423
+ * ```
4424
+ */
4425
+ export declare function snap<T extends YRange | VisibleRange = YRange>(): TransitionFactory<T>;
4426
+
3337
4427
  /** Sort order applied to a snapshot list by the helper. */
3338
4428
  export declare type SnapshotSort = 'none' | 'asc' | 'desc';
3339
4429
 
3340
4430
  export declare const solarizedLight: ThemePreset;
3341
4431
 
4432
+ /**
4433
+ * Critically-damped spring transition factory. Generic over the value type
4434
+ * so the same factory works for both Y (`YRange`) and X (`VisibleRange`).
4435
+ *
4436
+ * The factory dispatches at construction time based on the shape of the
4437
+ * initial value:
4438
+ *
4439
+ * - `{ min, max }` → {@link YRangeSpring} (direction-aware ω: expand vs
4440
+ * contract, used by the sticky-Y mechanism).
4441
+ * - `{ from, to }` → {@link VisibleRangeSpring} (single ω, no direction
4442
+ * asymmetry — X has no analog of sticky-Y).
4443
+ *
4444
+ * Both implementations carry velocity through mid-flight retargets so
4445
+ * wheel-zoom sequences and rapid streaming ticks stay continuous.
4446
+ *
4447
+ * Usage:
4448
+ * ```ts
4449
+ * animations: {
4450
+ * axis: {
4451
+ * y: { curve: spring() },
4452
+ * x: { curve: spring() },
4453
+ * },
4454
+ * }
4455
+ * ```
4456
+ *
4457
+ * The engine is the single source of truth for the per-call durations —
4458
+ * settle times come through `RetargetOptions.expandMs` / `contractMs`.
4459
+ */
4460
+ export declare function spring<T extends YRange | VisibleRange = YRange>(): TransitionFactory<T>;
4461
+
4462
+ /** Bars grow from the baseline with a soft ease-out-back overshoot past
4463
+ * their final height before settling. */
4464
+ export declare function springIntro(): BarIntroFn;
4465
+
3342
4466
  /** Stacking mode for bar/line series: off (overlap), normal (stacked), percent (100% stacked). */
3343
4467
  export declare type StackingMode = 'off' | 'normal' | 'percent';
3344
4468
 
@@ -3349,6 +4473,11 @@ export declare const steppedCurve: LinePainter;
3349
4473
  * the pre-feature stroke path. */
3350
4474
  export declare const straightCurve: LinePainter;
3351
4475
 
4476
+ /** Left-to-right draw-on behind a clip edge with a glowing head. */
4477
+ export declare function sweepIntro(options?: {
4478
+ head?: boolean;
4479
+ }): LineIntroFn;
4480
+
3352
4481
  /**
3353
4482
  * Input config for {@link createTheme}. Mirrors the structure of {@link ChartTheme}
3354
4483
  * but everything is optional except `background`. Missing values are derived automatically.
@@ -3368,6 +4497,7 @@ export declare interface ThemeConfig {
3368
4497
  seriesColors?: string[];
3369
4498
  bar?: Partial<NonNullable<ChartTheme['bar']>>;
3370
4499
  pie?: Partial<NonNullable<ChartTheme['pie']>>;
4500
+ heatmap?: Partial<NonNullable<ChartTheme['heatmap']>>;
3371
4501
  bands?: Partial<ChartTheme['bands']>;
3372
4502
  crosshair?: Partial<ChartTheme['crosshair']>;
3373
4503
  axis?: Partial<ChartTheme['axis']>;
@@ -3431,9 +4561,18 @@ declare interface TickTrackerSnapshot {
3431
4561
  readonly isAnimating: boolean;
3432
4562
  }
3433
4563
 
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>;
4564
+ /** Locale / timezone override for {@link formatTime} / {@link formatDate}. Any field omitted keeps the built-in default. */
4565
+ export declare interface TimeFormatOptions {
4566
+ /** BCP 47 locale tag (e.g. `'de-DE'`). Default: `'en-US'`. */
4567
+ locale?: string;
4568
+ /** IANA timezone name (e.g. `'America/New_York'`). Default: the browser's local timezone. */
4569
+ timeZone?: string;
4570
+ /** 12-hour clock. Default: `false` (24-hour), preserved from the original hardcoded behavior. */
4571
+ hour12?: boolean;
4572
+ }
4573
+
4574
+ /** Custom time-tick formatter, mirroring {@link YScale}'s `ValueFormatter` contract. */
4575
+ export declare type TimeFormatter = (timestamp: number, interval: number) => string;
3437
4576
 
3438
4577
  /** A single time-value data point for line and bar series. Time is a timestamp in milliseconds. */
3439
4578
  export declare interface TimePoint {
@@ -3446,7 +4585,7 @@ export declare type TimePointInput = Omit<TimePoint, 'time'> & {
3446
4585
  time: TimeValue;
3447
4586
  };
3448
4587
 
3449
- export declare const TimeRegion: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
4588
+ export declare const TimeRegion: DefineComponent<__VLS_Props_17, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_17> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
3450
4589
 
3451
4590
  /**
3452
4591
  * A translucent vertical band shading the interval `[from, to]` — Grafana's
@@ -3465,9 +4604,9 @@ export declare interface TimeRegionConfig {
3465
4604
  to?: TimeRegionEnd;
3466
4605
  /** Band fill — any CSS color, typically translucent. Default: a faint tint of `color`. */
3467
4606
  fill?: string;
3468
- /** Optional text label drawn in a pill at the top of the band. */
4607
+ /** Optional text label drawn in an annotation chip at the top of the band. */
3469
4608
  label?: string;
3470
- /** Edge-line and label-pill accent. Default: the theme's muted axis text color. */
4609
+ /** Edge-line and label-chip accent. Default: the theme's muted axis text color. */
3471
4610
  color?: string;
3472
4611
  }
3473
4612
 
@@ -3485,8 +4624,8 @@ export declare type TimeRegionEnd = TimeValue | 'now';
3485
4624
  * `getLastDataPoint` / `getSecondLastDataPoint` / `getVisibleDataPoints` are
3486
4625
  * pinned to layer 0 (see {@link BaseMultiLayerSeries}).
3487
4626
  */
3488
- declare interface TimeSeriesRenderer extends BaseSeriesRenderer {
3489
- readonly kind: 'candlestick' | 'line' | 'bar';
4627
+ export declare interface TimeSeriesRenderer extends BaseSeriesRenderer {
4628
+ readonly kind: 'candlestick' | 'line' | 'bar' | (string & {});
3490
4629
  /** Earliest/latest sample time across all owned layers, or null when empty. */
3491
4630
  getTimeBounds(): {
3492
4631
  first: number;
@@ -3507,6 +4646,9 @@ declare interface TimeSeriesRenderer extends BaseSeriesRenderer {
3507
4646
  } | null;
3508
4647
  }
3509
4648
 
4649
+ /** Custom tick-value generator — replaces the built-in `niceTimeIntervals` tier resolution entirely when installed. */
4650
+ export declare type TimeTickGenerator = (range: XRange, dataInterval: number) => number[];
4651
+
3510
4652
  /**
3511
4653
  * Accepted time input: a timestamp in **milliseconds** (like `Date.now()`) or a `Date` object.
3512
4654
  * `Date` values are converted to milliseconds internally via `Date.getTime()`.
@@ -3557,6 +4699,15 @@ export declare interface TooltipPositionArgs {
3557
4699
  offsetY?: number;
3558
4700
  }
3559
4701
 
4702
+ /**
4703
+ * Blueprint → ink: a faint stroke-only ghost of the whole line shows from
4704
+ * the first frame, while the full-color pass (area included) sweeps across
4705
+ * behind the same front as `'sweep'`.
4706
+ */
4707
+ export declare function traceIntro(options?: {
4708
+ ghostAlpha?: number;
4709
+ }): LineIntroFn;
4710
+
3560
4711
  /**
3561
4712
  * Emit path commands for one run of points onto `env.ctx`. Issues only
3562
4713
  * `moveTo` / `lineTo` / `bezierCurveTo`; it never opens or closes a path, so the
@@ -3591,7 +4742,7 @@ export declare interface TracePathArgs {
3591
4742
  * Other animation math (entry tweens, pulse, axis tick fade) stays
3592
4743
  * engine-fixed.
3593
4744
  */
3594
- declare interface Transition<T> {
4745
+ export declare interface Transition<T> {
3595
4746
  /** Current sampled position. Read by renderers on every frame. */
3596
4747
  readonly current: T;
3597
4748
  /** Active retarget destination. May equal `current` after settle. */
@@ -3617,7 +4768,7 @@ declare interface Transition<T> {
3617
4768
  * Holds the initial value so the produced transition starts pinned to
3618
4769
  * the same value the chart will render on its first frame.
3619
4770
  */
3620
- declare interface TransitionContext<T> {
4771
+ export declare interface TransitionContext<T> {
3621
4772
  initial: T;
3622
4773
  }
3623
4774
 
@@ -3627,7 +4778,7 @@ declare interface TransitionContext<T> {
3627
4778
  * smoothing strategy. Built-in factories: {@link hermite} (Y default),
3628
4779
  * {@link spring} (X default, also valid for Y), {@link snap} (no animation).
3629
4780
  */
3630
- declare type TransitionFactory<T> = (ctx: TransitionContext<T>) => Transition<T>;
4781
+ export declare type TransitionFactory<T> = (ctx: TransitionContext<T>) => Transition<T>;
3631
4782
 
3632
4783
  /** Font family and base font size used across the chart. */
3633
4784
  export declare interface Typography {
@@ -3637,6 +4788,17 @@ export declare interface Typography {
3637
4788
  fontSize: number;
3638
4789
  }
3639
4790
 
4791
+ /**
4792
+ * Amplitude unfold: every value lerps from its layer's visible mean toward
4793
+ * its real value with a soft ease-out-back overshoot, staggered
4794
+ * left-to-right by `stagger` (fraction of the window; default 0.35,
4795
+ * clamped to `[0, 0.9]` — at 1 the rightmost points would never finish
4796
+ * their tween and snap on settle).
4797
+ */
4798
+ export declare function unfoldIntro(options?: {
4799
+ stagger?: number;
4800
+ }): LineIntroFn;
4801
+
3640
4802
  export declare function useChartInstance(): ChartInstance;
3641
4803
 
3642
4804
  export declare function useCrosshairPosition(chart: ChartInstance): Ref<CrosshairPosition | null>;
@@ -3685,6 +4847,9 @@ declare type ValueColor = string | ((value: number) => string);
3685
4847
  /** Signature for a value-to-string formatter (YAxis, YLabel, Pie, Sparkline, NumberFlow). */
3686
4848
  export declare type ValueFormatter = (value: number) => string;
3687
4849
 
4850
+ /** Custom tick-value generator — replaces the built-in {1,2,5}×10^k resolution entirely when installed. */
4851
+ export declare type ValueTickGenerator = (range: YRange) => number[];
4852
+
3688
4853
  /** @deprecated Use {@link XRange} instead. Visible time range of the chart. */
3689
4854
  export declare type VisibleRange = XRange;
3690
4855
 
@@ -3698,7 +4863,7 @@ export declare type VisibleRange = XRange;
3698
4863
  * right by `bars` data intervals. Useful for "show N bars starting
3699
4864
  * here" patterns (warm-up windows for streaming charts, etc.).
3700
4865
  */
3701
- declare type VisibleRangeSpec = number | {
4866
+ export declare type VisibleRangeSpec = number | {
3702
4867
  from: TimeValue;
3703
4868
  to: TimeValue;
3704
4869
  } | {
@@ -3706,6 +4871,70 @@ declare type VisibleRangeSpec = number | {
3706
4871
  bars: number;
3707
4872
  };
3708
4873
 
4874
+ /** Directives shape common to both series (each extends it with its own
4875
+ * element/value callbacks). */
4876
+ export declare interface WaveIntroDirectives {
4877
+ /**
4878
+ * Horizontal clip window in bitmap pixels applied to the whole series
4879
+ * pass. Omitted sides default to the pane edges, so `{ toX }` is a
4880
+ * left-to-right reveal.
4881
+ */
4882
+ clip?: {
4883
+ fromX?: number;
4884
+ toX?: number;
4885
+ };
4886
+ element?: (el: WaveIntroElement) => WaveIntroTransform;
4887
+ }
4888
+
4889
+ /** Per-element fields common to the bar and candlestick intro contracts. */
4890
+ export declare interface WaveIntroElement {
4891
+ /** Eased wave progress for this element, staggered left → right. */
4892
+ progress: number;
4893
+ /** Normalized x-position across the visible window, clamped to `[0, 1]`. */
4894
+ position: number;
4895
+ /** The element's time coordinate. */
4896
+ time: number;
4897
+ }
4898
+
4899
+ /** An intro function built only from the shared fields — assignable to both
4900
+ * `BarIntroFn` and `CandleIntroFn`. */
4901
+ export declare type WaveIntroFn = (frame: WaveIntroFrame) => WaveIntroDirectives;
4902
+
4903
+ /** Frame fields common to the bar and candlestick intro contracts. */
4904
+ export declare interface WaveIntroFrame {
4905
+ /** Linear intro progress in `[0, 1]` over the whole reveal window. */
4906
+ progress: number;
4907
+ /**
4908
+ * Plot-area width in bitmap pixels — the span the time scale maps the
4909
+ * visible range onto (excludes the Y-axis strip sharing the canvas).
4910
+ */
4911
+ width: number;
4912
+ /** Plot-area height in bitmap pixels (excludes the X-axis strip). */
4913
+ height: number;
4914
+ /** Visible time range. */
4915
+ range: VisibleRange;
4916
+ }
4917
+
4918
+ /** Declarative transform understood by both series' element callbacks. */
4919
+ export declare interface WaveIntroTransform {
4920
+ /** Horizontal translation in bitmap px. */
4921
+ offsetX?: number;
4922
+ /** Vertical translation in bitmap px. */
4923
+ offsetY?: number;
4924
+ /** Opacity multiplier in `[0, 1]`. */
4925
+ alpha?: number;
4926
+ }
4927
+
4928
+ /** Two-phase reveal: wicks needle out first as a skeleton, then bodies (and
4929
+ * volume) unfold over them from the open price. */
4930
+ export declare function wickBodyIntro(): CandleIntroFn;
4931
+
4932
+ /**
4933
+ * A hard reveal front sweeps left to right; elements appear fully formed
4934
+ * behind it. Works for both bar and candlestick series.
4935
+ */
4936
+ export declare function wipeIntro(): WaveIntroFn;
4937
+
3709
4938
  /** Configuration for the X (time) axis. */
3710
4939
  export declare interface XAxisConfig {
3711
4940
  /** Height in CSS pixels. Default: 30. */
@@ -3720,7 +4949,7 @@ declare interface XRange {
3720
4949
  to: number;
3721
4950
  }
3722
4951
 
3723
- declare class XScale {
4952
+ export declare class XScale {
3724
4953
  /**
3725
4954
  * Shared fade state for time ticks. Grid lines (canvas) and DOM tick labels
3726
4955
  * read opacity from the same tracker, so a tick fading in/out looks
@@ -3734,6 +4963,12 @@ declare class XScale {
3734
4963
  private dataInterval;
3735
4964
  private labelCountHintValue;
3736
4965
  private minSpacingValue;
4966
+ /** Custom formatter (driven by `setFormat` / a future `<TimeAxis format=…>`). */
4967
+ private customFormat;
4968
+ /** Custom tick generator — bypasses tier resolution in `niceTickValues` when set. */
4969
+ private customTickGenerator;
4970
+ private localeValue;
4971
+ private timeZoneValue;
3737
4972
  private resolvedInterval;
3738
4973
  private lastInterval;
3739
4974
  /**
@@ -3750,6 +4985,28 @@ declare class XScale {
3750
4985
  update(range: XRange, mediaWidth: number, pixelRatio: number, dataInterval?: number): void;
3751
4986
  setLabelCount(n: number | null | undefined): void;
3752
4987
  setMinSpacing(px: number | null | undefined): void;
4988
+ /** Install (or clear) a custom tick-label formatter. */
4989
+ setFormat(fn: TimeFormatter | null): void;
4990
+ /** Read back the currently installed formatter — null when the built-in is active. */
4991
+ getFormat(): TimeFormatter | null;
4992
+ /**
4993
+ * Install (or clear) a custom tick-value generator. When set, it replaces
4994
+ * `niceTimeIntervals` tier resolution entirely — `niceTickValues` calls it
4995
+ * directly with the current range and reports its own tick spacing.
4996
+ */
4997
+ setTickGenerator(fn: TimeTickGenerator | null): void;
4998
+ /** BCP 47 locale applied to the built-in formatter. Ignored while a custom `setFormat` is installed. */
4999
+ setLocale(locale: string | undefined): void;
5000
+ getLocale(): string | undefined;
5001
+ /** IANA timezone applied to the built-in formatter. Ignored while a custom `setFormat` is installed. */
5002
+ setTimeZone(timeZone: string | undefined): void;
5003
+ getTimeZone(): string | undefined;
5004
+ /**
5005
+ * Format a tick timestamp for display. A custom formatter (via
5006
+ * {@link setFormat}) wins; otherwise falls back to the built-in
5007
+ * `formatTime`, applying the installed locale/timezone.
5008
+ */
5009
+ formatX(timestamp: number, interval: number): string;
3753
5010
  private resetHysteresis;
3754
5011
  timeToX(time: number): number;
3755
5012
  timeToBitmapX(time: number): number;
@@ -3777,7 +5034,7 @@ declare class XScale {
3777
5034
  private countTicks;
3778
5035
  }
3779
5036
 
3780
- export declare const YAxis: DefineComponent<__VLS_Props_18, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_18> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
5037
+ export declare const YAxis: DefineComponent<__VLS_Props_20, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_20> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
3781
5038
  containerRef: HTMLDivElement;
3782
5039
  }, HTMLDivElement>;
3783
5040
 
@@ -3795,6 +5052,23 @@ export declare interface YAxisConfig {
3795
5052
 
3796
5053
  export declare const YLabel: __VLS_WithTemplateSlots_8<typeof __VLS_component_8, __VLS_TemplateResult_8["slots"]>;
3797
5054
 
5055
+ /**
5056
+ * Badge motion: `true` (default) glides + counts up + fades in with the intro;
5057
+ * `false` snaps with no easing (the pre-animation behavior); an object tunes
5058
+ * individual parts.
5059
+ */
5060
+ declare type YLabelAnimate = boolean | YLabelAnimateOptions;
5061
+
5062
+ /** Fine-grained badge motion tuning. See the framework `YLabel`'s `animate` prop. */
5063
+ declare interface YLabelAnimateOptions {
5064
+ /** Glide the badge vertically across value jumps instead of snapping. Default `true`. */
5065
+ glide?: boolean;
5066
+ /** Count the value up from the first visible sample to the last during the initial reveal. Default `true`. */
5067
+ countUp?: boolean;
5068
+ /** Settle time (ms) for the vertical glide. Default {@link DEFAULT_SETTLE_MS}. */
5069
+ settleMs?: number;
5070
+ }
5071
+
3798
5072
  /** Direction of the current value vs. previous close. Drives the badge color in the default UI. */
3799
5073
  declare type YLabelDirection = 'up' | 'down' | 'neutral';
3800
5074
 
@@ -3811,7 +5085,7 @@ export declare interface YRange {
3811
5085
  * Maps values to vertical pixel positions (and vice versa).
3812
5086
  * Also provides tick generation and value formatting for the Y axis.
3813
5087
  */
3814
- declare class YScale {
5088
+ export declare class YScale {
3815
5089
  /** Shared fade state for Y ticks; see {@link TimeScale.tickTracker}. */
3816
5090
  readonly tickTracker: AxisTickTracker;
3817
5091
  private min;
@@ -3834,6 +5108,8 @@ declare class YScale {
3834
5108
  private lastRawInterval;
3835
5109
  /** Custom formatter (driven by `<YAxis format=…>`). */
3836
5110
  private customFormat;
5111
+ /** Custom tick generator — bypasses {1,2,5}×10^k resolution in `niceTickValues` when set. */
5112
+ private customTickGenerator;
3837
5113
  private get labelCountHint();
3838
5114
  private get minLabelSpacing();
3839
5115
  /** Recalculate the scale with a new Y range, chart height, and device pixel ratio. */
@@ -3847,6 +5123,12 @@ declare class YScale {
3847
5123
  setFormat(fn: ValueFormatter | null): void;
3848
5124
  /** Read back the currently installed formatter — null when the built-in is active. */
3849
5125
  getFormat(): ValueFormatter | null;
5126
+ /**
5127
+ * Install (or clear) a custom tick-value generator. When set, it replaces
5128
+ * {1,2,5}×10^k resolution entirely — `niceTickValues` calls it directly
5129
+ * with the current range.
5130
+ */
5131
+ setTickGenerator(fn: ValueTickGenerator | null): void;
3850
5132
  /** Convert a value to a Y position in CSS (media) pixels. */
3851
5133
  valueToY(value: number): number;
3852
5134
  /** Convert a value to a Y position in physical (bitmap) pixels. */