blazeplot 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +11 -2
  2. package/dist/Chart-BW9JaHs6.js +2903 -0
  3. package/dist/Chart-BW9JaHs6.js.map +1 -0
  4. package/dist/OverlayUtils-Cw1o8UH-.js +35 -0
  5. package/dist/OverlayUtils-Cw1o8UH-.js.map +1 -0
  6. package/dist/core/SeriesStore.d.ts +9 -0
  7. package/dist/core/SeriesStore.d.ts.map +1 -1
  8. package/dist/core/UniformRingBuffer.d.ts +67 -0
  9. package/dist/core/UniformRingBuffer.d.ts.map +1 -0
  10. package/dist/core/index.d.ts +3 -1
  11. package/dist/core/index.d.ts.map +1 -1
  12. package/dist/core/types.d.ts +13 -1
  13. package/dist/core/types.d.ts.map +1 -1
  14. package/dist/index.d.ts +5 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +153 -2185
  17. package/dist/index.js.map +1 -1
  18. package/dist/interaction/AxisController.d.ts +45 -3
  19. package/dist/interaction/AxisController.d.ts.map +1 -1
  20. package/dist/interaction/index.d.ts +1 -0
  21. package/dist/interaction/index.d.ts.map +1 -1
  22. package/dist/linked.d.ts +3 -0
  23. package/dist/linked.d.ts.map +1 -0
  24. package/dist/linked.js +64 -0
  25. package/dist/linked.js.map +1 -0
  26. package/dist/plugins/annotations.d.ts +3 -0
  27. package/dist/plugins/annotations.d.ts.map +1 -0
  28. package/dist/plugins/annotations.js +163 -0
  29. package/dist/plugins/annotations.js.map +1 -0
  30. package/dist/plugins/crosshair.d.ts +3 -0
  31. package/dist/plugins/crosshair.d.ts.map +1 -0
  32. package/dist/plugins/crosshair.js +192 -0
  33. package/dist/plugins/crosshair.js.map +1 -0
  34. package/dist/plugins/interactions.js +87 -65
  35. package/dist/plugins/interactions.js.map +1 -1
  36. package/dist/plugins/navigator.d.ts +3 -0
  37. package/dist/plugins/navigator.d.ts.map +1 -0
  38. package/dist/plugins/navigator.js +147 -0
  39. package/dist/plugins/navigator.js.map +1 -0
  40. package/dist/plugins/selection.d.ts +3 -0
  41. package/dist/plugins/selection.d.ts.map +1 -0
  42. package/dist/plugins/selection.js +144 -0
  43. package/dist/plugins/selection.js.map +1 -0
  44. package/dist/plugins/tooltip.js +29 -45
  45. package/dist/plugins/tooltip.js.map +1 -1
  46. package/dist/react.d.ts +14 -0
  47. package/dist/react.d.ts.map +1 -0
  48. package/dist/react.js +30 -0
  49. package/dist/react.js.map +1 -0
  50. package/dist/render/ReglBackend.d.ts +1 -0
  51. package/dist/render/ReglBackend.d.ts.map +1 -1
  52. package/dist/render/Renderer.d.ts +1 -0
  53. package/dist/render/Renderer.d.ts.map +1 -1
  54. package/dist/render/types.d.ts +1 -0
  55. package/dist/render/types.d.ts.map +1 -1
  56. package/dist/ui/Annotations.d.ts +94 -0
  57. package/dist/ui/Annotations.d.ts.map +1 -0
  58. package/dist/ui/Chart.d.ts +83 -1
  59. package/dist/ui/Chart.d.ts.map +1 -1
  60. package/dist/ui/ChartLayout.d.ts +10 -0
  61. package/dist/ui/ChartLayout.d.ts.map +1 -1
  62. package/dist/ui/Crosshair.d.ts +60 -0
  63. package/dist/ui/Crosshair.d.ts.map +1 -0
  64. package/dist/ui/Interactions.d.ts.map +1 -1
  65. package/dist/ui/LinkedCharts.d.ts +23 -0
  66. package/dist/ui/LinkedCharts.d.ts.map +1 -0
  67. package/dist/ui/Navigator.d.ts +32 -0
  68. package/dist/ui/Navigator.d.ts.map +1 -0
  69. package/dist/ui/OverlayUtils.d.ts +17 -0
  70. package/dist/ui/OverlayUtils.d.ts.map +1 -0
  71. package/dist/ui/Selection.d.ts +64 -0
  72. package/dist/ui/Selection.d.ts.map +1 -0
  73. package/dist/ui/Tooltip.d.ts.map +1 -1
  74. package/dist/ui/theme.d.ts +12 -0
  75. package/dist/ui/theme.d.ts.map +1 -1
  76. package/package.json +35 -1
