velo-plot 1.12.0 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/{index.core-xiNcuFfJ.js → ChartCore-DQ691eXH.js} +1807 -1287
- package/dist/ChartCore-DQ691eXH.js.map +1 -0
- package/dist/assets/downsample.worker-C70QJ04y.js +2 -0
- package/dist/assets/downsample.worker-C70QJ04y.js.map +1 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js +2 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -0
- package/dist/core/OverlayRenderer.d.ts +2 -0
- package/dist/core/chart/ChartAlerts.d.ts +42 -0
- package/dist/core/chart/ChartCore.d.ts +20 -1
- package/dist/core/chart/ChartRenderLoop.d.ts +4 -2
- package/dist/core/chart/ChartRenderer.d.ts +3 -2
- package/dist/core/chart/candlestickMarkers.d.ts +23 -0
- package/dist/core/chart/exporter/SVGExporter.d.ts +7 -2
- package/dist/core/chart/heikinAshi.d.ts +10 -0
- package/dist/core/chart/series/types.d.ts +2 -2
- package/dist/core/chart/types.d.ts +9 -0
- package/dist/core/indicator/addIndicator.d.ts +36 -0
- package/dist/core/indicator/index.d.ts +2 -0
- package/dist/core/indicator/indicatorPresets.d.ts +37 -0
- package/dist/core/render/pixelSnap.d.ts +8 -0
- package/dist/core/series/Series.d.ts +3 -0
- package/dist/core/stacked/index.d.ts +3 -1
- package/dist/core/stacked/paneResize.d.ts +15 -18
- package/dist/core/stacked/stackExport.d.ts +18 -0
- package/dist/core/stacked/types.d.ts +42 -5
- package/dist/core/time/TimeScale.d.ts +31 -0
- package/dist/createStackedChart-BPooTQ9z.js +1164 -0
- package/dist/createStackedChart-BPooTQ9z.js.map +1 -0
- package/dist/gpu/adapter/gpuRenderer.d.ts +21 -0
- package/dist/gpu/backends/webgpu/WebGPUBackend.d.ts +2 -1
- package/dist/gpuRenderer-BpaMYz-k.js +1848 -0
- package/dist/gpuRenderer-BpaMYz-k.js.map +1 -0
- package/dist/index-CUGS98p4.js +277 -0
- package/dist/index-CUGS98p4.js.map +1 -0
- package/dist/index-D7dTq6VB.js +503 -0
- package/dist/index-D7dTq6VB.js.map +1 -0
- package/dist/{index-Ce2JgkH_.js → index-DoYxf1cV.js} +86 -43
- package/dist/{index-Ce2JgkH_.js.map → index-DoYxf1cV.js.map} +1 -1
- package/dist/index.core-BtGFYMOu.js +167 -0
- package/dist/index.core-BtGFYMOu.js.map +1 -0
- package/dist/index.d.ts +12 -4
- package/dist/indicators--eJGmVox.js +302 -0
- package/dist/indicators--eJGmVox.js.map +1 -0
- package/dist/math-Ddm2EZjj.js +85 -0
- package/dist/math-Ddm2EZjj.js.map +1 -0
- package/dist/plugins/analysis.js +543 -818
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/anomaly-detection.d.ts +1 -0
- package/dist/plugins/anomaly-detection.js +221 -0
- package/dist/plugins/anomaly-detection.js.map +1 -0
- package/dist/plugins/broken-axis.d.ts +3 -0
- package/dist/plugins/broken-axis.js +262 -0
- package/dist/plugins/broken-axis.js.map +1 -0
- package/dist/plugins/caching.d.ts +3 -0
- package/dist/plugins/caching.js +187 -0
- package/dist/plugins/caching.js.map +1 -0
- package/dist/plugins/data-transform.d.ts +3 -0
- package/dist/plugins/data-transform.js +146 -0
- package/dist/plugins/data-transform.js.map +1 -0
- package/dist/plugins/debug.js +12 -11
- package/dist/plugins/debug.js.map +1 -1
- package/dist/plugins/drawing-tools/index.d.ts +16 -0
- package/dist/plugins/forecasting.d.ts +1 -0
- package/dist/plugins/forecasting.js +236 -0
- package/dist/plugins/forecasting.js.map +1 -0
- package/dist/plugins/gpu.js +202 -1895
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/keyboard/index.d.ts +1 -7
- package/dist/plugins/keyboard.js +1 -1
- package/dist/plugins/latex.d.ts +1 -0
- package/dist/plugins/latex.js +454 -0
- package/dist/plugins/latex.js.map +1 -0
- package/dist/plugins/lazy-load/types.d.ts +7 -0
- package/dist/plugins/lazy-load.d.ts +3 -0
- package/dist/plugins/lazy-load.js +212 -0
- package/dist/plugins/lazy-load.js.map +1 -0
- package/dist/plugins/ml-integration.d.ts +3 -0
- package/dist/plugins/ml-integration.js +355 -0
- package/dist/plugins/ml-integration.js.map +1 -0
- package/dist/plugins/offscreen.d.ts +3 -0
- package/dist/plugins/offscreen.js +169 -0
- package/dist/plugins/offscreen.js.map +1 -0
- package/dist/plugins/pattern-recognition.d.ts +3 -0
- package/dist/plugins/pattern-recognition.js +690 -0
- package/dist/plugins/pattern-recognition.js.map +1 -0
- package/dist/plugins/radar.d.ts +3 -0
- package/dist/plugins/radar.js +103 -0
- package/dist/plugins/radar.js.map +1 -0
- package/dist/plugins/regression.d.ts +3 -0
- package/dist/plugins/regression.js +634 -0
- package/dist/plugins/regression.js.map +1 -0
- package/dist/plugins/replay/index.d.ts +19 -0
- package/dist/plugins/roi.d.ts +1 -0
- package/dist/plugins/roi.js +223 -0
- package/dist/plugins/roi.js.map +1 -0
- package/dist/plugins/snapshot/types.d.ts +1 -1
- package/dist/plugins/snapshot.d.ts +3 -0
- package/dist/plugins/snapshot.js +90 -0
- package/dist/plugins/snapshot.js.map +1 -0
- package/dist/plugins/sync/index.d.ts +2 -1
- package/dist/plugins/sync.js +13 -269
- package/dist/plugins/sync.js.map +1 -1
- package/dist/plugins/video-recorder.d.ts +3 -0
- package/dist/plugins/video-recorder.js +104 -0
- package/dist/plugins/video-recorder.js.map +1 -0
- package/dist/plugins/virtualization/types.d.ts +12 -0
- package/dist/plugins/virtualization.d.ts +3 -0
- package/dist/plugins/virtualization.js +6 -0
- package/dist/plugins/virtualization.js.map +1 -0
- package/dist/pool-15HMCNv8.js +88 -0
- package/dist/pool-15HMCNv8.js.map +1 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +31 -0
- package/dist/react.js.map +1 -0
- package/dist/renderer/CandlestickRenderer.d.ts +1 -1
- package/dist/renderer/ChartSeriesRenderer.d.ts +6 -0
- package/dist/renderer/GpuChartRenderer.d.ts +23 -0
- package/dist/renderer/index.d.ts +3 -0
- package/dist/renderer/spike/WebGLGridSpike.d.ts +40 -0
- package/dist/testing/baselines/v1.15.0.json.d.ts +51 -0
- package/dist/testing/gridSpikeBenchmark.d.ts +49 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/rendererBenchmark.d.ts +13 -0
- package/dist/testing/stage1BrowserBench.d.ts +42 -0
- package/dist/types.d.ts +21 -1
- package/dist/utils-BK5UUXxj.js +172 -0
- package/dist/utils-BK5UUXxj.js.map +1 -0
- package/dist/velo-plot.full.js +1382 -5932
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +26 -25
- package/dist/velo-plot.js.map +1 -1
- package/dist/workers/downsample.d.ts +38 -0
- package/dist/workers/downsampleAsync.d.ts +6 -0
- package/dist/workers/indicator.worker.d.ts +32 -0
- package/dist/workers/indicatorsAsync.d.ts +26 -0
- package/dist/workers/pool.d.ts +36 -0
- package/package.json +19 -2
- package/dist/core/OverlayRenderer.test.d.ts +0 -1
- package/dist/core/chart/ChartScaling.test.d.ts +0 -1
- package/dist/core/chart/NavigationUtils.test.d.ts +0 -1
- package/dist/core/format/axisFormat.test.d.ts +0 -1
- package/dist/core/indicator/buildIndicatorSeries.test.d.ts +0 -1
- package/dist/core/series/SeriesBounds.test.d.ts +0 -1
- package/dist/core/stacked/createStackedChart.test.d.ts +0 -1
- package/dist/core/stacked/paneAxis.test.d.ts +0 -1
- package/dist/core/stacked/paneResize.test.d.ts +0 -1
- package/dist/core/sync/index.test.d.ts +0 -1
- package/dist/index.core-xiNcuFfJ.js.map +0 -1
- package/dist/plugins/tools/tooltip/format.test.d.ts +0 -1
- package/dist/utils-Dbro9-qM.js +0 -254
- package/dist/utils-Dbro9-qM.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"velo-plot.full.js","sources":["../src/renderer/WebGPURenderer.ts","../src/plugins/builtins/crosshair/CrosshairPlugin.ts","../src/plugins/builtins/stats/StatsPlugin.ts","../src/plugins/builtins/watermark/WatermarkPlugin.ts","../src/plugins/builtins/grid-highlight/GridHighlightPlugin.ts","../src/plugins/builtins/data-logger/DataLoggerPlugin.ts","../src/plugins/builtins/direction-indicator/DirectionIndicatorPlugin.ts","../src/plugins/builtins/index.ts","../src/plugins/anomaly-detection/algorithms.ts","../src/plugins/anomaly-detection/index.ts","../src/plugins/ml-integration/native-algorithms.ts","../src/plugins/ml-integration/index.ts","../src/plugins/pattern-recognition/patterns.ts","../src/plugins/pattern-recognition/index.ts","../src/plugins/regression/algorithms.ts","../src/plugins/regression/index.ts","../src/plugins/radar/index.ts","../src/plugins/snapshot/index.ts","../src/plugins/data-transform/index.ts","../src/plugins/latex/symbols.ts","../src/plugins/latex/parser.ts","../src/plugins/latex/renderer.ts","../src/plugins/latex/index.ts","../src/plugins/forecasting/algorithms.ts","../src/plugins/forecasting/index.ts","../src/plugins/drag-edit/index.ts","../src/plugins/caching/index.ts","../src/plugins/lazy-load/index.ts","../src/plugins/broken-axis/BrokenAxisScale.ts","../src/plugins/broken-axis/index.ts","../src/plugins/video-recorder/index.ts","../src/plugins/offscreen/pool.ts","../src/plugins/offscreen/index.ts","../src/workers/downsample.ts","../src/plugins/virtualization/index.ts","../src/plugins/roi/index.ts","../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js","../src/react/useSciPlot.ts","../src/react/SciPlot.tsx","../src/core/stacked/types.ts","../src/core/stacked/paneResize.ts","../src/core/stacked/paneAxis.ts","../src/core/stacked/createStackedChart.ts","../src/testing/index.ts","../src/core/indicator/buildIndicatorPane.ts"],"sourcesContent":["export interface WebGPURendererOptions {\n powerPreference?: \"low-power\" | \"high-performance\";\n preferredFormat?: string;\n antialias?: boolean;\n}\n\nexport class WebGPURenderer {\n public readonly available: boolean;\n\n private canvas: HTMLCanvasElement;\n private adapter: any;\n private device: any;\n private context: any;\n\n constructor(canvas: HTMLCanvasElement, opts: WebGPURendererOptions = {}) {\n this.canvas = canvas;\n this.available = WebGPURenderer.isSupported();\n void opts;\n }\n\n static isSupported(): boolean {\n return (\n typeof (globalThis as any).navigator !== \"undefined\" &&\n typeof (globalThis as any).navigator.gpu !== \"undefined\"\n );\n }\n\n async init(opts: WebGPURendererOptions = {}): Promise<void> {\n if (!this.available) {\n throw new Error(\"[SciPlot] WebGPU is not supported in this environment\");\n }\n\n const gpu = (globalThis as any).navigator.gpu;\n this.adapter = await gpu.requestAdapter({\n powerPreference: opts.powerPreference ?? \"high-performance\",\n });\n\n if (!this.adapter) {\n throw new Error(\"[SciPlot] Failed to request WebGPU adapter\");\n }\n\n this.device = await this.adapter.requestDevice();\n\n const ctx = (this.canvas as any).getContext(\"webgpu\");\n if (!ctx) {\n throw new Error(\"[SciPlot] Failed to get WebGPU context\");\n }\n\n this.context = ctx;\n\n const format =\n opts.preferredFormat ??\n (gpu.getPreferredCanvasFormat\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n this.context.configure({\n device: this.device,\n format,\n alphaMode: \"premultiplied\",\n });\n }\n\n destroy(): void {\n this.device = undefined;\n this.adapter = undefined;\n this.context = undefined;\n }\n}\n","import type {\n PluginContext,\n PluginManifest,\n InteractionEvent,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\nimport type {\n CrosshairValueMode,\n CornerPosition\n} from \"../../../core/layout\";\n\nexport interface CrosshairPluginConfig {\n /** Show vertical line (default: true) */\n showVertical?: boolean;\n /** Show horizontal line (default: true) */\n showHorizontal?: boolean;\n /** Line color (default: from theme) */\n color?: string;\n /** Line style (default: 'dashed') */\n lineStyle?: \"solid\" | \"dashed\" | \"dotted\";\n /** Line width (default: 1) */\n lineWidth?: number;\n /** \n * @deprecated Use valueDisplayMode instead\n * Show axis labels (will be converted to valueDisplayMode)\n */\n showAxisLabels?: boolean;\n /**\n * Display mode for X,Y coordinate values (default: 'disabled')\n * - 'disabled': Never show coordinate values\n * - 'corner': Show values in a fixed corner position\n * - 'floating': Show values next to the cursor (axis labels)\n */\n valueDisplayMode?: CrosshairValueMode;\n /**\n * Corner position when valueDisplayMode is 'corner' (default: 'top-left')\n */\n cornerPosition?: CornerPosition;\n /** Snap to nearest data point (default: false) */\n snapToData?: boolean;\n /** Value format options */\n valueFormat?: {\n /** X value precision (default: 4) */\n xPrecision?: number;\n /** Y value precision (default: 4) */\n yPrecision?: number;\n };\n}\n\nconst crosshairManifest: PluginManifest = {\n name: \"crosshair\",\n version: \"1.0.0\",\n description: \"Interactive crosshair that follows mouse cursor\",\n provides: [\"interaction\", \"visualization\"],\n tags: [\"cursor\", \"crosshair\", \"tooltip\"],\n};\n\nexport const CrosshairPlugin = definePlugin<CrosshairPluginConfig>(\n crosshairManifest,\n (config = {}) => {\n const {\n showVertical = true,\n showHorizontal = true,\n color,\n lineStyle = \"dashed\",\n lineWidth = 1,\n snapToData = false,\n valueFormat = { xPrecision: 4, yPrecision: 4 },\n } = config;\n\n // Handle deprecated showAxisLabels -> convert to valueDisplayMode\n let valueDisplayMode: CrosshairValueMode = config.valueDisplayMode ?? 'disabled';\n if (config.showAxisLabels !== undefined && config.valueDisplayMode === undefined) {\n valueDisplayMode = config.showAxisLabels ? 'floating' : 'disabled';\n }\n const cornerPosition: CornerPosition = config.cornerPosition ?? 'top-left';\n\n let cursorX = -1;\n let cursorY = -1;\n let overlayId: string;\n let canvas: HTMLCanvasElement | null = null;\n let ctx: CanvasRenderingContext2D | null = null;\n\n return {\n onInit(pluginCtx: PluginContext) {\n overlayId = \"crosshair-overlay\";\n const overlay = pluginCtx.ui.createOverlay(overlayId, {\n zIndex: 500,\n position: { top: \"0\", left: \"0\", right: \"0\", bottom: \"0\" },\n });\n\n canvas = document.createElement(\"canvas\");\n canvas.style.cssText = \"width: 100%; height: 100%;\";\n overlay.appendChild(canvas);\n\n ctx = canvas.getContext(\"2d\");\n resizeCanvas(pluginCtx);\n },\n\n onDestroy(pluginCtx: PluginContext) {\n pluginCtx.ui.removeOverlay(overlayId);\n canvas = null;\n ctx = null;\n },\n\n onResize(pluginCtx: PluginContext) {\n resizeCanvas(pluginCtx);\n },\n\n onInteraction(pluginCtx: PluginContext, event: InteractionEvent) {\n if (event.type === \"mousemove\") {\n cursorX = event.pixelX;\n cursorY = event.pixelY;\n\n if (snapToData && event.inPlotArea) {\n const nearest = pluginCtx.coords.pickPoint(cursorX, cursorY);\n if (nearest) {\n cursorX = nearest.pixelX;\n cursorY = nearest.pixelY;\n }\n }\n\n render(pluginCtx);\n }\n },\n\n onViewChange() {\n // Re-render on zoom/pan\n if (cursorX >= 0 && cursorY >= 0) {\n // Will be re-rendered on next frame\n }\n },\n };\n\n function resizeCanvas(pluginCtx: PluginContext) {\n if (!canvas || !ctx) return;\n const size = pluginCtx.render.canvasSize;\n const dpr = pluginCtx.render.pixelRatio;\n canvas.width = size.width * dpr;\n canvas.height = size.height * dpr;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.scale(dpr, dpr);\n }\n\n function render(pluginCtx: PluginContext) {\n if (!ctx || !canvas) return;\n\n const { width, height } = pluginCtx.render.canvasSize;\n ctx.clearRect(0, 0, width, height);\n\n if (cursorX < 0 || cursorY < 0) return;\n\n const plotArea = pluginCtx.render.plotArea;\n if (\n cursorX < plotArea.x ||\n cursorX > plotArea.x + plotArea.width ||\n cursorY < plotArea.y ||\n cursorY > plotArea.y + plotArea.height\n ) {\n return;\n }\n\n const lineColor = color || (pluginCtx.ui.theme.cursor as unknown as Record<string, unknown>)?.color as string || \"#888888\";\n\n ctx.save();\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n\n if (lineStyle === \"dashed\") {\n ctx.setLineDash([6, 4]);\n } else if (lineStyle === \"dotted\") {\n ctx.setLineDash([2, 2]);\n }\n\n // Vertical line\n if (showVertical) {\n ctx.beginPath();\n ctx.moveTo(cursorX, plotArea.y);\n ctx.lineTo(cursorX, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n\n // Horizontal line\n if (showHorizontal) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, cursorY);\n ctx.lineTo(plotArea.x + plotArea.width, cursorY);\n ctx.stroke();\n }\n\n ctx.restore();\n\n // Value display based on mode\n if (valueDisplayMode === 'floating') {\n drawFloatingLabels(pluginCtx, ctx, cursorX, cursorY, lineColor);\n } else if (valueDisplayMode === 'corner') {\n drawCornerLabels(pluginCtx, ctx, cursorX, cursorY, lineColor);\n }\n // 'disabled' mode: don't draw any labels\n }\n\n function drawFloatingLabels(\n pluginCtx: PluginContext,\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n bgColor: string\n ) {\n const dataX = pluginCtx.coords.pixelToDataX(x);\n const dataY = pluginCtx.coords.pixelToDataY(y);\n const plotArea = pluginCtx.render.plotArea;\n\n ctx.save();\n ctx.font = \"11px system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n\n // X axis label\n const xText = dataX.toPrecision(valueFormat.xPrecision);\n const xMetrics = ctx.measureText(xText);\n const xLabelWidth = xMetrics.width + 8;\n const xLabelHeight = 18;\n const xLabelX = x - xLabelWidth / 2;\n const xLabelY = plotArea.y + plotArea.height + 2;\n\n ctx.fillStyle = bgColor;\n ctx.fillRect(xLabelX, xLabelY, xLabelWidth, xLabelHeight);\n ctx.fillStyle = \"#ffffff\";\n ctx.fillText(xText, x, xLabelY + 3);\n\n // Y axis label\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n const yText = dataY.toPrecision(valueFormat.yPrecision);\n const yMetrics = ctx.measureText(yText);\n const yLabelWidth = yMetrics.width + 8;\n const yLabelHeight = 18;\n const yLabelX = plotArea.x - yLabelWidth - 2;\n const yLabelY = y - yLabelHeight / 2;\n\n ctx.fillStyle = bgColor;\n ctx.fillRect(yLabelX, yLabelY, yLabelWidth, yLabelHeight);\n ctx.fillStyle = \"#ffffff\";\n ctx.fillText(yText, plotArea.x - 6, y);\n\n ctx.restore();\n }\n\n function drawCornerLabels(\n pluginCtx: PluginContext,\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n bgColor: string\n ) {\n const dataX = pluginCtx.coords.pixelToDataX(x);\n const dataY = pluginCtx.coords.pixelToDataY(y);\n const plotArea = pluginCtx.render.plotArea;\n\n ctx.save();\n ctx.font = \"11px system-ui, sans-serif\";\n\n const xText = `X: ${dataX.toPrecision(valueFormat.xPrecision)}`;\n const yText = `Y: ${dataY.toPrecision(valueFormat.yPrecision)}`;\n\n const xMetrics = ctx.measureText(xText);\n const yMetrics = ctx.measureText(yText);\n const maxWidth = Math.max(xMetrics.width, yMetrics.width);\n const padding = 6;\n const lineHeight = 16;\n const boxWidth = maxWidth + padding * 2;\n const boxHeight = lineHeight * 2 + padding * 2;\n\n // Determine corner position\n let boxX: number;\n let boxY: number;\n\n switch (cornerPosition) {\n case 'top-left':\n boxX = plotArea.x + 8;\n boxY = plotArea.y + 8;\n break;\n case 'top-right':\n boxX = plotArea.x + plotArea.width - boxWidth - 8;\n boxY = plotArea.y + 8;\n break;\n case 'bottom-left':\n boxX = plotArea.x + 8;\n boxY = plotArea.y + plotArea.height - boxHeight - 8;\n break;\n case 'bottom-right':\n boxX = plotArea.x + plotArea.width - boxWidth - 8;\n boxY = plotArea.y + plotArea.height - boxHeight - 8;\n break;\n default:\n boxX = plotArea.x + 8;\n boxY = plotArea.y + 8;\n }\n\n // Draw background\n ctx.fillStyle = bgColor;\n ctx.globalAlpha = 0.85;\n ctx.fillRect(boxX, boxY, boxWidth, boxHeight);\n ctx.globalAlpha = 1.0;\n\n // Draw border\n ctx.strokeStyle = \"rgba(255,255,255,0.3)\";\n ctx.lineWidth = 1;\n ctx.strokeRect(boxX, boxY, boxWidth, boxHeight);\n\n // Draw text\n ctx.fillStyle = \"#ffffff\";\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillText(xText, boxX + padding, boxY + padding);\n ctx.fillText(yText, boxX + padding, boxY + padding + lineHeight);\n\n ctx.restore();\n }\n }\n);\n\n","import type {\n PluginContext,\n PluginManifest,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface StatsPluginConfig {\n /** Position of the stats overlay */\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Which stats to show */\n show?: Array<\"count\" | \"mean\" | \"min\" | \"max\" | \"std\" | \"range\">;\n /** Series ID to compute stats for (default: all) */\n seriesId?: string;\n /** Update on every data change (default: true) */\n autoUpdate?: boolean;\n}\n\nconst statsManifest: PluginManifest = {\n name: \"statistics-overlay\",\n version: \"1.0.0\",\n description: \"Displays real-time statistics for chart data\",\n provides: [\"visualization\", \"analysis\"],\n tags: [\"statistics\", \"overlay\", \"analytics\"],\n};\n\nexport const StatsPlugin = definePlugin<StatsPluginConfig>(\n statsManifest,\n (config = {}) => {\n const {\n position = \"top-right\",\n show = [\"count\", \"mean\", \"min\", \"max\"],\n seriesId,\n autoUpdate = true,\n } = config;\n\n let overlayId: string;\n let container: HTMLDivElement | null = null;\n\n return {\n onInit(ctx: PluginContext) {\n overlayId = \"stats-overlay\";\n const posStyle: Record<string, string> = {};\n\n if (position.includes(\"top\")) posStyle.top = \"10px\";\n if (position.includes(\"bottom\")) posStyle.bottom = \"10px\";\n if (position.includes(\"left\")) posStyle.left = \"10px\";\n if (position.includes(\"right\")) posStyle.right = \"10px\";\n\n container = ctx.ui.createOverlay(overlayId, {\n zIndex: 800,\n position: posStyle,\n pointerEvents: false,\n });\n\n container.innerHTML = `\n <div style=\"\n background: rgba(0, 0, 0, 0.85);\n color: #fff;\n padding: 10px 14px;\n border-radius: 6px;\n font-family: ui-monospace, monospace;\n font-size: 12px;\n line-height: 1.6;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n \">\n <div style=\"font-weight: bold; margin-bottom: 4px; color: #4ade80;\">📊 Statistics</div>\n <div class=\"stats-content\"></div>\n </div>\n `;\n\n updateStats(ctx);\n },\n\n onDestroy(ctx: PluginContext) {\n ctx.ui.removeOverlay(overlayId);\n container = null;\n },\n\n onDataUpdate(ctx: PluginContext) {\n if (autoUpdate) {\n updateStats(ctx);\n }\n },\n\n onSeriesAdd(ctx: PluginContext) {\n updateStats(ctx);\n },\n\n onSeriesRemove(ctx: PluginContext) {\n updateStats(ctx);\n },\n\n api: {\n refresh(ctx: PluginContext) {\n updateStats(ctx);\n },\n },\n };\n\n function updateStats(ctx: PluginContext) {\n if (!container) return;\n\n const content = container.querySelector(\".stats-content\");\n if (!content) return;\n\n const allSeries = ctx.data.getAllSeries();\n const targetSeries = seriesId\n ? allSeries.filter((s) => s.getId() === seriesId)\n : allSeries;\n\n if (targetSeries.length === 0) {\n content.innerHTML = \"<div style='color: #888'>No data</div>\";\n return;\n }\n\n // Aggregate all Y data\n let allY: number[] = [];\n targetSeries.forEach((series) => {\n const data = series.getData();\n if (data?.y) {\n allY = allY.concat(Array.from(data.y));\n }\n });\n\n if (allY.length === 0) {\n content.innerHTML = \"<div style='color: #888'>No data</div>\";\n return;\n }\n\n const stats = computeStats(allY);\n const lines: string[] = [];\n\n if (show.includes(\"count\")) {\n lines.push(`<div>N: <span style=\"color: #60a5fa\">${stats.count.toLocaleString()}</span></div>`);\n }\n if (show.includes(\"mean\")) {\n lines.push(`<div>μ: <span style=\"color: #60a5fa\">${stats.mean.toPrecision(4)}</span></div>`);\n }\n if (show.includes(\"min\")) {\n lines.push(`<div>Min: <span style=\"color: #60a5fa\">${stats.min.toPrecision(4)}</span></div>`);\n }\n if (show.includes(\"max\")) {\n lines.push(`<div>Max: <span style=\"color: #60a5fa\">${stats.max.toPrecision(4)}</span></div>`);\n }\n if (show.includes(\"std\")) {\n lines.push(`<div>σ: <span style=\"color: #60a5fa\">${stats.std.toPrecision(4)}</span></div>`);\n }\n if (show.includes(\"range\")) {\n lines.push(`<div>Range: <span style=\"color: #60a5fa\">${stats.range.toPrecision(4)}</span></div>`);\n }\n\n content.innerHTML = lines.join(\"\");\n }\n\n function computeStats(values: number[]) {\n const n = values.length;\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n\n for (const v of values) {\n sum += v;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n\n const mean = sum / n;\n\n let sumSq = 0;\n for (const v of values) {\n sumSq += (v - mean) ** 2;\n }\n const std = Math.sqrt(sumSq / n);\n\n return {\n count: n,\n mean,\n min,\n max,\n std,\n range: max - min,\n };\n }\n }\n);\n","import type {\n PluginContext,\n PluginManifest,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface WatermarkPluginConfig {\n /** Watermark text */\n text: string;\n /** Font size (default: 48) */\n fontSize?: number;\n /** Font family (default: system-ui) */\n fontFamily?: string;\n /** Text color with opacity (default: rgba(128,128,128,0.15)) */\n color?: string;\n /** Position (default: center) */\n position?: \"center\" | \"bottom-right\" | \"bottom-left\";\n /** Rotation in degrees (default: -30 for center, 0 for corners) */\n rotation?: number;\n}\n\nconst watermarkManifest: PluginManifest = {\n name: \"watermark\",\n version: \"1.0.0\",\n description: \"Adds a customizable watermark to the chart\",\n provides: [\"visualization\"],\n tags: [\"watermark\", \"branding\", \"overlay\"],\n};\n\nexport const WatermarkPlugin = definePlugin<WatermarkPluginConfig>(\n watermarkManifest,\n (config) => {\n if (!config?.text) {\n throw new Error(\"WatermarkPlugin requires 'text' configuration\");\n }\n\n const {\n text,\n fontSize = 48,\n fontFamily = \"system-ui, sans-serif\",\n color = \"rgba(128, 128, 128, 0.15)\",\n position = \"center\",\n rotation = position === \"center\" ? -30 : 0,\n } = config;\n\n return {\n onRenderOverlay(ctx: PluginContext) {\n const ctx2d = ctx.render.ctx2d;\n if (!ctx2d) return;\n\n // width/height available for future use\n void ctx.render.canvasSize;\n const plotArea = ctx.render.plotArea;\n\n ctx2d.save();\n ctx2d.font = `${fontSize}px ${fontFamily}`;\n ctx2d.fillStyle = color;\n ctx2d.textAlign = \"center\";\n ctx2d.textBaseline = \"middle\";\n\n let x: number, y: number;\n\n if (position === \"center\") {\n x = plotArea.x + plotArea.width / 2;\n y = plotArea.y + plotArea.height / 2;\n } else if (position === \"bottom-right\") {\n x = plotArea.x + plotArea.width - fontSize;\n y = plotArea.y + plotArea.height - fontSize / 2;\n } else {\n x = plotArea.x + fontSize;\n y = plotArea.y + plotArea.height - fontSize / 2;\n }\n\n ctx2d.translate(x, y);\n ctx2d.rotate((rotation * Math.PI) / 180);\n ctx2d.fillText(text, 0, 0);\n ctx2d.restore();\n },\n };\n }\n);\n","import type {\n PluginContext,\n PluginManifest,\n AfterRenderEvent,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface GridHighlightConfig {\n /** Highlight intervals on X axis */\n xIntervals?: Array<{ start: number; end: number; color: string }>;\n /** Highlight intervals on Y axis */\n yIntervals?: Array<{ start: number; end: number; color: string }>;\n /** Opacity for highlight regions (default: 0.1) */\n opacity?: number;\n}\n\nconst gridHighlightManifest: PluginManifest = {\n name: \"grid-highlight\",\n version: \"1.0.0\",\n description: \"Highlights specific regions of the chart grid\",\n provides: [\"visualization\"],\n tags: [\"grid\", \"highlight\", \"regions\"],\n};\n\nexport const GridHighlightPlugin = definePlugin<GridHighlightConfig>(\n gridHighlightManifest,\n (config = {}) => {\n const { xIntervals = [], yIntervals = [], opacity = 0.1 } = config;\n\n return {\n onRenderOverlay(ctx: PluginContext, _event: AfterRenderEvent) {\n const ctx2d = ctx.render.ctx2d;\n if (!ctx2d) return;\n\n const plotArea = ctx.render.plotArea;\n // bounds available if needed for future features\n void ctx.data.getViewBounds();\n\n ctx2d.save();\n\n // Clip to plot area\n ctx2d.beginPath();\n ctx2d.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx2d.clip();\n\n ctx2d.globalAlpha = opacity;\n\n // Draw X intervals (vertical bands)\n for (const interval of xIntervals) {\n const x1 = ctx.coords.dataToPixelX(interval.start);\n const x2 = ctx.coords.dataToPixelX(interval.end);\n\n ctx2d.fillStyle = interval.color;\n ctx2d.fillRect(\n Math.min(x1, x2),\n plotArea.y,\n Math.abs(x2 - x1),\n plotArea.height\n );\n }\n\n // Draw Y intervals (horizontal bands)\n for (const interval of yIntervals) {\n const y1 = ctx.coords.dataToPixelY(interval.start);\n const y2 = ctx.coords.dataToPixelY(interval.end);\n\n ctx2d.fillStyle = interval.color;\n ctx2d.fillRect(\n plotArea.x,\n Math.min(y1, y2),\n plotArea.width,\n Math.abs(y2 - y1)\n );\n }\n\n ctx2d.restore();\n },\n };\n }\n);\n","import type {\n PluginContext,\n PluginManifest,\n DataUpdateEvent,\n ViewChangeEvent,\n InteractionEvent,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface DataLoggerConfig {\n /** Log data updates (default: true) */\n logDataUpdates?: boolean;\n /** Log view changes (default: true) */\n logViewChanges?: boolean;\n /** Log interactions (default: false) */\n logInteractions?: boolean;\n /** Maximum log entries to keep (default: 100) */\n maxEntries?: number;\n}\n\nconst dataLoggerManifest: PluginManifest = {\n name: \"data-logger\",\n version: \"1.0.0\",\n description: \"Logs chart events for debugging and analysis\",\n provides: [\"analysis\"],\n tags: [\"debug\", \"logging\", \"events\"],\n};\n\nexport const DataLoggerPlugin = definePlugin<DataLoggerConfig>(\n dataLoggerManifest,\n (config = {}) => {\n const {\n logDataUpdates = true,\n logViewChanges = true,\n logInteractions = false,\n maxEntries = 100,\n } = config;\n\n interface LogEntry {\n timestamp: number;\n type: string;\n data: unknown;\n }\n\n const entries: LogEntry[] = [];\n\n function addEntry(type: string, data: unknown) {\n entries.push({\n timestamp: Date.now(),\n type,\n data,\n });\n\n if (entries.length > maxEntries) {\n entries.shift();\n }\n }\n\n return {\n onInit(ctx: PluginContext) {\n ctx.log.info(\"Data logger initialized\");\n },\n\n onDataUpdate(ctx: PluginContext, event: DataUpdateEvent) {\n if (logDataUpdates) {\n addEntry(\"dataUpdate\", {\n seriesId: event.seriesId,\n mode: event.mode,\n pointCount: event.pointCount,\n });\n ctx.log.debug(`Data update: ${event.seriesId} (${event.mode}, ${event.pointCount} points)`);\n }\n },\n\n onViewChange(ctx: PluginContext, event: ViewChangeEvent) {\n if (logViewChanges) {\n addEntry(\"viewChange\", {\n trigger: event.trigger,\n bounds: event.current,\n });\n ctx.log.debug(`View change: ${event.trigger}`);\n }\n },\n\n onInteraction(_ctx: PluginContext, event: InteractionEvent) {\n if (logInteractions) {\n addEntry(\"interaction\", {\n type: event.type,\n pixelX: event.pixelX,\n pixelY: event.pixelY,\n inPlotArea: event.inPlotArea,\n });\n }\n },\n\n onSerialize(_ctx: PluginContext) {\n return { entries };\n },\n\n onDeserialize(_ctx: PluginContext, data: unknown) {\n const saved = data as { entries?: LogEntry[] };\n if (saved?.entries) {\n entries.length = 0;\n entries.push(...saved.entries);\n }\n },\n\n api: {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n export() {\n return JSON.stringify(entries, null, 2);\n },\n },\n };\n }\n);\n","import type {\n PluginContext,\n PluginManifest,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface DirectionIndicatorConfig {\n /** Series ID to track (if not specified, tracks the first series) */\n seriesId?: string;\n /** Number of recent points to analyze for direction (default: 20) */\n sampleSize?: number;\n /** Arrow color (default: from theme) */\n color?: string;\n /** Arrow size in pixels (default: 40) */\n size?: number;\n /** Minimum velocity to show arrow (default: 0.01) */\n minVelocity?: number;\n /** Number of points for smoothing the position/angle (default: 20) */\n historySize?: number;\n /** Hide arrow if no new points are received for this duration in ms (default: undefined/disabled) */\n idleTimeout?: number;\n}\n\ninterface DirectionData {\n angle: number; // Continuous angle in radians\n magnitude: number; // Normalized magnitude 0-1\n lastX: number; // Last data point X coordinate (data space)\n lastY: number; // Last data point Y coordinate (data space)\n smoothX: number; // Smoothed X position (pixel space)\n smoothY: number; // Smoothed Y position (pixel space)\n}\n\nconst directionIndicatorManifest: PluginManifest = {\n name: \"direction-indicator\",\n version: \"1.0.0\",\n description: \"Shows an arrow indicating the direction and trend of streaming data\",\n provides: [\"visualization\", \"analysis\"],\n tags: [\"streaming\", \"direction\", \"trend\", \"arrow\"],\n};\n\nexport const DirectionIndicatorPlugin = definePlugin<DirectionIndicatorConfig>(\n directionIndicatorManifest,\n (config = {}) => {\n const {\n seriesId,\n sampleSize = 20,\n color,\n size = 40,\n minVelocity = 0.01,\n historySize = 20,\n idleTimeout,\n } = config;\n\n let overlayId: string;\n let canvas: HTMLCanvasElement | null = null;\n let ctx: CanvasRenderingContext2D | null = null;\n let currentDirection: DirectionData | null = null;\n let targetSeriesId: string | null = null;\n \n // Smoothing buffers (moving average to reduce jitter)\n const positionHistoryX: number[] = [];\n const positionHistoryY: number[] = [];\n const angleHistory: number[] = [];\n\n let maxHistorySize = historySize;\n let timeoutTimer: any = null;\n let lastPointTimestamp = Date.now();\n let lastSeenX = -Infinity;\n let lastSeenY = -Infinity;\n let currentIdleTimeout = idleTimeout;\n\n return {\n onInit(pluginCtx: PluginContext) {\n overlayId = \"direction-indicator-overlay\";\n const overlay = pluginCtx.ui.createOverlay(overlayId, {\n zIndex: 600,\n position: { top: \"0\", left: \"0\", right: \"0\", bottom: \"0\" },\n pointerEvents: false,\n });\n\n canvas = document.createElement(\"canvas\");\n canvas.style.cssText = \"width: 100%; height: 100%; pointer-events: none;\";\n overlay.appendChild(canvas);\n\n ctx = canvas.getContext(\"2d\");\n resizeCanvas(pluginCtx);\n\n // Determine which series to track\n if (seriesId) {\n targetSeriesId = seriesId;\n } else {\n const allSeries = pluginCtx.data.getAllSeries();\n if (allSeries.length > 0) {\n targetSeriesId = allSeries[0].getId();\n }\n }\n },\n\n onDestroy(pluginCtx: PluginContext) {\n pluginCtx.ui.removeOverlay(overlayId);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n canvas = null;\n ctx = null;\n currentDirection = null;\n },\n\n onResize(pluginCtx: PluginContext) {\n resizeCanvas(pluginCtx);\n },\n\n onAfterRender(pluginCtx: PluginContext) {\n // Update direction every frame for smooth rendering\n updateDirection(pluginCtx);\n render(pluginCtx);\n\n // Ensure we render again when the idle timeout expires to hide the arrow\n if (currentIdleTimeout) {\n if (timeoutTimer) clearTimeout(timeoutTimer);\n const age = Date.now() - lastPointTimestamp;\n if (age < currentIdleTimeout) {\n timeoutTimer = setTimeout(() => {\n pluginCtx.requestRender();\n }, currentIdleTimeout - age + 10);\n }\n }\n },\n\n onConfigChange(_pluginCtx: PluginContext, newConfig: DirectionIndicatorConfig) {\n if (newConfig.historySize !== undefined) {\n maxHistorySize = newConfig.historySize;\n // Reset history buffers if size changes significantly or just trim/expand? \n // Simpler to just let them adjust over time or trim if needed.\n // If we want immediate effect, we might want to trim if smaller.\n while (positionHistoryX.length > maxHistorySize) positionHistoryX.shift();\n while (positionHistoryY.length > maxHistorySize) positionHistoryY.shift();\n while (angleHistory.length > maxHistorySize) angleHistory.shift();\n }\n\n if (newConfig.idleTimeout !== undefined) {\n currentIdleTimeout = newConfig.idleTimeout;\n }\n }\n };\n\n function resizeCanvas(pluginCtx: PluginContext) {\n if (!canvas || !ctx) return;\n const canvasSize = pluginCtx.render.canvasSize;\n const dpr = pluginCtx.render.pixelRatio;\n canvas.width = canvasSize.width * dpr;\n canvas.height = canvasSize.height * dpr;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.scale(dpr, dpr);\n }\n\n function updateDirection(pluginCtx: PluginContext) {\n if (!targetSeriesId) return;\n\n const series = pluginCtx.data.getSeries(targetSeriesId);\n if (!series) return;\n\n const data = pluginCtx.data.getSeriesData(targetSeriesId);\n if (!data || !data.x || !data.y) return;\n\n const totalPoints = data.x.length;\n if (totalPoints < 2) return;\n\n // Get last point coordinates in data space\n const lastX = data.x[totalPoints - 1];\n const lastY = data.y[totalPoints - 1];\n\n // Detect if this is a new point\n if (lastX !== lastSeenX || lastY !== lastSeenY) {\n lastSeenX = lastX;\n lastSeenY = lastY;\n lastPointTimestamp = Date.now();\n }\n\n // Get last N points for direction calculation\n const n = Math.min(sampleSize, totalPoints);\n const startIdx = totalPoints - n;\n\n // Calculate direction using linear regression on recent points IN PIXEL SPACE\n let sumT = 0, sumPX = 0, sumPY = 0, sumTPX = 0, sumTPY = 0, sumTT = 0;\n\n for (let i = startIdx; i < totalPoints; i++) {\n const t = i - startIdx; // Time index\n const dataX = data.x[i];\n const dataY = data.y[i];\n \n // Convert to pixel coordinates\n const pixelX = pluginCtx.coords.dataToPixelX(dataX);\n const pixelY = pluginCtx.coords.dataToPixelY(dataY);\n\n sumT += t;\n sumPX += pixelX;\n sumPY += pixelY;\n sumTPX += t * pixelX;\n sumTPY += t * pixelY;\n sumTT += t * t;\n }\n\n const meanT = sumT / n;\n const meanPX = sumPX / n;\n const meanPY = sumPY / n;\n\n // Calculate slopes in pixel space (dpx/dt and dpy/dt)\n const denominator = sumTT - n * meanT * meanT;\n if (Math.abs(denominator) < 1e-10) return; // Avoid division by zero\n \n const slopePX = (sumTPX - n * meanT * meanPX) / denominator;\n const slopePY = (sumTPY - n * meanT * meanPY) / denominator;\n\n // Calculate continuous angle in pixel space (canvas coordinates)\n const rawAngle = Math.atan2(slopePY, slopePX);\n \n // Convert last point to pixel coordinates\n const lastPixelX = pluginCtx.coords.dataToPixelX(lastX);\n const lastPixelY = pluginCtx.coords.dataToPixelY(lastY);\n \n // Add to position history for smoothing\n positionHistoryX.push(lastPixelX);\n positionHistoryY.push(lastPixelY);\n if (positionHistoryX.length > maxHistorySize) {\n positionHistoryX.shift();\n positionHistoryY.shift();\n }\n \n // Add to angle history for smoothing\n angleHistory.push(rawAngle);\n if (angleHistory.length > maxHistorySize) {\n angleHistory.shift();\n }\n \n // Apply moving average to smooth position and angle\n const smoothX = average(positionHistoryX);\n const smoothY = average(positionHistoryY);\n const smoothedAngle = smoothAngle(angleHistory);\n \n // Calculate magnitude in pixel space\n const magnitude = Math.sqrt(slopePX * slopePX + slopePY * slopePY);\n\n currentDirection = { angle: smoothedAngle, magnitude, lastX, lastY, smoothX, smoothY };\n }\n \n function average(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((sum, val) => sum + val, 0) / values.length;\n }\n \n function smoothAngle(angles: number[]): number {\n if (angles.length === 0) return 0;\n \n // Convert angles to unit vectors to handle wraparound correctly\n let sumX = 0;\n let sumY = 0;\n \n for (const angle of angles) {\n sumX += Math.cos(angle);\n sumY += Math.sin(angle);\n }\n \n // Average the vectors and convert back to angle\n return Math.atan2(sumY / angles.length, sumX / angles.length);\n }\n\n function render(pluginCtx: PluginContext) {\n if (!ctx || !canvas || !currentDirection) return;\n\n const { width, height } = pluginCtx.render.canvasSize;\n ctx.clearRect(0, 0, width, height);\n\n // Check for idle timeout\n if (currentIdleTimeout !== undefined) {\n const age = Date.now() - lastPointTimestamp;\n if (age > currentIdleTimeout) return;\n }\n\n if (currentDirection.magnitude < minVelocity) return;\n\n // Use smoothed position for fluid movement\n const smoothX = currentDirection.smoothX;\n const smoothY = currentDirection.smoothY;\n\n const arrowColor = color || \"#FF9800\";\n \n ctx.save();\n\n // Draw arrow at smoothed position with smoothed angle\n drawArrow(ctx, smoothX, smoothY, currentDirection.angle, size, arrowColor);\n\n ctx.restore();\n }\n\n function drawArrow(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n angle: number,\n length: number,\n color: string\n ) {\n // Triangle dimensions (only the arrow head)\n const triangleHeight = length * 0.6;\n const triangleWidth = length * 0.4;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(angle);\n\n // Draw filled triangle pointing in the direction of movement\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(triangleHeight / 2, 0); // Tip of the triangle\n ctx.lineTo(-triangleHeight / 2, -triangleWidth / 2); // Bottom left\n ctx.lineTo(-triangleHeight / 2, triangleWidth / 2); // Bottom right\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n }\n }\n);\n","/**\n * Sci Plot - Built-in Plugins\n * \n * Collection of official plugins that demonstrate the plugin system\n * capabilities and provide common functionality.\n * \n * @module plugins/builtins\n */\n\nexport * from \"./crosshair\";\nexport * from \"./stats\";\nexport * from \"./watermark\";\nexport * from \"./grid-highlight\";\nexport * from \"./data-logger\";\nexport * from \"./direction-indicator\";\n\nimport { CrosshairPlugin } from \"./crosshair\";\nimport { StatsPlugin } from \"./stats\";\nimport { WatermarkPlugin } from \"./watermark\";\nimport { GridHighlightPlugin } from \"./grid-highlight\";\nimport { DataLoggerPlugin } from \"./data-logger\";\nimport { DirectionIndicatorPlugin } from \"./direction-indicator\";\n\n/**\n * Plugin collection for easy registration\n */\nexport const BuiltinPlugins = {\n Crosshair: CrosshairPlugin,\n Statistics: StatsPlugin,\n Watermark: WatermarkPlugin,\n GridHighlight: GridHighlightPlugin,\n DataLogger: DataLoggerPlugin,\n DirectionIndicator: DirectionIndicatorPlugin,\n};\n","/**\n * Anomaly Detection Algorithms\n * Each method has distinct characteristics for different use cases\n */\n\nimport type { AnomalyPoint, AnomalyMethod } from './types';\n\n/**\n * Z-Score method: Standard statistical approach\n * - Uses MEAN and STANDARD DEVIATION (parametric)\n * - Assumes normal distribution\n * - Sensitive to extreme outliers\n * - Best for: Clean, normally distributed data\n */\nexport function detectZScore(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n threshold: number = 3\n): AnomalyPoint[] {\n const n = y.length;\n if (n < 3) return [];\n \n const anomalies: AnomalyPoint[] = [];\n const windowSize = Math.min(20, Math.floor(n / 10));\n \n for (let i = 0; i < n; i++) {\n const start = Math.max(0, i - windowSize);\n const end = Math.min(n, i + windowSize + 1);\n \n // Calculate local MEAN (parametric - sensitive to outliers)\n let localSum = 0;\n let count = 0;\n for (let j = start; j < end; j++) {\n if (j !== i) {\n localSum += y[j];\n count++;\n }\n }\n const localMean = localSum / count;\n \n // Calculate local STANDARD DEVIATION (parametric)\n let localSumSq = 0;\n for (let j = start; j < end; j++) {\n if (j !== i) {\n localSumSq += Math.pow(y[j] - localMean, 2);\n }\n }\n const localStdDev = Math.sqrt(localSumSq / count);\n \n if (localStdDev === 0) continue;\n \n // Z-score: measures how many standard deviations away from mean\n const zScore = Math.abs((y[i] - localMean) / localStdDev);\n \n if (zScore > threshold) {\n anomalies.push({\n index: i,\n x: x[i],\n y: y[i],\n score: zScore,\n method: 'zscore'\n });\n }\n }\n \n return anomalies;\n}\n\n/**\n * MAD (Median Absolute Deviation) method: Robust statistical approach\n * - Uses MEDIAN instead of mean (non-parametric)\n * - Robust to outliers in the window\n * - Doesn't assume normal distribution\n * - Best for: Data with existing outliers, skewed distributions\n */\nexport function detectMAD(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n threshold: number = 3.5\n): AnomalyPoint[] {\n const n = y.length;\n if (n < 3) return [];\n \n const anomalies: AnomalyPoint[] = [];\n const windowSize = Math.min(20, Math.floor(n / 10));\n \n for (let i = 0; i < n; i++) {\n const start = Math.max(0, i - windowSize);\n const end = Math.min(n, i + windowSize + 1);\n \n // Get local window values\n const localValues: number[] = [];\n for (let j = start; j < end; j++) {\n if (j !== i) {\n localValues.push(y[j]);\n }\n }\n \n // Calculate MEDIAN (robust to outliers)\n localValues.sort((a, b) => a - b);\n const localMedian = localValues[Math.floor(localValues.length / 2)];\n \n // Calculate MAD (Median Absolute Deviation - robust measure of spread)\n const deviations = localValues.map(v => Math.abs(v - localMedian));\n deviations.sort((a, b) => a - b);\n const mad = deviations[Math.floor(deviations.length / 2)];\n \n if (mad === 0) continue;\n \n // Modified Z-score using MAD (more robust than standard Z-score)\n // 0.6745 is the consistency constant for normal distribution\n const modifiedZScore = Math.abs((0.6745 * (y[i] - localMedian)) / mad);\n \n if (modifiedZScore > threshold) {\n anomalies.push({\n index: i,\n x: x[i],\n y: y[i],\n score: modifiedZScore,\n method: 'mad'\n });\n }\n }\n \n return anomalies;\n}\n\n/**\n * IQR (Interquartile Range) method: Quartile-based approach\n * - Uses PERCENTILES (25th and 75th)\n * - Classic box-plot outlier detection\n * - Non-parametric, distribution-free\n * - Best for: General purpose, well-understood method\n */\nexport function detectIQR(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n multiplier: number = 1.5\n): AnomalyPoint[] {\n const n = y.length;\n if (n < 4) return [];\n \n const anomalies: AnomalyPoint[] = [];\n const windowSize = Math.min(20, Math.floor(n / 10));\n \n for (let i = 0; i < n; i++) {\n const start = Math.max(0, i - windowSize);\n const end = Math.min(n, i + windowSize + 1);\n \n // Get local window values\n const localValues: number[] = [];\n for (let j = start; j < end; j++) {\n if (j !== i) {\n localValues.push(y[j]);\n }\n }\n \n // Calculate QUARTILES (percentile-based)\n localValues.sort((a, b) => a - b);\n const q1Index = Math.floor(localValues.length * 0.25);\n const q3Index = Math.floor(localValues.length * 0.75);\n const q1 = localValues[q1Index];\n const q3 = localValues[q3Index];\n const iqr = q3 - q1;\n \n if (iqr === 0) continue;\n \n // IQR method: points outside [Q1 - k*IQR, Q3 + k*IQR] are outliers\n // k=1.5 for outliers, k=3.0 for extreme outliers\n const lowerBound = q1 - multiplier * iqr;\n const upperBound = q3 + multiplier * iqr;\n \n if (y[i] < lowerBound || y[i] > upperBound) {\n const score = y[i] < lowerBound \n ? (lowerBound - y[i]) / iqr\n : (y[i] - upperBound) / iqr;\n \n anomalies.push({\n index: i,\n x: x[i],\n y: y[i],\n score,\n method: 'iqr'\n });\n }\n }\n \n return anomalies;\n}\n\n/**\n * Simplified Isolation Forest: Detects anomalies using random partitioning\n * - Machine learning approach\n * - Isolates anomalies through random splits\n * - Works well with high-dimensional data\n * - Best for: Complex patterns, unknown distributions\n */\nexport function detectIsolationForest(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n contamination: number = 0.05,\n numTrees: number = 10\n): AnomalyPoint[] {\n const n = y.length;\n if (n < 10) return [];\n \n // Calculate anomaly scores for each point\n const scores = new Float32Array(n);\n \n for (let i = 0; i < n; i++) {\n let totalDepth = 0;\n \n // Build multiple trees\n for (let t = 0; t < numTrees; t++) {\n totalDepth += isolationDepth(y, i, 0, 8); // Max depth 8\n }\n \n // Average depth (normalized)\n const avgDepth = totalDepth / numTrees;\n const c = 2 * (Math.log(n - 1) + 0.5772156649) - (2 * (n - 1) / n);\n scores[i] = Math.pow(2, -avgDepth / c);\n }\n \n // Sort scores to find threshold\n const sortedScores = Array.from(scores).sort((a, b) => b - a);\n const thresholdIndex = Math.floor(n * contamination);\n const threshold = sortedScores[thresholdIndex];\n \n // Find anomalies\n const anomalies: AnomalyPoint[] = [];\n for (let i = 0; i < n; i++) {\n if (scores[i] >= threshold) {\n anomalies.push({\n index: i,\n x: x[i],\n y: y[i],\n score: scores[i],\n method: 'isolation-forest'\n });\n }\n }\n \n return anomalies;\n}\n\n/**\n * Helper: Calculate isolation depth for a point\n */\nfunction isolationDepth(\n data: Float32Array | Float64Array,\n pointIndex: number,\n currentDepth: number,\n maxDepth: number\n): number {\n if (currentDepth >= maxDepth) return currentDepth;\n \n // Random split\n const min = Math.min(...Array.from(data));\n const max = Math.max(...Array.from(data));\n const splitValue = min + Math.random() * (max - min);\n \n // Check which side the point falls on\n if (data[pointIndex] < splitValue) {\n return isolationDepth(data, pointIndex, currentDepth + 1, maxDepth);\n } else {\n return isolationDepth(data, pointIndex, currentDepth + 1, maxDepth);\n }\n}\n\n/**\n * Main detection function - routes to appropriate algorithm\n */\nexport function detectAnomalies(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n method: AnomalyMethod,\n sensitivity: number\n): AnomalyPoint[] {\n switch (method) {\n case 'zscore':\n return detectZScore(x, y, sensitivity);\n case 'mad':\n return detectMAD(x, y, sensitivity);\n case 'iqr':\n return detectIQR(x, y, sensitivity);\n case 'isolation-forest':\n return detectIsolationForest(x, y, sensitivity);\n default:\n return detectZScore(x, y, sensitivity);\n }\n}\n","/**\n * Anomaly Detection Plugin\n * \n * Detects anomalies in chart data using statistical methods.\n * This is a simplified version that provides the core API.\n * \n * @module plugins/anomaly-detection\n */\n\nimport type { ChartPlugin, PluginContext } from '../types';\nimport type { \n PluginAnomalyDetectionConfig, \n AnomalyDetectionResult\n} from './types';\nimport { detectAnomalies } from './algorithms';\n\nexport type { \n PluginAnomalyDetectionConfig,\n AnomalyDetectionResult,\n AnomalyPoint,\n AnomalyMethod\n} from './types';\n\nconst DEFAULT_CONFIG: Required<PluginAnomalyDetectionConfig> = {\n method: 'zscore',\n sensitivity: 3,\n realtime: false,\n highlight: true,\n highlightColor: '#ff0000',\n highlightSize: 8,\n minWindowSize: 30,\n rollingWindow: false,\n windowSize: 100,\n seriesIds: []\n};\n\nexport const manifestAnomalyDetection = {\n id: 'anomaly-detection',\n name: 'Anomaly Detection',\n version: '1.0.0' as `${number}.${number}.${number}`,\n description: 'Real-time anomaly detection with multiple algorithms',\n author: 'Sci Plot',\n category: 'analysis' as const\n};\n\n/**\n * Anomaly Detection Plugin Factory\n */\nexport function PluginAnomalyDetection(\n userConfig: PluginAnomalyDetectionConfig = {}\n): ChartPlugin<PluginAnomalyDetectionConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n const detectionResults = new Map<string, AnomalyDetectionResult>();\n \n return {\n manifest: manifestAnomalyDetection,\n \n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n },\n \n onDestroy() {\n detectionResults.clear();\n ctx = null;\n },\n \n api: {\n /**\n * Run anomaly detection on a specific series\n */\n detect(seriesId: string): AnomalyDetectionResult | null {\n if (!ctx) return null;\n \n const series = ctx.data.getSeries(seriesId);\n if (!series) return null;\n \n const data = series.getData();\n if (!data || data.x.length < config.minWindowSize) return null;\n \n // Use rolling window if enabled\n let x = data.x;\n let y = data.y;\n \n if (config.rollingWindow && data.x.length > config.windowSize) {\n const start = data.x.length - config.windowSize;\n x = data.x.slice(start);\n y = data.y.slice(start);\n }\n \n // Run detection\n const anomalies = detectAnomalies(x, y, config.method, config.sensitivity);\n \n // Store results\n const result: AnomalyDetectionResult = {\n seriesId,\n anomalies,\n totalPoints: y.length,\n method: config.method,\n threshold: config.sensitivity,\n timestamp: Date.now()\n };\n \n detectionResults.set(seriesId, result);\n \n // Emit event\n ctx.events.emit('anomaly:detected', result);\n \n return result;\n },\n \n /**\n * Run detection on all series\n */\n detectAll(): Map<string, AnomalyDetectionResult> {\n if (!ctx) return new Map();\n \n const results = new Map<string, AnomalyDetectionResult>();\n const allSeries = ctx.data.getAllSeries();\n \n allSeries.forEach((_series, seriesId) => {\n const result = (this as any).detect(String(seriesId));\n if (result) {\n results.set(String(seriesId), result);\n }\n });\n \n return results;\n },\n \n /**\n * Get detection results for a specific series\n */\n getResults(seriesId: string): AnomalyDetectionResult | undefined {\n return detectionResults.get(seriesId);\n },\n \n /**\n * Get all detection results\n */\n getAllResults(): Map<string, AnomalyDetectionResult> {\n return new Map(detectionResults);\n },\n \n /**\n * Clear all detection results\n */\n clear(): void {\n detectionResults.clear();\n },\n \n /**\n * Update configuration\n */\n setConfig(newConfig: Partial<PluginAnomalyDetectionConfig>): void {\n Object.assign(config, newConfig);\n },\n \n /**\n * Get current configuration\n */\n getConfig(): PluginAnomalyDetectionConfig {\n return { ...config };\n }\n }\n };\n}\n","/**\n * Native ML Integration Plugin - Core Algorithms\n * \n * Implements machine learning algorithms natively without third-party dependencies.\n * Includes simple neural networks, statistical models, and signal processing.\n * \n * @packageDocumentation\n * @module plugins/ml-integration\n */\n\nimport type {\n MLModelAPI,\n ModelConfig,\n PredictionInput,\n PredictionResult\n} from './types';\n\n// ============================================\n// Native Neural Network Implementation\n// ============================================\n\ninterface NativeNeuralNetwork {\n layers: NeuralLayer[];\n learningRate: number;\n epochs: number;\n}\n\ninterface NeuralLayer {\n type: 'dense' | 'activation';\n weights: number[][];\n biases: number[];\n activation?: 'relu' | 'sigmoid' | 'tanh' | 'linear';\n}\n\nexport class SimpleNeuralNetwork implements MLModelAPI {\n private network: NativeNeuralNetwork;\n private config: ModelConfig;\n private ready = false;\n\n constructor(config: ModelConfig) {\n this.config = config;\n this.network = {\n layers: [],\n learningRate: 0.01,\n epochs: 100\n };\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n \n const inputData = Array.from(input.data as number[]);\n const outputData = this.forwardPass(inputData);\n \n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(outputData),\n outputShape: [outputData.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n private forwardPass(input: number[]): number[] {\n let activations = input;\n \n for (const layer of this.network.layers) {\n if (layer.type === 'dense') {\n activations = this.denseLayer(activations, layer.weights, layer.biases);\n }\n \n if (layer.activation) {\n activations = this.applyActivation(activations, layer.activation);\n }\n }\n \n return activations;\n }\n\n private denseLayer(input: number[], weights: number[][], biases: number[]): number[] {\n const output: number[] = [];\n for (let i = 0; i < weights.length; i++) {\n let sum = biases[i];\n for (let j = 0; j < input.length; j++) {\n sum += input[j] * weights[i][j];\n }\n output.push(sum);\n }\n return output;\n }\n\n private applyActivation(input: number[], activation: string): number[] {\n switch (activation) {\n case 'relu':\n return input.map(x => Math.max(0, x));\n case 'sigmoid':\n return input.map(x => 1 / (1 + Math.exp(-x)));\n case 'tanh':\n return input.map(x => Math.tanh(x));\n default:\n return input;\n }\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n const dummyInput = new Array(10).fill(0.1);\n await this.predict({ data: dummyInput });\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================\n// Native Statistical Models\n// ============================================\n\nexport class NativeLinearRegression implements MLModelAPI {\n private config: ModelConfig;\n private coefficients: number[] = [];\n private intercept = 0;\n private ready = false;\n\n constructor(config: ModelConfig) {\n this.config = config;\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n \n const inputData = Array.from(input.data);\n const predictions = inputData.map(x => {\n let result = this.intercept;\n for (let i = 0; i < this.coefficients.length && i < (x as number); i++) {\n result += this.coefficients[i] * (x as number);\n }\n return result;\n });\n \n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(predictions),\n outputShape: [predictions.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n train(data: { x: number[][], y: number[] }): void {\n // Simple linear regression using least squares\n const n = data.x.length;\n \n // Create design matrix\n const X: number[][] = [];\n for (let i = 0; i < n; i++) {\n X.push([1, ...data.x[i]]);\n }\n \n // Calculate coefficients using normal equation: β = (X^T X)^(-1) X^T y\n const XtX = this.matrixMultiply(this.transpose(X), X);\n const XtY = this.matrixMultiply(this.transpose(X), data.y.map(y => [y]));\n \n const XtXInv = this.matrixInverse(XtX);\n const beta = this.matrixMultiply(XtXInv, XtY);\n \n this.intercept = beta[0][0];\n this.coefficients = beta.slice(1).map(row => row[0]);\n this.ready = true;\n }\n\n private transpose(matrix: number[][]): number[][] {\n return matrix[0].map((_, colIndex) => matrix.map(row => row[colIndex]));\n }\n\n private matrixMultiply(a: number[][], b: number[][]): number[][] {\n const result: number[][] = [];\n for (let i = 0; i < a.length; i++) {\n result[i] = [];\n for (let j = 0; j < b[0].length; j++) {\n let sum = 0;\n for (let k = 0; k < b.length; k++) {\n sum += a[i][k] * b[k][j];\n }\n result[i][j] = sum;\n }\n }\n return result;\n }\n\n private matrixInverse(matrix: number[][]): number[][] {\n // Simplified 2x2 matrix inverse for demonstration\n if (matrix.length === 2 && matrix[0].length === 2) {\n const det = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];\n if (Math.abs(det) < 1e-10) {\n return [[1, 0], [0, 1]]; // Identity matrix if singular\n }\n const invDet = 1 / det;\n return [\n [invDet * matrix[1][1], -invDet * matrix[0][1]],\n [-invDet * matrix[1][0], invDet * matrix[0][0]]\n ];\n }\n \n // For larger matrices, return identity (simplified)\n return matrix.map((row, i) => row.map((_, j) => i === j ? 1 : 0));\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n this.coefficients = [1.0];\n this.intercept = 0.0;\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================\n// Native Signal Processing\n// ============================================\n\nexport class NativeSignalProcessor implements MLModelAPI {\n private config: ModelConfig;\n private filterType: 'lowpass' | 'highpass' | 'bandpass';\n private cutoffFrequency: number;\n private sampleRate: number;\n private ready = false;\n\n constructor(config: ModelConfig) {\n this.config = config;\n // Extract parameters from metadata\n this.filterType = (config.metadata?.filterType as any) || 'lowpass';\n this.cutoffFrequency = config.metadata?.cutoffFrequency || 1000;\n this.sampleRate = config.metadata?.sampleRate || 44100;\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n \n const inputData = Array.from(input.data as number[]);\n const filteredData = this.applyFilter(inputData);\n \n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(filteredData),\n outputShape: [filteredData.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n private applyFilter(data: number[]): number[] {\n switch (this.filterType) {\n case 'lowpass':\n return this.lowpassFilter(data);\n case 'highpass':\n return this.highpassFilter(data);\n case 'bandpass':\n return this.bandpassFilter(data);\n default:\n return data;\n }\n }\n\n private lowpassFilter(data: number[]): number[] {\n // Simple exponential moving average low-pass filter\n const alpha = 2 * Math.PI * this.cutoffFrequency / this.sampleRate;\n const smoothedAlpha = alpha / (1 + alpha);\n \n const filtered: number[] = [data[0]];\n for (let i = 1; i < data.length; i++) {\n filtered.push(smoothedAlpha * data[i] + (1 - smoothedAlpha) * filtered[i - 1]);\n }\n return filtered;\n }\n\n private highpassFilter(data: number[]): number[] {\n // High-pass filter using difference\n const filtered: number[] = [];\n for (let i = 1; i < data.length; i++) {\n filtered.push(data[i] - data[i - 1]);\n }\n return filtered;\n }\n\n private bandpassFilter(data: number[]): number[] {\n // Band-pass filter using combination of low-pass and high-pass\n const lowpass = this.lowpassFilter(data);\n return this.highpassFilter(lowpass);\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================\n// Native Model Factory\n// ============================================\n\nexport function createNativeModel(config: ModelConfig): MLModelAPI {\n switch (config.type) {\n case 'neural-network':\n return new SimpleNeuralNetwork(config);\n case 'linear-regression':\n return new NativeLinearRegression(config);\n case 'signal-processor':\n return new NativeSignalProcessor(config);\n default:\n // Default to simple linear model\n return new NativeLinearRegression(config);\n }\n}\n\n// ============================================\n// Native FFT Implementation\n// ============================================\n\nexport function nativeFFT(data: number[]): { real: number[]; imag: number[] } {\n const n = data.length;\n const real: number[] = new Array(n);\n const imag: number[] = new Array(n);\n \n // Simplified DFT (not optimized FFT)\n for (let k = 0; k < n; k++) {\n let sumReal = 0;\n let sumImag = 0;\n \n for (let t = 0; t < n; t++) {\n const angle = -2 * Math.PI * k * t / n;\n sumReal += data[t] * Math.cos(angle);\n sumImag += data[t] * Math.sin(angle);\n }\n \n real[k] = sumReal;\n imag[k] = sumImag;\n }\n \n return { real, imag };\n}\n\n// ============================================\n// Native Statistical Functions\n// ============================================\n\nexport function nativeMean(data: number[]): number {\n return data.reduce((sum, val) => sum + val, 0) / data.length;\n}\n\nexport function nativeStandardDeviation(data: number[]): number {\n const mean = nativeMean(data);\n const variance = data.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / data.length;\n return Math.sqrt(variance);\n}\n\nexport function nativeCorrelation(x: number[], y: number[]): number {\n const n = x.length;\n const meanX = nativeMean(x);\n const meanY = nativeMean(y);\n \n let numerator = 0;\n let denomX = 0;\n let denomY = 0;\n \n for (let i = 0; i < n; i++) {\n const dx = x[i] - meanX;\n const dy = y[i] - meanY;\n numerator += dx * dy;\n denomX += dx * dx;\n denomY += dy * dy;\n }\n \n return numerator / Math.sqrt(denomX * denomY);\n}","import type { \n PluginMLIntegrationConfig, \n MLIntegrationAPI, \n MLModelAPI, \n PredictionResult, \n VisualizationConfig\n} from './types';\nimport { \n createNativeModel,\n nativeFFT, \n nativeMean, \n nativeStandardDeviation, \n nativeCorrelation \n} from './native-algorithms';\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n AfterRenderEvent\n} from '../types';\n\nconst manifestML: PluginManifest = {\n name: \"velo-plot-ml-integration\",\n version: \"1.0.0\",\n description: \"Machine Learning Integration Bridge for Sci Plot\",\n provides: [\"ml\", \"prediction\", \"inference\"],\n tags: [\"ml\", \"ai\", \"analysis\"],\n};\n\nexport function PluginMLIntegration(\n userConfig: Partial<PluginMLIntegrationConfig> = {}\n): ChartPlugin<PluginMLIntegrationConfig> {\n let ctx: PluginContext | null = null;\n const models = new Map<string, MLModelAPI>();\n const activeVisualizations = new Map<string, { result: PredictionResult, config: VisualizationConfig }>();\n\n // Register initial models from config\n if (userConfig.models) {\n userConfig.models.forEach(m => models.set(m.id, createNativeModel(m)));\n }\n\n const api: MLIntegrationAPI & Record<string, unknown> = {\n registerModel(model: MLModelAPI) {\n if (!model.id) {\n ctx?.log.error(\"Cannot register model without id\");\n return;\n }\n models.set(model.id, model);\n ctx?.log.info(`Model registered: ${model.name || 'Unnamed'} (${model.id})`);\n },\n\n async runInference(modelId: string, seriesId: string) {\n const model = models.get(modelId);\n if (!model) throw new Error(`Model not found: ${modelId}`);\n\n const seriesData = ctx?.data.getSeriesData(seriesId);\n if (!seriesData) throw new Error(`Series not found: ${seriesId}`);\n\n // Convert to Float32Array for model compatibility\n const data = new Float32Array(seriesData.y);\n\n const result = await model.predict({ data });\n // Attach X values for visualization\n result.xValues = seriesData.x;\n return result;\n },\n\n visualizeResults(result: PredictionResult, config: VisualizationConfig = {}) {\n const vizId = `ml-viz-${Math.random().toString(36).substr(2, 9)}`;\n activeVisualizations.set(vizId, { \n result, \n config: { ...userConfig.defaultVisualization, ...config } \n });\n ctx?.requestRender();\n return vizId;\n },\n\n clearResults(visualizationId?: string) {\n if (visualizationId) {\n activeVisualizations.delete(visualizationId);\n } else {\n activeVisualizations.clear();\n }\n ctx?.requestRender();\n },\n\n stats: {\n fft: nativeFFT,\n mean: nativeMean,\n standardDeviation: nativeStandardDeviation,\n correlation: nativeCorrelation\n }\n };\n\n function drawMLVisualizations(pCtx: PluginContext) {\n const { render, coords } = pCtx;\n const { ctx2d } = render;\n if (!ctx2d) return;\n\n activeVisualizations.forEach((viz) => {\n const { result, config } = viz;\n const { output, xValues, confidence } = result;\n if (!xValues) return;\n\n const n = Math.min(xValues.length, output.length);\n\n ctx2d.save();\n\n // 1. Draw Confidence Interval (as filled area)\n if (config.showConfidenceInterval && confidence && confidence.length === n) {\n ctx2d.beginPath();\n const opacity = config.intervalOpacity ?? 0.2;\n ctx2d.fillStyle = (config.lineStyle?.color || '#3b82f6') + Math.floor(opacity * 255).toString(16).padStart(2, '0');\n \n // Forward: upper bound\n for (let i = 0; i < n; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i] + confidence[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n \n // Backward: lower bound\n for (let i = n - 1; i >= 0; i--) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i] - confidence[i]);\n ctx2d.lineTo(px, py);\n }\n \n ctx2d.closePath();\n ctx2d.fill();\n }\n\n // 2. Draw Prediction Line\n ctx2d.beginPath();\n ctx2d.strokeStyle = config.lineStyle?.color || '#3b82f6';\n ctx2d.lineWidth = config.lineStyle?.width || 2;\n if (config.lineStyle?.dash) ctx2d.setLineDash(config.lineStyle.dash);\n\n for (let i = 0; i < n; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n ctx2d.stroke();\n\n ctx2d.restore();\n });\n }\n\n return {\n manifest: manifestML,\n\n onInit(c: PluginContext) {\n ctx = c;\n },\n\n onRenderOverlay(pCtx: PluginContext, _event: AfterRenderEvent) {\n drawMLVisualizations(pCtx);\n },\n\n api\n };\n}\n\nexport default PluginMLIntegration;\n\nexport type { \n PluginMLIntegrationConfig, \n MLIntegrationAPI, \n MLModelAPI, \n PredictionResult, \n VisualizationConfig \n} from './types';","/**\n * Pattern Recognition Plugin - Pattern Definitions\n * \n * Implements common technical analysis patterns for financial and scientific data.\n * Includes head-shoulders, double tops/bottoms, triangles, and more.\n * \n * @packageDocumentation\n * @module plugins/pattern-recognition\n */\n\nimport type {\n PatternDefinition,\n PatternType,\n PatternPoint,\n PatternValidationResult,\n PatternSegment,\n PatternMeasurements\n} from './types';\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction findPeaksAndValleys(points: PatternPoint[]): { peaks: PatternPoint[], valleys: PatternPoint[] } {\n const peaks: PatternPoint[] = [];\n const valleys: PatternPoint[] = [];\n \n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n const next = points[i + 1];\n \n // Peak detection\n if (curr.y > prev.y && curr.y > next.y) {\n peaks.push({ ...curr, type: 'peak' });\n }\n // Valley detection\n else if (curr.y < prev.y && curr.y < next.y) {\n valleys.push({ ...curr, type: 'valley' });\n }\n }\n \n return { peaks, valleys };\n}\n\nfunction calculateSlope(p1: PatternPoint, p2: PatternPoint): number {\n return (p2.y - p1.y) / (p2.x - p1.x);\n}\n\nfunction calculatePatternMeasurements(points: PatternPoint[]): PatternMeasurements {\n const yValues = points.map(p => p.y);\n const xValues = points.map(p => p.x);\n \n const height = Math.max(...yValues) - Math.min(...yValues);\n const width = Math.max(...xValues) - Math.min(...xValues);\n const slope = calculateSlope(points[0], points[points.length - 1]);\n \n return {\n height,\n width,\n slope,\n volumeProfile: {\n increasing: 0.4, // Mock values\n decreasing: 0.3,\n neutral: 0.3\n },\n breakoutTarget: Math.max(...yValues) + height * 0.8,\n stopLoss: Math.min(...yValues) - height * 0.2\n };\n}\n\n// ============================================\n// Head and Shoulders Pattern\n// ============================================\n\nfunction validateHeadShoulders(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 5) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for head-shoulders pattern'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n // Need at least 3 peaks and 2 valleys for head-shoulders\n if (peaks.length < 3 || valleys.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n // Find left shoulder, head, and right shoulder\n const leftShoulder = peaks[0];\n const head = peaks[1];\n const rightShoulder = peaks[2];\n \n // Find the valleys between shoulders and head\n const leftValley = valleys[0];\n const rightValley = valleys[1];\n \n // Validate pattern structure\n const headHigherThanShoulders = head.y > leftShoulder.y && head.y > rightShoulder.y;\n const shouldersApproximatelyEqual = Math.abs(leftShoulder.y - rightShoulder.y) / leftShoulder.y < 0.1;\n const valleyBelowShoulders = leftValley.y < leftShoulder.y && rightValley.y < rightShoulder.y;\n \n if (!headHigherThanShoulders || !shouldersApproximatelyEqual || !valleyBelowShoulders) {\n return { \n valid: false, \n confidence: 0, \n segments: [], \n keyPoints: [], \n errors: ['Invalid head-shoulders structure'] \n };\n }\n \n // Create segments\n const segments: PatternSegment[] = [\n { start: leftShoulder, end: leftValley, type: 'resistance', strength: 0.8 },\n { start: leftValley, end: head, type: 'support', strength: 0.7 },\n { start: head, end: rightValley, type: 'resistance', strength: 0.8 },\n { start: rightValley, end: rightShoulder, type: 'support', strength: 0.7 }\n ];\n \n const keyPoints = [leftShoulder, leftValley, head, rightValley, rightShoulder];\n const measurements = calculatePatternMeasurements(points);\n \n // Calculate confidence based on pattern symmetry\n const shoulderSymmetry = 1 - Math.abs(leftShoulder.y - rightShoulder.y) / head.y;\n const valleySymmetry = 1 - Math.abs(leftValley.y - rightValley.y) / head.y;\n const confidence = (shoulderSymmetry + valleySymmetry) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Double Top/Bottom Pattern\n// ============================================\n\nfunction validateDoubleTop(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for double top'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n if (peaks.length < 2 || valleys.length < 1) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const firstTop = peaks[0];\n const secondTop = peaks[1];\n const valley = valleys[0];\n \n // Validate double top structure\n const topsApproximatelyEqual = Math.abs(firstTop.y - secondTop.y) / firstTop.y < 0.05;\n const valleyBelowTops = valley.y < firstTop.y && valley.y < secondTop.y;\n const significantDrop = (firstTop.y - valley.y) / firstTop.y > 0.1;\n \n if (!topsApproximatelyEqual || !valleyBelowTops || !significantDrop) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Invalid double top structure'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstTop, end: valley, type: 'resistance', strength: 0.9 },\n { start: valley, end: secondTop, type: 'support', strength: 0.8 },\n { start: firstTop, end: secondTop, type: 'resistance', strength: 0.9 }\n ];\n \n const keyPoints = [firstTop, valley, secondTop];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on top equality and depth of valley\n const topEquality = 1 - Math.abs(firstTop.y - secondTop.y) / firstTop.y;\n const depthRatio = (firstTop.y - valley.y) / firstTop.y;\n const confidence = (topEquality + Math.min(depthRatio * 2, 1)) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\nfunction validateDoubleBottom(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for double bottom'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n if (valleys.length < 2 || peaks.length < 1) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const firstBottom = valleys[0];\n const secondBottom = valleys[1];\n const peak = peaks[0];\n \n // Validate double bottom structure\n const bottomsApproximatelyEqual = Math.abs(firstBottom.y - secondBottom.y) / firstBottom.y < 0.05;\n const peakAboveBottoms = peak.y > firstBottom.y && peak.y > secondBottom.y;\n const significantRise = (peak.y - firstBottom.y) / firstBottom.y > 0.1;\n \n if (!bottomsApproximatelyEqual || !peakAboveBottoms || !significantRise) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Invalid double bottom structure'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstBottom, end: peak, type: 'support', strength: 0.9 },\n { start: peak, end: secondBottom, type: 'resistance', strength: 0.8 },\n { start: firstBottom, end: secondBottom, type: 'support', strength: 0.9 }\n ];\n \n const keyPoints = [firstBottom, peak, secondBottom];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on bottom equality and height of peak\n const bottomEquality = 1 - Math.abs(firstBottom.y - secondBottom.y) / firstBottom.y;\n const heightRatio = (peak.y - firstBottom.y) / firstBottom.y;\n const confidence = (bottomEquality + Math.min(heightRatio * 2, 1)) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Triangle Patterns\n// ============================================\n\nfunction validateAscendingTriangle(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for ascending triangle'] };\n }\n \n // Find horizontal resistance line and ascending support line\n const yValues = points.map(p => p.y);\n const resistanceLevel = Math.max(...yValues);\n const resistancePoints = points.filter(p => Math.abs(p.y - resistanceLevel) / resistanceLevel < 0.02);\n \n if (resistancePoints.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient resistance points'] };\n }\n \n // Check for ascending support (higher lows)\n const lows = points.filter((p, i) => i === 0 || p.y < points[i - 1].y);\n if (lows.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient low points'] };\n }\n \n const firstLow = lows[0];\n const lastLow = lows[lows.length - 1];\n const supportSlope = calculateSlope(firstLow, lastLow);\n \n // Support should be ascending (positive slope)\n if (supportSlope <= 0) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Support not ascending'] };\n }\n \n const segments: PatternSegment[] = [\n { start: resistancePoints[0], end: resistancePoints[resistancePoints.length - 1], type: 'resistance', strength: 0.8 },\n { start: firstLow, end: lastLow, type: 'support', strength: 0.7 }\n ];\n \n const keyPoints = [...resistancePoints.slice(0, 2), firstLow, lastLow];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on horizontal resistance and ascending support\n const resistanceFlatness = 1 - Math.abs(resistancePoints[0].y - resistancePoints[resistancePoints.length - 1].y) / resistanceLevel;\n const supportAscending = Math.min(supportSlope / 0.01, 1); // Normalize slope\n const confidence = (resistanceFlatness + supportAscending) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Pattern Definitions Registry\n// ============================================\n\nexport const BUILTIN_PATTERNS: Record<PatternType, PatternDefinition> = {\n 'head-shoulders': {\n id: 'head-shoulders',\n type: 'head-shoulders',\n name: 'Head and Shoulders',\n description: 'Bearish reversal pattern with three peaks',\n minPoints: 5,\n maxPoints: 7,\n validator: validateHeadShoulders\n },\n \n 'inverse-head-shoulders': {\n id: 'inverse-head-shoulders',\n type: 'inverse-head-shoulders',\n name: 'Inverse Head and Shoulders',\n description: 'Bullish reversal pattern with three valleys',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n // Invert points and validate as regular head-shoulders\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = validateHeadShoulders(invertedPoints);\n return result;\n }\n },\n \n 'double-top': {\n id: 'double-top',\n type: 'double-top',\n name: 'Double Top',\n description: 'Bearish reversal pattern with two equal peaks',\n minPoints: 4,\n maxPoints: 6,\n validator: validateDoubleTop\n },\n \n 'double-bottom': {\n id: 'double-bottom',\n type: 'double-bottom',\n name: 'Double Bottom',\n description: 'Bullish reversal pattern with two equal valleys',\n minPoints: 4,\n maxPoints: 6,\n validator: validateDoubleBottom\n },\n \n 'triple-top': {\n id: 'triple-top',\n type: 'triple-top',\n name: 'Triple Top',\n description: 'Bearish reversal pattern with three equal peaks',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n if (points.length < 5) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const { peaks } = findPeaksAndValleys(points);\n if (peaks.length < 3) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Need at least 3 peaks'] };\n }\n \n const peak1 = peaks[0].y;\n const peak2 = peaks[1].y;\n const peak3 = peaks[2].y;\n \n const tolerance = 0.05;\n const peaksEqual = Math.abs(peak1 - peak2) / peak1 < tolerance && Math.abs(peak2 - peak3) / peak2 < tolerance;\n \n if (!peaksEqual) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Peaks not equal'] };\n }\n \n const segments: PatternSegment[] = [\n { start: peaks[0], end: peaks[1], type: 'resistance', strength: 0.8 },\n { start: peaks[1], end: peaks[2], type: 'resistance', strength: 0.8 }\n ];\n \n const keyPoints = [peaks[0], peaks[1], peaks[2]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.8,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'triple-bottom': {\n id: 'triple-bottom',\n type: 'triple-bottom',\n name: 'Triple Bottom',\n description: 'Bullish reversal pattern with three equal valleys',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n return BUILTIN_PATTERNS['triple-top'].validator(invertedPoints);\n }\n },\n \n 'ascending-triangle': {\n id: 'ascending-triangle',\n type: 'ascending-triangle',\n name: 'Ascending Triangle',\n description: 'Continuation pattern with horizontal resistance and ascending support',\n minPoints: 4,\n maxPoints: 8,\n validator: validateAscendingTriangle\n },\n \n 'descending-triangle': {\n id: 'descending-triangle',\n type: 'descending-triangle',\n name: 'Descending Triangle',\n description: 'Continuation pattern with horizontal support and descending resistance',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Invert points and validate as ascending triangle\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = validateAscendingTriangle(invertedPoints);\n return result;\n }\n },\n \n 'symmetrical-triangle': {\n id: 'symmetrical-triangle',\n type: 'symmetrical-triangle',\n name: 'Symmetrical Triangle',\n description: 'Continuation pattern with converging support and resistance',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Simplified validation for symmetrical triangle\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n // Check for converging trendlines\n const firstHalf = points.slice(0, Math.floor(points.length / 2));\n const secondHalf = points.slice(Math.floor(points.length / 2));\n \n const firstSlope = calculateSlope(firstHalf[0], firstHalf[firstHalf.length - 1]);\n const secondSlope = calculateSlope(secondHalf[0], secondHalf[secondHalf.length - 1]);\n \n // Slopes should be converging (opposite signs)\n const converging = (firstSlope > 0 && secondSlope < 0) || (firstSlope < 0 && secondSlope > 0);\n \n if (!converging) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Lines not converging'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstHalf[0], end: firstHalf[firstHalf.length - 1], type: 'trendline', strength: 0.7 },\n { start: secondHalf[0], end: secondHalf[secondHalf.length - 1], type: 'trendline', strength: 0.7 }\n ];\n \n const keyPoints = [firstHalf[0], firstHalf[firstHalf.length - 1], secondHalf[0], secondHalf[secondHalf.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.7,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'rising-wedge': {\n id: 'rising-wedge',\n type: 'rising-wedge',\n name: 'Rising Wedge',\n description: 'Bearish reversal pattern with two converging upward lines',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Simplified rising wedge validation\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n if (peaks.length < 2 || valleys.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const peakSlope = calculateSlope(peaks[0], peaks[peaks.length - 1]);\n const valleySlope = calculateSlope(valleys[0], valleys[valleys.length - 1]);\n \n // Both lines should be rising but converging (valley slope > peak slope)\n const wedgePattern = peakSlope > 0 && valleySlope > 0 && valleySlope > peakSlope;\n \n if (!wedgePattern) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Not a rising wedge pattern'] };\n }\n \n const segments: PatternSegment[] = [\n { start: peaks[0], end: peaks[peaks.length - 1], type: 'resistance', strength: 0.8 },\n { start: valleys[0], end: valleys[valleys.length - 1], type: 'support', strength: 0.8 }\n ];\n \n const keyPoints = [peaks[0], peaks[peaks.length - 1], valleys[0], valleys[valleys.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.75,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'falling-wedge': {\n id: 'falling-wedge',\n type: 'falling-wedge',\n name: 'Falling Wedge',\n description: 'Bullish reversal pattern with two converging downward lines',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Invert points and validate as rising wedge\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = BUILTIN_PATTERNS['rising-wedge'].validator(invertedPoints);\n return result;\n }\n },\n \n 'rectangle': {\n id: 'rectangle',\n type: 'rectangle',\n name: 'Rectangle',\n description: 'Continuation pattern with horizontal support and resistance',\n minPoints: 4,\n maxPoints: 10,\n validator: (points) => {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const yValues = points.map(p => p.y);\n const resistance = Math.max(...yValues);\n const support = Math.min(...yValues);\n \n // Check for relatively flat top and bottom\n const resistancePoints = points.filter(p => Math.abs(p.y - resistance) / resistance < 0.05);\n const supportPoints = points.filter(p => Math.abs(p.y - support) / support < 0.05);\n \n if (resistancePoints.length < 2 || supportPoints.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient horizontal lines'] };\n }\n \n const segments: PatternSegment[] = [\n { start: resistancePoints[0], end: resistancePoints[resistancePoints.length - 1], type: 'resistance', strength: 0.9 },\n { start: supportPoints[0], end: supportPoints[supportPoints.length - 1], type: 'support', strength: 0.9 }\n ];\n \n const keyPoints = [resistancePoints[0], resistancePoints[resistancePoints.length - 1], supportPoints[0], supportPoints[supportPoints.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.8,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'flag': {\n id: 'flag',\n type: 'flag',\n name: 'Flag',\n description: 'Short-term continuation pattern after strong move',\n minPoints: 3,\n maxPoints: 6,\n validator: (points) => {\n // Simplified flag validation\n if (points.length < 3) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const slope = calculateSlope(points[0], points[points.length - 1]);\n \n // Flag should be relatively horizontal (small slope)\n const horizontal = Math.abs(slope) < 0.01;\n \n if (!horizontal) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Not horizontal enough'] };\n }\n \n const segments: PatternSegment[] = [\n { start: points[0], end: points[points.length - 1], type: 'trendline', strength: 0.6 }\n ];\n \n const keyPoints = [points[0], points[points.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.6,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'pennant': {\n id: 'pennant',\n type: 'pennant',\n name: 'Pennant',\n description: 'Short-term continuation pattern with converging lines',\n minPoints: 3,\n maxPoints: 5,\n validator: (points) => {\n // Similar to symmetrical triangle but smaller\n return BUILTIN_PATTERNS['symmetrical-triangle'].validator(points);\n }\n },\n \n 'custom': {\n id: 'custom',\n type: 'custom',\n name: 'Custom Pattern',\n description: 'User-defined pattern',\n minPoints: 3,\n validator: (_points) => {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Custom pattern not implemented'] };\n }\n }\n};","/**\n * Pattern Recognition Plugin - Main Implementation\n * \n * Provides technical pattern recognition for financial and scientific data.\n * Supports common chart patterns and custom pattern definitions.\n * \n * @example\n * ```typescript\n * import { PluginPatternRecognition } from 'velo-plot/plugins/pattern-recognition';\n * \n * chart.use(PluginPatternRecognition({\n * defaultParameters: {\n * minConfidence: 0.7,\n * patternTypes: ['head-shoulders', 'double-top', 'ascending-triangle'],\n * sensitivity: 0.5\n * },\n * enableRealtime: true,\n * visualization: {\n * showPatterns: true,\n * showLabels: true,\n * colorScheme: {\n * 'head-shoulders': '#ff6b6b',\n * 'double-top': '#4ecdc4',\n * 'ascending-triangle': '#45b7d1'\n * }\n * }\n * }));\n * \n * // Detect patterns\n * const result = await chart.patterns.detectPatterns('series1', dataPoints);\n * console.log(`Found ${result.matches.length} patterns`);\n * \n * // Enable real-time detection\n * chart.patterns.enableRealtimeDetection('series1');\n * ```\n * \n * @packageDocumentation\n * @module plugins/pattern-recognition\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n BeforeRenderEvent,\n DataUpdateEvent\n} from '../types';\n\nimport type {\n PluginPatternRecognitionConfig,\n PatternRecognitionAPI,\n PatternDetectionResult,\n PatternMatch,\n PatternPoint,\n PatternDetectionParameters,\n PatternType,\n CustomPatternConfig,\n PatternDefinition,\n PatternValidationResult,\n PatternDetectedEvent\n} from './types';\n\nimport { BUILTIN_PATTERNS } from './patterns';\n\n// ============================================\n// Plugin Manifest\n// ============================================\n\nconst manifestPatternRecognition: PluginManifest = {\n name: 'pattern-recognition',\n version: '1.0.0',\n description: 'Technical pattern recognition for financial and scientific data',\n author: 'Sci Plot Team',\n provides: ['patterns', 'technical-analysis', 'chart-patterns']\n};\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_CONFIG: Required<PluginPatternRecognitionConfig> = {\n defaultParameters: {\n minConfidence: 0.7,\n maxPatterns: 10,\n patternTypes: ['head-shoulders', 'double-top', 'double-bottom', 'ascending-triangle', 'descending-triangle'],\n sensitivity: 0.5,\n minPatternSize: 5,\n maxPatternSize: 50,\n overlapTolerance: 0.3,\n enableVolumeConfirmation: false,\n enableTrendConfirmation: true\n },\n customPatterns: [],\n enableRealtime: false,\n debounceTime: 500,\n maxStoredPatterns: 100,\n visualization: {\n showPatterns: true,\n showLabels: true,\n showTargets: true,\n colorScheme: {\n 'head-shoulders': '#ff6b6b',\n 'inverse-head-shoulders': '#4ecdc4',\n 'double-top': '#ff9f43',\n 'double-bottom': '#00d2d3',\n 'triple-top': '#ff6b6b',\n 'triple-bottom': '#4ecdc4',\n 'ascending-triangle': '#45b7d1',\n 'descending-triangle': '#f39c12',\n 'symmetrical-triangle': '#9b59b6',\n 'rising-wedge': '#e74c3c',\n 'falling-wedge': '#27ae60',\n 'rectangle': '#34495e',\n 'flag': '#f1c40f',\n 'pennant': '#e67e22',\n 'custom': '#95a5a6'\n },\n opacity: 0.7,\n lineWidth: 2\n },\n notifications: {\n enableAlerts: false,\n minAlertConfidence: 0.8,\n alertTypes: ['head-shoulders', 'double-top', 'double-bottom']\n }\n};\n\n// ============================================\n// Pattern Recognition Plugin Implementation\n// ============================================\n\nexport function PluginPatternRecognition(\n userConfig: Partial<PluginPatternRecognitionConfig> = {}\n): ChartPlugin<PluginPatternRecognitionConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n \n // Pattern storage\n const patternMatches = new Map<string, PatternMatch[]>();\n const registeredPatterns = new Map<PatternType, PatternDefinition>(Object.entries(BUILTIN_PATTERNS) as [PatternType, PatternDefinition][]);\n const realtimeSeries = new Set<string>();\n const debounceTimers = new Map<string, any>();\n \n // ============================================\n // Pattern Detection Engine\n // ============================================\n \n async function detectPatterns(\n seriesId: string, \n dataPoints: PatternPoint[], \n parameters?: Partial<PatternDetectionParameters>\n ): Promise<PatternDetectionResult> {\n const params = { ...config.defaultParameters, ...parameters };\n const startTime = performance.now();\n \n const matches: PatternMatch[] = [];\n const patternsByType: Record<PatternType, number> = {} as any;\n \n // Preprocess data - find peaks and valleys\n const processedPoints = preprocessData(dataPoints, params.sensitivity);\n \n // Check each pattern type\n for (const patternType of params.patternTypes) {\n const pattern = registeredPatterns.get(patternType);\n if (!pattern) continue;\n \n // Slide window through data\n for (let i = params.minPatternSize; i <= Math.min(processedPoints.length, params.maxPatternSize); i++) {\n const window = processedPoints.slice(Math.max(0, i - params.maxPatternSize), i);\n \n if (window.length < pattern.minPoints) continue;\n if (pattern.maxPoints && window.length > pattern.maxPoints) continue;\n \n // Validate pattern\n const validation = pattern.validator(window);\n \n if (validation.valid && validation.confidence >= params.minConfidence) {\n const match: PatternMatch = {\n pattern,\n confidence: validation.confidence,\n location: {\n startIndex: Math.max(0, i - params.maxPatternSize),\n endIndex: i,\n startPoint: window[0],\n endPoint: window[window.length - 1]\n },\n validation,\n timestamp: Date.now(),\n seriesId\n };\n \n // Check for overlaps\n if (!hasSignificantOverlap(match, matches, params.overlapTolerance)) {\n matches.push(match);\n patternsByType[patternType] = (patternsByType[patternType] || 0) + 1;\n \n // Limit number of patterns\n if (matches.length >= params.maxPatterns!) {\n break;\n }\n }\n }\n }\n \n if (matches.length >= params.maxPatterns!) {\n break;\n }\n }\n \n // Sort by confidence\n matches.sort((a, b) => b.confidence - a.confidence);\n \n // Store matches\n patternMatches.set(seriesId, matches);\n \n const detectionTime = performance.now() - startTime;\n \n // Emit events for high-confidence patterns\n for (const match of matches) {\n if (match.confidence >= config.notifications.minAlertConfidence &&\n config.notifications.alertTypes.includes(match.pattern.type)) {\n ctx?.events.emit('pattern:detected', {\n match,\n seriesId,\n timestamp: Date.now()\n } as PatternDetectedEvent);\n }\n }\n \n const result: PatternDetectionResult = {\n matches,\n summary: {\n totalPatterns: matches.length,\n patternsByType,\n averageConfidence: matches.length > 0 ? matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length : 0,\n detectionTime\n },\n processedPoints: processedPoints.length,\n parameters: params\n };\n \n ctx?.log.info(`Pattern detection completed for ${seriesId}: ${matches.length} patterns found`);\n \n return result;\n }\n \n function preprocessData(dataPoints: PatternPoint[], sensitivity: number): PatternPoint[] {\n return dataPoints.filter((point, index) => {\n if (index === 0 || index === dataPoints.length - 1) return true;\n \n const prev = dataPoints[index - 1];\n \n const priceChange = Math.abs(point.y - prev.y) / prev.y;\n return priceChange >= sensitivity * 0.01;\n });\n }\n \n function hasSignificantOverlap(newMatch: PatternMatch, existingMatches: PatternMatch[], tolerance: number): boolean {\n for (const existing of existingMatches) {\n const overlapStart = Math.max(newMatch.location.startIndex, existing.location.startIndex);\n const overlapEnd = Math.min(newMatch.location.endIndex, existing.location.endIndex);\n const overlapSize = overlapEnd - overlapStart;\n \n const newMatchSize = newMatch.location.endIndex - newMatch.location.startIndex;\n const existingMatchSize = existing.location.endIndex - existing.location.startIndex;\n \n const overlapRatio = overlapSize / Math.min(newMatchSize, existingMatchSize);\n \n if (overlapRatio > tolerance) {\n return true;\n }\n }\n return false;\n }\n \n // ============================================\n // Custom Pattern Registration\n // ============================================\n \n function registerCustomPattern(customConfig: CustomPatternConfig): void {\n const pattern: PatternDefinition = {\n id: customConfig.id,\n type: 'custom',\n name: customConfig.name,\n minPoints: customConfig.pointSequence.length,\n maxPoints: customConfig.pointSequence.length,\n validator: (points) => validateCustomPattern(points, customConfig)\n };\n \n registeredPatterns.set('custom', pattern);\n ctx?.log.info(`Custom pattern registered: ${customConfig.id}`);\n }\n \n function validateCustomPattern(points: PatternPoint[], config: CustomPatternConfig): PatternValidationResult {\n if (points.length < config.pointSequence.length) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n let confidence = 1.0;\n const errors: string[] = [];\n \n for (let i = 0; i < config.pointSequence.length; i++) {\n const sequencePoint = config.pointSequence[i];\n const actualPoint = points[i];\n \n if (sequencePoint.constraints) {\n const constraints = sequencePoint.constraints;\n \n if (constraints.higherThanPrevious && i > 0) {\n if (actualPoint.y <= points[i - 1].y) {\n confidence *= 0.8;\n errors.push(`Point ${i} not higher than previous`);\n }\n }\n \n if (constraints.lowerThanPrevious && i > 0) {\n if (actualPoint.y >= points[i - 1].y) {\n confidence *= 0.8;\n errors.push(`Point ${i} not lower than previous`);\n }\n }\n \n if (constraints.withinRange) {\n const [min, max] = constraints.withinRange;\n if (actualPoint.y < min || actualPoint.y > max) {\n confidence *= 0.7;\n errors.push(`Point ${i} not within range [${min}, ${max}]`);\n }\n }\n }\n }\n \n return {\n valid: confidence >= 0.5,\n confidence,\n segments: [],\n keyPoints: points,\n errors: errors.length > 0 ? errors : undefined\n };\n }\n \n // ============================================\n // API Implementation\n // ============================================\n \n const api: PatternRecognitionAPI & Record<string, unknown> = {\n detectPatterns,\n \n registerCustomPattern,\n \n getRegisteredPatterns(): PatternDefinition[] {\n return Array.from(registeredPatterns.values());\n },\n \n getPatternMatches(seriesId: string): PatternMatch[] {\n return patternMatches.get(seriesId) || [];\n },\n \n clearPatternMatches(seriesId: string): void {\n patternMatches.delete(seriesId);\n ctx?.log.info(`Pattern matches cleared for series: ${seriesId}`);\n },\n \n enableRealtimeDetection(seriesId: string, parameters?: Partial<PatternDetectionParameters>): void {\n realtimeSeries.add(seriesId);\n \n const chart = ctx?.chart;\n if (chart) {\n const targetSeries = chart.getSeries(seriesId);\n if (targetSeries) {\n const data = targetSeries.getData();\n if (data && data.x.length > 0) {\n const points: PatternPoint[] = Array.from(data.x).map((x, i) => ({\n x: x as number,\n y: data.y[i]\n }));\n \n detectPatterns(seriesId, points, parameters);\n }\n }\n }\n \n ctx?.log.info(`Real-time pattern detection enabled for series: ${seriesId}`);\n },\n \n disableRealtimeDetection(seriesId: string): void {\n realtimeSeries.delete(seriesId);\n \n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n debounceTimers.delete(seriesId);\n }\n \n ctx?.log.info(`Real-time pattern detection disabled for series: ${seriesId}`);\n },\n \n getStatistics(seriesId?: string) {\n if (seriesId) {\n const matches = patternMatches.get(seriesId) || [];\n const patternsByType: Record<PatternType, number> = {} as any;\n \n for (const match of matches) {\n patternsByType[match.pattern.type] = (patternsByType[match.pattern.type] || 0) + 1;\n }\n \n return {\n totalDetections: matches.length,\n patternsByType,\n averageConfidence: matches.length > 0 ? matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length : 0,\n detectionRate: matches.length / 100\n };\n } else {\n let totalDetections = 0;\n const allPatternsByType: Record<PatternType, number> = {} as any;\n const allConfidences: number[] = [];\n \n for (const matches of patternMatches.values()) {\n totalDetections += matches.length;\n allConfidences.push(...matches.map(m => m.confidence));\n \n for (const match of matches) {\n allPatternsByType[match.pattern.type] = (allPatternsByType[match.pattern.type] || 0) + 1;\n }\n }\n \n return {\n totalDetections,\n patternsByType: allPatternsByType,\n averageConfidence: allConfidences.length > 0 ? allConfidences.reduce((sum, c) => sum + c, 0) / allConfidences.length : 0,\n detectionRate: totalDetections / 100\n };\n }\n },\n \n updateConfig: (newConfig: Partial<PluginPatternRecognitionConfig>) => {\n Object.assign(config, newConfig);\n },\n \n getConfig: () => ({ ...config }),\n \n visualizePatterns(seriesId: string, showTypes?: PatternType[]): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const matches = patternMatches.get(seriesId) || [];\n const filteredMatches = showTypes ? matches.filter(m => showTypes.includes(m.pattern.type)) : matches;\n \n api.hidePatterns(seriesId);\n \n for (const match of filteredMatches) {\n const color = config.visualization.colorScheme[match.pattern.type] || '#666666';\n \n for (const segment of match.validation.segments) {\n const lineId = `${seriesId}_pattern_${match.pattern.id}_${match.location.startIndex}`;\n \n chart.addSeries({\n id: lineId,\n type: 'line',\n data: {\n x: new Float32Array([segment.start.x, segment.end.x]),\n y: new Float32Array([segment.start.y, segment.end.y])\n },\n style: {\n color,\n width: config.visualization.lineWidth,\n opacity: config.visualization.opacity,\n lineDash: [5, 5]\n }\n });\n }\n \n if (config.visualization.showLabels) {\n const labelId = `${seriesId}_label_${match.pattern.id}_${match.location.startIndex}`;\n const centerX = (match.location.startPoint.x + match.location.endPoint.x) / 2;\n const centerY = (match.location.startPoint.y + match.location.endPoint.y) / 2;\n \n chart.addAnnotation({\n id: labelId,\n type: 'text',\n text: match.pattern.name,\n x: centerX,\n y: centerY,\n style: {\n color,\n fontSize: 12,\n backgroundColor: 'rgba(255, 255, 255, 0.8)'\n }\n } as any);\n }\n }\n },\n \n hidePatterns(seriesId: string): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const matches = patternMatches.get(seriesId) || [];\n \n for (const match of matches) {\n for (let i = 0; i < match.validation.segments.length; i++) {\n const lineId = `${seriesId}_pattern_${match.pattern.id}_${match.location.startIndex}`;\n if (chart.getSeries(lineId)) {\n chart.removeSeries(lineId);\n }\n }\n \n const labelId = `${seriesId}_label_${match.pattern.id}_${match.location.startIndex}`;\n if (chart.getAnnotation(labelId)) {\n chart.removeAnnotation(labelId);\n }\n }\n }\n };\n \n // ============================================\n // Event Handlers\n // ============================================\n \n function handleDataUpdate(context: PluginContext, event: DataUpdateEvent): void {\n if (!config.enableRealtime) return;\n \n const { seriesId } = event;\n \n if (realtimeSeries.has(seriesId)) {\n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n }\n \n const newTimer = setTimeout(() => {\n const chart = context.chart;\n if (chart) {\n const series = chart.getSeries(seriesId);\n if (series) {\n const data = series.getData();\n if (data && data.x.length > 0) {\n const points: PatternPoint[] = Array.from(data.x).map((x, i) => ({\n x: x as number,\n y: data.y[i]\n }));\n \n detectPatterns(seriesId, points);\n \n if (config.visualization.showPatterns) {\n api.visualizePatterns(seriesId);\n }\n }\n }\n }\n }, config.debounceTime);\n \n debounceTimers.set(seriesId, newTimer);\n }\n }\n \n // ============================================\n // Plugin Definition\n // ============================================\n \n return {\n manifest: manifestPatternRecognition,\n \n onInit(context: PluginContext) {\n ctx = context;\n \n if (config.customPatterns) {\n for (const customPattern of config.customPatterns) {\n registerCustomPattern(customPattern);\n }\n }\n \n ctx.log.info(`Pattern Recognition plugin initialized with ${registeredPatterns.size} patterns`);\n },\n \n onConfigChange(_context: PluginContext, _newConfig: PluginPatternRecognitionConfig) {\n // Handle config changes\n },\n \n onBeforeRender(_context: PluginContext, _event: BeforeRenderEvent) {\n // Handle pre-render tasks if needed\n },\n \n onDataUpdate: handleDataUpdate,\n \n onDestroy(_context: PluginContext) {\n for (const timer of debounceTimers.values()) {\n clearTimeout(timer);\n }\n debounceTimers.clear();\n \n patternMatches.clear();\n realtimeSeries.clear();\n registeredPatterns.clear();\n },\n \n api\n };\n}\n\nexport default PluginPatternRecognition;\n\nexport type {\n PatternType,\n PatternDefinition,\n PatternPoint,\n PatternSegment,\n PatternValidationResult,\n PatternMeasurements,\n PatternMatch,\n PatternDetectionResult,\n PatternDetectionParameters,\n CustomPatternConfig,\n PluginPatternRecognitionConfig,\n PatternDetectedEvent,\n PatternCompletedEvent,\n PatternFailedEvent,\n PatternRecognitionAPI\n} from './types';\n","/**\n * Regression Plugin - Core Algorithms\n * \n * Implements regression algorithms for scientific curve fitting.\n * Includes linear, polynomial, exponential, and non-linear models.\n * \n * @packageDocumentation\n * @module plugins/regression\n */\n\nimport type {\n RegressionData,\n RegressionResult,\n LinearRegressionConfig,\n PolynomialRegressionConfig,\n ExponentialRegressionConfig,\n GaussianRegressionConfig\n} from './types';\nimport { solveLinearSystem } from '../analysis/math';\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction toArray(data: Float32Array | Float64Array | number[]): number[] {\n return Array.from(data);\n}\n\nfunction toFloat32Array(data: number[]): Float32Array {\n return new Float32Array(data);\n}\n\nfunction calculateMean(data: number[]): number {\n return data.reduce((sum, val) => sum + val, 0) / data.length;\n}\n\nfunction calculateVariance(data: number[]): number {\n const mean = calculateMean(data);\n return data.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / data.length;\n}\n\nfunction calculateRSquared(observed: number[], fitted: number[]): number {\n const meanObserved = calculateMean(observed);\n let ssRes = 0;\n let ssTot = 0;\n \n for (let i = 0; i < observed.length; i++) {\n ssRes += Math.pow(observed[i] - fitted[i], 2);\n ssTot += Math.pow(observed[i] - meanObserved, 2);\n }\n \n return 1 - (ssRes / ssTot);\n}\n\nfunction calculateAdjustedRSquared(rSquared: number, n: number, k: number): number {\n return 1 - ((1 - rSquared) * (n - 1)) / (n - k - 1);\n}\n\nfunction calculateRMSE(observed: number[], fitted: number[]): number {\n let sumSquaredErrors = 0;\n for (let i = 0; i < observed.length; i++) {\n sumSquaredErrors += Math.pow(observed[i] - fitted[i], 2);\n }\n return Math.sqrt(sumSquaredErrors / observed.length);\n}\n/*\nfunction _calculateStatistics(data: RegressionData, predictions: Float32Array): { rSquared: number; rmse: number; mae: number; residuals: number[] } {\n const n = data.x.length;\n const yMean = Array.from(data.y).reduce((sum, y) => sum + y, 0) / n;\n \n let ssTotal = 0;\n let ssResidual = 0;\n \n for (let i = 0; i < n; i++) {\n const yActual = data.y[i];\n const yPred = predictions[i];\n \n ssTotal += Math.pow(yActual - yMean, 2);\n ssResidual += Math.pow(yActual - yPred, 2);\n }\n \n const rSquared = 1 - (ssResidual / ssTotal);\n const rmse = Math.sqrt(ssResidual / n);\n const mae = Array.from(data.y).reduce((sum, y, i) => sum + Math.abs(y - predictions[i]), 0) / n;\n \n return {\n rSquared,\n rmse,\n mae,\n residuals: Array.from(data.y).map((y, i) => y - predictions[i])\n };\n}\n*/\n// ============================================\n// Linear Regression\n// ============================================\n\nexport function linearRegression(\n data: RegressionData,\n config: LinearRegressionConfig = {}\n): RegressionResult {\n const startTime = performance.now();\n \n const x = toArray(data.x);\n const y = toArray(data.y);\n const weights = data.weights ? toArray(data.weights) : null;\n const { forceOrigin = false } = config;\n \n const n = x.length;\n \n if (forceOrigin) {\n // Forced through origin: y = bx\n let numerator = 0;\n let denominator = 0;\n \n for (let i = 0; i < n; i++) {\n const weight = weights ? weights[i] : 1;\n numerator += weight * x[i] * y[i];\n denominator += weight * x[i] * x[i];\n }\n \n const slope = numerator / denominator;\n const fittedValues = x.map(xi => slope * xi);\n const residuals = y.map((yi, i) => yi - fittedValues[i]);\n \n const rSquared = calculateRSquared(y, fittedValues);\n const adjustedRSquared = calculateAdjustedRSquared(rSquared, n, 1);\n const rmse = calculateRMSE(y, fittedValues);\n \n return {\n method: 'linear',\n parameters: {\n parameters: [slope],\n uncertainties: [Math.sqrt(denominator / (n * numerator))], // Simplified\n correlationMatrix: [[1]]\n },\n statistics: {\n rSquared,\n adjustedRSquared,\n rmse,\n rss: residuals.reduce((sum, r) => sum + r * r, 0),\n tss: y.reduce((sum, yi) => sum + Math.pow(yi - calculateMean(y), 2), 0),\n n,\n k: 1\n },\n fittedValues: toFloat32Array(fittedValues),\n residuals: toFloat32Array(residuals),\n goodnessOfFit: rSquared > 0.9 ? 'excellent' : rSquared > 0.7 ? 'good' : rSquared > 0.5 ? 'fair' : 'poor',\n converged: true,\n iterations: 1,\n processingTime: performance.now() - startTime\n };\n } else {\n // Standard linear regression: y = ax + b\n let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0, sumY2 = 0;\n let sumWeights = 0;\n \n for (let i = 0; i < n; i++) {\n const weight = weights ? weights[i] : 1;\n sumX += weight * x[i];\n sumY += weight * y[i];\n sumXY += weight * x[i] * y[i];\n sumX2 += weight * x[i] * x[i];\n sumY2 += weight * y[i] * y[i];\n sumWeights += weight;\n }\n \n const meanX = sumX / sumWeights;\n const meanY = sumY / sumWeights;\n \n const slope = (sumXY - sumWeights * meanX * meanY) / (sumX2 - sumWeights * meanX * meanX);\n const intercept = meanY - slope * meanX;\n \n const fittedValues = x.map(xi => slope * xi + intercept);\n const residuals = y.map((yi, i) => yi - fittedValues[i]);\n \n const rSquared = calculateRSquared(y, fittedValues);\n const adjustedRSquared = calculateAdjustedRSquared(rSquared, n, 2);\n const rmse = calculateRMSE(y, fittedValues);\n \n return {\n method: 'linear',\n parameters: {\n parameters: [slope, intercept],\n uncertainties: [0.1, 0.1], // Simplified\n correlationMatrix: [[1, -0.5], [-0.5, 1]] // Simplified\n },\n statistics: {\n rSquared,\n adjustedRSquared,\n rmse,\n rss: residuals.reduce((sum, r) => sum + r * r, 0),\n tss: y.reduce((sum, yi) => sum + Math.pow(yi - meanY, 2), 0),\n n,\n k: 2\n },\n fittedValues: toFloat32Array(fittedValues),\n residuals: toFloat32Array(residuals),\n goodnessOfFit: rSquared > 0.9 ? 'excellent' : rSquared > 0.7 ? 'good' : rSquared > 0.5 ? 'fair' : 'poor',\n converged: true,\n iterations: 1,\n processingTime: performance.now() - startTime\n };\n }\n}\n\n// ============================================\n// Polynomial Regression\n// ============================================\n\nexport function polynomialRegression(\n data: RegressionData,\n config: PolynomialRegressionConfig\n): RegressionResult {\n const startTime = performance.now();\n \n const x = toArray(data.x);\n const y = toArray(data.y);\n const { degree } = config;\n \n const n = x.length;\n const m = degree + 1; // Number of parameters\n \n // Build Vandermonde matrix\n const X: number[][] = [];\n for (let i = 0; i < n; i++) {\n const row: number[] = [];\n for (let j = 0; j <= degree; j++) {\n row.push(Math.pow(x[i], j));\n }\n X.push(row);\n }\n \n // Solve using least squares (simplified implementation)\n // In practice, would use QR decomposition or SVD\n const parameters = solveLeastSquares(X, y, 0);\n \n const fittedValues = x.map(xi => {\n let value = 0;\n for (let j = 0; j <= degree; j++) {\n value += parameters[j] * Math.pow(xi, j);\n }\n return value;\n });\n \n const residuals = y.map((yi, i) => yi - fittedValues[i]);\n \n const rSquared = calculateRSquared(y, fittedValues);\n const adjustedRSquared = calculateAdjustedRSquared(rSquared, n, m);\n const rmse = calculateRMSE(y, fittedValues);\n \n return {\n method: 'polynomial',\n parameters: {\n parameters,\n uncertainties: new Array(m).fill(0.1), // Simplified\n correlationMatrix: Array(m).fill(0).map(() => Array(m).fill(0)) // Simplified\n },\n statistics: {\n rSquared,\n adjustedRSquared,\n rmse,\n rss: residuals.reduce((sum, r) => sum + r * r, 0),\n tss: y.reduce((sum, yi) => sum + Math.pow(yi - calculateMean(y), 2), 0),\n n,\n k: m\n },\n fittedValues: toFloat32Array(fittedValues),\n residuals: toFloat32Array(residuals),\n goodnessOfFit: rSquared > 0.9 ? 'excellent' : rSquared > 0.7 ? 'good' : rSquared > 0.5 ? 'fair' : 'poor',\n converged: true,\n iterations: 10, // Simplified\n processingTime: performance.now() - startTime\n };\n}\n\n// ============================================\n// Exponential Regression\n// ============================================\n\nexport function exponentialRegression(\n data: RegressionData,\n _config: ExponentialRegressionConfig = {}\n): RegressionResult {\n const startTime = performance.now();\n \n const x = toArray(data.x);\n const y = toArray(data.y);\n \n // Transform to linear: ln(y - offset) = ln(amplitude) + rate * x\n // Need to estimate offset first (simplified)\n let offset = Math.min(...y) - 1;\n \n const transformedY = y.map(yi => {\n const adjusted = yi - offset;\n return adjusted > 0 ? Math.log(adjusted) : 0;\n });\n \n // Linear regression on transformed data\n const linearResult = linearRegression(\n { x, y: transformedY },\n { forceOrigin: false }\n );\n \n const [rate, logAmplitude] = linearResult.parameters.parameters;\n const amplitude = Math.exp(logAmplitude);\n \n const fittedValues = x.map(xi => amplitude * Math.exp(rate * xi) + offset);\n const residuals = y.map((yi, i) => yi - fittedValues[i]);\n \n const rSquared = calculateRSquared(y, fittedValues);\n const adjustedRSquared = calculateAdjustedRSquared(rSquared, x.length, 3);\n const rmse = calculateRMSE(y, fittedValues);\n \n return {\n method: 'exponential',\n parameters: {\n parameters: [amplitude, rate, offset],\n uncertainties: [0.1, 0.01, 0.1], // Simplified\n correlationMatrix: [[1, 0.5, 0.2], [0.5, 1, 0.3], [0.2, 0.3, 1]] // Simplified\n },\n statistics: {\n rSquared,\n adjustedRSquared,\n rmse,\n rss: residuals.reduce((sum, r) => sum + r * r, 0),\n tss: y.reduce((sum, yi) => sum + Math.pow(yi - calculateMean(y), 2), 0),\n n: x.length,\n k: 3\n },\n fittedValues: toFloat32Array(fittedValues),\n residuals: toFloat32Array(residuals),\n goodnessOfFit: rSquared > 0.9 ? 'excellent' : rSquared > 0.7 ? 'good' : rSquared > 0.5 ? 'fair' : 'poor',\n converged: true,\n iterations: 5, // Simplified\n processingTime: performance.now() - startTime\n };\n}\n\n// ============================================\n// Gaussian Regression\n// ============================================\n\nexport function gaussianRegression(\n data: RegressionData,\n _config: GaussianRegressionConfig = {}\n): RegressionResult {\n const startTime = performance.now();\n \n const x = toArray(data.x);\n const y = toArray(data.y);\n \n // Non-linear fitting using simplified gradient descent\n let amplitude = Math.max(...y);\n let mean = x.reduce((sum, xi) => sum + xi, 0) / x.length;\n let std = Math.sqrt(calculateVariance(x));\n let offset = Math.min(...y);\n \n const learningRate = 0.001;\n const maxIterations = 100;\n const tolerance = 1e-6;\n \n for (let iter = 0; iter < maxIterations; iter++) {\n let gradAmplitude = 0, gradMean = 0, gradStd = 0, gradOffset = 0;\n let totalError = 0;\n \n for (let i = 0; i < x.length; i++) {\n const xi = x[i];\n const yi = y[i];\n \n // Gaussian function: A * exp(-((x - μ)² / (2σ²))) + offset\n const exponent = -Math.pow(xi - mean, 2) / (2 * std * std);\n const predicted = amplitude * Math.exp(exponent) + offset;\n const error = yi - predicted;\n totalError += error * error;\n \n // Gradients\n const expTerm = Math.exp(exponent);\n gradAmplitude += error * expTerm;\n gradMean += error * amplitude * expTerm * (xi - mean) / (std * std);\n gradStd += error * amplitude * expTerm * Math.pow(xi - mean, 2) / (Math.pow(std, 3));\n gradOffset += error;\n }\n \n // Update parameters\n amplitude += learningRate * gradAmplitude;\n mean += learningRate * gradMean;\n std += learningRate * gradStd;\n offset += learningRate * gradOffset;\n \n // Ensure std is positive\n std = Math.max(std, 0.01);\n \n if (totalError < tolerance) break;\n }\n \n const fittedValues = x.map(xi => {\n const exponent = -Math.pow(xi - mean, 2) / (2 * std * std);\n return amplitude * Math.exp(exponent) + offset;\n });\n \n const residuals = y.map((yi, i) => yi - fittedValues[i]);\n \n const rSquared = calculateRSquared(y, fittedValues);\n const adjustedRSquared = calculateAdjustedRSquared(rSquared, x.length, 4);\n const rmse = calculateRMSE(y, fittedValues);\n \n return {\n method: 'gaussian',\n parameters: {\n parameters: [amplitude, mean, std, offset],\n uncertainties: [0.1, 0.1, 0.01, 0.1], // Simplified\n correlationMatrix: Array(4).fill(0).map(() => Array(4).fill(0)) // Simplified\n },\n statistics: {\n rSquared,\n adjustedRSquared,\n rmse,\n rss: residuals.reduce((sum, r) => sum + r * r, 0),\n tss: y.reduce((sum, yi) => sum + Math.pow(yi - calculateMean(y), 2), 0),\n n: x.length,\n k: 4\n },\n fittedValues: toFloat32Array(fittedValues),\n residuals: toFloat32Array(residuals),\n goodnessOfFit: rSquared > 0.9 ? 'excellent' : rSquared > 0.7 ? 'good' : rSquared > 0.5 ? 'fair' : 'poor',\n converged: true,\n iterations: maxIterations,\n processingTime: performance.now() - startTime\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction solveLeastSquares(X: number[][], y: number[], regularization: number = 0): number[] {\n const n = X.length;\n const m = X[0].length;\n \n // Compute X^T * X\n const XtX: number[][] = Array(m).fill(0).map(() => Array(m).fill(0));\n const Xty: number[] = Array(m).fill(0);\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < m; j++) {\n for (let k = 0; k < m; k++) {\n XtX[j][k] += X[i][j] * X[i][k];\n }\n Xty[j] += X[i][j] * y[i];\n }\n }\n \n // Add L2 regularization if needed\n if (regularization > 0) {\n for (let i = 0; i < m; i++) {\n XtX[i][i] += regularization;\n }\n }\n \n // Solve using Gaussian elimination\n return solveLinearSystem(XtX, Xty);\n}","/**\n * Regression Plugin - Main Implementation\n * \n * Provides advanced scientific regression and curve fitting capabilities.\n * Supports multiple regression methods with automatic model selection.\n * \n * @example\n * ```typescript\n * import { PluginRegression } from 'velo-plot/plugins/regression';\n * \n * chart.use(PluginRegression({\n * defaultMethod: 'polynomial',\n * enableAutoSelection: true,\n * modelSelectionCriteria: 'aic',\n * maxIterations: 100\n * }));\n * \n * // Fit polynomial regression\n * const result = await chart.regression.fit('series1', {\n * x: seriesData.x,\n * y: seriesData.y\n * }, 'polynomial', { degree: 3 });\n * \n * console.log(`R² = ${result.statistics.rSquared}`);\n * console.log(`Parameters: ${result.parameters.parameters}`);\n * \n * // Auto-fit best model\n * const bestFit = await chart.regression.autoFit('series1', data);\n * \n * // Visualize fit\n * chart.regression.visualizeFit('series1');\n * ```\n * \n * @packageDocumentation\n * @module plugins/regression\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n BeforeRenderEvent,\n DataUpdateEvent\n} from '../types';\n\nimport type {\n PluginRegressionConfig,\n RegressionAPI,\n RegressionResult,\n RegressionData,\n RegressionMethod,\n LinearRegressionConfig,\n PolynomialRegressionConfig,\n ExponentialRegressionConfig,\n GaussianRegressionConfig,\n RegressionCompletedEvent,\n RegressionFailedEvent,\n ModelSelectedEvent,\n RegressionStatistics\n} from './types';\n\nimport {\n linearRegression,\n polynomialRegression,\n exponentialRegression,\n gaussianRegression\n} from './algorithms';\n\n// ============================================\n// Plugin Manifest\n// ============================================\n\nconst manifestRegression: PluginManifest = {\n name: 'regression',\n version: '1.0.0',\n description: 'Advanced scientific regression and curve fitting',\n author: 'Sci Plot Team',\n provides: ['regression', 'curve-fitting', 'scientific-analysis']\n};\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_CONFIG: Required<PluginRegressionConfig> = {\n defaultMethod: 'linear',\n enableAutoSelection: false,\n modelSelectionCriteria: 'aic',\n enableWeightedRegression: false,\n enableRobustRegression: false,\n robustMethod: 'huber',\n maxIterations: 100,\n convergenceTolerance: 1e-6,\n defaultConfidenceLevel: 0.95,\n enableParallelProcessing: false,\n parallelChunkSize: 1000\n};\n\n// ============================================\n// Regression Plugin Implementation\n// ============================================\n\nexport function PluginRegression(\n userConfig: Partial<PluginRegressionConfig> = {}\n): ChartPlugin<PluginRegressionConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n \n // Results storage\n const regressionResults = new Map<string, RegressionResult[]>();\n const realtimeSeries = new Set<string>();\n const debounceTimers = new Map<string, any>();\n \n // ============================================\n // Core Regression Methods\n // ============================================\n \n async function fit(\n seriesId: string,\n data: RegressionData,\n method: RegressionMethod = config.defaultMethod,\n methodConfig: any = {}\n ): Promise<RegressionResult> {\n try {\n // Clear previous visualization before fitting new model\n api.hideVisualization(seriesId);\n \n let result: RegressionResult;\n \n switch (method) {\n case 'linear':\n result = linearRegression(data, methodConfig as LinearRegressionConfig);\n break;\n case 'polynomial':\n result = polynomialRegression(data, methodConfig as PolynomialRegressionConfig);\n break;\n case 'exponential':\n result = exponentialRegression(data, methodConfig as ExponentialRegressionConfig);\n break;\n case 'gaussian':\n result = gaussianRegression(data, methodConfig as GaussianRegressionConfig);\n break;\n case 'logarithmic':\n // Transform y = a * log(x) + b to linear\n const logX = Array.from(data.x).map(xi => Math.log(xi));\n result = linearRegression({ ...data, x: new Float32Array(logX) }, methodConfig as LinearRegressionConfig);\n result.method = 'logarithmic';\n break;\n case 'power':\n // Transform to linear: log(y) = log(a) + b * log(x)\n const logY = Array.from(data.y).map(yi => Math.log(yi));\n const logXPow = Array.from(data.x).map(xi => Math.log(xi));\n result = linearRegression({ ...data, x: new Float32Array(logXPow), y: new Float32Array(logY) }, methodConfig as LinearRegressionConfig);\n result.method = 'power';\n break;\n case 'lorentzian':\n case 'sigmoid':\n case 'custom':\n // For now, fall back to linear for unsupported methods\n result = linearRegression(data, methodConfig as LinearRegressionConfig);\n break;\n default:\n throw new Error(`Unsupported regression method: ${method}`);\n }\n \n // Clear and store new result (replace, don't accumulate)\n regressionResults.set(seriesId, [result]);\n \n // Emit event\n if (ctx) {\n ctx.events.emit('regression:completed', {\n result,\n seriesId,\n method,\n timestamp: Date.now()\n } as RegressionCompletedEvent);\n }\n \n ctx?.log.info(`Regression completed for ${seriesId}: ${method} (R² = ${result.statistics.rSquared.toFixed(3)})`);\n \n return result;\n } catch (error) {\n if (ctx) {\n ctx.events.emit('regression:failed', {\n error: error as Error,\n seriesId,\n method,\n reason: `Fitting failed: ${error}`,\n timestamp: Date.now()\n } as RegressionFailedEvent);\n }\n \n throw error;\n }\n }\n \n async function fitAndCompare(\n seriesId: string,\n data: RegressionData,\n methods: RegressionMethod[],\n configs?: any[]\n ): Promise<RegressionResult[]> {\n const results: RegressionResult[] = [];\n \n for (let i = 0; i < methods.length; i++) {\n const method = methods[i];\n const methodConfig = configs ? configs[i] : {};\n \n try {\n const result = await fit(seriesId, data, method, methodConfig);\n results.push(result);\n } catch (error) {\n ctx?.log.warn(`Regression failed for ${method}: ${error}`);\n }\n }\n \n // Sort by criteria\n const criteria = config.modelSelectionCriteria;\n results.sort((a, b) => {\n switch (criteria) {\n case 'aic':\n return (a.statistics.aic || 0) - (b.statistics.aic || 0);\n case 'bic':\n return (a.statistics.bic || 0) - (b.statistics.bic || 0);\n case 'adjusted-r2':\n return b.statistics.adjustedRSquared - a.statistics.adjustedRSquared;\n default:\n return b.statistics.rSquared - a.statistics.rSquared;\n }\n });\n \n return results;\n }\n \n async function autoFit(\n seriesId: string,\n data: RegressionData,\n candidateMethods: RegressionMethod[] = ['linear', 'polynomial', 'exponential', 'gaussian']\n ): Promise<RegressionResult> {\n const configs = candidateMethods.map(method => {\n switch (method) {\n case 'polynomial':\n return { degree: 2 } as PolynomialRegressionConfig;\n case 'exponential':\n return {} as ExponentialRegressionConfig;\n case 'gaussian':\n return {} as GaussianRegressionConfig;\n default:\n return {} as LinearRegressionConfig;\n }\n });\n \n const results = await fitAndCompare(seriesId, data, candidateMethods, configs);\n \n if (results.length === 0) {\n throw new Error('No regression methods succeeded');\n }\n \n const bestResult = results[0];\n \n // Emit model selection event\n if (ctx) {\n ctx.events.emit('model:selected', {\n selectedMethod: bestResult.method,\n candidateResults: results,\n selectionCriteria: config.modelSelectionCriteria,\n seriesId,\n timestamp: Date.now()\n } as ModelSelectedEvent);\n }\n \n ctx?.log.info(`Auto-fit selected ${bestResult.method} for ${seriesId} (R² = ${bestResult.statistics.rSquared.toFixed(3)})`);\n \n return bestResult;\n }\n \n // ============================================\n // API Implementation\n // ============================================\n \n const api: RegressionAPI & Record<string, unknown> = {\n fit,\n \n fitAndCompare,\n \n autoFit,\n \n getResults(seriesId: string): RegressionResult[] {\n return regressionResults.get(seriesId) || [];\n },\n \n clearResults(seriesId: string): void {\n regressionResults.delete(seriesId);\n ctx?.log.info(`Regression results cleared for series: ${seriesId}`);\n },\n \n predict(\n seriesId: string,\n xValues: Float32Array | Float64Array | number[],\n resultIndex = 0\n ): Float32Array {\n const results = regressionResults.get(seriesId);\n if (!results || results.length === 0) {\n throw new Error(`No regression results found for series: ${seriesId}`);\n }\n \n const result = results[Math.min(resultIndex, results.length - 1)];\n const x = Array.from(xValues);\n const params = result.parameters.parameters;\n \n const predictions = x.map(xi => {\n switch (result.method) {\n case 'linear':\n return params[0] * xi + (params[1] || 0);\n case 'polynomial':\n let value = 0;\n for (let j = 0; j < params.length; j++) {\n value += params[j] * Math.pow(xi, j);\n }\n return value;\n case 'exponential':\n return params[0] * Math.exp(params[1] * xi) + (params[2] || 0);\n case 'gaussian':\n const exponent = -Math.pow(xi - params[1], 2) / (2 * params[2] * params[2]);\n return params[0] * Math.exp(exponent) + (params[3] || 0);\n case 'logarithmic':\n return params[0] * Math.log(xi) + (params[1] || 0);\n case 'power':\n return params[0] * Math.pow(xi, params[1]);\n default:\n return 0;\n }\n });\n \n return new Float32Array(predictions);\n },\n \n getConfidenceIntervals(\n seriesId: string,\n xValues: Float32Array | Float64Array | number[],\n _level = config.defaultConfidenceLevel,\n resultIndex = 0\n ): { lower: Float32Array; upper: Float32Array } {\n // Simplified confidence intervals\n const predictions = this.predict(seriesId, xValues, resultIndex);\n const margin = 0.1; // Simplified margin\n \n const lower = predictions.map(p => p - margin);\n const upper = predictions.map(p => p + margin);\n \n return {\n lower: new Float32Array(lower),\n upper: new Float32Array(upper)\n };\n },\n \n evaluate(seriesId: string, data: RegressionData, resultIndex = 0): RegressionStatistics {\n const results = regressionResults.get(seriesId);\n if (!results || results.length === 0) {\n throw new Error(`No regression results found for series: ${seriesId}`);\n }\n \n const result = results[Math.min(resultIndex, results.length - 1)];\n const x = Array.from(data.x);\n const y = Array.from(data.y);\n \n // Use existing model to predict\n const predictions = api.predict(seriesId, x, resultIndex);\n const predArray = Array.from(predictions);\n \n const rSquared = calculateRSquared(y, predArray);\n const adjustedRSquared = calculateAdjustedRSquared(rSquared, y.length, result.parameters.parameters.length);\n const rmse = calculateRMSE(y, predArray);\n \n return {\n rSquared,\n adjustedRSquared,\n rmse,\n rss: y.reduce((sum, yi, i) => sum + Math.pow(yi - predArray[i], 2), 0),\n tss: y.reduce((sum, yi) => sum + Math.pow(yi - calculateMean(y), 2), 0),\n n: y.length,\n k: result.parameters.parameters.length\n };\n },\n \n enableRealtimeFitting(\n seriesId: string,\n method: RegressionMethod = config.defaultMethod,\n methodConfig: any = {}\n ): void {\n realtimeSeries.add(seriesId);\n \n // Run initial fitting\n const chart = ctx?.chart;\n if (chart) {\n const series = chart.getSeries(seriesId);\n if (series) {\n const data = series.getData();\n if (data && data.x.length > 0) {\n fit(seriesId, {\n x: data.x,\n y: data.y\n }, method, methodConfig);\n }\n }\n }\n \n ctx?.log.info(`Real-time regression fitting enabled for series: ${seriesId}`);\n },\n \n disableRealtimeFitting(seriesId: string): void {\n realtimeSeries.delete(seriesId);\n \n // Clear debounce timer\n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n debounceTimers.delete(seriesId);\n }\n \n ctx?.log.info(`Real-time regression fitting disabled for series: ${seriesId}`);\n },\n \n getStatistics(seriesId?: string) {\n if (seriesId) {\n const results = regressionResults.get(seriesId) || [];\n const methodsUsed: Record<RegressionMethod, number> = {} as any;\n \n for (const result of results) {\n methodsUsed[result.method] = (methodsUsed[result.method] || 0) + 1;\n }\n \n return {\n totalFittings: results.length,\n methodsUsed,\n averageRSquared: results.length > 0 ? results.reduce((sum, r) => sum + r.statistics.rSquared, 0) / results.length : 0,\n averageProcessingTime: results.length > 0 ? results.reduce((sum, r) => sum + r.processingTime, 0) / results.length : 0\n };\n } else {\n // Global statistics\n let totalFittings = 0;\n const allMethodsUsed: Record<RegressionMethod, number> = {} as any;\n const allRSquared: number[] = [];\n const allProcessingTimes: number[] = [];\n \n for (const results of regressionResults.values()) {\n totalFittings += results.length;\n allRSquared.push(...results.map(r => r.statistics.rSquared));\n allProcessingTimes.push(...results.map(r => r.processingTime));\n \n for (const result of results) {\n allMethodsUsed[result.method] = (allMethodsUsed[result.method] || 0) + 1;\n }\n }\n \n return {\n totalFittings,\n methodsUsed: allMethodsUsed,\n averageRSquared: allRSquared.length > 0 ? allRSquared.reduce((sum, r) => sum + r, 0) / allRSquared.length : 0,\n averageProcessingTime: allProcessingTimes.length > 0 ? allProcessingTimes.reduce((sum, t) => sum + t, 0) / allProcessingTimes.length : 0\n };\n }\n },\n \n updateConfig: (newConfig: Partial<PluginRegressionConfig>) => {\n Object.assign(config, newConfig);\n },\n \n getConfig: () => ({ ...config }),\n \n visualizeFit(seriesId: string, resultIndex = 0): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const results = regressionResults.get(seriesId);\n if (!results || results.length === 0) return;\n \n const result = results[Math.min(resultIndex, results.length - 1)];\n const series = chart.getSeries(seriesId);\n if (!series) return;\n \n const data = series.getData();\n if (!data) return;\n \n // Remove existing fit visualization\n this.hideVisualization(seriesId);\n \n // Add fitted curve\n const fitSeriesId = `${seriesId}_fit_${result.method}`;\n const fittedValues = api.predict(seriesId, data.x, resultIndex);\n \n chart.addSeries({\n id: fitSeriesId,\n type: 'line',\n data: {\n x: new Float32Array(Array.from(data.x)),\n y: new Float32Array(fittedValues)\n },\n style: {\n color: '#ff6b6b',\n width: 2,\n opacity: 0.8,\n lineDash: [5, 5]\n }\n });\n \n // Add equation annotation\n const equation = formatEquation(result);\n const annotationId = `${seriesId}_equation_${result.method}`;\n \n chart.addAnnotation({\n id: annotationId,\n type: 'text',\n text: `${result.method.toUpperCase()}: ${equation}\\\\nR² = ${result.statistics.rSquared.toFixed(3)}`,\n x: data.x[0],\n y: Math.max(...Array.from(fittedValues)),\n style: {\n color: '#ff6b6b',\n fontSize: 12,\n backgroundColor: 'rgba(255, 255, 255, 0.9)'\n }\n } as any);\n },\n \n hideVisualization(seriesId: string): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n // List all possible regression methods to ensure cleanup\n const allMethods: RegressionMethod[] = [\n 'linear', 'polynomial', 'exponential', 'gaussian', \n 'logarithmic', 'power', 'lorentzian', 'sigmoid', 'custom'\n ];\n \n for (const method of allMethods) {\n // Remove fit series\n const fitSeriesId = `${seriesId}_fit_${method}`;\n if (chart.getSeries(fitSeriesId)) {\n chart.removeSeries(fitSeriesId);\n }\n \n // Remove equation annotation\n const annotationId = `${seriesId}_equation_${method}`;\n if (chart.getAnnotation(annotationId)) {\n chart.removeAnnotation(annotationId);\n }\n }\n },\n \n exportResults(seriesId: string, format = 'json'): string {\n const results = regressionResults.get(seriesId) || [];\n \n switch (format) {\n case 'json':\n return JSON.stringify(results, null, 2);\n case 'csv':\n let csv = 'Method,R²,RMSE,Parameters,ProcessingTime\\n';\n for (const result of results) {\n csv += `${result.method},${result.statistics.rSquared},${result.statistics.rmse},\"${result.parameters.parameters.join(', ')}\",${result.processingTime}\\n`;\n }\n return csv;\n case 'matlab':\n let matlab = `% Regression results for ${seriesId}\\n`;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n matlab += `result${i + 1}.method = '${result.method}';\\n`;\n matlab += `result${i + 1}.rSquared = ${result.statistics.rSquared};\\n`;\n matlab += `result${i + 1}.parameters = [${result.parameters.parameters.join(', ')}];\\n`;\n }\n return matlab;\n default:\n return JSON.stringify(results, null, 2);\n }\n }\n };\n \n // ============================================\n // Helper Functions\n // ============================================\n \n function calculateMean(data: number[]): number {\n return data.reduce((sum, val) => sum + val, 0) / data.length;\n }\n \n function calculateRSquared(observed: number[], fitted: number[]): number {\n const meanObserved = calculateMean(observed);\n let ssRes = 0;\n let ssTot = 0;\n \n for (let i = 0; i < observed.length; i++) {\n ssRes += Math.pow(observed[i] - fitted[i], 2);\n ssTot += Math.pow(observed[i] - meanObserved, 2);\n }\n \n return 1 - (ssRes / ssTot);\n }\n \n function calculateAdjustedRSquared(rSquared: number, n: number, k: number): number {\n return 1 - ((1 - rSquared) * (n - 1)) / (n - k - 1);\n }\n \n function calculateRMSE(observed: number[], fitted: number[]): number {\n let sumSquaredErrors = 0;\n for (let i = 0; i < observed.length; i++) {\n sumSquaredErrors += Math.pow(observed[i] - fitted[i], 2);\n }\n return Math.sqrt(sumSquaredErrors / observed.length);\n }\n \n function formatEquation(result: RegressionResult): string {\n const params = result.parameters.parameters;\n \n switch (result.method) {\n case 'linear':\n return params.length === 1 ? `y = ${params[0].toFixed(3)}x` : `y = ${params[0].toFixed(3)}x + ${params[1].toFixed(3)}`;\n case 'polynomial':\n let equation = 'y = ';\n for (let i = params.length - 1; i >= 0; i--) {\n if (params[i] !== 0) {\n if (i === 0) {\n equation += params[i].toFixed(3);\n } else if (i === 1) {\n equation += `${params[i].toFixed(3)}x + `;\n } else {\n equation += `${params[i].toFixed(3)}x^${i} + `;\n }\n }\n }\n return equation.replace(' + ', '').trim();\n case 'exponential':\n return `y = ${params[0].toFixed(3)} * exp(${params[1].toFixed(3)}x) + ${params[2]?.toFixed(3) || 0}`;\n case 'gaussian':\n return `y = ${params[0].toFixed(3)} * exp(-((x - ${params[1].toFixed(3)})² / (2 * ${params[2].toFixed(3)}²))) + ${params[3]?.toFixed(3) || 0}`;\n default:\n return 'y = f(x, parameters)';\n }\n }\n \n // ============================================\n // Event Handlers\n // ============================================\n \n function handleDataUpdate(context: PluginContext, event: DataUpdateEvent): void {\n const { seriesId } = event;\n \n if (realtimeSeries.has(seriesId)) {\n // Debounce fitting\n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n }\n \n const newTimer = setTimeout(() => {\n const chart = context.chart;\n if (chart) {\n const series = chart.getSeries(seriesId);\n if (series) {\n const data = series.getData();\n if (data && data.x.length > 0) {\n fit(seriesId, {\n x: data.x,\n y: data.y\n });\n \n // Update visualization\n api.visualizeFit(seriesId);\n }\n }\n }\n }, 500); // 500ms debounce\n \n debounceTimers.set(seriesId, newTimer);\n }\n }\n \n // ============================================\n // Plugin Definition\n // ============================================\n \n return {\n manifest: manifestRegression,\n \n onInit(context: PluginContext) {\n ctx = context;\n ctx.log.info('Regression plugin initialized');\n },\n \n onConfigChange(_context: PluginContext, _newConfig: PluginRegressionConfig) {\n // Handle config changes\n },\n \n onBeforeRender(_context: PluginContext, _event: BeforeRenderEvent) {\n // Handle pre-render tasks if needed\n },\n \n onDataUpdate: handleDataUpdate,\n \n onDestroy(_context: PluginContext) {\n // Clean up timers\n for (const timer of debounceTimers.values()) {\n clearTimeout(timer);\n }\n debounceTimers.clear();\n \n // Clear results\n regressionResults.clear();\n realtimeSeries.clear();\n },\n \n api\n };\n}\n\nexport default PluginRegression;\n\n// Re-export types for convenience\nexport type {\n RegressionMethod,\n RegressionData,\n RegressionParameters,\n RegressionStatistics,\n RegressionResult,\n LinearRegressionConfig,\n PolynomialRegressionConfig,\n ExponentialRegressionConfig,\n LogarithmicRegressionConfig,\n PowerRegressionConfig,\n GaussianRegressionConfig,\n LorentzianRegressionConfig,\n SigmoidRegressionConfig,\n CustomRegressionConfig,\n PluginRegressionConfig,\n RegressionCompletedEvent,\n RegressionFailedEvent,\n ModelSelectedEvent,\n RegressionAPI\n} from './types';","import type { \n PluginRadarConfig, \n RadarAPI, \n RadarSeriesData, \n RadarPoint \n} from './types';\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n AfterRenderEvent\n} from '../types';\n\nconst manifestRadar: PluginManifest = {\n name: \"velo-plot-radar\",\n version: \"1.0.0\",\n description: \"Advanced Radar/Spider Charts for velo-plot\",\n provides: [\"radar\", \"spider-chart\"],\n tags: [\"radar\", \"visualization\", \"comparison\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginRadarConfig> = {\n categories: [],\n maxValue: 100,\n minValue: 0,\n gridLevels: 5,\n showLabels: true,\n labelStyle: {\n fontSize: 12,\n color: '#94a3b8',\n fontFamily: 'Inter, system-ui, sans-serif'\n },\n gridStyle: {\n color: 'rgba(255, 255, 255, 0.1)',\n width: 1,\n lineDash: []\n }\n};\n\nexport function PluginRadar(\n userConfig: Partial<PluginRadarConfig> = {}\n): ChartPlugin<PluginRadarConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n const radarSeries = new Map<string, RadarSeriesData>();\n\n // ============================================\n // Drawing Logic\n // ============================================\n\n function drawRadar(pCtx: PluginContext) {\n const { render } = pCtx;\n const { ctx2d, plotArea } = render;\n\n if (!ctx2d) return;\n\n const centerX = plotArea.x + plotArea.width / 2;\n const centerY = plotArea.y + plotArea.height / 2;\n const maxRadiusPixels = Math.min(plotArea.width, plotArea.height) / 2 * 0.8;\n const numCategories = config.categories.length;\n \n if (numCategories === 0) return;\n const angleStep = (2 * Math.PI) / numCategories;\n\n ctx2d.save();\n \n // 1. Draw Grid (Levels)\n ctx2d.strokeStyle = config.gridStyle?.color || 'rgba(255, 255, 255, 0.1)';\n ctx2d.lineWidth = config.gridStyle?.width || 1;\n if (config.gridStyle?.lineDash && config.gridStyle.lineDash.length > 0) {\n ctx2d.setLineDash(config.gridStyle.lineDash);\n }\n\n for (let level = 1; level <= config.gridLevels; level++) {\n const radius = (level / config.gridLevels) * maxRadiusPixels;\n ctx2d.beginPath();\n for (let i = 0; i < numCategories; i++) {\n const angle = i * angleStep - Math.PI / 2;\n const px = centerX + radius * Math.cos(angle);\n const py = centerY + radius * Math.sin(angle);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n ctx2d.closePath();\n ctx2d.stroke();\n }\n\n // 2. Draw Spokes and Labels\n ctx2d.setLineDash([]);\n for (let i = 0; i < numCategories; i++) {\n const angle = i * angleStep - Math.PI / 2;\n const px = centerX + maxRadiusPixels * Math.cos(angle);\n const py = centerY + maxRadiusPixels * Math.sin(angle);\n \n ctx2d.beginPath();\n ctx2d.moveTo(centerX, centerY);\n ctx2d.lineTo(px, py);\n ctx2d.stroke();\n\n if (config.showLabels) {\n const labelRadius = maxRadiusPixels + 25;\n const lx = centerX + labelRadius * Math.cos(angle);\n const ly = centerY + labelRadius * Math.sin(angle);\n \n ctx2d.fillStyle = config.labelStyle?.color || '#94a3b8';\n ctx2d.font = `${config.labelStyle?.fontSize || 12}px ${config.labelStyle?.fontFamily || 'sans-serif'}`;\n ctx2d.textAlign = Math.abs(Math.cos(angle)) < 0.1 ? \"center\" : (Math.cos(angle) > 0 ? \"left\" : \"right\");\n ctx2d.textBaseline = Math.abs(Math.sin(angle)) < 0.1 ? \"middle\" : (Math.sin(angle) > 0 ? \"top\" : \"bottom\");\n ctx2d.fillText(config.categories[i], lx, ly);\n }\n }\n\n // 3. Draw Radar Series\n radarSeries.forEach((series) => {\n const { points, style } = series;\n if (points.length === 0) return;\n\n const pathPoints: { x: number, y: number }[] = [];\n \n config.categories.forEach((cat, idx) => {\n const point = points.find(p => p.category === cat);\n const val = point ? point.value : 0;\n const radius = (val / config.maxValue) * maxRadiusPixels;\n const angle = idx * angleStep - Math.PI / 2;\n \n pathPoints.push({\n x: centerX + radius * Math.cos(angle),\n y: centerY + radius * Math.sin(angle)\n });\n });\n\n ctx2d.beginPath();\n pathPoints.forEach((p, i) => {\n if (i === 0) ctx2d.moveTo(p.x, p.y);\n else ctx2d.lineTo(p.x, p.y);\n });\n ctx2d.closePath();\n \n ctx2d.fillStyle = style?.fillColor || (style?.color ? `${style.color}33` : 'rgba(0, 242, 255, 0.2)');\n ctx2d.fill();\n \n ctx2d.strokeStyle = style?.color || '#00f2ff';\n ctx2d.lineWidth = style?.width || 2;\n ctx2d.globalAlpha = style?.opacity || 1;\n ctx2d.stroke();\n\n if ((style?.pointSize || 0) > 0) {\n ctx2d.fillStyle = style?.color || '#00f2ff';\n pathPoints.forEach(p => {\n ctx2d.beginPath();\n ctx2d.arc(p.x, p.y, style!.pointSize! / 2, 0, Math.PI * 2);\n ctx2d.fill();\n });\n }\n });\n\n ctx2d.restore();\n }\n\n // ============================================\n // Plugin API\n // ============================================\n\n const api: RadarAPI & Record<string, unknown> = {\n addSeries(data: RadarSeriesData) {\n radarSeries.set(data.id, data);\n ctx?.requestRender();\n return data.id;\n },\n removeSeries(id: string) {\n const res = radarSeries.delete(id);\n if (res) ctx?.requestRender();\n return res;\n },\n updateSeries(id: string, points: RadarPoint[]) {\n const series = radarSeries.get(id);\n if (series) {\n series.points = points;\n ctx?.requestRender();\n return true;\n }\n return false;\n },\n setCategories(categories: string[]) {\n config.categories = categories;\n ctx?.requestRender();\n },\n setMaxValue(value: number) {\n config.maxValue = value;\n ctx?.requestRender();\n }\n };\n\n return {\n manifest: manifestRadar,\n\n onInit(c: PluginContext) {\n ctx = c;\n // Setup the chart for Radar (centered origin, fixed bounds)\n ctx.chart.updateXAxis({ visible: false, min: -1.2, max: 1.2 });\n ctx.chart.updateYAxis('default', { visible: false, min: -1.2, max: 1.2 });\n },\n\n onRenderOverlay(pCtx: PluginContext, _event: AfterRenderEvent) {\n drawRadar(pCtx);\n },\n\n api\n };\n}\n\nexport default PluginRadar;\n\nexport type { \n PluginRadarConfig, \n RadarAPI, \n RadarSeriesData, \n RadarPoint \n} from './types';\n","/**\n * SciPlot - 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 * SciPlot 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 // 2. High-res re-render if scale > 1\n // We temporarily boost the device pixel ratio to force a higher resolution render\n if (scale > 1) {\n chart.setDPR(originalDPR * scale);\n // Wait for DOM and GL updates\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 chart.setDPR(originalDPR);\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","/**\n * PluginDataTransform - Implementation\n * \n * Provides a pipeline-based data transformation system for Sci Plot.\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n} from '../types';\n\nimport type {\n PluginDataTransformConfig,\n DataTransformAPI,\n TransformOp\n} from './types';\n\n// Import algorithms from analysis plugin where available\nimport { \n movingAverage, \n derivative as calcDerivative, \n cumulativeIntegral as calcIntegral,\n subtractBaseline\n} from '../analysis';\n\nimport { Series } from '../../core/series/Series';\n\nconst manifest: PluginManifest = {\n name: 'data-transform',\n version: '1.0.0',\n description: 'Advanced data transformation pipeline',\n provides: ['data-transform', 'processing'],\n author: 'Sci Plot Team'\n};\n\nexport function PluginDataTransform(\n userConfig: Partial<PluginDataTransformConfig> = {}\n): ChartPlugin<PluginDataTransformConfig> {\n const _config: Required<PluginDataTransformConfig> = {\n autoApply: false,\n createDerivativeSeries: false,\n precision: 6,\n ...userConfig\n };\n\n let ctx: PluginContext | null = null;\n const originalDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n /**\n * Core transformation logic\n */\n async function applyTransform(\n seriesId: string, \n pipeline: TransformOp[]\n ): Promise<void> {\n if (!ctx) return;\n \n const chart = ctx.chart;\n const series = chart.getSeries(seriesId) as unknown as Series;\n if (!series) {\n throw new Error(`Series ${seriesId} not found`);\n }\n\n // Capture original data if not already captured\n if (!originalDataStore.has(seriesId)) {\n const currentData = series.getData();\n originalDataStore.set(seriesId, {\n x: new Float32Array(currentData.x.buffer.slice(0)),\n y: new Float32Array(currentData.y.buffer.slice(0))\n });\n }\n\n const original = originalDataStore.get(seriesId)!;\n let x = new Float32Array(original.x.buffer.slice(0));\n let y = new Float32Array(original.y.buffer.slice(0));\n\n // Apply pipeline\n for (const op of pipeline) {\n const result = await executeOp(x, y, op);\n x = result.x;\n y = result.y;\n }\n\n // Update series with transformed data\n chart.updateSeries(seriesId, { x, y });\n }\n\n async function executeOp(\n x: Float32Array, \n y: Float32Array, \n op: TransformOp\n ): Promise<{ x: Float32Array; y: Float32Array }> {\n const params = op.parameters || (op as any);\n\n switch (op.type) {\n case 'normalize': {\n const range = params.range || [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < y.length; i++) {\n if (y[i] < min) min = y[i];\n if (y[i] > max) max = y[i];\n }\n const rangeWidth = max - min;\n const targetRange = range[1] - range[0];\n const newY = new Float32Array(y.length);\n if (rangeWidth === 0) {\n newY.fill(range[0]);\n } else {\n for (let i = 0; i < y.length; i++) {\n newY[i] = range[0] + ((y[i] - min) / rangeWidth) * targetRange;\n }\n }\n return { x, y: newY };\n }\n\n case 'smooth':\n case 'moving-average': {\n const window = params.window || 5;\n const smoothedY = movingAverage(y, window);\n return { x, y: smoothedY };\n }\n\n case 'derivative': {\n const order = params.order || 1;\n let dy = y;\n for (let i = 0; i < order; i++) {\n dy = calcDerivative(x, dy);\n }\n return { x, y: dy };\n }\n\n case 'integral': {\n const iy = calcIntegral(x, y);\n return { x, y: iy };\n }\n\n case 'scale-offset': {\n const scale = params.scale ?? 1;\n const offset = params.offset ?? 0;\n const newY = new Float32Array(y.length);\n for (let i = 0; i < y.length; i++) {\n newY[i] = y[i] * scale + offset;\n }\n return { x, y: newY };\n }\n\n case 'resample': {\n const points = params.points || 1000;\n return resample(x, y, points);\n }\n\n case 'baseline-removal': {\n const x1 = params.x1 ?? x[0];\n const x2 = params.x2 ?? x[x.length - 1];\n const result = subtractBaseline(x, y, x1, x2);\n return { x, y: result };\n }\n\n case 'abs': {\n const newY = y.map(v => Math.abs(v));\n return { x, y: newY };\n }\n\n case 'log': {\n const base = params.base || Math.E;\n const logBase = Math.log(base);\n const newY = y.map(v => v > 0 ? Math.log(v) / logBase : 0);\n return { x, y: newY };\n }\n\n case 'power': {\n const exp = params.exponent || 2;\n const newY = y.map(v => Math.pow(v, exp));\n return { x, y: newY };\n }\n\n default:\n console.warn(`Unknown transform type: ${op.type}`);\n return { x, y };\n }\n }\n\n function resample(\n x: Float32Array, \n y: Float32Array, \n numPoints: number\n ): { x: Float32Array; y: Float32Array } {\n if (x.length <= 1 || numPoints <= 1) return { x, y };\n \n const newX = new Float32Array(numPoints);\n const newY = new Float32Array(numPoints);\n \n const xMin = x[0];\n const xMax = x[x.length - 1];\n const dx = (xMax - xMin) / (numPoints - 1);\n \n for (let i = 0; i < numPoints; i++) {\n const targetX = xMin + i * dx;\n newX[i] = targetX;\n \n let low = 0;\n let high = x.length - 2;\n let found = 0;\n \n while (low <= high) {\n const mid = (low + high) >> 1;\n if (x[mid] <= targetX && targetX <= x[mid + 1]) {\n found = mid;\n break;\n }\n if (x[mid] < targetX) low = mid + 1;\n else high = mid - 1;\n }\n \n const x0 = x[found];\n const x1 = x[found + 1];\n const y0 = y[found];\n const y1 = y[found + 1];\n const t = (targetX - x0) / (x1 - x0);\n newY[i] = y0 + t * (y1 - y0);\n }\n \n return { x: newX, y: newY };\n }\n\n const api: DataTransformAPI & Record<string, unknown> = {\n transform: applyTransform,\n \n resetTransform(seriesId: string) {\n if (originalDataStore.has(seriesId) && ctx) {\n const original = originalDataStore.get(seriesId)!;\n ctx.chart.updateSeries(seriesId, { x: original.x, y: original.y });\n originalDataStore.delete(seriesId);\n }\n },\n \n getOriginalData(seriesId: string) {\n return originalDataStore.get(seriesId) || null;\n }\n };\n\n return {\n manifest,\n onInit(context: PluginContext) {\n ctx = context;\n ctx.log?.info(`DataTransform plugin initialized (precision: ${_config.precision})`);\n },\n onDestroy() {\n originalDataStore.clear();\n ctx = null;\n },\n api\n };\n}\n\nexport default PluginDataTransform;\n\nexport type {\n TransformType,\n TransformOp,\n PluginDataTransformConfig,\n DataTransformAPI\n} from './types';\n","/**\n * @fileoverview Greek letters and mathematical symbols for LaTeX rendering\n * @module plugins/latex/symbols\n */\n\n/**\n * Greek letters mapping (lowercase)\n */\nexport const GREEK_LOWERCASE: Record<string, string> = {\n alpha: 'α',\n beta: 'β',\n gamma: 'γ',\n delta: 'δ',\n epsilon: 'ε',\n zeta: 'ζ',\n eta: 'η',\n theta: 'θ',\n iota: 'ι',\n kappa: 'κ',\n lambda: 'λ',\n mu: 'μ',\n nu: 'ν',\n xi: 'ξ',\n omicron: 'ο',\n pi: 'π',\n rho: 'ρ',\n sigma: 'σ',\n tau: 'τ',\n upsilon: 'υ',\n phi: 'φ',\n chi: 'χ',\n psi: 'ψ',\n omega: 'ω',\n};\n\n/**\n * Greek letters mapping (uppercase)\n */\nexport const GREEK_UPPERCASE: Record<string, string> = {\n Alpha: 'Α',\n Beta: 'Β',\n Gamma: 'Γ',\n Delta: 'Δ',\n Epsilon: 'Ε',\n Zeta: 'Ζ',\n Eta: 'Η',\n Theta: 'Θ',\n Iota: 'Ι',\n Kappa: 'Κ',\n Lambda: 'Λ',\n Mu: 'Μ',\n Nu: 'Ν',\n Xi: 'Ξ',\n Omicron: 'Ο',\n Pi: 'Π',\n Rho: 'Ρ',\n Sigma: 'Σ',\n Tau: 'Τ',\n Upsilon: 'Υ',\n Phi: 'Φ',\n Chi: 'Χ',\n Psi: 'Ψ',\n Omega: 'Ω',\n};\n\n/**\n * Mathematical operators\n */\nexport const MATH_OPERATORS: Record<string, string> = {\n sum: '∑',\n prod: '∏',\n int: '∫',\n oint: '∮',\n partial: '∂',\n nabla: '∇',\n infty: '∞',\n hbar: 'ℏ',\n pm: '±',\n mp: '∓',\n times: '×',\n div: '÷',\n cdot: '·',\n ast: '∗',\n star: '⋆',\n circ: '∘',\n bullet: '•',\n cap: '∩',\n cup: '∪',\n vee: '∨',\n wedge: '∧',\n oplus: '⊕',\n otimes: '⊗',\n equiv: '≡',\n cong: '≅',\n approx: '≈',\n propto: '∝',\n neq: '≠',\n leq: '≤',\n geq: '≥',\n ll: '≪',\n gg: '≫',\n subset: '⊂',\n supset: '⊃',\n subseteq: '⊆',\n supseteq: '⊇',\n in: '∈',\n notin: '∉',\n ni: '∋',\n forall: '∀',\n exists: '∃',\n emptyset: '∅',\n neg: '¬',\n angle: '∠',\n perp: '⊥',\n parallel: '∥',\n rightarrow: '→',\n leftarrow: '←',\n leftrightarrow: '↔',\n Rightarrow: '⇒',\n Leftarrow: '⇐',\n Leftrightarrow: '⇔',\n mapsto: '↦',\n to: '→',\n langle: '⟨',\n rangle: '⟩',\n rightleftharpoons: '⇌',\n log: 'log',\n ln: 'ln',\n sin: 'sin',\n cos: 'cos',\n tan: 'tan',\n};\n\n/**\n * All symbols combined\n */\nexport const ALL_SYMBOLS: Record<string, string> = {\n ...GREEK_LOWERCASE,\n ...GREEK_UPPERCASE,\n ...MATH_OPERATORS,\n};\n\n/**\n * Get Unicode symbol for a LaTeX command\n */\nexport function getSymbol(command: string): string | undefined {\n return ALL_SYMBOLS[command];\n}\n\n/**\n * Check if a command is a known symbol\n */\nexport function isSymbol(command: string): boolean {\n return command in ALL_SYMBOLS;\n}\n","/**\n * @fileoverview Simple LaTeX parser for mathematical expressions\n * @module plugins/latex/parser\n */\n\nimport { LaTeXNode } from './types';\nimport { getSymbol, isSymbol } from './symbols';\n\n/**\n * Parse LaTeX string into an abstract syntax tree\n */\nexport function parseLaTeX(latex: string): LaTeXNode[] {\n const tokens = tokenize(latex);\n return parseTokens(tokens);\n}\n\n/**\n * Extract text content from nodes recursively\n */\nfunction extractTextContent(nodes: LaTeXNode[]): string {\n let result = '';\n for (const node of nodes) {\n if (node.type === 'text' || node.type === 'textgroup') {\n result += node.content || '';\n } else if (node.type === 'symbol') {\n result += node.content || '';\n } else if (node.children) {\n result += extractTextContent(node.children);\n }\n }\n return result;\n}\n\n/**\n * Tokenize LaTeX string\n */\nfunction tokenize(latex: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n\n while (i < latex.length) {\n const char = latex[i];\n\n // Backslash indicates a command\n if (char === '\\\\') {\n let command = '';\n i++;\n // Read command name (letters only)\n while (i < latex.length && /[a-zA-Z]/.test(latex[i])) {\n command += latex[i];\n i++;\n }\n if (command) {\n tokens.push('\\\\' + command);\n } else {\n // Single character command like \\{\n if (i < latex.length) {\n tokens.push('\\\\' + latex[i]);\n i++;\n }\n }\n }\n // Special characters that should be separate tokens\n else if (char === '{' || char === '}' || char === '^' || char === '_') {\n tokens.push(char);\n i++;\n }\n // Whitespace: preserve as single space token for text commands\n else if (/\\s/.test(char)) {\n tokens.push(' ');\n i++;\n // Skip additional whitespace\n while (i < latex.length && /\\s/.test(latex[i])) {\n i++;\n }\n }\n // Single characters: keep separate for proper subscript/superscript handling\n else {\n // Group text only if we're in a \"text\" context (not math/chemistry)\n // For chemistry formulas, keep each letter/digit separate\n tokens.push(char);\n i++;\n }\n }\n\n return tokens;\n}\n\n/**\n * Parse tokens into AST nodes\n */\nfunction parseTokens(tokens: string[]): LaTeXNode[] {\n const nodes: LaTeXNode[] = [];\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n // Superscript\n if (token === '^') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'superscript',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Subscript\n else if (token === '_') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'subscript',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Commands\n else if (token.startsWith('\\\\')) {\n const command = token.substring(1);\n\n // Fraction\n if (command === 'frac') {\n i++;\n const numerator = parseGroup(tokens, i);\n i = numerator.nextIndex;\n const denominator = parseGroup(tokens, i);\n i = denominator.nextIndex;\n nodes.push({\n type: 'fraction',\n numerator: numerator.nodes,\n denominator: denominator.nodes,\n });\n }\n // Square root\n else if (command === 'sqrt') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'sqrt',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Text command - render as a single grouped string for proper kerning\n else if (command === 'text') {\n i++;\n const content = parseGroup(tokens, i);\n // Concatenate all text content from the group into a single string\n const textContent = extractTextContent(content.nodes);\n nodes.push({\n type: 'textgroup',\n content: textContent,\n });\n i = content.nextIndex;\n }\n // Symbol\n else if (isSymbol(command)) {\n nodes.push({\n type: 'symbol',\n content: getSymbol(command),\n });\n i++;\n }\n // Common operators that might be commands\n else if (command === 'times' || command === 'cdot' || command === 'pm' || command === 'mp') {\n nodes.push({\n type: 'symbol',\n content: getSymbol(command),\n });\n i++;\n }\n // Unknown command - treat as text\n else {\n nodes.push({\n type: 'text',\n content: token,\n });\n i++;\n }\n }\n // Group start\n else if (token === '{') {\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'group',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Regular text\n else {\n nodes.push({\n type: 'text',\n content: token,\n });\n i++;\n }\n }\n\n return nodes;\n}\n\n/**\n * Parse a grouped expression (inside braces)\n */\nfunction parseGroup(\n tokens: string[],\n startIndex: number\n): { nodes: LaTeXNode[]; nextIndex: number } {\n // If next token is not a brace, treat single token as group\n if (tokens[startIndex] !== '{') {\n return {\n nodes: [\n {\n type: 'text',\n content: tokens[startIndex] || '',\n },\n ],\n nextIndex: startIndex + 1,\n };\n }\n\n // Skip opening brace\n let i = startIndex + 1;\n const groupTokens: string[] = [];\n let braceDepth = 1;\n\n // Collect tokens until matching closing brace\n while (i < tokens.length && braceDepth > 0) {\n const token = tokens[i];\n if (token === '{') {\n braceDepth++;\n groupTokens.push(token);\n } else if (token === '}') {\n braceDepth--;\n if (braceDepth > 0) {\n groupTokens.push(token);\n }\n } else {\n groupTokens.push(token);\n }\n i++;\n }\n\n return {\n nodes: parseTokens(groupTokens),\n nextIndex: i,\n };\n}\n","/**\n * @fileoverview LaTeX renderer using native Canvas API\n * @module plugins/latex/renderer\n */\n\nimport { LaTeXNode, LaTeXRenderContext, LaTeXDimensions } from './types';\n\n/**\n * Render a list of LaTeX nodes to canvas\n */\nexport function renderNodes(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n let currentX = ctx.x;\n let maxAscent = 0;\n let maxDescent = 0;\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n // Check if we have adjacent subscript and superscript (stacking)\n const isSub = node.type === 'subscript';\n const isSuper = node.type === 'superscript';\n const nextNode = nodes[i + 1];\n const isNextSub = nextNode?.type === 'subscript';\n const isNextSuper = nextNode?.type === 'superscript';\n\n if ((isSub && isNextSuper) || (isSuper && isNextSub)) {\n // Stack subscript and superscript at the same X coordinate\n const dims1 = renderNode(node, { ...ctx, x: currentX });\n const dims2 = renderNode(nextNode, { ...ctx, x: currentX });\n\n const width = Math.max(dims1.width, dims2.width);\n currentX += width + (ctx.fontSize * 0.15); // Scaled padding after scripts\n\n maxAscent = Math.max(maxAscent, dims1.baseline, dims2.baseline);\n maxDescent = Math.max(maxDescent, dims1.height - dims1.baseline, dims2.height - dims2.baseline);\n i++; // Skip next node\n } else {\n const dims = renderNode(node, { ...ctx, x: currentX });\n currentX += dims.width;\n\n // Add a small gap after scripts to prevent overlap with next character (Chemistry fix)\n if (isSub || isSuper) {\n currentX += ctx.fontSize * 0.12;\n }\n\n maxAscent = Math.max(maxAscent, dims.baseline);\n maxDescent = Math.max(maxDescent, dims.height - dims.baseline);\n }\n }\n\n return {\n width: currentX - ctx.x,\n height: maxAscent + maxDescent,\n baseline: maxAscent,\n };\n}\n\n/**\n * Render a single LaTeX node\n */\nfunction renderNode(node: LaTeXNode, ctx: LaTeXRenderContext): LaTeXDimensions {\n switch (node.type) {\n case 'text':\n return renderText(node.content || '', ctx);\n\n case 'textgroup':\n return renderText(node.content || '', ctx);\n\n case 'symbol':\n return renderSymbol(node.content || '', ctx);\n\n case 'superscript':\n return renderSuperscript(node.children || [], ctx);\n\n case 'subscript':\n return renderSubscript(node.children || [], ctx);\n\n case 'fraction':\n return renderFraction(\n node.numerator || [],\n node.denominator || [],\n ctx\n );\n\n case 'sqrt':\n return renderSqrt(node.children || [], ctx);\n\n case 'group':\n return renderNodes(node.children || [], ctx);\n\n default:\n return { width: 0, height: 0, baseline: 0 };\n }\n}\n\n/**\n * Render plain text\n */\nfunction renderText(text: string, ctx: LaTeXRenderContext): LaTeXDimensions {\n ctx.ctx.save();\n ctx.ctx.font = `${ctx.fontSize}px ${ctx.fontFamily}`;\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.textAlign = 'left';\n ctx.ctx.textBaseline = 'alphabetic';\n\n const metrics = ctx.ctx.measureText(text);\n ctx.ctx.fillText(text, ctx.x, ctx.y);\n\n ctx.ctx.restore();\n\n const height = ctx.fontSize;\n const baseline = height * 0.75; // Approximate baseline\n\n return {\n width: metrics.width,\n height,\n baseline,\n };\n}\n\n/**\n * Render mathematical symbol\n */\nfunction renderSymbol(symbol: string, ctx: LaTeXRenderContext): LaTeXDimensions {\n // Use larger font size for symbols\n ctx.ctx.save();\n ctx.ctx.font = `${ctx.fontSize * 1.1}px ${ctx.fontFamily}`;\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.textAlign = 'left';\n ctx.ctx.textBaseline = 'alphabetic';\n\n const metrics = ctx.ctx.measureText(symbol);\n ctx.ctx.fillText(symbol, ctx.x, ctx.y);\n\n ctx.ctx.restore();\n\n const height = ctx.fontSize * 1.1;\n const baseline = height * 0.75;\n\n return {\n width: metrics.width,\n height,\n baseline,\n };\n}\n\n/**\n * Render superscript (exponent)\n */\nfunction renderSuperscript(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.7;\n const yOffset = -ctx.fontSize * 0.4;\n\n const dims = renderNodes(nodes, {\n ...ctx,\n fontSize: scaledFontSize,\n y: ctx.y + yOffset,\n });\n\n const subAscent = dims.baseline;\n const subDescent = dims.height - dims.baseline;\n\n return {\n width: dims.width,\n height: (subAscent - yOffset) + (subDescent + yOffset),\n baseline: subAscent - yOffset,\n };\n}\n\n/**\n * Render subscript\n */\nfunction renderSubscript(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.7;\n const yOffset = ctx.fontSize * 0.3;\n\n const dims = renderNodes(nodes, {\n ...ctx,\n fontSize: scaledFontSize,\n y: ctx.y + yOffset,\n });\n\n const subAscent = dims.baseline;\n const subDescent = dims.height - dims.baseline;\n\n return {\n width: dims.width,\n height: (subAscent - yOffset) + (subDescent + yOffset),\n baseline: subAscent - yOffset,\n };\n}\n\n/**\n * Render fraction\n */\nfunction renderFraction(\n numerator: LaTeXNode[],\n denominator: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.85;\n const lineThickness = Math.max(1, ctx.fontSize * 0.05);\n const padding = ctx.fontSize * 0.1;\n\n // Measure both parts\n const numDims = measureNodes(numerator, {\n ...ctx,\n fontSize: scaledFontSize,\n });\n const denDims = measureNodes(denominator, {\n ...ctx,\n fontSize: scaledFontSize,\n });\n\n const maxWidth = Math.max(numDims.width, denDims.width);\n const totalHeight = numDims.height + denDims.height + padding * 2 + lineThickness;\n\n // Render numerator (centered)\n const numX = ctx.x + (maxWidth - numDims.width) / 2;\n const numY = ctx.y - padding - lineThickness / 2;\n renderNodes(numerator, {\n ...ctx,\n x: numX,\n y: numY,\n fontSize: scaledFontSize,\n });\n\n // Draw fraction line\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.fillRect(\n ctx.x,\n ctx.y - lineThickness / 2,\n maxWidth,\n lineThickness\n );\n\n // Render denominator (centered)\n const denX = ctx.x + (maxWidth - denDims.width) / 2;\n const denY = ctx.y + denDims.baseline + padding + lineThickness / 2;\n renderNodes(denominator, {\n ...ctx,\n x: denX,\n y: denY,\n fontSize: scaledFontSize,\n });\n\n return {\n width: maxWidth,\n height: totalHeight,\n baseline: totalHeight / 2,\n };\n}\n\n/**\n * Render square root\n */\nfunction renderSqrt(nodes: LaTeXNode[], ctx: LaTeXRenderContext): LaTeXDimensions {\n const contentDims = renderNodes(nodes, {\n ...ctx,\n x: ctx.x + ctx.fontSize * 0.4,\n });\n\n const totalWidth = contentDims.width + ctx.fontSize * 0.5;\n const totalHeight = contentDims.height * 1.1;\n\n // Draw radical symbol\n ctx.ctx.save();\n ctx.ctx.strokeStyle = ctx.color;\n ctx.ctx.lineWidth = Math.max(1, ctx.fontSize * 0.05);\n ctx.ctx.lineCap = 'round';\n ctx.ctx.lineJoin = 'miter';\n\n ctx.ctx.beginPath();\n // Left tick\n ctx.ctx.moveTo(ctx.x, ctx.y - totalHeight * 0.3);\n ctx.ctx.lineTo(ctx.x + ctx.fontSize * 0.15, ctx.y);\n // Down stroke\n ctx.ctx.lineTo(ctx.x + ctx.fontSize * 0.3, ctx.y - totalHeight * 0.9);\n // Top bar\n ctx.ctx.lineTo(ctx.x + totalWidth, ctx.y - totalHeight * 0.9);\n ctx.ctx.stroke();\n\n ctx.ctx.restore();\n\n return {\n width: totalWidth,\n height: totalHeight,\n baseline: contentDims.baseline,\n };\n}\n\n/**\n * Measure nodes without rendering\n */\nfunction measureNodes(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n // Create an offscreen canvas for measurement\n const canvas = document.createElement('canvas');\n const measureCtx = canvas.getContext('2d');\n if (!measureCtx) {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n return renderNodes(nodes, { ...ctx, ctx: measureCtx, x: 0, y: 0 });\n}\n","/**\n * @fileoverview LaTeX rendering plugin for Sci Plot\n * @module plugins/latex\n *\n * This plugin provides native LaTeX rendering without external dependencies.\n * It supports common mathematical notation including:\n * - Greek letters (\\alpha, \\beta, \\gamma, etc.)\n * - Superscripts and subscripts (x^2, H_2O)\n * - Fractions (\\frac{a}{b})\n * - Square roots (\\sqrt{x})\n * - Mathematical operators (\\sum, \\int, \\partial, etc.)\n *\n * @example\n * ```typescript\n * import { PluginLaTeX } from 'velo-plot/plugins';\n *\n * const latex = PluginLaTeX({\n * fontSize: 16,\n * fontFamily: 'serif',\n * color: '#000000'\n * });\n *\n * await chart.use(latex);\n *\n * // Use with axis labels\n * chart.xAxis.label = '\\\\Delta E = mc^2';\n * chart.yAxis.label = '\\\\frac{\\\\partial^2 y}{\\\\partial x^2}';\n *\n * // Use with annotations\n * chart.addAnnotation({\n * type: 'text',\n * text: '\\\\sum_{i=1}^{n} x_i',\n * latex: true\n * });\n * ```\n */\n\nimport type { ChartPlugin, PluginContext } from '../types';\nimport type {\n PluginLaTeXConfig,\n LaTeXPluginAPI,\n LaTeXDimensions,\n} from './types';\nimport { parseLaTeX } from './parser';\nimport { renderNodes } from './renderer';\n\n/**\n * LaTeX rendering plugin\n */\nexport function PluginLaTeX(config: PluginLaTeXConfig = {}): ChartPlugin<PluginLaTeXConfig> {\n const defaultConfig: Required<PluginLaTeXConfig> = {\n fontSize: 14,\n fontFamily: 'serif',\n color: '#000000',\n enableCache: true,\n customSymbols: {},\n };\n\n const finalConfig = { ...defaultConfig, ...config };\n\n // Cache for parsed LaTeX\n const parseCache = new Map<string, ReturnType<typeof parseLaTeX>>();\n // Cache for measured dimensions\n const measureCache = new Map<string, LaTeXDimensions>();\n\n /**\n * Clear all caches\n */\n function clearCache(): void {\n parseCache.clear();\n measureCache.clear();\n }\n\n /**\n * Get parsed AST for LaTeX string (with caching)\n */\n function getParsed(latex: string): ReturnType<typeof parseLaTeX> {\n if (!finalConfig.enableCache) {\n return parseLaTeX(latex);\n }\n\n let parsed = parseCache.get(latex);\n if (!parsed) {\n parsed = parseLaTeX(latex);\n parseCache.set(latex, parsed);\n }\n return parsed;\n }\n\n /**\n * Render LaTeX to canvas\n */\n function render(\n latex: string,\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n options: Partial<PluginLaTeXConfig> = {}\n ): LaTeXDimensions {\n const renderConfig = { ...finalConfig, ...options };\n const nodes = getParsed(latex);\n\n const dims = renderNodes(nodes, {\n ctx,\n x,\n y,\n fontSize: renderConfig.fontSize,\n fontFamily: renderConfig.fontFamily,\n color: renderConfig.color,\n scale: 1,\n });\n\n return dims;\n }\n\n /**\n * Measure LaTeX dimensions without rendering\n */\n function measure(\n latex: string,\n options: Partial<PluginLaTeXConfig> = {}\n ): LaTeXDimensions {\n const cacheKey = `${latex}:${options.fontSize || finalConfig.fontSize}`;\n\n if (finalConfig.enableCache && measureCache.has(cacheKey)) {\n return measureCache.get(cacheKey)!;\n }\n\n const renderConfig = { ...finalConfig, ...options };\n const nodes = getParsed(latex);\n\n // Create offscreen canvas for measurement\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n const dims = renderNodes(nodes, {\n ctx,\n x: 0,\n y: 0,\n fontSize: renderConfig.fontSize,\n fontFamily: renderConfig.fontFamily,\n color: renderConfig.color,\n scale: 1,\n });\n\n if (finalConfig.enableCache) {\n measureCache.set(cacheKey, dims);\n }\n\n return dims;\n }\n\n // API exposed to chart\n const api: LaTeXPluginAPI = {\n render,\n measure,\n clearCache,\n };\n\n return {\n manifest: {\n name: 'velo-plot-latex',\n version: '1.0.0',\n description: 'Native LaTeX rendering for mathematical expressions',\n provides: ['latex'],\n tags: ['latex', 'math', 'typography'],\n },\n\n onInit(ctx: PluginContext) {\n // API is accessed via plugin bridge, no need to set property on chart which has only a getter\n ctx.log.info('LaTeX plugin initialized');\n },\n\n onDestroy(ctx: PluginContext) {\n clearCache();\n ctx.log.info('LaTeX plugin destroyed');\n },\n\n api,\n };\n}\n\n// Type exports\nexport type { PluginLaTeXConfig, LaTeXPluginAPI, LaTeXDimensions };\n\n","/**\n * Forecasting Algorithms\n * \n * Native implementations of time series forecasting methods.\n */\n\nimport type { ForecastingMethod, ForecastingParams, ForecastingResult } from './types';\n\n/**\n * Main dispatcher for forecasting algorithms\n */\nexport function calculateForecast(\n x: number[] | Float64Array | Float32Array,\n y: number[] | Float64Array | Float32Array,\n method: ForecastingMethod,\n horizon: number,\n params: ForecastingParams = {}\n): ForecastingResult {\n const n = x.length;\n if (n === 0) throw new Error(\"Dataset is empty\");\n\n // Determine time step (assuming regular intervals)\n const dt = n > 1 ? (x[n - 1] - x[0]) / (n - 1) : 1;\n const lastX = x[n - 1];\n\n let result: { yValues: number[], lower?: number[], upper?: number[] };\n\n switch (method) {\n case 'sma':\n result = forecastSMA(y, horizon, params.windowSize || 10);\n break;\n case 'ema':\n result = forecastEMA(y, horizon, params.alpha || 0.3);\n break;\n case 'linear':\n result = forecastLinear(x, y, horizon);\n break;\n case 'expSmoothing':\n result = forecastSimpleExpSmoothing(y, horizon, params.alpha || 0.3);\n break;\n case 'holt':\n result = forecastHolt(y, horizon, params.alpha || 0.3, params.beta || 0.1);\n break;\n case 'holtWinters':\n result = forecastHoltWinters(\n y, \n horizon, \n params.period || 12, \n params.alpha || 0.3, \n params.beta || 0.1, \n params.gamma || 0.1\n );\n break;\n default:\n throw new Error(`Method ${method} not implemented yet`);\n }\n\n // Generate future X values\n const futureX = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n futureX[i] = lastX + (i + 1) * dt;\n }\n\n return {\n xValues: futureX,\n yValues: result.yValues,\n lowerBound: result.lower,\n upperBound: result.upper,\n method,\n metadata: calculateFitMetrics(y, result.yValues) // Simplified for now\n };\n}\n\n/**\n * Simple Moving Average (SMA)\n * Historical SMA used for projection (flat line at last average)\n */\nfunction forecastSMA(y: number[] | Float64Array | Float32Array, horizon: number, window: number) {\n const n = y.length;\n const effectiveWindow = Math.min(window, n);\n \n let sum = 0;\n for (let i = n - effectiveWindow; i < n; i++) {\n sum += y[i];\n }\n const avg = sum / effectiveWindow;\n\n // SMA projection is usually a flat line unless we slide the window (which requires predictions)\n return {\n yValues: new Array(horizon).fill(avg)\n };\n}\n\n/**\n * Exponential Moving Average (EMA)\n */\nfunction forecastEMA(y: number[] | Float64Array | Float32Array, horizon: number, alpha: number) {\n const n = y.length;\n let ema = y[0];\n \n for (let i = 1; i < n; i++) {\n ema = alpha * y[i] + (1 - alpha) * ema;\n }\n\n return {\n yValues: new Array(horizon).fill(ema)\n };\n}\n\n/**\n * Linear Trend Projection\n * Fits y = mx + b to the historical data\n */\nfunction forecastLinear(x: any, y: any, horizon: number) {\n const n = x.length;\n let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;\n \n for (let i = 0; i < n; i++) {\n sumX += x[i];\n sumY += y[i];\n sumXY += x[i] * y[i];\n sumXX += x[i] * x[i];\n }\n\n const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n const lastX = x[n - 1];\n const dt = n > 1 ? (x[n - 1] - x[0]) / (n - 1) : 1;\n const yValues = new Array(horizon);\n\n for (let i = 0; i < horizon; i++) {\n const nextX = lastX + (i + 1) * dt;\n yValues[i] = slope * nextX + intercept;\n }\n\n return { yValues };\n}\n\n/**\n * Simple Exponential Smoothing (SES)\n */\nfunction forecastSimpleExpSmoothing(y: any, horizon: number, alpha: number) {\n const n = y.length;\n let level = y[0];\n \n for (let i = 1; i < n; i++) {\n level = alpha * y[i] + (1 - alpha) * level;\n }\n\n return {\n yValues: new Array(horizon).fill(level)\n };\n}\n\n/**\n * Holt's Linear Trend (Double Exponential Smoothing)\n */\nfunction forecastHolt(y: any, horizon: number, alpha: number, beta: number) {\n const n = y.length;\n if (n < 2) return { yValues: new Array(horizon).fill(y[0] || 0) };\n\n let level = y[0];\n let trend = y[1] - y[0];\n\n for (let i = 1; i < n; i++) {\n const lastLevel = level;\n level = alpha * y[i] + (1 - alpha) * (level + trend);\n trend = beta * (level - lastLevel) + (1 - beta) * trend;\n }\n\n const yValues = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n yValues[i] = level + (i + 1) * trend;\n }\n\n return { yValues };\n}\n\n/**\n * Holt-Winters (Triple Exponential Smoothing)\n */\nfunction forecastHoltWinters(y: any, horizon: number, period: number, alpha: number, beta: number, gamma: number) {\n const n = y.length;\n if (n < period * 2) {\n // Fallback to Holt if not enough data for seasonality\n return forecastHolt(y, horizon, alpha, beta);\n }\n\n // 1. Initial Seasonality\n const seasonals = new Array(period);\n const seasonAverages = new Array(Math.floor(n / period));\n for (let i = 0; i < seasonAverages.length; i++) {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += y[i * period + j];\n }\n seasonAverages[i] = sum / period;\n }\n\n for (let i = 0; i < period; i++) {\n let sumOverAvg = 0;\n for (let j = 0; j < seasonAverages.length; j++) {\n sumOverAvg += y[j * period + i] - seasonAverages[j];\n }\n seasonals[i] = sumOverAvg / seasonAverages.length;\n }\n\n // 2. Initial Level and Trend\n let level = seasonAverages[0];\n let trend = (seasonAverages[seasonAverages.length - 1] - seasonAverages[0]) / ((seasonAverages.length - 1) * period);\n\n // 3. Update coefficients\n for (let i = 0; i < n; i++) {\n const lastLevel = level;\n const val = y[i];\n level = alpha * (val - seasonals[i % period]) + (1 - alpha) * (level + trend);\n trend = beta * (level - lastLevel) + (1 - beta) * trend;\n seasonals[i % period] = gamma * (val - level) + (1 - gamma) * seasonals[i % period];\n }\n\n // 4. Forecast\n const yValues = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n const m = (i + 1);\n yValues[i] = (level + m * trend) + seasonals[(n + i) % period];\n }\n\n return { yValues };\n}\n\n/**\n * Calculate common error metrics\n */\nfunction calculateFitMetrics(_historical: any, _forecast: number[]) {\n // This is a simplified placeholder\n // Real metrics should compare historical with a \"back-forecast\"\n return {\n mse: 0,\n mae: 0,\n r2: 1\n };\n}\n","/**\n * Sci Plot - Forecasting Plugin\n * \n * Provides time series forecasting capabilities using native statistical models.\n */\n\nimport type { \n PluginForecastingConfig, \n ForecastingAPI, \n ForecastingOptions, \n ForecastingResult, \n ForecastingVisualizationConfig \n} from './types';\nimport { calculateForecast } from './algorithms';\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n AfterRenderEvent\n} from '../types';\n\nconst manifestForecasting: PluginManifest = {\n name: \"velo-plot-forecasting\",\n version: \"1.0.0\",\n description: \"Time series forecasting for velo-plot\",\n provides: [\"analysis\", \"forecasting\"],\n tags: [\"statistics\", \"forecasting\", \"analysis\"],\n};\n\n/**\n * Forecasting Plugin for Sci Plot\n */\nexport function PluginForecasting(\n config: Partial<PluginForecastingConfig> = {}\n): ChartPlugin<PluginForecastingConfig> {\n let ctx: PluginContext | null = null;\n const activeForecasts = new Map<string, { result: ForecastingResult, config: ForecastingVisualizationConfig }>();\n\n const api: ForecastingAPI = {\n forecast(data: any, options: ForecastingOptions): ForecastingResult {\n let x: any, y: any;\n \n if (Array.isArray(data)) {\n y = data;\n x = data.map((_, i) => i);\n } else if (data.x && data.y) {\n x = data.x;\n y = data.y;\n } else {\n throw new Error(\"Invalid data format for forecasting\");\n }\n\n return calculateForecast(x, y, options.method, options.horizon, options.params);\n },\n\n async forecastSeries(seriesId: string, options: ForecastingOptions): Promise<ForecastingResult> {\n if (!ctx) throw new Error(\"Plugin not initialized\");\n \n const series = ctx.data.getAllSeries().find(s => s.getId() === seriesId);\n if (!series) throw new Error(`Series not found: ${seriesId}`);\n \n const data = series.getData();\n return this.forecast(data, options);\n },\n\n visualize(result: ForecastingResult, vizConfig: ForecastingVisualizationConfig = {}) {\n const id = `forecast-${Math.random().toString(36).substr(2, 9)}`;\n const mergedConfig = {\n showLine: true,\n showConfidenceInterval: true,\n ...config.defaultVisualization,\n ...vizConfig\n };\n \n activeForecasts.set(id, { result, config: mergedConfig });\n ctx?.requestRender();\n return id;\n },\n\n clear(id?: string) {\n if (id) {\n activeForecasts.delete(id);\n } else {\n activeForecasts.clear();\n }\n ctx?.requestRender();\n }\n };\n\n function drawForecasts(pCtx: PluginContext) {\n const { render, coords } = pCtx;\n const { ctx2d } = render;\n if (!ctx2d) return;\n\n activeForecasts.forEach((viz) => {\n const { result, config: vizConfig } = viz;\n const { xValues, yValues, lowerBound, upperBound } = result;\n\n ctx2d.save();\n\n // 1. Draw Confidence Interval\n if (vizConfig.showConfidenceInterval && lowerBound && upperBound) {\n ctx2d.beginPath();\n const opacity = vizConfig.intervalStyle?.opacity ?? 0.15;\n const color = vizConfig.intervalStyle?.fillColor || (vizConfig.lineStyle?.color || '#3b82f6');\n \n ctx2d.fillStyle = color.startsWith('rgba') ? color : color + Math.floor(opacity * 255).toString(16).padStart(2, '0');\n \n for (let i = 0; i < xValues.length; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(upperBound[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n \n for (let i = xValues.length - 1; i >= 0; i--) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(lowerBound[i]);\n ctx2d.lineTo(px, py);\n }\n \n ctx2d.closePath();\n ctx2d.fill();\n }\n\n // 2. Draw Forecast Line\n if (vizConfig.showLine) {\n ctx2d.beginPath();\n ctx2d.strokeStyle = vizConfig.lineStyle?.color || '#3b82f6';\n ctx2d.lineWidth = vizConfig.lineStyle?.width || 2;\n if (vizConfig.lineStyle?.dash) {\n ctx2d.setLineDash(vizConfig.lineStyle.dash);\n } else {\n ctx2d.setLineDash([5, 5]); // Default dashed for forecast\n }\n\n for (let i = 0; i < xValues.length; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(yValues[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n ctx2d.stroke();\n }\n\n ctx2d.restore();\n });\n }\n\n return {\n manifest: manifestForecasting,\n onInit(c: PluginContext) {\n ctx = c;\n },\n onRenderOverlay(pCtx: PluginContext, _event: AfterRenderEvent) {\n drawForecasts(pCtx);\n },\n api\n };\n}\n\n// Re-export types and constants\nexport * from './types';\nexport * from './algorithms';\nexport { manifestForecasting };\n","/**\n * @fileoverview Drag & Drop editing plugin for interactive point manipulation\n * @module plugins/drag-edit\n */\n\nimport type {\n PluginDragEditConfig,\n DragEditAPI,\n DraggedPoint,\n DragEditEvent,\n DragConstraint,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-drag-edit',\n version: '1.0.0',\n description: 'Interactive drag & drop editing of data points',\n provides: ['drag-edit', 'point-editing'],\n tags: ['interaction', 'editing', 'ux'],\n};\n\nconst DEFAULT_CONFIG: Required<PluginDragEditConfig> = {\n enabled: true,\n constraint: 'both',\n snapToGrid: false,\n snapIntervalX: 1,\n snapIntervalY: 1,\n dragThreshold: 5,\n hitRadius: 10,\n editableSeries: [],\n validator: () => ({ valid: true }),\n onDragStart: () => {},\n onDrag: () => {},\n onDragEnd: () => {},\n highlightColor: '#ffff00',\n showPreview: true,\n previewStyle: {\n color: '#ffffff',\n width: 2,\n dash: [5, 5],\n opacity: 0.5,\n },\n};\n\nexport function PluginDragEdit(\n userConfig: Partial<PluginDragEditConfig> = {}\n): ChartPlugin<PluginDragEditConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n \n // Drag state\n let isDragging = false;\n let draggedPoint: DraggedPoint | null = null;\n let dragStartX = 0;\n let dragStartY = 0;\n let hasMoved = false;\n\n /**\n * Find nearest point to mouse position\n */\n function findNearestPoint(mouseX: number, mouseY: number): DraggedPoint | null {\n if (!ctx) return null;\n\n // Use built-in pick functionality\n const picked = ctx.coords.pickPoint(mouseX, mouseY, config.hitRadius);\n \n if (!picked) return null;\n\n // Check if series is editable\n if (config.editableSeries.length > 0 && !config.editableSeries.includes(picked.seriesId)) {\n return null;\n }\n\n return {\n seriesId: picked.seriesId,\n index: picked.index,\n originalX: picked.x,\n originalY: picked.y,\n currentX: picked.x,\n currentY: picked.y,\n };\n }\n\n /**\n * Convert pixel coordinates to data coordinates\n */\n function pixelToData(pixelX: number, pixelY: number): { x: number; y: number } {\n if (!ctx) return { x: 0, y: 0 };\n\n return {\n x: ctx.coords.pixelToDataX(pixelX),\n y: ctx.coords.pixelToDataY(pixelY),\n };\n }\n\n /**\n * Snap value to grid\n */\n function snapToGrid(value: number, interval: number): number {\n return Math.round(value / interval) * interval;\n }\n\n /**\n * Apply drag constraints\n */\n function applyConstraints(\n newX: number,\n newY: number,\n constraint: DragConstraint\n ): { x: number; y: number } {\n if (!draggedPoint) return { x: newX, y: newY };\n\n switch (constraint) {\n case 'x':\n return { x: newX, y: draggedPoint.originalY };\n case 'y':\n return { x: draggedPoint.originalX, y: newY };\n case 'none':\n return { x: draggedPoint.originalX, y: draggedPoint.originalY };\n default:\n return { x: newX, y: newY };\n }\n }\n\n /**\n * Validate and apply snapping\n */\n function validateAndSnap(x: number, y: number): { x: number; y: number; valid: boolean } {\n let finalX = x;\n let finalY = y;\n\n // Apply snapping\n if (config.snapToGrid) {\n finalX = snapToGrid(x, config.snapIntervalX);\n finalY = snapToGrid(y, config.snapIntervalY);\n }\n\n // Run custom validation\n if (draggedPoint && config.validator) {\n const tempPoint: DraggedPoint = { ...draggedPoint, currentX: finalX, currentY: finalY };\n const validation = config.validator(tempPoint);\n\n if (typeof validation === 'boolean') {\n return { x: finalX, y: finalY, valid: validation };\n }\n\n if (!validation.valid) {\n return { x: finalX, y: finalY, valid: false };\n }\n\n // Apply snap suggestions from validator\n if (validation.snapX !== undefined) finalX = validation.snapX;\n if (validation.snapY !== undefined) finalY = validation.snapY;\n }\n\n return { x: finalX, y: finalY, valid: true };\n }\n\n /**\n * Update point data\n */\n function updatePointData(seriesId: string, index: number, newX: number, newY: number): void {\n if (!ctx) return;\n\n const series = (ctx.chart as any).getSeries?.(seriesId);\n if (!series) return;\n\n const data = series.getData();\n if (!data || !data.x || !data.y) return;\n\n // Update the data arrays\n data.x[index] = newX;\n data.y[index] = newY;\n\n // Invalidate buffers to trigger GPU upload\n series.invalidateBuffers?.();\n\n // Trigger chart re-render\n ctx.requestRender();\n }\n\n /**\n * Create drag event\n */\n function createDragEvent(): DragEditEvent | null {\n if (!draggedPoint) return null;\n\n return {\n seriesId: draggedPoint.seriesId,\n index: draggedPoint.index,\n oldX: draggedPoint.originalX,\n oldY: draggedPoint.originalY,\n newX: draggedPoint.currentX,\n newY: draggedPoint.currentY,\n deltaX: draggedPoint.currentX - draggedPoint.originalX,\n deltaY: draggedPoint.currentY - draggedPoint.originalY,\n };\n }\n\n /**\n * Draw preview overlay\n */\n function drawPreview(pCtx: PluginContext): void {\n if (!isDragging || !draggedPoint || !config.showPreview) return;\n\n const { render, coords } = pCtx;\n const { ctx2d } = render;\n if (!ctx2d) return;\n\n ctx2d.save();\n\n // Convert data coordinates to pixel coordinates\n const origPixelX = coords.dataToPixelX(draggedPoint.originalX);\n const origPixelY = coords.dataToPixelY(draggedPoint.originalY);\n \n const currPixelX = coords.dataToPixelX(draggedPoint.currentX);\n const currPixelY = coords.dataToPixelY(draggedPoint.currentY);\n\n // Draw preview line from original to current position\n ctx2d.strokeStyle = config.previewStyle.color || '#ffffff';\n ctx2d.lineWidth = config.previewStyle.width || 2;\n ctx2d.globalAlpha = config.previewStyle.opacity || 0.5;\n ctx2d.setLineDash(config.previewStyle.dash || [5, 5]);\n\n ctx2d.beginPath();\n ctx2d.moveTo(origPixelX, origPixelY);\n ctx2d.lineTo(currPixelX, currPixelY);\n ctx2d.stroke();\n\n // Draw highlight circle at current position\n ctx2d.globalAlpha = 1;\n ctx2d.fillStyle = config.highlightColor;\n ctx2d.setLineDash([]);\n ctx2d.beginPath();\n ctx2d.arc(currPixelX, currPixelY, 6, 0, Math.PI * 2);\n ctx2d.fill();\n\n // Draw outline\n ctx2d.strokeStyle = '#000000';\n ctx2d.lineWidth = 1;\n ctx2d.stroke();\n\n ctx2d.restore();\n }\n\n // API implementation\n const api: DragEditAPI & Record<string, unknown> = {\n enable() {\n config.enabled = true;\n },\n disable() {\n config.enabled = false;\n if (isDragging) {\n draggedPoint = null;\n isDragging = false;\n hasMoved = false;\n ctx?.requestRender();\n }\n },\n isEnabled() {\n return config.enabled;\n },\n setEditableSeries(seriesIds: string[]) {\n config.editableSeries = seriesIds;\n },\n getDraggedPoint() {\n return draggedPoint;\n },\n cancelDrag() {\n if (isDragging && draggedPoint) {\n draggedPoint = null;\n isDragging = false;\n hasMoved = false;\n ctx?.requestRender();\n }\n },\n updateConfig(newConfig: Partial<PluginDragEditConfig>) {\n Object.assign(config, newConfig);\n },\n };\n\n return {\n manifest,\n\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n\n // Attach to chart API\n (ctx.chart as any).dragEdit = api;\n },\n\n onDestroy(_pluginCtx: PluginContext) {\n // Remove from chart API\n delete (_pluginCtx.chart as any).dragEdit;\n\n ctx = null;\n },\n\n onInteraction(_pluginCtx: PluginContext, event: import('../types').InteractionEvent) {\n if (!config.enabled) return;\n\n if (event.type === 'mousedown') {\n const point = findNearestPoint(event.pixelX, event.pixelY);\n if (point) {\n draggedPoint = point;\n dragStartX = event.pixelX;\n dragStartY = event.pixelY;\n hasMoved = false;\n isDragging = false;\n // Prevent default to stop panning when clicking on a point\n event.preventDefault();\n }\n } else if (event.type === 'mousemove') {\n if (!draggedPoint) return;\n\n // Check if we've moved beyond threshold\n if (!isDragging) {\n const dx = event.pixelX - dragStartX;\n const dy = event.pixelY - dragStartY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance > config.dragThreshold) {\n isDragging = true;\n hasMoved = true;\n\n // Fire drag start event\n const dragEvent = createDragEvent();\n if (dragEvent) config.onDragStart(dragEvent);\n } else {\n return;\n }\n }\n\n // Prevent default during dragging\n if (isDragging) {\n event.preventDefault();\n }\n\n // Convert to data coordinates\n let { x, y } = pixelToData(event.pixelX, event.pixelY);\n\n // Apply constraints\n ({ x, y } = applyConstraints(x, y, config.constraint));\n\n // Validate and snap\n const { x: finalX, y: finalY, valid } = validateAndSnap(x, y);\n\n if (valid) {\n draggedPoint.currentX = finalX;\n draggedPoint.currentY = finalY;\n\n // Fire drag event (for callbacks)\n const dragEvent = createDragEvent();\n if (dragEvent) config.onDrag(dragEvent);\n\n // Request render to show preview line\n ctx?.requestRender();\n }\n } else if (event.type === 'mouseup') {\n if (!draggedPoint) return;\n\n if (isDragging && hasMoved) {\n // Apply the changes\n updatePointData(\n draggedPoint.seriesId,\n draggedPoint.index,\n draggedPoint.currentX,\n draggedPoint.currentY\n );\n\n // Fire drag end event\n const dragEvent = createDragEvent();\n if (dragEvent) config.onDragEnd(dragEvent);\n\n // Prevent default on mouseup to avoid triggering click events\n event.preventDefault();\n }\n\n // Reset state\n draggedPoint = null;\n isDragging = false;\n hasMoved = false;\n ctx?.requestRender();\n }\n },\n\n onRenderOverlay(pluginCtx: PluginContext) {\n drawPreview(pluginCtx);\n },\n\n api,\n };\n}\n\nexport default PluginDragEdit;\n\n// Type exports\nexport type {\n PluginDragEditConfig,\n DragEditAPI,\n DraggedPoint,\n DragEditEvent,\n DragConstraint,\n} from './types';\n","/**\n * @fileoverview Advanced caching plugin for performance optimization\n * @module plugins/caching\n */\n\nimport type {\n PluginCachingConfig,\n CachingAPI,\n CacheEntry,\n CacheStats,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-caching',\n version: '1.0.0',\n description: 'Advanced caching system for performance optimization',\n provides: ['caching', 'performance'],\n tags: ['optimization', 'cache', 'memory'],\n};\n\nconst DEFAULT_CONFIG: Required<PluginCachingConfig> = {\n enabled: true,\n maxSize: 50 * 1024 * 1024, // 50MB\n strategy: 'lru',\n defaultTTL: undefined as any,\n autoInvalidate: true,\n cacheTypes: {\n transforms: true,\n analysis: true,\n frames: false,\n bounds: true,\n },\n onInvalidate: () => {},\n debug: false,\n};\n\nexport function PluginCaching(\n userConfig: Partial<PluginCachingConfig> = {}\n): ChartPlugin<PluginCachingConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n\n // Cache storage\n const cache = new Map<string, CacheEntry>();\n \n // Statistics\n const stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n };\n \n let currentSize = 0;\n\n /**\n * Estimate size of value in bytes\n */\n function estimateSize(value: any): number {\n if (value === null || value === undefined) return 0;\n \n const type = typeof value;\n \n if (type === 'boolean') return 4;\n if (type === 'number') return 8;\n if (type === 'string') return value.length * 2;\n \n if (value instanceof Float32Array || value instanceof Float64Array) {\n return value.byteLength;\n }\n \n if (Array.isArray(value)) {\n return value.reduce((sum, item) => sum + estimateSize(item), 0);\n }\n \n if (type === 'object') {\n return Object.keys(value).reduce(\n (sum, key) => sum + key.length * 2 + estimateSize(value[key]),\n 0\n );\n }\n \n return 100; // Default estimate\n }\n\n /**\n * Evict entries based on strategy\n */\n function evict(requiredSpace: number): void {\n if (cache.size === 0) return;\n\n const entries = Array.from(cache.entries());\n \n // Sort based on strategy\n if (config.strategy === 'lru') {\n // Least recently used\n entries.sort((a, b) => a[1].lastAccess - b[1].lastAccess);\n } else if (config.strategy === 'lfu') {\n // Least frequently used\n entries.sort((a, b) => a[1].hits - b[1].hits);\n }\n // FIFO is already in insertion order (Map preserves order)\n \n let freedSpace = 0;\n const keysToDelete: string[] = [];\n \n for (const [key, entry] of entries) {\n if (freedSpace >= requiredSpace) break;\n \n keysToDelete.push(key);\n freedSpace += entry.size;\n currentSize -= entry.size;\n stats.evictions++;\n }\n \n // Delete entries\n for (const key of keysToDelete) {\n cache.delete(key);\n }\n \n if (config.debug && keysToDelete.length > 0) {\n console.log(`[Cache] Evicted ${keysToDelete.length} entries, freed ${freedSpace} bytes`);\n }\n }\n\n /**\n * Prune expired entries\n */\n function pruneExpired(): number {\n const now = Date.now();\n const keysToDelete: string[] = [];\n \n for (const [key, entry] of cache.entries()) {\n if (entry.ttl && now - entry.timestamp > entry.ttl) {\n keysToDelete.push(key);\n currentSize -= entry.size;\n }\n }\n \n for (const key of keysToDelete) {\n cache.delete(key);\n }\n \n if (config.debug && keysToDelete.length > 0) {\n console.log(`[Cache] Pruned ${keysToDelete.length} expired entries`);\n }\n \n return keysToDelete.length;\n }\n\n /**\n * Get value from cache\n */\n function get<T>(key: string): T | undefined {\n if (!config.enabled) return undefined;\n \n const entry = cache.get(key);\n \n if (!entry) {\n stats.misses++;\n return undefined;\n }\n \n // Check TTL\n if (entry.ttl) {\n const age = Date.now() - entry.timestamp;\n if (age > entry.ttl) {\n cache.delete(key);\n currentSize -= entry.size;\n stats.misses++;\n return undefined;\n }\n }\n \n // Update access metadata\n entry.lastAccess = Date.now();\n entry.hits++;\n stats.hits++;\n \n if (config.debug) {\n console.log(`[Cache] HIT: ${key}`);\n }\n \n return entry.value as T;\n }\n\n /**\n * Set value in cache\n */\n function set<T>(\n key: string,\n value: T,\n options: { ttl?: number; tags?: string[]; size?: number } = {}\n ): void {\n if (!config.enabled) return;\n \n // Estimate size\n const size = options.size ?? estimateSize(value);\n \n // Check if we need to evict\n if (currentSize + size > config.maxSize) {\n const requiredSpace = currentSize + size - config.maxSize;\n evict(requiredSpace);\n }\n \n // Still too large after eviction?\n if (size > config.maxSize) {\n console.warn(`[Cache] Value too large to cache: ${key} (${size} bytes)`);\n return;\n }\n \n // Remove old entry if exists\n const oldEntry = cache.get(key);\n if (oldEntry) {\n currentSize -= oldEntry.size;\n }\n \n // Create entry\n const entry: CacheEntry<T> = {\n value,\n timestamp: Date.now(),\n lastAccess: Date.now(),\n hits: 0,\n size,\n ttl: options.ttl ?? config.defaultTTL,\n tags: options.tags,\n };\n \n cache.set(key, entry);\n currentSize += size;\n \n if (config.debug) {\n console.log(`[Cache] SET: ${key} (${size} bytes)`);\n }\n }\n\n /**\n * Check if key exists\n */\n function has(key: string): boolean {\n return cache.has(key);\n }\n\n /**\n * Delete specific key\n */\n function deleteKey(key: string): boolean {\n const entry = cache.get(key);\n if (entry) {\n currentSize -= entry.size;\n return cache.delete(key);\n }\n return false;\n }\n\n /**\n * Clear all cache\n */\n function clear(): void {\n const count = cache.size;\n cache.clear();\n currentSize = 0;\n \n if (config.debug) {\n console.log(`[Cache] Cleared ${count} entries`);\n }\n \n if (config.onInvalidate) {\n config.onInvalidate({\n keys: [],\n reason: 'manual',\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Invalidate by tags\n */\n function invalidateByTags(tags: string[]): number {\n const keysToDelete: string[] = [];\n \n for (const [key, entry] of cache.entries()) {\n if (entry.tags && entry.tags.some(tag => tags.includes(tag))) {\n keysToDelete.push(key);\n currentSize -= entry.size;\n }\n }\n \n for (const key of keysToDelete) {\n cache.delete(key);\n }\n \n if (config.debug && keysToDelete.length > 0) {\n console.log(`[Cache] Invalidated ${keysToDelete.length} entries by tags:`, tags);\n }\n \n if (config.onInvalidate && keysToDelete.length > 0) {\n config.onInvalidate({\n keys: keysToDelete,\n reason: 'tag',\n timestamp: Date.now(),\n });\n }\n \n return keysToDelete.length;\n }\n\n /**\n * Get cache statistics\n */\n function getStats(): CacheStats {\n const total = stats.hits + stats.misses;\n \n return {\n hits: stats.hits,\n misses: stats.misses,\n hitRatio: total > 0 ? stats.hits / total : 0,\n currentSize,\n maxSize: config.maxSize,\n entryCount: cache.size,\n evictions: stats.evictions,\n };\n }\n\n /**\n * Reset statistics\n */\n function resetStats(): void {\n stats.hits = 0;\n stats.misses = 0;\n stats.evictions = 0;\n }\n\n /**\n * Get all keys\n */\n function keys(): string[] {\n return Array.from(cache.keys());\n }\n\n /**\n * Get cache size\n */\n function size(): number {\n return cache.size;\n }\n\n // API implementation\n const api: CachingAPI & Record<string, unknown> = {\n get,\n set,\n has,\n delete: deleteKey,\n clear,\n invalidateByTags,\n getStats,\n resetStats,\n keys,\n size,\n prune: pruneExpired,\n updateConfig(newConfig: Partial<PluginCachingConfig>) {\n Object.assign(config, newConfig);\n },\n };\n\n // Periodic cleanup\n let cleanupInterval: number | null = null;\n\n return {\n manifest,\n\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n\n // Attach to chart API\n (ctx.chart as any).caching = api;\n\n // Setup periodic cleanup (every 60 seconds)\n cleanupInterval = window.setInterval(() => {\n pruneExpired();\n }, 60000);\n\n // TODO: Auto-invalidate on data changes if enabled\n // Requires 'dataUpdate' event to be added to ChartEventMap\n // if (config.autoInvalidate) {\n // ctx.chart.on?.('dataUpdate', () => {\n // if (config.cacheTypes.transforms) invalidateByTags(['transform']);\n // if (config.cacheTypes.analysis) invalidateByTags(['analysis']);\n // if (config.cacheTypes.bounds) invalidateByTags(['bounds']);\n // });\n // }\n },\n\n onDestroy(pluginCtx: PluginContext) {\n // Clear cleanup interval\n if (cleanupInterval !== null) {\n clearInterval(cleanupInterval);\n }\n\n // Clear cache\n clear();\n\n // Remove from chart API\n delete (pluginCtx.chart as any).caching;\n\n ctx = null;\n },\n\n api,\n };\n}\n\nexport default PluginCaching;\n\n// Type exports\nexport type {\n PluginCachingConfig,\n CachingAPI,\n CacheEntry,\n CacheStats,\n CacheStrategy,\n CacheInvalidationEvent,\n} from './types';\n","/**\n * @fileoverview Lazy loading plugin for large datasets\n * @module plugins/lazy-load\n */\n\nimport type {\n PluginLazyLoadConfig,\n LazyLoadAPI,\n DataProvider,\n LazyLoadedSeries,\n LoadProgressEvent,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-lazy-load',\n version: '1.0.0',\n description: 'Lazy loading for large datasets with viewport-based chunking',\n provides: ['lazy-load', 'data-streaming'],\n tags: ['performance', 'data', 'optimization'],\n};\n\nconst DEFAULT_CONFIG: Required<PluginLazyLoadConfig> = {\n enabled: true,\n chunkSize: 10000,\n viewportBuffer: 2,\n autoLoad: true,\n autoUnload: true,\n unloadThreshold: 5,\n preloadAdjacent: true,\n maxLoadedChunks: 100,\n onLoadStart: () => {},\n onLoadProgress: () => {},\n onLoadComplete: () => {},\n onLoadError: () => {},\n debug: false,\n};\n\nexport function PluginLazyLoad(\n userConfig: Partial<PluginLazyLoadConfig> = {}\n): ChartPlugin<PluginLazyLoadConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n\n // Registered series\n const series = new Map<string, LazyLoadedSeries>();\n\n /**\n * Calculate chunk index from point index\n */\n function getChunkIndex(pointIndex: number): number {\n return Math.floor(pointIndex / config.chunkSize);\n }\n\n /**\n * Get visible range from chart\n */\n function getVisibleRange(): { xMin: number; xMax: number } | null {\n if (!ctx) return null;\n \n // Get current view bounds from data context\n const bounds = ctx.data.getViewBounds();\n if (bounds) {\n return { xMin: bounds.xMin, xMax: bounds.xMax };\n }\n \n return null;\n }\n\n /**\n * Load a specific chunk\n */\n async function loadChunk(\n seriesInfo: LazyLoadedSeries,\n chunkIndex: number\n ): Promise<void> {\n // Already loaded or loading\n if (seriesInfo.chunks.has(chunkIndex) || seriesInfo.loading.has(chunkIndex)) {\n return;\n }\n\n seriesInfo.loading.add(chunkIndex);\n\n try {\n const startIndex = chunkIndex * config.chunkSize;\n const endIndex = Math.min(\n startIndex + config.chunkSize,\n seriesInfo.totalPoints\n );\n\n if (config.debug) {\n console.log(`[LazyLoad] Loading chunk ${chunkIndex} for ${seriesInfo.id} (${startIndex}-${endIndex})`);\n }\n\n const chunk = await seriesInfo.provider.loadChunk(startIndex, endIndex);\n \n seriesInfo.chunks.set(chunkIndex, chunk);\n seriesInfo.loading.delete(chunkIndex);\n\n // Update chart data\n await updateSeriesData(seriesInfo);\n\n // Fire progress event\n const loadedPoints = Array.from(seriesInfo.chunks.values()).reduce(\n (sum, c) => sum + (c.endIndex - c.startIndex),\n 0\n );\n\n const totalChunks = Math.ceil(seriesInfo.totalPoints / config.chunkSize);\n \n const event: LoadProgressEvent = {\n seriesId: seriesInfo.id,\n loadedPoints,\n totalPoints: seriesInfo.totalPoints,\n progress: loadedPoints / seriesInfo.totalPoints,\n currentChunk: chunkIndex,\n totalChunks,\n };\n\n if (loadedPoints === seriesInfo.totalPoints) {\n config.onLoadComplete(event);\n } else {\n config.onLoadProgress(event);\n }\n\n } catch (error) {\n seriesInfo.loading.delete(chunkIndex);\n config.onLoadError(error as Error, seriesInfo.id);\n \n if (config.debug) {\n console.error(`[LazyLoad] Error loading chunk ${chunkIndex}:`, error);\n }\n }\n }\n\n /**\n * Update series data from loaded chunks\n */\n async function updateSeriesData(seriesInfo: LazyLoadedSeries): Promise<void> {\n if (!ctx) return;\n\n // Merge all loaded chunks\n const sortedChunks = Array.from(seriesInfo.chunks.entries()).sort((a, b) => a[0] - b[0]);\n \n if (sortedChunks.length === 0) return;\n\n // Calculate total size\n let totalSize = 0;\n for (const [, chunk] of sortedChunks) {\n totalSize += chunk.x.length;\n }\n\n // Allocate arrays\n const x = new Float32Array(totalSize);\n const y = new Float32Array(totalSize);\n\n // Copy data\n let offset = 0;\n for (const [, chunk] of sortedChunks) {\n x.set(chunk.x, offset);\n y.set(chunk.y, offset);\n offset += chunk.x.length;\n }\n\n // Update series\n (ctx.chart as any).updateSeries?.(seriesInfo.id, { x, y });\n }\n\n /**\n * Load visible data\n */\n async function loadVisible(): Promise<void> {\n if (!config.enabled || !ctx) return;\n\n const visibleRange = getVisibleRange();\n if (!visibleRange) return;\n\n const buffer = config.viewportBuffer;\n const rangeWidth = visibleRange.xMax - visibleRange.xMin;\n const buffered = {\n xMin: visibleRange.xMin - rangeWidth * buffer,\n xMax: visibleRange.xMax + rangeWidth * buffer,\n };\n\n for (const [, seriesInfo] of series) {\n const chunksToLoad: number[] = [];\n const totalChunks = Math.ceil(seriesInfo.totalPoints / config.chunkSize);\n\n // Identify chunks within the buffered viewport\n const startIdx = Math.max(0, Math.floor(buffered.xMin / config.chunkSize));\n const endIdx = Math.min(totalChunks - 1, Math.floor(buffered.xMax / config.chunkSize));\n\n for (let i = startIdx; i <= endIdx; i++) {\n if (!seriesInfo.chunks.has(i) && !seriesInfo.loading.has(i)) {\n chunksToLoad.push(i);\n }\n }\n\n // Load chunks sequentially (limit to avoid flood)\n const maxToLoad = Math.min(chunksToLoad.length, 10);\n for (let i = 0; i < maxToLoad; i++) {\n await loadChunk(seriesInfo, chunksToLoad[i]);\n }\n\n // Preload next adjacent chunk if enabled\n if (config.preloadAdjacent && endIdx + 1 < totalChunks) {\n const nextChunk = endIdx + 1;\n if (!seriesInfo.chunks.has(nextChunk) && !seriesInfo.loading.has(nextChunk)) {\n loadChunk(seriesInfo, nextChunk); // Fire and forget\n }\n }\n }\n }\n\n /**\n * Unload distant chunks\n */\n function unloadDistant(): number {\n if (!config.autoUnload || !ctx) return 0;\n\n const visibleRange = getVisibleRange();\n if (!visibleRange) return 0;\n\n let unloadedCount = 0;\n\n for (const [, seriesInfo] of series) {\n // TODO: Implement distance-based unloading logic\n // For now, only maxLoadedChunks handles eviction\n\n // Enforce max chunks limit\n if (seriesInfo.chunks.size > config.maxLoadedChunks) {\n const sortedChunks = Array.from(seriesInfo.chunks.entries()).sort(\n (a, b) => a[1].loadedAt - b[1].loadedAt\n );\n \n const toRemove = seriesInfo.chunks.size - config.maxLoadedChunks;\n for (let i = 0; i < toRemove; i++) {\n seriesInfo.chunks.delete(sortedChunks[i][0]);\n unloadedCount++;\n }\n }\n }\n\n if (config.debug && unloadedCount > 0) {\n console.log(`[LazyLoad] Unloaded ${unloadedCount} chunks`);\n }\n\n return unloadedCount;\n }\n\n /**\n * Register a series\n */\n function registerSeries(seriesId: string, provider: DataProvider): void {\n const totalPoints = provider.getTotalCount();\n \n series.set(seriesId, {\n id: seriesId,\n provider,\n chunks: new Map(),\n loading: new Set(),\n totalPoints,\n });\n\n if (config.debug) {\n console.log(`[LazyLoad] Registered series ${seriesId} with ${totalPoints} points`);\n }\n\n // Fire load start event\n config.onLoadStart({\n seriesId,\n loadedPoints: 0,\n totalPoints,\n progress: 0,\n currentChunk: 0,\n totalChunks: Math.ceil(totalPoints / config.chunkSize),\n });\n\n // Auto-load if enabled\n if (config.autoLoad) {\n loadVisible();\n }\n }\n\n /**\n * Unregister a series\n */\n function unregisterSeries(seriesId: string): void {\n series.delete(seriesId);\n \n if (config.debug) {\n console.log(`[LazyLoad] Unregistered series ${seriesId}`);\n }\n }\n\n /**\n * Load specific range\n */\n async function loadRange(\n seriesId: string,\n startIndex: number,\n endIndex: number\n ): Promise<void> {\n const seriesInfo = series.get(seriesId);\n if (!seriesInfo) return;\n\n const startChunk = getChunkIndex(startIndex);\n const endChunk = getChunkIndex(endIndex);\n\n for (let i = startChunk; i <= endChunk; i++) {\n await loadChunk(seriesInfo, i);\n }\n }\n\n /**\n * Get loading status\n */\n function getLoadingStatus(seriesId: string) {\n const seriesInfo = series.get(seriesId);\n if (!seriesInfo) return null;\n\n const loadedPoints = Array.from(seriesInfo.chunks.values()).reduce(\n (sum, c) => sum + (c.endIndex - c.startIndex),\n 0\n );\n\n return {\n loadedPoints,\n totalPoints: seriesInfo.totalPoints,\n loadedChunks: seriesInfo.chunks.size,\n totalChunks: Math.ceil(seriesInfo.totalPoints / config.chunkSize),\n };\n }\n\n /**\n * Clear all data\n */\n function clear(): void {\n for (const [, seriesInfo] of series) {\n seriesInfo.chunks.clear();\n seriesInfo.loading.clear();\n }\n }\n\n // API implementation\n const api: LazyLoadAPI & Record<string, unknown> = {\n registerSeries,\n unregisterSeries,\n loadRange,\n loadVisible,\n unloadDistant,\n getLoadingStatus,\n clear,\n updateConfig(newConfig: Partial<PluginLazyLoadConfig>) {\n Object.assign(config, newConfig);\n },\n };\n\n return {\n manifest,\n\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n\n // Attach to chart API\n (ctx.chart as any).lazyLoad = api;\n\n // Listen for zoom/pan if auto-load enabled\n if (config.autoLoad) {\n ctx.chart.on?.('zoom', () => {\n loadVisible();\n if (config.autoUnload) {\n unloadDistant();\n }\n });\n\n ctx.chart.on?.('pan', () => {\n loadVisible();\n if (config.autoUnload) {\n unloadDistant();\n }\n });\n }\n },\n\n onDestroy(pluginCtx: PluginContext) {\n // Clear all data\n clear();\n\n // Remove from chart API\n delete (pluginCtx.chart as any).lazyLoad;\n\n ctx = null;\n },\n\n api,\n };\n}\n\nexport default PluginLazyLoad;\n\n// Type exports\nexport type {\n PluginLazyLoadConfig,\n LazyLoadAPI,\n DataProvider,\n DataChunk,\n LoadProgressEvent,\n} from './types';\n","import type { Scale } from \"../../scales\";\nimport type { AxisBreak } from \"./types\";\n\nexport class BrokenAxisScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\"; // Compatible with linear for renderer selection\n\n private underlying: Scale;\n private sortedBreaks: AxisBreak[] = [];\n private visibleRanges: { start: number; end: number; pixelOffset: number; pixelScale: number }[] = [];\n private availableVisualRatio: number = 1.0;\n\n constructor(originalScale: Scale, private breaks: AxisBreak[]) {\n this.underlying = originalScale;\n this.domain = [...originalScale.domain];\n this.range = [...originalScale.range];\n this.refresh();\n }\n\n setDomain(min: number, max: number): void {\n this.domain = [min, max];\n this.underlying.setDomain(min, max);\n this.refresh();\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n this.underlying.setRange(min, max);\n this.refresh();\n }\n\n updateBreaks(breaks: AxisBreak[]) {\n this.breaks = breaks;\n this.refresh();\n }\n\n private refresh() {\n const [min, max] = this.domain;\n \n // 1. Sort and filter breaks within [min, max]\n this.sortedBreaks = this.breaks\n .filter(b => b.start < max && b.end > min)\n .map(b => ({\n ...b,\n start: Math.max(min, b.start),\n end: Math.min(max, b.end),\n visualRatio: b.visualRatio ?? 0.02\n }))\n .sort((a, b) => a.start - b.start);\n\n // 2. Identify visible data segments\n const segments: { start: number; end: number }[] = [];\n let current = min;\n\n for (const b of this.sortedBreaks) {\n if (b.start > current) {\n segments.push({ start: current, end: b.start });\n }\n current = b.end;\n }\n if (current < max) {\n segments.push({ start: current, end: max });\n }\n\n // 3. Calculate total data span of visible segments\n const totalVisibleDataWidth = segments.reduce((sum, s) => sum + (s.end - s.start), 0) || 1e-10;\n const totalBreakVisualRatio = this.sortedBreaks.reduce((sum, b) => sum + (b.visualRatio || 0.02), 0);\n this.availableVisualRatio = Math.max(0.1, 1.0 - totalBreakVisualRatio);\n\n // 4. Calculate mapping for each segment (in 0-1 ratio space)\n let currentRatioOffset = 0;\n this.visibleRanges = segments.map(s => {\n const dataWidth = s.end - s.start;\n const visualWidth = (dataWidth / totalVisibleDataWidth) * this.availableVisualRatio;\n const range = {\n start: s.start,\n end: s.end,\n pixelOffset: currentRatioOffset,\n pixelScale: visualWidth / dataWidth\n };\n \n // Find following break if any to advance offset\n const nextBreak = this.sortedBreaks.find(b => Math.abs(b.start - s.end) < 1e-10);\n currentRatioOffset += visualWidth + (nextBreak?.visualRatio ?? 0);\n \n return range;\n });\n }\n\n transform(value: number): number {\n const [min, max] = this.domain;\n const [r0, r1] = this.range;\n const isReverse = r1 < r0;\n \n let ratio = 0;\n if (value <= min) ratio = 0;\n else if (value >= max) ratio = 1;\n else {\n let found = false;\n // Check visible segments\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n ratio = range.pixelOffset + (value - range.start) * range.pixelScale;\n found = true;\n break;\n }\n }\n \n // If in break\n if (!found) {\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n ratio = offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n found = true;\n break;\n }\n }\n }\n \n if (!found) ratio = 0;\n }\n\n // Map ratio to pixels\n return isReverse ? r0 - ratio * (r0 - r1) : r0 + ratio * (r1 - r0);\n }\n\n /** Map data value to 0-1 ratio space (handles breaks) */\n mapToRatio(value: number): number {\n const [min, max] = this.domain;\n if (value <= min) return 0;\n if (value >= max) return 1;\n\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n return range.pixelOffset + (value - range.start) * range.pixelScale;\n }\n }\n\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n return offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n }\n }\n\n return 0;\n }\n\n invert(pixel: number): number {\n const [r0, r1] = this.range;\n const ratio = (pixel - r0) / (r1 - r0);\n \n const r = Math.max(0, Math.min(1, ratio));\n\n for (const range of this.visibleRanges) {\n const visualEnd = range.pixelOffset + (range.end - range.start) * range.pixelScale;\n if (r >= range.pixelOffset && r <= visualEnd) {\n return range.start + (r - range.pixelOffset) / range.pixelScale;\n }\n }\n\n // In break, return nearest segment boundary\n for (let i = 0; i < this.sortedBreaks.length; i++) {\n const b = this.sortedBreaks[i];\n const prevRange = this.visibleRanges.find(range => Math.abs(range.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n if (r >= offset && r <= offset + (b.visualRatio ?? 0.02)) {\n return b.start;\n }\n }\n\n return this.domain[0];\n }\n\n ticks(count: number = 10): number[] {\n // Generate ticks for each visible segment based on their visual weight\n const allTicks: number[] = [];\n \n for (const range of this.visibleRanges) {\n const visualWeight = (range.end - range.start) / (this.domain[1] - this.domain[0]);\n const segmentCount = Math.max(2, Math.round(count * visualWeight / this.availableVisualRatio));\n \n // Use underlying logic for \"nice\" steps but restricted to this range\n const segmentTicks = this.generateSegmentTicks(range.start, range.end, segmentCount);\n allTicks.push(...segmentTicks);\n }\n\n // Remove duplicates and sort\n return Array.from(new Set(allTicks)).sort((a, b) => a - b);\n }\n\n private generateSegmentTicks(min: number, max: number, count: number): number[] {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return [];\n \n // Re-use niceStep logic\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n let step: number;\n if (normalized < 1.5) step = 1; else if (normalized < 3) step = 2; else if (normalized < 7) step = 5; else step = 10;\n step *= magnitude;\n\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n let t = start;\n while (t <= max + step * 0.1) {\n ticks.push(Math.round(t * 1e12) / 1e12);\n t += step;\n }\n return ticks;\n }\n}\n","/**\n * @fileoverview Broken Axis plugin for displaying discontinuous data ranges.\n * @module plugins/broken-axis\n */\n\nimport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\nimport { BrokenAxisScale } from './BrokenAxisScale';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-broken-axis',\n version: '1.0.1',\n description: 'Support for gaps/breaks in axes with visual indicators',\n provides: ['broken-axis', 'coordinate-transform'],\n tags: ['axis', 'layout', 'visualization'],\n};\n\nexport function PluginBrokenAxis(\n config: PluginBrokenAxisConfig = { axes: {} }\n): ChartPlugin<PluginBrokenAxisConfig> {\n // Default enabled to true if not specified\n if (config.enabled === undefined) config.enabled = true;\n \n let ctx: PluginContext | null = null;\n let originalXScale: any = null;\n let brokenXScale: BrokenAxisScale | null = null;\n \n // Storage for raw data of series to allow re-transformation on zoom\n const rawDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n function updateScales() {\n if (!ctx || !config.enabled) return;\n \n const options = config.axes.default || config.axes.xAxis;\n if (options && brokenXScale) {\n brokenXScale.updateBreaks(options.breaks);\n // On break change, we must re-transform everything\n applyTransformations();\n }\n }\n\n function applyTransformations() {\n if (!ctx || !brokenXScale || !config.enabled) return;\n const chart = ctx.chart as any;\n const [min, max] = brokenXScale.domain;\n const range = max - min;\n\n for (const [id, raw] of rawDataStore.entries()) {\n const transformedX = new Float32Array(raw.x.length);\n for (let i = 0; i < raw.x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(raw.x[i]) * range;\n }\n // Call the TRUE underlying updateSeries to avoid hijacking loop\n if (chart._originalUpdateSeries) {\n chart._originalUpdateSeries(id, { x: transformedX, y: raw.y });\n }\n }\n }\n\n function drawBreakSymbols(pCtx: PluginContext) {\n const { render } = pCtx;\n const { ctx2d, plotArea } = render;\n if (!ctx2d || !brokenXScale) return;\n\n for (const [axisId, options] of Object.entries(config.axes)) {\n const orientation = (axisId === 'default' || axisId === 'xAxis') ? 'horizontal' : 'vertical';\n if (orientation !== 'horizontal') continue;\n\n options.breaks.forEach(b => {\n const pxStart = brokenXScale!.transform(b.start);\n const pxEnd = brokenXScale!.transform(b.end);\n const midPx = (pxStart + pxEnd) / 2;\n\n ctx2d.save();\n ctx2d.lineWidth = 1;\n ctx2d.strokeStyle = options.symbolColor || '#ff00ff';\n\n if (orientation === 'horizontal') {\n drawSymbol(ctx2d, midPx, plotArea.y, options.defaultSymbol || 'diagonal', 'top');\n drawSymbol(ctx2d, midPx, plotArea.y + plotArea.height, options.defaultSymbol || 'diagonal', 'bottom');\n }\n ctx2d.restore();\n });\n }\n }\n\n function drawSymbol(ctx: CanvasRenderingContext2D, x: number, y: number, type: string, edge: string) {\n const size = 6;\n ctx.beginPath();\n if (type === 'diagonal') {\n ctx.moveTo(x - size, y + size/2);\n ctx.lineTo(x + size, y - size/2);\n ctx.moveTo(x - size + 3, y + size/2);\n ctx.lineTo(x + size + 3, y - size/2);\n } else if (type === 'zigzag') {\n ctx.moveTo(x - size, y);\n ctx.lineTo(x - size/2, y - size/2);\n ctx.lineTo(x + size/2, y + size/2);\n ctx.lineTo(x + size, y);\n } else {\n if (edge === 'top' || edge === 'bottom') {\n ctx.moveTo(x - size, y - 2); ctx.lineTo(x + size, y + 2);\n ctx.moveTo(x - size, y - 6); ctx.lineTo(x + size, y - 2);\n } else {\n ctx.moveTo(x - 2, y - size); ctx.lineTo(x + 2, y + size);\n }\n }\n ctx.stroke();\n }\n\n const api: BrokenAxisAPI = {\n addBreak(axisId, b) {\n if (!config.axes[axisId]) config.axes[axisId] = { breaks: [] };\n config.axes[axisId].breaks.push(b);\n updateScales();\n ctx?.requestRender();\n },\n clearBreaks(axisId) {\n if (config.axes[axisId]) config.axes[axisId].breaks = [];\n updateScales();\n ctx?.requestRender();\n },\n setEnabled(enabled: boolean) {\n const wasEnabled = config.enabled;\n config.enabled = enabled;\n \n if (ctx && wasEnabled !== enabled) {\n const chart = ctx.chart;\n if (enabled) {\n originalXScale = (chart as any).xScale;\n brokenXScale = new BrokenAxisScale(originalXScale, (config.axes.default || config.axes.xAxis)?.breaks || []);\n chart.setXScale(brokenXScale);\n applyTransformations();\n } else {\n if (originalXScale) {\n chart.setXScale(originalXScale);\n brokenXScale = null;\n // Restore original data to series\n for (const [id, raw] of rawDataStore.entries()) {\n (chart as any)._originalUpdateSeries(id, raw);\n }\n }\n }\n }\n ctx?.requestRender();\n },\n getBreaks(axisId: string): AxisBreak[] {\n return config.axes[axisId]?.breaks || [];\n },\n updateConfig(newConfig: Partial<PluginBrokenAxisConfig>) {\n Object.assign(config, newConfig);\n updateScales();\n ctx?.requestRender();\n }\n };\n\n const pluginApi: BrokenAxisAPI & Record<string, unknown> = api as any;\n\n return {\n manifest,\n onInit(pCtx) {\n ctx = pCtx;\n const chart = ctx.chart as any;\n chart.brokenAxis = pluginApi;\n\n // Hijack and Save original methods\n chart._originalUpdateSeries = chart.updateSeries.bind(chart);\n chart._originalAddSeries = chart.addSeries.bind(chart);\n chart._originalAppendData = chart.appendData.bind(chart);\n\n chart.updateSeries = (id: string, data: any) => {\n if (data.x && data.y) {\n rawDataStore.set(id, { \n x: data.x instanceof Float32Array ? data.x : new Float32Array(data.x), \n y: data.y instanceof Float32Array ? data.y : new Float32Array(data.y) \n });\n }\n \n if (config.enabled && brokenXScale && data.x) {\n const x = data.x;\n const transformedX = new Float32Array(x.length);\n const [min, max] = brokenXScale.domain;\n const range = max - min;\n for (let i = 0; i < x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(x[i]) * range;\n }\n chart._originalUpdateSeries(id, { ...data, x: transformedX });\n } else {\n chart._originalUpdateSeries(id, data);\n }\n };\n\n chart.addSeries = (options: any) => {\n if (options.id && options.data?.x && options.data?.y) {\n rawDataStore.set(options.id, { \n x: options.data.x instanceof Float32Array ? options.data.x : new Float32Array(options.data.x), \n y: options.data.y instanceof Float32Array ? options.data.y : new Float32Array(options.data.y) \n });\n }\n \n if (config.enabled && brokenXScale && options.data?.x) {\n const x = options.data.x;\n const transformedX = new Float32Array(x.length);\n const [min, max] = brokenXScale.domain;\n const range = max - min;\n for (let i = 0; i < x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(x[i]) * range;\n }\n chart._originalAddSeries({ ...options, data: { ...options.data, x: transformedX } });\n } else {\n chart._originalAddSeries(options);\n }\n };\n\n chart.appendData = (id: string, x: any, y: any) => {\n const raw = rawDataStore.get(id);\n if (raw) {\n const newX = x instanceof Float32Array ? x : [x];\n const newY = y instanceof Float32Array ? y : [y];\n const combinedX = new Float32Array(raw.x.length + newX.length);\n const combinedY = new Float32Array(raw.y.length + newY.length);\n combinedX.set(raw.x);\n combinedX.set(newX, raw.x.length);\n combinedY.set(raw.y);\n combinedY.set(newY, raw.y.length);\n rawDataStore.set(id, { x: combinedX, y: combinedY });\n }\n\n if (config.enabled && brokenXScale) {\n const xArr = x instanceof Array ? new Float32Array(x) : (typeof x === 'number' ? new Float32Array([x]) : x);\n const transformedX = new Float32Array(xArr.length);\n const [min, max] = brokenXScale.domain;\n const range = max - min;\n for (let i = 0; i < xArr.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(xArr[i]) * range;\n }\n chart._originalAppendData(id, transformedX, y);\n } else {\n chart._originalAppendData(id, x, y);\n }\n };\n\n if (config.enabled) {\n originalXScale = chart.xScale; \n const options = config.axes.default || config.axes.xAxis;\n brokenXScale = new BrokenAxisScale(originalXScale, options?.breaks || []);\n chart.setXScale(brokenXScale);\n }\n },\n onDestroy() {\n if (ctx) {\n const chart = (ctx.chart as any);\n delete chart.brokenAxis;\n if (originalXScale) {\n chart.setXScale(originalXScale);\n }\n // CLEANUP hijacked methods\n chart.updateSeries = chart._originalUpdateSeries;\n chart.addSeries = chart._originalAddSeries;\n chart.appendData = chart._originalAppendData;\n delete chart._originalUpdateSeries;\n delete chart._originalAddSeries;\n delete chart._originalAppendData;\n }\n ctx = null;\n rawDataStore.clear();\n },\n onRenderOverlay(pCtx) {\n if (config.enabled) drawBreakSymbols(pCtx);\n },\n onViewChange() {\n if (config.enabled && brokenXScale) {\n applyTransformations();\n }\n },\n api: pluginApi\n };\n}\n\nexport default PluginBrokenAxis;\n\nexport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n BrokenAxisOptions,\n} from './types';\n","/**\n * @fileoverview Video Recorder plugin for capturing chart animations.\n * @module plugins/video-recorder\n */\n\nimport type {\n PluginVideoRecorderConfig,\n VideoRecorderAPI,\n VideoRecorderOptions,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-video-recorder',\n version: '1.0.0',\n description: 'Capture chart animations and export to video files',\n provides: ['video-export', 'media-tools'],\n tags: ['export', 'video', 'animation'],\n};\n\nconst DEFAULT_CONFIG: Required<PluginVideoRecorderConfig> = {\n format: 'webm',\n fps: 30,\n bitrate: 2500000,\n fillBackground: true,\n backgroundColor: '#ffffff',\n quality: 0.9,\n autoDownload: false,\n filename: 'chart-recording',\n debug: false,\n};\n\nexport function PluginVideoRecorder(\n userConfig: Partial<PluginVideoRecorderConfig> = {}\n): ChartPlugin<PluginVideoRecorderConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n \n let mediaRecorder: MediaRecorder | null = null;\n let recordedChunks: Blob[] = [];\n let isRecording = false;\n let isPaused = false;\n \n // Composite canvas for capturing both WebGL and Overlay\n let compositeCanvas: HTMLCanvasElement | null = null;\n let compositeCtx: CanvasRenderingContext2D | null = null;\n let animationFrameId: number | null = null;\n\n function createCompositeCanvas() {\n if (!ctx) return;\n \n // Get canvases from the rendering context\n const mainCanvas = ctx.render.gl?.canvas as HTMLCanvasElement;\n \n if (!mainCanvas) return;\n\n compositeCanvas = document.createElement('canvas');\n compositeCanvas.width = mainCanvas.width;\n compositeCanvas.height = mainCanvas.height;\n compositeCtx = compositeCanvas.getContext('2d');\n }\n\n function updateComposite() {\n if (!ctx || !compositeCtx || !compositeCanvas) return;\n \n const mainCanvas = ctx.render.gl?.canvas as HTMLCanvasElement;\n const overlayCanvas = ctx.render.ctx2d?.canvas as HTMLCanvasElement;\n \n // Clear/Background\n if (config.fillBackground) {\n compositeCtx.fillStyle = config.backgroundColor || (ctx.chart as any).getTheme?.()?.background || '#ffffff';\n compositeCtx.fillRect(0, 0, compositeCanvas.width, compositeCanvas.height);\n } else {\n compositeCtx.clearRect(0, 0, compositeCanvas.width, compositeCanvas.height);\n }\n\n // Draw all chart canvases in order\n if (mainCanvas) compositeCtx.drawImage(mainCanvas, 0, 0);\n if (overlayCanvas) compositeCtx.drawImage(overlayCanvas, 0, 0);\n\n if (isRecording && !isPaused) {\n if (animationFrameId) cancelAnimationFrame(animationFrameId);\n animationFrameId = requestAnimationFrame(updateComposite);\n }\n }\n\n const api: VideoRecorderAPI = {\n start() {\n if (isRecording || !ctx) return;\n \n createCompositeCanvas();\n if (!compositeCanvas) {\n console.error('[VideoRecorder] Could not initialize capture canvas');\n return;\n }\n\n recordedChunks = [];\n const stream = compositeCanvas.captureStream(config.fps);\n \n const options: MediaRecorderOptions = {\n mimeType: config.format === 'mp4' ? 'video/mp4;codecs=h264' : 'video/webm;codecs=vp9',\n videoBitsPerSecond: config.bitrate\n };\n\n // Check for browser support and fallback\n if (!MediaRecorder.isTypeSupported(options.mimeType!)) {\n options.mimeType = 'video/webm';\n }\n\n try {\n mediaRecorder = new MediaRecorder(stream, options);\n \n mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n recordedChunks.push(event.data);\n }\n };\n\n mediaRecorder.onstop = () => {\n isRecording = false;\n if (animationFrameId) cancelAnimationFrame(animationFrameId);\n };\n\n isRecording = true;\n isPaused = false;\n mediaRecorder.start(100); // Collect data every 100ms\n \n if (animationFrameId) cancelAnimationFrame(animationFrameId);\n updateComposite(); // Start render loop\n \n if (config.debug) console.log('[VideoRecorder] Recording started');\n } catch (e) {\n console.error('[VideoRecorder] Failed to start MediaRecorder:', e);\n }\n },\n\n async stop(): Promise<Blob> {\n return new Promise((resolve) => {\n if (!mediaRecorder || !isRecording) {\n resolve(new Blob([], { type: 'video/webm' }));\n return;\n }\n\n mediaRecorder.onstop = () => {\n const blob = new Blob(recordedChunks, {\n type: config.format === 'mp4' ? 'video/mp4' : 'video/webm'\n });\n \n if (config.autoDownload) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${config.filename}.${config.format}`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 100);\n }\n\n resolve(blob);\n isRecording = false;\n if (animationFrameId) cancelAnimationFrame(animationFrameId);\n if (config.debug) console.log('[VideoRecorder] Recording stopped, size:', blob.size);\n };\n\n mediaRecorder.stop();\n });\n },\n\n pause() {\n if (mediaRecorder && isRecording && !isPaused) {\n mediaRecorder.pause();\n isPaused = true;\n }\n },\n\n resume() {\n if (mediaRecorder && isRecording && isPaused) {\n mediaRecorder.resume();\n isPaused = false;\n if (animationFrameId) cancelAnimationFrame(animationFrameId);\n updateComposite();\n }\n },\n\n isRecording() { return isRecording; },\n isPaused() { return isPaused; },\n \n updateConfig(newConfig: Partial<VideoRecorderOptions>) {\n Object.assign(config, newConfig);\n }\n };\n\n const pluginApi: VideoRecorderAPI & Record<string, unknown> = api as any;\n\n return {\n manifest,\n onInit(pCtx) {\n ctx = pCtx;\n },\n onDestroy() {\n if (isRecording) {\n mediaRecorder?.stop();\n if (animationFrameId) cancelAnimationFrame(animationFrameId);\n }\n ctx = null;\n },\n api: pluginApi\n };\n}\n\nexport default PluginVideoRecorder;\n\n// Type exports\nexport type {\n PluginVideoRecorderConfig,\n VideoRecorderAPI,\n VideoRecorderOptions,\n} from './types';\n","/**\n * @fileoverview Worker Pool Manager for Offscreen Rendering\n * @module plugins/offscreen/pool\n */\n\nexport interface WorkerTask {\n id: string;\n priority: number;\n timestamp: number;\n resolve: (value: ImageBitmap) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private availableWorkers: Set<number> = new Set();\n private taskQueue: WorkerTask[] = [];\n private activeJobs: Map<string, number> = new Map(); // taskId => workerIndex\n\n constructor(private size: number) {\n this.initialize();\n }\n\n private initialize(): void {\n const workerCode = `\n // Simple offscreen worker\n self.onmessage = (e) => {\n const { type, width, height, dpr } = e.data;\n \n if (type === 'render') {\n // Echo back - actual rendering logic would go here\n self.postMessage({ type: 'response', taskId: e.data.taskId });\n }\n };\n `;\n\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n const workerUrl = URL.createObjectURL(blob);\n\n for (let i = 0; i < this.size; i++) {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = (e) => this.handleWorkerMessage(i, e);\n worker.onerror = (e) => this.handleWorkerError(i, e);\n this.workers.push(worker);\n this.availableWorkers.add(i);\n } catch (error) {\n console.error(`Failed to create worker ${i}:`, error);\n }\n }\n\n URL.revokeObjectURL(workerUrl);\n }\n\n private handleWorkerMessage(workerIndex: number, event: MessageEvent): void {\n const { type, taskId, imageData, error } = event.data;\n\n if (type === 'response') {\n const task = this.findTask(taskId);\n if (task) {\n if (error) {\n task.reject(new Error(error));\n } else if (imageData) {\n task.resolve(imageData);\n }\n this.activeJobs.delete(taskId);\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n }\n }\n\n private handleWorkerError(workerIndex: number, error: ErrorEvent): void {\n console.error(`Worker ${workerIndex} error:`, error);\n // Find and reject any active task for this worker\n for (const [taskId, wIndex] of this.activeJobs.entries()) {\n if (wIndex === workerIndex) {\n const task = this.findTask(taskId);\n if (task) {\n task.reject(new Error(`Worker error: ${error.message}`));\n this.activeJobs.delete(taskId);\n }\n }\n }\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n\n private findTask(taskId: string): WorkerTask | undefined {\n return this.taskQueue.find(t => t.id === taskId);\n }\n\n private processQueue(): void {\n while (this.availableWorkers.size > 0 && this.taskQueue.length > 0) {\n // Sort by priority and timestamp\n this.taskQueue.sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority;\n return a.timestamp - b.timestamp;\n });\n\n const task = this.taskQueue.shift();\n if (!task) break;\n\n const workerIndex = Array.from(this.availableWorkers)[0];\n this.availableWorkers.delete(workerIndex);\n this.activeJobs.set(task.id, workerIndex);\n\n // Send task to worker\n this.workers[workerIndex].postMessage({\n type: 'render',\n taskId: task.id,\n });\n }\n }\n\n public submit(priority: number = 0): Promise<ImageBitmap> {\n return new Promise((resolve, reject) => {\n const task: WorkerTask = {\n id: Math.random().toString(36).substring(7),\n priority,\n timestamp: Date.now(),\n resolve,\n reject,\n };\n\n this.taskQueue.push(task);\n this.processQueue();\n });\n }\n\n public getStats() {\n return {\n total: this.workers.length,\n active: this.activeJobs.size,\n idle: this.availableWorkers.size,\n queued: this.taskQueue.length,\n };\n }\n\n public destroy(): void {\n for (const worker of this.workers) {\n worker.terminate();\n }\n this.workers = [];\n this.availableWorkers.clear();\n this.taskQueue = [];\n this.activeJobs.clear();\n }\n}\n","/**\n * @fileoverview Offscreen rendering plugin (skeleton with stats + feature detection)\n * @module plugins/offscreen\n */\n\nimport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n} from \"./types\";\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-offscreen\",\n version: \"1.0.0\",\n description: \"Offscreen rendering support with worker-ready scaffolding\",\n provides: [\"performance\", \"offscreen\"],\n tags: [\"performance\", \"offscreen\", \"worker\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginOffscreenConfig> = {\n enabled: false,\n mode: \"auto\",\n workerPool: 1,\n transfer: \"offscreen\",\n fallback: \"main-thread\",\n debug: false,\n};\n\nimport { WorkerPool } from \"./pool\";\n\nexport function PluginOffscreen(\n userConfig: Partial<PluginOffscreenConfig> = {}\n): ChartPlugin<PluginOffscreenConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n let pool: WorkerPool | null = null;\n let stats: OffscreenStats = {\n enabled: config.enabled,\n frames: 0,\n lastFrameTime: 0,\n lastFrameTimestamp: 0,\n };\n\n function log(message: string, ...args: unknown[]) {\n if (config.debug && ctx) {\n ctx.log.info(`[Offscreen] ${message}`, ...args);\n }\n }\n\n function isSupported(): boolean {\n return typeof (globalThis as any).OffscreenCanvas !== \"undefined\";\n }\n\n function enable(): void {\n if (!isSupported()) {\n log(\"OffscreenCanvas not supported. Falling back to main thread.\");\n if (config.fallback === \"disable\") {\n stats.enabled = false;\n return;\n }\n }\n \n if (!pool) {\n pool = new WorkerPool(config.workerPool || 1);\n }\n \n stats.enabled = true;\n config.enabled = true;\n }\n\n function disable(): void {\n if (pool) {\n pool.destroy();\n pool = null;\n }\n stats.enabled = false;\n config.enabled = false;\n }\n\n function updateConfig(newConfig: Partial<PluginOffscreenConfig>): void {\n Object.assign(config, newConfig);\n if (config.enabled) enable();\n else disable();\n stats.enabled = !!config.enabled;\n }\n\n function getStats(): OffscreenStats {\n const poolStats = pool?.getStats();\n return { \n ...stats,\n activeWorkers: poolStats?.active || 0,\n queuedTasks: poolStats?.queued || 0\n } as any;\n }\n\n function flush(): void {\n ctx?.requestRender();\n }\n\n const api: OffscreenAPI & Record<string, unknown> = {\n enable,\n disable,\n isEnabled: () => stats.enabled,\n updateConfig,\n getStats,\n flush,\n };\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n (ctx.chart as any).offscreen = api;\n if (config.enabled) enable();\n log(`Initialized (pool=${config.workerPool})`);\n },\n onDestroy(pluginCtx: PluginContext) {\n disable();\n delete (pluginCtx.chart as any).offscreen;\n ctx = null;\n },\n onAfterRender(_ctx, event) {\n stats.frames += 1;\n stats.lastFrameTime = event.renderTime;\n stats.lastFrameTimestamp = event.timestamp;\n \n if (config.enabled && pool) {\n // In a real implementation, we would offload the next render piece here\n // For now, we just track that we could have used the pool\n }\n },\n api,\n };\n}\n\nexport default PluginOffscreen;\n\n// Type exports\nexport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n OffscreenMode,\n OffscreenTransferMode,\n OffscreenFallbackMode,\n} from \"./types\";\n","/**\n * LTTB (Largest-Triangle-Three-Buckets) Downsampling Algorithm\n *\n * This algorithm downsamples time-series data while preserving visual features.\n * It's much better than naive sampling for preserving peaks and valleys.\n *\n * Reference: https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf\n */\n\nexport interface DownsampleResult {\n x: Float32Array;\n y: Float32Array;\n /** Original indices of selected points */\n indices: Uint32Array;\n}\n\n/**\n * Downsample data using LTTB algorithm\n *\n * @param x - X values (e.g., potential)\n * @param y - Y values (e.g., current)\n * @param targetPoints - Number of output points\n * @returns Downsampled data\n */\nexport function lttbDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): DownsampleResult {\n const length = x.length;\n\n // No need to downsample\n if (targetPoints >= length || targetPoints <= 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const outX = new Float32Array(targetPoints);\n const outY = new Float32Array(targetPoints);\n const outIndices = new Uint32Array(targetPoints);\n\n // Always include first point\n outX[0] = x[0];\n outY[0] = y[0];\n outIndices[0] = 0;\n\n // Bucket size\n const bucketSize = (length - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let outIdx = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket boundaries\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n\n // Calculate average point of next bucket\n const nextBucketStart = Math.min(bucketEnd, length - 1);\n const nextBucketEnd = Math.min(\n Math.floor((i + 3) * bucketSize) + 1,\n length\n );\n\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = nextBucketStart; j < nextBucketEnd; j++) {\n avgX += x[j];\n avgY += y[j];\n avgCount++;\n }\n\n if (avgCount > 0) {\n avgX /= avgCount;\n avgY /= avgCount;\n }\n\n // Find point in current bucket with largest triangle area\n let maxArea = -1;\n let maxIndex = bucketStart;\n\n const aX = x[a];\n const aY = y[a];\n\n for (let j = bucketStart; j < bucketEnd && j < length; j++) {\n // Calculate triangle area (simplified: |x1(y2-y3) + x2(y3-y1) + x3(y1-y2)| / 2)\n const area = Math.abs(\n (aX - avgX) * (y[j] - aY) - (aX - x[j]) * (avgY - aY)\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxIndex = j;\n }\n }\n\n // Store selected point\n outX[outIdx] = x[maxIndex];\n outY[outIdx] = y[maxIndex];\n outIndices[outIdx] = maxIndex;\n\n a = maxIndex;\n outIdx++;\n }\n\n // Always include last point\n outX[targetPoints - 1] = x[length - 1];\n outY[targetPoints - 1] = y[length - 1];\n outIndices[targetPoints - 1] = length - 1;\n\n return { x: outX, y: outY, indices: outIndices };\n}\n\n/**\n * Min-Max per bucket downsampling\n *\n * Simpler alternative to LTTB that preserves extremes in each bucket.\n * Uses 2 points per bucket (min and max), so output is ~2x target.\n */\nexport function minMaxDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n bucketCount: number\n): DownsampleResult {\n const length = x.length;\n\n if (bucketCount >= length / 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const bucketSize = length / bucketCount;\n const outX: number[] = [];\n const outY: number[] = [];\n const outIndices: number[] = [];\n\n for (let b = 0; b < bucketCount; b++) {\n const start = Math.floor(b * bucketSize);\n const end = Math.floor((b + 1) * bucketSize);\n\n let minY = Infinity;\n let maxY = -Infinity;\n let minIdx = start;\n let maxIdx = start;\n\n for (let i = start; i < end && i < length; i++) {\n if (y[i] < minY) {\n minY = y[i];\n minIdx = i;\n }\n if (y[i] > maxY) {\n maxY = y[i];\n maxIdx = i;\n }\n }\n\n // Add points in order (min first if it comes before max)\n if (minIdx <= maxIdx) {\n outX.push(x[minIdx], x[maxIdx]);\n outY.push(y[minIdx], y[maxIdx]);\n outIndices.push(minIdx, maxIdx);\n } else {\n outX.push(x[maxIdx], x[minIdx]);\n outY.push(y[maxIdx], y[minIdx]);\n outIndices.push(maxIdx, minIdx);\n }\n }\n\n return {\n x: new Float32Array(outX),\n y: new Float32Array(outY),\n indices: new Uint32Array(outIndices),\n };\n}\n\n/**\n * Calculate optimal target points based on canvas width\n */\nexport function calculateTargetPoints(\n dataLength: number,\n canvasWidth: number,\n pointsPerPixel = 2\n): number {\n // Never draw more than pointsPerPixel per pixel\n const maxPoints = canvasWidth * pointsPerPixel;\n return Math.min(dataLength, maxPoints);\n}\n","/**\n * @fileoverview Data virtualization plugin (LOD/min-max)\n * @module plugins/virtualization\n */\n\nimport type {\n PluginVirtualizationConfig,\n VirtualizationAPI,\n VirtualizationStats,\n VirtualizationMode,\n VirtualizationStrategy,\n} from \"./types\";\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\nimport type { Series } from \"../../core/Series\";\nimport type { SeriesUpdateData } from \"../../types\";\nimport {\n lttbDownsample,\n minMaxDownsample,\n calculateTargetPoints,\n} from \"../../workers/downsample\";\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-virtualization\",\n version: \"1.0.0\",\n description: \"Viewport-aware data virtualization with LOD strategies\",\n provides: [\"performance\", \"data-virtualization\"],\n tags: [\"performance\", \"lod\", \"virtualization\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginVirtualizationConfig> = {\n enabled: true,\n mode: \"lod\",\n targetPoints: \"auto\",\n pointsPerPixel: 2,\n lodLevels: [1, 4, 8, 16],\n strategy: \"lttb\",\n reuseOriginalData: true,\n syncWithLazyLoad: true,\n includeSeries: [],\n excludeSeries: [],\n debug: false,\n};\n\ntype SeriesCache = {\n x: Float32Array | Float64Array;\n y: Float32Array | Float64Array;\n};\n\nexport function PluginVirtualization(\n userConfig: Partial<PluginVirtualizationConfig> = {}\n): ChartPlugin<PluginVirtualizationConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n let isInternalUpdate = false;\n\n const originalData = new Map<string, SeriesCache>();\n const stats = new Map<string, VirtualizationStats>();\n\n let originalUpdateSeries: ((id: string, data: SeriesUpdateData) => void) | null = null;\n let originalAppendData: ((id: string, x: number[] | Float32Array, y: number[] | Float32Array) => void) | null = null;\n\n function log(message: string, ...args: unknown[]) {\n if (config.debug && ctx) {\n ctx.log.info(`[Virtualization] ${message}`, ...args);\n }\n }\n\n function shouldVirtualize(series: Series): boolean {\n if (!config.enabled) return false;\n if (config.includeSeries.length > 0 && !config.includeSeries.includes(series.getId())) return false;\n if (config.excludeSeries.includes(series.getId())) return false;\n\n const type = series.getType();\n return (\n type === \"line\" ||\n type === \"scatter\" ||\n type === \"line+scatter\" ||\n type === \"step\" ||\n type === \"step+scatter\"\n );\n }\n\n function getTargetPoints(dataLength: number): number {\n if (!ctx) return dataLength;\n if (config.targetPoints !== \"auto\") return Math.max(2, config.targetPoints);\n const width = ctx.render.canvasSize.width / ctx.render.pixelRatio;\n return calculateTargetPoints(dataLength, width, config.pointsPerPixel);\n }\n\n function downsampleData(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number,\n strategy: VirtualizationStrategy\n ): { x: Float32Array; y: Float32Array } {\n if (targetPoints >= x.length || x.length <= 2) {\n return { x: new Float32Array(x), y: new Float32Array(y) };\n }\n\n if (strategy === \"minmax\") {\n const bucketCount = Math.ceil(targetPoints / 2);\n const result = minMaxDownsample(x, y, bucketCount);\n return { x: result.x, y: result.y };\n }\n\n const result = lttbDownsample(x, y, targetPoints);\n return { x: result.x, y: result.y };\n }\n\n function cacheOriginal(seriesId: string, data: SeriesCache): void {\n if (!config.reuseOriginalData) return;\n originalData.set(seriesId, { x: data.x, y: data.y });\n }\n\n function restoreOriginal(seriesId: string): SeriesCache | null {\n return originalData.get(seriesId) ?? null;\n }\n\n function updateStats(\n seriesId: string,\n originalPoints: number,\n renderedPoints: number,\n targetPoints: number,\n mode: VirtualizationMode,\n strategy: VirtualizationStrategy\n ): void {\n stats.set(seriesId, {\n seriesId,\n originalPoints,\n renderedPoints,\n targetPoints,\n lastUpdated: Date.now(),\n mode,\n strategy,\n });\n }\n\n function applyVirtualization(series: Series): void {\n if (!ctx || !originalUpdateSeries) return;\n const seriesId = series.getId();\n const data = series.getData();\n if (!data?.x || !data?.y || data.x.length === 0) return;\n\n if (!shouldVirtualize(series)) {\n const original = restoreOriginal(seriesId);\n if (original && config.reuseOriginalData) {\n isInternalUpdate = true;\n originalUpdateSeries(seriesId, { x: original.x, y: original.y });\n isInternalUpdate = false;\n }\n return;\n }\n\n cacheOriginal(seriesId, { x: data.x, y: data.y });\n\n const targetPoints = getTargetPoints(data.x.length);\n const downsampled = downsampleData(data.x, data.y, targetPoints, config.strategy);\n\n isInternalUpdate = true;\n originalUpdateSeries(seriesId, { x: downsampled.x, y: downsampled.y });\n isInternalUpdate = false;\n\n updateStats(seriesId, data.x.length, downsampled.x.length, targetPoints, config.mode, config.strategy);\n }\n\n function refreshAll(): void {\n if (!ctx) return;\n ctx.data.getAllSeries().forEach((series) => applyVirtualization(series));\n }\n\n function handleUpdateSeries(id: string, data: SeriesUpdateData): void {\n if (!ctx || !originalUpdateSeries) return;\n if (!config.enabled || isInternalUpdate) {\n originalUpdateSeries(id, data);\n return;\n }\n\n const series = ctx.chart.getSeries?.(id) as Series | undefined;\n if (!series) {\n originalUpdateSeries(id, data);\n return;\n }\n\n const original = restoreOriginal(id);\n if (original && config.reuseOriginalData) {\n isInternalUpdate = true;\n originalUpdateSeries(id, { x: original.x, y: original.y });\n isInternalUpdate = false;\n }\n\n originalUpdateSeries(id, data);\n\n const updatedSeries = ctx.chart.getSeries?.(id) as Series | undefined;\n if (updatedSeries) {\n cacheOriginal(id, { x: updatedSeries.getData().x, y: updatedSeries.getData().y });\n applyVirtualization(updatedSeries);\n }\n }\n\n function handleAppendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void {\n if (!ctx || !originalAppendData || !originalUpdateSeries) return;\n\n if (!config.enabled || isInternalUpdate) {\n originalAppendData(id, x, y);\n return;\n }\n\n const series = ctx.chart.getSeries?.(id) as Series | undefined;\n if (!series) {\n originalAppendData(id, x, y);\n return;\n }\n\n const original = restoreOriginal(id);\n if (original && config.reuseOriginalData) {\n isInternalUpdate = true;\n originalUpdateSeries(id, { x: original.x, y: original.y });\n isInternalUpdate = false;\n }\n\n originalAppendData(id, x, y);\n\n const updatedSeries = ctx.chart.getSeries?.(id) as Series | undefined;\n if (updatedSeries) {\n cacheOriginal(id, { x: updatedSeries.getData().x, y: updatedSeries.getData().y });\n applyVirtualization(updatedSeries);\n }\n }\n\n const api: VirtualizationAPI & Record<string, unknown> = {\n enable() {\n config.enabled = true;\n refreshAll();\n },\n disable() {\n config.enabled = false;\n if (!ctx || !originalUpdateSeries) return;\n const updater = originalUpdateSeries;\n ctx.data.getAllSeries().forEach((series) => {\n const original = restoreOriginal(series.getId());\n if (original) {\n isInternalUpdate = true;\n updater(series.getId(), { x: original.x, y: original.y });\n isInternalUpdate = false;\n }\n });\n },\n isEnabled() {\n return config.enabled;\n },\n updateConfig(newConfig) {\n Object.assign(config, newConfig);\n refreshAll();\n },\n invalidate(seriesId) {\n if (!ctx) return;\n if (seriesId) {\n const series = ctx.chart.getSeries?.(seriesId) as Series | undefined;\n if (series) applyVirtualization(series);\n return;\n }\n refreshAll();\n },\n getStats(seriesId) {\n return stats.get(seriesId) ?? null;\n },\n getAllStats() {\n return Array.from(stats.values());\n },\n };\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n (ctx.chart as any).virtualization = api;\n\n const chart = ctx.chart as any;\n originalUpdateSeries = chart.updateSeries?.bind(chart) ?? null;\n originalAppendData = chart.appendData?.bind(chart) ?? null;\n\n if (originalUpdateSeries) {\n chart.updateSeries = (id: string, data: SeriesUpdateData) => handleUpdateSeries(id, data);\n }\n\n if (originalAppendData) {\n chart.appendData = (id: string, x: number[] | Float32Array, y: number[] | Float32Array) =>\n handleAppendData(id, x, y);\n }\n\n ctx.events.on(\"zoom\", () => refreshAll());\n ctx.events.on(\"pan\", () => refreshAll());\n ctx.events.on(\"resize\", () => refreshAll());\n\n refreshAll();\n log(\"Initialized\");\n },\n onDestroy(pluginCtx: PluginContext) {\n if (originalUpdateSeries) {\n (pluginCtx.chart as any).updateSeries = originalUpdateSeries;\n }\n if (originalAppendData) {\n (pluginCtx.chart as any).appendData = originalAppendData;\n }\n delete (pluginCtx.chart as any).virtualization;\n ctx = null;\n originalData.clear();\n stats.clear();\n },\n api,\n };\n}\n\nexport default PluginVirtualization;\n\n// Type exports\nexport type {\n PluginVirtualizationConfig,\n VirtualizationAPI,\n VirtualizationStats,\n VirtualizationMode,\n VirtualizationStrategy,\n} from \"./types\";\n","import type { PluginContext, InteractionEvent, PluginManifest } from \"../types\";\n\nexport interface RoiPoint {\n x: number;\n y: number;\n}\n\nexport interface RoiRegion {\n id: string;\n tool: \"rectangle\" | \"circle\" | \"polygon\" | \"lasso\";\n points: RoiPoint[];\n color?: string;\n fill?: string;\n}\n\nexport interface RoiMaskResult {\n regionId: string;\n seriesId: string;\n masks: boolean[];\n}\n\nexport interface RoiSelectedEvent {\n region: RoiRegion;\n seriesIds: string[];\n masks: RoiMaskResult[];\n}\n\nexport interface RoiAPI {\n setTool(tool: RoiTool): void;\n clear(): void;\n getRegions(): RoiRegion[];\n removeRegion(id: string): void;\n calculateMasks(regionId: string): RoiMaskResult[];\n isEnabled(): boolean;\n setEnabled(enabled: boolean): void;\n}\n\nexport type RoiTool = \"rectangle\" | \"circle\" | \"polygon\" | \"lasso\";\n\nexport interface PluginROIConfig {\n defaultTool?: RoiTool;\n stroke?: string;\n fill?: string;\n enabled?: boolean;\n mask?: boolean;\n}\n\nexport const PluginROI = (config: PluginROIConfig = {}) => {\n let ctx: PluginContext | null = null;\n let activeTool: RoiTool = config.defaultTool || \"rectangle\";\n let regions: RoiRegion[] = [];\n let isDrawing = false;\n let activeRegion: RoiRegion | null = null;\n let enabled = config.enabled !== false;\n let isMasking = config.mask === true;\n\n // Store for original data when masking is active\n const rawDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n let originalUpdateSeries: any = null;\n let originalAddSeries: any = null;\n\n const manifest: PluginManifest = {\n name: \"roi\",\n description: \"Region of Interest selection tool and masking\",\n version: \"1.1.0\",\n author: \"SciPlot\",\n };\n\n function createRegion(tool: RoiTool): RoiRegion {\n return {\n id: Math.random().toString(36).substring(2, 11),\n tool,\n points: [],\n color: config.stroke || \"#00f2ff\",\n fill: config.fill || \"rgba(0, 242, 255, 0.15)\",\n };\n }\n\n function pixelToData(pixel: { x: number; y: number }): RoiPoint {\n if (!ctx) return { x: 0, y: 0 };\n return {\n x: ctx.coords.pixelToDataX(pixel.x),\n y: ctx.coords.pixelToDataY(pixel.y),\n };\n }\n\n function dataToPixel(point: RoiPoint): { x: number; y: number } {\n if (!ctx) return { x: 0, y: 0 };\n return {\n x: ctx.coords.dataToPixelX(point.x),\n y: ctx.coords.dataToPixelY(point.y),\n };\n }\n\n function isPointInAnyRegion(point: RoiPoint): boolean {\n if (regions.length === 0) return true; // Show all if no regions defined\n return regions.some((r) => isPointInRegion(point, r));\n }\n\n function applyMasking(): void {\n if (!ctx || !isMasking) return;\n\n for (const [id, raw] of rawDataStore.entries()) {\n const indices: number[] = [];\n for (let i = 0; i < raw.x.length; i++) {\n if (isPointInAnyRegion({ x: raw.x[i], y: raw.y[i] })) {\n indices.push(i);\n }\n }\n\n const filteredX = new Float32Array(indices.length);\n const filteredY = new Float32Array(indices.length);\n for (let i = 0; i < indices.length; i++) {\n filteredX[i] = raw.x[indices[i]];\n filteredY[i] = raw.y[indices[i]];\n }\n\n if (originalUpdateSeries) {\n originalUpdateSeries(id, { x: filteredX, y: filteredY });\n }\n }\n }\n\n function isPointInRegion(point: RoiPoint, region: RoiRegion): boolean {\n const { tool, points } = region;\n if (points.length < 2) return false;\n\n if (tool === \"rectangle\") {\n const xMin = Math.min(points[0].x, points[1].x);\n const xMax = Math.max(points[0].x, points[1].x);\n const yMin = Math.min(points[0].y, points[1].y);\n const yMax = Math.max(points[0].y, points[1].y);\n return point.x >= xMin && point.x <= xMax && point.y >= yMin && point.y <= yMax;\n }\n\n if (tool === \"circle\") {\n const dx = point.x - points[0].x;\n const dy = point.y - points[0].y;\n const r = Math.sqrt(\n Math.pow(points[1].x - points[0].x, 2) + Math.pow(points[1].y - points[0].y, 2)\n );\n return Math.sqrt(dx * dx + dy * dy) <= r;\n }\n\n if (tool === \"polygon\" || tool === \"lasso\") {\n // Ray casting algorithm\n let inside = false;\n for (let i = 0, j = points.length - 1; i < points.length; j = i++) {\n const xi = points[i].x, yi = points[i].y;\n const xj = points[j].x, yj = points[j].y;\n const intersect = yi > point.y !== yj > point.y &&\n point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n }\n\n return false;\n }\n\n function calculateMasks(regionId: string): RoiMaskResult[] {\n const region = regions.find((r) => r.id === regionId);\n if (!region || !ctx) return [];\n\n const results: RoiMaskResult[] = [];\n ctx.chart.getAllSeries().forEach((series) => {\n const data = series.getData();\n if (!data) return;\n\n const masks = new Array(data.x.length);\n for (let i = 0; i < data.x.length; i++) {\n masks[i] = isPointInRegion({ x: data.x[i], y: data.y[i] }, region);\n }\n\n results.push({\n regionId,\n seriesId: series.getId(),\n masks,\n });\n });\n\n return results;\n }\n\n function finishRegion(): void {\n if (!activeRegion || !ctx) return;\n \n // Clean up preview points for polygon\n if (activeRegion.tool === \"polygon\" && activeRegion.points.length > 1) {\n // Remove the preview point\n activeRegion.points.pop();\n }\n\n regions.push(activeRegion);\n\n if (isMasking) {\n applyMasking();\n }\n\n const event: RoiSelectedEvent = {\n region: activeRegion,\n seriesIds: ctx.chart.getAllSeries().map((s) => s.getId()),\n masks: calculateMasks(activeRegion.id),\n };\n\n // Emit on both plugin context and chart\n ctx.events.emit(\"roi:selected\", event);\n if (ctx.chart.events) {\n ctx.chart.events.emit(\"roi:selected\" as any, event);\n }\n \n ctx.events.emit(\"roi:created\", {\n region: activeRegion,\n seriesIds: event.seriesIds,\n });\n\n activeRegion = null;\n isDrawing = false;\n ctx.requestRender();\n }\n\n function handlePointerDown(event: InteractionEvent): void {\n if (!enabled || !event.inPlotArea) return;\n\n if (activeTool === \"polygon\" && activeRegion) {\n // For polygon, we keep adding points on click\n // But first, replace the preview point with a permanent one\n const previewPoint = pixelToData({ x: event.pixelX, y: event.pixelY });\n activeRegion.points.push(previewPoint);\n event.preventDefault();\n ctx?.requestRender();\n return;\n }\n\n isDrawing = true;\n activeRegion = createRegion(activeTool);\n const startPoint = pixelToData({ x: event.pixelX, y: event.pixelY });\n activeRegion.points.push(startPoint);\n \n if (activeTool === \"rectangle\" || activeTool === \"circle\") {\n activeRegion.points.push({ ...startPoint });\n } else if (activeTool === \"polygon\") {\n // Add a second point for preview\n activeRegion.points.push({ ...startPoint });\n }\n \n event.preventDefault(); // Stop chart from panning\n ctx?.requestRender();\n }\n\n function handlePointerMove(event: InteractionEvent): void {\n if (!enabled || !isDrawing || !activeRegion) return;\n\n if (activeTool === \"rectangle\" || activeTool === \"circle\") {\n activeRegion.points[1] = pixelToData({ x: event.pixelX, y: event.pixelY });\n } else if (activeTool === \"lasso\") {\n // For lasso, we capture points during movement\n const lastPoint = activeRegion.points[activeRegion.points.length - 1];\n const newPoint = pixelToData({ x: event.pixelX, y: event.pixelY });\n \n // Basic distance filter to avoid too many points\n const dx = ctx!.coords.dataToPixelX(newPoint.x) - ctx!.coords.dataToPixelX(lastPoint.x);\n const dy = ctx!.coords.dataToPixelY(newPoint.y) - ctx!.coords.dataToPixelY(lastPoint.y);\n if (Math.sqrt(dx*dx + dy*dy) > 5) {\n activeRegion.points.push(newPoint);\n }\n } else if (activeTool === \"polygon\") {\n // Update the preview point (the last one)\n const lastIndex = activeRegion.points.length - 1;\n if (lastIndex >= 0) {\n activeRegion.points[lastIndex] = pixelToData({ x: event.pixelX, y: event.pixelY });\n }\n }\n ctx?.requestRender();\n }\n\n function handlePointerUp(_event: InteractionEvent): void {\n if (!isDrawing || !activeRegion) return;\n\n if (activeTool !== \"polygon\") {\n finishRegion();\n }\n }\n\n function drawRegion(region: RoiRegion, ctx2d: CanvasRenderingContext2D): void {\n const { tool, points, color, fill } = region;\n if (points.length < 1) return;\n\n const pixels = points.map((p) => dataToPixel(p));\n\n ctx2d.strokeStyle = color || \"#00f2ff\";\n ctx2d.fillStyle = fill || \"rgba(0, 242, 255, 0.15)\";\n ctx2d.lineWidth = 2;\n\n if (tool === \"rectangle\" && pixels.length >= 2) {\n const x = Math.min(pixels[0].x, pixels[1].x);\n const y = Math.min(pixels[0].y, pixels[1].y);\n const w = Math.abs(pixels[0].x - pixels[1].x);\n const h = Math.abs(pixels[0].y - pixels[1].y);\n ctx2d.fillRect(x, y, w, h);\n ctx2d.strokeRect(x, y, w, h);\n } else if (tool === \"circle\" && pixels.length >= 2) {\n const dx = pixels[1].x - pixels[0].x;\n const dy = pixels[1].y - pixels[0].y;\n const r = Math.sqrt(dx * dx + dy * dy);\n ctx2d.beginPath();\n ctx2d.arc(pixels[0].x, pixels[0].y, r, 0, Math.PI * 2);\n ctx2d.fill();\n ctx2d.stroke();\n } else if ((tool === \"polygon\" || tool === \"lasso\") && pixels.length >= 2) {\n ctx2d.beginPath();\n ctx2d.moveTo(pixels[0].x, pixels[0].y);\n pixels.slice(1).forEach((p) => ctx2d.lineTo(p.x, p.y));\n if (tool === \"lasso\") {\n ctx2d.closePath();\n } else if (!isDrawing || region !== activeRegion) {\n ctx2d.closePath();\n }\n ctx2d.fill();\n ctx2d.stroke();\n }\n }\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n const chart = ctx.chart as any;\n\n // Hijack series methods if masking is enabled\n originalUpdateSeries = chart.updateSeries.bind(chart);\n originalAddSeries = chart.addSeries.bind(chart);\n\n chart.addSeries = (options: any) => {\n if (options.id && options.data?.x) {\n rawDataStore.set(options.id, {\n x: new Float32Array(options.data.x),\n y: new Float32Array(options.data.y),\n });\n }\n if (isMasking && options.data?.x) {\n // Apply initial mask\n const raw = rawDataStore.get(options.id)!;\n const indices: number[] = [];\n for (let i = 0; i < raw.x.length; i++) {\n if (isPointInAnyRegion({ x: raw.x[i], y: raw.y[i] })) indices.push(i);\n }\n const fx = new Float32Array(indices.length);\n const fy = new Float32Array(indices.length);\n for (let i = 0; i < indices.length; i++) {\n fx[i] = raw.x[indices[i]];\n fy[i] = raw.y[indices[i]];\n }\n originalAddSeries({ ...options, data: { ...options.data, x: fx, y: fy } });\n } else {\n originalAddSeries(options);\n }\n };\n\n chart.updateSeries = (id: string, data: any) => {\n if (data.x) {\n rawDataStore.set(id, {\n x: new Float32Array(data.x),\n y: new Float32Array(data.y),\n });\n }\n if (isMasking && data.x) {\n const raw = rawDataStore.get(id)!;\n const indices: number[] = [];\n for (let i = 0; i < raw.x.length; i++) {\n if (isPointInAnyRegion({ x: raw.x[i], y: raw.y[i] })) indices.push(i);\n }\n const fx = new Float32Array(indices.length);\n const fy = new Float32Array(indices.length);\n for (let i = 0; i < indices.length; i++) {\n fx[i] = raw.x[indices[i]];\n fy[i] = raw.y[indices[i]];\n }\n originalUpdateSeries(id, { ...data, x: fx, y: fy });\n } else {\n originalUpdateSeries(id, data);\n }\n };\n },\n onDestroy() {\n if (ctx) {\n const chart = ctx.chart as any;\n chart.addSeries = originalAddSeries;\n chart.updateSeries = originalUpdateSeries;\n }\n ctx = null;\n rawDataStore.clear();\n },\n onInteraction(_pluginCtx: PluginContext, event: InteractionEvent) {\n if (event.type === \"mousedown\") handlePointerDown(event);\n if (event.type === \"mousemove\") handlePointerMove(event);\n if (event.type === \"mouseup\") handlePointerUp(event);\n \n // Handle double click to finish polygon\n if (event.type === \"mouseup\" && activeTool === \"polygon\" && isDrawing) {\n // Simple double click detection\n // For now, let's just use a more complex logic or a button if needed.\n // In this implementation, let's say 3 clicks on the same area or just let it be.\n }\n \n // Special: right click or double click to finish polygon\n if (event.originalEvent instanceof MouseEvent && event.originalEvent.detail === 2 && activeTool === \"polygon\") {\n finishRegion();\n event.preventDefault();\n }\n },\n onRenderOverlay(pluginCtx: PluginContext) {\n const ctx2d = pluginCtx.render.ctx2d;\n if (!ctx2d) return;\n\n regions.forEach((region) => drawRegion(region, ctx2d));\n if (activeRegion) drawRegion(activeRegion, ctx2d);\n },\n api: {\n setTool(tool: RoiTool) {\n activeTool = tool;\n if (isDrawing) finishRegion();\n },\n clear() {\n regions = [];\n activeRegion = null;\n isDrawing = false;\n if (isMasking) applyMasking();\n if (ctx) {\n ctx.events.emit(\"roi:cleared\", {});\n ctx.requestRender();\n }\n },\n getRegions() {\n return [...regions];\n },\n removeRegion(id: string) {\n regions = regions.filter((r) => r.id !== id);\n if (isMasking) applyMasking();\n if (ctx) ctx.requestRender();\n },\n calculateMasks,\n isEnabled: () => enabled,\n setEnabled: (e: boolean) => {\n enabled = e;\n },\n setMasking(mask: boolean) {\n isMasking = mask;\n if (mask) {\n applyMasking();\n } else {\n // Restore all original data\n if (ctx) {\n for (const [id, raw] of rawDataStore.entries()) {\n originalUpdateSeries(id, raw);\n }\n ctx.requestRender();\n }\n }\n },\n } as RoiAPI,\n };\n};\n\nexport type RoiEvent = \"roi:selected\" | \"roi:created\" | \"roi:cleared\";\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * useSciPlot - React hook for Sci Plot\n *\n * Manages chart lifecycle and provides a clean React API.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useCallback,\n type RefObject,\n} from \"react\";\nimport { createChart, type Chart, type ChartOptions } from \"../core/Chart\";\nimport type {\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n Bounds,\n} from \"../types\";\n\nexport interface UseSciPlotOptions extends Omit<ChartOptions, \"container\"> {\n /** Auto-resize on container changes */\n autoResize?: boolean;\n}\n\nexport interface UseSciPlotReturn {\n /** Chart instance (null until initialized) */\n chart: Chart | null;\n /** Whether the chart is ready */\n isReady: boolean;\n /** Error during initialization */\n error: Error | null;\n /** Current view bounds */\n bounds: Bounds | null;\n /** Add a series */\n addSeries: (options: SeriesOptions) => void;\n /** Update series data */\n updateSeries: (id: string, data: SeriesUpdateData) => void;\n /** Remove a series */\n removeSeries: (id: string) => void;\n /** Set zoom range */\n zoom: (options: ZoomOptions) => void;\n /** Reset zoom to show all data */\n resetZoom: () => void;\n}\n\n/**\n * React hook for using Sci Plot\n *\n * @example\n * ```tsx\n * function MyChart() {\n * const canvasRef = useRef<HTMLCanvasElement>(null);\n * const { chart, isReady, addSeries, zoom } = useSciPlot(canvasRef, {\n * xAxis: { label: 'E / V' },\n * yAxis: { label: 'I / A' }\n * });\n *\n * useEffect(() => {\n * if (isReady) {\n * addSeries({\n * id: 'cv-1',\n * type: 'line',\n * data: { x: xData, y: yData },\n * style: { color: '#ff0055' }\n * });\n * }\n * }, [isReady]);\n *\n * return <canvas ref={canvasRef} />;\n * }\n * ```\n */\nexport function useSciPlot(\n containerRef: RefObject<HTMLDivElement>,\n options: UseSciPlotOptions = {}\n): UseSciPlotReturn {\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 // Store options in ref to avoid re-creating chart on every render\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Initialize chart\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n try {\n const chartInstance = createChart({\n ...optionsRef.current,\n container,\n });\n\n // Listen to zoom events to update bounds\n chartInstance.on(\"zoom\", () => {\n setBounds(chartInstance.getViewBounds());\n });\n\n setChart(chartInstance);\n setIsReady(true);\n setBounds(chartInstance.getViewBounds());\n setError(null);\n\n } catch (err) {\n console.error(\"[useSciPlot] Failed to initialize chart:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsReady(false);\n }\n\n return () => {\n if (chart) {\n chart.destroy();\n setChart(null);\n setIsReady(false);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef]);\n\n // Memoized methods\n const addSeries = useCallback(\n (seriesOptions: SeriesOptions) => {\n if (chart) {\n chart.addSeries(seriesOptions);\n setBounds(chart.getViewBounds());\n }\n },\n [chart]\n );\n\n const updateSeries = useCallback(\n (id: string, data: SeriesUpdateData) => {\n if (chart) {\n chart.updateSeries(id, data);\n }\n },\n [chart]\n );\n\n const removeSeries = useCallback(\n (id: string) => {\n if (chart) {\n chart.removeSeries(id);\n }\n },\n [chart]\n );\n\n const zoom = useCallback(\n (zoomOptions: ZoomOptions) => {\n if (chart) {\n chart.zoom(zoomOptions);\n }\n },\n [chart]\n );\n\n const resetZoom = useCallback(() => {\n if (chart) {\n chart.resetZoom();\n setBounds(chart.getViewBounds());\n }\n }, [chart]);\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 * SciPlot - React Component for Scientific Charts\n *\n * A declarative React component that wraps the Sci Plot.\n */\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useSciPlot, type UseSciPlotOptions } from \"./useSciPlot\";\nimport type {\n SeriesOptions,\n ZoomOptions,\n CursorOptions,\n Bounds,\n} from \"../types\";\nimport type { Chart } from \"../core/Chart\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface SciPlotSeries {\n id: string;\n x: Float32Array | Float64Array;\n y: Float32Array | Float64Array;\n color?: string;\n width?: number;\n visible?: boolean;\n}\n\nexport interface SciPlotProps extends UseSciPlotOptions {\n /** Series data to display */\n series?: SciPlotSeries[];\n /** Zoom state (controlled) */\n zoom?: ZoomOptions;\n /** Callback when zoom changes */\n onZoomChange?: (bounds: Bounds) => void;\n /** Cursor configuration */\n cursor?: CursorOptions;\n /** Container width */\n width?: number | string;\n /** Container height */\n height?: number | string;\n /** Additional class name */\n className?: string;\n /** Additional styles */\n style?: CSSProperties;\n /** Debug mode - shows FPS counter */\n debug?: boolean;\n}\n\nexport interface SciPlotRef {\n /** Get the chart instance */\n getChart: () => Chart | null;\n /** Reset zoom to show all data */\n resetZoom: () => void;\n /** Get current bounds */\n getBounds: () => Bounds | null;\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * SciPlot React Component\n *\n * @example\n * ```tsx\n * <SciPlot\n * series={[\n * { id: 'cv-1', x: potentialData, y: currentData, color: '#ff0055' }\n * ]}\n * xAxis={{ label: 'E / V' }}\n * yAxis={{ label: 'I / A' }}\n * height={400}\n * cursor={{ enabled: true, snap: true }}\n * onZoomChange={(bounds) => console.log('Zoom:', bounds)}\n * />\n * ```\n */\nexport const SciPlot = forwardRef<SciPlotRef, SciPlotProps>(\n function SciPlot(\n {\n series = [],\n zoom: zoomProp,\n onZoomChange,\n cursor,\n width = \"100%\",\n height = 400,\n className = \"\",\n style = {},\n debug = false,\n ...chartOptions\n },\n ref\n ) {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousSeriesRef = useRef<Map<string, SciPlotSeries>>(new Map());\n\n const {\n chart,\n isReady,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n resetZoom,\n } = useSciPlot(containerRef, chartOptions);\n\n // Expose methods via ref\n useImperativeHandle(\n ref,\n () => ({\n getChart: () => chart,\n resetZoom,\n getBounds: () => bounds,\n }),\n [chart, resetZoom, bounds]\n );\n\n // Handle series changes\n useEffect(() => {\n if (!isReady || !chart) return;\n\n const currentSeriesMap = new Map(series.map((s) => [s.id, s]));\n const previousSeriesMap = previousSeriesRef.current;\n\n // Remove series that no longer exist\n previousSeriesMap.forEach((_, id) => {\n if (!currentSeriesMap.has(id)) {\n removeSeries(id);\n }\n });\n\n // Add or update series\n currentSeriesMap.forEach((seriesData, id) => {\n const prevSeries = previousSeriesMap.get(id);\n\n if (!prevSeries) {\n // New series - add it\n const options: SeriesOptions = {\n id: seriesData.id,\n type: \"line\",\n data: { x: seriesData.x, y: seriesData.y },\n style: {\n color: seriesData.color ?? \"#ff0055\",\n width: seriesData.width ?? 1.5,\n },\n visible: seriesData.visible ?? true,\n };\n addSeries(options);\n // Force an initial autoscale if it's the first series\n if (currentSeriesMap.size === 1) {\n chart.autoScale();\n }\n } else if (\n prevSeries.x !== seriesData.x ||\n prevSeries.y !== seriesData.y\n ) {\n // Data changed - update\n updateSeries(id, {\n x: seriesData.x,\n y: seriesData.y,\n });\n }\n });\n\n previousSeriesRef.current = currentSeriesMap;\n }, [series, isReady, chart, addSeries, updateSeries, removeSeries]);\n\n // Handle controlled zoom\n useEffect(() => {\n if (!isReady || !chart || !zoomProp) return;\n chart.zoom(zoomProp);\n }, [isReady, chart, zoomProp]);\n\n // Handle zoom change callback\n useEffect(() => {\n if (!isReady || !chart || !onZoomChange) return;\n\n chart.on(\"zoom\", (event) => {\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 }, [isReady, chart, onZoomChange]);\n\n // Handle cursor\n useEffect(() => {\n if (!isReady || !chart) return;\n\n if (cursor?.enabled) {\n chart.enableCursor(cursor);\n } else {\n chart.disableCursor();\n }\n }, [isReady, chart, cursor]);\n\n // Container styles\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}\n className={`velo-plot-container ${className}`}\n style={containerStyle}\n >\n {/* Debug overlay */}\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 }}\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 ]\n </div>\n <div>Series: {series.length}</div>\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default SciPlot;\n","import type { Chart } from \"../chart/types\";\nimport type { ChartGroup } from \"../sync\";\nimport type { SyncAxis, SyncOptions } from \"../sync\";\nimport type { ChartOptions as RootChartOptions, Range, SeriesOptions } from \"../../types\";\nimport type { LayoutOptions } from \"../layout\";\n\n/** Per-pane configuration (max 5 panes per stack) */\nexport interface StackedPaneConfig {\n id: string;\n /** Flex ratio (e.g. 0.6) or CSS length (\"24%\", \"80px\") */\n height: number | string;\n /** Chart options excluding container/id (series added via chart API or `series`) */\n chart?: Omit<RootChartOptions, \"container\" | \"id\">;\n /** Series to add immediately after pane chart is created */\n series?: SeriesOptions[];\n /** Show native X axis (default: only bottom pane when sharedXAxis is bottom) */\n showXAxis?: boolean;\n /** Receive pan/zoom (default: true on every pane) */\n interactive?: boolean;\n /** Lock Y range — skips auto fit on Y for this pane */\n yRange?: Range | \"auto\";\n}\n\nexport interface StackedChartOptions {\n /** Root container (will be cleared and filled with pane layout) */\n container: HTMLDivElement;\n /** 1–5 stacked panes, top to bottom */\n panes: StackedPaneConfig[];\n /** Pane that drives X sync (default: first pane) */\n masterPaneId?: string;\n /** Shared date/time row on bottom pane only */\n sharedXAxis?: \"bottom\" | \"none\";\n /** Shared theme applied to every pane */\n theme?: string | object;\n devicePixelRatio?: number;\n /** Gap between panes in CSS pixels (default: 0) */\n gap?: number;\n /** Enable VS Code–style drag resize between panes (default: false) */\n resizable?:\n | boolean\n | {\n /** Min pane height as fraction of available stack height (default: 1/6) */\n minPaneRatio?: number;\n /** Absolute min pane height in px — overrides ratio when larger */\n minPanePx?: number;\n dividerSize?: number;\n };\n /** Show legend on panes (default: false — set true on stack or per-pane chart) */\n showLegend?: boolean;\n /**\n * Pan/zoom sync between panes.\n * Default: X-axis sync via master pane (`axis: 'x'`, Y independent).\n * Pass `false` for fully independent panes.\n */\n sync?: boolean | StackedSyncOptions;\n /** Shared margin overrides — left/right aligned automatically across panes */\n layout?: Partial<LayoutOptions>;\n}\n\nexport interface StackedChart {\n readonly container: HTMLDivElement;\n getPane(id: string): Chart | undefined;\n getPanes(): Chart[];\n getMaster(): Chart;\n getGroup(): ChartGroup;\n fitAll(options?: { x?: Range; padding?: number }): void;\n resetAll(): void;\n resize(): void;\n /** Current flex ratios keyed by pane id */\n getPaneRatios(): Record<string, number>;\n /** Set flex ratios (same keys as pane ids); triggers resize */\n setPaneRatios(ratios: Record<string, number>): void;\n /** Sync axis mode: `x` (default), `y`, `xy`, or `none` */\n setSyncAxis(axis: SyncAxis): void;\n getSyncAxis(): SyncAxis;\n /** Update pan/zoom/cursor sync options at runtime */\n setSyncOptions(options: Partial<StackedSyncOptions>): void;\n /** Resolves when all pane charts have started rendering */\n whenReady(): Promise<void>;\n destroy(): void;\n}\n\nexport const STACKED_MAX_PANES = 5;\n/** Default minimum pane height as a fraction of available stack height (1/6). */\nexport const STACKED_DEFAULT_MIN_PANE_RATIO = 1 / 6;\nexport const STACKED_COMPACT_MARGIN = { top: 4, bottom: 8 };\nexport const STACKED_FULL_X_MARGIN = { bottom: 55 };\n\n/** Pan/zoom sync between stacked panes (Y stays independent when axis is `x`). */\nexport type StackedSyncOptions = Pick<\n SyncOptions,\n | \"axis\"\n | \"syncCursor\"\n | \"syncSelection\"\n | \"syncZoom\"\n | \"syncPan\"\n | \"bidirectional\"\n | \"debounce\"\n>;\n","/**\n * VS Code–style drag dividers between stacked chart panes.\n */\n\nimport { STACKED_DEFAULT_MIN_PANE_RATIO } from \"./types\";\n\nexport interface PaneResizeOptions {\n /** Min pane height as fraction of available height (default 1/6) */\n minPaneRatio?: number;\n /** Absolute min pane height in px — used when larger than ratio-based min */\n minPanePx?: number;\n /** Divider hit area height (default 6) */\n dividerSize?: number;\n /** Called while dragging with normalized flex ratios keyed by pane id */\n onResize?: (ratiosById: Record<string, number>) => void;\n /** Called when divider drag starts — return initial pane heights for this drag session */\n onDragStart?: (topIdx: number, bottomIdx: number) => number[];\n /** Called each pointer move (batched to rAF by consumer) with updated heights */\n onDragMove?: (\n heightsPx: number[],\n topIdx: number,\n bottomIdx: number,\n ) => void;\n /** Called when divider drag ends — perform chart resize here */\n onDragEnd?: (finalHeightsPx: number[]) => void;\n}\n\nconst DIVIDER_CLASS = \"velo-pane-divider\";\nconst RESIZING_CLASS = \"velo-pane-resizing\";\n\nfunction injectDividerStyles(): void {\n if (typeof document === \"undefined\") return;\n let style = document.getElementById(\"velo-pane-divider-styles\") as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"velo-pane-divider-styles\";\n document.head.appendChild(style);\n }\n style.textContent = `\n .${DIVIDER_CLASS} {\n flex: 0 0 var(--velo-divider-size, 6px);\n position: relative;\n cursor: ns-resize;\n touch-action: none;\n z-index: 20;\n background: transparent;\n user-select: none;\n }\n .${DIVIDER_CLASS}::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n height: 1px;\n background: rgba(128, 128, 128, 0.35);\n transition: background 0.15s, height 0.15s;\n }\n .${DIVIDER_CLASS}:hover::after,\n .${RESIZING_CLASS} .${DIVIDER_CLASS}::after {\n height: 2px;\n background: rgba(0, 242, 255, 0.65);\n }\n .${DIVIDER_CLASS}-handle {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.15s;\n pointer-events: none;\n color: rgba(0, 242, 255, 0.9);\n font-size: 10px;\n line-height: 1;\n }\n .${DIVIDER_CLASS}:hover .${DIVIDER_CLASS}-handle,\n .${RESIZING_CLASS} .${DIVIDER_CLASS}-handle {\n opacity: 1;\n }\n .${RESIZING_CLASS} {\n cursor: ns-resize !important;\n }\n .${RESIZING_CLASS} * {\n cursor: ns-resize !important;\n }\n .${RESIZING_CLASS} [data-pane-id] {\n position: relative !important;\n overflow: hidden !important;\n }\n `;\n}\n\nfunction createDividerElement(index: number, size: number): HTMLDivElement {\n const divider = document.createElement(\"div\");\n divider.className = DIVIDER_CLASS;\n divider.dataset.dividerIndex = String(index);\n divider.style.setProperty(\"--velo-divider-size\", `${size}px`);\n\n const handle = document.createElement(\"div\");\n handle.className = `${DIVIDER_CLASS}-handle`;\n handle.textContent = \"⇕\";\n divider.appendChild(handle);\n\n return divider;\n}\n\nexport interface PaneResizeController {\n dividers: HTMLDivElement[];\n destroy: () => void;\n}\n\nfunction paneFlexStyle(height: number | string): string {\n if (typeof height === \"number\") {\n return `flex:${height} 1 0;min-height:0;`;\n }\n return `flex:1 1 ${height};min-height:0;`;\n}\n\n/** Resolve per-pane minimum height in px for the current available stack height. */\nexport function resolveMinPaneHeightPx(\n availHeight: number,\n paneCount: number,\n minPaneRatio = STACKED_DEFAULT_MIN_PANE_RATIO,\n minPanePx = 0,\n): number {\n if (paneCount < 1 || availHeight <= 0) return 1;\n const byRatio = availHeight * minPaneRatio;\n const minH = Math.max(minPanePx, byRatio);\n return Math.min(minH, availHeight / paneCount);\n}\n\n/**\n * Scale pane heights to exactly fill available space (fixes sub-pixel gaps during drag).\n */\nexport function normalizePaneHeights(heightsPx: number[], targetTotal: number): number[] {\n const n = heightsPx.length;\n if (n === 0) return heightsPx;\n const total = Math.max(1, Math.round(targetTotal));\n const sum = heightsPx.reduce((s, h) => s + h, 0);\n if (sum <= 0) {\n const even = Math.floor(total / n);\n const out = heightsPx.map(() => even);\n out[n - 1] = total - even * (n - 1);\n return out;\n }\n\n const scaled = heightsPx.map((h) => (h / sum) * total);\n const out: number[] = [];\n let allocated = 0;\n for (let i = 0; i < n - 1; i++) {\n out.push(Math.max(1, Math.round(scaled[i])));\n allocated += out[i];\n }\n out.push(Math.max(1, total - allocated));\n return out;\n}\n\nexport function attachPaneResize(\n container: HTMLDivElement,\n paneWrappers: HTMLDivElement[],\n paneIds: string[],\n ratios: number[],\n options: PaneResizeOptions = {},\n): PaneResizeController {\n injectDividerStyles();\n\n const minPaneRatio = options.minPaneRatio ?? STACKED_DEFAULT_MIN_PANE_RATIO;\n const minPanePx = options.minPanePx ?? 0;\n const dividerSize = options.dividerSize ?? 6;\n const paneCount = paneWrappers.length;\n\n const minPaneHeight = (avail: number) =>\n resolveMinPaneHeightPx(avail, paneCount, minPaneRatio, minPanePx);\n const dividers: HTMLDivElement[] = [];\n const cleanups: (() => void)[] = [];\n\n if (paneWrappers.length < 2) {\n return { dividers, destroy: () => {} };\n }\n\n const availableHeight = (): number => {\n const dividerTotal = dividers.length * dividerSize;\n return Math.max(1, container.clientHeight - dividerTotal);\n };\n\n const applyRatios = (\n topIdx: number,\n bottomIdx: number,\n deltaY: number,\n heightsPx: number[],\n ) => {\n const avail = availableHeight();\n const minH = minPaneHeight(avail);\n\n const othersSum = heightsPx.reduce(\n (s, h, idx) => (idx === topIdx || idx === bottomIdx ? s : s + h),\n 0,\n );\n const pairTotal = avail - othersSum;\n\n let topH = heightsPx[topIdx] + deltaY;\n topH = Math.max(minH, Math.min(pairTotal - minH, topH));\n const bottomH = pairTotal - topH;\n\n heightsPx[topIdx] = topH;\n heightsPx[bottomIdx] = bottomH;\n\n const total = ratios.reduce((s, r) => s + r, 0);\n ratios[topIdx] = (topH / avail) * total;\n ratios[bottomIdx] = (bottomH / avail) * total;\n\n options.onDragMove?.(heightsPx, topIdx, bottomIdx);\n\n if (options.onResize) {\n const byId: Record<string, number> = {};\n for (let i = 0; i < paneIds.length; i++) {\n byId[paneIds[i]] = ratios[i];\n }\n options.onResize(byId);\n }\n };\n\n for (let i = 0; i < paneWrappers.length - 1; i++) {\n const divider = createDividerElement(i, dividerSize);\n const topWrapper = paneWrappers[i];\n topWrapper.after(divider);\n dividers.push(divider);\n\n const onPointerDown = (e: PointerEvent) => {\n e.preventDefault();\n divider.setPointerCapture(e.pointerId);\n container.classList.add(RESIZING_CLASS);\n\n const heightsPx =\n options.onDragStart?.(i, i + 1) ??\n paneWrappers.map((w) => w.getBoundingClientRect().height);\n\n options.onDragMove?.(heightsPx, i, i + 1);\n\n let lastY = e.clientY;\n\n const onMove = (ev: PointerEvent) => {\n const dy = ev.clientY - lastY;\n lastY = ev.clientY;\n if (dy !== 0) applyRatios(i, i + 1, dy, heightsPx);\n };\n\n const onUp = (ev: PointerEvent) => {\n divider.releasePointerCapture(ev.pointerId);\n container.classList.remove(RESIZING_CLASS);\n divider.removeEventListener(\"pointermove\", onMove);\n divider.removeEventListener(\"pointerup\", onUp);\n divider.removeEventListener(\"pointercancel\", onUp);\n options.onDragEnd?.(heightsPx);\n };\n\n divider.addEventListener(\"pointermove\", onMove);\n divider.addEventListener(\"pointerup\", onUp);\n divider.addEventListener(\"pointercancel\", onUp);\n };\n\n divider.addEventListener(\"pointerdown\", onPointerDown);\n cleanups.push(() => divider.removeEventListener(\"pointerdown\", onPointerDown));\n }\n\n return {\n dividers,\n destroy: () => {\n for (const fn of cleanups) fn();\n for (const d of dividers) d.remove();\n container.classList.remove(RESIZING_CLASS);\n },\n };\n}\n\nexport function applyPaneFlexRatios(\n paneWrappers: HTMLDivElement[],\n ratios: number[],\n): void {\n for (let i = 0; i < paneWrappers.length; i++) {\n paneWrappers[i].style.cssText = `${paneFlexStyle(ratios[i])}position:relative;overflow:hidden;`;\n }\n}\n\nexport function initialPaneRatio(height: number | string): number {\n return typeof height === \"number\" ? height : 1;\n}\n","import type { Chart } from \"../chart/types\";\n\n/** Adaptive Y tick count from pane height (~1 tick per 36px, capped by base). */\nexport function tickCountForPaneHeight(heightPx: number, base = 6): number {\n if (!Number.isFinite(heightPx) || heightPx <= 0) return base;\n const adaptive = Math.floor(heightPx / 36);\n return Math.max(2, Math.min(base, adaptive));\n}\n\n/** Adaptive X tick count from pane width. */\nexport function tickCountForPaneWidth(widthPx: number, base = 8): number {\n if (!Number.isFinite(widthPx) || widthPx <= 0) return base;\n const adaptive = Math.floor(widthPx / 72);\n return Math.max(2, Math.min(base, adaptive));\n}\n\nexport interface PaneAxisMeta {\n chart: Chart;\n wrapper: HTMLDivElement;\n baseYTickCount: number;\n baseXTickCount: number;\n showXAxis: boolean;\n}\n\nexport function readBaseYTickCount(yAxis?: { tickCount?: number } | { tickCount?: number }[]): number {\n if (!yAxis) return 6;\n const axes = Array.isArray(yAxis) ? yAxis : [yAxis];\n return axes[0]?.tickCount ?? 6;\n}\n\nexport function adaptPaneAxes(meta: PaneAxisMeta): void {\n const h = meta.wrapper.clientHeight;\n const w = meta.wrapper.clientWidth;\n const yTicks = tickCountForPaneHeight(h, meta.baseYTickCount);\n\n meta.chart.updateYAxis(\"default\", { tickCount: yTicks });\n\n if (meta.showXAxis) {\n const xTicks = tickCountForPaneWidth(w, meta.baseXTickCount);\n meta.chart.updateXAxis({ tickCount: xTicks });\n }\n}\n\nexport function adaptAllPaneAxes(metas: PaneAxisMeta[]): void {\n for (const m of metas) adaptPaneAxes(m);\n}\n","import { createChart } from \"../Chart\";\nimport type { Chart } from \"../chart/types\";\nimport { MARGINS } from \"../chart/types\";\nimport { createChartGroup } from \"../sync\";\nimport type { SyncOptions } from \"../sync\";\nimport type { AxisOptions, SeriesOptions } from \"../../types\";\nimport { mergeLayoutOptions } from \"../layout\";\nimport { buildIndicatorSeries } from \"../indicator/buildIndicatorSeries\";\nimport type { IndicatorSeriesOptions } from \"../indicator/types\";\nimport type {\n StackedChart,\n StackedChartOptions,\n StackedPaneConfig,\n StackedSyncOptions,\n} from \"./types\";\nimport { STACKED_MAX_PANES, STACKED_COMPACT_MARGIN, STACKED_FULL_X_MARGIN } from \"./types\";\nimport { getInitQueueStatus } from \"../ChartInitQueue\";\nimport {\n attachPaneResize,\n applyPaneFlexRatios,\n initialPaneRatio,\n normalizePaneHeights,\n type PaneResizeController,\n} from \"./paneResize\";\nimport {\n adaptAllPaneAxes,\n readBaseYTickCount,\n type PaneAxisMeta,\n} from \"./paneAxis\";\n\nfunction countYAxes(yAxis?: AxisOptions | AxisOptions[]): { left: number; right: number } {\n const axes = yAxis ? (Array.isArray(yAxis) ? yAxis : [yAxis]) : [{}];\n let left = 0;\n let right = 0;\n for (const a of axes) {\n if (a.position === \"right\") right++;\n else left++;\n }\n return { left: Math.max(1, left), right };\n}\n\nfunction computeAlignedLeftMargin(panes: StackedPaneConfig[], baseLeft: number): number {\n let maxExtra = 0;\n for (const pane of panes) {\n const { left } = countYAxes(pane.chart?.yAxis);\n maxExtra = Math.max(maxExtra, (left - 1) * 65);\n }\n return baseLeft + maxExtra;\n}\n\nfunction computeAlignedRightMargin(panes: StackedPaneConfig[], baseRight: number): number {\n let maxExtra = 0;\n for (const pane of panes) {\n const { right } = countYAxes(pane.chart?.yAxis);\n maxExtra = Math.max(maxExtra, right * 65);\n }\n return baseRight + maxExtra;\n}\n\nfunction paneFlexStyle(height: number | string): string {\n if (typeof height === \"number\") {\n return `flex:${height} 1 0;min-height:0;`;\n }\n return `flex:1 1 ${height};min-height:0;`;\n}\n\nfunction expandPaneSeries(series?: SeriesOptions[]): SeriesOptions[] {\n if (!series?.length) return [];\n const out: SeriesOptions[] = [];\n for (const s of series) {\n if (s.type === \"indicator\") {\n out.push(...buildIndicatorSeries(s as IndicatorSeriesOptions));\n } else {\n out.push(s);\n }\n }\n return out;\n}\n\nfunction buildPaneChartOptions(\n pane: StackedPaneConfig,\n chartContainer: HTMLDivElement,\n stack: StackedChartOptions,\n index: number,\n total: number,\n alignedMargins: { left: number; right: number; top: number; bottom: number },\n showXAxis: boolean,\n): Parameters<typeof createChart>[0] {\n const isFirst = index === 0;\n const isLast = index === total - 1;\n const sharedBottom = stack.sharedXAxis !== \"none\";\n const compactX = sharedBottom && !showXAxis;\n const paneGap = stack.gap ?? 0;\n const compactMargin = paneGap > 0 ? STACKED_COMPACT_MARGIN : { top: 0, bottom: 0 };\n\n const margins = {\n top: isFirst ? alignedMargins.top : compactMargin.top,\n right: alignedMargins.right,\n left: alignedMargins.left,\n bottom: compactX\n ? compactMargin.bottom\n : isLast\n ? (stack.layout?.margins?.bottom ?? STACKED_FULL_X_MARGIN.bottom)\n : alignedMargins.bottom,\n };\n\n const baseX = pane.chart?.xAxis ?? {};\n const xAxis = {\n ...baseX,\n showLine: showXAxis ? baseX.showLine ?? true : false,\n showTicks: showXAxis ? baseX.showTicks ?? true : false,\n showLabels: showXAxis ? baseX.showLabels ?? true : false,\n };\n\n const isInteractive = pane.interactive ?? true;\n if (!isInteractive) {\n chartContainer.style.pointerEvents = \"none\";\n }\n\n return {\n ...pane.chart,\n id: pane.id,\n container: chartContainer,\n showLegend: pane.chart?.showLegend ?? stack.showLegend ?? false,\n theme: pane.chart?.theme ?? stack.theme,\n devicePixelRatio: stack.devicePixelRatio ?? pane.chart?.devicePixelRatio,\n loading: pane.chart?.loading ?? false,\n xAxis,\n layout: mergeLayoutOptions({\n ...stack.layout,\n ...pane.chart?.layout,\n margins: { ...margins, ...stack.layout?.margins, ...pane.chart?.layout?.margins },\n }),\n };\n}\n\nfunction wrapperStyle(ratio: number, gap: number, index: number): string {\n const marginTop = gap > 0 && index > 0 ? `margin-top:${gap}px;` : \"\";\n return `${paneFlexStyle(ratio)}position:relative;overflow:hidden;${marginTop}`;\n}\n\nfunction resolveStackSyncOptions(\n sync: StackedChartOptions[\"sync\"],\n masterPaneId: string,\n): SyncOptions {\n if (sync === false) {\n return {\n axis: \"none\",\n syncCursor: false,\n syncZoom: false,\n syncPan: false,\n bidirectional: true,\n masterId: undefined,\n };\n }\n\n return {\n axis: \"x\",\n bidirectional: true,\n masterId: masterPaneId,\n syncCursor: true,\n syncZoom: true,\n syncPan: true,\n ...(typeof sync === \"object\" ? sync : {}),\n };\n}\n\nexport function createStackedChart(options: StackedChartOptions): StackedChart {\n const { container, panes } = options;\n if (!container) throw new Error(\"[StackedChart] container is required\");\n if (panes.length < 1 || panes.length > STACKED_MAX_PANES) {\n throw new Error(`[StackedChart] panes must be 1–${STACKED_MAX_PANES}`);\n }\n\n const masterPaneId = options.masterPaneId ?? panes[0].id;\n const sharedXAxis = options.sharedXAxis ?? \"bottom\";\n const gap = options.gap ?? 0;\n const resizableOpt = options.resizable;\n const resizable = !!resizableOpt;\n const resizeDividerSize =\n typeof resizableOpt === \"object\" ? (resizableOpt.dividerSize ?? 6) : 6;\n\n const baseLayout = mergeLayoutOptions(options.layout);\n const baseLeft = baseLayout.margins?.left ?? MARGINS.left;\n const baseRight = baseLayout.margins?.right ?? MARGINS.right;\n const baseTop = baseLayout.margins?.top ?? MARGINS.top;\n const alignedLeft = computeAlignedLeftMargin(panes, baseLeft);\n const alignedRight = computeAlignedRightMargin(panes, baseRight);\n\n container.replaceChildren();\n container.style.display = \"flex\";\n container.style.flexDirection = \"column\";\n container.style.width = \"100%\";\n const existingHeight = container.offsetHeight || parseInt(getComputedStyle(container).height, 10);\n if (existingHeight > 0) {\n container.style.height = `${existingHeight}px`;\n container.style.minHeight = `${existingHeight}px`;\n } else if (!container.style.height) {\n container.style.minHeight = \"320px\";\n }\n container.style.overflow = \"hidden\";\n container.style.position = \"relative\";\n\n const paneIds = panes.map((p) => p.id);\n const paneRatios = panes.map((p) => initialPaneRatio(p.height));\n const paneCharts = new Map<string, Chart>();\n const paneWrappers: HTMLDivElement[] = [];\n const paneAxisMetas: PaneAxisMeta[] = [];\n let paneResizeCtrl: PaneResizeController | null = null;\n let isPaneDragging = false;\n let resizeRaf = 0;\n let dragLayoutRaf = 0;\n let pendingDragLayout: {\n heights: number[];\n topIdx: number;\n bottomIdx: number;\n } | null = null;\n\n const commitPaneLayout = (affected?: number[]) => {\n const indices =\n affected ??\n Array.from({ length: paneWrappers.length }, (_, i) => i);\n\n for (const i of indices) {\n const chart = paneCharts.get(paneIds[i]);\n if (chart) {\n chart.resize();\n }\n }\n adaptAllPaneAxes(\n indices.map((i) => paneAxisMetas[i]).filter(Boolean),\n );\n };\n\n const scheduleStackResize = () => {\n if (resizeRaf) return;\n resizeRaf = requestAnimationFrame(() => {\n resizeRaf = 0;\n if (isPaneDragging) return;\n commitPaneLayout();\n });\n };\n\n const resizeObserver = new ResizeObserver(() => {\n if (isPaneDragging) return;\n scheduleStackResize();\n });\n resizeObserver.observe(container);\n\n const applyFlexCss = () => {\n for (let i = 0; i < paneWrappers.length; i++) {\n const marginTop = gap > 0 && i > 0 ? `margin-top:${gap}px;` : \"\";\n paneWrappers[i].style.cssText = `${paneFlexStyle(paneRatios[i])}position:relative;overflow:hidden;${marginTop}`;\n }\n };\n\n const stackAvailHeight = () => {\n const dividerTotal = (paneWrappers.length - 1) * resizeDividerSize;\n return Math.max(1, container.clientHeight - dividerTotal);\n };\n\n const restorePaneChartDivs = () => {\n for (const wrapper of paneWrappers) {\n const chartDiv = wrapper.firstElementChild as HTMLDivElement | null;\n if (chartDiv) {\n chartDiv.style.cssText = \"position:absolute;inset:0;width:100%;height:100%;\";\n }\n }\n };\n\n const initDragHeights = (): number[] => {\n const avail = stackAvailHeight();\n const measured = paneWrappers.map((w) => w.getBoundingClientRect().height);\n const sum = measured.reduce((s, h) => s + h, 0);\n return sum > 0 ? measured.map((h) => h * (avail / sum)) : measured;\n };\n\n const applyDragPaneHeights = (heightsPx: number[]) => {\n for (let i = 0; i < paneWrappers.length; i++) {\n const h = Math.max(1, Math.round(heightsPx[i]));\n const marginTop = gap > 0 && i > 0 ? `margin-top:${gap}px;` : \"\";\n paneWrappers[i].style.cssText = `height:${h}px;flex:0 0 auto;min-height:0;position:relative;overflow:hidden;${marginTop}`;\n }\n };\n\n const flushDragLayout = () => {\n dragLayoutRaf = 0;\n if (!isPaneDragging || !pendingDragLayout) return;\n\n const { heights, topIdx, bottomIdx } = pendingDragLayout;\n applyDragPaneHeights(heights);\n\n for (const i of [topIdx, bottomIdx]) {\n const chart = paneCharts.get(paneIds[i]);\n if (chart) {\n chart.resize();\n adaptAllPaneAxes([paneAxisMetas[i]]);\n }\n }\n };\n\n const scheduleDragLayout = (\n heightsPx: number[],\n topIdx: number,\n bottomIdx: number,\n ) => {\n pendingDragLayout = { heights: heightsPx, topIdx, bottomIdx };\n if (dragLayoutRaf) return;\n dragLayoutRaf = requestAnimationFrame(flushDragLayout);\n };\n\n const syncRatiosFromHeights = (heightsPx: number[]) => {\n const totalH = heightsPx.reduce((s, h) => s + h, 0);\n if (totalH <= 0) return;\n const totalR = paneRatios.reduce((s, r) => s + r, 0);\n for (let i = 0; i < paneRatios.length; i++) {\n paneRatios[i] = (heightsPx[i] / totalH) * totalR;\n }\n };\n\n const setAllChartsResizeSuspended = (suspended: boolean) => {\n for (const chart of paneCharts.values()) {\n chart.setResizeSuspended?.(suspended);\n }\n };\n\n const setInactiveChartsResizeSuspended = (\n topIdx: number,\n bottomIdx: number,\n ) => {\n for (let i = 0; i < paneIds.length; i++) {\n if (i === topIdx || i === bottomIdx) continue;\n paneCharts.get(paneIds[i])?.setResizeSuspended?.(true);\n }\n paneCharts.get(paneIds[topIdx])?.setResizeSuspended?.(false);\n paneCharts.get(paneIds[bottomIdx])?.setResizeSuspended?.(false);\n };\n\n for (let i = 0; i < panes.length; i++) {\n const pane = panes[i];\n const isLast = i === panes.length - 1;\n const showXAxis =\n pane.showXAxis ?? (sharedXAxis === \"bottom\" ? isLast : true);\n\n const wrapper = document.createElement(\"div\");\n wrapper.dataset.paneId = pane.id;\n wrapper.style.cssText = wrapperStyle(paneRatios[i], gap, i);\n\n const chartDiv = document.createElement(\"div\");\n chartDiv.style.cssText = \"position:absolute;inset:0;width:100%;height:100%;\";\n\n wrapper.appendChild(chartDiv);\n container.appendChild(wrapper);\n paneWrappers.push(wrapper);\n\n const chart = createChart(\n buildPaneChartOptions(\n pane,\n chartDiv,\n options,\n i,\n panes.length,\n {\n left: alignedLeft,\n right: alignedRight,\n top: baseTop,\n bottom: MARGINS.bottom,\n },\n showXAxis,\n ),\n );\n\n const seriesList = expandPaneSeries(pane.series);\n if (seriesList.length) {\n for (const s of seriesList) chart.addSeries(s);\n }\n\n if (pane.yRange && pane.yRange !== \"auto\") {\n chart.zoom({ y: pane.yRange, animate: false });\n }\n\n paneCharts.set(pane.id, chart);\n\n paneAxisMetas.push({\n chart,\n wrapper,\n baseYTickCount: readBaseYTickCount(pane.chart?.yAxis),\n baseXTickCount: pane.chart?.xAxis?.tickCount ?? 8,\n showXAxis,\n });\n }\n\n if (resizable && panes.length > 1) {\n const resizeOpts =\n typeof resizableOpt === \"object\"\n ? {\n minPaneRatio: resizableOpt.minPaneRatio,\n minPanePx: resizableOpt.minPanePx,\n dividerSize: resizableOpt.dividerSize,\n }\n : {};\n paneResizeCtrl = attachPaneResize(\n container,\n paneWrappers,\n paneIds,\n paneRatios,\n {\n ...resizeOpts,\n onDragStart: (topIdx, bottomIdx) => {\n isPaneDragging = true;\n setAllChartsResizeSuspended(true);\n setInactiveChartsResizeSuspended(topIdx, bottomIdx);\n return initDragHeights();\n },\n onDragMove: (heights, topIdx, bottomIdx) => {\n scheduleDragLayout(heights, topIdx, bottomIdx);\n },\n onDragEnd: (finalHeights) => {\n if (dragLayoutRaf) {\n cancelAnimationFrame(dragLayoutRaf);\n dragLayoutRaf = 0;\n }\n pendingDragLayout = null;\n isPaneDragging = false;\n const normalized = normalizePaneHeights(finalHeights, stackAvailHeight());\n syncRatiosFromHeights(normalized);\n restorePaneChartDivs();\n applyFlexCss();\n setAllChartsResizeSuspended(false);\n commitPaneLayout();\n },\n },\n );\n }\n\n const master = paneCharts.get(masterPaneId);\n if (!master) {\n throw new Error(`[StackedChart] masterPaneId \"${masterPaneId}\" not found in panes`);\n }\n\n const group = createChartGroup(\n Array.from(paneCharts.values()),\n resolveStackSyncOptions(options.sync, masterPaneId),\n );\n\n const stack: StackedChart = {\n container,\n getPane(id: string) {\n return paneCharts.get(id);\n },\n getPanes() {\n return Array.from(paneCharts.values());\n },\n getMaster() {\n return master;\n },\n getGroup() {\n return group;\n },\n fitAll(opts) {\n group.fitAll(opts);\n },\n resetAll() {\n group.resetAll();\n },\n resize() {\n commitPaneLayout();\n },\n getPaneRatios() {\n const out: Record<string, number> = {};\n for (let i = 0; i < paneIds.length; i++) {\n out[paneIds[i]] = paneRatios[i];\n }\n return out;\n },\n setPaneRatios(ratios: Record<string, number>) {\n for (let i = 0; i < paneIds.length; i++) {\n const id = paneIds[i];\n if (ratios[id] !== undefined) paneRatios[i] = ratios[id];\n }\n applyPaneFlexRatios(paneWrappers, paneRatios);\n commitPaneLayout();\n },\n setSyncAxis(axis) {\n group.syncAxis(axis);\n },\n getSyncAxis() {\n return group.getOptions().axis ?? \"x\";\n },\n setSyncOptions(syncOpts: Partial<StackedSyncOptions>) {\n group.updateOptions(syncOpts);\n },\n whenReady() {\n const maxWait = 8000;\n const started = Date.now();\n\n const waitForInitQueue = (): Promise<void> =>\n new Promise((resolve) => {\n const poll = () => {\n const q = getInitQueueStatus();\n if ((q.pending === 0 && !q.isProcessing) || Date.now() - started > maxWait) {\n resolve();\n return;\n }\n setTimeout(poll, 50);\n };\n poll();\n });\n\n return waitForInitQueue().then(() => {\n return new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n commitPaneLayout();\n resolve();\n });\n });\n });\n },\n destroy() {\n if (resizeRaf) cancelAnimationFrame(resizeRaf);\n if (dragLayoutRaf) cancelAnimationFrame(dragLayoutRaf);\n resizeObserver.disconnect();\n paneResizeCtrl?.destroy();\n group.destroy();\n for (const c of paneCharts.values()) c.destroy();\n paneCharts.clear();\n container.replaceChildren();\n },\n };\n\n return stack;\n}\n","/**\n * Sci Plot - Testing Utilities\n * \n * Provides utilities for testing chart applications:\n * - Mock data generators\n * - Chart test harness\n * - Snapshot helpers\n * - Performance benchmarks\n * \n * @module testing\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface MockChartOptions {\n /** Canvas width (default: 800) */\n width?: number;\n /** Canvas height (default: 600) */\n height?: number;\n /** Device pixel ratio (default: 1) */\n devicePixelRatio?: number;\n /** Theme (default: 'dark') */\n theme?: string;\n /** Enable WebGL mock (default: true) */\n mockWebGL?: boolean;\n}\n\nexport interface WaveformOptions {\n /** Number of points (default: 1000) */\n pointCount?: number;\n /** Amplitude (default: 1) */\n amplitude?: number;\n /** Frequency in Hz (default: 1) */\n frequency?: number;\n /** Phase offset in radians (default: 0) */\n phase?: number;\n /** Noise level (0-1, default: 0) */\n noise?: number;\n /** X start value (default: 0) */\n xStart?: number;\n /** X end value (default: 10) */\n xEnd?: number;\n /** DC offset (default: 0) */\n offset?: number;\n}\n\nexport interface RandomDataOptions {\n /** Number of points (default: 1000) */\n pointCount?: number;\n /** X range [min, max] (default: [0, 100]) */\n xRange?: [number, number];\n /** Y range [min, max] (default: [-1, 1]) */\n yRange?: [number, number];\n /** Sort by X value (default: true) */\n sorted?: boolean;\n /** Seed for reproducible random (optional) */\n seed?: number;\n}\n\nexport interface BenchmarkResult {\n /** Average frames per second */\n avgFps: number;\n /** Minimum FPS recorded */\n minFps: number;\n /** Maximum FPS recorded */\n maxFps: number;\n /** Average frame time in ms */\n avgFrameTime: number;\n /** Total frames rendered */\n frameCount: number;\n /** Test duration in ms */\n duration: number;\n /** Points per frame */\n pointsRendered: number;\n /** Points per second throughput */\n throughput: number;\n}\n\nexport interface BenchmarkOptions {\n /** Duration of benchmark in ms (default: 5000) */\n duration?: number;\n /** Warmup duration in ms (default: 1000) */\n warmup?: number;\n /** Target FPS for assertions (default: 55) */\n targetFps?: number;\n /** Enable console output (default: false) */\n verbose?: boolean;\n}\n\nexport interface SnapshotOptions {\n /** Output format: 'json' | 'png' | 'canvas' (default: 'json') */\n format?: 'json' | 'png' | 'canvas';\n /** Include data in snapshot (default: false for performance) */\n includeData?: boolean;\n /** Include styles in snapshot (default: true) */\n includeStyles?: boolean;\n}\n\nexport interface ChartSnapshot {\n /** Snapshot timestamp */\n timestamp: number;\n /** Chart configuration */\n config: Record<string, unknown>;\n /** Series metadata (without data by default) */\n series: {\n id: string;\n type: string;\n pointCount: number;\n style?: Record<string, unknown>;\n }[];\n /** View bounds */\n bounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n };\n /** Canvas data URL (if format is 'png') */\n image?: string;\n}\n\n// ============================================\n// Seeded Random Number Generator\n// ============================================\n\nclass SeededRandom {\n private seed: number;\n\n constructor(seed: number) {\n this.seed = seed;\n }\n\n next(): number {\n // Mulberry32 PRNG\n let t = (this.seed += 0x6d2b79f5);\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n nextRange(min: number, max: number): number {\n return min + this.next() * (max - min);\n }\n}\n\n// ============================================\n// Data Generators\n// ============================================\n\n/**\n * Generate a sine wave\n */\nexport function generateSineWave(options?: WaveformOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<WaveformOptions> = {\n pointCount: 1000,\n amplitude: 1,\n frequency: 1,\n phase: 0,\n noise: 0,\n xStart: 0,\n xEnd: 10,\n offset: 0,\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n const dx = (opts.xEnd - opts.xStart) / (opts.pointCount - 1);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = opts.xStart + i * dx;\n const baseValue =\n opts.amplitude * Math.sin(2 * Math.PI * opts.frequency * x[i] + opts.phase);\n const noiseValue = opts.noise > 0 ? (Math.random() - 0.5) * 2 * opts.noise : 0;\n y[i] = baseValue + noiseValue + opts.offset;\n }\n\n return { x, y };\n}\n\n/**\n * Generate a square wave\n */\nexport function generateSquareWave(options?: WaveformOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<WaveformOptions> = {\n pointCount: 1000,\n amplitude: 1,\n frequency: 1,\n phase: 0,\n noise: 0,\n xStart: 0,\n xEnd: 10,\n offset: 0,\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n const dx = (opts.xEnd - opts.xStart) / (opts.pointCount - 1);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = opts.xStart + i * dx;\n const t = x[i] * opts.frequency + opts.phase / (2 * Math.PI);\n const baseValue = Math.sign(Math.sin(2 * Math.PI * t)) * opts.amplitude;\n const noiseValue = opts.noise > 0 ? (Math.random() - 0.5) * 2 * opts.noise : 0;\n y[i] = baseValue + noiseValue + opts.offset;\n }\n\n return { x, y };\n}\n\n/**\n * Generate a sawtooth wave\n */\nexport function generateSawtoothWave(options?: WaveformOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<WaveformOptions> = {\n pointCount: 1000,\n amplitude: 1,\n frequency: 1,\n phase: 0,\n noise: 0,\n xStart: 0,\n xEnd: 10,\n offset: 0,\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n const dx = (opts.xEnd - opts.xStart) / (opts.pointCount - 1);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = opts.xStart + i * dx;\n const t = x[i] * opts.frequency + opts.phase / (2 * Math.PI);\n const baseValue = opts.amplitude * 2 * (t - Math.floor(t + 0.5));\n const noiseValue = opts.noise > 0 ? (Math.random() - 0.5) * 2 * opts.noise : 0;\n y[i] = baseValue + noiseValue + opts.offset;\n }\n\n return { x, y };\n}\n\n/**\n * Generate a triangle wave\n */\nexport function generateTriangleWave(options?: WaveformOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<WaveformOptions> = {\n pointCount: 1000,\n amplitude: 1,\n frequency: 1,\n phase: 0,\n noise: 0,\n xStart: 0,\n xEnd: 10,\n offset: 0,\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n const dx = (opts.xEnd - opts.xStart) / (opts.pointCount - 1);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = opts.xStart + i * dx;\n const t = x[i] * opts.frequency + opts.phase / (2 * Math.PI);\n const baseValue = opts.amplitude * 2 * Math.abs(2 * (t - Math.floor(t + 0.5))) - opts.amplitude;\n const noiseValue = opts.noise > 0 ? (Math.random() - 0.5) * 2 * opts.noise : 0;\n y[i] = baseValue + noiseValue + opts.offset;\n }\n\n return { x, y };\n}\n\n/**\n * Generate random data points\n */\nexport function generateRandomData(options?: RandomDataOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<RandomDataOptions> = {\n pointCount: 1000,\n xRange: [0, 100],\n yRange: [-1, 1],\n sorted: true,\n seed: Date.now(),\n ...options,\n };\n\n const rng = new SeededRandom(opts.seed);\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = rng.nextRange(opts.xRange[0], opts.xRange[1]);\n y[i] = rng.nextRange(opts.yRange[0], opts.yRange[1]);\n }\n\n // Sort by X if requested\n if (opts.sorted) {\n const indices = Array.from({ length: opts.pointCount }, (_, i) => i);\n indices.sort((a, b) => x[a] - x[b]);\n \n const sortedX = new Float32Array(opts.pointCount);\n const sortedY = new Float32Array(opts.pointCount);\n \n for (let i = 0; i < opts.pointCount; i++) {\n sortedX[i] = x[indices[i]];\n sortedY[i] = y[indices[i]];\n }\n \n return { x: sortedX, y: sortedY };\n }\n\n return { x, y };\n}\n\n/**\n * Generate a cyclic voltammogram (CV) mock data\n */\nexport function generateCVData(options?: {\n pointCount?: number;\n vMin?: number;\n vMax?: number;\n cycles?: number;\n peakCurrent?: number;\n noise?: number;\n}): { x: Float32Array; y: Float32Array } {\n const opts = {\n pointCount: 2000,\n vMin: -0.5,\n vMax: 0.5,\n cycles: 1,\n peakCurrent: 10e-6, // 10 µA\n noise: 0.02,\n ...options,\n };\n\n const totalPoints = opts.pointCount * opts.cycles;\n const x = new Float32Array(totalPoints);\n const y = new Float32Array(totalPoints);\n \n const pointsPerCycle = opts.pointCount;\n const halfCycle = pointsPerCycle / 2;\n\n for (let c = 0; c < opts.cycles; c++) {\n for (let i = 0; i < pointsPerCycle; i++) {\n const idx = c * pointsPerCycle + i;\n \n // Potential sweep\n if (i < halfCycle) {\n x[idx] = opts.vMin + (opts.vMax - opts.vMin) * (i / halfCycle);\n } else {\n x[idx] = opts.vMax - (opts.vMax - opts.vMin) * ((i - halfCycle) / halfCycle);\n }\n \n // Current response (simplified Randles-Sevcik)\n const E = x[idx];\n const E0 = 0; // Formal potential\n const scanDirection = i < halfCycle ? 1 : -1;\n \n // Gaussian-like peak\n const peakWidth = 0.1;\n const exponent = -Math.pow(E - E0, 2) / (2 * peakWidth * peakWidth);\n const peakCurrent = opts.peakCurrent * Math.exp(exponent);\n \n // Add capacitive current and noise\n const capacitive = scanDirection * opts.peakCurrent * 0.1;\n const noiseValue = (Math.random() - 0.5) * 2 * opts.noise * opts.peakCurrent;\n \n y[idx] = scanDirection * peakCurrent + capacitive + noiseValue;\n }\n }\n\n return { x, y };\n}\n\n/**\n * Generate electrochemical impedance spectroscopy (EIS) Nyquist data\n */\nexport function generateNyquistData(options?: {\n pointCount?: number;\n rSolution?: number;\n rCharge?: number;\n frequency?: [number, number];\n}): { x: Float32Array; y: Float32Array } {\n const opts = {\n pointCount: 50,\n rSolution: 100, // Ohms\n rCharge: 1000, // Ohms\n frequency: [1e5, 0.01] as [number, number],\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n \n // Logarithmic frequency spacing\n const logFMin = Math.log10(opts.frequency[1]);\n const logFMax = Math.log10(opts.frequency[0]);\n \n for (let i = 0; i < opts.pointCount; i++) {\n const logF = logFMax - (logFMax - logFMin) * (i / (opts.pointCount - 1));\n const omega = 2 * Math.PI * Math.pow(10, logF);\n \n // Simple Randles circuit: Rs + (Rct || CPE)\n const tau = opts.rCharge * 1e-5; // Time constant\n const realPart = opts.rSolution + opts.rCharge / (1 + Math.pow(omega * tau, 2));\n const imagPart = omega * tau * opts.rCharge / (1 + Math.pow(omega * tau, 2));\n \n x[i] = realPart;\n y[i] = -imagPart; // Negative for Nyquist convention\n }\n\n return { x, y };\n}\n\n// ============================================\n// Performance Benchmarking\n// ============================================\n\n/**\n * Benchmark chart rendering performance\n */\nexport async function benchmarkRender(\n chart: { render: () => void; getAllSeries: () => { getPointCount: () => number }[] },\n options?: BenchmarkOptions\n): Promise<BenchmarkResult> {\n const opts: Required<BenchmarkOptions> = {\n duration: 5000,\n warmup: 1000,\n targetFps: 55,\n verbose: false,\n ...options,\n };\n\n const fpsHistory: number[] = [];\n const frameTimes: number[] = [];\n let frameCount = 0;\n let lastTime = performance.now();\n\n // Calculate total points\n const totalPoints = chart\n .getAllSeries()\n .reduce((sum, s) => sum + s.getPointCount(), 0);\n\n return new Promise((resolve) => {\n const endTime = performance.now() + opts.warmup + opts.duration;\n const warmupEndTime = performance.now() + opts.warmup;\n let recording = false;\n\n function frame() {\n const now = performance.now();\n\n if (now >= endTime) {\n // Calculate results\n const avgFps = fpsHistory.reduce((a, b) => a + b, 0) / fpsHistory.length;\n const minFps = Math.min(...fpsHistory);\n const maxFps = Math.max(...fpsHistory);\n const avgFrameTime = frameTimes.reduce((a, b) => a + b, 0) / frameTimes.length;\n\n const result: BenchmarkResult = {\n avgFps: Math.round(avgFps * 100) / 100,\n minFps,\n maxFps,\n avgFrameTime: Math.round(avgFrameTime * 100) / 100,\n frameCount,\n duration: opts.duration,\n pointsRendered: totalPoints,\n throughput: Math.round((totalPoints * avgFps) / 1000) * 1000,\n };\n\n resolve(result);\n return;\n }\n\n // Start recording after warmup\n if (now >= warmupEndTime && !recording) {\n recording = true;\n lastTime = now;\n frameCount = 0;\n }\n\n // Render frame\n chart.render();\n\n if (recording) {\n const frameTime = now - lastTime;\n frameTimes.push(frameTime);\n frameCount++;\n\n // Calculate instantaneous FPS every 500ms window\n const recentTimes = frameTimes.slice(-30);\n if (recentTimes.length > 0) {\n const avgRecentTime = recentTimes.reduce((a, b) => a + b, 0) / recentTimes.length;\n fpsHistory.push(1000 / avgRecentTime);\n }\n }\n\n lastTime = now;\n requestAnimationFrame(frame);\n }\n\n requestAnimationFrame(frame);\n });\n}\n\n// ============================================\n// Snapshot Utilities\n// ============================================\n\n/**\n * Create a snapshot of chart state for testing\n */\nexport function createSnapshot(\n chart: {\n getViewBounds: () => { xMin: number; xMax: number; yMin: number; yMax: number };\n getAllSeries: () => { getId: () => string; getType: () => string; getPointCount: () => number; getStyle: () => Record<string, unknown> }[];\n exportImage?: () => string;\n },\n options?: SnapshotOptions\n): ChartSnapshot {\n const opts: Required<SnapshotOptions> = {\n format: 'json',\n includeData: false,\n includeStyles: true,\n ...options,\n };\n\n const series = chart.getAllSeries().map((s) => ({\n id: s.getId(),\n type: s.getType(),\n pointCount: s.getPointCount(),\n ...(opts.includeStyles ? { style: s.getStyle() } : {}),\n }));\n\n const snapshot: ChartSnapshot = {\n timestamp: Date.now(),\n config: {},\n series,\n bounds: chart.getViewBounds(),\n };\n\n if (opts.format === 'png' && chart.exportImage) {\n snapshot.image = chart.exportImage();\n }\n\n return snapshot;\n}\n\n/**\n * Compare two snapshots for equality\n */\nexport function compareSnapshots(\n a: ChartSnapshot,\n b: ChartSnapshot,\n tolerance: number = 1e-6\n): {\n equal: boolean;\n differences: string[];\n} {\n const differences: string[] = [];\n\n // Compare series count\n if (a.series.length !== b.series.length) {\n differences.push(`Series count: ${a.series.length} vs ${b.series.length}`);\n }\n\n // Compare series metadata\n for (let i = 0; i < Math.min(a.series.length, b.series.length); i++) {\n const sa = a.series[i];\n const sb = b.series[i];\n\n if (sa.id !== sb.id) {\n differences.push(`Series[${i}] id: \"${sa.id}\" vs \"${sb.id}\"`);\n }\n if (sa.type !== sb.type) {\n differences.push(`Series[${i}] type: \"${sa.type}\" vs \"${sb.type}\"`);\n }\n if (sa.pointCount !== sb.pointCount) {\n differences.push(`Series[${i}] pointCount: ${sa.pointCount} vs ${sb.pointCount}`);\n }\n }\n\n // Compare bounds with tolerance\n const boundsKeys: (keyof ChartSnapshot['bounds'])[] = ['xMin', 'xMax', 'yMin', 'yMax'];\n for (const key of boundsKeys) {\n if (Math.abs(a.bounds[key] - b.bounds[key]) > tolerance) {\n differences.push(`Bounds.${key}: ${a.bounds[key]} vs ${b.bounds[key]}`);\n }\n }\n\n return {\n equal: differences.length === 0,\n differences,\n };\n}\n\n// ============================================\n// Test Assertions\n// ============================================\n\n/**\n * Assert that a benchmark meets performance requirements\n */\nexport function assertPerformance(\n result: BenchmarkResult,\n requirements: {\n minFps?: number;\n maxFrameTime?: number;\n minThroughput?: number;\n }\n): { passed: boolean; failures: string[] } {\n const failures: string[] = [];\n\n if (requirements.minFps && result.avgFps < requirements.minFps) {\n failures.push(`FPS ${result.avgFps} < required ${requirements.minFps}`);\n }\n\n if (requirements.maxFrameTime && result.avgFrameTime > requirements.maxFrameTime) {\n failures.push(`Frame time ${result.avgFrameTime}ms > required ${requirements.maxFrameTime}ms`);\n }\n\n if (requirements.minThroughput && result.throughput < requirements.minThroughput) {\n failures.push(`Throughput ${result.throughput} < required ${requirements.minThroughput}`);\n }\n\n return {\n passed: failures.length === 0,\n failures,\n };\n}\n\n/**\n * Wait for a number of animation frames\n */\nexport function waitForFrames(count: number = 1): Promise<void> {\n return new Promise((resolve) => {\n let remaining = count;\n function tick() {\n remaining--;\n if (remaining <= 0) {\n resolve();\n } else {\n requestAnimationFrame(tick);\n }\n }\n requestAnimationFrame(tick);\n });\n}\n\n/**\n * Wait for a specified duration\n */\nexport function waitFor(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { Range, SeriesOptions } from \"../../types\";\nimport type { StackedPaneConfig } from \"../stacked/types\";\nimport type { IndicatorData, IndicatorSeriesOptions, IndicatorStyle } from \"./types\";\nimport { buildIndicatorSeries } from \"./buildIndicatorSeries\";\n\nexport interface BuildIndicatorPaneOptions {\n id: string;\n /** Flex ratio inside createStackedChart (default 0.25) */\n height?: number | string;\n label?: string;\n data: IndicatorData;\n style?: IndicatorStyle;\n /** Lock Y range (recommended for oscillators) */\n yRange?: Range | \"auto\";\n tickCount?: number;\n showXAxis?: boolean;\n seriesId?: string;\n}\n\n/**\n * Build a stacked pane pre-configured for a trading indicator\n * (histogram + lines + fills + markers).\n */\nexport function buildIndicatorPane(options: BuildIndicatorPaneOptions): StackedPaneConfig {\n const seriesId = options.seriesId ?? `${options.id}-indicator`;\n const indicatorOpts: IndicatorSeriesOptions = {\n id: seriesId,\n type: \"indicator\",\n data: options.data,\n style: options.style,\n name: options.label,\n };\n const series: SeriesOptions[] = buildIndicatorSeries(indicatorOpts);\n\n return {\n id: options.id,\n height: options.height ?? 0.25,\n showXAxis: options.showXAxis,\n yRange: options.yRange,\n chart: {\n yAxis: {\n label: options.label ?? \"Indicator\",\n auto: options.yRange === undefined || options.yRange === \"auto\",\n tickCount: options.tickCount ?? 5,\n scientific: false,\n },\n xAxis: { showLabels: false, showTicks: false, showLine: false },\n animations: false,\n loading: false,\n showLegend: false,\n },\n series,\n };\n}\n"],"names":["WebGPURenderer","canvas","opts","__publicField","gpu","ctx","format","crosshairManifest","CrosshairPlugin","definePlugin","config","showVertical","showHorizontal","color","lineStyle","lineWidth","snapToData","valueFormat","valueDisplayMode","cornerPosition","cursorX","cursorY","overlayId","pluginCtx","overlay","resizeCanvas","event","nearest","render","size","dpr","width","height","plotArea","lineColor","_a","drawFloatingLabels","drawCornerLabels","x","y","bgColor","dataX","dataY","xText","xLabelWidth","xLabelHeight","xLabelX","xLabelY","yText","yLabelWidth","yLabelHeight","yLabelX","yLabelY","xMetrics","yMetrics","maxWidth","padding","lineHeight","boxWidth","boxHeight","boxX","boxY","statsManifest","StatsPlugin","position","show","seriesId","autoUpdate","container","posStyle","updateStats","content","allSeries","targetSeries","s","allY","series","data","stats","computeStats","lines","values","n","sum","min","max","v","mean","sumSq","std","watermarkManifest","WatermarkPlugin","text","fontSize","fontFamily","rotation","ctx2d","gridHighlightManifest","GridHighlightPlugin","xIntervals","yIntervals","opacity","_event","interval","x1","x2","y1","y2","dataLoggerManifest","DataLoggerPlugin","logDataUpdates","logViewChanges","logInteractions","maxEntries","entries","addEntry","type","_ctx","saved","directionIndicatorManifest","DirectionIndicatorPlugin","sampleSize","minVelocity","historySize","idleTimeout","currentDirection","targetSeriesId","positionHistoryX","positionHistoryY","angleHistory","maxHistorySize","timeoutTimer","lastPointTimestamp","lastSeenX","lastSeenY","currentIdleTimeout","updateDirection","age","_pluginCtx","newConfig","canvasSize","totalPoints","lastX","lastY","startIdx","sumT","sumPX","sumPY","sumTPX","sumTPY","sumTT","i","t","pixelX","pixelY","meanT","meanPX","meanPY","denominator","slopePX","slopePY","rawAngle","lastPixelX","lastPixelY","smoothX","average","smoothY","smoothedAngle","smoothAngle","magnitude","val","angles","sumX","sumY","angle","arrowColor","drawArrow","length","triangleHeight","triangleWidth","BuiltinPlugins","detectZScore","threshold","anomalies","windowSize","start","end","localSum","count","j","localMean","localSumSq","localStdDev","zScore","detectMAD","localValues","a","b","localMedian","deviations","mad","modifiedZScore","detectIQR","multiplier","q1Index","q3Index","q1","q3","iqr","lowerBound","upperBound","score","detectIsolationForest","contamination","numTrees","scores","totalDepth","isolationDepth","avgDepth","c","sortedScores","thresholdIndex","pointIndex","currentDepth","maxDepth","splitValue","detectAnomalies","method","sensitivity","DEFAULT_CONFIG","manifestAnomalyDetection","PluginAnomalyDetection","userConfig","detectionResults","result","results","_series","SimpleNeuralNetwork","input","startTime","inputData","outputData","processingTime","activations","layer","weights","biases","output","activation","dummyInput","NativeLinearRegression","predictions","X","XtX","XtY","XtXInv","beta","row","matrix","_","colIndex","k","det","invDet","NativeSignalProcessor","_b","_c","filteredData","alpha","smoothedAlpha","filtered","lowpass","createNativeModel","nativeFFT","real","imag","sumReal","sumImag","nativeMean","nativeStandardDeviation","variance","nativeCorrelation","meanX","meanY","numerator","denomX","denomY","dx","dy","manifestML","PluginMLIntegration","models","activeVisualizations","m","api","model","modelId","seriesData","vizId","visualizationId","drawMLVisualizations","pCtx","coords","viz","xValues","confidence","px","py","_d","findPeaksAndValleys","points","peaks","valleys","prev","curr","next","calculateSlope","p1","p2","calculatePatternMeasurements","yValues","p","slope","validateHeadShoulders","leftShoulder","head","rightShoulder","leftValley","rightValley","headHigherThanShoulders","shouldersApproximatelyEqual","valleyBelowShoulders","segments","keyPoints","measurements","shoulderSymmetry","valleySymmetry","validateDoubleTop","firstTop","secondTop","valley","topsApproximatelyEqual","valleyBelowTops","significantDrop","topEquality","depthRatio","validateDoubleBottom","firstBottom","secondBottom","peak","bottomsApproximatelyEqual","peakAboveBottoms","significantRise","bottomEquality","heightRatio","validateAscendingTriangle","resistanceLevel","resistancePoints","lows","firstLow","lastLow","supportSlope","resistanceFlatness","supportAscending","BUILTIN_PATTERNS","invertedPoints","peak1","peak2","peak3","tolerance","firstHalf","secondHalf","firstSlope","secondSlope","peakSlope","valleySlope","resistance","support","supportPoints","_points","manifestPatternRecognition","PluginPatternRecognition","patternMatches","registeredPatterns","realtimeSeries","debounceTimers","detectPatterns","dataPoints","parameters","params","matches","patternsByType","processedPoints","preprocessData","patternType","pattern","window","validation","match","hasSignificantOverlap","detectionTime","point","index","newMatch","existingMatches","existing","overlapStart","overlapSize","newMatchSize","existingMatchSize","registerCustomPattern","customConfig","validateCustomPattern","errors","sequencePoint","actualPoint","constraints","chart","timer","totalDetections","allPatternsByType","allConfidences","showTypes","filteredMatches","segment","lineId","labelId","centerX","centerY","handleDataUpdate","context","newTimer","customPattern","_context","_newConfig","toArray","toFloat32Array","calculateMean","calculateVariance","calculateRSquared","observed","fitted","meanObserved","ssRes","ssTot","calculateAdjustedRSquared","rSquared","calculateRMSE","sumSquaredErrors","linearRegression","forceOrigin","weight","fittedValues","xi","residuals","yi","adjustedRSquared","rmse","r","sumXY","sumX2","sumY2","sumWeights","intercept","polynomialRegression","degree","solveLeastSquares","value","exponentialRegression","_config","offset","transformedY","adjusted","linearResult","rate","logAmplitude","amplitude","gaussianRegression","learningRate","maxIterations","iter","gradAmplitude","gradMean","gradStd","gradOffset","totalError","exponent","predicted","error","expTerm","regularization","Xty","solveLinearSystem","manifestRegression","PluginRegression","regressionResults","fit","methodConfig","logX","logY","logXPow","fitAndCompare","methods","configs","criteria","autoFit","candidateMethods","bestResult","resultIndex","_level","margin","lower","upper","predArray","methodsUsed","totalFittings","allMethodsUsed","allRSquared","allProcessingTimes","fitSeriesId","equation","formatEquation","annotationId","allMethods","csv","matlab","manifestRadar","PluginRadar","radarSeries","drawRadar","maxRadiusPixels","numCategories","angleStep","level","radius","labelRadius","lx","ly","_e","_f","style","pathPoints","cat","idx","id","res","categories","manifestSnapshot","DEFAULT_OPTIONS","resolutionToScale","PluginSnapshot","takeSnapshot","options","opt","scale","originalDPR","webglCanvas","overlayCanvas","compositionCanvas","compCtx","drawWatermark","mimeType","dataUrl","extension","link","w","h","manifest","PluginDataTransform","originalDataStore","applyTransform","pipeline","currentData","original","op","executeOp","range","rangeWidth","targetRange","newY","smoothedY","movingAverage","order","calcDerivative","iy","calcIntegral","resample","subtractBaseline","base","logBase","exp","numPoints","newX","xMin","targetX","low","high","found","mid","x0","y0","GREEK_LOWERCASE","GREEK_UPPERCASE","MATH_OPERATORS","ALL_SYMBOLS","getSymbol","command","isSymbol","parseLaTeX","latex","tokens","tokenize","parseTokens","extractTextContent","nodes","node","char","token","parseGroup","textContent","startIndex","groupTokens","braceDepth","renderNodes","currentX","maxAscent","maxDescent","isSub","isSuper","nextNode","isNextSub","isNextSuper","dims1","renderNode","dims2","dims","renderText","renderSymbol","renderSuperscript","renderSubscript","renderFraction","renderSqrt","metrics","baseline","symbol","scaledFontSize","yOffset","subAscent","subDescent","lineThickness","numDims","measureNodes","denDims","totalHeight","numX","numY","denX","denY","contentDims","totalWidth","measureCtx","PluginLaTeX","finalConfig","parseCache","measureCache","clearCache","getParsed","parsed","renderConfig","measure","cacheKey","calculateForecast","horizon","dt","forecastSMA","forecastEMA","forecastLinear","forecastSimpleExpSmoothing","forecastHolt","forecastHoltWinters","futureX","calculateFitMetrics","effectiveWindow","avg","ema","sumXX","nextX","trend","lastLevel","period","gamma","seasonals","seasonAverages","sumOverAvg","_historical","_forecast","manifestForecasting","PluginForecasting","activeForecasts","vizConfig","mergedConfig","drawForecasts","PluginDragEdit","isDragging","draggedPoint","dragStartX","dragStartY","hasMoved","findNearestPoint","mouseX","mouseY","picked","pixelToData","snapToGrid","applyConstraints","constraint","validateAndSnap","finalX","finalY","tempPoint","updatePointData","createDragEvent","drawPreview","origPixelX","origPixelY","currPixelX","currPixelY","seriesIds","dragEvent","valid","PluginCaching","cache","currentSize","estimateSize","item","key","evict","requiredSpace","freedSpace","keysToDelete","entry","pruneExpired","now","get","set","oldEntry","has","deleteKey","clear","invalidateByTags","tags","tag","getStats","total","resetStats","keys","cleanupInterval","PluginLazyLoad","getChunkIndex","getVisibleRange","bounds","loadChunk","seriesInfo","chunkIndex","endIndex","chunk","updateSeriesData","loadedPoints","totalChunks","sortedChunks","totalSize","loadVisible","visibleRange","buffer","buffered","chunksToLoad","endIdx","maxToLoad","nextChunk","unloadDistant","unloadedCount","toRemove","registerSeries","provider","unregisterSeries","loadRange","startChunk","endChunk","getLoadingStatus","BrokenAxisScale","originalScale","breaks","current","totalVisibleDataWidth","totalBreakVisualRatio","currentRatioOffset","dataWidth","visualWidth","nextBreak","r0","r1","isReverse","ratio","prevRange","pixel","visualEnd","allTicks","visualWeight","segmentCount","segmentTicks","rawStep","normalized","step","ticks","PluginBrokenAxis","originalXScale","brokenXScale","rawDataStore","updateScales","applyTransformations","raw","transformedX","drawBreakSymbols","axisId","orientation","pxStart","pxEnd","midPx","drawSymbol","edge","pluginApi","enabled","wasEnabled","combinedX","combinedY","xArr","PluginVideoRecorder","mediaRecorder","recordedChunks","isRecording","isPaused","compositeCanvas","compositeCtx","animationFrameId","createCompositeCanvas","mainCanvas","updateComposite","stream","e","resolve","blob","url","WorkerPool","workerCode","workerUrl","worker","workerIndex","taskId","imageData","task","wIndex","priority","reject","PluginOffscreen","pool","log","message","args","isSupported","enable","disable","updateConfig","poolStats","flush","lttbDownsample","targetPoints","outX","outY","outIndices","bucketSize","outIdx","bucketStart","bucketEnd","nextBucketStart","nextBucketEnd","avgX","avgY","avgCount","maxArea","maxIndex","aX","aY","area","minMaxDownsample","bucketCount","minY","maxY","minIdx","maxIdx","calculateTargetPoints","dataLength","canvasWidth","pointsPerPixel","maxPoints","PluginVirtualization","isInternalUpdate","originalData","originalUpdateSeries","originalAppendData","shouldVirtualize","getTargetPoints","downsampleData","strategy","cacheOriginal","restoreOriginal","originalPoints","renderedPoints","mode","applyVirtualization","downsampled","refreshAll","handleUpdateSeries","updatedSeries","handleAppendData","updater","PluginROI","activeTool","regions","isDrawing","activeRegion","isMasking","originalAddSeries","createRegion","tool","dataToPixel","isPointInAnyRegion","isPointInRegion","applyMasking","indices","filteredX","filteredY","region","xMax","yMin","yMax","inside","xj","yj","calculateMasks","regionId","masks","finishRegion","handlePointerDown","previewPoint","startPoint","handlePointerMove","lastPoint","newPoint","lastIndex","handlePointerUp","drawRegion","fill","pixels","fx","fy","mask","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","maybeKey","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","didWarnAboutKeySpread","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","useSciPlot","containerRef","setChart","useState","isReady","setIsReady","setError","setBounds","optionsRef","useRef","useEffect","chartInstance","createChart","err","addSeries","useCallback","seriesOptions","updateSeries","removeSeries","zoom","zoomOptions","resetZoom","SciPlot","forwardRef","zoomProp","onZoomChange","cursor","className","debug","chartOptions","ref","previousSeriesRef","useImperativeHandle","currentSeriesMap","previousSeriesMap","prevSeries","containerStyle","useMemo","jsx","jsxs","STACKED_MAX_PANES","STACKED_DEFAULT_MIN_PANE_RATIO","STACKED_COMPACT_MARGIN","STACKED_FULL_X_MARGIN","DIVIDER_CLASS","RESIZING_CLASS","injectDividerStyles","createDividerElement","divider","handle","paneFlexStyle","resolveMinPaneHeightPx","availHeight","paneCount","minPaneRatio","minPanePx","byRatio","minH","normalizePaneHeights","heightsPx","targetTotal","even","out","scaled","allocated","attachPaneResize","paneWrappers","paneIds","ratios","dividerSize","minPaneHeight","avail","dividers","cleanups","availableHeight","dividerTotal","applyRatios","topIdx","bottomIdx","deltaY","othersSum","pairTotal","topH","bottomH","byId","onPointerDown","onMove","ev","onUp","fn","d","applyPaneFlexRatios","initialPaneRatio","tickCountForPaneHeight","heightPx","adaptive","tickCountForPaneWidth","widthPx","readBaseYTickCount","yAxis","adaptPaneAxes","meta","yTicks","xTicks","adaptAllPaneAxes","metas","countYAxes","axes","left","right","computeAlignedLeftMargin","panes","baseLeft","maxExtra","pane","computeAlignedRightMargin","baseRight","expandPaneSeries","buildIndicatorSeries","buildPaneChartOptions","chartContainer","stack","alignedMargins","showXAxis","isFirst","isLast","compactX","compactMargin","margins","baseX","xAxis","_g","mergeLayoutOptions","_h","_i","_k","_j","wrapperStyle","gap","marginTop","resolveStackSyncOptions","sync","masterPaneId","createStackedChart","sharedXAxis","resizableOpt","resizable","resizeDividerSize","baseLayout","MARGINS","baseTop","alignedLeft","alignedRight","existingHeight","paneRatios","paneCharts","paneAxisMetas","paneResizeCtrl","isPaneDragging","resizeRaf","dragLayoutRaf","pendingDragLayout","commitPaneLayout","affected","scheduleStackResize","resizeObserver","applyFlexCss","stackAvailHeight","restorePaneChartDivs","wrapper","chartDiv","initDragHeights","measured","applyDragPaneHeights","flushDragLayout","heights","scheduleDragLayout","syncRatiosFromHeights","totalH","totalR","setAllChartsResizeSuspended","suspended","setInactiveChartsResizeSuspended","seriesList","resizeOpts","finalHeights","master","group","createChartGroup","axis","syncOpts","started","poll","q","getInitQueueStatus","SeededRandom","seed","generateSineWave","baseValue","noiseValue","generateSquareWave","generateSawtoothWave","generateTriangleWave","generateRandomData","rng","sortedX","sortedY","generateCVData","pointsPerCycle","halfCycle","E","E0","scanDirection","peakWidth","peakCurrent","capacitive","generateNyquistData","logFMin","logFMax","logF","omega","tau","realPart","imagPart","benchmarkRender","fpsHistory","frameTimes","frameCount","lastTime","endTime","warmupEndTime","recording","frame","avgFps","minFps","maxFps","avgFrameTime","frameTime","recentTimes","avgRecentTime","createSnapshot","snapshot","compareSnapshots","differences","sa","sb","boundsKeys","assertPerformance","requirements","failures","waitForFrames","remaining","tick","waitFor","ms","buildIndicatorPane","indicatorOpts"],"mappings":"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","x_google_ignoreList":[36,37,38]}
|
|
1
|
+
{"version":3,"file":"velo-plot.full.js","sources":["../src/renderer/WebGPURenderer.ts","../src/plugins/builtins/crosshair/CrosshairPlugin.ts","../src/plugins/builtins/stats/StatsPlugin.ts","../src/plugins/builtins/watermark/WatermarkPlugin.ts","../src/plugins/builtins/grid-highlight/GridHighlightPlugin.ts","../src/plugins/builtins/data-logger/DataLoggerPlugin.ts","../src/plugins/builtins/direction-indicator/DirectionIndicatorPlugin.ts","../src/plugins/builtins/index.ts","../src/plugins/drag-edit/index.ts","../src/plugins/drawing-tools/index.ts","../src/plugins/replay/index.ts","../src/renderer/spike/WebGLGridSpike.ts","../src/testing/gridSpikeBenchmark.ts","../src/testing/stage1BrowserBench.ts","../src/testing/rendererBenchmark.ts","../src/testing/index.ts","../src/core/time/TimeScale.ts","../src/core/chart/heikinAshi.ts"],"sourcesContent":["export interface WebGPURendererOptions {\n powerPreference?: \"low-power\" | \"high-performance\";\n preferredFormat?: string;\n antialias?: boolean;\n}\n\nexport class WebGPURenderer {\n public readonly available: boolean;\n\n private canvas: HTMLCanvasElement;\n private adapter: any;\n private device: any;\n private context: any;\n\n constructor(canvas: HTMLCanvasElement, opts: WebGPURendererOptions = {}) {\n this.canvas = canvas;\n this.available = WebGPURenderer.isSupported();\n void opts;\n }\n\n static isSupported(): boolean {\n return (\n typeof (globalThis as any).navigator !== \"undefined\" &&\n typeof (globalThis as any).navigator.gpu !== \"undefined\"\n );\n }\n\n async init(opts: WebGPURendererOptions = {}): Promise<void> {\n if (!this.available) {\n throw new Error(\"[SciPlot] WebGPU is not supported in this environment\");\n }\n\n const gpu = (globalThis as any).navigator.gpu;\n this.adapter = await gpu.requestAdapter({\n powerPreference: opts.powerPreference ?? \"high-performance\",\n });\n\n if (!this.adapter) {\n throw new Error(\"[SciPlot] Failed to request WebGPU adapter\");\n }\n\n this.device = await this.adapter.requestDevice();\n\n const ctx = (this.canvas as any).getContext(\"webgpu\");\n if (!ctx) {\n throw new Error(\"[SciPlot] Failed to get WebGPU context\");\n }\n\n this.context = ctx;\n\n const format =\n opts.preferredFormat ??\n (gpu.getPreferredCanvasFormat\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n this.context.configure({\n device: this.device,\n format,\n alphaMode: \"premultiplied\",\n });\n }\n\n destroy(): void {\n this.device = undefined;\n this.adapter = undefined;\n this.context = undefined;\n }\n}\n","import type {\n PluginContext,\n PluginManifest,\n InteractionEvent,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\nimport type {\n CrosshairValueMode,\n CornerPosition\n} from \"../../../core/layout\";\n\nexport interface CrosshairPluginConfig {\n /** Show vertical line (default: true) */\n showVertical?: boolean;\n /** Show horizontal line (default: true) */\n showHorizontal?: boolean;\n /** Line color (default: from theme) */\n color?: string;\n /** Line style (default: 'dashed') */\n lineStyle?: \"solid\" | \"dashed\" | \"dotted\";\n /** Line width (default: 1) */\n lineWidth?: number;\n /** \n * @deprecated Use valueDisplayMode instead\n * Show axis labels (will be converted to valueDisplayMode)\n */\n showAxisLabels?: boolean;\n /**\n * Display mode for X,Y coordinate values (default: 'disabled')\n * - 'disabled': Never show coordinate values\n * - 'corner': Show values in a fixed corner position\n * - 'floating': Show values next to the cursor (axis labels)\n */\n valueDisplayMode?: CrosshairValueMode;\n /**\n * Corner position when valueDisplayMode is 'corner' (default: 'top-left')\n */\n cornerPosition?: CornerPosition;\n /** Snap to nearest data point (default: false) */\n snapToData?: boolean;\n /** Value format options */\n valueFormat?: {\n /** X value precision (default: 4) */\n xPrecision?: number;\n /** Y value precision (default: 4) */\n yPrecision?: number;\n };\n}\n\nconst crosshairManifest: PluginManifest = {\n name: \"crosshair\",\n version: \"1.0.0\",\n description: \"Interactive crosshair that follows mouse cursor\",\n provides: [\"interaction\", \"visualization\"],\n tags: [\"cursor\", \"crosshair\", \"tooltip\"],\n};\n\nexport const CrosshairPlugin = definePlugin<CrosshairPluginConfig>(\n crosshairManifest,\n (config = {}) => {\n const {\n showVertical = true,\n showHorizontal = true,\n color,\n lineStyle = \"dashed\",\n lineWidth = 1,\n snapToData = false,\n valueFormat = { xPrecision: 4, yPrecision: 4 },\n } = config;\n\n // Handle deprecated showAxisLabels -> convert to valueDisplayMode\n let valueDisplayMode: CrosshairValueMode = config.valueDisplayMode ?? 'disabled';\n if (config.showAxisLabels !== undefined && config.valueDisplayMode === undefined) {\n valueDisplayMode = config.showAxisLabels ? 'floating' : 'disabled';\n }\n const cornerPosition: CornerPosition = config.cornerPosition ?? 'top-left';\n\n let cursorX = -1;\n let cursorY = -1;\n let overlayId: string;\n let canvas: HTMLCanvasElement | null = null;\n let ctx: CanvasRenderingContext2D | null = null;\n\n return {\n onInit(pluginCtx: PluginContext) {\n overlayId = \"crosshair-overlay\";\n const overlay = pluginCtx.ui.createOverlay(overlayId, {\n zIndex: 500,\n position: { top: \"0\", left: \"0\", right: \"0\", bottom: \"0\" },\n });\n\n canvas = document.createElement(\"canvas\");\n canvas.style.cssText = \"width: 100%; height: 100%;\";\n overlay.appendChild(canvas);\n\n ctx = canvas.getContext(\"2d\");\n resizeCanvas(pluginCtx);\n },\n\n onDestroy(pluginCtx: PluginContext) {\n pluginCtx.ui.removeOverlay(overlayId);\n canvas = null;\n ctx = null;\n },\n\n onResize(pluginCtx: PluginContext) {\n resizeCanvas(pluginCtx);\n },\n\n onInteraction(pluginCtx: PluginContext, event: InteractionEvent) {\n if (event.type === \"mousemove\") {\n cursorX = event.pixelX;\n cursorY = event.pixelY;\n\n if (snapToData && event.inPlotArea) {\n const nearest = pluginCtx.coords.pickPoint(cursorX, cursorY);\n if (nearest) {\n cursorX = nearest.pixelX;\n cursorY = nearest.pixelY;\n }\n }\n\n render(pluginCtx);\n }\n },\n\n onViewChange() {\n // Re-render on zoom/pan\n if (cursorX >= 0 && cursorY >= 0) {\n // Will be re-rendered on next frame\n }\n },\n };\n\n function resizeCanvas(pluginCtx: PluginContext) {\n if (!canvas || !ctx) return;\n const size = pluginCtx.render.canvasSize;\n const dpr = pluginCtx.render.pixelRatio;\n canvas.width = size.width * dpr;\n canvas.height = size.height * dpr;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.scale(dpr, dpr);\n }\n\n function render(pluginCtx: PluginContext) {\n if (!ctx || !canvas) return;\n\n const { width, height } = pluginCtx.render.canvasSize;\n ctx.clearRect(0, 0, width, height);\n\n if (cursorX < 0 || cursorY < 0) return;\n\n const plotArea = pluginCtx.render.plotArea;\n if (\n cursorX < plotArea.x ||\n cursorX > plotArea.x + plotArea.width ||\n cursorY < plotArea.y ||\n cursorY > plotArea.y + plotArea.height\n ) {\n return;\n }\n\n const lineColor = color || (pluginCtx.ui.theme.cursor as unknown as Record<string, unknown>)?.color as string || \"#888888\";\n\n ctx.save();\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n\n if (lineStyle === \"dashed\") {\n ctx.setLineDash([6, 4]);\n } else if (lineStyle === \"dotted\") {\n ctx.setLineDash([2, 2]);\n }\n\n // Vertical line\n if (showVertical) {\n ctx.beginPath();\n ctx.moveTo(cursorX, plotArea.y);\n ctx.lineTo(cursorX, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n\n // Horizontal line\n if (showHorizontal) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, cursorY);\n ctx.lineTo(plotArea.x + plotArea.width, cursorY);\n ctx.stroke();\n }\n\n ctx.restore();\n\n // Value display based on mode\n if (valueDisplayMode === 'floating') {\n drawFloatingLabels(pluginCtx, ctx, cursorX, cursorY, lineColor);\n } else if (valueDisplayMode === 'corner') {\n drawCornerLabels(pluginCtx, ctx, cursorX, cursorY, lineColor);\n }\n // 'disabled' mode: don't draw any labels\n }\n\n function drawFloatingLabels(\n pluginCtx: PluginContext,\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n bgColor: string\n ) {\n const dataX = pluginCtx.coords.pixelToDataX(x);\n const dataY = pluginCtx.coords.pixelToDataY(y);\n const plotArea = pluginCtx.render.plotArea;\n\n ctx.save();\n ctx.font = \"11px system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n\n // X axis label\n const xText = dataX.toPrecision(valueFormat.xPrecision);\n const xMetrics = ctx.measureText(xText);\n const xLabelWidth = xMetrics.width + 8;\n const xLabelHeight = 18;\n const xLabelX = x - xLabelWidth / 2;\n const xLabelY = plotArea.y + plotArea.height + 2;\n\n ctx.fillStyle = bgColor;\n ctx.fillRect(xLabelX, xLabelY, xLabelWidth, xLabelHeight);\n ctx.fillStyle = \"#ffffff\";\n ctx.fillText(xText, x, xLabelY + 3);\n\n // Y axis label\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n const yText = dataY.toPrecision(valueFormat.yPrecision);\n const yMetrics = ctx.measureText(yText);\n const yLabelWidth = yMetrics.width + 8;\n const yLabelHeight = 18;\n const yLabelX = plotArea.x - yLabelWidth - 2;\n const yLabelY = y - yLabelHeight / 2;\n\n ctx.fillStyle = bgColor;\n ctx.fillRect(yLabelX, yLabelY, yLabelWidth, yLabelHeight);\n ctx.fillStyle = \"#ffffff\";\n ctx.fillText(yText, plotArea.x - 6, y);\n\n ctx.restore();\n }\n\n function drawCornerLabels(\n pluginCtx: PluginContext,\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n bgColor: string\n ) {\n const dataX = pluginCtx.coords.pixelToDataX(x);\n const dataY = pluginCtx.coords.pixelToDataY(y);\n const plotArea = pluginCtx.render.plotArea;\n\n ctx.save();\n ctx.font = \"11px system-ui, sans-serif\";\n\n const xText = `X: ${dataX.toPrecision(valueFormat.xPrecision)}`;\n const yText = `Y: ${dataY.toPrecision(valueFormat.yPrecision)}`;\n\n const xMetrics = ctx.measureText(xText);\n const yMetrics = ctx.measureText(yText);\n const maxWidth = Math.max(xMetrics.width, yMetrics.width);\n const padding = 6;\n const lineHeight = 16;\n const boxWidth = maxWidth + padding * 2;\n const boxHeight = lineHeight * 2 + padding * 2;\n\n // Determine corner position\n let boxX: number;\n let boxY: number;\n\n switch (cornerPosition) {\n case 'top-left':\n boxX = plotArea.x + 8;\n boxY = plotArea.y + 8;\n break;\n case 'top-right':\n boxX = plotArea.x + plotArea.width - boxWidth - 8;\n boxY = plotArea.y + 8;\n break;\n case 'bottom-left':\n boxX = plotArea.x + 8;\n boxY = plotArea.y + plotArea.height - boxHeight - 8;\n break;\n case 'bottom-right':\n boxX = plotArea.x + plotArea.width - boxWidth - 8;\n boxY = plotArea.y + plotArea.height - boxHeight - 8;\n break;\n default:\n boxX = plotArea.x + 8;\n boxY = plotArea.y + 8;\n }\n\n // Draw background\n ctx.fillStyle = bgColor;\n ctx.globalAlpha = 0.85;\n ctx.fillRect(boxX, boxY, boxWidth, boxHeight);\n ctx.globalAlpha = 1.0;\n\n // Draw border\n ctx.strokeStyle = \"rgba(255,255,255,0.3)\";\n ctx.lineWidth = 1;\n ctx.strokeRect(boxX, boxY, boxWidth, boxHeight);\n\n // Draw text\n ctx.fillStyle = \"#ffffff\";\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillText(xText, boxX + padding, boxY + padding);\n ctx.fillText(yText, boxX + padding, boxY + padding + lineHeight);\n\n ctx.restore();\n }\n }\n);\n\n","import type {\n PluginContext,\n PluginManifest,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface StatsPluginConfig {\n /** Position of the stats overlay */\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Which stats to show */\n show?: Array<\"count\" | \"mean\" | \"min\" | \"max\" | \"std\" | \"range\">;\n /** Series ID to compute stats for (default: all) */\n seriesId?: string;\n /** Update on every data change (default: true) */\n autoUpdate?: boolean;\n}\n\nconst statsManifest: PluginManifest = {\n name: \"statistics-overlay\",\n version: \"1.0.0\",\n description: \"Displays real-time statistics for chart data\",\n provides: [\"visualization\", \"analysis\"],\n tags: [\"statistics\", \"overlay\", \"analytics\"],\n};\n\nexport const StatsPlugin = definePlugin<StatsPluginConfig>(\n statsManifest,\n (config = {}) => {\n const {\n position = \"top-right\",\n show = [\"count\", \"mean\", \"min\", \"max\"],\n seriesId,\n autoUpdate = true,\n } = config;\n\n let overlayId: string;\n let container: HTMLDivElement | null = null;\n\n return {\n onInit(ctx: PluginContext) {\n overlayId = \"stats-overlay\";\n const posStyle: Record<string, string> = {};\n\n if (position.includes(\"top\")) posStyle.top = \"10px\";\n if (position.includes(\"bottom\")) posStyle.bottom = \"10px\";\n if (position.includes(\"left\")) posStyle.left = \"10px\";\n if (position.includes(\"right\")) posStyle.right = \"10px\";\n\n container = ctx.ui.createOverlay(overlayId, {\n zIndex: 800,\n position: posStyle,\n pointerEvents: false,\n });\n\n container.innerHTML = `\n <div style=\"\n background: rgba(0, 0, 0, 0.85);\n color: #fff;\n padding: 10px 14px;\n border-radius: 6px;\n font-family: ui-monospace, monospace;\n font-size: 12px;\n line-height: 1.6;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n \">\n <div style=\"font-weight: bold; margin-bottom: 4px; color: #4ade80;\">📊 Statistics</div>\n <div class=\"stats-content\"></div>\n </div>\n `;\n\n updateStats(ctx);\n },\n\n onDestroy(ctx: PluginContext) {\n ctx.ui.removeOverlay(overlayId);\n container = null;\n },\n\n onDataUpdate(ctx: PluginContext) {\n if (autoUpdate) {\n updateStats(ctx);\n }\n },\n\n onSeriesAdd(ctx: PluginContext) {\n updateStats(ctx);\n },\n\n onSeriesRemove(ctx: PluginContext) {\n updateStats(ctx);\n },\n\n api: {\n refresh(ctx: PluginContext) {\n updateStats(ctx);\n },\n },\n };\n\n function updateStats(ctx: PluginContext) {\n if (!container) return;\n\n const content = container.querySelector(\".stats-content\");\n if (!content) return;\n\n const allSeries = ctx.data.getAllSeries();\n const targetSeries = seriesId\n ? allSeries.filter((s) => s.getId() === seriesId)\n : allSeries;\n\n if (targetSeries.length === 0) {\n content.innerHTML = \"<div style='color: #888'>No data</div>\";\n return;\n }\n\n // Aggregate all Y data\n let allY: number[] = [];\n targetSeries.forEach((series) => {\n const data = series.getData();\n if (data?.y) {\n allY = allY.concat(Array.from(data.y));\n }\n });\n\n if (allY.length === 0) {\n content.innerHTML = \"<div style='color: #888'>No data</div>\";\n return;\n }\n\n const stats = computeStats(allY);\n const lines: string[] = [];\n\n if (show.includes(\"count\")) {\n lines.push(`<div>N: <span style=\"color: #60a5fa\">${stats.count.toLocaleString()}</span></div>`);\n }\n if (show.includes(\"mean\")) {\n lines.push(`<div>μ: <span style=\"color: #60a5fa\">${stats.mean.toPrecision(4)}</span></div>`);\n }\n if (show.includes(\"min\")) {\n lines.push(`<div>Min: <span style=\"color: #60a5fa\">${stats.min.toPrecision(4)}</span></div>`);\n }\n if (show.includes(\"max\")) {\n lines.push(`<div>Max: <span style=\"color: #60a5fa\">${stats.max.toPrecision(4)}</span></div>`);\n }\n if (show.includes(\"std\")) {\n lines.push(`<div>σ: <span style=\"color: #60a5fa\">${stats.std.toPrecision(4)}</span></div>`);\n }\n if (show.includes(\"range\")) {\n lines.push(`<div>Range: <span style=\"color: #60a5fa\">${stats.range.toPrecision(4)}</span></div>`);\n }\n\n content.innerHTML = lines.join(\"\");\n }\n\n function computeStats(values: number[]) {\n const n = values.length;\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n\n for (const v of values) {\n sum += v;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n\n const mean = sum / n;\n\n let sumSq = 0;\n for (const v of values) {\n sumSq += (v - mean) ** 2;\n }\n const std = Math.sqrt(sumSq / n);\n\n return {\n count: n,\n mean,\n min,\n max,\n std,\n range: max - min,\n };\n }\n }\n);\n","import type {\n PluginContext,\n PluginManifest,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface WatermarkPluginConfig {\n /** Watermark text */\n text: string;\n /** Font size (default: 48) */\n fontSize?: number;\n /** Font family (default: system-ui) */\n fontFamily?: string;\n /** Text color with opacity (default: rgba(128,128,128,0.15)) */\n color?: string;\n /** Position (default: center) */\n position?: \"center\" | \"bottom-right\" | \"bottom-left\";\n /** Rotation in degrees (default: -30 for center, 0 for corners) */\n rotation?: number;\n}\n\nconst watermarkManifest: PluginManifest = {\n name: \"watermark\",\n version: \"1.0.0\",\n description: \"Adds a customizable watermark to the chart\",\n provides: [\"visualization\"],\n tags: [\"watermark\", \"branding\", \"overlay\"],\n};\n\nexport const WatermarkPlugin = definePlugin<WatermarkPluginConfig>(\n watermarkManifest,\n (config) => {\n if (!config?.text) {\n throw new Error(\"WatermarkPlugin requires 'text' configuration\");\n }\n\n const {\n text,\n fontSize = 48,\n fontFamily = \"system-ui, sans-serif\",\n color = \"rgba(128, 128, 128, 0.15)\",\n position = \"center\",\n rotation = position === \"center\" ? -30 : 0,\n } = config;\n\n return {\n onRenderOverlay(ctx: PluginContext) {\n const ctx2d = ctx.render.ctx2d;\n if (!ctx2d) return;\n\n // width/height available for future use\n void ctx.render.canvasSize;\n const plotArea = ctx.render.plotArea;\n\n ctx2d.save();\n ctx2d.font = `${fontSize}px ${fontFamily}`;\n ctx2d.fillStyle = color;\n ctx2d.textAlign = \"center\";\n ctx2d.textBaseline = \"middle\";\n\n let x: number, y: number;\n\n if (position === \"center\") {\n x = plotArea.x + plotArea.width / 2;\n y = plotArea.y + plotArea.height / 2;\n } else if (position === \"bottom-right\") {\n x = plotArea.x + plotArea.width - fontSize;\n y = plotArea.y + plotArea.height - fontSize / 2;\n } else {\n x = plotArea.x + fontSize;\n y = plotArea.y + plotArea.height - fontSize / 2;\n }\n\n ctx2d.translate(x, y);\n ctx2d.rotate((rotation * Math.PI) / 180);\n ctx2d.fillText(text, 0, 0);\n ctx2d.restore();\n },\n };\n }\n);\n","import type {\n PluginContext,\n PluginManifest,\n AfterRenderEvent,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface GridHighlightConfig {\n /** Highlight intervals on X axis */\n xIntervals?: Array<{ start: number; end: number; color: string }>;\n /** Highlight intervals on Y axis */\n yIntervals?: Array<{ start: number; end: number; color: string }>;\n /** Opacity for highlight regions (default: 0.1) */\n opacity?: number;\n}\n\nconst gridHighlightManifest: PluginManifest = {\n name: \"grid-highlight\",\n version: \"1.0.0\",\n description: \"Highlights specific regions of the chart grid\",\n provides: [\"visualization\"],\n tags: [\"grid\", \"highlight\", \"regions\"],\n};\n\nexport const GridHighlightPlugin = definePlugin<GridHighlightConfig>(\n gridHighlightManifest,\n (config = {}) => {\n const { xIntervals = [], yIntervals = [], opacity = 0.1 } = config;\n\n return {\n onRenderOverlay(ctx: PluginContext, _event: AfterRenderEvent) {\n const ctx2d = ctx.render.ctx2d;\n if (!ctx2d) return;\n\n const plotArea = ctx.render.plotArea;\n // bounds available if needed for future features\n void ctx.data.getViewBounds();\n\n ctx2d.save();\n\n // Clip to plot area\n ctx2d.beginPath();\n ctx2d.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx2d.clip();\n\n ctx2d.globalAlpha = opacity;\n\n // Draw X intervals (vertical bands)\n for (const interval of xIntervals) {\n const x1 = ctx.coords.dataToPixelX(interval.start);\n const x2 = ctx.coords.dataToPixelX(interval.end);\n\n ctx2d.fillStyle = interval.color;\n ctx2d.fillRect(\n Math.min(x1, x2),\n plotArea.y,\n Math.abs(x2 - x1),\n plotArea.height\n );\n }\n\n // Draw Y intervals (horizontal bands)\n for (const interval of yIntervals) {\n const y1 = ctx.coords.dataToPixelY(interval.start);\n const y2 = ctx.coords.dataToPixelY(interval.end);\n\n ctx2d.fillStyle = interval.color;\n ctx2d.fillRect(\n plotArea.x,\n Math.min(y1, y2),\n plotArea.width,\n Math.abs(y2 - y1)\n );\n }\n\n ctx2d.restore();\n },\n };\n }\n);\n","import type {\n PluginContext,\n PluginManifest,\n DataUpdateEvent,\n ViewChangeEvent,\n InteractionEvent,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface DataLoggerConfig {\n /** Log data updates (default: true) */\n logDataUpdates?: boolean;\n /** Log view changes (default: true) */\n logViewChanges?: boolean;\n /** Log interactions (default: false) */\n logInteractions?: boolean;\n /** Maximum log entries to keep (default: 100) */\n maxEntries?: number;\n}\n\nconst dataLoggerManifest: PluginManifest = {\n name: \"data-logger\",\n version: \"1.0.0\",\n description: \"Logs chart events for debugging and analysis\",\n provides: [\"analysis\"],\n tags: [\"debug\", \"logging\", \"events\"],\n};\n\nexport const DataLoggerPlugin = definePlugin<DataLoggerConfig>(\n dataLoggerManifest,\n (config = {}) => {\n const {\n logDataUpdates = true,\n logViewChanges = true,\n logInteractions = false,\n maxEntries = 100,\n } = config;\n\n interface LogEntry {\n timestamp: number;\n type: string;\n data: unknown;\n }\n\n const entries: LogEntry[] = [];\n\n function addEntry(type: string, data: unknown) {\n entries.push({\n timestamp: Date.now(),\n type,\n data,\n });\n\n if (entries.length > maxEntries) {\n entries.shift();\n }\n }\n\n return {\n onInit(ctx: PluginContext) {\n ctx.log.info(\"Data logger initialized\");\n },\n\n onDataUpdate(ctx: PluginContext, event: DataUpdateEvent) {\n if (logDataUpdates) {\n addEntry(\"dataUpdate\", {\n seriesId: event.seriesId,\n mode: event.mode,\n pointCount: event.pointCount,\n });\n ctx.log.debug(`Data update: ${event.seriesId} (${event.mode}, ${event.pointCount} points)`);\n }\n },\n\n onViewChange(ctx: PluginContext, event: ViewChangeEvent) {\n if (logViewChanges) {\n addEntry(\"viewChange\", {\n trigger: event.trigger,\n bounds: event.current,\n });\n ctx.log.debug(`View change: ${event.trigger}`);\n }\n },\n\n onInteraction(_ctx: PluginContext, event: InteractionEvent) {\n if (logInteractions) {\n addEntry(\"interaction\", {\n type: event.type,\n pixelX: event.pixelX,\n pixelY: event.pixelY,\n inPlotArea: event.inPlotArea,\n });\n }\n },\n\n onSerialize(_ctx: PluginContext) {\n return { entries };\n },\n\n onDeserialize(_ctx: PluginContext, data: unknown) {\n const saved = data as { entries?: LogEntry[] };\n if (saved?.entries) {\n entries.length = 0;\n entries.push(...saved.entries);\n }\n },\n\n api: {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n export() {\n return JSON.stringify(entries, null, 2);\n },\n },\n };\n }\n);\n","import type {\n PluginContext,\n PluginManifest,\n} from \"../../types\";\nimport { definePlugin } from \"../../PluginRegistry\";\n\nexport interface DirectionIndicatorConfig {\n /** Series ID to track (if not specified, tracks the first series) */\n seriesId?: string;\n /** Number of recent points to analyze for direction (default: 20) */\n sampleSize?: number;\n /** Arrow color (default: from theme) */\n color?: string;\n /** Arrow size in pixels (default: 40) */\n size?: number;\n /** Minimum velocity to show arrow (default: 0.01) */\n minVelocity?: number;\n /** Number of points for smoothing the position/angle (default: 20) */\n historySize?: number;\n /** Hide arrow if no new points are received for this duration in ms (default: undefined/disabled) */\n idleTimeout?: number;\n}\n\ninterface DirectionData {\n angle: number; // Continuous angle in radians\n magnitude: number; // Normalized magnitude 0-1\n lastX: number; // Last data point X coordinate (data space)\n lastY: number; // Last data point Y coordinate (data space)\n smoothX: number; // Smoothed X position (pixel space)\n smoothY: number; // Smoothed Y position (pixel space)\n}\n\nconst directionIndicatorManifest: PluginManifest = {\n name: \"direction-indicator\",\n version: \"1.0.0\",\n description: \"Shows an arrow indicating the direction and trend of streaming data\",\n provides: [\"visualization\", \"analysis\"],\n tags: [\"streaming\", \"direction\", \"trend\", \"arrow\"],\n};\n\nexport const DirectionIndicatorPlugin = definePlugin<DirectionIndicatorConfig>(\n directionIndicatorManifest,\n (config = {}) => {\n const {\n seriesId,\n sampleSize = 20,\n color,\n size = 40,\n minVelocity = 0.01,\n historySize = 20,\n idleTimeout,\n } = config;\n\n let overlayId: string;\n let canvas: HTMLCanvasElement | null = null;\n let ctx: CanvasRenderingContext2D | null = null;\n let currentDirection: DirectionData | null = null;\n let targetSeriesId: string | null = null;\n \n // Smoothing buffers (moving average to reduce jitter)\n const positionHistoryX: number[] = [];\n const positionHistoryY: number[] = [];\n const angleHistory: number[] = [];\n\n let maxHistorySize = historySize;\n let timeoutTimer: any = null;\n let lastPointTimestamp = Date.now();\n let lastSeenX = -Infinity;\n let lastSeenY = -Infinity;\n let currentIdleTimeout = idleTimeout;\n\n return {\n onInit(pluginCtx: PluginContext) {\n overlayId = \"direction-indicator-overlay\";\n const overlay = pluginCtx.ui.createOverlay(overlayId, {\n zIndex: 600,\n position: { top: \"0\", left: \"0\", right: \"0\", bottom: \"0\" },\n pointerEvents: false,\n });\n\n canvas = document.createElement(\"canvas\");\n canvas.style.cssText = \"width: 100%; height: 100%; pointer-events: none;\";\n overlay.appendChild(canvas);\n\n ctx = canvas.getContext(\"2d\");\n resizeCanvas(pluginCtx);\n\n // Determine which series to track\n if (seriesId) {\n targetSeriesId = seriesId;\n } else {\n const allSeries = pluginCtx.data.getAllSeries();\n if (allSeries.length > 0) {\n targetSeriesId = allSeries[0].getId();\n }\n }\n },\n\n onDestroy(pluginCtx: PluginContext) {\n pluginCtx.ui.removeOverlay(overlayId);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n canvas = null;\n ctx = null;\n currentDirection = null;\n },\n\n onResize(pluginCtx: PluginContext) {\n resizeCanvas(pluginCtx);\n },\n\n onAfterRender(pluginCtx: PluginContext) {\n // Update direction every frame for smooth rendering\n updateDirection(pluginCtx);\n render(pluginCtx);\n\n // Ensure we render again when the idle timeout expires to hide the arrow\n if (currentIdleTimeout) {\n if (timeoutTimer) clearTimeout(timeoutTimer);\n const age = Date.now() - lastPointTimestamp;\n if (age < currentIdleTimeout) {\n timeoutTimer = setTimeout(() => {\n pluginCtx.requestRender();\n }, currentIdleTimeout - age + 10);\n }\n }\n },\n\n onConfigChange(_pluginCtx: PluginContext, newConfig: DirectionIndicatorConfig) {\n if (newConfig.historySize !== undefined) {\n maxHistorySize = newConfig.historySize;\n // Reset history buffers if size changes significantly or just trim/expand? \n // Simpler to just let them adjust over time or trim if needed.\n // If we want immediate effect, we might want to trim if smaller.\n while (positionHistoryX.length > maxHistorySize) positionHistoryX.shift();\n while (positionHistoryY.length > maxHistorySize) positionHistoryY.shift();\n while (angleHistory.length > maxHistorySize) angleHistory.shift();\n }\n\n if (newConfig.idleTimeout !== undefined) {\n currentIdleTimeout = newConfig.idleTimeout;\n }\n }\n };\n\n function resizeCanvas(pluginCtx: PluginContext) {\n if (!canvas || !ctx) return;\n const canvasSize = pluginCtx.render.canvasSize;\n const dpr = pluginCtx.render.pixelRatio;\n canvas.width = canvasSize.width * dpr;\n canvas.height = canvasSize.height * dpr;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.scale(dpr, dpr);\n }\n\n function updateDirection(pluginCtx: PluginContext) {\n if (!targetSeriesId) return;\n\n const series = pluginCtx.data.getSeries(targetSeriesId);\n if (!series) return;\n\n const data = pluginCtx.data.getSeriesData(targetSeriesId);\n if (!data || !data.x || !data.y) return;\n\n const totalPoints = data.x.length;\n if (totalPoints < 2) return;\n\n // Get last point coordinates in data space\n const lastX = data.x[totalPoints - 1];\n const lastY = data.y[totalPoints - 1];\n\n // Detect if this is a new point\n if (lastX !== lastSeenX || lastY !== lastSeenY) {\n lastSeenX = lastX;\n lastSeenY = lastY;\n lastPointTimestamp = Date.now();\n }\n\n // Get last N points for direction calculation\n const n = Math.min(sampleSize, totalPoints);\n const startIdx = totalPoints - n;\n\n // Calculate direction using linear regression on recent points IN PIXEL SPACE\n let sumT = 0, sumPX = 0, sumPY = 0, sumTPX = 0, sumTPY = 0, sumTT = 0;\n\n for (let i = startIdx; i < totalPoints; i++) {\n const t = i - startIdx; // Time index\n const dataX = data.x[i];\n const dataY = data.y[i];\n \n // Convert to pixel coordinates\n const pixelX = pluginCtx.coords.dataToPixelX(dataX);\n const pixelY = pluginCtx.coords.dataToPixelY(dataY);\n\n sumT += t;\n sumPX += pixelX;\n sumPY += pixelY;\n sumTPX += t * pixelX;\n sumTPY += t * pixelY;\n sumTT += t * t;\n }\n\n const meanT = sumT / n;\n const meanPX = sumPX / n;\n const meanPY = sumPY / n;\n\n // Calculate slopes in pixel space (dpx/dt and dpy/dt)\n const denominator = sumTT - n * meanT * meanT;\n if (Math.abs(denominator) < 1e-10) return; // Avoid division by zero\n \n const slopePX = (sumTPX - n * meanT * meanPX) / denominator;\n const slopePY = (sumTPY - n * meanT * meanPY) / denominator;\n\n // Calculate continuous angle in pixel space (canvas coordinates)\n const rawAngle = Math.atan2(slopePY, slopePX);\n \n // Convert last point to pixel coordinates\n const lastPixelX = pluginCtx.coords.dataToPixelX(lastX);\n const lastPixelY = pluginCtx.coords.dataToPixelY(lastY);\n \n // Add to position history for smoothing\n positionHistoryX.push(lastPixelX);\n positionHistoryY.push(lastPixelY);\n if (positionHistoryX.length > maxHistorySize) {\n positionHistoryX.shift();\n positionHistoryY.shift();\n }\n \n // Add to angle history for smoothing\n angleHistory.push(rawAngle);\n if (angleHistory.length > maxHistorySize) {\n angleHistory.shift();\n }\n \n // Apply moving average to smooth position and angle\n const smoothX = average(positionHistoryX);\n const smoothY = average(positionHistoryY);\n const smoothedAngle = smoothAngle(angleHistory);\n \n // Calculate magnitude in pixel space\n const magnitude = Math.sqrt(slopePX * slopePX + slopePY * slopePY);\n\n currentDirection = { angle: smoothedAngle, magnitude, lastX, lastY, smoothX, smoothY };\n }\n \n function average(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((sum, val) => sum + val, 0) / values.length;\n }\n \n function smoothAngle(angles: number[]): number {\n if (angles.length === 0) return 0;\n \n // Convert angles to unit vectors to handle wraparound correctly\n let sumX = 0;\n let sumY = 0;\n \n for (const angle of angles) {\n sumX += Math.cos(angle);\n sumY += Math.sin(angle);\n }\n \n // Average the vectors and convert back to angle\n return Math.atan2(sumY / angles.length, sumX / angles.length);\n }\n\n function render(pluginCtx: PluginContext) {\n if (!ctx || !canvas || !currentDirection) return;\n\n const { width, height } = pluginCtx.render.canvasSize;\n ctx.clearRect(0, 0, width, height);\n\n // Check for idle timeout\n if (currentIdleTimeout !== undefined) {\n const age = Date.now() - lastPointTimestamp;\n if (age > currentIdleTimeout) return;\n }\n\n if (currentDirection.magnitude < minVelocity) return;\n\n // Use smoothed position for fluid movement\n const smoothX = currentDirection.smoothX;\n const smoothY = currentDirection.smoothY;\n\n const arrowColor = color || \"#FF9800\";\n \n ctx.save();\n\n // Draw arrow at smoothed position with smoothed angle\n drawArrow(ctx, smoothX, smoothY, currentDirection.angle, size, arrowColor);\n\n ctx.restore();\n }\n\n function drawArrow(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n angle: number,\n length: number,\n color: string\n ) {\n // Triangle dimensions (only the arrow head)\n const triangleHeight = length * 0.6;\n const triangleWidth = length * 0.4;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(angle);\n\n // Draw filled triangle pointing in the direction of movement\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(triangleHeight / 2, 0); // Tip of the triangle\n ctx.lineTo(-triangleHeight / 2, -triangleWidth / 2); // Bottom left\n ctx.lineTo(-triangleHeight / 2, triangleWidth / 2); // Bottom right\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n }\n }\n);\n","/**\n * Sci Plot - Built-in Plugins\n * \n * Collection of official plugins that demonstrate the plugin system\n * capabilities and provide common functionality.\n * \n * @module plugins/builtins\n */\n\nexport * from \"./crosshair\";\nexport * from \"./stats\";\nexport * from \"./watermark\";\nexport * from \"./grid-highlight\";\nexport * from \"./data-logger\";\nexport * from \"./direction-indicator\";\n\nimport { CrosshairPlugin } from \"./crosshair\";\nimport { StatsPlugin } from \"./stats\";\nimport { WatermarkPlugin } from \"./watermark\";\nimport { GridHighlightPlugin } from \"./grid-highlight\";\nimport { DataLoggerPlugin } from \"./data-logger\";\nimport { DirectionIndicatorPlugin } from \"./direction-indicator\";\n\n/**\n * Plugin collection for easy registration\n */\nexport const BuiltinPlugins = {\n Crosshair: CrosshairPlugin,\n Statistics: StatsPlugin,\n Watermark: WatermarkPlugin,\n GridHighlight: GridHighlightPlugin,\n DataLogger: DataLoggerPlugin,\n DirectionIndicator: DirectionIndicatorPlugin,\n};\n","/**\n * @fileoverview Drag & Drop editing plugin for interactive point manipulation\n * @module plugins/drag-edit\n */\n\nimport type {\n PluginDragEditConfig,\n DragEditAPI,\n DraggedPoint,\n DragEditEvent,\n DragConstraint,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-drag-edit',\n version: '1.0.0',\n description: 'Interactive drag & drop editing of data points',\n provides: ['drag-edit', 'point-editing'],\n tags: ['interaction', 'editing', 'ux'],\n};\n\nconst DEFAULT_CONFIG: Required<PluginDragEditConfig> = {\n enabled: true,\n constraint: 'both',\n snapToGrid: false,\n snapIntervalX: 1,\n snapIntervalY: 1,\n dragThreshold: 5,\n hitRadius: 10,\n editableSeries: [],\n validator: () => ({ valid: true }),\n onDragStart: () => {},\n onDrag: () => {},\n onDragEnd: () => {},\n highlightColor: '#ffff00',\n showPreview: true,\n previewStyle: {\n color: '#ffffff',\n width: 2,\n dash: [5, 5],\n opacity: 0.5,\n },\n};\n\nexport function PluginDragEdit(\n userConfig: Partial<PluginDragEditConfig> = {}\n): ChartPlugin<PluginDragEditConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n \n // Drag state\n let isDragging = false;\n let draggedPoint: DraggedPoint | null = null;\n let dragStartX = 0;\n let dragStartY = 0;\n let hasMoved = false;\n\n /**\n * Find nearest point to mouse position\n */\n function findNearestPoint(mouseX: number, mouseY: number): DraggedPoint | null {\n if (!ctx) return null;\n\n // Use built-in pick functionality\n const picked = ctx.coords.pickPoint(mouseX, mouseY, config.hitRadius);\n \n if (!picked) return null;\n\n // Check if series is editable\n if (config.editableSeries.length > 0 && !config.editableSeries.includes(picked.seriesId)) {\n return null;\n }\n\n return {\n seriesId: picked.seriesId,\n index: picked.index,\n originalX: picked.x,\n originalY: picked.y,\n currentX: picked.x,\n currentY: picked.y,\n };\n }\n\n /**\n * Convert pixel coordinates to data coordinates\n */\n function pixelToData(pixelX: number, pixelY: number): { x: number; y: number } {\n if (!ctx) return { x: 0, y: 0 };\n\n return {\n x: ctx.coords.pixelToDataX(pixelX),\n y: ctx.coords.pixelToDataY(pixelY),\n };\n }\n\n /**\n * Snap value to grid\n */\n function snapToGrid(value: number, interval: number): number {\n return Math.round(value / interval) * interval;\n }\n\n /**\n * Apply drag constraints\n */\n function applyConstraints(\n newX: number,\n newY: number,\n constraint: DragConstraint\n ): { x: number; y: number } {\n if (!draggedPoint) return { x: newX, y: newY };\n\n switch (constraint) {\n case 'x':\n return { x: newX, y: draggedPoint.originalY };\n case 'y':\n return { x: draggedPoint.originalX, y: newY };\n case 'none':\n return { x: draggedPoint.originalX, y: draggedPoint.originalY };\n default:\n return { x: newX, y: newY };\n }\n }\n\n /**\n * Validate and apply snapping\n */\n function validateAndSnap(x: number, y: number): { x: number; y: number; valid: boolean } {\n let finalX = x;\n let finalY = y;\n\n // Apply snapping\n if (config.snapToGrid) {\n finalX = snapToGrid(x, config.snapIntervalX);\n finalY = snapToGrid(y, config.snapIntervalY);\n }\n\n // Run custom validation\n if (draggedPoint && config.validator) {\n const tempPoint: DraggedPoint = { ...draggedPoint, currentX: finalX, currentY: finalY };\n const validation = config.validator(tempPoint);\n\n if (typeof validation === 'boolean') {\n return { x: finalX, y: finalY, valid: validation };\n }\n\n if (!validation.valid) {\n return { x: finalX, y: finalY, valid: false };\n }\n\n // Apply snap suggestions from validator\n if (validation.snapX !== undefined) finalX = validation.snapX;\n if (validation.snapY !== undefined) finalY = validation.snapY;\n }\n\n return { x: finalX, y: finalY, valid: true };\n }\n\n /**\n * Update point data\n */\n function updatePointData(seriesId: string, index: number, newX: number, newY: number): void {\n if (!ctx) return;\n\n const series = (ctx.chart as any).getSeries?.(seriesId);\n if (!series) return;\n\n const data = series.getData();\n if (!data || !data.x || !data.y) return;\n\n // Update the data arrays\n data.x[index] = newX;\n data.y[index] = newY;\n\n // Invalidate buffers to trigger GPU upload\n series.invalidateBuffers?.();\n\n // Trigger chart re-render\n ctx.requestRender();\n }\n\n /**\n * Create drag event\n */\n function createDragEvent(): DragEditEvent | null {\n if (!draggedPoint) return null;\n\n return {\n seriesId: draggedPoint.seriesId,\n index: draggedPoint.index,\n oldX: draggedPoint.originalX,\n oldY: draggedPoint.originalY,\n newX: draggedPoint.currentX,\n newY: draggedPoint.currentY,\n deltaX: draggedPoint.currentX - draggedPoint.originalX,\n deltaY: draggedPoint.currentY - draggedPoint.originalY,\n };\n }\n\n /**\n * Draw preview overlay\n */\n function drawPreview(pCtx: PluginContext): void {\n if (!isDragging || !draggedPoint || !config.showPreview) return;\n\n const { render, coords } = pCtx;\n const { ctx2d } = render;\n if (!ctx2d) return;\n\n ctx2d.save();\n\n // Convert data coordinates to pixel coordinates\n const origPixelX = coords.dataToPixelX(draggedPoint.originalX);\n const origPixelY = coords.dataToPixelY(draggedPoint.originalY);\n \n const currPixelX = coords.dataToPixelX(draggedPoint.currentX);\n const currPixelY = coords.dataToPixelY(draggedPoint.currentY);\n\n // Draw preview line from original to current position\n ctx2d.strokeStyle = config.previewStyle.color || '#ffffff';\n ctx2d.lineWidth = config.previewStyle.width || 2;\n ctx2d.globalAlpha = config.previewStyle.opacity || 0.5;\n ctx2d.setLineDash(config.previewStyle.dash || [5, 5]);\n\n ctx2d.beginPath();\n ctx2d.moveTo(origPixelX, origPixelY);\n ctx2d.lineTo(currPixelX, currPixelY);\n ctx2d.stroke();\n\n // Draw highlight circle at current position\n ctx2d.globalAlpha = 1;\n ctx2d.fillStyle = config.highlightColor;\n ctx2d.setLineDash([]);\n ctx2d.beginPath();\n ctx2d.arc(currPixelX, currPixelY, 6, 0, Math.PI * 2);\n ctx2d.fill();\n\n // Draw outline\n ctx2d.strokeStyle = '#000000';\n ctx2d.lineWidth = 1;\n ctx2d.stroke();\n\n ctx2d.restore();\n }\n\n // API implementation\n const api: DragEditAPI & Record<string, unknown> = {\n enable() {\n config.enabled = true;\n },\n disable() {\n config.enabled = false;\n if (isDragging) {\n draggedPoint = null;\n isDragging = false;\n hasMoved = false;\n ctx?.requestRender();\n }\n },\n isEnabled() {\n return config.enabled;\n },\n setEditableSeries(seriesIds: string[]) {\n config.editableSeries = seriesIds;\n },\n getDraggedPoint() {\n return draggedPoint;\n },\n cancelDrag() {\n if (isDragging && draggedPoint) {\n draggedPoint = null;\n isDragging = false;\n hasMoved = false;\n ctx?.requestRender();\n }\n },\n updateConfig(newConfig: Partial<PluginDragEditConfig>) {\n Object.assign(config, newConfig);\n },\n };\n\n return {\n manifest,\n\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n\n // Attach to chart API\n (ctx.chart as any).dragEdit = api;\n },\n\n onDestroy(_pluginCtx: PluginContext) {\n // Remove from chart API\n delete (_pluginCtx.chart as any).dragEdit;\n\n ctx = null;\n },\n\n onInteraction(_pluginCtx: PluginContext, event: import('../types').InteractionEvent) {\n if (!config.enabled) return;\n\n if (event.type === 'mousedown') {\n const point = findNearestPoint(event.pixelX, event.pixelY);\n if (point) {\n draggedPoint = point;\n dragStartX = event.pixelX;\n dragStartY = event.pixelY;\n hasMoved = false;\n isDragging = false;\n // Prevent default to stop panning when clicking on a point\n event.preventDefault();\n }\n } else if (event.type === 'mousemove') {\n if (!draggedPoint) return;\n\n // Check if we've moved beyond threshold\n if (!isDragging) {\n const dx = event.pixelX - dragStartX;\n const dy = event.pixelY - dragStartY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance > config.dragThreshold) {\n isDragging = true;\n hasMoved = true;\n\n // Fire drag start event\n const dragEvent = createDragEvent();\n if (dragEvent) config.onDragStart(dragEvent);\n } else {\n return;\n }\n }\n\n // Prevent default during dragging\n if (isDragging) {\n event.preventDefault();\n }\n\n // Convert to data coordinates\n let { x, y } = pixelToData(event.pixelX, event.pixelY);\n\n // Apply constraints\n ({ x, y } = applyConstraints(x, y, config.constraint));\n\n // Validate and snap\n const { x: finalX, y: finalY, valid } = validateAndSnap(x, y);\n\n if (valid) {\n draggedPoint.currentX = finalX;\n draggedPoint.currentY = finalY;\n\n // Fire drag event (for callbacks)\n const dragEvent = createDragEvent();\n if (dragEvent) config.onDrag(dragEvent);\n\n // Request render to show preview line\n ctx?.requestRender();\n }\n } else if (event.type === 'mouseup') {\n if (!draggedPoint) return;\n\n if (isDragging && hasMoved) {\n // Apply the changes\n updatePointData(\n draggedPoint.seriesId,\n draggedPoint.index,\n draggedPoint.currentX,\n draggedPoint.currentY\n );\n\n // Fire drag end event\n const dragEvent = createDragEvent();\n if (dragEvent) config.onDragEnd(dragEvent);\n\n // Prevent default on mouseup to avoid triggering click events\n event.preventDefault();\n }\n\n // Reset state\n draggedPoint = null;\n isDragging = false;\n hasMoved = false;\n ctx?.requestRender();\n }\n },\n\n onRenderOverlay(pluginCtx: PluginContext) {\n drawPreview(pluginCtx);\n },\n\n api,\n };\n}\n\nexport default PluginDragEdit;\n\n// Type exports\nexport type {\n PluginDragEditConfig,\n DragEditAPI,\n DraggedPoint,\n DragEditEvent,\n DragConstraint,\n} from './types';\n","/**\n * PluginDrawingTools — interactive drawing on chart (Stage 2.9 MVP).\n */\n\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\nimport type { Annotation } from \"../../core/annotations/types\";\n\nexport type DrawingMode =\n | \"none\"\n | \"pan\"\n | \"trendline\"\n | \"horizontal\"\n | \"vertical\"\n | \"rectangle\";\n\nexport interface PluginDrawingToolsConfig {\n /** Default stroke color */\n color?: string;\n}\n\nexport interface DrawingToolsAPI {\n setMode(mode: DrawingMode): void;\n getMode(): DrawingMode;\n undo(): boolean;\n redo(): boolean;\n clear(): void;\n}\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-drawing-tools\",\n version: \"1.0.0\",\n description: \"Interactive trendline, horizontal, vertical, and rectangle drawing\",\n provides: [\"drawing\"],\n tags: [\"drawing\", \"annotations\", \"trading\"],\n};\n\ninterface DrawState {\n mode: DrawingMode;\n pending: { x: number; y: number } | null;\n undoStack: Annotation[][];\n redoStack: Annotation[][];\n}\n\nexport function PluginDrawingTools(\n config: PluginDrawingToolsConfig = {},\n): ChartPlugin<PluginDrawingToolsConfig> {\n let ctx: PluginContext | null = null;\n let state: DrawState = {\n mode: \"none\",\n pending: null,\n undoStack: [],\n redoStack: [],\n };\n let clickHandler: ((e: { point: { x: number; y: number } }) => void) | null = null;\n\n const stroke = config.color ?? \"#38bdf8\";\n\n function snapshot(): Annotation[] {\n return ctx?.chart.getAnnotations?.() ?? [];\n }\n\n function pushUndo(): void {\n state.undoStack.push(snapshot());\n state.redoStack = [];\n }\n\n const api: DrawingToolsAPI & Record<string, unknown> = {\n setMode(mode) {\n state.mode = mode;\n state.pending = null;\n },\n getMode() {\n return state.mode;\n },\n undo() {\n if (!ctx || state.undoStack.length === 0) return false;\n state.redoStack.push(snapshot());\n const prev = state.undoStack.pop()!;\n const current = snapshot();\n for (const a of current) ctx.chart.removeAnnotation(a.id!);\n for (const a of prev) ctx.chart.addAnnotation(a);\n return true;\n },\n redo() {\n if (!ctx || state.redoStack.length === 0) return false;\n state.undoStack.push(snapshot());\n const next = state.redoStack.pop()!;\n const current = snapshot();\n for (const a of current) ctx.chart.removeAnnotation(a.id!);\n for (const a of next) ctx.chart.addAnnotation(a);\n return true;\n },\n clear() {\n if (!ctx) return;\n pushUndo();\n for (const a of snapshot()) ctx.chart.removeAnnotation(a.id!);\n },\n };\n\n return {\n manifest,\n api,\n onInit(pluginCtx) {\n ctx = pluginCtx;\n clickHandler = (evt) => {\n if (!ctx || state.mode === \"none\" || state.mode === \"pan\") return;\n const { x, y } = evt.point;\n\n if (state.mode === \"horizontal\") {\n pushUndo();\n ctx.chart.addAnnotation({\n type: \"horizontal-line\",\n y,\n color: stroke,\n interactive: true,\n });\n return;\n }\n\n if (state.mode === \"vertical\") {\n pushUndo();\n ctx.chart.addAnnotation({\n type: \"vertical-line\",\n x,\n color: stroke,\n interactive: true,\n });\n return;\n }\n\n if (!state.pending) {\n state.pending = { x, y };\n return;\n }\n\n const p0 = state.pending;\n state.pending = null;\n pushUndo();\n\n if (state.mode === \"trendline\") {\n ctx.chart.addAnnotation({\n type: \"arrow\",\n x1: p0.x,\n y1: p0.y,\n x2: x,\n y2: y,\n color: stroke,\n interactive: true,\n });\n } else if (state.mode === \"rectangle\") {\n ctx.chart.addAnnotation({\n type: \"rectangle\",\n xMin: Math.min(p0.x, x),\n xMax: Math.max(p0.x, x),\n yMin: Math.min(p0.y, y),\n yMax: Math.max(p0.y, y),\n strokeColor: stroke,\n fillColor: stroke + \"22\",\n interactive: true,\n });\n }\n };\n\n ctx.chart.on(\"click\", clickHandler);\n },\n onDestroy(pluginCtx) {\n if (clickHandler) {\n pluginCtx.chart.off(\"click\", clickHandler);\n }\n ctx = null;\n clickHandler = null;\n },\n };\n}\n\nexport default PluginDrawingTools;\n","/**\n * PluginReplay — bar-by-bar playback (Stage 2.17 MVP).\n */\n\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\n\nexport interface PluginReplayConfig {\n /** Series id to replay */\n seriesId: string;\n /** Milliseconds between frames at 1x speed */\n frameMs?: number;\n}\n\nexport interface ReplayAPI {\n play(speed?: number): void;\n pause(): void;\n step(count?: number): void;\n seek(index: number): void;\n getIndex(): number;\n getLength(): number;\n isPlaying(): boolean;\n}\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-replay\",\n version: \"1.0.0\",\n description: \"Bar-by-bar chart replay with speed control\",\n provides: [\"replay\"],\n tags: [\"replay\", \"trading\"],\n};\n\ninterface ReplayBuffer {\n x: Float32Array;\n open?: Float32Array;\n high?: Float32Array;\n low?: Float32Array;\n close?: Float32Array;\n y?: Float32Array;\n}\n\nexport function PluginReplay(config: PluginReplayConfig): ChartPlugin<PluginReplayConfig> {\n let ctx: PluginContext | null = null;\n let buffer: ReplayBuffer | null = null;\n let index = 0;\n let timer: ReturnType<typeof setInterval> | null = null;\n let speed = 1;\n const frameMs = config.frameMs ?? 250;\n\n function applyWindow(end: number): void {\n if (!ctx || !buffer) return;\n const n = Math.min(end + 1, buffer.x.length);\n const slice = (arr?: Float32Array) => (arr ? arr.subarray(0, n) : undefined);\n ctx.chart.updateSeries(config.seriesId, {\n x: slice(buffer.x)!,\n y: slice(buffer.y),\n open: slice(buffer.open),\n high: slice(buffer.high),\n low: slice(buffer.low),\n close: slice(buffer.close),\n });\n }\n\n const api: ReplayAPI & Record<string, unknown> = {\n play(s = 1) {\n if (!buffer) return;\n speed = Math.max(0.1, s);\n if (timer) clearInterval(timer);\n timer = setInterval(() => {\n if (index >= buffer!.x.length - 1) {\n api.pause();\n return;\n }\n index++;\n applyWindow(index);\n }, frameMs / speed);\n },\n pause() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n },\n step(count = 1) {\n if (!buffer) return;\n index = Math.min(buffer.x.length - 1, index + count);\n applyWindow(index);\n },\n seek(i) {\n if (!buffer) return;\n index = Math.max(0, Math.min(buffer.x.length - 1, i));\n applyWindow(index);\n },\n getIndex() {\n return index;\n },\n getLength() {\n return buffer?.x.length ?? 0;\n },\n isPlaying() {\n return timer != null;\n },\n };\n\n return {\n manifest,\n api,\n onInit(pluginCtx) {\n ctx = pluginCtx;\n const series = ctx.chart.getSeries(config.seriesId);\n if (!series) {\n console.warn(`[PluginReplay] Series \"${config.seriesId}\" not found`);\n return;\n }\n const d = series.getData();\n buffer = {\n x: Float32Array.from(d.x),\n y: d.y ? Float32Array.from(d.y) : undefined,\n open: d.open ? Float32Array.from(d.open) : undefined,\n high: d.high ? Float32Array.from(d.high) : undefined,\n low: d.low ? Float32Array.from(d.low) : undefined,\n close: d.close ? Float32Array.from(d.close) : undefined,\n };\n index = Math.max(0, buffer.x.length - 1);\n },\n onDestroy() {\n api.pause();\n ctx = null;\n buffer = null;\n },\n };\n}\n\nexport default PluginReplay;\n","/**\n * WebGL grid spike — batched GL_LINES renderer for axis grid lines.\n * Labels remain on Canvas 2D; this spike covers grid lines only.\n * @module renderer/spike/WebGLGridSpike\n */\n\nexport interface GridLineSpec {\n /** Plot area in CSS pixels */\n plotArea: { x: number; y: number; width: number; height: number };\n /** Pixel X positions for vertical grid lines */\n xLines: number[];\n /** Pixel Y positions for horizontal grid lines */\n yLines: number[];\n /** Canvas width (physical pixels) */\n width: number;\n /** Canvas height (physical pixels) */\n height: number;\n /** Line color RGBA 0–1 */\n color?: [number, number, number, number];\n /** Line width in pixels */\n lineWidth?: number;\n}\n\nconst VERT_SRC = `\n attribute vec2 aPosition;\n uniform vec2 uResolution;\n void main() {\n vec2 clip = (aPosition / uResolution) * 2.0 - 1.0;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n }\n`;\n\nconst FRAG_SRC = `\n precision mediump float;\n uniform vec4 uColor;\n void main() {\n gl_FragColor = uColor;\n }\n`;\n\nfunction compileShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"createShader failed\");\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(gl.getShaderInfoLog(shader) ?? \"shader compile failed\");\n }\n return shader;\n}\n\nfunction createProgram(gl: WebGLRenderingContext): WebGLProgram {\n const vs = compileShader(gl, gl.VERTEX_SHADER, VERT_SRC);\n const fs = compileShader(gl, gl.FRAGMENT_SHADER, FRAG_SRC);\n const program = gl.createProgram();\n if (!program) throw new Error(\"createProgram failed\");\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(gl.getProgramInfoLog(program) ?? \"program link failed\");\n }\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n return program;\n}\n\n/** Build interleaved [x,y] vertex pairs for GL_LINES from tick pixel positions */\nexport function buildGridLineVertices(spec: GridLineSpec): Float32Array {\n const { plotArea, xLines, yLines } = spec;\n const y0 = plotArea.y;\n const y1 = plotArea.y + plotArea.height;\n const x0 = plotArea.x;\n const x1 = plotArea.x + plotArea.width;\n\n const vertCount = (xLines.length + yLines.length) * 2;\n const out = new Float32Array(vertCount * 2);\n let o = 0;\n\n for (const x of xLines) {\n out[o++] = x;\n out[o++] = y0;\n out[o++] = x;\n out[o++] = y1;\n }\n\n for (const y of yLines) {\n out[o++] = x0;\n out[o++] = y;\n out[o++] = x1;\n out[o++] = y;\n }\n\n return out;\n}\n\nexport class WebGLGridSpike {\n private gl: WebGLRenderingContext;\n private program: WebGLProgram;\n private buffer: WebGLBuffer;\n private aPosition: number;\n private uResolution: WebGLUniformLocation;\n private uColor: WebGLUniformLocation;\n\n constructor(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext(\"webgl\", {\n alpha: true,\n antialias: false,\n preserveDrawingBuffer: true,\n });\n if (!gl) throw new Error(\"WebGL not available for grid spike\");\n\n this.gl = gl;\n this.program = createProgram(gl);\n this.aPosition = gl.getAttribLocation(this.program, \"aPosition\");\n this.uResolution = gl.getUniformLocation(this.program, \"uResolution\")!;\n this.uColor = gl.getUniformLocation(this.program, \"uColor\")!;\n\n const buf = gl.createBuffer();\n if (!buf) throw new Error(\"createBuffer failed\");\n this.buffer = buf;\n }\n\n /** Upload vertices and draw grid lines */\n draw(spec: GridLineSpec): number {\n const gl = this.gl;\n const vertices = buildGridLineVertices(spec);\n const lineSegments = vertices.length / 4;\n\n gl.viewport(0, 0, spec.width, spec.height);\n gl.clearColor(0.04, 0.05, 0.08, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(this.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.DYNAMIC_DRAW);\n gl.enableVertexAttribArray(this.aPosition);\n gl.vertexAttribPointer(this.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(this.uResolution, spec.width, spec.height);\n const c = spec.color ?? [0.2, 0.22, 0.3, 0.6];\n gl.uniform4f(this.uColor, c[0], c[1], c[2], c[3]);\n gl.lineWidth(spec.lineWidth ?? 1);\n\n gl.drawArrays(gl.LINES, 0, vertices.length / 2);\n return lineSegments;\n }\n\n destroy(): void {\n const gl = this.gl;\n gl.deleteBuffer(this.buffer);\n gl.deleteProgram(this.program);\n }\n}\n","/**\n * Grid rendering benchmark — Canvas 2D vs WebGL spike comparison.\n * @module testing/gridSpikeBenchmark\n */\n\nimport { OverlayRenderer } from \"../core/OverlayRenderer\";\nimport { LinearScale } from \"../scales\";\nimport { DARK_THEME } from \"../theme\";\nimport { WebGLGridSpike, buildGridLineVertices, type GridLineSpec } from \"../renderer/spike/WebGLGridSpike\";\nimport { snapLineCoord } from \"../core/render/pixelSnap\";\nimport type { PlotArea } from \"../types\";\n\nexport interface GridBenchmarkResult {\n backend: \"canvas2d\" | \"webgl\";\n dpr: number;\n width: number;\n height: number;\n xTicks: number;\n yTicks: number;\n lineSegments: number;\n avgFrameUs: number;\n p95FrameUs: number;\n frames: number;\n}\n\nexport interface GridCompareResult {\n canvas2d: GridBenchmarkResult;\n webgl: GridBenchmarkResult | null;\n /** Positive = WebGL faster */\n gainPercent: number;\n recommendation: \"implement\" | \"defer\";\n}\n\nfunction createMinimalMock2D(canvas: HTMLCanvasElement): CanvasRenderingContext2D {\n const noop = () => {};\n return {\n canvas,\n strokeStyle: \"\",\n fillStyle: \"\",\n lineWidth: 1,\n font: \"\",\n textAlign: \"left\",\n textBaseline: \"alphabetic\",\n beginPath: noop,\n moveTo: noop,\n lineTo: noop,\n stroke: noop,\n fill: noop,\n clearRect: noop,\n setTransform: noop,\n setLineDash: noop,\n save: noop,\n restore: noop,\n translate: noop,\n rotate: noop,\n fillText: noop,\n measureText: (text: string) => ({ width: text.length * 7 } as TextMetrics),\n } as unknown as CanvasRenderingContext2D;\n}\n\nfunction getCanvas2DContext(width: number, height: number): CanvasRenderingContext2D {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas.getContext(\"2d\") ?? createMinimalMock2D(canvas);\n}\n\nfunction makePlotArea(width: number, height: number): PlotArea {\n const margin = { top: 40, right: 40, bottom: 50, left: 60 };\n return {\n x: margin.left,\n y: margin.top,\n width: width - margin.left - margin.right,\n height: height - margin.top - margin.bottom,\n };\n}\n\nfunction tickPixelLines(\n _plotArea: PlotArea,\n xScale: LinearScale,\n yScale: LinearScale,\n xTickCount: number,\n yTickCount: number,\n): { xLines: number[]; yLines: number[] } {\n const xLines = xScale.ticks(xTickCount).map((t) => snapLineCoord(xScale.transform(t)));\n const yLines = yScale.ticks(yTickCount).map((t) => snapLineCoord(yScale.transform(t)));\n return { xLines, yLines };\n}\n\nfunction measureFrames(runFrame: () => void, frames: number): { avg: number; p95: number } {\n const samples: number[] = [];\n for (let i = 0; i < frames; i++) {\n const t0 = performance.now();\n runFrame();\n samples.push((performance.now() - t0) * 1000);\n }\n samples.sort((a, b) => a - b);\n const avg = samples.reduce((s, v) => s + v, 0) / samples.length;\n const p95 = samples[Math.floor(samples.length * 0.95)] ?? avg;\n return { avg, p95 };\n}\n\n/** Benchmark Canvas 2D grid via OverlayRenderer.drawGrid */\nexport function benchmarkCanvasGrid(options: {\n width?: number;\n height?: number;\n dpr?: number;\n xTickCount?: number;\n yTickCount?: number;\n frames?: number;\n showMinor?: boolean;\n} = {}): GridBenchmarkResult {\n const width = Math.round((options.width ?? 1920) * (options.dpr ?? 1));\n const height = Math.round((options.height ?? 1080) * (options.dpr ?? 1));\n const xTickCount = options.xTickCount ?? 24;\n const yTickCount = options.yTickCount ?? 16;\n const frames = options.frames ?? 120;\n\n const ctx = getCanvas2DContext(width, height);\n\n const theme = {\n ...DARK_THEME,\n grid: {\n ...DARK_THEME.grid,\n visible: true,\n showMinor: options.showMinor ?? true,\n },\n };\n\n const plotArea = makePlotArea(width, height);\n const xScale = new LinearScale();\n const yScale = new LinearScale();\n xScale.setDomain(0, 1_000_000);\n yScale.setDomain(-1, 1);\n xScale.setRange(plotArea.x, plotArea.x + plotArea.width);\n yScale.setRange(plotArea.y + plotArea.height, plotArea.y);\n\n const renderer = new OverlayRenderer(ctx, theme);\n\n const { avg, p95 } = measureFrames(() => {\n ctx.clearRect(0, 0, width, height);\n renderer.drawGrid(plotArea, xScale, yScale, { tickCount: xTickCount }, { tickCount: yTickCount });\n }, frames);\n\n const { xLines, yLines } = tickPixelLines(plotArea, xScale, yScale, xTickCount, yTickCount);\n\n return {\n backend: \"canvas2d\",\n dpr: options.dpr ?? 1,\n width,\n height,\n xTicks: xTickCount,\n yTicks: yTickCount,\n lineSegments: xLines.length + yLines.length,\n avgFrameUs: Math.round(avg),\n p95FrameUs: Math.round(p95),\n frames,\n };\n}\n\n/** Benchmark WebGL grid spike (returns null if WebGL unavailable) */\nexport function benchmarkWebGLGrid(options: {\n width?: number;\n height?: number;\n dpr?: number;\n xTickCount?: number;\n yTickCount?: number;\n frames?: number;\n} = {}): GridBenchmarkResult | null {\n const width = Math.round((options.width ?? 1920) * (options.dpr ?? 1));\n const height = Math.round((options.height ?? 1080) * (options.dpr ?? 1));\n const xTickCount = options.xTickCount ?? 24;\n const yTickCount = options.yTickCount ?? 16;\n const frames = options.frames ?? 120;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n let spike: WebGLGridSpike;\n try {\n spike = new WebGLGridSpike(canvas);\n } catch {\n return null;\n }\n\n const plotArea = makePlotArea(width, height);\n const xScale = new LinearScale();\n const yScale = new LinearScale();\n xScale.setDomain(0, 1_000_000);\n yScale.setDomain(-1, 1);\n xScale.setRange(plotArea.x, plotArea.x + plotArea.width);\n yScale.setRange(plotArea.y + plotArea.height, plotArea.y);\n\n const { xLines, yLines } = tickPixelLines(plotArea, xScale, yScale, xTickCount, yTickCount);\n const spec: GridLineSpec = { plotArea, xLines, yLines, width, height };\n\n let lineSegments = 0;\n const { avg, p95 } = measureFrames(() => {\n lineSegments = spike.draw(spec);\n }, frames);\n\n spike.destroy();\n\n return {\n backend: \"webgl\",\n dpr: options.dpr ?? 1,\n width,\n height,\n xTicks: xTickCount,\n yTicks: yTickCount,\n lineSegments,\n avgFrameUs: Math.round(avg),\n p95FrameUs: Math.round(p95),\n frames,\n };\n}\n\n/** Compare backends; recommends implement if WebGL ≥20% faster */\nexport function compareGridBackends(options?: {\n dpr?: number;\n frames?: number;\n}): GridCompareResult {\n const dpr = options?.dpr ?? 2;\n const frames = options?.frames ?? 120;\n\n const canvas2d = benchmarkCanvasGrid({ dpr, frames, showMinor: true });\n const webgl = benchmarkWebGLGrid({ dpr, frames });\n\n if (!webgl) {\n return {\n canvas2d,\n webgl: null,\n gainPercent: 0,\n recommendation: \"defer\",\n };\n }\n\n const gainPercent = ((canvas2d.avgFrameUs - webgl.avgFrameUs) / canvas2d.avgFrameUs) * 100;\n\n return {\n canvas2d,\n webgl,\n gainPercent: Math.round(gainPercent * 10) / 10,\n recommendation: gainPercent >= 20 ? \"implement\" : \"defer\",\n };\n}\n\n/** Vertex builder smoke test (no GL required) */\nexport function countGridVertices(xTickCount: number, yTickCount: number): number {\n const spec: GridLineSpec = {\n plotArea: { x: 60, y: 40, width: 800, height: 400 },\n xLines: Array.from({ length: xTickCount }, (_, i) => 60 + i * 30),\n yLines: Array.from({ length: yTickCount }, (_, i) => 40 + i * 25),\n width: 960,\n height: 540,\n };\n return buildGridLineVertices(spec).length / 2;\n}\n","/**\n * Stage 1 browser benchmark harness — scenarios + baseline comparison.\n * @module testing/stage1BrowserBench\n */\n\nimport type { BenchmarkResult } from \"./index\";\nimport baseline from \"./baselines/v1.15.0.json\";\n\nexport interface Stage1ScenarioResult {\n id: string;\n benchmark: BenchmarkResult;\n passed: boolean;\n failures: string[];\n baselineMinFps?: number;\n}\n\nexport interface Stage1BrowserReport {\n timestamp: number;\n version: string;\n scenarios: Stage1ScenarioResult[];\n allPassed: boolean;\n regressionThreshold: number;\n}\n\nexport interface BaselineScenario {\n minAvgFps?: number;\n maxAvgFrameTimeMs?: number;\n maxAvgFrameUs?: number;\n dpr?: number;\n points?: number;\n description?: string;\n}\n\n/** When wall-clock frame count is below this, headless rAF is unreliable — use renderFps. */\nexport const HEADLESS_LOW_FRAME_THRESHOLD = 30;\n\n/** Headless smoke floors (renderFps or effective FPS). Desktop uses baseline minAvgFps. */\nexport const SMOKE_FLOORS: Record<string, number> = {\n \"line-1m-pan\": 5,\n \"candlestick-500k\": 25,\n \"stack-5pane-resize\": 20,\n \"line-200k-webgl\": 3,\n \"line-200k-webgpu\": 2,\n \"boxplot-5k-webgpu\": 2,\n};\n\n/** Pick wall or render FPS depending on headless throttling artifacts. */\nexport function effectiveBenchmarkFps(\n result: Pick<BenchmarkResult, \"avgFps\" | \"renderFps\" | \"frameCount\">,\n isHeadless: boolean,\n): number {\n const wall = result.avgFps ?? 0;\n const render = result.renderFps ?? 0;\n const frames = result.frameCount ?? 0;\n\n if (!isHeadless) return wall;\n\n if (render > 0 && (frames < HEADLESS_LOW_FRAME_THRESHOLD || wall < 10)) {\n return render;\n }\n return wall;\n}\n\nexport function getBaseline(): typeof baseline {\n return baseline;\n}\n\n/** Compare a benchmark result against v1.15 baseline for a scenario */\nexport function compareScenarioToBaseline(\n scenarioId: string,\n result: BenchmarkResult | { avgFrameUs: number; backend?: string },\n): { passed: boolean; failures: string[] } {\n const spec = (baseline.scenarios as Record<string, BaselineScenario>)[scenarioId];\n if (!spec) {\n return { passed: true, failures: [] };\n }\n\n const failures: string[] = [];\n const threshold = baseline.regressionThreshold ?? 0.1;\n\n if (\"avgFps\" in result && spec.minAvgFps !== undefined) {\n const minAllowed = spec.minAvgFps * (1 - threshold);\n if (result.avgFps < minAllowed) {\n failures.push(\n `FPS ${result.avgFps} < baseline min ${spec.minAvgFps} (allowed ${minAllowed.toFixed(1)} with ${threshold * 100}% slack)`,\n );\n }\n }\n\n if (\"avgFrameTime\" in result && spec.maxAvgFrameTimeMs !== undefined) {\n const maxAllowed = spec.maxAvgFrameTimeMs * (1 + threshold);\n if (result.avgFrameTime > maxAllowed) {\n failures.push(\n `Frame time ${result.avgFrameTime}ms > baseline max ${spec.maxAvgFrameTimeMs}ms`,\n );\n }\n }\n\n if (\"avgFrameUs\" in result && spec.maxAvgFrameUs !== undefined) {\n const maxAllowed = spec.maxAvgFrameUs * (1 + threshold);\n if (result.avgFrameUs > maxAllowed) {\n failures.push(\n `Grid frame ${result.avgFrameUs}µs > baseline max ${spec.maxAvgFrameUs}µs`,\n );\n }\n }\n\n return { passed: failures.length === 0, failures };\n}\n\n/** Build a full Stage 1 report from scenario results */\nexport function buildStage1Report(\n scenarios: Stage1ScenarioResult[],\n): Stage1BrowserReport {\n return {\n timestamp: Date.now(),\n version: baseline.version,\n scenarios,\n allPassed: scenarios.every((s) => s.passed),\n regressionThreshold: baseline.regressionThreshold,\n };\n}\n","/**\n * WebGL vs WebGPU chart renderer comparison helpers.\n * @module testing/rendererBenchmark\n */\n\nimport type { BenchmarkResult } from \"./index\";\n\nexport interface RendererCompareResult {\n webgl: BenchmarkResult;\n webgpu: BenchmarkResult | null;\n webgpuActive: boolean;\n /** webgpuFps / webglFps — ≥1 means WebGPU is faster or equal */\n fpsRatio: number;\n /** Meets ADR target: WebGPU ≥ 95% of WebGL FPS */\n meetsTarget: boolean;\n recommendation: \"webgpu-ready\" | \"webgl-faster\" | \"webgpu-unavailable\";\n}\n\nexport function evaluateRendererCompare(\n webgl: BenchmarkResult,\n webgpu: BenchmarkResult | null,\n webgpuActive: boolean,\n minRatio = 0.95,\n): RendererCompareResult {\n if (!webgpuActive || !webgpu) {\n return {\n webgl,\n webgpu,\n webgpuActive: false,\n fpsRatio: 0,\n meetsTarget: false,\n recommendation: \"webgpu-unavailable\",\n };\n }\n\n const ratio = webgl.avgFps > 0 ? webgpu.avgFps / webgl.avgFps : 0;\n const meetsTarget = ratio >= minRatio;\n\n return {\n webgl,\n webgpu,\n webgpuActive: true,\n fpsRatio: ratio,\n meetsTarget,\n recommendation: meetsTarget ? \"webgpu-ready\" : \"webgl-faster\",\n };\n}\n","/**\n * Sci Plot - Testing Utilities\n * \n * Provides utilities for testing chart applications:\n * - Mock data generators\n * - Chart test harness\n * - Snapshot helpers\n * - Performance benchmarks\n * \n * @module testing\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface MockChartOptions {\n /** Canvas width (default: 800) */\n width?: number;\n /** Canvas height (default: 600) */\n height?: number;\n /** Device pixel ratio (default: 1) */\n devicePixelRatio?: number;\n /** Theme (default: 'dark') */\n theme?: string;\n /** Enable WebGL mock (default: true) */\n mockWebGL?: boolean;\n}\n\nexport interface WaveformOptions {\n /** Number of points (default: 1000) */\n pointCount?: number;\n /** Amplitude (default: 1) */\n amplitude?: number;\n /** Frequency in Hz (default: 1) */\n frequency?: number;\n /** Phase offset in radians (default: 0) */\n phase?: number;\n /** Noise level (0-1, default: 0) */\n noise?: number;\n /** X start value (default: 0) */\n xStart?: number;\n /** X end value (default: 10) */\n xEnd?: number;\n /** DC offset (default: 0) */\n offset?: number;\n}\n\nexport interface RandomDataOptions {\n /** Number of points (default: 1000) */\n pointCount?: number;\n /** X range [min, max] (default: [0, 100]) */\n xRange?: [number, number];\n /** Y range [min, max] (default: [-1, 1]) */\n yRange?: [number, number];\n /** Sort by X value (default: true) */\n sorted?: boolean;\n /** Seed for reproducible random (optional) */\n seed?: number;\n}\n\nexport interface BenchmarkResult {\n /** Average frames per second */\n avgFps: number;\n /** Minimum FPS recorded */\n minFps: number;\n /** Maximum FPS recorded */\n maxFps: number;\n /** Average frame time in ms */\n avgFrameTime: number;\n /** Total frames rendered */\n frameCount: number;\n /** Test duration in ms */\n duration: number;\n /** Points per frame */\n pointsRendered: number;\n /** Points per second throughput */\n throughput: number;\n /** Render-only throughput (1000 / avgFrameTime); can exceed wall FPS */\n renderFps?: number;\n}\n\nexport interface BenchmarkOptions {\n /** Duration of benchmark in ms (default: 5000) */\n duration?: number;\n /** Warmup duration in ms (default: 1000) */\n warmup?: number;\n /** Target FPS for assertions (default: 55) */\n targetFps?: number;\n /** Enable console output (default: false) */\n verbose?: boolean;\n}\n\nexport interface SnapshotOptions {\n /** Output format: 'json' | 'png' | 'canvas' (default: 'json') */\n format?: 'json' | 'png' | 'canvas';\n /** Include data in snapshot (default: false for performance) */\n includeData?: boolean;\n /** Include styles in snapshot (default: true) */\n includeStyles?: boolean;\n}\n\nexport interface ChartSnapshot {\n /** Snapshot timestamp */\n timestamp: number;\n /** Chart configuration */\n config: Record<string, unknown>;\n /** Series metadata (without data by default) */\n series: {\n id: string;\n type: string;\n pointCount: number;\n style?: Record<string, unknown>;\n }[];\n /** View bounds */\n bounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n };\n /** Canvas data URL (if format is 'png') */\n image?: string;\n}\n\n// ============================================\n// Seeded Random Number Generator\n// ============================================\n\nclass SeededRandom {\n private seed: number;\n\n constructor(seed: number) {\n this.seed = seed;\n }\n\n next(): number {\n // Mulberry32 PRNG\n let t = (this.seed += 0x6d2b79f5);\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n nextRange(min: number, max: number): number {\n return min + this.next() * (max - min);\n }\n}\n\n// ============================================\n// Data Generators\n// ============================================\n\n/**\n * Generate a sine wave\n */\nexport function generateSineWave(options?: WaveformOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<WaveformOptions> = {\n pointCount: 1000,\n amplitude: 1,\n frequency: 1,\n phase: 0,\n noise: 0,\n xStart: 0,\n xEnd: 10,\n offset: 0,\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n const dx = (opts.xEnd - opts.xStart) / (opts.pointCount - 1);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = opts.xStart + i * dx;\n const baseValue =\n opts.amplitude * Math.sin(2 * Math.PI * opts.frequency * x[i] + opts.phase);\n const noiseValue = opts.noise > 0 ? (Math.random() - 0.5) * 2 * opts.noise : 0;\n y[i] = baseValue + noiseValue + opts.offset;\n }\n\n return { x, y };\n}\n\n/**\n * Generate a square wave\n */\nexport function generateSquareWave(options?: WaveformOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<WaveformOptions> = {\n pointCount: 1000,\n amplitude: 1,\n frequency: 1,\n phase: 0,\n noise: 0,\n xStart: 0,\n xEnd: 10,\n offset: 0,\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n const dx = (opts.xEnd - opts.xStart) / (opts.pointCount - 1);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = opts.xStart + i * dx;\n const t = x[i] * opts.frequency + opts.phase / (2 * Math.PI);\n const baseValue = Math.sign(Math.sin(2 * Math.PI * t)) * opts.amplitude;\n const noiseValue = opts.noise > 0 ? (Math.random() - 0.5) * 2 * opts.noise : 0;\n y[i] = baseValue + noiseValue + opts.offset;\n }\n\n return { x, y };\n}\n\n/**\n * Generate a sawtooth wave\n */\nexport function generateSawtoothWave(options?: WaveformOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<WaveformOptions> = {\n pointCount: 1000,\n amplitude: 1,\n frequency: 1,\n phase: 0,\n noise: 0,\n xStart: 0,\n xEnd: 10,\n offset: 0,\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n const dx = (opts.xEnd - opts.xStart) / (opts.pointCount - 1);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = opts.xStart + i * dx;\n const t = x[i] * opts.frequency + opts.phase / (2 * Math.PI);\n const baseValue = opts.amplitude * 2 * (t - Math.floor(t + 0.5));\n const noiseValue = opts.noise > 0 ? (Math.random() - 0.5) * 2 * opts.noise : 0;\n y[i] = baseValue + noiseValue + opts.offset;\n }\n\n return { x, y };\n}\n\n/**\n * Generate a triangle wave\n */\nexport function generateTriangleWave(options?: WaveformOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<WaveformOptions> = {\n pointCount: 1000,\n amplitude: 1,\n frequency: 1,\n phase: 0,\n noise: 0,\n xStart: 0,\n xEnd: 10,\n offset: 0,\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n const dx = (opts.xEnd - opts.xStart) / (opts.pointCount - 1);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = opts.xStart + i * dx;\n const t = x[i] * opts.frequency + opts.phase / (2 * Math.PI);\n const baseValue = opts.amplitude * 2 * Math.abs(2 * (t - Math.floor(t + 0.5))) - opts.amplitude;\n const noiseValue = opts.noise > 0 ? (Math.random() - 0.5) * 2 * opts.noise : 0;\n y[i] = baseValue + noiseValue + opts.offset;\n }\n\n return { x, y };\n}\n\n/**\n * Generate random data points\n */\nexport function generateRandomData(options?: RandomDataOptions): {\n x: Float32Array;\n y: Float32Array;\n} {\n const opts: Required<RandomDataOptions> = {\n pointCount: 1000,\n xRange: [0, 100],\n yRange: [-1, 1],\n sorted: true,\n seed: Date.now(),\n ...options,\n };\n\n const rng = new SeededRandom(opts.seed);\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n\n for (let i = 0; i < opts.pointCount; i++) {\n x[i] = rng.nextRange(opts.xRange[0], opts.xRange[1]);\n y[i] = rng.nextRange(opts.yRange[0], opts.yRange[1]);\n }\n\n // Sort by X if requested\n if (opts.sorted) {\n const indices = Array.from({ length: opts.pointCount }, (_, i) => i);\n indices.sort((a, b) => x[a] - x[b]);\n \n const sortedX = new Float32Array(opts.pointCount);\n const sortedY = new Float32Array(opts.pointCount);\n \n for (let i = 0; i < opts.pointCount; i++) {\n sortedX[i] = x[indices[i]];\n sortedY[i] = y[indices[i]];\n }\n \n return { x: sortedX, y: sortedY };\n }\n\n return { x, y };\n}\n\n/**\n * Generate a cyclic voltammogram (CV) mock data\n */\nexport function generateCVData(options?: {\n pointCount?: number;\n vMin?: number;\n vMax?: number;\n cycles?: number;\n peakCurrent?: number;\n noise?: number;\n}): { x: Float32Array; y: Float32Array } {\n const opts = {\n pointCount: 2000,\n vMin: -0.5,\n vMax: 0.5,\n cycles: 1,\n peakCurrent: 10e-6, // 10 µA\n noise: 0.02,\n ...options,\n };\n\n const totalPoints = opts.pointCount * opts.cycles;\n const x = new Float32Array(totalPoints);\n const y = new Float32Array(totalPoints);\n \n const pointsPerCycle = opts.pointCount;\n const halfCycle = pointsPerCycle / 2;\n\n for (let c = 0; c < opts.cycles; c++) {\n for (let i = 0; i < pointsPerCycle; i++) {\n const idx = c * pointsPerCycle + i;\n \n // Potential sweep\n if (i < halfCycle) {\n x[idx] = opts.vMin + (opts.vMax - opts.vMin) * (i / halfCycle);\n } else {\n x[idx] = opts.vMax - (opts.vMax - opts.vMin) * ((i - halfCycle) / halfCycle);\n }\n \n // Current response (simplified Randles-Sevcik)\n const E = x[idx];\n const E0 = 0; // Formal potential\n const scanDirection = i < halfCycle ? 1 : -1;\n \n // Gaussian-like peak\n const peakWidth = 0.1;\n const exponent = -Math.pow(E - E0, 2) / (2 * peakWidth * peakWidth);\n const peakCurrent = opts.peakCurrent * Math.exp(exponent);\n \n // Add capacitive current and noise\n const capacitive = scanDirection * opts.peakCurrent * 0.1;\n const noiseValue = (Math.random() - 0.5) * 2 * opts.noise * opts.peakCurrent;\n \n y[idx] = scanDirection * peakCurrent + capacitive + noiseValue;\n }\n }\n\n return { x, y };\n}\n\n/**\n * Generate electrochemical impedance spectroscopy (EIS) Nyquist data\n */\nexport function generateNyquistData(options?: {\n pointCount?: number;\n rSolution?: number;\n rCharge?: number;\n frequency?: [number, number];\n}): { x: Float32Array; y: Float32Array } {\n const opts = {\n pointCount: 50,\n rSolution: 100, // Ohms\n rCharge: 1000, // Ohms\n frequency: [1e5, 0.01] as [number, number],\n ...options,\n };\n\n const x = new Float32Array(opts.pointCount);\n const y = new Float32Array(opts.pointCount);\n \n // Logarithmic frequency spacing\n const logFMin = Math.log10(opts.frequency[1]);\n const logFMax = Math.log10(opts.frequency[0]);\n \n for (let i = 0; i < opts.pointCount; i++) {\n const logF = logFMax - (logFMax - logFMin) * (i / (opts.pointCount - 1));\n const omega = 2 * Math.PI * Math.pow(10, logF);\n \n // Simple Randles circuit: Rs + (Rct || CPE)\n const tau = opts.rCharge * 1e-5; // Time constant\n const realPart = opts.rSolution + opts.rCharge / (1 + Math.pow(omega * tau, 2));\n const imagPart = omega * tau * opts.rCharge / (1 + Math.pow(omega * tau, 2));\n \n x[i] = realPart;\n y[i] = -imagPart; // Negative for Nyquist convention\n }\n\n return { x, y };\n}\n\n// ============================================\n// Performance Benchmarking\n// ============================================\n\n/**\n * Benchmark chart rendering performance\n */\nexport async function benchmarkRender(\n chart: { render: () => void; getAllSeries: () => { getPointCount: () => number }[] },\n options?: BenchmarkOptions\n): Promise<BenchmarkResult> {\n const opts: Required<BenchmarkOptions> = {\n duration: 5000,\n warmup: 1000,\n targetFps: 55,\n verbose: false,\n ...options,\n };\n\n const fpsHistory: number[] = [];\n const frameTimes: number[] = [];\n let frameCount = 0;\n\n // Calculate total points\n const totalPoints = chart\n .getAllSeries()\n .reduce((sum, s) => sum + s.getPointCount(), 0);\n\n return new Promise((resolve) => {\n const endTime = performance.now() + opts.warmup + opts.duration;\n const warmupEndTime = performance.now() + opts.warmup;\n let recording = false;\n let recordingStartTime = 0;\n\n function frame() {\n const now = performance.now();\n\n if (now >= endTime) {\n const avgRenderMs =\n frameTimes.length > 0\n ? frameTimes.reduce((a, b) => a + b, 0) / frameTimes.length\n : 0;\n const recordElapsedMs =\n recordingStartTime > 0 ? now - recordingStartTime : opts.duration;\n // Wall-clock FPS (includes rAF pacing + work outside timed render)\n const wallFps =\n frameCount > 0 && recordElapsedMs > 0\n ? (frameCount / recordElapsedMs) * 1000\n : 0;\n // Instantaneous render throughput (can exceed monitor refresh; useful for micro-bench)\n const renderFps =\n fpsHistory.length > 0\n ? fpsHistory.reduce((a, b) => a + b, 0) / fpsHistory.length\n : avgRenderMs > 0\n ? 1000 / avgRenderMs\n : 0;\n\n const result: BenchmarkResult = {\n avgFps: Math.round(wallFps * 100) / 100,\n minFps: Math.round((fpsHistory.length > 0 ? Math.min(...fpsHistory) : wallFps) * 100) / 100,\n maxFps: Math.round((fpsHistory.length > 0 ? Math.max(...fpsHistory) : wallFps) * 100) / 100,\n avgFrameTime: Math.round(avgRenderMs * 1000) / 1000,\n frameCount,\n duration: opts.duration,\n pointsRendered: totalPoints,\n throughput: Math.round((totalPoints * wallFps) / 1000) * 1000,\n /** @internal render-only FPS (not wall clock) */\n ...(renderFps > 0 ? { renderFps: Math.round(renderFps * 100) / 100 } : {}),\n } as BenchmarkResult;\n\n resolve(result);\n return;\n }\n\n // Start recording after warmup\n if (now >= warmupEndTime && !recording) {\n recording = true;\n recordingStartTime = now;\n frameCount = 0;\n frameTimes.length = 0;\n fpsHistory.length = 0;\n }\n\n const renderStart = performance.now();\n chart.render();\n const renderEnd = performance.now();\n\n if (recording) {\n const frameTime = renderEnd - renderStart;\n frameTimes.push(frameTime);\n frameCount++;\n\n const recentTimes = frameTimes.slice(-30);\n if (recentTimes.length > 0) {\n const avgRecentTime = recentTimes.reduce((a, b) => a + b, 0) / recentTimes.length;\n if (avgRecentTime > 0) {\n fpsHistory.push(1000 / avgRecentTime);\n }\n }\n }\n\n requestAnimationFrame(frame);\n }\n\n requestAnimationFrame(frame);\n });\n}\n\n// ============================================\n// Snapshot Utilities\n// ============================================\n\n/**\n * Create a snapshot of chart state for testing\n */\nexport function createSnapshot(\n chart: {\n getViewBounds: () => { xMin: number; xMax: number; yMin: number; yMax: number };\n getAllSeries: () => { getId: () => string; getType: () => string; getPointCount: () => number; getStyle: () => Record<string, unknown> }[];\n exportImage?: () => string;\n },\n options?: SnapshotOptions\n): ChartSnapshot {\n const opts: Required<SnapshotOptions> = {\n format: 'json',\n includeData: false,\n includeStyles: true,\n ...options,\n };\n\n const series = chart.getAllSeries().map((s) => ({\n id: s.getId(),\n type: s.getType(),\n pointCount: s.getPointCount(),\n ...(opts.includeStyles ? { style: s.getStyle() } : {}),\n }));\n\n const snapshot: ChartSnapshot = {\n timestamp: Date.now(),\n config: {},\n series,\n bounds: chart.getViewBounds(),\n };\n\n if (opts.format === 'png' && chart.exportImage) {\n snapshot.image = chart.exportImage();\n }\n\n return snapshot;\n}\n\n/**\n * Compare two snapshots for equality\n */\nexport function compareSnapshots(\n a: ChartSnapshot,\n b: ChartSnapshot,\n tolerance: number = 1e-6\n): {\n equal: boolean;\n differences: string[];\n} {\n const differences: string[] = [];\n\n // Compare series count\n if (a.series.length !== b.series.length) {\n differences.push(`Series count: ${a.series.length} vs ${b.series.length}`);\n }\n\n // Compare series metadata\n for (let i = 0; i < Math.min(a.series.length, b.series.length); i++) {\n const sa = a.series[i];\n const sb = b.series[i];\n\n if (sa.id !== sb.id) {\n differences.push(`Series[${i}] id: \"${sa.id}\" vs \"${sb.id}\"`);\n }\n if (sa.type !== sb.type) {\n differences.push(`Series[${i}] type: \"${sa.type}\" vs \"${sb.type}\"`);\n }\n if (sa.pointCount !== sb.pointCount) {\n differences.push(`Series[${i}] pointCount: ${sa.pointCount} vs ${sb.pointCount}`);\n }\n }\n\n // Compare bounds with tolerance\n const boundsKeys: (keyof ChartSnapshot['bounds'])[] = ['xMin', 'xMax', 'yMin', 'yMax'];\n for (const key of boundsKeys) {\n if (Math.abs(a.bounds[key] - b.bounds[key]) > tolerance) {\n differences.push(`Bounds.${key}: ${a.bounds[key]} vs ${b.bounds[key]}`);\n }\n }\n\n return {\n equal: differences.length === 0,\n differences,\n };\n}\n\n// ============================================\n// Test Assertions\n// ============================================\n\n/**\n * Assert that a benchmark meets performance requirements\n */\nexport function assertPerformance(\n result: BenchmarkResult,\n requirements: {\n minFps?: number;\n maxFrameTime?: number;\n minThroughput?: number;\n }\n): { passed: boolean; failures: string[] } {\n const failures: string[] = [];\n\n if (requirements.minFps && result.avgFps < requirements.minFps) {\n failures.push(`FPS ${result.avgFps} < required ${requirements.minFps}`);\n }\n\n if (requirements.maxFrameTime && result.avgFrameTime > requirements.maxFrameTime) {\n failures.push(`Frame time ${result.avgFrameTime}ms > required ${requirements.maxFrameTime}ms`);\n }\n\n if (requirements.minThroughput && result.throughput < requirements.minThroughput) {\n failures.push(`Throughput ${result.throughput} < required ${requirements.minThroughput}`);\n }\n\n return {\n passed: failures.length === 0,\n failures,\n };\n}\n\n/**\n * Wait for a number of animation frames\n */\nexport function waitForFrames(count: number = 1): Promise<void> {\n return new Promise((resolve) => {\n let remaining = count;\n function tick() {\n remaining--;\n if (remaining <= 0) {\n resolve();\n } else {\n requestAnimationFrame(tick);\n }\n }\n requestAnimationFrame(tick);\n });\n}\n\n/**\n * Wait for a specified duration\n */\nexport function waitFor(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Stage 1 grid spike + browser benchmarks\nexport {\n benchmarkCanvasGrid,\n benchmarkWebGLGrid,\n compareGridBackends,\n countGridVertices,\n type GridBenchmarkResult,\n type GridCompareResult,\n} from \"./gridSpikeBenchmark\";\n\nexport {\n getBaseline,\n compareScenarioToBaseline,\n buildStage1Report,\n effectiveBenchmarkFps,\n HEADLESS_LOW_FRAME_THRESHOLD,\n SMOKE_FLOORS,\n type Stage1ScenarioResult,\n type Stage1BrowserReport,\n} from \"./stage1BrowserBench\";\n\nexport {\n evaluateRendererCompare,\n type RendererCompareResult,\n} from \"./rendererBenchmark\";\n","/**\n * TimeScale — business-day / session-aware X mapping for trading charts.\n * Stage 2.1–2.3\n */\n\nexport type TimeScaleCalendar = \"continuous\" | \"business-day\";\nexport type MarketSession = \"24x7\" | \"NYSE\";\n\nexport interface TimeScaleOptions {\n calendar?: TimeScaleCalendar;\n session?: MarketSession;\n /** IANA timezone (reserved for future session-hour filtering) */\n timezone?: string;\n}\n\nexport interface BusinessDayMapping {\n /** X values for chart (consecutive indices on business days) */\n scaledX: Float32Array;\n /** Original timestamp per scaled index (for tooltips / ticks) */\n timeByIndex: Float32Array;\n /** Original index → scaled index (-1 if skipped) */\n sourceToScaled: Int32Array;\n}\n\nconst MS_DAY = 86_400_000;\n\n/** UTC day-of-week: 0 = Sunday, 6 = Saturday */\nfunction dayOfWeekUtc(ts: number): number {\n return new Date(ts).getUTCDay();\n}\n\n/** Weekend check (NYSE calendar MVP — UTC weekends). */\nexport function isBusinessDay(ts: number, _opts: TimeScaleOptions = {}): boolean {\n const dow = dayOfWeekUtc(ts);\n return dow !== 0 && dow !== 6;\n}\n\n/**\n * Map timestamp series to consecutive business-day indices (skips Sat/Sun bars).\n * NaN in scaledX marks non-business bars (hidden gap).\n */\nexport function mapToBusinessDayScale(\n times: Float32Array | Float64Array,\n opts: TimeScaleOptions = {},\n): BusinessDayMapping {\n const calendar = opts.calendar ?? \"business-day\";\n const n = times.length;\n const scaledX = new Float32Array(n);\n const sourceToScaled = new Int32Array(n);\n sourceToScaled.fill(-1);\n\n if (calendar === \"continuous\") {\n for (let i = 0; i < n; i++) {\n scaledX[i] = times[i];\n sourceToScaled[i] = i;\n }\n return {\n scaledX,\n timeByIndex: times instanceof Float32Array ? times : Float32Array.from(times),\n sourceToScaled,\n };\n }\n\n const timeByIndex: number[] = [];\n let logical = 0;\n for (let i = 0; i < n; i++) {\n const t = times[i];\n if (!Number.isFinite(t) || !isBusinessDay(t, opts)) {\n scaledX[i] = Number.NaN;\n continue;\n }\n scaledX[i] = logical;\n timeByIndex[logical] = t;\n sourceToScaled[i] = logical;\n logical++;\n }\n\n return {\n scaledX,\n timeByIndex: Float32Array.from(timeByIndex),\n sourceToScaled,\n };\n}\n\n/** Resolve timestamp at a scaled business-day index (for axis ticks). */\nexport function timeAtBusinessIndex(mapping: BusinessDayMapping, index: number): number | undefined {\n return mapping.timeByIndex[index];\n}\n\n/** Visible span in ms using business-day mapping. */\nexport function businessDaySpanMs(mapping: BusinessDayMapping, xMin: number, xMax: number): number {\n const i0 = Math.max(0, Math.floor(xMin));\n const i1 = Math.min(mapping.timeByIndex.length - 1, Math.ceil(xMax));\n const t0 = mapping.timeByIndex[i0];\n const t1 = mapping.timeByIndex[i1];\n if (t0 == null || t1 == null) return MS_DAY;\n return Math.abs(t1 - t0) || MS_DAY;\n}\n","/**\n * Heikin-Ashi OHLC transform (Stage 2.20).\n */\n\nexport interface OhlcArrays {\n open: Float32Array | Float64Array;\n high: Float32Array | Float64Array;\n low: Float32Array | Float64Array;\n close: Float32Array | Float64Array;\n}\n\nexport function computeHeikinAshi(ohlc: OhlcArrays): OhlcArrays {\n const n = ohlc.close.length;\n const haOpen = new Float32Array(n);\n const haHigh = new Float32Array(n);\n const haLow = new Float32Array(n);\n const haClose = new Float32Array(n);\n\n for (let i = 0; i < n; i++) {\n const o = ohlc.open[i];\n const h = ohlc.high[i];\n const l = ohlc.low[i];\n const c = ohlc.close[i];\n\n haClose[i] = (o + h + l + c) / 4;\n haOpen[i] = i === 0 ? (o + c) / 2 : (haOpen[i - 1] + haClose[i - 1]) / 2;\n haHigh[i] = Math.max(h, haOpen[i], haClose[i]);\n haLow[i] = Math.min(l, haOpen[i], haClose[i]);\n }\n\n return { open: haOpen, high: haHigh, low: haLow, close: haClose };\n}\n"],"names":["WebGPURenderer","canvas","opts","__publicField","gpu","ctx","format","crosshairManifest","CrosshairPlugin","definePlugin","config","showVertical","showHorizontal","color","lineStyle","lineWidth","snapToData","valueFormat","valueDisplayMode","cornerPosition","cursorX","cursorY","overlayId","pluginCtx","overlay","resizeCanvas","event","nearest","render","size","dpr","width","height","plotArea","lineColor","_a","drawFloatingLabels","drawCornerLabels","x","y","bgColor","dataX","dataY","xText","xLabelWidth","xLabelHeight","xLabelX","xLabelY","yText","yLabelWidth","yLabelHeight","yLabelX","yLabelY","xMetrics","yMetrics","maxWidth","padding","lineHeight","boxWidth","boxHeight","boxX","boxY","statsManifest","StatsPlugin","position","show","seriesId","autoUpdate","container","posStyle","updateStats","content","allSeries","targetSeries","s","allY","series","data","stats","computeStats","lines","values","n","sum","min","max","v","mean","sumSq","std","watermarkManifest","WatermarkPlugin","text","fontSize","fontFamily","rotation","ctx2d","gridHighlightManifest","GridHighlightPlugin","xIntervals","yIntervals","opacity","_event","interval","x1","x2","y1","y2","dataLoggerManifest","DataLoggerPlugin","logDataUpdates","logViewChanges","logInteractions","maxEntries","entries","addEntry","type","_ctx","saved","directionIndicatorManifest","DirectionIndicatorPlugin","sampleSize","minVelocity","historySize","idleTimeout","currentDirection","targetSeriesId","positionHistoryX","positionHistoryY","angleHistory","maxHistorySize","timeoutTimer","lastPointTimestamp","lastSeenX","lastSeenY","currentIdleTimeout","updateDirection","age","_pluginCtx","newConfig","canvasSize","totalPoints","lastX","lastY","startIdx","sumT","sumPX","sumPY","sumTPX","sumTPY","sumTT","i","t","pixelX","pixelY","meanT","meanPX","meanPY","denominator","slopePX","slopePY","rawAngle","lastPixelX","lastPixelY","smoothX","average","smoothY","smoothedAngle","smoothAngle","magnitude","val","angles","sumX","sumY","angle","arrowColor","drawArrow","length","triangleHeight","triangleWidth","BuiltinPlugins","manifest","DEFAULT_CONFIG","PluginDragEdit","userConfig","isDragging","draggedPoint","dragStartX","dragStartY","hasMoved","findNearestPoint","mouseX","mouseY","picked","pixelToData","snapToGrid","value","applyConstraints","newX","newY","constraint","validateAndSnap","finalX","finalY","tempPoint","validation","updatePointData","index","_b","_c","createDragEvent","drawPreview","pCtx","coords","origPixelX","origPixelY","currPixelX","currPixelY","api","seriesIds","point","dx","dy","dragEvent","valid","PluginDrawingTools","state","clickHandler","stroke","snapshot","pushUndo","mode","prev","current","a","next","evt","p0","PluginReplay","buffer","timer","speed","frameMs","applyWindow","end","slice","arr","count","d","VERT_SRC","FRAG_SRC","compileShader","gl","source","shader","createProgram","vs","fs","program","buildGridLineVertices","spec","xLines","yLines","y0","x0","vertCount","out","o","WebGLGridSpike","buf","vertices","lineSegments","c","createMinimalMock2D","noop","getCanvas2DContext","makePlotArea","margin","tickPixelLines","_plotArea","xScale","yScale","xTickCount","yTickCount","snapLineCoord","measureFrames","runFrame","frames","samples","t0","b","avg","p95","benchmarkCanvasGrid","options","theme","DARK_THEME","LinearScale","renderer","OverlayRenderer","benchmarkWebGLGrid","spike","compareGridBackends","canvas2d","webgl","gainPercent","getBaseline","baseline","compareScenarioToBaseline","scenarioId","result","failures","threshold","minAllowed","maxAllowed","evaluateRendererCompare","webgpu","webgpuActive","minRatio","ratio","meetsTarget","SeededRandom","seed","generateSineWave","baseValue","noiseValue","generateSquareWave","generateSawtoothWave","generateTriangleWave","generateRandomData","rng","indices","_","sortedX","sortedY","generateCVData","pointsPerCycle","halfCycle","idx","E","E0","scanDirection","peakWidth","exponent","peakCurrent","capacitive","generateNyquistData","logFMin","logFMax","logF","omega","tau","realPart","imagPart","benchmarkRender","chart","fpsHistory","frameTimes","frameCount","resolve","endTime","warmupEndTime","recording","recordingStartTime","frame","now","avgRenderMs","recordElapsedMs","wallFps","renderFps","renderStart","renderEnd","frameTime","recentTimes","avgRecentTime","createSnapshot","compareSnapshots","tolerance","differences","sa","sb","boundsKeys","key","assertPerformance","requirements","waitForFrames","remaining","tick","waitFor","ms","MS_DAY","dayOfWeekUtc","ts","isBusinessDay","_opts","dow","mapToBusinessDayScale","times","calendar","scaledX","sourceToScaled","timeByIndex","logical","businessDaySpanMs","mapping","xMin","xMax","i0","i1","t1","computeHeikinAshi","ohlc","haOpen","haHigh","haLow","haClose","h","l"],"mappings":"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"}
|