velo-plot 2.0.0 → 2.20.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 (65) hide show
  1. package/dist/{ChartCore-BhQ4j7f5.js → ChartCore-ivzLqxVb.js} +419 -393
  2. package/dist/ChartCore-ivzLqxVb.js.map +1 -0
  3. package/dist/{SciPlot-GJvw7GJo.js → SciPlot-CEU4ApgD.js} +2 -2
  4. package/dist/{SciPlot-GJvw7GJo.js.map → SciPlot-CEU4ApgD.js.map} +1 -1
  5. package/dist/{axisFormat-SPX-CD5s.js → axisFormat-CzumxpCL.js} +3 -3
  6. package/dist/axisFormat-CzumxpCL.js.map +1 -0
  7. package/dist/core/chart/ChartAxisManager.d.ts +2 -0
  8. package/dist/core/chart/ChartCore.d.ts +15 -0
  9. package/dist/core/chart/ChartPluginBridge.d.ts +1 -0
  10. package/dist/core/chart/ChartRenderLoop.d.ts +2 -0
  11. package/dist/core/chart/ChartStateManager.d.ts +2 -0
  12. package/dist/core/chart/types.d.ts +5 -0
  13. package/dist/core/sync/index.d.ts +0 -1
  14. package/dist/{createStackedChart-DJSmqerD.js → createStackedChart-DxNW0VkF.js} +178 -179
  15. package/dist/createStackedChart-DxNW0VkF.js.map +1 -0
  16. package/dist/{index-D7dTq6VB.js → index-BBpJwOct.js} +17 -19
  17. package/dist/index-BBpJwOct.js.map +1 -0
  18. package/dist/{index-CUGS98p4.js → index-CaXWSOTk.js} +3 -6
  19. package/dist/index-CaXWSOTk.js.map +1 -0
  20. package/dist/{index-CWipqOLP.js → index-qunX30Xu.js} +2 -2
  21. package/dist/{index-CWipqOLP.js.map → index-qunX30Xu.js.map} +1 -1
  22. package/dist/{index.core-fpZ1dYN0.js → index.core-COREBDNq.js} +25 -24
  23. package/dist/{index.core-fpZ1dYN0.js.map → index.core-COREBDNq.js.map} +1 -1
  24. package/dist/index.d.ts +1 -1
  25. package/dist/{mockDatafeed-Cdg5hKEo.js → mockDatafeed-927foCM4.js} +2 -2
  26. package/dist/mockDatafeed-927foCM4.js.map +1 -0
  27. package/dist/plugins/analysis/contours.d.ts +31 -0
  28. package/dist/plugins/analysis.js +494 -407
  29. package/dist/plugins/analysis.js.map +1 -1
  30. package/dist/plugins/broken-axis.js +170 -181
  31. package/dist/plugins/broken-axis.js.map +1 -1
  32. package/dist/plugins/forecasting/algorithms.d.ts +7 -2
  33. package/dist/plugins/forecasting/types.d.ts +13 -3
  34. package/dist/plugins/forecasting.js +355 -175
  35. package/dist/plugins/forecasting.js.map +1 -1
  36. package/dist/plugins/latex/symbols.d.ts +50 -0
  37. package/dist/plugins/latex/types.d.ts +13 -1
  38. package/dist/plugins/latex.js +351 -331
  39. package/dist/plugins/latex.js.map +1 -1
  40. package/dist/plugins/ml-integration/native-algorithms.d.ts +24 -4
  41. package/dist/plugins/ml-integration/types.d.ts +19 -0
  42. package/dist/plugins/ml-integration.js +191 -140
  43. package/dist/plugins/ml-integration.js.map +1 -1
  44. package/dist/plugins/pattern-recognition/types.d.ts +28 -1
  45. package/dist/plugins/pattern-recognition.js +416 -343
  46. package/dist/plugins/pattern-recognition.js.map +1 -1
  47. package/dist/plugins/snapshot.js +36 -36
  48. package/dist/plugins/snapshot.js.map +1 -1
  49. package/dist/plugins/sync.js +1 -1
  50. package/dist/plugins/tools.js +1 -1
  51. package/dist/plugins/virtualization.js +1 -1
  52. package/dist/react.js +2 -2
  53. package/dist/symbols-DT0eLlpW.js +568 -0
  54. package/dist/symbols-DT0eLlpW.js.map +1 -0
  55. package/dist/trading.js +5 -5
  56. package/dist/velo-plot.full.js +184 -182
  57. package/dist/velo-plot.js +3 -3
  58. package/dist/workers/indicatorsAsync.d.ts +24 -0
  59. package/package.json +1 -1
  60. package/dist/ChartCore-BhQ4j7f5.js.map +0 -1
  61. package/dist/axisFormat-SPX-CD5s.js.map +0 -1
  62. package/dist/createStackedChart-DJSmqerD.js.map +0 -1
  63. package/dist/index-CUGS98p4.js.map +0 -1
  64. package/dist/index-D7dTq6VB.js.map +0 -1
  65. package/dist/mockDatafeed-Cdg5hKEo.js.map +0 -1