package/dist/index.js CHANGED
@@ -1,577 +1,82 @@
1
- import e from "regl";
2
- //#region src/core/MinMaxPyramid.ts
3
- var t = 16, n = class {
4
- bucketSize;
5
- levels = [];
6
- levelLengths;
7
- levelSampleWidths;
8
- _builtLen = 0;
9
- _lastRangeStart = NaN;
10
- constructor(e = 2) {
11
- if (this.bucketSize = e, !Number.isInteger(e) || e < 2) throw RangeError("MinMaxPyramid bucketSize must be an integer >= 2.");
12
- this.levelLengths = new Uint32Array(t), this.levelSampleWidths = new Uint32Array(t);
13
- }
14
- build(e) {
15
- this.levels = [], this.levelLengths.fill(0), this.levelSampleWidths.fill(0);
16
- let n = e.length;
17
- if (n === 0) {
18
- this._builtLen = 0, this._lastRangeStart = NaN;
19
- return;
20
- }
21
- let r = null, i = 0;
22
- for (; n > 0 && i < t;) {
23
- let t = Math.ceil(n / this.bucketSize), a = new Float32Array(t * 2);
24
- for (let t = 0; t < n; t += this.bucketSize) {
25
- let i = Infinity, o = -Infinity, s = Math.min(t + this.bucketSize, n);
26
- for (let n = t; n < s; n++) if (r) {
27
- let e = r[n * 2], t = r[n * 2 + 1];
28
- e < i && (i = e), t > o && (o = t);
29
- } else {
30
- let t = e.getY(n);
31
- t < i && (i = t), t > o && (o = t);
32
- }
33
- let c = Math.floor(t / this.bucketSize);
34
- a[c * 2] = i, a[c * 2 + 1] = o;
35
- }
36
- if (this.levels[i] = a, this.levelLengths[i] = t, this.levelSampleWidths[i] = this.bucketSize ** (i + 1), t === 1) break;
37
- r = a, n = t, i++;
38
- }
39
- this._builtLen = e.length, this._lastRangeStart = e.range?.start ?? NaN;
40
- }
41
- incrementalBuild(e) {
42
- let t = e.length, n = e.range?.start ?? NaN;
43
- if (t === 0) {
44
- this.levels = [], this.levelLengths.fill(0), this.levelSampleWidths.fill(0), this._builtLen = 0, this._lastRangeStart = NaN;
45
- return;
46
- }
47
- if (t < this._builtLen || n !== this._lastRangeStart) {
48
- this.build(e);
49
- return;
50
- }
51
- t !== this._builtLen && (this.appendTail(e, t - this._builtLen), this._builtLen = t);
52
- }
53
- appendTail(e, n) {
54
- let r = e.length, i = this.bucketSize, a = r - n;
55
- for (let n = 0; n < t; n++) {
56
- let t = n === 0 ? r : this.levelLengths[n - 1], o = Math.floor(a / i), s = Math.ceil(t / i) - 1;
57
- if (o > s) break;
58
- this.levelSampleWidths[n] = i ** (n + 1), this.ensureLevelData(n, s + 1);
59
- for (let r = o; r <= s; r++) {
60
- let a = r * i, o = Math.min((r + 1) * i, t), s = Infinity, c = -Infinity;
61
- if (n === 0) for (let t = a; t < o; t++) {
62
- let n = e.getY(t);
63
- n < s && (s = n), n > c && (c = n);
64
- }
65
- else {
66
- let e = this.levels[n - 1];
67
- for (let t = a; t < o; t++) {
68
- let n = e[t * 2], r = e[t * 2 + 1];
69
- n < s && (s = n), r > c && (c = r);
70
- }
71
- }
72
- let l = this.levels[n];
73
- l[r * 2] = s, l[r * 2 + 1] = c;
74
- }
75
- if (this.levelLengths[n] = s + 1, a = o, this.levelLengths[n] <= 1) break;
76
- }
77
- }
78
- ensureLevelData(e, t) {
79
- let n = t * 2, r = this.levels[e];
80
- if (r && r.length >= n) return;
81
- let i = r?.length ?? 0;
82
- if (i <= 0) i = n;
83
- else for (; i < n;) i = Math.max(n, Math.ceil(i * 1.5));
84
- let a = new Float32Array(i);
85
- r && a.set(r), this.levels[e] = a;
86
- }
87
- rangeMinMax(e, t, n) {
88
- let r = Math.max(0, Math.floor(t)), i = Math.min(e.length, Math.ceil(n));
89
- if (i <= r) return null;
90
- let a = Infinity, o = -Infinity, s = r;
91
- for (; s < i;) {
92
- let t = -1, n = 1;
93
- for (let e = this.levels.length - 1; e >= 0; e--) {
94
- let r = this.levelSampleWidths[e], a = Math.floor(s / r);
95
- if (r > 0 && s % r === 0 && s + r <= i && a < this.levelLengths[e]) {
96
- t = e, n = r;
97
- break;
98
- }
99
- }
100
- if (t >= 0) {
101
- let e = Math.floor(s / n), r = this.levels[t], i = r[e * 2], c = r[e * 2 + 1];
102
- i < a && (a = i), c > o && (o = c), s += n;
103
- } else {
104
- let t = e.getY(s);
105
- t < a && (a = t), t > o && (o = t), s++;
106
- }
107
- }
108
- return Number.isFinite(a) && Number.isFinite(o) ? {
109
- minY: a,
110
- maxY: o
111
- } : null;
112
- }
113
- query(e, t, n) {
114
- if (t <= 0 || n.length <= 0) return {
115
- buckets: new Float32Array(),
116
- bucketCount: 0,
117
- level: 0,
118
- samplesPerPixel: 0
119
- };
120
- let r = n.length, i = Math.max(1, r / t), a = Math.min(Math.max(0, Math.ceil(Math.log2(i)) - 1), this.levels.length - 1), o = this.levels[a], s = this.levelLengths[a], c = this.levelSampleWidths[a];
121
- if (!o || s === void 0 || c === void 0 || s === 0 || c === 0) return {
122
- buckets: new Float32Array(),
123
- bucketCount: 0,
124
- level: 0,
125
- samplesPerPixel: i
126
- };
127
- let l = Math.max(0, n.start), u = l + n.length, d = Math.max(0, Math.floor(l / c)), f = Math.min(s, Math.ceil(u / c)) - d;
128
- if (f <= 0) return {
129
- buckets: new Float32Array(),
130
- bucketCount: 0,
131
- level: a,
132
- samplesPerPixel: i
133
- };
134
- let p = new Float32Array(f * 2);
135
- for (let e = 0; e < f; e++) {
136
- let t = (d + e) * 2;
137
- p[e * 2] = o[t], p[e * 2 + 1] = o[t + 1];
138
- }
139
- return {
140
- buckets: p,
141
- bucketCount: f,
142
- level: a,
143
- samplesPerPixel: i
144
- };
145
- }
146
- };
147
- //#endregion
148
- //#region src/core/SeriesStore.ts
149
- function r(e) {
150
- return "rangeMinMaxY" in e;
151
- }
152
- function i(e) {
153
- return "getOpen" in e && "getHigh" in e && "getLow" in e && "getClose" in e;
154
- }
155
- function a(e) {
156
- return "copySamplesRange" in e;
157
- }
158
- function o(e) {
159
- return "copyMinMaxSegments" in e;
160
- }
161
- function s(e) {
162
- return "copyVisibleSamples" in e;
163
- }
164
- var c = 64;
165
- function l(e, t, n, r, i) {
166
- if (n === e) return t;
167
- let a = (i - e) / (n - e);
168
- return t + (r - t) * a;
169
- }
170
- var u = class {
171
- config;
172
- style;
173
- dataset;
174
- pyramid;
175
- _dirty = !1;
176
- _useDatasetRangeMinMax = !1;
177
- _useRawMinMaxScan = !1;
178
- _lastBuildLength = 0;
179
- _lastBuildRangeStart = NaN;
180
- _visible = !0;
181
- constructor(e, t, i) {
182
- this.dataset = e, this.config = t, this.pyramid = (t.mode === "line" || t.mode === "bar") && t.downsample !== "none" ? new n() : null, this._useDatasetRangeMinMax = r(e), this.style = i, this.pyramid && e.length > 0 && !this._useDatasetRangeMinMax && this.pyramid.build(e), this._lastBuildLength = e.length, this._lastBuildRangeStart = e.range?.start ?? NaN;
183
- }
184
- get hasLOD() {
185
- return this.pyramid !== null;
186
- }
187
- get dirty() {
188
- return this._dirty;
189
- }
190
- get length() {
191
- return this.dataset.length;
192
- }
193
- get visible() {
194
- return this._visible;
195
- }
196
- setVisible(e) {
197
- this._visible = e;
198
- }
199
- append(e, t) {
200
- if (!("push" in this.dataset)) throw TypeError("SeriesStore dataset is not appendable.");
201
- this.dataset.append(e, t), this._dirty = !0;
202
- }
203
- clear() {
204
- if (!("clear" in this.dataset)) throw TypeError("SeriesStore dataset is not clearable.");
205
- this.dataset.clear(), this._useDatasetRangeMinMax = r(this.dataset), this._useRawMinMaxScan = !1, this.pyramid && !this._useDatasetRangeMinMax && this.pyramid.build(this.dataset), this._lastBuildLength = this.dataset.length, this._lastBuildRangeStart = this.dataset.range?.start ?? NaN, this._dirty = !1;
206
- }
207
- rebuildPyramid() {
208
- if (this._dirty) {
209
- if (this.pyramid) {
210
- let e = this.dataset.length, t = this.dataset.range?.start ?? NaN, n = e === this._lastBuildLength && t !== this._lastBuildRangeStart;
211
- r(this.dataset) ? (this._useDatasetRangeMinMax = !0, this._useRawMinMaxScan = !1) : n ? (this._useDatasetRangeMinMax = !1, this._useRawMinMaxScan = !0) : (this.pyramid.incrementalBuild(this.dataset), this._useDatasetRangeMinMax = !1, this._useRawMinMaxScan = !1), this._lastBuildLength = e, this._lastBuildRangeStart = t;
212
- }
213
- this._dirty = !1;
214
- }
215
- }
216
- query(e, t) {
217
- if (!this.pyramid || !this.dataset.range) return {
218
- buckets: new Float32Array(),
219
- bucketCount: 0,
220
- level: 0,
221
- samplesPerPixel: 0
222
- };
223
- let n = this.dataset.lowerBoundX(e.xMin), r = this.dataset.upperBoundX(e.xMax), i = Math.max(0, r - n);
224
- return this._useDatasetRangeMinMax ? this.queryRangeMinMax(n, i, t) : this.pyramid.query(e, t, {
225
- start: n,
226
- length: i
227
- });
228
- }
229
- visibleSampleCount(e) {
230
- let t = this.dataset.lowerBoundX(e.xMin), n = this.dataset.upperBoundX(e.xMax);
231
- return Math.max(0, n - t);
232
- }
233
- sampleAt(e) {
234
- return e < 0 || e >= this.dataset.length ? null : {
235
- index: e,
236
- x: this.dataset.getX(e),
237
- y: this.dataset.getY(e)
238
- };
239
- }
240
- nearestSampleByX(e, t) {
241
- let n = this.visibleIndexRange(t);
242
- if (n.start >= n.end) return null;
243
- let r = this.dataset.lowerBoundX(e), i = Math.min(Math.max(r, n.start), n.end - 1), a = i - 1;
244
- if (a >= n.start) {
245
- let t = Math.abs(this.dataset.getX(i) - e);
246
- Math.abs(this.dataset.getX(a) - e) <= t && (i = a);
247
- }
248
- return this.sampleAt(i);
249
- }
250
- nearestSampleByPoint(e, t, n, r, i, a = Infinity) {
251
- let o = this.visibleIndexRange(n), s = n.xMax - n.xMin, l = n.yMax - n.yMin;
252
- if (o.start >= o.end || r <= 0 || i <= 0 || s <= 0 || l <= 0) return null;
253
- let u = r / s, d = i / l, f = -1, p = a < 0 ? -1 : Number.isFinite(a) ? a * a : Infinity, m = (n) => {
254
- let r = (this.dataset.getX(n) - e) * u, i = (this.dataset.getY(n) - t) * d, a = r * r + i * i;
255
- (a < p || f < 0 && a <= p) && (p = a, f = n);
256
- }, h = this.dataset.lowerBoundX(e), g = Math.min(Math.max(h, o.start), o.end - 1);
257
- if (m(g), g > o.start && m(g - 1), g + 1 < o.end && m(g + 1), this.hasPointIntervalBounds() && o.end - o.start > c) {
258
- let n = this.pointIntervalDistanceSq(o.start, o.end, e, t, u, d), r = n <= p ? [{
259
- start: o.start,
260
- end: o.end,
261
- lowerBoundSq: n
262
- }] : [];
263
- for (; r.length > 0;) {
264
- let n = r.pop();
265
- if (n.lowerBoundSq > p) continue;
266
- let i = n.end - n.start;
267
- if (i <= c) {
268
- for (let e = n.start; e < n.end; e++) m(e);
269
- continue;
270
- }
271
- let a = n.start + (i >> 1), o = this.pointIntervalDistanceSq(n.start, a, e, t, u, d), s = this.pointIntervalDistanceSq(a, n.end, e, t, u, d), l = {
272
- start: n.start,
273
- end: a,
274
- lowerBoundSq: o
275
- }, f = {
276
- start: a,
277
- end: n.end,
278
- lowerBoundSq: s
279
- };
280
- o < s ? (s <= p && r.push(f), o <= p && r.push(l)) : (o <= p && r.push(l), s <= p && r.push(f));
281
- }
282
- } else {
283
- let t = Math.min(h - 1, o.end - 1), n = Math.max(h, o.start);
284
- for (; t >= o.start || n < o.end;) {
285
- let r = t >= o.start ? this.pointXDistanceSq(t, e, u) : Infinity, i = n < o.end ? this.pointXDistanceSq(n, e, u) : Infinity;
286
- if (r > p && i > p) break;
287
- r <= i ? (r <= p && m(t), t--) : (i <= p && m(n), n++);
288
- }
289
- }
290
- if (f < 0) return null;
291
- let _ = this.sampleAt(f);
292
- return _ ? {
293
- ..._,
294
- distancePx: Math.sqrt(p)
295
- } : null;
296
- }
297
- copyRawVisible(e, t, n, r = 0) {
298
- return this.copyVisibleSamples(e, t, n, "points", 0, r);
299
- }
300
- copyRawVisibleClipped(e, t, n, r = 0) {
301
- return this.copyClippedVisibleLine(e, t, n, r, "data");
302
- }
303
- copyRawVisibleClipSpace(e, t, n) {
304
- return this.copyClippedVisibleLine(e, t, n, 0, "clip");
305
- }
306
- copyRawRange(e, t, n, r, i = 0) {
307
- return this.copySampleRange(e, t, n, r, "points", 0, i);
308
- }
309
- copyAreaVisible(e, t, n, r = 0, i = 0) {
310
- return this.copyVisibleSamples(e, t, n, "area", r, i) * 2;
311
- }
312
- copyAreaRange(e, t, n, r, i = 0, a = 0) {
313
- return this.copySampleRange(e, t, n, r, "area", i, a) * 2;
314
- }
315
- copyMinMaxVisible(e, t, n, r = 0) {
316
- return this.copyMinMaxSegments(e, t, n, "line-list", r) * 2;
317
- }
318
- copyMinMaxInstanced(e, t, n, r = 0) {
319
- return this.copyMinMaxSegments(e, t, n, "instanced", r);
320
- }
321
- copyOhlcRange(e, t, n, r, a, o = 0) {
322
- if (!i(this.dataset) || r <= 0 || n.length < r * 12) return 0;
323
- let s = Math.max(0, Math.floor(e)), c = Math.min(this.dataset.length, Math.ceil(t)), l = Math.min(r, Math.max(0, c - s)), u = a * .5;
324
- for (let e = 0; e < l; e++) {
325
- let t = s + e, r = this.dataset.getX(t) - o, i = this.dataset.getOpen(t), a = this.dataset.getHigh(t), c = this.dataset.getLow(t), l = this.dataset.getClose(t), d = e * 12;
326
- n[d] = r, n[d + 1] = c, n[d + 2] = r, n[d + 3] = a, n[d + 4] = r - u, n[d + 5] = i, n[d + 6] = r, n[d + 7] = i, n[d + 8] = r, n[d + 9] = l, n[d + 10] = r + u, n[d + 11] = l;
327
- }
328
- return l;
329
- }
330
- copyOhlcTuplesRange(e, t, n, r, a = 0) {
331
- if (!i(this.dataset) || r <= 0 || n.length < r * 5) return 0;
332
- let o = Math.max(0, Math.floor(e)), s = Math.min(this.dataset.length, Math.ceil(t)), c = Math.min(r, Math.max(0, s - o));
333
- for (let e = 0; e < c; e++) {
334
- let t = o + e, r = e * 5;
335
- n[r] = this.dataset.getX(t) - a, n[r + 1] = this.dataset.getOpen(t), n[r + 2] = this.dataset.getHigh(t), n[r + 3] = this.dataset.getLow(t), n[r + 4] = this.dataset.getClose(t);
336
- }
337
- return c;
338
- }
339
- visibleIndexRange(e, t = 0) {
340
- if (!e) return {
341
- start: 0,
342
- end: this.dataset.length
343
- };
344
- let n = Math.max(0, Math.floor(t));
345
- return {
346
- start: Math.max(0, this.dataset.lowerBoundX(e.xMin) - n),
347
- end: Math.min(this.dataset.length, this.dataset.upperBoundX(e.xMax) + n)
348
- };
349
- }
350
- pointXDistanceSq(e, t, n) {
351
- let r = (this.dataset.getX(e) - t) * n;
352
- return r * r;
353
- }
354
- pointIntervalDistanceSq(e, t, n, r, i, a) {
355
- if (t <= e) return Infinity;
356
- let o = this.dataset.getX(e), s = this.dataset.getX(t - 1), c = n < o ? (o - n) * i : n > s ? (n - s) * i : 0, l = this.pointIntervalMinMaxY(e, t);
357
- if (!l) return Infinity;
358
- let u = r < l.minY ? (l.minY - r) * a : r > l.maxY ? (r - l.maxY) * a : 0;
359
- return c * c + u * u;
360
- }
361
- hasPointIntervalBounds() {
362
- return r(this.dataset) || this.pyramid !== null && !this._dirty && !this._useRawMinMaxScan;
363
- }
364
- pointIntervalMinMaxY(e, t) {
365
- return r(this.dataset) ? this.dataset.rangeMinMaxY(e, t) : this.pyramid && !this._dirty && !this._useRawMinMaxScan ? this.pyramid.rangeMinMax(this.dataset, e, t) : null;
366
- }
367
- copyClippedVisibleLine(e, t, n, r, i) {
368
- if (n <= 0 || t.length < n * 2) return 0;
369
- let a = e.xMax - e.xMin, o = e.yMax - e.yMin;
370
- if (i === "clip" && (a <= 0 || o <= 0)) return 0;
371
- let s = Math.max(0, this.dataset.lowerBoundX(e.xMin) - 1), c = Math.min(this.dataset.length, this.dataset.upperBoundX(e.xMax) + 1);
372
- if (c - s <= 0) return 0;
373
- let u = 0, d = NaN, f = NaN, p = (s, c) => {
374
- let l = i === "clip" ? (s - e.xMin) / a * 2 - 1 : s - r, p = i === "clip" ? (c - e.yMin) / o * 2 - 1 : c;
375
- if (u > 0 && l === d && p === f) return !0;
376
- if (u >= n) return !1;
377
- let m = u * 2;
378
- return t[m] = l, t[m + 1] = p, u++, d = l, f = p, !0;
379
- };
380
- if (c - s === 1) {
381
- let t = this.dataset.getX(s);
382
- return t < e.xMin || t > e.xMax ? 0 : p(t, this.dataset.getY(s)) ? u : 0;
383
- }
384
- for (let t = s; t + 1 < c; t++) {
385
- let n = this.dataset.getX(t), r = this.dataset.getY(t), i = this.dataset.getX(t + 1), a = this.dataset.getY(t + 1);
386
- if (i < e.xMin || n > e.xMax) continue;
387
- let o = Math.max(n, e.xMin), s = Math.min(i, e.xMax);
388
- if (s < o) continue;
389
- let c = l(n, r, i, a, o), u = l(n, r, i, a, s);
390
- if (!p(o, c) || !p(s, u)) break;
391
- }
392
- return u;
393
- }
394
- copyVisibleSamples(e, t, n, r, i, a) {
395
- if (s(this.dataset)) return this.dataset.copyVisibleSamples(e, t, n, r, i, a);
396
- let o = r === "points" ? 2 : 4;
397
- if (n <= 0 || t.length < n * o) return 0;
398
- let c = this.dataset.lowerBoundX(e.xMin), l = this.dataset.upperBoundX(e.xMax), u = l - c;
399
- if (u <= 0) return 0;
400
- let d = Math.max(1, Math.ceil(u / n)), f = 0;
401
- for (let e = c; e < l && f < n; e += d) {
402
- let n = this.dataset.getX(e) - a, o = this.dataset.getY(e);
403
- if (r === "points") {
404
- let e = f * 2;
405
- t[e] = n, t[e + 1] = o;
406
- } else {
407
- let e = f * 4;
408
- t[e] = n, t[e + 1] = i, t[e + 2] = n, t[e + 3] = o;
409
- }
410
- f++;
411
- }
412
- return f;
413
- }
414
- copySampleRange(e, t, n, r, i, o, s) {
415
- if (a(this.dataset)) return this.dataset.copySamplesRange(e, t, n, r, i, o, s);
416
- let c = i === "points" ? 2 : 4;
417
- if (r <= 0 || n.length < r * c) return 0;
418
- let l = Math.max(0, Math.floor(e)), u = Math.min(this.dataset.length, Math.ceil(t)), d = Math.min(r, Math.max(0, u - l));
419
- for (let e = 0; e < d; e++) {
420
- let t = l + e, r = this.dataset.getX(t) - s, a = this.dataset.getY(t);
421
- if (i === "points") {
422
- let t = e * 2;
423
- n[t] = r, n[t + 1] = a;
424
- } else {
425
- let t = e * 4;
426
- n[t] = r, n[t + 1] = o, n[t + 2] = r, n[t + 3] = a;
427
- }
428
- }
429
- return d;
430
- }
431
- copyMinMaxSegments(e, t, n, r, i) {
432
- if (o(this.dataset)) return this.dataset.copyMinMaxSegments(e, t, n, r, i);
433
- let a = r === "line-list" ? 4 : 3;
434
- if (!this.pyramid || n <= 0 || t.length < n * a) return 0;
435
- let s = this.dataset.lowerBoundX(e.xMin), c = this.dataset.upperBoundX(e.xMax), l = c - s;
436
- if (l <= 0) return 0;
437
- let u = Math.min(n, l);
438
- for (let e = 0; e < u; e++) {
439
- let n = s + Math.floor(e * l / u), a = s + Math.max(Math.floor((e + 1) * l / u), Math.floor(e * l / u) + 1), o = Math.min(c, a), d = this.minMaxForRange(n, o);
440
- if (!d) continue;
441
- let f = this.dataset.getX(n + (o - n >> 1)) - i, { minY: p, maxY: m } = d;
442
- if (r === "line-list") {
443
- let n = e * 4;
444
- t[n] = f, t[n + 1] = p, t[n + 2] = f, t[n + 3] = m;
445
- } else {
446
- let n = e * 3;
447
- t[n] = f, t[n + 1] = p, t[n + 2] = m;
448
- }
449
- }
450
- return u;
451
- }
452
- minMaxForRange(e, t) {
453
- return this._useDatasetRangeMinMax && r(this.dataset) ? this.dataset.rangeMinMaxY(e, t) : !this.pyramid || this._useRawMinMaxScan ? this.rawMinMaxForRange(e, t) : this.pyramid.rangeMinMax(this.dataset, e, t);
454
- }
455
- queryRangeMinMax(e, t, n) {
456
- if (n <= 0 || t <= 0 || !r(this.dataset)) return {
457
- buckets: new Float32Array(),
458
- bucketCount: 0,
459
- level: 0,
460
- samplesPerPixel: 0
461
- };
462
- let i = Math.max(1, t / n), a = Math.max(0, Math.ceil(Math.log2(i)) - 1), o = 2 ** (a + 1), s = Math.max(0, e), c = s + t, l = Math.ceil(this.dataset.length / o), u = Math.max(0, Math.floor(s / o)), d = Math.min(l, Math.ceil(c / o)), f = Math.max(0, d - u), p = new Float32Array(f * 2);
463
- for (let e = 0; e < f; e++) {
464
- let t = (u + e) * o, n = Math.min(this.dataset.length, t + o), r = this.dataset.rangeMinMaxY(t, n);
465
- r && (p[e * 2] = r.minY, p[e * 2 + 1] = r.maxY);
466
- }
467
- return {
468
- buckets: p,
469
- bucketCount: f,
470
- level: a,
471
- samplesPerPixel: i
472
- };
473
- }
474
- rawMinMaxForRange(e, t) {
475
- if (r(this.dataset)) return this.dataset.rangeMinMaxY(e, t);
476
- let n = Math.max(0, Math.floor(e)), i = Math.min(this.dataset.length, Math.ceil(t));
477
- if (i <= n) return null;
478
- let a = Infinity, o = -Infinity;
479
- for (let e = n; e < i; e++) {
480
- let t = this.dataset.getY(e);
481
- t < a && (a = t), t > o && (o = t);
482
- }
483
- return {
484
- minY: a,
485
- maxY: o
486
- };
487
- }
488
- };
489
- //#endregion
490
- //#region src/core/search.ts
491
- function d(e, t, n) {
492
- let r = 0, i = e;
493
- for (; r < i;) {
494
- let e = r + (i - r >> 1);
495
- t(e) < n ? r = e + 1 : i = e;
496
- }
497
- return r;
498
- }
499
- function f(e, t, n) {
500
- let r = 0, i = e;
501
- for (; r < i;) {
502
- let e = r + (i - r >> 1);
503
- t(e) <= n ? r = e + 1 : i = e;
504
- }
505
- return r;
1
+ import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "./Chart-BW9JaHs6.js";
2
+ //#region src/core/UniformRingBuffer.ts
3
+ function l(e, t) {
4
+ return (e % t + t) % t;
506
5
  }
507
- //#endregion
508
- //#region src/core/RingBuffer.ts
509
- var p = class e {
6
+ var u = class e {
510
7
  capacity;
511
- _length = 0;
512
- _head = 0;
513
- xData;
8
+ xStep;
9
+ blockSize;
514
10
  yData;
515
- treeBase;
11
+ blockMin;
12
+ blockMax;
13
+ blockTreeBase;
516
14
  minTree;
517
15
  maxTree;
518
- overflow;
16
+ _length = 0;
17
+ _head = 0;
18
+ _nextX;
519
19
  constructor(t, n = {}) {
520
- if (!Number.isInteger(t) || t <= 0) throw RangeError("RingBuffer capacity must be a positive integer.");
521
- this.capacity = t, this.overflow = n.overflow ?? "wrap", this.xData = new Float64Array(t), this.yData = new Float32Array(t), this.treeBase = e.nextPowerOfTwo(t), this.minTree = new Float32Array(this.treeBase * 2), this.maxTree = new Float32Array(this.treeBase * 2), this.minTree.fill(Infinity), this.maxTree.fill(-Infinity);
20
+ if (!Number.isInteger(t) || t <= 0) throw RangeError("UniformRingBuffer capacity must be a positive integer.");
21
+ let r = n.xStep ?? 1;
22
+ if (!Number.isFinite(r) || r <= 0) throw RangeError("UniformRingBuffer xStep must be a positive finite number.");
23
+ let i = n.blockSize ?? 64;
24
+ if (!Number.isInteger(i) || i <= 0) throw RangeError("UniformRingBuffer blockSize must be a positive integer.");
25
+ this.capacity = t, this.xStep = r, this.blockSize = i, this._nextX = n.xStart ?? 0, this.yData = new Float32Array(t);
26
+ let a = Math.ceil(t / this.blockSize);
27
+ this.blockMin = new Float32Array(a), this.blockMax = new Float32Array(a), this.blockTreeBase = e.nextPowerOfTwo(a), this.minTree = new Float32Array(this.blockTreeBase * 2), this.maxTree = new Float32Array(this.blockTreeBase * 2), this.blockMin.fill(Infinity), this.blockMax.fill(-Infinity), this.minTree.fill(Infinity), this.maxTree.fill(-Infinity);
522
28
  }
523
29
  get length() {
524
30
  return this._length;
525
31
  }
526
32
  get range() {
527
33
  return this._length === 0 ? null : {
528
- start: this.getX(0),
34
+ start: this.firstX(),
529
35
  end: this.getX(this._length - 1)
530
36
  };
531
37
  }
532
38
  push(e, t) {
533
- if (this._length >= this.capacity) {
534
- if (this.overflow === "drop-new") return;
535
- if (this.overflow === "error") throw RangeError("RingBuffer capacity exceeded.");
536
- }
537
- this.xData[this._head] = e, this.yData[this._head] = t, this.setTreeLeaf(this._head, t), this._head = (this._head + 1) % this.capacity, this._length < this.capacity && this._length++;
39
+ this._length === 0 && Number.isFinite(e) && (this._nextX = e), this.appendY([t]);
538
40
  }
539
41
  append(e, t) {
540
42
  let n = Math.min(e.length, t.length);
541
43
  if (!(n <= 0)) {
542
- if (this.overflow !== "wrap") {
543
- let r = this.capacity - this._length;
544
- if (n > r && this.overflow === "error") throw RangeError("RingBuffer capacity exceeded.");
545
- let i = Math.min(n, r);
546
- if (i <= 0) return;
547
- this.appendNoWrap(e, t, 0, i);
548
- return;
44
+ if (this._length === 0) {
45
+ let t = e[0];
46
+ Number.isFinite(t) && (this._nextX = t);
549
47
  }
550
48
  if (n >= this.capacity) {
551
- let r = n - this.capacity;
552
- this._head = 0, this._length = this.capacity, this.copyIntoPhysical(0, e, t, r, this.capacity);
49
+ let r = n - this.capacity, i = e[r], a = Number.isFinite(i);
50
+ a && (this._nextX = i), this.replaceAll(t, r, a ? this.capacity : n);
553
51
  return;
554
52
  }
555
- this.appendNoWrap(e, t, 0, n);
53
+ this.appendValues(t, 0, n);
556
54
  }
557
55
  }
558
- get(e) {
559
- return e < 0 || e >= this._length ? null : {
560
- x: this.getX(e),
561
- y: this.getY(e)
562
- };
56
+ appendY(e) {
57
+ let t = e.length;
58
+ if (!(t <= 0)) {
59
+ if (t >= this.capacity) {
60
+ this.replaceAll(e, t - this.capacity, t);
61
+ return;
62
+ }
63
+ this.appendValues(e, 0, t);
64
+ }
65
+ }
66
+ clear() {
67
+ this._length = 0, this._head = 0, this.blockMin.fill(Infinity), this.blockMax.fill(-Infinity), this.minTree.fill(Infinity), this.maxTree.fill(-Infinity);
563
68
  }
564
69
  getX(e) {
565
- return this.assertValidIndex(e), this.xData[this.logicalToPhysical(e)];
70
+ return this.assertValidIndex(e), this.firstX() + e * this.xStep;
566
71
  }
567
72
  getY(e) {
568
73
  return this.assertValidIndex(e), this.yData[this.logicalToPhysical(e)];
569
74
  }
570
75
  lowerBoundX(e) {
571
- return d(this._length, (e) => this.getX(e), e);
76
+ return this._length === 0 ? 0 : Math.max(0, Math.min(this._length, Math.ceil((e - this.firstX()) / this.xStep)));
572
77
  }
573
78
  upperBoundX(e) {
574
- return f(this._length, (e) => this.getX(e), e);
79
+ return this._length === 0 ? 0 : Math.max(0, Math.min(this._length, Math.floor((e - this.firstX()) / this.xStep) + 1));
575
80
  }
576
81
  rangeMinMaxY(e, t) {
577
82
  let n = Math.max(0, Math.floor(e)), r = Math.min(this._length, Math.ceil(t));
@@ -584,44 +89,100 @@ var p = class e {
584
89
  maxY: Math.max(o.maxY, s.maxY)
585
90
  } : o : s;
586
91
  }
587
- clear() {
588
- this._length = 0, this._head = 0, this.minTree.fill(Infinity), this.maxTree.fill(-Infinity);
92
+ copyVisibleSamples(e, t, n, r, i, a) {
93
+ let o = this.lowerBoundX(e.xMin), s = this.upperBoundX(e.xMax);
94
+ if (s <= o) return 0;
95
+ let c = Math.max(1, Math.ceil((e.xMax - e.xMin) / this.xStep)), u = Math.max(1, Math.ceil(c / n)), d = o + l(-l(Math.round(this.firstX() / this.xStep) + o, u), u);
96
+ return this.copyStridedSamples(d, s, u, t, n, r, i, a);
589
97
  }
590
- appendNoWrap(e, t, n, r) {
591
- let i = n, a = r;
592
- for (; a > 0;) {
593
- let n = Math.min(a, this.capacity - this._head);
594
- this.copyIntoPhysical(this._head, e, t, i, n), this._head = (this._head + n) % this.capacity, this._length = Math.min(this.capacity, this._length + n), i += n, a -= n;
595
- }
98
+ copySamplesRange(e, t, n, r, i, a, o) {
99
+ return this.copyStridedSamples(Math.max(0, Math.floor(e)), Math.min(this._length, Math.ceil(t)), 1, n, r, i, a, o);
596
100
  }
597
- copyIntoPhysical(e, t, n, r, i) {
598
- for (let a = 0; a < i; a++) {
599
- let i = e + a, o = n[r + a];
600
- this.xData[i] = t[r + a], this.yData[i] = o;
601
- let s = this.treeBase + i;
602
- this.minTree[s] = o, this.maxTree[s] = o;
101
+ copyMinMaxSegments(e, t, n, r, i) {
102
+ let a = r === "line-list" ? 4 : 3;
103
+ if (n <= 0 || t.length < n * a) return 0;
104
+ let o = this.lowerBoundX(e.xMin), s = this.upperBoundX(e.xMax), c = s - o;
105
+ if (c <= 0) return 0;
106
+ let l = Math.min(n, c);
107
+ for (let e = 0; e < l; e++) {
108
+ let n = o + Math.floor(e * c / l), a = Math.min(s, o + Math.max(Math.floor((e + 1) * c / l), Math.floor(e * c / l) + 1)), u = this.rangeMinMaxY(n, a);
109
+ if (!u) continue;
110
+ let d = this.firstX() + (n + (a - n >> 1)) * this.xStep - i;
111
+ if (r === "line-list") {
112
+ let n = e * 4;
113
+ t[n] = d, t[n + 1] = u.minY, t[n + 2] = d, t[n + 3] = u.maxY;
114
+ } else {
115
+ let n = e * 3;
116
+ t[n] = d, t[n + 1] = u.minY, t[n + 2] = u.maxY;
117
+ }
603
118
  }
604
- this.recomputeTreeRange(e, e + i);
119
+ return l;
605
120
  }
606
- setTreeLeaf(e, t) {
607
- let n = this.treeBase + e;
608
- for (this.minTree[n] = t, this.maxTree[n] = t, n >>= 1; n >= 1;) this.recomputeTreeNode(n), n >>= 1;
121
+ replaceAll(e, t, n) {
122
+ for (let n = 0; n < this.capacity; n++) this.yData[n] = e[t + n];
123
+ this._head = 0, this._length = this.capacity, this._nextX += n * this.xStep, this.recomputeAllBlocks();
609
124
  }
610
- recomputeTreeRange(e, t) {
611
- let n = this.treeBase + e >> 1, r = this.treeBase + t - 1 >> 1;
612
- for (; n >= 1;) {
613
- for (let e = n; e <= r; e++) this.recomputeTreeNode(e);
614
- if (n === 1) break;
615
- n >>= 1, r >>= 1;
125
+ appendValues(e, t, n) {
126
+ let r = t, i = n;
127
+ for (; i > 0;) {
128
+ let t = Math.min(i, this.capacity - this._head);
129
+ for (let n = 0; n < t; n++) this.yData[this._head + n] = e[r + n];
130
+ this._length = Math.min(this.capacity, this._length + t), this.recomputePhysicalBlockRange(this._head, this._head + t), this._head = (this._head + t) % this.capacity, r += t, i -= t;
616
131
  }
132
+ this._nextX += n * this.xStep;
617
133
  }
618
- recomputeTreeNode(e) {
619
- let t = e << 1, n = t + 1, r = this.minTree[t], i = this.minTree[n], a = this.maxTree[t], o = this.maxTree[n];
620
- this.minTree[e] = r < i ? r : i, this.maxTree[e] = a > o ? a : o;
134
+ copyStridedSamples(e, t, n, r, i, a, o, s) {
135
+ let c = a === "points" ? 2 : 4;
136
+ if (i <= 0 || r.length < i * c) return 0;
137
+ let l = Math.min(i, Math.max(0, Math.ceil((t - e) / n))), u = this.firstX();
138
+ if (a === "points") for (let t = 0, i = e; t < l; t++, i += n) {
139
+ let e = t * 2;
140
+ r[e] = u + i * this.xStep - s, r[e + 1] = this.yData[this.logicalToPhysical(i)];
141
+ }
142
+ else for (let t = 0, i = e; t < l; t++, i += n) {
143
+ let e = t * 4, n = u + i * this.xStep - s;
144
+ r[e] = n, r[e + 1] = o, r[e + 2] = n, r[e + 3] = this.yData[this.logicalToPhysical(i)];
145
+ }
146
+ return l;
621
147
  }
622
148
  queryPhysicalMinMax(e, t) {
623
- if (t <= e) return null;
624
- let n = this.treeBase + e, r = this.treeBase + t, i = Infinity, a = -Infinity;
149
+ let n = Infinity, r = -Infinity, i = e;
150
+ for (; i < t && i % this.blockSize !== 0;) {
151
+ let e = this.yData[i];
152
+ e < n && (n = e), e > r && (r = e), i++;
153
+ }
154
+ let a = i / this.blockSize, o = Math.floor(t / this.blockSize);
155
+ if (o > a) {
156
+ let e = this.queryBlockMinMax(a, o);
157
+ e && (e.minY < n && (n = e.minY), e.maxY > r && (r = e.maxY)), i = o * this.blockSize;
158
+ }
159
+ for (; i < t;) {
160
+ let e = this.yData[i];
161
+ e < n && (n = e), e > r && (r = e), i++;
162
+ }
163
+ return Number.isFinite(n) && Number.isFinite(r) ? {
164
+ minY: n,
165
+ maxY: r
166
+ } : null;
167
+ }
168
+ recomputePhysicalBlockRange(e, t) {
169
+ let n = Math.floor(e / this.blockSize), r = Math.floor((t - 1) / this.blockSize);
170
+ for (let e = n; e <= r; e++) this.recomputeBlock(e);
171
+ }
172
+ recomputeAllBlocks() {
173
+ for (let e = 0; e < this.blockMin.length; e++) this.recomputeBlock(e);
174
+ }
175
+ recomputeBlock(e) {
176
+ let t = e * this.blockSize, n = Math.min(this.capacity, t + this.blockSize), r = Infinity, i = -Infinity;
177
+ for (let e = t; e < n; e++) {
178
+ if (!this.isPhysicalValid(e)) continue;
179
+ let t = this.yData[e];
180
+ t < r && (r = t), t > i && (i = t);
181
+ }
182
+ this.blockMin[e] = r, this.blockMax[e] = i, this.updateBlockTreeLeaf(e, r, i);
183
+ }
184
+ queryBlockMinMax(e, t) {
185
+ let n = this.blockTreeBase + e, r = this.blockTreeBase + t, i = Infinity, a = -Infinity;
625
186
  for (; n < r;) {
626
187
  if (n & 1) {
627
188
  let e = this.minTree[n], t = this.maxTree[n];
@@ -639,1622 +200,29 @@ var p = class e {
639
200
  maxY: a
640
201
  } : null;
641
202
  }
203
+ updateBlockTreeLeaf(e, t, n) {
204
+ let r = this.blockTreeBase + e;
205
+ for (this.minTree[r] = t, this.maxTree[r] = n, r >>= 1; r >= 1;) {
206
+ let e = r << 1, t = e + 1, n = this.minTree[e], i = this.minTree[t], a = this.maxTree[e], o = this.maxTree[t];
207
+ this.minTree[r] = n < i ? n : i, this.maxTree[r] = a > o ? a : o, r >>= 1;
208
+ }
209
+ }
210
+ isPhysicalValid(e) {
211
+ return this._length === this.capacity || e < this._length;
212
+ }
213
+ firstX() {
214
+ return this._nextX - this._length * this.xStep;
215
+ }
642
216
  logicalToPhysical(e) {
643
217
  return (this._head - this._length + e + this.capacity) % this.capacity;
644
218
  }
645
219
  assertValidIndex(e) {
646
- if (!Number.isInteger(e) || e < 0 || e >= this._length) throw RangeError(`RingBuffer index out of range: ${e}`);
220
+ if (!Number.isInteger(e) || e < 0 || e >= this._length) throw RangeError(`UniformRingBuffer index out of range: ${e}`);
647
221
  }
648
222
  static nextPowerOfTwo(e) {
649
223
  return 2 ** Math.ceil(Math.log2(e));
650
224
  }
651
- }, m = "attribute vec2 position;\n\nuniform vec2 uScale;\nuniform vec2 uOffset;\n\nvoid main() {\n vec2 clipSpace = position * uScale + uOffset;\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n}\n", h = "precision mediump float;\n\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n", g = "attribute float aX;\nattribute float aMinY;\nattribute float aMaxY;\nattribute float aSelect;\n\nuniform vec2 uScale;\nuniform vec2 uOffset;\n\nvoid main() {\n float y = (aSelect < 0.5) ? aMinY : aMaxY;\n vec2 position = vec2(aX, y);\n vec2 clipSpace = position * uScale + uOffset;\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n}\n", _ = "precision mediump float;\n\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n", v = "attribute vec2 aPosition;\nattribute vec2 aCorner;\n\nuniform vec2 uScale;\nuniform vec2 uOffset;\nuniform vec2 uCanvasSize;\nuniform float uPointSize;\n\nvoid main() {\n vec2 centerClip = aPosition * uScale + uOffset;\n vec2 pointSizeClip = vec2(2.0 / uCanvasSize.x, 2.0 / uCanvasSize.y) * uPointSize * 0.5;\n vec2 clipSpace = centerClip + aCorner * pointSizeClip;\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n}\n", y = "precision mediump float;\n\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n", ee = "attribute vec2 aPosition;\n\nuniform vec2 uScale;\nuniform vec2 uOffset;\nuniform float uPointSize;\n\nvoid main() {\n vec2 clipSpace = aPosition * uScale + uOffset;\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n", te = "precision mediump float;\n\nuniform vec4 uColor;\n\nvoid main() {\n vec2 p = gl_PointCoord * 2.0 - 1.0;\n if (dot(p, p) > 1.0) discard;\n gl_FragColor = uColor;\n}\n", ne = "attribute vec2 aPosition;\nattribute vec2 aCorner;\n\nuniform vec2 uScale;\nuniform vec2 uOffset;\nuniform float uBarWidth;\nuniform float uBaseline;\n\nvoid main() {\n float x = aPosition.x + aCorner.x * uBarWidth;\n float y = mix(uBaseline, aPosition.y, aCorner.y);\n vec2 clipSpace = vec2(x, y) * uScale + uOffset;\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n}\n", re = "attribute float aX;\nattribute float aMinY;\nattribute float aMaxY;\nattribute vec2 aCorner;\n\nuniform vec2 uScale;\nuniform vec2 uOffset;\nuniform float uBarWidth;\n\nvoid main() {\n float x = aX + aCorner.x * uBarWidth;\n float y = mix(aMinY, aMaxY, aCorner.y);\n vec2 clipSpace = vec2(x, y) * uScale + uOffset;\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n}\n", b = "precision mediump float;\n\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n", x = {
652
- line: {
653
- vert: m,
654
- frag: h
655
- },
656
- segment: {
657
- vert: g,
658
- frag: _
659
- },
660
- point: {
661
- vert: v,
662
- frag: y
663
- },
664
- pointSprite: {
665
- vert: ee,
666
- frag: te
667
- },
668
- bar: {
669
- vert: ne,
670
- frag: b
671
- },
672
- barRange: {
673
- vert: re,
674
- frag: b
675
- }
676
- }, S = 3, C = 2, w = 4, T = 4, E = .8, D = 0, O = class {
677
- backend;
678
- lineProgram;
679
- segmentProgram;
680
- pointProgram;
681
- pointSpriteProgram;
682
- barProgram;
683
- barRangeProgram;
684
- segmentSelectBuffer;
685
- pointCornerBuffer;
686
- barCornerBuffer;
687
- scaleUniform = new Float32Array(2);
688
- offsetUniform = new Float32Array(2);
689
- canvasSizeUniform = new Float32Array(2);
690
- xOrigin = 0;
691
- constructor(e) {
692
- this.backend = e, this.lineProgram = this.backend.createProgram(x.line.vert, x.line.frag), this.segmentProgram = this.backend.createProgram(x.segment.vert, x.segment.frag), this.pointProgram = this.backend.createProgram(x.point.vert, x.point.frag), this.pointSpriteProgram = this.backend.createProgram(x.pointSprite.vert, x.pointSprite.frag), this.barProgram = this.backend.createProgram(x.bar.vert, x.bar.frag), this.barRangeProgram = this.backend.createProgram(x.barRange.vert, x.barRange.frag), this.segmentSelectBuffer = this.backend.createBuffer({
693
- usage: "static",
694
- type: "float",
695
- length: 2
696
- }), this.backend.updateBuffer(this.segmentSelectBuffer, new Float32Array([0, 1])), this.pointCornerBuffer = this.backend.createBuffer({
697
- usage: "static",
698
- type: "float",
699
- length: 8
700
- }), this.backend.updateBuffer(this.pointCornerBuffer, new Float32Array([
701
- -1,
702
- -1,
703
- 1,
704
- -1,
705
- -1,
706
- 1,
707
- 1,
708
- 1
709
- ])), this.barCornerBuffer = this.backend.createBuffer({
710
- usage: "static",
711
- type: "float",
712
- length: 8
713
- }), this.backend.updateBuffer(this.barCornerBuffer, new Float32Array([
714
- -.5,
715
- 0,
716
- .5,
717
- 0,
718
- -.5,
719
- 1,
720
- .5,
721
- 1
722
- ]));
723
- }
724
- get supportsInstancedSegments() {
725
- return this.backend.capabilities.instancing;
726
- }
727
- get supportsInstancedPoints() {
728
- return this.backend.capabilities.instancing;
729
- }
730
- get supportsInstancedBars() {
731
- return this.backend.capabilities.instancing;
732
- }
733
- clear(e, t, n, r) {
734
- this.backend.clear(e, t, n, r);
735
- }
736
- createFloatBuffer(e) {
737
- return this.backend.createBuffer({
738
- usage: "stream",
739
- type: "float",
740
- length: e
741
- });
742
- }
743
- updateFloatBuffer(e, t, n = t.length) {
744
- let r = Math.max(0, Math.min(n, t.length));
745
- this.backend.updateBuffer(e, r === t.length ? t : t.subarray(0, r));
746
- }
747
- viewport(e, t, n, r) {
748
- this.backend.viewport(e, t, n, r);
749
- }
750
- setXOrigin(e) {
751
- this.xOrigin = Number.isFinite(e) ? e : 0;
752
- }
753
- drawLines(e, t, n, r) {
754
- this.drawLinePrimitive("lines", e, t, n, r);
755
- }
756
- drawLineStrip(e, t, n, r) {
757
- this.drawLinePrimitive("line_strip", e, t, n, r);
758
- }
759
- drawClipLineStrip(e, t, n) {
760
- this.drawClipPrimitive("line_strip", e, t, n);
761
- }
762
- drawClipLines(e, t, n) {
763
- this.drawClipPrimitive("lines", e, t, n);
764
- }
765
- drawMinMaxSegments(e, t, n, r) {
766
- this.drawLines(e, t, n, r);
767
- }
768
- drawMinMaxSegmentsInstanced(e, t, n, r) {
769
- this.writeCameraUniforms(r);
770
- let i = S * w, a = {
771
- buffer: e,
772
- divisor: 1,
773
- stride: i,
774
- offset: 0
775
- }, o = {
776
- buffer: e,
777
- divisor: 1,
778
- stride: i,
779
- offset: w
780
- }, s = {
781
- buffer: e,
782
- divisor: 1,
783
- stride: i,
784
- offset: w * 2
785
- }, c = {
786
- buffer: this.segmentSelectBuffer,
787
- divisor: 0,
788
- stride: w,
789
- offset: 0
790
- };
791
- this.backend.draw({
792
- program: this.segmentProgram,
793
- primitive: "lines",
794
- count: 2,
795
- instances: t,
796
- attributes: {
797
- aMaxY: s,
798
- aMinY: o,
799
- aSelect: c,
800
- aX: a
801
- },
802
- uniforms: {
803
- uScale: this.scaleUniform,
804
- uOffset: this.offsetUniform,
805
- uColor: n.color
806
- }
807
- });
808
- }
809
- drawPoints(e, t, n, r, i, a) {
810
- this.supportsInstancedPoints ? this.drawPointsInstanced(e, t, n, r, i, a) : this.drawPointSprites(e, t, n, r);
811
- }
812
- drawPointsInstanced(e, t, n, r, i, a) {
813
- this.writeCameraUniforms(r), this.canvasSizeUniform[0] = Math.max(1, i), this.canvasSizeUniform[1] = Math.max(1, a);
814
- let o = {
815
- buffer: e,
816
- divisor: 1,
817
- stride: C * w,
818
- offset: 0,
819
- size: 2
820
- }, s = {
821
- buffer: this.pointCornerBuffer,
822
- divisor: 0,
823
- stride: C * w,
824
- offset: 0,
825
- size: 2
826
- };
827
- this.backend.draw({
828
- program: this.pointProgram,
829
- primitive: "triangle_strip",
830
- count: 4,
831
- instances: t,
832
- attributes: {
833
- aCorner: s,
834
- aPosition: o
835
- },
836
- uniforms: {
837
- uScale: this.scaleUniform,
838
- uOffset: this.offsetUniform,
839
- uCanvasSize: this.canvasSizeUniform,
840
- uPointSize: n.pointSize ?? T,
841
- uColor: n.color
842
- }
843
- });
844
- }
845
- drawPointSprites(e, t, n, r) {
846
- this.writeCameraUniforms(r), this.backend.draw({
847
- program: this.pointSpriteProgram,
848
- primitive: "points",
849
- count: t,
850
- attributes: { aPosition: e },
851
- uniforms: {
852
- uScale: this.scaleUniform,
853
- uOffset: this.offsetUniform,
854
- uPointSize: n.pointSize ?? T,
855
- uColor: n.color
856
- }
857
- });
858
- }
859
- drawAreaStrip(e, t, n, r) {
860
- this.writeCameraUniforms(r), this.backend.draw({
861
- program: this.lineProgram,
862
- primitive: "triangle_strip",
863
- count: t,
864
- attributes: { position: e },
865
- uniforms: {
866
- uScale: this.scaleUniform,
867
- uOffset: this.offsetUniform,
868
- uColor: n.fillColor ?? n.color
869
- }
870
- });
871
- }
872
- drawBarsInstanced(e, t, n, r) {
873
- this.writeCameraUniforms(r);
874
- let i = {
875
- buffer: e,
876
- divisor: 1,
877
- stride: C * w,
878
- offset: 0,
879
- size: 2
880
- }, a = {
881
- buffer: this.barCornerBuffer,
882
- divisor: 0,
883
- stride: C * w,
884
- offset: 0,
885
- size: 2
886
- };
887
- this.backend.draw({
888
- program: this.barProgram,
889
- primitive: "triangle_strip",
890
- count: 4,
891
- instances: t,
892
- attributes: {
893
- aCorner: a,
894
- aPosition: i
895
- },
896
- uniforms: {
897
- uScale: this.scaleUniform,
898
- uOffset: this.offsetUniform,
899
- uBarWidth: n.barWidth ?? E,
900
- uBaseline: n.baseline ?? D,
901
- uColor: n.color
902
- }
903
- });
904
- }
905
- drawBarRangesInstanced(e, t, n, r) {
906
- this.writeCameraUniforms(r);
907
- let i = S * w, a = {
908
- buffer: e,
909
- divisor: 1,
910
- stride: i,
911
- offset: 0
912
- }, o = {
913
- buffer: e,
914
- divisor: 1,
915
- stride: i,
916
- offset: w
917
- }, s = {
918
- buffer: e,
919
- divisor: 1,
920
- stride: i,
921
- offset: w * 2
922
- }, c = {
923
- buffer: this.barCornerBuffer,
924
- divisor: 0,
925
- stride: C * w,
926
- offset: 0,
927
- size: 2
928
- };
929
- this.backend.draw({
930
- program: this.barRangeProgram,
931
- primitive: "triangle_strip",
932
- count: 4,
933
- instances: t,
934
- attributes: {
935
- aCorner: c,
936
- aMaxY: s,
937
- aMinY: o,
938
- aX: a
939
- },
940
- uniforms: {
941
- uScale: this.scaleUniform,
942
- uOffset: this.offsetUniform,
943
- uBarWidth: n.barWidth ?? E,
944
- uColor: n.color
945
- }
946
- });
947
- }
948
- drawBarTriangles(e, t, n, r) {
949
- this.drawTrianglePrimitive(e, t, n, r);
950
- }
951
- drawLinePrimitive(e, t, n, r, i) {
952
- this.writeCameraUniforms(i), this.backend.draw({
953
- program: this.lineProgram,
954
- primitive: e,
955
- count: n,
956
- attributes: { position: t },
957
- uniforms: {
958
- uScale: this.scaleUniform,
959
- uOffset: this.offsetUniform,
960
- uColor: r.color
961
- }
962
- });
963
- }
964
- drawTrianglePrimitive(e, t, n, r) {
965
- this.writeCameraUniforms(r), this.backend.draw({
966
- program: this.lineProgram,
967
- primitive: "triangles",
968
- count: t,
969
- attributes: { position: e },
970
- uniforms: {
971
- uScale: this.scaleUniform,
972
- uOffset: this.offsetUniform,
973
- uColor: n.color
974
- }
975
- });
976
- }
977
- drawClipPrimitive(e, t, n, r) {
978
- this.scaleUniform[0] = 1, this.scaleUniform[1] = 1, this.offsetUniform[0] = 0, this.offsetUniform[1] = 0, this.backend.draw({
979
- program: this.lineProgram,
980
- primitive: e,
981
- count: n,
982
- attributes: { position: t },
983
- uniforms: {
984
- uScale: this.scaleUniform,
985
- uOffset: this.offsetUniform,
986
- uColor: r.color
987
- }
988
- });
989
- }
990
- writeCameraUniforms(e) {
991
- let t = e.xMin - this.xOrigin, n = e.xMax - this.xOrigin;
992
- this.scaleUniform[0] = e.xScale, this.scaleUniform[1] = e.yScale, this.offsetUniform[0] = -(t + n) / (n - t), this.offsetUniform[1] = e.yOffset;
993
- }
994
- dispose() {
995
- this.backend.destroy();
996
- }
997
- }, k = [
998
- 1024,
999
- 4096,
1000
- 16384,
1001
- 32768,
1002
- 131072
1003
- ], ie = class {
1004
- regl;
1005
- pool = [];
1006
- preAllocated = !1;
1007
- constructor(e) {
1008
- this.regl = e;
1009
- }
1010
- get reglInstance() {
1011
- return this.regl;
1012
- }
1013
- preAllocate() {
1014
- if (!this.preAllocated) {
1015
- this.preAllocated = !0;
1016
- for (let e of k) this.pool.push(this.createEntry(e, "stream"));
1017
- }
1018
- }
1019
- acquire(e, t = "stream") {
1020
- let n = e, r = this.findFree(n);
1021
- if (!r) {
1022
- let e = this.roundUp(n);
1023
- r = this.createEntry(e, t), this.pool.push(r);
1024
- }
1025
- return r.inUse = !0, {
1026
- buffer: r.buffer,
1027
- array: r.floatArray
1028
- };
1029
- }
1030
- release(e) {
1031
- for (let t of this.pool) if (t.buffer === e) {
1032
- t.inUse = !1;
1033
- return;
1034
- }
1035
- }
1036
- destroy() {
1037
- for (let e of this.pool) e.buffer.destroy();
1038
- this.pool.length = 0, this.preAllocated = !1;
1039
- }
1040
- createEntry(e, t) {
1041
- return {
1042
- buffer: this.regl.buffer({
1043
- length: e * 4,
1044
- usage: t,
1045
- type: "float"
1046
- }),
1047
- floatArray: new Float32Array(e),
1048
- floatCapacity: e,
1049
- inUse: !1
1050
- };
1051
- }
1052
- findFree(e) {
1053
- return this.pool.find((t) => !t.inUse && t.floatCapacity >= e);
1054
- }
1055
- roundUp(e) {
1056
- for (let t of k) if (t >= e) return t;
1057
- let t = k[k.length - 1], n = 1 << 32 - Math.clz32(e - 1);
1058
- return Math.max(t * 2, n);
1059
- }
1060
- };
1061
- //#endregion
1062
- //#region src/render/ReglBackend.ts
1063
- function ae(e) {
1064
- return e;
1065
- }
1066
- var oe = class {
1067
- gl;
1068
- regl;
1069
- resources;
1070
- nextProgramId = 1;
1071
- commandCache = /* @__PURE__ */ new Map();
1072
- scissorBox = null;
1073
- capabilities;
1074
- constructor(t) {
1075
- let n = t.getContext("webgl2", {
1076
- alpha: !0,
1077
- antialias: !1,
1078
- depth: !1,
1079
- stencil: !1,
1080
- premultipliedAlpha: !1,
1081
- preserveDrawingBuffer: !1,
1082
- powerPreference: "high-performance"
1083
- });
1084
- if (!n) throw Error("BlazePlot requires WebGL2, but this browser/context does not support it.");
1085
- this.gl = n, this.regl = e({
1086
- gl: ae(this.gl),
1087
- extensions: [],
1088
- optionalExtensions: ["angle_instanced_arrays", "ext_disjoint_timer_query_webgl2"]
1089
- }), this.capabilities = { instancing: this.regl.hasExtension("angle_instanced_arrays") }, this.resources = new ie(this.regl), this.resources.preAllocate();
1090
- }
1091
- createBuffer(e) {
1092
- let { buffer: t } = this.resources.acquire(e.length, e.usage);
1093
- return {
1094
- length: e.length,
1095
- type: e.type,
1096
- buffer: t
1097
- };
1098
- }
1099
- updateBuffer(e, t, n = 0) {
1100
- if (t.length + n > e.length) throw RangeError("GPU buffer update exceeds allocated buffer length.");
1101
- let r = e.type === "float" ? 4 : 2;
1102
- this.asReglBuffer(e).buffer.subdata(t, n * r);
1103
- }
1104
- createProgram(e, t) {
1105
- return {
1106
- id: this.nextProgramId++,
1107
- vert: e,
1108
- frag: t
1109
- };
1110
- }
1111
- draw(e) {
1112
- if (e.count <= 0) return;
1113
- let t = this.asReglProgram(e.program), n = Object.keys(e.attributes).sort(), r = Object.keys(e.uniforms).sort(), i = [
1114
- t.id,
1115
- e.primitive,
1116
- n.join(","),
1117
- r.join(","),
1118
- e.instances === void 0 ? 0 : 1
1119
- ].join("|"), a = this.commandCache.get(i);
1120
- a || (a = this.createDrawCommand(t, e.primitive, n, r, e.instances !== void 0), this.commandCache.set(i, a));
1121
- let o = {};
1122
- for (let t of n) o[t] = this.resolveAttribute(e.attributes[t]);
1123
- let s = {
1124
- count: e.count,
1125
- instances: e.instances ?? 0,
1126
- attributes: o,
1127
- uniforms: e.uniforms
1128
- };
1129
- this.scissorBox && (s.scissorEnable = !0, s.scissorBox = {
1130
- x: this.scissorBox.x,
1131
- y: this.scissorBox.y,
1132
- width: this.scissorBox.w,
1133
- height: this.scissorBox.h
1134
- }), a(s);
1135
- }
1136
- dispose(e) {
1137
- this.isReglBuffer(e) && this.resources.release(e.buffer);
1138
- }
1139
- clear(e, t, n, r) {
1140
- this.regl.clear({ color: [
1141
- e,
1142
- t,
1143
- n,
1144
- r
1145
- ] });
1146
- }
1147
- viewport(e, t, n, r) {
1148
- this.regl.poll(), this.scissorBox = {
1149
- x: e,
1150
- y: t,
1151
- w: n,
1152
- h: r
1153
- };
1154
- }
1155
- destroy() {
1156
- this.resources.destroy(), this.regl.destroy();
1157
- }
1158
- createDrawCommand(e, t, n, r, i) {
1159
- let a = {};
1160
- for (let e of n) a[e] = (t, n) => n.attributes[e];
1161
- let o = {};
1162
- for (let e of r) o[e] = (t, n) => n.uniforms[e];
1163
- return this.regl({
1164
- vert: e.vert,
1165
- frag: e.frag,
1166
- attributes: a,
1167
- uniforms: o,
1168
- primitive: this.toReglPrimitive(t),
1169
- count: (e, t) => t.count,
1170
- instances: i ? (e, t) => t.instances : void 0,
1171
- depth: { enable: !1 },
1172
- scissor: {
1173
- enable: (e, t) => t.scissorEnable ?? !1,
1174
- box: (e, t) => t.scissorBox ?? {
1175
- x: 0,
1176
- y: 0,
1177
- width: 0,
1178
- height: 0
1179
- }
1180
- }
1181
- });
1182
- }
1183
- resolveAttribute(e) {
1184
- return "divisor" in e ? {
1185
- buffer: this.asReglBuffer(e.buffer).buffer,
1186
- divisor: e.divisor,
1187
- stride: e.stride,
1188
- offset: e.offset,
1189
- size: e.size
1190
- } : this.asReglBuffer(e).buffer;
1191
- }
1192
- asReglBuffer(e) {
1193
- return e;
1194
- }
1195
- asReglProgram(e) {
1196
- return e;
1197
- }
1198
- isReglBuffer(e) {
1199
- return "length" in e && "type" in e && "buffer" in e;
1200
- }
1201
- toReglPrimitive(e) {
1202
- switch (e) {
1203
- case "line_strip": return "line strip";
1204
- case "triangle_strip": return "triangle strip";
1205
- default: return e;
1206
- }
1207
- }
1208
- }, A = class e {
1209
- _xMin = 0;
1210
- _xMax = 1;
1211
- _yMin = 0;
1212
- _yMax = 1;
1213
- get xMin() {
1214
- return this._xMin;
1215
- }
1216
- get xMax() {
1217
- return this._xMax;
1218
- }
1219
- get yMin() {
1220
- return this._yMin;
1221
- }
1222
- get yMax() {
1223
- return this._yMax;
1224
- }
1225
- get viewport() {
1226
- return {
1227
- xMin: this._xMin,
1228
- xMax: this._xMax,
1229
- yMin: this._yMin,
1230
- yMax: this._yMax
1231
- };
1232
- }
1233
- get xScale() {
1234
- return 2 / (this._xMax - this._xMin);
1235
- }
1236
- get xOffset() {
1237
- return -(this._xMin + this._xMax) / (this._xMax - this._xMin);
1238
- }
1239
- get yScale() {
1240
- return 2 / (this._yMax - this._yMin);
1241
- }
1242
- get yOffset() {
1243
- return -(this._yMin + this._yMax) / (this._yMax - this._yMin);
1244
- }
1245
- setViewport(t) {
1246
- let n = {
1247
- xMin: t.xMin ?? this._xMin,
1248
- xMax: t.xMax ?? this._xMax,
1249
- yMin: t.yMin ?? this._yMin,
1250
- yMax: t.yMax ?? this._yMax
1251
- };
1252
- e.assertValidViewport(n), this._xMin = n.xMin, this._xMax = n.xMax, this._yMin = n.yMin, this._yMax = n.yMax;
1253
- }
1254
- pan(t) {
1255
- let { dx: n, dy: r } = t;
1256
- e.assertFinite("dx", n), e.assertFinite("dy", r);
1257
- let i = this._xMax - this._xMin, a = this._yMax - this._yMin;
1258
- this.setViewport({
1259
- xMin: this._xMin + n * i,
1260
- xMax: this._xMax + n * i,
1261
- yMin: this._yMin + r * a,
1262
- yMax: this._yMax + r * a
1263
- });
1264
- }
1265
- zoom(t) {
1266
- let { factor: n, cx: r, cy: i, axis: a } = t;
1267
- if (e.assertFinite("factor", n), e.assertFinite("cx", r), e.assertFinite("cy", i), n <= 0) throw RangeError("Camera2D zoom factor must be > 0.");
1268
- let o = this._xMax - this._xMin, s = this._yMax - this._yMin, c = this._xMin + o * r, l = this._yMin + s * i, u = a === "y" ? o : o / n, d = a === "x" ? s : s / n;
1269
- this.setViewport({
1270
- xMin: c - u * r,
1271
- xMax: c + u * (1 - r),
1272
- yMin: l - d * i,
1273
- yMax: l + d * (1 - i)
1274
- });
1275
- }
1276
- toClip(e, t) {
1277
- return [e * this.xScale + this.xOffset, t * this.yScale + this.yOffset];
1278
- }
1279
- toScreen(e, t, n, r) {
1280
- return [(e + 1) * .5 * n, (1 - t) * .5 * r];
1281
- }
1282
- clone() {
1283
- let t = new e();
1284
- return t.setViewport(this.viewport), t;
1285
- }
1286
- static assertValidViewport(t) {
1287
- if (e.assertFinite("xMin", t.xMin), e.assertFinite("xMax", t.xMax), e.assertFinite("yMin", t.yMin), e.assertFinite("yMax", t.yMax), t.xMax <= t.xMin) throw RangeError("Camera2D requires xMax > xMin.");
1288
- if (t.yMax <= t.yMin) throw RangeError("Camera2D requires yMax > yMin.");
1289
- }
1290
- static assertFinite(e, t) {
1291
- if (!Number.isFinite(t)) throw RangeError(`Camera2D ${e} must be finite.`);
1292
- }
1293
- }, j = class {
1294
- camera;
1295
- constructor(e) {
1296
- this.camera = e;
1297
- }
1298
- getXTickValues(e, t = 10, n = []) {
1299
- return this.getTickValues(this.camera.xMin, this.camera.xMax, e, t, 80, n);
1300
- }
1301
- getYTickValues(e, t = 10, n = []) {
1302
- return this.getTickValues(this.camera.yMin, this.camera.yMax, e, t, 48, n);
1303
- }
1304
- formatValue(e) {
1305
- if (Math.abs(e) < 1e-12) return "0";
1306
- let t = Math.abs(e);
1307
- return t >= 1e6 || t < .001 ? e.toExponential(2) : t >= 100 ? e.toFixed(0) : t >= 10 ? e.toFixed(1) : e.toFixed(2);
1308
- }
1309
- getTickValues(e, t, n, r, i, a) {
1310
- if (a.length = 0, n <= 0 || r <= 0) return a;
1311
- let o = t - e;
1312
- if (!Number.isFinite(o) || o <= 0) return a;
1313
- let s = Math.max(2, Math.min(r, Math.floor(n / i))), c = this.niceStep(o / (s - 1)), l = Math.floor(e / c), u = Math.ceil(t / c);
1314
- for (let e = l; e <= u && a.length < r + 2; e++) a.push(this.normalizeTick(e * c, c));
1315
- return a;
1316
- }
1317
- niceStep(e) {
1318
- let t = 10 ** Math.floor(Math.log10(e)), n = e / t;
1319
- return n <= 1.5 ? t : n <= 3 ? 2 * t : n <= 7 ? 5 * t : 10 * t;
1320
- }
1321
- normalizeTick(e, t) {
1322
- let n = Math.max(0, -Math.floor(Math.log10(t)) + 2), r = Number(e.toFixed(n));
1323
- return Object.is(r, -0) ? 0 : r;
1324
- }
1325
- }, M = class {
1326
- layout;
1327
- config;
1328
- options;
1329
- xPool = [];
1330
- yPool = [];
1331
- y2Pool = [];
1332
- xTicks = [];
1333
- yTicks = [];
1334
- y2Ticks = [];
1335
- constructor(e, t, n = {}) {
1336
- this.layout = e, this.config = t, this.options = n;
1337
- }
1338
- setOptions(e) {
1339
- this.options = e;
1340
- for (let e of [
1341
- ...this.xPool,
1342
- ...this.yPool,
1343
- ...this.y2Pool
1344
- ]) e.style.font = this.options.font ?? "11px ui-monospace, monospace, sans-serif", e.style.color = this.options.color ?? "#bfd6ff";
1345
- }
1346
- update(e, t, n = e, r = t) {
1347
- let i = Math.max(1, this.layout.plot.clientWidth), a = Math.max(1, this.layout.plot.clientHeight);
1348
- this.config.x.visible ? t.getXTickValues(i, 12, this.xTicks) : this.xTicks.length = 0, this.config.y.visible ? t.getYTickValues(a, 8, this.yTicks) : this.yTicks.length = 0, this.config.y2.visible ? r.getYTickValues(a, 8, this.y2Ticks) : this.y2Ticks.length = 0, this.updateAxis(this.xPool, this.xTicks, "x", e, i, a, t), this.updateAxis(this.yPool, this.yTicks, "y", e, i, a, t), this.updateAxis(this.y2Pool, this.y2Ticks, "y2", n, i, a, r);
1349
- }
1350
- dispose() {
1351
- for (let e of this.xPool) e.remove();
1352
- for (let e of this.yPool) e.remove();
1353
- for (let e of this.y2Pool) e.remove();
1354
- this.xPool = [], this.yPool = [], this.y2Pool = [];
1355
- }
1356
- parentForAxis(e) {
1357
- return e === "x" ? this.config.x.position === "outside" ? this.layout.xAxis : this.layout.plot : e === "y2" ? this.config.y2.position === "outside" ? this.layout.y2Axis : this.layout.plot : this.config.y.position === "outside" ? this.layout.yAxis : this.layout.plot;
1358
- }
1359
- updateAxis(e, t, n, r, i, a, o) {
1360
- let s = this.parentForAxis(n);
1361
- for (; e.length < t.length;) {
1362
- let t = document.createElement("div");
1363
- t.style.position = "absolute", t.style.pointerEvents = "none", t.style.whiteSpace = "nowrap", t.style.font = this.options.font ?? "11px ui-monospace, monospace, sans-serif", t.style.color = this.options.color ?? "#bfd6ff", t.style.userSelect = "none", s.appendChild(t), e.push(t);
1364
- }
1365
- for (let t of e) t.parentElement !== s && s.appendChild(t);
1366
- for (let n = t.length; n < e.length; n++) e[n].style.display = "none";
1367
- for (let s = 0; s < t.length; s++) {
1368
- let c = e[s], l = t[s], u = o.formatValue(l);
1369
- if (c.textContent !== u && (c.textContent = u), c.style.display = "block", n === "x") {
1370
- let [e] = r.toClip(l, r.yMin), t = (e + 1) * .5 * i;
1371
- c.style.left = `${t}px`, c.style.right = "auto", c.style.transform = "translateX(-50%)", this.config.x.position === "outside" ? (c.style.top = "4px", c.style.bottom = "auto") : (c.style.top = "auto", c.style.bottom = "4px");
1372
- } else {
1373
- let e = n === "y2", t = e ? this.config.y2 : this.config.y, [, i] = r.toClip(r.xMin, l), o = (1 - i) * .5 * a;
1374
- c.style.top = `${o}px`, c.style.bottom = "auto", c.style.transform = "translateY(-50%)", t.position === "outside" ? (c.style.left = e ? "4px" : "auto", c.style.right = e ? "auto" : "4px") : (c.style.left = e ? "auto" : "4px", c.style.right = e ? "4px" : "auto");
1375
- }
1376
- }
1377
- }
1378
- }, se = class {
1379
- root;
1380
- plot;
1381
- canvas;
1382
- xAxis;
1383
- yAxis;
1384
- y2Axis;
1385
- corner;
1386
- cornerRight;
1387
- externalCanvas;
1388
- originalCanvasCssText;
1389
- originalCanvasParent;
1390
- constructor(e, t) {
1391
- let n = e instanceof HTMLCanvasElement ? e : null;
1392
- this.externalCanvas = n !== null, this.originalCanvasCssText = n?.style.cssText ?? "", this.originalCanvasParent = n?.parentElement ?? null, this.root = document.createElement("div"), this.plot = document.createElement("div"), this.canvas = n ?? document.createElement("canvas"), this.xAxis = document.createElement("div"), this.yAxis = document.createElement("div"), this.y2Axis = document.createElement("div"), this.corner = document.createElement("div"), this.cornerRight = document.createElement("div"), this.root.className = "blazeplot-root", this.plot.className = "blazeplot-plot", this.canvas.classList.add("blazeplot-canvas"), this.xAxis.className = "blazeplot-axis blazeplot-axis-x", this.yAxis.className = "blazeplot-axis blazeplot-axis-y", this.y2Axis.className = "blazeplot-axis blazeplot-axis-y2", this.corner.className = "blazeplot-axis-corner", this.cornerRight.className = "blazeplot-axis-corner blazeplot-axis-corner-right", this.applyBaseStyles(), this.mount(e), this.update(t);
1393
- }
1394
- update(e) {
1395
- let t = e.y.visible && e.y.position === "outside", n = e.y2.visible && e.y2.position === "outside", r = e.x.visible && e.x.position === "outside";
1396
- this.root.style.gridTemplateColumns = `${t ? 52 : 0}px minmax(0, 1fr) ${n ? 52 : 0}px`, this.root.style.gridTemplateRows = `minmax(0, 1fr) ${r ? 28 : 0}px`, this.yAxis.style.display = t ? "block" : "none", this.y2Axis.style.display = n ? "block" : "none", this.xAxis.style.display = r ? "block" : "none", this.corner.style.display = r && t ? "block" : "none", this.cornerRight.style.display = r && n ? "block" : "none";
1397
- }
1398
- dispose() {
1399
- this.externalCanvas && this.originalCanvasParent && (this.canvas.style.cssText = this.originalCanvasCssText, this.originalCanvasParent.insertBefore(this.canvas, this.root)), this.root.remove();
1400
- }
1401
- mount(e) {
1402
- this.externalCanvas ? this.originalCanvasParent?.insertBefore(this.root, e) : e.appendChild(this.root), this.root.appendChild(this.yAxis), this.root.appendChild(this.plot), this.root.appendChild(this.y2Axis), this.root.appendChild(this.corner), this.root.appendChild(this.xAxis), this.root.appendChild(this.cornerRight), this.plot.appendChild(this.canvas);
1403
- }
1404
- applyBaseStyles() {
1405
- this.root.style.position = "relative", this.root.style.display = "grid", this.root.style.width = "100%", this.root.style.height = "100%", this.root.style.minWidth = "0", this.root.style.minHeight = "0", this.root.style.overflow = "hidden", this.plot.style.position = "relative", this.plot.style.gridColumn = "2", this.plot.style.gridRow = "1", this.plot.style.minWidth = "0", this.plot.style.minHeight = "0", this.plot.style.overflow = "hidden", this.canvas.style.position = "absolute", this.canvas.style.inset = "0", this.canvas.style.display = "block", this.canvas.style.width = "100%", this.canvas.style.height = "100%", this.canvas.style.touchAction = "none", this.yAxis.style.position = "relative", this.yAxis.style.gridColumn = "1", this.yAxis.style.gridRow = "1", this.yAxis.style.minWidth = "0", this.yAxis.style.minHeight = "0", this.yAxis.style.overflow = "hidden", this.yAxis.style.pointerEvents = "none", this.y2Axis.style.position = "relative", this.y2Axis.style.gridColumn = "3", this.y2Axis.style.gridRow = "1", this.y2Axis.style.minWidth = "0", this.y2Axis.style.minHeight = "0", this.y2Axis.style.overflow = "hidden", this.y2Axis.style.pointerEvents = "none", this.xAxis.style.position = "relative", this.xAxis.style.gridColumn = "2", this.xAxis.style.gridRow = "2", this.xAxis.style.minWidth = "0", this.xAxis.style.minHeight = "0", this.xAxis.style.overflow = "hidden", this.xAxis.style.pointerEvents = "none", this.corner.style.gridColumn = "1", this.corner.style.gridRow = "2", this.corner.style.minWidth = "0", this.corner.style.minHeight = "0", this.corner.style.pointerEvents = "none", this.cornerRight.style.gridColumn = "3", this.cornerRight.style.gridRow = "2", this.cornerRight.style.minWidth = "0", this.cornerRight.style.minHeight = "0", this.cornerRight.style.pointerEvents = "none";
1406
- }
1407
- }, N = {
1408
- backgroundColor: [
1409
- .08,
1410
- .1,
1411
- .16,
1412
- 1
1413
- ],
1414
- backgroundCssColor: "rgba(20, 26, 41, 1)",
1415
- gridColor: [
1416
- .22,
1417
- .3,
1418
- .44,
1419
- .45
1420
- ],
1421
- axisColor: "#bfd6ff",
1422
- axisFont: "11px ui-monospace, monospace, sans-serif",
1423
- seriesColors: [
1424
- [
1425
- .3,
1426
- .6,
1427
- 1,
1428
- 1
1429
- ],
1430
- [
1431
- .95,
1432
- .35,
1433
- .35,
1434
- 1
1435
- ],
1436
- [
1437
- .2,
1438
- .8,
1439
- .4,
1440
- .9
1441
- ],
1442
- [
1443
- .95,
1444
- .72,
1445
- .25,
1446
- 1
1447
- ],
1448
- [
1449
- .72,
1450
- .45,
1451
- .95,
1452
- 1
1453
- ],
1454
- [
1455
- .25,
1456
- .85,
1457
- .95,
1458
- 1
1459
- ]
1460
- ],
1461
- tooltipBackgroundColor: "rgba(4, 8, 16, 0.85)",
1462
- tooltipTextColor: "#bfd6ff",
1463
- tooltipFont: "11px/1.35 ui-monospace, monospace",
1464
- legendBackgroundColor: "rgba(4, 8, 16, 0.85)",
1465
- legendBorderColor: "transparent",
1466
- legendTextColor: "#bfd6ff",
1467
- legendMutedTextColor: "#789",
1468
- legendFont: "11px/1.35 ui-monospace, monospace"
1469
- };
1470
- function P(e, t) {
1471
- if (!e) return N;
1472
- let n = F(e.backgroundColor, N.backgroundColor, t), r = e.seriesColors?.length ? e.seriesColors.map((e, n) => F(e, N.seriesColors[n % N.seriesColors.length], t)) : N.seriesColors;
1473
- return {
1474
- backgroundColor: n,
1475
- backgroundCssColor: ce(e.backgroundColor, N.backgroundCssColor),
1476
- gridColor: F(e.gridColor, N.gridColor, t),
1477
- axisColor: e.axisColor ?? N.axisColor,
1478
- axisFont: e.axisFont ?? N.axisFont,
1479
- seriesColors: r,
1480
- tooltipBackgroundColor: e.tooltipBackgroundColor ?? N.tooltipBackgroundColor,
1481
- tooltipTextColor: e.tooltipTextColor ?? N.tooltipTextColor,
1482
- tooltipFont: e.tooltipFont ?? N.tooltipFont,
1483
- legendBackgroundColor: e.legendBackgroundColor ?? N.legendBackgroundColor,
1484
- legendBorderColor: e.legendBorderColor ?? N.legendBorderColor,
1485
- legendTextColor: e.legendTextColor ?? N.legendTextColor,
1486
- legendMutedTextColor: e.legendMutedTextColor ?? N.legendMutedTextColor,
1487
- legendFont: e.legendFont ?? N.legendFont
1488
- };
1489
- }
1490
- function F(e, t, n) {
1491
- if (!e) return t;
1492
- if (typeof e != "string") return e;
1493
- let r = le(e, n), i = ue(r ?? e, n);
1494
- return L(r ?? e) ?? L(i ?? "") ?? t;
1495
- }
1496
- function ce(e, t) {
1497
- return e ? typeof e == "string" ? e : I(e) : t;
1498
- }
1499
- function I(e) {
1500
- return `rgba(${Math.round(e[0] * 255)}, ${Math.round(e[1] * 255)}, ${Math.round(e[2] * 255)}, ${e[3]})`;
1501
- }
1502
- function le(e, t) {
1503
- let n = t?.ownerDocument ?? globalThis.document;
1504
- if (!n?.documentElement || typeof getComputedStyle > "u") return null;
1505
- let r = t instanceof HTMLElement ? t : n.documentElement, i = n.createElement("span");
1506
- i.style.position = "absolute", i.style.visibility = "hidden", i.style.pointerEvents = "none", i.style.color = e, r.appendChild(i);
1507
- let a = getComputedStyle(i).color;
1508
- return i.remove(), a || null;
1509
- }
1510
- function L(e) {
1511
- let t = e.trim();
1512
- return de(t) ?? R(t) ?? z(t);
1513
- }
1514
- function ue(e, t) {
1515
- let n = t?.ownerDocument ?? globalThis.document;
1516
- if (!n?.createElement) return null;
1517
- let r = n.createElement("canvas").getContext("2d");
1518
- if (!r) return null;
1519
- let i = "#010203";
1520
- r.fillStyle = i, r.fillStyle = e;
1521
- let a = String(r.fillStyle);
1522
- return a === i ? null : a;
1523
- }
1524
- function de(e) {
1525
- let t = e.match(/^rgba?\((.*)\)$/i);
1526
- if (!t) return null;
1527
- let n = t[1].trim().split("/").map((e) => e.trim()), r = n[0], i = n[1], a = r.includes(",") ? r.split(",").map((e) => e.trim()).filter(Boolean) : r.split(/\s+/).filter(Boolean);
1528
- if (a.length < 3) return null;
1529
- let o = B(a[0]), s = B(a[1]), c = B(a[2]), l = H(i ?? (a.length > 3 ? a[3] : void 0));
1530
- return o === null || s === null || c === null || l === null ? null : [
1531
- o,
1532
- s,
1533
- c,
1534
- l
1535
- ];
1536
- }
1537
- function R(e) {
1538
- let t = e.match(/^color\(\s*srgb\s+(.+)\)$/i);
1539
- if (!t) return null;
1540
- let n = t[1].split("/").map((e) => e.trim()), r = n[0].split(/\s+/).filter(Boolean);
1541
- if (r.length < 3) return null;
1542
- let i = V(r[0]), a = V(r[1]), o = V(r[2]), s = H(n[1]);
1543
- return i === null || a === null || o === null || s === null ? null : [
1544
- i,
1545
- a,
1546
- o,
1547
- s
1548
- ];
1549
- }
1550
- function z(e) {
1551
- let t = e.startsWith("#") ? e.slice(1) : "";
1552
- if (![
1553
- 3,
1554
- 4,
1555
- 6,
1556
- 8
1557
- ].includes(t.length) || !/^[\da-f]+$/i.test(t)) return null;
1558
- let n = t.length <= 4 ? [...t].map((e) => e + e).join("") : t, r = Number.parseInt(n, 16);
1559
- return Number.isFinite(r) ? [
1560
- (r >> (n.length === 8 ? 24 : 16) & 255) / 255,
1561
- (r >> (n.length === 8 ? 16 : 8) & 255) / 255,
1562
- (r >> (n.length === 8 ? 8 : 0) & 255) / 255,
1563
- n.length === 8 ? (r & 255) / 255 : 1
1564
- ] : null;
1565
- }
1566
- function B(e) {
1567
- return e.endsWith("%") ? U(Number.parseFloat(e) / 100) : U(Number.parseFloat(e) / 255);
1568
- }
1569
- function V(e) {
1570
- return e.endsWith("%") ? U(Number.parseFloat(e) / 100) : U(Number.parseFloat(e));
1571
- }
1572
- function H(e) {
1573
- return e ? e.endsWith("%") ? U(Number.parseFloat(e) / 100) : U(Number.parseFloat(e)) : 1;
1574
- }
1575
- function U(e) {
1576
- return Number.isFinite(e) ? Math.min(1, Math.max(0, e)) : null;
1577
- }
1578
- //#endregion
1579
- //#region src/ui/Chart.ts
1580
- var W = 16384, G = W >> 1, K = W >> 1, q = 3, J = 4096, Y = 12, fe = 12, X = 5, Z = 64;
1581
- function Q(e) {
1582
- return e === !1 ? {
1583
- visible: !1,
1584
- position: "inside"
1585
- } : e === !0 || e === void 0 ? {
1586
- visible: !0,
1587
- position: "inside"
1588
- } : {
1589
- visible: e.visible !== !1,
1590
- position: e.position ?? "inside"
1591
- };
1592
- }
1593
- function $(e) {
1594
- return e === !1 ? {
1595
- x: {
1596
- visible: !1,
1597
- position: "inside"
1598
- },
1599
- y: {
1600
- visible: !1,
1601
- position: "inside"
1602
- },
1603
- y2: {
1604
- visible: !1,
1605
- position: "inside"
1606
- }
1607
- } : e === !0 || e === void 0 ? {
1608
- x: {
1609
- visible: !0,
1610
- position: "inside"
1611
- },
1612
- y: {
1613
- visible: !0,
1614
- position: "inside"
1615
- },
1616
- y2: {
1617
- visible: !1,
1618
- position: "inside"
1619
- }
1620
- } : {
1621
- x: Q(e.x),
1622
- y: Q(e.y),
1623
- y2: Q(e.y2 ?? !1)
1624
- };
1625
- }
1626
- var pe = class {
1627
- options;
1628
- series = [];
1629
- camera;
1630
- rightCamera;
1631
- axis;
1632
- rightAxis;
1633
- renderer;
1634
- rawLineBuffer;
1635
- rawLineData;
1636
- minMaxInstanceBuffer;
1637
- minMaxInstanceData;
1638
- barTriangleBuffer;
1639
- barTriangleData;
1640
- gridBuffer;
1641
- gridData;
1642
- gridStyle;
1643
- xTicks = [];
1644
- yTicks = [];
1645
- axisOverlay = null;
1646
- normalizedAxes;
1647
- resolvedTheme;
1648
- _gridVisible;
1649
- layout;
1650
- stats = {
1651
- fps: 0,
1652
- frameMs: 0,
1653
- pointsRendered: 0,
1654
- drawCalls: 0,
1655
- uploadBytes: 0,
1656
- renderMode: "none"
1657
- };
1658
- resizeObserver = null;
1659
- pluginDisposers = [];
1660
- hoverSubscribers = /* @__PURE__ */ new Set();
1661
- seriesSubscribers = /* @__PURE__ */ new Set();
1662
- themeSubscribers = /* @__PURE__ */ new Set();
1663
- currentHover = null;
1664
- lastPointerClientX = 0;
1665
- lastPointerClientY = 0;
1666
- pointerInPlot = !1;
1667
- lastFrameAt = 0;
1668
- currentXOrigin = 0;
1669
- _rafId = 0;
1670
- handlePointerMove = (e) => {
1671
- this.pointerInPlot = !0, this.lastPointerClientX = e.clientX, this.lastPointerClientY = e.clientY, this.refreshHover();
1672
- };
1673
- handlePointerLeave = () => {
1674
- this.pointerInPlot = !1, this.emitHover(null);
1675
- };
1676
- constructor(e, t = {}) {
1677
- this.options = t, this.resolvedTheme = P(t.theme, e), this.normalizedAxes = $(t.axes), this._gridVisible = t.grid !== !1, this.layout = new se(e, this.normalizedAxes), this.layout.root.style.background = this.resolvedTheme.backgroundCssColor, this.applyCanvasSize(), this.camera = new A(), this.rightCamera = new A(), this.axis = new j(this.camera), this.rightAxis = new j(this.rightCamera), this.renderer = new O(new oe(this.layout.canvas)), this.rawLineData = new Float32Array(W * 2), this.rawLineBuffer = this.renderer.createFloatBuffer(this.rawLineData.length), this.minMaxInstanceData = new Float32Array(K * q), this.minMaxInstanceBuffer = this.renderer.createFloatBuffer(this.minMaxInstanceData.length), this.barTriangleData = new Float32Array(J * Y), this.barTriangleBuffer = this.renderer.createFloatBuffer(this.barTriangleData.length), this.gridData = new Float32Array(Z * 2), this.gridBuffer = this.renderer.createFloatBuffer(this.gridData.length), this.gridStyle = {
1678
- color: t.gridStyle?.color ?? this.resolvedTheme.gridColor,
1679
- lineWidth: t.gridStyle?.lineWidth ?? 1
1680
- }, (this.normalizedAxes.x.visible || this.normalizedAxes.y.visible || this.normalizedAxes.y2.visible) && (this.axisOverlay = new M(this.layout, this.normalizedAxes, {
1681
- color: this.resolvedTheme.axisColor,
1682
- font: this.resolvedTheme.axisFont
1683
- })), this.canvas.addEventListener("pointermove", this.handlePointerMove), this.canvas.addEventListener("pointerleave", this.handlePointerLeave), typeof ResizeObserver < "u" && (this.resizeObserver = new ResizeObserver(() => this.resize()), this.resizeObserver.observe(this.layout.plot));
1684
- for (let e of t.plugins ?? []) {
1685
- let t = e.install(this);
1686
- typeof t == "function" ? this.pluginDisposers.push(t) : t && this.pluginDisposers.push(() => t.dispose());
1687
- }
1688
- }
1689
- get canvas() {
1690
- return this.layout.canvas;
1691
- }
1692
- get rootElement() {
1693
- return this.layout.root;
1694
- }
1695
- get plotElement() {
1696
- return this.layout.plot;
1697
- }
1698
- get xAxisElement() {
1699
- return this.layout.xAxis;
1700
- }
1701
- get yAxisElement() {
1702
- return this.layout.yAxis;
1703
- }
1704
- get y2AxisElement() {
1705
- return this.layout.y2Axis;
1706
- }
1707
- get theme() {
1708
- return this.resolvedTheme;
1709
- }
1710
- getCamera(e = "left") {
1711
- return e === "right" ? this.rightCamera : this.camera;
1712
- }
1713
- dataToPlot(e, t, n = "left") {
1714
- let r = this.getCamera(n), [i, a] = r.toClip(e, t);
1715
- return r.toScreen(i, a, this.canvas.clientWidth, this.canvas.clientHeight);
1716
- }
1717
- clientToData(e, t, n = "left") {
1718
- let r = this.canvas.getBoundingClientRect();
1719
- if (r.width <= 0 || r.height <= 0) return null;
1720
- let i = e - r.left, a = t - r.top;
1721
- if (i < 0 || a < 0 || i > r.width || a > r.height) return null;
1722
- let o = this.getCamera(n).viewport;
1723
- return [o.xMin + i / r.width * (o.xMax - o.xMin), o.yMax - a / r.height * (o.yMax - o.yMin)];
1724
- }
1725
- getViewport(e = "left") {
1726
- return this.getCamera(e).viewport;
1727
- }
1728
- pan(e) {
1729
- this.camera.pan(e), this.syncRightCameraX(), this.refreshHover();
1730
- }
1731
- zoom(e) {
1732
- this.camera.zoom(e), this.syncRightCameraX(), this.refreshHover();
1733
- }
1734
- addSeries(e, t) {
1735
- if ((e.mode === "ohlc" || e.mode === "candlestick") && !e.dataset) throw TypeError("OHLC and candlestick series require an OhlcDataset.");
1736
- let n = e.dataset ?? new p(e.capacity, { overflow: e.overflow }), r = this.resolvedTheme.seriesColors, i = r[this.series.length % r.length] ?? this.resolvedTheme.seriesColors[0], a = t?.color ?? i, o = new u(n, e, {
1737
- color: a,
1738
- lineWidth: t?.lineWidth ?? 1,
1739
- pointSize: t?.pointSize ?? 4,
1740
- barWidth: t?.barWidth ?? .8,
1741
- baseline: t?.baseline ?? 0,
1742
- fillColor: t?.fillColor ?? [
1743
- a[0],
1744
- a[1],
1745
- a[2],
1746
- a[3] * .25
1747
- ],
1748
- tickWidth: t?.tickWidth ?? t?.barWidth ?? .8,
1749
- upColor: t?.upColor ?? a,
1750
- downColor: t?.downColor ?? t?.fillColor ?? [
1751
- a[0],
1752
- a[1],
1753
- a[2],
1754
- a[3] * .45
1755
- ],
1756
- wickColor: t?.wickColor ?? a
1757
- });
1758
- return this.series.push(o), this.emitSeriesChange(), o;
1759
- }
1760
- addLine(e, t) {
1761
- return this.addSeries({
1762
- ...e,
1763
- mode: "line"
1764
- }, t);
1765
- }
1766
- addArea(e, t) {
1767
- return this.addSeries({
1768
- ...e,
1769
- mode: "area"
1770
- }, t);
1771
- }
1772
- addScatter(e, t) {
1773
- return this.addSeries({
1774
- ...e,
1775
- mode: "scatter"
1776
- }, t);
1777
- }
1778
- addBar(e, t) {
1779
- return this.addSeries({
1780
- ...e,
1781
- mode: "bar"
1782
- }, t);
1783
- }
1784
- addOhlc(e, t) {
1785
- return this.addSeries({
1786
- ...e,
1787
- mode: "ohlc"
1788
- }, t);
1789
- }
1790
- addCandlestick(e, t) {
1791
- return this.addSeries({
1792
- ...e,
1793
- mode: "candlestick"
1794
- }, t);
1795
- }
1796
- removeSeries(e) {
1797
- let t = this.series.indexOf(e);
1798
- return t === -1 ? !1 : (this.series.splice(t, 1), this.emitSeriesChange(), !0);
1799
- }
1800
- setSeriesVisible(e, t) {
1801
- return this.series.includes(e) ? e.visible === t ? !0 : (e.setVisible(t), this.emitSeriesChange(), !0) : !1;
1802
- }
1803
- getSeriesState() {
1804
- return this.series.map((e, t) => ({
1805
- series: e,
1806
- index: t,
1807
- id: e.config.id,
1808
- name: e.config.name,
1809
- mode: e.config.mode,
1810
- visible: e.visible,
1811
- color: e.style.color,
1812
- yAxis: e.config.yAxis ?? "left"
1813
- }));
1814
- }
1815
- setViewport(e) {
1816
- this.camera.setViewport(e), this.rightCamera.setViewport(e), this.refreshHover();
1817
- }
1818
- setYViewport(e, t) {
1819
- this.getCamera(e).setViewport(t), this.refreshHover();
1820
- }
1821
- resize(e = globalThis.devicePixelRatio) {
1822
- let t = this.applyCanvasSize(e);
1823
- return t && this.refreshHover(), t;
1824
- }
1825
- getFrameStats(e = {
1826
- fps: 0,
1827
- frameMs: 0,
1828
- pointsRendered: 0,
1829
- drawCalls: 0,
1830
- uploadBytes: 0,
1831
- renderMode: "none"
1832
- }) {
1833
- return e.fps = this.stats.fps, e.frameMs = this.stats.frameMs, e.pointsRendered = this.stats.pointsRendered, e.drawCalls = this.stats.drawCalls, e.uploadBytes = this.stats.uploadBytes, e.renderMode = this.stats.renderMode, e;
1834
- }
1835
- getHoverState() {
1836
- return this.currentHover;
1837
- }
1838
- subscribe(e, t) {
1839
- if (e === "hover") {
1840
- let e = t;
1841
- return this.hoverSubscribers.add(e), () => this.hoverSubscribers.delete(e);
1842
- }
1843
- if (e === "themechange") {
1844
- let e = t;
1845
- return this.themeSubscribers.add(e), () => this.themeSubscribers.delete(e);
1846
- }
1847
- let n = t;
1848
- return this.seriesSubscribers.add(n), () => this.seriesSubscribers.delete(n);
1849
- }
1850
- setTheme(e) {
1851
- this.resolvedTheme = P(e, this.layout.root), this.applyTheme(), this.emitThemeChange(), this.refreshHover();
1852
- }
1853
- setGridVisible(e) {
1854
- this._gridVisible = e;
1855
- }
1856
- getGridVisible() {
1857
- return this._gridVisible;
1858
- }
1859
- setAxes(e) {
1860
- this.normalizedAxes = $(e), this.layout.update(this.normalizedAxes), this.axisOverlay?.dispose(), this.axisOverlay = null, (this.normalizedAxes.x.visible || this.normalizedAxes.y.visible || this.normalizedAxes.y2.visible) && (this.axisOverlay = new M(this.layout, this.normalizedAxes, {
1861
- color: this.resolvedTheme.axisColor,
1862
- font: this.resolvedTheme.axisFont
1863
- })), this.resize(), this.refreshHover();
1864
- }
1865
- pick(e, t, n = {}) {
1866
- let r = this.canvas.getBoundingClientRect();
1867
- if (r.width <= 0 || r.height <= 0) return null;
1868
- let i = e - r.left, a = t - r.top;
1869
- if (i < 0 || a < 0 || i > r.width || a > r.height) return null;
1870
- let o = this.camera.viewport, s = o.xMin + i / r.width * (o.xMax - o.xMin), c = o.yMax - a / r.height * (o.yMax - o.yMin), l = n.mode ?? this.options.hover?.mode ?? "nearest-x", u = n.group ?? this.options.hover?.group ?? "x", d = n.maxDistancePx ?? this.options.hover?.maxDistancePx ?? Infinity, f = l === "nearest-point" ? this.findNearestPointCandidate(s, a, r.width, r.height, d) : this.findNearestXCandidate(s, r.width, d);
1871
- if (!f) return null;
1872
- let p = f.sample.x;
1873
- return {
1874
- clientX: e,
1875
- clientY: t,
1876
- plotX: i,
1877
- plotY: a,
1878
- dataX: s,
1879
- dataY: c,
1880
- anchorX: p,
1881
- mode: l,
1882
- group: u,
1883
- maxDistancePx: d,
1884
- items: u === "none" ? [this.createPickItem(f.sample, f.series, f.seriesIndex, e, t, r)] : this.collectPickItems(p, e, t, r)
1885
- };
1886
- }
1887
- async screenshot(e = {}) {
1888
- this.render();
1889
- let t = this.layout.root.getBoundingClientRect(), n = this.layout.plot.getBoundingClientRect(), r = Number.isFinite(e.dpr) ? Math.max(1, e.dpr) : Math.max(1, globalThis.devicePixelRatio || 1), i = Math.max(1, Math.round(t.width * r)), a = Math.max(1, Math.round(t.height * r)), o = document.createElement("canvas");
1890
- o.width = i, o.height = a;
1891
- let s = o.getContext("2d");
1892
- if (!s) throw Error("Unable to create a 2D canvas context for screenshot export.");
1893
- return s.fillStyle = e.background ?? I(this.resolvedTheme.backgroundColor), s.fillRect(0, 0, i, a), s.drawImage(this.canvas, (n.left - t.left) * r, (n.top - t.top) * r, n.width * r, n.height * r), this.drawDomTextForScreenshot(s, t, r), new Promise((t, n) => {
1894
- o.toBlob((e) => e ? t(e) : n(/* @__PURE__ */ Error("Unable to encode chart screenshot.")), e.type ?? "image/png", e.quality);
1895
- });
1896
- }
1897
- start() {
1898
- let e = () => {
1899
- this._rafId = requestAnimationFrame(e), this.render();
1900
- };
1901
- this._rafId = requestAnimationFrame(e);
1902
- }
1903
- stop() {
1904
- cancelAnimationFrame(this._rafId);
1905
- }
1906
- render() {
1907
- let e = performance.now();
1908
- this.lastFrameAt > 0 && (this.stats.fps = 1e3 / (e - this.lastFrameAt)), this.lastFrameAt = e, this.stats.pointsRendered = 0, this.stats.drawCalls = 0, this.stats.uploadBytes = 0, this.stats.renderMode = "none", this.options.viewportPolicy?.beforeRender?.(this.camera), this.syncRightCameraX();
1909
- let [t, n, r, i] = this.resolvedTheme.backgroundColor;
1910
- this.renderer.viewport(0, 0, this.canvas.width, this.canvas.height), this.renderer.clear(t, n, r, i);
1911
- let a = this.camera.viewport;
1912
- if (this.currentXOrigin = a.xMin, this.renderer.setXOrigin(this.currentXOrigin), this._gridVisible) {
1913
- let e = this.writeGridVertices(a);
1914
- e > 0 && (this.uploadGridData(e), this.renderer.drawClipLines(this.gridBuffer, e, this.gridStyle), this.stats.drawCalls++);
1915
- }
1916
- for (let e of this.series) e.visible && (e.rebuildPyramid(), this.drawSeries(e));
1917
- this.axisOverlay?.update(this.camera, this.axis, this.rightCamera, this.rightAxis), this.stats.frameMs = performance.now() - e, this.refreshHover();
1918
- }
1919
- dispose() {
1920
- this.stop(), this.resizeObserver?.disconnect(), this.canvas.removeEventListener("pointermove", this.handlePointerMove), this.canvas.removeEventListener("pointerleave", this.handlePointerLeave);
1921
- for (let e of this.pluginDisposers.splice(0)) e();
1922
- this.axisOverlay?.dispose(), this.renderer.dispose(), this.layout.dispose();
1923
- }
1924
- applyTheme() {
1925
- this.layout.root.style.background = this.resolvedTheme.backgroundCssColor, this.options.gridStyle?.color === void 0 && (this.gridStyle = {
1926
- ...this.gridStyle,
1927
- color: this.resolvedTheme.gridColor
1928
- }), this.axisOverlay?.setOptions({
1929
- color: this.resolvedTheme.axisColor,
1930
- font: this.resolvedTheme.axisFont
1931
- });
1932
- }
1933
- applyCanvasSize(e = globalThis.devicePixelRatio) {
1934
- let t = Number.isFinite(e) ? Math.max(1, e) : 1, n = Math.max(1, Math.floor(this.canvas.clientWidth * t)), r = Math.max(1, Math.floor(this.canvas.clientHeight * t));
1935
- return this.canvas.width === n && this.canvas.height === r ? !1 : (this.canvas.width = n, this.canvas.height = r, !0);
1936
- }
1937
- cameraForSeries(e) {
1938
- return e.config.yAxis === "right" ? this.rightCamera : this.camera;
1939
- }
1940
- syncRightCameraX() {
1941
- this.rightCamera.setViewport({
1942
- xMin: this.camera.xMin,
1943
- xMax: this.camera.xMax
1944
- });
1945
- }
1946
- drawSeries(e) {
1947
- let t = this.cameraForSeries(e), n = t.viewport;
1948
- switch (e.config.mode) {
1949
- case "area":
1950
- this.drawAreaSeries(e, n, t);
1951
- return;
1952
- case "bar":
1953
- this.drawBarSeries(e, n, t);
1954
- return;
1955
- case "ohlc":
1956
- this.drawOhlcSeries(e, n, t);
1957
- return;
1958
- case "candlestick":
1959
- this.drawCandlestickSeries(e, n, t);
1960
- return;
1961
- case "scatter":
1962
- this.drawScatterSeries(e, n, t);
1963
- return;
1964
- default: this.drawLineSeries(e, n, t);
1965
- }
1966
- }
1967
- drawLineSeries(e, t, n) {
1968
- let r = e.visibleSampleCount(t), i = e.hasLOD && r > W - 2;
1969
- if (i && this.renderer.supportsInstancedSegments) {
1970
- let r = e.copyMinMaxInstanced(t, this.minMaxInstanceData, this.maxMinMaxSegments(), this.currentXOrigin);
1971
- if (r <= 0) return;
1972
- this.uploadMinMaxInstanceData(r), this.renderer.drawMinMaxSegmentsInstanced(this.minMaxInstanceBuffer, r, e.style, n), this.recordDraw("minmax", r * 2);
1973
- return;
1974
- }
1975
- if (i) {
1976
- let r = e.copyMinMaxVisible(t, this.rawLineData, this.maxMinMaxSegments(), this.currentXOrigin);
1977
- if (r < 2) return;
1978
- this.uploadRawLineData(r), this.renderer.drawMinMaxSegments(this.rawLineBuffer, r, e.style, n), this.recordDraw("minmax", r);
1979
- return;
1980
- }
1981
- let a = e.copyRawVisibleClipSpace(t, this.rawLineData, W);
1982
- a < 2 || (this.uploadRawLineData(a), this.renderer.drawClipLineStrip(this.rawLineBuffer, a, e.style), this.recordDraw("raw", a));
1983
- }
1984
- drawAreaSeries(e, t, n) {
1985
- let r = e.visibleIndexRange(t, 1);
1986
- if (r.end - r.start < 2) return;
1987
- let i = e.style.baseline ?? 0;
1988
- if (r.end - r.start > G) {
1989
- let r = e.copyAreaVisible(t, this.rawLineData, G, i, this.currentXOrigin);
1990
- r >= 4 && (this.uploadRawLineData(r), this.renderer.drawAreaStrip(this.rawLineBuffer, r, e.style, n), this.recordDraw("area", r));
1991
- let a = e.copyRawVisible(t, this.rawLineData, G, this.currentXOrigin);
1992
- a >= 2 && (this.uploadRawLineData(a), this.renderer.drawLineStrip(this.rawLineBuffer, a, e.style, n), this.recordDraw("area", a));
1993
- return;
1994
- }
1995
- for (let t = r.start; t < r.end;) {
1996
- let a = e.copyAreaRange(t, r.end, this.rawLineData, G, i, this.currentXOrigin);
1997
- if (a < 4) break;
1998
- this.uploadRawLineData(a), this.renderer.drawAreaStrip(this.rawLineBuffer, a, e.style, n), this.recordDraw("area", a), t += Math.max(1, (a >> 1) - 1);
1999
- }
2000
- for (let t = r.start; t < r.end;) {
2001
- let i = e.copyRawRange(t, r.end, this.rawLineData, G, this.currentXOrigin);
2002
- if (i < 2) break;
2003
- this.uploadRawLineData(i), this.renderer.drawLineStrip(this.rawLineBuffer, i, e.style, n), this.recordDraw("area", i), t += Math.max(1, i - 1);
2004
- }
2005
- }
2006
- drawOhlcSeries(e, t, n) {
2007
- let r = e.visibleIndexRange(t), i = Math.floor(this.rawLineData.length / fe);
2008
- for (let t = r.start; t < r.end;) {
2009
- let a = e.copyOhlcRange(t, r.end, this.rawLineData, i, e.style.tickWidth ?? e.style.barWidth ?? .8, this.currentXOrigin);
2010
- if (a <= 0) break;
2011
- let o = a * 6;
2012
- this.uploadRawLineData(o), this.renderer.drawLines(this.rawLineBuffer, o, e.style, n), this.recordDraw("raw", o), t += a;
2013
- }
2014
- }
2015
- drawCandlestickSeries(e, t, n) {
2016
- let r = e.visibleIndexRange(t, 1), i = Math.min(Math.floor(this.rawLineData.length / X), this.maxBarTriangleBars()), a = {
2017
- ...e.style,
2018
- color: e.style.wickColor ?? e.style.color
2019
- }, o = {
2020
- ...e.style,
2021
- color: e.style.upColor ?? e.style.color
2022
- }, s = {
2023
- ...e.style,
2024
- color: e.style.downColor ?? e.style.fillColor ?? e.style.color
2025
- };
2026
- for (let t = r.start; t < r.end;) {
2027
- let c = e.copyOhlcTuplesRange(t, r.end, this.rawLineData, i, this.currentXOrigin);
2028
- if (c <= 0) break;
2029
- let l = this.writeCandlestickWicks(c);
2030
- l > 0 && (this.uploadBarTriangleData(l), this.renderer.drawLines(this.barTriangleBuffer, l, a, n), this.recordDraw("raw", l));
2031
- let u = e.style.barWidth ?? e.style.tickWidth ?? .8;
2032
- this.drawCandlestickBodies(c, u, "up", o, n), this.drawCandlestickBodies(c, u, "down", s, n), t += c;
2033
- }
2034
- }
2035
- drawScatterSeries(e, t, n) {
2036
- if (e.visibleSampleCount(t) > W) {
2037
- let r = e.copyRawVisible(t, this.rawLineData, W, this.currentXOrigin);
2038
- if (r <= 0) return;
2039
- this.uploadRawLineData(r), this.renderer.drawPoints(this.rawLineBuffer, r, e.style, n, this.canvas.width, this.canvas.height), this.recordDraw("points", r);
2040
- return;
2041
- }
2042
- let r = e.visibleIndexRange(t);
2043
- for (let t = r.start; t < r.end;) {
2044
- let i = e.copyRawRange(t, r.end, this.rawLineData, W, this.currentXOrigin);
2045
- if (i <= 0) break;
2046
- this.uploadRawLineData(i), this.renderer.drawPoints(this.rawLineBuffer, i, e.style, n, this.canvas.width, this.canvas.height), this.recordDraw("points", i), t += i;
2047
- }
2048
- }
2049
- drawBarSeries(e, t, n) {
2050
- let r = e.visibleSampleCount(t), i = this.maxRawBarInstances();
2051
- if (e.hasLOD && r > i) {
2052
- let r = e.copyMinMaxInstanced(t, this.minMaxInstanceData, this.maxBarTriangleBars(), this.currentXOrigin);
2053
- if (r <= 0) return;
2054
- this.includeBaselineInBarRanges(r, e.style.baseline ?? 0);
2055
- let i = this.writeBarBucketTriangles(r, t);
2056
- this.drawBarTriangles(i, e.style, n);
2057
- return;
2058
- }
2059
- let a = e.visibleIndexRange(t, 1), o = e.copyRawRange(a.start, a.end, this.rawLineData, i, this.currentXOrigin);
2060
- if (o <= 0) return;
2061
- if (this.renderer.supportsInstancedBars) {
2062
- this.uploadRawLineData(o), this.renderer.drawBarsInstanced(this.rawLineBuffer, o, e.style, n), this.recordDraw("bars", o);
2063
- return;
2064
- }
2065
- let s = this.writeBarTriangles(o, e.style.baseline ?? 0, e.style.barWidth ?? .8);
2066
- this.drawBarTriangles(s, e.style, n);
2067
- }
2068
- uploadRawLineData(e) {
2069
- this.uploadFloatData(this.rawLineBuffer, this.rawLineData, e * 2);
2070
- }
2071
- uploadMinMaxInstanceData(e) {
2072
- this.uploadFloatData(this.minMaxInstanceBuffer, this.minMaxInstanceData, e * q);
2073
- }
2074
- uploadBarTriangleData(e) {
2075
- this.uploadFloatData(this.barTriangleBuffer, this.barTriangleData, e * 2);
2076
- }
2077
- uploadGridData(e) {
2078
- this.uploadFloatData(this.gridBuffer, this.gridData, e * 2);
2079
- }
2080
- uploadFloatData(e, t, n) {
2081
- let r = Math.max(0, Math.min(n, t.length));
2082
- this.renderer.updateFloatBuffer(e, t, r), this.stats.uploadBytes += r * Float32Array.BYTES_PER_ELEMENT;
2083
- }
2084
- includeBaselineInBarRanges(e, t) {
2085
- for (let n = 0; n < e; n++) {
2086
- let e = n * q, r = this.minMaxInstanceData[e + 1], i = this.minMaxInstanceData[e + 2];
2087
- this.minMaxInstanceData[e + 1] = Math.min(t, r), this.minMaxInstanceData[e + 2] = Math.max(t, i);
2088
- }
2089
- }
2090
- writeBarTriangles(e, t, n) {
2091
- let r = Math.min(e, this.maxBarTriangleBars());
2092
- for (let e = 0; e < r; e++) {
2093
- let r = this.rawLineData[e * 2], i = this.rawLineData[e * 2 + 1];
2094
- this.writeBarTriangle(e, r - n * .5, r + n * .5, t, i);
2095
- }
2096
- return r * 6;
2097
- }
2098
- writeBarBucketTriangles(e, t) {
2099
- let n = Math.min(e, this.maxBarTriangleBars());
2100
- for (let e = 0; e < n; e++) {
2101
- let r = this.minMaxInstanceData[e * 3 + 1], i = this.minMaxInstanceData[e * 3 + 2], [a, o] = this.barBucketBounds(e, n, t);
2102
- this.writeBarTriangle(e, a, o, r, i);
2103
- }
2104
- return n * 6;
2105
- }
2106
- barBucketBounds(e, t, n) {
2107
- let r = this.minMaxInstanceData[e * 3], i = n.xMin - this.currentXOrigin, a = n.xMax - this.currentXOrigin, o = a - i;
2108
- if (t <= 1) {
2109
- let e = Math.max(0, o * .5);
2110
- return [Math.max(i, r - e), Math.min(a, r + e)];
2111
- }
2112
- let s = e > 0 ? this.minMaxInstanceData[(e - 1) * 3] : NaN, c = e + 1 < t ? this.minMaxInstanceData[(e + 1) * 3] : NaN, l = e === 0 ? r - (c - r) * .5 : (s + r) * .5, u = e + 1 === t ? r + (r - s) * .5 : (r + c) * .5;
2113
- if (!Number.isFinite(l) || !Number.isFinite(u) || u <= l) {
2114
- let n = o / Math.max(1, t);
2115
- l = i + e * n, u = e + 1 === t ? a : l + n;
2116
- }
2117
- return [Math.max(i, l), Math.min(a, u)];
2118
- }
2119
- writeCandlestickWicks(e) {
2120
- for (let t = 0; t < e; t++) {
2121
- let e = t * X, n = t * 4, r = this.rawLineData[e], i = this.rawLineData[e + 2], a = this.rawLineData[e + 3];
2122
- this.barTriangleData[n] = r, this.barTriangleData[n + 1] = a, this.barTriangleData[n + 2] = r, this.barTriangleData[n + 3] = i;
2123
- }
2124
- return e * 2;
2125
- }
2126
- drawCandlestickBodies(e, t, n, r, i) {
2127
- let a = t * .5, o = 0;
2128
- for (let t = 0; t < e && o < this.maxBarTriangleBars(); t++) {
2129
- let e = t * X, r = this.rawLineData[e], i = this.rawLineData[e + 1], s = this.rawLineData[e + 4];
2130
- n === "up" == s >= i && (this.writeBarTriangle(o, r - a, r + a, Math.min(i, s), Math.max(i, s)), o++);
2131
- }
2132
- this.drawBarTriangles(o * 6, r, i);
2133
- }
2134
- writeBarTriangle(e, t, n, r, i) {
2135
- let a = e * Y;
2136
- this.barTriangleData[a] = t, this.barTriangleData[a + 1] = r, this.barTriangleData[a + 2] = n, this.barTriangleData[a + 3] = r, this.barTriangleData[a + 4] = t, this.barTriangleData[a + 5] = i, this.barTriangleData[a + 6] = t, this.barTriangleData[a + 7] = i, this.barTriangleData[a + 8] = n, this.barTriangleData[a + 9] = r, this.barTriangleData[a + 10] = n, this.barTriangleData[a + 11] = i;
2137
- }
2138
- drawBarTriangles(e, t, n, r = "bars") {
2139
- e <= 0 || (this.uploadBarTriangleData(e), this.renderer.drawBarTriangles(this.barTriangleBuffer, e, t, n), this.recordDraw(r, e));
2140
- }
2141
- recordDraw(e, t, n = 1) {
2142
- this.recordRenderMode(e), this.stats.pointsRendered += t, this.stats.drawCalls += n;
2143
- }
2144
- findNearestXCandidate(e, t, n) {
2145
- let r = null, i = Infinity;
2146
- for (let n = 0; n < this.series.length; n++) {
2147
- let a = this.series[n];
2148
- if (!a.visible) continue;
2149
- let o = this.cameraForSeries(a).viewport, s = t / (o.xMax - o.xMin), c = a.nearestSampleByX(e, o);
2150
- if (!c) continue;
2151
- let l = Math.abs(c.x - e) * s;
2152
- l < i && (r = {
2153
- sample: c,
2154
- series: a,
2155
- seriesIndex: n
2156
- }, i = l);
2157
- }
2158
- return r && i <= n ? r : null;
2159
- }
2160
- findNearestPointCandidate(e, t, n, r, i) {
2161
- let a = null;
2162
- for (let o = 0; o < this.series.length; o++) {
2163
- let s = this.series[o];
2164
- if (!s.visible) continue;
2165
- let c = this.cameraForSeries(s).viewport, l = c.yMax - t / r * (c.yMax - c.yMin), u = s.nearestSampleByPoint(e, l, c, n, r, i);
2166
- u && (!a || (u.distancePx ?? Infinity) < (a.sample.distancePx ?? Infinity)) && (a = {
2167
- sample: u,
2168
- series: s,
2169
- seriesIndex: o
2170
- });
2171
- }
2172
- return a && (a.sample.distancePx ?? Infinity) <= i ? a : null;
2173
- }
2174
- collectPickItems(e, t, n, r) {
2175
- let i = [];
2176
- for (let a = 0; a < this.series.length; a++) {
2177
- let o = this.series[a];
2178
- if (!o.visible) continue;
2179
- let s = o.nearestSampleByX(e, this.cameraForSeries(o).viewport);
2180
- s && i.push(this.createPickItem(s, o, a, t, n, r));
2181
- }
2182
- return i;
2183
- }
2184
- createPickItem(e, t, n, r, i, a) {
2185
- let o = this.cameraForSeries(t), [s, c] = o.toClip(e.x, e.y), [l, u] = o.toScreen(s, c, a.width, a.height), d = a.left + l, f = a.top + u, p = d - r, m = f - i;
2186
- return {
2187
- ...e,
2188
- distancePx: Math.hypot(p, m),
2189
- series: t,
2190
- seriesIndex: n,
2191
- id: t.config.id,
2192
- name: t.config.name,
2193
- mode: t.config.mode,
2194
- plotX: l,
2195
- plotY: u,
2196
- clientX: d,
2197
- clientY: f
2198
- };
2199
- }
2200
- refreshHover() {
2201
- this.pointerInPlot && this.emitHover(this.pick(this.lastPointerClientX, this.lastPointerClientY));
2202
- }
2203
- emitHover(e) {
2204
- this.currentHover = e;
2205
- for (let t of this.hoverSubscribers) t(e);
2206
- }
2207
- emitSeriesChange() {
2208
- for (let e of this.seriesSubscribers) e();
2209
- this.refreshHover();
2210
- }
2211
- emitThemeChange() {
2212
- for (let e of this.themeSubscribers) e();
2213
- }
2214
- drawDomTextForScreenshot(e, t, n) {
2215
- let r = this.layout.root.querySelectorAll("div");
2216
- for (let i of r) {
2217
- let r = i.textContent;
2218
- if (!r || i.children.length > 0) continue;
2219
- let a = getComputedStyle(i);
2220
- if (a.display === "none" || a.visibility === "hidden" || a.opacity === "0") continue;
2221
- let o = i.getBoundingClientRect();
2222
- o.width <= 0 || o.height <= 0 || (e.save(), e.scale(n, n), e.font = a.font, e.fillStyle = a.color, e.textBaseline = "top", e.textAlign = "left", e.fillText(r, o.left - t.left, o.top - t.top), e.restore());
2223
- }
2224
- }
2225
- maxMinMaxSegments() {
2226
- return Math.min(this.canvas.width, K);
2227
- }
2228
- maxBarTriangleBars() {
2229
- return Math.min(J, W);
2230
- }
2231
- maxRawBarInstances() {
2232
- return this.renderer.supportsInstancedBars ? W : this.maxBarTriangleBars();
2233
- }
2234
- writeGridVertices(e) {
2235
- let t = Math.max(1, this.canvas.clientWidth), n = Math.max(1, this.canvas.clientHeight);
2236
- this.axis.getXTickValues(t, 12, this.xTicks), this.axis.getYTickValues(n, 8, this.yTicks);
2237
- let r = 0;
2238
- for (let t of this.xTicks) {
2239
- if (r + 2 > Z) return r;
2240
- this.gridData[r * 2] = this.xToClip(t, e), this.gridData[r * 2 + 1] = -1, r++, this.gridData[r * 2] = this.xToClip(t, e), this.gridData[r * 2 + 1] = 1, r++;
2241
- }
2242
- for (let t of this.yTicks) {
2243
- if (r + 2 > Z) return r;
2244
- this.gridData[r * 2] = -1, this.gridData[r * 2 + 1] = this.yToClip(t, e), r++, this.gridData[r * 2] = 1, this.gridData[r * 2 + 1] = this.yToClip(t, e), r++;
2245
- }
2246
- return r;
2247
- }
2248
- xToClip(e, t) {
2249
- return (e - t.xMin) / (t.xMax - t.xMin) * 2 - 1;
2250
- }
2251
- yToClip(e, t) {
2252
- return (e - t.yMin) / (t.yMax - t.yMin) * 2 - 1;
2253
- }
2254
- recordRenderMode(e) {
2255
- this.stats.renderMode === "none" ? this.stats.renderMode = e : this.stats.renderMode !== e && (this.stats.renderMode = "mixed");
2256
- }
2257
- }, me = class {
225
+ }, d = class {
2258
226
  xData;
2259
227
  yData;
2260
228
  constructor(e, t) {
@@ -2276,15 +244,15 @@ var pe = class {
2276
244
  return this.assertValidIndex(e), this.yData[e];
2277
245
  }
2278
246
  lowerBoundX(e) {
2279
- return d(this.length, (e) => this.xData[e], e);
247
+ return a(this.length, (e) => this.xData[e], e);
2280
248
  }
2281
249
  upperBoundX(e) {
2282
- return f(this.length, (e) => this.xData[e], e);
250
+ return s(this.length, (e) => this.xData[e], e);
2283
251
  }
2284
252
  assertValidIndex(e) {
2285
253
  if (!Number.isInteger(e) || e < 0 || e >= this.length) throw RangeError(`StaticDataset index out of range: ${e}`);
2286
254
  }
2287
- }, he = class {
255
+ }, f = class {
2288
256
  length;
2289
257
  xs;
2290
258
  opens;
@@ -2319,15 +287,15 @@ var pe = class {
2319
287
  return this.assertValidIndex(e), this.closes[e];
2320
288
  }
2321
289
  lowerBoundX(e) {
2322
- return d(this.length, (e) => this.xs[e], e);
290
+ return a(this.length, (e) => this.xs[e], e);
2323
291
  }
2324
292
  upperBoundX(e) {
2325
- return f(this.length, (e) => this.xs[e], e);
293
+ return s(this.length, (e) => this.xs[e], e);
2326
294
  }
2327
295
  assertValidIndex(e) {
2328
296
  if (!Number.isInteger(e) || e < 0 || e >= this.length) throw RangeError(`StaticOhlcDataset index out of range: ${e}`);
2329
297
  }
2330
- }, ge = class {
298
+ }, p = class {
2331
299
  capacity;
2332
300
  overflow;
2333
301
  xData;
@@ -2392,10 +360,10 @@ var pe = class {
2392
360
  return this.assertValidIndex(e), this.closeData[this.logicalToPhysical(e)];
2393
361
  }
2394
362
  lowerBoundX(e) {
2395
- return d(this._length, (e) => this.getX(e), e);
363
+ return a(this._length, (e) => this.getX(e), e);
2396
364
  }
2397
365
  upperBoundX(e) {
2398
- return f(this._length, (e) => this.getX(e), e);
366
+ return s(this._length, (e) => this.getX(e), e);
2399
367
  }
2400
368
  logicalToPhysical(e) {
2401
369
  return (this._head - this._length + e + this.capacity) % this.capacity;
@@ -2405,6 +373,6 @@ var pe = class {
2405
373
  }
2406
374
  };
2407
375
  //#endregion
2408
- export { j as AxisController, A as Camera2D, pe as Chart, N as DEFAULT_CHART_THEME, n as MinMaxPyramid, ge as OhlcRingBuffer, p as RingBuffer, u as SeriesStore, me as StaticDataset, he as StaticOhlcDataset };
376
+ export { o as AxisController, n as Camera2D, c as Chart, i as DEFAULT_CHART_THEME, r as MinMaxPyramid, p as OhlcRingBuffer, e as RingBuffer, t as SeriesStore, d as StaticDataset, f as StaticOhlcDataset, u as UniformRingBuffer };
2409
377
 
2410
378
  //# sourceMappingURL=index.js.map