@wick-charts/vue 0.8.1 → 0.8.2

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 (38) hide show
  1. package/dist/BandSeries.vue.js +25 -24
  2. package/dist/BarSeries.vue.js +27 -26
  3. package/dist/CandlestickSeries.vue.js +25 -24
  4. package/dist/HeatmapSeries.vue.js +21 -20
  5. package/dist/LineSeries.vue.js +24 -23
  6. package/dist/PieSeries.vue.js +25 -24
  7. package/dist/composables.js +63 -36
  8. package/dist/core/dist/axis/dom-labels.js +64 -53
  9. package/dist/core/dist/chart/options.js +1 -1
  10. package/dist/core/dist/chart/y-target.js +38 -32
  11. package/dist/core/dist/chart.js +475 -439
  12. package/dist/core/dist/data/decimation.js +52 -51
  13. package/dist/core/dist/data/store.js +38 -20
  14. package/dist/core/dist/data/sync.js +80 -69
  15. package/dist/core/dist/perf/perf-hud.js +3 -3
  16. package/dist/core/dist/scales/tick-tracker.js +2 -1
  17. package/dist/core/dist/series/band.js +1 -1
  18. package/dist/core/dist/series/bar.js +240 -211
  19. package/dist/core/dist/series/base-multi-layer.js +267 -249
  20. package/dist/core/dist/series/candlestick.js +116 -116
  21. package/dist/core/dist/series/line.js +540 -455
  22. package/dist/core/dist/snapshots.js +96 -77
  23. package/dist/index.d.ts +22 -4
  24. package/dist/ui/InfoBar.vue.js +68 -68
  25. package/dist/ui/NumberFlow.vue.js +36 -27
  26. package/dist/ui/Tooltip.vue.js +127 -130
  27. package/package.json +2 -2
  28. package/src/BandSeries.vue +5 -3
  29. package/src/BarSeries.vue +5 -3
  30. package/src/CandlestickSeries.vue +5 -4
  31. package/src/ChartContainer.vue +1 -1
  32. package/src/HeatmapSeries.vue +5 -4
  33. package/src/LineSeries.vue +5 -3
  34. package/src/PieSeries.vue +6 -5
  35. package/src/composables.ts +64 -1
  36. package/src/ui/InfoBar.vue +11 -3
  37. package/src/ui/NumberFlow.vue +17 -3
  38. package/src/ui/Tooltip.vue +23 -12
