@photonviz/core 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/axes/ticks.ts","../src/axes/axis.ts","../src/gl/shared.ts","../src/gl/context.ts","../src/gl/program.ts","../src/gl/transform.ts","../src/layers/area.ts","../src/layers/bar.ts","../src/stats/index.ts","../src/layers/box.ts","../src/layers/candlestick.ts","../src/color/colormap.ts","../src/layers/contour.ts","../src/layers/errorbar.ts","../src/layers/heatmap.ts","../src/layers/hexbin.ts","../src/layers/line-util.ts","../src/layers/gpu-decimate.ts","../src/layers/line.ts","../src/layers/quiver.ts","../src/layers/scatter.ts","../src/layers/stem.ts","../src/render/overlay.ts","../src/scales/scale.ts","../src/ui/toolbar.ts","../src/plot.ts","../src/polar/polar.ts","../src/plot3d/mat4.ts","../src/plot3d/pointcloud.ts","../src/plot3d/surface.ts","../src/plot3d/plot3d.ts"],"sourcesContent":["import type { Tick, TicksSpec } from \"../types.js\";\n\n/**\n * Produce a \"nice\" step for an interval, e.g. 1, 2, 5 × 10^n.\n * Classic Wilkinson-style rounding used by most plotting libraries.\n */\nfunction niceStep(rawStep: number): number {\n const mag = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const norm = rawStep / mag; // in [1, 10)\n let nice: number;\n if (norm < 1.5) nice = 1;\n else if (norm < 3) nice = 2;\n else if (norm < 7) nice = 5;\n else nice = 10;\n return nice * mag;\n}\n\n/**\n * Auto ticks for a linear axis using nice-number rounding.\n * Returns major ticks; minor ticks are added separately.\n */\nexport function autoTicks(min: number, max: number, target = 6): Tick[] {\n if (!isFinite(min) || !isFinite(max) || min === max) return [];\n const span = max - min;\n const step = niceStep(span / Math.max(1, target));\n const start = Math.ceil(min / step) * step;\n const ticks: Tick[] = [];\n // Guard against float drift accumulating over many steps.\n for (let i = 0; i < 1000; i++) {\n const v = start + i * step;\n if (v > max + step * 1e-6) break;\n // Snap tiny float errors to zero-ish clean values.\n ticks.push({ value: Math.abs(v) < step * 1e-6 ? 0 : v });\n }\n return ticks;\n}\n\n/** Insert `count` evenly spaced minor ticks between each pair of major ticks. */\nexport function withMinorTicks(major: Tick[], count: number): Tick[] {\n if (count <= 0 || major.length < 2) return major;\n const out: Tick[] = [];\n for (let i = 0; i < major.length; i++) {\n out.push(major[i]!);\n if (i < major.length - 1) {\n const a = major[i]!.value;\n const b = major[i + 1]!.value;\n const step = (b - a) / (count + 1);\n for (let k = 1; k <= count; k++) {\n out.push({ value: a + step * k, minor: true, grid: false });\n }\n }\n }\n return out;\n}\n\n/** Normalize a loose tick entry (number or partial Tick) into a full Tick. */\nfunction normalize(entry: number | Tick): Tick {\n return typeof entry === \"number\" ? { value: entry } : entry;\n}\n\n/**\n * Resolve a user `TicksSpec` (array | Tick[] | generator) against the current\n * axis range into a concrete, sorted Tick list. Returns `null` if no explicit\n * spec was given, signaling the caller to fall back to auto ticks.\n */\nexport function resolveTicks(\n spec: TicksSpec | undefined,\n min: number,\n max: number,\n): Tick[] | null {\n if (spec == null) return null;\n const raw = typeof spec === \"function\" ? spec(min, max) : spec;\n return raw.map(normalize).sort((a, b) => a.value - b.value);\n}\n\n/** Default number formatter: compact, avoids noisy trailing decimals. */\nexport function defaultFormat(value: number): string {\n if (value === 0) return \"0\";\n const abs = Math.abs(value);\n if (abs >= 1e6 || abs < 1e-4) return value.toExponential(1);\n // Up to 6 significant digits, trimmed.\n return parseFloat(value.toPrecision(6)).toString();\n}\n","import type { Scale } from \"../scales/scale.js\";\nimport type { AxisConfig, Tick } from \"../types.js\";\nimport { resolveTicks, withMinorTicks } from \"./ticks.js\";\n\n/**\n * Owns the tick configuration for one axis and resolves the final tick list\n * against a scale. Modes: auto (delegates to the scale), custom (array), or\n * generator (function of the range) — plus major/minor, per-tick labels, and\n * `addTicks` layering.\n */\nexport class Axis {\n config: AxisConfig;\n\n constructor(config: AxisConfig = {}) {\n this.config = config;\n }\n\n update(patch: Partial<AxisConfig>): void {\n this.config = { ...this.config, ...patch };\n }\n\n /** Resolve the concrete tick list (labels filled) for the scale's domain. */\n resolve(scale: Scale): Tick[] {\n const [min, max] = scale.domain;\n const explicit = resolveTicks(this.config.ticks, min, max);\n\n let ticks: Tick[];\n if (explicit) {\n ticks = explicit;\n } else {\n let major = scale.ticks();\n // Auto minor ticks only make sense for linear-style scales; log/time\n // scales already emit their own minor ticks.\n const minor = this.config.minorTicks;\n if (minor && scale.type === \"linear\") {\n major = withMinorTicks(major, minor === true ? 4 : minor);\n }\n if (this.config.addTicks?.length) {\n const extra = this.config.addTicks.map((e) =>\n typeof e === \"number\" ? { value: e } : e,\n );\n major = [...major, ...extra].sort((a, b) => a.value - b.value);\n }\n ticks = major;\n }\n\n const fmt = this.config.format ?? ((v: number) => scale.formatTick(v));\n return ticks\n .filter((t) => t.value >= min && t.value <= max)\n .map((t) => ({\n value: t.value,\n label: t.minor ? \"\" : (t.label ?? fmt(t.value)),\n minor: t.minor ?? false,\n grid: t.grid ?? !t.minor,\n }));\n }\n}\n","/**\n * A single process-wide WebGL2 context shared by every Plot / Plot3D.\n *\n * Browsers cap the number of simultaneous WebGL contexts (~16 in Chrome); one\n * context per chart quickly exceeds that and the browser silently evicts the\n * oldest contexts, leaving blank charts. Instead we keep ONE offscreen context,\n * render each chart's scene into it, and blit the result into that chart's own\n * lightweight 2D canvas. GPU resources (buffers, textures, programs) live in the\n * shared context, so layers created by different plots coexist fine.\n */\nlet shared: { canvas: HTMLCanvasElement; gl: WebGL2RenderingContext } | null = null;\n\nexport function getSharedGL(): { canvas: HTMLCanvasElement; gl: WebGL2RenderingContext } {\n if (shared) return shared;\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl2\", {\n antialias: true,\n premultipliedAlpha: true,\n alpha: true,\n // Required so the rendered frame survives long enough to be blitted out.\n preserveDrawingBuffer: true,\n depth: true,\n });\n if (!gl) throw new Error(\"WebGL2 is not supported in this environment\");\n shared = { canvas, gl };\n return shared;\n}\n\n/** Configure the shared context for 2D (blend on, depth off) rendering. */\nexport function begin2D(gl: WebGL2RenderingContext): void {\n gl.disable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n}\n\n/** Configure the shared context for 3D (depth on) rendering. */\nexport function begin3D(gl: WebGL2RenderingContext): void {\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n}\n\n/** Resize the shared canvas to the target device-pixel size (idempotent). */\nexport function sizeShared(gl: WebGL2RenderingContext, w: number, h: number): void {\n const c = gl.canvas as HTMLCanvasElement;\n if (c.width !== w) c.width = w;\n if (c.height !== h) c.height = h;\n}\n","export interface RenderContext {\n gl: WebGL2RenderingContext;\n /** CSS pixel width / height of the drawing area (the plot region). */\n width: number;\n height: number;\n /** devicePixelRatio in effect. */\n dpr: number;\n}\n\n/** Create a WebGL2 context configured for crisp 2D plotting. */\nexport function createGL(canvas: HTMLCanvasElement): WebGL2RenderingContext {\n const gl = canvas.getContext(\"webgl2\", {\n antialias: true,\n premultipliedAlpha: true,\n alpha: true,\n });\n if (!gl) throw new Error(\"WebGL2 is not supported in this environment\");\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n return gl;\n}\n\n/** Parse a CSS hex/rgb color string into normalized RGBA (0..1). */\nexport function parseColor(input: string): [number, number, number, number] {\n const s = input.trim();\n if (s.startsWith(\"#\")) {\n let hex = s.slice(1);\n if (hex.length === 3) hex = hex.split(\"\").map((c) => c + c).join(\"\");\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 = hex.length >= 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n const m = s.match(/rgba?\\(([^)]+)\\)/);\n if (m) {\n const parts = m[1]!.split(\",\").map((p) => parseFloat(p.trim()));\n return [(parts[0] ?? 0) / 255, (parts[1] ?? 0) / 255, (parts[2] ?? 0) / 255, parts[3] ?? 1];\n }\n return [0, 0, 0, 1];\n}\n\n/** Normalized RGBA (0..1) back to a CSS `rgba(...)` string. */\nexport function toColorCss(c: readonly [number, number, number, number]): string {\n const to255 = (v: number) => Math.round(v * 255);\n return `rgba(${to255(c[0])},${to255(c[1])},${to255(c[2])},${c[3]})`;\n}\n","/** Compile a single shader stage, throwing with the GLSL log on failure. */\nfunction compileShader(gl: WebGL2RenderingContext, type: number, source: string): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"Failed to create shader\");\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compile error:\\n${log}\\n---\\n${source}`);\n }\n return shader;\n}\n\n/** Compile + link a vertex/fragment program. */\nexport function createProgram(\n gl: WebGL2RenderingContext,\n vert: string,\n frag: string,\n): WebGLProgram {\n const vs = compileShader(gl, gl.VERTEX_SHADER, vert);\n const fs = compileShader(gl, gl.FRAGMENT_SHADER, frag);\n const program = gl.createProgram();\n if (!program) throw new Error(\"Failed to create program\");\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n throw new Error(`Program link error:\\n${log}`);\n }\n return program;\n}\n\n/** Cache uniform locations for a program by name. */\nexport function uniformLocations(\n gl: WebGL2RenderingContext,\n program: WebGLProgram,\n names: string[],\n): Record<string, WebGLUniformLocation | null> {\n const out: Record<string, WebGLUniformLocation | null> = {};\n for (const name of names) out[name] = gl.getUniformLocation(program, name);\n return out;\n}\n","/**\n * Shared data→clip transform used by every layer's vertex shader.\n *\n * Two subtleties it handles:\n * - **Log axes** — when `uLogX/uLogY` is set, the real coordinate is\n * log10-transformed on the GPU.\n * - **Float32 precision** — vertex buffers are float32 (~7 significant digits),\n * which is not enough for large values like epoch-millisecond timestamps.\n * Layers upload coordinates *relative to a reference* (`x - xRef`) and pass\n * `uXRef`; the domain is passed in the same offset space, so the subtraction\n * that computes the normalized position never suffers catastrophic\n * cancellation. For log axes the reference is added back before log10.\n */\nexport const TRANSFORM_GLSL = /* glsl */ `\nuniform vec2 uDomainX; // linear: (lo-ref, hi-ref) ; log: (log10 lo, log10 hi)\nuniform vec2 uDomainY;\nuniform float uXRef;\nuniform float uYRef;\nuniform float uLogX; // >0.5 => log axis\nuniform float uLogY;\n\nvec2 dataToNorm(vec2 p) {\n float cx = (uLogX > 0.5) ? log(p.x + uXRef) / 2.302585092994046 : p.x;\n float cy = (uLogY > 0.5) ? log(p.y + uYRef) / 2.302585092994046 : p.y;\n float nx = (cx - uDomainX.x) / (uDomainX.y - uDomainX.x);\n float ny = (cy - uDomainY.x) / (uDomainY.y - uDomainY.x);\n return vec2(nx, ny);\n}\n\nvec2 dataToClip(vec2 p) {\n return dataToNorm(p) * 2.0 - 1.0;\n}\n`;\n\n/** Per-axis view state handed to a layer each frame. `lo`/`hi` are raw data-space. */\nexport interface AxisFrame {\n lo: number;\n hi: number;\n log: boolean;\n}\n\nexport const TRANSFORM_UNIFORMS = [\n \"uDomainX\",\n \"uDomainY\",\n \"uXRef\",\n \"uYRef\",\n \"uLogX\",\n \"uLogY\",\n] as const;\n\n/** Set the shared transform uniforms for a layer given its per-axis references. */\nexport function setTransformUniforms(\n gl: WebGL2RenderingContext,\n u: Record<string, WebGLUniformLocation | null>,\n x: AxisFrame,\n y: AxisFrame,\n xRef: number,\n yRef: number,\n): void {\n const [lox, hix] = x.log ? [Math.log10(x.lo), Math.log10(x.hi)] : [x.lo - xRef, x.hi - xRef];\n const [loy, hiy] = y.log ? [Math.log10(y.lo), Math.log10(y.hi)] : [y.lo - yRef, y.hi - yRef];\n gl.uniform2f(u.uDomainX!, lox, hix);\n gl.uniform2f(u.uDomainY!, loy, hiy);\n gl.uniform1f(u.uXRef!, xRef);\n gl.uniform1f(u.uYRef!, yRef);\n gl.uniform1f(u.uLogX!, x.log ? 1 : 0);\n gl.uniform1f(u.uLogY!, y.log ? 1 : 0);\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface AreaOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Lower edge(s). Number or per-point array — pass cumulative to stack. */\n base?: number | ArrayLike<number>;\n color?: string | Color;\n name?: string;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos; // offset data space\n${TRANSFORM_GLSL}\nvoid main() { gl_Position = vec4(dataToClip(aPos), 0.0, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(uColor.rgb * uColor.a, uColor.a); }`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class AreaLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private vertexCount: number;\n private color: Color;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: AreaOptions) {\n this.id = `area-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n const colorInput = opts.color ?? \"rgba(59,130,246,0.4)\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.vertexCount = n * 2;\n const baseAt = (i: number): number =>\n opts.base == null ? 0 : typeof opts.base === \"number\" ? opts.base : opts.base[i]!;\n\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n // Triangle strip: alternate base and top vertices per x.\n const data = new Float32Array(n * 4);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, b = baseAt(i), top = opts.y[i]!;\n data[i * 4] = x - this.xRef;\n data[i * 4 + 1] = b - this.yRef;\n data[i * 4 + 2] = x - this.xRef;\n data[i * 4 + 3] = top - this.yRef;\n minX = Math.min(minX, x); maxX = Math.max(maxX, x);\n minY = Math.min(minY, b, top); maxY = Math.max(maxY, b, top);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uColor\"]);\n }\n\n /** Replace the area data and re-upload (for streaming). */\n setData(x: ArrayLike<number>, y: ArrayLike<number>, base?: number | ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n this.vertexCount = n * 2;\n const baseAt = (i: number): number =>\n base == null ? 0 : typeof base === \"number\" ? base : base[i]!;\n this.xRef = n > 0 ? x[0]! : 0;\n this.yRef = n > 0 ? y[0]! : 0;\n const data = new Float32Array(n * 4);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const vx = x[i]!, b = baseAt(i), top = y[i]!;\n data[i * 4] = vx - this.xRef; data[i * 4 + 1] = b - this.yRef;\n data[i * 4 + 2] = vx - this.xRef; data[i * 4 + 3] = top - this.yRef;\n if (vx < minX) minX = vx; if (vx > maxX) maxX = vx;\n minY = Math.min(minY, b, top); maxY = Math.max(maxY, b, top);\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, data, this.gl.DYNAMIC_DRAW);\n }\n\n bounds() {\n if (this.vertexCount === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.vertexCount < 4) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.vertexCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface BarOptions {\n /** Bar center positions (data space). */\n x: ArrayLike<number>;\n /** Bar top values. */\n y: ArrayLike<number>;\n /** Baseline(s). Number or per-bar array — pass cumulative values to stack. */\n base?: number | ArrayLike<number>;\n /** Bar width in data units. Defaults to 80% of the median spacing. */\n width?: number;\n /** Shift bars by this many data units (use for grouped bars). */\n offset?: number;\n color?: string | Color;\n name?: string;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit rect [0,1]^2\nlayout(location = 1) in vec4 aRect; // (x0,y0,x1,y1) offset data space\n${TRANSFORM_GLSL}\nvoid main() {\n vec2 p = mix(aRect.xy, aRect.zw, aCorner);\n gl_Position = vec4(dataToClip(p), 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(uColor.rgb * uColor.a, uColor.a); }`;\n\nconst CORNERS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1]);\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nfunction medianSpacing(x: ArrayLike<number>, n: number): number {\n if (n < 2) return 1;\n const diffs: number[] = [];\n for (let i = 1; i < n; i++) diffs.push(Math.abs(x[i]! - x[i - 1]!));\n diffs.sort((a, b) => a - b);\n return diffs[Math.floor(diffs.length / 2)] || 1;\n}\n\nlet counter = 0;\n\nexport class BarLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private count: number;\n private color: Color;\n private barWidth: number;\n private offset: number;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: BarOptions) {\n this.id = `bar-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.count = n;\n this.barWidth = opts.width ?? medianSpacing(opts.x, n) * 0.8;\n this.offset = opts.offset ?? 0;\n const rects = this.buildRects(opts.x, opts.y, opts.base, n);\n\n const vao = gl.createVertexArray()!;\n this.vao = vao;\n gl.bindVertexArray(vao);\n const cornerBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n const rectBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, rectBuf);\n gl.bufferData(gl.ARRAY_BUFFER, rects, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindVertexArray(null);\n this.buffers = [cornerBuf, rectBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uColor\"]);\n }\n\n private buildRects(\n x: ArrayLike<number>, y: ArrayLike<number>,\n base: number | ArrayLike<number> | undefined, n: number,\n ): Float32Array {\n const width = this.barWidth, off = this.offset;\n const baseAt = (i: number): number =>\n base == null ? 0 : typeof base === \"number\" ? base : base[i]!;\n this.xRef = n > 0 ? x[0]! : 0;\n this.yRef = n > 0 ? y[0]! : 0;\n const rects = new Float32Array(n * 4);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const cx = x[i]! + off;\n const x0 = cx - width / 2, x1 = cx + width / 2;\n const b = baseAt(i), top = y[i]!;\n rects[i * 4] = x0 - this.xRef;\n rects[i * 4 + 1] = b - this.yRef;\n rects[i * 4 + 2] = x1 - this.xRef;\n rects[i * 4 + 3] = top - this.yRef;\n minX = Math.min(minX, x0); maxX = Math.max(maxX, x1);\n minY = Math.min(minY, b, top); maxY = Math.max(maxY, b, top);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n return rects;\n }\n\n /** Replace bar values and re-upload (for streaming). */\n setData(x: ArrayLike<number>, y: ArrayLike<number>, base?: number | ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n this.count = n;\n const rects = this.buildRects(x, y, base, n);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffers[1]!);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, rects, this.gl.DYNAMIC_DRAW);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.bindVertexArray(this.vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","/** Pure statistics helpers backing the histogram, box, and violin layers. */\n\nexport interface Histogram {\n edges: Float64Array;\n counts: Float64Array;\n centers: Float64Array;\n binWidth: number;\n}\n\n/** Bin `values` into `bins` equal-width buckets (or use explicit `edges`). */\nexport function histogram(\n values: ArrayLike<number>,\n opts: { bins?: number; edges?: ArrayLike<number>; range?: [number, number] } = {},\n): Histogram {\n const n = values.length;\n let edges: Float64Array;\n if (opts.edges) {\n edges = Float64Array.from(opts.edges as ArrayLike<number>);\n } else {\n let lo = opts.range?.[0] ?? Infinity;\n let hi = opts.range?.[1] ?? -Infinity;\n if (!opts.range) {\n for (let i = 0; i < n; i++) {\n const v = values[i]!;\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n if (!isFinite(lo) || !isFinite(hi) || lo === hi) {\n lo = (lo || 0) - 0.5;\n hi = (hi || 0) + 0.5;\n }\n // Sturges' rule as a sane default bin count.\n const bins = opts.bins ?? Math.max(1, Math.ceil(Math.log2(n || 1) + 1));\n edges = new Float64Array(bins + 1);\n for (let i = 0; i <= bins; i++) edges[i] = lo + ((hi - lo) * i) / bins;\n }\n\n const bins = edges.length - 1;\n const counts = new Float64Array(bins);\n const lo = edges[0]!, hi = edges[bins]!;\n const width = (hi - lo) / bins;\n for (let i = 0; i < n; i++) {\n const v = values[i]!;\n if (v < lo || v > hi) continue;\n let b = Math.floor((v - lo) / width);\n if (b >= bins) b = bins - 1; // include the right edge\n counts[b]! += 1;\n }\n const centers = new Float64Array(bins);\n for (let i = 0; i < bins; i++) centers[i] = (edges[i]! + edges[i + 1]!) / 2;\n return { edges, counts, centers, binWidth: width };\n}\n\n/** Quantile of a *sorted* array via linear interpolation (type-7, like NumPy). */\nexport function quantileSorted(sorted: ArrayLike<number>, q: number): number {\n const n = sorted.length;\n if (n === 0) return NaN;\n if (n === 1) return sorted[0]!;\n const pos = (n - 1) * q;\n const lo = Math.floor(pos);\n const frac = pos - lo;\n const a = sorted[lo]!;\n const b = sorted[Math.min(n - 1, lo + 1)]!;\n return a + (b - a) * frac;\n}\n\nexport interface BoxStats {\n min: number;\n q1: number;\n median: number;\n q3: number;\n max: number;\n /** Whisker ends: furthest points within 1.5·IQR of the quartiles. */\n whiskerLo: number;\n whiskerHi: number;\n outliers: number[];\n}\n\n/** Tukey box-plot statistics for a set of values. */\nexport function boxStats(values: ArrayLike<number>): BoxStats {\n const sorted = Float64Array.from(values as ArrayLike<number>).sort();\n const n = sorted.length;\n const q1 = quantileSorted(sorted, 0.25);\n const median = quantileSorted(sorted, 0.5);\n const q3 = quantileSorted(sorted, 0.75);\n const iqr = q3 - q1;\n const fenceLo = q1 - 1.5 * iqr;\n const fenceHi = q3 + 1.5 * iqr;\n let whiskerLo = q1, whiskerHi = q3;\n const outliers: number[] = [];\n for (let i = 0; i < n; i++) {\n const v = sorted[i]!;\n if (v < fenceLo || v > fenceHi) outliers.push(v);\n else {\n if (v < whiskerLo) whiskerLo = v;\n if (v > whiskerHi) whiskerHi = v;\n }\n }\n return {\n min: n ? sorted[0]! : NaN,\n q1, median, q3,\n max: n ? sorted[n - 1]! : NaN,\n whiskerLo, whiskerHi, outliers,\n };\n}\n\nfunction stddev(values: ArrayLike<number>, mean: number): number {\n const n = values.length;\n let s = 0;\n for (let i = 0; i < n; i++) {\n const d = values[i]! - mean;\n s += d * d;\n }\n return Math.sqrt(s / Math.max(1, n - 1));\n}\n\n/** In-place iterative radix-2 Cooley–Tukey FFT (length must be a power of two). */\nexport function fft(re: Float64Array, im: Float64Array): void {\n const n = re.length;\n for (let i = 1, j = 0; i < n; i++) {\n let bit = n >> 1;\n for (; j & bit; bit >>= 1) j ^= bit;\n j ^= bit;\n if (i < j) {\n [re[i], re[j]] = [re[j]!, re[i]!];\n [im[i], im[j]] = [im[j]!, im[i]!];\n }\n }\n for (let len = 2; len <= n; len <<= 1) {\n const ang = (-2 * Math.PI) / len;\n const wRe = Math.cos(ang), wIm = Math.sin(ang);\n for (let i = 0; i < n; i += len) {\n let curRe = 1, curIm = 0;\n for (let k = 0; k < len / 2; k++) {\n const a = i + k, b = i + k + len / 2;\n const tRe = re[b]! * curRe - im[b]! * curIm;\n const tIm = re[b]! * curIm + im[b]! * curRe;\n re[b] = re[a]! - tRe; im[b] = im[a]! - tIm;\n re[a] = re[a]! + tRe; im[a] = im[a]! + tIm;\n const nRe = curRe * wRe - curIm * wIm;\n curIm = curRe * wIm + curIm * wRe;\n curRe = nRe;\n }\n }\n }\n}\n\nexport interface Spectrogram {\n /** Row-major magnitudes (dB), rows = freq bins (low at row 0), cols = frames. */\n values: Float64Array;\n cols: number;\n rows: number;\n extent: { x: [number, number]; y: [number, number] };\n}\n\n/** Short-time Fourier transform of a real signal → a time×frequency dB grid. */\nexport function spectrogram(\n signal: ArrayLike<number>,\n opts: { fftSize?: number; hop?: number; sampleRate?: number } = {},\n): Spectrogram {\n const fftSize = opts.fftSize ?? 256;\n const hop = opts.hop ?? fftSize >> 1;\n const sr = opts.sampleRate ?? 1;\n const N = signal.length;\n const frames = Math.max(1, Math.floor((N - fftSize) / hop) + 1);\n const bins = fftSize >> 1;\n const values = new Float64Array(bins * frames);\n const re = new Float64Array(fftSize);\n const im = new Float64Array(fftSize);\n for (let f = 0; f < frames; f++) {\n const start = f * hop;\n for (let i = 0; i < fftSize; i++) {\n const w = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / (fftSize - 1)); // Hann\n re[i] = (signal[start + i] ?? 0) * w;\n im[i] = 0;\n }\n fft(re, im);\n for (let b = 0; b < bins; b++) {\n const mag = Math.hypot(re[b]!, im[b]!) / fftSize;\n values[b * frames + f] = 20 * Math.log10(mag + 1e-9); // dB\n }\n }\n return {\n values,\n cols: frames,\n rows: bins,\n extent: { x: [0, N / sr], y: [0, sr / 2] },\n };\n}\n\nexport interface Density {\n xs: Float64Array;\n ys: Float64Array;\n}\n\n/**\n * Gaussian kernel density estimate over `points` grid samples in [lo, hi].\n * Bandwidth defaults to Silverman's rule of thumb.\n */\nexport function kde(\n values: ArrayLike<number>,\n lo: number,\n hi: number,\n points = 64,\n bandwidth?: number,\n): Density {\n const n = values.length;\n let mean = 0;\n for (let i = 0; i < n; i++) mean += values[i]!;\n mean /= Math.max(1, n);\n const sd = stddev(values, mean) || 1;\n const h = bandwidth ?? 1.06 * sd * Math.pow(Math.max(1, n), -0.2);\n const xs = new Float64Array(points);\n const ys = new Float64Array(points);\n const norm = 1 / (n * h * Math.sqrt(2 * Math.PI));\n for (let p = 0; p < points; p++) {\n const x = lo + ((hi - lo) * p) / (points - 1);\n let sum = 0;\n for (let i = 0; i < n; i++) {\n const u = (x - values[i]!) / h;\n sum += Math.exp(-0.5 * u * u);\n }\n xs[p] = x;\n ys[p] = sum * norm;\n }\n return { xs, ys };\n}\n","import { parseColor } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport { boxStats, kde } from \"../stats/index.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface BoxGroup {\n /** X-axis center for this group. */\n position: number;\n values: ArrayLike<number>;\n color?: string | Color;\n label?: string;\n}\n\nexport interface BoxOptions {\n groups: BoxGroup[];\n /** Group width in data units. */\n width?: number;\n /** Draw the Tukey box + whiskers (default true). */\n box?: boolean;\n /** Draw a violin (KDE) shape behind/instead of the box (default false). */\n violin?: boolean;\n yAxis?: string;\n}\n\n// One program: per-vertex color, optional round points.\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos;\nlayout(location = 1) in vec4 aColor;\nuniform float uPointSize;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vColor = aColor;\n gl_PointSize = uPointSize;\n gl_Position = vec4(dataToClip(aPos), 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nuniform float uIsPoint;\nout vec4 outColor;\nvoid main() {\n if (uIsPoint > 0.5) {\n vec2 d = gl_PointCoord - 0.5;\n if (length(d) > 0.5) discard;\n }\n outColor = vec4(vColor.rgb * vColor.a, vColor.a);\n}`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nconst DEFAULT_COLOR = \"#3b82f6\";\n\nlet counter = 0;\n\n/** Interleaved [x, y, r, g, b, a] vertex pusher. */\nclass Mesh {\n data: number[] = [];\n push(x: number, y: number, c: Color): void {\n this.data.push(x, y, c[0], c[1], c[2], c[3]);\n }\n get count(): number {\n return this.data.length / 6;\n }\n}\n\nexport class BoxLayer implements Layer {\n readonly id: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n private triCount: number;\n private lineStart: number;\n private lineCount: number;\n private pointStart: number;\n private pointCount: number;\n\n constructor(gl: WebGL2RenderingContext, opts: BoxOptions) {\n this.id = `box-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.yAxis = opts.yAxis ?? \"y\";\n\n const groups = opts.groups;\n const width = opts.width ?? 0.6;\n const hw = width / 2;\n const showBox = opts.box !== false;\n const showViolin = opts.violin === true;\n\n this.xRef = groups.length ? groups[0]!.position : 0;\n // yRef from the first datum we can find.\n this.yRef = groups.length && groups[0]!.values.length ? groups[0]!.values[0]! : 0;\n\n const tris = new Mesh();\n const lines = new Mesh();\n const points = new Mesh();\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n const track = (x: number, y: number) => {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n };\n const ox = (v: number) => v - this.xRef;\n const oy = (v: number) => v - this.yRef;\n\n for (const g of groups) {\n const cx = g.position;\n const base = Array.isArray(g.color) ? (g.color as Color) : parseColor((g.color as string) ?? DEFAULT_COLOR);\n const fill: Color = [base[0], base[1], base[2], 0.35];\n const stroke: Color = [base[0], base[1], base[2], 1];\n const s = boxStats(g.values);\n track(cx - hw, s.whiskerLo);\n track(cx + hw, s.whiskerHi);\n\n if (showViolin) {\n const lo = s.min, hi = s.max;\n const d = kde(g.values, lo, hi, 48);\n let maxD = 0;\n for (let i = 0; i < d.ys.length; i++) maxD = Math.max(maxD, d.ys[i]!);\n maxD = maxD || 1;\n // Triangle strip (as triangles) mirrored around cx.\n for (let i = 0; i < d.xs.length - 1; i++) {\n const w0 = (d.ys[i]! / maxD) * hw;\n const w1 = (d.ys[i + 1]! / maxD) * hw;\n const y0 = d.xs[i]!, y1 = d.xs[i + 1]!;\n // left and right quads\n tris.push(ox(cx - w0), oy(y0), fill); tris.push(ox(cx + w0), oy(y0), fill); tris.push(ox(cx + w1), oy(y1), fill);\n tris.push(ox(cx - w0), oy(y0), fill); tris.push(ox(cx + w1), oy(y1), fill); tris.push(ox(cx - w1), oy(y1), fill);\n }\n track(cx - hw, lo); track(cx + hw, hi);\n }\n\n if (showBox) {\n // Box body (q1..q3).\n const x0 = ox(cx - hw), x1 = ox(cx + hw);\n const yq1 = oy(s.q1), yq3 = oy(s.q3);\n if (!showViolin) {\n tris.push(x0, yq1, fill); tris.push(x1, yq1, fill); tris.push(x1, yq3, fill);\n tris.push(x0, yq1, fill); tris.push(x1, yq3, fill); tris.push(x0, yq3, fill);\n }\n // Box outline.\n const edge: [number, number, number, number][] = [\n [x0, yq1, x1, yq1], [x1, yq1, x1, yq3], [x1, yq3, x0, yq3], [x0, yq3, x0, yq1],\n ];\n for (const [ax, ay, bx, by] of edge) { lines.push(ax, ay, stroke); lines.push(bx, by, stroke); }\n // Median.\n const ym = oy(s.median);\n lines.push(x0, ym, stroke); lines.push(x1, ym, stroke);\n // Whiskers + caps.\n const cxo = ox(cx);\n lines.push(cxo, oy(s.q3), stroke); lines.push(cxo, oy(s.whiskerHi), stroke);\n lines.push(cxo, oy(s.q1), stroke); lines.push(cxo, oy(s.whiskerLo), stroke);\n const capHw = hw * 0.5;\n lines.push(ox(cx - capHw), oy(s.whiskerHi), stroke); lines.push(ox(cx + capHw), oy(s.whiskerHi), stroke);\n lines.push(ox(cx - capHw), oy(s.whiskerLo), stroke); lines.push(ox(cx + capHw), oy(s.whiskerLo), stroke);\n // Outliers.\n for (const v of s.outliers) { points.push(cxo, oy(v), stroke); track(cx, v); }\n }\n }\n\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const all = [...tris.data, ...lines.data, ...points.data];\n this.triCount = tris.count;\n this.lineStart = tris.count;\n this.lineCount = lines.count;\n this.pointStart = tris.count + lines.count;\n this.pointCount = points.count;\n\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(all), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 24, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 24, 8);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uPointSize\", \"uIsPoint\"]);\n }\n\n bounds() {\n if (this.triCount + this.lineCount + this.pointCount === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform1f(this.uniforms.uPointSize!, 5 * state.dpr);\n gl.bindVertexArray(this.vao);\n if (this.triCount > 0) {\n gl.uniform1f(this.uniforms.uIsPoint!, 0);\n gl.drawArrays(gl.TRIANGLES, 0, this.triCount);\n }\n if (this.lineCount > 0) {\n gl.uniform1f(this.uniforms.uIsPoint!, 0);\n gl.drawArrays(gl.LINES, this.lineStart, this.lineCount);\n }\n if (this.pointCount > 0) {\n gl.uniform1f(this.uniforms.uIsPoint!, 1);\n gl.drawArrays(gl.POINTS, this.pointStart, this.pointCount);\n }\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface CandlestickOptions {\n /** Candle positions (data space — e.g. epoch ms on a time axis). */\n x: ArrayLike<number>;\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n /** Body width in data units. Defaults to 70% of the median spacing. */\n width?: number;\n /** Close ≥ open color. Default green. */\n upColor?: string | Color;\n /** Close < open color. Default red. */\n downColor?: string | Color;\n /** Wick thickness in CSS px. Default 1.5. */\n wickWidth?: number;\n name?: string;\n yAxis?: string;\n}\n\n// Body: an instanced data-space rectangle with a per-candle color.\nconst BODY_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit rect [0,1]^2\nlayout(location = 1) in vec4 aRect; // (x0,y0,x1,y1) offset data space\nlayout(location = 2) in vec4 aColor;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vec2 p = mix(aRect.xy, aRect.zw, aCorner);\n vColor = aColor;\n gl_Position = vec4(dataToClip(p), 0.0, 1.0);\n}`;\n\n// Wick: a data-space low->high segment, pixel-thick, per-candle color.\nconst WICK_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec4 aSeg; // (x0,y0,x1,y1) offset data space\nlayout(location = 2) in vec4 aColor;\nuniform vec2 uResolution;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vec2 s0 = (dataToClip(aSeg.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aSeg.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n vec2 pos = mix(s0, s1, aCorner.x) + nrm * (aCorner.y * uWidth * 0.5);\n vColor = aColor;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor.rgb * vColor.a, vColor.a); }`;\n\nconst RECT_CORNERS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1]);\nconst SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\n\ntype Key = \"body\" | \"wick\";\nconst cache = new WeakMap<WebGL2RenderingContext, Record<Key, WebGLProgram>>();\nfunction programs(gl: WebGL2RenderingContext): Record<Key, WebGLProgram> {\n let p = cache.get(gl);\n if (!p) {\n p = { body: createProgram(gl, BODY_VERT, FRAG), wick: createProgram(gl, WICK_VERT, FRAG) };\n cache.set(gl, p);\n }\n return p;\n}\n\nfunction medianSpacing(x: ArrayLike<number>, n: number): number {\n if (n < 2) return 1;\n const diffs: number[] = [];\n for (let i = 1; i < n; i++) diffs.push(Math.abs(x[i]! - x[i - 1]!));\n diffs.sort((a, b) => a - b);\n return diffs[Math.floor(diffs.length / 2)] || 1;\n}\n\nlet counter = 0;\n\nexport class CandlestickLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private progs: Record<Key, WebGLProgram>;\n private bodyVao: WebGLVertexArrayObject;\n private wickVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uBody: Record<string, WebGLUniformLocation | null>;\n private uWick: Record<string, WebGLUniformLocation | null>;\n private wickWidth: number;\n private count: number;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: CandlestickOptions) {\n this.id = `candlestick-${counter++}`;\n this.gl = gl;\n this.progs = programs(gl);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.wickWidth = opts.wickWidth ?? 1.5;\n\n const up = toColor(opts.upColor ?? \"#26a69a\");\n const down = toColor(opts.downColor ?? \"#ef5350\");\n this.colorCss = toColorCss(up);\n\n const n = Math.min(opts.x.length, opts.open.length, opts.high.length, opts.low.length, opts.close.length);\n this.count = n;\n const width = opts.width ?? medianSpacing(opts.x, n) * 0.7;\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.open[0]! : 0;\n\n const rects = new Float32Array(n * 4);\n const wicks = new Float32Array(n * 4);\n const colors = new Float32Array(n * 4);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const cx = opts.x[i]!, o = opts.open[i]!, h = opts.high[i]!, l = opts.low[i]!, c = opts.close[i]!;\n const x0 = cx - width / 2, x1 = cx + width / 2;\n rects[i * 4] = x0 - this.xRef; rects[i * 4 + 1] = o - this.yRef;\n rects[i * 4 + 2] = x1 - this.xRef; rects[i * 4 + 3] = c - this.yRef;\n wicks[i * 4] = cx - this.xRef; wicks[i * 4 + 1] = l - this.yRef;\n wicks[i * 4 + 2] = cx - this.xRef; wicks[i * 4 + 3] = h - this.yRef;\n const col = c >= o ? up : down;\n colors[i * 4] = col[0]; colors[i * 4 + 1] = col[1]; colors[i * 4 + 2] = col[2]; colors[i * 4 + 3] = col[3];\n minX = Math.min(minX, x0); maxX = Math.max(maxX, x1);\n minY = Math.min(minY, l); maxY = Math.max(maxY, h);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const cornerRect = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerRect);\n gl.bufferData(gl.ARRAY_BUFFER, RECT_CORNERS, gl.STATIC_DRAW);\n const cornerSeg = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.bufferData(gl.ARRAY_BUFFER, SEG_CORNERS, gl.STATIC_DRAW);\n const rectBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, rectBuf);\n gl.bufferData(gl.ARRAY_BUFFER, rects, gl.STATIC_DRAW);\n const wickBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, wickBuf);\n gl.bufferData(gl.ARRAY_BUFFER, wicks, gl.STATIC_DRAW);\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n this.buffers = [cornerRect, cornerSeg, rectBuf, wickBuf, colorBuf];\n\n this.bodyVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.bodyVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerRect);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, rectBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n\n this.wickVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.wickVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, wickBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n gl.bindVertexArray(null);\n\n this.uBody = uniformLocations(gl, this.progs.body, [...TRANSFORM_UNIFORMS]);\n this.uWick = uniformLocations(gl, this.progs.wick, [...TRANSFORM_UNIFORMS, \"uResolution\", \"uWidth\"]);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n\n gl.useProgram(this.progs.wick);\n setTransformUniforms(gl, this.uWick, state.x, state.y, this.xRef, this.yRef);\n gl.uniform2f(this.uWick.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uWick.uWidth!, this.wickWidth * state.dpr);\n gl.bindVertexArray(this.wickVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n\n gl.useProgram(this.progs.body);\n setTransformUniforms(gl, this.uBody, state.x, state.y, this.xRef, this.yRef);\n gl.bindVertexArray(this.bodyVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.bodyVao);\n this.gl.deleteVertexArray(this.wickVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n\nfunction toColor(input: string | Color): Color {\n return Array.isArray(input) ? (input as Color) : parseColor(input as string);\n}\n","export type RGB = [number, number, number];\nexport type ColormapName = \"viridis\" | \"plasma\" | \"coolwarm\" | \"grayscale\";\n\n// Coarse anchor points (perceptually-ordered) interpolated linearly.\nconst ANCHORS: Record<ColormapName, RGB[]> = {\n viridis: [\n [0.267, 0.005, 0.329], [0.283, 0.141, 0.458], [0.254, 0.265, 0.53],\n [0.207, 0.372, 0.553], [0.164, 0.471, 0.558], [0.128, 0.567, 0.551],\n [0.135, 0.659, 0.518], [0.267, 0.749, 0.441], [0.478, 0.821, 0.318],\n [0.741, 0.873, 0.15], [0.993, 0.906, 0.144],\n ],\n plasma: [\n [0.05, 0.03, 0.53], [0.29, 0.01, 0.63], [0.49, 0.01, 0.66],\n [0.66, 0.13, 0.59], [0.8, 0.28, 0.47], [0.9, 0.43, 0.35],\n [0.97, 0.6, 0.24], [0.99, 0.78, 0.15], [0.94, 0.98, 0.13],\n ],\n coolwarm: [\n [0.23, 0.3, 0.75], [0.55, 0.69, 0.98], [0.87, 0.87, 0.87],\n [0.96, 0.6, 0.48], [0.71, 0.02, 0.15],\n ],\n grayscale: [\n [0.05, 0.05, 0.05], [0.95, 0.95, 0.95],\n ],\n};\n\n/** Returns a `(t in 0..1) => RGB` sampler for the named colormap. */\nexport function colormap(name: ColormapName = \"viridis\"): (t: number) => RGB {\n const anchors = ANCHORS[name];\n const last = anchors.length - 1;\n return (t: number) => {\n const clamped = t <= 0 ? 0 : t >= 1 ? 1 : t;\n const pos = clamped * last;\n const i = Math.min(last - 1, Math.floor(pos));\n const f = pos - i;\n const a = anchors[i]!;\n const b = anchors[i + 1]!;\n return [a[0] + (b[0] - a[0]) * f, a[1] + (b[1] - a[1]) * f, a[2] + (b[2] - a[2]) * f];\n };\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface ContourOptions {\n /** Row-major grid values, length `cols * rows` (row 0 at the bottom). */\n values: ArrayLike<number>;\n cols: number;\n rows: number;\n extent: { x: Range; y: Range };\n /** Iso levels: an explicit list, or a count of evenly-spaced levels. */\n levels?: number[] | number;\n /** Single line color; if omitted, levels are colored by a colormap. */\n color?: string | Color;\n colormap?: ColormapName;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos;\nlayout(location = 1) in vec4 aColor;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() { vColor = aColor; gl_Position = vec4(dataToClip(aPos), 0.0, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor.rgb * vColor.a, vColor.a); }`;\n\n// Marching-squares: case → pairs of edges to connect (e0 bottom, e1 right, e2 top, e3 left).\nconst CASES: number[][][] = [\n [], [[3, 0]], [[0, 1]], [[3, 1]], [[1, 2]], [[3, 0], [1, 2]], [[0, 2]], [[3, 2]],\n [[2, 3]], [[2, 0]], [[0, 1], [2, 3]], [[2, 1]], [[1, 3]], [[1, 0]], [[0, 3]], [],\n];\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class ContourLayer implements Layer {\n readonly id: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private vertexCount: number;\n private xRef: number;\n private yRef: number;\n private ext: { x: Range; y: Range };\n\n constructor(gl: WebGL2RenderingContext, opts: ContourOptions) {\n this.id = `contour-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.yAxis = opts.yAxis ?? \"y\";\n this.ext = opts.extent;\n const { cols, rows, values } = opts;\n const [x0, x1] = opts.extent.x, [y0, y1] = opts.extent.y;\n this.xRef = x0; this.yRef = y0;\n\n let vmin = Infinity, vmax = -Infinity;\n for (let i = 0; i < values.length; i++) { const v = values[i]!; if (v < vmin) vmin = v; if (v > vmax) vmax = v; }\n const count = typeof opts.levels === \"number\" ? opts.levels : 8;\n const levels = Array.isArray(opts.levels)\n ? opts.levels\n : Array.from({ length: count }, (_, i) => vmin + ((vmax - vmin) * (i + 1)) / (count + 1));\n\n const cmap = colormap(opts.colormap ?? \"viridis\");\n const fixed = opts.color != null\n ? (Array.isArray(opts.color) ? (opts.color as Color) : parseColor(opts.color as string))\n : null;\n const gx = (c: number) => x0 + (c / (cols - 1)) * (x1 - x0) - this.xRef;\n const gy = (r: number) => y0 + (r / (rows - 1)) * (y1 - y0) - this.yRef;\n const at = (c: number, r: number) => values[r * cols + c]!;\n\n const data: number[] = [];\n const lspan = vmax - vmin || 1;\n for (let li = 0; li < levels.length; li++) {\n const L = levels[li]!;\n const col: Color = fixed ?? [...cmap((L - vmin) / lspan), 1] as Color;\n for (let r = 0; r < rows - 1; r++) {\n for (let c = 0; c < cols - 1; c++) {\n const v0 = at(c, r), v1 = at(c + 1, r), v2 = at(c + 1, r + 1), v3 = at(c, r + 1);\n const idx = (v0 >= L ? 1 : 0) | (v1 >= L ? 2 : 0) | (v2 >= L ? 4 : 0) | (v3 >= L ? 8 : 0);\n const segs = CASES[idx]!;\n if (segs.length === 0) continue;\n // Edge interpolation points (in offset data space).\n const lerp = (t: number, ax: number, ay: number, bx: number, by: number): [number, number] =>\n [ax + (bx - ax) * t, ay + (by - ay) * t];\n const edge = (e: number): [number, number] => {\n if (e === 0) return lerp((L - v0) / (v1 - v0 || 1e-9), gx(c), gy(r), gx(c + 1), gy(r));\n if (e === 1) return lerp((L - v1) / (v2 - v1 || 1e-9), gx(c + 1), gy(r), gx(c + 1), gy(r + 1));\n if (e === 2) return lerp((L - v2) / (v3 - v2 || 1e-9), gx(c + 1), gy(r + 1), gx(c), gy(r + 1));\n return lerp((L - v3) / (v0 - v3 || 1e-9), gx(c), gy(r + 1), gx(c), gy(r));\n };\n for (const [ea, eb] of segs) {\n const pa = edge(ea), pb = edge(eb);\n data.push(pa[0], pa[1], col[0], col[1], col[2], col[3]);\n data.push(pb[0], pb[1], col[0], col[1], col[2], col[3]);\n }\n }\n }\n }\n\n this.vertexCount = data.length / 6;\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 24, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 24, 8);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS]);\n }\n\n bounds() {\n return { x: this.ext.x, y: this.ext.y };\n }\n\n draw(state: DrawState): void {\n if (this.vertexCount === 0) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.LINES, 0, this.vertexCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\n/** A per-point error, given as one value for all points or an array. */\ntype ErrInput = ArrayLike<number> | number;\n\nexport interface ErrorBarOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Symmetric y error (half-height). Scalar or per-point. */\n yerr?: ErrInput;\n /** Asymmetric y error below/above `y` (overrides `yerr`). */\n yerrLow?: ErrInput;\n yerrHigh?: ErrInput;\n /** Symmetric x error (half-width). Scalar or per-point. */\n xerr?: ErrInput;\n color?: string | Color;\n /** Whisker/cap thickness in CSS px. Default 1.5. */\n width?: number;\n /** Cap length in CSS px (0 hides caps). Default 6. */\n capSize?: number;\n /** Draw I-beam whiskers. Default true. */\n whiskers?: boolean;\n /** Fill a shaded band between the low/high y bounds. Default false. */\n band?: boolean;\n /** Band fill opacity. Default 0.2. */\n bandOpacity?: number;\n name?: string;\n yAxis?: string;\n}\n\n// Data-space segment expanded to a pixel-thick rect (butt ends).\nconst SEG_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec4 aSeg; // (x0,y0,x1,y1) offset data space\nuniform vec2 uResolution;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nvoid main() {\n vec2 s0 = (dataToClip(aSeg.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aSeg.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n vec2 pos = mix(s0, s1, aCorner.x) + nrm * (aCorner.y * uWidth * 0.5);\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\n// Pixel-sized tick centered on a data point; orient 0 = horizontal, 1 = vertical.\nconst CAP_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit quad [-1,1]^2\nlayout(location = 1) in vec3 aCap; // (cx, cy, orient) offset data space\nuniform vec2 uResolution;\nuniform float uCapSize;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nvoid main() {\n vec2 c = (dataToClip(aCap.xy) * 0.5 + 0.5) * uResolution;\n vec2 h = aCap.z < 0.5 ? vec2(uCapSize * 0.5, uWidth * 0.5) : vec2(uWidth * 0.5, uCapSize * 0.5);\n vec2 pos = c + aCorner * h;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\n// Shaded band between the low/high envelope (triangle strip in data space).\nconst BAND_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos; // offset data space\n${TRANSFORM_GLSL}\nvoid main() { gl_Position = vec4(dataToClip(aPos), 0.0, 1.0); }`;\n\nconst SOLID_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(uColor.rgb * uColor.a, uColor.a); }`;\n\nconst SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\nconst QUAD_CORNERS = new Float32Array([-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1]);\n\ntype Key = \"seg\" | \"cap\" | \"band\";\nconst cache = new WeakMap<WebGL2RenderingContext, Record<Key, WebGLProgram>>();\nfunction programs(gl: WebGL2RenderingContext): Record<Key, WebGLProgram> {\n let p = cache.get(gl);\n if (!p) {\n p = {\n seg: createProgram(gl, SEG_VERT, SOLID_FRAG),\n cap: createProgram(gl, CAP_VERT, SOLID_FRAG),\n band: createProgram(gl, BAND_VERT, SOLID_FRAG),\n };\n cache.set(gl, p);\n }\n return p;\n}\n\nconst errAt = (e: ErrInput | undefined, i: number): number =>\n e == null ? 0 : typeof e === \"number\" ? e : (e[i] ?? 0);\n\nlet counter = 0;\n\nexport class ErrorBarLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private progs: Record<Key, WebGLProgram>;\n private segVao: WebGLVertexArrayObject;\n private capVao: WebGLVertexArrayObject;\n private bandVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uSeg: Record<string, WebGLUniformLocation | null>;\n private uCap: Record<string, WebGLUniformLocation | null>;\n private uBand: Record<string, WebGLUniformLocation | null>;\n private color: Color;\n private width: number;\n private capSize: number;\n private bandOpacity: number;\n private showWhiskers: boolean;\n private showBand: boolean;\n private segCount = 0;\n private capCount = 0;\n private bandVerts = 0;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: ErrorBarOptions) {\n this.id = `errorbar-${counter++}`;\n this.gl = gl;\n this.progs = programs(gl);\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.width = opts.width ?? 1.5;\n this.capSize = opts.capSize ?? 6;\n this.bandOpacity = opts.bandOpacity ?? 0.2;\n this.showBand = opts.band === true;\n this.showWhiskers = opts.whiskers ?? true;\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n\n const segs: number[] = []; // vec4 per whisker\n const caps: number[] = []; // vec3 per cap\n const lowPts: Array<[number, number]> = []; // for the band envelope\n const highPts: Array<[number, number]> = [];\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n\n const hasY = opts.yerr != null || opts.yerrLow != null || opts.yerrHigh != null;\n const hasX = opts.xerr != null;\n\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n const eyLo = opts.yerrLow != null ? errAt(opts.yerrLow, i) : errAt(opts.yerr, i);\n const eyHi = opts.yerrHigh != null ? errAt(opts.yerrHigh, i) : errAt(opts.yerr, i);\n const ex = errAt(opts.xerr, i);\n const yLo = y - eyLo, yHi = y + eyHi;\n const xLo = x - ex, xHi = x + ex;\n\n if (hasY) {\n segs.push(x - this.xRef, yLo - this.yRef, x - this.xRef, yHi - this.yRef);\n caps.push(x - this.xRef, yLo - this.yRef, 0, x - this.xRef, yHi - this.yRef, 0);\n }\n if (hasX) {\n segs.push(xLo - this.xRef, y - this.yRef, xHi - this.xRef, y - this.yRef);\n caps.push(xLo - this.xRef, y - this.yRef, 1, xHi - this.xRef, y - this.yRef, 1);\n }\n lowPts.push([x - this.xRef, yLo - this.yRef]);\n highPts.push([x - this.xRef, yHi - this.yRef]);\n\n minX = Math.min(minX, xLo); maxX = Math.max(maxX, xHi);\n minY = Math.min(minY, yLo); maxY = Math.max(maxY, yHi);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n this.segCount = segs.length / 4;\n this.capCount = this.capSize > 0 ? caps.length / 3 : 0;\n\n // Band as a triangle strip alternating high/low along x.\n const band: number[] = [];\n for (let i = 0; i < n; i++) {\n band.push(highPts[i]![0], highPts[i]![1], lowPts[i]![0], lowPts[i]![1]);\n }\n this.bandVerts = n * 2;\n\n const cornerSeg = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.bufferData(gl.ARRAY_BUFFER, SEG_CORNERS, gl.STATIC_DRAW);\n const cornerQuad = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerQuad);\n gl.bufferData(gl.ARRAY_BUFFER, QUAD_CORNERS, gl.STATIC_DRAW);\n\n const segBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(segs), gl.STATIC_DRAW);\n const capBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, capBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(caps), gl.STATIC_DRAW);\n const bandBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, bandBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(band), gl.STATIC_DRAW);\n this.buffers = [cornerSeg, cornerQuad, segBuf, capBuf, bandBuf];\n\n // Whisker VAO: unit segment + instanced vec4 endpoints.\n this.segVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.segVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n\n // Cap VAO: unit quad + instanced vec3 (center, orient).\n this.capVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.capVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerQuad);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, capBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n\n // Band VAO: raw triangle-strip positions.\n this.bandVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.bandVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, bandBuf);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n\n this.uSeg = uniformLocations(gl, this.progs.seg, [...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\"]);\n this.uCap = uniformLocations(gl, this.progs.cap, [...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uCapSize\", \"uWidth\"]);\n this.uBand = uniformLocations(gl, this.progs.band, [...TRANSFORM_UNIFORMS, \"uColor\"]);\n }\n\n bounds() {\n if (this.segCount === 0 && this.bandVerts === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n const gl = state.gl;\n const [r, g, b, a] = this.color;\n\n if (this.showBand && this.bandVerts >= 4) {\n gl.useProgram(this.progs.band);\n setTransformUniforms(gl, this.uBand, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uBand.uColor!, r, g, b, a * this.bandOpacity);\n gl.bindVertexArray(this.bandVao);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.bandVerts);\n gl.bindVertexArray(null);\n }\n\n if (this.showWhiskers && this.segCount > 0) {\n gl.useProgram(this.progs.seg);\n setTransformUniforms(gl, this.uSeg, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uSeg.uColor!, r, g, b, a);\n gl.uniform2f(this.uSeg.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uSeg.uWidth!, this.width * state.dpr);\n gl.bindVertexArray(this.segVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.segCount);\n gl.bindVertexArray(null);\n\n if (this.capCount > 0) {\n gl.useProgram(this.progs.cap);\n setTransformUniforms(gl, this.uCap, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uCap.uColor!, r, g, b, a);\n gl.uniform2f(this.uCap.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uCap.uCapSize!, this.capSize * state.dpr);\n gl.uniform1f(this.uCap.uWidth!, this.width * state.dpr);\n gl.bindVertexArray(this.capVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.capCount);\n gl.bindVertexArray(null);\n }\n }\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.segVao);\n this.gl.deleteVertexArray(this.capVao);\n this.gl.deleteVertexArray(this.bandVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface HeatmapOptions {\n /** Row-major grid values, length `cols * rows` (row 0 at the bottom). */\n values: ArrayLike<number>;\n cols: number;\n rows: number;\n /** Data-space extent the grid spans. */\n extent: { x: Range; y: Range };\n colormap?: ColormapName;\n /** Value range mapped to the colormap. Defaults to the data min/max. */\n domain?: Range;\n /** Bilinear filtering (default true) vs. hard cells. */\n smooth?: boolean;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos; // offset data space\nlayout(location = 1) in vec2 aUV;\n${TRANSFORM_GLSL}\nout vec2 vUV;\nvoid main() {\n vUV = aUV;\n gl_Position = vec4(dataToClip(aPos), 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vUV;\nuniform sampler2D uTex;\nout vec4 outColor;\nvoid main() {\n vec4 c = texture(uTex, vUV);\n outColor = vec4(c.rgb * c.a, c.a);\n}`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class HeatmapLayer implements Layer {\n readonly id: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private texture: WebGLTexture;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private xRef: number;\n private yRef: number;\n private ext: { x: Range; y: Range };\n\n constructor(gl: WebGL2RenderingContext, opts: HeatmapOptions) {\n this.id = `heatmap-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.yAxis = opts.yAxis ?? \"y\";\n this.ext = opts.extent;\n const [x0, x1] = opts.extent.x;\n const [y0, y1] = opts.extent.y;\n this.xRef = x0;\n this.yRef = y0;\n\n // Bake values into an RGBA texture via the colormap.\n const { cols, rows, values } = opts;\n const cmap = colormap(opts.colormap ?? \"viridis\");\n let lo = opts.domain?.[0] ?? Infinity;\n let hi = opts.domain?.[1] ?? -Infinity;\n if (!opts.domain) {\n for (let i = 0; i < values.length; i++) {\n const v = values[i]!;\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n const span = hi - lo || 1;\n const pixels = new Uint8Array(cols * rows * 4);\n for (let i = 0; i < cols * rows; i++) {\n const [r, g, b] = cmap((values[i]! - lo) / span);\n pixels[i * 4] = Math.round(r * 255);\n pixels[i * 4 + 1] = Math.round(g * 255);\n pixels[i * 4 + 2] = Math.round(b * 255);\n pixels[i * 4 + 3] = 255;\n }\n\n const texture = gl.createTexture()!;\n this.texture = texture;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, cols, rows, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n const filter = opts.smooth === false ? gl.NEAREST : gl.LINEAR;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n // Quad over the extent: (posX, posY, u, v). v=0 at y0 (row 0 bottom).\n const data = new Float32Array([\n x0 - this.xRef, y0 - this.yRef, 0, 0,\n x1 - this.xRef, y0 - this.yRef, 1, 0,\n x1 - this.xRef, y1 - this.yRef, 1, 1,\n x0 - this.xRef, y0 - this.yRef, 0, 0,\n x1 - this.xRef, y1 - this.yRef, 1, 1,\n x0 - this.xRef, y1 - this.yRef, 0, 1,\n ]);\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uTex\"]);\n }\n\n bounds() {\n return { x: this.ext.x, y: this.ext.y };\n }\n\n draw(state: DrawState): void {\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.uniform1i(this.uniforms.uTex!, 0);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n this.gl.deleteTexture(this.texture);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface HexbinOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Hex radius in data units. Defaults to ~1/30 of the x-extent. */\n radius?: number;\n colormap?: ColormapName;\n /** Count range mapped to the colormap. Defaults to [1, maxCount]. */\n domain?: Range;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit hexagon (data-unit offsets)\nlayout(location = 1) in vec2 aCenter; // offset data space\nlayout(location = 2) in vec4 aColor;\nuniform float uRadius;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vColor = aColor;\n gl_Position = vec4(dataToClip(aCenter + aCorner * uRadius), 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor.rgb * vColor.a, vColor.a); }`;\n\n// Pointy-top unit hexagon as 6 triangles (fan around the center).\nconst HEX = (() => {\n const verts: number[] = [];\n const pt = (a: number): [number, number] => [Math.cos(a), Math.sin(a)];\n for (let i = 0; i < 6; i++) {\n const a0 = (Math.PI / 3) * i + Math.PI / 6;\n const a1 = (Math.PI / 3) * (i + 1) + Math.PI / 6;\n const [x0, y0] = pt(a0), [x1, y1] = pt(a1);\n verts.push(0, 0, x0, y0, x1, y1);\n }\n return new Float32Array(verts);\n})();\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class HexbinLayer implements Layer {\n readonly id: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private radius: number;\n private cellCount: number;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: HexbinOptions) {\n this.id = `hexbin-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.yAxis = opts.yAxis ?? \"y\";\n\n const n = Math.min(opts.x.length, opts.y.length);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n const r = opts.radius ?? ((maxX - minX) / 30 || 1);\n this.radius = r;\n const dx = r * 2 * Math.sin(Math.PI / 3);\n const dy = r * 1.5;\n\n // Aggregate points into hex cells (simplified d3-hexbin binning).\n const cells = new Map<string, { cx: number; cy: number; count: number }>();\n let maxCount = 1;\n for (let i = 0; i < n; i++) {\n const px = opts.x[i]!, py = opts.y[i]!;\n const pj = Math.round(py / dy);\n const pi = Math.round(px / dx - (pj & 1) / 2);\n const key = `${pi},${pj}`;\n let cell = cells.get(key);\n if (!cell) {\n cell = { cx: (pi + (pj & 1) / 2) * dx, cy: pj * dy, count: 0 };\n cells.set(key, cell);\n }\n cell.count++;\n if (cell.count > maxCount) maxCount = cell.count;\n }\n\n this.cellCount = cells.size;\n this.xRef = minX; this.yRef = minY;\n const centers = new Float32Array(this.cellCount * 2);\n const colors = new Float32Array(this.cellCount * 4);\n const cmap = colormap(opts.colormap ?? \"viridis\");\n const lo = opts.domain?.[0] ?? 1;\n const hi = opts.domain?.[1] ?? maxCount;\n const span = hi - lo || 1;\n let k = 0;\n for (const cell of cells.values()) {\n centers[k * 2] = cell.cx - this.xRef;\n centers[k * 2 + 1] = cell.cy - this.yRef;\n const [cr, cg, cb] = cmap((cell.count - lo) / span);\n colors[k * 4] = cr; colors[k * 4 + 1] = cg; colors[k * 4 + 2] = cb; colors[k * 4 + 3] = 1;\n k++;\n }\n\n const vao = gl.createVertexArray()!;\n this.vao = vao;\n gl.bindVertexArray(vao);\n const hexBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, hexBuf);\n gl.bufferData(gl.ARRAY_BUFFER, HEX, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n const centerBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, centerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, centers, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n gl.bindVertexArray(null);\n this.buffers = [hexBuf, centerBuf, colorBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uRadius\"]);\n }\n\n bounds() {\n if (this.cellCount === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.cellCount === 0) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform1f(this.uniforms.uRadius!, this.radius);\n gl.bindVertexArray(this.vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 18, this.cellCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","/**\n * Pure geometry helpers for {@link LineLayer}, split out so the tricky bits —\n * min/max decimation index selection and screen-space join extrusion — can be\n * unit-tested without a WebGL context. The GLSL in `line.ts` mirrors\n * {@link computeJoin} exactly; keep the two in sync.\n */\n\n/**\n * Min/max decimation: reduce the visible index window `[i0, i1]` to at most\n * `2*cols + 2` representative indices. Each pixel column keeps the sample with\n * the lowest and highest y (emitted in index order so the envelope shape is\n * preserved), bracketed by the window endpoints so the line reaches the edges.\n */\nexport function decimateIndices(\n ys: ArrayLike<number>,\n i0: number,\n i1: number,\n cols: number,\n): number[] {\n const out: number[] = [i0];\n const visN = i1 - i0;\n for (let b = 0; b < cols; b++) {\n const lo = i0 + Math.floor((visN * b) / cols);\n const hi = i0 + Math.floor((visN * (b + 1)) / cols);\n if (hi <= lo) continue;\n let iMin = lo, iMax = lo;\n for (let i = lo; i < hi; i++) {\n if (ys[i]! < ys[iMin]!) iMin = i;\n if (ys[i]! > ys[iMax]!) iMax = i;\n }\n // Emit the two extremes in index order to preserve the envelope shape.\n if (iMin < iMax) out.push(iMin, iMax);\n else out.push(iMax, iMin);\n }\n out.push(i1);\n return out;\n}\n\n/** Screen-space geometry for one line join, all coordinates in device pixels. */\nexport interface JoinGeom {\n /** End corner of the incoming segment on the outer side of the turn. */\n ax: number;\n ay: number;\n /** Start corner of the outgoing segment on the outer side of the turn. */\n bx: number;\n by: number;\n /** Outer tip: the miter point, or the bevel midpoint when clamped/bevelled. */\n apexX: number;\n apexY: number;\n /** False when the joint is degenerate (repeated point or collinear). */\n ok: boolean;\n}\n\nconst DEGENERATE: JoinGeom = { ax: 0, ay: 0, bx: 0, by: 0, apexX: 0, apexY: 0, ok: false };\n\n/**\n * Extrude the outer wedge that fills the notch two butt-capped segments leave at\n * a joint `p0` between neighbours `prev` and `next`. With `miter` the tip reaches\n * the true miter point unless its length exceeds `miterLimit` (then it collapses\n * to the bevel midpoint); with `miter` false it is always the bevel midpoint.\n *\n * `hw` is the true half line-width in device pixels. This mirrors the join\n * vertex shader in `line.ts` — edit both together.\n */\nexport function computeJoin(\n prevX: number, prevY: number,\n p0X: number, p0Y: number,\n nextX: number, nextY: number,\n hw: number,\n miter: boolean,\n miterLimit: number,\n): JoinGeom {\n let inx = p0X - prevX, iny = p0Y - prevY;\n let outx = nextX - p0X, outy = nextY - p0Y;\n const inl = Math.hypot(inx, iny), outl = Math.hypot(outx, outy);\n if (inl < 1e-6 || outl < 1e-6) return DEGENERATE;\n inx /= inl; iny /= inl; outx /= outl; outy /= outl;\n\n const inNx = -iny, inNy = inx;\n const outNx = -outy, outNy = outx;\n const cross = inx * outy - iny * outx;\n if (Math.abs(cross) < 1e-6) return DEGENERATE; // collinear — no visible notch\n\n // Left-turn (cross>0): outer side is to the right of the left normals, so flip.\n const outerSign = cross > 0 ? -1 : 1;\n const ax = p0X + inNx * hw * outerSign, ay = p0Y + inNy * hw * outerSign;\n const bx = p0X + outNx * hw * outerSign, by = p0Y + outNy * hw * outerSign;\n\n let apexX = (ax + bx) * 0.5, apexY = (ay + by) * 0.5; // bevel default\n if (miter) {\n let mnx = inNx + outNx, mny = inNy + outNy;\n const ml = Math.hypot(mnx, mny);\n if (ml > 1e-6) {\n mnx /= ml; mny /= ml;\n const denom = mnx * outNx + mny * outNy;\n if (denom > 1e-3) {\n const miterLen = 1 / denom;\n if (miterLen <= miterLimit) {\n apexX = p0X + mnx * outerSign * hw * miterLen;\n apexY = p0Y + mny * outerSign * hw * miterLen;\n }\n }\n }\n }\n return { ax, ay, bx, by, apexX, apexY, ok: true };\n}\n","/**\n * GPU-side min/max decimation via transform feedback.\n *\n * The CPU path in `line.ts` (see {@link decimateIndices}) rebuilds the per-column\n * min/max envelope in a JS loop whenever the view changes — O(visible points) on\n * the main thread, which janks when panning multi-million-point series. This\n * moves that reduction onto the GPU: the full series lives in an RG32F texture,\n * and a rasterizer-discarded vertex pass computes each column's extremes with\n * `texelFetch` and captures the result straight into the draw buffer via\n * transform feedback — no per-point CPU work and no readback.\n *\n * It is used only for large series (the CPU path is already cheap for small\n * ones) and falls back to the CPU path on any capability gap or GL error, so the\n * rendered envelope is identical either way.\n */\n\nconst DEC_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nuniform sampler2D uPoints;\nuniform int uTexW;\nuniform int uI0;\nuniform int uI1;\nuniform int uCols;\nuniform int uMaxIter; // per-column iteration cap; stride-samples beyond it\nout vec2 vOut;\n\nvec2 fetchPoint(int i) {\n return texelFetch(uPoints, ivec2(i % uTexW, i / uTexW), 0).xy;\n}\n\nvoid main() {\n int v = gl_VertexID;\n int last = 2 * uCols + 1;\n int idx;\n if (v == 0) {\n idx = uI0; // left endpoint, so the line reaches the edge\n } else if (v >= last) {\n idx = uI1; // right endpoint\n } else {\n int col = (v - 1) / 2;\n int which = (v - 1) - col * 2; // 0 => min-index extreme, 1 => max-index extreme\n // Float division avoids int32 overflow of visN*col for huge series.\n float fvisN = float(uI1 - uI0);\n int lo = uI0 + int(floor(fvisN * float(col) / float(uCols)));\n int hi = uI0 + int(floor(fvisN * float(col + 1) / float(uCols)));\n if (hi <= lo) {\n idx = lo;\n } else {\n int stride = 1;\n int span = hi - lo;\n if (span > uMaxIter) stride = (span + uMaxIter - 1) / uMaxIter;\n int iMin = lo, iMax = lo;\n float yMin = fetchPoint(lo).y, yMax = yMin;\n for (int i = lo; i < hi; i += stride) {\n float y = fetchPoint(i).y;\n if (y < yMin) { yMin = y; iMin = i; }\n if (y > yMax) { yMax = y; iMax = i; }\n }\n // Emit in index order (matches decimateIndices) to preserve envelope shape.\n idx = (which == 0) ? min(iMin, iMax) : max(iMin, iMax);\n }\n }\n vOut = fetchPoint(idx);\n gl_Position = vec4(0.0, 0.0, 0.0, 1.0); // rasterizer-discarded\n}`;\n\nconst DEC_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nout vec4 o;\nvoid main() { o = vec4(0.0); }`;\n\n/** Per-column iteration budget in the reduction loop before stride-sampling. */\nconst MAX_ITER = 4096;\n\nfunction compile(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)!;\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(sh);\n gl.deleteShader(sh);\n throw new Error(`Decimation shader compile error:\\n${log}`);\n }\n return sh;\n}\n\ninterface DecProgram {\n program: WebGLProgram;\n u: Record<string, WebGLUniformLocation | null>;\n}\n\n// Transform-feedback programs need their varyings declared before linking, so\n// they can't go through the shared createProgram(). Cache one per context.\nconst programCache = new WeakMap<WebGL2RenderingContext, DecProgram | null>();\n\nfunction getDecProgram(gl: WebGL2RenderingContext): DecProgram | null {\n if (programCache.has(gl)) return programCache.get(gl)!;\n let result: DecProgram | null = null;\n try {\n const vs = compile(gl, gl.VERTEX_SHADER, DEC_VERT);\n const fs = compile(gl, gl.FRAGMENT_SHADER, DEC_FRAG);\n const program = gl.createProgram()!;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.transformFeedbackVaryings(program, [\"vOut\"], gl.INTERLEAVED_ATTRIBS);\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n } else {\n const u: Record<string, WebGLUniformLocation | null> = {};\n for (const name of [\"uPoints\", \"uTexW\", \"uI0\", \"uI1\", \"uCols\", \"uMaxIter\"]) {\n u[name] = gl.getUniformLocation(program, name);\n }\n result = { program, u };\n }\n } catch {\n result = null;\n }\n programCache.set(gl, result);\n return result;\n}\n\n/**\n * Holds one series' points in a GPU texture and runs the transform-feedback\n * min/max reduction. Owned by a LineLayer; only instantiated for series large\n * enough that CPU decimation would jank.\n */\nexport class GpuDecimator {\n /** False when this context can't support the GPU path (fall back to CPU). */\n readonly supported: boolean;\n private gl: WebGL2RenderingContext;\n private prog: DecProgram | null;\n private tex: WebGLTexture | null = null;\n private tf: WebGLTransformFeedback | null = null;\n private emptyVao: WebGLVertexArrayObject | null = null;\n private texW = 0;\n private decCapacity = -1; // point capacity currently allocated in the draw buffer\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.prog = getDecProgram(gl);\n this.supported = this.prog != null;\n }\n\n /**\n * (Re)upload the series into the point texture. `data` is interleaved\n * (x-xRef, y-yRef) float32, exactly as the draw buffer stores it. Returns\n * false and disables the GPU path if the texture can't be allocated.\n */\n setPoints(data: Float32Array, n: number): boolean {\n if (!this.supported || n === 0) return this.supported;\n const gl = this.gl;\n const maxTex = gl.getParameter(gl.MAX_TEXTURE_SIZE) as number;\n const texW = Math.min(maxTex, Math.max(1, Math.ceil(Math.sqrt(n))));\n const texH = Math.ceil(n / texW);\n if (texH > maxTex) return false; // series too large to texture — CPU handles it\n this.texW = texW;\n\n const packed = data.length >= texW * texH * 2 ? data : new Float32Array(texW * texH * 2);\n if (packed !== data) packed.set(data.subarray(0, n * 2));\n\n try {\n if (!this.tex) this.tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32F, texW, texH, 0, gl.RG, gl.FLOAT, packed);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n } catch {\n return false;\n }\n if (!this.tf) this.tf = gl.createTransformFeedback();\n if (!this.emptyVao) this.emptyVao = gl.createVertexArray();\n return true;\n }\n\n /**\n * Run the reduction for the visible window `[i0, i1]` into `decBuf`, matching\n * the CPU envelope layout: left endpoint, `cols` min/max pairs, right endpoint.\n * Returns the emitted point count, or null if the GPU path can't run this call.\n */\n run(i0: number, i1: number, cols: number, decBuf: WebGLBuffer): number | null {\n if (!this.supported || !this.tex || !this.prog) return null;\n const gl = this.gl;\n const outCount = 2 * cols + 2;\n\n // Grow the draw buffer to hold the envelope (interleaved vec2 float32).\n if (this.decCapacity < outCount) {\n gl.bindBuffer(gl.ARRAY_BUFFER, decBuf);\n gl.bufferData(gl.ARRAY_BUFFER, outCount * 2 * 4, gl.DYNAMIC_COPY);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this.decCapacity = outCount;\n }\n\n const { program, u } = this.prog;\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.tex);\n gl.uniform1i(u.uPoints!, 0);\n gl.uniform1i(u.uTexW!, this.texW);\n gl.uniform1i(u.uI0!, i0);\n gl.uniform1i(u.uI1!, i1);\n gl.uniform1i(u.uCols!, cols);\n gl.uniform1i(u.uMaxIter!, MAX_ITER);\n\n gl.bindVertexArray(this.emptyVao);\n gl.enable(gl.RASTERIZER_DISCARD);\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, this.tf);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, decBuf);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, outCount);\n gl.endTransformFeedback();\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n gl.disable(gl.RASTERIZER_DISCARD);\n gl.bindVertexArray(null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return outCount;\n }\n\n dispose(): void {\n const gl = this.gl;\n if (this.tex) gl.deleteTexture(this.tex);\n if (this.tf) gl.deleteTransformFeedback(this.tf);\n if (this.emptyVao) gl.deleteVertexArray(this.emptyVao);\n this.tex = null; this.tf = null; this.emptyVao = null;\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { AxisFrame } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport { decimateIndices } from \"./line-util.js\";\nimport { GpuDecimator } from \"./gpu-decimate.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\n/** Above this point count, decimation runs on the GPU (below, CPU is cheaper). */\nconst GPU_DECIMATE_MIN = 200_000;\n\n/** How adjacent segments meet at a vertex. */\nexport type LineJoin = \"round\" | \"miter\" | \"bevel\" | \"butt\";\n\nexport interface LineOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n color?: string | Color;\n /** Line width in CSS pixels (real thickness via GPU triangle expansion). */\n width?: number;\n name?: string;\n yAxis?: string;\n step?: \"before\" | \"after\" | \"center\";\n /**\n * How segments meet at each vertex:\n * - `round` (default) — round caps and joins via an SDF; no seams.\n * - `miter` — sharp mitered corners, clamped to {@link LineOptions.miterLimit}.\n * - `bevel` — corners cut flat.\n * - `butt` — flat ends with no join fill (segments may gap at sharp angles).\n */\n join?: LineJoin;\n /**\n * For `join: \"miter\"`, the max ratio of miter length to half line-width before\n * a corner falls back to a bevel (prevents spikes at very sharp angles).\n * Default 4.\n */\n miterLimit?: number;\n /**\n * Min/max decimate very large series to ~2 points per pixel column when\n * zoomed out (preserves peaks). Requires monotonic x; auto-detected. Default true.\n */\n decimate?: boolean;\n}\n\n// Each segment is an instanced quad, extended and round-capped in the fragment\n// shader via a signed-distance test so joins between segments never gap.\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec2 aP0;\nlayout(location = 2) in vec2 aP1;\nuniform vec2 uResolution;\nuniform float uWidth;\nuniform float uRound;\n${TRANSFORM_GLSL}\nout vec2 vPix;\nout vec2 vS0;\nout vec2 vS1;\nvoid main() {\n vec2 s0 = (dataToClip(aP0) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aP1) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float hw = uWidth * 0.5 + 1.5; // half width + AA margin\n float ext = uRound > 0.5 ? hw : 0.0; // extend for round caps\n vec2 endpoint = mix(s0, s1, aCorner.x);\n vec2 outward = (aCorner.x < 0.5 ? -dir : dir) * ext;\n vec2 pos = endpoint + outward + nrm * (aCorner.y * hw);\n vPix = pos; vS0 = s0; vS1 = s1;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vPix;\nin vec2 vS0;\nin vec2 vS1;\nuniform vec4 uColor;\nuniform float uWidth;\nuniform float uRound;\nout vec4 outColor;\nvoid main() {\n vec2 pa = vPix - vS0;\n vec2 ba = vS1 - vS0;\n float bb = dot(ba, ba);\n float t = bb > 1e-6 ? dot(pa, ba) / bb : 0.0;\n float d;\n if (uRound > 0.5) {\n d = length(pa - ba * clamp(t, 0.0, 1.0)); // round caps/joins\n } else {\n if (t < 0.0 || t > 1.0) discard; // butt caps\n d = length(pa - ba * t);\n }\n float hw = uWidth * 0.5;\n float alpha = 1.0 - smoothstep(hw - 1.0, hw + 1.0, d);\n if (alpha <= 0.0) discard;\n outColor = vec4(uColor.rgb * uColor.a, uColor.a) * alpha;\n}`;\n\n// Miter/bevel join fill: one instanced wedge per interior vertex, filling the\n// notch two butt-capped segments leave on the outer side of the turn. The\n// geometry mirrors computeJoin() in line-util.ts — keep the two in sync.\nconst JOIN_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPrev;\nlayout(location = 1) in vec2 aP0;\nlayout(location = 2) in vec2 aNext;\nuniform vec2 uResolution;\nuniform float uWidth;\nuniform float uMiter; // >0.5 => miter, else bevel\nuniform float uMiterLimit;\n${TRANSFORM_GLSL}\nout vec2 vPix;\nflat out vec2 vE0;\nflat out vec2 vE1;\nflat out vec2 vInner;\nvoid main() {\n vec2 sp = (dataToClip(aPrev) * 0.5 + 0.5) * uResolution;\n vec2 s0 = (dataToClip(aP0) * 0.5 + 0.5) * uResolution;\n vec2 sn = (dataToClip(aNext) * 0.5 + 0.5) * uResolution;\n vec2 din = s0 - sp;\n vec2 dout = sn - s0;\n float inl = length(din), outl = length(dout);\n vec2 inN = vec2(0.0), outN = vec2(0.0);\n float crs = 0.0;\n bool ok = inl > 1e-6 && outl > 1e-6;\n if (ok) {\n din /= inl; dout /= outl;\n inN = vec2(-din.y, din.x);\n outN = vec2(-dout.y, dout.x);\n crs = din.x * dout.y - din.y * dout.x;\n ok = abs(crs) > 1e-6; // collinear => no notch\n }\n if (!ok) { // degenerate: cull the wedge\n vE0 = vec2(0.0); vE1 = vec2(0.0); vInner = vec2(0.0); vPix = vec2(0.0);\n gl_Position = vec4(2.0, 2.0, 2.0, 1.0);\n return;\n }\n float hw = uWidth * 0.5;\n float outerSign = crs > 0.0 ? -1.0 : 1.0;\n vec2 A = s0 + inN * hw * outerSign;\n vec2 B = s0 + outN * hw * outerSign;\n vec2 apex = 0.5 * (A + B); // bevel midpoint\n if (uMiter > 0.5) {\n vec2 mN = inN + outN;\n float ml = length(mN);\n if (ml > 1e-6) {\n mN /= ml;\n float denom = dot(mN, outN);\n if (denom > 1e-3) {\n float miterLen = 1.0 / denom;\n if (miterLen <= uMiterLimit) apex = s0 + mN * outerSign * hw * miterLen;\n }\n }\n }\n int vid = gl_VertexID;\n vec2 pos;\n if (vid == 0 || vid == 3) pos = s0;\n else if (vid == 1) pos = A;\n else if (vid == 2 || vid == 4) pos = apex;\n else pos = B; // vid == 5\n if (vid < 3) { vE0 = A; vE1 = apex; } // triangle [s0, A, apex]\n else { vE0 = apex; vE1 = B; } // triangle [s0, apex, B]\n vInner = s0;\n vPix = pos;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst JOIN_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vPix;\nflat in vec2 vE0;\nflat in vec2 vE1;\nflat in vec2 vInner;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() {\n vec2 e = vE1 - vE0;\n float el = length(e);\n if (el < 1e-6) discard;\n vec2 n = vec2(-e.y, e.x) / el;\n float sideInner = dot(vInner - vE0, n) >= 0.0 ? 1.0 : -1.0;\n float d = dot(vPix - vE0, n) * sideInner; // >0 inside the outer edge\n float alpha = clamp(d + 0.5, 0.0, 1.0);\n if (alpha <= 0.0) discard;\n outColor = vec4(uColor.rgb * uColor.a, uColor.a) * alpha;\n}`;\n\nconst CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nconst joinProgramCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getJoinProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = joinProgramCache.get(gl);\n if (!p) { p = createProgram(gl, JOIN_VERT, JOIN_FRAG); joinProgramCache.set(gl, p); }\n return p;\n}\n\nfunction stepExpand(\n xs: ArrayLike<number>, ys: ArrayLike<number>, n: number,\n mode: \"before\" | \"after\" | \"center\",\n): { xs: Float64Array; ys: Float64Array } {\n const ox: number[] = [], oy: number[] = [];\n for (let i = 0; i < n - 1; i++) {\n const x0 = xs[i]!, y0 = ys[i]!, x1 = xs[i + 1]!, y1 = ys[i + 1]!;\n if (mode === \"center\") { const xm = (x0 + x1) / 2; ox.push(x0, xm, xm); oy.push(y0, y0, y1); }\n else if (mode === \"after\") { ox.push(x0, x1); oy.push(y0, y0); }\n else { ox.push(x0, x0); oy.push(y0, y1); }\n }\n ox.push(xs[n - 1]!); oy.push(ys[n - 1]!);\n return { xs: Float64Array.from(ox), ys: Float64Array.from(oy) };\n}\n\nfunction upperBound(a: Float64Array, v: number): number {\n let lo = 0, hi = a.length;\n while (lo < hi) { const m = (lo + hi) >> 1; if (a[m]! <= v) lo = m + 1; else hi = m; }\n return lo;\n}\n\nlet counter = 0;\n\nexport class LineLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private joinProgram: WebGLProgram;\n private fullVao: WebGLVertexArrayObject;\n private decVao: WebGLVertexArrayObject;\n private joinFullVao: WebGLVertexArrayObject;\n private joinDecVao: WebGLVertexArrayObject;\n private cornerBuf: WebGLBuffer;\n private posBuf: WebGLBuffer;\n private decBuf: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private joinUniforms: Record<string, WebGLUniformLocation | null>;\n private count: number;\n private color: Color;\n private width: number;\n private round: boolean;\n private joinStyle: LineJoin;\n private miterLimit: number;\n private decimateOn: boolean;\n private monotonic: boolean;\n private gpuDec: GpuDecimator | null = null;\n private step?: \"before\" | \"after\" | \"center\";\n private xRef = 0;\n private yRef = 0;\n private xs: Float64Array;\n private ys: Float64Array;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n private decKey = \"\";\n private decSegments = 0;\n\n constructor(gl: WebGL2RenderingContext, opts: LineOptions) {\n this.id = `line-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.joinProgram = getJoinProgram(gl);\n this.width = opts.width ?? 1.5;\n this.joinStyle = opts.join ?? \"round\";\n this.round = this.joinStyle === \"round\";\n this.miterLimit = opts.miterLimit ?? 4;\n this.decimateOn = opts.decimate !== false;\n this.step = opts.step;\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n\n let n = Math.min(opts.x.length, opts.y.length);\n let xs: ArrayLike<number> = opts.x, ys: ArrayLike<number> = opts.y;\n if (opts.step && n >= 2) { const e = stepExpand(opts.x, opts.y, n, opts.step); xs = e.xs; ys = e.ys; n = e.xs.length; }\n\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? xs[0]! : 0;\n this.yRef = n > 0 ? ys[0]! : 0;\n const data = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, mono = true;\n for (let i = 0; i < n; i++) {\n const x = xs[i]!, y = ys[i]!;\n this.xs[i] = x; this.ys[i] = y;\n data[i * 2] = x - this.xRef; data[i * 2 + 1] = y - this.yRef;\n if (i > 0 && x < xs[i - 1]!) mono = false;\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n this.count = n; this.monotonic = mono;\n\n this.cornerBuf = gl.createBuffer()!;\n this.posBuf = gl.createBuffer()!;\n this.decBuf = gl.createBuffer()!;\n this.fullVao = gl.createVertexArray()!;\n this.decVao = gl.createVertexArray()!;\n this.joinFullVao = gl.createVertexArray()!;\n this.joinDecVao = gl.createVertexArray()!;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.cornerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.posBuf);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n\n this.configureVao(this.fullVao, this.posBuf);\n this.configureVao(this.decVao, this.decBuf);\n this.configureJoinVao(this.joinFullVao, this.posBuf);\n this.configureJoinVao(this.joinDecVao, this.decBuf);\n\n this.uniforms = uniformLocations(gl, this.program, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\", \"uRound\",\n ]);\n this.joinUniforms = uniformLocations(gl, this.joinProgram, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\", \"uMiter\", \"uMiterLimit\",\n ]);\n\n this.syncGpu(data, n);\n }\n\n // Keep the GPU decimation texture in sync for large series; disable it (fall\n // back to CPU decimation) if the context can't support the path.\n private syncGpu(data: Float32Array, n: number): void {\n if (!this.decimateOn || n < GPU_DECIMATE_MIN) { this.disposeGpu(); return; }\n if (!this.gpuDec) {\n const dec = new GpuDecimator(this.gl);\n if (!dec.supported) return;\n this.gpuDec = dec;\n }\n if (!this.gpuDec.setPoints(data, n)) this.disposeGpu();\n }\n\n private disposeGpu(): void {\n if (this.gpuDec) { this.gpuDec.dispose(); this.gpuDec = null; }\n }\n\n private configureVao(vao: WebGLVertexArrayObject, pointBuf: WebGLBuffer): void {\n const gl = this.gl;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.cornerBuf);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, pointBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 8, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 2, gl.FLOAT, false, 8, 8);\n gl.vertexAttribDivisor(2, 1);\n gl.bindVertexArray(null);\n }\n\n // Join instances read three consecutive points (prev, p0, next) from the same\n // buffer via overlapping attribute offsets; instance i covers vertex i+1.\n private configureJoinVao(vao: WebGLVertexArrayObject, pointBuf: WebGLBuffer): void {\n const gl = this.gl;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, pointBuf);\n for (let loc = 0; loc < 3; loc++) {\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 8, loc * 8);\n gl.vertexAttribDivisor(loc, 1);\n }\n gl.bindVertexArray(null);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n nearestByX(x: number): { x: number; y: number; index: number } | null {\n if (this.count === 0) return null;\n let best = 0, bestDist = Infinity;\n for (let i = 0; i < this.count; i++) {\n const d = Math.abs(this.xs[i]! - x);\n if (d < bestDist) { bestDist = d; best = i; }\n }\n return { x: this.xs[best]!, y: this.ys[best]!, index: best };\n }\n\n /** Replace the series data and re-upload the GPU buffer (for streaming). */\n setData(x: ArrayLike<number>, y: ArrayLike<number>): void {\n let n = Math.min(x.length, y.length);\n let xs: ArrayLike<number> = x, ys: ArrayLike<number> = y;\n if (this.step && n >= 2) { const e = stepExpand(x, y, n, this.step); xs = e.xs; ys = e.ys; n = e.xs.length; }\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? xs[0]! : 0;\n this.yRef = n > 0 ? ys[0]! : 0;\n const data = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, mono = true;\n for (let i = 0; i < n; i++) {\n const vx = xs[i]!, vy = ys[i]!;\n this.xs[i] = vx; this.ys[i] = vy;\n data[i * 2] = vx - this.xRef; data[i * 2 + 1] = vy - this.yRef;\n if (i > 0 && vx < xs[i - 1]!) mono = false;\n if (vx < minX) minX = vx; if (vx > maxX) maxX = vx;\n if (vy < minY) minY = vy; if (vy > maxY) maxY = vy;\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n this.count = n; this.monotonic = mono; this.decKey = \"\";\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.posBuf);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, data, this.gl.DYNAMIC_DRAW);\n this.syncGpu(data, n);\n }\n\n /**\n * Rebuild the min/max-decimated buffer for the visible x-window if it changed.\n * Returns the segment count to draw from `decVao`, or null to draw everything.\n */\n private decimate(x: AxisFrame, cols: number): number | null {\n if (!this.decimateOn || !this.monotonic || this.count < 4 * cols) return null;\n const target = Math.max(2, cols * 2);\n // Visible index window (with a one-sample margin so lines reach the edges).\n let i0 = upperBound(this.xs, x.lo) - 1;\n let i1 = upperBound(this.xs, x.hi);\n i0 = Math.max(0, i0); i1 = Math.min(this.count - 1, i1);\n const visN = i1 - i0;\n if (visN <= target * 1.5) return null;\n\n const key = `${i0}:${i1}:${target}`;\n if (key === this.decKey) return this.decSegments;\n\n // GPU path: reduce the envelope with transform feedback, no main-thread work.\n if (this.gpuDec) {\n const outCount = this.gpuDec.run(i0, i1, cols, this.decBuf);\n if (outCount != null) {\n this.decKey = key;\n this.decSegments = outCount - 1;\n return this.decSegments;\n }\n this.disposeGpu(); // GPU path failed once — stop trying, use CPU below.\n }\n\n this.decKey = key;\n const indices = decimateIndices(this.ys, i0, i1, cols);\n const out = new Float32Array(indices.length * 2);\n for (let k = 0; k < indices.length; k++) {\n const i = indices[k]!;\n out[k * 2] = this.xs[i]! - this.xRef;\n out[k * 2 + 1] = this.ys[i]! - this.yRef;\n }\n\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.decBuf);\n gl.bufferData(gl.ARRAY_BUFFER, out, gl.DYNAMIC_DRAW);\n this.decSegments = indices.length - 1;\n return this.decSegments;\n }\n\n draw(state: DrawState): void {\n if (this.count < 2) return;\n const gl = state.gl;\n const decSegs = this.decimate(state.x, Math.max(1, Math.round(state.pixelWidth)));\n const decimated = decSegs != null;\n const vao = decimated ? this.decVao : this.fullVao;\n const segments = decimated ? decSegs! : this.count - 1;\n if (segments < 1) return;\n const points = segments + 1;\n\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.uniform2f(this.uniforms.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uniforms.uWidth!, this.width * state.dpr);\n // round joins use the SDF cap extension; miter/bevel/butt draw plain rectangles.\n gl.uniform1f(this.uniforms.uRound!, this.round ? 1 : 0);\n gl.bindVertexArray(vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, segments);\n gl.bindVertexArray(null);\n\n // Miter/bevel joins fill the outer notch left between the butt rectangles.\n if ((this.joinStyle === \"miter\" || this.joinStyle === \"bevel\") && points >= 3) {\n gl.useProgram(this.joinProgram);\n setTransformUniforms(gl, this.joinUniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.joinUniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.uniform2f(this.joinUniforms.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.joinUniforms.uWidth!, this.width * state.dpr);\n gl.uniform1f(this.joinUniforms.uMiter!, this.joinStyle === \"miter\" ? 1 : 0);\n gl.uniform1f(this.joinUniforms.uMiterLimit!, this.miterLimit);\n gl.bindVertexArray(decimated ? this.joinDecVao : this.joinFullVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, points - 2);\n gl.bindVertexArray(null);\n }\n }\n\n dispose(): void {\n const gl = this.gl;\n this.disposeGpu();\n gl.deleteVertexArray(this.fullVao);\n gl.deleteVertexArray(this.decVao);\n gl.deleteVertexArray(this.joinFullVao);\n gl.deleteVertexArray(this.joinDecVao);\n gl.deleteBuffer(this.cornerBuf);\n gl.deleteBuffer(this.posBuf);\n gl.deleteBuffer(this.decBuf);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface QuiverOptions {\n /** Arrow anchor positions (data space). */\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Vector components at each anchor. */\n u: ArrayLike<number>;\n v: ArrayLike<number>;\n /** Multiplier applied to (u,v) in data units. Default auto-fits the field. */\n scale?: number;\n color?: string | Color;\n /** Shaft thickness in CSS px. Default 1.5. */\n width?: number;\n /** Arrowhead length in CSS px. Default 9. */\n headSize?: number;\n /** Color each arrow by a value (default: its magnitude) through a colormap. */\n colorBy?: {\n values?: ArrayLike<number>;\n colormap?: ColormapName;\n domain?: Range;\n };\n name?: string;\n yAxis?: string;\n}\n\n// Shaft: base->tip segment, pixel-thick.\nconst SHAFT_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec4 aArrow; // (bx,by,tx,ty) offset data space\nlayout(location = 2) in vec4 aColor;\nuniform vec2 uResolution;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vec2 s0 = (dataToClip(aArrow.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aArrow.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n vec2 pos = mix(s0, s1, aCorner.x) + nrm * (aCorner.y * uWidth * 0.5);\n vColor = aColor;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\n// Head: a screen-space triangle at the tip, pointing along the arrow.\nconst HEAD_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 1) in vec4 aArrow; // (bx,by,tx,ty) offset data space\nlayout(location = 2) in vec4 aColor;\nuniform vec2 uResolution;\nuniform float uHeadSize;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vec2 s0 = (dataToClip(aArrow.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aArrow.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float w = uHeadSize * 0.6;\n vec2 pos;\n if (gl_VertexID == 0) pos = s1; // tip\n else if (gl_VertexID == 1) pos = s1 - dir * uHeadSize + nrm * w; // back-left\n else pos = s1 - dir * uHeadSize - nrm * w; // back-right\n vColor = aColor;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nuniform vec4 uColor;\nuniform float uUseVertexColor;\nout vec4 outColor;\nvoid main() {\n vec4 c = uUseVertexColor > 0.5 ? vColor : uColor;\n outColor = vec4(c.rgb * c.a, c.a);\n}`;\n\nconst SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\n\ntype Key = \"shaft\" | \"head\";\nconst cache = new WeakMap<WebGL2RenderingContext, Record<Key, WebGLProgram>>();\nfunction programs(gl: WebGL2RenderingContext): Record<Key, WebGLProgram> {\n let p = cache.get(gl);\n if (!p) {\n p = { shaft: createProgram(gl, SHAFT_VERT, FRAG), head: createProgram(gl, HEAD_VERT, FRAG) };\n cache.set(gl, p);\n }\n return p;\n}\n\nlet counter = 0;\n\nexport class QuiverLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private progs: Record<Key, WebGLProgram>;\n private shaftVao: WebGLVertexArrayObject;\n private headVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uShaft: Record<string, WebGLUniformLocation | null>;\n private uHead: Record<string, WebGLUniformLocation | null>;\n private color: Color;\n private width: number;\n private headSize: number;\n private useVertexColor: boolean;\n private count: number;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: QuiverOptions) {\n this.id = `quiver-${counter++}`;\n this.gl = gl;\n this.progs = programs(gl);\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.width = opts.width ?? 1.5;\n this.headSize = opts.headSize ?? 9;\n this.useVertexColor = opts.colorBy != null;\n\n const n = Math.min(opts.x.length, opts.y.length, opts.u.length, opts.v.length);\n this.count = n;\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n\n // Auto scale so the largest arrow spans ~90% of a nominal grid cell.\n let maxMag = 0;\n for (let i = 0; i < n; i++) maxMag = Math.max(maxMag, Math.hypot(opts.u[i]!, opts.v[i]!));\n let scale = opts.scale;\n if (scale == null) {\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n minX = Math.min(minX, opts.x[i]!); maxX = Math.max(maxX, opts.x[i]!);\n minY = Math.min(minY, opts.y[i]!); maxY = Math.max(maxY, opts.y[i]!);\n }\n const diag = Math.hypot(maxX - minX, maxY - minY) || 1;\n const cell = diag / Math.max(1, Math.sqrt(n));\n scale = maxMag > 0 ? (0.9 * cell) / maxMag : 1;\n }\n\n const arrows = new Float32Array(n * 4);\n const colors = new Float32Array(n * 4);\n const cmap = colormap(opts.colorBy?.colormap ?? \"viridis\");\n const vals = opts.colorBy?.values;\n let lo = opts.colorBy?.domain?.[0] ?? Infinity;\n let hi = opts.colorBy?.domain?.[1] ?? -Infinity;\n if (this.useVertexColor && !opts.colorBy?.domain) {\n for (let i = 0; i < n; i++) {\n const v = vals ? vals[i]! : Math.hypot(opts.u[i]!, opts.v[i]!);\n lo = Math.min(lo, v); hi = Math.max(hi, v);\n }\n }\n const span = (hi - lo) || 1;\n\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n const tx = x + opts.u[i]! * scale, ty = y + opts.v[i]! * scale;\n arrows[i * 4] = x - this.xRef; arrows[i * 4 + 1] = y - this.yRef;\n arrows[i * 4 + 2] = tx - this.xRef; arrows[i * 4 + 3] = ty - this.yRef;\n if (this.useVertexColor) {\n const v = vals ? vals[i]! : Math.hypot(opts.u[i]!, opts.v[i]!);\n const [r, g, b] = cmap((v - lo) / span);\n colors[i * 4] = r; colors[i * 4 + 1] = g; colors[i * 4 + 2] = b; colors[i * 4 + 3] = 1;\n }\n minX = Math.min(minX, x, tx); maxX = Math.max(maxX, x, tx);\n minY = Math.min(minY, y, ty); maxY = Math.max(maxY, y, ty);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const cornerBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, SEG_CORNERS, gl.STATIC_DRAW);\n const arrowBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, arrowBuf);\n gl.bufferData(gl.ARRAY_BUFFER, arrows, gl.STATIC_DRAW);\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n this.buffers = [cornerBuf, arrowBuf, colorBuf];\n\n this.shaftVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.shaftVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuf);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n this.bindInstanceAttribs(arrowBuf, colorBuf);\n gl.bindVertexArray(null);\n\n // Head VAO uses gl_VertexID for the triangle, only the instanced attribs.\n this.headVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.headVao);\n this.bindInstanceAttribs(arrowBuf, colorBuf);\n gl.bindVertexArray(null);\n\n this.uShaft = uniformLocations(gl, this.progs.shaft, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\", \"uUseVertexColor\",\n ]);\n this.uHead = uniformLocations(gl, this.progs.head, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uHeadSize\", \"uUseVertexColor\",\n ]);\n }\n\n private bindInstanceAttribs(arrowBuf: WebGLBuffer, colorBuf: WebGLBuffer): void {\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, arrowBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n const [r, g, b, a] = this.color;\n const uvc = this.useVertexColor ? 1 : 0;\n\n gl.useProgram(this.progs.shaft);\n setTransformUniforms(gl, this.uShaft, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uShaft.uColor!, r, g, b, a);\n gl.uniform2f(this.uShaft.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uShaft.uWidth!, this.width * state.dpr);\n gl.uniform1f(this.uShaft.uUseVertexColor!, uvc);\n gl.bindVertexArray(this.shaftVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n\n gl.useProgram(this.progs.head);\n setTransformUniforms(gl, this.uHead, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uHead.uColor!, r, g, b, a);\n gl.uniform2f(this.uHead.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uHead.uHeadSize!, this.headSize * state.dpr);\n gl.uniform1f(this.uHead.uUseVertexColor!, uvc);\n gl.bindVertexArray(this.headVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 3, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.shaftVao);\n this.gl.deleteVertexArray(this.headVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface ScatterOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n color?: string | Color;\n /** Marker diameter in CSS pixels. */\n size?: number;\n name?: string;\n yAxis?: string;\n /** Color each point by a value through a colormap. */\n colorBy?: {\n values: ArrayLike<number>;\n colormap?: ColormapName;\n /** Value range mapped to [0,1]. Defaults to the data min/max. */\n domain?: Range;\n };\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit quad [-1,1]^2\nlayout(location = 1) in vec2 aPos; // point (offset data space)\nlayout(location = 2) in vec4 aColor; // per-point color (used if uUseVertexColor>0.5)\nuniform vec2 uResolution;\nuniform float uSize; // radius in device px\n${TRANSFORM_GLSL}\nout vec2 vLocal;\nout vec4 vColor;\nvoid main() {\n vec2 center = (dataToClip(aPos) * 0.5 + 0.5) * uResolution;\n vec2 pos = center + aCorner * uSize;\n vLocal = aCorner;\n vColor = aColor;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vLocal;\nin vec4 vColor;\nuniform vec4 uColor;\nuniform float uUseVertexColor;\nout vec4 outColor;\nvoid main() {\n float r = length(vLocal);\n if (r > 1.0) discard;\n float alpha = smoothstep(1.0, 1.0 - 0.15, r); // soft edge\n vec4 c = uUseVertexColor > 0.5 ? vColor : uColor;\n outColor = vec4(c.rgb * c.a * alpha, c.a * alpha);\n}`;\n\nconst CORNERS = new Float32Array([-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1]);\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class ScatterLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private count: number;\n private size: number;\n private color: Color;\n private useVertexColor: boolean;\n private xRef = 0;\n private yRef = 0;\n private xs: Float64Array;\n private ys: Float64Array;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: ScatterOptions) {\n this.id = `scatter-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.size = opts.size ?? 5;\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.useVertexColor = opts.colorBy != null;\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.count = n;\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n const pos = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n this.xs[i] = x; this.ys[i] = y;\n pos[i * 2] = x - this.xRef;\n pos[i * 2 + 1] = y - this.yRef;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n // Per-point colors (optional).\n const colors = new Float32Array(n * 4);\n if (opts.colorBy) {\n const vals = opts.colorBy.values;\n const cmap = colormap(opts.colorBy.colormap ?? \"viridis\");\n let lo = opts.colorBy.domain?.[0] ?? Infinity;\n let hi = opts.colorBy.domain?.[1] ?? -Infinity;\n if (!opts.colorBy.domain) {\n for (let i = 0; i < n; i++) {\n const v = vals[i]!;\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n const span = hi - lo || 1;\n for (let i = 0; i < n; i++) {\n const [r, g, b] = cmap((vals[i]! - lo) / span);\n colors[i * 4] = r; colors[i * 4 + 1] = g; colors[i * 4 + 2] = b; colors[i * 4 + 3] = 1;\n }\n }\n\n const vao = gl.createVertexArray()!;\n this.vao = vao;\n gl.bindVertexArray(vao);\n\n const cornerBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n const posBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, posBuf);\n gl.bufferData(gl.ARRAY_BUFFER, pos, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n\n gl.bindVertexArray(null);\n this.buffers = [cornerBuf, posBuf, colorBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uSize\", \"uUseVertexColor\",\n ]);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n nearestByX(x: number): { x: number; y: number; index: number } | null {\n if (this.count === 0) return null;\n let best = 0, bestDist = Infinity;\n for (let i = 0; i < this.count; i++) {\n const d = Math.abs(this.xs[i]! - x);\n if (d < bestDist) { bestDist = d; best = i; }\n }\n return { x: this.xs[best]!, y: this.ys[best]!, index: best };\n }\n\n /** Replace point positions and re-upload (for streaming). Keeps uniform color. */\n setData(x: ArrayLike<number>, y: ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n this.count = n;\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? x[0]! : 0;\n this.yRef = n > 0 ? y[0]! : 0;\n const pos = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const vx = x[i]!, vy = y[i]!;\n this.xs[i] = vx; this.ys[i] = vy;\n pos[i * 2] = vx - this.xRef; pos[i * 2 + 1] = vy - this.yRef;\n if (vx < minX) minX = vx; if (vx > maxX) maxX = vx;\n if (vy < minY) minY = vy; if (vy > maxY) maxY = vy;\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n this.useVertexColor = false;\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffers[1]!);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, pos, this.gl.DYNAMIC_DRAW);\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.uniform2f(this.uniforms.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uniforms.uSize!, (this.size / 2) * state.dpr);\n gl.uniform1f(this.uniforms.uUseVertexColor!, this.useVertexColor ? 1 : 0);\n gl.bindVertexArray(this.vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface StemOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Where stems start. Default 0. */\n baseline?: number;\n color?: string | Color;\n /** Stem thickness in CSS px. Default 1.5. */\n width?: number;\n /** Tip marker diameter in CSS px (0 hides). Default 6. */\n markerSize?: number;\n name?: string;\n yAxis?: string;\n}\n\n// Vertical stem: a data-space segment from (x, base) to (x, y), pixel-thick.\nconst STEM_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec4 aSeg; // (x0,y0,x1,y1) offset data space\nuniform vec2 uResolution;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nvoid main() {\n vec2 s0 = (dataToClip(aSeg.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aSeg.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n vec2 pos = mix(s0, s1, aCorner.x) + nrm * (aCorner.y * uWidth * 0.5);\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst MARKER_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit quad [-1,1]^2\nlayout(location = 1) in vec2 aPos; // tip point (offset data space)\nuniform vec2 uResolution;\nuniform float uSize; // radius in device px\n${TRANSFORM_GLSL}\nout vec2 vLocal;\nvoid main() {\n vec2 c = (dataToClip(aPos) * 0.5 + 0.5) * uResolution;\n vLocal = aCorner;\n vec2 pos = c + aCorner * uSize;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst SOLID_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(uColor.rgb * uColor.a, uColor.a); }`;\n\nconst DISC_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vLocal;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() {\n float r = length(vLocal);\n if (r > 1.0) discard;\n float alpha = smoothstep(1.0, 1.0 - 0.15, r);\n outColor = vec4(uColor.rgb * uColor.a * alpha, uColor.a * alpha);\n}`;\n\nconst SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\nconst QUAD_CORNERS = new Float32Array([-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1]);\n\ntype Key = \"stem\" | \"marker\";\nconst cache = new WeakMap<WebGL2RenderingContext, Record<Key, WebGLProgram>>();\nfunction programs(gl: WebGL2RenderingContext): Record<Key, WebGLProgram> {\n let p = cache.get(gl);\n if (!p) {\n p = { stem: createProgram(gl, STEM_VERT, SOLID_FRAG), marker: createProgram(gl, MARKER_VERT, DISC_FRAG) };\n cache.set(gl, p);\n }\n return p;\n}\n\nlet counter = 0;\n\nexport class StemLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private progs: Record<Key, WebGLProgram>;\n private stemVao: WebGLVertexArrayObject;\n private markerVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uStem: Record<string, WebGLUniformLocation | null>;\n private uMarker: Record<string, WebGLUniformLocation | null>;\n private color: Color;\n private width: number;\n private markerSize: number;\n private count: number;\n private baseline: number;\n private xRef = 0;\n private yRef = 0;\n private xs: Float64Array;\n private ys: Float64Array;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: StemOptions) {\n this.id = `stem-${counter++}`;\n this.gl = gl;\n this.progs = programs(gl);\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.width = opts.width ?? 1.5;\n this.markerSize = opts.markerSize ?? 6;\n this.baseline = opts.baseline ?? 0;\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.count = n;\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n\n const segs = new Float32Array(n * 4);\n const tips = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity;\n let minY = Math.min(this.baseline, Infinity), maxY = Math.max(this.baseline, -Infinity);\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n this.xs[i] = x; this.ys[i] = y;\n segs[i * 4] = x - this.xRef; segs[i * 4 + 1] = this.baseline - this.yRef;\n segs[i * 4 + 2] = x - this.xRef; segs[i * 4 + 3] = y - this.yRef;\n tips[i * 2] = x - this.xRef; tips[i * 2 + 1] = y - this.yRef;\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const cornerSeg = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.bufferData(gl.ARRAY_BUFFER, SEG_CORNERS, gl.STATIC_DRAW);\n const cornerQuad = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerQuad);\n gl.bufferData(gl.ARRAY_BUFFER, QUAD_CORNERS, gl.STATIC_DRAW);\n const segBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.bufferData(gl.ARRAY_BUFFER, segs, gl.STATIC_DRAW);\n const tipBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, tipBuf);\n gl.bufferData(gl.ARRAY_BUFFER, tips, gl.STATIC_DRAW);\n this.buffers = [cornerSeg, cornerQuad, segBuf, tipBuf];\n\n this.stemVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.stemVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n\n this.markerVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.markerVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerQuad);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, tipBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindVertexArray(null);\n\n this.uStem = uniformLocations(gl, this.progs.stem, [...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\"]);\n this.uMarker = uniformLocations(gl, this.progs.marker, [...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uSize\"]);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n nearestByX(x: number): { x: number; y: number; index: number } | null {\n if (this.count === 0) return null;\n let best = 0, bestDist = Infinity;\n for (let i = 0; i < this.count; i++) {\n const d = Math.abs(this.xs[i]! - x);\n if (d < bestDist) { bestDist = d; best = i; }\n }\n return { x: this.xs[best]!, y: this.ys[best]!, index: best };\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n const [r, g, b, a] = this.color;\n\n gl.useProgram(this.progs.stem);\n setTransformUniforms(gl, this.uStem, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uStem.uColor!, r, g, b, a);\n gl.uniform2f(this.uStem.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uStem.uWidth!, this.width * state.dpr);\n gl.bindVertexArray(this.stemVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n\n if (this.markerSize > 0) {\n gl.useProgram(this.progs.marker);\n setTransformUniforms(gl, this.uMarker, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uMarker.uColor!, r, g, b, a);\n gl.uniform2f(this.uMarker.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uMarker.uSize!, (this.markerSize / 2) * state.dpr);\n gl.bindVertexArray(this.markerVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n }\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.stemVao);\n this.gl.deleteVertexArray(this.markerVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import type { Scale } from \"../scales/scale.js\";\nimport type { Tick } from \"../types.js\";\n\n/** Pixel geometry of the plot, in CSS pixels. The plot region excludes margins. */\nexport interface Layout {\n cssWidth: number;\n cssHeight: number;\n margin: { top: number; right: number; bottom: number; left: number };\n}\n\nexport interface PlotRegion {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport function plotRegion(layout: Layout): PlotRegion {\n const { margin } = layout;\n return {\n left: margin.left,\n top: margin.top,\n width: Math.max(0, layout.cssWidth - margin.left - margin.right),\n height: Math.max(0, layout.cssHeight - margin.top - margin.bottom),\n };\n}\n\nexport interface Theme {\n axis: string;\n grid: string;\n gridMinor: string;\n text: string;\n font: string;\n}\n\nexport const lightTheme: Theme = {\n axis: \"#334155\",\n grid: \"rgba(100,116,139,0.18)\",\n gridMinor: \"rgba(100,116,139,0.08)\",\n text: \"#475569\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n};\n\nexport const darkTheme: Theme = {\n axis: \"#cbd5e1\",\n grid: \"rgba(148,163,184,0.16)\",\n gridMinor: \"rgba(148,163,184,0.07)\",\n text: \"#94a3b8\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n};\n\nexport function pxX(region: PlotRegion, t: number): number {\n return region.left + t * region.width;\n}\nexport function pxY(region: PlotRegion, t: number): number {\n // t is normalized bottom->top; screen y grows downward.\n return region.top + (1 - t) * region.height;\n}\n\n/** Draw vertical (x) and horizontal (y) grid lines for the given ticks. */\nexport function drawGrid(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n scaleX: Scale,\n scaleY: Scale,\n ticksX: Tick[],\n ticksY: Tick[],\n theme: Theme,\n): void {\n ctx.save();\n ctx.lineWidth = 1;\n for (const t of ticksX) {\n if (!t.grid) continue;\n const x = Math.round(pxX(region, scaleX.norm(t.value))) + 0.5;\n ctx.strokeStyle = t.minor ? theme.gridMinor : theme.grid;\n ctx.beginPath();\n ctx.moveTo(x, region.top);\n ctx.lineTo(x, region.top + region.height);\n ctx.stroke();\n }\n for (const t of ticksY) {\n if (!t.grid) continue;\n const y = Math.round(pxY(region, scaleY.norm(t.value))) + 0.5;\n ctx.strokeStyle = t.minor ? theme.gridMinor : theme.grid;\n ctx.beginPath();\n ctx.moveTo(region.left, y);\n ctx.lineTo(region.left + region.width, y);\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/** Draw the bottom (x) axis line, ticks, labels, and optional title. */\nexport function drawXAxis(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n scaleX: Scale,\n ticksX: Tick[],\n theme: Theme,\n title?: string,\n): void {\n ctx.save();\n ctx.strokeStyle = theme.axis;\n ctx.fillStyle = theme.text;\n ctx.font = theme.font;\n ctx.lineWidth = 1;\n const bottom = region.top + region.height;\n\n ctx.beginPath();\n ctx.moveTo(region.left, bottom + 0.5);\n ctx.lineTo(region.left + region.width, bottom + 0.5);\n ctx.stroke();\n\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n for (const t of ticksX) {\n const x = Math.round(pxX(region, scaleX.norm(t.value))) + 0.5;\n const len = t.minor ? 3 : 5;\n ctx.beginPath();\n ctx.moveTo(x, bottom);\n ctx.lineTo(x, bottom + len);\n ctx.stroke();\n if (t.label) ctx.fillText(t.label, x, bottom + len + 3);\n }\n\n if (title) {\n ctx.textBaseline = \"bottom\";\n ctx.fillText(title, region.left + region.width / 2, bottom + 34);\n }\n ctx.restore();\n}\n\nexport interface YAxisDraw {\n /** Pixel x-position of the axis line. */\n x: number;\n side: \"left\" | \"right\";\n title?: string;\n /** Optional color override (secondary axes often match their series). */\n color?: string;\n /** Pixel x-position for the rotated title. */\n titleX?: number;\n}\n\n/** Draw one vertical (y) axis line, ticks, labels, and optional title. */\nexport function drawYAxis(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n scaleY: Scale,\n ticksY: Tick[],\n theme: Theme,\n opts: YAxisDraw,\n): void {\n ctx.save();\n const color = opts.color ?? theme.axis;\n ctx.strokeStyle = color;\n ctx.fillStyle = opts.color ?? theme.text;\n ctx.font = theme.font;\n ctx.lineWidth = 1;\n\n const ax = Math.round(opts.x) + 0.5;\n const dir = opts.side === \"left\" ? -1 : 1;\n\n ctx.beginPath();\n ctx.moveTo(ax, region.top);\n ctx.lineTo(ax, region.top + region.height);\n ctx.stroke();\n\n ctx.textAlign = opts.side === \"left\" ? \"right\" : \"left\";\n ctx.textBaseline = \"middle\";\n for (const t of ticksY) {\n const y = Math.round(pxY(region, scaleY.norm(t.value))) + 0.5;\n const len = t.minor ? 3 : 5;\n ctx.beginPath();\n ctx.moveTo(ax, y);\n ctx.lineTo(ax + dir * len, y);\n ctx.stroke();\n if (t.label) ctx.fillText(t.label, ax + dir * (len + 4), y);\n }\n\n if (opts.title) {\n ctx.save();\n const tx = opts.titleX ?? (opts.side === \"left\" ? 12 : region.left + region.width + 36);\n ctx.translate(tx, region.top + region.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.textBaseline = opts.side === \"left\" ? \"top\" : \"bottom\";\n ctx.fillText(opts.title, 0, 0);\n ctx.restore();\n }\n ctx.restore();\n}\n\n/** Draw a vertical crosshair line at pixel x (hover). */\nexport function drawCrosshair(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n px: number,\n theme: Theme,\n): void {\n ctx.save();\n ctx.strokeStyle = theme.text;\n ctx.globalAlpha = 0.4;\n ctx.setLineDash([3, 3]);\n ctx.lineWidth = 1;\n const x = Math.round(px) + 0.5;\n ctx.beginPath();\n ctx.moveTo(x, region.top);\n ctx.lineTo(x, region.top + region.height);\n ctx.stroke();\n ctx.restore();\n}\n\n/** Draw a filled marker (hover point highlight). */\nexport function drawMarker(\n ctx: CanvasRenderingContext2D,\n px: number,\n py: number,\n color: string,\n): void {\n ctx.save();\n ctx.fillStyle = color;\n ctx.strokeStyle = \"#ffffff\";\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.arc(px, py, 4, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n}\n","import { autoTicks, defaultFormat } from \"../axes/ticks.js\";\nimport type { Range, Tick } from \"../types.js\";\n\n/**\n * A scale maps data-space values to normalized [0,1] and back, and knows how to\n * generate its own \"nice\" ticks + default label format. `log` tells layers to\n * apply a log10 transform on the GPU.\n */\nexport interface Scale {\n readonly type: string;\n readonly log: boolean;\n domain: Range;\n norm(value: number): number;\n invert(t: number): number;\n /** Auto ticks appropriate for this scale type. */\n ticks(target?: number): Tick[];\n /** Default label formatter for a tick value. */\n formatTick(value: number): string;\n}\n\nexport class LinearScale implements Scale {\n readonly type = \"linear\";\n readonly log = false;\n domain: Range;\n constructor(domain: Range = [0, 1]) {\n this.domain = domain;\n }\n norm(value: number): number {\n const [a, b] = this.domain;\n return b === a ? 0 : (value - a) / (b - a);\n }\n invert(t: number): number {\n const [a, b] = this.domain;\n return a + t * (b - a);\n }\n ticks(target = 6): Tick[] {\n return autoTicks(this.domain[0], this.domain[1], target);\n }\n formatTick(value: number): string {\n return defaultFormat(value);\n }\n}\n\nexport class LogScale implements Scale {\n readonly type = \"log\";\n readonly log = true;\n domain: Range;\n constructor(domain: Range = [1, 1000]) {\n this.domain = LogScale.sanitize(domain);\n }\n private static sanitize(d: Range): Range {\n // Log requires strictly positive bounds.\n const lo = d[0] > 0 ? d[0] : 1e-9;\n const hi = d[1] > lo ? d[1] : lo * 10;\n return [lo, hi];\n }\n private get la() {\n return Math.log10(this.domain[0]);\n }\n private get lb() {\n return Math.log10(this.domain[1]);\n }\n norm(value: number): number {\n if (value <= 0) return 0;\n return (Math.log10(value) - this.la) / (this.lb - this.la);\n }\n invert(t: number): number {\n return Math.pow(10, this.la + t * (this.lb - this.la));\n }\n ticks(): Tick[] {\n const [a, b] = this.domain;\n const lo = Math.floor(Math.log10(a));\n const hi = Math.ceil(Math.log10(b));\n const ticks: Tick[] = [];\n for (let e = lo; e <= hi; e++) {\n const base = Math.pow(10, e);\n ticks.push({ value: base });\n for (let m = 2; m <= 9; m++) ticks.push({ value: m * base, minor: true, grid: false });\n }\n return ticks;\n }\n formatTick(value: number): string {\n const e = Math.round(Math.log10(value));\n if (e <= -4 || e >= 5) return `1e${e}`;\n return defaultFormat(value);\n }\n}\n\n// Candidate time steps in milliseconds, coarse→fine chosen by target count.\nconst SECOND = 1000, MINUTE = 60_000, HOUR = 3_600_000, DAY = 86_400_000;\nconst TIME_STEPS = [\n SECOND, 5 * SECOND, 15 * SECOND, 30 * SECOND,\n MINUTE, 5 * MINUTE, 15 * MINUTE, 30 * MINUTE,\n HOUR, 3 * HOUR, 6 * HOUR, 12 * HOUR,\n DAY, 2 * DAY, 7 * DAY, 30 * DAY, 90 * DAY, 365 * DAY,\n];\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n}\n\n/** Linear over epoch-millisecond values, with calendar-aware ticks/labels. */\nexport class TimeScale implements Scale {\n readonly type = \"time\";\n readonly log = false;\n domain: Range;\n constructor(domain: Range = [0, DAY]) {\n this.domain = domain;\n }\n norm(value: number): number {\n const [a, b] = this.domain;\n return b === a ? 0 : (value - a) / (b - a);\n }\n invert(t: number): number {\n const [a, b] = this.domain;\n return a + t * (b - a);\n }\n private chooseStep(target: number): number {\n const ideal = (this.domain[1] - this.domain[0]) / target;\n for (const s of TIME_STEPS) if (s >= ideal) return s;\n return TIME_STEPS[TIME_STEPS.length - 1]!;\n }\n ticks(target = 6): Tick[] {\n const [a, b] = this.domain;\n if (!isFinite(a) || !isFinite(b) || a === b) return [];\n const step = this.chooseStep(target);\n const start = Math.ceil(a / step) * step;\n const ticks: Tick[] = [];\n for (let i = 0; i < 1000; i++) {\n const v = start + i * step;\n if (v > b) break;\n ticks.push({ value: v });\n }\n return ticks;\n }\n formatTick(value: number): string {\n const span = this.domain[1] - this.domain[0];\n const d = new Date(value);\n if (span < DAY) return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n if (span < 90 * DAY) return `${d.getMonth() + 1}/${d.getDate()}`;\n return `${d.getFullYear()}`;\n }\n}\n\nexport type ScaleType = \"linear\" | \"log\" | \"time\";\n\nexport function makeScale(type: ScaleType, domain?: Range): Scale {\n switch (type) {\n case \"linear\":\n return new LinearScale(domain);\n case \"log\":\n return new LogScale(domain);\n case \"time\":\n return new TimeScale(domain);\n default:\n throw new Error(`Unknown scale type: ${type as string}`);\n }\n}\n","import type { InteractionMode } from \"../types.js\";\n\n/** The subset of Plot the toolbar drives. Kept minimal to avoid an import cycle. */\nexport interface ToolbarHost {\n setMode(mode: InteractionMode): void;\n getMode(): InteractionMode;\n home(): void;\n onModeChange(cb: (mode: InteractionMode) => void): void;\n}\n\nexport interface ToolbarTheme {\n bg: string;\n fg: string;\n border: string;\n activeBg: string;\n activeFg: string;\n hoverBg: string;\n}\n\nconst lightToolbar: ToolbarTheme = {\n bg: \"rgba(255,255,255,0.9)\",\n fg: \"#475569\",\n border: \"rgba(100,116,139,0.25)\",\n activeBg: \"#3b82f6\",\n activeFg: \"#ffffff\",\n hoverBg: \"rgba(100,116,139,0.12)\",\n};\n\nconst darkToolbar: ToolbarTheme = {\n bg: \"rgba(15,23,42,0.85)\",\n fg: \"#cbd5e1\",\n border: \"rgba(148,163,184,0.25)\",\n activeBg: \"#3b82f6\",\n activeFg: \"#ffffff\",\n hoverBg: \"rgba(148,163,184,0.15)\",\n};\n\n// 16x16 SVG icons, currentColor-driven so they inherit button color.\nconst ICONS = {\n home: `<path d=\"M2 7.5 8 2l6 5.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 7v6.5h3.2V10h1.6v3.5H12V7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n pan: `<path d=\"M8 1.5v13M1.5 8h13M8 1.5 6 3.5M8 1.5l2 2M8 14.5l-2-2M8 14.5l2-2M1.5 8l2-2M1.5 8l2 2M14.5 8l-2-2M14.5 8l-2 2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n box: `<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-dasharray=\"2.4 2\"/><circle cx=\"8\" cy=\"8\" r=\"1.4\" fill=\"currentColor\"/>`,\n boxX: `<path d=\"M1.5 8h13M3.5 5.5 1.5 8l2 2.5M12.5 5.5 14.5 8l-2 2.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4.5\" y=\"3\" width=\"7\" height=\"10\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-dasharray=\"2 1.8\"/>`,\n boxY: `<path d=\"M8 1.5v13M5.5 3.5 8 1.5l2.5 2M5.5 12.5 8 14.5l2.5-2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"3\" y=\"4.5\" width=\"10\" height=\"7\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-dasharray=\"2 1.8\"/>`,\n};\n\ninterface Btn {\n key: string;\n title: string;\n icon: string;\n mode?: InteractionMode;\n action?: () => void;\n}\n\n/** Build a floating toolbar in `container` and wire it to the plot host. */\nexport function createToolbar(\n container: HTMLElement,\n host: ToolbarHost,\n dark: boolean,\n): { element: HTMLElement; destroy: () => void } {\n const t = dark ? darkToolbar : lightToolbar;\n\n const bar = document.createElement(\"div\");\n Object.assign(bar.style, {\n position: \"absolute\",\n top: \"8px\",\n right: \"8px\",\n zIndex: \"3\",\n display: \"flex\",\n gap: \"2px\",\n padding: \"3px\",\n borderRadius: \"8px\",\n background: t.bg,\n border: `1px solid ${t.border}`,\n backdropFilter: \"blur(6px)\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.15)\",\n } as CSSStyleDeclaration);\n\n const buttons: Btn[] = [\n { key: \"home\", title: \"Reset view (Home)\", icon: ICONS.home, action: () => host.home() },\n { key: \"pan\", title: \"Pan\", icon: ICONS.pan, mode: \"pan\" },\n { key: \"box\", title: \"Box zoom\", icon: ICONS.box, mode: \"box\" },\n { key: \"box-x\", title: \"Zoom X only\", icon: ICONS.boxX, mode: \"box-x\" },\n { key: \"box-y\", title: \"Zoom Y only\", icon: ICONS.boxY, mode: \"box-y\" },\n ];\n\n const modeButtons = new Map<InteractionMode, HTMLButtonElement>();\n\n for (const b of buttons) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.title = b.title;\n btn.setAttribute(\"aria-label\", b.title);\n btn.innerHTML = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">${b.icon}</svg>`;\n Object.assign(btn.style, {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"26px\",\n height: \"26px\",\n padding: \"0\",\n border: \"none\",\n borderRadius: \"6px\",\n background: \"transparent\",\n color: t.fg,\n cursor: \"pointer\",\n transition: \"background 0.12s, color 0.12s\",\n } as CSSStyleDeclaration);\n\n btn.addEventListener(\"mouseenter\", () => {\n if (btn.dataset.active !== \"true\") btn.style.background = t.hoverBg;\n });\n btn.addEventListener(\"mouseleave\", () => {\n if (btn.dataset.active !== \"true\") btn.style.background = \"transparent\";\n });\n btn.addEventListener(\"click\", () => {\n if (b.action) b.action();\n if (b.mode) host.setMode(b.mode);\n });\n\n if (b.mode) modeButtons.set(b.mode, btn);\n bar.appendChild(btn);\n }\n\n const setActive = (mode: InteractionMode) => {\n for (const [m, btn] of modeButtons) {\n const active = m === mode;\n btn.dataset.active = String(active);\n btn.style.background = active ? t.activeBg : \"transparent\";\n btn.style.color = active ? t.activeFg : t.fg;\n }\n };\n\n setActive(host.getMode());\n host.onModeChange(setActive);\n\n container.appendChild(bar);\n return {\n element: bar,\n destroy: () => bar.remove(),\n };\n}\n","import { Axis } from \"./axes/axis.js\";\nimport { defaultFormat } from \"./axes/ticks.js\";\nimport { begin2D, getSharedGL, sizeShared } from \"./gl/shared.js\";\nimport type { AxisFrame } from \"./gl/transform.js\";\nimport { AreaLayer, type AreaOptions } from \"./layers/area.js\";\nimport { BarLayer, type BarOptions } from \"./layers/bar.js\";\nimport { BoxLayer, type BoxOptions } from \"./layers/box.js\";\nimport { CandlestickLayer, type CandlestickOptions } from \"./layers/candlestick.js\";\nimport { ContourLayer, type ContourOptions } from \"./layers/contour.js\";\nimport { ErrorBarLayer, type ErrorBarOptions } from \"./layers/errorbar.js\";\nimport { HeatmapLayer, type HeatmapOptions } from \"./layers/heatmap.js\";\nimport { HexbinLayer, type HexbinOptions } from \"./layers/hexbin.js\";\nimport type { Layer } from \"./layers/layer.js\";\nimport { LineLayer, type LineOptions } from \"./layers/line.js\";\nimport { QuiverLayer, type QuiverOptions } from \"./layers/quiver.js\";\nimport { ScatterLayer, type ScatterOptions } from \"./layers/scatter.js\";\nimport { StemLayer, type StemOptions } from \"./layers/stem.js\";\nimport { histogram, spectrogram } from \"./stats/index.js\";\nimport {\n darkTheme,\n drawCrosshair,\n drawGrid,\n drawMarker,\n drawXAxis,\n drawYAxis,\n lightTheme,\n plotRegion,\n pxX,\n pxY,\n type Layout,\n type Theme,\n} from \"./render/overlay.js\";\nimport { LinearScale, makeScale, type Scale, type ScaleType } from \"./scales/scale.js\";\nimport { createToolbar } from \"./ui/toolbar.js\";\nimport type { AxisConfig, Dim, InteractionMode, Range } from \"./types.js\";\n\nexport interface AxisScaleOptions {\n type?: ScaleType;\n /** Fixed domain. If omitted, the axis autoscales to the data. */\n domain?: Range;\n}\n\nexport interface YAxisOptions extends AxisConfig {\n type?: ScaleType;\n domain?: Range;\n /** Which side to draw the axis on. Default `\"right\"` for secondary axes. */\n side?: \"left\" | \"right\";\n /** Axis + label color (secondary axes often match their series). */\n color?: string;\n}\n\nexport interface PlotOptions {\n scales?: { x?: AxisScaleOptions; y?: AxisScaleOptions };\n axes?: { x?: AxisConfig; y?: AxisConfig };\n theme?: \"light\" | \"dark\" | Theme;\n margin?: Partial<Layout[\"margin\"]>;\n /** Enable wheel-zoom and drag interaction. Default true. */\n interactive?: boolean;\n /** Show the built-in toolbar (home + pan/box/X/Y zoom modes). Default true. */\n toolbar?: boolean;\n /** Initial interaction mode. Default `\"box\"`. */\n mode?: InteractionMode;\n /** Enable hover crosshair + tooltip. Default true. */\n hover?: boolean;\n}\n\ninterface YAxisState {\n id: string;\n scale: Scale;\n axis: Axis;\n side: \"left\" | \"right\";\n auto: boolean;\n initial: Range | null;\n color?: string;\n}\n\nconst DEFAULT_MARGIN = { top: 16, right: 16, bottom: 40, left: 56 };\nconst Y_AXIS_GAP = 52;\n\n/** Layers that can report a nearest point participate in hover/tooltip. */\ninterface Pickable {\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n nearestByX(x: number): { x: number; y: number; index: number } | null;\n}\nfunction isPickable(layer: Layer): layer is Layer & Pickable {\n return typeof (layer as Partial<Pickable>).nearestByX === \"function\";\n}\n\n/** Pad a data range for autoscaling — linearly, or multiplicatively for log axes. */\nfunction padDomain(min: number, max: number, log: boolean, frac: number): Range {\n if (log) {\n // Keep bounds strictly positive and pad by a factor in log space.\n const lo = min > 0 ? min : max > 0 ? max / 1000 : 1e-9;\n const hi = max > lo ? max : lo * 10;\n const f = Math.pow(hi / lo, frac);\n return [lo / f, hi * f];\n }\n const pad = (max - min) * frac || 1;\n return [min - pad, max + pad];\n}\n\n/**\n * The imperative core plot. Owns a stack of three canvases (grid / WebGL data /\n * axis overlay), a shared x scale, and one-or-more named y axes.\n */\nexport class Plot {\n private container: HTMLElement;\n private gridCanvas: HTMLCanvasElement;\n private dataCanvas: HTMLCanvasElement;\n private axisCanvas: HTMLCanvasElement;\n private gridCtx: CanvasRenderingContext2D;\n private dataCtx: CanvasRenderingContext2D;\n private axisCtx: CanvasRenderingContext2D;\n private gl: WebGL2RenderingContext;\n /** Shared offscreen WebGL canvas we render into, then blit onto `dataCanvas`. */\n private sharedCanvas: HTMLCanvasElement;\n\n private scaleX: Scale;\n private axisX: Axis;\n private autoX: boolean;\n private initialX: Range | null;\n\n /** Named y axes, insertion-ordered. `\"y\"` is always the primary. */\n private yAxes = new Map<string, YAxisState>();\n\n private layers: Layer[] = [];\n private theme: Theme;\n private isDark: boolean;\n private baseMargin: Layout[\"margin\"];\n private dpr = 1;\n private resizeObserver: ResizeObserver;\n private frameRequested = false;\n\n private mode: InteractionMode;\n private selectionDiv: HTMLDivElement;\n private modeChangeCbs: Array<(mode: InteractionMode) => void> = [];\n private toolbarHandle: { destroy: () => void } | null = null;\n\n private hoverEnabled: boolean;\n private hoverPx: { x: number; y: number } | null = null;\n private tooltip: HTMLDivElement;\n\n constructor(container: HTMLElement, options: PlotOptions = {}) {\n this.container = container;\n if (getComputedStyle(container).position === \"static\") {\n container.style.position = \"relative\";\n }\n\n this.gridCanvas = this.makeCanvas(0);\n this.dataCanvas = this.makeCanvas(1);\n this.axisCanvas = this.makeCanvas(2);\n\n this.gridCtx = this.gridCanvas.getContext(\"2d\")!;\n this.dataCtx = this.dataCanvas.getContext(\"2d\")!;\n this.axisCtx = this.axisCanvas.getContext(\"2d\")!;\n const s = getSharedGL();\n this.gl = s.gl;\n this.sharedCanvas = s.canvas;\n\n const sx = options.scales?.x ?? {};\n const sy = options.scales?.y ?? {};\n this.scaleX = makeScale(sx.type ?? \"linear\", sx.domain ?? [0, 1]);\n this.autoX = sx.domain == null;\n this.initialX = sx.domain ?? null;\n this.axisX = new Axis(options.axes?.x);\n\n // Primary y axis.\n this.yAxes.set(\"y\", {\n id: \"y\",\n scale: makeScale(sy.type ?? \"linear\", sy.domain ?? [0, 1]),\n axis: new Axis(options.axes?.y),\n side: \"left\",\n auto: sy.domain == null,\n initial: sy.domain ?? null,\n });\n\n this.isDark = options.theme === \"dark\";\n this.theme =\n options.theme === \"dark\"\n ? darkTheme\n : options.theme === \"light\" || options.theme == null\n ? lightTheme\n : options.theme;\n this.baseMargin = { ...DEFAULT_MARGIN, ...options.margin };\n this.mode = options.mode ?? \"box\";\n this.hoverEnabled = options.hover !== false;\n\n // Selection rectangle overlay for box zoom.\n this.selectionDiv = document.createElement(\"div\");\n Object.assign(this.selectionDiv.style, {\n position: \"absolute\",\n display: \"none\",\n zIndex: \"2\",\n pointerEvents: \"none\",\n background: \"rgba(59,130,246,0.15)\",\n border: \"1px solid rgba(59,130,246,0.9)\",\n borderRadius: \"1px\",\n } as CSSStyleDeclaration);\n container.appendChild(this.selectionDiv);\n\n // Tooltip.\n this.tooltip = document.createElement(\"div\");\n Object.assign(this.tooltip.style, {\n position: \"absolute\",\n display: \"none\",\n zIndex: \"4\",\n pointerEvents: \"none\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n lineHeight: \"1.4\",\n whiteSpace: \"nowrap\",\n background: this.isDark ? \"rgba(15,23,42,0.92)\" : \"rgba(255,255,255,0.96)\",\n color: this.isDark ? \"#e2e8f0\" : \"#1e293b\",\n border: `1px solid ${this.isDark ? \"rgba(148,163,184,0.25)\" : \"rgba(100,116,139,0.25)\"}`,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.18)\",\n } as CSSStyleDeclaration);\n container.appendChild(this.tooltip);\n\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(container);\n this.resize();\n\n if (options.interactive !== false) this.attachInteraction();\n if (options.toolbar !== false) {\n this.toolbarHandle = createToolbar(\n container,\n {\n setMode: (m) => this.setMode(m),\n getMode: () => this.mode,\n home: () => this.home(),\n onModeChange: (cb) => this.modeChangeCbs.push(cb),\n },\n this.isDark,\n );\n }\n this.updateCursor();\n }\n\n private makeCanvas(z: number): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n Object.assign(c.style, {\n position: \"absolute\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n zIndex: String(z),\n } as CSSStyleDeclaration);\n if (z < 2) c.style.pointerEvents = \"none\";\n this.container.appendChild(c);\n return c;\n }\n\n /** Margins grow to make room for extra y axes on each side. */\n private computeMargin(): Layout[\"margin\"] {\n let leftCount = 0;\n let rightCount = 0;\n for (const ya of this.yAxes.values()) {\n if (ya.side === \"left\") leftCount++;\n else rightCount++;\n }\n return {\n top: this.baseMargin.top,\n bottom: this.baseMargin.bottom,\n left: this.baseMargin.left + Math.max(0, leftCount - 1) * Y_AXIS_GAP,\n right: this.baseMargin.right + rightCount * Y_AXIS_GAP,\n };\n }\n\n private layout(): Layout {\n return {\n cssWidth: this.container.clientWidth,\n cssHeight: this.container.clientHeight,\n margin: this.computeMargin(),\n };\n }\n\n /** Pixel x-position (and title x) for each y axis, by draw order per side. */\n private yAxisPositions(): Map<string, { x: number; titleX: number }> {\n const region = plotRegion(this.layout());\n const out = new Map<string, { x: number; titleX: number }>();\n let li = 0;\n let ri = 0;\n for (const ya of this.yAxes.values()) {\n if (ya.side === \"left\") {\n const x = region.left - li * Y_AXIS_GAP;\n out.set(ya.id, { x, titleX: x - 42 });\n li++;\n } else {\n const x = region.left + region.width + ri * Y_AXIS_GAP;\n out.set(ya.id, { x, titleX: x + 42 });\n ri++;\n }\n }\n return out;\n }\n\n // ---- Public API -----------------------------------------------------------\n\n private register<T extends Layer>(layer: T): T {\n if (!this.yAxes.has(layer.yAxis)) {\n throw new Error(`Unknown y axis \"${layer.yAxis}\". Call addYAxis() first.`);\n }\n this.layers.push(layer);\n this.autoscale();\n this.requestRender();\n return layer;\n }\n\n addLine(opts: LineOptions): LineLayer {\n return this.register(new LineLayer(this.gl, opts));\n }\n\n addScatter(opts: ScatterOptions): ScatterLayer {\n return this.register(new ScatterLayer(this.gl, opts));\n }\n\n addBar(opts: BarOptions): BarLayer {\n return this.register(new BarLayer(this.gl, opts));\n }\n\n addArea(opts: AreaOptions): AreaLayer {\n return this.register(new AreaLayer(this.gl, opts));\n }\n\n addHeatmap(opts: HeatmapOptions): HeatmapLayer {\n return this.register(new HeatmapLayer(this.gl, opts));\n }\n\n addBox(opts: BoxOptions): BoxLayer {\n return this.register(new BoxLayer(this.gl, opts));\n }\n\n addHexbin(opts: HexbinOptions): HexbinLayer {\n return this.register(new HexbinLayer(this.gl, opts));\n }\n\n addContour(opts: ContourOptions): ContourLayer {\n return this.register(new ContourLayer(this.gl, opts));\n }\n\n addErrorBar(opts: ErrorBarOptions): ErrorBarLayer {\n return this.register(new ErrorBarLayer(this.gl, opts));\n }\n\n addStem(opts: StemOptions): StemLayer {\n return this.register(new StemLayer(this.gl, opts));\n }\n\n addQuiver(opts: QuiverOptions): QuiverLayer {\n return this.register(new QuiverLayer(this.gl, opts));\n }\n\n addCandlestick(opts: CandlestickOptions): CandlestickLayer {\n return this.register(new CandlestickLayer(this.gl, opts));\n }\n\n /** Compute an STFT of `signal` and render it as a heatmap (time × frequency). */\n addHeatmapSpectrogram(\n signal: ArrayLike<number>,\n opts: { fftSize?: number; hop?: number; sampleRate?: number; colormap?: HeatmapOptions[\"colormap\"] } = {},\n ): HeatmapLayer {\n const s = spectrogram(signal, opts);\n return this.register(\n new HeatmapLayer(this.gl, {\n values: s.values,\n cols: s.cols,\n rows: s.rows,\n extent: s.extent,\n colormap: opts.colormap ?? \"plasma\",\n }),\n );\n }\n\n /** Bin raw `values` and render a histogram as bars. */\n addHistogram(\n values: ArrayLike<number>,\n opts: {\n bins?: number;\n range?: [number, number];\n color?: string;\n name?: string;\n yAxis?: string;\n } = {},\n ): BarLayer {\n const h = histogram(values, { bins: opts.bins, range: opts.range });\n return this.register(\n new BarLayer(this.gl, {\n x: h.centers,\n y: h.counts,\n width: h.binWidth * 0.98,\n color: opts.color,\n name: opts.name,\n yAxis: opts.yAxis,\n }),\n );\n }\n\n /** Register an additional named y axis. Series opt in via `addLine({ yAxis })`. */\n addYAxis(id: string, opts: YAxisOptions = {}): void {\n if (this.yAxes.has(id)) throw new Error(`Y axis \"${id}\" already exists`);\n const { type, domain, side, color, ...axisConfig } = opts;\n this.yAxes.set(id, {\n id,\n scale: makeScale(type ?? \"linear\", domain ?? [0, 1]),\n axis: new Axis(axisConfig),\n side: side ?? \"right\",\n auto: domain == null,\n initial: domain ?? null,\n color,\n });\n this.autoscale();\n this.requestRender();\n }\n\n removeLayer(layer: Layer): void {\n const i = this.layers.indexOf(layer);\n if (i >= 0) {\n this.layers.splice(i, 1);\n layer.dispose();\n this.autoscale();\n this.requestRender();\n }\n }\n\n /** Configure ticks/format/title for the x axis or a y axis (default primary \"y\"). */\n setAxis(dim: Dim | string, config: Partial<AxisConfig>): void {\n if (dim === \"x\") {\n this.axisX.update(config);\n } else {\n const ya = this.yAxes.get(dim === \"y\" ? \"y\" : dim);\n if (!ya) throw new Error(`Unknown axis \"${dim}\"`);\n ya.axis.update(config);\n }\n this.requestRender();\n }\n\n /** Set (or lock) the visible domain. `y` targets the primary axis; use `yAxes` for others. */\n setView(view: { x?: Range; y?: Range; yAxes?: Record<string, Range> }): void {\n if (view.x) {\n this.scaleX.domain = view.x;\n this.autoX = false;\n }\n if (view.y) this.setYDomain(\"y\", view.y);\n if (view.yAxes) {\n for (const [id, r] of Object.entries(view.yAxes)) this.setYDomain(id, r);\n }\n this.requestRender();\n }\n\n private setYDomain(id: string, range: Range): void {\n const ya = this.yAxes.get(id);\n if (!ya) throw new Error(`Unknown y axis \"${id}\"`);\n ya.scale.domain = range;\n ya.auto = false;\n }\n\n // ---- Interaction control --------------------------------------------------\n\n setMode(mode: InteractionMode): void {\n if (mode === this.mode) return;\n this.mode = mode;\n this.updateCursor();\n for (const cb of this.modeChangeCbs) cb(mode);\n }\n\n getMode(): InteractionMode {\n return this.mode;\n }\n\n onModeChange(cb: (mode: InteractionMode) => void): void {\n this.modeChangeCbs.push(cb);\n }\n\n /** Reset to the home view: explicit domains restored, auto axes re-fit to data. */\n home(): void {\n if (this.initialX) {\n this.scaleX.domain = this.initialX;\n this.autoX = false;\n } else {\n this.autoX = true;\n }\n for (const ya of this.yAxes.values()) {\n if (ya.initial) {\n ya.scale.domain = ya.initial;\n ya.auto = false;\n } else {\n ya.auto = true;\n }\n }\n this.autoscale();\n this.requestRender();\n }\n\n /** Re-fit auto axes to the data: x over all series, each y axis over its own series. */\n autoscale(): void {\n // X across all layers.\n if (this.autoX) {\n let minX = Infinity, maxX = -Infinity, any = false;\n for (const l of this.layers) {\n const b = l.bounds();\n if (!b) continue;\n any = true;\n minX = Math.min(minX, b.x[0]);\n maxX = Math.max(maxX, b.x[1]);\n }\n if (any) this.scaleX.domain = padDomain(minX, maxX, this.scaleX.log, 0.02);\n }\n // Each y axis over the layers assigned to it.\n for (const ya of this.yAxes.values()) {\n if (!ya.auto) continue;\n let minY = Infinity, maxY = -Infinity, any = false;\n for (const l of this.layers) {\n if (l.yAxis !== ya.id) continue;\n const b = l.bounds();\n if (!b) continue;\n any = true;\n minY = Math.min(minY, b.y[0]);\n maxY = Math.max(maxY, b.y[1]);\n }\n if (any) ya.scale.domain = padDomain(minY, maxY, ya.scale.log, 0.05);\n }\n }\n\n destroy(): void {\n this.resizeObserver.disconnect();\n this.toolbarHandle?.destroy();\n this.selectionDiv.remove();\n this.tooltip.remove();\n for (const l of this.layers) l.dispose();\n this.container.removeChild(this.gridCanvas);\n this.container.removeChild(this.dataCanvas);\n this.container.removeChild(this.axisCanvas);\n }\n\n // ---- Rendering ------------------------------------------------------------\n\n private resize(): void {\n const dpr = window.devicePixelRatio || 1;\n this.dpr = dpr;\n const w = this.container.clientWidth;\n const h = this.container.clientHeight;\n for (const c of [this.gridCanvas, this.dataCanvas, this.axisCanvas]) {\n c.width = Math.max(1, Math.round(w * dpr));\n c.height = Math.max(1, Math.round(h * dpr));\n }\n this.gridCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n this.dataCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n this.axisCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n this.render();\n }\n\n requestRender(): void {\n if (this.frameRequested) return;\n this.frameRequested = true;\n requestAnimationFrame(() => {\n this.frameRequested = false;\n this.render();\n });\n }\n\n private primaryY(): YAxisState {\n return this.yAxes.get(\"y\")!;\n }\n\n render(): void {\n const layout = this.layout();\n const region = plotRegion(layout);\n const primary = this.primaryY();\n const ticksX = this.axisX.resolve(this.scaleX);\n const ticksYPrimary = primary.axis.resolve(primary.scale);\n\n // Grid (behind data): x lines + primary-y lines only, to avoid clutter.\n this.gridCtx.clearRect(0, 0, layout.cssWidth, layout.cssHeight);\n drawGrid(this.gridCtx, region, this.scaleX, primary.scale, ticksX, ticksYPrimary, this.theme);\n\n // Data: render into the shared WebGL canvas (sized to this plot), then blit.\n const gl = this.gl;\n const devW = this.dataCanvas.width;\n const devH = this.dataCanvas.height;\n sizeShared(gl, devW, devH);\n begin2D(gl);\n gl.clearColor(0, 0, 0, 0);\n gl.disable(gl.SCISSOR_TEST);\n gl.viewport(0, 0, devW, devH);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n const dpr = this.dpr;\n const vx = Math.round(region.left * dpr);\n const vw = Math.round(region.width * dpr);\n const vh = Math.round(region.height * dpr);\n const vy = devH - Math.round((region.top + region.height) * dpr);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(vx, vy, vw, vh);\n gl.viewport(vx, vy, vw, vh);\n\n const xFrame: AxisFrame = {\n lo: this.scaleX.domain[0],\n hi: this.scaleX.domain[1],\n log: this.scaleX.log,\n };\n for (const layer of this.layers) {\n const ya = this.yAxes.get(layer.yAxis)!;\n layer.draw({\n gl,\n x: xFrame,\n y: { lo: ya.scale.domain[0], hi: ya.scale.domain[1], log: ya.scale.log },\n pixelWidth: vw,\n pixelHeight: vh,\n dpr: this.dpr,\n });\n }\n gl.disable(gl.SCISSOR_TEST);\n\n // Blit the shared GL result onto this plot's own data canvas.\n this.dataCtx.clearRect(0, 0, layout.cssWidth, layout.cssHeight);\n this.dataCtx.drawImage(this.sharedCanvas, 0, 0, layout.cssWidth, layout.cssHeight);\n\n // Axes (above data).\n this.axisCtx.clearRect(0, 0, layout.cssWidth, layout.cssHeight);\n drawXAxis(this.axisCtx, region, this.scaleX, ticksX, this.theme, this.axisX.config.title);\n\n const positions = this.yAxisPositions();\n for (const ya of this.yAxes.values()) {\n const pos = positions.get(ya.id)!;\n const ticks = ya.axis.resolve(ya.scale);\n drawYAxis(this.axisCtx, region, ya.scale, ticks, this.theme, {\n x: pos.x,\n side: ya.side,\n title: ya.axis.config.title,\n color: ya.color,\n titleX: pos.titleX,\n });\n }\n\n // Hover crosshair + markers + tooltip.\n if (this.hoverEnabled && this.hoverPx) this.renderHover(region);\n else this.tooltip.style.display = \"none\";\n }\n\n private renderHover(region: ReturnType<typeof plotRegion>): void {\n const cursor = this.hoverPx!;\n // Only show hover inside the plot region.\n if (\n cursor.x < region.left || cursor.x > region.left + region.width ||\n cursor.y < region.top || cursor.y > region.top + region.height\n ) {\n this.tooltip.style.display = \"none\";\n return;\n }\n\n const nx = (cursor.x - region.left) / region.width;\n const dataX = this.scaleX.invert(nx);\n drawCrosshair(this.axisCtx, region, cursor.x, this.theme);\n\n const rows: Array<{ layer: Pickable; x: number; y: number }> = [];\n for (const layer of this.layers) {\n if (!isPickable(layer)) continue;\n const p = layer.nearestByX(dataX);\n if (!p) continue;\n const ya = this.yAxes.get(layer.yAxis)!;\n const px = pxX(region, this.scaleX.norm(p.x));\n const py = pxY(region, ya.scale.norm(p.y));\n drawMarker(this.axisCtx, px, py, layer.colorCss);\n rows.push({ layer, x: p.x, y: p.y });\n }\n\n if (rows.length === 0) {\n this.tooltip.style.display = \"none\";\n return;\n }\n this.updateTooltip(rows, cursor, dataX);\n }\n\n private updateTooltip(\n rows: Array<{ layer: Pickable; x: number; y: number }>,\n cursor: { x: number; y: number },\n dataX: number,\n ): void {\n const tip = this.tooltip;\n // Rebuild content with safe DOM APIs (no innerHTML).\n tip.replaceChildren();\n const xfmt = this.axisX.config.format ?? defaultFormat;\n const header = document.createElement(\"div\");\n header.style.opacity = \"0.7\";\n header.style.marginBottom = \"3px\";\n header.textContent = `x = ${xfmt(dataX)}`;\n tip.appendChild(header);\n\n for (const r of rows) {\n const yfmt = this.yAxes.get(r.layer.yAxis)!.axis.config.format ?? defaultFormat;\n const row = document.createElement(\"div\");\n row.style.display = \"flex\";\n row.style.alignItems = \"center\";\n row.style.gap = \"6px\";\n\n const dot = document.createElement(\"span\");\n Object.assign(dot.style, {\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: r.layer.colorCss,\n flex: \"0 0 auto\",\n } as CSSStyleDeclaration);\n\n const label = document.createElement(\"span\");\n label.textContent = `${r.layer.name}: ${yfmt(r.y)}`;\n\n row.appendChild(dot);\n row.appendChild(label);\n tip.appendChild(row);\n }\n\n tip.style.display = \"block\";\n // Position near the cursor, flipping to stay inside the container.\n const cw = this.container.clientWidth;\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n let left = cursor.x + 14;\n if (left + tw > cw) left = cursor.x - tw - 14;\n let top = cursor.y + 14;\n if (top + th > this.container.clientHeight) top = cursor.y - th - 14;\n tip.style.left = `${Math.max(0, left)}px`;\n tip.style.top = `${Math.max(0, top)}px`;\n }\n\n // ---- Interaction ----------------------------------------------------------\n\n private updateCursor(): void {\n this.axisCanvas.style.cursor = this.mode === \"pan\" ? \"grab\" : \"crosshair\";\n }\n\n private axisLock(): { x: boolean; y: boolean } {\n if (this.mode === \"box-x\") return { x: true, y: false };\n if (this.mode === \"box-y\") return { x: false, y: true };\n return { x: true, y: true };\n }\n\n /**\n * Which region the pointer is over: the plot body, the x-axis strip (below),\n * or a specific y-axis strip (in a side margin). Dragging an axis strip pans\n * just that axis.\n */\n private zoneAt(px: number, py: number): { type: \"plot\" } | { type: \"x\" } | { type: \"y\"; id: string } {\n const region = plotRegion(this.layout());\n const inX = px >= region.left && px <= region.left + region.width;\n const inY = py >= region.top && py <= region.top + region.height;\n if (inX && py > region.top + region.height) return { type: \"x\" };\n if (inY && !inX) {\n // Nearest y axis to the cursor within a side margin.\n const positions = this.yAxisPositions();\n let bestId: string | null = null;\n let bestD = Infinity;\n for (const [id, pos] of positions) {\n const d = Math.abs(pos.x - px);\n if (d < bestD) {\n bestD = d;\n bestId = id;\n }\n }\n if (bestId && bestD <= Y_AXIS_GAP) return { type: \"y\", id: bestId };\n }\n return { type: \"plot\" };\n }\n\n // Pan/zoom shift the domain in the scale's *transformed* space (via invert),\n // not raw data space — so a log axis stays positive instead of crossing zero\n // into NaN. For linear/time scales this is identical to the old arithmetic.\n private panX(dxPx: number, region: ReturnType<typeof plotRegion>): void {\n const f = dxPx / region.width;\n this.scaleX.domain = [this.scaleX.invert(-f), this.scaleX.invert(1 - f)];\n this.autoX = false;\n }\n\n private panY(id: string | null, dyPx: number, region: ReturnType<typeof plotRegion>): void {\n const f = dyPx / region.height;\n for (const ya of this.yAxes.values()) {\n if (id && ya.id !== id) continue;\n ya.scale.domain = [ya.scale.invert(f), ya.scale.invert(1 + f)];\n ya.auto = false;\n }\n }\n\n private attachInteraction(): void {\n const el = this.axisCanvas;\n el.style.touchAction = \"none\";\n\n el.addEventListener(\n \"wheel\",\n (e) => {\n e.preventDefault();\n const region = plotRegion(this.layout());\n const rect = el.getBoundingClientRect();\n const nx = (e.clientX - rect.left - region.left) / region.width;\n const ny = 1 - (e.clientY - rect.top - region.top) / region.height;\n const factor = Math.exp(e.deltaY * 0.001);\n this.zoomAround(nx, ny, factor);\n },\n { passive: false },\n );\n\n let panning = false;\n let selecting = false;\n /** Non-null while dragging an axis strip: `\"x\"` or a y-axis id. */\n let axisDrag: \"x\" | { y: string } | null = null;\n let lastX = 0;\n let lastY = 0;\n let startX = 0;\n let startY = 0;\n\n el.addEventListener(\"pointerdown\", (e) => {\n el.setPointerCapture(e.pointerId);\n this.hoverPx = null;\n const rect = el.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n const zone = this.zoneAt(px, py);\n\n if (zone.type === \"x\") {\n axisDrag = \"x\";\n lastX = e.clientX;\n } else if (zone.type === \"y\") {\n axisDrag = { y: zone.id };\n lastY = e.clientY;\n } else if (this.mode === \"pan\") {\n panning = true;\n lastX = e.clientX;\n lastY = e.clientY;\n el.style.cursor = \"grabbing\";\n } else {\n selecting = true;\n startX = px;\n startY = py;\n }\n });\n\n el.addEventListener(\"pointermove\", (e) => {\n const rect = el.getBoundingClientRect();\n const region = plotRegion(this.layout());\n if (axisDrag === \"x\") {\n this.panX(e.clientX - lastX, region);\n lastX = e.clientX;\n this.requestRender();\n } else if (axisDrag && typeof axisDrag === \"object\") {\n this.panY(axisDrag.y, e.clientY - lastY, region);\n lastY = e.clientY;\n this.requestRender();\n } else if (panning) {\n this.panX(e.clientX - lastX, region);\n this.panY(null, e.clientY - lastY, region);\n lastX = e.clientX;\n lastY = e.clientY;\n this.requestRender();\n } else if (selecting) {\n this.drawSelection(startX, startY, e.clientX - rect.left, e.clientY - rect.top);\n } else {\n // Idle: hover in the plot body, resize cursors over axis strips.\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n const zone = this.zoneAt(px, py);\n if (zone.type === \"x\") {\n el.style.cursor = \"ew-resize\";\n this.setHover(null);\n } else if (zone.type === \"y\") {\n el.style.cursor = \"ns-resize\";\n this.setHover(null);\n } else {\n this.updateCursor();\n if (this.hoverEnabled) this.setHover({ x: px, y: py });\n }\n }\n });\n\n el.addEventListener(\"pointerleave\", () => this.setHover(null));\n\n const end = (e: PointerEvent) => {\n if (el.hasPointerCapture(e.pointerId)) el.releasePointerCapture(e.pointerId);\n if (axisDrag) {\n axisDrag = null;\n } else if (panning) {\n panning = false;\n this.updateCursor();\n } else if (selecting) {\n selecting = false;\n const rect = el.getBoundingClientRect();\n this.applySelection(startX, startY, e.clientX - rect.left, e.clientY - rect.top);\n this.selectionDiv.style.display = \"none\";\n }\n };\n el.addEventListener(\"pointerup\", end);\n el.addEventListener(\"pointercancel\", end);\n }\n\n private setHover(px: { x: number; y: number } | null): void {\n const had = this.hoverPx !== null;\n if (!px && !had) return;\n this.hoverPx = px;\n this.requestRender();\n }\n\n private drawSelection(x0: number, y0: number, x1: number, y1: number): void {\n const region = plotRegion(this.layout());\n const lock = this.axisLock();\n const clamp = (v: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, v));\n\n let left: number, width: number, top: number, height: number;\n if (lock.x) {\n const a = clamp(x0, region.left, region.left + region.width);\n const b = clamp(x1, region.left, region.left + region.width);\n left = Math.min(a, b);\n width = Math.abs(a - b);\n } else {\n left = region.left;\n width = region.width;\n }\n if (lock.y) {\n const a = clamp(y0, region.top, region.top + region.height);\n const b = clamp(y1, region.top, region.top + region.height);\n top = Math.min(a, b);\n height = Math.abs(a - b);\n } else {\n top = region.top;\n height = region.height;\n }\n\n Object.assign(this.selectionDiv.style, {\n display: \"block\",\n left: `${left}px`,\n top: `${top}px`,\n width: `${width}px`,\n height: `${height}px`,\n });\n }\n\n private applySelection(x0: number, y0: number, x1: number, y1: number): void {\n const region = plotRegion(this.layout());\n const lock = this.axisLock();\n const dxPx = Math.abs(x1 - x0);\n const dyPx = Math.abs(y1 - y0);\n // Ignore tiny drags (treat as a click) in whichever dimensions are active.\n if (lock.x && lock.y) {\n if (dxPx < 5 && dyPx < 5) return;\n } else if (lock.x && dxPx < 5) return;\n else if (lock.y && dyPx < 5) return;\n\n const clamp01 = (v: number) => Math.max(0, Math.min(1, v));\n if (lock.x) {\n const nA = clamp01((Math.min(x0, x1) - region.left) / region.width);\n const nB = clamp01((Math.max(x0, x1) - region.left) / region.width);\n const a = this.scaleX.invert(nA);\n const b = this.scaleX.invert(nB);\n this.scaleX.domain = [Math.min(a, b), Math.max(a, b)];\n this.autoX = false;\n }\n if (lock.y) {\n const nTop = clamp01(1 - (Math.min(y0, y1) - region.top) / region.height);\n const nBot = clamp01(1 - (Math.max(y0, y1) - region.top) / region.height);\n for (const ya of this.yAxes.values()) {\n const a = ya.scale.invert(nTop);\n const b = ya.scale.invert(nBot);\n ya.scale.domain = [Math.min(a, b), Math.max(a, b)];\n ya.auto = false;\n }\n }\n this.requestRender();\n }\n\n private zoomAround(nx: number, ny: number, factor: number): void {\n const lock = this.axisLock();\n // Zoom about the cursor in transformed space (log-safe; see panX/panY).\n if (lock.x) {\n const t = nx * (1 - factor);\n this.scaleX.domain = [this.scaleX.invert(t), this.scaleX.invert(t + factor)];\n this.autoX = false;\n }\n if (lock.y) {\n const t = ny * (1 - factor);\n for (const ya of this.yAxes.values()) {\n ya.scale.domain = [ya.scale.invert(t), ya.scale.invert(t + factor)];\n ya.auto = false;\n }\n }\n this.requestRender();\n }\n}\n\nexport { LinearScale };\n","import { autoTicks } from \"../axes/ticks.js\";\nimport { begin2D, getSharedGL, sizeShared } from \"../gl/shared.js\";\nimport type { AxisFrame } from \"../gl/transform.js\";\nimport { LineLayer } from \"../layers/line.js\";\nimport { ScatterLayer } from \"../layers/scatter.js\";\nimport { darkTheme, lightTheme, type Theme } from \"../render/overlay.js\";\nimport type { Color } from \"../types.js\";\n\nexport interface PolarOptions {\n theme?: \"light\" | \"dark\" | Theme;\n /** Angle unit of input theta values. Default `\"rad\"`. */\n angleUnit?: \"rad\" | \"deg\";\n /** Fixed max radius. If omitted, autoscales to the data. */\n maxRadius?: number;\n margin?: number;\n}\n\nexport interface PolarLineOptions {\n theta: ArrayLike<number>;\n r: ArrayLike<number>;\n color?: string | Color;\n width?: number;\n /** Connect the last point back to the first. */\n closed?: boolean;\n}\n\nexport interface PolarScatterOptions {\n theta: ArrayLike<number>;\n r: ArrayLike<number>;\n color?: string | Color;\n size?: number;\n}\n\n/** A live handle to update a polar series with new (theta, r) data. */\nexport interface PolarSeries {\n setData(theta: ArrayLike<number>, r: ArrayLike<number>): void;\n}\n\ninterface Entry {\n layer: LineLayer | ScatterLayer;\n closed: boolean;\n maxR: number;\n}\n\n/** A polar (r, θ) plot: concentric radial grid + angular spokes, WebGL data. */\nexport class PolarPlot {\n private container: HTMLElement;\n private gridCanvas: HTMLCanvasElement;\n private dataCanvas: HTMLCanvasElement;\n private gridCtx: CanvasRenderingContext2D;\n private dataCtx: CanvasRenderingContext2D;\n private gl: WebGL2RenderingContext;\n private sharedCanvas: HTMLCanvasElement;\n private theme: Theme;\n private toRad: number;\n private fixedR?: number;\n private margin: number;\n private entries: Entry[] = [];\n private R = 1;\n private dpr = 1;\n private resizeObserver: ResizeObserver;\n private frameRequested = false;\n\n constructor(container: HTMLElement, options: PolarOptions = {}) {\n this.container = container;\n if (getComputedStyle(container).position === \"static\") container.style.position = \"relative\";\n this.gridCanvas = this.makeCanvas(0);\n this.dataCanvas = this.makeCanvas(1);\n this.gridCtx = this.gridCanvas.getContext(\"2d\")!;\n this.dataCtx = this.dataCanvas.getContext(\"2d\")!;\n const s = getSharedGL();\n this.gl = s.gl;\n this.sharedCanvas = s.canvas;\n this.theme = options.theme === \"dark\" ? darkTheme\n : options.theme === \"light\" || options.theme == null ? lightTheme\n : options.theme;\n this.toRad = options.angleUnit === \"deg\" ? Math.PI / 180 : 1;\n this.fixedR = options.maxRadius;\n this.margin = options.margin ?? 28;\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(container);\n this.resize();\n }\n\n private makeCanvas(z: number): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n Object.assign(c.style, { position: \"absolute\", inset: \"0\", width: \"100%\", height: \"100%\", zIndex: String(z) } as CSSStyleDeclaration);\n c.style.pointerEvents = \"none\";\n this.container.appendChild(c);\n return c;\n }\n\n private toXY(theta: ArrayLike<number>, r: ArrayLike<number>, closed: boolean) {\n const n = Math.min(theta.length, r.length);\n const m = closed && n > 0 ? n + 1 : n;\n const x = new Float64Array(m), y = new Float64Array(m);\n let maxR = 0;\n for (let i = 0; i < n; i++) {\n const a = theta[i]! * this.toRad, rr = r[i]!;\n x[i] = rr * Math.cos(a); y[i] = rr * Math.sin(a);\n if (Math.abs(rr) > maxR) maxR = Math.abs(rr);\n }\n if (closed && n > 0) { x[n] = x[0]!; y[n] = y[0]!; }\n return { x, y, maxR };\n }\n\n addLine(opts: PolarLineOptions): PolarSeries {\n const closed = opts.closed ?? false;\n const { x, y, maxR } = this.toXY(opts.theta, opts.r, closed);\n const layer = new LineLayer(this.gl, { x, y, color: opts.color, width: opts.width ?? 2, decimate: false });\n const entry: Entry = { layer, closed, maxR };\n this.entries.push(entry);\n this.refit();\n return this.handle(entry);\n }\n\n addScatter(opts: PolarScatterOptions): PolarSeries {\n const { x, y, maxR } = this.toXY(opts.theta, opts.r, false);\n const layer = new ScatterLayer(this.gl, { x, y, color: opts.color, size: opts.size ?? 5 });\n const entry: Entry = { layer, closed: false, maxR };\n this.entries.push(entry);\n this.refit();\n return this.handle(entry);\n }\n\n private handle(entry: Entry): PolarSeries {\n return {\n setData: (theta, r) => {\n const { x, y, maxR } = this.toXY(theta, r, entry.closed);\n entry.layer.setData(x, y);\n entry.maxR = maxR;\n this.refit();\n this.requestRender();\n },\n };\n }\n\n private refit(): void {\n if (this.fixedR != null) { this.R = this.fixedR; return; }\n let m = 0;\n for (const e of this.entries) m = Math.max(m, e.maxR);\n this.R = m || 1;\n }\n\n destroy(): void {\n this.resizeObserver.disconnect();\n for (const e of this.entries) e.layer.dispose();\n this.container.removeChild(this.gridCanvas);\n this.container.removeChild(this.dataCanvas);\n }\n\n private resize(): void {\n this.dpr = window.devicePixelRatio || 1;\n const w = this.container.clientWidth, h = this.container.clientHeight;\n for (const c of [this.gridCanvas, this.dataCanvas]) {\n c.width = Math.max(1, Math.round(w * this.dpr));\n c.height = Math.max(1, Math.round(h * this.dpr));\n }\n this.gridCtx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n this.dataCtx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n this.render();\n }\n\n requestRender(): void {\n if (this.frameRequested) return;\n this.frameRequested = true;\n requestAnimationFrame(() => { this.frameRequested = false; this.render(); });\n }\n\n /** The square drawing region (CSS px). */\n private square() {\n const w = this.container.clientWidth, h = this.container.clientHeight;\n const side = Math.max(1, Math.min(w, h) - this.margin * 2);\n return { cx: w / 2, cy: h / 2, side, left: (w - side) / 2, top: (h - side) / 2 };\n }\n\n render(): void {\n const sq = this.square();\n const w = this.container.clientWidth, h = this.container.clientHeight;\n\n // Data via shared WebGL, clipped to the square region, domain [-R, R].\n const gl = this.gl;\n const devW = this.dataCanvas.width, devH = this.dataCanvas.height;\n sizeShared(gl, devW, devH);\n begin2D(gl);\n gl.clearColor(0, 0, 0, 0);\n gl.disable(gl.SCISSOR_TEST);\n gl.viewport(0, 0, devW, devH);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n const dpr = this.dpr;\n const vx = Math.round(sq.left * dpr), vw = Math.round(sq.side * dpr), vh = Math.round(sq.side * dpr);\n const vy = devH - Math.round((sq.top + sq.side) * dpr);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(vx, vy, vw, vh);\n gl.viewport(vx, vy, vw, vh);\n const frame: AxisFrame = { lo: -this.R, hi: this.R, log: false };\n for (const e of this.entries) {\n e.layer.draw({ gl, x: frame, y: frame, pixelWidth: vw, pixelHeight: vh, dpr });\n }\n gl.disable(gl.SCISSOR_TEST);\n\n this.dataCtx.clearRect(0, 0, w, h);\n this.dataCtx.drawImage(this.sharedCanvas, 0, 0, w, h);\n\n this.drawGrid(sq);\n }\n\n private drawGrid(sq: { cx: number; cy: number; side: number }): void {\n const ctx = this.gridCtx;\n const w = this.container.clientWidth, h = this.container.clientHeight;\n ctx.clearRect(0, 0, w, h);\n const pr = sq.side / 2;\n const { cx, cy } = sq;\n ctx.save();\n ctx.font = this.theme.font;\n ctx.fillStyle = this.theme.text;\n\n // Angular spokes + degree labels every 30°.\n ctx.strokeStyle = this.theme.grid;\n ctx.lineWidth = 1;\n for (let deg = 0; deg < 360; deg += 30) {\n const a = (deg * Math.PI) / 180;\n const ex = cx + Math.cos(a) * pr, ey = cy - Math.sin(a) * pr;\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(ex, ey);\n ctx.stroke();\n const lx = cx + Math.cos(a) * (pr + 12), ly = cy - Math.sin(a) * (pr + 12);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(`${deg}°`, lx, ly);\n }\n\n // Radial grid circles (no numeric labels).\n const ticks = autoTicks(0, this.R, 4).map((t) => t.value).filter((v) => v > 0);\n ctx.strokeStyle = this.theme.grid;\n for (const rv of ticks) {\n const rad = (rv / this.R) * pr;\n ctx.beginPath();\n ctx.arc(cx, cy, rad, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.restore();\n }\n}\n","/** Minimal column-major 4×4 matrix helpers for the 3D plots (WebGL convention). */\nexport type Mat4 = Float32Array;\n\nexport function identity(): Mat4 {\n const m = new Float32Array(16);\n m[0] = m[5] = m[10] = m[15] = 1;\n return m;\n}\n\n/** Returns a·b. */\nexport function multiply(a: Mat4, b: Mat4): Mat4 {\n const o = new Float32Array(16);\n for (let c = 0; c < 4; c++) {\n for (let r = 0; r < 4; r++) {\n let s = 0;\n for (let k = 0; k < 4; k++) s += a[k * 4 + r]! * b[c * 4 + k]!;\n o[c * 4 + r] = s;\n }\n }\n return o;\n}\n\nexport function perspective(fovy: number, aspect: number, near: number, far: number): Mat4 {\n const f = 1 / Math.tan(fovy / 2);\n const nf = 1 / (near - far);\n const m = new Float32Array(16);\n m[0] = f / aspect;\n m[5] = f;\n m[10] = (far + near) * nf;\n m[11] = -1;\n m[14] = 2 * far * near * nf;\n return m;\n}\n\ntype V3 = [number, number, number];\nconst sub = (a: V3, b: V3): V3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\nconst cross = (a: V3, b: V3): V3 => [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n];\nfunction normalize(v: V3): V3 {\n const l = Math.hypot(v[0], v[1], v[2]) || 1;\n return [v[0] / l, v[1] / l, v[2] / l];\n}\n\nexport function lookAt(eye: V3, center: V3, up: V3): Mat4 {\n const z = normalize(sub(eye, center));\n const x = normalize(cross(up, z));\n const y = cross(z, x);\n const m = identity();\n m[0] = x[0]; m[4] = x[1]; m[8] = x[2];\n m[1] = y[0]; m[5] = y[1]; m[9] = y[2];\n m[2] = z[0]; m[6] = z[1]; m[10] = z[2];\n m[12] = -(x[0] * eye[0] + x[1] * eye[1] + x[2] * eye[2]);\n m[13] = -(y[0] * eye[0] + y[1] * eye[1] + y[2] * eye[2]);\n m[14] = -(z[0] * eye[0] + z[1] * eye[1] + z[2] * eye[2]);\n return m;\n}\n\n/** Transform a homogeneous point by a column-major matrix. Returns [x, y, z, w]. */\nexport function transformPoint(m: Mat4, x: number, y: number, z: number): [number, number, number, number] {\n return [\n m[0]! * x + m[4]! * y + m[8]! * z + m[12]!,\n m[1]! * x + m[5]! * y + m[9]! * z + m[13]!,\n m[2]! * x + m[6]! * y + m[10]! * z + m[14]!,\n m[3]! * x + m[7]! * y + m[11]! * z + m[15]!,\n ];\n}\n\n/** Matrix mapping p' = scale·p + translate (per-axis), used to normalize data to a cube. */\nexport function scaleTranslate(s: V3, t: V3): Mat4 {\n const m = identity();\n m[0] = s[0]; m[5] = s[1]; m[10] = s[2];\n m[12] = t[0]; m[13] = t[1]; m[14] = t[2];\n return m;\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { Bounds3, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface PointCloudOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n z: ArrayLike<number>;\n color?: string | Color;\n size?: number;\n colorBy?: { values: ArrayLike<number>; colormap?: ColormapName; domain?: Range };\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aColor;\nuniform mat4 uMVP;\nuniform float uSize;\nout vec3 vColor;\nvoid main() {\n vColor = aColor;\n gl_Position = uMVP * vec4(aPos, 1.0);\n gl_PointSize = uSize;\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vColor;\nout vec4 outColor;\nvoid main() {\n vec2 d = gl_PointCoord - 0.5;\n if (length(d) > 0.5) discard;\n outColor = vec4(vColor, 1.0);\n}`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class PointCloudLayer implements Layer3D {\n readonly id: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private count: number;\n private size: number;\n private b3: Bounds3;\n\n constructor(gl: WebGL2RenderingContext, opts: PointCloudOptions) {\n this.id = `points3d-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.size = opts.size ?? 4;\n const n = Math.min(opts.x.length, opts.y.length, opts.z.length);\n this.count = n;\n\n const base = opts.color != null\n ? (Array.isArray(opts.color) ? (opts.color as Color) : parseColor(opts.color as string))\n : [0.4, 0.7, 1, 1] as Color;\n const cmap = opts.colorBy ? colormap(opts.colorBy.colormap ?? \"viridis\") : null;\n let lo = opts.colorBy?.domain?.[0] ?? Infinity;\n let hi = opts.colorBy?.domain?.[1] ?? -Infinity;\n if (opts.colorBy && !opts.colorBy.domain) {\n const v = opts.colorBy.values;\n for (let i = 0; i < n; i++) { const t = v[i]!; if (t < lo) lo = t; if (t > hi) hi = t; }\n }\n const span = (hi - lo) || 1;\n\n const data = new Float32Array(n * 6);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!, z = opts.z[i]!;\n data[i * 6] = x; data[i * 6 + 1] = y; data[i * 6 + 2] = z;\n let c: [number, number, number];\n if (cmap && opts.colorBy) c = cmap((opts.colorBy.values[i]! - lo) / span);\n else c = [base[0], base[1], base[2]];\n data[i * 6 + 3] = c[0]; data[i * 6 + 4] = c[1]; data[i * 6 + 5] = c[2];\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n if (z < minZ) minZ = z; if (z > maxZ) maxZ = z;\n }\n this.b3 = { x: [minX, maxX], y: [minY, maxY], z: [minZ, maxZ] };\n\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 24, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 24, 12);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uSize\"]);\n }\n\n bounds3() { return this.count ? this.b3 : null; }\n\n draw(gl: WebGL2RenderingContext, mvp: Mat4): void {\n if (this.count === 0) return;\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\n gl.uniform1f(this.uniforms.uSize!, this.size);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.POINTS, 0, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Range } from \"../types.js\";\nimport type { Bounds3, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface SurfaceOptions {\n /** Row-major height grid, length `cols * rows`. */\n values: ArrayLike<number>;\n cols: number;\n rows: number;\n /** World extent of the grid footprint. Defaults to unit indices. */\n extentX?: Range;\n extentZ?: Range;\n colormap?: ColormapName;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aNormal;\nlayout(location = 2) in vec3 aColor;\nuniform mat4 uMVP;\nout vec3 vColor;\nout vec3 vN;\nvoid main() { vColor = aColor; vN = aNormal; gl_Position = uMVP * vec4(aPos, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vColor;\nin vec3 vN;\nuniform vec3 uLightDir;\nuniform float uAmbient;\nout vec4 outColor;\nvoid main() {\n float d = max(dot(normalize(vN), normalize(uLightDir)), 0.0);\n float shade = uAmbient + (1.0 - uAmbient) * d;\n outColor = vec4(vColor * shade, 1.0);\n}`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class SurfaceLayer implements Layer3D {\n readonly id: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private vertexCount: number;\n private b3: Bounds3;\n private lightDir: [number, number, number] = [0.5, 1, 0.35];\n private ambient = 0.35;\n\n constructor(gl: WebGL2RenderingContext, opts: SurfaceOptions) {\n this.id = `surface-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n const { cols, rows, values } = opts;\n const [x0, x1] = opts.extentX ?? [0, cols - 1];\n const [z0, z1] = opts.extentZ ?? [0, rows - 1];\n const dxWorld = (x1 - x0) / Math.max(1, cols - 1);\n const dzWorld = (z1 - z0) / Math.max(1, rows - 1);\n\n let vmin = Infinity, vmax = -Infinity;\n for (let i = 0; i < values.length; i++) { const v = values[i]!; if (v < vmin) vmin = v; if (v > vmax) vmax = v; }\n const span = vmax - vmin || 1;\n const cmap = colormap(opts.colormap ?? \"viridis\");\n const wx = (c: number) => x0 + (c / (cols - 1)) * (x1 - x0);\n const wz = (r: number) => z0 + (r / (rows - 1)) * (z1 - z0);\n const at = (c: number, r: number) => values[r * cols + c]!;\n\n const normalAt = (c: number, r: number): [number, number, number] => {\n const cl = Math.max(0, Math.min(cols - 1, c)), rl = Math.max(0, Math.min(rows - 1, r));\n const dzdx = (at(Math.min(cols - 1, cl + 1), rl) - at(Math.max(0, cl - 1), rl)) / (2 * dxWorld);\n const dzdz = (at(cl, Math.min(rows - 1, rl + 1)) - at(cl, Math.max(0, rl - 1))) / (2 * dzWorld);\n const nl = Math.hypot(-dzdx, 1, -dzdz) || 1;\n return [-dzdx / nl, 1 / nl, -dzdz / nl];\n };\n\n const data: number[] = [];\n const vert = (c: number, r: number) => {\n const [nx, ny, nz] = normalAt(c, r);\n const [cr, cg, cb] = cmap((at(c, r) - vmin) / span);\n data.push(wx(c), at(c, r), wz(r), nx, ny, nz, cr, cg, cb);\n };\n for (let r = 0; r < rows - 1; r++) {\n for (let c = 0; c < cols - 1; c++) {\n vert(c, r); vert(c + 1, r); vert(c + 1, r + 1);\n vert(c, r); vert(c + 1, r + 1); vert(c, r + 1);\n }\n }\n\n this.vertexCount = data.length / 9;\n this.b3 = { x: [x0, x1], y: [vmin, vmax], z: [z0, z1] };\n\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 36, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 36, 12);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 3, gl.FLOAT, false, 36, 24);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uLightDir\", \"uAmbient\"]);\n }\n\n bounds3() { return this.b3; }\n\n /** Set the light direction (world space) and ambient term (0..1). */\n setLight(dir: [number, number, number], ambient: number): void {\n this.lightDir = dir;\n this.ambient = ambient;\n }\n\n draw(gl: WebGL2RenderingContext, mvp: Mat4): void {\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\n gl.uniform3f(this.uniforms.uLightDir!, this.lightDir[0], this.lightDir[1], this.lightDir[2]);\n gl.uniform1f(this.uniforms.uAmbient!, this.ambient);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLES, 0, this.vertexCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { autoTicks, defaultFormat } from \"../axes/ticks.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { begin3D, getSharedGL, sizeShared } from \"../gl/shared.js\";\nimport type { Range } from \"../types.js\";\nimport type { Bounds3, Layer3D } from \"./layer3d.js\";\nimport { lookAt, multiply, perspective, scaleTranslate, transformPoint, type Mat4 } from \"./mat4.js\";\nimport { PointCloudLayer, type PointCloudOptions } from \"./pointcloud.js\";\nimport { SurfaceLayer, type SurfaceOptions } from \"./surface.js\";\n\nexport interface Plot3DOptions {\n background?: [number, number, number, number];\n azimuth?: number;\n elevation?: number;\n distance?: number;\n /** Axis titles drawn along the x / y (height) / z edges. */\n axisLabels?: { x?: string; y?: string; z?: string };\n /** Render a small on-canvas panel with light-angle + ambient sliders. */\n lightControls?: boolean;\n}\n\nconst LINE_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nuniform mat4 uVP;\nvoid main() { gl_Position = uVP * vec4(aPos, 1.0); }`;\nconst LINE_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = uColor; }`;\n\nconst BOX_EDGES = new Float32Array([\n -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1,\n -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, -1, 1,\n -1, -1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, 1,\n]);\n\ninterface Label { p: [number, number, number]; text: string; title?: boolean }\n\n/** A 3D scatter/surface plot with an orbit camera, axis ticks, and lighting. */\nexport class Plot3D {\n private container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private displayCtx: CanvasRenderingContext2D;\n private gl: WebGL2RenderingContext;\n private sharedCanvas: HTMLCanvasElement;\n private layers: Layer3D[] = [];\n private normalize: Mat4 = scaleTranslate([1, 1, 1], [0, 0, 0]);\n private dataBounds: Bounds3 | null = null;\n private bg: [number, number, number, number];\n private dpr = 1;\n\n private azimuth: number;\n private elevation: number;\n private distance: number;\n private axisLabels: { x?: string; y?: string; z?: string };\n private resizeObserver: ResizeObserver;\n private frameRequested = false;\n\n private lineProgram: WebGLProgram;\n private lineUniforms: Record<string, WebGLUniformLocation | null>;\n private boxVao: WebGLVertexArrayObject;\n private boxBuf: WebGLBuffer;\n private tickVao: WebGLVertexArrayObject;\n private tickBuf: WebGLBuffer;\n private tickCount = 0;\n private labels: Label[] = [];\n\n // Lighting.\n private lightAz = 0.9;\n private lightEl = 0.9;\n private ambient = 0.35;\n private controlsEl: HTMLElement | null = null;\n\n constructor(container: HTMLElement, options: Plot3DOptions = {}) {\n this.container = container;\n if (getComputedStyle(container).position === \"static\") container.style.position = \"relative\";\n this.canvas = document.createElement(\"canvas\");\n Object.assign(this.canvas.style, { position: \"absolute\", inset: \"0\", width: \"100%\", height: \"100%\" } as CSSStyleDeclaration);\n container.appendChild(this.canvas);\n this.displayCtx = this.canvas.getContext(\"2d\")!;\n const s = getSharedGL();\n this.gl = s.gl;\n this.sharedCanvas = s.canvas;\n this.bg = options.background ?? [0.04, 0.06, 0.13, 1];\n this.azimuth = options.azimuth ?? 0.7;\n this.elevation = options.elevation ?? 0.5;\n this.distance = options.distance ?? 3.6;\n this.axisLabels = options.axisLabels ?? {};\n\n this.lineProgram = createProgram(this.gl, LINE_VERT, LINE_FRAG);\n this.lineUniforms = uniformLocations(this.gl, this.lineProgram, [\"uVP\", \"uColor\"]);\n this.boxVao = this.gl.createVertexArray()!;\n this.boxBuf = this.gl.createBuffer()!;\n this.bindLineVao(this.boxVao, this.boxBuf, BOX_EDGES);\n this.tickVao = this.gl.createVertexArray()!;\n this.tickBuf = this.gl.createBuffer()!;\n this.bindLineVao(this.tickVao, this.tickBuf, new Float32Array(0));\n\n if (options.lightControls) this.buildControls();\n\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(container);\n this.attachControls();\n this.resize();\n }\n\n private bindLineVao(vao: WebGLVertexArrayObject, buf: WebGLBuffer, data: Float32Array): void {\n const gl = this.gl;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n }\n\n addSurface(opts: SurfaceOptions): SurfaceLayer {\n const l = new SurfaceLayer(this.gl, opts);\n l.setLight(this.lightDir(), this.ambient);\n this.layers.push(l);\n this.recompute();\n this.requestRender();\n return l;\n }\n\n addPointCloud(opts: PointCloudOptions): PointCloudLayer {\n const l = new PointCloudLayer(this.gl, opts);\n this.layers.push(l);\n this.recompute();\n this.requestRender();\n return l;\n }\n\n /** Update the light direction (azimuth/elevation, radians) and ambient (0..1). */\n setLight(params: { azimuth?: number; elevation?: number; ambient?: number }): void {\n if (params.azimuth != null) this.lightAz = params.azimuth;\n if (params.elevation != null) this.lightEl = params.elevation;\n if (params.ambient != null) this.ambient = params.ambient;\n const dir = this.lightDir();\n for (const l of this.layers) {\n if (\"setLight\" in l) (l as SurfaceLayer).setLight(dir, this.ambient);\n }\n this.requestRender();\n }\n\n private lightDir(): [number, number, number] {\n const el = this.lightEl, az = this.lightAz;\n return [Math.cos(el) * Math.cos(az), Math.sin(el), Math.cos(el) * Math.sin(az)];\n }\n\n destroy(): void {\n this.resizeObserver.disconnect();\n for (const l of this.layers) l.dispose();\n this.gl.deleteProgram(this.lineProgram);\n this.gl.deleteVertexArray(this.boxVao);\n this.gl.deleteVertexArray(this.tickVao);\n this.gl.deleteBuffer(this.boxBuf);\n this.gl.deleteBuffer(this.tickBuf);\n this.controlsEl?.remove();\n this.container.removeChild(this.canvas);\n }\n\n private recompute(): void {\n let b: Bounds3 | null = null;\n for (const l of this.layers) {\n const lb = l.bounds3();\n if (!lb) continue;\n b = b ? {\n x: [Math.min(b.x[0], lb.x[0]), Math.max(b.x[1], lb.x[1])],\n y: [Math.min(b.y[0], lb.y[0]), Math.max(b.y[1], lb.y[1])],\n z: [Math.min(b.z[0], lb.z[0]), Math.max(b.z[1], lb.z[1])],\n } : lb;\n }\n if (!b) return;\n this.dataBounds = b;\n const axis = (r: Range): [number, number] => {\n const span = r[1] - r[0];\n return span === 0 ? [1, -r[0]] : [2 / span, -(r[1] + r[0]) / span];\n };\n const [sx, tx] = axis(b.x), [sy, ty] = axis(b.y), [sz, tz] = axis(b.z);\n this.normalize = scaleTranslate([sx, sy, sz], [tx, ty, tz]);\n this.buildAxes();\n }\n\n /** Build tick-mark line geometry + tick/title labels from the data bounds. */\n private buildAxes(): void {\n const b = this.dataBounds;\n if (!b) return;\n const cube = (r: Range, v: number) => (2 * (v - r[0])) / ((r[1] - r[0]) || 1) - 1;\n const seg: number[] = [];\n const labels: Label[] = [];\n const mark = (x0: number, y0: number, z0: number, x1: number, y1: number, z1: number) =>\n seg.push(x0, y0, z0, x1, y1, z1);\n\n for (const t of autoTicks(b.x[0], b.x[1], 5)) {\n const cx = cube(b.x, t.value);\n mark(cx, -1, -1, cx, -1, -1.06);\n labels.push({ p: [cx, -1, -1.16], text: defaultFormat(t.value) });\n }\n for (const t of autoTicks(b.y[0], b.y[1], 5)) {\n const cy = cube(b.y, t.value);\n mark(-1, cy, -1, -1.06, cy, -1);\n labels.push({ p: [-1.16, cy, -1], text: defaultFormat(t.value) });\n }\n for (const t of autoTicks(b.z[0], b.z[1], 5)) {\n const cz = cube(b.z, t.value);\n mark(-1, -1, cz, -1.06, -1, cz);\n labels.push({ p: [-1.16, -1, cz], text: defaultFormat(t.value) });\n }\n if (this.axisLabels.x) labels.push({ p: [0, -1.25, -1.3], text: this.axisLabels.x, title: true });\n if (this.axisLabels.y) labels.push({ p: [-1.35, 0, -1], text: this.axisLabels.y, title: true });\n if (this.axisLabels.z) labels.push({ p: [-1.3, -1.25, 0], text: this.axisLabels.z, title: true });\n\n this.labels = labels;\n this.tickCount = seg.length / 3;\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.tickBuf);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(seg), this.gl.STATIC_DRAW);\n }\n\n private resize(): void {\n this.dpr = window.devicePixelRatio || 1;\n const w = this.container.clientWidth, h = this.container.clientHeight;\n this.canvas.width = Math.max(1, Math.round(w * this.dpr));\n this.canvas.height = Math.max(1, Math.round(h * this.dpr));\n this.render();\n }\n\n requestRender(): void {\n if (this.frameRequested) return;\n this.frameRequested = true;\n requestAnimationFrame(() => { this.frameRequested = false; this.render(); });\n }\n\n private viewProj(): { vp: Mat4; mvp: Mat4 } {\n const aspect = this.canvas.width / Math.max(1, this.canvas.height);\n const proj = perspective((50 * Math.PI) / 180, aspect, 0.01, 100);\n const el = Math.max(-1.5, Math.min(1.5, this.elevation));\n const eye: [number, number, number] = [\n this.distance * Math.cos(el) * Math.sin(this.azimuth),\n this.distance * Math.sin(el),\n this.distance * Math.cos(el) * Math.cos(this.azimuth),\n ];\n const view = lookAt(eye, [0, 0, 0], [0, 1, 0]);\n const vp = multiply(proj, view);\n return { vp, mvp: multiply(vp, this.normalize) };\n }\n\n render(): void {\n const gl = this.gl;\n const w = this.canvas.width, h = this.canvas.height;\n sizeShared(gl, w, h);\n begin3D(gl);\n gl.viewport(0, 0, w, h);\n gl.clearColor(this.bg[0], this.bg[1], this.bg[2], this.bg[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n const { vp, mvp } = this.viewProj();\n\n gl.useProgram(this.lineProgram);\n gl.uniformMatrix4fv(this.lineUniforms.uVP!, false, vp);\n // Bounding box.\n gl.uniform4f(this.lineUniforms.uColor!, 0.6, 0.65, 0.75, 0.4);\n gl.bindVertexArray(this.boxVao);\n gl.drawArrays(gl.LINES, 0, BOX_EDGES.length / 3);\n // Axis tick marks.\n if (this.tickCount > 0) {\n gl.uniform4f(this.lineUniforms.uColor!, 0.75, 0.8, 0.9, 0.8);\n gl.bindVertexArray(this.tickVao);\n gl.drawArrays(gl.LINES, 0, this.tickCount);\n }\n gl.bindVertexArray(null);\n\n for (const l of this.layers) l.draw(gl, mvp);\n\n // Blit WebGL result, then draw projected axis labels on top.\n this.displayCtx.clearRect(0, 0, w, h);\n this.displayCtx.drawImage(this.sharedCanvas, 0, 0);\n this.drawLabels(vp, w, h);\n }\n\n private drawLabels(vp: Mat4, w: number, h: number): void {\n if (this.labels.length === 0) return;\n const ctx = this.displayCtx;\n ctx.save();\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = \"#cbd5e1\";\n for (const lab of this.labels) {\n const c = transformPoint(vp, lab.p[0], lab.p[1], lab.p[2]);\n if (c[3] <= 0) continue;\n const sx = (c[0] / c[3] * 0.5 + 0.5) * w;\n const sy = (1 - (c[1] / c[3] * 0.5 + 0.5)) * h;\n ctx.font = `${(lab.title ? 13 : 11) * this.dpr}px system-ui, sans-serif`;\n ctx.fillStyle = lab.title ? \"#e2e8f0\" : \"#94a3b8\";\n ctx.fillText(lab.text, sx, sy);\n }\n ctx.restore();\n }\n\n private attachControls(): void {\n const el = this.canvas;\n el.style.touchAction = \"none\";\n el.style.cursor = \"grab\";\n let dragging = false, lastX = 0, lastY = 0;\n el.addEventListener(\"pointerdown\", (e) => {\n dragging = true; lastX = e.clientX; lastY = e.clientY;\n el.setPointerCapture(e.pointerId); el.style.cursor = \"grabbing\";\n });\n el.addEventListener(\"pointermove\", (e) => {\n if (!dragging) return;\n this.azimuth -= (e.clientX - lastX) * 0.01;\n this.elevation += (e.clientY - lastY) * 0.01;\n lastX = e.clientX; lastY = e.clientY;\n this.requestRender();\n });\n const end = (e: PointerEvent) => {\n dragging = false;\n if (el.hasPointerCapture(e.pointerId)) el.releasePointerCapture(e.pointerId);\n el.style.cursor = \"grab\";\n };\n el.addEventListener(\"pointerup\", end);\n el.addEventListener(\"pointercancel\", end);\n el.addEventListener(\"wheel\", (e) => {\n e.preventDefault();\n this.distance = Math.max(0.5, Math.min(20, this.distance * Math.exp(e.deltaY * 0.001)));\n this.requestRender();\n }, { passive: false });\n }\n\n private buildControls(): void {\n const panel = document.createElement(\"div\");\n Object.assign(panel.style, {\n position: \"absolute\", top: \"8px\", left: \"8px\", zIndex: \"5\",\n display: \"flex\", flexDirection: \"column\", gap: \"4px\",\n padding: \"8px 10px\", borderRadius: \"8px\",\n background: \"rgba(15,23,42,0.8)\", border: \"1px solid rgba(148,163,184,0.25)\",\n font: \"11px system-ui, sans-serif\", color: \"#cbd5e1\", backdropFilter: \"blur(6px)\",\n } as CSSStyleDeclaration);\n const row = (label: string, min: number, max: number, val: number, on: (v: number) => void) => {\n const wrap = document.createElement(\"label\");\n wrap.style.display = \"flex\";\n wrap.style.alignItems = \"center\";\n wrap.style.gap = \"6px\";\n const span = document.createElement(\"span\");\n span.textContent = label;\n span.style.width = \"48px\";\n const input = document.createElement(\"input\");\n input.type = \"range\";\n input.min = String(min); input.max = String(max); input.value = String(val);\n input.style.width = \"90px\";\n input.addEventListener(\"input\", () => on(parseFloat(input.value)));\n wrap.appendChild(span); wrap.appendChild(input);\n panel.appendChild(wrap);\n };\n row(\"light\", 0, 360, (this.lightAz * 180) / Math.PI, (v) => this.setLight({ azimuth: (v * Math.PI) / 180 }));\n row(\"ambient\", 0, 100, this.ambient * 100, (v) => this.setLight({ ambient: v / 100 }));\n this.container.appendChild(panel);\n this.controlsEl = panel;\n }\n}\n"],"mappings":"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","names":["VERT","FRAG","programCache","getProgram","counter","lo","hi","bins","VERT","FRAG","programCache","getProgram","counter","FRAG","medianSpacing","counter","VERT","FRAG","programCache","getProgram","counter","SEG_CORNERS","cache","programs","counter","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter","programCache","VERT","FRAG","CORNERS","programCache","getProgram","counter","FRAG","SEG_CORNERS","cache","programs","counter","minX","maxX","minY","maxY","VERT","FRAG","CORNERS","programCache","getProgram","counter","SOLID_FRAG","SEG_CORNERS","QUAD_CORNERS","cache","programs","counter","normalize","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter"]}
1
+ {"version":3,"sources":["../src/axes/ticks.ts","../src/axes/axis.ts","../src/gl/shared.ts","../src/gl/context.ts","../src/gl/program.ts","../src/gl/transform.ts","../src/layers/area.ts","../src/layers/bar.ts","../src/stats/index.ts","../src/layers/box.ts","../src/layers/candlestick.ts","../src/color/colormap.ts","../src/layers/contour.ts","../src/layers/errorbar.ts","../src/layers/heatmap.ts","../src/layers/hexbin.ts","../src/layers/line-util.ts","../src/layers/gpu-decimate.ts","../src/layers/pick.ts","../src/layers/line.ts","../src/layers/quiver.ts","../src/layers/scatter.ts","../src/layers/stem.ts","../src/render/overlay.ts","../src/scales/scale.ts","../src/ui/toolbar.ts","../src/plot.ts","../src/polar/polar.ts","../src/plot3d/mat4.ts","../src/plot3d/pointcloud.ts","../src/plot3d/surface.ts","../src/plot3d/plot3d.ts"],"sourcesContent":["import type { Tick, TicksSpec } from \"../types.js\";\n\n/**\n * Produce a \"nice\" step for an interval, e.g. 1, 2, 5 × 10^n.\n * Classic Wilkinson-style rounding used by most plotting libraries.\n */\nfunction niceStep(rawStep: number): number {\n const mag = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const norm = rawStep / mag; // in [1, 10)\n let nice: number;\n if (norm < 1.5) nice = 1;\n else if (norm < 3) nice = 2;\n else if (norm < 7) nice = 5;\n else nice = 10;\n return nice * mag;\n}\n\n/**\n * Auto ticks for a linear axis using nice-number rounding.\n * Returns major ticks; minor ticks are added separately.\n */\nexport function autoTicks(min: number, max: number, target = 6): Tick[] {\n if (!isFinite(min) || !isFinite(max) || min === max) return [];\n const span = max - min;\n const step = niceStep(span / Math.max(1, target));\n const start = Math.ceil(min / step) * step;\n const ticks: Tick[] = [];\n // Guard against float drift accumulating over many steps.\n for (let i = 0; i < 1000; i++) {\n const v = start + i * step;\n if (v > max + step * 1e-6) break;\n // Snap tiny float errors to zero-ish clean values.\n ticks.push({ value: Math.abs(v) < step * 1e-6 ? 0 : v });\n }\n return ticks;\n}\n\n/** Insert `count` evenly spaced minor ticks between each pair of major ticks. */\nexport function withMinorTicks(major: Tick[], count: number): Tick[] {\n if (count <= 0 || major.length < 2) return major;\n const out: Tick[] = [];\n for (let i = 0; i < major.length; i++) {\n out.push(major[i]!);\n if (i < major.length - 1) {\n const a = major[i]!.value;\n const b = major[i + 1]!.value;\n const step = (b - a) / (count + 1);\n for (let k = 1; k <= count; k++) {\n out.push({ value: a + step * k, minor: true, grid: false });\n }\n }\n }\n return out;\n}\n\n/** Normalize a loose tick entry (number or partial Tick) into a full Tick. */\nfunction normalize(entry: number | Tick): Tick {\n return typeof entry === \"number\" ? { value: entry } : entry;\n}\n\n/**\n * Resolve a user `TicksSpec` (array | Tick[] | generator) against the current\n * axis range into a concrete, sorted Tick list. Returns `null` if no explicit\n * spec was given, signaling the caller to fall back to auto ticks.\n */\nexport function resolveTicks(\n spec: TicksSpec | undefined,\n min: number,\n max: number,\n): Tick[] | null {\n if (spec == null) return null;\n const raw = typeof spec === \"function\" ? spec(min, max) : spec;\n return raw.map(normalize).sort((a, b) => a.value - b.value);\n}\n\n/** Default number formatter: compact, avoids noisy trailing decimals. */\nexport function defaultFormat(value: number): string {\n if (value === 0) return \"0\";\n const abs = Math.abs(value);\n if (abs >= 1e6 || abs < 1e-4) return value.toExponential(1);\n // Up to 6 significant digits, trimmed.\n return parseFloat(value.toPrecision(6)).toString();\n}\n","import type { Scale } from \"../scales/scale.js\";\nimport type { AxisConfig, Tick } from \"../types.js\";\nimport { resolveTicks, withMinorTicks } from \"./ticks.js\";\n\n/**\n * Owns the tick configuration for one axis and resolves the final tick list\n * against a scale. Modes: auto (delegates to the scale), custom (array), or\n * generator (function of the range) — plus major/minor, per-tick labels, and\n * `addTicks` layering.\n */\nexport class Axis {\n config: AxisConfig;\n\n constructor(config: AxisConfig = {}) {\n this.config = config;\n }\n\n update(patch: Partial<AxisConfig>): void {\n this.config = { ...this.config, ...patch };\n }\n\n /** Resolve the concrete tick list (labels filled) for the scale's domain. */\n resolve(scale: Scale): Tick[] {\n const [min, max] = scale.domain;\n const explicit = resolveTicks(this.config.ticks, min, max);\n\n let ticks: Tick[];\n if (explicit) {\n ticks = explicit;\n } else {\n let major = scale.ticks();\n // Auto minor ticks only make sense for linear-style scales; log/time\n // scales already emit their own minor ticks.\n const minor = this.config.minorTicks;\n if (minor && scale.type === \"linear\") {\n major = withMinorTicks(major, minor === true ? 4 : minor);\n }\n if (this.config.addTicks?.length) {\n const extra = this.config.addTicks.map((e) =>\n typeof e === \"number\" ? { value: e } : e,\n );\n major = [...major, ...extra].sort((a, b) => a.value - b.value);\n }\n ticks = major;\n }\n\n const fmt = this.config.format ?? ((v: number) => scale.formatTick(v));\n return ticks\n .filter((t) => t.value >= min && t.value <= max)\n .map((t) => ({\n value: t.value,\n label: t.minor ? \"\" : (t.label ?? fmt(t.value)),\n minor: t.minor ?? false,\n grid: t.grid ?? !t.minor,\n }));\n }\n}\n","/**\n * A single process-wide WebGL2 context shared by every Plot / Plot3D.\n *\n * Browsers cap the number of simultaneous WebGL contexts (~16 in Chrome); one\n * context per chart quickly exceeds that and the browser silently evicts the\n * oldest contexts, leaving blank charts. Instead we keep ONE offscreen context,\n * render each chart's scene into it, and blit the result into that chart's own\n * lightweight 2D canvas. GPU resources (buffers, textures, programs) live in the\n * shared context, so layers created by different plots coexist fine.\n */\nlet shared: { canvas: HTMLCanvasElement; gl: WebGL2RenderingContext } | null = null;\n\nexport function getSharedGL(): { canvas: HTMLCanvasElement; gl: WebGL2RenderingContext } {\n if (shared) return shared;\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl2\", {\n antialias: true,\n premultipliedAlpha: true,\n alpha: true,\n // Required so the rendered frame survives long enough to be blitted out.\n preserveDrawingBuffer: true,\n depth: true,\n });\n if (!gl) throw new Error(\"WebGL2 is not supported in this environment\");\n shared = { canvas, gl };\n return shared;\n}\n\n/** Configure the shared context for 2D (blend on, depth off) rendering. */\nexport function begin2D(gl: WebGL2RenderingContext): void {\n gl.disable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n}\n\n/** Configure the shared context for 3D (depth on) rendering. */\nexport function begin3D(gl: WebGL2RenderingContext): void {\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n}\n\n/** Resize the shared canvas to the target device-pixel size (idempotent). */\nexport function sizeShared(gl: WebGL2RenderingContext, w: number, h: number): void {\n const c = gl.canvas as HTMLCanvasElement;\n if (c.width !== w) c.width = w;\n if (c.height !== h) c.height = h;\n}\n","export interface RenderContext {\n gl: WebGL2RenderingContext;\n /** CSS pixel width / height of the drawing area (the plot region). */\n width: number;\n height: number;\n /** devicePixelRatio in effect. */\n dpr: number;\n}\n\n/** Create a WebGL2 context configured for crisp 2D plotting. */\nexport function createGL(canvas: HTMLCanvasElement): WebGL2RenderingContext {\n const gl = canvas.getContext(\"webgl2\", {\n antialias: true,\n premultipliedAlpha: true,\n alpha: true,\n });\n if (!gl) throw new Error(\"WebGL2 is not supported in this environment\");\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n return gl;\n}\n\n/** Parse a CSS hex/rgb color string into normalized RGBA (0..1). */\nexport function parseColor(input: string): [number, number, number, number] {\n const s = input.trim();\n if (s.startsWith(\"#\")) {\n let hex = s.slice(1);\n if (hex.length === 3) hex = hex.split(\"\").map((c) => c + c).join(\"\");\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 = hex.length >= 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n const m = s.match(/rgba?\\(([^)]+)\\)/);\n if (m) {\n const parts = m[1]!.split(\",\").map((p) => parseFloat(p.trim()));\n return [(parts[0] ?? 0) / 255, (parts[1] ?? 0) / 255, (parts[2] ?? 0) / 255, parts[3] ?? 1];\n }\n return [0, 0, 0, 1];\n}\n\n/** Normalized RGBA (0..1) back to a CSS `rgba(...)` string. */\nexport function toColorCss(c: readonly [number, number, number, number]): string {\n const to255 = (v: number) => Math.round(v * 255);\n return `rgba(${to255(c[0])},${to255(c[1])},${to255(c[2])},${c[3]})`;\n}\n","/** Compile a single shader stage, throwing with the GLSL log on failure. */\nfunction compileShader(gl: WebGL2RenderingContext, type: number, source: string): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"Failed to create shader\");\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compile error:\\n${log}\\n---\\n${source}`);\n }\n return shader;\n}\n\n/** Compile + link a vertex/fragment program. */\nexport function createProgram(\n gl: WebGL2RenderingContext,\n vert: string,\n frag: string,\n): WebGLProgram {\n const vs = compileShader(gl, gl.VERTEX_SHADER, vert);\n const fs = compileShader(gl, gl.FRAGMENT_SHADER, frag);\n const program = gl.createProgram();\n if (!program) throw new Error(\"Failed to create program\");\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n throw new Error(`Program link error:\\n${log}`);\n }\n return program;\n}\n\n/** Cache uniform locations for a program by name. */\nexport function uniformLocations(\n gl: WebGL2RenderingContext,\n program: WebGLProgram,\n names: string[],\n): Record<string, WebGLUniformLocation | null> {\n const out: Record<string, WebGLUniformLocation | null> = {};\n for (const name of names) out[name] = gl.getUniformLocation(program, name);\n return out;\n}\n","/**\n * Shared data→clip transform used by every layer's vertex shader.\n *\n * Two subtleties it handles:\n * - **Log axes** — when `uLogX/uLogY` is set, the real coordinate is\n * log10-transformed on the GPU.\n * - **Float32 precision** — vertex buffers are float32 (~7 significant digits),\n * which is not enough for large values like epoch-millisecond timestamps.\n * Layers upload coordinates *relative to a reference* (`x - xRef`) and pass\n * `uXRef`; the domain is passed in the same offset space, so the subtraction\n * that computes the normalized position never suffers catastrophic\n * cancellation. For log axes the reference is added back before log10.\n */\nexport const TRANSFORM_GLSL = /* glsl */ `\nuniform vec2 uDomainX; // linear: (lo-ref, hi-ref) ; log: (log10 lo, log10 hi)\nuniform vec2 uDomainY;\nuniform float uXRef;\nuniform float uYRef;\nuniform float uLogX; // >0.5 => log axis\nuniform float uLogY;\n\nvec2 dataToNorm(vec2 p) {\n float cx = (uLogX > 0.5) ? log(p.x + uXRef) / 2.302585092994046 : p.x;\n float cy = (uLogY > 0.5) ? log(p.y + uYRef) / 2.302585092994046 : p.y;\n float nx = (cx - uDomainX.x) / (uDomainX.y - uDomainX.x);\n float ny = (cy - uDomainY.x) / (uDomainY.y - uDomainY.x);\n return vec2(nx, ny);\n}\n\nvec2 dataToClip(vec2 p) {\n return dataToNorm(p) * 2.0 - 1.0;\n}\n`;\n\n/** Per-axis view state handed to a layer each frame. `lo`/`hi` are raw data-space. */\nexport interface AxisFrame {\n lo: number;\n hi: number;\n log: boolean;\n}\n\nexport const TRANSFORM_UNIFORMS = [\n \"uDomainX\",\n \"uDomainY\",\n \"uXRef\",\n \"uYRef\",\n \"uLogX\",\n \"uLogY\",\n] as const;\n\n/** Set the shared transform uniforms for a layer given its per-axis references. */\nexport function setTransformUniforms(\n gl: WebGL2RenderingContext,\n u: Record<string, WebGLUniformLocation | null>,\n x: AxisFrame,\n y: AxisFrame,\n xRef: number,\n yRef: number,\n): void {\n const [lox, hix] = x.log ? [Math.log10(x.lo), Math.log10(x.hi)] : [x.lo - xRef, x.hi - xRef];\n const [loy, hiy] = y.log ? [Math.log10(y.lo), Math.log10(y.hi)] : [y.lo - yRef, y.hi - yRef];\n gl.uniform2f(u.uDomainX!, lox, hix);\n gl.uniform2f(u.uDomainY!, loy, hiy);\n gl.uniform1f(u.uXRef!, xRef);\n gl.uniform1f(u.uYRef!, yRef);\n gl.uniform1f(u.uLogX!, x.log ? 1 : 0);\n gl.uniform1f(u.uLogY!, y.log ? 1 : 0);\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface AreaOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Lower edge(s). Number or per-point array — pass cumulative to stack. */\n base?: number | ArrayLike<number>;\n color?: string | Color;\n name?: string;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos; // offset data space\n${TRANSFORM_GLSL}\nvoid main() { gl_Position = vec4(dataToClip(aPos), 0.0, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(uColor.rgb * uColor.a, uColor.a); }`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class AreaLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private vertexCount: number;\n private color: Color;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: AreaOptions) {\n this.id = `area-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n const colorInput = opts.color ?? \"rgba(59,130,246,0.4)\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.vertexCount = n * 2;\n const baseAt = (i: number): number =>\n opts.base == null ? 0 : typeof opts.base === \"number\" ? opts.base : opts.base[i]!;\n\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n // Triangle strip: alternate base and top vertices per x.\n const data = new Float32Array(n * 4);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, b = baseAt(i), top = opts.y[i]!;\n data[i * 4] = x - this.xRef;\n data[i * 4 + 1] = b - this.yRef;\n data[i * 4 + 2] = x - this.xRef;\n data[i * 4 + 3] = top - this.yRef;\n minX = Math.min(minX, x); maxX = Math.max(maxX, x);\n minY = Math.min(minY, b, top); maxY = Math.max(maxY, b, top);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uColor\"]);\n }\n\n /** Replace the area data and re-upload (for streaming). */\n setData(x: ArrayLike<number>, y: ArrayLike<number>, base?: number | ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n this.vertexCount = n * 2;\n const baseAt = (i: number): number =>\n base == null ? 0 : typeof base === \"number\" ? base : base[i]!;\n this.xRef = n > 0 ? x[0]! : 0;\n this.yRef = n > 0 ? y[0]! : 0;\n const data = new Float32Array(n * 4);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const vx = x[i]!, b = baseAt(i), top = y[i]!;\n data[i * 4] = vx - this.xRef; data[i * 4 + 1] = b - this.yRef;\n data[i * 4 + 2] = vx - this.xRef; data[i * 4 + 3] = top - this.yRef;\n if (vx < minX) minX = vx; if (vx > maxX) maxX = vx;\n minY = Math.min(minY, b, top); maxY = Math.max(maxY, b, top);\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, data, this.gl.DYNAMIC_DRAW);\n }\n\n bounds() {\n if (this.vertexCount === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.vertexCount < 4) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.vertexCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface BarOptions {\n /** Bar center positions (data space). */\n x: ArrayLike<number>;\n /** Bar top values. */\n y: ArrayLike<number>;\n /** Baseline(s). Number or per-bar array — pass cumulative values to stack. */\n base?: number | ArrayLike<number>;\n /** Bar width in data units. Defaults to 80% of the median spacing. */\n width?: number;\n /** Shift bars by this many data units (use for grouped bars). */\n offset?: number;\n color?: string | Color;\n name?: string;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit rect [0,1]^2\nlayout(location = 1) in vec4 aRect; // (x0,y0,x1,y1) offset data space\n${TRANSFORM_GLSL}\nvoid main() {\n vec2 p = mix(aRect.xy, aRect.zw, aCorner);\n gl_Position = vec4(dataToClip(p), 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(uColor.rgb * uColor.a, uColor.a); }`;\n\nconst CORNERS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1]);\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nfunction medianSpacing(x: ArrayLike<number>, n: number): number {\n if (n < 2) return 1;\n const diffs: number[] = [];\n for (let i = 1; i < n; i++) diffs.push(Math.abs(x[i]! - x[i - 1]!));\n diffs.sort((a, b) => a - b);\n return diffs[Math.floor(diffs.length / 2)] || 1;\n}\n\nlet counter = 0;\n\nexport class BarLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private count: number;\n private color: Color;\n private barWidth: number;\n private offset: number;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: BarOptions) {\n this.id = `bar-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.count = n;\n this.barWidth = opts.width ?? medianSpacing(opts.x, n) * 0.8;\n this.offset = opts.offset ?? 0;\n const rects = this.buildRects(opts.x, opts.y, opts.base, n);\n\n const vao = gl.createVertexArray()!;\n this.vao = vao;\n gl.bindVertexArray(vao);\n const cornerBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n const rectBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, rectBuf);\n gl.bufferData(gl.ARRAY_BUFFER, rects, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindVertexArray(null);\n this.buffers = [cornerBuf, rectBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uColor\"]);\n }\n\n private buildRects(\n x: ArrayLike<number>, y: ArrayLike<number>,\n base: number | ArrayLike<number> | undefined, n: number,\n ): Float32Array {\n const width = this.barWidth, off = this.offset;\n const baseAt = (i: number): number =>\n base == null ? 0 : typeof base === \"number\" ? base : base[i]!;\n this.xRef = n > 0 ? x[0]! : 0;\n this.yRef = n > 0 ? y[0]! : 0;\n const rects = new Float32Array(n * 4);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const cx = x[i]! + off;\n const x0 = cx - width / 2, x1 = cx + width / 2;\n const b = baseAt(i), top = y[i]!;\n rects[i * 4] = x0 - this.xRef;\n rects[i * 4 + 1] = b - this.yRef;\n rects[i * 4 + 2] = x1 - this.xRef;\n rects[i * 4 + 3] = top - this.yRef;\n minX = Math.min(minX, x0); maxX = Math.max(maxX, x1);\n minY = Math.min(minY, b, top); maxY = Math.max(maxY, b, top);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n return rects;\n }\n\n /** Replace bar values and re-upload (for streaming). */\n setData(x: ArrayLike<number>, y: ArrayLike<number>, base?: number | ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n this.count = n;\n const rects = this.buildRects(x, y, base, n);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffers[1]!);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, rects, this.gl.DYNAMIC_DRAW);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.bindVertexArray(this.vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","/** Pure statistics helpers backing the histogram, box, and violin layers. */\n\nexport interface Histogram {\n edges: Float64Array;\n counts: Float64Array;\n centers: Float64Array;\n binWidth: number;\n}\n\n/** Bin `values` into `bins` equal-width buckets (or use explicit `edges`). */\nexport function histogram(\n values: ArrayLike<number>,\n opts: { bins?: number; edges?: ArrayLike<number>; range?: [number, number] } = {},\n): Histogram {\n const n = values.length;\n let edges: Float64Array;\n if (opts.edges) {\n edges = Float64Array.from(opts.edges as ArrayLike<number>);\n } else {\n let lo = opts.range?.[0] ?? Infinity;\n let hi = opts.range?.[1] ?? -Infinity;\n if (!opts.range) {\n for (let i = 0; i < n; i++) {\n const v = values[i]!;\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n if (!isFinite(lo) || !isFinite(hi) || lo === hi) {\n lo = (lo || 0) - 0.5;\n hi = (hi || 0) + 0.5;\n }\n // Sturges' rule as a sane default bin count.\n const bins = opts.bins ?? Math.max(1, Math.ceil(Math.log2(n || 1) + 1));\n edges = new Float64Array(bins + 1);\n for (let i = 0; i <= bins; i++) edges[i] = lo + ((hi - lo) * i) / bins;\n }\n\n const bins = edges.length - 1;\n const counts = new Float64Array(bins);\n const lo = edges[0]!, hi = edges[bins]!;\n const width = (hi - lo) / bins;\n for (let i = 0; i < n; i++) {\n const v = values[i]!;\n if (v < lo || v > hi) continue;\n let b = Math.floor((v - lo) / width);\n if (b >= bins) b = bins - 1; // include the right edge\n counts[b]! += 1;\n }\n const centers = new Float64Array(bins);\n for (let i = 0; i < bins; i++) centers[i] = (edges[i]! + edges[i + 1]!) / 2;\n return { edges, counts, centers, binWidth: width };\n}\n\n/** Quantile of a *sorted* array via linear interpolation (type-7, like NumPy). */\nexport function quantileSorted(sorted: ArrayLike<number>, q: number): number {\n const n = sorted.length;\n if (n === 0) return NaN;\n if (n === 1) return sorted[0]!;\n const pos = (n - 1) * q;\n const lo = Math.floor(pos);\n const frac = pos - lo;\n const a = sorted[lo]!;\n const b = sorted[Math.min(n - 1, lo + 1)]!;\n return a + (b - a) * frac;\n}\n\nexport interface BoxStats {\n min: number;\n q1: number;\n median: number;\n q3: number;\n max: number;\n /** Whisker ends: furthest points within 1.5·IQR of the quartiles. */\n whiskerLo: number;\n whiskerHi: number;\n outliers: number[];\n}\n\n/** Tukey box-plot statistics for a set of values. */\nexport function boxStats(values: ArrayLike<number>): BoxStats {\n const sorted = Float64Array.from(values as ArrayLike<number>).sort();\n const n = sorted.length;\n const q1 = quantileSorted(sorted, 0.25);\n const median = quantileSorted(sorted, 0.5);\n const q3 = quantileSorted(sorted, 0.75);\n const iqr = q3 - q1;\n const fenceLo = q1 - 1.5 * iqr;\n const fenceHi = q3 + 1.5 * iqr;\n let whiskerLo = q1, whiskerHi = q3;\n const outliers: number[] = [];\n for (let i = 0; i < n; i++) {\n const v = sorted[i]!;\n if (v < fenceLo || v > fenceHi) outliers.push(v);\n else {\n if (v < whiskerLo) whiskerLo = v;\n if (v > whiskerHi) whiskerHi = v;\n }\n }\n return {\n min: n ? sorted[0]! : NaN,\n q1, median, q3,\n max: n ? sorted[n - 1]! : NaN,\n whiskerLo, whiskerHi, outliers,\n };\n}\n\nfunction stddev(values: ArrayLike<number>, mean: number): number {\n const n = values.length;\n let s = 0;\n for (let i = 0; i < n; i++) {\n const d = values[i]! - mean;\n s += d * d;\n }\n return Math.sqrt(s / Math.max(1, n - 1));\n}\n\n/** In-place iterative radix-2 Cooley–Tukey FFT (length must be a power of two). */\nexport function fft(re: Float64Array, im: Float64Array): void {\n const n = re.length;\n for (let i = 1, j = 0; i < n; i++) {\n let bit = n >> 1;\n for (; j & bit; bit >>= 1) j ^= bit;\n j ^= bit;\n if (i < j) {\n [re[i], re[j]] = [re[j]!, re[i]!];\n [im[i], im[j]] = [im[j]!, im[i]!];\n }\n }\n for (let len = 2; len <= n; len <<= 1) {\n const ang = (-2 * Math.PI) / len;\n const wRe = Math.cos(ang), wIm = Math.sin(ang);\n for (let i = 0; i < n; i += len) {\n let curRe = 1, curIm = 0;\n for (let k = 0; k < len / 2; k++) {\n const a = i + k, b = i + k + len / 2;\n const tRe = re[b]! * curRe - im[b]! * curIm;\n const tIm = re[b]! * curIm + im[b]! * curRe;\n re[b] = re[a]! - tRe; im[b] = im[a]! - tIm;\n re[a] = re[a]! + tRe; im[a] = im[a]! + tIm;\n const nRe = curRe * wRe - curIm * wIm;\n curIm = curRe * wIm + curIm * wRe;\n curRe = nRe;\n }\n }\n }\n}\n\nexport interface Spectrogram {\n /** Row-major magnitudes (dB), rows = freq bins (low at row 0), cols = frames. */\n values: Float64Array;\n cols: number;\n rows: number;\n extent: { x: [number, number]; y: [number, number] };\n}\n\n/** Short-time Fourier transform of a real signal → a time×frequency dB grid. */\nexport function spectrogram(\n signal: ArrayLike<number>,\n opts: { fftSize?: number; hop?: number; sampleRate?: number } = {},\n): Spectrogram {\n const fftSize = opts.fftSize ?? 256;\n const hop = opts.hop ?? fftSize >> 1;\n const sr = opts.sampleRate ?? 1;\n const N = signal.length;\n const frames = Math.max(1, Math.floor((N - fftSize) / hop) + 1);\n const bins = fftSize >> 1;\n const values = new Float64Array(bins * frames);\n const re = new Float64Array(fftSize);\n const im = new Float64Array(fftSize);\n for (let f = 0; f < frames; f++) {\n const start = f * hop;\n for (let i = 0; i < fftSize; i++) {\n const w = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / (fftSize - 1)); // Hann\n re[i] = (signal[start + i] ?? 0) * w;\n im[i] = 0;\n }\n fft(re, im);\n for (let b = 0; b < bins; b++) {\n const mag = Math.hypot(re[b]!, im[b]!) / fftSize;\n values[b * frames + f] = 20 * Math.log10(mag + 1e-9); // dB\n }\n }\n return {\n values,\n cols: frames,\n rows: bins,\n extent: { x: [0, N / sr], y: [0, sr / 2] },\n };\n}\n\nexport interface Density {\n xs: Float64Array;\n ys: Float64Array;\n}\n\n/**\n * Gaussian kernel density estimate over `points` grid samples in [lo, hi].\n * Bandwidth defaults to Silverman's rule of thumb.\n */\nexport function kde(\n values: ArrayLike<number>,\n lo: number,\n hi: number,\n points = 64,\n bandwidth?: number,\n): Density {\n const n = values.length;\n let mean = 0;\n for (let i = 0; i < n; i++) mean += values[i]!;\n mean /= Math.max(1, n);\n const sd = stddev(values, mean) || 1;\n const h = bandwidth ?? 1.06 * sd * Math.pow(Math.max(1, n), -0.2);\n const xs = new Float64Array(points);\n const ys = new Float64Array(points);\n const norm = 1 / (n * h * Math.sqrt(2 * Math.PI));\n for (let p = 0; p < points; p++) {\n const x = lo + ((hi - lo) * p) / (points - 1);\n let sum = 0;\n for (let i = 0; i < n; i++) {\n const u = (x - values[i]!) / h;\n sum += Math.exp(-0.5 * u * u);\n }\n xs[p] = x;\n ys[p] = sum * norm;\n }\n return { xs, ys };\n}\n","import { parseColor } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport { boxStats, kde } from \"../stats/index.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface BoxGroup {\n /** X-axis center for this group. */\n position: number;\n values: ArrayLike<number>;\n color?: string | Color;\n label?: string;\n}\n\nexport interface BoxOptions {\n groups: BoxGroup[];\n /** Group width in data units. */\n width?: number;\n /** Draw the Tukey box + whiskers (default true). */\n box?: boolean;\n /** Draw a violin (KDE) shape behind/instead of the box (default false). */\n violin?: boolean;\n yAxis?: string;\n}\n\n// One program: per-vertex color, optional round points.\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos;\nlayout(location = 1) in vec4 aColor;\nuniform float uPointSize;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vColor = aColor;\n gl_PointSize = uPointSize;\n gl_Position = vec4(dataToClip(aPos), 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nuniform float uIsPoint;\nout vec4 outColor;\nvoid main() {\n if (uIsPoint > 0.5) {\n vec2 d = gl_PointCoord - 0.5;\n if (length(d) > 0.5) discard;\n }\n outColor = vec4(vColor.rgb * vColor.a, vColor.a);\n}`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nconst DEFAULT_COLOR = \"#3b82f6\";\n\nlet counter = 0;\n\n/** Interleaved [x, y, r, g, b, a] vertex pusher. */\nclass Mesh {\n data: number[] = [];\n push(x: number, y: number, c: Color): void {\n this.data.push(x, y, c[0], c[1], c[2], c[3]);\n }\n get count(): number {\n return this.data.length / 6;\n }\n}\n\nexport class BoxLayer implements Layer {\n readonly id: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n private triCount: number;\n private lineStart: number;\n private lineCount: number;\n private pointStart: number;\n private pointCount: number;\n\n constructor(gl: WebGL2RenderingContext, opts: BoxOptions) {\n this.id = `box-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.yAxis = opts.yAxis ?? \"y\";\n\n const groups = opts.groups;\n const width = opts.width ?? 0.6;\n const hw = width / 2;\n const showBox = opts.box !== false;\n const showViolin = opts.violin === true;\n\n this.xRef = groups.length ? groups[0]!.position : 0;\n // yRef from the first datum we can find.\n this.yRef = groups.length && groups[0]!.values.length ? groups[0]!.values[0]! : 0;\n\n const tris = new Mesh();\n const lines = new Mesh();\n const points = new Mesh();\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n const track = (x: number, y: number) => {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n };\n const ox = (v: number) => v - this.xRef;\n const oy = (v: number) => v - this.yRef;\n\n for (const g of groups) {\n const cx = g.position;\n const base = Array.isArray(g.color) ? (g.color as Color) : parseColor((g.color as string) ?? DEFAULT_COLOR);\n const fill: Color = [base[0], base[1], base[2], 0.35];\n const stroke: Color = [base[0], base[1], base[2], 1];\n const s = boxStats(g.values);\n track(cx - hw, s.whiskerLo);\n track(cx + hw, s.whiskerHi);\n\n if (showViolin) {\n const lo = s.min, hi = s.max;\n const d = kde(g.values, lo, hi, 48);\n let maxD = 0;\n for (let i = 0; i < d.ys.length; i++) maxD = Math.max(maxD, d.ys[i]!);\n maxD = maxD || 1;\n // Triangle strip (as triangles) mirrored around cx.\n for (let i = 0; i < d.xs.length - 1; i++) {\n const w0 = (d.ys[i]! / maxD) * hw;\n const w1 = (d.ys[i + 1]! / maxD) * hw;\n const y0 = d.xs[i]!, y1 = d.xs[i + 1]!;\n // left and right quads\n tris.push(ox(cx - w0), oy(y0), fill); tris.push(ox(cx + w0), oy(y0), fill); tris.push(ox(cx + w1), oy(y1), fill);\n tris.push(ox(cx - w0), oy(y0), fill); tris.push(ox(cx + w1), oy(y1), fill); tris.push(ox(cx - w1), oy(y1), fill);\n }\n track(cx - hw, lo); track(cx + hw, hi);\n }\n\n if (showBox) {\n // Box body (q1..q3).\n const x0 = ox(cx - hw), x1 = ox(cx + hw);\n const yq1 = oy(s.q1), yq3 = oy(s.q3);\n if (!showViolin) {\n tris.push(x0, yq1, fill); tris.push(x1, yq1, fill); tris.push(x1, yq3, fill);\n tris.push(x0, yq1, fill); tris.push(x1, yq3, fill); tris.push(x0, yq3, fill);\n }\n // Box outline.\n const edge: [number, number, number, number][] = [\n [x0, yq1, x1, yq1], [x1, yq1, x1, yq3], [x1, yq3, x0, yq3], [x0, yq3, x0, yq1],\n ];\n for (const [ax, ay, bx, by] of edge) { lines.push(ax, ay, stroke); lines.push(bx, by, stroke); }\n // Median.\n const ym = oy(s.median);\n lines.push(x0, ym, stroke); lines.push(x1, ym, stroke);\n // Whiskers + caps.\n const cxo = ox(cx);\n lines.push(cxo, oy(s.q3), stroke); lines.push(cxo, oy(s.whiskerHi), stroke);\n lines.push(cxo, oy(s.q1), stroke); lines.push(cxo, oy(s.whiskerLo), stroke);\n const capHw = hw * 0.5;\n lines.push(ox(cx - capHw), oy(s.whiskerHi), stroke); lines.push(ox(cx + capHw), oy(s.whiskerHi), stroke);\n lines.push(ox(cx - capHw), oy(s.whiskerLo), stroke); lines.push(ox(cx + capHw), oy(s.whiskerLo), stroke);\n // Outliers.\n for (const v of s.outliers) { points.push(cxo, oy(v), stroke); track(cx, v); }\n }\n }\n\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const all = [...tris.data, ...lines.data, ...points.data];\n this.triCount = tris.count;\n this.lineStart = tris.count;\n this.lineCount = lines.count;\n this.pointStart = tris.count + lines.count;\n this.pointCount = points.count;\n\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(all), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 24, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 24, 8);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uPointSize\", \"uIsPoint\"]);\n }\n\n bounds() {\n if (this.triCount + this.lineCount + this.pointCount === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform1f(this.uniforms.uPointSize!, 5 * state.dpr);\n gl.bindVertexArray(this.vao);\n if (this.triCount > 0) {\n gl.uniform1f(this.uniforms.uIsPoint!, 0);\n gl.drawArrays(gl.TRIANGLES, 0, this.triCount);\n }\n if (this.lineCount > 0) {\n gl.uniform1f(this.uniforms.uIsPoint!, 0);\n gl.drawArrays(gl.LINES, this.lineStart, this.lineCount);\n }\n if (this.pointCount > 0) {\n gl.uniform1f(this.uniforms.uIsPoint!, 1);\n gl.drawArrays(gl.POINTS, this.pointStart, this.pointCount);\n }\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface CandlestickOptions {\n /** Candle positions (data space — e.g. epoch ms on a time axis). */\n x: ArrayLike<number>;\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n /** Body width in data units. Defaults to 70% of the median spacing. */\n width?: number;\n /** Close ≥ open color. Default green. */\n upColor?: string | Color;\n /** Close < open color. Default red. */\n downColor?: string | Color;\n /** Wick thickness in CSS px. Default 1.5. */\n wickWidth?: number;\n name?: string;\n yAxis?: string;\n}\n\n// Body: an instanced data-space rectangle with a per-candle color.\nconst BODY_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit rect [0,1]^2\nlayout(location = 1) in vec4 aRect; // (x0,y0,x1,y1) offset data space\nlayout(location = 2) in vec4 aColor;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vec2 p = mix(aRect.xy, aRect.zw, aCorner);\n vColor = aColor;\n gl_Position = vec4(dataToClip(p), 0.0, 1.0);\n}`;\n\n// Wick: a data-space low->high segment, pixel-thick, per-candle color.\nconst WICK_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec4 aSeg; // (x0,y0,x1,y1) offset data space\nlayout(location = 2) in vec4 aColor;\nuniform vec2 uResolution;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vec2 s0 = (dataToClip(aSeg.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aSeg.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n vec2 pos = mix(s0, s1, aCorner.x) + nrm * (aCorner.y * uWidth * 0.5);\n vColor = aColor;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor.rgb * vColor.a, vColor.a); }`;\n\nconst RECT_CORNERS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1]);\nconst SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\n\ntype Key = \"body\" | \"wick\";\nconst cache = new WeakMap<WebGL2RenderingContext, Record<Key, WebGLProgram>>();\nfunction programs(gl: WebGL2RenderingContext): Record<Key, WebGLProgram> {\n let p = cache.get(gl);\n if (!p) {\n p = { body: createProgram(gl, BODY_VERT, FRAG), wick: createProgram(gl, WICK_VERT, FRAG) };\n cache.set(gl, p);\n }\n return p;\n}\n\nfunction medianSpacing(x: ArrayLike<number>, n: number): number {\n if (n < 2) return 1;\n const diffs: number[] = [];\n for (let i = 1; i < n; i++) diffs.push(Math.abs(x[i]! - x[i - 1]!));\n diffs.sort((a, b) => a - b);\n return diffs[Math.floor(diffs.length / 2)] || 1;\n}\n\nlet counter = 0;\n\nexport class CandlestickLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private progs: Record<Key, WebGLProgram>;\n private bodyVao: WebGLVertexArrayObject;\n private wickVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uBody: Record<string, WebGLUniformLocation | null>;\n private uWick: Record<string, WebGLUniformLocation | null>;\n private wickWidth: number;\n private count: number;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: CandlestickOptions) {\n this.id = `candlestick-${counter++}`;\n this.gl = gl;\n this.progs = programs(gl);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.wickWidth = opts.wickWidth ?? 1.5;\n\n const up = toColor(opts.upColor ?? \"#26a69a\");\n const down = toColor(opts.downColor ?? \"#ef5350\");\n this.colorCss = toColorCss(up);\n\n const n = Math.min(opts.x.length, opts.open.length, opts.high.length, opts.low.length, opts.close.length);\n this.count = n;\n const width = opts.width ?? medianSpacing(opts.x, n) * 0.7;\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.open[0]! : 0;\n\n const rects = new Float32Array(n * 4);\n const wicks = new Float32Array(n * 4);\n const colors = new Float32Array(n * 4);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const cx = opts.x[i]!, o = opts.open[i]!, h = opts.high[i]!, l = opts.low[i]!, c = opts.close[i]!;\n const x0 = cx - width / 2, x1 = cx + width / 2;\n rects[i * 4] = x0 - this.xRef; rects[i * 4 + 1] = o - this.yRef;\n rects[i * 4 + 2] = x1 - this.xRef; rects[i * 4 + 3] = c - this.yRef;\n wicks[i * 4] = cx - this.xRef; wicks[i * 4 + 1] = l - this.yRef;\n wicks[i * 4 + 2] = cx - this.xRef; wicks[i * 4 + 3] = h - this.yRef;\n const col = c >= o ? up : down;\n colors[i * 4] = col[0]; colors[i * 4 + 1] = col[1]; colors[i * 4 + 2] = col[2]; colors[i * 4 + 3] = col[3];\n minX = Math.min(minX, x0); maxX = Math.max(maxX, x1);\n minY = Math.min(minY, l); maxY = Math.max(maxY, h);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const cornerRect = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerRect);\n gl.bufferData(gl.ARRAY_BUFFER, RECT_CORNERS, gl.STATIC_DRAW);\n const cornerSeg = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.bufferData(gl.ARRAY_BUFFER, SEG_CORNERS, gl.STATIC_DRAW);\n const rectBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, rectBuf);\n gl.bufferData(gl.ARRAY_BUFFER, rects, gl.STATIC_DRAW);\n const wickBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, wickBuf);\n gl.bufferData(gl.ARRAY_BUFFER, wicks, gl.STATIC_DRAW);\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n this.buffers = [cornerRect, cornerSeg, rectBuf, wickBuf, colorBuf];\n\n this.bodyVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.bodyVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerRect);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, rectBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n\n this.wickVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.wickVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, wickBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n gl.bindVertexArray(null);\n\n this.uBody = uniformLocations(gl, this.progs.body, [...TRANSFORM_UNIFORMS]);\n this.uWick = uniformLocations(gl, this.progs.wick, [...TRANSFORM_UNIFORMS, \"uResolution\", \"uWidth\"]);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n\n gl.useProgram(this.progs.wick);\n setTransformUniforms(gl, this.uWick, state.x, state.y, this.xRef, this.yRef);\n gl.uniform2f(this.uWick.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uWick.uWidth!, this.wickWidth * state.dpr);\n gl.bindVertexArray(this.wickVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n\n gl.useProgram(this.progs.body);\n setTransformUniforms(gl, this.uBody, state.x, state.y, this.xRef, this.yRef);\n gl.bindVertexArray(this.bodyVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.bodyVao);\n this.gl.deleteVertexArray(this.wickVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n\nfunction toColor(input: string | Color): Color {\n return Array.isArray(input) ? (input as Color) : parseColor(input as string);\n}\n","export type RGB = [number, number, number];\nexport type ColormapName = \"viridis\" | \"plasma\" | \"coolwarm\" | \"grayscale\";\n\n// Coarse anchor points (perceptually-ordered) interpolated linearly.\nconst ANCHORS: Record<ColormapName, RGB[]> = {\n viridis: [\n [0.267, 0.005, 0.329], [0.283, 0.141, 0.458], [0.254, 0.265, 0.53],\n [0.207, 0.372, 0.553], [0.164, 0.471, 0.558], [0.128, 0.567, 0.551],\n [0.135, 0.659, 0.518], [0.267, 0.749, 0.441], [0.478, 0.821, 0.318],\n [0.741, 0.873, 0.15], [0.993, 0.906, 0.144],\n ],\n plasma: [\n [0.05, 0.03, 0.53], [0.29, 0.01, 0.63], [0.49, 0.01, 0.66],\n [0.66, 0.13, 0.59], [0.8, 0.28, 0.47], [0.9, 0.43, 0.35],\n [0.97, 0.6, 0.24], [0.99, 0.78, 0.15], [0.94, 0.98, 0.13],\n ],\n coolwarm: [\n [0.23, 0.3, 0.75], [0.55, 0.69, 0.98], [0.87, 0.87, 0.87],\n [0.96, 0.6, 0.48], [0.71, 0.02, 0.15],\n ],\n grayscale: [\n [0.05, 0.05, 0.05], [0.95, 0.95, 0.95],\n ],\n};\n\n/** Returns a `(t in 0..1) => RGB` sampler for the named colormap. */\nexport function colormap(name: ColormapName = \"viridis\"): (t: number) => RGB {\n const anchors = ANCHORS[name];\n const last = anchors.length - 1;\n return (t: number) => {\n const clamped = t <= 0 ? 0 : t >= 1 ? 1 : t;\n const pos = clamped * last;\n const i = Math.min(last - 1, Math.floor(pos));\n const f = pos - i;\n const a = anchors[i]!;\n const b = anchors[i + 1]!;\n return [a[0] + (b[0] - a[0]) * f, a[1] + (b[1] - a[1]) * f, a[2] + (b[2] - a[2]) * f];\n };\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface ContourOptions {\n /** Row-major grid values, length `cols * rows` (row 0 at the bottom). */\n values: ArrayLike<number>;\n cols: number;\n rows: number;\n extent: { x: Range; y: Range };\n /** Iso levels: an explicit list, or a count of evenly-spaced levels. */\n levels?: number[] | number;\n /** Single line color; if omitted, levels are colored by a colormap. */\n color?: string | Color;\n colormap?: ColormapName;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos;\nlayout(location = 1) in vec4 aColor;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() { vColor = aColor; gl_Position = vec4(dataToClip(aPos), 0.0, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor.rgb * vColor.a, vColor.a); }`;\n\n// Marching-squares: case → pairs of edges to connect (e0 bottom, e1 right, e2 top, e3 left).\nconst CASES: number[][][] = [\n [], [[3, 0]], [[0, 1]], [[3, 1]], [[1, 2]], [[3, 0], [1, 2]], [[0, 2]], [[3, 2]],\n [[2, 3]], [[2, 0]], [[0, 1], [2, 3]], [[2, 1]], [[1, 3]], [[1, 0]], [[0, 3]], [],\n];\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class ContourLayer implements Layer {\n readonly id: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private vertexCount: number;\n private xRef: number;\n private yRef: number;\n private ext: { x: Range; y: Range };\n\n constructor(gl: WebGL2RenderingContext, opts: ContourOptions) {\n this.id = `contour-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.yAxis = opts.yAxis ?? \"y\";\n this.ext = opts.extent;\n const { cols, rows, values } = opts;\n const [x0, x1] = opts.extent.x, [y0, y1] = opts.extent.y;\n this.xRef = x0; this.yRef = y0;\n\n let vmin = Infinity, vmax = -Infinity;\n for (let i = 0; i < values.length; i++) { const v = values[i]!; if (v < vmin) vmin = v; if (v > vmax) vmax = v; }\n const count = typeof opts.levels === \"number\" ? opts.levels : 8;\n const levels = Array.isArray(opts.levels)\n ? opts.levels\n : Array.from({ length: count }, (_, i) => vmin + ((vmax - vmin) * (i + 1)) / (count + 1));\n\n const cmap = colormap(opts.colormap ?? \"viridis\");\n const fixed = opts.color != null\n ? (Array.isArray(opts.color) ? (opts.color as Color) : parseColor(opts.color as string))\n : null;\n const gx = (c: number) => x0 + (c / (cols - 1)) * (x1 - x0) - this.xRef;\n const gy = (r: number) => y0 + (r / (rows - 1)) * (y1 - y0) - this.yRef;\n const at = (c: number, r: number) => values[r * cols + c]!;\n\n const data: number[] = [];\n const lspan = vmax - vmin || 1;\n for (let li = 0; li < levels.length; li++) {\n const L = levels[li]!;\n const col: Color = fixed ?? [...cmap((L - vmin) / lspan), 1] as Color;\n for (let r = 0; r < rows - 1; r++) {\n for (let c = 0; c < cols - 1; c++) {\n const v0 = at(c, r), v1 = at(c + 1, r), v2 = at(c + 1, r + 1), v3 = at(c, r + 1);\n const idx = (v0 >= L ? 1 : 0) | (v1 >= L ? 2 : 0) | (v2 >= L ? 4 : 0) | (v3 >= L ? 8 : 0);\n const segs = CASES[idx]!;\n if (segs.length === 0) continue;\n // Edge interpolation points (in offset data space).\n const lerp = (t: number, ax: number, ay: number, bx: number, by: number): [number, number] =>\n [ax + (bx - ax) * t, ay + (by - ay) * t];\n const edge = (e: number): [number, number] => {\n if (e === 0) return lerp((L - v0) / (v1 - v0 || 1e-9), gx(c), gy(r), gx(c + 1), gy(r));\n if (e === 1) return lerp((L - v1) / (v2 - v1 || 1e-9), gx(c + 1), gy(r), gx(c + 1), gy(r + 1));\n if (e === 2) return lerp((L - v2) / (v3 - v2 || 1e-9), gx(c + 1), gy(r + 1), gx(c), gy(r + 1));\n return lerp((L - v3) / (v0 - v3 || 1e-9), gx(c), gy(r + 1), gx(c), gy(r));\n };\n for (const [ea, eb] of segs) {\n const pa = edge(ea), pb = edge(eb);\n data.push(pa[0], pa[1], col[0], col[1], col[2], col[3]);\n data.push(pb[0], pb[1], col[0], col[1], col[2], col[3]);\n }\n }\n }\n }\n\n this.vertexCount = data.length / 6;\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 24, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 24, 8);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS]);\n }\n\n bounds() {\n return { x: this.ext.x, y: this.ext.y };\n }\n\n draw(state: DrawState): void {\n if (this.vertexCount === 0) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.LINES, 0, this.vertexCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\n/** A per-point error, given as one value for all points or an array. */\ntype ErrInput = ArrayLike<number> | number;\n\nexport interface ErrorBarOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Symmetric y error (half-height). Scalar or per-point. */\n yerr?: ErrInput;\n /** Asymmetric y error below/above `y` (overrides `yerr`). */\n yerrLow?: ErrInput;\n yerrHigh?: ErrInput;\n /** Symmetric x error (half-width). Scalar or per-point. */\n xerr?: ErrInput;\n color?: string | Color;\n /** Whisker/cap thickness in CSS px. Default 1.5. */\n width?: number;\n /** Cap length in CSS px (0 hides caps). Default 6. */\n capSize?: number;\n /** Draw I-beam whiskers. Default true. */\n whiskers?: boolean;\n /** Fill a shaded band between the low/high y bounds. Default false. */\n band?: boolean;\n /** Band fill opacity. Default 0.2. */\n bandOpacity?: number;\n name?: string;\n yAxis?: string;\n}\n\n// Data-space segment expanded to a pixel-thick rect (butt ends).\nconst SEG_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec4 aSeg; // (x0,y0,x1,y1) offset data space\nuniform vec2 uResolution;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nvoid main() {\n vec2 s0 = (dataToClip(aSeg.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aSeg.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n vec2 pos = mix(s0, s1, aCorner.x) + nrm * (aCorner.y * uWidth * 0.5);\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\n// Pixel-sized tick centered on a data point; orient 0 = horizontal, 1 = vertical.\nconst CAP_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit quad [-1,1]^2\nlayout(location = 1) in vec3 aCap; // (cx, cy, orient) offset data space\nuniform vec2 uResolution;\nuniform float uCapSize;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nvoid main() {\n vec2 c = (dataToClip(aCap.xy) * 0.5 + 0.5) * uResolution;\n vec2 h = aCap.z < 0.5 ? vec2(uCapSize * 0.5, uWidth * 0.5) : vec2(uWidth * 0.5, uCapSize * 0.5);\n vec2 pos = c + aCorner * h;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\n// Shaded band between the low/high envelope (triangle strip in data space).\nconst BAND_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos; // offset data space\n${TRANSFORM_GLSL}\nvoid main() { gl_Position = vec4(dataToClip(aPos), 0.0, 1.0); }`;\n\nconst SOLID_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(uColor.rgb * uColor.a, uColor.a); }`;\n\nconst SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\nconst QUAD_CORNERS = new Float32Array([-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1]);\n\ntype Key = \"seg\" | \"cap\" | \"band\";\nconst cache = new WeakMap<WebGL2RenderingContext, Record<Key, WebGLProgram>>();\nfunction programs(gl: WebGL2RenderingContext): Record<Key, WebGLProgram> {\n let p = cache.get(gl);\n if (!p) {\n p = {\n seg: createProgram(gl, SEG_VERT, SOLID_FRAG),\n cap: createProgram(gl, CAP_VERT, SOLID_FRAG),\n band: createProgram(gl, BAND_VERT, SOLID_FRAG),\n };\n cache.set(gl, p);\n }\n return p;\n}\n\nconst errAt = (e: ErrInput | undefined, i: number): number =>\n e == null ? 0 : typeof e === \"number\" ? e : (e[i] ?? 0);\n\nlet counter = 0;\n\nexport class ErrorBarLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private progs: Record<Key, WebGLProgram>;\n private segVao: WebGLVertexArrayObject;\n private capVao: WebGLVertexArrayObject;\n private bandVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uSeg: Record<string, WebGLUniformLocation | null>;\n private uCap: Record<string, WebGLUniformLocation | null>;\n private uBand: Record<string, WebGLUniformLocation | null>;\n private color: Color;\n private width: number;\n private capSize: number;\n private bandOpacity: number;\n private showWhiskers: boolean;\n private showBand: boolean;\n private segCount = 0;\n private capCount = 0;\n private bandVerts = 0;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: ErrorBarOptions) {\n this.id = `errorbar-${counter++}`;\n this.gl = gl;\n this.progs = programs(gl);\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.width = opts.width ?? 1.5;\n this.capSize = opts.capSize ?? 6;\n this.bandOpacity = opts.bandOpacity ?? 0.2;\n this.showBand = opts.band === true;\n this.showWhiskers = opts.whiskers ?? true;\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n\n const segs: number[] = []; // vec4 per whisker\n const caps: number[] = []; // vec3 per cap\n const lowPts: Array<[number, number]> = []; // for the band envelope\n const highPts: Array<[number, number]> = [];\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n\n const hasY = opts.yerr != null || opts.yerrLow != null || opts.yerrHigh != null;\n const hasX = opts.xerr != null;\n\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n const eyLo = opts.yerrLow != null ? errAt(opts.yerrLow, i) : errAt(opts.yerr, i);\n const eyHi = opts.yerrHigh != null ? errAt(opts.yerrHigh, i) : errAt(opts.yerr, i);\n const ex = errAt(opts.xerr, i);\n const yLo = y - eyLo, yHi = y + eyHi;\n const xLo = x - ex, xHi = x + ex;\n\n if (hasY) {\n segs.push(x - this.xRef, yLo - this.yRef, x - this.xRef, yHi - this.yRef);\n caps.push(x - this.xRef, yLo - this.yRef, 0, x - this.xRef, yHi - this.yRef, 0);\n }\n if (hasX) {\n segs.push(xLo - this.xRef, y - this.yRef, xHi - this.xRef, y - this.yRef);\n caps.push(xLo - this.xRef, y - this.yRef, 1, xHi - this.xRef, y - this.yRef, 1);\n }\n lowPts.push([x - this.xRef, yLo - this.yRef]);\n highPts.push([x - this.xRef, yHi - this.yRef]);\n\n minX = Math.min(minX, xLo); maxX = Math.max(maxX, xHi);\n minY = Math.min(minY, yLo); maxY = Math.max(maxY, yHi);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n this.segCount = segs.length / 4;\n this.capCount = this.capSize > 0 ? caps.length / 3 : 0;\n\n // Band as a triangle strip alternating high/low along x.\n const band: number[] = [];\n for (let i = 0; i < n; i++) {\n band.push(highPts[i]![0], highPts[i]![1], lowPts[i]![0], lowPts[i]![1]);\n }\n this.bandVerts = n * 2;\n\n const cornerSeg = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.bufferData(gl.ARRAY_BUFFER, SEG_CORNERS, gl.STATIC_DRAW);\n const cornerQuad = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerQuad);\n gl.bufferData(gl.ARRAY_BUFFER, QUAD_CORNERS, gl.STATIC_DRAW);\n\n const segBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(segs), gl.STATIC_DRAW);\n const capBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, capBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(caps), gl.STATIC_DRAW);\n const bandBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, bandBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(band), gl.STATIC_DRAW);\n this.buffers = [cornerSeg, cornerQuad, segBuf, capBuf, bandBuf];\n\n // Whisker VAO: unit segment + instanced vec4 endpoints.\n this.segVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.segVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n\n // Cap VAO: unit quad + instanced vec3 (center, orient).\n this.capVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.capVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerQuad);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, capBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n\n // Band VAO: raw triangle-strip positions.\n this.bandVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.bandVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, bandBuf);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n\n this.uSeg = uniformLocations(gl, this.progs.seg, [...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\"]);\n this.uCap = uniformLocations(gl, this.progs.cap, [...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uCapSize\", \"uWidth\"]);\n this.uBand = uniformLocations(gl, this.progs.band, [...TRANSFORM_UNIFORMS, \"uColor\"]);\n }\n\n bounds() {\n if (this.segCount === 0 && this.bandVerts === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n const gl = state.gl;\n const [r, g, b, a] = this.color;\n\n if (this.showBand && this.bandVerts >= 4) {\n gl.useProgram(this.progs.band);\n setTransformUniforms(gl, this.uBand, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uBand.uColor!, r, g, b, a * this.bandOpacity);\n gl.bindVertexArray(this.bandVao);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.bandVerts);\n gl.bindVertexArray(null);\n }\n\n if (this.showWhiskers && this.segCount > 0) {\n gl.useProgram(this.progs.seg);\n setTransformUniforms(gl, this.uSeg, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uSeg.uColor!, r, g, b, a);\n gl.uniform2f(this.uSeg.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uSeg.uWidth!, this.width * state.dpr);\n gl.bindVertexArray(this.segVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.segCount);\n gl.bindVertexArray(null);\n\n if (this.capCount > 0) {\n gl.useProgram(this.progs.cap);\n setTransformUniforms(gl, this.uCap, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uCap.uColor!, r, g, b, a);\n gl.uniform2f(this.uCap.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uCap.uCapSize!, this.capSize * state.dpr);\n gl.uniform1f(this.uCap.uWidth!, this.width * state.dpr);\n gl.bindVertexArray(this.capVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.capCount);\n gl.bindVertexArray(null);\n }\n }\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.segVao);\n this.gl.deleteVertexArray(this.capVao);\n this.gl.deleteVertexArray(this.bandVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface HeatmapOptions {\n /** Row-major grid values, length `cols * rows` (row 0 at the bottom). */\n values: ArrayLike<number>;\n cols: number;\n rows: number;\n /** Data-space extent the grid spans. */\n extent: { x: Range; y: Range };\n colormap?: ColormapName;\n /** Value range mapped to the colormap. Defaults to the data min/max. */\n domain?: Range;\n /** Bilinear filtering (default true) vs. hard cells. */\n smooth?: boolean;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos; // offset data space\nlayout(location = 1) in vec2 aUV;\n${TRANSFORM_GLSL}\nout vec2 vUV;\nvoid main() {\n vUV = aUV;\n gl_Position = vec4(dataToClip(aPos), 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vUV;\nuniform sampler2D uTex;\nout vec4 outColor;\nvoid main() {\n vec4 c = texture(uTex, vUV);\n outColor = vec4(c.rgb * c.a, c.a);\n}`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class HeatmapLayer implements Layer {\n readonly id: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private texture: WebGLTexture;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private xRef: number;\n private yRef: number;\n private ext: { x: Range; y: Range };\n\n constructor(gl: WebGL2RenderingContext, opts: HeatmapOptions) {\n this.id = `heatmap-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.yAxis = opts.yAxis ?? \"y\";\n this.ext = opts.extent;\n const [x0, x1] = opts.extent.x;\n const [y0, y1] = opts.extent.y;\n this.xRef = x0;\n this.yRef = y0;\n\n // Bake values into an RGBA texture via the colormap.\n const { cols, rows, values } = opts;\n const cmap = colormap(opts.colormap ?? \"viridis\");\n let lo = opts.domain?.[0] ?? Infinity;\n let hi = opts.domain?.[1] ?? -Infinity;\n if (!opts.domain) {\n for (let i = 0; i < values.length; i++) {\n const v = values[i]!;\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n const span = hi - lo || 1;\n const pixels = new Uint8Array(cols * rows * 4);\n for (let i = 0; i < cols * rows; i++) {\n const [r, g, b] = cmap((values[i]! - lo) / span);\n pixels[i * 4] = Math.round(r * 255);\n pixels[i * 4 + 1] = Math.round(g * 255);\n pixels[i * 4 + 2] = Math.round(b * 255);\n pixels[i * 4 + 3] = 255;\n }\n\n const texture = gl.createTexture()!;\n this.texture = texture;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, cols, rows, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n const filter = opts.smooth === false ? gl.NEAREST : gl.LINEAR;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n // Quad over the extent: (posX, posY, u, v). v=0 at y0 (row 0 bottom).\n const data = new Float32Array([\n x0 - this.xRef, y0 - this.yRef, 0, 0,\n x1 - this.xRef, y0 - this.yRef, 1, 0,\n x1 - this.xRef, y1 - this.yRef, 1, 1,\n x0 - this.xRef, y0 - this.yRef, 0, 0,\n x1 - this.xRef, y1 - this.yRef, 1, 1,\n x0 - this.xRef, y1 - this.yRef, 0, 1,\n ]);\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uTex\"]);\n }\n\n bounds() {\n return { x: this.ext.x, y: this.ext.y };\n }\n\n draw(state: DrawState): void {\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.uniform1i(this.uniforms.uTex!, 0);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n this.gl.deleteTexture(this.texture);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface HexbinOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Hex radius in data units. Defaults to ~1/30 of the x-extent. */\n radius?: number;\n colormap?: ColormapName;\n /** Count range mapped to the colormap. Defaults to [1, maxCount]. */\n domain?: Range;\n yAxis?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit hexagon (data-unit offsets)\nlayout(location = 1) in vec2 aCenter; // offset data space\nlayout(location = 2) in vec4 aColor;\nuniform float uRadius;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vColor = aColor;\n gl_Position = vec4(dataToClip(aCenter + aCorner * uRadius), 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor.rgb * vColor.a, vColor.a); }`;\n\n// Pointy-top unit hexagon as 6 triangles (fan around the center).\nconst HEX = (() => {\n const verts: number[] = [];\n const pt = (a: number): [number, number] => [Math.cos(a), Math.sin(a)];\n for (let i = 0; i < 6; i++) {\n const a0 = (Math.PI / 3) * i + Math.PI / 6;\n const a1 = (Math.PI / 3) * (i + 1) + Math.PI / 6;\n const [x0, y0] = pt(a0), [x1, y1] = pt(a1);\n verts.push(0, 0, x0, y0, x1, y1);\n }\n return new Float32Array(verts);\n})();\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class HexbinLayer implements Layer {\n readonly id: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private radius: number;\n private cellCount: number;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: HexbinOptions) {\n this.id = `hexbin-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.yAxis = opts.yAxis ?? \"y\";\n\n const n = Math.min(opts.x.length, opts.y.length);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n const r = opts.radius ?? ((maxX - minX) / 30 || 1);\n this.radius = r;\n const dx = r * 2 * Math.sin(Math.PI / 3);\n const dy = r * 1.5;\n\n // Aggregate points into hex cells (simplified d3-hexbin binning).\n const cells = new Map<string, { cx: number; cy: number; count: number }>();\n let maxCount = 1;\n for (let i = 0; i < n; i++) {\n const px = opts.x[i]!, py = opts.y[i]!;\n const pj = Math.round(py / dy);\n const pi = Math.round(px / dx - (pj & 1) / 2);\n const key = `${pi},${pj}`;\n let cell = cells.get(key);\n if (!cell) {\n cell = { cx: (pi + (pj & 1) / 2) * dx, cy: pj * dy, count: 0 };\n cells.set(key, cell);\n }\n cell.count++;\n if (cell.count > maxCount) maxCount = cell.count;\n }\n\n this.cellCount = cells.size;\n this.xRef = minX; this.yRef = minY;\n const centers = new Float32Array(this.cellCount * 2);\n const colors = new Float32Array(this.cellCount * 4);\n const cmap = colormap(opts.colormap ?? \"viridis\");\n const lo = opts.domain?.[0] ?? 1;\n const hi = opts.domain?.[1] ?? maxCount;\n const span = hi - lo || 1;\n let k = 0;\n for (const cell of cells.values()) {\n centers[k * 2] = cell.cx - this.xRef;\n centers[k * 2 + 1] = cell.cy - this.yRef;\n const [cr, cg, cb] = cmap((cell.count - lo) / span);\n colors[k * 4] = cr; colors[k * 4 + 1] = cg; colors[k * 4 + 2] = cb; colors[k * 4 + 3] = 1;\n k++;\n }\n\n const vao = gl.createVertexArray()!;\n this.vao = vao;\n gl.bindVertexArray(vao);\n const hexBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, hexBuf);\n gl.bufferData(gl.ARRAY_BUFFER, HEX, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n const centerBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, centerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, centers, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n gl.bindVertexArray(null);\n this.buffers = [hexBuf, centerBuf, colorBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uRadius\"]);\n }\n\n bounds() {\n if (this.cellCount === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.cellCount === 0) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform1f(this.uniforms.uRadius!, this.radius);\n gl.bindVertexArray(this.vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 18, this.cellCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","/**\n * Pure geometry helpers for {@link LineLayer}, split out so the tricky bits —\n * min/max decimation index selection and screen-space join extrusion — can be\n * unit-tested without a WebGL context. The GLSL in `line.ts` mirrors\n * {@link computeJoin} exactly; keep the two in sync.\n */\n\n/**\n * Min/max decimation: reduce the visible index window `[i0, i1]` to at most\n * `2*cols + 2` representative indices. Each pixel column keeps the sample with\n * the lowest and highest y (emitted in index order so the envelope shape is\n * preserved), bracketed by the window endpoints so the line reaches the edges.\n */\nexport function decimateIndices(\n ys: ArrayLike<number>,\n i0: number,\n i1: number,\n cols: number,\n): number[] {\n const out: number[] = [i0];\n const visN = i1 - i0;\n for (let b = 0; b < cols; b++) {\n const lo = i0 + Math.floor((visN * b) / cols);\n const hi = i0 + Math.floor((visN * (b + 1)) / cols);\n if (hi <= lo) continue;\n let iMin = lo, iMax = lo;\n for (let i = lo; i < hi; i++) {\n if (ys[i]! < ys[iMin]!) iMin = i;\n if (ys[i]! > ys[iMax]!) iMax = i;\n }\n // Emit the two extremes in index order to preserve the envelope shape.\n if (iMin < iMax) out.push(iMin, iMax);\n else out.push(iMax, iMin);\n }\n out.push(i1);\n return out;\n}\n\n/** Screen-space geometry for one line join, all coordinates in device pixels. */\nexport interface JoinGeom {\n /** End corner of the incoming segment on the outer side of the turn. */\n ax: number;\n ay: number;\n /** Start corner of the outgoing segment on the outer side of the turn. */\n bx: number;\n by: number;\n /** Outer tip: the miter point, or the bevel midpoint when clamped/bevelled. */\n apexX: number;\n apexY: number;\n /** False when the joint is degenerate (repeated point or collinear). */\n ok: boolean;\n}\n\nconst DEGENERATE: JoinGeom = { ax: 0, ay: 0, bx: 0, by: 0, apexX: 0, apexY: 0, ok: false };\n\n/**\n * Extrude the outer wedge that fills the notch two butt-capped segments leave at\n * a joint `p0` between neighbours `prev` and `next`. With `miter` the tip reaches\n * the true miter point unless its length exceeds `miterLimit` (then it collapses\n * to the bevel midpoint); with `miter` false it is always the bevel midpoint.\n *\n * `hw` is the true half line-width in device pixels. This mirrors the join\n * vertex shader in `line.ts` — edit both together.\n */\nexport function computeJoin(\n prevX: number, prevY: number,\n p0X: number, p0Y: number,\n nextX: number, nextY: number,\n hw: number,\n miter: boolean,\n miterLimit: number,\n): JoinGeom {\n let inx = p0X - prevX, iny = p0Y - prevY;\n let outx = nextX - p0X, outy = nextY - p0Y;\n const inl = Math.hypot(inx, iny), outl = Math.hypot(outx, outy);\n if (inl < 1e-6 || outl < 1e-6) return DEGENERATE;\n inx /= inl; iny /= inl; outx /= outl; outy /= outl;\n\n const inNx = -iny, inNy = inx;\n const outNx = -outy, outNy = outx;\n const cross = inx * outy - iny * outx;\n if (Math.abs(cross) < 1e-6) return DEGENERATE; // collinear — no visible notch\n\n // Left-turn (cross>0): outer side is to the right of the left normals, so flip.\n const outerSign = cross > 0 ? -1 : 1;\n const ax = p0X + inNx * hw * outerSign, ay = p0Y + inNy * hw * outerSign;\n const bx = p0X + outNx * hw * outerSign, by = p0Y + outNy * hw * outerSign;\n\n let apexX = (ax + bx) * 0.5, apexY = (ay + by) * 0.5; // bevel default\n if (miter) {\n let mnx = inNx + outNx, mny = inNy + outNy;\n const ml = Math.hypot(mnx, mny);\n if (ml > 1e-6) {\n mnx /= ml; mny /= ml;\n const denom = mnx * outNx + mny * outNy;\n if (denom > 1e-3) {\n const miterLen = 1 / denom;\n if (miterLen <= miterLimit) {\n apexX = p0X + mnx * outerSign * hw * miterLen;\n apexY = p0Y + mny * outerSign * hw * miterLen;\n }\n }\n }\n }\n return { ax, ay, bx, by, apexX, apexY, ok: true };\n}\n","/**\n * GPU-side min/max decimation via transform feedback.\n *\n * The CPU path in `line.ts` (see {@link decimateIndices}) rebuilds the per-column\n * min/max envelope in a JS loop whenever the view changes — O(visible points) on\n * the main thread, which janks when panning multi-million-point series. This\n * moves that reduction onto the GPU: the full series lives in an RG32F texture,\n * and a rasterizer-discarded vertex pass computes each column's extremes with\n * `texelFetch` and captures the result straight into the draw buffer via\n * transform feedback — no per-point CPU work and no readback.\n *\n * It is used only for large series (the CPU path is already cheap for small\n * ones) and falls back to the CPU path on any capability gap or GL error, so the\n * rendered envelope is identical either way.\n */\n\nconst DEC_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nuniform sampler2D uPoints;\nuniform int uTexW;\nuniform int uI0;\nuniform int uI1;\nuniform int uCols;\nuniform int uMaxIter; // per-column iteration cap; stride-samples beyond it\nout vec2 vOut;\n\nvec2 fetchPoint(int i) {\n return texelFetch(uPoints, ivec2(i % uTexW, i / uTexW), 0).xy;\n}\n\nvoid main() {\n int v = gl_VertexID;\n int last = 2 * uCols + 1;\n int idx;\n if (v == 0) {\n idx = uI0; // left endpoint, so the line reaches the edge\n } else if (v >= last) {\n idx = uI1; // right endpoint\n } else {\n int col = (v - 1) / 2;\n int which = (v - 1) - col * 2; // 0 => min-index extreme, 1 => max-index extreme\n // Float division avoids int32 overflow of visN*col for huge series.\n float fvisN = float(uI1 - uI0);\n int lo = uI0 + int(floor(fvisN * float(col) / float(uCols)));\n int hi = uI0 + int(floor(fvisN * float(col + 1) / float(uCols)));\n if (hi <= lo) {\n idx = lo;\n } else {\n int stride = 1;\n int span = hi - lo;\n if (span > uMaxIter) stride = (span + uMaxIter - 1) / uMaxIter;\n int iMin = lo, iMax = lo;\n float yMin = fetchPoint(lo).y, yMax = yMin;\n for (int i = lo; i < hi; i += stride) {\n float y = fetchPoint(i).y;\n if (y < yMin) { yMin = y; iMin = i; }\n if (y > yMax) { yMax = y; iMax = i; }\n }\n // Emit in index order (matches decimateIndices) to preserve envelope shape.\n idx = (which == 0) ? min(iMin, iMax) : max(iMin, iMax);\n }\n }\n vOut = fetchPoint(idx);\n gl_Position = vec4(0.0, 0.0, 0.0, 1.0); // rasterizer-discarded\n}`;\n\nconst DEC_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nout vec4 o;\nvoid main() { o = vec4(0.0); }`;\n\n/** Per-column iteration budget in the reduction loop before stride-sampling. */\nconst MAX_ITER = 4096;\n\nfunction compile(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)!;\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(sh);\n gl.deleteShader(sh);\n throw new Error(`Decimation shader compile error:\\n${log}`);\n }\n return sh;\n}\n\ninterface DecProgram {\n program: WebGLProgram;\n u: Record<string, WebGLUniformLocation | null>;\n}\n\n// Transform-feedback programs need their varyings declared before linking, so\n// they can't go through the shared createProgram(). Cache one per context.\nconst programCache = new WeakMap<WebGL2RenderingContext, DecProgram | null>();\n\nfunction getDecProgram(gl: WebGL2RenderingContext): DecProgram | null {\n if (programCache.has(gl)) return programCache.get(gl)!;\n let result: DecProgram | null = null;\n try {\n const vs = compile(gl, gl.VERTEX_SHADER, DEC_VERT);\n const fs = compile(gl, gl.FRAGMENT_SHADER, DEC_FRAG);\n const program = gl.createProgram()!;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.transformFeedbackVaryings(program, [\"vOut\"], gl.INTERLEAVED_ATTRIBS);\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n } else {\n const u: Record<string, WebGLUniformLocation | null> = {};\n for (const name of [\"uPoints\", \"uTexW\", \"uI0\", \"uI1\", \"uCols\", \"uMaxIter\"]) {\n u[name] = gl.getUniformLocation(program, name);\n }\n result = { program, u };\n }\n } catch {\n result = null;\n }\n programCache.set(gl, result);\n return result;\n}\n\n/**\n * Holds one series' points in a GPU texture and runs the transform-feedback\n * min/max reduction. Owned by a LineLayer; only instantiated for series large\n * enough that CPU decimation would jank.\n */\nexport class GpuDecimator {\n /** False when this context can't support the GPU path (fall back to CPU). */\n readonly supported: boolean;\n private gl: WebGL2RenderingContext;\n private prog: DecProgram | null;\n private tex: WebGLTexture | null = null;\n private tf: WebGLTransformFeedback | null = null;\n private emptyVao: WebGLVertexArrayObject | null = null;\n private texW = 0;\n private decCapacity = -1; // point capacity currently allocated in the draw buffer\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.prog = getDecProgram(gl);\n this.supported = this.prog != null;\n }\n\n /**\n * (Re)upload the series into the point texture. `data` is interleaved\n * (x-xRef, y-yRef) float32, exactly as the draw buffer stores it. Returns\n * false and disables the GPU path if the texture can't be allocated.\n */\n setPoints(data: Float32Array, n: number): boolean {\n if (!this.supported || n === 0) return this.supported;\n const gl = this.gl;\n const maxTex = gl.getParameter(gl.MAX_TEXTURE_SIZE) as number;\n const texW = Math.min(maxTex, Math.max(1, Math.ceil(Math.sqrt(n))));\n const texH = Math.ceil(n / texW);\n if (texH > maxTex) return false; // series too large to texture — CPU handles it\n this.texW = texW;\n\n const packed = data.length >= texW * texH * 2 ? data : new Float32Array(texW * texH * 2);\n if (packed !== data) packed.set(data.subarray(0, n * 2));\n\n try {\n if (!this.tex) this.tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32F, texW, texH, 0, gl.RG, gl.FLOAT, packed);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n } catch {\n return false;\n }\n if (!this.tf) this.tf = gl.createTransformFeedback();\n if (!this.emptyVao) this.emptyVao = gl.createVertexArray();\n return true;\n }\n\n /**\n * Run the reduction for the visible window `[i0, i1]` into `decBuf`, matching\n * the CPU envelope layout: left endpoint, `cols` min/max pairs, right endpoint.\n * Returns the emitted point count, or null if the GPU path can't run this call.\n */\n run(i0: number, i1: number, cols: number, decBuf: WebGLBuffer): number | null {\n if (!this.supported || !this.tex || !this.prog) return null;\n const gl = this.gl;\n const outCount = 2 * cols + 2;\n\n // Grow the draw buffer to hold the envelope (interleaved vec2 float32).\n if (this.decCapacity < outCount) {\n gl.bindBuffer(gl.ARRAY_BUFFER, decBuf);\n gl.bufferData(gl.ARRAY_BUFFER, outCount * 2 * 4, gl.DYNAMIC_COPY);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n this.decCapacity = outCount;\n }\n\n const { program, u } = this.prog;\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.tex);\n gl.uniform1i(u.uPoints!, 0);\n gl.uniform1i(u.uTexW!, this.texW);\n gl.uniform1i(u.uI0!, i0);\n gl.uniform1i(u.uI1!, i1);\n gl.uniform1i(u.uCols!, cols);\n gl.uniform1i(u.uMaxIter!, MAX_ITER);\n\n gl.bindVertexArray(this.emptyVao);\n gl.enable(gl.RASTERIZER_DISCARD);\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, this.tf);\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, decBuf);\n gl.beginTransformFeedback(gl.POINTS);\n gl.drawArrays(gl.POINTS, 0, outCount);\n gl.endTransformFeedback();\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n gl.disable(gl.RASTERIZER_DISCARD);\n gl.bindVertexArray(null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return outCount;\n }\n\n dispose(): void {\n const gl = this.gl;\n if (this.tex) gl.deleteTexture(this.tex);\n if (this.tf) gl.deleteTransformFeedback(this.tf);\n if (this.emptyVao) gl.deleteVertexArray(this.emptyVao);\n this.tex = null; this.tf = null; this.emptyVao = null;\n }\n}\n","/**\n * Shared hover-picking used by point/series layers (line, scatter, stem).\n *\n * The mode decides which pixel-space distance is minimized:\n * - `\"x\"` — nearest by horizontal distance (classic crosshair-along-x)\n * - `\"y\"` — nearest by vertical distance\n * - `\"xy\"` — nearest by true 2D distance (checks both axes; right for point\n * clouds / maps, where an x-only match would highlight the wrong\n * point)\n *\n * Distances are computed in pixels via `project`, so x and y are compared on\n * the same footing regardless of each axis's data range.\n */\nexport type PickMode = \"x\" | \"y\" | \"xy\";\n\nexport interface Picked {\n x: number;\n y: number;\n index: number;\n}\n\nexport function pickNearest(\n xs: ArrayLike<number>,\n ys: ArrayLike<number>,\n count: number,\n mode: PickMode,\n cursorPx: number,\n cursorPy: number,\n project: (x: number, y: number) => [number, number],\n /**\n * Max distance (in px, in the chosen metric) for a hit. Beyond it, nothing is\n * picked — so a point only highlights when the cursor is on it. Point clouds\n * (scatter) pass their marker radius; series layers leave it `Infinity`.\n */\n gatePx = Infinity,\n): Picked | null {\n if (count === 0) return null;\n let best = -1;\n let bestDist = Infinity;\n for (let i = 0; i < count; i++) {\n const [px, py] = project(xs[i]!, ys[i]!);\n const dx = px - cursorPx;\n const dy = py - cursorPy;\n const d = mode === \"x\" ? Math.abs(dx) : mode === \"y\" ? Math.abs(dy) : Math.hypot(dx, dy);\n if (d < bestDist) {\n bestDist = d;\n best = i;\n }\n }\n if (best < 0 || bestDist > gatePx) return null;\n return { x: xs[best]!, y: ys[best]!, index: best };\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { AxisFrame } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport { decimateIndices } from \"./line-util.js\";\nimport { GpuDecimator } from \"./gpu-decimate.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\nimport { pickNearest, type PickMode, type Picked } from \"./pick.js\";\n\n/** Above this point count, decimation runs on the GPU (below, CPU is cheaper). */\nconst GPU_DECIMATE_MIN = 200_000;\n\n/** How adjacent segments meet at a vertex. */\nexport type LineJoin = \"round\" | \"miter\" | \"bevel\" | \"butt\";\n\nexport interface LineOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n color?: string | Color;\n /** Line width in CSS pixels (real thickness via GPU triangle expansion). */\n width?: number;\n name?: string;\n yAxis?: string;\n step?: \"before\" | \"after\" | \"center\";\n /**\n * How segments meet at each vertex:\n * - `round` (default) — round caps and joins via an SDF; no seams.\n * - `miter` — sharp mitered corners, clamped to {@link LineOptions.miterLimit}.\n * - `bevel` — corners cut flat.\n * - `butt` — flat ends with no join fill (segments may gap at sharp angles).\n */\n join?: LineJoin;\n /**\n * For `join: \"miter\"`, the max ratio of miter length to half line-width before\n * a corner falls back to a bevel (prevents spikes at very sharp angles).\n * Default 4.\n */\n miterLimit?: number;\n /**\n * Min/max decimate very large series to ~2 points per pixel column when\n * zoomed out (preserves peaks). Requires monotonic x; auto-detected. Default true.\n */\n decimate?: boolean;\n}\n\n// Each segment is an instanced quad, extended and round-capped in the fragment\n// shader via a signed-distance test so joins between segments never gap.\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec2 aP0;\nlayout(location = 2) in vec2 aP1;\nuniform vec2 uResolution;\nuniform float uWidth;\nuniform float uRound;\n${TRANSFORM_GLSL}\nout vec2 vPix;\nout vec2 vS0;\nout vec2 vS1;\nvoid main() {\n vec2 s0 = (dataToClip(aP0) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aP1) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float hw = uWidth * 0.5 + 1.5; // half width + AA margin\n float ext = uRound > 0.5 ? hw : 0.0; // extend for round caps\n vec2 endpoint = mix(s0, s1, aCorner.x);\n vec2 outward = (aCorner.x < 0.5 ? -dir : dir) * ext;\n vec2 pos = endpoint + outward + nrm * (aCorner.y * hw);\n vPix = pos; vS0 = s0; vS1 = s1;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vPix;\nin vec2 vS0;\nin vec2 vS1;\nuniform vec4 uColor;\nuniform float uWidth;\nuniform float uRound;\nout vec4 outColor;\nvoid main() {\n vec2 pa = vPix - vS0;\n vec2 ba = vS1 - vS0;\n float bb = dot(ba, ba);\n float t = bb > 1e-6 ? dot(pa, ba) / bb : 0.0;\n float d;\n if (uRound > 0.5) {\n d = length(pa - ba * clamp(t, 0.0, 1.0)); // round caps/joins\n } else {\n if (t < 0.0 || t > 1.0) discard; // butt caps\n d = length(pa - ba * t);\n }\n float hw = uWidth * 0.5;\n float alpha = 1.0 - smoothstep(hw - 1.0, hw + 1.0, d);\n if (alpha <= 0.0) discard;\n outColor = vec4(uColor.rgb * uColor.a, uColor.a) * alpha;\n}`;\n\n// Miter/bevel join fill: one instanced wedge per interior vertex, filling the\n// notch two butt-capped segments leave on the outer side of the turn. The\n// geometry mirrors computeJoin() in line-util.ts — keep the two in sync.\nconst JOIN_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPrev;\nlayout(location = 1) in vec2 aP0;\nlayout(location = 2) in vec2 aNext;\nuniform vec2 uResolution;\nuniform float uWidth;\nuniform float uMiter; // >0.5 => miter, else bevel\nuniform float uMiterLimit;\n${TRANSFORM_GLSL}\nout vec2 vPix;\nflat out vec2 vE0;\nflat out vec2 vE1;\nflat out vec2 vInner;\nvoid main() {\n vec2 sp = (dataToClip(aPrev) * 0.5 + 0.5) * uResolution;\n vec2 s0 = (dataToClip(aP0) * 0.5 + 0.5) * uResolution;\n vec2 sn = (dataToClip(aNext) * 0.5 + 0.5) * uResolution;\n vec2 din = s0 - sp;\n vec2 dout = sn - s0;\n float inl = length(din), outl = length(dout);\n vec2 inN = vec2(0.0), outN = vec2(0.0);\n float crs = 0.0;\n bool ok = inl > 1e-6 && outl > 1e-6;\n if (ok) {\n din /= inl; dout /= outl;\n inN = vec2(-din.y, din.x);\n outN = vec2(-dout.y, dout.x);\n crs = din.x * dout.y - din.y * dout.x;\n ok = abs(crs) > 1e-6; // collinear => no notch\n }\n if (!ok) { // degenerate: cull the wedge\n vE0 = vec2(0.0); vE1 = vec2(0.0); vInner = vec2(0.0); vPix = vec2(0.0);\n gl_Position = vec4(2.0, 2.0, 2.0, 1.0);\n return;\n }\n float hw = uWidth * 0.5;\n float outerSign = crs > 0.0 ? -1.0 : 1.0;\n vec2 A = s0 + inN * hw * outerSign;\n vec2 B = s0 + outN * hw * outerSign;\n vec2 apex = 0.5 * (A + B); // bevel midpoint\n if (uMiter > 0.5) {\n vec2 mN = inN + outN;\n float ml = length(mN);\n if (ml > 1e-6) {\n mN /= ml;\n float denom = dot(mN, outN);\n if (denom > 1e-3) {\n float miterLen = 1.0 / denom;\n if (miterLen <= uMiterLimit) apex = s0 + mN * outerSign * hw * miterLen;\n }\n }\n }\n int vid = gl_VertexID;\n vec2 pos;\n if (vid == 0 || vid == 3) pos = s0;\n else if (vid == 1) pos = A;\n else if (vid == 2 || vid == 4) pos = apex;\n else pos = B; // vid == 5\n if (vid < 3) { vE0 = A; vE1 = apex; } // triangle [s0, A, apex]\n else { vE0 = apex; vE1 = B; } // triangle [s0, apex, B]\n vInner = s0;\n vPix = pos;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst JOIN_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vPix;\nflat in vec2 vE0;\nflat in vec2 vE1;\nflat in vec2 vInner;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() {\n vec2 e = vE1 - vE0;\n float el = length(e);\n if (el < 1e-6) discard;\n vec2 n = vec2(-e.y, e.x) / el;\n float sideInner = dot(vInner - vE0, n) >= 0.0 ? 1.0 : -1.0;\n float d = dot(vPix - vE0, n) * sideInner; // >0 inside the outer edge\n float alpha = clamp(d + 0.5, 0.0, 1.0);\n if (alpha <= 0.0) discard;\n outColor = vec4(uColor.rgb * uColor.a, uColor.a) * alpha;\n}`;\n\nconst CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nconst joinProgramCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getJoinProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = joinProgramCache.get(gl);\n if (!p) { p = createProgram(gl, JOIN_VERT, JOIN_FRAG); joinProgramCache.set(gl, p); }\n return p;\n}\n\nfunction stepExpand(\n xs: ArrayLike<number>, ys: ArrayLike<number>, n: number,\n mode: \"before\" | \"after\" | \"center\",\n): { xs: Float64Array; ys: Float64Array } {\n const ox: number[] = [], oy: number[] = [];\n for (let i = 0; i < n - 1; i++) {\n const x0 = xs[i]!, y0 = ys[i]!, x1 = xs[i + 1]!, y1 = ys[i + 1]!;\n if (mode === \"center\") { const xm = (x0 + x1) / 2; ox.push(x0, xm, xm); oy.push(y0, y0, y1); }\n else if (mode === \"after\") { ox.push(x0, x1); oy.push(y0, y0); }\n else { ox.push(x0, x0); oy.push(y0, y1); }\n }\n ox.push(xs[n - 1]!); oy.push(ys[n - 1]!);\n return { xs: Float64Array.from(ox), ys: Float64Array.from(oy) };\n}\n\nfunction upperBound(a: Float64Array, v: number): number {\n let lo = 0, hi = a.length;\n while (lo < hi) { const m = (lo + hi) >> 1; if (a[m]! <= v) lo = m + 1; else hi = m; }\n return lo;\n}\n\nlet counter = 0;\n\nexport class LineLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private joinProgram: WebGLProgram;\n private fullVao: WebGLVertexArrayObject;\n private decVao: WebGLVertexArrayObject;\n private joinFullVao: WebGLVertexArrayObject;\n private joinDecVao: WebGLVertexArrayObject;\n private cornerBuf: WebGLBuffer;\n private posBuf: WebGLBuffer;\n private decBuf: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private joinUniforms: Record<string, WebGLUniformLocation | null>;\n private count: number;\n private color: Color;\n private width: number;\n private round: boolean;\n private joinStyle: LineJoin;\n private miterLimit: number;\n private decimateOn: boolean;\n private monotonic: boolean;\n private gpuDec: GpuDecimator | null = null;\n private step?: \"before\" | \"after\" | \"center\";\n private xRef = 0;\n private yRef = 0;\n private xs: Float64Array;\n private ys: Float64Array;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n private decKey = \"\";\n private decSegments = 0;\n\n constructor(gl: WebGL2RenderingContext, opts: LineOptions) {\n this.id = `line-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.joinProgram = getJoinProgram(gl);\n this.width = opts.width ?? 1.5;\n this.joinStyle = opts.join ?? \"round\";\n this.round = this.joinStyle === \"round\";\n this.miterLimit = opts.miterLimit ?? 4;\n this.decimateOn = opts.decimate !== false;\n this.step = opts.step;\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n\n let n = Math.min(opts.x.length, opts.y.length);\n let xs: ArrayLike<number> = opts.x, ys: ArrayLike<number> = opts.y;\n if (opts.step && n >= 2) { const e = stepExpand(opts.x, opts.y, n, opts.step); xs = e.xs; ys = e.ys; n = e.xs.length; }\n\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? xs[0]! : 0;\n this.yRef = n > 0 ? ys[0]! : 0;\n const data = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, mono = true;\n for (let i = 0; i < n; i++) {\n const x = xs[i]!, y = ys[i]!;\n this.xs[i] = x; this.ys[i] = y;\n data[i * 2] = x - this.xRef; data[i * 2 + 1] = y - this.yRef;\n if (i > 0 && x < xs[i - 1]!) mono = false;\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n this.count = n; this.monotonic = mono;\n\n this.cornerBuf = gl.createBuffer()!;\n this.posBuf = gl.createBuffer()!;\n this.decBuf = gl.createBuffer()!;\n this.fullVao = gl.createVertexArray()!;\n this.decVao = gl.createVertexArray()!;\n this.joinFullVao = gl.createVertexArray()!;\n this.joinDecVao = gl.createVertexArray()!;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.cornerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.posBuf);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n\n this.configureVao(this.fullVao, this.posBuf);\n this.configureVao(this.decVao, this.decBuf);\n this.configureJoinVao(this.joinFullVao, this.posBuf);\n this.configureJoinVao(this.joinDecVao, this.decBuf);\n\n this.uniforms = uniformLocations(gl, this.program, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\", \"uRound\",\n ]);\n this.joinUniforms = uniformLocations(gl, this.joinProgram, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\", \"uMiter\", \"uMiterLimit\",\n ]);\n\n this.syncGpu(data, n);\n }\n\n // Keep the GPU decimation texture in sync for large series; disable it (fall\n // back to CPU decimation) if the context can't support the path.\n private syncGpu(data: Float32Array, n: number): void {\n if (!this.decimateOn || n < GPU_DECIMATE_MIN) { this.disposeGpu(); return; }\n if (!this.gpuDec) {\n const dec = new GpuDecimator(this.gl);\n if (!dec.supported) return;\n this.gpuDec = dec;\n }\n if (!this.gpuDec.setPoints(data, n)) this.disposeGpu();\n }\n\n private disposeGpu(): void {\n if (this.gpuDec) { this.gpuDec.dispose(); this.gpuDec = null; }\n }\n\n private configureVao(vao: WebGLVertexArrayObject, pointBuf: WebGLBuffer): void {\n const gl = this.gl;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.cornerBuf);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, pointBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 8, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 2, gl.FLOAT, false, 8, 8);\n gl.vertexAttribDivisor(2, 1);\n gl.bindVertexArray(null);\n }\n\n // Join instances read three consecutive points (prev, p0, next) from the same\n // buffer via overlapping attribute offsets; instance i covers vertex i+1.\n private configureJoinVao(vao: WebGLVertexArrayObject, pointBuf: WebGLBuffer): void {\n const gl = this.gl;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, pointBuf);\n for (let loc = 0; loc < 3; loc++) {\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 8, loc * 8);\n gl.vertexAttribDivisor(loc, 1);\n }\n gl.bindVertexArray(null);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n pick(\n mode: PickMode,\n cursorPx: number,\n cursorPy: number,\n project: (x: number, y: number) => [number, number],\n ): Picked | null {\n return pickNearest(this.xs, this.ys, this.count, mode, cursorPx, cursorPy, project);\n }\n\n /** Replace the series data and re-upload the GPU buffer (for streaming). */\n setData(x: ArrayLike<number>, y: ArrayLike<number>): void {\n let n = Math.min(x.length, y.length);\n let xs: ArrayLike<number> = x, ys: ArrayLike<number> = y;\n if (this.step && n >= 2) { const e = stepExpand(x, y, n, this.step); xs = e.xs; ys = e.ys; n = e.xs.length; }\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? xs[0]! : 0;\n this.yRef = n > 0 ? ys[0]! : 0;\n const data = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, mono = true;\n for (let i = 0; i < n; i++) {\n const vx = xs[i]!, vy = ys[i]!;\n this.xs[i] = vx; this.ys[i] = vy;\n data[i * 2] = vx - this.xRef; data[i * 2 + 1] = vy - this.yRef;\n if (i > 0 && vx < xs[i - 1]!) mono = false;\n if (vx < minX) minX = vx; if (vx > maxX) maxX = vx;\n if (vy < minY) minY = vy; if (vy > maxY) maxY = vy;\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n this.count = n; this.monotonic = mono; this.decKey = \"\";\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.posBuf);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, data, this.gl.DYNAMIC_DRAW);\n this.syncGpu(data, n);\n }\n\n /**\n * Rebuild the min/max-decimated buffer for the visible x-window if it changed.\n * Returns the segment count to draw from `decVao`, or null to draw everything.\n */\n private decimate(x: AxisFrame, cols: number): number | null {\n if (!this.decimateOn || !this.monotonic || this.count < 4 * cols) return null;\n const target = Math.max(2, cols * 2);\n // Visible index window (with a one-sample margin so lines reach the edges).\n let i0 = upperBound(this.xs, x.lo) - 1;\n let i1 = upperBound(this.xs, x.hi);\n i0 = Math.max(0, i0); i1 = Math.min(this.count - 1, i1);\n const visN = i1 - i0;\n if (visN <= target * 1.5) return null;\n\n const key = `${i0}:${i1}:${target}`;\n if (key === this.decKey) return this.decSegments;\n\n // GPU path: reduce the envelope with transform feedback, no main-thread work.\n if (this.gpuDec) {\n const outCount = this.gpuDec.run(i0, i1, cols, this.decBuf);\n if (outCount != null) {\n this.decKey = key;\n this.decSegments = outCount - 1;\n return this.decSegments;\n }\n this.disposeGpu(); // GPU path failed once — stop trying, use CPU below.\n }\n\n this.decKey = key;\n const indices = decimateIndices(this.ys, i0, i1, cols);\n const out = new Float32Array(indices.length * 2);\n for (let k = 0; k < indices.length; k++) {\n const i = indices[k]!;\n out[k * 2] = this.xs[i]! - this.xRef;\n out[k * 2 + 1] = this.ys[i]! - this.yRef;\n }\n\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.decBuf);\n gl.bufferData(gl.ARRAY_BUFFER, out, gl.DYNAMIC_DRAW);\n this.decSegments = indices.length - 1;\n return this.decSegments;\n }\n\n draw(state: DrawState): void {\n if (this.count < 2) return;\n const gl = state.gl;\n const decSegs = this.decimate(state.x, Math.max(1, Math.round(state.pixelWidth)));\n const decimated = decSegs != null;\n const vao = decimated ? this.decVao : this.fullVao;\n const segments = decimated ? decSegs! : this.count - 1;\n if (segments < 1) return;\n const points = segments + 1;\n\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.uniform2f(this.uniforms.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uniforms.uWidth!, this.width * state.dpr);\n // round joins use the SDF cap extension; miter/bevel/butt draw plain rectangles.\n gl.uniform1f(this.uniforms.uRound!, this.round ? 1 : 0);\n gl.bindVertexArray(vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, segments);\n gl.bindVertexArray(null);\n\n // Miter/bevel joins fill the outer notch left between the butt rectangles.\n if ((this.joinStyle === \"miter\" || this.joinStyle === \"bevel\") && points >= 3) {\n gl.useProgram(this.joinProgram);\n setTransformUniforms(gl, this.joinUniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.joinUniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.uniform2f(this.joinUniforms.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.joinUniforms.uWidth!, this.width * state.dpr);\n gl.uniform1f(this.joinUniforms.uMiter!, this.joinStyle === \"miter\" ? 1 : 0);\n gl.uniform1f(this.joinUniforms.uMiterLimit!, this.miterLimit);\n gl.bindVertexArray(decimated ? this.joinDecVao : this.joinFullVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, points - 2);\n gl.bindVertexArray(null);\n }\n }\n\n dispose(): void {\n const gl = this.gl;\n this.disposeGpu();\n gl.deleteVertexArray(this.fullVao);\n gl.deleteVertexArray(this.decVao);\n gl.deleteVertexArray(this.joinFullVao);\n gl.deleteVertexArray(this.joinDecVao);\n gl.deleteBuffer(this.cornerBuf);\n gl.deleteBuffer(this.posBuf);\n gl.deleteBuffer(this.decBuf);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\nexport interface QuiverOptions {\n /** Arrow anchor positions (data space). */\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Vector components at each anchor. */\n u: ArrayLike<number>;\n v: ArrayLike<number>;\n /** Multiplier applied to (u,v) in data units. Default auto-fits the field. */\n scale?: number;\n color?: string | Color;\n /** Shaft thickness in CSS px. Default 1.5. */\n width?: number;\n /** Arrowhead length in CSS px. Default 9. */\n headSize?: number;\n /** Color each arrow by a value (default: its magnitude) through a colormap. */\n colorBy?: {\n values?: ArrayLike<number>;\n colormap?: ColormapName;\n domain?: Range;\n };\n name?: string;\n yAxis?: string;\n}\n\n// Shaft: base->tip segment, pixel-thick.\nconst SHAFT_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec4 aArrow; // (bx,by,tx,ty) offset data space\nlayout(location = 2) in vec4 aColor;\nuniform vec2 uResolution;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vec2 s0 = (dataToClip(aArrow.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aArrow.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n vec2 pos = mix(s0, s1, aCorner.x) + nrm * (aCorner.y * uWidth * 0.5);\n vColor = aColor;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\n// Head: a screen-space triangle at the tip, pointing along the arrow.\nconst HEAD_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 1) in vec4 aArrow; // (bx,by,tx,ty) offset data space\nlayout(location = 2) in vec4 aColor;\nuniform vec2 uResolution;\nuniform float uHeadSize;\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vec2 s0 = (dataToClip(aArrow.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aArrow.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float w = uHeadSize * 0.6;\n vec2 pos;\n if (gl_VertexID == 0) pos = s1; // tip\n else if (gl_VertexID == 1) pos = s1 - dir * uHeadSize + nrm * w; // back-left\n else pos = s1 - dir * uHeadSize - nrm * w; // back-right\n vColor = aColor;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 vColor;\nuniform vec4 uColor;\nuniform float uUseVertexColor;\nout vec4 outColor;\nvoid main() {\n vec4 c = uUseVertexColor > 0.5 ? vColor : uColor;\n outColor = vec4(c.rgb * c.a, c.a);\n}`;\n\nconst SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\n\ntype Key = \"shaft\" | \"head\";\nconst cache = new WeakMap<WebGL2RenderingContext, Record<Key, WebGLProgram>>();\nfunction programs(gl: WebGL2RenderingContext): Record<Key, WebGLProgram> {\n let p = cache.get(gl);\n if (!p) {\n p = { shaft: createProgram(gl, SHAFT_VERT, FRAG), head: createProgram(gl, HEAD_VERT, FRAG) };\n cache.set(gl, p);\n }\n return p;\n}\n\nlet counter = 0;\n\nexport class QuiverLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private progs: Record<Key, WebGLProgram>;\n private shaftVao: WebGLVertexArrayObject;\n private headVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uShaft: Record<string, WebGLUniformLocation | null>;\n private uHead: Record<string, WebGLUniformLocation | null>;\n private color: Color;\n private width: number;\n private headSize: number;\n private useVertexColor: boolean;\n private count: number;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: QuiverOptions) {\n this.id = `quiver-${counter++}`;\n this.gl = gl;\n this.progs = programs(gl);\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.width = opts.width ?? 1.5;\n this.headSize = opts.headSize ?? 9;\n this.useVertexColor = opts.colorBy != null;\n\n const n = Math.min(opts.x.length, opts.y.length, opts.u.length, opts.v.length);\n this.count = n;\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n\n // Auto scale so the largest arrow spans ~90% of a nominal grid cell.\n let maxMag = 0;\n for (let i = 0; i < n; i++) maxMag = Math.max(maxMag, Math.hypot(opts.u[i]!, opts.v[i]!));\n let scale = opts.scale;\n if (scale == null) {\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n minX = Math.min(minX, opts.x[i]!); maxX = Math.max(maxX, opts.x[i]!);\n minY = Math.min(minY, opts.y[i]!); maxY = Math.max(maxY, opts.y[i]!);\n }\n const diag = Math.hypot(maxX - minX, maxY - minY) || 1;\n const cell = diag / Math.max(1, Math.sqrt(n));\n scale = maxMag > 0 ? (0.9 * cell) / maxMag : 1;\n }\n\n const arrows = new Float32Array(n * 4);\n const colors = new Float32Array(n * 4);\n const cmap = colormap(opts.colorBy?.colormap ?? \"viridis\");\n const vals = opts.colorBy?.values;\n let lo = opts.colorBy?.domain?.[0] ?? Infinity;\n let hi = opts.colorBy?.domain?.[1] ?? -Infinity;\n if (this.useVertexColor && !opts.colorBy?.domain) {\n for (let i = 0; i < n; i++) {\n const v = vals ? vals[i]! : Math.hypot(opts.u[i]!, opts.v[i]!);\n lo = Math.min(lo, v); hi = Math.max(hi, v);\n }\n }\n const span = (hi - lo) || 1;\n\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n const tx = x + opts.u[i]! * scale, ty = y + opts.v[i]! * scale;\n arrows[i * 4] = x - this.xRef; arrows[i * 4 + 1] = y - this.yRef;\n arrows[i * 4 + 2] = tx - this.xRef; arrows[i * 4 + 3] = ty - this.yRef;\n if (this.useVertexColor) {\n const v = vals ? vals[i]! : Math.hypot(opts.u[i]!, opts.v[i]!);\n const [r, g, b] = cmap((v - lo) / span);\n colors[i * 4] = r; colors[i * 4 + 1] = g; colors[i * 4 + 2] = b; colors[i * 4 + 3] = 1;\n }\n minX = Math.min(minX, x, tx); maxX = Math.max(maxX, x, tx);\n minY = Math.min(minY, y, ty); maxY = Math.max(maxY, y, ty);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const cornerBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, SEG_CORNERS, gl.STATIC_DRAW);\n const arrowBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, arrowBuf);\n gl.bufferData(gl.ARRAY_BUFFER, arrows, gl.STATIC_DRAW);\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n this.buffers = [cornerBuf, arrowBuf, colorBuf];\n\n this.shaftVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.shaftVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuf);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n this.bindInstanceAttribs(arrowBuf, colorBuf);\n gl.bindVertexArray(null);\n\n // Head VAO uses gl_VertexID for the triangle, only the instanced attribs.\n this.headVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.headVao);\n this.bindInstanceAttribs(arrowBuf, colorBuf);\n gl.bindVertexArray(null);\n\n this.uShaft = uniformLocations(gl, this.progs.shaft, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\", \"uUseVertexColor\",\n ]);\n this.uHead = uniformLocations(gl, this.progs.head, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uHeadSize\", \"uUseVertexColor\",\n ]);\n }\n\n private bindInstanceAttribs(arrowBuf: WebGLBuffer, colorBuf: WebGLBuffer): void {\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, arrowBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n const [r, g, b, a] = this.color;\n const uvc = this.useVertexColor ? 1 : 0;\n\n gl.useProgram(this.progs.shaft);\n setTransformUniforms(gl, this.uShaft, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uShaft.uColor!, r, g, b, a);\n gl.uniform2f(this.uShaft.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uShaft.uWidth!, this.width * state.dpr);\n gl.uniform1f(this.uShaft.uUseVertexColor!, uvc);\n gl.bindVertexArray(this.shaftVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n\n gl.useProgram(this.progs.head);\n setTransformUniforms(gl, this.uHead, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uHead.uColor!, r, g, b, a);\n gl.uniform2f(this.uHead.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uHead.uHeadSize!, this.headSize * state.dpr);\n gl.uniform1f(this.uHead.uUseVertexColor!, uvc);\n gl.bindVertexArray(this.headVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 3, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.shaftVao);\n this.gl.deleteVertexArray(this.headVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\nimport { pickNearest, type PickMode, type Picked } from \"./pick.js\";\n\nexport interface ScatterOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n color?: string | Color;\n /** Marker diameter in CSS pixels. */\n size?: number;\n name?: string;\n yAxis?: string;\n /**\n * Optional per-point text shown when a point is clicked (one entry per point,\n * parallel to `x`/`y`). Lets you attach your own info instead of the default\n * coordinate readout.\n */\n labels?: ArrayLike<string>;\n /** Color each point by a value through a colormap. */\n colorBy?: {\n values: ArrayLike<number>;\n colormap?: ColormapName;\n /** Value range mapped to [0,1]. Defaults to the data min/max. */\n domain?: Range;\n };\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit quad [-1,1]^2\nlayout(location = 1) in vec2 aPos; // point (offset data space)\nlayout(location = 2) in vec4 aColor; // per-point color (used if uUseVertexColor>0.5)\nuniform vec2 uResolution;\nuniform float uSize; // radius in device px\n${TRANSFORM_GLSL}\nout vec2 vLocal;\nout vec4 vColor;\nvoid main() {\n vec2 center = (dataToClip(aPos) * 0.5 + 0.5) * uResolution;\n vec2 pos = center + aCorner * uSize;\n vLocal = aCorner;\n vColor = aColor;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vLocal;\nin vec4 vColor;\nuniform vec4 uColor;\nuniform float uUseVertexColor;\nout vec4 outColor;\nvoid main() {\n float r = length(vLocal);\n if (r > 1.0) discard;\n float alpha = smoothstep(1.0, 1.0 - 0.15, r); // soft edge\n vec4 c = uUseVertexColor > 0.5 ? vColor : uColor;\n outColor = vec4(c.rgb * c.a * alpha, c.a * alpha);\n}`;\n\nconst CORNERS = new Float32Array([-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1]);\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class ScatterLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private count: number;\n private size: number;\n private color: Color;\n private useVertexColor: boolean;\n private labels?: ArrayLike<string>;\n private xRef = 0;\n private yRef = 0;\n private xs: Float64Array;\n private ys: Float64Array;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: ScatterOptions) {\n this.id = `scatter-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.size = opts.size ?? 5;\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.useVertexColor = opts.colorBy != null;\n this.labels = opts.labels;\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.count = n;\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n const pos = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n this.xs[i] = x; this.ys[i] = y;\n pos[i * 2] = x - this.xRef;\n pos[i * 2 + 1] = y - this.yRef;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n // Per-point colors (optional).\n const colors = new Float32Array(n * 4);\n if (opts.colorBy) {\n const vals = opts.colorBy.values;\n const cmap = colormap(opts.colorBy.colormap ?? \"viridis\");\n let lo = opts.colorBy.domain?.[0] ?? Infinity;\n let hi = opts.colorBy.domain?.[1] ?? -Infinity;\n if (!opts.colorBy.domain) {\n for (let i = 0; i < n; i++) {\n const v = vals[i]!;\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n const span = hi - lo || 1;\n for (let i = 0; i < n; i++) {\n const [r, g, b] = cmap((vals[i]! - lo) / span);\n colors[i * 4] = r; colors[i * 4 + 1] = g; colors[i * 4 + 2] = b; colors[i * 4 + 3] = 1;\n }\n }\n\n const vao = gl.createVertexArray()!;\n this.vao = vao;\n gl.bindVertexArray(vao);\n\n const cornerBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerBuf);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n const posBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, posBuf);\n gl.bufferData(gl.ARRAY_BUFFER, pos, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(2, 1);\n\n gl.bindVertexArray(null);\n this.buffers = [cornerBuf, posBuf, colorBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [\n ...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uSize\", \"uUseVertexColor\",\n ]);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n pick(\n mode: PickMode,\n cursorPx: number,\n cursorPy: number,\n project: (x: number, y: number) => [number, number],\n ): Picked | null {\n // Only a hit when the cursor is within the marker (+ a couple px of slack),\n // so a far-away point never highlights.\n const gatePx = this.size / 2 + 4;\n return pickNearest(this.xs, this.ys, this.count, mode, cursorPx, cursorPy, project, gatePx);\n }\n\n /** User-supplied text for a point, shown when it is clicked. */\n infoAt(index: number): string[] | null {\n const label = this.labels?.[index];\n return label != null ? [label] : null;\n }\n\n /** Replace point positions and re-upload (for streaming). Keeps uniform color. */\n setData(x: ArrayLike<number>, y: ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n this.count = n;\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? x[0]! : 0;\n this.yRef = n > 0 ? y[0]! : 0;\n const pos = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const vx = x[i]!, vy = y[i]!;\n this.xs[i] = vx; this.ys[i] = vy;\n pos[i * 2] = vx - this.xRef; pos[i * 2 + 1] = vy - this.yRef;\n if (vx < minX) minX = vx; if (vx > maxX) maxX = vx;\n if (vy < minY) minY = vy; if (vy > maxY) maxY = vy;\n }\n this.xBounds = [minX, maxX]; this.yBounds = [minY, maxY];\n this.useVertexColor = false;\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffers[1]!);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, pos, this.gl.DYNAMIC_DRAW);\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n gl.useProgram(this.program);\n setTransformUniforms(gl, this.uniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2], this.color[3]);\n gl.uniform2f(this.uniforms.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uniforms.uSize!, (this.size / 2) * state.dpr);\n gl.uniform1f(this.uniforms.uUseVertexColor!, this.useVertexColor ? 1 : 0);\n gl.bindVertexArray(this.vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\nimport { pickNearest, type PickMode, type Picked } from \"./pick.js\";\n\nexport interface StemOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Where stems start. Default 0. */\n baseline?: number;\n color?: string | Color;\n /** Stem thickness in CSS px. Default 1.5. */\n width?: number;\n /** Tip marker diameter in CSS px (0 hides). Default 6. */\n markerSize?: number;\n name?: string;\n yAxis?: string;\n}\n\n// Vertical stem: a data-space segment from (x, base) to (x, y), pixel-thick.\nconst STEM_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // (along 0..1, side -1..1)\nlayout(location = 1) in vec4 aSeg; // (x0,y0,x1,y1) offset data space\nuniform vec2 uResolution;\nuniform float uWidth;\n${TRANSFORM_GLSL}\nvoid main() {\n vec2 s0 = (dataToClip(aSeg.xy) * 0.5 + 0.5) * uResolution;\n vec2 s1 = (dataToClip(aSeg.zw) * 0.5 + 0.5) * uResolution;\n vec2 d = s1 - s0;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n vec2 pos = mix(s0, s1, aCorner.x) + nrm * (aCorner.y * uWidth * 0.5);\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst MARKER_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aCorner; // unit quad [-1,1]^2\nlayout(location = 1) in vec2 aPos; // tip point (offset data space)\nuniform vec2 uResolution;\nuniform float uSize; // radius in device px\n${TRANSFORM_GLSL}\nout vec2 vLocal;\nvoid main() {\n vec2 c = (dataToClip(aPos) * 0.5 + 0.5) * uResolution;\n vLocal = aCorner;\n vec2 pos = c + aCorner * uSize;\n gl_Position = vec4((pos / uResolution) * 2.0 - 1.0, 0.0, 1.0);\n}`;\n\nconst SOLID_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(uColor.rgb * uColor.a, uColor.a); }`;\n\nconst DISC_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vLocal;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() {\n float r = length(vLocal);\n if (r > 1.0) discard;\n float alpha = smoothstep(1.0, 1.0 - 0.15, r);\n outColor = vec4(uColor.rgb * uColor.a * alpha, uColor.a * alpha);\n}`;\n\nconst SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\nconst QUAD_CORNERS = new Float32Array([-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1]);\n\ntype Key = \"stem\" | \"marker\";\nconst cache = new WeakMap<WebGL2RenderingContext, Record<Key, WebGLProgram>>();\nfunction programs(gl: WebGL2RenderingContext): Record<Key, WebGLProgram> {\n let p = cache.get(gl);\n if (!p) {\n p = { stem: createProgram(gl, STEM_VERT, SOLID_FRAG), marker: createProgram(gl, MARKER_VERT, DISC_FRAG) };\n cache.set(gl, p);\n }\n return p;\n}\n\nlet counter = 0;\n\nexport class StemLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n private gl: WebGL2RenderingContext;\n private progs: Record<Key, WebGLProgram>;\n private stemVao: WebGLVertexArrayObject;\n private markerVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private uStem: Record<string, WebGLUniformLocation | null>;\n private uMarker: Record<string, WebGLUniformLocation | null>;\n private color: Color;\n private width: number;\n private markerSize: number;\n private count: number;\n private baseline: number;\n private xRef = 0;\n private yRef = 0;\n private xs: Float64Array;\n private ys: Float64Array;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n\n constructor(gl: WebGL2RenderingContext, opts: StemOptions) {\n this.id = `stem-${counter++}`;\n this.gl = gl;\n this.progs = programs(gl);\n const colorInput = opts.color ?? \"#3b82f6\";\n this.color = Array.isArray(colorInput) ? (colorInput as Color) : parseColor(colorInput as string);\n this.colorCss = typeof colorInput === \"string\" ? colorInput : toColorCss(this.color);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.width = opts.width ?? 1.5;\n this.markerSize = opts.markerSize ?? 6;\n this.baseline = opts.baseline ?? 0;\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.count = n;\n this.xs = new Float64Array(n);\n this.ys = new Float64Array(n);\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n\n const segs = new Float32Array(n * 4);\n const tips = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity;\n let minY = Math.min(this.baseline, Infinity), maxY = Math.max(this.baseline, -Infinity);\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!;\n this.xs[i] = x; this.ys[i] = y;\n segs[i * 4] = x - this.xRef; segs[i * 4 + 1] = this.baseline - this.yRef;\n segs[i * 4 + 2] = x - this.xRef; segs[i * 4 + 3] = y - this.yRef;\n tips[i * 2] = x - this.xRef; tips[i * 2 + 1] = y - this.yRef;\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n const cornerSeg = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.bufferData(gl.ARRAY_BUFFER, SEG_CORNERS, gl.STATIC_DRAW);\n const cornerQuad = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerQuad);\n gl.bufferData(gl.ARRAY_BUFFER, QUAD_CORNERS, gl.STATIC_DRAW);\n const segBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.bufferData(gl.ARRAY_BUFFER, segs, gl.STATIC_DRAW);\n const tipBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, tipBuf);\n gl.bufferData(gl.ARRAY_BUFFER, tips, gl.STATIC_DRAW);\n this.buffers = [cornerSeg, cornerQuad, segBuf, tipBuf];\n\n this.stemVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.stemVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerSeg);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n\n this.markerVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.markerVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, cornerQuad);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, tipBuf);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(1, 1);\n gl.bindVertexArray(null);\n\n this.uStem = uniformLocations(gl, this.progs.stem, [...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uWidth\"]);\n this.uMarker = uniformLocations(gl, this.progs.marker, [...TRANSFORM_UNIFORMS, \"uColor\", \"uResolution\", \"uSize\"]);\n }\n\n bounds() {\n if (this.count === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n pick(\n mode: PickMode,\n cursorPx: number,\n cursorPy: number,\n project: (x: number, y: number) => [number, number],\n ): Picked | null {\n return pickNearest(this.xs, this.ys, this.count, mode, cursorPx, cursorPy, project);\n }\n\n draw(state: DrawState): void {\n if (this.count === 0) return;\n const gl = state.gl;\n const [r, g, b, a] = this.color;\n\n gl.useProgram(this.progs.stem);\n setTransformUniforms(gl, this.uStem, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uStem.uColor!, r, g, b, a);\n gl.uniform2f(this.uStem.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uStem.uWidth!, this.width * state.dpr);\n gl.bindVertexArray(this.stemVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n\n if (this.markerSize > 0) {\n gl.useProgram(this.progs.marker);\n setTransformUniforms(gl, this.uMarker, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.uMarker.uColor!, r, g, b, a);\n gl.uniform2f(this.uMarker.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uMarker.uSize!, (this.markerSize / 2) * state.dpr);\n gl.bindVertexArray(this.markerVao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);\n gl.bindVertexArray(null);\n }\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.stemVao);\n this.gl.deleteVertexArray(this.markerVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import type { Scale } from \"../scales/scale.js\";\nimport type { Tick } from \"../types.js\";\n\n/** Pixel geometry of the plot, in CSS pixels. The plot region excludes margins. */\nexport interface Layout {\n cssWidth: number;\n cssHeight: number;\n margin: { top: number; right: number; bottom: number; left: number };\n}\n\nexport interface PlotRegion {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport function plotRegion(layout: Layout): PlotRegion {\n const { margin } = layout;\n return {\n left: margin.left,\n top: margin.top,\n width: Math.max(0, layout.cssWidth - margin.left - margin.right),\n height: Math.max(0, layout.cssHeight - margin.top - margin.bottom),\n };\n}\n\nexport interface Theme {\n axis: string;\n grid: string;\n gridMinor: string;\n text: string;\n font: string;\n}\n\nexport const lightTheme: Theme = {\n axis: \"#334155\",\n grid: \"rgba(100,116,139,0.18)\",\n gridMinor: \"rgba(100,116,139,0.08)\",\n text: \"#475569\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n};\n\nexport const darkTheme: Theme = {\n axis: \"#cbd5e1\",\n grid: \"rgba(148,163,184,0.16)\",\n gridMinor: \"rgba(148,163,184,0.07)\",\n text: \"#94a3b8\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n};\n\nexport function pxX(region: PlotRegion, t: number): number {\n return region.left + t * region.width;\n}\nexport function pxY(region: PlotRegion, t: number): number {\n // t is normalized bottom->top; screen y grows downward.\n return region.top + (1 - t) * region.height;\n}\n\n/** Draw vertical (x) and horizontal (y) grid lines for the given ticks. */\nexport function drawGrid(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n scaleX: Scale,\n scaleY: Scale,\n ticksX: Tick[],\n ticksY: Tick[],\n theme: Theme,\n): void {\n ctx.save();\n ctx.lineWidth = 1;\n for (const t of ticksX) {\n if (!t.grid) continue;\n const x = Math.round(pxX(region, scaleX.norm(t.value))) + 0.5;\n ctx.strokeStyle = t.minor ? theme.gridMinor : theme.grid;\n ctx.beginPath();\n ctx.moveTo(x, region.top);\n ctx.lineTo(x, region.top + region.height);\n ctx.stroke();\n }\n for (const t of ticksY) {\n if (!t.grid) continue;\n const y = Math.round(pxY(region, scaleY.norm(t.value))) + 0.5;\n ctx.strokeStyle = t.minor ? theme.gridMinor : theme.grid;\n ctx.beginPath();\n ctx.moveTo(region.left, y);\n ctx.lineTo(region.left + region.width, y);\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/** Draw the bottom (x) axis line, ticks, labels, and optional title. */\nexport function drawXAxis(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n scaleX: Scale,\n ticksX: Tick[],\n theme: Theme,\n title?: string,\n): void {\n ctx.save();\n ctx.strokeStyle = theme.axis;\n ctx.fillStyle = theme.text;\n ctx.font = theme.font;\n ctx.lineWidth = 1;\n const bottom = region.top + region.height;\n\n ctx.beginPath();\n ctx.moveTo(region.left, bottom + 0.5);\n ctx.lineTo(region.left + region.width, bottom + 0.5);\n ctx.stroke();\n\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n for (const t of ticksX) {\n const x = Math.round(pxX(region, scaleX.norm(t.value))) + 0.5;\n const len = t.minor ? 3 : 5;\n ctx.beginPath();\n ctx.moveTo(x, bottom);\n ctx.lineTo(x, bottom + len);\n ctx.stroke();\n if (t.label) ctx.fillText(t.label, x, bottom + len + 3);\n }\n\n if (title) {\n ctx.textBaseline = \"bottom\";\n ctx.fillText(title, region.left + region.width / 2, bottom + 34);\n }\n ctx.restore();\n}\n\nexport interface YAxisDraw {\n /** Pixel x-position of the axis line. */\n x: number;\n side: \"left\" | \"right\";\n title?: string;\n /** Optional color override (secondary axes often match their series). */\n color?: string;\n /** Pixel x-position for the rotated title. */\n titleX?: number;\n}\n\n/** Draw one vertical (y) axis line, ticks, labels, and optional title. */\nexport function drawYAxis(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n scaleY: Scale,\n ticksY: Tick[],\n theme: Theme,\n opts: YAxisDraw,\n): void {\n ctx.save();\n const color = opts.color ?? theme.axis;\n ctx.strokeStyle = color;\n ctx.fillStyle = opts.color ?? theme.text;\n ctx.font = theme.font;\n ctx.lineWidth = 1;\n\n const ax = Math.round(opts.x) + 0.5;\n const dir = opts.side === \"left\" ? -1 : 1;\n\n ctx.beginPath();\n ctx.moveTo(ax, region.top);\n ctx.lineTo(ax, region.top + region.height);\n ctx.stroke();\n\n ctx.textAlign = opts.side === \"left\" ? \"right\" : \"left\";\n ctx.textBaseline = \"middle\";\n for (const t of ticksY) {\n const y = Math.round(pxY(region, scaleY.norm(t.value))) + 0.5;\n const len = t.minor ? 3 : 5;\n ctx.beginPath();\n ctx.moveTo(ax, y);\n ctx.lineTo(ax + dir * len, y);\n ctx.stroke();\n if (t.label) ctx.fillText(t.label, ax + dir * (len + 4), y);\n }\n\n if (opts.title) {\n ctx.save();\n const tx = opts.titleX ?? (opts.side === \"left\" ? 12 : region.left + region.width + 36);\n ctx.translate(tx, region.top + region.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.textBaseline = opts.side === \"left\" ? \"top\" : \"bottom\";\n ctx.fillText(opts.title, 0, 0);\n ctx.restore();\n }\n ctx.restore();\n}\n\n/** Draw a vertical crosshair line at pixel x (hover). */\nexport function drawCrosshair(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n px: number,\n theme: Theme,\n): void {\n ctx.save();\n ctx.strokeStyle = theme.text;\n ctx.globalAlpha = 0.4;\n ctx.setLineDash([3, 3]);\n ctx.lineWidth = 1;\n const x = Math.round(px) + 0.5;\n ctx.beginPath();\n ctx.moveTo(x, region.top);\n ctx.lineTo(x, region.top + region.height);\n ctx.stroke();\n ctx.restore();\n}\n\n/** Draw both a vertical and a horizontal dashed guide line through (px, py). */\nexport function drawCrosshairXY(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n px: number,\n py: number,\n theme: Theme,\n): void {\n const left = region.left;\n const right = region.left + region.width;\n const top = region.top;\n const bottom = region.top + region.height;\n if (px < left || px > right || py < top || py > bottom) return;\n ctx.save();\n ctx.strokeStyle = theme.text;\n ctx.globalAlpha = 0.4;\n ctx.setLineDash([3, 3]);\n ctx.lineWidth = 1;\n const x = Math.round(px) + 0.5;\n const y = Math.round(py) + 0.5;\n ctx.beginPath();\n ctx.moveTo(x, top);\n ctx.lineTo(x, bottom);\n ctx.moveTo(left, y);\n ctx.lineTo(right, y);\n ctx.stroke();\n ctx.restore();\n}\n\n/** Draw a filled marker (hover point highlight). */\nexport function drawMarker(\n ctx: CanvasRenderingContext2D,\n px: number,\n py: number,\n color: string,\n): void {\n ctx.save();\n ctx.fillStyle = color;\n ctx.strokeStyle = \"#ffffff\";\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.arc(px, py, 4, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n}\n","import { autoTicks, defaultFormat } from \"../axes/ticks.js\";\nimport type { Range, Tick } from \"../types.js\";\n\n/**\n * A scale maps data-space values to normalized [0,1] and back, and knows how to\n * generate its own \"nice\" ticks + default label format. `log` tells layers to\n * apply a log10 transform on the GPU.\n */\nexport interface Scale {\n readonly type: string;\n readonly log: boolean;\n domain: Range;\n norm(value: number): number;\n invert(t: number): number;\n /** Auto ticks appropriate for this scale type. */\n ticks(target?: number): Tick[];\n /** Default label formatter for a tick value. */\n formatTick(value: number): string;\n}\n\nexport class LinearScale implements Scale {\n readonly type = \"linear\";\n readonly log = false;\n domain: Range;\n constructor(domain: Range = [0, 1]) {\n this.domain = domain;\n }\n norm(value: number): number {\n const [a, b] = this.domain;\n return b === a ? 0 : (value - a) / (b - a);\n }\n invert(t: number): number {\n const [a, b] = this.domain;\n return a + t * (b - a);\n }\n ticks(target = 6): Tick[] {\n return autoTicks(this.domain[0], this.domain[1], target);\n }\n formatTick(value: number): string {\n return defaultFormat(value);\n }\n}\n\nexport class LogScale implements Scale {\n readonly type = \"log\";\n readonly log = true;\n domain: Range;\n constructor(domain: Range = [1, 1000]) {\n this.domain = LogScale.sanitize(domain);\n }\n private static sanitize(d: Range): Range {\n // Log requires strictly positive bounds.\n const lo = d[0] > 0 ? d[0] : 1e-9;\n const hi = d[1] > lo ? d[1] : lo * 10;\n return [lo, hi];\n }\n private get la() {\n return Math.log10(this.domain[0]);\n }\n private get lb() {\n return Math.log10(this.domain[1]);\n }\n norm(value: number): number {\n if (value <= 0) return 0;\n return (Math.log10(value) - this.la) / (this.lb - this.la);\n }\n invert(t: number): number {\n return Math.pow(10, this.la + t * (this.lb - this.la));\n }\n ticks(): Tick[] {\n const [a, b] = this.domain;\n const lo = Math.floor(Math.log10(a));\n const hi = Math.ceil(Math.log10(b));\n const ticks: Tick[] = [];\n for (let e = lo; e <= hi; e++) {\n const base = Math.pow(10, e);\n ticks.push({ value: base });\n for (let m = 2; m <= 9; m++) ticks.push({ value: m * base, minor: true, grid: false });\n }\n return ticks;\n }\n formatTick(value: number): string {\n const e = Math.round(Math.log10(value));\n if (e <= -4 || e >= 5) return `1e${e}`;\n return defaultFormat(value);\n }\n}\n\n// Candidate time steps in milliseconds, coarse→fine chosen by target count.\nconst SECOND = 1000, MINUTE = 60_000, HOUR = 3_600_000, DAY = 86_400_000;\nconst TIME_STEPS = [\n SECOND, 5 * SECOND, 15 * SECOND, 30 * SECOND,\n MINUTE, 5 * MINUTE, 15 * MINUTE, 30 * MINUTE,\n HOUR, 3 * HOUR, 6 * HOUR, 12 * HOUR,\n DAY, 2 * DAY, 7 * DAY, 30 * DAY, 90 * DAY, 365 * DAY,\n];\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n}\n\n/** Linear over epoch-millisecond values, with calendar-aware ticks/labels. */\nexport class TimeScale implements Scale {\n readonly type = \"time\";\n readonly log = false;\n domain: Range;\n constructor(domain: Range = [0, DAY]) {\n this.domain = domain;\n }\n norm(value: number): number {\n const [a, b] = this.domain;\n return b === a ? 0 : (value - a) / (b - a);\n }\n invert(t: number): number {\n const [a, b] = this.domain;\n return a + t * (b - a);\n }\n private chooseStep(target: number): number {\n const ideal = (this.domain[1] - this.domain[0]) / target;\n for (const s of TIME_STEPS) if (s >= ideal) return s;\n return TIME_STEPS[TIME_STEPS.length - 1]!;\n }\n ticks(target = 6): Tick[] {\n const [a, b] = this.domain;\n if (!isFinite(a) || !isFinite(b) || a === b) return [];\n const step = this.chooseStep(target);\n const start = Math.ceil(a / step) * step;\n const ticks: Tick[] = [];\n for (let i = 0; i < 1000; i++) {\n const v = start + i * step;\n if (v > b) break;\n ticks.push({ value: v });\n }\n return ticks;\n }\n formatTick(value: number): string {\n const span = this.domain[1] - this.domain[0];\n const d = new Date(value);\n if (span < DAY) return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n if (span < 90 * DAY) return `${d.getMonth() + 1}/${d.getDate()}`;\n return `${d.getFullYear()}`;\n }\n}\n\nexport type ScaleType = \"linear\" | \"log\" | \"time\";\n\nexport function makeScale(type: ScaleType, domain?: Range): Scale {\n switch (type) {\n case \"linear\":\n return new LinearScale(domain);\n case \"log\":\n return new LogScale(domain);\n case \"time\":\n return new TimeScale(domain);\n default:\n throw new Error(`Unknown scale type: ${type as string}`);\n }\n}\n","import type { InteractionMode } from \"../types.js\";\n\n/** The subset of Plot the toolbar drives. Kept minimal to avoid an import cycle. */\nexport interface ToolbarHost {\n setMode(mode: InteractionMode): void;\n getMode(): InteractionMode;\n home(): void;\n onModeChange(cb: (mode: InteractionMode) => void): void;\n}\n\nexport interface ToolbarTheme {\n bg: string;\n fg: string;\n border: string;\n activeBg: string;\n activeFg: string;\n hoverBg: string;\n}\n\nconst lightToolbar: ToolbarTheme = {\n bg: \"rgba(255,255,255,0.9)\",\n fg: \"#475569\",\n border: \"rgba(100,116,139,0.25)\",\n activeBg: \"#3b82f6\",\n activeFg: \"#ffffff\",\n hoverBg: \"rgba(100,116,139,0.12)\",\n};\n\nconst darkToolbar: ToolbarTheme = {\n bg: \"rgba(15,23,42,0.85)\",\n fg: \"#cbd5e1\",\n border: \"rgba(148,163,184,0.25)\",\n activeBg: \"#3b82f6\",\n activeFg: \"#ffffff\",\n hoverBg: \"rgba(148,163,184,0.15)\",\n};\n\n// 16x16 SVG icons, currentColor-driven so they inherit button color.\nconst ICONS = {\n home: `<path d=\"M2 7.5 8 2l6 5.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 7v6.5h3.2V10h1.6v3.5H12V7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n pan: `<path d=\"M8 1.5v13M1.5 8h13M8 1.5 6 3.5M8 1.5l2 2M8 14.5l-2-2M8 14.5l2-2M1.5 8l2-2M1.5 8l2 2M14.5 8l-2-2M14.5 8l-2 2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n box: `<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-dasharray=\"2.4 2\"/><circle cx=\"8\" cy=\"8\" r=\"1.4\" fill=\"currentColor\"/>`,\n boxX: `<path d=\"M1.5 8h13M3.5 5.5 1.5 8l2 2.5M12.5 5.5 14.5 8l-2 2.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4.5\" y=\"3\" width=\"7\" height=\"10\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-dasharray=\"2 1.8\"/>`,\n boxY: `<path d=\"M8 1.5v13M5.5 3.5 8 1.5l2.5 2M5.5 12.5 8 14.5l2.5-2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"3\" y=\"4.5\" width=\"10\" height=\"7\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-dasharray=\"2 1.8\"/>`,\n};\n\ninterface Btn {\n key: string;\n title: string;\n icon: string;\n mode?: InteractionMode;\n action?: () => void;\n}\n\n/** Build a floating toolbar in `container` and wire it to the plot host. */\nexport function createToolbar(\n container: HTMLElement,\n host: ToolbarHost,\n dark: boolean,\n): { element: HTMLElement; destroy: () => void } {\n const t = dark ? darkToolbar : lightToolbar;\n\n const bar = document.createElement(\"div\");\n Object.assign(bar.style, {\n position: \"absolute\",\n top: \"8px\",\n right: \"8px\",\n zIndex: \"3\",\n display: \"flex\",\n gap: \"2px\",\n padding: \"3px\",\n borderRadius: \"8px\",\n background: t.bg,\n border: `1px solid ${t.border}`,\n backdropFilter: \"blur(6px)\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.15)\",\n } as CSSStyleDeclaration);\n\n const buttons: Btn[] = [\n { key: \"home\", title: \"Reset view (Home)\", icon: ICONS.home, action: () => host.home() },\n { key: \"pan\", title: \"Pan\", icon: ICONS.pan, mode: \"pan\" },\n { key: \"box\", title: \"Box zoom\", icon: ICONS.box, mode: \"box\" },\n { key: \"box-x\", title: \"Zoom X only\", icon: ICONS.boxX, mode: \"box-x\" },\n { key: \"box-y\", title: \"Zoom Y only\", icon: ICONS.boxY, mode: \"box-y\" },\n ];\n\n const modeButtons = new Map<InteractionMode, HTMLButtonElement>();\n\n for (const b of buttons) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.title = b.title;\n btn.setAttribute(\"aria-label\", b.title);\n btn.innerHTML = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">${b.icon}</svg>`;\n Object.assign(btn.style, {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"26px\",\n height: \"26px\",\n padding: \"0\",\n border: \"none\",\n borderRadius: \"6px\",\n background: \"transparent\",\n color: t.fg,\n cursor: \"pointer\",\n transition: \"background 0.12s, color 0.12s\",\n } as CSSStyleDeclaration);\n\n btn.addEventListener(\"mouseenter\", () => {\n if (btn.dataset.active !== \"true\") btn.style.background = t.hoverBg;\n });\n btn.addEventListener(\"mouseleave\", () => {\n if (btn.dataset.active !== \"true\") btn.style.background = \"transparent\";\n });\n btn.addEventListener(\"click\", () => {\n if (b.action) b.action();\n if (b.mode) host.setMode(b.mode);\n });\n\n if (b.mode) modeButtons.set(b.mode, btn);\n bar.appendChild(btn);\n }\n\n const setActive = (mode: InteractionMode) => {\n for (const [m, btn] of modeButtons) {\n const active = m === mode;\n btn.dataset.active = String(active);\n btn.style.background = active ? t.activeBg : \"transparent\";\n btn.style.color = active ? t.activeFg : t.fg;\n }\n };\n\n setActive(host.getMode());\n host.onModeChange(setActive);\n\n container.appendChild(bar);\n return {\n element: bar,\n destroy: () => bar.remove(),\n };\n}\n","import { Axis } from \"./axes/axis.js\";\nimport { defaultFormat } from \"./axes/ticks.js\";\nimport { begin2D, getSharedGL, sizeShared } from \"./gl/shared.js\";\nimport type { AxisFrame } from \"./gl/transform.js\";\nimport { AreaLayer, type AreaOptions } from \"./layers/area.js\";\nimport { BarLayer, type BarOptions } from \"./layers/bar.js\";\nimport { BoxLayer, type BoxOptions } from \"./layers/box.js\";\nimport { CandlestickLayer, type CandlestickOptions } from \"./layers/candlestick.js\";\nimport { ContourLayer, type ContourOptions } from \"./layers/contour.js\";\nimport { ErrorBarLayer, type ErrorBarOptions } from \"./layers/errorbar.js\";\nimport { HeatmapLayer, type HeatmapOptions } from \"./layers/heatmap.js\";\nimport { HexbinLayer, type HexbinOptions } from \"./layers/hexbin.js\";\nimport type { Layer } from \"./layers/layer.js\";\nimport { LineLayer, type LineOptions } from \"./layers/line.js\";\nimport { QuiverLayer, type QuiverOptions } from \"./layers/quiver.js\";\nimport { ScatterLayer, type ScatterOptions } from \"./layers/scatter.js\";\nimport { StemLayer, type StemOptions } from \"./layers/stem.js\";\nimport { histogram, spectrogram } from \"./stats/index.js\";\nimport {\n darkTheme,\n drawCrosshair,\n drawCrosshairXY,\n drawGrid,\n drawMarker,\n drawXAxis,\n drawYAxis,\n lightTheme,\n plotRegion,\n pxX,\n pxY,\n type Layout,\n type Theme,\n} from \"./render/overlay.js\";\nimport type { PickMode } from \"./layers/pick.js\";\nimport { LinearScale, makeScale, type Scale, type ScaleType } from \"./scales/scale.js\";\nimport { createToolbar } from \"./ui/toolbar.js\";\nimport type { AxisConfig, Dim, InteractionMode, Range } from \"./types.js\";\n\nexport interface AxisScaleOptions {\n type?: ScaleType;\n /** Fixed domain. If omitted, the axis autoscales to the data. */\n domain?: Range;\n}\n\nexport interface YAxisOptions extends AxisConfig {\n type?: ScaleType;\n domain?: Range;\n /** Which side to draw the axis on. Default `\"right\"` for secondary axes. */\n side?: \"left\" | \"right\";\n /** Axis + label color (secondary axes often match their series). */\n color?: string;\n}\n\n/** One line of the hover tooltip header, produced by {@link PlotOptions.hoverReadout}. */\nexport interface HoverReadoutRow {\n label: string;\n value: string;\n}\n\nexport interface PlotOptions {\n scales?: { x?: AxisScaleOptions; y?: AxisScaleOptions };\n axes?: { x?: AxisConfig; y?: AxisConfig };\n theme?: \"light\" | \"dark\" | Theme;\n margin?: Partial<Layout[\"margin\"]>;\n /** Enable wheel-zoom and drag interaction. Default true. */\n interactive?: boolean;\n /** Show the built-in toolbar (home + pan/box/X/Y zoom modes). Default true. */\n showToolbar?: boolean;\n /** Initial interaction mode. Default `\"pan\"`. */\n mode?: InteractionMode;\n /** Enable hover crosshair + tooltip. Default true. */\n hover?: boolean;\n /**\n * How hover selects the highlighted point: `\"x\"` nearest by x (classic),\n * `\"y\"` nearest by y, or `\"xy\"` nearest by 2D distance — the last checks both\n * axes, which is what a scatter/map needs. Default `\"x\"`.\n */\n pick?: PickMode;\n /**\n * When a point's pinned detail box appears: `\"click\"` pins it on click (until\n * you click empty space), `\"hover\"` shows it while the cursor is over a point.\n * Default `\"click\"`.\n */\n pointInfo?: \"hover\" | \"click\";\n /**\n * Show dashed guide lines on *both* the X and Y axes at the cursor — on hover\n * and while the pointer is pressed. When false, hover shows only the vertical\n * (X) line and there are no press guides. Default true.\n */\n crosshair?: boolean;\n /**\n * Keep data-units-per-pixel equal on both axes so nothing is distorted (the\n * looser axis is expanded to match). Essential for maps. Default false.\n */\n equalAspect?: boolean;\n /**\n * Constrain panning/zooming so the view can't move outside the data bounds\n * (the union of all layers' extents). Zoom still works; the view is just\n * kept inside the limits. Default false (a map turns it on).\n */\n boundedPan?: boolean;\n /**\n * Customize the tooltip header shown on hover. Given the cursor's data-space\n * X and Y (primary y axis), return the lines to display above the series\n * rows — e.g. a map converts world coords to `lon`/`lat`. When omitted, the\n * header is the default single `x = …` line. Default undefined.\n */\n hoverReadout?: (dataX: number, dataY: number) => HoverReadoutRow[];\n}\n\ninterface YAxisState {\n id: string;\n scale: Scale;\n axis: Axis;\n side: \"left\" | \"right\";\n auto: boolean;\n initial: Range | null;\n color?: string;\n}\n\nconst DEFAULT_MARGIN = { top: 16, right: 16, bottom: 40, left: 56 };\nconst Y_AXIS_GAP = 52;\n\n/** Layers that can report a nearest point participate in hover/tooltip. */\ninterface Pickable {\n readonly name: string;\n readonly colorCss: string;\n readonly yAxis: string;\n pick(\n mode: PickMode,\n cursorPx: number,\n cursorPy: number,\n project: (x: number, y: number) => [number, number],\n ): { x: number; y: number; index: number } | null;\n /** Optional user-supplied detail lines for a point index (click info). */\n infoAt?(index: number): string[] | null;\n}\nfunction isPickable(layer: Layer): layer is Layer & Pickable {\n return typeof (layer as Partial<Pickable>).pick === \"function\";\n}\n\n/** Pad a data range for autoscaling — linearly, or multiplicatively for log axes. */\nfunction padDomain(min: number, max: number, log: boolean, frac: number): Range {\n if (log) {\n // Keep bounds strictly positive and pad by a factor in log space.\n const lo = min > 0 ? min : max > 0 ? max / 1000 : 1e-9;\n const hi = max > lo ? max : lo * 10;\n const f = Math.pow(hi / lo, frac);\n return [lo / f, hi * f];\n }\n const pad = (max - min) * frac || 1;\n return [min - pad, max + pad];\n}\n\n/**\n * Translate `[lo,hi]` so it sits within data bounds `[dlo,dhi]` **without\n * changing its span** (so zoom level / aspect are preserved). When the view is\n * wider than the data, the data band is kept fully inside the view instead.\n */\nfunction clampAxis(domain: Range, bounds: Range): Range {\n const [lo, hi] = domain;\n const span = hi - lo;\n const [dlo, dhi] = bounds;\n if (span >= dhi - dlo) {\n const loMin = dhi - span;\n const clampedLo = Math.min(Math.max(lo, loMin), dlo);\n return [clampedLo, clampedLo + span];\n }\n let clampedLo = Math.max(lo, dlo);\n if (clampedLo + span > dhi) clampedLo = dhi - span;\n return [clampedLo, clampedLo + span];\n}\n\n/**\n * The imperative core plot. Owns a stack of three canvases (grid / WebGL data /\n * axis overlay), a shared x scale, and one-or-more named y axes.\n */\nexport class Plot {\n private container: HTMLElement;\n private gridCanvas: HTMLCanvasElement;\n private dataCanvas: HTMLCanvasElement;\n private axisCanvas: HTMLCanvasElement;\n private gridCtx: CanvasRenderingContext2D;\n private dataCtx: CanvasRenderingContext2D;\n private axisCtx: CanvasRenderingContext2D;\n private gl: WebGL2RenderingContext;\n /** Shared offscreen WebGL canvas we render into, then blit onto `dataCanvas`. */\n private sharedCanvas: HTMLCanvasElement;\n\n private scaleX: Scale;\n private axisX: Axis;\n private autoX: boolean;\n private initialX: Range | null;\n\n /** Named y axes, insertion-ordered. `\"y\"` is always the primary. */\n private yAxes = new Map<string, YAxisState>();\n\n private layers: Layer[] = [];\n private theme: Theme;\n private isDark: boolean;\n private baseMargin: Layout[\"margin\"];\n private dpr = 1;\n private resizeObserver: ResizeObserver;\n private frameRequested = false;\n\n private mode: InteractionMode;\n private selectionDiv: HTMLDivElement;\n private modeChangeCbs: Array<(mode: InteractionMode) => void> = [];\n private toolbarHandle: { destroy: () => void } | null = null;\n\n private hoverEnabled: boolean;\n private hoverPx: { x: number; y: number } | null = null;\n private pickMode: PickMode;\n private pointInfo: \"hover\" | \"click\";\n private crosshair: boolean;\n private equalAspect: boolean;\n private boundedPan: boolean;\n private hoverReadout?: (dataX: number, dataY: number) => HoverReadoutRow[];\n /** Cursor position while the pointer is pressed, when `crosshair`. */\n private pressPx: { x: number; y: number } | null = null;\n private tooltip: HTMLDivElement;\n /** A point clicked to pin its details, until another click clears it. */\n private selected: { layer: Pickable; x: number; y: number; index: number } | null = null;\n private infoBox: HTMLDivElement;\n\n constructor(container: HTMLElement, options: PlotOptions = {}) {\n this.container = container;\n if (getComputedStyle(container).position === \"static\") {\n container.style.position = \"relative\";\n }\n\n this.gridCanvas = this.makeCanvas(0);\n this.dataCanvas = this.makeCanvas(1);\n this.axisCanvas = this.makeCanvas(2);\n\n this.gridCtx = this.gridCanvas.getContext(\"2d\")!;\n this.dataCtx = this.dataCanvas.getContext(\"2d\")!;\n this.axisCtx = this.axisCanvas.getContext(\"2d\")!;\n const s = getSharedGL();\n this.gl = s.gl;\n this.sharedCanvas = s.canvas;\n\n const sx = options.scales?.x ?? {};\n const sy = options.scales?.y ?? {};\n this.scaleX = makeScale(sx.type ?? \"linear\", sx.domain ?? [0, 1]);\n this.autoX = sx.domain == null;\n this.initialX = sx.domain ?? null;\n this.axisX = new Axis(options.axes?.x);\n\n // Primary y axis.\n this.yAxes.set(\"y\", {\n id: \"y\",\n scale: makeScale(sy.type ?? \"linear\", sy.domain ?? [0, 1]),\n axis: new Axis(options.axes?.y),\n side: \"left\",\n auto: sy.domain == null,\n initial: sy.domain ?? null,\n });\n\n this.isDark = options.theme === \"dark\";\n this.theme =\n options.theme === \"dark\"\n ? darkTheme\n : options.theme === \"light\" || options.theme == null\n ? lightTheme\n : options.theme;\n this.baseMargin = { ...DEFAULT_MARGIN, ...options.margin };\n this.mode = options.mode ?? \"pan\";\n this.hoverEnabled = options.hover !== false;\n this.pickMode = options.pick ?? \"x\";\n this.pointInfo = options.pointInfo ?? \"click\";\n this.crosshair = options.crosshair ?? true;\n this.equalAspect = options.equalAspect ?? false;\n this.boundedPan = options.boundedPan ?? false;\n this.hoverReadout = options.hoverReadout;\n\n // Selection rectangle overlay for box zoom.\n this.selectionDiv = document.createElement(\"div\");\n Object.assign(this.selectionDiv.style, {\n position: \"absolute\",\n display: \"none\",\n zIndex: \"2\",\n pointerEvents: \"none\",\n background: \"rgba(59,130,246,0.15)\",\n border: \"1px solid rgba(59,130,246,0.9)\",\n borderRadius: \"1px\",\n } as CSSStyleDeclaration);\n container.appendChild(this.selectionDiv);\n\n // Tooltip.\n this.tooltip = document.createElement(\"div\");\n Object.assign(this.tooltip.style, {\n position: \"absolute\",\n display: \"none\",\n zIndex: \"4\",\n pointerEvents: \"none\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n lineHeight: \"1.4\",\n whiteSpace: \"nowrap\",\n background: this.isDark ? \"rgba(15,23,42,0.92)\" : \"rgba(255,255,255,0.96)\",\n color: this.isDark ? \"#e2e8f0\" : \"#1e293b\",\n border: `1px solid ${this.isDark ? \"rgba(148,163,184,0.25)\" : \"rgba(100,116,139,0.25)\"}`,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.18)\",\n } as CSSStyleDeclaration);\n container.appendChild(this.tooltip);\n\n // Pinned info box for a clicked point (persists until the next click).\n this.infoBox = document.createElement(\"div\");\n Object.assign(this.infoBox.style, {\n position: \"absolute\",\n display: \"none\",\n zIndex: \"6\",\n pointerEvents: \"none\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n lineHeight: \"1.4\",\n whiteSpace: \"nowrap\",\n background: this.isDark ? \"rgba(15,23,42,0.96)\" : \"rgba(255,255,255,0.98)\",\n color: this.isDark ? \"#e2e8f0\" : \"#1e293b\",\n border: `1px solid ${this.isDark ? \"rgba(148,163,184,0.4)\" : \"rgba(100,116,139,0.4)\"}`,\n boxShadow: \"0 6px 18px rgba(0,0,0,0.25)\",\n } as CSSStyleDeclaration);\n container.appendChild(this.infoBox);\n\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(container);\n this.resize();\n\n if (options.interactive !== false) this.attachInteraction();\n if (options.showToolbar !== false) {\n this.toolbarHandle = createToolbar(\n container,\n {\n setMode: (m) => this.setMode(m),\n getMode: () => this.mode,\n home: () => this.home(),\n onModeChange: (cb) => this.modeChangeCbs.push(cb),\n },\n this.isDark,\n );\n }\n this.updateCursor();\n }\n\n private makeCanvas(z: number): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n Object.assign(c.style, {\n position: \"absolute\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n zIndex: String(z),\n } as CSSStyleDeclaration);\n if (z < 2) c.style.pointerEvents = \"none\";\n this.container.appendChild(c);\n return c;\n }\n\n /** Margins grow to make room for extra y axes on each side. */\n private computeMargin(): Layout[\"margin\"] {\n let leftCount = 0;\n let rightCount = 0;\n for (const ya of this.yAxes.values()) {\n if (ya.side === \"left\") leftCount++;\n else rightCount++;\n }\n return {\n top: this.baseMargin.top,\n bottom: this.baseMargin.bottom,\n left: this.baseMargin.left + Math.max(0, leftCount - 1) * Y_AXIS_GAP,\n right: this.baseMargin.right + rightCount * Y_AXIS_GAP,\n };\n }\n\n private layout(): Layout {\n return {\n cssWidth: this.container.clientWidth,\n cssHeight: this.container.clientHeight,\n margin: this.computeMargin(),\n };\n }\n\n /** Pixel x-position (and title x) for each y axis, by draw order per side. */\n private yAxisPositions(): Map<string, { x: number; titleX: number }> {\n const region = plotRegion(this.layout());\n const out = new Map<string, { x: number; titleX: number }>();\n let li = 0;\n let ri = 0;\n for (const ya of this.yAxes.values()) {\n if (ya.side === \"left\") {\n const x = region.left - li * Y_AXIS_GAP;\n out.set(ya.id, { x, titleX: x - 42 });\n li++;\n } else {\n const x = region.left + region.width + ri * Y_AXIS_GAP;\n out.set(ya.id, { x, titleX: x + 42 });\n ri++;\n }\n }\n return out;\n }\n\n // ---- Public API -----------------------------------------------------------\n\n private register<T extends Layer>(layer: T): T {\n if (!this.yAxes.has(layer.yAxis)) {\n throw new Error(`Unknown y axis \"${layer.yAxis}\". Call addYAxis() first.`);\n }\n this.layers.push(layer);\n this.autoscale();\n this.requestRender();\n return layer;\n }\n\n /**\n * Register a layer built outside core (e.g. `@photonviz/map`). Use with\n * {@link context} to construct the layer against this plot's WebGL2 context.\n */\n add<T extends Layer>(layer: T): T {\n return this.register(layer);\n }\n\n /** The shared WebGL2 context, for constructing custom layers. */\n get context(): WebGL2RenderingContext {\n return this.gl;\n }\n\n /**\n * Convert a client (screen) coordinate to data space — the shared x and the\n * primary y. Returns null if the point is outside the plot region. Useful for\n * custom hit-testing (e.g. map feature picking on click).\n */\n dataAt(clientX: number, clientY: number): { x: number; y: number } | null {\n const rect = this.axisCanvas.getBoundingClientRect();\n const region = plotRegion(this.layout());\n const px = clientX - rect.left;\n const py = clientY - rect.top;\n if (\n px < region.left || px > region.left + region.width ||\n py < region.top || py > region.top + region.height\n ) {\n return null;\n }\n const nx = (px - region.left) / region.width;\n const ny = 1 - (py - region.top) / region.height;\n return { x: this.scaleX.invert(nx), y: this.primaryY().scale.invert(ny) };\n }\n\n addLine(opts: LineOptions): LineLayer {\n return this.register(new LineLayer(this.gl, opts));\n }\n\n addScatter(opts: ScatterOptions): ScatterLayer {\n return this.register(new ScatterLayer(this.gl, opts));\n }\n\n addBar(opts: BarOptions): BarLayer {\n return this.register(new BarLayer(this.gl, opts));\n }\n\n addArea(opts: AreaOptions): AreaLayer {\n return this.register(new AreaLayer(this.gl, opts));\n }\n\n addHeatmap(opts: HeatmapOptions): HeatmapLayer {\n return this.register(new HeatmapLayer(this.gl, opts));\n }\n\n addBox(opts: BoxOptions): BoxLayer {\n return this.register(new BoxLayer(this.gl, opts));\n }\n\n addHexbin(opts: HexbinOptions): HexbinLayer {\n return this.register(new HexbinLayer(this.gl, opts));\n }\n\n addContour(opts: ContourOptions): ContourLayer {\n return this.register(new ContourLayer(this.gl, opts));\n }\n\n addErrorBar(opts: ErrorBarOptions): ErrorBarLayer {\n return this.register(new ErrorBarLayer(this.gl, opts));\n }\n\n addStem(opts: StemOptions): StemLayer {\n return this.register(new StemLayer(this.gl, opts));\n }\n\n addQuiver(opts: QuiverOptions): QuiverLayer {\n return this.register(new QuiverLayer(this.gl, opts));\n }\n\n addCandlestick(opts: CandlestickOptions): CandlestickLayer {\n return this.register(new CandlestickLayer(this.gl, opts));\n }\n\n /** Compute an STFT of `signal` and render it as a heatmap (time × frequency). */\n addHeatmapSpectrogram(\n signal: ArrayLike<number>,\n opts: { fftSize?: number; hop?: number; sampleRate?: number; colormap?: HeatmapOptions[\"colormap\"] } = {},\n ): HeatmapLayer {\n const s = spectrogram(signal, opts);\n return this.register(\n new HeatmapLayer(this.gl, {\n values: s.values,\n cols: s.cols,\n rows: s.rows,\n extent: s.extent,\n colormap: opts.colormap ?? \"plasma\",\n }),\n );\n }\n\n /** Bin raw `values` and render a histogram as bars. */\n addHistogram(\n values: ArrayLike<number>,\n opts: {\n bins?: number;\n range?: [number, number];\n color?: string;\n name?: string;\n yAxis?: string;\n } = {},\n ): BarLayer {\n const h = histogram(values, { bins: opts.bins, range: opts.range });\n return this.register(\n new BarLayer(this.gl, {\n x: h.centers,\n y: h.counts,\n width: h.binWidth * 0.98,\n color: opts.color,\n name: opts.name,\n yAxis: opts.yAxis,\n }),\n );\n }\n\n /** Register an additional named y axis. Series opt in via `addLine({ yAxis })`. */\n addYAxis(id: string, opts: YAxisOptions = {}): void {\n if (this.yAxes.has(id)) throw new Error(`Y axis \"${id}\" already exists`);\n const { type, domain, side, color, ...axisConfig } = opts;\n this.yAxes.set(id, {\n id,\n scale: makeScale(type ?? \"linear\", domain ?? [0, 1]),\n axis: new Axis(axisConfig),\n side: side ?? \"right\",\n auto: domain == null,\n initial: domain ?? null,\n color,\n });\n this.autoscale();\n this.requestRender();\n }\n\n removeLayer(layer: Layer): void {\n const i = this.layers.indexOf(layer);\n if (i >= 0) {\n this.layers.splice(i, 1);\n layer.dispose();\n this.autoscale();\n this.requestRender();\n }\n }\n\n /** Configure ticks/format/title for the x axis or a y axis (default primary \"y\"). */\n setAxis(dim: Dim | string, config: Partial<AxisConfig>): void {\n if (dim === \"x\") {\n this.axisX.update(config);\n } else {\n const ya = this.yAxes.get(dim === \"y\" ? \"y\" : dim);\n if (!ya) throw new Error(`Unknown axis \"${dim}\"`);\n ya.axis.update(config);\n }\n this.requestRender();\n }\n\n /** Set (or lock) the visible domain. `y` targets the primary axis; use `yAxes` for others. */\n setView(view: { x?: Range; y?: Range; yAxes?: Record<string, Range> }): void {\n if (view.x) {\n this.scaleX.domain = view.x;\n this.autoX = false;\n }\n if (view.y) this.setYDomain(\"y\", view.y);\n if (view.yAxes) {\n for (const [id, r] of Object.entries(view.yAxes)) this.setYDomain(id, r);\n }\n this.requestRender();\n }\n\n private setYDomain(id: string, range: Range): void {\n const ya = this.yAxes.get(id);\n if (!ya) throw new Error(`Unknown y axis \"${id}\"`);\n ya.scale.domain = range;\n ya.auto = false;\n }\n\n // ---- Interaction control --------------------------------------------------\n\n setMode(mode: InteractionMode): void {\n if (mode === this.mode) return;\n this.mode = mode;\n this.updateCursor();\n for (const cb of this.modeChangeCbs) cb(mode);\n }\n\n getMode(): InteractionMode {\n return this.mode;\n }\n\n onModeChange(cb: (mode: InteractionMode) => void): void {\n this.modeChangeCbs.push(cb);\n }\n\n /** Reset to the home view: explicit domains restored, auto axes re-fit to data. */\n home(): void {\n if (this.initialX) {\n this.scaleX.domain = this.initialX;\n this.autoX = false;\n } else {\n this.autoX = true;\n }\n for (const ya of this.yAxes.values()) {\n if (ya.initial) {\n ya.scale.domain = ya.initial;\n ya.auto = false;\n } else {\n ya.auto = true;\n }\n }\n this.autoscale();\n this.requestRender();\n }\n\n /** Re-fit auto axes to the data: x over all series, each y axis over its own series. */\n autoscale(): void {\n // X across all layers.\n if (this.autoX) {\n let minX = Infinity, maxX = -Infinity, any = false;\n for (const l of this.layers) {\n const b = l.bounds();\n if (!b) continue;\n any = true;\n minX = Math.min(minX, b.x[0]);\n maxX = Math.max(maxX, b.x[1]);\n }\n if (any) this.scaleX.domain = padDomain(minX, maxX, this.scaleX.log, 0.02);\n }\n // Each y axis over the layers assigned to it.\n for (const ya of this.yAxes.values()) {\n if (!ya.auto) continue;\n let minY = Infinity, maxY = -Infinity, any = false;\n for (const l of this.layers) {\n if (l.yAxis !== ya.id) continue;\n const b = l.bounds();\n if (!b) continue;\n any = true;\n minY = Math.min(minY, b.y[0]);\n maxY = Math.max(maxY, b.y[1]);\n }\n if (any) ya.scale.domain = padDomain(minY, maxY, ya.scale.log, 0.05);\n }\n }\n\n destroy(): void {\n this.resizeObserver.disconnect();\n this.toolbarHandle?.destroy();\n this.selectionDiv.remove();\n this.tooltip.remove();\n this.infoBox.remove();\n for (const l of this.layers) l.dispose();\n this.container.removeChild(this.gridCanvas);\n this.container.removeChild(this.dataCanvas);\n this.container.removeChild(this.axisCanvas);\n }\n\n // ---- Rendering ------------------------------------------------------------\n\n private resize(): void {\n const dpr = window.devicePixelRatio || 1;\n this.dpr = dpr;\n const w = this.container.clientWidth;\n const h = this.container.clientHeight;\n for (const c of [this.gridCanvas, this.dataCanvas, this.axisCanvas]) {\n c.width = Math.max(1, Math.round(w * dpr));\n c.height = Math.max(1, Math.round(h * dpr));\n }\n this.gridCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n this.dataCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n this.axisCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n this.render();\n }\n\n requestRender(): void {\n if (this.frameRequested) return;\n this.frameRequested = true;\n requestAnimationFrame(() => {\n this.frameRequested = false;\n this.render();\n });\n }\n\n private primaryY(): YAxisState {\n return this.yAxes.get(\"y\")!;\n }\n\n render(): void {\n const layout = this.layout();\n const region = plotRegion(layout);\n if (this.equalAspect) this.applyAspect(region);\n if (this.boundedPan) this.clampView();\n const primary = this.primaryY();\n const ticksX = this.axisX.resolve(this.scaleX);\n const ticksYPrimary = primary.axis.resolve(primary.scale);\n\n // Grid (behind data): x lines + primary-y lines only, to avoid clutter.\n this.gridCtx.clearRect(0, 0, layout.cssWidth, layout.cssHeight);\n drawGrid(this.gridCtx, region, this.scaleX, primary.scale, ticksX, ticksYPrimary, this.theme);\n\n // Data: render into the shared WebGL canvas (sized to this plot), then blit.\n const gl = this.gl;\n const devW = this.dataCanvas.width;\n const devH = this.dataCanvas.height;\n sizeShared(gl, devW, devH);\n begin2D(gl);\n gl.clearColor(0, 0, 0, 0);\n gl.disable(gl.SCISSOR_TEST);\n gl.viewport(0, 0, devW, devH);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n const dpr = this.dpr;\n const vx = Math.round(region.left * dpr);\n const vw = Math.round(region.width * dpr);\n const vh = Math.round(region.height * dpr);\n const vy = devH - Math.round((region.top + region.height) * dpr);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(vx, vy, vw, vh);\n gl.viewport(vx, vy, vw, vh);\n\n const xFrame: AxisFrame = {\n lo: this.scaleX.domain[0],\n hi: this.scaleX.domain[1],\n log: this.scaleX.log,\n };\n for (const layer of this.layers) {\n const ya = this.yAxes.get(layer.yAxis)!;\n layer.draw({\n gl,\n x: xFrame,\n y: { lo: ya.scale.domain[0], hi: ya.scale.domain[1], log: ya.scale.log },\n pixelWidth: vw,\n pixelHeight: vh,\n dpr: this.dpr,\n });\n }\n gl.disable(gl.SCISSOR_TEST);\n\n // Blit the shared GL result onto this plot's own data canvas.\n this.dataCtx.clearRect(0, 0, layout.cssWidth, layout.cssHeight);\n this.dataCtx.drawImage(this.sharedCanvas, 0, 0, layout.cssWidth, layout.cssHeight);\n\n // Axes (above data).\n this.axisCtx.clearRect(0, 0, layout.cssWidth, layout.cssHeight);\n drawXAxis(this.axisCtx, region, this.scaleX, ticksX, this.theme, this.axisX.config.title);\n\n const positions = this.yAxisPositions();\n for (const ya of this.yAxes.values()) {\n const pos = positions.get(ya.id)!;\n const ticks = ya.axis.resolve(ya.scale);\n drawYAxis(this.axisCtx, region, ya.scale, ticks, this.theme, {\n x: pos.x,\n side: ya.side,\n title: ya.axis.config.title,\n color: ya.color,\n titleX: pos.titleX,\n });\n }\n\n // Both-axis guide lines while the pointer is pressed.\n if (this.crosshair && this.pressPx) {\n drawCrosshairXY(this.axisCtx, region, this.pressPx.x, this.pressPx.y, this.theme);\n }\n\n // Hover crosshair + markers + tooltip.\n if (this.hoverEnabled && this.hoverPx) {\n this.renderHover(region);\n } else {\n this.tooltip.style.display = \"none\";\n if (this.pointInfo === \"hover\") this.selected = null; // nothing hovered\n }\n\n // Pinned point details (clicked, or hovered in \"hover\" mode).\n this.updateInfoBox(region);\n }\n\n private renderHover(region: ReturnType<typeof plotRegion>): void {\n const cursor = this.hoverPx!;\n // Only show hover inside the plot region.\n if (\n cursor.x < region.left || cursor.x > region.left + region.width ||\n cursor.y < region.top || cursor.y > region.top + region.height\n ) {\n this.tooltip.style.display = \"none\";\n return;\n }\n\n const nx = (cursor.x - region.left) / region.width;\n const dataX = this.scaleX.invert(nx);\n // y is north-up: pixels grow downward, so invert the vertical fraction.\n const ny = 1 - (cursor.y - region.top) / region.height;\n const dataY = this.primaryY().scale.invert(ny);\n // Full X+Y crosshair when enabled (e.g. maps); otherwise just the x line.\n if (this.crosshair) {\n drawCrosshairXY(this.axisCtx, region, cursor.x, cursor.y, this.theme);\n } else {\n drawCrosshair(this.axisCtx, region, cursor.x, this.theme);\n }\n\n const rows: Array<{ layer: Pickable; x: number; y: number }> = [];\n for (const layer of this.layers) {\n if (!isPickable(layer)) continue;\n const ya = this.yAxes.get(layer.yAxis)!;\n const project = (x: number, y: number): [number, number] => [\n pxX(region, this.scaleX.norm(x)),\n pxY(region, ya.scale.norm(y)),\n ];\n const p = layer.pick(this.pickMode, cursor.x, cursor.y, project);\n if (!p) continue;\n const [px, py] = project(p.x, p.y);\n drawMarker(this.axisCtx, px, py, layer.colorCss);\n rows.push({ layer, x: p.x, y: p.y });\n }\n\n // Always show at least the x readout, even with no series under the cursor.\n this.updateTooltip(rows, cursor, dataX, dataY);\n\n // In hover mode, the pinned info box tracks the point under the cursor.\n if (this.pointInfo === \"hover\") this.selected = this.pickPoint(cursor.x, cursor.y);\n }\n\n private updateTooltip(\n rows: Array<{ layer: Pickable; x: number; y: number }>,\n cursor: { x: number; y: number },\n dataX: number,\n dataY: number,\n ): void {\n const tip = this.tooltip;\n // Rebuild content with safe DOM APIs (no innerHTML).\n tip.replaceChildren();\n if (this.hoverReadout) {\n // Custom header: one line per row returned (e.g. lon/lat on a map).\n for (const line of this.hoverReadout(dataX, dataY)) {\n const el = document.createElement(\"div\");\n el.style.opacity = \"0.7\";\n el.style.marginBottom = \"3px\";\n el.textContent = `${line.label} ${line.value}`;\n tip.appendChild(el);\n }\n } else {\n const xfmt = this.axisX.config.format ?? defaultFormat;\n const header = document.createElement(\"div\");\n header.style.opacity = \"0.7\";\n header.style.marginBottom = \"3px\";\n header.textContent = `x = ${xfmt(dataX)}`;\n tip.appendChild(header);\n }\n\n for (const r of rows) {\n const yfmt = this.yAxes.get(r.layer.yAxis)!.axis.config.format ?? defaultFormat;\n const row = document.createElement(\"div\");\n row.style.display = \"flex\";\n row.style.alignItems = \"center\";\n row.style.gap = \"6px\";\n\n const dot = document.createElement(\"span\");\n Object.assign(dot.style, {\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: r.layer.colorCss,\n flex: \"0 0 auto\",\n } as CSSStyleDeclaration);\n\n const label = document.createElement(\"span\");\n label.textContent = `${r.layer.name}: ${yfmt(r.y)}`;\n\n row.appendChild(dot);\n row.appendChild(label);\n tip.appendChild(row);\n }\n\n tip.style.display = \"block\";\n // Position near the cursor, flipping to stay inside the container.\n const cw = this.container.clientWidth;\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n let left = cursor.x + 14;\n if (left + tw > cw) left = cursor.x - tw - 14;\n let top = cursor.y + 14;\n if (top + th > this.container.clientHeight) top = cursor.y - th - 14;\n tip.style.left = `${Math.max(0, left)}px`;\n tip.style.top = `${Math.max(0, top)}px`;\n }\n\n // ---- Interaction ----------------------------------------------------------\n\n private updateCursor(): void {\n this.axisCanvas.style.cursor = this.mode === \"pan\" ? \"grab\" : \"crosshair\";\n }\n\n private axisLock(): { x: boolean; y: boolean } {\n if (this.mode === \"box-x\") return { x: true, y: false };\n if (this.mode === \"box-y\") return { x: false, y: true };\n return { x: true, y: true };\n }\n\n /**\n * Which region the pointer is over: the plot body, the x-axis strip (below),\n * or a specific y-axis strip (in a side margin). Dragging an axis strip pans\n * just that axis.\n */\n private zoneAt(px: number, py: number): { type: \"plot\" } | { type: \"x\" } | { type: \"y\"; id: string } {\n const region = plotRegion(this.layout());\n const inX = px >= region.left && px <= region.left + region.width;\n const inY = py >= region.top && py <= region.top + region.height;\n if (inX && py > region.top + region.height) return { type: \"x\" };\n if (inY && !inX) {\n // Nearest y axis to the cursor within a side margin.\n const positions = this.yAxisPositions();\n let bestId: string | null = null;\n let bestD = Infinity;\n for (const [id, pos] of positions) {\n const d = Math.abs(pos.x - px);\n if (d < bestD) {\n bestD = d;\n bestId = id;\n }\n }\n if (bestId && bestD <= Y_AXIS_GAP) return { type: \"y\", id: bestId };\n }\n return { type: \"plot\" };\n }\n\n // Pan/zoom shift the domain in the scale's *transformed* space (via invert),\n // not raw data space — so a log axis stays positive instead of crossing zero\n // into NaN. For linear/time scales this is identical to the old arithmetic.\n private panX(dxPx: number, region: ReturnType<typeof plotRegion>): void {\n const f = dxPx / region.width;\n this.scaleX.domain = [this.scaleX.invert(-f), this.scaleX.invert(1 - f)];\n this.autoX = false;\n }\n\n private panY(id: string | null, dyPx: number, region: ReturnType<typeof plotRegion>): void {\n const f = dyPx / region.height;\n for (const ya of this.yAxes.values()) {\n if (id && ya.id !== id) continue;\n ya.scale.domain = [ya.scale.invert(f), ya.scale.invert(1 + f)];\n ya.auto = false;\n }\n }\n\n private attachInteraction(): void {\n const el = this.axisCanvas;\n el.style.touchAction = \"none\";\n\n el.addEventListener(\n \"wheel\",\n (e) => {\n e.preventDefault();\n const region = plotRegion(this.layout());\n const rect = el.getBoundingClientRect();\n const nx = (e.clientX - rect.left - region.left) / region.width;\n const ny = 1 - (e.clientY - rect.top - region.top) / region.height;\n const factor = Math.exp(e.deltaY * 0.001);\n this.zoomAround(nx, ny, factor);\n },\n { passive: false },\n );\n\n let panning = false;\n let selecting = false;\n /** Non-null while dragging an axis strip: `\"x\"` or a y-axis id. */\n let axisDrag: \"x\" | { y: string } | null = null;\n let lastX = 0;\n let lastY = 0;\n let startX = 0;\n let startY = 0;\n let downX = 0;\n let downY = 0;\n\n el.addEventListener(\"pointerdown\", (e) => {\n el.setPointerCapture(e.pointerId);\n this.hoverPx = null;\n const rect = el.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n downX = px;\n downY = py;\n const zone = this.zoneAt(px, py);\n\n if (zone.type === \"x\") {\n axisDrag = \"x\";\n lastX = e.clientX;\n } else if (zone.type === \"y\") {\n axisDrag = { y: zone.id };\n lastY = e.clientY;\n } else if (this.mode === \"pan\") {\n panning = true;\n lastX = e.clientX;\n lastY = e.clientY;\n el.style.cursor = \"grabbing\";\n if (this.crosshair) this.setPress(px, py);\n } else {\n selecting = true;\n startX = px;\n startY = py;\n if (this.crosshair) this.setPress(px, py);\n }\n });\n\n el.addEventListener(\"pointermove\", (e) => {\n const rect = el.getBoundingClientRect();\n const region = plotRegion(this.layout());\n if (this.pressPx) this.setPress(e.clientX - rect.left, e.clientY - rect.top);\n if (axisDrag === \"x\") {\n this.panX(e.clientX - lastX, region);\n lastX = e.clientX;\n this.requestRender();\n } else if (axisDrag && typeof axisDrag === \"object\") {\n this.panY(axisDrag.y, e.clientY - lastY, region);\n lastY = e.clientY;\n this.requestRender();\n } else if (panning) {\n this.panX(e.clientX - lastX, region);\n this.panY(null, e.clientY - lastY, region);\n lastX = e.clientX;\n lastY = e.clientY;\n this.requestRender();\n } else if (selecting) {\n this.drawSelection(startX, startY, e.clientX - rect.left, e.clientY - rect.top);\n } else {\n // Idle: hover in the plot body, resize cursors over axis strips.\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n const zone = this.zoneAt(px, py);\n if (zone.type === \"x\") {\n el.style.cursor = \"ew-resize\";\n this.setHover(null);\n } else if (zone.type === \"y\") {\n el.style.cursor = \"ns-resize\";\n this.setHover(null);\n } else {\n this.updateCursor();\n if (this.hoverEnabled) this.setHover({ x: px, y: py });\n }\n }\n });\n\n el.addEventListener(\"pointerleave\", () => this.setHover(null));\n\n const end = (e: PointerEvent) => {\n if (el.hasPointerCapture(e.pointerId)) el.releasePointerCapture(e.pointerId);\n if (this.pressPx) {\n this.pressPx = null;\n this.requestRender();\n }\n const rect = el.getBoundingClientRect();\n const upPx = e.clientX - rect.left;\n const upPy = e.clientY - rect.top;\n // A press-and-release that barely moved, in the plot body, is a click.\n const isClick =\n e.type === \"pointerup\" && !axisDrag && Math.hypot(upPx - downX, upPy - downY) < 4;\n if (axisDrag) {\n axisDrag = null;\n } else if (panning) {\n panning = false;\n this.updateCursor();\n } else if (selecting) {\n selecting = false;\n if (!isClick) this.applySelection(startX, startY, upPx, upPy);\n this.selectionDiv.style.display = \"none\";\n }\n if (isClick) this.handleClick(upPx, upPy);\n };\n el.addEventListener(\"pointerup\", end);\n el.addEventListener(\"pointercancel\", end);\n }\n\n private setHover(px: { x: number; y: number } | null): void {\n const had = this.hoverPx !== null;\n if (!px && !had) return;\n this.hoverPx = px;\n this.requestRender();\n }\n\n /** Update the press-crosshair position and redraw. */\n private setPress(x: number, y: number): void {\n this.pressPx = { x, y };\n this.requestRender();\n }\n\n /** Nearest point (2D, within a small radius) under the cursor, or null. */\n private pickPoint(\n cursorPx: number,\n cursorPy: number,\n ): { layer: Pickable; x: number; y: number; index: number } | null {\n const region = plotRegion(this.layout());\n let hit: { layer: Pickable; x: number; y: number; index: number } | null = null;\n let hitDist = Infinity;\n for (const layer of this.layers) {\n if (!isPickable(layer)) continue;\n const ya = this.yAxes.get(layer.yAxis)!;\n const project = (x: number, y: number): [number, number] => [\n pxX(region, this.scaleX.norm(x)),\n pxY(region, ya.scale.norm(y)),\n ];\n const p = layer.pick(\"xy\", cursorPx, cursorPy, project);\n if (!p) continue;\n const [ppx, ppy] = project(p.x, p.y);\n const d = Math.hypot(ppx - cursorPx, ppy - cursorPy);\n if (d < hitDist) {\n hitDist = d;\n hit = { layer, x: p.x, y: p.y, index: p.index };\n }\n }\n return hit && hitDist <= 14 ? hit : null;\n }\n\n /** Click handler: in `pointInfo:\"click\"` mode, pin the point under the cursor. */\n private handleClick(cursorPx: number, cursorPy: number): void {\n if (this.pointInfo !== \"click\") return;\n this.selected = this.pickPoint(cursorPx, cursorPy);\n this.requestRender();\n }\n\n /** Draw the pinned point's marker and position its info box (or hide it). */\n private updateInfoBox(region: ReturnType<typeof plotRegion>): void {\n const box = this.infoBox;\n if (!this.selected) {\n box.style.display = \"none\";\n return;\n }\n const { layer, x, y, index } = this.selected;\n const ya = this.yAxes.get(layer.yAxis)!;\n const px = pxX(region, this.scaleX.norm(x));\n const py = pxY(region, ya.scale.norm(y));\n // Hide when the point has been panned/zoomed out of the plot region.\n if (\n px < region.left || px > region.left + region.width ||\n py < region.top || py > region.top + region.height\n ) {\n box.style.display = \"none\";\n return;\n }\n drawMarker(this.axisCtx, px, py, layer.colorCss);\n\n box.replaceChildren();\n // User-supplied detail for this point, if the layer provides it.\n const info = layer.infoAt ? layer.infoAt(index) : null;\n const title = document.createElement(\"div\");\n title.style.fontWeight = \"600\";\n title.style.marginBottom = \"2px\";\n title.textContent = info && info.length ? info[0]! : layer.name;\n box.appendChild(title);\n if (info && info.length > 1) {\n for (let i = 1; i < info.length; i++) {\n const row = document.createElement(\"div\");\n row.textContent = info[i]!;\n box.appendChild(row);\n }\n } else {\n const lines = this.hoverReadout\n ? this.hoverReadout(x, y)\n : [\n { label: \"x\", value: (this.axisX.config.format ?? defaultFormat)(x) },\n { label: \"y\", value: (ya.axis.config.format ?? defaultFormat)(y) },\n ];\n for (const ln of lines) {\n const row = document.createElement(\"div\");\n row.textContent = `${ln.label} ${ln.value}`;\n box.appendChild(row);\n }\n }\n box.style.display = \"block\";\n const cw = this.container.clientWidth;\n const tw = box.offsetWidth;\n const th = box.offsetHeight;\n let left = px + 12;\n if (left + tw > cw) left = px - tw - 12;\n let top = py + 12;\n if (top + th > this.container.clientHeight) top = py - th - 12;\n box.style.left = `${Math.max(0, left)}px`;\n box.style.top = `${Math.max(0, top)}px`;\n }\n\n /** Data-space x extent across all layers, or null if empty. */\n private layerBoundsX(): Range | null {\n let lo = Infinity;\n let hi = -Infinity;\n let any = false;\n for (const l of this.layers) {\n const b = l.bounds();\n if (!b) continue;\n any = true;\n lo = Math.min(lo, b.x[0]);\n hi = Math.max(hi, b.x[1]);\n }\n return any ? [lo, hi] : null;\n }\n\n /** Data-space y extent across the layers bound to axis `id`, or null. */\n private layerBoundsY(id: string): Range | null {\n let lo = Infinity;\n let hi = -Infinity;\n let any = false;\n for (const l of this.layers) {\n if (l.yAxis !== id) continue;\n const b = l.bounds();\n if (!b) continue;\n any = true;\n lo = Math.min(lo, b.y[0]);\n hi = Math.max(hi, b.y[1]);\n }\n return any ? [lo, hi] : null;\n }\n\n /** Keep the view inside the data bounds (used when `boundedPan`). */\n private clampView(): void {\n if (!this.scaleX.log) {\n const bx = this.layerBoundsX();\n if (bx) this.scaleX.domain = clampAxis(this.scaleX.domain, bx);\n }\n for (const ya of this.yAxes.values()) {\n if (ya.scale.log) continue;\n const by = this.layerBoundsY(ya.id);\n if (by) ya.scale.domain = clampAxis(ya.scale.domain, by);\n }\n }\n\n /**\n * Expand the looser axis so both axes share the same data-units-per-pixel,\n * preventing distortion (maps set `equalAspect`). Linear axes only; balances\n * the primary y against x, and is idempotent once balanced.\n */\n private applyAspect(region: ReturnType<typeof plotRegion>): void {\n if (this.scaleX.log) return;\n const primary = this.primaryY();\n if (primary.scale.log) return;\n const w = region.width;\n const h = region.height;\n if (w <= 0 || h <= 0) return;\n const [xlo, xhi] = this.scaleX.domain;\n const [ylo, yhi] = primary.scale.domain;\n const uppX = (xhi - xlo) / w;\n const uppY = (yhi - ylo) / h;\n if (uppX <= 0 || uppY <= 0) return;\n if (Math.abs(uppX - uppY) <= 1e-9 * Math.max(uppX, uppY)) return; // already balanced\n if (uppX > uppY) {\n const target = uppX * h;\n const cy = (ylo + yhi) / 2;\n primary.scale.domain = [cy - target / 2, cy + target / 2];\n } else {\n const target = uppY * w;\n const cx = (xlo + xhi) / 2;\n this.scaleX.domain = [cx - target / 2, cx + target / 2];\n }\n }\n\n private drawSelection(x0: number, y0: number, x1: number, y1: number): void {\n const region = plotRegion(this.layout());\n const lock = this.axisLock();\n const clamp = (v: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, v));\n\n let left: number, width: number, top: number, height: number;\n if (lock.x) {\n const a = clamp(x0, region.left, region.left + region.width);\n const b = clamp(x1, region.left, region.left + region.width);\n left = Math.min(a, b);\n width = Math.abs(a - b);\n } else {\n left = region.left;\n width = region.width;\n }\n if (lock.y) {\n const a = clamp(y0, region.top, region.top + region.height);\n const b = clamp(y1, region.top, region.top + region.height);\n top = Math.min(a, b);\n height = Math.abs(a - b);\n } else {\n top = region.top;\n height = region.height;\n }\n\n Object.assign(this.selectionDiv.style, {\n display: \"block\",\n left: `${left}px`,\n top: `${top}px`,\n width: `${width}px`,\n height: `${height}px`,\n });\n }\n\n private applySelection(x0: number, y0: number, x1: number, y1: number): void {\n const region = plotRegion(this.layout());\n const lock = this.axisLock();\n const dxPx = Math.abs(x1 - x0);\n const dyPx = Math.abs(y1 - y0);\n // Ignore tiny drags (treat as a click) in whichever dimensions are active.\n if (lock.x && lock.y) {\n if (dxPx < 5 && dyPx < 5) return;\n } else if (lock.x && dxPx < 5) return;\n else if (lock.y && dyPx < 5) return;\n\n const clamp01 = (v: number) => Math.max(0, Math.min(1, v));\n if (lock.x) {\n const nA = clamp01((Math.min(x0, x1) - region.left) / region.width);\n const nB = clamp01((Math.max(x0, x1) - region.left) / region.width);\n const a = this.scaleX.invert(nA);\n const b = this.scaleX.invert(nB);\n this.scaleX.domain = [Math.min(a, b), Math.max(a, b)];\n this.autoX = false;\n }\n if (lock.y) {\n const nTop = clamp01(1 - (Math.min(y0, y1) - region.top) / region.height);\n const nBot = clamp01(1 - (Math.max(y0, y1) - region.top) / region.height);\n for (const ya of this.yAxes.values()) {\n const a = ya.scale.invert(nTop);\n const b = ya.scale.invert(nBot);\n ya.scale.domain = [Math.min(a, b), Math.max(a, b)];\n ya.auto = false;\n }\n }\n this.requestRender();\n }\n\n private zoomAround(nx: number, ny: number, factor: number): void {\n const lock = this.axisLock();\n // Zoom about the cursor in transformed space (log-safe; see panX/panY).\n if (lock.x) {\n const t = nx * (1 - factor);\n this.scaleX.domain = [this.scaleX.invert(t), this.scaleX.invert(t + factor)];\n this.autoX = false;\n }\n if (lock.y) {\n const t = ny * (1 - factor);\n for (const ya of this.yAxes.values()) {\n ya.scale.domain = [ya.scale.invert(t), ya.scale.invert(t + factor)];\n ya.auto = false;\n }\n }\n this.requestRender();\n }\n}\n\nexport { LinearScale };\n","import { autoTicks } from \"../axes/ticks.js\";\nimport { begin2D, getSharedGL, sizeShared } from \"../gl/shared.js\";\nimport type { AxisFrame } from \"../gl/transform.js\";\nimport { LineLayer } from \"../layers/line.js\";\nimport { ScatterLayer } from \"../layers/scatter.js\";\nimport { darkTheme, lightTheme, type Theme } from \"../render/overlay.js\";\nimport type { Color } from \"../types.js\";\n\nexport interface PolarOptions {\n theme?: \"light\" | \"dark\" | Theme;\n /** Angle unit of input theta values. Default `\"rad\"`. */\n angleUnit?: \"rad\" | \"deg\";\n /** Fixed max radius. If omitted, autoscales to the data. */\n maxRadius?: number;\n margin?: number;\n /** Enable wheel-zoom (r scale) and drag-rotate interaction. Default true. */\n interactive?: boolean;\n /** Enable hover: highlight the nearest point + show a tooltip. Default true. */\n hover?: boolean;\n /** Show the built-in home (reset) button. Default true. */\n showToolbar?: boolean;\n /**\n * How the pinned point-info box is triggered: `\"click\"` pins a point until\n * empty space is clicked; `\"hover\"` shows the point under the cursor\n * automatically (no click). Default `\"click\"`.\n */\n pointInfo?: \"hover\" | \"click\";\n}\n\nexport interface PolarLineOptions {\n theta: ArrayLike<number>;\n r: ArrayLike<number>;\n color?: string | Color;\n width?: number;\n /** Connect the last point back to the first. */\n closed?: boolean;\n}\n\nexport interface PolarScatterOptions {\n theta: ArrayLike<number>;\n r: ArrayLike<number>;\n color?: string | Color;\n size?: number;\n /** Optional per-point labels (one per point), shown as the title of the click-pinned info box. */\n labels?: ArrayLike<string>;\n}\n\n/** A live handle to update a polar series with new (theta, r) data. */\nexport interface PolarSeries {\n setData(theta: ArrayLike<number>, r: ArrayLike<number>): void;\n}\n\ninterface Entry {\n layer: LineLayer | ScatterLayer;\n closed: boolean;\n maxR: number;\n /** Raw input data, retained so we can re-project on rotation change and pick on hover. */\n theta: ArrayLike<number>;\n r: ArrayLike<number>;\n /** Optional per-point labels (scatter only), used as the pinned info-box title. */\n labels?: ArrayLike<string>;\n}\n\n/** A nearest-point pick result, in both data and screen (CSS px) space. */\ninterface Pick {\n entry: Entry;\n index: number;\n px: number;\n py: number;\n theta: number;\n r: number;\n d2: number;\n}\n\n/** A polar (r, θ) plot: concentric radial grid + angular spokes, WebGL data. */\nexport class PolarPlot {\n private container: HTMLElement;\n private gridCanvas: HTMLCanvasElement;\n private dataCanvas: HTMLCanvasElement;\n private overlayCanvas: HTMLCanvasElement;\n private gridCtx: CanvasRenderingContext2D;\n private dataCtx: CanvasRenderingContext2D;\n private overlayCtx: CanvasRenderingContext2D;\n private gl: WebGL2RenderingContext;\n private sharedCanvas: HTMLCanvasElement;\n private theme: Theme;\n private isDark: boolean;\n private toRad: number;\n private fixedR?: number;\n private margin: number;\n private entries: Entry[] = [];\n private R = 1;\n private baseR = 1;\n private dpr = 1;\n private resizeObserver: ResizeObserver;\n private frameRequested = false;\n\n // Interaction state.\n private interactive: boolean;\n private hoverEnabled: boolean;\n /** Multiplier on the fitted radius: <1 zooms in (smaller r-domain), >1 out. */\n private zoom = 1;\n /** Angular offset (radians, CCW) applied to all series + gridlines. */\n private rotation = 0;\n private hoverPx: { x: number; y: number } | null = null;\n private tooltip: HTMLDivElement;\n private homeButton: HTMLButtonElement | null = null;\n /** A point clicked to pin its details, until another click clears it. */\n private selected: { entry: Entry; index: number } | null = null;\n private infoBox: HTMLDivElement;\n /** Whether the info box is triggered by `\"click\"` (pinned) or `\"hover\"`. */\n private pointInfo: \"hover\" | \"click\";\n\n constructor(container: HTMLElement, options: PolarOptions = {}) {\n this.container = container;\n if (getComputedStyle(container).position === \"static\") container.style.position = \"relative\";\n this.gridCanvas = this.makeCanvas(0, false);\n this.dataCanvas = this.makeCanvas(1, false);\n this.overlayCanvas = this.makeCanvas(2, true);\n this.gridCtx = this.gridCanvas.getContext(\"2d\")!;\n this.dataCtx = this.dataCanvas.getContext(\"2d\")!;\n this.overlayCtx = this.overlayCanvas.getContext(\"2d\")!;\n const s = getSharedGL();\n this.gl = s.gl;\n this.sharedCanvas = s.canvas;\n this.isDark = options.theme === \"dark\";\n this.theme = options.theme === \"dark\" ? darkTheme\n : options.theme === \"light\" || options.theme == null ? lightTheme\n : options.theme;\n this.toRad = options.angleUnit === \"deg\" ? Math.PI / 180 : 1;\n this.fixedR = options.maxRadius;\n this.margin = options.margin ?? 28;\n this.interactive = options.interactive !== false;\n this.hoverEnabled = options.hover !== false;\n this.pointInfo = options.pointInfo ?? \"click\";\n\n // Tooltip (shared with hover).\n this.tooltip = document.createElement(\"div\");\n Object.assign(this.tooltip.style, {\n position: \"absolute\",\n display: \"none\",\n zIndex: \"4\",\n pointerEvents: \"none\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n lineHeight: \"1.4\",\n whiteSpace: \"nowrap\",\n background: this.isDark ? \"rgba(15,23,42,0.92)\" : \"rgba(255,255,255,0.96)\",\n color: this.isDark ? \"#e2e8f0\" : \"#1e293b\",\n border: `1px solid ${this.isDark ? \"rgba(148,163,184,0.25)\" : \"rgba(100,116,139,0.25)\"}`,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.18)\",\n } as CSSStyleDeclaration);\n container.appendChild(this.tooltip);\n\n // Pinned info box for a clicked point (persists until the next click).\n this.infoBox = document.createElement(\"div\");\n Object.assign(this.infoBox.style, {\n position: \"absolute\",\n display: \"none\",\n zIndex: \"6\",\n pointerEvents: \"none\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n lineHeight: \"1.4\",\n whiteSpace: \"nowrap\",\n background: this.isDark ? \"rgba(15,23,42,0.96)\" : \"rgba(255,255,255,0.98)\",\n color: this.isDark ? \"#e2e8f0\" : \"#1e293b\",\n border: `1px solid ${this.isDark ? \"rgba(148,163,184,0.4)\" : \"rgba(100,116,139,0.4)\"}`,\n boxShadow: \"0 6px 18px rgba(0,0,0,0.25)\",\n } as CSSStyleDeclaration);\n container.appendChild(this.infoBox);\n\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(container);\n this.resize();\n\n if (this.interactive) this.attachInteraction();\n if (options.showToolbar !== false) this.homeButton = this.makeHomeButton();\n }\n\n private makeCanvas(z: number, interactive: boolean): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n Object.assign(c.style, { position: \"absolute\", inset: \"0\", width: \"100%\", height: \"100%\", zIndex: String(z) } as CSSStyleDeclaration);\n if (!interactive) c.style.pointerEvents = \"none\";\n this.container.appendChild(c);\n return c;\n }\n\n private toXY(theta: ArrayLike<number>, r: ArrayLike<number>, closed: boolean) {\n const n = Math.min(theta.length, r.length);\n const m = closed && n > 0 ? n + 1 : n;\n const x = new Float64Array(m), y = new Float64Array(m);\n const rot = this.rotation;\n let maxR = 0;\n for (let i = 0; i < n; i++) {\n const a = theta[i]! * this.toRad + rot, rr = r[i]!;\n x[i] = rr * Math.cos(a); y[i] = rr * Math.sin(a);\n if (Math.abs(rr) > maxR) maxR = Math.abs(rr);\n }\n if (closed && n > 0) { x[n] = x[0]!; y[n] = y[0]!; }\n return { x, y, maxR };\n }\n\n addLine(opts: PolarLineOptions): PolarSeries {\n const closed = opts.closed ?? false;\n const { x, y, maxR } = this.toXY(opts.theta, opts.r, closed);\n const layer = new LineLayer(this.gl, { x, y, color: opts.color, width: opts.width ?? 2, decimate: false });\n const entry: Entry = { layer, closed, maxR, theta: opts.theta, r: opts.r };\n this.entries.push(entry);\n this.refit();\n return this.handle(entry);\n }\n\n addScatter(opts: PolarScatterOptions): PolarSeries {\n const { x, y, maxR } = this.toXY(opts.theta, opts.r, false);\n const layer = new ScatterLayer(this.gl, { x, y, color: opts.color, size: opts.size ?? 5 });\n const entry: Entry = { layer, closed: false, maxR, theta: opts.theta, r: opts.r, labels: opts.labels };\n this.entries.push(entry);\n this.refit();\n return this.handle(entry);\n }\n\n private handle(entry: Entry): PolarSeries {\n return {\n setData: (theta, r) => {\n entry.theta = theta;\n entry.r = r;\n const { x, y, maxR } = this.toXY(theta, r, entry.closed);\n entry.layer.setData(x, y);\n entry.maxR = maxR;\n this.refit();\n this.requestRender();\n },\n };\n }\n\n private refit(): void {\n let base: number;\n if (this.fixedR != null) {\n base = this.fixedR;\n } else {\n let m = 0;\n for (const e of this.entries) m = Math.max(m, e.maxR);\n base = m || 1;\n }\n this.baseR = base;\n this.R = base * this.zoom;\n }\n\n /** Re-project every series with the current rotation (called when rotation changes). */\n private retransform(): void {\n for (const e of this.entries) {\n const { x, y } = this.toXY(e.theta, e.r, e.closed);\n e.layer.setData(x, y);\n }\n }\n\n // ---- Interaction control --------------------------------------------------\n\n /** Reset zoom (r-domain) and rotation back to the initial view. */\n home(): void {\n this.zoom = 1;\n this.rotation = 0;\n this.refit();\n this.retransform();\n this.requestRender();\n }\n\n /** Current rotation offset in radians (CCW). */\n getRotation(): number {\n return this.rotation;\n }\n\n /** Set the rotation offset (radians, CCW) and redraw. */\n setRotation(rad: number): void {\n this.rotation = rad;\n this.retransform();\n this.requestRender();\n }\n\n destroy(): void {\n this.resizeObserver.disconnect();\n for (const e of this.entries) e.layer.dispose();\n this.tooltip.remove();\n this.infoBox.remove();\n this.homeButton?.remove();\n this.container.removeChild(this.gridCanvas);\n this.container.removeChild(this.dataCanvas);\n this.container.removeChild(this.overlayCanvas);\n }\n\n private resize(): void {\n this.dpr = window.devicePixelRatio || 1;\n const w = this.container.clientWidth, h = this.container.clientHeight;\n for (const c of [this.gridCanvas, this.dataCanvas, this.overlayCanvas]) {\n c.width = Math.max(1, Math.round(w * this.dpr));\n c.height = Math.max(1, Math.round(h * this.dpr));\n }\n this.gridCtx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n this.dataCtx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n this.overlayCtx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n this.render();\n }\n\n requestRender(): void {\n if (this.frameRequested) return;\n this.frameRequested = true;\n requestAnimationFrame(() => { this.frameRequested = false; this.render(); });\n }\n\n /** The square drawing region (CSS px). */\n private square() {\n const w = this.container.clientWidth, h = this.container.clientHeight;\n const side = Math.max(1, Math.min(w, h) - this.margin * 2);\n return { cx: w / 2, cy: h / 2, side, left: (w - side) / 2, top: (h - side) / 2 };\n }\n\n render(): void {\n const sq = this.square();\n const w = this.container.clientWidth, h = this.container.clientHeight;\n\n // Data via shared WebGL, clipped to the square region, domain [-R, R].\n const gl = this.gl;\n const devW = this.dataCanvas.width, devH = this.dataCanvas.height;\n sizeShared(gl, devW, devH);\n begin2D(gl);\n gl.clearColor(0, 0, 0, 0);\n gl.disable(gl.SCISSOR_TEST);\n gl.viewport(0, 0, devW, devH);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n const dpr = this.dpr;\n const vx = Math.round(sq.left * dpr), vw = Math.round(sq.side * dpr), vh = Math.round(sq.side * dpr);\n const vy = devH - Math.round((sq.top + sq.side) * dpr);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(vx, vy, vw, vh);\n gl.viewport(vx, vy, vw, vh);\n const frame: AxisFrame = { lo: -this.R, hi: this.R, log: false };\n for (const e of this.entries) {\n e.layer.draw({ gl, x: frame, y: frame, pixelWidth: vw, pixelHeight: vh, dpr });\n }\n gl.disable(gl.SCISSOR_TEST);\n\n this.dataCtx.clearRect(0, 0, w, h);\n this.dataCtx.drawImage(this.sharedCanvas, 0, 0, w, h);\n\n this.drawGrid(sq);\n\n // Overlay: hover marker/tooltip + the pinned/hover point marker/info box.\n this.overlayCtx.clearRect(0, 0, w, h);\n if (this.hoverEnabled && this.hoverPx) {\n this.renderHover(sq);\n } else {\n this.tooltip.style.display = \"none\";\n // In \"hover\" mode the box follows the cursor, so drop it when idle/left.\n if (this.pointInfo === \"hover\") this.selected = null;\n }\n this.updateInfoBox(sq);\n }\n\n private drawGrid(sq: { cx: number; cy: number; side: number }): void {\n const ctx = this.gridCtx;\n const w = this.container.clientWidth, h = this.container.clientHeight;\n ctx.clearRect(0, 0, w, h);\n const pr = sq.side / 2;\n const { cx, cy } = sq;\n ctx.save();\n ctx.font = this.theme.font;\n ctx.fillStyle = this.theme.text;\n\n // Angular spokes + degree labels every 30°, rotated by the current offset.\n ctx.strokeStyle = this.theme.grid;\n ctx.lineWidth = 1;\n for (let deg = 0; deg < 360; deg += 30) {\n const a = (deg * Math.PI) / 180 + this.rotation;\n const ex = cx + Math.cos(a) * pr, ey = cy - Math.sin(a) * pr;\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(ex, ey);\n ctx.stroke();\n const lx = cx + Math.cos(a) * (pr + 12), ly = cy - Math.sin(a) * (pr + 12);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(`${deg}°`, lx, ly);\n }\n\n // Radial grid circles (no numeric labels).\n const ticks = autoTicks(0, this.R, 4).map((t) => t.value).filter((v) => v > 0);\n ctx.strokeStyle = this.theme.grid;\n for (const rv of ticks) {\n const rad = (rv / this.R) * pr;\n ctx.beginPath();\n ctx.arc(cx, cy, rad, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.restore();\n }\n\n // ---- Hover ----------------------------------------------------------------\n\n private setHover(px: { x: number; y: number } | null): void {\n const had = this.hoverPx !== null;\n if (!px && !had) return;\n this.hoverPx = px;\n this.requestRender();\n }\n\n /** Nearest data point (across all series) to a cursor position, in CSS px. */\n private pickNearest(sq: { cx: number; cy: number; side: number }, cursorX: number, cursorY: number): Pick | null {\n const pr = sq.side / 2;\n const { cx, cy } = sq;\n const rot = this.rotation;\n let best: Pick | null = null;\n for (const e of this.entries) {\n const n = Math.min(e.theta.length, e.r.length);\n for (let i = 0; i < n; i++) {\n const a = e.theta[i]! * this.toRad + rot, rr = e.r[i]!;\n const px = cx + (rr * Math.cos(a) / this.R) * pr;\n const py = cy - (rr * Math.sin(a) / this.R) * pr;\n const dx = px - cursorX, dy = py - cursorY;\n const d2 = dx * dx + dy * dy;\n if (!best || d2 < best.d2) best = { entry: e, index: i, px, py, theta: e.theta[i]!, r: rr, d2 };\n }\n }\n return best;\n }\n\n /** Draw a filled, white-ringed marker on the overlay at a screen position. */\n private drawPointMarker(px: number, py: number, color: string): void {\n const ctx = this.overlayCtx;\n ctx.save();\n ctx.fillStyle = color;\n ctx.strokeStyle = \"#ffffff\";\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.arc(px, py, 4, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n\n private renderHover(sq: { cx: number; cy: number; side: number }): void {\n const cursor = this.hoverPx!;\n const best = this.pickNearest(sq, cursor.x, cursor.y);\n const within = best != null && best.d2 <= 24 * 24;\n // In \"hover\" mode the info box follows the point under the cursor.\n if (this.pointInfo === \"hover\") {\n this.selected = within ? { entry: best!.entry, index: best!.index } : null;\n }\n // Only highlight within a reasonable pixel radius.\n if (!within) {\n this.tooltip.style.display = \"none\";\n return;\n }\n this.drawPointMarker(best!.px, best!.py, best!.entry.layer.colorCss);\n this.updateTooltip(best!.entry, best!.theta, best!.r, cursor);\n }\n\n /** Click handler: pin the nearest point's details, or clear on empty space. */\n private handleClick(sq: { cx: number; cy: number; side: number }, cursorX: number, cursorY: number): void {\n // Only \"click\" mode pins/clears via clicks; \"hover\" is driven by renderHover.\n if (this.pointInfo !== \"click\") return;\n const hit = this.pickNearest(sq, cursorX, cursorY);\n this.selected = hit && hit.d2 <= 14 * 14 ? { entry: hit.entry, index: hit.index } : null;\n this.requestRender();\n }\n\n /** Draw the pinned point's marker and position its info box (or hide it). */\n private updateInfoBox(sq: { cx: number; cy: number; side: number; left: number; top: number }): void {\n const box = this.infoBox;\n if (!this.selected) {\n box.style.display = \"none\";\n return;\n }\n const { entry, index } = this.selected;\n // A data update may have shrunk the series; drop a now-invalid pin.\n if (index >= Math.min(entry.theta.length, entry.r.length)) {\n this.selected = null;\n box.style.display = \"none\";\n return;\n }\n const pr = sq.side / 2;\n const a = entry.theta[index]! * this.toRad + this.rotation, rr = entry.r[index]!;\n const px = sq.cx + (rr * Math.cos(a) / this.R) * pr;\n const py = sq.cy - (rr * Math.sin(a) / this.R) * pr;\n // Hide when the point has been rotated/zoomed out of the square region.\n if (px < sq.left || px > sq.left + sq.side || py < sq.top || py > sq.top + sq.side) {\n box.style.display = \"none\";\n return;\n }\n this.drawPointMarker(px, py, entry.layer.colorCss);\n\n box.replaceChildren();\n const label = entry.labels && index < entry.labels.length ? entry.labels[index] : undefined;\n const title = document.createElement(\"div\");\n title.style.fontWeight = \"600\";\n title.style.marginBottom = \"2px\";\n title.textContent = label != null && label !== \"\" ? label : entry.layer.name;\n box.appendChild(title);\n\n const unit = this.toRad === 1 ? \"\" : \"°\";\n const rRow = document.createElement(\"div\");\n rRow.textContent = `r = ${fmt(rr)}`;\n const tRow = document.createElement(\"div\");\n tRow.textContent = `θ = ${fmt(entry.theta[index]!)}${unit}`;\n box.appendChild(rRow);\n box.appendChild(tRow);\n\n box.style.display = \"block\";\n const cw = this.container.clientWidth, ch = this.container.clientHeight;\n const tw = box.offsetWidth, th = box.offsetHeight;\n let left = px + 12;\n if (left + tw > cw) left = px - tw - 12;\n let top = py + 12;\n if (top + th > ch) top = py - th - 12;\n box.style.left = `${Math.max(0, left)}px`;\n box.style.top = `${Math.max(0, top)}px`;\n }\n\n private updateTooltip(entry: Entry, theta: number, r: number, cursor: { x: number; y: number }): void {\n const tip = this.tooltip;\n tip.replaceChildren();\n\n const head = document.createElement(\"div\");\n head.style.display = \"flex\";\n head.style.alignItems = \"center\";\n head.style.gap = \"6px\";\n head.style.marginBottom = \"3px\";\n const dot = document.createElement(\"span\");\n Object.assign(dot.style, {\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: entry.layer.colorCss,\n flex: \"0 0 auto\",\n } as CSSStyleDeclaration);\n const nameEl = document.createElement(\"span\");\n nameEl.textContent = entry.layer.name;\n head.appendChild(dot);\n head.appendChild(nameEl);\n tip.appendChild(head);\n\n const unit = this.toRad === 1 ? \"\" : \"°\";\n const rRow = document.createElement(\"div\");\n rRow.textContent = `r = ${fmt(r)}`;\n const tRow = document.createElement(\"div\");\n tRow.textContent = `θ = ${fmt(theta)}${unit}`;\n tip.appendChild(rRow);\n tip.appendChild(tRow);\n\n tip.style.display = \"block\";\n const cw = this.container.clientWidth;\n const tw = tip.offsetWidth, th = tip.offsetHeight;\n let left = cursor.x + 14;\n if (left + tw > cw) left = cursor.x - tw - 14;\n let top = cursor.y + 14;\n if (top + th > this.container.clientHeight) top = cursor.y - th - 14;\n tip.style.left = `${Math.max(0, left)}px`;\n tip.style.top = `${Math.max(0, top)}px`;\n }\n\n // ---- Interaction ----------------------------------------------------------\n\n private attachInteraction(): void {\n const el = this.overlayCanvas;\n el.style.touchAction = \"none\";\n el.style.cursor = \"grab\";\n\n // Wheel zooms the radial (r) scale about the center. r-min stays 0.\n el.addEventListener(\n \"wheel\",\n (e) => {\n e.preventDefault();\n const factor = Math.exp(e.deltaY * 0.001);\n this.zoom = Math.max(1e-3, Math.min(1e3, this.zoom * factor));\n this.R = this.baseR * this.zoom;\n this.requestRender();\n },\n { passive: false },\n );\n\n let rotating = false;\n let lastAngle = 0;\n // Pointer-down position (CSS px), to distinguish a click from a rotate drag.\n let downX = 0, downY = 0;\n // Cursor angle around the center (y-up, matching the data projection).\n const cursorAngle = (px: number, py: number): number => {\n const sq = this.square();\n return Math.atan2(sq.cy - py, px - sq.cx);\n };\n\n el.addEventListener(\"pointerdown\", (e) => {\n el.setPointerCapture(e.pointerId);\n const rect = el.getBoundingClientRect();\n downX = e.clientX - rect.left;\n downY = e.clientY - rect.top;\n rotating = true;\n lastAngle = cursorAngle(downX, downY);\n this.hoverPx = null;\n el.style.cursor = \"grabbing\";\n });\n\n el.addEventListener(\"pointermove\", (e) => {\n const rect = el.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n if (rotating) {\n // Turn the dial: the plot follows the cursor's angle about the center,\n // as if you grabbed the point under the cursor. Accumulate deltas\n // (normalized to ±π) so crossing the angle seam doesn't jump.\n const ang = cursorAngle(px, py);\n let d = ang - lastAngle;\n if (d > Math.PI) d -= 2 * Math.PI;\n else if (d < -Math.PI) d += 2 * Math.PI;\n this.rotation += d;\n lastAngle = ang;\n this.retransform();\n this.requestRender();\n } else if (this.hoverEnabled) {\n this.setHover({ x: px, y: py });\n }\n });\n\n el.addEventListener(\"pointerleave\", () => this.setHover(null));\n\n const end = (e: PointerEvent, click: boolean) => {\n if (el.hasPointerCapture(e.pointerId)) el.releasePointerCapture(e.pointerId);\n if (rotating) {\n rotating = false;\n el.style.cursor = \"grab\";\n }\n if (!click) return;\n // A near-stationary press is a click: pin the nearest point (or clear).\n const rect = el.getBoundingClientRect();\n const px = e.clientX - rect.left, py = e.clientY - rect.top;\n if (Math.hypot(px - downX, py - downY) < 4) this.handleClick(this.square(), px, py);\n };\n el.addEventListener(\"pointerup\", (e) => end(e, true));\n el.addEventListener(\"pointercancel\", (e) => end(e, false));\n }\n\n private makeHomeButton(): HTMLButtonElement {\n const dark = this.isDark;\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.title = \"Reset view (Home)\";\n btn.setAttribute(\"aria-label\", \"Reset view (Home)\");\n Object.assign(btn.style, {\n position: \"absolute\",\n top: \"8px\",\n right: \"8px\",\n zIndex: \"5\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"26px\",\n height: \"26px\",\n padding: \"0\",\n borderRadius: \"6px\",\n background: dark ? \"rgba(15,23,42,0.85)\" : \"rgba(255,255,255,0.9)\",\n color: dark ? \"#cbd5e1\" : \"#475569\",\n border: `1px solid ${dark ? \"rgba(148,163,184,0.25)\" : \"rgba(100,116,139,0.25)\"}`,\n backdropFilter: \"blur(6px)\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.15)\",\n cursor: \"pointer\",\n } as CSSStyleDeclaration);\n\n // Home glyph, built with safe DOM APIs (no innerHTML).\n const svgNS = \"http://www.w3.org/2000/svg\";\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"width\", \"16\");\n svg.setAttribute(\"height\", \"16\");\n svg.setAttribute(\"viewBox\", \"0 0 16 16\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n const mkPath = (d: string) => {\n const p = document.createElementNS(svgNS, \"path\");\n p.setAttribute(\"d\", d);\n p.setAttribute(\"fill\", \"none\");\n p.setAttribute(\"stroke\", \"currentColor\");\n p.setAttribute(\"stroke-width\", \"1.5\");\n p.setAttribute(\"stroke-linecap\", \"round\");\n p.setAttribute(\"stroke-linejoin\", \"round\");\n return p;\n };\n svg.appendChild(mkPath(\"M2 7.5 8 2l6 5.5\"));\n svg.appendChild(mkPath(\"M4 7v6.5h3.2V10h1.6v3.5H12V7\"));\n btn.appendChild(svg);\n\n btn.addEventListener(\"click\", () => this.home());\n this.container.appendChild(btn);\n return btn;\n }\n}\n\n/** Compact numeric formatting for tooltip values. */\nfunction fmt(v: number): string {\n if (!Number.isFinite(v)) return String(v);\n const a = Math.abs(v);\n if (a !== 0 && (a < 1e-3 || a >= 1e5)) return v.toExponential(2);\n return String(Math.round(v * 1000) / 1000);\n}\n","/** Minimal column-major 4×4 matrix helpers for the 3D plots (WebGL convention). */\nexport type Mat4 = Float32Array;\n\nexport function identity(): Mat4 {\n const m = new Float32Array(16);\n m[0] = m[5] = m[10] = m[15] = 1;\n return m;\n}\n\n/** Returns a·b. */\nexport function multiply(a: Mat4, b: Mat4): Mat4 {\n const o = new Float32Array(16);\n for (let c = 0; c < 4; c++) {\n for (let r = 0; r < 4; r++) {\n let s = 0;\n for (let k = 0; k < 4; k++) s += a[k * 4 + r]! * b[c * 4 + k]!;\n o[c * 4 + r] = s;\n }\n }\n return o;\n}\n\nexport function perspective(fovy: number, aspect: number, near: number, far: number): Mat4 {\n const f = 1 / Math.tan(fovy / 2);\n const nf = 1 / (near - far);\n const m = new Float32Array(16);\n m[0] = f / aspect;\n m[5] = f;\n m[10] = (far + near) * nf;\n m[11] = -1;\n m[14] = 2 * far * near * nf;\n return m;\n}\n\ntype V3 = [number, number, number];\nconst sub = (a: V3, b: V3): V3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\nconst cross = (a: V3, b: V3): V3 => [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n];\nfunction normalize(v: V3): V3 {\n const l = Math.hypot(v[0], v[1], v[2]) || 1;\n return [v[0] / l, v[1] / l, v[2] / l];\n}\n\nexport function lookAt(eye: V3, center: V3, up: V3): Mat4 {\n const z = normalize(sub(eye, center));\n const x = normalize(cross(up, z));\n const y = cross(z, x);\n const m = identity();\n m[0] = x[0]; m[4] = x[1]; m[8] = x[2];\n m[1] = y[0]; m[5] = y[1]; m[9] = y[2];\n m[2] = z[0]; m[6] = z[1]; m[10] = z[2];\n m[12] = -(x[0] * eye[0] + x[1] * eye[1] + x[2] * eye[2]);\n m[13] = -(y[0] * eye[0] + y[1] * eye[1] + y[2] * eye[2]);\n m[14] = -(z[0] * eye[0] + z[1] * eye[1] + z[2] * eye[2]);\n return m;\n}\n\n/** Transform a homogeneous point by a column-major matrix. Returns [x, y, z, w]. */\nexport function transformPoint(m: Mat4, x: number, y: number, z: number): [number, number, number, number] {\n return [\n m[0]! * x + m[4]! * y + m[8]! * z + m[12]!,\n m[1]! * x + m[5]! * y + m[9]! * z + m[13]!,\n m[2]! * x + m[6]! * y + m[10]! * z + m[14]!,\n m[3]! * x + m[7]! * y + m[11]! * z + m[15]!,\n ];\n}\n\n/** Matrix mapping p' = scale·p + translate (per-axis), used to normalize data to a cube. */\nexport function scaleTranslate(s: V3, t: V3): Mat4 {\n const m = identity();\n m[0] = s[0]; m[5] = s[1]; m[10] = s[2];\n m[12] = t[0]; m[13] = t[1]; m[14] = t[2];\n return m;\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { Bounds3, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface PointCloudOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n z: ArrayLike<number>;\n color?: string | Color;\n size?: number;\n colorBy?: { values: ArrayLike<number>; colormap?: ColormapName; domain?: Range };\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aColor;\nuniform mat4 uMVP;\nuniform float uSize;\nout vec3 vColor;\nvoid main() {\n vColor = aColor;\n gl_Position = uMVP * vec4(aPos, 1.0);\n gl_PointSize = uSize;\n}`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vColor;\nout vec4 outColor;\nvoid main() {\n vec2 d = gl_PointCoord - 0.5;\n if (length(d) > 0.5) discard;\n outColor = vec4(vColor, 1.0);\n}`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class PointCloudLayer implements Layer3D {\n readonly id: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private count: number;\n private size: number;\n private b3: Bounds3;\n\n constructor(gl: WebGL2RenderingContext, opts: PointCloudOptions) {\n this.id = `points3d-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.size = opts.size ?? 4;\n const n = Math.min(opts.x.length, opts.y.length, opts.z.length);\n this.count = n;\n\n const base = opts.color != null\n ? (Array.isArray(opts.color) ? (opts.color as Color) : parseColor(opts.color as string))\n : [0.4, 0.7, 1, 1] as Color;\n const cmap = opts.colorBy ? colormap(opts.colorBy.colormap ?? \"viridis\") : null;\n let lo = opts.colorBy?.domain?.[0] ?? Infinity;\n let hi = opts.colorBy?.domain?.[1] ?? -Infinity;\n if (opts.colorBy && !opts.colorBy.domain) {\n const v = opts.colorBy.values;\n for (let i = 0; i < n; i++) { const t = v[i]!; if (t < lo) lo = t; if (t > hi) hi = t; }\n }\n const span = (hi - lo) || 1;\n\n const data = new Float32Array(n * 6);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!, z = opts.z[i]!;\n data[i * 6] = x; data[i * 6 + 1] = y; data[i * 6 + 2] = z;\n let c: [number, number, number];\n if (cmap && opts.colorBy) c = cmap((opts.colorBy.values[i]! - lo) / span);\n else c = [base[0], base[1], base[2]];\n data[i * 6 + 3] = c[0]; data[i * 6 + 4] = c[1]; data[i * 6 + 5] = c[2];\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n if (z < minZ) minZ = z; if (z > maxZ) maxZ = z;\n }\n this.b3 = { x: [minX, maxX], y: [minY, maxY], z: [minZ, maxZ] };\n\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 24, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 24, 12);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uSize\"]);\n }\n\n bounds3() { return this.count ? this.b3 : null; }\n\n draw(gl: WebGL2RenderingContext, mvp: Mat4): void {\n if (this.count === 0) return;\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\n gl.uniform1f(this.uniforms.uSize!, this.size);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.POINTS, 0, this.count);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Range } from \"../types.js\";\nimport type { Bounds3, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface SurfaceOptions {\n /** Row-major height grid, length `cols * rows`. */\n values: ArrayLike<number>;\n cols: number;\n rows: number;\n /** World extent of the grid footprint. Defaults to unit indices. */\n extentX?: Range;\n extentZ?: Range;\n colormap?: ColormapName;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aNormal;\nlayout(location = 2) in vec3 aColor;\nuniform mat4 uMVP;\nout vec3 vColor;\nout vec3 vN;\nvoid main() { vColor = aColor; vN = aNormal; gl_Position = uMVP * vec4(aPos, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vColor;\nin vec3 vN;\nuniform vec3 uLightDir;\nuniform float uAmbient;\nout vec4 outColor;\nvoid main() {\n float d = max(dot(normalize(vN), normalize(uLightDir)), 0.0);\n float shade = uAmbient + (1.0 - uAmbient) * d;\n outColor = vec4(vColor * shade, 1.0);\n}`;\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, VERT, FRAG); programCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class SurfaceLayer implements Layer3D {\n readonly id: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private vertexCount: number;\n private b3: Bounds3;\n private lightDir: [number, number, number] = [0.5, 1, 0.35];\n private ambient = 0.35;\n\n constructor(gl: WebGL2RenderingContext, opts: SurfaceOptions) {\n this.id = `surface-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n const { cols, rows, values } = opts;\n const [x0, x1] = opts.extentX ?? [0, cols - 1];\n const [z0, z1] = opts.extentZ ?? [0, rows - 1];\n const dxWorld = (x1 - x0) / Math.max(1, cols - 1);\n const dzWorld = (z1 - z0) / Math.max(1, rows - 1);\n\n let vmin = Infinity, vmax = -Infinity;\n for (let i = 0; i < values.length; i++) { const v = values[i]!; if (v < vmin) vmin = v; if (v > vmax) vmax = v; }\n const span = vmax - vmin || 1;\n const cmap = colormap(opts.colormap ?? \"viridis\");\n const wx = (c: number) => x0 + (c / (cols - 1)) * (x1 - x0);\n const wz = (r: number) => z0 + (r / (rows - 1)) * (z1 - z0);\n const at = (c: number, r: number) => values[r * cols + c]!;\n\n const normalAt = (c: number, r: number): [number, number, number] => {\n const cl = Math.max(0, Math.min(cols - 1, c)), rl = Math.max(0, Math.min(rows - 1, r));\n const dzdx = (at(Math.min(cols - 1, cl + 1), rl) - at(Math.max(0, cl - 1), rl)) / (2 * dxWorld);\n const dzdz = (at(cl, Math.min(rows - 1, rl + 1)) - at(cl, Math.max(0, rl - 1))) / (2 * dzWorld);\n const nl = Math.hypot(-dzdx, 1, -dzdz) || 1;\n return [-dzdx / nl, 1 / nl, -dzdz / nl];\n };\n\n const data: number[] = [];\n const vert = (c: number, r: number) => {\n const [nx, ny, nz] = normalAt(c, r);\n const [cr, cg, cb] = cmap((at(c, r) - vmin) / span);\n data.push(wx(c), at(c, r), wz(r), nx, ny, nz, cr, cg, cb);\n };\n for (let r = 0; r < rows - 1; r++) {\n for (let c = 0; c < cols - 1; c++) {\n vert(c, r); vert(c + 1, r); vert(c + 1, r + 1);\n vert(c, r); vert(c + 1, r + 1); vert(c, r + 1);\n }\n }\n\n this.vertexCount = data.length / 9;\n this.b3 = { x: [x0, x1], y: [vmin, vmax], z: [z0, z1] };\n\n const vao = gl.createVertexArray()!;\n const buffer = gl.createBuffer()!;\n this.vao = vao; this.buffer = buffer;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 36, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 36, 12);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 3, gl.FLOAT, false, 36, 24);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uLightDir\", \"uAmbient\"]);\n }\n\n bounds3() { return this.b3; }\n\n /** Set the light direction (world space) and ambient term (0..1). */\n setLight(dir: [number, number, number], ambient: number): void {\n this.lightDir = dir;\n this.ambient = ambient;\n }\n\n draw(gl: WebGL2RenderingContext, mvp: Mat4): void {\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\n gl.uniform3f(this.uniforms.uLightDir!, this.lightDir[0], this.lightDir[1], this.lightDir[2]);\n gl.uniform1f(this.uniforms.uAmbient!, this.ambient);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLES, 0, this.vertexCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","import { autoTicks, defaultFormat } from \"../axes/ticks.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { begin3D, getSharedGL, sizeShared } from \"../gl/shared.js\";\nimport type { Range } from \"../types.js\";\nimport type { Bounds3, Layer3D } from \"./layer3d.js\";\nimport { lookAt, multiply, perspective, scaleTranslate, transformPoint, type Mat4 } from \"./mat4.js\";\nimport { PointCloudLayer, type PointCloudOptions } from \"./pointcloud.js\";\nimport { SurfaceLayer, type SurfaceOptions } from \"./surface.js\";\n\nexport interface Plot3DOptions {\n background?: [number, number, number, number];\n azimuth?: number;\n elevation?: number;\n distance?: number;\n /** Axis titles drawn along the x / y (height) / z edges. */\n axisLabels?: { x?: string; y?: string; z?: string };\n /** Render a small on-canvas panel with light-angle + ambient sliders. */\n lightControls?: boolean;\n}\n\nconst LINE_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nuniform mat4 uVP;\nvoid main() { gl_Position = uVP * vec4(aPos, 1.0); }`;\nconst LINE_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = uColor; }`;\n\nconst BOX_EDGES = new Float32Array([\n -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1,\n -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, -1, 1,\n -1, -1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, 1,\n]);\n\ninterface Label { p: [number, number, number]; text: string; title?: boolean }\n\n/** A 3D scatter/surface plot with an orbit camera, axis ticks, and lighting. */\nexport class Plot3D {\n private container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private displayCtx: CanvasRenderingContext2D;\n private gl: WebGL2RenderingContext;\n private sharedCanvas: HTMLCanvasElement;\n private layers: Layer3D[] = [];\n private normalize: Mat4 = scaleTranslate([1, 1, 1], [0, 0, 0]);\n private dataBounds: Bounds3 | null = null;\n private bg: [number, number, number, number];\n private dpr = 1;\n\n private azimuth: number;\n private elevation: number;\n private distance: number;\n private axisLabels: { x?: string; y?: string; z?: string };\n private resizeObserver: ResizeObserver;\n private frameRequested = false;\n\n private lineProgram: WebGLProgram;\n private lineUniforms: Record<string, WebGLUniformLocation | null>;\n private boxVao: WebGLVertexArrayObject;\n private boxBuf: WebGLBuffer;\n private tickVao: WebGLVertexArrayObject;\n private tickBuf: WebGLBuffer;\n private tickCount = 0;\n private labels: Label[] = [];\n\n // Lighting.\n private lightAz = 0.9;\n private lightEl = 0.9;\n private ambient = 0.35;\n private controlsEl: HTMLElement | null = null;\n\n constructor(container: HTMLElement, options: Plot3DOptions = {}) {\n this.container = container;\n if (getComputedStyle(container).position === \"static\") container.style.position = \"relative\";\n this.canvas = document.createElement(\"canvas\");\n Object.assign(this.canvas.style, { position: \"absolute\", inset: \"0\", width: \"100%\", height: \"100%\" } as CSSStyleDeclaration);\n container.appendChild(this.canvas);\n this.displayCtx = this.canvas.getContext(\"2d\")!;\n const s = getSharedGL();\n this.gl = s.gl;\n this.sharedCanvas = s.canvas;\n this.bg = options.background ?? [0.04, 0.06, 0.13, 1];\n this.azimuth = options.azimuth ?? 0.7;\n this.elevation = options.elevation ?? 0.5;\n this.distance = options.distance ?? 3.6;\n this.axisLabels = options.axisLabels ?? {};\n\n this.lineProgram = createProgram(this.gl, LINE_VERT, LINE_FRAG);\n this.lineUniforms = uniformLocations(this.gl, this.lineProgram, [\"uVP\", \"uColor\"]);\n this.boxVao = this.gl.createVertexArray()!;\n this.boxBuf = this.gl.createBuffer()!;\n this.bindLineVao(this.boxVao, this.boxBuf, BOX_EDGES);\n this.tickVao = this.gl.createVertexArray()!;\n this.tickBuf = this.gl.createBuffer()!;\n this.bindLineVao(this.tickVao, this.tickBuf, new Float32Array(0));\n\n if (options.lightControls) this.buildControls();\n\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(container);\n this.attachControls();\n this.resize();\n }\n\n private bindLineVao(vao: WebGLVertexArrayObject, buf: WebGLBuffer, data: Float32Array): void {\n const gl = this.gl;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n }\n\n addSurface(opts: SurfaceOptions): SurfaceLayer {\n const l = new SurfaceLayer(this.gl, opts);\n l.setLight(this.lightDir(), this.ambient);\n this.layers.push(l);\n this.recompute();\n this.requestRender();\n return l;\n }\n\n addPointCloud(opts: PointCloudOptions): PointCloudLayer {\n const l = new PointCloudLayer(this.gl, opts);\n this.layers.push(l);\n this.recompute();\n this.requestRender();\n return l;\n }\n\n /** Update the light direction (azimuth/elevation, radians) and ambient (0..1). */\n setLight(params: { azimuth?: number; elevation?: number; ambient?: number }): void {\n if (params.azimuth != null) this.lightAz = params.azimuth;\n if (params.elevation != null) this.lightEl = params.elevation;\n if (params.ambient != null) this.ambient = params.ambient;\n const dir = this.lightDir();\n for (const l of this.layers) {\n if (\"setLight\" in l) (l as SurfaceLayer).setLight(dir, this.ambient);\n }\n this.requestRender();\n }\n\n private lightDir(): [number, number, number] {\n const el = this.lightEl, az = this.lightAz;\n return [Math.cos(el) * Math.cos(az), Math.sin(el), Math.cos(el) * Math.sin(az)];\n }\n\n destroy(): void {\n this.resizeObserver.disconnect();\n for (const l of this.layers) l.dispose();\n this.gl.deleteProgram(this.lineProgram);\n this.gl.deleteVertexArray(this.boxVao);\n this.gl.deleteVertexArray(this.tickVao);\n this.gl.deleteBuffer(this.boxBuf);\n this.gl.deleteBuffer(this.tickBuf);\n this.controlsEl?.remove();\n this.container.removeChild(this.canvas);\n }\n\n private recompute(): void {\n let b: Bounds3 | null = null;\n for (const l of this.layers) {\n const lb = l.bounds3();\n if (!lb) continue;\n b = b ? {\n x: [Math.min(b.x[0], lb.x[0]), Math.max(b.x[1], lb.x[1])],\n y: [Math.min(b.y[0], lb.y[0]), Math.max(b.y[1], lb.y[1])],\n z: [Math.min(b.z[0], lb.z[0]), Math.max(b.z[1], lb.z[1])],\n } : lb;\n }\n if (!b) return;\n this.dataBounds = b;\n const axis = (r: Range): [number, number] => {\n const span = r[1] - r[0];\n return span === 0 ? [1, -r[0]] : [2 / span, -(r[1] + r[0]) / span];\n };\n const [sx, tx] = axis(b.x), [sy, ty] = axis(b.y), [sz, tz] = axis(b.z);\n this.normalize = scaleTranslate([sx, sy, sz], [tx, ty, tz]);\n this.buildAxes();\n }\n\n /** Build tick-mark line geometry + tick/title labels from the data bounds. */\n private buildAxes(): void {\n const b = this.dataBounds;\n if (!b) return;\n const cube = (r: Range, v: number) => (2 * (v - r[0])) / ((r[1] - r[0]) || 1) - 1;\n const seg: number[] = [];\n const labels: Label[] = [];\n const mark = (x0: number, y0: number, z0: number, x1: number, y1: number, z1: number) =>\n seg.push(x0, y0, z0, x1, y1, z1);\n\n for (const t of autoTicks(b.x[0], b.x[1], 5)) {\n const cx = cube(b.x, t.value);\n mark(cx, -1, -1, cx, -1, -1.06);\n labels.push({ p: [cx, -1, -1.16], text: defaultFormat(t.value) });\n }\n for (const t of autoTicks(b.y[0], b.y[1], 5)) {\n const cy = cube(b.y, t.value);\n mark(-1, cy, -1, -1.06, cy, -1);\n labels.push({ p: [-1.16, cy, -1], text: defaultFormat(t.value) });\n }\n for (const t of autoTicks(b.z[0], b.z[1], 5)) {\n const cz = cube(b.z, t.value);\n mark(-1, -1, cz, -1.06, -1, cz);\n labels.push({ p: [-1.16, -1, cz], text: defaultFormat(t.value) });\n }\n if (this.axisLabels.x) labels.push({ p: [0, -1.25, -1.3], text: this.axisLabels.x, title: true });\n if (this.axisLabels.y) labels.push({ p: [-1.35, 0, -1], text: this.axisLabels.y, title: true });\n if (this.axisLabels.z) labels.push({ p: [-1.3, -1.25, 0], text: this.axisLabels.z, title: true });\n\n this.labels = labels;\n this.tickCount = seg.length / 3;\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.tickBuf);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(seg), this.gl.STATIC_DRAW);\n }\n\n private resize(): void {\n this.dpr = window.devicePixelRatio || 1;\n const w = this.container.clientWidth, h = this.container.clientHeight;\n this.canvas.width = Math.max(1, Math.round(w * this.dpr));\n this.canvas.height = Math.max(1, Math.round(h * this.dpr));\n this.render();\n }\n\n requestRender(): void {\n if (this.frameRequested) return;\n this.frameRequested = true;\n requestAnimationFrame(() => { this.frameRequested = false; this.render(); });\n }\n\n private viewProj(): { vp: Mat4; mvp: Mat4 } {\n const aspect = this.canvas.width / Math.max(1, this.canvas.height);\n const proj = perspective((50 * Math.PI) / 180, aspect, 0.01, 100);\n const el = Math.max(-1.5, Math.min(1.5, this.elevation));\n const eye: [number, number, number] = [\n this.distance * Math.cos(el) * Math.sin(this.azimuth),\n this.distance * Math.sin(el),\n this.distance * Math.cos(el) * Math.cos(this.azimuth),\n ];\n const view = lookAt(eye, [0, 0, 0], [0, 1, 0]);\n const vp = multiply(proj, view);\n return { vp, mvp: multiply(vp, this.normalize) };\n }\n\n render(): void {\n const gl = this.gl;\n const w = this.canvas.width, h = this.canvas.height;\n sizeShared(gl, w, h);\n begin3D(gl);\n gl.viewport(0, 0, w, h);\n gl.clearColor(this.bg[0], this.bg[1], this.bg[2], this.bg[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n const { vp, mvp } = this.viewProj();\n\n gl.useProgram(this.lineProgram);\n gl.uniformMatrix4fv(this.lineUniforms.uVP!, false, vp);\n // Bounding box.\n gl.uniform4f(this.lineUniforms.uColor!, 0.6, 0.65, 0.75, 0.4);\n gl.bindVertexArray(this.boxVao);\n gl.drawArrays(gl.LINES, 0, BOX_EDGES.length / 3);\n // Axis tick marks.\n if (this.tickCount > 0) {\n gl.uniform4f(this.lineUniforms.uColor!, 0.75, 0.8, 0.9, 0.8);\n gl.bindVertexArray(this.tickVao);\n gl.drawArrays(gl.LINES, 0, this.tickCount);\n }\n gl.bindVertexArray(null);\n\n for (const l of this.layers) l.draw(gl, mvp);\n\n // Blit WebGL result, then draw projected axis labels on top.\n this.displayCtx.clearRect(0, 0, w, h);\n this.displayCtx.drawImage(this.sharedCanvas, 0, 0);\n this.drawLabels(vp, w, h);\n }\n\n private drawLabels(vp: Mat4, w: number, h: number): void {\n if (this.labels.length === 0) return;\n const ctx = this.displayCtx;\n ctx.save();\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = \"#cbd5e1\";\n for (const lab of this.labels) {\n const c = transformPoint(vp, lab.p[0], lab.p[1], lab.p[2]);\n if (c[3] <= 0) continue;\n const sx = (c[0] / c[3] * 0.5 + 0.5) * w;\n const sy = (1 - (c[1] / c[3] * 0.5 + 0.5)) * h;\n ctx.font = `${(lab.title ? 13 : 11) * this.dpr}px system-ui, sans-serif`;\n ctx.fillStyle = lab.title ? \"#e2e8f0\" : \"#94a3b8\";\n ctx.fillText(lab.text, sx, sy);\n }\n ctx.restore();\n }\n\n private attachControls(): void {\n const el = this.canvas;\n el.style.touchAction = \"none\";\n el.style.cursor = \"grab\";\n let dragging = false, lastX = 0, lastY = 0;\n el.addEventListener(\"pointerdown\", (e) => {\n dragging = true; lastX = e.clientX; lastY = e.clientY;\n el.setPointerCapture(e.pointerId); el.style.cursor = \"grabbing\";\n });\n el.addEventListener(\"pointermove\", (e) => {\n if (!dragging) return;\n this.azimuth -= (e.clientX - lastX) * 0.01;\n this.elevation += (e.clientY - lastY) * 0.01;\n lastX = e.clientX; lastY = e.clientY;\n this.requestRender();\n });\n const end = (e: PointerEvent) => {\n dragging = false;\n if (el.hasPointerCapture(e.pointerId)) el.releasePointerCapture(e.pointerId);\n el.style.cursor = \"grab\";\n };\n el.addEventListener(\"pointerup\", end);\n el.addEventListener(\"pointercancel\", end);\n el.addEventListener(\"wheel\", (e) => {\n e.preventDefault();\n this.distance = Math.max(0.5, Math.min(20, this.distance * Math.exp(e.deltaY * 0.001)));\n this.requestRender();\n }, { passive: false });\n }\n\n private buildControls(): void {\n const panel = document.createElement(\"div\");\n Object.assign(panel.style, {\n position: \"absolute\", top: \"8px\", left: \"8px\", zIndex: \"5\",\n display: \"flex\", flexDirection: \"column\", gap: \"4px\",\n padding: \"8px 10px\", borderRadius: \"8px\",\n background: \"rgba(15,23,42,0.8)\", border: \"1px solid rgba(148,163,184,0.25)\",\n font: \"11px system-ui, sans-serif\", color: \"#cbd5e1\", backdropFilter: \"blur(6px)\",\n } as CSSStyleDeclaration);\n const row = (label: string, min: number, max: number, val: number, on: (v: number) => void) => {\n const wrap = document.createElement(\"label\");\n wrap.style.display = \"flex\";\n wrap.style.alignItems = \"center\";\n wrap.style.gap = \"6px\";\n const span = document.createElement(\"span\");\n span.textContent = label;\n span.style.width = \"48px\";\n const input = document.createElement(\"input\");\n input.type = \"range\";\n input.min = String(min); input.max = String(max); input.value = String(val);\n input.style.width = \"90px\";\n input.addEventListener(\"input\", () => on(parseFloat(input.value)));\n wrap.appendChild(span); wrap.appendChild(input);\n panel.appendChild(wrap);\n };\n row(\"light\", 0, 360, (this.lightAz * 180) / Math.PI, (v) => this.setLight({ azimuth: (v * Math.PI) / 180 }));\n row(\"ambient\", 0, 100, this.ambient * 100, (v) => this.setLight({ ambient: v / 100 }));\n this.container.appendChild(panel);\n this.controlsEl = panel;\n }\n}\n"],"mappings":"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","names":["fmt","VERT","FRAG","programCache","getProgram","counter","lo","hi","bins","VERT","FRAG","programCache","getProgram","counter","FRAG","medianSpacing","counter","VERT","FRAG","programCache","getProgram","counter","SEG_CORNERS","cache","programs","counter","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter","programCache","VERT","FRAG","CORNERS","programCache","getProgram","counter","FRAG","SEG_CORNERS","cache","programs","counter","minX","maxX","minY","maxY","VERT","FRAG","CORNERS","programCache","getProgram","counter","SOLID_FRAG","SEG_CORNERS","QUAD_CORNERS","cache","programs","counter","clampedLo","normalize","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter"]}