scichart-engine 1.6.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.core-Crr0-eUV.js.map +1 -1
- package/dist/plugins/context-menu/index.d.ts +12 -0
- package/dist/plugins/context-menu/renderer.d.ts +43 -0
- package/dist/plugins/context-menu/types.d.ts +202 -0
- package/dist/plugins/context-menu.d.ts +3 -0
- package/dist/plugins/context-menu.js +621 -0
- package/dist/plugins/context-menu.js.map +1 -0
- package/dist/plugins/data-export/formatters.d.ts +34 -0
- package/dist/plugins/data-export/index.d.ts +15 -0
- package/dist/plugins/data-export/types.d.ts +166 -0
- package/dist/plugins/data-export.d.ts +3 -0
- package/dist/plugins/data-export.js +463 -0
- package/dist/plugins/data-export.js.map +1 -0
- package/dist/plugins/index.d.ts +2 -0
- package/package.json +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.core-Crr0-eUV.js","sources":["../src/core/chart/types.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/scales/index.ts","../src/theme/index.ts","../src/core/OverlayRenderer.ts","../src/core/InteractionManager.ts","../src/core/selection/SelectionManager.ts","../src/core/responsive/ResponsiveManager.ts","../src/serialization/index.ts","../src/core/chart/ChartExporter.ts","../src/core/chart/ChartNavigation.ts","../src/core/chart/ChartScaling.ts","../src/core/animation/AnimationEngine.ts","../src/core/chart/ChartAnimatedNavigation.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/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/ChartSetup.ts","../src/plugins/PluginContext.ts","../src/plugins/PluginManager.ts","../src/plugins/PluginRegistry.ts","../src/plugins/index.ts","../src/core/ChartControls.ts","../src/core/ChartLegend.ts","../src/core/chart/ChartUI.ts","../src/core/ChartInitQueue.ts","../src/core/chart/ChartCore.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 AxisOptions,\n} from \"../../types\";\nimport type { Series } from \"../Series\";\nimport type { Annotation } from \"../annotations\";\nimport type { ChartAnimationConfig } from \"../animation\";\n\n// Analysis types moved to plugin\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: any, options?: any): string;\n zoom(options: ZoomOptions & { animate?: boolean }): 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(animate?: boolean): void;\n setTheme(theme: string | object): void;\n /** Access to data analysis utilities */\n /** Access to the current active theme (scaled for responsiveness) */\n readonly theme: any;\n /** Access to the base theme (unscaled) */\n readonly baseTheme: any;\n readonly analysis: any;\n readonly animations: any;\n\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\n // Export methods\n exportCSV(options?: ExportOptions): string;\n exportJSON(options?: ExportOptions): string;\n\n /** Attach a plugin to extend chart functionality */\n use(plugin: ChartPlugin): void;\n\n /** Access to the tooltip system if the plugin is loaded */\n readonly tooltip?: any;\n\n // ============================================\n // Animation API\n // ============================================\n\n /** Animate view bounds to specific target */\n animateTo(options: {\n xRange?: [number, number];\n yRange?: [number, number];\n duration?: number;\n easing?: string;\n }): void;\n /** Get current animation configuration */\n getAnimationConfig(): ChartAnimationConfig;\n /** Update animation configuration */\n setAnimationConfig(config: Partial<ChartAnimationConfig>): void;\n /** Check if any animations are currently running */\n isAnimating(): boolean;\n\n // ============================================\n // Axis Management API\n // ============================================\n\n /** Add a new Y axis dynamically */\n addYAxis(options: AxisOptions): string;\n /** Remove a Y axis by ID */\n removeYAxis(id: string): boolean;\n /** Update Y axis configuration */\n updateYAxis(id: string, options: Partial<AxisOptions>): void;\n /** Get Y axis configuration by ID */\n getYAxis(id: string): AxisOptions | undefined;\n /** Get all Y axes configurations */\n getAllYAxes(): AxisOptions[];\n /** Get the primary Y axis ID */\n getPrimaryYAxisId(): string;\n\n // ============================================\n // Selection API\n // ============================================\n\n /** Select data points programmatically */\n selectPoints(\n points: Array<{ seriesId: string; indices: number[] }>,\n mode?: any\n ): void;\n /** Get all currently selected points */\n getSelectedPoints(): any[];\n /** Clear all selections */\n clearSelection(): void;\n /** Hit-test at a pixel coordinate */\n hitTest(\n pixelX: number,\n pixelY: number\n ): any | null;\n /** Check if a specific point is selected */\n isPointSelected(seriesId: string, index: number): boolean;\n /** Get selection count */\n getSelectionCount(): number;\n /** Configure selection behavior */\n configureSelection(\n config: any\n ): void;\n\n // ============================================\n // Interaction Mode\n // ============================================\n\n /** \n * Set pan mode (true = pan, false = selection) \n * @deprecated Use setMode('pan') or setMode('select') instead\n */\n setPanMode(enabled: boolean): void;\n\n /**\n * Set the interaction mode\n * @param mode - 'pan' for pan/drag, 'boxZoom' for rectangle zoom, 'select' for point selection\n */\n setMode(mode: 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak'): void;\n\n /**\n * Get the current interaction mode\n */\n getMode(): 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak';\n\n /**\n * Get the Delta Tool instance for advanced measurements\n */\n getDeltaTool(): any | null;\n\n /**\n * Get the Peak Tool instance for peak integration\n */\n getPeakTool(): any | null;\n\n // ============================================\n // Responsive Design\n // ============================================\n\n /** Get current responsive state */\n getResponsiveState(): import(\"../responsive\").ResponsiveState;\n /** Configure responsive behavior */\n configureResponsive(\n config: Partial<import(\"../responsive\").ResponsiveConfig>\n ): void;\n /** Check if responsive mode is enabled */\n isResponsiveEnabled(): boolean;\n\n // ============================================\n // Serialization & Persistence\n // ============================================\n\n /** Export complete chart state */\n serialize(\n options?: import(\"../../serialization\").SerializeOptions\n ): import(\"../../serialization\").ChartState;\n /** Restore chart from saved state */\n deserialize(\n state: import(\"../../serialization\").ChartState,\n options?: import(\"../../serialization\").DeserializeOptions\n ): void;\n /** Convert current state to URL-safe hash */\n toUrlHash(compress?: boolean): string;\n /** Load state from URL hash */\n fromUrlHash(hash: string, compressed?: boolean): void;\n\n /** Use a plugin */\n use(plugin: ChartPlugin): void;\n /** Destroy the chart and cleanup resources */\n destroy(): void;\n}\n\nimport { ChartPlugin } from \"../../plugins/types\";\n\nexport type { ChartPlugin };\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","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 brightenColor(color: string, isDarkTheme: boolean = true): string {\n const [r, g, b, a] = parseColor(color);\n const [h, s, l] = rgbToHsl(r, g, b);\n \n /**\n * Smart Contrast Algorithm:\n * 1. Shift Hue (H): Rotate by 43° (0.12) to make it distinct.\n * 2. Boost Saturation (S): Force high vibrance (+0.4) so it looks \"active\".\n * 3. Intelligent Luminance (L):\n * - On DARK backgrounds: If original is dark, jump to bright (0.8). If light, keep it light.\n * - On LIGHT backgrounds: If original is light, jump to deep (0.25). If dark, keep it dark/intense.\n */\n const newH = (h + 0.12) % 1.0;\n const newS = Math.min(1.0, s + 0.4);\n \n let newL;\n if (isDarkTheme) {\n // Dark mode -> High brightness\n newL = l < 0.4 ? 0.8 : Math.min(0.95, l + 0.2);\n } else {\n // Light mode -> High depth\n newL = l > 0.6 ? 0.25 : Math.max(0.1, l - 0.2);\n }\n\n // Ensure reasonable limits\n newL = Math.max(0.15, Math.min(0.9, newL));\n\n const [nr, ng, nb] = hslToRgb(newH, newS, newL);\n \n const ri = Math.round(nr * 255);\n const gi = Math.round(ng * 255);\n const bi = Math.round(nb * 255);\n \n return a < 1 \n ? `rgba(${ri}, ${gi}, ${bi}, ${a})` \n : `rgb(${ri}, ${gi}, ${bi})`;\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0, s = 0, l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return [h, s, l];\n}\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n let r, g, b;\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1/6) return p + (q - p) * 6 * t;\n if (t < 1/2) return q;\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n return [r, g, b];\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 width: number = 1\n): void {\n gl.useProgram(prog.program);\n gl.lineWidth(width);\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 if (options.plotAreaBackground) {\n gl.clearColor(\n options.plotAreaBackground[0],\n options.plotAreaBackground[1],\n options.plotAreaBackground[2],\n options.plotAreaBackground[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\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 (s.style.width ?? 1) * dpr\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 (s.style.width ?? 1) * dpr\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 (s.style.width ?? 1) * dpr\n );\n } else {\n renderLine(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.width ?? 1) * dpr\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 getGL(): WebGLRenderingContext {\n return this.gl;\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 * 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 * 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 ToolbarTheme {\n /** Toolbar background color */\n backgroundColor: string;\n /** Border color */\n borderColor: string;\n /** Border radius */\n borderRadius: number;\n}\n\nexport interface ChartTheme {\n /** Theme name */\n name: string;\n /** Whether the theme is dark */\n isDark: boolean;\n /** Background color */\n backgroundColor: string;\n /** Plot area background color */\n plotAreaBackground: 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 /** Toolbar theme */\n toolbar: ToolbarTheme;\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(15, 23, 42, 0.2)\",\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_TOOLBAR_THEME: ToolbarTheme = {\n backgroundColor: \"rgba(15, 23, 42, 0.2)\",\n borderColor: \"rgba(255, 255, 255, 0.08)\",\n borderRadius: 8,\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 isDark: true,\n backgroundColor: \"#0b0e14\",\n plotAreaBackground: \"#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 toolbar: DEFAULT_TOOLBAR_THEME,\n};\n\nexport const MIDNIGHT_THEME: ChartTheme = {\n name: \"midnight\",\n isDark: true,\n backgroundColor: \"#05050a\",\n plotAreaBackground: \"#070715\",\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(5, 5, 15, 0.2)\",\n borderColor: \"rgba(100, 100, 255, 0.4)\",\n },\n toolbar: {\n ...DEFAULT_TOOLBAR_THEME,\n backgroundColor: \"rgba(5, 5, 15, 0.2)\",\n borderColor: \"rgba(100, 100, 255, 0.2)\",\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 isDark: false,\n backgroundColor: \"#ffffff\",\n plotAreaBackground: \"#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.2)\",\n borderColor: \"rgba(0, 0, 0, 0.15)\",\n textColor: \"#222222\",\n },\n toolbar: {\n backgroundColor: \"rgba(255, 255, 255, 0.2)\",\n borderColor: \"rgba(0, 0, 0, 0.05)\",\n borderRadius: 8,\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 isDark: true,\n backgroundColor: \"#0a1628\",\n plotAreaBackground: \"#0d1b2e\",\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.2)\",\n borderColor: \"rgba(30, 136, 229, 0.3)\",\n },\n toolbar: {\n ...DEFAULT_TOOLBAR_THEME,\n backgroundColor: \"rgba(10, 22, 40, 0.2)\",\n borderColor: \"rgba(30, 136, 229, 0.15)\",\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 toolbar: { ...base.toolbar, ...overrides.toolbar },\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 onPointClick?: (\n pixelX: number,\n pixelY: number,\n ctrlKey: boolean,\n shiftKey: boolean\n ) => void;\n onBoxSelect?: (\n rect: { x: number; y: number; width: number; height: number } | null,\n additive: boolean\n ) => void;\n onBoxSelectUpdate?: (pixelX: number, pixelY: number) => void;\n onBoxSelectStart?: (pixelX: number, pixelY: number) => void;\n /** Called when any drag operation starts (pan, box zoom, box select) */\n onDragStart?: () => void;\n /** Called when any drag operation ends */\n onDragEnd?: () => void;\n /** Called for all raw interaction events for plugin processing */\n onInteraction?: (event: import(\"../plugins/types\").InteractionEvent) => 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 type InteractionMode = 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak';\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 isBoxZooming = false;\n private selectionStart = { x: 0, y: 0 };\n private lastMousePos = { x: 0, y: 0 };\n private mode: InteractionMode = 'pan';\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 /**\n * Set the interaction mode\n * @deprecated Use setMode instead\n */\n public setPanMode(enabled: boolean): void {\n this.mode = enabled ? 'pan' : 'select';\n }\n\n /**\n * Set the interaction mode: 'pan', 'boxZoom', or 'select'\n */\n public setMode(mode: InteractionMode): void {\n this.mode = mode;\n }\n\n /**\n * Get the current interaction mode\n */\n public getMode(): InteractionMode {\n return this.mode;\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 hitWidth = 65; // Matches axis spacing\n let hitX: number;\n\n if (axis.position === \"left\") {\n // Left axes: start from (plotArea.x - hitWidth) and go further left with offset\n hitX = plotArea.x - hitWidth - axis.offset;\n } else {\n // Right axes: start from plotArea.x + plotArea.width and go further right with offset\n hitX = plotArea.x + plotArea.width + axis.offset;\n }\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 this.callbacks.onInteraction?.({\n type: \"mousedown\",\n pixelX: mouseX,\n pixelY: mouseY,\n inPlotArea: mouseX >= plotArea.x && mouseX <= plotArea.x + plotArea.width && mouseY >= plotArea.y && mouseY <= plotArea.y + plotArea.height,\n originalEvent: e,\n preventDefault: () => e.preventDefault(),\n defaultPrevented: e.defaultPrevented,\n });\n\n // Check if mouse is in axis area for dragging\n const axes = this.getAxesLayout();\n for (const axis of axes) {\n const hitWidth = 65;\n let hitX: number;\n\n if (axis.position === \"left\") {\n hitX = plotArea.x - hitWidth - axis.offset;\n } else {\n hitX = plotArea.x + plotArea.width + axis.offset;\n }\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 this.callbacks.onDragStart?.();\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 switch (this.mode) {\n case 'pan':\n this.isDragging = true;\n this.panningAxisId = undefined;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"grabbing\";\n this.callbacks.onDragStart?.();\n break;\n case 'boxZoom':\n this.isBoxZooming = true;\n this.selectionStart = { x: mouseX, y: mouseY };\n this.container.style.cursor = \"crosshair\";\n // Start box zoom visual (use same callback as onBoxZoom for consistency)\n this.callbacks.onBoxZoom({ x: mouseX, y: mouseY, width: 0, height: 0 });\n this.callbacks.onDragStart?.();\n break;\n case 'select':\n this.isBoxSelecting = true;\n this.selectionStart = { x: mouseX, y: mouseY };\n this.container.style.cursor = \"crosshair\";\n if (this.callbacks.onBoxSelectStart) {\n this.callbacks.onBoxSelectStart(mouseX, mouseY);\n }\n this.callbacks.onDragStart?.();\n break;\n case 'delta':\n case 'peak':\n // Delta and Peak modes are handled by their respective tools\n // Do nothing here - let the tools handle the events\n this.container.style.cursor = \"crosshair\";\n break;\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 this.callbacks.onInteraction?.({\n type: \"mousemove\",\n pixelX: mouseX,\n pixelY: mouseY,\n inPlotArea: true, // simplified for now\n originalEvent: e,\n preventDefault: () => e.preventDefault(),\n defaultPrevented: e.defaultPrevented,\n });\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.isBoxZooming) {\n // In box zoom mode, update the zoom box\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 } else if (this.isBoxSelecting) {\n // In selection mode, update the selection box\n if (this.callbacks.onBoxSelectUpdate) {\n this.callbacks.onBoxSelectUpdate(mouseX, mouseY);\n }\n }\n }\n\n private handleMouseUp(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 this.callbacks.onInteraction?.({\n type: \"mouseup\",\n pixelX: mouseX,\n pixelY: mouseY,\n inPlotArea: true, // simplified\n originalEvent: e,\n preventDefault: () => e.preventDefault(),\n defaultPrevented: e.defaultPrevented,\n });\n\n if (this.isBoxZooming) {\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\n // Only apply box zoom if significant area was selected\n if (width > 5 && height > 5) {\n this.callbacks.onBoxZoom({ x, y, width, height });\n }\n this.callbacks.onBoxZoom(null); // Signal to apply/clear the box\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\n // Call box select callback if available\n if (this.callbacks.onBoxSelect) {\n this.callbacks.onBoxSelect({ x, y, width, height }, e.shiftKey);\n }\n }\n // Check if we were in a drag operation\n const wasDragging = this.isDragging || this.isBoxSelecting || this.isBoxZooming;\n\n this.isDragging = false;\n this.panningAxisId = undefined;\n this.isBoxSelecting = false;\n this.isBoxZooming = false;\n this.container.style.cursor = \"\";\n\n // Notify drag end if we were dragging\n if (wasDragging) {\n this.callbacks.onDragEnd?.();\n }\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 * SelectionManager - Advanced hit-testing and point selection\n * \n * Provides:\n * - Hit-testing for data points\n * - Single and multi-selection (Ctrl+click)\n * - Box selection (drag rectangle)\n * - Visual highlighting of selected points\n * - Events for selection changes\n */\n\nimport type { Bounds, PlotArea } from \"../../types\";\nimport type { Scale } from \"../../scales\";\nimport type { Series } from \"../series/Series\";\nimport type { EventEmitter } from \"../EventEmitter\";\n\n// ============================================\n// Selection Types\n// ============================================\n\n/** Represents a single selected data point */\nexport interface SelectedPoint {\n seriesId: string;\n index: number;\n x: number;\n y: number;\n}\n\n/** Selection mode for multi-select operations */\nexport type SelectionMode = 'single' | 'add' | 'remove' | 'toggle';\n\n/** Event data for point selection changes */\nexport interface PointSelectEvent {\n points: SelectedPoint[];\n mode: SelectionMode;\n source: 'click' | 'box' | 'api';\n}\n\n/** Event data for region/box selection */\nexport interface RegionSelectEvent {\n bounds: Bounds;\n containedPoints: SelectedPoint[];\n}\n\n/** Selection event map */\nexport interface SelectionEventMap {\n pointSelect: PointSelectEvent;\n regionSelect: RegionSelectEvent;\n selectionChange: { selected: SelectedPoint[]; previous: SelectedPoint[] };\n selectionClear: undefined;\n}\n\n/** Hit-test result for a single point */\nexport interface HitTestResult {\n seriesId: string;\n index: number;\n x: number;\n y: number;\n distance: number;\n pixelX: number;\n pixelY: number;\n}\n\n/** Selection manager configuration */\nexport interface SelectionConfig {\n /** Enable selection (default: true) */\n enabled?: boolean;\n /** Maximum distance in pixels for hit-testing (default: 20) */\n hitRadius?: number;\n /** Allow multi-selection with Ctrl+click (default: true) */\n multiSelect?: boolean;\n /** Enable box selection with Shift+drag (default: true) */\n boxSelect?: boolean;\n /** Highlight style for selected points */\n highlightStyle?: {\n color?: string;\n size?: number;\n ringWidth?: number;\n };\n}\n\n/** Context for selection operations */\nexport interface SelectionContext {\n getSeries: () => Map<string, Series>;\n getPlotArea: () => PlotArea;\n getXScale: () => Scale;\n getYScales: () => Map<string, Scale>;\n getPrimaryYAxisId: () => string;\n events: EventEmitter<SelectionEventMap>;\n requestRender: () => void;\n}\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_CONFIG: Required<SelectionConfig> = {\n enabled: true,\n hitRadius: 20,\n multiSelect: true,\n boxSelect: true,\n highlightStyle: {\n color: '#00ffff',\n size: 12,\n ringWidth: 3,\n },\n};\n\n// ============================================\n// SelectionManager Implementation\n// ============================================\n\nexport class SelectionManager {\n private ctx: SelectionContext;\n private config: Required<SelectionConfig>;\n private selected: Map<string, Set<number>> = new Map(); // seriesId -> Set of indices\n private isBoxSelecting: boolean = false;\n private boxStart: { x: number; y: number } | null = null;\n private boxEnd: { x: number; y: number } | null = null;\n\n constructor(ctx: SelectionContext, config?: SelectionConfig) {\n this.ctx = ctx;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n // ============================================\n // Configuration\n // ============================================\n\n configure(config: Partial<SelectionConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n getConfig(): SelectionConfig {\n return { ...this.config };\n }\n\n setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n if (!enabled) {\n this.clearSelection();\n }\n }\n\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n // ============================================\n // Hit Testing\n // ============================================\n\n /**\n * Hit-test at a pixel coordinate to find the nearest data point\n */\n hitTest(pixelX: number, pixelY: number, radius?: number): HitTestResult | null {\n if (!this.config.enabled) return null;\n\n const plotArea = this.ctx.getPlotArea();\n \n // Check if within plot area\n if (\n pixelX < plotArea.x ||\n pixelX > plotArea.x + plotArea.width ||\n pixelY < plotArea.y ||\n pixelY > plotArea.y + plotArea.height\n ) {\n return null;\n }\n\n const xScale = this.ctx.getXScale();\n const yScales = this.ctx.getYScales();\n const series = this.ctx.getSeries();\n const hitRadius = radius ?? this.config.hitRadius;\n const hitRadiusSq = hitRadius * hitRadius;\n\n let nearest: HitTestResult | null = null;\n let minDistSq = Infinity;\n\n series.forEach((s, seriesId) => {\n if (!s.isVisible()) return;\n\n const data = s.getData();\n if (data.x.length === 0) return;\n\n const axisId = s.getYAxisId() || this.ctx.getPrimaryYAxisId();\n const yScale = yScales.get(axisId);\n if (!yScale) return;\n\n // Binary search to find points near the X coordinate\n const dataX = xScale.invert(pixelX);\n const startIdx = this.findNearestIndex(data.x, dataX);\n \n // Check nearby points (search window)\n const searchRadius = 50; // Check points within this many indices\n const startSearch = Math.max(0, startIdx - searchRadius);\n const endSearch = Math.min(data.x.length, startIdx + searchRadius);\n\n for (let i = startSearch; i < endSearch; 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 < minDistSq && distSq <= hitRadiusSq) {\n minDistSq = distSq;\n nearest = {\n seriesId,\n index: i,\n x: data.x[i],\n y: data.y[i],\n distance: Math.sqrt(distSq),\n pixelX: px,\n pixelY: py,\n };\n }\n }\n });\n\n return nearest;\n }\n\n /**\n * Hit-test all points within a rectangular region\n */\n hitTestRegion(bounds: Bounds): HitTestResult[] {\n const results: HitTestResult[] = [];\n if (!this.config.enabled) return results;\n\n const xScale = this.ctx.getXScale();\n const yScales = this.ctx.getYScales();\n const series = this.ctx.getSeries();\n\n series.forEach((s, seriesId) => {\n if (!s.isVisible()) return;\n\n const data = s.getData();\n if (data.x.length === 0) return;\n\n const axisId = s.getYAxisId() || this.ctx.getPrimaryYAxisId();\n const yScale = yScales.get(axisId);\n if (!yScale) return;\n\n for (let i = 0; i < data.x.length; i++) {\n const x = data.x[i];\n const y = data.y[i];\n\n if (x >= bounds.xMin && x <= bounds.xMax && y >= bounds.yMin && y <= bounds.yMax) {\n results.push({\n seriesId,\n index: i,\n x,\n y,\n distance: 0,\n pixelX: xScale.transform(x),\n pixelY: yScale.transform(y),\n });\n }\n }\n });\n\n return results;\n }\n\n // ============================================\n // Selection API\n // ============================================\n\n /**\n * Select specific points programmatically\n */\n selectPoints(\n points: Array<{ seriesId: string; indices: number[] }>,\n mode: SelectionMode = 'single'\n ): void {\n if (!this.config.enabled) return;\n\n const previous = this.getSelectedPoints();\n\n if (mode === 'single') {\n this.selected.clear();\n }\n\n const series = this.ctx.getSeries();\n const newPoints: SelectedPoint[] = [];\n\n points.forEach(({ seriesId, indices }) => {\n const s = series.get(seriesId);\n if (!s) return;\n\n const data = s.getData();\n let indexSet = this.selected.get(seriesId);\n \n if (!indexSet) {\n indexSet = new Set();\n this.selected.set(seriesId, indexSet);\n }\n\n indices.forEach(idx => {\n if (idx < 0 || idx >= data.x.length) return;\n\n if (mode === 'remove') {\n indexSet!.delete(idx);\n } else if (mode === 'toggle') {\n if (indexSet!.has(idx)) {\n indexSet!.delete(idx);\n } else {\n indexSet!.add(idx);\n newPoints.push({\n seriesId,\n index: idx,\n x: data.x[idx],\n y: data.y[idx],\n });\n }\n } else {\n indexSet!.add(idx);\n newPoints.push({\n seriesId,\n index: idx,\n x: data.x[idx],\n y: data.y[idx],\n });\n }\n });\n\n // Clean up empty sets\n if (indexSet.size === 0) {\n this.selected.delete(seriesId);\n }\n });\n\n const current = this.getSelectedPoints();\n\n this.ctx.events.emit('pointSelect', {\n points: newPoints,\n mode,\n source: 'api',\n });\n\n this.ctx.events.emit('selectionChange', {\n selected: current,\n previous,\n });\n\n this.ctx.requestRender();\n }\n\n /**\n * Get all currently selected points\n */\n getSelectedPoints(): SelectedPoint[] {\n const result: SelectedPoint[] = [];\n const series = this.ctx.getSeries();\n\n this.selected.forEach((indices, seriesId) => {\n const s = series.get(seriesId);\n if (!s) return;\n\n const data = s.getData();\n indices.forEach(idx => {\n if (idx < data.x.length) {\n result.push({\n seriesId,\n index: idx,\n x: data.x[idx],\n y: data.y[idx],\n });\n }\n });\n });\n\n return result;\n }\n\n /**\n * Check if a specific point is selected\n */\n isPointSelected(seriesId: string, index: number): boolean {\n return this.selected.get(seriesId)?.has(index) ?? false;\n }\n\n /**\n * Get selected points for a specific series\n */\n getSelectedForSeries(seriesId: string): number[] {\n const indices = this.selected.get(seriesId);\n return indices ? Array.from(indices) : [];\n }\n\n /**\n * Clear all selections\n */\n clearSelection(): void {\n if (this.selected.size === 0) return;\n\n const previous = this.getSelectedPoints();\n this.selected.clear();\n\n this.ctx.events.emit('selectionClear', undefined);\n this.ctx.events.emit('selectionChange', {\n selected: [],\n previous,\n });\n\n this.ctx.requestRender();\n }\n\n /**\n * Get selection count\n */\n getSelectionCount(): number {\n let count = 0;\n this.selected.forEach(indices => {\n count += indices.size;\n });\n return count;\n }\n\n // ============================================\n // Click Handling\n // ============================================\n\n /**\n * Handle click event for selection\n */\n handleClick(pixelX: number, pixelY: number, ctrlKey: boolean, shiftKey: boolean): void {\n if (!this.config.enabled) return;\n\n const hit = this.hitTest(pixelX, pixelY);\n\n if (!hit) {\n // Click on empty space clears selection (unless Ctrl is held)\n if (!ctrlKey && !shiftKey) {\n this.clearSelection();\n }\n return;\n }\n\n let mode: SelectionMode = 'single';\n \n if (ctrlKey && this.config.multiSelect) {\n mode = 'toggle';\n } else if (shiftKey && this.config.multiSelect) {\n mode = 'add';\n }\n\n this.selectPoints(\n [{ seriesId: hit.seriesId, indices: [hit.index] }],\n mode\n );\n }\n\n // ============================================\n // Box Selection\n // ============================================\n\n /**\n * Start box selection\n */\n startBoxSelection(pixelX: number, pixelY: number): void {\n if (!this.config.enabled || !this.config.boxSelect) return;\n\n this.isBoxSelecting = true;\n this.boxStart = { x: pixelX, y: pixelY };\n this.boxEnd = { x: pixelX, y: pixelY };\n }\n\n /**\n * Update box selection during drag\n */\n updateBoxSelection(pixelX: number, pixelY: number): void {\n if (!this.isBoxSelecting) return;\n this.boxEnd = { x: pixelX, y: pixelY };\n this.ctx.requestRender();\n }\n\n /**\n * Complete box selection\n */\n completeBoxSelection(additive: boolean = false): void {\n if (!this.isBoxSelecting || !this.boxStart || !this.boxEnd) {\n this.cancelBoxSelection();\n return;\n }\n\n const plotArea = this.ctx.getPlotArea();\n const xScale = this.ctx.getXScale();\n const yScales = this.ctx.getYScales();\n const primaryYScale = yScales.get(this.ctx.getPrimaryYAxisId());\n \n if (!primaryYScale) {\n this.cancelBoxSelection();\n return;\n }\n\n // Calculate data bounds from pixel coordinates\n const x1 = Math.min(this.boxStart.x, this.boxEnd.x);\n const x2 = Math.max(this.boxStart.x, this.boxEnd.x);\n const y1 = Math.min(this.boxStart.y, this.boxEnd.y);\n const y2 = Math.max(this.boxStart.y, this.boxEnd.y);\n\n // Clamp to plot area\n const clampedX1 = Math.max(x1, plotArea.x);\n const clampedX2 = Math.min(x2, plotArea.x + plotArea.width);\n const clampedY1 = Math.max(y1, plotArea.y);\n const clampedY2 = Math.min(y2, plotArea.y + plotArea.height);\n\n // Convert to data coordinates\n const dataBounds: Bounds = {\n xMin: xScale.invert(clampedX1),\n xMax: xScale.invert(clampedX2),\n yMin: primaryYScale.invert(clampedY2), // Y is inverted\n yMax: primaryYScale.invert(clampedY1),\n };\n\n // Hit test all points in the region\n const hits = this.hitTestRegion(dataBounds);\n \n if (hits.length > 0) {\n // Group hits by series\n const bySeriesMap = new Map<string, number[]>();\n hits.forEach(hit => {\n let arr = bySeriesMap.get(hit.seriesId);\n if (!arr) {\n arr = [];\n bySeriesMap.set(hit.seriesId, arr);\n }\n arr.push(hit.index);\n });\n\n const pointsToSelect = Array.from(bySeriesMap.entries()).map(([seriesId, indices]) => ({\n seriesId,\n indices,\n }));\n\n this.selectPoints(pointsToSelect, additive ? 'add' : 'single');\n\n // Emit region select event\n const containedPoints = this.getSelectedPoints();\n this.ctx.events.emit('regionSelect', {\n bounds: dataBounds,\n containedPoints,\n });\n } else if (!additive) {\n this.clearSelection();\n }\n\n this.cancelBoxSelection();\n }\n\n /**\n * Cancel box selection\n */\n cancelBoxSelection(): void {\n this.isBoxSelecting = false;\n this.boxStart = null;\n this.boxEnd = null;\n this.ctx.requestRender();\n }\n\n /**\n * Check if box selection is active\n */\n isBoxSelectActive(): boolean {\n return this.isBoxSelecting;\n }\n\n /**\n * Get current box selection rectangle (for rendering)\n */\n getBoxSelectionRect(): { x: number; y: number; width: number; height: number } | null {\n if (!this.isBoxSelecting || !this.boxStart || !this.boxEnd) {\n return null;\n }\n\n return {\n x: Math.min(this.boxStart.x, this.boxEnd.x),\n y: Math.min(this.boxStart.y, this.boxEnd.y),\n width: Math.abs(this.boxEnd.x - this.boxStart.x),\n height: Math.abs(this.boxEnd.y - this.boxStart.y),\n };\n }\n\n // ============================================\n // Rendering\n // ============================================\n\n /**\n * Render selected point highlights\n */\n render(ctx: CanvasRenderingContext2D, plotArea: PlotArea): void {\n if (this.selected.size === 0 && !this.isBoxSelecting) return;\n\n const xScale = this.ctx.getXScale();\n const yScales = this.ctx.getYScales();\n const seriesMap = this.ctx.getSeries();\n const style = this.config.highlightStyle;\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 // Draw selection highlights\n this.selected.forEach((indices, seriesId) => {\n const s = seriesMap.get(seriesId);\n if (!s || !s.isVisible()) return;\n\n const data = s.getData();\n const axisId = s.getYAxisId() || this.ctx.getPrimaryYAxisId();\n const yScale = yScales.get(axisId);\n if (!yScale) return;\n\n const seriesColor = s.getStyle().color || '#ff0055';\n\n indices.forEach(idx => {\n if (idx >= data.x.length) return;\n\n const px = xScale.transform(data.x[idx]);\n const py = yScale.transform(data.y[idx]);\n\n // Skip if outside plot area\n if (px < plotArea.x || px > plotArea.x + plotArea.width) return;\n if (py < plotArea.y || py > plotArea.y + plotArea.height) return;\n\n // Outer ring (highlight color)\n ctx.beginPath();\n ctx.arc(px, py, style.size! / 2, 0, Math.PI * 2);\n ctx.strokeStyle = style.color!;\n ctx.lineWidth = style.ringWidth!;\n ctx.stroke();\n\n // Inner fill (series color)\n ctx.beginPath();\n ctx.arc(px, py, style.size! / 2 - style.ringWidth!, 0, Math.PI * 2);\n ctx.fillStyle = seriesColor;\n ctx.fill();\n });\n });\n\n // Draw box selection rectangle\n const boxRect = this.getBoxSelectionRect();\n if (boxRect) {\n ctx.fillStyle = 'rgba(0, 170, 255, 0.2)';\n ctx.strokeStyle = '#00aaff';\n ctx.lineWidth = 1;\n ctx.setLineDash([5, 5]);\n ctx.fillRect(boxRect.x, boxRect.y, boxRect.width, boxRect.height);\n ctx.strokeRect(boxRect.x, boxRect.y, boxRect.width, boxRect.height);\n }\n\n ctx.restore();\n }\n\n // ============================================\n // Helpers\n // ============================================\n\n /**\n * Binary search to find nearest index in sorted array\n */\n private findNearestIndex(arr: Float32Array | Float64Array, target: number): number {\n if (arr.length === 0) return 0;\n if (arr.length === 1) return 0;\n\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 // Check if left-1 is closer\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 * Destroy the selection manager\n */\n destroy(): void {\n this.selected.clear();\n this.cancelBoxSelection();\n }\n}\n","/**\n * ResponsiveManager - Automatic responsive design for charts\n * \n * Provides:\n * - Automatic font scaling based on container size\n * - Tick density adjustment\n * - Point/line size scaling\n * - Touch-optimized hit areas\n * - Breakpoint-based configuration\n */\n\nimport type { ChartTheme } from \"../../theme\";\n\n// ============================================\n// Responsive Types\n// ============================================\n\n/** Breakpoint configuration */\nexport interface ResponsiveBreakpoint {\n /** Maximum width for this breakpoint (undefined = unlimited) */\n maxWidth?: number;\n /** Minimum width for this breakpoint (undefined = 0) */\n minWidth?: number;\n /** Font size multiplier (default: 1) */\n fontScale?: number;\n /** Number of X-axis ticks */\n xTickCount?: number;\n /** Number of Y-axis ticks */\n yTickCount?: number;\n /** Point size multiplier */\n pointScale?: number;\n /** Line width multiplier */\n lineScale?: number;\n /** Hit radius multiplier for touch targets */\n hitRadiusScale?: number;\n /** Whether to show legend */\n showLegend?: boolean;\n /** Legend position override */\n legendPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n}\n\n/** Preset breakpoints */\nexport interface ResponsiveBreakpoints {\n smallMobile?: ResponsiveBreakpoint;\n mobile?: ResponsiveBreakpoint;\n tablet?: ResponsiveBreakpoint;\n desktop?: ResponsiveBreakpoint;\n}\n\n/** Full responsive configuration */\nexport interface ResponsiveConfig {\n /** Enable responsive behavior (default: true) */\n enabled?: boolean;\n /** Custom breakpoints (overrides presets) */\n breakpoints?: ResponsiveBreakpoints;\n /** Optimize for touch interactions (default: auto-detect) */\n touchOptimized?: boolean | 'auto';\n /** Respect user's reduced motion preference (default: true) */\n reducedMotion?: boolean | 'auto';\n /** Debounce time for resize events in ms (default: 100) */\n resizeDebounce?: number;\n}\n\n/** Current responsive state */\nexport interface ResponsiveState {\n /** Current container width */\n width: number;\n /** Current container height */\n height: number;\n /** Active breakpoint name */\n breakpoint: 'smallMobile' | 'mobile' | 'tablet' | 'desktop';\n /** Whether touch is optimized */\n touchOptimized: boolean;\n /** Whether reduced motion is enabled */\n reducedMotion: boolean;\n /** Computed scale factors */\n scales: {\n font: number;\n point: number;\n line: number;\n hitRadius: number;\n };\n /** Computed tick counts */\n ticks: {\n x: number;\n y: number;\n };\n}\n\n/** Context for responsive operations */\nexport interface ResponsiveContext {\n container: HTMLDivElement;\n onStateChange: (state: ResponsiveState) => void;\n}\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_BREAKPOINTS: Required<ResponsiveBreakpoints> = {\n smallMobile: {\n maxWidth: 360,\n fontScale: 0.7,\n xTickCount: 4,\n yTickCount: 3,\n pointScale: 1.3,\n lineScale: 1.5, // Thicker axes for tiny screens\n hitRadiusScale: 1.8,\n showLegend: false,\n },\n mobile: {\n minWidth: 361,\n maxWidth: 480,\n fontScale: 0.8,\n xTickCount: 5,\n yTickCount: 4,\n pointScale: 1.2, // Larger for touch\n lineScale: 1.3,\n hitRadiusScale: 1.5,\n showLegend: false,\n },\n tablet: {\n minWidth: 481,\n maxWidth: 768,\n fontScale: 0.9,\n xTickCount: 7,\n yTickCount: 5,\n pointScale: 1.1,\n lineScale: 1.1,\n hitRadiusScale: 1.3,\n showLegend: true,\n legendPosition: 'top-right',\n },\n desktop: {\n minWidth: 769,\n fontScale: 1.0,\n xTickCount: 10,\n yTickCount: 6,\n pointScale: 1.0,\n lineScale: 1.0,\n hitRadiusScale: 1.0,\n showLegend: true,\n legendPosition: 'top-right',\n },\n};\n\nconst DEFAULT_CONFIG: Required<ResponsiveConfig> = {\n enabled: true,\n breakpoints: DEFAULT_BREAKPOINTS,\n touchOptimized: 'auto',\n reducedMotion: 'auto',\n resizeDebounce: 100,\n};\n\n// ============================================\n// ResponsiveManager Implementation\n// ============================================\n\nexport class ResponsiveManager {\n private ctx: ResponsiveContext;\n private config: Required<ResponsiveConfig>;\n private state: ResponsiveState;\n private resizeObserver: ResizeObserver | null = null;\n private debounceTimer: number | null = null;\n private destroyed = false;\n\n constructor(ctx: ResponsiveContext, config?: ResponsiveConfig) {\n this.ctx = ctx;\n this.config = this.mergeConfig(config);\n this.state = this.computeState();\n \n if (this.config.enabled) {\n this.setupResizeObserver();\n }\n }\n\n // ============================================\n // Configuration\n // ============================================\n\n private mergeConfig(config?: ResponsiveConfig): Required<ResponsiveConfig> {\n if (!config) return { ...DEFAULT_CONFIG };\n\n return {\n enabled: config.enabled ?? DEFAULT_CONFIG.enabled,\n breakpoints: {\n smallMobile: { ...DEFAULT_BREAKPOINTS.smallMobile, ...config.breakpoints?.smallMobile },\n mobile: { ...DEFAULT_BREAKPOINTS.mobile, ...config.breakpoints?.mobile },\n tablet: { ...DEFAULT_BREAKPOINTS.tablet, ...config.breakpoints?.tablet },\n desktop: { ...DEFAULT_BREAKPOINTS.desktop, ...config.breakpoints?.desktop },\n },\n touchOptimized: config.touchOptimized ?? DEFAULT_CONFIG.touchOptimized,\n reducedMotion: config.reducedMotion ?? DEFAULT_CONFIG.reducedMotion,\n resizeDebounce: config.resizeDebounce ?? DEFAULT_CONFIG.resizeDebounce,\n };\n }\n\n configure(config: Partial<ResponsiveConfig>): void {\n this.config = this.mergeConfig({ ...this.config, ...config });\n this.update();\n }\n\n getConfig(): ResponsiveConfig {\n return { ...this.config };\n }\n\n setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n \n if (enabled && !this.resizeObserver) {\n this.setupResizeObserver();\n } else if (!enabled && this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n // ============================================\n // State Management\n // ============================================\n\n getState(): ResponsiveState {\n return { ...this.state };\n }\n\n /**\n * Manually trigger a state update\n */\n update(): void {\n const newState = this.computeState();\n \n if (this.hasStateChanged(newState)) {\n this.state = newState;\n this.ctx.onStateChange(this.state);\n }\n }\n\n private computeState(): ResponsiveState {\n const rect = this.ctx.container.getBoundingClientRect();\n const width = rect.width || 800;\n const height = rect.height || 600;\n \n const breakpoint = this.getActiveBreakpoint(width);\n const bp = this.config.breakpoints[breakpoint] || DEFAULT_BREAKPOINTS.desktop;\n \n const touchOptimized = this.detectTouchOptimization();\n const reducedMotion = this.detectReducedMotion();\n \n // Apply touch multiplier if needed\n const touchMultiplier = touchOptimized ? 1.2 : 1.0;\n\n return {\n width,\n height,\n breakpoint,\n touchOptimized,\n reducedMotion,\n scales: {\n font: bp.fontScale ?? 1.0,\n point: (bp.pointScale ?? 1.0) * touchMultiplier,\n line: (bp.lineScale ?? 1.0),\n hitRadius: (bp.hitRadiusScale ?? 1.0) * touchMultiplier,\n },\n ticks: {\n x: bp.xTickCount ?? 8,\n y: bp.yTickCount ?? 6,\n },\n };\n }\n\n private getActiveBreakpoint(width: number): 'smallMobile' | 'mobile' | 'tablet' | 'desktop' {\n const { smallMobile, mobile, tablet, desktop } = this.config.breakpoints;\n \n if (smallMobile?.maxWidth && width <= smallMobile.maxWidth) {\n return 'smallMobile';\n }\n \n if (mobile?.minWidth && mobile?.maxWidth && width >= mobile.minWidth && width <= mobile.maxWidth) {\n return 'mobile';\n }\n \n if (tablet?.minWidth && tablet?.maxWidth && width >= tablet.minWidth && width <= tablet.maxWidth) {\n return 'tablet';\n }\n \n if (desktop?.minWidth && width >= desktop.minWidth) {\n return 'desktop';\n }\n \n // Fallback based on width thresholds\n if (width <= 360) return 'smallMobile';\n if (width <= 480) return 'mobile';\n if (width <= 768) return 'tablet';\n return 'desktop';\n }\n\n private detectTouchOptimization(): boolean {\n if (this.config.touchOptimized === true) return true;\n if (this.config.touchOptimized === false) return false;\n \n // Auto-detect\n if (typeof window === 'undefined') return false;\n \n return (\n 'ontouchstart' in window ||\n navigator.maxTouchPoints > 0 ||\n (navigator as any).msMaxTouchPoints > 0 ||\n window.matchMedia('(pointer: coarse)').matches\n );\n }\n\n private detectReducedMotion(): boolean {\n if (this.config.reducedMotion === true) return true;\n if (this.config.reducedMotion === false) return false;\n \n // Auto-detect from system preference\n if (typeof window === 'undefined') return false;\n \n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n\n private hasStateChanged(newState: ResponsiveState): boolean {\n return (\n this.state.width !== newState.width ||\n this.state.height !== newState.height ||\n this.state.breakpoint !== newState.breakpoint ||\n this.state.touchOptimized !== newState.touchOptimized ||\n this.state.reducedMotion !== newState.reducedMotion\n );\n }\n\n // ============================================\n // Resize Handling\n // ============================================\n\n private setupResizeObserver(): void {\n if (typeof ResizeObserver === 'undefined') {\n // Fallback for older browsers\n window.addEventListener('resize', this.handleResize);\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.handleResize();\n });\n\n this.resizeObserver.observe(this.ctx.container);\n }\n\n private handleResize = (): void => {\n if (this.destroyed) return;\n \n // Debounce resize events\n if (this.debounceTimer !== null) {\n window.clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = window.setTimeout(() => {\n this.update();\n this.debounceTimer = null;\n }, this.config.resizeDebounce);\n };\n\n // ============================================\n // Theme Scaling\n // ============================================\n\n /**\n * Apply responsive scaling to a theme\n */\n scaleTheme(theme: ChartTheme): ChartTheme {\n const { font, line } = this.state.scales;\n \n return {\n ...theme,\n xAxis: {\n ...theme.xAxis,\n labelSize: Math.round(theme.xAxis.labelSize * font),\n titleSize: Math.round(theme.xAxis.titleSize * font),\n lineWidth: theme.xAxis.lineWidth * line,\n },\n yAxis: {\n ...theme.yAxis,\n labelSize: Math.round(theme.yAxis.labelSize * font),\n titleSize: Math.round(theme.yAxis.titleSize * font),\n lineWidth: theme.yAxis.lineWidth * line,\n },\n legend: {\n ...theme.legend,\n fontSize: Math.round(theme.legend.fontSize * font),\n swatchSize: Math.round(theme.legend.swatchSize * font),\n },\n cursor: {\n ...theme.cursor,\n tooltipSize: Math.round(theme.cursor.tooltipSize * font),\n },\n };\n }\n\n /**\n * Get scaled point size\n */\n getScaledPointSize(baseSize: number): number {\n return baseSize * this.state.scales.point;\n }\n\n /**\n * Get scaled line width\n */\n getScaledLineWidth(baseWidth: number): number {\n return baseWidth * this.state.scales.line;\n }\n\n /**\n * Get scaled hit radius\n */\n getScaledHitRadius(baseRadius: number): number {\n return baseRadius * this.state.scales.hitRadius;\n }\n\n /**\n * Get recommended tick counts\n */\n getTickCounts(): { x: number; y: number } {\n return { ...this.state.ticks };\n }\n\n /**\n * Check if legend should be shown at current breakpoint\n */\n shouldShowLegend(): boolean {\n const bp = this.config.breakpoints[this.state.breakpoint];\n return bp?.showLegend ?? true;\n }\n\n /**\n * Get legend position for current breakpoint\n */\n getLegendPosition(): 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' {\n const bp = this.config.breakpoints[this.state.breakpoint];\n return bp?.legendPosition ?? 'top-right';\n }\n\n // ============================================\n // Cleanup\n // ============================================\n\n destroy(): void {\n this.destroyed = true;\n \n if (this.debounceTimer !== null) {\n window.clearTimeout(this.debounceTimer);\n }\n \n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n } else {\n window.removeEventListener('resize', this.handleResize);\n }\n }\n}\n","/**\n * Chart Serialization and State Persistence\n * \n * Provides:\n * - Export/import complete chart state\n * - URL hash sharing\n * - State compression\n * - Version migration\n */\n\nimport type { Bounds, SeriesType, SeriesStyle } from \"../types\";\nimport type { Annotation } from \"../core/annotations\";\n\n// ============================================\n// Serialization Types\n// ============================================\n\n/** Version of the serialization format */\nexport const SERIALIZATION_VERSION = 1;\n\n/** Serialized axis configuration */\nexport interface SerializedAxis {\n id: string;\n position?: 'left' | 'right' | 'top' | 'bottom';\n label?: string;\n scale?: 'linear' | 'log';\n min?: number;\n max?: number;\n auto?: boolean;\n}\n\n/** Serialized series data */\nexport interface SerializedSeries {\n id: string;\n name?: string;\n type: SeriesType;\n yAxisId?: string;\n style?: SeriesStyle;\n visible?: boolean;\n /** Data is stored as base64 encoded Float32Array for compactness */\n data: {\n x: string; // base64\n y: string; // base64\n y2?: string;\n };\n}\n\n/** Complete serialized chart state */\nexport interface ChartState {\n /** Serialization format version */\n version: number;\n /** Timestamp when state was saved */\n timestamp: number;\n /** Current view bounds */\n viewBounds: Bounds;\n /** X-axis configuration */\n xAxis: SerializedAxis;\n /** Y-axes configurations */\n yAxes: SerializedAxis[];\n /** Primary Y axis ID */\n primaryYAxisId: string;\n /** Series data and configuration */\n series: SerializedSeries[];\n /** Annotations */\n annotations: Annotation[];\n /** Active theme name (if applicable) */\n themeName?: string;\n options?: {\n showLegend?: boolean;\n showControls?: boolean;\n showStatistics?: boolean;\n autoScroll?: boolean;\n };\n /** Plugin-specific data */\n plugins?: Record<string, any>;\n}\n\n/** Options for serialization */\nexport interface SerializeOptions {\n /** Include series data (default: true) */\n includeData?: boolean;\n /** Include annotations (default: true) */\n includeAnnotations?: boolean;\n /** Compress output (default: false) */\n compress?: boolean;\n}\n\n/** Options for deserialization */\nexport interface DeserializeOptions {\n /** Merge with existing state instead of replacing (default: false) */\n merge?: boolean;\n /** Skip data loading (default: false) */\n skipData?: boolean;\n /** Skip annotations (default: false) */\n skipAnnotations?: boolean;\n}\n\n// ============================================\n// Encoding Utilities\n// ============================================\n\n/**\n * Encode Float32Array to base64 string\n */\nexport function encodeFloat32Array(arr: Float32Array | Float64Array): string {\n // Convert Float64Array to Float32Array for size efficiency\n const float32 = arr instanceof Float32Array \n ? arr \n : new Float32Array(arr);\n \n const bytes = new Uint8Array(float32.buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Decode base64 string to Float32Array\n */\nexport function decodeFloat32Array(base64: string): Float32Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new Float32Array(bytes.buffer);\n}\n\n/**\n * Compress string using simple LZ-based compression\n */\nexport function compressString(str: string): string {\n // Simple compression using built-in TextEncoder for now\n // In production, could use pako or similar\n try {\n const encoder = new TextEncoder();\n encoder.encode(str);\n \n // Simple RLE-like compression for repeated patterns\n let compressed = '';\n for (let i = 0; i < str.length; i++) {\n let count = 1;\n while (i + count < str.length && str[i] === str[i + count] && count < 255) {\n count++;\n }\n if (count > 3) {\n compressed += '\\x00' + String.fromCharCode(count) + str[i];\n i += count - 1;\n } else {\n compressed += str[i];\n }\n }\n \n return btoa(compressed);\n } catch (e) {\n // Fallback to just base64\n return btoa(str);\n }\n}\n\n/**\n * Decompress string\n */\nexport function decompressString(compressed: string): string {\n try {\n const decoded = atob(compressed);\n \n // Decompress RLE\n let result = '';\n for (let i = 0; i < decoded.length; i++) {\n if (decoded[i] === '\\x00' && i + 2 < decoded.length) {\n const count = decoded.charCodeAt(i + 1);\n const char = decoded[i + 2];\n result += char.repeat(count);\n i += 2;\n } else {\n result += decoded[i];\n }\n }\n \n return result;\n } catch (e) {\n // Fallback to just base64 decode\n return atob(compressed);\n }\n}\n\n// ============================================\n// URL Hash Utilities\n// ============================================\n\n/**\n * Convert chart state to URL-safe hash\n */\nexport function stateToUrlHash(state: ChartState, compress: boolean = true): string {\n const json = JSON.stringify(state);\n if (compress) {\n return compressString(json);\n }\n return btoa(json);\n}\n\n/**\n * Parse chart state from URL hash\n */\nexport function urlHashToState(hash: string, compressed: boolean = true): ChartState | null {\n try {\n const json = compressed ? decompressString(hash) : atob(hash);\n const state = JSON.parse(json) as ChartState;\n \n // Validate version\n if (typeof state.version !== 'number') {\n console.warn('[SciChartEngine] Invalid state: missing version');\n return null;\n }\n \n // Migration could happen here for future versions\n if (state.version > SERIALIZATION_VERSION) {\n console.warn('[SciChartEngine] State version is newer than supported');\n }\n \n return state;\n } catch (e) {\n console.error('[SciChartEngine] Failed to parse URL hash:', e);\n return null;\n }\n}\n\n// ============================================\n// State Validation\n// ============================================\n\n/**\n * Validate a chart state object\n */\nexport function validateChartState(state: unknown): state is ChartState {\n if (!state || typeof state !== 'object') return false;\n \n const s = state as any;\n \n // Check required fields\n if (typeof s.version !== 'number') return false;\n if (!s.viewBounds || typeof s.viewBounds !== 'object') return false;\n if (!Array.isArray(s.series)) return false;\n \n return true;\n}\n\n// ============================================\n// State Diff Utilities (for Undo/Redo)\n// ============================================\n\n/** State snapshot for undo/redo */\nexport interface StateSnapshot {\n timestamp: number;\n viewBounds: Bounds;\n label?: string;\n}\n\n/**\n * Simple state history manager for undo/redo\n */\nexport class StateHistory {\n private history: StateSnapshot[] = [];\n private currentIndex: number = -1;\n private maxSize: number;\n\n constructor(maxSize: number = 50) {\n this.maxSize = maxSize;\n }\n\n /**\n * Push a new state to history\n */\n push(snapshot: StateSnapshot): void {\n // Remove any future states if we're not at the end\n if (this.currentIndex < this.history.length - 1) {\n this.history = this.history.slice(0, this.currentIndex + 1);\n }\n\n this.history.push(snapshot);\n\n // Trim if exceeding max size\n if (this.history.length > this.maxSize) {\n this.history.shift();\n } else {\n this.currentIndex++;\n }\n }\n\n /**\n * Undo to previous state\n */\n undo(): StateSnapshot | null {\n if (this.currentIndex <= 0) return null;\n this.currentIndex--;\n return this.history[this.currentIndex];\n }\n\n /**\n * Redo to next state\n */\n redo(): StateSnapshot | null {\n if (this.currentIndex >= this.history.length - 1) return null;\n this.currentIndex++;\n return this.history[this.currentIndex];\n }\n\n /**\n * Check if undo is available\n */\n canUndo(): boolean {\n return this.currentIndex > 0;\n }\n\n /**\n * Check if redo is available\n */\n canRedo(): boolean {\n return this.currentIndex < this.history.length - 1;\n }\n\n /**\n * Get current state\n */\n current(): StateSnapshot | null {\n if (this.currentIndex < 0) return null;\n return this.history[this.currentIndex];\n }\n\n /**\n * Clear history\n */\n clear(): void {\n this.history = [];\n this.currentIndex = -1;\n }\n\n /**\n * Get history length\n */\n get length(): number {\n return this.history.length;\n }\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.005, 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.005, 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 * Auto-scale only Y-axes to fit data (keeps X-axis stable)\n * Used during streaming to prevent X-axis shifting\n */\nexport function autoScaleYOnly(ctx: NavigationContext): void {\n if (ctx.series.size === 0) return;\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 (b && isFinite(b.yMin) && isFinite(b.yMax)) {\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 hasValidData = true;\n }\n });\n\n if (!hasValidData) return;\n\n const MAX_VAL = 1e15;\n const MIN_VAL = -1e15;\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.005, 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 * Animation Engine\n * \n * Provides smooth, performant animations for chart transitions\n * including zoom, pan, data updates, and custom animations.\n */\n\n// ============================================\n// Easing Functions\n// ============================================\n\nexport type EasingFunction = (t: number) => number;\n\nexport const easings = {\n /** Linear easing - constant speed */\n linear: (t: number): number => t,\n\n /** Ease in - starts slow, accelerates */\n easeIn: (t: number): number => t * t,\n\n /** Ease out - starts fast, decelerates */\n easeOut: (t: number): number => 1 - (1 - t) * (1 - t),\n\n /** Ease in-out - slow start and end */\n easeInOut: (t: number): number =>\n t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n\n /** Cubic ease out - smoother deceleration */\n easeOutCubic: (t: number): number => 1 - Math.pow(1 - t, 3),\n\n /** Cubic ease in-out */\n easeInOutCubic: (t: number): number =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2,\n\n /** Spring-like bounce at the end */\n spring: (t: number): number => {\n const c4 = (2 * Math.PI) / 3;\n return t === 0\n ? 0\n : t === 1\n ? 1\n : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1;\n },\n\n /** Elastic overshoot */\n elastic: (t: number): number => {\n const c5 = (2 * Math.PI) / 4.5;\n return t === 0\n ? 0\n : t === 1\n ? 1\n : t < 0.5\n ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c5)) / 2 + 1;\n },\n\n /** Bounce effect */\n bounce: (t: number): number => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n },\n} as const;\n\nexport type EasingName = keyof typeof easings;\n\n// ============================================\n// Animation Types\n// ============================================\n\nexport interface AnimationOptions {\n /** Duration in milliseconds */\n duration: number;\n /** Easing function name or custom function */\n easing?: EasingName | EasingFunction;\n /** Callback on each frame with progress 0-1 */\n onUpdate: (progress: number) => void;\n /** Callback when animation completes */\n onComplete?: () => void;\n /** Callback if animation is cancelled */\n onCancel?: () => void;\n}\n\nexport interface AnimationHandle {\n /** Unique animation ID */\n id: string;\n /** Cancel the animation */\n cancel: () => void;\n /** Promise that resolves when animation completes */\n promise: Promise<void>;\n /** Whether animation is currently running */\n isRunning: () => boolean;\n}\n\nexport interface BoundsAnimation {\n /** Target X range [min, max] */\n xRange?: [number, number];\n /** Target Y range [min, max] */\n yRange?: [number, number];\n /** Duration in ms (default: 300) */\n duration?: number;\n /** Easing function (default: 'easeOutCubic') */\n easing?: EasingName | EasingFunction;\n}\n\n// ============================================\n// Animation Engine\n// ============================================\n\nexport class AnimationEngine {\n private animations: Map<string, {\n startTime: number;\n duration: number;\n easingFn: EasingFunction;\n onUpdate: (progress: number) => void;\n onComplete?: () => void;\n onCancel?: () => void;\n resolve: () => void;\n reject: (reason?: any) => void;\n }> = new Map();\n\n private frameId: number | null = null;\n private idCounter = 0;\n private isDestroyed = false;\n\n /**\n * Start a new animation\n */\n animate(options: AnimationOptions): AnimationHandle {\n const id = `anim_${++this.idCounter}`;\n\n const easingFn = typeof options.easing === 'function'\n ? options.easing\n : easings[options.easing || 'easeOutCubic'];\n\n let resolve: () => void;\n let reject: (reason?: any) => void;\n\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n this.animations.set(id, {\n startTime: performance.now(),\n duration: options.duration,\n easingFn,\n onUpdate: options.onUpdate,\n onComplete: options.onComplete,\n onCancel: options.onCancel,\n resolve: resolve!,\n reject: reject!,\n });\n\n this.ensureLoop();\n\n return {\n id,\n cancel: () => this.cancel(id),\n promise,\n isRunning: () => this.animations.has(id),\n };\n }\n\n /**\n * Animate numeric value interpolation\n */\n interpolate(\n from: number,\n to: number,\n options: Omit<AnimationOptions, 'onUpdate'> & {\n onUpdate: (value: number) => void;\n }\n ): AnimationHandle {\n return this.animate({\n ...options,\n onUpdate: (progress) => {\n const value = from + (to - from) * progress;\n options.onUpdate(value);\n },\n });\n }\n\n /**\n * Animate bounds transition\n */\n animateBounds(\n current: { xMin: number; xMax: number; yMin: number; yMax: number },\n target: BoundsAnimation,\n onUpdate: (bounds: { xMin: number; xMax: number; yMin: number; yMax: number }) => void,\n onComplete?: () => void\n ): AnimationHandle {\n const startBounds = { ...current };\n const targetBounds = {\n xMin: target.xRange ? target.xRange[0] : current.xMin,\n xMax: target.xRange ? target.xRange[1] : current.xMax,\n yMin: target.yRange ? target.yRange[0] : current.yMin,\n yMax: target.yRange ? target.yRange[1] : current.yMax,\n };\n\n return this.animate({\n duration: target.duration ?? 150, // Was 300\n easing: target.easing ?? 'easeOutCubic',\n onUpdate: (progress) => {\n onUpdate({\n xMin: startBounds.xMin + (targetBounds.xMin - startBounds.xMin) * progress,\n xMax: startBounds.xMax + (targetBounds.xMax - startBounds.xMax) * progress,\n yMin: startBounds.yMin + (targetBounds.yMin - startBounds.yMin) * progress,\n yMax: startBounds.yMax + (targetBounds.yMax - startBounds.yMax) * progress,\n });\n },\n onComplete,\n });\n }\n\n /**\n * Cancel a specific animation\n */\n cancel(id: string): void {\n const anim = this.animations.get(id);\n if (anim) {\n anim.onCancel?.();\n anim.reject(new Error('Animation cancelled'));\n this.animations.delete(id);\n }\n }\n\n /**\n * Cancel all running animations\n */\n cancelAll(): void {\n this.animations.forEach((anim) => {\n anim.onCancel?.();\n anim.reject(new Error('Animation cancelled'));\n });\n this.animations.clear();\n }\n\n /**\n * Check if any animations are running\n */\n isAnimating(): boolean {\n return this.animations.size > 0;\n }\n\n /**\n * Returns a promise that resolves when all current animations are complete\n */\n async waitForIdle(): Promise<void> {\n if (!this.isAnimating()) return;\n\n // Wait for all current animations to complete\n const promises = Array.from(this.animations.values()).map(a =>\n // Create a promise from the existing resolve/reject but don't fail if one is cancelled\n new Promise<void>(resolve => {\n const originalResolve = a.resolve;\n a.resolve = () => { originalResolve(); resolve(); };\n const originalReject = a.reject;\n a.reject = (err) => { originalReject(err); resolve(); };\n })\n );\n\n await Promise.all(promises);\n\n // Recursive check in case new animations started while waiting\n if (this.isAnimating()) {\n await this.waitForIdle();\n }\n }\n\n /**\n * Get number of active animations\n */\n getActiveCount(): number {\n return this.animations.size;\n }\n\n /**\n * Destroy the animation engine\n */\n destroy(): void {\n this.isDestroyed = true;\n this.cancelAll();\n if (this.frameId !== null) {\n cancelAnimationFrame(this.frameId);\n this.frameId = null;\n }\n }\n\n private ensureLoop(): void {\n if (this.frameId !== null || this.isDestroyed) return;\n this.frameId = requestAnimationFrame(() => this.tick());\n }\n\n private tick(): void {\n if (this.isDestroyed) return;\n\n const now = performance.now();\n const completed: string[] = [];\n\n this.animations.forEach((anim, id) => {\n const elapsed = now - anim.startTime;\n const rawProgress = Math.min(elapsed / anim.duration, 1);\n const easedProgress = anim.easingFn(rawProgress);\n\n anim.onUpdate(easedProgress);\n\n if (rawProgress >= 1) {\n completed.push(id);\n }\n });\n\n // Complete finished animations\n completed.forEach((id) => {\n const anim = this.animations.get(id);\n if (anim) {\n anim.onComplete?.();\n anim.resolve();\n this.animations.delete(id);\n }\n });\n\n // Continue loop if animations remain\n if (this.animations.size > 0) {\n this.frameId = requestAnimationFrame(() => this.tick());\n } else {\n this.frameId = null;\n }\n }\n}\n\n// ============================================\n// Animation Configuration\n// ============================================\n\nexport interface ChartAnimationConfig {\n /** Enable all animations */\n enabled: boolean;\n /** Zoom animation settings */\n zoom: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n /** Pan animation settings */\n pan: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n /** Data update animation settings */\n dataUpdate: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n /** Series entry animation */\n seriesEntry: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n /** Auto-scale animation */\n autoScale: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n}\n\nexport const DEFAULT_ANIMATION_CONFIG: ChartAnimationConfig = {\n enabled: true,\n zoom: {\n enabled: false, // Disabled for more responsive feel\n duration: 100,\n easing: 'easeOutCubic',\n },\n pan: {\n enabled: false, // Usually immediate for responsiveness\n duration: 50, // Was 100\n easing: 'easeOut',\n },\n dataUpdate: {\n enabled: true,\n duration: 75, // Was 150\n easing: 'easeOut',\n },\n seriesEntry: {\n enabled: true,\n duration: 200, // Was 400\n easing: 'easeOutCubic',\n },\n autoScale: {\n enabled: true,\n duration: 150, // Was 300\n easing: 'easeOutCubic',\n },\n};\n\n/**\n * Merge user config with defaults\n */\nexport function mergeAnimationConfig(\n config?: Partial<ChartAnimationConfig>\n): ChartAnimationConfig {\n if (!config) return { ...DEFAULT_ANIMATION_CONFIG };\n\n return {\n enabled: config.enabled ?? DEFAULT_ANIMATION_CONFIG.enabled,\n zoom: { ...DEFAULT_ANIMATION_CONFIG.zoom, ...config.zoom },\n pan: { ...DEFAULT_ANIMATION_CONFIG.pan, ...config.pan },\n dataUpdate: { ...DEFAULT_ANIMATION_CONFIG.dataUpdate, ...config.dataUpdate },\n seriesEntry: { ...DEFAULT_ANIMATION_CONFIG.seriesEntry, ...config.seriesEntry },\n autoScale: { ...DEFAULT_ANIMATION_CONFIG.autoScale, ...config.autoScale },\n };\n}\n\n// Singleton instance for shared use\nlet sharedEngine: AnimationEngine | null = null;\n\nexport function getSharedAnimationEngine(): AnimationEngine {\n if (!sharedEngine) {\n sharedEngine = new AnimationEngine();\n }\n return sharedEngine;\n}\n","/**\n * Animated Chart Navigation\n * \n * Provides animated versions of zoom, pan, and auto-scale 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\";\nimport {\n AnimationEngine,\n type ChartAnimationConfig,\n type AnimationHandle,\n} from \"../animation\";\n\nexport interface AnimatedNavigationContext {\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 animationEngine: AnimationEngine;\n animationConfig: ChartAnimationConfig;\n}\n\n// Track active animation handles\nlet currentZoomAnimation: AnimationHandle | null = null;\nlet currentAutoScaleAnimation: AnimationHandle | null = null;\n\n/**\n * Apply animated zoom to the chart\n */\nexport function applyAnimatedZoom(\n ctx: AnimatedNavigationContext,\n options: ZoomOptions & { animate?: boolean }\n): AnimationHandle | null {\n const shouldAnimate = \n options.animate !== false && \n ctx.animationConfig.enabled && \n ctx.animationConfig.zoom.enabled;\n\n // Cancel any existing zoom animation\n if (currentZoomAnimation?.isRunning()) {\n currentZoomAnimation.cancel();\n }\n\n const hasBars = Array.from(ctx.series.values()).some(s => s.isVisible() && s.getType() === 'bar');\n \n // Calculate target bounds\n const targetXMin = options.x ? options.x[0] : ctx.viewBounds.xMin;\n const targetXMax = options.x ? options.x[1] : ctx.viewBounds.xMax;\n let targetYMin = options.y ? options.y[0] : ctx.viewBounds.yMin;\n let targetYMax = options.y ? options.y[1] : ctx.viewBounds.yMax;\n\n if (hasBars && options.y) {\n targetYMin = 0;\n }\n\n // Determine target axis for Y zoom\n const targetAxisId = options.axisId;\n\n if (!shouldAnimate) {\n // Immediate application\n if (options.x) {\n ctx.viewBounds.xMin = targetXMin;\n ctx.viewBounds.xMax = targetXMax;\n }\n\n // Update Y scales based on target axis\n if (options.y) {\n if (targetAxisId) {\n // Zoom specific axis only\n const scale = ctx.yScales.get(targetAxisId);\n if (scale) {\n scale.setDomain(targetYMin, targetYMax);\n // Sync primary viewBounds if this is the primary axis\n if (targetAxisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = targetYMin;\n ctx.viewBounds.yMax = targetYMax;\n }\n }\n } else {\n // Global zoom: apply to all axes proportionally\n const oldRange = ctx.viewBounds.yMax - ctx.viewBounds.yMin;\n const newRange = targetYMax - targetYMin;\n const factor = oldRange > 0 ? newRange / oldRange : 1;\n const offsetPct = oldRange > 0 ? (targetYMin - 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] + factor * sRange)\n : (sNewMin + factor * sRange);\n scale.setDomain(sNewMin, sNewMax);\n });\n\n ctx.viewBounds.yMin = targetYMin;\n ctx.viewBounds.yMax = targetYMax;\n \n // Update primary scale\n const primaryScale = ctx.yScales.get(ctx.primaryYAxisId);\n if (primaryScale) {\n primaryScale.setDomain(targetYMin, targetYMax);\n }\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 return null;\n }\n\n // Animated zoom\n const startBounds = { ...ctx.viewBounds };\n const startScaleDomains = new Map<string, [number, number]>();\n ctx.yScales.forEach((scale, id) => {\n startScaleDomains.set(id, [...scale.domain] as [number, number]);\n });\n\n currentZoomAnimation = ctx.animationEngine.animate({\n duration: ctx.animationConfig.zoom.duration,\n easing: ctx.animationConfig.zoom.easing,\n onUpdate: (progress) => {\n if (options.x) {\n ctx.viewBounds.xMin = startBounds.xMin + (targetXMin - startBounds.xMin) * progress;\n ctx.viewBounds.xMax = startBounds.xMax + (targetXMax - startBounds.xMax) * progress;\n }\n\n // Update Y scales based on target axis\n if (options.y) {\n if (targetAxisId) {\n // Animate specific axis only\n const scale = ctx.yScales.get(targetAxisId);\n const startDomain = startScaleDomains.get(targetAxisId);\n if (scale && startDomain) {\n const newMin = startDomain[0] + (targetYMin - startDomain[0]) * progress;\n const newMax = startDomain[1] + (targetYMax - startDomain[1]) * progress;\n scale.setDomain(newMin, newMax);\n \n // Sync primary viewBounds if this is the primary axis\n if (targetAxisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = newMin;\n ctx.viewBounds.yMax = newMax;\n }\n }\n } else {\n // Animate all axes proportionally\n ctx.viewBounds.yMin = startBounds.yMin + (targetYMin - startBounds.yMin) * progress;\n ctx.viewBounds.yMax = startBounds.yMax + (targetYMax - startBounds.yMax) * progress;\n\n ctx.yScales.forEach((scale, id) => {\n if (id === ctx.primaryYAxisId) {\n scale.setDomain(ctx.viewBounds.yMin, ctx.viewBounds.yMax);\n } else {\n // Non-primary axes follow proportionally\n const start = startScaleDomains.get(id)!;\n const oldRange = startBounds.yMax - startBounds.yMin;\n const newRange = ctx.viewBounds.yMax - ctx.viewBounds.yMin;\n const factor = oldRange > 0 ? newRange / oldRange : 1;\n const offsetPct = oldRange > 0 ? (ctx.viewBounds.yMin - startBounds.yMin) / oldRange : 0;\n const sRange = start[1] - start[0];\n const newMin = start[0] + offsetPct * sRange;\n const newMax = newMin + factor * sRange;\n scale.setDomain(newMin, newMax);\n }\n });\n }\n }\n\n ctx.requestRender();\n },\n onComplete: () => {\n ctx.events.emit(\"zoom\", {\n x: [ctx.viewBounds.xMin, ctx.viewBounds.xMax],\n y: [ctx.viewBounds.yMin, ctx.viewBounds.yMax],\n });\n currentZoomAnimation = null;\n },\n });\n\n return currentZoomAnimation;\n}\n\n/**\n * Apply animated auto-scale to fit all data\n */\nexport function applyAnimatedAutoScale(\n ctx: AnimatedNavigationContext,\n animate: boolean = true\n): AnimationHandle | null {\n if (ctx.series.size === 0) return null;\n\n // Calculate target bounds\n let xMin = Infinity;\n let xMax = -Infinity;\n \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 null;\n\n // Calculate targets with padding\n const MAX_VAL = 1e15;\n const MIN_VAL = -1e15;\n\n let targetXMin = ctx.viewBounds.xMin;\n let targetXMax = ctx.viewBounds.xMax;\n let targetYMin = ctx.viewBounds.yMin;\n let targetYMax = ctx.viewBounds.yMax;\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.005, 1e10);\n targetXMin = Math.max(MIN_VAL, xMin - xPad);\n targetXMax = Math.min(MAX_VAL, xMax + xPad);\n }\n\n const primaryBounds = yAxisBounds.get(ctx.primaryYAxisId);\n const primaryOpts = ctx.yAxisOptionsMap.get(ctx.primaryYAxisId);\n \n if (primaryBounds && primaryOpts?.auto && primaryBounds.min !== Infinity) {\n let yRange = primaryBounds.max - primaryBounds.min;\n if (yRange <= 0 || !isFinite(yRange)) yRange = Math.abs(primaryBounds.min) * 0.1 || 1;\n const yPad = Math.min(yRange * 0.005, 1e10);\n targetYMin = Math.max(MIN_VAL, primaryBounds.min - yPad);\n targetYMax = Math.min(MAX_VAL, primaryBounds.max + yPad);\n }\n\n const shouldAnimate = \n animate && \n ctx.animationConfig.enabled && \n ctx.animationConfig.autoScale.enabled;\n\n // Cancel any existing auto-scale animation\n if (currentAutoScaleAnimation?.isRunning()) {\n currentAutoScaleAnimation.cancel();\n }\n\n if (!shouldAnimate) {\n // Immediate application\n ctx.viewBounds.xMin = targetXMin;\n ctx.viewBounds.xMax = targetXMax;\n ctx.viewBounds.yMin = targetYMin;\n ctx.viewBounds.yMax = targetYMax;\n\n ctx.yScales.forEach((scale, id) => {\n const bounds = yAxisBounds.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if (bounds && opts?.auto && bounds.min !== Infinity) {\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.005, 1e10);\n scale.setDomain(\n Math.max(MIN_VAL, bounds.min - yPad),\n Math.min(MAX_VAL, bounds.max + yPad)\n );\n }\n });\n\n ctx.events.emit(\"autoScale\", undefined);\n ctx.requestRender();\n return null;\n }\n\n // Animated auto-scale\n const startBounds = { ...ctx.viewBounds };\n const startScaleDomains = new Map<string, [number, number]>();\n ctx.yScales.forEach((scale, id) => {\n startScaleDomains.set(id, [...scale.domain] as [number, number]);\n });\n\n // Calculate target domains for all scales\n const targetScaleDomains = new Map<string, [number, number]>();\n ctx.yScales.forEach((scale, id) => {\n const bounds = yAxisBounds.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if (bounds && opts?.auto && bounds.min !== Infinity) {\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.005, 1e10);\n targetScaleDomains.set(id, [\n Math.max(MIN_VAL, bounds.min - yPad),\n Math.min(MAX_VAL, bounds.max + yPad)\n ]);\n } else {\n targetScaleDomains.set(id, [...scale.domain] as [number, number]);\n }\n });\n\n currentAutoScaleAnimation = ctx.animationEngine.animate({\n duration: ctx.animationConfig.autoScale.duration,\n easing: ctx.animationConfig.autoScale.easing,\n onUpdate: (progress) => {\n ctx.viewBounds.xMin = startBounds.xMin + (targetXMin - startBounds.xMin) * progress;\n ctx.viewBounds.xMax = startBounds.xMax + (targetXMax - startBounds.xMax) * progress;\n ctx.viewBounds.yMin = startBounds.yMin + (targetYMin - startBounds.yMin) * progress;\n ctx.viewBounds.yMax = startBounds.yMax + (targetYMax - startBounds.yMax) * progress;\n\n // Update all Y scales\n ctx.yScales.forEach((scale, id) => {\n const start = startScaleDomains.get(id)!;\n const target = targetScaleDomains.get(id)!;\n scale.setDomain(\n start[0] + (target[0] - start[0]) * progress,\n start[1] + (target[1] - start[1]) * progress\n );\n });\n\n ctx.requestRender();\n },\n onComplete: () => {\n ctx.events.emit(\"autoScale\", undefined);\n currentAutoScaleAnimation = null;\n },\n });\n\n return currentAutoScaleAnimation;\n}\n\n/**\n * Animate to specific bounds\n */\nexport function animateToBounds(\n ctx: AnimatedNavigationContext,\n targetBounds: Partial<Bounds>,\n options?: {\n duration?: number;\n easing?: string;\n }\n): AnimationHandle {\n const startBounds = { ...ctx.viewBounds };\n const finalBounds = {\n xMin: targetBounds.xMin ?? ctx.viewBounds.xMin,\n xMax: targetBounds.xMax ?? ctx.viewBounds.xMax,\n yMin: targetBounds.yMin ?? ctx.viewBounds.yMin,\n yMax: targetBounds.yMax ?? ctx.viewBounds.yMax,\n };\n\n return ctx.animationEngine.animate({\n duration: options?.duration ?? ctx.animationConfig.zoom.duration,\n easing: (options?.easing as any) ?? ctx.animationConfig.zoom.easing,\n onUpdate: (progress) => {\n ctx.viewBounds.xMin = startBounds.xMin + (finalBounds.xMin - startBounds.xMin) * progress;\n ctx.viewBounds.xMax = startBounds.xMax + (finalBounds.xMax - startBounds.xMax) * progress;\n ctx.viewBounds.yMin = startBounds.yMin + (finalBounds.yMin - startBounds.yMin) * progress;\n ctx.viewBounds.yMax = startBounds.yMax + (finalBounds.yMax - startBounds.yMax) * progress;\n\n // Sync primary Y scale\n const primaryScale = ctx.yScales.get(ctx.primaryYAxisId);\n if (primaryScale) {\n primaryScale.setDomain(ctx.viewBounds.yMin, ctx.viewBounds.yMax);\n }\n\n ctx.requestRender();\n },\n onComplete: () => {\n ctx.events.emit(\"zoom\", {\n x: [ctx.viewBounds.xMin, ctx.viewBounds.xMax],\n y: [ctx.viewBounds.yMin, ctx.viewBounds.yMax],\n });\n },\n });\n}\n\n/**\n * Check if any navigation animation is running\n */\nexport function isNavigationAnimating(): boolean {\n return (\n (currentZoomAnimation?.isRunning() ?? false) ||\n (currentAutoScaleAnimation?.isRunning() ?? false)\n );\n}\n\n/**\n * Cancel all navigation animations\n */\nexport function cancelNavigationAnimations(): void {\n currentZoomAnimation?.cancel();\n currentAutoScaleAnimation?.cancel();\n currentZoomAnimation = null;\n currentAutoScaleAnimation = null;\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 {\n NativeWebGLRenderer,\n NativeSeriesRenderData as SeriesRenderData,\n} from \"../../renderer/NativeWebGLRenderer\";\nimport type { OverlayRenderer } from \"../OverlayRenderer\";\nimport type { PlotArea, CursorState, ChartEventMap } from \"../../types\";\nimport type { EventEmitter } from \"../EventEmitter\";\nimport type { SelectionManager } from \"../selection\";\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 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 events: EventEmitter<ChartEventMap>;\n updateSeriesBuffer: (s: Series) => void;\n getPlotArea: () => PlotArea;\n pixelToDataX: (px: number) => number;\n pixelToDataY: (py: number) => number;\n selectionManager: SelectionManager;\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 // 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,\n 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: {\n ...s.getStyle(),\n color: (s.getStyle() as any).bullishColor || \"#26a69a\",\n },\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: {\n ...s.getStyle(),\n color: (s.getStyle() as any).bearishColor || \"#ef5350\",\n },\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(\n \"[SciChartEngine] Container has zero size in render, skipping overlay\"\n );\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 Selection Highlights\n ctx.selectionManager.render(ctx.overlayCtx, plotArea);\n\n // Cursor\n if (ctx.cursorOptions?.enabled && ctx.cursorPosition) {\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: 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\n .pixelToDataY(ctx.cursorPosition.y)\n .toExponential(2)}`,\n };\n ctx.overlay.drawCursor(plotArea, cursor);\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 setYAxisId = (id: string) => { this.yAxisId = id; };\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","/**\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 {\n SeriesOptions,\n HeatmapOptions,\n SeriesUpdateData,\n} from \"../../../types\";\nimport { updateSeriesBuffer } from \"./SeriesBuffer\";\n\nexport function addSeries(\n ctx: any,\n options: SeriesOptions | HeatmapOptions\n): void {\n const s = new Series(options);\n ctx.series.set(s.getId(), s);\n updateSeriesBuffer(ctx, s);\n if (\n ctx.xAxisOptions.auto ||\n Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)\n ) {\n // Don't animate autoscale when adding series to avoid animation conflicts\n ctx.autoScale(false);\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(\n ctx: any,\n id: string,\n data: SeriesUpdateData\n): 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(\n ctx: any,\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): 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 if (Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)) {\n ctx.autoScaleYOnly();\n }\n } else {\n // During streaming (not autoscroll), only auto-scale Y to prevent X-axis shift\n if (Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)) {\n ctx.autoScaleYOnly();\n }\n // Only auto-scale X if explicitly enabled and data bounds changed significantly\n if (ctx.xAxisOptions.auto) {\n const newBounds = s.getBounds();\n if (newBounds) {\n const currentXRange = ctx.viewBounds.xMax - ctx.viewBounds.xMin;\n const dataXRange = newBounds.xMax - newBounds.xMin;\n // Only update X-axis if data extends significantly beyond current view\n if (newBounds.xMax > ctx.viewBounds.xMax || \n newBounds.xMin < ctx.viewBounds.xMin ||\n Math.abs(dataXRange - currentXRange) / currentXRange > 0.1) {\n const xPad = Math.min(dataXRange * 0.005, 1e10);\n ctx.viewBounds.xMin = Math.max(-1e15, newBounds.xMin - xPad);\n ctx.viewBounds.xMax = Math.min(1e15, newBounds.xMax + xPad);\n }\n }\n }\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 * 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 plotAreaColor: [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(\"[SciChartEngine] 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 \n const paColor = parseColor(theme.plotAreaBackground);\n const plotAreaColor: [number, number, number, number] = [paColor[0], paColor[1], paColor[2], paColor[3]];\n\n const showLegend = options.showLegend ?? theme.legend.visible;\n const showControls = options.toolbar?.show ?? 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 plotAreaColor,\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 * SciChart Engine - Plugin Context Implementation\n * \n * Provides the comprehensive context object that gives plugins\n * access to all chart functionality in a controlled manner.\n * \n * @module plugins/PluginContext\n */\n\nimport type { Chart } from \"../core/chart/types\";\nimport type { Bounds, ChartEventMap } from \"../types\";\nimport type { ChartTheme } from \"../theme\";\nimport type {\n PluginContext,\n RenderContext,\n CoordinateContext,\n DataContext,\n UIContext,\n EventContext,\n PluginStorage,\n PluginLogger,\n OverlayOptions,\n NotificationOptions,\n PickResult,\n ChartPlugin,\n} from \"./types\";\n\n// ============================================\n// Plugin Storage Implementation\n// ============================================\n\nclass PluginStorageImpl implements PluginStorage {\n private data = new Map<string, unknown>();\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n constructor(_pluginName: string) {\n // Plugin name available for future use (e.g., namespaced localStorage)\n }\n\n get<T>(key: string): T | undefined {\n return this.data.get(key) as T | undefined;\n }\n\n set<T>(key: string, value: T): void {\n this.data.set(key, value);\n }\n\n remove(key: string): void {\n this.data.delete(key);\n }\n\n clear(): void {\n this.data.clear();\n }\n\n keys(): string[] {\n return Array.from(this.data.keys());\n }\n\n // Internal: serialize for chart state\n _serialize(): Record<string, unknown> {\n const obj: Record<string, unknown> = {};\n this.data.forEach((v, k) => {\n obj[k] = v;\n });\n return obj;\n }\n\n // Internal: restore from chart state\n _deserialize(data: Record<string, unknown>): void {\n this.data.clear();\n Object.entries(data).forEach(([k, v]) => {\n this.data.set(k, v);\n });\n }\n}\n\n// ============================================\n// Plugin Logger Implementation\n// ============================================\n\nclass PluginLoggerImpl implements PluginLogger {\n private prefix: string;\n private enabled: boolean;\n\n constructor(pluginName: string, enabled = true) {\n this.prefix = `[SciChartEngine:${pluginName}]`;\n this.enabled = enabled;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.enabled) {\n console.debug(this.prefix, message, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.enabled) {\n console.info(this.prefix, message, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n console.warn(this.prefix, message, ...args);\n }\n\n error(message: string, ...args: unknown[]): void {\n console.error(this.prefix, message, ...args);\n }\n}\n\n// ============================================\n// Event Context Implementation\n// ============================================\n\nclass EventContextImpl implements EventContext {\n private chart: Chart;\n private subscriptions: Array<() => void> = [];\n private customListeners = new Map<string, Set<(data: unknown) => void>>();\n\n constructor(chart: Chart) {\n this.chart = chart;\n }\n\n on<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): () => void {\n this.chart.on(event, handler);\n const unsubscribe = () => this.chart.off(event, handler);\n this.subscriptions.push(unsubscribe);\n return unsubscribe;\n }\n\n once<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): () => void {\n const wrapped = (data: ChartEventMap[K]) => {\n handler(data);\n this.chart.off(event, wrapped);\n };\n this.chart.on(event, wrapped);\n return () => this.chart.off(event, wrapped);\n }\n\n emit(event: string, data?: unknown): void {\n const listeners = this.customListeners.get(event);\n if (listeners) {\n listeners.forEach((handler) => {\n try {\n handler(data);\n } catch (e) {\n console.error(`[SciChartEngine] Error in plugin event handler for \"${event}\":`, e);\n }\n });\n }\n }\n\n onPlugin(event: string, handler: (data: unknown) => void): () => void {\n if (!this.customListeners.has(event)) {\n this.customListeners.set(event, new Set());\n }\n this.customListeners.get(event)!.add(handler);\n return () => {\n this.customListeners.get(event)?.delete(handler);\n };\n }\n\n // Internal: cleanup all subscriptions\n _cleanup(): void {\n this.subscriptions.forEach((unsub) => unsub());\n this.subscriptions = [];\n this.customListeners.clear();\n }\n}\n\n// ============================================\n// UI Context Implementation\n// ============================================\n\nclass UIContextImpl implements UIContext {\n private _container: HTMLDivElement;\n private _theme: ChartTheme;\n private overlays = new Map<string, HTMLDivElement>();\n private notifications: HTMLDivElement | null = null;\n\n constructor(container: HTMLDivElement, theme: ChartTheme) {\n this._container = container;\n this._theme = theme;\n }\n\n get container(): HTMLDivElement {\n return this._container;\n }\n\n get theme(): Readonly<ChartTheme> {\n return this._theme;\n }\n\n updateTheme(theme: ChartTheme): void {\n this._theme = theme;\n }\n\n createOverlay(id: string, options: OverlayOptions = {}): HTMLDivElement {\n if (this.overlays.has(id)) {\n return this.overlays.get(id)!;\n }\n\n const overlay = document.createElement(\"div\");\n overlay.id = `scichart-plugin-${id}`;\n overlay.className = options.className || \"\";\n overlay.style.cssText = `\n position: absolute;\n ${options.position?.top !== undefined ? `top: ${options.position.top};` : \"\"}\n ${options.position?.right !== undefined ? `right: ${options.position.right};` : \"\"}\n ${options.position?.bottom !== undefined ? `bottom: ${options.position.bottom};` : \"\"}\n ${options.position?.left !== undefined ? `left: ${options.position.left};` : \"\"}\n z-index: ${options.zIndex ?? 1000};\n pointer-events: ${options.pointerEvents ? \"auto\" : \"none\"};\n `;\n\n this._container.appendChild(overlay);\n this.overlays.set(id, overlay);\n return overlay;\n }\n\n removeOverlay(id: string): boolean {\n const overlay = this.overlays.get(id);\n if (overlay && overlay.parentNode) {\n overlay.parentNode.removeChild(overlay);\n this.overlays.delete(id);\n return true;\n }\n return false;\n }\n\n getOverlay(id: string): HTMLDivElement | undefined {\n return this.overlays.get(id);\n }\n\n showNotification(message: string, options: NotificationOptions = {}): void {\n const {\n type = \"info\",\n duration = 3000,\n position = \"top-right\",\n } = options;\n\n // Create notifications container if needed\n if (!this.notifications) {\n this.notifications = document.createElement(\"div\");\n this.notifications.className = \"scichart-notifications\";\n this.notifications.style.cssText = `\n position: absolute;\n ${position.includes(\"top\") ? \"top: 10px;\" : \"bottom: 10px;\"}\n ${position.includes(\"right\") ? \"right: 10px;\" : \"left: 10px;\"}\n z-index: 10000;\n display: flex;\n flex-direction: column;\n gap: 8px;\n pointer-events: none;\n `;\n this._container.appendChild(this.notifications);\n }\n\n // Create notification element\n const notification = document.createElement(\"div\");\n notification.className = `scichart-notification scichart-notification-${type}`;\n\n const colors = {\n info: { bg: \"#3b82f6\", text: \"#fff\" },\n success: { bg: \"#22c55e\", text: \"#fff\" },\n warning: { bg: \"#f59e0b\", text: \"#000\" },\n error: { bg: \"#ef4444\", text: \"#fff\" },\n };\n\n const color = colors[type];\n notification.style.cssText = `\n padding: 10px 16px;\n border-radius: 6px;\n background: ${color.bg};\n color: ${color.text};\n font-family: system-ui, sans-serif;\n font-size: 13px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n pointer-events: auto;\n opacity: 0;\n transform: translateX(20px);\n transition: all 0.3s ease;\n `;\n notification.textContent = message;\n\n this.notifications.appendChild(notification);\n\n // Animate in\n requestAnimationFrame(() => {\n notification.style.opacity = \"1\";\n notification.style.transform = \"translateX(0)\";\n });\n\n // Auto-remove\n if (duration > 0) {\n setTimeout(() => {\n notification.style.opacity = \"0\";\n notification.style.transform = \"translateX(20px)\";\n setTimeout(() => notification.remove(), 300);\n }, duration);\n }\n }\n\n // Internal: cleanup all overlays\n _cleanup(): void {\n this.overlays.forEach((overlay) => overlay.remove());\n this.overlays.clear();\n this.notifications?.remove();\n this.notifications = null;\n }\n}\n\n// ============================================\n// Context Builder\n// ============================================\n\nexport interface ContextDependencies {\n chart: Chart;\n container: HTMLDivElement;\n theme: ChartTheme;\n getGL?: () => WebGLRenderingContext | WebGL2RenderingContext | undefined;\n get2DContext?: () => CanvasRenderingContext2D | undefined;\n getPixelRatio: () => number;\n getCanvasSize: () => { width: number; height: number };\n getPlotArea: () => { x: number; y: number; width: number; height: number };\n getViewBounds: () => Bounds;\n getYAxisBounds: (yAxisId?: string) => { yMin: number; yMax: number };\n dataToPixelX: (x: number) => number;\n dataToPixelY: (y: number, yAxisId?: string) => number;\n pixelToDataX: (px: number) => number;\n pixelToDataY: (py: number, yAxisId?: string) => number;\n findNearestPoint?: (px: number, py: number, radius?: number) => PickResult | null;\n getPlugin: (name: string) => ChartPlugin | undefined;\n}\n\n/**\n * Create a complete plugin context from chart dependencies\n */\nexport function createPluginContext(\n pluginName: string,\n deps: ContextDependencies\n): PluginContext & { _cleanup: () => void; _getStorage: () => PluginStorageImpl } {\n const storage = new PluginStorageImpl(pluginName);\n const log = new PluginLoggerImpl(pluginName);\n const events = new EventContextImpl(deps.chart);\n const ui = new UIContextImpl(deps.container, deps.theme);\n\n const render: RenderContext = {\n get gl() {\n return deps.getGL?.();\n },\n get ctx2d() {\n return deps.get2DContext?.();\n },\n get pixelRatio() {\n return deps.getPixelRatio();\n },\n get canvasSize() {\n return deps.getCanvasSize();\n },\n get plotArea() {\n return deps.getPlotArea();\n },\n };\n\n const coords: CoordinateContext = {\n dataToPixelX: deps.dataToPixelX,\n dataToPixelY: deps.dataToPixelY,\n pixelToDataX: deps.pixelToDataX,\n pixelToDataY: deps.pixelToDataY,\n pickPoint: (px, py, radius = 20) => deps.findNearestPoint?.(px, py, radius) ?? null,\n };\n\n const data: DataContext = {\n getAllSeries: () => deps.chart.getAllSeries(),\n getSeries: (id) => deps.chart.getSeries(id),\n getSeriesData: (id) => {\n const series = deps.chart.getSeries(id);\n if (!series) return undefined;\n return series.getData();\n },\n getViewBounds: () => deps.getViewBounds(),\n getYAxisBounds: (yAxisId) => deps.getYAxisBounds(yAxisId),\n getAnnotations: () => deps.chart.getAnnotations(),\n getSelectedPoints: () => deps.chart.getSelectedPoints(),\n };\n\n let animFrameIds = new Set<number>();\n\n const context: PluginContext & { _cleanup: () => void; _getStorage: () => PluginStorageImpl } = {\n chart: deps.chart,\n render,\n coords,\n data,\n ui,\n events,\n storage,\n log,\n\n getPlugin<T extends ChartPlugin>(name: string): T | undefined {\n return deps.getPlugin(name) as T | undefined;\n },\n\n requestRender() {\n deps.chart.render();\n },\n\n requestAnimationFrame(callback: () => void): number {\n const id = window.requestAnimationFrame(callback);\n animFrameIds.add(id);\n return id;\n },\n\n cancelAnimationFrame(id: number): void {\n window.cancelAnimationFrame(id);\n animFrameIds.delete(id);\n },\n\n _cleanup() {\n events._cleanup();\n ui._cleanup();\n animFrameIds.forEach((id) => window.cancelAnimationFrame(id));\n animFrameIds.clear();\n },\n\n _getStorage() {\n return storage;\n },\n };\n\n return context;\n}\n","/**\n * SciChart Engine - Plugin Manager Implementation\n * \n * Manages the lifecycle of plugins including:\n * - Loading and unloading plugins\n * - Dependency resolution\n * - Hook notification\n * - Configuration management\n * \n * @module plugins/PluginManager\n */\n\nimport type { ChartTheme } from \"../theme\";\nimport type {\n ChartPlugin,\n PluginFactory,\n PluginManager,\n PluginManifest,\n PluginContext,\n BeforeRenderEvent,\n AfterRenderEvent,\n ViewChangeEvent,\n SeriesChangeEvent,\n DataUpdateEvent,\n InteractionEvent,\n} from \"./types\";\nimport { createPluginContext, ContextDependencies } from \"./PluginContext\";\n\n// ============================================\n// Plugin Instance Wrapper\n// ============================================\n\ninterface PluginInstance {\n plugin: ChartPlugin;\n context: PluginContext & { _cleanup: () => void; _getStorage: () => any };\n config: unknown;\n initialized: boolean;\n}\n\n// ============================================\n// Plugin Manager Implementation\n// ============================================\n\nexport class PluginManagerImpl implements PluginManager {\n private plugins = new Map<string, PluginInstance>();\n private deps: ContextDependencies;\n private destroyed = false;\n\n // Hook caches for performance\n private hooksBeforeRender: PluginInstance[] = [];\n private hooksAfterRender: PluginInstance[] = [];\n private hooksRenderWebGL: PluginInstance[] = [];\n private hooksRenderOverlay: PluginInstance[] = [];\n private hooksInteraction: PluginInstance[] = [];\n private hooksViewChange: PluginInstance[] = [];\n private hooksDataUpdate: PluginInstance[] = [];\n private hooksSeriesAdd: PluginInstance[] = [];\n private hooksSeriesRemove: PluginInstance[] = [];\n private hooksSeriesChange: PluginInstance[] = [];\n private hooksResize: PluginInstance[] = [];\n private hooksThemeChange: PluginInstance[] = [];\n private hooksSelectionChange: PluginInstance[] = [];\n private hooksSerialize: PluginInstance[] = [];\n\n constructor(dependencies: ContextDependencies) {\n this.deps = dependencies;\n }\n\n /**\n * Register and initialize a plugin\n */\n async use<TConfig>(\n pluginOrFactory: ChartPlugin<TConfig> | PluginFactory<TConfig>,\n config?: TConfig\n ): Promise<void> {\n if (this.destroyed) {\n console.warn(\"[SciChartEngine] Cannot add plugin to destroyed manager\");\n return;\n }\n\n // Resolve factory to plugin instance\n const plugin = typeof pluginOrFactory === \"function\"\n ? pluginOrFactory(config)\n : pluginOrFactory;\n\n const name = plugin.manifest.name;\n\n // Check if already registered\n if (this.plugins.has(name)) {\n console.warn(`[SciChartEngine] Plugin \"${name}\" is already registered`);\n return;\n }\n\n // Validate dependencies\n const missing = await this.checkDependencies(plugin.manifest);\n if (missing.length > 0) {\n console.error(\n `[SciChartEngine] Plugin \"${name}\" requires plugins: ${missing.join(\", \")}`\n );\n return;\n }\n\n // Create context for this plugin\n const context = createPluginContext(name, {\n ...this.deps,\n getPlugin: (n) => this.get(n),\n });\n\n const instance: PluginInstance = {\n plugin,\n context,\n config,\n initialized: false,\n };\n\n this.plugins.set(name, instance);\n\n // Initialize plugin\n try {\n const initResult = plugin.onInit?.(context, config);\n if (initResult instanceof Promise) {\n await initResult;\n }\n instance.initialized = true;\n } catch (e) {\n console.error(`[SciChartEngine] Failed to initialize plugin \"${name}\":`, e);\n this.plugins.delete(name);\n context._cleanup();\n return;\n }\n\n // Update hook caches\n this.rebuildHookCaches();\n }\n\n /**\n * Remove a plugin\n */\n async remove(name: string): Promise<boolean> {\n const instance = this.plugins.get(name);\n if (!instance) {\n return false;\n }\n\n // Check if other plugins depend on this one\n const dependents = this.findDependents(name);\n if (dependents.length > 0) {\n console.warn(\n `[SciChartEngine] Cannot remove plugin \"${name}\", required by: ${dependents.join(\", \")}`\n );\n return false;\n }\n\n try {\n instance.plugin.onDestroy?.(instance.context);\n } catch (e) {\n console.error(`[SciChartEngine] Error destroying plugin \"${name}\":`, e);\n }\n\n instance.context._cleanup();\n this.plugins.delete(name);\n this.rebuildHookCaches();\n\n return true;\n }\n\n /**\n * Get a plugin instance\n */\n get<T extends ChartPlugin = ChartPlugin>(name: string): T | undefined {\n const instance = this.plugins.get(name);\n return instance?.plugin as T | undefined;\n }\n\n /**\n * Check if a plugin is loaded\n */\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * Get all loaded plugin names\n */\n getNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * Get all loaded plugin manifests\n */\n getManifests(): PluginManifest[] {\n return Array.from(this.plugins.values()).map((i) => i.plugin.manifest);\n }\n\n /**\n * Update plugin configuration\n */\n configure<TConfig>(name: string, config: TConfig): void {\n const instance = this.plugins.get(name);\n if (!instance) {\n console.warn(`[SciChartEngine] Plugin \"${name}\" not found`);\n return;\n }\n\n const oldConfig = instance.config;\n instance.config = config;\n\n try {\n (instance.plugin as ChartPlugin<TConfig>).onConfigChange?.(\n instance.context,\n config,\n oldConfig as TConfig\n );\n } catch (e) {\n console.error(`[SciChartEngine] Error in plugin \"${name}\" config change:`, e);\n }\n }\n\n /**\n * Notify all plugins of a hook event\n */\n notify(hook: string, ...args: unknown[]): void {\n // This is a generic notifier for non-optimized hooks\n this.plugins.forEach((instance) => {\n const handler = (instance.plugin as unknown as Record<string, unknown>)[hook];\n if (typeof handler === \"function\" && instance.initialized) {\n try {\n handler.call(instance.plugin, instance.context, ...args);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" hook \"${hook}\":`,\n e\n );\n }\n }\n });\n }\n\n // ============================================\n // Optimized Hook Notifications\n // ============================================\n\n /**\n * Notify beforeRender hooks\n * Returns false if any plugin wants to skip rendering\n */\n notifyBeforeRender(event: BeforeRenderEvent): boolean {\n for (const instance of this.hooksBeforeRender) {\n try {\n const result = instance.plugin.onBeforeRender!(instance.context, event);\n if (result === false) {\n return false;\n }\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" beforeRender:`,\n e\n );\n }\n }\n return true;\n }\n\n /**\n * Notify afterRender hooks\n */\n notifyAfterRender(event: AfterRenderEvent): void {\n for (const instance of this.hooksAfterRender) {\n try {\n instance.plugin.onAfterRender!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" afterRender:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify WebGL render hooks\n */\n notifyRenderWebGL(event: AfterRenderEvent): void {\n for (const instance of this.hooksRenderWebGL) {\n try {\n instance.plugin.onRenderWebGL!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" renderWebGL:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify overlay render hooks\n */\n notifyRenderOverlay(event: AfterRenderEvent): void {\n for (const instance of this.hooksRenderOverlay) {\n try {\n instance.plugin.onRenderOverlay!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" renderOverlay:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify interaction hooks\n * Returns false if any plugin prevents default\n */\n notifyInteraction(event: InteractionEvent): boolean {\n for (const instance of this.hooksInteraction) {\n try {\n const result = instance.plugin.onInteraction!(instance.context, event);\n if (result === false || event.defaultPrevented) {\n return false;\n }\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" interaction:`,\n e\n );\n }\n }\n return true;\n }\n\n /**\n * Notify view change hooks\n */\n notifyViewChange(event: ViewChangeEvent): void {\n for (const instance of this.hooksViewChange) {\n try {\n instance.plugin.onViewChange!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" viewChange:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify data update hooks\n */\n notifyDataUpdate(event: DataUpdateEvent): void {\n for (const instance of this.hooksDataUpdate) {\n try {\n instance.plugin.onDataUpdate!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" dataUpdate:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify series add hooks\n */\n notifySeriesAdd(event: SeriesChangeEvent): void {\n for (const instance of this.hooksSeriesAdd) {\n try {\n instance.plugin.onSeriesAdd!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" seriesAdd:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify series remove hooks\n */\n notifySeriesRemove(event: SeriesChangeEvent): void {\n for (const instance of this.hooksSeriesRemove) {\n try {\n instance.plugin.onSeriesRemove!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" seriesRemove:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify series change hooks\n */\n notifySeriesChange(event: SeriesChangeEvent): void {\n for (const instance of this.hooksSeriesChange) {\n try {\n instance.plugin.onSeriesChange!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" seriesChange:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify resize hooks\n */\n notifyResize(size: { width: number; height: number }): void {\n for (const instance of this.hooksResize) {\n try {\n instance.plugin.onResize!(instance.context, size);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" resize:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify theme change hooks\n */\n notifyThemeChange(theme: ChartTheme): void {\n // Update UI context theme\n for (const instance of this.plugins.values()) {\n (instance.context.ui as any).updateTheme?.(theme);\n }\n\n for (const instance of this.hooksThemeChange) {\n try {\n instance.plugin.onThemeChange!(instance.context, theme);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" themeChange:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify selection change hooks\n */\n notifySelectionChange(points: readonly import(\"../core/selection\").SelectedPoint[]): void {\n for (const instance of this.hooksSelectionChange) {\n try {\n instance.plugin.onSelectionChange!(instance.context, points);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" selectionChange:`,\n e\n );\n }\n }\n }\n\n /**\n * Collect serialization data from plugins\n */\n collectSerializationData(): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n\n for (const instance of this.hooksSerialize) {\n try {\n const pluginData = instance.plugin.onSerialize!(instance.context);\n if (pluginData !== undefined) {\n data[instance.plugin.manifest.name] = {\n data: pluginData,\n storage: instance.context._getStorage()._serialize(),\n };\n }\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" serialize:`,\n e\n );\n }\n }\n\n return data;\n }\n\n /**\n * Restore plugin data from serialization\n */\n restoreSerializationData(data: Record<string, unknown>): void {\n for (const [name, pluginData] of Object.entries(data)) {\n const instance = this.plugins.get(name);\n if (!instance) continue;\n\n const { data: customData, storage } = pluginData as {\n data: unknown;\n storage: Record<string, unknown>;\n };\n\n // Restore storage\n if (storage) {\n instance.context._getStorage()._deserialize(storage);\n }\n\n // Call deserialize hook\n if (instance.plugin.onDeserialize) {\n try {\n instance.plugin.onDeserialize(instance.context, customData);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${name}\" deserialize:`,\n e\n );\n }\n }\n }\n }\n\n /**\n * Destroy all plugins and cleanup\n */\n destroy(): void {\n if (this.destroyed) return;\n\n // Destroy in reverse order (LIFO)\n const names = Array.from(this.plugins.keys()).reverse();\n for (const name of names) {\n const instance = this.plugins.get(name)!;\n try {\n instance.plugin.onDestroy?.(instance.context);\n } catch (e) {\n console.error(`[SciChartEngine] Error destroying plugin \"${name}\":`, e);\n }\n instance.context._cleanup();\n }\n\n this.plugins.clear();\n this.clearHookCaches();\n this.destroyed = true;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async checkDependencies(manifest: PluginManifest): Promise<string[]> {\n const missing: string[] = [];\n\n if (manifest.dependencies) {\n for (const dep of manifest.dependencies) {\n if (!this.plugins.has(dep)) {\n missing.push(dep);\n }\n }\n }\n\n return missing;\n }\n\n private findDependents(name: string): string[] {\n const dependents: string[] = [];\n\n this.plugins.forEach((instance, pluginName) => {\n const deps = instance.plugin.manifest.dependencies || [];\n if (deps.includes(name)) {\n dependents.push(pluginName);\n }\n });\n\n return dependents;\n }\n\n private rebuildHookCaches(): void {\n const instances = Array.from(this.plugins.values()).filter((i) => i.initialized);\n\n this.hooksBeforeRender = instances.filter((i) => i.plugin.onBeforeRender);\n this.hooksAfterRender = instances.filter((i) => i.plugin.onAfterRender);\n this.hooksRenderWebGL = instances.filter((i) => i.plugin.onRenderWebGL);\n this.hooksRenderOverlay = instances.filter((i) => i.plugin.onRenderOverlay);\n this.hooksInteraction = instances.filter((i) => i.plugin.onInteraction);\n this.hooksViewChange = instances.filter((i) => i.plugin.onViewChange);\n this.hooksDataUpdate = instances.filter((i) => i.plugin.onDataUpdate);\n this.hooksSeriesAdd = instances.filter((i) => i.plugin.onSeriesAdd);\n this.hooksSeriesRemove = instances.filter((i) => i.plugin.onSeriesRemove);\n this.hooksSeriesChange = instances.filter((i) => i.plugin.onSeriesChange);\n this.hooksResize = instances.filter((i) => i.plugin.onResize);\n this.hooksThemeChange = instances.filter((i) => i.plugin.onThemeChange);\n this.hooksSelectionChange = instances.filter((i) => i.plugin.onSelectionChange);\n this.hooksSerialize = instances.filter((i) => i.plugin.onSerialize);\n }\n\n private clearHookCaches(): void {\n this.hooksBeforeRender = [];\n this.hooksAfterRender = [];\n this.hooksRenderWebGL = [];\n this.hooksRenderOverlay = [];\n this.hooksInteraction = [];\n this.hooksViewChange = [];\n this.hooksDataUpdate = [];\n this.hooksSeriesAdd = [];\n this.hooksSeriesRemove = [];\n this.hooksSeriesChange = [];\n this.hooksResize = [];\n this.hooksThemeChange = [];\n this.hooksSelectionChange = [];\n this.hooksSerialize = [];\n }\n}\n","/**\n * SciChart Engine - Global Plugin Registry\n * \n * Provides a global registry for third-party plugins that can be\n * discovered and loaded by name without explicit imports.\n * \n * @module plugins/PluginRegistry\n */\n\nimport type {\n PluginFactory,\n PluginManifest,\n PluginCapability,\n PluginRegistry,\n PluginRegistryEntry,\n} from \"./types\";\n\n// ============================================\n// Global Registry Implementation\n// ============================================\n\nclass PluginRegistryImpl implements PluginRegistry {\n private entries = new Map<string, PluginRegistryEntry>();\n\n /**\n * Register a plugin globally\n */\n register(entry: PluginRegistryEntry): void {\n const name = entry.manifest.name;\n\n if (this.entries.has(name)) {\n console.warn(\n `[SciChartEngine Registry] Plugin \"${name}\" is already registered, overwriting`\n );\n }\n\n this.entries.set(name, entry);\n }\n\n /**\n * Unregister a plugin\n */\n unregister(name: string): boolean {\n const existed = this.entries.has(name);\n this.entries.delete(name);\n return existed;\n }\n\n /**\n * Get a registered plugin factory by name\n */\n get(name: string): PluginFactory | undefined {\n return this.entries.get(name)?.factory;\n }\n\n /**\n * List all registered plugins\n */\n list(): PluginManifest[] {\n return Array.from(this.entries.values()).map((e) => e.manifest);\n }\n\n /**\n * Search plugins by capability\n */\n findByCapability(capability: PluginCapability): PluginManifest[] {\n const results: PluginManifest[] = [];\n\n this.entries.forEach((entry) => {\n if (entry.manifest.provides?.includes(capability)) {\n results.push(entry.manifest);\n }\n });\n\n return results;\n }\n\n /**\n * Search plugins by tag\n */\n findByTag(tag: string): PluginManifest[] {\n const results: PluginManifest[] = [];\n const lowerTag = tag.toLowerCase();\n\n this.entries.forEach((entry) => {\n if (entry.manifest.tags?.some((t) => t.toLowerCase().includes(lowerTag))) {\n results.push(entry.manifest);\n }\n });\n\n return results;\n }\n\n /**\n * Check if a plugin is registered\n */\n has(name: string): boolean {\n return this.entries.has(name);\n }\n\n /**\n * Get plugin count\n */\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.entries.clear();\n }\n}\n\n// ============================================\n// Singleton Instance\n// ============================================\n\nlet registryInstance: PluginRegistryImpl | null = null;\n\n/**\n * Get the global plugin registry singleton\n */\nexport function getPluginRegistry(): PluginRegistry {\n if (!registryInstance) {\n registryInstance = new PluginRegistryImpl();\n }\n return registryInstance;\n}\n\n/**\n * Register a plugin in the global registry\n * Shorthand for getPluginRegistry().register()\n */\nexport function registerPlugin(entry: PluginRegistryEntry): void {\n getPluginRegistry().register(entry);\n}\n\n/**\n * Create a plugin factory with manifest validation\n */\nexport function definePlugin<TConfig = unknown>(\n manifest: PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): PluginFactory<TConfig> {\n return (config?: TConfig) => {\n const plugin = factory(config);\n return {\n ...plugin,\n manifest,\n };\n };\n}\n\n/**\n * Register a plugin from definition\n */\nexport function defineAndRegister<TConfig = unknown>(\n manifest: PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): PluginFactory<TConfig> {\n const pluginFactory = definePlugin(manifest, factory);\n registerPlugin({ manifest, factory: pluginFactory as PluginFactory });\n return pluginFactory;\n}\n\n// ============================================\n// Plugin Discovery Helpers\n// ============================================\n\n/**\n * Load a plugin from the registry by name\n */\nexport async function loadPlugin<TConfig = unknown>(\n name: string,\n config?: TConfig\n): Promise<import(\"./types\").ChartPlugin<TConfig> | undefined> {\n const factory = getPluginRegistry().get(name);\n if (!factory) {\n console.warn(`[SciChartEngine] Plugin \"${name}\" not found in registry`);\n return undefined;\n }\n return factory(config) as import(\"./types\").ChartPlugin<TConfig>;\n}\n\n/**\n * List available plugins by category\n */\nexport function listPluginsByCategory(): Record<PluginCapability, PluginManifest[]> {\n const registry = getPluginRegistry();\n const categories: PluginCapability[] = [\n \"analysis\",\n \"visualization\",\n \"interaction\",\n \"data-source\",\n \"export\",\n \"ui\",\n \"annotation\",\n \"theme\",\n ];\n\n const result: Record<string, PluginManifest[]> = {};\n categories.forEach((cat) => {\n result[cat] = registry.findByCapability(cat);\n });\n\n return result as Record<PluginCapability, PluginManifest[]>;\n}\n\n// ============================================\n// Plugin Validation\n// ============================================\n\n/**\n * Validate a plugin manifest\n */\nexport function validateManifest(manifest: PluginManifest): string[] {\n const errors: string[] = [];\n\n if (!manifest.name) {\n errors.push(\"Missing required field: name\");\n } else if (!/^[@a-z0-9-]+\\/[a-z0-9-]+$|^[a-z0-9-]+$/.test(manifest.name)) {\n errors.push(\n 'Invalid name format. Use lowercase with hyphens, optionally scoped (e.g., \"@org/name\")'\n );\n }\n\n if (!manifest.version) {\n errors.push(\"Missing required field: version\");\n } else if (!/^\\d+\\.\\d+\\.\\d+$/.test(manifest.version)) {\n errors.push(\"Invalid version format. Use semantic versioning (e.g., 1.0.0)\");\n }\n\n if (manifest.dependencies) {\n if (!Array.isArray(manifest.dependencies)) {\n errors.push(\"dependencies must be an array\");\n }\n }\n\n if (manifest.provides) {\n if (!Array.isArray(manifest.provides)) {\n errors.push(\"provides must be an array\");\n }\n }\n\n return errors;\n}\n\n/**\n * Validate a plugin for compatibility\n */\nexport function checkPluginCompatibility(\n manifest: PluginManifest,\n engineVersion: string\n): { compatible: boolean; warnings: string[] } {\n const warnings: string[] = [];\n\n if (manifest.engineVersion) {\n const [reqMajor] = manifest.engineVersion.split(\".\").map(Number);\n const [curMajor] = engineVersion.split(\".\").map(Number);\n\n if (reqMajor > curMajor) {\n return {\n compatible: false,\n warnings: [\n `Plugin requires engine v${manifest.engineVersion}, current is v${engineVersion}`,\n ],\n };\n }\n\n if (reqMajor < curMajor) {\n warnings.push(\n `Plugin was built for engine v${manifest.engineVersion}, may have compatibility issues`\n );\n }\n }\n\n return { compatible: true, warnings };\n}\n","/**\n * SciChart Engine - Plugin System\n * \n * Comprehensive plugin architecture for extending chart functionality.\n * \n * Features:\n * - Complete lifecycle hooks (init, render, data, view, interaction, destroy)\n * - Rich plugin context with access to all chart internals\n * - Plugin storage for persistent state\n * - Dependency management between plugins\n * - Global registry for third-party plugins\n * - Built-in plugins for common use cases\n * \n * @packageDocumentation\n * @module plugins\n */\n\n// ============================================\n// Core Types\n// ============================================\nexport type {\n // Manifest & Metadata\n PluginVersion,\n PluginCapability,\n PluginManifest,\n\n // Context Types\n PluginContext,\n RenderContext,\n CoordinateContext,\n DataContext,\n UIContext,\n EventContext,\n PluginStorage,\n PluginLogger,\n OverlayOptions,\n NotificationOptions,\n PickResult,\n\n // Hook Event Types\n BeforeRenderEvent,\n AfterRenderEvent,\n InteractionEvent,\n ViewChangeEvent,\n SeriesChangeEvent,\n DataUpdateEvent,\n\n // Plugin Types\n ChartPlugin,\n PluginFactory,\n TypedPlugin,\n\n // Manager Types\n PluginManager,\n PluginRegistry,\n PluginRegistryEntry,\n} from \"./types\";\n\n// ============================================\n// Core Implementation\n// ============================================\nexport { createPluginContext } from \"./PluginContext\";\nexport type { ContextDependencies } from \"./PluginContext\";\n\nexport { PluginManagerImpl } from \"./PluginManager\";\n\n// ============================================\n// Registry\n// ============================================\nexport {\n getPluginRegistry,\n registerPlugin,\n definePlugin,\n defineAndRegister,\n loadPlugin,\n listPluginsByCategory,\n validateManifest,\n checkPluginCompatibility,\n} from \"./PluginRegistry\";\n\n// ============================================\n// Built-in Plugins\n// ============================================\nexport {\n // Individual plugins\n CrosshairPlugin,\n StatsPlugin,\n WatermarkPlugin,\n GridHighlightPlugin,\n DataLoggerPlugin,\n DirectionIndicatorPlugin,\n\n // Plugin collection\n BuiltinPlugins,\n\n // Plugin configs\n type CrosshairPluginConfig,\n type StatsPluginConfig,\n type WatermarkPluginConfig,\n type GridHighlightConfig,\n type DataLoggerConfig,\n type DirectionIndicatorConfig,\n} from \"./builtins\";\n\n// ============================================\n// Modular Plugins\n// ============================================\nexport { Plugin3D, type Plugin3DConfig } from \"./3d\";\nexport { PluginGpu, type PluginGpuConfig } from \"./gpu\";\nexport { PluginAnalysis, type PluginAnalysisConfig } from \"./analysis\";\nexport { PluginTools, type PluginToolsConfig } from \"./tools\";\nexport { PluginAnnotations, type PluginAnnotationsConfig } from \"./annotations\";\nexport { PluginStreaming, type PluginStreamingConfig } from \"./streaming\";\nexport { PluginThemeEditor, type PluginThemeEditorConfig } from \"./theme-editor\";\nexport { PluginI18n, type PluginI18nConfig } from \"./i18n\";\nexport { PluginKeyboard, type PluginKeyboardConfig } from \"./keyboard\";\nexport { PluginClipboard, type PluginClipboardConfig } from \"./clipboard\";\nexport { PluginSync, type PluginSyncConfig } from \"./sync\";\nexport { PluginDebug, type PluginDebugConfig } from \"./debug\";\nexport { PluginLoading, type PluginLoadingConfig } from \"./loading\";\n\n// ============================================\n// Helper for creating typed plugins\n// ============================================\n\n/**\n * Helper function to create a plugin with proper typing\n * \n * @example\n * ```typescript\n * const MyPlugin = createPlugin({\n * manifest: {\n * name: 'my-plugin',\n * version: '1.0.0',\n * provides: ['analysis'],\n * },\n * onInit(ctx) {\n * ctx.log.info('Plugin initialized!');\n * },\n * onAfterRender(ctx, event) {\n * // Custom rendering\n * },\n * api: {\n * doSomething() { return 'done'; }\n * }\n * });\n * \n * chart.use(MyPlugin);\n * ```\n */\nexport function createPlugin<TConfig = void, TApi extends Record<string, unknown> = {}>(\n definition: import(\"./types\").ChartPlugin<TConfig> & { api?: TApi }\n): import(\"./types\").ChartPlugin<TConfig> & { api: TApi } {\n return definition as import(\"./types\").ChartPlugin<TConfig> & { api: TApi };\n}\n\n/**\n * Helper function to create a configurable plugin factory\n * \n * @example\n * ```typescript\n * interface MyConfig {\n * color: string;\n * enabled: boolean;\n * }\n * \n * const MyPlugin = createConfigurablePlugin<MyConfig>(\n * {\n * name: 'my-plugin',\n * version: '1.0.0',\n * },\n * (config) => ({\n * onInit(ctx) {\n * ctx.log.info(`Color: ${config?.color}`);\n * }\n * })\n * );\n * \n * chart.use(MyPlugin({ color: 'red', enabled: true }));\n * ```\n */\nexport function createConfigurablePlugin<TConfig = void>(\n manifest: import(\"./types\").PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): import(\"./types\").PluginFactory<TConfig> {\n return (config?: TConfig) => ({\n ...factory(config),\n manifest,\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\";\nimport type { InteractionMode } from \"./InteractionManager\";\nimport { ToolbarOptions, ToolbarButtons } from \"../types\";\n\nexport interface ChartControlsCallbacks {\n onResetZoom: () => void;\n onSetType: (type: \"line\" | \"scatter\" | \"line+scatter\") => void;\n onToggleSmoothing: () => void;\n onTogglePan: (active: boolean) => void;\n onSetMode: (mode: InteractionMode) => void;\n onExport: () => void;\n onAutoScale: () => void;\n onToggleLegend: (visible: boolean) => void;\n onHoverStart: () => void;\n onHoverEnd: () => void;\n}\n\n// ============================================\n// SVG Icons (Plotly-inspired)\n// ============================================\n\nconst ICONS = {\n PAN: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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 BOX_ZOOM: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" stroke-dasharray=\"4 2\"></rect><circle cx=\"9\" cy=\"9\" r=\"3\"></circle><line x1=\"21\" y1=\"21\" x2=\"15\" y2=\"15\"></line></svg>`,\n SELECT: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" stroke-dasharray=\"4 2\"></rect><circle cx=\"8\" cy=\"10\" r=\"1.5\" fill=\"currentColor\"></circle><circle cx=\"12\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"></circle><circle cx=\"16\" cy=\"9\" r=\"1.5\" fill=\"currentColor\"></circle></svg>`,\n DELTA: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke-dasharray=\"4 2\"></line><circle cx=\"4\" cy=\"20\" r=\"2\" fill=\"currentColor\"></circle><circle cx=\"20\" cy=\"4\" r=\"2\" fill=\"currentColor\"></circle><path d=\"M8 16h8M16 16v-8\" stroke-width=\"1\" opacity=\"0.5\"></path></svg>`,\n RESET: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" 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=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg>`,\n BOTH: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 6h16M4 12h16M4 18h7\"></path></svg>`,\n INTEGRATE: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 16c3-9 15-9 18 0\"></path><line x1=\"3\" y1=\"16\" x2=\"21\" y2=\"16\"></line><path d=\"M7 16v-4M12 16V9M17 16v-4\" stroke-width=\"1\" opacity=\"0.5\"></path></svg>`,\n PIN: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"22\"></line><path d=\"M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6a3 3 0 0 0-6 0v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17z\"></path></svg>`,\n PIN_OFF: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\"></line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"22\"></line><path d=\"M9 10.76V6a3 3 0 0 1 1.43-2.54m2.68.74A3 3 0 0 1 15 6v4.76a2 2 0 0 0 1.11 1.79l1.78.9A2 2 0 0 1 19 15.24V17h-2\"></path><path d=\"M5 17h8\"></path></svg>`\n};\n\nexport class ChartControls {\n private container: HTMLDivElement;\n private toolbar: HTMLDivElement;\n private buttonsWrapper: HTMLDivElement;\n private callbacks: ChartControlsCallbacks;\n private theme: ChartTheme;\n private options: ToolbarOptions;\n\n private isSmoothing = false;\n private currentMode: InteractionMode = 'pan';\n private isLegendVisible = true;\n private currentType: \"line\" | \"scatter\" | \"line+scatter\" = \"line\";\n private isPinned = false;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n callbacks: ChartControlsCallbacks,\n options?: ToolbarOptions\n ) {\n this.callbacks = callbacks;\n this.theme = theme;\n this.options = options || {};\n\n this.isPinned = this.options.pinnable === false;\n this.isExpanded = this.isPinned;\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: 2px;\n right: 2px;\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 \n this.buttonsWrapper = document.createElement(\"div\");\n this.buttonsWrapper.style.cssText = `\n display: flex;\n align-items: center;\n gap: 2px;\n overflow: hidden;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n\n this.updateToolbarStyle();\n\n this.createButtons();\n this.toolbar.appendChild(this.buttonsWrapper);\n \n if (this.options.pinnable !== false) {\n this.createPinButton();\n }\n\n this.container.appendChild(this.toolbar);\n parent.appendChild(this.container);\n \n this.updateVisibility();\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 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 // Stop pointer events from reaching the chart, but ALLOW release events\n const stopPropagation = (e: Event) => e.stopPropagation();\n [\"mousedown\", \"mousemove\", \"pointerdown\", \"pointermove\", \"wheel\", \"touchstart\", \"touchmove\"].forEach(\n (evt) => this.container.addEventListener(evt, stopPropagation)\n );\n\n const glassBg = this.theme.toolbar.backgroundColor;\n const glassBorder = `1px solid ${this.theme.toolbar.borderColor}`;\n const borderRadius = `${this.theme.toolbar.borderRadius}px`;\n\n this.toolbar.style.cssText = `\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 0;\n background: ${glassBg};\n backdrop-filter: blur(2px) saturate(180%);\n -webkit-backdrop-filter: blur(2px) saturate(180%);\n border: ${glassBorder};\n border-radius: ${borderRadius};\n box-shadow: ${shadow};\n transition: all 0.3s cubic-bezier(0.4, 0, 0.4, 1);\n `;\n\n this.toolbar.onmouseenter = () => {\n this.toolbar.style.backdropFilter = \"blur(10px) saturate(180%)\";\n (this.toolbar.style as any).webkitBackdropFilter = \"blur(10px) saturate(180%)\";\n \n this.callbacks.onHoverStart();\n \n if (this.options.pinnable !== false) {\n this.isExpanded = true;\n this.updateVisibility();\n }\n };\n this.toolbar.onmouseleave = () => {\n this.toolbar.style.backdropFilter = \"blur(2px) saturate(180%)\";\n (this.toolbar.style as any).webkitBackdropFilter = \"blur(2px) saturate(180%)\";\n \n this.callbacks.onHoverEnd();\n \n if (this.options.pinnable !== false) {\n this.isExpanded = false;\n this.updateVisibility();\n }\n };\n\n }\n\n private updateVisibility(): void {\n if (this.options.pinnable === false) return;\n\n const visible = this.isExpanded || this.isPinned;\n this.buttonsWrapper.style.maxWidth = visible ? \"500px\" : \"0px\";\n this.buttonsWrapper.style.opacity = visible ? \"1\" : \"0\";\n this.buttonsWrapper.style.pointerEvents = visible ? \"auto\" : \"none\";\n this.buttonsWrapper.style.marginRight = visible ? \"4px\" : \"0px\";\n }\n\n private createButtons(): void {\n const b = this.options.buttons || {};\n const show = (id: keyof ToolbarButtons, def = true) => b[id] ?? def;\n\n // Pan Mode\n if (show('pan')) {\n this.createButton(\n ICONS.PAN,\n \"Pan Mode (drag to move)\",\n () => {\n this.currentMode = 'pan';\n this.updateButtonStates();\n this.callbacks.onSetMode('pan');\n },\n \"pan\"\n );\n }\n\n // Box Zoom Mode\n if (show('boxZoom')) {\n this.createButton(\n ICONS.BOX_ZOOM,\n \"Box Zoom (drag to zoom)\",\n () => {\n this.currentMode = 'boxZoom';\n this.updateButtonStates();\n this.callbacks.onSetMode('boxZoom');\n },\n \"boxZoom\"\n );\n }\n\n // Selection Mode\n if (show('select')) {\n this.createButton(\n ICONS.SELECT,\n \"Select Points (drag to select)\",\n () => {\n this.currentMode = 'select';\n this.updateButtonStates();\n this.callbacks.onSetMode('select');\n },\n \"select\"\n );\n }\n\n // Delta Tool Mode\n if (show('delta')) {\n this.createButton(\n ICONS.DELTA,\n \"Delta Tool (measure distances)\",\n () => {\n this.currentMode = 'delta';\n this.updateButtonStates();\n this.callbacks.onSetMode('delta');\n },\n \"delta\"\n );\n }\n\n // Peak integration Mode\n if (show('peak')) {\n this.createButton(\n ICONS.INTEGRATE,\n \"Peak Integration (detect baseline & calculate area)\",\n () => {\n this.currentMode = 'peak';\n this.updateButtonStates();\n this.callbacks.onSetMode('peak');\n },\n \"peak\"\n );\n }\n\n // Reset Zoom\n if (show('reset', false)) {\n this.createButton(\n ICONS.RESET,\n \"Reset Zoom\",\n () => this.callbacks.onResetZoom(),\n \"reset\"\n );\n }\n\n // Auto Scale\n if (show('autoscale')) {\n this.createButton(\n ICONS.AUTOSCALE,\n \"Auto Scale\",\n () => this.callbacks.onAutoScale(),\n \"autoscale\"\n );\n }\n\n // Type Switcher\n if (show('type')) {\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\n // Smoothing\n if (show('smooth')) {\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\n // Export Image\n if (show('export')) {\n this.createButton(\n ICONS.EXPORT,\n \"Export as PNG\",\n () => this.callbacks.onExport(),\n \"export\"\n );\n }\n\n // Toggle Legend\n if (show('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 }\n\n private createPinButton(): void {\n const btn = this.createButton(\n this.isPinned ? ICONS.PIN : ICONS.PIN_OFF,\n this.isPinned ? \"Unpin Toolbar\" : \"Pin Toolbar\",\n () => {\n this.isPinned = !this.isPinned;\n btn.innerHTML = `<span class=\"scichart-control-icon\">${this.isPinned ? ICONS.PIN : ICONS.PIN_OFF}</span>`;\n this.enforceSVGVisibility(btn);\n this.updateVisibility();\n },\n \"pin\",\n this.toolbar\n );\n btn.style.marginLeft = \"2px\";\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 parent: HTMLElement = this.buttonsWrapper\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 parent.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 panActiveColor = \"#38bdf8\"; // Brighter blue for pan\n const zoomActiveColor = \"#f59e0b\"; // Orange for box zoom\n const selectActiveColor = \"#a855f7\"; // Purple for selection\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 // Mode buttons (pan, boxZoom, select) - only one can be active\n if (id === \"pan\") {\n const isActive = this.currentMode === 'pan';\n btn.style.color = isActive ? panActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(56, 189, 248, 0.15)\" : \"rgba(56, 189, 248, 0.1)\")\n : \"transparent\";\n } else if (id === \"boxZoom\") {\n const isActive = this.currentMode === 'boxZoom';\n btn.style.color = isActive ? zoomActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(245, 158, 11, 0.15)\" : \"rgba(245, 158, 11, 0.1)\")\n : \"transparent\";\n } else if (id === \"select\") {\n const isActive = this.currentMode === 'select';\n btn.style.color = isActive ? selectActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(168, 85, 247, 0.15)\" : \"rgba(168, 85, 247, 0.1)\")\n : \"transparent\";\n } else if (id === \"delta\") {\n const isActive = this.currentMode === 'delta';\n const deltaActiveColor = \"#ef4444\"; // Red for delta\n btn.style.color = isActive ? deltaActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(239, 68, 68, 0.15)\" : \"rgba(239, 68, 68, 0.1)\")\n : \"transparent\";\n } else if (id === \"peak\") {\n const isActive = this.currentMode === 'peak';\n const peakActiveColor = \"#10b981\"; // Green for peak/integrate\n btn.style.color = isActive ? peakActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(16, 185, 129, 0.15)\" : \"rgba(16, 185, 129, 0.1)\")\n : \"transparent\";\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 } else if (!isHover) {\n btn.style.background = \"transparent\";\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 } else if (!isHover) {\n btn.style.background = \"transparent\";\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 if (!isHover) {\n btn.style.background = \"transparent\";\n }\n } else if (id === \"reset\" || id === \"autoscale\" || id === \"export\") {\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n if (!isHover) {\n btn.style.background = \"transparent\";\n }\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 onResize?: (width: number) => void;\n onInteractionStart?: () => void;\n onInteractionEnd?: () => void;\n onHoverStart?: () => void;\n onHoverEnd?: () => void;\n onSeriesHoverStart?: (series: Series) => void;\n onSeriesHoverEnd?: (series: Series) => void;\n onToggleVisibility?: (series: Series) => void;\n}\n\nexport class ChartLegend {\n private container: HTMLDivElement;\n private visualContainer: HTMLDivElement;\n private header: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Series[] = [];\n private callbacks: ChartLegendCallbacks;\n private swatchCanvases = new Map<string, HTMLCanvasElement>();\n\n private isDragging = false;\n private isResizing = false;\n private dragOffsetX = 0;\n private dragOffsetY = 0;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n options: { x?: number; y?: number; width?: number },\n callbacks: ChartLegendCallbacks\n ) {\n this.theme = theme;\n this.callbacks = callbacks;\n\n const width = options.width ?? 120;\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 - 4}px;\n top: ${y - 4}px;\n z-index: 90;\n pointer-events: auto;\n padding: 4px;\n user-select: none;\n `;\n \n // Stop pointer events from reaching the chart, but ALLOW release events to bubble to document for drag logic\n const stopPropagation = (e: Event) => e.stopPropagation();\n [\"mousedown\", \"mousemove\", \"pointerdown\", \"pointermove\", \"wheel\", \"touchstart\", \"touchmove\"].forEach(\n (evt) => this.container.addEventListener(evt, stopPropagation)\n );\n\n this.visualContainer = document.createElement(\"div\");\n this.visualContainer.style.cssText = `\n width: ${width}px;\n border-radius: ${theme.legend.borderRadius}px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n transition: box-shadow 0.2s ease;\n position: relative;\n `;\n this.container.appendChild(this.visualContainer);\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.visualContainer.appendChild(this.header);\n this.visualContainer.appendChild(this.content);\n \n // Resize handle\n const resizeHandle = document.createElement(\"div\");\n resizeHandle.style.cssText = `\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 8px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n `;\n this.visualContainer.appendChild(resizeHandle);\n\n parent.appendChild(this.container);\n\n this.initDragging(resizeHandle);\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 const glassBg = this.theme.legend.backgroundColor;\n const glassBorder = `1px solid ${this.theme.legend.borderColor}`;\n\n this.visualContainer.style.background = glassBg;\n this.visualContainer.style.backdropFilter = \"blur(2px) saturate(180%)\";\n (this.visualContainer.style as any).webkitBackdropFilter =\n \"blur(2px) saturate(180%)\";\n this.visualContainer.style.border = glassBorder;\n this.visualContainer.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 this.container.onmouseenter = () => {\n this.visualContainer.style.backdropFilter = \"blur(10px) saturate(180%)\";\n (this.visualContainer.style as any).webkitBackdropFilter = \"blur(10px) saturate(180%)\";\n if (this.callbacks.onHoverStart) this.callbacks.onHoverStart();\n };\n this.container.onmouseleave = () => {\n this.visualContainer.style.backdropFilter = \"blur(2px) saturate(180%)\";\n (this.visualContainer.style as any).webkitBackdropFilter = \"blur(2px) saturate(180%)\";\n if (this.callbacks.onHoverEnd) this.callbacks.onHoverEnd();\n };\n }\n\n private initDragging(resizeHandle: HTMLDivElement): void {\n let rafId: number | null = null;\n let currentX = 0;\n let currentY = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n\n const rect = this.container.getBoundingClientRect();\n this.dragOffsetX = e.clientX - rect.left;\n this.dragOffsetY = e.clientY - rect.top;\n this.isDragging = true;\n if (this.callbacks.onInteractionStart) this.callbacks.onInteractionStart();\n\n this.container.style.transition = \"none\";\n this.container.style.willChange = \"left, top\";\n this.visualContainer.style.boxShadow = \"0 8px 24px rgba(0,0,0,0.3)\";\n this.container.style.cursor = \"grabbing\";\n\n document.addEventListener(\"mousemove\", onMouseMove, { capture: true });\n document.addEventListener(\"mouseup\", onMouseUp, { capture: true });\n };\n\n const onResizeMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n\n this.isResizing = true;\n this.dragOffsetX = e.clientX; // Store initial mouse X\n this.dragOffsetY = this.visualContainer.clientWidth; // Store initial width\n if (this.callbacks.onInteractionStart) this.callbacks.onInteractionStart();\n\n this.container.style.transition = \"none\";\n this.container.style.cursor = \"ew-resize\";\n document.body.style.cursor = \"ew-resize\";\n\n document.addEventListener(\"mousemove\", onMouseMove, { capture: true });\n document.addEventListener(\"mouseup\", onMouseUp, { capture: true });\n };\n\n const updatePosition = () => {\n const parentRect = this.container.parentElement?.getBoundingClientRect();\n if (!parentRect) return;\n\n if (this.isDragging) {\n let newX = currentX - parentRect.left - this.dragOffsetX;\n let newY = currentY - parentRect.top - this.dragOffsetY;\n\n newX = Math.max(0, Math.min(newX, parentRect.width - this.container.clientWidth));\n newY = Math.max(0, Math.min(newY, parentRect.height - this.container.clientHeight));\n\n this.container.style.left = `${newX}px`;\n this.container.style.top = `${newY}px`;\n } else if (this.isResizing) {\n const deltaX = currentX - this.dragOffsetX;\n const newWidth = Math.max(80, Math.min(600, this.dragOffsetY + deltaX));\n this.visualContainer.style.width = `${newWidth}px`;\n if (this.callbacks.onResize) this.callbacks.onResize(newWidth);\n }\n rafId = null;\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!this.isDragging && !this.isResizing) return;\n currentX = e.clientX;\n currentY = e.clientY;\n if (!rafId) {\n rafId = requestAnimationFrame(updatePosition);\n }\n };\n\n const onMouseUp = () => {\n if (this.isDragging || this.isResizing) {\n if (rafId) cancelAnimationFrame(rafId);\n rafId = null;\n\n if (this.isDragging) {\n const rect = this.container.getBoundingClientRect();\n const parentRect = this.container.parentElement?.getBoundingClientRect();\n if (parentRect) {\n this.callbacks.onMove(rect.left - parentRect.left, rect.top - parentRect.top);\n }\n }\n\n this.isDragging = false;\n this.isResizing = false;\n if (this.callbacks.onInteractionEnd) this.callbacks.onInteractionEnd();\n this.container.style.willChange = \"auto\";\n this.container.style.transition = \"box-shadow 0.2s ease\";\n this.visualContainer.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.15)\";\n this.container.style.cursor = \"auto\";\n document.body.style.cursor = \"auto\";\n }\n document.removeEventListener(\"mousemove\", onMouseMove, { capture: true });\n document.removeEventListener(\"mouseup\", onMouseUp, { capture: true });\n };\n\n this.header.addEventListener(\"mousedown\", onMouseDown);\n resizeHandle.addEventListener(\"mousedown\", onResizeMouseDown);\n\n // Block events from reaching the chart while over the legend\n // but ALLOW propagation when dragging/resizing so the document listeners work\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 \n const stopIfNoDrag = (e: Event) => {\n if (!this.isDragging && !this.isResizing) {\n e.stopPropagation();\n }\n };\n\n this.container.addEventListener(\"mousemove\", stopIfNoDrag);\n this.container.addEventListener(\"pointermove\", stopIfNoDrag);\n this.container.addEventListener(\"pointerdown\", stopIfNoDrag);\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\n this.series.forEach((s) => {\n const item = document.createElement(\"div\");\n item.style.cssText = `\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: ${legend.itemGap * 0.5}px;\n font-family: ${legend.fontFamily};\n font-size: ${legend.fontSize}px;\n color: ${legend.textColor};\n width: 100%;\n overflow: hidden;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n transition: all 0.1s ease;\n `;\n\n item.onmouseenter = () => {\n item.style.background = \"rgba(128, 128, 128, 0.1)\";\n item.style.transform = \"translateX(2px)\";\n if (this.callbacks.onSeriesHoverStart) {\n this.callbacks.onSeriesHoverStart(s);\n }\n };\n item.onmouseleave = () => {\n item.style.background = \"transparent\";\n item.style.transform = \"none\";\n if (this.callbacks.onSeriesHoverEnd) {\n this.callbacks.onSeriesHoverEnd(s);\n }\n };\n\n item.onclick = (e) => {\n e.stopPropagation();\n if (this.callbacks.onToggleVisibility) {\n this.callbacks.onToggleVisibility(s);\n }\n };\n\n // Use a canvas for the swatch to support symbols\n const swatch = document.createElement(\"canvas\");\n this.swatchCanvases.set(s.getId(), swatch);\n this.paintSwatch(swatch, s);\n const label = document.createElement(\"span\");\n label.textContent = s.getName();\n label.title = s.getName(); // Tooltip on hover\n label.style.cssText = `\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n `;\n\n item.appendChild(swatch);\n item.appendChild(label);\n this.content.appendChild(item);\n\n // Initial state sync\n if (!s.isVisible()) {\n item.style.opacity = \"0.5\";\n label.style.color = \"#888888\";\n }\n });\n }\n\n public updateSeriesStyle(s: Series): void {\n const swatch = this.swatchCanvases.get(s.getId());\n if (swatch) {\n this.paintSwatch(swatch, s);\n }\n \n // Also update item look\n this.series.forEach((series, i) => {\n if (series.getId() === s.getId()) {\n const item = this.content.children[i] as HTMLDivElement;\n if (item) {\n const label = item.querySelector(\"span\");\n if (s.isVisible()) {\n item.style.opacity = \"1\";\n if (label) label.style.color = this.theme.legend.textColor;\n } else {\n item.style.opacity = \"0.5\";\n if (label) label.style.color = \"#888888\";\n }\n }\n }\n });\n }\n\n private paintSwatch(swatch: HTMLCanvasElement, s: Series): void {\n const legend = this.theme.legend;\n const dpr = window.devicePixelRatio || 1;\n const size = legend.swatchSize;\n\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) return;\n\n ctx.clearRect(0, 0, swatch.width, swatch.height);\n ctx.scale(dpr, dpr);\n\n const style = s.getStyle();\n const isVisible = s.isVisible();\n const color = isVisible ? (style.color || \"#ff0055\") : \"#888888\";\n const type = s.getType();\n const symbol = style.symbol || \"circle\";\n\n ctx.fillStyle = color;\n ctx.strokeStyle = color;\n ctx.globalAlpha = isVisible ? 1 : 0.6;\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 =\n typeStr === \"scatter\" ||\n typeStr === \"1\" ||\n (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 /**\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 setWidth(width: number): void {\n this.visualContainer.style.width = `${width}px`;\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\";\nimport type { InteractionMode } from \"../InteractionManager\";\n\nexport interface UIContext {\n container: HTMLDivElement;\n theme: ChartTheme;\n showControls: boolean;\n toolbar?: import(\"../../types\").ToolbarOptions;\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 setMode: (mode: InteractionMode) => void;\n onLegendMove: (x: number, y: number) => void;\n onToggleSmoothing: () => void;\n toggleLegend: () => void;\n onInteractionStart?: () => void;\n onInteractionEnd?: () => void;\n onHoverStart?: () => void;\n onHoverEnd?: () => void;\n onSeriesHoverStart?: (series: Series) => void;\n onSeriesHoverEnd?: (series: Series) => void;\n onToggleVisibility?: (series: Series) => 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 onSetMode: (mode) => ctx.setMode(mode),\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 onHoverStart: () => ctx.onHoverStart?.(),\n onHoverEnd: () => ctx.onHoverEnd?.(),\n }, ctx.toolbar);\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 onInteractionStart: () => ctx.onInteractionStart?.(),\n onInteractionEnd: () => ctx.onInteractionEnd?.(),\n onHoverStart: () => ctx.onHoverStart?.(),\n onHoverEnd: () => ctx.onHoverEnd?.(),\n onSeriesHoverStart: (s) => ctx.onSeriesHoverStart?.(s),\n onSeriesHoverEnd: (s) => ctx.onSeriesHoverEnd?.(s),\n onToggleVisibility: (s) => ctx.onToggleVisibility?.(s),\n }\n );\n legend.update(Array.from(ctx.series.values()));\n return legend;\n}\n","/**\n * Chart Initialization Queue\n * \n * Internal system that manages sequential initialization of multiple charts.\n * This is automatically integrated into createChart - no external usage needed.\n */\n\ninterface QueueItem {\n id: string;\n execute: () => void;\n}\n\nclass ChartInitQueueInternal {\n private queue: QueueItem[] = [];\n private isProcessing = false;\n private completedCount = 0;\n private currentChartId: string | null = null;\n private idCounter = 0;\n\n // Delay between chart initializations (ms)\n private readonly INIT_DELAY = 30;\n\n /**\n * Generate a unique chart ID\n */\n generateId(): string {\n return `chart_${++this.idCounter}_${Date.now().toString(36)}`;\n }\n\n /**\n * Add a chart initialization to the queue\n * Returns a promise that resolves when this specific chart can initialize\n */\n enqueue(): Promise<string> {\n const id = this.generateId();\n\n return new Promise((resolve) => {\n this.queue.push({\n id,\n execute: () => resolve(id),\n });\n\n // Start processing if not already\n if (!this.isProcessing) {\n this.processNext();\n }\n });\n }\n\n /**\n * Mark a chart as fully initialized\n * This allows the next chart in queue to proceed\n */\n markComplete(id: string): void {\n if (this.currentChartId === id) {\n this.completedCount++;\n this.currentChartId = null;\n\n // Small delay before processing next chart\n setTimeout(() => this.processNext(), this.INIT_DELAY);\n }\n }\n\n /**\n * Process the next chart in queue\n */\n private processNext(): void {\n if (this.queue.length === 0) {\n this.isProcessing = false;\n this.currentChartId = null;\n return;\n }\n\n this.isProcessing = true;\n const item = this.queue.shift()!;\n this.currentChartId = item.id;\n\n // Execute the initialization callback\n item.execute();\n }\n\n /**\n * Get current queue status\n */\n getStatus(): { pending: number; completed: number; currentId: string | null; isProcessing: boolean } {\n return {\n pending: this.queue.length,\n completed: this.completedCount,\n currentId: this.currentChartId,\n isProcessing: this.isProcessing,\n };\n }\n\n /**\n * Clear the queue (useful for page navigation)\n */\n clear(): void {\n this.queue = [];\n this.isProcessing = false;\n this.currentChartId = null;\n }\n\n /**\n * Reset the queue completely\n */\n reset(): void {\n this.clear();\n this.completedCount = 0;\n this.idCounter = 0;\n }\n}\n\n// Singleton instance - internal use only\nconst globalQueue = new ChartInitQueueInternal();\n\n/**\n * Internal: Wait for turn in initialization queue\n * Returns the assigned chart ID\n */\nexport function waitForInitTurn(): Promise<string> {\n return globalQueue.enqueue();\n}\n\n/**\n * Internal: Mark chart initialization as complete\n */\nexport function markInitComplete(id: string): void {\n globalQueue.markComplete(id);\n}\n\n/**\n * Get queue status (for debugging)\n */\nexport function getInitQueueStatus() {\n return globalQueue.getStatus();\n}\n\n/**\n * Reset the queue (call on page navigation if needed)\n */\nexport function resetInitQueue(): void {\n globalQueue.reset();\n}\n\n// Legacy exports for backwards compatibility\nexport class ChartInitQueue {\n private static instance = globalQueue;\n\n static getStatus() {\n return this.instance.getStatus();\n }\n\n static reset() {\n this.instance.reset();\n }\n}\n\nexport function getChartInitQueue() {\n return {\n getStatus: () => globalQueue.getStatus(),\n reset: () => globalQueue.reset(),\n };\n}\n\n// Legacy compatibility - now does nothing as queue is automatic\nexport async function queueChartInit(_id: string, fn: () => Promise<void>): Promise<void> {\n await fn();\n}\n\nexport function waitForAnimations(durationMs: number = 200): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, durationMs));\n}\n\nexport function resetChartQueue(): void {\n globalQueue.reset();\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 { EventEmitter } from \"../EventEmitter\";\nimport { Series } from \"../Series\";\nimport {\n NativeWebGLRenderer,\n parseColor,\n brightenColor,\n} from \"../../renderer/NativeWebGLRenderer\";\nimport { LinearScale, LogScale, 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 type { Annotation } from \"../annotations\";\nimport {\n SelectionManager,\n type SelectedPoint,\n type SelectionMode,\n type HitTestResult,\n type SelectionConfig,\n} from \"../selection\";\nimport {\n ResponsiveManager,\n type ResponsiveConfig,\n type ResponsiveState,\n} from \"../responsive\";\nimport {\n SERIALIZATION_VERSION,\n encodeFloat32Array,\n decodeFloat32Array,\n stateToUrlHash,\n urlHashToState,\n type ChartState,\n type SerializeOptions,\n type DeserializeOptions,\n} from \"../../serialization\";\n\nimport type { Chart, ExportOptions } from \"./types\";\nimport { exportToCSV, exportToJSON, exportToImage } from \"./ChartExporter\";\nimport { applyZoom, applyPan, type NavigationContext } from \"./ChartNavigation\";\nimport { autoScaleAll, autoScaleYOnly, handleBoxZoom } from \"./ChartScaling\";\nimport {\n AnimationEngine,\n mergeAnimationConfig,\n DEFAULT_ANIMATION_CONFIG,\n type ChartAnimationConfig,\n} from \"../animation\";\nimport {\n applyAnimatedZoom,\n applyAnimatedAutoScale,\n animateToBounds,\n type AnimatedNavigationContext,\n} from \"./ChartAnimatedNavigation\";\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} from \"./ChartSeries\";\nimport {\n initializeChart as setupChart,\n getPlotArea as calculatePlotArea,\n getAxesLayout,\n resizeCanvases,\n pixelToDataX as pxToDataX,\n} from \"./ChartSetup\";\nimport { PluginManagerImpl } from \"../../plugins\";\nimport {\n initControls as createControls,\n initLegend as createLegend,\n} from \"./ChartUI\";\nimport {\n markInitComplete,\n} from \"../ChartInitQueue\";\nimport { PluginLoading } from \"../../plugins/loading\";\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 plotAreaBackground: [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 public theme: ChartTheme;\n public baseTheme: 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 originalSeriesStyles = new Map<string, any>();\n private showControls: boolean;\n private toolbarOptions?: import(\"../../types\").ToolbarOptions;\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 initQueueId: string | null = null;\n private initStarted = false;\n private frameCount = 0;\n private lastRenderTime = performance.now();\n private commandQueue: Array<{ fn: () => void; name: string }> = [];\n private annotationQueue: any[] = [];\n private annotationIdCounter = 0;\n private tooltipConfigQueue: any[] = [];\n private fitLineQueue: any[] = [];\n\n /** Whether the chart has been destroyed */\n get isDestroyed(): boolean {\n return this._isDestroyed;\n }\n\n private selectionRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null = null;\n private pluginManager: PluginManagerImpl;\n private initialOptions: ChartOptions;\n\n get analysis(): any {\n const api = this.getPluginAPI<any>(\"scichart-analysis\");\n if (api) return api;\n \n // Fallback object to prevent crashes while plugin is loading\n return {\n integrate: () => 0,\n detectPeaks: () => [],\n detectCycles: () => [],\n movingAverage: (data: any) => data,\n sma: () => [],\n ema: () => [],\n };\n }\n\n private animationEngine: AnimationEngine;\n private animationConfig: ChartAnimationConfig;\n get animations(): ChartAnimationConfig {\n return this.animationConfig;\n }\n private selectionManager: SelectionManager;\n private responsiveManager: ResponsiveManager;\n\n get tooltip(): any {\n const manager = this.getPluginAPI<any>(\"scichart-tools\")?.getTooltipManager();\n if (manager) return manager;\n \n return {\n configure: (config: any) => {\n this.tooltipConfigQueue.push(config);\n },\n handleCursorMove: () => {},\n handleCursorLeave: () => {},\n setSuspended: () => {},\n updateChartTheme: () => {},\n };\n }\n\n get loading(): any {\n const api = this.getPluginAPI<any>(\"scichart-loading\");\n if (api) return api;\n \n return {\n show: () => {},\n hide: () => {},\n setProgress: () => {},\n setMessage: () => {}\n };\n }\n\n get deltaTool(): any {\n return this.getPluginAPI<any>(\"scichart-tools\")?.getDeltaTool() ?? null;\n }\n\n get peakTool(): any {\n return this.getPluginAPI<any>(\"scichart-tools\")?.getPeakTool() ?? null;\n }\n\n constructor(options: ChartOptions) {\n this.initialOptions = options;\n this.container = options.container;\n\n // 1. Initialize DOM and Theme so we can show UI (like loading) immediately\n const setup = setupChart(this.container, options);\n\n this.baseTheme = setup.theme;\n this.theme = setup.theme;\n this.backgroundColor = setup.backgroundColor;\n this.plotAreaBackground = setup.plotAreaColor;\n this.showLegend = setup.showLegend;\n this.showControls = setup.showControls;\n this.toolbarOptions = options.toolbar;\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 // 2. Initialize Plugin Manager with full bridge (getters handle uninit state)\n this.pluginManager = new PluginManagerImpl({\n chart: this,\n container: this.container,\n theme: this.theme,\n getGL: () => this.renderer?.getGL(),\n get2DContext: () => this.overlayCtx,\n getPixelRatio: () => this.dpr,\n getCanvasSize: () => ({ \n width: this.webglCanvas?.width || 0, \n height: this.webglCanvas?.height || 0 \n }),\n getPlotArea: () => this.getPlotArea(),\n getViewBounds: () => this.viewBounds,\n getYAxisBounds: (yAxisId) => {\n const s = this.yScales?.get(yAxisId || this.primaryYAxisId);\n return { yMin: s?.domain[0] ?? 0, yMax: s?.domain[1] ?? 1 };\n },\n dataToPixelX: (x) => this.xScale?.transform(x) ?? 0,\n dataToPixelY: (y, yAxisId) => (this.yScales?.get(yAxisId || this.primaryYAxisId) || this.yScale)?.transform(y) ?? 0,\n pixelToDataX: (px) => this.pixelToDataX(px),\n pixelToDataY: (py, yAxisId) => this.pixelToDataY(py, yAxisId),\n findNearestPoint: (px, py, radius) => this.selectionManager?.hitTest(px, py, radius) ?? null,\n getPlugin: (name) => this.pluginManager?.get(name) as any\n });\n \n // 3. Show loading indicator INSTANTLY if enabled\n if (options.loading !== false) {\n const loadingConfig = typeof options.loading === 'object' ? options.loading : {\n message: 'Loading SciChart...',\n overlayOpacity: 0.1,\n };\n this.use(PluginLoading({\n ...loadingConfig,\n autoShow: true // Ensure it shows immediately\n }));\n }\n\n // 4. Load initial plugins\n if (options.plugins) {\n options.plugins.forEach(p => this.use(p));\n }\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 `[SciChartEngine] '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.renderer = new NativeWebGLRenderer(this.webglCanvas);\n this.renderer.setDPR(this.dpr);\n this.overlay = new OverlayRenderer(this.overlayCtx, this.theme);\n\n // Initialize selection manager EARLY so plugins can use it for hit-testing\n this.selectionManager = new SelectionManager({\n getSeries: () => this.series,\n getPlotArea: () => this.getPlotArea(),\n getXScale: () => this.xScale,\n getYScales: () => this.yScales,\n getPrimaryYAxisId: () => this.primaryYAxisId,\n events: this.events as any, // SelectionEventMap is a subset of ChartEventMap\n requestRender: () => this.requestRender(),\n });\n\n // Initialize animation system\n this.animationEngine = new AnimationEngine();\n this.animationConfig =\n typeof options.animations === \"boolean\"\n ? { ...DEFAULT_ANIMATION_CONFIG, enabled: options.animations }\n : mergeAnimationConfig(options.animations);\n\n // Initialize responsive manager\n const responsiveConfig =\n typeof options.responsive === \"boolean\"\n ? { enabled: options.responsive }\n : options.responsive;\n this.responsiveManager = new ResponsiveManager(\n {\n container: this.container,\n onStateChange: (state: ResponsiveState) =>\n this.handleResponsiveChange(state),\n },\n responsiveConfig\n );\n\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 // Refresh tool overlays so points follow the zoom\n if (this.deltaTool) this.deltaTool.renderOverlay();\n if (this.peakTool) this.peakTool.renderOverlay();\n },\n onPan: (dx, dy, axisId) => {\n this.pan(dx, dy, axisId);\n // Refresh tool overlays so points follow the pan\n if (this.deltaTool) this.deltaTool.renderOverlay();\n if (this.peakTool) this.peakTool.renderOverlay();\n },\n onBoxZoom: (rect) => this.handleBoxZoom(rect),\n onCursorMove: (x, y) => {\n this.cursorPosition = { x, y };\n if (this.tooltip) {\n this.tooltip.handleCursorMove(x, y);\n }\n this.requestOverlayRender();\n },\n onCursorLeave: () => {\n this.cursorPosition = null;\n if (this.tooltip) {\n this.tooltip.handleCursorLeave();\n }\n this.requestOverlayRender();\n },\n onBoxSelect: (rect, additive) => {\n if (rect) {\n const xScale = this.xScale;\n const yScales = this.yScales;\n const primaryYScale = yScales.get(this.primaryYAxisId);\n\n if (primaryYScale) {\n const dataBounds: Bounds = {\n xMin: xScale.invert(rect.x),\n xMax: xScale.invert(rect.x + rect.width),\n yMin: primaryYScale.invert(rect.y + rect.height),\n yMax: primaryYScale.invert(rect.y),\n };\n\n const hits = this.selectionManager.hitTestRegion(dataBounds);\n if (hits.length > 0) {\n const bySeriesMap = new Map<string, number[]>();\n hits.forEach((hit) => {\n let arr = bySeriesMap.get(hit.seriesId);\n if (!arr) {\n arr = [];\n bySeriesMap.set(hit.seriesId, arr);\n }\n arr.push(hit.index);\n });\n\n const pointsToSelect = Array.from(bySeriesMap.entries()).map(\n ([seriesId, indices]) => ({\n seriesId,\n indices,\n })\n );\n\n this.selectionManager.selectPoints(\n pointsToSelect,\n additive ? \"add\" : \"single\"\n );\n } else if (!additive) {\n this.selectionManager.clearSelection();\n }\n }\n }\n // Complete the box selection\n this.selectionManager.completeBoxSelection(additive);\n },\n onBoxSelectUpdate: (pixelX, pixelY) => {\n this.selectionManager.updateBoxSelection(pixelX, pixelY);\n },\n onBoxSelectStart: (pixelX, pixelY) => {\n this.selectionManager.startBoxSelection(pixelX, pixelY);\n },\n onDragStart: () => {\n // Suspend tooltip during any drag operation\n if (this.tooltip) {\n this.tooltip.setSuspended(true);\n }\n },\n onDragEnd: () => {\n // Resume tooltip after drag operation ends\n if (this.tooltip) {\n this.tooltip.setSuspended(false);\n }\n },\n onInteraction: (event) => {\n this.pluginManager.notify(\"onInteraction\", event);\n },\n },\n () => this.getPlotArea(),\n (axisId) => this.getInteractedBounds(axisId),\n () => getAxesLayout(this.yAxisOptionsMap as any)\n );\n\n new ResizeObserver(() => !this.isDestroyed && this.resize()).observe(\n this.container\n );\n this.initControls();\n this.initLegend(options);\n\n // Plugins are now manual - user must call chart.use() or specify them in options\n // This allows for smaller bundles and more explicit control in each example.\n\n\n // NOTE: resize() and startRenderLoop() are now called by startInit()\n // This allows the queue system to control when rendering actually begins\n }\n\n /**\n * Start the chart initialization (called by queue system)\n * This performs the actual render startup that was deferred from constructor\n */\n startInit(): void {\n if (this.initStarted || this._isDestroyed) return;\n this.initStarted = true;\n\n this.resize();\n this.startRenderLoop();\n\n // Process any commands that were queued before initialization\n if (this.commandQueue.length > 0) {\n this.commandQueue.forEach((cmd) => {\n try {\n cmd.fn();\n } catch (err) {\n console.error(\n `[SciChartEngine] Error executing queued command '${cmd.name}':`,\n err\n );\n }\n });\n this.commandQueue = [];\n }\n\n setTimeout(() => !this.isDestroyed && this.resize(), 100);\n }\n\n /**\n * Mark this chart's initialization as complete in the queue\n */\n async completeInit(): Promise<void> {\n if (!this.initQueueId) return;\n\n // Wait for all startup animations (like autoScale) to finish\n // before allowing the next chart to start its heavy initialization.\n await this.animationEngine.waitForIdle();\n\n // Extra safety wait to allow browser to breathe\n await new Promise((r) => setTimeout(r, 60));\n\n if (this.initQueueId) {\n markInitComplete(this.initQueueId);\n this.initQueueId = null;\n }\n }\n\n private executeOrQueue(name: string, fn: () => void): void {\n if (this.initStarted) {\n fn();\n } else {\n this.commandQueue.push({ fn, name });\n }\n }\n\n /**\n * Set the initialization queue ID (internal use)\n */\n setInitQueueId(id: string): void {\n this.initQueueId = id;\n }\n\n private initControls(): void {\n this.controls = createControls({\n container: this.container,\n theme: this.theme,\n showControls: this.showControls,\n toolbar: this.toolbarOptions,\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: boolean) => this.interaction.setPanMode(active),\n setMode: (mode: 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak') => this.setMode(mode),\n onLegendMove: (x: number, y: number) =>\n this.events.emit(\"legendMove\", { x, y }),\n onToggleSmoothing: () => this.toggleSmoothing(),\n toggleLegend: () => this.toggleLegend(),\n onInteractionStart: () => {\n if (this.tooltip) this.tooltip.setSuspended(true);\n },\n onInteractionEnd: () => {\n if (this.tooltip) this.tooltip.setSuspended(false);\n },\n onHoverStart: () => {\n if (this.tooltip) this.tooltip.setSuspended(true);\n },\n onHoverEnd: () => {\n if (this.tooltip) this.tooltip.setSuspended(false);\n },\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 {\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 setMode: (mode) => this.setMode(mode),\n onLegendMove: (x: number, y: number) =>\n this.events.emit(\"legendMove\", { x, y }),\n onToggleSmoothing: () => this.toggleSmoothing(),\n toggleLegend: () => this.toggleLegend(),\n onInteractionStart: () => {\n if (this.tooltip) this.tooltip.setSuspended(true);\n },\n onInteractionEnd: () => {\n if (this.tooltip) this.tooltip.setSuspended(false);\n },\n onHoverStart: () => {\n if (this.tooltip) this.tooltip.setSuspended(true);\n },\n onHoverEnd: () => {\n if (this.tooltip) this.tooltip.setSuspended(false);\n },\n onSeriesHoverStart: (s) => {\n const original = s.getStyle();\n this.originalSeriesStyles.set(s.getId(), { ...original });\n \n const newColor = brightenColor(original.color || \"#ff0055\", this.theme.isDark);\n s.setStyle({ \n color: newColor \n });\n this.legend?.updateSeriesStyle(s);\n this.requestRender();\n },\n onSeriesHoverEnd: (s) => {\n const original = this.originalSeriesStyles.get(s.getId());\n if (original) {\n s.setStyle(original);\n this.originalSeriesStyles.delete(s.getId());\n this.legend?.updateSeriesStyle(s);\n this.requestRender();\n }\n },\n onToggleVisibility: (s) => {\n s.setVisible(!s.isVisible());\n this.legend?.updateSeriesStyle(s);\n this.requestRender();\n },\n },\n options\n );\n }\n\n setTheme(theme: string | ChartTheme): void {\n this.baseTheme = typeof theme === \"string\" ? getThemeByName(theme) : theme;\n this.theme = this.responsiveManager.scaleTheme(this.baseTheme);\n \n const bgColor = parseColor(this.theme.backgroundColor);\n this.backgroundColor = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n \n const paColor = parseColor(this.theme.plotAreaBackground);\n this.plotAreaBackground = [paColor[0], paColor[1], paColor[2], paColor[3]];\n\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\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 autoScaleYOnly: () => this.autoScaleYOnly(),\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(\"onSeriesAdd\", 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 this.recalculateTools();\n }\n appendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void {\n appendDataImpl(this.getSeriesContext(), id, x, y);\n this.recalculateTools();\n const series = this.series.get(id);\n if (series) {\n this.pluginManager.notify(\"onDataUpdate\", {\n seriesId: id,\n data: series.getData(),\n });\n }\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 /**\n * Add a line of best fit to a series\n */\n addFitLine(seriesId: string, type: any, options?: any): string {\n const api = this.getPluginAPI<any>(\"scichart-analysis\");\n if (api && api.addFitLine) {\n return api.addFitLine(seriesId, type, options);\n }\n \n // Queue the fit line request if plugin not yet loaded\n const id = `fit-${Math.random().toString(36).substr(2, 9)}`;\n this.fitLineQueue.push({ id, seriesId, type, options });\n return id;\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 private getAnimatedNavContext(): AnimatedNavigationContext {\n return {\n ...this.getNavContext(),\n animationEngine: this.animationEngine,\n animationConfig: this.animationConfig,\n };\n }\n\n zoom(options: ZoomOptions & { animate?: boolean }): void {\n if (this.animationConfig.enabled && options.animate !== false) {\n const animation = applyAnimatedZoom(\n this.getAnimatedNavContext(),\n options\n );\n // Catch animation cancellation errors silently\n if (animation) {\n animation.promise.catch((err) => {\n // Ignore cancellation errors\n if (err.message !== \"Animation cancelled\") {\n console.error(\"[SciChartEngine] Animation error:\", err);\n }\n });\n }\n } else {\n applyZoom(this.getNavContext(), options);\n }\n this.requestRender();\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 }\n getViewBounds(): Bounds {\n return { ...this.viewBounds };\n }\n autoScale(animate: boolean = true): void {\n this.executeOrQueue(\"autoScale\", () => {\n if (this.animationConfig.enabled && animate) {\n const animation = applyAnimatedAutoScale(\n this.getAnimatedNavContext(),\n true\n );\n // Catch animation cancellation errors silently\n if (animation) {\n animation.promise.catch((err) => {\n // Ignore cancellation errors\n if (err.message !== \"Animation cancelled\") {\n console.error(\"[SciChartEngine] Animation error:\", err);\n }\n });\n }\n } else {\n autoScaleAll(this.getNavContext());\n }\n this.requestRender();\n });\n }\n\n /**\n * Auto-scale only Y-axes (keeps X-axis stable)\n * Used during streaming to prevent X-axis shifting\n */\n autoScaleYOnly(): void {\n autoScaleYOnly(this.getNavContext());\n this.requestRender();\n }\n\n /**\n * Animate view bounds to specific target\n */\n animateTo(options: {\n xRange?: [number, number];\n yRange?: [number, number];\n duration?: number;\n easing?: string;\n }): void {\n const animation = animateToBounds(\n this.getAnimatedNavContext(),\n {\n xMin: options.xRange?.[0],\n xMax: options.xRange?.[1],\n yMin: options.yRange?.[0],\n yMax: options.yRange?.[1],\n },\n {\n duration: options.duration,\n easing: options.easing,\n }\n );\n // Catch animation cancellation errors silently\n if (animation) {\n animation.promise.catch((err) => {\n // Ignore cancellation errors\n if (err.message !== \"Animation cancelled\") {\n console.error(\"[SciChartEngine] Animation error:\", err);\n }\n });\n }\n }\n\n /**\n * Get animation configuration\n */\n getAnimationConfig(): ChartAnimationConfig {\n return { ...this.animationConfig };\n }\n\n /**\n * Set animation configuration\n */\n setAnimationConfig(config: Partial<ChartAnimationConfig>): void {\n this.animationConfig = mergeAnimationConfig({\n ...this.animationConfig,\n ...config,\n });\n }\n\n /**\n * Check if animations are currently running\n */\n isAnimating(): boolean {\n return this.animationEngine.isAnimating();\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: any): string {\n const id = annotation.id || `annotation-${++this.annotationIdCounter}`;\n const annWithId = { ...annotation, id };\n\n const api = this.getPluginAPI<any>(\"scichart-annotations\");\n if (api) {\n api.add(annWithId);\n this.requestOverlayRender();\n } else {\n this.annotationQueue.push(annWithId);\n }\n return id;\n }\n\n removeAnnotation(id: string): boolean {\n const api = this.getPluginAPI<any>(\"scichart-annotations\");\n if (api) {\n const result = api.remove(id);\n this.requestOverlayRender();\n return result;\n }\n return false;\n }\n\n updateAnnotation(id: string, updates: Partial<Annotation>): void {\n const api = this.getPluginAPI<any>(\"scichart-annotations\");\n api?.update?.(id, updates);\n this.requestOverlayRender();\n }\n\n getAnnotation(id: string): Annotation | undefined {\n return this.getPluginAPI<any>(\"scichart-annotations\")?.get(id);\n }\n\n getAnnotations(): Annotation[] {\n return this.getPluginAPI<any>(\"scichart-annotations\")?.getAll() ?? [];\n }\n\n clearAnnotations(): void {\n this.getPluginAPI<any>(\"scichart-annotations\")?.clear();\n this.requestOverlayRender();\n }\n\n private getPluginAPI<T>(name: string): T | null {\n const plugin = this.pluginManager.get(name) as any;\n return plugin ? plugin.api : null;\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 // ============================================\n // Axis Management\n // ============================================\n\n /**\n * Add a new Y axis dynamically\n */\n addYAxis(options: AxisOptions): string {\n const existingIds = Array.from(this.yAxisOptionsMap.keys());\n const id = options.id || `y${existingIds.length}`;\n\n if (this.yAxisOptionsMap.has(id)) {\n console.warn(`[SciChartEngine] Y axis with id '${id}' already exists`);\n return id;\n }\n\n const position = options.position || \"right\";\n const fullOptions: AxisOptions = {\n scale: \"linear\",\n auto: true,\n position,\n ...options,\n id,\n };\n\n this.yAxisOptionsMap.set(id, fullOptions);\n\n // Create scale for this axis\n const scale =\n fullOptions.scale === \"log\" ? new LogScale() : new LinearScale();\n this.yScales.set(id, scale);\n\n this.requestRender();\n return id;\n }\n\n /**\n * Remove a Y axis by ID\n */\n removeYAxis(id: string): boolean {\n if (id === this.primaryYAxisId) {\n console.warn(`[SciChartEngine] Cannot remove primary Y axis '${id}'`);\n return false;\n }\n\n if (!this.yAxisOptionsMap.has(id)) {\n return false;\n }\n\n this.yAxisOptionsMap.delete(id);\n this.yScales.delete(id);\n\n // Update any series using this axis\n this.series.forEach((s) => {\n if (s.getYAxisId() === id) {\n // Move to primary axis\n s.setYAxisId(this.primaryYAxisId);\n }\n });\n\n this.requestRender();\n return true;\n }\n\n /**\n * Update Y axis configuration\n */\n updateYAxis(id: string, options: Partial<AxisOptions>): void {\n const existing = this.yAxisOptionsMap.get(id);\n if (!existing) {\n console.warn(`[SciChartEngine] Y axis '${id}' not found`);\n return;\n }\n\n const updated: AxisOptions = { ...existing, ...options, id };\n this.yAxisOptionsMap.set(id, updated);\n\n // Update scale if scale type changed\n if (options.scale && options.scale !== existing.scale) {\n const newScale =\n options.scale === \"log\" ? new LogScale() : new LinearScale();\n const oldScale = this.yScales.get(id);\n if (oldScale) {\n newScale.setDomain(oldScale.domain[0], oldScale.domain[1]);\n }\n this.yScales.set(id, newScale);\n }\n\n this.requestRender();\n }\n\n /**\n * Get Y axis configuration by ID\n */\n getYAxis(id: string): AxisOptions | undefined {\n return this.yAxisOptionsMap.get(id);\n }\n\n /**\n * Get all Y axes configurations\n */\n getAllYAxes(): AxisOptions[] {\n return Array.from(this.yAxisOptionsMap.values());\n }\n\n /**\n * Get the primary Y axis ID\n */\n getPrimaryYAxisId(): string {\n return this.primaryYAxisId;\n }\n\n // ============================================\n // Selection API\n // ============================================\n\n /**\n * Select data points programmatically\n */\n selectPoints(\n points: Array<{ seriesId: string; indices: number[] }>,\n mode?: SelectionMode\n ): void {\n this.selectionManager.selectPoints(points, mode);\n }\n\n /**\n * Get all currently selected points\n */\n getSelectedPoints(): SelectedPoint[] {\n return this.selectionManager.getSelectedPoints();\n }\n\n /**\n * Clear all selections\n */\n clearSelection(): void {\n this.selectionManager.clearSelection();\n }\n\n /**\n * Hit-test at a pixel coordinate\n */\n hitTest(pixelX: number, pixelY: number): HitTestResult | null {\n return this.selectionManager.hitTest(pixelX, pixelY);\n }\n\n /**\n * Check if a specific point is selected\n */\n isPointSelected(seriesId: string, index: number): boolean {\n return this.selectionManager.isPointSelected(seriesId, index);\n }\n\n /**\n * Get selection count\n */\n getSelectionCount(): number {\n return this.selectionManager.getSelectionCount();\n }\n\n /**\n * Configure selection behavior\n */\n configureSelection(config: Partial<SelectionConfig>): void {\n this.selectionManager.configure(config);\n }\n\n /**\n * Set pan mode (true = pan, false = selection)\n * @deprecated Use setMode('pan') or setMode('select') instead\n */\n setPanMode(enabled: boolean): void {\n this.interaction.setPanMode(enabled);\n }\n\n /**\n * Set the interaction mode\n * @param mode - 'pan' for pan/drag, 'boxZoom' for rectangle zoom, 'select' for point selection, 'delta' for measurements\n */\n setMode(mode: 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak'): void {\n const currentMode = this.getMode();\n if (currentMode === mode) return;\n\n // Always clear point selection when changing tool\n this.selectionManager.clearSelection();\n\n // Delegate to tools plugin if available\n const toolsApi = this.getPluginAPI<any>(\"scichart-tools\");\n if (mode === 'delta' || mode === 'peak') {\n if (toolsApi) {\n toolsApi.setMode(mode);\n } else {\n // Plugin not yet loaded - retry after a short delay\n console.info(`[SciChartEngine] Tools plugin not ready, retrying setMode('${mode}')...`);\n setTimeout(() => {\n const api = this.getPluginAPI<any>(\"scichart-tools\");\n if (api) {\n api.setMode(mode);\n } else {\n console.warn(`[SciChartEngine] Tools plugin still not available for mode '${mode}'`);\n }\n }, 100);\n }\n } else if (toolsApi) {\n // Disable tools when switching to non-tool modes\n toolsApi.setMode('none');\n }\n\n this.interaction.setMode(mode);\n }\n\n /**\n * Get the current interaction mode\n */\n getMode(): 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak' {\n return this.interaction.getMode();\n }\n\n /**\n * Get the Delta Tool instance for advanced measurements\n */\n getDeltaTool(): any | null {\n return this.getPluginAPI<any>(\"scichart-tools\")?.getDeltaTool() ?? null;\n }\n\n /**\n * Get the Peak Tool instance for peak integration\n */\n getPeakTool(): any | null {\n return this.getPluginAPI<any>(\"scichart-tools\")?.getPeakTool() ?? null;\n }\n\n // ============================================\n // Responsive Design\n // ============================================\n\n /**\n * Handle responsive state changes\n */\n private handleResponsiveChange(state: ResponsiveState): void {\n // Update theme with scaled values from base theme to avoid cumulative scaling\n this.theme = this.responsiveManager.scaleTheme(this.baseTheme);\n this.overlay.setTheme(this.theme);\n\n // Update selection hit radius\n this.selectionManager.configure({\n hitRadius: this.responsiveManager.getScaledHitRadius(20),\n });\n\n // Update legend visibility based on breakpoint\n if (this.legend) {\n const shouldShow = this.responsiveManager.shouldShowLegend();\n // Legend visibility is handled internally by checking showLegend\n this.showLegend = shouldShow;\n }\n\n // Request render with new responsive settings\n this.requestRender();\n\n // Emit resize event\n this.events.emit(\"resize\", {\n width: state.width,\n height: state.height,\n });\n }\n\n /**\n * Get current responsive state\n */\n getResponsiveState(): ResponsiveState {\n return this.responsiveManager.getState();\n }\n\n /**\n * Configure responsive behavior\n */\n configureResponsive(config: Partial<ResponsiveConfig>): void {\n this.responsiveManager.configure(config);\n }\n\n /**\n * Check if responsive mode is enabled\n */\n isResponsiveEnabled(): boolean {\n return this.responsiveManager.isEnabled();\n }\n\n // ============================================\n // Serialization & Persistence\n // ============================================\n\n /**\n * Export complete chart state\n */\n serialize(options: SerializeOptions = {}): ChartState {\n const { includeData = true, includeAnnotations = true } = options;\n\n const state: ChartState = {\n version: SERIALIZATION_VERSION,\n timestamp: Date.now(),\n viewBounds: { ...this.viewBounds },\n xAxis: {\n id: \"primary-x\",\n position: this.xAxisOptions.position,\n label: this.xAxisOptions.label,\n scale: this.xScale.type,\n min: this.xScale.domain[0],\n max: this.xScale.domain[1],\n auto:\n (this.xScale as any).auto !== undefined\n ? (this.xScale as any).auto\n : true,\n },\n yAxes: Array.from(this.yScales.values()).map((s: any) => ({\n id: s.id || \"y\",\n position: s.position || \"left\",\n label: s.label || \"\",\n scale: s.type,\n min: s.domain[0],\n max: s.domain[1],\n auto: s.auto !== undefined ? s.auto : true,\n })),\n primaryYAxisId: this.primaryYAxisId,\n series: Array.from(this.series.values()).map((s) => ({\n id: s.getId(),\n name: s.getName(),\n type: s.getType(),\n yAxisId: s.getYAxisId(),\n style: s.getStyle(),\n visible: s.isVisible(),\n data: includeData\n ? {\n x: encodeFloat32Array(s.getData().x),\n y: encodeFloat32Array(s.getData().y),\n }\n : { x: \"\", y: \"\" },\n })),\n annotations: includeAnnotations ? this.getAnnotations() : [],\n options: {\n showLegend: this.showLegend,\n showControls: this.showControls,\n showStatistics: this.showStatistics,\n autoScroll: this.autoScroll,\n },\n plugins: this.pluginManager.collectSerializationData(),\n };\n\n return state;\n }\n\n /**\n * Restore chart from saved state\n */\n deserialize(state: ChartState, options: DeserializeOptions = {}): void {\n const { skipData = false, skipAnnotations = false } = options;\n\n // Restore view/axis settings\n this.viewBounds = { ...state.viewBounds };\n this.primaryYAxisId = state.primaryYAxisId;\n\n // Restore Y axes\n state.yAxes.forEach((ax) => {\n this.updateYAxis(ax.id, {\n label: ax.label,\n scale: ax.scale,\n min: ax.min,\n max: ax.max,\n auto: ax.auto,\n });\n });\n\n // Restore series\n if (!skipData) {\n // Clear existing first\n const seriesIds = Array.from(this.series.keys());\n seriesIds.forEach((id) => this.removeSeries(id));\n\n state.series.forEach((s) => {\n this.addSeries({\n id: s.id,\n name: s.name,\n type: s.type,\n yAxisId: s.yAxisId,\n data: {\n x: decodeFloat32Array(s.data.x),\n y: decodeFloat32Array(s.data.y),\n },\n style: s.style as any,\n });\n });\n }\n\n // Restore annotations\n if (!skipAnnotations && state.annotations) {\n this.clearAnnotations();\n state.annotations.forEach((a) => this.addAnnotation(a));\n }\n\n // Restore UI options\n if (state.options) {\n this.showLegend = state.options.showLegend ?? this.showLegend;\n this.showControls = state.options.showControls ?? this.showControls;\n this.showStatistics = state.options.showStatistics ?? this.showStatistics;\n this.autoScroll = state.options.autoScroll ?? this.autoScroll;\n }\n\n // Restore plugin data\n if (state.plugins) {\n this.pluginManager.restoreSerializationData(state.plugins);\n }\n\n this.requestRender();\n }\n\n /**\n * Convert current state to URL-safe hash\n */\n toUrlHash(compress: boolean = true): string {\n return stateToUrlHash(this.serialize({ includeData: true }), compress);\n }\n\n /**\n * Load state from URL hash\n */\n fromUrlHash(hash: string, compressed: boolean = true): void {\n const state = urlHashToState(hash, compressed);\n if (state) {\n this.deserialize(state);\n }\n }\n\n use(plugin: import(\"../../plugins\").ChartPlugin): void {\n this.pluginManager.use(plugin);\n\n // If annotations plugin was just added, process queued annotations\n const annotationsApi = this.getPluginAPI<any>(\"scichart-annotations\");\n if (annotationsApi && this.annotationQueue.length > 0) {\n this.annotationQueue.forEach((a) => annotationsApi.add(a));\n this.annotationQueue = [];\n this.requestOverlayRender();\n }\n\n // Process queued tooltip configurations\n const toolsApi = this.getPluginAPI<any>(\"scichart-tools\");\n if (toolsApi && this.tooltipConfigQueue.length > 0) {\n const manager = toolsApi.getTooltipManager();\n if (manager) {\n this.tooltipConfigQueue.forEach((cfg) => manager.configure(cfg));\n this.tooltipConfigQueue = [];\n }\n }\n\n // Process queued fit lines\n const analysisApi = this.getPluginAPI<any>(\"scichart-analysis\");\n if (analysisApi && this.fitLineQueue.length > 0) {\n this.fitLineQueue.forEach((q) => {\n analysisApi.addFitLine(q.seriesId, q.type, { ...q.options, id: q.id });\n });\n this.fitLineQueue = [];\n }\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.executeOrQueue(\"requestRender\", () => {\n this.needsFullRender = true;\n this.scheduleRenderFrame();\n });\n }\n\n requestOverlayRender(): void {\n this.executeOrQueue(\"requestOverlayRender\", () => {\n this.needsOverlayRender = true;\n this.scheduleRenderFrame();\n });\n }\n\n render(full: boolean = true): void {\n if (!this.initStarted) {\n this.commandQueue.push({ fn: () => this.render(full), name: \"render\" });\n return;\n }\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 renderCtx = {\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 backgroundColor: this.backgroundColor,\n cursorOptions: this.cursorOptions,\n cursorPosition: this.cursorPosition,\n selectionRect: this.selectionRect,\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 selectionManager: this.selectionManager,\n };\n\n const now = performance.now();\n const beforeEvent = {\n timestamp: now,\n deltaTime: now - this.lastRenderTime,\n frameNumber: ++this.frameCount,\n first: !this.initStarted,\n forced: full\n };\n this.lastRenderTime = now;\n\n if (!this.pluginManager.notifyBeforeRender(beforeEvent)) {\n return; // Plugin requested to skip render\n }\n\n if (full) {\n const seriesData = prepareSeriesData(renderCtx, plotArea);\n this.renderer.render(seriesData, {\n bounds: this.viewBounds,\n backgroundColor: this.backgroundColor,\n plotAreaBackground: this.plotAreaBackground,\n plotArea,\n });\n renderOverlay(renderCtx, plotArea, this.yScale);\n } else {\n // Overlay only render\n renderOverlay(renderCtx, plotArea, this.yScale);\n }\n\n const renderTime = performance.now() - start;\n const afterEvent = { ...beforeEvent, renderTime };\n\n this.pluginManager.notifyAfterRender(afterEvent);\n this.pluginManager.notifyRenderOverlay(afterEvent);\n\n this.events.emit(\"render\", {\n fps: 1000 / renderTime,\n frameTime: renderTime,\n });\n }\n\n private pixelToDataX(px: number): number {\n return pxToDataX(px, this.getPlotArea(), this.viewBounds);\n }\n\n private pixelToDataY(py: number, yAxisId?: string): number {\n const scale = this.yScales.get(yAxisId || this.primaryYAxisId) || this.yScale;\n return scale.invert(py);\n }\n\n private startRenderLoop(): void {\n // On-demand render loop - only runs when there's work to do\n // This dramatically improves performance with multiple charts\n this.scheduleRenderFrame();\n }\n\n private scheduleRenderFrame(): void {\n if (this.animationFrameId !== null || this.isDestroyed) return;\n\n this.animationFrameId = requestAnimationFrame(() => {\n this.animationFrameId = null;\n if (this.isDestroyed) return;\n\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\n // If there are animations running, keep the loop going\n if (this.animationEngine.isAnimating()) {\n this.scheduleRenderFrame();\n }\n });\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.animationEngine.destroy();\n this.selectionManager.destroy();\n this.responsiveManager.destroy();\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 this.pluginManager.destroy(); // Destroy all plugins!\n while (this.container.firstChild)\n this.container.removeChild(this.container.firstChild);\n }\n\n private toggleSmoothing(): void {\n this.series.forEach((s) => {\n const style = s.getStyle();\n s.setStyle({ smoothing: (style.smoothing || 0) === 0 ? 0.5 : 0 });\n });\n this.recalculateTools();\n this.requestRender();\n }\n\n private async recalculateTools(): Promise<void> {\n // Clear point selection as indices might be desynced or invalid after data change\n this.selectionManager.clearSelection();\n\n // Wait for ongoing animations (like auto-scale) to finish \n // We wait two frames to give triggered animations a chance to start and register in the engine.\n await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));\n\n if (this.animationEngine.isAnimating()) {\n await this.animationEngine.waitForIdle();\n }\n\n // Refresh measurement tools (Delta and Peak Integration)\n if (this.deltaTool) {\n this.deltaTool.recalculate();\n }\n if (this.peakTool) {\n this.peakTool.recalculate();\n }\n\n this.requestOverlayRender();\n }\n}\n\nimport { waitForInitTurn } from \"../ChartInitQueue\";\n\n/**\n * Create a new chart. Charts are automatically queued for sequential\n * initialization when multiple charts are created on the same page.\n */\nexport function createChart(options: ChartOptions): Chart {\n const chart = new ChartImpl(options);\n\n // Queue for sequential initialization\n waitForInitTurn().then((queueId) => {\n chart.setInitQueueId(queueId);\n\n // If chart was destroyed before queue turn, mark complete immediately\n if (chart.isDestroyed) {\n markInitComplete(queueId);\n return;\n }\n\n // Start the actual rendering\n chart.startInit();\n\n // Wait for initial render and autoScale to complete before allowing next chart\n // completeInit() is async and waits for animationEngine to be idle.\n chart.completeInit();\n });\n\n return chart;\n}\n\n\n\n"],"names":["MARGINS","BufferStore","gl","__publicField","id","data","buffer","currentSize","offsetInBytes","LINE_VERT","LINE_FRAG","POINT_VERT","POINT_FRAG","HEATMAP_VERT","HEATMAP_FRAG","createShader","source","type","shader","error","createProgram","vertSource","fragSource","mode","vertShader","fragShader","program","createProgramBundle","parseColor","color","hex","r","g","b","a","matches","brightenColor","isDarkTheme","h","s","rgbToHsl","newH","newS","newL","nr","ng","nb","hslToRgb","ri","gi","bi","max","min","l","d","hue2rgb","p","q","t","interleaveData","x","y","length","result","i","interleaveStepData","stepCount","resultIdx","prevX","prevY","currX","currY","midX","interleaveBandData","y1","y2","n","idx","xi","calculateUniforms","bounds","dataWidth","dataHeight","scaleX","scaleY","translateX","translateY","renderLine","prog","count","uniforms","width","renderBand","alpha","renderPoints","pointSize","symbol","symbolMap","renderHeatmap","zBounds","texture","renderBar","computeSeriesColor","style","renderFrame","canvas","dpr","programs","series","options","backgroundColor","plotArea","canvasHeight","canvasWidth","pa","yMin","yRange","yScale","yTrans","seriesUniforms","TextureStore","NativeWebGLRenderer","rect","height","LinearScale","value","d0","d1","r0","r1","normalized","pixel","step","niceStep","start","ticks","maxTicks","LogScale","safeMin","safeMax","logMin","logMax","logVal","range","rawStep","magnitude","niceNormalized","createScale","DEFAULT_AXIS_THEME","DEFAULT_GRID_THEME","DEFAULT_LEGEND_THEME","DEFAULT_TOOLBAR_THEME","DEFAULT_CURSOR_THEME","DARK_THEME","MIDNIGHT_THEME","LIGHT_THEME","ELECTROCHEM_THEME","createTheme","base","overrides","getThemeByName","name","DEFAULT_THEME","OverlayRenderer","ctx","theme","xScale","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","cursor","cursorTheme","text","lines","lineHeight","padding","line","tooltipX","tooltipY","isDark","errorStyle","lineWidth","capWidth","showCaps","opacity","direction","yError","errorMinus","errorPlus","yBase","yTop","yBottom","xError","xBase","xRight","xLeft","majorTicks","divisions","minor","j","absVal","precision","str","mantissa","exponent","superscriptMap","unicodeExp","char","InteractionManager","container","callbacks","getPlotArea","getBounds","getAxesLayout","enabled","mouseX","mouseY","axes","zoomX","zoomY","targetAxisId","hitX","zoomFactor","normalizedX","normalizedY","dataX","dataY","MIN_RANGE","MAX_RANGE","nextXMin","nextXMax","nextYMin","nextYMax","nextXRange","nextYRange","newBounds","_b","_a","_d","_c","_f","_e","_h","_g","_j","_i","deltaX","deltaY","wasDragging","touch","DEFAULT_CONFIG","SelectionManager","config","pixelX","pixelY","radius","yScales","hitRadius","hitRadiusSq","nearest","minDistSq","seriesId","axisId","startIdx","searchRadius","startSearch","endSearch","px","py","dx","dy","distSq","results","points","previous","newPoints","indices","indexSet","current","index","ctrlKey","shiftKey","hit","additive","primaryYScale","x1","x2","clampedX1","clampedX2","clampedY1","clampedY2","dataBounds","hits","bySeriesMap","arr","pointsToSelect","containedPoints","seriesMap","seriesColor","boxRect","target","left","right","mid","DEFAULT_BREAKPOINTS","ResponsiveManager","newState","breakpoint","bp","touchOptimized","reducedMotion","touchMultiplier","smallMobile","mobile","tablet","desktop","font","baseSize","baseWidth","baseRadius","SERIALIZATION_VERSION","encodeFloat32Array","float32","bytes","binary","decodeFloat32Array","base64","compressString","compressed","decompressString","decoded","stateToUrlHash","state","compress","json","urlHashToState","hash","e","validateChartState","StateHistory","maxSize","snapshot","exportToCSV","seriesIds","includeHeaders","delimiter","seriesToExport","headers","maxLength","row","exportToJSON","viewBounds","v","exportToImage","webglCanvas","overlayCanvas","showLegend","finalCanvas","bg","applyZoom","hasBars","finalY","scale","oldRange","newRange","factor","offsetPct","sRange","sNewMin","sNewMax","applyPan","moveY","nextMin","nextMax","autoScaleAll","xMin","xMax","yAxisBounds","_","hasValidData","yBounds","MAX_VAL","MIN_VAL","xRange","xPad","opts","yPad","newMin","newMax","autoScaleYOnly","handleBoxZoom","selectionRect","currentRect","zoom","xMinNorm","xMaxNorm","yMaxNorm","yMinNorm","newXMin","newXMax","newYMin","newYMax","easings","c4","c5","AnimationEngine","easingFn","resolve","reject","promise","res","rej","from","to","progress","onUpdate","onComplete","startBounds","targetBounds","anim","promises","originalResolve","originalReject","err","now","completed","elapsed","rawProgress","easedProgress","DEFAULT_ANIMATION_CONFIG","mergeAnimationConfig","sharedEngine","getSharedAnimationEngine","currentZoomAnimation","currentAutoScaleAnimation","applyAnimatedZoom","shouldAnimate","targetXMin","targetXMax","targetYMin","targetYMax","primaryScale","startScaleDomains","startDomain","applyAnimatedAutoScale","animate","primaryBounds","primaryOpts","targetScaleDomains","animateToBounds","finalBounds","prepareSeriesData","seriesData","buf","seriesType","renderType","renderData","stepBuf","stepMode","pointCount","hData","hStyle","w","zMin","zMax","colormapId","bullishBuf","bearishBuf","renderOverlay","leftAxes","rightAxes","calculateSeriesBounds","heatmapData","xValues","yValues","yMax","high","low","xVal","ensureTypedArray","appendTypedArray","existing","newData","combined","applySmoothing","windowSize","len","smoothedY","halfWindow","sum","getYError","minus","plus","getXError","DEFAULT_STYLE","Series","hOpts","update","newX","newY","shift","oldSmooth","visible","val","maxPoints","createRenderer","interleaveBarData","barWidth","halfWidth","yi","x0","y0","calculateBarWidth","minSpacing","spacing","interleaveHeatmapData","z","numCells","v00","v10","v01","v11","getColormap","interleaveCandlestickData","open","close","bullishBody","bearishBody","halfWick","bodyTop","bodyBottom","appendRect","updateSeriesBuffer","stackId","refreshStack","updateHeatmapBuffer","bullish","bearish","colormapName","stackSeries","cumulativeY","yBaseline","addSeries","o","removeSeries","updateSeries","appendData","oldMaxX","currentXRange","dataXRange","setMaxPoints","initializeChart","bgColor","paColor","plotAreaColor","showControls","autoScroll","showStatistics","xAxisOptions","yAxisOptionsMap","primaryYAxisId","axisOpt","isFirst","defaultId","fullOptions","createCanvas","leftAxisCount","rightAxisCount","leftMargin","rightMargin","leftIndex","rightIndex","resizeCanvases","overlayCtx","c","pixelToDataX","PluginStorageImpl","_pluginName","key","obj","k","PluginLoggerImpl","pluginName","message","args","EventContextImpl","chart","event","handler","unsubscribe","wrapped","listeners","unsub","UIContextImpl","overlay","duration","notification","createPluginContext","deps","storage","log","events","ui","render","coords","yAxisId","animFrameIds","callback","PluginManagerImpl","dependencies","pluginOrFactory","plugin","missing","context","instance","initResult","dependents","oldConfig","hook","pluginData","customData","names","manifest","dep","instances","PluginRegistryImpl","entry","existed","capability","tag","lowerTag","registryInstance","getPluginRegistry","registerPlugin","definePlugin","factory","defineAndRegister","pluginFactory","loadPlugin","listPluginsByCategory","registry","categories","cat","validateManifest","errors","checkPluginCompatibility","engineVersion","warnings","reqMajor","curMajor","createPlugin","definition","createConfigurablePlugin","ICONS","ChartControls","parent","shadow","stopPropagation","evt","glassBg","glassBorder","borderRadius","show","def","types","nextIdx","btn","icon","svgEl","svg","title","onClick","buttons","panActiveColor","zoomActiveColor","selectActiveColor","smoothActiveColor","legendActiveColor","normalColor","isHover","isActive","deltaActiveColor","peakActiveColor","ChartLegend","resizeHandle","rafId","currentX","currentY","onMouseDown","onMouseMove","onMouseUp","onResizeMouseDown","updatePosition","parentRect","newWidth","stopIfNoDrag","swatch","isVisible","isArea","bullColor","itemGap","swatchSize","headerHeight","initControls","currentType","mappedType","active","link","initLegend","ChartInitQueueInternal","globalQueue","waitForInitTurn","markInitComplete","ChartInitQueue","getChartInitQueue","queueChartInit","_id","fn","waitForAnimations","durationMs","resetChartQueue","ChartImpl","EventEmitter","setup","setupChart","loadingConfig","PluginLoading","isSupported","responsiveConfig","api","manager","cmd","createControls","createLegend","original","newColor","calculatePlotArea","addSeriesImpl","removeSeriesImpl","updateSeriesImpl","appendDataImpl","setMaxPointsImpl","animation","isFinishing","annotation","annWithId","updates","existingIds","updated","newScale","oldScale","toolsApi","shouldShow","includeData","includeAnnotations","skipData","skipAnnotations","ax","annotationsApi","cfg","analysisApi","full","renderCtx","beforeEvent","renderTime","afterEvent","pxToDataX","createChart","queueId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.core-Crr0-eUV.js","sources":["../src/core/chart/types.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/scales/index.ts","../src/theme/index.ts","../src/core/OverlayRenderer.ts","../src/core/InteractionManager.ts","../src/core/selection/SelectionManager.ts","../src/core/responsive/ResponsiveManager.ts","../src/serialization/index.ts","../src/core/chart/ChartExporter.ts","../src/core/chart/ChartNavigation.ts","../src/core/chart/ChartScaling.ts","../src/core/animation/AnimationEngine.ts","../src/core/chart/ChartAnimatedNavigation.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/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/ChartSetup.ts","../src/plugins/PluginContext.ts","../src/plugins/PluginManager.ts","../src/plugins/PluginRegistry.ts","../src/plugins/index.ts","../src/core/ChartControls.ts","../src/core/ChartLegend.ts","../src/core/chart/ChartUI.ts","../src/core/ChartInitQueue.ts","../src/core/chart/ChartCore.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 AxisOptions,\n} from \"../../types\";\nimport type { Series } from \"../Series\";\nimport type { Annotation } from \"../annotations\";\nimport type { ChartAnimationConfig } from \"../animation\";\n\n// Analysis types moved to plugin\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: any, options?: any): string;\n zoom(options: ZoomOptions & { animate?: boolean }): 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(animate?: boolean): void;\n setTheme(theme: string | object): void;\n /** Access to data analysis utilities */\n /** Access to the current active theme (scaled for responsiveness) */\n readonly theme: any;\n /** Access to the base theme (unscaled) */\n readonly baseTheme: any;\n readonly analysis: any;\n readonly animations: any;\n\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\n // Export methods\n exportCSV(options?: ExportOptions): string;\n exportJSON(options?: ExportOptions): string;\n\n /** Attach a plugin to extend chart functionality */\n use(plugin: ChartPlugin): void;\n\n /** Access to the tooltip system if the plugin is loaded */\n readonly tooltip?: any;\n\n // ============================================\n // Animation API\n // ============================================\n\n /** Animate view bounds to specific target */\n animateTo(options: {\n xRange?: [number, number];\n yRange?: [number, number];\n duration?: number;\n easing?: string;\n }): void;\n /** Get current animation configuration */\n getAnimationConfig(): ChartAnimationConfig;\n /** Update animation configuration */\n setAnimationConfig(config: Partial<ChartAnimationConfig>): void;\n /** Check if any animations are currently running */\n isAnimating(): boolean;\n\n // ============================================\n // Axis Management API\n // ============================================\n\n /** Add a new Y axis dynamically */\n addYAxis(options: AxisOptions): string;\n /** Remove a Y axis by ID */\n removeYAxis(id: string): boolean;\n /** Update Y axis configuration */\n updateYAxis(id: string, options: Partial<AxisOptions>): void;\n /** Get Y axis configuration by ID */\n getYAxis(id: string): AxisOptions | undefined;\n /** Get all Y axes configurations */\n getAllYAxes(): AxisOptions[];\n /** Get the primary Y axis ID */\n getPrimaryYAxisId(): string;\n\n // ============================================\n // Selection API\n // ============================================\n\n /** Select data points programmatically */\n selectPoints(\n points: Array<{ seriesId: string; indices: number[] }>,\n mode?: any\n ): void;\n /** Get all currently selected points */\n getSelectedPoints(): any[];\n /** Clear all selections */\n clearSelection(): void;\n /** Hit-test at a pixel coordinate */\n hitTest(\n pixelX: number,\n pixelY: number\n ): any | null;\n /** Check if a specific point is selected */\n isPointSelected(seriesId: string, index: number): boolean;\n /** Get selection count */\n getSelectionCount(): number;\n /** Configure selection behavior */\n configureSelection(\n config: any\n ): void;\n\n // ============================================\n // Interaction Mode\n // ============================================\n\n /** \n * Set pan mode (true = pan, false = selection) \n * @deprecated Use setMode('pan') or setMode('select') instead\n */\n setPanMode(enabled: boolean): void;\n\n /**\n * Set the interaction mode\n * @param mode - 'pan' for pan/drag, 'boxZoom' for rectangle zoom, 'select' for point selection\n */\n setMode(mode: 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak'): void;\n\n /**\n * Get the current interaction mode\n */\n getMode(): 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak';\n\n /**\n * Get the Delta Tool instance for advanced measurements\n */\n getDeltaTool(): any | null;\n\n /**\n * Get the Peak Tool instance for peak integration\n */\n getPeakTool(): any | null;\n\n // ============================================\n // Responsive Design\n // ============================================\n\n /** Get current responsive state */\n getResponsiveState(): import(\"../responsive\").ResponsiveState;\n /** Configure responsive behavior */\n configureResponsive(\n config: Partial<import(\"../responsive\").ResponsiveConfig>\n ): void;\n /** Check if responsive mode is enabled */\n isResponsiveEnabled(): boolean;\n\n // ============================================\n // Serialization & Persistence\n // ============================================\n\n /** Export complete chart state */\n serialize(\n options?: import(\"../../serialization\").SerializeOptions\n ): import(\"../../serialization\").ChartState;\n /** Restore chart from saved state */\n deserialize(\n state: import(\"../../serialization\").ChartState,\n options?: import(\"../../serialization\").DeserializeOptions\n ): void;\n /** Convert current state to URL-safe hash */\n toUrlHash(compress?: boolean): string;\n /** Load state from URL hash */\n fromUrlHash(hash: string, compressed?: boolean): void;\n\n /** Use a plugin */\n use(plugin: ChartPlugin): void;\n /** Destroy the chart and cleanup resources */\n destroy(): void;\n}\n\nimport { ChartPlugin } from \"../../plugins/types\";\n\nexport type { ChartPlugin };\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","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 brightenColor(color: string, isDarkTheme: boolean = true): string {\n const [r, g, b, a] = parseColor(color);\n const [h, s, l] = rgbToHsl(r, g, b);\n \n /**\n * Smart Contrast Algorithm:\n * 1. Shift Hue (H): Rotate by 43° (0.12) to make it distinct.\n * 2. Boost Saturation (S): Force high vibrance (+0.4) so it looks \"active\".\n * 3. Intelligent Luminance (L):\n * - On DARK backgrounds: If original is dark, jump to bright (0.8). If light, keep it light.\n * - On LIGHT backgrounds: If original is light, jump to deep (0.25). If dark, keep it dark/intense.\n */\n const newH = (h + 0.12) % 1.0;\n const newS = Math.min(1.0, s + 0.4);\n \n let newL;\n if (isDarkTheme) {\n // Dark mode -> High brightness\n newL = l < 0.4 ? 0.8 : Math.min(0.95, l + 0.2);\n } else {\n // Light mode -> High depth\n newL = l > 0.6 ? 0.25 : Math.max(0.1, l - 0.2);\n }\n\n // Ensure reasonable limits\n newL = Math.max(0.15, Math.min(0.9, newL));\n\n const [nr, ng, nb] = hslToRgb(newH, newS, newL);\n \n const ri = Math.round(nr * 255);\n const gi = Math.round(ng * 255);\n const bi = Math.round(nb * 255);\n \n return a < 1 \n ? `rgba(${ri}, ${gi}, ${bi}, ${a})` \n : `rgb(${ri}, ${gi}, ${bi})`;\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0, s = 0, l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return [h, s, l];\n}\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n let r, g, b;\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1/6) return p + (q - p) * 6 * t;\n if (t < 1/2) return q;\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n return [r, g, b];\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 width: number = 1\n): void {\n gl.useProgram(prog.program);\n gl.lineWidth(width);\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 if (options.plotAreaBackground) {\n gl.clearColor(\n options.plotAreaBackground[0],\n options.plotAreaBackground[1],\n options.plotAreaBackground[2],\n options.plotAreaBackground[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\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 (s.style.width ?? 1) * dpr\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 (s.style.width ?? 1) * dpr\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 (s.style.width ?? 1) * dpr\n );\n } else {\n renderLine(\n gl,\n programs.lineProgram,\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.width ?? 1) * dpr\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 getGL(): WebGLRenderingContext {\n return this.gl;\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 * 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 * 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 ToolbarTheme {\n /** Toolbar background color */\n backgroundColor: string;\n /** Border color */\n borderColor: string;\n /** Border radius */\n borderRadius: number;\n}\n\nexport interface ChartTheme {\n /** Theme name */\n name: string;\n /** Whether the theme is dark */\n isDark: boolean;\n /** Background color */\n backgroundColor: string;\n /** Plot area background color */\n plotAreaBackground: 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 /** Toolbar theme */\n toolbar: ToolbarTheme;\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(15, 23, 42, 0.2)\",\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_TOOLBAR_THEME: ToolbarTheme = {\n backgroundColor: \"rgba(15, 23, 42, 0.2)\",\n borderColor: \"rgba(255, 255, 255, 0.08)\",\n borderRadius: 8,\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 isDark: true,\n backgroundColor: \"#0b0e14\",\n plotAreaBackground: \"#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 toolbar: DEFAULT_TOOLBAR_THEME,\n};\n\nexport const MIDNIGHT_THEME: ChartTheme = {\n name: \"midnight\",\n isDark: true,\n backgroundColor: \"#05050a\",\n plotAreaBackground: \"#070715\",\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(5, 5, 15, 0.2)\",\n borderColor: \"rgba(100, 100, 255, 0.4)\",\n },\n toolbar: {\n ...DEFAULT_TOOLBAR_THEME,\n backgroundColor: \"rgba(5, 5, 15, 0.2)\",\n borderColor: \"rgba(100, 100, 255, 0.2)\",\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 isDark: false,\n backgroundColor: \"#ffffff\",\n plotAreaBackground: \"#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.2)\",\n borderColor: \"rgba(0, 0, 0, 0.15)\",\n textColor: \"#222222\",\n },\n toolbar: {\n backgroundColor: \"rgba(255, 255, 255, 0.2)\",\n borderColor: \"rgba(0, 0, 0, 0.05)\",\n borderRadius: 8,\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 isDark: true,\n backgroundColor: \"#0a1628\",\n plotAreaBackground: \"#0d1b2e\",\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.2)\",\n borderColor: \"rgba(30, 136, 229, 0.3)\",\n },\n toolbar: {\n ...DEFAULT_TOOLBAR_THEME,\n backgroundColor: \"rgba(10, 22, 40, 0.2)\",\n borderColor: \"rgba(30, 136, 229, 0.15)\",\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 toolbar: { ...base.toolbar, ...overrides.toolbar },\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 onPointClick?: (\n pixelX: number,\n pixelY: number,\n ctrlKey: boolean,\n shiftKey: boolean\n ) => void;\n onBoxSelect?: (\n rect: { x: number; y: number; width: number; height: number } | null,\n additive: boolean\n ) => void;\n onBoxSelectUpdate?: (pixelX: number, pixelY: number) => void;\n onBoxSelectStart?: (pixelX: number, pixelY: number) => void;\n /** Called when any drag operation starts (pan, box zoom, box select) */\n onDragStart?: () => void;\n /** Called when any drag operation ends */\n onDragEnd?: () => void;\n /** Called for all raw interaction events for plugin processing */\n onInteraction?: (event: import(\"../plugins/types\").InteractionEvent) => 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 type InteractionMode = 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak';\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 isBoxZooming = false;\n private selectionStart = { x: 0, y: 0 };\n private lastMousePos = { x: 0, y: 0 };\n private mode: InteractionMode = 'pan';\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 /**\n * Set the interaction mode\n * @deprecated Use setMode instead\n */\n public setPanMode(enabled: boolean): void {\n this.mode = enabled ? 'pan' : 'select';\n }\n\n /**\n * Set the interaction mode: 'pan', 'boxZoom', or 'select'\n */\n public setMode(mode: InteractionMode): void {\n this.mode = mode;\n }\n\n /**\n * Get the current interaction mode\n */\n public getMode(): InteractionMode {\n return this.mode;\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 hitWidth = 65; // Matches axis spacing\n let hitX: number;\n\n if (axis.position === \"left\") {\n // Left axes: start from (plotArea.x - hitWidth) and go further left with offset\n hitX = plotArea.x - hitWidth - axis.offset;\n } else {\n // Right axes: start from plotArea.x + plotArea.width and go further right with offset\n hitX = plotArea.x + plotArea.width + axis.offset;\n }\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 this.callbacks.onInteraction?.({\n type: \"mousedown\",\n pixelX: mouseX,\n pixelY: mouseY,\n inPlotArea: mouseX >= plotArea.x && mouseX <= plotArea.x + plotArea.width && mouseY >= plotArea.y && mouseY <= plotArea.y + plotArea.height,\n originalEvent: e,\n preventDefault: () => e.preventDefault(),\n defaultPrevented: e.defaultPrevented,\n });\n\n // Check if mouse is in axis area for dragging\n const axes = this.getAxesLayout();\n for (const axis of axes) {\n const hitWidth = 65;\n let hitX: number;\n\n if (axis.position === \"left\") {\n hitX = plotArea.x - hitWidth - axis.offset;\n } else {\n hitX = plotArea.x + plotArea.width + axis.offset;\n }\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 this.callbacks.onDragStart?.();\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 switch (this.mode) {\n case 'pan':\n this.isDragging = true;\n this.panningAxisId = undefined;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"grabbing\";\n this.callbacks.onDragStart?.();\n break;\n case 'boxZoom':\n this.isBoxZooming = true;\n this.selectionStart = { x: mouseX, y: mouseY };\n this.container.style.cursor = \"crosshair\";\n // Start box zoom visual (use same callback as onBoxZoom for consistency)\n this.callbacks.onBoxZoom({ x: mouseX, y: mouseY, width: 0, height: 0 });\n this.callbacks.onDragStart?.();\n break;\n case 'select':\n this.isBoxSelecting = true;\n this.selectionStart = { x: mouseX, y: mouseY };\n this.container.style.cursor = \"crosshair\";\n if (this.callbacks.onBoxSelectStart) {\n this.callbacks.onBoxSelectStart(mouseX, mouseY);\n }\n this.callbacks.onDragStart?.();\n break;\n case 'delta':\n case 'peak':\n // Delta and Peak modes are handled by their respective tools\n // Do nothing here - let the tools handle the events\n this.container.style.cursor = \"crosshair\";\n break;\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 this.callbacks.onInteraction?.({\n type: \"mousemove\",\n pixelX: mouseX,\n pixelY: mouseY,\n inPlotArea: true, // simplified for now\n originalEvent: e,\n preventDefault: () => e.preventDefault(),\n defaultPrevented: e.defaultPrevented,\n });\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.isBoxZooming) {\n // In box zoom mode, update the zoom box\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 } else if (this.isBoxSelecting) {\n // In selection mode, update the selection box\n if (this.callbacks.onBoxSelectUpdate) {\n this.callbacks.onBoxSelectUpdate(mouseX, mouseY);\n }\n }\n }\n\n private handleMouseUp(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 this.callbacks.onInteraction?.({\n type: \"mouseup\",\n pixelX: mouseX,\n pixelY: mouseY,\n inPlotArea: true, // simplified\n originalEvent: e,\n preventDefault: () => e.preventDefault(),\n defaultPrevented: e.defaultPrevented,\n });\n\n if (this.isBoxZooming) {\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\n // Only apply box zoom if significant area was selected\n if (width > 5 && height > 5) {\n this.callbacks.onBoxZoom({ x, y, width, height });\n }\n this.callbacks.onBoxZoom(null); // Signal to apply/clear the box\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\n // Call box select callback if available\n if (this.callbacks.onBoxSelect) {\n this.callbacks.onBoxSelect({ x, y, width, height }, e.shiftKey);\n }\n }\n // Check if we were in a drag operation\n const wasDragging = this.isDragging || this.isBoxSelecting || this.isBoxZooming;\n\n this.isDragging = false;\n this.panningAxisId = undefined;\n this.isBoxSelecting = false;\n this.isBoxZooming = false;\n this.container.style.cursor = \"\";\n\n // Notify drag end if we were dragging\n if (wasDragging) {\n this.callbacks.onDragEnd?.();\n }\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 * SelectionManager - Advanced hit-testing and point selection\n * \n * Provides:\n * - Hit-testing for data points\n * - Single and multi-selection (Ctrl+click)\n * - Box selection (drag rectangle)\n * - Visual highlighting of selected points\n * - Events for selection changes\n */\n\nimport type { Bounds, PlotArea } from \"../../types\";\nimport type { Scale } from \"../../scales\";\nimport type { Series } from \"../series/Series\";\nimport type { EventEmitter } from \"../EventEmitter\";\n\n// ============================================\n// Selection Types\n// ============================================\n\n/** Represents a single selected data point */\nexport interface SelectedPoint {\n seriesId: string;\n index: number;\n x: number;\n y: number;\n}\n\n/** Selection mode for multi-select operations */\nexport type SelectionMode = 'single' | 'add' | 'remove' | 'toggle';\n\n/** Event data for point selection changes */\nexport interface PointSelectEvent {\n points: SelectedPoint[];\n mode: SelectionMode;\n source: 'click' | 'box' | 'api';\n}\n\n/** Event data for region/box selection */\nexport interface RegionSelectEvent {\n bounds: Bounds;\n containedPoints: SelectedPoint[];\n}\n\n/** Selection event map */\nexport interface SelectionEventMap {\n pointSelect: PointSelectEvent;\n regionSelect: RegionSelectEvent;\n selectionChange: { selected: SelectedPoint[]; previous: SelectedPoint[] };\n selectionClear: undefined;\n}\n\n/** Hit-test result for a single point */\nexport interface HitTestResult {\n seriesId: string;\n index: number;\n x: number;\n y: number;\n distance: number;\n pixelX: number;\n pixelY: number;\n}\n\n/** Selection manager configuration */\nexport interface SelectionConfig {\n /** Enable selection (default: true) */\n enabled?: boolean;\n /** Maximum distance in pixels for hit-testing (default: 20) */\n hitRadius?: number;\n /** Allow multi-selection with Ctrl+click (default: true) */\n multiSelect?: boolean;\n /** Enable box selection with Shift+drag (default: true) */\n boxSelect?: boolean;\n /** Highlight style for selected points */\n highlightStyle?: {\n color?: string;\n size?: number;\n ringWidth?: number;\n };\n}\n\n/** Context for selection operations */\nexport interface SelectionContext {\n getSeries: () => Map<string, Series>;\n getPlotArea: () => PlotArea;\n getXScale: () => Scale;\n getYScales: () => Map<string, Scale>;\n getPrimaryYAxisId: () => string;\n events: EventEmitter<SelectionEventMap>;\n requestRender: () => void;\n}\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_CONFIG: Required<SelectionConfig> = {\n enabled: true,\n hitRadius: 20,\n multiSelect: true,\n boxSelect: true,\n highlightStyle: {\n color: '#00ffff',\n size: 12,\n ringWidth: 3,\n },\n};\n\n// ============================================\n// SelectionManager Implementation\n// ============================================\n\nexport class SelectionManager {\n private ctx: SelectionContext;\n private config: Required<SelectionConfig>;\n private selected: Map<string, Set<number>> = new Map(); // seriesId -> Set of indices\n private isBoxSelecting: boolean = false;\n private boxStart: { x: number; y: number } | null = null;\n private boxEnd: { x: number; y: number } | null = null;\n\n constructor(ctx: SelectionContext, config?: SelectionConfig) {\n this.ctx = ctx;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n // ============================================\n // Configuration\n // ============================================\n\n configure(config: Partial<SelectionConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n getConfig(): SelectionConfig {\n return { ...this.config };\n }\n\n setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n if (!enabled) {\n this.clearSelection();\n }\n }\n\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n // ============================================\n // Hit Testing\n // ============================================\n\n /**\n * Hit-test at a pixel coordinate to find the nearest data point\n */\n hitTest(pixelX: number, pixelY: number, radius?: number): HitTestResult | null {\n if (!this.config.enabled) return null;\n\n const plotArea = this.ctx.getPlotArea();\n \n // Check if within plot area\n if (\n pixelX < plotArea.x ||\n pixelX > plotArea.x + plotArea.width ||\n pixelY < plotArea.y ||\n pixelY > plotArea.y + plotArea.height\n ) {\n return null;\n }\n\n const xScale = this.ctx.getXScale();\n const yScales = this.ctx.getYScales();\n const series = this.ctx.getSeries();\n const hitRadius = radius ?? this.config.hitRadius;\n const hitRadiusSq = hitRadius * hitRadius;\n\n let nearest: HitTestResult | null = null;\n let minDistSq = Infinity;\n\n series.forEach((s, seriesId) => {\n if (!s.isVisible()) return;\n\n const data = s.getData();\n if (data.x.length === 0) return;\n\n const axisId = s.getYAxisId() || this.ctx.getPrimaryYAxisId();\n const yScale = yScales.get(axisId);\n if (!yScale) return;\n\n // Binary search to find points near the X coordinate\n const dataX = xScale.invert(pixelX);\n const startIdx = this.findNearestIndex(data.x, dataX);\n \n // Check nearby points (search window)\n const searchRadius = 50; // Check points within this many indices\n const startSearch = Math.max(0, startIdx - searchRadius);\n const endSearch = Math.min(data.x.length, startIdx + searchRadius);\n\n for (let i = startSearch; i < endSearch; 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 < minDistSq && distSq <= hitRadiusSq) {\n minDistSq = distSq;\n nearest = {\n seriesId,\n index: i,\n x: data.x[i],\n y: data.y[i],\n distance: Math.sqrt(distSq),\n pixelX: px,\n pixelY: py,\n };\n }\n }\n });\n\n return nearest;\n }\n\n /**\n * Hit-test all points within a rectangular region\n */\n hitTestRegion(bounds: Bounds): HitTestResult[] {\n const results: HitTestResult[] = [];\n if (!this.config.enabled) return results;\n\n const xScale = this.ctx.getXScale();\n const yScales = this.ctx.getYScales();\n const series = this.ctx.getSeries();\n\n series.forEach((s, seriesId) => {\n if (!s.isVisible()) return;\n\n const data = s.getData();\n if (data.x.length === 0) return;\n\n const axisId = s.getYAxisId() || this.ctx.getPrimaryYAxisId();\n const yScale = yScales.get(axisId);\n if (!yScale) return;\n\n for (let i = 0; i < data.x.length; i++) {\n const x = data.x[i];\n const y = data.y[i];\n\n if (x >= bounds.xMin && x <= bounds.xMax && y >= bounds.yMin && y <= bounds.yMax) {\n results.push({\n seriesId,\n index: i,\n x,\n y,\n distance: 0,\n pixelX: xScale.transform(x),\n pixelY: yScale.transform(y),\n });\n }\n }\n });\n\n return results;\n }\n\n // ============================================\n // Selection API\n // ============================================\n\n /**\n * Select specific points programmatically\n */\n selectPoints(\n points: Array<{ seriesId: string; indices: number[] }>,\n mode: SelectionMode = 'single'\n ): void {\n if (!this.config.enabled) return;\n\n const previous = this.getSelectedPoints();\n\n if (mode === 'single') {\n this.selected.clear();\n }\n\n const series = this.ctx.getSeries();\n const newPoints: SelectedPoint[] = [];\n\n points.forEach(({ seriesId, indices }) => {\n const s = series.get(seriesId);\n if (!s) return;\n\n const data = s.getData();\n let indexSet = this.selected.get(seriesId);\n \n if (!indexSet) {\n indexSet = new Set();\n this.selected.set(seriesId, indexSet);\n }\n\n indices.forEach(idx => {\n if (idx < 0 || idx >= data.x.length) return;\n\n if (mode === 'remove') {\n indexSet!.delete(idx);\n } else if (mode === 'toggle') {\n if (indexSet!.has(idx)) {\n indexSet!.delete(idx);\n } else {\n indexSet!.add(idx);\n newPoints.push({\n seriesId,\n index: idx,\n x: data.x[idx],\n y: data.y[idx],\n });\n }\n } else {\n indexSet!.add(idx);\n newPoints.push({\n seriesId,\n index: idx,\n x: data.x[idx],\n y: data.y[idx],\n });\n }\n });\n\n // Clean up empty sets\n if (indexSet.size === 0) {\n this.selected.delete(seriesId);\n }\n });\n\n const current = this.getSelectedPoints();\n\n this.ctx.events.emit('pointSelect', {\n points: newPoints,\n mode,\n source: 'api',\n });\n\n this.ctx.events.emit('selectionChange', {\n selected: current,\n previous,\n });\n\n this.ctx.requestRender();\n }\n\n /**\n * Get all currently selected points\n */\n getSelectedPoints(): SelectedPoint[] {\n const result: SelectedPoint[] = [];\n const series = this.ctx.getSeries();\n\n this.selected.forEach((indices, seriesId) => {\n const s = series.get(seriesId);\n if (!s) return;\n\n const data = s.getData();\n indices.forEach(idx => {\n if (idx < data.x.length) {\n result.push({\n seriesId,\n index: idx,\n x: data.x[idx],\n y: data.y[idx],\n });\n }\n });\n });\n\n return result;\n }\n\n /**\n * Check if a specific point is selected\n */\n isPointSelected(seriesId: string, index: number): boolean {\n return this.selected.get(seriesId)?.has(index) ?? false;\n }\n\n /**\n * Get selected points for a specific series\n */\n getSelectedForSeries(seriesId: string): number[] {\n const indices = this.selected.get(seriesId);\n return indices ? Array.from(indices) : [];\n }\n\n /**\n * Clear all selections\n */\n clearSelection(): void {\n if (this.selected.size === 0) return;\n\n const previous = this.getSelectedPoints();\n this.selected.clear();\n\n this.ctx.events.emit('selectionClear', undefined);\n this.ctx.events.emit('selectionChange', {\n selected: [],\n previous,\n });\n\n this.ctx.requestRender();\n }\n\n /**\n * Get selection count\n */\n getSelectionCount(): number {\n let count = 0;\n this.selected.forEach(indices => {\n count += indices.size;\n });\n return count;\n }\n\n // ============================================\n // Click Handling\n // ============================================\n\n /**\n * Handle click event for selection\n */\n handleClick(pixelX: number, pixelY: number, ctrlKey: boolean, shiftKey: boolean): void {\n if (!this.config.enabled) return;\n\n const hit = this.hitTest(pixelX, pixelY);\n\n if (!hit) {\n // Click on empty space clears selection (unless Ctrl is held)\n if (!ctrlKey && !shiftKey) {\n this.clearSelection();\n }\n return;\n }\n\n let mode: SelectionMode = 'single';\n \n if (ctrlKey && this.config.multiSelect) {\n mode = 'toggle';\n } else if (shiftKey && this.config.multiSelect) {\n mode = 'add';\n }\n\n this.selectPoints(\n [{ seriesId: hit.seriesId, indices: [hit.index] }],\n mode\n );\n }\n\n // ============================================\n // Box Selection\n // ============================================\n\n /**\n * Start box selection\n */\n startBoxSelection(pixelX: number, pixelY: number): void {\n if (!this.config.enabled || !this.config.boxSelect) return;\n\n this.isBoxSelecting = true;\n this.boxStart = { x: pixelX, y: pixelY };\n this.boxEnd = { x: pixelX, y: pixelY };\n }\n\n /**\n * Update box selection during drag\n */\n updateBoxSelection(pixelX: number, pixelY: number): void {\n if (!this.isBoxSelecting) return;\n this.boxEnd = { x: pixelX, y: pixelY };\n this.ctx.requestRender();\n }\n\n /**\n * Complete box selection\n */\n completeBoxSelection(additive: boolean = false): void {\n if (!this.isBoxSelecting || !this.boxStart || !this.boxEnd) {\n this.cancelBoxSelection();\n return;\n }\n\n const plotArea = this.ctx.getPlotArea();\n const xScale = this.ctx.getXScale();\n const yScales = this.ctx.getYScales();\n const primaryYScale = yScales.get(this.ctx.getPrimaryYAxisId());\n \n if (!primaryYScale) {\n this.cancelBoxSelection();\n return;\n }\n\n // Calculate data bounds from pixel coordinates\n const x1 = Math.min(this.boxStart.x, this.boxEnd.x);\n const x2 = Math.max(this.boxStart.x, this.boxEnd.x);\n const y1 = Math.min(this.boxStart.y, this.boxEnd.y);\n const y2 = Math.max(this.boxStart.y, this.boxEnd.y);\n\n // Clamp to plot area\n const clampedX1 = Math.max(x1, plotArea.x);\n const clampedX2 = Math.min(x2, plotArea.x + plotArea.width);\n const clampedY1 = Math.max(y1, plotArea.y);\n const clampedY2 = Math.min(y2, plotArea.y + plotArea.height);\n\n // Convert to data coordinates\n const dataBounds: Bounds = {\n xMin: xScale.invert(clampedX1),\n xMax: xScale.invert(clampedX2),\n yMin: primaryYScale.invert(clampedY2), // Y is inverted\n yMax: primaryYScale.invert(clampedY1),\n };\n\n // Hit test all points in the region\n const hits = this.hitTestRegion(dataBounds);\n \n if (hits.length > 0) {\n // Group hits by series\n const bySeriesMap = new Map<string, number[]>();\n hits.forEach(hit => {\n let arr = bySeriesMap.get(hit.seriesId);\n if (!arr) {\n arr = [];\n bySeriesMap.set(hit.seriesId, arr);\n }\n arr.push(hit.index);\n });\n\n const pointsToSelect = Array.from(bySeriesMap.entries()).map(([seriesId, indices]) => ({\n seriesId,\n indices,\n }));\n\n this.selectPoints(pointsToSelect, additive ? 'add' : 'single');\n\n // Emit region select event\n const containedPoints = this.getSelectedPoints();\n this.ctx.events.emit('regionSelect', {\n bounds: dataBounds,\n containedPoints,\n });\n } else if (!additive) {\n this.clearSelection();\n }\n\n this.cancelBoxSelection();\n }\n\n /**\n * Cancel box selection\n */\n cancelBoxSelection(): void {\n this.isBoxSelecting = false;\n this.boxStart = null;\n this.boxEnd = null;\n this.ctx.requestRender();\n }\n\n /**\n * Check if box selection is active\n */\n isBoxSelectActive(): boolean {\n return this.isBoxSelecting;\n }\n\n /**\n * Get current box selection rectangle (for rendering)\n */\n getBoxSelectionRect(): { x: number; y: number; width: number; height: number } | null {\n if (!this.isBoxSelecting || !this.boxStart || !this.boxEnd) {\n return null;\n }\n\n return {\n x: Math.min(this.boxStart.x, this.boxEnd.x),\n y: Math.min(this.boxStart.y, this.boxEnd.y),\n width: Math.abs(this.boxEnd.x - this.boxStart.x),\n height: Math.abs(this.boxEnd.y - this.boxStart.y),\n };\n }\n\n // ============================================\n // Rendering\n // ============================================\n\n /**\n * Render selected point highlights\n */\n render(ctx: CanvasRenderingContext2D, plotArea: PlotArea): void {\n if (this.selected.size === 0 && !this.isBoxSelecting) return;\n\n const xScale = this.ctx.getXScale();\n const yScales = this.ctx.getYScales();\n const seriesMap = this.ctx.getSeries();\n const style = this.config.highlightStyle;\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 // Draw selection highlights\n this.selected.forEach((indices, seriesId) => {\n const s = seriesMap.get(seriesId);\n if (!s || !s.isVisible()) return;\n\n const data = s.getData();\n const axisId = s.getYAxisId() || this.ctx.getPrimaryYAxisId();\n const yScale = yScales.get(axisId);\n if (!yScale) return;\n\n const seriesColor = s.getStyle().color || '#ff0055';\n\n indices.forEach(idx => {\n if (idx >= data.x.length) return;\n\n const px = xScale.transform(data.x[idx]);\n const py = yScale.transform(data.y[idx]);\n\n // Skip if outside plot area\n if (px < plotArea.x || px > plotArea.x + plotArea.width) return;\n if (py < plotArea.y || py > plotArea.y + plotArea.height) return;\n\n // Outer ring (highlight color)\n ctx.beginPath();\n ctx.arc(px, py, style.size! / 2, 0, Math.PI * 2);\n ctx.strokeStyle = style.color!;\n ctx.lineWidth = style.ringWidth!;\n ctx.stroke();\n\n // Inner fill (series color)\n ctx.beginPath();\n ctx.arc(px, py, style.size! / 2 - style.ringWidth!, 0, Math.PI * 2);\n ctx.fillStyle = seriesColor;\n ctx.fill();\n });\n });\n\n // Draw box selection rectangle\n const boxRect = this.getBoxSelectionRect();\n if (boxRect) {\n ctx.fillStyle = 'rgba(0, 170, 255, 0.2)';\n ctx.strokeStyle = '#00aaff';\n ctx.lineWidth = 1;\n ctx.setLineDash([5, 5]);\n ctx.fillRect(boxRect.x, boxRect.y, boxRect.width, boxRect.height);\n ctx.strokeRect(boxRect.x, boxRect.y, boxRect.width, boxRect.height);\n }\n\n ctx.restore();\n }\n\n // ============================================\n // Helpers\n // ============================================\n\n /**\n * Binary search to find nearest index in sorted array\n */\n private findNearestIndex(arr: Float32Array | Float64Array, target: number): number {\n if (arr.length === 0) return 0;\n if (arr.length === 1) return 0;\n\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 // Check if left-1 is closer\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 * Destroy the selection manager\n */\n destroy(): void {\n this.selected.clear();\n this.cancelBoxSelection();\n }\n}\n","/**\n * ResponsiveManager - Automatic responsive design for charts\n * \n * Provides:\n * - Automatic font scaling based on container size\n * - Tick density adjustment\n * - Point/line size scaling\n * - Touch-optimized hit areas\n * - Breakpoint-based configuration\n */\n\nimport type { ChartTheme } from \"../../theme\";\n\n// ============================================\n// Responsive Types\n// ============================================\n\n/** Breakpoint configuration */\nexport interface ResponsiveBreakpoint {\n /** Maximum width for this breakpoint (undefined = unlimited) */\n maxWidth?: number;\n /** Minimum width for this breakpoint (undefined = 0) */\n minWidth?: number;\n /** Font size multiplier (default: 1) */\n fontScale?: number;\n /** Number of X-axis ticks */\n xTickCount?: number;\n /** Number of Y-axis ticks */\n yTickCount?: number;\n /** Point size multiplier */\n pointScale?: number;\n /** Line width multiplier */\n lineScale?: number;\n /** Hit radius multiplier for touch targets */\n hitRadiusScale?: number;\n /** Whether to show legend */\n showLegend?: boolean;\n /** Legend position override */\n legendPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n}\n\n/** Preset breakpoints */\nexport interface ResponsiveBreakpoints {\n smallMobile?: ResponsiveBreakpoint;\n mobile?: ResponsiveBreakpoint;\n tablet?: ResponsiveBreakpoint;\n desktop?: ResponsiveBreakpoint;\n}\n\n/** Full responsive configuration */\nexport interface ResponsiveConfig {\n /** Enable responsive behavior (default: true) */\n enabled?: boolean;\n /** Custom breakpoints (overrides presets) */\n breakpoints?: ResponsiveBreakpoints;\n /** Optimize for touch interactions (default: auto-detect) */\n touchOptimized?: boolean | 'auto';\n /** Respect user's reduced motion preference (default: true) */\n reducedMotion?: boolean | 'auto';\n /** Debounce time for resize events in ms (default: 100) */\n resizeDebounce?: number;\n}\n\n/** Current responsive state */\nexport interface ResponsiveState {\n /** Current container width */\n width: number;\n /** Current container height */\n height: number;\n /** Active breakpoint name */\n breakpoint: 'smallMobile' | 'mobile' | 'tablet' | 'desktop';\n /** Whether touch is optimized */\n touchOptimized: boolean;\n /** Whether reduced motion is enabled */\n reducedMotion: boolean;\n /** Computed scale factors */\n scales: {\n font: number;\n point: number;\n line: number;\n hitRadius: number;\n };\n /** Computed tick counts */\n ticks: {\n x: number;\n y: number;\n };\n}\n\n/** Context for responsive operations */\nexport interface ResponsiveContext {\n container: HTMLDivElement;\n onStateChange: (state: ResponsiveState) => void;\n}\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_BREAKPOINTS: Required<ResponsiveBreakpoints> = {\n smallMobile: {\n maxWidth: 360,\n fontScale: 0.7,\n xTickCount: 4,\n yTickCount: 3,\n pointScale: 1.3,\n lineScale: 1.5, // Thicker axes for tiny screens\n hitRadiusScale: 1.8,\n showLegend: false,\n },\n mobile: {\n minWidth: 361,\n maxWidth: 480,\n fontScale: 0.8,\n xTickCount: 5,\n yTickCount: 4,\n pointScale: 1.2, // Larger for touch\n lineScale: 1.3,\n hitRadiusScale: 1.5,\n showLegend: false,\n },\n tablet: {\n minWidth: 481,\n maxWidth: 768,\n fontScale: 0.9,\n xTickCount: 7,\n yTickCount: 5,\n pointScale: 1.1,\n lineScale: 1.1,\n hitRadiusScale: 1.3,\n showLegend: true,\n legendPosition: 'top-right',\n },\n desktop: {\n minWidth: 769,\n fontScale: 1.0,\n xTickCount: 10,\n yTickCount: 6,\n pointScale: 1.0,\n lineScale: 1.0,\n hitRadiusScale: 1.0,\n showLegend: true,\n legendPosition: 'top-right',\n },\n};\n\nconst DEFAULT_CONFIG: Required<ResponsiveConfig> = {\n enabled: true,\n breakpoints: DEFAULT_BREAKPOINTS,\n touchOptimized: 'auto',\n reducedMotion: 'auto',\n resizeDebounce: 100,\n};\n\n// ============================================\n// ResponsiveManager Implementation\n// ============================================\n\nexport class ResponsiveManager {\n private ctx: ResponsiveContext;\n private config: Required<ResponsiveConfig>;\n private state: ResponsiveState;\n private resizeObserver: ResizeObserver | null = null;\n private debounceTimer: number | null = null;\n private destroyed = false;\n\n constructor(ctx: ResponsiveContext, config?: ResponsiveConfig) {\n this.ctx = ctx;\n this.config = this.mergeConfig(config);\n this.state = this.computeState();\n \n if (this.config.enabled) {\n this.setupResizeObserver();\n }\n }\n\n // ============================================\n // Configuration\n // ============================================\n\n private mergeConfig(config?: ResponsiveConfig): Required<ResponsiveConfig> {\n if (!config) return { ...DEFAULT_CONFIG };\n\n return {\n enabled: config.enabled ?? DEFAULT_CONFIG.enabled,\n breakpoints: {\n smallMobile: { ...DEFAULT_BREAKPOINTS.smallMobile, ...config.breakpoints?.smallMobile },\n mobile: { ...DEFAULT_BREAKPOINTS.mobile, ...config.breakpoints?.mobile },\n tablet: { ...DEFAULT_BREAKPOINTS.tablet, ...config.breakpoints?.tablet },\n desktop: { ...DEFAULT_BREAKPOINTS.desktop, ...config.breakpoints?.desktop },\n },\n touchOptimized: config.touchOptimized ?? DEFAULT_CONFIG.touchOptimized,\n reducedMotion: config.reducedMotion ?? DEFAULT_CONFIG.reducedMotion,\n resizeDebounce: config.resizeDebounce ?? DEFAULT_CONFIG.resizeDebounce,\n };\n }\n\n configure(config: Partial<ResponsiveConfig>): void {\n this.config = this.mergeConfig({ ...this.config, ...config });\n this.update();\n }\n\n getConfig(): ResponsiveConfig {\n return { ...this.config };\n }\n\n setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n \n if (enabled && !this.resizeObserver) {\n this.setupResizeObserver();\n } else if (!enabled && this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n // ============================================\n // State Management\n // ============================================\n\n getState(): ResponsiveState {\n return { ...this.state };\n }\n\n /**\n * Manually trigger a state update\n */\n update(): void {\n const newState = this.computeState();\n \n if (this.hasStateChanged(newState)) {\n this.state = newState;\n this.ctx.onStateChange(this.state);\n }\n }\n\n private computeState(): ResponsiveState {\n const rect = this.ctx.container.getBoundingClientRect();\n const width = rect.width || 800;\n const height = rect.height || 600;\n \n const breakpoint = this.getActiveBreakpoint(width);\n const bp = this.config.breakpoints[breakpoint] || DEFAULT_BREAKPOINTS.desktop;\n \n const touchOptimized = this.detectTouchOptimization();\n const reducedMotion = this.detectReducedMotion();\n \n // Apply touch multiplier if needed\n const touchMultiplier = touchOptimized ? 1.2 : 1.0;\n\n return {\n width,\n height,\n breakpoint,\n touchOptimized,\n reducedMotion,\n scales: {\n font: bp.fontScale ?? 1.0,\n point: (bp.pointScale ?? 1.0) * touchMultiplier,\n line: (bp.lineScale ?? 1.0),\n hitRadius: (bp.hitRadiusScale ?? 1.0) * touchMultiplier,\n },\n ticks: {\n x: bp.xTickCount ?? 8,\n y: bp.yTickCount ?? 6,\n },\n };\n }\n\n private getActiveBreakpoint(width: number): 'smallMobile' | 'mobile' | 'tablet' | 'desktop' {\n const { smallMobile, mobile, tablet, desktop } = this.config.breakpoints;\n \n if (smallMobile?.maxWidth && width <= smallMobile.maxWidth) {\n return 'smallMobile';\n }\n \n if (mobile?.minWidth && mobile?.maxWidth && width >= mobile.minWidth && width <= mobile.maxWidth) {\n return 'mobile';\n }\n \n if (tablet?.minWidth && tablet?.maxWidth && width >= tablet.minWidth && width <= tablet.maxWidth) {\n return 'tablet';\n }\n \n if (desktop?.minWidth && width >= desktop.minWidth) {\n return 'desktop';\n }\n \n // Fallback based on width thresholds\n if (width <= 360) return 'smallMobile';\n if (width <= 480) return 'mobile';\n if (width <= 768) return 'tablet';\n return 'desktop';\n }\n\n private detectTouchOptimization(): boolean {\n if (this.config.touchOptimized === true) return true;\n if (this.config.touchOptimized === false) return false;\n \n // Auto-detect\n if (typeof window === 'undefined') return false;\n \n return (\n 'ontouchstart' in window ||\n navigator.maxTouchPoints > 0 ||\n (navigator as any).msMaxTouchPoints > 0 ||\n window.matchMedia('(pointer: coarse)').matches\n );\n }\n\n private detectReducedMotion(): boolean {\n if (this.config.reducedMotion === true) return true;\n if (this.config.reducedMotion === false) return false;\n \n // Auto-detect from system preference\n if (typeof window === 'undefined') return false;\n \n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n\n private hasStateChanged(newState: ResponsiveState): boolean {\n return (\n this.state.width !== newState.width ||\n this.state.height !== newState.height ||\n this.state.breakpoint !== newState.breakpoint ||\n this.state.touchOptimized !== newState.touchOptimized ||\n this.state.reducedMotion !== newState.reducedMotion\n );\n }\n\n // ============================================\n // Resize Handling\n // ============================================\n\n private setupResizeObserver(): void {\n if (typeof ResizeObserver === 'undefined') {\n // Fallback for older browsers\n window.addEventListener('resize', this.handleResize);\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.handleResize();\n });\n\n this.resizeObserver.observe(this.ctx.container);\n }\n\n private handleResize = (): void => {\n if (this.destroyed) return;\n \n // Debounce resize events\n if (this.debounceTimer !== null) {\n window.clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = window.setTimeout(() => {\n this.update();\n this.debounceTimer = null;\n }, this.config.resizeDebounce);\n };\n\n // ============================================\n // Theme Scaling\n // ============================================\n\n /**\n * Apply responsive scaling to a theme\n */\n scaleTheme(theme: ChartTheme): ChartTheme {\n const { font, line } = this.state.scales;\n \n return {\n ...theme,\n xAxis: {\n ...theme.xAxis,\n labelSize: Math.round(theme.xAxis.labelSize * font),\n titleSize: Math.round(theme.xAxis.titleSize * font),\n lineWidth: theme.xAxis.lineWidth * line,\n },\n yAxis: {\n ...theme.yAxis,\n labelSize: Math.round(theme.yAxis.labelSize * font),\n titleSize: Math.round(theme.yAxis.titleSize * font),\n lineWidth: theme.yAxis.lineWidth * line,\n },\n legend: {\n ...theme.legend,\n fontSize: Math.round(theme.legend.fontSize * font),\n swatchSize: Math.round(theme.legend.swatchSize * font),\n },\n cursor: {\n ...theme.cursor,\n tooltipSize: Math.round(theme.cursor.tooltipSize * font),\n },\n };\n }\n\n /**\n * Get scaled point size\n */\n getScaledPointSize(baseSize: number): number {\n return baseSize * this.state.scales.point;\n }\n\n /**\n * Get scaled line width\n */\n getScaledLineWidth(baseWidth: number): number {\n return baseWidth * this.state.scales.line;\n }\n\n /**\n * Get scaled hit radius\n */\n getScaledHitRadius(baseRadius: number): number {\n return baseRadius * this.state.scales.hitRadius;\n }\n\n /**\n * Get recommended tick counts\n */\n getTickCounts(): { x: number; y: number } {\n return { ...this.state.ticks };\n }\n\n /**\n * Check if legend should be shown at current breakpoint\n */\n shouldShowLegend(): boolean {\n const bp = this.config.breakpoints[this.state.breakpoint];\n return bp?.showLegend ?? true;\n }\n\n /**\n * Get legend position for current breakpoint\n */\n getLegendPosition(): 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' {\n const bp = this.config.breakpoints[this.state.breakpoint];\n return bp?.legendPosition ?? 'top-right';\n }\n\n // ============================================\n // Cleanup\n // ============================================\n\n destroy(): void {\n this.destroyed = true;\n \n if (this.debounceTimer !== null) {\n window.clearTimeout(this.debounceTimer);\n }\n \n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n } else {\n window.removeEventListener('resize', this.handleResize);\n }\n }\n}\n","/**\n * Chart Serialization and State Persistence\n * \n * Provides:\n * - Export/import complete chart state\n * - URL hash sharing\n * - State compression\n * - Version migration\n */\n\nimport type { Bounds, SeriesType, SeriesStyle } from \"../types\";\nimport type { Annotation } from \"../core/annotations\";\n\n// ============================================\n// Serialization Types\n// ============================================\n\n/** Version of the serialization format */\nexport const SERIALIZATION_VERSION = 1;\n\n/** Serialized axis configuration */\nexport interface SerializedAxis {\n id: string;\n position?: 'left' | 'right' | 'top' | 'bottom';\n label?: string;\n scale?: 'linear' | 'log';\n min?: number;\n max?: number;\n auto?: boolean;\n}\n\n/** Serialized series data */\nexport interface SerializedSeries {\n id: string;\n name?: string;\n type: SeriesType;\n yAxisId?: string;\n style?: SeriesStyle;\n visible?: boolean;\n /** Data is stored as base64 encoded Float32Array for compactness */\n data: {\n x: string; // base64\n y: string; // base64\n y2?: string;\n };\n}\n\n/** Complete serialized chart state */\nexport interface ChartState {\n /** Serialization format version */\n version: number;\n /** Timestamp when state was saved */\n timestamp: number;\n /** Current view bounds */\n viewBounds: Bounds;\n /** X-axis configuration */\n xAxis: SerializedAxis;\n /** Y-axes configurations */\n yAxes: SerializedAxis[];\n /** Primary Y axis ID */\n primaryYAxisId: string;\n /** Series data and configuration */\n series: SerializedSeries[];\n /** Annotations */\n annotations: Annotation[];\n /** Active theme name (if applicable) */\n themeName?: string;\n options?: {\n showLegend?: boolean;\n showControls?: boolean;\n showStatistics?: boolean;\n autoScroll?: boolean;\n };\n /** Plugin-specific data */\n plugins?: Record<string, any>;\n}\n\n/** Options for serialization */\nexport interface SerializeOptions {\n /** Include series data (default: true) */\n includeData?: boolean;\n /** Include annotations (default: true) */\n includeAnnotations?: boolean;\n /** Compress output (default: false) */\n compress?: boolean;\n}\n\n/** Options for deserialization */\nexport interface DeserializeOptions {\n /** Merge with existing state instead of replacing (default: false) */\n merge?: boolean;\n /** Skip data loading (default: false) */\n skipData?: boolean;\n /** Skip annotations (default: false) */\n skipAnnotations?: boolean;\n}\n\n// ============================================\n// Encoding Utilities\n// ============================================\n\n/**\n * Encode Float32Array to base64 string\n */\nexport function encodeFloat32Array(arr: Float32Array | Float64Array): string {\n // Convert Float64Array to Float32Array for size efficiency\n const float32 = arr instanceof Float32Array \n ? arr \n : new Float32Array(arr);\n \n const bytes = new Uint8Array(float32.buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Decode base64 string to Float32Array\n */\nexport function decodeFloat32Array(base64: string): Float32Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new Float32Array(bytes.buffer);\n}\n\n/**\n * Compress string using simple LZ-based compression\n */\nexport function compressString(str: string): string {\n // Simple compression using built-in TextEncoder for now\n // In production, could use pako or similar\n try {\n const encoder = new TextEncoder();\n encoder.encode(str);\n \n // Simple RLE-like compression for repeated patterns\n let compressed = '';\n for (let i = 0; i < str.length; i++) {\n let count = 1;\n while (i + count < str.length && str[i] === str[i + count] && count < 255) {\n count++;\n }\n if (count > 3) {\n compressed += '\\x00' + String.fromCharCode(count) + str[i];\n i += count - 1;\n } else {\n compressed += str[i];\n }\n }\n \n return btoa(compressed);\n } catch (e) {\n // Fallback to just base64\n return btoa(str);\n }\n}\n\n/**\n * Decompress string\n */\nexport function decompressString(compressed: string): string {\n try {\n const decoded = atob(compressed);\n \n // Decompress RLE\n let result = '';\n for (let i = 0; i < decoded.length; i++) {\n if (decoded[i] === '\\x00' && i + 2 < decoded.length) {\n const count = decoded.charCodeAt(i + 1);\n const char = decoded[i + 2];\n result += char.repeat(count);\n i += 2;\n } else {\n result += decoded[i];\n }\n }\n \n return result;\n } catch (e) {\n // Fallback to just base64 decode\n return atob(compressed);\n }\n}\n\n// ============================================\n// URL Hash Utilities\n// ============================================\n\n/**\n * Convert chart state to URL-safe hash\n */\nexport function stateToUrlHash(state: ChartState, compress: boolean = true): string {\n const json = JSON.stringify(state);\n if (compress) {\n return compressString(json);\n }\n return btoa(json);\n}\n\n/**\n * Parse chart state from URL hash\n */\nexport function urlHashToState(hash: string, compressed: boolean = true): ChartState | null {\n try {\n const json = compressed ? decompressString(hash) : atob(hash);\n const state = JSON.parse(json) as ChartState;\n \n // Validate version\n if (typeof state.version !== 'number') {\n console.warn('[SciChartEngine] Invalid state: missing version');\n return null;\n }\n \n // Migration could happen here for future versions\n if (state.version > SERIALIZATION_VERSION) {\n console.warn('[SciChartEngine] State version is newer than supported');\n }\n \n return state;\n } catch (e) {\n console.error('[SciChartEngine] Failed to parse URL hash:', e);\n return null;\n }\n}\n\n// ============================================\n// State Validation\n// ============================================\n\n/**\n * Validate a chart state object\n */\nexport function validateChartState(state: unknown): state is ChartState {\n if (!state || typeof state !== 'object') return false;\n \n const s = state as any;\n \n // Check required fields\n if (typeof s.version !== 'number') return false;\n if (!s.viewBounds || typeof s.viewBounds !== 'object') return false;\n if (!Array.isArray(s.series)) return false;\n \n return true;\n}\n\n// ============================================\n// State Diff Utilities (for Undo/Redo)\n// ============================================\n\n/** State snapshot for undo/redo */\nexport interface StateSnapshot {\n timestamp: number;\n viewBounds: Bounds;\n label?: string;\n}\n\n/**\n * Simple state history manager for undo/redo\n */\nexport class StateHistory {\n private history: StateSnapshot[] = [];\n private currentIndex: number = -1;\n private maxSize: number;\n\n constructor(maxSize: number = 50) {\n this.maxSize = maxSize;\n }\n\n /**\n * Push a new state to history\n */\n push(snapshot: StateSnapshot): void {\n // Remove any future states if we're not at the end\n if (this.currentIndex < this.history.length - 1) {\n this.history = this.history.slice(0, this.currentIndex + 1);\n }\n\n this.history.push(snapshot);\n\n // Trim if exceeding max size\n if (this.history.length > this.maxSize) {\n this.history.shift();\n } else {\n this.currentIndex++;\n }\n }\n\n /**\n * Undo to previous state\n */\n undo(): StateSnapshot | null {\n if (this.currentIndex <= 0) return null;\n this.currentIndex--;\n return this.history[this.currentIndex];\n }\n\n /**\n * Redo to next state\n */\n redo(): StateSnapshot | null {\n if (this.currentIndex >= this.history.length - 1) return null;\n this.currentIndex++;\n return this.history[this.currentIndex];\n }\n\n /**\n * Check if undo is available\n */\n canUndo(): boolean {\n return this.currentIndex > 0;\n }\n\n /**\n * Check if redo is available\n */\n canRedo(): boolean {\n return this.currentIndex < this.history.length - 1;\n }\n\n /**\n * Get current state\n */\n current(): StateSnapshot | null {\n if (this.currentIndex < 0) return null;\n return this.history[this.currentIndex];\n }\n\n /**\n * Clear history\n */\n clear(): void {\n this.history = [];\n this.currentIndex = -1;\n }\n\n /**\n * Get history length\n */\n get length(): number {\n return this.history.length;\n }\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.005, 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.005, 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 * Auto-scale only Y-axes to fit data (keeps X-axis stable)\n * Used during streaming to prevent X-axis shifting\n */\nexport function autoScaleYOnly(ctx: NavigationContext): void {\n if (ctx.series.size === 0) return;\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 (b && isFinite(b.yMin) && isFinite(b.yMax)) {\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 hasValidData = true;\n }\n });\n\n if (!hasValidData) return;\n\n const MAX_VAL = 1e15;\n const MIN_VAL = -1e15;\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.005, 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 * Animation Engine\n * \n * Provides smooth, performant animations for chart transitions\n * including zoom, pan, data updates, and custom animations.\n */\n\n// ============================================\n// Easing Functions\n// ============================================\n\nexport type EasingFunction = (t: number) => number;\n\nexport const easings = {\n /** Linear easing - constant speed */\n linear: (t: number): number => t,\n\n /** Ease in - starts slow, accelerates */\n easeIn: (t: number): number => t * t,\n\n /** Ease out - starts fast, decelerates */\n easeOut: (t: number): number => 1 - (1 - t) * (1 - t),\n\n /** Ease in-out - slow start and end */\n easeInOut: (t: number): number =>\n t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n\n /** Cubic ease out - smoother deceleration */\n easeOutCubic: (t: number): number => 1 - Math.pow(1 - t, 3),\n\n /** Cubic ease in-out */\n easeInOutCubic: (t: number): number =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2,\n\n /** Spring-like bounce at the end */\n spring: (t: number): number => {\n const c4 = (2 * Math.PI) / 3;\n return t === 0\n ? 0\n : t === 1\n ? 1\n : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1;\n },\n\n /** Elastic overshoot */\n elastic: (t: number): number => {\n const c5 = (2 * Math.PI) / 4.5;\n return t === 0\n ? 0\n : t === 1\n ? 1\n : t < 0.5\n ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c5)) / 2 + 1;\n },\n\n /** Bounce effect */\n bounce: (t: number): number => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n },\n} as const;\n\nexport type EasingName = keyof typeof easings;\n\n// ============================================\n// Animation Types\n// ============================================\n\nexport interface AnimationOptions {\n /** Duration in milliseconds */\n duration: number;\n /** Easing function name or custom function */\n easing?: EasingName | EasingFunction;\n /** Callback on each frame with progress 0-1 */\n onUpdate: (progress: number) => void;\n /** Callback when animation completes */\n onComplete?: () => void;\n /** Callback if animation is cancelled */\n onCancel?: () => void;\n}\n\nexport interface AnimationHandle {\n /** Unique animation ID */\n id: string;\n /** Cancel the animation */\n cancel: () => void;\n /** Promise that resolves when animation completes */\n promise: Promise<void>;\n /** Whether animation is currently running */\n isRunning: () => boolean;\n}\n\nexport interface BoundsAnimation {\n /** Target X range [min, max] */\n xRange?: [number, number];\n /** Target Y range [min, max] */\n yRange?: [number, number];\n /** Duration in ms (default: 300) */\n duration?: number;\n /** Easing function (default: 'easeOutCubic') */\n easing?: EasingName | EasingFunction;\n}\n\n// ============================================\n// Animation Engine\n// ============================================\n\nexport class AnimationEngine {\n private animations: Map<string, {\n startTime: number;\n duration: number;\n easingFn: EasingFunction;\n onUpdate: (progress: number) => void;\n onComplete?: () => void;\n onCancel?: () => void;\n resolve: () => void;\n reject: (reason?: any) => void;\n }> = new Map();\n\n private frameId: number | null = null;\n private idCounter = 0;\n private isDestroyed = false;\n\n /**\n * Start a new animation\n */\n animate(options: AnimationOptions): AnimationHandle {\n const id = `anim_${++this.idCounter}`;\n\n const easingFn = typeof options.easing === 'function'\n ? options.easing\n : easings[options.easing || 'easeOutCubic'];\n\n let resolve: () => void;\n let reject: (reason?: any) => void;\n\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n this.animations.set(id, {\n startTime: performance.now(),\n duration: options.duration,\n easingFn,\n onUpdate: options.onUpdate,\n onComplete: options.onComplete,\n onCancel: options.onCancel,\n resolve: resolve!,\n reject: reject!,\n });\n\n this.ensureLoop();\n\n return {\n id,\n cancel: () => this.cancel(id),\n promise,\n isRunning: () => this.animations.has(id),\n };\n }\n\n /**\n * Animate numeric value interpolation\n */\n interpolate(\n from: number,\n to: number,\n options: Omit<AnimationOptions, 'onUpdate'> & {\n onUpdate: (value: number) => void;\n }\n ): AnimationHandle {\n return this.animate({\n ...options,\n onUpdate: (progress) => {\n const value = from + (to - from) * progress;\n options.onUpdate(value);\n },\n });\n }\n\n /**\n * Animate bounds transition\n */\n animateBounds(\n current: { xMin: number; xMax: number; yMin: number; yMax: number },\n target: BoundsAnimation,\n onUpdate: (bounds: { xMin: number; xMax: number; yMin: number; yMax: number }) => void,\n onComplete?: () => void\n ): AnimationHandle {\n const startBounds = { ...current };\n const targetBounds = {\n xMin: target.xRange ? target.xRange[0] : current.xMin,\n xMax: target.xRange ? target.xRange[1] : current.xMax,\n yMin: target.yRange ? target.yRange[0] : current.yMin,\n yMax: target.yRange ? target.yRange[1] : current.yMax,\n };\n\n return this.animate({\n duration: target.duration ?? 150, // Was 300\n easing: target.easing ?? 'easeOutCubic',\n onUpdate: (progress) => {\n onUpdate({\n xMin: startBounds.xMin + (targetBounds.xMin - startBounds.xMin) * progress,\n xMax: startBounds.xMax + (targetBounds.xMax - startBounds.xMax) * progress,\n yMin: startBounds.yMin + (targetBounds.yMin - startBounds.yMin) * progress,\n yMax: startBounds.yMax + (targetBounds.yMax - startBounds.yMax) * progress,\n });\n },\n onComplete,\n });\n }\n\n /**\n * Cancel a specific animation\n */\n cancel(id: string): void {\n const anim = this.animations.get(id);\n if (anim) {\n anim.onCancel?.();\n anim.reject(new Error('Animation cancelled'));\n this.animations.delete(id);\n }\n }\n\n /**\n * Cancel all running animations\n */\n cancelAll(): void {\n this.animations.forEach((anim) => {\n anim.onCancel?.();\n anim.reject(new Error('Animation cancelled'));\n });\n this.animations.clear();\n }\n\n /**\n * Check if any animations are running\n */\n isAnimating(): boolean {\n return this.animations.size > 0;\n }\n\n /**\n * Returns a promise that resolves when all current animations are complete\n */\n async waitForIdle(): Promise<void> {\n if (!this.isAnimating()) return;\n\n // Wait for all current animations to complete\n const promises = Array.from(this.animations.values()).map(a =>\n // Create a promise from the existing resolve/reject but don't fail if one is cancelled\n new Promise<void>(resolve => {\n const originalResolve = a.resolve;\n a.resolve = () => { originalResolve(); resolve(); };\n const originalReject = a.reject;\n a.reject = (err) => { originalReject(err); resolve(); };\n })\n );\n\n await Promise.all(promises);\n\n // Recursive check in case new animations started while waiting\n if (this.isAnimating()) {\n await this.waitForIdle();\n }\n }\n\n /**\n * Get number of active animations\n */\n getActiveCount(): number {\n return this.animations.size;\n }\n\n /**\n * Destroy the animation engine\n */\n destroy(): void {\n this.isDestroyed = true;\n this.cancelAll();\n if (this.frameId !== null) {\n cancelAnimationFrame(this.frameId);\n this.frameId = null;\n }\n }\n\n private ensureLoop(): void {\n if (this.frameId !== null || this.isDestroyed) return;\n this.frameId = requestAnimationFrame(() => this.tick());\n }\n\n private tick(): void {\n if (this.isDestroyed) return;\n\n const now = performance.now();\n const completed: string[] = [];\n\n this.animations.forEach((anim, id) => {\n const elapsed = now - anim.startTime;\n const rawProgress = Math.min(elapsed / anim.duration, 1);\n const easedProgress = anim.easingFn(rawProgress);\n\n anim.onUpdate(easedProgress);\n\n if (rawProgress >= 1) {\n completed.push(id);\n }\n });\n\n // Complete finished animations\n completed.forEach((id) => {\n const anim = this.animations.get(id);\n if (anim) {\n anim.onComplete?.();\n anim.resolve();\n this.animations.delete(id);\n }\n });\n\n // Continue loop if animations remain\n if (this.animations.size > 0) {\n this.frameId = requestAnimationFrame(() => this.tick());\n } else {\n this.frameId = null;\n }\n }\n}\n\n// ============================================\n// Animation Configuration\n// ============================================\n\nexport interface ChartAnimationConfig {\n /** Enable all animations */\n enabled: boolean;\n /** Zoom animation settings */\n zoom: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n /** Pan animation settings */\n pan: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n /** Data update animation settings */\n dataUpdate: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n /** Series entry animation */\n seriesEntry: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n /** Auto-scale animation */\n autoScale: {\n enabled: boolean;\n duration: number;\n easing: EasingName;\n };\n}\n\nexport const DEFAULT_ANIMATION_CONFIG: ChartAnimationConfig = {\n enabled: true,\n zoom: {\n enabled: false, // Disabled for more responsive feel\n duration: 100,\n easing: 'easeOutCubic',\n },\n pan: {\n enabled: false, // Usually immediate for responsiveness\n duration: 50, // Was 100\n easing: 'easeOut',\n },\n dataUpdate: {\n enabled: true,\n duration: 75, // Was 150\n easing: 'easeOut',\n },\n seriesEntry: {\n enabled: true,\n duration: 200, // Was 400\n easing: 'easeOutCubic',\n },\n autoScale: {\n enabled: true,\n duration: 150, // Was 300\n easing: 'easeOutCubic',\n },\n};\n\n/**\n * Merge user config with defaults\n */\nexport function mergeAnimationConfig(\n config?: Partial<ChartAnimationConfig>\n): ChartAnimationConfig {\n if (!config) return { ...DEFAULT_ANIMATION_CONFIG };\n\n return {\n enabled: config.enabled ?? DEFAULT_ANIMATION_CONFIG.enabled,\n zoom: { ...DEFAULT_ANIMATION_CONFIG.zoom, ...config.zoom },\n pan: { ...DEFAULT_ANIMATION_CONFIG.pan, ...config.pan },\n dataUpdate: { ...DEFAULT_ANIMATION_CONFIG.dataUpdate, ...config.dataUpdate },\n seriesEntry: { ...DEFAULT_ANIMATION_CONFIG.seriesEntry, ...config.seriesEntry },\n autoScale: { ...DEFAULT_ANIMATION_CONFIG.autoScale, ...config.autoScale },\n };\n}\n\n// Singleton instance for shared use\nlet sharedEngine: AnimationEngine | null = null;\n\nexport function getSharedAnimationEngine(): AnimationEngine {\n if (!sharedEngine) {\n sharedEngine = new AnimationEngine();\n }\n return sharedEngine;\n}\n","/**\n * Animated Chart Navigation\n * \n * Provides animated versions of zoom, pan, and auto-scale 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\";\nimport {\n AnimationEngine,\n type ChartAnimationConfig,\n type AnimationHandle,\n} from \"../animation\";\n\nexport interface AnimatedNavigationContext {\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 animationEngine: AnimationEngine;\n animationConfig: ChartAnimationConfig;\n}\n\n// Track active animation handles\nlet currentZoomAnimation: AnimationHandle | null = null;\nlet currentAutoScaleAnimation: AnimationHandle | null = null;\n\n/**\n * Apply animated zoom to the chart\n */\nexport function applyAnimatedZoom(\n ctx: AnimatedNavigationContext,\n options: ZoomOptions & { animate?: boolean }\n): AnimationHandle | null {\n const shouldAnimate = \n options.animate !== false && \n ctx.animationConfig.enabled && \n ctx.animationConfig.zoom.enabled;\n\n // Cancel any existing zoom animation\n if (currentZoomAnimation?.isRunning()) {\n currentZoomAnimation.cancel();\n }\n\n const hasBars = Array.from(ctx.series.values()).some(s => s.isVisible() && s.getType() === 'bar');\n \n // Calculate target bounds\n const targetXMin = options.x ? options.x[0] : ctx.viewBounds.xMin;\n const targetXMax = options.x ? options.x[1] : ctx.viewBounds.xMax;\n let targetYMin = options.y ? options.y[0] : ctx.viewBounds.yMin;\n let targetYMax = options.y ? options.y[1] : ctx.viewBounds.yMax;\n\n if (hasBars && options.y) {\n targetYMin = 0;\n }\n\n // Determine target axis for Y zoom\n const targetAxisId = options.axisId;\n\n if (!shouldAnimate) {\n // Immediate application\n if (options.x) {\n ctx.viewBounds.xMin = targetXMin;\n ctx.viewBounds.xMax = targetXMax;\n }\n\n // Update Y scales based on target axis\n if (options.y) {\n if (targetAxisId) {\n // Zoom specific axis only\n const scale = ctx.yScales.get(targetAxisId);\n if (scale) {\n scale.setDomain(targetYMin, targetYMax);\n // Sync primary viewBounds if this is the primary axis\n if (targetAxisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = targetYMin;\n ctx.viewBounds.yMax = targetYMax;\n }\n }\n } else {\n // Global zoom: apply to all axes proportionally\n const oldRange = ctx.viewBounds.yMax - ctx.viewBounds.yMin;\n const newRange = targetYMax - targetYMin;\n const factor = oldRange > 0 ? newRange / oldRange : 1;\n const offsetPct = oldRange > 0 ? (targetYMin - 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] + factor * sRange)\n : (sNewMin + factor * sRange);\n scale.setDomain(sNewMin, sNewMax);\n });\n\n ctx.viewBounds.yMin = targetYMin;\n ctx.viewBounds.yMax = targetYMax;\n \n // Update primary scale\n const primaryScale = ctx.yScales.get(ctx.primaryYAxisId);\n if (primaryScale) {\n primaryScale.setDomain(targetYMin, targetYMax);\n }\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 return null;\n }\n\n // Animated zoom\n const startBounds = { ...ctx.viewBounds };\n const startScaleDomains = new Map<string, [number, number]>();\n ctx.yScales.forEach((scale, id) => {\n startScaleDomains.set(id, [...scale.domain] as [number, number]);\n });\n\n currentZoomAnimation = ctx.animationEngine.animate({\n duration: ctx.animationConfig.zoom.duration,\n easing: ctx.animationConfig.zoom.easing,\n onUpdate: (progress) => {\n if (options.x) {\n ctx.viewBounds.xMin = startBounds.xMin + (targetXMin - startBounds.xMin) * progress;\n ctx.viewBounds.xMax = startBounds.xMax + (targetXMax - startBounds.xMax) * progress;\n }\n\n // Update Y scales based on target axis\n if (options.y) {\n if (targetAxisId) {\n // Animate specific axis only\n const scale = ctx.yScales.get(targetAxisId);\n const startDomain = startScaleDomains.get(targetAxisId);\n if (scale && startDomain) {\n const newMin = startDomain[0] + (targetYMin - startDomain[0]) * progress;\n const newMax = startDomain[1] + (targetYMax - startDomain[1]) * progress;\n scale.setDomain(newMin, newMax);\n \n // Sync primary viewBounds if this is the primary axis\n if (targetAxisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = newMin;\n ctx.viewBounds.yMax = newMax;\n }\n }\n } else {\n // Animate all axes proportionally\n ctx.viewBounds.yMin = startBounds.yMin + (targetYMin - startBounds.yMin) * progress;\n ctx.viewBounds.yMax = startBounds.yMax + (targetYMax - startBounds.yMax) * progress;\n\n ctx.yScales.forEach((scale, id) => {\n if (id === ctx.primaryYAxisId) {\n scale.setDomain(ctx.viewBounds.yMin, ctx.viewBounds.yMax);\n } else {\n // Non-primary axes follow proportionally\n const start = startScaleDomains.get(id)!;\n const oldRange = startBounds.yMax - startBounds.yMin;\n const newRange = ctx.viewBounds.yMax - ctx.viewBounds.yMin;\n const factor = oldRange > 0 ? newRange / oldRange : 1;\n const offsetPct = oldRange > 0 ? (ctx.viewBounds.yMin - startBounds.yMin) / oldRange : 0;\n const sRange = start[1] - start[0];\n const newMin = start[0] + offsetPct * sRange;\n const newMax = newMin + factor * sRange;\n scale.setDomain(newMin, newMax);\n }\n });\n }\n }\n\n ctx.requestRender();\n },\n onComplete: () => {\n ctx.events.emit(\"zoom\", {\n x: [ctx.viewBounds.xMin, ctx.viewBounds.xMax],\n y: [ctx.viewBounds.yMin, ctx.viewBounds.yMax],\n });\n currentZoomAnimation = null;\n },\n });\n\n return currentZoomAnimation;\n}\n\n/**\n * Apply animated auto-scale to fit all data\n */\nexport function applyAnimatedAutoScale(\n ctx: AnimatedNavigationContext,\n animate: boolean = true\n): AnimationHandle | null {\n if (ctx.series.size === 0) return null;\n\n // Calculate target bounds\n let xMin = Infinity;\n let xMax = -Infinity;\n \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 null;\n\n // Calculate targets with padding\n const MAX_VAL = 1e15;\n const MIN_VAL = -1e15;\n\n let targetXMin = ctx.viewBounds.xMin;\n let targetXMax = ctx.viewBounds.xMax;\n let targetYMin = ctx.viewBounds.yMin;\n let targetYMax = ctx.viewBounds.yMax;\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.005, 1e10);\n targetXMin = Math.max(MIN_VAL, xMin - xPad);\n targetXMax = Math.min(MAX_VAL, xMax + xPad);\n }\n\n const primaryBounds = yAxisBounds.get(ctx.primaryYAxisId);\n const primaryOpts = ctx.yAxisOptionsMap.get(ctx.primaryYAxisId);\n \n if (primaryBounds && primaryOpts?.auto && primaryBounds.min !== Infinity) {\n let yRange = primaryBounds.max - primaryBounds.min;\n if (yRange <= 0 || !isFinite(yRange)) yRange = Math.abs(primaryBounds.min) * 0.1 || 1;\n const yPad = Math.min(yRange * 0.005, 1e10);\n targetYMin = Math.max(MIN_VAL, primaryBounds.min - yPad);\n targetYMax = Math.min(MAX_VAL, primaryBounds.max + yPad);\n }\n\n const shouldAnimate = \n animate && \n ctx.animationConfig.enabled && \n ctx.animationConfig.autoScale.enabled;\n\n // Cancel any existing auto-scale animation\n if (currentAutoScaleAnimation?.isRunning()) {\n currentAutoScaleAnimation.cancel();\n }\n\n if (!shouldAnimate) {\n // Immediate application\n ctx.viewBounds.xMin = targetXMin;\n ctx.viewBounds.xMax = targetXMax;\n ctx.viewBounds.yMin = targetYMin;\n ctx.viewBounds.yMax = targetYMax;\n\n ctx.yScales.forEach((scale, id) => {\n const bounds = yAxisBounds.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if (bounds && opts?.auto && bounds.min !== Infinity) {\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.005, 1e10);\n scale.setDomain(\n Math.max(MIN_VAL, bounds.min - yPad),\n Math.min(MAX_VAL, bounds.max + yPad)\n );\n }\n });\n\n ctx.events.emit(\"autoScale\", undefined);\n ctx.requestRender();\n return null;\n }\n\n // Animated auto-scale\n const startBounds = { ...ctx.viewBounds };\n const startScaleDomains = new Map<string, [number, number]>();\n ctx.yScales.forEach((scale, id) => {\n startScaleDomains.set(id, [...scale.domain] as [number, number]);\n });\n\n // Calculate target domains for all scales\n const targetScaleDomains = new Map<string, [number, number]>();\n ctx.yScales.forEach((scale, id) => {\n const bounds = yAxisBounds.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if (bounds && opts?.auto && bounds.min !== Infinity) {\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.005, 1e10);\n targetScaleDomains.set(id, [\n Math.max(MIN_VAL, bounds.min - yPad),\n Math.min(MAX_VAL, bounds.max + yPad)\n ]);\n } else {\n targetScaleDomains.set(id, [...scale.domain] as [number, number]);\n }\n });\n\n currentAutoScaleAnimation = ctx.animationEngine.animate({\n duration: ctx.animationConfig.autoScale.duration,\n easing: ctx.animationConfig.autoScale.easing,\n onUpdate: (progress) => {\n ctx.viewBounds.xMin = startBounds.xMin + (targetXMin - startBounds.xMin) * progress;\n ctx.viewBounds.xMax = startBounds.xMax + (targetXMax - startBounds.xMax) * progress;\n ctx.viewBounds.yMin = startBounds.yMin + (targetYMin - startBounds.yMin) * progress;\n ctx.viewBounds.yMax = startBounds.yMax + (targetYMax - startBounds.yMax) * progress;\n\n // Update all Y scales\n ctx.yScales.forEach((scale, id) => {\n const start = startScaleDomains.get(id)!;\n const target = targetScaleDomains.get(id)!;\n scale.setDomain(\n start[0] + (target[0] - start[0]) * progress,\n start[1] + (target[1] - start[1]) * progress\n );\n });\n\n ctx.requestRender();\n },\n onComplete: () => {\n ctx.events.emit(\"autoScale\", undefined);\n currentAutoScaleAnimation = null;\n },\n });\n\n return currentAutoScaleAnimation;\n}\n\n/**\n * Animate to specific bounds\n */\nexport function animateToBounds(\n ctx: AnimatedNavigationContext,\n targetBounds: Partial<Bounds>,\n options?: {\n duration?: number;\n easing?: string;\n }\n): AnimationHandle {\n const startBounds = { ...ctx.viewBounds };\n const finalBounds = {\n xMin: targetBounds.xMin ?? ctx.viewBounds.xMin,\n xMax: targetBounds.xMax ?? ctx.viewBounds.xMax,\n yMin: targetBounds.yMin ?? ctx.viewBounds.yMin,\n yMax: targetBounds.yMax ?? ctx.viewBounds.yMax,\n };\n\n return ctx.animationEngine.animate({\n duration: options?.duration ?? ctx.animationConfig.zoom.duration,\n easing: (options?.easing as any) ?? ctx.animationConfig.zoom.easing,\n onUpdate: (progress) => {\n ctx.viewBounds.xMin = startBounds.xMin + (finalBounds.xMin - startBounds.xMin) * progress;\n ctx.viewBounds.xMax = startBounds.xMax + (finalBounds.xMax - startBounds.xMax) * progress;\n ctx.viewBounds.yMin = startBounds.yMin + (finalBounds.yMin - startBounds.yMin) * progress;\n ctx.viewBounds.yMax = startBounds.yMax + (finalBounds.yMax - startBounds.yMax) * progress;\n\n // Sync primary Y scale\n const primaryScale = ctx.yScales.get(ctx.primaryYAxisId);\n if (primaryScale) {\n primaryScale.setDomain(ctx.viewBounds.yMin, ctx.viewBounds.yMax);\n }\n\n ctx.requestRender();\n },\n onComplete: () => {\n ctx.events.emit(\"zoom\", {\n x: [ctx.viewBounds.xMin, ctx.viewBounds.xMax],\n y: [ctx.viewBounds.yMin, ctx.viewBounds.yMax],\n });\n },\n });\n}\n\n/**\n * Check if any navigation animation is running\n */\nexport function isNavigationAnimating(): boolean {\n return (\n (currentZoomAnimation?.isRunning() ?? false) ||\n (currentAutoScaleAnimation?.isRunning() ?? false)\n );\n}\n\n/**\n * Cancel all navigation animations\n */\nexport function cancelNavigationAnimations(): void {\n currentZoomAnimation?.cancel();\n currentAutoScaleAnimation?.cancel();\n currentZoomAnimation = null;\n currentAutoScaleAnimation = null;\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 {\n NativeWebGLRenderer,\n NativeSeriesRenderData as SeriesRenderData,\n} from \"../../renderer/NativeWebGLRenderer\";\nimport type { OverlayRenderer } from \"../OverlayRenderer\";\nimport type { PlotArea, CursorState, ChartEventMap } from \"../../types\";\nimport type { EventEmitter } from \"../EventEmitter\";\nimport type { SelectionManager } from \"../selection\";\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 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 events: EventEmitter<ChartEventMap>;\n updateSeriesBuffer: (s: Series) => void;\n getPlotArea: () => PlotArea;\n pixelToDataX: (px: number) => number;\n pixelToDataY: (py: number) => number;\n selectionManager: SelectionManager;\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 // 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,\n 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: {\n ...s.getStyle(),\n color: (s.getStyle() as any).bullishColor || \"#26a69a\",\n },\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: {\n ...s.getStyle(),\n color: (s.getStyle() as any).bearishColor || \"#ef5350\",\n },\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(\n \"[SciChartEngine] Container has zero size in render, skipping overlay\"\n );\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 Selection Highlights\n ctx.selectionManager.render(ctx.overlayCtx, plotArea);\n\n // Cursor\n if (ctx.cursorOptions?.enabled && ctx.cursorPosition) {\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: 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\n .pixelToDataY(ctx.cursorPosition.y)\n .toExponential(2)}`,\n };\n ctx.overlay.drawCursor(plotArea, cursor);\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 setYAxisId = (id: string) => { this.yAxisId = id; };\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","/**\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 {\n SeriesOptions,\n HeatmapOptions,\n SeriesUpdateData,\n} from \"../../../types\";\nimport { updateSeriesBuffer } from \"./SeriesBuffer\";\n\nexport function addSeries(\n ctx: any,\n options: SeriesOptions | HeatmapOptions\n): void {\n const s = new Series(options);\n ctx.series.set(s.getId(), s);\n updateSeriesBuffer(ctx, s);\n if (\n ctx.xAxisOptions.auto ||\n Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)\n ) {\n // Don't animate autoscale when adding series to avoid animation conflicts\n ctx.autoScale(false);\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(\n ctx: any,\n id: string,\n data: SeriesUpdateData\n): 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(\n ctx: any,\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): 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 if (Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)) {\n ctx.autoScaleYOnly();\n }\n } else {\n // During streaming (not autoscroll), only auto-scale Y to prevent X-axis shift\n if (Array.from(ctx.yAxisOptionsMap.values()).some((o: any) => o.auto)) {\n ctx.autoScaleYOnly();\n }\n // Only auto-scale X if explicitly enabled and data bounds changed significantly\n if (ctx.xAxisOptions.auto) {\n const newBounds = s.getBounds();\n if (newBounds) {\n const currentXRange = ctx.viewBounds.xMax - ctx.viewBounds.xMin;\n const dataXRange = newBounds.xMax - newBounds.xMin;\n // Only update X-axis if data extends significantly beyond current view\n if (newBounds.xMax > ctx.viewBounds.xMax || \n newBounds.xMin < ctx.viewBounds.xMin ||\n Math.abs(dataXRange - currentXRange) / currentXRange > 0.1) {\n const xPad = Math.min(dataXRange * 0.005, 1e10);\n ctx.viewBounds.xMin = Math.max(-1e15, newBounds.xMin - xPad);\n ctx.viewBounds.xMax = Math.min(1e15, newBounds.xMax + xPad);\n }\n }\n }\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 * 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 plotAreaColor: [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(\"[SciChartEngine] 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 \n const paColor = parseColor(theme.plotAreaBackground);\n const plotAreaColor: [number, number, number, number] = [paColor[0], paColor[1], paColor[2], paColor[3]];\n\n const showLegend = options.showLegend ?? theme.legend.visible;\n const showControls = options.toolbar?.show ?? 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 plotAreaColor,\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 * SciChart Engine - Plugin Context Implementation\n * \n * Provides the comprehensive context object that gives plugins\n * access to all chart functionality in a controlled manner.\n * \n * @module plugins/PluginContext\n */\n\nimport type { Chart } from \"../core/chart/types\";\nimport type { Bounds, ChartEventMap } from \"../types\";\nimport type { ChartTheme } from \"../theme\";\nimport type {\n PluginContext,\n RenderContext,\n CoordinateContext,\n DataContext,\n UIContext,\n EventContext,\n PluginStorage,\n PluginLogger,\n OverlayOptions,\n NotificationOptions,\n PickResult,\n ChartPlugin,\n} from \"./types\";\n\n// ============================================\n// Plugin Storage Implementation\n// ============================================\n\nclass PluginStorageImpl implements PluginStorage {\n private data = new Map<string, unknown>();\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n constructor(_pluginName: string) {\n // Plugin name available for future use (e.g., namespaced localStorage)\n }\n\n get<T>(key: string): T | undefined {\n return this.data.get(key) as T | undefined;\n }\n\n set<T>(key: string, value: T): void {\n this.data.set(key, value);\n }\n\n remove(key: string): void {\n this.data.delete(key);\n }\n\n clear(): void {\n this.data.clear();\n }\n\n keys(): string[] {\n return Array.from(this.data.keys());\n }\n\n // Internal: serialize for chart state\n _serialize(): Record<string, unknown> {\n const obj: Record<string, unknown> = {};\n this.data.forEach((v, k) => {\n obj[k] = v;\n });\n return obj;\n }\n\n // Internal: restore from chart state\n _deserialize(data: Record<string, unknown>): void {\n this.data.clear();\n Object.entries(data).forEach(([k, v]) => {\n this.data.set(k, v);\n });\n }\n}\n\n// ============================================\n// Plugin Logger Implementation\n// ============================================\n\nclass PluginLoggerImpl implements PluginLogger {\n private prefix: string;\n private enabled: boolean;\n\n constructor(pluginName: string, enabled = true) {\n this.prefix = `[SciChartEngine:${pluginName}]`;\n this.enabled = enabled;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.enabled) {\n console.debug(this.prefix, message, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.enabled) {\n console.info(this.prefix, message, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n console.warn(this.prefix, message, ...args);\n }\n\n error(message: string, ...args: unknown[]): void {\n console.error(this.prefix, message, ...args);\n }\n}\n\n// ============================================\n// Event Context Implementation\n// ============================================\n\nclass EventContextImpl implements EventContext {\n private chart: Chart;\n private subscriptions: Array<() => void> = [];\n private customListeners = new Map<string, Set<(data: unknown) => void>>();\n\n constructor(chart: Chart) {\n this.chart = chart;\n }\n\n on<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): () => void {\n this.chart.on(event, handler);\n const unsubscribe = () => this.chart.off(event, handler);\n this.subscriptions.push(unsubscribe);\n return unsubscribe;\n }\n\n once<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): () => void {\n const wrapped = (data: ChartEventMap[K]) => {\n handler(data);\n this.chart.off(event, wrapped);\n };\n this.chart.on(event, wrapped);\n return () => this.chart.off(event, wrapped);\n }\n\n emit(event: string, data?: unknown): void {\n const listeners = this.customListeners.get(event);\n if (listeners) {\n listeners.forEach((handler) => {\n try {\n handler(data);\n } catch (e) {\n console.error(`[SciChartEngine] Error in plugin event handler for \"${event}\":`, e);\n }\n });\n }\n }\n\n onPlugin(event: string, handler: (data: unknown) => void): () => void {\n if (!this.customListeners.has(event)) {\n this.customListeners.set(event, new Set());\n }\n this.customListeners.get(event)!.add(handler);\n return () => {\n this.customListeners.get(event)?.delete(handler);\n };\n }\n\n // Internal: cleanup all subscriptions\n _cleanup(): void {\n this.subscriptions.forEach((unsub) => unsub());\n this.subscriptions = [];\n this.customListeners.clear();\n }\n}\n\n// ============================================\n// UI Context Implementation\n// ============================================\n\nclass UIContextImpl implements UIContext {\n private _container: HTMLDivElement;\n private _theme: ChartTheme;\n private overlays = new Map<string, HTMLDivElement>();\n private notifications: HTMLDivElement | null = null;\n\n constructor(container: HTMLDivElement, theme: ChartTheme) {\n this._container = container;\n this._theme = theme;\n }\n\n get container(): HTMLDivElement {\n return this._container;\n }\n\n get theme(): Readonly<ChartTheme> {\n return this._theme;\n }\n\n updateTheme(theme: ChartTheme): void {\n this._theme = theme;\n }\n\n createOverlay(id: string, options: OverlayOptions = {}): HTMLDivElement {\n if (this.overlays.has(id)) {\n return this.overlays.get(id)!;\n }\n\n const overlay = document.createElement(\"div\");\n overlay.id = `scichart-plugin-${id}`;\n overlay.className = options.className || \"\";\n overlay.style.cssText = `\n position: absolute;\n ${options.position?.top !== undefined ? `top: ${options.position.top};` : \"\"}\n ${options.position?.right !== undefined ? `right: ${options.position.right};` : \"\"}\n ${options.position?.bottom !== undefined ? `bottom: ${options.position.bottom};` : \"\"}\n ${options.position?.left !== undefined ? `left: ${options.position.left};` : \"\"}\n z-index: ${options.zIndex ?? 1000};\n pointer-events: ${options.pointerEvents ? \"auto\" : \"none\"};\n `;\n\n this._container.appendChild(overlay);\n this.overlays.set(id, overlay);\n return overlay;\n }\n\n removeOverlay(id: string): boolean {\n const overlay = this.overlays.get(id);\n if (overlay && overlay.parentNode) {\n overlay.parentNode.removeChild(overlay);\n this.overlays.delete(id);\n return true;\n }\n return false;\n }\n\n getOverlay(id: string): HTMLDivElement | undefined {\n return this.overlays.get(id);\n }\n\n showNotification(message: string, options: NotificationOptions = {}): void {\n const {\n type = \"info\",\n duration = 3000,\n position = \"top-right\",\n } = options;\n\n // Create notifications container if needed\n if (!this.notifications) {\n this.notifications = document.createElement(\"div\");\n this.notifications.className = \"scichart-notifications\";\n this.notifications.style.cssText = `\n position: absolute;\n ${position.includes(\"top\") ? \"top: 10px;\" : \"bottom: 10px;\"}\n ${position.includes(\"right\") ? \"right: 10px;\" : \"left: 10px;\"}\n z-index: 10000;\n display: flex;\n flex-direction: column;\n gap: 8px;\n pointer-events: none;\n `;\n this._container.appendChild(this.notifications);\n }\n\n // Create notification element\n const notification = document.createElement(\"div\");\n notification.className = `scichart-notification scichart-notification-${type}`;\n\n const colors = {\n info: { bg: \"#3b82f6\", text: \"#fff\" },\n success: { bg: \"#22c55e\", text: \"#fff\" },\n warning: { bg: \"#f59e0b\", text: \"#000\" },\n error: { bg: \"#ef4444\", text: \"#fff\" },\n };\n\n const color = colors[type];\n notification.style.cssText = `\n padding: 10px 16px;\n border-radius: 6px;\n background: ${color.bg};\n color: ${color.text};\n font-family: system-ui, sans-serif;\n font-size: 13px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n pointer-events: auto;\n opacity: 0;\n transform: translateX(20px);\n transition: all 0.3s ease;\n `;\n notification.textContent = message;\n\n this.notifications.appendChild(notification);\n\n // Animate in\n requestAnimationFrame(() => {\n notification.style.opacity = \"1\";\n notification.style.transform = \"translateX(0)\";\n });\n\n // Auto-remove\n if (duration > 0) {\n setTimeout(() => {\n notification.style.opacity = \"0\";\n notification.style.transform = \"translateX(20px)\";\n setTimeout(() => notification.remove(), 300);\n }, duration);\n }\n }\n\n // Internal: cleanup all overlays\n _cleanup(): void {\n this.overlays.forEach((overlay) => overlay.remove());\n this.overlays.clear();\n this.notifications?.remove();\n this.notifications = null;\n }\n}\n\n// ============================================\n// Context Builder\n// ============================================\n\nexport interface ContextDependencies {\n chart: Chart;\n container: HTMLDivElement;\n theme: ChartTheme;\n getGL?: () => WebGLRenderingContext | WebGL2RenderingContext | undefined;\n get2DContext?: () => CanvasRenderingContext2D | undefined;\n getPixelRatio: () => number;\n getCanvasSize: () => { width: number; height: number };\n getPlotArea: () => { x: number; y: number; width: number; height: number };\n getViewBounds: () => Bounds;\n getYAxisBounds: (yAxisId?: string) => { yMin: number; yMax: number };\n dataToPixelX: (x: number) => number;\n dataToPixelY: (y: number, yAxisId?: string) => number;\n pixelToDataX: (px: number) => number;\n pixelToDataY: (py: number, yAxisId?: string) => number;\n findNearestPoint?: (px: number, py: number, radius?: number) => PickResult | null;\n getPlugin: (name: string) => ChartPlugin | undefined;\n}\n\n/**\n * Create a complete plugin context from chart dependencies\n */\nexport function createPluginContext(\n pluginName: string,\n deps: ContextDependencies\n): PluginContext & { _cleanup: () => void; _getStorage: () => PluginStorageImpl } {\n const storage = new PluginStorageImpl(pluginName);\n const log = new PluginLoggerImpl(pluginName);\n const events = new EventContextImpl(deps.chart);\n const ui = new UIContextImpl(deps.container, deps.theme);\n\n const render: RenderContext = {\n get gl() {\n return deps.getGL?.();\n },\n get ctx2d() {\n return deps.get2DContext?.();\n },\n get pixelRatio() {\n return deps.getPixelRatio();\n },\n get canvasSize() {\n return deps.getCanvasSize();\n },\n get plotArea() {\n return deps.getPlotArea();\n },\n };\n\n const coords: CoordinateContext = {\n dataToPixelX: deps.dataToPixelX,\n dataToPixelY: deps.dataToPixelY,\n pixelToDataX: deps.pixelToDataX,\n pixelToDataY: deps.pixelToDataY,\n pickPoint: (px, py, radius = 20) => deps.findNearestPoint?.(px, py, radius) ?? null,\n };\n\n const data: DataContext = {\n getAllSeries: () => deps.chart.getAllSeries(),\n getSeries: (id) => deps.chart.getSeries(id),\n getSeriesData: (id) => {\n const series = deps.chart.getSeries(id);\n if (!series) return undefined;\n return series.getData();\n },\n getViewBounds: () => deps.getViewBounds(),\n getYAxisBounds: (yAxisId) => deps.getYAxisBounds(yAxisId),\n getAnnotations: () => deps.chart.getAnnotations(),\n getSelectedPoints: () => deps.chart.getSelectedPoints(),\n };\n\n let animFrameIds = new Set<number>();\n\n const context: PluginContext & { _cleanup: () => void; _getStorage: () => PluginStorageImpl } = {\n chart: deps.chart,\n render,\n coords,\n data,\n ui,\n events,\n storage,\n log,\n\n getPlugin<T extends ChartPlugin>(name: string): T | undefined {\n return deps.getPlugin(name) as T | undefined;\n },\n\n requestRender() {\n deps.chart.render();\n },\n\n requestAnimationFrame(callback: () => void): number {\n const id = window.requestAnimationFrame(callback);\n animFrameIds.add(id);\n return id;\n },\n\n cancelAnimationFrame(id: number): void {\n window.cancelAnimationFrame(id);\n animFrameIds.delete(id);\n },\n\n _cleanup() {\n events._cleanup();\n ui._cleanup();\n animFrameIds.forEach((id) => window.cancelAnimationFrame(id));\n animFrameIds.clear();\n },\n\n _getStorage() {\n return storage;\n },\n };\n\n return context;\n}\n","/**\n * SciChart Engine - Plugin Manager Implementation\n * \n * Manages the lifecycle of plugins including:\n * - Loading and unloading plugins\n * - Dependency resolution\n * - Hook notification\n * - Configuration management\n * \n * @module plugins/PluginManager\n */\n\nimport type { ChartTheme } from \"../theme\";\nimport type {\n ChartPlugin,\n PluginFactory,\n PluginManager,\n PluginManifest,\n PluginContext,\n BeforeRenderEvent,\n AfterRenderEvent,\n ViewChangeEvent,\n SeriesChangeEvent,\n DataUpdateEvent,\n InteractionEvent,\n} from \"./types\";\nimport { createPluginContext, ContextDependencies } from \"./PluginContext\";\n\n// ============================================\n// Plugin Instance Wrapper\n// ============================================\n\ninterface PluginInstance {\n plugin: ChartPlugin;\n context: PluginContext & { _cleanup: () => void; _getStorage: () => any };\n config: unknown;\n initialized: boolean;\n}\n\n// ============================================\n// Plugin Manager Implementation\n// ============================================\n\nexport class PluginManagerImpl implements PluginManager {\n private plugins = new Map<string, PluginInstance>();\n private deps: ContextDependencies;\n private destroyed = false;\n\n // Hook caches for performance\n private hooksBeforeRender: PluginInstance[] = [];\n private hooksAfterRender: PluginInstance[] = [];\n private hooksRenderWebGL: PluginInstance[] = [];\n private hooksRenderOverlay: PluginInstance[] = [];\n private hooksInteraction: PluginInstance[] = [];\n private hooksViewChange: PluginInstance[] = [];\n private hooksDataUpdate: PluginInstance[] = [];\n private hooksSeriesAdd: PluginInstance[] = [];\n private hooksSeriesRemove: PluginInstance[] = [];\n private hooksSeriesChange: PluginInstance[] = [];\n private hooksResize: PluginInstance[] = [];\n private hooksThemeChange: PluginInstance[] = [];\n private hooksSelectionChange: PluginInstance[] = [];\n private hooksSerialize: PluginInstance[] = [];\n\n constructor(dependencies: ContextDependencies) {\n this.deps = dependencies;\n }\n\n /**\n * Register and initialize a plugin\n */\n async use<TConfig>(\n pluginOrFactory: ChartPlugin<TConfig> | PluginFactory<TConfig>,\n config?: TConfig\n ): Promise<void> {\n if (this.destroyed) {\n console.warn(\"[SciChartEngine] Cannot add plugin to destroyed manager\");\n return;\n }\n\n // Resolve factory to plugin instance\n const plugin = typeof pluginOrFactory === \"function\"\n ? pluginOrFactory(config)\n : pluginOrFactory;\n\n const name = plugin.manifest.name;\n\n // Check if already registered\n if (this.plugins.has(name)) {\n console.warn(`[SciChartEngine] Plugin \"${name}\" is already registered`);\n return;\n }\n\n // Validate dependencies\n const missing = await this.checkDependencies(plugin.manifest);\n if (missing.length > 0) {\n console.error(\n `[SciChartEngine] Plugin \"${name}\" requires plugins: ${missing.join(\", \")}`\n );\n return;\n }\n\n // Create context for this plugin\n const context = createPluginContext(name, {\n ...this.deps,\n getPlugin: (n) => this.get(n),\n });\n\n const instance: PluginInstance = {\n plugin,\n context,\n config,\n initialized: false,\n };\n\n this.plugins.set(name, instance);\n\n // Initialize plugin\n try {\n const initResult = plugin.onInit?.(context, config);\n if (initResult instanceof Promise) {\n await initResult;\n }\n instance.initialized = true;\n } catch (e) {\n console.error(`[SciChartEngine] Failed to initialize plugin \"${name}\":`, e);\n this.plugins.delete(name);\n context._cleanup();\n return;\n }\n\n // Update hook caches\n this.rebuildHookCaches();\n }\n\n /**\n * Remove a plugin\n */\n async remove(name: string): Promise<boolean> {\n const instance = this.plugins.get(name);\n if (!instance) {\n return false;\n }\n\n // Check if other plugins depend on this one\n const dependents = this.findDependents(name);\n if (dependents.length > 0) {\n console.warn(\n `[SciChartEngine] Cannot remove plugin \"${name}\", required by: ${dependents.join(\", \")}`\n );\n return false;\n }\n\n try {\n instance.plugin.onDestroy?.(instance.context);\n } catch (e) {\n console.error(`[SciChartEngine] Error destroying plugin \"${name}\":`, e);\n }\n\n instance.context._cleanup();\n this.plugins.delete(name);\n this.rebuildHookCaches();\n\n return true;\n }\n\n /**\n * Get a plugin instance\n */\n get<T extends ChartPlugin = ChartPlugin>(name: string): T | undefined {\n const instance = this.plugins.get(name);\n return instance?.plugin as T | undefined;\n }\n\n /**\n * Check if a plugin is loaded\n */\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * Get all loaded plugin names\n */\n getNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * Get all loaded plugin manifests\n */\n getManifests(): PluginManifest[] {\n return Array.from(this.plugins.values()).map((i) => i.plugin.manifest);\n }\n\n /**\n * Update plugin configuration\n */\n configure<TConfig>(name: string, config: TConfig): void {\n const instance = this.plugins.get(name);\n if (!instance) {\n console.warn(`[SciChartEngine] Plugin \"${name}\" not found`);\n return;\n }\n\n const oldConfig = instance.config;\n instance.config = config;\n\n try {\n (instance.plugin as ChartPlugin<TConfig>).onConfigChange?.(\n instance.context,\n config,\n oldConfig as TConfig\n );\n } catch (e) {\n console.error(`[SciChartEngine] Error in plugin \"${name}\" config change:`, e);\n }\n }\n\n /**\n * Notify all plugins of a hook event\n */\n notify(hook: string, ...args: unknown[]): void {\n // This is a generic notifier for non-optimized hooks\n this.plugins.forEach((instance) => {\n const handler = (instance.plugin as unknown as Record<string, unknown>)[hook];\n if (typeof handler === \"function\" && instance.initialized) {\n try {\n handler.call(instance.plugin, instance.context, ...args);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" hook \"${hook}\":`,\n e\n );\n }\n }\n });\n }\n\n // ============================================\n // Optimized Hook Notifications\n // ============================================\n\n /**\n * Notify beforeRender hooks\n * Returns false if any plugin wants to skip rendering\n */\n notifyBeforeRender(event: BeforeRenderEvent): boolean {\n for (const instance of this.hooksBeforeRender) {\n try {\n const result = instance.plugin.onBeforeRender!(instance.context, event);\n if (result === false) {\n return false;\n }\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" beforeRender:`,\n e\n );\n }\n }\n return true;\n }\n\n /**\n * Notify afterRender hooks\n */\n notifyAfterRender(event: AfterRenderEvent): void {\n for (const instance of this.hooksAfterRender) {\n try {\n instance.plugin.onAfterRender!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" afterRender:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify WebGL render hooks\n */\n notifyRenderWebGL(event: AfterRenderEvent): void {\n for (const instance of this.hooksRenderWebGL) {\n try {\n instance.plugin.onRenderWebGL!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" renderWebGL:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify overlay render hooks\n */\n notifyRenderOverlay(event: AfterRenderEvent): void {\n for (const instance of this.hooksRenderOverlay) {\n try {\n instance.plugin.onRenderOverlay!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" renderOverlay:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify interaction hooks\n * Returns false if any plugin prevents default\n */\n notifyInteraction(event: InteractionEvent): boolean {\n for (const instance of this.hooksInteraction) {\n try {\n const result = instance.plugin.onInteraction!(instance.context, event);\n if (result === false || event.defaultPrevented) {\n return false;\n }\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" interaction:`,\n e\n );\n }\n }\n return true;\n }\n\n /**\n * Notify view change hooks\n */\n notifyViewChange(event: ViewChangeEvent): void {\n for (const instance of this.hooksViewChange) {\n try {\n instance.plugin.onViewChange!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" viewChange:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify data update hooks\n */\n notifyDataUpdate(event: DataUpdateEvent): void {\n for (const instance of this.hooksDataUpdate) {\n try {\n instance.plugin.onDataUpdate!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" dataUpdate:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify series add hooks\n */\n notifySeriesAdd(event: SeriesChangeEvent): void {\n for (const instance of this.hooksSeriesAdd) {\n try {\n instance.plugin.onSeriesAdd!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" seriesAdd:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify series remove hooks\n */\n notifySeriesRemove(event: SeriesChangeEvent): void {\n for (const instance of this.hooksSeriesRemove) {\n try {\n instance.plugin.onSeriesRemove!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" seriesRemove:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify series change hooks\n */\n notifySeriesChange(event: SeriesChangeEvent): void {\n for (const instance of this.hooksSeriesChange) {\n try {\n instance.plugin.onSeriesChange!(instance.context, event);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" seriesChange:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify resize hooks\n */\n notifyResize(size: { width: number; height: number }): void {\n for (const instance of this.hooksResize) {\n try {\n instance.plugin.onResize!(instance.context, size);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" resize:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify theme change hooks\n */\n notifyThemeChange(theme: ChartTheme): void {\n // Update UI context theme\n for (const instance of this.plugins.values()) {\n (instance.context.ui as any).updateTheme?.(theme);\n }\n\n for (const instance of this.hooksThemeChange) {\n try {\n instance.plugin.onThemeChange!(instance.context, theme);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" themeChange:`,\n e\n );\n }\n }\n }\n\n /**\n * Notify selection change hooks\n */\n notifySelectionChange(points: readonly import(\"../core/selection\").SelectedPoint[]): void {\n for (const instance of this.hooksSelectionChange) {\n try {\n instance.plugin.onSelectionChange!(instance.context, points);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" selectionChange:`,\n e\n );\n }\n }\n }\n\n /**\n * Collect serialization data from plugins\n */\n collectSerializationData(): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n\n for (const instance of this.hooksSerialize) {\n try {\n const pluginData = instance.plugin.onSerialize!(instance.context);\n if (pluginData !== undefined) {\n data[instance.plugin.manifest.name] = {\n data: pluginData,\n storage: instance.context._getStorage()._serialize(),\n };\n }\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${instance.plugin.manifest.name}\" serialize:`,\n e\n );\n }\n }\n\n return data;\n }\n\n /**\n * Restore plugin data from serialization\n */\n restoreSerializationData(data: Record<string, unknown>): void {\n for (const [name, pluginData] of Object.entries(data)) {\n const instance = this.plugins.get(name);\n if (!instance) continue;\n\n const { data: customData, storage } = pluginData as {\n data: unknown;\n storage: Record<string, unknown>;\n };\n\n // Restore storage\n if (storage) {\n instance.context._getStorage()._deserialize(storage);\n }\n\n // Call deserialize hook\n if (instance.plugin.onDeserialize) {\n try {\n instance.plugin.onDeserialize(instance.context, customData);\n } catch (e) {\n console.error(\n `[SciChartEngine] Error in plugin \"${name}\" deserialize:`,\n e\n );\n }\n }\n }\n }\n\n /**\n * Destroy all plugins and cleanup\n */\n destroy(): void {\n if (this.destroyed) return;\n\n // Destroy in reverse order (LIFO)\n const names = Array.from(this.plugins.keys()).reverse();\n for (const name of names) {\n const instance = this.plugins.get(name)!;\n try {\n instance.plugin.onDestroy?.(instance.context);\n } catch (e) {\n console.error(`[SciChartEngine] Error destroying plugin \"${name}\":`, e);\n }\n instance.context._cleanup();\n }\n\n this.plugins.clear();\n this.clearHookCaches();\n this.destroyed = true;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async checkDependencies(manifest: PluginManifest): Promise<string[]> {\n const missing: string[] = [];\n\n if (manifest.dependencies) {\n for (const dep of manifest.dependencies) {\n if (!this.plugins.has(dep)) {\n missing.push(dep);\n }\n }\n }\n\n return missing;\n }\n\n private findDependents(name: string): string[] {\n const dependents: string[] = [];\n\n this.plugins.forEach((instance, pluginName) => {\n const deps = instance.plugin.manifest.dependencies || [];\n if (deps.includes(name)) {\n dependents.push(pluginName);\n }\n });\n\n return dependents;\n }\n\n private rebuildHookCaches(): void {\n const instances = Array.from(this.plugins.values()).filter((i) => i.initialized);\n\n this.hooksBeforeRender = instances.filter((i) => i.plugin.onBeforeRender);\n this.hooksAfterRender = instances.filter((i) => i.plugin.onAfterRender);\n this.hooksRenderWebGL = instances.filter((i) => i.plugin.onRenderWebGL);\n this.hooksRenderOverlay = instances.filter((i) => i.plugin.onRenderOverlay);\n this.hooksInteraction = instances.filter((i) => i.plugin.onInteraction);\n this.hooksViewChange = instances.filter((i) => i.plugin.onViewChange);\n this.hooksDataUpdate = instances.filter((i) => i.plugin.onDataUpdate);\n this.hooksSeriesAdd = instances.filter((i) => i.plugin.onSeriesAdd);\n this.hooksSeriesRemove = instances.filter((i) => i.plugin.onSeriesRemove);\n this.hooksSeriesChange = instances.filter((i) => i.plugin.onSeriesChange);\n this.hooksResize = instances.filter((i) => i.plugin.onResize);\n this.hooksThemeChange = instances.filter((i) => i.plugin.onThemeChange);\n this.hooksSelectionChange = instances.filter((i) => i.plugin.onSelectionChange);\n this.hooksSerialize = instances.filter((i) => i.plugin.onSerialize);\n }\n\n private clearHookCaches(): void {\n this.hooksBeforeRender = [];\n this.hooksAfterRender = [];\n this.hooksRenderWebGL = [];\n this.hooksRenderOverlay = [];\n this.hooksInteraction = [];\n this.hooksViewChange = [];\n this.hooksDataUpdate = [];\n this.hooksSeriesAdd = [];\n this.hooksSeriesRemove = [];\n this.hooksSeriesChange = [];\n this.hooksResize = [];\n this.hooksThemeChange = [];\n this.hooksSelectionChange = [];\n this.hooksSerialize = [];\n }\n}\n","/**\n * SciChart Engine - Global Plugin Registry\n * \n * Provides a global registry for third-party plugins that can be\n * discovered and loaded by name without explicit imports.\n * \n * @module plugins/PluginRegistry\n */\n\nimport type {\n PluginFactory,\n PluginManifest,\n PluginCapability,\n PluginRegistry,\n PluginRegistryEntry,\n} from \"./types\";\n\n// ============================================\n// Global Registry Implementation\n// ============================================\n\nclass PluginRegistryImpl implements PluginRegistry {\n private entries = new Map<string, PluginRegistryEntry>();\n\n /**\n * Register a plugin globally\n */\n register(entry: PluginRegistryEntry): void {\n const name = entry.manifest.name;\n\n if (this.entries.has(name)) {\n console.warn(\n `[SciChartEngine Registry] Plugin \"${name}\" is already registered, overwriting`\n );\n }\n\n this.entries.set(name, entry);\n }\n\n /**\n * Unregister a plugin\n */\n unregister(name: string): boolean {\n const existed = this.entries.has(name);\n this.entries.delete(name);\n return existed;\n }\n\n /**\n * Get a registered plugin factory by name\n */\n get(name: string): PluginFactory | undefined {\n return this.entries.get(name)?.factory;\n }\n\n /**\n * List all registered plugins\n */\n list(): PluginManifest[] {\n return Array.from(this.entries.values()).map((e) => e.manifest);\n }\n\n /**\n * Search plugins by capability\n */\n findByCapability(capability: PluginCapability): PluginManifest[] {\n const results: PluginManifest[] = [];\n\n this.entries.forEach((entry) => {\n if (entry.manifest.provides?.includes(capability)) {\n results.push(entry.manifest);\n }\n });\n\n return results;\n }\n\n /**\n * Search plugins by tag\n */\n findByTag(tag: string): PluginManifest[] {\n const results: PluginManifest[] = [];\n const lowerTag = tag.toLowerCase();\n\n this.entries.forEach((entry) => {\n if (entry.manifest.tags?.some((t) => t.toLowerCase().includes(lowerTag))) {\n results.push(entry.manifest);\n }\n });\n\n return results;\n }\n\n /**\n * Check if a plugin is registered\n */\n has(name: string): boolean {\n return this.entries.has(name);\n }\n\n /**\n * Get plugin count\n */\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.entries.clear();\n }\n}\n\n// ============================================\n// Singleton Instance\n// ============================================\n\nlet registryInstance: PluginRegistryImpl | null = null;\n\n/**\n * Get the global plugin registry singleton\n */\nexport function getPluginRegistry(): PluginRegistry {\n if (!registryInstance) {\n registryInstance = new PluginRegistryImpl();\n }\n return registryInstance;\n}\n\n/**\n * Register a plugin in the global registry\n * Shorthand for getPluginRegistry().register()\n */\nexport function registerPlugin(entry: PluginRegistryEntry): void {\n getPluginRegistry().register(entry);\n}\n\n/**\n * Create a plugin factory with manifest validation\n */\nexport function definePlugin<TConfig = unknown>(\n manifest: PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): PluginFactory<TConfig> {\n return (config?: TConfig) => {\n const plugin = factory(config);\n return {\n ...plugin,\n manifest,\n };\n };\n}\n\n/**\n * Register a plugin from definition\n */\nexport function defineAndRegister<TConfig = unknown>(\n manifest: PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): PluginFactory<TConfig> {\n const pluginFactory = definePlugin(manifest, factory);\n registerPlugin({ manifest, factory: pluginFactory as PluginFactory });\n return pluginFactory;\n}\n\n// ============================================\n// Plugin Discovery Helpers\n// ============================================\n\n/**\n * Load a plugin from the registry by name\n */\nexport async function loadPlugin<TConfig = unknown>(\n name: string,\n config?: TConfig\n): Promise<import(\"./types\").ChartPlugin<TConfig> | undefined> {\n const factory = getPluginRegistry().get(name);\n if (!factory) {\n console.warn(`[SciChartEngine] Plugin \"${name}\" not found in registry`);\n return undefined;\n }\n return factory(config) as import(\"./types\").ChartPlugin<TConfig>;\n}\n\n/**\n * List available plugins by category\n */\nexport function listPluginsByCategory(): Record<PluginCapability, PluginManifest[]> {\n const registry = getPluginRegistry();\n const categories: PluginCapability[] = [\n \"analysis\",\n \"visualization\",\n \"interaction\",\n \"data-source\",\n \"export\",\n \"ui\",\n \"annotation\",\n \"theme\",\n ];\n\n const result: Record<string, PluginManifest[]> = {};\n categories.forEach((cat) => {\n result[cat] = registry.findByCapability(cat);\n });\n\n return result as Record<PluginCapability, PluginManifest[]>;\n}\n\n// ============================================\n// Plugin Validation\n// ============================================\n\n/**\n * Validate a plugin manifest\n */\nexport function validateManifest(manifest: PluginManifest): string[] {\n const errors: string[] = [];\n\n if (!manifest.name) {\n errors.push(\"Missing required field: name\");\n } else if (!/^[@a-z0-9-]+\\/[a-z0-9-]+$|^[a-z0-9-]+$/.test(manifest.name)) {\n errors.push(\n 'Invalid name format. Use lowercase with hyphens, optionally scoped (e.g., \"@org/name\")'\n );\n }\n\n if (!manifest.version) {\n errors.push(\"Missing required field: version\");\n } else if (!/^\\d+\\.\\d+\\.\\d+$/.test(manifest.version)) {\n errors.push(\"Invalid version format. Use semantic versioning (e.g., 1.0.0)\");\n }\n\n if (manifest.dependencies) {\n if (!Array.isArray(manifest.dependencies)) {\n errors.push(\"dependencies must be an array\");\n }\n }\n\n if (manifest.provides) {\n if (!Array.isArray(manifest.provides)) {\n errors.push(\"provides must be an array\");\n }\n }\n\n return errors;\n}\n\n/**\n * Validate a plugin for compatibility\n */\nexport function checkPluginCompatibility(\n manifest: PluginManifest,\n engineVersion: string\n): { compatible: boolean; warnings: string[] } {\n const warnings: string[] = [];\n\n if (manifest.engineVersion) {\n const [reqMajor] = manifest.engineVersion.split(\".\").map(Number);\n const [curMajor] = engineVersion.split(\".\").map(Number);\n\n if (reqMajor > curMajor) {\n return {\n compatible: false,\n warnings: [\n `Plugin requires engine v${manifest.engineVersion}, current is v${engineVersion}`,\n ],\n };\n }\n\n if (reqMajor < curMajor) {\n warnings.push(\n `Plugin was built for engine v${manifest.engineVersion}, may have compatibility issues`\n );\n }\n }\n\n return { compatible: true, warnings };\n}\n","/**\n * SciChart Engine - Plugin System\n * \n * Comprehensive plugin architecture for extending chart functionality.\n * \n * Features:\n * - Complete lifecycle hooks (init, render, data, view, interaction, destroy)\n * - Rich plugin context with access to all chart internals\n * - Plugin storage for persistent state\n * - Dependency management between plugins\n * - Global registry for third-party plugins\n * - Built-in plugins for common use cases\n * \n * @packageDocumentation\n * @module plugins\n */\n\n// ============================================\n// Core Types\n// ============================================\nexport type {\n // Manifest & Metadata\n PluginVersion,\n PluginCapability,\n PluginManifest,\n\n // Context Types\n PluginContext,\n RenderContext,\n CoordinateContext,\n DataContext,\n UIContext,\n EventContext,\n PluginStorage,\n PluginLogger,\n OverlayOptions,\n NotificationOptions,\n PickResult,\n\n // Hook Event Types\n BeforeRenderEvent,\n AfterRenderEvent,\n InteractionEvent,\n ViewChangeEvent,\n SeriesChangeEvent,\n DataUpdateEvent,\n\n // Plugin Types\n ChartPlugin,\n PluginFactory,\n TypedPlugin,\n\n // Manager Types\n PluginManager,\n PluginRegistry,\n PluginRegistryEntry,\n} from \"./types\";\n\n// ============================================\n// Core Implementation\n// ============================================\nexport { createPluginContext } from \"./PluginContext\";\nexport type { ContextDependencies } from \"./PluginContext\";\n\nexport { PluginManagerImpl } from \"./PluginManager\";\n\n// ============================================\n// Registry\n// ============================================\nexport {\n getPluginRegistry,\n registerPlugin,\n definePlugin,\n defineAndRegister,\n loadPlugin,\n listPluginsByCategory,\n validateManifest,\n checkPluginCompatibility,\n} from \"./PluginRegistry\";\n\n// ============================================\n// Built-in Plugins\n// ============================================\nexport {\n // Individual plugins\n CrosshairPlugin,\n StatsPlugin,\n WatermarkPlugin,\n GridHighlightPlugin,\n DataLoggerPlugin,\n DirectionIndicatorPlugin,\n\n // Plugin collection\n BuiltinPlugins,\n\n // Plugin configs\n type CrosshairPluginConfig,\n type StatsPluginConfig,\n type WatermarkPluginConfig,\n type GridHighlightConfig,\n type DataLoggerConfig,\n type DirectionIndicatorConfig,\n} from \"./builtins\";\n\n// ============================================\n// Modular Plugins\n// ============================================\nexport { Plugin3D, type Plugin3DConfig } from \"./3d\";\nexport { PluginGpu, type PluginGpuConfig } from \"./gpu\";\nexport { PluginAnalysis, type PluginAnalysisConfig } from \"./analysis\";\nexport { PluginTools, type PluginToolsConfig } from \"./tools\";\nexport { PluginAnnotations, type PluginAnnotationsConfig } from \"./annotations\";\nexport { PluginStreaming, type PluginStreamingConfig } from \"./streaming\";\nexport { PluginThemeEditor, type PluginThemeEditorConfig } from \"./theme-editor\";\nexport { PluginI18n, type PluginI18nConfig } from \"./i18n\";\nexport { PluginKeyboard, type PluginKeyboardConfig } from \"./keyboard\";\nexport { PluginClipboard, type PluginClipboardConfig } from \"./clipboard\";\nexport { PluginSync, type PluginSyncConfig } from \"./sync\";\nexport { PluginDebug, type PluginDebugConfig } from \"./debug\";\nexport { PluginLoading, type PluginLoadingConfig } from \"./loading\";\nexport { PluginDataExport, type PluginDataExportConfig } from \"./data-export\";\nexport { PluginContextMenu, type PluginContextMenuConfig } from \"./context-menu\";\n\n// ============================================\n// Helper for creating typed plugins\n// ============================================\n\n/**\n * Helper function to create a plugin with proper typing\n * \n * @example\n * ```typescript\n * const MyPlugin = createPlugin({\n * manifest: {\n * name: 'my-plugin',\n * version: '1.0.0',\n * provides: ['analysis'],\n * },\n * onInit(ctx) {\n * ctx.log.info('Plugin initialized!');\n * },\n * onAfterRender(ctx, event) {\n * // Custom rendering\n * },\n * api: {\n * doSomething() { return 'done'; }\n * }\n * });\n * \n * chart.use(MyPlugin);\n * ```\n */\nexport function createPlugin<TConfig = void, TApi extends Record<string, unknown> = {}>(\n definition: import(\"./types\").ChartPlugin<TConfig> & { api?: TApi }\n): import(\"./types\").ChartPlugin<TConfig> & { api: TApi } {\n return definition as import(\"./types\").ChartPlugin<TConfig> & { api: TApi };\n}\n\n/**\n * Helper function to create a configurable plugin factory\n * \n * @example\n * ```typescript\n * interface MyConfig {\n * color: string;\n * enabled: boolean;\n * }\n * \n * const MyPlugin = createConfigurablePlugin<MyConfig>(\n * {\n * name: 'my-plugin',\n * version: '1.0.0',\n * },\n * (config) => ({\n * onInit(ctx) {\n * ctx.log.info(`Color: ${config?.color}`);\n * }\n * })\n * );\n * \n * chart.use(MyPlugin({ color: 'red', enabled: true }));\n * ```\n */\nexport function createConfigurablePlugin<TConfig = void>(\n manifest: import(\"./types\").PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): import(\"./types\").PluginFactory<TConfig> {\n return (config?: TConfig) => ({\n ...factory(config),\n manifest,\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\";\nimport type { InteractionMode } from \"./InteractionManager\";\nimport { ToolbarOptions, ToolbarButtons } from \"../types\";\n\nexport interface ChartControlsCallbacks {\n onResetZoom: () => void;\n onSetType: (type: \"line\" | \"scatter\" | \"line+scatter\") => void;\n onToggleSmoothing: () => void;\n onTogglePan: (active: boolean) => void;\n onSetMode: (mode: InteractionMode) => void;\n onExport: () => void;\n onAutoScale: () => void;\n onToggleLegend: (visible: boolean) => void;\n onHoverStart: () => void;\n onHoverEnd: () => void;\n}\n\n// ============================================\n// SVG Icons (Plotly-inspired)\n// ============================================\n\nconst ICONS = {\n PAN: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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 BOX_ZOOM: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" stroke-dasharray=\"4 2\"></rect><circle cx=\"9\" cy=\"9\" r=\"3\"></circle><line x1=\"21\" y1=\"21\" x2=\"15\" y2=\"15\"></line></svg>`,\n SELECT: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" stroke-dasharray=\"4 2\"></rect><circle cx=\"8\" cy=\"10\" r=\"1.5\" fill=\"currentColor\"></circle><circle cx=\"12\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"></circle><circle cx=\"16\" cy=\"9\" r=\"1.5\" fill=\"currentColor\"></circle></svg>`,\n DELTA: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke-dasharray=\"4 2\"></line><circle cx=\"4\" cy=\"20\" r=\"2\" fill=\"currentColor\"></circle><circle cx=\"20\" cy=\"4\" r=\"2\" fill=\"currentColor\"></circle><path d=\"M8 16h8M16 16v-8\" stroke-width=\"1\" opacity=\"0.5\"></path></svg>`,\n RESET: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" 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=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg>`,\n BOTH: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" 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=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 6h16M4 12h16M4 18h7\"></path></svg>`,\n INTEGRATE: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 16c3-9 15-9 18 0\"></path><line x1=\"3\" y1=\"16\" x2=\"21\" y2=\"16\"></line><path d=\"M7 16v-4M12 16V9M17 16v-4\" stroke-width=\"1\" opacity=\"0.5\"></path></svg>`,\n PIN: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"22\"></line><path d=\"M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6a3 3 0 0 0-6 0v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17z\"></path></svg>`,\n PIN_OFF: `<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\"></line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"22\"></line><path d=\"M9 10.76V6a3 3 0 0 1 1.43-2.54m2.68.74A3 3 0 0 1 15 6v4.76a2 2 0 0 0 1.11 1.79l1.78.9A2 2 0 0 1 19 15.24V17h-2\"></path><path d=\"M5 17h8\"></path></svg>`\n};\n\nexport class ChartControls {\n private container: HTMLDivElement;\n private toolbar: HTMLDivElement;\n private buttonsWrapper: HTMLDivElement;\n private callbacks: ChartControlsCallbacks;\n private theme: ChartTheme;\n private options: ToolbarOptions;\n\n private isSmoothing = false;\n private currentMode: InteractionMode = 'pan';\n private isLegendVisible = true;\n private currentType: \"line\" | \"scatter\" | \"line+scatter\" = \"line\";\n private isPinned = false;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n callbacks: ChartControlsCallbacks,\n options?: ToolbarOptions\n ) {\n this.callbacks = callbacks;\n this.theme = theme;\n this.options = options || {};\n\n this.isPinned = this.options.pinnable === false;\n this.isExpanded = this.isPinned;\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: 2px;\n right: 2px;\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 \n this.buttonsWrapper = document.createElement(\"div\");\n this.buttonsWrapper.style.cssText = `\n display: flex;\n align-items: center;\n gap: 2px;\n overflow: hidden;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n\n this.updateToolbarStyle();\n\n this.createButtons();\n this.toolbar.appendChild(this.buttonsWrapper);\n \n if (this.options.pinnable !== false) {\n this.createPinButton();\n }\n\n this.container.appendChild(this.toolbar);\n parent.appendChild(this.container);\n \n this.updateVisibility();\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 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 // Stop pointer events from reaching the chart, but ALLOW release events\n const stopPropagation = (e: Event) => e.stopPropagation();\n [\"mousedown\", \"mousemove\", \"pointerdown\", \"pointermove\", \"wheel\", \"touchstart\", \"touchmove\"].forEach(\n (evt) => this.container.addEventListener(evt, stopPropagation)\n );\n\n const glassBg = this.theme.toolbar.backgroundColor;\n const glassBorder = `1px solid ${this.theme.toolbar.borderColor}`;\n const borderRadius = `${this.theme.toolbar.borderRadius}px`;\n\n this.toolbar.style.cssText = `\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 0;\n background: ${glassBg};\n backdrop-filter: blur(2px) saturate(180%);\n -webkit-backdrop-filter: blur(2px) saturate(180%);\n border: ${glassBorder};\n border-radius: ${borderRadius};\n box-shadow: ${shadow};\n transition: all 0.3s cubic-bezier(0.4, 0, 0.4, 1);\n `;\n\n this.toolbar.onmouseenter = () => {\n this.toolbar.style.backdropFilter = \"blur(10px) saturate(180%)\";\n (this.toolbar.style as any).webkitBackdropFilter = \"blur(10px) saturate(180%)\";\n \n this.callbacks.onHoverStart();\n \n if (this.options.pinnable !== false) {\n this.isExpanded = true;\n this.updateVisibility();\n }\n };\n this.toolbar.onmouseleave = () => {\n this.toolbar.style.backdropFilter = \"blur(2px) saturate(180%)\";\n (this.toolbar.style as any).webkitBackdropFilter = \"blur(2px) saturate(180%)\";\n \n this.callbacks.onHoverEnd();\n \n if (this.options.pinnable !== false) {\n this.isExpanded = false;\n this.updateVisibility();\n }\n };\n\n }\n\n private updateVisibility(): void {\n if (this.options.pinnable === false) return;\n\n const visible = this.isExpanded || this.isPinned;\n this.buttonsWrapper.style.maxWidth = visible ? \"500px\" : \"0px\";\n this.buttonsWrapper.style.opacity = visible ? \"1\" : \"0\";\n this.buttonsWrapper.style.pointerEvents = visible ? \"auto\" : \"none\";\n this.buttonsWrapper.style.marginRight = visible ? \"4px\" : \"0px\";\n }\n\n private createButtons(): void {\n const b = this.options.buttons || {};\n const show = (id: keyof ToolbarButtons, def = true) => b[id] ?? def;\n\n // Pan Mode\n if (show('pan')) {\n this.createButton(\n ICONS.PAN,\n \"Pan Mode (drag to move)\",\n () => {\n this.currentMode = 'pan';\n this.updateButtonStates();\n this.callbacks.onSetMode('pan');\n },\n \"pan\"\n );\n }\n\n // Box Zoom Mode\n if (show('boxZoom')) {\n this.createButton(\n ICONS.BOX_ZOOM,\n \"Box Zoom (drag to zoom)\",\n () => {\n this.currentMode = 'boxZoom';\n this.updateButtonStates();\n this.callbacks.onSetMode('boxZoom');\n },\n \"boxZoom\"\n );\n }\n\n // Selection Mode\n if (show('select')) {\n this.createButton(\n ICONS.SELECT,\n \"Select Points (drag to select)\",\n () => {\n this.currentMode = 'select';\n this.updateButtonStates();\n this.callbacks.onSetMode('select');\n },\n \"select\"\n );\n }\n\n // Delta Tool Mode\n if (show('delta')) {\n this.createButton(\n ICONS.DELTA,\n \"Delta Tool (measure distances)\",\n () => {\n this.currentMode = 'delta';\n this.updateButtonStates();\n this.callbacks.onSetMode('delta');\n },\n \"delta\"\n );\n }\n\n // Peak integration Mode\n if (show('peak')) {\n this.createButton(\n ICONS.INTEGRATE,\n \"Peak Integration (detect baseline & calculate area)\",\n () => {\n this.currentMode = 'peak';\n this.updateButtonStates();\n this.callbacks.onSetMode('peak');\n },\n \"peak\"\n );\n }\n\n // Reset Zoom\n if (show('reset', false)) {\n this.createButton(\n ICONS.RESET,\n \"Reset Zoom\",\n () => this.callbacks.onResetZoom(),\n \"reset\"\n );\n }\n\n // Auto Scale\n if (show('autoscale')) {\n this.createButton(\n ICONS.AUTOSCALE,\n \"Auto Scale\",\n () => this.callbacks.onAutoScale(),\n \"autoscale\"\n );\n }\n\n // Type Switcher\n if (show('type')) {\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\n // Smoothing\n if (show('smooth')) {\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\n // Export Image\n if (show('export')) {\n this.createButton(\n ICONS.EXPORT,\n \"Export as PNG\",\n () => this.callbacks.onExport(),\n \"export\"\n );\n }\n\n // Toggle Legend\n if (show('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 }\n\n private createPinButton(): void {\n const btn = this.createButton(\n this.isPinned ? ICONS.PIN : ICONS.PIN_OFF,\n this.isPinned ? \"Unpin Toolbar\" : \"Pin Toolbar\",\n () => {\n this.isPinned = !this.isPinned;\n btn.innerHTML = `<span class=\"scichart-control-icon\">${this.isPinned ? ICONS.PIN : ICONS.PIN_OFF}</span>`;\n this.enforceSVGVisibility(btn);\n this.updateVisibility();\n },\n \"pin\",\n this.toolbar\n );\n btn.style.marginLeft = \"2px\";\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 parent: HTMLElement = this.buttonsWrapper\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 parent.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 panActiveColor = \"#38bdf8\"; // Brighter blue for pan\n const zoomActiveColor = \"#f59e0b\"; // Orange for box zoom\n const selectActiveColor = \"#a855f7\"; // Purple for selection\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 // Mode buttons (pan, boxZoom, select) - only one can be active\n if (id === \"pan\") {\n const isActive = this.currentMode === 'pan';\n btn.style.color = isActive ? panActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(56, 189, 248, 0.15)\" : \"rgba(56, 189, 248, 0.1)\")\n : \"transparent\";\n } else if (id === \"boxZoom\") {\n const isActive = this.currentMode === 'boxZoom';\n btn.style.color = isActive ? zoomActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(245, 158, 11, 0.15)\" : \"rgba(245, 158, 11, 0.1)\")\n : \"transparent\";\n } else if (id === \"select\") {\n const isActive = this.currentMode === 'select';\n btn.style.color = isActive ? selectActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(168, 85, 247, 0.15)\" : \"rgba(168, 85, 247, 0.1)\")\n : \"transparent\";\n } else if (id === \"delta\") {\n const isActive = this.currentMode === 'delta';\n const deltaActiveColor = \"#ef4444\"; // Red for delta\n btn.style.color = isActive ? deltaActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(239, 68, 68, 0.15)\" : \"rgba(239, 68, 68, 0.1)\")\n : \"transparent\";\n } else if (id === \"peak\") {\n const isActive = this.currentMode === 'peak';\n const peakActiveColor = \"#10b981\"; // Green for peak/integrate\n btn.style.color = isActive ? peakActiveColor : normalColor;\n btn.style.opacity = isHover || isActive ? \"1\" : \"0.8\";\n btn.style.background = isActive\n ? (isDark ? \"rgba(16, 185, 129, 0.15)\" : \"rgba(16, 185, 129, 0.1)\")\n : \"transparent\";\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 } else if (!isHover) {\n btn.style.background = \"transparent\";\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 } else if (!isHover) {\n btn.style.background = \"transparent\";\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 if (!isHover) {\n btn.style.background = \"transparent\";\n }\n } else if (id === \"reset\" || id === \"autoscale\" || id === \"export\") {\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n if (!isHover) {\n btn.style.background = \"transparent\";\n }\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 onResize?: (width: number) => void;\n onInteractionStart?: () => void;\n onInteractionEnd?: () => void;\n onHoverStart?: () => void;\n onHoverEnd?: () => void;\n onSeriesHoverStart?: (series: Series) => void;\n onSeriesHoverEnd?: (series: Series) => void;\n onToggleVisibility?: (series: Series) => void;\n}\n\nexport class ChartLegend {\n private container: HTMLDivElement;\n private visualContainer: HTMLDivElement;\n private header: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Series[] = [];\n private callbacks: ChartLegendCallbacks;\n private swatchCanvases = new Map<string, HTMLCanvasElement>();\n\n private isDragging = false;\n private isResizing = false;\n private dragOffsetX = 0;\n private dragOffsetY = 0;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n options: { x?: number; y?: number; width?: number },\n callbacks: ChartLegendCallbacks\n ) {\n this.theme = theme;\n this.callbacks = callbacks;\n\n const width = options.width ?? 120;\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 - 4}px;\n top: ${y - 4}px;\n z-index: 90;\n pointer-events: auto;\n padding: 4px;\n user-select: none;\n `;\n \n // Stop pointer events from reaching the chart, but ALLOW release events to bubble to document for drag logic\n const stopPropagation = (e: Event) => e.stopPropagation();\n [\"mousedown\", \"mousemove\", \"pointerdown\", \"pointermove\", \"wheel\", \"touchstart\", \"touchmove\"].forEach(\n (evt) => this.container.addEventListener(evt, stopPropagation)\n );\n\n this.visualContainer = document.createElement(\"div\");\n this.visualContainer.style.cssText = `\n width: ${width}px;\n border-radius: ${theme.legend.borderRadius}px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n transition: box-shadow 0.2s ease;\n position: relative;\n `;\n this.container.appendChild(this.visualContainer);\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.visualContainer.appendChild(this.header);\n this.visualContainer.appendChild(this.content);\n \n // Resize handle\n const resizeHandle = document.createElement(\"div\");\n resizeHandle.style.cssText = `\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 8px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n `;\n this.visualContainer.appendChild(resizeHandle);\n\n parent.appendChild(this.container);\n\n this.initDragging(resizeHandle);\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 const glassBg = this.theme.legend.backgroundColor;\n const glassBorder = `1px solid ${this.theme.legend.borderColor}`;\n\n this.visualContainer.style.background = glassBg;\n this.visualContainer.style.backdropFilter = \"blur(2px) saturate(180%)\";\n (this.visualContainer.style as any).webkitBackdropFilter =\n \"blur(2px) saturate(180%)\";\n this.visualContainer.style.border = glassBorder;\n this.visualContainer.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 this.container.onmouseenter = () => {\n this.visualContainer.style.backdropFilter = \"blur(10px) saturate(180%)\";\n (this.visualContainer.style as any).webkitBackdropFilter = \"blur(10px) saturate(180%)\";\n if (this.callbacks.onHoverStart) this.callbacks.onHoverStart();\n };\n this.container.onmouseleave = () => {\n this.visualContainer.style.backdropFilter = \"blur(2px) saturate(180%)\";\n (this.visualContainer.style as any).webkitBackdropFilter = \"blur(2px) saturate(180%)\";\n if (this.callbacks.onHoverEnd) this.callbacks.onHoverEnd();\n };\n }\n\n private initDragging(resizeHandle: HTMLDivElement): void {\n let rafId: number | null = null;\n let currentX = 0;\n let currentY = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n\n const rect = this.container.getBoundingClientRect();\n this.dragOffsetX = e.clientX - rect.left;\n this.dragOffsetY = e.clientY - rect.top;\n this.isDragging = true;\n if (this.callbacks.onInteractionStart) this.callbacks.onInteractionStart();\n\n this.container.style.transition = \"none\";\n this.container.style.willChange = \"left, top\";\n this.visualContainer.style.boxShadow = \"0 8px 24px rgba(0,0,0,0.3)\";\n this.container.style.cursor = \"grabbing\";\n\n document.addEventListener(\"mousemove\", onMouseMove, { capture: true });\n document.addEventListener(\"mouseup\", onMouseUp, { capture: true });\n };\n\n const onResizeMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n\n this.isResizing = true;\n this.dragOffsetX = e.clientX; // Store initial mouse X\n this.dragOffsetY = this.visualContainer.clientWidth; // Store initial width\n if (this.callbacks.onInteractionStart) this.callbacks.onInteractionStart();\n\n this.container.style.transition = \"none\";\n this.container.style.cursor = \"ew-resize\";\n document.body.style.cursor = \"ew-resize\";\n\n document.addEventListener(\"mousemove\", onMouseMove, { capture: true });\n document.addEventListener(\"mouseup\", onMouseUp, { capture: true });\n };\n\n const updatePosition = () => {\n const parentRect = this.container.parentElement?.getBoundingClientRect();\n if (!parentRect) return;\n\n if (this.isDragging) {\n let newX = currentX - parentRect.left - this.dragOffsetX;\n let newY = currentY - parentRect.top - this.dragOffsetY;\n\n newX = Math.max(0, Math.min(newX, parentRect.width - this.container.clientWidth));\n newY = Math.max(0, Math.min(newY, parentRect.height - this.container.clientHeight));\n\n this.container.style.left = `${newX}px`;\n this.container.style.top = `${newY}px`;\n } else if (this.isResizing) {\n const deltaX = currentX - this.dragOffsetX;\n const newWidth = Math.max(80, Math.min(600, this.dragOffsetY + deltaX));\n this.visualContainer.style.width = `${newWidth}px`;\n if (this.callbacks.onResize) this.callbacks.onResize(newWidth);\n }\n rafId = null;\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!this.isDragging && !this.isResizing) return;\n currentX = e.clientX;\n currentY = e.clientY;\n if (!rafId) {\n rafId = requestAnimationFrame(updatePosition);\n }\n };\n\n const onMouseUp = () => {\n if (this.isDragging || this.isResizing) {\n if (rafId) cancelAnimationFrame(rafId);\n rafId = null;\n\n if (this.isDragging) {\n const rect = this.container.getBoundingClientRect();\n const parentRect = this.container.parentElement?.getBoundingClientRect();\n if (parentRect) {\n this.callbacks.onMove(rect.left - parentRect.left, rect.top - parentRect.top);\n }\n }\n\n this.isDragging = false;\n this.isResizing = false;\n if (this.callbacks.onInteractionEnd) this.callbacks.onInteractionEnd();\n this.container.style.willChange = \"auto\";\n this.container.style.transition = \"box-shadow 0.2s ease\";\n this.visualContainer.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.15)\";\n this.container.style.cursor = \"auto\";\n document.body.style.cursor = \"auto\";\n }\n document.removeEventListener(\"mousemove\", onMouseMove, { capture: true });\n document.removeEventListener(\"mouseup\", onMouseUp, { capture: true });\n };\n\n this.header.addEventListener(\"mousedown\", onMouseDown);\n resizeHandle.addEventListener(\"mousedown\", onResizeMouseDown);\n\n // Block events from reaching the chart while over the legend\n // but ALLOW propagation when dragging/resizing so the document listeners work\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 \n const stopIfNoDrag = (e: Event) => {\n if (!this.isDragging && !this.isResizing) {\n e.stopPropagation();\n }\n };\n\n this.container.addEventListener(\"mousemove\", stopIfNoDrag);\n this.container.addEventListener(\"pointermove\", stopIfNoDrag);\n this.container.addEventListener(\"pointerdown\", stopIfNoDrag);\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\n this.series.forEach((s) => {\n const item = document.createElement(\"div\");\n item.style.cssText = `\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: ${legend.itemGap * 0.5}px;\n font-family: ${legend.fontFamily};\n font-size: ${legend.fontSize}px;\n color: ${legend.textColor};\n width: 100%;\n overflow: hidden;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n transition: all 0.1s ease;\n `;\n\n item.onmouseenter = () => {\n item.style.background = \"rgba(128, 128, 128, 0.1)\";\n item.style.transform = \"translateX(2px)\";\n if (this.callbacks.onSeriesHoverStart) {\n this.callbacks.onSeriesHoverStart(s);\n }\n };\n item.onmouseleave = () => {\n item.style.background = \"transparent\";\n item.style.transform = \"none\";\n if (this.callbacks.onSeriesHoverEnd) {\n this.callbacks.onSeriesHoverEnd(s);\n }\n };\n\n item.onclick = (e) => {\n e.stopPropagation();\n if (this.callbacks.onToggleVisibility) {\n this.callbacks.onToggleVisibility(s);\n }\n };\n\n // Use a canvas for the swatch to support symbols\n const swatch = document.createElement(\"canvas\");\n this.swatchCanvases.set(s.getId(), swatch);\n this.paintSwatch(swatch, s);\n const label = document.createElement(\"span\");\n label.textContent = s.getName();\n label.title = s.getName(); // Tooltip on hover\n label.style.cssText = `\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n `;\n\n item.appendChild(swatch);\n item.appendChild(label);\n this.content.appendChild(item);\n\n // Initial state sync\n if (!s.isVisible()) {\n item.style.opacity = \"0.5\";\n label.style.color = \"#888888\";\n }\n });\n }\n\n public updateSeriesStyle(s: Series): void {\n const swatch = this.swatchCanvases.get(s.getId());\n if (swatch) {\n this.paintSwatch(swatch, s);\n }\n \n // Also update item look\n this.series.forEach((series, i) => {\n if (series.getId() === s.getId()) {\n const item = this.content.children[i] as HTMLDivElement;\n if (item) {\n const label = item.querySelector(\"span\");\n if (s.isVisible()) {\n item.style.opacity = \"1\";\n if (label) label.style.color = this.theme.legend.textColor;\n } else {\n item.style.opacity = \"0.5\";\n if (label) label.style.color = \"#888888\";\n }\n }\n }\n });\n }\n\n private paintSwatch(swatch: HTMLCanvasElement, s: Series): void {\n const legend = this.theme.legend;\n const dpr = window.devicePixelRatio || 1;\n const size = legend.swatchSize;\n\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) return;\n\n ctx.clearRect(0, 0, swatch.width, swatch.height);\n ctx.scale(dpr, dpr);\n\n const style = s.getStyle();\n const isVisible = s.isVisible();\n const color = isVisible ? (style.color || \"#ff0055\") : \"#888888\";\n const type = s.getType();\n const symbol = style.symbol || \"circle\";\n\n ctx.fillStyle = color;\n ctx.strokeStyle = color;\n ctx.globalAlpha = isVisible ? 1 : 0.6;\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 =\n typeStr === \"scatter\" ||\n typeStr === \"1\" ||\n (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 /**\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 setWidth(width: number): void {\n this.visualContainer.style.width = `${width}px`;\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\";\nimport type { InteractionMode } from \"../InteractionManager\";\n\nexport interface UIContext {\n container: HTMLDivElement;\n theme: ChartTheme;\n showControls: boolean;\n toolbar?: import(\"../../types\").ToolbarOptions;\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 setMode: (mode: InteractionMode) => void;\n onLegendMove: (x: number, y: number) => void;\n onToggleSmoothing: () => void;\n toggleLegend: () => void;\n onInteractionStart?: () => void;\n onInteractionEnd?: () => void;\n onHoverStart?: () => void;\n onHoverEnd?: () => void;\n onSeriesHoverStart?: (series: Series) => void;\n onSeriesHoverEnd?: (series: Series) => void;\n onToggleVisibility?: (series: Series) => 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 onSetMode: (mode) => ctx.setMode(mode),\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 onHoverStart: () => ctx.onHoverStart?.(),\n onHoverEnd: () => ctx.onHoverEnd?.(),\n }, ctx.toolbar);\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 onInteractionStart: () => ctx.onInteractionStart?.(),\n onInteractionEnd: () => ctx.onInteractionEnd?.(),\n onHoverStart: () => ctx.onHoverStart?.(),\n onHoverEnd: () => ctx.onHoverEnd?.(),\n onSeriesHoverStart: (s) => ctx.onSeriesHoverStart?.(s),\n onSeriesHoverEnd: (s) => ctx.onSeriesHoverEnd?.(s),\n onToggleVisibility: (s) => ctx.onToggleVisibility?.(s),\n }\n );\n legend.update(Array.from(ctx.series.values()));\n return legend;\n}\n","/**\n * Chart Initialization Queue\n * \n * Internal system that manages sequential initialization of multiple charts.\n * This is automatically integrated into createChart - no external usage needed.\n */\n\ninterface QueueItem {\n id: string;\n execute: () => void;\n}\n\nclass ChartInitQueueInternal {\n private queue: QueueItem[] = [];\n private isProcessing = false;\n private completedCount = 0;\n private currentChartId: string | null = null;\n private idCounter = 0;\n\n // Delay between chart initializations (ms)\n private readonly INIT_DELAY = 30;\n\n /**\n * Generate a unique chart ID\n */\n generateId(): string {\n return `chart_${++this.idCounter}_${Date.now().toString(36)}`;\n }\n\n /**\n * Add a chart initialization to the queue\n * Returns a promise that resolves when this specific chart can initialize\n */\n enqueue(): Promise<string> {\n const id = this.generateId();\n\n return new Promise((resolve) => {\n this.queue.push({\n id,\n execute: () => resolve(id),\n });\n\n // Start processing if not already\n if (!this.isProcessing) {\n this.processNext();\n }\n });\n }\n\n /**\n * Mark a chart as fully initialized\n * This allows the next chart in queue to proceed\n */\n markComplete(id: string): void {\n if (this.currentChartId === id) {\n this.completedCount++;\n this.currentChartId = null;\n\n // Small delay before processing next chart\n setTimeout(() => this.processNext(), this.INIT_DELAY);\n }\n }\n\n /**\n * Process the next chart in queue\n */\n private processNext(): void {\n if (this.queue.length === 0) {\n this.isProcessing = false;\n this.currentChartId = null;\n return;\n }\n\n this.isProcessing = true;\n const item = this.queue.shift()!;\n this.currentChartId = item.id;\n\n // Execute the initialization callback\n item.execute();\n }\n\n /**\n * Get current queue status\n */\n getStatus(): { pending: number; completed: number; currentId: string | null; isProcessing: boolean } {\n return {\n pending: this.queue.length,\n completed: this.completedCount,\n currentId: this.currentChartId,\n isProcessing: this.isProcessing,\n };\n }\n\n /**\n * Clear the queue (useful for page navigation)\n */\n clear(): void {\n this.queue = [];\n this.isProcessing = false;\n this.currentChartId = null;\n }\n\n /**\n * Reset the queue completely\n */\n reset(): void {\n this.clear();\n this.completedCount = 0;\n this.idCounter = 0;\n }\n}\n\n// Singleton instance - internal use only\nconst globalQueue = new ChartInitQueueInternal();\n\n/**\n * Internal: Wait for turn in initialization queue\n * Returns the assigned chart ID\n */\nexport function waitForInitTurn(): Promise<string> {\n return globalQueue.enqueue();\n}\n\n/**\n * Internal: Mark chart initialization as complete\n */\nexport function markInitComplete(id: string): void {\n globalQueue.markComplete(id);\n}\n\n/**\n * Get queue status (for debugging)\n */\nexport function getInitQueueStatus() {\n return globalQueue.getStatus();\n}\n\n/**\n * Reset the queue (call on page navigation if needed)\n */\nexport function resetInitQueue(): void {\n globalQueue.reset();\n}\n\n// Legacy exports for backwards compatibility\nexport class ChartInitQueue {\n private static instance = globalQueue;\n\n static getStatus() {\n return this.instance.getStatus();\n }\n\n static reset() {\n this.instance.reset();\n }\n}\n\nexport function getChartInitQueue() {\n return {\n getStatus: () => globalQueue.getStatus(),\n reset: () => globalQueue.reset(),\n };\n}\n\n// Legacy compatibility - now does nothing as queue is automatic\nexport async function queueChartInit(_id: string, fn: () => Promise<void>): Promise<void> {\n await fn();\n}\n\nexport function waitForAnimations(durationMs: number = 200): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, durationMs));\n}\n\nexport function resetChartQueue(): void {\n globalQueue.reset();\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 { EventEmitter } from \"../EventEmitter\";\nimport { Series } from \"../Series\";\nimport {\n NativeWebGLRenderer,\n parseColor,\n brightenColor,\n} from \"../../renderer/NativeWebGLRenderer\";\nimport { LinearScale, LogScale, 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 type { Annotation } from \"../annotations\";\nimport {\n SelectionManager,\n type SelectedPoint,\n type SelectionMode,\n type HitTestResult,\n type SelectionConfig,\n} from \"../selection\";\nimport {\n ResponsiveManager,\n type ResponsiveConfig,\n type ResponsiveState,\n} from \"../responsive\";\nimport {\n SERIALIZATION_VERSION,\n encodeFloat32Array,\n decodeFloat32Array,\n stateToUrlHash,\n urlHashToState,\n type ChartState,\n type SerializeOptions,\n type DeserializeOptions,\n} from \"../../serialization\";\n\nimport type { Chart, ExportOptions } from \"./types\";\nimport { exportToCSV, exportToJSON, exportToImage } from \"./ChartExporter\";\nimport { applyZoom, applyPan, type NavigationContext } from \"./ChartNavigation\";\nimport { autoScaleAll, autoScaleYOnly, handleBoxZoom } from \"./ChartScaling\";\nimport {\n AnimationEngine,\n mergeAnimationConfig,\n DEFAULT_ANIMATION_CONFIG,\n type ChartAnimationConfig,\n} from \"../animation\";\nimport {\n applyAnimatedZoom,\n applyAnimatedAutoScale,\n animateToBounds,\n type AnimatedNavigationContext,\n} from \"./ChartAnimatedNavigation\";\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} from \"./ChartSeries\";\nimport {\n initializeChart as setupChart,\n getPlotArea as calculatePlotArea,\n getAxesLayout,\n resizeCanvases,\n pixelToDataX as pxToDataX,\n} from \"./ChartSetup\";\nimport { PluginManagerImpl } from \"../../plugins\";\nimport {\n initControls as createControls,\n initLegend as createLegend,\n} from \"./ChartUI\";\nimport {\n markInitComplete,\n} from \"../ChartInitQueue\";\nimport { PluginLoading } from \"../../plugins/loading\";\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 plotAreaBackground: [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 public theme: ChartTheme;\n public baseTheme: 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 originalSeriesStyles = new Map<string, any>();\n private showControls: boolean;\n private toolbarOptions?: import(\"../../types\").ToolbarOptions;\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 initQueueId: string | null = null;\n private initStarted = false;\n private frameCount = 0;\n private lastRenderTime = performance.now();\n private commandQueue: Array<{ fn: () => void; name: string }> = [];\n private annotationQueue: any[] = [];\n private annotationIdCounter = 0;\n private tooltipConfigQueue: any[] = [];\n private fitLineQueue: any[] = [];\n\n /** Whether the chart has been destroyed */\n get isDestroyed(): boolean {\n return this._isDestroyed;\n }\n\n private selectionRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null = null;\n private pluginManager: PluginManagerImpl;\n private initialOptions: ChartOptions;\n\n get analysis(): any {\n const api = this.getPluginAPI<any>(\"scichart-analysis\");\n if (api) return api;\n \n // Fallback object to prevent crashes while plugin is loading\n return {\n integrate: () => 0,\n detectPeaks: () => [],\n detectCycles: () => [],\n movingAverage: (data: any) => data,\n sma: () => [],\n ema: () => [],\n };\n }\n\n private animationEngine: AnimationEngine;\n private animationConfig: ChartAnimationConfig;\n get animations(): ChartAnimationConfig {\n return this.animationConfig;\n }\n private selectionManager: SelectionManager;\n private responsiveManager: ResponsiveManager;\n\n get tooltip(): any {\n const manager = this.getPluginAPI<any>(\"scichart-tools\")?.getTooltipManager();\n if (manager) return manager;\n \n return {\n configure: (config: any) => {\n this.tooltipConfigQueue.push(config);\n },\n handleCursorMove: () => {},\n handleCursorLeave: () => {},\n setSuspended: () => {},\n updateChartTheme: () => {},\n };\n }\n\n get loading(): any {\n const api = this.getPluginAPI<any>(\"scichart-loading\");\n if (api) return api;\n \n return {\n show: () => {},\n hide: () => {},\n setProgress: () => {},\n setMessage: () => {}\n };\n }\n\n get deltaTool(): any {\n return this.getPluginAPI<any>(\"scichart-tools\")?.getDeltaTool() ?? null;\n }\n\n get peakTool(): any {\n return this.getPluginAPI<any>(\"scichart-tools\")?.getPeakTool() ?? null;\n }\n\n constructor(options: ChartOptions) {\n this.initialOptions = options;\n this.container = options.container;\n\n // 1. Initialize DOM and Theme so we can show UI (like loading) immediately\n const setup = setupChart(this.container, options);\n\n this.baseTheme = setup.theme;\n this.theme = setup.theme;\n this.backgroundColor = setup.backgroundColor;\n this.plotAreaBackground = setup.plotAreaColor;\n this.showLegend = setup.showLegend;\n this.showControls = setup.showControls;\n this.toolbarOptions = options.toolbar;\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 // 2. Initialize Plugin Manager with full bridge (getters handle uninit state)\n this.pluginManager = new PluginManagerImpl({\n chart: this,\n container: this.container,\n theme: this.theme,\n getGL: () => this.renderer?.getGL(),\n get2DContext: () => this.overlayCtx,\n getPixelRatio: () => this.dpr,\n getCanvasSize: () => ({ \n width: this.webglCanvas?.width || 0, \n height: this.webglCanvas?.height || 0 \n }),\n getPlotArea: () => this.getPlotArea(),\n getViewBounds: () => this.viewBounds,\n getYAxisBounds: (yAxisId) => {\n const s = this.yScales?.get(yAxisId || this.primaryYAxisId);\n return { yMin: s?.domain[0] ?? 0, yMax: s?.domain[1] ?? 1 };\n },\n dataToPixelX: (x) => this.xScale?.transform(x) ?? 0,\n dataToPixelY: (y, yAxisId) => (this.yScales?.get(yAxisId || this.primaryYAxisId) || this.yScale)?.transform(y) ?? 0,\n pixelToDataX: (px) => this.pixelToDataX(px),\n pixelToDataY: (py, yAxisId) => this.pixelToDataY(py, yAxisId),\n findNearestPoint: (px, py, radius) => this.selectionManager?.hitTest(px, py, radius) ?? null,\n getPlugin: (name) => this.pluginManager?.get(name) as any\n });\n \n // 3. Show loading indicator INSTANTLY if enabled\n if (options.loading !== false) {\n const loadingConfig = typeof options.loading === 'object' ? options.loading : {\n message: 'Loading SciChart...',\n overlayOpacity: 0.1,\n };\n this.use(PluginLoading({\n ...loadingConfig,\n autoShow: true // Ensure it shows immediately\n }));\n }\n\n // 4. Load initial plugins\n if (options.plugins) {\n options.plugins.forEach(p => this.use(p));\n }\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 `[SciChartEngine] '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.renderer = new NativeWebGLRenderer(this.webglCanvas);\n this.renderer.setDPR(this.dpr);\n this.overlay = new OverlayRenderer(this.overlayCtx, this.theme);\n\n // Initialize selection manager EARLY so plugins can use it for hit-testing\n this.selectionManager = new SelectionManager({\n getSeries: () => this.series,\n getPlotArea: () => this.getPlotArea(),\n getXScale: () => this.xScale,\n getYScales: () => this.yScales,\n getPrimaryYAxisId: () => this.primaryYAxisId,\n events: this.events as any, // SelectionEventMap is a subset of ChartEventMap\n requestRender: () => this.requestRender(),\n });\n\n // Initialize animation system\n this.animationEngine = new AnimationEngine();\n this.animationConfig =\n typeof options.animations === \"boolean\"\n ? { ...DEFAULT_ANIMATION_CONFIG, enabled: options.animations }\n : mergeAnimationConfig(options.animations);\n\n // Initialize responsive manager\n const responsiveConfig =\n typeof options.responsive === \"boolean\"\n ? { enabled: options.responsive }\n : options.responsive;\n this.responsiveManager = new ResponsiveManager(\n {\n container: this.container,\n onStateChange: (state: ResponsiveState) =>\n this.handleResponsiveChange(state),\n },\n responsiveConfig\n );\n\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 // Refresh tool overlays so points follow the zoom\n if (this.deltaTool) this.deltaTool.renderOverlay();\n if (this.peakTool) this.peakTool.renderOverlay();\n },\n onPan: (dx, dy, axisId) => {\n this.pan(dx, dy, axisId);\n // Refresh tool overlays so points follow the pan\n if (this.deltaTool) this.deltaTool.renderOverlay();\n if (this.peakTool) this.peakTool.renderOverlay();\n },\n onBoxZoom: (rect) => this.handleBoxZoom(rect),\n onCursorMove: (x, y) => {\n this.cursorPosition = { x, y };\n if (this.tooltip) {\n this.tooltip.handleCursorMove(x, y);\n }\n this.requestOverlayRender();\n },\n onCursorLeave: () => {\n this.cursorPosition = null;\n if (this.tooltip) {\n this.tooltip.handleCursorLeave();\n }\n this.requestOverlayRender();\n },\n onBoxSelect: (rect, additive) => {\n if (rect) {\n const xScale = this.xScale;\n const yScales = this.yScales;\n const primaryYScale = yScales.get(this.primaryYAxisId);\n\n if (primaryYScale) {\n const dataBounds: Bounds = {\n xMin: xScale.invert(rect.x),\n xMax: xScale.invert(rect.x + rect.width),\n yMin: primaryYScale.invert(rect.y + rect.height),\n yMax: primaryYScale.invert(rect.y),\n };\n\n const hits = this.selectionManager.hitTestRegion(dataBounds);\n if (hits.length > 0) {\n const bySeriesMap = new Map<string, number[]>();\n hits.forEach((hit) => {\n let arr = bySeriesMap.get(hit.seriesId);\n if (!arr) {\n arr = [];\n bySeriesMap.set(hit.seriesId, arr);\n }\n arr.push(hit.index);\n });\n\n const pointsToSelect = Array.from(bySeriesMap.entries()).map(\n ([seriesId, indices]) => ({\n seriesId,\n indices,\n })\n );\n\n this.selectionManager.selectPoints(\n pointsToSelect,\n additive ? \"add\" : \"single\"\n );\n } else if (!additive) {\n this.selectionManager.clearSelection();\n }\n }\n }\n // Complete the box selection\n this.selectionManager.completeBoxSelection(additive);\n },\n onBoxSelectUpdate: (pixelX, pixelY) => {\n this.selectionManager.updateBoxSelection(pixelX, pixelY);\n },\n onBoxSelectStart: (pixelX, pixelY) => {\n this.selectionManager.startBoxSelection(pixelX, pixelY);\n },\n onDragStart: () => {\n // Suspend tooltip during any drag operation\n if (this.tooltip) {\n this.tooltip.setSuspended(true);\n }\n },\n onDragEnd: () => {\n // Resume tooltip after drag operation ends\n if (this.tooltip) {\n this.tooltip.setSuspended(false);\n }\n },\n onInteraction: (event) => {\n this.pluginManager.notify(\"onInteraction\", event);\n },\n },\n () => this.getPlotArea(),\n (axisId) => this.getInteractedBounds(axisId),\n () => getAxesLayout(this.yAxisOptionsMap as any)\n );\n\n new ResizeObserver(() => !this.isDestroyed && this.resize()).observe(\n this.container\n );\n this.initControls();\n this.initLegend(options);\n\n // Plugins are now manual - user must call chart.use() or specify them in options\n // This allows for smaller bundles and more explicit control in each example.\n\n\n // NOTE: resize() and startRenderLoop() are now called by startInit()\n // This allows the queue system to control when rendering actually begins\n }\n\n /**\n * Start the chart initialization (called by queue system)\n * This performs the actual render startup that was deferred from constructor\n */\n startInit(): void {\n if (this.initStarted || this._isDestroyed) return;\n this.initStarted = true;\n\n this.resize();\n this.startRenderLoop();\n\n // Process any commands that were queued before initialization\n if (this.commandQueue.length > 0) {\n this.commandQueue.forEach((cmd) => {\n try {\n cmd.fn();\n } catch (err) {\n console.error(\n `[SciChartEngine] Error executing queued command '${cmd.name}':`,\n err\n );\n }\n });\n this.commandQueue = [];\n }\n\n setTimeout(() => !this.isDestroyed && this.resize(), 100);\n }\n\n /**\n * Mark this chart's initialization as complete in the queue\n */\n async completeInit(): Promise<void> {\n if (!this.initQueueId) return;\n\n // Wait for all startup animations (like autoScale) to finish\n // before allowing the next chart to start its heavy initialization.\n await this.animationEngine.waitForIdle();\n\n // Extra safety wait to allow browser to breathe\n await new Promise((r) => setTimeout(r, 60));\n\n if (this.initQueueId) {\n markInitComplete(this.initQueueId);\n this.initQueueId = null;\n }\n }\n\n private executeOrQueue(name: string, fn: () => void): void {\n if (this.initStarted) {\n fn();\n } else {\n this.commandQueue.push({ fn, name });\n }\n }\n\n /**\n * Set the initialization queue ID (internal use)\n */\n setInitQueueId(id: string): void {\n this.initQueueId = id;\n }\n\n private initControls(): void {\n this.controls = createControls({\n container: this.container,\n theme: this.theme,\n showControls: this.showControls,\n toolbar: this.toolbarOptions,\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: boolean) => this.interaction.setPanMode(active),\n setMode: (mode: 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak') => this.setMode(mode),\n onLegendMove: (x: number, y: number) =>\n this.events.emit(\"legendMove\", { x, y }),\n onToggleSmoothing: () => this.toggleSmoothing(),\n toggleLegend: () => this.toggleLegend(),\n onInteractionStart: () => {\n if (this.tooltip) this.tooltip.setSuspended(true);\n },\n onInteractionEnd: () => {\n if (this.tooltip) this.tooltip.setSuspended(false);\n },\n onHoverStart: () => {\n if (this.tooltip) this.tooltip.setSuspended(true);\n },\n onHoverEnd: () => {\n if (this.tooltip) this.tooltip.setSuspended(false);\n },\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 {\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 setMode: (mode) => this.setMode(mode),\n onLegendMove: (x: number, y: number) =>\n this.events.emit(\"legendMove\", { x, y }),\n onToggleSmoothing: () => this.toggleSmoothing(),\n toggleLegend: () => this.toggleLegend(),\n onInteractionStart: () => {\n if (this.tooltip) this.tooltip.setSuspended(true);\n },\n onInteractionEnd: () => {\n if (this.tooltip) this.tooltip.setSuspended(false);\n },\n onHoverStart: () => {\n if (this.tooltip) this.tooltip.setSuspended(true);\n },\n onHoverEnd: () => {\n if (this.tooltip) this.tooltip.setSuspended(false);\n },\n onSeriesHoverStart: (s) => {\n const original = s.getStyle();\n this.originalSeriesStyles.set(s.getId(), { ...original });\n \n const newColor = brightenColor(original.color || \"#ff0055\", this.theme.isDark);\n s.setStyle({ \n color: newColor \n });\n this.legend?.updateSeriesStyle(s);\n this.requestRender();\n },\n onSeriesHoverEnd: (s) => {\n const original = this.originalSeriesStyles.get(s.getId());\n if (original) {\n s.setStyle(original);\n this.originalSeriesStyles.delete(s.getId());\n this.legend?.updateSeriesStyle(s);\n this.requestRender();\n }\n },\n onToggleVisibility: (s) => {\n s.setVisible(!s.isVisible());\n this.legend?.updateSeriesStyle(s);\n this.requestRender();\n },\n },\n options\n );\n }\n\n setTheme(theme: string | ChartTheme): void {\n this.baseTheme = typeof theme === \"string\" ? getThemeByName(theme) : theme;\n this.theme = this.responsiveManager.scaleTheme(this.baseTheme);\n \n const bgColor = parseColor(this.theme.backgroundColor);\n this.backgroundColor = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n \n const paColor = parseColor(this.theme.plotAreaBackground);\n this.plotAreaBackground = [paColor[0], paColor[1], paColor[2], paColor[3]];\n\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\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 autoScaleYOnly: () => this.autoScaleYOnly(),\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(\"onSeriesAdd\", 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 this.recalculateTools();\n }\n appendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void {\n appendDataImpl(this.getSeriesContext(), id, x, y);\n this.recalculateTools();\n const series = this.series.get(id);\n if (series) {\n this.pluginManager.notify(\"onDataUpdate\", {\n seriesId: id,\n data: series.getData(),\n });\n }\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 /**\n * Add a line of best fit to a series\n */\n addFitLine(seriesId: string, type: any, options?: any): string {\n const api = this.getPluginAPI<any>(\"scichart-analysis\");\n if (api && api.addFitLine) {\n return api.addFitLine(seriesId, type, options);\n }\n \n // Queue the fit line request if plugin not yet loaded\n const id = `fit-${Math.random().toString(36).substr(2, 9)}`;\n this.fitLineQueue.push({ id, seriesId, type, options });\n return id;\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 private getAnimatedNavContext(): AnimatedNavigationContext {\n return {\n ...this.getNavContext(),\n animationEngine: this.animationEngine,\n animationConfig: this.animationConfig,\n };\n }\n\n zoom(options: ZoomOptions & { animate?: boolean }): void {\n if (this.animationConfig.enabled && options.animate !== false) {\n const animation = applyAnimatedZoom(\n this.getAnimatedNavContext(),\n options\n );\n // Catch animation cancellation errors silently\n if (animation) {\n animation.promise.catch((err) => {\n // Ignore cancellation errors\n if (err.message !== \"Animation cancelled\") {\n console.error(\"[SciChartEngine] Animation error:\", err);\n }\n });\n }\n } else {\n applyZoom(this.getNavContext(), options);\n }\n this.requestRender();\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 }\n getViewBounds(): Bounds {\n return { ...this.viewBounds };\n }\n autoScale(animate: boolean = true): void {\n this.executeOrQueue(\"autoScale\", () => {\n if (this.animationConfig.enabled && animate) {\n const animation = applyAnimatedAutoScale(\n this.getAnimatedNavContext(),\n true\n );\n // Catch animation cancellation errors silently\n if (animation) {\n animation.promise.catch((err) => {\n // Ignore cancellation errors\n if (err.message !== \"Animation cancelled\") {\n console.error(\"[SciChartEngine] Animation error:\", err);\n }\n });\n }\n } else {\n autoScaleAll(this.getNavContext());\n }\n this.requestRender();\n });\n }\n\n /**\n * Auto-scale only Y-axes (keeps X-axis stable)\n * Used during streaming to prevent X-axis shifting\n */\n autoScaleYOnly(): void {\n autoScaleYOnly(this.getNavContext());\n this.requestRender();\n }\n\n /**\n * Animate view bounds to specific target\n */\n animateTo(options: {\n xRange?: [number, number];\n yRange?: [number, number];\n duration?: number;\n easing?: string;\n }): void {\n const animation = animateToBounds(\n this.getAnimatedNavContext(),\n {\n xMin: options.xRange?.[0],\n xMax: options.xRange?.[1],\n yMin: options.yRange?.[0],\n yMax: options.yRange?.[1],\n },\n {\n duration: options.duration,\n easing: options.easing,\n }\n );\n // Catch animation cancellation errors silently\n if (animation) {\n animation.promise.catch((err) => {\n // Ignore cancellation errors\n if (err.message !== \"Animation cancelled\") {\n console.error(\"[SciChartEngine] Animation error:\", err);\n }\n });\n }\n }\n\n /**\n * Get animation configuration\n */\n getAnimationConfig(): ChartAnimationConfig {\n return { ...this.animationConfig };\n }\n\n /**\n * Set animation configuration\n */\n setAnimationConfig(config: Partial<ChartAnimationConfig>): void {\n this.animationConfig = mergeAnimationConfig({\n ...this.animationConfig,\n ...config,\n });\n }\n\n /**\n * Check if animations are currently running\n */\n isAnimating(): boolean {\n return this.animationEngine.isAnimating();\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: any): string {\n const id = annotation.id || `annotation-${++this.annotationIdCounter}`;\n const annWithId = { ...annotation, id };\n\n const api = this.getPluginAPI<any>(\"scichart-annotations\");\n if (api) {\n api.add(annWithId);\n this.requestOverlayRender();\n } else {\n this.annotationQueue.push(annWithId);\n }\n return id;\n }\n\n removeAnnotation(id: string): boolean {\n const api = this.getPluginAPI<any>(\"scichart-annotations\");\n if (api) {\n const result = api.remove(id);\n this.requestOverlayRender();\n return result;\n }\n return false;\n }\n\n updateAnnotation(id: string, updates: Partial<Annotation>): void {\n const api = this.getPluginAPI<any>(\"scichart-annotations\");\n api?.update?.(id, updates);\n this.requestOverlayRender();\n }\n\n getAnnotation(id: string): Annotation | undefined {\n return this.getPluginAPI<any>(\"scichart-annotations\")?.get(id);\n }\n\n getAnnotations(): Annotation[] {\n return this.getPluginAPI<any>(\"scichart-annotations\")?.getAll() ?? [];\n }\n\n clearAnnotations(): void {\n this.getPluginAPI<any>(\"scichart-annotations\")?.clear();\n this.requestOverlayRender();\n }\n\n private getPluginAPI<T>(name: string): T | null {\n const plugin = this.pluginManager.get(name) as any;\n return plugin ? plugin.api : null;\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 // ============================================\n // Axis Management\n // ============================================\n\n /**\n * Add a new Y axis dynamically\n */\n addYAxis(options: AxisOptions): string {\n const existingIds = Array.from(this.yAxisOptionsMap.keys());\n const id = options.id || `y${existingIds.length}`;\n\n if (this.yAxisOptionsMap.has(id)) {\n console.warn(`[SciChartEngine] Y axis with id '${id}' already exists`);\n return id;\n }\n\n const position = options.position || \"right\";\n const fullOptions: AxisOptions = {\n scale: \"linear\",\n auto: true,\n position,\n ...options,\n id,\n };\n\n this.yAxisOptionsMap.set(id, fullOptions);\n\n // Create scale for this axis\n const scale =\n fullOptions.scale === \"log\" ? new LogScale() : new LinearScale();\n this.yScales.set(id, scale);\n\n this.requestRender();\n return id;\n }\n\n /**\n * Remove a Y axis by ID\n */\n removeYAxis(id: string): boolean {\n if (id === this.primaryYAxisId) {\n console.warn(`[SciChartEngine] Cannot remove primary Y axis '${id}'`);\n return false;\n }\n\n if (!this.yAxisOptionsMap.has(id)) {\n return false;\n }\n\n this.yAxisOptionsMap.delete(id);\n this.yScales.delete(id);\n\n // Update any series using this axis\n this.series.forEach((s) => {\n if (s.getYAxisId() === id) {\n // Move to primary axis\n s.setYAxisId(this.primaryYAxisId);\n }\n });\n\n this.requestRender();\n return true;\n }\n\n /**\n * Update Y axis configuration\n */\n updateYAxis(id: string, options: Partial<AxisOptions>): void {\n const existing = this.yAxisOptionsMap.get(id);\n if (!existing) {\n console.warn(`[SciChartEngine] Y axis '${id}' not found`);\n return;\n }\n\n const updated: AxisOptions = { ...existing, ...options, id };\n this.yAxisOptionsMap.set(id, updated);\n\n // Update scale if scale type changed\n if (options.scale && options.scale !== existing.scale) {\n const newScale =\n options.scale === \"log\" ? new LogScale() : new LinearScale();\n const oldScale = this.yScales.get(id);\n if (oldScale) {\n newScale.setDomain(oldScale.domain[0], oldScale.domain[1]);\n }\n this.yScales.set(id, newScale);\n }\n\n this.requestRender();\n }\n\n /**\n * Get Y axis configuration by ID\n */\n getYAxis(id: string): AxisOptions | undefined {\n return this.yAxisOptionsMap.get(id);\n }\n\n /**\n * Get all Y axes configurations\n */\n getAllYAxes(): AxisOptions[] {\n return Array.from(this.yAxisOptionsMap.values());\n }\n\n /**\n * Get the primary Y axis ID\n */\n getPrimaryYAxisId(): string {\n return this.primaryYAxisId;\n }\n\n // ============================================\n // Selection API\n // ============================================\n\n /**\n * Select data points programmatically\n */\n selectPoints(\n points: Array<{ seriesId: string; indices: number[] }>,\n mode?: SelectionMode\n ): void {\n this.selectionManager.selectPoints(points, mode);\n }\n\n /**\n * Get all currently selected points\n */\n getSelectedPoints(): SelectedPoint[] {\n return this.selectionManager.getSelectedPoints();\n }\n\n /**\n * Clear all selections\n */\n clearSelection(): void {\n this.selectionManager.clearSelection();\n }\n\n /**\n * Hit-test at a pixel coordinate\n */\n hitTest(pixelX: number, pixelY: number): HitTestResult | null {\n return this.selectionManager.hitTest(pixelX, pixelY);\n }\n\n /**\n * Check if a specific point is selected\n */\n isPointSelected(seriesId: string, index: number): boolean {\n return this.selectionManager.isPointSelected(seriesId, index);\n }\n\n /**\n * Get selection count\n */\n getSelectionCount(): number {\n return this.selectionManager.getSelectionCount();\n }\n\n /**\n * Configure selection behavior\n */\n configureSelection(config: Partial<SelectionConfig>): void {\n this.selectionManager.configure(config);\n }\n\n /**\n * Set pan mode (true = pan, false = selection)\n * @deprecated Use setMode('pan') or setMode('select') instead\n */\n setPanMode(enabled: boolean): void {\n this.interaction.setPanMode(enabled);\n }\n\n /**\n * Set the interaction mode\n * @param mode - 'pan' for pan/drag, 'boxZoom' for rectangle zoom, 'select' for point selection, 'delta' for measurements\n */\n setMode(mode: 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak'): void {\n const currentMode = this.getMode();\n if (currentMode === mode) return;\n\n // Always clear point selection when changing tool\n this.selectionManager.clearSelection();\n\n // Delegate to tools plugin if available\n const toolsApi = this.getPluginAPI<any>(\"scichart-tools\");\n if (mode === 'delta' || mode === 'peak') {\n if (toolsApi) {\n toolsApi.setMode(mode);\n } else {\n // Plugin not yet loaded - retry after a short delay\n console.info(`[SciChartEngine] Tools plugin not ready, retrying setMode('${mode}')...`);\n setTimeout(() => {\n const api = this.getPluginAPI<any>(\"scichart-tools\");\n if (api) {\n api.setMode(mode);\n } else {\n console.warn(`[SciChartEngine] Tools plugin still not available for mode '${mode}'`);\n }\n }, 100);\n }\n } else if (toolsApi) {\n // Disable tools when switching to non-tool modes\n toolsApi.setMode('none');\n }\n\n this.interaction.setMode(mode);\n }\n\n /**\n * Get the current interaction mode\n */\n getMode(): 'pan' | 'boxZoom' | 'select' | 'delta' | 'peak' {\n return this.interaction.getMode();\n }\n\n /**\n * Get the Delta Tool instance for advanced measurements\n */\n getDeltaTool(): any | null {\n return this.getPluginAPI<any>(\"scichart-tools\")?.getDeltaTool() ?? null;\n }\n\n /**\n * Get the Peak Tool instance for peak integration\n */\n getPeakTool(): any | null {\n return this.getPluginAPI<any>(\"scichart-tools\")?.getPeakTool() ?? null;\n }\n\n // ============================================\n // Responsive Design\n // ============================================\n\n /**\n * Handle responsive state changes\n */\n private handleResponsiveChange(state: ResponsiveState): void {\n // Update theme with scaled values from base theme to avoid cumulative scaling\n this.theme = this.responsiveManager.scaleTheme(this.baseTheme);\n this.overlay.setTheme(this.theme);\n\n // Update selection hit radius\n this.selectionManager.configure({\n hitRadius: this.responsiveManager.getScaledHitRadius(20),\n });\n\n // Update legend visibility based on breakpoint\n if (this.legend) {\n const shouldShow = this.responsiveManager.shouldShowLegend();\n // Legend visibility is handled internally by checking showLegend\n this.showLegend = shouldShow;\n }\n\n // Request render with new responsive settings\n this.requestRender();\n\n // Emit resize event\n this.events.emit(\"resize\", {\n width: state.width,\n height: state.height,\n });\n }\n\n /**\n * Get current responsive state\n */\n getResponsiveState(): ResponsiveState {\n return this.responsiveManager.getState();\n }\n\n /**\n * Configure responsive behavior\n */\n configureResponsive(config: Partial<ResponsiveConfig>): void {\n this.responsiveManager.configure(config);\n }\n\n /**\n * Check if responsive mode is enabled\n */\n isResponsiveEnabled(): boolean {\n return this.responsiveManager.isEnabled();\n }\n\n // ============================================\n // Serialization & Persistence\n // ============================================\n\n /**\n * Export complete chart state\n */\n serialize(options: SerializeOptions = {}): ChartState {\n const { includeData = true, includeAnnotations = true } = options;\n\n const state: ChartState = {\n version: SERIALIZATION_VERSION,\n timestamp: Date.now(),\n viewBounds: { ...this.viewBounds },\n xAxis: {\n id: \"primary-x\",\n position: this.xAxisOptions.position,\n label: this.xAxisOptions.label,\n scale: this.xScale.type,\n min: this.xScale.domain[0],\n max: this.xScale.domain[1],\n auto:\n (this.xScale as any).auto !== undefined\n ? (this.xScale as any).auto\n : true,\n },\n yAxes: Array.from(this.yScales.values()).map((s: any) => ({\n id: s.id || \"y\",\n position: s.position || \"left\",\n label: s.label || \"\",\n scale: s.type,\n min: s.domain[0],\n max: s.domain[1],\n auto: s.auto !== undefined ? s.auto : true,\n })),\n primaryYAxisId: this.primaryYAxisId,\n series: Array.from(this.series.values()).map((s) => ({\n id: s.getId(),\n name: s.getName(),\n type: s.getType(),\n yAxisId: s.getYAxisId(),\n style: s.getStyle(),\n visible: s.isVisible(),\n data: includeData\n ? {\n x: encodeFloat32Array(s.getData().x),\n y: encodeFloat32Array(s.getData().y),\n }\n : { x: \"\", y: \"\" },\n })),\n annotations: includeAnnotations ? this.getAnnotations() : [],\n options: {\n showLegend: this.showLegend,\n showControls: this.showControls,\n showStatistics: this.showStatistics,\n autoScroll: this.autoScroll,\n },\n plugins: this.pluginManager.collectSerializationData(),\n };\n\n return state;\n }\n\n /**\n * Restore chart from saved state\n */\n deserialize(state: ChartState, options: DeserializeOptions = {}): void {\n const { skipData = false, skipAnnotations = false } = options;\n\n // Restore view/axis settings\n this.viewBounds = { ...state.viewBounds };\n this.primaryYAxisId = state.primaryYAxisId;\n\n // Restore Y axes\n state.yAxes.forEach((ax) => {\n this.updateYAxis(ax.id, {\n label: ax.label,\n scale: ax.scale,\n min: ax.min,\n max: ax.max,\n auto: ax.auto,\n });\n });\n\n // Restore series\n if (!skipData) {\n // Clear existing first\n const seriesIds = Array.from(this.series.keys());\n seriesIds.forEach((id) => this.removeSeries(id));\n\n state.series.forEach((s) => {\n this.addSeries({\n id: s.id,\n name: s.name,\n type: s.type,\n yAxisId: s.yAxisId,\n data: {\n x: decodeFloat32Array(s.data.x),\n y: decodeFloat32Array(s.data.y),\n },\n style: s.style as any,\n });\n });\n }\n\n // Restore annotations\n if (!skipAnnotations && state.annotations) {\n this.clearAnnotations();\n state.annotations.forEach((a) => this.addAnnotation(a));\n }\n\n // Restore UI options\n if (state.options) {\n this.showLegend = state.options.showLegend ?? this.showLegend;\n this.showControls = state.options.showControls ?? this.showControls;\n this.showStatistics = state.options.showStatistics ?? this.showStatistics;\n this.autoScroll = state.options.autoScroll ?? this.autoScroll;\n }\n\n // Restore plugin data\n if (state.plugins) {\n this.pluginManager.restoreSerializationData(state.plugins);\n }\n\n this.requestRender();\n }\n\n /**\n * Convert current state to URL-safe hash\n */\n toUrlHash(compress: boolean = true): string {\n return stateToUrlHash(this.serialize({ includeData: true }), compress);\n }\n\n /**\n * Load state from URL hash\n */\n fromUrlHash(hash: string, compressed: boolean = true): void {\n const state = urlHashToState(hash, compressed);\n if (state) {\n this.deserialize(state);\n }\n }\n\n use(plugin: import(\"../../plugins\").ChartPlugin): void {\n this.pluginManager.use(plugin);\n\n // If annotations plugin was just added, process queued annotations\n const annotationsApi = this.getPluginAPI<any>(\"scichart-annotations\");\n if (annotationsApi && this.annotationQueue.length > 0) {\n this.annotationQueue.forEach((a) => annotationsApi.add(a));\n this.annotationQueue = [];\n this.requestOverlayRender();\n }\n\n // Process queued tooltip configurations\n const toolsApi = this.getPluginAPI<any>(\"scichart-tools\");\n if (toolsApi && this.tooltipConfigQueue.length > 0) {\n const manager = toolsApi.getTooltipManager();\n if (manager) {\n this.tooltipConfigQueue.forEach((cfg) => manager.configure(cfg));\n this.tooltipConfigQueue = [];\n }\n }\n\n // Process queued fit lines\n const analysisApi = this.getPluginAPI<any>(\"scichart-analysis\");\n if (analysisApi && this.fitLineQueue.length > 0) {\n this.fitLineQueue.forEach((q) => {\n analysisApi.addFitLine(q.seriesId, q.type, { ...q.options, id: q.id });\n });\n this.fitLineQueue = [];\n }\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.executeOrQueue(\"requestRender\", () => {\n this.needsFullRender = true;\n this.scheduleRenderFrame();\n });\n }\n\n requestOverlayRender(): void {\n this.executeOrQueue(\"requestOverlayRender\", () => {\n this.needsOverlayRender = true;\n this.scheduleRenderFrame();\n });\n }\n\n render(full: boolean = true): void {\n if (!this.initStarted) {\n this.commandQueue.push({ fn: () => this.render(full), name: \"render\" });\n return;\n }\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 renderCtx = {\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 backgroundColor: this.backgroundColor,\n cursorOptions: this.cursorOptions,\n cursorPosition: this.cursorPosition,\n selectionRect: this.selectionRect,\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 selectionManager: this.selectionManager,\n };\n\n const now = performance.now();\n const beforeEvent = {\n timestamp: now,\n deltaTime: now - this.lastRenderTime,\n frameNumber: ++this.frameCount,\n first: !this.initStarted,\n forced: full\n };\n this.lastRenderTime = now;\n\n if (!this.pluginManager.notifyBeforeRender(beforeEvent)) {\n return; // Plugin requested to skip render\n }\n\n if (full) {\n const seriesData = prepareSeriesData(renderCtx, plotArea);\n this.renderer.render(seriesData, {\n bounds: this.viewBounds,\n backgroundColor: this.backgroundColor,\n plotAreaBackground: this.plotAreaBackground,\n plotArea,\n });\n renderOverlay(renderCtx, plotArea, this.yScale);\n } else {\n // Overlay only render\n renderOverlay(renderCtx, plotArea, this.yScale);\n }\n\n const renderTime = performance.now() - start;\n const afterEvent = { ...beforeEvent, renderTime };\n\n this.pluginManager.notifyAfterRender(afterEvent);\n this.pluginManager.notifyRenderOverlay(afterEvent);\n\n this.events.emit(\"render\", {\n fps: 1000 / renderTime,\n frameTime: renderTime,\n });\n }\n\n private pixelToDataX(px: number): number {\n return pxToDataX(px, this.getPlotArea(), this.viewBounds);\n }\n\n private pixelToDataY(py: number, yAxisId?: string): number {\n const scale = this.yScales.get(yAxisId || this.primaryYAxisId) || this.yScale;\n return scale.invert(py);\n }\n\n private startRenderLoop(): void {\n // On-demand render loop - only runs when there's work to do\n // This dramatically improves performance with multiple charts\n this.scheduleRenderFrame();\n }\n\n private scheduleRenderFrame(): void {\n if (this.animationFrameId !== null || this.isDestroyed) return;\n\n this.animationFrameId = requestAnimationFrame(() => {\n this.animationFrameId = null;\n if (this.isDestroyed) return;\n\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\n // If there are animations running, keep the loop going\n if (this.animationEngine.isAnimating()) {\n this.scheduleRenderFrame();\n }\n });\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.animationEngine.destroy();\n this.selectionManager.destroy();\n this.responsiveManager.destroy();\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 this.pluginManager.destroy(); // Destroy all plugins!\n while (this.container.firstChild)\n this.container.removeChild(this.container.firstChild);\n }\n\n private toggleSmoothing(): void {\n this.series.forEach((s) => {\n const style = s.getStyle();\n s.setStyle({ smoothing: (style.smoothing || 0) === 0 ? 0.5 : 0 });\n });\n this.recalculateTools();\n this.requestRender();\n }\n\n private async recalculateTools(): Promise<void> {\n // Clear point selection as indices might be desynced or invalid after data change\n this.selectionManager.clearSelection();\n\n // Wait for ongoing animations (like auto-scale) to finish \n // We wait two frames to give triggered animations a chance to start and register in the engine.\n await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));\n\n if (this.animationEngine.isAnimating()) {\n await this.animationEngine.waitForIdle();\n }\n\n // Refresh measurement tools (Delta and Peak Integration)\n if (this.deltaTool) {\n this.deltaTool.recalculate();\n }\n if (this.peakTool) {\n this.peakTool.recalculate();\n }\n\n this.requestOverlayRender();\n }\n}\n\nimport { waitForInitTurn } from \"../ChartInitQueue\";\n\n/**\n * Create a new chart. Charts are automatically queued for sequential\n * initialization when multiple charts are created on the same page.\n */\nexport function createChart(options: ChartOptions): Chart {\n const chart = new ChartImpl(options);\n\n // Queue for sequential initialization\n waitForInitTurn().then((queueId) => {\n chart.setInitQueueId(queueId);\n\n // If chart was destroyed before queue turn, mark complete immediately\n if (chart.isDestroyed) {\n markInitComplete(queueId);\n return;\n }\n\n // Start the actual rendering\n chart.startInit();\n\n // Wait for initial render and autoScale to complete before allowing next chart\n // completeInit() is async and waits for animationEngine to be idle.\n chart.completeInit();\n });\n\n return chart;\n}\n\n\n\n"],"names":["MARGINS","BufferStore","gl","__publicField","id","data","buffer","currentSize","offsetInBytes","LINE_VERT","LINE_FRAG","POINT_VERT","POINT_FRAG","HEATMAP_VERT","HEATMAP_FRAG","createShader","source","type","shader","error","createProgram","vertSource","fragSource","mode","vertShader","fragShader","program","createProgramBundle","parseColor","color","hex","r","g","b","a","matches","brightenColor","isDarkTheme","h","s","rgbToHsl","newH","newS","newL","nr","ng","nb","hslToRgb","ri","gi","bi","max","min","l","d","hue2rgb","p","q","t","interleaveData","x","y","length","result","i","interleaveStepData","stepCount","resultIdx","prevX","prevY","currX","currY","midX","interleaveBandData","y1","y2","n","idx","xi","calculateUniforms","bounds","dataWidth","dataHeight","scaleX","scaleY","translateX","translateY","renderLine","prog","count","uniforms","width","renderBand","alpha","renderPoints","pointSize","symbol","symbolMap","renderHeatmap","zBounds","texture","renderBar","computeSeriesColor","style","renderFrame","canvas","dpr","programs","series","options","backgroundColor","plotArea","canvasHeight","canvasWidth","pa","yMin","yRange","yScale","yTrans","seriesUniforms","TextureStore","NativeWebGLRenderer","rect","height","LinearScale","value","d0","d1","r0","r1","normalized","pixel","step","niceStep","start","ticks","maxTicks","LogScale","safeMin","safeMax","logMin","logMax","logVal","range","rawStep","magnitude","niceNormalized","createScale","DEFAULT_AXIS_THEME","DEFAULT_GRID_THEME","DEFAULT_LEGEND_THEME","DEFAULT_TOOLBAR_THEME","DEFAULT_CURSOR_THEME","DARK_THEME","MIDNIGHT_THEME","LIGHT_THEME","ELECTROCHEM_THEME","createTheme","base","overrides","getThemeByName","name","DEFAULT_THEME","OverlayRenderer","ctx","theme","xScale","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","cursor","cursorTheme","text","lines","lineHeight","padding","line","tooltipX","tooltipY","isDark","errorStyle","lineWidth","capWidth","showCaps","opacity","direction","yError","errorMinus","errorPlus","yBase","yTop","yBottom","xError","xBase","xRight","xLeft","majorTicks","divisions","minor","j","absVal","precision","str","mantissa","exponent","superscriptMap","unicodeExp","char","InteractionManager","container","callbacks","getPlotArea","getBounds","getAxesLayout","enabled","mouseX","mouseY","axes","zoomX","zoomY","targetAxisId","hitX","zoomFactor","normalizedX","normalizedY","dataX","dataY","MIN_RANGE","MAX_RANGE","nextXMin","nextXMax","nextYMin","nextYMax","nextXRange","nextYRange","newBounds","_b","_a","_d","_c","_f","_e","_h","_g","_j","_i","deltaX","deltaY","wasDragging","touch","DEFAULT_CONFIG","SelectionManager","config","pixelX","pixelY","radius","yScales","hitRadius","hitRadiusSq","nearest","minDistSq","seriesId","axisId","startIdx","searchRadius","startSearch","endSearch","px","py","dx","dy","distSq","results","points","previous","newPoints","indices","indexSet","current","index","ctrlKey","shiftKey","hit","additive","primaryYScale","x1","x2","clampedX1","clampedX2","clampedY1","clampedY2","dataBounds","hits","bySeriesMap","arr","pointsToSelect","containedPoints","seriesMap","seriesColor","boxRect","target","left","right","mid","DEFAULT_BREAKPOINTS","ResponsiveManager","newState","breakpoint","bp","touchOptimized","reducedMotion","touchMultiplier","smallMobile","mobile","tablet","desktop","font","baseSize","baseWidth","baseRadius","SERIALIZATION_VERSION","encodeFloat32Array","float32","bytes","binary","decodeFloat32Array","base64","compressString","compressed","decompressString","decoded","stateToUrlHash","state","compress","json","urlHashToState","hash","e","validateChartState","StateHistory","maxSize","snapshot","exportToCSV","seriesIds","includeHeaders","delimiter","seriesToExport","headers","maxLength","row","exportToJSON","viewBounds","v","exportToImage","webglCanvas","overlayCanvas","showLegend","finalCanvas","bg","applyZoom","hasBars","finalY","scale","oldRange","newRange","factor","offsetPct","sRange","sNewMin","sNewMax","applyPan","moveY","nextMin","nextMax","autoScaleAll","xMin","xMax","yAxisBounds","_","hasValidData","yBounds","MAX_VAL","MIN_VAL","xRange","xPad","opts","yPad","newMin","newMax","autoScaleYOnly","handleBoxZoom","selectionRect","currentRect","zoom","xMinNorm","xMaxNorm","yMaxNorm","yMinNorm","newXMin","newXMax","newYMin","newYMax","easings","c4","c5","AnimationEngine","easingFn","resolve","reject","promise","res","rej","from","to","progress","onUpdate","onComplete","startBounds","targetBounds","anim","promises","originalResolve","originalReject","err","now","completed","elapsed","rawProgress","easedProgress","DEFAULT_ANIMATION_CONFIG","mergeAnimationConfig","sharedEngine","getSharedAnimationEngine","currentZoomAnimation","currentAutoScaleAnimation","applyAnimatedZoom","shouldAnimate","targetXMin","targetXMax","targetYMin","targetYMax","primaryScale","startScaleDomains","startDomain","applyAnimatedAutoScale","animate","primaryBounds","primaryOpts","targetScaleDomains","animateToBounds","finalBounds","prepareSeriesData","seriesData","buf","seriesType","renderType","renderData","stepBuf","stepMode","pointCount","hData","hStyle","w","zMin","zMax","colormapId","bullishBuf","bearishBuf","renderOverlay","leftAxes","rightAxes","calculateSeriesBounds","heatmapData","xValues","yValues","yMax","high","low","xVal","ensureTypedArray","appendTypedArray","existing","newData","combined","applySmoothing","windowSize","len","smoothedY","halfWindow","sum","getYError","minus","plus","getXError","DEFAULT_STYLE","Series","hOpts","update","newX","newY","shift","oldSmooth","visible","val","maxPoints","createRenderer","interleaveBarData","barWidth","halfWidth","yi","x0","y0","calculateBarWidth","minSpacing","spacing","interleaveHeatmapData","z","numCells","v00","v10","v01","v11","getColormap","interleaveCandlestickData","open","close","bullishBody","bearishBody","halfWick","bodyTop","bodyBottom","appendRect","updateSeriesBuffer","stackId","refreshStack","updateHeatmapBuffer","bullish","bearish","colormapName","stackSeries","cumulativeY","yBaseline","addSeries","o","removeSeries","updateSeries","appendData","oldMaxX","currentXRange","dataXRange","setMaxPoints","initializeChart","bgColor","paColor","plotAreaColor","showControls","autoScroll","showStatistics","xAxisOptions","yAxisOptionsMap","primaryYAxisId","axisOpt","isFirst","defaultId","fullOptions","createCanvas","leftAxisCount","rightAxisCount","leftMargin","rightMargin","leftIndex","rightIndex","resizeCanvases","overlayCtx","c","pixelToDataX","PluginStorageImpl","_pluginName","key","obj","k","PluginLoggerImpl","pluginName","message","args","EventContextImpl","chart","event","handler","unsubscribe","wrapped","listeners","unsub","UIContextImpl","overlay","duration","notification","createPluginContext","deps","storage","log","events","ui","render","coords","yAxisId","animFrameIds","callback","PluginManagerImpl","dependencies","pluginOrFactory","plugin","missing","context","instance","initResult","dependents","oldConfig","hook","pluginData","customData","names","manifest","dep","instances","PluginRegistryImpl","entry","existed","capability","tag","lowerTag","registryInstance","getPluginRegistry","registerPlugin","definePlugin","factory","defineAndRegister","pluginFactory","loadPlugin","listPluginsByCategory","registry","categories","cat","validateManifest","errors","checkPluginCompatibility","engineVersion","warnings","reqMajor","curMajor","createPlugin","definition","createConfigurablePlugin","ICONS","ChartControls","parent","shadow","stopPropagation","evt","glassBg","glassBorder","borderRadius","show","def","types","nextIdx","btn","icon","svgEl","svg","title","onClick","buttons","panActiveColor","zoomActiveColor","selectActiveColor","smoothActiveColor","legendActiveColor","normalColor","isHover","isActive","deltaActiveColor","peakActiveColor","ChartLegend","resizeHandle","rafId","currentX","currentY","onMouseDown","onMouseMove","onMouseUp","onResizeMouseDown","updatePosition","parentRect","newWidth","stopIfNoDrag","swatch","isVisible","isArea","bullColor","itemGap","swatchSize","headerHeight","initControls","currentType","mappedType","active","link","initLegend","ChartInitQueueInternal","globalQueue","waitForInitTurn","markInitComplete","ChartInitQueue","getChartInitQueue","queueChartInit","_id","fn","waitForAnimations","durationMs","resetChartQueue","ChartImpl","EventEmitter","setup","setupChart","loadingConfig","PluginLoading","isSupported","responsiveConfig","api","manager","cmd","createControls","createLegend","original","newColor","calculatePlotArea","addSeriesImpl","removeSeriesImpl","updateSeriesImpl","appendDataImpl","setMaxPointsImpl","animation","isFinishing","annotation","annWithId","updates","existingIds","updated","newScale","oldScale","toolsApi","shouldShow","includeData","includeAnnotations","skipData","skipAnnotations","ax","annotationsApi","cfg","analysisApi","full","renderCtx","beforeEvent","renderTime","afterEvent","pxToDataX","createChart","queueId"],"mappings":"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"}
|