velo-plot 3.0.0 → 3.1.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 +22 -15
- package/dist/ChartCore-AnR_3Xkb.js +7338 -0
- package/dist/ChartCore-AnR_3Xkb.js.map +1 -0
- package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
- package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
- package/dist/{index.core-BmZe2jRQ.js → PluginRegistry-CzMHebYP.js} +19 -33
- package/dist/PluginRegistry-CzMHebYP.js.map +1 -0
- package/dist/angular-hooks.js +1 -1
- package/dist/angular.js +8 -8
- package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
- package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
- package/dist/{chartSyncBridge-DbWrwtyP.js → chartSyncBridge-D_rCtbFq.js} +12 -11
- package/dist/{chartSyncBridge-DbWrwtyP.js.map → chartSyncBridge-D_rCtbFq.js.map} +1 -1
- package/dist/core/ChartStatistics.d.ts +1 -1
- package/dist/core/chart/ChartCore.d.ts +12 -17
- package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
- package/dist/core/chart/chartExportPatch.d.ts +2 -0
- package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
- package/dist/core/chart/series/SeriesActions.d.ts +1 -0
- package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
- package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
- package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
- package/dist/createStackedChart-DqcLCFGS.js +1338 -0
- package/dist/createStackedChart-DqcLCFGS.js.map +1 -0
- package/dist/{hooks-CYPCxoZx.js → hooks-DH-3bewj.js} +7 -7
- package/dist/{hooks-CYPCxoZx.js.map → hooks-DH-3bewj.js.map} +1 -1
- package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
- package/dist/index-B7PTX94B.js.map +1 -0
- package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
- package/dist/index-BgrvqltV.js.map +1 -0
- package/dist/index-Cv6ZDLWf.js +521 -0
- package/dist/index-Cv6ZDLWf.js.map +1 -0
- package/dist/index-qhscKTDy.js.map +1 -1
- package/dist/index.core.d.ts +8 -6
- package/dist/index.d.ts +1 -14
- package/dist/plugins/3d.js +3 -1
- package/dist/plugins/3d.js.map +1 -1
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/createPlugin.d.ts +8 -0
- package/dist/plugins/debug.js +32 -32
- package/dist/plugins/debug.js.map +1 -1
- package/dist/plugins/gpu.js +2033 -209
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/i18n.js +286 -23
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/latex.js +766 -207
- package/dist/plugins/latex.js.map +1 -1
- package/dist/plugins/loading/index.d.ts +1 -2
- package/dist/plugins/loading.js +3 -4
- package/dist/plugins/offscreen.js +11 -10
- package/dist/plugins/offscreen.js.map +1 -1
- package/dist/plugins/regression.js +254 -256
- package/dist/plugins/regression.js.map +1 -1
- package/dist/plugins/streaming.js +1 -1
- package/dist/plugins/tools.js +1 -1
- package/dist/react.js +55 -58
- package/dist/react.js.map +1 -1
- package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
- package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
- package/dist/renderer/native/draw.d.ts +2 -47
- package/dist/renderer/native/drawCore.d.ts +27 -0
- package/dist/renderer/native/drawExtended.d.ts +29 -0
- package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
- package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
- package/dist/renderer/native/programFactoryCore.d.ts +6 -0
- package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
- package/dist/renderer/native/utils.d.ts +3 -29
- package/dist/renderer/native/utilsCore.d.ts +14 -0
- package/dist/renderer/native/utilsExtended.d.ts +17 -0
- package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
- package/dist/renderer/registerExtendedSeries.d.ts +1 -0
- package/dist/renderer/registerWebGPU.d.ts +2 -0
- package/dist/renderer/seriesBufferExtended.d.ts +4 -0
- package/dist/scientific/index.d.ts +1 -5
- package/dist/scientific/registerScientific.d.ts +1 -0
- package/dist/scientific.js +41 -41
- package/dist/solid.js +56 -59
- package/dist/solid.js.map +1 -1
- package/dist/svelte.js +26 -29
- package/dist/svelte.js.map +1 -1
- package/dist/trading/index.d.ts +1 -4
- package/dist/trading/registerTrading.d.ts +3 -0
- package/dist/trading.js +42 -42
- package/dist/types.d.ts +3 -3
- package/dist/velo-plot.full.js +2212 -1351
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +33 -28
- package/dist/velo-plot.js.map +1 -1
- package/dist/vue/index.d.ts +2 -2
- package/dist/vue.js +17 -20
- package/dist/vue.js.map +1 -1
- package/package.json +9 -1
- package/dist/ChartCore-BpzRvN4Y.js +0 -8467
- package/dist/ChartCore-BpzRvN4Y.js.map +0 -1
- package/dist/createStackedChart-Dm-YqUT7.js +0 -756
- package/dist/createStackedChart-Dm-YqUT7.js.map +0 -1
- package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
- package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
- package/dist/index-BMiZoKmm.js.map +0 -1
- package/dist/index-qunX30Xu.js.map +0 -1
- package/dist/index-x4stH3jD.js +0 -282
- package/dist/index-x4stH3jD.js.map +0 -1
- package/dist/index.core-BmZe2jRQ.js.map +0 -1
- package/dist/mockDatafeed-DHIDPcpX.js +0 -515
- package/dist/mockDatafeed-DHIDPcpX.js.map +0 -1
- package/dist/symbols-DT0eLlpW.js +0 -568
- package/dist/symbols-DT0eLlpW.js.map +0 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
var a = Object.defineProperty;
|
|
2
|
+
var n = (r, e, t) => e in r ? a(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
|
|
3
|
+
var s = (r, e, t) => n(r, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { GpuRenderer as h } from "./plugins/gpu.js";
|
|
5
|
+
const u = {};
|
|
6
|
+
class o {
|
|
7
|
+
constructor(e, t) {
|
|
8
|
+
s(this, "gpu");
|
|
9
|
+
s(this, "dpr");
|
|
10
|
+
s(this, "canvas");
|
|
11
|
+
this.gpu = e, this.canvas = t, this.dpr = window.devicePixelRatio || 1;
|
|
12
|
+
}
|
|
13
|
+
get available() {
|
|
14
|
+
return this.gpu.available;
|
|
15
|
+
}
|
|
16
|
+
get backend() {
|
|
17
|
+
return this.gpu.activeBackend ?? "webgl";
|
|
18
|
+
}
|
|
19
|
+
setDPR(e) {
|
|
20
|
+
this.dpr = e, this.gpu.setDPR(e);
|
|
21
|
+
}
|
|
22
|
+
createBuffer(e, t) {
|
|
23
|
+
if (e.endsWith("_step")) {
|
|
24
|
+
this.gpu.createStepBuffer(e, t);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.gpu.createBuffer(e, t);
|
|
28
|
+
}
|
|
29
|
+
updateBuffer(e, t, i) {
|
|
30
|
+
return this.gpu.updateBuffer(e, t, i);
|
|
31
|
+
}
|
|
32
|
+
getBuffer(e) {
|
|
33
|
+
return this.gpu.hasBuffer(e) ? u : void 0;
|
|
34
|
+
}
|
|
35
|
+
deleteBuffer(e) {
|
|
36
|
+
this.gpu.deleteBuffer(e);
|
|
37
|
+
}
|
|
38
|
+
createColormapTexture(e, t) {
|
|
39
|
+
const i = e.replace(/_colormap$/, "");
|
|
40
|
+
this.gpu.createColormapTexture(i, t);
|
|
41
|
+
}
|
|
42
|
+
getTexture(e) {
|
|
43
|
+
const t = e.replace(/_colormap$/, "");
|
|
44
|
+
return this.gpu.hasColormap(t) ? u : void 0;
|
|
45
|
+
}
|
|
46
|
+
render(e, t) {
|
|
47
|
+
this.gpu.renderNativeSeries(e, {
|
|
48
|
+
bounds: t.bounds,
|
|
49
|
+
backgroundColor: t.backgroundColor,
|
|
50
|
+
plotArea: t.plotArea,
|
|
51
|
+
invertX: t.invertX,
|
|
52
|
+
plotAreaBackground: t.plotAreaBackground,
|
|
53
|
+
dpr: this.dpr
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
resize() {
|
|
57
|
+
const e = this.canvas.getBoundingClientRect(), t = Math.round(e.width * this.dpr), i = Math.round(e.height * this.dpr);
|
|
58
|
+
(this.canvas.width !== t || this.canvas.height !== i) && (this.canvas.width = t, this.canvas.height = i), this.gpu.resize();
|
|
59
|
+
}
|
|
60
|
+
getLimits() {
|
|
61
|
+
return this.gpu.getLimits();
|
|
62
|
+
}
|
|
63
|
+
destroy() {
|
|
64
|
+
this.gpu.destroy();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function d(r, e = {}) {
|
|
68
|
+
const t = new h(r, e);
|
|
69
|
+
return await t.init() ? new o(t, r) : null;
|
|
70
|
+
}
|
|
71
|
+
export {
|
|
72
|
+
o as GpuChartRenderer,
|
|
73
|
+
d as createGpuChartRenderer
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=GpuChartRenderer-Dxc0hrQA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GpuChartRenderer-Dxc0hrQA.js","sources":["../src/renderer/GpuChartRenderer.ts"],"sourcesContent":["/**\n * GpuChartRenderer — chart-facing adapter over GpuRenderer (WebGPU / WebGL backend).\n * Implements the same surface as NativeWebGLRenderer for ChartCore integration.\n */\n\nimport { GpuRenderer, type GpuRendererOptions } from \"../gpu/adapter/gpuRenderer\";\nimport type {\n NativeRenderOptions,\n NativeSeriesRenderData,\n} from \"./native/types\";\n\n/** Placeholder returned from getBuffer/getTexture when GPU abstraction owns the data. */\nconst GPU_HANDLE = {} as WebGLBuffer;\n\nexport class GpuChartRenderer {\n private gpu: GpuRenderer;\n private dpr: number;\n private readonly canvas: HTMLCanvasElement;\n\n constructor(gpu: GpuRenderer, canvas: HTMLCanvasElement) {\n this.gpu = gpu;\n this.canvas = canvas;\n this.dpr = window.devicePixelRatio || 1;\n }\n\n get available(): boolean {\n return this.gpu.available;\n }\n\n get backend(): \"webgpu\" | \"webgl\" {\n return this.gpu.activeBackend ?? \"webgl\";\n }\n\n setDPR(dpr: number): void {\n this.dpr = dpr;\n this.gpu.setDPR(dpr);\n }\n\n createBuffer(id: string, data: Float32Array): void {\n if (id.endsWith(\"_step\")) {\n this.gpu.createStepBuffer(id, data);\n return;\n }\n this.gpu.createBuffer(id, data);\n }\n\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n return this.gpu.updateBuffer(id, data, offsetInBytes);\n }\n\n getBuffer(id: string): WebGLBuffer | undefined {\n return this.gpu.hasBuffer(id) ? GPU_HANDLE : undefined;\n }\n\n deleteBuffer(id: string): void {\n this.gpu.deleteBuffer(id);\n }\n\n createColormapTexture(id: string, data: Uint8Array): void {\n const seriesId = id.replace(/_colormap$/, \"\");\n this.gpu.createColormapTexture(seriesId, data);\n }\n\n getTexture(id: string): WebGLTexture | undefined {\n const seriesId = id.replace(/_colormap$/, \"\");\n return this.gpu.hasColormap(seriesId)\n ? (GPU_HANDLE as unknown as WebGLTexture)\n : undefined;\n }\n\n render(series: NativeSeriesRenderData[], options: NativeRenderOptions): void {\n this.gpu.renderNativeSeries(series, {\n bounds: options.bounds,\n backgroundColor: options.backgroundColor,\n plotArea: options.plotArea,\n invertX: options.invertX,\n plotAreaBackground: options.plotAreaBackground,\n dpr: this.dpr,\n });\n }\n\n resize(): void {\n const rect = this.canvas.getBoundingClientRect();\n const width = Math.round(rect.width * this.dpr);\n const height = Math.round(rect.height * this.dpr);\n if (this.canvas.width !== width || this.canvas.height !== height) {\n this.canvas.width = width;\n this.canvas.height = height;\n }\n this.gpu.resize();\n }\n\n getLimits(): Record<string, unknown> {\n return this.gpu.getLimits();\n }\n\n destroy(): void {\n this.gpu.destroy();\n }\n}\n\nexport async function createGpuChartRenderer(\n canvas: HTMLCanvasElement,\n options: GpuRendererOptions = {},\n): Promise<GpuChartRenderer | null> {\n const gpu = new GpuRenderer(canvas, options);\n const ok = await gpu.init();\n if (!ok) return null;\n return new GpuChartRenderer(gpu, canvas);\n}\n"],"names":["GPU_HANDLE","GpuChartRenderer","gpu","canvas","__publicField","dpr","id","data","offsetInBytes","seriesId","series","options","rect","width","height","createGpuChartRenderer","GpuRenderer"],"mappings":";;;;AAYA,MAAMA,IAAa,CAAA;AAEZ,MAAMC,EAAiB;AAAA,EAK5B,YAAYC,GAAkBC,GAA2B;AAJjD,IAAAC,EAAA;AACA,IAAAA,EAAA;AACS,IAAAA,EAAA;AAGf,SAAK,MAAMF,GACX,KAAK,SAASC,GACd,KAAK,MAAM,OAAO,oBAAoB;AAAA,EACxC;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAEA,IAAI,UAA8B;AAChC,WAAO,KAAK,IAAI,iBAAiB;AAAA,EACnC;AAAA,EAEA,OAAOE,GAAmB;AACxB,SAAK,MAAMA,GACX,KAAK,IAAI,OAAOA,CAAG;AAAA,EACrB;AAAA,EAEA,aAAaC,GAAYC,GAA0B;AACjD,QAAID,EAAG,SAAS,OAAO,GAAG;AACxB,WAAK,IAAI,iBAAiBA,GAAIC,CAAI;AAClC;AAAA,IACF;AACA,SAAK,IAAI,aAAaD,GAAIC,CAAI;AAAA,EAChC;AAAA,EAEA,aAAaD,GAAYC,GAAoBC,GAAgC;AAC3E,WAAO,KAAK,IAAI,aAAaF,GAAIC,GAAMC,CAAa;AAAA,EACtD;AAAA,EAEA,UAAUF,GAAqC;AAC7C,WAAO,KAAK,IAAI,UAAUA,CAAE,IAAIN,IAAa;AAAA,EAC/C;AAAA,EAEA,aAAaM,GAAkB;AAC7B,SAAK,IAAI,aAAaA,CAAE;AAAA,EAC1B;AAAA,EAEA,sBAAsBA,GAAYC,GAAwB;AACxD,UAAME,IAAWH,EAAG,QAAQ,cAAc,EAAE;AAC5C,SAAK,IAAI,sBAAsBG,GAAUF,CAAI;AAAA,EAC/C;AAAA,EAEA,WAAWD,GAAsC;AAC/C,UAAMG,IAAWH,EAAG,QAAQ,cAAc,EAAE;AAC5C,WAAO,KAAK,IAAI,YAAYG,CAAQ,IAC/BT,IACD;AAAA,EACN;AAAA,EAEA,OAAOU,GAAkCC,GAAoC;AAC3E,SAAK,IAAI,mBAAmBD,GAAQ;AAAA,MAClC,QAAQC,EAAQ;AAAA,MAChB,iBAAiBA,EAAQ;AAAA,MACzB,UAAUA,EAAQ;AAAA,MAClB,SAASA,EAAQ;AAAA,MACjB,oBAAoBA,EAAQ;AAAA,MAC5B,KAAK,KAAK;AAAA,IAAA,CACX;AAAA,EACH;AAAA,EAEA,SAAe;AACb,UAAMC,IAAO,KAAK,OAAO,sBAAA,GACnBC,IAAQ,KAAK,MAAMD,EAAK,QAAQ,KAAK,GAAG,GACxCE,IAAS,KAAK,MAAMF,EAAK,SAAS,KAAK,GAAG;AAChD,KAAI,KAAK,OAAO,UAAUC,KAAS,KAAK,OAAO,WAAWC,OACxD,KAAK,OAAO,QAAQD,GACpB,KAAK,OAAO,SAASC,IAEvB,KAAK,IAAI,OAAA;AAAA,EACX;AAAA,EAEA,YAAqC;AACnC,WAAO,KAAK,IAAI,UAAA;AAAA,EAClB;AAAA,EAEA,UAAgB;AACd,SAAK,IAAI,QAAA;AAAA,EACX;AACF;AAEA,eAAsBC,EACpBZ,GACAQ,IAA8B,IACI;AAClC,QAAMT,IAAM,IAAIc,EAAYb,GAAQQ,CAAO;AAE3C,SADW,MAAMT,EAAI,KAAA,IAEd,IAAID,EAAiBC,GAAKC,CAAM,IADvB;AAElB;"}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
var c = Object.defineProperty;
|
|
2
2
|
var g = (i, e, r) => e in i ? c(i, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : i[e] = r;
|
|
3
3
|
var u = (i, e, r) => g(i, typeof e != "symbol" ? e + "" : e, r);
|
|
4
|
-
import { N as f } from "./ChartCore-
|
|
5
|
-
|
|
6
|
-
import "./index-x4stH3jD.js";
|
|
7
|
-
import "./symbols-DT0eLlpW.js";
|
|
8
|
-
function w(i) {
|
|
4
|
+
import { N as f } from "./ChartCore-AnR_3Xkb.js";
|
|
5
|
+
function m(i) {
|
|
9
6
|
return new f(i);
|
|
10
7
|
}
|
|
11
|
-
class
|
|
8
|
+
class d {
|
|
12
9
|
constructor() {
|
|
13
10
|
u(this, "entries", /* @__PURE__ */ new Map());
|
|
14
11
|
}
|
|
@@ -82,9 +79,9 @@ class p {
|
|
|
82
79
|
}
|
|
83
80
|
let t = null;
|
|
84
81
|
function a() {
|
|
85
|
-
return t || (t = new
|
|
82
|
+
return t || (t = new d()), t;
|
|
86
83
|
}
|
|
87
|
-
function
|
|
84
|
+
function p(i) {
|
|
88
85
|
a().register(i);
|
|
89
86
|
}
|
|
90
87
|
function h(i, e) {
|
|
@@ -93,11 +90,11 @@ function h(i, e) {
|
|
|
93
90
|
manifest: i
|
|
94
91
|
});
|
|
95
92
|
}
|
|
96
|
-
function
|
|
93
|
+
function w(i, e) {
|
|
97
94
|
const r = h(i, e);
|
|
98
|
-
return
|
|
95
|
+
return p({ manifest: i, factory: r }), r;
|
|
99
96
|
}
|
|
100
|
-
async function
|
|
97
|
+
async function b(i, e) {
|
|
101
98
|
const r = a().get(i);
|
|
102
99
|
if (!r) {
|
|
103
100
|
console.warn(`[VeloPlot] Plugin "${i}" not found in registry`);
|
|
@@ -105,7 +102,7 @@ async function C(i, e) {
|
|
|
105
102
|
}
|
|
106
103
|
return r(e);
|
|
107
104
|
}
|
|
108
|
-
function
|
|
105
|
+
function P() {
|
|
109
106
|
const i = a(), e = [
|
|
110
107
|
"analysis",
|
|
111
108
|
"visualization",
|
|
@@ -120,13 +117,13 @@ function z() {
|
|
|
120
117
|
r[n] = i.findByCapability(n);
|
|
121
118
|
}), r;
|
|
122
119
|
}
|
|
123
|
-
function
|
|
120
|
+
function $(i) {
|
|
124
121
|
const e = [];
|
|
125
122
|
return i.name ? /^[@a-z0-9-]+\/[a-z0-9-]+$|^[a-z0-9-]+$/.test(i.name) || e.push(
|
|
126
123
|
'Invalid name format. Use lowercase with hyphens, optionally scoped (e.g., "@org/name")'
|
|
127
124
|
) : e.push("Missing required field: name"), i.version ? /^\d+\.\d+\.\d+$/.test(i.version) || e.push("Invalid version format. Use semantic versioning (e.g., 1.0.0)") : e.push("Missing required field: version"), i.dependencies && (Array.isArray(i.dependencies) || e.push("dependencies must be an array")), i.provides && (Array.isArray(i.provides) || e.push("provides must be an array")), e;
|
|
128
125
|
}
|
|
129
|
-
function
|
|
126
|
+
function z(i, e) {
|
|
130
127
|
const r = [];
|
|
131
128
|
if (i.engineVersion) {
|
|
132
129
|
const [n] = i.engineVersion.split(".").map(Number), [s] = e.split(".").map(Number);
|
|
@@ -143,26 +140,15 @@ function M(i, e) {
|
|
|
143
140
|
}
|
|
144
141
|
return { compatible: !0, warnings: r };
|
|
145
142
|
}
|
|
146
|
-
function R(i) {
|
|
147
|
-
return i;
|
|
148
|
-
}
|
|
149
|
-
function V(i, e) {
|
|
150
|
-
return (r) => ({
|
|
151
|
-
...e(r),
|
|
152
|
-
manifest: i
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
143
|
export {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
144
|
+
w as a,
|
|
145
|
+
P as b,
|
|
146
|
+
m as c,
|
|
159
147
|
h as d,
|
|
160
|
-
|
|
161
|
-
R as f,
|
|
148
|
+
z as e,
|
|
162
149
|
a as g,
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
A as v
|
|
150
|
+
b as l,
|
|
151
|
+
p as r,
|
|
152
|
+
$ as v
|
|
167
153
|
};
|
|
168
|
-
//# sourceMappingURL=
|
|
154
|
+
//# sourceMappingURL=PluginRegistry-CzMHebYP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginRegistry-CzMHebYP.js","sources":["../src/renderer/RendererInterface.ts","../src/plugins/PluginRegistry.ts"],"sourcesContent":["/**\n * WebGL Renderer Interface & Factory\n *\n * This module provides a common interface for WebGL rendering.\n * Currently optimized for NativeWebGLRenderer (zero dependencies).\n */\n\nimport type { Bounds } from '../types';\nimport { NativeWebGLRenderer } from './NativeWebGLRenderer';\n\n// ============================================\n// Common Types\n// ============================================\n\nexport interface SeriesRenderData {\n id: string;\n buffer: WebGLBuffer;\n count: number;\n style: any;\n visible: boolean;\n type: string;\n zBounds?: { min: number; max: number };\n colormapTexture?: WebGLTexture;\n}\n\nexport interface RenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n}\n\n// ============================================\n// Renderer Interface\n// ============================================\n\n/**\n * Common interface for all WebGL renderer implementations\n */\nexport interface IWebGLRenderer {\n /** Check if WebGL is available and initialized */\n readonly available: boolean;\n\n /**\n * Create or update a GPU buffer with interleaved X,Y data\n * @param id - Unique buffer identifier\n * @param data - Interleaved Float32Array [x0, y0, x1, y1, ...]\n */\n createBuffer(id: string, data: Float32Array): void;\n\n /**\n * Get a buffer by ID\n */\n getBuffer(id: string): WebGLBuffer | undefined;\n\n /**\n * Delete a buffer and free GPU memory\n */\n deleteBuffer(id: string): void;\n \n /** \n * Create a 1D texture for heatmaps \n */\n createColormapTexture(id: string, data: Uint8Array): WebGLTexture;\n\n /**\n * Render a frame with all visible series\n */\n render(series: SeriesRenderData[], options: RenderOptions): void;\n\n /**\n * Handle canvas resize\n */\n resize(): void;\n\n /**\n * Get WebGL capabilities/limits\n */\n getLimits(): Record<string, unknown>;\n\n /**\n * Cleanup and destroy all GPU resources\n */\n destroy(): void;\n}\n\n// ============================================\n// Factory Functions\n// ============================================\n\n/**\n * Create a WebGL renderer (Native WebGL)\n *\n * @param canvas - Target canvas element\n */\nexport function createRenderer(canvas: HTMLCanvasElement): IWebGLRenderer {\n return new NativeWebGLRenderer(canvas);\n}\n\n/**\n * Create a renderer synchronously (native only)\n */\nexport { NativeWebGLRenderer as createNativeRenderer } from './NativeWebGLRenderer';\n","/**\n * Velo Plot - Global Plugin Registry\n * \n * Provides a global registry for third-party plugins that can be\n * discovered and loaded by name without explicit imports.\n * \n * @module plugins/PluginRegistry\n */\n\nimport type {\n PluginFactory,\n PluginManifest,\n PluginCapability,\n PluginRegistry,\n PluginRegistryEntry,\n} from \"./types\";\n\n// ============================================\n// Global Registry Implementation\n// ============================================\n\nclass PluginRegistryImpl implements PluginRegistry {\n private entries = new Map<string, PluginRegistryEntry>();\n\n /**\n * Register a plugin globally\n */\n register(entry: PluginRegistryEntry): void {\n const name = entry.manifest.name;\n\n if (this.entries.has(name)) {\n console.warn(\n `[VeloPlot Registry] Plugin \"${name}\" is already registered, overwriting`\n );\n }\n\n this.entries.set(name, entry);\n }\n\n /**\n * Unregister a plugin\n */\n unregister(name: string): boolean {\n const existed = this.entries.has(name);\n this.entries.delete(name);\n return existed;\n }\n\n /**\n * Get a registered plugin factory by name\n */\n get(name: string): PluginFactory | undefined {\n return this.entries.get(name)?.factory;\n }\n\n /**\n * List all registered plugins\n */\n list(): PluginManifest[] {\n return Array.from(this.entries.values()).map((e) => e.manifest);\n }\n\n /**\n * Search plugins by capability\n */\n findByCapability(capability: PluginCapability): PluginManifest[] {\n const results: PluginManifest[] = [];\n\n this.entries.forEach((entry) => {\n if (entry.manifest.provides?.includes(capability)) {\n results.push(entry.manifest);\n }\n });\n\n return results;\n }\n\n /**\n * Search plugins by tag\n */\n findByTag(tag: string): PluginManifest[] {\n const results: PluginManifest[] = [];\n const lowerTag = tag.toLowerCase();\n\n this.entries.forEach((entry) => {\n if (entry.manifest.tags?.some((t) => t.toLowerCase().includes(lowerTag))) {\n results.push(entry.manifest);\n }\n });\n\n return results;\n }\n\n /**\n * Check if a plugin is registered\n */\n has(name: string): boolean {\n return this.entries.has(name);\n }\n\n /**\n * Get plugin count\n */\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.entries.clear();\n }\n}\n\n// ============================================\n// Singleton Instance\n// ============================================\n\nlet registryInstance: PluginRegistryImpl | null = null;\n\n/**\n * Get the global plugin registry singleton\n */\nexport function getPluginRegistry(): PluginRegistry {\n if (!registryInstance) {\n registryInstance = new PluginRegistryImpl();\n }\n return registryInstance;\n}\n\n/**\n * Register a plugin in the global registry\n * Shorthand for getPluginRegistry().register()\n */\nexport function registerPlugin(entry: PluginRegistryEntry): void {\n getPluginRegistry().register(entry);\n}\n\n/**\n * Create a plugin factory with manifest validation\n */\nexport function definePlugin<TConfig = unknown>(\n manifest: PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): PluginFactory<TConfig> {\n return (config?: TConfig) => {\n const plugin = factory(config);\n return {\n ...plugin,\n manifest,\n };\n };\n}\n\n/**\n * Register a plugin from definition\n */\nexport function defineAndRegister<TConfig = unknown>(\n manifest: PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): PluginFactory<TConfig> {\n const pluginFactory = definePlugin(manifest, factory);\n registerPlugin({ manifest, factory: pluginFactory as PluginFactory });\n return pluginFactory;\n}\n\n// ============================================\n// Plugin Discovery Helpers\n// ============================================\n\n/**\n * Load a plugin from the registry by name\n */\nexport async function loadPlugin<TConfig = unknown>(\n name: string,\n config?: TConfig\n): Promise<import(\"./types\").ChartPlugin<TConfig> | undefined> {\n const factory = getPluginRegistry().get(name);\n if (!factory) {\n console.warn(`[VeloPlot] Plugin \"${name}\" not found in registry`);\n return undefined;\n }\n return factory(config) as import(\"./types\").ChartPlugin<TConfig>;\n}\n\n/**\n * List available plugins by category\n */\nexport function listPluginsByCategory(): Record<PluginCapability, PluginManifest[]> {\n const registry = getPluginRegistry();\n const categories: PluginCapability[] = [\n \"analysis\",\n \"visualization\",\n \"interaction\",\n \"data-source\",\n \"export\",\n \"ui\",\n \"annotation\",\n \"theme\",\n ];\n\n const result: Record<string, PluginManifest[]> = {};\n categories.forEach((cat) => {\n result[cat] = registry.findByCapability(cat);\n });\n\n return result as Record<PluginCapability, PluginManifest[]>;\n}\n\n// ============================================\n// Plugin Validation\n// ============================================\n\n/**\n * Validate a plugin manifest\n */\nexport function validateManifest(manifest: PluginManifest): string[] {\n const errors: string[] = [];\n\n if (!manifest.name) {\n errors.push(\"Missing required field: name\");\n } else if (!/^[@a-z0-9-]+\\/[a-z0-9-]+$|^[a-z0-9-]+$/.test(manifest.name)) {\n errors.push(\n 'Invalid name format. Use lowercase with hyphens, optionally scoped (e.g., \"@org/name\")'\n );\n }\n\n if (!manifest.version) {\n errors.push(\"Missing required field: version\");\n } else if (!/^\\d+\\.\\d+\\.\\d+$/.test(manifest.version)) {\n errors.push(\"Invalid version format. Use semantic versioning (e.g., 1.0.0)\");\n }\n\n if (manifest.dependencies) {\n if (!Array.isArray(manifest.dependencies)) {\n errors.push(\"dependencies must be an array\");\n }\n }\n\n if (manifest.provides) {\n if (!Array.isArray(manifest.provides)) {\n errors.push(\"provides must be an array\");\n }\n }\n\n return errors;\n}\n\n/**\n * Validate a plugin for compatibility\n */\nexport function checkPluginCompatibility(\n manifest: PluginManifest,\n engineVersion: string\n): { compatible: boolean; warnings: string[] } {\n const warnings: string[] = [];\n\n if (manifest.engineVersion) {\n const [reqMajor] = manifest.engineVersion.split(\".\").map(Number);\n const [curMajor] = engineVersion.split(\".\").map(Number);\n\n if (reqMajor > curMajor) {\n return {\n compatible: false,\n warnings: [\n `Plugin requires engine v${manifest.engineVersion}, current is v${engineVersion}`,\n ],\n };\n }\n\n if (reqMajor < curMajor) {\n warnings.push(\n `Plugin was built for engine v${manifest.engineVersion}, may have compatibility issues`\n );\n }\n }\n\n return { compatible: true, warnings };\n}\n"],"names":["createRenderer","canvas","NativeWebGLRenderer","PluginRegistryImpl","__publicField","entry","name","existed","_a","capability","results","tag","lowerTag","t","registryInstance","getPluginRegistry","registerPlugin","definePlugin","manifest","factory","config","defineAndRegister","pluginFactory","loadPlugin","listPluginsByCategory","registry","categories","result","cat","validateManifest","errors","checkPluginCompatibility","engineVersion","warnings","reqMajor","curMajor"],"mappings":"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"}
|
package/dist/angular-hooks.js
CHANGED
package/dist/angular.js
CHANGED
|
@@ -22,11 +22,11 @@ var b = (e) => [, , , Q((e == null ? void 0 : e[$("metadata")]) ?? null)], q = [
|
|
|
22
22
|
}, n = (e, t, s) => j(e, typeof t != "symbol" ? t + "" : t, s), D = (e, t, s) => t.has(e) || f("Cannot " + s), X = (e, t) => Object(t) !== t ? f('Cannot use the "in" operator on this value') : e.has(t), M = (e, t, s) => (D(e, t, "read from private field"), s ? s.call(e) : t.get(e));
|
|
23
23
|
var P = (e, t, s, c) => (D(e, t, "write to private field"), c ? c.call(e, s) : t.set(e, s), s), Y = (e, t, s) => (D(e, t, "access private method"), s);
|
|
24
24
|
import { input as d, output as _, viewChild as J, effect as tt, Component as K } from "@angular/core";
|
|
25
|
-
import { c as et } from "./createStackedChart-
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import { u as ht } from "./hooks-
|
|
29
|
-
import { V as gt, c as mt, b as vt, a as kt } from "./hooks-
|
|
25
|
+
import { c as et } from "./createStackedChart-DqcLCFGS.js";
|
|
26
|
+
import { p as I, o as st, s as it, d as rt } from "./optionsSync-QUiN4Inw.js";
|
|
27
|
+
import { c as nt } from "./chartSyncBridge-D_rCtbFq.js";
|
|
28
|
+
import { u as ht } from "./hooks-DH-3bewj.js";
|
|
29
|
+
import { V as gt, c as mt, b as vt, a as kt } from "./hooks-DH-3bewj.js";
|
|
30
30
|
function m(e) {
|
|
31
31
|
return typeof e == "number" ? `${e}px` : e;
|
|
32
32
|
}
|
|
@@ -61,7 +61,7 @@ class g {
|
|
|
61
61
|
}
|
|
62
62
|
mountChart(t) {
|
|
63
63
|
if (this.chart) return;
|
|
64
|
-
const s =
|
|
64
|
+
const s = nt(t, this.chartOptions());
|
|
65
65
|
this.chart = s.chart, this.destroy = s.destroy, this.prevSync = I(this.chartOptions()), this.syncOptionsAndSeries();
|
|
66
66
|
}
|
|
67
67
|
get widthStyle() {
|
|
@@ -77,10 +77,10 @@ class g {
|
|
|
77
77
|
syncOptionsAndSeries() {
|
|
78
78
|
if (!this.chart) return;
|
|
79
79
|
const t = I(this.chartOptions());
|
|
80
|
-
|
|
80
|
+
st(this.prevSync, t) && (it(this.chart, this.prevSync, t), this.prevSync = t), this.applySeries();
|
|
81
81
|
}
|
|
82
82
|
applySeries() {
|
|
83
|
-
this.chart && (this.previousSeries =
|
|
83
|
+
this.chart && (this.previousSeries = rt(
|
|
84
84
|
{
|
|
85
85
|
addSeries: (t) => this.chart.addSeries(t),
|
|
86
86
|
updateSeries: (t, s) => this.chart.updateSeries(t, s),
|
|
@@ -158,7 +158,7 @@ function h(t, e) {
|
|
|
158
158
|
9: "⁹",
|
|
159
159
|
"-": "⁻",
|
|
160
160
|
"+": "⁺"
|
|
161
|
-
}, a = i.replace("+", "").replace(/[0-9
|
|
161
|
+
}, a = i.replace("+", "").replace(/[0-9-]/g, (f) => c[f]);
|
|
162
162
|
return `${r}e${a}`;
|
|
163
163
|
}
|
|
164
164
|
function k(t, e, n, r) {
|
|
@@ -197,4 +197,4 @@ export {
|
|
|
197
197
|
T as i,
|
|
198
198
|
b as m
|
|
199
199
|
};
|
|
200
|
-
//# sourceMappingURL=axisFormat-
|
|
200
|
+
//# sourceMappingURL=axisFormat-Sz4WIJfQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axisFormat-CzumxpCL.js","sources":["../src/core/EventEmitter.ts","../src/core/time/TimeScale.ts","../src/core/time/applyTimeScale.ts","../src/core/format/axisFormat.ts"],"sourcesContent":["/**\n * Type-safe event emitter for chart events\n */\n\nexport class EventEmitter<EventMap extends object> {\n private listeners: Map<keyof EventMap, Set<(data: unknown) => void>> =\n new Map();\n\n /**\n * Subscribe to an event\n */\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler as (data: unknown) => void);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler as (data: unknown) => void);\n }\n }\n\n /**\n * Emit an event with data\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`[EventEmitter] Error in handler for \"${String(event)}\":`, error);\n }\n });\n }\n }\n\n /**\n * Subscribe to an event once\n */\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const wrappedHandler = (data: EventMap[K]) => {\n this.off(event, wrappedHandler);\n handler(data);\n };\n this.on(event, wrappedHandler);\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Get listener count for an event\n */\n listenerCount(event: keyof EventMap): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","/**\n * TimeScale — business-day / session-aware X mapping for trading charts.\n * Stage 2.1–2.3\n */\n\nexport type TimeScaleCalendar = \"continuous\" | \"business-day\";\nexport type MarketSession = \"24x7\" | \"NYSE\";\n\nexport interface TimeScaleOptions {\n calendar?: TimeScaleCalendar;\n session?: MarketSession;\n /** IANA timezone (reserved for future session-hour filtering) */\n timezone?: string;\n}\n\nexport interface BusinessDayMapping {\n /** X values for chart (consecutive indices on business days) */\n scaledX: Float64Array;\n /** Original timestamp per scaled index (for tooltips / ticks) */\n timeByIndex: Float64Array;\n /** Original index → scaled index (-1 if skipped) */\n sourceToScaled: Int32Array;\n}\n\nconst MS_DAY = 86_400_000;\n\n/** UTC day-of-week: 0 = Sunday, 6 = Saturday */\nfunction dayOfWeekUtc(ts: number): number {\n return new Date(ts).getUTCDay();\n}\n\n/** Weekend check (NYSE calendar MVP — UTC weekends). */\nexport function isBusinessDay(ts: number, _opts: TimeScaleOptions = {}): boolean {\n const dow = dayOfWeekUtc(ts);\n return dow !== 0 && dow !== 6;\n}\n\n/**\n * Map timestamp series to consecutive business-day indices (skips Sat/Sun bars).\n * NaN in scaledX marks non-business bars (hidden gap).\n */\nexport function mapToBusinessDayScale(\n times: Float32Array | Float64Array,\n opts: TimeScaleOptions = {},\n): BusinessDayMapping {\n const calendar = opts.calendar ?? \"business-day\";\n const n = times.length;\n const scaledX = new Float64Array(n);\n const sourceToScaled = new Int32Array(n);\n sourceToScaled.fill(-1);\n\n if (calendar === \"continuous\") {\n for (let i = 0; i < n; i++) {\n scaledX[i] = times[i];\n sourceToScaled[i] = i;\n }\n return {\n scaledX,\n timeByIndex: times instanceof Float64Array ? times : Float64Array.from(times),\n sourceToScaled,\n };\n }\n\n const timeByIndex: number[] = [];\n let logical = 0;\n for (let i = 0; i < n; i++) {\n const t = times[i];\n if (!Number.isFinite(t) || !isBusinessDay(t, opts)) {\n scaledX[i] = Number.NaN;\n continue;\n }\n scaledX[i] = logical;\n timeByIndex[logical] = t;\n sourceToScaled[i] = logical;\n logical++;\n }\n\n return {\n scaledX,\n timeByIndex: Float64Array.from(timeByIndex),\n sourceToScaled,\n };\n}\n\n/** Resolve timestamp at a scaled business-day index (for axis ticks). */\nexport function timeAtBusinessIndex(mapping: BusinessDayMapping, index: number): number | undefined {\n return mapping.timeByIndex[index];\n}\n\n/** Visible span in ms using business-day mapping. */\nexport function businessDaySpanMs(mapping: BusinessDayMapping, xMin: number, xMax: number): number {\n const i0 = Math.max(0, Math.floor(xMin));\n const i1 = Math.min(mapping.timeByIndex.length - 1, Math.ceil(xMax));\n const t0 = mapping.timeByIndex[i0];\n const t1 = mapping.timeByIndex[i1];\n if (t0 == null || t1 == null) return MS_DAY;\n return Math.abs(t1 - t0) || MS_DAY;\n}\n","/**\n * Wire TimeScale into chart series + axis formatting (Stage 2.2–2.3).\n */\n\nimport type { AxisOptions } from \"../../types\";\nimport { formatTimeTick } from \"../format/axisFormat\";\nimport {\n businessDaySpanMs,\n mapToBusinessDayScale,\n timeAtBusinessIndex,\n type BusinessDayMapping,\n type TimeScaleOptions,\n} from \"./TimeScale\";\n\nexport function isBusinessDayScaleActive(xAxis: AxisOptions): boolean {\n return (\n xAxis.type === \"time\" &&\n (xAxis.timeScale?.calendar ?? \"business-day\") !== \"continuous\"\n );\n}\n\nexport function resolveTimeScaleOpts(xAxis: AxisOptions): TimeScaleOptions {\n return {\n calendar: \"business-day\",\n session: \"24x7\",\n ...xAxis.timeScale,\n };\n}\n\nexport function applyBusinessDayX(\n x: Float32Array | Float64Array,\n xAxis: AxisOptions,\n): { displayX: Float64Array; mapping: BusinessDayMapping } {\n const mapping = mapToBusinessDayScale(x, resolveTimeScaleOpts(xAxis));\n return { displayX: mapping.scaledX, mapping };\n}\n\nexport function formatBusinessDayTick(\n logicalIndex: number,\n mapping: BusinessDayMapping,\n): string | null {\n const idx = Math.round(logicalIndex);\n const t = timeAtBusinessIndex(mapping, idx);\n if (t === undefined) return null;\n const span = businessDaySpanMs(mapping, idx - 1, idx + 1);\n return formatTimeTick(t, span);\n}\n","/**\n * Shared axis tick and tooltip value formatting.\n */\nimport type { AxisOptions } from \"../../types\";\nimport type { BusinessDayMapping } from \"../time/TimeScale\";\nimport { formatBusinessDayTick } from \"../time/applyTimeScale\";\n\nconst PREFIXDivisors: Record<string, number> = {\n n: 1e-9,\n µ: 1e-6,\n m: 1e-3,\n \"\": 1,\n k: 1e3,\n M: 1e6,\n};\n\nexport function autoPrefixFor(value: number): NonNullable<AxisOptions[\"prefix\"]> {\n const absVal = Math.abs(value);\n if (absVal >= 1e6) return \"M\";\n if (absVal >= 1e3) return \"k\";\n if (absVal > 0 && absVal < 1e-6) return \"n\";\n if (absVal > 0 && absVal < 1e-3) return \"µ\";\n if (absVal > 0 && absVal < 1) return \"m\";\n return \"\";\n}\n\nexport function applyPrefix(\n value: number,\n prefix: NonNullable<AxisOptions[\"prefix\"]>,\n): string {\n const resolved = prefix === \"auto\" ? autoPrefixFor(value) : prefix;\n const divisor = PREFIXDivisors[resolved];\n const scaled = value / divisor;\n return `${scaled.toPrecision(3)}${resolved}`;\n}\n\nexport function pickTimeFormatter(spanMs: number): Intl.DateTimeFormat {\n if (spanMs <= 1000 * 60 * 60 * 36) {\n return new Intl.DateTimeFormat(undefined, {\n day: \"2-digit\",\n month: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n }\n if (spanMs <= 1000 * 60 * 60 * 24 * 90) {\n return new Intl.DateTimeFormat(undefined, { day: \"2-digit\", month: \"2-digit\" });\n }\n return new Intl.DateTimeFormat(undefined, { month: \"short\", year: \"2-digit\" });\n}\n\nexport function formatTimeTick(value: number, spanMs?: number): string {\n const span = spanMs ?? 1000 * 60 * 60 * 24;\n return pickTimeFormatter(span).format(new Date(value));\n}\n\nexport function toScientificUnicode(value: number, precision: number): string {\n const str = value.toExponential(precision);\n const [mantissa, exponent] = str.split(\"e\");\n\n const superscriptMap: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"-\": \"⁻\",\n \"+\": \"⁺\",\n };\n\n const unicodeExp = exponent\n .replace(\"+\", \"\")\n .replace(/[0-9\\-]/g, (char) => superscriptMap[char]);\n\n return `${mantissa}e${unicodeExp}`;\n}\n\nexport function formatXTickValue(\n value: number,\n options?: AxisOptions,\n domainSpan?: number,\n businessDayMapping?: BusinessDayMapping | null,\n): string {\n if (options?.type === \"time\" && businessDayMapping) {\n const label = formatBusinessDayTick(value, businessDayMapping);\n if (label) return label;\n return \"\";\n }\n if (options?.type === \"time\") {\n return formatTimeTick(value, domainSpan);\n }\n\n if (options?.prefix !== undefined && options.prefix !== \"\") {\n return applyPrefix(value, options.prefix);\n }\n\n const forceScientific = options?.scientific === true;\n const forceLinear = options?.scientific === false;\n const absVal = Math.abs(value);\n\n if (forceScientific || (!forceLinear && absVal !== 0 && absVal < 0.001)) {\n return toScientificUnicode(value, 1);\n }\n\n return value.toFixed(3).replace(/\\.?0+$/, \"\");\n}\n\nexport function formatYTickValue(value: number, options?: AxisOptions): string {\n if (value === 0) return \"0\";\n\n const forceScientific = options?.scientific === true;\n const forceLinear = options?.scientific === false;\n const absVal = Math.abs(value);\n\n if (options?.prefix !== undefined && options.prefix !== \"\") {\n return applyPrefix(value, options.prefix);\n }\n\n if (forceScientific || (!forceLinear && (absVal < 0.0001 || absVal >= 1e6))) {\n return toScientificUnicode(value, 1);\n }\n\n if (absVal >= 1000) {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n\n return value.toPrecision(3);\n}\n\nexport interface TooltipAxisFormat {\n x?: Partial<AxisOptions>;\n y?: Partial<AxisOptions>;\n xSpan?: number;\n}\n\nexport function formatTooltipX(value: number, axisFormat?: TooltipAxisFormat): string {\n return formatXTickValue(value, axisFormat?.x as AxisOptions | undefined, axisFormat?.xSpan);\n}\n\nexport function formatTooltipY(value: number, axisFormat?: TooltipAxisFormat): string {\n return formatYTickValue(value, axisFormat?.y as AxisOptions | undefined);\n}\n"],"names":["EventEmitter","__publicField","event","handler","handlers","data","error","wrappedHandler","_a","MS_DAY","dayOfWeekUtc","ts","isBusinessDay","_opts","dow","mapToBusinessDayScale","times","opts","calendar","n","scaledX","sourceToScaled","i","timeByIndex","logical","t","timeAtBusinessIndex","mapping","index","businessDaySpanMs","xMin","xMax","i0","i1","t0","t1","isBusinessDayScaleActive","xAxis","resolveTimeScaleOpts","applyBusinessDayX","x","formatBusinessDayTick","logicalIndex","idx","span","formatTimeTick","PREFIXDivisors","autoPrefixFor","value","absVal","applyPrefix","prefix","resolved","divisor","pickTimeFormatter","spanMs","toScientificUnicode","precision","str","mantissa","exponent","superscriptMap","unicodeExp","char","formatXTickValue","options","domainSpan","businessDayMapping","label","forceScientific","forceLinear","formatYTickValue","formatTooltipX","axisFormat","formatTooltipY"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"axisFormat-Sz4WIJfQ.js","sources":["../src/core/EventEmitter.ts","../src/core/time/TimeScale.ts","../src/core/time/applyTimeScale.ts","../src/core/format/axisFormat.ts"],"sourcesContent":["/**\n * Type-safe event emitter for chart events\n */\n\nexport class EventEmitter<EventMap extends object> {\n private listeners: Map<keyof EventMap, Set<(data: unknown) => void>> =\n new Map();\n\n /**\n * Subscribe to an event\n */\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler as (data: unknown) => void);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler as (data: unknown) => void);\n }\n }\n\n /**\n * Emit an event with data\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`[EventEmitter] Error in handler for \"${String(event)}\":`, error);\n }\n });\n }\n }\n\n /**\n * Subscribe to an event once\n */\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const wrappedHandler = (data: EventMap[K]) => {\n this.off(event, wrappedHandler);\n handler(data);\n };\n this.on(event, wrappedHandler);\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Get listener count for an event\n */\n listenerCount(event: keyof EventMap): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","/**\n * TimeScale — business-day / session-aware X mapping for trading charts.\n * Stage 2.1–2.3\n */\n\nexport type TimeScaleCalendar = \"continuous\" | \"business-day\";\nexport type MarketSession = \"24x7\" | \"NYSE\";\n\nexport interface TimeScaleOptions {\n calendar?: TimeScaleCalendar;\n session?: MarketSession;\n /** IANA timezone (reserved for future session-hour filtering) */\n timezone?: string;\n}\n\nexport interface BusinessDayMapping {\n /** X values for chart (consecutive indices on business days) */\n scaledX: Float64Array;\n /** Original timestamp per scaled index (for tooltips / ticks) */\n timeByIndex: Float64Array;\n /** Original index → scaled index (-1 if skipped) */\n sourceToScaled: Int32Array;\n}\n\nconst MS_DAY = 86_400_000;\n\n/** UTC day-of-week: 0 = Sunday, 6 = Saturday */\nfunction dayOfWeekUtc(ts: number): number {\n return new Date(ts).getUTCDay();\n}\n\n/** Weekend check (NYSE calendar MVP — UTC weekends). */\nexport function isBusinessDay(ts: number, _opts: TimeScaleOptions = {}): boolean {\n const dow = dayOfWeekUtc(ts);\n return dow !== 0 && dow !== 6;\n}\n\n/**\n * Map timestamp series to consecutive business-day indices (skips Sat/Sun bars).\n * NaN in scaledX marks non-business bars (hidden gap).\n */\nexport function mapToBusinessDayScale(\n times: Float32Array | Float64Array,\n opts: TimeScaleOptions = {},\n): BusinessDayMapping {\n const calendar = opts.calendar ?? \"business-day\";\n const n = times.length;\n const scaledX = new Float64Array(n);\n const sourceToScaled = new Int32Array(n);\n sourceToScaled.fill(-1);\n\n if (calendar === \"continuous\") {\n for (let i = 0; i < n; i++) {\n scaledX[i] = times[i];\n sourceToScaled[i] = i;\n }\n return {\n scaledX,\n timeByIndex: times instanceof Float64Array ? times : Float64Array.from(times),\n sourceToScaled,\n };\n }\n\n const timeByIndex: number[] = [];\n let logical = 0;\n for (let i = 0; i < n; i++) {\n const t = times[i];\n if (!Number.isFinite(t) || !isBusinessDay(t, opts)) {\n scaledX[i] = Number.NaN;\n continue;\n }\n scaledX[i] = logical;\n timeByIndex[logical] = t;\n sourceToScaled[i] = logical;\n logical++;\n }\n\n return {\n scaledX,\n timeByIndex: Float64Array.from(timeByIndex),\n sourceToScaled,\n };\n}\n\n/** Resolve timestamp at a scaled business-day index (for axis ticks). */\nexport function timeAtBusinessIndex(mapping: BusinessDayMapping, index: number): number | undefined {\n return mapping.timeByIndex[index];\n}\n\n/** Visible span in ms using business-day mapping. */\nexport function businessDaySpanMs(mapping: BusinessDayMapping, xMin: number, xMax: number): number {\n const i0 = Math.max(0, Math.floor(xMin));\n const i1 = Math.min(mapping.timeByIndex.length - 1, Math.ceil(xMax));\n const t0 = mapping.timeByIndex[i0];\n const t1 = mapping.timeByIndex[i1];\n if (t0 == null || t1 == null) return MS_DAY;\n return Math.abs(t1 - t0) || MS_DAY;\n}\n","/**\n * Wire TimeScale into chart series + axis formatting (Stage 2.2–2.3).\n */\n\nimport type { AxisOptions } from \"../../types\";\nimport { formatTimeTick } from \"../format/axisFormat\";\nimport {\n businessDaySpanMs,\n mapToBusinessDayScale,\n timeAtBusinessIndex,\n type BusinessDayMapping,\n type TimeScaleOptions,\n} from \"./TimeScale\";\n\nexport function isBusinessDayScaleActive(xAxis: AxisOptions): boolean {\n return (\n xAxis.type === \"time\" &&\n (xAxis.timeScale?.calendar ?? \"business-day\") !== \"continuous\"\n );\n}\n\nexport function resolveTimeScaleOpts(xAxis: AxisOptions): TimeScaleOptions {\n return {\n calendar: \"business-day\",\n session: \"24x7\",\n ...xAxis.timeScale,\n };\n}\n\nexport function applyBusinessDayX(\n x: Float32Array | Float64Array,\n xAxis: AxisOptions,\n): { displayX: Float64Array; mapping: BusinessDayMapping } {\n const mapping = mapToBusinessDayScale(x, resolveTimeScaleOpts(xAxis));\n return { displayX: mapping.scaledX, mapping };\n}\n\nexport function formatBusinessDayTick(\n logicalIndex: number,\n mapping: BusinessDayMapping,\n): string | null {\n const idx = Math.round(logicalIndex);\n const t = timeAtBusinessIndex(mapping, idx);\n if (t === undefined) return null;\n const span = businessDaySpanMs(mapping, idx - 1, idx + 1);\n return formatTimeTick(t, span);\n}\n","/**\n * Shared axis tick and tooltip value formatting.\n */\nimport type { AxisOptions } from \"../../types\";\nimport type { BusinessDayMapping } from \"../time/TimeScale\";\nimport { formatBusinessDayTick } from \"../time/applyTimeScale\";\n\nconst PREFIXDivisors: Record<string, number> = {\n n: 1e-9,\n µ: 1e-6,\n m: 1e-3,\n \"\": 1,\n k: 1e3,\n M: 1e6,\n};\n\nexport function autoPrefixFor(value: number): NonNullable<AxisOptions[\"prefix\"]> {\n const absVal = Math.abs(value);\n if (absVal >= 1e6) return \"M\";\n if (absVal >= 1e3) return \"k\";\n if (absVal > 0 && absVal < 1e-6) return \"n\";\n if (absVal > 0 && absVal < 1e-3) return \"µ\";\n if (absVal > 0 && absVal < 1) return \"m\";\n return \"\";\n}\n\nexport function applyPrefix(\n value: number,\n prefix: NonNullable<AxisOptions[\"prefix\"]>,\n): string {\n const resolved = prefix === \"auto\" ? autoPrefixFor(value) : prefix;\n const divisor = PREFIXDivisors[resolved];\n const scaled = value / divisor;\n return `${scaled.toPrecision(3)}${resolved}`;\n}\n\nexport function pickTimeFormatter(spanMs: number): Intl.DateTimeFormat {\n if (spanMs <= 1000 * 60 * 60 * 36) {\n return new Intl.DateTimeFormat(undefined, {\n day: \"2-digit\",\n month: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n }\n if (spanMs <= 1000 * 60 * 60 * 24 * 90) {\n return new Intl.DateTimeFormat(undefined, { day: \"2-digit\", month: \"2-digit\" });\n }\n return new Intl.DateTimeFormat(undefined, { month: \"short\", year: \"2-digit\" });\n}\n\nexport function formatTimeTick(value: number, spanMs?: number): string {\n const span = spanMs ?? 1000 * 60 * 60 * 24;\n return pickTimeFormatter(span).format(new Date(value));\n}\n\nexport function toScientificUnicode(value: number, precision: number): string {\n const str = value.toExponential(precision);\n const [mantissa, exponent] = str.split(\"e\");\n\n const superscriptMap: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"-\": \"⁻\",\n \"+\": \"⁺\",\n };\n\n const unicodeExp = exponent\n .replace(\"+\", \"\")\n .replace(/[0-9-]/g, (char) => superscriptMap[char]);\n\n return `${mantissa}e${unicodeExp}`;\n}\n\nexport function formatXTickValue(\n value: number,\n options?: AxisOptions,\n domainSpan?: number,\n businessDayMapping?: BusinessDayMapping | null,\n): string {\n if (options?.type === \"time\" && businessDayMapping) {\n const label = formatBusinessDayTick(value, businessDayMapping);\n if (label) return label;\n return \"\";\n }\n if (options?.type === \"time\") {\n return formatTimeTick(value, domainSpan);\n }\n\n if (options?.prefix !== undefined && options.prefix !== \"\") {\n return applyPrefix(value, options.prefix);\n }\n\n const forceScientific = options?.scientific === true;\n const forceLinear = options?.scientific === false;\n const absVal = Math.abs(value);\n\n if (forceScientific || (!forceLinear && absVal !== 0 && absVal < 0.001)) {\n return toScientificUnicode(value, 1);\n }\n\n return value.toFixed(3).replace(/\\.?0+$/, \"\");\n}\n\nexport function formatYTickValue(value: number, options?: AxisOptions): string {\n if (value === 0) return \"0\";\n\n const forceScientific = options?.scientific === true;\n const forceLinear = options?.scientific === false;\n const absVal = Math.abs(value);\n\n if (options?.prefix !== undefined && options.prefix !== \"\") {\n return applyPrefix(value, options.prefix);\n }\n\n if (forceScientific || (!forceLinear && (absVal < 0.0001 || absVal >= 1e6))) {\n return toScientificUnicode(value, 1);\n }\n\n if (absVal >= 1000) {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n\n return value.toPrecision(3);\n}\n\nexport interface TooltipAxisFormat {\n x?: Partial<AxisOptions>;\n y?: Partial<AxisOptions>;\n xSpan?: number;\n}\n\nexport function formatTooltipX(value: number, axisFormat?: TooltipAxisFormat): string {\n return formatXTickValue(value, axisFormat?.x as AxisOptions | undefined, axisFormat?.xSpan);\n}\n\nexport function formatTooltipY(value: number, axisFormat?: TooltipAxisFormat): string {\n return formatYTickValue(value, axisFormat?.y as AxisOptions | undefined);\n}\n"],"names":["EventEmitter","__publicField","event","handler","handlers","data","error","wrappedHandler","_a","MS_DAY","dayOfWeekUtc","ts","isBusinessDay","_opts","dow","mapToBusinessDayScale","times","opts","calendar","n","scaledX","sourceToScaled","i","timeByIndex","logical","t","timeAtBusinessIndex","mapping","index","businessDaySpanMs","xMin","xMax","i0","i1","t0","t1","isBusinessDayScaleActive","xAxis","resolveTimeScaleOpts","applyBusinessDayX","x","formatBusinessDayTick","logicalIndex","idx","span","formatTimeTick","PREFIXDivisors","autoPrefixFor","value","absVal","applyPrefix","prefix","resolved","divisor","pickTimeFormatter","spanMs","toScientificUnicode","precision","str","mantissa","exponent","superscriptMap","unicodeExp","char","formatXTickValue","options","domainSpan","businessDayMapping","label","forceScientific","forceLinear","formatYTickValue","formatTooltipX","axisFormat","formatTooltipY"],"mappings":"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"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { c as
|
|
1
|
+
import { c as s } from "./ChartCore-AnR_3Xkb.js";
|
|
2
|
+
import { a as d } from "./createStackedChart-DqcLCFGS.js";
|
|
2
3
|
import { c as u } from "./index-CaXWSOTk.js";
|
|
3
4
|
function c(e) {
|
|
4
5
|
const r = e.responsive ?? { reducedMotion: "auto" };
|
|
5
6
|
return { ...e, responsive: r };
|
|
6
7
|
}
|
|
7
|
-
function
|
|
8
|
-
const t =
|
|
8
|
+
function C(e, r, o = {}) {
|
|
9
|
+
const t = s({
|
|
9
10
|
...c(r),
|
|
10
11
|
container: e
|
|
11
12
|
}), i = () => {
|
|
12
|
-
var
|
|
13
|
-
(
|
|
13
|
+
var a;
|
|
14
|
+
(a = o.onBoundsChange) == null || a.call(o, t.getViewBounds());
|
|
14
15
|
};
|
|
15
16
|
t.on("zoom", i);
|
|
16
17
|
let n;
|
|
@@ -27,14 +28,14 @@ function y(e, r, o = {}) {
|
|
|
27
28
|
function f(e) {
|
|
28
29
|
return e != null && "getPanes" in e && typeof e.getPanes == "function";
|
|
29
30
|
}
|
|
30
|
-
async function
|
|
31
|
+
async function h(e, r, o = {}) {
|
|
31
32
|
if (!e)
|
|
32
33
|
throw new Error(
|
|
33
34
|
"[useIndicator] Chart is not ready. Wait for isReady before adding indicators."
|
|
34
35
|
);
|
|
35
36
|
return f(e) ? await e.addIndicator(r, o) : d(e, r, o);
|
|
36
37
|
}
|
|
37
|
-
function
|
|
38
|
+
function p(e, r) {
|
|
38
39
|
for (const o of [...e.getAllSeries()]) {
|
|
39
40
|
const t = o.getId();
|
|
40
41
|
(t === r || t.startsWith(`${r}-`)) && e.removeSeries(t);
|
|
@@ -48,10 +49,10 @@ function v(e, r) {
|
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
export {
|
|
51
|
-
|
|
52
|
+
h as a,
|
|
52
53
|
v as b,
|
|
53
|
-
|
|
54
|
+
C as c,
|
|
54
55
|
f as i,
|
|
55
|
-
|
|
56
|
+
p as r
|
|
56
57
|
};
|
|
57
|
-
//# sourceMappingURL=chartSyncBridge-
|
|
58
|
+
//# sourceMappingURL=chartSyncBridge-D_rCtbFq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chartSyncBridge-
|
|
1
|
+
{"version":3,"file":"chartSyncBridge-D_rCtbFq.js","sources":["../src/bindings/shared/chartLifecycle.ts","../src/bindings/shared/indicatorBridge.ts","../src/bindings/shared/chartSyncBridge.ts"],"sourcesContent":["/**\n * Framework-agnostic chart lifecycle helpers.\n */\n\nimport { createChart, type Chart } from \"../../core/Chart\";\nimport type { ChartOptions, Bounds } from \"../../types\";\nimport type { BindingChartOptions } from \"./types\";\n\nexport type ChartBindingOptions = Omit<ChartOptions, \"container\"> &\n BindingChartOptions;\n\nexport interface ChartLifecycleHandle {\n chart: Chart;\n destroy: () => void;\n getBounds: () => Bounds | null;\n}\n\nexport interface ChartLifecycleCallbacks {\n onBoundsChange?: (bounds: Bounds) => void;\n onError?: (error: Error) => void;\n}\n\nfunction defaultResponsive(\n options: ChartBindingOptions,\n): ChartBindingOptions {\n const responsive = options.responsive ?? { reducedMotion: \"auto\" as const };\n return { ...options, responsive };\n}\n\nexport function createChartLifecycle(\n container: HTMLDivElement,\n options: ChartBindingOptions,\n callbacks: ChartLifecycleCallbacks = {},\n): ChartLifecycleHandle {\n const chart = createChart({\n ...defaultResponsive(options),\n container,\n });\n\n const onZoom = () => {\n callbacks.onBoundsChange?.(chart.getViewBounds());\n };\n chart.on(\"zoom\", onZoom);\n\n let resizeObserver: ResizeObserver | undefined;\n if (options.autoResize !== false) {\n resizeObserver = new ResizeObserver(() => {\n chart.resize();\n });\n resizeObserver.observe(container);\n }\n\n return {\n chart,\n getBounds: () => chart.getViewBounds(),\n destroy: () => {\n resizeObserver?.disconnect();\n chart.off(\"zoom\", onZoom);\n chart.destroy();\n },\n };\n}\n\nexport function attachZoomListener(\n chart: Chart,\n onBoundsChange: (bounds: Bounds) => void,\n): () => void {\n const handler = () => onBoundsChange(chart.getViewBounds());\n chart.on(\"zoom\", handler);\n return () => chart.off(\"zoom\", handler);\n}\n","/**\n * Indicator bridge for framework bindings.\n */\n\nimport type { Chart } from \"../../core/chart/types\";\nimport type { StackedChart } from \"../../core/stacked/types\";\nimport {\n addIndicatorToChart,\n type AddIndicatorOptions,\n type AddIndicatorResult,\n} from \"../../core/indicator/addIndicator\";\nimport type { IndicatorPresetName } from \"../../core/indicator/indicatorPresets\";\n\nexport type IndicatorHost = Chart | StackedChart | null;\n\nexport function isStackedChart(host: IndicatorHost): host is StackedChart {\n return (\n host != null &&\n \"getPanes\" in host &&\n typeof (host as StackedChart).getPanes === \"function\"\n );\n}\n\nexport async function addIndicatorToHost(\n host: IndicatorHost,\n preset: IndicatorPresetName,\n options: AddIndicatorOptions = {},\n): Promise<AddIndicatorResult & { paneId?: string }> {\n if (!host) {\n throw new Error(\n \"[useIndicator] Chart is not ready. Wait for isReady before adding indicators.\",\n );\n }\n\n if (isStackedChart(host)) {\n const result = await host.addIndicator(preset, options);\n return result;\n }\n\n return addIndicatorToChart(host, preset, options);\n}\n\nexport function removeIndicatorFromChart(\n chart: Chart,\n rootId: string,\n): void {\n for (const s of [...chart.getAllSeries()]) {\n const sid = s.getId();\n if (sid === rootId || sid.startsWith(`${rootId}-`)) {\n chart.removeSeries(sid);\n }\n }\n}\n","/**\n * Chart sync bridge for framework bindings.\n */\n\nimport {\n ChartGroup,\n createChartGroup,\n type ChartLike,\n type SyncOptions,\n} from \"../../core/sync\";\n\nexport interface ChartSyncHandle {\n group: ChartGroup;\n destroy: () => void;\n}\n\nexport function createChartSync(\n charts: ChartLike[],\n options?: SyncOptions,\n): ChartSyncHandle {\n const group = createChartGroup(charts, options);\n return {\n group,\n destroy: () => group.destroy(),\n };\n}\n\nexport function updateChartSync(\n handle: ChartSyncHandle | null,\n charts: ChartLike[],\n options?: SyncOptions,\n): ChartSyncHandle {\n handle?.destroy();\n if (charts.length < 2) {\n return { group: new ChartGroup(options), destroy: () => {} };\n }\n return createChartSync(charts, options);\n}\n"],"names":["defaultResponsive","options","responsive","createChartLifecycle","container","callbacks","chart","createChart","onZoom","_a","resizeObserver","isStackedChart","host","addIndicatorToHost","preset","addIndicatorToChart","removeIndicatorFromChart","rootId","s","sid","createChartSync","charts","group","createChartGroup"],"mappings":";;;AAsBA,SAASA,EACPC,GACqB;AACrB,QAAMC,IAAaD,EAAQ,cAAc,EAAE,eAAe,OAAA;AAC1D,SAAO,EAAE,GAAGA,GAAS,YAAAC,EAAA;AACvB;AAEO,SAASC,EACdC,GACAH,GACAI,IAAqC,CAAA,GACf;AACtB,QAAMC,IAAQC,EAAY;AAAA,IACxB,GAAGP,EAAkBC,CAAO;AAAA,IAC5B,WAAAG;AAAA,EAAA,CACD,GAEKI,IAAS,MAAM;;AACnB,KAAAC,IAAAJ,EAAU,mBAAV,QAAAI,EAAA,KAAAJ,GAA2BC,EAAM;EACnC;AACA,EAAAA,EAAM,GAAG,QAAQE,CAAM;AAEvB,MAAIE;AACJ,SAAIT,EAAQ,eAAe,OACzBS,IAAiB,IAAI,eAAe,MAAM;AACxC,IAAAJ,EAAM,OAAA;AAAA,EACR,CAAC,GACDI,EAAe,QAAQN,CAAS,IAG3B;AAAA,IACL,OAAAE;AAAA,IACA,WAAW,MAAMA,EAAM,cAAA;AAAA,IACvB,SAAS,MAAM;AACb,MAAAI,KAAA,QAAAA,EAAgB,cAChBJ,EAAM,IAAI,QAAQE,CAAM,GACxBF,EAAM,QAAA;AAAA,IACR;AAAA,EAAA;AAEJ;AC9CO,SAASK,EAAeC,GAA2C;AACxE,SACEA,KAAQ,QACR,cAAcA,KACd,OAAQA,EAAsB,YAAa;AAE/C;AAEA,eAAsBC,EACpBD,GACAE,GACAb,IAA+B,CAAA,GACoB;AACnD,MAAI,CAACW;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,SAAID,EAAeC,CAAI,IACN,MAAMA,EAAK,aAAaE,GAAQb,CAAO,IAIjDc,EAAoBH,GAAME,GAAQb,CAAO;AAClD;AAEO,SAASe,EACdV,GACAW,GACM;AACN,aAAWC,KAAK,CAAC,GAAGZ,EAAM,aAAA,CAAc,GAAG;AACzC,UAAMa,IAAMD,EAAE,MAAA;AACd,KAAIC,MAAQF,KAAUE,EAAI,WAAW,GAAGF,CAAM,GAAG,MAC/CX,EAAM,aAAaa,CAAG;AAAA,EAE1B;AACF;ACpCO,SAASC,EACdC,GACApB,GACiB;AACjB,QAAMqB,IAAQC,EAAiBF,GAAQpB,CAAO;AAC9C,SAAO;AAAA,IACL,OAAAqB;AAAA,IACA,SAAS,MAAMA,EAAM,QAAA;AAAA,EAAQ;AAEjC;"}
|
|
@@ -11,7 +11,7 @@ export declare class ChartStatistics {
|
|
|
11
11
|
constructor(parent: HTMLElement, theme: ChartTheme, series: Map<string, Series>);
|
|
12
12
|
private isDarkTheme;
|
|
13
13
|
private updateContainerStyle;
|
|
14
|
-
update(viewBounds: Bounds): void
|
|
14
|
+
update(viewBounds: Bounds): Promise<void>;
|
|
15
15
|
toggle(): void;
|
|
16
16
|
updateTheme(theme: ChartTheme): void;
|
|
17
17
|
destroy(): void;
|
|
@@ -9,11 +9,11 @@ import { ResponsiveConfig, ResponsiveState } from '../responsive';
|
|
|
9
9
|
import { ChartState, SerializeOptions, DeserializeOptions } from '../../serialization';
|
|
10
10
|
import { Chart, ExportOptions } from './types';
|
|
11
11
|
import { ChartAnimationConfig } from '../animation';
|
|
12
|
-
import {
|
|
13
|
-
import { PriceAlertOptions } from './ChartAlerts';
|
|
14
|
-
import { PositionLineOptions } from './positionLines';
|
|
12
|
+
import { ChartFeatureHooks } from './ChartFeatureHooks';
|
|
15
13
|
|
|
16
14
|
export declare class ChartImpl implements Chart {
|
|
15
|
+
/** Optional hook for extended bundles (WebGPU, etc.). */
|
|
16
|
+
static afterConstruct: ((chart: ChartImpl, options: ChartOptions) => void) | null;
|
|
17
17
|
private container;
|
|
18
18
|
private webglCanvas;
|
|
19
19
|
private overlayCanvas;
|
|
@@ -35,7 +35,6 @@ export declare class ChartImpl implements Chart {
|
|
|
35
35
|
private plotAreaBackground;
|
|
36
36
|
private renderer;
|
|
37
37
|
private activeRendererType;
|
|
38
|
-
private rendererInitPromise;
|
|
39
38
|
private overlay;
|
|
40
39
|
private interaction;
|
|
41
40
|
private xScale;
|
|
@@ -103,9 +102,8 @@ export declare class ChartImpl implements Chart {
|
|
|
103
102
|
get animations(): ChartAnimationConfig;
|
|
104
103
|
private selectionManager;
|
|
105
104
|
private responsiveManager;
|
|
106
|
-
private
|
|
105
|
+
private featureHooks;
|
|
107
106
|
private timeScaleMapping;
|
|
108
|
-
private positionLineCounter;
|
|
109
107
|
constructor(options: ChartOptions);
|
|
110
108
|
/**
|
|
111
109
|
* Start the chart initialization (called by queue system)
|
|
@@ -142,6 +140,7 @@ export declare class ChartImpl implements Chart {
|
|
|
142
140
|
};
|
|
143
141
|
private getInteractedBounds;
|
|
144
142
|
exportImage(type?: "png" | "jpeg"): string;
|
|
143
|
+
setFeatureHooks(hooks: ChartFeatureHooks | null): void;
|
|
145
144
|
exportSVG(): string;
|
|
146
145
|
private getSeriesContext;
|
|
147
146
|
addSeries(options: SeriesOptions | HeatmapOptions): void;
|
|
@@ -156,17 +155,14 @@ export declare class ChartImpl implements Chart {
|
|
|
156
155
|
* Add a line of best fit to a series
|
|
157
156
|
*/
|
|
158
157
|
addFitLine(seriesId: string, type: any, options?: any): string;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
addIndicator(preset: IndicatorPresetName, options?: AddIndicatorOptions): Promise<AddIndicatorResult>;
|
|
164
|
-
addAlert(options: PriceAlertOptions): string;
|
|
165
|
-
removeAlert(id: string): boolean;
|
|
158
|
+
private tradingRequired;
|
|
159
|
+
addIndicator(_preset: import('../indicator/addIndicator').IndicatorPresetName, _options?: import('../indicator/addIndicator').AddIndicatorOptions): Promise<import('../indicator/addIndicator').AddIndicatorResult>;
|
|
160
|
+
addAlert(_options: import('./ChartAlerts').PriceAlertOptions): string;
|
|
161
|
+
removeAlert(_id: string): boolean;
|
|
166
162
|
clearAlerts(): void;
|
|
167
|
-
getAlerts(): PriceAlertOptions[];
|
|
168
|
-
addPositionLine(
|
|
169
|
-
setDrawingMode(
|
|
163
|
+
getAlerts(): import('./ChartAlerts').PriceAlertOptions[];
|
|
164
|
+
addPositionLine(_options: import('./positionLines').PositionLineOptions): string;
|
|
165
|
+
setDrawingMode(_mode: import('../../plugins/drawing-tools').DrawingMode): void;
|
|
170
166
|
getSeries(id: string): Series | undefined;
|
|
171
167
|
getAllSeries(): Series[];
|
|
172
168
|
private getNavContext;
|
|
@@ -241,7 +237,6 @@ export declare class ChartImpl implements Chart {
|
|
|
241
237
|
getDPR(): number;
|
|
242
238
|
/** Runtime chart renderer backend in use. */
|
|
243
239
|
getActiveRenderer(): "webgl" | "webgpu";
|
|
244
|
-
private initGpuRenderer;
|
|
245
240
|
/**
|
|
246
241
|
* Set device pixel ratio and re-render
|
|
247
242
|
*/
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Series } from '../Series';
|
|
2
|
+
import { PlotArea } from '../../types';
|
|
3
|
+
|
|
4
|
+
export type OverlaySeriesDrawer = (overlayCtx: CanvasRenderingContext2D, series: Series, plotArea: PlotArea) => void;
|
|
5
|
+
export declare function registerOverlaySeriesDrawer(type: string, drawer: OverlaySeriesDrawer): void;
|
|
6
|
+
export declare function getOverlaySeriesDrawer(type: string): OverlaySeriesDrawer | undefined;
|
|
7
|
+
export declare function drawRegisteredOverlaySeries(overlayCtx: CanvasRenderingContext2D, series: Iterable<Series>, plotArea: PlotArea): void;
|
|
@@ -2,6 +2,7 @@ import { SeriesOptions, HeatmapOptions, SeriesUpdateData } from '../../../types'
|
|
|
2
2
|
|
|
3
3
|
export declare function addSeries(ctx: any, options: SeriesOptions | HeatmapOptions): void;
|
|
4
4
|
export declare function removeSeries(ctx: any, id: string): void;
|
|
5
|
+
export declare function registerSeriesDataPreprocessor(fn: (ctx: unknown, data: SeriesUpdateData) => SeriesUpdateData): void;
|
|
5
6
|
export declare function updateSeries(ctx: any, id: string, data: SeriesUpdateData): void;
|
|
6
7
|
export declare function appendData(ctx: any, id: string, x: number[] | Float32Array, y: number[] | Float32Array): void;
|
|
7
8
|
export declare function setMaxPoints(ctx: any, id: string, maxPoints: number): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Series } from '../../Series';
|
|
2
|
+
|
|
3
|
+
export declare function updateSeriesBufferLite(ctx: {
|
|
4
|
+
renderer: {
|
|
5
|
+
createBuffer(id: string, data: Float32Array): void;
|
|
6
|
+
} | null;
|
|
7
|
+
}, s: Series): void;
|
|
8
|
+
export declare function refreshStackLite(ctx: {
|
|
9
|
+
renderer: {
|
|
10
|
+
createBuffer(id: string, data: Float32Array): void;
|
|
11
|
+
} | null;
|
|
12
|
+
series: Map<string, Series>;
|
|
13
|
+
}, stackId: string): void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HeatmapOptions, SeriesOptions } from '../../../types';
|
|
2
|
+
|
|
3
|
+
export type SeriesOptionsPreprocessor = (ctx: unknown, options: SeriesOptions | HeatmapOptions) => SeriesOptions | HeatmapOptions;
|
|
4
|
+
export type SeriesOptionsExpander = (options: SeriesOptions | HeatmapOptions) => Array<SeriesOptions | HeatmapOptions>;
|
|
5
|
+
export declare function registerSeriesOptionsPreprocessor(fn: SeriesOptionsPreprocessor): void;
|
|
6
|
+
export declare function registerSeriesOptionsExpander(fn: SeriesOptionsExpander): void;
|
|
7
|
+
export declare function applySeriesOptionsPreprocessors(ctx: unknown, options: SeriesOptions | HeatmapOptions): SeriesOptions | HeatmapOptions;
|
|
8
|
+
export declare function expandSeriesOptions(options: SeriesOptions | HeatmapOptions): Array<SeriesOptions | HeatmapOptions>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Series } from '../../Series';
|
|
2
|
+
|
|
3
|
+
export type SeriesBufferHandler = (ctx: unknown, s: Series) => void;
|
|
4
|
+
export declare function registerSeriesBufferHandler(type: string, handler: SeriesBufferHandler): void;
|
|
5
|
+
export declare function getSeriesBufferHandler(type: string): SeriesBufferHandler | undefined;
|