@@ -1,83 +1,85 @@
1
- import { DEFAULT_HISTORY_REVEAL as nt, DEFAULT_LINE_INTRO as lt, DEFAULT_LINE_PULSE as at, DEFAULT_LINE_SMOOTH as rt, DEFAULT_LINE_ENTRY as ht } from "../animation/config.js";
2
- import { easeOutCubic as U } from "../animation/easing.js";
3
- import { decimateLineData as q } from "../data/decimation.js";
4
- import { hexToRgba as C } from "../utils/color.js";
5
- import { lerp as z } from "../utils/math.js";
6
- import { BaseMultiLayerSeries as ut } from "./base-multi-layer.js";
7
- import { unfoldIntro as mt, scaleMean as pt, backfillSweepIntro as ft } from "./line-intro.js";
8
- import { buildCurveSegments as tt, replaySegmentsForward as et, replaySegmentsReversed as gt } from "./painters/canvas-path.js";
9
- import { resolveLinePainter as dt } from "./painters/resolve.js";
10
- import { ScaleStack as it } from "./scale-stack.js";
11
- const vt = {
1
+ import { DEFAULT_HISTORY_REVEAL as it, DEFAULT_LINE_INTRO as ot, DEFAULT_LINE_PULSE as st, DEFAULT_LINE_SMOOTH as nt, DEFAULT_LINE_ENTRY as lt } from "../animation/config.js";
2
+ import { easeOutCubic as J } from "../animation/easing.js";
3
+ import { decimateLineData as Z } from "../data/decimation.js";
4
+ import { hexToRgba as B } from "../utils/color.js";
5
+ import { lerp as G } from "../utils/math.js";
6
+ import { BaseMultiLayerSeries as ht } from "./base-multi-layer.js";
7
+ import { unfoldIntro as ct, scaleMean as ut, backfillSweepIntro as ft } from "./line-intro.js";
8
+ import { buildCurveSegments as j, replaySegmentsForward as q, replaySegmentsReversed as mt } from "./painters/canvas-path.js";
9
+ import { resolveLinePainter as pt } from "./painters/resolve.js";
10
+ import { ScaleStack as tt } from "./scale-stack.js";
11
+ const gt = {
12
12
  colors: ["#2962FF"],
13
13
  strokeWidth: 1,
14
14
  area: { visible: !0 },
15
15
  pulse: !0,
16
16
  stacking: "off",
17
17
  curve: "straight",
18
- entryMs: ht,
19
- smoothMs: rt,
20
- pulseMs: at,
21
- introMs: lt,
22
- historyRevealMs: nt
18
+ entryMs: lt,
19
+ smoothMs: nt,
20
+ pulseMs: st,
21
+ introMs: ot,
22
+ historyRevealMs: it
23
23
  };
24
- function ot(y) {
25
- const t = y.areaFill, i = t !== void 0 && y.area === void 0 ? { visible: !!t } : y.area;
24
+ function et(S) {
25
+ const t = S.areaFill, i = t !== void 0 && S.area === void 0 ? { visible: !!t } : S.area;
26
26
  return {
27
- ...y,
27
+ ...S,
28
28
  area: i,
29
- entryMs: y.entryMs === !1 ? 0 : y.entryMs ?? ht,
30
- smoothMs: y.smoothMs === !1 ? 0 : y.smoothMs ?? rt,
31
- pulseMs: y.pulseMs === !1 ? 0 : y.pulseMs ?? at,
32
- introMs: y.introMs === !1 ? 0 : y.introMs ?? lt,
33
- historyRevealMs: y.historyRevealMs === !1 ? 0 : y.historyRevealMs ?? nt
29
+ entryMs: S.entryMs === !1 ? 0 : S.entryMs ?? lt,
30
+ smoothMs: S.smoothMs === !1 ? 0 : S.smoothMs ?? nt,
31
+ pulseMs: S.pulseMs === !1 ? 0 : S.pulseMs ?? st,
32
+ introMs: S.introMs === !1 ? 0 : S.introMs ?? ot,
33
+ historyRevealMs: S.historyRevealMs === !1 ? 0 : S.historyRevealMs ?? it
34
34
  };
35
35
  }
36
- function st(y) {
37
- return y.map(([t, i]) => ({ x: t, y: i }));
36
+ function Q(S) {
37
+ return S.map(([t, i]) => ({ x: t, y: i }));
38
38
  }
39
- const J = 0.15, xt = ft();
40
- function j(y, t, i) {
41
- const { resolve: e, lerp: o = z } = i;
42
- if (y.length === 0) return null;
43
- if (t <= y[0].time) return Number.isFinite(y[0].value) ? e(y[0]) : null;
44
- const s = y[y.length - 1];
39
+ const K = 0.15, dt = ft();
40
+ function _(S, t, i) {
41
+ const { resolve: e, lerp: o = G } = i;
42
+ if (S.length === 0) return null;
43
+ if (t <= S[0].time) return Number.isFinite(S[0].value) ? e(S[0]) : null;
44
+ const s = S[S.length - 1];
45
45
  if (t >= s.time) return Number.isFinite(s.value) ? e(s) : null;
46
- let a = 0, r = y.length - 1;
47
- for (; r - a > 1; ) {
48
- const c = a + r >> 1;
49
- y[c].time <= t ? a = c : r = c;
50
- }
51
- const m = y[a];
52
- if (m.time === t) return Number.isFinite(m.value) ? e(m) : null;
53
- const h = y[r];
54
- if (!Number.isFinite(m.value) || !Number.isFinite(h.value)) return null;
55
- const p = h.time - m.time;
56
- return p <= 0 ? e(m) : o(e(m), e(h), (t - m.time) / p);
46
+ let h = 0, l = S.length - 1;
47
+ for (; l - h > 1; ) {
48
+ const c = h + l >> 1;
49
+ S[c].time <= t ? h = c : l = c;
50
+ }
51
+ const u = S[h];
52
+ if (u.time === t) return Number.isFinite(u.value) ? e(u) : null;
53
+ const r = S[l];
54
+ if (!Number.isFinite(u.value) || !Number.isFinite(r.value)) return null;
55
+ const f = r.time - u.time;
56
+ return f <= 0 ? e(u) : o(e(u), e(r), (t - u.time) / f);
57
57
  }
58
- function yt(y, t) {
59
- let i = 0, e = y.length - 1;
58
+ function vt(S, t) {
59
+ let i = 0, e = S.length - 1;
60
60
  for (; i <= e; ) {
61
61
  const o = i + e >> 1;
62
- if (y[o] === t) return o;
63
- y[o] < t ? i = o + 1 : e = o - 1;
62
+ if (S[o] === t) return o;
63
+ S[o] < t ? i = o + 1 : e = o - 1;
64
64
  }
65
65
  return -1;
66
66
  }
67
- class Pt extends ut {
67
+ class xt extends ht {
68
68
  kind = "line";
69
69
  areaGradientCache = /* @__PURE__ */ new Map();
70
- constructor(t, i) {
71
- super(t), this.options = ot({ ...vt, ...i });
70
+ /** First palette slot of the theme default colours — see `SeriesCreateEnv.paletteIndex`. */
71
+ #t;
72
+ constructor(t, i, e = 0) {
73
+ super(t), this.options = et({ ...gt, ...i }), this.#t = e;
72
74
  }
73
75
  updateOptions(t) {
74
- this.options = ot({ ...this.options, ...t });
76
+ this.options = et({ ...this.options, ...t });
75
77
  }
76
78
  getStacking() {
77
79
  return this.options.stacking;
78
80
  }
79
81
  applyTheme(t, i) {
80
- const e = this.stores.length === 1 ? [t.line.color] : t.seriesColors.slice(0, this.stores.length);
82
+ const e = at({ theme: t, layerCount: this.stores.length, paletteIndex: this.#t });
81
83
  this.updateOptions({ colors: e }), this.options.strokeWidth === i.line.width && this.updateOptions({ strokeWidth: t.line.width });
82
84
  }
83
85
  isEntryEnabled() {
@@ -98,18 +100,18 @@ class Pt extends ut {
98
100
  return !1;
99
101
  }
100
102
  render(t) {
101
- this.tickAnimations(performance.now()), this.lastYScale = t.yScale;
103
+ this.tickAnimations(performance.now()), this.lastYScale = t.yScale, this.lastTimeScale = t.timeScale;
102
104
  const { context: i } = t.scope;
103
105
  this.historyDirectives = null;
104
106
  const e = this.historyRange;
105
107
  if (this.historyWave.active && e !== null) {
106
- const r = this.options.historyReveal ?? xt;
107
- r !== "none" && (this.historyDirectives = r(this.buildHistoryFrame(t, e)));
108
+ const l = this.options.historyReveal ?? dt;
109
+ l !== "none" && (this.historyDirectives = l(this.buildHistoryFrame(t, e)));
108
110
  }
109
111
  const o = this.historyDirectives, s = o?.ghostAlpha ?? 0;
110
112
  s > 0 && (i.save(), i.globalAlpha *= s, this.introGhostPass = !0, this.renderBody(t), this.introGhostPass = !1, i.restore());
111
- const a = this.applyHistoryClip(t, o, e);
112
- this.introWave.active ? this.renderWithIntro(t) : (this.introDirectives = null, this.renderBody(t)), a && i.restore(), o?.heads !== void 0 && o.heads.length > 0 && this.drawIntroHeads(t, o.heads, this.historyWave.linear());
113
+ const h = this.applyHistoryClip(t, o, e);
114
+ this.introWave.active ? this.renderWithIntro(t) : (this.introDirectives = null, this.renderBody(t)), h && i.restore(), o?.heads !== void 0 && o.heads.length > 0 && this.drawIntroHeads(t, o.heads, this.historyWave.linear());
113
115
  }
114
116
  /**
115
117
  * Initial-load intro pass: the resolved LineIntroFn describes this frame
@@ -119,14 +121,14 @@ class Pt extends ut {
119
121
  renderWithIntro(t) {
120
122
  const i = this.resolveIntro()(this.buildIntroFrame(t));
121
123
  this.introDirectives = i;
122
- const { context: e } = t.scope, { width: o, height: s } = t.scope.bitmapSize, a = i.ghostAlpha ?? 0;
123
- a > 0 && (e.save(), e.globalAlpha *= a, this.introGhostPass = !0, this.renderBody(t), this.introGhostPass = !1, e.restore());
124
- const r = i.clip, m = r !== void 0 && (r.fromX !== void 0 || r.toX !== void 0);
125
- if (m) {
126
- const h = r.fromX ?? 0, p = r.toX ?? o;
127
- e.save(), e.beginPath(), e.rect(h, 0, Math.max(0, p - h), s), e.clip();
124
+ const { context: e } = t.scope, { width: o, height: s } = t.scope.bitmapSize, h = i.ghostAlpha ?? 0;
125
+ h > 0 && (e.save(), e.globalAlpha *= h, this.introGhostPass = !0, this.renderBody(t), this.introGhostPass = !1, e.restore());
126
+ const l = i.clip, u = l !== void 0 && (l.fromX !== void 0 || l.toX !== void 0);
127
+ if (u) {
128
+ const r = l.fromX ?? 0, f = l.toX ?? o;
129
+ e.save(), e.beginPath(), e.rect(r, 0, Math.max(0, f - r), s), e.clip();
128
130
  }
129
- this.renderBody(t), m && e.restore(), i.heads !== void 0 && i.heads.length > 0 && this.drawIntroHeads(t, i.heads, this.introWave.linear());
131
+ this.renderBody(t), u && e.restore(), i.heads !== void 0 && i.heads.length > 0 && this.drawIntroHeads(t, i.heads, this.introWave.linear());
130
132
  }
131
133
  /**
132
134
  * Apply the history reveal's clip directive, mapped from reveal space
@@ -137,8 +139,8 @@ class Pt extends ut {
137
139
  applyHistoryClip(t, i, e) {
138
140
  const o = i?.clip;
139
141
  if (o === void 0 || e === null || o.fromX === void 0 && o.toX === void 0) return !1;
140
- const { context: s } = t.scope, { width: a, height: r } = t.scope.bitmapSize, m = t.timeScale.timeToBitmapXExact(e.to), h = Math.abs(m - t.timeScale.timeToBitmapXExact(e.from)), p = Math.max(2, (this.options.strokeWidth ?? 1) * t.scope.horizontalPixelRatio), c = o.fromX ?? 0, x = o.toX ?? h;
141
- return s.save(), s.beginPath(), s.rect(m - x - p, 0, Math.max(0, x - c + p), r), s.rect(m, 0, Math.max(0, a - m), r), s.clip(), !0;
142
+ const { context: s } = t.scope, { width: h, height: l } = t.scope.bitmapSize, u = t.timeScale.timeToBitmapXExact(e.to), r = Math.abs(u - t.timeScale.timeToBitmapXExact(e.from)), f = Math.max(2, (this.options.strokeWidth ?? 1) * t.scope.horizontalPixelRatio), c = o.fromX ?? 0, v = o.toX ?? r;
143
+ return s.save(), s.beginPath(), s.rect(u - v - f, 0, Math.max(0, v - c + f), l), s.rect(u, 0, Math.max(0, h - u), l), s.clip(), !0;
142
144
  }
143
145
  renderBody(t) {
144
146
  this.options.stacking === "off" ? (this.stackedEdges = null, this.renderOff(t)) : this.renderStacked(t, this.options.stacking === "percent");
@@ -164,11 +166,13 @@ class Pt extends ut {
164
166
  historyDirectives = null;
165
167
  /** Y scale of the last render — value queries run without a render context. */
166
168
  lastYScale = null;
169
+ /** Time scale of the last render — places a share query's column in the intro wave. */
170
+ lastTimeScale = null;
167
171
  /** Default intro, built lazily — one instance per renderer. */
168
172
  defaultIntro = null;
169
173
  resolveIntro() {
170
174
  const t = this.options.introAnimation;
171
- return t !== void 0 ? t : (this.defaultIntro === null && (this.defaultIntro = mt()), this.defaultIntro);
175
+ return t !== void 0 ? t : (this.defaultIntro === null && (this.defaultIntro = ct()), this.defaultIntro);
172
176
  }
173
177
  /**
174
178
  * Frame context handed to the intro fn — progress plus memoized data
@@ -200,45 +204,45 @@ class Pt extends ut {
200
204
  });
201
205
  }
202
206
  buildFrame(t, i) {
203
- const { timeScale: e, yScale: o, scope: s } = t, { progress: a, range: r, width: m } = i, h = this.options.stacking === "percent", p = new Array(this.stores.length), c = new Array(this.stores.length);
204
- let x, n;
205
- const f = (l) => {
206
- let g = p[l];
207
- return g === void 0 && (g = this.stores[l]?.getVisibleData(r.from, r.to) ?? [], p[l] = g), g;
207
+ const { timeScale: e, yScale: o, scope: s } = t, { progress: h, range: l, width: u } = i, r = this.options.stacking === "percent", f = new Array(this.stores.length), c = new Array(this.stores.length);
208
+ let v, a;
209
+ const g = (n) => {
210
+ let d = f[n];
211
+ return d === void 0 && (d = this.stores[n]?.getVisibleData(l.from, l.to) ?? [], f[n] = d), d;
208
212
  };
209
213
  return {
210
- progress: a,
211
- range: r,
212
- width: m,
214
+ progress: h,
215
+ range: l,
216
+ width: u,
213
217
  height: o.getMediaHeight() * s.verticalPixelRatio,
214
218
  stacking: this.options.stacking,
215
- timeToX: (l) => e.timeToBitmapXExact(l),
216
- xToTime: (l) => e.xToTime(l / s.horizontalPixelRatio),
217
- valueToY: (l) => o.valueToBitmapYExact(l),
218
- lerpValue: (l, g, b) => o.lerpValue(l, g, b),
219
+ timeToX: (n) => e.timeToBitmapXExact(n),
220
+ xToTime: (n) => e.xToTime(n / s.horizontalPixelRatio),
221
+ valueToY: (n) => o.valueToBitmapYExact(n),
222
+ lerpValue: (n, d, M) => o.lerpValue(n, d, M),
219
223
  layerCount: this.stores.length,
220
- layerData: f,
221
- layerMean: (l) => {
222
- let g = c[l];
223
- return g === void 0 && (h ? (x ??= this.meanShares(f, o), g = x[l]) : g = pt(f(l), o), c[l] = g), g;
224
+ layerData: g,
225
+ layerMean: (n) => {
226
+ let d = c[n];
227
+ return d === void 0 && (r ? (v ??= this.meanShares(g, o), d = v[n]) : d = ut(g(n), o), c[n] = d), d;
224
228
  },
225
229
  primaryPath: () => {
226
- if (n === void 0) {
227
- n = null;
228
- for (let l = 0; l < this.stores.length; l++) {
229
- if (this.getLayerAlpha(l) <= 0 || !this.stores[l].isVisible()) continue;
230
- const g = f(l).filter((b) => o.isPlottable(b.value));
231
- if (!(g.length < 2)) {
232
- n = g.map((b) => ({
233
- x: e.timeToBitmapXExact(b.time),
234
- y: o.valueToBitmapYExact(b.value),
235
- time: b.time
230
+ if (a === void 0) {
231
+ a = null;
232
+ for (let n = 0; n < this.stores.length; n++) {
233
+ if (this.getLayerAlpha(n) <= 0 || !this.stores[n].isVisible()) continue;
234
+ const d = g(n).filter((M) => o.isPlottable(M.value));
235
+ if (!(d.length < 2)) {
236
+ a = d.map((M) => ({
237
+ x: e.timeToBitmapXExact(M.time),
238
+ y: o.valueToBitmapYExact(M.value),
239
+ time: M.time
236
240
  }));
237
241
  break;
238
242
  }
239
243
  }
240
244
  }
241
- return n;
245
+ return a;
242
246
  }
243
247
  };
244
248
  }
@@ -252,12 +256,36 @@ class Pt extends ut {
252
256
  const s = super.effectiveValue(t, i, e, o);
253
257
  return this.options.stacking === "percent" ? s : this.introValue(t, { layerIndex: i, time: e, value: s });
254
258
  }
259
+ /**
260
+ * The line stack's reading of a percent column (see `renderStacked`): each
261
+ * layer's current value at `time` times its alpha, 0 for a layer yet to
262
+ * start, over one signed total, then through the intro's share transform and
263
+ * the 100% cap; a total at or below 0 is a gap.
264
+ */
265
+ percentShares(t) {
266
+ const i = /* @__PURE__ */ new Map();
267
+ let e = 0;
268
+ for (let l = 0; l < this.stores.length; l++) {
269
+ const u = this.getLayerAlpha(l);
270
+ if (u <= 0) continue;
271
+ const r = this.stores[l].getAll(), f = r.length > 0 && t < r[0].time ? 0 : _(r, t, { resolve: (c) => this.snapshotValue(l, c.time, c.value) });
272
+ f !== null && (i.set(l, f * u), e += f * u);
273
+ }
274
+ if (e <= 0) return null;
275
+ const o = this.lastTimeScale, s = /* @__PURE__ */ new Map();
276
+ let h = 0;
277
+ for (const [l, u] of i) {
278
+ const r = { layerIndex: l, time: t, value: u, total: e }, f = o === null ? Math.max(0, u / e * 100) : this.introShare({ timeScale: o }, r), c = Math.min(100, h + f);
279
+ s.set(l, c - h), h = c;
280
+ }
281
+ return s;
282
+ }
255
283
  /** Layer's share of its column in percent, passed through the intro value transform. */
256
284
  introShare(t, i) {
257
- const { layerIndex: e, time: o, value: s, total: a } = i;
258
- if (a <= 0) return s;
259
- const r = s / a * 100;
260
- return Math.max(0, this.introValue(t, { layerIndex: e, time: o, value: r }));
285
+ const { layerIndex: e, time: o, value: s, total: h } = i;
286
+ if (h <= 0) return s;
287
+ const l = s / h * 100;
288
+ return Math.max(0, this.introValue(t, { layerIndex: e, time: o, value: l }));
261
289
  }
262
290
  /**
263
291
  * What `layerMean` reports on a percent stack: each layer's mean share over
@@ -266,41 +294,41 @@ class Pt extends ut {
266
294
  */
267
295
  meanShares(t, i) {
268
296
  const e = this.stores.length, o = /* @__PURE__ */ new Set();
269
- for (let h = 0; h < e; h++)
270
- for (const p of t(h))
271
- o.add(p.time);
272
- const s = new Array(e).fill(0), a = new Array(e).fill(!1), r = new Array(e);
273
- let m = 0;
274
- for (const h of o) {
275
- let p = 0;
297
+ for (let r = 0; r < e; r++)
298
+ for (const f of t(r))
299
+ o.add(f.time);
300
+ const s = new Array(e).fill(0), h = new Array(e).fill(!1), l = new Array(e);
301
+ let u = 0;
302
+ for (const r of o) {
303
+ let f = 0;
276
304
  for (let c = 0; c < e; c++) {
277
- r[c] = null;
278
- const x = this.getLayerAlpha(c), n = t(c);
279
- if (x <= 0 || n.length === 0 || h < n[0].time) continue;
280
- const f = j(n, h, { resolve: (l) => l.value });
281
- f === null || !i.isPlottable(f) || (r[c] = f * x, p += f * x);
305
+ l[c] = null;
306
+ const v = this.getLayerAlpha(c), a = t(c);
307
+ if (v <= 0 || a.length === 0 || r < a[0].time) continue;
308
+ const g = _(a, r, { resolve: (n) => n.value });
309
+ g === null || !i.isPlottable(g) || (l[c] = g * v, f += g * v);
282
310
  }
283
- if (!(p <= 0)) {
284
- m++;
311
+ if (!(f <= 0)) {
312
+ u++;
285
313
  for (let c = 0; c < e; c++) {
286
- const x = r[c];
287
- x !== null && (s[c] += x / p * 100, a[c] = !0);
314
+ const v = l[c];
315
+ v !== null && (s[c] += v / f * 100, h[c] = !0);
288
316
  }
289
317
  }
290
318
  }
291
- return s.map((h, p) => a[p] ? h / m : null);
319
+ return s.map((r, f) => h[f] ? r / u : null);
292
320
  }
293
321
  /** The active history-reveal or intro value transform applied to one value. */
294
322
  introValue(t, i) {
295
- const { layerIndex: e, time: o, value: s } = i, a = this.historyWave.active ? this.historyDirectives?.value : void 0, r = this.historyRange;
296
- if (a !== void 0 && r !== null && o < r.to) {
297
- const x = r.to - r.from, n = x > 0 ? Math.min(1, Math.max(0, (r.to - o) / x)) : 0;
298
- return a({ layerIndex: e, time: o, value: s, position: n });
323
+ const { layerIndex: e, time: o, value: s } = i, h = this.historyWave.active ? this.historyDirectives?.value : void 0, l = this.historyRange;
324
+ if (h !== void 0 && l !== null && o < l.to) {
325
+ const v = l.to - l.from, a = v > 0 ? Math.min(1, Math.max(0, (l.to - o) / v)) : 0;
326
+ return h({ layerIndex: e, time: o, value: s, position: a });
299
327
  }
300
- const m = this.introWave.active ? this.introDirectives?.value : void 0;
301
- if (m === void 0) return s;
302
- const h = t.timeScale.getRange(), p = h.to - h.from, c = p > 0 ? Math.min(1, Math.max(0, (o - h.from) / p)) : 0;
303
- return m({ layerIndex: e, time: o, value: s, position: c });
328
+ const u = this.introWave.active ? this.introDirectives?.value : void 0;
329
+ if (u === void 0) return s;
330
+ const r = t.timeScale.getRange(), f = r.to - r.from, c = f > 0 ? Math.min(1, Math.max(0, (o - r.from) / f)) : 0;
331
+ return u({ layerIndex: e, time: o, value: s, position: c });
304
332
  }
305
333
  /**
306
334
  * Extends the base last-value query with the 'grow' entrance's value-space
@@ -324,22 +352,22 @@ class Pt extends ut {
324
352
  if (e.length === 0) return null;
325
353
  const o = this.stores[t].getAll(), s = o.length - 1 - e.length;
326
354
  if (s < 0) return null;
327
- const a = o[s];
328
- if (!Number.isFinite(a.value)) return null;
329
- let r = i(a.time, a.value);
330
- const m = /* @__PURE__ */ new Map();
331
- for (let h = 0; h < e.length; h++) {
332
- const p = o[s + 1 + h];
333
- if (!Number.isFinite(p.value)) return null;
334
- const c = U(e[h].progress), x = i(p.time, p.value), n = this.axisLerp(r, x, c);
335
- m.set(p.time, n), r = n;
355
+ const h = o[s];
356
+ if (!Number.isFinite(h.value)) return null;
357
+ let l = i(h.time, h.value);
358
+ const u = /* @__PURE__ */ new Map();
359
+ for (let r = 0; r < e.length; r++) {
360
+ const f = o[s + 1 + r];
361
+ if (!Number.isFinite(f.value)) return null;
362
+ const c = J(e[r].progress), v = i(f.time, f.value), a = this.axisLerp(l, v, c);
363
+ u.set(f.time, a), l = a;
336
364
  }
337
- return m;
365
+ return u;
338
366
  }
339
367
  /** `lerp` along the last rendered Y axis — plain before the first render. */
340
368
  axisLerp(t, i, e) {
341
369
  const o = this.lastYScale;
342
- return o === null ? z(t, i, e) : o.lerpValue(t, i, e);
370
+ return o === null ? G(t, i, e) : o.lerpValue(t, i, e);
343
371
  }
344
372
  /**
345
373
  * Glowing pulse dots riding the intro's head anchors — the line reads as
@@ -349,22 +377,22 @@ class Pt extends ut {
349
377
  */
350
378
  drawIntroHeads(t, i, e) {
351
379
  if (this.options.stacking !== "off") return;
352
- const o = Math.min(1, e / J), s = Math.min(1, (1 - e) / J), a = Math.max(0, Math.min(o, s));
353
- if (a <= 0) return;
354
- const { scope: r } = t;
355
- for (const m of i)
356
- for (let h = 0; h < this.stores.length; h++) {
357
- const p = this.getLayerAlpha(h);
358
- if (p <= 0 || !this.stores[h].isVisible()) continue;
359
- const c = this.introHeadAnchor(t, h, m);
380
+ const o = Math.min(1, e / K), s = Math.min(1, (1 - e) / K), h = Math.max(0, Math.min(o, s));
381
+ if (h <= 0) return;
382
+ const { scope: l } = t;
383
+ for (const u of i)
384
+ for (let r = 0; r < this.stores.length; r++) {
385
+ const f = this.getLayerAlpha(r);
386
+ if (f <= 0 || !this.stores[r].isVisible()) continue;
387
+ const c = this.introHeadAnchor(t, r, u);
360
388
  c !== null && this.drawPulse({
361
- ctx: r.context,
389
+ ctx: l.context,
362
390
  x: c.x,
363
391
  y: c.y,
364
- color: this.resolveLayerColor(h, c.value),
365
- pixelRatio: r.horizontalPixelRatio,
392
+ color: this.resolveLayerColor(r, c.value),
393
+ pixelRatio: l.horizontalPixelRatio,
366
394
  phase: e * 2,
367
- alpha: a * p
395
+ alpha: h * f
368
396
  });
369
397
  }
370
398
  }
@@ -380,30 +408,30 @@ class Pt extends ut {
380
408
  * visible range, not the data span) and jumps back on settle.
381
409
  */
382
410
  introHeadAnchor(t, i, e) {
383
- const { timeScale: o, yScale: s } = t, a = o.getRange(), r = this.stores[i].getVisibleData(a.from, a.to);
384
- if (r.length === 0) return null;
385
- const m = this.stores[i].last();
386
- if (m !== void 0 && e.time >= m.time) {
387
- if (!s.isPlottable(m.value)) return null;
411
+ const { timeScale: o, yScale: s } = t, h = o.getRange(), l = this.stores[i].getVisibleData(h.from, h.to);
412
+ if (l.length === 0) return null;
413
+ const u = this.stores[i].last();
414
+ if (u !== void 0 && e.time >= u.time) {
415
+ if (!s.isPlottable(u.value)) return null;
388
416
  const c = this.trailingEndpoint(t, i);
389
- return c === null ? null : { x: c.x, y: c.y, value: m.value };
417
+ return c === null ? null : { x: c.x, y: c.y, value: u.value };
390
418
  }
391
- const h = r[0];
392
- if (e.time <= h.time) {
393
- if (!s.isPlottable(h.value)) return null;
394
- const c = this.effectiveValue(t, i, h.time, h.value);
419
+ const r = l[0];
420
+ if (e.time <= r.time) {
421
+ if (!s.isPlottable(r.value)) return null;
422
+ const c = this.effectiveValue(t, i, r.time, r.value);
395
423
  return {
396
- x: o.timeToBitmapXExact(h.time),
424
+ x: o.timeToBitmapXExact(r.time),
397
425
  y: s.valueToBitmapYExact(c),
398
- value: h.value
426
+ value: r.value
399
427
  };
400
428
  }
401
- const p = j(r, e.time, {
429
+ const f = _(l, e.time, {
402
430
  resolve: (c) => this.effectiveValue(t, i, c.time, c.value),
403
431
  // Along the axis, so the dot stays on the straight segment the stroke draws.
404
- lerp: (c, x, n) => !s.isPlottable(c) || !s.isPlottable(x) ? Number.NaN : s.lerpValue(c, x, n)
432
+ lerp: (c, v, a) => !s.isPlottable(c) || !s.isPlottable(v) ? Number.NaN : s.lerpValue(c, v, a)
405
433
  });
406
- return p === null || !s.isPlottable(p) ? null : { x: e.x, y: s.valueToBitmapYExact(p), value: p };
434
+ return f === null || !s.isPlottable(f) ? null : { x: e.x, y: s.valueToBitmapYExact(f), value: f };
407
435
  }
408
436
  /**
409
437
  * Rendered positions of the layer's still-unsettled trailing points, keyed
@@ -428,51 +456,53 @@ class Pt extends ut {
428
456
  * it (see `renderStacked`'s `valueMaps` comment for the full rationale).
429
457
  */
430
458
  stackedValueAt(t, i, e) {
431
- const o = this.options.stacking === "percent", s = (this.options.entryAnimation ?? "grow") === "grow", a = new Array(this.stores.length), r = (n) => {
459
+ const o = this.options.stacking === "percent", s = (this.options.entryAnimation ?? "grow") === "grow", h = new Array(this.stores.length), l = (a) => {
432
460
  if (!s) return null;
433
- const f = a[n];
434
- if (f !== void 0) return f;
435
- const l = this.chainedTailValues(n, (g, b) => this.effectiveValue(t, n, g, b));
436
- return a[n] = l, l;
437
- }, m = (n) => {
438
- const f = this.stores[n].getAll();
439
- if (f.length === 0 || e < f[0].time) return null;
440
- const l = r(n);
441
- return j(f, e, {
442
- resolve: (g) => l?.get(g.time) ?? this.effectiveValue(t, n, g.time, g.value)
461
+ const g = h[a];
462
+ if (g !== void 0) return g;
463
+ const n = this.chainedTailValues(a, (d, M) => this.effectiveValue(t, a, d, M));
464
+ return h[a] = n, n;
465
+ }, u = (a) => {
466
+ const g = this.stores[a].getAll();
467
+ if (g.length === 0 || e < g[0].time) return null;
468
+ const n = l(a);
469
+ return _(g, e, {
470
+ resolve: (d) => n?.get(d.time) ?? this.effectiveValue(t, a, d.time, d.value)
443
471
  });
444
- }, { yScale: h } = t;
445
- if (h.getTransform() !== null && !o) {
446
- const n = new it(h);
447
- for (let f = 0; f <= i; f++) {
448
- const l = this.getLayerAlpha(f), g = l > 0 ? m(f) : null;
449
- g !== null && h.isPlottable(g) && n.push(g, l);
472
+ }, { yScale: r } = t;
473
+ if (r.getTransform() !== null && !o) {
474
+ const a = new tt(r);
475
+ for (let g = 0; g <= i; g++) {
476
+ const n = this.getLayerAlpha(g), d = n > 0 ? u(g) : null;
477
+ d !== null && r.isPlottable(d) && a.push(d, n);
450
478
  }
451
- return n.edge;
479
+ return a.edge;
452
480
  }
453
- const p = (n) => {
454
- const f = this.getLayerAlpha(n);
455
- if (f <= 0) return null;
456
- const l = this.stores[n].getAll();
457
- if (o && l.length > 0 && e < l[0].time) return 0;
458
- const g = m(n);
459
- return g === null ? null : g * f;
481
+ const f = (a) => {
482
+ const g = this.getLayerAlpha(a);
483
+ if (g <= 0) return null;
484
+ const n = this.stores[a].getAll();
485
+ if (o && n.length > 0 && e < n[0].time) return 0;
486
+ const d = u(a);
487
+ return d === null ? null : d * g;
460
488
  };
461
489
  let c = 0;
462
- if (o)
463
- for (let n = 0; n < this.stores.length; n++)
464
- c += p(n) ?? 0;
465
- let x = 0;
466
- for (let n = 0; n <= i; n++) {
467
- const f = p(n);
468
- if (f !== null)
490
+ if (o) {
491
+ for (let a = 0; a < this.stores.length; a++)
492
+ c += f(a) ?? 0;
493
+ if (c <= 0) return Number.NaN;
494
+ }
495
+ let v = 0;
496
+ for (let a = 0; a <= i; a++) {
497
+ const g = f(a);
498
+ if (g !== null)
469
499
  if (o) {
470
- const l = this.introShare(t, { layerIndex: n, time: e, value: f, total: c });
471
- x = Math.min(100, x + l);
500
+ const n = this.introShare(t, { layerIndex: a, time: e, value: g, total: c });
501
+ v = Math.min(100, v + n);
472
502
  } else
473
- x += f;
503
+ v += g;
474
504
  }
475
- return x;
505
+ return v;
476
506
  }
477
507
  /**
478
508
  * Bitmap position for layer `li`'s stacked boundary at time `t`.
@@ -488,41 +518,41 @@ class Pt extends ut {
488
518
  stackedPositionAt(t, i, e) {
489
519
  const o = this.paintedStackVertex(t, i, e);
490
520
  if (o !== null) return o;
491
- const { timeScale: s, yScale: a } = t, r = a.valueToBitmapYExact(this.stackedValueAt(t, i, e)), m = s.timeToBitmapXExact(e), h = this.unsettledTail(i), p = this.stores[i].getAll(), c = p.length - 1 - h.length;
492
- if ((this.options.entryAnimation ?? "grow") !== "grow" || e !== p[p.length - 1]?.time || h.length === 0 || c < 0) return { x: m, y: r };
493
- let x = s.timeToBitmapXExact(p[c].time);
494
- for (let n = 0; n < h.length; n++)
495
- x = z(x, s.timeToBitmapXExact(p[c + 1 + n].time), U(h[n].progress));
496
- return { x, y: r };
521
+ const { timeScale: s, yScale: h } = t, l = h.valueToBitmapYExact(this.stackedValueAt(t, i, e)), u = s.timeToBitmapXExact(e), r = this.unsettledTail(i), f = this.stores[i].getAll(), c = f.length - 1 - r.length;
522
+ if ((this.options.entryAnimation ?? "grow") !== "grow" || e !== f[f.length - 1]?.time || r.length === 0 || c < 0) return { x: u, y: l };
523
+ let v = s.timeToBitmapXExact(f[c].time);
524
+ for (let a = 0; a < r.length; a++)
525
+ v = G(v, s.timeToBitmapXExact(f[c + 1 + a].time), J(r[a].progress));
526
+ return { x: v, y: l };
497
527
  }
498
528
  /** Upper-edge vertex of layer `li` at column `t`, replayed from the last
499
529
  * stacked frame's data-space record against `ctx`'s scales. */
500
530
  paintedStackVertex(t, i, e) {
501
531
  const o = this.stackedEdges, s = o?.cumulative[i];
502
532
  if (o === null || s === void 0) return null;
503
- const { times: a, growChain: r, collapse: m } = o, h = yt(a, e);
504
- if (h < 0) return null;
505
- const { timeScale: p, yScale: c } = t, x = t.scope.bitmapSize.height, n = m[i] ?? 1, f = c.valueToBitmapYExact(s[h]), l = n >= 1 ? f : x + (f - x) * n, g = a.length - r.length;
506
- if (h < g) return { x: p.timeToBitmapXExact(e), y: l };
507
- let b = p.timeToBitmapXExact(a[g - 1]);
508
- for (let E = 0; E <= h - g; E++)
509
- b = z(b, p.timeToBitmapXExact(a[g + E]), r[E]);
510
- return { x: b, y: l };
533
+ const { times: h, growChain: l, collapse: u } = o, r = vt(h, e);
534
+ if (r < 0) return null;
535
+ const { timeScale: f, yScale: c } = t, v = t.scope.bitmapSize.height, a = u[i] ?? 1, g = c.valueToBitmapYExact(s[r]), n = a >= 1 ? g : v + (g - v) * a, d = h.length - l.length;
536
+ if (r < d) return { x: f.timeToBitmapXExact(e), y: n };
537
+ let M = f.timeToBitmapXExact(h[d - 1]);
538
+ for (let x = 0; x <= r - d; x++)
539
+ M = G(M, f.timeToBitmapXExact(h[d + x]), l[x]);
540
+ return { x: M, y: n };
511
541
  }
512
542
  chainedTailPositions(t, i) {
513
543
  const e = this.unsettledTail(i);
514
544
  if (e.length === 0) return null;
515
545
  const o = this.stores[i].getAll(), s = o.length - 1 - e.length;
516
546
  if (s < 0) return null;
517
- const { timeScale: a, yScale: r } = t, m = o[s];
518
- if (!r.isPlottable(m.value)) return null;
519
- let h = a.timeToBitmapXExact(m.time), p = r.valueToBitmapYExact(this.effectiveValue(t, i, m.time, m.value));
547
+ const { timeScale: h, yScale: l } = t, u = o[s];
548
+ if (!l.isPlottable(u.value)) return null;
549
+ let r = h.timeToBitmapXExact(u.time), f = l.valueToBitmapYExact(this.effectiveValue(t, i, u.time, u.value));
520
550
  const c = /* @__PURE__ */ new Map();
521
- for (let x = 0; x < e.length; x++) {
522
- const n = o[s + 1 + x];
523
- if (!r.isPlottable(n.value)) return null;
524
- const f = U(e[x].progress), l = a.timeToBitmapXExact(n.time), g = r.valueToBitmapYExact(this.effectiveValue(t, i, n.time, n.value)), b = z(h, l, f), E = z(p, g, f);
525
- c.set(n.time, { x: b, y: E }), h = b, p = E;
551
+ for (let v = 0; v < e.length; v++) {
552
+ const a = o[s + 1 + v];
553
+ if (!l.isPlottable(a.value)) return null;
554
+ const g = J(e[v].progress), n = h.timeToBitmapXExact(a.time), d = l.valueToBitmapYExact(this.effectiveValue(t, i, a.time, a.value)), M = G(r, n, g), x = G(f, d, g);
555
+ c.set(a.time, { x: M, y: x }), r = M, f = x;
526
556
  }
527
557
  return c;
528
558
  }
@@ -539,8 +569,8 @@ class Pt extends ut {
539
569
  trailingEndpoint(t, i) {
540
570
  const e = this.stores[i].last();
541
571
  if (!e) return null;
542
- const { timeScale: o, yScale: s } = t, a = o.timeToBitmapXExact(e.time), r = s.valueToBitmapYExact(this.effectiveValue(t, i, e.time, e.value));
543
- return (this.options.entryAnimation ?? "grow") !== "grow" ? { x: a, y: r } : this.chainedTailPositions(t, i)?.get(e.time) ?? { x: a, y: r };
572
+ const { timeScale: o, yScale: s } = t, h = o.timeToBitmapXExact(e.time), l = s.valueToBitmapYExact(this.effectiveValue(t, i, e.time, e.value));
573
+ return (this.options.entryAnimation ?? "grow") !== "grow" ? { x: h, y: l } : this.chainedTailPositions(t, i)?.get(e.time) ?? { x: h, y: l };
544
574
  }
545
575
  /**
546
576
  * Vertical stroke + area gradients for `options.threshold`, pinned to the
@@ -554,10 +584,10 @@ class Pt extends ut {
554
584
  buildThresholdPaint(t, i) {
555
585
  const e = this.options.threshold;
556
586
  if (!e) return null;
557
- const { scope: o, yScale: s } = t, { context: a } = o, r = o.bitmapSize.height, m = e.above, h = e.below ?? i, p = Math.min(1, Math.max(0, s.valueToBitmapYExact(e.value) / r)), c = Math.min(6 * o.verticalPixelRatio, r * 0.02) / r, x = Math.max(0, p - c), n = Math.min(1, p + c), f = a.createLinearGradient(0, 0, 0, r);
558
- f.addColorStop(0, m), f.addColorStop(x, m), f.addColorStop(n, h), f.addColorStop(1, h);
559
- const l = a.createLinearGradient(0, 0, 0, r);
560
- return l.addColorStop(0, C(m, 0.26)), l.addColorStop(x, C(m, 0.14)), l.addColorStop(n, C(h, 0.1)), l.addColorStop(1, C(h, 0.01)), { stroke: f, area: l };
587
+ const { scope: o, yScale: s } = t, { context: h } = o, l = o.bitmapSize.height, u = e.above, r = e.below ?? i, f = Math.min(1, Math.max(0, s.valueToBitmapYExact(e.value) / l)), c = Math.min(6 * o.verticalPixelRatio, l * 0.02) / l, v = Math.max(0, f - c), a = Math.min(1, f + c), g = h.createLinearGradient(0, 0, 0, l);
588
+ g.addColorStop(0, u), g.addColorStop(v, u), g.addColorStop(a, r), g.addColorStop(1, r);
589
+ const n = h.createLinearGradient(0, 0, 0, l);
590
+ return n.addColorStop(0, B(u, 0.26)), n.addColorStop(v, B(u, 0.14)), n.addColorStop(a, B(r, 0.1)), n.addColorStop(1, B(r, 0.01)), { stroke: g, area: n };
561
591
  }
562
592
  /**
563
593
  * Dot markers at each data point (`options.points`). Callers pass the same
@@ -570,243 +600,281 @@ class Pt extends ut {
570
600
  drawPointMarkers(t) {
571
601
  const i = this.options.points;
572
602
  if (!i?.visible) return;
573
- const { context: e, points: o, pixelRatio: s, color: a } = t;
603
+ const { context: e, points: o, pixelRatio: s, color: h } = t;
574
604
  if (o.length === 0) return;
575
- const r = Math.max(1, (i.radius ?? 3) * s);
576
- if (!(o.length > 1 && (o[o.length - 1].x - o[0].x) / (o.length - 1) < r * 3)) {
605
+ const l = Math.max(1, (i.radius ?? 3) * s);
606
+ if (!(o.length > 1 && (o[o.length - 1].x - o[0].x) / (o.length - 1) < l * 3)) {
577
607
  e.beginPath();
578
- for (const m of o)
579
- e.moveTo(m.x + r, m.y), e.arc(m.x, m.y, r, 0, Math.PI * 2);
580
- e.fillStyle = i.color ?? a, e.fill();
608
+ for (const u of o)
609
+ e.moveTo(u.x + l, u.y), e.arc(u.x, u.y, l, 0, Math.PI * 2);
610
+ e.fillStyle = i.color ?? h, e.fill();
581
611
  }
582
612
  }
583
613
  /** Each layer drawn independently */
584
614
  renderOff(t) {
585
- const { scope: i, timeScale: e, yScale: o } = t, { context: s } = i, a = e.getRange(), { verticalPixelRatio: r } = i, m = this.options.strokeWidth > 0, h = Math.max(1, Math.round(this.options.strokeWidth * r)), p = this.options.entryAnimation ?? "grow", c = dt(this.options.linePainter ?? this.options.curve ?? "straight"), x = {
615
+ const { scope: i, timeScale: e, yScale: o } = t, { context: s } = i, h = e.getRange(), { verticalPixelRatio: l } = i, u = this.options.strokeWidth > 0, r = Math.max(1, Math.round(this.options.strokeWidth * l)), f = this.options.entryAnimation ?? "grow", c = pt(this.options.linePainter ?? this.options.curve ?? "straight"), v = {
586
616
  ctx: s,
587
617
  theme: t.theme,
588
618
  horizontalPixelRatio: i.horizontalPixelRatio,
589
- verticalPixelRatio: r
619
+ verticalPixelRatio: l
590
620
  };
591
- for (let n = 0; n < this.stores.length; n++) {
592
- const f = this.getLayerAlpha(n);
593
- if (f <= 0) continue;
594
- let l = this.stores[n].getVisibleData(a.from, a.to);
595
- const g = i.mediaSize.width;
596
- if (l.length > g * 2 && (l = q(l, Math.round(g * 1.5))), l.length < 2) continue;
597
- const b = this.lastFinitePoint(n)?.value ?? l[l.length - 1].value, E = this.resolveLayerColor(n, b), B = this.buildThresholdPaint(t, E), V = l[l.length - 1], Y = this.stores[n].last(), D = Y !== void 0 && V.time === Y.time, N = D ? this.entranceProgress(n, V.time) : 1, I = D && p === "fade" && N < 1, H = (D ? this.trailingEndpoint(t, n) : null) ?? {
598
- x: e.timeToBitmapXExact(V.time),
599
- y: o.valueToBitmapYExact(this.effectiveValue(t, n, V.time, V.value))
600
- }, F = H.x, X = H.y, $ = D && p === "grow" ? this.chainedTailPositions(t, n) : null, G = f < 1;
601
- (G || I) && (s.save(), G && (s.globalAlpha *= f), I && (s.globalAlpha *= N));
602
- const _ = l.length - 1, u = [];
603
- let v = null;
604
- for (let d = 0; d < _; d++) {
605
- const S = l[d].value;
606
- if (!o.isPlottable(S)) {
607
- v = null;
621
+ for (let a = 0; a < this.stores.length; a++) {
622
+ const g = this.getLayerAlpha(a);
623
+ if (g <= 0) continue;
624
+ let n = this.stores[a].getVisibleData(h.from, h.to);
625
+ const d = i.mediaSize.width;
626
+ if (n.length > d * 2 && (n = Z(n, Math.round(d * 1.5))), n.length < 2) continue;
627
+ const M = this.lastFinitePoint(a)?.value ?? n[n.length - 1].value, x = this.resolveLayerColor(a, M), w = this.buildThresholdPaint(t, x), R = n[n.length - 1], C = this.stores[a].last(), W = C !== void 0 && R.time === C.time, H = W ? this.entranceProgress(a, R.time) : 1, D = W && f === "fade" && H < 1, N = (W ? this.trailingEndpoint(t, a) : null) ?? {
628
+ x: e.timeToBitmapXExact(R.time),
629
+ y: o.valueToBitmapYExact(this.effectiveValue(t, a, R.time, R.value))
630
+ }, O = N.x, X = N.y, Y = W && f === "grow" ? this.chainedTailPositions(t, a) : null, z = g < 1;
631
+ (z || D) && (s.save(), z && (s.globalAlpha *= g), D && (s.globalAlpha *= H));
632
+ const $ = n.length - 1, F = [];
633
+ let V = null;
634
+ for (let p = 0; p < $; p++) {
635
+ const y = n[p].value;
636
+ if (!o.isPlottable(y)) {
637
+ V = null;
608
638
  continue;
609
639
  }
610
- v || (v = [], u.push(v));
611
- const w = $?.get(l[d].time);
612
- if (w)
613
- v.push({ x: w.x, y: w.y });
640
+ V || (V = [], F.push(V));
641
+ const P = Y?.get(n[p].time);
642
+ if (P)
643
+ V.push({ x: P.x, y: P.y });
614
644
  else {
615
- const W = o.valueToBitmapYExact(this.effectiveValue(t, n, l[d].time, S));
616
- v.push({ x: e.timeToBitmapXExact(l[d].time), y: W });
645
+ const E = o.valueToBitmapYExact(this.effectiveValue(t, a, n[p].time, y));
646
+ V.push({ x: e.timeToBitmapXExact(n[p].time), y: E });
617
647
  }
618
648
  }
619
- const T = l[_]?.value, A = Number.isFinite(F) && Number.isFinite(X) && o.isPlottable(T), P = p === "grow" && N < 1;
620
- let M = null;
621
- if (A && (v ? (v.push({ x: F, y: X }), M = v) : u.push([{ x: F, y: X }])), m && u.some((d) => d.length >= 2)) {
649
+ const m = n[$]?.value, b = Number.isFinite(O) && Number.isFinite(X) && o.isPlottable(m), T = f === "grow" && H < 1;
650
+ let k = null;
651
+ if (b && (V ? (V.push({ x: O, y: X }), k = V) : F.push([{ x: O, y: X }])), u && F.some((p) => p.length >= 2)) {
622
652
  s.beginPath();
623
- for (const d of u)
624
- d.length < 2 || c(x, { points: d, color: E, lineWidth: h, closing: !1, grew: P && d === M });
625
- s.strokeStyle = B ? B.stroke : E, s.lineWidth = h, s.lineJoin = "round", s.lineCap = "round", s.stroke();
653
+ for (const p of F)
654
+ p.length < 2 || c(v, { points: p, color: x, lineWidth: r, closing: !1, grew: T && p === k });
655
+ s.strokeStyle = w ? w.stroke : x, s.lineWidth = r, s.lineJoin = "round", s.lineCap = "round", s.stroke();
626
656
  }
627
- if (m) {
628
- const d = Math.max(1, h / 2);
629
- let S = !1;
630
- for (const w of u)
631
- w.length === 1 && (S || (s.beginPath(), S = !0), s.moveTo(w[0].x + d, w[0].y), s.arc(w[0].x, w[0].y, d, 0, Math.PI * 2));
632
- S && (s.fillStyle = E, s.fill());
657
+ if (u) {
658
+ const p = Math.max(1, r / 2);
659
+ let y = !1;
660
+ for (const P of F)
661
+ P.length === 1 && (y || (s.beginPath(), y = !0), s.moveTo(P[0].x + p, P[0].y), s.arc(P[0].x, P[0].y, p, 0, Math.PI * 2));
662
+ y && (s.fillStyle = x, s.fill());
633
663
  }
634
664
  if (this.options.area.visible && !this.introGhostPass) {
635
- const d = i.bitmapSize.height;
636
- let S;
637
- if (B)
638
- S = B.area;
665
+ const p = i.bitmapSize.height;
666
+ let y;
667
+ if (w)
668
+ y = w.area;
639
669
  else {
640
- const w = String(n), W = this.areaGradientCache.get(w);
641
- W && W.bottomY === d && W.color === E ? S = W.gradient : (S = s.createLinearGradient(0, 0, 0, d), S.addColorStop(0, C(E, 0.12)), S.addColorStop(1, C(E, 0.01)), this.areaGradientCache.set(w, { gradient: S, bottomY: d, color: E }));
670
+ const I = String(a), A = this.areaGradientCache.get(I);
671
+ A && A.bottomY === p && A.color === x ? y = A.gradient : (y = s.createLinearGradient(0, 0, 0, p), y.addColorStop(0, B(x, 0.12)), y.addColorStop(1, B(x, 0.01)), this.areaGradientCache.set(I, { gradient: y, bottomY: p, color: x }));
672
+ }
673
+ s.fillStyle = y, s.beginPath();
674
+ const P = r + i.horizontalPixelRatio;
675
+ let E = null;
676
+ for (const I of F) {
677
+ if (I.length < 2) continue;
678
+ const A = I[0], L = I[I.length - 1];
679
+ E !== null && A.x - E.x <= P && (s.moveTo(E.x, E.y), s.lineTo(A.x, A.y), s.lineTo(A.x, p), s.lineTo(E.x, p), s.closePath()), c(v, { points: I, color: x, lineWidth: r, closing: !0, grew: T && I === k }), s.lineTo(L.x, p), s.lineTo(A.x, p), s.closePath(), E = L;
642
680
  }
643
- s.fillStyle = S;
644
- for (const w of u)
645
- w.length < 2 || (s.beginPath(), c(x, { points: w, color: E, lineWidth: h, closing: !0, grew: P && w === M }), s.lineTo(w[w.length - 1].x, d), s.lineTo(w[0].x, d), s.closePath(), s.fill());
681
+ s.fill();
646
682
  }
647
683
  if (this.options.points?.visible) {
648
- const d = [];
649
- for (const S of u)
650
- for (const w of S) d.push(w);
651
- this.drawPointMarkers({ context: s, points: d, pixelRatio: i.horizontalPixelRatio, color: E });
684
+ const p = [];
685
+ for (const y of F)
686
+ for (const P of y) p.push(P);
687
+ this.drawPointMarkers({ context: s, points: p, pixelRatio: i.horizontalPixelRatio, color: x });
652
688
  }
653
- (I || G) && s.restore();
689
+ (D || z) && s.restore();
654
690
  }
655
691
  }
656
692
  /** Stacked area rendering */
657
693
  renderStacked(t, i) {
658
- const { scope: e, timeScale: o, yScale: s } = t, { context: a } = e, r = o.getRange(), { verticalPixelRatio: m } = e, h = this.options.strokeWidth > 0, p = Math.max(1, Math.round(this.options.strokeWidth * m)), c = this.options.curve ?? "straight", x = e.mediaSize.width, n = this.stores.map((u, v) => {
659
- if (this.getLayerAlpha(v) <= 0) return [];
660
- let T = u.getVisibleData(r.from, r.to);
661
- return T.length > x * 2 && (T = q(T, Math.round(x * 1.5))), T;
662
- }), f = /* @__PURE__ */ new Set();
663
- for (const u of n)
664
- for (const v of u) f.add(v.time);
665
- const l = Array.from(f).sort((u, v) => u - v);
666
- if (l.length < 2) {
694
+ const { scope: e, timeScale: o, yScale: s } = t, { context: h } = e, l = o.getRange(), { verticalPixelRatio: u } = e, r = this.options.strokeWidth > 0, f = Math.max(1, Math.round(this.options.strokeWidth * u)), c = this.options.curve ?? "straight", v = e.mediaSize.width, a = this.stores.map((m, b) => {
695
+ if (this.getLayerAlpha(b) <= 0) return [];
696
+ let T = m.getVisibleData(l.from, l.to);
697
+ return T.length > v * 2 && (T = Z(T, Math.round(v * 1.5))), T;
698
+ }), g = /* @__PURE__ */ new Set();
699
+ for (const m of a)
700
+ for (const b of m) g.add(b.time);
701
+ const n = Array.from(g).sort((m, b) => m - b);
702
+ if (n.length < 2) {
667
703
  this.stackedEdges = null;
668
704
  return;
669
705
  }
670
- const g = this.options.entryAnimation ?? "grow", b = n.map((u, v) => {
706
+ const d = this.options.entryAnimation ?? "grow", M = a.map((m, b) => {
671
707
  const T = /* @__PURE__ */ new Map();
672
- if (u.length === 0) return T;
673
- const A = u[0].time, P = g === "grow" ? this.chainedTailValues(v, (d, S) => this.effectiveValue(t, v, d, S)) : null, M = (d) => P?.get(d.time) ?? this.effectiveValue(t, v, d.time, d.value);
674
- for (const d of l) {
675
- if (d < A) continue;
676
- const S = j(u, d, { resolve: M });
677
- S !== null && T.set(d, S);
708
+ if (m.length === 0) return T;
709
+ const k = m[0].time, p = d === "grow" ? this.chainedTailValues(b, (P, E) => this.effectiveValue(t, b, P, E)) : null, y = (P) => p?.get(P.time) ?? this.effectiveValue(t, b, P.time, P.value);
710
+ for (const P of n) {
711
+ if (P < k) continue;
712
+ const E = _(m, P, { resolve: y });
713
+ E !== null && T.set(P, E);
678
714
  }
679
715
  return T;
680
- }), E = this.stores.map((u, v) => this.getLayerAlpha(v)), B = (u, v) => {
681
- const T = b[u].get(v);
682
- return T === void 0 ? void 0 : T * E[u];
683
- }, V = s.getTransform() !== null && !i, Y = Array.from({ length: this.stores.length }, () => new Array(l.length).fill(0));
684
- for (let u = 0; u < l.length; u++) {
685
- const v = l[u];
686
- if (V) {
687
- const P = new it(s);
688
- for (let M = 0; M < this.stores.length; M++) {
689
- const d = b[M].get(v);
690
- d !== void 0 && s.isPlottable(d) && P.push(d, E[M]), Y[M][u] = P.edge;
716
+ }), x = this.stores.map((m, b) => this.getLayerAlpha(b)), w = (m, b) => {
717
+ const T = M[m].get(b);
718
+ return T === void 0 ? void 0 : T * x[m];
719
+ }, R = s.getTransform() !== null && !i, C = Array.from({ length: this.stores.length }, () => new Array(n.length).fill(0)), W = new Array(n.length).fill(!1);
720
+ for (let m = 0; m < n.length; m++) {
721
+ const b = n[m];
722
+ if (R) {
723
+ const p = new tt(s);
724
+ for (let y = 0; y < this.stores.length; y++) {
725
+ const P = M[y].get(b);
726
+ P !== void 0 && s.isPlottable(P) && p.push(P, x[y]), C[y][m] = p.edge;
691
727
  }
692
728
  continue;
693
729
  }
694
730
  let T = 0;
695
731
  if (i)
696
- for (let P = 0; P < this.stores.length; P++) {
697
- const M = B(P, v);
698
- M !== void 0 && s.isPlottable(M) && (T += M);
732
+ for (let p = 0; p < this.stores.length; p++) {
733
+ const y = w(p, b);
734
+ y !== void 0 && s.isPlottable(y) && (T += y);
699
735
  }
700
- let A = 0;
701
- for (let P = 0; P < this.stores.length; P++) {
702
- const M = B(P, v);
703
- let d = M !== void 0 && s.isPlottable(M) ? M : null;
704
- const S = n[P];
705
- if (i && S.length > 0 && v < S[0].time && (d = 0), d !== null)
736
+ if (i && T <= 0) {
737
+ W[m] = !0;
738
+ for (let p = 0; p < this.stores.length; p++)
739
+ C[p][m] = Number.NaN;
740
+ continue;
741
+ }
742
+ let k = 0;
743
+ for (let p = 0; p < this.stores.length; p++) {
744
+ const y = w(p, b);
745
+ let P = y !== void 0 && s.isPlottable(y) ? y : null;
746
+ const E = a[p];
747
+ if (i && E.length > 0 && b < E[0].time && (P = 0), P !== null)
706
748
  if (i) {
707
- const w = this.introShare(t, { layerIndex: P, time: v, value: d, total: T });
708
- A = Math.min(100, A + w);
749
+ const I = this.introShare(t, { layerIndex: p, time: b, value: P, total: T });
750
+ k = Math.min(100, k + I);
709
751
  } else
710
- A += d;
711
- Y[P][u] = A;
752
+ k += P;
753
+ C[p][m] = k;
712
754
  }
713
755
  }
714
- const D = /* @__PURE__ */ new Map();
715
- for (let u = 0; u < l.length; u++) D.set(l[u], u);
716
- const N = new Array(this.stores.length).fill(1);
717
- for (let u = 0; u < this.stores.length; u++) {
718
- if (this.getLayerAlpha(u) <= 0) continue;
719
- const v = this.unsettledTail(u), T = v.length;
756
+ const H = /* @__PURE__ */ new Map();
757
+ for (let m = 0; m < n.length; m++) H.set(n[m], m);
758
+ const D = new Array(this.stores.length).fill(1);
759
+ for (let m = 0; m < this.stores.length; m++) {
760
+ if (this.getLayerAlpha(m) <= 0) continue;
761
+ const b = this.unsettledTail(m), T = b.length;
720
762
  if (T === 0) continue;
721
- let A = !0;
722
- for (let P = 0; P < T; P++)
723
- if (D.get(v[P].time) !== l.length - T + P) {
724
- A = !1;
763
+ let k = !0;
764
+ for (let p = 0; p < T; p++)
765
+ if (H.get(b[p].time) !== n.length - T + p) {
766
+ k = !1;
725
767
  break;
726
768
  }
727
- A && (N[u] = v[T - 1].progress);
769
+ k && (D[m] = b[T - 1].progress);
728
770
  }
729
- const I = [];
730
- if (g === "grow") {
731
- const u = n.map((v) => v.length - 1);
732
- for (let v = l.length - 1; v >= 1; v--) {
733
- const T = l[v];
734
- let A = 1, P = !1;
735
- for (let M = 0; M < n.length; M++) {
736
- if (this.getLayerAlpha(M) <= 0) continue;
737
- const d = n[M];
738
- for (; u[M] >= 0 && d[u[M]].time > T; ) u[M]--;
739
- if (u[M] < 0 || d[u[M]].time !== T) continue;
740
- const S = this.entranceProgress(M, T);
741
- (!P || S > A) && (A = S), P = !0;
771
+ const N = [];
772
+ if (d === "grow") {
773
+ const m = a.map((b) => b.length - 1);
774
+ for (let b = n.length - 1; b >= 1; b--) {
775
+ const T = n[b];
776
+ let k = 1, p = !1;
777
+ for (let y = 0; y < a.length; y++) {
778
+ if (this.getLayerAlpha(y) <= 0) continue;
779
+ const P = a[y];
780
+ for (; m[y] >= 0 && P[m[y]].time > T; ) m[y]--;
781
+ if (m[y] < 0 || P[m[y]].time !== T) continue;
782
+ const E = this.entranceProgress(y, T);
783
+ (!p || E > k) && (k = E), p = !0;
742
784
  }
743
- if (!P || A >= 1) break;
744
- I.unshift(U(A));
785
+ if (!p || k >= 1) break;
786
+ N.unshift(J(k));
745
787
  }
746
788
  }
747
- const H = (u, v) => {
748
- const T = v.length;
749
- if (!(T === 0 || u.length < T + 1))
750
- for (let A = 0; A < T; A++) {
751
- const P = u.length - T + A;
752
- u[P][0] = z(u[P - 1][0], u[P][0], v[A]);
789
+ const O = (m, b) => {
790
+ const T = b.length;
791
+ if (!(T === 0 || m.length < T + 1))
792
+ for (let k = 0; k < T; k++) {
793
+ const p = m.length - T + k;
794
+ m[p][0] = G(m[p - 1][0], m[p][0], b[k]);
753
795
  }
754
- }, F = e.bitmapSize.height;
755
- let X = -1, $ = -1;
756
- for (let u = 0; u < this.stores.length; u++)
757
- if (!(this.getLayerAlpha(u) <= 0))
758
- if (X < 0)
759
- X = u;
796
+ }, X = e.bitmapSize.height;
797
+ let Y = -1, z = -1;
798
+ for (let m = 0; m < this.stores.length; m++)
799
+ if (!(this.getLayerAlpha(m) <= 0))
800
+ if (Y < 0)
801
+ Y = m;
760
802
  else {
761
- $ = u;
803
+ z = m;
762
804
  break;
763
805
  }
764
- const G = X >= 0 ? this.getLayerAlpha(X) : 1, _ = n.map((u, v) => v === X ? Math.min(1, this.getLayerAlpha(v)) : 1);
765
- for (let u = this.stores.length - 1; u >= 0; u--) {
766
- const v = this.getLayerAlpha(u);
767
- if (v <= 0) continue;
768
- const T = this.lastFinitePoint(u)?.value ?? 0, A = this.resolveLayerColor(u, T), P = u === X, M = $ >= 0 && u === $ && G < 1, d = [];
769
- for (let R = 0; R < l.length; R++) {
770
- const L = u > 0 ? s.valueToBitmapYExact(Y[u - 1][R]) : F;
771
- let O = L;
772
- P ? O = F : M && (O = L + (F - L) * (1 - G)), d.push([o.timeToBitmapXExact(l[R]), O]);
806
+ const $ = Y >= 0 ? this.getLayerAlpha(Y) : 1, F = a.map((m, b) => b === Y ? Math.min(1, this.getLayerAlpha(b)) : 1), V = yt(W);
807
+ for (let m = this.stores.length - 1; m >= 0; m--) {
808
+ const b = this.getLayerAlpha(m);
809
+ if (b <= 0) continue;
810
+ const T = this.lastFinitePoint(m)?.value ?? 0, k = this.resolveLayerColor(m, T), p = m === Y, y = z >= 0 && m === z && $ < 1, P = [];
811
+ for (let A = 0; A < n.length; A++) {
812
+ const L = m > 0 ? s.valueToBitmapYExact(C[m - 1][A]) : X;
813
+ let U = L;
814
+ p ? U = X : y && (U = L + (X - L) * (1 - $)), P.push([o.timeToBitmapXExact(n[A]), U]);
773
815
  }
774
- g === "grow" && H(d, I);
775
- const S = [];
776
- for (let R = 0; R < l.length; R++) {
777
- let L = s.valueToBitmapYExact(Y[u][R]);
778
- P && v < 1 && (L = F + (L - F) * v), S.push([o.timeToBitmapXExact(l[R]), L]);
816
+ d === "grow" && O(P, N);
817
+ const E = [];
818
+ for (let A = 0; A < n.length; A++) {
819
+ let L = s.valueToBitmapYExact(C[m][A]);
820
+ p && b < 1 && (L = X + (L - X) * b), E.push([o.timeToBitmapXExact(n[A]), L]);
779
821
  }
780
- g === "grow" && H(S, I);
781
- const w = st(S), W = tt(w, c, g === "grow" && I.length > 0), K = g === "fade" && N[u] < 1;
782
- if (K && (a.save(), a.globalAlpha *= N[u]), this.options.area.visible && !this.introGhostPass) {
783
- let R = S[0][1], L = d[0][1];
784
- for (let k = 1; k < S.length; k++)
785
- S[k][1] < R && (R = S[k][1]);
786
- for (let k = 1; k < d.length; k++)
787
- d[k][1] > L && (L = d[k][1]);
788
- let O = C(A, 0.25);
789
- if (L > R + 0.5) {
790
- const k = a.createLinearGradient(0, R, 0, L);
791
- k.addColorStop(0, C(A, 0.25)), k.addColorStop(1, C(A, 0.05)), O = k;
792
- }
793
- if (a.beginPath(), a.moveTo(w[0].x, w[0].y), et(a, W), P)
794
- for (let k = d.length - 1; k >= 0; k--)
795
- a.lineTo(d[k][0], d[k][1]);
796
- else {
797
- const k = st(d), ct = tt(k, c, g === "grow" && I.length > 0), Z = k[k.length - 1];
798
- a.lineTo(Z.x, Z.y), gt(a, k, ct);
799
- }
800
- a.closePath(), a.fillStyle = O, a.fill();
822
+ d === "grow" && O(E, N);
823
+ const I = d === "fade" && D[m] < 1;
824
+ I && (h.save(), h.globalAlpha *= D[m]);
825
+ for (const A of V) {
826
+ const L = d === "grow" && N.length > 0 && A.to === n.length;
827
+ this.drawStackSlice({
828
+ ctx: t,
829
+ lowerXY: P.slice(A.from, A.to),
830
+ upperXY: E.slice(A.from, A.to),
831
+ layer: { color: k, alpha: b, isBottomVisible: p },
832
+ curve: { kind: c, growing: L, hasStroke: r, lineWidth: f }
833
+ });
834
+ }
835
+ if (this.options.points?.visible) {
836
+ const A = Q(E).filter((U, rt) => !W[rt]), L = b < 1;
837
+ L && (h.save(), h.globalAlpha *= b), this.drawPointMarkers({ context: h, points: A, pixelRatio: e.horizontalPixelRatio, color: k }), L && h.restore();
838
+ }
839
+ I && h.restore();
840
+ }
841
+ this.stackedEdges = { times: n, cumulative: C, growChain: N, collapse: F };
842
+ }
843
+ /** Fill and stroke of one layer's slice over one run of stacked columns. */
844
+ drawStackSlice(t) {
845
+ const { lowerXY: i, upperXY: e } = t, { context: o } = t.ctx.scope, { color: s, alpha: h, isBottomVisible: l } = t.layer, { kind: u, growing: r, hasStroke: f, lineWidth: c } = t.curve, v = Q(e);
846
+ if (v.length === 1) {
847
+ f && this.drawStackDot({ context: o, point: v[0], color: s, lineWidth: c, alpha: h });
848
+ return;
849
+ }
850
+ const a = j(v, u, r);
851
+ if (this.options.area.visible && !this.introGhostPass) {
852
+ let n = e[0][1], d = i[0][1];
853
+ for (let x = 1; x < e.length; x++)
854
+ e[x][1] < n && (n = e[x][1]);
855
+ for (let x = 1; x < i.length; x++)
856
+ i[x][1] > d && (d = i[x][1]);
857
+ let M = B(s, 0.25);
858
+ if (d > n + 0.5) {
859
+ const x = o.createLinearGradient(0, n, 0, d);
860
+ x.addColorStop(0, B(s, 0.25)), x.addColorStop(1, B(s, 0.05)), M = x;
801
861
  }
802
- const Q = h && v < 1;
803
- if (Q && (a.save(), a.globalAlpha *= v), h && (a.beginPath(), a.moveTo(w[0].x, w[0].y), et(a, W), a.strokeStyle = A, a.lineWidth = p, a.lineJoin = "round", a.lineCap = "round", a.stroke()), Q && a.restore(), this.options.points?.visible) {
804
- const R = v < 1;
805
- R && (a.save(), a.globalAlpha *= v), this.drawPointMarkers({ context: a, points: w, pixelRatio: e.horizontalPixelRatio, color: A }), R && a.restore();
862
+ if (o.beginPath(), o.moveTo(v[0].x, v[0].y), q(o, a), l)
863
+ for (let x = i.length - 1; x >= 0; x--)
864
+ o.lineTo(i[x][0], i[x][1]);
865
+ else {
866
+ const x = Q(i), w = j(x, u, r), R = x[x.length - 1];
867
+ o.lineTo(R.x, R.y), mt(o, x, w);
806
868
  }
807
- K && a.restore();
869
+ o.closePath(), o.fillStyle = M, o.fill();
808
870
  }
809
- this.stackedEdges = { times: l, cumulative: Y, growChain: I, collapse: _ };
871
+ const g = f && h < 1;
872
+ g && (o.save(), o.globalAlpha *= h), f && (o.beginPath(), o.moveTo(v[0].x, v[0].y), q(o, a), o.strokeStyle = s, o.lineWidth = c, o.lineJoin = "round", o.lineCap = "round", o.stroke()), g && o.restore();
873
+ }
874
+ /** A stroke-wide dot for a lone stacked column, faded with its layer like the stroke. */
875
+ drawStackDot(t) {
876
+ const { context: i, point: e, color: o, lineWidth: s, alpha: h } = t, l = Math.max(1, s / 2);
877
+ i.save(), i.globalAlpha *= h, i.beginPath(), i.moveTo(e.x + l, e.y), i.arc(e.x, e.y, l, 0, Math.PI * 2), i.fillStyle = o, i.fill(), i.restore();
810
878
  }
811
879
  /**
812
880
  * Overlay hook: draws crosshair nearest-point dots and last-point pulse dots.
@@ -814,58 +882,60 @@ class Pt extends ut {
814
882
  */
815
883
  drawOverlay(t) {
816
884
  this.tickAnimations(performance.now());
817
- const { scope: i, timeScale: e, yScale: o, crosshair: s, dataInterval: a } = t, r = i, m = this.options.pulseMs, h = m > 0 ? performance.now() / (m * 2 * Math.PI) % 1 : 0;
885
+ const { scope: i, timeScale: e, yScale: o, crosshair: s, dataInterval: h } = t, l = i, u = this.options.pulseMs, r = u > 0 ? performance.now() / (u * 2 * Math.PI) % 1 : 0;
818
886
  if (s) {
819
- const x = this.options.stacking, n = 4 * r.horizontalPixelRatio;
820
- for (let f = 0; f < this.stores.length; f++) {
821
- const l = this.getLayerAlpha(f);
822
- if (l <= 0) continue;
823
- const g = this.stores[f].findNearest(s.time, a);
824
- if (!g || x === "off" && !o.isPlottable(g.value)) continue;
825
- const b = this.resolveLayerColor(f, g.value), { x: E, y: B } = x === "off" ? {
826
- x: e.timeToBitmapXExact(g.time),
827
- y: o.valueToBitmapYExact(this.effectiveValue(t, f, g.time, g.value))
828
- } : this.stackedPositionAt(t, f, g.time), V = l < 1;
829
- V && (i.context.save(), i.context.globalAlpha *= l), i.context.save(), i.context.globalAlpha *= 0.25, i.context.beginPath(), i.context.arc(E, B, n + 3 * r.horizontalPixelRatio, 0, Math.PI * 2), i.context.fillStyle = b, i.context.fill(), i.context.restore(), i.context.beginPath(), i.context.arc(E, B, n, 0, Math.PI * 2), i.context.fillStyle = b, i.context.fill(), V && i.context.restore();
887
+ const v = this.options.stacking, a = 4 * l.horizontalPixelRatio;
888
+ for (let g = 0; g < this.stores.length; g++) {
889
+ const n = this.getLayerAlpha(g);
890
+ if (n <= 0) continue;
891
+ const d = this.stores[g].findNearest(s.time, h);
892
+ if (!d || v === "off" && !o.isPlottable(d.value)) continue;
893
+ const M = this.resolveLayerColor(g, d.value), { x, y: w } = v === "off" ? {
894
+ x: e.timeToBitmapXExact(d.time),
895
+ y: o.valueToBitmapYExact(this.effectiveValue(t, g, d.time, d.value))
896
+ } : this.stackedPositionAt(t, g, d.time);
897
+ if (!Number.isFinite(w)) continue;
898
+ const R = n < 1;
899
+ R && (i.context.save(), i.context.globalAlpha *= n), i.context.save(), i.context.globalAlpha *= 0.25, i.context.beginPath(), i.context.arc(x, w, a + 3 * l.horizontalPixelRatio, 0, Math.PI * 2), i.context.fillStyle = M, i.context.fill(), i.context.restore(), i.context.beginPath(), i.context.arc(x, w, a, 0, Math.PI * 2), i.context.fillStyle = M, i.context.fill(), R && i.context.restore();
830
900
  }
831
901
  }
832
- const p = this.introWave.active && this.introDirectives?.clip !== void 0;
902
+ const f = this.introWave.active && this.introDirectives?.clip !== void 0;
833
903
  let c = 1;
834
- if (p && (c = Math.max(0, (this.introWave.linear() - (1 - J)) / J)), this.hasPulse && m > 0 && c > 0) {
835
- const x = this.options.stacking;
836
- for (let n = 0; n < this.stores.length; n++) {
837
- const f = this.getLayerAlpha(n);
838
- if (f <= 0) continue;
839
- const l = this.lastFinitePoint(n);
840
- if (!l) continue;
841
- const g = this.resolveLayerColor(n, l.value);
842
- if (x === "off") {
843
- if (!o.isPlottable(l.value)) continue;
844
- const B = l === this.stores[n].last() ? this.trailingEndpoint(t, n) : {
845
- x: e.timeToBitmapXExact(l.time),
846
- y: o.valueToBitmapYExact(this.effectiveValue(t, n, l.time, l.value))
904
+ if (f && (c = Math.max(0, (this.introWave.linear() - (1 - K)) / K)), this.hasPulse && u > 0 && c > 0) {
905
+ const v = this.options.stacking;
906
+ for (let a = 0; a < this.stores.length; a++) {
907
+ const g = this.getLayerAlpha(a);
908
+ if (g <= 0) continue;
909
+ const n = this.lastFinitePoint(a);
910
+ if (!n) continue;
911
+ const d = this.resolveLayerColor(a, n.value);
912
+ if (v === "off") {
913
+ if (!o.isPlottable(n.value)) continue;
914
+ const w = n === this.stores[a].last() ? this.trailingEndpoint(t, a) : {
915
+ x: e.timeToBitmapXExact(n.time),
916
+ y: o.valueToBitmapYExact(this.effectiveValue(t, a, n.time, n.value))
847
917
  };
848
- if (!B) continue;
918
+ if (!w) continue;
849
919
  this.drawPulse({
850
920
  ctx: i.context,
851
- x: B.x,
852
- y: B.y,
853
- color: g,
854
- pixelRatio: r.horizontalPixelRatio,
855
- phase: h,
856
- alpha: f * c
921
+ x: w.x,
922
+ y: w.y,
923
+ color: d,
924
+ pixelRatio: l.horizontalPixelRatio,
925
+ phase: r,
926
+ alpha: g * c
857
927
  });
858
928
  continue;
859
929
  }
860
- const { x: b, y: E } = this.stackedPositionAt(t, n, l.time);
861
- this.drawPulse({
930
+ const { x: M, y: x } = this.stackedPositionAt(t, a, n.time);
931
+ Number.isFinite(x) && this.drawPulse({
862
932
  ctx: i.context,
863
- x: b,
864
- y: E,
865
- color: g,
866
- pixelRatio: r.horizontalPixelRatio,
867
- phase: h,
868
- alpha: f * c
933
+ x: M,
934
+ y: x,
935
+ color: d,
936
+ pixelRatio: l.horizontalPixelRatio,
937
+ phase: r,
938
+ alpha: g * c
869
939
  });
870
940
  }
871
941
  }
@@ -876,23 +946,38 @@ class Pt extends ut {
876
946
  y: e,
877
947
  color: o,
878
948
  pixelRatio: s,
879
- phase: a,
880
- alpha: r = 1
949
+ phase: h,
950
+ alpha: l = 1
881
951
  }) {
882
- const m = 3 * s, h = 0.4 + 0.6 * Math.abs(Math.sin(a * 2 * Math.PI)), p = m + 4 * s * h, c = r < 1;
883
- c && (t.save(), t.globalAlpha *= r), t.beginPath(), t.arc(i, e, p, 0, Math.PI * 2), t.fillStyle = C(o, h * 0.3), t.fill(), t.beginPath(), t.arc(i, e, m, 0, Math.PI * 2), t.fillStyle = o, t.fill(), c && t.restore();
952
+ const u = 3 * s, r = 0.4 + 0.6 * Math.abs(Math.sin(h * 2 * Math.PI)), f = u + 4 * s * r, c = l < 1;
953
+ c && (t.save(), t.globalAlpha *= l), t.beginPath(), t.arc(i, e, f, 0, Math.PI * 2), t.fillStyle = B(o, r * 0.3), t.fill(), t.beginPath(), t.arc(i, e, u, 0, Math.PI * 2), t.fillStyle = o, t.fill(), c && t.restore();
884
954
  }
885
955
  }
886
- const Lt = {
956
+ const It = {
887
957
  type: "line",
888
958
  xTypes: ["time", "numeric", "category"],
889
- create: ({ theme: y, layerCount: t }, i) => new Pt(t, {
890
- colors: t === 1 ? [y.line.color] : y.seriesColors.slice(0, t),
891
- strokeWidth: y.line.width,
892
- ...i
893
- })
959
+ create: ({ theme: S, layerCount: t, paletteIndex: i = 0 }, e) => new xt(
960
+ t,
961
+ {
962
+ colors: at({ theme: S, layerCount: t, paletteIndex: i }),
963
+ strokeWidth: S.line.width,
964
+ ...e
965
+ },
966
+ i
967
+ )
894
968
  };
969
+ function yt(S) {
970
+ const t = [];
971
+ let i = 0;
972
+ for (let e = 0; e <= S.length; e++)
973
+ (e === S.length || S[e]) && (e > i && t.push({ from: i, to: e }), i = e + 1);
974
+ return t;
975
+ }
976
+ function at(S) {
977
+ const { theme: t, layerCount: i, paletteIndex: e } = S, o = t.seriesColors;
978
+ return i === 1 && e === 0 || o.length === 0 ? [t.line.color] : Array.from({ length: i }, (s, h) => o[(e + h) % o.length]);
979
+ }
895
980
  export {
896
- Pt as LineRenderer,
897
- Lt as LineSeriesDef
981
+ xt as LineRenderer,
982
+ It as LineSeriesDef
898
983
  };