scichart-engine 0.4.1 → 0.4.3
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scichart-engine.umd.js","sources":["../src/core/chart/types.ts","../src/analysis/utils.ts","../src/analysis/math.ts","../src/analysis/fitting.ts","../src/analysis/contours.ts","../src/core/EventEmitter.ts","../src/renderer/native/bufferStore.ts","../src/renderer/native/shaderSources.ts","../src/renderer/native/programFactory.ts","../src/renderer/native/utils.ts","../src/renderer/native/draw.ts","../src/renderer/native/renderFrame.ts","../src/renderer/native/textureStore.ts","../src/renderer/native/NativeWebGLRenderer.ts","../src/theme/index.ts","../src/core/OverlayRenderer.ts","../src/core/InteractionManager.ts","../src/core/ChartStatistics.ts","../src/core/annotations/AnnotationManager.ts","../src/core/tooltip/themes.ts","../src/core/tooltip/TooltipPositioner.ts","../src/core/tooltip/TooltipRenderer.ts","../src/core/tooltip/templates/DefaultTemplate.ts","../src/core/tooltip/templates/MinimalTemplate.ts","../src/core/tooltip/templates/CrosshairTemplate.ts","../src/core/tooltip/templates/HeatmapTemplate.ts","../src/core/tooltip/templates/ScientificTemplate.ts","../src/core/tooltip/templates/AnnotationTemplate.ts","../src/core/tooltip/templates/RangeTemplate.ts","../src/core/tooltip/templates/index.ts","../src/core/tooltip/TooltipManager.ts","../src/core/chart/ChartExporter.ts","../src/core/chart/ChartNavigation.ts","../src/core/chart/ChartScaling.ts","../src/core/chart/ChartRenderer.ts","../src/core/series/SeriesBounds.ts","../src/core/series/SeriesDataUtils.ts","../src/core/series/Series.ts","../src/renderer/RendererInterface.ts","../src/renderer/WebGPURenderer.ts","../src/renderer/BarRenderer.ts","../src/renderer/HeatmapRenderer.ts","../src/renderer/CandlestickRenderer.ts","../src/core/chart/series/SeriesBuffer.ts","../src/core/chart/series/SeriesActions.ts","../src/core/chart/series/SeriesFit.ts","../src/scales/index.ts","../src/core/chart/ChartSetup.ts","../src/core/chart/plugins/PluginManager.ts","../src/core/ChartControls.ts","../src/core/ChartLegend.ts","../src/core/chart/ChartUI.ts","../src/core/chart/ChartCore.ts","../src/workers/downsample.ts","../src/streaming/utils.ts","../src/streaming/websocket.ts","../src/streaming/mock.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/useSciChart.ts","../src/react/SciChart.tsx","../src/gpu/resources/bufferStore.ts","../src/gpu/resources/textureStore.ts","../src/gpu/resources/pipelineCache.ts","../src/gpu/adapter/seriesAdapter.ts","../src/gpu/backends/webgpu/pipelines/triangleShader.ts","../src/gpu/backends/webgpu/pipelines/trianglePipeline.ts","../src/gpu/backends/webgpu/shaders/line.wgsl.ts","../src/gpu/backends/webgpu/pipelines/linePipeline.ts","../src/gpu/backends/webgpu/shaders/point.wgsl.ts","../src/gpu/backends/webgpu/pipelines/pointPipeline.ts","../src/gpu/backends/webgpu/pipelines/bandPipeline.ts","../src/gpu/backends/webgpu/shaders/heatmap.wgsl.ts","../src/gpu/backends/webgpu/pipelines/heatmapPipeline.ts","../src/gpu/backends/webgpu/WebGPUBackend.ts","../src/gpu/backends/webgl/shaders.ts","../src/gpu/backends/webgl/programFactory.ts","../src/gpu/backends/webgl/WebGLBackend.ts","../src/gpu/adapter/gpuRenderer.ts","../src/gpu/benchmark/benchmark.ts","../src/gpu/compute/shaders.ts","../src/gpu/compute/gpuCompute.ts"],"sourcesContent":["/**\n * Chart Type Definitions\n *\n * Interfaces for the Chart API and export options.\n */\n\nimport type {\n SeriesOptions,\n HeatmapOptions,\n SeriesUpdateData,\n ZoomOptions,\n CursorOptions,\n ChartEventMap,\n Bounds,\n} from \"../../types\";\nimport type { Series } from \"../Series\";\nimport type { FitType, FitOptions } from \"../../analysis\";\nimport type { Annotation } from \"../annotations\";\nimport * as analysis from \"../../analysis\";\n\n// ============================================\n// Chart Interface\n// ============================================\n\nexport interface Chart {\n addSeries(options: SeriesOptions | HeatmapOptions): void;\n addBar(options: Omit<SeriesOptions, \"type\">): void;\n addHeatmap(options: Omit<HeatmapOptions, \"type\">): void;\n removeSeries(id: string): void;\n updateSeries(id: string, data: SeriesUpdateData): void;\n getSeries(id: string): Series | undefined;\n getAllSeries(): Series[];\n appendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void;\n setAutoScroll(enabled: boolean): void;\n setMaxPoints(id: string, maxPoints: number): void;\n addFitLine(seriesId: string, type: FitType, options?: FitOptions): string;\n zoom(options: ZoomOptions): void;\n pan(deltaX: number, deltaY: number): void;\n resetZoom(): void;\n getViewBounds(): Bounds;\n enableCursor(options: CursorOptions): void;\n disableCursor(): void;\n resize(width?: number, height?: number): void;\n render(): void;\n on<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): void;\n off<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): void;\n destroy(): void;\n exportImage(type?: \"png\" | \"jpeg\"): string;\n autoScale(): void;\n setTheme(theme: string | object): void;\n /** Access to data analysis utilities */\n readonly analysis: typeof analysis;\n // Annotation methods\n addAnnotation(annotation: Annotation): string;\n removeAnnotation(id: string): boolean;\n updateAnnotation(id: string, updates: Partial<Annotation>): void;\n getAnnotation(id: string): Annotation | undefined;\n getAnnotations(): Annotation[];\n clearAnnotations(): void;\n // Export methods\n exportCSV(options?: ExportOptions): string;\n exportJSON(options?: ExportOptions): string;\n /** Attach a plugin to extend chart functionality */\n use(plugin: ChartPlugin): void;\n /** Access to the tooltip system */\n readonly tooltip: import(\"../tooltip\").TooltipManager;\n}\n\nexport interface ChartPlugin {\n name: string;\n init?: (chart: Chart) => void;\n onBeforeRender?: (chart: Chart) => void;\n onAfterRender?: (chart: Chart) => void;\n onSeriesAdded?: (series: Series) => void;\n destroy?: () => void;\n}\n\n/** Options for data export */\nexport interface ExportOptions {\n /** Series IDs to export (default: all) */\n seriesIds?: string[];\n /** Include headers in CSV (default: true) */\n includeHeaders?: boolean;\n /** Decimal precision (default: 6) */\n precision?: number;\n /** CSV delimiter (default: ',') */\n delimiter?: string;\n}\n\n// ============================================\n// Layout Constants\n// ============================================\n\nexport const MARGINS = { top: 20, right: 30, bottom: 55, left: 75 };\n","/**\n * Data Analysis Utilities\n *\n * General-purpose utilities for scientific data formatting,\n * cycle detection, peak detection, and data validation.\n */\n\n// ============================================\n// Unit Prefixes\n// ============================================\n\ntype SIPrefix = 'p' | 'n' | 'µ' | 'm' | '' | 'k' | 'M' | 'G';\n\nexport interface PrefixInfo {\n symbol: SIPrefix;\n factor: number;\n}\n\nconst SI_PREFIXES: PrefixInfo[] = [\n { symbol: 'p', factor: 1e-12 },\n { symbol: 'n', factor: 1e-9 },\n { symbol: 'µ', factor: 1e-6 },\n { symbol: 'm', factor: 1e-3 },\n { symbol: '', factor: 1 },\n { symbol: 'k', factor: 1e3 },\n { symbol: 'M', factor: 1e6 },\n { symbol: 'G', factor: 1e9 },\n];\n\n/**\n * Find the best SI prefix for a value\n */\nexport function getBestPrefix(value: number): PrefixInfo {\n const absValue = Math.abs(value);\n\n if (absValue === 0) {\n return { symbol: '', factor: 1 };\n }\n\n // Find prefix where value becomes 1-999\n for (let i = SI_PREFIXES.length - 1; i >= 0; i--) {\n const prefix = SI_PREFIXES[i];\n const scaled = absValue / prefix.factor;\n if (scaled >= 1 && scaled < 1000) {\n return prefix;\n }\n }\n\n // Default to base unit\n return { symbol: '', factor: 1 };\n}\n\n/**\n * Format a value with automatic SI prefix\n *\n * @example\n * formatWithPrefix(0.000001, 'A') // \"1.00 µA\"\n * formatWithPrefix(0.5, 'V') // \"500 mV\"\n * formatWithPrefix(1500, 'm') // \"1.50 km\"\n */\nexport function formatWithPrefix(\n value: number,\n unit: string,\n decimals = 2\n): string {\n const prefix = getBestPrefix(value);\n const scaled = value / prefix.factor;\n return `${scaled.toFixed(decimals)} ${prefix.symbol}${unit}`;\n}\n\n/**\n * Format a numeric value with specified decimals\n * Automatically switches to scientific notation for very large/small values\n */\nexport function formatValue(value: number, decimals = 3): string {\n if (Math.abs(value) < 0.001 || Math.abs(value) >= 1e6) {\n return value.toExponential(decimals);\n }\n return value.toFixed(decimals);\n}\n\n/**\n * Format value in scientific notation\n */\nexport function formatScientific(value: number, decimals = 2): string {\n return value.toExponential(decimals);\n}\n\n// ============================================\n// Cycle Detection\n// ============================================\n\nexport interface CycleInfo {\n /** Cycle number (1-indexed) */\n number: number;\n /** Start index in data array */\n startIndex: number;\n /** End index in data array */\n endIndex: number;\n /** Direction at start: 1 = forward, -1 = reverse */\n direction: 1 | -1;\n}\n\n/**\n * Detect cycles in oscillating data\n *\n * A cycle is complete when the signal returns to its starting value\n * after going through both sweep directions. Useful for:\n * - Cyclic voltammetry data\n * - Periodic signals\n * - Oscillation analysis\n *\n * @param signal - The signal data (e.g., potential, position, etc.)\n * @param tolerance - How close to starting value to consider a cycle complete\n */\nexport function detectCycles(\n signal: Float32Array | Float64Array | number[],\n tolerance = 0.001\n): CycleInfo[] {\n const data = signal instanceof Array ? new Float32Array(signal) : signal;\n \n if (data.length < 3) return [];\n\n const cycles: CycleInfo[] = [];\n let cycleStart = 0;\n let cycleNumber = 1;\n\n // Determine initial direction\n let prevDirection = Math.sign(data[1] - data[0]);\n let directionChanges = 0;\n\n for (let i = 2; i < data.length; i++) {\n const direction = Math.sign(data[i] - data[i - 1]);\n\n // Skip if no movement\n if (direction === 0) continue;\n\n // Direction change detected\n if (direction !== prevDirection) {\n directionChanges++;\n\n // After 2 direction changes, check if we're back at start\n if (directionChanges >= 2) {\n const startValue = data[cycleStart];\n const currentValue = data[i];\n\n if (Math.abs(currentValue - startValue) < tolerance) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: i,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n\n cycleNumber++;\n cycleStart = i;\n directionChanges = 0;\n }\n }\n\n prevDirection = direction;\n }\n }\n\n // Handle last incomplete cycle\n if (cycleStart < data.length - 1) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: data.length - 1,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n }\n\n return cycles;\n}\n\n/**\n * Generate distinct colors for cycles/series\n *\n * Uses HSL color space to generate evenly distributed hues\n */\nexport function generateCycleColors(count: number): string[] {\n const colors: string[] = [];\n const hueStep = 360 / Math.max(count, 1);\n\n for (let i = 0; i < count; i++) {\n const hue = (i * hueStep) % 360;\n colors.push(`hsl(${hue}, 70%, 55%)`);\n }\n\n return colors;\n}\n\n// ============================================\n// Peak Detection\n// ============================================\n\nexport interface Peak {\n /** Index in data array */\n index: number;\n /** X value at peak */\n x: number;\n /** Y value at peak */\n y: number;\n /** Peak type */\n type: 'max' | 'min';\n /** Prominence of the peak */\n prominence: number;\n}\n\n/**\n * Detect peaks (local maxima and minima) in data\n *\n * Uses simple local extrema detection with optional prominence filtering.\n * Useful for:\n * - Signal peak detection\n * - Finding local maxima/minima\n * - Feature extraction\n *\n * @param x - X values (independent variable)\n * @param y - Y values (dependent variable)\n * @param options - Detection options\n */\nexport function detectPeaks(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n options: {\n /** Minimum prominence to be considered a peak */\n minProminence?: number;\n /** Only return 'max' or 'min' peaks */\n type?: 'max' | 'min' | 'both';\n } = {}\n): Peak[] {\n const { minProminence = 0, type = 'both' } = options;\n const peaks: Peak[] = [];\n\n const xData = x instanceof Array ? new Float32Array(x) : x;\n const yData = y instanceof Array ? new Float32Array(y) : y;\n\n for (let i = 1; i < yData.length - 1; i++) {\n const prev = yData[i - 1];\n const curr = yData[i];\n const next = yData[i + 1];\n\n // Local maximum\n if (curr > prev && curr > next) {\n const prominence = Math.min(curr - prev, curr - next);\n if (prominence >= minProminence && (type === 'both' || type === 'max')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'max', prominence });\n }\n }\n\n // Local minimum\n if (curr < prev && curr < next) {\n const prominence = Math.min(prev - curr, next - curr);\n if (prominence >= minProminence && (type === 'both' || type === 'min')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'min', prominence });\n }\n }\n }\n\n return peaks;\n}\n\n// ============================================\n// Data Validation\n// ============================================\n\nexport interface ValidationResult {\n /** Whether all data is valid */\n valid: boolean;\n /** Number of invalid values (NaN, Infinity, etc.) */\n invalidCount: number;\n /** Index of first invalid value (-1 if all valid) */\n firstInvalidIndex: number;\n}\n\n/**\n * Validate that data contains only finite numbers\n *\n * Checks for NaN, Infinity, and -Infinity values.\n * Useful for data quality checks before rendering.\n */\nexport function validateData(\n data: Float32Array | Float64Array | number[]\n): ValidationResult {\n let invalidCount = 0;\n let firstInvalidIndex = -1;\n\n const arr = data instanceof Array ? data : Array.from(data);\n\n for (let i = 0; i < arr.length; i++) {\n if (!isFinite(arr[i])) {\n invalidCount++;\n if (firstInvalidIndex === -1) {\n firstInvalidIndex = i;\n }\n }\n }\n\n return {\n valid: invalidCount === 0,\n invalidCount,\n firstInvalidIndex,\n };\n}\n\n// ============================================\n// Data Statistics\n// ============================================\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n stdDev: number;\n count: number;\n}\n\n/**\n * Calculate basic statistics for a dataset\n */\nexport function calculateStats(\n data: Float32Array | Float64Array | number[]\n): DataStats {\n const arr = data instanceof Array ? data : Array.from(data);\n const count = arr.length;\n\n if (count === 0) {\n return { min: 0, max: 0, mean: 0, stdDev: 0, count: 0 };\n }\n\n let min = arr[0];\n let max = arr[0];\n let sum = 0;\n\n for (let i = 0; i < count; i++) {\n const val = arr[i];\n if (val < min) min = val;\n if (val > max) max = val;\n sum += val;\n }\n\n const mean = sum / count;\n\n // Calculate standard deviation\n let sumSquaredDiff = 0;\n for (let i = 0; i < count; i++) {\n const diff = arr[i] - mean;\n sumSquaredDiff += diff * diff;\n }\n const stdDev = Math.sqrt(sumSquaredDiff / count);\n\n return { min, max, mean, stdDev, count };\n}\n\n// ============================================\n// Data Smoothing\n// ============================================\n\n/**\n * Apply moving average smoothing to data\n *\n * @param data - Input data array\n * @param windowSize - Number of points to average (must be odd)\n */\nexport function movingAverage(\n data: Float32Array | Float64Array | number[],\n windowSize: number\n): Float32Array {\n const arr = data instanceof Array ? new Float32Array(data) : data;\n const result = new Float32Array(arr.length);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < arr.length; i++) {\n let sum = 0;\n let count = 0;\n\n for (let j = Math.max(0, i - halfWindow); j <= Math.min(arr.length - 1, i + halfWindow); j++) {\n sum += arr[j];\n count++;\n }\n\n result[i] = sum / count;\n }\n\n return result;\n}\n\n/**\n * Downsample data using LTTB (Largest Triangle Three Buckets) algorithm\n *\n * Preserves visual characteristics while reducing point count.\n * Ideal for rendering large datasets efficiently.\n *\n * @param x - X values\n * @param y - Y values\n * @param targetPoints - Desired number of output points\n */\nexport function downsampleLTTB(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): { x: Float32Array; y: Float32Array } {\n const dataLength = x.length;\n\n if (targetPoints >= dataLength || targetPoints < 3) {\n return { x: new Float32Array(x), y: new Float32Array(y) };\n }\n\n const sampledX = new Float32Array(targetPoints);\n const sampledY = new Float32Array(targetPoints);\n\n // Always include first point\n sampledX[0] = x[0];\n sampledY[0] = y[0];\n\n const bucketSize = (dataLength - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let sampledIndex = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket range\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n const nextBucketEnd = Math.min(Math.floor((i + 3) * bucketSize) + 1, dataLength);\n\n // Calculate average of next bucket for comparison\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = bucketEnd; 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 maxAreaIndex = bucketStart;\n\n for (let j = bucketStart; j < bucketEnd && j < dataLength; j++) {\n // Triangle area calculation\n const area = Math.abs(\n (x[a] - avgX) * (y[j] - y[a]) - (x[a] - x[j]) * (avgY - y[a])\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxAreaIndex = j;\n }\n }\n\n sampledX[sampledIndex] = x[maxAreaIndex];\n sampledY[sampledIndex] = y[maxAreaIndex];\n sampledIndex++;\n a = maxAreaIndex;\n }\n\n // Always include last point\n sampledX[targetPoints - 1] = x[dataLength - 1];\n sampledY[targetPoints - 1] = y[dataLength - 1];\n\n return { x: sampledX, y: sampledY };\n}\n\n/**\n * Subtract a linear baseline from data\n * \n * @param x - X data\n * @param y - Y data\n * @param x1 - Start of baseline segment\n * @param x2 - End of baseline segment\n */\nexport function subtractBaseline(\n x: Float32Array | number[],\n y: Float32Array | number[],\n x1: number,\n x2: number\n): Float32Array {\n const n = x.length;\n const result = new Float32Array(n);\n\n // Find points near x1 and x2 to determine baseline\n let i1 = 0, i2 = n - 1;\n let minDist1 = Infinity, minDist2 = Infinity;\n\n for (let i = 0; i < n; i++) {\n const d1 = Math.abs(x[i] - x1);\n const d2 = Math.abs(x[i] - x2);\n if (d1 < minDist1) { minDist1 = d1; i1 = i; }\n if (d2 < minDist2) { minDist2 = d2; i2 = i; }\n }\n\n const y1 = y[i1];\n const y2 = y[i2];\n const slope = (y2 - y1) / (x[i2] - x[i1]);\n const intercept = y1 - slope * x[i1];\n\n for (let i = 0; i < n; i++) {\n result[i] = y[i] - (slope * x[i] + intercept);\n }\n\n return result;\n}\n","/**\n * Mathematical utilities for numerical analysis and regression.\n */\n\n/**\n * Solve a system of linear equations Ax = B using Gaussian elimination with partial pivoting.\n * \n * @param A - Matrix coefficients\n * @param B - Right hand side vector\n * @returns Solution vector x\n */\nexport function solveLinearSystem(A: number[][], B: number[]): number[] {\n const n = B.length;\n const matrix = A.map((row, i) => [...row, B[i]]);\n\n for (let i = 0; i < n; i++) {\n // Partial pivoting\n let maxRow = i;\n for (let k = i + 1; k < n; k++) {\n if (Math.abs(matrix[k][i]) > Math.abs(matrix[maxRow][i])) {\n maxRow = k;\n }\n }\n\n // Swap rows\n const temp = matrix[i];\n matrix[i] = matrix[maxRow];\n matrix[maxRow] = temp;\n\n // Pivot must be non-zero\n const pivot = matrix[i][i];\n if (Math.abs(pivot) < 1e-12) {\n throw new Error(\"Matrix is singular or near-singular\");\n }\n\n // Eliminate below\n for (let k = i + 1; k < n; k++) {\n const factor = matrix[k][i] / pivot;\n for (let j = i; j <= n; j++) {\n matrix[k][j] -= factor * matrix[i][j];\n }\n }\n }\n\n // Back substitution\n const x = new Array(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let sum = 0;\n for (let j = i + 1; j < n; j++) {\n sum += matrix[i][j] * x[j];\n }\n x[i] = (matrix[i][n] - sum) / matrix[i][i];\n }\n\n return x;\n}\n\n/**\n * Calculate R² (coefficient of determination)\n */\nexport function calculateR2(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n fitFn: (x: number) => number\n): number {\n const n = x.length;\n if (n === 0) return 0;\n\n let sumY = 0;\n for (let i = 0; i < n; i++) sumY += y[i];\n const meanY = sumY / n;\n\n let ssTot = 0; // Total sum of squares\n let ssRes = 0; // Residual sum of squares\n\n for (let i = 0; i < n; i++) {\n const yi = y[i];\n const fi = fitFn(x[i]);\n ssTot += (yi - meanY) * (yi - meanY);\n ssRes += (yi - fi) * (yi - fi);\n }\n\n return ssTot === 0 ? 1 : 1 - ssRes / ssTot;\n}\n\n/**\n * Numerical integration using the trapezoidal rule.\n * \n * @param x - X values (must be sorted)\n * @param y - Y values\n * @param xMin - Optional start of integration range\n * @param xMax - Optional end of integration range\n */\nexport function integrate(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n xMin?: number,\n xMax?: number\n): number {\n const n = x.length;\n if (n < 2) return 0;\n\n let area = 0;\n const start = xMin !== undefined ? xMin : x[0];\n const end = xMax !== undefined ? xMax : x[n - 1];\n\n for (let i = 0; i < n - 1; i++) {\n const x1 = x[i];\n const x2 = x[i + 1];\n \n // Skip if outside range\n if (x2 < start) continue;\n if (x1 > end) break;\n\n // Handle partial intervals at boundaries\n const ia = Math.max(x1, start);\n const ib = Math.min(x2, end);\n\n if (ia < ib) {\n // Linear interpolation for y values at boundaries if needed\n const y1 = y[i] + (y[i + 1] - y[i]) * ((ia - x1) / (x2 - x1));\n const y2 = y[i] + (y[i + 1] - y[i]) * ((ib - x1) / (x2 - x1));\n \n area += (ib - ia) * (y1 + y2) / 2;\n }\n }\n\n return area;\n}\n\n/**\n * Calculate numerical derivative dy/dx\n */\nexport function derivative(\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): Float32Array {\n const n = x.length;\n if (n < 2) return new Float32Array(0);\n\n const result = new Float32Array(n);\n for (let i = 0; i < n - 1; i++) {\n const dx = x[i + 1] - x[i];\n result[i] = dx !== 0 ? (y[i + 1] - y[i]) / dx : 0;\n }\n // Last point same as previous for length matching\n result[n - 1] = result[n - 2];\n return result;\n}\n\n/**\n * Calculate cumulative integral (area array)\n */\nexport function cumulativeIntegral(\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): Float32Array {\n const n = x.length;\n if (n < 1) return new Float32Array(0);\n\n const result = new Float32Array(n);\n result[0] = 0;\n \n for (let i = 0; i < n - 1; i++) {\n const dx = x[i + 1] - x[i];\n const area = dx * (y[i] + y[i + 1]) / 2;\n result[i + 1] = result[i] + area;\n }\n \n return result;\n}\n","/**\n * Curve Fitting and Regression Analysis\n */\nimport { solveLinearSystem, calculateR2 } from './math';\n\nexport type FitType = 'linear' | 'polynomial' | 'exponential' | 'logarithmic' | 'power';\n\nexport interface FitOptions {\n /** Degree for polynomial fit (default: 2) */\n degree?: number;\n /** Custom label for the equation */\n label?: string;\n /** Number of decimals in equation string */\n precision?: number;\n}\n\nexport interface FitResult {\n type: FitType;\n /** Coefficients (a, b, c...) */\n coefficients: number[];\n /** Formatted equation string */\n equation: string;\n /** Coefficient of determination */\n rSquared: number;\n /** Function to calculate value at X */\n predict: (x: number) => number;\n}\n\n/**\n * Perform regression on a dataset\n */\nexport function fitData(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n type: FitType,\n options: FitOptions = {}\n): FitResult {\n const n = x.length;\n if (n < 2) throw new Error(\"At least 2 points are required for fitting\");\n\n switch (type) {\n case 'linear':\n return fitLinear(x, y, options);\n case 'polynomial':\n return fitPolynomial(x, y, options.degree ?? 2, options);\n case 'exponential':\n return fitExponential(x, y, options);\n case 'logarithmic':\n return fitLogarithmic(x, y, options);\n case 'power':\n return fitPower(x, y, options);\n default:\n throw new Error(`Unsupported fit type: ${type}`);\n }\n}\n\nfunction fitLinear(x: any, y: any, opts: FitOptions): FitResult {\n const n = x.length;\n let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 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 sumX2 += x[i] * x[i];\n }\n\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n const predict = (v: number) => slope * v + intercept;\n const prec = opts.precision ?? 4;\n \n return {\n type: 'linear',\n coefficients: [slope, intercept],\n equation: `y = ${slope.toFixed(prec)}x ${intercept >= 0 ? '+' : '-'} ${Math.abs(intercept).toFixed(prec)}`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPolynomial(x: any, y: any, degree: number, opts: FitOptions): FitResult {\n const n = x.length;\n const m = degree + 1;\n const A: number[][] = Array.from({ length: m }, () => new Array(m).fill(0));\n const B: number[] = new Array(m).fill(0);\n\n // Normal equations for least squares polynomial fit\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < m; j++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += Math.pow(x[k], i + j);\n }\n A[i][j] = sum;\n }\n\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += y[k] * Math.pow(x[k], i);\n }\n B[i] = sum;\n }\n\n const coeffs = solveLinearSystem(A, B); // c0, c1, c2...\n\n const predict = (v: number) => {\n let res = 0;\n for (let i = 0; i < coeffs.length; i++) {\n res += coeffs[i] * Math.pow(v, i);\n }\n return res;\n };\n\n const prec = opts.precision ?? 4;\n let equation = \"y = \";\n for (let i = coeffs.length - 1; i >= 0; i--) {\n const c = coeffs[i];\n if (i < coeffs.length - 1) equation += c >= 0 ? \" + \" : \" - \";\n else if (c < 0) equation += \"-\";\n \n equation += `${Math.abs(c).toFixed(prec)}${i > 0 ? (i > 1 ? `x^${i}` : 'x') : ''}`;\n }\n\n return {\n type: 'polynomial',\n coefficients: coeffs,\n equation,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitExponential(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * e^(bx) => ln(y) = ln(a) + bx\n // Use linear fit on (x, ln(y))\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (y[i] > 0) {\n xPrime.push(x[i]);\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.exp(b * v);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'exponential',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} * e^(${b.toFixed(prec)}x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitLogarithmic(x: any, y: any, opts: FitOptions): FitResult {\n // y = a + b * ln(x)\n // Use linear fit on (ln(x), y)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(y[i]);\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = result.coefficients[1];\n\n const predict = (v: number) => a + b * Math.log(v);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'logarithmic',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} ${b >= 0 ? '+' : '-'} ${Math.abs(b).toFixed(prec)} * ln(x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPower(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * x^b => ln(y) = ln(a) + b * ln(x)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0 && y[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.pow(v, b);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'power',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} * x^(${b.toFixed(prec)})`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n","/**\n * Contour Plot Generation (Marching Squares)\n */\n\nexport interface ContourPoint {\n x: number;\n y: number;\n}\n\nexport interface ContourLine {\n level: number;\n points: ContourPoint[];\n}\n\nexport interface ContourOptions {\n levels?: number[];\n numLevels?: number;\n}\n\n/**\n * Generate contour lines from a 2D grid of values\n * Values are assumed to be in row-major order: z = values[y * width + x]\n */\nexport function generateContours(\n z: Float32Array | number[],\n xValues: Float32Array | number[],\n yValues: Float32Array | number[],\n options: ContourOptions = {}\n): ContourLine[] {\n const width = xValues.length;\n const height = yValues.length;\n \n const minZ = Math.min(...z);\n const maxZ = Math.max(...z);\n \n const levels = options.levels || calculateLevels(minZ, maxZ, options.numLevels || 10);\n const result: ContourLine[] = [];\n\n for (const level of levels) {\n const segments: Array<[number, number, number, number]> = [];\n \n // Process each cell\n for (let y = 0; y < height - 1; y++) {\n for (let x = 0; x < width - 1; x++) {\n const v0 = z[y * width + x];\n const v1 = z[y * width + (x + 1)];\n const v2 = z[(y + 1) * width + (x + 1)];\n const v3 = z[(y + 1) * width + x];\n \n processCell(x, y, v0, v1, v2, v3, level, xValues, yValues, segments);\n }\n }\n \n if (segments.length > 0) {\n // For simplicity, we return points as a flat array of segments\n // In a real implementation, we would join them into polylines\n const points: ContourPoint[] = [];\n for (const seg of segments) {\n points.push({ x: seg[0], y: seg[1] });\n points.push({ x: seg[2], y: seg[3] });\n }\n result.push({ level, points });\n }\n }\n\n return result;\n}\n\nfunction calculateLevels(min: number, max: number, n: number): number[] {\n const levels = [];\n const step = (max - min) / (n + 1);\n for (let i = 1; i <= n; i++) {\n levels.push(min + i * step);\n }\n return levels;\n}\n\n/**\n * Process a single cell using Marching Squares\n */\nfunction processCell(\n x: number, y: number,\n v0: number, v1: number, v2: number, v3: number,\n level: number,\n xScale: any, yScale: any,\n segments: Array<[number, number, number, number]>\n) {\n let caseIndex = 0;\n if (v0 >= level) caseIndex |= 1;\n if (v1 >= level) caseIndex |= 2;\n if (v2 >= level) caseIndex |= 4;\n if (v3 >= level) caseIndex |= 8;\n\n if (caseIndex === 0 || caseIndex === 15) return;\n\n // Interpolation helpers\n const lerp = (v0: number, v1: number, t: number) => v0 + (v1 - v0) * t;\n const getT = (v0: number, v1: number) => (level - v0) / (v1 - v0);\n\n // Edges: 0 (top), 1 (right), 2 (bottom), 3 (left)\n const getPoint = (edge: number): [number, number] => {\n switch (edge) {\n case 0: return [lerp(xScale[x], xScale[x + 1], getT(v0, v1)), yScale[y]];\n case 1: return [xScale[x + 1], lerp(yScale[y], yScale[y + 1], getT(v1, v2))];\n case 2: return [lerp(xScale[x], xScale[x + 1], getT(v3, v2)), yScale[y + 1]];\n case 3: return [xScale[x], lerp(yScale[y], yScale[y + 1], getT(v0, v3))];\n default: return [0, 0];\n }\n };\n\n const addSeg = (e1: number, e2: number) => {\n const p1 = getPoint(e1);\n const p2 = getPoint(e2);\n segments.push([p1[0], p1[1], p2[0], p2[1]]);\n };\n\n // Case table\n switch (caseIndex) {\n case 1: case 14: addSeg(0, 3); break;\n case 2: case 13: addSeg(0, 1); break;\n case 3: case 12: addSeg(1, 3); break;\n case 4: case 11: addSeg(1, 2); break;\n case 5: addSeg(0, 1); addSeg(2, 3); break; // Ambiguous\n case 6: case 9: addSeg(0, 2); break;\n case 7: case 8: addSeg(2, 3); break;\n case 10: addSeg(0, 3); addSeg(1, 2); break; // Ambiguous\n }\n}\n","/**\n * Type-safe event emitter for chart events\n */\n\nexport class EventEmitter<EventMap extends object> {\n private listeners: Map<keyof EventMap, Set<(data: unknown) => void>> =\n new Map();\n\n /**\n * Subscribe to an event\n */\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler as (data: unknown) => void);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler as (data: unknown) => void);\n }\n }\n\n /**\n * Emit an event with data\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`[EventEmitter] Error in handler for \"${String(event)}\":`, error);\n }\n });\n }\n }\n\n /**\n * Subscribe to an event once\n */\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const wrappedHandler = (data: EventMap[K]) => {\n this.off(event, wrappedHandler);\n handler(data);\n };\n this.on(event, wrappedHandler);\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Get listener count for an event\n */\n listenerCount(event: keyof EventMap): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","export class BufferStore {\n private buffers: Map<string, WebGLBuffer> = new Map();\n private bufferSizes: Map<string, number> = new Map();\n\n constructor(private gl: WebGLRenderingContext) {}\n\n createBuffer(id: string, data: Float32Array): void {\n const { gl } = this;\n let buffer = this.buffers.get(id);\n const currentSize = this.bufferSizes.get(id) || 0;\n\n if (buffer && data.byteLength <= currentSize) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);\n return;\n }\n\n if (buffer) gl.deleteBuffer(buffer);\n\n buffer = gl.createBuffer();\n if (!buffer) throw new Error(\"Failed to create buffer\");\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n\n this.buffers.set(id, buffer);\n this.bufferSizes.set(id, data.byteLength);\n }\n\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n const { gl } = this;\n const buffer = this.buffers.get(id);\n const currentSize = this.bufferSizes.get(id) || 0;\n\n if (!buffer || offsetInBytes + data.byteLength > currentSize) return false;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, offsetInBytes, data);\n return true;\n }\n\n getBuffer(id: string): WebGLBuffer | undefined {\n return this.buffers.get(id);\n }\n\n deleteBuffer(id: string): void {\n const buffer = this.buffers.get(id);\n if (!buffer) return;\n\n this.gl.deleteBuffer(buffer);\n this.buffers.delete(id);\n this.bufferSizes.delete(id);\n }\n\n destroy(): void {\n this.buffers.forEach((buffer) => this.gl.deleteBuffer(buffer));\n this.buffers.clear();\n this.bufferSizes.clear();\n }\n}\n","// Shader Sources\n\nexport const LINE_VERT = `\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nexport const LINE_FRAG = `\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n`;\n\nexport const POINT_VERT = `\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n`;\n\nexport const POINT_FRAG = `\nprecision highp float;\nuniform vec4 uColor;\nuniform int uSymbol;\n\nfloat sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n\nfloat sdTriangle(vec2 p, float r) {\n const float k = sqrt(3.0);\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n p.x -= clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfloat sdDiamond(vec2 p, float r) {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfloat sdCross(vec2 p, float r, float thickness) {\n vec2 d = abs(p);\n float s1 = sdBox(d, vec2(r, thickness));\n float s2 = sdBox(d, vec2(thickness, r));\n return min(s1, s2);\n}\n\nfloat sdX(vec2 p, float r, float thickness) {\n float c = cos(0.785398);\n float s = sin(0.785398);\n mat2 m = mat2(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfloat sdStar(vec2 p, float r, float rf) {\n const vec2 k1 = vec2(0.80901699, -0.58778525);\n const vec2 k2 = vec2(-k1.x, k1.y);\n p.x = abs(p.x);\n p -= 2.0 * max(dot(k1, p), 0.0) * k1;\n p -= 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y -= r;\n vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0, 1);\n float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\nvoid main() {\n vec2 p = gl_PointCoord - vec2(0.5);\n float d = 0.0;\n\n if (uSymbol == 0) {\n d = sdCircle(p, 0.45);\n } else if (uSymbol == 1) {\n d = sdBox(p, vec2(0.35));\n } else if (uSymbol == 2) {\n d = sdDiamond(p, 0.45);\n } else if (uSymbol == 3) {\n d = sdTriangle(vec2(p.x, p.y + 0.1), 0.4);\n } else if (uSymbol == 4) {\n d = sdTriangle(vec2(p.x, -p.y + 0.1), 0.4);\n } else if (uSymbol == 5) {\n d = sdCross(p, 0.45, 0.15);\n } else if (uSymbol == 6) {\n d = sdX(p, 0.45, 0.15);\n } else if (uSymbol == 7) {\n d = sdStar(p, 0.45, 0.4);\n }\n\n if (d > 0.02) discard;\n\n float alpha = 1.0 - smoothstep(0.0, 0.02, d);\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n`;\n\nexport const HEATMAP_VERT = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute float aValue;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying float vValue;\n\nvoid main() {\n gl_Position = vec4(aPosition * uScale + uTranslate, 0.0, 1.0);\n vValue = aValue;\n}\n`;\n\nexport const HEATMAP_FRAG = `\nprecision highp float;\nvarying float vValue;\nuniform float uMinValue;\nuniform float uMaxValue;\nuniform sampler2D uColormap;\n\nvoid main() {\n float range = uMaxValue - uMinValue;\n float t = (vValue - uMinValue) / (range != 0.0 ? range : 1.0);\n t = clamp(t, 0.0, 1.0);\n gl_FragColor = texture2D(uColormap, vec2(t, 0.5));\n}\n`;\n","import type { ProgramBundle, ProgramMode, ShaderProgram } from \"./types\";\nimport {\n HEATMAP_FRAG,\n HEATMAP_VERT,\n LINE_FRAG,\n LINE_VERT,\n POINT_FRAG,\n POINT_VERT,\n} from \"./shaderSources\";\n\nfunction createShader(\n gl: WebGLRenderingContext,\n source: string,\n type: number\n): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"Failed to create shader\");\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const error = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compilation error: ${error}`);\n }\n\n return shader;\n}\n\nfunction createProgram(\n gl: WebGLRenderingContext,\n vertSource: string,\n fragSource: string,\n mode: ProgramMode\n): ShaderProgram {\n const vertShader = createShader(gl, vertSource, gl.VERTEX_SHADER);\n const fragShader = createShader(gl, fragSource, gl.FRAGMENT_SHADER);\n\n const program = gl.createProgram();\n if (!program) throw new Error(\"Failed to create program\");\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const error = gl.getProgramInfoLog(program);\n throw new Error(`Program link error: ${error}`);\n }\n\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n return {\n program,\n attributes: {\n position: gl.getAttribLocation(\n program,\n mode === \"heatmap\" ? \"aPosition\" : \"position\"\n ),\n value: mode === \"heatmap\" ? gl.getAttribLocation(program, \"aValue\") : -1,\n },\n uniforms: {\n uScale: gl.getUniformLocation(program, \"uScale\")!,\n uTranslate: gl.getUniformLocation(program, \"uTranslate\")!,\n uColor:\n mode !== \"heatmap\" ? gl.getUniformLocation(program, \"uColor\") : null,\n uPointSize:\n mode === \"point\" ? gl.getUniformLocation(program, \"uPointSize\") : null,\n uSymbol:\n mode === \"point\" ? gl.getUniformLocation(program, \"uSymbol\") : null,\n uMinValue:\n mode === \"heatmap\" ? gl.getUniformLocation(program, \"uMinValue\") : null,\n uMaxValue:\n mode === \"heatmap\" ? gl.getUniformLocation(program, \"uMaxValue\") : null,\n uColormap:\n mode === \"heatmap\" ? gl.getUniformLocation(program, \"uColormap\") : null,\n },\n };\n}\n\nexport function createProgramBundle(gl: WebGLRenderingContext): ProgramBundle {\n return {\n lineProgram: createProgram(gl, LINE_VERT, LINE_FRAG, \"line\"),\n pointProgram: createProgram(gl, POINT_VERT, POINT_FRAG, \"point\"),\n heatmapProgram: createProgram(gl, HEATMAP_VERT, HEATMAP_FRAG, \"heatmap\"),\n };\n}\n","export function parseColor(color: string): [number, number, number, number] {\n if (!color) return [1, 0, 1, 1];\n \n if (color.startsWith(\"#\")) {\n const hex = color.slice(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16) / 255;\n const g = parseInt(hex[1] + hex[1], 16) / 255;\n const b = parseInt(hex[2] + hex[2], 16) / 255;\n return [r, g, b, 1];\n } else if (hex.length === 6) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n return [r, g, b, 1];\n } else if (hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n return [r, g, b, a];\n }\n }\n\n if (color.startsWith(\"rgb\")) {\n const matches = color.match(/[\\d.]+/g);\n if (matches && matches.length >= 3) {\n const r = parseFloat(matches[0]) / 255;\n const g = parseFloat(matches[1]) / 255;\n const b = parseFloat(matches[2]) / 255;\n const a = matches.length >= 4 ? parseFloat(matches[3]) : 1;\n return [r, g, b, a];\n }\n }\n\n return [1, 0, 1, 1];\n}\n\nexport function interleaveData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[]\n): Float32Array {\n const length = Math.min(x.length, y.length);\n const result = new Float32Array(length * 2);\n\n for (let i = 0; i < length; i++) {\n result[i * 2] = x[i];\n result[i * 2 + 1] = y[i];\n }\n\n return result;\n}\n\nexport function interleaveStepData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n mode: \"before\" | \"after\" | \"center\" = \"after\"\n): Float32Array {\n const length = Math.min(x.length, y.length);\n if (length < 2) {\n return interleaveData(x, y);\n }\n\n const stepCount = mode === \"center\" ? 1 + (length - 1) * 3 : length * 2 - 1;\n const result = new Float32Array(stepCount * 2);\n\n let resultIdx = 0;\n\n for (let i = 0; i < length; i++) {\n if (i === 0) {\n result[resultIdx++] = x[0];\n result[resultIdx++] = y[0];\n } else {\n const prevX = x[i - 1];\n const prevY = y[i - 1];\n const currX = x[i];\n const currY = y[i];\n\n if (mode === \"after\") {\n result[resultIdx++] = currX;\n result[resultIdx++] = prevY;\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n } else if (mode === \"before\") {\n result[resultIdx++] = prevX;\n result[resultIdx++] = currY;\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n } else {\n const midX = (prevX + currX) / 2;\n result[resultIdx++] = midX;\n result[resultIdx++] = prevY;\n result[resultIdx++] = midX;\n result[resultIdx++] = currY;\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n }\n }\n }\n\n return result.subarray(0, resultIdx);\n}\n\nexport function interleaveBandData(\n x: Float32Array | Float64Array | number[],\n y1: Float32Array | Float64Array | number[],\n y2: Float32Array | Float64Array | number[]\n): Float32Array {\n const n = Math.min(x.length, y1.length, y2.length);\n const result = new Float32Array(n * 2 * 2);\n\n for (let i = 0; i < n; i++) {\n const idx = i * 4;\n const xi = x[i];\n result[idx + 0] = xi;\n result[idx + 1] = y1[i];\n result[idx + 2] = xi;\n result[idx + 3] = y2[i];\n }\n return result;\n}\n","import type { Bounds } from \"../../types\";\nimport type { ShaderProgram } from \"./types\";\nimport { parseColor } from \"./utils\";\n\nexport function calculateUniforms(bounds: Bounds): {\n scale: [number, number];\n translate: [number, number];\n} {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n}\n\nexport function renderLine(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.LINE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.position);\n}\n\nexport function renderBand(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n\n const alpha = color[3] * 0.4;\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], alpha);\n\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.position);\n}\n\nexport function renderPoints(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n pointSize: number,\n symbol: string = \"circle\"\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n if (prog.uniforms.uPointSize)\n gl.uniform1f(prog.uniforms.uPointSize, pointSize);\n\n if (prog.uniforms.uSymbol) {\n const symbolMap: Record<string, number> = {\n circle: 0,\n square: 1,\n diamond: 2,\n triangle: 3,\n triangleDown: 4,\n cross: 5,\n x: 6,\n star: 7,\n };\n gl.uniform1i(prog.uniforms.uSymbol, symbolMap[symbol] ?? 0);\n }\n\n gl.drawArrays(gl.POINTS, 0, count);\n gl.disableVertexAttribArray(prog.attributes.position);\n}\n\nexport function renderHeatmap(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n zBounds: { min: number; max: number } = { min: 0, max: 1 },\n texture?: WebGLTexture\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 12, 0);\n\n if (prog.attributes.value !== undefined && prog.attributes.value !== -1) {\n gl.enableVertexAttribArray(prog.attributes.value);\n gl.vertexAttribPointer(prog.attributes.value, 1, gl.FLOAT, false, 12, 8);\n }\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n\n if (prog.uniforms.uMinValue)\n gl.uniform1f(prog.uniforms.uMinValue, zBounds.min);\n if (prog.uniforms.uMaxValue)\n gl.uniform1f(prog.uniforms.uMaxValue, zBounds.max);\n\n if (texture && prog.uniforms.uColormap) {\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1i(prog.uniforms.uColormap, 0);\n } else if (prog.uniforms.uColormap) {\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.position);\n if (prog.attributes.value !== undefined && prog.attributes.value !== -1) {\n gl.disableVertexAttribArray(prog.attributes.value);\n }\n}\n\nexport function renderBar(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n gl.disableVertexAttribArray(prog.attributes.position);\n}\n\nexport function computeSeriesColor(\n style: any\n): [number, number, number, number] {\n const color = parseColor(style.color ?? \"#ff0055\");\n color[3] = style.opacity ?? 1;\n return color;\n}\n","import type {\n NativeRenderOptions,\n NativeSeriesRenderData,\n ProgramBundle,\n} from \"./types\";\nimport {\n calculateUniforms,\n computeSeriesColor,\n renderBand,\n renderBar,\n renderHeatmap,\n renderLine,\n renderPoints,\n} from \"./draw\";\n\nexport function renderFrame(\n gl: WebGLRenderingContext,\n canvas: HTMLCanvasElement,\n dpr: number,\n programs: ProgramBundle,\n series: NativeSeriesRenderData[],\n options: NativeRenderOptions\n): void {\n const { bounds, backgroundColor = [0.1, 0.1, 0.18, 1], plotArea } = options;\n\n const canvasHeight = canvas.height;\n const canvasWidth = canvas.width;\n\n const pa = plotArea\n ? {\n x: plotArea.x * dpr,\n y: canvasHeight - (plotArea.y + plotArea.height) * dpr,\n width: plotArea.width * dpr,\n height: plotArea.height * dpr,\n }\n : {\n x: 0,\n y: 0,\n width: canvasWidth,\n height: canvasHeight,\n };\n\n gl.viewport(0, 0, canvasWidth, canvasHeight);\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.viewport(pa.x, pa.y, pa.width, pa.height);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(pa.x, pa.y, pa.width, pa.height);\n\n const uniforms = calculateUniforms(bounds);\n\n for (const s of series) {\n if (!s.visible || s.count === 0) continue;\n\n const yMin = s.yBounds ? s.yBounds.min : bounds.yMin;\n const yMax = s.yBounds ? s.yBounds.max : bounds.yMax;\n const yRange = yMax - yMin;\n\n const yScale = yRange > 0 ? 2 / yRange : 1;\n const yTrans = -1 - yMin * yScale;\n\n const seriesUniforms = {\n scale: [uniforms.scale[0], yScale] as [number, number],\n translate: [uniforms.translate[0], yTrans] as [number, number],\n };\n\n const color = computeSeriesColor(s.style);\n\n if (s.type === \"scatter\") {\n renderPoints(\n gl,\n programs.pointProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * dpr,\n s.style.symbol\n );\n } else if (s.type === \"line\") {\n renderLine(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n } else if (s.type === \"line+scatter\") {\n renderLine(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n renderPoints(\n gl,\n programs.pointProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * dpr,\n s.style.symbol\n );\n } else if (s.type === \"step\" || s.type === \"step+scatter\") {\n if (s.stepBuffer && s.stepCount) {\n renderLine(\n gl,\n programs.lineProgram,\n s.stepBuffer,\n s.stepCount,\n seriesUniforms,\n color\n );\n } else {\n renderLine(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n }\n\n if (s.type === \"step+scatter\") {\n renderPoints(\n gl,\n programs.pointProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * dpr,\n s.style.symbol\n );\n }\n } else if (s.type === \"band\") {\n renderBand(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n } else if (s.type === \"heatmap\") {\n renderHeatmap(\n gl,\n programs.heatmapProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n s.zBounds,\n s.colormapTexture\n );\n } else if (s.type === \"bar\") {\n renderBar(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n }\n }\n}\n","export class TextureStore {\n private textures: Map<string, WebGLTexture> = new Map();\n\n constructor(private gl: WebGLRenderingContext) {}\n\n createColormapTexture(id: string, data: Uint8Array): WebGLTexture {\n const { gl } = this;\n let texture = this.textures.get(id);\n\n if (!texture) {\n texture = gl.createTexture()!;\n this.textures.set(id, texture);\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n data.length / 4,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n data\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n return texture;\n }\n\n getTexture(id: string): WebGLTexture | undefined {\n return this.textures.get(id);\n }\n\n destroy(): void {\n this.textures.forEach((t) => this.gl.deleteTexture(t));\n this.textures.clear();\n }\n}\n","import { BufferStore } from \"./bufferStore\";\nimport { createProgramBundle } from \"./programFactory\";\nimport { renderFrame } from \"./renderFrame\";\nimport { TextureStore } from \"./textureStore\";\nimport type {\n NativeRenderOptions,\n NativeSeriesRenderData,\n ProgramBundle,\n} from \"./types\";\n\nexport class NativeWebGLRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGLRenderingContext;\n private dpr: number;\n\n private programs: ProgramBundle;\n private buffers: BufferStore;\n private textures: TextureStore;\n\n private isInitialized = false;\n\n setDPR(dpr: number): void {\n this.dpr = dpr;\n this.resize();\n }\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas = canvas;\n this.dpr = window.devicePixelRatio || 1;\n\n const gl = canvas.getContext(\"webgl\", {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: true,\n powerPreference: \"high-performance\",\n });\n\n if (!gl) throw new Error(\"WebGL not supported\");\n\n this.gl = gl;\n this.programs = createProgramBundle(gl);\n this.buffers = new BufferStore(gl);\n this.textures = new TextureStore(gl);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.isInitialized = true;\n }\n\n get available(): boolean {\n return this.isInitialized;\n }\n\n createBuffer(id: string, data: Float32Array): void {\n this.buffers.createBuffer(id, data);\n }\n\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n return this.buffers.updateBuffer(id, data, offsetInBytes);\n }\n\n getBuffer(id: string): WebGLBuffer | undefined {\n return this.buffers.getBuffer(id);\n }\n\n deleteBuffer(id: string): void {\n this.buffers.deleteBuffer(id);\n }\n\n createColormapTexture(id: string, data: Uint8Array): WebGLTexture {\n return this.textures.createColormapTexture(id, data);\n }\n\n getTexture(id: string): WebGLTexture | undefined {\n return this.textures.getTexture(id);\n }\n\n render(series: NativeSeriesRenderData[], options: NativeRenderOptions): void {\n if (!this.isInitialized) return;\n renderFrame(this.gl, this.canvas, this.dpr, this.programs, series, options);\n }\n\n resize(): void {\n const rect = this.canvas.getBoundingClientRect();\n const width = rect.width * this.dpr;\n const height = rect.height * this.dpr;\n\n if (this.canvas.width !== width || this.canvas.height !== height) {\n this.canvas.width = width;\n this.canvas.height = height;\n this.gl.viewport(0, 0, width, height);\n }\n }\n\n getLimits() {\n const { gl } = this;\n return {\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS),\n renderer: gl.getParameter(gl.RENDERER),\n vendor: gl.getParameter(gl.VENDOR),\n };\n }\n\n destroy(): void {\n const { gl } = this;\n\n this.buffers.destroy();\n this.textures.destroy();\n\n gl.deleteProgram(this.programs.lineProgram.program);\n gl.deleteProgram(this.programs.pointProgram.program);\n gl.deleteProgram(this.programs.heatmapProgram.program);\n\n this.isInitialized = false;\n }\n}\n\nexport type { NativeSeriesRenderData, NativeRenderOptions } from \"./types\";\n","/**\n * Theme - Visual styling configuration for SciChart\n *\n * Provides customizable themes for the chart including:\n * - Grid styling\n * - Axis styling\n * - Legend styling\n * - Cursor styling\n */\n\n// ============================================\n// Theme Types\n// ============================================\n\nexport interface GridTheme {\n /** Grid visibility */\n visible: boolean;\n /** Major grid line color */\n majorColor: string;\n /** Minor grid line color */\n minorColor: string;\n /** Major grid line width */\n majorWidth: number;\n /** Minor grid line width */\n minorWidth: number;\n /** Line dash pattern for major lines [dash, gap] */\n majorDash: number[];\n /** Line dash pattern for minor lines [dash, gap] */\n minorDash: number[];\n /** Show minor grid lines */\n showMinor: boolean;\n /** Number of minor divisions between major lines */\n minorDivisions: number;\n}\n\nexport interface AxisTheme {\n /** Axis line color */\n lineColor: string;\n /** Axis line width */\n lineWidth: number;\n /** Tick mark color */\n tickColor: string;\n /** Tick mark length */\n tickLength: number;\n /** Label color */\n labelColor: string;\n /** Label font size */\n labelSize: number;\n /** Axis title color */\n titleColor: string;\n /** Axis title font size */\n titleSize: number;\n /** Font family */\n fontFamily: string;\n}\n\nexport interface LegendTheme {\n /** Legend visibility */\n visible: boolean;\n /** Position */\n position: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Background color */\n backgroundColor: string;\n /** Border color */\n borderColor: string;\n /** Border radius */\n borderRadius: number;\n /** Text color */\n textColor: string;\n /** Font size */\n fontSize: number;\n /** Font family */\n fontFamily: string;\n /** Padding inside legend */\n padding: number;\n /** Gap between items */\n itemGap: number;\n /** Color swatch size */\n swatchSize: number;\n}\n\nexport interface CursorTheme {\n /** Cursor line color */\n lineColor: string;\n /** Cursor line width */\n lineWidth: number;\n /** Cursor line dash pattern */\n lineDash: number[];\n /** Tooltip background color */\n tooltipBackground: string;\n /** Tooltip border color */\n tooltipBorder: string;\n /** Tooltip text color */\n tooltipColor: string;\n /** Tooltip font size */\n tooltipSize: number;\n}\n\nexport interface ChartTheme {\n /** Theme name */\n name: string;\n /** Background color */\n backgroundColor: string;\n /** Plot area border color */\n plotBorderColor: string;\n /** Grid theme */\n grid: GridTheme;\n /** X-axis theme */\n xAxis: AxisTheme;\n /** Y-axis theme */\n yAxis: AxisTheme;\n /** Legend theme */\n legend: LegendTheme;\n /** Cursor theme */\n cursor: CursorTheme;\n}\n\n// ============================================\n// Default Themes\n// ============================================\n\nconst DEFAULT_AXIS_THEME: AxisTheme = {\n lineColor: \"#666666\", // Brighter\n lineWidth: 1,\n tickColor: \"#888888\", // Brighter\n tickLength: 6,\n labelColor: \"#cccccc\", // Brighter\n labelSize: 12, // Larger\n titleColor: \"#ffffff\", // Brighter\n titleSize: 14, // Larger\n fontFamily: \"Inter, system-ui, sans-serif\",\n};\n\nconst DEFAULT_GRID_THEME: GridTheme = {\n visible: true,\n majorColor: \"rgba(255, 255, 255, 0.12)\", // Higher opacity\n minorColor: \"rgba(255, 255, 255, 0.05)\",\n majorWidth: 1,\n minorWidth: 0.5,\n majorDash: [4, 4],\n minorDash: [2, 4],\n showMinor: true, // Default to show minor\n minorDivisions: 5,\n};\n\nconst DEFAULT_LEGEND_THEME: LegendTheme = {\n visible: true,\n position: \"top-right\",\n backgroundColor: \"rgba(20, 20, 30, 0.9)\",\n borderColor: \"rgba(255, 255, 255, 0.15)\",\n borderRadius: 6,\n textColor: \"#ffffff\",\n fontSize: 11,\n fontFamily: \"Inter, system-ui, sans-serif\",\n padding: 5,\n itemGap: 3,\n swatchSize: 12,\n};\n\nconst DEFAULT_CURSOR_THEME: CursorTheme = {\n lineColor: \"rgba(255, 255, 255, 0.5)\",\n lineWidth: 1,\n lineDash: [5, 5],\n tooltipBackground: \"rgba(20, 20, 30, 0.95)\",\n tooltipBorder: \"rgba(255, 255, 255, 0.2)\",\n tooltipColor: \"#ffffff\",\n tooltipSize: 11,\n};\n\n// ============================================\n// Preset Themes\n// ============================================\n\nexport const DARK_THEME: ChartTheme = {\n name: \"dark\",\n backgroundColor: \"#0b0e14\",\n plotBorderColor: \"#444c56\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(255, 255, 255, 0.12)\",\n minorColor: \"rgba(255, 255, 255, 0.04)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n labelColor: \"#adbac7\",\n titleColor: \"#cdd9e5\",\n lineColor: \"#444c56\",\n tickColor: \"#444c56\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n labelColor: \"#adbac7\",\n titleColor: \"#cdd9e5\",\n lineColor: \"#444c56\",\n tickColor: \"#444c56\",\n },\n legend: DEFAULT_LEGEND_THEME,\n cursor: DEFAULT_CURSOR_THEME,\n};\n\nexport const MIDNIGHT_THEME: ChartTheme = {\n name: \"midnight\",\n backgroundColor: \"#05050a\",\n plotBorderColor: \"#3a3a5a\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(150, 150, 255, 0.2)\",\n minorColor: \"rgba(150, 150, 255, 0.08)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#5a5a8a\",\n labelColor: \"#b0b0e0\",\n titleColor: \"#d0d0f0\",\n tickColor: \"#5a5a8a\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#5a5a8a\",\n labelColor: \"#b0b0e0\",\n titleColor: \"#d0d0f0\",\n tickColor: \"#5a5a8a\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(15, 15, 30, 0.95)\",\n borderColor: \"rgba(100, 100, 255, 0.4)\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(150, 150, 255, 0.7)\",\n },\n};\n\n/** Light theme - Clean white background */\nexport const LIGHT_THEME: ChartTheme = {\n name: \"light\",\n backgroundColor: \"#ffffff\",\n plotBorderColor: \"#cccccc\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(0, 0, 0, 0.1)\",\n minorColor: \"rgba(0, 0, 0, 0.04)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#888888\",\n tickColor: \"#888888\",\n labelColor: \"#444444\",\n titleColor: \"#222222\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#888888\",\n tickColor: \"#888888\",\n labelColor: \"#444444\",\n titleColor: \"#222222\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n borderColor: \"rgba(0, 0, 0, 0.15)\",\n textColor: \"#222222\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(0, 0, 0, 0.4)\",\n tooltipBackground: \"rgba(50, 50, 60, 0.95)\",\n },\n};\n\n/** Electrochemistry theme - Professional blue tones */\nexport const ELECTROCHEM_THEME: ChartTheme = {\n name: \"electrochemistry\",\n backgroundColor: \"#0a1628\",\n plotBorderColor: \"#1e3a5f\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(30, 136, 229, 0.15)\",\n minorColor: \"rgba(30, 136, 229, 0.06)\",\n showMinor: true,\n minorDivisions: 2,\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#1e88e5\",\n tickColor: \"#42a5f5\",\n labelColor: \"#90caf9\",\n titleColor: \"#bbdefb\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#1e88e5\",\n tickColor: \"#42a5f5\",\n labelColor: \"#90caf9\",\n titleColor: \"#bbdefb\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(10, 22, 40, 0.95)\",\n borderColor: \"rgba(30, 136, 229, 0.3)\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(100, 180, 255, 0.6)\",\n },\n};\n\n// ============================================\n// Theme Utilities\n// ============================================\n\n/**\n * Create a custom theme by merging with base theme\n */\nexport function createTheme(\n base: ChartTheme,\n overrides: Partial<ChartTheme>\n): ChartTheme {\n return {\n ...base,\n ...overrides,\n grid: { ...base.grid, ...overrides.grid },\n xAxis: { ...base.xAxis, ...overrides.xAxis },\n yAxis: { ...base.yAxis, ...overrides.yAxis },\n legend: { ...base.legend, ...overrides.legend },\n cursor: { ...base.cursor, ...overrides.cursor },\n };\n}\n\n/**\n * Get a theme by name\n */\nexport function getThemeByName(name: string): ChartTheme {\n switch (name) {\n case \"dark\":\n return DARK_THEME;\n case \"midnight\":\n return MIDNIGHT_THEME;\n case \"light\":\n return LIGHT_THEME;\n case \"electrochemistry\":\n case \"electrochem\":\n return ELECTROCHEM_THEME;\n default:\n console.warn(`[Theme] Unknown theme \"${name}\", using dark`);\n return DARK_THEME;\n }\n}\n\n/** Default theme export */\nexport const DEFAULT_THEME = DARK_THEME;\n","/**\n * OverlayRenderer - Canvas 2D rendering for axes, grid, legend, and cursor\n *\n * This module handles all 2D overlay rendering on top of the WebGL canvas.\n * It uses the theme system for consistent styling.\n */\n\nimport type { Scale } from \"../scales\";\nimport type { ChartTheme } from \"../theme\";\nimport type { Series } from \"./Series\";\nimport type { PlotArea, CursorState } from \"../types\";\n\n// ============================================\n// Overlay Renderer Class\n// ============================================\n\nexport class OverlayRenderer {\n private ctx: CanvasRenderingContext2D;\n private theme: ChartTheme;\n\n constructor(ctx: CanvasRenderingContext2D, theme: ChartTheme) {\n this.ctx = ctx;\n this.theme = theme;\n }\n\n /**\n * Update the theme\n */\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n }\n\n /**\n * Clear the overlay\n */\n clear(width: number, height: number): void {\n this.ctx.clearRect(0, 0, width, height);\n }\n\n /**\n * Draw the grid\n */\n drawGrid(plotArea: PlotArea, xScale: Scale, yScale: Scale): void {\n if (!this.theme.grid.visible) return;\n\n const { ctx } = this;\n const grid = this.theme.grid;\n\n const xTicks = xScale.ticks(8);\n const yTicks = yScale.ticks(6);\n\n // Major grid lines\n ctx.strokeStyle = grid.majorColor;\n ctx.lineWidth = grid.majorWidth;\n ctx.setLineDash(grid.majorDash);\n\n // Vertical lines (X ticks)\n xTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n ctx.beginPath();\n ctx.moveTo(x, plotArea.y);\n ctx.lineTo(x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n });\n\n // Horizontal lines (Y ticks)\n yTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, y);\n ctx.lineTo(plotArea.x + plotArea.width, y);\n ctx.stroke();\n }\n });\n\n // Minor grid lines (if enabled)\n if (grid.showMinor) {\n ctx.strokeStyle = grid.minorColor;\n ctx.lineWidth = grid.minorWidth;\n ctx.setLineDash(grid.minorDash);\n\n // Generate minor ticks between major ticks\n const minorXTicks = this.generateMinorTicks(xTicks, grid.minorDivisions);\n const minorYTicks = this.generateMinorTicks(yTicks, grid.minorDivisions);\n\n minorXTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n ctx.beginPath();\n ctx.moveTo(x, plotArea.y);\n ctx.lineTo(x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n });\n\n minorYTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, y);\n ctx.lineTo(plotArea.x + plotArea.width, y);\n ctx.stroke();\n }\n });\n }\n\n ctx.setLineDash([]);\n }\n\n /**\n * Draw X axis with ticks and labels\n */\n drawXAxis(plotArea: PlotArea, xScale: Scale, label?: string): void {\n const { ctx } = this;\n const axis = this.theme.xAxis;\n const xTicks = xScale.ticks(8);\n const axisY = plotArea.y + plotArea.height;\n\n // Axis line\n ctx.strokeStyle = axis.lineColor;\n ctx.lineWidth = axis.lineWidth;\n ctx.beginPath();\n ctx.moveTo(plotArea.x, axisY);\n ctx.lineTo(plotArea.x + plotArea.width, axisY);\n ctx.stroke();\n\n // Ticks and labels\n ctx.fillStyle = axis.labelColor;\n ctx.font = `${axis.labelSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n\n xTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n // Tick mark\n ctx.strokeStyle = axis.tickColor;\n ctx.beginPath();\n ctx.moveTo(x, axisY);\n ctx.lineTo(x, axisY + axis.tickLength);\n ctx.stroke();\n\n // Label\n ctx.fillText(this.formatXTick(tick), x, axisY + axis.tickLength + 3);\n }\n });\n\n // Axis title\n if (label) {\n ctx.fillStyle = axis.titleColor;\n ctx.font = `${axis.titleSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"bottom\";\n ctx.fillText(\n label,\n plotArea.x + plotArea.width / 2,\n plotArea.y + plotArea.height + 45\n );\n }\n }\n\n /**\n * Draw Y axis with ticks and labels\n */\n drawYAxis(\n plotArea: PlotArea, \n yScale: Scale, \n label?: string, \n position: \"left\" | \"right\" = \"left\",\n offset: number = 0\n ): void {\n const { ctx } = this;\n const axis = this.theme.yAxis;\n const yTicks = yScale.ticks(6);\n // Calculate X coordinate for axis line based on position and offset\n const axisX = position === 'left' ? plotArea.x - offset : plotArea.x + plotArea.width + offset;\n const tickDir = position === 'left' ? -1 : 1; // Left points left, right points right\n\n // Axis line\n ctx.strokeStyle = axis.lineColor;\n ctx.lineWidth = axis.lineWidth;\n ctx.beginPath();\n ctx.moveTo(axisX, plotArea.y);\n ctx.lineTo(axisX, plotArea.y + plotArea.height);\n ctx.stroke();\n\n // Ticks and labels\n ctx.fillStyle = axis.labelColor;\n ctx.font = `${axis.labelSize}px ${axis.fontFamily}`;\n ctx.textAlign = position === 'left' ? \"right\" : \"left\";\n ctx.textBaseline = \"middle\";\n\n yTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n // Tick mark\n ctx.strokeStyle = axis.tickColor;\n ctx.beginPath();\n ctx.moveTo(axisX, y);\n ctx.lineTo(axisX + axis.tickLength * tickDir, y);\n ctx.stroke();\n\n // Label\n const labelX = axisX + (axis.tickLength + 3) * tickDir;\n ctx.fillText(this.formatYTick(tick), labelX, y);\n }\n });\n\n // Axis title\n if (label) {\n ctx.save();\n ctx.fillStyle = axis.titleColor;\n ctx.font = `${axis.titleSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n \n const titleX = position === 'left' \n ? axisX - 40 // Adjust padding for left title\n : axisX + 40; // Adjust padding for right title\n \n const titleY = plotArea.y + plotArea.height / 2;\n \n ctx.translate(titleX, titleY);\n ctx.rotate(position === 'left' ? -Math.PI / 2 : Math.PI / 2);\n ctx.fillText(label, 0, 0);\n ctx.restore();\n }\n }\n\n /**\n * Draw plot area border\n */\n drawPlotBorder(plotArea: PlotArea): void {\n const { ctx } = this;\n ctx.strokeStyle = this.theme.plotBorderColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n }\n\n /**\n * Draw legend\n */\n drawLegend(plotArea: PlotArea, series: Series[]): void {\n if (series.length === 0) return;\n\n const { ctx } = this;\n const legend = this.theme.legend;\n\n // Calculate legend dimensions\n ctx.font = `${legend.fontSize}px ${legend.fontFamily}`;\n let maxWidth = 0;\n const items = series.map((s) => {\n const label = s.getId();\n const style = s.getStyle();\n const width = ctx.measureText(label).width;\n maxWidth = Math.max(maxWidth, width);\n return { \n id: s.getId(), \n color: style.color ?? \"#ff0055\", \n label,\n type: s.getType(),\n symbol: style.symbol,\n opacity: style.opacity ?? 1\n };\n });\n\n const boxWidth = legend.swatchSize + 8 + maxWidth + legend.padding * 2;\n const boxHeight =\n items.length * (legend.swatchSize + legend.itemGap) -\n legend.itemGap +\n legend.padding * 2;\n\n // Calculate position\n let x: number, y: number;\n switch (legend.position) {\n case \"top-left\":\n x = plotArea.x + 10;\n y = plotArea.y + 10;\n break;\n case \"bottom-left\":\n x = plotArea.x + 10;\n y = plotArea.y + 10;\n break;\n case \"bottom-right\":\n x = plotArea.x + plotArea.width - boxWidth - 10;\n y = plotArea.y + plotArea.height - boxHeight - 10;\n break;\n case \"top-right\":\n default:\n x = plotArea.x + plotArea.width - boxWidth - 10;\n y = plotArea.y + 10;\n break;\n }\n\n // Draw background\n ctx.fillStyle = legend.backgroundColor;\n ctx.strokeStyle = legend.borderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n const r = legend.borderRadius;\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + boxWidth - r, y);\n ctx.arcTo(x + boxWidth, y, x + boxWidth, y + r, r);\n ctx.lineTo(x + boxWidth, y + boxHeight - r);\n ctx.arcTo(x + boxWidth, y + boxHeight, x + boxWidth - r, y + boxHeight, r);\n ctx.lineTo(x + r, y + boxHeight);\n ctx.arcTo(x, y + boxHeight, x, y + boxHeight - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // Draw items\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n\n items.forEach((item, i) => {\n const itemY =\n y + legend.padding + i * (legend.swatchSize + legend.itemGap);\n const swatchX = x + legend.padding;\n const centerY = itemY + legend.swatchSize / 2;\n const centerX = swatchX + legend.swatchSize / 2;\n\n // Draw swatch (symbol or line)\n ctx.save();\n ctx.globalAlpha = item.opacity;\n ctx.fillStyle = item.color;\n ctx.strokeStyle = item.color;\n ctx.lineWidth = 2;\n\n const size = legend.swatchSize;\n\n // EXTREME FALLBACK DETECTION\n const typeStr = String(item.type).toLowerCase();\n const hasSymbol = !!item.symbol && item.symbol !== 'circle';\n \n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && hasSymbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n\n if (isScatter) {\n this.drawLegendSymbol(ctx, item.symbol ?? 'circle', centerX, centerY, size * 0.9);\n } else if (isLineScatter) {\n // Line + Scatter\n ctx.beginPath();\n ctx.moveTo(swatchX, centerY);\n ctx.lineTo(swatchX + size, centerY);\n ctx.stroke();\n \n this.drawLegendSymbol(ctx, item.symbol ?? 'circle', centerX, centerY, size * 0.6);\n } else {\n // Pure line or step\n ctx.beginPath();\n ctx.moveTo(swatchX, centerY);\n ctx.lineTo(swatchX + size, centerY);\n ctx.stroke();\n }\n ctx.restore();\n\n // Label\n ctx.fillStyle = legend.textColor;\n ctx.fillText(\n item.label,\n x + legend.padding + legend.swatchSize + 8,\n centerY\n );\n });\n }\n\n /**\n * Helper to draw a symbol in the legend\n */\n private drawLegendSymbol(\n ctx: CanvasRenderingContext2D,\n symbol: string,\n x: number,\n y: number,\n size: number\n ): void {\n const r = size / 2;\n ctx.beginPath();\n\n switch (symbol) {\n case 'circle':\n ctx.arc(x, y, r, 0, Math.PI * 2);\n ctx.fill();\n break;\n case 'square':\n ctx.rect(x - r, y - r, size, size);\n ctx.fill();\n break;\n case 'diamond':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y);\n ctx.lineTo(x, y + r);\n ctx.lineTo(x - r, y);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y + r);\n ctx.lineTo(x - r, y + r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangleDown':\n ctx.moveTo(x, y + r);\n ctx.lineTo(x + r, y - r);\n ctx.lineTo(x - r, y - r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.moveTo(x - r, y);\n ctx.lineTo(x + r, y);\n ctx.moveTo(x, y - r);\n ctx.lineTo(x, y + r);\n ctx.stroke();\n break;\n case 'x':\n const d = r * 0.707; // sin(45)\n ctx.moveTo(x - d, y - d);\n ctx.lineTo(x + d, y + d);\n ctx.moveTo(x + d, y - d);\n ctx.lineTo(x - d, y + d);\n ctx.stroke();\n break;\n case 'star':\n for (let i = 0; i < 5; i++) {\n ctx.lineTo(\n x + r * Math.cos(((18 + i * 72) / 180) * Math.PI),\n y - r * Math.sin(((18 + i * 72) / 180) * Math.PI)\n );\n ctx.lineTo(\n x + (r / 2) * Math.cos(((54 + i * 72) / 180) * Math.PI),\n y - (r / 2) * Math.sin(((54 + i * 72) / 180) * Math.PI)\n );\n }\n ctx.closePath();\n ctx.fill();\n break;\n }\n }\n\n /**\n * Draw cursor/crosshair\n */\n drawCursor(plotArea: PlotArea, cursor: CursorState): void {\n if (!cursor.enabled) return;\n\n const { ctx } = this;\n const cursorTheme = this.theme.cursor;\n\n // Check if cursor is in plot area\n if (\n cursor.x < plotArea.x ||\n cursor.x > plotArea.x + plotArea.width ||\n cursor.y < plotArea.y ||\n cursor.y > plotArea.y + plotArea.height\n ) {\n return;\n }\n\n ctx.save();\n\n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n\n // Crosshair style\n ctx.strokeStyle = cursorTheme.lineColor;\n ctx.lineWidth = cursorTheme.lineWidth;\n ctx.setLineDash(cursorTheme.lineDash);\n\n if (cursor.crosshair) {\n // Vertical line\n ctx.beginPath();\n ctx.moveTo(cursor.x, plotArea.y);\n ctx.lineTo(cursor.x, plotArea.y + plotArea.height);\n ctx.stroke();\n\n // Horizontal line\n ctx.beginPath();\n ctx.moveTo(plotArea.x, cursor.y);\n ctx.lineTo(plotArea.x + plotArea.width, cursor.y);\n ctx.stroke();\n } else {\n // Just vertical line\n ctx.beginPath();\n ctx.moveTo(cursor.x, plotArea.y);\n ctx.lineTo(cursor.x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n\n ctx.restore();\n\n // Draw tooltip\n if (cursor.tooltipText) {\n this.drawTooltip(cursor.x, cursor.y, cursor.tooltipText, plotArea);\n }\n }\n\n /**\n * Draw tooltip\n */\n private drawTooltip(\n x: number,\n y: number,\n text: string,\n plotArea: PlotArea\n ): void {\n const { ctx } = this;\n const cursor = this.theme.cursor;\n const lines = text.split(\"\\n\");\n const lineHeight = cursor.tooltipSize + 5;\n const padding = 8;\n\n ctx.font = `${cursor.tooltipSize}px ${this.theme.xAxis.fontFamily}`;\n let maxWidth = 0;\n lines.forEach((line) => {\n maxWidth = Math.max(maxWidth, ctx.measureText(line).width);\n });\n\n const boxWidth = maxWidth + padding * 2;\n const boxHeight = lines.length * lineHeight + padding * 2 - 5;\n\n // Position tooltip\n let tooltipX = x + 15;\n let tooltipY = y - boxHeight - 10;\n\n if (tooltipX + boxWidth > plotArea.x + plotArea.width) {\n tooltipX = x - boxWidth - 15;\n }\n if (tooltipY < plotArea.y) {\n tooltipY = y + 15;\n }\n\n // Background\n ctx.fillStyle = cursor.tooltipBackground;\n ctx.strokeStyle = cursor.tooltipBorder;\n ctx.lineWidth = 1;\n ctx.beginPath();\n const r = 4;\n ctx.moveTo(tooltipX + r, tooltipY);\n ctx.lineTo(tooltipX + boxWidth - r, tooltipY);\n ctx.arcTo(tooltipX + boxWidth, tooltipY, tooltipX + boxWidth, tooltipY + r, r);\n ctx.lineTo(tooltipX + boxWidth, tooltipY + boxHeight - r);\n ctx.arcTo(tooltipX + boxWidth, tooltipY + boxHeight, tooltipX + boxWidth - r, tooltipY + boxHeight, r);\n ctx.lineTo(tooltipX + r, tooltipY + boxHeight);\n ctx.arcTo(tooltipX, tooltipY + boxHeight, tooltipX, tooltipY + boxHeight - r, r);\n ctx.lineTo(tooltipX, tooltipY + r);\n ctx.arcTo(tooltipX, tooltipY, tooltipX + r, tooltipY, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // Text\n ctx.fillStyle = cursor.tooltipColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n lines.forEach((line, i) => {\n ctx.fillText(\n line,\n tooltipX + padding,\n tooltipY + padding + i * lineHeight\n );\n });\n }\n\n /**\n * Draw selection rectangle (Box Zoom)\n */\n drawSelectionRect(rect: {\n x: number;\n y: number;\n width: number;\n height: number;\n }): void {\n const { ctx } = this;\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\");\n\n ctx.save();\n ctx.fillStyle = isDark\n ? \"rgba(0, 170, 255, 0.15)\"\n : \"rgba(0, 100, 255, 0.1)\";\n ctx.strokeStyle = \"#00aaff\";\n ctx.lineWidth = 1;\n ctx.setLineDash([5, 5]);\n\n ctx.beginPath();\n ctx.rect(rect.x, rect.y, rect.width, rect.height);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Draw error bars for a series\n */\n drawErrorBars(\n plotArea: PlotArea,\n series: Series,\n xScale: Scale,\n yScale: Scale\n ): void {\n if (!series.hasErrorData()) return;\n\n const { ctx } = this;\n const data = series.getData();\n const style = series.getStyle();\n const errorStyle = style.errorBars ?? {};\n\n // Skip if explicitly hidden\n if (errorStyle.visible === false) return;\n\n // Error bar styling\n const color = errorStyle.color ?? style.color ?? '#ff0055';\n const lineWidth = errorStyle.width ?? 1;\n const capWidth = errorStyle.capWidth ?? 6;\n const showCaps = errorStyle.showCaps !== false;\n const opacity = errorStyle.opacity ?? 0.7;\n const direction = errorStyle.direction ?? 'both';\n\n ctx.save();\n\n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.globalAlpha = opacity;\n\n // Draw error bars for each point\n for (let i = 0; i < data.x.length; i++) {\n const x = xScale.transform(data.x[i]);\n const y = yScale.transform(data.y[i]);\n\n // Skip points outside plot area\n if (x < plotArea.x || x > plotArea.x + plotArea.width) continue;\n if (y < plotArea.y || y > plotArea.y + plotArea.height) continue;\n\n // Y error bars (vertical)\n const yError = series.getYError(i);\n if (yError) {\n const [errorMinus, errorPlus] = yError;\n const yBase = data.y[i];\n\n // Convert error values to pixel positions\n const yTop = yScale.transform(yBase + errorPlus);\n const yBottom = yScale.transform(yBase - errorMinus);\n\n ctx.beginPath();\n\n // Draw based on direction\n if (direction === 'both' || direction === 'positive') {\n // Upper error bar\n ctx.moveTo(x, y);\n ctx.lineTo(x, yTop);\n // Top cap\n if (showCaps) {\n ctx.moveTo(x - capWidth / 2, yTop);\n ctx.lineTo(x + capWidth / 2, yTop);\n }\n }\n\n if (direction === 'both' || direction === 'negative') {\n // Lower error bar\n ctx.moveTo(x, y);\n ctx.lineTo(x, yBottom);\n // Bottom cap\n if (showCaps) {\n ctx.moveTo(x - capWidth / 2, yBottom);\n ctx.lineTo(x + capWidth / 2, yBottom);\n }\n }\n\n ctx.stroke();\n }\n\n // X error bars (horizontal)\n const xError = series.getXError(i);\n if (xError) {\n const [errorMinus, errorPlus] = xError;\n const xBase = data.x[i];\n\n // Convert error values to pixel positions\n const xRight = xScale.transform(xBase + errorPlus);\n const xLeft = xScale.transform(xBase - errorMinus);\n\n ctx.beginPath();\n\n if (direction === 'both' || direction === 'positive') {\n // Right error bar\n ctx.moveTo(x, y);\n ctx.lineTo(xRight, y);\n // Right cap\n if (showCaps) {\n ctx.moveTo(xRight, y - capWidth / 2);\n ctx.lineTo(xRight, y + capWidth / 2);\n }\n }\n\n if (direction === 'both' || direction === 'negative') {\n // Left error bar\n ctx.moveTo(x, y);\n ctx.lineTo(xLeft, y);\n // Left cap\n if (showCaps) {\n ctx.moveTo(xLeft, y - capWidth / 2);\n ctx.lineTo(xLeft, y + capWidth / 2);\n }\n }\n\n ctx.stroke();\n }\n }\n\n ctx.restore();\n }\n\n // ----------------------------------------\n // Helper Methods\n // ----------------------------------------\n\n private generateMinorTicks(\n majorTicks: number[],\n divisions: number\n ): number[] {\n if (majorTicks.length < 2) return [];\n\n const minor: number[] = [];\n for (let i = 0; i < majorTicks.length - 1; i++) {\n const step = (majorTicks[i + 1] - majorTicks[i]) / divisions;\n for (let j = 1; j < divisions; j++) {\n minor.push(majorTicks[i] + step * j);\n }\n }\n return minor;\n }\n\n private formatXTick(value: number): string {\n if (Math.abs(value) < 0.001 && value !== 0) {\n return this.toScientificUnicode(value, 1);\n }\n return value.toFixed(3).replace(/\\.?0+$/, \"\");\n }\n\n private formatYTick(value: number): string {\n if (value === 0) return \"0\";\n const absVal = Math.abs(value);\n if (absVal < 0.0001 || absVal >= 10000) {\n return this.toScientificUnicode(value, 1);\n }\n return value.toPrecision(3);\n }\n\n private toScientificUnicode(value: number, precision: number): string {\n const str = value.toExponential(precision);\n const [mantissa, exponent] = str.split(\"e\");\n\n // Convert exponent to unicode superscripts\n const superscriptMap: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"-\": \"⁻\",\n \"+\": \"⁺\",\n };\n\n const unicodeExp = exponent.replace(\n /[0-9\\-+]/g,\n (char) => superscriptMap[char] || char\n );\n\n // Return \"1.2 × 10⁻⁵\" format\n return `${mantissa} × 10${unicodeExp}`;\n }\n}\n","/**\n * InteractionManager - Handles mouse, touch, and keyboard interactions\n *\n * This module manages all user interactions with the chart including:\n * - Zoom (mouse wheel)\n * - Pan (mouse drag, touch drag)\n * - Cursor tracking\n */\n\nimport type { Bounds } from \"../types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface AxisLayout {\n id: string;\n position: 'left' | 'right';\n offset: number;\n}\n\nexport interface InteractionCallbacks {\n onZoom: (bounds: Bounds, axisId?: string) => void;\n onPan: (deltaX: number, deltaY: number, axisId?: string) => void;\n onBoxZoom: (\n rect: { x: number; y: number; width: number; height: number } | null\n ) => void;\n onCursorMove: (x: number, y: number) => void;\n onCursorLeave: () => void;\n}\n\nexport interface PlotAreaGetter {\n (): { x: number; y: number; width: number; height: number };\n}\n\nexport interface BoundsGetter {\n (axisId?: string): Bounds;\n}\n\nexport interface AxisLayoutGetter {\n (): AxisLayout[];\n}\n\n// ============================================\n// Interaction Manager Class\n// ============================================\n\nexport class InteractionManager {\n private container: HTMLElement;\n private callbacks: InteractionCallbacks;\n private getPlotArea: PlotAreaGetter;\n private getBounds: BoundsGetter;\n private getAxesLayout: AxisLayoutGetter;\n\n private isDragging = false;\n private panningAxisId?: string;\n private isBoxSelecting = false;\n private selectionStart = { x: 0, y: 0 };\n private lastMousePos = { x: 0, y: 0 };\n private isPanMode = true;\n\n // Bound handlers for cleanup\n private boundWheel: (e: WheelEvent) => void;\n private boundMouseDown: (e: MouseEvent) => void;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n private boundMouseLeave: (e: MouseEvent) => void;\n private boundTouchStart: (e: TouchEvent) => void;\n private boundTouchMove: (e: TouchEvent) => void;\n private boundTouchEnd: (e: TouchEvent) => void;\n\n constructor(\n container: HTMLElement,\n callbacks: InteractionCallbacks,\n getPlotArea: PlotAreaGetter,\n getBounds: BoundsGetter,\n getAxesLayout: AxisLayoutGetter\n ) {\n this.container = container;\n this.callbacks = callbacks;\n this.getPlotArea = getPlotArea;\n this.getBounds = getBounds;\n this.getAxesLayout = getAxesLayout;\n\n // Bind handlers\n this.boundWheel = this.handleWheel.bind(this);\n this.boundMouseDown = this.handleMouseDown.bind(this);\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundMouseUp = this.handleMouseUp.bind(this);\n this.boundMouseLeave = this.handleMouseLeave.bind(this);\n this.boundTouchStart = this.handleTouchStart.bind(this);\n this.boundTouchMove = this.handleTouchMove.bind(this);\n this.boundTouchEnd = this.handleTouchEnd.bind(this);\n\n this.attachListeners();\n }\n\n private attachListeners(): void {\n this.container.addEventListener(\"wheel\", this.boundWheel, {\n passive: false,\n });\n this.container.addEventListener(\"mousedown\", this.boundMouseDown);\n this.container.addEventListener(\"mousemove\", this.boundMouseMove);\n this.container.addEventListener(\"mouseup\", this.boundMouseUp);\n this.container.addEventListener(\"mouseleave\", this.boundMouseLeave);\n this.container.addEventListener(\"touchstart\", this.boundTouchStart);\n this.container.addEventListener(\"touchmove\", this.boundTouchMove);\n this.container.addEventListener(\"touchend\", this.boundTouchEnd);\n }\n\n private detachListeners(): void {\n this.container.removeEventListener(\"wheel\", this.boundWheel);\n this.container.removeEventListener(\"mousedown\", this.boundMouseDown);\n this.container.removeEventListener(\"mousemove\", this.boundMouseMove);\n this.container.removeEventListener(\"mouseup\", this.boundMouseUp);\n this.container.removeEventListener(\"mouseleave\", this.boundMouseLeave);\n this.container.removeEventListener(\"touchstart\", this.boundTouchStart);\n this.container.removeEventListener(\"touchmove\", this.boundTouchMove);\n this.container.removeEventListener(\"touchend\", this.boundTouchEnd);\n }\n\n public setPanMode(enabled: boolean): void {\n this.isPanMode = enabled;\n }\n\n // ----------------------------------------\n // Mouse Handlers\n // ----------------------------------------\n\n private handleWheel(e: WheelEvent): void {\n const plotArea = this.getPlotArea();\n if (plotArea.width <= 1 || plotArea.height <= 1) return;\n\n e.preventDefault();\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Determine zoom targets\n const axes = this.getAxesLayout();\n let zoomX = false;\n let zoomY = false;\n let targetAxisId: string | undefined = undefined;\n\n // Hit test Y axes\n for (const axis of axes) {\n const axisX = axis.position === 'left' \n ? plotArea.x - axis.offset \n : plotArea.x + plotArea.width + axis.offset;\n \n const hitWidth = 65; // Matches axis spacing\n const hitX = axis.position === 'left' ? axisX - hitWidth : axisX;\n\n if (\n mouseX >= hitX &&\n mouseX <= hitX + hitWidth &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n targetAxisId = axis.id;\n zoomY = true;\n zoomX = false;\n break;\n }\n }\n\n if (!targetAxisId) {\n // X Axis area (bottom)\n if (\n mouseY > plotArea.y + plotArea.height &&\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width\n ) {\n zoomX = true;\n }\n // Plot area (both)\n else if (\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n zoomX = true;\n zoomY = true;\n } else {\n return; // Outside interactive areas\n }\n }\n\n const bounds = this.getBounds(targetAxisId);\n const zoomFactor = e.deltaY > 0 ? 1.1 : 0.9;\n\n // Calculate zoom center in data coordinates\n const normalizedX = (mouseX - plotArea.x) / plotArea.width;\n const normalizedY = 1 - (mouseY - plotArea.y) / plotArea.height;\n\n const dataX = bounds.xMin + normalizedX * (bounds.xMax - bounds.xMin);\n const dataY = bounds.yMin + normalizedY * (bounds.yMax - bounds.yMin);\n\n // Limits\n const MIN_RANGE = 1e-12;\n const MAX_RANGE = 1e15;\n\n let nextXMin = zoomX\n ? dataX - (dataX - bounds.xMin) * zoomFactor\n : bounds.xMin;\n let nextXMax = zoomX\n ? dataX + (bounds.xMax - dataX) * zoomFactor\n : bounds.xMax;\n let nextYMin = zoomY\n ? dataY - (dataY - bounds.yMin) * zoomFactor\n : bounds.yMin;\n let nextYMax = zoomY\n ? dataY + (bounds.yMax - dataY) * zoomFactor\n : bounds.yMax;\n\n const nextXRange = nextXMax - nextXMin;\n const nextYRange = nextYMax - nextYMin;\n\n if (nextXRange < MIN_RANGE || nextXRange > MAX_RANGE) {\n nextXMin = bounds.xMin;\n nextXMax = bounds.xMax;\n }\n if (nextYRange < MIN_RANGE || nextYRange > MAX_RANGE) {\n nextYMin = bounds.yMin;\n nextYMax = bounds.yMax;\n }\n\n const newBounds: Bounds = {\n xMin: nextXMin,\n xMax: nextXMax,\n yMin: nextYMin,\n yMax: nextYMax,\n };\n\n this.callbacks.onZoom(newBounds, targetAxisId);\n }\n\n private handleMouseDown(e: MouseEvent): void {\n const plotArea = this.getPlotArea();\n if (plotArea.width <= 1 || plotArea.height <= 1) return;\n\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Check if mouse is in axis area for dragging\n const axes = this.getAxesLayout();\n for (const axis of axes) {\n const axisX = axis.position === 'left' \n ? plotArea.x - axis.offset \n : plotArea.x + plotArea.width + axis.offset;\n \n const hitWidth = 65;\n const hitX = axis.position === 'left' ? axisX - hitWidth : axisX;\n\n if (\n mouseX >= hitX &&\n mouseX <= hitX + hitWidth &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n this.isDragging = true;\n this.panningAxisId = axis.id;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"ns-resize\";\n return;\n }\n }\n\n // Check if mouse is in plot area\n if (\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n if (this.isPanMode) {\n this.isDragging = true;\n this.panningAxisId = undefined;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"grabbing\";\n } else {\n this.isBoxSelecting = true;\n this.selectionStart = { x: mouseX, y: mouseY };\n this.container.style.cursor = \"crosshair\";\n }\n }\n }\n\n private handleMouseMove(e: MouseEvent): void {\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Update cursor position\n this.callbacks.onCursorMove(mouseX, mouseY);\n\n if (this.isDragging) {\n const deltaX = e.clientX - this.lastMousePos.x;\n const deltaY = e.clientY - this.lastMousePos.y;\n this.callbacks.onPan(deltaX, deltaY, this.panningAxisId);\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n } else if (this.isBoxSelecting) {\n const x = Math.min(this.selectionStart.x, mouseX);\n const y = Math.min(this.selectionStart.y, mouseY);\n const width = Math.abs(mouseX - this.selectionStart.x);\n const height = Math.abs(mouseY - this.selectionStart.y);\n this.callbacks.onBoxZoom({ x, y, width, height });\n }\n }\n\n private handleMouseUp(): void {\n if (this.isBoxSelecting) {\n this.callbacks.onBoxZoom(null); // Signal to apply\n }\n this.isDragging = false;\n this.panningAxisId = undefined;\n this.isBoxSelecting = false;\n this.container.style.cursor = \"\";\n }\n\n private handleMouseLeave(): void {\n this.isDragging = false;\n this.panningAxisId = undefined;\n this.container.style.cursor = \"\";\n this.callbacks.onCursorLeave();\n }\n\n // ----------------------------------------\n // Touch Handlers\n // ----------------------------------------\n\n private handleTouchStart(e: TouchEvent): void {\n if (e.touches.length === 1) {\n const touch = e.touches[0];\n this.isDragging = true;\n this.panningAxisId = undefined;\n this.lastMousePos = { x: touch.clientX, y: touch.clientY };\n }\n }\n\n private handleTouchMove(e: TouchEvent): void {\n if (!this.isDragging || e.touches.length !== 1) return;\n\n e.preventDefault();\n\n const touch = e.touches[0];\n const deltaX = touch.clientX - this.lastMousePos.x;\n const deltaY = touch.clientY - this.lastMousePos.y;\n\n this.callbacks.onPan(deltaX, deltaY, this.panningAxisId);\n\n this.lastMousePos = { x: touch.clientX, y: touch.clientY };\n }\n\n private handleTouchEnd(): void {\n this.isDragging = false;\n this.panningAxisId = undefined;\n }\n\n // ----------------------------------------\n // Cleanup\n // ----------------------------------------\n\n destroy(): void {\n this.detachListeners();\n }\n}\n","/**\n * ChartStatistics - In-chart statistics panel\n * \n * Displays real-time statistics (Min, Max, Mean, StdDev, Area) \n * for the visible data range of active series.\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\nimport { calculateStats, integrate } from \"../analysis\";\nimport { Bounds } from \"../types\";\n\nexport class ChartStatistics {\n private container: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Map<string, Series>;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n series: Map<string, Series>\n ) {\n this.theme = theme;\n this.series = series;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"scichart-stats-panel\";\n this.updateContainerStyle();\n\n const title = document.createElement(\"div\");\n title.innerHTML = \"📊 Statistics\";\n title.style.cssText = `\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n `;\n title.onclick = () => this.toggle();\n\n this.content = document.createElement(\"div\");\n this.content.style.display = \"none\";\n \n this.container.appendChild(title);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return name.includes(\"dark\") || name.includes(\"midnight\") || name.includes(\"electro\");\n }\n\n private updateContainerStyle(): void {\n const isDark = this.isDarkTheme();\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const color = isDark ? \"#f1f5f9\" : \"#1e293b\";\n const borderColor = isDark ? \"rgba(255, 255, 255, 0.1)\" : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark ? \"0 4px 12px rgba(0, 0, 0, 0.5)\" : \"0 4px 12px rgba(0, 0, 0, 0.1)\";\n\n this.container.style.cssText = `\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 240px;\n background: ${bg};\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n color: ${color};\n font-family: system-ui, -apple-system, sans-serif;\n padding: 8px 12px;\n z-index: 90;\n transition: all 0.3s ease;\n font-size: 12px;\n pointer-events: auto;\n `;\n }\n\n public update(viewBounds: Bounds): void {\n if (!this.isExpanded) return;\n\n this.content.innerHTML = \"\";\n \n this.series.forEach((s) => {\n if (!s.getVisible()) return;\n\n const data = s.getData();\n if (!data) return;\n\n // Filter data in visible range\n const visibleY: number[] = [];\n const visibleX: number[] = [];\n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= viewBounds.xMin && data.x[i] <= viewBounds.xMax) {\n visibleX.push(data.x[i]);\n visibleY.push(data.y[i]);\n }\n }\n\n if (visibleY.length === 0) return;\n\n const stats = calculateStats(visibleY);\n const area = integrate(visibleX as any, visibleY as any);\n const style = s.getStyle();\n\n const item = document.createElement(\"div\");\n item.style.cssText = `\n padding: 8px 0;\n border-top: 1px solid ${this.isDarkTheme() ? \"rgba(255,255,255,0.05)\" : \"rgba(0,0,0,0.05)\"};\n `;\n\n item.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-weight: 600;\">\n <div style=\"width: 8px; height: 8px; border-radius: 2px; background: ${style.color}\"></div>\n ${s.getId()}\n </div>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0.9; font-size: 11px;\">\n <span>Min: ${stats.min.toExponential(3)}</span>\n <span>Max: ${stats.max.toExponential(3)}</span>\n <span>Mean: ${stats.mean.toExponential(3)}</span>\n <span>Count: ${stats.count}</span>\n <span style=\"grid-column: span 2;\">Area: ${area.toExponential(4)}</span>\n </div>\n `;\n\n this.content.appendChild(item);\n });\n\n if (this.content.innerHTML === \"\") {\n this.content.innerHTML = \"<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>\";\n }\n }\n\n public toggle(): void {\n this.isExpanded = !this.isExpanded;\n this.content.style.display = this.isExpanded ? \"block\" : \"none\";\n if (this.isExpanded) {\n // Redraw immediately will be handled by the chart's next render\n }\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateContainerStyle();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * AnnotationManager - Manages chart annotations\n * \n * Handles creation, update, removal, and rendering of all annotation types.\n */\n\nimport type { Bounds } from '../../types';\nimport type {\n Annotation,\n HorizontalLineAnnotation,\n VerticalLineAnnotation,\n RectangleAnnotation,\n BandAnnotation,\n TextAnnotation,\n ArrowAnnotation,\n} from './types';\n\n// ============================================\n// Default Styles\n// ============================================\n\nconst DEFAULT_STYLES = {\n line: {\n color: 'rgba(255, 255, 255, 0.7)',\n lineWidth: 1,\n lineDash: [] as number[],\n },\n rectangle: {\n fillColor: 'rgba(100, 100, 255, 0.2)',\n strokeColor: 'rgba(100, 100, 255, 0.5)',\n strokeWidth: 1,\n },\n text: {\n fontSize: 12,\n fontFamily: 'Inter, system-ui, sans-serif',\n color: '#ffffff',\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n padding: 4,\n },\n arrow: {\n color: 'rgba(255, 255, 255, 0.7)',\n lineWidth: 2,\n headSize: 10,\n },\n};\n\n// ============================================\n// Plot Area Type\n// ============================================\n\nexport interface PlotArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n// ============================================\n// AnnotationManager Class\n// ============================================\n\nexport class AnnotationManager {\n private annotations: Map<string, Annotation> = new Map();\n private idCounter = 0;\n \n // ----------------------------------------\n // CRUD Operations\n // ----------------------------------------\n \n /**\n * Add a new annotation\n * @returns The annotation ID\n */\n add(annotation: Annotation): string {\n const id = annotation.id ?? `annotation-${++this.idCounter}`;\n const resolved: Annotation = {\n ...annotation,\n id,\n visible: annotation.visible ?? true,\n interactive: annotation.interactive ?? false,\n zIndex: annotation.zIndex ?? 0,\n };\n \n this.annotations.set(id, resolved);\n return id;\n }\n \n /**\n * Remove an annotation by ID\n */\n remove(id: string): boolean {\n return this.annotations.delete(id);\n }\n \n /**\n * Update an annotation\n */\n update(id: string, updates: Partial<Annotation>): void {\n const existing = this.annotations.get(id);\n if (existing) {\n this.annotations.set(id, { ...existing, ...updates } as Annotation);\n }\n }\n \n /**\n * Get an annotation by ID\n */\n get(id: string): Annotation | undefined {\n return this.annotations.get(id);\n }\n \n /**\n * Get all annotations\n */\n getAll(): Annotation[] {\n return Array.from(this.annotations.values());\n }\n \n /**\n * Clear all annotations\n */\n clear(): void {\n this.annotations.clear();\n }\n \n /**\n * Get count of annotations\n */\n get count(): number {\n return this.annotations.size;\n }\n \n // ----------------------------------------\n // Rendering\n // ----------------------------------------\n \n /**\n * Render all annotations\n */\n render(\n ctx: CanvasRenderingContext2D,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n // Sort by zIndex\n const sorted = this.getAll()\n .filter(a => a.visible !== false)\n .sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));\n \n ctx.save();\n \n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n \n for (const annotation of sorted) {\n this.renderAnnotation(ctx, annotation, plotArea, bounds);\n }\n \n ctx.restore();\n }\n \n private renderAnnotation(\n ctx: CanvasRenderingContext2D,\n annotation: Annotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n switch (annotation.type) {\n case 'horizontal-line':\n this.renderHorizontalLine(ctx, annotation, plotArea, bounds);\n break;\n case 'vertical-line':\n this.renderVerticalLine(ctx, annotation, plotArea, bounds);\n break;\n case 'rectangle':\n this.renderRectangle(ctx, annotation, plotArea, bounds);\n break;\n case 'band':\n this.renderBand(ctx, annotation, plotArea, bounds);\n break;\n case 'text':\n this.renderText(ctx, annotation, plotArea, bounds);\n break;\n case 'arrow':\n this.renderArrow(ctx, annotation, plotArea, bounds);\n break;\n }\n }\n \n // ----------------------------------------\n // Coordinate Conversion\n // ----------------------------------------\n \n private dataToPixelX(value: number, bounds: Bounds, plotArea: PlotArea): number {\n const normalized = (value - bounds.xMin) / (bounds.xMax - bounds.xMin);\n return plotArea.x + normalized * plotArea.width;\n }\n \n private dataToPixelY(value: number, bounds: Bounds, plotArea: PlotArea): number {\n const normalized = (value - bounds.yMin) / (bounds.yMax - bounds.yMin);\n return plotArea.y + plotArea.height * (1 - normalized);\n }\n \n // ----------------------------------------\n // Render: Horizontal Line\n // ----------------------------------------\n \n private renderHorizontalLine(\n ctx: CanvasRenderingContext2D,\n annotation: HorizontalLineAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const y = this.dataToPixelY(annotation.y, bounds, plotArea);\n \n // Skip if outside visible area\n if (y < plotArea.y || y > plotArea.y + plotArea.height) return;\n \n const xStart = annotation.xMin !== undefined \n ? Math.max(this.dataToPixelX(annotation.xMin, bounds, plotArea), plotArea.x)\n : plotArea.x;\n const xEnd = annotation.xMax !== undefined\n ? Math.min(this.dataToPixelX(annotation.xMax, bounds, plotArea), plotArea.x + plotArea.width)\n : plotArea.x + plotArea.width;\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.line.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.line.lineWidth;\n ctx.setLineDash(annotation.lineDash ?? DEFAULT_STYLES.line.lineDash);\n \n ctx.beginPath();\n ctx.moveTo(xStart, y);\n ctx.lineTo(xEnd, y);\n ctx.stroke();\n \n // Render label if present\n if (annotation.label) {\n this.renderLineLabel(\n ctx, \n annotation.label, \n xStart, xEnd, y, \n annotation.labelPosition ?? 'right',\n 'horizontal',\n annotation.labelBackground\n );\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Vertical Line\n // ----------------------------------------\n \n private renderVerticalLine(\n ctx: CanvasRenderingContext2D,\n annotation: VerticalLineAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x = this.dataToPixelX(annotation.x, bounds, plotArea);\n \n // Skip if outside visible area\n if (x < plotArea.x || x > plotArea.x + plotArea.width) return;\n \n const yStart = annotation.yMin !== undefined\n ? Math.min(this.dataToPixelY(annotation.yMin, bounds, plotArea), plotArea.y + plotArea.height)\n : plotArea.y;\n const yEnd = annotation.yMax !== undefined\n ? Math.max(this.dataToPixelY(annotation.yMax, bounds, plotArea), plotArea.y)\n : plotArea.y + plotArea.height;\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.line.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.line.lineWidth;\n ctx.setLineDash(annotation.lineDash ?? DEFAULT_STYLES.line.lineDash);\n \n ctx.beginPath();\n ctx.moveTo(x, yStart);\n ctx.lineTo(x, yEnd);\n ctx.stroke();\n \n // Render label if present\n if (annotation.label) {\n this.renderLineLabel(\n ctx,\n annotation.label,\n yStart, yEnd, x,\n annotation.labelPosition ?? 'top',\n 'vertical',\n annotation.labelBackground\n );\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Rectangle\n // ----------------------------------------\n \n private renderRectangle(\n ctx: CanvasRenderingContext2D,\n annotation: RectangleAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x1 = this.dataToPixelX(annotation.xMin, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.xMax, bounds, plotArea);\n const y1 = this.dataToPixelY(annotation.yMax, bounds, plotArea); // Note: Y is inverted\n const y2 = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n \n const x = Math.min(x1, x2);\n const y = Math.min(y1, y2);\n const width = Math.abs(x2 - x1);\n const height = Math.abs(y2 - y1);\n \n ctx.save();\n \n // Fill\n if (annotation.fillColor) {\n ctx.fillStyle = annotation.fillColor;\n ctx.fillRect(x, y, width, height);\n }\n \n // Stroke\n if (annotation.strokeColor) {\n ctx.strokeStyle = annotation.strokeColor;\n ctx.lineWidth = annotation.strokeWidth ?? DEFAULT_STYLES.rectangle.strokeWidth;\n ctx.setLineDash(annotation.strokeDash ?? []);\n ctx.strokeRect(x, y, width, height);\n }\n \n // Label\n if (annotation.label) {\n this.renderCenteredLabel(ctx, annotation.label, x + width / 2, y + height / 2);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Band\n // ----------------------------------------\n \n private renderBand(\n ctx: CanvasRenderingContext2D,\n annotation: BandAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n // Determine band type and calculate bounds\n let x: number, y: number, width: number, height: number;\n \n if (annotation.xMin !== undefined && annotation.xMax !== undefined) {\n // Vertical band (spans full Y)\n const x1 = this.dataToPixelX(annotation.xMin, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.xMax, bounds, plotArea);\n x = Math.min(x1, x2);\n width = Math.abs(x2 - x1);\n y = plotArea.y;\n height = plotArea.height;\n \n if (annotation.yMin !== undefined) {\n const yPixel = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n height = yPixel - y;\n }\n if (annotation.yMax !== undefined) {\n const yPixel = this.dataToPixelY(annotation.yMax, bounds, plotArea);\n y = yPixel;\n height = plotArea.y + plotArea.height - y;\n }\n } else if (annotation.yMin !== undefined && annotation.yMax !== undefined) {\n // Horizontal band (spans full X)\n const y1 = this.dataToPixelY(annotation.yMax, bounds, plotArea);\n const y2 = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n y = Math.min(y1, y2);\n height = Math.abs(y2 - y1);\n x = plotArea.x;\n width = plotArea.width;\n } else {\n // Invalid band configuration\n return;\n }\n \n ctx.save();\n \n // Fill\n ctx.fillStyle = annotation.fillColor ?? DEFAULT_STYLES.rectangle.fillColor;\n ctx.fillRect(x, y, width, height);\n \n // Stroke\n if (annotation.strokeColor) {\n ctx.strokeStyle = annotation.strokeColor;\n ctx.lineWidth = annotation.strokeWidth ?? 1;\n ctx.strokeRect(x, y, width, height);\n }\n \n // Label\n if (annotation.label) {\n let labelX = x + width / 2;\n let labelY = y + height / 2;\n \n switch (annotation.labelPosition) {\n case 'top':\n labelY = y + 15;\n break;\n case 'bottom':\n labelY = y + height - 5;\n break;\n case 'left':\n labelX = x + 10;\n break;\n case 'right':\n labelX = x + width - 10;\n break;\n }\n \n this.renderCenteredLabel(ctx, annotation.label, labelX, labelY);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Text\n // ----------------------------------------\n \n private renderText(\n ctx: CanvasRenderingContext2D,\n annotation: TextAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x = this.dataToPixelX(annotation.x, bounds, plotArea);\n const y = this.dataToPixelY(annotation.y, bounds, plotArea);\n \n ctx.save();\n \n // Apply rotation if specified\n if (annotation.rotation) {\n ctx.translate(x, y);\n ctx.rotate((annotation.rotation * Math.PI) / 180);\n ctx.translate(-x, -y);\n }\n \n const fontSize = annotation.fontSize ?? DEFAULT_STYLES.text.fontSize;\n const fontFamily = annotation.fontFamily ?? DEFAULT_STYLES.text.fontFamily;\n const fontWeight = annotation.fontWeight ?? 'normal';\n \n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n // Measure text for background\n const metrics = ctx.measureText(annotation.text);\n const padding = annotation.padding ?? DEFAULT_STYLES.text.padding;\n const textWidth = metrics.width + padding * 2;\n const textHeight = fontSize + padding * 2;\n \n // Calculate position based on anchor\n let drawX = x;\n let drawY = y;\n \n switch (annotation.anchor) {\n case 'top-left':\n drawX += textWidth / 2;\n drawY += textHeight / 2;\n break;\n case 'top-right':\n drawX -= textWidth / 2;\n drawY += textHeight / 2;\n break;\n case 'bottom-left':\n drawX += textWidth / 2;\n drawY -= textHeight / 2;\n break;\n case 'bottom-right':\n drawX -= textWidth / 2;\n drawY -= textHeight / 2;\n break;\n case 'top-center':\n drawY += textHeight / 2;\n break;\n case 'bottom-center':\n drawY -= textHeight / 2;\n break;\n case 'left-center':\n drawX += textWidth / 2;\n break;\n case 'right-center':\n drawX -= textWidth / 2;\n break;\n }\n \n // Draw background\n if (annotation.backgroundColor) {\n ctx.fillStyle = annotation.backgroundColor;\n ctx.beginPath();\n ctx.roundRect(\n drawX - textWidth / 2,\n drawY - textHeight / 2,\n textWidth,\n textHeight,\n 4\n );\n ctx.fill();\n }\n \n // Draw text\n ctx.fillStyle = annotation.color ?? DEFAULT_STYLES.text.color;\n ctx.fillText(annotation.text, drawX, drawY);\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Arrow\n // ----------------------------------------\n \n private renderArrow(\n ctx: CanvasRenderingContext2D,\n annotation: ArrowAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x1 = this.dataToPixelX(annotation.x1, bounds, plotArea);\n const y1 = this.dataToPixelY(annotation.y1, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.x2, bounds, plotArea);\n const y2 = this.dataToPixelY(annotation.y2, bounds, plotArea);\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.arrow.color;\n ctx.fillStyle = annotation.color ?? DEFAULT_STYLES.arrow.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.arrow.lineWidth;\n \n // Draw line\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n \n // Draw arrow head\n const headSize = annotation.headSize ?? DEFAULT_STYLES.arrow.headSize;\n const angle = Math.atan2(y2 - y1, x2 - x1);\n \n const headStyle = annotation.headStyle ?? 'filled';\n \n if (headStyle !== 'none') {\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(\n x2 - headSize * Math.cos(angle - Math.PI / 6),\n y2 - headSize * Math.sin(angle - Math.PI / 6)\n );\n \n if (headStyle === 'filled') {\n ctx.lineTo(\n x2 - headSize * Math.cos(angle + Math.PI / 6),\n y2 - headSize * Math.sin(angle + Math.PI / 6)\n );\n ctx.closePath();\n ctx.fill();\n } else {\n ctx.moveTo(x2, y2);\n ctx.lineTo(\n x2 - headSize * Math.cos(angle + Math.PI / 6),\n y2 - headSize * Math.sin(angle + Math.PI / 6)\n );\n ctx.stroke();\n }\n }\n \n // Draw tail arrow if specified\n if (annotation.showTail) {\n const tailAngle = angle + Math.PI;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(\n x1 - headSize * Math.cos(tailAngle - Math.PI / 6),\n y1 - headSize * Math.sin(tailAngle - Math.PI / 6)\n );\n ctx.lineTo(\n x1 - headSize * Math.cos(tailAngle + Math.PI / 6),\n y1 - headSize * Math.sin(tailAngle + Math.PI / 6)\n );\n ctx.closePath();\n ctx.fill();\n }\n \n // Draw label if present\n if (annotation.label) {\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n this.renderCenteredLabel(ctx, annotation.label, midX, midY - 10);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Helper: Render Labels\n // ----------------------------------------\n \n private renderLineLabel(\n ctx: CanvasRenderingContext2D,\n label: string,\n start: number,\n end: number,\n cross: number,\n position: string,\n orientation: 'horizontal' | 'vertical',\n backgroundColor?: string\n ): void {\n ctx.save();\n \n ctx.font = `${DEFAULT_STYLES.text.fontSize}px ${DEFAULT_STYLES.text.fontFamily}`;\n const metrics = ctx.measureText(label);\n const padding = 4;\n const textWidth = metrics.width + padding * 2;\n const textHeight = DEFAULT_STYLES.text.fontSize + padding * 2;\n \n let x: number, y: number;\n \n if (orientation === 'horizontal') {\n y = cross;\n \n switch (position) {\n case 'left':\n x = start + 5;\n ctx.textAlign = 'left';\n break;\n case 'right':\n x = end - 5;\n ctx.textAlign = 'right';\n break;\n default:\n x = (start + end) / 2;\n ctx.textAlign = 'center';\n }\n \n ctx.textBaseline = 'bottom';\n y -= 4;\n } else {\n x = cross;\n \n switch (position) {\n case 'top':\n y = start + textHeight;\n break;\n case 'bottom':\n y = end - 5;\n break;\n default:\n y = (start + end) / 2;\n }\n \n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n \n // Background\n if (backgroundColor ?? true) {\n ctx.fillStyle = backgroundColor ?? 'rgba(0, 0, 0, 0.7)';\n const bgX = ctx.textAlign === 'left' ? x - padding \n : ctx.textAlign === 'right' ? x - textWidth + padding\n : x - textWidth / 2;\n ctx.fillRect(bgX, y - textHeight + padding, textWidth, textHeight);\n }\n \n // Text\n ctx.fillStyle = DEFAULT_STYLES.text.color;\n ctx.fillText(label, x, y);\n \n ctx.restore();\n }\n \n private renderCenteredLabel(\n ctx: CanvasRenderingContext2D,\n label: string,\n x: number,\n y: number\n ): void {\n ctx.save();\n \n ctx.font = `${DEFAULT_STYLES.text.fontSize}px ${DEFAULT_STYLES.text.fontFamily}`;\n const metrics = ctx.measureText(label);\n const padding = 4;\n const textWidth = metrics.width + padding * 2;\n const textHeight = DEFAULT_STYLES.text.fontSize + padding * 2;\n \n // Background\n ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';\n ctx.beginPath();\n ctx.roundRect(x - textWidth / 2, y - textHeight / 2, textWidth, textHeight, 3);\n ctx.fill();\n \n // Text\n ctx.fillStyle = DEFAULT_STYLES.text.color;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(label, x, y);\n \n ctx.restore();\n }\n}\n","/**\n * Tooltip Themes - Predefined visual styles for tooltips\n * \n * This module provides beautiful, high-quality tooltip themes that\n * integrate seamlessly with the chart theme system.\n * \n * @module tooltip/themes\n */\n\nimport type { TooltipTheme } from './types';\n\n// ============================================\n// Base Defaults\n// ============================================\n\nconst DEFAULT_PADDING = {\n top: 10,\n right: 12,\n bottom: 10,\n left: 12\n};\n\n// ============================================\n// Dark Theme\n// ============================================\n\n/**\n * Dark Theme - Elegant dark tooltip with subtle glow\n */\nexport const TOOLTIP_DARK_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(15, 18, 25, 0.95)',\n backgroundGradient: 'rgba(25, 30, 40, 0.90)',\n borderColor: 'rgba(255, 255, 255, 0.12)',\n borderWidth: 1,\n borderRadius: 8,\n backdropBlur: 12,\n shadow: {\n color: 'rgba(0, 0, 0, 0.4)',\n offsetX: 0,\n offsetY: 4,\n blur: 16\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, sans-serif',\n textColor: '#ffffff',\n textSecondaryColor: 'rgba(255, 255, 255, 0.6)',\n titleFontSize: 12,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.4,\n \n // Spacing\n padding: DEFAULT_PADDING,\n itemGap: 4,\n headerGap: 8,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 8,\n showHeaderSeparator: true,\n separatorColor: 'rgba(255, 255, 255, 0.1)',\n showArrow: true,\n arrowSize: 6\n};\n\n// ============================================\n// Light Theme\n// ============================================\n\n/**\n * Light Theme - Clean and professional for light backgrounds\n */\nexport const TOOLTIP_LIGHT_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(255, 255, 255, 0.98)',\n borderColor: 'rgba(0, 0, 0, 0.12)',\n borderWidth: 1,\n borderRadius: 8,\n backdropBlur: 8,\n shadow: {\n color: 'rgba(0, 0, 0, 0.12)',\n offsetX: 0,\n offsetY: 4,\n blur: 12\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, sans-serif',\n textColor: '#1a1a1a',\n textSecondaryColor: 'rgba(0, 0, 0, 0.55)',\n titleFontSize: 12,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.4,\n \n // Spacing\n padding: DEFAULT_PADDING,\n itemGap: 4,\n headerGap: 8,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 8,\n showHeaderSeparator: true,\n separatorColor: 'rgba(0, 0, 0, 0.08)',\n showArrow: true,\n arrowSize: 6\n};\n\n// ============================================\n// Glassmorphism Theme\n// ============================================\n\n/**\n * Glassmorphism Theme - Modern frosted glass effect\n */\nexport const TOOLTIP_GLASS_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n backgroundGradient: 'rgba(255, 255, 255, 0.04)',\n borderColor: 'rgba(255, 255, 255, 0.2)',\n borderWidth: 1,\n borderRadius: 12,\n backdropBlur: 20,\n shadow: {\n color: 'rgba(0, 0, 0, 0.3)',\n offsetX: 0,\n offsetY: 8,\n blur: 32\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, sans-serif',\n textColor: 'rgba(255, 255, 255, 0.95)',\n textSecondaryColor: 'rgba(255, 255, 255, 0.6)',\n titleFontSize: 12,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.5,\n \n // Spacing\n padding: { top: 12, right: 14, bottom: 12, left: 14 },\n itemGap: 5,\n headerGap: 10,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 8,\n showHeaderSeparator: true,\n separatorColor: 'rgba(255, 255, 255, 0.15)',\n showArrow: true,\n arrowSize: 7\n};\n\n// ============================================\n// Midnight Theme\n// ============================================\n\n/**\n * Midnight Theme - Deep blue tones for night mode\n */\nexport const TOOLTIP_MIDNIGHT_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(10, 15, 30, 0.95)',\n backgroundGradient: 'rgba(20, 25, 50, 0.90)',\n borderColor: 'rgba(100, 120, 255, 0.25)',\n borderWidth: 1,\n borderRadius: 8,\n backdropBlur: 15,\n shadow: {\n color: 'rgba(50, 70, 150, 0.25)',\n offsetX: 0,\n offsetY: 4,\n blur: 20\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, sans-serif',\n textColor: '#e0e8ff',\n textSecondaryColor: 'rgba(180, 190, 255, 0.6)',\n titleFontSize: 12,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.4,\n \n // Spacing\n padding: DEFAULT_PADDING,\n itemGap: 4,\n headerGap: 8,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 8,\n showHeaderSeparator: true,\n separatorColor: 'rgba(100, 120, 255, 0.15)',\n showArrow: true,\n arrowSize: 6\n};\n\n// ============================================\n// Electrochemistry Theme\n// ============================================\n\n/**\n * Electrochemistry Theme - Professional blue tones for scientific data\n */\nexport const TOOLTIP_ELECTROCHEM_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(8, 20, 40, 0.96)',\n backgroundGradient: 'rgba(15, 35, 60, 0.92)',\n borderColor: 'rgba(30, 136, 229, 0.35)',\n borderWidth: 1,\n borderRadius: 6,\n backdropBlur: 10,\n shadow: {\n color: 'rgba(30, 136, 229, 0.2)',\n offsetX: 0,\n offsetY: 4,\n blur: 16\n },\n \n // Typography\n fontFamily: '\"JetBrains Mono\", \"Fira Code\", monospace',\n textColor: '#bbdefb',\n textSecondaryColor: 'rgba(144, 202, 249, 0.7)',\n titleFontSize: 11,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.5,\n \n // Spacing\n padding: { top: 8, right: 10, bottom: 8, left: 10 },\n itemGap: 3,\n headerGap: 6,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 6,\n showHeaderSeparator: true,\n separatorColor: 'rgba(30, 136, 229, 0.2)',\n showArrow: true,\n arrowSize: 5\n};\n\n// ============================================\n// Neon Theme\n// ============================================\n\n/**\n * Neon Theme - Vibrant glowing effect for futuristic UIs\n */\nexport const TOOLTIP_NEON_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(0, 0, 0, 0.92)',\n borderColor: '#00ffff',\n borderWidth: 1,\n borderRadius: 4,\n backdropBlur: 0,\n shadow: {\n color: 'rgba(0, 255, 255, 0.35)',\n offsetX: 0,\n offsetY: 0,\n blur: 20\n },\n \n // Typography\n fontFamily: '\"Orbitron\", \"Exo 2\", sans-serif',\n textColor: '#00ffff',\n textSecondaryColor: 'rgba(0, 255, 255, 0.6)',\n titleFontSize: 11,\n titleFontWeight: 700,\n contentFontSize: 10,\n lineHeight: 1.4,\n \n // Spacing\n padding: { top: 8, right: 12, bottom: 8, left: 12 },\n itemGap: 4,\n headerGap: 6,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 6,\n showHeaderSeparator: true,\n separatorColor: 'rgba(0, 255, 255, 0.3)',\n showArrow: false,\n arrowSize: 0\n};\n\n// ============================================\n// Minimal Theme\n// ============================================\n\n/**\n * Minimal Theme - Ultra-compact with no decorations\n */\nexport const TOOLTIP_MINIMAL_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(30, 35, 45, 0.9)',\n borderColor: 'transparent',\n borderWidth: 0,\n borderRadius: 4,\n backdropBlur: 8,\n shadow: {\n color: 'rgba(0, 0, 0, 0.3)',\n offsetX: 0,\n offsetY: 2,\n blur: 8\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, sans-serif',\n textColor: '#ffffff',\n textSecondaryColor: 'rgba(255, 255, 255, 0.7)',\n titleFontSize: 10,\n titleFontWeight: 500,\n contentFontSize: 10,\n lineHeight: 1.3,\n \n // Spacing\n padding: { top: 6, right: 8, bottom: 6, left: 8 },\n itemGap: 2,\n headerGap: 4,\n \n // Decorations\n showSeriesIndicator: false,\n seriesIndicatorSize: 0,\n showHeaderSeparator: false,\n separatorColor: 'transparent',\n showArrow: false,\n arrowSize: 0\n};\n\n// ============================================\n// Theme Utilities\n// ============================================\n\n/** Available tooltip theme names */\nexport type TooltipThemeName = \n | 'dark' \n | 'light' \n | 'glass' \n | 'midnight' \n | 'electrochemistry' \n | 'neon' \n | 'minimal';\n\n/** Theme registry */\nexport const TOOLTIP_THEMES: Record<TooltipThemeName, TooltipTheme> = {\n dark: TOOLTIP_DARK_THEME,\n light: TOOLTIP_LIGHT_THEME,\n glass: TOOLTIP_GLASS_THEME,\n midnight: TOOLTIP_MIDNIGHT_THEME,\n electrochemistry: TOOLTIP_ELECTROCHEM_THEME,\n neon: TOOLTIP_NEON_THEME,\n minimal: TOOLTIP_MINIMAL_THEME\n};\n\n/**\n * Get a tooltip theme by name\n */\nexport function getTooltipTheme(name: TooltipThemeName | string): TooltipTheme {\n const theme = TOOLTIP_THEMES[name as TooltipThemeName];\n if (!theme) {\n console.warn(`[Tooltip] Unknown theme \"${name}\", using dark`);\n return TOOLTIP_DARK_THEME;\n }\n return theme;\n}\n\n/**\n * Create a custom tooltip theme by merging with a base theme\n */\nexport function createTooltipTheme(\n base: TooltipTheme | TooltipThemeName,\n overrides: Partial<TooltipTheme>\n): TooltipTheme {\n const baseTheme = typeof base === 'string' ? getTooltipTheme(base) : base;\n \n return {\n ...baseTheme,\n ...overrides,\n padding: { ...baseTheme.padding, ...overrides.padding },\n shadow: { ...baseTheme.shadow, ...overrides.shadow }\n };\n}\n\n/**\n * Map chart theme name to matching tooltip theme\n */\nexport function getTooltipThemeForChartTheme(chartThemeName: string): TooltipTheme {\n switch (chartThemeName.toLowerCase()) {\n case 'light':\n return TOOLTIP_LIGHT_THEME;\n case 'midnight':\n return TOOLTIP_MIDNIGHT_THEME;\n case 'electrochemistry':\n case 'electrochem':\n return TOOLTIP_ELECTROCHEM_THEME;\n case 'dark':\n default:\n return TOOLTIP_DARK_THEME;\n }\n}\n\n/** Default tooltip theme */\nexport const DEFAULT_TOOLTIP_THEME = TOOLTIP_DARK_THEME;\n","/**\n * Tooltip Positioner - Smart positioning algorithms\n * \n * Handles intelligent tooltip positioning with:\n * - Automatic edge avoidance\n * - Flipping when space is limited\n * - Arrow positioning\n * - Constraint handling\n * \n * @module tooltip/TooltipPositioner\n */\n\nimport type { PlotArea } from '../../types';\nimport type {\n TooltipPosition,\n TooltipMeasurement,\n TooltipPlacement,\n ArrowPosition\n} from './types';\n\nexport interface PositionerConfig {\n /** Offset from target point */\n offset: { x: number; y: number };\n /** Preferred placement */\n preferredPosition: TooltipPlacement;\n /** Keep within plot area */\n constrainToPlotArea: boolean;\n /** Keep within container */\n constrainToContainer: boolean;\n /** Flip if not enough space */\n autoFlip: boolean;\n /** Show arrow pointing to target */\n showArrow: boolean;\n /** Arrow size */\n arrowSize: number;\n}\n\nexport const DEFAULT_POSITIONER_CONFIG: PositionerConfig = {\n offset: { x: 12, y: 12 },\n preferredPosition: 'auto',\n constrainToPlotArea: true,\n constrainToContainer: true,\n autoFlip: true,\n showArrow: true,\n arrowSize: 6\n};\n\n/**\n * TooltipPositioner calculates optimal tooltip positions\n */\nexport class TooltipPositioner {\n private config: PositionerConfig;\n private containerWidth: number = 0;\n private containerHeight: number = 0;\n private plotArea: PlotArea | null = null;\n\n constructor(config: Partial<PositionerConfig> = {}) {\n this.config = { ...DEFAULT_POSITIONER_CONFIG, ...config };\n }\n\n /**\n * Update container dimensions\n */\n setContainerSize(width: number, height: number): void {\n this.containerWidth = width;\n this.containerHeight = height;\n }\n\n /**\n * Update plot area bounds\n */\n setPlotArea(plotArea: PlotArea): void {\n this.plotArea = plotArea;\n }\n\n /**\n * Update configuration\n */\n configure(config: Partial<PositionerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Calculate optimal tooltip position\n * \n * @param targetX - Target X coordinate (where tooltip points to)\n * @param targetY - Target Y coordinate\n * @param measurement - Tooltip dimensions\n * @returns Calculated position with arrow configuration\n */\n calculatePosition(\n targetX: number,\n targetY: number,\n measurement: TooltipMeasurement\n ): TooltipPosition {\n const { offset, preferredPosition, autoFlip, showArrow, arrowSize } = this.config;\n \n // Total dimensions including padding\n const totalWidth = measurement.width + measurement.padding.left + measurement.padding.right;\n const totalHeight = measurement.height + measurement.padding.top + measurement.padding.bottom;\n \n // Determine best position\n let position = this.determinePosition(\n targetX, \n targetY, \n totalWidth, \n totalHeight, \n preferredPosition\n );\n \n // Calculate initial coordinates based on position\n let { x, y, arrowPosition } = this.calculateCoordinates(\n targetX,\n targetY,\n totalWidth,\n totalHeight,\n position,\n offset,\n showArrow ? arrowSize : 0\n );\n \n let wasFlipped = false;\n \n // Check if we need to flip\n if (autoFlip && !this.fitsInBounds(x, y, totalWidth, totalHeight)) {\n const flippedPosition = this.flipPosition(position);\n const flipped = this.calculateCoordinates(\n targetX,\n targetY,\n totalWidth,\n totalHeight,\n flippedPosition,\n offset,\n showArrow ? arrowSize : 0\n );\n \n // Use flipped if it fits better\n if (this.fitsInBounds(flipped.x, flipped.y, totalWidth, totalHeight)) {\n x = flipped.x;\n y = flipped.y;\n arrowPosition = flipped.arrowPosition;\n wasFlipped = true;\n }\n }\n \n // Constrain to bounds\n const constrained = this.constrainToBounds(x, y, totalWidth, totalHeight);\n \n // Calculate arrow offset based on how much we shifted\n let arrowOffset = 0;\n if (showArrow) {\n if (arrowPosition === 'top' || arrowPosition === 'bottom') {\n // Arrow on horizontal edge - calculate X offset\n const idealArrowX = targetX - constrained.x;\n arrowOffset = Math.max(arrowSize + 4, Math.min(totalWidth - arrowSize - 4, idealArrowX));\n } else if (arrowPosition === 'left' || arrowPosition === 'right') {\n // Arrow on vertical edge - calculate Y offset \n const idealArrowY = targetY - constrained.y;\n arrowOffset = Math.max(arrowSize + 4, Math.min(totalHeight - arrowSize - 4, idealArrowY));\n }\n }\n \n return {\n x: constrained.x,\n y: constrained.y,\n arrowPosition: showArrow ? arrowPosition : 'none',\n arrowOffset,\n wasFlipped\n };\n }\n\n /**\n * Determine best position based on available space\n */\n private determinePosition(\n targetX: number,\n targetY: number,\n width: number,\n height: number,\n preferred: TooltipPlacement\n ): 'top' | 'bottom' | 'left' | 'right' {\n if (preferred !== 'auto') {\n return preferred;\n }\n \n // Calculate available space in each direction\n const bounds = this.getConstraintBounds();\n \n const spaceTop = targetY - bounds.top;\n const spaceBottom = bounds.bottom - targetY;\n const spaceLeft = targetX - bounds.left;\n const spaceRight = bounds.right - targetX;\n \n // Prefer vertical placement (top/bottom) for better readability\n const canFitTop = spaceTop >= height + this.config.offset.y;\n const canFitBottom = spaceBottom >= height + this.config.offset.y;\n const canFitRight = spaceRight >= width + this.config.offset.x;\n const canFitLeft = spaceLeft >= width + this.config.offset.x;\n \n // Priority: top > bottom > right > left\n if (canFitTop && spaceTop >= spaceBottom) return 'top';\n if (canFitBottom) return 'bottom';\n if (canFitRight && spaceRight >= spaceLeft) return 'right';\n if (canFitLeft) return 'left';\n \n // Default to position with most space\n const spaces = [\n { pos: 'top' as const, space: spaceTop },\n { pos: 'bottom' as const, space: spaceBottom },\n { pos: 'right' as const, space: spaceRight },\n { pos: 'left' as const, space: spaceLeft }\n ];\n \n return spaces.sort((a, b) => b.space - a.space)[0].pos;\n }\n\n /**\n * Calculate tooltip coordinates for a given position\n */\n private calculateCoordinates(\n targetX: number,\n targetY: number,\n width: number,\n height: number,\n position: 'top' | 'bottom' | 'left' | 'right',\n offset: { x: number; y: number },\n arrowSize: number\n ): { x: number; y: number; arrowPosition: ArrowPosition } {\n let x: number;\n let y: number;\n let arrowPosition: ArrowPosition;\n \n switch (position) {\n case 'top':\n x = targetX - width / 2;\n y = targetY - height - offset.y - arrowSize;\n arrowPosition = 'bottom';\n break;\n \n case 'bottom':\n x = targetX - width / 2;\n y = targetY + offset.y + arrowSize;\n arrowPosition = 'top';\n break;\n \n case 'right':\n x = targetX + offset.x + arrowSize;\n y = targetY - height / 2;\n arrowPosition = 'left';\n break;\n \n case 'left':\n x = targetX - width - offset.x - arrowSize;\n y = targetY - height / 2;\n arrowPosition = 'right';\n break;\n }\n \n return { x, y, arrowPosition };\n }\n\n /**\n * Get the opposite position for flipping\n */\n private flipPosition(\n position: 'top' | 'bottom' | 'left' | 'right'\n ): 'top' | 'bottom' | 'left' | 'right' {\n switch (position) {\n case 'top': return 'bottom';\n case 'bottom': return 'top';\n case 'left': return 'right';\n case 'right': return 'left';\n }\n }\n\n /**\n * Check if tooltip fits within bounds\n */\n private fitsInBounds(x: number, y: number, width: number, height: number): boolean {\n const bounds = this.getConstraintBounds();\n \n return (\n x >= bounds.left &&\n y >= bounds.top &&\n x + width <= bounds.right &&\n y + height <= bounds.bottom\n );\n }\n\n /**\n * Constrain position to stay within bounds\n */\n private constrainToBounds(\n x: number,\n y: number,\n width: number,\n height: number\n ): { x: number; y: number } {\n const bounds = this.getConstraintBounds();\n const margin = 4; // Small margin from edges\n \n let constrainedX = x;\n let constrainedY = y;\n \n // Horizontal constraints\n if (constrainedX < bounds.left + margin) {\n constrainedX = bounds.left + margin;\n } else if (constrainedX + width > bounds.right - margin) {\n constrainedX = bounds.right - width - margin;\n }\n \n // Vertical constraints\n if (constrainedY < bounds.top + margin) {\n constrainedY = bounds.top + margin;\n } else if (constrainedY + height > bounds.bottom - margin) {\n constrainedY = bounds.bottom - height - margin;\n }\n \n return { x: constrainedX, y: constrainedY };\n }\n\n /**\n * Get the bounds to constrain tooltip within\n */\n private getConstraintBounds(): { top: number; left: number; right: number; bottom: number } {\n let bounds = {\n top: 0,\n left: 0,\n right: this.containerWidth,\n bottom: this.containerHeight\n };\n \n if (this.config.constrainToPlotArea && this.plotArea) {\n bounds = {\n top: Math.max(bounds.top, this.plotArea.y),\n left: Math.max(bounds.left, this.plotArea.x),\n right: Math.min(bounds.right, this.plotArea.x + this.plotArea.width),\n bottom: Math.min(bounds.bottom, this.plotArea.y + this.plotArea.height)\n };\n }\n \n return bounds;\n }\n\n /**\n * Calculate position for crosshair tooltip (follows cursor vertically)\n */\n calculateCrosshairPosition(\n cursorX: number,\n cursorY: number,\n measurement: TooltipMeasurement\n ): TooltipPosition {\n const { offset } = this.config;\n const bounds = this.getConstraintBounds();\n \n const totalWidth = measurement.width + measurement.padding.left + measurement.padding.right;\n const totalHeight = measurement.height + measurement.padding.top + measurement.padding.bottom;\n \n // Position to the right of cursor by default\n let x = cursorX + offset.x;\n let arrowPosition: ArrowPosition = 'left';\n \n // Flip to left if not enough space on right\n if (x + totalWidth > bounds.right - 4) {\n x = cursorX - totalWidth - offset.x;\n arrowPosition = 'right';\n }\n \n // Center vertically on cursor\n let y = cursorY - totalHeight / 2;\n \n // Constrain vertically\n y = Math.max(bounds.top + 4, Math.min(bounds.bottom - totalHeight - 4, y));\n \n // Calculate arrow offset (centered on cursor Y)\n const arrowOffset = cursorY - y;\n \n return {\n x,\n y,\n arrowPosition,\n arrowOffset: Math.max(8, Math.min(totalHeight - 8, arrowOffset)),\n wasFlipped: arrowPosition === 'right'\n };\n }\n}\n\n// Export singleton-like factory\nexport function createTooltipPositioner(\n config?: Partial<PositionerConfig>\n): TooltipPositioner {\n return new TooltipPositioner(config);\n}\n","/**\n * Tooltip Renderer - Canvas 2D tooltip rendering\n * \n * High-performance Canvas rendering for tooltips with:\n * - Glassmorphism effects\n * - Smooth gradients and shadows\n * - Arrow/pointer drawing\n * - Animation support\n * \n * @module tooltip/TooltipRenderer\n */\n\nimport type {\n TooltipData,\n TooltipPosition,\n TooltipTheme,\n TooltipTemplate,\n ArrowPosition\n} from './types';\n\n/**\n * TooltipRenderer handles all Canvas 2D rendering for tooltips\n */\nexport class TooltipRenderer {\n private ctx: CanvasRenderingContext2D;\n private theme: TooltipTheme;\n\n constructor(ctx: CanvasRenderingContext2D, theme: TooltipTheme) {\n this.ctx = ctx;\n this.theme = theme;\n }\n\n /**\n * Update the theme\n */\n setTheme(theme: TooltipTheme): void {\n this.theme = theme;\n }\n\n /**\n * Render a tooltip with the given template\n */\n render<T extends TooltipData>(\n data: T,\n position: TooltipPosition,\n template: TooltipTemplate<T>\n ): void {\n const measurement = template.measure(this.ctx, data, this.theme);\n const totalWidth = measurement.width + measurement.padding.left + measurement.padding.right;\n const totalHeight = measurement.height + measurement.padding.top + measurement.padding.bottom;\n\n this.ctx.save();\n\n // Draw background with effects\n this.drawBackground(position.x, position.y, totalWidth, totalHeight, position.arrowPosition || 'none');\n\n // Draw arrow if enabled\n if (position.arrowPosition && position.arrowPosition !== 'none') {\n this.drawArrow(\n position.x,\n position.y,\n totalWidth,\n totalHeight,\n position.arrowPosition,\n position.arrowOffset || 0\n );\n }\n\n // Let template render content\n template.render(this.ctx, data, position, this.theme);\n\n this.ctx.restore();\n }\n\n\n\n /**\n * Draw tooltip background with all effects\n */\n private drawBackground(\n x: number,\n y: number,\n width: number,\n height: number,\n _arrowPosition: ArrowPosition\n ): void {\n const { ctx, theme } = this;\n const r = theme.borderRadius;\n\n ctx.save();\n\n // Shadow\n if (theme.shadow.blur > 0) {\n ctx.shadowColor = theme.shadow.color;\n ctx.shadowOffsetX = theme.shadow.offsetX;\n ctx.shadowOffsetY = theme.shadow.offsetY;\n ctx.shadowBlur = theme.shadow.blur;\n }\n\n // Create rounded rect path\n ctx.beginPath();\n this.roundRect(x, y, width, height, r);\n\n // Fill with gradient or solid color\n if (theme.backgroundGradient) {\n const gradient = ctx.createLinearGradient(x, y, x, y + height);\n gradient.addColorStop(0, theme.backgroundColor);\n gradient.addColorStop(1, theme.backgroundGradient);\n ctx.fillStyle = gradient;\n } else {\n ctx.fillStyle = theme.backgroundColor;\n }\n ctx.fill();\n\n // Reset shadow for border\n ctx.shadowColor = 'transparent';\n\n // Border\n if (theme.borderWidth > 0) {\n ctx.strokeStyle = theme.borderColor;\n ctx.lineWidth = theme.borderWidth;\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n /**\n * Draw arrow pointing to target\n */\n private drawArrow(\n x: number,\n y: number,\n width: number,\n height: number,\n arrowPosition: ArrowPosition,\n arrowOffset: number\n ): void {\n const { ctx, theme } = this;\n const size = theme.arrowSize;\n\n if (size <= 0 || arrowPosition === 'none') return;\n\n ctx.save();\n ctx.fillStyle = theme.backgroundColor;\n ctx.strokeStyle = theme.borderColor;\n ctx.lineWidth = theme.borderWidth;\n\n ctx.beginPath();\n\n switch (arrowPosition) {\n case 'top':\n // Arrow pointing up (tooltip below target)\n const topX = x + arrowOffset;\n ctx.moveTo(topX - size, y);\n ctx.lineTo(topX, y - size);\n ctx.lineTo(topX + size, y);\n break;\n\n case 'bottom':\n // Arrow pointing down (tooltip above target)\n const bottomX = x + arrowOffset;\n const bottomY = y + height;\n ctx.moveTo(bottomX - size, bottomY);\n ctx.lineTo(bottomX, bottomY + size);\n ctx.lineTo(bottomX + size, bottomY);\n break;\n\n case 'left':\n // Arrow pointing left (tooltip right of target)\n const leftY = y + arrowOffset;\n ctx.moveTo(x, leftY - size);\n ctx.lineTo(x - size, leftY);\n ctx.lineTo(x, leftY + size);\n break;\n\n case 'right':\n // Arrow pointing right (tooltip left of target)\n const rightX = x + width;\n const rightY = y + arrowOffset;\n ctx.moveTo(rightX, rightY - size);\n ctx.lineTo(rightX + size, rightY);\n ctx.lineTo(rightX, rightY + size);\n break;\n }\n\n ctx.closePath();\n ctx.fill();\n\n if (theme.borderWidth > 0) {\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n /**\n * Draw a rounded rectangle path\n */\n private roundRect(x: number, y: number, width: number, height: number, radius: number): void {\n const { ctx } = this;\n const r = Math.min(radius, width / 2, height / 2);\n\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + width - r, y);\n ctx.arcTo(x + width, y, x + width, y + r, r);\n ctx.lineTo(x + width, y + height - r);\n ctx.arcTo(x + width, y + height, x + width - r, y + height, r);\n ctx.lineTo(x + r, y + height);\n ctx.arcTo(x, y + height, x, y + height - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n }\n\n /**\n * Draw a horizontal separator line\n */\n drawSeparator(x: number, y: number, width: number): void {\n const { ctx, theme } = this;\n\n if (!theme.showHeaderSeparator) return;\n\n ctx.save();\n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Draw a series color indicator (small circle or square)\n */\n drawSeriesIndicator(x: number, y: number, color: string): void {\n const { ctx, theme } = this;\n\n if (!theme.showSeriesIndicator) return;\n\n const size = theme.seriesIndicatorSize;\n const radius = size / 2;\n\n ctx.save();\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(x + radius, y, radius, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n /**\n * Measure text width\n */\n measureText(text: string, fontSize: number, fontWeight: number | string = 400): number {\n const { ctx, theme } = this;\n ctx.font = `${fontWeight} ${fontSize}px ${theme.fontFamily}`;\n return ctx.measureText(text).width;\n }\n\n /**\n * Draw text with theme styling\n */\n drawText(\n text: string,\n x: number,\n y: number,\n options: {\n fontSize?: number;\n fontWeight?: number | string;\n color?: string;\n align?: CanvasTextAlign;\n baseline?: CanvasTextBaseline;\n } = {}\n ): void {\n const { ctx, theme } = this;\n const {\n fontSize = theme.contentFontSize,\n fontWeight = 400,\n color = theme.textColor,\n align = 'left',\n baseline = 'top'\n } = options;\n\n ctx.save();\n ctx.font = `${fontWeight} ${fontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = color;\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n ctx.fillText(text, x, y);\n ctx.restore();\n }\n\n /**\n * Draw a label-value pair\n */\n drawLabelValue(\n x: number,\n y: number,\n label: string,\n value: string,\n maxWidth: number\n ): void {\n const { theme } = this;\n\n // Draw label (secondary color)\n this.drawText(label, x, y, {\n color: theme.textSecondaryColor,\n fontSize: theme.contentFontSize\n });\n\n // Draw value (primary color, right-aligned)\n this.drawText(value, x + maxWidth, y, {\n color: theme.textColor,\n fontSize: theme.contentFontSize,\n align: 'right'\n });\n }\n\n /**\n * Get theme for external use\n */\n getTheme(): TooltipTheme {\n return this.theme;\n }\n}\n\n/**\n * Create a tooltip renderer\n */\nexport function createTooltipRenderer(\n ctx: CanvasRenderingContext2D,\n theme: TooltipTheme\n): TooltipRenderer {\n return new TooltipRenderer(ctx, theme);\n}\n","/**\n * Default Tooltip Template\n * \n * A clean, elegant template for data point tooltips with:\n * - Series color indicator\n * - Formatted X/Y values\n * - Optional error bars\n * - Cycle information\n * \n * @module tooltip/templates/DefaultTemplate\n */\n\nimport type {\n DataPointTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number, precision: number = 4): string {\n const absVal = Math.abs(value);\n \n // Use scientific notation for very large/small numbers\n if (absVal !== 0 && (absVal < 0.0001 || absVal >= 10000)) {\n return value.toExponential(2);\n }\n \n // Smart precision based on magnitude\n if (absVal < 0.01) {\n return value.toPrecision(precision);\n } else if (absVal < 1) {\n return value.toFixed(4);\n } else if (absVal < 100) {\n return value.toFixed(3);\n } else {\n return value.toFixed(1);\n }\n}\n\n/**\n * Default Data Point Template\n * \n * Visual layout:\n * ┌──────────────────────────┐\n * │ ● Series Name │\n * │ ─────────────────────── │\n * │ X: 0.500 │\n * │ Y: 1.234 │\n * │ ± Error: 0.05 │\n * └──────────────────────────┘\n */\nexport class DefaultTooltipTemplate implements TooltipTemplate<DataPointTooltip> {\n readonly id = 'default';\n readonly name = 'Default Data Point';\n readonly supportedTypes: TooltipType[] = ['datapoint'];\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Create cache key\n const cacheKey = `${data.seriesId}-${data.dataIndex}-${data.dataX}-${data.dataY}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Set up font for measurement\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n \n // Measure title (series name)\n const titleWidth = ctx.measureText(data.seriesName).width;\n \n // Set content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Format values\n const labelWidth = 35;\n const xValWidth = ctx.measureText(formatValue(data.dataX)).width;\n const yValWidth = ctx.measureText(formatValue(data.dataY)).width;\n \n // Measure content lines\n let contentWidth = labelWidth + Math.max(xValWidth, yValWidth);\n \n let contentHeight = theme.contentFontSize * theme.lineHeight * 2;\n \n // Add error info if present\n if (data.yError) {\n const errorText = `± ${formatValue(data.yError[0])} / ${formatValue(data.yError[1])}`;\n contentWidth = Math.max(contentWidth, ctx.measureText(errorText).width);\n contentHeight += theme.contentFontSize * theme.lineHeight;\n }\n \n // Add cycle info if present\n if (data.cycle !== undefined) {\n const cycleText = `Cycle: ${data.cycle}`;\n contentWidth = Math.max(contentWidth, ctx.measureText(cycleText).width);\n contentHeight += theme.contentFontSize * theme.lineHeight;\n }\n \n // Account for series indicator\n const indicatorWidth = theme.showSeriesIndicator \n ? theme.seriesIndicatorSize + 6 \n : 0;\n \n // Calculate total width\n const width = Math.max(titleWidth + indicatorWidth, contentWidth);\n \n // Calculate total height (title + separator + content)\n const height = theme.titleFontSize * theme.lineHeight + theme.headerGap + contentHeight;\n \n this.cachedMeasurement = {\n width: width + 2, // Tiny buffer\n height: height + 4,\n padding: theme.padding,\n arrow: theme.showArrow ? { width: theme.arrowSize * 2, height: theme.arrowSize } : undefined\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n // Start position for content\n let currentX = x + padding.left;\n let currentY = y + padding.top;\n \n // Explicitly set alignment to avoid inheritance issues\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n \n // Draw series indicator\n if (theme.showSeriesIndicator) {\n const indicatorY = currentY + theme.titleFontSize / 2;\n ctx.save();\n ctx.fillStyle = data.seriesColor;\n ctx.beginPath();\n ctx.arc(currentX + theme.seriesIndicatorSize / 2, indicatorY, theme.seriesIndicatorSize / 2, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n \n currentX += theme.seriesIndicatorSize + 6;\n }\n \n // Draw title (series name)\n ctx.save();\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n ctx.fillText(data.seriesName, currentX, currentY);\n ctx.restore();\n \n currentY += theme.titleFontSize * theme.lineHeight + 2; // Extra space\n \n // Draw separator\n if (theme.showHeaderSeparator) {\n const measurement = this.measure(ctx, data, theme);\n const separatorWidth = measurement.width;\n \n ctx.save();\n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.globalAlpha = 0.4; // Softer separator\n ctx.beginPath();\n ctx.moveTo(x + padding.left, currentY + theme.headerGap / 2);\n ctx.lineTo(x + padding.left + separatorWidth, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.restore();\n }\n \n currentY += theme.headerGap + 2; // Better gap\n currentX = x + padding.left; // Reset X\n \n // Draw content\n ctx.save();\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // X value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('X:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n const labelWidth = 35; // Fixed label width for better alignment\n ctx.fillText(formatValue(data.dataX), currentX + labelWidth, currentY);\n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Y value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Y:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.dataY), currentX + labelWidth, currentY);\n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Error if present\n if (data.yError) {\n ctx.fillStyle = theme.textSecondaryColor;\n const errorText = `± ${formatValue(data.yError[0])} / +${formatValue(data.yError[1])}`;\n ctx.fillText(errorText, currentX, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n }\n \n // Cycle if present\n if (data.cycle !== undefined) {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Cycle:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(String(data.cycle), currentX + 45, currentY);\n }\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const defaultTooltipTemplate = new DefaultTooltipTemplate();\n","/**\n * Minimal Tooltip Template\n * \n * Ultra-compact template showing only essential values.\n * Perfect for dashboards with limited space.\n * \n * @module tooltip/templates/MinimalTemplate\n */\n\nimport type {\n DataPointTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number compactly\n */\nfunction formatCompact(value: number): string {\n const absVal = Math.abs(value);\n \n if (absVal === 0) return '0';\n \n // Use SI prefixes for large/small numbers\n if (absVal >= 1e9) return (value / 1e9).toFixed(1) + 'G';\n if (absVal >= 1e6) return (value / 1e6).toFixed(1) + 'M';\n if (absVal >= 1e3) return (value / 1e3).toFixed(1) + 'k';\n if (absVal >= 1) return value.toFixed(2);\n if (absVal >= 1e-3) return (value * 1e3).toFixed(1) + 'm';\n if (absVal >= 1e-6) return (value * 1e6).toFixed(1) + 'µ';\n if (absVal >= 1e-9) return (value * 1e9).toFixed(1) + 'n';\n \n return value.toExponential(1);\n}\n\n/**\n * Minimal Template\n * \n * Visual layout:\n * ┌───────────────────╮\n * │ 0.500 ▪ 1.23µA │\n * ╰───────────────────╯\n */\nexport class MinimalTooltipTemplate implements TooltipTemplate<DataPointTooltip> {\n readonly id = 'minimal';\n readonly name = 'Minimal';\n readonly supportedTypes: TooltipType[] = ['datapoint'];\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Cache key\n const cacheKey = `${data.seriesId}-${data.dataIndex}-${data.dataX}-${data.dataY}-${theme.fontFamily}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Set font for measurement\n ctx.font = `${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Create compact text\n const text = `${formatCompact(data.dataX)} ▪ ${formatCompact(data.dataY)}`;\n const textWidth = ctx.measureText(text).width;\n \n this.cachedMeasurement = {\n width: textWidth,\n height: theme.contentFontSize * theme.lineHeight,\n padding: {\n top: 6,\n right: 8,\n bottom: 6,\n left: 8\n }\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const x = position.x + 8; // Left padding\n const y = position.y + 6; // Top padding\n \n // Create compact text\n const xValue = formatCompact(data.dataX);\n const yValue = formatCompact(data.dataY);\n \n ctx.save();\n ctx.font = `${theme.contentFontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n \n // Draw X value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText(xValue, x, y);\n \n // Draw separator\n const xWidth = ctx.measureText(xValue).width;\n ctx.fillStyle = data.seriesColor;\n ctx.fillText(' ▪ ', x + xWidth, y);\n \n // Draw Y value\n const sepWidth = ctx.measureText(' ▪ ').width;\n ctx.fillStyle = theme.textColor;\n ctx.fillText(yValue, x + xWidth + sepWidth, y);\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const minimalTooltipTemplate = new MinimalTooltipTemplate();\n","/**\n * Crosshair Tooltip Template\n * \n * Multi-series template for crosshair tooltips showing\n * interpolated values for all visible series at cursor position.\n * \n * @module tooltip/templates/CrosshairTemplate\n */\n\nimport type {\n CrosshairTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number): string {\n const absVal = Math.abs(value);\n \n if (absVal === 0) return '0';\n if (absVal !== 0 && (absVal < 0.0001 || absVal >= 10000)) {\n return value.toExponential(2);\n }\n if (absVal < 0.01) return value.toPrecision(3);\n if (absVal < 1) return value.toFixed(4);\n if (absVal < 100) return value.toFixed(3);\n return value.toFixed(1);\n}\n\n/**\n * Crosshair Multi-Series Template\n * \n * Visual layout:\n * ┌──────────────────────────────────╮\n * │ ⌖ X = 0.234 │\n * ├──────────────────────────────────┤\n * │ ● Forward: 45.67 µA │\n * │ ● Reverse: -32.10 µA │\n * │ ○ Baseline: 0.05 µA │\n * ╰──────────────────────────────────╯\n */\nexport class CrosshairTooltipTemplate implements TooltipTemplate<CrosshairTooltip> {\n readonly id = 'crosshair';\n readonly name = 'Multi-Series Crosshair';\n readonly supportedTypes: TooltipType[] = ['crosshair'];\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: CrosshairTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Cache key\n const cacheKey = `${data.dataX}-${data.interpolatedValues.length}-${theme.fontFamily}-${theme.titleFontSize}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Set title font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n \n // Header: \"⌖ X = value\"\n const headerText = `⌖ X = ${formatValue(data.dataX)}`;\n let maxWidth = ctx.measureText(headerText).width;\n \n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Measure each series line\n const indicatorWidth = theme.showSeriesIndicator ? theme.seriesIndicatorSize + 8 : 0;\n const labelColumnWidth = 60; // From render\n \n for (const series of data.interpolatedValues) {\n const nameWidth = ctx.measureText(`${series.seriesName}:`).width;\n const valWidth = ctx.measureText(formatValue(series.y)).width;\n const lineWidth = indicatorWidth + Math.max(nameWidth, labelColumnWidth) + valWidth;\n maxWidth = Math.max(maxWidth, lineWidth);\n }\n \n // Calculate height\n const headerHeight = theme.titleFontSize * theme.lineHeight;\n const seriesCount = data.interpolatedValues.length;\n const contentHeight = seriesCount * (theme.contentFontSize * theme.lineHeight + 2);\n \n this.cachedMeasurement = {\n width: maxWidth + 4, // Safety buffer\n height: headerHeight + theme.headerGap + contentHeight,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: CrosshairTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n let currentY = y + padding.top;\n const contentX = x + padding.left;\n \n // Draw header: \"⌖ X = value\"\n ctx.save();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n \n const headerText = `⌖ X = ${formatValue(data.dataX)}`;\n ctx.fillText(headerText, contentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n \n // Draw separator\n if (theme.showHeaderSeparator) {\n const measurement = this.measure(ctx, data, theme);\n \n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(contentX, currentY + theme.headerGap / 2);\n ctx.lineTo(contentX + measurement.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n \n currentY += theme.headerGap + 2;\n \n // Draw each series\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n for (const series of data.interpolatedValues) {\n let itemX = contentX;\n \n // Series indicator\n if (theme.showSeriesIndicator) {\n const indicatorY = currentY + theme.contentFontSize / 2;\n \n // Use filled circle for exact points, empty circle for interpolated\n ctx.save();\n ctx.beginPath();\n ctx.arc(\n itemX + theme.seriesIndicatorSize / 2,\n indicatorY,\n theme.seriesIndicatorSize / 2,\n 0,\n Math.PI * 2\n );\n \n if (series.isInterpolated) {\n ctx.strokeStyle = series.seriesColor;\n ctx.lineWidth = 1.5;\n ctx.stroke();\n } else {\n ctx.fillStyle = series.seriesColor;\n ctx.fill();\n }\n ctx.restore();\n \n itemX += theme.seriesIndicatorSize + 8;\n }\n \n // Series name\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText(`${series.seriesName}:`, itemX, currentY);\n \n const nameWidth = ctx.measureText(`${series.seriesName}: `).width;\n const labelOffset = Math.max(nameWidth, 60); // At least 60px for name\n \n // Series value\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(series.y), itemX + labelOffset, currentY);\n \n currentY += theme.contentFontSize * theme.lineHeight + 2;\n }\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const crosshairTooltipTemplate = new CrosshairTooltipTemplate();\n","/**\n * Heatmap Tooltip Template\n * \n * Specialized template for heatmap tooltips showing:\n * - Grid position\n * - Z value with color preview\n * - Scale information\n * \n * @module tooltip/templates/HeatmapTemplate\n */\n\nimport type {\n HeatmapTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number): string {\n const absVal = Math.abs(value);\n \n if (absVal === 0) return '0';\n if (absVal !== 0 && (absVal < 0.0001 || absVal >= 10000)) {\n return value.toExponential(3);\n }\n if (absVal < 0.01) return value.toPrecision(4);\n if (absVal < 1) return value.toFixed(4);\n if (absVal < 100) return value.toFixed(3);\n return value.toFixed(2);\n}\n\n/**\n * Heatmap Template\n * \n * Visual layout:\n * ┌────────────────────────────╮\n * │ Grid [45, 128] │\n * │ ──────────────────────────│\n * │ ████ Value: 0.847 │\n * │ Min: 0.0 Max: 1.0 │\n * │ │\n * │ X: 100.0 Hz │\n * │ Y: 2.50 s │\n * ╰────────────────────────────╯\n */\nexport class HeatmapTooltipTemplate implements TooltipTemplate<HeatmapTooltip> {\n readonly id = 'heatmap';\n readonly name = 'Heatmap Value';\n readonly supportedTypes: TooltipType[] = ['heatmap'];\n\n // Color swatch dimensions\n private readonly swatchSize = 14;\n private readonly swatchGap = 8;\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: HeatmapTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Cache key\n const cacheKey = `${data.seriesId}-${data.xIndex}-${data.yIndex}-${theme.fontFamily}-${theme.titleFontSize}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Set title font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n \n // Header: \"Grid [x, y]\"\n const headerText = `Grid [${data.xIndex}, ${data.yIndex}]`;\n let maxWidth = ctx.measureText(headerText).width;\n \n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Value line with color swatch (swatch + gap + text)\n const valueText = `Value: ${formatValue(data.zValue)}`;\n const valueWidth = this.swatchSize + this.swatchGap + ctx.measureText(valueText).width;\n maxWidth = Math.max(maxWidth, valueWidth);\n \n // Scale info\n if (data.colorScale) {\n const scaleText = `Min: ${formatValue(data.colorScale.min)} Max: ${formatValue(data.colorScale.max)}`;\n maxWidth = Math.max(maxWidth, this.swatchSize + this.swatchGap + ctx.measureText(scaleText).width);\n }\n \n // X/Y data values\n const xyLabelWidth = 25; // Adjusted to match fixed offset in render\n const dataXWidth = xyLabelWidth + ctx.measureText(formatValue(data.dataX)).width;\n const dataYWidth = xyLabelWidth + ctx.measureText(formatValue(data.dataY)).width;\n maxWidth = Math.max(maxWidth, dataXWidth, dataYWidth);\n \n // Calculate height\n const headerHeight = theme.titleFontSize * theme.lineHeight;\n const contentLines = data.colorScale ? 4 : 3; // value, (scale), X, Y\n const contentHeight = contentLines * theme.contentFontSize * theme.lineHeight;\n \n this.cachedMeasurement = {\n width: maxWidth + 4, // Small buffer\n height: headerHeight + theme.headerGap + contentHeight + theme.itemGap,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: HeatmapTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n let currentY = y + padding.top;\n const contentX = x + padding.left;\n \n // Draw header: \"Grid [x, y]\"\n ctx.save();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n \n const headerText = `Grid [${data.xIndex}, ${data.yIndex}]`;\n ctx.fillText(headerText, contentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n \n // Draw separator\n if (theme.showHeaderSeparator) {\n const measurement = this.measure(ctx, data, theme);\n \n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(contentX, currentY + theme.headerGap / 2);\n ctx.lineTo(contentX + measurement.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n \n currentY += theme.headerGap + 2;\n \n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Draw color swatch with value\n const swatchY = currentY + (theme.contentFontSize * theme.lineHeight - this.swatchSize) / 2;\n \n // Color swatch with border\n ctx.fillStyle = data.mappedColor || theme.textColor;\n ctx.fillRect(contentX, swatchY, this.swatchSize, this.swatchSize);\n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(contentX, swatchY, this.swatchSize, this.swatchSize);\n \n // Value text\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Value:', contentX + this.swatchSize + this.swatchGap, currentY);\n ctx.fillStyle = theme.textColor;\n const labelWidth = ctx.measureText('Value: ').width;\n ctx.fillText(formatValue(data.zValue), contentX + this.swatchSize + this.swatchGap + labelWidth, currentY);\n \n currentY += theme.contentFontSize * theme.lineHeight;\n \n // Scale info (indented to align with value)\n if (data.colorScale) {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.font = `400 ${theme.contentFontSize - 1}px ${theme.fontFamily}`;\n const scaleText = `Min: ${formatValue(data.colorScale.min)} Max: ${formatValue(data.colorScale.max)}`;\n ctx.fillText(scaleText, contentX + this.swatchSize + this.swatchGap, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n }\n \n currentY += theme.itemGap + 2;\n \n // X value\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('X:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.dataX), contentX + 25, currentY);\n \n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Y value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Y:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.dataY), contentX + 25, currentY);\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const heatmapTooltipTemplate = new HeatmapTooltipTemplate();\n","/**\n * Scientific Tooltip Template\n * \n * Full precision scientific template with:\n * - Proper scientific notation with superscripts\n * - Units and prefixes\n * - Complete error values\n * - Extended metadata\n * \n * @module tooltip/templates/ScientificTemplate\n */\n\nimport type {\n DataPointTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Convert number to scientific notation with Unicode superscripts\n */\nfunction toScientificUnicode(value: number, precision: number = 3): string {\n if (value === 0) return '0';\n \n const exp = Math.floor(Math.log10(Math.abs(value)));\n const mantissa = value / Math.pow(10, exp);\n \n if (Math.abs(exp) <= 2) {\n // Don't use scientific notation for small exponents\n return value.toPrecision(precision);\n }\n \n // Superscript map\n const superscripts: Record<string, string> = {\n '0': '⁰', '1': '¹', '2': '²', '3': '³', '4': '⁴',\n '5': '⁵', '6': '⁶', '7': '⁷', '8': '⁸', '9': '⁹',\n '-': '⁻', '+': '⁺'\n };\n \n // Convert exponent to superscript\n const expStr = exp.toString();\n let superExp = '';\n for (const char of expStr) {\n superExp += superscripts[char] || char;\n }\n \n return `${mantissa.toFixed(precision - 1)} × 10${superExp}`;\n}\n\n/**\n * Format with SI prefix (for future use)\n */\n// function formatWithPrefix(value: number, unit: string = ''): string {\n// const prefixes = [\n// { exp: 12, prefix: 'T' },\n// { exp: 9, prefix: 'G' },\n// { exp: 6, prefix: 'M' },\n// { exp: 3, prefix: 'k' },\n// { exp: 0, prefix: '' },\n// { exp: -3, prefix: 'm' },\n// { exp: -6, prefix: 'µ' },\n// { exp: -9, prefix: 'n' },\n// { exp: -12, prefix: 'p' }\n// ];\n// \n// if (value === 0) return `0 ${unit}`;\n// \n// const absVal = Math.abs(value);\n// \n// for (const { exp, prefix } of prefixes) {\n// if (absVal >= Math.pow(10, exp - 1)) {\n// const scaled = value / Math.pow(10, exp);\n// return `${scaled.toFixed(3)} ${prefix}${unit}`;\n// }\n// }\n// \n// return `${value.toExponential(3)} ${unit}`;\n// }\n\n/**\n * Scientific Template\n * \n * Visual layout:\n * ┌────────────────────────────────────────╮\n * │ 📍 Series Name │\n * │ ───────────────────────────────────── │\n * │ X: 1.234×10³ │\n * │ Y: 5.678×10⁻² ± 0.001 │\n * │ ───────────────────────────────────── │\n * │ Index: 1523 │ Cycle: 3 │\n * ╰────────────────────────────────────────╯\n */\nexport class ScientificTooltipTemplate implements TooltipTemplate<DataPointTooltip> {\n readonly id = 'scientific';\n readonly name = 'Scientific Notation';\n readonly supportedTypes: TooltipType[] = ['datapoint'];\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Cache key\n const cacheKey = `${data.seriesId}-${data.dataIndex}-${data.dataX}-${data.dataY}-${theme.fontFamily}-${theme.titleFontSize}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Title font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n \n const titleWidth = ctx.measureText(data.seriesName).width + \n (theme.showSeriesIndicator ? theme.seriesIndicatorSize + 8 : 0);\n \n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n const labelWidth = 28; // Fixed width used in render\n \n // X value\n const xVal = toScientificUnicode(data.dataX);\n let maxWidth = Math.max(titleWidth, labelWidth + ctx.measureText(xVal).width);\n \n // Y value with optional error\n const yVal = toScientificUnicode(data.dataY);\n let yWidth = labelWidth + ctx.measureText(yVal).width;\n if (data.yError) {\n yWidth += ctx.measureText(` ± ${toScientificUnicode(data.yError[0])}`).width;\n }\n maxWidth = Math.max(maxWidth, yWidth);\n \n // Footer line\n let footerText = `Index: ${data.dataIndex}`;\n if (data.cycle !== undefined) {\n footerText += ` │ Cycle: ${data.cycle}`;\n }\n maxWidth = Math.max(maxWidth, ctx.measureText(footerText).width);\n \n // Height calculation\n let lineCount = 3; // title, X, Y\n if (data.cycle !== undefined || data.yError) {\n lineCount += 1; // footer\n }\n \n const headerHeight = theme.titleFontSize * theme.lineHeight + theme.headerGap;\n const contentHeight = (lineCount - 1) * theme.contentFontSize * theme.lineHeight;\n const extraGap = (data.cycle !== undefined) ? theme.itemGap : 0;\n \n this.cachedMeasurement = {\n width: maxWidth,\n height: headerHeight + contentHeight + extraGap,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n let currentY = y + padding.top;\n let currentX = x + padding.left;\n \n ctx.save();\n \n // Explicitly set alignment\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n \n // Draw series indicator\n if (theme.showSeriesIndicator) {\n const indicatorY = currentY + theme.titleFontSize / 2;\n ctx.fillStyle = data.seriesColor;\n ctx.beginPath();\n ctx.arc(currentX + theme.seriesIndicatorSize / 2, indicatorY, theme.seriesIndicatorSize / 2, 0, Math.PI * 2);\n ctx.fill();\n currentX += theme.seriesIndicatorSize + 8;\n }\n \n // Title\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n ctx.fillText(data.seriesName, currentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n currentX = x + padding.left;\n \n // Separator\n if (theme.showHeaderSeparator) {\n const measurement = this.measure(ctx, data, theme);\n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(currentX, currentY + theme.headerGap / 2);\n ctx.lineTo(currentX + measurement.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n \n currentY += theme.headerGap + 2;\n \n // Content\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n const labelWidth = 28;\n \n // X value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('X:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(toScientificUnicode(data.dataX), currentX + labelWidth, currentY);\n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Y value with error\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Y:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n \n let yText = toScientificUnicode(data.dataY);\n ctx.fillText(yText, currentX + labelWidth, currentY);\n \n if (data.yError) {\n const yWidth = ctx.measureText(yText).width;\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText(` ± ${toScientificUnicode(data.yError[0])}`, currentX + labelWidth + yWidth, currentY);\n }\n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Footer with index and cycle\n if (data.cycle !== undefined) {\n currentY += theme.itemGap;\n \n // Light separator\n ctx.strokeStyle = theme.separatorColor;\n ctx.globalAlpha = 0.3;\n ctx.beginPath();\n const measurement = this.measure(ctx, data, theme);\n ctx.moveTo(currentX, currentY - theme.itemGap / 2);\n ctx.lineTo(currentX + measurement.width, currentY - theme.itemGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1;\n \n // Footer text\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.font = `400 ${theme.contentFontSize - 1}px ${theme.fontFamily}`;\n \n let footerText = `Index: ${data.dataIndex}`;\n if (data.cycle !== undefined) {\n footerText += ` │ Cycle: ${data.cycle}`;\n }\n ctx.fillText(footerText, currentX, currentY);\n }\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const scientificTooltipTemplate = new ScientificTooltipTemplate();\n","/**\n * Annotation Tooltip Template\n * \n * Template for displaying information about chart annotations:\n * - Annotation type and ID\n * - Labeled values\n * - Custom metadata\n * \n * @module tooltip/templates/AnnotationTemplate\n */\n\nimport type {\n AnnotationTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number): string {\n const absVal = Math.abs(value);\n if (absVal === 0) return '0';\n if (absVal < 0.0001 || absVal >= 10000) return value.toExponential(2);\n if (absVal < 1) return value.toFixed(4);\n return value.toFixed(2);\n}\n\nexport class AnnotationTooltipTemplate implements TooltipTemplate<AnnotationTooltip> {\n readonly id = 'annotation';\n readonly name = 'Annotation Info';\n readonly supportedTypes: TooltipType[] = ['annotation'];\n\n // Cache\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: AnnotationTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n const cacheKey = `${data.annotationId}-${data.label}-${theme.fontFamily}-${theme.titleFontSize}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Header font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n const headerText = data.label || `Annotation: ${data.annotationType}`;\n let maxWidth = ctx.measureText(headerText).width;\n\n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n let contentHeight = 0;\n const labelWidth = 50;\n\n // Value lines\n if (data.value !== undefined) {\n const valText = formatValue(data.value);\n maxWidth = Math.max(maxWidth, labelWidth + ctx.measureText(valText).width);\n contentHeight += theme.contentFontSize * theme.lineHeight;\n }\n if (data.valueX !== undefined && data.valueY !== undefined) {\n const xText = formatValue(data.valueX);\n const yText = formatValue(data.valueY);\n maxWidth = Math.max(maxWidth, labelWidth + ctx.measureText(xText).width, labelWidth + ctx.measureText(yText).width);\n contentHeight += (theme.contentFontSize * theme.lineHeight) * 2;\n }\n\n const headerHeight = theme.titleFontSize * theme.lineHeight + theme.headerGap;\n \n this.cachedMeasurement = {\n width: maxWidth + 10,\n height: headerHeight + contentHeight + 4,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n\n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: AnnotationTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n let currentY = y + padding.top;\n const contentX = x + padding.left;\n\n ctx.save();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n // Header\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n const headerText = data.label || `${data.annotationType.toUpperCase()}`;\n ctx.fillText(headerText, contentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n\n // Separator\n if (theme.showHeaderSeparator) {\n const m = this.measure(ctx, data, theme);\n ctx.strokeStyle = theme.separatorColor;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(contentX, currentY + theme.headerGap / 2);\n ctx.lineTo(contentX + m.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n\n currentY += theme.headerGap + 2;\n\n // Content\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n const labelW = 50;\n\n if (data.value !== undefined) {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Value:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.value), contentX + labelW, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n }\n\n if (data.valueX !== undefined && data.valueY !== undefined) {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('X:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.valueX), contentX + labelW, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Y:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.valueY), contentX + labelW, currentY);\n }\n\n ctx.restore();\n }\n}\n\nexport const annotationTooltipTemplate = new AnnotationTooltipTemplate();\n","/**\n * Range Tooltip Template\n * \n * Displays statistical information for a selected range:\n * - Count of points\n * - Min/Max/Mean values\n * - Area and Peaks\n * \n * @module tooltip/templates/RangeTemplate\n */\n\nimport type {\n RangeTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number): string {\n const absVal = Math.abs(value);\n if (absVal === 0) return '0';\n if (absVal < 0.0001 || absVal >= 10000) return value.toExponential(3);\n if (absVal < 1) return value.toFixed(4);\n return value.toFixed(3);\n}\n\nexport class RangeTooltipTemplate implements TooltipTemplate<RangeTooltip> {\n readonly id = 'range';\n readonly name = 'Range Statistics';\n readonly supportedTypes: TooltipType[] = ['range'];\n\n // Cache\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: RangeTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n const stats = data.statistics;\n const cacheKey = `${data.xMin}-${data.xMax}-${stats.count}-${stats.mean}-${theme.fontFamily}`;\n \n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Title font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n const headerText = 'Range Statistics';\n let maxWidth = ctx.measureText(headerText).width;\n\n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n let contentHeight = theme.contentFontSize * theme.lineHeight * 2; // Range and Count are always shown\n \n const lines = [\n `Range: ${formatValue(data.xMin)} to ${formatValue(data.xMax)}`,\n `Count: ${stats.count}`\n ];\n\n if (stats.min !== undefined) lines.push(`Min: ${formatValue(stats.min)}`);\n if (stats.max !== undefined) lines.push(`Max: ${formatValue(stats.max)}`);\n if (stats.mean !== undefined) lines.push(`Mean: ${formatValue(stats.mean)}`);\n if (stats.area !== undefined) lines.push(`Area: ${formatValue(stats.area)}`);\n\n for (const line of lines) {\n maxWidth = Math.max(maxWidth, ctx.measureText(line).width + 10);\n }\n \n contentHeight = lines.length * theme.contentFontSize * theme.lineHeight;\n\n const headerHeight = theme.titleFontSize * theme.lineHeight + theme.headerGap;\n \n this.cachedMeasurement = {\n width: Math.max(maxWidth, 140),\n height: headerHeight + contentHeight + 10,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n\n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: RangeTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n const stats = data.statistics;\n \n let currentY = y + padding.top;\n const contentX = x + padding.left;\n\n ctx.save();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n // Title\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n ctx.fillText('Range Statistics', contentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n\n // Header Separator\n if (theme.showHeaderSeparator) {\n const m = this.measure(ctx, data, theme);\n ctx.strokeStyle = theme.separatorColor;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(contentX, currentY + theme.headerGap / 2);\n ctx.lineTo(contentX + m.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n\n currentY += theme.headerGap + 2;\n\n // Content\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n const labelW = 60;\n\n const renderLine = (label: string, value: string | number) => {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText(label, contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(String(value), contentX + labelW, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n };\n\n renderLine('Points:', stats.count);\n if (stats.min !== undefined) renderLine('Min:', formatValue(stats.min));\n if (stats.max !== undefined) renderLine('Max:', formatValue(stats.max));\n if (stats.mean !== undefined) renderLine('Mean:', formatValue(stats.mean));\n if (stats.stdDev !== undefined) renderLine('StdDev:', formatValue(stats.stdDev));\n if (stats.area !== undefined) renderLine('Area:', formatValue(stats.area));\n \n if (stats.peakX !== undefined) {\n currentY += 4;\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.font = `italic ${theme.contentFontSize - 1}px ${theme.fontFamily}`;\n ctx.fillText(`Peak: ${formatValue(stats.peakY ?? 0)} at X=${formatValue(stats.peakX)}`, contentX, currentY);\n }\n\n ctx.restore();\n }\n}\n\nexport const rangeTooltipTemplate = new RangeTooltipTemplate();\n","/**\n * Tooltip Templates - Barrel Export\n * \n * All available tooltip templates for different use cases.\n * \n * @module tooltip/templates\n */\n\n// Default template - Clean data point display\nexport { DefaultTooltipTemplate, defaultTooltipTemplate } from './DefaultTemplate';\n\n// Minimal template - Ultra-compact values\nexport { MinimalTooltipTemplate, minimalTooltipTemplate } from './MinimalTemplate';\n\n// Crosshair template - Multi-series at X position\nexport { CrosshairTooltipTemplate, crosshairTooltipTemplate } from './CrosshairTemplate';\n\n// Heatmap template - Z values with color preview\nexport { HeatmapTooltipTemplate, heatmapTooltipTemplate } from './HeatmapTemplate';\n\n// Scientific template - Full precision with notation\nexport { ScientificTooltipTemplate, scientificTooltipTemplate } from './ScientificTemplate';\n\n// Annotation template - Labels and values for markers/lines\nexport { AnnotationTooltipTemplate, annotationTooltipTemplate } from './AnnotationTemplate';\n\n// Range template - Statistics for data selections\nexport { RangeTooltipTemplate, rangeTooltipTemplate } from './RangeTemplate';\n\n// Template registry for easy lookup\nimport type { TooltipTemplate, TooltipData } from '../types';\nimport { defaultTooltipTemplate } from './DefaultTemplate';\nimport { minimalTooltipTemplate } from './MinimalTemplate';\nimport { crosshairTooltipTemplate } from './CrosshairTemplate';\nimport { heatmapTooltipTemplate } from './HeatmapTemplate';\nimport { scientificTooltipTemplate } from './ScientificTemplate';\nimport { annotationTooltipTemplate } from './AnnotationTemplate';\nimport { rangeTooltipTemplate } from './RangeTemplate';\n\n/** All built-in templates */\nexport const BUILTIN_TEMPLATES: TooltipTemplate<TooltipData>[] = [\n defaultTooltipTemplate as TooltipTemplate<TooltipData>,\n minimalTooltipTemplate as TooltipTemplate<TooltipData>,\n crosshairTooltipTemplate as TooltipTemplate<TooltipData>,\n heatmapTooltipTemplate as TooltipTemplate<TooltipData>,\n scientificTooltipTemplate as TooltipTemplate<TooltipData>,\n annotationTooltipTemplate as TooltipTemplate<TooltipData>,\n rangeTooltipTemplate as TooltipTemplate<TooltipData>\n];\n\n/** Template ID type */\nexport type BuiltinTemplateId = 'default' | 'minimal' | 'crosshair' | 'heatmap' | 'scientific' | 'annotation' | 'range';\n\n/**\n * Get a built-in template by ID\n */\nexport function getBuiltinTemplate(id: BuiltinTemplateId | string): TooltipTemplate<TooltipData> | undefined {\n return BUILTIN_TEMPLATES.find(t => t.id === id);\n}\n\n/**\n * Get template for a tooltip type\n */\nexport function getDefaultTemplateForType(type: string): TooltipTemplate<TooltipData> {\n switch (type) {\n case 'datapoint':\n return defaultTooltipTemplate as TooltipTemplate<TooltipData>;\n case 'crosshair':\n return crosshairTooltipTemplate as TooltipTemplate<TooltipData>;\n case 'heatmap':\n return heatmapTooltipTemplate as TooltipTemplate<TooltipData>;\n case 'annotation':\n return annotationTooltipTemplate as TooltipTemplate<TooltipData>;\n case 'range':\n return rangeTooltipTemplate as TooltipTemplate<TooltipData>;\n default:\n return defaultTooltipTemplate as TooltipTemplate<TooltipData>;\n }\n}\n","/**\n * TooltipManager - Coordinates the tooltip system\n * \n * This is the main entry point for the tooltip system, integrating:\n * - Template management\n * - Theme management\n * - Hit-testing for data points\n * - Tooltip positioning and rendering\n * - Event handling\n * \n * @module tooltip/TooltipManager\n */\n\nimport type { PlotArea, Bounds } from '../../types';\nimport type { Scale } from '../../scales';\nimport type { Series } from '../Series';\nimport type {\n TooltipData,\n DataPointTooltip,\n CrosshairTooltip,\n TooltipOptions,\n TooltipTheme,\n TooltipTemplate,\n TooltipPosition,\n ShowTooltipOptions,\n TooltipEventMap\n} from './types';\nimport { EventEmitter } from '../EventEmitter';\nimport { TooltipPositioner } from './TooltipPositioner';\nimport { TooltipRenderer } from './TooltipRenderer';\nimport { DEFAULT_TOOLTIP_THEME, getTooltipThemeForChartTheme, createTooltipTheme } from './themes';\nimport {\n defaultTooltipTemplate,\n minimalTooltipTemplate,\n crosshairTooltipTemplate,\n heatmapTooltipTemplate,\n scientificTooltipTemplate,\n annotationTooltipTemplate,\n rangeTooltipTemplate,\n getBuiltinTemplate,\n getDefaultTemplateForType\n} from './templates';\nimport type { ChartTheme } from '../../theme';\n\n// ============================================\n// Types for TooltipManager\n// ============================================\n\nexport interface TooltipManagerConfig {\n /** Canvas 2D context for rendering */\n overlayCtx: CanvasRenderingContext2D;\n /** Chart theme (for auto-selecting tooltip theme) */\n chartTheme: ChartTheme;\n /** Function to get current plot area */\n getPlotArea: () => PlotArea;\n /** Function to get all series */\n getSeries: () => Series[];\n /** Function to convert pixel X to data X */\n pixelToDataX: (px: number) => number;\n /** Function to convert pixel Y to data Y */\n pixelToDataY: (py: number) => number;\n /** Function to get X scale */\n getXScale: () => Scale;\n /** Function to get Y scales */\n getYScales: () => Map<string, Scale>;\n /** Function to get view bounds */\n getViewBounds: () => Bounds;\n /** Initial options */\n options?: TooltipOptions;\n}\n\ninterface ActiveTooltip {\n id: string;\n data: TooltipData;\n position: TooltipPosition;\n template: TooltipTemplate<TooltipData>;\n}\n\n/** Internal fully-populated options type */\ninterface FullTooltipOptions {\n enabled: boolean;\n showDelay: number;\n hideDelay: number;\n followCursor: boolean;\n offset: { x: number; y: number };\n dataPoint: {\n enabled: boolean;\n templateId: string;\n snapToPoint: boolean;\n hitRadius: number;\n };\n crosshair: {\n enabled: boolean;\n templateId: string;\n interpolate: boolean;\n visibleSeriesOnly: boolean;\n };\n range: {\n enabled: boolean;\n templateId: string;\n calculateStats: boolean;\n };\n annotation: {\n enabled: boolean;\n templateId: string;\n };\n heatmap: {\n enabled: boolean;\n templateId: string;\n showColorInfo: boolean;\n };\n positioning: 'auto' | 'fixed' | 'follow';\n preferredPosition: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n constrainToPlotArea: boolean;\n constrainToContainer: boolean;\n autoFlip: boolean;\n theme?: string | Partial<TooltipTheme>;\n}\n\n// ============================================\n// TooltipManager Implementation\n// ============================================\n\nexport class TooltipManager {\n private ctx: CanvasRenderingContext2D;\n private getPlotArea: () => PlotArea;\n private getSeries: () => Series[];\n private pixelToDataX: (px: number) => number;\n private pixelToDataY: (py: number) => number;\n private getXScale: () => Scale;\n private getYScales: () => Map<string, Scale>;\n \n private options: FullTooltipOptions;\n private theme: TooltipTheme;\n private positioner: TooltipPositioner;\n private renderer: TooltipRenderer;\n private templates: Map<string, TooltipTemplate<TooltipData>> = new Map();\n private events = new EventEmitter<TooltipEventMap>();\n \n private activeTooltips: Map<string, ActiveTooltip> = new Map();\n private tooltipIdCounter = 0;\n private showTimeoutId: number | null = null;\n private hideTimeoutId: number | null = null;\n \n private lastCursorX: number | null = null;\n private lastCursorY: number | null = null;\n private hoveredSeriesId: string | null = null;\n private hoveredDataIndex: number | null = null;\n private cachedNearestResult: DataPointTooltip | null = null;\n \n // Large dataset optimizations\n private snapMode: 'nearest' | 'x-only' | 'auto' = 'auto';\n private largeDatasetThreshold = 50000;\n private lastKnownDataSize = 0;\n // Hysteresis factor: new point must be this much closer to switch (2 = 2x closer)\n private hysteresisRatio = 2.0;\n\n constructor(config: TooltipManagerConfig) {\n this.ctx = config.overlayCtx;\n this.getPlotArea = config.getPlotArea;\n this.getSeries = config.getSeries;\n this.pixelToDataX = config.pixelToDataX;\n this.pixelToDataY = config.pixelToDataY;\n this.getXScale = config.getXScale;\n this.getYScales = config.getYScales;\n \n // Default options\n this.options = {\n enabled: true,\n showDelay: 50,\n hideDelay: 100,\n followCursor: false,\n offset: { x: 12, y: 12 },\n dataPoint: {\n enabled: true,\n templateId: 'default',\n snapToPoint: true,\n hitRadius: 20\n },\n crosshair: {\n enabled: false,\n templateId: 'crosshair',\n interpolate: true,\n visibleSeriesOnly: true\n },\n range: {\n enabled: false,\n templateId: 'default',\n calculateStats: true\n },\n annotation: {\n enabled: true,\n templateId: 'default'\n },\n heatmap: {\n enabled: true,\n templateId: 'heatmap',\n showColorInfo: true\n },\n positioning: 'auto',\n preferredPosition: 'auto',\n constrainToPlotArea: true,\n constrainToContainer: true,\n autoFlip: true\n };\n \n // Apply user options\n if (config.options) {\n this.configure(config.options);\n }\n \n // Initialize theme\n this.theme = config.options?.theme \n ? (typeof config.options.theme === 'string' \n ? getTooltipThemeForChartTheme(config.options.theme)\n : createTooltipTheme(DEFAULT_TOOLTIP_THEME, config.options.theme))\n : getTooltipThemeForChartTheme(config.chartTheme.name);\n \n // Initialize components\n this.positioner = new TooltipPositioner({\n offset: this.options.offset,\n preferredPosition: this.options.preferredPosition,\n constrainToPlotArea: this.options.constrainToPlotArea,\n constrainToContainer: this.options.constrainToContainer,\n autoFlip: this.options.autoFlip,\n showArrow: this.theme.showArrow,\n arrowSize: this.theme.arrowSize\n });\n \n this.renderer = new TooltipRenderer(this.ctx, this.theme);\n \n // Register built-in templates\n this.registerBuiltinTemplates();\n }\n\n /**\n * Register built-in templates\n */\n private registerBuiltinTemplates(): void {\n this.templates.set('default', defaultTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('minimal', minimalTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('crosshair', crosshairTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('heatmap', heatmapTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('scientific', scientificTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('annotation', annotationTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('range', rangeTooltipTemplate as TooltipTemplate<TooltipData>);\n }\n\n /**\n * Configure tooltip options\n */\n configure(options: TooltipOptions): void {\n if (options.enabled !== undefined) this.options.enabled = options.enabled;\n if (options.showDelay !== undefined) this.options.showDelay = options.showDelay;\n if (options.hideDelay !== undefined) this.options.hideDelay = options.hideDelay;\n if (options.followCursor !== undefined) this.options.followCursor = options.followCursor;\n if (options.offset) this.options.offset = { ...this.options.offset, ...options.offset };\n \n if (options.dataPoint) {\n this.options.dataPoint = { ...this.options.dataPoint, ...options.dataPoint };\n }\n if (options.crosshair) {\n this.options.crosshair = { ...this.options.crosshair, ...options.crosshair };\n }\n if (options.heatmap) {\n this.options.heatmap = { ...this.options.heatmap, ...options.heatmap };\n }\n \n if (options.preferredPosition) this.options.preferredPosition = options.preferredPosition;\n if (options.constrainToPlotArea !== undefined) this.options.constrainToPlotArea = options.constrainToPlotArea;\n if (options.constrainToContainer !== undefined) this.options.constrainToContainer = options.constrainToContainer;\n if (options.autoFlip !== undefined) this.options.autoFlip = options.autoFlip;\n \n // Large dataset optimization options\n if (options.snapMode !== undefined) {\n this.snapMode = options.snapMode;\n }\n if (options.largeDatasetThreshold !== undefined) {\n this.largeDatasetThreshold = Math.max(1000, options.largeDatasetThreshold);\n }\n \n // Update positioner\n this.positioner.configure({\n offset: this.options.offset,\n preferredPosition: this.options.preferredPosition,\n constrainToPlotArea: this.options.constrainToPlotArea,\n constrainToContainer: this.options.constrainToContainer,\n autoFlip: this.options.autoFlip\n });\n }\n\n /**\n * Get current options\n */\n getOptions(): TooltipOptions {\n return { ...this.options };\n }\n\n /**\n * Enable/disable tooltips\n */\n setEnabled(enabled: boolean): void {\n this.options.enabled = enabled;\n if (!enabled) {\n this.hideAll();\n }\n }\n\n /**\n * Check if tooltips are enabled\n */\n isEnabled(): boolean {\n return this.options.enabled;\n }\n\n /**\n * Set tooltip theme\n */\n setTheme(theme: TooltipTheme | string): void {\n this.theme = typeof theme === 'string' \n ? getTooltipThemeForChartTheme(theme)\n : theme;\n this.renderer.setTheme(this.theme);\n this.positioner.configure({\n showArrow: this.theme.showArrow,\n arrowSize: this.theme.arrowSize\n });\n }\n\n /**\n * Update theme based on chart theme\n */\n updateChartTheme(chartTheme: ChartTheme): void {\n if (!this.options.theme) {\n // Only auto-update if user hasn't set a custom theme\n this.theme = getTooltipThemeForChartTheme(chartTheme.name);\n this.renderer.setTheme(this.theme);\n }\n }\n\n /**\n * Get current theme\n */\n getTheme(): TooltipTheme {\n return this.theme;\n }\n\n /**\n * Register a custom template\n */\n registerTemplate<T extends TooltipData>(template: TooltipTemplate<T>): void {\n this.templates.set(template.id, template as TooltipTemplate<TooltipData>);\n }\n\n /**\n * Get a template by ID\n */\n getTemplate(id: string): TooltipTemplate<TooltipData> | undefined {\n return this.templates.get(id) || getBuiltinTemplate(id);\n }\n\n\n /**\n * Handle cursor movement - main entry point for hover detection\n * Optimized with hysteresis to prevent jumping between nearby points\n */\n handleCursorMove(pixelX: number, pixelY: number): void {\n if (!this.options.enabled) return;\n \n this.lastCursorX = pixelX;\n this.lastCursorY = pixelY;\n \n const plotArea = this.getPlotArea();\n \n // Check if cursor is in plot area (fast path)\n const inPlotArea = \n pixelX >= plotArea.x && \n pixelX <= plotArea.x + plotArea.width &&\n pixelY >= plotArea.y && \n pixelY <= plotArea.y + plotArea.height;\n \n if (!inPlotArea) {\n this.cachedNearestResult = null;\n this.scheduleHide();\n return;\n }\n \n // Update positioner with current bounds\n this.positioner.setContainerSize(\n this.ctx.canvas.width / (window.devicePixelRatio || 1),\n this.ctx.canvas.height / (window.devicePixelRatio || 1)\n );\n this.positioner.setPlotArea(plotArea);\n \n // Track data size for auto mode\n this.lastKnownDataSize = this.getTotalDataPoints();\n \n // Find and show tooltip with hysteresis\n this.performTooltipUpdateWithHysteresis(pixelX, pixelY);\n }\n\n /**\n * Handle cursor leave\n */\n handleCursorLeave(): void {\n this.lastCursorX = null;\n this.lastCursorY = null;\n this.cachedNearestResult = null;\n this.scheduleHide();\n }\n\n /**\n * Get total number of data points across all visible series\n */\n private getTotalDataPoints(): number {\n let total = 0;\n const series = this.getSeries();\n for (const s of series) {\n if (!s.isVisible()) continue;\n const data = s.getData();\n if (data.x) total += data.x.length;\n }\n return total;\n }\n\n /**\n * Determine the effective snap mode based on configuration and data size\n */\n private getEffectiveSnapMode(): 'nearest' | 'x-only' {\n if (this.snapMode === 'x-only') return 'x-only';\n if (this.snapMode === 'nearest') return 'nearest';\n \n // Auto mode - use x-only for large datasets\n return this.lastKnownDataSize > this.largeDatasetThreshold ? 'x-only' : 'nearest';\n }\n\n /**\n * Perform tooltip update with hysteresis to prevent jumping.\n * The tooltip \"sticks\" to the current point unless the cursor is\n * significantly closer to a new point.\n */\n private performTooltipUpdateWithHysteresis(pixelX: number, pixelY: number): void {\n // Try to find a data point\n if (!this.options.dataPoint?.enabled) {\n this.performFallbackTooltipUpdate(pixelX, pixelY);\n return;\n }\n \n const effectiveMode = this.getEffectiveSnapMode();\n const newResult = effectiveMode === 'x-only' \n ? this.findDataPointByXOnly(pixelX)\n : this.findNearestDataPointOptimized(pixelX, pixelY);\n \n if (!newResult) {\n this.performFallbackTooltipUpdate(pixelX, pixelY);\n return;\n }\n \n // Hysteresis: If we already have a point, only switch if new point is MUCH closer\n if (this.cachedNearestResult && this.hoveredSeriesId !== null) {\n const currentPoint = this.cachedNearestResult;\n \n // Calculate distances to current and new points\n const currentDx = currentPoint.pixelX - pixelX;\n const currentDy = currentPoint.pixelY - pixelY;\n const currentDistSq = currentDx * currentDx + currentDy * currentDy;\n \n const newDx = newResult.pixelX - pixelX;\n const newDy = newResult.pixelY - pixelY;\n const newDistSq = newDx * newDx + newDy * newDy;\n \n // Only switch to new point if it's significantly closer\n if (newDistSq * this.hysteresisRatio >= currentDistSq) {\n // Stay with current point - just update position if needed\n this.updateTooltipPosition(this.cachedNearestResult);\n return;\n }\n }\n \n // Switch to new point\n this.cachedNearestResult = newResult;\n this.scheduleShow(newResult);\n }\n\n /**\n * Handle heatmap and crosshair tooltip types (fallback)\n */\n private performFallbackTooltipUpdate(pixelX: number, pixelY: number): void {\n // Try heatmap\n if (this.options.heatmap?.enabled) {\n const heatmapResult = this.findHeatmapCell(pixelX, pixelY);\n if (heatmapResult) {\n this.scheduleShow(heatmapResult);\n return;\n }\n }\n \n // Crosshair mode\n if (this.options.crosshair?.enabled) {\n const crosshairData = this.buildCrosshairTooltip(pixelX, pixelY);\n if (crosshairData) {\n this.scheduleShow(crosshairData);\n return;\n }\n }\n \n // No hit - hide tooltip\n this.cachedNearestResult = null;\n this.scheduleHide();\n }\n\n /**\n * Find data point by X coordinate only (O(log n) - fastest method)\n * Best for very large datasets where precision is less important than speed\n */\n private findDataPointByXOnly(pixelX: number): DataPointTooltip | null {\n const series = this.getSeries().filter(s => s.isVisible() && s.getType() !== 'heatmap');\n if (series.length === 0) return null;\n \n const xScale = this.getXScale();\n const yScales = this.getYScales();\n const cursorDataX = this.pixelToDataX(pixelX);\n \n let bestResult: DataPointTooltip | null = null;\n let bestXDistance = Infinity;\n \n for (const s of series) {\n const data = s.getData();\n if (!data.x || data.x.length === 0) continue;\n \n const yScale = yScales.get(s.getYAxisId?.() || 'default') || yScales.values().next().value;\n if (!yScale) continue;\n \n // Pure binary search for closest X\n const idx = this.binarySearchClosest(data.x, cursorDataX);\n const xDistance = Math.abs(data.x[idx] - cursorDataX);\n \n if (xDistance < bestXDistance) {\n bestXDistance = xDistance;\n const style = s.getStyle();\n const px = xScale.transform(data.x[idx]);\n const py = yScale.transform(data.y[idx]);\n \n bestResult = {\n type: 'datapoint',\n seriesId: s.getId(),\n seriesName: s.getId(),\n seriesColor: style.color || '#ff0055',\n dataIndex: idx,\n dataX: data.x[idx],\n dataY: data.y[idx],\n pixelX: px,\n pixelY: py,\n cycle: (s as any).getCycle?.()\n };\n \n const yError = s.getYError(idx);\n if (yError) bestResult.yError = yError;\n }\n }\n \n return bestResult;\n }\n\n /**\n * Optimized nearest data point finder\n */\n private findNearestDataPointOptimized(pixelX: number, pixelY: number): DataPointTooltip | null {\n const series = this.getSeries().filter(s => s.isVisible());\n const hitRadius = this.options.dataPoint?.hitRadius ?? 20;\n const xScale = this.getXScale();\n const yScales = this.getYScales();\n \n let nearestDistanceSq = hitRadius * hitRadius;\n let nearestResult: DataPointTooltip | null = null;\n \n const cursorDataX = this.pixelToDataX(pixelX);\n \n for (const s of series) {\n if (s.getType() === 'heatmap') continue;\n \n const data = s.getData();\n const yScale = yScales.get(s.getYAxisId?.() || 'default') || yScales.values().next().value;\n \n if (!yScale || !data.x || data.x.length === 0) continue;\n \n const closestIdx = this.binarySearchClosest(data.x, cursorDataX);\n \n // Adaptive search range\n const dataLength = data.x.length;\n const searchRadius = dataLength > 100000 ? 2 : dataLength > 10000 ? 3 : 5;\n const checkStart = Math.max(0, closestIdx - searchRadius);\n const checkEnd = Math.min(dataLength, closestIdx + searchRadius + 1);\n \n for (let i = checkStart; i < checkEnd; i++) {\n const px = xScale.transform(data.x[i]);\n const py = yScale.transform(data.y[i]);\n \n const dx = px - pixelX;\n const dy = py - pixelY;\n const distSq = dx * dx + dy * dy;\n \n if (distSq < nearestDistanceSq) {\n nearestDistanceSq = distSq;\n const style = s.getStyle();\n \n nearestResult = {\n type: 'datapoint',\n seriesId: s.getId(),\n seriesName: s.getId(),\n seriesColor: style.color || '#ff0055',\n dataIndex: i,\n dataX: data.x[i],\n dataY: data.y[i],\n pixelX: px,\n pixelY: py,\n cycle: (s as any).getCycle?.()\n };\n \n const yError = s.getYError(i);\n if (yError) nearestResult.yError = yError;\n }\n }\n }\n \n return nearestResult;\n }\n\n /**\n * Find heatmap cell under cursor\n */\n private findHeatmapCell(pixelX: number, pixelY: number): import(\"./types\").HeatmapTooltip | null {\n const series = this.getSeries().filter(s => s.isVisible() && s.getType() === 'heatmap');\n if (series.length === 0) return null;\n\n const xScale = this.getXScale();\n const yScales = this.getYScales();\n const dataX = this.pixelToDataX(pixelX);\n const dataY = this.pixelToDataY(pixelY);\n\n for (const s of series) {\n const data = s.getHeatmapData();\n if (!data || !data.xValues || !data.yValues || !data.zValues) continue;\n\n const colIdx = this.binarySearchClosest(data.xValues as any, dataX);\n const rowIdx = this.binarySearchClosest(data.yValues as any, dataY);\n\n const xValue = data.xValues[colIdx];\n const yValue = data.yValues[rowIdx];\n \n const yScale = yScales.get(s.getYAxisId?.() || 'default') || yScales.values().next().value;\n if (!yScale) continue;\n\n const px = xScale.transform(xValue);\n const py = yScale.transform(yValue);\n\n const zValue = data.zValues[rowIdx * data.xValues.length + colIdx];\n const style = s.getHeatmapStyle?.() || {};\n\n return {\n type: 'heatmap',\n seriesId: s.getId(),\n seriesName: s.getId(),\n xIndex: colIdx,\n yIndex: rowIdx,\n dataX: xValue,\n dataY: yValue,\n zValue,\n pixelX: px,\n pixelY: py,\n colorScale: style.colorScale as any\n };\n }\n\n return null;\n }\n\n /**\n * Binary search for closest value\n */\n private binarySearchClosest(arr: Float32Array | Float64Array, target: number): number {\n let left = 0;\n let right = arr.length - 1;\n \n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (arr[mid] < target) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n \n if (left > 0 && Math.abs(arr[left - 1] - target) < Math.abs(arr[left] - target)) {\n return left - 1;\n }\n \n return left;\n }\n\n /**\n * Build crosshair tooltip data\n */\n private buildCrosshairTooltip(pixelX: number, pixelY: number): CrosshairTooltip | null {\n const series = this.getSeries().filter(s => s.isVisible() && s.getType() !== 'heatmap');\n if (series.length === 0) return null;\n \n const dataX = this.pixelToDataX(pixelX);\n const yScales = this.getYScales();\n \n const interpolatedValues: CrosshairTooltip['interpolatedValues'] = [];\n \n for (const s of series) {\n const data = s.getData();\n if (!data.x || data.x.length === 0) continue;\n \n const yScale = yScales.get(s.getYAxisId?.() || 'default') || yScales.values().next().value;\n if (!yScale) continue;\n \n const idx = this.binarySearchClosest(data.x, dataX);\n let y: number;\n let isInterpolated = false;\n \n if (idx === 0 || idx >= data.x.length - 1 || data.x[idx] === dataX) {\n y = data.y[idx];\n } else if (this.options.crosshair?.interpolate) {\n const x0 = data.x[idx - 1];\n const x1 = data.x[idx];\n const y0 = data.y[idx - 1];\n const y1 = data.y[idx];\n const t = (dataX - x0) / (x1 - x0);\n y = y0 + t * (y1 - y0);\n isInterpolated = true;\n } else {\n y = data.y[idx];\n }\n \n const style = s.getStyle();\n interpolatedValues.push({\n seriesId: s.getId(),\n seriesName: s.getId(),\n seriesColor: style.color || '#ff0055',\n x: dataX,\n y,\n isInterpolated\n });\n }\n \n if (interpolatedValues.length === 0) return null;\n \n return {\n type: 'crosshair',\n cursorX: pixelX,\n cursorY: pixelY,\n dataX,\n interpolatedValues\n };\n }\n\n /**\n * Schedule showing a tooltip\n */\n private scheduleShow(data: TooltipData): void {\n this.clearHideTimeout();\n \n // If same data point, just update position\n if (data.type === 'datapoint') {\n const dp = data as DataPointTooltip;\n if (this.hoveredSeriesId === dp.seriesId && this.hoveredDataIndex === dp.dataIndex) {\n this.updateTooltipPosition(data);\n return;\n }\n this.hoveredSeriesId = dp.seriesId;\n this.hoveredDataIndex = dp.dataIndex;\n }\n \n this.clearShowTimeout();\n \n // Use short or no delay when already showing a tooltip\n const effectiveDelay = this.activeTooltips.size > 0 ? 0 : this.options.showDelay;\n \n if (effectiveDelay > 0) {\n this.showTimeoutId = window.setTimeout(() => {\n this.showTooltip(data);\n }, effectiveDelay);\n } else {\n this.showTooltip(data);\n }\n }\n\n /**\n * Schedule hiding tooltips\n */\n private scheduleHide(): void {\n this.clearShowTimeout();\n this.hoveredSeriesId = null;\n this.hoveredDataIndex = null;\n \n if (this.options.hideDelay > 0) {\n this.hideTimeoutId = window.setTimeout(() => {\n this.hideAll();\n }, this.options.hideDelay);\n } else {\n this.hideAll();\n }\n }\n\n private clearShowTimeout(): void {\n if (this.showTimeoutId !== null) {\n clearTimeout(this.showTimeoutId);\n this.showTimeoutId = null;\n }\n }\n\n private clearHideTimeout(): void {\n if (this.hideTimeoutId !== null) {\n clearTimeout(this.hideTimeoutId);\n this.hideTimeoutId = null;\n }\n }\n\n /**\n * Show a tooltip with the given data\n */\n private showTooltip(data: TooltipData): void {\n const templateId = this.getTemplateIdForType(data.type);\n const template = this.templates.get(templateId) || getDefaultTemplateForType(data.type);\n \n const targetX = (data as any).pixelX ?? this.lastCursorX ?? 0;\n const targetY = (data as any).pixelY ?? this.lastCursorY ?? 0;\n \n const measurement = template.measure(this.ctx, data, this.theme);\n const position = this.positioner.calculatePosition(targetX, targetY, measurement);\n \n const tooltipId = 'main';\n \n this.activeTooltips.set(tooltipId, {\n id: tooltipId,\n data,\n position,\n template\n });\n }\n\n /**\n * Update tooltip position\n */\n private updateTooltipPosition(data: TooltipData | null): void {\n const tooltip = this.activeTooltips.get('main');\n if (!tooltip) return;\n \n const tooltipData = data || tooltip.data;\n const targetX = (tooltipData as any).pixelX ?? this.lastCursorX ?? 0;\n const targetY = (tooltipData as any).pixelY ?? this.lastCursorY ?? 0;\n \n const measurement = tooltip.template.measure(this.ctx, tooltipData, this.theme);\n tooltip.position = this.positioner.calculatePosition(targetX, targetY, measurement);\n tooltip.data = tooltipData;\n }\n\n /**\n * Get template ID for a tooltip type\n */\n private getTemplateIdForType(type: string): string {\n switch (type) {\n case 'datapoint':\n return this.options.dataPoint?.templateId || 'default';\n case 'crosshair':\n return this.options.crosshair?.templateId || 'crosshair';\n case 'heatmap':\n return this.options.heatmap?.templateId || 'heatmap';\n default:\n return 'default';\n }\n }\n\n /**\n * Show a tooltip programmatically\n */\n show(data: TooltipData, options?: ShowTooltipOptions): string {\n const tooltipId = `tooltip-${++this.tooltipIdCounter}`;\n const templateId = options?.templateId || this.getTemplateIdForType(data.type);\n const template = this.templates.get(templateId) || getDefaultTemplateForType(data.type);\n \n let position: TooltipPosition;\n \n if (options?.position) {\n const measurement = template.measure(this.ctx, data, this.theme);\n position = this.positioner.calculatePosition(\n options.position.x, \n options.position.y, \n measurement\n );\n } else {\n const targetX = (data as any).pixelX ?? 0;\n const targetY = (data as any).pixelY ?? 0;\n const measurement = template.measure(this.ctx, data, this.theme);\n position = this.positioner.calculatePosition(targetX, targetY, measurement);\n }\n \n this.activeTooltips.set(tooltipId, {\n id: tooltipId,\n data,\n position,\n template\n });\n \n if (options?.duration && options.duration > 0) {\n setTimeout(() => this.hide(tooltipId), options.duration);\n }\n \n return tooltipId;\n }\n\n /**\n * Hide a specific tooltip\n */\n hide(tooltipId: string): void {\n this.activeTooltips.delete(tooltipId);\n }\n\n /**\n * Hide all tooltips immediately\n */\n hideAll(): void {\n this.activeTooltips.clear();\n this.hoveredSeriesId = null;\n this.hoveredDataIndex = null;\n }\n\n /**\n * Render all active tooltips\n */\n render(): void {\n if (!this.options.enabled || this.activeTooltips.size === 0) return;\n \n for (const tooltip of this.activeTooltips.values()) {\n this.renderer.render(\n tooltip.data,\n tooltip.position,\n tooltip.template\n );\n }\n }\n\n /**\n * Check if any tooltip is currently visible\n */\n hasActiveTooltip(): boolean {\n return this.activeTooltips.size > 0;\n }\n\n /**\n * Subscribe to tooltip events\n */\n on<K extends keyof TooltipEventMap>(\n event: K,\n handler: (data: TooltipEventMap[K]) => void\n ): void {\n this.events.on(event, handler);\n }\n\n /**\n * Unsubscribe from tooltip events\n */\n off<K extends keyof TooltipEventMap>(\n event: K,\n handler: (data: TooltipEventMap[K]) => void\n ): void {\n this.events.off(event, handler);\n }\n\n /**\n * Destroy the tooltip manager\n */\n destroy(): void {\n this.clearShowTimeout();\n this.clearHideTimeout();\n this.activeTooltips.clear();\n this.templates.clear();\n this.events.clear();\n }\n}\n\n/**\n * Create a tooltip manager\n */\nexport function createTooltipManager(config: TooltipManagerConfig): TooltipManager {\n return new TooltipManager(config);\n}\n","/**\n * Chart Export Utilities\n * \n * Handles exporting chart data to various formats (CSV, JSON, Image).\n */\n\nimport type { Series } from \"../Series\";\nimport type { Bounds } from \"../../types\";\nimport type { ExportOptions } from \"./types\";\n\n/**\n * Export series data to CSV format\n */\nexport function exportToCSV(\n series: Series[],\n options?: ExportOptions\n): string {\n const {\n seriesIds,\n includeHeaders = true,\n precision = 6,\n delimiter = ','\n } = options ?? {};\n\n const seriesToExport = seriesIds\n ? series.filter(s => seriesIds.includes(s.getId()))\n : series;\n\n if (seriesToExport.length === 0) return '';\n\n const lines: string[] = [];\n\n // Generate headers\n if (includeHeaders) {\n const headers: string[] = [];\n seriesToExport.forEach(s => {\n headers.push(`${s.getId()}_x`, `${s.getId()}_y`);\n });\n lines.push(headers.join(delimiter));\n }\n\n // Find max length\n const maxLength = Math.max(...seriesToExport.map(s => s.getPointCount()));\n\n // Generate data rows\n for (let i = 0; i < maxLength; i++) {\n const row: string[] = [];\n seriesToExport.forEach(s => {\n const data = s.getData();\n if (data && i < data.x.length) {\n row.push(data.x[i].toFixed(precision), data.y[i].toFixed(precision));\n } else {\n row.push('', '');\n }\n });\n lines.push(row.join(delimiter));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Export series data to JSON format\n */\nexport function exportToJSON(\n series: Series[],\n viewBounds: Bounds,\n options?: ExportOptions\n): string {\n const { seriesIds, precision = 6 } = options ?? {};\n\n const seriesToExport = seriesIds\n ? series.filter(s => seriesIds.includes(s.getId()))\n : series;\n\n const result: Record<string, { \n id: string;\n type: string;\n style: object;\n data: { x: number[]; y: number[] };\n pointCount: number;\n }> = {};\n\n seriesToExport.forEach(s => {\n const data = s.getData();\n result[s.getId()] = {\n id: s.getId(),\n type: s.getType(),\n style: s.getStyle(),\n data: {\n x: data ? Array.from(data.x).map(v => parseFloat(v.toFixed(precision))) : [],\n y: data ? Array.from(data.y).map(v => parseFloat(v.toFixed(precision))) : [],\n },\n pointCount: s.getPointCount()\n };\n });\n\n return JSON.stringify({\n exportDate: new Date().toISOString(),\n chartBounds: viewBounds,\n series: result\n }, null, 2);\n}\n\n/**\n * Export chart to image\n */\nexport function exportToImage(\n webglCanvas: HTMLCanvasElement,\n overlayCanvas: HTMLCanvasElement,\n backgroundColor: [number, number, number, number],\n legend: { draw: (ctx: CanvasRenderingContext2D, dpr: number) => void } | null,\n showLegend: boolean,\n dpr: number,\n type: \"png\" | \"jpeg\" = \"png\"\n): string {\n const finalCanvas = document.createElement(\"canvas\");\n finalCanvas.width = overlayCanvas.width;\n finalCanvas.height = overlayCanvas.height;\n const ctx = finalCanvas.getContext(\"2d\");\n if (!ctx) return \"\";\n\n // 1. Fill background\n const bg = backgroundColor;\n ctx.fillStyle = `rgba(${Math.round(bg[0] * 255)}, ${Math.round(\n bg[1] * 255\n )}, ${Math.round(bg[2] * 255)}, ${bg[3]})`;\n ctx.fillRect(0, 0, finalCanvas.width, finalCanvas.height);\n\n // 2. Draw WebGL plot area\n ctx.drawImage(webglCanvas, 0, 0);\n\n // 3. Draw Overlay (Axes, Grid, Labels)\n ctx.drawImage(overlayCanvas, 0, 0);\n\n // 4. Draw Legend (if exists and visible)\n if (legend && showLegend) {\n legend.draw(ctx, dpr);\n }\n\n return finalCanvas.toDataURL(`image/${type}`);\n}\n","/**\n * Chart Navigation\n * \n * Handles zoom, pan, auto-scale, and box zoom operations.\n */\n\nimport type { Bounds, ZoomOptions, AxisOptions } from \"../../types\";\nimport type { Scale } from \"../../scales\";\nimport type { EventEmitter } from \"../EventEmitter\";\nimport type { ChartEventMap } from \"../../types\";\n\nexport interface NavigationContext {\n viewBounds: Bounds;\n yScales: Map<string, Scale>;\n yAxisOptionsMap: Map<string, AxisOptions>;\n xAxisOptions: AxisOptions;\n primaryYAxisId: string;\n getPlotArea: () => { x: number; y: number; width: number; height: number };\n events: EventEmitter<ChartEventMap>;\n requestRender: () => void;\n series: Map<string, { \n isVisible(): boolean; \n getBounds(): Bounds | null; \n getYAxisId(): string | undefined;\n getType(): string;\n }>;\n}\n\n/**\n * Apply zoom to the chart\n */\nexport function applyZoom(\n ctx: NavigationContext,\n options: ZoomOptions\n): void {\n if (options.x) {\n ctx.viewBounds.xMin = options.x[0];\n ctx.viewBounds.xMax = options.x[1];\n }\n \n const hasBars = Array.from(ctx.series.values()).some(s => s.isVisible() && s.getType() === 'bar');\n const finalY = options.y ? [...options.y] : null;\n\n if (finalY && hasBars) {\n // Pin baseline to 0 for bar charts during zoom\n finalY[0] = 0;\n }\n\n if (finalY) {\n if (options.axisId) {\n // Zoom targeted axis only\n const scale = ctx.yScales.get(options.axisId);\n if (scale) {\n scale.setDomain(finalY[0], finalY[1]);\n // Sync primary viewBounds if applicable\n if (options.axisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = finalY[0];\n ctx.viewBounds.yMax = finalY[1];\n }\n }\n } else {\n // Global zoom: apply to all axes proportionally\n const oldRange = ctx.viewBounds.yMax - ctx.viewBounds.yMin;\n const newRange = finalY[1] - finalY[0];\n const factor = oldRange > 0 ? newRange / oldRange : 1;\n \n // Calculate relative shift based on primary axis change\n const offsetPct = oldRange > 0 ? (finalY[0] - ctx.viewBounds.yMin) / oldRange : 0;\n\n ctx.yScales.forEach((scale, id) => {\n if (id === ctx.primaryYAxisId) return; // Will sync with viewBounds later\n const sRange = scale.domain[1] - scale.domain[0];\n const sNewMin = hasBars ? 0 : (scale.domain[0] + offsetPct * sRange);\n const sNewMax = hasBars \n ? (scale.domain[0] + (finalY[1] / (ctx.viewBounds.yMax || 1)) * sRange) // Roughly proportional\n : (sNewMin + factor * sRange);\n scale.setDomain(sNewMin, sNewMax);\n });\n\n ctx.viewBounds.yMin = finalY[0];\n ctx.viewBounds.yMax = finalY[1];\n }\n }\n \n ctx.events.emit(\"zoom\", {\n x: [ctx.viewBounds.xMin, ctx.viewBounds.xMax],\n y: [ctx.viewBounds.yMin, ctx.viewBounds.yMax],\n });\n ctx.requestRender();\n}\n\n/**\n * Apply pan to the chart\n */\nexport function applyPan(\n ctx: NavigationContext,\n deltaX: number,\n deltaY: number,\n axisId?: string\n): void {\n const pa = ctx.getPlotArea();\n const dx = (deltaX / pa.width) * (ctx.viewBounds.xMax - ctx.viewBounds.xMin);\n \n // Apply pan to X (always global)\n ctx.viewBounds.xMin -= dx;\n ctx.viewBounds.xMax -= dx;\n\n if (axisId) {\n // Pan targeted axis only\n const scale = ctx.yScales.get(axisId);\n if (scale) {\n const hasBars = Array.from(ctx.series.values()).some(s => s.isVisible() && s.getType() === 'bar');\n const range = scale.domain[1] - scale.domain[0];\n const moveY = (deltaY / pa.height) * range;\n \n let nextMin = scale.domain[0] + moveY;\n let nextMax = scale.domain[1] + moveY;\n \n if (hasBars) {\n nextMin = 0; // Lock bottom\n // Panning up/down only affects the top bound for bars\n nextMax = scale.domain[1] + moveY; \n }\n\n scale.setDomain(nextMin, nextMax);\n \n // Sync primary viewBounds if applicable\n if (axisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = nextMin;\n ctx.viewBounds.yMax = nextMax;\n }\n }\n } else {\n // Global pan: apply to all Y axes proportionally\n const hasBars = Array.from(ctx.series.values()).some(s => s.isVisible() && s.getType() === 'bar');\n ctx.yScales.forEach((scale, id) => {\n const range = scale.domain[1] - scale.domain[0];\n const moveY = (deltaY / pa.height) * range;\n \n let nextMin = scale.domain[0] + moveY;\n let nextMax = scale.domain[1] + moveY;\n\n if (hasBars) {\n nextMin = 0;\n }\n\n scale.setDomain(nextMin, nextMax);\n \n if (id === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = nextMin;\n ctx.viewBounds.yMax = nextMax;\n }\n });\n }\n\n const dy = (deltaY / pa.height) * (ctx.viewBounds.yMax - ctx.viewBounds.yMin);\n ctx.events.emit(\"pan\", { deltaX: dx, deltaY: dy });\n ctx.requestRender();\n}\n\n","/**\n * Chart Scaling and Selection\n * \n * Handles auto-scaling and box zoom (rectangle selection) logic.\n */\nimport type { NavigationContext } from \"./ChartNavigation\";\nimport type { ZoomOptions } from \"../../types\";\n\n/**\n * Auto-scale all axes to fit data\n */\nexport function autoScaleAll(ctx: NavigationContext): void {\n if (ctx.series.size === 0) return;\n\n let xMin = Infinity;\n let xMax = -Infinity;\n \n // Track bounds per Y-axis\n const yAxisBounds = new Map<string, { min: number, max: number }>();\n ctx.yScales.forEach((_, id) => {\n yAxisBounds.set(id, { min: Infinity, max: -Infinity });\n });\n\n let hasValidData = false;\n\n ctx.series.forEach((s) => {\n if (!s.isVisible()) return;\n\n const b = s.getBounds();\n if (\n b &&\n isFinite(b.xMin) &&\n isFinite(b.xMax) &&\n isFinite(b.yMin) &&\n isFinite(b.yMax)\n ) {\n xMin = Math.min(xMin, b.xMin);\n xMax = Math.max(xMax, b.xMax);\n \n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const yBounds = yAxisBounds.get(axisId);\n if (yBounds) {\n yBounds.min = Math.min(yBounds.min, b.yMin);\n yBounds.max = Math.max(yBounds.max, b.yMax);\n }\n \n hasValidData = true;\n }\n });\n\n if (!hasValidData) return;\n\n const MAX_VAL = 1e15;\n const MIN_VAL = -1e15;\n\n if (ctx.xAxisOptions.auto) {\n let xRange = xMax - xMin;\n if (xRange <= 0 || !isFinite(xRange)) xRange = Math.abs(xMin) * 0.1 || 1;\n const xPad = Math.min(xRange * 0.05, 1e10);\n ctx.viewBounds.xMin = Math.max(MIN_VAL, xMin - xPad);\n ctx.viewBounds.xMax = Math.min(MAX_VAL, xMax + xPad);\n }\n\n yAxisBounds.forEach((bounds, id) => {\n if (bounds.min === Infinity) return;\n const opts = ctx.yAxisOptionsMap.get(id);\n const scale = ctx.yScales.get(id);\n if (opts && opts.auto && scale) {\n let yRange = bounds.max - bounds.min;\n if (yRange <= 0 || !isFinite(yRange)) yRange = Math.abs(bounds.min) * 0.1 || 1;\n const yPad = Math.min(yRange * 0.05, 1e10);\n \n let newMin = Math.max(MIN_VAL, bounds.min - yPad);\n const newMax = Math.min(MAX_VAL, bounds.max + yPad);\n scale.setDomain(newMin, newMax);\n \n if (id === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = newMin;\n ctx.viewBounds.yMax = newMax;\n }\n }\n });\n ctx.requestRender();\n}\n\n/**\n * Handle box zoom selection\n */\nexport function handleBoxZoom(\n ctx: NavigationContext,\n selectionRect: { x: number; y: number; width: number; height: number } | null,\n currentRect: { x: number; y: number; width: number; height: number } | null,\n zoom: (options: ZoomOptions) => void\n): { x: number; y: number; width: number; height: number } | null {\n if (selectionRect === null) {\n if (currentRect && currentRect.width > 5 && currentRect.height > 5) {\n const plotArea = ctx.getPlotArea();\n const bounds = ctx.viewBounds;\n\n const xMinNorm = (currentRect.x - plotArea.x) / plotArea.width;\n const xMaxNorm = (currentRect.x + currentRect.width - plotArea.x) / plotArea.width;\n const yMaxNorm = 1 - (currentRect.y - plotArea.y) / plotArea.height;\n const yMinNorm = 1 - (currentRect.y + currentRect.height - plotArea.y) / plotArea.height;\n\n const newXMin = bounds.xMin + xMinNorm * (bounds.xMax - bounds.xMin);\n const newXMax = bounds.xMin + xMaxNorm * (bounds.xMax - bounds.xMin);\n const newYMin = bounds.yMin + yMinNorm * (bounds.yMax - bounds.yMin);\n const newYMax = bounds.yMin + yMaxNorm * (bounds.yMax - bounds.yMin);\n\n zoom({ x: [newXMin, newXMax], y: [newYMin, newYMax] });\n }\n return null;\n }\n return selectionRect;\n}\n","/**\n * Chart Renderer\n * \n * Core rendering logic for the chart (WebGL + Overlay).\n */\n\nimport type { Bounds, CursorOptions, AxisOptions } from \"../../types\";\nimport type { Series } from \"../Series\";\nimport type { Scale } from \"../../scales\";\nimport type { NativeWebGLRenderer, NativeSeriesRenderData as SeriesRenderData } from \"../../renderer/NativeWebGLRenderer\";\nimport type { OverlayRenderer } from \"../OverlayRenderer\";\nimport type { PlotArea, CursorState, ChartEventMap } from \"../../types\";\nimport type { AnnotationManager } from \"../annotations\";\nimport type { ChartStatistics } from \"../ChartStatistics\";\nimport type { EventEmitter } from \"../EventEmitter\";\n\nexport interface RenderContext {\n webglCanvas: HTMLCanvasElement;\n overlayCanvas: HTMLCanvasElement;\n overlayCtx: CanvasRenderingContext2D;\n container: HTMLDivElement;\n series: Map<string, Series>;\n viewBounds: Bounds;\n xScale: Scale;\n yScales: Map<string, Scale>;\n yAxisOptionsMap: Map<string, AxisOptions>;\n xAxisOptions: AxisOptions;\n primaryYAxisId: string;\n renderer: NativeWebGLRenderer;\n overlay: OverlayRenderer;\n annotationManager: AnnotationManager;\n backgroundColor: [number, number, number, number];\n cursorOptions: CursorOptions | null;\n cursorPosition: { x: number; y: number } | null;\n selectionRect: { x: number; y: number; width: number; height: number } | null;\n stats: ChartStatistics | null;\n showStatistics: boolean;\n events: EventEmitter<ChartEventMap>;\n updateSeriesBuffer: (s: Series) => void;\n getPlotArea: () => PlotArea;\n pixelToDataX: (px: number) => number;\n pixelToDataY: (py: number) => number;\n tooltip: import(\"../tooltip\").TooltipManager;\n}\n\n/**\n * Prepare series data for WebGL rendering\n */\nexport function prepareSeriesData(\n ctx: RenderContext,\n plotArea: PlotArea\n): SeriesRenderData[] {\n const seriesData: SeriesRenderData[] = [];\n\n // Update all scales with current plot area range and domain\n ctx.xScale.setRange(plotArea.x, plotArea.x + plotArea.width);\n ctx.xScale.setDomain(ctx.viewBounds.xMin, ctx.viewBounds.xMax);\n\n ctx.yScales.forEach((scale, id) => {\n scale.setRange(plotArea.y + plotArea.height, plotArea.y);\n if (id === ctx.primaryYAxisId) {\n scale.setDomain(ctx.viewBounds.yMin, ctx.viewBounds.yMax);\n }\n });\n\n ctx.series.forEach((s) => {\n if (s.needsBufferUpdate) {\n ctx.updateSeriesBuffer(s);\n s.needsBufferUpdate = false;\n }\n\n const buf = ctx.renderer.getBuffer(s.getId());\n const seriesType = s.getType();\n \n // Candlesticks use sub-buffers, so main buffer might be missing\n if (buf || seriesType === 'candlestick') {\n \n // Determine Y-bounds for this series\n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const scale = ctx.yScales.get(axisId);\n let yBounds: { min: number; max: number } | undefined;\n \n if (scale) {\n yBounds = { min: scale.domain[0], max: scale.domain[1] };\n }\n\n // Map area type to band for rendering (area fills to y=0)\n const renderType = seriesType === 'area' ? 'band' : seriesType;\n\n // Base render data (only if buffer exists)\n let renderData: SeriesRenderData | null = null;\n \n if (buf) {\n renderData = {\n id: s.getId(),\n buffer: buf,\n count: s.getPointCount(),\n style: s.getStyle(),\n visible: s.isVisible(),\n type: renderType,\n yBounds,\n };\n }\n\n // Special count multipliers for geometry-heavy types\n if (renderData) {\n if (seriesType === \"band\" || seriesType === \"area\") {\n renderData.count = s.getPointCount() * 2;\n } else if (seriesType === \"bar\") {\n renderData.count = s.getPointCount() * 6;\n }\n \n // Add step buffer for step types\n if (seriesType === 'step' || seriesType === 'step+scatter') {\n const stepBuf = ctx.renderer.getBuffer(`${s.getId()}_step`);\n if (stepBuf) {\n renderData.stepBuffer = stepBuf;\n // Calculate step count based on mode\n const stepMode = s.getStyle().stepMode ?? 'after';\n const pointCount = s.getPointCount();\n if (stepMode === 'center') {\n renderData.stepCount = 1 + (pointCount - 1) * 3;\n } else {\n renderData.stepCount = pointCount * 2 - 1;\n }\n }\n }\n \n if (seriesType === 'heatmap') {\n const hData = s.getHeatmapData();\n const hStyle = s.getHeatmapStyle();\n if (hData) {\n // Heatmap count is 6 vertices per cell (2 triangles)\n const w = hData.xValues.length;\n const h = hData.yValues.length;\n renderData.count = (w - 1) * (h - 1) * 6;\n \n // Calculate Z-bounds if not provided\n let zMin = Infinity, zMax = -Infinity;\n for (let i = 0; i < hData.zValues.length; i++) {\n const v = hData.zValues[i];\n if (v < zMin) zMin = v;\n if (v > zMax) zMax = v;\n }\n if (zMin === zMax) {\n zMin -= 1;\n zMax += 1;\n }\n\n renderData.zBounds = { \n min: hStyle?.colorScale?.min ?? (zMin === Infinity ? 0 : zMin), \n max: hStyle?.colorScale?.max ?? (zMax === -Infinity ? 1 : zMax) \n };\n \n if (renderData.zBounds.min === renderData.zBounds.max) {\n renderData.zBounds.max = renderData.zBounds.min + 1;\n }\n \n // Attach texture\n const colormapId = `${s.getId()}_colormap`;\n renderData.colormapTexture = ctx.renderer.getTexture(colormapId);\n }\n }\n }\n\n if (seriesType === 'candlestick') {\n const bullishBuf = ctx.renderer.getBuffer(`${s.getId()}_bullish`);\n if (bullishBuf) {\n seriesData.push({\n id: `${s.getId()}_bullish`,\n buffer: bullishBuf,\n count: s.bullishCount || 0,\n style: { ...s.getStyle(), color: (s.getStyle() as any).bullishColor || '#26a69a' },\n visible: s.isVisible(),\n type: 'bar', // Using bar renderer (triangles)\n yBounds,\n });\n }\n const bearishBuf = ctx.renderer.getBuffer(`${s.getId()}_bearish`);\n if (bearishBuf) {\n seriesData.push({\n id: `${s.getId()}_bearish`,\n buffer: bearishBuf,\n count: s.bearishCount || 0,\n style: { ...s.getStyle(), color: (s.getStyle() as any).bearishColor || '#ef5350' },\n visible: s.isVisible(),\n type: 'bar', // Using bar renderer (triangles)\n yBounds,\n });\n }\n } else if (renderData) {\n seriesData.push(renderData);\n }\n }\n });\n\n return seriesData;\n}\n\n/**\n * Render overlay elements (axes, grid, annotations, etc.)\n */\nexport function renderOverlay(\n ctx: RenderContext,\n plotArea: PlotArea,\n primaryYScale: Scale\n): void {\n const rect = ctx.container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n console.warn(\"[SciChart] Container has zero size in render, skipping overlay\");\n return;\n }\n\n ctx.overlay.clear(rect.width, rect.height);\n ctx.overlay.drawGrid(plotArea, ctx.xScale, primaryYScale);\n ctx.overlay.drawXAxis(plotArea, ctx.xScale, ctx.xAxisOptions.label);\n\n // Group axes by position\n const leftAxes: string[] = [];\n const rightAxes: string[] = [];\n \n ctx.yAxisOptionsMap.forEach((opts, id) => {\n if(opts.position === 'right') rightAxes.push(id);\n else leftAxes.push(id);\n });\n\n // Draw Left Axes (stacked outwards)\n leftAxes.forEach((id, index) => {\n const scale = ctx.yScales.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if(scale && opts) {\n const offset = index * 65; \n ctx.overlay.drawYAxis(plotArea, scale, opts.label, 'left', offset);\n }\n });\n\n // Draw Right Axes (stacked outwards)\n rightAxes.forEach((id, index) => {\n const scale = ctx.yScales.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if(scale && opts) {\n const offset = index * 65; \n ctx.overlay.drawYAxis(plotArea, scale, opts.label, 'right', offset);\n }\n });\n\n ctx.overlay.drawPlotBorder(plotArea);\n\n // Draw Error Bars for all series with error data\n ctx.series.forEach((s) => {\n if (s.isVisible() && s.hasErrorData()) {\n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const scale = ctx.yScales.get(axisId);\n const yScale = scale || primaryYScale; \n \n ctx.overlay.drawErrorBars(plotArea, s, ctx.xScale, yScale);\n }\n });\n\n // Draw Selection Box\n if (ctx.selectionRect) {\n ctx.overlay.drawSelectionRect(ctx.selectionRect);\n }\n\n // Draw Annotations\n if (ctx.annotationManager.count > 0) {\n ctx.annotationManager.render(ctx.overlayCtx, plotArea, ctx.viewBounds);\n }\n\n // Cursor\n if (ctx.cursorOptions?.enabled && ctx.cursorPosition) {\n // Use legacy tooltip only if new tooltip system doesn't have an active tooltip\n const skipLegacyTooltip = ctx.tooltip?.hasActiveTooltip?.();\n \n const cursor: CursorState = {\n enabled: true,\n x: ctx.cursorPosition.x,\n y: ctx.cursorPosition.y,\n crosshair: ctx.cursorOptions.crosshair ?? false,\n tooltipText: skipLegacyTooltip \n ? undefined \n : (ctx.cursorOptions.formatter\n ? ctx.cursorOptions.formatter(\n ctx.pixelToDataX(ctx.cursorPosition.x),\n ctx.pixelToDataY(ctx.cursorPosition.y),\n \"\"\n )\n : `X: ${ctx.pixelToDataX(ctx.cursorPosition.x).toFixed(3)}\\nY: ${ctx.pixelToDataY(ctx.cursorPosition.y).toExponential(2)}`),\n };\n ctx.overlay.drawCursor(plotArea, cursor);\n }\n\n // Draw new tooltips\n if (ctx.tooltip) {\n ctx.tooltip.render();\n }\n\n // Statistics Panel\n if (ctx.stats && ctx.showStatistics) {\n ctx.stats.update(ctx.viewBounds);\n }\n}\n","/**\n * Series Bounds Calculation Logic\n */\nimport type { SeriesData, Bounds, SeriesType, HeatmapData } from \"../../types\";\n\nexport function calculateSeriesBounds(\n type: SeriesType,\n data: SeriesData,\n heatmapData?: HeatmapData\n): Bounds {\n if (type === \"heatmap\" && heatmapData) {\n const { xValues, yValues } = heatmapData;\n let xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity;\n for (let i = 0; i < xValues.length; i++) {\n const v = xValues[i];\n if (v < xMin) xMin = v;\n if (v > xMax) xMax = v;\n }\n for (let i = 0; i < yValues.length; i++) {\n const v = yValues[i];\n if (v < yMin) yMin = v;\n if (v > yMax) yMax = v;\n }\n return { xMin, xMax, yMin, yMax };\n }\n\n const { x, y, y2, high, low } = data;\n if (x.length === 0) return { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n\n for (let i = 0; i < x.length; i++) {\n const xVal = x[i];\n if (!isFinite(xVal)) continue;\n\n if (xVal < xMin) xMin = xVal;\n if (xVal > xMax) xMax = xVal;\n\n // Check all possible Y values for this point\n const yValues = [y[i]];\n if (y2 && isFinite(y2[i])) yValues.push(y2[i]);\n if (high && isFinite(high[i])) yValues.push(high[i]);\n if (low && isFinite(low[i])) yValues.push(low[i]);\n\n for (const v of yValues) {\n if (isFinite(v)) {\n if (v < yMin) yMin = v;\n if (v > yMax) yMax = v;\n }\n }\n }\n\n if (xMin === Infinity) return { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n return { xMin, xMax, yMin, yMax };\n}\n","/**\n * Series Data Utilities\n */\nimport type { SeriesData } from \"../../types\";\n\nexport function ensureTypedArray(\n data: Float32Array | Float64Array | number[] | undefined\n): Float32Array | Float64Array {\n if (!data) return new Float32Array(0);\n if (data instanceof Float32Array || data instanceof Float64Array) return data;\n return new Float32Array(data);\n}\n\nexport function appendTypedArray(\n existing: Float32Array | Float64Array,\n newData: Float32Array | Float64Array\n): Float32Array | Float64Array {\n const combined = new (existing.constructor as\n | Float32ArrayConstructor\n | Float64ArrayConstructor)(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n return combined;\n}\n\nexport function applySmoothing(data: SeriesData, windowSize: number): SeriesData {\n const { x, y } = data;\n const len = x.length;\n if (len < windowSize) return { ...data };\n\n const smoothedY = new Float32Array(len);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < len; i++) {\n let sum = 0;\n let count = 0;\n for (let j = i - halfWindow; j <= i + halfWindow; j++) {\n if (j >= 0 && j < len) {\n sum += y[j];\n count++;\n }\n }\n smoothedY[i] = sum / count;\n }\n\n return { x, y: smoothedY };\n}\n\nexport function getYError(data: SeriesData, i: number): [number, number] | null {\n if (i < 0 || i >= data.x.length) return null;\n if (data.yError && i < data.yError.length) {\n const err = data.yError[i];\n return [err, err];\n }\n const minus = data.yErrorMinus?.[i] ?? 0;\n const plus = data.yErrorPlus?.[i] ?? 0;\n return (minus > 0 || plus > 0) ? [minus, plus] : null;\n}\n\nexport function getXError(data: SeriesData, i: number): [number, number] | null {\n if (i < 0 || i >= data.x.length) return null;\n if (data.xError && i < data.xError.length) {\n const err = data.xError[i];\n return [err, err];\n }\n const minus = data.xErrorMinus?.[i] ?? 0;\n const plus = data.xErrorPlus?.[i] ?? 0;\n return (minus > 0 || plus > 0) ? [minus, plus] : null;\n}\n\n","/**\n * Series - Represents a single data series in the chart\n */\nimport type {\n SeriesOptions,\n SeriesData,\n SeriesStyle,\n SeriesUpdateData,\n Bounds,\n SeriesType,\n HeatmapOptions,\n HeatmapData,\n HeatmapStyle,\n} from \"../../types\";\nimport { calculateSeriesBounds } from \"./SeriesBounds\";\nimport { \n ensureTypedArray, \n appendTypedArray, \n applySmoothing,\n getYError,\n getXError\n} from \"./SeriesDataUtils\";\n\nconst DEFAULT_STYLE: SeriesStyle = {\n color: \"#ff0055\",\n width: 1.5,\n opacity: 1,\n pointSize: 4,\n};\n\nexport class Series {\n private id: string;\n private type: SeriesType;\n private yAxisId?: string;\n private data: SeriesData;\n private style: SeriesStyle;\n private visible: boolean;\n private name?: string;\n private stackId?: string;\n private cycle?: number;\n private maxPoints?: number;\n\n public bullishCount = 0;\n public bearishCount = 0;\n\n private heatmapData?: HeatmapData;\n private heatmapStyle?: HeatmapStyle;\n\n private lastAppendCount = 0;\n private cachedBounds: Bounds | null = null;\n private boundsNeedsUpdate = true;\n private _needsBufferUpdate = true;\n private smoothedData: SeriesData | null = null;\n private smoothingNeedsUpdate = true;\n\n constructor(options: SeriesOptions | HeatmapOptions) {\n this.id = options.id;\n this.name = options.name;\n this.type = options.type;\n this.yAxisId = options.yAxisId;\n this.visible = options.visible ?? true;\n this.stackId = (options as SeriesOptions).stackId;\n this.cycle = (options as any).cycle;\n this.maxPoints = (options as any).maxPoints;\n\n if (this.type === \"heatmap\") {\n const hOpts = options as HeatmapOptions;\n this.data = { x: new Float32Array(0), y: new Float32Array(0) };\n this.heatmapData = {\n xValues: ensureTypedArray(hOpts.data.xValues),\n yValues: ensureTypedArray(hOpts.data.yValues),\n zValues: ensureTypedArray(hOpts.data.zValues),\n };\n this.heatmapStyle = hOpts.style;\n } else {\n const d = (options as SeriesOptions).data;\n this.data = {\n x: ensureTypedArray(d?.x),\n y: ensureTypedArray(d?.y),\n yError: d?.yError ? ensureTypedArray(d.yError) : undefined,\n yErrorPlus: d?.yErrorPlus ? ensureTypedArray(d.yErrorPlus) : undefined,\n yErrorMinus: d?.yErrorMinus ? ensureTypedArray(d.yErrorMinus) : undefined,\n xError: d?.xError ? ensureTypedArray(d.xError) : undefined,\n xErrorPlus: d?.xErrorPlus ? ensureTypedArray(d.xErrorPlus) : undefined,\n xErrorMinus: d?.xErrorMinus ? ensureTypedArray(d.xErrorMinus) : undefined,\n y2: d?.y2 ? ensureTypedArray(d.y2) : undefined,\n open: d?.open ? ensureTypedArray(d.open) : undefined,\n high: d?.high ? ensureTypedArray(d.high) : undefined,\n low: d?.low ? ensureTypedArray(d.low) : undefined,\n close: d?.close ? ensureTypedArray(d.close) : undefined,\n };\n }\n this.style = { ...DEFAULT_STYLE, ...options.style };\n // Legacy support for top-level style props\n if ((options as any).color) this.style.color = (options as any).color;\n if ((options as any).width) this.style.width = (options as any).width;\n if ((options as any).pointSize) this.style.pointSize = (options as any).pointSize;\n }\n\n getId = () => this.id;\n getName = () => this.name || this.id;\n getType = () => this.type;\n getYAxisId = () => this.yAxisId;\n getStackId = () => this.stackId;\n getVisible = () => this.visible;\n isVisible = () => this.visible;\n getStyle = () => this.style;\n getHeatmapData = () => this.heatmapData;\n getHeatmapStyle = () => this.heatmapStyle;\n getCycle = () => this.cycle;\n getPointCount = () => this.type === \"heatmap\" ? this.heatmapData!.xValues.length * this.heatmapData!.yValues.length : this.data.x.length;\n getLastAppendCount = () => this.lastAppendCount;\n resetLastAppendCount = () => { this.lastAppendCount = 0; };\n hasErrorData = () => !!(this.data.yError || this.data.yErrorPlus || this.data.yErrorMinus || this.data.xError || this.data.xErrorPlus || this.data.xErrorMinus);\n getYError = (i: number) => getYError(this.data, i);\n getXError = (i: number) => getXError(this.data, i);\n\n getData(): SeriesData {\n if (this.style.smoothing && this.style.smoothing > 0) {\n if (this.smoothingNeedsUpdate || !this.smoothedData) {\n this.smoothedData = applySmoothing(this.data, 5);\n this.smoothingNeedsUpdate = false;\n }\n return this.smoothedData;\n }\n return this.data;\n }\n\n getBounds(): Bounds | null {\n if (this.data.x.length === 0 && this.type !== \"heatmap\") return null;\n if (this.boundsNeedsUpdate || !this.cachedBounds) {\n this.cachedBounds = calculateSeriesBounds(this.type, this.data, this.heatmapData);\n this.boundsNeedsUpdate = false;\n }\n return this.cachedBounds;\n }\n\n updateData(update: SeriesUpdateData): void {\n if (!update) return;\n if (update.append) {\n const newX = ensureTypedArray(update.x);\n const newY = ensureTypedArray(update.y);\n if (newX.length > 0) {\n this.data.x = appendTypedArray(this.data.x, newX);\n this.data.y = appendTypedArray(this.data.y, newY);\n if (update.y2) this.data.y2 = this.data.y2 ? appendTypedArray(this.data.y2, ensureTypedArray(update.y2)) : ensureTypedArray(update.y2);\n if (update.open) this.data.open = this.data.open ? appendTypedArray(this.data.open, ensureTypedArray(update.open)) : ensureTypedArray(update.open);\n if (update.high) this.data.high = this.data.high ? appendTypedArray(this.data.high, ensureTypedArray(update.high)) : ensureTypedArray(update.high);\n if (update.low) this.data.low = this.data.low ? appendTypedArray(this.data.low, ensureTypedArray(update.low)) : ensureTypedArray(update.low);\n if (update.close) this.data.close = this.data.close ? appendTypedArray(this.data.close, ensureTypedArray(update.close)) : ensureTypedArray(update.close);\n \n this.lastAppendCount += newX.length;\n if (this.maxPoints && this.data.x.length > this.maxPoints) {\n const shift = this.data.x.length - this.maxPoints;\n this.data.x = this.data.x.slice(shift);\n this.data.y = this.data.y.slice(shift);\n if (this.data.y2) this.data.y2 = this.data.y2.slice(shift);\n if (this.data.open) this.data.open = this.data.open.slice(shift);\n if (this.data.high) this.data.high = this.data.high.slice(shift);\n if (this.data.low) this.data.low = this.data.low.slice(shift);\n if (this.data.close) this.data.close = this.data.close.slice(shift);\n this.lastAppendCount = 0;\n }\n }\n } else {\n if (update.x) this.data.x = ensureTypedArray(update.x);\n if (update.y) this.data.y = ensureTypedArray(update.y);\n if (update.y2) this.data.y2 = ensureTypedArray(update.y2);\n if (update.open) this.data.open = ensureTypedArray(update.open);\n if (update.high) this.data.high = ensureTypedArray(update.high);\n if (update.low) this.data.low = ensureTypedArray(update.low);\n if (update.close) this.data.close = ensureTypedArray(update.close);\n this.lastAppendCount = 0;\n }\n this.boundsNeedsUpdate = true;\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n\n setStyle(style: Partial<SeriesStyle>): void {\n const oldSmooth = this.style.smoothing;\n this.style = { ...this.style, ...style };\n if (this.style.smoothing !== oldSmooth) {\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n }\n\n setType(type: SeriesType): void {\n this.type = type;\n this._needsBufferUpdate = true;\n }\n\n setVisible(visible: boolean): void {\n this.visible = visible;\n }\n\n get needsBufferUpdate() { return this._needsBufferUpdate; }\n set needsBufferUpdate(val: boolean) { this._needsBufferUpdate = val; }\n\n setMaxPoints(maxPoints: number | undefined): void {\n this.maxPoints = maxPoints;\n if (this.maxPoints && this.data.x.length > this.maxPoints) {\n const shift = this.data.x.length - this.maxPoints;\n this.data.x = this.data.x.slice(shift);\n this.data.y = this.data.y.slice(shift);\n if (this.data.y2) this.data.y2 = this.data.y2.slice(shift);\n if (this.data.open) this.data.open = this.data.open.slice(shift);\n if (this.data.high) this.data.high = this.data.high.slice(shift);\n if (this.data.low) this.data.low = this.data.low.slice(shift);\n if (this.data.close) this.data.close = this.data.close.slice(shift);\n this._needsBufferUpdate = true;\n }\n }\n\n destroy(): void {\n this.data = { x: new Float32Array(0), y: new Float32Array(0) };\n this.cachedBounds = null;\n }\n}\n","/**\n * WebGL Renderer Interface & Factory\n *\n * This module provides a common interface for WebGL rendering.\n * Currently optimized for NativeWebGLRenderer (zero dependencies).\n */\n\nimport type { Bounds } from '../types';\nimport { NativeWebGLRenderer } from './NativeWebGLRenderer';\n\n// ============================================\n// Common Types\n// ============================================\n\nexport interface SeriesRenderData {\n id: string;\n buffer: WebGLBuffer;\n count: number;\n style: any;\n visible: boolean;\n type: string;\n zBounds?: { min: number; max: number };\n colormapTexture?: WebGLTexture;\n}\n\nexport interface RenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n}\n\n// ============================================\n// Renderer Interface\n// ============================================\n\n/**\n * Common interface for all WebGL renderer implementations\n */\nexport interface IWebGLRenderer {\n /** Check if WebGL is available and initialized */\n readonly available: boolean;\n\n /**\n * Create or update a GPU buffer with interleaved X,Y data\n * @param id - Unique buffer identifier\n * @param data - Interleaved Float32Array [x0, y0, x1, y1, ...]\n */\n createBuffer(id: string, data: Float32Array): void;\n\n /**\n * Get a buffer by ID\n */\n getBuffer(id: string): WebGLBuffer | undefined;\n\n /**\n * Delete a buffer and free GPU memory\n */\n deleteBuffer(id: string): void;\n \n /** \n * Create a 1D texture for heatmaps \n */\n createColormapTexture(id: string, data: Uint8Array): WebGLTexture;\n\n /**\n * Render a frame with all visible series\n */\n render(series: SeriesRenderData[], options: RenderOptions): void;\n\n /**\n * Handle canvas resize\n */\n resize(): void;\n\n /**\n * Get WebGL capabilities/limits\n */\n getLimits(): Record<string, unknown>;\n\n /**\n * Cleanup and destroy all GPU resources\n */\n destroy(): void;\n}\n\n// ============================================\n// Factory Functions\n// ============================================\n\n/**\n * Create a WebGL renderer (Native WebGL)\n *\n * @param canvas - Target canvas element\n */\nexport function createRenderer(canvas: HTMLCanvasElement): IWebGLRenderer {\n return new NativeWebGLRenderer(canvas);\n}\n\n/**\n * Create a renderer synchronously (native only)\n */\nexport { NativeWebGLRenderer as createNativeRenderer } from './NativeWebGLRenderer';\n","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(\"[SciChart] 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(\"[SciChart] 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(\"[SciChart] 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","/**\n * Prepare bar chart data for WebGL rendering\n * Creates rectangle vertices for each bar (2 triangles per bar = 6 vertices)\n * \n * @param x - X positions of bar centers\n * @param y - Y heights of bars\n * @param barWidth - Width of each bar in data units\n * @returns Interleaved vertex data ready for gl.TRIANGLES\n */\nexport function interleaveBarData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n barWidth: number\n): Float32Array {\n const n = Math.min(x.length, y.length);\n // Each bar = 2 triangles = 6 vertices, 2 floats per vertex\n const result = new Float32Array(n * 6 * 2);\n \n const halfWidth = barWidth * 0.5;\n \n for (let i = 0; i < n; i++) {\n const xi = x[i];\n const yi = y[i];\n const base = i * 12; // 6 vertices * 2 floats\n \n // Define bar corners\n const x0 = xi - halfWidth; // Left\n const x1 = xi + halfWidth; // Right\n const y0 = 0; // Bottom\n const y1 = yi; // Top\n \n // First triangle (bottom-left, bottom-right, top-left)\n result[base + 0] = x0;\n result[base + 1] = y0;\n result[base + 2] = x1;\n result[base + 3] = y0;\n result[base + 4] = x0;\n result[base + 5] = y1;\n \n // Second triangle (top-left, bottom-right, top-right)\n result[base + 6] = x0;\n result[base + 7] = y1;\n result[base + 8] = x1;\n result[base + 9] = y0;\n result[base + 10] = x1;\n result[base + 11] = y1;\n }\n \n return result;\n}\n\n/**\n * Calculate automatic bar width based on data spacing\n */\nexport function calculateBarWidth(x: Float32Array | Float64Array | number[]): number {\n if (x.length < 2) return 1.0;\n \n // Find minimum spacing between consecutive bars\n let minSpacing = Infinity;\n for (let i = 1; i < x.length; i++) {\n const spacing = Math.abs(x[i] - x[i - 1]);\n if (spacing > 0 && spacing < minSpacing) {\n minSpacing = spacing;\n }\n }\n \n // Bar width is 80% of minimum spacing (20% gap)\n return minSpacing === Infinity ? 1.0 : minSpacing * 0.8;\n}\n","/**\n * Prepare Heatmap data for WebGL rendering\n * Creates a mesh of triangles for the grid.\n * \n * @param x - X coordinates of grid columns\n * @param y - Y coordinates of grid rows\n * @param z - Z values (matrix flattened in row-major order: width=x.length, height=y.length)\n * @returns Interleaved data [x, y, value, ...] ready for gl.TRIANGLES\n */\nexport function interleaveHeatmapData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n z: Float32Array | Float64Array | number[]\n): Float32Array {\n const width = x.length;\n const height = y.length;\n \n if (width * height > z.length) {\n console.warn(\"[Heatmap] Z array is too small for the specified grid dimensions\");\n }\n\n // Each cell is 2 triangles = 6 vertices\n // Each vertex has 3 floats: [x, y, value]\n const numCells = (width - 1) * (height - 1);\n const result = new Float32Array(numCells * 6 * 3);\n \n let idx = 0;\n for (let j = 0; j < height - 1; j++) {\n for (let i = 0; i < width - 1; i++) {\n // Corners\n const x0 = x[i];\n const x1 = x[i+1];\n const y0 = y[j];\n const y1 = y[j+1];\n \n const v00 = z[j * width + i];\n const v10 = z[j * width + (i + 1)];\n const v01 = z[(j + 1) * width + i];\n const v11 = z[(j + 1) * width + (i + 1)];\n \n // Triangle 1 (BL, BR, TL)\n result[idx++] = x0; result[idx++] = y0; result[idx++] = v00;\n result[idx++] = x1; result[idx++] = y0; result[idx++] = v10;\n result[idx++] = x0; result[idx++] = y1; result[idx++] = v01;\n \n // Triangle 2 (TL, BR, TR)\n result[idx++] = x0; result[idx++] = y1; result[idx++] = v01;\n result[idx++] = x1; result[idx++] = y0; result[idx++] = v10;\n result[idx++] = x1; result[idx++] = y1; result[idx++] = v11;\n }\n }\n \n return result;\n}\n\n/**\n * Generates a colormap texture data\n * Viridis approximation\n */\nexport function getColormap(name: string = 'viridis'): Uint8Array {\n const size = 256;\n const data = new Uint8Array(size * 4);\n \n for (let i = 0; i < size; i++) {\n const t = i / (size - 1);\n let r, g, b;\n \n if (name === 'jet') {\n r = Math.min(Math.max(1.5 - Math.abs(t * 4 - 3), 0), 1);\n g = Math.min(Math.max(1.5 - Math.abs(t * 4 - 2), 0), 1);\n b = Math.min(Math.max(1.5 - Math.abs(t * 4 - 1), 0), 1);\n } else if (name === 'grayscale') {\n r = g = b = t;\n } else if (name === 'plasma') {\n r = 0.5 + 0.5 * Math.sin(Math.PI * (t - 0.5));\n g = 0.5 + 0.5 * Math.sin(Math.PI * t);\n b = 0.8;\n } else { // default viridis approx\n r = 0.267 * (1 - t) + 0.993 * t;\n g = 0.005 * (1 - t) + 0.906 * t;\n b = 0.337 * (1 - t) + 0.144 * t;\n // More accurate viridis constants could be used\n }\n \n data[i * 4 + 0] = r * 255;\n data[i * 4 + 1] = g * 255;\n data[i * 4 + 2] = b * 255;\n data[i * 4 + 3] = 255;\n }\n \n return data;\n}\n","/**\n * Candlestick Renderer Utilities\n */\n\n/**\n * Interleave data for candlestick rendering\n * Each candle is represented by a body (box) and a wick (line/thin box)\n * Returns a Float32Array of interleaved [x, y] coordinates for TRIANGLES\n */\nexport function interleaveCandlestickData(\n x: Float32Array | Float64Array,\n open: Float32Array | Float64Array,\n high: Float32Array | Float64Array,\n low: Float32Array | Float64Array,\n close: Float32Array | Float64Array,\n width: number\n): { bullish: Float32Array; bearish: Float32Array } {\n const n = x.length;\n const bullishBody: number[] = [];\n const bearishBody: number[] = [];\n \n const halfWidth = width / 2;\n const wickWidth = width / 10;\n const halfWick = wickWidth / 2;\n\n for (let i = 0; i < n; i++) {\n const isBullish = close[i] >= open[i];\n const target = isBullish ? bullishBody : bearishBody;\n \n const bodyTop = Math.max(open[i], close[i]);\n const bodyBottom = Math.min(open[i], close[i]);\n \n // Body (Rectangle as 2 triangles)\n appendRect(target, x[i] - halfWidth, bodyBottom, x[i] + halfWidth, bodyTop);\n \n // Wick (Rectangle as 2 triangles, thin)\n appendRect(target, x[i] - halfWick, low[i], x[i] + halfWick, high[i]);\n }\n\n return {\n bullish: new Float32Array(bullishBody),\n bearish: new Float32Array(bearishBody)\n };\n}\n\nfunction appendRect(arr: number[], x1: number, y1: number, x2: number, y2: number) {\n // Triangle 1\n arr.push(x1, y1, x2, y1, x1, y2);\n // Triangle 2\n arr.push(x2, y1, x2, y2, x1, y2);\n}\n","/**\n * Series Buffer Management and Stacking Logic\n */\nimport { Series } from \"../../Series\";\nimport {\n interleaveData,\n interleaveStepData,\n interleaveBandData,\n interleaveBarData,\n calculateBarWidth,\n interleaveHeatmapData,\n getColormap,\n interleaveCandlestickData,\n} from \"../../../renderer\";\n\nexport function updateSeriesBuffer(ctx: any, s: Series): void {\n const stackId = s.getStackId();\n if (stackId) {\n refreshStack(ctx, stackId);\n return;\n }\n\n const d = s.getData();\n const seriesType = s.getType();\n if (seriesType !== \"heatmap\" && (!d || d.x.length === 0)) return;\n const seriesId = s.getId();\n\n if (seriesType === \"band\" || seriesType === \"area\") {\n const y2 = seriesType === \"area\" ? new Float32Array(d.x.length).fill(0) : (d.y2 || new Float32Array(d.x.length).fill(0));\n ctx.renderer.createBuffer(seriesId, interleaveBandData(d.x, d.y, y2));\n } else if (seriesType === \"bar\") {\n const barWidth = (s.getStyle() as any).barWidth ?? calculateBarWidth(d.x);\n ctx.renderer.createBuffer(seriesId, interleaveBarData(d.x, d.y, barWidth));\n } else if (seriesType === \"heatmap\") {\n updateHeatmapBuffer(ctx, s);\n } else if (seriesType === \"candlestick\") {\n const d = s.getData();\n if (d.open && d.high && d.low && d.close) {\n const barWidth = (s.getStyle() as any).barWidth ?? calculateBarWidth(d.x);\n const { bullish, bearish } = interleaveCandlestickData(d.x, d.open, d.high, d.low, d.close, barWidth);\n ctx.renderer.createBuffer(`${seriesId}_bullish`, bullish);\n ctx.renderer.createBuffer(`${seriesId}_bearish`, bearish);\n // Store counts for rendering\n s.bullishCount = (bullish.length / 2);\n s.bearishCount = (bearish.length / 2);\n }\n } else {\n ctx.renderer.createBuffer(seriesId, interleaveData(d.x, d.y));\n }\n\n if (seriesType === \"step\" || seriesType === \"step+scatter\") {\n const stepMode = s.getStyle().stepMode ?? \"after\";\n ctx.renderer.createBuffer(`${seriesId}_step`, interleaveStepData(d.x, d.y, stepMode));\n }\n s.resetLastAppendCount();\n}\n\nfunction updateHeatmapBuffer(ctx: any, s: Series) {\n const hData = s.getHeatmapData();\n const hStyle = s.getHeatmapStyle();\n if (!hData || hData.xValues.length < 2) return;\n ctx.renderer.createBuffer(s.getId(), interleaveHeatmapData(hData.xValues, hData.yValues, hData.zValues));\n const colormapName = hStyle?.colorScale?.name || \"viridis\";\n ctx.renderer.createColormapTexture(`${s.getId()}_colormap`, getColormap(colormapName));\n}\n\nexport function refreshStack(ctx: any, stackId: string): void {\n const stackSeries = Array.from(ctx.series.values())\n .filter((s: any) => s.getStackId() === stackId);\n\n let cumulativeY: Float32Array | null = null;\n for (const s of stackSeries as Series[]) {\n const d = s.getData();\n if (d.x.length === 0) continue;\n if (!cumulativeY) cumulativeY = new Float32Array(d.y.length).fill(0);\n \n const yBaseline = new Float32Array(cumulativeY);\n for (let i = 0; i < d.y.length; i++) cumulativeY[i] += d.y[i];\n \n // Stacked series always rendered as bands (fill between cumulativeY and yBaseline)\n ctx.renderer.createBuffer(s.getId(), interleaveBandData(d.x, cumulativeY, yBaseline));\n s.resetLastAppendCount();\n }\n}\n","/**\n * Series Actions (Add, Remove, Append)\n */\nimport { Series } from \"../../Series\";\nimport type { SeriesOptions, HeatmapOptions, SeriesUpdateData } from \"../../../types\";\nimport { updateSeriesBuffer } from \"./SeriesBuffer\";\n\nexport function addSeries(ctx: any, options: SeriesOptions | HeatmapOptions): void {\n const s = new Series(options);\n ctx.series.set(s.getId(), s);\n updateSeriesBuffer(ctx, s);\n if (ctx.xAxisOptions.auto || Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)) {\n ctx.autoScale();\n }\n ctx.updateLegend?.();\n ctx.requestRender();\n}\n\nexport function removeSeries(ctx: any, id: string): void {\n const s = ctx.series.get(id);\n if (s) {\n ctx.renderer.deleteBuffer(id);\n ctx.renderer.deleteBuffer(`${id}_step`);\n s.destroy();\n ctx.series.delete(id);\n ctx.updateLegend?.();\n ctx.requestRender();\n }\n}\n\nexport function updateSeries(ctx: any, id: string, data: SeriesUpdateData): void {\n const s = ctx.series.get(id);\n if (s) {\n s.updateData(data);\n updateSeriesBuffer(ctx, s);\n ctx.requestRender();\n }\n}\n\nexport function appendData(ctx: any, id: string, x: number[] | Float32Array, y: number[] | Float32Array): void {\n const s = ctx.series.get(id);\n if (!s) return;\n const oldMaxX = s.getBounds()?.xMax ?? -Infinity;\n s.updateData({ x: x as any, y: y as any, append: true });\n updateSeriesBuffer(ctx, s);\n\n if (ctx.autoScrollEnabled) {\n const newBounds = s.getBounds();\n if (newBounds) {\n const xRange = ctx.viewBounds.xMax - ctx.viewBounds.xMin;\n if (oldMaxX >= ctx.viewBounds.xMax - xRange * 0.05) {\n ctx.viewBounds.xMax = newBounds.xMax;\n ctx.viewBounds.xMin = ctx.viewBounds.xMax - xRange;\n }\n }\n }\n if (ctx.xAxisOptions.auto || Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)) {\n ctx.autoScale();\n }\n ctx.requestRender();\n}\n\nexport function setMaxPoints(ctx: any, id: string, maxPoints: number): void {\n const s = ctx.series.get(id);\n if (s) {\n s.setMaxPoints(maxPoints);\n ctx.requestRender();\n }\n}\n","/**\n * Series Curve Fitting Support\n */\nimport { fitData, type FitType, type FitOptions } from \"../../../analysis\";\n\nexport function addFitLine(\n ctx: any,\n seriesId: string,\n type: FitType,\n options: FitOptions = {}\n): string {\n const s = ctx.series.get(seriesId);\n if (!s) throw new Error(`Series ${seriesId} not found`);\n\n const data = s.getData();\n if (!data || data.x.length < 2) return \"\";\n\n const result = fitData(data.x as any, data.y as any, type, options);\n const bounds = s.getBounds();\n const xMin = bounds?.xMin ?? 0;\n const xMax = bounds?.xMax ?? 1;\n const dataWidth = xMax - xMin;\n const fitResolution = 200;\n const fitX = new Float32Array(fitResolution);\n const fitY = new Float32Array(fitResolution);\n\n for (let i = 0; i < fitResolution; i++) {\n const x = xMin + (i / (fitResolution - 1)) * dataWidth;\n fitX[i] = x;\n fitY[i] = result.predict(x);\n }\n\n const fitId = `${seriesId}-fit-${Date.now()}`;\n const sourceStyle = s.getStyle();\n\n ctx.addSeries({\n id: fitId,\n type: 'line',\n yAxisId: s.getYAxisId(),\n data: { x: fitX, y: fitY },\n style: {\n color: sourceStyle.color,\n width: (sourceStyle.width || 1) * 1.5,\n opacity: 0.8,\n lineDash: [5, 5]\n }\n });\n\n ctx.addAnnotation({\n type: 'text',\n x: xMin + dataWidth * 0.05,\n y: result.predict(xMin + dataWidth * 0.05),\n text: `${result.equation}\\n(R² = ${result.rSquared.toFixed(4)})`,\n fontSize: 12,\n backgroundColor: 'rgba(0,0,0,0.7)',\n color: sourceStyle.color || '#ffffff',\n padding: 4,\n anchor: 'bottom-left',\n interactive: true\n });\n\n return fitId;\n}\n","/**\n * Scale interface and implementations\n *\n * Scales transform data values to pixel coordinates and vice versa.\n */\n\nexport interface Scale {\n /** Data domain [min, max] */\n domain: [number, number];\n /** Pixel range [min, max] */\n range: [number, number];\n /** Scale type identifier */\n type: \"linear\" | \"log\";\n\n /** Set the domain */\n setDomain(min: number, max: number): void;\n /** Set the range */\n setRange(min: number, max: number): void;\n\n /** Transform data value to pixel */\n transform(value: number): number;\n /** Transform pixel to data value */\n invert(pixel: number): number;\n\n /** Generate nice tick values */\n ticks(count?: number): number[];\n}\n\n/**\n * Linear scale - proportional mapping\n */\nexport class LinearScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\" as const;\n\n setDomain(min: number, max: number): void {\n // Ensure we have a valid, non-zero range\n if (!isFinite(min) || !isFinite(max)) {\n this.domain = [0, 1];\n return;\n }\n if (min === max) {\n this.domain = [min - 0.5, max + 0.5];\n return;\n }\n this.domain = [min, max];\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n }\n\n transform(value: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n const normalized = (value - d0) / (d1 - d0);\n return r0 + normalized * (r1 - r0);\n }\n\n invert(pixel: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n const normalized = (pixel - r0) / (r1 - r0);\n return d0 + normalized * (d1 - d0);\n }\n\n ticks(count = 10): number[] {\n const [min, max] = this.domain;\n if (!isFinite(min) || !isFinite(max) || min === max) return [];\n\n const step = niceStep(min, max, count);\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n\n // Limit ticks to prevent infinite loops or performance issues\n const maxTicks = 100;\n let t = start;\n while (t <= max + step * 0.5 && ticks.length < maxTicks) {\n ticks.push(Math.round(t * 1e12) / 1e12); // Fix floating point\n t += step;\n }\n\n return ticks;\n }\n}\n\n/**\n * Logarithmic scale - for exponential data\n */\nexport class LogScale implements Scale {\n public domain: [number, number] = [1, 1000];\n public range: [number, number] = [0, 100];\n public readonly type = \"log\" as const;\n\n private base = 10;\n\n setDomain(min: number, max: number): void {\n // Log scale requires positive values and non-zero range\n const safeMin = Math.max(min, 1e-12);\n const safeMax = Math.max(max, 1e-12 * 10);\n\n if (safeMin === safeMax) {\n this.domain = [safeMin / 10, safeMax * 10];\n return;\n }\n this.domain = [safeMin, safeMax];\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n }\n\n transform(value: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n\n if (value <= 0) return r0; // Handle invalid values\n\n const logMin = Math.log(d0) / Math.log(this.base);\n const logMax = Math.log(d1) / Math.log(this.base);\n const logVal = Math.log(value) / Math.log(this.base);\n\n const normalized = (logVal - logMin) / (logMax - logMin);\n return r0 + normalized * (r1 - r0);\n }\n\n invert(pixel: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n\n const logMin = Math.log(d0) / Math.log(this.base);\n const logMax = Math.log(d1) / Math.log(this.base);\n\n const normalized = (pixel - r0) / (r1 - r0);\n const logVal = logMin + normalized * (logMax - logMin);\n\n return Math.pow(this.base, logVal);\n }\n\n ticks(count = 10): number[] {\n const [min, max] = this.domain;\n const logMin = Math.floor(Math.log10(min));\n const logMax = Math.ceil(Math.log10(max));\n const ticks: number[] = [];\n\n for (let p = logMin; p <= logMax && ticks.length < count; p++) {\n const value = Math.pow(10, p);\n if (value >= min && value <= max) {\n ticks.push(value);\n }\n }\n\n return ticks;\n }\n}\n\n// ============================================\n// Helpers\n// ============================================\n\n/**\n * Calculate a \"nice\" step size for tick marks\n */\nfunction niceStep(min: number, max: number, count: number): number {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return 1;\n\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n\n let niceNormalized: number;\n if (normalized < 1.5) {\n niceNormalized = 1;\n } else if (normalized < 3) {\n niceNormalized = 2;\n } else if (normalized < 7) {\n niceNormalized = 5;\n } else {\n niceNormalized = 10;\n }\n\n return niceNormalized * magnitude;\n}\n\n/**\n * Factory function to create scale by type\n */\nexport function createScale(type: \"linear\" | \"log\"): Scale {\n return type === \"log\" ? new LogScale() : new LinearScale();\n}\n","/**\n * Chart Setup\n * \n * Handles chart initialization, DOM setup, and configuration.\n */\n\nimport type { ChartOptions, AxisOptions } from \"../../types\";\nimport { parseColor } from \"../../renderer/NativeWebGLRenderer\";\nimport { LinearScale, LogScale, type Scale } from \"../../scales\";\nimport { DEFAULT_THEME, getThemeByName, type ChartTheme } from \"../../theme\";\nimport { MARGINS } from \"./types\";\n\nexport interface SetupResult {\n theme: ChartTheme;\n backgroundColor: [number, number, number, number];\n showLegend: boolean;\n showControls: boolean;\n autoScroll: boolean;\n showStatistics: boolean;\n dpr: number;\n xAxisOptions: AxisOptions;\n xScale: Scale;\n yAxisOptionsMap: Map<string, AxisOptions>;\n yScales: Map<string, Scale>;\n primaryYAxisId: string;\n webglCanvas: HTMLCanvasElement;\n overlayCanvas: HTMLCanvasElement;\n overlayCtx: CanvasRenderingContext2D;\n}\n\n/**\n * Initialize chart configuration from options\n */\nexport function initializeChart(\n container: HTMLDivElement,\n options: ChartOptions\n): SetupResult {\n if (!container) throw new Error(\"[SciChart] Container element is required\");\n\n const dpr = options.devicePixelRatio ?? window.devicePixelRatio;\n\n // Initialize theme\n const theme = typeof options.theme === \"string\"\n ? getThemeByName(options.theme)\n : (options.theme as ChartTheme) ?? DEFAULT_THEME;\n\n const bgColor = parseColor(options.background ?? theme.backgroundColor);\n const backgroundColor: [number, number, number, number] = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n const showLegend = options.showLegend ?? theme.legend.visible;\n const showControls = options.showControls ?? false;\n const autoScroll = options.autoScroll ?? false;\n const showStatistics = options.showStatistics ?? false;\n\n // X Axis\n const xAxisOptions: AxisOptions = { scale: \"linear\", auto: true, ...options.xAxis };\n const xScale = xAxisOptions.scale === \"log\" ? new LogScale() : new LinearScale();\n\n // Process Y Axes\n const yAxisOptionsMap = new Map<string, AxisOptions>();\n const yScales = new Map<string, Scale>();\n let primaryYAxisId = 'default';\n\n const providedYAxes = options.yAxis \n ? (Array.isArray(options.yAxis) ? options.yAxis : [options.yAxis])\n : [{}];\n\n providedYAxes.forEach((axisOpt, index) => {\n const isFirst = index === 0;\n const defaultId = isFirst ? 'default' : `y${index}`;\n const id = axisOpt.id || defaultId;\n \n if (isFirst) primaryYAxisId = id;\n const position = axisOpt.position || (isFirst ? 'left' : 'right');\n const fullOptions: AxisOptions = { scale: \"linear\", auto: true, position, ...axisOpt, id };\n\n yAxisOptionsMap.set(id, fullOptions);\n yScales.set(id, fullOptions.scale === \"log\" ? new LogScale() : new LinearScale());\n });\n\n // Create DOM structure\n container.style.position = \"relative\";\n container.style.overflow = \"hidden\";\n container.style.backgroundColor = options.background ?? theme.backgroundColor;\n\n const webglCanvas = createCanvas(\"webgl\");\n const overlayCanvas = createCanvas(\"overlay\");\n\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n\n container.appendChild(webglCanvas);\n container.appendChild(overlayCanvas);\n\n const ctx = overlayCanvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Failed to get 2D context\");\n\n return {\n theme,\n backgroundColor,\n showLegend,\n showControls,\n autoScroll,\n showStatistics,\n dpr,\n xAxisOptions,\n xScale,\n yAxisOptionsMap,\n yScales,\n primaryYAxisId,\n webglCanvas,\n overlayCanvas,\n overlayCtx: ctx,\n };\n}\n\n/**\n * Create a canvas element\n */\nexport function createCanvas(type: \"webgl\" | \"overlay\"): HTMLCanvasElement {\n const canvas = document.createElement(\"canvas\");\n canvas.style.cssText = \"position:absolute;top:0;left:0;width:100%;height:100%;\";\n if (type === \"overlay\") canvas.style.pointerEvents = \"none\";\n return canvas;\n}\n\n/**\n * Calculate the plot area based on container size and margins\n */\nexport function getPlotArea(\n container: HTMLDivElement,\n yAxisOptionsMap: Map<string, AxisOptions>\n): { x: number; y: number; width: number; height: number } {\n const rect = container.getBoundingClientRect();\n const leftAxisCount = Array.from(yAxisOptionsMap.values()).filter(a => a.position !== 'right').length;\n const rightAxisCount = Array.from(yAxisOptionsMap.values()).filter(a => a.position === 'right').length;\n const leftMargin = MARGINS.left + Math.max(0, leftAxisCount - 1) * 65;\n const rightMargin = MARGINS.right + rightAxisCount * 65;\n return {\n x: leftMargin,\n y: MARGINS.top,\n width: Math.max(1, rect.width - leftMargin - rightMargin),\n height: Math.max(1, rect.height - MARGINS.top - MARGINS.bottom),\n };\n}\n\n/**\n * Get axes layout for interaction manager\n */\nexport function getAxesLayout(\n yAxisOptionsMap: Map<string, AxisOptions>\n): Array<{ id: string; position: 'left' | 'right'; offset: number }> {\n // Separate axes by position to calculate offset correctly\n const result: Array<{ id: string; position: 'left' | 'right'; offset: number }> = [];\n let leftIndex = 0;\n let rightIndex = 0;\n\n yAxisOptionsMap.forEach((opts, id) => {\n const position = (opts.position === 'right' ? 'right' : 'left') as 'left' | 'right';\n const offset = position === 'left' ? leftIndex * 65 : rightIndex * 65;\n \n if (position === 'left') leftIndex++;\n else rightIndex++;\n\n result.push({ id, position, offset });\n });\n\n return result;\n}\n\n/**\n * Resize canvases to match container\n */\nexport function resizeCanvases(\n container: HTMLDivElement,\n webglCanvas: HTMLCanvasElement,\n overlayCanvas: HTMLCanvasElement,\n overlayCtx: CanvasRenderingContext2D,\n dpr: number\n): boolean {\n const rect = container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return false;\n\n const w = rect.width * dpr;\n const h = rect.height * dpr;\n\n [webglCanvas, overlayCanvas].forEach((c) => {\n c.width = w;\n c.height = h;\n });\n\n overlayCtx.scale(dpr, dpr);\n return true;\n}\n\nexport function pixelToDataX(px: number, plotArea: { x: number, width: number }, viewBounds: { xMin: number, xMax: number }): number {\n return viewBounds.xMin + ((px - plotArea.x) / plotArea.width) * (viewBounds.xMax - viewBounds.xMin);\n}\n\nexport function pixelToDataY(py: number, plotArea: { y: number, height: number }, viewBounds: { yMin: number, yMax: number }): number {\n return viewBounds.yMin + (1 - (py - plotArea.y) / plotArea.height) * (viewBounds.yMax - viewBounds.yMin);\n}\n","/**\n * Plugin Manager Implementation\n */\nimport { ChartPlugin, PluginManager as IPluginManager } from \"./types\";\nimport { Chart } from \"../types\";\n\nexport class PluginManagerImpl implements IPluginManager {\n private plugins = new Map<string, ChartPlugin>();\n private chart: Chart;\n\n constructor(chart: Chart) {\n this.chart = chart;\n }\n\n use(plugin: ChartPlugin): void {\n if (this.plugins.has(plugin.name)) {\n console.warn(`[SciChart] Plugin \"${plugin.name}\" is already registered.`);\n return;\n }\n this.plugins.set(plugin.name, plugin);\n plugin.init?.(this.chart);\n }\n\n remove(name: string): boolean {\n const plugin = this.plugins.get(name);\n if (plugin) {\n plugin.destroy?.();\n return this.plugins.delete(name);\n }\n return false;\n }\n\n get(name: string): ChartPlugin | undefined {\n return this.plugins.get(name);\n }\n\n notify(hook: keyof Omit<ChartPlugin, 'name' | 'init'>, ...args: any[]): void {\n this.plugins.forEach(plugin => {\n const handler = plugin[hook] as Function;\n if (typeof handler === 'function') {\n try {\n handler(...args);\n } catch (e) {\n console.error(`[SciChart] Error in plugin \"${plugin.name}\" hook \"${String(hook)}\":`, e);\n }\n }\n });\n }\n\n destroy(): void {\n this.plugins.forEach(plugin => plugin.destroy?.());\n this.plugins.clear();\n }\n}\n","/**\n * ChartControls - In-chart control buttons (Plotly-style)\n *\n * Provides a floating glassmorphism toolbar for chart controls:\n * - Pan/Zoom mode toggle\n * - Reset Zoom\n * - Display Mode (Line, Scatter, Both)\n * - Smoothing toggle\n */\n\nimport { ChartTheme } from \"../theme\";\n\nexport interface ChartControlsCallbacks {\n onResetZoom: () => void;\n onSetType: (type: \"line\" | \"scatter\" | \"line+scatter\") => void;\n onToggleSmoothing: () => void;\n onTogglePan: (active: boolean) => void;\n onExport: () => void;\n onAutoScale: () => void;\n onToggleLegend: (visible: boolean) => void;\n}\n\n// ============================================\n// SVG Icons (Plotly-inspired)\n// ============================================\n\nconst ICONS = {\n PAN: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 11V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M14 10V4a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M10 10.5V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"></path></svg>`,\n RESET: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 4 23 10 17 10\"></polyline><polyline points=\"1 20 1 14 7 14\"></polyline><path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"></path></svg>`,\n LINE: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 3v18h18\"></path><path d=\"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3\"></path></svg>`,\n SCATTER: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\"><circle cx=\"7\" cy=\"14\" r=\"2\"></circle><circle cx=\"11\" cy=\"10\" r=\"2\"></circle><circle cx=\"15\" cy=\"13\" r=\"2\"></circle><circle cx=\"19\" cy=\"8\" r=\"2\"></circle><path d=\"M3 3v18h18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg>`,\n BOTH: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 3v18h18\"></path><path d=\"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3\"></path><circle cx=\"7\" cy=\"14.3\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"10.8\" cy=\"10.5\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"13.6\" cy=\"13.2\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"18.7\" cy=\"8\" r=\"1\" fill=\"currentColor\"></circle></svg>`,\n SMOOTH: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 12c.5 0 .9-.3 1.2-.7l1.6-2.6c.3-.4.7-.7 1.2-.7h2c.5 0 .9.3 1.2.7l1.6 2.6c.3.4.7.7 1.2.7h2c.5 0 .9-.3 1.2-.7l1.6-2.6c.3-.4.7-.7 1.2-.7h2\"></path></svg>`,\n AUTOSCALE: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 3 21 3 21 9\"></polyline><polyline points=\"9 21 3 21 3 15\"></polyline><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line></svg>`,\n EXPORT: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`,\n LEGEND: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 6h16M4 12h16M4 18h7\"></path></svg>`\n};\n\nexport class ChartControls {\n private container: HTMLDivElement;\n private toolbar: HTMLDivElement;\n private callbacks: ChartControlsCallbacks;\n private theme: ChartTheme;\n\n private isSmoothing = false;\n private isPanMode = true;\n private isLegendVisible = true;\n private currentType: \"line\" | \"scatter\" | \"line+scatter\" = \"line\";\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n callbacks: ChartControlsCallbacks\n ) {\n this.callbacks = callbacks;\n this.theme = theme;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = `\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 100;\n pointer-events: auto;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 8px;\n `;\n\n this.toolbar = document.createElement(\"div\");\n this.toolbar.className = \"scichart-modebar\";\n this.updateToolbarStyle();\n\n this.createButtons();\n this.container.appendChild(this.toolbar);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return (\n name.includes(\"dark\") ||\n name.includes(\"midnight\") ||\n name.includes(\"electro\")\n );\n }\n\n private updateToolbarStyle(): void {\n const isDark = this.isDarkTheme();\n\n const bg = this.theme.legend.backgroundColor; // Use legend background for consistency\n const borderColor = this.theme.legend.borderColor;\n const shadow = isDark\n ? \"0 4px 12px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255, 255, 255, 0.1)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.15)\";\n\n this.toolbar.style.cssText = `\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px;\n background: ${bg};\n backdrop-filter: blur(12px) saturate(180%);\n -webkit-backdrop-filter: blur(12px) saturate(180%);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n transition: all 0.3s cubic-bezier(0.4, 0, 0.4, 1);\n `;\n }\n\n private createButtons(): void {\n // Pan Mode\n this.createButton(\n ICONS.PAN,\n \"Pan Mode\",\n () => {\n this.isPanMode = !this.isPanMode;\n this.updateButtonStates();\n this.callbacks.onTogglePan(this.isPanMode);\n },\n \"pan\"\n );\n\n // Reset Zoom\n this.createButton(\n ICONS.RESET,\n \"Reset Zoom\",\n () => this.callbacks.onResetZoom(),\n \"reset\"\n );\n\n // Auto Scale\n this.createButton(\n ICONS.AUTOSCALE,\n \"Auto Scale\",\n () => this.callbacks.onAutoScale(),\n \"autoscale\"\n );\n\n // Separator\n const sep = document.createElement(\"div\");\n const isDark = this.isDarkTheme();\n sep.style.cssText = `width: 1px; height: 20px; background: ${\n isDark ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep);\n\n // Type Switcher\n this.createButton(\n ICONS.LINE,\n \"Toggle Line/Scatter/Both\",\n () => {\n const types: (\"line\" | \"scatter\" | \"line+scatter\")[] = [\n \"line\",\n \"scatter\",\n \"line+scatter\",\n ];\n const nextIdx = (types.indexOf(this.currentType) + 1) % types.length;\n this.currentType = types[nextIdx];\n this.callbacks.onSetType(this.currentType);\n this.updateButtonStates();\n },\n \"type\"\n );\n\n // Smoothing\n this.createButton(\n ICONS.SMOOTH,\n \"Automated Smoothing\",\n () => {\n this.isSmoothing = !this.isSmoothing;\n this.updateButtonStates();\n this.callbacks.onToggleSmoothing();\n },\n \"smooth\"\n );\n\n // Separator\n const sep2 = document.createElement(\"div\");\n sep2.style.cssText = `width: 1px; height: 20px; background: ${\n isDark ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep2);\n\n // Export Image\n this.createButton(\n ICONS.EXPORT,\n \"Export as PNG\",\n () => this.callbacks.onExport(),\n \"export\"\n );\n\n // Separator\n const sep3 = document.createElement(\"div\");\n sep3.style.cssText = `width: 1px; height: 20px; background: ${\n this.isDarkTheme() ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep3);\n\n // Toggle Legend\n this.createButton(\n ICONS.LEGEND,\n \"Toggle Legend\",\n () => {\n this.isLegendVisible = !this.isLegendVisible;\n this.updateButtonStates();\n this.callbacks.onToggleLegend(this.isLegendVisible);\n },\n \"legend\"\n );\n\n this.updateButtonStates();\n }\n\n private enforceSVGVisibility(btn: HTMLButtonElement): void {\n // Force SVG visibility and make sure currentColor is applied even under aggressive page CSS\n const icon = btn.querySelector<HTMLElement>(\".scichart-control-icon\");\n if (icon) {\n icon.style.display = \"flex\";\n icon.style.alignItems = \"center\";\n icon.style.justifyContent = \"center\";\n icon.style.width = \"100%\";\n icon.style.height = \"100%\";\n icon.style.pointerEvents = \"none\";\n }\n\n const svgEl = btn.querySelector<SVGElement>(\"svg\");\n if (svgEl) {\n svgEl.setAttribute(\"width\", \"14\");\n svgEl.setAttribute(\"height\", \"14\");\n (svgEl as any).style.display = \"block\";\n (svgEl as any).style.overflow = \"visible\";\n (svgEl as any).style.color = \"inherit\";\n (svgEl as any).style.stroke = \"currentColor\";\n if (!svgEl.getAttribute(\"fill\")) {\n (svgEl as any).style.fill = \"none\";\n }\n }\n }\n\n private createButton(\n svg: string,\n title: string,\n onClick: () => void,\n id: string\n ): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.innerHTML = `<span class=\"scichart-control-icon\">${svg}</span>`;\n btn.title = title;\n btn.dataset.id = id;\n\n const isDark = this.isDarkTheme();\n const color = isDark ? \"#ffffff\" : \"#1e293b\";\n\n btn.style.cssText = `\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: ${color};\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n opacity: 0.9;\n `;\n\n btn.onmouseenter = () => {\n btn.style.opacity = \"1\";\n btn.style.background = isDark\n ? \"rgba(255, 255, 255, 0.15)\"\n : \"rgba(0, 0, 0, 0.1)\";\n btn.style.transform = \"translateY(-1px)\";\n btn.style.boxShadow = isDark\n ? \"0 2px 4px rgba(0,0,0,0.4)\"\n : \"0 2px 4px rgba(0,0,0,0.1)\";\n };\n btn.onmouseleave = () => {\n btn.style.transform = \"none\";\n btn.style.boxShadow = \"none\";\n this.updateButtonStates();\n };\n btn.onclick = onClick;\n\n // Force SVG visibility\n this.enforceSVGVisibility(btn);\n\n this.toolbar.appendChild(btn);\n return btn;\n }\n\n private updateButtonStates(): void {\n const buttons = this.toolbar.querySelectorAll(\"button\");\n const isDark = this.isDarkTheme();\n\n const activeColor = \"#38bdf8\"; // Brighter blue\n const smoothActiveColor = \"#fb7185\"; // Brighter pink\n const legendActiveColor = \"#4ade80\"; // Brighter green\n const normalColor = isDark ? \"#f1f5f9\" : \"#334155\"; // High contrast\n\n buttons.forEach((btn: HTMLButtonElement) => {\n const id = btn.dataset.id;\n const isHover = btn.matches(\":hover\");\n\n if (id === \"pan\") {\n btn.style.color = this.isPanMode ? activeColor : normalColor;\n btn.style.opacity = isHover || this.isPanMode ? \"1\" : \"0.8\";\n if (this.isPanMode) {\n btn.style.background = isDark\n ? \"rgba(56, 189, 248, 0.15)\"\n : \"rgba(56, 189, 248, 0.1)\";\n }\n } else if (id === \"smooth\") {\n btn.style.color = this.isSmoothing ? smoothActiveColor : normalColor;\n btn.style.opacity = isHover || this.isSmoothing ? \"1\" : \"0.8\";\n if (this.isSmoothing) {\n btn.style.background = isDark\n ? \"rgba(251, 113, 133, 0.15)\"\n : \"rgba(251, 113, 133, 0.1)\";\n }\n } else if (id === \"legend\") {\n btn.style.color = this.isLegendVisible ? legendActiveColor : normalColor;\n btn.style.opacity = isHover || this.isLegendVisible ? \"1\" : \"0.8\";\n if (this.isLegendVisible) {\n btn.style.background = isDark\n ? \"rgba(74, 222, 128, 0.15)\"\n : \"rgba(74, 222, 128, 0.1)\";\n }\n } else if (id === \"type\") {\n btn.innerHTML =\n this.currentType === \"line\"\n ? ICONS.LINE\n : this.currentType === \"scatter\"\n ? ICONS.SCATTER\n : ICONS.BOTH;\n // Reapply SVG visibility styles after changing innerHTML\n this.enforceSVGVisibility(btn);\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n } else if (id === \"reset\" || id === \"autoscale\" || id === \"export\") {\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n }\n\n if (\n !isHover &&\n !(\n (id === \"pan\" && this.isPanMode) ||\n (id === \"smooth\" && this.isSmoothing) ||\n (id === \"legend\" && this.isLegendVisible)\n )\n ) {\n btn.style.background = \"transparent\";\n }\n });\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateToolbarStyle();\n this.updateButtonStates();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * ChartLegend - In-chart draggable legend component\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\n\nexport interface ChartLegendCallbacks {\n onMove: (x: number, y: number) => void;\n}\n\nexport class ChartLegend {\n private container: HTMLDivElement;\n private header: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Series[] = [];\n private callbacks: ChartLegendCallbacks;\n\n private isDragging = false;\n private startX = 0;\n private startY = 0;\n private initialX = 0;\n private initialY = 0;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n options: { x?: number; y?: number },\n callbacks: ChartLegendCallbacks\n ) {\n this.theme = theme;\n this.callbacks = callbacks;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"scichart-legend\";\n\n // Default position (top-right, below controls toolbar)\n // Controls toolbar height is ~32px (24px buttons + 4px padding*2 + borders) + 8px top margin = ~40px\n // Add extra margin to ensure no overlap\n const x = options.x ?? parent.clientWidth - 150;\n const y = options.y ?? 55;\n\n this.container.style.cssText = `\n position: absolute;\n left: ${x}px;\n top: ${y}px;\n z-index: 90;\n pointer-events: auto;\n min-width: 120px;\n border-radius: ${theme.legend.borderRadius}px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n user-select: none;\n transition: box-shadow 0.2s ease;\n `;\n\n this.updateStyle();\n\n // Draggable header\n this.header = document.createElement(\"div\");\n this.header.style.cssText = `\n height: 8px;\n cursor: move;\n background: rgba(255,255,255,0.05);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n `;\n\n this.content = document.createElement(\"div\");\n this.content.style.padding = `${theme.legend.padding}px`;\n\n this.container.appendChild(this.header);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n\n this.initDragging();\n }\n\n private updateStyle(): void {\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\") ||\n this.theme.name.toLowerCase().includes(\"electro\");\n\n this.container.style.background = this.theme.legend.backgroundColor;\n this.container.style.backdropFilter = \"blur(12px) saturate(180%)\";\n (this.container.style as any).webkitBackdropFilter =\n \"blur(12px) saturate(180%)\";\n this.container.style.border = `1px solid ${this.theme.legend.borderColor}`;\n this.container.style.boxShadow = isDark\n ? \"0 4px 12px rgba(0, 0, 0, 0.6)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.15)\";\n }\n\n private initDragging(): void {\n let rafId: number | null = null;\n\n const onMouseDown = (e: MouseEvent) => {\n // Only handle left click\n if (e.button !== 0) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n this.isDragging = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.initialX = this.container.offsetLeft;\n this.initialY = this.container.offsetTop;\n\n this.container.style.transition = \"none\";\n this.container.style.willChange = \"transform\";\n this.container.style.boxShadow = \"0 8px 24px rgba(0,0,0,0.3)\";\n this.container.style.cursor = \"grabbing\";\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n };\n\n const updatePosition = (clientX: number, clientY: number) => {\n const dx = clientX - this.startX;\n const dy = clientY - this.startY;\n\n let newX = this.initialX + dx;\n let newY = this.initialY + dy;\n\n const parent = this.container.parentElement;\n if (parent) {\n newX = Math.max(\n 0,\n Math.min(newX, parent.clientWidth - this.container.clientWidth)\n );\n newY = Math.max(\n 0,\n Math.min(newY, parent.clientHeight - this.container.clientHeight)\n );\n }\n\n // Use transform for better performance (no layout recalc)\n const tx = newX - this.initialX;\n const ty = newY - this.initialY;\n this.container.style.transform = `translate3d(${tx}px, ${ty}px, 0)`;\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => updatePosition(e.clientX, e.clientY));\n };\n\n const onMouseUp = () => {\n if (this.isDragging) {\n this.isDragging = false;\n if (rafId) cancelAnimationFrame(rafId);\n\n // Finalize position and commit to left/top (to keep it there)\n const rect = this.container.getBoundingClientRect();\n const parentRect =\n this.container.parentElement?.getBoundingClientRect();\n if (parentRect) {\n const finalX = rect.left - parentRect.left;\n const finalY = rect.top - parentRect.top;\n\n this.container.style.transform = \"none\";\n this.container.style.left = `${finalX}px`;\n this.container.style.top = `${finalY}px`;\n\n this.callbacks.onMove(finalX, finalY);\n }\n\n this.container.style.willChange = \"auto\";\n this.container.style.transition = \"box-shadow 0.2s ease\";\n this.container.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.15)\";\n this.container.style.cursor = \"auto\";\n }\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n this.container.addEventListener(\"mousedown\", onMouseDown);\n\n // Block events from reaching the chart while over the legend\n this.container.addEventListener(\"wheel\", (e) => e.stopPropagation());\n this.container.addEventListener(\"click\", (e) => e.stopPropagation());\n this.container.addEventListener(\"dblclick\", (e) => e.stopPropagation());\n // Note: mousemove/mouseup on container MUST bubble to document during drag\n }\n\n public update(series: Series[]): void {\n this.series = series;\n this.render();\n }\n\n private render(): void {\n this.content.innerHTML = \"\";\n const legend = this.theme.legend;\n const dpr = window.devicePixelRatio || 1;\n\n this.series.forEach((s) => {\n const item = document.createElement(\"div\");\n item.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: ${legend.itemGap}px;\n font-family: ${legend.fontFamily};\n font-size: ${legend.fontSize}px;\n color: ${legend.textColor};\n `;\n\n // Use a canvas for the swatch to support symbols\n const swatch = document.createElement(\"canvas\");\n const size = legend.swatchSize;\n swatch.width = size * dpr;\n swatch.height = size * dpr;\n swatch.style.width = `${size}px`;\n swatch.style.height = `${size}px`;\n\n const ctx = swatch.getContext('2d');\n if (ctx) {\n ctx.scale(dpr, dpr);\n const style = s.getStyle();\n const color = style.color || \"#ff0055\";\n const type = s.getType();\n const symbol = style.symbol || 'circle';\n \n ctx.fillStyle = color;\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n \n const centerX = size / 2;\n const centerY = size / 2;\n\n const typeStr = String(type).toLowerCase();\n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && !!style.symbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n const isArea = typeStr === 'area' || typeStr === 'band';\n\n if (isScatter) {\n this.drawSymbol(ctx, symbol, centerX, centerY, size * 0.8);\n } else if (isLineScatter) {\n ctx.beginPath();\n ctx.moveTo(0, centerY);\n ctx.lineTo(size, centerY);\n ctx.stroke();\n this.drawSymbol(ctx, symbol, centerX, centerY, size * 0.6);\n } else if (isArea) {\n ctx.globalAlpha = 0.6;\n ctx.fillRect(0, size * 0.2, size, size * 0.6);\n ctx.globalAlpha = 1.0;\n ctx.strokeRect(0, size * 0.2, size, size * 0.6);\n } else if (typeStr === 'candlestick') {\n const bullColor = (style as any).bullishColor || '#26a69a';\n ctx.fillStyle = bullColor;\n ctx.fillRect(size * 0.3, size * 0.2, size * 0.4, size * 0.6);\n ctx.beginPath();\n ctx.moveTo(size * 0.5, 0);\n ctx.lineTo(size * 0.5, size);\n ctx.strokeStyle = bullColor;\n ctx.stroke();\n } else {\n ctx.beginPath();\n ctx.moveTo(0, centerY);\n ctx.lineTo(size, centerY);\n ctx.stroke();\n }\n }\n\n const label = document.createElement(\"span\");\n label.textContent = s.getName();\n\n item.appendChild(swatch);\n item.appendChild(label);\n this.content.appendChild(item);\n });\n }\n\n /**\n * Internal symbol drawing logic (shared with canvas export)\n */\n private drawSymbol(\n ctx: CanvasRenderingContext2D,\n symbol: string,\n x: number,\n y: number,\n size: number\n ): void {\n const r = size / 2;\n ctx.beginPath();\n\n switch (symbol) {\n case 'circle':\n ctx.arc(x, y, r, 0, Math.PI * 2);\n ctx.fill();\n break;\n case 'square':\n ctx.rect(x - r, y - r, size, size);\n ctx.fill();\n break;\n case 'diamond':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y);\n ctx.lineTo(x, y + r);\n ctx.lineTo(x - r, y);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y + r);\n ctx.lineTo(x - r, y + r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangleDown':\n ctx.moveTo(x, y + r);\n ctx.lineTo(x + r, y - r);\n ctx.lineTo(x - r, y - r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.moveTo(x - r, y);\n ctx.lineTo(x + r, y);\n ctx.moveTo(x, y - r);\n ctx.lineTo(x, y + r);\n ctx.stroke();\n break;\n case 'x':\n const d = r * 0.707;\n ctx.moveTo(x - d, y - d);\n ctx.lineTo(x + d, y + d);\n ctx.moveTo(x + d, y - d);\n ctx.lineTo(x - d, y + d);\n ctx.stroke();\n break;\n case 'star':\n for (let i = 0; i < 5; i++) {\n ctx.lineTo(\n x + r * Math.cos(((18 + i * 72) / 180) * Math.PI),\n y - r * Math.sin(((18 + i * 72) / 180) * Math.PI)\n );\n ctx.lineTo(\n x + (r / 2) * Math.cos(((54 + i * 72) / 180) * Math.PI),\n y - (r / 2) * Math.sin(((54 + i * 72) / 180) * Math.PI)\n );\n }\n ctx.closePath();\n ctx.fill();\n break;\n }\n }\n\n public draw(ctx: CanvasRenderingContext2D, dpr: number): void {\n if (this.series.length === 0) return;\n\n const legend = this.theme.legend;\n const padding = legend.padding * dpr;\n const itemGap = legend.itemGap * dpr;\n const swatchSize = legend.swatchSize * dpr;\n const headerHeight = 8 * dpr;\n\n const x = this.container.offsetLeft * dpr;\n const y = this.container.offsetTop * dpr;\n const width = this.container.clientWidth * dpr;\n const height = this.container.clientHeight * dpr;\n\n ctx.save();\n\n // 1. Draw background\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\");\n ctx.fillStyle = isDark\n ? legend.backgroundColor\n : \"rgba(255, 255, 255, 0.85)\";\n ctx.strokeStyle = legend.borderColor;\n ctx.lineWidth = 1 * dpr;\n\n const r = legend.borderRadius * dpr;\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + width - r, y);\n ctx.arcTo(x + width, y, x + width, y + r, r);\n ctx.lineTo(x + width, y + height - r);\n ctx.arcTo(x + width, y + height, x + width - r, y + height, r);\n ctx.lineTo(x + r, y + height);\n ctx.arcTo(x, y + height, x, y + height - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // 2. Draw Items\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = `${legend.fontSize * dpr}px ${legend.fontFamily}`;\n\n this.series.forEach((s, i) => {\n const itemY =\n y +\n headerHeight +\n padding +\n i * (swatchSize + itemGap) +\n swatchSize / 2;\n \n const centerX = x + padding + swatchSize / 2;\n const centerY = itemY;\n const style = s.getStyle();\n const type = s.getType();\n const symbol = style.symbol || 'circle';\n\n ctx.fillStyle = style.color || \"#ff0055\";\n ctx.strokeStyle = style.color || \"#ff0055\";\n ctx.lineWidth = 2 * dpr;\n\n const typeStr = String(type).toLowerCase();\n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && !!style.symbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n\n if (isScatter) {\n this.drawSymbol(ctx, symbol, centerX, centerY, swatchSize * 0.9);\n } else if (isLineScatter) {\n ctx.beginPath();\n ctx.moveTo(x + padding, centerY);\n ctx.lineTo(x + padding + swatchSize, centerY);\n ctx.stroke();\n this.drawSymbol(ctx, symbol, centerX, centerY, swatchSize * 0.6);\n } else {\n ctx.beginPath();\n ctx.moveTo(x + padding, centerY);\n ctx.lineTo(x + padding + swatchSize, centerY);\n ctx.stroke();\n }\n\n ctx.fillStyle = legend.textColor;\n ctx.fillText(s.getName(), x + padding + swatchSize + 8 * dpr, itemY);\n });\n\n ctx.restore();\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateStyle();\n this.render();\n }\n\n public setVisible(visible: boolean): void {\n this.container.style.display = visible ? \"block\" : \"none\";\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * Chart UI Components (Controls, Legend)\n */\nimport { ChartControls } from \"../ChartControls\";\nimport { ChartLegend } from \"../ChartLegend\";\nimport { ChartTheme } from \"../../theme\";\nimport { ChartOptions } from \"../../types\";\nimport { Series } from \"../Series\";\n\nexport interface UIContext {\n container: HTMLDivElement;\n theme: ChartTheme;\n showControls: boolean;\n showLegend: boolean;\n series: Map<string, Series>;\n autoScale: () => void;\n resetZoom: () => void;\n requestRender: () => void;\n exportImage: () => string;\n setPanMode: (active: boolean) => void;\n onLegendMove: (x: number, y: number) => void;\n toggleLegend: () => void;\n}\n\nexport function initControls(ctx: UIContext): ChartControls | null {\n if (!ctx.showControls) return null;\n return new ChartControls(ctx.container, ctx.theme, {\n onResetZoom: () => ctx.resetZoom(),\n onSetType: (type) => {\n ctx.series.forEach((s) => {\n const currentType = s.getType();\n const style = s.getStyle();\n const isStepCapable = currentType === \"step\" || currentType === \"step+scatter\" || style.stepMode !== undefined;\n if (isStepCapable) {\n const mappedType = type === \"line\" ? \"step\" : type === \"line+scatter\" ? \"step+scatter\" : \"scatter\";\n s.setType(mappedType as any);\n } else if (currentType === \"line\" || currentType === \"scatter\" || currentType === \"line+scatter\") {\n s.setType(type as any);\n }\n });\n ctx.requestRender();\n },\n onToggleSmoothing: () => {\n ctx.series.forEach((s) => {\n const style = s.getStyle();\n s.setStyle({ smoothing: (style.smoothing || 0) === 0 ? 0.5 : 0 });\n });\n ctx.requestRender();\n },\n onTogglePan: (active) => ctx.setPanMode(active),\n onExport: () => {\n const link = document.createElement(\"a\");\n link.download = `scichart-export-${Date.now()}.png`;\n link.href = ctx.exportImage();\n link.click();\n },\n onAutoScale: () => {\n ctx.autoScale();\n ctx.requestRender();\n },\n onToggleLegend: () => {\n ctx.toggleLegend();\n },\n });\n}\n\nexport function initLegend(ctx: UIContext, options: ChartOptions): ChartLegend | null {\n if (!ctx.showLegend) return null;\n const legend = new ChartLegend(\n ctx.container,\n ctx.theme,\n options.legendPosition || {},\n {\n onMove: (x, y) => ctx.onLegendMove(x, y),\n }\n );\n legend.update(Array.from(ctx.series.values()));\n return legend;\n}\n","/**\n * ChartCore - Main Chart Implementation\n *\n * The core chart class that coordinates rendering, interactions,\n * and data management using the extracted utility modules.\n */\n\nimport type {\n ChartOptions,\n AxisOptions,\n SeriesOptions,\n HeatmapOptions,\n SeriesUpdateData,\n ZoomOptions,\n CursorOptions,\n ChartEventMap,\n Bounds,\n} from \"../../types\";\nimport * as analysis from \"../../analysis\";\nimport type { FitType, FitOptions } from \"../../analysis\";\nimport { EventEmitter } from \"../EventEmitter\";\nimport { Series } from \"../Series\";\nimport {\n NativeWebGLRenderer,\n parseColor,\n} from \"../../renderer/NativeWebGLRenderer\";\nimport type { Scale } from \"../../scales\";\nimport { getThemeByName, type ChartTheme } from \"../../theme\";\nimport { OverlayRenderer } from \"../OverlayRenderer\";\nimport { InteractionManager } from \"../InteractionManager\";\nimport { ChartControls } from \"../ChartControls\";\nimport { ChartLegend } from \"../ChartLegend\";\nimport { ChartStatistics } from \"../ChartStatistics\";\nimport { AnnotationManager, type Annotation } from \"../annotations\";\nimport { TooltipManager } from \"../tooltip\";\n\nimport type { Chart, ExportOptions } from \"./types\";\nimport { exportToCSV, exportToJSON, exportToImage } from \"./ChartExporter\";\nimport {\n applyZoom,\n applyPan,\n type NavigationContext,\n} from \"./ChartNavigation\";\nimport { autoScaleAll, handleBoxZoom } from \"./ChartScaling\";\nimport { prepareSeriesData, renderOverlay } from \"./ChartRenderer\";\nimport {\n addSeries as addSeriesImpl,\n removeSeries as removeSeriesImpl,\n updateSeries as updateSeriesImpl,\n updateSeriesBuffer,\n appendData as appendDataImpl,\n setMaxPoints as setMaxPointsImpl,\n addFitLine as addFitLineImpl,\n} from \"./ChartSeries\";\nimport {\n initializeChart as setupChart,\n getPlotArea as calculatePlotArea,\n getAxesLayout,\n resizeCanvases,\n pixelToDataX as pxToDataX,\n pixelToDataY as pxToDataY,\n} from \"./ChartSetup\";\nimport { PluginManagerImpl } from \"./plugins/PluginManager\";\nimport { initControls as createControls, initLegend as createLegend } from \"./ChartUI\";\n\n// ============================================\n// Chart Implementation\n// ============================================\n\nexport class ChartImpl implements Chart {\n private container: HTMLDivElement;\n private webglCanvas: HTMLCanvasElement;\n private overlayCanvas: HTMLCanvasElement;\n private overlayCtx: CanvasRenderingContext2D;\n private series: Map<string, Series> = new Map();\n private events = new EventEmitter<ChartEventMap>();\n private viewBounds: Bounds = {\n xMin: -0.5,\n xMax: 0.5,\n yMin: -1e-5,\n yMax: 1e-5,\n };\n private xAxisOptions: AxisOptions;\n private yAxisOptionsMap: Map<string, AxisOptions>;\n private primaryYAxisId: string;\n private dpr: number;\n private backgroundColor: [number, number, number, number];\n private renderer: NativeWebGLRenderer;\n private overlay: OverlayRenderer;\n private interaction: InteractionManager;\n private xScale: Scale;\n private yScales: Map<string, Scale>;\n private get yScale(): Scale {\n return (this.yScales.get(this.primaryYAxisId) ||\n this.yScales.values().next().value) as Scale;\n }\n private theme: ChartTheme;\n private cursorOptions: CursorOptions | null = null;\n private cursorPosition: { x: number; y: number } | null = null;\n private showLegend: boolean;\n private legend: ChartLegend | null = null;\n private showControls: boolean;\n private controls: ChartControls | null = null;\n private animationFrameId: number | null = null;\n private needsFullRender = false;\n private needsOverlayRender = false;\n private isDestroyed = false;\n private autoScroll = false;\n private showStatistics = false;\n private stats: ChartStatistics | null = null;\n private selectionRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null = null;\n private annotationManager: AnnotationManager = new AnnotationManager();\n public readonly tooltip: TooltipManager;\n private pluginManager: PluginManagerImpl;\n private initialOptions: ChartOptions;\n public readonly analysis = analysis;\n\n constructor(options: ChartOptions) {\n this.initialOptions = options;\n this.container = options.container;\n const setup = setupChart(this.container, options);\n\n const requestedRenderer = options.renderer ?? \"webgl\";\n if (requestedRenderer === \"webgpu\") {\n const isSupported =\n typeof (globalThis as any).navigator !== \"undefined\" &&\n typeof (globalThis as any).navigator.gpu !== \"undefined\";\n console.warn(\n `[SciChart] 'renderer: \"webgpu\"' requested but WebGPU renderer is experimental and not yet implemented. ` +\n `Falling back to WebGL. WebGPU supported: ${isSupported}`\n );\n }\n\n this.theme = setup.theme;\n this.backgroundColor = setup.backgroundColor;\n this.showLegend = setup.showLegend;\n this.showControls = setup.showControls;\n this.autoScroll = setup.autoScroll;\n this.showStatistics = setup.showStatistics;\n this.dpr = setup.dpr;\n this.xAxisOptions = setup.xAxisOptions;\n this.xScale = setup.xScale;\n this.yAxisOptionsMap = setup.yAxisOptionsMap;\n this.yScales = setup.yScales;\n this.primaryYAxisId = setup.primaryYAxisId;\n this.webglCanvas = setup.webglCanvas;\n this.overlayCanvas = setup.overlayCanvas;\n this.overlayCtx = setup.overlayCtx;\n\n this.renderer = new NativeWebGLRenderer(this.webglCanvas);\n this.renderer.setDPR(this.dpr);\n this.overlay = new OverlayRenderer(this.overlayCtx, this.theme);\n this.pluginManager = new PluginManagerImpl(this);\n this.interaction = new InteractionManager(\n this.container,\n {\n onZoom: (b, axisId) =>\n this.zoom({ x: [b.xMin, b.xMax], y: [b.yMin, b.yMax], axisId }),\n onPan: (dx, dy, axisId) => this.pan(dx, dy, axisId),\n onBoxZoom: (rect) => this.handleBoxZoom(rect),\n onCursorMove: (x, y) => {\n this.cursorPosition = { x, y };\n this.tooltip.handleCursorMove(x, y);\n this.requestOverlayRender();\n },\n onCursorLeave: () => {\n this.cursorPosition = null;\n this.tooltip.handleCursorLeave();\n this.requestOverlayRender();\n },\n },\n () => this.getPlotArea(),\n (axisId) => this.getInteractedBounds(axisId),\n () => getAxesLayout(this.yAxisOptionsMap as any)\n );\n\n this.tooltip = new TooltipManager({\n overlayCtx: this.overlayCtx,\n chartTheme: this.theme,\n getPlotArea: () => this.getPlotArea(),\n getSeries: () => this.getAllSeries(),\n pixelToDataX: (px) => this.pixelToDataX(px),\n pixelToDataY: (py) => this.pixelToDataY(py),\n getXScale: () => this.xScale,\n getYScales: () => this.yScales,\n getViewBounds: () => this.viewBounds,\n options: options.tooltip\n });\n\n new ResizeObserver(() => !this.isDestroyed && this.resize()).observe(\n this.container\n );\n this.initControls();\n this.initLegend(options);\n if (this.showStatistics) {\n this.stats = new ChartStatistics(this.container, this.theme, this.series);\n }\n\n this.resize();\n this.startRenderLoop();\n setTimeout(() => !this.isDestroyed && this.resize(), 100);\n console.log(\"[SciChart] Initialized\", {\n dpr: this.dpr,\n theme: this.theme.name,\n });\n }\n\n private initControls(): void {\n this.controls = createControls({\n container: this.container,\n theme: this.theme,\n showControls: this.showControls,\n showLegend: this.showLegend,\n series: this.series,\n autoScale: () => this.autoScale(),\n resetZoom: () => this.resetZoom(),\n requestRender: () => this.requestRender(),\n exportImage: () => this.exportImage(),\n setPanMode: (active) => this.interaction.setPanMode(active),\n onLegendMove: (x: number, y: number) => this.events.emit(\"legendMove\", { x, y }),\n toggleLegend: () => this.toggleLegend(),\n });\n }\n\n private toggleLegend(): void {\n this.showLegend = !this.showLegend;\n if (this.legend) {\n this.legend.setVisible(this.showLegend);\n this.legend.update(this.getAllSeries());\n } else if (this.showLegend) {\n // Re-initialize if it didn't exist\n this.initLegend(this.initialOptions); \n }\n this.requestRender();\n }\n\n private initLegend(options: ChartOptions): void {\n this.legend = createLegend({\n container: this.container,\n theme: this.theme,\n showControls: this.showControls,\n showLegend: this.showLegend,\n series: this.series,\n autoScale: () => this.autoScale(),\n resetZoom: () => this.resetZoom(),\n requestRender: () => this.requestRender(),\n exportImage: () => this.exportImage(),\n setPanMode: (active) => this.interaction.setPanMode(active),\n onLegendMove: (x: number, y: number) => this.events.emit(\"legendMove\", { x, y }),\n toggleLegend: () => this.toggleLegend(),\n }, options);\n }\n\n setTheme(theme: string | ChartTheme): void {\n this.theme = typeof theme === \"string\" ? getThemeByName(theme) : theme;\n const bgColor = parseColor(this.theme.backgroundColor);\n this.backgroundColor = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n this.container.style.backgroundColor = this.theme.backgroundColor;\n \n this.overlay.setTheme(this.theme);\n this.tooltip.updateChartTheme(this.theme);\n if (this.controls) this.controls.updateTheme(this.theme);\n if (this.legend) this.legend.updateTheme(this.theme);\n if (this.stats) this.stats.updateTheme(this.theme);\n \n this.requestRender();\n }\n\n getPlotArea() {\n return calculatePlotArea(this.container, this.yAxisOptionsMap as any);\n }\n private getInteractedBounds(axisId?: string): Bounds {\n if (axisId) {\n const scale = this.yScales.get(axisId);\n if (scale)\n return {\n ...this.viewBounds,\n yMin: scale.domain[0],\n yMax: scale.domain[1],\n };\n }\n return this.viewBounds;\n }\n\n exportImage(type: \"png\" | \"jpeg\" = \"png\"): string {\n return exportToImage(\n this.webglCanvas,\n this.overlayCanvas,\n this.backgroundColor,\n this.legend,\n this.showLegend,\n this.dpr,\n type\n );\n }\n\n // Series Management (delegates to ChartSeries)\n private getSeriesContext() {\n return {\n series: this.series,\n renderer: this.renderer,\n viewBounds: this.viewBounds,\n autoScale: () => this.autoScale(),\n requestRender: () => this.requestRender(),\n addAnnotation: (a: Annotation) => this.addAnnotation(a),\n xAxisOptions: this.xAxisOptions,\n yAxisOptionsMap: this.yAxisOptionsMap,\n autoScrollEnabled: this.autoScroll,\n addSeries: (o: SeriesOptions | HeatmapOptions) => this.addSeries(o),\n updateLegend: () => {\n if (this.legend) this.legend.update(this.getAllSeries());\n },\n };\n }\n\n addSeries(options: SeriesOptions | HeatmapOptions): void {\n addSeriesImpl(this.getSeriesContext() as any, options as any);\n const series = this.series.get((options as any).id);\n if (series) this.pluginManager.notify('onSeriesAdded', series);\n }\n addBar(options: Omit<SeriesOptions, \"type\">): void {\n this.addSeries({ ...options, type: \"bar\" } as SeriesOptions);\n }\n addHeatmap(options: HeatmapOptions): void {\n this.addSeries({ ...options, type: \"heatmap\" } as HeatmapOptions);\n }\n removeSeries(id: string): void {\n removeSeriesImpl(this.getSeriesContext(), id);\n }\n updateSeries(id: string, data: SeriesUpdateData): void {\n updateSeriesImpl(this.getSeriesContext(), id, data);\n }\n appendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void {\n appendDataImpl(this.getSeriesContext(), id, x, y);\n }\n setAutoScroll(enabled: boolean): void {\n this.autoScroll = enabled;\n }\n setMaxPoints(id: string, maxPoints: number): void {\n setMaxPointsImpl(this.getSeriesContext(), id, maxPoints);\n }\n addFitLine(\n seriesId: string,\n type: FitType,\n options: FitOptions = {}\n ): string {\n return addFitLineImpl(this.getSeriesContext(), seriesId, type, options);\n }\n getSeries(id: string): Series | undefined {\n return this.series.get(id);\n }\n getAllSeries(): Series[] {\n return Array.from(this.series.values());\n }\n\n // Navigation (delegates to ChartNavigation)\n private getNavContext(): NavigationContext {\n return {\n viewBounds: this.viewBounds,\n yScales: this.yScales,\n yAxisOptionsMap: this.yAxisOptionsMap,\n xAxisOptions: this.xAxisOptions,\n primaryYAxisId: this.primaryYAxisId,\n getPlotArea: () => this.getPlotArea(),\n events: this.events,\n requestRender: () => this.requestRender(),\n series: this.series as any,\n };\n }\n\n zoom(options: ZoomOptions): void {\n applyZoom(this.getNavContext(), options);\n }\n pan(deltaX: number, deltaY: number, axisId?: string): void {\n applyPan(this.getNavContext(), deltaX, deltaY, axisId);\n }\n resetZoom(): void {\n this.autoScale();\n this.events.emit(\"zoom\", {\n x: [this.viewBounds.xMin, this.viewBounds.xMax],\n y: [this.viewBounds.yMin, this.viewBounds.yMax],\n });\n this.requestRender();\n }\n getViewBounds(): Bounds {\n return { ...this.viewBounds };\n }\n autoScale(): void {\n autoScaleAll(this.getNavContext());\n }\n private handleBoxZoom(\n rect: { x: number; y: number; width: number; height: number } | null\n ): void {\n const isFinishing = rect === null;\n this.selectionRect = handleBoxZoom(\n this.getNavContext(),\n rect,\n this.selectionRect,\n (o: any) => this.zoom(o)\n );\n \n if (isFinishing) {\n this.requestRender();\n } else {\n this.requestOverlayRender();\n }\n }\n\n // Cursor\n enableCursor(options: CursorOptions): void {\n this.cursorOptions = { enabled: true, ...options };\n }\n disableCursor(): void {\n this.cursorOptions = null;\n this.cursorPosition = null;\n this.requestOverlayRender();\n }\n\n // Annotations\n addAnnotation(annotation: Annotation): string {\n const id = this.annotationManager.add(annotation);\n this.requestOverlayRender();\n return id;\n }\n removeAnnotation(id: string): boolean {\n const result = this.annotationManager.remove(id);\n this.requestOverlayRender();\n return result;\n }\n updateAnnotation(id: string, updates: Partial<Annotation>): void {\n this.annotationManager.update(id, updates);\n this.requestOverlayRender();\n }\n getAnnotation(id: string): Annotation | undefined {\n return this.annotationManager.get(id);\n }\n getAnnotations(): Annotation[] {\n return this.annotationManager.getAll();\n }\n clearAnnotations(): void {\n this.annotationManager.clear();\n this.requestOverlayRender();\n }\n\n // Export\n exportCSV(options?: ExportOptions): string {\n return exportToCSV(this.getAllSeries(), options);\n }\n exportJSON(options?: ExportOptions): string {\n return exportToJSON(this.getAllSeries(), this.viewBounds, options);\n }\n\n use(plugin: any): void {\n this.pluginManager.use(plugin);\n }\n\n // Rendering\n resize(): void {\n if (\n !resizeCanvases(\n this.container,\n this.webglCanvas,\n this.overlayCanvas,\n this.overlayCtx,\n this.dpr\n )\n )\n return;\n this.renderer.resize();\n this.requestRender();\n }\n\n requestRender(): void {\n this.needsFullRender = true;\n }\n\n requestOverlayRender(): void {\n this.needsOverlayRender = true;\n }\n\n render(full: boolean = true): void {\n if (this.isDestroyed) return;\n const start = performance.now();\n const plotArea = this.getPlotArea();\n if (this.webglCanvas.width === 0 || this.webglCanvas.height === 0) return;\n\n const ctx = {\n webglCanvas: this.webglCanvas,\n overlayCanvas: this.overlayCanvas,\n overlayCtx: this.overlayCtx,\n container: this.container,\n series: this.series,\n viewBounds: this.viewBounds,\n xScale: this.xScale,\n yScales: this.yScales,\n yAxisOptionsMap: this.yAxisOptionsMap as any,\n xAxisOptions: this.xAxisOptions as any,\n primaryYAxisId: this.primaryYAxisId,\n renderer: this.renderer,\n overlay: this.overlay,\n annotationManager: this.annotationManager,\n backgroundColor: this.backgroundColor,\n cursorOptions: this.cursorOptions,\n cursorPosition: this.cursorPosition,\n selectionRect: this.selectionRect,\n stats: this.stats,\n showStatistics: this.showStatistics,\n events: this.events,\n updateSeriesBuffer: (s: Series) =>\n updateSeriesBuffer(this.getSeriesContext(), s),\n getPlotArea: () => plotArea,\n pixelToDataX: (px: number) => this.pixelToDataX(px),\n pixelToDataY: (py: number) => this.pixelToDataY(py),\n tooltip: this.tooltip,\n };\n\n if (full) {\n const seriesData = prepareSeriesData(ctx, plotArea);\n this.pluginManager.notify('onBeforeRender', this);\n this.renderer.render(seriesData, {\n bounds: this.viewBounds,\n backgroundColor: this.backgroundColor,\n plotArea,\n });\n renderOverlay(ctx, plotArea, this.yScale);\n this.pluginManager.notify('onAfterRender', this);\n } else {\n // Overlay only render\n renderOverlay(ctx, plotArea, this.yScale);\n }\n\n this.events.emit(\"render\", {\n fps: 1000 / (performance.now() - start),\n frameTime: performance.now() - start,\n });\n }\n\n private pixelToDataX(px: number): number {\n return pxToDataX(px, this.getPlotArea(), this.viewBounds);\n }\n\n private pixelToDataY(py: number): number {\n return pxToDataY(py, this.getPlotArea(), this.viewBounds);\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n if (this.isDestroyed) return;\n if (this.needsFullRender) {\n this.render(true);\n this.needsFullRender = false;\n this.needsOverlayRender = false;\n } else if (this.needsOverlayRender) {\n this.render(false);\n this.needsOverlayRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n on<K extends keyof ChartEventMap>(\n e: K,\n h: (d: ChartEventMap[K]) => void\n ): void {\n this.events.on(e, h);\n }\n off<K extends keyof ChartEventMap>(\n e: K,\n h: (d: ChartEventMap[K]) => void\n ): void {\n this.events.off(e, h);\n }\n\n destroy(): void {\n this.isDestroyed = true;\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n this.interaction.destroy();\n this.series.forEach((s) => {\n this.renderer.deleteBuffer(s.getId());\n s.destroy();\n });\n this.series.clear();\n this.renderer.destroy();\n if (this.controls) this.controls.destroy();\n if (this.legend) this.legend.destroy();\n if (this.tooltip) this.tooltip.destroy();\n while (this.container.firstChild)\n this.container.removeChild(this.container.firstChild);\n console.log(\"[SciChart] Destroyed\");\n }\n}\n\nexport function createChart(options: ChartOptions): Chart {\n return new ChartImpl(options);\n}\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 * WebSocket Streaming Utilities\n */\nimport { DataPoint, WebSocketStream } from \"./types\";\n\n/**\n * Default message parser - expects { x, y, seriesId? } or array of same\n */\nexport function defaultParser(data: unknown): DataPoint | DataPoint[] | null {\n if (!data || typeof data !== 'object') return null;\n \n // Array of points\n if (Array.isArray(data)) {\n return data\n .filter((item): item is DataPoint => \n typeof item === 'object' && \n item !== null && \n typeof item.x === 'number' && \n typeof item.y === 'number'\n );\n }\n \n // Single point\n const point = data as Record<string, unknown>;\n if (typeof point.x === 'number' && typeof point.y === 'number') {\n return {\n x: point.x,\n y: point.y,\n seriesId: typeof point.seriesId === 'string' ? point.seriesId : undefined,\n };\n }\n \n return null;\n}\n\n/**\n * Helper to create a parser for custom message formats\n */\nexport function createMessageParser<T>(\n transform: (message: T) => DataPoint | DataPoint[] | null\n): (data: unknown) => DataPoint | DataPoint[] | null {\n return (data: unknown) => {\n try {\n return transform(data as T);\n } catch {\n return null;\n }\n };\n}\n\n/**\n * Helper to connect a WebSocket stream to a chart\n */\nexport function connectStreamToChart(\n stream: WebSocketStream,\n chart: { appendData: (seriesId: string, data: { x: Float32Array; y: Float32Array }) => void },\n seriesIds: string[] = ['default']\n): () => void {\n const unsubscribers: (() => void)[] = [];\n\n for (const seriesId of seriesIds) {\n const unsubscribe = stream.subscribe(seriesId, (points) => {\n if (points.length === 0) return;\n \n const x = new Float32Array(points.map(p => p.x));\n const y = new Float32Array(points.map(p => p.y));\n \n chart.appendData(seriesId, { x, y });\n });\n \n unsubscribers.push(unsubscribe);\n }\n\n // Return cleanup function\n return () => {\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n };\n}\n","/**\n * WebSocket Stream Implementation\n */\nimport { \n WebSocketStreamConfig, \n DataPoint, \n WebSocketStream, \n StreamStats, \n WebSocketState \n} from \"./types\";\nimport { defaultParser } from \"./utils\";\n\n/**\n * Create a WebSocket stream for real-time chart data\n */\nexport function createWebSocketStream(config: WebSocketStreamConfig): WebSocketStream {\n const {\n url,\n maxReconnectAttempts = 5,\n reconnectDelay = 1000,\n bufferSize = 10,\n throttleMs = 16,\n parseMessage = defaultParser,\n onConnect,\n onDisconnect,\n onError,\n onReconnect,\n } = config;\n\n let ws: WebSocket | null = null;\n let state: WebSocketState = 'disconnected';\n let reconnectAttempts = 0;\n let reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n let connectionStartTime: number | null = null;\n\n const buffers = new Map<string, DataPoint[]>();\n const subscribers = new Map<string, Set<(points: DataPoint[]) => void>>();\n \n const stats: StreamStats = {\n messagesReceived: 0,\n pointsProcessed: 0,\n reconnectCount: 0,\n lastMessageTime: null,\n connectionUptime: 0,\n bufferSize: 0,\n };\n\n let lastFlushTime = 0;\n let flushScheduled = false;\n\n function connect(): void {\n if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {\n return;\n }\n state = 'connecting';\n try {\n ws = new WebSocket(url);\n ws.onopen = () => {\n state = 'connected';\n reconnectAttempts = 0;\n connectionStartTime = Date.now();\n onConnect?.();\n };\n ws.onmessage = (event) => handleMessage(event.data);\n ws.onclose = (event) => {\n state = 'disconnected';\n connectionStartTime = null;\n onDisconnect?.(event);\n if (!event.wasClean && reconnectAttempts < maxReconnectAttempts) scheduleReconnect();\n };\n ws.onerror = (error) => {\n state = 'error';\n onError?.(error);\n };\n } catch (error) {\n state = 'error';\n onError?.(error as Event);\n }\n }\n\n function disconnect(): void {\n if (reconnectTimeout) { clearTimeout(reconnectTimeout); reconnectTimeout = null; }\n if (ws) { ws.close(1000, 'Client disconnect'); ws = null; }\n state = 'disconnected';\n reconnectAttempts = 0;\n buffers.clear();\n }\n\n function scheduleReconnect(): void {\n if (reconnectTimeout) return;\n state = 'reconnecting';\n reconnectAttempts++;\n stats.reconnectCount++;\n onReconnect?.(reconnectAttempts);\n reconnectTimeout = setTimeout(() => {\n reconnectTimeout = null;\n connect();\n }, reconnectDelay * reconnectAttempts);\n }\n\n function handleMessage(data: unknown): void {\n stats.messagesReceived++;\n stats.lastMessageTime = Date.now();\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data;\n const points = parseMessage(parsed);\n if (!points) return;\n const pointArray = Array.isArray(points) ? points : [points];\n for (const point of pointArray) {\n const seriesId = point.seriesId || 'default';\n if (!buffers.has(seriesId)) buffers.set(seriesId, []);\n buffers.get(seriesId)!.push(point);\n stats.pointsProcessed++;\n }\n stats.bufferSize = Array.from(buffers.values()).reduce((sum, b) => sum + b.length, 0);\n scheduleFlush();\n } catch {}\n }\n\n function scheduleFlush(): void {\n if (flushScheduled) return;\n const now = performance.now();\n const timeSinceLastFlush = now - lastFlushTime;\n if (timeSinceLastFlush >= throttleMs) {\n flush();\n } else {\n flushScheduled = true;\n setTimeout(() => { flushScheduled = false; flush(); }, throttleMs - timeSinceLastFlush);\n }\n }\n\n function flush(): void {\n lastFlushTime = performance.now();\n for (const [seriesId, buffer] of buffers.entries()) {\n if (buffer.length === 0) continue;\n if (buffer.length >= bufferSize || performance.now() - lastFlushTime > throttleMs * 2) {\n const callbacks = subscribers.get(seriesId);\n if (callbacks) {\n const points = buffer.splice(0, buffer.length);\n for (const callback of callbacks) callback(points);\n } else {\n buffer.length = 0;\n }\n }\n }\n stats.bufferSize = Array.from(buffers.values()).reduce((sum, b) => sum + b.length, 0);\n }\n\n return {\n connect,\n disconnect,\n isConnected: () => ws !== null && ws.readyState === WebSocket.OPEN,\n getState: () => state,\n subscribe: (seriesId, callback) => {\n if (!subscribers.has(seriesId)) subscribers.set(seriesId, new Set());\n subscribers.get(seriesId)!.add(callback);\n return () => {\n const callbacks = subscribers.get(seriesId);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) subscribers.delete(seriesId);\n }\n };\n },\n unsubscribeAll: () => { subscribers.clear(); buffers.clear(); },\n send: (message) => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(typeof message === 'string' ? message : JSON.stringify(message));\n }\n },\n getStats: () => ({ ...stats, connectionUptime: connectionStartTime ? Date.now() - connectionStartTime : 0 }),\n };\n}\n","/**\n * Mock WebSocket Stream for Testing\n */\nimport { DataPoint, WebSocketStream, StreamStats } from \"./types\";\n\n/**\n * Mock WebSocket stream for testing\n */\nexport function createMockStream(config: {\n interval?: number;\n generatePoint?: () => DataPoint;\n}): WebSocketStream & { start: () => void; stop: () => void } {\n const { interval = 100, generatePoint = defaultGenerator } = config;\n \n let intervalId: ReturnType<typeof setInterval> | null = null;\n let connected = false;\n const subscribers = new Map<string, Set<(points: DataPoint[]) => void>>();\n \n const stats: StreamStats = {\n messagesReceived: 0,\n pointsProcessed: 0,\n reconnectCount: 0,\n lastMessageTime: null,\n connectionUptime: 0,\n bufferSize: 0,\n };\n\n let startTime: number | null = null;\n\n function start(): void {\n if (intervalId) return;\n \n startTime = Date.now();\n intervalId = setInterval(() => {\n const point = generatePoint();\n stats.messagesReceived++;\n stats.pointsProcessed++;\n stats.lastMessageTime = Date.now();\n \n const seriesId = point.seriesId || 'default';\n const callbacks = subscribers.get(seriesId);\n \n if (callbacks) {\n for (const callback of callbacks) {\n callback([point]);\n }\n }\n }, interval);\n }\n\n function stop(): void {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n startTime = null;\n }\n\n return {\n connect: () => { connected = true; start(); },\n disconnect: () => { connected = false; stop(); },\n isConnected: () => connected,\n getState: () => connected ? 'connected' : 'disconnected',\n subscribe: (seriesId, callback) => {\n if (!subscribers.has(seriesId)) {\n subscribers.set(seriesId, new Set());\n }\n subscribers.get(seriesId)!.add(callback);\n return () => {\n subscribers.get(seriesId)?.delete(callback);\n };\n },\n unsubscribeAll: () => subscribers.clear(),\n send: () => {},\n getStats: () => ({\n ...stats,\n connectionUptime: startTime ? Date.now() - startTime : 0,\n }),\n start,\n stop,\n };\n}\n\nlet mockX = 0;\nfunction defaultGenerator(): DataPoint {\n return {\n x: mockX++,\n y: Math.sin(mockX * 0.1) + Math.random() * 0.2,\n };\n}\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 * useSciChart - React hook for SciChart Engine\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 UseSciChartOptions extends Omit<ChartOptions, \"container\"> {\n /** Auto-resize on container changes */\n autoResize?: boolean;\n}\n\nexport interface UseSciChartReturn {\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 SciChart Engine\n *\n * @example\n * ```tsx\n * function MyChart() {\n * const canvasRef = useRef<HTMLCanvasElement>(null);\n * const { chart, isReady, addSeries, zoom } = useSciChart(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 useSciChart(\n containerRef: RefObject<HTMLDivElement>,\n options: UseSciChartOptions = {}\n): UseSciChartReturn {\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 console.log(\"[useSciChart] Chart initialized\");\n } catch (err) {\n console.error(\"[useSciChart] 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 * SciChart - React Component for Scientific Charts\n *\n * A declarative React component that wraps the SciChart Engine.\n */\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useSciChart, type UseSciChartOptions } from \"./useSciChart\";\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 SciChartSeries {\n id: string;\n x: Float32Array | Float64Array;\n y: Float32Array | Float64Array;\n color?: string;\n width?: number;\n visible?: boolean;\n}\n\nexport interface SciChartProps extends UseSciChartOptions {\n /** Series data to display */\n series?: SciChartSeries[];\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 SciChartRef {\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 * SciChart React Component\n *\n * @example\n * ```tsx\n * <SciChart\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 SciChart = forwardRef<SciChartRef, SciChartProps>(\n function SciChart(\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, SciChartSeries>>(new Map());\n\n const {\n chart,\n isReady,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n resetZoom,\n } = useSciChart(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={`scichart-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 SciChart;\n","/**\n * BufferStore - Manages GPU buffer lifecycle\n * \n * Provides a unified interface for buffer management across backends.\n * Handles buffer creation, updates, and cleanup.\n */\n\nimport type { BufferId, BufferUsage } from \"../types\";\n\nexport interface BufferEntry {\n id: BufferId;\n usage: BufferUsage;\n byteLength: number;\n lastUpdated: number;\n}\n\nexport interface IBufferStore {\n /** Create or update a buffer with new data */\n createOrUpdate(id: BufferId, data: ArrayBufferView, usage?: BufferUsage): void;\n \n /** Partially update a buffer at an offset */\n partialUpdate(id: BufferId, data: ArrayBufferView, offsetBytes: number): boolean;\n \n /** Get buffer metadata */\n getInfo(id: BufferId): BufferEntry | undefined;\n \n /** Check if buffer exists */\n has(id: BufferId): boolean;\n \n /** Delete a buffer */\n delete(id: BufferId): void;\n \n /** Get all buffer IDs */\n keys(): IterableIterator<BufferId>;\n \n /** Get buffer count */\n readonly size: number;\n \n /** Cleanup all buffers */\n destroy(): void;\n}\n\n/**\n * Abstract base class for buffer stores\n */\nexport abstract class BaseBufferStore implements IBufferStore {\n protected entries = new Map<BufferId, BufferEntry>();\n \n abstract createOrUpdate(id: BufferId, data: ArrayBufferView, usage?: BufferUsage): void;\n abstract partialUpdate(id: BufferId, data: ArrayBufferView, offsetBytes: number): boolean;\n abstract delete(id: BufferId): void;\n abstract destroy(): void;\n \n getInfo(id: BufferId): BufferEntry | undefined {\n return this.entries.get(id);\n }\n \n has(id: BufferId): boolean {\n return this.entries.has(id);\n }\n \n keys(): IterableIterator<BufferId> {\n return this.entries.keys();\n }\n \n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * TextureStore - Manages GPU texture lifecycle\n * \n * Provides a unified interface for texture management across backends.\n */\n\nimport type { TextureId, TextureFormat } from \"../types\";\n\nexport interface TextureEntry {\n id: TextureId;\n format: TextureFormat;\n width: number;\n height: number;\n lastUpdated: number;\n}\n\nexport interface ITextureStore {\n /** Create or update a 1D texture (for colormaps) */\n createOrUpdate1D(id: TextureId, data: Uint8Array, width?: number): void;\n \n /** Create or update a 2D texture */\n createOrUpdate2D(id: TextureId, data: Uint8Array, width: number, height: number): void;\n \n /** Get texture metadata */\n getInfo(id: TextureId): TextureEntry | undefined;\n \n /** Check if texture exists */\n has(id: TextureId): boolean;\n \n /** Delete a texture */\n delete(id: TextureId): void;\n \n /** Get all texture IDs */\n keys(): IterableIterator<TextureId>;\n \n /** Get texture count */\n readonly size: number;\n \n /** Cleanup all textures */\n destroy(): void;\n}\n\n/**\n * Abstract base class for texture stores\n */\nexport abstract class BaseTextureStore implements ITextureStore {\n protected entries = new Map<TextureId, TextureEntry>();\n \n abstract createOrUpdate1D(id: TextureId, data: Uint8Array, width?: number): void;\n abstract createOrUpdate2D(id: TextureId, data: Uint8Array, width: number, height: number): void;\n abstract delete(id: TextureId): void;\n abstract destroy(): void;\n \n getInfo(id: TextureId): TextureEntry | undefined {\n return this.entries.get(id);\n }\n \n has(id: TextureId): boolean {\n return this.entries.has(id);\n }\n \n keys(): IterableIterator<TextureId> {\n return this.entries.keys();\n }\n \n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * PipelineCache - Manages GPU pipeline lifecycle\n * \n * Caches compiled pipelines to avoid recompilation overhead.\n */\n\nexport type PipelineKind = \n | \"triangle\"\n | \"line\"\n | \"point\"\n | \"band\"\n | \"heatmap\";\n\nexport interface PipelineKey {\n kind: PipelineKind;\n variant?: string; // For future shader variants\n}\n\nexport interface IPipelineCache {\n /** Get or create a pipeline */\n getOrCreate<T>(key: PipelineKey, factory: () => T): T;\n \n /** Check if pipeline exists */\n has(key: PipelineKey): boolean;\n \n /** Delete a pipeline */\n delete(key: PipelineKey): void;\n \n /** Get pipeline count */\n readonly size: number;\n \n /** Cleanup all pipelines */\n destroy(): void;\n}\n\nfunction keyToString(key: PipelineKey): string {\n return key.variant ? `${key.kind}:${key.variant}` : key.kind;\n}\n\n/**\n * Generic pipeline cache implementation\n */\nexport class PipelineCache implements IPipelineCache {\n private pipelines = new Map<string, any>();\n \n getOrCreate<T>(key: PipelineKey, factory: () => T): T {\n const keyStr = keyToString(key);\n \n if (!this.pipelines.has(keyStr)) {\n const pipeline = factory();\n this.pipelines.set(keyStr, pipeline);\n }\n \n return this.pipelines.get(keyStr) as T;\n }\n \n has(key: PipelineKey): boolean {\n return this.pipelines.has(keyToString(key));\n }\n \n delete(key: PipelineKey): void {\n this.pipelines.delete(keyToString(key));\n }\n \n get size(): number {\n return this.pipelines.size;\n }\n \n destroy(): void {\n // Note: Actual pipeline destruction is backend-specific\n this.pipelines.clear();\n }\n}\n","/**\n * Series Adapter - Converts SciChart series data to GPU DrawCalls\n * \n * This adapter bridges the gap between the existing SciChart series system\n * and the new backend-agnostic GPU abstraction layer.\n */\n\nimport type { \n DrawCall, \n DrawList, \n DrawKind, \n PointStyle,\n HeatmapStyle,\n} from \"../drawList\";\nimport type { GpuBackend, BufferId, TextureId, RGBA } from \"../types\";\n\n/**\n * Series style from the original renderer\n */\nexport interface SeriesStyle {\n color?: string | RGBA;\n opacity?: number;\n lineWidth?: number;\n pointSize?: number;\n symbol?: string;\n}\n\n/**\n * Series render data from the chart system\n */\nexport interface SeriesData {\n id: string;\n type: \"line\" | \"scatter\" | \"line+scatter\" | \"step\" | \"step+scatter\" | \"band\" | \"bar\" | \"heatmap\";\n visible: boolean;\n \n /** Main vertex data */\n data: Float32Array;\n \n /** Style properties */\n style: SeriesStyle;\n \n /** For step charts */\n stepData?: Float32Array;\n \n /** Y-axis bounds for multi-axis support */\n yBounds?: { min: number; max: number };\n \n /** For heatmaps */\n zBounds?: { min: number; max: number };\n colormapData?: Uint8Array;\n colormap?: string;\n}\n\n/**\n * Mutable color tuple for internal use\n */\ntype MutableRGBA = [number, number, number, number];\n\n/**\n * Parse color from various formats to RGBA\n */\nexport function parseColorToRGBA(color: string | RGBA | undefined): MutableRGBA {\n if (!color) {\n return [1, 0, 0.3, 1]; // Default magenta\n }\n \n // If already an RGBA tuple, return a copy\n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], color[3] ?? 1];\n }\n \n // At this point, color must be a string\n const colorStr = color as string;\n \n // Parse hex color\n if (colorStr.startsWith(\"#\")) {\n const hex = colorStr.slice(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16) / 255;\n const g = parseInt(hex[1] + hex[1], 16) / 255;\n const b = parseInt(hex[2] + hex[2], 16) / 255;\n return [r, g, b, 1];\n }\n if (hex.length === 6) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n return [r, g, b, 1];\n }\n if (hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n return [r, g, b, a];\n }\n }\n \n // Parse rgb/rgba\n const rgbaMatch = colorStr.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/);\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1]) / 255;\n const g = parseInt(rgbaMatch[2]) / 255;\n const b = parseInt(rgbaMatch[3]) / 255;\n const a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;\n return [r, g, b, a];\n }\n \n return [1, 0, 0.3, 1]; // Fallback\n}\n\n/**\n * Map series type to draw kind\n */\nfunction mapSeriesTypeToDrawKind(type: SeriesData[\"type\"]): DrawKind {\n return type as DrawKind;\n}\n\n/**\n * Convert SeriesStyle to GPU styles\n */\nfunction convertStyle(style: SeriesStyle, type: SeriesData[\"type\"]): DrawCall[\"style\"] {\n const baseColor = parseColorToRGBA(style.color);\n const opacity = style.opacity ?? 1;\n const color: MutableRGBA = [baseColor[0], baseColor[1], baseColor[2], baseColor[3] * opacity];\n \n if (type === \"scatter\" || type === \"line+scatter\" || type === \"step+scatter\") {\n return {\n color: color as RGBA,\n opacity,\n pointSize: style.pointSize ?? 4,\n symbol: (style.symbol ?? \"circle\") as PointStyle[\"symbol\"],\n } as PointStyle;\n }\n \n return {\n color: color as RGBA,\n opacity,\n lineWidth: style.lineWidth ?? 1,\n };\n}\n\n/**\n * Series Adapter class\n * \n * Manages the conversion of chart series to GPU resources and draw calls.\n */\nexport class SeriesAdapter {\n private backend: GpuBackend;\n private seriesBufferMap = new Map<string, BufferId>();\n private seriesStepBufferMap = new Map<string, BufferId>();\n private seriesTextureMap = new Map<string, TextureId>();\n \n constructor(backend: GpuBackend) {\n this.backend = backend;\n }\n \n /**\n * Get buffer ID for a series\n */\n private getBufferId(seriesId: string): BufferId {\n if (!this.seriesBufferMap.has(seriesId)) {\n this.seriesBufferMap.set(seriesId, `series:${seriesId}`);\n }\n return this.seriesBufferMap.get(seriesId)!;\n }\n \n /**\n * Get step buffer ID for a series\n */\n private getStepBufferId(seriesId: string): BufferId {\n if (!this.seriesStepBufferMap.has(seriesId)) {\n this.seriesStepBufferMap.set(seriesId, `series:${seriesId}:step`);\n }\n return this.seriesStepBufferMap.get(seriesId)!;\n }\n \n /**\n * Get texture ID for a series\n */\n private getTextureId(seriesId: string): TextureId {\n if (!this.seriesTextureMap.has(seriesId)) {\n this.seriesTextureMap.set(seriesId, `texture:${seriesId}`);\n }\n return this.seriesTextureMap.get(seriesId)!;\n }\n \n /**\n * Update series data in GPU buffers\n */\n updateSeries(series: SeriesData): void {\n const bufferId = this.getBufferId(series.id);\n \n // Update main buffer\n this.backend.createOrUpdateBuffer(bufferId, series.data, { usage: \"vertex\" });\n \n // Update step buffer if present\n if (series.stepData && (series.type === \"step\" || series.type === \"step+scatter\")) {\n const stepBufferId = this.getStepBufferId(series.id);\n this.backend.createOrUpdateBuffer(stepBufferId, series.stepData, { usage: \"vertex\" });\n }\n \n // Update colormap texture if present\n if (series.type === \"heatmap\" && series.colormapData) {\n const textureId = this.getTextureId(series.id);\n this.backend.createOrUpdateTexture1D(textureId, series.colormapData, {\n width: series.colormapData.length / 4,\n });\n }\n }\n \n /**\n * Remove a series from GPU resources\n */\n removeSeries(seriesId: string): void {\n const bufferId = this.seriesBufferMap.get(seriesId);\n if (bufferId) {\n this.backend.deleteBuffer(bufferId);\n this.seriesBufferMap.delete(seriesId);\n }\n \n const stepBufferId = this.seriesStepBufferMap.get(seriesId);\n if (stepBufferId) {\n this.backend.deleteBuffer(stepBufferId);\n this.seriesStepBufferMap.delete(seriesId);\n }\n \n const textureId = this.seriesTextureMap.get(seriesId);\n if (textureId) {\n this.backend.deleteTexture(textureId);\n this.seriesTextureMap.delete(seriesId);\n }\n }\n \n /**\n * Build draw list from series array\n */\n buildDrawList(seriesArray: SeriesData[]): DrawList {\n const items: DrawCall[] = [];\n \n for (const series of seriesArray) {\n // Update GPU resources\n this.updateSeries(series);\n \n const bufferId = this.getBufferId(series.id);\n const pointCount = series.data.length / 2; // Assuming x,y pairs\n \n const drawCall: DrawCall = {\n id: series.id,\n kind: mapSeriesTypeToDrawKind(series.type),\n bufferId,\n count: series.type === \"heatmap\" ? series.data.length / 3 : pointCount,\n visible: series.visible,\n style: convertStyle(series.style, series.type),\n yBounds: series.yBounds,\n };\n \n // Step buffer\n if (series.stepData && (series.type === \"step\" || series.type === \"step+scatter\")) {\n drawCall.stepBufferId = this.getStepBufferId(series.id);\n drawCall.stepCount = series.stepData.length / 2;\n }\n \n // Heatmap texture\n if (series.type === \"heatmap\") {\n drawCall.textureId = this.getTextureId(series.id);\n (drawCall.style as HeatmapStyle) = {\n zBounds: series.zBounds,\n colormap: series.colormap,\n };\n }\n \n items.push(drawCall);\n }\n \n return { items };\n }\n \n /**\n * Cleanup all resources\n */\n destroy(): void {\n for (const bufferId of this.seriesBufferMap.values()) {\n this.backend.deleteBuffer(bufferId);\n }\n for (const stepBufferId of this.seriesStepBufferMap.values()) {\n this.backend.deleteBuffer(stepBufferId);\n }\n for (const textureId of this.seriesTextureMap.values()) {\n this.backend.deleteTexture(textureId);\n }\n \n this.seriesBufferMap.clear();\n this.seriesStepBufferMap.clear();\n this.seriesTextureMap.clear();\n }\n}\n","export const TRIANGLE_SHADER_WGSL = `\nstruct VSOut {\n @builtin(position) pos: vec4<f32>,\n @location(0) color: vec4<f32>,\n};\n\n@vertex\nfn vs_main(\n @location(0) position: vec2<f32>,\n @location(1) color: vec4<f32>\n) -> VSOut {\n var out: VSOut;\n out.pos = vec4<f32>(position, 0.0, 1.0);\n out.color = color;\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOut) -> @location(0) vec4<f32> {\n return in.color;\n}\n`;\n","import { TRIANGLE_SHADER_WGSL } from \"./triangleShader\";\n\nexport interface TrianglePipelineBundle {\n pipeline: any;\n vertexStride: number;\n}\n\nexport function createTrianglePipeline(\n device: any,\n format: string\n): TrianglePipelineBundle {\n const module = device.createShaderModule({ code: TRIANGLE_SHADER_WGSL });\n\n const vertexStride = 6 * 4;\n\n const pipeline = device.createRenderPipeline({\n layout: \"auto\",\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: vertexStride,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 2 * 4, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [{ format }],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return { pipeline, vertexStride };\n}\n","/**\n * Line Shader - WGSL for WebGPU\n * \n * Renders simple line strips with uniform color.\n * Uses uniform buffer for transform (scale + translate).\n */\n\nexport const LINE_SHADER_WGSL = `\n// Uniform buffer for transforms and color\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n return uniforms.color;\n}\n`;\n\nexport const LINE_VERTEX_STRIDE = 2 * 4; // 2 floats (x, y)\n","/**\n * Line Pipeline - WebGPU pipeline for rendering lines with uniform buffer\n * \n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types\n * (following the pattern of the original WebGPUBackend.ts)\n */\n\nimport { LINE_SHADER_WGSL, LINE_VERTEX_STRIDE } from \"../shaders/line.wgsl\";\n\nexport interface LinePipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n vertexStride: number;\n}\n\nexport interface LineUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n}\n\n// Uniform buffer layout: scale(2) + translate(2) + color(4) = 8 floats = 32 bytes\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createLinePipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): LinePipelineBundle {\n const module = device.createShaderModule({ code: LINE_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout explicitly\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: LINE_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"line-strip\",\n stripIndexFormat: undefined,\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n vertexStride: LINE_VERTEX_STRIDE,\n };\n}\n\nexport function updateLineUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: LineUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","/**\n * Point Shader - WGSL for WebGPU\n * \n * Renders scatter points with SDF-based symbols.\n * Supports: circle, square, diamond, triangle, triangleDown, cross, x, star\n */\n\nexport const POINT_SHADER_WGSL = `\n// Uniform buffer for transforms, color, point properties\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n pointSize: f32,\n symbol: i32, // 0=circle, 1=square, 2=diamond, 3=triangle, 4=triangleDown, 5=cross, 6=x, 7=star\n _padding: vec2<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) @interpolate(flat) pointSize: f32,\n @location(1) @interpolate(flat) symbol: i32,\n};\n\n@vertex\nfn vs_main(in: VSInput, @builtin(vertex_index) vertexIndex: u32) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n out.pointSize = uniforms.pointSize;\n out.symbol = uniforms.symbol;\n return out;\n}\n\n// SDF functions for symbols\nfn sdCircle(p: vec2<f32>, r: f32) -> f32 {\n return length(p) - r;\n}\n\nfn sdBox(p: vec2<f32>, b: vec2<f32>) -> f32 {\n let d = abs(p) - b;\n return length(max(d, vec2<f32>(0.0))) + min(max(d.x, d.y), 0.0);\n}\n\nfn sdDiamond(p: vec2<f32>, r: f32) -> f32 {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfn sdTriangle(p_in: vec2<f32>, r: f32) -> f32 {\n let k = sqrt(3.0);\n var p = p_in;\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) {\n p = vec2<f32>(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n }\n p.x = p.x - clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfn sdCross(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let d = abs(p);\n let s1 = sdBox(d, vec2<f32>(r, thickness));\n let s2 = sdBox(d, vec2<f32>(thickness, r));\n return min(s1, s2);\n}\n\nfn sdX(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let c = cos(0.785398);\n let s = sin(0.785398);\n let m = mat2x2<f32>(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfn sdStar(p_in: vec2<f32>, r: f32, rf: f32) -> f32 {\n let k1 = vec2<f32>(0.80901699, -0.58778525);\n let k2 = vec2<f32>(-k1.x, k1.y);\n var p = p_in;\n p.x = abs(p.x);\n p = p - 2.0 * max(dot(k1, p), 0.0) * k1;\n p = p - 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y = p.y - r;\n let ba = rf * vec2<f32>(-k1.y, k1.x) - vec2<f32>(0.0, 1.0);\n let h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n // Note: WebGPU doesn't have gl_PointCoord directly\n // Points in WebGPU require rendering quads instead\n // This shader needs instanced rendering with quads for proper point rendering\n // For now, return the color directly\n return uniforms.color;\n}\n`;\n\n// For proper point rendering we need quad instances\n// Each point becomes 6 vertices (2 triangles forming a quad)\nexport const POINT_QUAD_SHADER_WGSL = `\n// Uniform buffer for transforms, color, point properties\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n pointSize: f32,\n symbol: i32,\n viewport: vec2<f32>, // viewport dimensions for proper sizing\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>, // point center position\n @location(1) quadOffset: vec2<f32>, // quad vertex offset (-1 to 1)\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) uv: vec2<f32>, // -0.5 to 0.5 for SDF\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n \n // Transform point position to NDC\n let transformed = in.position * uniforms.scale + uniforms.translate;\n \n // Calculate point size in NDC\n let pointSizeNDC = vec2<f32>(\n uniforms.pointSize / uniforms.viewport.x * 2.0,\n uniforms.pointSize / uniforms.viewport.y * 2.0\n );\n \n // Apply quad offset\n let offset = in.quadOffset * pointSizeNDC * 0.5;\n \n out.pos = vec4<f32>(transformed + offset, 0.0, 1.0);\n out.uv = in.quadOffset * 0.5; // -0.5 to 0.5\n \n return out;\n}\n\n// SDF functions\nfn sdCircle(p: vec2<f32>, r: f32) -> f32 {\n return length(p) - r;\n}\n\nfn sdBox(p: vec2<f32>, b: vec2<f32>) -> f32 {\n let d = abs(p) - b;\n return length(max(d, vec2<f32>(0.0))) + min(max(d.x, d.y), 0.0);\n}\n\nfn sdDiamond(p: vec2<f32>, r: f32) -> f32 {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfn sdTriangle(p_in: vec2<f32>, r: f32) -> f32 {\n let k = sqrt(3.0);\n var p = p_in;\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) {\n p = vec2<f32>(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n }\n p.x = p.x - clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfn sdCross(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let d = abs(p);\n let s1 = sdBox(d, vec2<f32>(r, thickness));\n let s2 = sdBox(d, vec2<f32>(thickness, r));\n return min(s1, s2);\n}\n\nfn sdX(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let c = cos(0.785398);\n let s = sin(0.785398);\n let m = mat2x2<f32>(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfn sdStar(p_in: vec2<f32>, r: f32, rf: f32) -> f32 {\n let k1 = vec2<f32>(0.80901699, -0.58778525);\n let k2 = vec2<f32>(-k1.x, k1.y);\n var p = p_in;\n p.x = abs(p.x);\n p = p - 2.0 * max(dot(k1, p), 0.0) * k1;\n p = p - 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y = p.y - r;\n let ba = rf * vec2<f32>(-k1.y, k1.x) - vec2<f32>(0.0, 1.0);\n let h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n var d: f32 = 0.0;\n \n if (uniforms.symbol == 0) {\n d = sdCircle(in.uv, 0.45);\n } else if (uniforms.symbol == 1) {\n d = sdBox(in.uv, vec2<f32>(0.35));\n } else if (uniforms.symbol == 2) {\n d = sdDiamond(in.uv, 0.45);\n } else if (uniforms.symbol == 3) {\n d = sdTriangle(vec2<f32>(in.uv.x, in.uv.y + 0.1), 0.4);\n } else if (uniforms.symbol == 4) {\n d = sdTriangle(vec2<f32>(in.uv.x, -in.uv.y + 0.1), 0.4);\n } else if (uniforms.symbol == 5) {\n d = sdCross(in.uv, 0.45, 0.15);\n } else if (uniforms.symbol == 6) {\n d = sdX(in.uv, 0.45, 0.15);\n } else if (uniforms.symbol == 7) {\n d = sdStar(in.uv, 0.45, 0.4);\n }\n \n if (d > 0.02) {\n discard;\n }\n \n let alpha = 1.0 - smoothstep(0.0, 0.02, d);\n return vec4<f32>(uniforms.color.rgb, uniforms.color.a * alpha);\n}\n`;\n\nexport const POINT_VERTEX_STRIDE = 2 * 4; // 2 floats (x, y)\n","/**\n * Point Pipeline - WebGPU pipeline for rendering scatter points with SDF symbols\n * \n * Uses instanced rendering where each point is rendered as a quad (2 triangles).\n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { POINT_QUAD_SHADER_WGSL, POINT_VERTEX_STRIDE } from \"../shaders/point.wgsl\";\n\nexport interface PointPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n quadBuffer: any; // GPUBuffer - Pre-generated quad vertices\n vertexStride: number;\n}\n\nexport interface PointUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n pointSize: number;\n symbol: number; // 0=circle, 1=square, 2=diamond, 3=triangle, 4=triangleDown, 5=cross, 6=x, 7=star\n viewport: [number, number];\n}\n\n// Uniform buffer layout:\n// scale(2) + translate(2) + color(4) + pointSize(1) + symbol(1) + viewport(2) = 12 floats = 48 bytes\nconst UNIFORM_BUFFER_SIZE = 48;\n\n// Quad vertex offsets (6 vertices for 2 triangles)\nconst QUAD_VERTICES = new Float32Array([\n -1, -1, // bottom-left\n 1, -1, // bottom-right\n -1, 1, // top-left\n -1, 1, // top-left\n 1, -1, // bottom-right\n 1, 1, // top-right\n]);\n\nexport function createPointPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): PointPipelineBundle {\n const module = device.createShaderModule({ code: POINT_QUAD_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create quad vertex buffer\n const quadBuffer = device.createBuffer({\n size: QUAD_VERTICES.byteLength,\n usage: GPUBufferUsageAny.VERTEX | GPUBufferUsageAny.COPY_DST,\n mappedAtCreation: true,\n });\n new Float32Array(quadBuffer.getMappedRange()).set(QUAD_VERTICES);\n quadBuffer.unmap();\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n // Point positions (instanced)\n {\n arrayStride: POINT_VERTEX_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n // Quad vertex offsets (per-vertex)\n {\n arrayStride: 8, // 2 floats\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 1, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n quadBuffer,\n vertexStride: POINT_VERTEX_STRIDE,\n };\n}\n\nexport function updatePointUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: PointUniforms\n): void {\n // Pack data: scale(2) + translate(2) + color(4) + pointSize(1) + symbol(1 as float) + viewport(2)\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n uniforms.pointSize,\n uniforms.symbol, // Will be cast to i32 in shader via bitcast\n uniforms.viewport[0],\n uniforms.viewport[1],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n\nexport const SYMBOL_MAP: Record<string, number> = {\n circle: 0,\n square: 1,\n diamond: 2,\n triangle: 3,\n triangleDown: 4,\n cross: 5,\n x: 6,\n star: 7,\n};\n","/**\n * Band Pipeline - WebGPU pipeline for rendering band/area fills\n * \n * Uses triangle-strip topology for efficient area rendering.\n * Reuses the line shader with different primitive topology.\n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { LINE_SHADER_WGSL, LINE_VERTEX_STRIDE } from \"../shaders/line.wgsl\";\n\nexport interface BandPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n vertexStride: number;\n}\n\nexport interface BandUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n}\n\n// Same as line uniforms\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createBandPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): BandPipelineBundle {\n const module = device.createShaderModule({ code: LINE_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: LINE_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-strip\", // Key difference from line pipeline\n stripIndexFormat: undefined,\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n vertexStride: LINE_VERTEX_STRIDE,\n };\n}\n\nexport function updateBandUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: BandUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","/**\n * Heatmap Shader - WGSL for WebGPU\n * \n * Renders heatmap cells with colormap texture lookup.\n * Each vertex has position (x, y) and value (z) for color mapping.\n */\n\nexport const HEATMAP_SHADER_WGSL = `\n// Uniform buffer for transforms and value range\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n minValue: f32,\n maxValue: f32,\n _padding: vec2<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\n@group(0) @binding(1)\nvar colormapSampler: sampler;\n\n@group(0) @binding(2)\nvar colormapTexture: texture_1d<f32>;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n @location(1) value: f32,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) value: f32,\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n out.value = in.value;\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n let range = uniforms.maxValue - uniforms.minValue;\n var t: f32;\n if (range != 0.0) {\n t = (in.value - uniforms.minValue) / range;\n } else {\n t = 0.0;\n }\n t = clamp(t, 0.0, 1.0);\n \n return textureSample(colormapTexture, colormapSampler, t);\n}\n`;\n\n// Heatmap vertex: position (2 floats) + value (1 float) = 12 bytes\nexport const HEATMAP_VERTEX_STRIDE = 3 * 4; // 12 bytes\n","/**\n * Heatmap Pipeline - WebGPU pipeline for rendering heatmaps with colormap textures\n * \n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { HEATMAP_SHADER_WGSL, HEATMAP_VERTEX_STRIDE } from \"../shaders/heatmap.wgsl\";\n\nexport interface HeatmapPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n sampler: any; // GPUSampler\n vertexStride: number;\n}\n\nexport interface HeatmapUniforms {\n scale: [number, number];\n translate: [number, number];\n minValue: number;\n maxValue: number;\n}\n\n// Uniform buffer layout: scale(2) + translate(2) + minValue(1) + maxValue(1) + padding(2) = 8 floats = 32 bytes\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createHeatmapPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): HeatmapPipelineBundle {\n const module = device.createShaderModule({ code: HEATMAP_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n {\n binding: 1,\n visibility: GPUShaderStageAny.FRAGMENT,\n sampler: {},\n },\n {\n binding: 2,\n visibility: GPUShaderStageAny.FRAGMENT,\n texture: { \n sampleType: \"float\",\n viewDimension: \"1d\",\n },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create sampler\n const sampler = device.createSampler({\n magFilter: \"linear\",\n minFilter: \"linear\",\n addressModeU: \"clamp-to-edge\",\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: HEATMAP_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" }, // position\n { shaderLocation: 1, offset: 8, format: \"float32\" }, // value\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n sampler,\n vertexStride: HEATMAP_VERTEX_STRIDE,\n };\n}\n\nexport function createHeatmapBindGroup(\n device: any, // GPUDevice\n layout: any, // GPUBindGroupLayout\n uniformBuffer: any, // GPUBuffer\n sampler: any, // GPUSampler\n colormapTexture: any // GPUTexture\n): any { // GPUBindGroup\n return device.createBindGroup({\n layout,\n entries: [\n { binding: 0, resource: { buffer: uniformBuffer } },\n { binding: 1, resource: sampler },\n { binding: 2, resource: colormapTexture.createView() },\n ],\n });\n}\n\nexport function updateHeatmapUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: HeatmapUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.minValue,\n uniforms.maxValue,\n 0, // padding\n 0, // padding\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","import type {\n BufferDescriptor,\n BufferId,\n GpuBackend,\n GpuBackendInfo,\n GpuViewport,\n Texture1DDescriptor,\n TextureId,\n} from \"../../types\";\nimport type { DrawCall, DrawList, PointStyle, HeatmapStyle } from \"../../drawList\";\nimport type { FrameUniforms } from \"../../frame\";\nimport {\n createTrianglePipeline,\n type TrianglePipelineBundle,\n} from \"./pipelines/trianglePipeline\";\nimport {\n createLinePipeline,\n updateLineUniforms,\n type LinePipelineBundle,\n} from \"./pipelines/linePipeline\";\nimport {\n createPointPipeline,\n updatePointUniforms,\n SYMBOL_MAP,\n type PointPipelineBundle,\n} from \"./pipelines/pointPipeline\";\nimport {\n createBandPipeline,\n updateBandUniforms,\n type BandPipelineBundle,\n} from \"./pipelines/bandPipeline\";\nimport {\n createHeatmapPipeline,\n createHeatmapBindGroup,\n updateHeatmapUniforms,\n type HeatmapPipelineBundle,\n} from \"./pipelines/heatmapPipeline\";\n\nexport interface WebGPUBackendOptions {\n powerPreference?: \"low-power\" | \"high-performance\";\n preferredFormat?: string;\n}\n\n/**\n * Calculate transform uniforms from bounds\n */\nfunction calculateUniforms(bounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}): { scale: [number, number]; translate: [number, number] } {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n}\n\n/**\n * Parse color from style, returning RGBA values 0-1\n */\nfunction getColorFromStyle(style: any): [number, number, number, number] {\n const color = style?.color ?? [1, 0, 0.3, 1];\n const opacity = style?.opacity ?? 1;\n \n // If color is already RGBA tuple\n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], (color[3] ?? 1) * opacity];\n }\n \n return [1, 0, 0.3, opacity]; // Default magenta\n}\n\nexport class WebGPUBackend implements GpuBackend {\n public readonly info: GpuBackendInfo;\n\n private canvas: HTMLCanvasElement;\n private opts: WebGPUBackendOptions;\n\n private viewport: GpuViewport | null = null;\n\n private adapter: any;\n private device: any;\n private context: any;\n private format: string | null = null;\n\n private buffers = new Map<string, any>();\n private textures = new Map<string, any>();\n\n // Pipelines for different draw types\n private trianglePipeline: TrianglePipelineBundle | null = null;\n private linePipeline: LinePipelineBundle | null = null;\n private pointPipeline: PointPipelineBundle | null = null;\n private bandPipeline: BandPipelineBundle | null = null;\n private heatmapPipeline: HeatmapPipelineBundle | null = null;\n\n // Heatmap bind groups (per texture)\n private heatmapBindGroups = new Map<string, any>();\n\n constructor(canvas: HTMLCanvasElement, opts: WebGPUBackendOptions = {}) {\n this.canvas = canvas;\n this.opts = opts;\n this.info = {\n type: \"webgpu\",\n available: WebGPUBackend.isSupported(),\n };\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(): Promise<void> {\n if (!this.info.available) {\n throw new Error(\"[gpu] WebGPU not supported\");\n }\n\n const gpu = (globalThis as any).navigator.gpu;\n\n this.adapter = await gpu.requestAdapter({\n powerPreference: this.opts.powerPreference ?? \"high-performance\",\n });\n\n if (!this.adapter) {\n throw new Error(\"[gpu] 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(\"[gpu] Failed to get WebGPU canvas context\");\n }\n\n this.context = ctx;\n\n const format =\n this.opts.preferredFormat ??\n (gpu.getPreferredCanvasFormat\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n this.format = format;\n\n this.context.configure({\n device: this.device,\n format,\n alphaMode: \"premultiplied\",\n });\n }\n\n setViewport(viewport: GpuViewport): void {\n this.viewport = viewport;\n const w = Math.max(1, Math.floor(viewport.width * viewport.dpr));\n const h = Math.max(1, Math.floor(viewport.height * viewport.dpr));\n if (this.canvas.width !== w) this.canvas.width = w;\n if (this.canvas.height !== h) this.canvas.height = h;\n }\n\n createOrUpdateBuffer(\n id: BufferId,\n data: ArrayBufferView,\n desc?: Partial<BufferDescriptor>\n ): void {\n if (!this.device) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n const usage = desc?.usage ?? \"vertex\";\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n if (!GPUBufferUsageAny) {\n throw new Error(\n \"[gpu] GPUBufferUsage not available (missing WebGPU runtime)\"\n );\n }\n\n const usageFlags =\n usage === \"index\"\n ? GPUBufferUsageAny.INDEX | GPUBufferUsageAny.COPY_DST\n : usage === \"uniform\"\n ? GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST\n : GPUBufferUsageAny.VERTEX | GPUBufferUsageAny.COPY_DST;\n\n const byteLength = data.byteLength;\n\n let buf = this.buffers.get(id);\n if (!buf || buf.size < byteLength) {\n if (buf) {\n try {\n buf.destroy();\n } catch {}\n }\n buf = this.device.createBuffer({\n size: Math.max(4, byteLength),\n usage: usageFlags,\n });\n this.buffers.set(id, buf);\n }\n\n this.device.queue.writeBuffer(\n buf,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n deleteBuffer(id: BufferId): void {\n const buf = this.buffers.get(id);\n if (buf) {\n try {\n buf.destroy();\n } catch {}\n this.buffers.delete(id);\n }\n }\n\n createOrUpdateTexture1D(\n id: TextureId,\n data: Uint8Array,\n desc?: Partial<Texture1DDescriptor>\n ): void {\n if (!this.device) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n const width = desc?.width ?? Math.floor(data.length / 4);\n const format = desc?.format ?? \"rgba8unorm\";\n\n const GPUTextureUsageAny = (globalThis as any).GPUTextureUsage;\n if (!GPUTextureUsageAny) {\n throw new Error(\n \"[gpu] GPUTextureUsage not available (missing WebGPU runtime)\"\n );\n }\n\n let tex = this.textures.get(id);\n if (!tex) {\n tex = this.device.createTexture({\n size: { width, height: 1, depthOrArrayLayers: 1 },\n format,\n dimension: \"1d\",\n usage: GPUTextureUsageAny.TEXTURE_BINDING | GPUTextureUsageAny.COPY_DST,\n });\n this.textures.set(id, tex);\n \n // Invalidate heatmap bind group for this texture\n this.heatmapBindGroups.delete(id);\n }\n\n this.device.queue.writeTexture(\n { texture: tex },\n data,\n { bytesPerRow: width * 4 },\n { width, height: 1, depthOrArrayLayers: 1 }\n );\n }\n\n deleteTexture(id: TextureId): void {\n const tex = this.textures.get(id);\n if (tex) {\n try {\n tex.destroy();\n } catch {}\n this.textures.delete(id);\n this.heatmapBindGroups.delete(id);\n }\n }\n\n /**\n * Initialize all pipelines lazily\n */\n private ensurePipelines(): void {\n if (!this.trianglePipeline) {\n this.trianglePipeline = createTrianglePipeline(this.device, this.format!);\n }\n if (!this.linePipeline) {\n this.linePipeline = createLinePipeline(this.device, this.format!);\n }\n if (!this.pointPipeline) {\n this.pointPipeline = createPointPipeline(this.device, this.format!);\n }\n if (!this.bandPipeline) {\n this.bandPipeline = createBandPipeline(this.device, this.format!);\n }\n if (!this.heatmapPipeline) {\n this.heatmapPipeline = createHeatmapPipeline(this.device, this.format!);\n }\n }\n\n render(drawList: DrawList, frame: FrameUniforms): void {\n if (!this.device || !this.context || !this.format) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n this.ensurePipelines();\n\n const encoder = this.device.createCommandEncoder();\n const view = this.context.getCurrentTexture().createView();\n\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view,\n clearValue: {\n r: frame.clearColor[0],\n g: frame.clearColor[1],\n b: frame.clearColor[2],\n a: frame.clearColor[3],\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n\n // Default bounds (NDC if not specified)\n const defaultBounds = { xMin: -1, xMax: 1, yMin: -1, yMax: 1 };\n\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buf = this.buffers.get(item.bufferId);\n if (!buf) continue;\n\n this.renderDrawCall(pass, item, buf, defaultBounds);\n }\n\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n /**\n * Render with explicit bounds (for integration with chart system)\n */\n renderWithBounds(\n drawList: DrawList,\n frame: FrameUniforms,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n if (!this.device || !this.context || !this.format) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n this.ensurePipelines();\n\n const encoder = this.device.createCommandEncoder();\n const view = this.context.getCurrentTexture().createView();\n\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view,\n clearValue: {\n r: frame.clearColor[0],\n g: frame.clearColor[1],\n b: frame.clearColor[2],\n a: frame.clearColor[3],\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buf = this.buffers.get(item.bufferId);\n if (!buf) continue;\n\n // Use item's yBounds if specified, otherwise use global bounds\n const itemBounds = item.yBounds\n ? { ...bounds, yMin: item.yBounds.min, yMax: item.yBounds.max }\n : bounds;\n\n this.renderDrawCall(pass, item, buf, itemBounds);\n }\n\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n /**\n * Render a single draw call\n */\n private renderDrawCall(\n pass: any,\n item: DrawCall,\n buf: any,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n const uniforms = calculateUniforms(bounds);\n const color = getColorFromStyle(item.style);\n\n switch (item.kind) {\n case \"triangles\":\n case \"bar\":\n this.renderTriangles(pass, buf, item.count);\n break;\n\n case \"line\":\n this.renderLine(pass, buf, item.count, uniforms, color);\n break;\n\n case \"scatter\":\n case \"points\":\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"line+scatter\":\n this.renderLine(pass, buf, item.count, uniforms, color);\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"step\":\n // Use step buffer if available\n if (item.stepBufferId && item.stepCount) {\n const stepBuf = this.buffers.get(item.stepBufferId);\n if (stepBuf) {\n this.renderLine(pass, stepBuf, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(pass, buf, item.count, uniforms, color);\n }\n break;\n\n case \"step+scatter\":\n if (item.stepBufferId && item.stepCount) {\n const stepBuf = this.buffers.get(item.stepBufferId);\n if (stepBuf) {\n this.renderLine(pass, stepBuf, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(pass, buf, item.count, uniforms, color);\n }\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"band\":\n // Band uses semi-transparent color\n const bandColor: [number, number, number, number] = [\n color[0],\n color[1],\n color[2],\n color[3] * 0.4,\n ];\n this.renderBand(pass, buf, item.count, uniforms, bandColor);\n break;\n\n case \"heatmap\":\n this.renderHeatmap(pass, buf, item.count, uniforms, item.style as HeatmapStyle, item.textureId);\n break;\n }\n }\n\n private renderTriangles(pass: any, buf: any, count: number): void {\n pass.setPipeline(this.trianglePipeline!.pipeline);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderLine(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n updateLineUniforms(this.device, this.linePipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n });\n pass.setPipeline(this.linePipeline!.pipeline);\n pass.setBindGroup(0, this.linePipeline!.bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderPoints(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n style?: PointStyle\n ): void {\n const pointSize = (style?.pointSize ?? 4) * (this.viewport?.dpr ?? 1);\n const symbol = SYMBOL_MAP[style?.symbol ?? \"circle\"] ?? 0;\n const viewport: [number, number] = [\n this.canvas.width,\n this.canvas.height,\n ];\n\n updatePointUniforms(this.device, this.pointPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n pointSize,\n symbol,\n viewport,\n });\n\n pass.setPipeline(this.pointPipeline!.pipeline);\n pass.setBindGroup(0, this.pointPipeline!.bindGroup);\n pass.setVertexBuffer(0, buf); // Point positions (instanced)\n pass.setVertexBuffer(1, this.pointPipeline!.quadBuffer); // Quad vertices\n pass.draw(6, count); // 6 vertices per quad, count instances\n }\n\n private renderBand(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n updateBandUniforms(this.device, this.bandPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n });\n pass.setPipeline(this.bandPipeline!.pipeline);\n pass.setBindGroup(0, this.bandPipeline!.bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderHeatmap(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n style?: HeatmapStyle,\n textureId?: string\n ): void {\n if (!textureId) return;\n \n const tex = this.textures.get(textureId);\n if (!tex) return;\n\n const zBounds = style?.zBounds ?? { min: 0, max: 1 };\n\n updateHeatmapUniforms(this.device, this.heatmapPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n minValue: zBounds.min,\n maxValue: zBounds.max,\n });\n\n // Get or create bind group for this texture\n let bindGroup = this.heatmapBindGroups.get(textureId);\n if (!bindGroup) {\n bindGroup = createHeatmapBindGroup(\n this.device,\n this.heatmapPipeline!.bindGroupLayout,\n this.heatmapPipeline!.uniformBuffer,\n this.heatmapPipeline!.sampler,\n tex\n );\n this.heatmapBindGroups.set(textureId, bindGroup);\n }\n\n pass.setPipeline(this.heatmapPipeline!.pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n destroy(): void {\n for (const id of Array.from(this.buffers.keys())) {\n this.deleteBuffer(id);\n }\n for (const id of Array.from(this.textures.keys())) {\n this.deleteTexture(id);\n }\n\n this.trianglePipeline = null;\n this.linePipeline = null;\n this.pointPipeline = null;\n this.bandPipeline = null;\n this.heatmapPipeline = null;\n this.heatmapBindGroups.clear();\n\n this.device = undefined;\n this.adapter = undefined;\n this.context = undefined;\n this.format = null;\n }\n}\n","/**\n * WebGL Shader Sources\n * \n * GLSL shaders for the WebGL backend.\n * These match the functionality of the WebGPU WGSL shaders.\n */\n\n// ============================================\n// Line Shader\n// ============================================\n\nexport const LINE_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nexport const LINE_FRAG_GLSL = `\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n`;\n\n// ============================================\n// Point Shader (with SDF symbols)\n// ============================================\n\nexport const POINT_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n`;\n\nexport const POINT_FRAG_GLSL = `\nprecision highp float;\nuniform vec4 uColor;\nuniform int uSymbol;\n\nfloat sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n\nfloat sdTriangle(vec2 p, float r) {\n const float k = sqrt(3.0);\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n p.x -= clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfloat sdDiamond(vec2 p, float r) {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfloat sdCross(vec2 p, float r, float thickness) {\n vec2 d = abs(p);\n float s1 = sdBox(d, vec2(r, thickness));\n float s2 = sdBox(d, vec2(thickness, r));\n return min(s1, s2);\n}\n\nfloat sdX(vec2 p, float r, float thickness) {\n float c = cos(0.785398);\n float s = sin(0.785398);\n mat2 m = mat2(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfloat sdStar(vec2 p, float r, float rf) {\n const vec2 k1 = vec2(0.80901699, -0.58778525);\n const vec2 k2 = vec2(-k1.x, k1.y);\n p.x = abs(p.x);\n p -= 2.0 * max(dot(k1, p), 0.0) * k1;\n p -= 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y -= r;\n vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0, 1);\n float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\nvoid main() {\n vec2 p = gl_PointCoord - vec2(0.5);\n float d = 0.0;\n\n if (uSymbol == 0) {\n d = sdCircle(p, 0.45);\n } else if (uSymbol == 1) {\n d = sdBox(p, vec2(0.35));\n } else if (uSymbol == 2) {\n d = sdDiamond(p, 0.45);\n } else if (uSymbol == 3) {\n d = sdTriangle(vec2(p.x, p.y + 0.1), 0.4);\n } else if (uSymbol == 4) {\n d = sdTriangle(vec2(p.x, -p.y + 0.1), 0.4);\n } else if (uSymbol == 5) {\n d = sdCross(p, 0.45, 0.15);\n } else if (uSymbol == 6) {\n d = sdX(p, 0.45, 0.15);\n } else if (uSymbol == 7) {\n d = sdStar(p, 0.45, 0.4);\n }\n\n if (d > 0.02) discard;\n\n float alpha = 1.0 - smoothstep(0.0, 0.02, d);\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n`;\n\n// ============================================\n// Heatmap Shader\n// ============================================\n\nexport const HEATMAP_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute float aValue;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying float vValue;\n\nvoid main() {\n gl_Position = vec4(aPosition * uScale + uTranslate, 0.0, 1.0);\n vValue = aValue;\n}\n`;\n\nexport const HEATMAP_FRAG_GLSL = `\nprecision highp float;\nvarying float vValue;\nuniform float uMinValue;\nuniform float uMaxValue;\nuniform sampler2D uColormap;\n\nvoid main() {\n float range = uMaxValue - uMinValue;\n float t = (vValue - uMinValue) / (range != 0.0 ? range : 1.0);\n t = clamp(t, 0.0, 1.0);\n gl_FragColor = texture2D(uColormap, vec2(t, 0.5));\n}\n`;\n\n// ============================================\n// Triangle Shader (for bands and bars)\n// ============================================\n\nexport const TRIANGLE_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec4 aColor;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying vec4 vColor;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n vColor = aColor;\n}\n`;\n\nexport const TRIANGLE_FRAG_GLSL = `\nprecision highp float;\nvarying vec4 vColor;\n\nvoid main() {\n gl_FragColor = vColor;\n}\n`;\n","/**\n * WebGL Program Factory\n * \n * Utilities for compiling and linking WebGL shader programs.\n */\n\nimport {\n LINE_VERT_GLSL,\n LINE_FRAG_GLSL,\n POINT_VERT_GLSL,\n POINT_FRAG_GLSL,\n HEATMAP_VERT_GLSL,\n HEATMAP_FRAG_GLSL,\n} from \"./shaders\";\n\nexport interface ShaderProgram {\n program: WebGLProgram;\n attributes: Record<string, number>;\n uniforms: Record<string, WebGLUniformLocation | null>;\n}\n\n/**\n * Compile a shader\n */\nfunction compileShader(\n gl: WebGLRenderingContext,\n type: number,\n source: string\n): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) {\n throw new Error(\"[WebGL] Failed to create shader\");\n }\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`[WebGL] Shader compilation error: ${info}`);\n }\n\n return shader;\n}\n\n/**\n * Link a shader program\n */\nfunction linkProgram(\n gl: WebGLRenderingContext,\n vertShader: WebGLShader,\n fragShader: WebGLShader\n): WebGLProgram {\n const program = gl.createProgram();\n if (!program) {\n throw new Error(\"[WebGL] Failed to create program\");\n }\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n throw new Error(`[WebGL] Program link error: ${info}`);\n }\n\n return program;\n}\n\n/**\n * Create a shader program from source\n */\nexport function createProgram(\n gl: WebGLRenderingContext,\n vertSource: string,\n fragSource: string,\n attributeNames: string[],\n uniformNames: string[]\n): ShaderProgram {\n const vertShader = compileShader(gl, gl.VERTEX_SHADER, vertSource);\n const fragShader = compileShader(gl, gl.FRAGMENT_SHADER, fragSource);\n const program = linkProgram(gl, vertShader, fragShader);\n\n // Clean up individual shaders (they're linked now)\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n // Get attribute locations\n const attributes: Record<string, number> = {};\n for (const name of attributeNames) {\n attributes[name] = gl.getAttribLocation(program, name);\n }\n\n // Get uniform locations\n const uniforms: Record<string, WebGLUniformLocation | null> = {};\n for (const name of uniformNames) {\n uniforms[name] = gl.getUniformLocation(program, name);\n }\n\n return { program, attributes, uniforms };\n}\n\n/**\n * All programs used by the WebGL backend\n */\nexport interface ProgramBundle {\n line: ShaderProgram;\n point: ShaderProgram;\n heatmap: ShaderProgram;\n}\n\n/**\n * Create all shader programs\n */\nexport function createAllPrograms(gl: WebGLRenderingContext): ProgramBundle {\n const line = createProgram(\n gl,\n LINE_VERT_GLSL,\n LINE_FRAG_GLSL,\n [\"aPosition\"],\n [\"uScale\", \"uTranslate\", \"uColor\"]\n );\n\n const point = createProgram(\n gl,\n POINT_VERT_GLSL,\n POINT_FRAG_GLSL,\n [\"aPosition\"],\n [\"uScale\", \"uTranslate\", \"uColor\", \"uPointSize\", \"uSymbol\"]\n );\n\n const heatmap = createProgram(\n gl,\n HEATMAP_VERT_GLSL,\n HEATMAP_FRAG_GLSL,\n [\"aPosition\", \"aValue\"],\n [\"uScale\", \"uTranslate\", \"uMinValue\", \"uMaxValue\", \"uColormap\"]\n );\n\n return { line, point, heatmap };\n}\n\n/**\n * Destroy all programs\n */\nexport function destroyPrograms(gl: WebGLRenderingContext, bundle: ProgramBundle): void {\n gl.deleteProgram(bundle.line.program);\n gl.deleteProgram(bundle.point.program);\n gl.deleteProgram(bundle.heatmap.program);\n}\n","/**\n * WebGL Backend - GPU abstraction layer implementation for WebGL\n * \n * Provides the same interface as WebGPUBackend for compatibility.\n * This serves as a fallback for browsers without WebGPU support.\n */\n\nimport type {\n BufferDescriptor,\n BufferId,\n GpuBackend,\n GpuBackendInfo,\n GpuViewport,\n Texture1DDescriptor,\n TextureId,\n} from \"../../types\";\nimport type { DrawCall, DrawList, PointStyle, HeatmapStyle } from \"../../drawList\";\nimport type { FrameUniforms } from \"../../frame\";\nimport { createAllPrograms, destroyPrograms, type ProgramBundle } from \"./programFactory\";\n\nexport interface WebGLBackendOptions {\n antialias?: boolean;\n preserveDrawingBuffer?: boolean;\n powerPreference?: \"default\" | \"low-power\" | \"high-performance\";\n}\n\n/**\n * Symbol name to number mapping\n */\nconst SYMBOL_MAP: Record<string, number> = {\n circle: 0,\n square: 1,\n diamond: 2,\n triangle: 3,\n triangleDown: 4,\n cross: 5,\n x: 6,\n star: 7,\n};\n\n/**\n * Calculate transform uniforms from bounds\n */\nfunction calculateUniforms(bounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}): { scale: [number, number]; translate: [number, number] } {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n}\n\n/**\n * Get color from style\n */\nfunction getColorFromStyle(style: any): [number, number, number, number] {\n const color = style?.color ?? [1, 0, 0.3, 1];\n const opacity = style?.opacity ?? 1;\n \n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], (color[3] ?? 1) * opacity];\n }\n \n return [1, 0, 0.3, opacity];\n}\n\nexport class WebGLBackend implements GpuBackend {\n public readonly info: GpuBackendInfo;\n\n private canvas: HTMLCanvasElement;\n private opts: WebGLBackendOptions;\n private gl: WebGLRenderingContext | null = null;\n \n private viewport: GpuViewport | null = null;\n private dpr: number = 1;\n\n private programs: ProgramBundle | null = null;\n private buffers = new Map<string, WebGLBuffer>();\n private textures = new Map<string, WebGLTexture>();\n\n constructor(canvas: HTMLCanvasElement, opts: WebGLBackendOptions = {}) {\n this.canvas = canvas;\n this.opts = opts;\n this.info = {\n type: \"webgl\",\n available: WebGLBackend.isSupported(),\n };\n }\n\n static isSupported(): boolean {\n if (typeof document === \"undefined\") return false;\n \n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n return !!gl;\n } catch {\n return false;\n }\n }\n\n async init(): Promise<void> {\n if (!this.info.available) {\n throw new Error(\"[gpu] WebGL not supported\");\n }\n\n const gl = this.canvas.getContext(\"webgl\", {\n alpha: true,\n antialias: this.opts.antialias ?? true,\n preserveDrawingBuffer: this.opts.preserveDrawingBuffer ?? true,\n powerPreference: this.opts.powerPreference ?? \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"[gpu] Failed to get WebGL context\");\n }\n\n this.gl = gl;\n\n // Enable blending\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Create shader programs\n this.programs = createAllPrograms(gl);\n }\n\n setViewport(viewport: GpuViewport): void {\n this.viewport = viewport;\n this.dpr = viewport.dpr;\n \n const w = Math.max(1, Math.floor(viewport.width * viewport.dpr));\n const h = Math.max(1, Math.floor(viewport.height * viewport.dpr));\n \n if (this.canvas.width !== w) this.canvas.width = w;\n if (this.canvas.height !== h) this.canvas.height = h;\n \n if (this.gl) {\n this.gl.viewport(0, 0, w, h);\n }\n }\n\n createOrUpdateBuffer(\n id: BufferId,\n data: ArrayBufferView,\n desc?: Partial<BufferDescriptor>\n ): void {\n if (!this.gl) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n \n let buffer = this.buffers.get(id);\n if (!buffer) {\n buffer = gl.createBuffer()!;\n this.buffers.set(id, buffer);\n }\n\n const target = desc?.usage === \"index\" ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER;\n \n gl.bindBuffer(target, buffer);\n gl.bufferData(target, data, gl.DYNAMIC_DRAW);\n gl.bindBuffer(target, null);\n }\n\n deleteBuffer(id: BufferId): void {\n if (!this.gl) return;\n \n const buffer = this.buffers.get(id);\n if (buffer) {\n this.gl.deleteBuffer(buffer);\n this.buffers.delete(id);\n }\n }\n\n createOrUpdateTexture1D(\n id: TextureId,\n data: Uint8Array,\n desc?: Partial<Texture1DDescriptor>\n ): void {\n if (!this.gl) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n const width = desc?.width ?? Math.floor(data.length / 4);\n\n let texture = this.textures.get(id);\n if (!texture) {\n texture = gl.createTexture()!;\n this.textures.set(id, texture);\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n\n deleteTexture(id: TextureId): void {\n if (!this.gl) return;\n \n const texture = this.textures.get(id);\n if (texture) {\n this.gl.deleteTexture(texture);\n this.textures.delete(id);\n }\n }\n\n render(drawList: DrawList, frame: FrameUniforms): void {\n this.renderWithBounds(drawList, frame, { xMin: -1, xMax: 1, yMin: -1, yMax: 1 });\n }\n\n renderWithBounds(\n drawList: DrawList,\n frame: FrameUniforms,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n if (!this.gl || !this.programs) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n // Clear\n gl.clearColor(\n frame.clearColor[0],\n frame.clearColor[1],\n frame.clearColor[2],\n frame.clearColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Render each draw call\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buffer = this.buffers.get(item.bufferId);\n if (!buffer) continue;\n\n // Use item's yBounds if specified\n const itemBounds = item.yBounds\n ? { ...bounds, yMin: item.yBounds.min, yMax: item.yBounds.max }\n : bounds;\n\n this.renderDrawCall(item, buffer, itemBounds);\n }\n }\n\n private renderDrawCall(\n item: DrawCall,\n buffer: WebGLBuffer,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n const uniforms = calculateUniforms(bounds);\n const color = getColorFromStyle(item.style);\n\n switch (item.kind) {\n case \"line\":\n case \"step\":\n this.renderLine(buffer, item.count, uniforms, color);\n break;\n\n case \"scatter\":\n case \"points\":\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"line+scatter\":\n this.renderLine(buffer, item.count, uniforms, color);\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"step+scatter\":\n if (item.stepBufferId && item.stepCount) {\n const stepBuffer = this.buffers.get(item.stepBufferId);\n if (stepBuffer) {\n this.renderLine(stepBuffer, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(buffer, item.count, uniforms, color);\n }\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"band\":\n const bandColor: [number, number, number, number] = [\n color[0], color[1], color[2], color[3] * 0.4\n ];\n this.renderBand(buffer, item.count, uniforms, bandColor);\n break;\n\n case \"triangles\":\n case \"bar\":\n this.renderTriangles(buffer, item.count, uniforms, color);\n break;\n\n case \"heatmap\":\n this.renderHeatmap(buffer, item.count, uniforms, item.style as HeatmapStyle, item.textureId);\n break;\n }\n }\n\n private renderLine(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.LINE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderPoints(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n style?: PointStyle\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.point;\n\n const pointSize = (style?.pointSize ?? 4) * this.dpr;\n const symbol = SYMBOL_MAP[style?.symbol ?? \"circle\"] ?? 0;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n gl.uniform1f(prog.uniforms.uPointSize!, pointSize);\n gl.uniform1i(prog.uniforms.uSymbol!, symbol);\n\n gl.drawArrays(gl.POINTS, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderBand(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderTriangles(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderHeatmap(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n style?: HeatmapStyle,\n textureId?: string\n ): void {\n if (!textureId) return;\n \n const texture = this.textures.get(textureId);\n if (!texture) return;\n\n const gl = this.gl!;\n const prog = this.programs!.heatmap;\n\n const zBounds = style?.zBounds ?? { min: 0, max: 1 };\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 12, 0);\n\n if (prog.attributes.aValue !== -1) {\n gl.enableVertexAttribArray(prog.attributes.aValue);\n gl.vertexAttribPointer(prog.attributes.aValue, 1, gl.FLOAT, false, 12, 8);\n }\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform1f(prog.uniforms.uMinValue!, zBounds.min);\n gl.uniform1f(prog.uniforms.uMaxValue!, zBounds.max);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1i(prog.uniforms.uColormap!, 0);\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n if (prog.attributes.aValue !== -1) {\n gl.disableVertexAttribArray(prog.attributes.aValue);\n }\n }\n\n destroy(): void {\n if (!this.gl) return;\n\n const gl = this.gl;\n\n // Delete all buffers\n for (const buffer of this.buffers.values()) {\n gl.deleteBuffer(buffer);\n }\n this.buffers.clear();\n\n // Delete all textures\n for (const texture of this.textures.values()) {\n gl.deleteTexture(texture);\n }\n this.textures.clear();\n\n // Delete programs\n if (this.programs) {\n destroyPrograms(gl, this.programs);\n this.programs = null;\n }\n\n this.gl = null;\n }\n}\n","/**\n * GPU Renderer Facade - Drop-in replacement for NativeWebGLRenderer\n * \n * Provides the same interface as NativeWebGLRenderer but uses the\n * backend-agnostic GPU abstraction layer. Supports both WebGPU and WebGL.\n */\n\nimport type { GpuBackend, RGBA } from \"../types\";\nimport type { DrawList, DrawCall, PointStyle } from \"../drawList\";\nimport type { FrameUniforms } from \"../frame\";\nimport { WebGPUBackend } from \"../backends/webgpu/WebGPUBackend\";\nimport { WebGLBackend } from \"../backends/webgl/WebGLBackend\";\nimport { SeriesAdapter, parseColorToRGBA } from \"./seriesAdapter\";\nimport type { SeriesStyle } from \"./seriesAdapter\";\n\n/**\n * Bounds interface matching the original\n */\nexport interface Bounds {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\n/**\n * Series render data matching NativeSeriesRenderData\n */\nexport interface GpuSeriesRenderData {\n id: string;\n type: \"line\" | \"scatter\" | \"line+scatter\" | \"step\" | \"step+scatter\" | \"band\" | \"bar\" | \"heatmap\";\n visible: boolean;\n style: SeriesStyle;\n \n /** Y-bounds for multi-axis support */\n yBounds?: { min: number; max: number };\n \n /** Heatmap specific */\n zBounds?: { min: number; max: number };\n colormap?: string;\n}\n\n/**\n * Render options matching NativeRenderOptions\n */\nexport interface GpuRenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n plotArea?: { x: number; y: number; width: number; height: number };\n}\n\n/**\n * Backend preference\n */\nexport type BackendPreference = \"webgpu\" | \"webgl\" | \"auto\";\n\n/**\n * GPU Renderer options\n */\nexport interface GpuRendererOptions {\n backend?: BackendPreference;\n powerPreference?: \"low-power\" | \"high-performance\";\n}\n\n/**\n * GPU Renderer - Unified renderer using the GPU abstraction layer\n */\nexport class GpuRenderer {\n private canvas: HTMLCanvasElement;\n private options: GpuRendererOptions;\n private backend: GpuBackend | null = null;\n private adapter: SeriesAdapter | null = null;\n \n private dpr: number;\n private isInitialized = false;\n private backendType: \"webgpu\" | \"webgl\" | null = null;\n \n // Buffer management\n private bufferDataMap = new Map<string, Float32Array>();\n private stepBufferDataMap = new Map<string, Float32Array>();\n private colormapDataMap = new Map<string, Uint8Array>();\n \n constructor(canvas: HTMLCanvasElement, options: GpuRendererOptions = {}) {\n this.canvas = canvas;\n this.options = options;\n this.dpr = window.devicePixelRatio || 1;\n }\n \n /**\n * Initialize the renderer\n */\n async init(): Promise<boolean> {\n const preference = this.options.backend ?? \"auto\";\n \n // Try WebGPU first if preferred or auto\n if (preference === \"webgpu\" || preference === \"auto\") {\n if (WebGPUBackend.isSupported()) {\n try {\n const backend = new WebGPUBackend(this.canvas, {\n powerPreference: this.options.powerPreference ?? \"high-performance\",\n });\n await backend.init();\n \n this.backend = backend;\n this.backendType = \"webgpu\";\n this.adapter = new SeriesAdapter(backend);\n this.isInitialized = true;\n \n this.resize();\n return true;\n } catch (e) {\n console.warn(\"[GpuRenderer] WebGPU init failed:\", e);\n }\n }\n }\n \n // Fallback to WebGL\n if (preference === \"webgl\" || preference === \"auto\") {\n if (WebGLBackend.isSupported()) {\n try {\n const backend = new WebGLBackend(this.canvas, {\n powerPreference: this.options.powerPreference ?? \"high-performance\",\n });\n await backend.init();\n \n this.backend = backend;\n this.backendType = \"webgl\";\n this.adapter = new SeriesAdapter(backend);\n this.isInitialized = true;\n \n this.resize();\n console.info(\"[GpuRenderer] Using WebGL backend (WebGPU not available)\");\n return true;\n } catch (e) {\n console.warn(\"[GpuRenderer] WebGL init failed:\", e);\n }\n }\n }\n \n return false;\n }\n \n /**\n * Check if renderer is available\n */\n get available(): boolean {\n return this.isInitialized;\n }\n \n /**\n * Get the active backend type\n */\n get activeBackend(): \"webgpu\" | \"webgl\" | null {\n return this.backendType;\n }\n \n /**\n * Set device pixel ratio\n */\n setDPR(dpr: number): void {\n this.dpr = dpr;\n this.resize();\n }\n \n /**\n * Create or update a buffer\n */\n createBuffer(id: string, data: Float32Array): void {\n this.bufferDataMap.set(id, data);\n }\n \n /**\n * Update a buffer partially\n */\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n const existing = this.bufferDataMap.get(id);\n if (!existing) return false;\n \n const offsetFloats = offsetInBytes / 4;\n existing.set(data, offsetFloats);\n return true;\n }\n \n /**\n * Get a buffer's data\n */\n getBuffer(id: string): Float32Array | undefined {\n return this.bufferDataMap.get(id);\n }\n \n /**\n * Delete a buffer\n */\n deleteBuffer(id: string): void {\n this.bufferDataMap.delete(id);\n if (this.backend) {\n this.backend.deleteBuffer(id);\n }\n }\n \n /**\n * Create or update a step buffer\n */\n createStepBuffer(id: string, data: Float32Array): void {\n this.stepBufferDataMap.set(id, data);\n }\n \n /**\n * Create colormap texture\n */\n createColormapTexture(id: string, data: Uint8Array): void {\n this.colormapDataMap.set(id, data);\n if (this.backend) {\n this.backend.createOrUpdateTexture1D(id, data, {\n width: data.length / 4,\n });\n }\n }\n \n /**\n * Render a frame\n */\n render(series: GpuSeriesRenderData[], options: GpuRenderOptions): void {\n if (!this.isInitialized || !this.backend) return;\n \n // Build draw list\n const drawList = this.buildDrawList(series);\n \n // Create frame uniforms\n const frame: FrameUniforms = {\n viewport: {\n width: this.canvas.clientWidth,\n height: this.canvas.clientHeight,\n dpr: this.dpr,\n },\n clearColor: (options.backgroundColor ?? [0.1, 0.1, 0.18, 1]) as RGBA,\n bounds: options.bounds,\n plotArea: options.plotArea,\n };\n \n // Render using the backend\n if (\"renderWithBounds\" in this.backend) {\n (this.backend as any).renderWithBounds(drawList, frame, options.bounds);\n } else {\n this.backend.render(drawList, frame);\n }\n }\n \n /**\n * Build draw list from series data\n */\n private buildDrawList(series: GpuSeriesRenderData[]): DrawList {\n const items: DrawCall[] = [];\n \n for (const s of series) {\n const bufferData = this.bufferDataMap.get(s.id);\n if (!bufferData) continue;\n \n // Upload buffer to GPU\n this.backend!.createOrUpdateBuffer(s.id, bufferData, { usage: \"vertex\" });\n \n const pointCount = s.type === \"heatmap\" \n ? bufferData.length / 3 \n : bufferData.length / 2;\n \n const baseColor = parseColorToRGBA(s.style.color);\n const opacity = s.style.opacity ?? 1;\n const color: [number, number, number, number] = [\n baseColor[0], \n baseColor[1], \n baseColor[2], \n baseColor[3] * opacity\n ];\n \n const drawCall: DrawCall = {\n id: s.id,\n kind: s.type,\n bufferId: s.id,\n count: pointCount,\n visible: s.visible,\n yBounds: s.yBounds,\n };\n \n // Set style based on type\n if (s.type === \"scatter\" || s.type === \"line+scatter\" || s.type === \"step+scatter\") {\n drawCall.style = {\n color: color as RGBA,\n opacity,\n pointSize: s.style.pointSize ?? 4,\n symbol: (s.style.symbol ?? \"circle\") as PointStyle[\"symbol\"],\n };\n } else if (s.type === \"heatmap\") {\n drawCall.textureId = `colormap:${s.id}`;\n drawCall.style = {\n zBounds: s.zBounds,\n colormap: s.colormap,\n };\n \n // Upload colormap if available\n const colormapData = this.colormapDataMap.get(s.id);\n if (colormapData) {\n this.backend!.createOrUpdateTexture1D(drawCall.textureId, colormapData, {\n width: colormapData.length / 4,\n });\n }\n } else {\n drawCall.style = {\n color: color as RGBA,\n opacity,\n lineWidth: s.style.lineWidth ?? 1,\n };\n }\n \n // Handle step buffer\n if ((s.type === \"step\" || s.type === \"step+scatter\") && this.stepBufferDataMap.has(s.id)) {\n const stepData = this.stepBufferDataMap.get(s.id)!;\n const stepBufferId = `${s.id}:step`;\n this.backend!.createOrUpdateBuffer(stepBufferId, stepData, { usage: \"vertex\" });\n drawCall.stepBufferId = stepBufferId;\n drawCall.stepCount = stepData.length / 2;\n }\n \n items.push(drawCall);\n }\n \n return { items };\n }\n \n /**\n * Handle canvas resize\n */\n resize(): void {\n if (!this.backend) return;\n \n const rect = this.canvas.getBoundingClientRect();\n this.backend.setViewport({\n width: rect.width,\n height: rect.height,\n dpr: this.dpr,\n });\n }\n \n /**\n * Get renderer limits\n */\n getLimits(): Record<string, unknown> {\n return {\n backend: this.backendType,\n available: this.isInitialized,\n };\n }\n \n /**\n * Destroy the renderer\n */\n destroy(): void {\n this.adapter?.destroy();\n this.backend?.destroy();\n \n this.bufferDataMap.clear();\n this.stepBufferDataMap.clear();\n this.colormapDataMap.clear();\n \n this.adapter = null;\n this.backend = null;\n this.isInitialized = false;\n this.backendType = null;\n }\n}\n\n/**\n * Create a GPU renderer (async)\n */\nexport async function createGpuRenderer(\n canvas: HTMLCanvasElement,\n options?: GpuRendererOptions\n): Promise<GpuRenderer | null> {\n const renderer = new GpuRenderer(canvas, options);\n const success = await renderer.init();\n return success ? renderer : null;\n}\n","/**\n * GPU Benchmark Utilities\n * \n * Provides tools for measuring rendering performance across backends.\n */\n\nexport interface BenchmarkResult {\n backend: \"webgpu\" | \"webgl\" | \"unknown\";\n pointCount: number;\n fps: number;\n avgFrameTime: number; // ms\n minFrameTime: number; // ms\n maxFrameTime: number; // ms\n totalFrames: number;\n duration: number; // ms\n}\n\nexport interface BenchmarkOptions {\n /** Number of points to render */\n pointCount?: number;\n \n /** Duration of benchmark in milliseconds */\n durationMs?: number;\n \n /** Warm-up frames before measuring */\n warmupFrames?: number;\n \n /** Callback for progress updates */\n onProgress?: (progress: number) => void;\n}\n\n/**\n * Benchmark runner for GPU backends\n */\nexport class GpuBenchmark {\n private canvas: HTMLCanvasElement;\n private results: BenchmarkResult[] = [];\n \n constructor(canvas?: HTMLCanvasElement) {\n this.canvas = canvas ?? document.createElement(\"canvas\");\n if (!canvas) {\n this.canvas.width = 800;\n this.canvas.height = 600;\n }\n }\n \n /**\n * Generate random line data\n */\n private generateLineData(pointCount: number): Float32Array {\n const data = new Float32Array(pointCount * 2);\n for (let i = 0; i < pointCount; i++) {\n data[i * 2] = i / (pointCount - 1); // x: 0 to 1\n data[i * 2 + 1] = Math.random(); // y: random\n }\n return data;\n }\n \n /**\n * Measure frame times\n */\n private async measureFrameTimes(\n renderFn: () => void,\n durationMs: number,\n warmupFrames: number = 10,\n onProgress?: (progress: number) => void\n ): Promise<{ frameTimes: number[]; duration: number }> {\n const frameTimes: number[] = [];\n let lastTime = performance.now();\n let warmupCount = 0;\n const startTime = performance.now();\n \n return new Promise((resolve) => {\n const loop = () => {\n const now = performance.now();\n const elapsed = now - startTime;\n \n if (elapsed >= durationMs + (warmupFrames * 16)) {\n resolve({ frameTimes, duration: elapsed - (warmupFrames * 16) });\n return;\n }\n \n renderFn();\n \n if (warmupCount >= warmupFrames) {\n frameTimes.push(now - lastTime);\n \n if (onProgress) {\n const progress = Math.min(1, elapsed / durationMs);\n onProgress(progress);\n }\n } else {\n warmupCount++;\n }\n \n lastTime = now;\n requestAnimationFrame(loop);\n };\n \n requestAnimationFrame(loop);\n });\n }\n \n /**\n * Run benchmark with WebGPU backend\n */\n async benchmarkWebGPU(options: BenchmarkOptions = {}): Promise<BenchmarkResult | null> {\n // Dynamic import to handle environments without WebGPU\n const { WebGPUBackend } = await import(\"../backends/webgpu/WebGPUBackend\");\n \n if (!WebGPUBackend.isSupported()) {\n console.warn(\"[Benchmark] WebGPU not supported\");\n return null;\n }\n \n const pointCount = options.pointCount ?? 100000;\n const durationMs = options.durationMs ?? 5000;\n const warmupFrames = options.warmupFrames ?? 30;\n \n const backend = new WebGPUBackend(this.canvas);\n await backend.init();\n \n backend.setViewport({\n width: this.canvas.width,\n height: this.canvas.height,\n dpr: 1,\n });\n \n const data = this.generateLineData(pointCount);\n backend.createOrUpdateBuffer(\"bench-line\", data, { usage: \"vertex\" });\n \n const drawList = {\n items: [{\n id: \"bench-line\",\n kind: \"line\" as const,\n bufferId: \"bench-line\",\n count: pointCount,\n visible: true,\n style: { color: [0, 0.9, 1, 1] as const },\n }],\n };\n \n const frame = {\n viewport: { width: this.canvas.width, height: this.canvas.height, dpr: 1 },\n clearColor: [0.1, 0.1, 0.15, 1] as const,\n };\n \n const bounds = { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n \n const renderFn = () => {\n (backend as any).renderWithBounds(drawList, frame, bounds);\n };\n \n const { frameTimes, duration } = await this.measureFrameTimes(\n renderFn,\n durationMs,\n warmupFrames,\n options.onProgress\n );\n \n backend.destroy();\n \n const result = this.calculateResult(\"webgpu\", pointCount, frameTimes, duration);\n this.results.push(result);\n return result;\n }\n \n /**\n * Run benchmark with WebGL backend\n */\n async benchmarkWebGL(options: BenchmarkOptions = {}): Promise<BenchmarkResult | null> {\n const { WebGLBackend } = await import(\"../backends/webgl/WebGLBackend\");\n \n if (!WebGLBackend.isSupported()) {\n console.warn(\"[Benchmark] WebGL not supported\");\n return null;\n }\n \n const pointCount = options.pointCount ?? 100000;\n const durationMs = options.durationMs ?? 5000;\n const warmupFrames = options.warmupFrames ?? 30;\n \n const backend = new WebGLBackend(this.canvas);\n await backend.init();\n \n backend.setViewport({\n width: this.canvas.width,\n height: this.canvas.height,\n dpr: 1,\n });\n \n const data = this.generateLineData(pointCount);\n backend.createOrUpdateBuffer(\"bench-line\", data, { usage: \"vertex\" });\n \n const drawList = {\n items: [{\n id: \"bench-line\",\n kind: \"line\" as const,\n bufferId: \"bench-line\",\n count: pointCount,\n visible: true,\n style: { color: [0, 0.9, 1, 1] as const },\n }],\n };\n \n const frame = {\n viewport: { width: this.canvas.width, height: this.canvas.height, dpr: 1 },\n clearColor: [0.1, 0.1, 0.15, 1] as const,\n };\n \n const bounds = { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n \n const renderFn = () => {\n backend.renderWithBounds(drawList, frame, bounds);\n };\n \n const { frameTimes, duration } = await this.measureFrameTimes(\n renderFn,\n durationMs,\n warmupFrames,\n options.onProgress\n );\n \n backend.destroy();\n \n const result = this.calculateResult(\"webgl\", pointCount, frameTimes, duration);\n this.results.push(result);\n return result;\n }\n \n /**\n * Calculate benchmark result from frame times\n */\n private calculateResult(\n backend: \"webgpu\" | \"webgl\",\n pointCount: number,\n frameTimes: number[],\n duration: number\n ): BenchmarkResult {\n if (frameTimes.length === 0) {\n return {\n backend,\n pointCount,\n fps: 0,\n avgFrameTime: 0,\n minFrameTime: 0,\n maxFrameTime: 0,\n totalFrames: 0,\n duration,\n };\n }\n \n const sum = frameTimes.reduce((a, b) => a + b, 0);\n const avg = sum / frameTimes.length;\n const min = Math.min(...frameTimes);\n const max = Math.max(...frameTimes);\n \n return {\n backend,\n pointCount,\n fps: Math.round(1000 / avg),\n avgFrameTime: Math.round(avg * 100) / 100,\n minFrameTime: Math.round(min * 100) / 100,\n maxFrameTime: Math.round(max * 100) / 100,\n totalFrames: frameTimes.length,\n duration: Math.round(duration),\n };\n }\n \n /**\n * Run comparative benchmark\n */\n async runComparison(options: BenchmarkOptions = {}): Promise<{\n webgpu: BenchmarkResult | null;\n webgl: BenchmarkResult | null;\n winner: \"webgpu\" | \"webgl\" | \"tie\" | \"unknown\";\n speedup: number;\n }> {\n const webgpu = await this.benchmarkWebGPU(options);\n const webgl = await this.benchmarkWebGL(options);\n \n let winner: \"webgpu\" | \"webgl\" | \"tie\" | \"unknown\" = \"unknown\";\n let speedup = 1;\n \n if (webgpu && webgl) {\n if (webgpu.fps > webgl.fps * 1.05) {\n winner = \"webgpu\";\n speedup = webgpu.fps / webgl.fps;\n } else if (webgl.fps > webgpu.fps * 1.05) {\n winner = \"webgl\";\n speedup = webgl.fps / webgpu.fps;\n } else {\n winner = \"tie\";\n speedup = 1;\n }\n } else if (webgpu) {\n winner = \"webgpu\";\n } else if (webgl) {\n winner = \"webgl\";\n }\n \n return { webgpu, webgl, winner, speedup: Math.round(speedup * 100) / 100 };\n }\n \n /**\n * Get all results\n */\n getResults(): BenchmarkResult[] {\n return [...this.results];\n }\n \n /**\n * Clear results\n */\n clearResults(): void {\n this.results = [];\n }\n \n /**\n * Format result as string\n */\n static formatResult(result: BenchmarkResult): string {\n return [\n `Backend: ${result.backend.toUpperCase()}`,\n `Points: ${result.pointCount.toLocaleString()}`,\n `FPS: ${result.fps}`,\n `Avg Frame: ${result.avgFrameTime}ms`,\n `Min/Max: ${result.minFrameTime}ms / ${result.maxFrameTime}ms`,\n `Frames: ${result.totalFrames}`,\n `Duration: ${result.duration}ms`,\n ].join(\" | \");\n }\n}\n","/**\n * GPU Compute - Compute shader infrastructure for WebGPU\n * \n * Provides GPU-accelerated data analysis capabilities.\n */\n\n// ============================================\n// Statistics Compute Shader\n// ============================================\n\nexport const STATS_COMPUTE_WGSL = `\nstruct StatsResult {\n min_val: f32,\n max_val: f32,\n sum: f32,\n sum_sq: f32,\n count: u32,\n padding: vec3<u32>,\n}\n\n@group(0) @binding(0) var<storage, read> input_data: array<f32>;\n@group(0) @binding(1) var<storage, read_write> result: StatsResult;\n\nvar<workgroup> local_min: array<f32, 256>;\nvar<workgroup> local_max: array<f32, 256>;\nvar<workgroup> local_sum: array<f32, 256>;\nvar<workgroup> local_sum_sq: array<f32, 256>;\nvar<workgroup> local_count: array<u32, 256>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(global_invocation_id) global_id: vec3<u32>,\n @builtin(local_invocation_id) local_id: vec3<u32>,\n @builtin(workgroup_id) workgroup_id: vec3<u32>\n) {\n let idx = global_id.x;\n let lid = local_id.x;\n let data_len = arrayLength(&input_data);\n \n // Initialize local values\n if (idx < data_len) {\n let val = input_data[idx];\n local_min[lid] = val;\n local_max[lid] = val;\n local_sum[lid] = val;\n local_sum_sq[lid] = val * val;\n local_count[lid] = 1u;\n } else {\n local_min[lid] = 3.402823e+38; // f32 max\n local_max[lid] = -3.402823e+38; // f32 min\n local_sum[lid] = 0.0;\n local_sum_sq[lid] = 0.0;\n local_count[lid] = 0u;\n }\n \n workgroupBarrier();\n \n // Parallel reduction\n for (var stride: u32 = 128u; stride > 0u; stride = stride >> 1u) {\n if (lid < stride) {\n local_min[lid] = min(local_min[lid], local_min[lid + stride]);\n local_max[lid] = max(local_max[lid], local_max[lid + stride]);\n local_sum[lid] = local_sum[lid] + local_sum[lid + stride];\n local_sum_sq[lid] = local_sum_sq[lid] + local_sum_sq[lid + stride];\n local_count[lid] = local_count[lid] + local_count[lid + stride];\n }\n workgroupBarrier();\n }\n \n // First thread writes result (atomic for multi-workgroup)\n if (lid == 0u) {\n // Use atomics for multi-workgroup reduction\n // For now, we assume single workgroup or post-process on CPU\n result.min_val = local_min[0];\n result.max_val = local_max[0];\n result.sum = local_sum[0];\n result.sum_sq = local_sum_sq[0];\n result.count = local_count[0];\n }\n}\n`;\n\n// ============================================\n// Min/Max Compute Shader (for bounds calculation)\n// ============================================\n\nexport const MINMAX_COMPUTE_WGSL = `\nstruct MinMax {\n min_x: f32,\n max_x: f32,\n min_y: f32,\n max_y: f32,\n}\n\n@group(0) @binding(0) var<storage, read> points: array<vec2<f32>>;\n@group(0) @binding(1) var<storage, read_write> result: MinMax;\n\nvar<workgroup> local_min_x: array<f32, 256>;\nvar<workgroup> local_max_x: array<f32, 256>;\nvar<workgroup> local_min_y: array<f32, 256>;\nvar<workgroup> local_max_y: array<f32, 256>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(global_invocation_id) global_id: vec3<u32>,\n @builtin(local_invocation_id) local_id: vec3<u32>\n) {\n let idx = global_id.x;\n let lid = local_id.x;\n let data_len = arrayLength(&points);\n \n if (idx < data_len) {\n let pt = points[idx];\n local_min_x[lid] = pt.x;\n local_max_x[lid] = pt.x;\n local_min_y[lid] = pt.y;\n local_max_y[lid] = pt.y;\n } else {\n local_min_x[lid] = 3.402823e+38;\n local_max_x[lid] = -3.402823e+38;\n local_min_y[lid] = 3.402823e+38;\n local_max_y[lid] = -3.402823e+38;\n }\n \n workgroupBarrier();\n \n for (var stride: u32 = 128u; stride > 0u; stride = stride >> 1u) {\n if (lid < stride) {\n local_min_x[lid] = min(local_min_x[lid], local_min_x[lid + stride]);\n local_max_x[lid] = max(local_max_x[lid], local_max_x[lid + stride]);\n local_min_y[lid] = min(local_min_y[lid], local_min_y[lid + stride]);\n local_max_y[lid] = max(local_max_y[lid], local_max_y[lid + stride]);\n }\n workgroupBarrier();\n }\n \n if (lid == 0u) {\n result.min_x = local_min_x[0];\n result.max_x = local_max_x[0];\n result.min_y = local_min_y[0];\n result.max_y = local_max_y[0];\n }\n}\n`;\n\n// ============================================\n// Downsample Compute Shader (Min-Max per bucket)\n// ============================================\n\nexport const DOWNSAMPLE_COMPUTE_WGSL = `\nstruct Params {\n input_count: u32,\n output_count: u32,\n bucket_size: u32,\n padding: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> input_points: array<vec2<f32>>;\n@group(0) @binding(2) var<storage, read_write> output_points: array<vec2<f32>>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let bucket_idx = global_id.x;\n \n if (bucket_idx >= params.output_count / 2u) {\n return;\n }\n \n let start = bucket_idx * params.bucket_size;\n let end = min(start + params.bucket_size, params.input_count);\n \n if (start >= params.input_count) {\n return;\n }\n \n var min_y = input_points[start].y;\n var max_y = input_points[start].y;\n var min_idx = start;\n var max_idx = start;\n \n for (var i = start; i < end; i = i + 1u) {\n let y = input_points[i].y;\n if (y < min_y) {\n min_y = y;\n min_idx = i;\n }\n if (y > max_y) {\n max_y = y;\n max_idx = i;\n }\n }\n \n // Output min and max points (preserving x,y pairs)\n let out_base = bucket_idx * 2u;\n \n // Ensure min comes before max in x order\n if (min_idx <= max_idx) {\n output_points[out_base] = input_points[min_idx];\n output_points[out_base + 1u] = input_points[max_idx];\n } else {\n output_points[out_base] = input_points[max_idx];\n output_points[out_base + 1u] = input_points[min_idx];\n }\n}\n`;\n\n// ============================================\n// Peak Detection Compute Shader\n// ============================================\n\nexport const PEAK_DETECT_COMPUTE_WGSL = `\nstruct Params {\n data_count: u32,\n threshold: f32,\n min_distance: u32,\n padding: u32,\n}\n\nstruct Peak {\n index: u32,\n value: f32,\n is_peak: u32,\n padding: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read_write> peaks: array<Peak>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let idx = global_id.x;\n \n if (idx >= params.data_count) {\n return;\n }\n \n peaks[idx].index = idx;\n peaks[idx].value = data[idx];\n peaks[idx].is_peak = 0u;\n \n // Skip edges\n if (idx < params.min_distance || idx >= params.data_count - params.min_distance) {\n return;\n }\n \n let val = data[idx];\n \n // Check if above threshold\n if (val < params.threshold) {\n return;\n }\n \n // Check if local maximum\n var is_max = true;\n for (var i = 1u; i <= params.min_distance; i = i + 1u) {\n if (data[idx - i] >= val || data[idx + i] >= val) {\n is_max = false;\n break;\n }\n }\n \n if (is_max) {\n peaks[idx].is_peak = 1u;\n }\n}\n`;\n","/**\n * GPU Compute Engine\n * \n * Provides GPU-accelerated data analysis using WebGPU compute shaders.\n * Includes statistics calculation, bounds computation, downsampling, and peak detection.\n */\n\nimport {\n STATS_COMPUTE_WGSL,\n MINMAX_COMPUTE_WGSL,\n DOWNSAMPLE_COMPUTE_WGSL,\n PEAK_DETECT_COMPUTE_WGSL,\n} from \"./shaders\";\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n std: number;\n count: number;\n}\n\nexport interface DataBounds {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\nexport interface Peak {\n index: number;\n value: number;\n}\n\nexport interface GpuComputeOptions {\n /** WebGPU device (if already available) */\n device?: any;\n}\n\n/**\n * GPU Compute Engine for data analysis\n */\nexport class GpuCompute {\n private device: any = null;\n private statsPipeline: any = null;\n private minmaxPipeline: any = null;\n private downsamplePipeline: any = null;\n private peaksPipeline: any = null;\n \n private isInitialized = false;\n \n constructor(private options: GpuComputeOptions = {}) {}\n \n /**\n * Check if GPU compute is available\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 /**\n * Initialize the compute engine\n */\n async init(): Promise<void> {\n if (this.options.device) {\n this.device = this.options.device;\n } else {\n if (!GpuCompute.isSupported()) {\n throw new Error(\"[GpuCompute] WebGPU not supported\");\n }\n \n const gpu = (globalThis as any).navigator.gpu;\n const adapter = await gpu.requestAdapter({ powerPreference: \"high-performance\" });\n if (!adapter) {\n throw new Error(\"[GpuCompute] Failed to get adapter\");\n }\n \n this.device = await adapter.requestDevice();\n }\n \n // Create pipelines\n await this.createPipelines();\n this.isInitialized = true;\n }\n \n private async createPipelines(): Promise<void> {\n // Stats pipeline\n const statsModule = this.device.createShaderModule({ code: STATS_COMPUTE_WGSL });\n this.statsPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: statsModule, entryPoint: \"main\" },\n });\n \n // MinMax pipeline\n const minmaxModule = this.device.createShaderModule({ code: MINMAX_COMPUTE_WGSL });\n this.minmaxPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: minmaxModule, entryPoint: \"main\" },\n });\n \n // Downsample pipeline\n const downsampleModule = this.device.createShaderModule({ code: DOWNSAMPLE_COMPUTE_WGSL });\n this.downsamplePipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: downsampleModule, entryPoint: \"main\" },\n });\n \n // Peak detection pipeline\n const peaksModule = this.device.createShaderModule({ code: PEAK_DETECT_COMPUTE_WGSL });\n this.peaksPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: peaksModule, entryPoint: \"main\" },\n });\n }\n \n /**\n * Calculate statistics for a 1D array of values\n */\n async calculateStats(data: Float32Array): Promise<DataStats> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create input buffer\n const inputBuffer = this.device.createBuffer({\n size: data.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, data);\n \n // Create result buffer (32 bytes: 5 floats + padding)\n const resultBuffer = this.device.createBuffer({\n size: 32,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Create staging buffer for readback\n const stagingBuffer = this.device.createBuffer({\n size: 32,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Create bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.statsPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: inputBuffer } },\n { binding: 1, resource: { buffer: resultBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.statsPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(data.length / 256);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n // Copy result to staging\n encoder.copyBufferToBuffer(resultBuffer, 0, stagingBuffer, 0, 32);\n \n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultData = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n inputBuffer.destroy();\n resultBuffer.destroy();\n stagingBuffer.destroy();\n \n const [min, max, sum, sumSq, countFloat] = resultData;\n const count = Math.floor(countFloat);\n const mean = count > 0 ? sum / count : 0;\n const variance = count > 1 ? (sumSq - (sum * sum) / count) / (count - 1) : 0;\n const std = Math.sqrt(Math.max(0, variance));\n \n return { min, max, mean, std, count };\n }\n \n /**\n * Calculate bounds for 2D point data\n */\n async calculateBounds(points: Float32Array): Promise<DataBounds> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create input buffer (vec2 array)\n const inputBuffer = this.device.createBuffer({\n size: points.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, points);\n \n // Create result buffer (16 bytes: 4 floats)\n const resultBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.minmaxPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: inputBuffer } },\n { binding: 1, resource: { buffer: resultBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.minmaxPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const pointCount = points.length / 2;\n const workgroups = Math.ceil(pointCount / 256);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(resultBuffer, 0, stagingBuffer, 0, 16);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultData = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n inputBuffer.destroy();\n resultBuffer.destroy();\n stagingBuffer.destroy();\n \n return {\n xMin: resultData[0],\n xMax: resultData[1],\n yMin: resultData[2],\n yMax: resultData[3],\n };\n }\n \n /**\n * Downsample point data using min-max algorithm\n */\n async downsample(\n points: Float32Array,\n targetCount: number\n ): Promise<Float32Array> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const pointCount = points.length / 2;\n if (pointCount <= targetCount) {\n return points; // No downsampling needed\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Calculate bucket size (output is 2 points per bucket: min and max)\n const outputPairs = Math.ceil(targetCount / 2);\n const bucketSize = Math.ceil(pointCount / outputPairs);\n const outputCount = outputPairs * 2;\n \n // Create params buffer\n const paramsData = new Uint32Array([pointCount, outputCount, bucketSize, 0]);\n const paramsBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(paramsBuffer, 0, paramsData);\n \n // Create input buffer\n const inputBuffer = this.device.createBuffer({\n size: points.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, points);\n \n // Create output buffer\n const outputSize = outputCount * 2 * 4; // vec2 * count * sizeof(float)\n const outputBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.downsamplePipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.downsamplePipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(outputPairs / 64);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, outputSize);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const result = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n paramsBuffer.destroy();\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n \n return result;\n }\n \n /**\n * Detect peaks in 1D data\n */\n async detectPeaks(\n data: Float32Array,\n options: { threshold?: number; minDistance?: number } = {}\n ): Promise<Peak[]> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const threshold = options.threshold ?? 0;\n const minDistance = options.minDistance ?? 1;\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create params buffer\n const paramsData = new Float32Array([\n data.length,\n threshold,\n minDistance,\n 0, // padding\n ]);\n const paramsBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(paramsBuffer, 0, new Uint8Array(paramsData.buffer));\n \n // Input buffer\n const inputBuffer = this.device.createBuffer({\n size: data.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, data);\n \n // Output buffer (Peak struct = 16 bytes each)\n const outputSize = data.length * 16;\n const outputBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.peaksPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.peaksPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(data.length / 64);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, outputSize);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultBuffer = new ArrayBuffer(outputSize);\n new Uint8Array(resultBuffer).set(new Uint8Array(stagingBuffer.getMappedRange()));\n stagingBuffer.unmap();\n \n // Parse peaks\n const resultView = new DataView(resultBuffer);\n const peaks: Peak[] = [];\n \n for (let i = 0; i < data.length; i++) {\n const offset = i * 16;\n const isPeak = resultView.getUint32(offset + 8, true);\n \n if (isPeak) {\n peaks.push({\n index: resultView.getUint32(offset, true),\n value: resultView.getFloat32(offset + 4, true),\n });\n }\n }\n \n // Cleanup\n paramsBuffer.destroy();\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n \n return peaks;\n }\n \n /**\n * Cleanup resources\n */\n destroy(): void {\n // Pipelines are managed by device, no explicit cleanup needed\n this.device = null;\n this.statsPipeline = null;\n this.minmaxPipeline = null;\n this.downsamplePipeline = null;\n this.peaksPipeline = null;\n this.isInitialized = false;\n }\n}\n"],"names":["MARGINS","SI_PREFIXES","getBestPrefix","value","absValue","i","prefix","scaled","formatWithPrefix","unit","decimals","formatValue","formatScientific","detectCycles","signal","tolerance","data","cycles","cycleStart","cycleNumber","prevDirection","directionChanges","direction","startValue","currentValue","generateCycleColors","count","colors","hueStep","hue","detectPeaks","x","y","options","minProminence","type","peaks","xData","yData","prev","curr","next","prominence","validateData","invalidCount","firstInvalidIndex","arr","calculateStats","min","max","sum","val","mean","sumSquaredDiff","diff","stdDev","movingAverage","windowSize","result","halfWindow","j","downsampleLTTB","targetPoints","dataLength","sampledX","sampledY","bucketSize","sampledIndex","bucketStart","bucketEnd","nextBucketEnd","avgX","avgY","avgCount","maxArea","maxAreaIndex","area","subtractBaseline","x1","x2","i1","i2","minDist1","minDist2","d1","d2","y1","slope","intercept","solveLinearSystem","A","B","n","matrix","row","maxRow","k","temp","pivot","factor","calculateR2","fitFn","sumY","meanY","ssTot","ssRes","yi","fi","integrate","xMin","xMax","start","end","ia","ib","y2","derivative","dx","cumulativeIntegral","fitData","fitLinear","fitPolynomial","fitExponential","fitLogarithmic","fitPower","opts","sumX","sumXY","sumX2","predict","v","prec","degree","m","coeffs","res","equation","c","xPrime","yPrime","b","a","generateContours","z","xValues","yValues","width","height","minZ","maxZ","levels","calculateLevels","level","segments","v0","v1","v2","v3","processCell","points","seg","step","xScale","yScale","caseIndex","lerp","t","getT","getPoint","edge","addSeg","e1","e2","p1","p2","EventEmitter","__publicField","event","handler","handlers","error","wrappedHandler","_a","BufferStore","gl","id","buffer","currentSize","offsetInBytes","LINE_VERT","LINE_FRAG","POINT_VERT","POINT_FRAG","HEATMAP_VERT","HEATMAP_FRAG","createShader","source","shader","createProgram","vertSource","fragSource","mode","vertShader","fragShader","program","createProgramBundle","parseColor","color","hex","r","g","matches","interleaveData","length","interleaveStepData","stepCount","resultIdx","prevX","prevY","currX","currY","midX","interleaveBandData","idx","xi","calculateUniforms","bounds","dataWidth","dataHeight","scaleX","scaleY","translateX","translateY","renderLine","prog","uniforms","renderBand","alpha","renderPoints","pointSize","symbol","symbolMap","renderHeatmap","zBounds","texture","renderBar","computeSeriesColor","style","renderFrame","canvas","dpr","programs","series","backgroundColor","plotArea","canvasHeight","canvasWidth","pa","s","yMin","yRange","yTrans","seriesUniforms","TextureStore","NativeWebGLRenderer","rect","DEFAULT_AXIS_THEME","DEFAULT_GRID_THEME","DEFAULT_LEGEND_THEME","DEFAULT_CURSOR_THEME","DARK_THEME","MIDNIGHT_THEME","LIGHT_THEME","ELECTROCHEM_THEME","createTheme","base","overrides","getThemeByName","name","DEFAULT_THEME","OverlayRenderer","ctx","theme","grid","xTicks","yTicks","tick","minorXTicks","minorYTicks","label","axis","axisY","position","offset","axisX","tickDir","labelX","titleX","titleY","legend","maxWidth","items","boxWidth","boxHeight","item","itemY","swatchX","centerY","centerX","size","typeStr","hasSymbol","isScatter","isLineScatter","d","cursor","cursorTheme","text","lines","lineHeight","padding","line","tooltipX","tooltipY","isDark","errorStyle","lineWidth","capWidth","showCaps","opacity","yError","errorMinus","errorPlus","yBase","yTop","yBottom","xError","xBase","xRight","xLeft","majorTicks","divisions","minor","absVal","precision","str","mantissa","exponent","superscriptMap","unicodeExp","char","InteractionManager","container","callbacks","getPlotArea","getBounds","getAxesLayout","enabled","mouseX","mouseY","axes","zoomX","zoomY","targetAxisId","hitWidth","hitX","zoomFactor","normalizedX","normalizedY","dataX","dataY","MIN_RANGE","MAX_RANGE","nextXMin","nextXMax","nextYMin","nextYMax","nextXRange","nextYRange","newBounds","deltaX","deltaY","touch","ChartStatistics","parent","title","bg","borderColor","shadow","viewBounds","visibleY","visibleX","stats","DEFAULT_STYLES","AnnotationManager","annotation","resolved","updates","existing","sorted","normalized","xStart","xEnd","yStart","yEnd","labelY","fontSize","fontFamily","fontWeight","metrics","textWidth","textHeight","drawX","drawY","headSize","angle","headStyle","tailAngle","midY","cross","orientation","bgX","DEFAULT_PADDING","TOOLTIP_DARK_THEME","TOOLTIP_LIGHT_THEME","TOOLTIP_GLASS_THEME","TOOLTIP_MIDNIGHT_THEME","TOOLTIP_ELECTROCHEM_THEME","TOOLTIP_THEMES","getTooltipTheme","createTooltipTheme","baseTheme","getTooltipThemeForChartTheme","chartThemeName","DEFAULT_TOOLTIP_THEME","DEFAULT_POSITIONER_CONFIG","TooltipPositioner","config","targetX","targetY","measurement","preferredPosition","autoFlip","showArrow","arrowSize","totalWidth","totalHeight","arrowPosition","wasFlipped","flippedPosition","flipped","constrained","arrowOffset","idealArrowX","idealArrowY","preferred","spaceTop","spaceBottom","spaceLeft","spaceRight","canFitTop","canFitBottom","canFitRight","canFitLeft","margin","constrainedX","constrainedY","cursorX","cursorY","TooltipRenderer","template","_arrowPosition","gradient","topX","bottomX","bottomY","leftY","rightX","rightY","radius","align","baseline","DefaultTooltipTemplate","cacheKey","titleWidth","labelWidth","xValWidth","yValWidth","contentWidth","contentHeight","errorText","cycleText","indicatorWidth","currentX","currentY","indicatorY","separatorWidth","defaultTooltipTemplate","formatCompact","MinimalTooltipTemplate","xValue","yValue","xWidth","sepWidth","minimalTooltipTemplate","CrosshairTooltipTemplate","headerText","labelColumnWidth","nameWidth","valWidth","headerHeight","contentX","itemX","labelOffset","crosshairTooltipTemplate","HeatmapTooltipTemplate","valueText","valueWidth","scaleText","xyLabelWidth","dataXWidth","dataYWidth","swatchY","heatmapTooltipTemplate","toScientificUnicode","exp","superscripts","expStr","superExp","ScientificTooltipTemplate","xVal","yVal","yWidth","footerText","lineCount","extraGap","yText","scientificTooltipTemplate","AnnotationTooltipTemplate","valText","xText","labelW","annotationTooltipTemplate","RangeTooltipTemplate","rangeTooltipTemplate","BUILTIN_TEMPLATES","getBuiltinTemplate","getDefaultTemplateForType","TooltipManager","chartTheme","pixelX","pixelY","total","newResult","currentPoint","currentDx","currentDy","currentDistSq","newDx","newDy","heatmapResult","_b","crosshairData","yScales","cursorDataX","bestResult","bestXDistance","xDistance","px","py","hitRadius","nearestDistanceSq","nearestResult","closestIdx","searchRadius","checkStart","checkEnd","dy","distSq","_c","colIdx","rowIdx","zValue","target","left","right","mid","interpolatedValues","isInterpolated","x0","y0","dp","effectiveDelay","templateId","tooltipId","tooltip","tooltipData","exportToCSV","seriesIds","includeHeaders","delimiter","seriesToExport","headers","maxLength","exportToJSON","exportToImage","webglCanvas","overlayCanvas","showLegend","finalCanvas","applyZoom","hasBars","finalY","scale","oldRange","newRange","offsetPct","sRange","sNewMin","sNewMax","applyPan","axisId","range","moveY","nextMin","nextMax","autoScaleAll","yAxisBounds","_","hasValidData","yBounds","MAX_VAL","MIN_VAL","xRange","xPad","yPad","newMin","newMax","handleBoxZoom","selectionRect","currentRect","zoom","xMinNorm","xMaxNorm","yMaxNorm","yMinNorm","newXMin","newXMax","newYMin","newYMax","prepareSeriesData","seriesData","buf","seriesType","renderType","renderData","stepBuf","stepMode","pointCount","hData","hStyle","w","h","zMin","zMax","colormapId","bullishBuf","bearishBuf","renderOverlay","primaryYScale","leftAxes","rightAxes","index","skipLegacyTooltip","calculateSeriesBounds","heatmapData","yMax","high","low","ensureTypedArray","appendTypedArray","newData","combined","applySmoothing","len","smoothedY","getYError","err","minus","plus","getXError","DEFAULT_STYLE","Series","hOpts","update","newX","newY","shift","oldSmooth","visible","maxPoints","createRenderer","WebGPURenderer","gpu","format","interleaveBarData","barWidth","halfWidth","calculateBarWidth","minSpacing","spacing","interleaveHeatmapData","numCells","v00","v10","v01","v11","getColormap","interleaveCandlestickData","open","close","bullishBody","bearishBody","halfWick","bodyTop","bodyBottom","appendRect","updateSeriesBuffer","stackId","refreshStack","seriesId","updateHeatmapBuffer","bullish","bearish","colormapName","stackSeries","cumulativeY","yBaseline","addSeries","o","removeSeries","updateSeries","appendData","oldMaxX","setMaxPoints","addFitLine","fitResolution","fitX","fitY","fitId","sourceStyle","LinearScale","d0","r0","r1","pixel","niceStep","ticks","maxTicks","LogScale","safeMin","safeMax","logMin","logMax","logVal","p","rawStep","magnitude","niceNormalized","createScale","initializeChart","bgColor","showControls","autoScroll","showStatistics","xAxisOptions","yAxisOptionsMap","primaryYAxisId","axisOpt","isFirst","defaultId","fullOptions","createCanvas","leftAxisCount","rightAxisCount","leftMargin","rightMargin","leftIndex","rightIndex","resizeCanvases","overlayCtx","pixelToDataX","pixelToDataY","PluginManagerImpl","chart","plugin","hook","args","e","ICONS","ChartControls","sep","types","nextIdx","sep2","sep3","btn","icon","svgEl","svg","onClick","buttons","activeColor","smoothActiveColor","legendActiveColor","normalColor","isHover","ChartLegend","rafId","onMouseDown","onMouseMove","onMouseUp","updatePosition","clientX","clientY","tx","ty","parentRect","finalX","swatch","isArea","bullColor","itemGap","swatchSize","initControls","currentType","mappedType","active","link","initLegend","ChartImpl","analysis","setup","setupChart","isSupported","createControls","createLegend","calculatePlotArea","addSeriesImpl","removeSeriesImpl","updateSeriesImpl","appendDataImpl","setMaxPointsImpl","addFitLineImpl","isFinishing","full","pxToDataX","pxToDataY","loop","createChart","lttbDownsample","outX","outY","outIndices","outIdx","nextBucketStart","maxIndex","aX","aY","minMaxDownsample","bucketCount","minY","maxY","minIdx","maxIdx","calculateTargetPoints","pointsPerPixel","defaultParser","point","createMessageParser","transform","connectStreamToChart","stream","unsubscribers","unsubscribe","createWebSocketStream","url","maxReconnectAttempts","reconnectDelay","bufferSize","throttleMs","parseMessage","onConnect","onDisconnect","onError","onReconnect","ws","state","reconnectAttempts","reconnectTimeout","connectionStartTime","buffers","subscribers","lastFlushTime","flushScheduled","connect","handleMessage","scheduleReconnect","disconnect","parsed","pointArray","scheduleFlush","timeSinceLastFlush","flush","callback","message","createMockStream","interval","generatePoint","defaultGenerator","intervalId","connected","startTime","stop","mockX","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","maybeKey","key","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","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","keys","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","useSciChart","containerRef","setChart","useState","isReady","setIsReady","setError","setBounds","optionsRef","useRef","useEffect","chartInstance","useCallback","seriesOptions","zoomOptions","resetZoom","SciChart","forwardRef","zoomProp","onZoomChange","className","debug","chartOptions","ref","previousSeriesRef","useImperativeHandle","currentSeriesMap","previousSeriesMap","prevSeries","containerStyle","useMemo","jsx","jsxs","BaseBufferStore","BaseTextureStore","keyToString","PipelineCache","factory","keyStr","pipeline","parseColorToRGBA","colorStr","rgbaMatch","mapSeriesTypeToDrawKind","convertStyle","baseColor","SeriesAdapter","backend","bufferId","stepBufferId","textureId","seriesArray","drawCall","TRIANGLE_SHADER_WGSL","createTrianglePipeline","device","module","vertexStride","LINE_SHADER_WGSL","LINE_VERTEX_STRIDE","UNIFORM_BUFFER_SIZE","createLinePipeline","GPUShaderStageAny","GPUBufferUsageAny","bindGroupLayout","uniformBuffer","bindGroup","pipelineLayout","updateLineUniforms","POINT_QUAD_SHADER_WGSL","POINT_VERTEX_STRIDE","QUAD_VERTICES","createPointPipeline","quadBuffer","updatePointUniforms","SYMBOL_MAP","createBandPipeline","updateBandUniforms","HEATMAP_SHADER_WGSL","HEATMAP_VERTEX_STRIDE","createHeatmapPipeline","sampler","createHeatmapBindGroup","layout","colormapTexture","updateHeatmapUniforms","getColorFromStyle","WebGPUBackend","viewport","desc","usage","usageFlags","byteLength","GPUTextureUsageAny","tex","drawList","frame","encoder","view","pass","defaultBounds","itemBounds","bandColor","LINE_VERT_GLSL","LINE_FRAG_GLSL","POINT_VERT_GLSL","POINT_FRAG_GLSL","HEATMAP_VERT_GLSL","HEATMAP_FRAG_GLSL","compileShader","info","linkProgram","attributeNames","uniformNames","attributes","createAllPrograms","heatmap","destroyPrograms","bundle","WebGLBackend","stepBuffer","GpuRenderer","preference","offsetFloats","bufferData","colormapData","stepData","createGpuRenderer","renderer","GpuBenchmark","renderFn","durationMs","warmupFrames","onProgress","frameTimes","lastTime","warmupCount","resolve","now","elapsed","progress","WebGPUBackend$1","duration","WebGLBackend$1","avg","webgpu","webgl","winner","speedup","STATS_COMPUTE_WGSL","MINMAX_COMPUTE_WGSL","DOWNSAMPLE_COMPUTE_WGSL","PEAK_DETECT_COMPUTE_WGSL","GpuCompute","adapter","statsModule","minmaxModule","downsampleModule","peaksModule","GPUBufferUsage","inputBuffer","resultBuffer","stagingBuffer","workgroups","resultData","sumSq","countFloat","variance","std","targetCount","outputPairs","outputCount","paramsData","paramsBuffer","outputSize","outputBuffer","threshold","minDistance","resultView"],"mappings":"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","x_google_ignoreList":[57,58,59]}
|
|
1
|
+
{"version":3,"file":"scichart-engine.umd.js","sources":["../src/core/chart/types.ts","../src/analysis/utils.ts","../src/analysis/math.ts","../src/analysis/fitting.ts","../src/analysis/contours.ts","../src/core/EventEmitter.ts","../src/renderer/native/bufferStore.ts","../src/renderer/native/shaderSources.ts","../src/renderer/native/programFactory.ts","../src/renderer/native/utils.ts","../src/renderer/native/draw.ts","../src/renderer/native/renderFrame.ts","../src/renderer/native/textureStore.ts","../src/renderer/native/NativeWebGLRenderer.ts","../src/theme/index.ts","../src/core/OverlayRenderer.ts","../src/core/InteractionManager.ts","../src/core/ChartStatistics.ts","../src/core/annotations/AnnotationManager.ts","../src/core/tooltip/themes.ts","../src/core/tooltip/TooltipPositioner.ts","../src/core/tooltip/TooltipRenderer.ts","../src/core/tooltip/templates/DefaultTemplate.ts","../src/core/tooltip/templates/MinimalTemplate.ts","../src/core/tooltip/templates/CrosshairTemplate.ts","../src/core/tooltip/templates/HeatmapTemplate.ts","../src/core/tooltip/templates/ScientificTemplate.ts","../src/core/tooltip/templates/AnnotationTemplate.ts","../src/core/tooltip/templates/RangeTemplate.ts","../src/core/tooltip/templates/index.ts","../src/core/tooltip/TooltipManager.ts","../src/core/chart/ChartExporter.ts","../src/core/chart/ChartNavigation.ts","../src/core/chart/ChartScaling.ts","../src/core/chart/ChartRenderer.ts","../src/core/series/SeriesBounds.ts","../src/core/series/SeriesDataUtils.ts","../src/core/series/Series.ts","../src/renderer/RendererInterface.ts","../src/renderer/WebGPURenderer.ts","../src/renderer/BarRenderer.ts","../src/renderer/HeatmapRenderer.ts","../src/renderer/CandlestickRenderer.ts","../src/core/chart/series/SeriesBuffer.ts","../src/core/chart/series/SeriesActions.ts","../src/core/chart/series/SeriesFit.ts","../src/scales/index.ts","../src/core/chart/ChartSetup.ts","../src/core/chart/plugins/PluginManager.ts","../src/core/ChartControls.ts","../src/core/ChartLegend.ts","../src/core/chart/ChartUI.ts","../src/core/chart/ChartCore.ts","../src/workers/downsample.ts","../src/streaming/utils.ts","../src/streaming/websocket.ts","../src/streaming/mock.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/useSciChart.ts","../src/react/SciChart.tsx","../src/gpu/resources/bufferStore.ts","../src/gpu/resources/textureStore.ts","../src/gpu/resources/pipelineCache.ts","../src/gpu/adapter/seriesAdapter.ts","../src/gpu/backends/webgpu/pipelines/triangleShader.ts","../src/gpu/backends/webgpu/pipelines/trianglePipeline.ts","../src/gpu/backends/webgpu/shaders/line.wgsl.ts","../src/gpu/backends/webgpu/pipelines/linePipeline.ts","../src/gpu/backends/webgpu/shaders/point.wgsl.ts","../src/gpu/backends/webgpu/pipelines/pointPipeline.ts","../src/gpu/backends/webgpu/pipelines/bandPipeline.ts","../src/gpu/backends/webgpu/shaders/heatmap.wgsl.ts","../src/gpu/backends/webgpu/pipelines/heatmapPipeline.ts","../src/gpu/backends/webgpu/WebGPUBackend.ts","../src/gpu/backends/webgl/shaders.ts","../src/gpu/backends/webgl/programFactory.ts","../src/gpu/backends/webgl/WebGLBackend.ts","../src/gpu/adapter/gpuRenderer.ts","../src/gpu/benchmark/benchmark.ts","../src/gpu/compute/shaders.ts","../src/gpu/compute/gpuCompute.ts"],"sourcesContent":["/**\n * Chart Type Definitions\n *\n * Interfaces for the Chart API and export options.\n */\n\nimport type {\n SeriesOptions,\n HeatmapOptions,\n SeriesUpdateData,\n ZoomOptions,\n CursorOptions,\n ChartEventMap,\n Bounds,\n} from \"../../types\";\nimport type { Series } from \"../Series\";\nimport type { FitType, FitOptions } from \"../../analysis\";\nimport type { Annotation } from \"../annotations\";\nimport * as analysis from \"../../analysis\";\n\n// ============================================\n// Chart Interface\n// ============================================\n\nexport interface Chart {\n addSeries(options: SeriesOptions | HeatmapOptions): void;\n addBar(options: Omit<SeriesOptions, \"type\">): void;\n addHeatmap(options: Omit<HeatmapOptions, \"type\">): void;\n removeSeries(id: string): void;\n updateSeries(id: string, data: SeriesUpdateData): void;\n getSeries(id: string): Series | undefined;\n getAllSeries(): Series[];\n appendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void;\n setAutoScroll(enabled: boolean): void;\n setMaxPoints(id: string, maxPoints: number): void;\n addFitLine(seriesId: string, type: FitType, options?: FitOptions): string;\n zoom(options: ZoomOptions): void;\n pan(deltaX: number, deltaY: number): void;\n resetZoom(): void;\n getViewBounds(): Bounds;\n enableCursor(options: CursorOptions): void;\n disableCursor(): void;\n resize(width?: number, height?: number): void;\n render(): void;\n on<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): void;\n off<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): void;\n destroy(): void;\n exportImage(type?: \"png\" | \"jpeg\"): string;\n autoScale(): void;\n setTheme(theme: string | object): void;\n /** Access to data analysis utilities */\n readonly analysis: typeof analysis;\n // Annotation methods\n addAnnotation(annotation: Annotation): string;\n removeAnnotation(id: string): boolean;\n updateAnnotation(id: string, updates: Partial<Annotation>): void;\n getAnnotation(id: string): Annotation | undefined;\n getAnnotations(): Annotation[];\n clearAnnotations(): void;\n // Export methods\n exportCSV(options?: ExportOptions): string;\n exportJSON(options?: ExportOptions): string;\n /** Attach a plugin to extend chart functionality */\n use(plugin: ChartPlugin): void;\n /** Access to the tooltip system */\n readonly tooltip: import(\"../tooltip\").TooltipManager;\n}\n\nexport interface ChartPlugin {\n name: string;\n init?: (chart: Chart) => void;\n onBeforeRender?: (chart: Chart) => void;\n onAfterRender?: (chart: Chart) => void;\n onSeriesAdded?: (series: Series) => void;\n destroy?: () => void;\n}\n\n/** Options for data export */\nexport interface ExportOptions {\n /** Series IDs to export (default: all) */\n seriesIds?: string[];\n /** Include headers in CSV (default: true) */\n includeHeaders?: boolean;\n /** Decimal precision (default: 6) */\n precision?: number;\n /** CSV delimiter (default: ',') */\n delimiter?: string;\n}\n\n// ============================================\n// Layout Constants\n// ============================================\n\nexport const MARGINS = { top: 20, right: 30, bottom: 55, left: 75 };\n","/**\n * Data Analysis Utilities\n *\n * General-purpose utilities for scientific data formatting,\n * cycle detection, peak detection, and data validation.\n */\n\n// ============================================\n// Unit Prefixes\n// ============================================\n\ntype SIPrefix = 'p' | 'n' | 'µ' | 'm' | '' | 'k' | 'M' | 'G';\n\nexport interface PrefixInfo {\n symbol: SIPrefix;\n factor: number;\n}\n\nconst SI_PREFIXES: PrefixInfo[] = [\n { symbol: 'p', factor: 1e-12 },\n { symbol: 'n', factor: 1e-9 },\n { symbol: 'µ', factor: 1e-6 },\n { symbol: 'm', factor: 1e-3 },\n { symbol: '', factor: 1 },\n { symbol: 'k', factor: 1e3 },\n { symbol: 'M', factor: 1e6 },\n { symbol: 'G', factor: 1e9 },\n];\n\n/**\n * Find the best SI prefix for a value\n */\nexport function getBestPrefix(value: number): PrefixInfo {\n const absValue = Math.abs(value);\n\n if (absValue === 0) {\n return { symbol: '', factor: 1 };\n }\n\n // Find prefix where value becomes 1-999\n for (let i = SI_PREFIXES.length - 1; i >= 0; i--) {\n const prefix = SI_PREFIXES[i];\n const scaled = absValue / prefix.factor;\n if (scaled >= 1 && scaled < 1000) {\n return prefix;\n }\n }\n\n // Default to base unit\n return { symbol: '', factor: 1 };\n}\n\n/**\n * Format a value with automatic SI prefix\n *\n * @example\n * formatWithPrefix(0.000001, 'A') // \"1.00 µA\"\n * formatWithPrefix(0.5, 'V') // \"500 mV\"\n * formatWithPrefix(1500, 'm') // \"1.50 km\"\n */\nexport function formatWithPrefix(\n value: number,\n unit: string,\n decimals = 2\n): string {\n const prefix = getBestPrefix(value);\n const scaled = value / prefix.factor;\n return `${scaled.toFixed(decimals)} ${prefix.symbol}${unit}`;\n}\n\n/**\n * Format a numeric value with specified decimals\n * Automatically switches to scientific notation for very large/small values\n */\nexport function formatValue(value: number, decimals = 3): string {\n if (Math.abs(value) < 0.001 || Math.abs(value) >= 1e6) {\n return value.toExponential(decimals);\n }\n return value.toFixed(decimals);\n}\n\n/**\n * Format value in scientific notation\n */\nexport function formatScientific(value: number, decimals = 2): string {\n return value.toExponential(decimals);\n}\n\n// ============================================\n// Cycle Detection\n// ============================================\n\nexport interface CycleInfo {\n /** Cycle number (1-indexed) */\n number: number;\n /** Start index in data array */\n startIndex: number;\n /** End index in data array */\n endIndex: number;\n /** Direction at start: 1 = forward, -1 = reverse */\n direction: 1 | -1;\n}\n\n/**\n * Detect cycles in oscillating data\n *\n * A cycle is complete when the signal returns to its starting value\n * after going through both sweep directions. Useful for:\n * - Cyclic voltammetry data\n * - Periodic signals\n * - Oscillation analysis\n *\n * @param signal - The signal data (e.g., potential, position, etc.)\n * @param tolerance - How close to starting value to consider a cycle complete\n */\nexport function detectCycles(\n signal: Float32Array | Float64Array | number[],\n tolerance = 0.001\n): CycleInfo[] {\n const data = signal instanceof Array ? new Float32Array(signal) : signal;\n \n if (data.length < 3) return [];\n\n const cycles: CycleInfo[] = [];\n let cycleStart = 0;\n let cycleNumber = 1;\n\n // Determine initial direction\n let prevDirection = Math.sign(data[1] - data[0]);\n let directionChanges = 0;\n\n for (let i = 2; i < data.length; i++) {\n const direction = Math.sign(data[i] - data[i - 1]);\n\n // Skip if no movement\n if (direction === 0) continue;\n\n // Direction change detected\n if (direction !== prevDirection) {\n directionChanges++;\n\n // After 2 direction changes, check if we're back at start\n if (directionChanges >= 2) {\n const startValue = data[cycleStart];\n const currentValue = data[i];\n\n if (Math.abs(currentValue - startValue) < tolerance) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: i,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n\n cycleNumber++;\n cycleStart = i;\n directionChanges = 0;\n }\n }\n\n prevDirection = direction;\n }\n }\n\n // Handle last incomplete cycle\n if (cycleStart < data.length - 1) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: data.length - 1,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n }\n\n return cycles;\n}\n\n/**\n * Generate distinct colors for cycles/series\n *\n * Uses HSL color space to generate evenly distributed hues\n */\nexport function generateCycleColors(count: number): string[] {\n const colors: string[] = [];\n const hueStep = 360 / Math.max(count, 1);\n\n for (let i = 0; i < count; i++) {\n const hue = (i * hueStep) % 360;\n colors.push(`hsl(${hue}, 70%, 55%)`);\n }\n\n return colors;\n}\n\n// ============================================\n// Peak Detection\n// ============================================\n\nexport interface Peak {\n /** Index in data array */\n index: number;\n /** X value at peak */\n x: number;\n /** Y value at peak */\n y: number;\n /** Peak type */\n type: 'max' | 'min';\n /** Prominence of the peak */\n prominence: number;\n}\n\n/**\n * Detect peaks (local maxima and minima) in data\n *\n * Uses simple local extrema detection with optional prominence filtering.\n * Useful for:\n * - Signal peak detection\n * - Finding local maxima/minima\n * - Feature extraction\n *\n * @param x - X values (independent variable)\n * @param y - Y values (dependent variable)\n * @param options - Detection options\n */\nexport function detectPeaks(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n options: {\n /** Minimum prominence to be considered a peak */\n minProminence?: number;\n /** Only return 'max' or 'min' peaks */\n type?: 'max' | 'min' | 'both';\n } = {}\n): Peak[] {\n const { minProminence = 0, type = 'both' } = options;\n const peaks: Peak[] = [];\n\n const xData = x instanceof Array ? new Float32Array(x) : x;\n const yData = y instanceof Array ? new Float32Array(y) : y;\n\n for (let i = 1; i < yData.length - 1; i++) {\n const prev = yData[i - 1];\n const curr = yData[i];\n const next = yData[i + 1];\n\n // Local maximum\n if (curr > prev && curr > next) {\n const prominence = Math.min(curr - prev, curr - next);\n if (prominence >= minProminence && (type === 'both' || type === 'max')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'max', prominence });\n }\n }\n\n // Local minimum\n if (curr < prev && curr < next) {\n const prominence = Math.min(prev - curr, next - curr);\n if (prominence >= minProminence && (type === 'both' || type === 'min')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'min', prominence });\n }\n }\n }\n\n return peaks;\n}\n\n// ============================================\n// Data Validation\n// ============================================\n\nexport interface ValidationResult {\n /** Whether all data is valid */\n valid: boolean;\n /** Number of invalid values (NaN, Infinity, etc.) */\n invalidCount: number;\n /** Index of first invalid value (-1 if all valid) */\n firstInvalidIndex: number;\n}\n\n/**\n * Validate that data contains only finite numbers\n *\n * Checks for NaN, Infinity, and -Infinity values.\n * Useful for data quality checks before rendering.\n */\nexport function validateData(\n data: Float32Array | Float64Array | number[]\n): ValidationResult {\n let invalidCount = 0;\n let firstInvalidIndex = -1;\n\n const arr = data instanceof Array ? data : Array.from(data);\n\n for (let i = 0; i < arr.length; i++) {\n if (!isFinite(arr[i])) {\n invalidCount++;\n if (firstInvalidIndex === -1) {\n firstInvalidIndex = i;\n }\n }\n }\n\n return {\n valid: invalidCount === 0,\n invalidCount,\n firstInvalidIndex,\n };\n}\n\n// ============================================\n// Data Statistics\n// ============================================\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n stdDev: number;\n count: number;\n}\n\n/**\n * Calculate basic statistics for a dataset\n */\nexport function calculateStats(\n data: Float32Array | Float64Array | number[]\n): DataStats {\n const arr = data instanceof Array ? data : Array.from(data);\n const count = arr.length;\n\n if (count === 0) {\n return { min: 0, max: 0, mean: 0, stdDev: 0, count: 0 };\n }\n\n let min = arr[0];\n let max = arr[0];\n let sum = 0;\n\n for (let i = 0; i < count; i++) {\n const val = arr[i];\n if (val < min) min = val;\n if (val > max) max = val;\n sum += val;\n }\n\n const mean = sum / count;\n\n // Calculate standard deviation\n let sumSquaredDiff = 0;\n for (let i = 0; i < count; i++) {\n const diff = arr[i] - mean;\n sumSquaredDiff += diff * diff;\n }\n const stdDev = Math.sqrt(sumSquaredDiff / count);\n\n return { min, max, mean, stdDev, count };\n}\n\n// ============================================\n// Data Smoothing\n// ============================================\n\n/**\n * Apply moving average smoothing to data\n *\n * @param data - Input data array\n * @param windowSize - Number of points to average (must be odd)\n */\nexport function movingAverage(\n data: Float32Array | Float64Array | number[],\n windowSize: number\n): Float32Array {\n const arr = data instanceof Array ? new Float32Array(data) : data;\n const result = new Float32Array(arr.length);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < arr.length; i++) {\n let sum = 0;\n let count = 0;\n\n for (let j = Math.max(0, i - halfWindow); j <= Math.min(arr.length - 1, i + halfWindow); j++) {\n sum += arr[j];\n count++;\n }\n\n result[i] = sum / count;\n }\n\n return result;\n}\n\n/**\n * Downsample data using LTTB (Largest Triangle Three Buckets) algorithm\n *\n * Preserves visual characteristics while reducing point count.\n * Ideal for rendering large datasets efficiently.\n *\n * @param x - X values\n * @param y - Y values\n * @param targetPoints - Desired number of output points\n */\nexport function downsampleLTTB(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): { x: Float32Array; y: Float32Array } {\n const dataLength = x.length;\n\n if (targetPoints >= dataLength || targetPoints < 3) {\n return { x: new Float32Array(x), y: new Float32Array(y) };\n }\n\n const sampledX = new Float32Array(targetPoints);\n const sampledY = new Float32Array(targetPoints);\n\n // Always include first point\n sampledX[0] = x[0];\n sampledY[0] = y[0];\n\n const bucketSize = (dataLength - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let sampledIndex = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket range\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n const nextBucketEnd = Math.min(Math.floor((i + 3) * bucketSize) + 1, dataLength);\n\n // Calculate average of next bucket for comparison\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = bucketEnd; 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 maxAreaIndex = bucketStart;\n\n for (let j = bucketStart; j < bucketEnd && j < dataLength; j++) {\n // Triangle area calculation\n const area = Math.abs(\n (x[a] - avgX) * (y[j] - y[a]) - (x[a] - x[j]) * (avgY - y[a])\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxAreaIndex = j;\n }\n }\n\n sampledX[sampledIndex] = x[maxAreaIndex];\n sampledY[sampledIndex] = y[maxAreaIndex];\n sampledIndex++;\n a = maxAreaIndex;\n }\n\n // Always include last point\n sampledX[targetPoints - 1] = x[dataLength - 1];\n sampledY[targetPoints - 1] = y[dataLength - 1];\n\n return { x: sampledX, y: sampledY };\n}\n\n/**\n * Subtract a linear baseline from data\n * \n * @param x - X data\n * @param y - Y data\n * @param x1 - Start of baseline segment\n * @param x2 - End of baseline segment\n */\nexport function subtractBaseline(\n x: Float32Array | number[],\n y: Float32Array | number[],\n x1: number,\n x2: number\n): Float32Array {\n const n = x.length;\n const result = new Float32Array(n);\n\n // Find points near x1 and x2 to determine baseline\n let i1 = 0, i2 = n - 1;\n let minDist1 = Infinity, minDist2 = Infinity;\n\n for (let i = 0; i < n; i++) {\n const d1 = Math.abs(x[i] - x1);\n const d2 = Math.abs(x[i] - x2);\n if (d1 < minDist1) { minDist1 = d1; i1 = i; }\n if (d2 < minDist2) { minDist2 = d2; i2 = i; }\n }\n\n const y1 = y[i1];\n const y2 = y[i2];\n const slope = (y2 - y1) / (x[i2] - x[i1]);\n const intercept = y1 - slope * x[i1];\n\n for (let i = 0; i < n; i++) {\n result[i] = y[i] - (slope * x[i] + intercept);\n }\n\n return result;\n}\n","/**\n * Mathematical utilities for numerical analysis and regression.\n */\n\n/**\n * Solve a system of linear equations Ax = B using Gaussian elimination with partial pivoting.\n * \n * @param A - Matrix coefficients\n * @param B - Right hand side vector\n * @returns Solution vector x\n */\nexport function solveLinearSystem(A: number[][], B: number[]): number[] {\n const n = B.length;\n const matrix = A.map((row, i) => [...row, B[i]]);\n\n for (let i = 0; i < n; i++) {\n // Partial pivoting\n let maxRow = i;\n for (let k = i + 1; k < n; k++) {\n if (Math.abs(matrix[k][i]) > Math.abs(matrix[maxRow][i])) {\n maxRow = k;\n }\n }\n\n // Swap rows\n const temp = matrix[i];\n matrix[i] = matrix[maxRow];\n matrix[maxRow] = temp;\n\n // Pivot must be non-zero\n const pivot = matrix[i][i];\n if (Math.abs(pivot) < 1e-12) {\n throw new Error(\"Matrix is singular or near-singular\");\n }\n\n // Eliminate below\n for (let k = i + 1; k < n; k++) {\n const factor = matrix[k][i] / pivot;\n for (let j = i; j <= n; j++) {\n matrix[k][j] -= factor * matrix[i][j];\n }\n }\n }\n\n // Back substitution\n const x = new Array(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let sum = 0;\n for (let j = i + 1; j < n; j++) {\n sum += matrix[i][j] * x[j];\n }\n x[i] = (matrix[i][n] - sum) / matrix[i][i];\n }\n\n return x;\n}\n\n/**\n * Calculate R² (coefficient of determination)\n */\nexport function calculateR2(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n fitFn: (x: number) => number\n): number {\n const n = x.length;\n if (n === 0) return 0;\n\n let sumY = 0;\n for (let i = 0; i < n; i++) sumY += y[i];\n const meanY = sumY / n;\n\n let ssTot = 0; // Total sum of squares\n let ssRes = 0; // Residual sum of squares\n\n for (let i = 0; i < n; i++) {\n const yi = y[i];\n const fi = fitFn(x[i]);\n ssTot += (yi - meanY) * (yi - meanY);\n ssRes += (yi - fi) * (yi - fi);\n }\n\n return ssTot === 0 ? 1 : 1 - ssRes / ssTot;\n}\n\n/**\n * Numerical integration using the trapezoidal rule.\n * \n * @param x - X values (must be sorted)\n * @param y - Y values\n * @param xMin - Optional start of integration range\n * @param xMax - Optional end of integration range\n */\nexport function integrate(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n xMin?: number,\n xMax?: number\n): number {\n const n = x.length;\n if (n < 2) return 0;\n\n let area = 0;\n const start = xMin !== undefined ? xMin : x[0];\n const end = xMax !== undefined ? xMax : x[n - 1];\n\n for (let i = 0; i < n - 1; i++) {\n const x1 = x[i];\n const x2 = x[i + 1];\n \n // Skip if outside range\n if (x2 < start) continue;\n if (x1 > end) break;\n\n // Handle partial intervals at boundaries\n const ia = Math.max(x1, start);\n const ib = Math.min(x2, end);\n\n if (ia < ib) {\n // Linear interpolation for y values at boundaries if needed\n const y1 = y[i] + (y[i + 1] - y[i]) * ((ia - x1) / (x2 - x1));\n const y2 = y[i] + (y[i + 1] - y[i]) * ((ib - x1) / (x2 - x1));\n \n area += (ib - ia) * (y1 + y2) / 2;\n }\n }\n\n return area;\n}\n\n/**\n * Calculate numerical derivative dy/dx\n */\nexport function derivative(\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): Float32Array {\n const n = x.length;\n if (n < 2) return new Float32Array(0);\n\n const result = new Float32Array(n);\n for (let i = 0; i < n - 1; i++) {\n const dx = x[i + 1] - x[i];\n result[i] = dx !== 0 ? (y[i + 1] - y[i]) / dx : 0;\n }\n // Last point same as previous for length matching\n result[n - 1] = result[n - 2];\n return result;\n}\n\n/**\n * Calculate cumulative integral (area array)\n */\nexport function cumulativeIntegral(\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): Float32Array {\n const n = x.length;\n if (n < 1) return new Float32Array(0);\n\n const result = new Float32Array(n);\n result[0] = 0;\n \n for (let i = 0; i < n - 1; i++) {\n const dx = x[i + 1] - x[i];\n const area = dx * (y[i] + y[i + 1]) / 2;\n result[i + 1] = result[i] + area;\n }\n \n return result;\n}\n","/**\n * Curve Fitting and Regression Analysis\n */\nimport { solveLinearSystem, calculateR2 } from './math';\n\nexport type FitType = 'linear' | 'polynomial' | 'exponential' | 'logarithmic' | 'power';\n\nexport interface FitOptions {\n /** Degree for polynomial fit (default: 2) */\n degree?: number;\n /** Custom label for the equation */\n label?: string;\n /** Number of decimals in equation string */\n precision?: number;\n}\n\nexport interface FitResult {\n type: FitType;\n /** Coefficients (a, b, c...) */\n coefficients: number[];\n /** Formatted equation string */\n equation: string;\n /** Coefficient of determination */\n rSquared: number;\n /** Function to calculate value at X */\n predict: (x: number) => number;\n}\n\n/**\n * Perform regression on a dataset\n */\nexport function fitData(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n type: FitType,\n options: FitOptions = {}\n): FitResult {\n const n = x.length;\n if (n < 2) throw new Error(\"At least 2 points are required for fitting\");\n\n switch (type) {\n case 'linear':\n return fitLinear(x, y, options);\n case 'polynomial':\n return fitPolynomial(x, y, options.degree ?? 2, options);\n case 'exponential':\n return fitExponential(x, y, options);\n case 'logarithmic':\n return fitLogarithmic(x, y, options);\n case 'power':\n return fitPower(x, y, options);\n default:\n throw new Error(`Unsupported fit type: ${type}`);\n }\n}\n\nfunction fitLinear(x: any, y: any, opts: FitOptions): FitResult {\n const n = x.length;\n let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 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 sumX2 += x[i] * x[i];\n }\n\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n const predict = (v: number) => slope * v + intercept;\n const prec = opts.precision ?? 4;\n \n return {\n type: 'linear',\n coefficients: [slope, intercept],\n equation: `y = ${slope.toFixed(prec)}x ${intercept >= 0 ? '+' : '-'} ${Math.abs(intercept).toFixed(prec)}`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPolynomial(x: any, y: any, degree: number, opts: FitOptions): FitResult {\n const n = x.length;\n const m = degree + 1;\n const A: number[][] = Array.from({ length: m }, () => new Array(m).fill(0));\n const B: number[] = new Array(m).fill(0);\n\n // Normal equations for least squares polynomial fit\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < m; j++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += Math.pow(x[k], i + j);\n }\n A[i][j] = sum;\n }\n\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += y[k] * Math.pow(x[k], i);\n }\n B[i] = sum;\n }\n\n const coeffs = solveLinearSystem(A, B); // c0, c1, c2...\n\n const predict = (v: number) => {\n let res = 0;\n for (let i = 0; i < coeffs.length; i++) {\n res += coeffs[i] * Math.pow(v, i);\n }\n return res;\n };\n\n const prec = opts.precision ?? 4;\n let equation = \"y = \";\n for (let i = coeffs.length - 1; i >= 0; i--) {\n const c = coeffs[i];\n if (i < coeffs.length - 1) equation += c >= 0 ? \" + \" : \" - \";\n else if (c < 0) equation += \"-\";\n \n equation += `${Math.abs(c).toFixed(prec)}${i > 0 ? (i > 1 ? `x^${i}` : 'x') : ''}`;\n }\n\n return {\n type: 'polynomial',\n coefficients: coeffs,\n equation,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitExponential(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * e^(bx) => ln(y) = ln(a) + bx\n // Use linear fit on (x, ln(y))\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (y[i] > 0) {\n xPrime.push(x[i]);\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.exp(b * v);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'exponential',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} * e^(${b.toFixed(prec)}x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitLogarithmic(x: any, y: any, opts: FitOptions): FitResult {\n // y = a + b * ln(x)\n // Use linear fit on (ln(x), y)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(y[i]);\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = result.coefficients[1];\n\n const predict = (v: number) => a + b * Math.log(v);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'logarithmic',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} ${b >= 0 ? '+' : '-'} ${Math.abs(b).toFixed(prec)} * ln(x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPower(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * x^b => ln(y) = ln(a) + b * ln(x)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0 && y[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.pow(v, b);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'power',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} * x^(${b.toFixed(prec)})`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n","/**\n * Contour Plot Generation (Marching Squares)\n */\n\nexport interface ContourPoint {\n x: number;\n y: number;\n}\n\nexport interface ContourLine {\n level: number;\n points: ContourPoint[];\n}\n\nexport interface ContourOptions {\n levels?: number[];\n numLevels?: number;\n}\n\n/**\n * Generate contour lines from a 2D grid of values\n * Values are assumed to be in row-major order: z = values[y * width + x]\n */\nexport function generateContours(\n z: Float32Array | number[],\n xValues: Float32Array | number[],\n yValues: Float32Array | number[],\n options: ContourOptions = {}\n): ContourLine[] {\n const width = xValues.length;\n const height = yValues.length;\n \n const minZ = Math.min(...z);\n const maxZ = Math.max(...z);\n \n const levels = options.levels || calculateLevels(minZ, maxZ, options.numLevels || 10);\n const result: ContourLine[] = [];\n\n for (const level of levels) {\n const segments: Array<[number, number, number, number]> = [];\n \n // Process each cell\n for (let y = 0; y < height - 1; y++) {\n for (let x = 0; x < width - 1; x++) {\n const v0 = z[y * width + x];\n const v1 = z[y * width + (x + 1)];\n const v2 = z[(y + 1) * width + (x + 1)];\n const v3 = z[(y + 1) * width + x];\n \n processCell(x, y, v0, v1, v2, v3, level, xValues, yValues, segments);\n }\n }\n \n if (segments.length > 0) {\n // For simplicity, we return points as a flat array of segments\n // In a real implementation, we would join them into polylines\n const points: ContourPoint[] = [];\n for (const seg of segments) {\n points.push({ x: seg[0], y: seg[1] });\n points.push({ x: seg[2], y: seg[3] });\n }\n result.push({ level, points });\n }\n }\n\n return result;\n}\n\nfunction calculateLevels(min: number, max: number, n: number): number[] {\n const levels = [];\n const step = (max - min) / (n + 1);\n for (let i = 1; i <= n; i++) {\n levels.push(min + i * step);\n }\n return levels;\n}\n\n/**\n * Process a single cell using Marching Squares\n */\nfunction processCell(\n x: number, y: number,\n v0: number, v1: number, v2: number, v3: number,\n level: number,\n xScale: any, yScale: any,\n segments: Array<[number, number, number, number]>\n) {\n let caseIndex = 0;\n if (v0 >= level) caseIndex |= 1;\n if (v1 >= level) caseIndex |= 2;\n if (v2 >= level) caseIndex |= 4;\n if (v3 >= level) caseIndex |= 8;\n\n if (caseIndex === 0 || caseIndex === 15) return;\n\n // Interpolation helpers\n const lerp = (v0: number, v1: number, t: number) => v0 + (v1 - v0) * t;\n const getT = (v0: number, v1: number) => (level - v0) / (v1 - v0);\n\n // Edges: 0 (top), 1 (right), 2 (bottom), 3 (left)\n const getPoint = (edge: number): [number, number] => {\n switch (edge) {\n case 0: return [lerp(xScale[x], xScale[x + 1], getT(v0, v1)), yScale[y]];\n case 1: return [xScale[x + 1], lerp(yScale[y], yScale[y + 1], getT(v1, v2))];\n case 2: return [lerp(xScale[x], xScale[x + 1], getT(v3, v2)), yScale[y + 1]];\n case 3: return [xScale[x], lerp(yScale[y], yScale[y + 1], getT(v0, v3))];\n default: return [0, 0];\n }\n };\n\n const addSeg = (e1: number, e2: number) => {\n const p1 = getPoint(e1);\n const p2 = getPoint(e2);\n segments.push([p1[0], p1[1], p2[0], p2[1]]);\n };\n\n // Case table\n switch (caseIndex) {\n case 1: case 14: addSeg(0, 3); break;\n case 2: case 13: addSeg(0, 1); break;\n case 3: case 12: addSeg(1, 3); break;\n case 4: case 11: addSeg(1, 2); break;\n case 5: addSeg(0, 1); addSeg(2, 3); break; // Ambiguous\n case 6: case 9: addSeg(0, 2); break;\n case 7: case 8: addSeg(2, 3); break;\n case 10: addSeg(0, 3); addSeg(1, 2); break; // Ambiguous\n }\n}\n","/**\n * Type-safe event emitter for chart events\n */\n\nexport class EventEmitter<EventMap extends object> {\n private listeners: Map<keyof EventMap, Set<(data: unknown) => void>> =\n new Map();\n\n /**\n * Subscribe to an event\n */\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler as (data: unknown) => void);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler as (data: unknown) => void);\n }\n }\n\n /**\n * Emit an event with data\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`[EventEmitter] Error in handler for \"${String(event)}\":`, error);\n }\n });\n }\n }\n\n /**\n * Subscribe to an event once\n */\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const wrappedHandler = (data: EventMap[K]) => {\n this.off(event, wrappedHandler);\n handler(data);\n };\n this.on(event, wrappedHandler);\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Get listener count for an event\n */\n listenerCount(event: keyof EventMap): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","export class BufferStore {\n private buffers: Map<string, WebGLBuffer> = new Map();\n private bufferSizes: Map<string, number> = new Map();\n\n constructor(private gl: WebGLRenderingContext) {}\n\n createBuffer(id: string, data: Float32Array): void {\n const { gl } = this;\n let buffer = this.buffers.get(id);\n const currentSize = this.bufferSizes.get(id) || 0;\n\n if (buffer && data.byteLength <= currentSize) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);\n return;\n }\n\n if (buffer) gl.deleteBuffer(buffer);\n\n buffer = gl.createBuffer();\n if (!buffer) throw new Error(\"Failed to create buffer\");\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n\n this.buffers.set(id, buffer);\n this.bufferSizes.set(id, data.byteLength);\n }\n\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n const { gl } = this;\n const buffer = this.buffers.get(id);\n const currentSize = this.bufferSizes.get(id) || 0;\n\n if (!buffer || offsetInBytes + data.byteLength > currentSize) return false;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, offsetInBytes, data);\n return true;\n }\n\n getBuffer(id: string): WebGLBuffer | undefined {\n return this.buffers.get(id);\n }\n\n deleteBuffer(id: string): void {\n const buffer = this.buffers.get(id);\n if (!buffer) return;\n\n this.gl.deleteBuffer(buffer);\n this.buffers.delete(id);\n this.bufferSizes.delete(id);\n }\n\n destroy(): void {\n this.buffers.forEach((buffer) => this.gl.deleteBuffer(buffer));\n this.buffers.clear();\n this.bufferSizes.clear();\n }\n}\n","// Shader Sources\n\nexport const LINE_VERT = `\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nexport const LINE_FRAG = `\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n`;\n\nexport const POINT_VERT = `\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n`;\n\nexport const POINT_FRAG = `\nprecision highp float;\nuniform vec4 uColor;\nuniform int uSymbol;\n\nfloat sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n\nfloat sdTriangle(vec2 p, float r) {\n const float k = sqrt(3.0);\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n p.x -= clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfloat sdDiamond(vec2 p, float r) {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfloat sdCross(vec2 p, float r, float thickness) {\n vec2 d = abs(p);\n float s1 = sdBox(d, vec2(r, thickness));\n float s2 = sdBox(d, vec2(thickness, r));\n return min(s1, s2);\n}\n\nfloat sdX(vec2 p, float r, float thickness) {\n float c = cos(0.785398);\n float s = sin(0.785398);\n mat2 m = mat2(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfloat sdStar(vec2 p, float r, float rf) {\n const vec2 k1 = vec2(0.80901699, -0.58778525);\n const vec2 k2 = vec2(-k1.x, k1.y);\n p.x = abs(p.x);\n p -= 2.0 * max(dot(k1, p), 0.0) * k1;\n p -= 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y -= r;\n vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0, 1);\n float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\nvoid main() {\n vec2 p = gl_PointCoord - vec2(0.5);\n float d = 0.0;\n\n if (uSymbol == 0) {\n d = sdCircle(p, 0.45);\n } else if (uSymbol == 1) {\n d = sdBox(p, vec2(0.35));\n } else if (uSymbol == 2) {\n d = sdDiamond(p, 0.45);\n } else if (uSymbol == 3) {\n d = sdTriangle(vec2(p.x, p.y + 0.1), 0.4);\n } else if (uSymbol == 4) {\n d = sdTriangle(vec2(p.x, -p.y + 0.1), 0.4);\n } else if (uSymbol == 5) {\n d = sdCross(p, 0.45, 0.15);\n } else if (uSymbol == 6) {\n d = sdX(p, 0.45, 0.15);\n } else if (uSymbol == 7) {\n d = sdStar(p, 0.45, 0.4);\n }\n\n if (d > 0.02) discard;\n\n float alpha = 1.0 - smoothstep(0.0, 0.02, d);\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n`;\n\nexport const HEATMAP_VERT = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute float aValue;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying float vValue;\n\nvoid main() {\n gl_Position = vec4(aPosition * uScale + uTranslate, 0.0, 1.0);\n vValue = aValue;\n}\n`;\n\nexport const HEATMAP_FRAG = `\nprecision highp float;\nvarying float vValue;\nuniform float uMinValue;\nuniform float uMaxValue;\nuniform sampler2D uColormap;\n\nvoid main() {\n float range = uMaxValue - uMinValue;\n float t = (vValue - uMinValue) / (range != 0.0 ? range : 1.0);\n t = clamp(t, 0.0, 1.0);\n gl_FragColor = texture2D(uColormap, vec2(t, 0.5));\n}\n`;\n","import type { ProgramBundle, ProgramMode, ShaderProgram } from \"./types\";\nimport {\n HEATMAP_FRAG,\n HEATMAP_VERT,\n LINE_FRAG,\n LINE_VERT,\n POINT_FRAG,\n POINT_VERT,\n} from \"./shaderSources\";\n\nfunction createShader(\n gl: WebGLRenderingContext,\n source: string,\n type: number\n): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"Failed to create shader\");\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const error = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compilation error: ${error}`);\n }\n\n return shader;\n}\n\nfunction createProgram(\n gl: WebGLRenderingContext,\n vertSource: string,\n fragSource: string,\n mode: ProgramMode\n): ShaderProgram {\n const vertShader = createShader(gl, vertSource, gl.VERTEX_SHADER);\n const fragShader = createShader(gl, fragSource, gl.FRAGMENT_SHADER);\n\n const program = gl.createProgram();\n if (!program) throw new Error(\"Failed to create program\");\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const error = gl.getProgramInfoLog(program);\n throw new Error(`Program link error: ${error}`);\n }\n\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n return {\n program,\n attributes: {\n position: gl.getAttribLocation(\n program,\n mode === \"heatmap\" ? \"aPosition\" : \"position\"\n ),\n value: mode === \"heatmap\" ? gl.getAttribLocation(program, \"aValue\") : -1,\n },\n uniforms: {\n uScale: gl.getUniformLocation(program, \"uScale\")!,\n uTranslate: gl.getUniformLocation(program, \"uTranslate\")!,\n uColor:\n mode !== \"heatmap\" ? gl.getUniformLocation(program, \"uColor\") : null,\n uPointSize:\n mode === \"point\" ? gl.getUniformLocation(program, \"uPointSize\") : null,\n uSymbol:\n mode === \"point\" ? gl.getUniformLocation(program, \"uSymbol\") : null,\n uMinValue:\n mode === \"heatmap\" ? gl.getUniformLocation(program, \"uMinValue\") : null,\n uMaxValue:\n mode === \"heatmap\" ? gl.getUniformLocation(program, \"uMaxValue\") : null,\n uColormap:\n mode === \"heatmap\" ? gl.getUniformLocation(program, \"uColormap\") : null,\n },\n };\n}\n\nexport function createProgramBundle(gl: WebGLRenderingContext): ProgramBundle {\n return {\n lineProgram: createProgram(gl, LINE_VERT, LINE_FRAG, \"line\"),\n pointProgram: createProgram(gl, POINT_VERT, POINT_FRAG, \"point\"),\n heatmapProgram: createProgram(gl, HEATMAP_VERT, HEATMAP_FRAG, \"heatmap\"),\n };\n}\n","export function parseColor(color: string): [number, number, number, number] {\n if (!color) return [1, 0, 1, 1];\n \n if (color.startsWith(\"#\")) {\n const hex = color.slice(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16) / 255;\n const g = parseInt(hex[1] + hex[1], 16) / 255;\n const b = parseInt(hex[2] + hex[2], 16) / 255;\n return [r, g, b, 1];\n } else if (hex.length === 6) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n return [r, g, b, 1];\n } else if (hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n return [r, g, b, a];\n }\n }\n\n if (color.startsWith(\"rgb\")) {\n const matches = color.match(/[\\d.]+/g);\n if (matches && matches.length >= 3) {\n const r = parseFloat(matches[0]) / 255;\n const g = parseFloat(matches[1]) / 255;\n const b = parseFloat(matches[2]) / 255;\n const a = matches.length >= 4 ? parseFloat(matches[3]) : 1;\n return [r, g, b, a];\n }\n }\n\n return [1, 0, 1, 1];\n}\n\nexport function interleaveData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[]\n): Float32Array {\n const length = Math.min(x.length, y.length);\n const result = new Float32Array(length * 2);\n\n for (let i = 0; i < length; i++) {\n result[i * 2] = x[i];\n result[i * 2 + 1] = y[i];\n }\n\n return result;\n}\n\nexport function interleaveStepData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n mode: \"before\" | \"after\" | \"center\" = \"after\"\n): Float32Array {\n const length = Math.min(x.length, y.length);\n if (length < 2) {\n return interleaveData(x, y);\n }\n\n const stepCount = mode === \"center\" ? 1 + (length - 1) * 3 : length * 2 - 1;\n const result = new Float32Array(stepCount * 2);\n\n let resultIdx = 0;\n\n for (let i = 0; i < length; i++) {\n if (i === 0) {\n result[resultIdx++] = x[0];\n result[resultIdx++] = y[0];\n } else {\n const prevX = x[i - 1];\n const prevY = y[i - 1];\n const currX = x[i];\n const currY = y[i];\n\n if (mode === \"after\") {\n result[resultIdx++] = currX;\n result[resultIdx++] = prevY;\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n } else if (mode === \"before\") {\n result[resultIdx++] = prevX;\n result[resultIdx++] = currY;\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n } else {\n const midX = (prevX + currX) / 2;\n result[resultIdx++] = midX;\n result[resultIdx++] = prevY;\n result[resultIdx++] = midX;\n result[resultIdx++] = currY;\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n }\n }\n }\n\n return result.subarray(0, resultIdx);\n}\n\nexport function interleaveBandData(\n x: Float32Array | Float64Array | number[],\n y1: Float32Array | Float64Array | number[],\n y2: Float32Array | Float64Array | number[]\n): Float32Array {\n const n = Math.min(x.length, y1.length, y2.length);\n const result = new Float32Array(n * 2 * 2);\n\n for (let i = 0; i < n; i++) {\n const idx = i * 4;\n const xi = x[i];\n result[idx + 0] = xi;\n result[idx + 1] = y1[i];\n result[idx + 2] = xi;\n result[idx + 3] = y2[i];\n }\n return result;\n}\n","import type { Bounds } from \"../../types\";\nimport type { ShaderProgram } from \"./types\";\nimport { parseColor } from \"./utils\";\n\nexport function calculateUniforms(bounds: Bounds): {\n scale: [number, number];\n translate: [number, number];\n} {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n}\n\nexport function renderLine(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.LINE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.position);\n}\n\nexport function renderBand(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n\n const alpha = color[3] * 0.4;\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], alpha);\n\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.position);\n}\n\nexport function renderPoints(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n pointSize: number,\n symbol: string = \"circle\"\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n if (prog.uniforms.uPointSize)\n gl.uniform1f(prog.uniforms.uPointSize, pointSize);\n\n if (prog.uniforms.uSymbol) {\n const symbolMap: Record<string, number> = {\n circle: 0,\n square: 1,\n diamond: 2,\n triangle: 3,\n triangleDown: 4,\n cross: 5,\n x: 6,\n star: 7,\n };\n gl.uniform1i(prog.uniforms.uSymbol, symbolMap[symbol] ?? 0);\n }\n\n gl.drawArrays(gl.POINTS, 0, count);\n gl.disableVertexAttribArray(prog.attributes.position);\n}\n\nexport function renderHeatmap(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n zBounds: { min: number; max: number } = { min: 0, max: 1 },\n texture?: WebGLTexture\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 12, 0);\n\n if (prog.attributes.value !== undefined && prog.attributes.value !== -1) {\n gl.enableVertexAttribArray(prog.attributes.value);\n gl.vertexAttribPointer(prog.attributes.value, 1, gl.FLOAT, false, 12, 8);\n }\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n\n if (prog.uniforms.uMinValue)\n gl.uniform1f(prog.uniforms.uMinValue, zBounds.min);\n if (prog.uniforms.uMaxValue)\n gl.uniform1f(prog.uniforms.uMaxValue, zBounds.max);\n\n if (texture && prog.uniforms.uColormap) {\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1i(prog.uniforms.uColormap, 0);\n } else if (prog.uniforms.uColormap) {\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.position);\n if (prog.attributes.value !== undefined && prog.attributes.value !== -1) {\n gl.disableVertexAttribArray(prog.attributes.value);\n }\n}\n\nexport function renderBar(\n gl: WebGLRenderingContext,\n prog: ShaderProgram,\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n): void {\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n gl.disableVertexAttribArray(prog.attributes.position);\n}\n\nexport function computeSeriesColor(\n style: any\n): [number, number, number, number] {\n const color = parseColor(style.color ?? \"#ff0055\");\n color[3] = style.opacity ?? 1;\n return color;\n}\n","import type {\n NativeRenderOptions,\n NativeSeriesRenderData,\n ProgramBundle,\n} from \"./types\";\nimport {\n calculateUniforms,\n computeSeriesColor,\n renderBand,\n renderBar,\n renderHeatmap,\n renderLine,\n renderPoints,\n} from \"./draw\";\n\nexport function renderFrame(\n gl: WebGLRenderingContext,\n canvas: HTMLCanvasElement,\n dpr: number,\n programs: ProgramBundle,\n series: NativeSeriesRenderData[],\n options: NativeRenderOptions\n): void {\n const { bounds, backgroundColor = [0.1, 0.1, 0.18, 1], plotArea } = options;\n\n const canvasHeight = canvas.height;\n const canvasWidth = canvas.width;\n\n const pa = plotArea\n ? {\n x: plotArea.x * dpr,\n y: canvasHeight - (plotArea.y + plotArea.height) * dpr,\n width: plotArea.width * dpr,\n height: plotArea.height * dpr,\n }\n : {\n x: 0,\n y: 0,\n width: canvasWidth,\n height: canvasHeight,\n };\n\n gl.viewport(0, 0, canvasWidth, canvasHeight);\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.viewport(pa.x, pa.y, pa.width, pa.height);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(pa.x, pa.y, pa.width, pa.height);\n\n const uniforms = calculateUniforms(bounds);\n\n for (const s of series) {\n if (!s.visible || s.count === 0) continue;\n\n const yMin = s.yBounds ? s.yBounds.min : bounds.yMin;\n const yMax = s.yBounds ? s.yBounds.max : bounds.yMax;\n const yRange = yMax - yMin;\n\n const yScale = yRange > 0 ? 2 / yRange : 1;\n const yTrans = -1 - yMin * yScale;\n\n const seriesUniforms = {\n scale: [uniforms.scale[0], yScale] as [number, number],\n translate: [uniforms.translate[0], yTrans] as [number, number],\n };\n\n const color = computeSeriesColor(s.style);\n\n if (s.type === \"scatter\") {\n renderPoints(\n gl,\n programs.pointProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * dpr,\n s.style.symbol\n );\n } else if (s.type === \"line\") {\n renderLine(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n } else if (s.type === \"line+scatter\") {\n renderLine(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n renderPoints(\n gl,\n programs.pointProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * dpr,\n s.style.symbol\n );\n } else if (s.type === \"step\" || s.type === \"step+scatter\") {\n if (s.stepBuffer && s.stepCount) {\n renderLine(\n gl,\n programs.lineProgram,\n s.stepBuffer,\n s.stepCount,\n seriesUniforms,\n color\n );\n } else {\n renderLine(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n }\n\n if (s.type === \"step+scatter\") {\n renderPoints(\n gl,\n programs.pointProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * dpr,\n s.style.symbol\n );\n }\n } else if (s.type === \"band\") {\n renderBand(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n } else if (s.type === \"heatmap\") {\n renderHeatmap(\n gl,\n programs.heatmapProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n s.zBounds,\n s.colormapTexture\n );\n } else if (s.type === \"bar\") {\n renderBar(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color\n );\n }\n }\n}\n","export class TextureStore {\n private textures: Map<string, WebGLTexture> = new Map();\n\n constructor(private gl: WebGLRenderingContext) {}\n\n createColormapTexture(id: string, data: Uint8Array): WebGLTexture {\n const { gl } = this;\n let texture = this.textures.get(id);\n\n if (!texture) {\n texture = gl.createTexture()!;\n this.textures.set(id, texture);\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n data.length / 4,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n data\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n return texture;\n }\n\n getTexture(id: string): WebGLTexture | undefined {\n return this.textures.get(id);\n }\n\n destroy(): void {\n this.textures.forEach((t) => this.gl.deleteTexture(t));\n this.textures.clear();\n }\n}\n","import { BufferStore } from \"./bufferStore\";\nimport { createProgramBundle } from \"./programFactory\";\nimport { renderFrame } from \"./renderFrame\";\nimport { TextureStore } from \"./textureStore\";\nimport type {\n NativeRenderOptions,\n NativeSeriesRenderData,\n ProgramBundle,\n} from \"./types\";\n\nexport class NativeWebGLRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGLRenderingContext;\n private dpr: number;\n\n private programs: ProgramBundle;\n private buffers: BufferStore;\n private textures: TextureStore;\n\n private isInitialized = false;\n\n setDPR(dpr: number): void {\n this.dpr = dpr;\n this.resize();\n }\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas = canvas;\n this.dpr = window.devicePixelRatio || 1;\n\n const gl = canvas.getContext(\"webgl\", {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: true,\n powerPreference: \"high-performance\",\n });\n\n if (!gl) throw new Error(\"WebGL not supported\");\n\n this.gl = gl;\n this.programs = createProgramBundle(gl);\n this.buffers = new BufferStore(gl);\n this.textures = new TextureStore(gl);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.isInitialized = true;\n }\n\n get available(): boolean {\n return this.isInitialized;\n }\n\n createBuffer(id: string, data: Float32Array): void {\n this.buffers.createBuffer(id, data);\n }\n\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n return this.buffers.updateBuffer(id, data, offsetInBytes);\n }\n\n getBuffer(id: string): WebGLBuffer | undefined {\n return this.buffers.getBuffer(id);\n }\n\n deleteBuffer(id: string): void {\n this.buffers.deleteBuffer(id);\n }\n\n createColormapTexture(id: string, data: Uint8Array): WebGLTexture {\n return this.textures.createColormapTexture(id, data);\n }\n\n getTexture(id: string): WebGLTexture | undefined {\n return this.textures.getTexture(id);\n }\n\n render(series: NativeSeriesRenderData[], options: NativeRenderOptions): void {\n if (!this.isInitialized) return;\n renderFrame(this.gl, this.canvas, this.dpr, this.programs, series, options);\n }\n\n resize(): void {\n const rect = this.canvas.getBoundingClientRect();\n const width = rect.width * this.dpr;\n const height = rect.height * this.dpr;\n\n if (this.canvas.width !== width || this.canvas.height !== height) {\n this.canvas.width = width;\n this.canvas.height = height;\n this.gl.viewport(0, 0, width, height);\n }\n }\n\n getLimits() {\n const { gl } = this;\n return {\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS),\n renderer: gl.getParameter(gl.RENDERER),\n vendor: gl.getParameter(gl.VENDOR),\n };\n }\n\n destroy(): void {\n const { gl } = this;\n\n this.buffers.destroy();\n this.textures.destroy();\n\n gl.deleteProgram(this.programs.lineProgram.program);\n gl.deleteProgram(this.programs.pointProgram.program);\n gl.deleteProgram(this.programs.heatmapProgram.program);\n\n this.isInitialized = false;\n }\n}\n\nexport type { NativeSeriesRenderData, NativeRenderOptions } from \"./types\";\n","/**\n * Theme - Visual styling configuration for SciChart\n *\n * Provides customizable themes for the chart including:\n * - Grid styling\n * - Axis styling\n * - Legend styling\n * - Cursor styling\n */\n\n// ============================================\n// Theme Types\n// ============================================\n\nexport interface GridTheme {\n /** Grid visibility */\n visible: boolean;\n /** Major grid line color */\n majorColor: string;\n /** Minor grid line color */\n minorColor: string;\n /** Major grid line width */\n majorWidth: number;\n /** Minor grid line width */\n minorWidth: number;\n /** Line dash pattern for major lines [dash, gap] */\n majorDash: number[];\n /** Line dash pattern for minor lines [dash, gap] */\n minorDash: number[];\n /** Show minor grid lines */\n showMinor: boolean;\n /** Number of minor divisions between major lines */\n minorDivisions: number;\n}\n\nexport interface AxisTheme {\n /** Axis line color */\n lineColor: string;\n /** Axis line width */\n lineWidth: number;\n /** Tick mark color */\n tickColor: string;\n /** Tick mark length */\n tickLength: number;\n /** Label color */\n labelColor: string;\n /** Label font size */\n labelSize: number;\n /** Axis title color */\n titleColor: string;\n /** Axis title font size */\n titleSize: number;\n /** Font family */\n fontFamily: string;\n}\n\nexport interface LegendTheme {\n /** Legend visibility */\n visible: boolean;\n /** Position */\n position: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Background color */\n backgroundColor: string;\n /** Border color */\n borderColor: string;\n /** Border radius */\n borderRadius: number;\n /** Text color */\n textColor: string;\n /** Font size */\n fontSize: number;\n /** Font family */\n fontFamily: string;\n /** Padding inside legend */\n padding: number;\n /** Gap between items */\n itemGap: number;\n /** Color swatch size */\n swatchSize: number;\n}\n\nexport interface CursorTheme {\n /** Cursor line color */\n lineColor: string;\n /** Cursor line width */\n lineWidth: number;\n /** Cursor line dash pattern */\n lineDash: number[];\n /** Tooltip background color */\n tooltipBackground: string;\n /** Tooltip border color */\n tooltipBorder: string;\n /** Tooltip text color */\n tooltipColor: string;\n /** Tooltip font size */\n tooltipSize: number;\n}\n\nexport interface ChartTheme {\n /** Theme name */\n name: string;\n /** Background color */\n backgroundColor: string;\n /** Plot area border color */\n plotBorderColor: string;\n /** Grid theme */\n grid: GridTheme;\n /** X-axis theme */\n xAxis: AxisTheme;\n /** Y-axis theme */\n yAxis: AxisTheme;\n /** Legend theme */\n legend: LegendTheme;\n /** Cursor theme */\n cursor: CursorTheme;\n}\n\n// ============================================\n// Default Themes\n// ============================================\n\nconst DEFAULT_AXIS_THEME: AxisTheme = {\n lineColor: \"#666666\", // Brighter\n lineWidth: 1,\n tickColor: \"#888888\", // Brighter\n tickLength: 6,\n labelColor: \"#cccccc\", // Brighter\n labelSize: 12, // Larger\n titleColor: \"#ffffff\", // Brighter\n titleSize: 14, // Larger\n fontFamily: \"Inter, system-ui, sans-serif\",\n};\n\nconst DEFAULT_GRID_THEME: GridTheme = {\n visible: true,\n majorColor: \"rgba(255, 255, 255, 0.12)\", // Higher opacity\n minorColor: \"rgba(255, 255, 255, 0.05)\",\n majorWidth: 1,\n minorWidth: 0.5,\n majorDash: [4, 4],\n minorDash: [2, 4],\n showMinor: true, // Default to show minor\n minorDivisions: 5,\n};\n\nconst DEFAULT_LEGEND_THEME: LegendTheme = {\n visible: true,\n position: \"top-right\",\n backgroundColor: \"rgba(20, 20, 30, 0.9)\",\n borderColor: \"rgba(255, 255, 255, 0.15)\",\n borderRadius: 6,\n textColor: \"#ffffff\",\n fontSize: 11,\n fontFamily: \"Inter, system-ui, sans-serif\",\n padding: 5,\n itemGap: 3,\n swatchSize: 12,\n};\n\nconst DEFAULT_CURSOR_THEME: CursorTheme = {\n lineColor: \"rgba(255, 255, 255, 0.5)\",\n lineWidth: 1,\n lineDash: [5, 5],\n tooltipBackground: \"rgba(20, 20, 30, 0.95)\",\n tooltipBorder: \"rgba(255, 255, 255, 0.2)\",\n tooltipColor: \"#ffffff\",\n tooltipSize: 11,\n};\n\n// ============================================\n// Preset Themes\n// ============================================\n\nexport const DARK_THEME: ChartTheme = {\n name: \"dark\",\n backgroundColor: \"#0b0e14\",\n plotBorderColor: \"#444c56\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(255, 255, 255, 0.12)\",\n minorColor: \"rgba(255, 255, 255, 0.04)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n labelColor: \"#adbac7\",\n titleColor: \"#cdd9e5\",\n lineColor: \"#444c56\",\n tickColor: \"#444c56\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n labelColor: \"#adbac7\",\n titleColor: \"#cdd9e5\",\n lineColor: \"#444c56\",\n tickColor: \"#444c56\",\n },\n legend: DEFAULT_LEGEND_THEME,\n cursor: DEFAULT_CURSOR_THEME,\n};\n\nexport const MIDNIGHT_THEME: ChartTheme = {\n name: \"midnight\",\n backgroundColor: \"#05050a\",\n plotBorderColor: \"#3a3a5a\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(150, 150, 255, 0.2)\",\n minorColor: \"rgba(150, 150, 255, 0.08)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#5a5a8a\",\n labelColor: \"#b0b0e0\",\n titleColor: \"#d0d0f0\",\n tickColor: \"#5a5a8a\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#5a5a8a\",\n labelColor: \"#b0b0e0\",\n titleColor: \"#d0d0f0\",\n tickColor: \"#5a5a8a\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(15, 15, 30, 0.95)\",\n borderColor: \"rgba(100, 100, 255, 0.4)\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(150, 150, 255, 0.7)\",\n },\n};\n\n/** Light theme - Clean white background */\nexport const LIGHT_THEME: ChartTheme = {\n name: \"light\",\n backgroundColor: \"#ffffff\",\n plotBorderColor: \"#cccccc\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(0, 0, 0, 0.1)\",\n minorColor: \"rgba(0, 0, 0, 0.04)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#888888\",\n tickColor: \"#888888\",\n labelColor: \"#444444\",\n titleColor: \"#222222\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#888888\",\n tickColor: \"#888888\",\n labelColor: \"#444444\",\n titleColor: \"#222222\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n borderColor: \"rgba(0, 0, 0, 0.15)\",\n textColor: \"#222222\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(0, 0, 0, 0.4)\",\n tooltipBackground: \"rgba(50, 50, 60, 0.95)\",\n },\n};\n\n/** Electrochemistry theme - Professional blue tones */\nexport const ELECTROCHEM_THEME: ChartTheme = {\n name: \"electrochemistry\",\n backgroundColor: \"#0a1628\",\n plotBorderColor: \"#1e3a5f\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(30, 136, 229, 0.15)\",\n minorColor: \"rgba(30, 136, 229, 0.06)\",\n showMinor: true,\n minorDivisions: 2,\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#1e88e5\",\n tickColor: \"#42a5f5\",\n labelColor: \"#90caf9\",\n titleColor: \"#bbdefb\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#1e88e5\",\n tickColor: \"#42a5f5\",\n labelColor: \"#90caf9\",\n titleColor: \"#bbdefb\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(10, 22, 40, 0.95)\",\n borderColor: \"rgba(30, 136, 229, 0.3)\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(100, 180, 255, 0.6)\",\n },\n};\n\n// ============================================\n// Theme Utilities\n// ============================================\n\n/**\n * Create a custom theme by merging with base theme\n */\nexport function createTheme(\n base: ChartTheme,\n overrides: Partial<ChartTheme>\n): ChartTheme {\n return {\n ...base,\n ...overrides,\n grid: { ...base.grid, ...overrides.grid },\n xAxis: { ...base.xAxis, ...overrides.xAxis },\n yAxis: { ...base.yAxis, ...overrides.yAxis },\n legend: { ...base.legend, ...overrides.legend },\n cursor: { ...base.cursor, ...overrides.cursor },\n };\n}\n\n/**\n * Get a theme by name\n */\nexport function getThemeByName(name: string): ChartTheme {\n switch (name) {\n case \"dark\":\n return DARK_THEME;\n case \"midnight\":\n return MIDNIGHT_THEME;\n case \"light\":\n return LIGHT_THEME;\n case \"electrochemistry\":\n case \"electrochem\":\n return ELECTROCHEM_THEME;\n default:\n console.warn(`[Theme] Unknown theme \"${name}\", using dark`);\n return DARK_THEME;\n }\n}\n\n/** Default theme export */\nexport const DEFAULT_THEME = DARK_THEME;\n","/**\n * OverlayRenderer - Canvas 2D rendering for axes, grid, legend, and cursor\n *\n * This module handles all 2D overlay rendering on top of the WebGL canvas.\n * It uses the theme system for consistent styling.\n */\n\nimport type { Scale } from \"../scales\";\nimport type { ChartTheme } from \"../theme\";\nimport type { Series } from \"./Series\";\nimport type { PlotArea, CursorState, AxisOptions } from \"../types\";\n\n// ============================================\n// Overlay Renderer Class\n// ============================================\n\nexport class OverlayRenderer {\n private ctx: CanvasRenderingContext2D;\n private theme: ChartTheme;\n\n constructor(ctx: CanvasRenderingContext2D, theme: ChartTheme) {\n this.ctx = ctx;\n this.theme = theme;\n }\n\n /**\n * Update the theme\n */\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n }\n\n /**\n * Clear the overlay\n */\n clear(width: number, height: number): void {\n this.ctx.clearRect(0, 0, width, height);\n }\n\n /**\n * Draw the grid\n */\n drawGrid(plotArea: PlotArea, xScale: Scale, yScale: Scale): void {\n if (!this.theme.grid.visible) return;\n\n const { ctx } = this;\n const grid = this.theme.grid;\n\n const xTicks = xScale.ticks(8);\n const yTicks = yScale.ticks(6);\n\n // Major grid lines\n ctx.strokeStyle = grid.majorColor;\n ctx.lineWidth = grid.majorWidth;\n ctx.setLineDash(grid.majorDash);\n\n // Vertical lines (X ticks)\n xTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n ctx.beginPath();\n ctx.moveTo(x, plotArea.y);\n ctx.lineTo(x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n });\n\n // Horizontal lines (Y ticks)\n yTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, y);\n ctx.lineTo(plotArea.x + plotArea.width, y);\n ctx.stroke();\n }\n });\n\n // Minor grid lines (if enabled)\n if (grid.showMinor) {\n ctx.strokeStyle = grid.minorColor;\n ctx.lineWidth = grid.minorWidth;\n ctx.setLineDash(grid.minorDash);\n\n // Generate minor ticks between major ticks\n const minorXTicks = this.generateMinorTicks(xTicks, grid.minorDivisions);\n const minorYTicks = this.generateMinorTicks(yTicks, grid.minorDivisions);\n\n minorXTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n ctx.beginPath();\n ctx.moveTo(x, plotArea.y);\n ctx.lineTo(x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n });\n\n minorYTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, y);\n ctx.lineTo(plotArea.x + plotArea.width, y);\n ctx.stroke();\n }\n });\n }\n\n ctx.setLineDash([]);\n }\n\n /**\n * Draw X axis with ticks and labels\n */\n drawXAxis(plotArea: PlotArea, xScale: Scale, options?: AxisOptions): void {\n const { ctx } = this;\n const axis = this.theme.xAxis;\n const xTicks = xScale.ticks(8);\n const axisY = plotArea.y + plotArea.height;\n const label = options?.label;\n\n // Axis line\n ctx.strokeStyle = axis.lineColor;\n ctx.lineWidth = axis.lineWidth;\n ctx.beginPath();\n ctx.moveTo(plotArea.x, axisY);\n ctx.lineTo(plotArea.x + plotArea.width, axisY);\n ctx.stroke();\n\n // Ticks and labels\n ctx.fillStyle = axis.labelColor;\n ctx.font = `${axis.labelSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n\n xTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n // Tick mark\n ctx.strokeStyle = axis.tickColor;\n ctx.beginPath();\n ctx.moveTo(x, axisY);\n ctx.lineTo(x, axisY + axis.tickLength);\n ctx.stroke();\n\n // Label\n ctx.fillText(this.formatXTick(tick, options), x, axisY + axis.tickLength + 3);\n }\n });\n\n // Axis title\n if (label) {\n ctx.fillStyle = axis.titleColor;\n ctx.font = `${axis.titleSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"bottom\";\n ctx.fillText(\n label,\n plotArea.x + plotArea.width / 2,\n plotArea.y + plotArea.height + 45\n );\n }\n }\n\n /**\n * Draw Y axis with ticks and labels\n */\n drawYAxis(\n plotArea: PlotArea, \n yScale: Scale, \n options?: AxisOptions, \n position: \"left\" | \"right\" = \"left\",\n offset: number = 0\n ): void {\n const { ctx } = this;\n const axis = this.theme.yAxis;\n const yTicks = yScale.ticks(6);\n const label = options?.label;\n // Calculate X coordinate for axis line based on position and offset\n const axisX = position === 'left' ? plotArea.x - offset : plotArea.x + plotArea.width + offset;\n const tickDir = position === 'left' ? -1 : 1; // Left points left, right points right\n\n // Axis line\n ctx.strokeStyle = axis.lineColor;\n ctx.lineWidth = axis.lineWidth;\n ctx.beginPath();\n ctx.moveTo(axisX, plotArea.y);\n ctx.lineTo(axisX, plotArea.y + plotArea.height);\n ctx.stroke();\n\n // Ticks and labels\n ctx.fillStyle = axis.labelColor;\n ctx.font = `${axis.labelSize}px ${axis.fontFamily}`;\n ctx.textAlign = position === 'left' ? \"right\" : \"left\";\n ctx.textBaseline = \"middle\";\n\n yTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n // Tick mark\n ctx.strokeStyle = axis.tickColor;\n ctx.beginPath();\n ctx.moveTo(axisX, y);\n ctx.lineTo(axisX + axis.tickLength * tickDir, y);\n ctx.stroke();\n\n // Label\n const labelX = axisX + (axis.tickLength + 3) * tickDir;\n ctx.fillText(this.formatYTick(tick, options), labelX, y);\n }\n });\n\n // Axis title\n if (label) {\n ctx.save();\n ctx.fillStyle = axis.titleColor;\n ctx.font = `${axis.titleSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n \n const titleX = position === 'left' \n ? axisX - 40 // Adjust padding for left title\n : axisX + 40; // Adjust padding for right title\n \n const titleY = plotArea.y + plotArea.height / 2;\n \n ctx.translate(titleX, titleY);\n ctx.rotate(position === 'left' ? -Math.PI / 2 : Math.PI / 2);\n ctx.fillText(label, 0, 0);\n ctx.restore();\n }\n }\n\n /**\n * Draw plot area border\n */\n drawPlotBorder(plotArea: PlotArea): void {\n const { ctx } = this;\n ctx.strokeStyle = this.theme.plotBorderColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n }\n\n /**\n * Draw legend\n */\n drawLegend(plotArea: PlotArea, series: Series[]): void {\n if (series.length === 0) return;\n\n const { ctx } = this;\n const legend = this.theme.legend;\n\n // Calculate legend dimensions\n ctx.font = `${legend.fontSize}px ${legend.fontFamily}`;\n let maxWidth = 0;\n const items = series.map((s) => {\n const label = s.getId();\n const style = s.getStyle();\n const width = ctx.measureText(label).width;\n maxWidth = Math.max(maxWidth, width);\n return { \n id: s.getId(), \n color: style.color ?? \"#ff0055\", \n label,\n type: s.getType(),\n symbol: style.symbol,\n opacity: style.opacity ?? 1\n };\n });\n\n const boxWidth = legend.swatchSize + 8 + maxWidth + legend.padding * 2;\n const boxHeight =\n items.length * (legend.swatchSize + legend.itemGap) -\n legend.itemGap +\n legend.padding * 2;\n\n // Calculate position\n let x: number, y: number;\n switch (legend.position) {\n case \"top-left\":\n x = plotArea.x + 10;\n y = plotArea.y + 10;\n break;\n case \"bottom-left\":\n x = plotArea.x + 10;\n y = plotArea.y + 10;\n break;\n case \"bottom-right\":\n x = plotArea.x + plotArea.width - boxWidth - 10;\n y = plotArea.y + plotArea.height - boxHeight - 10;\n break;\n case \"top-right\":\n default:\n x = plotArea.x + plotArea.width - boxWidth - 10;\n y = plotArea.y + 10;\n break;\n }\n\n // Draw background\n ctx.fillStyle = legend.backgroundColor;\n ctx.strokeStyle = legend.borderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n const r = legend.borderRadius;\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + boxWidth - r, y);\n ctx.arcTo(x + boxWidth, y, x + boxWidth, y + r, r);\n ctx.lineTo(x + boxWidth, y + boxHeight - r);\n ctx.arcTo(x + boxWidth, y + boxHeight, x + boxWidth - r, y + boxHeight, r);\n ctx.lineTo(x + r, y + boxHeight);\n ctx.arcTo(x, y + boxHeight, x, y + boxHeight - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // Draw items\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n\n items.forEach((item, i) => {\n const itemY =\n y + legend.padding + i * (legend.swatchSize + legend.itemGap);\n const swatchX = x + legend.padding;\n const centerY = itemY + legend.swatchSize / 2;\n const centerX = swatchX + legend.swatchSize / 2;\n\n // Draw swatch (symbol or line)\n ctx.save();\n ctx.globalAlpha = item.opacity;\n ctx.fillStyle = item.color;\n ctx.strokeStyle = item.color;\n ctx.lineWidth = 2;\n\n const size = legend.swatchSize;\n\n // EXTREME FALLBACK DETECTION\n const typeStr = String(item.type).toLowerCase();\n const hasSymbol = !!item.symbol && item.symbol !== 'circle';\n \n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && hasSymbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n\n if (isScatter) {\n this.drawLegendSymbol(ctx, item.symbol ?? 'circle', centerX, centerY, size * 0.9);\n } else if (isLineScatter) {\n // Line + Scatter\n ctx.beginPath();\n ctx.moveTo(swatchX, centerY);\n ctx.lineTo(swatchX + size, centerY);\n ctx.stroke();\n \n this.drawLegendSymbol(ctx, item.symbol ?? 'circle', centerX, centerY, size * 0.6);\n } else {\n // Pure line or step\n ctx.beginPath();\n ctx.moveTo(swatchX, centerY);\n ctx.lineTo(swatchX + size, centerY);\n ctx.stroke();\n }\n ctx.restore();\n\n // Label\n ctx.fillStyle = legend.textColor;\n ctx.fillText(\n item.label,\n x + legend.padding + legend.swatchSize + 8,\n centerY\n );\n });\n }\n\n /**\n * Helper to draw a symbol in the legend\n */\n private drawLegendSymbol(\n ctx: CanvasRenderingContext2D,\n symbol: string,\n x: number,\n y: number,\n size: number\n ): void {\n const r = size / 2;\n ctx.beginPath();\n\n switch (symbol) {\n case 'circle':\n ctx.arc(x, y, r, 0, Math.PI * 2);\n ctx.fill();\n break;\n case 'square':\n ctx.rect(x - r, y - r, size, size);\n ctx.fill();\n break;\n case 'diamond':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y);\n ctx.lineTo(x, y + r);\n ctx.lineTo(x - r, y);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y + r);\n ctx.lineTo(x - r, y + r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangleDown':\n ctx.moveTo(x, y + r);\n ctx.lineTo(x + r, y - r);\n ctx.lineTo(x - r, y - r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.moveTo(x - r, y);\n ctx.lineTo(x + r, y);\n ctx.moveTo(x, y - r);\n ctx.lineTo(x, y + r);\n ctx.stroke();\n break;\n case 'x':\n const d = r * 0.707; // sin(45)\n ctx.moveTo(x - d, y - d);\n ctx.lineTo(x + d, y + d);\n ctx.moveTo(x + d, y - d);\n ctx.lineTo(x - d, y + d);\n ctx.stroke();\n break;\n case 'star':\n for (let i = 0; i < 5; i++) {\n ctx.lineTo(\n x + r * Math.cos(((18 + i * 72) / 180) * Math.PI),\n y - r * Math.sin(((18 + i * 72) / 180) * Math.PI)\n );\n ctx.lineTo(\n x + (r / 2) * Math.cos(((54 + i * 72) / 180) * Math.PI),\n y - (r / 2) * Math.sin(((54 + i * 72) / 180) * Math.PI)\n );\n }\n ctx.closePath();\n ctx.fill();\n break;\n }\n }\n\n /**\n * Draw cursor/crosshair\n */\n drawCursor(plotArea: PlotArea, cursor: CursorState): void {\n if (!cursor.enabled) return;\n\n const { ctx } = this;\n const cursorTheme = this.theme.cursor;\n\n // Check if cursor is in plot area\n if (\n cursor.x < plotArea.x ||\n cursor.x > plotArea.x + plotArea.width ||\n cursor.y < plotArea.y ||\n cursor.y > plotArea.y + plotArea.height\n ) {\n return;\n }\n\n ctx.save();\n\n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n\n // Crosshair style\n ctx.strokeStyle = cursorTheme.lineColor;\n ctx.lineWidth = cursorTheme.lineWidth;\n ctx.setLineDash(cursorTheme.lineDash);\n\n if (cursor.crosshair) {\n // Vertical line\n ctx.beginPath();\n ctx.moveTo(cursor.x, plotArea.y);\n ctx.lineTo(cursor.x, plotArea.y + plotArea.height);\n ctx.stroke();\n\n // Horizontal line\n ctx.beginPath();\n ctx.moveTo(plotArea.x, cursor.y);\n ctx.lineTo(plotArea.x + plotArea.width, cursor.y);\n ctx.stroke();\n } else {\n // Just vertical line\n ctx.beginPath();\n ctx.moveTo(cursor.x, plotArea.y);\n ctx.lineTo(cursor.x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n\n ctx.restore();\n\n // Draw tooltip\n if (cursor.tooltipText) {\n this.drawTooltip(cursor.x, cursor.y, cursor.tooltipText, plotArea);\n }\n }\n\n /**\n * Draw tooltip\n */\n private drawTooltip(\n x: number,\n y: number,\n text: string,\n plotArea: PlotArea\n ): void {\n const { ctx } = this;\n const cursor = this.theme.cursor;\n const lines = text.split(\"\\n\");\n const lineHeight = cursor.tooltipSize + 5;\n const padding = 8;\n\n ctx.font = `${cursor.tooltipSize}px ${this.theme.xAxis.fontFamily}`;\n let maxWidth = 0;\n lines.forEach((line) => {\n maxWidth = Math.max(maxWidth, ctx.measureText(line).width);\n });\n\n const boxWidth = maxWidth + padding * 2;\n const boxHeight = lines.length * lineHeight + padding * 2 - 5;\n\n // Position tooltip\n let tooltipX = x + 15;\n let tooltipY = y - boxHeight - 10;\n\n if (tooltipX + boxWidth > plotArea.x + plotArea.width) {\n tooltipX = x - boxWidth - 15;\n }\n if (tooltipY < plotArea.y) {\n tooltipY = y + 15;\n }\n\n // Background\n ctx.fillStyle = cursor.tooltipBackground;\n ctx.strokeStyle = cursor.tooltipBorder;\n ctx.lineWidth = 1;\n ctx.beginPath();\n const r = 4;\n ctx.moveTo(tooltipX + r, tooltipY);\n ctx.lineTo(tooltipX + boxWidth - r, tooltipY);\n ctx.arcTo(tooltipX + boxWidth, tooltipY, tooltipX + boxWidth, tooltipY + r, r);\n ctx.lineTo(tooltipX + boxWidth, tooltipY + boxHeight - r);\n ctx.arcTo(tooltipX + boxWidth, tooltipY + boxHeight, tooltipX + boxWidth - r, tooltipY + boxHeight, r);\n ctx.lineTo(tooltipX + r, tooltipY + boxHeight);\n ctx.arcTo(tooltipX, tooltipY + boxHeight, tooltipX, tooltipY + boxHeight - r, r);\n ctx.lineTo(tooltipX, tooltipY + r);\n ctx.arcTo(tooltipX, tooltipY, tooltipX + r, tooltipY, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // Text\n ctx.fillStyle = cursor.tooltipColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n lines.forEach((line, i) => {\n ctx.fillText(\n line,\n tooltipX + padding,\n tooltipY + padding + i * lineHeight\n );\n });\n }\n\n /**\n * Draw selection rectangle (Box Zoom)\n */\n drawSelectionRect(rect: {\n x: number;\n y: number;\n width: number;\n height: number;\n }): void {\n const { ctx } = this;\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\");\n\n ctx.save();\n ctx.fillStyle = isDark\n ? \"rgba(0, 170, 255, 0.15)\"\n : \"rgba(0, 100, 255, 0.1)\";\n ctx.strokeStyle = \"#00aaff\";\n ctx.lineWidth = 1;\n ctx.setLineDash([5, 5]);\n\n ctx.beginPath();\n ctx.rect(rect.x, rect.y, rect.width, rect.height);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Draw error bars for a series\n */\n drawErrorBars(\n plotArea: PlotArea,\n series: Series,\n xScale: Scale,\n yScale: Scale\n ): void {\n if (!series.hasErrorData()) return;\n\n const { ctx } = this;\n const data = series.getData();\n const style = series.getStyle();\n const errorStyle = style.errorBars ?? {};\n\n // Skip if explicitly hidden\n if (errorStyle.visible === false) return;\n\n // Error bar styling\n const color = errorStyle.color ?? style.color ?? '#ff0055';\n const lineWidth = errorStyle.width ?? 1;\n const capWidth = errorStyle.capWidth ?? 6;\n const showCaps = errorStyle.showCaps !== false;\n const opacity = errorStyle.opacity ?? 0.7;\n const direction = errorStyle.direction ?? 'both';\n\n ctx.save();\n\n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.globalAlpha = opacity;\n\n // Draw error bars for each point\n for (let i = 0; i < data.x.length; i++) {\n const x = xScale.transform(data.x[i]);\n const y = yScale.transform(data.y[i]);\n\n // Skip points outside plot area\n if (x < plotArea.x || x > plotArea.x + plotArea.width) continue;\n if (y < plotArea.y || y > plotArea.y + plotArea.height) continue;\n\n // Y error bars (vertical)\n const yError = series.getYError(i);\n if (yError) {\n const [errorMinus, errorPlus] = yError;\n const yBase = data.y[i];\n\n // Convert error values to pixel positions\n const yTop = yScale.transform(yBase + errorPlus);\n const yBottom = yScale.transform(yBase - errorMinus);\n\n ctx.beginPath();\n\n // Draw based on direction\n if (direction === 'both' || direction === 'positive') {\n // Upper error bar\n ctx.moveTo(x, y);\n ctx.lineTo(x, yTop);\n // Top cap\n if (showCaps) {\n ctx.moveTo(x - capWidth / 2, yTop);\n ctx.lineTo(x + capWidth / 2, yTop);\n }\n }\n\n if (direction === 'both' || direction === 'negative') {\n // Lower error bar\n ctx.moveTo(x, y);\n ctx.lineTo(x, yBottom);\n // Bottom cap\n if (showCaps) {\n ctx.moveTo(x - capWidth / 2, yBottom);\n ctx.lineTo(x + capWidth / 2, yBottom);\n }\n }\n\n ctx.stroke();\n }\n\n // X error bars (horizontal)\n const xError = series.getXError(i);\n if (xError) {\n const [errorMinus, errorPlus] = xError;\n const xBase = data.x[i];\n\n // Convert error values to pixel positions\n const xRight = xScale.transform(xBase + errorPlus);\n const xLeft = xScale.transform(xBase - errorMinus);\n\n ctx.beginPath();\n\n if (direction === 'both' || direction === 'positive') {\n // Right error bar\n ctx.moveTo(x, y);\n ctx.lineTo(xRight, y);\n // Right cap\n if (showCaps) {\n ctx.moveTo(xRight, y - capWidth / 2);\n ctx.lineTo(xRight, y + capWidth / 2);\n }\n }\n\n if (direction === 'both' || direction === 'negative') {\n // Left error bar\n ctx.moveTo(x, y);\n ctx.lineTo(xLeft, y);\n // Left cap\n if (showCaps) {\n ctx.moveTo(xLeft, y - capWidth / 2);\n ctx.lineTo(xLeft, y + capWidth / 2);\n }\n }\n\n ctx.stroke();\n }\n }\n\n ctx.restore();\n }\n\n // ----------------------------------------\n // Helper Methods\n // ----------------------------------------\n\n private generateMinorTicks(\n majorTicks: number[],\n divisions: number\n ): number[] {\n if (majorTicks.length < 2) return [];\n\n const minor: number[] = [];\n for (let i = 0; i < majorTicks.length - 1; i++) {\n const step = (majorTicks[i + 1] - majorTicks[i]) / divisions;\n for (let j = 1; j < divisions; j++) {\n minor.push(majorTicks[i] + step * j);\n }\n }\n return minor;\n }\n\n private formatXTick(value: number, options?: AxisOptions): string {\n if (options?.scientific || (Math.abs(value) < 0.001 && value !== 0)) {\n return this.toScientificUnicode(value, 1);\n }\n return value.toFixed(3).replace(/\\.?0+$/, \"\");\n }\n\n private formatYTick(value: number, options?: AxisOptions): string {\n if (value === 0) return \"0\";\n const absVal = Math.abs(value);\n if (options?.scientific || absVal < 0.0001 || absVal >= 10000) {\n return this.toScientificUnicode(value, 1);\n }\n return value.toPrecision(3);\n }\n\n private toScientificUnicode(value: number, precision: number): string {\n const str = value.toExponential(precision);\n const [mantissa, exponent] = str.split(\"e\");\n\n // Convert exponent to unicode superscripts\n const superscriptMap: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"-\": \"⁻\",\n \"+\": \"⁺\",\n };\n\n const unicodeExp = exponent\n .replace(\"+\", \"\") // Remove plus sign for compactness\n .replace(\n /[0-9\\-]/g,\n (char) => superscriptMap[char] || char\n );\n\n // Return compact \"1.0e⁷\" format\n return `${mantissa}e${unicodeExp}`;\n }\n}\n","/**\n * InteractionManager - Handles mouse, touch, and keyboard interactions\n *\n * This module manages all user interactions with the chart including:\n * - Zoom (mouse wheel)\n * - Pan (mouse drag, touch drag)\n * - Cursor tracking\n */\n\nimport type { Bounds } from \"../types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface AxisLayout {\n id: string;\n position: 'left' | 'right';\n offset: number;\n}\n\nexport interface InteractionCallbacks {\n onZoom: (bounds: Bounds, axisId?: string) => void;\n onPan: (deltaX: number, deltaY: number, axisId?: string) => void;\n onBoxZoom: (\n rect: { x: number; y: number; width: number; height: number } | null\n ) => void;\n onCursorMove: (x: number, y: number) => void;\n onCursorLeave: () => void;\n}\n\nexport interface PlotAreaGetter {\n (): { x: number; y: number; width: number; height: number };\n}\n\nexport interface BoundsGetter {\n (axisId?: string): Bounds;\n}\n\nexport interface AxisLayoutGetter {\n (): AxisLayout[];\n}\n\n// ============================================\n// Interaction Manager Class\n// ============================================\n\nexport class InteractionManager {\n private container: HTMLElement;\n private callbacks: InteractionCallbacks;\n private getPlotArea: PlotAreaGetter;\n private getBounds: BoundsGetter;\n private getAxesLayout: AxisLayoutGetter;\n\n private isDragging = false;\n private panningAxisId?: string;\n private isBoxSelecting = false;\n private selectionStart = { x: 0, y: 0 };\n private lastMousePos = { x: 0, y: 0 };\n private isPanMode = true;\n\n // Bound handlers for cleanup\n private boundWheel: (e: WheelEvent) => void;\n private boundMouseDown: (e: MouseEvent) => void;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n private boundMouseLeave: (e: MouseEvent) => void;\n private boundTouchStart: (e: TouchEvent) => void;\n private boundTouchMove: (e: TouchEvent) => void;\n private boundTouchEnd: (e: TouchEvent) => void;\n\n constructor(\n container: HTMLElement,\n callbacks: InteractionCallbacks,\n getPlotArea: PlotAreaGetter,\n getBounds: BoundsGetter,\n getAxesLayout: AxisLayoutGetter\n ) {\n this.container = container;\n this.callbacks = callbacks;\n this.getPlotArea = getPlotArea;\n this.getBounds = getBounds;\n this.getAxesLayout = getAxesLayout;\n\n // Bind handlers\n this.boundWheel = this.handleWheel.bind(this);\n this.boundMouseDown = this.handleMouseDown.bind(this);\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundMouseUp = this.handleMouseUp.bind(this);\n this.boundMouseLeave = this.handleMouseLeave.bind(this);\n this.boundTouchStart = this.handleTouchStart.bind(this);\n this.boundTouchMove = this.handleTouchMove.bind(this);\n this.boundTouchEnd = this.handleTouchEnd.bind(this);\n\n this.attachListeners();\n }\n\n private attachListeners(): void {\n this.container.addEventListener(\"wheel\", this.boundWheel, {\n passive: false,\n });\n this.container.addEventListener(\"mousedown\", this.boundMouseDown);\n this.container.addEventListener(\"mousemove\", this.boundMouseMove);\n this.container.addEventListener(\"mouseup\", this.boundMouseUp);\n this.container.addEventListener(\"mouseleave\", this.boundMouseLeave);\n this.container.addEventListener(\"touchstart\", this.boundTouchStart);\n this.container.addEventListener(\"touchmove\", this.boundTouchMove);\n this.container.addEventListener(\"touchend\", this.boundTouchEnd);\n }\n\n private detachListeners(): void {\n this.container.removeEventListener(\"wheel\", this.boundWheel);\n this.container.removeEventListener(\"mousedown\", this.boundMouseDown);\n this.container.removeEventListener(\"mousemove\", this.boundMouseMove);\n this.container.removeEventListener(\"mouseup\", this.boundMouseUp);\n this.container.removeEventListener(\"mouseleave\", this.boundMouseLeave);\n this.container.removeEventListener(\"touchstart\", this.boundTouchStart);\n this.container.removeEventListener(\"touchmove\", this.boundTouchMove);\n this.container.removeEventListener(\"touchend\", this.boundTouchEnd);\n }\n\n public setPanMode(enabled: boolean): void {\n this.isPanMode = enabled;\n }\n\n // ----------------------------------------\n // Mouse Handlers\n // ----------------------------------------\n\n private handleWheel(e: WheelEvent): void {\n const plotArea = this.getPlotArea();\n if (plotArea.width <= 1 || plotArea.height <= 1) return;\n\n e.preventDefault();\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Determine zoom targets\n const axes = this.getAxesLayout();\n let zoomX = false;\n let zoomY = false;\n let targetAxisId: string | undefined = undefined;\n\n // Hit test Y axes\n for (const axis of axes) {\n const axisX = axis.position === 'left' \n ? plotArea.x - axis.offset \n : plotArea.x + plotArea.width + axis.offset;\n \n const hitWidth = 65; // Matches axis spacing\n const hitX = axis.position === 'left' ? axisX - hitWidth : axisX;\n\n if (\n mouseX >= hitX &&\n mouseX <= hitX + hitWidth &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n targetAxisId = axis.id;\n zoomY = true;\n zoomX = false;\n break;\n }\n }\n\n if (!targetAxisId) {\n // X Axis area (bottom)\n if (\n mouseY > plotArea.y + plotArea.height &&\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width\n ) {\n zoomX = true;\n }\n // Plot area (both)\n else if (\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n zoomX = true;\n zoomY = true;\n } else {\n return; // Outside interactive areas\n }\n }\n\n const bounds = this.getBounds(targetAxisId);\n const zoomFactor = e.deltaY > 0 ? 1.1 : 0.9;\n\n // Calculate zoom center in data coordinates\n const normalizedX = (mouseX - plotArea.x) / plotArea.width;\n const normalizedY = 1 - (mouseY - plotArea.y) / plotArea.height;\n\n const dataX = bounds.xMin + normalizedX * (bounds.xMax - bounds.xMin);\n const dataY = bounds.yMin + normalizedY * (bounds.yMax - bounds.yMin);\n\n // Limits\n const MIN_RANGE = 1e-12;\n const MAX_RANGE = 1e15;\n\n let nextXMin = zoomX\n ? dataX - (dataX - bounds.xMin) * zoomFactor\n : bounds.xMin;\n let nextXMax = zoomX\n ? dataX + (bounds.xMax - dataX) * zoomFactor\n : bounds.xMax;\n let nextYMin = zoomY\n ? dataY - (dataY - bounds.yMin) * zoomFactor\n : bounds.yMin;\n let nextYMax = zoomY\n ? dataY + (bounds.yMax - dataY) * zoomFactor\n : bounds.yMax;\n\n const nextXRange = nextXMax - nextXMin;\n const nextYRange = nextYMax - nextYMin;\n\n if (nextXRange < MIN_RANGE || nextXRange > MAX_RANGE) {\n nextXMin = bounds.xMin;\n nextXMax = bounds.xMax;\n }\n if (nextYRange < MIN_RANGE || nextYRange > MAX_RANGE) {\n nextYMin = bounds.yMin;\n nextYMax = bounds.yMax;\n }\n\n const newBounds: Bounds = {\n xMin: nextXMin,\n xMax: nextXMax,\n yMin: nextYMin,\n yMax: nextYMax,\n };\n\n this.callbacks.onZoom(newBounds, targetAxisId);\n }\n\n private handleMouseDown(e: MouseEvent): void {\n const plotArea = this.getPlotArea();\n if (plotArea.width <= 1 || plotArea.height <= 1) return;\n\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Check if mouse is in axis area for dragging\n const axes = this.getAxesLayout();\n for (const axis of axes) {\n const axisX = axis.position === 'left' \n ? plotArea.x - axis.offset \n : plotArea.x + plotArea.width + axis.offset;\n \n const hitWidth = 65;\n const hitX = axis.position === 'left' ? axisX - hitWidth : axisX;\n\n if (\n mouseX >= hitX &&\n mouseX <= hitX + hitWidth &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n this.isDragging = true;\n this.panningAxisId = axis.id;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"ns-resize\";\n return;\n }\n }\n\n // Check if mouse is in plot area\n if (\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n if (this.isPanMode) {\n this.isDragging = true;\n this.panningAxisId = undefined;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"grabbing\";\n } else {\n this.isBoxSelecting = true;\n this.selectionStart = { x: mouseX, y: mouseY };\n this.container.style.cursor = \"crosshair\";\n }\n }\n }\n\n private handleMouseMove(e: MouseEvent): void {\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Update cursor position\n this.callbacks.onCursorMove(mouseX, mouseY);\n\n if (this.isDragging) {\n const deltaX = e.clientX - this.lastMousePos.x;\n const deltaY = e.clientY - this.lastMousePos.y;\n this.callbacks.onPan(deltaX, deltaY, this.panningAxisId);\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n } else if (this.isBoxSelecting) {\n const x = Math.min(this.selectionStart.x, mouseX);\n const y = Math.min(this.selectionStart.y, mouseY);\n const width = Math.abs(mouseX - this.selectionStart.x);\n const height = Math.abs(mouseY - this.selectionStart.y);\n this.callbacks.onBoxZoom({ x, y, width, height });\n }\n }\n\n private handleMouseUp(): void {\n if (this.isBoxSelecting) {\n this.callbacks.onBoxZoom(null); // Signal to apply\n }\n this.isDragging = false;\n this.panningAxisId = undefined;\n this.isBoxSelecting = false;\n this.container.style.cursor = \"\";\n }\n\n private handleMouseLeave(): void {\n this.isDragging = false;\n this.panningAxisId = undefined;\n this.container.style.cursor = \"\";\n this.callbacks.onCursorLeave();\n }\n\n // ----------------------------------------\n // Touch Handlers\n // ----------------------------------------\n\n private handleTouchStart(e: TouchEvent): void {\n if (e.touches.length === 1) {\n const touch = e.touches[0];\n this.isDragging = true;\n this.panningAxisId = undefined;\n this.lastMousePos = { x: touch.clientX, y: touch.clientY };\n }\n }\n\n private handleTouchMove(e: TouchEvent): void {\n if (!this.isDragging || e.touches.length !== 1) return;\n\n e.preventDefault();\n\n const touch = e.touches[0];\n const deltaX = touch.clientX - this.lastMousePos.x;\n const deltaY = touch.clientY - this.lastMousePos.y;\n\n this.callbacks.onPan(deltaX, deltaY, this.panningAxisId);\n\n this.lastMousePos = { x: touch.clientX, y: touch.clientY };\n }\n\n private handleTouchEnd(): void {\n this.isDragging = false;\n this.panningAxisId = undefined;\n }\n\n // ----------------------------------------\n // Cleanup\n // ----------------------------------------\n\n destroy(): void {\n this.detachListeners();\n }\n}\n","/**\n * ChartStatistics - In-chart statistics panel\n * \n * Displays real-time statistics (Min, Max, Mean, StdDev, Area) \n * for the visible data range of active series.\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\nimport { calculateStats, integrate } from \"../analysis\";\nimport { Bounds } from \"../types\";\n\nexport class ChartStatistics {\n private container: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Map<string, Series>;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n series: Map<string, Series>\n ) {\n this.theme = theme;\n this.series = series;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"scichart-stats-panel\";\n this.updateContainerStyle();\n\n const title = document.createElement(\"div\");\n title.innerHTML = \"📊 Statistics\";\n title.style.cssText = `\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n `;\n title.onclick = () => this.toggle();\n\n this.content = document.createElement(\"div\");\n this.content.style.display = \"none\";\n \n this.container.appendChild(title);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return name.includes(\"dark\") || name.includes(\"midnight\") || name.includes(\"electro\");\n }\n\n private updateContainerStyle(): void {\n const isDark = this.isDarkTheme();\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const color = isDark ? \"#f1f5f9\" : \"#1e293b\";\n const borderColor = isDark ? \"rgba(255, 255, 255, 0.1)\" : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark ? \"0 4px 12px rgba(0, 0, 0, 0.5)\" : \"0 4px 12px rgba(0, 0, 0, 0.1)\";\n\n this.container.style.cssText = `\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 240px;\n background: ${bg};\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n color: ${color};\n font-family: system-ui, -apple-system, sans-serif;\n padding: 8px 12px;\n z-index: 90;\n transition: all 0.3s ease;\n font-size: 12px;\n pointer-events: auto;\n `;\n }\n\n public update(viewBounds: Bounds): void {\n if (!this.isExpanded) return;\n\n this.content.innerHTML = \"\";\n \n this.series.forEach((s) => {\n if (!s.getVisible()) return;\n\n const data = s.getData();\n if (!data) return;\n\n // Filter data in visible range\n const visibleY: number[] = [];\n const visibleX: number[] = [];\n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= viewBounds.xMin && data.x[i] <= viewBounds.xMax) {\n visibleX.push(data.x[i]);\n visibleY.push(data.y[i]);\n }\n }\n\n if (visibleY.length === 0) return;\n\n const stats = calculateStats(visibleY);\n const area = integrate(visibleX as any, visibleY as any);\n const style = s.getStyle();\n\n const item = document.createElement(\"div\");\n item.style.cssText = `\n padding: 8px 0;\n border-top: 1px solid ${this.isDarkTheme() ? \"rgba(255,255,255,0.05)\" : \"rgba(0,0,0,0.05)\"};\n `;\n\n item.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-weight: 600;\">\n <div style=\"width: 8px; height: 8px; border-radius: 2px; background: ${style.color}\"></div>\n ${s.getId()}\n </div>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0.9; font-size: 11px;\">\n <span>Min: ${stats.min.toExponential(3)}</span>\n <span>Max: ${stats.max.toExponential(3)}</span>\n <span>Mean: ${stats.mean.toExponential(3)}</span>\n <span>Count: ${stats.count}</span>\n <span style=\"grid-column: span 2;\">Area: ${area.toExponential(4)}</span>\n </div>\n `;\n\n this.content.appendChild(item);\n });\n\n if (this.content.innerHTML === \"\") {\n this.content.innerHTML = \"<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>\";\n }\n }\n\n public toggle(): void {\n this.isExpanded = !this.isExpanded;\n this.content.style.display = this.isExpanded ? \"block\" : \"none\";\n if (this.isExpanded) {\n // Redraw immediately will be handled by the chart's next render\n }\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateContainerStyle();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * AnnotationManager - Manages chart annotations\n * \n * Handles creation, update, removal, and rendering of all annotation types.\n */\n\nimport type { Bounds } from '../../types';\nimport type {\n Annotation,\n HorizontalLineAnnotation,\n VerticalLineAnnotation,\n RectangleAnnotation,\n BandAnnotation,\n TextAnnotation,\n ArrowAnnotation,\n} from './types';\n\n// ============================================\n// Default Styles\n// ============================================\n\nconst DEFAULT_STYLES = {\n line: {\n color: 'rgba(255, 255, 255, 0.7)',\n lineWidth: 1,\n lineDash: [] as number[],\n },\n rectangle: {\n fillColor: 'rgba(100, 100, 255, 0.2)',\n strokeColor: 'rgba(100, 100, 255, 0.5)',\n strokeWidth: 1,\n },\n text: {\n fontSize: 12,\n fontFamily: 'Inter, system-ui, sans-serif',\n color: '#ffffff',\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n padding: 4,\n },\n arrow: {\n color: 'rgba(255, 255, 255, 0.7)',\n lineWidth: 2,\n headSize: 10,\n },\n};\n\n// ============================================\n// Plot Area Type\n// ============================================\n\nexport interface PlotArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n// ============================================\n// AnnotationManager Class\n// ============================================\n\nexport class AnnotationManager {\n private annotations: Map<string, Annotation> = new Map();\n private idCounter = 0;\n \n // ----------------------------------------\n // CRUD Operations\n // ----------------------------------------\n \n /**\n * Add a new annotation\n * @returns The annotation ID\n */\n add(annotation: Annotation): string {\n const id = annotation.id ?? `annotation-${++this.idCounter}`;\n const resolved: Annotation = {\n ...annotation,\n id,\n visible: annotation.visible ?? true,\n interactive: annotation.interactive ?? false,\n zIndex: annotation.zIndex ?? 0,\n };\n \n this.annotations.set(id, resolved);\n return id;\n }\n \n /**\n * Remove an annotation by ID\n */\n remove(id: string): boolean {\n return this.annotations.delete(id);\n }\n \n /**\n * Update an annotation\n */\n update(id: string, updates: Partial<Annotation>): void {\n const existing = this.annotations.get(id);\n if (existing) {\n this.annotations.set(id, { ...existing, ...updates } as Annotation);\n }\n }\n \n /**\n * Get an annotation by ID\n */\n get(id: string): Annotation | undefined {\n return this.annotations.get(id);\n }\n \n /**\n * Get all annotations\n */\n getAll(): Annotation[] {\n return Array.from(this.annotations.values());\n }\n \n /**\n * Clear all annotations\n */\n clear(): void {\n this.annotations.clear();\n }\n \n /**\n * Get count of annotations\n */\n get count(): number {\n return this.annotations.size;\n }\n \n // ----------------------------------------\n // Rendering\n // ----------------------------------------\n \n /**\n * Render all annotations\n */\n render(\n ctx: CanvasRenderingContext2D,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n // Sort by zIndex\n const sorted = this.getAll()\n .filter(a => a.visible !== false)\n .sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));\n \n ctx.save();\n \n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n \n for (const annotation of sorted) {\n this.renderAnnotation(ctx, annotation, plotArea, bounds);\n }\n \n ctx.restore();\n }\n \n private renderAnnotation(\n ctx: CanvasRenderingContext2D,\n annotation: Annotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n switch (annotation.type) {\n case 'horizontal-line':\n this.renderHorizontalLine(ctx, annotation, plotArea, bounds);\n break;\n case 'vertical-line':\n this.renderVerticalLine(ctx, annotation, plotArea, bounds);\n break;\n case 'rectangle':\n this.renderRectangle(ctx, annotation, plotArea, bounds);\n break;\n case 'band':\n this.renderBand(ctx, annotation, plotArea, bounds);\n break;\n case 'text':\n this.renderText(ctx, annotation, plotArea, bounds);\n break;\n case 'arrow':\n this.renderArrow(ctx, annotation, plotArea, bounds);\n break;\n }\n }\n \n // ----------------------------------------\n // Coordinate Conversion\n // ----------------------------------------\n \n private dataToPixelX(value: number, bounds: Bounds, plotArea: PlotArea): number {\n const normalized = (value - bounds.xMin) / (bounds.xMax - bounds.xMin);\n return plotArea.x + normalized * plotArea.width;\n }\n \n private dataToPixelY(value: number, bounds: Bounds, plotArea: PlotArea): number {\n const normalized = (value - bounds.yMin) / (bounds.yMax - bounds.yMin);\n return plotArea.y + plotArea.height * (1 - normalized);\n }\n \n // ----------------------------------------\n // Render: Horizontal Line\n // ----------------------------------------\n \n private renderHorizontalLine(\n ctx: CanvasRenderingContext2D,\n annotation: HorizontalLineAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const y = this.dataToPixelY(annotation.y, bounds, plotArea);\n \n // Skip if outside visible area\n if (y < plotArea.y || y > plotArea.y + plotArea.height) return;\n \n const xStart = annotation.xMin !== undefined \n ? Math.max(this.dataToPixelX(annotation.xMin, bounds, plotArea), plotArea.x)\n : plotArea.x;\n const xEnd = annotation.xMax !== undefined\n ? Math.min(this.dataToPixelX(annotation.xMax, bounds, plotArea), plotArea.x + plotArea.width)\n : plotArea.x + plotArea.width;\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.line.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.line.lineWidth;\n ctx.setLineDash(annotation.lineDash ?? DEFAULT_STYLES.line.lineDash);\n \n ctx.beginPath();\n ctx.moveTo(xStart, y);\n ctx.lineTo(xEnd, y);\n ctx.stroke();\n \n // Render label if present\n if (annotation.label) {\n this.renderLineLabel(\n ctx, \n annotation.label, \n xStart, xEnd, y, \n annotation.labelPosition ?? 'right',\n 'horizontal',\n annotation.labelBackground\n );\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Vertical Line\n // ----------------------------------------\n \n private renderVerticalLine(\n ctx: CanvasRenderingContext2D,\n annotation: VerticalLineAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x = this.dataToPixelX(annotation.x, bounds, plotArea);\n \n // Skip if outside visible area\n if (x < plotArea.x || x > plotArea.x + plotArea.width) return;\n \n const yStart = annotation.yMin !== undefined\n ? Math.min(this.dataToPixelY(annotation.yMin, bounds, plotArea), plotArea.y + plotArea.height)\n : plotArea.y;\n const yEnd = annotation.yMax !== undefined\n ? Math.max(this.dataToPixelY(annotation.yMax, bounds, plotArea), plotArea.y)\n : plotArea.y + plotArea.height;\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.line.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.line.lineWidth;\n ctx.setLineDash(annotation.lineDash ?? DEFAULT_STYLES.line.lineDash);\n \n ctx.beginPath();\n ctx.moveTo(x, yStart);\n ctx.lineTo(x, yEnd);\n ctx.stroke();\n \n // Render label if present\n if (annotation.label) {\n this.renderLineLabel(\n ctx,\n annotation.label,\n yStart, yEnd, x,\n annotation.labelPosition ?? 'top',\n 'vertical',\n annotation.labelBackground\n );\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Rectangle\n // ----------------------------------------\n \n private renderRectangle(\n ctx: CanvasRenderingContext2D,\n annotation: RectangleAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x1 = this.dataToPixelX(annotation.xMin, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.xMax, bounds, plotArea);\n const y1 = this.dataToPixelY(annotation.yMax, bounds, plotArea); // Note: Y is inverted\n const y2 = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n \n const x = Math.min(x1, x2);\n const y = Math.min(y1, y2);\n const width = Math.abs(x2 - x1);\n const height = Math.abs(y2 - y1);\n \n ctx.save();\n \n // Fill\n if (annotation.fillColor) {\n ctx.fillStyle = annotation.fillColor;\n ctx.fillRect(x, y, width, height);\n }\n \n // Stroke\n if (annotation.strokeColor) {\n ctx.strokeStyle = annotation.strokeColor;\n ctx.lineWidth = annotation.strokeWidth ?? DEFAULT_STYLES.rectangle.strokeWidth;\n ctx.setLineDash(annotation.strokeDash ?? []);\n ctx.strokeRect(x, y, width, height);\n }\n \n // Label\n if (annotation.label) {\n this.renderCenteredLabel(ctx, annotation.label, x + width / 2, y + height / 2);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Band\n // ----------------------------------------\n \n private renderBand(\n ctx: CanvasRenderingContext2D,\n annotation: BandAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n // Determine band type and calculate bounds\n let x: number, y: number, width: number, height: number;\n \n if (annotation.xMin !== undefined && annotation.xMax !== undefined) {\n // Vertical band (spans full Y)\n const x1 = this.dataToPixelX(annotation.xMin, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.xMax, bounds, plotArea);\n x = Math.min(x1, x2);\n width = Math.abs(x2 - x1);\n y = plotArea.y;\n height = plotArea.height;\n \n if (annotation.yMin !== undefined) {\n const yPixel = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n height = yPixel - y;\n }\n if (annotation.yMax !== undefined) {\n const yPixel = this.dataToPixelY(annotation.yMax, bounds, plotArea);\n y = yPixel;\n height = plotArea.y + plotArea.height - y;\n }\n } else if (annotation.yMin !== undefined && annotation.yMax !== undefined) {\n // Horizontal band (spans full X)\n const y1 = this.dataToPixelY(annotation.yMax, bounds, plotArea);\n const y2 = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n y = Math.min(y1, y2);\n height = Math.abs(y2 - y1);\n x = plotArea.x;\n width = plotArea.width;\n } else {\n // Invalid band configuration\n return;\n }\n \n ctx.save();\n \n // Fill\n ctx.fillStyle = annotation.fillColor ?? DEFAULT_STYLES.rectangle.fillColor;\n ctx.fillRect(x, y, width, height);\n \n // Stroke\n if (annotation.strokeColor) {\n ctx.strokeStyle = annotation.strokeColor;\n ctx.lineWidth = annotation.strokeWidth ?? 1;\n ctx.strokeRect(x, y, width, height);\n }\n \n // Label\n if (annotation.label) {\n let labelX = x + width / 2;\n let labelY = y + height / 2;\n \n switch (annotation.labelPosition) {\n case 'top':\n labelY = y + 15;\n break;\n case 'bottom':\n labelY = y + height - 5;\n break;\n case 'left':\n labelX = x + 10;\n break;\n case 'right':\n labelX = x + width - 10;\n break;\n }\n \n this.renderCenteredLabel(ctx, annotation.label, labelX, labelY);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Text\n // ----------------------------------------\n \n private renderText(\n ctx: CanvasRenderingContext2D,\n annotation: TextAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x = this.dataToPixelX(annotation.x, bounds, plotArea);\n const y = this.dataToPixelY(annotation.y, bounds, plotArea);\n \n ctx.save();\n \n // Apply rotation if specified\n if (annotation.rotation) {\n ctx.translate(x, y);\n ctx.rotate((annotation.rotation * Math.PI) / 180);\n ctx.translate(-x, -y);\n }\n \n const fontSize = annotation.fontSize ?? DEFAULT_STYLES.text.fontSize;\n const fontFamily = annotation.fontFamily ?? DEFAULT_STYLES.text.fontFamily;\n const fontWeight = annotation.fontWeight ?? 'normal';\n \n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n // Measure text for background\n const metrics = ctx.measureText(annotation.text);\n const padding = annotation.padding ?? DEFAULT_STYLES.text.padding;\n const textWidth = metrics.width + padding * 2;\n const textHeight = fontSize + padding * 2;\n \n // Calculate position based on anchor\n let drawX = x;\n let drawY = y;\n \n switch (annotation.anchor) {\n case 'top-left':\n drawX += textWidth / 2;\n drawY += textHeight / 2;\n break;\n case 'top-right':\n drawX -= textWidth / 2;\n drawY += textHeight / 2;\n break;\n case 'bottom-left':\n drawX += textWidth / 2;\n drawY -= textHeight / 2;\n break;\n case 'bottom-right':\n drawX -= textWidth / 2;\n drawY -= textHeight / 2;\n break;\n case 'top-center':\n drawY += textHeight / 2;\n break;\n case 'bottom-center':\n drawY -= textHeight / 2;\n break;\n case 'left-center':\n drawX += textWidth / 2;\n break;\n case 'right-center':\n drawX -= textWidth / 2;\n break;\n }\n \n // Draw background\n if (annotation.backgroundColor) {\n ctx.fillStyle = annotation.backgroundColor;\n ctx.beginPath();\n ctx.roundRect(\n drawX - textWidth / 2,\n drawY - textHeight / 2,\n textWidth,\n textHeight,\n 4\n );\n ctx.fill();\n }\n \n // Draw text\n ctx.fillStyle = annotation.color ?? DEFAULT_STYLES.text.color;\n ctx.fillText(annotation.text, drawX, drawY);\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Arrow\n // ----------------------------------------\n \n private renderArrow(\n ctx: CanvasRenderingContext2D,\n annotation: ArrowAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x1 = this.dataToPixelX(annotation.x1, bounds, plotArea);\n const y1 = this.dataToPixelY(annotation.y1, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.x2, bounds, plotArea);\n const y2 = this.dataToPixelY(annotation.y2, bounds, plotArea);\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.arrow.color;\n ctx.fillStyle = annotation.color ?? DEFAULT_STYLES.arrow.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.arrow.lineWidth;\n \n // Draw line\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n \n // Draw arrow head\n const headSize = annotation.headSize ?? DEFAULT_STYLES.arrow.headSize;\n const angle = Math.atan2(y2 - y1, x2 - x1);\n \n const headStyle = annotation.headStyle ?? 'filled';\n \n if (headStyle !== 'none') {\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(\n x2 - headSize * Math.cos(angle - Math.PI / 6),\n y2 - headSize * Math.sin(angle - Math.PI / 6)\n );\n \n if (headStyle === 'filled') {\n ctx.lineTo(\n x2 - headSize * Math.cos(angle + Math.PI / 6),\n y2 - headSize * Math.sin(angle + Math.PI / 6)\n );\n ctx.closePath();\n ctx.fill();\n } else {\n ctx.moveTo(x2, y2);\n ctx.lineTo(\n x2 - headSize * Math.cos(angle + Math.PI / 6),\n y2 - headSize * Math.sin(angle + Math.PI / 6)\n );\n ctx.stroke();\n }\n }\n \n // Draw tail arrow if specified\n if (annotation.showTail) {\n const tailAngle = angle + Math.PI;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(\n x1 - headSize * Math.cos(tailAngle - Math.PI / 6),\n y1 - headSize * Math.sin(tailAngle - Math.PI / 6)\n );\n ctx.lineTo(\n x1 - headSize * Math.cos(tailAngle + Math.PI / 6),\n y1 - headSize * Math.sin(tailAngle + Math.PI / 6)\n );\n ctx.closePath();\n ctx.fill();\n }\n \n // Draw label if present\n if (annotation.label) {\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n this.renderCenteredLabel(ctx, annotation.label, midX, midY - 10);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Helper: Render Labels\n // ----------------------------------------\n \n private renderLineLabel(\n ctx: CanvasRenderingContext2D,\n label: string,\n start: number,\n end: number,\n cross: number,\n position: string,\n orientation: 'horizontal' | 'vertical',\n backgroundColor?: string\n ): void {\n ctx.save();\n \n ctx.font = `${DEFAULT_STYLES.text.fontSize}px ${DEFAULT_STYLES.text.fontFamily}`;\n const metrics = ctx.measureText(label);\n const padding = 4;\n const textWidth = metrics.width + padding * 2;\n const textHeight = DEFAULT_STYLES.text.fontSize + padding * 2;\n \n let x: number, y: number;\n \n if (orientation === 'horizontal') {\n y = cross;\n \n switch (position) {\n case 'left':\n x = start + 5;\n ctx.textAlign = 'left';\n break;\n case 'right':\n x = end - 5;\n ctx.textAlign = 'right';\n break;\n default:\n x = (start + end) / 2;\n ctx.textAlign = 'center';\n }\n \n ctx.textBaseline = 'bottom';\n y -= 4;\n } else {\n x = cross;\n \n switch (position) {\n case 'top':\n y = start + textHeight;\n break;\n case 'bottom':\n y = end - 5;\n break;\n default:\n y = (start + end) / 2;\n }\n \n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n \n // Background\n if (backgroundColor ?? true) {\n ctx.fillStyle = backgroundColor ?? 'rgba(0, 0, 0, 0.7)';\n const bgX = ctx.textAlign === 'left' ? x - padding \n : ctx.textAlign === 'right' ? x - textWidth + padding\n : x - textWidth / 2;\n ctx.fillRect(bgX, y - textHeight + padding, textWidth, textHeight);\n }\n \n // Text\n ctx.fillStyle = DEFAULT_STYLES.text.color;\n ctx.fillText(label, x, y);\n \n ctx.restore();\n }\n \n private renderCenteredLabel(\n ctx: CanvasRenderingContext2D,\n label: string,\n x: number,\n y: number\n ): void {\n ctx.save();\n \n ctx.font = `${DEFAULT_STYLES.text.fontSize}px ${DEFAULT_STYLES.text.fontFamily}`;\n const metrics = ctx.measureText(label);\n const padding = 4;\n const textWidth = metrics.width + padding * 2;\n const textHeight = DEFAULT_STYLES.text.fontSize + padding * 2;\n \n // Background\n ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';\n ctx.beginPath();\n ctx.roundRect(x - textWidth / 2, y - textHeight / 2, textWidth, textHeight, 3);\n ctx.fill();\n \n // Text\n ctx.fillStyle = DEFAULT_STYLES.text.color;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(label, x, y);\n \n ctx.restore();\n }\n}\n","/**\n * Tooltip Themes - Predefined visual styles for tooltips\n * \n * This module provides beautiful, high-quality tooltip themes that\n * integrate seamlessly with the chart theme system.\n * \n * @module tooltip/themes\n */\n\nimport type { TooltipTheme } from './types';\n\n// ============================================\n// Base Defaults\n// ============================================\n\nconst DEFAULT_PADDING = {\n top: 10,\n right: 12,\n bottom: 10,\n left: 12\n};\n\n// ============================================\n// Dark Theme\n// ============================================\n\n/**\n * Dark Theme - Elegant dark tooltip with subtle glow\n */\nexport const TOOLTIP_DARK_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(15, 18, 25, 0.95)',\n backgroundGradient: 'rgba(25, 30, 40, 0.90)',\n borderColor: 'rgba(255, 255, 255, 0.12)',\n borderWidth: 1,\n borderRadius: 8,\n backdropBlur: 12,\n shadow: {\n color: 'rgba(0, 0, 0, 0.4)',\n offsetX: 0,\n offsetY: 4,\n blur: 16\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, sans-serif',\n textColor: '#ffffff',\n textSecondaryColor: 'rgba(255, 255, 255, 0.6)',\n titleFontSize: 12,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.4,\n \n // Spacing\n padding: DEFAULT_PADDING,\n itemGap: 4,\n headerGap: 8,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 8,\n showHeaderSeparator: true,\n separatorColor: 'rgba(255, 255, 255, 0.1)',\n showArrow: true,\n arrowSize: 6\n};\n\n// ============================================\n// Light Theme\n// ============================================\n\n/**\n * Light Theme - Clean and professional for light backgrounds\n */\nexport const TOOLTIP_LIGHT_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(255, 255, 255, 0.98)',\n borderColor: 'rgba(0, 0, 0, 0.12)',\n borderWidth: 1,\n borderRadius: 8,\n backdropBlur: 8,\n shadow: {\n color: 'rgba(0, 0, 0, 0.12)',\n offsetX: 0,\n offsetY: 4,\n blur: 12\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, sans-serif',\n textColor: '#1a1a1a',\n textSecondaryColor: 'rgba(0, 0, 0, 0.55)',\n titleFontSize: 12,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.4,\n \n // Spacing\n padding: DEFAULT_PADDING,\n itemGap: 4,\n headerGap: 8,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 8,\n showHeaderSeparator: true,\n separatorColor: 'rgba(0, 0, 0, 0.08)',\n showArrow: true,\n arrowSize: 6\n};\n\n// ============================================\n// Glassmorphism Theme\n// ============================================\n\n/**\n * Glassmorphism Theme - Modern frosted glass effect\n */\nexport const TOOLTIP_GLASS_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n backgroundGradient: 'rgba(255, 255, 255, 0.04)',\n borderColor: 'rgba(255, 255, 255, 0.2)',\n borderWidth: 1,\n borderRadius: 12,\n backdropBlur: 20,\n shadow: {\n color: 'rgba(0, 0, 0, 0.3)',\n offsetX: 0,\n offsetY: 8,\n blur: 32\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, sans-serif',\n textColor: 'rgba(255, 255, 255, 0.95)',\n textSecondaryColor: 'rgba(255, 255, 255, 0.6)',\n titleFontSize: 12,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.5,\n \n // Spacing\n padding: { top: 12, right: 14, bottom: 12, left: 14 },\n itemGap: 5,\n headerGap: 10,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 8,\n showHeaderSeparator: true,\n separatorColor: 'rgba(255, 255, 255, 0.15)',\n showArrow: true,\n arrowSize: 7\n};\n\n// ============================================\n// Midnight Theme\n// ============================================\n\n/**\n * Midnight Theme - Deep blue tones for night mode\n */\nexport const TOOLTIP_MIDNIGHT_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(10, 15, 30, 0.95)',\n backgroundGradient: 'rgba(20, 25, 50, 0.90)',\n borderColor: 'rgba(100, 120, 255, 0.25)',\n borderWidth: 1,\n borderRadius: 8,\n backdropBlur: 15,\n shadow: {\n color: 'rgba(50, 70, 150, 0.25)',\n offsetX: 0,\n offsetY: 4,\n blur: 20\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, sans-serif',\n textColor: '#e0e8ff',\n textSecondaryColor: 'rgba(180, 190, 255, 0.6)',\n titleFontSize: 12,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.4,\n \n // Spacing\n padding: DEFAULT_PADDING,\n itemGap: 4,\n headerGap: 8,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 8,\n showHeaderSeparator: true,\n separatorColor: 'rgba(100, 120, 255, 0.15)',\n showArrow: true,\n arrowSize: 6\n};\n\n// ============================================\n// Electrochemistry Theme\n// ============================================\n\n/**\n * Electrochemistry Theme - Professional blue tones for scientific data\n */\nexport const TOOLTIP_ELECTROCHEM_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(8, 20, 40, 0.96)',\n backgroundGradient: 'rgba(15, 35, 60, 0.92)',\n borderColor: 'rgba(30, 136, 229, 0.35)',\n borderWidth: 1,\n borderRadius: 6,\n backdropBlur: 10,\n shadow: {\n color: 'rgba(30, 136, 229, 0.2)',\n offsetX: 0,\n offsetY: 4,\n blur: 16\n },\n \n // Typography\n fontFamily: '\"JetBrains Mono\", \"Fira Code\", monospace',\n textColor: '#bbdefb',\n textSecondaryColor: 'rgba(144, 202, 249, 0.7)',\n titleFontSize: 11,\n titleFontWeight: 600,\n contentFontSize: 11,\n lineHeight: 1.5,\n \n // Spacing\n padding: { top: 8, right: 10, bottom: 8, left: 10 },\n itemGap: 3,\n headerGap: 6,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 6,\n showHeaderSeparator: true,\n separatorColor: 'rgba(30, 136, 229, 0.2)',\n showArrow: true,\n arrowSize: 5\n};\n\n// ============================================\n// Neon Theme\n// ============================================\n\n/**\n * Neon Theme - Vibrant glowing effect for futuristic UIs\n */\nexport const TOOLTIP_NEON_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(0, 0, 0, 0.92)',\n borderColor: '#00ffff',\n borderWidth: 1,\n borderRadius: 4,\n backdropBlur: 0,\n shadow: {\n color: 'rgba(0, 255, 255, 0.35)',\n offsetX: 0,\n offsetY: 0,\n blur: 20\n },\n \n // Typography\n fontFamily: '\"Orbitron\", \"Exo 2\", sans-serif',\n textColor: '#00ffff',\n textSecondaryColor: 'rgba(0, 255, 255, 0.6)',\n titleFontSize: 11,\n titleFontWeight: 700,\n contentFontSize: 10,\n lineHeight: 1.4,\n \n // Spacing\n padding: { top: 8, right: 12, bottom: 8, left: 12 },\n itemGap: 4,\n headerGap: 6,\n \n // Decorations\n showSeriesIndicator: true,\n seriesIndicatorSize: 6,\n showHeaderSeparator: true,\n separatorColor: 'rgba(0, 255, 255, 0.3)',\n showArrow: false,\n arrowSize: 0\n};\n\n// ============================================\n// Minimal Theme\n// ============================================\n\n/**\n * Minimal Theme - Ultra-compact with no decorations\n */\nexport const TOOLTIP_MINIMAL_THEME: TooltipTheme = {\n // Container\n backgroundColor: 'rgba(30, 35, 45, 0.9)',\n borderColor: 'transparent',\n borderWidth: 0,\n borderRadius: 4,\n backdropBlur: 8,\n shadow: {\n color: 'rgba(0, 0, 0, 0.3)',\n offsetX: 0,\n offsetY: 2,\n blur: 8\n },\n \n // Typography\n fontFamily: 'Inter, system-ui, sans-serif',\n textColor: '#ffffff',\n textSecondaryColor: 'rgba(255, 255, 255, 0.7)',\n titleFontSize: 10,\n titleFontWeight: 500,\n contentFontSize: 10,\n lineHeight: 1.3,\n \n // Spacing\n padding: { top: 6, right: 8, bottom: 6, left: 8 },\n itemGap: 2,\n headerGap: 4,\n \n // Decorations\n showSeriesIndicator: false,\n seriesIndicatorSize: 0,\n showHeaderSeparator: false,\n separatorColor: 'transparent',\n showArrow: false,\n arrowSize: 0\n};\n\n// ============================================\n// Theme Utilities\n// ============================================\n\n/** Available tooltip theme names */\nexport type TooltipThemeName = \n | 'dark' \n | 'light' \n | 'glass' \n | 'midnight' \n | 'electrochemistry' \n | 'neon' \n | 'minimal';\n\n/** Theme registry */\nexport const TOOLTIP_THEMES: Record<TooltipThemeName, TooltipTheme> = {\n dark: TOOLTIP_DARK_THEME,\n light: TOOLTIP_LIGHT_THEME,\n glass: TOOLTIP_GLASS_THEME,\n midnight: TOOLTIP_MIDNIGHT_THEME,\n electrochemistry: TOOLTIP_ELECTROCHEM_THEME,\n neon: TOOLTIP_NEON_THEME,\n minimal: TOOLTIP_MINIMAL_THEME\n};\n\n/**\n * Get a tooltip theme by name\n */\nexport function getTooltipTheme(name: TooltipThemeName | string): TooltipTheme {\n const theme = TOOLTIP_THEMES[name as TooltipThemeName];\n if (!theme) {\n console.warn(`[Tooltip] Unknown theme \"${name}\", using dark`);\n return TOOLTIP_DARK_THEME;\n }\n return theme;\n}\n\n/**\n * Create a custom tooltip theme by merging with a base theme\n */\nexport function createTooltipTheme(\n base: TooltipTheme | TooltipThemeName,\n overrides: Partial<TooltipTheme>\n): TooltipTheme {\n const baseTheme = typeof base === 'string' ? getTooltipTheme(base) : base;\n \n return {\n ...baseTheme,\n ...overrides,\n padding: { ...baseTheme.padding, ...overrides.padding },\n shadow: { ...baseTheme.shadow, ...overrides.shadow }\n };\n}\n\n/**\n * Map chart theme name to matching tooltip theme\n */\nexport function getTooltipThemeForChartTheme(chartThemeName: string): TooltipTheme {\n switch (chartThemeName.toLowerCase()) {\n case 'light':\n return TOOLTIP_LIGHT_THEME;\n case 'midnight':\n return TOOLTIP_MIDNIGHT_THEME;\n case 'electrochemistry':\n case 'electrochem':\n return TOOLTIP_ELECTROCHEM_THEME;\n case 'dark':\n default:\n return TOOLTIP_DARK_THEME;\n }\n}\n\n/** Default tooltip theme */\nexport const DEFAULT_TOOLTIP_THEME = TOOLTIP_DARK_THEME;\n","/**\n * Tooltip Positioner - Smart positioning algorithms\n * \n * Handles intelligent tooltip positioning with:\n * - Automatic edge avoidance\n * - Flipping when space is limited\n * - Arrow positioning\n * - Constraint handling\n * \n * @module tooltip/TooltipPositioner\n */\n\nimport type { PlotArea } from '../../types';\nimport type {\n TooltipPosition,\n TooltipMeasurement,\n TooltipPlacement,\n ArrowPosition\n} from './types';\n\nexport interface PositionerConfig {\n /** Offset from target point */\n offset: { x: number; y: number };\n /** Preferred placement */\n preferredPosition: TooltipPlacement;\n /** Keep within plot area */\n constrainToPlotArea: boolean;\n /** Keep within container */\n constrainToContainer: boolean;\n /** Flip if not enough space */\n autoFlip: boolean;\n /** Show arrow pointing to target */\n showArrow: boolean;\n /** Arrow size */\n arrowSize: number;\n}\n\nexport const DEFAULT_POSITIONER_CONFIG: PositionerConfig = {\n offset: { x: 12, y: 12 },\n preferredPosition: 'auto',\n constrainToPlotArea: true,\n constrainToContainer: true,\n autoFlip: true,\n showArrow: true,\n arrowSize: 6\n};\n\n/**\n * TooltipPositioner calculates optimal tooltip positions\n */\nexport class TooltipPositioner {\n private config: PositionerConfig;\n private containerWidth: number = 0;\n private containerHeight: number = 0;\n private plotArea: PlotArea | null = null;\n\n constructor(config: Partial<PositionerConfig> = {}) {\n this.config = { ...DEFAULT_POSITIONER_CONFIG, ...config };\n }\n\n /**\n * Update container dimensions\n */\n setContainerSize(width: number, height: number): void {\n this.containerWidth = width;\n this.containerHeight = height;\n }\n\n /**\n * Update plot area bounds\n */\n setPlotArea(plotArea: PlotArea): void {\n this.plotArea = plotArea;\n }\n\n /**\n * Update configuration\n */\n configure(config: Partial<PositionerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Calculate optimal tooltip position\n * \n * @param targetX - Target X coordinate (where tooltip points to)\n * @param targetY - Target Y coordinate\n * @param measurement - Tooltip dimensions\n * @returns Calculated position with arrow configuration\n */\n calculatePosition(\n targetX: number,\n targetY: number,\n measurement: TooltipMeasurement\n ): TooltipPosition {\n const { offset, preferredPosition, autoFlip, showArrow, arrowSize } = this.config;\n \n // Total dimensions including padding\n const totalWidth = measurement.width + measurement.padding.left + measurement.padding.right;\n const totalHeight = measurement.height + measurement.padding.top + measurement.padding.bottom;\n \n // Determine best position\n let position = this.determinePosition(\n targetX, \n targetY, \n totalWidth, \n totalHeight, \n preferredPosition\n );\n \n // Calculate initial coordinates based on position\n let { x, y, arrowPosition } = this.calculateCoordinates(\n targetX,\n targetY,\n totalWidth,\n totalHeight,\n position,\n offset,\n showArrow ? arrowSize : 0\n );\n \n let wasFlipped = false;\n \n // Check if we need to flip\n if (autoFlip && !this.fitsInBounds(x, y, totalWidth, totalHeight)) {\n const flippedPosition = this.flipPosition(position);\n const flipped = this.calculateCoordinates(\n targetX,\n targetY,\n totalWidth,\n totalHeight,\n flippedPosition,\n offset,\n showArrow ? arrowSize : 0\n );\n \n // Use flipped if it fits better\n if (this.fitsInBounds(flipped.x, flipped.y, totalWidth, totalHeight)) {\n x = flipped.x;\n y = flipped.y;\n arrowPosition = flipped.arrowPosition;\n wasFlipped = true;\n }\n }\n \n // Constrain to bounds\n const constrained = this.constrainToBounds(x, y, totalWidth, totalHeight);\n \n // Calculate arrow offset based on how much we shifted\n let arrowOffset = 0;\n if (showArrow) {\n if (arrowPosition === 'top' || arrowPosition === 'bottom') {\n // Arrow on horizontal edge - calculate X offset\n const idealArrowX = targetX - constrained.x;\n arrowOffset = Math.max(arrowSize + 4, Math.min(totalWidth - arrowSize - 4, idealArrowX));\n } else if (arrowPosition === 'left' || arrowPosition === 'right') {\n // Arrow on vertical edge - calculate Y offset \n const idealArrowY = targetY - constrained.y;\n arrowOffset = Math.max(arrowSize + 4, Math.min(totalHeight - arrowSize - 4, idealArrowY));\n }\n }\n \n return {\n x: constrained.x,\n y: constrained.y,\n arrowPosition: showArrow ? arrowPosition : 'none',\n arrowOffset,\n wasFlipped\n };\n }\n\n /**\n * Determine best position based on available space\n */\n private determinePosition(\n targetX: number,\n targetY: number,\n width: number,\n height: number,\n preferred: TooltipPlacement\n ): 'top' | 'bottom' | 'left' | 'right' {\n if (preferred !== 'auto') {\n return preferred;\n }\n \n // Calculate available space in each direction\n const bounds = this.getConstraintBounds();\n \n const spaceTop = targetY - bounds.top;\n const spaceBottom = bounds.bottom - targetY;\n const spaceLeft = targetX - bounds.left;\n const spaceRight = bounds.right - targetX;\n \n // Prefer vertical placement (top/bottom) for better readability\n const canFitTop = spaceTop >= height + this.config.offset.y;\n const canFitBottom = spaceBottom >= height + this.config.offset.y;\n const canFitRight = spaceRight >= width + this.config.offset.x;\n const canFitLeft = spaceLeft >= width + this.config.offset.x;\n \n // Priority: top > bottom > right > left\n if (canFitTop && spaceTop >= spaceBottom) return 'top';\n if (canFitBottom) return 'bottom';\n if (canFitRight && spaceRight >= spaceLeft) return 'right';\n if (canFitLeft) return 'left';\n \n // Default to position with most space\n const spaces = [\n { pos: 'top' as const, space: spaceTop },\n { pos: 'bottom' as const, space: spaceBottom },\n { pos: 'right' as const, space: spaceRight },\n { pos: 'left' as const, space: spaceLeft }\n ];\n \n return spaces.sort((a, b) => b.space - a.space)[0].pos;\n }\n\n /**\n * Calculate tooltip coordinates for a given position\n */\n private calculateCoordinates(\n targetX: number,\n targetY: number,\n width: number,\n height: number,\n position: 'top' | 'bottom' | 'left' | 'right',\n offset: { x: number; y: number },\n arrowSize: number\n ): { x: number; y: number; arrowPosition: ArrowPosition } {\n let x: number;\n let y: number;\n let arrowPosition: ArrowPosition;\n \n switch (position) {\n case 'top':\n x = targetX - width / 2;\n y = targetY - height - offset.y - arrowSize;\n arrowPosition = 'bottom';\n break;\n \n case 'bottom':\n x = targetX - width / 2;\n y = targetY + offset.y + arrowSize;\n arrowPosition = 'top';\n break;\n \n case 'right':\n x = targetX + offset.x + arrowSize;\n y = targetY - height / 2;\n arrowPosition = 'left';\n break;\n \n case 'left':\n x = targetX - width - offset.x - arrowSize;\n y = targetY - height / 2;\n arrowPosition = 'right';\n break;\n }\n \n return { x, y, arrowPosition };\n }\n\n /**\n * Get the opposite position for flipping\n */\n private flipPosition(\n position: 'top' | 'bottom' | 'left' | 'right'\n ): 'top' | 'bottom' | 'left' | 'right' {\n switch (position) {\n case 'top': return 'bottom';\n case 'bottom': return 'top';\n case 'left': return 'right';\n case 'right': return 'left';\n }\n }\n\n /**\n * Check if tooltip fits within bounds\n */\n private fitsInBounds(x: number, y: number, width: number, height: number): boolean {\n const bounds = this.getConstraintBounds();\n \n return (\n x >= bounds.left &&\n y >= bounds.top &&\n x + width <= bounds.right &&\n y + height <= bounds.bottom\n );\n }\n\n /**\n * Constrain position to stay within bounds\n */\n private constrainToBounds(\n x: number,\n y: number,\n width: number,\n height: number\n ): { x: number; y: number } {\n const bounds = this.getConstraintBounds();\n const margin = 4; // Small margin from edges\n \n let constrainedX = x;\n let constrainedY = y;\n \n // Horizontal constraints\n if (constrainedX < bounds.left + margin) {\n constrainedX = bounds.left + margin;\n } else if (constrainedX + width > bounds.right - margin) {\n constrainedX = bounds.right - width - margin;\n }\n \n // Vertical constraints\n if (constrainedY < bounds.top + margin) {\n constrainedY = bounds.top + margin;\n } else if (constrainedY + height > bounds.bottom - margin) {\n constrainedY = bounds.bottom - height - margin;\n }\n \n return { x: constrainedX, y: constrainedY };\n }\n\n /**\n * Get the bounds to constrain tooltip within\n */\n private getConstraintBounds(): { top: number; left: number; right: number; bottom: number } {\n let bounds = {\n top: 0,\n left: 0,\n right: this.containerWidth,\n bottom: this.containerHeight\n };\n \n if (this.config.constrainToPlotArea && this.plotArea) {\n bounds = {\n top: Math.max(bounds.top, this.plotArea.y),\n left: Math.max(bounds.left, this.plotArea.x),\n right: Math.min(bounds.right, this.plotArea.x + this.plotArea.width),\n bottom: Math.min(bounds.bottom, this.plotArea.y + this.plotArea.height)\n };\n }\n \n return bounds;\n }\n\n /**\n * Calculate position for crosshair tooltip (follows cursor vertically)\n */\n calculateCrosshairPosition(\n cursorX: number,\n cursorY: number,\n measurement: TooltipMeasurement\n ): TooltipPosition {\n const { offset } = this.config;\n const bounds = this.getConstraintBounds();\n \n const totalWidth = measurement.width + measurement.padding.left + measurement.padding.right;\n const totalHeight = measurement.height + measurement.padding.top + measurement.padding.bottom;\n \n // Position to the right of cursor by default\n let x = cursorX + offset.x;\n let arrowPosition: ArrowPosition = 'left';\n \n // Flip to left if not enough space on right\n if (x + totalWidth > bounds.right - 4) {\n x = cursorX - totalWidth - offset.x;\n arrowPosition = 'right';\n }\n \n // Center vertically on cursor\n let y = cursorY - totalHeight / 2;\n \n // Constrain vertically\n y = Math.max(bounds.top + 4, Math.min(bounds.bottom - totalHeight - 4, y));\n \n // Calculate arrow offset (centered on cursor Y)\n const arrowOffset = cursorY - y;\n \n return {\n x,\n y,\n arrowPosition,\n arrowOffset: Math.max(8, Math.min(totalHeight - 8, arrowOffset)),\n wasFlipped: arrowPosition === 'right'\n };\n }\n}\n\n// Export singleton-like factory\nexport function createTooltipPositioner(\n config?: Partial<PositionerConfig>\n): TooltipPositioner {\n return new TooltipPositioner(config);\n}\n","/**\n * Tooltip Renderer - Canvas 2D tooltip rendering\n * \n * High-performance Canvas rendering for tooltips with:\n * - Glassmorphism effects\n * - Smooth gradients and shadows\n * - Arrow/pointer drawing\n * - Animation support\n * \n * @module tooltip/TooltipRenderer\n */\n\nimport type {\n TooltipData,\n TooltipPosition,\n TooltipTheme,\n TooltipTemplate,\n ArrowPosition\n} from './types';\n\n/**\n * TooltipRenderer handles all Canvas 2D rendering for tooltips\n */\nexport class TooltipRenderer {\n private ctx: CanvasRenderingContext2D;\n private theme: TooltipTheme;\n\n constructor(ctx: CanvasRenderingContext2D, theme: TooltipTheme) {\n this.ctx = ctx;\n this.theme = theme;\n }\n\n /**\n * Update the theme\n */\n setTheme(theme: TooltipTheme): void {\n this.theme = theme;\n }\n\n /**\n * Render a tooltip with the given template\n */\n render<T extends TooltipData>(\n data: T,\n position: TooltipPosition,\n template: TooltipTemplate<T>\n ): void {\n const measurement = template.measure(this.ctx, data, this.theme);\n const totalWidth = measurement.width + measurement.padding.left + measurement.padding.right;\n const totalHeight = measurement.height + measurement.padding.top + measurement.padding.bottom;\n\n this.ctx.save();\n\n // Draw background with effects\n this.drawBackground(position.x, position.y, totalWidth, totalHeight, position.arrowPosition || 'none');\n\n // Draw arrow if enabled\n if (position.arrowPosition && position.arrowPosition !== 'none') {\n this.drawArrow(\n position.x,\n position.y,\n totalWidth,\n totalHeight,\n position.arrowPosition,\n position.arrowOffset || 0\n );\n }\n\n // Let template render content\n template.render(this.ctx, data, position, this.theme);\n\n this.ctx.restore();\n }\n\n\n\n /**\n * Draw tooltip background with all effects\n */\n private drawBackground(\n x: number,\n y: number,\n width: number,\n height: number,\n _arrowPosition: ArrowPosition\n ): void {\n const { ctx, theme } = this;\n const r = theme.borderRadius;\n\n ctx.save();\n\n // Shadow\n if (theme.shadow.blur > 0) {\n ctx.shadowColor = theme.shadow.color;\n ctx.shadowOffsetX = theme.shadow.offsetX;\n ctx.shadowOffsetY = theme.shadow.offsetY;\n ctx.shadowBlur = theme.shadow.blur;\n }\n\n // Create rounded rect path\n ctx.beginPath();\n this.roundRect(x, y, width, height, r);\n\n // Fill with gradient or solid color\n if (theme.backgroundGradient) {\n const gradient = ctx.createLinearGradient(x, y, x, y + height);\n gradient.addColorStop(0, theme.backgroundColor);\n gradient.addColorStop(1, theme.backgroundGradient);\n ctx.fillStyle = gradient;\n } else {\n ctx.fillStyle = theme.backgroundColor;\n }\n ctx.fill();\n\n // Reset shadow for border\n ctx.shadowColor = 'transparent';\n\n // Border\n if (theme.borderWidth > 0) {\n ctx.strokeStyle = theme.borderColor;\n ctx.lineWidth = theme.borderWidth;\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n /**\n * Draw arrow pointing to target\n */\n private drawArrow(\n x: number,\n y: number,\n width: number,\n height: number,\n arrowPosition: ArrowPosition,\n arrowOffset: number\n ): void {\n const { ctx, theme } = this;\n const size = theme.arrowSize;\n\n if (size <= 0 || arrowPosition === 'none') return;\n\n ctx.save();\n ctx.fillStyle = theme.backgroundColor;\n ctx.strokeStyle = theme.borderColor;\n ctx.lineWidth = theme.borderWidth;\n\n ctx.beginPath();\n\n switch (arrowPosition) {\n case 'top':\n // Arrow pointing up (tooltip below target)\n const topX = x + arrowOffset;\n ctx.moveTo(topX - size, y);\n ctx.lineTo(topX, y - size);\n ctx.lineTo(topX + size, y);\n break;\n\n case 'bottom':\n // Arrow pointing down (tooltip above target)\n const bottomX = x + arrowOffset;\n const bottomY = y + height;\n ctx.moveTo(bottomX - size, bottomY);\n ctx.lineTo(bottomX, bottomY + size);\n ctx.lineTo(bottomX + size, bottomY);\n break;\n\n case 'left':\n // Arrow pointing left (tooltip right of target)\n const leftY = y + arrowOffset;\n ctx.moveTo(x, leftY - size);\n ctx.lineTo(x - size, leftY);\n ctx.lineTo(x, leftY + size);\n break;\n\n case 'right':\n // Arrow pointing right (tooltip left of target)\n const rightX = x + width;\n const rightY = y + arrowOffset;\n ctx.moveTo(rightX, rightY - size);\n ctx.lineTo(rightX + size, rightY);\n ctx.lineTo(rightX, rightY + size);\n break;\n }\n\n ctx.closePath();\n ctx.fill();\n\n if (theme.borderWidth > 0) {\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n /**\n * Draw a rounded rectangle path\n */\n private roundRect(x: number, y: number, width: number, height: number, radius: number): void {\n const { ctx } = this;\n const r = Math.min(radius, width / 2, height / 2);\n\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + width - r, y);\n ctx.arcTo(x + width, y, x + width, y + r, r);\n ctx.lineTo(x + width, y + height - r);\n ctx.arcTo(x + width, y + height, x + width - r, y + height, r);\n ctx.lineTo(x + r, y + height);\n ctx.arcTo(x, y + height, x, y + height - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n }\n\n /**\n * Draw a horizontal separator line\n */\n drawSeparator(x: number, y: number, width: number): void {\n const { ctx, theme } = this;\n\n if (!theme.showHeaderSeparator) return;\n\n ctx.save();\n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + width, y);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Draw a series color indicator (small circle or square)\n */\n drawSeriesIndicator(x: number, y: number, color: string): void {\n const { ctx, theme } = this;\n\n if (!theme.showSeriesIndicator) return;\n\n const size = theme.seriesIndicatorSize;\n const radius = size / 2;\n\n ctx.save();\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(x + radius, y, radius, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n /**\n * Measure text width\n */\n measureText(text: string, fontSize: number, fontWeight: number | string = 400): number {\n const { ctx, theme } = this;\n ctx.font = `${fontWeight} ${fontSize}px ${theme.fontFamily}`;\n return ctx.measureText(text).width;\n }\n\n /**\n * Draw text with theme styling\n */\n drawText(\n text: string,\n x: number,\n y: number,\n options: {\n fontSize?: number;\n fontWeight?: number | string;\n color?: string;\n align?: CanvasTextAlign;\n baseline?: CanvasTextBaseline;\n } = {}\n ): void {\n const { ctx, theme } = this;\n const {\n fontSize = theme.contentFontSize,\n fontWeight = 400,\n color = theme.textColor,\n align = 'left',\n baseline = 'top'\n } = options;\n\n ctx.save();\n ctx.font = `${fontWeight} ${fontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = color;\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n ctx.fillText(text, x, y);\n ctx.restore();\n }\n\n /**\n * Draw a label-value pair\n */\n drawLabelValue(\n x: number,\n y: number,\n label: string,\n value: string,\n maxWidth: number\n ): void {\n const { theme } = this;\n\n // Draw label (secondary color)\n this.drawText(label, x, y, {\n color: theme.textSecondaryColor,\n fontSize: theme.contentFontSize\n });\n\n // Draw value (primary color, right-aligned)\n this.drawText(value, x + maxWidth, y, {\n color: theme.textColor,\n fontSize: theme.contentFontSize,\n align: 'right'\n });\n }\n\n /**\n * Get theme for external use\n */\n getTheme(): TooltipTheme {\n return this.theme;\n }\n}\n\n/**\n * Create a tooltip renderer\n */\nexport function createTooltipRenderer(\n ctx: CanvasRenderingContext2D,\n theme: TooltipTheme\n): TooltipRenderer {\n return new TooltipRenderer(ctx, theme);\n}\n","/**\n * Default Tooltip Template\n * \n * A clean, elegant template for data point tooltips with:\n * - Series color indicator\n * - Formatted X/Y values\n * - Optional error bars\n * - Cycle information\n * \n * @module tooltip/templates/DefaultTemplate\n */\n\nimport type {\n DataPointTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number, precision: number = 4): string {\n const absVal = Math.abs(value);\n \n // Use scientific notation for very large/small numbers\n if (absVal !== 0 && (absVal < 0.0001 || absVal >= 10000)) {\n return value.toExponential(2);\n }\n \n // Smart precision based on magnitude\n if (absVal < 0.01) {\n return value.toPrecision(precision);\n } else if (absVal < 1) {\n return value.toFixed(4);\n } else if (absVal < 100) {\n return value.toFixed(3);\n } else {\n return value.toFixed(1);\n }\n}\n\n/**\n * Default Data Point Template\n * \n * Visual layout:\n * ┌──────────────────────────┐\n * │ ● Series Name │\n * │ ─────────────────────── │\n * │ X: 0.500 │\n * │ Y: 1.234 │\n * │ ± Error: 0.05 │\n * └──────────────────────────┘\n */\nexport class DefaultTooltipTemplate implements TooltipTemplate<DataPointTooltip> {\n readonly id = 'default';\n readonly name = 'Default Data Point';\n readonly supportedTypes: TooltipType[] = ['datapoint'];\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Create cache key\n const cacheKey = `${data.seriesId}-${data.dataIndex}-${data.dataX}-${data.dataY}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Set up font for measurement\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n \n // Measure title (series name)\n const titleWidth = ctx.measureText(data.seriesName).width;\n \n // Set content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Format values\n const labelWidth = 35;\n const xValWidth = ctx.measureText(formatValue(data.dataX)).width;\n const yValWidth = ctx.measureText(formatValue(data.dataY)).width;\n \n // Measure content lines\n let contentWidth = labelWidth + Math.max(xValWidth, yValWidth);\n \n let contentHeight = theme.contentFontSize * theme.lineHeight * 2;\n \n // Add error info if present\n if (data.yError) {\n const errorText = `± ${formatValue(data.yError[0])} / ${formatValue(data.yError[1])}`;\n contentWidth = Math.max(contentWidth, ctx.measureText(errorText).width);\n contentHeight += theme.contentFontSize * theme.lineHeight;\n }\n \n // Add cycle info if present\n if (data.cycle !== undefined) {\n const cycleText = `Cycle: ${data.cycle}`;\n contentWidth = Math.max(contentWidth, ctx.measureText(cycleText).width);\n contentHeight += theme.contentFontSize * theme.lineHeight;\n }\n \n // Account for series indicator\n const indicatorWidth = theme.showSeriesIndicator \n ? theme.seriesIndicatorSize + 6 \n : 0;\n \n // Calculate total width\n const width = Math.max(titleWidth + indicatorWidth, contentWidth);\n \n // Calculate total height (title + separator + content)\n const height = theme.titleFontSize * theme.lineHeight + theme.headerGap + contentHeight;\n \n this.cachedMeasurement = {\n width: width + 2, // Tiny buffer\n height: height + 4,\n padding: theme.padding,\n arrow: theme.showArrow ? { width: theme.arrowSize * 2, height: theme.arrowSize } : undefined\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n // Start position for content\n let currentX = x + padding.left;\n let currentY = y + padding.top;\n \n // Explicitly set alignment to avoid inheritance issues\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n \n // Draw series indicator\n if (theme.showSeriesIndicator) {\n const indicatorY = currentY + theme.titleFontSize / 2;\n ctx.save();\n ctx.fillStyle = data.seriesColor;\n ctx.beginPath();\n ctx.arc(currentX + theme.seriesIndicatorSize / 2, indicatorY, theme.seriesIndicatorSize / 2, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n \n currentX += theme.seriesIndicatorSize + 6;\n }\n \n // Draw title (series name)\n ctx.save();\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n ctx.fillText(data.seriesName, currentX, currentY);\n ctx.restore();\n \n currentY += theme.titleFontSize * theme.lineHeight + 2; // Extra space\n \n // Draw separator\n if (theme.showHeaderSeparator) {\n const measurement = this.measure(ctx, data, theme);\n const separatorWidth = measurement.width;\n \n ctx.save();\n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.globalAlpha = 0.4; // Softer separator\n ctx.beginPath();\n ctx.moveTo(x + padding.left, currentY + theme.headerGap / 2);\n ctx.lineTo(x + padding.left + separatorWidth, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.restore();\n }\n \n currentY += theme.headerGap + 2; // Better gap\n currentX = x + padding.left; // Reset X\n \n // Draw content\n ctx.save();\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // X value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('X:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n const labelWidth = 35; // Fixed label width for better alignment\n ctx.fillText(formatValue(data.dataX), currentX + labelWidth, currentY);\n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Y value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Y:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.dataY), currentX + labelWidth, currentY);\n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Error if present\n if (data.yError) {\n ctx.fillStyle = theme.textSecondaryColor;\n const errorText = `± ${formatValue(data.yError[0])} / +${formatValue(data.yError[1])}`;\n ctx.fillText(errorText, currentX, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n }\n \n // Cycle if present\n if (data.cycle !== undefined) {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Cycle:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(String(data.cycle), currentX + 45, currentY);\n }\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const defaultTooltipTemplate = new DefaultTooltipTemplate();\n","/**\n * Minimal Tooltip Template\n * \n * Ultra-compact template showing only essential values.\n * Perfect for dashboards with limited space.\n * \n * @module tooltip/templates/MinimalTemplate\n */\n\nimport type {\n DataPointTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number compactly\n */\nfunction formatCompact(value: number): string {\n const absVal = Math.abs(value);\n \n if (absVal === 0) return '0';\n \n // Use SI prefixes for large/small numbers\n if (absVal >= 1e9) return (value / 1e9).toFixed(1) + 'G';\n if (absVal >= 1e6) return (value / 1e6).toFixed(1) + 'M';\n if (absVal >= 1e3) return (value / 1e3).toFixed(1) + 'k';\n if (absVal >= 1) return value.toFixed(2);\n if (absVal >= 1e-3) return (value * 1e3).toFixed(1) + 'm';\n if (absVal >= 1e-6) return (value * 1e6).toFixed(1) + 'µ';\n if (absVal >= 1e-9) return (value * 1e9).toFixed(1) + 'n';\n \n return value.toExponential(1);\n}\n\n/**\n * Minimal Template\n * \n * Visual layout:\n * ┌───────────────────╮\n * │ 0.500 ▪ 1.23µA │\n * ╰───────────────────╯\n */\nexport class MinimalTooltipTemplate implements TooltipTemplate<DataPointTooltip> {\n readonly id = 'minimal';\n readonly name = 'Minimal';\n readonly supportedTypes: TooltipType[] = ['datapoint'];\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Cache key\n const cacheKey = `${data.seriesId}-${data.dataIndex}-${data.dataX}-${data.dataY}-${theme.fontFamily}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Set font for measurement\n ctx.font = `${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Create compact text\n const text = `${formatCompact(data.dataX)} ▪ ${formatCompact(data.dataY)}`;\n const textWidth = ctx.measureText(text).width;\n \n this.cachedMeasurement = {\n width: textWidth,\n height: theme.contentFontSize * theme.lineHeight,\n padding: {\n top: 6,\n right: 8,\n bottom: 6,\n left: 8\n }\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const x = position.x + 8; // Left padding\n const y = position.y + 6; // Top padding\n \n // Create compact text\n const xValue = formatCompact(data.dataX);\n const yValue = formatCompact(data.dataY);\n \n ctx.save();\n ctx.font = `${theme.contentFontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n \n // Draw X value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText(xValue, x, y);\n \n // Draw separator\n const xWidth = ctx.measureText(xValue).width;\n ctx.fillStyle = data.seriesColor;\n ctx.fillText(' ▪ ', x + xWidth, y);\n \n // Draw Y value\n const sepWidth = ctx.measureText(' ▪ ').width;\n ctx.fillStyle = theme.textColor;\n ctx.fillText(yValue, x + xWidth + sepWidth, y);\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const minimalTooltipTemplate = new MinimalTooltipTemplate();\n","/**\n * Crosshair Tooltip Template\n * \n * Multi-series template for crosshair tooltips showing\n * interpolated values for all visible series at cursor position.\n * \n * @module tooltip/templates/CrosshairTemplate\n */\n\nimport type {\n CrosshairTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number): string {\n const absVal = Math.abs(value);\n \n if (absVal === 0) return '0';\n if (absVal !== 0 && (absVal < 0.0001 || absVal >= 10000)) {\n return value.toExponential(2);\n }\n if (absVal < 0.01) return value.toPrecision(3);\n if (absVal < 1) return value.toFixed(4);\n if (absVal < 100) return value.toFixed(3);\n return value.toFixed(1);\n}\n\n/**\n * Crosshair Multi-Series Template\n * \n * Visual layout:\n * ┌──────────────────────────────────╮\n * │ ⌖ X = 0.234 │\n * ├──────────────────────────────────┤\n * │ ● Forward: 45.67 µA │\n * │ ● Reverse: -32.10 µA │\n * │ ○ Baseline: 0.05 µA │\n * ╰──────────────────────────────────╯\n */\nexport class CrosshairTooltipTemplate implements TooltipTemplate<CrosshairTooltip> {\n readonly id = 'crosshair';\n readonly name = 'Multi-Series Crosshair';\n readonly supportedTypes: TooltipType[] = ['crosshair'];\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: CrosshairTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Cache key\n const cacheKey = `${data.dataX}-${data.interpolatedValues.length}-${theme.fontFamily}-${theme.titleFontSize}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Set title font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n \n // Header: \"⌖ X = value\"\n const headerText = `⌖ X = ${formatValue(data.dataX)}`;\n let maxWidth = ctx.measureText(headerText).width;\n \n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Measure each series line\n const indicatorWidth = theme.showSeriesIndicator ? theme.seriesIndicatorSize + 8 : 0;\n const labelColumnWidth = 60; // From render\n \n for (const series of data.interpolatedValues) {\n const nameWidth = ctx.measureText(`${series.seriesName}:`).width;\n const valWidth = ctx.measureText(formatValue(series.y)).width;\n const lineWidth = indicatorWidth + Math.max(nameWidth, labelColumnWidth) + valWidth;\n maxWidth = Math.max(maxWidth, lineWidth);\n }\n \n // Calculate height\n const headerHeight = theme.titleFontSize * theme.lineHeight;\n const seriesCount = data.interpolatedValues.length;\n const contentHeight = seriesCount * (theme.contentFontSize * theme.lineHeight + 2);\n \n this.cachedMeasurement = {\n width: maxWidth + 4, // Safety buffer\n height: headerHeight + theme.headerGap + contentHeight,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: CrosshairTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n let currentY = y + padding.top;\n const contentX = x + padding.left;\n \n // Draw header: \"⌖ X = value\"\n ctx.save();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n \n const headerText = `⌖ X = ${formatValue(data.dataX)}`;\n ctx.fillText(headerText, contentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n \n // Draw separator\n if (theme.showHeaderSeparator) {\n const measurement = this.measure(ctx, data, theme);\n \n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(contentX, currentY + theme.headerGap / 2);\n ctx.lineTo(contentX + measurement.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n \n currentY += theme.headerGap + 2;\n \n // Draw each series\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n for (const series of data.interpolatedValues) {\n let itemX = contentX;\n \n // Series indicator\n if (theme.showSeriesIndicator) {\n const indicatorY = currentY + theme.contentFontSize / 2;\n \n // Use filled circle for exact points, empty circle for interpolated\n ctx.save();\n ctx.beginPath();\n ctx.arc(\n itemX + theme.seriesIndicatorSize / 2,\n indicatorY,\n theme.seriesIndicatorSize / 2,\n 0,\n Math.PI * 2\n );\n \n if (series.isInterpolated) {\n ctx.strokeStyle = series.seriesColor;\n ctx.lineWidth = 1.5;\n ctx.stroke();\n } else {\n ctx.fillStyle = series.seriesColor;\n ctx.fill();\n }\n ctx.restore();\n \n itemX += theme.seriesIndicatorSize + 8;\n }\n \n // Series name\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText(`${series.seriesName}:`, itemX, currentY);\n \n const nameWidth = ctx.measureText(`${series.seriesName}: `).width;\n const labelOffset = Math.max(nameWidth, 60); // At least 60px for name\n \n // Series value\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(series.y), itemX + labelOffset, currentY);\n \n currentY += theme.contentFontSize * theme.lineHeight + 2;\n }\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const crosshairTooltipTemplate = new CrosshairTooltipTemplate();\n","/**\n * Heatmap Tooltip Template\n * \n * Specialized template for heatmap tooltips showing:\n * - Grid position\n * - Z value with color preview\n * - Scale information\n * \n * @module tooltip/templates/HeatmapTemplate\n */\n\nimport type {\n HeatmapTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number): string {\n const absVal = Math.abs(value);\n \n if (absVal === 0) return '0';\n if (absVal !== 0 && (absVal < 0.0001 || absVal >= 10000)) {\n return value.toExponential(3);\n }\n if (absVal < 0.01) return value.toPrecision(4);\n if (absVal < 1) return value.toFixed(4);\n if (absVal < 100) return value.toFixed(3);\n return value.toFixed(2);\n}\n\n/**\n * Heatmap Template\n * \n * Visual layout:\n * ┌────────────────────────────╮\n * │ Grid [45, 128] │\n * │ ──────────────────────────│\n * │ ████ Value: 0.847 │\n * │ Min: 0.0 Max: 1.0 │\n * │ │\n * │ X: 100.0 Hz │\n * │ Y: 2.50 s │\n * ╰────────────────────────────╯\n */\nexport class HeatmapTooltipTemplate implements TooltipTemplate<HeatmapTooltip> {\n readonly id = 'heatmap';\n readonly name = 'Heatmap Value';\n readonly supportedTypes: TooltipType[] = ['heatmap'];\n\n // Color swatch dimensions\n private readonly swatchSize = 14;\n private readonly swatchGap = 8;\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: HeatmapTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Cache key\n const cacheKey = `${data.seriesId}-${data.xIndex}-${data.yIndex}-${theme.fontFamily}-${theme.titleFontSize}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Set title font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n \n // Header: \"Grid [x, y]\"\n const headerText = `Grid [${data.xIndex}, ${data.yIndex}]`;\n let maxWidth = ctx.measureText(headerText).width;\n \n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Value line with color swatch (swatch + gap + text)\n const valueText = `Value: ${formatValue(data.zValue)}`;\n const valueWidth = this.swatchSize + this.swatchGap + ctx.measureText(valueText).width;\n maxWidth = Math.max(maxWidth, valueWidth);\n \n // Scale info\n if (data.colorScale) {\n const scaleText = `Min: ${formatValue(data.colorScale.min)} Max: ${formatValue(data.colorScale.max)}`;\n maxWidth = Math.max(maxWidth, this.swatchSize + this.swatchGap + ctx.measureText(scaleText).width);\n }\n \n // X/Y data values\n const xyLabelWidth = 25; // Adjusted to match fixed offset in render\n const dataXWidth = xyLabelWidth + ctx.measureText(formatValue(data.dataX)).width;\n const dataYWidth = xyLabelWidth + ctx.measureText(formatValue(data.dataY)).width;\n maxWidth = Math.max(maxWidth, dataXWidth, dataYWidth);\n \n // Calculate height\n const headerHeight = theme.titleFontSize * theme.lineHeight;\n const contentLines = data.colorScale ? 4 : 3; // value, (scale), X, Y\n const contentHeight = contentLines * theme.contentFontSize * theme.lineHeight;\n \n this.cachedMeasurement = {\n width: maxWidth + 4, // Small buffer\n height: headerHeight + theme.headerGap + contentHeight + theme.itemGap,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: HeatmapTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n let currentY = y + padding.top;\n const contentX = x + padding.left;\n \n // Draw header: \"Grid [x, y]\"\n ctx.save();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n \n const headerText = `Grid [${data.xIndex}, ${data.yIndex}]`;\n ctx.fillText(headerText, contentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n \n // Draw separator\n if (theme.showHeaderSeparator) {\n const measurement = this.measure(ctx, data, theme);\n \n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(contentX, currentY + theme.headerGap / 2);\n ctx.lineTo(contentX + measurement.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n \n currentY += theme.headerGap + 2;\n \n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n // Draw color swatch with value\n const swatchY = currentY + (theme.contentFontSize * theme.lineHeight - this.swatchSize) / 2;\n \n // Color swatch with border\n ctx.fillStyle = data.mappedColor || theme.textColor;\n ctx.fillRect(contentX, swatchY, this.swatchSize, this.swatchSize);\n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(contentX, swatchY, this.swatchSize, this.swatchSize);\n \n // Value text\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Value:', contentX + this.swatchSize + this.swatchGap, currentY);\n ctx.fillStyle = theme.textColor;\n const labelWidth = ctx.measureText('Value: ').width;\n ctx.fillText(formatValue(data.zValue), contentX + this.swatchSize + this.swatchGap + labelWidth, currentY);\n \n currentY += theme.contentFontSize * theme.lineHeight;\n \n // Scale info (indented to align with value)\n if (data.colorScale) {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.font = `400 ${theme.contentFontSize - 1}px ${theme.fontFamily}`;\n const scaleText = `Min: ${formatValue(data.colorScale.min)} Max: ${formatValue(data.colorScale.max)}`;\n ctx.fillText(scaleText, contentX + this.swatchSize + this.swatchGap, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n }\n \n currentY += theme.itemGap + 2;\n \n // X value\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('X:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.dataX), contentX + 25, currentY);\n \n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Y value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Y:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.dataY), contentX + 25, currentY);\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const heatmapTooltipTemplate = new HeatmapTooltipTemplate();\n","/**\n * Scientific Tooltip Template\n * \n * Full precision scientific template with:\n * - Proper scientific notation with superscripts\n * - Units and prefixes\n * - Complete error values\n * - Extended metadata\n * \n * @module tooltip/templates/ScientificTemplate\n */\n\nimport type {\n DataPointTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Convert number to scientific notation with Unicode superscripts\n */\nfunction toScientificUnicode(value: number, precision: number = 3): string {\n if (value === 0) return '0';\n \n const exp = Math.floor(Math.log10(Math.abs(value)));\n const mantissa = value / Math.pow(10, exp);\n \n if (Math.abs(exp) <= 2) {\n // Don't use scientific notation for small exponents\n return value.toPrecision(precision);\n }\n \n // Superscript map\n const superscripts: Record<string, string> = {\n '0': '⁰', '1': '¹', '2': '²', '3': '³', '4': '⁴',\n '5': '⁵', '6': '⁶', '7': '⁷', '8': '⁸', '9': '⁹',\n '-': '⁻', '+': '⁺'\n };\n \n // Convert exponent to superscript\n const expStr = exp.toString();\n let superExp = '';\n for (const char of expStr) {\n superExp += superscripts[char] || char;\n }\n \n return `${mantissa.toFixed(precision - 1)} × 10${superExp}`;\n}\n\n/**\n * Format with SI prefix (for future use)\n */\n// function formatWithPrefix(value: number, unit: string = ''): string {\n// const prefixes = [\n// { exp: 12, prefix: 'T' },\n// { exp: 9, prefix: 'G' },\n// { exp: 6, prefix: 'M' },\n// { exp: 3, prefix: 'k' },\n// { exp: 0, prefix: '' },\n// { exp: -3, prefix: 'm' },\n// { exp: -6, prefix: 'µ' },\n// { exp: -9, prefix: 'n' },\n// { exp: -12, prefix: 'p' }\n// ];\n// \n// if (value === 0) return `0 ${unit}`;\n// \n// const absVal = Math.abs(value);\n// \n// for (const { exp, prefix } of prefixes) {\n// if (absVal >= Math.pow(10, exp - 1)) {\n// const scaled = value / Math.pow(10, exp);\n// return `${scaled.toFixed(3)} ${prefix}${unit}`;\n// }\n// }\n// \n// return `${value.toExponential(3)} ${unit}`;\n// }\n\n/**\n * Scientific Template\n * \n * Visual layout:\n * ┌────────────────────────────────────────╮\n * │ 📍 Series Name │\n * │ ───────────────────────────────────── │\n * │ X: 1.234×10³ │\n * │ Y: 5.678×10⁻² ± 0.001 │\n * │ ───────────────────────────────────── │\n * │ Index: 1523 │ Cycle: 3 │\n * ╰────────────────────────────────────────╯\n */\nexport class ScientificTooltipTemplate implements TooltipTemplate<DataPointTooltip> {\n readonly id = 'scientific';\n readonly name = 'Scientific Notation';\n readonly supportedTypes: TooltipType[] = ['datapoint'];\n\n // Cached measurements\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n // Cache key\n const cacheKey = `${data.seriesId}-${data.dataIndex}-${data.dataX}-${data.dataY}-${theme.fontFamily}-${theme.titleFontSize}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Title font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n \n const titleWidth = ctx.measureText(data.seriesName).width + \n (theme.showSeriesIndicator ? theme.seriesIndicatorSize + 8 : 0);\n \n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n const labelWidth = 28; // Fixed width used in render\n \n // X value\n const xVal = toScientificUnicode(data.dataX);\n let maxWidth = Math.max(titleWidth, labelWidth + ctx.measureText(xVal).width);\n \n // Y value with optional error\n const yVal = toScientificUnicode(data.dataY);\n let yWidth = labelWidth + ctx.measureText(yVal).width;\n if (data.yError) {\n yWidth += ctx.measureText(` ± ${toScientificUnicode(data.yError[0])}`).width;\n }\n maxWidth = Math.max(maxWidth, yWidth);\n \n // Footer line\n let footerText = `Index: ${data.dataIndex}`;\n if (data.cycle !== undefined) {\n footerText += ` │ Cycle: ${data.cycle}`;\n }\n maxWidth = Math.max(maxWidth, ctx.measureText(footerText).width);\n \n // Height calculation\n let lineCount = 3; // title, X, Y\n if (data.cycle !== undefined || data.yError) {\n lineCount += 1; // footer\n }\n \n const headerHeight = theme.titleFontSize * theme.lineHeight + theme.headerGap;\n const contentHeight = (lineCount - 1) * theme.contentFontSize * theme.lineHeight;\n const extraGap = (data.cycle !== undefined) ? theme.itemGap : 0;\n \n this.cachedMeasurement = {\n width: maxWidth,\n height: headerHeight + contentHeight + extraGap,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n \n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: DataPointTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n let currentY = y + padding.top;\n let currentX = x + padding.left;\n \n ctx.save();\n \n // Explicitly set alignment\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n \n // Draw series indicator\n if (theme.showSeriesIndicator) {\n const indicatorY = currentY + theme.titleFontSize / 2;\n ctx.fillStyle = data.seriesColor;\n ctx.beginPath();\n ctx.arc(currentX + theme.seriesIndicatorSize / 2, indicatorY, theme.seriesIndicatorSize / 2, 0, Math.PI * 2);\n ctx.fill();\n currentX += theme.seriesIndicatorSize + 8;\n }\n \n // Title\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n ctx.fillText(data.seriesName, currentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n currentX = x + padding.left;\n \n // Separator\n if (theme.showHeaderSeparator) {\n const measurement = this.measure(ctx, data, theme);\n ctx.strokeStyle = theme.separatorColor;\n ctx.lineWidth = 1;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(currentX, currentY + theme.headerGap / 2);\n ctx.lineTo(currentX + measurement.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n \n currentY += theme.headerGap + 2;\n \n // Content\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n const labelWidth = 28;\n \n // X value\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('X:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(toScientificUnicode(data.dataX), currentX + labelWidth, currentY);\n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Y value with error\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Y:', currentX, currentY);\n ctx.fillStyle = theme.textColor;\n \n let yText = toScientificUnicode(data.dataY);\n ctx.fillText(yText, currentX + labelWidth, currentY);\n \n if (data.yError) {\n const yWidth = ctx.measureText(yText).width;\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText(` ± ${toScientificUnicode(data.yError[0])}`, currentX + labelWidth + yWidth, currentY);\n }\n currentY += theme.contentFontSize * theme.lineHeight + 2;\n \n // Footer with index and cycle\n if (data.cycle !== undefined) {\n currentY += theme.itemGap;\n \n // Light separator\n ctx.strokeStyle = theme.separatorColor;\n ctx.globalAlpha = 0.3;\n ctx.beginPath();\n const measurement = this.measure(ctx, data, theme);\n ctx.moveTo(currentX, currentY - theme.itemGap / 2);\n ctx.lineTo(currentX + measurement.width, currentY - theme.itemGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1;\n \n // Footer text\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.font = `400 ${theme.contentFontSize - 1}px ${theme.fontFamily}`;\n \n let footerText = `Index: ${data.dataIndex}`;\n if (data.cycle !== undefined) {\n footerText += ` │ Cycle: ${data.cycle}`;\n }\n ctx.fillText(footerText, currentX, currentY);\n }\n \n ctx.restore();\n }\n}\n\n// Export singleton instance\nexport const scientificTooltipTemplate = new ScientificTooltipTemplate();\n","/**\n * Annotation Tooltip Template\n * \n * Template for displaying information about chart annotations:\n * - Annotation type and ID\n * - Labeled values\n * - Custom metadata\n * \n * @module tooltip/templates/AnnotationTemplate\n */\n\nimport type {\n AnnotationTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number): string {\n const absVal = Math.abs(value);\n if (absVal === 0) return '0';\n if (absVal < 0.0001 || absVal >= 10000) return value.toExponential(2);\n if (absVal < 1) return value.toFixed(4);\n return value.toFixed(2);\n}\n\nexport class AnnotationTooltipTemplate implements TooltipTemplate<AnnotationTooltip> {\n readonly id = 'annotation';\n readonly name = 'Annotation Info';\n readonly supportedTypes: TooltipType[] = ['annotation'];\n\n // Cache\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: AnnotationTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n const cacheKey = `${data.annotationId}-${data.label}-${theme.fontFamily}-${theme.titleFontSize}`;\n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Header font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n const headerText = data.label || `Annotation: ${data.annotationType}`;\n let maxWidth = ctx.measureText(headerText).width;\n\n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n let contentHeight = 0;\n const labelWidth = 50;\n\n // Value lines\n if (data.value !== undefined) {\n const valText = formatValue(data.value);\n maxWidth = Math.max(maxWidth, labelWidth + ctx.measureText(valText).width);\n contentHeight += theme.contentFontSize * theme.lineHeight;\n }\n if (data.valueX !== undefined && data.valueY !== undefined) {\n const xText = formatValue(data.valueX);\n const yText = formatValue(data.valueY);\n maxWidth = Math.max(maxWidth, labelWidth + ctx.measureText(xText).width, labelWidth + ctx.measureText(yText).width);\n contentHeight += (theme.contentFontSize * theme.lineHeight) * 2;\n }\n\n const headerHeight = theme.titleFontSize * theme.lineHeight + theme.headerGap;\n \n this.cachedMeasurement = {\n width: maxWidth + 10,\n height: headerHeight + contentHeight + 4,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n\n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: AnnotationTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n \n let currentY = y + padding.top;\n const contentX = x + padding.left;\n\n ctx.save();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n // Header\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n const headerText = data.label || `${data.annotationType.toUpperCase()}`;\n ctx.fillText(headerText, contentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n\n // Separator\n if (theme.showHeaderSeparator) {\n const m = this.measure(ctx, data, theme);\n ctx.strokeStyle = theme.separatorColor;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(contentX, currentY + theme.headerGap / 2);\n ctx.lineTo(contentX + m.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n\n currentY += theme.headerGap + 2;\n\n // Content\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n const labelW = 50;\n\n if (data.value !== undefined) {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Value:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.value), contentX + labelW, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n }\n\n if (data.valueX !== undefined && data.valueY !== undefined) {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('X:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.valueX), contentX + labelW, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText('Y:', contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(formatValue(data.valueY), contentX + labelW, currentY);\n }\n\n ctx.restore();\n }\n}\n\nexport const annotationTooltipTemplate = new AnnotationTooltipTemplate();\n","/**\n * Range Tooltip Template\n * \n * Displays statistical information for a selected range:\n * - Count of points\n * - Min/Max/Mean values\n * - Area and Peaks\n * \n * @module tooltip/templates/RangeTemplate\n */\n\nimport type {\n RangeTooltip,\n TooltipTemplate,\n TooltipMeasurement,\n TooltipPosition,\n TooltipTheme,\n TooltipType\n} from '../types';\n\n/**\n * Format a number for display\n */\nfunction formatValue(value: number): string {\n const absVal = Math.abs(value);\n if (absVal === 0) return '0';\n if (absVal < 0.0001 || absVal >= 10000) return value.toExponential(3);\n if (absVal < 1) return value.toFixed(4);\n return value.toFixed(3);\n}\n\nexport class RangeTooltipTemplate implements TooltipTemplate<RangeTooltip> {\n readonly id = 'range';\n readonly name = 'Range Statistics';\n readonly supportedTypes: TooltipType[] = ['range'];\n\n // Cache\n private cachedKey: string = '';\n private cachedMeasurement: TooltipMeasurement | null = null;\n\n /**\n * Measure tooltip dimensions\n */\n measure(\n ctx: CanvasRenderingContext2D,\n data: RangeTooltip,\n theme: TooltipTheme\n ): TooltipMeasurement {\n const stats = data.statistics;\n const cacheKey = `${data.xMin}-${data.xMax}-${stats.count}-${stats.mean}-${theme.fontFamily}`;\n \n if (cacheKey === this.cachedKey && this.cachedMeasurement) {\n return this.cachedMeasurement;\n }\n\n // Title font\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n const headerText = 'Range Statistics';\n let maxWidth = ctx.measureText(headerText).width;\n\n // Content font\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n \n let contentHeight = theme.contentFontSize * theme.lineHeight * 2; // Range and Count are always shown\n \n const lines = [\n `Range: ${formatValue(data.xMin)} to ${formatValue(data.xMax)}`,\n `Count: ${stats.count}`\n ];\n\n if (stats.min !== undefined) lines.push(`Min: ${formatValue(stats.min)}`);\n if (stats.max !== undefined) lines.push(`Max: ${formatValue(stats.max)}`);\n if (stats.mean !== undefined) lines.push(`Mean: ${formatValue(stats.mean)}`);\n if (stats.area !== undefined) lines.push(`Area: ${formatValue(stats.area)}`);\n\n for (const line of lines) {\n maxWidth = Math.max(maxWidth, ctx.measureText(line).width + 10);\n }\n \n contentHeight = lines.length * theme.contentFontSize * theme.lineHeight;\n\n const headerHeight = theme.titleFontSize * theme.lineHeight + theme.headerGap;\n \n this.cachedMeasurement = {\n width: Math.max(maxWidth, 140),\n height: headerHeight + contentHeight + 10,\n padding: theme.padding\n };\n this.cachedKey = cacheKey;\n\n return this.cachedMeasurement;\n }\n\n /**\n * Render the tooltip\n */\n render(\n ctx: CanvasRenderingContext2D,\n data: RangeTooltip,\n position: TooltipPosition,\n theme: TooltipTheme\n ): void {\n const { x, y } = position;\n const { padding } = theme;\n const stats = data.statistics;\n \n let currentY = y + padding.top;\n const contentX = x + padding.left;\n\n ctx.save();\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n // Title\n ctx.font = `${theme.titleFontWeight} ${theme.titleFontSize}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.textColor;\n ctx.fillText('Range Statistics', contentX, currentY);\n \n currentY += theme.titleFontSize * theme.lineHeight + 2;\n\n // Header Separator\n if (theme.showHeaderSeparator) {\n const m = this.measure(ctx, data, theme);\n ctx.strokeStyle = theme.separatorColor;\n ctx.globalAlpha = 0.4;\n ctx.beginPath();\n ctx.moveTo(contentX, currentY + theme.headerGap / 2);\n ctx.lineTo(contentX + m.width, currentY + theme.headerGap / 2);\n ctx.stroke();\n ctx.globalAlpha = 1.0;\n }\n\n currentY += theme.headerGap + 2;\n\n // Content\n ctx.font = `400 ${theme.contentFontSize}px ${theme.fontFamily}`;\n const labelW = 60;\n\n const renderLine = (label: string, value: string | number) => {\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.fillText(label, contentX, currentY);\n ctx.fillStyle = theme.textColor;\n ctx.fillText(String(value), contentX + labelW, currentY);\n currentY += theme.contentFontSize * theme.lineHeight;\n };\n\n renderLine('Points:', stats.count);\n if (stats.min !== undefined) renderLine('Min:', formatValue(stats.min));\n if (stats.max !== undefined) renderLine('Max:', formatValue(stats.max));\n if (stats.mean !== undefined) renderLine('Mean:', formatValue(stats.mean));\n if (stats.stdDev !== undefined) renderLine('StdDev:', formatValue(stats.stdDev));\n if (stats.area !== undefined) renderLine('Area:', formatValue(stats.area));\n \n if (stats.peakX !== undefined) {\n currentY += 4;\n ctx.fillStyle = theme.textSecondaryColor;\n ctx.font = `italic ${theme.contentFontSize - 1}px ${theme.fontFamily}`;\n ctx.fillText(`Peak: ${formatValue(stats.peakY ?? 0)} at X=${formatValue(stats.peakX)}`, contentX, currentY);\n }\n\n ctx.restore();\n }\n}\n\nexport const rangeTooltipTemplate = new RangeTooltipTemplate();\n","/**\n * Tooltip Templates - Barrel Export\n * \n * All available tooltip templates for different use cases.\n * \n * @module tooltip/templates\n */\n\n// Default template - Clean data point display\nexport { DefaultTooltipTemplate, defaultTooltipTemplate } from './DefaultTemplate';\n\n// Minimal template - Ultra-compact values\nexport { MinimalTooltipTemplate, minimalTooltipTemplate } from './MinimalTemplate';\n\n// Crosshair template - Multi-series at X position\nexport { CrosshairTooltipTemplate, crosshairTooltipTemplate } from './CrosshairTemplate';\n\n// Heatmap template - Z values with color preview\nexport { HeatmapTooltipTemplate, heatmapTooltipTemplate } from './HeatmapTemplate';\n\n// Scientific template - Full precision with notation\nexport { ScientificTooltipTemplate, scientificTooltipTemplate } from './ScientificTemplate';\n\n// Annotation template - Labels and values for markers/lines\nexport { AnnotationTooltipTemplate, annotationTooltipTemplate } from './AnnotationTemplate';\n\n// Range template - Statistics for data selections\nexport { RangeTooltipTemplate, rangeTooltipTemplate } from './RangeTemplate';\n\n// Template registry for easy lookup\nimport type { TooltipTemplate, TooltipData } from '../types';\nimport { defaultTooltipTemplate } from './DefaultTemplate';\nimport { minimalTooltipTemplate } from './MinimalTemplate';\nimport { crosshairTooltipTemplate } from './CrosshairTemplate';\nimport { heatmapTooltipTemplate } from './HeatmapTemplate';\nimport { scientificTooltipTemplate } from './ScientificTemplate';\nimport { annotationTooltipTemplate } from './AnnotationTemplate';\nimport { rangeTooltipTemplate } from './RangeTemplate';\n\n/** All built-in templates */\nexport const BUILTIN_TEMPLATES: TooltipTemplate<TooltipData>[] = [\n defaultTooltipTemplate as TooltipTemplate<TooltipData>,\n minimalTooltipTemplate as TooltipTemplate<TooltipData>,\n crosshairTooltipTemplate as TooltipTemplate<TooltipData>,\n heatmapTooltipTemplate as TooltipTemplate<TooltipData>,\n scientificTooltipTemplate as TooltipTemplate<TooltipData>,\n annotationTooltipTemplate as TooltipTemplate<TooltipData>,\n rangeTooltipTemplate as TooltipTemplate<TooltipData>\n];\n\n/** Template ID type */\nexport type BuiltinTemplateId = 'default' | 'minimal' | 'crosshair' | 'heatmap' | 'scientific' | 'annotation' | 'range';\n\n/**\n * Get a built-in template by ID\n */\nexport function getBuiltinTemplate(id: BuiltinTemplateId | string): TooltipTemplate<TooltipData> | undefined {\n return BUILTIN_TEMPLATES.find(t => t.id === id);\n}\n\n/**\n * Get template for a tooltip type\n */\nexport function getDefaultTemplateForType(type: string): TooltipTemplate<TooltipData> {\n switch (type) {\n case 'datapoint':\n return defaultTooltipTemplate as TooltipTemplate<TooltipData>;\n case 'crosshair':\n return crosshairTooltipTemplate as TooltipTemplate<TooltipData>;\n case 'heatmap':\n return heatmapTooltipTemplate as TooltipTemplate<TooltipData>;\n case 'annotation':\n return annotationTooltipTemplate as TooltipTemplate<TooltipData>;\n case 'range':\n return rangeTooltipTemplate as TooltipTemplate<TooltipData>;\n default:\n return defaultTooltipTemplate as TooltipTemplate<TooltipData>;\n }\n}\n","/**\n * TooltipManager - Coordinates the tooltip system\n * \n * This is the main entry point for the tooltip system, integrating:\n * - Template management\n * - Theme management\n * - Hit-testing for data points\n * - Tooltip positioning and rendering\n * - Event handling\n * \n * @module tooltip/TooltipManager\n */\n\nimport type { PlotArea, Bounds } from '../../types';\nimport type { Scale } from '../../scales';\nimport type { Series } from '../Series';\nimport type {\n TooltipData,\n DataPointTooltip,\n CrosshairTooltip,\n TooltipOptions,\n TooltipTheme,\n TooltipTemplate,\n TooltipPosition,\n ShowTooltipOptions,\n TooltipEventMap\n} from './types';\nimport { EventEmitter } from '../EventEmitter';\nimport { TooltipPositioner } from './TooltipPositioner';\nimport { TooltipRenderer } from './TooltipRenderer';\nimport { DEFAULT_TOOLTIP_THEME, getTooltipThemeForChartTheme, createTooltipTheme } from './themes';\nimport {\n defaultTooltipTemplate,\n minimalTooltipTemplate,\n crosshairTooltipTemplate,\n heatmapTooltipTemplate,\n scientificTooltipTemplate,\n annotationTooltipTemplate,\n rangeTooltipTemplate,\n getBuiltinTemplate,\n getDefaultTemplateForType\n} from './templates';\nimport type { ChartTheme } from '../../theme';\n\n// ============================================\n// Types for TooltipManager\n// ============================================\n\nexport interface TooltipManagerConfig {\n /** Canvas 2D context for rendering */\n overlayCtx: CanvasRenderingContext2D;\n /** Chart theme (for auto-selecting tooltip theme) */\n chartTheme: ChartTheme;\n /** Function to get current plot area */\n getPlotArea: () => PlotArea;\n /** Function to get all series */\n getSeries: () => Series[];\n /** Function to convert pixel X to data X */\n pixelToDataX: (px: number) => number;\n /** Function to convert pixel Y to data Y */\n pixelToDataY: (py: number) => number;\n /** Function to get X scale */\n getXScale: () => Scale;\n /** Function to get Y scales */\n getYScales: () => Map<string, Scale>;\n /** Function to get view bounds */\n getViewBounds: () => Bounds;\n /** Initial options */\n options?: TooltipOptions;\n}\n\ninterface ActiveTooltip {\n id: string;\n data: TooltipData;\n position: TooltipPosition;\n template: TooltipTemplate<TooltipData>;\n}\n\n/** Internal fully-populated options type */\ninterface FullTooltipOptions {\n enabled: boolean;\n showDelay: number;\n hideDelay: number;\n followCursor: boolean;\n offset: { x: number; y: number };\n dataPoint: {\n enabled: boolean;\n templateId: string;\n snapToPoint: boolean;\n hitRadius: number;\n };\n crosshair: {\n enabled: boolean;\n templateId: string;\n interpolate: boolean;\n visibleSeriesOnly: boolean;\n };\n range: {\n enabled: boolean;\n templateId: string;\n calculateStats: boolean;\n };\n annotation: {\n enabled: boolean;\n templateId: string;\n };\n heatmap: {\n enabled: boolean;\n templateId: string;\n showColorInfo: boolean;\n };\n positioning: 'auto' | 'fixed' | 'follow';\n preferredPosition: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n constrainToPlotArea: boolean;\n constrainToContainer: boolean;\n autoFlip: boolean;\n theme?: string | Partial<TooltipTheme>;\n}\n\n// ============================================\n// TooltipManager Implementation\n// ============================================\n\nexport class TooltipManager {\n private ctx: CanvasRenderingContext2D;\n private getPlotArea: () => PlotArea;\n private getSeries: () => Series[];\n private pixelToDataX: (px: number) => number;\n private pixelToDataY: (py: number) => number;\n private getXScale: () => Scale;\n private getYScales: () => Map<string, Scale>;\n \n private options: FullTooltipOptions;\n private theme: TooltipTheme;\n private positioner: TooltipPositioner;\n private renderer: TooltipRenderer;\n private templates: Map<string, TooltipTemplate<TooltipData>> = new Map();\n private events = new EventEmitter<TooltipEventMap>();\n \n private activeTooltips: Map<string, ActiveTooltip> = new Map();\n private tooltipIdCounter = 0;\n private showTimeoutId: number | null = null;\n private hideTimeoutId: number | null = null;\n \n private lastCursorX: number | null = null;\n private lastCursorY: number | null = null;\n private hoveredSeriesId: string | null = null;\n private hoveredDataIndex: number | null = null;\n private cachedNearestResult: DataPointTooltip | null = null;\n \n // Large dataset optimizations\n private snapMode: 'nearest' | 'x-only' | 'auto' = 'auto';\n private largeDatasetThreshold = 50000;\n private lastKnownDataSize = 0;\n // Hysteresis factor: new point must be this much closer to switch (2 = 2x closer)\n private hysteresisRatio = 2.0;\n\n constructor(config: TooltipManagerConfig) {\n this.ctx = config.overlayCtx;\n this.getPlotArea = config.getPlotArea;\n this.getSeries = config.getSeries;\n this.pixelToDataX = config.pixelToDataX;\n this.pixelToDataY = config.pixelToDataY;\n this.getXScale = config.getXScale;\n this.getYScales = config.getYScales;\n \n // Default options\n this.options = {\n enabled: true,\n showDelay: 50,\n hideDelay: 100,\n followCursor: false,\n offset: { x: 12, y: 12 },\n dataPoint: {\n enabled: true,\n templateId: 'default',\n snapToPoint: true,\n hitRadius: 20\n },\n crosshair: {\n enabled: false,\n templateId: 'crosshair',\n interpolate: true,\n visibleSeriesOnly: true\n },\n range: {\n enabled: false,\n templateId: 'default',\n calculateStats: true\n },\n annotation: {\n enabled: true,\n templateId: 'default'\n },\n heatmap: {\n enabled: true,\n templateId: 'heatmap',\n showColorInfo: true\n },\n positioning: 'auto',\n preferredPosition: 'auto',\n constrainToPlotArea: true,\n constrainToContainer: true,\n autoFlip: true\n };\n \n // Apply user options\n if (config.options) {\n this.configure(config.options);\n }\n \n // Initialize theme\n this.theme = config.options?.theme \n ? (typeof config.options.theme === 'string' \n ? getTooltipThemeForChartTheme(config.options.theme)\n : createTooltipTheme(DEFAULT_TOOLTIP_THEME, config.options.theme))\n : getTooltipThemeForChartTheme(config.chartTheme.name);\n \n // Initialize components\n this.positioner = new TooltipPositioner({\n offset: this.options.offset,\n preferredPosition: this.options.preferredPosition,\n constrainToPlotArea: this.options.constrainToPlotArea,\n constrainToContainer: this.options.constrainToContainer,\n autoFlip: this.options.autoFlip,\n showArrow: this.theme.showArrow,\n arrowSize: this.theme.arrowSize\n });\n \n this.renderer = new TooltipRenderer(this.ctx, this.theme);\n \n // Register built-in templates\n this.registerBuiltinTemplates();\n }\n\n /**\n * Register built-in templates\n */\n private registerBuiltinTemplates(): void {\n this.templates.set('default', defaultTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('minimal', minimalTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('crosshair', crosshairTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('heatmap', heatmapTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('scientific', scientificTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('annotation', annotationTooltipTemplate as TooltipTemplate<TooltipData>);\n this.templates.set('range', rangeTooltipTemplate as TooltipTemplate<TooltipData>);\n }\n\n /**\n * Configure tooltip options\n */\n configure(options: TooltipOptions): void {\n if (options.enabled !== undefined) this.options.enabled = options.enabled;\n if (options.showDelay !== undefined) this.options.showDelay = options.showDelay;\n if (options.hideDelay !== undefined) this.options.hideDelay = options.hideDelay;\n if (options.followCursor !== undefined) this.options.followCursor = options.followCursor;\n if (options.offset) this.options.offset = { ...this.options.offset, ...options.offset };\n \n if (options.dataPoint) {\n this.options.dataPoint = { ...this.options.dataPoint, ...options.dataPoint };\n }\n if (options.crosshair) {\n this.options.crosshair = { ...this.options.crosshair, ...options.crosshair };\n }\n if (options.heatmap) {\n this.options.heatmap = { ...this.options.heatmap, ...options.heatmap };\n }\n \n if (options.preferredPosition) this.options.preferredPosition = options.preferredPosition;\n if (options.constrainToPlotArea !== undefined) this.options.constrainToPlotArea = options.constrainToPlotArea;\n if (options.constrainToContainer !== undefined) this.options.constrainToContainer = options.constrainToContainer;\n if (options.autoFlip !== undefined) this.options.autoFlip = options.autoFlip;\n \n // Large dataset optimization options\n if (options.snapMode !== undefined) {\n this.snapMode = options.snapMode;\n }\n if (options.largeDatasetThreshold !== undefined) {\n this.largeDatasetThreshold = Math.max(1000, options.largeDatasetThreshold);\n }\n \n // Update positioner\n this.positioner.configure({\n offset: this.options.offset,\n preferredPosition: this.options.preferredPosition,\n constrainToPlotArea: this.options.constrainToPlotArea,\n constrainToContainer: this.options.constrainToContainer,\n autoFlip: this.options.autoFlip\n });\n }\n\n /**\n * Get current options\n */\n getOptions(): TooltipOptions {\n return { ...this.options };\n }\n\n /**\n * Enable/disable tooltips\n */\n setEnabled(enabled: boolean): void {\n this.options.enabled = enabled;\n if (!enabled) {\n this.hideAll();\n }\n }\n\n /**\n * Check if tooltips are enabled\n */\n isEnabled(): boolean {\n return this.options.enabled;\n }\n\n /**\n * Set tooltip theme\n */\n setTheme(theme: TooltipTheme | string): void {\n this.theme = typeof theme === 'string' \n ? getTooltipThemeForChartTheme(theme)\n : theme;\n this.renderer.setTheme(this.theme);\n this.positioner.configure({\n showArrow: this.theme.showArrow,\n arrowSize: this.theme.arrowSize\n });\n }\n\n /**\n * Update theme based on chart theme\n */\n updateChartTheme(chartTheme: ChartTheme): void {\n if (!this.options.theme) {\n // Only auto-update if user hasn't set a custom theme\n this.theme = getTooltipThemeForChartTheme(chartTheme.name);\n this.renderer.setTheme(this.theme);\n }\n }\n\n /**\n * Get current theme\n */\n getTheme(): TooltipTheme {\n return this.theme;\n }\n\n /**\n * Register a custom template\n */\n registerTemplate<T extends TooltipData>(template: TooltipTemplate<T>): void {\n this.templates.set(template.id, template as TooltipTemplate<TooltipData>);\n }\n\n /**\n * Get a template by ID\n */\n getTemplate(id: string): TooltipTemplate<TooltipData> | undefined {\n return this.templates.get(id) || getBuiltinTemplate(id);\n }\n\n\n /**\n * Handle cursor movement - main entry point for hover detection\n * Optimized with hysteresis to prevent jumping between nearby points\n */\n handleCursorMove(pixelX: number, pixelY: number): void {\n if (!this.options.enabled) return;\n \n this.lastCursorX = pixelX;\n this.lastCursorY = pixelY;\n \n const plotArea = this.getPlotArea();\n \n // Check if cursor is in plot area (fast path)\n const inPlotArea = \n pixelX >= plotArea.x && \n pixelX <= plotArea.x + plotArea.width &&\n pixelY >= plotArea.y && \n pixelY <= plotArea.y + plotArea.height;\n \n if (!inPlotArea) {\n this.cachedNearestResult = null;\n this.scheduleHide();\n return;\n }\n \n // Update positioner with current bounds\n this.positioner.setContainerSize(\n this.ctx.canvas.width / (window.devicePixelRatio || 1),\n this.ctx.canvas.height / (window.devicePixelRatio || 1)\n );\n this.positioner.setPlotArea(plotArea);\n \n // Track data size for auto mode\n this.lastKnownDataSize = this.getTotalDataPoints();\n \n // Find and show tooltip with hysteresis\n this.performTooltipUpdateWithHysteresis(pixelX, pixelY);\n }\n\n /**\n * Handle cursor leave\n */\n handleCursorLeave(): void {\n this.lastCursorX = null;\n this.lastCursorY = null;\n this.cachedNearestResult = null;\n this.scheduleHide();\n }\n\n /**\n * Get total number of data points across all visible series\n */\n private getTotalDataPoints(): number {\n let total = 0;\n const series = this.getSeries();\n for (const s of series) {\n if (!s.isVisible()) continue;\n const data = s.getData();\n if (data.x) total += data.x.length;\n }\n return total;\n }\n\n /**\n * Determine the effective snap mode based on configuration and data size\n */\n private getEffectiveSnapMode(): 'nearest' | 'x-only' {\n if (this.snapMode === 'x-only') return 'x-only';\n if (this.snapMode === 'nearest') return 'nearest';\n \n // Auto mode - use x-only for large datasets\n return this.lastKnownDataSize > this.largeDatasetThreshold ? 'x-only' : 'nearest';\n }\n\n /**\n * Perform tooltip update with hysteresis to prevent jumping.\n * The tooltip \"sticks\" to the current point unless the cursor is\n * significantly closer to a new point.\n */\n private performTooltipUpdateWithHysteresis(pixelX: number, pixelY: number): void {\n // Try to find a data point\n if (!this.options.dataPoint?.enabled) {\n this.performFallbackTooltipUpdate(pixelX, pixelY);\n return;\n }\n \n const effectiveMode = this.getEffectiveSnapMode();\n const newResult = effectiveMode === 'x-only' \n ? this.findDataPointByXOnly(pixelX)\n : this.findNearestDataPointOptimized(pixelX, pixelY);\n \n if (!newResult) {\n this.performFallbackTooltipUpdate(pixelX, pixelY);\n return;\n }\n \n // Hysteresis: If we already have a point, only switch if new point is MUCH closer\n if (this.cachedNearestResult && this.hoveredSeriesId !== null) {\n const currentPoint = this.cachedNearestResult;\n \n // Calculate distances to current and new points\n const currentDx = currentPoint.pixelX - pixelX;\n const currentDy = currentPoint.pixelY - pixelY;\n const currentDistSq = currentDx * currentDx + currentDy * currentDy;\n \n const newDx = newResult.pixelX - pixelX;\n const newDy = newResult.pixelY - pixelY;\n const newDistSq = newDx * newDx + newDy * newDy;\n \n // Only switch to new point if it's significantly closer\n if (newDistSq * this.hysteresisRatio >= currentDistSq) {\n // Stay with current point - just update position if needed\n this.updateTooltipPosition(this.cachedNearestResult);\n return;\n }\n }\n \n // Switch to new point\n this.cachedNearestResult = newResult;\n this.scheduleShow(newResult);\n }\n\n /**\n * Handle heatmap and crosshair tooltip types (fallback)\n */\n private performFallbackTooltipUpdate(pixelX: number, pixelY: number): void {\n // Try heatmap\n if (this.options.heatmap?.enabled) {\n const heatmapResult = this.findHeatmapCell(pixelX, pixelY);\n if (heatmapResult) {\n this.scheduleShow(heatmapResult);\n return;\n }\n }\n \n // Crosshair mode\n if (this.options.crosshair?.enabled) {\n const crosshairData = this.buildCrosshairTooltip(pixelX, pixelY);\n if (crosshairData) {\n this.scheduleShow(crosshairData);\n return;\n }\n }\n \n // No hit - hide tooltip\n this.cachedNearestResult = null;\n this.scheduleHide();\n }\n\n /**\n * Find data point by X coordinate only (O(log n) - fastest method)\n * Best for very large datasets where precision is less important than speed\n */\n private findDataPointByXOnly(pixelX: number): DataPointTooltip | null {\n const series = this.getSeries().filter(s => s.isVisible() && s.getType() !== 'heatmap');\n if (series.length === 0) return null;\n \n const xScale = this.getXScale();\n const yScales = this.getYScales();\n const cursorDataX = this.pixelToDataX(pixelX);\n \n let bestResult: DataPointTooltip | null = null;\n let bestXDistance = Infinity;\n \n for (const s of series) {\n const data = s.getData();\n if (!data.x || data.x.length === 0) continue;\n \n const yScale = yScales.get(s.getYAxisId?.() || 'default') || yScales.values().next().value;\n if (!yScale) continue;\n \n // Pure binary search for closest X\n const idx = this.binarySearchClosest(data.x, cursorDataX);\n const xDistance = Math.abs(data.x[idx] - cursorDataX);\n \n if (xDistance < bestXDistance) {\n bestXDistance = xDistance;\n const style = s.getStyle();\n const px = xScale.transform(data.x[idx]);\n const py = yScale.transform(data.y[idx]);\n \n bestResult = {\n type: 'datapoint',\n seriesId: s.getId(),\n seriesName: s.getId(),\n seriesColor: style.color || '#ff0055',\n dataIndex: idx,\n dataX: data.x[idx],\n dataY: data.y[idx],\n pixelX: px,\n pixelY: py,\n cycle: (s as any).getCycle?.()\n };\n \n const yError = s.getYError(idx);\n if (yError) bestResult.yError = yError;\n }\n }\n \n return bestResult;\n }\n\n /**\n * Optimized nearest data point finder\n */\n private findNearestDataPointOptimized(pixelX: number, pixelY: number): DataPointTooltip | null {\n const series = this.getSeries().filter(s => s.isVisible());\n const hitRadius = this.options.dataPoint?.hitRadius ?? 20;\n const xScale = this.getXScale();\n const yScales = this.getYScales();\n \n let nearestDistanceSq = hitRadius * hitRadius;\n let nearestResult: DataPointTooltip | null = null;\n \n const cursorDataX = this.pixelToDataX(pixelX);\n \n for (const s of series) {\n if (s.getType() === 'heatmap') continue;\n \n const data = s.getData();\n const yScale = yScales.get(s.getYAxisId?.() || 'default') || yScales.values().next().value;\n \n if (!yScale || !data.x || data.x.length === 0) continue;\n \n const closestIdx = this.binarySearchClosest(data.x, cursorDataX);\n \n // Adaptive search range\n const dataLength = data.x.length;\n const searchRadius = dataLength > 100000 ? 2 : dataLength > 10000 ? 3 : 5;\n const checkStart = Math.max(0, closestIdx - searchRadius);\n const checkEnd = Math.min(dataLength, closestIdx + searchRadius + 1);\n \n for (let i = checkStart; i < checkEnd; i++) {\n const px = xScale.transform(data.x[i]);\n const py = yScale.transform(data.y[i]);\n \n const dx = px - pixelX;\n const dy = py - pixelY;\n const distSq = dx * dx + dy * dy;\n \n if (distSq < nearestDistanceSq) {\n nearestDistanceSq = distSq;\n const style = s.getStyle();\n \n nearestResult = {\n type: 'datapoint',\n seriesId: s.getId(),\n seriesName: s.getId(),\n seriesColor: style.color || '#ff0055',\n dataIndex: i,\n dataX: data.x[i],\n dataY: data.y[i],\n pixelX: px,\n pixelY: py,\n cycle: (s as any).getCycle?.()\n };\n \n const yError = s.getYError(i);\n if (yError) nearestResult.yError = yError;\n }\n }\n }\n \n return nearestResult;\n }\n\n /**\n * Find heatmap cell under cursor\n */\n private findHeatmapCell(pixelX: number, pixelY: number): import(\"./types\").HeatmapTooltip | null {\n const series = this.getSeries().filter(s => s.isVisible() && s.getType() === 'heatmap');\n if (series.length === 0) return null;\n\n const xScale = this.getXScale();\n const yScales = this.getYScales();\n const dataX = this.pixelToDataX(pixelX);\n const dataY = this.pixelToDataY(pixelY);\n\n for (const s of series) {\n const data = s.getHeatmapData();\n if (!data || !data.xValues || !data.yValues || !data.zValues) continue;\n\n const colIdx = this.binarySearchClosest(data.xValues as any, dataX);\n const rowIdx = this.binarySearchClosest(data.yValues as any, dataY);\n\n const xValue = data.xValues[colIdx];\n const yValue = data.yValues[rowIdx];\n \n const yScale = yScales.get(s.getYAxisId?.() || 'default') || yScales.values().next().value;\n if (!yScale) continue;\n\n const px = xScale.transform(xValue);\n const py = yScale.transform(yValue);\n\n const zValue = data.zValues[rowIdx * data.xValues.length + colIdx];\n const style = s.getHeatmapStyle?.() || {};\n\n return {\n type: 'heatmap',\n seriesId: s.getId(),\n seriesName: s.getId(),\n xIndex: colIdx,\n yIndex: rowIdx,\n dataX: xValue,\n dataY: yValue,\n zValue,\n pixelX: px,\n pixelY: py,\n colorScale: style.colorScale as any\n };\n }\n\n return null;\n }\n\n /**\n * Binary search for closest value\n */\n private binarySearchClosest(arr: Float32Array | Float64Array, target: number): number {\n let left = 0;\n let right = arr.length - 1;\n \n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (arr[mid] < target) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n \n if (left > 0 && Math.abs(arr[left - 1] - target) < Math.abs(arr[left] - target)) {\n return left - 1;\n }\n \n return left;\n }\n\n /**\n * Build crosshair tooltip data\n */\n private buildCrosshairTooltip(pixelX: number, pixelY: number): CrosshairTooltip | null {\n const series = this.getSeries().filter(s => s.isVisible() && s.getType() !== 'heatmap');\n if (series.length === 0) return null;\n \n const dataX = this.pixelToDataX(pixelX);\n const yScales = this.getYScales();\n \n const interpolatedValues: CrosshairTooltip['interpolatedValues'] = [];\n \n for (const s of series) {\n const data = s.getData();\n if (!data.x || data.x.length === 0) continue;\n \n const yScale = yScales.get(s.getYAxisId?.() || 'default') || yScales.values().next().value;\n if (!yScale) continue;\n \n const idx = this.binarySearchClosest(data.x, dataX);\n let y: number;\n let isInterpolated = false;\n \n if (idx === 0 || idx >= data.x.length - 1 || data.x[idx] === dataX) {\n y = data.y[idx];\n } else if (this.options.crosshair?.interpolate) {\n const x0 = data.x[idx - 1];\n const x1 = data.x[idx];\n const y0 = data.y[idx - 1];\n const y1 = data.y[idx];\n const t = (dataX - x0) / (x1 - x0);\n y = y0 + t * (y1 - y0);\n isInterpolated = true;\n } else {\n y = data.y[idx];\n }\n \n const style = s.getStyle();\n interpolatedValues.push({\n seriesId: s.getId(),\n seriesName: s.getId(),\n seriesColor: style.color || '#ff0055',\n x: dataX,\n y,\n isInterpolated\n });\n }\n \n if (interpolatedValues.length === 0) return null;\n \n return {\n type: 'crosshair',\n cursorX: pixelX,\n cursorY: pixelY,\n dataX,\n interpolatedValues\n };\n }\n\n /**\n * Schedule showing a tooltip\n */\n private scheduleShow(data: TooltipData): void {\n this.clearHideTimeout();\n \n // If same data point, just update position\n if (data.type === 'datapoint') {\n const dp = data as DataPointTooltip;\n if (this.hoveredSeriesId === dp.seriesId && this.hoveredDataIndex === dp.dataIndex) {\n this.updateTooltipPosition(data);\n return;\n }\n this.hoveredSeriesId = dp.seriesId;\n this.hoveredDataIndex = dp.dataIndex;\n }\n \n this.clearShowTimeout();\n \n // Use short or no delay when already showing a tooltip\n const effectiveDelay = this.activeTooltips.size > 0 ? 0 : this.options.showDelay;\n \n if (effectiveDelay > 0) {\n this.showTimeoutId = window.setTimeout(() => {\n this.showTooltip(data);\n }, effectiveDelay);\n } else {\n this.showTooltip(data);\n }\n }\n\n /**\n * Schedule hiding tooltips\n */\n private scheduleHide(): void {\n this.clearShowTimeout();\n this.hoveredSeriesId = null;\n this.hoveredDataIndex = null;\n \n if (this.options.hideDelay > 0) {\n this.hideTimeoutId = window.setTimeout(() => {\n this.hideAll();\n }, this.options.hideDelay);\n } else {\n this.hideAll();\n }\n }\n\n private clearShowTimeout(): void {\n if (this.showTimeoutId !== null) {\n clearTimeout(this.showTimeoutId);\n this.showTimeoutId = null;\n }\n }\n\n private clearHideTimeout(): void {\n if (this.hideTimeoutId !== null) {\n clearTimeout(this.hideTimeoutId);\n this.hideTimeoutId = null;\n }\n }\n\n /**\n * Show a tooltip with the given data\n */\n private showTooltip(data: TooltipData): void {\n const templateId = this.getTemplateIdForType(data.type);\n const template = this.templates.get(templateId) || getDefaultTemplateForType(data.type);\n \n const targetX = (data as any).pixelX ?? this.lastCursorX ?? 0;\n const targetY = (data as any).pixelY ?? this.lastCursorY ?? 0;\n \n const measurement = template.measure(this.ctx, data, this.theme);\n const position = this.positioner.calculatePosition(targetX, targetY, measurement);\n \n const tooltipId = 'main';\n \n this.activeTooltips.set(tooltipId, {\n id: tooltipId,\n data,\n position,\n template\n });\n }\n\n /**\n * Update tooltip position\n */\n private updateTooltipPosition(data: TooltipData | null): void {\n const tooltip = this.activeTooltips.get('main');\n if (!tooltip) return;\n \n const tooltipData = data || tooltip.data;\n const targetX = (tooltipData as any).pixelX ?? this.lastCursorX ?? 0;\n const targetY = (tooltipData as any).pixelY ?? this.lastCursorY ?? 0;\n \n const measurement = tooltip.template.measure(this.ctx, tooltipData, this.theme);\n tooltip.position = this.positioner.calculatePosition(targetX, targetY, measurement);\n tooltip.data = tooltipData;\n }\n\n /**\n * Get template ID for a tooltip type\n */\n private getTemplateIdForType(type: string): string {\n switch (type) {\n case 'datapoint':\n return this.options.dataPoint?.templateId || 'default';\n case 'crosshair':\n return this.options.crosshair?.templateId || 'crosshair';\n case 'heatmap':\n return this.options.heatmap?.templateId || 'heatmap';\n default:\n return 'default';\n }\n }\n\n /**\n * Show a tooltip programmatically\n */\n show(data: TooltipData, options?: ShowTooltipOptions): string {\n const tooltipId = `tooltip-${++this.tooltipIdCounter}`;\n const templateId = options?.templateId || this.getTemplateIdForType(data.type);\n const template = this.templates.get(templateId) || getDefaultTemplateForType(data.type);\n \n let position: TooltipPosition;\n \n if (options?.position) {\n const measurement = template.measure(this.ctx, data, this.theme);\n position = this.positioner.calculatePosition(\n options.position.x, \n options.position.y, \n measurement\n );\n } else {\n const targetX = (data as any).pixelX ?? 0;\n const targetY = (data as any).pixelY ?? 0;\n const measurement = template.measure(this.ctx, data, this.theme);\n position = this.positioner.calculatePosition(targetX, targetY, measurement);\n }\n \n this.activeTooltips.set(tooltipId, {\n id: tooltipId,\n data,\n position,\n template\n });\n \n if (options?.duration && options.duration > 0) {\n setTimeout(() => this.hide(tooltipId), options.duration);\n }\n \n return tooltipId;\n }\n\n /**\n * Hide a specific tooltip\n */\n hide(tooltipId: string): void {\n this.activeTooltips.delete(tooltipId);\n }\n\n /**\n * Hide all tooltips immediately\n */\n hideAll(): void {\n this.activeTooltips.clear();\n this.hoveredSeriesId = null;\n this.hoveredDataIndex = null;\n }\n\n /**\n * Render all active tooltips\n */\n render(): void {\n if (!this.options.enabled || this.activeTooltips.size === 0) return;\n \n for (const tooltip of this.activeTooltips.values()) {\n this.renderer.render(\n tooltip.data,\n tooltip.position,\n tooltip.template\n );\n }\n }\n\n /**\n * Check if any tooltip is currently visible\n */\n hasActiveTooltip(): boolean {\n return this.activeTooltips.size > 0;\n }\n\n /**\n * Subscribe to tooltip events\n */\n on<K extends keyof TooltipEventMap>(\n event: K,\n handler: (data: TooltipEventMap[K]) => void\n ): void {\n this.events.on(event, handler);\n }\n\n /**\n * Unsubscribe from tooltip events\n */\n off<K extends keyof TooltipEventMap>(\n event: K,\n handler: (data: TooltipEventMap[K]) => void\n ): void {\n this.events.off(event, handler);\n }\n\n /**\n * Destroy the tooltip manager\n */\n destroy(): void {\n this.clearShowTimeout();\n this.clearHideTimeout();\n this.activeTooltips.clear();\n this.templates.clear();\n this.events.clear();\n }\n}\n\n/**\n * Create a tooltip manager\n */\nexport function createTooltipManager(config: TooltipManagerConfig): TooltipManager {\n return new TooltipManager(config);\n}\n","/**\n * Chart Export Utilities\n * \n * Handles exporting chart data to various formats (CSV, JSON, Image).\n */\n\nimport type { Series } from \"../Series\";\nimport type { Bounds } from \"../../types\";\nimport type { ExportOptions } from \"./types\";\n\n/**\n * Export series data to CSV format\n */\nexport function exportToCSV(\n series: Series[],\n options?: ExportOptions\n): string {\n const {\n seriesIds,\n includeHeaders = true,\n precision = 6,\n delimiter = ','\n } = options ?? {};\n\n const seriesToExport = seriesIds\n ? series.filter(s => seriesIds.includes(s.getId()))\n : series;\n\n if (seriesToExport.length === 0) return '';\n\n const lines: string[] = [];\n\n // Generate headers\n if (includeHeaders) {\n const headers: string[] = [];\n seriesToExport.forEach(s => {\n headers.push(`${s.getId()}_x`, `${s.getId()}_y`);\n });\n lines.push(headers.join(delimiter));\n }\n\n // Find max length\n const maxLength = Math.max(...seriesToExport.map(s => s.getPointCount()));\n\n // Generate data rows\n for (let i = 0; i < maxLength; i++) {\n const row: string[] = [];\n seriesToExport.forEach(s => {\n const data = s.getData();\n if (data && i < data.x.length) {\n row.push(data.x[i].toFixed(precision), data.y[i].toFixed(precision));\n } else {\n row.push('', '');\n }\n });\n lines.push(row.join(delimiter));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Export series data to JSON format\n */\nexport function exportToJSON(\n series: Series[],\n viewBounds: Bounds,\n options?: ExportOptions\n): string {\n const { seriesIds, precision = 6 } = options ?? {};\n\n const seriesToExport = seriesIds\n ? series.filter(s => seriesIds.includes(s.getId()))\n : series;\n\n const result: Record<string, { \n id: string;\n type: string;\n style: object;\n data: { x: number[]; y: number[] };\n pointCount: number;\n }> = {};\n\n seriesToExport.forEach(s => {\n const data = s.getData();\n result[s.getId()] = {\n id: s.getId(),\n type: s.getType(),\n style: s.getStyle(),\n data: {\n x: data ? Array.from(data.x).map(v => parseFloat(v.toFixed(precision))) : [],\n y: data ? Array.from(data.y).map(v => parseFloat(v.toFixed(precision))) : [],\n },\n pointCount: s.getPointCount()\n };\n });\n\n return JSON.stringify({\n exportDate: new Date().toISOString(),\n chartBounds: viewBounds,\n series: result\n }, null, 2);\n}\n\n/**\n * Export chart to image\n */\nexport function exportToImage(\n webglCanvas: HTMLCanvasElement,\n overlayCanvas: HTMLCanvasElement,\n backgroundColor: [number, number, number, number],\n legend: { draw: (ctx: CanvasRenderingContext2D, dpr: number) => void } | null,\n showLegend: boolean,\n dpr: number,\n type: \"png\" | \"jpeg\" = \"png\"\n): string {\n const finalCanvas = document.createElement(\"canvas\");\n finalCanvas.width = overlayCanvas.width;\n finalCanvas.height = overlayCanvas.height;\n const ctx = finalCanvas.getContext(\"2d\");\n if (!ctx) return \"\";\n\n // 1. Fill background\n const bg = backgroundColor;\n ctx.fillStyle = `rgba(${Math.round(bg[0] * 255)}, ${Math.round(\n bg[1] * 255\n )}, ${Math.round(bg[2] * 255)}, ${bg[3]})`;\n ctx.fillRect(0, 0, finalCanvas.width, finalCanvas.height);\n\n // 2. Draw WebGL plot area\n ctx.drawImage(webglCanvas, 0, 0);\n\n // 3. Draw Overlay (Axes, Grid, Labels)\n ctx.drawImage(overlayCanvas, 0, 0);\n\n // 4. Draw Legend (if exists and visible)\n if (legend && showLegend) {\n legend.draw(ctx, dpr);\n }\n\n return finalCanvas.toDataURL(`image/${type}`);\n}\n","/**\n * Chart Navigation\n * \n * Handles zoom, pan, auto-scale, and box zoom operations.\n */\n\nimport type { Bounds, ZoomOptions, AxisOptions } from \"../../types\";\nimport type { Scale } from \"../../scales\";\nimport type { EventEmitter } from \"../EventEmitter\";\nimport type { ChartEventMap } from \"../../types\";\n\nexport interface NavigationContext {\n viewBounds: Bounds;\n yScales: Map<string, Scale>;\n yAxisOptionsMap: Map<string, AxisOptions>;\n xAxisOptions: AxisOptions;\n primaryYAxisId: string;\n getPlotArea: () => { x: number; y: number; width: number; height: number };\n events: EventEmitter<ChartEventMap>;\n requestRender: () => void;\n series: Map<string, { \n isVisible(): boolean; \n getBounds(): Bounds | null; \n getYAxisId(): string | undefined;\n getType(): string;\n }>;\n}\n\n/**\n * Apply zoom to the chart\n */\nexport function applyZoom(\n ctx: NavigationContext,\n options: ZoomOptions\n): void {\n if (options.x) {\n ctx.viewBounds.xMin = options.x[0];\n ctx.viewBounds.xMax = options.x[1];\n }\n \n const hasBars = Array.from(ctx.series.values()).some(s => s.isVisible() && s.getType() === 'bar');\n const finalY = options.y ? [...options.y] : null;\n\n if (finalY && hasBars) {\n // Pin baseline to 0 for bar charts during zoom\n finalY[0] = 0;\n }\n\n if (finalY) {\n if (options.axisId) {\n // Zoom targeted axis only\n const scale = ctx.yScales.get(options.axisId);\n if (scale) {\n scale.setDomain(finalY[0], finalY[1]);\n // Sync primary viewBounds if applicable\n if (options.axisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = finalY[0];\n ctx.viewBounds.yMax = finalY[1];\n }\n }\n } else {\n // Global zoom: apply to all axes proportionally\n const oldRange = ctx.viewBounds.yMax - ctx.viewBounds.yMin;\n const newRange = finalY[1] - finalY[0];\n const factor = oldRange > 0 ? newRange / oldRange : 1;\n \n // Calculate relative shift based on primary axis change\n const offsetPct = oldRange > 0 ? (finalY[0] - ctx.viewBounds.yMin) / oldRange : 0;\n\n ctx.yScales.forEach((scale, id) => {\n if (id === ctx.primaryYAxisId) return; // Will sync with viewBounds later\n const sRange = scale.domain[1] - scale.domain[0];\n const sNewMin = hasBars ? 0 : (scale.domain[0] + offsetPct * sRange);\n const sNewMax = hasBars \n ? (scale.domain[0] + (finalY[1] / (ctx.viewBounds.yMax || 1)) * sRange) // Roughly proportional\n : (sNewMin + factor * sRange);\n scale.setDomain(sNewMin, sNewMax);\n });\n\n ctx.viewBounds.yMin = finalY[0];\n ctx.viewBounds.yMax = finalY[1];\n }\n }\n \n ctx.events.emit(\"zoom\", {\n x: [ctx.viewBounds.xMin, ctx.viewBounds.xMax],\n y: [ctx.viewBounds.yMin, ctx.viewBounds.yMax],\n });\n ctx.requestRender();\n}\n\n/**\n * Apply pan to the chart\n */\nexport function applyPan(\n ctx: NavigationContext,\n deltaX: number,\n deltaY: number,\n axisId?: string\n): void {\n const pa = ctx.getPlotArea();\n const dx = (deltaX / pa.width) * (ctx.viewBounds.xMax - ctx.viewBounds.xMin);\n \n // Apply pan to X (always global)\n ctx.viewBounds.xMin -= dx;\n ctx.viewBounds.xMax -= dx;\n\n if (axisId) {\n // Pan targeted axis only\n const scale = ctx.yScales.get(axisId);\n if (scale) {\n const hasBars = Array.from(ctx.series.values()).some(s => s.isVisible() && s.getType() === 'bar');\n const range = scale.domain[1] - scale.domain[0];\n const moveY = (deltaY / pa.height) * range;\n \n let nextMin = scale.domain[0] + moveY;\n let nextMax = scale.domain[1] + moveY;\n \n if (hasBars) {\n nextMin = 0; // Lock bottom\n // Panning up/down only affects the top bound for bars\n nextMax = scale.domain[1] + moveY; \n }\n\n scale.setDomain(nextMin, nextMax);\n \n // Sync primary viewBounds if applicable\n if (axisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = nextMin;\n ctx.viewBounds.yMax = nextMax;\n }\n }\n } else {\n // Global pan: apply to all Y axes proportionally\n const hasBars = Array.from(ctx.series.values()).some(s => s.isVisible() && s.getType() === 'bar');\n ctx.yScales.forEach((scale, id) => {\n const range = scale.domain[1] - scale.domain[0];\n const moveY = (deltaY / pa.height) * range;\n \n let nextMin = scale.domain[0] + moveY;\n let nextMax = scale.domain[1] + moveY;\n\n if (hasBars) {\n nextMin = 0;\n }\n\n scale.setDomain(nextMin, nextMax);\n \n if (id === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = nextMin;\n ctx.viewBounds.yMax = nextMax;\n }\n });\n }\n\n const dy = (deltaY / pa.height) * (ctx.viewBounds.yMax - ctx.viewBounds.yMin);\n ctx.events.emit(\"pan\", { deltaX: dx, deltaY: dy });\n ctx.requestRender();\n}\n\n","/**\n * Chart Scaling and Selection\n * \n * Handles auto-scaling and box zoom (rectangle selection) logic.\n */\nimport type { NavigationContext } from \"./ChartNavigation\";\nimport type { ZoomOptions } from \"../../types\";\n\n/**\n * Auto-scale all axes to fit data\n */\nexport function autoScaleAll(ctx: NavigationContext): void {\n if (ctx.series.size === 0) return;\n\n let xMin = Infinity;\n let xMax = -Infinity;\n \n // Track bounds per Y-axis\n const yAxisBounds = new Map<string, { min: number, max: number }>();\n ctx.yScales.forEach((_, id) => {\n yAxisBounds.set(id, { min: Infinity, max: -Infinity });\n });\n\n let hasValidData = false;\n\n ctx.series.forEach((s) => {\n if (!s.isVisible()) return;\n\n const b = s.getBounds();\n if (\n b &&\n isFinite(b.xMin) &&\n isFinite(b.xMax) &&\n isFinite(b.yMin) &&\n isFinite(b.yMax)\n ) {\n xMin = Math.min(xMin, b.xMin);\n xMax = Math.max(xMax, b.xMax);\n \n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const yBounds = yAxisBounds.get(axisId);\n if (yBounds) {\n yBounds.min = Math.min(yBounds.min, b.yMin);\n yBounds.max = Math.max(yBounds.max, b.yMax);\n }\n \n hasValidData = true;\n }\n });\n\n if (!hasValidData) return;\n\n const MAX_VAL = 1e15;\n const MIN_VAL = -1e15;\n\n if (ctx.xAxisOptions.auto) {\n let xRange = xMax - xMin;\n if (xRange <= 0 || !isFinite(xRange)) xRange = Math.abs(xMin) * 0.1 || 1;\n const xPad = Math.min(xRange * 0.05, 1e10);\n ctx.viewBounds.xMin = Math.max(MIN_VAL, xMin - xPad);\n ctx.viewBounds.xMax = Math.min(MAX_VAL, xMax + xPad);\n }\n\n yAxisBounds.forEach((bounds, id) => {\n if (bounds.min === Infinity) return;\n const opts = ctx.yAxisOptionsMap.get(id);\n const scale = ctx.yScales.get(id);\n if (opts && opts.auto && scale) {\n let yRange = bounds.max - bounds.min;\n if (yRange <= 0 || !isFinite(yRange)) yRange = Math.abs(bounds.min) * 0.1 || 1;\n const yPad = Math.min(yRange * 0.05, 1e10);\n \n let newMin = Math.max(MIN_VAL, bounds.min - yPad);\n const newMax = Math.min(MAX_VAL, bounds.max + yPad);\n scale.setDomain(newMin, newMax);\n \n if (id === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = newMin;\n ctx.viewBounds.yMax = newMax;\n }\n }\n });\n ctx.requestRender();\n}\n\n/**\n * Handle box zoom selection\n */\nexport function handleBoxZoom(\n ctx: NavigationContext,\n selectionRect: { x: number; y: number; width: number; height: number } | null,\n currentRect: { x: number; y: number; width: number; height: number } | null,\n zoom: (options: ZoomOptions) => void\n): { x: number; y: number; width: number; height: number } | null {\n if (selectionRect === null) {\n if (currentRect && currentRect.width > 5 && currentRect.height > 5) {\n const plotArea = ctx.getPlotArea();\n const bounds = ctx.viewBounds;\n\n const xMinNorm = (currentRect.x - plotArea.x) / plotArea.width;\n const xMaxNorm = (currentRect.x + currentRect.width - plotArea.x) / plotArea.width;\n const yMaxNorm = 1 - (currentRect.y - plotArea.y) / plotArea.height;\n const yMinNorm = 1 - (currentRect.y + currentRect.height - plotArea.y) / plotArea.height;\n\n const newXMin = bounds.xMin + xMinNorm * (bounds.xMax - bounds.xMin);\n const newXMax = bounds.xMin + xMaxNorm * (bounds.xMax - bounds.xMin);\n const newYMin = bounds.yMin + yMinNorm * (bounds.yMax - bounds.yMin);\n const newYMax = bounds.yMin + yMaxNorm * (bounds.yMax - bounds.yMin);\n\n zoom({ x: [newXMin, newXMax], y: [newYMin, newYMax] });\n }\n return null;\n }\n return selectionRect;\n}\n","/**\n * Chart Renderer\n * \n * Core rendering logic for the chart (WebGL + Overlay).\n */\n\nimport type { Bounds, CursorOptions, AxisOptions } from \"../../types\";\nimport type { Series } from \"../Series\";\nimport type { Scale } from \"../../scales\";\nimport type { NativeWebGLRenderer, NativeSeriesRenderData as SeriesRenderData } from \"../../renderer/NativeWebGLRenderer\";\nimport type { OverlayRenderer } from \"../OverlayRenderer\";\nimport type { PlotArea, CursorState, ChartEventMap } from \"../../types\";\nimport type { AnnotationManager } from \"../annotations\";\nimport type { ChartStatistics } from \"../ChartStatistics\";\nimport type { EventEmitter } from \"../EventEmitter\";\n\nexport interface RenderContext {\n webglCanvas: HTMLCanvasElement;\n overlayCanvas: HTMLCanvasElement;\n overlayCtx: CanvasRenderingContext2D;\n container: HTMLDivElement;\n series: Map<string, Series>;\n viewBounds: Bounds;\n xScale: Scale;\n yScales: Map<string, Scale>;\n yAxisOptionsMap: Map<string, AxisOptions>;\n xAxisOptions: AxisOptions;\n primaryYAxisId: string;\n renderer: NativeWebGLRenderer;\n overlay: OverlayRenderer;\n annotationManager: AnnotationManager;\n backgroundColor: [number, number, number, number];\n cursorOptions: CursorOptions | null;\n cursorPosition: { x: number; y: number } | null;\n selectionRect: { x: number; y: number; width: number; height: number } | null;\n stats: ChartStatistics | null;\n showStatistics: boolean;\n events: EventEmitter<ChartEventMap>;\n updateSeriesBuffer: (s: Series) => void;\n getPlotArea: () => PlotArea;\n pixelToDataX: (px: number) => number;\n pixelToDataY: (py: number) => number;\n tooltip: import(\"../tooltip\").TooltipManager;\n}\n\n/**\n * Prepare series data for WebGL rendering\n */\nexport function prepareSeriesData(\n ctx: RenderContext,\n plotArea: PlotArea\n): SeriesRenderData[] {\n const seriesData: SeriesRenderData[] = [];\n\n // Update all scales with current plot area range and domain\n ctx.xScale.setRange(plotArea.x, plotArea.x + plotArea.width);\n ctx.xScale.setDomain(ctx.viewBounds.xMin, ctx.viewBounds.xMax);\n\n ctx.yScales.forEach((scale, id) => {\n scale.setRange(plotArea.y + plotArea.height, plotArea.y);\n if (id === ctx.primaryYAxisId) {\n scale.setDomain(ctx.viewBounds.yMin, ctx.viewBounds.yMax);\n }\n });\n\n ctx.series.forEach((s) => {\n if (s.needsBufferUpdate) {\n ctx.updateSeriesBuffer(s);\n s.needsBufferUpdate = false;\n }\n\n const buf = ctx.renderer.getBuffer(s.getId());\n const seriesType = s.getType();\n \n // Candlesticks use sub-buffers, so main buffer might be missing\n if (buf || seriesType === 'candlestick') {\n \n // Determine Y-bounds for this series\n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const scale = ctx.yScales.get(axisId);\n let yBounds: { min: number; max: number } | undefined;\n \n if (scale) {\n yBounds = { min: scale.domain[0], max: scale.domain[1] };\n }\n\n // Map area type to band for rendering (area fills to y=0)\n const renderType = seriesType === 'area' ? 'band' : seriesType;\n\n // Base render data (only if buffer exists)\n let renderData: SeriesRenderData | null = null;\n \n if (buf) {\n renderData = {\n id: s.getId(),\n buffer: buf,\n count: s.getPointCount(),\n style: s.getStyle(),\n visible: s.isVisible(),\n type: renderType,\n yBounds,\n };\n }\n\n // Special count multipliers for geometry-heavy types\n if (renderData) {\n if (seriesType === \"band\" || seriesType === \"area\") {\n renderData.count = s.getPointCount() * 2;\n } else if (seriesType === \"bar\") {\n renderData.count = s.getPointCount() * 6;\n }\n \n // Add step buffer for step types\n if (seriesType === 'step' || seriesType === 'step+scatter') {\n const stepBuf = ctx.renderer.getBuffer(`${s.getId()}_step`);\n if (stepBuf) {\n renderData.stepBuffer = stepBuf;\n // Calculate step count based on mode\n const stepMode = s.getStyle().stepMode ?? 'after';\n const pointCount = s.getPointCount();\n if (stepMode === 'center') {\n renderData.stepCount = 1 + (pointCount - 1) * 3;\n } else {\n renderData.stepCount = pointCount * 2 - 1;\n }\n }\n }\n \n if (seriesType === 'heatmap') {\n const hData = s.getHeatmapData();\n const hStyle = s.getHeatmapStyle();\n if (hData) {\n // Heatmap count is 6 vertices per cell (2 triangles)\n const w = hData.xValues.length;\n const h = hData.yValues.length;\n renderData.count = (w - 1) * (h - 1) * 6;\n \n // Calculate Z-bounds if not provided\n let zMin = Infinity, zMax = -Infinity;\n for (let i = 0; i < hData.zValues.length; i++) {\n const v = hData.zValues[i];\n if (v < zMin) zMin = v;\n if (v > zMax) zMax = v;\n }\n if (zMin === zMax) {\n zMin -= 1;\n zMax += 1;\n }\n\n renderData.zBounds = { \n min: hStyle?.colorScale?.min ?? (zMin === Infinity ? 0 : zMin), \n max: hStyle?.colorScale?.max ?? (zMax === -Infinity ? 1 : zMax) \n };\n \n if (renderData.zBounds.min === renderData.zBounds.max) {\n renderData.zBounds.max = renderData.zBounds.min + 1;\n }\n \n // Attach texture\n const colormapId = `${s.getId()}_colormap`;\n renderData.colormapTexture = ctx.renderer.getTexture(colormapId);\n }\n }\n }\n\n if (seriesType === 'candlestick') {\n const bullishBuf = ctx.renderer.getBuffer(`${s.getId()}_bullish`);\n if (bullishBuf) {\n seriesData.push({\n id: `${s.getId()}_bullish`,\n buffer: bullishBuf,\n count: s.bullishCount || 0,\n style: { ...s.getStyle(), color: (s.getStyle() as any).bullishColor || '#26a69a' },\n visible: s.isVisible(),\n type: 'bar', // Using bar renderer (triangles)\n yBounds,\n });\n }\n const bearishBuf = ctx.renderer.getBuffer(`${s.getId()}_bearish`);\n if (bearishBuf) {\n seriesData.push({\n id: `${s.getId()}_bearish`,\n buffer: bearishBuf,\n count: s.bearishCount || 0,\n style: { ...s.getStyle(), color: (s.getStyle() as any).bearishColor || '#ef5350' },\n visible: s.isVisible(),\n type: 'bar', // Using bar renderer (triangles)\n yBounds,\n });\n }\n } else if (renderData) {\n seriesData.push(renderData);\n }\n }\n });\n\n return seriesData;\n}\n\n/**\n * Render overlay elements (axes, grid, annotations, etc.)\n */\nexport function renderOverlay(\n ctx: RenderContext,\n plotArea: PlotArea,\n primaryYScale: Scale\n): void {\n const rect = ctx.container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n console.warn(\"[SciChart] Container has zero size in render, skipping overlay\");\n return;\n }\n\n ctx.overlay.clear(rect.width, rect.height);\n ctx.overlay.drawGrid(plotArea, ctx.xScale, primaryYScale);\n ctx.overlay.drawXAxis(plotArea, ctx.xScale, ctx.xAxisOptions);\n\n // Group axes by position\n const leftAxes: string[] = [];\n const rightAxes: string[] = [];\n \n ctx.yAxisOptionsMap.forEach((opts, id) => {\n if(opts.position === 'right') rightAxes.push(id);\n else leftAxes.push(id);\n });\n\n // Draw Left Axes (stacked outwards)\n leftAxes.forEach((id, index) => {\n const scale = ctx.yScales.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if(scale && opts) {\n const offset = index * 65; \n ctx.overlay.drawYAxis(plotArea, scale, opts, 'left', offset);\n }\n });\n\n // Draw Right Axes (stacked outwards)\n rightAxes.forEach((id, index) => {\n const scale = ctx.yScales.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if(scale && opts) {\n const offset = index * 65; \n ctx.overlay.drawYAxis(plotArea, scale, opts, 'right', offset);\n }\n });\n\n ctx.overlay.drawPlotBorder(plotArea);\n\n // Draw Error Bars for all series with error data\n ctx.series.forEach((s) => {\n if (s.isVisible() && s.hasErrorData()) {\n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const scale = ctx.yScales.get(axisId);\n const yScale = scale || primaryYScale; \n \n ctx.overlay.drawErrorBars(plotArea, s, ctx.xScale, yScale);\n }\n });\n\n // Draw Selection Box\n if (ctx.selectionRect) {\n ctx.overlay.drawSelectionRect(ctx.selectionRect);\n }\n\n // Draw Annotations\n if (ctx.annotationManager.count > 0) {\n ctx.annotationManager.render(ctx.overlayCtx, plotArea, ctx.viewBounds);\n }\n\n // Cursor\n if (ctx.cursorOptions?.enabled && ctx.cursorPosition) {\n // Use legacy tooltip only if new tooltip system doesn't have an active tooltip\n const skipLegacyTooltip = ctx.tooltip?.hasActiveTooltip?.();\n \n const cursor: CursorState = {\n enabled: true,\n x: ctx.cursorPosition.x,\n y: ctx.cursorPosition.y,\n crosshair: ctx.cursorOptions.crosshair ?? false,\n tooltipText: skipLegacyTooltip \n ? undefined \n : (ctx.cursorOptions.formatter\n ? ctx.cursorOptions.formatter(\n ctx.pixelToDataX(ctx.cursorPosition.x),\n ctx.pixelToDataY(ctx.cursorPosition.y),\n \"\"\n )\n : `X: ${ctx.pixelToDataX(ctx.cursorPosition.x).toFixed(3)}\\nY: ${ctx.pixelToDataY(ctx.cursorPosition.y).toExponential(2)}`),\n };\n ctx.overlay.drawCursor(plotArea, cursor);\n }\n\n // Draw new tooltips\n if (ctx.tooltip) {\n ctx.tooltip.render();\n }\n\n // Statistics Panel\n if (ctx.stats && ctx.showStatistics) {\n ctx.stats.update(ctx.viewBounds);\n }\n}\n","/**\n * Series Bounds Calculation Logic\n */\nimport type { SeriesData, Bounds, SeriesType, HeatmapData } from \"../../types\";\n\nexport function calculateSeriesBounds(\n type: SeriesType,\n data: SeriesData,\n heatmapData?: HeatmapData\n): Bounds {\n if (type === \"heatmap\" && heatmapData) {\n const { xValues, yValues } = heatmapData;\n let xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity;\n for (let i = 0; i < xValues.length; i++) {\n const v = xValues[i];\n if (v < xMin) xMin = v;\n if (v > xMax) xMax = v;\n }\n for (let i = 0; i < yValues.length; i++) {\n const v = yValues[i];\n if (v < yMin) yMin = v;\n if (v > yMax) yMax = v;\n }\n return { xMin, xMax, yMin, yMax };\n }\n\n const { x, y, y2, high, low } = data;\n if (x.length === 0) return { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n\n for (let i = 0; i < x.length; i++) {\n const xVal = x[i];\n if (!isFinite(xVal)) continue;\n\n if (xVal < xMin) xMin = xVal;\n if (xVal > xMax) xMax = xVal;\n\n // Check all possible Y values for this point\n const yValues = [y[i]];\n if (y2 && isFinite(y2[i])) yValues.push(y2[i]);\n if (high && isFinite(high[i])) yValues.push(high[i]);\n if (low && isFinite(low[i])) yValues.push(low[i]);\n\n for (const v of yValues) {\n if (isFinite(v)) {\n if (v < yMin) yMin = v;\n if (v > yMax) yMax = v;\n }\n }\n }\n\n if (xMin === Infinity) return { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n return { xMin, xMax, yMin, yMax };\n}\n","/**\n * Series Data Utilities\n */\nimport type { SeriesData } from \"../../types\";\n\nexport function ensureTypedArray(\n data: Float32Array | Float64Array | number[] | undefined\n): Float32Array | Float64Array {\n if (!data) return new Float32Array(0);\n if (data instanceof Float32Array || data instanceof Float64Array) return data;\n return new Float32Array(data);\n}\n\nexport function appendTypedArray(\n existing: Float32Array | Float64Array,\n newData: Float32Array | Float64Array\n): Float32Array | Float64Array {\n const combined = new (existing.constructor as\n | Float32ArrayConstructor\n | Float64ArrayConstructor)(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n return combined;\n}\n\nexport function applySmoothing(data: SeriesData, windowSize: number): SeriesData {\n const { x, y } = data;\n const len = x.length;\n if (len < windowSize) return { ...data };\n\n const smoothedY = new Float32Array(len);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < len; i++) {\n let sum = 0;\n let count = 0;\n for (let j = i - halfWindow; j <= i + halfWindow; j++) {\n if (j >= 0 && j < len) {\n sum += y[j];\n count++;\n }\n }\n smoothedY[i] = sum / count;\n }\n\n return { x, y: smoothedY };\n}\n\nexport function getYError(data: SeriesData, i: number): [number, number] | null {\n if (i < 0 || i >= data.x.length) return null;\n if (data.yError && i < data.yError.length) {\n const err = data.yError[i];\n return [err, err];\n }\n const minus = data.yErrorMinus?.[i] ?? 0;\n const plus = data.yErrorPlus?.[i] ?? 0;\n return (minus > 0 || plus > 0) ? [minus, plus] : null;\n}\n\nexport function getXError(data: SeriesData, i: number): [number, number] | null {\n if (i < 0 || i >= data.x.length) return null;\n if (data.xError && i < data.xError.length) {\n const err = data.xError[i];\n return [err, err];\n }\n const minus = data.xErrorMinus?.[i] ?? 0;\n const plus = data.xErrorPlus?.[i] ?? 0;\n return (minus > 0 || plus > 0) ? [minus, plus] : null;\n}\n\n","/**\n * Series - Represents a single data series in the chart\n */\nimport type {\n SeriesOptions,\n SeriesData,\n SeriesStyle,\n SeriesUpdateData,\n Bounds,\n SeriesType,\n HeatmapOptions,\n HeatmapData,\n HeatmapStyle,\n} from \"../../types\";\nimport { calculateSeriesBounds } from \"./SeriesBounds\";\nimport { \n ensureTypedArray, \n appendTypedArray, \n applySmoothing,\n getYError,\n getXError\n} from \"./SeriesDataUtils\";\n\nconst DEFAULT_STYLE: SeriesStyle = {\n color: \"#ff0055\",\n width: 1.5,\n opacity: 1,\n pointSize: 4,\n};\n\nexport class Series {\n private id: string;\n private type: SeriesType;\n private yAxisId?: string;\n private data: SeriesData;\n private style: SeriesStyle;\n private visible: boolean;\n private name?: string;\n private stackId?: string;\n private cycle?: number;\n private maxPoints?: number;\n\n public bullishCount = 0;\n public bearishCount = 0;\n\n private heatmapData?: HeatmapData;\n private heatmapStyle?: HeatmapStyle;\n\n private lastAppendCount = 0;\n private cachedBounds: Bounds | null = null;\n private boundsNeedsUpdate = true;\n private _needsBufferUpdate = true;\n private smoothedData: SeriesData | null = null;\n private smoothingNeedsUpdate = true;\n\n constructor(options: SeriesOptions | HeatmapOptions) {\n this.id = options.id;\n this.name = options.name;\n this.type = options.type;\n this.yAxisId = options.yAxisId;\n this.visible = options.visible ?? true;\n this.stackId = (options as SeriesOptions).stackId;\n this.cycle = (options as any).cycle;\n this.maxPoints = (options as any).maxPoints;\n\n if (this.type === \"heatmap\") {\n const hOpts = options as HeatmapOptions;\n this.data = { x: new Float32Array(0), y: new Float32Array(0) };\n this.heatmapData = {\n xValues: ensureTypedArray(hOpts.data.xValues),\n yValues: ensureTypedArray(hOpts.data.yValues),\n zValues: ensureTypedArray(hOpts.data.zValues),\n };\n this.heatmapStyle = hOpts.style;\n } else {\n const d = (options as SeriesOptions).data;\n this.data = {\n x: ensureTypedArray(d?.x),\n y: ensureTypedArray(d?.y),\n yError: d?.yError ? ensureTypedArray(d.yError) : undefined,\n yErrorPlus: d?.yErrorPlus ? ensureTypedArray(d.yErrorPlus) : undefined,\n yErrorMinus: d?.yErrorMinus ? ensureTypedArray(d.yErrorMinus) : undefined,\n xError: d?.xError ? ensureTypedArray(d.xError) : undefined,\n xErrorPlus: d?.xErrorPlus ? ensureTypedArray(d.xErrorPlus) : undefined,\n xErrorMinus: d?.xErrorMinus ? ensureTypedArray(d.xErrorMinus) : undefined,\n y2: d?.y2 ? ensureTypedArray(d.y2) : undefined,\n open: d?.open ? ensureTypedArray(d.open) : undefined,\n high: d?.high ? ensureTypedArray(d.high) : undefined,\n low: d?.low ? ensureTypedArray(d.low) : undefined,\n close: d?.close ? ensureTypedArray(d.close) : undefined,\n };\n }\n this.style = { ...DEFAULT_STYLE, ...options.style };\n // Legacy support for top-level style props\n if ((options as any).color) this.style.color = (options as any).color;\n if ((options as any).width) this.style.width = (options as any).width;\n if ((options as any).pointSize) this.style.pointSize = (options as any).pointSize;\n }\n\n getId = () => this.id;\n getName = () => this.name || this.id;\n getType = () => this.type;\n getYAxisId = () => this.yAxisId;\n getStackId = () => this.stackId;\n getVisible = () => this.visible;\n isVisible = () => this.visible;\n getStyle = () => this.style;\n getHeatmapData = () => this.heatmapData;\n getHeatmapStyle = () => this.heatmapStyle;\n getCycle = () => this.cycle;\n getPointCount = () => this.type === \"heatmap\" ? this.heatmapData!.xValues.length * this.heatmapData!.yValues.length : this.data.x.length;\n getLastAppendCount = () => this.lastAppendCount;\n resetLastAppendCount = () => { this.lastAppendCount = 0; };\n hasErrorData = () => !!(this.data.yError || this.data.yErrorPlus || this.data.yErrorMinus || this.data.xError || this.data.xErrorPlus || this.data.xErrorMinus);\n getYError = (i: number) => getYError(this.data, i);\n getXError = (i: number) => getXError(this.data, i);\n\n getData(): SeriesData {\n if (this.style.smoothing && this.style.smoothing > 0) {\n if (this.smoothingNeedsUpdate || !this.smoothedData) {\n this.smoothedData = applySmoothing(this.data, 5);\n this.smoothingNeedsUpdate = false;\n }\n return this.smoothedData;\n }\n return this.data;\n }\n\n getBounds(): Bounds | null {\n if (this.data.x.length === 0 && this.type !== \"heatmap\") return null;\n if (this.boundsNeedsUpdate || !this.cachedBounds) {\n this.cachedBounds = calculateSeriesBounds(this.type, this.data, this.heatmapData);\n this.boundsNeedsUpdate = false;\n }\n return this.cachedBounds;\n }\n\n updateData(update: SeriesUpdateData): void {\n if (!update) return;\n if (update.append) {\n const newX = ensureTypedArray(update.x);\n const newY = ensureTypedArray(update.y);\n if (newX.length > 0) {\n this.data.x = appendTypedArray(this.data.x, newX);\n this.data.y = appendTypedArray(this.data.y, newY);\n if (update.y2) this.data.y2 = this.data.y2 ? appendTypedArray(this.data.y2, ensureTypedArray(update.y2)) : ensureTypedArray(update.y2);\n if (update.open) this.data.open = this.data.open ? appendTypedArray(this.data.open, ensureTypedArray(update.open)) : ensureTypedArray(update.open);\n if (update.high) this.data.high = this.data.high ? appendTypedArray(this.data.high, ensureTypedArray(update.high)) : ensureTypedArray(update.high);\n if (update.low) this.data.low = this.data.low ? appendTypedArray(this.data.low, ensureTypedArray(update.low)) : ensureTypedArray(update.low);\n if (update.close) this.data.close = this.data.close ? appendTypedArray(this.data.close, ensureTypedArray(update.close)) : ensureTypedArray(update.close);\n \n this.lastAppendCount += newX.length;\n if (this.maxPoints && this.data.x.length > this.maxPoints) {\n const shift = this.data.x.length - this.maxPoints;\n this.data.x = this.data.x.slice(shift);\n this.data.y = this.data.y.slice(shift);\n if (this.data.y2) this.data.y2 = this.data.y2.slice(shift);\n if (this.data.open) this.data.open = this.data.open.slice(shift);\n if (this.data.high) this.data.high = this.data.high.slice(shift);\n if (this.data.low) this.data.low = this.data.low.slice(shift);\n if (this.data.close) this.data.close = this.data.close.slice(shift);\n this.lastAppendCount = 0;\n }\n }\n } else {\n if (update.x) this.data.x = ensureTypedArray(update.x);\n if (update.y) this.data.y = ensureTypedArray(update.y);\n if (update.y2) this.data.y2 = ensureTypedArray(update.y2);\n if (update.open) this.data.open = ensureTypedArray(update.open);\n if (update.high) this.data.high = ensureTypedArray(update.high);\n if (update.low) this.data.low = ensureTypedArray(update.low);\n if (update.close) this.data.close = ensureTypedArray(update.close);\n this.lastAppendCount = 0;\n }\n this.boundsNeedsUpdate = true;\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n\n setStyle(style: Partial<SeriesStyle>): void {\n const oldSmooth = this.style.smoothing;\n this.style = { ...this.style, ...style };\n if (this.style.smoothing !== oldSmooth) {\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n }\n\n setType(type: SeriesType): void {\n this.type = type;\n this._needsBufferUpdate = true;\n }\n\n setVisible(visible: boolean): void {\n this.visible = visible;\n }\n\n get needsBufferUpdate() { return this._needsBufferUpdate; }\n set needsBufferUpdate(val: boolean) { this._needsBufferUpdate = val; }\n\n setMaxPoints(maxPoints: number | undefined): void {\n this.maxPoints = maxPoints;\n if (this.maxPoints && this.data.x.length > this.maxPoints) {\n const shift = this.data.x.length - this.maxPoints;\n this.data.x = this.data.x.slice(shift);\n this.data.y = this.data.y.slice(shift);\n if (this.data.y2) this.data.y2 = this.data.y2.slice(shift);\n if (this.data.open) this.data.open = this.data.open.slice(shift);\n if (this.data.high) this.data.high = this.data.high.slice(shift);\n if (this.data.low) this.data.low = this.data.low.slice(shift);\n if (this.data.close) this.data.close = this.data.close.slice(shift);\n this._needsBufferUpdate = true;\n }\n }\n\n destroy(): void {\n this.data = { x: new Float32Array(0), y: new Float32Array(0) };\n this.cachedBounds = null;\n }\n}\n","/**\n * WebGL Renderer Interface & Factory\n *\n * This module provides a common interface for WebGL rendering.\n * Currently optimized for NativeWebGLRenderer (zero dependencies).\n */\n\nimport type { Bounds } from '../types';\nimport { NativeWebGLRenderer } from './NativeWebGLRenderer';\n\n// ============================================\n// Common Types\n// ============================================\n\nexport interface SeriesRenderData {\n id: string;\n buffer: WebGLBuffer;\n count: number;\n style: any;\n visible: boolean;\n type: string;\n zBounds?: { min: number; max: number };\n colormapTexture?: WebGLTexture;\n}\n\nexport interface RenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n}\n\n// ============================================\n// Renderer Interface\n// ============================================\n\n/**\n * Common interface for all WebGL renderer implementations\n */\nexport interface IWebGLRenderer {\n /** Check if WebGL is available and initialized */\n readonly available: boolean;\n\n /**\n * Create or update a GPU buffer with interleaved X,Y data\n * @param id - Unique buffer identifier\n * @param data - Interleaved Float32Array [x0, y0, x1, y1, ...]\n */\n createBuffer(id: string, data: Float32Array): void;\n\n /**\n * Get a buffer by ID\n */\n getBuffer(id: string): WebGLBuffer | undefined;\n\n /**\n * Delete a buffer and free GPU memory\n */\n deleteBuffer(id: string): void;\n \n /** \n * Create a 1D texture for heatmaps \n */\n createColormapTexture(id: string, data: Uint8Array): WebGLTexture;\n\n /**\n * Render a frame with all visible series\n */\n render(series: SeriesRenderData[], options: RenderOptions): void;\n\n /**\n * Handle canvas resize\n */\n resize(): void;\n\n /**\n * Get WebGL capabilities/limits\n */\n getLimits(): Record<string, unknown>;\n\n /**\n * Cleanup and destroy all GPU resources\n */\n destroy(): void;\n}\n\n// ============================================\n// Factory Functions\n// ============================================\n\n/**\n * Create a WebGL renderer (Native WebGL)\n *\n * @param canvas - Target canvas element\n */\nexport function createRenderer(canvas: HTMLCanvasElement): IWebGLRenderer {\n return new NativeWebGLRenderer(canvas);\n}\n\n/**\n * Create a renderer synchronously (native only)\n */\nexport { NativeWebGLRenderer as createNativeRenderer } from './NativeWebGLRenderer';\n","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(\"[SciChart] 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(\"[SciChart] 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(\"[SciChart] 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","/**\n * Prepare bar chart data for WebGL rendering\n * Creates rectangle vertices for each bar (2 triangles per bar = 6 vertices)\n * \n * @param x - X positions of bar centers\n * @param y - Y heights of bars\n * @param barWidth - Width of each bar in data units\n * @returns Interleaved vertex data ready for gl.TRIANGLES\n */\nexport function interleaveBarData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n barWidth: number\n): Float32Array {\n const n = Math.min(x.length, y.length);\n // Each bar = 2 triangles = 6 vertices, 2 floats per vertex\n const result = new Float32Array(n * 6 * 2);\n \n const halfWidth = barWidth * 0.5;\n \n for (let i = 0; i < n; i++) {\n const xi = x[i];\n const yi = y[i];\n const base = i * 12; // 6 vertices * 2 floats\n \n // Define bar corners\n const x0 = xi - halfWidth; // Left\n const x1 = xi + halfWidth; // Right\n const y0 = 0; // Bottom\n const y1 = yi; // Top\n \n // First triangle (bottom-left, bottom-right, top-left)\n result[base + 0] = x0;\n result[base + 1] = y0;\n result[base + 2] = x1;\n result[base + 3] = y0;\n result[base + 4] = x0;\n result[base + 5] = y1;\n \n // Second triangle (top-left, bottom-right, top-right)\n result[base + 6] = x0;\n result[base + 7] = y1;\n result[base + 8] = x1;\n result[base + 9] = y0;\n result[base + 10] = x1;\n result[base + 11] = y1;\n }\n \n return result;\n}\n\n/**\n * Calculate automatic bar width based on data spacing\n */\nexport function calculateBarWidth(x: Float32Array | Float64Array | number[]): number {\n if (x.length < 2) return 1.0;\n \n // Find minimum spacing between consecutive bars\n let minSpacing = Infinity;\n for (let i = 1; i < x.length; i++) {\n const spacing = Math.abs(x[i] - x[i - 1]);\n if (spacing > 0 && spacing < minSpacing) {\n minSpacing = spacing;\n }\n }\n \n // Bar width is 80% of minimum spacing (20% gap)\n return minSpacing === Infinity ? 1.0 : minSpacing * 0.8;\n}\n","/**\n * Prepare Heatmap data for WebGL rendering\n * Creates a mesh of triangles for the grid.\n * \n * @param x - X coordinates of grid columns\n * @param y - Y coordinates of grid rows\n * @param z - Z values (matrix flattened in row-major order: width=x.length, height=y.length)\n * @returns Interleaved data [x, y, value, ...] ready for gl.TRIANGLES\n */\nexport function interleaveHeatmapData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n z: Float32Array | Float64Array | number[]\n): Float32Array {\n const width = x.length;\n const height = y.length;\n \n if (width * height > z.length) {\n console.warn(\"[Heatmap] Z array is too small for the specified grid dimensions\");\n }\n\n // Each cell is 2 triangles = 6 vertices\n // Each vertex has 3 floats: [x, y, value]\n const numCells = (width - 1) * (height - 1);\n const result = new Float32Array(numCells * 6 * 3);\n \n let idx = 0;\n for (let j = 0; j < height - 1; j++) {\n for (let i = 0; i < width - 1; i++) {\n // Corners\n const x0 = x[i];\n const x1 = x[i+1];\n const y0 = y[j];\n const y1 = y[j+1];\n \n const v00 = z[j * width + i];\n const v10 = z[j * width + (i + 1)];\n const v01 = z[(j + 1) * width + i];\n const v11 = z[(j + 1) * width + (i + 1)];\n \n // Triangle 1 (BL, BR, TL)\n result[idx++] = x0; result[idx++] = y0; result[idx++] = v00;\n result[idx++] = x1; result[idx++] = y0; result[idx++] = v10;\n result[idx++] = x0; result[idx++] = y1; result[idx++] = v01;\n \n // Triangle 2 (TL, BR, TR)\n result[idx++] = x0; result[idx++] = y1; result[idx++] = v01;\n result[idx++] = x1; result[idx++] = y0; result[idx++] = v10;\n result[idx++] = x1; result[idx++] = y1; result[idx++] = v11;\n }\n }\n \n return result;\n}\n\n/**\n * Generates a colormap texture data\n * Viridis approximation\n */\nexport function getColormap(name: string = 'viridis'): Uint8Array {\n const size = 256;\n const data = new Uint8Array(size * 4);\n \n for (let i = 0; i < size; i++) {\n const t = i / (size - 1);\n let r, g, b;\n \n if (name === 'jet') {\n r = Math.min(Math.max(1.5 - Math.abs(t * 4 - 3), 0), 1);\n g = Math.min(Math.max(1.5 - Math.abs(t * 4 - 2), 0), 1);\n b = Math.min(Math.max(1.5 - Math.abs(t * 4 - 1), 0), 1);\n } else if (name === 'grayscale') {\n r = g = b = t;\n } else if (name === 'plasma') {\n r = 0.5 + 0.5 * Math.sin(Math.PI * (t - 0.5));\n g = 0.5 + 0.5 * Math.sin(Math.PI * t);\n b = 0.8;\n } else { // default viridis approx\n r = 0.267 * (1 - t) + 0.993 * t;\n g = 0.005 * (1 - t) + 0.906 * t;\n b = 0.337 * (1 - t) + 0.144 * t;\n // More accurate viridis constants could be used\n }\n \n data[i * 4 + 0] = r * 255;\n data[i * 4 + 1] = g * 255;\n data[i * 4 + 2] = b * 255;\n data[i * 4 + 3] = 255;\n }\n \n return data;\n}\n","/**\n * Candlestick Renderer Utilities\n */\n\n/**\n * Interleave data for candlestick rendering\n * Each candle is represented by a body (box) and a wick (line/thin box)\n * Returns a Float32Array of interleaved [x, y] coordinates for TRIANGLES\n */\nexport function interleaveCandlestickData(\n x: Float32Array | Float64Array,\n open: Float32Array | Float64Array,\n high: Float32Array | Float64Array,\n low: Float32Array | Float64Array,\n close: Float32Array | Float64Array,\n width: number\n): { bullish: Float32Array; bearish: Float32Array } {\n const n = x.length;\n const bullishBody: number[] = [];\n const bearishBody: number[] = [];\n \n const halfWidth = width / 2;\n const wickWidth = width / 10;\n const halfWick = wickWidth / 2;\n\n for (let i = 0; i < n; i++) {\n const isBullish = close[i] >= open[i];\n const target = isBullish ? bullishBody : bearishBody;\n \n const bodyTop = Math.max(open[i], close[i]);\n const bodyBottom = Math.min(open[i], close[i]);\n \n // Body (Rectangle as 2 triangles)\n appendRect(target, x[i] - halfWidth, bodyBottom, x[i] + halfWidth, bodyTop);\n \n // Wick (Rectangle as 2 triangles, thin)\n appendRect(target, x[i] - halfWick, low[i], x[i] + halfWick, high[i]);\n }\n\n return {\n bullish: new Float32Array(bullishBody),\n bearish: new Float32Array(bearishBody)\n };\n}\n\nfunction appendRect(arr: number[], x1: number, y1: number, x2: number, y2: number) {\n // Triangle 1\n arr.push(x1, y1, x2, y1, x1, y2);\n // Triangle 2\n arr.push(x2, y1, x2, y2, x1, y2);\n}\n","/**\n * Series Buffer Management and Stacking Logic\n */\nimport { Series } from \"../../Series\";\nimport {\n interleaveData,\n interleaveStepData,\n interleaveBandData,\n interleaveBarData,\n calculateBarWidth,\n interleaveHeatmapData,\n getColormap,\n interleaveCandlestickData,\n} from \"../../../renderer\";\n\nexport function updateSeriesBuffer(ctx: any, s: Series): void {\n const stackId = s.getStackId();\n if (stackId) {\n refreshStack(ctx, stackId);\n return;\n }\n\n const d = s.getData();\n const seriesType = s.getType();\n if (seriesType !== \"heatmap\" && (!d || d.x.length === 0)) return;\n const seriesId = s.getId();\n\n if (seriesType === \"band\" || seriesType === \"area\") {\n const y2 = seriesType === \"area\" ? new Float32Array(d.x.length).fill(0) : (d.y2 || new Float32Array(d.x.length).fill(0));\n ctx.renderer.createBuffer(seriesId, interleaveBandData(d.x, d.y, y2));\n } else if (seriesType === \"bar\") {\n const barWidth = (s.getStyle() as any).barWidth ?? calculateBarWidth(d.x);\n ctx.renderer.createBuffer(seriesId, interleaveBarData(d.x, d.y, barWidth));\n } else if (seriesType === \"heatmap\") {\n updateHeatmapBuffer(ctx, s);\n } else if (seriesType === \"candlestick\") {\n const d = s.getData();\n if (d.open && d.high && d.low && d.close) {\n const barWidth = (s.getStyle() as any).barWidth ?? calculateBarWidth(d.x);\n const { bullish, bearish } = interleaveCandlestickData(d.x, d.open, d.high, d.low, d.close, barWidth);\n ctx.renderer.createBuffer(`${seriesId}_bullish`, bullish);\n ctx.renderer.createBuffer(`${seriesId}_bearish`, bearish);\n // Store counts for rendering\n s.bullishCount = (bullish.length / 2);\n s.bearishCount = (bearish.length / 2);\n }\n } else {\n ctx.renderer.createBuffer(seriesId, interleaveData(d.x, d.y));\n }\n\n if (seriesType === \"step\" || seriesType === \"step+scatter\") {\n const stepMode = s.getStyle().stepMode ?? \"after\";\n ctx.renderer.createBuffer(`${seriesId}_step`, interleaveStepData(d.x, d.y, stepMode));\n }\n s.resetLastAppendCount();\n}\n\nfunction updateHeatmapBuffer(ctx: any, s: Series) {\n const hData = s.getHeatmapData();\n const hStyle = s.getHeatmapStyle();\n if (!hData || hData.xValues.length < 2) return;\n ctx.renderer.createBuffer(s.getId(), interleaveHeatmapData(hData.xValues, hData.yValues, hData.zValues));\n const colormapName = hStyle?.colorScale?.name || \"viridis\";\n ctx.renderer.createColormapTexture(`${s.getId()}_colormap`, getColormap(colormapName));\n}\n\nexport function refreshStack(ctx: any, stackId: string): void {\n const stackSeries = Array.from(ctx.series.values())\n .filter((s: any) => s.getStackId() === stackId);\n\n let cumulativeY: Float32Array | null = null;\n for (const s of stackSeries as Series[]) {\n const d = s.getData();\n if (d.x.length === 0) continue;\n if (!cumulativeY) cumulativeY = new Float32Array(d.y.length).fill(0);\n \n const yBaseline = new Float32Array(cumulativeY);\n for (let i = 0; i < d.y.length; i++) cumulativeY[i] += d.y[i];\n \n // Stacked series always rendered as bands (fill between cumulativeY and yBaseline)\n ctx.renderer.createBuffer(s.getId(), interleaveBandData(d.x, cumulativeY, yBaseline));\n s.resetLastAppendCount();\n }\n}\n","/**\n * Series Actions (Add, Remove, Append)\n */\nimport { Series } from \"../../Series\";\nimport type { SeriesOptions, HeatmapOptions, SeriesUpdateData } from \"../../../types\";\nimport { updateSeriesBuffer } from \"./SeriesBuffer\";\n\nexport function addSeries(ctx: any, options: SeriesOptions | HeatmapOptions): void {\n const s = new Series(options);\n ctx.series.set(s.getId(), s);\n updateSeriesBuffer(ctx, s);\n if (ctx.xAxisOptions.auto || Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)) {\n ctx.autoScale();\n }\n ctx.updateLegend?.();\n ctx.requestRender();\n}\n\nexport function removeSeries(ctx: any, id: string): void {\n const s = ctx.series.get(id);\n if (s) {\n ctx.renderer.deleteBuffer(id);\n ctx.renderer.deleteBuffer(`${id}_step`);\n s.destroy();\n ctx.series.delete(id);\n ctx.updateLegend?.();\n ctx.requestRender();\n }\n}\n\nexport function updateSeries(ctx: any, id: string, data: SeriesUpdateData): void {\n const s = ctx.series.get(id);\n if (s) {\n s.updateData(data);\n updateSeriesBuffer(ctx, s);\n ctx.requestRender();\n }\n}\n\nexport function appendData(ctx: any, id: string, x: number[] | Float32Array, y: number[] | Float32Array): void {\n const s = ctx.series.get(id);\n if (!s) return;\n const oldMaxX = s.getBounds()?.xMax ?? -Infinity;\n s.updateData({ x: x as any, y: y as any, append: true });\n updateSeriesBuffer(ctx, s);\n\n if (ctx.autoScrollEnabled) {\n const newBounds = s.getBounds();\n if (newBounds) {\n const xRange = ctx.viewBounds.xMax - ctx.viewBounds.xMin;\n if (oldMaxX >= ctx.viewBounds.xMax - xRange * 0.05) {\n ctx.viewBounds.xMax = newBounds.xMax;\n ctx.viewBounds.xMin = ctx.viewBounds.xMax - xRange;\n }\n }\n }\n if (ctx.xAxisOptions.auto || Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)) {\n ctx.autoScale();\n }\n ctx.requestRender();\n}\n\nexport function setMaxPoints(ctx: any, id: string, maxPoints: number): void {\n const s = ctx.series.get(id);\n if (s) {\n s.setMaxPoints(maxPoints);\n ctx.requestRender();\n }\n}\n","/**\n * Series Curve Fitting Support\n */\nimport { fitData, type FitType, type FitOptions } from \"../../../analysis\";\n\nexport function addFitLine(\n ctx: any,\n seriesId: string,\n type: FitType,\n options: FitOptions = {}\n): string {\n const s = ctx.series.get(seriesId);\n if (!s) throw new Error(`Series ${seriesId} not found`);\n\n const data = s.getData();\n if (!data || data.x.length < 2) return \"\";\n\n const result = fitData(data.x as any, data.y as any, type, options);\n const bounds = s.getBounds();\n const xMin = bounds?.xMin ?? 0;\n const xMax = bounds?.xMax ?? 1;\n const dataWidth = xMax - xMin;\n const fitResolution = 200;\n const fitX = new Float32Array(fitResolution);\n const fitY = new Float32Array(fitResolution);\n\n for (let i = 0; i < fitResolution; i++) {\n const x = xMin + (i / (fitResolution - 1)) * dataWidth;\n fitX[i] = x;\n fitY[i] = result.predict(x);\n }\n\n const fitId = `${seriesId}-fit-${Date.now()}`;\n const sourceStyle = s.getStyle();\n\n ctx.addSeries({\n id: fitId,\n type: 'line',\n yAxisId: s.getYAxisId(),\n data: { x: fitX, y: fitY },\n style: {\n color: sourceStyle.color,\n width: (sourceStyle.width || 1) * 1.5,\n opacity: 0.8,\n lineDash: [5, 5]\n }\n });\n\n ctx.addAnnotation({\n type: 'text',\n x: xMin + dataWidth * 0.05,\n y: result.predict(xMin + dataWidth * 0.05),\n text: `${result.equation}\\n(R² = ${result.rSquared.toFixed(4)})`,\n fontSize: 12,\n backgroundColor: 'rgba(0,0,0,0.7)',\n color: sourceStyle.color || '#ffffff',\n padding: 4,\n anchor: 'bottom-left',\n interactive: true\n });\n\n return fitId;\n}\n","/**\n * Scale interface and implementations\n *\n * Scales transform data values to pixel coordinates and vice versa.\n */\n\nexport interface Scale {\n /** Data domain [min, max] */\n domain: [number, number];\n /** Pixel range [min, max] */\n range: [number, number];\n /** Scale type identifier */\n type: \"linear\" | \"log\";\n\n /** Set the domain */\n setDomain(min: number, max: number): void;\n /** Set the range */\n setRange(min: number, max: number): void;\n\n /** Transform data value to pixel */\n transform(value: number): number;\n /** Transform pixel to data value */\n invert(pixel: number): number;\n\n /** Generate nice tick values */\n ticks(count?: number): number[];\n}\n\n/**\n * Linear scale - proportional mapping\n */\nexport class LinearScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\" as const;\n\n setDomain(min: number, max: number): void {\n // Ensure we have a valid, non-zero range\n if (!isFinite(min) || !isFinite(max)) {\n this.domain = [0, 1];\n return;\n }\n if (min === max) {\n this.domain = [min - 0.5, max + 0.5];\n return;\n }\n this.domain = [min, max];\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n }\n\n transform(value: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n const normalized = (value - d0) / (d1 - d0);\n return r0 + normalized * (r1 - r0);\n }\n\n invert(pixel: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n const normalized = (pixel - r0) / (r1 - r0);\n return d0 + normalized * (d1 - d0);\n }\n\n ticks(count = 10): number[] {\n const [min, max] = this.domain;\n if (!isFinite(min) || !isFinite(max) || min === max) return [];\n\n const step = niceStep(min, max, count);\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n\n // Limit ticks to prevent infinite loops or performance issues\n const maxTicks = 100;\n let t = start;\n while (t <= max + step * 0.5 && ticks.length < maxTicks) {\n ticks.push(Math.round(t * 1e12) / 1e12); // Fix floating point\n t += step;\n }\n\n return ticks;\n }\n}\n\n/**\n * Logarithmic scale - for exponential data\n */\nexport class LogScale implements Scale {\n public domain: [number, number] = [1, 1000];\n public range: [number, number] = [0, 100];\n public readonly type = \"log\" as const;\n\n private base = 10;\n\n setDomain(min: number, max: number): void {\n // Log scale requires positive values and non-zero range\n const safeMin = Math.max(min, 1e-12);\n const safeMax = Math.max(max, 1e-12 * 10);\n\n if (safeMin === safeMax) {\n this.domain = [safeMin / 10, safeMax * 10];\n return;\n }\n this.domain = [safeMin, safeMax];\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n }\n\n transform(value: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n\n if (value <= 0) return r0; // Handle invalid values\n\n const logMin = Math.log(d0) / Math.log(this.base);\n const logMax = Math.log(d1) / Math.log(this.base);\n const logVal = Math.log(value) / Math.log(this.base);\n\n const normalized = (logVal - logMin) / (logMax - logMin);\n return r0 + normalized * (r1 - r0);\n }\n\n invert(pixel: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n\n const logMin = Math.log(d0) / Math.log(this.base);\n const logMax = Math.log(d1) / Math.log(this.base);\n\n const normalized = (pixel - r0) / (r1 - r0);\n const logVal = logMin + normalized * (logMax - logMin);\n\n return Math.pow(this.base, logVal);\n }\n\n ticks(count = 10): number[] {\n const [min, max] = this.domain;\n const logMin = Math.floor(Math.log10(min));\n const logMax = Math.ceil(Math.log10(max));\n const ticks: number[] = [];\n\n for (let p = logMin; p <= logMax && ticks.length < count; p++) {\n const value = Math.pow(10, p);\n if (value >= min && value <= max) {\n ticks.push(value);\n }\n }\n\n return ticks;\n }\n}\n\n// ============================================\n// Helpers\n// ============================================\n\n/**\n * Calculate a \"nice\" step size for tick marks\n */\nfunction niceStep(min: number, max: number, count: number): number {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return 1;\n\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n\n let niceNormalized: number;\n if (normalized < 1.5) {\n niceNormalized = 1;\n } else if (normalized < 3) {\n niceNormalized = 2;\n } else if (normalized < 7) {\n niceNormalized = 5;\n } else {\n niceNormalized = 10;\n }\n\n return niceNormalized * magnitude;\n}\n\n/**\n * Factory function to create scale by type\n */\nexport function createScale(type: \"linear\" | \"log\"): Scale {\n return type === \"log\" ? new LogScale() : new LinearScale();\n}\n","/**\n * Chart Setup\n * \n * Handles chart initialization, DOM setup, and configuration.\n */\n\nimport type { ChartOptions, AxisOptions } from \"../../types\";\nimport { parseColor } from \"../../renderer/NativeWebGLRenderer\";\nimport { LinearScale, LogScale, type Scale } from \"../../scales\";\nimport { DEFAULT_THEME, getThemeByName, type ChartTheme } from \"../../theme\";\nimport { MARGINS } from \"./types\";\n\nexport interface SetupResult {\n theme: ChartTheme;\n backgroundColor: [number, number, number, number];\n showLegend: boolean;\n showControls: boolean;\n autoScroll: boolean;\n showStatistics: boolean;\n dpr: number;\n xAxisOptions: AxisOptions;\n xScale: Scale;\n yAxisOptionsMap: Map<string, AxisOptions>;\n yScales: Map<string, Scale>;\n primaryYAxisId: string;\n webglCanvas: HTMLCanvasElement;\n overlayCanvas: HTMLCanvasElement;\n overlayCtx: CanvasRenderingContext2D;\n}\n\n/**\n * Initialize chart configuration from options\n */\nexport function initializeChart(\n container: HTMLDivElement,\n options: ChartOptions\n): SetupResult {\n if (!container) throw new Error(\"[SciChart] Container element is required\");\n\n const dpr = options.devicePixelRatio ?? window.devicePixelRatio;\n\n // Initialize theme\n const theme = typeof options.theme === \"string\"\n ? getThemeByName(options.theme)\n : (options.theme as ChartTheme) ?? DEFAULT_THEME;\n\n const bgColor = parseColor(options.background ?? theme.backgroundColor);\n const backgroundColor: [number, number, number, number] = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n const showLegend = options.showLegend ?? theme.legend.visible;\n const showControls = options.showControls ?? false;\n const autoScroll = options.autoScroll ?? false;\n const showStatistics = options.showStatistics ?? false;\n\n // X Axis\n const xAxisOptions: AxisOptions = { scale: \"linear\", auto: true, ...options.xAxis };\n const xScale = xAxisOptions.scale === \"log\" ? new LogScale() : new LinearScale();\n\n // Process Y Axes\n const yAxisOptionsMap = new Map<string, AxisOptions>();\n const yScales = new Map<string, Scale>();\n let primaryYAxisId = 'default';\n\n const providedYAxes = options.yAxis \n ? (Array.isArray(options.yAxis) ? options.yAxis : [options.yAxis])\n : [{}];\n\n providedYAxes.forEach((axisOpt, index) => {\n const isFirst = index === 0;\n const defaultId = isFirst ? 'default' : `y${index}`;\n const id = axisOpt.id || defaultId;\n \n if (isFirst) primaryYAxisId = id;\n const position = axisOpt.position || (isFirst ? 'left' : 'right');\n const fullOptions: AxisOptions = { scale: \"linear\", auto: true, position, ...axisOpt, id };\n\n yAxisOptionsMap.set(id, fullOptions);\n yScales.set(id, fullOptions.scale === \"log\" ? new LogScale() : new LinearScale());\n });\n\n // Create DOM structure\n container.style.position = \"relative\";\n container.style.overflow = \"hidden\";\n container.style.backgroundColor = options.background ?? theme.backgroundColor;\n\n const webglCanvas = createCanvas(\"webgl\");\n const overlayCanvas = createCanvas(\"overlay\");\n\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n\n container.appendChild(webglCanvas);\n container.appendChild(overlayCanvas);\n\n const ctx = overlayCanvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Failed to get 2D context\");\n\n return {\n theme,\n backgroundColor,\n showLegend,\n showControls,\n autoScroll,\n showStatistics,\n dpr,\n xAxisOptions,\n xScale,\n yAxisOptionsMap,\n yScales,\n primaryYAxisId,\n webglCanvas,\n overlayCanvas,\n overlayCtx: ctx,\n };\n}\n\n/**\n * Create a canvas element\n */\nexport function createCanvas(type: \"webgl\" | \"overlay\"): HTMLCanvasElement {\n const canvas = document.createElement(\"canvas\");\n canvas.style.cssText = \"position:absolute;top:0;left:0;width:100%;height:100%;\";\n if (type === \"overlay\") canvas.style.pointerEvents = \"none\";\n return canvas;\n}\n\n/**\n * Calculate the plot area based on container size and margins\n */\nexport function getPlotArea(\n container: HTMLDivElement,\n yAxisOptionsMap: Map<string, AxisOptions>\n): { x: number; y: number; width: number; height: number } {\n const rect = container.getBoundingClientRect();\n const leftAxisCount = Array.from(yAxisOptionsMap.values()).filter(a => a.position !== 'right').length;\n const rightAxisCount = Array.from(yAxisOptionsMap.values()).filter(a => a.position === 'right').length;\n const leftMargin = MARGINS.left + Math.max(0, leftAxisCount - 1) * 65;\n const rightMargin = MARGINS.right + rightAxisCount * 65;\n return {\n x: leftMargin,\n y: MARGINS.top,\n width: Math.max(1, rect.width - leftMargin - rightMargin),\n height: Math.max(1, rect.height - MARGINS.top - MARGINS.bottom),\n };\n}\n\n/**\n * Get axes layout for interaction manager\n */\nexport function getAxesLayout(\n yAxisOptionsMap: Map<string, AxisOptions>\n): Array<{ id: string; position: 'left' | 'right'; offset: number }> {\n // Separate axes by position to calculate offset correctly\n const result: Array<{ id: string; position: 'left' | 'right'; offset: number }> = [];\n let leftIndex = 0;\n let rightIndex = 0;\n\n yAxisOptionsMap.forEach((opts, id) => {\n const position = (opts.position === 'right' ? 'right' : 'left') as 'left' | 'right';\n const offset = position === 'left' ? leftIndex * 65 : rightIndex * 65;\n \n if (position === 'left') leftIndex++;\n else rightIndex++;\n\n result.push({ id, position, offset });\n });\n\n return result;\n}\n\n/**\n * Resize canvases to match container\n */\nexport function resizeCanvases(\n container: HTMLDivElement,\n webglCanvas: HTMLCanvasElement,\n overlayCanvas: HTMLCanvasElement,\n overlayCtx: CanvasRenderingContext2D,\n dpr: number\n): boolean {\n const rect = container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return false;\n\n const w = rect.width * dpr;\n const h = rect.height * dpr;\n\n [webglCanvas, overlayCanvas].forEach((c) => {\n c.width = w;\n c.height = h;\n });\n\n overlayCtx.scale(dpr, dpr);\n return true;\n}\n\nexport function pixelToDataX(px: number, plotArea: { x: number, width: number }, viewBounds: { xMin: number, xMax: number }): number {\n return viewBounds.xMin + ((px - plotArea.x) / plotArea.width) * (viewBounds.xMax - viewBounds.xMin);\n}\n\nexport function pixelToDataY(py: number, plotArea: { y: number, height: number }, viewBounds: { yMin: number, yMax: number }): number {\n return viewBounds.yMin + (1 - (py - plotArea.y) / plotArea.height) * (viewBounds.yMax - viewBounds.yMin);\n}\n","/**\n * Plugin Manager Implementation\n */\nimport { ChartPlugin, PluginManager as IPluginManager } from \"./types\";\nimport { Chart } from \"../types\";\n\nexport class PluginManagerImpl implements IPluginManager {\n private plugins = new Map<string, ChartPlugin>();\n private chart: Chart;\n\n constructor(chart: Chart) {\n this.chart = chart;\n }\n\n use(plugin: ChartPlugin): void {\n if (this.plugins.has(plugin.name)) {\n console.warn(`[SciChart] Plugin \"${plugin.name}\" is already registered.`);\n return;\n }\n this.plugins.set(plugin.name, plugin);\n plugin.init?.(this.chart);\n }\n\n remove(name: string): boolean {\n const plugin = this.plugins.get(name);\n if (plugin) {\n plugin.destroy?.();\n return this.plugins.delete(name);\n }\n return false;\n }\n\n get(name: string): ChartPlugin | undefined {\n return this.plugins.get(name);\n }\n\n notify(hook: keyof Omit<ChartPlugin, 'name' | 'init'>, ...args: any[]): void {\n this.plugins.forEach(plugin => {\n const handler = plugin[hook] as Function;\n if (typeof handler === 'function') {\n try {\n handler(...args);\n } catch (e) {\n console.error(`[SciChart] Error in plugin \"${plugin.name}\" hook \"${String(hook)}\":`, e);\n }\n }\n });\n }\n\n destroy(): void {\n this.plugins.forEach(plugin => plugin.destroy?.());\n this.plugins.clear();\n }\n}\n","/**\n * ChartControls - In-chart control buttons (Plotly-style)\n *\n * Provides a floating glassmorphism toolbar for chart controls:\n * - Pan/Zoom mode toggle\n * - Reset Zoom\n * - Display Mode (Line, Scatter, Both)\n * - Smoothing toggle\n */\n\nimport { ChartTheme } from \"../theme\";\n\nexport interface ChartControlsCallbacks {\n onResetZoom: () => void;\n onSetType: (type: \"line\" | \"scatter\" | \"line+scatter\") => void;\n onToggleSmoothing: () => void;\n onTogglePan: (active: boolean) => void;\n onExport: () => void;\n onAutoScale: () => void;\n onToggleLegend: (visible: boolean) => void;\n}\n\n// ============================================\n// SVG Icons (Plotly-inspired)\n// ============================================\n\nconst ICONS = {\n PAN: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 11V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M14 10V4a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M10 10.5V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"></path></svg>`,\n RESET: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 4 23 10 17 10\"></polyline><polyline points=\"1 20 1 14 7 14\"></polyline><path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"></path></svg>`,\n LINE: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 3v18h18\"></path><path d=\"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3\"></path></svg>`,\n SCATTER: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\"><circle cx=\"7\" cy=\"14\" r=\"2\"></circle><circle cx=\"11\" cy=\"10\" r=\"2\"></circle><circle cx=\"15\" cy=\"13\" r=\"2\"></circle><circle cx=\"19\" cy=\"8\" r=\"2\"></circle><path d=\"M3 3v18h18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg>`,\n BOTH: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 3v18h18\"></path><path d=\"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3\"></path><circle cx=\"7\" cy=\"14.3\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"10.8\" cy=\"10.5\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"13.6\" cy=\"13.2\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"18.7\" cy=\"8\" r=\"1\" fill=\"currentColor\"></circle></svg>`,\n SMOOTH: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 12c.5 0 .9-.3 1.2-.7l1.6-2.6c.3-.4.7-.7 1.2-.7h2c.5 0 .9.3 1.2.7l1.6 2.6c.3.4.7.7 1.2.7h2c.5 0 .9-.3 1.2-.7l1.6-2.6c.3-.4.7-.7 1.2-.7h2\"></path></svg>`,\n AUTOSCALE: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 3 21 3 21 9\"></polyline><polyline points=\"9 21 3 21 3 15\"></polyline><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line></svg>`,\n EXPORT: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`,\n LEGEND: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 6h16M4 12h16M4 18h7\"></path></svg>`\n};\n\nexport class ChartControls {\n private container: HTMLDivElement;\n private toolbar: HTMLDivElement;\n private callbacks: ChartControlsCallbacks;\n private theme: ChartTheme;\n\n private isSmoothing = false;\n private isPanMode = true;\n private isLegendVisible = true;\n private currentType: \"line\" | \"scatter\" | \"line+scatter\" = \"line\";\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n callbacks: ChartControlsCallbacks\n ) {\n this.callbacks = callbacks;\n this.theme = theme;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = `\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 100;\n pointer-events: auto;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 8px;\n `;\n\n this.toolbar = document.createElement(\"div\");\n this.toolbar.className = \"scichart-modebar\";\n this.updateToolbarStyle();\n\n this.createButtons();\n this.container.appendChild(this.toolbar);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return (\n name.includes(\"dark\") ||\n name.includes(\"midnight\") ||\n name.includes(\"electro\")\n );\n }\n\n private updateToolbarStyle(): void {\n const isDark = this.isDarkTheme();\n\n const bg = this.theme.legend.backgroundColor; // Use legend background for consistency\n const borderColor = this.theme.legend.borderColor;\n const shadow = isDark\n ? \"0 4px 12px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255, 255, 255, 0.1)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.15)\";\n\n this.toolbar.style.cssText = `\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px;\n background: ${bg};\n backdrop-filter: blur(12px) saturate(180%);\n -webkit-backdrop-filter: blur(12px) saturate(180%);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n transition: all 0.3s cubic-bezier(0.4, 0, 0.4, 1);\n `;\n }\n\n private createButtons(): void {\n // Pan Mode\n this.createButton(\n ICONS.PAN,\n \"Pan Mode\",\n () => {\n this.isPanMode = !this.isPanMode;\n this.updateButtonStates();\n this.callbacks.onTogglePan(this.isPanMode);\n },\n \"pan\"\n );\n\n // Reset Zoom\n this.createButton(\n ICONS.RESET,\n \"Reset Zoom\",\n () => this.callbacks.onResetZoom(),\n \"reset\"\n );\n\n // Auto Scale\n this.createButton(\n ICONS.AUTOSCALE,\n \"Auto Scale\",\n () => this.callbacks.onAutoScale(),\n \"autoscale\"\n );\n\n // Separator\n const sep = document.createElement(\"div\");\n const isDark = this.isDarkTheme();\n sep.style.cssText = `width: 1px; height: 20px; background: ${\n isDark ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep);\n\n // Type Switcher\n this.createButton(\n ICONS.LINE,\n \"Toggle Line/Scatter/Both\",\n () => {\n const types: (\"line\" | \"scatter\" | \"line+scatter\")[] = [\n \"line\",\n \"scatter\",\n \"line+scatter\",\n ];\n const nextIdx = (types.indexOf(this.currentType) + 1) % types.length;\n this.currentType = types[nextIdx];\n this.callbacks.onSetType(this.currentType);\n this.updateButtonStates();\n },\n \"type\"\n );\n\n // Smoothing\n this.createButton(\n ICONS.SMOOTH,\n \"Automated Smoothing\",\n () => {\n this.isSmoothing = !this.isSmoothing;\n this.updateButtonStates();\n this.callbacks.onToggleSmoothing();\n },\n \"smooth\"\n );\n\n // Separator\n const sep2 = document.createElement(\"div\");\n sep2.style.cssText = `width: 1px; height: 20px; background: ${\n isDark ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep2);\n\n // Export Image\n this.createButton(\n ICONS.EXPORT,\n \"Export as PNG\",\n () => this.callbacks.onExport(),\n \"export\"\n );\n\n // Separator\n const sep3 = document.createElement(\"div\");\n sep3.style.cssText = `width: 1px; height: 20px; background: ${\n this.isDarkTheme() ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep3);\n\n // Toggle Legend\n this.createButton(\n ICONS.LEGEND,\n \"Toggle Legend\",\n () => {\n this.isLegendVisible = !this.isLegendVisible;\n this.updateButtonStates();\n this.callbacks.onToggleLegend(this.isLegendVisible);\n },\n \"legend\"\n );\n\n this.updateButtonStates();\n }\n\n private enforceSVGVisibility(btn: HTMLButtonElement): void {\n // Force SVG visibility and make sure currentColor is applied even under aggressive page CSS\n const icon = btn.querySelector<HTMLElement>(\".scichart-control-icon\");\n if (icon) {\n icon.style.display = \"flex\";\n icon.style.alignItems = \"center\";\n icon.style.justifyContent = \"center\";\n icon.style.width = \"100%\";\n icon.style.height = \"100%\";\n icon.style.pointerEvents = \"none\";\n }\n\n const svgEl = btn.querySelector<SVGElement>(\"svg\");\n if (svgEl) {\n svgEl.setAttribute(\"width\", \"14\");\n svgEl.setAttribute(\"height\", \"14\");\n (svgEl as any).style.display = \"block\";\n (svgEl as any).style.overflow = \"visible\";\n (svgEl as any).style.color = \"inherit\";\n (svgEl as any).style.stroke = \"currentColor\";\n if (!svgEl.getAttribute(\"fill\")) {\n (svgEl as any).style.fill = \"none\";\n }\n }\n }\n\n private createButton(\n svg: string,\n title: string,\n onClick: () => void,\n id: string\n ): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.innerHTML = `<span class=\"scichart-control-icon\">${svg}</span>`;\n btn.title = title;\n btn.dataset.id = id;\n\n const isDark = this.isDarkTheme();\n const color = isDark ? \"#ffffff\" : \"#1e293b\";\n\n btn.style.cssText = `\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: ${color};\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n opacity: 0.9;\n `;\n\n btn.onmouseenter = () => {\n btn.style.opacity = \"1\";\n btn.style.background = isDark\n ? \"rgba(255, 255, 255, 0.15)\"\n : \"rgba(0, 0, 0, 0.1)\";\n btn.style.transform = \"translateY(-1px)\";\n btn.style.boxShadow = isDark\n ? \"0 2px 4px rgba(0,0,0,0.4)\"\n : \"0 2px 4px rgba(0,0,0,0.1)\";\n };\n btn.onmouseleave = () => {\n btn.style.transform = \"none\";\n btn.style.boxShadow = \"none\";\n this.updateButtonStates();\n };\n btn.onclick = onClick;\n\n // Force SVG visibility\n this.enforceSVGVisibility(btn);\n\n this.toolbar.appendChild(btn);\n return btn;\n }\n\n private updateButtonStates(): void {\n const buttons = this.toolbar.querySelectorAll(\"button\");\n const isDark = this.isDarkTheme();\n\n const activeColor = \"#38bdf8\"; // Brighter blue\n const smoothActiveColor = \"#fb7185\"; // Brighter pink\n const legendActiveColor = \"#4ade80\"; // Brighter green\n const normalColor = isDark ? \"#f1f5f9\" : \"#334155\"; // High contrast\n\n buttons.forEach((btn: HTMLButtonElement) => {\n const id = btn.dataset.id;\n const isHover = btn.matches(\":hover\");\n\n if (id === \"pan\") {\n btn.style.color = this.isPanMode ? activeColor : normalColor;\n btn.style.opacity = isHover || this.isPanMode ? \"1\" : \"0.8\";\n if (this.isPanMode) {\n btn.style.background = isDark\n ? \"rgba(56, 189, 248, 0.15)\"\n : \"rgba(56, 189, 248, 0.1)\";\n }\n } else if (id === \"smooth\") {\n btn.style.color = this.isSmoothing ? smoothActiveColor : normalColor;\n btn.style.opacity = isHover || this.isSmoothing ? \"1\" : \"0.8\";\n if (this.isSmoothing) {\n btn.style.background = isDark\n ? \"rgba(251, 113, 133, 0.15)\"\n : \"rgba(251, 113, 133, 0.1)\";\n }\n } else if (id === \"legend\") {\n btn.style.color = this.isLegendVisible ? legendActiveColor : normalColor;\n btn.style.opacity = isHover || this.isLegendVisible ? \"1\" : \"0.8\";\n if (this.isLegendVisible) {\n btn.style.background = isDark\n ? \"rgba(74, 222, 128, 0.15)\"\n : \"rgba(74, 222, 128, 0.1)\";\n }\n } else if (id === \"type\") {\n btn.innerHTML =\n this.currentType === \"line\"\n ? ICONS.LINE\n : this.currentType === \"scatter\"\n ? ICONS.SCATTER\n : ICONS.BOTH;\n // Reapply SVG visibility styles after changing innerHTML\n this.enforceSVGVisibility(btn);\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n } else if (id === \"reset\" || id === \"autoscale\" || id === \"export\") {\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n }\n\n if (\n !isHover &&\n !(\n (id === \"pan\" && this.isPanMode) ||\n (id === \"smooth\" && this.isSmoothing) ||\n (id === \"legend\" && this.isLegendVisible)\n )\n ) {\n btn.style.background = \"transparent\";\n }\n });\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateToolbarStyle();\n this.updateButtonStates();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * ChartLegend - In-chart draggable legend component\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\n\nexport interface ChartLegendCallbacks {\n onMove: (x: number, y: number) => void;\n}\n\nexport class ChartLegend {\n private container: HTMLDivElement;\n private header: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Series[] = [];\n private callbacks: ChartLegendCallbacks;\n\n private isDragging = false;\n private startX = 0;\n private startY = 0;\n private initialX = 0;\n private initialY = 0;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n options: { x?: number; y?: number },\n callbacks: ChartLegendCallbacks\n ) {\n this.theme = theme;\n this.callbacks = callbacks;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"scichart-legend\";\n\n // Default position (top-right, below controls toolbar)\n // Controls toolbar height is ~32px (24px buttons + 4px padding*2 + borders) + 8px top margin = ~40px\n // Add extra margin to ensure no overlap\n const x = options.x ?? parent.clientWidth - 150;\n const y = options.y ?? 55;\n\n this.container.style.cssText = `\n position: absolute;\n left: ${x}px;\n top: ${y}px;\n z-index: 90;\n pointer-events: auto;\n min-width: 120px;\n border-radius: ${theme.legend.borderRadius}px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n user-select: none;\n transition: box-shadow 0.2s ease;\n `;\n\n this.updateStyle();\n\n // Draggable header\n this.header = document.createElement(\"div\");\n this.header.style.cssText = `\n height: 8px;\n cursor: move;\n background: rgba(255,255,255,0.05);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n `;\n\n this.content = document.createElement(\"div\");\n this.content.style.padding = `${theme.legend.padding}px`;\n\n this.container.appendChild(this.header);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n\n this.initDragging();\n }\n\n private updateStyle(): void {\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\") ||\n this.theme.name.toLowerCase().includes(\"electro\");\n\n this.container.style.background = this.theme.legend.backgroundColor;\n this.container.style.backdropFilter = \"blur(12px) saturate(180%)\";\n (this.container.style as any).webkitBackdropFilter =\n \"blur(12px) saturate(180%)\";\n this.container.style.border = `1px solid ${this.theme.legend.borderColor}`;\n this.container.style.boxShadow = isDark\n ? \"0 4px 12px rgba(0, 0, 0, 0.6)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.15)\";\n }\n\n private initDragging(): void {\n let rafId: number | null = null;\n\n const onMouseDown = (e: MouseEvent) => {\n // Only handle left click\n if (e.button !== 0) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n this.isDragging = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.initialX = this.container.offsetLeft;\n this.initialY = this.container.offsetTop;\n\n this.container.style.transition = \"none\";\n this.container.style.willChange = \"transform\";\n this.container.style.boxShadow = \"0 8px 24px rgba(0,0,0,0.3)\";\n this.container.style.cursor = \"grabbing\";\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n };\n\n const updatePosition = (clientX: number, clientY: number) => {\n const dx = clientX - this.startX;\n const dy = clientY - this.startY;\n\n let newX = this.initialX + dx;\n let newY = this.initialY + dy;\n\n const parent = this.container.parentElement;\n if (parent) {\n newX = Math.max(\n 0,\n Math.min(newX, parent.clientWidth - this.container.clientWidth)\n );\n newY = Math.max(\n 0,\n Math.min(newY, parent.clientHeight - this.container.clientHeight)\n );\n }\n\n // Use transform for better performance (no layout recalc)\n const tx = newX - this.initialX;\n const ty = newY - this.initialY;\n this.container.style.transform = `translate3d(${tx}px, ${ty}px, 0)`;\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => updatePosition(e.clientX, e.clientY));\n };\n\n const onMouseUp = () => {\n if (this.isDragging) {\n this.isDragging = false;\n if (rafId) cancelAnimationFrame(rafId);\n\n // Finalize position and commit to left/top (to keep it there)\n const rect = this.container.getBoundingClientRect();\n const parentRect =\n this.container.parentElement?.getBoundingClientRect();\n if (parentRect) {\n const finalX = rect.left - parentRect.left;\n const finalY = rect.top - parentRect.top;\n\n this.container.style.transform = \"none\";\n this.container.style.left = `${finalX}px`;\n this.container.style.top = `${finalY}px`;\n\n this.callbacks.onMove(finalX, finalY);\n }\n\n this.container.style.willChange = \"auto\";\n this.container.style.transition = \"box-shadow 0.2s ease\";\n this.container.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.15)\";\n this.container.style.cursor = \"auto\";\n }\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n this.container.addEventListener(\"mousedown\", onMouseDown);\n\n // Block events from reaching the chart while over the legend\n this.container.addEventListener(\"wheel\", (e) => e.stopPropagation());\n this.container.addEventListener(\"click\", (e) => e.stopPropagation());\n this.container.addEventListener(\"dblclick\", (e) => e.stopPropagation());\n // Note: mousemove/mouseup on container MUST bubble to document during drag\n }\n\n public update(series: Series[]): void {\n this.series = series;\n this.render();\n }\n\n private render(): void {\n this.content.innerHTML = \"\";\n const legend = this.theme.legend;\n const dpr = window.devicePixelRatio || 1;\n\n this.series.forEach((s) => {\n const item = document.createElement(\"div\");\n item.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: ${legend.itemGap}px;\n font-family: ${legend.fontFamily};\n font-size: ${legend.fontSize}px;\n color: ${legend.textColor};\n `;\n\n // Use a canvas for the swatch to support symbols\n const swatch = document.createElement(\"canvas\");\n const size = legend.swatchSize;\n swatch.width = size * dpr;\n swatch.height = size * dpr;\n swatch.style.width = `${size}px`;\n swatch.style.height = `${size}px`;\n\n const ctx = swatch.getContext('2d');\n if (ctx) {\n ctx.scale(dpr, dpr);\n const style = s.getStyle();\n const color = style.color || \"#ff0055\";\n const type = s.getType();\n const symbol = style.symbol || 'circle';\n \n ctx.fillStyle = color;\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n \n const centerX = size / 2;\n const centerY = size / 2;\n\n const typeStr = String(type).toLowerCase();\n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && !!style.symbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n const isArea = typeStr === 'area' || typeStr === 'band';\n\n if (isScatter) {\n this.drawSymbol(ctx, symbol, centerX, centerY, size * 0.8);\n } else if (isLineScatter) {\n ctx.beginPath();\n ctx.moveTo(0, centerY);\n ctx.lineTo(size, centerY);\n ctx.stroke();\n this.drawSymbol(ctx, symbol, centerX, centerY, size * 0.6);\n } else if (isArea) {\n ctx.globalAlpha = 0.6;\n ctx.fillRect(0, size * 0.2, size, size * 0.6);\n ctx.globalAlpha = 1.0;\n ctx.strokeRect(0, size * 0.2, size, size * 0.6);\n } else if (typeStr === 'candlestick') {\n const bullColor = (style as any).bullishColor || '#26a69a';\n ctx.fillStyle = bullColor;\n ctx.fillRect(size * 0.3, size * 0.2, size * 0.4, size * 0.6);\n ctx.beginPath();\n ctx.moveTo(size * 0.5, 0);\n ctx.lineTo(size * 0.5, size);\n ctx.strokeStyle = bullColor;\n ctx.stroke();\n } else {\n ctx.beginPath();\n ctx.moveTo(0, centerY);\n ctx.lineTo(size, centerY);\n ctx.stroke();\n }\n }\n\n const label = document.createElement(\"span\");\n label.textContent = s.getName();\n\n item.appendChild(swatch);\n item.appendChild(label);\n this.content.appendChild(item);\n });\n }\n\n /**\n * Internal symbol drawing logic (shared with canvas export)\n */\n private drawSymbol(\n ctx: CanvasRenderingContext2D,\n symbol: string,\n x: number,\n y: number,\n size: number\n ): void {\n const r = size / 2;\n ctx.beginPath();\n\n switch (symbol) {\n case 'circle':\n ctx.arc(x, y, r, 0, Math.PI * 2);\n ctx.fill();\n break;\n case 'square':\n ctx.rect(x - r, y - r, size, size);\n ctx.fill();\n break;\n case 'diamond':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y);\n ctx.lineTo(x, y + r);\n ctx.lineTo(x - r, y);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y + r);\n ctx.lineTo(x - r, y + r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangleDown':\n ctx.moveTo(x, y + r);\n ctx.lineTo(x + r, y - r);\n ctx.lineTo(x - r, y - r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.moveTo(x - r, y);\n ctx.lineTo(x + r, y);\n ctx.moveTo(x, y - r);\n ctx.lineTo(x, y + r);\n ctx.stroke();\n break;\n case 'x':\n const d = r * 0.707;\n ctx.moveTo(x - d, y - d);\n ctx.lineTo(x + d, y + d);\n ctx.moveTo(x + d, y - d);\n ctx.lineTo(x - d, y + d);\n ctx.stroke();\n break;\n case 'star':\n for (let i = 0; i < 5; i++) {\n ctx.lineTo(\n x + r * Math.cos(((18 + i * 72) / 180) * Math.PI),\n y - r * Math.sin(((18 + i * 72) / 180) * Math.PI)\n );\n ctx.lineTo(\n x + (r / 2) * Math.cos(((54 + i * 72) / 180) * Math.PI),\n y - (r / 2) * Math.sin(((54 + i * 72) / 180) * Math.PI)\n );\n }\n ctx.closePath();\n ctx.fill();\n break;\n }\n }\n\n public draw(ctx: CanvasRenderingContext2D, dpr: number): void {\n if (this.series.length === 0) return;\n\n const legend = this.theme.legend;\n const padding = legend.padding * dpr;\n const itemGap = legend.itemGap * dpr;\n const swatchSize = legend.swatchSize * dpr;\n const headerHeight = 8 * dpr;\n\n const x = this.container.offsetLeft * dpr;\n const y = this.container.offsetTop * dpr;\n const width = this.container.clientWidth * dpr;\n const height = this.container.clientHeight * dpr;\n\n ctx.save();\n\n // 1. Draw background\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\");\n ctx.fillStyle = isDark\n ? legend.backgroundColor\n : \"rgba(255, 255, 255, 0.85)\";\n ctx.strokeStyle = legend.borderColor;\n ctx.lineWidth = 1 * dpr;\n\n const r = legend.borderRadius * dpr;\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + width - r, y);\n ctx.arcTo(x + width, y, x + width, y + r, r);\n ctx.lineTo(x + width, y + height - r);\n ctx.arcTo(x + width, y + height, x + width - r, y + height, r);\n ctx.lineTo(x + r, y + height);\n ctx.arcTo(x, y + height, x, y + height - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // 2. Draw Items\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = `${legend.fontSize * dpr}px ${legend.fontFamily}`;\n\n this.series.forEach((s, i) => {\n const itemY =\n y +\n headerHeight +\n padding +\n i * (swatchSize + itemGap) +\n swatchSize / 2;\n \n const centerX = x + padding + swatchSize / 2;\n const centerY = itemY;\n const style = s.getStyle();\n const type = s.getType();\n const symbol = style.symbol || 'circle';\n\n ctx.fillStyle = style.color || \"#ff0055\";\n ctx.strokeStyle = style.color || \"#ff0055\";\n ctx.lineWidth = 2 * dpr;\n\n const typeStr = String(type).toLowerCase();\n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && !!style.symbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n\n if (isScatter) {\n this.drawSymbol(ctx, symbol, centerX, centerY, swatchSize * 0.9);\n } else if (isLineScatter) {\n ctx.beginPath();\n ctx.moveTo(x + padding, centerY);\n ctx.lineTo(x + padding + swatchSize, centerY);\n ctx.stroke();\n this.drawSymbol(ctx, symbol, centerX, centerY, swatchSize * 0.6);\n } else {\n ctx.beginPath();\n ctx.moveTo(x + padding, centerY);\n ctx.lineTo(x + padding + swatchSize, centerY);\n ctx.stroke();\n }\n\n ctx.fillStyle = legend.textColor;\n ctx.fillText(s.getName(), x + padding + swatchSize + 8 * dpr, itemY);\n });\n\n ctx.restore();\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateStyle();\n this.render();\n }\n\n public setVisible(visible: boolean): void {\n this.container.style.display = visible ? \"block\" : \"none\";\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * Chart UI Components (Controls, Legend)\n */\nimport { ChartControls } from \"../ChartControls\";\nimport { ChartLegend } from \"../ChartLegend\";\nimport { ChartTheme } from \"../../theme\";\nimport { ChartOptions } from \"../../types\";\nimport { Series } from \"../Series\";\n\nexport interface UIContext {\n container: HTMLDivElement;\n theme: ChartTheme;\n showControls: boolean;\n showLegend: boolean;\n series: Map<string, Series>;\n autoScale: () => void;\n resetZoom: () => void;\n requestRender: () => void;\n exportImage: () => string;\n setPanMode: (active: boolean) => void;\n onLegendMove: (x: number, y: number) => void;\n toggleLegend: () => void;\n}\n\nexport function initControls(ctx: UIContext): ChartControls | null {\n if (!ctx.showControls) return null;\n return new ChartControls(ctx.container, ctx.theme, {\n onResetZoom: () => ctx.resetZoom(),\n onSetType: (type) => {\n ctx.series.forEach((s) => {\n const currentType = s.getType();\n const style = s.getStyle();\n const isStepCapable = currentType === \"step\" || currentType === \"step+scatter\" || style.stepMode !== undefined;\n if (isStepCapable) {\n const mappedType = type === \"line\" ? \"step\" : type === \"line+scatter\" ? \"step+scatter\" : \"scatter\";\n s.setType(mappedType as any);\n } else if (currentType === \"line\" || currentType === \"scatter\" || currentType === \"line+scatter\") {\n s.setType(type as any);\n }\n });\n ctx.requestRender();\n },\n onToggleSmoothing: () => {\n ctx.series.forEach((s) => {\n const style = s.getStyle();\n s.setStyle({ smoothing: (style.smoothing || 0) === 0 ? 0.5 : 0 });\n });\n ctx.requestRender();\n },\n onTogglePan: (active) => ctx.setPanMode(active),\n onExport: () => {\n const link = document.createElement(\"a\");\n link.download = `scichart-export-${Date.now()}.png`;\n link.href = ctx.exportImage();\n link.click();\n },\n onAutoScale: () => {\n ctx.autoScale();\n ctx.requestRender();\n },\n onToggleLegend: () => {\n ctx.toggleLegend();\n },\n });\n}\n\nexport function initLegend(ctx: UIContext, options: ChartOptions): ChartLegend | null {\n if (!ctx.showLegend) return null;\n const legend = new ChartLegend(\n ctx.container,\n ctx.theme,\n options.legendPosition || {},\n {\n onMove: (x, y) => ctx.onLegendMove(x, y),\n }\n );\n legend.update(Array.from(ctx.series.values()));\n return legend;\n}\n","/**\n * ChartCore - Main Chart Implementation\n *\n * The core chart class that coordinates rendering, interactions,\n * and data management using the extracted utility modules.\n */\n\nimport type {\n ChartOptions,\n AxisOptions,\n SeriesOptions,\n HeatmapOptions,\n SeriesUpdateData,\n ZoomOptions,\n CursorOptions,\n ChartEventMap,\n Bounds,\n} from \"../../types\";\nimport * as analysis from \"../../analysis\";\nimport type { FitType, FitOptions } from \"../../analysis\";\nimport { EventEmitter } from \"../EventEmitter\";\nimport { Series } from \"../Series\";\nimport {\n NativeWebGLRenderer,\n parseColor,\n} from \"../../renderer/NativeWebGLRenderer\";\nimport type { Scale } from \"../../scales\";\nimport { getThemeByName, type ChartTheme } from \"../../theme\";\nimport { OverlayRenderer } from \"../OverlayRenderer\";\nimport { InteractionManager } from \"../InteractionManager\";\nimport { ChartControls } from \"../ChartControls\";\nimport { ChartLegend } from \"../ChartLegend\";\nimport { ChartStatistics } from \"../ChartStatistics\";\nimport { AnnotationManager, type Annotation } from \"../annotations\";\nimport { TooltipManager } from \"../tooltip\";\n\nimport type { Chart, ExportOptions } from \"./types\";\nimport { exportToCSV, exportToJSON, exportToImage } from \"./ChartExporter\";\nimport {\n applyZoom,\n applyPan,\n type NavigationContext,\n} from \"./ChartNavigation\";\nimport { autoScaleAll, handleBoxZoom } from \"./ChartScaling\";\nimport { prepareSeriesData, renderOverlay } from \"./ChartRenderer\";\nimport {\n addSeries as addSeriesImpl,\n removeSeries as removeSeriesImpl,\n updateSeries as updateSeriesImpl,\n updateSeriesBuffer,\n appendData as appendDataImpl,\n setMaxPoints as setMaxPointsImpl,\n addFitLine as addFitLineImpl,\n} from \"./ChartSeries\";\nimport {\n initializeChart as setupChart,\n getPlotArea as calculatePlotArea,\n getAxesLayout,\n resizeCanvases,\n pixelToDataX as pxToDataX,\n pixelToDataY as pxToDataY,\n} from \"./ChartSetup\";\nimport { PluginManagerImpl } from \"./plugins/PluginManager\";\nimport { initControls as createControls, initLegend as createLegend } from \"./ChartUI\";\n\n// ============================================\n// Chart Implementation\n// ============================================\n\nexport class ChartImpl implements Chart {\n private container: HTMLDivElement;\n private webglCanvas: HTMLCanvasElement;\n private overlayCanvas: HTMLCanvasElement;\n private overlayCtx: CanvasRenderingContext2D;\n private series: Map<string, Series> = new Map();\n private events = new EventEmitter<ChartEventMap>();\n private viewBounds: Bounds = {\n xMin: -0.5,\n xMax: 0.5,\n yMin: -1e-5,\n yMax: 1e-5,\n };\n private xAxisOptions: AxisOptions;\n private yAxisOptionsMap: Map<string, AxisOptions>;\n private primaryYAxisId: string;\n private dpr: number;\n private backgroundColor: [number, number, number, number];\n private renderer: NativeWebGLRenderer;\n private overlay: OverlayRenderer;\n private interaction: InteractionManager;\n private xScale: Scale;\n private yScales: Map<string, Scale>;\n private get yScale(): Scale {\n return (this.yScales.get(this.primaryYAxisId) ||\n this.yScales.values().next().value) as Scale;\n }\n private theme: ChartTheme;\n private cursorOptions: CursorOptions | null = null;\n private cursorPosition: { x: number; y: number } | null = null;\n private showLegend: boolean;\n private legend: ChartLegend | null = null;\n private showControls: boolean;\n private controls: ChartControls | null = null;\n private animationFrameId: number | null = null;\n private needsFullRender = false;\n private needsOverlayRender = false;\n private isDestroyed = false;\n private autoScroll = false;\n private showStatistics = false;\n private stats: ChartStatistics | null = null;\n private selectionRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null = null;\n private annotationManager: AnnotationManager = new AnnotationManager();\n public readonly tooltip: TooltipManager;\n private pluginManager: PluginManagerImpl;\n private initialOptions: ChartOptions;\n public readonly analysis = analysis;\n\n constructor(options: ChartOptions) {\n this.initialOptions = options;\n this.container = options.container;\n const setup = setupChart(this.container, options);\n\n const requestedRenderer = options.renderer ?? \"webgl\";\n if (requestedRenderer === \"webgpu\") {\n const isSupported =\n typeof (globalThis as any).navigator !== \"undefined\" &&\n typeof (globalThis as any).navigator.gpu !== \"undefined\";\n console.warn(\n `[SciChart] 'renderer: \"webgpu\"' requested but WebGPU renderer is experimental and not yet implemented. ` +\n `Falling back to WebGL. WebGPU supported: ${isSupported}`\n );\n }\n\n this.theme = setup.theme;\n this.backgroundColor = setup.backgroundColor;\n this.showLegend = setup.showLegend;\n this.showControls = setup.showControls;\n this.autoScroll = setup.autoScroll;\n this.showStatistics = setup.showStatistics;\n this.dpr = setup.dpr;\n this.xAxisOptions = setup.xAxisOptions;\n this.xScale = setup.xScale;\n this.yAxisOptionsMap = setup.yAxisOptionsMap;\n this.yScales = setup.yScales;\n this.primaryYAxisId = setup.primaryYAxisId;\n this.webglCanvas = setup.webglCanvas;\n this.overlayCanvas = setup.overlayCanvas;\n this.overlayCtx = setup.overlayCtx;\n\n this.renderer = new NativeWebGLRenderer(this.webglCanvas);\n this.renderer.setDPR(this.dpr);\n this.overlay = new OverlayRenderer(this.overlayCtx, this.theme);\n this.pluginManager = new PluginManagerImpl(this);\n this.interaction = new InteractionManager(\n this.container,\n {\n onZoom: (b, axisId) =>\n this.zoom({ x: [b.xMin, b.xMax], y: [b.yMin, b.yMax], axisId }),\n onPan: (dx, dy, axisId) => this.pan(dx, dy, axisId),\n onBoxZoom: (rect) => this.handleBoxZoom(rect),\n onCursorMove: (x, y) => {\n this.cursorPosition = { x, y };\n this.tooltip.handleCursorMove(x, y);\n this.requestOverlayRender();\n },\n onCursorLeave: () => {\n this.cursorPosition = null;\n this.tooltip.handleCursorLeave();\n this.requestOverlayRender();\n },\n },\n () => this.getPlotArea(),\n (axisId) => this.getInteractedBounds(axisId),\n () => getAxesLayout(this.yAxisOptionsMap as any)\n );\n\n this.tooltip = new TooltipManager({\n overlayCtx: this.overlayCtx,\n chartTheme: this.theme,\n getPlotArea: () => this.getPlotArea(),\n getSeries: () => this.getAllSeries(),\n pixelToDataX: (px) => this.pixelToDataX(px),\n pixelToDataY: (py) => this.pixelToDataY(py),\n getXScale: () => this.xScale,\n getYScales: () => this.yScales,\n getViewBounds: () => this.viewBounds,\n options: options.tooltip\n });\n\n new ResizeObserver(() => !this.isDestroyed && this.resize()).observe(\n this.container\n );\n this.initControls();\n this.initLegend(options);\n if (this.showStatistics) {\n this.stats = new ChartStatistics(this.container, this.theme, this.series);\n }\n\n this.resize();\n this.startRenderLoop();\n setTimeout(() => !this.isDestroyed && this.resize(), 100);\n console.log(\"[SciChart] Initialized\", {\n dpr: this.dpr,\n theme: this.theme.name,\n });\n }\n\n private initControls(): void {\n this.controls = createControls({\n container: this.container,\n theme: this.theme,\n showControls: this.showControls,\n showLegend: this.showLegend,\n series: this.series,\n autoScale: () => this.autoScale(),\n resetZoom: () => this.resetZoom(),\n requestRender: () => this.requestRender(),\n exportImage: () => this.exportImage(),\n setPanMode: (active) => this.interaction.setPanMode(active),\n onLegendMove: (x: number, y: number) => this.events.emit(\"legendMove\", { x, y }),\n toggleLegend: () => this.toggleLegend(),\n });\n }\n\n private toggleLegend(): void {\n this.showLegend = !this.showLegend;\n if (this.legend) {\n this.legend.setVisible(this.showLegend);\n this.legend.update(this.getAllSeries());\n } else if (this.showLegend) {\n // Re-initialize if it didn't exist\n this.initLegend(this.initialOptions); \n }\n this.requestRender();\n }\n\n private initLegend(options: ChartOptions): void {\n this.legend = createLegend({\n container: this.container,\n theme: this.theme,\n showControls: this.showControls,\n showLegend: this.showLegend,\n series: this.series,\n autoScale: () => this.autoScale(),\n resetZoom: () => this.resetZoom(),\n requestRender: () => this.requestRender(),\n exportImage: () => this.exportImage(),\n setPanMode: (active) => this.interaction.setPanMode(active),\n onLegendMove: (x: number, y: number) => this.events.emit(\"legendMove\", { x, y }),\n toggleLegend: () => this.toggleLegend(),\n }, options);\n }\n\n setTheme(theme: string | ChartTheme): void {\n this.theme = typeof theme === \"string\" ? getThemeByName(theme) : theme;\n const bgColor = parseColor(this.theme.backgroundColor);\n this.backgroundColor = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n this.container.style.backgroundColor = this.theme.backgroundColor;\n \n this.overlay.setTheme(this.theme);\n this.tooltip.updateChartTheme(this.theme);\n if (this.controls) this.controls.updateTheme(this.theme);\n if (this.legend) this.legend.updateTheme(this.theme);\n if (this.stats) this.stats.updateTheme(this.theme);\n \n this.requestRender();\n }\n\n getPlotArea() {\n return calculatePlotArea(this.container, this.yAxisOptionsMap as any);\n }\n private getInteractedBounds(axisId?: string): Bounds {\n if (axisId) {\n const scale = this.yScales.get(axisId);\n if (scale)\n return {\n ...this.viewBounds,\n yMin: scale.domain[0],\n yMax: scale.domain[1],\n };\n }\n return this.viewBounds;\n }\n\n exportImage(type: \"png\" | \"jpeg\" = \"png\"): string {\n return exportToImage(\n this.webglCanvas,\n this.overlayCanvas,\n this.backgroundColor,\n this.legend,\n this.showLegend,\n this.dpr,\n type\n );\n }\n\n // Series Management (delegates to ChartSeries)\n private getSeriesContext() {\n return {\n series: this.series,\n renderer: this.renderer,\n viewBounds: this.viewBounds,\n autoScale: () => this.autoScale(),\n requestRender: () => this.requestRender(),\n addAnnotation: (a: Annotation) => this.addAnnotation(a),\n xAxisOptions: this.xAxisOptions,\n yAxisOptionsMap: this.yAxisOptionsMap,\n autoScrollEnabled: this.autoScroll,\n addSeries: (o: SeriesOptions | HeatmapOptions) => this.addSeries(o),\n updateLegend: () => {\n if (this.legend) this.legend.update(this.getAllSeries());\n },\n };\n }\n\n addSeries(options: SeriesOptions | HeatmapOptions): void {\n addSeriesImpl(this.getSeriesContext() as any, options as any);\n const series = this.series.get((options as any).id);\n if (series) this.pluginManager.notify('onSeriesAdded', series);\n }\n addBar(options: Omit<SeriesOptions, \"type\">): void {\n this.addSeries({ ...options, type: \"bar\" } as SeriesOptions);\n }\n addHeatmap(options: HeatmapOptions): void {\n this.addSeries({ ...options, type: \"heatmap\" } as HeatmapOptions);\n }\n removeSeries(id: string): void {\n removeSeriesImpl(this.getSeriesContext(), id);\n }\n updateSeries(id: string, data: SeriesUpdateData): void {\n updateSeriesImpl(this.getSeriesContext(), id, data);\n }\n appendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void {\n appendDataImpl(this.getSeriesContext(), id, x, y);\n }\n setAutoScroll(enabled: boolean): void {\n this.autoScroll = enabled;\n }\n setMaxPoints(id: string, maxPoints: number): void {\n setMaxPointsImpl(this.getSeriesContext(), id, maxPoints);\n }\n addFitLine(\n seriesId: string,\n type: FitType,\n options: FitOptions = {}\n ): string {\n return addFitLineImpl(this.getSeriesContext(), seriesId, type, options);\n }\n getSeries(id: string): Series | undefined {\n return this.series.get(id);\n }\n getAllSeries(): Series[] {\n return Array.from(this.series.values());\n }\n\n // Navigation (delegates to ChartNavigation)\n private getNavContext(): NavigationContext {\n return {\n viewBounds: this.viewBounds,\n yScales: this.yScales,\n yAxisOptionsMap: this.yAxisOptionsMap,\n xAxisOptions: this.xAxisOptions,\n primaryYAxisId: this.primaryYAxisId,\n getPlotArea: () => this.getPlotArea(),\n events: this.events,\n requestRender: () => this.requestRender(),\n series: this.series as any,\n };\n }\n\n zoom(options: ZoomOptions): void {\n applyZoom(this.getNavContext(), options);\n }\n pan(deltaX: number, deltaY: number, axisId?: string): void {\n applyPan(this.getNavContext(), deltaX, deltaY, axisId);\n }\n resetZoom(): void {\n this.autoScale();\n this.events.emit(\"zoom\", {\n x: [this.viewBounds.xMin, this.viewBounds.xMax],\n y: [this.viewBounds.yMin, this.viewBounds.yMax],\n });\n this.requestRender();\n }\n getViewBounds(): Bounds {\n return { ...this.viewBounds };\n }\n autoScale(): void {\n autoScaleAll(this.getNavContext());\n }\n private handleBoxZoom(\n rect: { x: number; y: number; width: number; height: number } | null\n ): void {\n const isFinishing = rect === null;\n this.selectionRect = handleBoxZoom(\n this.getNavContext(),\n rect,\n this.selectionRect,\n (o: any) => this.zoom(o)\n );\n \n if (isFinishing) {\n this.requestRender();\n } else {\n this.requestOverlayRender();\n }\n }\n\n // Cursor\n enableCursor(options: CursorOptions): void {\n this.cursorOptions = { enabled: true, ...options };\n }\n disableCursor(): void {\n this.cursorOptions = null;\n this.cursorPosition = null;\n this.requestOverlayRender();\n }\n\n // Annotations\n addAnnotation(annotation: Annotation): string {\n const id = this.annotationManager.add(annotation);\n this.requestOverlayRender();\n return id;\n }\n removeAnnotation(id: string): boolean {\n const result = this.annotationManager.remove(id);\n this.requestOverlayRender();\n return result;\n }\n updateAnnotation(id: string, updates: Partial<Annotation>): void {\n this.annotationManager.update(id, updates);\n this.requestOverlayRender();\n }\n getAnnotation(id: string): Annotation | undefined {\n return this.annotationManager.get(id);\n }\n getAnnotations(): Annotation[] {\n return this.annotationManager.getAll();\n }\n clearAnnotations(): void {\n this.annotationManager.clear();\n this.requestOverlayRender();\n }\n\n // Export\n exportCSV(options?: ExportOptions): string {\n return exportToCSV(this.getAllSeries(), options);\n }\n exportJSON(options?: ExportOptions): string {\n return exportToJSON(this.getAllSeries(), this.viewBounds, options);\n }\n\n use(plugin: any): void {\n this.pluginManager.use(plugin);\n }\n\n // Rendering\n resize(): void {\n if (\n !resizeCanvases(\n this.container,\n this.webglCanvas,\n this.overlayCanvas,\n this.overlayCtx,\n this.dpr\n )\n )\n return;\n this.renderer.resize();\n this.requestRender();\n }\n\n requestRender(): void {\n this.needsFullRender = true;\n }\n\n requestOverlayRender(): void {\n this.needsOverlayRender = true;\n }\n\n render(full: boolean = true): void {\n if (this.isDestroyed) return;\n const start = performance.now();\n const plotArea = this.getPlotArea();\n if (this.webglCanvas.width === 0 || this.webglCanvas.height === 0) return;\n\n const ctx = {\n webglCanvas: this.webglCanvas,\n overlayCanvas: this.overlayCanvas,\n overlayCtx: this.overlayCtx,\n container: this.container,\n series: this.series,\n viewBounds: this.viewBounds,\n xScale: this.xScale,\n yScales: this.yScales,\n yAxisOptionsMap: this.yAxisOptionsMap as any,\n xAxisOptions: this.xAxisOptions as any,\n primaryYAxisId: this.primaryYAxisId,\n renderer: this.renderer,\n overlay: this.overlay,\n annotationManager: this.annotationManager,\n backgroundColor: this.backgroundColor,\n cursorOptions: this.cursorOptions,\n cursorPosition: this.cursorPosition,\n selectionRect: this.selectionRect,\n stats: this.stats,\n showStatistics: this.showStatistics,\n events: this.events,\n updateSeriesBuffer: (s: Series) =>\n updateSeriesBuffer(this.getSeriesContext(), s),\n getPlotArea: () => plotArea,\n pixelToDataX: (px: number) => this.pixelToDataX(px),\n pixelToDataY: (py: number) => this.pixelToDataY(py),\n tooltip: this.tooltip,\n };\n\n if (full) {\n const seriesData = prepareSeriesData(ctx, plotArea);\n this.pluginManager.notify('onBeforeRender', this);\n this.renderer.render(seriesData, {\n bounds: this.viewBounds,\n backgroundColor: this.backgroundColor,\n plotArea,\n });\n renderOverlay(ctx, plotArea, this.yScale);\n this.pluginManager.notify('onAfterRender', this);\n } else {\n // Overlay only render\n renderOverlay(ctx, plotArea, this.yScale);\n }\n\n this.events.emit(\"render\", {\n fps: 1000 / (performance.now() - start),\n frameTime: performance.now() - start,\n });\n }\n\n private pixelToDataX(px: number): number {\n return pxToDataX(px, this.getPlotArea(), this.viewBounds);\n }\n\n private pixelToDataY(py: number): number {\n return pxToDataY(py, this.getPlotArea(), this.viewBounds);\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n if (this.isDestroyed) return;\n if (this.needsFullRender) {\n this.render(true);\n this.needsFullRender = false;\n this.needsOverlayRender = false;\n } else if (this.needsOverlayRender) {\n this.render(false);\n this.needsOverlayRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n on<K extends keyof ChartEventMap>(\n e: K,\n h: (d: ChartEventMap[K]) => void\n ): void {\n this.events.on(e, h);\n }\n off<K extends keyof ChartEventMap>(\n e: K,\n h: (d: ChartEventMap[K]) => void\n ): void {\n this.events.off(e, h);\n }\n\n destroy(): void {\n this.isDestroyed = true;\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n this.interaction.destroy();\n this.series.forEach((s) => {\n this.renderer.deleteBuffer(s.getId());\n s.destroy();\n });\n this.series.clear();\n this.renderer.destroy();\n if (this.controls) this.controls.destroy();\n if (this.legend) this.legend.destroy();\n if (this.tooltip) this.tooltip.destroy();\n while (this.container.firstChild)\n this.container.removeChild(this.container.firstChild);\n console.log(\"[SciChart] Destroyed\");\n }\n}\n\nexport function createChart(options: ChartOptions): Chart {\n return new ChartImpl(options);\n}\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 * WebSocket Streaming Utilities\n */\nimport { DataPoint, WebSocketStream } from \"./types\";\n\n/**\n * Default message parser - expects { x, y, seriesId? } or array of same\n */\nexport function defaultParser(data: unknown): DataPoint | DataPoint[] | null {\n if (!data || typeof data !== 'object') return null;\n \n // Array of points\n if (Array.isArray(data)) {\n return data\n .filter((item): item is DataPoint => \n typeof item === 'object' && \n item !== null && \n typeof item.x === 'number' && \n typeof item.y === 'number'\n );\n }\n \n // Single point\n const point = data as Record<string, unknown>;\n if (typeof point.x === 'number' && typeof point.y === 'number') {\n return {\n x: point.x,\n y: point.y,\n seriesId: typeof point.seriesId === 'string' ? point.seriesId : undefined,\n };\n }\n \n return null;\n}\n\n/**\n * Helper to create a parser for custom message formats\n */\nexport function createMessageParser<T>(\n transform: (message: T) => DataPoint | DataPoint[] | null\n): (data: unknown) => DataPoint | DataPoint[] | null {\n return (data: unknown) => {\n try {\n return transform(data as T);\n } catch {\n return null;\n }\n };\n}\n\n/**\n * Helper to connect a WebSocket stream to a chart\n */\nexport function connectStreamToChart(\n stream: WebSocketStream,\n chart: { appendData: (seriesId: string, data: { x: Float32Array; y: Float32Array }) => void },\n seriesIds: string[] = ['default']\n): () => void {\n const unsubscribers: (() => void)[] = [];\n\n for (const seriesId of seriesIds) {\n const unsubscribe = stream.subscribe(seriesId, (points) => {\n if (points.length === 0) return;\n \n const x = new Float32Array(points.map(p => p.x));\n const y = new Float32Array(points.map(p => p.y));\n \n chart.appendData(seriesId, { x, y });\n });\n \n unsubscribers.push(unsubscribe);\n }\n\n // Return cleanup function\n return () => {\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n };\n}\n","/**\n * WebSocket Stream Implementation\n */\nimport { \n WebSocketStreamConfig, \n DataPoint, \n WebSocketStream, \n StreamStats, \n WebSocketState \n} from \"./types\";\nimport { defaultParser } from \"./utils\";\n\n/**\n * Create a WebSocket stream for real-time chart data\n */\nexport function createWebSocketStream(config: WebSocketStreamConfig): WebSocketStream {\n const {\n url,\n maxReconnectAttempts = 5,\n reconnectDelay = 1000,\n bufferSize = 10,\n throttleMs = 16,\n parseMessage = defaultParser,\n onConnect,\n onDisconnect,\n onError,\n onReconnect,\n } = config;\n\n let ws: WebSocket | null = null;\n let state: WebSocketState = 'disconnected';\n let reconnectAttempts = 0;\n let reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n let connectionStartTime: number | null = null;\n\n const buffers = new Map<string, DataPoint[]>();\n const subscribers = new Map<string, Set<(points: DataPoint[]) => void>>();\n \n const stats: StreamStats = {\n messagesReceived: 0,\n pointsProcessed: 0,\n reconnectCount: 0,\n lastMessageTime: null,\n connectionUptime: 0,\n bufferSize: 0,\n };\n\n let lastFlushTime = 0;\n let flushScheduled = false;\n\n function connect(): void {\n if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {\n return;\n }\n state = 'connecting';\n try {\n ws = new WebSocket(url);\n ws.onopen = () => {\n state = 'connected';\n reconnectAttempts = 0;\n connectionStartTime = Date.now();\n onConnect?.();\n };\n ws.onmessage = (event) => handleMessage(event.data);\n ws.onclose = (event) => {\n state = 'disconnected';\n connectionStartTime = null;\n onDisconnect?.(event);\n if (!event.wasClean && reconnectAttempts < maxReconnectAttempts) scheduleReconnect();\n };\n ws.onerror = (error) => {\n state = 'error';\n onError?.(error);\n };\n } catch (error) {\n state = 'error';\n onError?.(error as Event);\n }\n }\n\n function disconnect(): void {\n if (reconnectTimeout) { clearTimeout(reconnectTimeout); reconnectTimeout = null; }\n if (ws) { ws.close(1000, 'Client disconnect'); ws = null; }\n state = 'disconnected';\n reconnectAttempts = 0;\n buffers.clear();\n }\n\n function scheduleReconnect(): void {\n if (reconnectTimeout) return;\n state = 'reconnecting';\n reconnectAttempts++;\n stats.reconnectCount++;\n onReconnect?.(reconnectAttempts);\n reconnectTimeout = setTimeout(() => {\n reconnectTimeout = null;\n connect();\n }, reconnectDelay * reconnectAttempts);\n }\n\n function handleMessage(data: unknown): void {\n stats.messagesReceived++;\n stats.lastMessageTime = Date.now();\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data;\n const points = parseMessage(parsed);\n if (!points) return;\n const pointArray = Array.isArray(points) ? points : [points];\n for (const point of pointArray) {\n const seriesId = point.seriesId || 'default';\n if (!buffers.has(seriesId)) buffers.set(seriesId, []);\n buffers.get(seriesId)!.push(point);\n stats.pointsProcessed++;\n }\n stats.bufferSize = Array.from(buffers.values()).reduce((sum, b) => sum + b.length, 0);\n scheduleFlush();\n } catch {}\n }\n\n function scheduleFlush(): void {\n if (flushScheduled) return;\n const now = performance.now();\n const timeSinceLastFlush = now - lastFlushTime;\n if (timeSinceLastFlush >= throttleMs) {\n flush();\n } else {\n flushScheduled = true;\n setTimeout(() => { flushScheduled = false; flush(); }, throttleMs - timeSinceLastFlush);\n }\n }\n\n function flush(): void {\n lastFlushTime = performance.now();\n for (const [seriesId, buffer] of buffers.entries()) {\n if (buffer.length === 0) continue;\n if (buffer.length >= bufferSize || performance.now() - lastFlushTime > throttleMs * 2) {\n const callbacks = subscribers.get(seriesId);\n if (callbacks) {\n const points = buffer.splice(0, buffer.length);\n for (const callback of callbacks) callback(points);\n } else {\n buffer.length = 0;\n }\n }\n }\n stats.bufferSize = Array.from(buffers.values()).reduce((sum, b) => sum + b.length, 0);\n }\n\n return {\n connect,\n disconnect,\n isConnected: () => ws !== null && ws.readyState === WebSocket.OPEN,\n getState: () => state,\n subscribe: (seriesId, callback) => {\n if (!subscribers.has(seriesId)) subscribers.set(seriesId, new Set());\n subscribers.get(seriesId)!.add(callback);\n return () => {\n const callbacks = subscribers.get(seriesId);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) subscribers.delete(seriesId);\n }\n };\n },\n unsubscribeAll: () => { subscribers.clear(); buffers.clear(); },\n send: (message) => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(typeof message === 'string' ? message : JSON.stringify(message));\n }\n },\n getStats: () => ({ ...stats, connectionUptime: connectionStartTime ? Date.now() - connectionStartTime : 0 }),\n };\n}\n","/**\n * Mock WebSocket Stream for Testing\n */\nimport { DataPoint, WebSocketStream, StreamStats } from \"./types\";\n\n/**\n * Mock WebSocket stream for testing\n */\nexport function createMockStream(config: {\n interval?: number;\n generatePoint?: () => DataPoint;\n}): WebSocketStream & { start: () => void; stop: () => void } {\n const { interval = 100, generatePoint = defaultGenerator } = config;\n \n let intervalId: ReturnType<typeof setInterval> | null = null;\n let connected = false;\n const subscribers = new Map<string, Set<(points: DataPoint[]) => void>>();\n \n const stats: StreamStats = {\n messagesReceived: 0,\n pointsProcessed: 0,\n reconnectCount: 0,\n lastMessageTime: null,\n connectionUptime: 0,\n bufferSize: 0,\n };\n\n let startTime: number | null = null;\n\n function start(): void {\n if (intervalId) return;\n \n startTime = Date.now();\n intervalId = setInterval(() => {\n const point = generatePoint();\n stats.messagesReceived++;\n stats.pointsProcessed++;\n stats.lastMessageTime = Date.now();\n \n const seriesId = point.seriesId || 'default';\n const callbacks = subscribers.get(seriesId);\n \n if (callbacks) {\n for (const callback of callbacks) {\n callback([point]);\n }\n }\n }, interval);\n }\n\n function stop(): void {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n startTime = null;\n }\n\n return {\n connect: () => { connected = true; start(); },\n disconnect: () => { connected = false; stop(); },\n isConnected: () => connected,\n getState: () => connected ? 'connected' : 'disconnected',\n subscribe: (seriesId, callback) => {\n if (!subscribers.has(seriesId)) {\n subscribers.set(seriesId, new Set());\n }\n subscribers.get(seriesId)!.add(callback);\n return () => {\n subscribers.get(seriesId)?.delete(callback);\n };\n },\n unsubscribeAll: () => subscribers.clear(),\n send: () => {},\n getStats: () => ({\n ...stats,\n connectionUptime: startTime ? Date.now() - startTime : 0,\n }),\n start,\n stop,\n };\n}\n\nlet mockX = 0;\nfunction defaultGenerator(): DataPoint {\n return {\n x: mockX++,\n y: Math.sin(mockX * 0.1) + Math.random() * 0.2,\n };\n}\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 * useSciChart - React hook for SciChart Engine\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 UseSciChartOptions extends Omit<ChartOptions, \"container\"> {\n /** Auto-resize on container changes */\n autoResize?: boolean;\n}\n\nexport interface UseSciChartReturn {\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 SciChart Engine\n *\n * @example\n * ```tsx\n * function MyChart() {\n * const canvasRef = useRef<HTMLCanvasElement>(null);\n * const { chart, isReady, addSeries, zoom } = useSciChart(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 useSciChart(\n containerRef: RefObject<HTMLDivElement>,\n options: UseSciChartOptions = {}\n): UseSciChartReturn {\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 console.log(\"[useSciChart] Chart initialized\");\n } catch (err) {\n console.error(\"[useSciChart] 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 * SciChart - React Component for Scientific Charts\n *\n * A declarative React component that wraps the SciChart Engine.\n */\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useSciChart, type UseSciChartOptions } from \"./useSciChart\";\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 SciChartSeries {\n id: string;\n x: Float32Array | Float64Array;\n y: Float32Array | Float64Array;\n color?: string;\n width?: number;\n visible?: boolean;\n}\n\nexport interface SciChartProps extends UseSciChartOptions {\n /** Series data to display */\n series?: SciChartSeries[];\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 SciChartRef {\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 * SciChart React Component\n *\n * @example\n * ```tsx\n * <SciChart\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 SciChart = forwardRef<SciChartRef, SciChartProps>(\n function SciChart(\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, SciChartSeries>>(new Map());\n\n const {\n chart,\n isReady,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n resetZoom,\n } = useSciChart(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={`scichart-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 SciChart;\n","/**\n * BufferStore - Manages GPU buffer lifecycle\n * \n * Provides a unified interface for buffer management across backends.\n * Handles buffer creation, updates, and cleanup.\n */\n\nimport type { BufferId, BufferUsage } from \"../types\";\n\nexport interface BufferEntry {\n id: BufferId;\n usage: BufferUsage;\n byteLength: number;\n lastUpdated: number;\n}\n\nexport interface IBufferStore {\n /** Create or update a buffer with new data */\n createOrUpdate(id: BufferId, data: ArrayBufferView, usage?: BufferUsage): void;\n \n /** Partially update a buffer at an offset */\n partialUpdate(id: BufferId, data: ArrayBufferView, offsetBytes: number): boolean;\n \n /** Get buffer metadata */\n getInfo(id: BufferId): BufferEntry | undefined;\n \n /** Check if buffer exists */\n has(id: BufferId): boolean;\n \n /** Delete a buffer */\n delete(id: BufferId): void;\n \n /** Get all buffer IDs */\n keys(): IterableIterator<BufferId>;\n \n /** Get buffer count */\n readonly size: number;\n \n /** Cleanup all buffers */\n destroy(): void;\n}\n\n/**\n * Abstract base class for buffer stores\n */\nexport abstract class BaseBufferStore implements IBufferStore {\n protected entries = new Map<BufferId, BufferEntry>();\n \n abstract createOrUpdate(id: BufferId, data: ArrayBufferView, usage?: BufferUsage): void;\n abstract partialUpdate(id: BufferId, data: ArrayBufferView, offsetBytes: number): boolean;\n abstract delete(id: BufferId): void;\n abstract destroy(): void;\n \n getInfo(id: BufferId): BufferEntry | undefined {\n return this.entries.get(id);\n }\n \n has(id: BufferId): boolean {\n return this.entries.has(id);\n }\n \n keys(): IterableIterator<BufferId> {\n return this.entries.keys();\n }\n \n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * TextureStore - Manages GPU texture lifecycle\n * \n * Provides a unified interface for texture management across backends.\n */\n\nimport type { TextureId, TextureFormat } from \"../types\";\n\nexport interface TextureEntry {\n id: TextureId;\n format: TextureFormat;\n width: number;\n height: number;\n lastUpdated: number;\n}\n\nexport interface ITextureStore {\n /** Create or update a 1D texture (for colormaps) */\n createOrUpdate1D(id: TextureId, data: Uint8Array, width?: number): void;\n \n /** Create or update a 2D texture */\n createOrUpdate2D(id: TextureId, data: Uint8Array, width: number, height: number): void;\n \n /** Get texture metadata */\n getInfo(id: TextureId): TextureEntry | undefined;\n \n /** Check if texture exists */\n has(id: TextureId): boolean;\n \n /** Delete a texture */\n delete(id: TextureId): void;\n \n /** Get all texture IDs */\n keys(): IterableIterator<TextureId>;\n \n /** Get texture count */\n readonly size: number;\n \n /** Cleanup all textures */\n destroy(): void;\n}\n\n/**\n * Abstract base class for texture stores\n */\nexport abstract class BaseTextureStore implements ITextureStore {\n protected entries = new Map<TextureId, TextureEntry>();\n \n abstract createOrUpdate1D(id: TextureId, data: Uint8Array, width?: number): void;\n abstract createOrUpdate2D(id: TextureId, data: Uint8Array, width: number, height: number): void;\n abstract delete(id: TextureId): void;\n abstract destroy(): void;\n \n getInfo(id: TextureId): TextureEntry | undefined {\n return this.entries.get(id);\n }\n \n has(id: TextureId): boolean {\n return this.entries.has(id);\n }\n \n keys(): IterableIterator<TextureId> {\n return this.entries.keys();\n }\n \n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * PipelineCache - Manages GPU pipeline lifecycle\n * \n * Caches compiled pipelines to avoid recompilation overhead.\n */\n\nexport type PipelineKind = \n | \"triangle\"\n | \"line\"\n | \"point\"\n | \"band\"\n | \"heatmap\";\n\nexport interface PipelineKey {\n kind: PipelineKind;\n variant?: string; // For future shader variants\n}\n\nexport interface IPipelineCache {\n /** Get or create a pipeline */\n getOrCreate<T>(key: PipelineKey, factory: () => T): T;\n \n /** Check if pipeline exists */\n has(key: PipelineKey): boolean;\n \n /** Delete a pipeline */\n delete(key: PipelineKey): void;\n \n /** Get pipeline count */\n readonly size: number;\n \n /** Cleanup all pipelines */\n destroy(): void;\n}\n\nfunction keyToString(key: PipelineKey): string {\n return key.variant ? `${key.kind}:${key.variant}` : key.kind;\n}\n\n/**\n * Generic pipeline cache implementation\n */\nexport class PipelineCache implements IPipelineCache {\n private pipelines = new Map<string, any>();\n \n getOrCreate<T>(key: PipelineKey, factory: () => T): T {\n const keyStr = keyToString(key);\n \n if (!this.pipelines.has(keyStr)) {\n const pipeline = factory();\n this.pipelines.set(keyStr, pipeline);\n }\n \n return this.pipelines.get(keyStr) as T;\n }\n \n has(key: PipelineKey): boolean {\n return this.pipelines.has(keyToString(key));\n }\n \n delete(key: PipelineKey): void {\n this.pipelines.delete(keyToString(key));\n }\n \n get size(): number {\n return this.pipelines.size;\n }\n \n destroy(): void {\n // Note: Actual pipeline destruction is backend-specific\n this.pipelines.clear();\n }\n}\n","/**\n * Series Adapter - Converts SciChart series data to GPU DrawCalls\n * \n * This adapter bridges the gap between the existing SciChart series system\n * and the new backend-agnostic GPU abstraction layer.\n */\n\nimport type { \n DrawCall, \n DrawList, \n DrawKind, \n PointStyle,\n HeatmapStyle,\n} from \"../drawList\";\nimport type { GpuBackend, BufferId, TextureId, RGBA } from \"../types\";\n\n/**\n * Series style from the original renderer\n */\nexport interface SeriesStyle {\n color?: string | RGBA;\n opacity?: number;\n lineWidth?: number;\n pointSize?: number;\n symbol?: string;\n}\n\n/**\n * Series render data from the chart system\n */\nexport interface SeriesData {\n id: string;\n type: \"line\" | \"scatter\" | \"line+scatter\" | \"step\" | \"step+scatter\" | \"band\" | \"bar\" | \"heatmap\";\n visible: boolean;\n \n /** Main vertex data */\n data: Float32Array;\n \n /** Style properties */\n style: SeriesStyle;\n \n /** For step charts */\n stepData?: Float32Array;\n \n /** Y-axis bounds for multi-axis support */\n yBounds?: { min: number; max: number };\n \n /** For heatmaps */\n zBounds?: { min: number; max: number };\n colormapData?: Uint8Array;\n colormap?: string;\n}\n\n/**\n * Mutable color tuple for internal use\n */\ntype MutableRGBA = [number, number, number, number];\n\n/**\n * Parse color from various formats to RGBA\n */\nexport function parseColorToRGBA(color: string | RGBA | undefined): MutableRGBA {\n if (!color) {\n return [1, 0, 0.3, 1]; // Default magenta\n }\n \n // If already an RGBA tuple, return a copy\n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], color[3] ?? 1];\n }\n \n // At this point, color must be a string\n const colorStr = color as string;\n \n // Parse hex color\n if (colorStr.startsWith(\"#\")) {\n const hex = colorStr.slice(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16) / 255;\n const g = parseInt(hex[1] + hex[1], 16) / 255;\n const b = parseInt(hex[2] + hex[2], 16) / 255;\n return [r, g, b, 1];\n }\n if (hex.length === 6) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n return [r, g, b, 1];\n }\n if (hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n return [r, g, b, a];\n }\n }\n \n // Parse rgb/rgba\n const rgbaMatch = colorStr.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/);\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1]) / 255;\n const g = parseInt(rgbaMatch[2]) / 255;\n const b = parseInt(rgbaMatch[3]) / 255;\n const a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;\n return [r, g, b, a];\n }\n \n return [1, 0, 0.3, 1]; // Fallback\n}\n\n/**\n * Map series type to draw kind\n */\nfunction mapSeriesTypeToDrawKind(type: SeriesData[\"type\"]): DrawKind {\n return type as DrawKind;\n}\n\n/**\n * Convert SeriesStyle to GPU styles\n */\nfunction convertStyle(style: SeriesStyle, type: SeriesData[\"type\"]): DrawCall[\"style\"] {\n const baseColor = parseColorToRGBA(style.color);\n const opacity = style.opacity ?? 1;\n const color: MutableRGBA = [baseColor[0], baseColor[1], baseColor[2], baseColor[3] * opacity];\n \n if (type === \"scatter\" || type === \"line+scatter\" || type === \"step+scatter\") {\n return {\n color: color as RGBA,\n opacity,\n pointSize: style.pointSize ?? 4,\n symbol: (style.symbol ?? \"circle\") as PointStyle[\"symbol\"],\n } as PointStyle;\n }\n \n return {\n color: color as RGBA,\n opacity,\n lineWidth: style.lineWidth ?? 1,\n };\n}\n\n/**\n * Series Adapter class\n * \n * Manages the conversion of chart series to GPU resources and draw calls.\n */\nexport class SeriesAdapter {\n private backend: GpuBackend;\n private seriesBufferMap = new Map<string, BufferId>();\n private seriesStepBufferMap = new Map<string, BufferId>();\n private seriesTextureMap = new Map<string, TextureId>();\n \n constructor(backend: GpuBackend) {\n this.backend = backend;\n }\n \n /**\n * Get buffer ID for a series\n */\n private getBufferId(seriesId: string): BufferId {\n if (!this.seriesBufferMap.has(seriesId)) {\n this.seriesBufferMap.set(seriesId, `series:${seriesId}`);\n }\n return this.seriesBufferMap.get(seriesId)!;\n }\n \n /**\n * Get step buffer ID for a series\n */\n private getStepBufferId(seriesId: string): BufferId {\n if (!this.seriesStepBufferMap.has(seriesId)) {\n this.seriesStepBufferMap.set(seriesId, `series:${seriesId}:step`);\n }\n return this.seriesStepBufferMap.get(seriesId)!;\n }\n \n /**\n * Get texture ID for a series\n */\n private getTextureId(seriesId: string): TextureId {\n if (!this.seriesTextureMap.has(seriesId)) {\n this.seriesTextureMap.set(seriesId, `texture:${seriesId}`);\n }\n return this.seriesTextureMap.get(seriesId)!;\n }\n \n /**\n * Update series data in GPU buffers\n */\n updateSeries(series: SeriesData): void {\n const bufferId = this.getBufferId(series.id);\n \n // Update main buffer\n this.backend.createOrUpdateBuffer(bufferId, series.data, { usage: \"vertex\" });\n \n // Update step buffer if present\n if (series.stepData && (series.type === \"step\" || series.type === \"step+scatter\")) {\n const stepBufferId = this.getStepBufferId(series.id);\n this.backend.createOrUpdateBuffer(stepBufferId, series.stepData, { usage: \"vertex\" });\n }\n \n // Update colormap texture if present\n if (series.type === \"heatmap\" && series.colormapData) {\n const textureId = this.getTextureId(series.id);\n this.backend.createOrUpdateTexture1D(textureId, series.colormapData, {\n width: series.colormapData.length / 4,\n });\n }\n }\n \n /**\n * Remove a series from GPU resources\n */\n removeSeries(seriesId: string): void {\n const bufferId = this.seriesBufferMap.get(seriesId);\n if (bufferId) {\n this.backend.deleteBuffer(bufferId);\n this.seriesBufferMap.delete(seriesId);\n }\n \n const stepBufferId = this.seriesStepBufferMap.get(seriesId);\n if (stepBufferId) {\n this.backend.deleteBuffer(stepBufferId);\n this.seriesStepBufferMap.delete(seriesId);\n }\n \n const textureId = this.seriesTextureMap.get(seriesId);\n if (textureId) {\n this.backend.deleteTexture(textureId);\n this.seriesTextureMap.delete(seriesId);\n }\n }\n \n /**\n * Build draw list from series array\n */\n buildDrawList(seriesArray: SeriesData[]): DrawList {\n const items: DrawCall[] = [];\n \n for (const series of seriesArray) {\n // Update GPU resources\n this.updateSeries(series);\n \n const bufferId = this.getBufferId(series.id);\n const pointCount = series.data.length / 2; // Assuming x,y pairs\n \n const drawCall: DrawCall = {\n id: series.id,\n kind: mapSeriesTypeToDrawKind(series.type),\n bufferId,\n count: series.type === \"heatmap\" ? series.data.length / 3 : pointCount,\n visible: series.visible,\n style: convertStyle(series.style, series.type),\n yBounds: series.yBounds,\n };\n \n // Step buffer\n if (series.stepData && (series.type === \"step\" || series.type === \"step+scatter\")) {\n drawCall.stepBufferId = this.getStepBufferId(series.id);\n drawCall.stepCount = series.stepData.length / 2;\n }\n \n // Heatmap texture\n if (series.type === \"heatmap\") {\n drawCall.textureId = this.getTextureId(series.id);\n (drawCall.style as HeatmapStyle) = {\n zBounds: series.zBounds,\n colormap: series.colormap,\n };\n }\n \n items.push(drawCall);\n }\n \n return { items };\n }\n \n /**\n * Cleanup all resources\n */\n destroy(): void {\n for (const bufferId of this.seriesBufferMap.values()) {\n this.backend.deleteBuffer(bufferId);\n }\n for (const stepBufferId of this.seriesStepBufferMap.values()) {\n this.backend.deleteBuffer(stepBufferId);\n }\n for (const textureId of this.seriesTextureMap.values()) {\n this.backend.deleteTexture(textureId);\n }\n \n this.seriesBufferMap.clear();\n this.seriesStepBufferMap.clear();\n this.seriesTextureMap.clear();\n }\n}\n","export const TRIANGLE_SHADER_WGSL = `\nstruct VSOut {\n @builtin(position) pos: vec4<f32>,\n @location(0) color: vec4<f32>,\n};\n\n@vertex\nfn vs_main(\n @location(0) position: vec2<f32>,\n @location(1) color: vec4<f32>\n) -> VSOut {\n var out: VSOut;\n out.pos = vec4<f32>(position, 0.0, 1.0);\n out.color = color;\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOut) -> @location(0) vec4<f32> {\n return in.color;\n}\n`;\n","import { TRIANGLE_SHADER_WGSL } from \"./triangleShader\";\n\nexport interface TrianglePipelineBundle {\n pipeline: any;\n vertexStride: number;\n}\n\nexport function createTrianglePipeline(\n device: any,\n format: string\n): TrianglePipelineBundle {\n const module = device.createShaderModule({ code: TRIANGLE_SHADER_WGSL });\n\n const vertexStride = 6 * 4;\n\n const pipeline = device.createRenderPipeline({\n layout: \"auto\",\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: vertexStride,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 2 * 4, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [{ format }],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return { pipeline, vertexStride };\n}\n","/**\n * Line Shader - WGSL for WebGPU\n * \n * Renders simple line strips with uniform color.\n * Uses uniform buffer for transform (scale + translate).\n */\n\nexport const LINE_SHADER_WGSL = `\n// Uniform buffer for transforms and color\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n return uniforms.color;\n}\n`;\n\nexport const LINE_VERTEX_STRIDE = 2 * 4; // 2 floats (x, y)\n","/**\n * Line Pipeline - WebGPU pipeline for rendering lines with uniform buffer\n * \n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types\n * (following the pattern of the original WebGPUBackend.ts)\n */\n\nimport { LINE_SHADER_WGSL, LINE_VERTEX_STRIDE } from \"../shaders/line.wgsl\";\n\nexport interface LinePipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n vertexStride: number;\n}\n\nexport interface LineUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n}\n\n// Uniform buffer layout: scale(2) + translate(2) + color(4) = 8 floats = 32 bytes\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createLinePipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): LinePipelineBundle {\n const module = device.createShaderModule({ code: LINE_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout explicitly\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: LINE_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"line-strip\",\n stripIndexFormat: undefined,\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n vertexStride: LINE_VERTEX_STRIDE,\n };\n}\n\nexport function updateLineUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: LineUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","/**\n * Point Shader - WGSL for WebGPU\n * \n * Renders scatter points with SDF-based symbols.\n * Supports: circle, square, diamond, triangle, triangleDown, cross, x, star\n */\n\nexport const POINT_SHADER_WGSL = `\n// Uniform buffer for transforms, color, point properties\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n pointSize: f32,\n symbol: i32, // 0=circle, 1=square, 2=diamond, 3=triangle, 4=triangleDown, 5=cross, 6=x, 7=star\n _padding: vec2<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) @interpolate(flat) pointSize: f32,\n @location(1) @interpolate(flat) symbol: i32,\n};\n\n@vertex\nfn vs_main(in: VSInput, @builtin(vertex_index) vertexIndex: u32) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n out.pointSize = uniforms.pointSize;\n out.symbol = uniforms.symbol;\n return out;\n}\n\n// SDF functions for symbols\nfn sdCircle(p: vec2<f32>, r: f32) -> f32 {\n return length(p) - r;\n}\n\nfn sdBox(p: vec2<f32>, b: vec2<f32>) -> f32 {\n let d = abs(p) - b;\n return length(max(d, vec2<f32>(0.0))) + min(max(d.x, d.y), 0.0);\n}\n\nfn sdDiamond(p: vec2<f32>, r: f32) -> f32 {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfn sdTriangle(p_in: vec2<f32>, r: f32) -> f32 {\n let k = sqrt(3.0);\n var p = p_in;\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) {\n p = vec2<f32>(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n }\n p.x = p.x - clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfn sdCross(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let d = abs(p);\n let s1 = sdBox(d, vec2<f32>(r, thickness));\n let s2 = sdBox(d, vec2<f32>(thickness, r));\n return min(s1, s2);\n}\n\nfn sdX(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let c = cos(0.785398);\n let s = sin(0.785398);\n let m = mat2x2<f32>(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfn sdStar(p_in: vec2<f32>, r: f32, rf: f32) -> f32 {\n let k1 = vec2<f32>(0.80901699, -0.58778525);\n let k2 = vec2<f32>(-k1.x, k1.y);\n var p = p_in;\n p.x = abs(p.x);\n p = p - 2.0 * max(dot(k1, p), 0.0) * k1;\n p = p - 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y = p.y - r;\n let ba = rf * vec2<f32>(-k1.y, k1.x) - vec2<f32>(0.0, 1.0);\n let h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n // Note: WebGPU doesn't have gl_PointCoord directly\n // Points in WebGPU require rendering quads instead\n // This shader needs instanced rendering with quads for proper point rendering\n // For now, return the color directly\n return uniforms.color;\n}\n`;\n\n// For proper point rendering we need quad instances\n// Each point becomes 6 vertices (2 triangles forming a quad)\nexport const POINT_QUAD_SHADER_WGSL = `\n// Uniform buffer for transforms, color, point properties\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n pointSize: f32,\n symbol: i32,\n viewport: vec2<f32>, // viewport dimensions for proper sizing\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>, // point center position\n @location(1) quadOffset: vec2<f32>, // quad vertex offset (-1 to 1)\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) uv: vec2<f32>, // -0.5 to 0.5 for SDF\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n \n // Transform point position to NDC\n let transformed = in.position * uniforms.scale + uniforms.translate;\n \n // Calculate point size in NDC\n let pointSizeNDC = vec2<f32>(\n uniforms.pointSize / uniforms.viewport.x * 2.0,\n uniforms.pointSize / uniforms.viewport.y * 2.0\n );\n \n // Apply quad offset\n let offset = in.quadOffset * pointSizeNDC * 0.5;\n \n out.pos = vec4<f32>(transformed + offset, 0.0, 1.0);\n out.uv = in.quadOffset * 0.5; // -0.5 to 0.5\n \n return out;\n}\n\n// SDF functions\nfn sdCircle(p: vec2<f32>, r: f32) -> f32 {\n return length(p) - r;\n}\n\nfn sdBox(p: vec2<f32>, b: vec2<f32>) -> f32 {\n let d = abs(p) - b;\n return length(max(d, vec2<f32>(0.0))) + min(max(d.x, d.y), 0.0);\n}\n\nfn sdDiamond(p: vec2<f32>, r: f32) -> f32 {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfn sdTriangle(p_in: vec2<f32>, r: f32) -> f32 {\n let k = sqrt(3.0);\n var p = p_in;\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) {\n p = vec2<f32>(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n }\n p.x = p.x - clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfn sdCross(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let d = abs(p);\n let s1 = sdBox(d, vec2<f32>(r, thickness));\n let s2 = sdBox(d, vec2<f32>(thickness, r));\n return min(s1, s2);\n}\n\nfn sdX(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let c = cos(0.785398);\n let s = sin(0.785398);\n let m = mat2x2<f32>(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfn sdStar(p_in: vec2<f32>, r: f32, rf: f32) -> f32 {\n let k1 = vec2<f32>(0.80901699, -0.58778525);\n let k2 = vec2<f32>(-k1.x, k1.y);\n var p = p_in;\n p.x = abs(p.x);\n p = p - 2.0 * max(dot(k1, p), 0.0) * k1;\n p = p - 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y = p.y - r;\n let ba = rf * vec2<f32>(-k1.y, k1.x) - vec2<f32>(0.0, 1.0);\n let h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n var d: f32 = 0.0;\n \n if (uniforms.symbol == 0) {\n d = sdCircle(in.uv, 0.45);\n } else if (uniforms.symbol == 1) {\n d = sdBox(in.uv, vec2<f32>(0.35));\n } else if (uniforms.symbol == 2) {\n d = sdDiamond(in.uv, 0.45);\n } else if (uniforms.symbol == 3) {\n d = sdTriangle(vec2<f32>(in.uv.x, in.uv.y + 0.1), 0.4);\n } else if (uniforms.symbol == 4) {\n d = sdTriangle(vec2<f32>(in.uv.x, -in.uv.y + 0.1), 0.4);\n } else if (uniforms.symbol == 5) {\n d = sdCross(in.uv, 0.45, 0.15);\n } else if (uniforms.symbol == 6) {\n d = sdX(in.uv, 0.45, 0.15);\n } else if (uniforms.symbol == 7) {\n d = sdStar(in.uv, 0.45, 0.4);\n }\n \n if (d > 0.02) {\n discard;\n }\n \n let alpha = 1.0 - smoothstep(0.0, 0.02, d);\n return vec4<f32>(uniforms.color.rgb, uniforms.color.a * alpha);\n}\n`;\n\nexport const POINT_VERTEX_STRIDE = 2 * 4; // 2 floats (x, y)\n","/**\n * Point Pipeline - WebGPU pipeline for rendering scatter points with SDF symbols\n * \n * Uses instanced rendering where each point is rendered as a quad (2 triangles).\n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { POINT_QUAD_SHADER_WGSL, POINT_VERTEX_STRIDE } from \"../shaders/point.wgsl\";\n\nexport interface PointPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n quadBuffer: any; // GPUBuffer - Pre-generated quad vertices\n vertexStride: number;\n}\n\nexport interface PointUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n pointSize: number;\n symbol: number; // 0=circle, 1=square, 2=diamond, 3=triangle, 4=triangleDown, 5=cross, 6=x, 7=star\n viewport: [number, number];\n}\n\n// Uniform buffer layout:\n// scale(2) + translate(2) + color(4) + pointSize(1) + symbol(1) + viewport(2) = 12 floats = 48 bytes\nconst UNIFORM_BUFFER_SIZE = 48;\n\n// Quad vertex offsets (6 vertices for 2 triangles)\nconst QUAD_VERTICES = new Float32Array([\n -1, -1, // bottom-left\n 1, -1, // bottom-right\n -1, 1, // top-left\n -1, 1, // top-left\n 1, -1, // bottom-right\n 1, 1, // top-right\n]);\n\nexport function createPointPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): PointPipelineBundle {\n const module = device.createShaderModule({ code: POINT_QUAD_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create quad vertex buffer\n const quadBuffer = device.createBuffer({\n size: QUAD_VERTICES.byteLength,\n usage: GPUBufferUsageAny.VERTEX | GPUBufferUsageAny.COPY_DST,\n mappedAtCreation: true,\n });\n new Float32Array(quadBuffer.getMappedRange()).set(QUAD_VERTICES);\n quadBuffer.unmap();\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n // Point positions (instanced)\n {\n arrayStride: POINT_VERTEX_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n // Quad vertex offsets (per-vertex)\n {\n arrayStride: 8, // 2 floats\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 1, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n quadBuffer,\n vertexStride: POINT_VERTEX_STRIDE,\n };\n}\n\nexport function updatePointUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: PointUniforms\n): void {\n // Pack data: scale(2) + translate(2) + color(4) + pointSize(1) + symbol(1 as float) + viewport(2)\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n uniforms.pointSize,\n uniforms.symbol, // Will be cast to i32 in shader via bitcast\n uniforms.viewport[0],\n uniforms.viewport[1],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n\nexport const SYMBOL_MAP: Record<string, number> = {\n circle: 0,\n square: 1,\n diamond: 2,\n triangle: 3,\n triangleDown: 4,\n cross: 5,\n x: 6,\n star: 7,\n};\n","/**\n * Band Pipeline - WebGPU pipeline for rendering band/area fills\n * \n * Uses triangle-strip topology for efficient area rendering.\n * Reuses the line shader with different primitive topology.\n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { LINE_SHADER_WGSL, LINE_VERTEX_STRIDE } from \"../shaders/line.wgsl\";\n\nexport interface BandPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n vertexStride: number;\n}\n\nexport interface BandUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n}\n\n// Same as line uniforms\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createBandPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): BandPipelineBundle {\n const module = device.createShaderModule({ code: LINE_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: LINE_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-strip\", // Key difference from line pipeline\n stripIndexFormat: undefined,\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n vertexStride: LINE_VERTEX_STRIDE,\n };\n}\n\nexport function updateBandUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: BandUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","/**\n * Heatmap Shader - WGSL for WebGPU\n * \n * Renders heatmap cells with colormap texture lookup.\n * Each vertex has position (x, y) and value (z) for color mapping.\n */\n\nexport const HEATMAP_SHADER_WGSL = `\n// Uniform buffer for transforms and value range\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n minValue: f32,\n maxValue: f32,\n _padding: vec2<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\n@group(0) @binding(1)\nvar colormapSampler: sampler;\n\n@group(0) @binding(2)\nvar colormapTexture: texture_1d<f32>;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n @location(1) value: f32,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) value: f32,\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n out.value = in.value;\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n let range = uniforms.maxValue - uniforms.minValue;\n var t: f32;\n if (range != 0.0) {\n t = (in.value - uniforms.minValue) / range;\n } else {\n t = 0.0;\n }\n t = clamp(t, 0.0, 1.0);\n \n return textureSample(colormapTexture, colormapSampler, t);\n}\n`;\n\n// Heatmap vertex: position (2 floats) + value (1 float) = 12 bytes\nexport const HEATMAP_VERTEX_STRIDE = 3 * 4; // 12 bytes\n","/**\n * Heatmap Pipeline - WebGPU pipeline for rendering heatmaps with colormap textures\n * \n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { HEATMAP_SHADER_WGSL, HEATMAP_VERTEX_STRIDE } from \"../shaders/heatmap.wgsl\";\n\nexport interface HeatmapPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n sampler: any; // GPUSampler\n vertexStride: number;\n}\n\nexport interface HeatmapUniforms {\n scale: [number, number];\n translate: [number, number];\n minValue: number;\n maxValue: number;\n}\n\n// Uniform buffer layout: scale(2) + translate(2) + minValue(1) + maxValue(1) + padding(2) = 8 floats = 32 bytes\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createHeatmapPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): HeatmapPipelineBundle {\n const module = device.createShaderModule({ code: HEATMAP_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n {\n binding: 1,\n visibility: GPUShaderStageAny.FRAGMENT,\n sampler: {},\n },\n {\n binding: 2,\n visibility: GPUShaderStageAny.FRAGMENT,\n texture: { \n sampleType: \"float\",\n viewDimension: \"1d\",\n },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create sampler\n const sampler = device.createSampler({\n magFilter: \"linear\",\n minFilter: \"linear\",\n addressModeU: \"clamp-to-edge\",\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: HEATMAP_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" }, // position\n { shaderLocation: 1, offset: 8, format: \"float32\" }, // value\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n sampler,\n vertexStride: HEATMAP_VERTEX_STRIDE,\n };\n}\n\nexport function createHeatmapBindGroup(\n device: any, // GPUDevice\n layout: any, // GPUBindGroupLayout\n uniformBuffer: any, // GPUBuffer\n sampler: any, // GPUSampler\n colormapTexture: any // GPUTexture\n): any { // GPUBindGroup\n return device.createBindGroup({\n layout,\n entries: [\n { binding: 0, resource: { buffer: uniformBuffer } },\n { binding: 1, resource: sampler },\n { binding: 2, resource: colormapTexture.createView() },\n ],\n });\n}\n\nexport function updateHeatmapUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: HeatmapUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.minValue,\n uniforms.maxValue,\n 0, // padding\n 0, // padding\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","import type {\n BufferDescriptor,\n BufferId,\n GpuBackend,\n GpuBackendInfo,\n GpuViewport,\n Texture1DDescriptor,\n TextureId,\n} from \"../../types\";\nimport type { DrawCall, DrawList, PointStyle, HeatmapStyle } from \"../../drawList\";\nimport type { FrameUniforms } from \"../../frame\";\nimport {\n createTrianglePipeline,\n type TrianglePipelineBundle,\n} from \"./pipelines/trianglePipeline\";\nimport {\n createLinePipeline,\n updateLineUniforms,\n type LinePipelineBundle,\n} from \"./pipelines/linePipeline\";\nimport {\n createPointPipeline,\n updatePointUniforms,\n SYMBOL_MAP,\n type PointPipelineBundle,\n} from \"./pipelines/pointPipeline\";\nimport {\n createBandPipeline,\n updateBandUniforms,\n type BandPipelineBundle,\n} from \"./pipelines/bandPipeline\";\nimport {\n createHeatmapPipeline,\n createHeatmapBindGroup,\n updateHeatmapUniforms,\n type HeatmapPipelineBundle,\n} from \"./pipelines/heatmapPipeline\";\n\nexport interface WebGPUBackendOptions {\n powerPreference?: \"low-power\" | \"high-performance\";\n preferredFormat?: string;\n}\n\n/**\n * Calculate transform uniforms from bounds\n */\nfunction calculateUniforms(bounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}): { scale: [number, number]; translate: [number, number] } {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n}\n\n/**\n * Parse color from style, returning RGBA values 0-1\n */\nfunction getColorFromStyle(style: any): [number, number, number, number] {\n const color = style?.color ?? [1, 0, 0.3, 1];\n const opacity = style?.opacity ?? 1;\n \n // If color is already RGBA tuple\n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], (color[3] ?? 1) * opacity];\n }\n \n return [1, 0, 0.3, opacity]; // Default magenta\n}\n\nexport class WebGPUBackend implements GpuBackend {\n public readonly info: GpuBackendInfo;\n\n private canvas: HTMLCanvasElement;\n private opts: WebGPUBackendOptions;\n\n private viewport: GpuViewport | null = null;\n\n private adapter: any;\n private device: any;\n private context: any;\n private format: string | null = null;\n\n private buffers = new Map<string, any>();\n private textures = new Map<string, any>();\n\n // Pipelines for different draw types\n private trianglePipeline: TrianglePipelineBundle | null = null;\n private linePipeline: LinePipelineBundle | null = null;\n private pointPipeline: PointPipelineBundle | null = null;\n private bandPipeline: BandPipelineBundle | null = null;\n private heatmapPipeline: HeatmapPipelineBundle | null = null;\n\n // Heatmap bind groups (per texture)\n private heatmapBindGroups = new Map<string, any>();\n\n constructor(canvas: HTMLCanvasElement, opts: WebGPUBackendOptions = {}) {\n this.canvas = canvas;\n this.opts = opts;\n this.info = {\n type: \"webgpu\",\n available: WebGPUBackend.isSupported(),\n };\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(): Promise<void> {\n if (!this.info.available) {\n throw new Error(\"[gpu] WebGPU not supported\");\n }\n\n const gpu = (globalThis as any).navigator.gpu;\n\n this.adapter = await gpu.requestAdapter({\n powerPreference: this.opts.powerPreference ?? \"high-performance\",\n });\n\n if (!this.adapter) {\n throw new Error(\"[gpu] 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(\"[gpu] Failed to get WebGPU canvas context\");\n }\n\n this.context = ctx;\n\n const format =\n this.opts.preferredFormat ??\n (gpu.getPreferredCanvasFormat\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n this.format = format;\n\n this.context.configure({\n device: this.device,\n format,\n alphaMode: \"premultiplied\",\n });\n }\n\n setViewport(viewport: GpuViewport): void {\n this.viewport = viewport;\n const w = Math.max(1, Math.floor(viewport.width * viewport.dpr));\n const h = Math.max(1, Math.floor(viewport.height * viewport.dpr));\n if (this.canvas.width !== w) this.canvas.width = w;\n if (this.canvas.height !== h) this.canvas.height = h;\n }\n\n createOrUpdateBuffer(\n id: BufferId,\n data: ArrayBufferView,\n desc?: Partial<BufferDescriptor>\n ): void {\n if (!this.device) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n const usage = desc?.usage ?? \"vertex\";\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n if (!GPUBufferUsageAny) {\n throw new Error(\n \"[gpu] GPUBufferUsage not available (missing WebGPU runtime)\"\n );\n }\n\n const usageFlags =\n usage === \"index\"\n ? GPUBufferUsageAny.INDEX | GPUBufferUsageAny.COPY_DST\n : usage === \"uniform\"\n ? GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST\n : GPUBufferUsageAny.VERTEX | GPUBufferUsageAny.COPY_DST;\n\n const byteLength = data.byteLength;\n\n let buf = this.buffers.get(id);\n if (!buf || buf.size < byteLength) {\n if (buf) {\n try {\n buf.destroy();\n } catch {}\n }\n buf = this.device.createBuffer({\n size: Math.max(4, byteLength),\n usage: usageFlags,\n });\n this.buffers.set(id, buf);\n }\n\n this.device.queue.writeBuffer(\n buf,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n deleteBuffer(id: BufferId): void {\n const buf = this.buffers.get(id);\n if (buf) {\n try {\n buf.destroy();\n } catch {}\n this.buffers.delete(id);\n }\n }\n\n createOrUpdateTexture1D(\n id: TextureId,\n data: Uint8Array,\n desc?: Partial<Texture1DDescriptor>\n ): void {\n if (!this.device) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n const width = desc?.width ?? Math.floor(data.length / 4);\n const format = desc?.format ?? \"rgba8unorm\";\n\n const GPUTextureUsageAny = (globalThis as any).GPUTextureUsage;\n if (!GPUTextureUsageAny) {\n throw new Error(\n \"[gpu] GPUTextureUsage not available (missing WebGPU runtime)\"\n );\n }\n\n let tex = this.textures.get(id);\n if (!tex) {\n tex = this.device.createTexture({\n size: { width, height: 1, depthOrArrayLayers: 1 },\n format,\n dimension: \"1d\",\n usage: GPUTextureUsageAny.TEXTURE_BINDING | GPUTextureUsageAny.COPY_DST,\n });\n this.textures.set(id, tex);\n \n // Invalidate heatmap bind group for this texture\n this.heatmapBindGroups.delete(id);\n }\n\n this.device.queue.writeTexture(\n { texture: tex },\n data,\n { bytesPerRow: width * 4 },\n { width, height: 1, depthOrArrayLayers: 1 }\n );\n }\n\n deleteTexture(id: TextureId): void {\n const tex = this.textures.get(id);\n if (tex) {\n try {\n tex.destroy();\n } catch {}\n this.textures.delete(id);\n this.heatmapBindGroups.delete(id);\n }\n }\n\n /**\n * Initialize all pipelines lazily\n */\n private ensurePipelines(): void {\n if (!this.trianglePipeline) {\n this.trianglePipeline = createTrianglePipeline(this.device, this.format!);\n }\n if (!this.linePipeline) {\n this.linePipeline = createLinePipeline(this.device, this.format!);\n }\n if (!this.pointPipeline) {\n this.pointPipeline = createPointPipeline(this.device, this.format!);\n }\n if (!this.bandPipeline) {\n this.bandPipeline = createBandPipeline(this.device, this.format!);\n }\n if (!this.heatmapPipeline) {\n this.heatmapPipeline = createHeatmapPipeline(this.device, this.format!);\n }\n }\n\n render(drawList: DrawList, frame: FrameUniforms): void {\n if (!this.device || !this.context || !this.format) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n this.ensurePipelines();\n\n const encoder = this.device.createCommandEncoder();\n const view = this.context.getCurrentTexture().createView();\n\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view,\n clearValue: {\n r: frame.clearColor[0],\n g: frame.clearColor[1],\n b: frame.clearColor[2],\n a: frame.clearColor[3],\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n\n // Default bounds (NDC if not specified)\n const defaultBounds = { xMin: -1, xMax: 1, yMin: -1, yMax: 1 };\n\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buf = this.buffers.get(item.bufferId);\n if (!buf) continue;\n\n this.renderDrawCall(pass, item, buf, defaultBounds);\n }\n\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n /**\n * Render with explicit bounds (for integration with chart system)\n */\n renderWithBounds(\n drawList: DrawList,\n frame: FrameUniforms,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n if (!this.device || !this.context || !this.format) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n this.ensurePipelines();\n\n const encoder = this.device.createCommandEncoder();\n const view = this.context.getCurrentTexture().createView();\n\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view,\n clearValue: {\n r: frame.clearColor[0],\n g: frame.clearColor[1],\n b: frame.clearColor[2],\n a: frame.clearColor[3],\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buf = this.buffers.get(item.bufferId);\n if (!buf) continue;\n\n // Use item's yBounds if specified, otherwise use global bounds\n const itemBounds = item.yBounds\n ? { ...bounds, yMin: item.yBounds.min, yMax: item.yBounds.max }\n : bounds;\n\n this.renderDrawCall(pass, item, buf, itemBounds);\n }\n\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n /**\n * Render a single draw call\n */\n private renderDrawCall(\n pass: any,\n item: DrawCall,\n buf: any,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n const uniforms = calculateUniforms(bounds);\n const color = getColorFromStyle(item.style);\n\n switch (item.kind) {\n case \"triangles\":\n case \"bar\":\n this.renderTriangles(pass, buf, item.count);\n break;\n\n case \"line\":\n this.renderLine(pass, buf, item.count, uniforms, color);\n break;\n\n case \"scatter\":\n case \"points\":\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"line+scatter\":\n this.renderLine(pass, buf, item.count, uniforms, color);\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"step\":\n // Use step buffer if available\n if (item.stepBufferId && item.stepCount) {\n const stepBuf = this.buffers.get(item.stepBufferId);\n if (stepBuf) {\n this.renderLine(pass, stepBuf, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(pass, buf, item.count, uniforms, color);\n }\n break;\n\n case \"step+scatter\":\n if (item.stepBufferId && item.stepCount) {\n const stepBuf = this.buffers.get(item.stepBufferId);\n if (stepBuf) {\n this.renderLine(pass, stepBuf, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(pass, buf, item.count, uniforms, color);\n }\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"band\":\n // Band uses semi-transparent color\n const bandColor: [number, number, number, number] = [\n color[0],\n color[1],\n color[2],\n color[3] * 0.4,\n ];\n this.renderBand(pass, buf, item.count, uniforms, bandColor);\n break;\n\n case \"heatmap\":\n this.renderHeatmap(pass, buf, item.count, uniforms, item.style as HeatmapStyle, item.textureId);\n break;\n }\n }\n\n private renderTriangles(pass: any, buf: any, count: number): void {\n pass.setPipeline(this.trianglePipeline!.pipeline);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderLine(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n updateLineUniforms(this.device, this.linePipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n });\n pass.setPipeline(this.linePipeline!.pipeline);\n pass.setBindGroup(0, this.linePipeline!.bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderPoints(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n style?: PointStyle\n ): void {\n const pointSize = (style?.pointSize ?? 4) * (this.viewport?.dpr ?? 1);\n const symbol = SYMBOL_MAP[style?.symbol ?? \"circle\"] ?? 0;\n const viewport: [number, number] = [\n this.canvas.width,\n this.canvas.height,\n ];\n\n updatePointUniforms(this.device, this.pointPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n pointSize,\n symbol,\n viewport,\n });\n\n pass.setPipeline(this.pointPipeline!.pipeline);\n pass.setBindGroup(0, this.pointPipeline!.bindGroup);\n pass.setVertexBuffer(0, buf); // Point positions (instanced)\n pass.setVertexBuffer(1, this.pointPipeline!.quadBuffer); // Quad vertices\n pass.draw(6, count); // 6 vertices per quad, count instances\n }\n\n private renderBand(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n updateBandUniforms(this.device, this.bandPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n });\n pass.setPipeline(this.bandPipeline!.pipeline);\n pass.setBindGroup(0, this.bandPipeline!.bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderHeatmap(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n style?: HeatmapStyle,\n textureId?: string\n ): void {\n if (!textureId) return;\n \n const tex = this.textures.get(textureId);\n if (!tex) return;\n\n const zBounds = style?.zBounds ?? { min: 0, max: 1 };\n\n updateHeatmapUniforms(this.device, this.heatmapPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n minValue: zBounds.min,\n maxValue: zBounds.max,\n });\n\n // Get or create bind group for this texture\n let bindGroup = this.heatmapBindGroups.get(textureId);\n if (!bindGroup) {\n bindGroup = createHeatmapBindGroup(\n this.device,\n this.heatmapPipeline!.bindGroupLayout,\n this.heatmapPipeline!.uniformBuffer,\n this.heatmapPipeline!.sampler,\n tex\n );\n this.heatmapBindGroups.set(textureId, bindGroup);\n }\n\n pass.setPipeline(this.heatmapPipeline!.pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n destroy(): void {\n for (const id of Array.from(this.buffers.keys())) {\n this.deleteBuffer(id);\n }\n for (const id of Array.from(this.textures.keys())) {\n this.deleteTexture(id);\n }\n\n this.trianglePipeline = null;\n this.linePipeline = null;\n this.pointPipeline = null;\n this.bandPipeline = null;\n this.heatmapPipeline = null;\n this.heatmapBindGroups.clear();\n\n this.device = undefined;\n this.adapter = undefined;\n this.context = undefined;\n this.format = null;\n }\n}\n","/**\n * WebGL Shader Sources\n * \n * GLSL shaders for the WebGL backend.\n * These match the functionality of the WebGPU WGSL shaders.\n */\n\n// ============================================\n// Line Shader\n// ============================================\n\nexport const LINE_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nexport const LINE_FRAG_GLSL = `\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n`;\n\n// ============================================\n// Point Shader (with SDF symbols)\n// ============================================\n\nexport const POINT_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n`;\n\nexport const POINT_FRAG_GLSL = `\nprecision highp float;\nuniform vec4 uColor;\nuniform int uSymbol;\n\nfloat sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n\nfloat sdTriangle(vec2 p, float r) {\n const float k = sqrt(3.0);\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n p.x -= clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfloat sdDiamond(vec2 p, float r) {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfloat sdCross(vec2 p, float r, float thickness) {\n vec2 d = abs(p);\n float s1 = sdBox(d, vec2(r, thickness));\n float s2 = sdBox(d, vec2(thickness, r));\n return min(s1, s2);\n}\n\nfloat sdX(vec2 p, float r, float thickness) {\n float c = cos(0.785398);\n float s = sin(0.785398);\n mat2 m = mat2(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfloat sdStar(vec2 p, float r, float rf) {\n const vec2 k1 = vec2(0.80901699, -0.58778525);\n const vec2 k2 = vec2(-k1.x, k1.y);\n p.x = abs(p.x);\n p -= 2.0 * max(dot(k1, p), 0.0) * k1;\n p -= 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y -= r;\n vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0, 1);\n float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\nvoid main() {\n vec2 p = gl_PointCoord - vec2(0.5);\n float d = 0.0;\n\n if (uSymbol == 0) {\n d = sdCircle(p, 0.45);\n } else if (uSymbol == 1) {\n d = sdBox(p, vec2(0.35));\n } else if (uSymbol == 2) {\n d = sdDiamond(p, 0.45);\n } else if (uSymbol == 3) {\n d = sdTriangle(vec2(p.x, p.y + 0.1), 0.4);\n } else if (uSymbol == 4) {\n d = sdTriangle(vec2(p.x, -p.y + 0.1), 0.4);\n } else if (uSymbol == 5) {\n d = sdCross(p, 0.45, 0.15);\n } else if (uSymbol == 6) {\n d = sdX(p, 0.45, 0.15);\n } else if (uSymbol == 7) {\n d = sdStar(p, 0.45, 0.4);\n }\n\n if (d > 0.02) discard;\n\n float alpha = 1.0 - smoothstep(0.0, 0.02, d);\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n`;\n\n// ============================================\n// Heatmap Shader\n// ============================================\n\nexport const HEATMAP_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute float aValue;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying float vValue;\n\nvoid main() {\n gl_Position = vec4(aPosition * uScale + uTranslate, 0.0, 1.0);\n vValue = aValue;\n}\n`;\n\nexport const HEATMAP_FRAG_GLSL = `\nprecision highp float;\nvarying float vValue;\nuniform float uMinValue;\nuniform float uMaxValue;\nuniform sampler2D uColormap;\n\nvoid main() {\n float range = uMaxValue - uMinValue;\n float t = (vValue - uMinValue) / (range != 0.0 ? range : 1.0);\n t = clamp(t, 0.0, 1.0);\n gl_FragColor = texture2D(uColormap, vec2(t, 0.5));\n}\n`;\n\n// ============================================\n// Triangle Shader (for bands and bars)\n// ============================================\n\nexport const TRIANGLE_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec4 aColor;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying vec4 vColor;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n vColor = aColor;\n}\n`;\n\nexport const TRIANGLE_FRAG_GLSL = `\nprecision highp float;\nvarying vec4 vColor;\n\nvoid main() {\n gl_FragColor = vColor;\n}\n`;\n","/**\n * WebGL Program Factory\n * \n * Utilities for compiling and linking WebGL shader programs.\n */\n\nimport {\n LINE_VERT_GLSL,\n LINE_FRAG_GLSL,\n POINT_VERT_GLSL,\n POINT_FRAG_GLSL,\n HEATMAP_VERT_GLSL,\n HEATMAP_FRAG_GLSL,\n} from \"./shaders\";\n\nexport interface ShaderProgram {\n program: WebGLProgram;\n attributes: Record<string, number>;\n uniforms: Record<string, WebGLUniformLocation | null>;\n}\n\n/**\n * Compile a shader\n */\nfunction compileShader(\n gl: WebGLRenderingContext,\n type: number,\n source: string\n): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) {\n throw new Error(\"[WebGL] Failed to create shader\");\n }\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`[WebGL] Shader compilation error: ${info}`);\n }\n\n return shader;\n}\n\n/**\n * Link a shader program\n */\nfunction linkProgram(\n gl: WebGLRenderingContext,\n vertShader: WebGLShader,\n fragShader: WebGLShader\n): WebGLProgram {\n const program = gl.createProgram();\n if (!program) {\n throw new Error(\"[WebGL] Failed to create program\");\n }\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n throw new Error(`[WebGL] Program link error: ${info}`);\n }\n\n return program;\n}\n\n/**\n * Create a shader program from source\n */\nexport function createProgram(\n gl: WebGLRenderingContext,\n vertSource: string,\n fragSource: string,\n attributeNames: string[],\n uniformNames: string[]\n): ShaderProgram {\n const vertShader = compileShader(gl, gl.VERTEX_SHADER, vertSource);\n const fragShader = compileShader(gl, gl.FRAGMENT_SHADER, fragSource);\n const program = linkProgram(gl, vertShader, fragShader);\n\n // Clean up individual shaders (they're linked now)\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n // Get attribute locations\n const attributes: Record<string, number> = {};\n for (const name of attributeNames) {\n attributes[name] = gl.getAttribLocation(program, name);\n }\n\n // Get uniform locations\n const uniforms: Record<string, WebGLUniformLocation | null> = {};\n for (const name of uniformNames) {\n uniforms[name] = gl.getUniformLocation(program, name);\n }\n\n return { program, attributes, uniforms };\n}\n\n/**\n * All programs used by the WebGL backend\n */\nexport interface ProgramBundle {\n line: ShaderProgram;\n point: ShaderProgram;\n heatmap: ShaderProgram;\n}\n\n/**\n * Create all shader programs\n */\nexport function createAllPrograms(gl: WebGLRenderingContext): ProgramBundle {\n const line = createProgram(\n gl,\n LINE_VERT_GLSL,\n LINE_FRAG_GLSL,\n [\"aPosition\"],\n [\"uScale\", \"uTranslate\", \"uColor\"]\n );\n\n const point = createProgram(\n gl,\n POINT_VERT_GLSL,\n POINT_FRAG_GLSL,\n [\"aPosition\"],\n [\"uScale\", \"uTranslate\", \"uColor\", \"uPointSize\", \"uSymbol\"]\n );\n\n const heatmap = createProgram(\n gl,\n HEATMAP_VERT_GLSL,\n HEATMAP_FRAG_GLSL,\n [\"aPosition\", \"aValue\"],\n [\"uScale\", \"uTranslate\", \"uMinValue\", \"uMaxValue\", \"uColormap\"]\n );\n\n return { line, point, heatmap };\n}\n\n/**\n * Destroy all programs\n */\nexport function destroyPrograms(gl: WebGLRenderingContext, bundle: ProgramBundle): void {\n gl.deleteProgram(bundle.line.program);\n gl.deleteProgram(bundle.point.program);\n gl.deleteProgram(bundle.heatmap.program);\n}\n","/**\n * WebGL Backend - GPU abstraction layer implementation for WebGL\n * \n * Provides the same interface as WebGPUBackend for compatibility.\n * This serves as a fallback for browsers without WebGPU support.\n */\n\nimport type {\n BufferDescriptor,\n BufferId,\n GpuBackend,\n GpuBackendInfo,\n GpuViewport,\n Texture1DDescriptor,\n TextureId,\n} from \"../../types\";\nimport type { DrawCall, DrawList, PointStyle, HeatmapStyle } from \"../../drawList\";\nimport type { FrameUniforms } from \"../../frame\";\nimport { createAllPrograms, destroyPrograms, type ProgramBundle } from \"./programFactory\";\n\nexport interface WebGLBackendOptions {\n antialias?: boolean;\n preserveDrawingBuffer?: boolean;\n powerPreference?: \"default\" | \"low-power\" | \"high-performance\";\n}\n\n/**\n * Symbol name to number mapping\n */\nconst SYMBOL_MAP: Record<string, number> = {\n circle: 0,\n square: 1,\n diamond: 2,\n triangle: 3,\n triangleDown: 4,\n cross: 5,\n x: 6,\n star: 7,\n};\n\n/**\n * Calculate transform uniforms from bounds\n */\nfunction calculateUniforms(bounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}): { scale: [number, number]; translate: [number, number] } {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n}\n\n/**\n * Get color from style\n */\nfunction getColorFromStyle(style: any): [number, number, number, number] {\n const color = style?.color ?? [1, 0, 0.3, 1];\n const opacity = style?.opacity ?? 1;\n \n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], (color[3] ?? 1) * opacity];\n }\n \n return [1, 0, 0.3, opacity];\n}\n\nexport class WebGLBackend implements GpuBackend {\n public readonly info: GpuBackendInfo;\n\n private canvas: HTMLCanvasElement;\n private opts: WebGLBackendOptions;\n private gl: WebGLRenderingContext | null = null;\n \n private viewport: GpuViewport | null = null;\n private dpr: number = 1;\n\n private programs: ProgramBundle | null = null;\n private buffers = new Map<string, WebGLBuffer>();\n private textures = new Map<string, WebGLTexture>();\n\n constructor(canvas: HTMLCanvasElement, opts: WebGLBackendOptions = {}) {\n this.canvas = canvas;\n this.opts = opts;\n this.info = {\n type: \"webgl\",\n available: WebGLBackend.isSupported(),\n };\n }\n\n static isSupported(): boolean {\n if (typeof document === \"undefined\") return false;\n \n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n return !!gl;\n } catch {\n return false;\n }\n }\n\n async init(): Promise<void> {\n if (!this.info.available) {\n throw new Error(\"[gpu] WebGL not supported\");\n }\n\n const gl = this.canvas.getContext(\"webgl\", {\n alpha: true,\n antialias: this.opts.antialias ?? true,\n preserveDrawingBuffer: this.opts.preserveDrawingBuffer ?? true,\n powerPreference: this.opts.powerPreference ?? \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"[gpu] Failed to get WebGL context\");\n }\n\n this.gl = gl;\n\n // Enable blending\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Create shader programs\n this.programs = createAllPrograms(gl);\n }\n\n setViewport(viewport: GpuViewport): void {\n this.viewport = viewport;\n this.dpr = viewport.dpr;\n \n const w = Math.max(1, Math.floor(viewport.width * viewport.dpr));\n const h = Math.max(1, Math.floor(viewport.height * viewport.dpr));\n \n if (this.canvas.width !== w) this.canvas.width = w;\n if (this.canvas.height !== h) this.canvas.height = h;\n \n if (this.gl) {\n this.gl.viewport(0, 0, w, h);\n }\n }\n\n createOrUpdateBuffer(\n id: BufferId,\n data: ArrayBufferView,\n desc?: Partial<BufferDescriptor>\n ): void {\n if (!this.gl) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n \n let buffer = this.buffers.get(id);\n if (!buffer) {\n buffer = gl.createBuffer()!;\n this.buffers.set(id, buffer);\n }\n\n const target = desc?.usage === \"index\" ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER;\n \n gl.bindBuffer(target, buffer);\n gl.bufferData(target, data, gl.DYNAMIC_DRAW);\n gl.bindBuffer(target, null);\n }\n\n deleteBuffer(id: BufferId): void {\n if (!this.gl) return;\n \n const buffer = this.buffers.get(id);\n if (buffer) {\n this.gl.deleteBuffer(buffer);\n this.buffers.delete(id);\n }\n }\n\n createOrUpdateTexture1D(\n id: TextureId,\n data: Uint8Array,\n desc?: Partial<Texture1DDescriptor>\n ): void {\n if (!this.gl) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n const width = desc?.width ?? Math.floor(data.length / 4);\n\n let texture = this.textures.get(id);\n if (!texture) {\n texture = gl.createTexture()!;\n this.textures.set(id, texture);\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n\n deleteTexture(id: TextureId): void {\n if (!this.gl) return;\n \n const texture = this.textures.get(id);\n if (texture) {\n this.gl.deleteTexture(texture);\n this.textures.delete(id);\n }\n }\n\n render(drawList: DrawList, frame: FrameUniforms): void {\n this.renderWithBounds(drawList, frame, { xMin: -1, xMax: 1, yMin: -1, yMax: 1 });\n }\n\n renderWithBounds(\n drawList: DrawList,\n frame: FrameUniforms,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n if (!this.gl || !this.programs) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n // Clear\n gl.clearColor(\n frame.clearColor[0],\n frame.clearColor[1],\n frame.clearColor[2],\n frame.clearColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Render each draw call\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buffer = this.buffers.get(item.bufferId);\n if (!buffer) continue;\n\n // Use item's yBounds if specified\n const itemBounds = item.yBounds\n ? { ...bounds, yMin: item.yBounds.min, yMax: item.yBounds.max }\n : bounds;\n\n this.renderDrawCall(item, buffer, itemBounds);\n }\n }\n\n private renderDrawCall(\n item: DrawCall,\n buffer: WebGLBuffer,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n const uniforms = calculateUniforms(bounds);\n const color = getColorFromStyle(item.style);\n\n switch (item.kind) {\n case \"line\":\n case \"step\":\n this.renderLine(buffer, item.count, uniforms, color);\n break;\n\n case \"scatter\":\n case \"points\":\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"line+scatter\":\n this.renderLine(buffer, item.count, uniforms, color);\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"step+scatter\":\n if (item.stepBufferId && item.stepCount) {\n const stepBuffer = this.buffers.get(item.stepBufferId);\n if (stepBuffer) {\n this.renderLine(stepBuffer, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(buffer, item.count, uniforms, color);\n }\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"band\":\n const bandColor: [number, number, number, number] = [\n color[0], color[1], color[2], color[3] * 0.4\n ];\n this.renderBand(buffer, item.count, uniforms, bandColor);\n break;\n\n case \"triangles\":\n case \"bar\":\n this.renderTriangles(buffer, item.count, uniforms, color);\n break;\n\n case \"heatmap\":\n this.renderHeatmap(buffer, item.count, uniforms, item.style as HeatmapStyle, item.textureId);\n break;\n }\n }\n\n private renderLine(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.LINE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderPoints(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n style?: PointStyle\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.point;\n\n const pointSize = (style?.pointSize ?? 4) * this.dpr;\n const symbol = SYMBOL_MAP[style?.symbol ?? \"circle\"] ?? 0;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n gl.uniform1f(prog.uniforms.uPointSize!, pointSize);\n gl.uniform1i(prog.uniforms.uSymbol!, symbol);\n\n gl.drawArrays(gl.POINTS, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderBand(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderTriangles(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderHeatmap(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n style?: HeatmapStyle,\n textureId?: string\n ): void {\n if (!textureId) return;\n \n const texture = this.textures.get(textureId);\n if (!texture) return;\n\n const gl = this.gl!;\n const prog = this.programs!.heatmap;\n\n const zBounds = style?.zBounds ?? { min: 0, max: 1 };\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 12, 0);\n\n if (prog.attributes.aValue !== -1) {\n gl.enableVertexAttribArray(prog.attributes.aValue);\n gl.vertexAttribPointer(prog.attributes.aValue, 1, gl.FLOAT, false, 12, 8);\n }\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform1f(prog.uniforms.uMinValue!, zBounds.min);\n gl.uniform1f(prog.uniforms.uMaxValue!, zBounds.max);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1i(prog.uniforms.uColormap!, 0);\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n if (prog.attributes.aValue !== -1) {\n gl.disableVertexAttribArray(prog.attributes.aValue);\n }\n }\n\n destroy(): void {\n if (!this.gl) return;\n\n const gl = this.gl;\n\n // Delete all buffers\n for (const buffer of this.buffers.values()) {\n gl.deleteBuffer(buffer);\n }\n this.buffers.clear();\n\n // Delete all textures\n for (const texture of this.textures.values()) {\n gl.deleteTexture(texture);\n }\n this.textures.clear();\n\n // Delete programs\n if (this.programs) {\n destroyPrograms(gl, this.programs);\n this.programs = null;\n }\n\n this.gl = null;\n }\n}\n","/**\n * GPU Renderer Facade - Drop-in replacement for NativeWebGLRenderer\n * \n * Provides the same interface as NativeWebGLRenderer but uses the\n * backend-agnostic GPU abstraction layer. Supports both WebGPU and WebGL.\n */\n\nimport type { GpuBackend, RGBA } from \"../types\";\nimport type { DrawList, DrawCall, PointStyle } from \"../drawList\";\nimport type { FrameUniforms } from \"../frame\";\nimport { WebGPUBackend } from \"../backends/webgpu/WebGPUBackend\";\nimport { WebGLBackend } from \"../backends/webgl/WebGLBackend\";\nimport { SeriesAdapter, parseColorToRGBA } from \"./seriesAdapter\";\nimport type { SeriesStyle } from \"./seriesAdapter\";\n\n/**\n * Bounds interface matching the original\n */\nexport interface Bounds {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\n/**\n * Series render data matching NativeSeriesRenderData\n */\nexport interface GpuSeriesRenderData {\n id: string;\n type: \"line\" | \"scatter\" | \"line+scatter\" | \"step\" | \"step+scatter\" | \"band\" | \"bar\" | \"heatmap\";\n visible: boolean;\n style: SeriesStyle;\n \n /** Y-bounds for multi-axis support */\n yBounds?: { min: number; max: number };\n \n /** Heatmap specific */\n zBounds?: { min: number; max: number };\n colormap?: string;\n}\n\n/**\n * Render options matching NativeRenderOptions\n */\nexport interface GpuRenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n plotArea?: { x: number; y: number; width: number; height: number };\n}\n\n/**\n * Backend preference\n */\nexport type BackendPreference = \"webgpu\" | \"webgl\" | \"auto\";\n\n/**\n * GPU Renderer options\n */\nexport interface GpuRendererOptions {\n backend?: BackendPreference;\n powerPreference?: \"low-power\" | \"high-performance\";\n}\n\n/**\n * GPU Renderer - Unified renderer using the GPU abstraction layer\n */\nexport class GpuRenderer {\n private canvas: HTMLCanvasElement;\n private options: GpuRendererOptions;\n private backend: GpuBackend | null = null;\n private adapter: SeriesAdapter | null = null;\n \n private dpr: number;\n private isInitialized = false;\n private backendType: \"webgpu\" | \"webgl\" | null = null;\n \n // Buffer management\n private bufferDataMap = new Map<string, Float32Array>();\n private stepBufferDataMap = new Map<string, Float32Array>();\n private colormapDataMap = new Map<string, Uint8Array>();\n \n constructor(canvas: HTMLCanvasElement, options: GpuRendererOptions = {}) {\n this.canvas = canvas;\n this.options = options;\n this.dpr = window.devicePixelRatio || 1;\n }\n \n /**\n * Initialize the renderer\n */\n async init(): Promise<boolean> {\n const preference = this.options.backend ?? \"auto\";\n \n // Try WebGPU first if preferred or auto\n if (preference === \"webgpu\" || preference === \"auto\") {\n if (WebGPUBackend.isSupported()) {\n try {\n const backend = new WebGPUBackend(this.canvas, {\n powerPreference: this.options.powerPreference ?? \"high-performance\",\n });\n await backend.init();\n \n this.backend = backend;\n this.backendType = \"webgpu\";\n this.adapter = new SeriesAdapter(backend);\n this.isInitialized = true;\n \n this.resize();\n return true;\n } catch (e) {\n console.warn(\"[GpuRenderer] WebGPU init failed:\", e);\n }\n }\n }\n \n // Fallback to WebGL\n if (preference === \"webgl\" || preference === \"auto\") {\n if (WebGLBackend.isSupported()) {\n try {\n const backend = new WebGLBackend(this.canvas, {\n powerPreference: this.options.powerPreference ?? \"high-performance\",\n });\n await backend.init();\n \n this.backend = backend;\n this.backendType = \"webgl\";\n this.adapter = new SeriesAdapter(backend);\n this.isInitialized = true;\n \n this.resize();\n console.info(\"[GpuRenderer] Using WebGL backend (WebGPU not available)\");\n return true;\n } catch (e) {\n console.warn(\"[GpuRenderer] WebGL init failed:\", e);\n }\n }\n }\n \n return false;\n }\n \n /**\n * Check if renderer is available\n */\n get available(): boolean {\n return this.isInitialized;\n }\n \n /**\n * Get the active backend type\n */\n get activeBackend(): \"webgpu\" | \"webgl\" | null {\n return this.backendType;\n }\n \n /**\n * Set device pixel ratio\n */\n setDPR(dpr: number): void {\n this.dpr = dpr;\n this.resize();\n }\n \n /**\n * Create or update a buffer\n */\n createBuffer(id: string, data: Float32Array): void {\n this.bufferDataMap.set(id, data);\n }\n \n /**\n * Update a buffer partially\n */\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n const existing = this.bufferDataMap.get(id);\n if (!existing) return false;\n \n const offsetFloats = offsetInBytes / 4;\n existing.set(data, offsetFloats);\n return true;\n }\n \n /**\n * Get a buffer's data\n */\n getBuffer(id: string): Float32Array | undefined {\n return this.bufferDataMap.get(id);\n }\n \n /**\n * Delete a buffer\n */\n deleteBuffer(id: string): void {\n this.bufferDataMap.delete(id);\n if (this.backend) {\n this.backend.deleteBuffer(id);\n }\n }\n \n /**\n * Create or update a step buffer\n */\n createStepBuffer(id: string, data: Float32Array): void {\n this.stepBufferDataMap.set(id, data);\n }\n \n /**\n * Create colormap texture\n */\n createColormapTexture(id: string, data: Uint8Array): void {\n this.colormapDataMap.set(id, data);\n if (this.backend) {\n this.backend.createOrUpdateTexture1D(id, data, {\n width: data.length / 4,\n });\n }\n }\n \n /**\n * Render a frame\n */\n render(series: GpuSeriesRenderData[], options: GpuRenderOptions): void {\n if (!this.isInitialized || !this.backend) return;\n \n // Build draw list\n const drawList = this.buildDrawList(series);\n \n // Create frame uniforms\n const frame: FrameUniforms = {\n viewport: {\n width: this.canvas.clientWidth,\n height: this.canvas.clientHeight,\n dpr: this.dpr,\n },\n clearColor: (options.backgroundColor ?? [0.1, 0.1, 0.18, 1]) as RGBA,\n bounds: options.bounds,\n plotArea: options.plotArea,\n };\n \n // Render using the backend\n if (\"renderWithBounds\" in this.backend) {\n (this.backend as any).renderWithBounds(drawList, frame, options.bounds);\n } else {\n this.backend.render(drawList, frame);\n }\n }\n \n /**\n * Build draw list from series data\n */\n private buildDrawList(series: GpuSeriesRenderData[]): DrawList {\n const items: DrawCall[] = [];\n \n for (const s of series) {\n const bufferData = this.bufferDataMap.get(s.id);\n if (!bufferData) continue;\n \n // Upload buffer to GPU\n this.backend!.createOrUpdateBuffer(s.id, bufferData, { usage: \"vertex\" });\n \n const pointCount = s.type === \"heatmap\" \n ? bufferData.length / 3 \n : bufferData.length / 2;\n \n const baseColor = parseColorToRGBA(s.style.color);\n const opacity = s.style.opacity ?? 1;\n const color: [number, number, number, number] = [\n baseColor[0], \n baseColor[1], \n baseColor[2], \n baseColor[3] * opacity\n ];\n \n const drawCall: DrawCall = {\n id: s.id,\n kind: s.type,\n bufferId: s.id,\n count: pointCount,\n visible: s.visible,\n yBounds: s.yBounds,\n };\n \n // Set style based on type\n if (s.type === \"scatter\" || s.type === \"line+scatter\" || s.type === \"step+scatter\") {\n drawCall.style = {\n color: color as RGBA,\n opacity,\n pointSize: s.style.pointSize ?? 4,\n symbol: (s.style.symbol ?? \"circle\") as PointStyle[\"symbol\"],\n };\n } else if (s.type === \"heatmap\") {\n drawCall.textureId = `colormap:${s.id}`;\n drawCall.style = {\n zBounds: s.zBounds,\n colormap: s.colormap,\n };\n \n // Upload colormap if available\n const colormapData = this.colormapDataMap.get(s.id);\n if (colormapData) {\n this.backend!.createOrUpdateTexture1D(drawCall.textureId, colormapData, {\n width: colormapData.length / 4,\n });\n }\n } else {\n drawCall.style = {\n color: color as RGBA,\n opacity,\n lineWidth: s.style.lineWidth ?? 1,\n };\n }\n \n // Handle step buffer\n if ((s.type === \"step\" || s.type === \"step+scatter\") && this.stepBufferDataMap.has(s.id)) {\n const stepData = this.stepBufferDataMap.get(s.id)!;\n const stepBufferId = `${s.id}:step`;\n this.backend!.createOrUpdateBuffer(stepBufferId, stepData, { usage: \"vertex\" });\n drawCall.stepBufferId = stepBufferId;\n drawCall.stepCount = stepData.length / 2;\n }\n \n items.push(drawCall);\n }\n \n return { items };\n }\n \n /**\n * Handle canvas resize\n */\n resize(): void {\n if (!this.backend) return;\n \n const rect = this.canvas.getBoundingClientRect();\n this.backend.setViewport({\n width: rect.width,\n height: rect.height,\n dpr: this.dpr,\n });\n }\n \n /**\n * Get renderer limits\n */\n getLimits(): Record<string, unknown> {\n return {\n backend: this.backendType,\n available: this.isInitialized,\n };\n }\n \n /**\n * Destroy the renderer\n */\n destroy(): void {\n this.adapter?.destroy();\n this.backend?.destroy();\n \n this.bufferDataMap.clear();\n this.stepBufferDataMap.clear();\n this.colormapDataMap.clear();\n \n this.adapter = null;\n this.backend = null;\n this.isInitialized = false;\n this.backendType = null;\n }\n}\n\n/**\n * Create a GPU renderer (async)\n */\nexport async function createGpuRenderer(\n canvas: HTMLCanvasElement,\n options?: GpuRendererOptions\n): Promise<GpuRenderer | null> {\n const renderer = new GpuRenderer(canvas, options);\n const success = await renderer.init();\n return success ? renderer : null;\n}\n","/**\n * GPU Benchmark Utilities\n * \n * Provides tools for measuring rendering performance across backends.\n */\n\nexport interface BenchmarkResult {\n backend: \"webgpu\" | \"webgl\" | \"unknown\";\n pointCount: number;\n fps: number;\n avgFrameTime: number; // ms\n minFrameTime: number; // ms\n maxFrameTime: number; // ms\n totalFrames: number;\n duration: number; // ms\n}\n\nexport interface BenchmarkOptions {\n /** Number of points to render */\n pointCount?: number;\n \n /** Duration of benchmark in milliseconds */\n durationMs?: number;\n \n /** Warm-up frames before measuring */\n warmupFrames?: number;\n \n /** Callback for progress updates */\n onProgress?: (progress: number) => void;\n}\n\n/**\n * Benchmark runner for GPU backends\n */\nexport class GpuBenchmark {\n private canvas: HTMLCanvasElement;\n private results: BenchmarkResult[] = [];\n \n constructor(canvas?: HTMLCanvasElement) {\n this.canvas = canvas ?? document.createElement(\"canvas\");\n if (!canvas) {\n this.canvas.width = 800;\n this.canvas.height = 600;\n }\n }\n \n /**\n * Generate random line data\n */\n private generateLineData(pointCount: number): Float32Array {\n const data = new Float32Array(pointCount * 2);\n for (let i = 0; i < pointCount; i++) {\n data[i * 2] = i / (pointCount - 1); // x: 0 to 1\n data[i * 2 + 1] = Math.random(); // y: random\n }\n return data;\n }\n \n /**\n * Measure frame times\n */\n private async measureFrameTimes(\n renderFn: () => void,\n durationMs: number,\n warmupFrames: number = 10,\n onProgress?: (progress: number) => void\n ): Promise<{ frameTimes: number[]; duration: number }> {\n const frameTimes: number[] = [];\n let lastTime = performance.now();\n let warmupCount = 0;\n const startTime = performance.now();\n \n return new Promise((resolve) => {\n const loop = () => {\n const now = performance.now();\n const elapsed = now - startTime;\n \n if (elapsed >= durationMs + (warmupFrames * 16)) {\n resolve({ frameTimes, duration: elapsed - (warmupFrames * 16) });\n return;\n }\n \n renderFn();\n \n if (warmupCount >= warmupFrames) {\n frameTimes.push(now - lastTime);\n \n if (onProgress) {\n const progress = Math.min(1, elapsed / durationMs);\n onProgress(progress);\n }\n } else {\n warmupCount++;\n }\n \n lastTime = now;\n requestAnimationFrame(loop);\n };\n \n requestAnimationFrame(loop);\n });\n }\n \n /**\n * Run benchmark with WebGPU backend\n */\n async benchmarkWebGPU(options: BenchmarkOptions = {}): Promise<BenchmarkResult | null> {\n // Dynamic import to handle environments without WebGPU\n const { WebGPUBackend } = await import(\"../backends/webgpu/WebGPUBackend\");\n \n if (!WebGPUBackend.isSupported()) {\n console.warn(\"[Benchmark] WebGPU not supported\");\n return null;\n }\n \n const pointCount = options.pointCount ?? 100000;\n const durationMs = options.durationMs ?? 5000;\n const warmupFrames = options.warmupFrames ?? 30;\n \n const backend = new WebGPUBackend(this.canvas);\n await backend.init();\n \n backend.setViewport({\n width: this.canvas.width,\n height: this.canvas.height,\n dpr: 1,\n });\n \n const data = this.generateLineData(pointCount);\n backend.createOrUpdateBuffer(\"bench-line\", data, { usage: \"vertex\" });\n \n const drawList = {\n items: [{\n id: \"bench-line\",\n kind: \"line\" as const,\n bufferId: \"bench-line\",\n count: pointCount,\n visible: true,\n style: { color: [0, 0.9, 1, 1] as const },\n }],\n };\n \n const frame = {\n viewport: { width: this.canvas.width, height: this.canvas.height, dpr: 1 },\n clearColor: [0.1, 0.1, 0.15, 1] as const,\n };\n \n const bounds = { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n \n const renderFn = () => {\n (backend as any).renderWithBounds(drawList, frame, bounds);\n };\n \n const { frameTimes, duration } = await this.measureFrameTimes(\n renderFn,\n durationMs,\n warmupFrames,\n options.onProgress\n );\n \n backend.destroy();\n \n const result = this.calculateResult(\"webgpu\", pointCount, frameTimes, duration);\n this.results.push(result);\n return result;\n }\n \n /**\n * Run benchmark with WebGL backend\n */\n async benchmarkWebGL(options: BenchmarkOptions = {}): Promise<BenchmarkResult | null> {\n const { WebGLBackend } = await import(\"../backends/webgl/WebGLBackend\");\n \n if (!WebGLBackend.isSupported()) {\n console.warn(\"[Benchmark] WebGL not supported\");\n return null;\n }\n \n const pointCount = options.pointCount ?? 100000;\n const durationMs = options.durationMs ?? 5000;\n const warmupFrames = options.warmupFrames ?? 30;\n \n const backend = new WebGLBackend(this.canvas);\n await backend.init();\n \n backend.setViewport({\n width: this.canvas.width,\n height: this.canvas.height,\n dpr: 1,\n });\n \n const data = this.generateLineData(pointCount);\n backend.createOrUpdateBuffer(\"bench-line\", data, { usage: \"vertex\" });\n \n const drawList = {\n items: [{\n id: \"bench-line\",\n kind: \"line\" as const,\n bufferId: \"bench-line\",\n count: pointCount,\n visible: true,\n style: { color: [0, 0.9, 1, 1] as const },\n }],\n };\n \n const frame = {\n viewport: { width: this.canvas.width, height: this.canvas.height, dpr: 1 },\n clearColor: [0.1, 0.1, 0.15, 1] as const,\n };\n \n const bounds = { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n \n const renderFn = () => {\n backend.renderWithBounds(drawList, frame, bounds);\n };\n \n const { frameTimes, duration } = await this.measureFrameTimes(\n renderFn,\n durationMs,\n warmupFrames,\n options.onProgress\n );\n \n backend.destroy();\n \n const result = this.calculateResult(\"webgl\", pointCount, frameTimes, duration);\n this.results.push(result);\n return result;\n }\n \n /**\n * Calculate benchmark result from frame times\n */\n private calculateResult(\n backend: \"webgpu\" | \"webgl\",\n pointCount: number,\n frameTimes: number[],\n duration: number\n ): BenchmarkResult {\n if (frameTimes.length === 0) {\n return {\n backend,\n pointCount,\n fps: 0,\n avgFrameTime: 0,\n minFrameTime: 0,\n maxFrameTime: 0,\n totalFrames: 0,\n duration,\n };\n }\n \n const sum = frameTimes.reduce((a, b) => a + b, 0);\n const avg = sum / frameTimes.length;\n const min = Math.min(...frameTimes);\n const max = Math.max(...frameTimes);\n \n return {\n backend,\n pointCount,\n fps: Math.round(1000 / avg),\n avgFrameTime: Math.round(avg * 100) / 100,\n minFrameTime: Math.round(min * 100) / 100,\n maxFrameTime: Math.round(max * 100) / 100,\n totalFrames: frameTimes.length,\n duration: Math.round(duration),\n };\n }\n \n /**\n * Run comparative benchmark\n */\n async runComparison(options: BenchmarkOptions = {}): Promise<{\n webgpu: BenchmarkResult | null;\n webgl: BenchmarkResult | null;\n winner: \"webgpu\" | \"webgl\" | \"tie\" | \"unknown\";\n speedup: number;\n }> {\n const webgpu = await this.benchmarkWebGPU(options);\n const webgl = await this.benchmarkWebGL(options);\n \n let winner: \"webgpu\" | \"webgl\" | \"tie\" | \"unknown\" = \"unknown\";\n let speedup = 1;\n \n if (webgpu && webgl) {\n if (webgpu.fps > webgl.fps * 1.05) {\n winner = \"webgpu\";\n speedup = webgpu.fps / webgl.fps;\n } else if (webgl.fps > webgpu.fps * 1.05) {\n winner = \"webgl\";\n speedup = webgl.fps / webgpu.fps;\n } else {\n winner = \"tie\";\n speedup = 1;\n }\n } else if (webgpu) {\n winner = \"webgpu\";\n } else if (webgl) {\n winner = \"webgl\";\n }\n \n return { webgpu, webgl, winner, speedup: Math.round(speedup * 100) / 100 };\n }\n \n /**\n * Get all results\n */\n getResults(): BenchmarkResult[] {\n return [...this.results];\n }\n \n /**\n * Clear results\n */\n clearResults(): void {\n this.results = [];\n }\n \n /**\n * Format result as string\n */\n static formatResult(result: BenchmarkResult): string {\n return [\n `Backend: ${result.backend.toUpperCase()}`,\n `Points: ${result.pointCount.toLocaleString()}`,\n `FPS: ${result.fps}`,\n `Avg Frame: ${result.avgFrameTime}ms`,\n `Min/Max: ${result.minFrameTime}ms / ${result.maxFrameTime}ms`,\n `Frames: ${result.totalFrames}`,\n `Duration: ${result.duration}ms`,\n ].join(\" | \");\n }\n}\n","/**\n * GPU Compute - Compute shader infrastructure for WebGPU\n * \n * Provides GPU-accelerated data analysis capabilities.\n */\n\n// ============================================\n// Statistics Compute Shader\n// ============================================\n\nexport const STATS_COMPUTE_WGSL = `\nstruct StatsResult {\n min_val: f32,\n max_val: f32,\n sum: f32,\n sum_sq: f32,\n count: u32,\n padding: vec3<u32>,\n}\n\n@group(0) @binding(0) var<storage, read> input_data: array<f32>;\n@group(0) @binding(1) var<storage, read_write> result: StatsResult;\n\nvar<workgroup> local_min: array<f32, 256>;\nvar<workgroup> local_max: array<f32, 256>;\nvar<workgroup> local_sum: array<f32, 256>;\nvar<workgroup> local_sum_sq: array<f32, 256>;\nvar<workgroup> local_count: array<u32, 256>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(global_invocation_id) global_id: vec3<u32>,\n @builtin(local_invocation_id) local_id: vec3<u32>,\n @builtin(workgroup_id) workgroup_id: vec3<u32>\n) {\n let idx = global_id.x;\n let lid = local_id.x;\n let data_len = arrayLength(&input_data);\n \n // Initialize local values\n if (idx < data_len) {\n let val = input_data[idx];\n local_min[lid] = val;\n local_max[lid] = val;\n local_sum[lid] = val;\n local_sum_sq[lid] = val * val;\n local_count[lid] = 1u;\n } else {\n local_min[lid] = 3.402823e+38; // f32 max\n local_max[lid] = -3.402823e+38; // f32 min\n local_sum[lid] = 0.0;\n local_sum_sq[lid] = 0.0;\n local_count[lid] = 0u;\n }\n \n workgroupBarrier();\n \n // Parallel reduction\n for (var stride: u32 = 128u; stride > 0u; stride = stride >> 1u) {\n if (lid < stride) {\n local_min[lid] = min(local_min[lid], local_min[lid + stride]);\n local_max[lid] = max(local_max[lid], local_max[lid + stride]);\n local_sum[lid] = local_sum[lid] + local_sum[lid + stride];\n local_sum_sq[lid] = local_sum_sq[lid] + local_sum_sq[lid + stride];\n local_count[lid] = local_count[lid] + local_count[lid + stride];\n }\n workgroupBarrier();\n }\n \n // First thread writes result (atomic for multi-workgroup)\n if (lid == 0u) {\n // Use atomics for multi-workgroup reduction\n // For now, we assume single workgroup or post-process on CPU\n result.min_val = local_min[0];\n result.max_val = local_max[0];\n result.sum = local_sum[0];\n result.sum_sq = local_sum_sq[0];\n result.count = local_count[0];\n }\n}\n`;\n\n// ============================================\n// Min/Max Compute Shader (for bounds calculation)\n// ============================================\n\nexport const MINMAX_COMPUTE_WGSL = `\nstruct MinMax {\n min_x: f32,\n max_x: f32,\n min_y: f32,\n max_y: f32,\n}\n\n@group(0) @binding(0) var<storage, read> points: array<vec2<f32>>;\n@group(0) @binding(1) var<storage, read_write> result: MinMax;\n\nvar<workgroup> local_min_x: array<f32, 256>;\nvar<workgroup> local_max_x: array<f32, 256>;\nvar<workgroup> local_min_y: array<f32, 256>;\nvar<workgroup> local_max_y: array<f32, 256>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(global_invocation_id) global_id: vec3<u32>,\n @builtin(local_invocation_id) local_id: vec3<u32>\n) {\n let idx = global_id.x;\n let lid = local_id.x;\n let data_len = arrayLength(&points);\n \n if (idx < data_len) {\n let pt = points[idx];\n local_min_x[lid] = pt.x;\n local_max_x[lid] = pt.x;\n local_min_y[lid] = pt.y;\n local_max_y[lid] = pt.y;\n } else {\n local_min_x[lid] = 3.402823e+38;\n local_max_x[lid] = -3.402823e+38;\n local_min_y[lid] = 3.402823e+38;\n local_max_y[lid] = -3.402823e+38;\n }\n \n workgroupBarrier();\n \n for (var stride: u32 = 128u; stride > 0u; stride = stride >> 1u) {\n if (lid < stride) {\n local_min_x[lid] = min(local_min_x[lid], local_min_x[lid + stride]);\n local_max_x[lid] = max(local_max_x[lid], local_max_x[lid + stride]);\n local_min_y[lid] = min(local_min_y[lid], local_min_y[lid + stride]);\n local_max_y[lid] = max(local_max_y[lid], local_max_y[lid + stride]);\n }\n workgroupBarrier();\n }\n \n if (lid == 0u) {\n result.min_x = local_min_x[0];\n result.max_x = local_max_x[0];\n result.min_y = local_min_y[0];\n result.max_y = local_max_y[0];\n }\n}\n`;\n\n// ============================================\n// Downsample Compute Shader (Min-Max per bucket)\n// ============================================\n\nexport const DOWNSAMPLE_COMPUTE_WGSL = `\nstruct Params {\n input_count: u32,\n output_count: u32,\n bucket_size: u32,\n padding: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> input_points: array<vec2<f32>>;\n@group(0) @binding(2) var<storage, read_write> output_points: array<vec2<f32>>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let bucket_idx = global_id.x;\n \n if (bucket_idx >= params.output_count / 2u) {\n return;\n }\n \n let start = bucket_idx * params.bucket_size;\n let end = min(start + params.bucket_size, params.input_count);\n \n if (start >= params.input_count) {\n return;\n }\n \n var min_y = input_points[start].y;\n var max_y = input_points[start].y;\n var min_idx = start;\n var max_idx = start;\n \n for (var i = start; i < end; i = i + 1u) {\n let y = input_points[i].y;\n if (y < min_y) {\n min_y = y;\n min_idx = i;\n }\n if (y > max_y) {\n max_y = y;\n max_idx = i;\n }\n }\n \n // Output min and max points (preserving x,y pairs)\n let out_base = bucket_idx * 2u;\n \n // Ensure min comes before max in x order\n if (min_idx <= max_idx) {\n output_points[out_base] = input_points[min_idx];\n output_points[out_base + 1u] = input_points[max_idx];\n } else {\n output_points[out_base] = input_points[max_idx];\n output_points[out_base + 1u] = input_points[min_idx];\n }\n}\n`;\n\n// ============================================\n// Peak Detection Compute Shader\n// ============================================\n\nexport const PEAK_DETECT_COMPUTE_WGSL = `\nstruct Params {\n data_count: u32,\n threshold: f32,\n min_distance: u32,\n padding: u32,\n}\n\nstruct Peak {\n index: u32,\n value: f32,\n is_peak: u32,\n padding: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read_write> peaks: array<Peak>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let idx = global_id.x;\n \n if (idx >= params.data_count) {\n return;\n }\n \n peaks[idx].index = idx;\n peaks[idx].value = data[idx];\n peaks[idx].is_peak = 0u;\n \n // Skip edges\n if (idx < params.min_distance || idx >= params.data_count - params.min_distance) {\n return;\n }\n \n let val = data[idx];\n \n // Check if above threshold\n if (val < params.threshold) {\n return;\n }\n \n // Check if local maximum\n var is_max = true;\n for (var i = 1u; i <= params.min_distance; i = i + 1u) {\n if (data[idx - i] >= val || data[idx + i] >= val) {\n is_max = false;\n break;\n }\n }\n \n if (is_max) {\n peaks[idx].is_peak = 1u;\n }\n}\n`;\n","/**\n * GPU Compute Engine\n * \n * Provides GPU-accelerated data analysis using WebGPU compute shaders.\n * Includes statistics calculation, bounds computation, downsampling, and peak detection.\n */\n\nimport {\n STATS_COMPUTE_WGSL,\n MINMAX_COMPUTE_WGSL,\n DOWNSAMPLE_COMPUTE_WGSL,\n PEAK_DETECT_COMPUTE_WGSL,\n} from \"./shaders\";\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n std: number;\n count: number;\n}\n\nexport interface DataBounds {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\nexport interface Peak {\n index: number;\n value: number;\n}\n\nexport interface GpuComputeOptions {\n /** WebGPU device (if already available) */\n device?: any;\n}\n\n/**\n * GPU Compute Engine for data analysis\n */\nexport class GpuCompute {\n private device: any = null;\n private statsPipeline: any = null;\n private minmaxPipeline: any = null;\n private downsamplePipeline: any = null;\n private peaksPipeline: any = null;\n \n private isInitialized = false;\n \n constructor(private options: GpuComputeOptions = {}) {}\n \n /**\n * Check if GPU compute is available\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 /**\n * Initialize the compute engine\n */\n async init(): Promise<void> {\n if (this.options.device) {\n this.device = this.options.device;\n } else {\n if (!GpuCompute.isSupported()) {\n throw new Error(\"[GpuCompute] WebGPU not supported\");\n }\n \n const gpu = (globalThis as any).navigator.gpu;\n const adapter = await gpu.requestAdapter({ powerPreference: \"high-performance\" });\n if (!adapter) {\n throw new Error(\"[GpuCompute] Failed to get adapter\");\n }\n \n this.device = await adapter.requestDevice();\n }\n \n // Create pipelines\n await this.createPipelines();\n this.isInitialized = true;\n }\n \n private async createPipelines(): Promise<void> {\n // Stats pipeline\n const statsModule = this.device.createShaderModule({ code: STATS_COMPUTE_WGSL });\n this.statsPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: statsModule, entryPoint: \"main\" },\n });\n \n // MinMax pipeline\n const minmaxModule = this.device.createShaderModule({ code: MINMAX_COMPUTE_WGSL });\n this.minmaxPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: minmaxModule, entryPoint: \"main\" },\n });\n \n // Downsample pipeline\n const downsampleModule = this.device.createShaderModule({ code: DOWNSAMPLE_COMPUTE_WGSL });\n this.downsamplePipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: downsampleModule, entryPoint: \"main\" },\n });\n \n // Peak detection pipeline\n const peaksModule = this.device.createShaderModule({ code: PEAK_DETECT_COMPUTE_WGSL });\n this.peaksPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: peaksModule, entryPoint: \"main\" },\n });\n }\n \n /**\n * Calculate statistics for a 1D array of values\n */\n async calculateStats(data: Float32Array): Promise<DataStats> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create input buffer\n const inputBuffer = this.device.createBuffer({\n size: data.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, data);\n \n // Create result buffer (32 bytes: 5 floats + padding)\n const resultBuffer = this.device.createBuffer({\n size: 32,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Create staging buffer for readback\n const stagingBuffer = this.device.createBuffer({\n size: 32,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Create bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.statsPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: inputBuffer } },\n { binding: 1, resource: { buffer: resultBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.statsPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(data.length / 256);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n // Copy result to staging\n encoder.copyBufferToBuffer(resultBuffer, 0, stagingBuffer, 0, 32);\n \n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultData = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n inputBuffer.destroy();\n resultBuffer.destroy();\n stagingBuffer.destroy();\n \n const [min, max, sum, sumSq, countFloat] = resultData;\n const count = Math.floor(countFloat);\n const mean = count > 0 ? sum / count : 0;\n const variance = count > 1 ? (sumSq - (sum * sum) / count) / (count - 1) : 0;\n const std = Math.sqrt(Math.max(0, variance));\n \n return { min, max, mean, std, count };\n }\n \n /**\n * Calculate bounds for 2D point data\n */\n async calculateBounds(points: Float32Array): Promise<DataBounds> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create input buffer (vec2 array)\n const inputBuffer = this.device.createBuffer({\n size: points.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, points);\n \n // Create result buffer (16 bytes: 4 floats)\n const resultBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.minmaxPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: inputBuffer } },\n { binding: 1, resource: { buffer: resultBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.minmaxPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const pointCount = points.length / 2;\n const workgroups = Math.ceil(pointCount / 256);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(resultBuffer, 0, stagingBuffer, 0, 16);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultData = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n inputBuffer.destroy();\n resultBuffer.destroy();\n stagingBuffer.destroy();\n \n return {\n xMin: resultData[0],\n xMax: resultData[1],\n yMin: resultData[2],\n yMax: resultData[3],\n };\n }\n \n /**\n * Downsample point data using min-max algorithm\n */\n async downsample(\n points: Float32Array,\n targetCount: number\n ): Promise<Float32Array> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const pointCount = points.length / 2;\n if (pointCount <= targetCount) {\n return points; // No downsampling needed\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Calculate bucket size (output is 2 points per bucket: min and max)\n const outputPairs = Math.ceil(targetCount / 2);\n const bucketSize = Math.ceil(pointCount / outputPairs);\n const outputCount = outputPairs * 2;\n \n // Create params buffer\n const paramsData = new Uint32Array([pointCount, outputCount, bucketSize, 0]);\n const paramsBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(paramsBuffer, 0, paramsData);\n \n // Create input buffer\n const inputBuffer = this.device.createBuffer({\n size: points.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, points);\n \n // Create output buffer\n const outputSize = outputCount * 2 * 4; // vec2 * count * sizeof(float)\n const outputBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.downsamplePipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.downsamplePipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(outputPairs / 64);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, outputSize);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const result = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n paramsBuffer.destroy();\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n \n return result;\n }\n \n /**\n * Detect peaks in 1D data\n */\n async detectPeaks(\n data: Float32Array,\n options: { threshold?: number; minDistance?: number } = {}\n ): Promise<Peak[]> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const threshold = options.threshold ?? 0;\n const minDistance = options.minDistance ?? 1;\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create params buffer\n const paramsData = new Float32Array([\n data.length,\n threshold,\n minDistance,\n 0, // padding\n ]);\n const paramsBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(paramsBuffer, 0, new Uint8Array(paramsData.buffer));\n \n // Input buffer\n const inputBuffer = this.device.createBuffer({\n size: data.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, data);\n \n // Output buffer (Peak struct = 16 bytes each)\n const outputSize = data.length * 16;\n const outputBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.peaksPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.peaksPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(data.length / 64);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, outputSize);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultBuffer = new ArrayBuffer(outputSize);\n new Uint8Array(resultBuffer).set(new Uint8Array(stagingBuffer.getMappedRange()));\n stagingBuffer.unmap();\n \n // Parse peaks\n const resultView = new DataView(resultBuffer);\n const peaks: Peak[] = [];\n \n for (let i = 0; i < data.length; i++) {\n const offset = i * 16;\n const isPeak = resultView.getUint32(offset + 8, true);\n \n if (isPeak) {\n peaks.push({\n index: resultView.getUint32(offset, true),\n value: resultView.getFloat32(offset + 4, true),\n });\n }\n }\n \n // Cleanup\n paramsBuffer.destroy();\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n \n return peaks;\n }\n \n /**\n * Cleanup resources\n */\n destroy(): void {\n // Pipelines are managed by device, no explicit cleanup needed\n this.device = null;\n this.statsPipeline = null;\n this.minmaxPipeline = null;\n this.downsamplePipeline = null;\n this.peaksPipeline = null;\n this.isInitialized = false;\n }\n}\n"],"names":["MARGINS","SI_PREFIXES","getBestPrefix","value","absValue","i","prefix","scaled","formatWithPrefix","unit","decimals","formatValue","formatScientific","detectCycles","signal","tolerance","data","cycles","cycleStart","cycleNumber","prevDirection","directionChanges","direction","startValue","currentValue","generateCycleColors","count","colors","hueStep","hue","detectPeaks","x","y","options","minProminence","type","peaks","xData","yData","prev","curr","next","prominence","validateData","invalidCount","firstInvalidIndex","arr","calculateStats","min","max","sum","val","mean","sumSquaredDiff","diff","stdDev","movingAverage","windowSize","result","halfWindow","j","downsampleLTTB","targetPoints","dataLength","sampledX","sampledY","bucketSize","sampledIndex","bucketStart","bucketEnd","nextBucketEnd","avgX","avgY","avgCount","maxArea","maxAreaIndex","area","subtractBaseline","x1","x2","i1","i2","minDist1","minDist2","d1","d2","y1","slope","intercept","solveLinearSystem","A","B","n","matrix","row","maxRow","k","temp","pivot","factor","calculateR2","fitFn","sumY","meanY","ssTot","ssRes","yi","fi","integrate","xMin","xMax","start","end","ia","ib","y2","derivative","dx","cumulativeIntegral","fitData","fitLinear","fitPolynomial","fitExponential","fitLogarithmic","fitPower","opts","sumX","sumXY","sumX2","predict","v","prec","degree","m","coeffs","res","equation","c","xPrime","yPrime","b","a","generateContours","z","xValues","yValues","width","height","minZ","maxZ","levels","calculateLevels","level","segments","v0","v1","v2","v3","processCell","points","seg","step","xScale","yScale","caseIndex","lerp","t","getT","getPoint","edge","addSeg","e1","e2","p1","p2","EventEmitter","__publicField","event","handler","handlers","error","wrappedHandler","_a","BufferStore","gl","id","buffer","currentSize","offsetInBytes","LINE_VERT","LINE_FRAG","POINT_VERT","POINT_FRAG","HEATMAP_VERT","HEATMAP_FRAG","createShader","source","shader","createProgram","vertSource","fragSource","mode","vertShader","fragShader","program","createProgramBundle","parseColor","color","hex","r","g","matches","interleaveData","length","interleaveStepData","stepCount","resultIdx","prevX","prevY","currX","currY","midX","interleaveBandData","idx","xi","calculateUniforms","bounds","dataWidth","dataHeight","scaleX","scaleY","translateX","translateY","renderLine","prog","uniforms","renderBand","alpha","renderPoints","pointSize","symbol","symbolMap","renderHeatmap","zBounds","texture","renderBar","computeSeriesColor","style","renderFrame","canvas","dpr","programs","series","backgroundColor","plotArea","canvasHeight","canvasWidth","pa","s","yMin","yRange","yTrans","seriesUniforms","TextureStore","NativeWebGLRenderer","rect","DEFAULT_AXIS_THEME","DEFAULT_GRID_THEME","DEFAULT_LEGEND_THEME","DEFAULT_CURSOR_THEME","DARK_THEME","MIDNIGHT_THEME","LIGHT_THEME","ELECTROCHEM_THEME","createTheme","base","overrides","getThemeByName","name","DEFAULT_THEME","OverlayRenderer","ctx","theme","grid","xTicks","yTicks","tick","minorXTicks","minorYTicks","axis","axisY","label","position","offset","axisX","tickDir","labelX","titleX","titleY","legend","maxWidth","items","boxWidth","boxHeight","item","itemY","swatchX","centerY","centerX","size","typeStr","hasSymbol","isScatter","isLineScatter","d","cursor","cursorTheme","text","lines","lineHeight","padding","line","tooltipX","tooltipY","isDark","errorStyle","lineWidth","capWidth","showCaps","opacity","yError","errorMinus","errorPlus","yBase","yTop","yBottom","xError","xBase","xRight","xLeft","majorTicks","divisions","minor","absVal","precision","str","mantissa","exponent","superscriptMap","unicodeExp","char","InteractionManager","container","callbacks","getPlotArea","getBounds","getAxesLayout","enabled","mouseX","mouseY","axes","zoomX","zoomY","targetAxisId","hitWidth","hitX","zoomFactor","normalizedX","normalizedY","dataX","dataY","MIN_RANGE","MAX_RANGE","nextXMin","nextXMax","nextYMin","nextYMax","nextXRange","nextYRange","newBounds","deltaX","deltaY","touch","ChartStatistics","parent","title","bg","borderColor","shadow","viewBounds","visibleY","visibleX","stats","DEFAULT_STYLES","AnnotationManager","annotation","resolved","updates","existing","sorted","normalized","xStart","xEnd","yStart","yEnd","labelY","fontSize","fontFamily","fontWeight","metrics","textWidth","textHeight","drawX","drawY","headSize","angle","headStyle","tailAngle","midY","cross","orientation","bgX","DEFAULT_PADDING","TOOLTIP_DARK_THEME","TOOLTIP_LIGHT_THEME","TOOLTIP_GLASS_THEME","TOOLTIP_MIDNIGHT_THEME","TOOLTIP_ELECTROCHEM_THEME","TOOLTIP_THEMES","getTooltipTheme","createTooltipTheme","baseTheme","getTooltipThemeForChartTheme","chartThemeName","DEFAULT_TOOLTIP_THEME","DEFAULT_POSITIONER_CONFIG","TooltipPositioner","config","targetX","targetY","measurement","preferredPosition","autoFlip","showArrow","arrowSize","totalWidth","totalHeight","arrowPosition","wasFlipped","flippedPosition","flipped","constrained","arrowOffset","idealArrowX","idealArrowY","preferred","spaceTop","spaceBottom","spaceLeft","spaceRight","canFitTop","canFitBottom","canFitRight","canFitLeft","margin","constrainedX","constrainedY","cursorX","cursorY","TooltipRenderer","template","_arrowPosition","gradient","topX","bottomX","bottomY","leftY","rightX","rightY","radius","align","baseline","DefaultTooltipTemplate","cacheKey","titleWidth","labelWidth","xValWidth","yValWidth","contentWidth","contentHeight","errorText","cycleText","indicatorWidth","currentX","currentY","indicatorY","separatorWidth","defaultTooltipTemplate","formatCompact","MinimalTooltipTemplate","xValue","yValue","xWidth","sepWidth","minimalTooltipTemplate","CrosshairTooltipTemplate","headerText","labelColumnWidth","nameWidth","valWidth","headerHeight","contentX","itemX","labelOffset","crosshairTooltipTemplate","HeatmapTooltipTemplate","valueText","valueWidth","scaleText","xyLabelWidth","dataXWidth","dataYWidth","swatchY","heatmapTooltipTemplate","toScientificUnicode","exp","superscripts","expStr","superExp","ScientificTooltipTemplate","xVal","yVal","yWidth","footerText","lineCount","extraGap","yText","scientificTooltipTemplate","AnnotationTooltipTemplate","valText","xText","labelW","annotationTooltipTemplate","RangeTooltipTemplate","rangeTooltipTemplate","BUILTIN_TEMPLATES","getBuiltinTemplate","getDefaultTemplateForType","TooltipManager","chartTheme","pixelX","pixelY","total","newResult","currentPoint","currentDx","currentDy","currentDistSq","newDx","newDy","heatmapResult","_b","crosshairData","yScales","cursorDataX","bestResult","bestXDistance","xDistance","px","py","hitRadius","nearestDistanceSq","nearestResult","closestIdx","searchRadius","checkStart","checkEnd","dy","distSq","_c","colIdx","rowIdx","zValue","target","left","right","mid","interpolatedValues","isInterpolated","x0","y0","dp","effectiveDelay","templateId","tooltipId","tooltip","tooltipData","exportToCSV","seriesIds","includeHeaders","delimiter","seriesToExport","headers","maxLength","exportToJSON","exportToImage","webglCanvas","overlayCanvas","showLegend","finalCanvas","applyZoom","hasBars","finalY","scale","oldRange","newRange","offsetPct","sRange","sNewMin","sNewMax","applyPan","axisId","range","moveY","nextMin","nextMax","autoScaleAll","yAxisBounds","_","hasValidData","yBounds","MAX_VAL","MIN_VAL","xRange","xPad","yPad","newMin","newMax","handleBoxZoom","selectionRect","currentRect","zoom","xMinNorm","xMaxNorm","yMaxNorm","yMinNorm","newXMin","newXMax","newYMin","newYMax","prepareSeriesData","seriesData","buf","seriesType","renderType","renderData","stepBuf","stepMode","pointCount","hData","hStyle","w","h","zMin","zMax","colormapId","bullishBuf","bearishBuf","renderOverlay","primaryYScale","leftAxes","rightAxes","index","skipLegacyTooltip","calculateSeriesBounds","heatmapData","yMax","high","low","ensureTypedArray","appendTypedArray","newData","combined","applySmoothing","len","smoothedY","getYError","err","minus","plus","getXError","DEFAULT_STYLE","Series","hOpts","update","newX","newY","shift","oldSmooth","visible","maxPoints","createRenderer","WebGPURenderer","gpu","format","interleaveBarData","barWidth","halfWidth","calculateBarWidth","minSpacing","spacing","interleaveHeatmapData","numCells","v00","v10","v01","v11","getColormap","interleaveCandlestickData","open","close","bullishBody","bearishBody","halfWick","bodyTop","bodyBottom","appendRect","updateSeriesBuffer","stackId","refreshStack","seriesId","updateHeatmapBuffer","bullish","bearish","colormapName","stackSeries","cumulativeY","yBaseline","addSeries","o","removeSeries","updateSeries","appendData","oldMaxX","setMaxPoints","addFitLine","fitResolution","fitX","fitY","fitId","sourceStyle","LinearScale","d0","r0","r1","pixel","niceStep","ticks","maxTicks","LogScale","safeMin","safeMax","logMin","logMax","logVal","p","rawStep","magnitude","niceNormalized","createScale","initializeChart","bgColor","showControls","autoScroll","showStatistics","xAxisOptions","yAxisOptionsMap","primaryYAxisId","axisOpt","isFirst","defaultId","fullOptions","createCanvas","leftAxisCount","rightAxisCount","leftMargin","rightMargin","leftIndex","rightIndex","resizeCanvases","overlayCtx","pixelToDataX","pixelToDataY","PluginManagerImpl","chart","plugin","hook","args","e","ICONS","ChartControls","sep","types","nextIdx","sep2","sep3","btn","icon","svgEl","svg","onClick","buttons","activeColor","smoothActiveColor","legendActiveColor","normalColor","isHover","ChartLegend","rafId","onMouseDown","onMouseMove","onMouseUp","updatePosition","clientX","clientY","tx","ty","parentRect","finalX","swatch","isArea","bullColor","itemGap","swatchSize","initControls","currentType","mappedType","active","link","initLegend","ChartImpl","analysis","setup","setupChart","isSupported","createControls","createLegend","calculatePlotArea","addSeriesImpl","removeSeriesImpl","updateSeriesImpl","appendDataImpl","setMaxPointsImpl","addFitLineImpl","isFinishing","full","pxToDataX","pxToDataY","loop","createChart","lttbDownsample","outX","outY","outIndices","outIdx","nextBucketStart","maxIndex","aX","aY","minMaxDownsample","bucketCount","minY","maxY","minIdx","maxIdx","calculateTargetPoints","pointsPerPixel","defaultParser","point","createMessageParser","transform","connectStreamToChart","stream","unsubscribers","unsubscribe","createWebSocketStream","url","maxReconnectAttempts","reconnectDelay","bufferSize","throttleMs","parseMessage","onConnect","onDisconnect","onError","onReconnect","ws","state","reconnectAttempts","reconnectTimeout","connectionStartTime","buffers","subscribers","lastFlushTime","flushScheduled","connect","handleMessage","scheduleReconnect","disconnect","parsed","pointArray","scheduleFlush","timeSinceLastFlush","flush","callback","message","createMockStream","interval","generatePoint","defaultGenerator","intervalId","connected","startTime","stop","mockX","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","maybeKey","key","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","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","keys","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","useSciChart","containerRef","setChart","useState","isReady","setIsReady","setError","setBounds","optionsRef","useRef","useEffect","chartInstance","useCallback","seriesOptions","zoomOptions","resetZoom","SciChart","forwardRef","zoomProp","onZoomChange","className","debug","chartOptions","ref","previousSeriesRef","useImperativeHandle","currentSeriesMap","previousSeriesMap","prevSeries","containerStyle","useMemo","jsx","jsxs","BaseBufferStore","BaseTextureStore","keyToString","PipelineCache","factory","keyStr","pipeline","parseColorToRGBA","colorStr","rgbaMatch","mapSeriesTypeToDrawKind","convertStyle","baseColor","SeriesAdapter","backend","bufferId","stepBufferId","textureId","seriesArray","drawCall","TRIANGLE_SHADER_WGSL","createTrianglePipeline","device","module","vertexStride","LINE_SHADER_WGSL","LINE_VERTEX_STRIDE","UNIFORM_BUFFER_SIZE","createLinePipeline","GPUShaderStageAny","GPUBufferUsageAny","bindGroupLayout","uniformBuffer","bindGroup","pipelineLayout","updateLineUniforms","POINT_QUAD_SHADER_WGSL","POINT_VERTEX_STRIDE","QUAD_VERTICES","createPointPipeline","quadBuffer","updatePointUniforms","SYMBOL_MAP","createBandPipeline","updateBandUniforms","HEATMAP_SHADER_WGSL","HEATMAP_VERTEX_STRIDE","createHeatmapPipeline","sampler","createHeatmapBindGroup","layout","colormapTexture","updateHeatmapUniforms","getColorFromStyle","WebGPUBackend","viewport","desc","usage","usageFlags","byteLength","GPUTextureUsageAny","tex","drawList","frame","encoder","view","pass","defaultBounds","itemBounds","bandColor","LINE_VERT_GLSL","LINE_FRAG_GLSL","POINT_VERT_GLSL","POINT_FRAG_GLSL","HEATMAP_VERT_GLSL","HEATMAP_FRAG_GLSL","compileShader","info","linkProgram","attributeNames","uniformNames","attributes","createAllPrograms","heatmap","destroyPrograms","bundle","WebGLBackend","stepBuffer","GpuRenderer","preference","offsetFloats","bufferData","colormapData","stepData","createGpuRenderer","renderer","GpuBenchmark","renderFn","durationMs","warmupFrames","onProgress","frameTimes","lastTime","warmupCount","resolve","now","elapsed","progress","WebGPUBackend$1","duration","WebGLBackend$1","avg","webgpu","webgl","winner","speedup","STATS_COMPUTE_WGSL","MINMAX_COMPUTE_WGSL","DOWNSAMPLE_COMPUTE_WGSL","PEAK_DETECT_COMPUTE_WGSL","GpuCompute","adapter","statsModule","minmaxModule","downsampleModule","peaksModule","GPUBufferUsage","inputBuffer","resultBuffer","stagingBuffer","workgroups","resultData","sumSq","countFloat","variance","std","targetCount","outputPairs","outputCount","paramsData","paramsBuffer","outputSize","outputBuffer","threshold","minDistance","resultView"],"mappings":"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","x_google_ignoreList":[57,58,59]}
|