velo-plot 3.0.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.
Files changed (191) hide show
  1. package/README.md +22 -15
  2. package/dist/ChartCore-KYG2HTcK.js +7474 -0
  3. package/dist/ChartCore-KYG2HTcK.js.map +1 -0
  4. package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
  5. package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
  6. package/dist/{index.core-BmZe2jRQ.js → PluginRegistry-CDf_jcnp.js} +19 -33
  7. package/dist/PluginRegistry-CDf_jcnp.js.map +1 -0
  8. package/dist/SVGDocumentBuilder-C-uLkcFW.js +83 -0
  9. package/dist/SVGDocumentBuilder-C-uLkcFW.js.map +1 -0
  10. package/dist/angular-hooks.js +1 -1
  11. package/dist/angular.js +8 -8
  12. package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
  13. package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
  14. package/dist/{chartSyncBridge-DbWrwtyP.js → chartSyncBridge-C1uRy0ZS.js} +12 -11
  15. package/dist/{chartSyncBridge-DbWrwtyP.js.map → chartSyncBridge-C1uRy0ZS.js.map} +1 -1
  16. package/dist/core/ChartStatistics.d.ts +1 -1
  17. package/dist/core/chart/ChartCore.d.ts +19 -20
  18. package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
  19. package/dist/core/chart/ChartRenderLoop.d.ts +5 -0
  20. package/dist/core/chart/ChartRenderer.d.ts +9 -0
  21. package/dist/core/chart/ChartSetup.d.ts +1 -0
  22. package/dist/core/chart/chartExportPatch.d.ts +2 -0
  23. package/dist/core/chart/exporter/SVGExporter.d.ts +9 -7
  24. package/dist/core/chart/exporter/svg/SVGDocumentBuilder.d.ts +27 -0
  25. package/dist/core/chart/exporter/svg/SVGExportContext.d.ts +147 -0
  26. package/dist/core/chart/exporter/svg/SVGOrchestrator.d.ts +3 -0
  27. package/dist/core/chart/exporter/svg/SVGThemeAdapter.d.ts +22 -0
  28. package/dist/core/chart/exporter/svg/__tests__/testFixtures.d.ts +46 -0
  29. package/dist/core/chart/exporter/svg/__tests__/visualTestUtils.d.ts +12 -0
  30. package/dist/core/chart/exporter/svg/overlay/axes.d.ts +4 -0
  31. package/dist/core/chart/exporter/svg/overlay/border.d.ts +4 -0
  32. package/dist/core/chart/exporter/svg/overlay/errorBars.d.ts +7 -0
  33. package/dist/core/chart/exporter/svg/overlay/grid.d.ts +4 -0
  34. package/dist/core/chart/exporter/svg/overlay/index.d.ts +12 -0
  35. package/dist/core/chart/exporter/svg/overlay/legend.d.ts +4 -0
  36. package/dist/core/chart/exporter/svg/overlay/pluginCharts.d.ts +6 -0
  37. package/dist/core/chart/exporter/svg/overlay/polarGrid.d.ts +4 -0
  38. package/dist/core/chart/exporter/svg/overlay/specialChart.d.ts +15 -0
  39. package/dist/core/chart/exporter/svg/overlay/title.d.ts +4 -0
  40. package/dist/core/chart/exporter/svg/plugins/annotations.d.ts +5 -0
  41. package/dist/core/chart/exporter/svg/plugins/brokenAxis.d.ts +20 -0
  42. package/dist/core/chart/exporter/svg/plugins/latex.d.ts +9 -0
  43. package/dist/core/chart/exporter/svg/plugins/register.d.ts +8 -0
  44. package/dist/core/chart/exporter/svg/plugins/regression.d.ts +33 -0
  45. package/dist/core/chart/exporter/svg/plugins/roi.d.ts +12 -0
  46. package/dist/core/chart/exporter/svg/plugins/tradeMarkers.d.ts +3 -0
  47. package/dist/core/chart/exporter/svg/plugins/types.d.ts +28 -0
  48. package/dist/core/chart/exporter/svg/plugins/watermark.d.ts +13 -0
  49. package/dist/core/chart/exporter/svg/series/band.d.ts +6 -0
  50. package/dist/core/chart/exporter/svg/series/bar.d.ts +6 -0
  51. package/dist/core/chart/exporter/svg/series/boxplot.d.ts +6 -0
  52. package/dist/core/chart/exporter/svg/series/candlestick.d.ts +6 -0
  53. package/dist/core/chart/exporter/svg/series/finitePoints.d.ts +6 -0
  54. package/dist/core/chart/exporter/svg/series/gauge.d.ts +5 -0
  55. package/dist/core/chart/exporter/svg/series/heatmap.d.ts +6 -0
  56. package/dist/core/chart/exporter/svg/series/indicator.d.ts +6 -0
  57. package/dist/core/chart/exporter/svg/series/line.d.ts +12 -0
  58. package/dist/core/chart/exporter/svg/series/polar.d.ts +6 -0
  59. package/dist/core/chart/exporter/svg/series/radar.d.ts +5 -0
  60. package/dist/core/chart/exporter/svg/series/registry.d.ts +10 -0
  61. package/dist/core/chart/exporter/svg/series/sankey.d.ts +5 -0
  62. package/dist/core/chart/exporter/svg/series/scatter.d.ts +1 -0
  63. package/dist/core/chart/exporter/svg/series/ternary.d.ts +7 -0
  64. package/dist/core/chart/exporter/svg/series/waterfall.d.ts +6 -0
  65. package/dist/core/chart/exporter/svg/seriesAtTimestamp.d.ts +4 -0
  66. package/dist/core/chart/exporter/svg/seriesUtils.d.ts +3 -0
  67. package/dist/core/chart/exporter/svg/symbols.d.ts +5 -0
  68. package/dist/core/chart/exporter/svg/tickUtils.d.ts +9 -0
  69. package/dist/core/chart/mountSVGString.d.ts +5 -0
  70. package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
  71. package/dist/core/chart/series/SeriesActions.d.ts +1 -0
  72. package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
  73. package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
  74. package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
  75. package/dist/core/chart/types.d.ts +2 -2
  76. package/dist/core/stacked/StackSVGComposer.d.ts +14 -0
  77. package/dist/core/stacked/index.d.ts +3 -2
  78. package/dist/core/stacked/types.d.ts +12 -4
  79. package/dist/createStackedChart-DjA3aJAu.js +2761 -0
  80. package/dist/createStackedChart-DjA3aJAu.js.map +1 -0
  81. package/dist/{hooks-CYPCxoZx.js → hooks-4wQH27r9.js} +7 -7
  82. package/dist/{hooks-CYPCxoZx.js.map → hooks-4wQH27r9.js.map} +1 -1
  83. package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
  84. package/dist/index-B7PTX94B.js.map +1 -0
  85. package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
  86. package/dist/index-BgrvqltV.js.map +1 -0
  87. package/dist/index-Bj-xyXY6.js +582 -0
  88. package/dist/index-Bj-xyXY6.js.map +1 -0
  89. package/dist/index-qhscKTDy.js.map +1 -1
  90. package/dist/index.core.d.ts +8 -6
  91. package/dist/index.d.ts +1 -14
  92. package/dist/plugins/3d.js +3 -1
  93. package/dist/plugins/3d.js.map +1 -1
  94. package/dist/plugins/PluginManager.d.ts +5 -0
  95. package/dist/plugins/analysis.js.map +1 -1
  96. package/dist/plugins/annotations.js +8 -7
  97. package/dist/plugins/annotations.js.map +1 -1
  98. package/dist/plugins/broken-axis.js +198 -152
  99. package/dist/plugins/broken-axis.js.map +1 -1
  100. package/dist/plugins/createPlugin.d.ts +8 -0
  101. package/dist/plugins/debug.js +32 -32
  102. package/dist/plugins/debug.js.map +1 -1
  103. package/dist/plugins/forecasting.js +273 -258
  104. package/dist/plugins/forecasting.js.map +1 -1
  105. package/dist/plugins/gpu.js +2033 -209
  106. package/dist/plugins/gpu.js.map +1 -1
  107. package/dist/plugins/i18n.js +286 -23
  108. package/dist/plugins/i18n.js.map +1 -1
  109. package/dist/plugins/latex.js +766 -207
  110. package/dist/plugins/latex.js.map +1 -1
  111. package/dist/plugins/loading/index.d.ts +1 -2
  112. package/dist/plugins/loading.js +3 -4
  113. package/dist/plugins/ml-integration.js +107 -93
  114. package/dist/plugins/ml-integration.js.map +1 -1
  115. package/dist/plugins/offscreen.js +11 -10
  116. package/dist/plugins/offscreen.js.map +1 -1
  117. package/dist/plugins/radar/types.d.ts +11 -0
  118. package/dist/plugins/radar.js +64 -53
  119. package/dist/plugins/radar.js.map +1 -1
  120. package/dist/plugins/regression.js +254 -256
  121. package/dist/plugins/regression.js.map +1 -1
  122. package/dist/plugins/roi/index.d.ts +2 -0
  123. package/dist/plugins/roi.js +184 -145
  124. package/dist/plugins/roi.js.map +1 -1
  125. package/dist/plugins/snapshot.js +20 -15
  126. package/dist/plugins/snapshot.js.map +1 -1
  127. package/dist/plugins/streaming.js +1 -1
  128. package/dist/plugins/tools.js +1 -1
  129. package/dist/plugins/types.d.ts +4 -0
  130. package/dist/react.js +55 -58
  131. package/dist/react.js.map +1 -1
  132. package/dist/regression-HNdyk1Dm.js +28 -0
  133. package/dist/regression-HNdyk1Dm.js.map +1 -0
  134. package/dist/renderer/ChartSeriesRenderer.d.ts +3 -2
  135. package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
  136. package/dist/renderer/SVGChartRenderer.d.ts +15 -0
  137. package/dist/renderer/SankeyRenderer.d.ts +1 -0
  138. package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
  139. package/dist/renderer/native/draw.d.ts +2 -47
  140. package/dist/renderer/native/drawCore.d.ts +27 -0
  141. package/dist/renderer/native/drawExtended.d.ts +29 -0
  142. package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
  143. package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
  144. package/dist/renderer/native/programFactoryCore.d.ts +6 -0
  145. package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
  146. package/dist/renderer/native/utils.d.ts +3 -29
  147. package/dist/renderer/native/utilsCore.d.ts +14 -0
  148. package/dist/renderer/native/utilsExtended.d.ts +17 -0
  149. package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
  150. package/dist/renderer/registerExtendedSeries.d.ts +1 -0
  151. package/dist/renderer/registerSVG.d.ts +5 -0
  152. package/dist/renderer/registerWebGPU.d.ts +2 -0
  153. package/dist/renderer/sankeyLayout.d.ts +29 -0
  154. package/dist/renderer/seriesBufferExtended.d.ts +4 -0
  155. package/dist/scientific/index.d.ts +1 -5
  156. package/dist/scientific/registerScientific.d.ts +1 -0
  157. package/dist/scientific.js +41 -41
  158. package/dist/solid.js +56 -59
  159. package/dist/solid.js.map +1 -1
  160. package/dist/svelte.js +26 -29
  161. package/dist/svelte.js.map +1 -1
  162. package/dist/tickUtils-B_X-ha13.js +41 -0
  163. package/dist/tickUtils-B_X-ha13.js.map +1 -0
  164. package/dist/trading/index.d.ts +1 -4
  165. package/dist/trading/registerTrading.d.ts +3 -0
  166. package/dist/trading.js +42 -42
  167. package/dist/types.d.ts +5 -4
  168. package/dist/velo-plot.full.js +1951 -1275
  169. package/dist/velo-plot.full.js.map +1 -1
  170. package/dist/velo-plot.js +33 -28
  171. package/dist/velo-plot.js.map +1 -1
  172. package/dist/vue/VeloPlot.vue.d.ts +1 -1
  173. package/dist/vue/index.d.ts +33 -33
  174. package/dist/vue.js +17 -20
  175. package/dist/vue.js.map +1 -1
  176. package/package.json +14 -1
  177. package/dist/ChartCore-BpzRvN4Y.js +0 -8467
  178. package/dist/ChartCore-BpzRvN4Y.js.map +0 -1
  179. package/dist/createStackedChart-Dm-YqUT7.js +0 -756
  180. package/dist/createStackedChart-Dm-YqUT7.js.map +0 -1
  181. package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
  182. package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
  183. package/dist/index-BMiZoKmm.js.map +0 -1
  184. package/dist/index-qunX30Xu.js.map +0 -1
  185. package/dist/index-x4stH3jD.js +0 -282
  186. package/dist/index-x4stH3jD.js.map +0 -1
  187. package/dist/index.core-BmZe2jRQ.js.map +0 -1
  188. package/dist/mockDatafeed-DHIDPcpX.js +0 -515
  189. package/dist/mockDatafeed-DHIDPcpX.js.map +0 -1
  190. package/dist/symbols-DT0eLlpW.js +0 -568
  191. package/dist/symbols-DT0eLlpW.js.map +0 -1
