@wick-charts/vue 0.6.3 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/BandSeries.vue.js +50 -0
- package/dist/BandSeries.vue2.js +4 -0
- package/dist/ChartContainer.vue.js +16 -16
- package/dist/LineSeries.vue.js +2 -2
- package/dist/core/dist/animation/config.js +92 -75
- package/dist/core/dist/chart/badge-animator.js +30 -22
- package/dist/core/dist/chart/edge-indicators.js +22 -21
- package/dist/core/dist/chart/last-value.js +33 -26
- package/dist/core/dist/chart.js +168 -167
- package/dist/core/dist/data/decimation.js +58 -39
- package/dist/core/dist/navigator/controller.js +10 -10
- package/dist/core/dist/perf/perf-hud.js +6 -6
- package/dist/core/dist/series/band.js +670 -0
- package/dist/core/dist/series/bar.js +14 -14
- package/dist/core/dist/series/candlestick.js +31 -31
- package/dist/core/dist/series/heatmap.js +5 -5
- package/dist/core/dist/series/line-intro.js +47 -37
- package/dist/core/dist/series/line.js +485 -445
- package/dist/core/dist/series/painters/builtins.js +4 -4
- package/dist/core/dist/series/painters/canvas-path.js +64 -52
- package/dist/core/dist/series/register-builtins.js +9 -8
- package/dist/core/dist/snapshots.js +36 -35
- package/dist/core/dist/utils/point.js +10 -0
- package/dist/index.d.ts +255 -97
- package/dist/index.js +195 -191
- package/dist/ui/InfoBar.vue.js +100 -81
- package/dist/ui/Tooltip.vue.js +118 -91
- package/dist/ui/YLabel.vue.js +62 -69
- package/package.json +2 -2
- package/src/BandSeries.vue +87 -0
- package/src/index.ts +8 -0
- package/src/ui/InfoBar.vue +20 -1
- package/src/ui/Tooltip.vue +36 -2
- package/src/ui/YLabel.vue +2 -13
|
@@ -4,11 +4,11 @@ import { decimateLineData as q } from "../data/decimation.js";
|
|
|
4
4
|
import { hexToRgba as X } from "../utils/color.js";
|
|
5
5
|
import { lerp as N } from "../utils/math.js";
|
|
6
6
|
import { BaseMultiLayerSeries as ut } from "./base-multi-layer.js";
|
|
7
|
-
import { unfoldIntro as ft, backfillSweepIntro as pt } from "./line-intro.js";
|
|
8
|
-
import { buildCurveSegments as tt } from "./painters/canvas-path.js";
|
|
9
|
-
import { resolveLinePainter as
|
|
10
|
-
import { ScaleStack as
|
|
11
|
-
const
|
|
7
|
+
import { unfoldIntro as ft, scaleMean as mt, backfillSweepIntro as pt } 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 = {
|
|
12
12
|
colors: ["#2962FF"],
|
|
13
13
|
strokeWidth: 1,
|
|
14
14
|
area: { visible: !0 },
|
|
@@ -21,81 +21,62 @@ const gt = {
|
|
|
21
21
|
introMs: lt,
|
|
22
22
|
historyRevealMs: nt
|
|
23
23
|
};
|
|
24
|
-
function
|
|
25
|
-
const t =
|
|
24
|
+
function ot(y) {
|
|
25
|
+
const t = y.areaFill, i = t !== void 0 && y.area === void 0 ? { visible: !!t } : y.area;
|
|
26
26
|
return {
|
|
27
|
-
...
|
|
28
|
-
area:
|
|
29
|
-
entryMs:
|
|
30
|
-
smoothMs:
|
|
31
|
-
pulseMs:
|
|
32
|
-
introMs:
|
|
33
|
-
historyRevealMs:
|
|
27
|
+
...y,
|
|
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
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
|
-
function
|
|
37
|
-
return
|
|
36
|
+
function st(y) {
|
|
37
|
+
return y.map(([t, i]) => ({ x: t, y: i }));
|
|
38
38
|
}
|
|
39
|
-
const J = 0.15,
|
|
40
|
-
function j(
|
|
41
|
-
const { resolve:
|
|
42
|
-
if (
|
|
43
|
-
if (t <=
|
|
44
|
-
const s =
|
|
45
|
-
if (t >= s.time) return Number.isFinite(s.value) ?
|
|
46
|
-
let l = 0,
|
|
47
|
-
for (;
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
const f =
|
|
52
|
-
if (!Number.isFinite(f.value) || !Number.isFinite(
|
|
53
|
-
const m =
|
|
54
|
-
return m <= 0 ?
|
|
39
|
+
const J = 0.15, xt = pt();
|
|
40
|
+
function j(y, t, i) {
|
|
41
|
+
const { resolve: e, lerp: o = N } = 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];
|
|
45
|
+
if (t >= s.time) return Number.isFinite(s.value) ? e(s) : null;
|
|
46
|
+
let l = 0, r = y.length - 1;
|
|
47
|
+
for (; r - l > 1; ) {
|
|
48
|
+
const c = l + r >> 1;
|
|
49
|
+
y[c].time <= t ? l = c : r = c;
|
|
50
|
+
}
|
|
51
|
+
const f = y[l], h = y[r];
|
|
52
|
+
if (!Number.isFinite(f.value) || !Number.isFinite(h.value)) return null;
|
|
53
|
+
const m = h.time - f.time;
|
|
54
|
+
return m <= 0 ? e(f) : o(e(f), e(h), (t - f.time) / m);
|
|
55
55
|
}
|
|
56
|
-
function
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const s = i / o;
|
|
63
|
-
return e === null ? s : e.inverse(s);
|
|
64
|
-
}
|
|
65
|
-
function vt(x, t) {
|
|
66
|
-
let e = 0, i = x.length - 1;
|
|
67
|
-
for (; e <= i; ) {
|
|
68
|
-
const o = e + i >> 1;
|
|
69
|
-
if (x[o] === t) return o;
|
|
70
|
-
x[o] < t ? e = o + 1 : i = o - 1;
|
|
56
|
+
function yt(y, t) {
|
|
57
|
+
let i = 0, e = y.length - 1;
|
|
58
|
+
for (; i <= e; ) {
|
|
59
|
+
const o = i + e >> 1;
|
|
60
|
+
if (y[o] === t) return o;
|
|
61
|
+
y[o] < t ? i = o + 1 : e = o - 1;
|
|
71
62
|
}
|
|
72
63
|
return -1;
|
|
73
64
|
}
|
|
74
|
-
|
|
75
|
-
for (const e of t)
|
|
76
|
-
e.kind === "line" ? x.lineTo(e.x, e.y) : x.bezierCurveTo(e.cp1x, e.cp1y, e.cp2x, e.cp2y, e.x, e.y);
|
|
77
|
-
}
|
|
78
|
-
function yt(x, t, e) {
|
|
79
|
-
for (let i = e.length - 1; i >= 0; i--) {
|
|
80
|
-
const o = e[i], s = i > 0 ? e[i - 1] : t[0];
|
|
81
|
-
o.kind === "line" ? x.lineTo(s.x, s.y) : x.bezierCurveTo(o.cp2x, o.cp2y, o.cp1x, o.cp1y, s.x, s.y);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
class bt extends ut {
|
|
65
|
+
class Pt extends ut {
|
|
85
66
|
kind = "line";
|
|
86
67
|
areaGradientCache = /* @__PURE__ */ new Map();
|
|
87
|
-
constructor(t,
|
|
88
|
-
super(t), this.options =
|
|
68
|
+
constructor(t, i) {
|
|
69
|
+
super(t), this.options = ot({ ...vt, ...i });
|
|
89
70
|
}
|
|
90
71
|
updateOptions(t) {
|
|
91
|
-
this.options =
|
|
72
|
+
this.options = ot({ ...this.options, ...t });
|
|
92
73
|
}
|
|
93
74
|
getStacking() {
|
|
94
75
|
return this.options.stacking;
|
|
95
76
|
}
|
|
96
|
-
applyTheme(t,
|
|
97
|
-
const
|
|
98
|
-
this.updateOptions({ colors:
|
|
77
|
+
applyTheme(t, i) {
|
|
78
|
+
const e = this.stores.length === 1 ? [t.line.color] : t.seriesColors.slice(0, this.stores.length);
|
|
79
|
+
this.updateOptions({ colors: e }), this.options.strokeWidth === i.line.width && this.updateOptions({ strokeWidth: t.line.width });
|
|
99
80
|
}
|
|
100
81
|
isEntryEnabled() {
|
|
101
82
|
return (this.options.entryAnimation ?? "grow") !== "none";
|
|
@@ -106,27 +87,27 @@ class bt extends ut {
|
|
|
106
87
|
get overlayNeedsAnimation() {
|
|
107
88
|
return this.hasPulse;
|
|
108
89
|
}
|
|
109
|
-
hasOverlayContentInRange(t,
|
|
110
|
-
for (let
|
|
111
|
-
if (this.getLayerAlpha(
|
|
112
|
-
const o = this.stores[
|
|
90
|
+
hasOverlayContentInRange(t, i) {
|
|
91
|
+
for (let e = 0; e < this.stores.length; e++) {
|
|
92
|
+
if (this.getLayerAlpha(e) <= 0) continue;
|
|
93
|
+
const o = this.stores[e].last();
|
|
113
94
|
if (o && o.time >= t) return !0;
|
|
114
95
|
}
|
|
115
96
|
return !1;
|
|
116
97
|
}
|
|
117
98
|
render(t) {
|
|
118
99
|
this.tickAnimations(performance.now()), this.lastYScale = t.yScale;
|
|
119
|
-
const { context:
|
|
100
|
+
const { context: i } = t.scope;
|
|
120
101
|
this.historyDirectives = null;
|
|
121
|
-
const
|
|
122
|
-
if (this.historyWave.active &&
|
|
123
|
-
const
|
|
124
|
-
|
|
102
|
+
const e = this.historyRange;
|
|
103
|
+
if (this.historyWave.active && e !== null) {
|
|
104
|
+
const r = this.options.historyReveal ?? xt;
|
|
105
|
+
r !== "none" && (this.historyDirectives = r(this.buildHistoryFrame(t, e)));
|
|
125
106
|
}
|
|
126
107
|
const o = this.historyDirectives, s = o?.ghostAlpha ?? 0;
|
|
127
|
-
s > 0 && (
|
|
128
|
-
const l = this.applyHistoryClip(t, o,
|
|
129
|
-
this.introWave.active ? this.renderWithIntro(t) : (this.introDirectives = null, this.renderBody(t)), l &&
|
|
108
|
+
s > 0 && (i.save(), i.globalAlpha *= s, this.introGhostPass = !0, this.renderBody(t), this.introGhostPass = !1, i.restore());
|
|
109
|
+
const l = this.applyHistoryClip(t, o, e);
|
|
110
|
+
this.introWave.active ? this.renderWithIntro(t) : (this.introDirectives = null, this.renderBody(t)), l && i.restore(), o?.heads !== void 0 && o.heads.length > 0 && this.drawIntroHeads(t, o.heads, this.historyWave.linear());
|
|
130
111
|
}
|
|
131
112
|
/**
|
|
132
113
|
* Initial-load intro pass: the resolved LineIntroFn describes this frame
|
|
@@ -134,16 +115,16 @@ class bt extends ut {
|
|
|
134
115
|
* renderer executes the directives around the untouched body pass.
|
|
135
116
|
*/
|
|
136
117
|
renderWithIntro(t) {
|
|
137
|
-
const
|
|
138
|
-
this.introDirectives =
|
|
139
|
-
const { context:
|
|
140
|
-
l > 0 && (
|
|
141
|
-
const
|
|
118
|
+
const i = this.resolveIntro()(this.buildIntroFrame(t));
|
|
119
|
+
this.introDirectives = i;
|
|
120
|
+
const { context: e } = t.scope, { width: o, height: s } = t.scope.bitmapSize, l = i.ghostAlpha ?? 0;
|
|
121
|
+
l > 0 && (e.save(), e.globalAlpha *= l, this.introGhostPass = !0, this.renderBody(t), this.introGhostPass = !1, e.restore());
|
|
122
|
+
const r = i.clip, f = r !== void 0 && (r.fromX !== void 0 || r.toX !== void 0);
|
|
142
123
|
if (f) {
|
|
143
|
-
const
|
|
144
|
-
|
|
124
|
+
const h = r.fromX ?? 0, m = r.toX ?? o;
|
|
125
|
+
e.save(), e.beginPath(), e.rect(h, 0, Math.max(0, m - h), s), e.clip();
|
|
145
126
|
}
|
|
146
|
-
this.renderBody(t), f &&
|
|
127
|
+
this.renderBody(t), f && e.restore(), i.heads !== void 0 && i.heads.length > 0 && this.drawIntroHeads(t, i.heads, this.introWave.linear());
|
|
147
128
|
}
|
|
148
129
|
/**
|
|
149
130
|
* Apply the history reveal's clip directive, mapped from reveal space
|
|
@@ -151,11 +132,11 @@ class bt extends ut {
|
|
|
151
132
|
* to bitmap space. Everything at or after the boundary always draws; a
|
|
152
133
|
* small pad keeps the stroke cap at the reveal front from being shaved.
|
|
153
134
|
*/
|
|
154
|
-
applyHistoryClip(t,
|
|
155
|
-
const o =
|
|
156
|
-
if (o === void 0 ||
|
|
157
|
-
const { context: s } = t.scope, { width: l, height:
|
|
158
|
-
return s.save(), s.beginPath(), s.rect(f -
|
|
135
|
+
applyHistoryClip(t, i, e) {
|
|
136
|
+
const o = i?.clip;
|
|
137
|
+
if (o === void 0 || e === null || o.fromX === void 0 && o.toX === void 0) return !1;
|
|
138
|
+
const { context: s } = t.scope, { width: l, height: r } = t.scope.bitmapSize, f = t.timeScale.timeToBitmapXExact(e.to), h = Math.abs(f - t.timeScale.timeToBitmapXExact(e.from)), m = Math.max(2, (this.options.strokeWidth ?? 1) * t.scope.horizontalPixelRatio), c = o.fromX ?? 0, x = o.toX ?? h;
|
|
139
|
+
return s.save(), s.beginPath(), s.rect(f - x - m, 0, Math.max(0, x - c + m), r), s.rect(f, 0, Math.max(0, l - f), r), s.clip(), !0;
|
|
159
140
|
}
|
|
160
141
|
renderBody(t) {
|
|
161
142
|
this.options.stacking === "off" ? (this.stackedEdges = null, this.renderOff(t)) : this.renderStacked(t, this.options.stacking === "percent");
|
|
@@ -207,55 +188,55 @@ class bt extends ut {
|
|
|
207
188
|
* accessors are scoped to that span — `layerMean` anchors an unfold to
|
|
208
189
|
* the new history, not the whole window.
|
|
209
190
|
*/
|
|
210
|
-
buildHistoryFrame(t,
|
|
191
|
+
buildHistoryFrame(t, i) {
|
|
211
192
|
return this.buildFrame(t, {
|
|
212
193
|
progress: this.historyWave.linear(),
|
|
213
|
-
range:
|
|
194
|
+
range: i,
|
|
214
195
|
width: Math.abs(
|
|
215
|
-
t.timeScale.timeToBitmapXExact(
|
|
196
|
+
t.timeScale.timeToBitmapXExact(i.to) - t.timeScale.timeToBitmapXExact(i.from)
|
|
216
197
|
)
|
|
217
198
|
});
|
|
218
199
|
}
|
|
219
|
-
buildFrame(t,
|
|
220
|
-
const { timeScale:
|
|
221
|
-
let
|
|
222
|
-
const
|
|
223
|
-
let
|
|
224
|
-
return
|
|
200
|
+
buildFrame(t, i) {
|
|
201
|
+
const { timeScale: e, yScale: o, scope: s } = t, { progress: l, range: r, width: f } = i, h = this.options.stacking === "percent", m = new Array(this.stores.length), c = new Array(this.stores.length);
|
|
202
|
+
let x, n;
|
|
203
|
+
const p = (a) => {
|
|
204
|
+
let g = m[a];
|
|
205
|
+
return g === void 0 && (g = this.stores[a]?.getVisibleData(r.from, r.to) ?? [], m[a] = g), g;
|
|
225
206
|
};
|
|
226
207
|
return {
|
|
227
208
|
progress: l,
|
|
228
|
-
range:
|
|
209
|
+
range: r,
|
|
229
210
|
width: f,
|
|
230
211
|
height: o.getMediaHeight() * s.verticalPixelRatio,
|
|
231
212
|
stacking: this.options.stacking,
|
|
232
|
-
timeToX: (
|
|
233
|
-
xToTime: (
|
|
234
|
-
valueToY: (
|
|
235
|
-
lerpValue: (
|
|
213
|
+
timeToX: (a) => e.timeToBitmapXExact(a),
|
|
214
|
+
xToTime: (a) => e.xToTime(a / s.horizontalPixelRatio),
|
|
215
|
+
valueToY: (a) => o.valueToBitmapYExact(a),
|
|
216
|
+
lerpValue: (a, g, A) => o.lerpValue(a, g, A),
|
|
236
217
|
layerCount: this.stores.length,
|
|
237
|
-
layerData:
|
|
238
|
-
layerMean: (
|
|
239
|
-
let
|
|
240
|
-
return
|
|
218
|
+
layerData: p,
|
|
219
|
+
layerMean: (a) => {
|
|
220
|
+
let g = c[a];
|
|
221
|
+
return g === void 0 && (h ? (x ??= this.meanShares(p, o), g = x[a]) : g = mt(p(a), o), c[a] = g), g;
|
|
241
222
|
},
|
|
242
223
|
primaryPath: () => {
|
|
243
|
-
if (
|
|
244
|
-
|
|
245
|
-
for (let
|
|
246
|
-
if (this.getLayerAlpha(
|
|
247
|
-
const
|
|
248
|
-
if (!(
|
|
249
|
-
|
|
250
|
-
x:
|
|
251
|
-
y: o.valueToBitmapYExact(
|
|
252
|
-
time:
|
|
224
|
+
if (n === void 0) {
|
|
225
|
+
n = null;
|
|
226
|
+
for (let a = 0; a < this.stores.length; a++) {
|
|
227
|
+
if (this.getLayerAlpha(a) <= 0 || !this.stores[a].isVisible()) continue;
|
|
228
|
+
const g = p(a).filter((A) => o.isPlottable(A.value));
|
|
229
|
+
if (!(g.length < 2)) {
|
|
230
|
+
n = g.map((A) => ({
|
|
231
|
+
x: e.timeToBitmapXExact(A.time),
|
|
232
|
+
y: o.valueToBitmapYExact(A.value),
|
|
233
|
+
time: A.time
|
|
253
234
|
}));
|
|
254
235
|
break;
|
|
255
236
|
}
|
|
256
237
|
}
|
|
257
238
|
}
|
|
258
|
-
return
|
|
239
|
+
return n;
|
|
259
240
|
}
|
|
260
241
|
};
|
|
261
242
|
}
|
|
@@ -265,16 +246,59 @@ class bt extends ut {
|
|
|
265
246
|
* overlay pulse) already flows through `effectiveValue`, so one override
|
|
266
247
|
* animates the whole geometry.
|
|
267
248
|
*/
|
|
268
|
-
effectiveValue(t,
|
|
269
|
-
const s = super.effectiveValue(t,
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
249
|
+
effectiveValue(t, i, e, o) {
|
|
250
|
+
const s = super.effectiveValue(t, i, e, o);
|
|
251
|
+
return this.options.stacking === "percent" ? s : this.introValue(t, { layerIndex: i, time: e, value: s });
|
|
252
|
+
}
|
|
253
|
+
/** Layer's share of its column in percent, passed through the intro value transform. */
|
|
254
|
+
introShare(t, i) {
|
|
255
|
+
const { layerIndex: e, time: o, value: s, total: l } = i;
|
|
256
|
+
if (l <= 0) return s;
|
|
257
|
+
const r = s / l * 100;
|
|
258
|
+
return Math.max(0, this.introValue(t, { layerIndex: e, time: o, value: r }));
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* What `layerMean` reports on a percent stack: each layer's mean share over
|
|
262
|
+
* the shared columns, alpha-weighted like the stacked pass, or `null` when it has none.
|
|
263
|
+
* A layer counts 0 where it has no sample yet, so the means sum to 100.
|
|
264
|
+
*/
|
|
265
|
+
meanShares(t, i) {
|
|
266
|
+
const e = this.stores.length, o = /* @__PURE__ */ new Set();
|
|
267
|
+
for (let h = 0; h < e; h++)
|
|
268
|
+
for (const m of t(h))
|
|
269
|
+
o.add(m.time);
|
|
270
|
+
const s = new Array(e).fill(0), l = new Array(e).fill(!1), r = new Array(e);
|
|
271
|
+
let f = 0;
|
|
272
|
+
for (const h of o) {
|
|
273
|
+
let m = 0;
|
|
274
|
+
for (let c = 0; c < e; c++) {
|
|
275
|
+
r[c] = null;
|
|
276
|
+
const x = this.getLayerAlpha(c), n = t(c);
|
|
277
|
+
if (x <= 0 || n.length === 0 || h < n[0].time) continue;
|
|
278
|
+
const p = j(n, h, { resolve: (a) => a.value });
|
|
279
|
+
p === null || !i.isPlottable(p) || (r[c] = p * x, m += p * x);
|
|
280
|
+
}
|
|
281
|
+
if (!(m <= 0)) {
|
|
282
|
+
f++;
|
|
283
|
+
for (let c = 0; c < e; c++) {
|
|
284
|
+
const x = r[c];
|
|
285
|
+
x !== null && (s[c] += x / m * 100, l[c] = !0);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return s.map((h, m) => l[m] ? h / f : null);
|
|
290
|
+
}
|
|
291
|
+
/** The active history-reveal or intro value transform applied to one value. */
|
|
292
|
+
introValue(t, i) {
|
|
293
|
+
const { layerIndex: e, time: o, value: s } = i, l = this.historyWave.active ? this.historyDirectives?.value : void 0, r = this.historyRange;
|
|
294
|
+
if (l !== void 0 && r !== null && o < r.to) {
|
|
295
|
+
const x = r.to - r.from, n = x > 0 ? Math.min(1, Math.max(0, (r.to - o) / x)) : 0;
|
|
296
|
+
return l({ layerIndex: e, time: o, value: s, position: n });
|
|
273
297
|
}
|
|
274
298
|
const f = this.introWave.active ? this.introDirectives?.value : void 0;
|
|
275
299
|
if (f === void 0) return s;
|
|
276
|
-
const
|
|
277
|
-
return f({ layerIndex: e, time:
|
|
300
|
+
const h = t.timeScale.getRange(), m = h.to - h.from, c = m > 0 ? Math.min(1, Math.max(0, (o - h.from) / m)) : 0;
|
|
301
|
+
return f({ layerIndex: e, time: o, value: s, position: c });
|
|
278
302
|
}
|
|
279
303
|
/**
|
|
280
304
|
* Extends the base last-value query with the 'grow' entrance's value-space
|
|
@@ -284,36 +308,36 @@ class bt extends ut {
|
|
|
284
308
|
* this, a tooltip/YLabel query would report a freshly-appended point's raw
|
|
285
309
|
* value the instant it lands, `entryMs` before the marker visually arrives there.
|
|
286
310
|
*/
|
|
287
|
-
snapshotValue(t,
|
|
288
|
-
const o = super.snapshotValue(t,
|
|
289
|
-
return (this.options.entryAnimation ?? "grow") !== "grow" ? o : this.chainedTailValues(t)?.get(
|
|
311
|
+
snapshotValue(t, i, e) {
|
|
312
|
+
const o = super.snapshotValue(t, i, e);
|
|
313
|
+
return (this.options.entryAnimation ?? "grow") !== "grow" ? o : this.chainedTailValues(t)?.get(i) ?? o;
|
|
290
314
|
}
|
|
291
315
|
/**
|
|
292
316
|
* Value-space counterpart of {@link chainedTailPositions} — see {@link snapshotValue}.
|
|
293
317
|
* `resolve` lets the stacked renderer feed its ctx-aware `effectiveValue`
|
|
294
318
|
* in; query paths, which have no render context, keep the `liveValue` default.
|
|
295
319
|
*/
|
|
296
|
-
chainedTailValues(t,
|
|
297
|
-
const
|
|
298
|
-
if (
|
|
299
|
-
const o = this.stores[t].getAll(), s = o.length - 1 -
|
|
320
|
+
chainedTailValues(t, i = (e, o) => this.liveValue(t, e, o)) {
|
|
321
|
+
const e = this.unsettledTail(t);
|
|
322
|
+
if (e.length === 0) return null;
|
|
323
|
+
const o = this.stores[t].getAll(), s = o.length - 1 - e.length;
|
|
300
324
|
if (s < 0) return null;
|
|
301
325
|
const l = o[s];
|
|
302
326
|
if (!Number.isFinite(l.value)) return null;
|
|
303
|
-
let
|
|
327
|
+
let r = i(l.time, l.value);
|
|
304
328
|
const f = /* @__PURE__ */ new Map();
|
|
305
|
-
for (let
|
|
306
|
-
const m = o[s + 1 +
|
|
329
|
+
for (let h = 0; h < e.length; h++) {
|
|
330
|
+
const m = o[s + 1 + h];
|
|
307
331
|
if (!Number.isFinite(m.value)) return null;
|
|
308
|
-
const
|
|
309
|
-
f.set(m.time, n),
|
|
332
|
+
const c = U(e[h].progress), x = i(m.time, m.value), n = this.axisLerp(r, x, c);
|
|
333
|
+
f.set(m.time, n), r = n;
|
|
310
334
|
}
|
|
311
335
|
return f;
|
|
312
336
|
}
|
|
313
337
|
/** `lerp` along the last rendered Y axis — plain before the first render. */
|
|
314
|
-
axisLerp(t,
|
|
338
|
+
axisLerp(t, i, e) {
|
|
315
339
|
const o = this.lastYScale;
|
|
316
|
-
return o === null ? N(t,
|
|
340
|
+
return o === null ? N(t, i, e) : o.lerpValue(t, i, e);
|
|
317
341
|
}
|
|
318
342
|
/**
|
|
319
343
|
* Glowing pulse dots riding the intro's head anchors — the line reads as
|
|
@@ -321,23 +345,23 @@ class bt extends ut {
|
|
|
321
345
|
* the reveal lands. Off-mode only: recomputing the stacked cumulative at
|
|
322
346
|
* an arbitrary head time isn't worth it for a one-second decoration.
|
|
323
347
|
*/
|
|
324
|
-
drawIntroHeads(t,
|
|
348
|
+
drawIntroHeads(t, i, e) {
|
|
325
349
|
if (this.options.stacking !== "off") return;
|
|
326
|
-
const o = Math.min(1,
|
|
350
|
+
const o = Math.min(1, e / J), s = Math.min(1, (1 - e) / J), l = Math.max(0, Math.min(o, s));
|
|
327
351
|
if (l <= 0) return;
|
|
328
|
-
const { scope:
|
|
329
|
-
for (const f of
|
|
330
|
-
for (let
|
|
331
|
-
const m = this.getLayerAlpha(
|
|
332
|
-
if (m <= 0 || !this.stores[
|
|
333
|
-
const
|
|
334
|
-
|
|
335
|
-
ctx:
|
|
336
|
-
x:
|
|
337
|
-
y:
|
|
338
|
-
color: this.resolveLayerColor(
|
|
339
|
-
pixelRatio:
|
|
340
|
-
phase:
|
|
352
|
+
const { scope: r } = t;
|
|
353
|
+
for (const f of i)
|
|
354
|
+
for (let h = 0; h < this.stores.length; h++) {
|
|
355
|
+
const m = this.getLayerAlpha(h);
|
|
356
|
+
if (m <= 0 || !this.stores[h].isVisible()) continue;
|
|
357
|
+
const c = this.introHeadAnchor(t, h, f);
|
|
358
|
+
c !== null && this.drawPulse({
|
|
359
|
+
ctx: r.context,
|
|
360
|
+
x: c.x,
|
|
361
|
+
y: c.y,
|
|
362
|
+
color: this.resolveLayerColor(h, c.value),
|
|
363
|
+
pixelRatio: r.horizontalPixelRatio,
|
|
364
|
+
phase: e * 2,
|
|
341
365
|
alpha: l * m
|
|
342
366
|
});
|
|
343
367
|
}
|
|
@@ -353,31 +377,31 @@ class bt extends ut {
|
|
|
353
377
|
* right-padding region beyond the line's end (the sweep front travels the
|
|
354
378
|
* visible range, not the data span) and jumps back on settle.
|
|
355
379
|
*/
|
|
356
|
-
introHeadAnchor(t,
|
|
357
|
-
const { timeScale: o, yScale: s } = t, l = o.getRange(),
|
|
358
|
-
if (
|
|
359
|
-
const f = this.stores[
|
|
360
|
-
if (f !== void 0 &&
|
|
380
|
+
introHeadAnchor(t, i, e) {
|
|
381
|
+
const { timeScale: o, yScale: s } = t, l = o.getRange(), r = this.stores[i].getVisibleData(l.from, l.to);
|
|
382
|
+
if (r.length === 0) return null;
|
|
383
|
+
const f = this.stores[i].last();
|
|
384
|
+
if (f !== void 0 && e.time >= f.time) {
|
|
361
385
|
if (!s.isPlottable(f.value)) return null;
|
|
362
|
-
const
|
|
363
|
-
return
|
|
386
|
+
const c = this.trailingEndpoint(t, i);
|
|
387
|
+
return c === null ? null : { x: c.x, y: c.y, value: f.value };
|
|
364
388
|
}
|
|
365
|
-
const
|
|
366
|
-
if (
|
|
367
|
-
if (!s.isPlottable(
|
|
368
|
-
const
|
|
389
|
+
const h = r[0];
|
|
390
|
+
if (e.time <= h.time) {
|
|
391
|
+
if (!s.isPlottable(h.value)) return null;
|
|
392
|
+
const c = this.effectiveValue(t, i, h.time, h.value);
|
|
369
393
|
return {
|
|
370
|
-
x: o.timeToBitmapXExact(
|
|
371
|
-
y: s.valueToBitmapYExact(
|
|
372
|
-
value:
|
|
394
|
+
x: o.timeToBitmapXExact(h.time),
|
|
395
|
+
y: s.valueToBitmapYExact(c),
|
|
396
|
+
value: h.value
|
|
373
397
|
};
|
|
374
398
|
}
|
|
375
|
-
const m = j(
|
|
376
|
-
resolve: (
|
|
399
|
+
const m = j(r, e.time, {
|
|
400
|
+
resolve: (c) => this.effectiveValue(t, i, c.time, c.value),
|
|
377
401
|
// Along the axis, so the dot stays on the straight segment the stroke draws.
|
|
378
|
-
lerp: (
|
|
402
|
+
lerp: (c, x, n) => !s.isPlottable(c) || !s.isPlottable(x) ? Number.NaN : s.lerpValue(c, x, n)
|
|
379
403
|
});
|
|
380
|
-
return m === null || !s.isPlottable(m) ? null : { x:
|
|
404
|
+
return m === null || !s.isPlottable(m) ? null : { x: e.x, y: s.valueToBitmapYExact(m), value: m };
|
|
381
405
|
}
|
|
382
406
|
/**
|
|
383
407
|
* Rendered positions of the layer's still-unsettled trailing points, keyed
|
|
@@ -401,44 +425,52 @@ class bt extends ut {
|
|
|
401
425
|
* lagging sibling shouldn't zero out the moment another layer ticks past
|
|
402
426
|
* it (see `renderStacked`'s `valueMaps` comment for the full rationale).
|
|
403
427
|
*/
|
|
404
|
-
stackedValueAt(t,
|
|
405
|
-
const o = this.options.stacking === "percent", s = (this.options.entryAnimation ?? "grow") === "grow", l = new Array(this.stores.length),
|
|
428
|
+
stackedValueAt(t, i, e) {
|
|
429
|
+
const o = this.options.stacking === "percent", s = (this.options.entryAnimation ?? "grow") === "grow", l = new Array(this.stores.length), r = (n) => {
|
|
406
430
|
if (!s) return null;
|
|
407
|
-
const
|
|
408
|
-
if (
|
|
409
|
-
const
|
|
410
|
-
return l[n] =
|
|
431
|
+
const p = l[n];
|
|
432
|
+
if (p !== void 0) return p;
|
|
433
|
+
const a = this.chainedTailValues(n, (g, A) => this.effectiveValue(t, n, g, A));
|
|
434
|
+
return l[n] = a, a;
|
|
411
435
|
}, f = (n) => {
|
|
412
|
-
const
|
|
413
|
-
if (
|
|
414
|
-
const
|
|
415
|
-
return j(
|
|
416
|
-
resolve: (
|
|
436
|
+
const p = this.stores[n].getAll();
|
|
437
|
+
if (p.length === 0 || e < p[0].time) return null;
|
|
438
|
+
const a = r(n);
|
|
439
|
+
return j(p, e, {
|
|
440
|
+
resolve: (g) => a?.get(g.time) ?? this.effectiveValue(t, n, g.time, g.value)
|
|
417
441
|
});
|
|
418
|
-
}, { yScale:
|
|
419
|
-
if (
|
|
420
|
-
const n = new
|
|
421
|
-
for (let
|
|
422
|
-
const
|
|
423
|
-
|
|
442
|
+
}, { yScale: h } = t;
|
|
443
|
+
if (h.getTransform() !== null && !o) {
|
|
444
|
+
const n = new it(h);
|
|
445
|
+
for (let p = 0; p <= i; p++) {
|
|
446
|
+
const a = this.getLayerAlpha(p), g = a > 0 ? f(p) : null;
|
|
447
|
+
g !== null && h.isPlottable(g) && n.push(g, a);
|
|
424
448
|
}
|
|
425
449
|
return n.edge;
|
|
426
450
|
}
|
|
427
451
|
const m = (n) => {
|
|
428
|
-
const
|
|
429
|
-
if (
|
|
430
|
-
const
|
|
431
|
-
|
|
452
|
+
const p = this.getLayerAlpha(n);
|
|
453
|
+
if (p <= 0) return null;
|
|
454
|
+
const a = this.stores[n].getAll();
|
|
455
|
+
if (o && a.length > 0 && e < a[0].time) return 0;
|
|
456
|
+
const g = f(n);
|
|
457
|
+
return g === null ? null : g * p;
|
|
432
458
|
};
|
|
433
|
-
let
|
|
459
|
+
let c = 0;
|
|
434
460
|
if (o)
|
|
435
|
-
for (let n = 0; n < this.stores.length; n++)
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
461
|
+
for (let n = 0; n < this.stores.length; n++)
|
|
462
|
+
c += m(n) ?? 0;
|
|
463
|
+
let x = 0;
|
|
464
|
+
for (let n = 0; n <= i; n++) {
|
|
465
|
+
const p = m(n);
|
|
466
|
+
if (p !== null)
|
|
467
|
+
if (o) {
|
|
468
|
+
const a = this.introShare(t, { layerIndex: n, time: e, value: p, total: c });
|
|
469
|
+
x = Math.min(100, x + a);
|
|
470
|
+
} else
|
|
471
|
+
x += p;
|
|
440
472
|
}
|
|
441
|
-
return
|
|
473
|
+
return x;
|
|
442
474
|
}
|
|
443
475
|
/**
|
|
444
476
|
* Bitmap position for layer `li`'s stacked boundary at time `t`.
|
|
@@ -451,46 +483,46 @@ class bt extends ut {
|
|
|
451
483
|
* feed. Falls back to the raw settled position off-column (decimated
|
|
452
484
|
* history, or before the first stacked frame).
|
|
453
485
|
*/
|
|
454
|
-
stackedPositionAt(t,
|
|
455
|
-
const o = this.paintedStackVertex(t,
|
|
486
|
+
stackedPositionAt(t, i, e) {
|
|
487
|
+
const o = this.paintedStackVertex(t, i, e);
|
|
456
488
|
if (o !== null) return o;
|
|
457
|
-
const { timeScale: s, yScale: l } = t,
|
|
458
|
-
if ((this.options.entryAnimation ?? "grow") !== "grow" ||
|
|
459
|
-
let
|
|
460
|
-
for (let n = 0; n <
|
|
461
|
-
|
|
462
|
-
return { x
|
|
489
|
+
const { timeScale: s, yScale: l } = t, r = l.valueToBitmapYExact(this.stackedValueAt(t, i, e)), f = s.timeToBitmapXExact(e), h = this.unsettledTail(i), m = this.stores[i].getAll(), c = m.length - 1 - h.length;
|
|
490
|
+
if ((this.options.entryAnimation ?? "grow") !== "grow" || e !== m[m.length - 1]?.time || h.length === 0 || c < 0) return { x: f, y: r };
|
|
491
|
+
let x = s.timeToBitmapXExact(m[c].time);
|
|
492
|
+
for (let n = 0; n < h.length; n++)
|
|
493
|
+
x = N(x, s.timeToBitmapXExact(m[c + 1 + n].time), U(h[n].progress));
|
|
494
|
+
return { x, y: r };
|
|
463
495
|
}
|
|
464
496
|
/** Upper-edge vertex of layer `li` at column `t`, replayed from the last
|
|
465
497
|
* stacked frame's data-space record against `ctx`'s scales. */
|
|
466
|
-
paintedStackVertex(t,
|
|
467
|
-
const o = this.stackedEdges, s = o?.cumulative[
|
|
498
|
+
paintedStackVertex(t, i, e) {
|
|
499
|
+
const o = this.stackedEdges, s = o?.cumulative[i];
|
|
468
500
|
if (o === null || s === void 0) return null;
|
|
469
|
-
const { times: l, growChain:
|
|
470
|
-
if (
|
|
471
|
-
const { timeScale: m, yScale:
|
|
472
|
-
if (
|
|
473
|
-
let
|
|
474
|
-
for (let
|
|
475
|
-
|
|
476
|
-
return { x:
|
|
477
|
-
}
|
|
478
|
-
chainedTailPositions(t,
|
|
479
|
-
const
|
|
480
|
-
if (
|
|
481
|
-
const o = this.stores[
|
|
501
|
+
const { times: l, growChain: r, collapse: f } = o, h = yt(l, e);
|
|
502
|
+
if (h < 0) return null;
|
|
503
|
+
const { timeScale: m, yScale: c } = t, x = t.scope.bitmapSize.height, n = f[i] ?? 1, p = c.valueToBitmapYExact(s[h]), a = n >= 1 ? p : x + (p - x) * n, g = l.length - r.length;
|
|
504
|
+
if (h < g) return { x: m.timeToBitmapXExact(e), y: a };
|
|
505
|
+
let A = m.timeToBitmapXExact(l[g - 1]);
|
|
506
|
+
for (let E = 0; E <= h - g; E++)
|
|
507
|
+
A = N(A, m.timeToBitmapXExact(l[g + E]), r[E]);
|
|
508
|
+
return { x: A, y: a };
|
|
509
|
+
}
|
|
510
|
+
chainedTailPositions(t, i) {
|
|
511
|
+
const e = this.unsettledTail(i);
|
|
512
|
+
if (e.length === 0) return null;
|
|
513
|
+
const o = this.stores[i].getAll(), s = o.length - 1 - e.length;
|
|
482
514
|
if (s < 0) return null;
|
|
483
|
-
const { timeScale: l, yScale:
|
|
484
|
-
if (!
|
|
485
|
-
let
|
|
486
|
-
const
|
|
487
|
-
for (let
|
|
488
|
-
const n = o[s + 1 +
|
|
489
|
-
if (!
|
|
490
|
-
const
|
|
491
|
-
|
|
515
|
+
const { timeScale: l, yScale: r } = t, f = o[s];
|
|
516
|
+
if (!r.isPlottable(f.value)) return null;
|
|
517
|
+
let h = l.timeToBitmapXExact(f.time), m = r.valueToBitmapYExact(this.effectiveValue(t, i, f.time, f.value));
|
|
518
|
+
const c = /* @__PURE__ */ new Map();
|
|
519
|
+
for (let x = 0; x < e.length; x++) {
|
|
520
|
+
const n = o[s + 1 + x];
|
|
521
|
+
if (!r.isPlottable(n.value)) return null;
|
|
522
|
+
const p = U(e[x].progress), a = l.timeToBitmapXExact(n.time), g = r.valueToBitmapYExact(this.effectiveValue(t, i, n.time, n.value)), A = N(h, a, p), E = N(m, g, p);
|
|
523
|
+
c.set(n.time, { x: A, y: E }), h = A, m = E;
|
|
492
524
|
}
|
|
493
|
-
return
|
|
525
|
+
return c;
|
|
494
526
|
}
|
|
495
527
|
/**
|
|
496
528
|
* Bitmap coordinates for the trailing endpoint of a layer — i.e. where the
|
|
@@ -502,11 +534,11 @@ class bt extends ut {
|
|
|
502
534
|
* (pulse dot) so the pulse glides in sync with the trailing segment instead
|
|
503
535
|
* of teleporting to the raw last.time while the line still unfurls.
|
|
504
536
|
*/
|
|
505
|
-
trailingEndpoint(t,
|
|
506
|
-
const
|
|
507
|
-
if (!
|
|
508
|
-
const { timeScale: o, yScale: s } = t, l = o.timeToBitmapXExact(
|
|
509
|
-
return (this.options.entryAnimation ?? "grow") !== "grow" ? { x: l, y:
|
|
537
|
+
trailingEndpoint(t, i) {
|
|
538
|
+
const e = this.stores[i].last();
|
|
539
|
+
if (!e) return null;
|
|
540
|
+
const { timeScale: o, yScale: s } = t, l = o.timeToBitmapXExact(e.time), r = s.valueToBitmapYExact(this.effectiveValue(t, i, e.time, e.value));
|
|
541
|
+
return (this.options.entryAnimation ?? "grow") !== "grow" ? { x: l, y: r } : this.chainedTailPositions(t, i)?.get(e.time) ?? { x: l, y: r };
|
|
510
542
|
}
|
|
511
543
|
/**
|
|
512
544
|
* Vertical stroke + area gradients for `options.threshold`, pinned to the
|
|
@@ -517,13 +549,13 @@ class bt extends ut {
|
|
|
517
549
|
* the Y-axis autoscales (and during the spike's entrance), so a cache keyed on
|
|
518
550
|
* the row would miss almost every frame anyway.
|
|
519
551
|
*/
|
|
520
|
-
buildThresholdPaint(t,
|
|
521
|
-
const
|
|
522
|
-
if (!
|
|
523
|
-
const { scope: o, yScale: s } = t, { context: l } = o,
|
|
524
|
-
|
|
525
|
-
const
|
|
526
|
-
return
|
|
552
|
+
buildThresholdPaint(t, i) {
|
|
553
|
+
const e = this.options.threshold;
|
|
554
|
+
if (!e) return null;
|
|
555
|
+
const { scope: o, yScale: s } = t, { context: l } = o, r = o.bitmapSize.height, f = e.above, h = e.below ?? i, m = 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, m - c), n = Math.min(1, m + c), p = l.createLinearGradient(0, 0, 0, r);
|
|
556
|
+
p.addColorStop(0, f), p.addColorStop(x, f), p.addColorStop(n, h), p.addColorStop(1, h);
|
|
557
|
+
const a = l.createLinearGradient(0, 0, 0, r);
|
|
558
|
+
return a.addColorStop(0, X(f, 0.26)), a.addColorStop(x, X(f, 0.14)), a.addColorStop(n, X(h, 0.1)), a.addColorStop(1, X(h, 0.01)), { stroke: p, area: a };
|
|
527
559
|
}
|
|
528
560
|
/**
|
|
529
561
|
* Dot markers at each data point (`options.points`). Callers pass the same
|
|
@@ -534,237 +566,245 @@ class bt extends ut {
|
|
|
534
566
|
* the stroke.
|
|
535
567
|
*/
|
|
536
568
|
drawPointMarkers(t) {
|
|
537
|
-
const
|
|
538
|
-
if (!
|
|
539
|
-
const { context:
|
|
569
|
+
const i = this.options.points;
|
|
570
|
+
if (!i?.visible) return;
|
|
571
|
+
const { context: e, points: o, pixelRatio: s, color: l } = t;
|
|
540
572
|
if (o.length === 0) return;
|
|
541
|
-
const
|
|
542
|
-
if (!(o.length > 1 && (o[o.length - 1].x - o[0].x) / (o.length - 1) <
|
|
543
|
-
|
|
573
|
+
const r = Math.max(1, (i.radius ?? 3) * s);
|
|
574
|
+
if (!(o.length > 1 && (o[o.length - 1].x - o[0].x) / (o.length - 1) < r * 3)) {
|
|
575
|
+
e.beginPath();
|
|
544
576
|
for (const f of o)
|
|
545
|
-
|
|
546
|
-
|
|
577
|
+
e.moveTo(f.x + r, f.y), e.arc(f.x, f.y, r, 0, Math.PI * 2);
|
|
578
|
+
e.fillStyle = i.color ?? l, e.fill();
|
|
547
579
|
}
|
|
548
580
|
}
|
|
549
581
|
/** Each layer drawn independently */
|
|
550
582
|
renderOff(t) {
|
|
551
|
-
const { scope:
|
|
583
|
+
const { scope: i, timeScale: e, yScale: o } = t, { context: s } = i, l = e.getRange(), { verticalPixelRatio: r } = i, f = this.options.strokeWidth > 0, h = Math.max(1, Math.round(this.options.strokeWidth * r)), m = this.options.entryAnimation ?? "grow", c = dt(this.options.linePainter ?? this.options.curve ?? "straight"), x = {
|
|
552
584
|
ctx: s,
|
|
553
585
|
theme: t.theme,
|
|
554
|
-
horizontalPixelRatio:
|
|
555
|
-
verticalPixelRatio:
|
|
586
|
+
horizontalPixelRatio: i.horizontalPixelRatio,
|
|
587
|
+
verticalPixelRatio: r
|
|
556
588
|
};
|
|
557
589
|
for (let n = 0; n < this.stores.length; n++) {
|
|
558
|
-
const
|
|
559
|
-
if (
|
|
560
|
-
let
|
|
561
|
-
const
|
|
562
|
-
if (
|
|
563
|
-
const
|
|
564
|
-
x:
|
|
590
|
+
const p = this.getLayerAlpha(n);
|
|
591
|
+
if (p <= 0) continue;
|
|
592
|
+
let a = this.stores[n].getVisibleData(l.from, l.to);
|
|
593
|
+
const g = i.mediaSize.width;
|
|
594
|
+
if (a.length > g * 2 && (a = q(a, Math.round(g * 1.5))), a.length < 2) continue;
|
|
595
|
+
const A = this.stores[n].last()?.value ?? a[a.length - 1].value, E = this.resolveLayerColor(n, A), B = this.buildThresholdPaint(t, E), L = a[a.length - 1], D = this.stores[n].last(), Y = D !== void 0 && L.time === D.time, z = Y ? this.entranceProgress(n, L.time) : 1, I = Y && m === "fade" && z < 1, O = (Y ? this.trailingEndpoint(t, n) : null) ?? {
|
|
596
|
+
x: e.timeToBitmapXExact(L.time),
|
|
565
597
|
y: o.valueToBitmapYExact(this.effectiveValue(t, n, L.time, L.value))
|
|
566
|
-
}, W = O.x,
|
|
567
|
-
(G ||
|
|
568
|
-
const
|
|
569
|
-
let
|
|
570
|
-
for (let
|
|
571
|
-
const S =
|
|
598
|
+
}, W = O.x, C = O.y, _ = Y && m === "grow" ? this.chainedTailPositions(t, n) : null, G = p < 1;
|
|
599
|
+
(G || I) && (s.save(), G && (s.globalAlpha *= p), I && (s.globalAlpha *= z));
|
|
600
|
+
const $ = a.length - 1, u = [];
|
|
601
|
+
let v = null;
|
|
602
|
+
for (let d = 0; d < $; d++) {
|
|
603
|
+
const S = a[d].value;
|
|
572
604
|
if (!o.isPlottable(S)) {
|
|
573
|
-
|
|
605
|
+
v = null;
|
|
574
606
|
continue;
|
|
575
607
|
}
|
|
576
|
-
|
|
577
|
-
const
|
|
578
|
-
if (
|
|
579
|
-
|
|
608
|
+
v || (v = [], u.push(v));
|
|
609
|
+
const w = _?.get(a[d].time);
|
|
610
|
+
if (w)
|
|
611
|
+
v.push({ x: w.x, y: w.y });
|
|
580
612
|
else {
|
|
581
|
-
const
|
|
582
|
-
|
|
613
|
+
const F = o.valueToBitmapYExact(this.effectiveValue(t, n, a[d].time, S));
|
|
614
|
+
v.push({ x: e.timeToBitmapXExact(a[d].time), y: F });
|
|
583
615
|
}
|
|
584
616
|
}
|
|
585
|
-
const
|
|
617
|
+
const M = a[$]?.value, b = Number.isFinite(W) && Number.isFinite(C) && o.isPlottable(M), P = m === "grow" && z < 1;
|
|
586
618
|
let T = null;
|
|
587
|
-
if (
|
|
619
|
+
if (b && (v ? (v.push({ x: W, y: C }), T = v) : u.push([{ x: W, y: C }])), f && u.some((d) => d.length >= 2)) {
|
|
588
620
|
s.beginPath();
|
|
589
|
-
for (const
|
|
590
|
-
|
|
591
|
-
s.strokeStyle = B ? B.stroke :
|
|
621
|
+
for (const d of u)
|
|
622
|
+
d.length < 2 || c(x, { points: d, color: E, lineWidth: h, closing: !1, grew: P && d === T });
|
|
623
|
+
s.strokeStyle = B ? B.stroke : E, s.lineWidth = h, s.lineJoin = "round", s.lineCap = "round", s.stroke();
|
|
592
624
|
}
|
|
593
625
|
if (f) {
|
|
594
|
-
const
|
|
626
|
+
const d = Math.max(1, h / 2);
|
|
595
627
|
let S = !1;
|
|
596
|
-
for (const
|
|
597
|
-
|
|
598
|
-
S && (s.fillStyle =
|
|
628
|
+
for (const w of u)
|
|
629
|
+
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));
|
|
630
|
+
S && (s.fillStyle = E, s.fill());
|
|
599
631
|
}
|
|
600
632
|
if (this.options.area.visible && !this.introGhostPass) {
|
|
601
|
-
const
|
|
633
|
+
const d = i.bitmapSize.height;
|
|
602
634
|
let S;
|
|
603
635
|
if (B)
|
|
604
636
|
S = B.area;
|
|
605
637
|
else {
|
|
606
|
-
const
|
|
607
|
-
|
|
638
|
+
const w = String(n), F = this.areaGradientCache.get(w);
|
|
639
|
+
F && F.bottomY === d && F.color === E ? S = F.gradient : (S = s.createLinearGradient(0, 0, 0, d), S.addColorStop(0, X(E, 0.12)), S.addColorStop(1, X(E, 0.01)), this.areaGradientCache.set(w, { gradient: S, bottomY: d, color: E }));
|
|
608
640
|
}
|
|
609
641
|
s.fillStyle = S;
|
|
610
|
-
for (const
|
|
611
|
-
|
|
642
|
+
for (const w of u)
|
|
643
|
+
w.length < 2 || (s.beginPath(), c(x, { points: w, color: E, lineWidth: h, closing: !0, grew: P && w === T }), s.lineTo(w[w.length - 1].x, d), s.lineTo(w[0].x, d), s.closePath(), s.fill());
|
|
612
644
|
}
|
|
613
645
|
if (this.options.points?.visible) {
|
|
614
|
-
const
|
|
615
|
-
for (const S of
|
|
616
|
-
for (const
|
|
617
|
-
this.drawPointMarkers({ context: s, points:
|
|
646
|
+
const d = [];
|
|
647
|
+
for (const S of u)
|
|
648
|
+
for (const w of S) d.push(w);
|
|
649
|
+
this.drawPointMarkers({ context: s, points: d, pixelRatio: i.horizontalPixelRatio, color: E });
|
|
618
650
|
}
|
|
619
|
-
(
|
|
651
|
+
(I || G) && s.restore();
|
|
620
652
|
}
|
|
621
653
|
}
|
|
622
654
|
/** Stacked area rendering */
|
|
623
|
-
renderStacked(t,
|
|
624
|
-
const { scope:
|
|
625
|
-
if (this.getLayerAlpha(
|
|
626
|
-
let
|
|
627
|
-
return
|
|
628
|
-
}),
|
|
629
|
-
for (const
|
|
630
|
-
for (const
|
|
631
|
-
const
|
|
632
|
-
if (
|
|
655
|
+
renderStacked(t, i) {
|
|
656
|
+
const { scope: e, timeScale: o, yScale: s } = t, { context: l } = e, r = o.getRange(), { verticalPixelRatio: f } = e, h = this.options.strokeWidth > 0, m = Math.max(1, Math.round(this.options.strokeWidth * f)), c = this.options.curve ?? "straight", x = e.mediaSize.width, n = this.stores.map((u, v) => {
|
|
657
|
+
if (this.getLayerAlpha(v) <= 0) return [];
|
|
658
|
+
let M = u.getVisibleData(r.from, r.to);
|
|
659
|
+
return M.length > x * 2 && (M = q(M, Math.round(x * 1.5))), M;
|
|
660
|
+
}), p = /* @__PURE__ */ new Set();
|
|
661
|
+
for (const u of n)
|
|
662
|
+
for (const v of u) p.add(v.time);
|
|
663
|
+
const a = Array.from(p).sort((u, v) => u - v);
|
|
664
|
+
if (a.length < 2) {
|
|
633
665
|
this.stackedEdges = null;
|
|
634
666
|
return;
|
|
635
667
|
}
|
|
636
|
-
const
|
|
637
|
-
const
|
|
638
|
-
if (
|
|
639
|
-
const
|
|
640
|
-
for (const
|
|
641
|
-
if (
|
|
642
|
-
const S = j(
|
|
643
|
-
S !== null &&
|
|
668
|
+
const g = this.options.entryAnimation ?? "grow", A = n.map((u, v) => {
|
|
669
|
+
const M = /* @__PURE__ */ new Map();
|
|
670
|
+
if (u.length === 0) return M;
|
|
671
|
+
const b = u[0].time, P = g === "grow" ? this.chainedTailValues(v, (d, S) => this.effectiveValue(t, v, d, S)) : null, T = (d) => P?.get(d.time) ?? this.effectiveValue(t, v, d.time, d.value);
|
|
672
|
+
for (const d of a) {
|
|
673
|
+
if (d < b) continue;
|
|
674
|
+
const S = j(u, d, { resolve: T });
|
|
675
|
+
S !== null && M.set(d, S);
|
|
644
676
|
}
|
|
645
|
-
return
|
|
646
|
-
}),
|
|
647
|
-
const
|
|
648
|
-
return
|
|
649
|
-
}, L = s.getTransform() !== null && !
|
|
650
|
-
for (let
|
|
651
|
-
const
|
|
677
|
+
return M;
|
|
678
|
+
}), E = this.stores.map((u, v) => this.getLayerAlpha(v)), B = (u, v) => {
|
|
679
|
+
const M = A[u].get(v);
|
|
680
|
+
return M === void 0 ? void 0 : M * E[u];
|
|
681
|
+
}, L = s.getTransform() !== null && !i, D = Array.from({ length: this.stores.length }, () => new Array(a.length).fill(0));
|
|
682
|
+
for (let u = 0; u < a.length; u++) {
|
|
683
|
+
const v = a[u];
|
|
652
684
|
if (L) {
|
|
653
|
-
const P = new
|
|
685
|
+
const P = new it(s);
|
|
654
686
|
for (let T = 0; T < this.stores.length; T++) {
|
|
655
|
-
const
|
|
656
|
-
|
|
687
|
+
const d = A[T].get(v);
|
|
688
|
+
d !== void 0 && s.isPlottable(d) && P.push(d, E[T]), D[T][u] = P.edge;
|
|
657
689
|
}
|
|
658
690
|
continue;
|
|
659
691
|
}
|
|
660
|
-
let
|
|
661
|
-
if (
|
|
692
|
+
let M = 0;
|
|
693
|
+
if (i)
|
|
662
694
|
for (let P = 0; P < this.stores.length; P++) {
|
|
663
|
-
const T = B(P,
|
|
664
|
-
T !== void 0 && s.isPlottable(T) && (
|
|
695
|
+
const T = B(P, v);
|
|
696
|
+
T !== void 0 && s.isPlottable(T) && (M += T);
|
|
665
697
|
}
|
|
666
|
-
let
|
|
698
|
+
let b = 0;
|
|
667
699
|
for (let P = 0; P < this.stores.length; P++) {
|
|
668
|
-
const T = B(P,
|
|
669
|
-
|
|
700
|
+
const T = B(P, v);
|
|
701
|
+
let d = T !== void 0 && s.isPlottable(T) ? T : null;
|
|
702
|
+
const S = n[P];
|
|
703
|
+
if (i && S.length > 0 && v < S[0].time && (d = 0), d !== null)
|
|
704
|
+
if (i) {
|
|
705
|
+
const w = this.introShare(t, { layerIndex: P, time: v, value: d, total: M });
|
|
706
|
+
b = Math.min(100, b + w);
|
|
707
|
+
} else
|
|
708
|
+
b += d;
|
|
709
|
+
D[P][u] = b;
|
|
670
710
|
}
|
|
671
711
|
}
|
|
672
|
-
const
|
|
673
|
-
for (let
|
|
674
|
-
const
|
|
675
|
-
for (let
|
|
676
|
-
if (this.getLayerAlpha(
|
|
677
|
-
const
|
|
678
|
-
if (
|
|
679
|
-
let
|
|
680
|
-
for (let P = 0; P <
|
|
681
|
-
if (
|
|
682
|
-
|
|
712
|
+
const Y = /* @__PURE__ */ new Map();
|
|
713
|
+
for (let u = 0; u < a.length; u++) Y.set(a[u], u);
|
|
714
|
+
const z = new Array(this.stores.length).fill(1);
|
|
715
|
+
for (let u = 0; u < this.stores.length; u++) {
|
|
716
|
+
if (this.getLayerAlpha(u) <= 0) continue;
|
|
717
|
+
const v = this.unsettledTail(u), M = v.length;
|
|
718
|
+
if (M === 0) continue;
|
|
719
|
+
let b = !0;
|
|
720
|
+
for (let P = 0; P < M; P++)
|
|
721
|
+
if (Y.get(v[P].time) !== a.length - M + P) {
|
|
722
|
+
b = !1;
|
|
683
723
|
break;
|
|
684
724
|
}
|
|
685
|
-
|
|
725
|
+
b && (z[u] = v[M - 1].progress);
|
|
686
726
|
}
|
|
687
|
-
const
|
|
688
|
-
if (
|
|
689
|
-
const
|
|
690
|
-
for (let
|
|
691
|
-
const
|
|
692
|
-
let
|
|
727
|
+
const I = [];
|
|
728
|
+
if (g === "grow") {
|
|
729
|
+
const u = n.map((v) => v.length - 1);
|
|
730
|
+
for (let v = a.length - 1; v >= 1; v--) {
|
|
731
|
+
const M = a[v];
|
|
732
|
+
let b = 1, P = !1;
|
|
693
733
|
for (let T = 0; T < n.length; T++) {
|
|
694
734
|
if (this.getLayerAlpha(T) <= 0) continue;
|
|
695
|
-
const
|
|
696
|
-
for (;
|
|
697
|
-
if (
|
|
698
|
-
const S = this.entranceProgress(T,
|
|
699
|
-
(!P || S >
|
|
735
|
+
const d = n[T];
|
|
736
|
+
for (; u[T] >= 0 && d[u[T]].time > M; ) u[T]--;
|
|
737
|
+
if (u[T] < 0 || d[u[T]].time !== M) continue;
|
|
738
|
+
const S = this.entranceProgress(T, M);
|
|
739
|
+
(!P || S > b) && (b = S), P = !0;
|
|
700
740
|
}
|
|
701
|
-
if (!P ||
|
|
702
|
-
|
|
741
|
+
if (!P || b >= 1) break;
|
|
742
|
+
I.unshift(U(b));
|
|
703
743
|
}
|
|
704
744
|
}
|
|
705
|
-
const O = (
|
|
706
|
-
const
|
|
707
|
-
if (!(
|
|
708
|
-
for (let
|
|
709
|
-
const P =
|
|
710
|
-
|
|
745
|
+
const O = (u, v) => {
|
|
746
|
+
const M = v.length;
|
|
747
|
+
if (!(M === 0 || u.length < M + 1))
|
|
748
|
+
for (let b = 0; b < M; b++) {
|
|
749
|
+
const P = u.length - M + b;
|
|
750
|
+
u[P][0] = N(u[P - 1][0], u[P][0], v[b]);
|
|
711
751
|
}
|
|
712
|
-
}, W =
|
|
713
|
-
let
|
|
714
|
-
for (let
|
|
715
|
-
if (!(this.getLayerAlpha(
|
|
716
|
-
if (
|
|
717
|
-
|
|
752
|
+
}, W = e.bitmapSize.height;
|
|
753
|
+
let C = -1, _ = -1;
|
|
754
|
+
for (let u = 0; u < this.stores.length; u++)
|
|
755
|
+
if (!(this.getLayerAlpha(u) <= 0))
|
|
756
|
+
if (C < 0)
|
|
757
|
+
C = u;
|
|
718
758
|
else {
|
|
719
|
-
|
|
759
|
+
_ = u;
|
|
720
760
|
break;
|
|
721
761
|
}
|
|
722
|
-
const G =
|
|
723
|
-
for (let
|
|
724
|
-
const
|
|
725
|
-
if (
|
|
726
|
-
const
|
|
727
|
-
for (let R = 0; R <
|
|
728
|
-
const V =
|
|
762
|
+
const G = C >= 0 ? this.getLayerAlpha(C) : 1, $ = n.map((u, v) => v === C ? Math.min(1, this.getLayerAlpha(v)) : 1);
|
|
763
|
+
for (let u = this.stores.length - 1; u >= 0; u--) {
|
|
764
|
+
const v = this.getLayerAlpha(u);
|
|
765
|
+
if (v <= 0) continue;
|
|
766
|
+
const M = this.stores[u].last()?.value ?? 0, b = this.resolveLayerColor(u, M), P = u === C, T = _ >= 0 && u === _ && G < 1, d = [];
|
|
767
|
+
for (let R = 0; R < a.length; R++) {
|
|
768
|
+
const V = u > 0 ? s.valueToBitmapYExact(D[u - 1][R]) : W;
|
|
729
769
|
let H = V;
|
|
730
|
-
P ? H = W : T && (H = V + (W - V) * (1 - G)),
|
|
770
|
+
P ? H = W : T && (H = V + (W - V) * (1 - G)), d.push([o.timeToBitmapXExact(a[R]), H]);
|
|
731
771
|
}
|
|
732
|
-
|
|
772
|
+
g === "grow" && O(d, I);
|
|
733
773
|
const S = [];
|
|
734
|
-
for (let R = 0; R <
|
|
735
|
-
let V = s.valueToBitmapYExact(
|
|
736
|
-
P &&
|
|
774
|
+
for (let R = 0; R < a.length; R++) {
|
|
775
|
+
let V = s.valueToBitmapYExact(D[u][R]);
|
|
776
|
+
P && v < 1 && (V = W + (V - W) * v), S.push([o.timeToBitmapXExact(a[R]), V]);
|
|
737
777
|
}
|
|
738
|
-
|
|
739
|
-
const
|
|
740
|
-
if (K && (l.save(), l.globalAlpha *=
|
|
741
|
-
let R = S[0][1], V =
|
|
742
|
-
for (let
|
|
743
|
-
S[
|
|
744
|
-
for (let
|
|
745
|
-
|
|
746
|
-
let H = X(
|
|
778
|
+
g === "grow" && O(S, I);
|
|
779
|
+
const w = st(S), F = tt(w, c, g === "grow" && I.length > 0), K = g === "fade" && z[u] < 1;
|
|
780
|
+
if (K && (l.save(), l.globalAlpha *= z[u]), this.options.area.visible && !this.introGhostPass) {
|
|
781
|
+
let R = S[0][1], V = d[0][1];
|
|
782
|
+
for (let k = 1; k < S.length; k++)
|
|
783
|
+
S[k][1] < R && (R = S[k][1]);
|
|
784
|
+
for (let k = 1; k < d.length; k++)
|
|
785
|
+
d[k][1] > V && (V = d[k][1]);
|
|
786
|
+
let H = X(b, 0.25);
|
|
747
787
|
if (V > R + 0.5) {
|
|
748
|
-
const
|
|
749
|
-
|
|
788
|
+
const k = l.createLinearGradient(0, R, 0, V);
|
|
789
|
+
k.addColorStop(0, X(b, 0.25)), k.addColorStop(1, X(b, 0.05)), H = k;
|
|
750
790
|
}
|
|
751
|
-
if (l.beginPath(), l.moveTo(
|
|
752
|
-
for (let
|
|
753
|
-
l.lineTo(
|
|
791
|
+
if (l.beginPath(), l.moveTo(w[0].x, w[0].y), et(l, F), P)
|
|
792
|
+
for (let k = d.length - 1; k >= 0; k--)
|
|
793
|
+
l.lineTo(d[k][0], d[k][1]);
|
|
754
794
|
else {
|
|
755
|
-
const
|
|
756
|
-
l.lineTo(Z.x, Z.y),
|
|
795
|
+
const k = st(d), ct = tt(k, c, g === "grow" && I.length > 0), Z = k[k.length - 1];
|
|
796
|
+
l.lineTo(Z.x, Z.y), gt(l, k, ct);
|
|
757
797
|
}
|
|
758
798
|
l.closePath(), l.fillStyle = H, l.fill();
|
|
759
799
|
}
|
|
760
|
-
const Q =
|
|
761
|
-
if (Q && (l.save(), l.globalAlpha *=
|
|
762
|
-
const R =
|
|
763
|
-
R && (l.save(), l.globalAlpha *=
|
|
800
|
+
const Q = h && v < 1;
|
|
801
|
+
if (Q && (l.save(), l.globalAlpha *= v), h && (l.beginPath(), l.moveTo(w[0].x, w[0].y), et(l, F), l.strokeStyle = b, l.lineWidth = m, l.lineJoin = "round", l.lineCap = "round", l.stroke()), Q && l.restore(), this.options.points?.visible) {
|
|
802
|
+
const R = v < 1;
|
|
803
|
+
R && (l.save(), l.globalAlpha *= v), this.drawPointMarkers({ context: l, points: w, pixelRatio: e.horizontalPixelRatio, color: b }), R && l.restore();
|
|
764
804
|
}
|
|
765
805
|
K && l.restore();
|
|
766
806
|
}
|
|
767
|
-
this.stackedEdges = { times:
|
|
807
|
+
this.stackedEdges = { times: a, cumulative: D, growChain: I, collapse: $ };
|
|
768
808
|
}
|
|
769
809
|
/**
|
|
770
810
|
* Overlay hook: draws crosshair nearest-point dots and last-point pulse dots.
|
|
@@ -772,81 +812,81 @@ class bt extends ut {
|
|
|
772
812
|
*/
|
|
773
813
|
drawOverlay(t) {
|
|
774
814
|
this.tickAnimations(performance.now());
|
|
775
|
-
const { scope:
|
|
815
|
+
const { scope: i, timeScale: e, yScale: o, crosshair: s, dataInterval: l } = t, r = i, f = this.options.pulseMs, h = f > 0 ? performance.now() / (f * 2 * Math.PI) % 1 : 0;
|
|
776
816
|
if (s) {
|
|
777
|
-
const
|
|
778
|
-
for (let
|
|
779
|
-
const
|
|
780
|
-
if (
|
|
781
|
-
const
|
|
782
|
-
if (!
|
|
783
|
-
const
|
|
784
|
-
x:
|
|
785
|
-
y: o.valueToBitmapYExact(this.effectiveValue(t,
|
|
786
|
-
} : this.stackedPositionAt(t,
|
|
787
|
-
L && (
|
|
817
|
+
const x = this.options.stacking, n = 4 * r.horizontalPixelRatio;
|
|
818
|
+
for (let p = 0; p < this.stores.length; p++) {
|
|
819
|
+
const a = this.getLayerAlpha(p);
|
|
820
|
+
if (a <= 0) continue;
|
|
821
|
+
const g = this.stores[p].findNearest(s.time, l);
|
|
822
|
+
if (!g || x === "off" && !o.isPlottable(g.value)) continue;
|
|
823
|
+
const A = this.resolveLayerColor(p, g.value), { x: E, y: B } = x === "off" ? {
|
|
824
|
+
x: e.timeToBitmapXExact(g.time),
|
|
825
|
+
y: o.valueToBitmapYExact(this.effectiveValue(t, p, g.time, g.value))
|
|
826
|
+
} : this.stackedPositionAt(t, p, g.time), L = a < 1;
|
|
827
|
+
L && (i.context.save(), i.context.globalAlpha *= a), 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 = A, i.context.fill(), i.context.restore(), i.context.beginPath(), i.context.arc(E, B, n, 0, Math.PI * 2), i.context.fillStyle = A, i.context.fill(), L && i.context.restore();
|
|
788
828
|
}
|
|
789
829
|
}
|
|
790
830
|
const m = this.introWave.active && this.introDirectives?.clip !== void 0;
|
|
791
|
-
let
|
|
792
|
-
if (m && (
|
|
793
|
-
const
|
|
831
|
+
let c = 1;
|
|
832
|
+
if (m && (c = Math.max(0, (this.introWave.linear() - (1 - J)) / J)), this.hasPulse && f > 0 && c > 0) {
|
|
833
|
+
const x = this.options.stacking;
|
|
794
834
|
for (let n = 0; n < this.stores.length; n++) {
|
|
795
|
-
const
|
|
796
|
-
if (
|
|
797
|
-
const
|
|
798
|
-
if (
|
|
799
|
-
if (!o.isPlottable(
|
|
835
|
+
const p = this.getLayerAlpha(n);
|
|
836
|
+
if (p <= 0) continue;
|
|
837
|
+
const a = this.stores[n].last()?.value ?? 0, g = this.resolveLayerColor(n, a);
|
|
838
|
+
if (x === "off") {
|
|
839
|
+
if (!o.isPlottable(a)) continue;
|
|
800
840
|
const L = this.trailingEndpoint(t, n);
|
|
801
841
|
if (!L) continue;
|
|
802
842
|
this.drawPulse({
|
|
803
|
-
ctx:
|
|
843
|
+
ctx: i.context,
|
|
804
844
|
x: L.x,
|
|
805
845
|
y: L.y,
|
|
806
|
-
color:
|
|
807
|
-
pixelRatio:
|
|
808
|
-
phase:
|
|
809
|
-
alpha:
|
|
846
|
+
color: g,
|
|
847
|
+
pixelRatio: r.horizontalPixelRatio,
|
|
848
|
+
phase: h,
|
|
849
|
+
alpha: p * c
|
|
810
850
|
});
|
|
811
851
|
continue;
|
|
812
852
|
}
|
|
813
|
-
const
|
|
814
|
-
if (!
|
|
815
|
-
const { x:
|
|
853
|
+
const A = this.stores[n].last();
|
|
854
|
+
if (!A) continue;
|
|
855
|
+
const { x: E, y: B } = this.stackedPositionAt(t, n, A.time);
|
|
816
856
|
this.drawPulse({
|
|
817
|
-
ctx:
|
|
818
|
-
x:
|
|
857
|
+
ctx: i.context,
|
|
858
|
+
x: E,
|
|
819
859
|
y: B,
|
|
820
|
-
color:
|
|
821
|
-
pixelRatio:
|
|
822
|
-
phase:
|
|
823
|
-
alpha:
|
|
860
|
+
color: g,
|
|
861
|
+
pixelRatio: r.horizontalPixelRatio,
|
|
862
|
+
phase: h,
|
|
863
|
+
alpha: p * c
|
|
824
864
|
});
|
|
825
865
|
}
|
|
826
866
|
}
|
|
827
867
|
}
|
|
828
868
|
drawPulse({
|
|
829
869
|
ctx: t,
|
|
830
|
-
x:
|
|
831
|
-
y:
|
|
870
|
+
x: i,
|
|
871
|
+
y: e,
|
|
832
872
|
color: o,
|
|
833
873
|
pixelRatio: s,
|
|
834
874
|
phase: l,
|
|
835
|
-
alpha:
|
|
875
|
+
alpha: r = 1
|
|
836
876
|
}) {
|
|
837
|
-
const f = 3 * s,
|
|
838
|
-
|
|
877
|
+
const f = 3 * s, h = 0.4 + 0.6 * Math.abs(Math.sin(l * 2 * Math.PI)), m = f + 4 * s * h, c = r < 1;
|
|
878
|
+
c && (t.save(), t.globalAlpha *= r), t.beginPath(), t.arc(i, e, m, 0, Math.PI * 2), t.fillStyle = X(o, h * 0.3), t.fill(), t.beginPath(), t.arc(i, e, f, 0, Math.PI * 2), t.fillStyle = o, t.fill(), c && t.restore();
|
|
839
879
|
}
|
|
840
880
|
}
|
|
841
881
|
const Bt = {
|
|
842
882
|
type: "line",
|
|
843
|
-
create: ({ theme:
|
|
844
|
-
colors: t === 1 ? [
|
|
845
|
-
strokeWidth:
|
|
846
|
-
...
|
|
883
|
+
create: ({ theme: y, layerCount: t }, i) => new Pt(t, {
|
|
884
|
+
colors: t === 1 ? [y.line.color] : y.seriesColors.slice(0, t),
|
|
885
|
+
strokeWidth: y.line.width,
|
|
886
|
+
...i
|
|
847
887
|
})
|
|
848
888
|
};
|
|
849
889
|
export {
|
|
850
|
-
|
|
890
|
+
Pt as LineRenderer,
|
|
851
891
|
Bt as LineSeriesDef
|
|
852
892
|
};
|