velo-plot 2.0.0 → 3.0.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.
- package/README.md +15 -8
- package/dist/{ChartCore-BhQ4j7f5.js → ChartCore-BpzRvN4Y.js} +998 -855
- package/dist/ChartCore-BpzRvN4Y.js.map +1 -0
- package/dist/a11y-Bw6urYpr.js +105 -0
- package/dist/a11y-Bw6urYpr.js.map +1 -0
- package/dist/angular/hooks-entry.d.ts +1 -0
- package/dist/angular/hooks.d.ts +26 -0
- package/dist/angular/index.d.ts +8 -0
- package/dist/angular/velo-plot.component.d.ts +46 -0
- package/dist/angular-hooks.d.ts +1 -0
- package/dist/angular-hooks.js +9 -0
- package/dist/angular-hooks.js.map +1 -0
- package/dist/angular.d.ts +1 -0
- package/dist/angular.js +166 -0
- package/dist/angular.js.map +1 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -1
- package/dist/astro/StackedPlot.astro +19 -0
- package/dist/astro/VeloPlot.astro +23 -0
- package/dist/{axisFormat-SPX-CD5s.js → axisFormat-CzumxpCL.js} +3 -3
- package/dist/axisFormat-CzumxpCL.js.map +1 -0
- package/dist/bindings/shared/a11y.d.ts +26 -0
- package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
- package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
- package/dist/bindings/shared/dimensions.d.ts +1 -0
- package/dist/bindings/shared/index.d.ts +9 -0
- package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
- package/dist/bindings/shared/optionsSync.d.ts +7 -0
- package/dist/bindings/shared/seriesDiff.d.ts +8 -0
- package/dist/bindings/shared/stackedSync.d.ts +9 -0
- package/dist/bindings/shared/types.d.ts +46 -0
- package/dist/bindings/test-utils/index.d.ts +35 -0
- package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
- package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
- package/dist/chartSyncBridge-DbWrwtyP.js +57 -0
- package/dist/chartSyncBridge-DbWrwtyP.js.map +1 -0
- package/dist/core/Chart.d.ts +1 -1
- package/dist/core/InteractionManager.d.ts +7 -1
- package/dist/core/OverlayRenderer.d.ts +5 -0
- package/dist/core/annotations/types.d.ts +1 -1
- package/dist/core/chart/ChartAxisManager.d.ts +2 -0
- package/dist/core/chart/ChartCore.d.ts +17 -2
- package/dist/core/chart/ChartPluginBridge.d.ts +1 -0
- package/dist/core/chart/ChartRenderLoop.d.ts +2 -0
- package/dist/core/chart/ChartStateManager.d.ts +2 -0
- package/dist/core/chart/types.d.ts +6 -1
- package/dist/core/clipboard/index.d.ts +1 -1
- package/dist/core/debug/index.d.ts +1 -1
- package/dist/core/keybindings/index.d.ts +1 -1
- package/dist/core/loading/index.d.ts +1 -1
- package/dist/core/locale/index.d.ts +1 -1
- package/dist/core/stacked/paneResize.d.ts +3 -0
- package/dist/core/stacked/types.d.ts +10 -0
- package/dist/core/sync/index.d.ts +0 -1
- package/dist/core/theme-editor/index.d.ts +1 -1
- package/dist/createStackedChart-Dm-YqUT7.js +756 -0
- package/dist/createStackedChart-Dm-YqUT7.js.map +1 -0
- package/dist/examples/PluginDemonstration.d.ts +1 -1
- package/dist/gpuRenderer-BpaMYz-k.js.map +1 -1
- package/dist/hooks-CYPCxoZx.js +69 -0
- package/dist/hooks-CYPCxoZx.js.map +1 -0
- package/dist/{index-D7dTq6VB.js → index-0InEyj0q.js} +130 -134
- package/dist/index-0InEyj0q.js.map +1 -0
- package/dist/index-BMiZoKmm.js.map +1 -1
- package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
- package/dist/index-CWxIHdwX.js.map +1 -0
- package/dist/{index-CUGS98p4.js → index-CaXWSOTk.js} +3 -6
- package/dist/index-CaXWSOTk.js.map +1 -0
- package/dist/index-Dag88bW4.js.map +1 -1
- package/dist/index-qhscKTDy.js.map +1 -1
- package/dist/{index-CWipqOLP.js → index-qunX30Xu.js} +2 -2
- package/dist/index-qunX30Xu.js.map +1 -0
- package/dist/index-x4stH3jD.js.map +1 -1
- package/dist/{index.core-fpZ1dYN0.js → index.core-BmZe2jRQ.js} +30 -29
- package/dist/index.core-BmZe2jRQ.js.map +1 -0
- package/dist/index.core.d.ts +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/indicators--eJGmVox.js.map +1 -1
- package/dist/{mockDatafeed-Cdg5hKEo.js → mockDatafeed-DHIDPcpX.js} +150 -146
- package/dist/mockDatafeed-DHIDPcpX.js.map +1 -0
- package/dist/optionsSync-QUiN4Inw.js +119 -0
- package/dist/optionsSync-QUiN4Inw.js.map +1 -0
- package/dist/plugins/3d/index.d.ts +2 -2
- package/dist/plugins/3d.d.ts +2 -2
- package/dist/plugins/3d.js.map +1 -1
- package/dist/plugins/analysis/contours.d.ts +31 -0
- package/dist/plugins/analysis/index.d.ts +1 -1
- package/dist/plugins/analysis/indicators.d.ts +1 -1
- package/dist/plugins/analysis.d.ts +2 -2
- package/dist/plugins/analysis.js +495 -408
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/annotations/index.d.ts +1 -1
- package/dist/plugins/annotations.d.ts +2 -2
- package/dist/plugins/annotations.js.map +1 -1
- package/dist/plugins/anomaly-detection.js +1 -1
- package/dist/plugins/anomaly-detection.js.map +1 -1
- package/dist/plugins/broken-axis.d.ts +2 -2
- package/dist/plugins/broken-axis.js +170 -181
- package/dist/plugins/broken-axis.js.map +1 -1
- package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
- package/dist/plugins/builtins/index.d.ts +1 -1
- package/dist/plugins/caching.d.ts +2 -2
- package/dist/plugins/clipboard/index.d.ts +2 -2
- package/dist/plugins/clipboard.d.ts +2 -2
- package/dist/plugins/clipboard.js.map +1 -1
- package/dist/plugins/context-menu/index.d.ts +1 -1
- package/dist/plugins/context-menu.d.ts +2 -2
- package/dist/plugins/context-menu.js +1 -1
- package/dist/plugins/context-menu.js.map +1 -1
- package/dist/plugins/data-export/index.d.ts +1 -1
- package/dist/plugins/data-export.d.ts +2 -2
- package/dist/plugins/data-export.js +2 -2
- package/dist/plugins/data-export.js.map +1 -1
- package/dist/plugins/data-transform.d.ts +2 -2
- package/dist/plugins/data-transform.js +19 -19
- package/dist/plugins/data-transform.js.map +1 -1
- package/dist/plugins/debug/index.d.ts +2 -2
- package/dist/plugins/debug.d.ts +2 -2
- package/dist/plugins/debug.js +2 -2
- package/dist/plugins/debug.js.map +1 -1
- package/dist/plugins/forecasting/algorithms.d.ts +7 -2
- package/dist/plugins/forecasting/index.d.ts +1 -1
- package/dist/plugins/forecasting/types.d.ts +13 -3
- package/dist/plugins/forecasting.js +355 -175
- package/dist/plugins/forecasting.js.map +1 -1
- package/dist/plugins/gpu/index.d.ts +2 -2
- package/dist/plugins/gpu.d.ts +2 -2
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/i18n/index.d.ts +2 -2
- package/dist/plugins/i18n.d.ts +2 -2
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/keyboard.d.ts +2 -2
- package/dist/plugins/keyboard.js +65 -5
- package/dist/plugins/keyboard.js.map +1 -1
- package/dist/plugins/latex/symbols.d.ts +50 -0
- package/dist/plugins/latex/types.d.ts +13 -1
- package/dist/plugins/latex.js +351 -331
- package/dist/plugins/latex.js.map +1 -1
- package/dist/plugins/lazy-load.d.ts +2 -2
- package/dist/plugins/loading/index.d.ts +1 -1
- package/dist/plugins/loading.d.ts +2 -2
- package/dist/plugins/ml-integration/native-algorithms.d.ts +24 -4
- package/dist/plugins/ml-integration/types.d.ts +19 -0
- package/dist/plugins/ml-integration.d.ts +2 -2
- package/dist/plugins/ml-integration.js +190 -139
- package/dist/plugins/ml-integration.js.map +1 -1
- package/dist/plugins/offscreen.d.ts +2 -2
- package/dist/plugins/pattern-recognition/types.d.ts +28 -1
- package/dist/plugins/pattern-recognition.d.ts +2 -2
- package/dist/plugins/pattern-recognition.js +417 -344
- package/dist/plugins/pattern-recognition.js.map +1 -1
- package/dist/plugins/radar.d.ts +2 -2
- package/dist/plugins/regression.d.ts +2 -2
- package/dist/plugins/regression.js +1 -1
- package/dist/plugins/regression.js.map +1 -1
- package/dist/plugins/roi.js +9 -9
- package/dist/plugins/roi.js.map +1 -1
- package/dist/plugins/snapshot/index.d.ts +1 -1
- package/dist/plugins/snapshot/types.d.ts +1 -1
- package/dist/plugins/snapshot.d.ts +2 -2
- package/dist/plugins/snapshot.js +36 -36
- package/dist/plugins/snapshot.js.map +1 -1
- package/dist/plugins/streaming/index.d.ts +2 -2
- package/dist/plugins/streaming.d.ts +2 -2
- package/dist/plugins/sync/index.d.ts +3 -2
- package/dist/plugins/sync.d.ts +2 -2
- package/dist/plugins/sync.js +1 -1
- package/dist/plugins/sync.js.map +1 -1
- package/dist/plugins/theme-editor/index.d.ts +1 -1
- package/dist/plugins/theme-editor.d.ts +2 -2
- package/dist/plugins/tools/index.d.ts +1 -1
- package/dist/plugins/tools/tooltip/index.d.ts +1 -1
- package/dist/plugins/tools.d.ts +2 -2
- package/dist/plugins/tools.js +1 -1
- package/dist/plugins/types.d.ts +1 -1
- package/dist/plugins/video-recorder.d.ts +2 -2
- package/dist/plugins/virtualization.d.ts +2 -2
- package/dist/plugins/virtualization.js +1 -1
- package/dist/pool-DZ8shSqv.js +109 -0
- package/dist/pool-DZ8shSqv.js.map +1 -0
- package/dist/react/StackedPlot.d.ts +31 -0
- package/dist/react/VeloPlot.d.ts +29 -0
- package/dist/react/index.d.ts +25 -3
- package/dist/react/useChartSync.d.ts +8 -0
- package/dist/react/useIndicator.d.ts +12 -0
- package/dist/react/useVeloPlot.d.ts +19 -0
- package/dist/react.js +328 -24
- package/dist/react.js.map +1 -1
- package/dist/scientific/index.d.ts +48 -0
- package/dist/scientific.d.ts +1 -0
- package/dist/scientific.js +91 -0
- package/dist/scientific.js.map +1 -0
- package/dist/solid/VeloPlot.d.ts +16 -0
- package/dist/solid/index.d.ts +13 -0
- package/dist/solid/useChartSync.d.ts +6 -0
- package/dist/solid/useIndicator.d.ts +11 -0
- package/dist/solid/useStackedPlot.d.ts +14 -0
- package/dist/solid/useVeloPlot.d.ts +18 -0
- package/dist/solid.d.ts +1 -0
- package/dist/solid.js +172 -0
- package/dist/solid.js.map +1 -0
- package/dist/stackedSync-tnrunZMt.js +100 -0
- package/dist/stackedSync-tnrunZMt.js.map +1 -0
- package/dist/svelte/StackedPlot.svelte +29 -0
- package/dist/svelte/StackedPlot.test.ts +114 -0
- package/dist/svelte/VeloPlot.svelte +44 -0
- package/dist/svelte/VeloPlot.test.ts +105 -0
- package/dist/svelte/index.d.ts +11 -0
- package/dist/svelte/index.test.ts +20 -0
- package/dist/svelte/index.ts +15 -0
- package/dist/svelte/useChartSync.d.ts +8 -0
- package/dist/svelte/useChartSync.test.ts +49 -0
- package/dist/svelte/useChartSync.ts +29 -0
- package/dist/svelte/useIndicator.d.ts +13 -0
- package/dist/svelte/useIndicator.test.ts +67 -0
- package/dist/svelte/useIndicator.ts +43 -0
- package/dist/svelte/useStackedPlot.d.ts +16 -0
- package/dist/svelte/useStackedPlot.test.ts +76 -0
- package/dist/svelte/useStackedPlot.ts +54 -0
- package/dist/svelte/useVeloPlot.d.ts +21 -0
- package/dist/svelte/useVeloPlot.test.ts +100 -0
- package/dist/svelte/useVeloPlot.ts +81 -0
- package/dist/svelte.d.ts +1 -0
- package/dist/svelte.js +143 -0
- package/dist/svelte.js.map +1 -0
- package/dist/symbols-DT0eLlpW.js +568 -0
- package/dist/symbols-DT0eLlpW.js.map +1 -0
- package/dist/testing/index.d.ts +1 -1
- package/dist/theme/index.d.ts +2 -1
- package/dist/trading.js +7 -7
- package/dist/types.d.ts +1 -1
- package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
- package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
- package/dist/velo-plot.full.js +444 -433
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +15 -15
- package/dist/vue/StackedPlot.vue.d.ts +48 -0
- package/dist/vue/VeloPlot.vue.d.ts +64 -0
- package/dist/vue/index.d.ts +250 -0
- package/dist/vue/useChartSync.d.ts +52 -0
- package/dist/vue/useIndicator.d.ts +23 -0
- package/dist/vue/useStackedPlot.d.ts +15 -0
- package/dist/vue/useVeloPlot.d.ts +20 -0
- package/dist/vue.d.ts +1 -0
- package/dist/vue.js +312 -0
- package/dist/vue.js.map +1 -0
- package/dist/workers/indicatorsAsync.d.ts +26 -0
- package/dist/workers/pool.d.ts +9 -0
- package/package.json +88 -10
- package/dist/ChartCore-BhQ4j7f5.js.map +0 -1
- package/dist/SciPlot-GJvw7GJo.js +0 -463
- package/dist/SciPlot-GJvw7GJo.js.map +0 -1
- package/dist/axisFormat-SPX-CD5s.js.map +0 -1
- package/dist/createStackedChart-DJSmqerD.js +0 -706
- package/dist/createStackedChart-DJSmqerD.js.map +0 -1
- package/dist/index-CUGS98p4.js.map +0 -1
- package/dist/index-CWipqOLP.js.map +0 -1
- package/dist/index-D7dTq6VB.js.map +0 -1
- package/dist/index-DoYxf1cV.js.map +0 -1
- package/dist/index.core-fpZ1dYN0.js.map +0 -1
- package/dist/mockDatafeed-Cdg5hKEo.js.map +0 -1
- package/dist/pool-15HMCNv8.js +0 -88
- package/dist/pool-15HMCNv8.js.map +0 -1
- package/dist/react/SciPlot.d.ts +0 -60
- package/dist/react/useSciPlot.d.ts +0 -56
|
@@ -1,128 +1,128 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
class
|
|
5
|
-
constructor(e,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
this.breaks =
|
|
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,
|
|
17
|
-
this.domain = [e,
|
|
16
|
+
setDomain(e, r) {
|
|
17
|
+
this.domain = [e, r], this.underlying.setDomain(e, r), this.refresh();
|
|
18
18
|
}
|
|
19
|
-
setRange(e,
|
|
20
|
-
this.range = [e,
|
|
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,
|
|
27
|
-
this.sortedBreaks = this.breaks.filter((
|
|
28
|
-
...
|
|
29
|
-
start: Math.max(e,
|
|
30
|
-
end: Math.min(
|
|
31
|
-
visualRatio:
|
|
32
|
-
})).sort((
|
|
33
|
-
const
|
|
34
|
-
let
|
|
35
|
-
for (const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
this.availableVisualRatio = Math.max(0.1, 1 -
|
|
40
|
-
let
|
|
41
|
-
this.visibleRanges =
|
|
42
|
-
const f =
|
|
43
|
-
start:
|
|
44
|
-
end:
|
|
45
|
-
pixelOffset:
|
|
46
|
-
pixelScale:
|
|
47
|
-
},
|
|
48
|
-
return
|
|
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 [
|
|
53
|
-
let
|
|
54
|
-
if (e <=
|
|
55
|
-
else if (e >=
|
|
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
|
|
57
|
+
let i = !1;
|
|
58
58
|
for (const f of this.visibleRanges)
|
|
59
59
|
if (e >= f.start && e <= f.end) {
|
|
60
|
-
|
|
60
|
+
c = f.pixelOffset + (e - f.start) * f.pixelScale, i = !0;
|
|
61
61
|
break;
|
|
62
62
|
}
|
|
63
|
-
if (!
|
|
63
|
+
if (!i) {
|
|
64
64
|
for (const f of this.sortedBreaks)
|
|
65
65
|
if (e >= f.start && e <= f.end) {
|
|
66
|
-
const
|
|
67
|
-
|
|
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
|
-
|
|
71
|
+
i || (c = 0);
|
|
72
72
|
}
|
|
73
|
-
return
|
|
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 [
|
|
78
|
-
if (e <=
|
|
79
|
-
if (e >=
|
|
80
|
-
for (const
|
|
81
|
-
if (e >=
|
|
82
|
-
return
|
|
83
|
-
for (const
|
|
84
|
-
if (e >=
|
|
85
|
-
const
|
|
86
|
-
return (
|
|
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 [
|
|
92
|
-
for (const
|
|
93
|
-
const
|
|
94
|
-
if (
|
|
95
|
-
return
|
|
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
|
|
98
|
-
const
|
|
99
|
-
if (
|
|
100
|
-
return
|
|
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
|
|
106
|
-
for (const
|
|
107
|
-
const
|
|
108
|
-
|
|
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(
|
|
110
|
+
return Array.from(new Set(r)).sort((l, n) => l - n);
|
|
111
111
|
}
|
|
112
|
-
generateSegmentTicks(e,
|
|
113
|
-
const
|
|
114
|
-
if (
|
|
115
|
-
const
|
|
116
|
-
let
|
|
117
|
-
|
|
118
|
-
const f = Math.ceil(e /
|
|
119
|
-
let
|
|
120
|
-
for (;
|
|
121
|
-
|
|
122
|
-
return
|
|
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
|
|
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,
|
|
135
|
-
const
|
|
136
|
-
function
|
|
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 &&
|
|
148
|
+
t && l && (l.updateBreaks(t.breaks), c({ syncView: !0 }));
|
|
140
149
|
}
|
|
141
|
-
function c() {
|
|
142
|
-
if (!e || !
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
|
152
|
-
const { render: s } = t, { ctx2d:
|
|
153
|
-
if (!(!
|
|
154
|
-
for (const [
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
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
|
|
163
|
-
t.beginPath(),
|
|
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:
|
|
179
|
+
manifest: B,
|
|
197
180
|
onInit(t) {
|
|
198
181
|
e = t;
|
|
199
182
|
const s = e.chart;
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
const
|
|
218
|
-
|
|
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
|
-
|
|
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
|
-
|
|
198
|
+
r = s.xScale;
|
|
238
199
|
const a = d.axes.default || d.axes.xAxis;
|
|
239
|
-
|
|
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
|
-
|
|
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,
|
|
208
|
+
e = null, n.clear();
|
|
248
209
|
},
|
|
249
210
|
onRenderOverlay(t) {
|
|
250
|
-
d.enabled &&
|
|
211
|
+
d.enabled && i(t);
|
|
251
212
|
},
|
|
252
213
|
onViewChange() {
|
|
253
|
-
d.enabled && n && c();
|
|
254
214
|
},
|
|
255
|
-
api:
|
|
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":"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"}
|
|
@@ -12,7 +12,7 @@ export interface CrosshairPluginConfig {
|
|
|
12
12
|
/** Line width (default: 1) */
|
|
13
13
|
lineWidth?: number;
|
|
14
14
|
/**
|
|
15
|
-
* @deprecated Use valueDisplayMode instead
|
|
15
|
+
* @deprecated Use valueDisplayMode instead. **Removed in v4.0.**
|
|
16
16
|
* Show axis labels (will be converted to valueDisplayMode)
|
|
17
17
|
*/
|
|
18
18
|
showAxisLabels?: boolean;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from './caching/index'
|
|
2
|
-
import
|
|
3
|
-
export default
|
|
2
|
+
import VeloPlot from './caching/index'
|
|
3
|
+
export default VeloPlot
|