@@ -1,10 +1,10 @@
1
- const b = {
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
- }, k = {
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 R(c) {
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 S(c = {}) {
33
+ function P(c = {}) {
34
34
  let a = null;
35
35
  async function p(t = {}) {
36
- var u, h;
36
+ var f, h;
37
37
  if (!a) throw new Error("Snapshot plugin not initialized");
38
- const e = { ...k, ...c.defaultOptions, ...t }, n = a.chart, s = R(e.resolution), i = n.getDPR();
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), f = document.createElement("a");
44
- f.download = `${e.fileName}.svg`, f.href = w, document.body.appendChild(f), f.click(), document.body.removeChild(f), URL.revokeObjectURL(w);
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 = (u = a.render.gl) == null ? void 0 : u.canvas, g = (h = a.render.ctx2d) == null ? void 0 : h.canvas;
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 u = Math.max(16, 24 * (i / 2));
68
- t.font = `bold ${u}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();
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: b,
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
- S as PluginSnapshot,
88
- S as default
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":"AAsBA,MAAMA,IAAmC;AAAA,EACvC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU,CAAC,UAAU,UAAU;AAAA,EAC/B,MAAM,CAAC,YAAY,UAAU,eAAe,OAAO;AACrD,GAEMC,IAAmD;AAAA,EACvD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AACZ;AAEA,SAASC,EAAkBC,GAAiC;AAC1D,MAAI,OAAOA,KAAQ,SAAU,QAAOA;AACpC,UAAQA,GAAA;AAAA,IACN,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAY,aAAO;AAAA,IACxB;AAAS,aAAO;AAAA,EAAA;AAEpB;AAOO,SAASC,EACdC,IAA+B,IACI;AACnC,MAAIC,IAA4B;AAKhC,iBAAeC,EAAaC,IAAiC,IAA4B;AA5C3F,QAAAC,GAAAC;AA6CI,QAAI,CAACJ,EAAK,OAAM,IAAI,MAAM,iCAAiC;AAE3D,UAAMK,IAAM,EAAE,GAAGV,GAAiB,GAAGI,EAAO,gBAAgB,GAAGG,EAAA,GACzDI,IAAQN,EAAI,OAGZO,IAAQX,EAAkBS,EAAI,UAAU,GACxCG,IAAcF,EAAM,OAAA;AAE1B,QAAI;AACA,UAAID,EAAI,WAAW,OAAO;AACxB,cAAMI,IAAMH,EAAM,UAAA;AAClB,YAAID,EAAI,UAAU;AAChB,gBAAMK,IAAO,IAAI,KAAK,CAACD,CAAG,GAAG,EAAE,MAAM,iBAAiB,GAChDE,IAAM,IAAI,gBAAgBD,CAAI,GAC9BE,IAAO,SAAS,cAAc,GAAG;AACvC,UAAAA,EAAK,WAAW,GAAGP,EAAI,QAAQ,QAC/BO,EAAK,OAAOD,GACZ,SAAS,KAAK,YAAYC,CAAI,GAC9BA,EAAK,MAAA,GACL,SAAS,KAAK,YAAYA,CAAI,GAC9B,IAAI,gBAAgBD,CAAG;AAAA,QACzB;AACA,eAAOF;AAAA,MACT;AAQA,MAAIF,IAAQ,MACJ,OAAOD,EAAM,+BAAgC,aAC7CA,EAAM,4BAA4BE,IAAcD,CAAK,IAErDD,EAAM,OAAOE,IAAcD,CAAK,GAGhC,OAAOD,EAAM,UAAW,cACxBA,EAAM,OAAA,GAGV,MAAM,IAAI,QAAQ,CAAAO,MAAK,sBAAsBA,CAAC,CAAC,GAE/C,MAAM,IAAI,QAAQ,CAAAA,MAAK,sBAAsBA,CAAC,CAAC,GAE/C,MAAM,IAAI,QAAQ,CAAAA,MAAK,WAAWA,GAAG,GAAG,CAAC;AAG7C,YAAMC,KAAeX,IAAAH,EAAI,OAAO,OAAX,gBAAAG,EAAe,QAC9BY,KAAiBX,IAAAJ,EAAI,OAAO,UAAX,gBAAAI,EAAkB;AAEzC,UAAI,CAACU,EAAa,OAAM,IAAI,MAAM,wBAAwB;AAG1D,YAAME,IAAoB,SAAS,cAAc,QAAQ;AACzD,MAAAA,EAAkB,QAAQF,EAAY,OACtCE,EAAkB,SAASF,EAAY;AACvC,YAAMG,IAAUD,EAAkB,WAAW,IAAI;AAGjD,MAAI,CAACX,EAAI,eAAeA,EAAI,sBAC1BY,EAAQ,YAAYjB,EAAI,GAAG,MAAM,mBAAmB,WACpDiB,EAAQ,SAAS,GAAG,GAAGD,EAAkB,OAAOA,EAAkB,MAAM,IAI1EC,EAAQ,UAAUH,GAAa,GAAG,CAAC,GAG/BT,EAAI,mBAAmBU,KACzBE,EAAQ,UAAUF,GAAe,GAAG,CAAC,GAInCV,EAAI,iBACNa,EAAcD,GAASZ,EAAI,eAAeW,EAAkB,OAAOA,EAAkB,QAAQR,IAAcD,CAAK;AAGlH,YAAMY,IAAW,SAASd,EAAI,MAAM,IAC9Be,IAAUJ,EAAkB,UAAUG,GAAUd,EAAI,OAAO;AAGjE,UAAIA,EAAI,UAAU;AAChB,cAAMgB,IAAYhB,EAAI,WAAW,SAAS,QAAQA,EAAI,QAChDO,IAAO,SAAS,cAAc,GAAG;AACvC,QAAAA,EAAK,WAAW,GAAGP,EAAI,QAAQ,IAAIgB,CAAS,IAC5CT,EAAK,OAAOQ,GACZ,SAAS,KAAK,YAAYR,CAAI,GAC9BA,EAAK,MAAA,GACL,SAAS,KAAK,YAAYA,CAAI;AAAA,MAChC;AAEA,aAAOQ;AAAA,IACX,UAAA;AAEI,MAAIb,IAAQ,MACJ,OAAOD,EAAM,+BAAgC,aAC7CA,EAAM,4BAA4B,IAAI,IAEtCA,EAAM,OAAOE,CAAW;AAAA,IAGpC;AAAA,EACF;AAKA,WAASU,EAAcI,GAA6BC,GAAcC,GAAWC,GAAWC,GAAa;AACnG,IAAAJ,EAAE,KAAA;AAEF,UAAMK,IAAW,KAAK,IAAI,IAAI,MAAMD,IAAM,EAAE;AAC5C,IAAAJ,EAAE,OAAO,QAAQK,CAAQ,mCACzBL,EAAE,YAAY,4BACdA,EAAE,YAAY,SACdA,EAAE,eAAe,UACjBA,EAAE,SAASC,GAAMC,IAAK,KAAKE,IAAI,GAAID,IAAK,KAAKC,IAAI,CAAE,GACnDJ,EAAE,QAAA;AAAA,EACJ;AASA,SAAO;AAAA,IACL,UAAU5B;AAAA,IACV,OAAO4B,GAAG;AACN,MAAAtB,IAAMsB,GACNtB,EAAI,IAAI,KAAK,6BAA6B;AAAA,IAC9C;AAAA,IACA,YAAY;AACR,MAAAA,IAAM;AAAA,IACV;AAAA,IACA,KAhBuD;AAAA,MACvD,cAAAC;AAAA,MACA,kBAAkB,OAAOI,MAA+B;AACtD,cAAMJ,EAAa,EAAE,GAAGI,GAAK,UAAU,IAAM;AAAA,MAC/C;AAAA,IAAA;AAAA,EAYA;AAEJ;"}
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":"AAsBA,MAAMA,IAAmC;AAAA,EACvC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU,CAAC,UAAU,UAAU;AAAA,EAC/B,MAAM,CAAC,YAAY,UAAU,eAAe,OAAO;AACrD,GAEMC,IAAmD;AAAA,EACvD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AACZ;AAEA,SAASC,EAAkBC,GAAiC;AAC1D,MAAI,OAAOA,KAAQ,SAAU,QAAOA;AACpC,UAAQA,GAAA;AAAA,IACN,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAY,aAAO;AAAA,IACxB;AAAS,aAAO;AAAA,EAAA;AAEpB;AAOO,SAASC,EACdC,IAA+B,IACI;AACnC,MAAIC,IAA4B;AAKhC,iBAAeC,EAAaC,IAAiC,IAA4B;AA5C3F,QAAAC,GAAAC;AA6CI,QAAI,CAACJ,EAAK,OAAM,IAAI,MAAM,iCAAiC;AAE3D,UAAMK,IAAM,EAAE,GAAGV,GAAiB,GAAGI,EAAO,gBAAgB,GAAGG,EAAA,GACzDI,IAAQN,EAAI,OAGZO,IAAQX,EAAkBS,EAAI,UAAU,GACxCG,IAAcF,EAAM,OAAA;AAE1B,QAAI;AACA,UAAID,EAAI,WAAW,OAAO;AACxB,cAAMI,IAAMH,EAAM,UAAU;AAAA,UAC1B,iBAAiBD,EAAI;AAAA,UACrB,oBAAoBA,EAAI;AAAA,UACxB,eAAe;AAAA,UACf,eAAeA,EAAI,iBAAiB;AAAA,QAAA,CACrC;AACD,YAAIA,EAAI,UAAU;AAChB,gBAAMK,IAAO,IAAI,KAAK,CAACD,CAAG,GAAG,EAAE,MAAM,iBAAiB,GAChDE,IAAM,IAAI,gBAAgBD,CAAI,GAC9BE,IAAO,SAAS,cAAc,GAAG;AACvC,UAAAA,EAAK,WAAW,GAAGP,EAAI,QAAQ,QAC/BO,EAAK,OAAOD,GACZ,SAAS,KAAK,YAAYC,CAAI,GAC9BA,EAAK,MAAA,GACL,SAAS,KAAK,YAAYA,CAAI,GAC9B,IAAI,gBAAgBD,CAAG;AAAA,QACzB;AACA,eAAOF;AAAA,MACT;AAQA,MAAIF,IAAQ,MACJ,OAAOD,EAAM,+BAAgC,aAC7CA,EAAM,4BAA4BE,IAAcD,CAAK,IAErDD,EAAM,OAAOE,IAAcD,CAAK,GAGhC,OAAOD,EAAM,UAAW,cACxBA,EAAM,OAAA,GAGV,MAAM,IAAI,QAAQ,CAAAO,MAAK,sBAAsBA,CAAC,CAAC,GAE/C,MAAM,IAAI,QAAQ,CAAAA,MAAK,sBAAsBA,CAAC,CAAC,GAE/C,MAAM,IAAI,QAAQ,CAAAA,MAAK,WAAWA,GAAG,GAAG,CAAC;AAG7C,YAAMC,KAAeX,IAAAH,EAAI,OAAO,OAAX,gBAAAG,EAAe,QAC9BY,KAAiBX,IAAAJ,EAAI,OAAO,UAAX,gBAAAI,EAAkB;AAEzC,UAAI,CAACU,EAAa,OAAM,IAAI,MAAM,wBAAwB;AAG1D,YAAME,IAAoB,SAAS,cAAc,QAAQ;AACzD,MAAAA,EAAkB,QAAQF,EAAY,OACtCE,EAAkB,SAASF,EAAY;AACvC,YAAMG,IAAUD,EAAkB,WAAW,IAAI;AAGjD,MAAI,CAACX,EAAI,eAAeA,EAAI,sBAC1BY,EAAQ,YAAYjB,EAAI,GAAG,MAAM,mBAAmB,WACpDiB,EAAQ,SAAS,GAAG,GAAGD,EAAkB,OAAOA,EAAkB,MAAM,IAI1EC,EAAQ,UAAUH,GAAa,GAAG,CAAC,GAG/BT,EAAI,mBAAmBU,KACzBE,EAAQ,UAAUF,GAAe,GAAG,CAAC,GAInCV,EAAI,iBACNa,EAAcD,GAASZ,EAAI,eAAeW,EAAkB,OAAOA,EAAkB,QAAQR,IAAcD,CAAK;AAGlH,YAAMY,IAAW,SAASd,EAAI,MAAM,IAC9Be,IAAUJ,EAAkB,UAAUG,GAAUd,EAAI,OAAO;AAGjE,UAAIA,EAAI,UAAU;AAChB,cAAMgB,IAAYhB,EAAI,WAAW,SAAS,QAAQA,EAAI,QAChDO,IAAO,SAAS,cAAc,GAAG;AACvC,QAAAA,EAAK,WAAW,GAAGP,EAAI,QAAQ,IAAIgB,CAAS,IAC5CT,EAAK,OAAOQ,GACZ,SAAS,KAAK,YAAYR,CAAI,GAC9BA,EAAK,MAAA,GACL,SAAS,KAAK,YAAYA,CAAI;AAAA,MAChC;AAEA,aAAOQ;AAAA,IACX,UAAA;AAEI,MAAIb,IAAQ,MACJ,OAAOD,EAAM,+BAAgC,aAC7CA,EAAM,4BAA4B,IAAI,IAEtCA,EAAM,OAAOE,CAAW;AAAA,IAGpC;AAAA,EACF;AAKA,WAASU,EAAcI,GAA6BC,GAAcC,GAAWC,GAAWC,GAAa;AACnG,IAAAJ,EAAE,KAAA;AAEF,UAAMK,IAAW,KAAK,IAAI,IAAI,MAAMD,IAAM,EAAE;AAC5C,IAAAJ,EAAE,OAAO,QAAQK,CAAQ,mCACzBL,EAAE,YAAY,4BACdA,EAAE,YAAY,SACdA,EAAE,eAAe,UACjBA,EAAE,SAASC,GAAMC,IAAK,KAAKE,IAAI,GAAID,IAAK,KAAKC,IAAI,CAAE,GACnDJ,EAAE,QAAA;AAAA,EACJ;AASA,SAAO;AAAA,IACL,UAAU5B;AAAA,IACV,OAAO4B,GAAG;AACN,MAAAtB,IAAMsB,GACNtB,EAAI,IAAI,KAAK,6BAA6B;AAAA,IAC9C;AAAA,IACA,YAAY;AACR,MAAAA,IAAM;AAAA,IACV;AAAA,IACA,KAhBuD;AAAA,MACvD,cAAAC;AAAA,MACA,kBAAkB,OAAOI,MAA+B;AACtD,cAAMJ,EAAa,EAAE,GAAGI,GAAK,UAAU,IAAM;AAAA,MAC/C;AAAA,IAAA;AAAA,EAYA;AAEJ;"}
@@ -1,4 +1,4 @@
1
- import { B as r, C as s, P as t, a as c, e as n, b as o, d as u, c as g, P as m } from "../index-BMiZoKmm.js";
1
+ import { B as r, C as s, P as t, a as c, e as n, b as o, d as u, c as g, P as m } from "../index-BgrvqltV.js";
2
2
  export {
3
3
  r as BackpressureManager,
4
4
  s as CircularBuffer,
@@ -1,4 +1,4 @@
1
- import { D as l, b as s, P as e, T, P as t } from "../index-qunX30Xu.js";
1
+ import { D as l, b as s, P as e, T, P as t } from "../index-B7PTX94B.js";
2
2
  export {
3
3
  l as DeltaTool,
4
4
  s as PeakTool,
@@ -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,20 +1,17 @@
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
- import { c as j, a as G, i as H, r as J, b as X } from "./chartSyncBridge-DbWrwtyP.js";
4
- import { p as B, o as Y, s as Z, d as q } from "./optionsSync-QUiN4Inw.js";
5
- import "./ChartCore-BpzRvN4Y.js";
6
- import "./index-x4stH3jD.js";
7
- import "./symbols-DT0eLlpW.js";
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-C1uRy0ZS.js";
8
5
  import { a as D, u as L } from "./a11y-Bw6urYpr.js";
9
- import { c as Q } from "./createStackedChart-Dm-YqUT7.js";
10
- import { s as P, b as z, a as U } from "./stackedSync-tnrunZMt.js";
6
+ import { s as P, b as z, a as Q } from "./stackedSync-tnrunZMt.js";
7
+ import { c as U } from "./createStackedChart-DjA3aJAu.js";
11
8
  function I(a, t = {}) {
12
- const [l, n] = R(null), [i, p] = R(!1), [S, C] = R(null), [y, d] = R(null), o = m(null), c = m(null), v = m(t), x = m(B(t));
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));
13
10
  v.current = t, b(() => {
14
11
  const r = a.current;
15
12
  if (r) {
16
13
  try {
17
- const e = j(
14
+ const e = J(
18
15
  r,
19
16
  v.current,
20
17
  {
@@ -22,35 +19,35 @@ function I(a, t = {}) {
22
19
  onError: C
23
20
  }
24
21
  );
25
- o.current = e.chart, c.current = e.destroy, n(e.chart), p(!0), d(e.getBounds()), C(null), x.current = B(v.current);
22
+ c.current = e.chart, o.current = e.destroy, n(e.chart), p(!0), d(e.getBounds()), C(null), x.current = B(v.current);
26
23
  } catch (e) {
27
24
  console.error("[useVeloPlot] Failed to initialize chart:", e), C(e instanceof Error ? e : new Error(String(e))), p(!1);
28
25
  }
29
26
  return () => {
30
27
  var e;
31
- (e = c.current) == null || e.call(c), c.current = null, o.current = null, n(null), p(!1);
28
+ (e = o.current) == null || e.call(o), o.current = null, c.current = null, n(null), p(!1);
32
29
  };
33
30
  }
34
31
  }, [a]), b(() => {
35
- const r = o.current;
32
+ const r = c.current;
36
33
  if (!r || !i) return;
37
34
  const e = B(t), k = x.current;
38
- Y(k, e) && (Z(r, k, e), x.current = e);
35
+ j(k, e) && (G(r, k, e), x.current = e);
39
36
  });
40
37
  const s = E((r) => {
41
- const e = o.current;
38
+ const e = c.current;
42
39
  e && (e.addSeries(r), d(e.getViewBounds()));
43
40
  }, []), f = E((r, e) => {
44
41
  var k;
45
- (k = o.current) == null || k.updateSeries(r, e);
42
+ (k = c.current) == null || k.updateSeries(r, e);
46
43
  }, []), g = E((r) => {
47
44
  var e;
48
- (e = o.current) == null || e.removeSeries(r);
45
+ (e = c.current) == null || e.removeSeries(r);
49
46
  }, []), u = E((r) => {
50
47
  var e;
51
- (e = o.current) == null || e.zoom(r);
48
+ (e = c.current) == null || e.zoom(r);
52
49
  }, []), h = E(() => {
53
- const r = o.current;
50
+ const r = c.current;
54
51
  r && (r.resetZoom(), d(r.getViewBounds()));
55
52
  }, []);
56
53
  return {
@@ -76,8 +73,8 @@ const N = F(
76
73
  className: C = "",
77
74
  style: y = {},
78
75
  debug: d = !1,
79
- ariaLabel: o,
80
- keyboardNav: c = !0,
76
+ ariaLabel: c,
77
+ keyboardNav: o = !0,
81
78
  ...v
82
79
  }, x) {
83
80
  const s = m(null), f = m(/* @__PURE__ */ new Map()), g = m(null), {
@@ -98,7 +95,7 @@ const N = F(
98
95
  }),
99
96
  [u, $, r]
100
97
  ), b(() => {
101
- !h || !u || (f.current = q(
98
+ !h || !u || (f.current = H(
102
99
  { addSeries: e, updateSeries: k, removeSeries: V, autoScale: () => u.autoScale() },
103
100
  t,
104
101
  f.current
@@ -122,22 +119,22 @@ const N = F(
122
119
  const M = s.current;
123
120
  if (!(!h || !u || !M))
124
121
  return g.current = D(M, u, {
125
- label: o,
122
+ label: c,
126
123
  series: t,
127
124
  bounds: r,
128
- enableKeyboard: c
125
+ enableKeyboard: o
129
126
  }), () => {
130
127
  var w;
131
128
  (w = g.current) == null || w.cleanup(), g.current = null;
132
129
  };
133
- }, [h, u, c, o]), b(() => {
130
+ }, [h, u, o, c, r, t]), b(() => {
134
131
  const M = s.current;
135
132
  !M || !g.current || L(M, g.current.srTable, {
136
- label: o,
133
+ label: c,
137
134
  series: t,
138
135
  bounds: r
139
136
  });
140
- }, [t, r, o]);
137
+ }, [t, r, c]);
141
138
  const _ = T(
142
139
  () => ({
143
140
  position: "relative",
@@ -196,39 +193,39 @@ const N = F(
196
193
  }
197
194
  );
198
195
  function W(a) {
199
- const t = m(null), l = m(null), n = m(null), [i, p] = R(null), [S, C] = R(!1), y = m(a), d = m(P(a.panes)), o = m(/* @__PURE__ */ new Map());
196
+ const t = m(null), l = m(null), n = m(null), [i, p] = R(null), [S, C] = R(!1), y = m(a), d = m(P(a.panes)), c = m(/* @__PURE__ */ new Map());
200
197
  y.current = a;
201
- const c = E(() => {
198
+ const o = E(() => {
202
199
  var g;
203
200
  const s = t.current;
204
201
  if (!s) return;
205
202
  (g = n.current) == null || g.call(n);
206
- const f = Q({
203
+ const f = U({
207
204
  ...y.current,
208
205
  container: s
209
206
  });
210
207
  l.current = f, n.current = () => {
211
208
  f.destroy(), l.current = null;
212
- }, p(f), d.current = P(y.current.panes), o.current = z(
209
+ }, p(f), d.current = P(y.current.panes), c.current = z(
213
210
  f,
214
211
  y.current.panes,
215
212
  /* @__PURE__ */ new Map()
216
213
  ), f.whenReady().then(() => C(!0));
217
214
  }, []);
218
- b(() => (c(), () => {
215
+ b(() => (o(), () => {
219
216
  var s;
220
217
  C(!1), (s = n.current) == null || s.call(n), n.current = null, p(null);
221
- }), [c]), b(() => {
218
+ }), [o]), b(() => {
222
219
  const s = l.current;
223
220
  if (!s || !S) return;
224
221
  if (P(a.panes) !== d.current) {
225
- c();
222
+ o();
226
223
  return;
227
224
  }
228
- U(s, a), o.current = z(
225
+ Q(s, a), c.current = z(
229
226
  s,
230
227
  a.panes,
231
- o.current
228
+ c.current
232
229
  );
233
230
  });
234
231
  const v = E((s) => {
@@ -240,7 +237,7 @@ function W(a) {
240
237
  }, []);
241
238
  return { containerRef: t, stack: i, isReady: S, fitAll: v, resetAll: x };
242
239
  }
243
- const fe = F(
240
+ const ae = F(
244
241
  function({
245
242
  width: t = "100%",
246
243
  height: l = 480,
@@ -251,14 +248,14 @@ const fe = F(
251
248
  drawingTools: C,
252
249
  ariaLabel: y,
253
250
  panes: d,
254
- ...o
255
- }, c) {
251
+ ...c
252
+ }, o) {
256
253
  const { containerRef: v, stack: x, isReady: s, fitAll: f, resetAll: g } = W({
257
254
  panes: d,
258
- ...o
255
+ ...c
259
256
  });
260
257
  K(
261
- c,
258
+ o,
262
259
  () => ({
263
260
  getStack: () => x,
264
261
  fitAll: () => f(),
@@ -289,19 +286,19 @@ const fe = F(
289
286
  );
290
287
  }
291
288
  );
292
- function de(a, t, l = {}) {
289
+ function le(a, t, l = {}) {
293
290
  const [n, i] = R(null), [p, S] = R(!1), [C, y] = R(null), d = m(n);
294
291
  return d.current = n, b(() => {
295
292
  if (!a) return;
296
- let o = !1;
297
- return S(!0), y(null), G(a, t, l).then((c) => {
298
- o || (i(c), S(!1));
299
- }).catch((c) => {
300
- o || (y(c instanceof Error ? c : new Error(String(c))), S(!1));
293
+ let c = !1;
294
+ return S(!0), y(null), X(a, t, l).then((o) => {
295
+ c || (i(o), S(!1));
296
+ }).catch((o) => {
297
+ c || (y(o instanceof Error ? o : new Error(String(o))), S(!1));
301
298
  }), () => {
302
- o = !0;
303
- const c = d.current;
304
- c && !H(a) && J(a, c.id);
299
+ c = !0;
300
+ const o = d.current;
301
+ o && !Y(a) && Z(a, o.id);
305
302
  };
306
303
  }, [a, t, JSON.stringify(l)]), { result: n, isLoading: p, error: C };
307
304
  }
@@ -312,23 +309,23 @@ function ee(a, t) {
312
309
  n(null);
313
310
  return;
314
311
  }
315
- const i = X(a, t);
312
+ const i = q(a, t);
316
313
  return n(i.group), () => {
317
314
  i.destroy(), n(null);
318
315
  };
319
316
  }, [a, JSON.stringify(t)]), { group: l };
320
317
  }
321
- const pe = ee, Se = N, ye = N, me = I, xe = I;
318
+ const ie = ee, fe = N, de = N, pe = I, Se = I;
322
319
  export {
323
- ye as SciChart,
324
- Se as SciPlot,
325
- fe as StackedPlot,
320
+ de as SciChart,
321
+ fe as SciPlot,
322
+ ae as StackedPlot,
326
323
  N as VeloPlot,
327
- pe as useChartGroup,
324
+ ie as useChartGroup,
328
325
  ee as useChartSync,
329
- de as useIndicator,
330
- xe as useSciChart,
331
- me as useSciPlot,
326
+ le as useIndicator,
327
+ Se as useSciChart,
328
+ pe as useSciPlot,
332
329
  W as useStackedPlot,
333
330
  I as useVeloPlot
334
331
  };
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sources":["../src/react/useVeloPlot.ts","../src/react/VeloPlot.tsx","../src/react/useStackedPlot.ts","../src/react/StackedPlot.tsx","../src/react/useIndicator.ts","../src/react/useChartSync.ts","../src/react/index.ts"],"sourcesContent":["/**\n * useVeloPlot - React hook for Velo Plot\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useCallback,\n type RefObject,\n} from \"react\";\nimport type { Chart } from \"../core/Chart\";\nimport type {\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n Bounds,\n} from \"../types\";\nimport {\n createChartLifecycle,\n type ChartBindingOptions,\n optionsChanged,\n syncChartOptions,\n pickSyncableOptions,\n} from \"../bindings/shared\";\n\nexport interface UseVeloPlotOptions extends ChartBindingOptions {}\n\nexport interface UseVeloPlotReturn {\n chart: Chart | null;\n isReady: boolean;\n error: Error | null;\n bounds: Bounds | null;\n addSeries: (options: SeriesOptions) => void;\n updateSeries: (id: string, data: SeriesUpdateData) => void;\n removeSeries: (id: string) => void;\n zoom: (options: ZoomOptions) => void;\n resetZoom: () => void;\n}\n\nexport function useVeloPlot(\n containerRef: RefObject<HTMLDivElement>,\n options: UseVeloPlotOptions = {},\n): UseVeloPlotReturn {\n const [chart, setChart] = useState<Chart | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [bounds, setBounds] = useState<Bounds | null>(null);\n\n const chartRef = useRef<Chart | null>(null);\n const destroyRef = useRef<(() => void) | null>(null);\n const optionsRef = useRef(options);\n const prevSyncOptionsRef = useRef(pickSyncableOptions(options));\n optionsRef.current = options;\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n try {\n const handle = createChartLifecycle(\n container,\n optionsRef.current,\n {\n onBoundsChange: setBounds,\n onError: setError,\n },\n );\n chartRef.current = handle.chart;\n destroyRef.current = handle.destroy;\n setChart(handle.chart);\n setIsReady(true);\n setBounds(handle.getBounds());\n setError(null);\n prevSyncOptionsRef.current = pickSyncableOptions(optionsRef.current);\n } catch (err) {\n console.error(\"[useVeloPlot] Failed to initialize chart:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsReady(false);\n }\n\n return () => {\n destroyRef.current?.();\n destroyRef.current = null;\n chartRef.current = null;\n setChart(null);\n setIsReady(false);\n };\n }, [containerRef]);\n\n useEffect(() => {\n const currentChart = chartRef.current;\n if (!currentChart || !isReady) return;\n\n const next = pickSyncableOptions(options);\n const prev = prevSyncOptionsRef.current;\n if (optionsChanged(prev, next)) {\n syncChartOptions(currentChart, prev, next);\n prevSyncOptionsRef.current = next;\n }\n });\n\n const addSeries = useCallback((seriesOptions: SeriesOptions) => {\n const c = chartRef.current;\n if (c) {\n c.addSeries(seriesOptions);\n setBounds(c.getViewBounds());\n }\n }, []);\n\n const updateSeries = useCallback((id: string, data: SeriesUpdateData) => {\n chartRef.current?.updateSeries(id, data);\n }, []);\n\n const removeSeries = useCallback((id: string) => {\n chartRef.current?.removeSeries(id);\n }, []);\n\n const zoom = useCallback((zoomOptions: ZoomOptions) => {\n chartRef.current?.zoom(zoomOptions);\n }, []);\n\n const resetZoom = useCallback(() => {\n const c = chartRef.current;\n if (c) {\n c.resetZoom();\n setBounds(c.getViewBounds());\n }\n }, []);\n\n return {\n chart,\n isReady,\n error,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n zoom,\n resetZoom,\n };\n}\n","/**\n * VeloPlot - React Component for Scientific Charts\n */\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useVeloPlot, type UseVeloPlotOptions } from \"./useVeloPlot\";\nimport type { ZoomOptions, CursorOptions, Bounds } from \"../types\";\nimport type { Chart } from \"../core/Chart\";\nimport {\n diffSeries,\n applyChartA11y,\n updateA11y,\n type VeloPlotSeries,\n} from \"../bindings/shared\";\n\nexport type { VeloPlotSeries } from \"../bindings/shared\";\n\nexport interface VeloPlotProps extends UseVeloPlotOptions {\n series?: VeloPlotSeries[];\n zoom?: ZoomOptions;\n onZoomChange?: (bounds: Bounds) => void;\n cursor?: CursorOptions;\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n debug?: boolean;\n /** Custom aria-label for accessibility */\n ariaLabel?: string;\n /** Enable keyboard navigation (default: true) */\n keyboardNav?: boolean;\n}\n\nexport interface VeloPlotRef {\n getChart: () => Chart | null;\n resetZoom: () => void;\n getBounds: () => Bounds | null;\n}\n\nexport const VeloPlot = forwardRef<VeloPlotRef, VeloPlotProps>(\n function VeloPlot(\n {\n series = [],\n zoom: zoomProp,\n onZoomChange,\n cursor,\n width = \"100%\",\n height = 400,\n className = \"\",\n style = {},\n debug = false,\n ariaLabel,\n keyboardNav = true,\n ...chartOptions\n },\n ref,\n ) {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousSeriesRef = useRef<Map<string, VeloPlotSeries>>(new Map());\n const a11yRef = useRef<ReturnType<typeof applyChartA11y> | null>(null);\n\n const {\n chart,\n isReady,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n resetZoom,\n } = useVeloPlot(containerRef, chartOptions);\n\n useImperativeHandle(\n ref,\n () => ({\n getChart: () => chart,\n resetZoom,\n getBounds: () => bounds,\n }),\n [chart, resetZoom, bounds],\n );\n\n useEffect(() => {\n if (!isReady || !chart) return;\n previousSeriesRef.current = diffSeries(\n { addSeries, updateSeries, removeSeries, autoScale: () => chart.autoScale() },\n series,\n previousSeriesRef.current,\n );\n }, [series, isReady, chart, addSeries, updateSeries, removeSeries]);\n\n useEffect(() => {\n if (!isReady || !chart || !zoomProp) return;\n chart.zoom(zoomProp);\n }, [isReady, chart, zoomProp]);\n\n useEffect(() => {\n if (!isReady || !chart || !onZoomChange) return;\n const handler = (event: { x: [number, number]; y: [number, number] }) => {\n onZoomChange({\n xMin: event.x[0],\n xMax: event.x[1],\n yMin: event.y[0],\n yMax: event.y[1],\n });\n };\n chart.on(\"zoom\", handler);\n return () => chart.off(\"zoom\", handler);\n }, [isReady, chart, onZoomChange]);\n\n useEffect(() => {\n if (!isReady || !chart) return;\n if (cursor?.enabled) {\n chart.enableCursor(cursor);\n } else {\n chart.disableCursor();\n }\n }, [isReady, chart, cursor]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!isReady || !chart || !el) return;\n\n a11yRef.current = applyChartA11y(el, chart, {\n label: ariaLabel,\n series,\n bounds,\n enableKeyboard: keyboardNav,\n });\n\n return () => {\n a11yRef.current?.cleanup();\n a11yRef.current = null;\n };\n }, [isReady, chart, keyboardNav, ariaLabel]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el || !a11yRef.current) return;\n updateA11y(el, a11yRef.current.srTable, {\n label: ariaLabel,\n series,\n bounds,\n });\n }, [series, bounds, ariaLabel]);\n\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n position: \"relative\",\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n outline: \"none\",\n ...style,\n }),\n [width, height, style],\n );\n\n return (\n <div\n ref={containerRef}\n className={`velo-plot-container ${className}`}\n style={containerStyle}\n >\n {debug && bounds && (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"rgba(0,0,0,0.7)\",\n color: \"#0f0\",\n padding: \"4px 8px\",\n borderRadius: 4,\n fontSize: 11,\n fontFamily: \"monospace\",\n pointerEvents: \"none\",\n }}\n >\n <div>\n X: [{bounds.xMin.toFixed(3)}, {bounds.xMax.toFixed(3)}]\n </div>\n <div>\n Y: [{bounds.yMin.toExponential(2)}, {bounds.yMax.toExponential(2)}]\n </div>\n <div>Series: {series.length}</div>\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default VeloPlot;\n","/**\n * useStackedPlot - React hook for multi-pane stacked charts\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useCallback,\n type RefObject,\n} from \"react\";\nimport { createStackedChart } from \"../core/stacked\";\nimport type { StackedChart, StackedChartOptions } from \"../core/stacked\";\nimport type { Range } from \"../types\";\nimport {\n stackedStructureKey,\n syncStackedOptions,\n syncStackedPaneSeries,\n} from \"../bindings/shared\";\nimport type { VeloPlotSeries } from \"../bindings/shared\";\n\nexport interface UseStackedPlotOptions\n extends Omit<StackedChartOptions, \"container\"> {}\n\nexport interface UseStackedPlotReturn {\n containerRef: RefObject<HTMLDivElement>;\n stack: StackedChart | null;\n isReady: boolean;\n fitAll: (options?: { x?: Range; padding?: number }) => void;\n resetAll: () => void;\n}\n\nexport function useStackedPlot(\n options: UseStackedPlotOptions,\n): UseStackedPlotReturn {\n const containerRef = useRef<HTMLDivElement>(null);\n const stackRef = useRef<StackedChart | null>(null);\n const destroyRef = useRef<(() => void) | null>(null);\n const [stack, setStack] = useState<StackedChart | null>(null);\n const [isReady, setIsReady] = useState(false);\n\n const optionsRef = useRef(options);\n const structureKeyRef = useRef(stackedStructureKey(options.panes));\n const paneSeriesRef = useRef(new Map<string, Map<string, VeloPlotSeries>>());\n optionsRef.current = options;\n\n const mountStack = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n\n destroyRef.current?.();\n const created = createStackedChart({\n ...optionsRef.current,\n container: el,\n });\n stackRef.current = created;\n destroyRef.current = () => {\n created.destroy();\n stackRef.current = null;\n };\n setStack(created);\n structureKeyRef.current = stackedStructureKey(optionsRef.current.panes);\n paneSeriesRef.current = syncStackedPaneSeries(\n created,\n optionsRef.current.panes,\n new Map(),\n );\n\n created.whenReady().then(() => setIsReady(true));\n }, []);\n\n useEffect(() => {\n mountStack();\n return () => {\n setIsReady(false);\n destroyRef.current?.();\n destroyRef.current = null;\n setStack(null);\n };\n }, [mountStack]);\n\n useEffect(() => {\n const current = stackRef.current;\n if (!current || !isReady) return;\n\n const nextKey = stackedStructureKey(options.panes);\n if (nextKey !== structureKeyRef.current) {\n mountStack();\n return;\n }\n\n syncStackedOptions(current, options);\n paneSeriesRef.current = syncStackedPaneSeries(\n current,\n options.panes,\n paneSeriesRef.current,\n );\n });\n\n const fitAll = useCallback((opts?: { x?: Range; padding?: number }) => {\n stackRef.current?.fitAll(opts);\n }, []);\n\n const resetAll = useCallback(() => {\n stackRef.current?.resetAll();\n }, []);\n\n return { containerRef, stack, isReady, fitAll, resetAll };\n}\n","/**\n * StackedPlot - Declarative React component for multi-pane charts\n */\n\nimport {\n forwardRef,\n useImperativeHandle,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useStackedPlot, type UseStackedPlotOptions } from \"./useStackedPlot\";\nimport type { StackedChart } from \"../core/stacked\";\nimport type { Bounds } from \"../types\";\nimport type { AddIndicatorOptions } from \"../core/indicator/addIndicator\";\nimport type { IndicatorPresetName } from \"../core/indicator/indicatorPresets\";\n\nexport interface StackedPlotIndicator extends AddIndicatorOptions {\n type: IndicatorPresetName;\n}\n\nexport interface StackedPlotProps extends UseStackedPlotOptions {\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n indicators?: StackedPlotIndicator[];\n onCrosshairMove?: (event: { price?: number; x: number }) => void;\n drawingTools?: string[];\n ariaLabel?: string;\n}\n\nexport interface StackedPlotRef {\n getStack: () => StackedChart | null;\n fitAll: () => void;\n resetAll: () => void;\n getBounds: () => Bounds | null;\n}\n\nexport const StackedPlot = forwardRef<StackedPlotRef, StackedPlotProps>(\n function StackedPlot(\n {\n width = \"100%\",\n height = 480,\n className = \"\",\n style = {},\n indicators: _indicators,\n onCrosshairMove: _onCrosshairMove,\n drawingTools: _drawingTools,\n ariaLabel,\n panes,\n ...stackOptions\n },\n ref,\n ) {\n const { containerRef, stack, isReady, fitAll, resetAll } = useStackedPlot({\n panes,\n ...stackOptions,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n getStack: () => stack,\n fitAll: () => fitAll(),\n resetAll,\n getBounds: () => stack?.getMaster().getViewBounds() ?? null,\n }),\n [stack, fitAll, resetAll],\n );\n\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n position: \"relative\",\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n ...style,\n }),\n [width, height, style],\n );\n\n return (\n <div\n ref={containerRef as React.RefObject<HTMLDivElement>}\n className={`velo-plot-stacked ${className}`}\n style={containerStyle}\n role=\"img\"\n aria-label={ariaLabel ?? `Stacked chart with ${panes.length} panes`}\n data-ready={isReady ? \"true\" : \"false\"}\n />\n );\n },\n);\n\nexport default StackedPlot;\n","/**\n * useIndicator - React hook for trading indicators\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { Chart } from \"../core/chart/types\";\nimport type { AddIndicatorOptions, AddIndicatorResult } from \"../core/indicator/addIndicator\";\nimport type { IndicatorPresetName } from \"../core/indicator/indicatorPresets\";\nimport {\n addIndicatorToHost,\n isStackedChart,\n removeIndicatorFromChart,\n type IndicatorHost,\n} from \"../bindings/shared\";\n\nexport interface UseIndicatorReturn {\n result: (AddIndicatorResult & { paneId?: string }) | null;\n isLoading: boolean;\n error: Error | null;\n}\n\nexport function useIndicator(\n host: IndicatorHost,\n preset: IndicatorPresetName,\n options: AddIndicatorOptions = {},\n): UseIndicatorReturn {\n const [result, setResult] = useState<\n (AddIndicatorResult & { paneId?: string }) | null\n >(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const resultRef = useRef(result);\n resultRef.current = result;\n\n useEffect(() => {\n if (!host) return;\n\n let cancelled = false;\n setIsLoading(true);\n setError(null);\n\n addIndicatorToHost(host, preset, options)\n .then((res) => {\n if (!cancelled) {\n setResult(res);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n const res = resultRef.current;\n if (res && !isStackedChart(host)) {\n removeIndicatorFromChart(host as Chart, res.id);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [host, preset, JSON.stringify(options)]);\n\n return { result, isLoading, error };\n}\n","/**\n * useChartSync - React hook for synchronizing multiple charts\n */\n\nimport { useEffect, useState } from \"react\";\nimport type { ChartLike, SyncOptions } from \"../core/sync\";\nimport { ChartGroup } from \"../core/sync\";\nimport { createChartSync } from \"../bindings/shared\";\n\nexport interface UseChartSyncReturn {\n group: ChartGroup | null;\n}\n\nexport function useChartSync(\n charts: ChartLike[],\n options?: SyncOptions,\n): UseChartSyncReturn {\n const [group, setGroup] = useState<ChartGroup | null>(null);\n\n useEffect(() => {\n if (charts.length < 2) {\n setGroup(null);\n return;\n }\n\n const handle = createChartSync(charts, options);\n setGroup(handle.group);\n\n return () => {\n handle.destroy();\n setGroup(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [charts, JSON.stringify(options)]);\n\n return { group };\n}\n\n/** Alias matching roadmap naming (`useChartGroup` ≡ `useChartSync`). */\nexport const useChartGroup = useChartSync;\n","/**\n * React bindings for Velo Plot\n */\n\nexport {\n VeloPlot,\n type VeloPlotProps,\n type VeloPlotRef,\n type VeloPlotSeries,\n} from \"./VeloPlot\";\nexport {\n StackedPlot,\n type StackedPlotProps,\n type StackedPlotRef,\n type StackedPlotIndicator,\n} from \"./StackedPlot\";\nexport {\n useVeloPlot,\n type UseVeloPlotOptions,\n type UseVeloPlotReturn,\n} from \"./useVeloPlot\";\nexport {\n useStackedPlot,\n type UseStackedPlotOptions,\n type UseStackedPlotReturn,\n} from \"./useStackedPlot\";\nexport {\n useIndicator,\n type UseIndicatorReturn,\n} from \"./useIndicator\";\nexport {\n useChartSync,\n useChartGroup,\n type UseChartSyncReturn,\n} from \"./useChartSync\";\n\n// ---------------------------------------------------------------------------\n// Backward-compatible aliases (SciPlot / SciChart branding → VeloPlot)\n// Removed in v4.0.\n// ---------------------------------------------------------------------------\nimport { VeloPlot as VeloPlotImpl } from \"./VeloPlot\";\nimport { useVeloPlot as useVeloPlotImpl } from \"./useVeloPlot\";\n\n/**\n * @deprecated Use `VeloPlot` instead. **Removed in v4.0.**\n */\nexport const SciPlot = VeloPlotImpl;\n/**\n * @deprecated Use `VeloPlot` instead. **Removed in v4.0.**\n */\nexport const SciChart = VeloPlotImpl;\n/**\n * @deprecated Use `useVeloPlot` instead. **Removed in v4.0.**\n */\nexport const useSciPlot = useVeloPlotImpl;\n/**\n * @deprecated Use `useVeloPlot` instead. **Removed in v4.0.**\n */\nexport const useSciChart = useVeloPlotImpl;\n\nexport type {\n VeloPlotProps as SciPlotProps,\n VeloPlotRef as SciPlotRef,\n VeloPlotSeries as SciPlotSeries,\n VeloPlotProps as SciChartProps,\n VeloPlotRef as SciChartRef,\n VeloPlotSeries as SciChartSeries,\n} from \"./VeloPlot\";\nexport type {\n UseVeloPlotOptions as UseSciPlotOptions,\n UseVeloPlotReturn as UseSciPlotReturn,\n UseVeloPlotOptions as UseSciChartOptions,\n UseVeloPlotReturn as UseSciChartReturn,\n} from \"./useVeloPlot\";\n"],"names":["useVeloPlot","containerRef","options","chart","setChart","useState","isReady","setIsReady","error","setError","bounds","setBounds","chartRef","useRef","destroyRef","optionsRef","prevSyncOptionsRef","pickSyncableOptions","useEffect","container","handle","createChartLifecycle","err","_a","currentChart","next","prev","optionsChanged","syncChartOptions","addSeries","useCallback","seriesOptions","c","updateSeries","id","data","removeSeries","zoom","zoomOptions","resetZoom","VeloPlot","forwardRef","series","zoomProp","onZoomChange","cursor","width","height","className","style","debug","ariaLabel","keyboardNav","chartOptions","ref","previousSeriesRef","a11yRef","useImperativeHandle","diffSeries","handler","event","el","applyChartA11y","updateA11y","containerStyle","useMemo","jsx","jsxs","useStackedPlot","stackRef","stack","setStack","structureKeyRef","stackedStructureKey","paneSeriesRef","mountStack","created","createStackedChart","syncStackedPaneSeries","current","syncStackedOptions","fitAll","opts","resetAll","StackedPlot","_indicators","_onCrosshairMove","_drawingTools","panes","stackOptions","useIndicator","host","preset","result","setResult","isLoading","setIsLoading","resultRef","cancelled","addIndicatorToHost","res","isStackedChart","removeIndicatorFromChart","useChartSync","charts","group","setGroup","createChartSync","useChartGroup","SciPlot","VeloPlotImpl","SciChart","useSciPlot","useVeloPlotImpl","useSciChart"],"mappings":";;;;;;;;;;AAwCO,SAASA,EACdC,GACAC,IAA8B,IACX;AACnB,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAuB,IAAI,GAC/C,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAOC,CAAQ,IAAIJ,EAAuB,IAAI,GAC/C,CAACK,GAAQC,CAAS,IAAIN,EAAwB,IAAI,GAElDO,IAAWC,EAAqB,IAAI,GACpCC,IAAaD,EAA4B,IAAI,GAC7CE,IAAaF,EAAOX,CAAO,GAC3Bc,IAAqBH,EAAOI,EAAoBf,CAAO,CAAC;AAC9D,EAAAa,EAAW,UAAUb,GAErBgB,EAAU,MAAM;AACd,UAAMC,IAAYlB,EAAa;AAC/B,QAAKkB,GAEL;AAAA,UAAI;AACF,cAAMC,IAASC;AAAA,UACbF;AAAA,UACAJ,EAAW;AAAA,UACX;AAAA,YACE,gBAAgBJ;AAAA,YAChB,SAASF;AAAA,UAAA;AAAA,QACX;AAEF,QAAAG,EAAS,UAAUQ,EAAO,OAC1BN,EAAW,UAAUM,EAAO,SAC5BhB,EAASgB,EAAO,KAAK,GACrBb,EAAW,EAAI,GACfI,EAAUS,EAAO,WAAW,GAC5BX,EAAS,IAAI,GACbO,EAAmB,UAAUC,EAAoBF,EAAW,OAAO;AAAA,MACrE,SAASO,GAAK;AACZ,gBAAQ,MAAM,6CAA6CA,CAAG,GAC9Db,EAASa,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,GAC5Df,EAAW,EAAK;AAAA,MAClB;AAEA,aAAO,MAAM;;AACX,SAAAgB,IAAAT,EAAW,YAAX,QAAAS,EAAA,KAAAT,IACAA,EAAW,UAAU,MACrBF,EAAS,UAAU,MACnBR,EAAS,IAAI,GACbG,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAAG,CAACN,CAAY,CAAC,GAEjBiB,EAAU,MAAM;AACd,UAAMM,IAAeZ,EAAS;AAC9B,QAAI,CAACY,KAAgB,CAAClB,EAAS;AAE/B,UAAMmB,IAAOR,EAAoBf,CAAO,GAClCwB,IAAOV,EAAmB;AAChC,IAAIW,EAAeD,GAAMD,CAAI,MAC3BG,EAAiBJ,GAAcE,GAAMD,CAAI,GACzCT,EAAmB,UAAUS;AAAA,EAEjC,CAAC;AAED,QAAMI,IAAYC,EAAY,CAACC,MAAiC;AAC9D,UAAMC,IAAIpB,EAAS;AACnB,IAAIoB,MACFA,EAAE,UAAUD,CAAa,GACzBpB,EAAUqB,EAAE,eAAe;AAAA,EAE/B,GAAG,CAAA,CAAE,GAECC,IAAeH,EAAY,CAACI,GAAYC,MAA2B;;AACvE,KAAAZ,IAAAX,EAAS,YAAT,QAAAW,EAAkB,aAAaW,GAAIC;AAAA,EACrC,GAAG,CAAA,CAAE,GAECC,IAAeN,EAAY,CAACI,MAAe;;AAC/C,KAAAX,IAAAX,EAAS,YAAT,QAAAW,EAAkB,aAAaW;AAAA,EACjC,GAAG,CAAA,CAAE,GAECG,IAAOP,EAAY,CAACQ,MAA6B;;AACrD,KAAAf,IAAAX,EAAS,YAAT,QAAAW,EAAkB,KAAKe;AAAA,EACzB,GAAG,CAAA,CAAE,GAECC,IAAYT,EAAY,MAAM;AAClC,UAAME,IAAIpB,EAAS;AACnB,IAAIoB,MACFA,EAAE,UAAA,GACFrB,EAAUqB,EAAE,eAAe;AAAA,EAE/B,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,OAAA7B;AAAA,IACA,SAAAG;AAAA,IACA,OAAAE;AAAA,IACA,QAAAE;AAAA,IACA,WAAAmB;AAAA,IACA,cAAAI;AAAA,IACA,cAAAG;AAAA,IACA,MAAAC;AAAA,IACA,WAAAE;AAAA,EAAA;AAEJ;AC/FO,MAAMC,IAAWC;AAAA,EACtB,SACE;AAAA,IACE,QAAAC,IAAS,CAAA;AAAA,IACT,MAAMC;AAAA,IACN,cAAAC;AAAA,IACA,QAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,QAAAC,IAAS;AAAA,IACT,WAAAC,IAAY;AAAA,IACZ,OAAAC,IAAQ,CAAA;AAAA,IACR,OAAAC,IAAQ;AAAA,IACR,WAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,GAAGC;AAAA,EAAA,GAELC,GACA;AACA,UAAMrD,IAAeY,EAAuB,IAAI,GAC1C0C,IAAoB1C,EAAoC,oBAAI,KAAK,GACjE2C,IAAU3C,EAAiD,IAAI,GAE/D;AAAA,MACJ,OAAAV;AAAA,MACA,SAAAG;AAAA,MACA,QAAAI;AAAA,MACA,WAAAmB;AAAA,MACA,cAAAI;AAAA,MACA,cAAAG;AAAA,MACA,WAAAG;AAAA,IAAA,IACEvC,EAAYC,GAAcoD,CAAY;AAE1C,IAAAI;AAAA,MACEH;AAAA,MACA,OAAO;AAAA,QACL,UAAU,MAAMnD;AAAA,QAChB,WAAAoC;AAAA,QACA,WAAW,MAAM7B;AAAA,MAAA;AAAA,MAEnB,CAACP,GAAOoC,GAAW7B,CAAM;AAAA,IAAA,GAG3BQ,EAAU,MAAM;AACd,MAAI,CAACZ,KAAW,CAACH,MACjBoD,EAAkB,UAAUG;AAAA,QAC1B,EAAE,WAAA7B,GAAW,cAAAI,GAAc,cAAAG,GAAc,WAAW,MAAMjC,EAAM,YAAU;AAAA,QAC1EuC;AAAA,QACAa,EAAkB;AAAA,MAAA;AAAA,IAEtB,GAAG,CAACb,GAAQpC,GAASH,GAAO0B,GAAWI,GAAcG,CAAY,CAAC,GAElElB,EAAU,MAAM;AACd,MAAI,CAACZ,KAAW,CAACH,KAAS,CAACwC,KAC3BxC,EAAM,KAAKwC,CAAQ;AAAA,IACrB,GAAG,CAACrC,GAASH,GAAOwC,CAAQ,CAAC,GAE7BzB,EAAU,MAAM;AACd,UAAI,CAACZ,KAAW,CAACH,KAAS,CAACyC,EAAc;AACzC,YAAMe,IAAU,CAACC,MAAwD;AACvE,QAAAhB,EAAa;AAAA,UACX,MAAMgB,EAAM,EAAE,CAAC;AAAA,UACf,MAAMA,EAAM,EAAE,CAAC;AAAA,UACf,MAAMA,EAAM,EAAE,CAAC;AAAA,UACf,MAAMA,EAAM,EAAE,CAAC;AAAA,QAAA,CAChB;AAAA,MACH;AACA,aAAAzD,EAAM,GAAG,QAAQwD,CAAO,GACjB,MAAMxD,EAAM,IAAI,QAAQwD,CAAO;AAAA,IACxC,GAAG,CAACrD,GAASH,GAAOyC,CAAY,CAAC,GAEjC1B,EAAU,MAAM;AACd,MAAI,CAACZ,KAAW,CAACH,MACb0C,KAAA,QAAAA,EAAQ,UACV1C,EAAM,aAAa0C,CAAM,IAEzB1C,EAAM,cAAA;AAAA,IAEV,GAAG,CAACG,GAASH,GAAO0C,CAAM,CAAC,GAE3B3B,EAAU,MAAM;AACd,YAAM2C,IAAK5D,EAAa;AACxB,UAAI,GAACK,KAAW,CAACH,KAAS,CAAC0D;AAE3B,eAAAL,EAAQ,UAAUM,EAAeD,GAAI1D,GAAO;AAAA,UAC1C,OAAOgD;AAAA,UACP,QAAAT;AAAA,UACA,QAAAhC;AAAA,UACA,gBAAgB0C;AAAA,QAAA,CACjB,GAEM,MAAM;;AACX,WAAA7B,IAAAiC,EAAQ,YAAR,QAAAjC,EAAiB,WACjBiC,EAAQ,UAAU;AAAA,QACpB;AAAA,IACF,GAAG,CAAClD,GAASH,GAAOiD,GAAaD,CAAS,CAAC,GAE3CjC,EAAU,MAAM;AACd,YAAM2C,IAAK5D,EAAa;AACxB,MAAI,CAAC4D,KAAM,CAACL,EAAQ,WACpBO,EAAWF,GAAIL,EAAQ,QAAQ,SAAS;AAAA,QACtC,OAAOL;AAAA,QACP,QAAAT;AAAA,QACA,QAAAhC;AAAA,MAAA,CACD;AAAA,IACH,GAAG,CAACgC,GAAQhC,GAAQyC,CAAS,CAAC;AAE9B,UAAMa,IAAiBC;AAAA,MACrB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,OAAOnB,KAAU,WAAW,GAAGA,CAAK,OAAOA;AAAA,QAClD,QAAQ,OAAOC,KAAW,WAAW,GAAGA,CAAM,OAAOA;AAAA,QACrD,SAAS;AAAA,QACT,GAAGE;AAAA,MAAA;AAAA,MAEL,CAACH,GAAOC,GAAQE,CAAK;AAAA,IAAA;AAGvB,WACE,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKjE;AAAA,QACL,WAAW,uBAAuB+C,CAAS;AAAA,QAC3C,OAAOgB;AAAA,QAEN,eAAStD,KACR,gBAAAyD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,SAAS;AAAA,cACT,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,eAAe;AAAA,YAAA;AAAA,YAGjB,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EAAI,UAAA;AAAA,gBAAA;AAAA,gBACEzD,EAAO,KAAK,QAAQ,CAAC;AAAA,gBAAE;AAAA,gBAAGA,EAAO,KAAK,QAAQ,CAAC;AAAA,gBAAE;AAAA,cAAA,GACxD;AAAA,gCACC,OAAA,EAAI,UAAA;AAAA,gBAAA;AAAA,gBACEA,EAAO,KAAK,cAAc,CAAC;AAAA,gBAAE;AAAA,gBAAGA,EAAO,KAAK,cAAc,CAAC;AAAA,gBAAE;AAAA,cAAA,GACpE;AAAA,gCACC,OAAA,EAAI,UAAA;AAAA,gBAAA;AAAA,gBAASgC,EAAO;AAAA,cAAA,EAAA,CAAO;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC9B;AAAA,IAAA;AAAA,EAIR;AACF;ACpKO,SAAS0B,EACdlE,GACsB;AACtB,QAAMD,IAAeY,EAAuB,IAAI,GAC1CwD,IAAWxD,EAA4B,IAAI,GAC3CC,IAAaD,EAA4B,IAAI,GAC7C,CAACyD,GAAOC,CAAQ,IAAIlE,EAA8B,IAAI,GACtD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GAEtCU,IAAaF,EAAOX,CAAO,GAC3BsE,IAAkB3D,EAAO4D,EAAoBvE,EAAQ,KAAK,CAAC,GAC3DwE,IAAgB7D,EAAO,oBAAI,KAA0C;AAC3E,EAAAE,EAAW,UAAUb;AAErB,QAAMyE,IAAa7C,EAAY,MAAM;;AACnC,UAAM+B,IAAK5D,EAAa;AACxB,QAAI,CAAC4D,EAAI;AAET,KAAAtC,IAAAT,EAAW,YAAX,QAAAS,EAAA,KAAAT;AACA,UAAM8D,IAAUC,EAAmB;AAAA,MACjC,GAAG9D,EAAW;AAAA,MACd,WAAW8C;AAAA,IAAA,CACZ;AACD,IAAAQ,EAAS,UAAUO,GACnB9D,EAAW,UAAU,MAAM;AACzB,MAAA8D,EAAQ,QAAA,GACRP,EAAS,UAAU;AAAA,IACrB,GACAE,EAASK,CAAO,GAChBJ,EAAgB,UAAUC,EAAoB1D,EAAW,QAAQ,KAAK,GACtE2D,EAAc,UAAUI;AAAA,MACtBF;AAAA,MACA7D,EAAW,QAAQ;AAAA,0BACf,IAAA;AAAA,IAAI,GAGV6D,EAAQ,YAAY,KAAK,MAAMrE,EAAW,EAAI,CAAC;AAAA,EACjD,GAAG,CAAA,CAAE;AAEL,EAAAW,EAAU,OACRyD,EAAA,GACO,MAAM;;AACX,IAAApE,EAAW,EAAK,IAChBgB,IAAAT,EAAW,YAAX,QAAAS,EAAA,KAAAT,IACAA,EAAW,UAAU,MACrByD,EAAS,IAAI;AAAA,EACf,IACC,CAACI,CAAU,CAAC,GAEfzD,EAAU,MAAM;AACd,UAAM6D,IAAUV,EAAS;AACzB,QAAI,CAACU,KAAW,CAACzE,EAAS;AAG1B,QADgBmE,EAAoBvE,EAAQ,KAAK,MACjCsE,EAAgB,SAAS;AACvC,MAAAG,EAAA;AACA;AAAA,IACF;AAEA,IAAAK,EAAmBD,GAAS7E,CAAO,GACnCwE,EAAc,UAAUI;AAAA,MACtBC;AAAA,MACA7E,EAAQ;AAAA,MACRwE,EAAc;AAAA,IAAA;AAAA,EAElB,CAAC;AAED,QAAMO,IAASnD,EAAY,CAACoD,MAA2C;;AACrE,KAAA3D,IAAA8C,EAAS,YAAT,QAAA9C,EAAkB,OAAO2D;AAAA,EAC3B,GAAG,CAAA,CAAE,GAECC,IAAWrD,EAAY,MAAM;;AACjC,KAAAP,IAAA8C,EAAS,YAAT,QAAA9C,EAAkB;AAAA,EACpB,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,cAAAtB,GAAc,OAAAqE,GAAO,SAAAhE,GAAS,QAAA2E,GAAQ,UAAAE,EAAA;AACjD;ACtEO,MAAMC,KAAc3C;AAAA,EACzB,SACE;AAAA,IACE,OAAAK,IAAQ;AAAA,IACR,QAAAC,IAAS;AAAA,IACT,WAAAC,IAAY;AAAA,IACZ,OAAAC,IAAQ,CAAA;AAAA,IACR,YAAYoC;AAAA,IACZ,iBAAiBC;AAAA,IACjB,cAAcC;AAAA,IACd,WAAApC;AAAA,IACA,OAAAqC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELnC,GACA;AACA,UAAM,EAAE,cAAArD,GAAc,OAAAqE,GAAO,SAAAhE,GAAS,QAAA2E,GAAQ,UAAAE,EAAA,IAAaf,EAAe;AAAA,MACxE,OAAAoB;AAAA,MACA,GAAGC;AAAA,IAAA,CACJ;AAED,IAAAhC;AAAA,MACEH;AAAA,MACA,OAAO;AAAA,QACL,UAAU,MAAMgB;AAAA,QAChB,QAAQ,MAAMW,EAAA;AAAA,QACd,UAAAE;AAAA,QACA,WAAW,OAAMb,KAAA,gBAAAA,EAAO,YAAY,oBAAmB;AAAA,MAAA;AAAA,MAEzD,CAACA,GAAOW,GAAQE,CAAQ;AAAA,IAAA;AAG1B,UAAMnB,IAAiBC;AAAA,MACrB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,OAAOnB,KAAU,WAAW,GAAGA,CAAK,OAAOA;AAAA,QAClD,QAAQ,OAAOC,KAAW,WAAW,GAAGA,CAAM,OAAOA;AAAA,QACrD,GAAGE;AAAA,MAAA;AAAA,MAEL,CAACH,GAAOC,GAAQE,CAAK;AAAA,IAAA;AAGvB,WACE,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKjE;AAAA,QACL,WAAW,qBAAqB+C,CAAS;AAAA,QACzC,OAAOgB;AAAA,QACP,MAAK;AAAA,QACL,cAAYb,KAAa,sBAAsBqC,EAAM,MAAM;AAAA,QAC3D,cAAYlF,IAAU,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAGrC;AACF;ACtEO,SAASoF,GACdC,GACAC,GACA1F,IAA+B,CAAA,GACX;AACpB,QAAM,CAAC2F,GAAQC,CAAS,IAAIzF,EAE1B,IAAI,GACA,CAAC0F,GAAWC,CAAY,IAAI3F,EAAS,EAAK,GAC1C,CAACG,GAAOC,CAAQ,IAAIJ,EAAuB,IAAI,GAC/C4F,IAAYpF,EAAOgF,CAAM;AAC/B,SAAAI,EAAU,UAAUJ,GAEpB3E,EAAU,MAAM;AACd,QAAI,CAACyE,EAAM;AAEX,QAAIO,IAAY;AAChB,WAAAF,EAAa,EAAI,GACjBvF,EAAS,IAAI,GAEb0F,EAAmBR,GAAMC,GAAQ1F,CAAO,EACrC,KAAK,CAACkG,MAAQ;AACb,MAAKF,MACHJ,EAAUM,CAAG,GACbJ,EAAa,EAAK;AAAA,IAEtB,CAAC,EACA,MAAM,CAAC1E,MAAQ;AACd,MAAK4E,MACHzF,EAASa,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,GAC5D0E,EAAa,EAAK;AAAA,IAEtB,CAAC,GAEI,MAAM;AACX,MAAAE,IAAY;AACZ,YAAME,IAAMH,EAAU;AACtB,MAAIG,KAAO,CAACC,EAAeV,CAAI,KAC7BW,EAAyBX,GAAeS,EAAI,EAAE;AAAA,IAElD;AAAA,EAEF,GAAG,CAACT,GAAMC,GAAQ,KAAK,UAAU1F,CAAO,CAAC,CAAC,GAEnC,EAAE,QAAA2F,GAAQ,WAAAE,GAAW,OAAAvF,EAAA;AAC9B;ACrDO,SAAS+F,GACdC,GACAtG,GACoB;AACpB,QAAM,CAACuG,GAAOC,CAAQ,IAAIrG,EAA4B,IAAI;AAE1D,SAAAa,EAAU,MAAM;AACd,QAAIsF,EAAO,SAAS,GAAG;AACrB,MAAAE,EAAS,IAAI;AACb;AAAA,IACF;AAEA,UAAMtF,IAASuF,EAAgBH,GAAQtG,CAAO;AAC9C,WAAAwG,EAAStF,EAAO,KAAK,GAEd,MAAM;AACX,MAAAA,EAAO,QAAA,GACPsF,EAAS,IAAI;AAAA,IACf;AAAA,EAEF,GAAG,CAACF,GAAQ,KAAK,UAAUtG,CAAO,CAAC,CAAC,GAE7B,EAAE,OAAAuG,EAAA;AACX;AAGO,MAAMG,KAAgBL,ICOhBM,KAAUC,GAIVC,KAAWD,GAIXE,KAAaC,GAIbC,KAAcD;"}
1
+ {"version":3,"file":"react.js","sources":["../src/react/useVeloPlot.ts","../src/react/VeloPlot.tsx","../src/react/useStackedPlot.ts","../src/react/StackedPlot.tsx","../src/react/useIndicator.ts","../src/react/useChartSync.ts","../src/react/index.ts"],"sourcesContent":["/**\n * useVeloPlot - React hook for Velo Plot\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useCallback,\n type RefObject,\n} from \"react\";\nimport type { Chart } from \"../core/Chart\";\nimport type {\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n Bounds,\n} from \"../types\";\nimport {\n createChartLifecycle,\n type ChartBindingOptions,\n optionsChanged,\n syncChartOptions,\n pickSyncableOptions,\n} from \"../bindings/shared\";\n\nexport interface UseVeloPlotOptions extends ChartBindingOptions {}\n\nexport interface UseVeloPlotReturn {\n chart: Chart | null;\n isReady: boolean;\n error: Error | null;\n bounds: Bounds | null;\n addSeries: (options: SeriesOptions) => void;\n updateSeries: (id: string, data: SeriesUpdateData) => void;\n removeSeries: (id: string) => void;\n zoom: (options: ZoomOptions) => void;\n resetZoom: () => void;\n}\n\nexport function useVeloPlot(\n containerRef: RefObject<HTMLDivElement>,\n options: UseVeloPlotOptions = {},\n): UseVeloPlotReturn {\n const [chart, setChart] = useState<Chart | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [bounds, setBounds] = useState<Bounds | null>(null);\n\n const chartRef = useRef<Chart | null>(null);\n const destroyRef = useRef<(() => void) | null>(null);\n const optionsRef = useRef(options);\n const prevSyncOptionsRef = useRef(pickSyncableOptions(options));\n optionsRef.current = options;\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n try {\n const handle = createChartLifecycle(\n container,\n optionsRef.current,\n {\n onBoundsChange: setBounds,\n onError: setError,\n },\n );\n chartRef.current = handle.chart;\n destroyRef.current = handle.destroy;\n setChart(handle.chart);\n setIsReady(true);\n setBounds(handle.getBounds());\n setError(null);\n prevSyncOptionsRef.current = pickSyncableOptions(optionsRef.current);\n } catch (err) {\n console.error(\"[useVeloPlot] Failed to initialize chart:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsReady(false);\n }\n\n return () => {\n destroyRef.current?.();\n destroyRef.current = null;\n chartRef.current = null;\n setChart(null);\n setIsReady(false);\n };\n }, [containerRef]);\n\n useEffect(() => {\n const currentChart = chartRef.current;\n if (!currentChart || !isReady) return;\n\n const next = pickSyncableOptions(options);\n const prev = prevSyncOptionsRef.current;\n if (optionsChanged(prev, next)) {\n syncChartOptions(currentChart, prev, next);\n prevSyncOptionsRef.current = next;\n }\n });\n\n const addSeries = useCallback((seriesOptions: SeriesOptions) => {\n const c = chartRef.current;\n if (c) {\n c.addSeries(seriesOptions);\n setBounds(c.getViewBounds());\n }\n }, []);\n\n const updateSeries = useCallback((id: string, data: SeriesUpdateData) => {\n chartRef.current?.updateSeries(id, data);\n }, []);\n\n const removeSeries = useCallback((id: string) => {\n chartRef.current?.removeSeries(id);\n }, []);\n\n const zoom = useCallback((zoomOptions: ZoomOptions) => {\n chartRef.current?.zoom(zoomOptions);\n }, []);\n\n const resetZoom = useCallback(() => {\n const c = chartRef.current;\n if (c) {\n c.resetZoom();\n setBounds(c.getViewBounds());\n }\n }, []);\n\n return {\n chart,\n isReady,\n error,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n zoom,\n resetZoom,\n };\n}\n","/**\n * VeloPlot - React Component for Scientific Charts\n */\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useVeloPlot, type UseVeloPlotOptions } from \"./useVeloPlot\";\nimport type { ZoomOptions, CursorOptions, Bounds } from \"../types\";\nimport type { Chart } from \"../core/Chart\";\nimport {\n diffSeries,\n applyChartA11y,\n updateA11y,\n type VeloPlotSeries,\n} from \"../bindings/shared\";\n\nexport type { VeloPlotSeries } from \"../bindings/shared\";\n\nexport interface VeloPlotProps extends UseVeloPlotOptions {\n series?: VeloPlotSeries[];\n zoom?: ZoomOptions;\n onZoomChange?: (bounds: Bounds) => void;\n cursor?: CursorOptions;\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n debug?: boolean;\n /** Custom aria-label for accessibility */\n ariaLabel?: string;\n /** Enable keyboard navigation (default: true) */\n keyboardNav?: boolean;\n}\n\nexport interface VeloPlotRef {\n getChart: () => Chart | null;\n resetZoom: () => void;\n getBounds: () => Bounds | null;\n}\n\nexport const VeloPlot = forwardRef<VeloPlotRef, VeloPlotProps>(\n function VeloPlot(\n {\n series = [],\n zoom: zoomProp,\n onZoomChange,\n cursor,\n width = \"100%\",\n height = 400,\n className = \"\",\n style = {},\n debug = false,\n ariaLabel,\n keyboardNav = true,\n ...chartOptions\n },\n ref,\n ) {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousSeriesRef = useRef<Map<string, VeloPlotSeries>>(new Map());\n const a11yRef = useRef<ReturnType<typeof applyChartA11y> | null>(null);\n\n const {\n chart,\n isReady,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n resetZoom,\n } = useVeloPlot(containerRef, chartOptions);\n\n useImperativeHandle(\n ref,\n () => ({\n getChart: () => chart,\n resetZoom,\n getBounds: () => bounds,\n }),\n [chart, resetZoom, bounds],\n );\n\n useEffect(() => {\n if (!isReady || !chart) return;\n previousSeriesRef.current = diffSeries(\n { addSeries, updateSeries, removeSeries, autoScale: () => chart.autoScale() },\n series,\n previousSeriesRef.current,\n );\n }, [series, isReady, chart, addSeries, updateSeries, removeSeries]);\n\n useEffect(() => {\n if (!isReady || !chart || !zoomProp) return;\n chart.zoom(zoomProp);\n }, [isReady, chart, zoomProp]);\n\n useEffect(() => {\n if (!isReady || !chart || !onZoomChange) return;\n const handler = (event: { x: [number, number]; y: [number, number] }) => {\n onZoomChange({\n xMin: event.x[0],\n xMax: event.x[1],\n yMin: event.y[0],\n yMax: event.y[1],\n });\n };\n chart.on(\"zoom\", handler);\n return () => chart.off(\"zoom\", handler);\n }, [isReady, chart, onZoomChange]);\n\n useEffect(() => {\n if (!isReady || !chart) return;\n if (cursor?.enabled) {\n chart.enableCursor(cursor);\n } else {\n chart.disableCursor();\n }\n }, [isReady, chart, cursor]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!isReady || !chart || !el) return;\n\n a11yRef.current = applyChartA11y(el, chart, {\n label: ariaLabel,\n series,\n bounds,\n enableKeyboard: keyboardNav,\n });\n\n return () => {\n a11yRef.current?.cleanup();\n a11yRef.current = null;\n };\n }, [isReady, chart, keyboardNav, ariaLabel, bounds, series]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el || !a11yRef.current) return;\n updateA11y(el, a11yRef.current.srTable, {\n label: ariaLabel,\n series,\n bounds,\n });\n }, [series, bounds, ariaLabel]);\n\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n position: \"relative\",\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n outline: \"none\",\n ...style,\n }),\n [width, height, style],\n );\n\n return (\n <div\n ref={containerRef}\n className={`velo-plot-container ${className}`}\n style={containerStyle}\n >\n {debug && bounds && (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"rgba(0,0,0,0.7)\",\n color: \"#0f0\",\n padding: \"4px 8px\",\n borderRadius: 4,\n fontSize: 11,\n fontFamily: \"monospace\",\n pointerEvents: \"none\",\n }}\n >\n <div>\n X: [{bounds.xMin.toFixed(3)}, {bounds.xMax.toFixed(3)}]\n </div>\n <div>\n Y: [{bounds.yMin.toExponential(2)}, {bounds.yMax.toExponential(2)}]\n </div>\n <div>Series: {series.length}</div>\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default VeloPlot;\n","/**\n * useStackedPlot - React hook for multi-pane stacked charts\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useCallback,\n type RefObject,\n} from \"react\";\nimport { createStackedChart } from \"../core/stacked\";\nimport type { StackedChart, StackedChartOptions } from \"../core/stacked\";\nimport type { Range } from \"../types\";\nimport {\n stackedStructureKey,\n syncStackedOptions,\n syncStackedPaneSeries,\n} from \"../bindings/shared\";\nimport type { VeloPlotSeries } from \"../bindings/shared\";\n\nexport interface UseStackedPlotOptions\n extends Omit<StackedChartOptions, \"container\"> {}\n\nexport interface UseStackedPlotReturn {\n containerRef: RefObject<HTMLDivElement>;\n stack: StackedChart | null;\n isReady: boolean;\n fitAll: (options?: { x?: Range; padding?: number }) => void;\n resetAll: () => void;\n}\n\nexport function useStackedPlot(\n options: UseStackedPlotOptions,\n): UseStackedPlotReturn {\n const containerRef = useRef<HTMLDivElement>(null);\n const stackRef = useRef<StackedChart | null>(null);\n const destroyRef = useRef<(() => void) | null>(null);\n const [stack, setStack] = useState<StackedChart | null>(null);\n const [isReady, setIsReady] = useState(false);\n\n const optionsRef = useRef(options);\n const structureKeyRef = useRef(stackedStructureKey(options.panes));\n const paneSeriesRef = useRef(new Map<string, Map<string, VeloPlotSeries>>());\n optionsRef.current = options;\n\n const mountStack = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n\n destroyRef.current?.();\n const created = createStackedChart({\n ...optionsRef.current,\n container: el,\n });\n stackRef.current = created;\n destroyRef.current = () => {\n created.destroy();\n stackRef.current = null;\n };\n setStack(created);\n structureKeyRef.current = stackedStructureKey(optionsRef.current.panes);\n paneSeriesRef.current = syncStackedPaneSeries(\n created,\n optionsRef.current.panes,\n new Map(),\n );\n\n created.whenReady().then(() => setIsReady(true));\n }, []);\n\n useEffect(() => {\n mountStack();\n return () => {\n setIsReady(false);\n destroyRef.current?.();\n destroyRef.current = null;\n setStack(null);\n };\n }, [mountStack]);\n\n useEffect(() => {\n const current = stackRef.current;\n if (!current || !isReady) return;\n\n const nextKey = stackedStructureKey(options.panes);\n if (nextKey !== structureKeyRef.current) {\n mountStack();\n return;\n }\n\n syncStackedOptions(current, options);\n paneSeriesRef.current = syncStackedPaneSeries(\n current,\n options.panes,\n paneSeriesRef.current,\n );\n });\n\n const fitAll = useCallback((opts?: { x?: Range; padding?: number }) => {\n stackRef.current?.fitAll(opts);\n }, []);\n\n const resetAll = useCallback(() => {\n stackRef.current?.resetAll();\n }, []);\n\n return { containerRef, stack, isReady, fitAll, resetAll };\n}\n","/**\n * StackedPlot - Declarative React component for multi-pane charts\n */\n\nimport {\n forwardRef,\n useImperativeHandle,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useStackedPlot, type UseStackedPlotOptions } from \"./useStackedPlot\";\nimport type { StackedChart } from \"../core/stacked\";\nimport type { Bounds } from \"../types\";\nimport type { AddIndicatorOptions } from \"../core/indicator/addIndicator\";\nimport type { IndicatorPresetName } from \"../core/indicator/indicatorPresets\";\n\nexport interface StackedPlotIndicator extends AddIndicatorOptions {\n type: IndicatorPresetName;\n}\n\nexport interface StackedPlotProps extends UseStackedPlotOptions {\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n indicators?: StackedPlotIndicator[];\n onCrosshairMove?: (event: { price?: number; x: number }) => void;\n drawingTools?: string[];\n ariaLabel?: string;\n}\n\nexport interface StackedPlotRef {\n getStack: () => StackedChart | null;\n fitAll: () => void;\n resetAll: () => void;\n getBounds: () => Bounds | null;\n}\n\nexport const StackedPlot = forwardRef<StackedPlotRef, StackedPlotProps>(\n function StackedPlot(\n {\n width = \"100%\",\n height = 480,\n className = \"\",\n style = {},\n indicators: _indicators,\n onCrosshairMove: _onCrosshairMove,\n drawingTools: _drawingTools,\n ariaLabel,\n panes,\n ...stackOptions\n },\n ref,\n ) {\n const { containerRef, stack, isReady, fitAll, resetAll } = useStackedPlot({\n panes,\n ...stackOptions,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n getStack: () => stack,\n fitAll: () => fitAll(),\n resetAll,\n getBounds: () => stack?.getMaster().getViewBounds() ?? null,\n }),\n [stack, fitAll, resetAll],\n );\n\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n position: \"relative\",\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n ...style,\n }),\n [width, height, style],\n );\n\n return (\n <div\n ref={containerRef as React.RefObject<HTMLDivElement>}\n className={`velo-plot-stacked ${className}`}\n style={containerStyle}\n role=\"img\"\n aria-label={ariaLabel ?? `Stacked chart with ${panes.length} panes`}\n data-ready={isReady ? \"true\" : \"false\"}\n />\n );\n },\n);\n\nexport default StackedPlot;\n","/**\n * useIndicator - React hook for trading indicators\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { Chart } from \"../core/chart/types\";\nimport type { AddIndicatorOptions, AddIndicatorResult } from \"../core/indicator/addIndicator\";\nimport type { IndicatorPresetName } from \"../core/indicator/indicatorPresets\";\nimport {\n addIndicatorToHost,\n isStackedChart,\n removeIndicatorFromChart,\n type IndicatorHost,\n} from \"../bindings/shared\";\n\nexport interface UseIndicatorReturn {\n result: (AddIndicatorResult & { paneId?: string }) | null;\n isLoading: boolean;\n error: Error | null;\n}\n\nexport function useIndicator(\n host: IndicatorHost,\n preset: IndicatorPresetName,\n options: AddIndicatorOptions = {},\n): UseIndicatorReturn {\n const [result, setResult] = useState<\n (AddIndicatorResult & { paneId?: string }) | null\n >(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const resultRef = useRef(result);\n resultRef.current = result;\n\n useEffect(() => {\n if (!host) return;\n\n let cancelled = false;\n setIsLoading(true);\n setError(null);\n\n addIndicatorToHost(host, preset, options)\n .then((res) => {\n if (!cancelled) {\n setResult(res);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n const res = resultRef.current;\n if (res && !isStackedChart(host)) {\n removeIndicatorFromChart(host as Chart, res.id);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [host, preset, JSON.stringify(options)]);\n\n return { result, isLoading, error };\n}\n","/**\n * useChartSync - React hook for synchronizing multiple charts\n */\n\nimport { useEffect, useState } from \"react\";\nimport type { ChartLike, SyncOptions } from \"../core/sync\";\nimport { ChartGroup } from \"../core/sync\";\nimport { createChartSync } from \"../bindings/shared\";\n\nexport interface UseChartSyncReturn {\n group: ChartGroup | null;\n}\n\nexport function useChartSync(\n charts: ChartLike[],\n options?: SyncOptions,\n): UseChartSyncReturn {\n const [group, setGroup] = useState<ChartGroup | null>(null);\n\n useEffect(() => {\n if (charts.length < 2) {\n setGroup(null);\n return;\n }\n\n const handle = createChartSync(charts, options);\n setGroup(handle.group);\n\n return () => {\n handle.destroy();\n setGroup(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [charts, JSON.stringify(options)]);\n\n return { group };\n}\n\n/** Alias matching roadmap naming (`useChartGroup` ≡ `useChartSync`). */\nexport const useChartGroup = useChartSync;\n","/**\n * React bindings for Velo Plot\n */\n\nexport {\n VeloPlot,\n type VeloPlotProps,\n type VeloPlotRef,\n type VeloPlotSeries,\n} from \"./VeloPlot\";\nexport {\n StackedPlot,\n type StackedPlotProps,\n type StackedPlotRef,\n type StackedPlotIndicator,\n} from \"./StackedPlot\";\nexport {\n useVeloPlot,\n type UseVeloPlotOptions,\n type UseVeloPlotReturn,\n} from \"./useVeloPlot\";\nexport {\n useStackedPlot,\n type UseStackedPlotOptions,\n type UseStackedPlotReturn,\n} from \"./useStackedPlot\";\nexport {\n useIndicator,\n type UseIndicatorReturn,\n} from \"./useIndicator\";\nexport {\n useChartSync,\n useChartGroup,\n type UseChartSyncReturn,\n} from \"./useChartSync\";\n\n// ---------------------------------------------------------------------------\n// Backward-compatible aliases (SciPlot / SciChart branding → VeloPlot)\n// Removed in v4.0.\n// ---------------------------------------------------------------------------\nimport { VeloPlot as VeloPlotImpl } from \"./VeloPlot\";\nimport { useVeloPlot as useVeloPlotImpl } from \"./useVeloPlot\";\n\n/**\n * @deprecated Use `VeloPlot` instead. **Removed in v4.0.**\n */\nexport const SciPlot = VeloPlotImpl;\n/**\n * @deprecated Use `VeloPlot` instead. **Removed in v4.0.**\n */\nexport const SciChart = VeloPlotImpl;\n/**\n * @deprecated Use `useVeloPlot` instead. **Removed in v4.0.**\n */\nexport const useSciPlot = useVeloPlotImpl;\n/**\n * @deprecated Use `useVeloPlot` instead. **Removed in v4.0.**\n */\nexport const useSciChart = useVeloPlotImpl;\n\nexport type {\n VeloPlotProps as SciPlotProps,\n VeloPlotRef as SciPlotRef,\n VeloPlotSeries as SciPlotSeries,\n VeloPlotProps as SciChartProps,\n VeloPlotRef as SciChartRef,\n VeloPlotSeries as SciChartSeries,\n} from \"./VeloPlot\";\nexport type {\n UseVeloPlotOptions as UseSciPlotOptions,\n UseVeloPlotReturn as UseSciPlotReturn,\n UseVeloPlotOptions as UseSciChartOptions,\n UseVeloPlotReturn as UseSciChartReturn,\n} from \"./useVeloPlot\";\n"],"names":["useVeloPlot","containerRef","options","chart","setChart","useState","isReady","setIsReady","error","setError","bounds","setBounds","chartRef","useRef","destroyRef","optionsRef","prevSyncOptionsRef","pickSyncableOptions","useEffect","container","handle","createChartLifecycle","err","_a","currentChart","next","prev","optionsChanged","syncChartOptions","addSeries","useCallback","seriesOptions","c","updateSeries","id","data","removeSeries","zoom","zoomOptions","resetZoom","VeloPlot","forwardRef","series","zoomProp","onZoomChange","cursor","width","height","className","style","debug","ariaLabel","keyboardNav","chartOptions","ref","previousSeriesRef","a11yRef","useImperativeHandle","diffSeries","handler","event","el","applyChartA11y","updateA11y","containerStyle","useMemo","jsx","jsxs","useStackedPlot","stackRef","stack","setStack","structureKeyRef","stackedStructureKey","paneSeriesRef","mountStack","created","createStackedChart","syncStackedPaneSeries","current","syncStackedOptions","fitAll","opts","resetAll","StackedPlot","_indicators","_onCrosshairMove","_drawingTools","panes","stackOptions","useIndicator","host","preset","result","setResult","isLoading","setIsLoading","resultRef","cancelled","addIndicatorToHost","res","isStackedChart","removeIndicatorFromChart","useChartSync","charts","group","setGroup","createChartSync","useChartGroup","SciPlot","VeloPlotImpl","SciChart","useSciPlot","useVeloPlotImpl","useSciChart"],"mappings":";;;;;;;AAwCO,SAASA,EACdC,GACAC,IAA8B,IACX;AACnB,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAuB,IAAI,GAC/C,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAOC,CAAQ,IAAIJ,EAAuB,IAAI,GAC/C,CAACK,GAAQC,CAAS,IAAIN,EAAwB,IAAI,GAElDO,IAAWC,EAAqB,IAAI,GACpCC,IAAaD,EAA4B,IAAI,GAC7CE,IAAaF,EAAOX,CAAO,GAC3Bc,IAAqBH,EAAOI,EAAoBf,CAAO,CAAC;AAC9D,EAAAa,EAAW,UAAUb,GAErBgB,EAAU,MAAM;AACd,UAAMC,IAAYlB,EAAa;AAC/B,QAAKkB,GAEL;AAAA,UAAI;AACF,cAAMC,IAASC;AAAA,UACbF;AAAA,UACAJ,EAAW;AAAA,UACX;AAAA,YACE,gBAAgBJ;AAAA,YAChB,SAASF;AAAA,UAAA;AAAA,QACX;AAEF,QAAAG,EAAS,UAAUQ,EAAO,OAC1BN,EAAW,UAAUM,EAAO,SAC5BhB,EAASgB,EAAO,KAAK,GACrBb,EAAW,EAAI,GACfI,EAAUS,EAAO,WAAW,GAC5BX,EAAS,IAAI,GACbO,EAAmB,UAAUC,EAAoBF,EAAW,OAAO;AAAA,MACrE,SAASO,GAAK;AACZ,gBAAQ,MAAM,6CAA6CA,CAAG,GAC9Db,EAASa,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,GAC5Df,EAAW,EAAK;AAAA,MAClB;AAEA,aAAO,MAAM;;AACX,SAAAgB,IAAAT,EAAW,YAAX,QAAAS,EAAA,KAAAT,IACAA,EAAW,UAAU,MACrBF,EAAS,UAAU,MACnBR,EAAS,IAAI,GACbG,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAAG,CAACN,CAAY,CAAC,GAEjBiB,EAAU,MAAM;AACd,UAAMM,IAAeZ,EAAS;AAC9B,QAAI,CAACY,KAAgB,CAAClB,EAAS;AAE/B,UAAMmB,IAAOR,EAAoBf,CAAO,GAClCwB,IAAOV,EAAmB;AAChC,IAAIW,EAAeD,GAAMD,CAAI,MAC3BG,EAAiBJ,GAAcE,GAAMD,CAAI,GACzCT,EAAmB,UAAUS;AAAA,EAEjC,CAAC;AAED,QAAMI,IAAYC,EAAY,CAACC,MAAiC;AAC9D,UAAMC,IAAIpB,EAAS;AACnB,IAAIoB,MACFA,EAAE,UAAUD,CAAa,GACzBpB,EAAUqB,EAAE,eAAe;AAAA,EAE/B,GAAG,CAAA,CAAE,GAECC,IAAeH,EAAY,CAACI,GAAYC,MAA2B;;AACvE,KAAAZ,IAAAX,EAAS,YAAT,QAAAW,EAAkB,aAAaW,GAAIC;AAAA,EACrC,GAAG,CAAA,CAAE,GAECC,IAAeN,EAAY,CAACI,MAAe;;AAC/C,KAAAX,IAAAX,EAAS,YAAT,QAAAW,EAAkB,aAAaW;AAAA,EACjC,GAAG,CAAA,CAAE,GAECG,IAAOP,EAAY,CAACQ,MAA6B;;AACrD,KAAAf,IAAAX,EAAS,YAAT,QAAAW,EAAkB,KAAKe;AAAA,EACzB,GAAG,CAAA,CAAE,GAECC,IAAYT,EAAY,MAAM;AAClC,UAAME,IAAIpB,EAAS;AACnB,IAAIoB,MACFA,EAAE,UAAA,GACFrB,EAAUqB,EAAE,eAAe;AAAA,EAE/B,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,OAAA7B;AAAA,IACA,SAAAG;AAAA,IACA,OAAAE;AAAA,IACA,QAAAE;AAAA,IACA,WAAAmB;AAAA,IACA,cAAAI;AAAA,IACA,cAAAG;AAAA,IACA,MAAAC;AAAA,IACA,WAAAE;AAAA,EAAA;AAEJ;AC/FO,MAAMC,IAAWC;AAAA,EACtB,SACE;AAAA,IACE,QAAAC,IAAS,CAAA;AAAA,IACT,MAAMC;AAAA,IACN,cAAAC;AAAA,IACA,QAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,QAAAC,IAAS;AAAA,IACT,WAAAC,IAAY;AAAA,IACZ,OAAAC,IAAQ,CAAA;AAAA,IACR,OAAAC,IAAQ;AAAA,IACR,WAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,GAAGC;AAAA,EAAA,GAELC,GACA;AACA,UAAMrD,IAAeY,EAAuB,IAAI,GAC1C0C,IAAoB1C,EAAoC,oBAAI,KAAK,GACjE2C,IAAU3C,EAAiD,IAAI,GAE/D;AAAA,MACJ,OAAAV;AAAA,MACA,SAAAG;AAAA,MACA,QAAAI;AAAA,MACA,WAAAmB;AAAA,MACA,cAAAI;AAAA,MACA,cAAAG;AAAA,MACA,WAAAG;AAAA,IAAA,IACEvC,EAAYC,GAAcoD,CAAY;AAE1C,IAAAI;AAAA,MACEH;AAAA,MACA,OAAO;AAAA,QACL,UAAU,MAAMnD;AAAA,QAChB,WAAAoC;AAAA,QACA,WAAW,MAAM7B;AAAA,MAAA;AAAA,MAEnB,CAACP,GAAOoC,GAAW7B,CAAM;AAAA,IAAA,GAG3BQ,EAAU,MAAM;AACd,MAAI,CAACZ,KAAW,CAACH,MACjBoD,EAAkB,UAAUG;AAAA,QAC1B,EAAE,WAAA7B,GAAW,cAAAI,GAAc,cAAAG,GAAc,WAAW,MAAMjC,EAAM,YAAU;AAAA,QAC1EuC;AAAA,QACAa,EAAkB;AAAA,MAAA;AAAA,IAEtB,GAAG,CAACb,GAAQpC,GAASH,GAAO0B,GAAWI,GAAcG,CAAY,CAAC,GAElElB,EAAU,MAAM;AACd,MAAI,CAACZ,KAAW,CAACH,KAAS,CAACwC,KAC3BxC,EAAM,KAAKwC,CAAQ;AAAA,IACrB,GAAG,CAACrC,GAASH,GAAOwC,CAAQ,CAAC,GAE7BzB,EAAU,MAAM;AACd,UAAI,CAACZ,KAAW,CAACH,KAAS,CAACyC,EAAc;AACzC,YAAMe,IAAU,CAACC,MAAwD;AACvE,QAAAhB,EAAa;AAAA,UACX,MAAMgB,EAAM,EAAE,CAAC;AAAA,UACf,MAAMA,EAAM,EAAE,CAAC;AAAA,UACf,MAAMA,EAAM,EAAE,CAAC;AAAA,UACf,MAAMA,EAAM,EAAE,CAAC;AAAA,QAAA,CAChB;AAAA,MACH;AACA,aAAAzD,EAAM,GAAG,QAAQwD,CAAO,GACjB,MAAMxD,EAAM,IAAI,QAAQwD,CAAO;AAAA,IACxC,GAAG,CAACrD,GAASH,GAAOyC,CAAY,CAAC,GAEjC1B,EAAU,MAAM;AACd,MAAI,CAACZ,KAAW,CAACH,MACb0C,KAAA,QAAAA,EAAQ,UACV1C,EAAM,aAAa0C,CAAM,IAEzB1C,EAAM,cAAA;AAAA,IAEV,GAAG,CAACG,GAASH,GAAO0C,CAAM,CAAC,GAE3B3B,EAAU,MAAM;AACd,YAAM2C,IAAK5D,EAAa;AACxB,UAAI,GAACK,KAAW,CAACH,KAAS,CAAC0D;AAE3B,eAAAL,EAAQ,UAAUM,EAAeD,GAAI1D,GAAO;AAAA,UAC1C,OAAOgD;AAAA,UACP,QAAAT;AAAA,UACA,QAAAhC;AAAA,UACA,gBAAgB0C;AAAA,QAAA,CACjB,GAEM,MAAM;;AACX,WAAA7B,IAAAiC,EAAQ,YAAR,QAAAjC,EAAiB,WACjBiC,EAAQ,UAAU;AAAA,QACpB;AAAA,IACF,GAAG,CAAClD,GAASH,GAAOiD,GAAaD,GAAWzC,GAAQgC,CAAM,CAAC,GAE3DxB,EAAU,MAAM;AACd,YAAM2C,IAAK5D,EAAa;AACxB,MAAI,CAAC4D,KAAM,CAACL,EAAQ,WACpBO,EAAWF,GAAIL,EAAQ,QAAQ,SAAS;AAAA,QACtC,OAAOL;AAAA,QACP,QAAAT;AAAA,QACA,QAAAhC;AAAA,MAAA,CACD;AAAA,IACH,GAAG,CAACgC,GAAQhC,GAAQyC,CAAS,CAAC;AAE9B,UAAMa,IAAiBC;AAAA,MACrB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,OAAOnB,KAAU,WAAW,GAAGA,CAAK,OAAOA;AAAA,QAClD,QAAQ,OAAOC,KAAW,WAAW,GAAGA,CAAM,OAAOA;AAAA,QACrD,SAAS;AAAA,QACT,GAAGE;AAAA,MAAA;AAAA,MAEL,CAACH,GAAOC,GAAQE,CAAK;AAAA,IAAA;AAGvB,WACE,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKjE;AAAA,QACL,WAAW,uBAAuB+C,CAAS;AAAA,QAC3C,OAAOgB;AAAA,QAEN,eAAStD,KACR,gBAAAyD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,SAAS;AAAA,cACT,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,eAAe;AAAA,YAAA;AAAA,YAGjB,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EAAI,UAAA;AAAA,gBAAA;AAAA,gBACEzD,EAAO,KAAK,QAAQ,CAAC;AAAA,gBAAE;AAAA,gBAAGA,EAAO,KAAK,QAAQ,CAAC;AAAA,gBAAE;AAAA,cAAA,GACxD;AAAA,gCACC,OAAA,EAAI,UAAA;AAAA,gBAAA;AAAA,gBACEA,EAAO,KAAK,cAAc,CAAC;AAAA,gBAAE;AAAA,gBAAGA,EAAO,KAAK,cAAc,CAAC;AAAA,gBAAE;AAAA,cAAA,GACpE;AAAA,gCACC,OAAA,EAAI,UAAA;AAAA,gBAAA;AAAA,gBAASgC,EAAO;AAAA,cAAA,EAAA,CAAO;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC9B;AAAA,IAAA;AAAA,EAIR;AACF;ACpKO,SAAS0B,EACdlE,GACsB;AACtB,QAAMD,IAAeY,EAAuB,IAAI,GAC1CwD,IAAWxD,EAA4B,IAAI,GAC3CC,IAAaD,EAA4B,IAAI,GAC7C,CAACyD,GAAOC,CAAQ,IAAIlE,EAA8B,IAAI,GACtD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GAEtCU,IAAaF,EAAOX,CAAO,GAC3BsE,IAAkB3D,EAAO4D,EAAoBvE,EAAQ,KAAK,CAAC,GAC3DwE,IAAgB7D,EAAO,oBAAI,KAA0C;AAC3E,EAAAE,EAAW,UAAUb;AAErB,QAAMyE,IAAa7C,EAAY,MAAM;;AACnC,UAAM+B,IAAK5D,EAAa;AACxB,QAAI,CAAC4D,EAAI;AAET,KAAAtC,IAAAT,EAAW,YAAX,QAAAS,EAAA,KAAAT;AACA,UAAM8D,IAAUC,EAAmB;AAAA,MACjC,GAAG9D,EAAW;AAAA,MACd,WAAW8C;AAAA,IAAA,CACZ;AACD,IAAAQ,EAAS,UAAUO,GACnB9D,EAAW,UAAU,MAAM;AACzB,MAAA8D,EAAQ,QAAA,GACRP,EAAS,UAAU;AAAA,IACrB,GACAE,EAASK,CAAO,GAChBJ,EAAgB,UAAUC,EAAoB1D,EAAW,QAAQ,KAAK,GACtE2D,EAAc,UAAUI;AAAA,MACtBF;AAAA,MACA7D,EAAW,QAAQ;AAAA,0BACf,IAAA;AAAA,IAAI,GAGV6D,EAAQ,YAAY,KAAK,MAAMrE,EAAW,EAAI,CAAC;AAAA,EACjD,GAAG,CAAA,CAAE;AAEL,EAAAW,EAAU,OACRyD,EAAA,GACO,MAAM;;AACX,IAAApE,EAAW,EAAK,IAChBgB,IAAAT,EAAW,YAAX,QAAAS,EAAA,KAAAT,IACAA,EAAW,UAAU,MACrByD,EAAS,IAAI;AAAA,EACf,IACC,CAACI,CAAU,CAAC,GAEfzD,EAAU,MAAM;AACd,UAAM6D,IAAUV,EAAS;AACzB,QAAI,CAACU,KAAW,CAACzE,EAAS;AAG1B,QADgBmE,EAAoBvE,EAAQ,KAAK,MACjCsE,EAAgB,SAAS;AACvC,MAAAG,EAAA;AACA;AAAA,IACF;AAEA,IAAAK,EAAmBD,GAAS7E,CAAO,GACnCwE,EAAc,UAAUI;AAAA,MACtBC;AAAA,MACA7E,EAAQ;AAAA,MACRwE,EAAc;AAAA,IAAA;AAAA,EAElB,CAAC;AAED,QAAMO,IAASnD,EAAY,CAACoD,MAA2C;;AACrE,KAAA3D,IAAA8C,EAAS,YAAT,QAAA9C,EAAkB,OAAO2D;AAAA,EAC3B,GAAG,CAAA,CAAE,GAECC,IAAWrD,EAAY,MAAM;;AACjC,KAAAP,IAAA8C,EAAS,YAAT,QAAA9C,EAAkB;AAAA,EACpB,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,cAAAtB,GAAc,OAAAqE,GAAO,SAAAhE,GAAS,QAAA2E,GAAQ,UAAAE,EAAA;AACjD;ACtEO,MAAMC,KAAc3C;AAAA,EACzB,SACE;AAAA,IACE,OAAAK,IAAQ;AAAA,IACR,QAAAC,IAAS;AAAA,IACT,WAAAC,IAAY;AAAA,IACZ,OAAAC,IAAQ,CAAA;AAAA,IACR,YAAYoC;AAAA,IACZ,iBAAiBC;AAAA,IACjB,cAAcC;AAAA,IACd,WAAApC;AAAA,IACA,OAAAqC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELnC,GACA;AACA,UAAM,EAAE,cAAArD,GAAc,OAAAqE,GAAO,SAAAhE,GAAS,QAAA2E,GAAQ,UAAAE,EAAA,IAAaf,EAAe;AAAA,MACxE,OAAAoB;AAAA,MACA,GAAGC;AAAA,IAAA,CACJ;AAED,IAAAhC;AAAA,MACEH;AAAA,MACA,OAAO;AAAA,QACL,UAAU,MAAMgB;AAAA,QAChB,QAAQ,MAAMW,EAAA;AAAA,QACd,UAAAE;AAAA,QACA,WAAW,OAAMb,KAAA,gBAAAA,EAAO,YAAY,oBAAmB;AAAA,MAAA;AAAA,MAEzD,CAACA,GAAOW,GAAQE,CAAQ;AAAA,IAAA;AAG1B,UAAMnB,IAAiBC;AAAA,MACrB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,OAAOnB,KAAU,WAAW,GAAGA,CAAK,OAAOA;AAAA,QAClD,QAAQ,OAAOC,KAAW,WAAW,GAAGA,CAAM,OAAOA;AAAA,QACrD,GAAGE;AAAA,MAAA;AAAA,MAEL,CAACH,GAAOC,GAAQE,CAAK;AAAA,IAAA;AAGvB,WACE,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKjE;AAAA,QACL,WAAW,qBAAqB+C,CAAS;AAAA,QACzC,OAAOgB;AAAA,QACP,MAAK;AAAA,QACL,cAAYb,KAAa,sBAAsBqC,EAAM,MAAM;AAAA,QAC3D,cAAYlF,IAAU,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAGrC;AACF;ACtEO,SAASoF,GACdC,GACAC,GACA1F,IAA+B,CAAA,GACX;AACpB,QAAM,CAAC2F,GAAQC,CAAS,IAAIzF,EAE1B,IAAI,GACA,CAAC0F,GAAWC,CAAY,IAAI3F,EAAS,EAAK,GAC1C,CAACG,GAAOC,CAAQ,IAAIJ,EAAuB,IAAI,GAC/C4F,IAAYpF,EAAOgF,CAAM;AAC/B,SAAAI,EAAU,UAAUJ,GAEpB3E,EAAU,MAAM;AACd,QAAI,CAACyE,EAAM;AAEX,QAAIO,IAAY;AAChB,WAAAF,EAAa,EAAI,GACjBvF,EAAS,IAAI,GAEb0F,EAAmBR,GAAMC,GAAQ1F,CAAO,EACrC,KAAK,CAACkG,MAAQ;AACb,MAAKF,MACHJ,EAAUM,CAAG,GACbJ,EAAa,EAAK;AAAA,IAEtB,CAAC,EACA,MAAM,CAAC1E,MAAQ;AACd,MAAK4E,MACHzF,EAASa,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,GAC5D0E,EAAa,EAAK;AAAA,IAEtB,CAAC,GAEI,MAAM;AACX,MAAAE,IAAY;AACZ,YAAME,IAAMH,EAAU;AACtB,MAAIG,KAAO,CAACC,EAAeV,CAAI,KAC7BW,EAAyBX,GAAeS,EAAI,EAAE;AAAA,IAElD;AAAA,EAEF,GAAG,CAACT,GAAMC,GAAQ,KAAK,UAAU1F,CAAO,CAAC,CAAC,GAEnC,EAAE,QAAA2F,GAAQ,WAAAE,GAAW,OAAAvF,EAAA;AAC9B;ACrDO,SAAS+F,GACdC,GACAtG,GACoB;AACpB,QAAM,CAACuG,GAAOC,CAAQ,IAAIrG,EAA4B,IAAI;AAE1D,SAAAa,EAAU,MAAM;AACd,QAAIsF,EAAO,SAAS,GAAG;AACrB,MAAAE,EAAS,IAAI;AACb;AAAA,IACF;AAEA,UAAMtF,IAASuF,EAAgBH,GAAQtG,CAAO;AAC9C,WAAAwG,EAAStF,EAAO,KAAK,GAEd,MAAM;AACX,MAAAA,EAAO,QAAA,GACPsF,EAAS,IAAI;AAAA,IACf;AAAA,EAEF,GAAG,CAACF,GAAQ,KAAK,UAAUtG,CAAO,CAAC,CAAC,GAE7B,EAAE,OAAAuG,EAAA;AACX;AAGO,MAAMG,KAAgBL,ICOhBM,KAAUC,GAIVC,KAAWD,GAIXE,KAAaC,GAIbC,KAAcD;"}
@@ -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;