velo-plot 3.1.0 → 4.0.0-alpha.1
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/dist/{ChartCore-AnR_3Xkb.js → ChartCore-KYG2HTcK.js} +1349 -1213
- package/dist/ChartCore-KYG2HTcK.js.map +1 -0
- package/dist/{PluginRegistry-CzMHebYP.js → PluginRegistry-CDf_jcnp.js} +2 -2
- package/dist/{PluginRegistry-CzMHebYP.js.map → PluginRegistry-CDf_jcnp.js.map} +1 -1
- package/dist/SVGDocumentBuilder-C-uLkcFW.js +83 -0
- package/dist/SVGDocumentBuilder-C-uLkcFW.js.map +1 -0
- package/dist/angular-hooks.js +1 -1
- package/dist/angular.js +4 -4
- package/dist/{chartSyncBridge-D_rCtbFq.js → chartSyncBridge-C1uRy0ZS.js} +3 -3
- package/dist/{chartSyncBridge-D_rCtbFq.js.map → chartSyncBridge-C1uRy0ZS.js.map} +1 -1
- package/dist/core/chart/ChartCore.d.ts +7 -3
- package/dist/core/chart/ChartRenderLoop.d.ts +5 -0
- package/dist/core/chart/ChartRenderer.d.ts +9 -0
- package/dist/core/chart/ChartSetup.d.ts +1 -0
- package/dist/core/chart/exporter/SVGExporter.d.ts +9 -7
- package/dist/core/chart/exporter/svg/SVGDocumentBuilder.d.ts +27 -0
- package/dist/core/chart/exporter/svg/SVGExportContext.d.ts +147 -0
- package/dist/core/chart/exporter/svg/SVGOrchestrator.d.ts +3 -0
- package/dist/core/chart/exporter/svg/SVGThemeAdapter.d.ts +22 -0
- package/dist/core/chart/exporter/svg/__tests__/testFixtures.d.ts +46 -0
- package/dist/core/chart/exporter/svg/__tests__/visualTestUtils.d.ts +12 -0
- package/dist/core/chart/exporter/svg/overlay/axes.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/border.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/errorBars.d.ts +7 -0
- package/dist/core/chart/exporter/svg/overlay/grid.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/index.d.ts +12 -0
- package/dist/core/chart/exporter/svg/overlay/legend.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/pluginCharts.d.ts +6 -0
- package/dist/core/chart/exporter/svg/overlay/polarGrid.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/specialChart.d.ts +15 -0
- package/dist/core/chart/exporter/svg/overlay/title.d.ts +4 -0
- package/dist/core/chart/exporter/svg/plugins/annotations.d.ts +5 -0
- package/dist/core/chart/exporter/svg/plugins/brokenAxis.d.ts +20 -0
- package/dist/core/chart/exporter/svg/plugins/latex.d.ts +9 -0
- package/dist/core/chart/exporter/svg/plugins/register.d.ts +8 -0
- package/dist/core/chart/exporter/svg/plugins/regression.d.ts +33 -0
- package/dist/core/chart/exporter/svg/plugins/roi.d.ts +12 -0
- package/dist/core/chart/exporter/svg/plugins/tradeMarkers.d.ts +3 -0
- package/dist/core/chart/exporter/svg/plugins/types.d.ts +28 -0
- package/dist/core/chart/exporter/svg/plugins/watermark.d.ts +13 -0
- package/dist/core/chart/exporter/svg/series/band.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/bar.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/boxplot.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/candlestick.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/finitePoints.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/gauge.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/heatmap.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/indicator.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/line.d.ts +12 -0
- package/dist/core/chart/exporter/svg/series/polar.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/radar.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/registry.d.ts +10 -0
- package/dist/core/chart/exporter/svg/series/sankey.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/scatter.d.ts +1 -0
- package/dist/core/chart/exporter/svg/series/ternary.d.ts +7 -0
- package/dist/core/chart/exporter/svg/series/waterfall.d.ts +6 -0
- package/dist/core/chart/exporter/svg/seriesAtTimestamp.d.ts +4 -0
- package/dist/core/chart/exporter/svg/seriesUtils.d.ts +3 -0
- package/dist/core/chart/exporter/svg/symbols.d.ts +5 -0
- package/dist/core/chart/exporter/svg/tickUtils.d.ts +9 -0
- package/dist/core/chart/mountSVGString.d.ts +5 -0
- package/dist/core/chart/types.d.ts +2 -2
- package/dist/core/stacked/StackSVGComposer.d.ts +14 -0
- package/dist/core/stacked/index.d.ts +3 -2
- package/dist/core/stacked/types.d.ts +12 -4
- package/dist/createStackedChart-DjA3aJAu.js +2761 -0
- package/dist/createStackedChart-DjA3aJAu.js.map +1 -0
- package/dist/{hooks-DH-3bewj.js → hooks-4wQH27r9.js} +3 -3
- package/dist/{hooks-DH-3bewj.js.map → hooks-4wQH27r9.js.map} +1 -1
- package/dist/index-Bj-xyXY6.js +582 -0
- package/dist/index-Bj-xyXY6.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +5 -0
- package/dist/plugins/annotations.js +8 -7
- package/dist/plugins/annotations.js.map +1 -1
- package/dist/plugins/broken-axis.js +198 -152
- package/dist/plugins/broken-axis.js.map +1 -1
- package/dist/plugins/forecasting.js +273 -258
- package/dist/plugins/forecasting.js.map +1 -1
- package/dist/plugins/ml-integration.js +107 -93
- package/dist/plugins/ml-integration.js.map +1 -1
- package/dist/plugins/radar/types.d.ts +11 -0
- package/dist/plugins/radar.js +64 -53
- package/dist/plugins/radar.js.map +1 -1
- package/dist/plugins/roi/index.d.ts +2 -0
- package/dist/plugins/roi.js +184 -145
- package/dist/plugins/roi.js.map +1 -1
- package/dist/plugins/snapshot.js +20 -15
- package/dist/plugins/snapshot.js.map +1 -1
- package/dist/plugins/types.d.ts +4 -0
- package/dist/react.js +2 -2
- package/dist/regression-HNdyk1Dm.js +28 -0
- package/dist/regression-HNdyk1Dm.js.map +1 -0
- package/dist/renderer/ChartSeriesRenderer.d.ts +3 -2
- package/dist/renderer/SVGChartRenderer.d.ts +15 -0
- package/dist/renderer/SankeyRenderer.d.ts +1 -0
- package/dist/renderer/registerSVG.d.ts +5 -0
- package/dist/renderer/sankeyLayout.d.ts +29 -0
- package/dist/scientific.js +2 -2
- package/dist/solid.js +2 -2
- package/dist/svelte.js +2 -2
- package/dist/tickUtils-B_X-ha13.js +41 -0
- package/dist/tickUtils-B_X-ha13.js.map +1 -0
- package/dist/trading.js +3 -3
- package/dist/types.d.ts +2 -1
- package/dist/velo-plot.full.js +1107 -1292
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +2 -2
- package/dist/vue/VeloPlot.vue.d.ts +1 -1
- package/dist/vue/index.d.ts +33 -33
- package/dist/vue.js +2 -2
- package/package.json +6 -1
- package/dist/ChartCore-AnR_3Xkb.js.map +0 -1
- package/dist/createStackedChart-DqcLCFGS.js +0 -1338
- package/dist/createStackedChart-DqcLCFGS.js.map +0 -1
- package/dist/index-Cv6ZDLWf.js +0 -521
- package/dist/index-Cv6ZDLWf.js.map +0 -1
package/dist/plugins/snapshot.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
const
|
|
1
|
+
const k = {
|
|
2
2
|
name: "velo-plot-snapshot",
|
|
3
3
|
version: "1.0.0",
|
|
4
4
|
description: "High-resolution image export for velo-plot",
|
|
5
5
|
provides: ["export", "snapshot"],
|
|
6
6
|
tags: ["snapshot", "export", "publication", "image"]
|
|
7
|
-
},
|
|
7
|
+
}, b = {
|
|
8
8
|
format: "png",
|
|
9
9
|
quality: 0.9,
|
|
10
10
|
resolution: "standard",
|
|
@@ -15,7 +15,7 @@ const b = {
|
|
|
15
15
|
fileName: "velo-plot-snapshot-export",
|
|
16
16
|
download: !1
|
|
17
17
|
};
|
|
18
|
-
function
|
|
18
|
+
function O(c) {
|
|
19
19
|
if (typeof c == "number") return c;
|
|
20
20
|
switch (c) {
|
|
21
21
|
case "8k":
|
|
@@ -30,23 +30,28 @@ function R(c) {
|
|
|
30
30
|
return 1;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
function
|
|
33
|
+
function P(c = {}) {
|
|
34
34
|
let a = null;
|
|
35
35
|
async function p(t = {}) {
|
|
36
|
-
var
|
|
36
|
+
var f, h;
|
|
37
37
|
if (!a) throw new Error("Snapshot plugin not initialized");
|
|
38
|
-
const e = { ...
|
|
38
|
+
const e = { ...b, ...c.defaultOptions, ...t }, n = a.chart, s = O(e.resolution), i = n.getDPR();
|
|
39
39
|
try {
|
|
40
40
|
if (e.format === "svg") {
|
|
41
|
-
const o = n.exportSVG(
|
|
41
|
+
const o = n.exportSVG({
|
|
42
|
+
includeOverlays: e.includeOverlays,
|
|
43
|
+
includeAnnotations: e.includeOverlays,
|
|
44
|
+
includeLegend: !0,
|
|
45
|
+
watermarkText: e.watermarkText || void 0
|
|
46
|
+
});
|
|
42
47
|
if (e.download) {
|
|
43
|
-
const l = new Blob([o], { type: "image/svg+xml" }), w = URL.createObjectURL(l),
|
|
44
|
-
|
|
48
|
+
const l = new Blob([o], { type: "image/svg+xml" }), w = URL.createObjectURL(l), u = document.createElement("a");
|
|
49
|
+
u.download = `${e.fileName}.svg`, u.href = w, document.body.appendChild(u), u.click(), document.body.removeChild(u), URL.revokeObjectURL(w);
|
|
45
50
|
}
|
|
46
51
|
return o;
|
|
47
52
|
}
|
|
48
53
|
s > 1 && (typeof n.setDevicePixelRatioOverride == "function" ? n.setDevicePixelRatioOverride(i * s) : n.setDPR(i * s), typeof n.render == "function" && n.render(), await new Promise((o) => requestAnimationFrame(o)), await new Promise((o) => requestAnimationFrame(o)), await new Promise((o) => setTimeout(o, 100)));
|
|
49
|
-
const m = (
|
|
54
|
+
const m = (f = a.render.gl) == null ? void 0 : f.canvas, g = (h = a.render.ctx2d) == null ? void 0 : h.canvas;
|
|
50
55
|
if (!m) throw new Error("WebGL canvas not found");
|
|
51
56
|
const r = document.createElement("canvas");
|
|
52
57
|
r.width = m.width, r.height = m.height;
|
|
@@ -64,11 +69,11 @@ function S(c = {}) {
|
|
|
64
69
|
}
|
|
65
70
|
function x(t, e, n, s, i) {
|
|
66
71
|
t.save();
|
|
67
|
-
const
|
|
68
|
-
t.font = `bold ${
|
|
72
|
+
const f = Math.max(16, 24 * (i / 2));
|
|
73
|
+
t.font = `bold ${f}px Inter, system-ui, sans-serif`, t.fillStyle = "rgba(128, 128, 128, 0.4)", t.textAlign = "right", t.textBaseline = "bottom", t.fillText(e, n - 20 * i / 2, s - 20 * i / 2), t.restore();
|
|
69
74
|
}
|
|
70
75
|
return {
|
|
71
|
-
manifest:
|
|
76
|
+
manifest: k,
|
|
72
77
|
onInit(t) {
|
|
73
78
|
a = t, a.log.info("Snapshot plugin initialized");
|
|
74
79
|
},
|
|
@@ -84,7 +89,7 @@ function S(c = {}) {
|
|
|
84
89
|
};
|
|
85
90
|
}
|
|
86
91
|
export {
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
P as PluginSnapshot,
|
|
93
|
+
P as default
|
|
89
94
|
};
|
|
90
95
|
//# sourceMappingURL=snapshot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sources":["../../src/plugins/snapshot/index.ts"],"sourcesContent":["/**\n * VeloPlot - Snapshot Plugin\n * \n * Provides high-resolution image export capabilities.\n * Supports different formats (PNG, JPEG, WebP) and resolutions (Standard, 2K, 4K, 8K).\n * \n * @module plugins/snapshot\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n} from '../types';\n\nimport type {\n PluginSnapshotConfig,\n SnapshotExportAPI,\n SnapshotExportOptions,\n SnapshotResolution,\n} from './types';\n\nconst manifestSnapshot: PluginManifest = {\n name: \"velo-plot-snapshot\",\n version: \"1.0.0\",\n description: \"High-resolution image export for velo-plot\",\n provides: [\"export\", \"snapshot\"],\n tags: [\"snapshot\", \"export\", \"publication\", \"image\"],\n};\n\nconst DEFAULT_OPTIONS: Required<SnapshotExportOptions> = {\n format: 'png',\n quality: 0.9,\n resolution: 'standard',\n includeBackground: true,\n includeOverlays: true,\n watermarkText: '',\n transparent: false,\n fileName: 'velo-plot-snapshot-export',\n download: false\n};\n\nfunction resolutionToScale(res: SnapshotResolution): number {\n if (typeof res === 'number') return res;\n switch (res) {\n case '8k': return 8;\n case '4k': return 4;\n case '2k': return 2;\n case 'standard': return 1;\n default: return 1;\n }\n}\n\n/**\n * VeloPlot Snapshot Plugin\n * \n * Captures the current chart view with all layers (WebGL + Overlay).\n */\nexport function PluginSnapshot(\n config: PluginSnapshotConfig = {}\n): ChartPlugin<PluginSnapshotConfig> {\n let ctx: PluginContext | null = null;\n\n /**\n * Captures the chart as an image\n */\n async function takeSnapshot(options: SnapshotExportOptions = {}): Promise<string | Blob> {\n if (!ctx) throw new Error(\"Snapshot plugin not initialized\");\n \n const opt = { ...DEFAULT_OPTIONS, ...config.defaultOptions, ...options };\n const chart = ctx.chart;\n \n // 1. Determine target resolution scale\n const scale = resolutionToScale(opt.resolution);\n const originalDPR = chart.getDPR();\n \n try {\n if (opt.format === 'svg') {\n const svg = chart.exportSVG();\n if (opt.download) {\n const blob = new Blob([svg], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.download = `${opt.fileName}.svg`;\n link.href = url;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n return svg;\n }\n\n // High-res re-render if scale > 1.\n // We temporarily lock the device pixel ratio to force a higher-resolution\n // render. Using an explicit override (instead of setDPR) is essential:\n // a plain setDPR gets reverted by the very next resize() call, so the\n // backing stores would stay at screen resolution and every preset would\n // look identical / pixelated. The override survives resize().\n if (scale > 1) {\n if (typeof chart.setDevicePixelRatioOverride === 'function') {\n chart.setDevicePixelRatioOverride(originalDPR * scale);\n } else {\n chart.setDPR(originalDPR * scale);\n }\n // Force a synchronous full render at the boosted DPR before capture.\n if (typeof chart.render === 'function') {\n chart.render();\n }\n // Wait for DOM and GL updates\n await new Promise(r => requestAnimationFrame(r));\n // Second frame ensures the resized backing store has actually been painted.\n await new Promise(r => requestAnimationFrame(r));\n // Small delay to ensure all overlays (which might have their own throttles) are ready\n await new Promise(r => setTimeout(r, 100));\n }\n\n const webglCanvas = (ctx.render.gl?.canvas) as HTMLCanvasElement;\n const overlayCanvas = (ctx.render.ctx2d?.canvas) as HTMLCanvasElement;\n \n if (!webglCanvas) throw new Error(\"WebGL canvas not found\");\n\n // 3. Compose layers into a final canvas\n const compositionCanvas = document.createElement('canvas');\n compositionCanvas.width = webglCanvas.width;\n compositionCanvas.height = webglCanvas.height;\n const compCtx = compositionCanvas.getContext('2d')!;\n \n // Fill background if not transparent\n if (!opt.transparent && opt.includeBackground) {\n compCtx.fillStyle = ctx.ui.theme.backgroundColor || '#ffffff';\n compCtx.fillRect(0, 0, compositionCanvas.width, compositionCanvas.height);\n }\n \n // Draw WebGL layer (bottom)\n compCtx.drawImage(webglCanvas, 0, 0);\n \n // Draw Overlay layer (top) - contains annotations, tooltips, etc.\n if (opt.includeOverlays && overlayCanvas) {\n compCtx.drawImage(overlayCanvas, 0, 0);\n }\n \n // Apply Watermark\n if (opt.watermarkText) {\n drawWatermark(compCtx, opt.watermarkText, compositionCanvas.width, compositionCanvas.height, originalDPR * scale);\n }\n \n const mimeType = `image/${opt.format}`;\n const dataUrl = compositionCanvas.toDataURL(mimeType, opt.quality);\n \n // Automatic download if requested\n if (opt.download) {\n const extension = opt.format === 'jpeg' ? 'jpg' : opt.format;\n const link = document.createElement('a');\n link.download = `${opt.fileName}.${extension}`;\n link.href = dataUrl;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n \n return dataUrl;\n } finally {\n // 4. Restore original resolution\n if (scale > 1) {\n if (typeof chart.setDevicePixelRatioOverride === 'function') {\n chart.setDevicePixelRatioOverride(null);\n } else {\n chart.setDPR(originalDPR);\n }\n }\n }\n }\n\n /**\n * Helper to draw a watermark on the captured image\n */\n function drawWatermark(c: CanvasRenderingContext2D, text: string, w: number, h: number, dpr: number) {\n c.save();\n // Scale font size according to DPR\n const fontSize = Math.max(16, 24 * (dpr / 2));\n c.font = `bold ${fontSize}px Inter, system-ui, sans-serif`;\n c.fillStyle = 'rgba(128, 128, 128, 0.4)';\n c.textAlign = 'right';\n c.textBaseline = 'bottom';\n c.fillText(text, w - (20 * dpr/2), h - (20 * dpr/2));\n c.restore();\n }\n\n const api: SnapshotExportAPI & Record<string, unknown> = {\n takeSnapshot,\n downloadSnapshot: async (opt: SnapshotExportOptions) => {\n await takeSnapshot({ ...opt, download: true });\n }\n };\n\n return {\n manifest: manifestSnapshot,\n onInit(c) { \n ctx = c; \n ctx.log.info(\"Snapshot plugin initialized\");\n },\n onDestroy() {\n ctx = null;\n },\n api\n };\n}\n\nexport default PluginSnapshot;\n\nexport type {\n SnapshotFormat,\n SnapshotResolution,\n SnapshotExportOptions,\n SnapshotExportAPI,\n PluginSnapshotConfig\n} from './types';\n"],"names":["manifestSnapshot","DEFAULT_OPTIONS","resolutionToScale","res","PluginSnapshot","config","ctx","takeSnapshot","options","_a","_b","opt","chart","scale","originalDPR","svg","blob","url","link","r","webglCanvas","overlayCanvas","compositionCanvas","compCtx","drawWatermark","mimeType","dataUrl","extension","c","text","w","h","dpr","fontSize"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snapshot.js","sources":["../../src/plugins/snapshot/index.ts"],"sourcesContent":["/**\n * VeloPlot - Snapshot Plugin\n * \n * Provides high-resolution image export capabilities.\n * Supports different formats (PNG, JPEG, WebP) and resolutions (Standard, 2K, 4K, 8K).\n * \n * @module plugins/snapshot\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n} from '../types';\n\nimport type {\n PluginSnapshotConfig,\n SnapshotExportAPI,\n SnapshotExportOptions,\n SnapshotResolution,\n} from './types';\n\nconst manifestSnapshot: PluginManifest = {\n name: \"velo-plot-snapshot\",\n version: \"1.0.0\",\n description: \"High-resolution image export for velo-plot\",\n provides: [\"export\", \"snapshot\"],\n tags: [\"snapshot\", \"export\", \"publication\", \"image\"],\n};\n\nconst DEFAULT_OPTIONS: Required<SnapshotExportOptions> = {\n format: 'png',\n quality: 0.9,\n resolution: 'standard',\n includeBackground: true,\n includeOverlays: true,\n watermarkText: '',\n transparent: false,\n fileName: 'velo-plot-snapshot-export',\n download: false\n};\n\nfunction resolutionToScale(res: SnapshotResolution): number {\n if (typeof res === 'number') return res;\n switch (res) {\n case '8k': return 8;\n case '4k': return 4;\n case '2k': return 2;\n case 'standard': return 1;\n default: return 1;\n }\n}\n\n/**\n * VeloPlot Snapshot Plugin\n * \n * Captures the current chart view with all layers (WebGL + Overlay).\n */\nexport function PluginSnapshot(\n config: PluginSnapshotConfig = {}\n): ChartPlugin<PluginSnapshotConfig> {\n let ctx: PluginContext | null = null;\n\n /**\n * Captures the chart as an image\n */\n async function takeSnapshot(options: SnapshotExportOptions = {}): Promise<string | Blob> {\n if (!ctx) throw new Error(\"Snapshot plugin not initialized\");\n \n const opt = { ...DEFAULT_OPTIONS, ...config.defaultOptions, ...options };\n const chart = ctx.chart;\n \n // 1. Determine target resolution scale\n const scale = resolutionToScale(opt.resolution);\n const originalDPR = chart.getDPR();\n \n try {\n if (opt.format === 'svg') {\n const svg = chart.exportSVG({\n includeOverlays: opt.includeOverlays,\n includeAnnotations: opt.includeOverlays,\n includeLegend: true,\n watermarkText: opt.watermarkText || undefined,\n });\n if (opt.download) {\n const blob = new Blob([svg], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.download = `${opt.fileName}.svg`;\n link.href = url;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n return svg;\n }\n\n // High-res re-render if scale > 1.\n // We temporarily lock the device pixel ratio to force a higher-resolution\n // render. Using an explicit override (instead of setDPR) is essential:\n // a plain setDPR gets reverted by the very next resize() call, so the\n // backing stores would stay at screen resolution and every preset would\n // look identical / pixelated. The override survives resize().\n if (scale > 1) {\n if (typeof chart.setDevicePixelRatioOverride === 'function') {\n chart.setDevicePixelRatioOverride(originalDPR * scale);\n } else {\n chart.setDPR(originalDPR * scale);\n }\n // Force a synchronous full render at the boosted DPR before capture.\n if (typeof chart.render === 'function') {\n chart.render();\n }\n // Wait for DOM and GL updates\n await new Promise(r => requestAnimationFrame(r));\n // Second frame ensures the resized backing store has actually been painted.\n await new Promise(r => requestAnimationFrame(r));\n // Small delay to ensure all overlays (which might have their own throttles) are ready\n await new Promise(r => setTimeout(r, 100));\n }\n\n const webglCanvas = (ctx.render.gl?.canvas) as HTMLCanvasElement;\n const overlayCanvas = (ctx.render.ctx2d?.canvas) as HTMLCanvasElement;\n \n if (!webglCanvas) throw new Error(\"WebGL canvas not found\");\n\n // 3. Compose layers into a final canvas\n const compositionCanvas = document.createElement('canvas');\n compositionCanvas.width = webglCanvas.width;\n compositionCanvas.height = webglCanvas.height;\n const compCtx = compositionCanvas.getContext('2d')!;\n \n // Fill background if not transparent\n if (!opt.transparent && opt.includeBackground) {\n compCtx.fillStyle = ctx.ui.theme.backgroundColor || '#ffffff';\n compCtx.fillRect(0, 0, compositionCanvas.width, compositionCanvas.height);\n }\n \n // Draw WebGL layer (bottom)\n compCtx.drawImage(webglCanvas, 0, 0);\n \n // Draw Overlay layer (top) - contains annotations, tooltips, etc.\n if (opt.includeOverlays && overlayCanvas) {\n compCtx.drawImage(overlayCanvas, 0, 0);\n }\n \n // Apply Watermark\n if (opt.watermarkText) {\n drawWatermark(compCtx, opt.watermarkText, compositionCanvas.width, compositionCanvas.height, originalDPR * scale);\n }\n \n const mimeType = `image/${opt.format}`;\n const dataUrl = compositionCanvas.toDataURL(mimeType, opt.quality);\n \n // Automatic download if requested\n if (opt.download) {\n const extension = opt.format === 'jpeg' ? 'jpg' : opt.format;\n const link = document.createElement('a');\n link.download = `${opt.fileName}.${extension}`;\n link.href = dataUrl;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n \n return dataUrl;\n } finally {\n // 4. Restore original resolution\n if (scale > 1) {\n if (typeof chart.setDevicePixelRatioOverride === 'function') {\n chart.setDevicePixelRatioOverride(null);\n } else {\n chart.setDPR(originalDPR);\n }\n }\n }\n }\n\n /**\n * Helper to draw a watermark on the captured image\n */\n function drawWatermark(c: CanvasRenderingContext2D, text: string, w: number, h: number, dpr: number) {\n c.save();\n // Scale font size according to DPR\n const fontSize = Math.max(16, 24 * (dpr / 2));\n c.font = `bold ${fontSize}px Inter, system-ui, sans-serif`;\n c.fillStyle = 'rgba(128, 128, 128, 0.4)';\n c.textAlign = 'right';\n c.textBaseline = 'bottom';\n c.fillText(text, w - (20 * dpr/2), h - (20 * dpr/2));\n c.restore();\n }\n\n const api: SnapshotExportAPI & Record<string, unknown> = {\n takeSnapshot,\n downloadSnapshot: async (opt: SnapshotExportOptions) => {\n await takeSnapshot({ ...opt, download: true });\n }\n };\n\n return {\n manifest: manifestSnapshot,\n onInit(c) { \n ctx = c; \n ctx.log.info(\"Snapshot plugin initialized\");\n },\n onDestroy() {\n ctx = null;\n },\n api\n };\n}\n\nexport default PluginSnapshot;\n\nexport type {\n SnapshotFormat,\n SnapshotResolution,\n SnapshotExportOptions,\n SnapshotExportAPI,\n PluginSnapshotConfig\n} from './types';\n"],"names":["manifestSnapshot","DEFAULT_OPTIONS","resolutionToScale","res","PluginSnapshot","config","ctx","takeSnapshot","options","_a","_b","opt","chart","scale","originalDPR","svg","blob","url","link","r","webglCanvas","overlayCanvas","compositionCanvas","compCtx","drawWatermark","mimeType","dataUrl","extension","c","text","w","h","dpr","fontSize"],"mappings":"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"}
|
package/dist/plugins/types.d.ts
CHANGED
|
@@ -333,6 +333,10 @@ export interface ChartPlugin<TConfig = unknown> {
|
|
|
333
333
|
* Use for custom 2D canvas rendering
|
|
334
334
|
*/
|
|
335
335
|
onRenderOverlay?(ctx: PluginContext, event: AfterRenderEvent): void;
|
|
336
|
+
/**
|
|
337
|
+
* Called during SVG export to contribute vector overlay elements.
|
|
338
|
+
*/
|
|
339
|
+
onExportSVG?(ctx: import('../core/chart/exporter/svg/plugins/types').SVGExportPluginContext): void;
|
|
336
340
|
/**
|
|
337
341
|
* Called after all rendering is complete
|
|
338
342
|
*/
|
package/dist/react.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as O, jsxs as A } from "react/jsx-runtime";
|
|
2
2
|
import { useState as R, useRef as m, useEffect as b, useCallback as E, forwardRef as F, useImperativeHandle as K, useMemo as T } from "react";
|
|
3
3
|
import { p as B, o as j, s as G, d as H } from "./optionsSync-QUiN4Inw.js";
|
|
4
|
-
import { c as J, a as X, i as Y, r as Z, b as q } from "./chartSyncBridge-
|
|
4
|
+
import { c as J, a as X, i as Y, r as Z, b as q } from "./chartSyncBridge-C1uRy0ZS.js";
|
|
5
5
|
import { a as D, u as L } from "./a11y-Bw6urYpr.js";
|
|
6
6
|
import { s as P, b as z, a as Q } from "./stackedSync-tnrunZMt.js";
|
|
7
|
-
import { c as U } from "./createStackedChart-
|
|
7
|
+
import { c as U } from "./createStackedChart-DjA3aJAu.js";
|
|
8
8
|
function I(a, t = {}) {
|
|
9
9
|
const [l, n] = R(null), [i, p] = R(!1), [S, C] = R(null), [y, d] = R(null), c = m(null), o = m(null), v = m(t), x = m(B(t));
|
|
10
10
|
v.current = t, b(() => {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { f as e } from "./SVGDocumentBuilder-C-uLkcFW.js";
|
|
2
|
+
import { p as a } from "./tickUtils-B_X-ha13.js";
|
|
3
|
+
function f(o, n) {
|
|
4
|
+
if (!o.builder || n.points.length < 2) return;
|
|
5
|
+
const r = a(o.yScales), p = n.color ?? "#3b82f6";
|
|
6
|
+
if (n.band) {
|
|
7
|
+
const s = [];
|
|
8
|
+
for (const t of n.band.upper)
|
|
9
|
+
s.push(`${e(o.xScale.transform(t.x))},${e(r.transform(t.y))}`);
|
|
10
|
+
for (let t = n.band.lower.length - 1; t >= 0; t--) {
|
|
11
|
+
const i = n.band.lower[t];
|
|
12
|
+
s.push(`${e(o.xScale.transform(i.x))},${e(r.transform(i.y))}`);
|
|
13
|
+
}
|
|
14
|
+
o.builder.push("plugins", `<polygon points="${s.join(" ")}" fill="${p}" fill-opacity="0.15" stroke="none"/>`);
|
|
15
|
+
}
|
|
16
|
+
const l = n.points.map((s) => `${e(o.xScale.transform(s.x))},${e(r.transform(s.y))}`).join(" ");
|
|
17
|
+
o.builder.push(
|
|
18
|
+
"plugins",
|
|
19
|
+
`<polyline points="${l}" fill="none" stroke="${p}" stroke-width="2" stroke-dasharray="6,4"/>`
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
function d(o, n, r, p = "#8b5cf6") {
|
|
23
|
+
f(o, { points: n, color: p, band: r ? { upper: r.upper, lower: r.lower } : void 0 });
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
d as e
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=regression-HNdyk1Dm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regression-HNdyk1Dm.js","sources":["../src/core/chart/exporter/svg/plugins/regression.ts"],"sourcesContent":["import type { SVGExportPluginContext } from \"./types\";\nimport { fmt } from \"../SVGDocumentBuilder\";\nimport { primaryYScale } from \"../tickUtils\";\n\nexport interface RegressionOverlay {\n points: Array<{ x: number; y: number }>;\n color?: string;\n band?: { upper: Array<{ x: number; y: number }>; lower: Array<{ x: number; y: number }> };\n}\n\nexport function exportRegressionOverlay(ctx: SVGExportPluginContext, overlay: RegressionOverlay): void {\n if (!ctx.builder || overlay.points.length < 2) return;\n const yScale = primaryYScale(ctx.yScales)!;\n const color = overlay.color ?? \"#3b82f6\";\n\n if (overlay.band) {\n const bandPts: string[] = [];\n for (const p of overlay.band.upper) {\n bandPts.push(`${fmt(ctx.xScale.transform(p.x))},${fmt(yScale.transform(p.y))}`);\n }\n for (let i = overlay.band.lower.length - 1; i >= 0; i--) {\n const p = overlay.band.lower[i];\n bandPts.push(`${fmt(ctx.xScale.transform(p.x))},${fmt(yScale.transform(p.y))}`);\n }\n ctx.builder.push(\"plugins\", `<polygon points=\"${bandPts.join(\" \")}\" fill=\"${color}\" fill-opacity=\"0.15\" stroke=\"none\"/>`);\n }\n\n const linePts = overlay.points\n .map((p) => `${fmt(ctx.xScale.transform(p.x))},${fmt(yScale.transform(p.y))}`)\n .join(\" \");\n ctx.builder.push(\n \"plugins\",\n `<polyline points=\"${linePts}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"2\" stroke-dasharray=\"6,4\"/>`,\n );\n}\n\nexport function exportForecastOverlay(\n ctx: SVGExportPluginContext,\n forecast: Array<{ x: number; y: number }>,\n ci?: { upper: Array<{ x: number; y: number }>; lower: Array<{ x: number; y: number }> },\n color = \"#8b5cf6\",\n): void {\n exportRegressionOverlay(ctx, { points: forecast, color, band: ci ? { upper: ci.upper, lower: ci.lower } : undefined });\n}\n"],"names":["exportRegressionOverlay","ctx","overlay","yScale","primaryYScale","color","bandPts","p","fmt","i","linePts","exportForecastOverlay","forecast","ci"],"mappings":";;AAUO,SAASA,EAAwBC,GAA6BC,GAAkC;AACrG,MAAI,CAACD,EAAI,WAAWC,EAAQ,OAAO,SAAS,EAAG;AAC/C,QAAMC,IAASC,EAAcH,EAAI,OAAO,GAClCI,IAAQH,EAAQ,SAAS;AAE/B,MAAIA,EAAQ,MAAM;AAChB,UAAMI,IAAoB,CAAA;AAC1B,eAAWC,KAAKL,EAAQ,KAAK;AAC3B,MAAAI,EAAQ,KAAK,GAAGE,EAAIP,EAAI,OAAO,UAAUM,EAAE,CAAC,CAAC,CAAC,IAAIC,EAAIL,EAAO,UAAUI,EAAE,CAAC,CAAC,CAAC,EAAE;AAEhF,aAASE,IAAIP,EAAQ,KAAK,MAAM,SAAS,GAAGO,KAAK,GAAGA,KAAK;AACvD,YAAMF,IAAIL,EAAQ,KAAK,MAAMO,CAAC;AAC9B,MAAAH,EAAQ,KAAK,GAAGE,EAAIP,EAAI,OAAO,UAAUM,EAAE,CAAC,CAAC,CAAC,IAAIC,EAAIL,EAAO,UAAUI,EAAE,CAAC,CAAC,CAAC,EAAE;AAAA,IAChF;AACA,IAAAN,EAAI,QAAQ,KAAK,WAAW,oBAAoBK,EAAQ,KAAK,GAAG,CAAC,WAAWD,CAAK,uCAAuC;AAAA,EAC1H;AAEA,QAAMK,IAAUR,EAAQ,OACrB,IAAI,CAACK,MAAM,GAAGC,EAAIP,EAAI,OAAO,UAAUM,EAAE,CAAC,CAAC,CAAC,IAAIC,EAAIL,EAAO,UAAUI,EAAE,CAAC,CAAC,CAAC,EAAE,EAC5E,KAAK,GAAG;AACX,EAAAN,EAAI,QAAQ;AAAA,IACV;AAAA,IACA,qBAAqBS,CAAO,yBAAyBL,CAAK;AAAA,EAAA;AAE9D;AAEO,SAASM,EACdV,GACAW,GACAC,GACAR,IAAQ,WACF;AACN,EAAAL,EAAwBC,GAAK,EAAE,QAAQW,GAAU,OAAAP,GAAO,MAAMQ,IAAK,EAAE,OAAOA,EAAG,OAAO,OAAOA,EAAG,MAAA,IAAU,QAAW;AACvH;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NativeWebGLRenderer } from './NativeWebGLRenderer';
|
|
2
2
|
import { GpuChartRenderer } from './GpuChartRenderer';
|
|
3
|
+
import { SVGChartRenderer } from './SVGChartRenderer';
|
|
3
4
|
|
|
4
|
-
export type ChartSeriesRenderer = NativeWebGLRenderer | GpuChartRenderer;
|
|
5
|
-
export type ChartRendererBackend = "webgl" | "webgpu";
|
|
5
|
+
export type ChartSeriesRenderer = NativeWebGLRenderer | GpuChartRenderer | SVGChartRenderer;
|
|
6
|
+
export type ChartRendererBackend = "webgl" | "webgpu" | "svg";
|
|
6
7
|
export declare function getRendererBackend(renderer: ChartSeriesRenderer): ChartRendererBackend;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No-op series renderer — vector output is produced by the SVG export pipeline each frame.
|
|
3
|
+
*/
|
|
4
|
+
export declare class SVGChartRenderer {
|
|
5
|
+
readonly backend: "svg";
|
|
6
|
+
setDPR(_dpr: number): void;
|
|
7
|
+
resize(): void;
|
|
8
|
+
render(): void;
|
|
9
|
+
createBuffer(_id: string, _data: Float32Array): void;
|
|
10
|
+
updateBuffer(_id: string, _data: Float32Array, _offsetInBytes?: number): boolean;
|
|
11
|
+
getBuffer(_id: string): WebGLBuffer | undefined;
|
|
12
|
+
getTexture(_id: string): WebGLTexture | undefined;
|
|
13
|
+
deleteBuffer(_id: string): void;
|
|
14
|
+
destroy(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SankeyData, SankeyStyle, PlotArea, SankeyLink } from '../types';
|
|
2
|
+
|
|
3
|
+
export interface SankeyNodeLayout {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
color: string;
|
|
9
|
+
value: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SankeyLinkLayout {
|
|
12
|
+
source: SankeyNodeLayout;
|
|
13
|
+
target: SankeyNodeLayout;
|
|
14
|
+
sourceOffset: number;
|
|
15
|
+
targetOffset: number;
|
|
16
|
+
sourceTotal: number;
|
|
17
|
+
targetTotal: number;
|
|
18
|
+
value: number;
|
|
19
|
+
link: SankeyLink;
|
|
20
|
+
}
|
|
21
|
+
export interface SankeyLayoutResult {
|
|
22
|
+
workingArea: PlotArea;
|
|
23
|
+
nodeRegistry: Map<string | number, SankeyNodeLayout>;
|
|
24
|
+
links: SankeyLinkLayout[];
|
|
25
|
+
nodeInValue: Map<string | number, number>;
|
|
26
|
+
nodeOutValue: Map<string | number, number>;
|
|
27
|
+
style: Required<Pick<SankeyStyle, "nodeWidth" | "nodePadding" | "palette" | "linkOpacity" | "showLabels">>;
|
|
28
|
+
}
|
|
29
|
+
export declare function computeSankeyLayout(data: SankeyData, style: SankeyStyle, plotArea: PlotArea): SankeyLayoutResult | null;
|
package/dist/scientific.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { E as r } from "./axisFormat-Sz4WIJfQ.js";
|
|
2
|
-
import { b as t, c as s, d as n, e as i, m, r as l, s as c } from "./createStackedChart-
|
|
3
|
-
import { D as p, e as g, E as u, d as x, L as P, a as d, M as y, S as E, c as T, b as A, f as S, g as h } from "./ChartCore-
|
|
2
|
+
import { b as t, c as s, d as n, e as i, m, r as l, s as c } from "./createStackedChart-DjA3aJAu.js";
|
|
3
|
+
import { D as p, e as g, E as u, d as x, L as P, a as d, M as y, S as E, c as T, b as A, f as S, g as h } from "./ChartCore-KYG2HTcK.js";
|
|
4
4
|
import { PluginAnalysis as D, analyzeComplexSpectrum as L, analyzeSpectrum as v, blackmanWindow as M, dominantFrequency as w, fft as H, fftFromComplexInput as I, hammingWindow as b, hanningWindow as B, ifft as R, powerSpectrum as _ } from "./plugins/analysis.js";
|
|
5
5
|
import { P as F, a as G, d as W, o as z } from "./index-0InEyj0q.js";
|
|
6
6
|
import { PluginRegression as V } from "./plugins/regression.js";
|
package/dist/solid.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { template as I, use as b, effect as P, setStyleProperty as g } from "solid-js/web";
|
|
2
2
|
import { createSignal as f, onCleanup as C, createEffect as y } from "solid-js";
|
|
3
3
|
import { p as w, o as B, s as $, d as A } from "./optionsSync-QUiN4Inw.js";
|
|
4
|
-
import { c as K, a as V, i as p, r as L, b as M } from "./chartSyncBridge-
|
|
5
|
-
import { c as z } from "./createStackedChart-
|
|
4
|
+
import { c as K, a as V, i as p, r as L, b as M } from "./chartSyncBridge-C1uRy0ZS.js";
|
|
5
|
+
import { c as z } from "./createStackedChart-DjA3aJAu.js";
|
|
6
6
|
import { s as R, a as G, b as x } from "./stackedSync-tnrunZMt.js";
|
|
7
7
|
function k(e = () => ({})) {
|
|
8
8
|
const [t, l] = f(null), [n, a] = f(!1), [o, u] = f(null), [d, h] = f(null);
|
package/dist/svelte.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { writable as f, get as i } from "svelte/store";
|
|
2
2
|
import { p as m, o as g, s as k } from "./optionsSync-QUiN4Inw.js";
|
|
3
|
-
import { c as b, i as w, r as P, a as I, b as O } from "./chartSyncBridge-
|
|
4
|
-
import { c as v } from "./createStackedChart-
|
|
3
|
+
import { c as b, i as w, r as P, a as I, b as O } from "./chartSyncBridge-C1uRy0ZS.js";
|
|
4
|
+
import { c as v } from "./createStackedChart-DjA3aJAu.js";
|
|
5
5
|
import { s as S, a as A, b as C } from "./stackedSync-tnrunZMt.js";
|
|
6
6
|
function y(u = {}) {
|
|
7
7
|
const n = f(null), c = f(!1), s = f(null), a = f(null);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function s(t, e) {
|
|
2
|
+
if (t.length < 2 || e < 2) return [];
|
|
3
|
+
const n = [];
|
|
4
|
+
for (let r = 0; r < t.length - 1; r++) {
|
|
5
|
+
const o = (t[r + 1] - t[r]) / e;
|
|
6
|
+
for (let u = 1; u < e; u++)
|
|
7
|
+
n.push(t[r] + o * u);
|
|
8
|
+
}
|
|
9
|
+
return n;
|
|
10
|
+
}
|
|
11
|
+
function c(t, e) {
|
|
12
|
+
if (!e) return t;
|
|
13
|
+
const n = e.timeByIndex.length - 1;
|
|
14
|
+
if (n < 0) return [];
|
|
15
|
+
const r = /* @__PURE__ */ new Set(), o = [];
|
|
16
|
+
for (const u of t) {
|
|
17
|
+
const f = Math.round(u);
|
|
18
|
+
f >= 0 && f <= n && !r.has(f) && (r.add(f), o.push(f));
|
|
19
|
+
}
|
|
20
|
+
return o;
|
|
21
|
+
}
|
|
22
|
+
function a(t, e, n) {
|
|
23
|
+
return c(t.ticks(e), n);
|
|
24
|
+
}
|
|
25
|
+
function i(t, e) {
|
|
26
|
+
return t.ticks(e);
|
|
27
|
+
}
|
|
28
|
+
function l(t, e) {
|
|
29
|
+
return e && t.has(e) ? t.get(e) : t.get("default") ?? t.values().next().value;
|
|
30
|
+
}
|
|
31
|
+
function h(t, e, n) {
|
|
32
|
+
return e && t.has(e) ? t.get(e) : l(t, n);
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
a,
|
|
36
|
+
h as b,
|
|
37
|
+
s as g,
|
|
38
|
+
l as p,
|
|
39
|
+
i as r
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=tickUtils-B_X-ha13.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickUtils-B_X-ha13.js","sources":["../src/core/chart/exporter/svg/tickUtils.ts"],"sourcesContent":["/**\n * Tick generation utilities shared with OverlayRenderer logic.\n */\n\nimport type { Scale } from \"../../../../scales\";\nimport type { BusinessDayMapping } from \"../../../time/TimeScale\";\n\nexport function generateMinorTicks(majorTicks: number[], divisions: number): number[] {\n if (majorTicks.length < 2 || divisions < 2) return [];\n const minor: number[] = [];\n for (let i = 0; i < majorTicks.length - 1; i++) {\n const step = (majorTicks[i + 1] - majorTicks[i]) / divisions;\n for (let j = 1; j < divisions; j++) {\n minor.push(majorTicks[i] + step * j);\n }\n }\n return minor;\n}\n\nexport function filterBusinessDayXTicks(\n ticks: number[],\n mapping: BusinessDayMapping | null | undefined,\n): number[] {\n if (!mapping) return ticks;\n const maxIdx = mapping.timeByIndex.length - 1;\n if (maxIdx < 0) return [];\n const seen = new Set<number>();\n const result: number[] = [];\n for (const tick of ticks) {\n const idx = Math.round(tick);\n if (idx >= 0 && idx <= maxIdx && !seen.has(idx)) {\n seen.add(idx);\n result.push(idx);\n }\n }\n return result;\n}\n\nexport function resolveXTicks(\n xScale: Scale,\n tickCount: number,\n mapping?: BusinessDayMapping | null,\n): number[] {\n return filterBusinessDayXTicks(xScale.ticks(tickCount), mapping);\n}\n\nexport function resolveGridXTicks(xScale: Scale, tickCount: number): number[] {\n return xScale.ticks(tickCount);\n}\n\nexport function primaryYScale(\n yAxes: Map<string, Scale>,\n primaryYAxisId?: string,\n): Scale | undefined {\n if (primaryYAxisId && yAxes.has(primaryYAxisId)) {\n return yAxes.get(primaryYAxisId);\n }\n return yAxes.get(\"default\") ?? yAxes.values().next().value;\n}\n\nexport function resolveYScale(\n yAxes: Map<string, Scale>,\n yAxisId: string | undefined,\n primaryYAxisId?: string,\n): Scale | undefined {\n if (yAxisId && yAxes.has(yAxisId)) return yAxes.get(yAxisId);\n return primaryYScale(yAxes, primaryYAxisId);\n}\n"],"names":["generateMinorTicks","majorTicks","divisions","minor","i","step","j","filterBusinessDayXTicks","ticks","mapping","maxIdx","seen","result","tick","idx","resolveXTicks","xScale","tickCount","resolveGridXTicks","primaryYScale","yAxes","primaryYAxisId","resolveYScale","yAxisId"],"mappings":"AAOO,SAASA,EAAmBC,GAAsBC,GAA6B;AACpF,MAAID,EAAW,SAAS,KAAKC,IAAY,UAAU,CAAA;AACnD,QAAMC,IAAkB,CAAA;AACxB,WAASC,IAAI,GAAGA,IAAIH,EAAW,SAAS,GAAGG,KAAK;AAC9C,UAAMC,KAAQJ,EAAWG,IAAI,CAAC,IAAIH,EAAWG,CAAC,KAAKF;AACnD,aAASI,IAAI,GAAGA,IAAIJ,GAAWI;AAC7B,MAAAH,EAAM,KAAKF,EAAWG,CAAC,IAAIC,IAAOC,CAAC;AAAA,EAEvC;AACA,SAAOH;AACT;AAEO,SAASI,EACdC,GACAC,GACU;AACV,MAAI,CAACA,EAAS,QAAOD;AACrB,QAAME,IAASD,EAAQ,YAAY,SAAS;AAC5C,MAAIC,IAAS,EAAG,QAAO,CAAA;AACvB,QAAMC,wBAAW,IAAA,GACXC,IAAmB,CAAA;AACzB,aAAWC,KAAQL,GAAO;AACxB,UAAMM,IAAM,KAAK,MAAMD,CAAI;AAC3B,IAAIC,KAAO,KAAKA,KAAOJ,KAAU,CAACC,EAAK,IAAIG,CAAG,MAC5CH,EAAK,IAAIG,CAAG,GACZF,EAAO,KAAKE,CAAG;AAAA,EAEnB;AACA,SAAOF;AACT;AAEO,SAASG,EACdC,GACAC,GACAR,GACU;AACV,SAAOF,EAAwBS,EAAO,MAAMC,CAAS,GAAGR,CAAO;AACjE;AAEO,SAASS,EAAkBF,GAAeC,GAA6B;AAC5E,SAAOD,EAAO,MAAMC,CAAS;AAC/B;AAEO,SAASE,EACdC,GACAC,GACmB;AACnB,SAAIA,KAAkBD,EAAM,IAAIC,CAAc,IACrCD,EAAM,IAAIC,CAAc,IAE1BD,EAAM,IAAI,SAAS,KAAKA,EAAM,OAAA,EAAS,OAAO;AACvD;AAEO,SAASE,EACdF,GACAG,GACAF,GACmB;AACnB,SAAIE,KAAWH,EAAM,IAAIG,CAAO,IAAUH,EAAM,IAAIG,CAAO,IACpDJ,EAAcC,GAAOC,CAAc;AAC5C;"}
|
package/dist/trading.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { a as P, f as b, g as v, c as B } from "./createStackedChart-
|
|
1
|
+
import { a as P, f as b, g as v, c as B } from "./createStackedChart-DjA3aJAu.js";
|
|
2
2
|
import { c as S, b as U, f as H, i as I, a as k, m as _ } from "./axisFormat-Sz4WIJfQ.js";
|
|
3
|
-
import { P as R, a as G, b as K, c as j, d as X } from "./index-
|
|
3
|
+
import { P as R, a as G, b as K, c as j, d as X } from "./index-Bj-xyXY6.js";
|
|
4
4
|
import { PluginAnnotations as q } from "./plugins/annotations.js";
|
|
5
5
|
import { PluginKeyboard as J } from "./plugins/keyboard.js";
|
|
6
6
|
import { P as O } from "./index-BgrvqltV.js";
|
|
7
7
|
import { C as V } from "./index-CaXWSOTk.js";
|
|
8
|
-
import { D as Z, e as $, d as ee, c as te } from "./ChartCore-
|
|
8
|
+
import { D as Z, e as $, d as ee, c as te } from "./ChartCore-KYG2HTcK.js";
|
|
9
9
|
const p = 864e5;
|
|
10
10
|
function g(e) {
|
|
11
11
|
let a = e >>> 0;
|
package/dist/types.d.ts
CHANGED
|
@@ -519,9 +519,10 @@ export interface ChartOptions {
|
|
|
519
519
|
* `'webgpu'` uses the GPU abstraction layer (WebGPU when available, otherwise
|
|
520
520
|
* falls back to WebGL2 with a console warning). Use `chart.getActiveRenderer()`
|
|
521
521
|
* to inspect the runtime backend. Boxplot/waterfall series render on WebGL only.
|
|
522
|
+
* `'svg'` renders the chart as live vector SVG (same createChart API; 3D excluded).
|
|
522
523
|
* @see docs/adr/001-webgpu-renderer-strategy.md
|
|
523
524
|
*/
|
|
524
|
-
renderer?: "webgl" | "webgpu";
|
|
525
|
+
renderer?: "webgl" | "webgpu" | "svg";
|
|
525
526
|
/** X-axis configuration */
|
|
526
527
|
xAxis?: AxisOptions;
|
|
527
528
|
/** Y-axis configuration (single or array) */
|