@@ -1,128 +1,128 @@
1
- var v = Object.defineProperty;
2
- var z = (d, e, o) => e in d ? v(d, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : d[e] = o;
3
- var R = (d, e, o) => z(d, typeof e != "symbol" ? e + "" : e, o);
4
- class w {
5
- constructor(e, o) {
6
- R(this, "domain", [0, 1]);
7
- R(this, "range", [0, 100]);
8
- R(this, "type", "linear");
1
+ var A = Object.defineProperty;
2
+ var T = (d, e, r) => e in d ? A(d, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : d[e] = r;
3
+ var x = (d, e, r) => T(d, typeof e != "symbol" ? e + "" : e, r);
4
+ class v {
5
+ constructor(e, r) {
6
+ x(this, "domain", [0, 1]);
7
+ x(this, "range", [0, 100]);
8
+ x(this, "type", "linear");
9
9
  // Compatible with linear for renderer selection
10
- R(this, "underlying");
11
- R(this, "sortedBreaks", []);
12
- R(this, "visibleRanges", []);
13
- R(this, "availableVisualRatio", 1);
14
- this.breaks = o, this.underlying = e, this.domain = [...e.domain], this.range = [...e.range], this.refresh();
10
+ x(this, "underlying");
11
+ x(this, "sortedBreaks", []);
12
+ x(this, "visibleRanges", []);
13
+ x(this, "availableVisualRatio", 1);
14
+ this.breaks = r, this.underlying = e, this.domain = [...e.domain], this.range = [...e.range], this.refresh();
15
15
  }
16
- setDomain(e, o) {
17
- this.domain = [e, o], this.underlying.setDomain(e, o), this.refresh();
16
+ setDomain(e, r) {
17
+ this.domain = [e, r], this.underlying.setDomain(e, r), this.refresh();
18
18
  }
19
- setRange(e, o) {
20
- this.range = [e, o], this.underlying.setRange(e, o), this.refresh();
19
+ setRange(e, r) {
20
+ this.range = [e, r], this.underlying.setRange(e, r), this.refresh();
21
21
  }
22
22
  updateBreaks(e) {
23
23
  this.breaks = e, this.refresh();
24
24
  }
25
25
  refresh() {
26
- const [e, o] = this.domain;
27
- this.sortedBreaks = this.breaks.filter((r) => r.start < o && r.end > e).map((r) => ({
28
- ...r,
29
- start: Math.max(e, r.start),
30
- end: Math.min(o, r.end),
31
- visualRatio: r.visualRatio ?? 0.02
32
- })).sort((r, f) => r.start - f.start);
33
- const n = [];
34
- let i = e;
35
- for (const r of this.sortedBreaks)
36
- r.start > i && n.push({ start: i, end: r.start }), i = r.end;
37
- i < o && n.push({ start: i, end: o });
38
- const h = n.reduce((r, f) => r + (f.end - f.start), 0) || 1e-10, c = this.sortedBreaks.reduce((r, f) => r + (f.visualRatio || 0.02), 0);
39
- this.availableVisualRatio = Math.max(0.1, 1 - c);
40
- let p = 0;
41
- this.visibleRanges = n.map((r) => {
42
- const f = r.end - r.start, S = f / h * this.availableVisualRatio, t = {
43
- start: r.start,
44
- end: r.end,
45
- pixelOffset: p,
46
- pixelScale: S / f
47
- }, s = this.sortedBreaks.find((a) => Math.abs(a.start - r.end) < 1e-10);
48
- return p += S + ((s == null ? void 0 : s.visualRatio) ?? 0), t;
26
+ const [e, r] = this.domain;
27
+ this.sortedBreaks = this.breaks.filter((i) => i.start < r && i.end > e).map((i) => ({
28
+ ...i,
29
+ start: Math.max(e, i.start),
30
+ end: Math.min(r, i.end),
31
+ visualRatio: i.visualRatio ?? 0.02
32
+ })).sort((i, f) => i.start - f.start);
33
+ const l = [];
34
+ let n = e;
35
+ for (const i of this.sortedBreaks)
36
+ i.start > n && l.push({ start: n, end: i.start }), n = i.end;
37
+ n < r && l.push({ start: n, end: r });
38
+ const p = l.reduce((i, f) => i + (f.end - f.start), 0) || 1e-10, u = this.sortedBreaks.reduce((i, f) => i + (f.visualRatio || 0.02), 0);
39
+ this.availableVisualRatio = Math.max(0.1, 1 - u);
40
+ let c = 0;
41
+ this.visibleRanges = l.map((i) => {
42
+ const f = i.end - i.start, b = f / p * this.availableVisualRatio, R = {
43
+ start: i.start,
44
+ end: i.end,
45
+ pixelOffset: c,
46
+ pixelScale: b / f
47
+ }, t = this.sortedBreaks.find((s) => Math.abs(s.start - i.end) < 1e-10);
48
+ return c += b + ((t == null ? void 0 : t.visualRatio) ?? 0), R;
49
49
  });
50
50
  }
51
51
  transform(e) {
52
- const [o, n] = this.domain, [i, h] = this.range, c = h < i;
53
- let p = 0;
54
- if (e <= o) p = 0;
55
- else if (e >= n) p = 1;
52
+ const [r, l] = this.domain, [n, p] = this.range, u = p < n;
53
+ let c = 0;
54
+ if (e <= r) c = 0;
55
+ else if (e >= l) c = 1;
56
56
  else {
57
- let r = !1;
57
+ let i = !1;
58
58
  for (const f of this.visibleRanges)
59
59
  if (e >= f.start && e <= f.end) {
60
- p = f.pixelOffset + (e - f.start) * f.pixelScale, r = !0;
60
+ c = f.pixelOffset + (e - f.start) * f.pixelScale, i = !0;
61
61
  break;
62
62
  }
63
- if (!r) {
63
+ if (!i) {
64
64
  for (const f of this.sortedBreaks)
65
65
  if (e >= f.start && e <= f.end) {
66
- const S = this.visibleRanges.find((s) => Math.abs(s.end - f.start) < 1e-10);
67
- p = (S ? S.pixelOffset + (S.end - S.start) * S.pixelScale : 0) + (e - f.start) / (f.end - f.start) * (f.visualRatio ?? 0.02), r = !0;
66
+ const b = this.visibleRanges.find((t) => Math.abs(t.end - f.start) < 1e-10);
67
+ c = (b ? b.pixelOffset + (b.end - b.start) * b.pixelScale : 0) + (e - f.start) / (f.end - f.start) * (f.visualRatio ?? 0.02), i = !0;
68
68
  break;
69
69
  }
70
70
  }
71
- r || (p = 0);
71
+ i || (c = 0);
72
72
  }
73
- return c ? i - p * (i - h) : i + p * (h - i);
73
+ return u ? n - c * (n - p) : n + c * (p - n);
74
74
  }
75
75
  /** Map data value to 0-1 ratio space (handles breaks) */
76
76
  mapToRatio(e) {
77
- const [o, n] = this.domain;
78
- if (e <= o) return 0;
79
- if (e >= n) return 1;
80
- for (const i of this.visibleRanges)
81
- if (e >= i.start && e <= i.end)
82
- return i.pixelOffset + (e - i.start) * i.pixelScale;
83
- for (const i of this.sortedBreaks)
84
- if (e >= i.start && e <= i.end) {
85
- const h = this.visibleRanges.find((p) => Math.abs(p.end - i.start) < 1e-10);
86
- return (h ? h.pixelOffset + (h.end - h.start) * h.pixelScale : 0) + (e - i.start) / (i.end - i.start) * (i.visualRatio ?? 0.02);
77
+ const [r, l] = this.domain;
78
+ if (e <= r) return 0;
79
+ if (e >= l) return 1;
80
+ for (const n of this.visibleRanges)
81
+ if (e >= n.start && e <= n.end)
82
+ return n.pixelOffset + (e - n.start) * n.pixelScale;
83
+ for (const n of this.sortedBreaks)
84
+ if (e >= n.start && e <= n.end) {
85
+ const p = this.visibleRanges.find((c) => Math.abs(c.end - n.start) < 1e-10);
86
+ return (p ? p.pixelOffset + (p.end - p.start) * p.pixelScale : 0) + (e - n.start) / (n.end - n.start) * (n.visualRatio ?? 0.02);
87
87
  }
88
88
  return 0;
89
89
  }
90
90
  invert(e) {
91
- const [o, n] = this.range, i = (e - o) / (n - o), h = Math.max(0, Math.min(1, i));
92
- for (const c of this.visibleRanges) {
93
- const p = c.pixelOffset + (c.end - c.start) * c.pixelScale;
94
- if (h >= c.pixelOffset && h <= p)
95
- return c.start + (h - c.pixelOffset) / c.pixelScale;
91
+ const [r, l] = this.range, n = (e - r) / (l - r), p = Math.max(0, Math.min(1, n));
92
+ for (const u of this.visibleRanges) {
93
+ const c = u.pixelOffset + (u.end - u.start) * u.pixelScale;
94
+ if (p >= u.pixelOffset && p <= c)
95
+ return u.start + (p - u.pixelOffset) / u.pixelScale;
96
96
  }
97
- for (let c = 0; c < this.sortedBreaks.length; c++) {
98
- const p = this.sortedBreaks[c], r = this.visibleRanges.find((S) => Math.abs(S.end - p.start) < 1e-10), f = r ? r.pixelOffset + (r.end - r.start) * r.pixelScale : 0;
99
- if (h >= f && h <= f + (p.visualRatio ?? 0.02))
100
- return p.start;
97
+ for (let u = 0; u < this.sortedBreaks.length; u++) {
98
+ const c = this.sortedBreaks[u], i = this.visibleRanges.find((b) => Math.abs(b.end - c.start) < 1e-10), f = i ? i.pixelOffset + (i.end - i.start) * i.pixelScale : 0;
99
+ if (p >= f && p <= f + (c.visualRatio ?? 0.02))
100
+ return c.start;
101
101
  }
102
102
  return this.domain[0];
103
103
  }
104
104
  ticks(e = 10) {
105
- const o = [];
106
- for (const n of this.visibleRanges) {
107
- const i = (n.end - n.start) / (this.domain[1] - this.domain[0]), h = Math.max(2, Math.round(e * i / this.availableVisualRatio)), c = this.generateSegmentTicks(n.start, n.end, h);
108
- o.push(...c);
105
+ const r = [];
106
+ for (const l of this.visibleRanges) {
107
+ const n = (l.end - l.start) / (this.domain[1] - this.domain[0]), p = Math.max(2, Math.round(e * n / this.availableVisualRatio)), u = this.generateSegmentTicks(l.start, l.end, p);
108
+ r.push(...u);
109
109
  }
110
- return Array.from(new Set(o)).sort((n, i) => n - i);
110
+ return Array.from(new Set(r)).sort((l, n) => l - n);
111
111
  }
112
- generateSegmentTicks(e, o, n) {
113
- const i = o - e;
114
- if (i <= 0 || !isFinite(i)) return [];
115
- const h = i / n, c = Math.pow(10, Math.floor(Math.log10(h))), p = h / c;
116
- let r;
117
- p < 1.5 ? r = 1 : p < 3 ? r = 2 : p < 7 ? r = 5 : r = 10, r *= c;
118
- const f = Math.ceil(e / r) * r, S = [];
119
- let t = f;
120
- for (; t <= o + r * 0.1; )
121
- S.push(Math.round(t * 1e12) / 1e12), t += r;
122
- return S;
112
+ generateSegmentTicks(e, r, l) {
113
+ const n = r - e;
114
+ if (n <= 0 || !isFinite(n)) return [];
115
+ const p = n / l, u = Math.pow(10, Math.floor(Math.log10(p))), c = p / u;
116
+ let i;
117
+ c < 1.5 ? i = 1 : c < 3 ? i = 2 : c < 7 ? i = 5 : i = 10, i *= u;
118
+ const f = Math.ceil(e / i) * i, b = [];
119
+ let R = f;
120
+ for (; R <= r + i * 0.1; )
121
+ b.push(Math.round(R * 1e12) / 1e12), R += i;
122
+ return b;
123
123
  }
124
124
  }
125
- const T = {
125
+ const B = {
126
126
  name: "velo-plot-broken-axis",
127
127
  version: "1.0.1",
128
128
  description: "Support for gaps/breaks in axes with visual indicators",
@@ -131,128 +131,117 @@ const T = {
131
131
  };
132
132
  function _(d = { axes: {} }) {
133
133
  d.enabled === void 0 && (d.enabled = !0);
134
- let e = null, o = null, n = null;
135
- const i = /* @__PURE__ */ new Map();
136
- function h() {
134
+ let e = null, r = null, l = null;
135
+ const n = /* @__PURE__ */ new Map();
136
+ function p() {
137
+ let t = 1 / 0, s = -1 / 0;
138
+ for (const o of n.values())
139
+ for (let a = 0; a < o.x.length; a++) {
140
+ const h = o.x[a];
141
+ h < t && (t = h), h > s && (s = h);
142
+ }
143
+ return !Number.isFinite(t) || !Number.isFinite(s) || t === s ? null : [t, s];
144
+ }
145
+ function u() {
137
146
  if (!e || !d.enabled) return;
138
147
  const t = d.axes.default || d.axes.xAxis;
139
- t && n && (n.updateBreaks(t.breaks), c());
148
+ t && l && (l.updateBreaks(t.breaks), c({ syncView: !0 }));
140
149
  }
141
- function c() {
142
- if (!e || !n || !d.enabled) return;
143
- const t = e.chart, [s, a] = n.domain, l = a - s;
144
- for (const [m, u] of i.entries()) {
145
- const g = new Float32Array(u.x.length);
146
- for (let b = 0; b < u.x.length; b++)
147
- g[b] = s + n.mapToRatio(u.x[b]) * l;
148
- t._originalUpdateSeries && t._originalUpdateSeries(m, { x: g, y: u.y });
150
+ function c(t = {}) {
151
+ if (!e || !l || !d.enabled) return;
152
+ const s = e.chart, o = p();
153
+ if (!o) return;
154
+ const [a, h] = o, g = h - a || 1;
155
+ l.setDomain(a, h);
156
+ for (const [m, S] of n.entries()) {
157
+ const y = new Float32Array(S.x.length);
158
+ for (let k = 0; k < S.x.length; k++)
159
+ y[k] = a + l.mapToRatio(S.x[k]) * g;
160
+ s._originalUpdateSeries && s._originalUpdateSeries(m, { x: y, y: S.y });
149
161
  }
162
+ t.syncView && typeof s.zoom == "function" && s.zoom({ x: [a, h], animate: !1 });
150
163
  }
151
- function p(t) {
152
- const { render: s } = t, { ctx2d: a, plotArea: l } = s;
153
- if (!(!a || !n))
154
- for (const [m, u] of Object.entries(d.axes)) {
155
- const g = m === "default" || m === "xAxis" ? "horizontal" : "vertical";
156
- g === "horizontal" && u.breaks.forEach((b) => {
157
- const x = n.transform(b.start), k = n.transform(b.end), y = (x + k) / 2;
158
- a.save(), a.lineWidth = 1, a.strokeStyle = u.symbolColor || "#ff00ff", g === "horizontal" && (r(a, y, l.y, u.defaultSymbol || "diagonal", "top"), r(a, y, l.y + l.height, u.defaultSymbol || "diagonal", "bottom")), a.restore();
164
+ function i(t) {
165
+ const { render: s } = t, { ctx2d: o, plotArea: a } = s;
166
+ if (!(!o || !l))
167
+ for (const [h, g] of Object.entries(d.axes)) {
168
+ const m = h === "default" || h === "xAxis" ? "horizontal" : "vertical";
169
+ m === "horizontal" && g.breaks.forEach((S) => {
170
+ const y = l.transform(S.start), k = l.transform(S.end), z = (y + k) / 2, w = S.symbol || g.defaultSymbol || "diagonal";
171
+ o.save(), o.lineWidth = 1.5, o.strokeStyle = g.symbolColor || "#ff00ff", m === "horizontal" && (f(o, z, a.y, w, "top"), f(o, z, a.y + a.height, w, "bottom")), o.restore();
159
172
  });
160
173
  }
161
174
  }
162
- function r(t, s, a, l, m) {
163
- t.beginPath(), l === "diagonal" ? (t.moveTo(s - 6, a + 6 / 2), t.lineTo(s + 6, a - 6 / 2), t.moveTo(s - 6 + 3, a + 6 / 2), t.lineTo(s + 6 + 3, a - 6 / 2)) : l === "zigzag" ? (t.moveTo(s - 6, a), t.lineTo(s - 6 / 2, a - 6 / 2), t.lineTo(s + 6 / 2, a + 6 / 2), t.lineTo(s + 6, a)) : m === "top" || m === "bottom" ? (t.moveTo(s - 6, a - 2), t.lineTo(s + 6, a + 2), t.moveTo(s - 6, a - 6), t.lineTo(s + 6, a - 2)) : (t.moveTo(s - 2, a - 6), t.lineTo(s + 2, a + 6)), t.stroke();
175
+ function f(t, s, o, a, h) {
176
+ t.beginPath(), a === "diagonal" ? (t.moveTo(s - 6, o + 6 / 2), t.lineTo(s + 6, o - 6 / 2), t.moveTo(s - 6 + 3, o + 6 / 2), t.lineTo(s + 6 + 3, o - 6 / 2)) : a === "zigzag" ? (t.moveTo(s - 6, o), t.lineTo(s - 6 / 2, o - 6 / 2), t.lineTo(s + 6 / 2, o + 6 / 2), t.lineTo(s + 6, o)) : h === "top" || h === "bottom" ? (t.moveTo(s - 6, o - 2), t.lineTo(s + 6, o + 2), t.moveTo(s - 6, o - 6), t.lineTo(s + 6, o - 2)) : (t.moveTo(s - 2, o - 6), t.lineTo(s + 2, o + 6)), t.stroke();
164
177
  }
165
- const S = {
166
- addBreak(t, s) {
167
- d.axes[t] || (d.axes[t] = { breaks: [] }), d.axes[t].breaks.push(s), h(), e == null || e.requestRender();
168
- },
169
- clearBreaks(t) {
170
- d.axes[t] && (d.axes[t].breaks = []), h(), e == null || e.requestRender();
171
- },
172
- setEnabled(t) {
173
- var a;
174
- const s = d.enabled;
175
- if (d.enabled = t, e && s !== t) {
176
- const l = e.chart;
177
- if (t)
178
- o = l.xScale, n = new w(o, ((a = d.axes.default || d.axes.xAxis) == null ? void 0 : a.breaks) || []), l.setXScale(n), c();
179
- else if (o) {
180
- l.setXScale(o), n = null;
181
- for (const [m, u] of i.entries())
182
- l._originalUpdateSeries(m, u);
183
- }
184
- }
185
- e == null || e.requestRender();
186
- },
187
- getBreaks(t) {
188
- var s;
189
- return ((s = d.axes[t]) == null ? void 0 : s.breaks) || [];
190
- },
191
- updateConfig(t) {
192
- Object.assign(d, t), h(), e == null || e.requestRender();
193
- }
194
- };
195
178
  return {
196
- manifest: T,
179
+ manifest: B,
197
180
  onInit(t) {
198
181
  e = t;
199
182
  const s = e.chart;
200
- if (s.brokenAxis = S, s._originalUpdateSeries = s.updateSeries.bind(s), s._originalAddSeries = s.addSeries.bind(s), s._originalAppendData = s.appendData.bind(s), s.updateSeries = (a, l) => {
201
- if (l.x && l.y && i.set(a, {
202
- x: l.x instanceof Float32Array ? l.x : new Float32Array(l.x),
203
- y: l.y instanceof Float32Array ? l.y : new Float32Array(l.y)
204
- }), d.enabled && n && l.x) {
205
- const m = l.x, u = new Float32Array(m.length), [g, b] = n.domain, x = b - g;
206
- for (let k = 0; k < m.length; k++)
207
- u[k] = g + n.mapToRatio(m[k]) * x;
208
- s._originalUpdateSeries(a, { ...l, x: u });
209
- } else
210
- s._originalUpdateSeries(a, l);
183
+ s._originalUpdateSeries = s.updateSeries.bind(s), s._originalAddSeries = s.addSeries.bind(s), s._originalAppendData = s.appendData.bind(s);
184
+ const o = (a) => a instanceof Float32Array ? a : new Float32Array(typeof a == "number" ? [a] : a);
185
+ if (s.updateSeries = (a, h) => {
186
+ h.x && h.y && n.set(a, { x: o(h.x), y: o(h.y) }), d.enabled && l && h.x ? c({ syncView: !0 }) : s._originalUpdateSeries(a, h);
211
187
  }, s.addSeries = (a) => {
212
- var l, m, u;
213
- if (a.id && ((l = a.data) != null && l.x) && ((m = a.data) != null && m.y) && i.set(a.id, {
214
- x: a.data.x instanceof Float32Array ? a.data.x : new Float32Array(a.data.x),
215
- y: a.data.y instanceof Float32Array ? a.data.y : new Float32Array(a.data.y)
216
- }), d.enabled && n && ((u = a.data) != null && u.x)) {
217
- const g = a.data.x, b = new Float32Array(g.length), [x, k] = n.domain, y = k - x;
218
- for (let A = 0; A < g.length; A++)
219
- b[A] = x + n.mapToRatio(g[A]) * y;
220
- s._originalAddSeries({ ...a, data: { ...a.data, x: b } });
221
- } else
222
- s._originalAddSeries(a);
223
- }, s.appendData = (a, l, m) => {
224
- const u = i.get(a);
225
- if (u) {
226
- const g = l instanceof Float32Array ? l : [l], b = m instanceof Float32Array ? m : [m], x = new Float32Array(u.x.length + g.length), k = new Float32Array(u.y.length + b.length);
227
- x.set(u.x), x.set(g, u.x.length), k.set(u.y), k.set(b, u.y.length), i.set(a, { x, y: k });
188
+ var h, g, m;
189
+ a.id && ((h = a.data) != null && h.x) && ((g = a.data) != null && g.y) && n.set(a.id, { x: o(a.data.x), y: o(a.data.y) }), d.enabled && l && ((m = a.data) != null && m.x) ? (s._originalAddSeries(a), c({ syncView: !0 })) : s._originalAddSeries(a);
190
+ }, s.appendData = (a, h, g) => {
191
+ const m = n.get(a);
192
+ if (m) {
193
+ const S = o(h), y = o(g), k = new Float32Array(m.x.length + S.length), z = new Float32Array(m.y.length + y.length);
194
+ k.set(m.x), k.set(S, m.x.length), z.set(m.y), z.set(y, m.y.length), n.set(a, { x: k, y: z });
228
195
  }
229
- if (d.enabled && n) {
230
- const g = l instanceof Array ? new Float32Array(l) : typeof l == "number" ? new Float32Array([l]) : l, b = new Float32Array(g.length), [x, k] = n.domain, y = k - x;
231
- for (let A = 0; A < g.length; A++)
232
- b[A] = x + n.mapToRatio(g[A]) * y;
233
- s._originalAppendData(a, b, m);
234
- } else
235
- s._originalAppendData(a, l, m);
196
+ d.enabled && l ? c({ syncView: !0 }) : s._originalAppendData(a, h, g);
236
197
  }, d.enabled) {
237
- o = s.xScale;
198
+ r = s.xScale;
238
199
  const a = d.axes.default || d.axes.xAxis;
239
- n = new w(o, (a == null ? void 0 : a.breaks) || []), s.setXScale(n);
200
+ l = new v(r, (a == null ? void 0 : a.breaks) || []), s.setXScale(l);
240
201
  }
241
202
  },
242
203
  onDestroy() {
243
204
  if (e) {
244
205
  const t = e.chart;
245
- delete t.brokenAxis, o && t.setXScale(o), t.updateSeries = t._originalUpdateSeries, t.addSeries = t._originalAddSeries, t.appendData = t._originalAppendData, delete t._originalUpdateSeries, delete t._originalAddSeries, delete t._originalAppendData;
206
+ r && t.setXScale(r), t.updateSeries = t._originalUpdateSeries, t.addSeries = t._originalAddSeries, t.appendData = t._originalAppendData, delete t._originalUpdateSeries, delete t._originalAddSeries, delete t._originalAppendData;
246
207
  }
247
- e = null, i.clear();
208
+ e = null, n.clear();
248
209
  },
249
210
  onRenderOverlay(t) {
250
- d.enabled && p(t);
211
+ d.enabled && i(t);
251
212
  },
252
213
  onViewChange() {
253
- d.enabled && n && c();
254
214
  },
255
- api: S
215
+ api: {
216
+ addBreak(t, s) {
217
+ d.axes[t] || (d.axes[t] = { breaks: [] }), d.axes[t].breaks.push(s), u(), e == null || e.requestRender();
218
+ },
219
+ clearBreaks(t) {
220
+ d.axes[t] && (d.axes[t].breaks = []), u(), e == null || e.requestRender();
221
+ },
222
+ setEnabled(t) {
223
+ var o;
224
+ const s = d.enabled;
225
+ if (d.enabled = t, e && s !== t) {
226
+ const a = e.chart;
227
+ if (t)
228
+ r = a.xScale, l = new v(r, ((o = d.axes.default || d.axes.xAxis) == null ? void 0 : o.breaks) || []), a.setXScale(l), c({ syncView: !0 });
229
+ else if (r) {
230
+ a.setXScale(r), l = null;
231
+ for (const [h, g] of n.entries())
232
+ a._originalUpdateSeries(h, g);
233
+ }
234
+ }
235
+ e == null || e.requestRender();
236
+ },
237
+ getBreaks(t) {
238
+ var s;
239
+ return ((s = d.axes[t]) == null ? void 0 : s.breaks) || [];
240
+ },
241
+ updateConfig(t) {
242
+ Object.assign(d, t), u(), e == null || e.requestRender();
243
+ }
244
+ }
256
245
  };
257
246
  }
258
247
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"broken-axis.js","sources":["../../src/plugins/broken-axis/BrokenAxisScale.ts","../../src/plugins/broken-axis/index.ts"],"sourcesContent":["import type { Scale } from \"../../scales\";\nimport type { AxisBreak } from \"./types\";\n\nexport class BrokenAxisScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\"; // Compatible with linear for renderer selection\n\n private underlying: Scale;\n private sortedBreaks: AxisBreak[] = [];\n private visibleRanges: { start: number; end: number; pixelOffset: number; pixelScale: number }[] = [];\n private availableVisualRatio: number = 1.0;\n\n constructor(originalScale: Scale, private breaks: AxisBreak[]) {\n this.underlying = originalScale;\n this.domain = [...originalScale.domain];\n this.range = [...originalScale.range];\n this.refresh();\n }\n\n setDomain(min: number, max: number): void {\n this.domain = [min, max];\n this.underlying.setDomain(min, max);\n this.refresh();\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n this.underlying.setRange(min, max);\n this.refresh();\n }\n\n updateBreaks(breaks: AxisBreak[]) {\n this.breaks = breaks;\n this.refresh();\n }\n\n private refresh() {\n const [min, max] = this.domain;\n \n // 1. Sort and filter breaks within [min, max]\n this.sortedBreaks = this.breaks\n .filter(b => b.start < max && b.end > min)\n .map(b => ({\n ...b,\n start: Math.max(min, b.start),\n end: Math.min(max, b.end),\n visualRatio: b.visualRatio ?? 0.02\n }))\n .sort((a, b) => a.start - b.start);\n\n // 2. Identify visible data segments\n const segments: { start: number; end: number }[] = [];\n let current = min;\n\n for (const b of this.sortedBreaks) {\n if (b.start > current) {\n segments.push({ start: current, end: b.start });\n }\n current = b.end;\n }\n if (current < max) {\n segments.push({ start: current, end: max });\n }\n\n // 3. Calculate total data span of visible segments\n const totalVisibleDataWidth = segments.reduce((sum, s) => sum + (s.end - s.start), 0) || 1e-10;\n const totalBreakVisualRatio = this.sortedBreaks.reduce((sum, b) => sum + (b.visualRatio || 0.02), 0);\n this.availableVisualRatio = Math.max(0.1, 1.0 - totalBreakVisualRatio);\n\n // 4. Calculate mapping for each segment (in 0-1 ratio space)\n let currentRatioOffset = 0;\n this.visibleRanges = segments.map(s => {\n const dataWidth = s.end - s.start;\n const visualWidth = (dataWidth / totalVisibleDataWidth) * this.availableVisualRatio;\n const range = {\n start: s.start,\n end: s.end,\n pixelOffset: currentRatioOffset,\n pixelScale: visualWidth / dataWidth\n };\n \n // Find following break if any to advance offset\n const nextBreak = this.sortedBreaks.find(b => Math.abs(b.start - s.end) < 1e-10);\n currentRatioOffset += visualWidth + (nextBreak?.visualRatio ?? 0);\n \n return range;\n });\n }\n\n transform(value: number): number {\n const [min, max] = this.domain;\n const [r0, r1] = this.range;\n const isReverse = r1 < r0;\n \n let ratio = 0;\n if (value <= min) ratio = 0;\n else if (value >= max) ratio = 1;\n else {\n let found = false;\n // Check visible segments\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n ratio = range.pixelOffset + (value - range.start) * range.pixelScale;\n found = true;\n break;\n }\n }\n \n // If in break\n if (!found) {\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n ratio = offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n found = true;\n break;\n }\n }\n }\n \n if (!found) ratio = 0;\n }\n\n // Map ratio to pixels\n return isReverse ? r0 - ratio * (r0 - r1) : r0 + ratio * (r1 - r0);\n }\n\n /** Map data value to 0-1 ratio space (handles breaks) */\n mapToRatio(value: number): number {\n const [min, max] = this.domain;\n if (value <= min) return 0;\n if (value >= max) return 1;\n\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n return range.pixelOffset + (value - range.start) * range.pixelScale;\n }\n }\n\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n return offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n }\n }\n\n return 0;\n }\n\n invert(pixel: number): number {\n const [r0, r1] = this.range;\n const ratio = (pixel - r0) / (r1 - r0);\n \n const r = Math.max(0, Math.min(1, ratio));\n\n for (const range of this.visibleRanges) {\n const visualEnd = range.pixelOffset + (range.end - range.start) * range.pixelScale;\n if (r >= range.pixelOffset && r <= visualEnd) {\n return range.start + (r - range.pixelOffset) / range.pixelScale;\n }\n }\n\n // In break, return nearest segment boundary\n for (let i = 0; i < this.sortedBreaks.length; i++) {\n const b = this.sortedBreaks[i];\n const prevRange = this.visibleRanges.find(range => Math.abs(range.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n if (r >= offset && r <= offset + (b.visualRatio ?? 0.02)) {\n return b.start;\n }\n }\n\n return this.domain[0];\n }\n\n ticks(count: number = 10): number[] {\n // Generate ticks for each visible segment based on their visual weight\n const allTicks: number[] = [];\n \n for (const range of this.visibleRanges) {\n const visualWeight = (range.end - range.start) / (this.domain[1] - this.domain[0]);\n const segmentCount = Math.max(2, Math.round(count * visualWeight / this.availableVisualRatio));\n \n // Use underlying logic for \"nice\" steps but restricted to this range\n const segmentTicks = this.generateSegmentTicks(range.start, range.end, segmentCount);\n allTicks.push(...segmentTicks);\n }\n\n // Remove duplicates and sort\n return Array.from(new Set(allTicks)).sort((a, b) => a - b);\n }\n\n private generateSegmentTicks(min: number, max: number, count: number): number[] {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return [];\n \n // Re-use niceStep logic\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n let step: number;\n if (normalized < 1.5) step = 1; else if (normalized < 3) step = 2; else if (normalized < 7) step = 5; else step = 10;\n step *= magnitude;\n\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n let t = start;\n while (t <= max + step * 0.1) {\n ticks.push(Math.round(t * 1e12) / 1e12);\n t += step;\n }\n return ticks;\n }\n}\n","/**\n * @fileoverview Broken Axis plugin for displaying discontinuous data ranges.\n * @module plugins/broken-axis\n */\n\nimport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\nimport { BrokenAxisScale } from './BrokenAxisScale';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-broken-axis',\n version: '1.0.1',\n description: 'Support for gaps/breaks in axes with visual indicators',\n provides: ['broken-axis', 'coordinate-transform'],\n tags: ['axis', 'layout', 'visualization'],\n};\n\nexport function PluginBrokenAxis(\n config: PluginBrokenAxisConfig = { axes: {} }\n): ChartPlugin<PluginBrokenAxisConfig> {\n // Default enabled to true if not specified\n if (config.enabled === undefined) config.enabled = true;\n \n let ctx: PluginContext | null = null;\n let originalXScale: any = null;\n let brokenXScale: BrokenAxisScale | null = null;\n \n // Storage for raw data of series to allow re-transformation on zoom\n const rawDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n function updateScales() {\n if (!ctx || !config.enabled) return;\n \n const options = config.axes.default || config.axes.xAxis;\n if (options && brokenXScale) {\n brokenXScale.updateBreaks(options.breaks);\n // On break change, we must re-transform everything\n applyTransformations();\n }\n }\n\n function applyTransformations() {\n if (!ctx || !brokenXScale || !config.enabled) return;\n const chart = ctx.chart as any;\n const [min, max] = brokenXScale.domain;\n const range = max - min;\n\n for (const [id, raw] of rawDataStore.entries()) {\n const transformedX = new Float32Array(raw.x.length);\n for (let i = 0; i < raw.x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(raw.x[i]) * range;\n }\n // Call the TRUE underlying updateSeries to avoid hijacking loop\n if (chart._originalUpdateSeries) {\n chart._originalUpdateSeries(id, { x: transformedX, y: raw.y });\n }\n }\n }\n\n function drawBreakSymbols(pCtx: PluginContext) {\n const { render } = pCtx;\n const { ctx2d, plotArea } = render;\n if (!ctx2d || !brokenXScale) return;\n\n for (const [axisId, options] of Object.entries(config.axes)) {\n const orientation = (axisId === 'default' || axisId === 'xAxis') ? 'horizontal' : 'vertical';\n if (orientation !== 'horizontal') continue;\n\n options.breaks.forEach(b => {\n const pxStart = brokenXScale!.transform(b.start);\n const pxEnd = brokenXScale!.transform(b.end);\n const midPx = (pxStart + pxEnd) / 2;\n\n ctx2d.save();\n ctx2d.lineWidth = 1;\n ctx2d.strokeStyle = options.symbolColor || '#ff00ff';\n\n if (orientation === 'horizontal') {\n drawSymbol(ctx2d, midPx, plotArea.y, options.defaultSymbol || 'diagonal', 'top');\n drawSymbol(ctx2d, midPx, plotArea.y + plotArea.height, options.defaultSymbol || 'diagonal', 'bottom');\n }\n ctx2d.restore();\n });\n }\n }\n\n function drawSymbol(ctx: CanvasRenderingContext2D, x: number, y: number, type: string, edge: string) {\n const size = 6;\n ctx.beginPath();\n if (type === 'diagonal') {\n ctx.moveTo(x - size, y + size/2);\n ctx.lineTo(x + size, y - size/2);\n ctx.moveTo(x - size + 3, y + size/2);\n ctx.lineTo(x + size + 3, y - size/2);\n } else if (type === 'zigzag') {\n ctx.moveTo(x - size, y);\n ctx.lineTo(x - size/2, y - size/2);\n ctx.lineTo(x + size/2, y + size/2);\n ctx.lineTo(x + size, y);\n } else {\n if (edge === 'top' || edge === 'bottom') {\n ctx.moveTo(x - size, y - 2); ctx.lineTo(x + size, y + 2);\n ctx.moveTo(x - size, y - 6); ctx.lineTo(x + size, y - 2);\n } else {\n ctx.moveTo(x - 2, y - size); ctx.lineTo(x + 2, y + size);\n }\n }\n ctx.stroke();\n }\n\n const api: BrokenAxisAPI = {\n addBreak(axisId, b) {\n if (!config.axes[axisId]) config.axes[axisId] = { breaks: [] };\n config.axes[axisId].breaks.push(b);\n updateScales();\n ctx?.requestRender();\n },\n clearBreaks(axisId) {\n if (config.axes[axisId]) config.axes[axisId].breaks = [];\n updateScales();\n ctx?.requestRender();\n },\n setEnabled(enabled: boolean) {\n const wasEnabled = config.enabled;\n config.enabled = enabled;\n \n if (ctx && wasEnabled !== enabled) {\n const chart = ctx.chart;\n if (enabled) {\n originalXScale = (chart as any).xScale;\n brokenXScale = new BrokenAxisScale(originalXScale, (config.axes.default || config.axes.xAxis)?.breaks || []);\n chart.setXScale(brokenXScale);\n applyTransformations();\n } else {\n if (originalXScale) {\n chart.setXScale(originalXScale);\n brokenXScale = null;\n // Restore original data to series\n for (const [id, raw] of rawDataStore.entries()) {\n (chart as any)._originalUpdateSeries(id, raw);\n }\n }\n }\n }\n ctx?.requestRender();\n },\n getBreaks(axisId: string): AxisBreak[] {\n return config.axes[axisId]?.breaks || [];\n },\n updateConfig(newConfig: Partial<PluginBrokenAxisConfig>) {\n Object.assign(config, newConfig);\n updateScales();\n ctx?.requestRender();\n }\n };\n\n const pluginApi: BrokenAxisAPI & Record<string, unknown> = api as any;\n\n return {\n manifest,\n onInit(pCtx) {\n ctx = pCtx;\n const chart = ctx.chart as any;\n chart.brokenAxis = pluginApi;\n\n // Hijack and Save original methods\n chart._originalUpdateSeries = chart.updateSeries.bind(chart);\n chart._originalAddSeries = chart.addSeries.bind(chart);\n chart._originalAppendData = chart.appendData.bind(chart);\n\n chart.updateSeries = (id: string, data: any) => {\n if (data.x && data.y) {\n rawDataStore.set(id, { \n x: data.x instanceof Float32Array ? data.x : new Float32Array(data.x), \n y: data.y instanceof Float32Array ? data.y : new Float32Array(data.y) \n });\n }\n \n if (config.enabled && brokenXScale && data.x) {\n const x = data.x;\n const transformedX = new Float32Array(x.length);\n const [min, max] = brokenXScale.domain;\n const range = max - min;\n for (let i = 0; i < x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(x[i]) * range;\n }\n chart._originalUpdateSeries(id, { ...data, x: transformedX });\n } else {\n chart._originalUpdateSeries(id, data);\n }\n };\n\n chart.addSeries = (options: any) => {\n if (options.id && options.data?.x && options.data?.y) {\n rawDataStore.set(options.id, { \n x: options.data.x instanceof Float32Array ? options.data.x : new Float32Array(options.data.x), \n y: options.data.y instanceof Float32Array ? options.data.y : new Float32Array(options.data.y) \n });\n }\n \n if (config.enabled && brokenXScale && options.data?.x) {\n const x = options.data.x;\n const transformedX = new Float32Array(x.length);\n const [min, max] = brokenXScale.domain;\n const range = max - min;\n for (let i = 0; i < x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(x[i]) * range;\n }\n chart._originalAddSeries({ ...options, data: { ...options.data, x: transformedX } });\n } else {\n chart._originalAddSeries(options);\n }\n };\n\n chart.appendData = (id: string, x: any, y: any) => {\n const raw = rawDataStore.get(id);\n if (raw) {\n const newX = x instanceof Float32Array ? x : [x];\n const newY = y instanceof Float32Array ? y : [y];\n const combinedX = new Float32Array(raw.x.length + newX.length);\n const combinedY = new Float32Array(raw.y.length + newY.length);\n combinedX.set(raw.x);\n combinedX.set(newX, raw.x.length);\n combinedY.set(raw.y);\n combinedY.set(newY, raw.y.length);\n rawDataStore.set(id, { x: combinedX, y: combinedY });\n }\n\n if (config.enabled && brokenXScale) {\n const xArr = x instanceof Array ? new Float32Array(x) : (typeof x === 'number' ? new Float32Array([x]) : x);\n const transformedX = new Float32Array(xArr.length);\n const [min, max] = brokenXScale.domain;\n const range = max - min;\n for (let i = 0; i < xArr.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(xArr[i]) * range;\n }\n chart._originalAppendData(id, transformedX, y);\n } else {\n chart._originalAppendData(id, x, y);\n }\n };\n\n if (config.enabled) {\n originalXScale = chart.xScale; \n const options = config.axes.default || config.axes.xAxis;\n brokenXScale = new BrokenAxisScale(originalXScale, options?.breaks || []);\n chart.setXScale(brokenXScale);\n }\n },\n onDestroy() {\n if (ctx) {\n const chart = (ctx.chart as any);\n delete chart.brokenAxis;\n if (originalXScale) {\n chart.setXScale(originalXScale);\n }\n // CLEANUP hijacked methods\n chart.updateSeries = chart._originalUpdateSeries;\n chart.addSeries = chart._originalAddSeries;\n chart.appendData = chart._originalAppendData;\n delete chart._originalUpdateSeries;\n delete chart._originalAddSeries;\n delete chart._originalAppendData;\n }\n ctx = null;\n rawDataStore.clear();\n },\n onRenderOverlay(pCtx) {\n if (config.enabled) drawBreakSymbols(pCtx);\n },\n onViewChange() {\n if (config.enabled && brokenXScale) {\n applyTransformations();\n }\n },\n api: pluginApi\n };\n}\n\nexport default PluginBrokenAxis;\n\nexport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n BrokenAxisOptions,\n} from './types';\n"],"names":["BrokenAxisScale","originalScale","breaks","__publicField","min","max","b","a","segments","current","totalVisibleDataWidth","sum","s","totalBreakVisualRatio","currentRatioOffset","dataWidth","visualWidth","range","nextBreak","value","r0","r1","isReverse","ratio","found","prevRange","r","pixel","visualEnd","i","offset","count","allTicks","visualWeight","segmentCount","segmentTicks","rawStep","magnitude","normalized","step","start","ticks","manifest","PluginBrokenAxis","config","ctx","originalXScale","brokenXScale","rawDataStore","updateScales","options","applyTransformations","chart","id","raw","transformedX","drawBreakSymbols","pCtx","render","ctx2d","plotArea","axisId","orientation","pxStart","pxEnd","midPx","drawSymbol","x","y","type","edge","pluginApi","enabled","_a","wasEnabled","newConfig","data","_b","_c","newX","newY","combinedX","combinedY","xArr"],"mappings":"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"}
1
+ {"version":3,"file":"broken-axis.js","sources":["../../src/plugins/broken-axis/BrokenAxisScale.ts","../../src/plugins/broken-axis/index.ts"],"sourcesContent":["import type { Scale } from \"../../scales\";\nimport type { AxisBreak } from \"./types\";\n\nexport class BrokenAxisScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\"; // Compatible with linear for renderer selection\n\n private underlying: Scale;\n private sortedBreaks: AxisBreak[] = [];\n private visibleRanges: { start: number; end: number; pixelOffset: number; pixelScale: number }[] = [];\n private availableVisualRatio: number = 1.0;\n\n constructor(originalScale: Scale, private breaks: AxisBreak[]) {\n this.underlying = originalScale;\n this.domain = [...originalScale.domain];\n this.range = [...originalScale.range];\n this.refresh();\n }\n\n setDomain(min: number, max: number): void {\n this.domain = [min, max];\n this.underlying.setDomain(min, max);\n this.refresh();\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n this.underlying.setRange(min, max);\n this.refresh();\n }\n\n updateBreaks(breaks: AxisBreak[]) {\n this.breaks = breaks;\n this.refresh();\n }\n\n private refresh() {\n const [min, max] = this.domain;\n \n // 1. Sort and filter breaks within [min, max]\n this.sortedBreaks = this.breaks\n .filter(b => b.start < max && b.end > min)\n .map(b => ({\n ...b,\n start: Math.max(min, b.start),\n end: Math.min(max, b.end),\n visualRatio: b.visualRatio ?? 0.02\n }))\n .sort((a, b) => a.start - b.start);\n\n // 2. Identify visible data segments\n const segments: { start: number; end: number }[] = [];\n let current = min;\n\n for (const b of this.sortedBreaks) {\n if (b.start > current) {\n segments.push({ start: current, end: b.start });\n }\n current = b.end;\n }\n if (current < max) {\n segments.push({ start: current, end: max });\n }\n\n // 3. Calculate total data span of visible segments\n const totalVisibleDataWidth = segments.reduce((sum, s) => sum + (s.end - s.start), 0) || 1e-10;\n const totalBreakVisualRatio = this.sortedBreaks.reduce((sum, b) => sum + (b.visualRatio || 0.02), 0);\n this.availableVisualRatio = Math.max(0.1, 1.0 - totalBreakVisualRatio);\n\n // 4. Calculate mapping for each segment (in 0-1 ratio space)\n let currentRatioOffset = 0;\n this.visibleRanges = segments.map(s => {\n const dataWidth = s.end - s.start;\n const visualWidth = (dataWidth / totalVisibleDataWidth) * this.availableVisualRatio;\n const range = {\n start: s.start,\n end: s.end,\n pixelOffset: currentRatioOffset,\n pixelScale: visualWidth / dataWidth\n };\n \n // Find following break if any to advance offset\n const nextBreak = this.sortedBreaks.find(b => Math.abs(b.start - s.end) < 1e-10);\n currentRatioOffset += visualWidth + (nextBreak?.visualRatio ?? 0);\n \n return range;\n });\n }\n\n transform(value: number): number {\n const [min, max] = this.domain;\n const [r0, r1] = this.range;\n const isReverse = r1 < r0;\n \n let ratio = 0;\n if (value <= min) ratio = 0;\n else if (value >= max) ratio = 1;\n else {\n let found = false;\n // Check visible segments\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n ratio = range.pixelOffset + (value - range.start) * range.pixelScale;\n found = true;\n break;\n }\n }\n \n // If in break\n if (!found) {\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n ratio = offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n found = true;\n break;\n }\n }\n }\n \n if (!found) ratio = 0;\n }\n\n // Map ratio to pixels\n return isReverse ? r0 - ratio * (r0 - r1) : r0 + ratio * (r1 - r0);\n }\n\n /** Map data value to 0-1 ratio space (handles breaks) */\n mapToRatio(value: number): number {\n const [min, max] = this.domain;\n if (value <= min) return 0;\n if (value >= max) return 1;\n\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n return range.pixelOffset + (value - range.start) * range.pixelScale;\n }\n }\n\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n return offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n }\n }\n\n return 0;\n }\n\n invert(pixel: number): number {\n const [r0, r1] = this.range;\n const ratio = (pixel - r0) / (r1 - r0);\n \n const r = Math.max(0, Math.min(1, ratio));\n\n for (const range of this.visibleRanges) {\n const visualEnd = range.pixelOffset + (range.end - range.start) * range.pixelScale;\n if (r >= range.pixelOffset && r <= visualEnd) {\n return range.start + (r - range.pixelOffset) / range.pixelScale;\n }\n }\n\n // In break, return nearest segment boundary\n for (let i = 0; i < this.sortedBreaks.length; i++) {\n const b = this.sortedBreaks[i];\n const prevRange = this.visibleRanges.find(range => Math.abs(range.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n if (r >= offset && r <= offset + (b.visualRatio ?? 0.02)) {\n return b.start;\n }\n }\n\n return this.domain[0];\n }\n\n ticks(count: number = 10): number[] {\n // Generate ticks for each visible segment based on their visual weight\n const allTicks: number[] = [];\n \n for (const range of this.visibleRanges) {\n const visualWeight = (range.end - range.start) / (this.domain[1] - this.domain[0]);\n const segmentCount = Math.max(2, Math.round(count * visualWeight / this.availableVisualRatio));\n \n // Use underlying logic for \"nice\" steps but restricted to this range\n const segmentTicks = this.generateSegmentTicks(range.start, range.end, segmentCount);\n allTicks.push(...segmentTicks);\n }\n\n // Remove duplicates and sort\n return Array.from(new Set(allTicks)).sort((a, b) => a - b);\n }\n\n private generateSegmentTicks(min: number, max: number, count: number): number[] {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return [];\n \n // Re-use niceStep logic\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n let step: number;\n if (normalized < 1.5) step = 1; else if (normalized < 3) step = 2; else if (normalized < 7) step = 5; else step = 10;\n step *= magnitude;\n\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n let t = start;\n while (t <= max + step * 0.1) {\n ticks.push(Math.round(t * 1e12) / 1e12);\n t += step;\n }\n return ticks;\n }\n}\n","/**\n * @fileoverview Broken Axis plugin for displaying discontinuous data ranges.\n * @module plugins/broken-axis\n */\n\nimport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\nimport { BrokenAxisScale } from './BrokenAxisScale';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-broken-axis',\n version: '1.0.1',\n description: 'Support for gaps/breaks in axes with visual indicators',\n provides: ['broken-axis', 'coordinate-transform'],\n tags: ['axis', 'layout', 'visualization'],\n};\n\nexport function PluginBrokenAxis(\n config: PluginBrokenAxisConfig = { axes: {} }\n): ChartPlugin<PluginBrokenAxisConfig> {\n // Default enabled to true if not specified\n if (config.enabled === undefined) config.enabled = true;\n \n let ctx: PluginContext | null = null;\n let originalXScale: any = null;\n let brokenXScale: BrokenAxisScale | null = null;\n\n // Storage for raw (un-warped) data of series to allow re-transformation.\n const rawDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n /** Union X-extent across all stored series — the domain breaks live in. */\n function computeWarpDomain(): [number, number] | null {\n let min = Infinity;\n let max = -Infinity;\n for (const raw of rawDataStore.values()) {\n for (let i = 0; i < raw.x.length; i++) {\n const v = raw.x[i];\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) return null;\n return [min, max];\n }\n\n function updateScales() {\n if (!ctx || !config.enabled) return;\n\n const options = config.axes.default || config.axes.xAxis;\n if (options && brokenXScale) {\n brokenXScale.updateBreaks(options.breaks);\n // On break change, we must re-transform everything\n applyTransformations({ syncView: true });\n }\n }\n\n /**\n * Re-warp every stored series into compressed (broken) space using the\n * data-derived warp domain, then align the chart's X view to that domain so\n * the axis ticks and break symbols (which the render pass computes from\n * viewBounds) line up with the warped data.\n */\n function applyTransformations(opts: { syncView?: boolean } = {}) {\n if (!ctx || !brokenXScale || !config.enabled) return;\n const chart = ctx.chart as any;\n\n const domain = computeWarpDomain();\n if (!domain) return;\n const [min, max] = domain;\n const range = max - min || 1;\n\n // Pin the scale to the warp domain so mapToRatio uses the correct segments,\n // independent of whatever sub-range the last render/zoom left behind.\n brokenXScale.setDomain(min, max);\n\n for (const [id, raw] of rawDataStore.entries()) {\n const transformedX = new Float32Array(raw.x.length);\n for (let i = 0; i < raw.x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(raw.x[i]) * range;\n }\n // Call the TRUE underlying updateSeries to avoid the hijacking loop.\n if (chart._originalUpdateSeries) {\n chart._originalUpdateSeries(id, { x: transformedX, y: raw.y });\n }\n }\n\n if (opts.syncView && typeof chart.zoom === 'function') {\n // Constrain X to the warped data domain (warped values also span\n // [min,max]). Y is left untouched so the caller's Y range is preserved.\n chart.zoom({ x: [min, max], animate: false });\n }\n }\n\n function drawBreakSymbols(pCtx: PluginContext) {\n const { render } = pCtx;\n const { ctx2d, plotArea } = render;\n if (!ctx2d || !brokenXScale) return;\n\n for (const [axisId, options] of Object.entries(config.axes)) {\n const orientation = (axisId === 'default' || axisId === 'xAxis') ? 'horizontal' : 'vertical';\n if (orientation !== 'horizontal') continue;\n\n options.breaks.forEach(b => {\n const pxStart = brokenXScale!.transform(b.start);\n const pxEnd = brokenXScale!.transform(b.end);\n const midPx = (pxStart + pxEnd) / 2;\n // Per-break symbol takes precedence, then the axis default.\n const symbol = b.symbol || options.defaultSymbol || 'diagonal';\n\n ctx2d.save();\n ctx2d.lineWidth = 1.5;\n ctx2d.strokeStyle = options.symbolColor || '#ff00ff';\n\n if (orientation === 'horizontal') {\n drawSymbol(ctx2d, midPx, plotArea.y, symbol, 'top');\n drawSymbol(ctx2d, midPx, plotArea.y + plotArea.height, symbol, 'bottom');\n }\n ctx2d.restore();\n });\n }\n }\n\n function drawSymbol(ctx: CanvasRenderingContext2D, x: number, y: number, type: string, edge: string) {\n const size = 6;\n ctx.beginPath();\n if (type === 'diagonal') {\n ctx.moveTo(x - size, y + size/2);\n ctx.lineTo(x + size, y - size/2);\n ctx.moveTo(x - size + 3, y + size/2);\n ctx.lineTo(x + size + 3, y - size/2);\n } else if (type === 'zigzag') {\n ctx.moveTo(x - size, y);\n ctx.lineTo(x - size/2, y - size/2);\n ctx.lineTo(x + size/2, y + size/2);\n ctx.lineTo(x + size, y);\n } else {\n if (edge === 'top' || edge === 'bottom') {\n ctx.moveTo(x - size, y - 2); ctx.lineTo(x + size, y + 2);\n ctx.moveTo(x - size, y - 6); ctx.lineTo(x + size, y - 2);\n } else {\n ctx.moveTo(x - 2, y - size); ctx.lineTo(x + 2, y + size);\n }\n }\n ctx.stroke();\n }\n\n const api: BrokenAxisAPI = {\n addBreak(axisId, b) {\n if (!config.axes[axisId]) config.axes[axisId] = { breaks: [] };\n config.axes[axisId].breaks.push(b);\n updateScales();\n ctx?.requestRender();\n },\n clearBreaks(axisId) {\n if (config.axes[axisId]) config.axes[axisId].breaks = [];\n updateScales();\n ctx?.requestRender();\n },\n setEnabled(enabled: boolean) {\n const wasEnabled = config.enabled;\n config.enabled = enabled;\n \n if (ctx && wasEnabled !== enabled) {\n const chart = ctx.chart;\n if (enabled) {\n originalXScale = (chart as any).xScale;\n brokenXScale = new BrokenAxisScale(originalXScale, (config.axes.default || config.axes.xAxis)?.breaks || []);\n chart.setXScale(brokenXScale);\n applyTransformations({ syncView: true });\n } else {\n if (originalXScale) {\n chart.setXScale(originalXScale);\n brokenXScale = null;\n // Restore original data to series\n for (const [id, raw] of rawDataStore.entries()) {\n (chart as any)._originalUpdateSeries(id, raw);\n }\n }\n }\n }\n ctx?.requestRender();\n },\n getBreaks(axisId: string): AxisBreak[] {\n return config.axes[axisId]?.breaks || [];\n },\n updateConfig(newConfig: Partial<PluginBrokenAxisConfig>) {\n Object.assign(config, newConfig);\n updateScales();\n ctx?.requestRender();\n }\n };\n\n const pluginApi: BrokenAxisAPI & Record<string, unknown> = api as any;\n\n return {\n manifest,\n onInit(pCtx) {\n ctx = pCtx;\n const chart = ctx.chart as any;\n // NOTE: `chart.brokenAxis` is a read-only getter on ChartCore that resolves\n // this plugin's `api` via the plugin bridge — do NOT assign to it (that\n // throws \"Cannot set property ... which has only a getter\" and aborts\n // plugin registration entirely).\n\n // Hijack and Save original methods\n chart._originalUpdateSeries = chart.updateSeries.bind(chart);\n chart._originalAddSeries = chart.addSeries.bind(chart);\n chart._originalAppendData = chart.appendData.bind(chart);\n\n const toF32 = (v: any): Float32Array =>\n v instanceof Float32Array ? v : new Float32Array(typeof v === 'number' ? [v] : v);\n\n chart.updateSeries = (id: string, data: any) => {\n if (data.x && data.y) {\n rawDataStore.set(id, { x: toF32(data.x), y: toF32(data.y) });\n }\n\n if (config.enabled && brokenXScale && data.x) {\n // Re-warp all series against the (possibly grown) data domain.\n applyTransformations({ syncView: true });\n } else {\n chart._originalUpdateSeries(id, data);\n }\n };\n\n chart.addSeries = (options: any) => {\n if (options.id && options.data?.x && options.data?.y) {\n rawDataStore.set(options.id, { x: toF32(options.data.x), y: toF32(options.data.y) });\n }\n\n if (config.enabled && brokenXScale && options.data?.x) {\n // Add the series (untransformed) so the chart registers it, then\n // warp every series consistently against the data-derived domain.\n chart._originalAddSeries(options);\n applyTransformations({ syncView: true });\n } else {\n chart._originalAddSeries(options);\n }\n };\n\n chart.appendData = (id: string, x: any, y: any) => {\n const raw = rawDataStore.get(id);\n if (raw) {\n const newX = toF32(x);\n const newY = toF32(y);\n const combinedX = new Float32Array(raw.x.length + newX.length);\n const combinedY = new Float32Array(raw.y.length + newY.length);\n combinedX.set(raw.x);\n combinedX.set(newX, raw.x.length);\n combinedY.set(raw.y);\n combinedY.set(newY, raw.y.length);\n rawDataStore.set(id, { x: combinedX, y: combinedY });\n }\n\n if (config.enabled && brokenXScale) {\n applyTransformations({ syncView: true });\n } else {\n chart._originalAppendData(id, x, y);\n }\n };\n\n if (config.enabled) {\n originalXScale = chart.xScale; \n const options = config.axes.default || config.axes.xAxis;\n brokenXScale = new BrokenAxisScale(originalXScale, options?.breaks || []);\n chart.setXScale(brokenXScale);\n }\n },\n onDestroy() {\n if (ctx) {\n const chart = (ctx.chart as any);\n if (originalXScale) {\n chart.setXScale(originalXScale);\n }\n // CLEANUP hijacked methods\n chart.updateSeries = chart._originalUpdateSeries;\n chart.addSeries = chart._originalAddSeries;\n chart.appendData = chart._originalAppendData;\n delete chart._originalUpdateSeries;\n delete chart._originalAddSeries;\n delete chart._originalAppendData;\n }\n ctx = null;\n rawDataStore.clear();\n },\n onRenderOverlay(pCtx) {\n if (config.enabled) drawBreakSymbols(pCtx);\n },\n onViewChange() {\n // Data is warped once against the fixed data-domain; a user zoom/pan is\n // just a linear view over the already-warped buffers, so we must NOT\n // re-warp here (doing so against the transient view domain is exactly\n // what collapsed the chart before). Nothing to do.\n },\n api: pluginApi\n };\n}\n\nexport default PluginBrokenAxis;\n\nexport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n BrokenAxisOptions,\n} from './types';\n"],"names":["BrokenAxisScale","originalScale","breaks","__publicField","min","max","b","a","segments","current","totalVisibleDataWidth","sum","s","totalBreakVisualRatio","currentRatioOffset","dataWidth","visualWidth","range","nextBreak","value","r0","r1","isReverse","ratio","found","prevRange","r","pixel","visualEnd","i","offset","count","allTicks","visualWeight","segmentCount","segmentTicks","rawStep","magnitude","normalized","step","start","ticks","t","manifest","PluginBrokenAxis","config","ctx","originalXScale","brokenXScale","rawDataStore","computeWarpDomain","raw","v","updateScales","options","applyTransformations","opts","chart","domain","id","transformedX","drawBreakSymbols","pCtx","render","ctx2d","plotArea","axisId","orientation","pxStart","pxEnd","midPx","symbol","drawSymbol","x","y","type","edge","toF32","data","_a","_b","_c","newX","newY","combinedX","combinedY","enabled","wasEnabled","newConfig"],"mappings":";;;AAGO,MAAMA,EAAiC;AAAA,EAU5C,YAAYC,GAA8BC,GAAqB;AATxD,IAAAC,EAAA,gBAA2B,CAAC,GAAG,CAAC;AAChC,IAAAA,EAAA,eAA0B,CAAC,GAAG,GAAG;AACxB,IAAAA,EAAA,cAAO;AAEf;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA,sBAA4B,CAAA;AAC5B,IAAAA,EAAA,uBAA2F,CAAA;AAC3F,IAAAA,EAAA,8BAA+B;AAEG,SAAA,SAAAD,GACxC,KAAK,aAAaD,GAClB,KAAK,SAAS,CAAC,GAAGA,EAAc,MAAM,GACtC,KAAK,QAAQ,CAAC,GAAGA,EAAc,KAAK,GACpC,KAAK,QAAA;AAAA,EACP;AAAA,EAEA,UAAUG,GAAaC,GAAmB;AACxC,SAAK,SAAS,CAACD,GAAKC,CAAG,GACvB,KAAK,WAAW,UAAUD,GAAKC,CAAG,GAClC,KAAK,QAAA;AAAA,EACP;AAAA,EAEA,SAASD,GAAaC,GAAmB;AACvC,SAAK,QAAQ,CAACD,GAAKC,CAAG,GACtB,KAAK,WAAW,SAASD,GAAKC,CAAG,GACjC,KAAK,QAAA;AAAA,EACP;AAAA,EAEA,aAAaH,GAAqB;AAChC,SAAK,SAASA,GACd,KAAK,QAAA;AAAA,EACP;AAAA,EAEQ,UAAU;AAChB,UAAM,CAACE,GAAKC,CAAG,IAAI,KAAK;AAGxB,SAAK,eAAe,KAAK,OACtB,OAAO,CAAAC,MAAKA,EAAE,QAAQD,KAAOC,EAAE,MAAMF,CAAG,EACxC,IAAI,CAAAE,OAAM;AAAA,MACT,GAAGA;AAAA,MACH,OAAO,KAAK,IAAIF,GAAKE,EAAE,KAAK;AAAA,MAC5B,KAAK,KAAK,IAAID,GAAKC,EAAE,GAAG;AAAA,MACxB,aAAaA,EAAE,eAAe;AAAA,IAAA,EAC9B,EACD,KAAK,CAACC,GAAGD,MAAMC,EAAE,QAAQD,EAAE,KAAK;AAGnC,UAAME,IAA6C,CAAA;AACnD,QAAIC,IAAUL;AAEd,eAAWE,KAAK,KAAK;AACnB,MAAIA,EAAE,QAAQG,KACZD,EAAS,KAAK,EAAE,OAAOC,GAAS,KAAKH,EAAE,OAAO,GAEhDG,IAAUH,EAAE;AAEd,IAAIG,IAAUJ,KACZG,EAAS,KAAK,EAAE,OAAOC,GAAS,KAAKJ,GAAK;AAI5C,UAAMK,IAAwBF,EAAS,OAAO,CAACG,GAAKC,MAAMD,KAAOC,EAAE,MAAMA,EAAE,QAAQ,CAAC,KAAK,OACnFC,IAAwB,KAAK,aAAa,OAAO,CAACF,GAAKL,MAAMK,KAAOL,EAAE,eAAe,OAAO,CAAC;AACnG,SAAK,uBAAuB,KAAK,IAAI,KAAK,IAAMO,CAAqB;AAGrE,QAAIC,IAAqB;AACzB,SAAK,gBAAgBN,EAAS,IAAI,CAAAI,MAAK;AACrC,YAAMG,IAAYH,EAAE,MAAMA,EAAE,OACtBI,IAAeD,IAAYL,IAAyB,KAAK,sBACzDO,IAAQ;AAAA,QACZ,OAAOL,EAAE;AAAA,QACT,KAAKA,EAAE;AAAA,QACP,aAAaE;AAAA,QACb,YAAYE,IAAcD;AAAA,MAAA,GAItBG,IAAY,KAAK,aAAa,KAAK,CAAAZ,MAAK,KAAK,IAAIA,EAAE,QAAQM,EAAE,GAAG,IAAI,KAAK;AAC/E,aAAAE,KAAsBE,MAAeE,KAAA,gBAAAA,EAAW,gBAAe,IAExDD;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,UAAUE,GAAuB;AAC/B,UAAM,CAACf,GAAKC,CAAG,IAAI,KAAK,QAClB,CAACe,GAAIC,CAAE,IAAI,KAAK,OAChBC,IAAYD,IAAKD;AAEvB,QAAIG,IAAQ;AACZ,QAAIJ,KAASf,EAAK,CAAAmB,IAAQ;AAAA,aACjBJ,KAASd,EAAK,CAAAkB,IAAQ;AAAA,SAC1B;AACD,UAAIC,IAAQ;AAEZ,iBAAWP,KAAS,KAAK;AACvB,YAAIE,KAASF,EAAM,SAASE,KAASF,EAAM,KAAK;AAC9C,UAAAM,IAAQN,EAAM,eAAeE,IAAQF,EAAM,SAASA,EAAM,YAC1DO,IAAQ;AACR;AAAA,QACF;AAIF,UAAI,CAACA;AACD,mBAAWlB,KAAK,KAAK;AACnB,cAAIa,KAASb,EAAE,SAASa,KAASb,EAAE,KAAK;AACtC,kBAAMmB,IAAY,KAAK,cAAc,KAAK,CAAAC,MAAK,KAAK,IAAIA,EAAE,MAAMpB,EAAE,KAAK,IAAI,KAAK;AAEhF,YAAAiB,KADeE,IAAYA,EAAU,eAAeA,EAAU,MAAMA,EAAU,SAASA,EAAU,aAAa,MAC5FN,IAAQb,EAAE,UAAUA,EAAE,MAAMA,EAAE,UAAUA,EAAE,eAAe,OAC3EkB,IAAQ;AACR;AAAA,UACF;AAAA;AAIN,MAAKA,MAAOD,IAAQ;AAAA,IACxB;AAGA,WAAOD,IAAYF,IAAKG,KAASH,IAAKC,KAAMD,IAAKG,KAASF,IAAKD;AAAA,EACjE;AAAA;AAAA,EAGA,WAAWD,GAAuB;AAChC,UAAM,CAACf,GAAKC,CAAG,IAAI,KAAK;AACxB,QAAIc,KAASf,EAAK,QAAO;AACzB,QAAIe,KAASd,EAAK,QAAO;AAEzB,eAAWY,KAAS,KAAK;AACvB,UAAIE,KAASF,EAAM,SAASE,KAASF,EAAM;AACzC,eAAOA,EAAM,eAAeE,IAAQF,EAAM,SAASA,EAAM;AAI7D,eAAWX,KAAK,KAAK;AACnB,UAAIa,KAASb,EAAE,SAASa,KAASb,EAAE,KAAK;AACtC,cAAMmB,IAAY,KAAK,cAAc,KAAK,CAAAC,MAAK,KAAK,IAAIA,EAAE,MAAMpB,EAAE,KAAK,IAAI,KAAK;AAEhF,gBADemB,IAAYA,EAAU,eAAeA,EAAU,MAAMA,EAAU,SAASA,EAAU,aAAa,MAC7FN,IAAQb,EAAE,UAAUA,EAAE,MAAMA,EAAE,UAAUA,EAAE,eAAe;AAAA,MAC5E;AAGF,WAAO;AAAA,EACT;AAAA,EAEA,OAAOqB,GAAuB;AAC5B,UAAM,CAACP,GAAIC,CAAE,IAAI,KAAK,OAChBE,KAASI,IAAQP,MAAOC,IAAKD,IAE7BM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGH,CAAK,CAAC;AAExC,eAAWN,KAAS,KAAK,eAAe;AACtC,YAAMW,IAAYX,EAAM,eAAeA,EAAM,MAAMA,EAAM,SAASA,EAAM;AACxE,UAAIS,KAAKT,EAAM,eAAeS,KAAKE;AACjC,eAAOX,EAAM,SAASS,IAAIT,EAAM,eAAeA,EAAM;AAAA,IAEzD;AAGA,aAASY,IAAI,GAAGA,IAAI,KAAK,aAAa,QAAQA,KAAK;AAC/C,YAAMvB,IAAI,KAAK,aAAauB,CAAC,GACvBJ,IAAY,KAAK,cAAc,KAAK,CAAAR,MAAS,KAAK,IAAIA,EAAM,MAAMX,EAAE,KAAK,IAAI,KAAK,GAClFwB,IAASL,IAAYA,EAAU,eAAeA,EAAU,MAAMA,EAAU,SAASA,EAAU,aAAa;AAC9G,UAAIC,KAAKI,KAAUJ,KAAKI,KAAUxB,EAAE,eAAe;AAC/C,eAAOA,EAAE;AAAA,IAEjB;AAEA,WAAO,KAAK,OAAO,CAAC;AAAA,EACtB;AAAA,EAEA,MAAMyB,IAAgB,IAAc;AAElC,UAAMC,IAAqB,CAAA;AAE3B,eAAWf,KAAS,KAAK,eAAe;AACpC,YAAMgB,KAAgBhB,EAAM,MAAMA,EAAM,UAAU,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAC1EiB,IAAe,KAAK,IAAI,GAAG,KAAK,MAAMH,IAAQE,IAAe,KAAK,oBAAoB,CAAC,GAGvFE,IAAe,KAAK,qBAAqBlB,EAAM,OAAOA,EAAM,KAAKiB,CAAY;AACnF,MAAAF,EAAS,KAAK,GAAGG,CAAY;AAAA,IACjC;AAGA,WAAO,MAAM,KAAK,IAAI,IAAIH,CAAQ,CAAC,EAAE,KAAK,CAACzB,GAAGD,MAAMC,IAAID,CAAC;AAAA,EAC3D;AAAA,EAEQ,qBAAqBF,GAAaC,GAAa0B,GAAyB;AAC5E,UAAMd,IAAQZ,IAAMD;AACpB,QAAIa,KAAS,KAAK,CAAC,SAASA,CAAK,UAAU,CAAA;AAG3C,UAAMmB,IAAUnB,IAAQc,GAClBM,IAAY,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,MAAMD,CAAO,CAAC,CAAC,GACxDE,IAAaF,IAAUC;AAC7B,QAAIE;AACJ,IAAID,IAAa,MAAKC,IAAO,IAAYD,IAAa,IAAGC,IAAO,IAAYD,IAAa,IAAGC,IAAO,IAAQA,IAAO,IAClHA,KAAQF;AAER,UAAMG,IAAQ,KAAK,KAAKpC,IAAMmC,CAAI,IAAIA,GAChCE,IAAkB,CAAA;AACxB,QAAIC,IAAIF;AACR,WAAOE,KAAKrC,IAAMkC,IAAO;AACrB,MAAAE,EAAM,KAAK,KAAK,MAAMC,IAAI,IAAI,IAAI,IAAI,GACtCA,KAAKH;AAET,WAAOE;AAAA,EACX;AACF;ACvMA,MAAME,IAA2B;AAAA,EAC/B,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU,CAAC,eAAe,sBAAsB;AAAA,EAChD,MAAM,CAAC,QAAQ,UAAU,eAAe;AAC1C;AAEO,SAASC,EACdC,IAAiC,EAAE,MAAM,CAAA,KACJ;AAErC,EAAIA,EAAO,YAAY,WAAWA,EAAO,UAAU;AAEnD,MAAIC,IAA4B,MAC5BC,IAAsB,MACtBC,IAAuC;AAG3C,QAAMC,wBAAmB,IAAA;AAGzB,WAASC,IAA6C;AACpD,QAAI9C,IAAM,OACNC,IAAM;AACV,eAAW8C,KAAOF,EAAa;AAC7B,eAASpB,IAAI,GAAGA,IAAIsB,EAAI,EAAE,QAAQtB,KAAK;AACrC,cAAMuB,IAAID,EAAI,EAAEtB,CAAC;AACjB,QAAIuB,IAAIhD,MAAKA,IAAMgD,IACfA,IAAI/C,MAAKA,IAAM+C;AAAA,MACrB;AAEF,WAAI,CAAC,OAAO,SAAShD,CAAG,KAAK,CAAC,OAAO,SAASC,CAAG,KAAKD,MAAQC,IAAY,OACnE,CAACD,GAAKC,CAAG;AAAA,EAClB;AAEA,WAASgD,IAAe;AACtB,QAAI,CAACP,KAAO,CAACD,EAAO,QAAS;AAE7B,UAAMS,IAAUT,EAAO,KAAK,WAAWA,EAAO,KAAK;AACnD,IAAIS,KAAWN,MACXA,EAAa,aAAaM,EAAQ,MAAM,GAExCC,EAAqB,EAAE,UAAU,IAAM;AAAA,EAE7C;AAQA,WAASA,EAAqBC,IAA+B,IAAI;AAC7D,QAAI,CAACV,KAAO,CAACE,KAAgB,CAACH,EAAO,QAAS;AAC9C,UAAMY,IAAQX,EAAI,OAEZY,IAASR,EAAA;AACf,QAAI,CAACQ,EAAQ;AACb,UAAM,CAACtD,GAAKC,CAAG,IAAIqD,GACbzC,IAAQZ,IAAMD,KAAO;AAI3B,IAAA4C,EAAa,UAAU5C,GAAKC,CAAG;AAE/B,eAAW,CAACsD,GAAIR,CAAG,KAAKF,EAAa,WAAW;AAC5C,YAAMW,IAAe,IAAI,aAAaT,EAAI,EAAE,MAAM;AAClD,eAAStB,IAAI,GAAGA,IAAIsB,EAAI,EAAE,QAAQtB;AAC9B,QAAA+B,EAAa/B,CAAC,IAAIzB,IAAM4C,EAAa,WAAWG,EAAI,EAAEtB,CAAC,CAAC,IAAIZ;AAGhE,MAAIwC,EAAM,yBACNA,EAAM,sBAAsBE,GAAI,EAAE,GAAGC,GAAc,GAAGT,EAAI,GAAG;AAAA,IAErE;AAEA,IAAIK,EAAK,YAAY,OAAOC,EAAM,QAAS,cAGvCA,EAAM,KAAK,EAAE,GAAG,CAACrD,GAAKC,CAAG,GAAG,SAAS,IAAO;AAAA,EAEpD;AAEA,WAASwD,EAAiBC,GAAqB;AAC7C,UAAM,EAAE,QAAAC,MAAWD,GACb,EAAE,OAAAE,GAAO,UAAAC,EAAA,IAAaF;AAC5B,QAAI,GAACC,KAAS,CAAChB;AAEf,iBAAW,CAACkB,GAAQZ,CAAO,KAAK,OAAO,QAAQT,EAAO,IAAI,GAAG;AACzD,cAAMsB,IAAeD,MAAW,aAAaA,MAAW,UAAW,eAAe;AAClF,QAAIC,MAAgB,gBAEpBb,EAAQ,OAAO,QAAQ,CAAAhD,MAAK;AACvB,gBAAM8D,IAAUpB,EAAc,UAAU1C,EAAE,KAAK,GACzC+D,IAAQrB,EAAc,UAAU1C,EAAE,GAAG,GACrCgE,KAASF,IAAUC,KAAS,GAE5BE,IAASjE,EAAE,UAAUgD,EAAQ,iBAAiB;AAEpD,UAAAU,EAAM,KAAA,GACNA,EAAM,YAAY,KAClBA,EAAM,cAAcV,EAAQ,eAAe,WAEvCa,MAAgB,iBACjBK,EAAWR,GAAOM,GAAOL,EAAS,GAAGM,GAAQ,KAAK,GAClDC,EAAWR,GAAOM,GAAOL,EAAS,IAAIA,EAAS,QAAQM,GAAQ,QAAQ,IAE1EP,EAAM,QAAA;AAAA,QACX,CAAC;AAAA,MACL;AAAA,EACF;AAEA,WAASQ,EAAW1B,GAA+B2B,GAAWC,GAAWC,GAAcC,GAAc;AAEjG9B,IAAAA,EAAI,UAAA,GACA6B,MAAS,cACT7B,EAAI,OAAO2B,IAAI,GAAMC,IAAI,IAAK,CAAC,GAC/B5B,EAAI,OAAO2B,IAAI,GAAMC,IAAI,IAAK,CAAC,GAC/B5B,EAAI,OAAO2B,IAAI,IAAO,GAAGC,IAAI,IAAK,CAAC,GACnC5B,EAAI,OAAO2B,IAAI,IAAO,GAAGC,IAAI,IAAK,CAAC,KAC5BC,MAAS,YAChB7B,EAAI,OAAO2B,IAAI,GAAMC,CAAC,GACtB5B,EAAI,OAAO2B,IAAI,IAAK,GAAGC,IAAI,IAAK,CAAC,GACjC5B,EAAI,OAAO2B,IAAI,IAAK,GAAGC,IAAI,IAAK,CAAC,GACjC5B,EAAI,OAAO2B,IAAI,GAAMC,CAAC,KAElBE,MAAS,SAASA,MAAS,YAC3B9B,EAAI,OAAO2B,IAAI,GAAMC,IAAI,CAAC,GAAG5B,EAAI,OAAO2B,IAAI,GAAMC,IAAI,CAAC,GACvD5B,EAAI,OAAO2B,IAAI,GAAMC,IAAI,CAAC,GAAG5B,EAAI,OAAO2B,IAAI,GAAMC,IAAI,CAAC,MAEvD5B,EAAI,OAAO2B,IAAI,GAAGC,IAAI,CAAI,GAAG5B,EAAI,OAAO2B,IAAI,GAAGC,IAAI,CAAI,IAG/D5B,EAAI,OAAA;AAAA,EACR;AAkDA,SAAO;AAAA,IACL,UAAAH;AAAA,IACA,OAAOmB,GAAM;AACX,MAAAhB,IAAMgB;AACN,YAAML,IAAQX,EAAI;AAOlB,MAAAW,EAAM,wBAAwBA,EAAM,aAAa,KAAKA,CAAK,GAC3DA,EAAM,qBAAqBA,EAAM,UAAU,KAAKA,CAAK,GACrDA,EAAM,sBAAsBA,EAAM,WAAW,KAAKA,CAAK;AAEvD,YAAMoB,IAAQ,CAACzB,MACXA,aAAa,eAAeA,IAAI,IAAI,aAAa,OAAOA,KAAM,WAAW,CAACA,CAAC,IAAIA,CAAC;AAmDpF,UAjDAK,EAAM,eAAe,CAACE,GAAYmB,MAAc;AAC5C,QAAIA,EAAK,KAAKA,EAAK,KACf7B,EAAa,IAAIU,GAAI,EAAE,GAAGkB,EAAMC,EAAK,CAAC,GAAG,GAAGD,EAAMC,EAAK,CAAC,GAAG,GAG3DjC,EAAO,WAAWG,KAAgB8B,EAAK,IAEvCvB,EAAqB,EAAE,UAAU,IAAM,IAEvCE,EAAM,sBAAsBE,GAAImB,CAAI;AAAA,MAE5C,GAEArB,EAAM,YAAY,CAACH,MAAiB;ADtOnC,YAAAyB,GAAAC,GAAAC;ACuOG,QAAI3B,EAAQ,QAAMyB,IAAAzB,EAAQ,SAAR,QAAAyB,EAAc,QAAKC,IAAA1B,EAAQ,SAAR,QAAA0B,EAAc,MAC/C/B,EAAa,IAAIK,EAAQ,IAAI,EAAE,GAAGuB,EAAMvB,EAAQ,KAAK,CAAC,GAAG,GAAGuB,EAAMvB,EAAQ,KAAK,CAAC,GAAG,GAGnFT,EAAO,WAAWG,OAAgBiC,IAAA3B,EAAQ,SAAR,QAAA2B,EAAc,MAGhDxB,EAAM,mBAAmBH,CAAO,GAChCC,EAAqB,EAAE,UAAU,IAAM,KAEvCE,EAAM,mBAAmBH,CAAO;AAAA,MAExC,GAEAG,EAAM,aAAa,CAACE,GAAYc,GAAQC,MAAW;AAC/C,cAAMvB,IAAMF,EAAa,IAAIU,CAAE;AAC/B,YAAIR,GAAK;AACL,gBAAM+B,IAAOL,EAAMJ,CAAC,GACdU,IAAON,EAAMH,CAAC,GACdU,IAAY,IAAI,aAAajC,EAAI,EAAE,SAAS+B,EAAK,MAAM,GACvDG,IAAY,IAAI,aAAalC,EAAI,EAAE,SAASgC,EAAK,MAAM;AAC7D,UAAAC,EAAU,IAAIjC,EAAI,CAAC,GACnBiC,EAAU,IAAIF,GAAM/B,EAAI,EAAE,MAAM,GAChCkC,EAAU,IAAIlC,EAAI,CAAC,GACnBkC,EAAU,IAAIF,GAAMhC,EAAI,EAAE,MAAM,GAChCF,EAAa,IAAIU,GAAI,EAAE,GAAGyB,GAAW,GAAGC,GAAW;AAAA,QACvD;AAEA,QAAIxC,EAAO,WAAWG,IAClBO,EAAqB,EAAE,UAAU,IAAM,IAEvCE,EAAM,oBAAoBE,GAAIc,GAAGC,CAAC;AAAA,MAE1C,GAEI7B,EAAO,SAAS;AAChB,QAAAE,IAAiBU,EAAM;AACvB,cAAMH,IAAUT,EAAO,KAAK,WAAWA,EAAO,KAAK;AACnD,QAAAG,IAAe,IAAIhD,EAAgB+C,IAAgBO,KAAA,gBAAAA,EAAS,WAAU,CAAA,CAAE,GACxEG,EAAM,UAAUT,CAAY;AAAA,MAChC;AAAA,IACF;AAAA,IACA,YAAY;AACR,UAAIF,GAAK;AACL,cAAMW,IAASX,EAAI;AACnB,QAAIC,KACAU,EAAM,UAAUV,CAAc,GAGlCU,EAAM,eAAeA,EAAM,uBAC3BA,EAAM,YAAYA,EAAM,oBACxBA,EAAM,aAAaA,EAAM,qBACzB,OAAOA,EAAM,uBACb,OAAOA,EAAM,oBACb,OAAOA,EAAM;AAAA,MACjB;AACA,MAAAX,IAAM,MACNG,EAAa,MAAA;AAAA,IACjB;AAAA,IACA,gBAAgBa,GAAM;AAClB,MAAIjB,EAAO,WAASgB,EAAiBC,CAAI;AAAA,IAC7C;AAAA,IACA,eAAe;AAAA,IAKf;AAAA,IACA,KApJyB;AAAA,MACvB,SAASI,GAAQ5D,GAAG;AAChB,QAAKuC,EAAO,KAAKqB,CAAM,MAAGrB,EAAO,KAAKqB,CAAM,IAAI,EAAE,QAAQ,GAAC,IAC3DrB,EAAO,KAAKqB,CAAM,EAAE,OAAO,KAAK5D,CAAC,GACjC+C,EAAA,GACAP,KAAA,QAAAA,EAAK;AAAA,MACT;AAAA,MACA,YAAYoB,GAAQ;AAChB,QAAIrB,EAAO,KAAKqB,CAAM,QAAU,KAAKA,CAAM,EAAE,SAAS,CAAA,IACtDb,EAAA,GACAP,KAAA,QAAAA,EAAK;AAAA,MACT;AAAA,MACA,WAAWwC,GAAkB;ADnK5B,YAAAP;ACoKG,cAAMQ,IAAa1C,EAAO;AAG1B,YAFAA,EAAO,UAAUyC,GAEbxC,KAAOyC,MAAeD,GAAS;AAC/B,gBAAM7B,IAAQX,EAAI;AAClB,cAAIwC;AACA,YAAAvC,IAAkBU,EAAc,QAChCT,IAAe,IAAIhD,EAAgB+C,KAAiBgC,IAAAlC,EAAO,KAAK,WAAWA,EAAO,KAAK,UAAnC,gBAAAkC,EAA2C,WAAU,CAAA,CAAE,GAC3GtB,EAAM,UAAUT,CAAY,GAC5BO,EAAqB,EAAE,UAAU,IAAM;AAAA,mBAEnCR,GAAgB;AAChB,YAAAU,EAAM,UAAUV,CAAc,GAC9BC,IAAe;AAEf,uBAAW,CAACW,GAAIR,CAAG,KAAKF,EAAa;AAChC,cAAAQ,EAAc,sBAAsBE,GAAIR,CAAG;AAAA,UAEpD;AAAA,QAER;AACA,QAAAL,KAAA,QAAAA,EAAK;AAAA,MACT;AAAA,MACA,UAAUoB,GAA6B;AD3LtC,YAAAa;AC4LG,iBAAOA,IAAAlC,EAAO,KAAKqB,CAAM,MAAlB,gBAAAa,EAAqB,WAAU,CAAA;AAAA,MAC1C;AAAA,MACA,aAAaS,GAA4C;AACrD,eAAO,OAAO3C,GAAQ2C,CAAS,GAC/BnC,EAAA,GACAP,KAAA,QAAAA,EAAK;AAAA,MACT;AAAA,IAAA;AAAA,EAyGG;AAET;"}
@@ -1,6 +1,11 @@
1
1
  import { ForecastingMethod, ForecastingParams, ForecastingResult } from './types';
2
2
 
3
3
  /**
4
- * Main dispatcher for forecasting algorithms
4
+ * Main dispatcher for forecasting algorithms.
5
5
  */
6
- export declare function calculateForecast(x: number[] | Float64Array | Float32Array, y: number[] | Float64Array | Float32Array, method: ForecastingMethod, horizon: number, params?: ForecastingParams): ForecastingResult;
6
+ export declare function calculateForecast(x: number[] | Float64Array | Float32Array, y: number[] | Float64Array | Float32Array, method: ForecastingMethod, horizon: number, params?: ForecastingParams, confidence?: number): ForecastingResult;
7
+ /**
8
+ * Solve `A x = b` for a square matrix via Gaussian elimination with partial
9
+ * pivoting. Returns [] if the matrix is singular.
10
+ */
11
+ export declare function gaussianSolve(A: number[][], b: number[]): number[];