@photonviz/core 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +900 -4
- package/dist/index.js +3850 -316
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
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/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"]}
|
|
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/graph.ts","../src/layers/heatmap.ts","../src/layers/hexbin.ts","../src/layers/image.ts","../src/layers/line-util.ts","../src/layers/gpu-decimate.ts","../src/layers/pick.ts","../src/layers/line.ts","../src/graph/force.ts","../src/geo/earcut.ts","../src/layers/patches.ts","../src/layers/pie.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/bar3d.ts","../src/plot3d/contour3d.ts","../src/plot3d/marching-cubes.ts","../src/plot3d/isosurface.ts","../src/plot3d/line3d.ts","../src/plot3d/mat4.ts","../src/plot3d/pointcloud.ts","../src/plot3d/quiver3d.ts","../src/plot3d/surface.ts","../src/plot3d/volume.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 /**\n * `\"v\"` (default) draws vertical bars: `x` positions along the x axis, `y`\n * values along the y axis. `\"h\"` draws horizontal bars: `x` positions along the\n * **y** axis, `y` values along the **x** axis, `width` is the bar thickness.\n */\n orientation?: \"v\" | \"h\";\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 orientation: \"v\" | \"h\";\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 this.orientation = opts.orientation ?? \"v\";\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 horizontal = this.orientation === \"h\";\n const baseAt = (i: number): number =>\n base == null ? 0 : typeof base === \"number\" ? base : base[i]!;\n // The position axis references x[0]; the value axis references y[0]. Which one\n // is horizontal (x) vs vertical (y) depends on orientation.\n const posRef = n > 0 ? x[0]! : 0;\n const valRef = n > 0 ? y[0]! : 0;\n this.xRef = horizontal ? valRef : posRef;\n this.yRef = horizontal ? posRef : valRef;\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 cpos = x[i]! + off; // center along the position axis\n const p0 = cpos - width / 2, p1 = cpos + width / 2;\n const b = baseAt(i), val = y[i]!; // extent along the value axis\n // Emit the rect in actual (axis-x, axis-y) space, offset by the refs.\n const ax0 = horizontal ? b : p0;\n const ax1 = horizontal ? val : p1;\n const ay0 = horizontal ? p0 : b;\n const ay1 = horizontal ? p1 : val;\n rects[i * 4] = ax0 - this.xRef;\n rects[i * 4 + 1] = ay0 - this.yRef;\n rects[i * 4 + 2] = ax1 - this.xRef;\n rects[i * 4 + 3] = ay1 - this.yRef;\n minX = Math.min(minX, ax0, ax1); maxX = Math.max(maxX, ax0, ax1);\n minY = Math.min(minY, ay0, ay1); maxY = Math.max(maxY, ay0, ay1);\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/** Precomputed samples so the hot per-pixel path is one lookup, not an anchor lerp. */\nconst LUT_SIZE = 256;\nconst lutCache = new Map<ColormapName, Float32Array>();\n\nfunction buildLUT(name: ColormapName): Float32Array {\n const anchors = ANCHORS[name];\n const last = anchors.length - 1;\n const lut = new Float32Array(LUT_SIZE * 3);\n for (let s = 0; s < LUT_SIZE; s++) {\n const pos = (s / (LUT_SIZE - 1)) * 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 lut[s * 3] = a[0] + (b[0] - a[0]) * f;\n lut[s * 3 + 1] = a[1] + (b[1] - a[1]) * f;\n lut[s * 3 + 2] = a[2] + (b[2] - a[2]) * f;\n }\n return lut;\n}\n\n/**\n * The raw `256×3` (r,g,b in 0..1) lookup table for a colormap, cached per name.\n * Hot loops (heatmap, colorBy, …) can index it directly — `j = ((clamp(t)*255)|0)*3`\n * — to avoid a per-element closure call and tuple allocation.\n */\nexport function colormapLUT(name: ColormapName = \"viridis\"): Float32Array {\n let lut = lutCache.get(name);\n if (!lut) { lut = buildLUT(name); lutCache.set(name, lut); }\n return lut;\n}\n\n/** Returns a `(t in 0..1) => RGB` sampler for the named colormap (LUT-backed). */\nexport function colormap(name: ColormapName = \"viridis\"): (t: number) => RGB {\n const lut = colormapLUT(name);\n return (t: number) => {\n const c = t <= 0 ? 0 : t >= 1 ? 1 : t;\n const j = ((c * (LUT_SIZE - 1)) | 0) * 3;\n return [lut[j]!, lut[j + 1]!, lut[j + 2]!];\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 { 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 GraphOptions {\n /** Node positions (data space). */\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Edges as index pairs into the node arrays. */\n edges: ReadonlyArray<readonly [number, number]>;\n nodeColor?: string | Color;\n /** Node diameter in CSS pixels. Default 10. */\n nodeSize?: number;\n edgeColor?: string | Color;\n name?: string;\n yAxis?: string;\n}\n\n// Edges: plain data-space segments.\nconst EDGE_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos;\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\n// Nodes: round points sized in device pixels.\nconst NODE_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos;\nuniform float uSize;\n${TRANSFORM_GLSL}\nvoid main() {\n gl_Position = vec4(dataToClip(aPos), 0.0, 1.0);\n gl_PointSize = uSize;\n}`;\n\nconst NODE_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() {\n vec2 p = gl_PointCoord * 2.0 - 1.0;\n float r = length(p);\n if (r > 1.0) discard;\n float a = smoothstep(1.0, 0.82, r);\n outColor = vec4(uColor.rgb * uColor.a * a, uColor.a * a);\n}`;\n\ninterface Programs {\n edge: WebGLProgram;\n node: WebGLProgram;\n}\nconst programCache = new WeakMap<WebGL2RenderingContext, Programs>();\nfunction getPrograms(gl: WebGL2RenderingContext): Programs {\n let p = programCache.get(gl);\n if (!p) {\n p = { edge: createProgram(gl, EDGE_VERT, SOLID_FRAG), node: createProgram(gl, NODE_VERT, NODE_FRAG) };\n programCache.set(gl, p);\n }\n return p;\n}\n\nlet counter = 0;\n\n/** A node-link graph: edges as line segments, nodes as round points. */\nexport class GraphLayer 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: Programs;\n private nodeVao: WebGLVertexArrayObject;\n private edgeVao: WebGLVertexArrayObject;\n private buffers: WebGLBuffer[] = [];\n private edgeUniforms: Record<string, WebGLUniformLocation | null>;\n private nodeUniforms: Record<string, WebGLUniformLocation | null>;\n private nodeCount: number;\n private edgeVerts: number;\n private nodeColor: Color;\n private edgeColor: Color;\n private nodeSize: 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: GraphOptions) {\n this.id = `graph-${counter++}`;\n this.gl = gl;\n this.progs = getPrograms(gl);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n const nc = opts.nodeColor ?? \"#60a5fa\";\n this.nodeColor = Array.isArray(nc) ? (nc as Color) : parseColor(nc as string);\n this.colorCss = typeof nc === \"string\" ? nc : toColorCss(this.nodeColor);\n const ec = opts.edgeColor ?? \"rgba(148,163,184,0.5)\";\n this.edgeColor = Array.isArray(ec) ? (ec as Color) : parseColor(ec as string);\n this.nodeSize = opts.nodeSize ?? 10;\n\n const n = Math.min(opts.x.length, opts.y.length);\n this.nodeCount = n;\n this.xRef = n > 0 ? opts.x[0]! : 0;\n this.yRef = n > 0 ? opts.y[0]! : 0;\n\n const nodePos = new Float32Array(n * 2);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const px = opts.x[i]!, py = opts.y[i]!;\n nodePos[i * 2] = px - this.xRef;\n nodePos[i * 2 + 1] = py - this.yRef;\n if (px < minX) minX = px; if (px > maxX) maxX = px;\n if (py < minY) minY = py; if (py > maxY) maxY = py;\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n\n // Two endpoints per edge (skip edges referencing out-of-range nodes).\n const edgePos: number[] = [];\n for (const [a, b] of opts.edges) {\n if (a < 0 || b < 0 || a >= n || b >= n) continue;\n edgePos.push(opts.x[a]! - this.xRef, opts.y[a]! - this.yRef, opts.x[b]! - this.xRef, opts.y[b]! - this.yRef);\n }\n this.edgeVerts = edgePos.length / 2;\n\n const nodeBuf = gl.createBuffer()!;\n const edgeBuf = gl.createBuffer()!;\n this.buffers = [nodeBuf, edgeBuf];\n\n this.nodeVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.nodeVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, nodeBuf);\n gl.bufferData(gl.ARRAY_BUFFER, nodePos, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n this.edgeVao = gl.createVertexArray()!;\n gl.bindVertexArray(this.edgeVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, edgeBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(edgePos), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n\n this.edgeUniforms = uniformLocations(gl, this.progs.edge, [...TRANSFORM_UNIFORMS, \"uColor\"]);\n this.nodeUniforms = uniformLocations(gl, this.progs.node, [...TRANSFORM_UNIFORMS, \"uColor\", \"uSize\"]);\n }\n\n bounds() {\n if (this.nodeCount === 0) return null;\n return { x: this.xBounds, y: this.yBounds };\n }\n\n draw(state: DrawState): void {\n if (this.nodeCount === 0) return;\n const gl = state.gl;\n // Edges first, nodes on top.\n if (this.edgeVerts > 0) {\n gl.useProgram(this.progs.edge);\n setTransformUniforms(gl, this.edgeUniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.edgeUniforms.uColor!, this.edgeColor[0], this.edgeColor[1], this.edgeColor[2], this.edgeColor[3]);\n gl.bindVertexArray(this.edgeVao);\n gl.drawArrays(gl.LINES, 0, this.edgeVerts);\n }\n gl.useProgram(this.progs.node);\n setTransformUniforms(gl, this.nodeUniforms, state.x, state.y, this.xRef, this.yRef);\n gl.uniform4f(this.nodeUniforms.uColor!, this.nodeColor[0], this.nodeColor[1], this.nodeColor[2], this.nodeColor[3]);\n gl.uniform1f(this.nodeUniforms.uSize!, this.nodeSize * state.dpr);\n gl.bindVertexArray(this.nodeVao);\n gl.drawArrays(gl.POINTS, 0, this.nodeCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.nodeVao);\n this.gl.deleteVertexArray(this.edgeVao);\n for (const b of this.buffers) this.gl.deleteBuffer(b);\n }\n}\n","import { colormapLUT, 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 lut = colormapLUT(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 // Direct LUT indexing — no per-cell closure call or tuple allocation.\n for (let i = 0; i < cols * rows; i++) {\n let t = (values[i]! - lo) / span;\n t = t <= 0 ? 0 : t >= 1 ? 1 : t;\n const j = ((t * 255) | 0) * 3;\n pixels[i * 4] = (lut[j]! * 255 + 0.5) | 0;\n pixels[i * 4 + 1] = (lut[j + 1]! * 255 + 0.5) | 0;\n pixels[i * 4 + 2] = (lut[j + 2]! * 255 + 0.5) | 0;\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","import { 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\n/** Anything `texImage2D` accepts, or a URL string the layer loads itself. */\nexport type ImageSource = TexImageSource | string;\n\nexport interface ImageOptions {\n /** A decoded bitmap/canvas/ImageData, or a URL to load (CORS-enabled). */\n source: ImageSource;\n /** Data-space rectangle the image spans. */\n extent: { x: Range; y: Range };\n /** Bilinear filtering (default) vs. nearest. */\n smooth?: boolean;\n /** Overall opacity 0..1. Default 1. */\n opacity?: number;\n /** Called after an async (URL) image finishes loading — wire to `plot.requestRender`. */\n onLoad?: () => void;\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\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;\nuniform float uOpacity;\nout vec4 outColor;\nvoid main() {\n vec4 c = texture(uTex, vUV);\n float a = c.a * uOpacity;\n outColor = vec4(c.rgb * a, 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\n/**\n * An RGBA image (Bokeh `image_rgba` / `image_url`) drawn as a textured quad over\n * a data-space extent — reuses the heatmap quad path. A `string` source is loaded\n * asynchronously; pass `onLoad` (→ `plot.requestRender`) so the plot redraws once\n * the pixels arrive.\n */\nexport class ImageLayer implements Layer {\n readonly id: string;\n readonly name: string;\n readonly colorCss = \"#94a3b8\";\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 private opacity: number;\n private smooth: boolean;\n private ready = false;\n private img: HTMLImageElement | null = null;\n\n constructor(gl: WebGL2RenderingContext, opts: ImageOptions) {\n this.id = `image-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n this.ext = opts.extent;\n this.opacity = opts.opacity ?? 1;\n this.smooth = opts.smooth !== false;\n const [x0, x1] = opts.extent.x;\n const [y0, y1] = opts.extent.y;\n this.xRef = x0;\n this.yRef = y0;\n\n this.texture = gl.createTexture()!;\n // A 1×1 transparent placeholder until the real source is uploaded.\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n if (typeof opts.source === \"string\") {\n const img = new Image();\n this.img = img;\n img.crossOrigin = \"anonymous\";\n img.onload = () => {\n this.upload(img);\n opts.onLoad?.();\n };\n img.src = opts.source;\n } else {\n this.upload(opts.source);\n }\n\n // Quad over the extent (v=0 at y0, matching texImage2D row order via flipY).\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\", \"uOpacity\"]);\n }\n\n private upload(src: TexImageSource): void {\n const gl = this.gl;\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n // Flip so the image's top row lands at the top of the extent (y1).\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, src);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n const filter = this.smooth ? gl.LINEAR : gl.NEAREST;\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 this.ready = true;\n }\n\n bounds() {\n return { x: this.ext.x, y: this.ext.y };\n }\n\n draw(state: DrawState): void {\n if (!this.ready) 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.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.uniform1i(this.uniforms.uTex!, 0);\n gl.uniform1f(this.uniforms.uOpacity!, this.opacity);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n if (this.img) this.img.onload = null;\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n this.gl.deleteTexture(this.texture);\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","/**\n * A tiny deterministic force-directed layout (Fruchterman–Reingold style). Nodes\n * seed on a unit circle (no RNG — pure and unit-testable), then relax under\n * all-pairs repulsion + per-edge attraction + a gentle pull to the center, with\n * temperature cooling. Returns node positions in roughly a unit box around 0.\n */\nexport interface ForceLayoutOptions {\n /** Relaxation steps. Default 300. */\n iterations?: number;\n /** Layout area; the ideal edge length is `sqrt(area / n)`. Default 1. */\n area?: number;\n /** Pull toward the origin each step. Default 0.05. */\n gravity?: number;\n}\n\nexport function forceLayout(\n nodeCount: number,\n edges: ReadonlyArray<readonly [number, number]>,\n opts: ForceLayoutOptions = {},\n): { x: Float64Array; y: Float64Array } {\n const n = nodeCount;\n const x = new Float64Array(n);\n const y = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const a = (i / n) * Math.PI * 2;\n x[i] = Math.cos(a);\n y[i] = Math.sin(a);\n }\n if (n < 2) return { x, y };\n\n const iterations = opts.iterations ?? 300;\n const area = opts.area ?? 1;\n const k = Math.sqrt(area / n); // ideal edge length\n const gravity = opts.gravity ?? 0.05;\n const dispX = new Float64Array(n);\n const dispY = new Float64Array(n);\n let temp = 0.1;\n\n for (let it = 0; it < iterations; it++) {\n dispX.fill(0);\n dispY.fill(0);\n // Repulsion between every pair: f = k^2 / d.\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const dx = x[i]! - x[j]!;\n const dy = y[i]! - y[j]!;\n const d = Math.hypot(dx, dy) || 1e-6;\n const f = (k * k) / d;\n const ux = dx / d, uy = dy / d;\n dispX[i]! += ux * f; dispY[i]! += uy * f;\n dispX[j]! -= ux * f; dispY[j]! -= uy * f;\n }\n }\n // Attraction along edges: f = d^2 / k.\n for (const [a, b] of edges) {\n const dx = x[a]! - x[b]!;\n const dy = y[a]! - y[b]!;\n const d = Math.hypot(dx, dy) || 1e-6;\n const f = (d * d) / k;\n const ux = dx / d, uy = dy / d;\n dispX[a]! -= ux * f; dispY[a]! -= uy * f;\n dispX[b]! += ux * f; dispY[b]! += uy * f;\n }\n // Gravity + move, capped by the current temperature.\n for (let i = 0; i < n; i++) {\n dispX[i]! -= x[i]! * gravity;\n dispY[i]! -= y[i]! * gravity;\n const d = Math.hypot(dispX[i]!, dispY[i]!) || 1e-6;\n const lim = Math.min(d, temp);\n x[i]! += (dispX[i]! / d) * lim;\n y[i]! += (dispY[i]! / d) * lim;\n }\n temp *= 0.99;\n }\n return { x, y };\n}\n","/**\n * Ear-clipping polygon triangulation with hole support.\n *\n * A faithful reimplementation of the well-known ear-clipping algorithm (as\n * popularized by mapbox/earcut, ISC). Input is a flat `[x0,y0,x1,y1,…]`\n * coordinate array with optional hole start-indices; output is a flat list of\n * triangle vertex indices into that array. Pure and unit-tested.\n *\n * For rings above {@link Z_ORDER_THRESHOLD} vertices it switches on the z-order\n * (Morton) curve acceleration: each node gets a 32-bit Morton code, the nodes\n * are merge-sorted into a secondary z-linked list, and the \"is this an ear?\"\n * test only scans candidate points whose Morton code falls in the ear's\n * bounding-box range — turning the inner loop from O(n) into ~O(1) amortized,\n * so the whole triangulation goes from O(n²) to ~O(n log n). Small rings (most\n * vector-tile polygons) skip the hashing entirely to avoid its setup cost.\n */\n\n/** Below this vertex count, plain O(n²) clipping is cheaper than hashing. */\nconst Z_ORDER_THRESHOLD = 80;\n\nclass Node {\n prev: Node = this;\n next: Node = this;\n steiner = false;\n /** Morton (z-order) code; 0 until {@link indexCurve} assigns it. */\n z = 0;\n /** Neighbours in the z-order-sorted list (null outside the hashed path). */\n prevZ: Node | null = null;\n nextZ: Node | null = null;\n constructor(\n readonly i: number,\n readonly x: number,\n readonly y: number,\n ) {}\n}\n\n/**\n * Triangulate a polygon. `holeIndices[k]` is the vertex index (not coordinate\n * index) where hole `k` begins. Returns triangle vertex indices in groups of 3.\n */\nexport function earcut(data: number[], holeIndices?: number[], dim = 2): number[] {\n const hasHoles = holeIndices != null && holeIndices.length > 0;\n const outerLen = hasHoles ? holeIndices![0]! * dim : data.length;\n let outerNode = linkedList(data, 0, outerLen, dim, true);\n const triangles: number[] = [];\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices!, outerNode, dim);\n\n // Big rings: precompute the bbox so z-order codes map into a 15-bit grid.\n let minX = 0;\n let minY = 0;\n let invSize = 0;\n if (data.length > Z_ORDER_THRESHOLD * dim) {\n minX = Infinity;\n minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < outerLen; i += dim) {\n const x = data[i]!;\n const y = data[i + 1]!;\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n const size = Math.max(maxX - minX, maxY - minY);\n invSize = size !== 0 ? 32767 / size : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n return triangles;\n}\n\n/** Build a circular doubly-linked list from a ring; enforce the given winding. */\nfunction linkedList(\n data: number[],\n start: number,\n end: number,\n dim: number,\n clockwise: boolean,\n): Node | null {\n let last: Node | null = null;\n if (clockwise === ringArea(data, start, end, dim) > 0) {\n for (let i = start; i < end; i += dim) last = insertNode(i, data[i]!, data[i + 1]!, last);\n } else {\n for (let i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i]!, data[i + 1]!, last);\n }\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n return last;\n}\n\n/** Remove collinear or duplicate nodes between `start` and `end`. */\nfunction filterPoints(start: Node | null, end?: Node): Node | null {\n if (!start) return start;\n let e = end ?? start;\n let p = start;\n let again: boolean;\n do {\n again = false;\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = e = p.prev;\n if (p === p.next) break;\n again = true;\n } else {\n p = p.next;\n }\n } while (again || p !== e);\n return e;\n}\n\n/** Main loop: clip ears off the linked list, escalating on failure. */\nfunction earcutLinked(\n earStart: Node | null,\n triangles: number[],\n dim: number,\n minX: number,\n minY: number,\n invSize: number,\n pass: number,\n): void {\n if (!earStart) return;\n let ear: Node = earStart;\n // Build the z-order index once, on the first pass over a big ring.\n if (pass === 0 && invSize) indexCurve(ear, minX, minY, invSize);\n let stop: Node = earStart;\n while (ear.prev !== ear.next) {\n const prev: Node = ear.prev;\n const next: Node = ear.next;\n const found = invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear);\n if (found) {\n triangles.push((prev.i / dim) | 0, (ear.i / dim) | 0, (next.i / dim) | 0);\n removeNode(ear);\n ear = next.next;\n stop = next.next;\n continue;\n }\n ear = next;\n if (ear === stop) {\n // No ear found in a full pass — clean up and retry with more effort.\n if (pass === 0) earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n else if (pass === 1) {\n const cured = cureLocalIntersections(filterPoints(ear)!, triangles, dim);\n earcutLinked(cured, triangles, dim, minX, minY, invSize, 2);\n } else if (pass === 2) splitEarcut(ear, triangles, dim, minX, minY, invSize);\n break;\n }\n }\n}\n\nfunction isEar(ear: Node): boolean {\n const a = ear.prev;\n const b = ear;\n const c = ear.next;\n if (area(a, b, c) >= 0) return false; // reflex or collinear — not an ear tip\n let p = ear.next.next;\n while (p !== ear.prev) {\n if (\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0\n ) {\n return false;\n }\n p = p.next;\n }\n return true;\n}\n\n/**\n * The z-order-accelerated ear test: instead of scanning every other vertex,\n * only visit points whose Morton code lies within the ear triangle's\n * bounding-box z-range, walking outward along the z-linked list in both\n * directions from the ear.\n */\nfunction isEarHashed(ear: Node, minX: number, minY: number, invSize: number): boolean {\n const a = ear.prev;\n const b = ear;\n const c = ear.next;\n if (area(a, b, c) >= 0) return false; // reflex or collinear — not an ear tip\n\n const ax = a.x;\n const bx = b.x;\n const cx = c.x;\n const ay = a.y;\n const by = b.y;\n const cy = c.y;\n // Triangle bounding box.\n const x0 = Math.min(ax, bx, cx);\n const y0 = Math.min(ay, by, cy);\n const x1 = Math.max(ax, bx, cx);\n const y1 = Math.max(ay, by, cy);\n // Its z-order range.\n const minZ = zOrder(x0, y0, minX, minY, invSize);\n const maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n let p = ear.prevZ;\n let n = ear.nextZ;\n\n const blocks = (q: Node): boolean =>\n q.x >= x0 &&\n q.x <= x1 &&\n q.y >= y0 &&\n q.y <= y1 &&\n q !== a &&\n q !== c &&\n pointInTriangle(ax, ay, bx, by, cx, cy, q.x, q.y) &&\n area(q.prev, q, q.next) >= 0;\n\n // Walk both directions while both stay inside the z-range.\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (blocks(p)) return false;\n p = p.prevZ;\n if (blocks(n)) return false;\n n = n.nextZ;\n }\n // Exhaust the remaining decreasing-z side.\n while (p && p.z >= minZ) {\n if (blocks(p)) return false;\n p = p.prevZ;\n }\n // Exhaust the remaining increasing-z side.\n while (n && n.z <= maxZ) {\n if (blocks(n)) return false;\n n = n.nextZ;\n }\n return true;\n}\n\n/** Merge holes into the outer ring by cutting bridges, leftmost hole first. */\nfunction eliminateHoles(\n data: number[],\n holeIndices: number[],\n outerNode: Node,\n dim: number,\n): Node {\n const queue: Node[] = [];\n for (let i = 0, len = holeIndices.length; i < len; i++) {\n const start = holeIndices[i]! * dim;\n const end = i < len - 1 ? holeIndices[i + 1]! * dim : data.length;\n const list = linkedList(data, start, end, dim, false);\n if (list) {\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n }\n queue.sort((a, b) => a.x - b.x);\n let node = outerNode;\n for (const hole of queue) node = eliminateHole(hole, node);\n return node;\n}\n\nfunction eliminateHole(hole: Node, outerNode: Node): Node {\n const bridge = findHoleBridge(hole, outerNode);\n if (!bridge) return outerNode;\n const bridgeReverse = splitPolygon(bridge, hole);\n filterPoints(bridgeReverse, bridgeReverse.next);\n return filterPoints(bridge, bridge.next)!;\n}\n\n/** Find a mutually-visible outer-ring vertex to bridge a hole to. */\nfunction findHoleBridge(hole: Node, outerNode: Node): Node | null {\n let p = outerNode;\n const hx = hole.x;\n const hy = hole.y;\n let qx = -Infinity;\n let m: Node | null = null;\n // Cast a ray to the left; find the outer edge it hits closest to the hole.\n do {\n if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n const x = p.x + ((hy - p.y) / (p.next.y - p.y)) * (p.next.x - p.x);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n if (x === hx) return m;\n }\n }\n p = p.next;\n } while (p !== outerNode);\n if (!m) return null;\n\n // Refine: pick the reflex vertex inside the hole/edge triangle with the\n // smallest angle to the hole (guarantees visibility).\n const stop = m;\n const mx = m.x;\n const my = m.y;\n let tanMin = Infinity;\n p = m;\n do {\n if (\n hx >= p.x &&\n p.x >= mx &&\n hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)\n ) {\n const tan = Math.abs(hy - p.y) / (hx - p.x);\n if (\n locallyInside(p, hole) &&\n (tan < tanMin ||\n (tan === tanMin && (p.x > m!.x || (p.x === m!.x && sectorContainsSector(m!, p)))))\n ) {\n m = p;\n tanMin = tan;\n }\n }\n p = p.next;\n } while (p !== stop);\n return m;\n}\n\n/** Clip away pairs of ears that form a self-intersection (repair pass). */\nfunction cureLocalIntersections(start: Node, triangles: number[], dim: number): Node {\n let p = start;\n do {\n const a = p.prev;\n const b = p.next.next;\n if (\n !equals(a, b) &&\n intersects(a, p, p.next, b) &&\n locallyInside(a, b) &&\n locallyInside(b, a)\n ) {\n triangles.push((a.i / dim) | 0, (p.i / dim) | 0, (b.i / dim) | 0);\n removeNode(p);\n removeNode(p.next);\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n return filterPoints(p)!;\n}\n\n/** Split the polygon by the first valid diagonal, then triangulate both halves. */\nfunction splitEarcut(\n start: Node,\n triangles: number[],\n dim: number,\n minX: number,\n minY: number,\n invSize: number,\n): void {\n let a = start;\n do {\n let b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n let c: Node | null = splitPolygon(a, b);\n const a2 = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n earcutLinked(a2, triangles, dim, minX, minY, invSize, 0);\n earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// ---- Geometry predicates -----------------------------------------------------\n\n/** Signed area of triangle (p,q,r) × 2; < 0 for clockwise. */\nfunction area(p: Node, q: Node, r: Node): number {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\nfunction equals(a: Node, b: Node): boolean {\n return a.x === b.x && a.y === b.y;\n}\n\nfunction pointInTriangle(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n cx: number,\n cy: number,\n px: number,\n py: number,\n): boolean {\n return (\n (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0\n );\n}\n\n/** Is the diagonal a→b a valid, interior, non-crossing split? */\nfunction isValidDiagonal(a: Node, b: Node): boolean {\n return (\n a.next.i !== b.i &&\n a.prev.i !== b.i &&\n !intersectsPolygon(a, b) &&\n ((locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) &&\n (area(a.prev, a, b.prev) !== 0 || area(a, b.prev, b) !== 0)) ||\n (equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0))\n );\n}\n\nfunction onSegment(p: Node, q: Node, r: Node): boolean {\n return (\n q.x <= Math.max(p.x, r.x) &&\n q.x >= Math.min(p.x, r.x) &&\n q.y <= Math.max(p.y, r.y) &&\n q.y >= Math.min(p.y, r.y)\n );\n}\n\nfunction sign(n: number): number {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}\n\n/** Do segments p1p2 and q1q2 properly (or collinearly) intersect? */\nfunction intersects(p1: Node, q1: Node, p2: Node, q2: Node): boolean {\n const o1 = sign(area(p1, q1, p2));\n const o2 = sign(area(p1, q1, q2));\n const o3 = sign(area(p2, q2, p1));\n const o4 = sign(area(p2, q2, q1));\n if (o1 !== o2 && o3 !== o4) return true;\n if (o1 === 0 && onSegment(p1, p2, q1)) return true;\n if (o2 === 0 && onSegment(p1, q2, q1)) return true;\n if (o3 === 0 && onSegment(p2, p1, q2)) return true;\n if (o4 === 0 && onSegment(p2, q1, q2)) return true;\n return false;\n}\n\n/** Does diagonal a→b cross any polygon edge? */\nfunction intersectsPolygon(a: Node, b: Node): boolean {\n let p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) {\n return true;\n }\n p = p.next;\n } while (p !== a);\n return false;\n}\n\n/** Is a→b inside the polygon corner at a? */\nfunction locallyInside(a: Node, b: Node): boolean {\n return area(a.prev, a, a.next) < 0\n ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0\n : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n/** Does the midpoint of a→b lie inside the polygon? */\nfunction middleInside(a: Node, b: Node): boolean {\n let p = a;\n let inside = false;\n const px = (a.x + b.x) / 2;\n const py = (a.y + b.y) / 2;\n do {\n if (\n p.y > py !== p.next.y > py &&\n p.next.y !== p.y &&\n px < ((p.next.x - p.x) * (py - p.y)) / (p.next.y - p.y) + p.x\n ) {\n inside = !inside;\n }\n p = p.next;\n } while (p !== a);\n return inside;\n}\n\nfunction sectorContainsSector(m: Node, p: Node): boolean {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// ---- Linked-list plumbing ----------------------------------------------------\n\nfunction splitPolygon(a: Node, b: Node): Node {\n const a2 = new Node(a.i, a.x, a.y);\n const b2 = new Node(b.i, b.x, b.y);\n const an = a.next;\n const bp = b.prev;\n a.next = b;\n b.prev = a;\n a2.next = an;\n an.prev = a2;\n b2.next = a2;\n a2.prev = b2;\n bp.next = b2;\n b2.prev = bp;\n return b2;\n}\n\nfunction insertNode(i: number, x: number, y: number, last: Node | null): Node {\n const p = new Node(i, x, y);\n if (!last) {\n p.prev = p;\n p.next = p;\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p: Node): void {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n // Keep the z-order list consistent when hashing is in effect.\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction getLeftmost(start: Node): Node {\n let p = start;\n let leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n return leftmost;\n}\n\n/** Signed area of a raw coordinate range (used to detect winding). */\nfunction ringArea(data: number[], start: number, end: number, dim: number): number {\n let sum = 0;\n for (let i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j]! - data[i]!) * (data[i + 1]! + data[j + 1]!);\n j = i;\n }\n return sum;\n}\n\n// ---- Z-order (Morton curve) acceleration -------------------------------------\n\n/** Assign a Morton code to every node and build the sorted z-linked list. */\nfunction indexCurve(start: Node, minX: number, minY: number, invSize: number): void {\n let p = start;\n do {\n if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n // Break the ring into a linear list, then sort it by z.\n p.prevZ!.nextZ = null;\n p.prevZ = null;\n sortLinked(p);\n}\n\n/**\n * Simon Tatham's in-place merge sort over the `nextZ` list, ordering nodes by\n * their Morton code. Stable, O(n log n), and allocation-free.\n */\nfunction sortLinked(list: Node | null): void {\n let inSize = 1;\n let numMerges: number;\n do {\n let p: Node | null = list;\n list = null;\n let tail: Node | null = null;\n numMerges = 0;\n while (p) {\n numMerges++;\n let q: Node | null = p;\n let pSize = 0;\n for (let i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n let qSize = inSize;\n while (pSize > 0 || (qSize > 0 && q)) {\n let e: Node;\n if (pSize !== 0 && (qSize === 0 || !q || p!.z <= q.z)) {\n e = p!;\n p = p!.nextZ;\n pSize--;\n } else {\n e = q!;\n q = q!.nextZ;\n qSize--;\n }\n if (tail) tail.nextZ = e;\n else list = e;\n e.prevZ = tail;\n tail = e;\n }\n p = q;\n }\n tail!.nextZ = null;\n inSize *= 2;\n } while (numMerges > 1);\n}\n\n/**\n * Interleave the bits of the 15-bit grid coordinates into a 32-bit Morton code,\n * so numerically close codes correspond to spatially close points.\n */\nfunction zOrder(x: number, y: number, minX: number, minY: number, invSize: number): number {\n let ix = ((x - minX) * invSize) | 0;\n let iy = ((y - minY) * invSize) | 0;\n\n ix = (ix | (ix << 8)) & 0x00ff00ff;\n ix = (ix | (ix << 4)) & 0x0f0f0f0f;\n ix = (ix | (ix << 2)) & 0x33333333;\n ix = (ix | (ix << 1)) & 0x55555555;\n\n iy = (iy | (iy << 8)) & 0x00ff00ff;\n iy = (iy | (iy << 4)) & 0x0f0f0f0f;\n iy = (iy | (iy << 2)) & 0x33333333;\n iy = (iy | (iy << 1)) & 0x55555555;\n\n return ix | (iy << 1);\n}\n","import { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { earcut } from \"../geo/earcut.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\n/** A solid-fill program driven by a per-vertex color triangle soup (shared with pie). */\nexport const FILL_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos; // offset data-space position\nlayout(location = 1) in vec4 aColor; // per-vertex color (premultiplied on output)\n${TRANSFORM_GLSL}\nout vec4 vColor;\nvoid main() {\n vColor = aColor;\n gl_Position = vec4(dataToClip(aPos), 0.0, 1.0);\n}`;\n\nexport const FILL_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 programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nexport function getFillProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) {\n p = createProgram(gl, FILL_VERT, FILL_FRAG);\n programCache.set(gl, p);\n }\n return p;\n}\n\n/** One filled polygon: a ring of `x`/`y`, with optional holes. */\nexport interface Patch {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n /** Vertex indices where each hole ring starts (mapbox-earcut convention). */\n holes?: number[];\n /** Explicit fill color (overrides the layer default / colormap). */\n color?: string | Color;\n /** Value used to color this patch via the layer `colormap` (choropleth). */\n value?: number;\n}\n\nexport interface PatchesOptions {\n patches: Patch[];\n /** Default fill for patches without their own `color`/`value`. */\n color?: string | Color;\n /** Color patches by `value` through this colormap (choropleth). */\n colormap?: ColormapName;\n /** Value range mapped to [0,1] for the colormap. Defaults to the data min/max. */\n domain?: Range;\n /** Fill opacity, 0..1. Default 1. */\n opacity?: number;\n name?: string;\n yAxis?: string;\n}\n\nlet counter = 0;\n\n/**\n * Filled polygons (Bokeh `patches`). Each ring is triangulated once on the CPU\n * with ear-clipping (holes supported), then rendered as a static per-vertex-color\n * triangle soup — only the transform uniforms change per frame.\n */\nexport class PatchesLayer 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 vertexCount = 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: PatchesOptions) {\n this.id = `patches-${counter++}`;\n this.gl = gl;\n this.program = getFillProgram(gl);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n const defColor = opts.color ?? \"#3b82f6\";\n const defRgba = Array.isArray(defColor) ? (defColor as Color) : parseColor(defColor as string);\n this.colorCss = typeof defColor === \"string\" ? defColor : \"#3b82f6\";\n const opacity = opts.opacity ?? 1;\n\n // Colormap domain (choropleth), if coloring by value.\n const cmap = opts.colormap ? colormap(opts.colormap) : null;\n let lo = opts.domain?.[0] ?? Infinity;\n let hi = opts.domain?.[1] ?? -Infinity;\n if (cmap && !opts.domain) {\n for (const patch of opts.patches) {\n const v = patch.value;\n if (v == null) continue;\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n const span = hi - lo || 1;\n\n // First vertex of the first non-empty patch anchors the float32 reference.\n for (const patch of opts.patches) {\n if (patch.x.length > 0) {\n this.xRef = patch.x[0]!;\n this.yRef = patch.y[0]!;\n break;\n }\n }\n\n const positions: number[] = [];\n const colors: number[] = [];\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n\n for (const patch of opts.patches) {\n const n = Math.min(patch.x.length, patch.y.length);\n if (n < 3) continue;\n // Resolve this patch's fill color.\n let rgba: Color;\n if (patch.color != null) {\n rgba = Array.isArray(patch.color) ? (patch.color as Color) : parseColor(patch.color as string);\n } else if (cmap && patch.value != null) {\n const [r, g, b] = cmap((patch.value - lo) / span);\n rgba = [r, g, b, 1];\n } else {\n rgba = defRgba;\n }\n const a = rgba[3] * opacity;\n\n // Flat [x0,y0,x1,y1,…] for earcut (raw coords; offset applied on write).\n const flat = new Array<number>(n * 2);\n for (let i = 0; i < n; i++) {\n flat[i * 2] = patch.x[i]!;\n flat[i * 2 + 1] = patch.y[i]!;\n }\n const tris = earcut(flat, patch.holes && patch.holes.length ? patch.holes : undefined, 2);\n for (const idx of tris) {\n const px = flat[idx * 2]!;\n const py = flat[idx * 2 + 1]!;\n positions.push(px - this.xRef, py - this.yRef);\n colors.push(rgba[0], rgba[1], rgba[2], a);\n }\n for (let i = 0; i < n; i++) {\n const px = patch.x[i]!, py = patch.y[i]!;\n if (px < minX) minX = px;\n if (px > maxX) maxX = px;\n if (py < minY) minY = py;\n if (py > maxY) maxY = py;\n }\n }\n\n this.vertexCount = positions.length / 2;\n this.xBounds = minX <= maxX ? [minX, maxX] : [0, 0];\n this.yBounds = minY <= maxY ? [minY, maxY] : [0, 0];\n\n const vao = gl.createVertexArray()!;\n this.vao = vao;\n gl.bindVertexArray(vao);\n const posBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, posBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n const colBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n this.buffers = [posBuf, colBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS]);\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 === 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.TRIANGLES, 0, this.vertexCount);\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 { colormap, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor } from \"../gl/context.js\";\nimport { uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\nimport { getFillProgram } from \"./patches.js\";\n\nconst DEFAULT_COLORS = [\n \"#3b82f6\", \"#f472b6\", \"#22d3ee\", \"#a3e635\", \"#fbbf24\",\n \"#a78bfa\", \"#34d399\", \"#fb7185\", \"#60a5fa\", \"#f59e0b\",\n];\n\nexport interface PieOptions {\n /** Slice magnitudes (need not sum to 1 — they are normalized). */\n values: ArrayLike<number>;\n /** Explicit per-slice colors; falls back to `colormap`, then a default palette. */\n colors?: (string | Color)[];\n /** Color slices by index through this colormap instead of the palette. */\n colormap?: ColormapName;\n /** Center in data space. Default `[0, 0]`. */\n center?: [number, number];\n /** Outer radius in data units. Default `1`. */\n radius?: number;\n /** Inner radius (> 0 makes a donut). Default `0`. */\n innerRadius?: number;\n /** Angle of the first slice edge, radians. Default `Math.PI / 2` (12 o'clock). */\n startAngle?: number;\n name?: string;\n yAxis?: string;\n}\n\nlet counter = 0;\n\n/**\n * A pie / donut chart drawn as a per-vertex-color triangle soup (wedges as fans,\n * or quad strips when a donut). Reuses the shared solid-fill program. Slices sweep\n * clockwise from `startAngle`. Set the plot's `equalAspect` so it stays circular.\n */\nexport class PieLayer 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 vertexCount = 0;\n private xRef: number;\n private yRef: number;\n private xBounds: Range;\n private yBounds: Range;\n\n constructor(gl: WebGL2RenderingContext, opts: PieOptions) {\n this.id = `pie-${counter++}`;\n this.gl = gl;\n this.program = getFillProgram(gl);\n this.name = opts.name ?? this.id;\n this.yAxis = opts.yAxis ?? \"y\";\n\n const [cx, cy] = opts.center ?? [0, 0];\n const R = opts.radius ?? 1;\n const rIn = opts.innerRadius ?? 0;\n const start = opts.startAngle ?? Math.PI / 2;\n this.xRef = cx;\n this.yRef = cy;\n this.xBounds = [cx - R, cx + R];\n this.yBounds = [cy - R, cy + R];\n this.colorCss = \"#3b82f6\";\n\n const n = opts.values.length;\n let total = 0;\n for (let i = 0; i < n; i++) total += Math.max(0, opts.values[i]!);\n if (total <= 0) total = 1;\n\n const cmap = opts.colormap ? colormap(opts.colormap) : null;\n const colorAt = (i: number): Color => {\n if (opts.colors?.[i] != null) {\n const c = opts.colors[i]!;\n return Array.isArray(c) ? (c as Color) : parseColor(c as string);\n }\n if (cmap) {\n const [r, g, b] = cmap(n > 1 ? i / (n - 1) : 0);\n return [r, g, b, 1];\n }\n return parseColor(DEFAULT_COLORS[i % DEFAULT_COLORS.length]!);\n };\n\n // Positions are offset by the center; the center is xRef/yRef so it maps to 0.\n const positions: number[] = [];\n const colors: number[] = [];\n const push = (x: number, y: number, c: Color): void => {\n positions.push(x - cx, y - cy);\n colors.push(c[0], c[1], c[2], c[3]);\n };\n\n let a0 = start;\n for (let i = 0; i < n; i++) {\n const frac = Math.max(0, opts.values[i]!) / total;\n const span = frac * Math.PI * 2;\n if (span <= 0) continue;\n const a1 = a0 - span; // clockwise\n const c = colorAt(i);\n const segs = Math.max(2, Math.ceil(span / (Math.PI / 64)));\n for (let s = 0; s < segs; s++) {\n const t0 = a0 + ((a1 - a0) * s) / segs;\n const t1 = a0 + ((a1 - a0) * (s + 1)) / segs;\n const ox0 = cx + R * Math.cos(t0), oy0 = cy + R * Math.sin(t0);\n const ox1 = cx + R * Math.cos(t1), oy1 = cy + R * Math.sin(t1);\n if (rIn <= 0) {\n push(cx, cy, c);\n push(ox0, oy0, c);\n push(ox1, oy1, c);\n } else {\n const ix0 = cx + rIn * Math.cos(t0), iy0 = cy + rIn * Math.sin(t0);\n const ix1 = cx + rIn * Math.cos(t1), iy1 = cy + rIn * Math.sin(t1);\n push(ix0, iy0, c);\n push(ox0, oy0, c);\n push(ox1, oy1, c);\n push(ix0, iy0, c);\n push(ox1, oy1, c);\n push(ix1, iy1, c);\n }\n }\n a0 = a1;\n }\n\n this.vertexCount = positions.length / 2;\n const vao = gl.createVertexArray()!;\n this.vao = vao;\n gl.bindVertexArray(vao);\n const posBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, posBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n const colBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);\n gl.bindVertexArray(null);\n this.buffers = [posBuf, colBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS]);\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 === 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.TRIANGLES, 0, this.vertexCount);\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 { 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 { colormapLUT, 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\n/** Marker glyph shape for a scatter series. */\nexport type MarkerShape = \"circle\" | \"square\" | \"triangle\" | \"diamond\" | \"cross\" | \"plus\";\n\nconst MARKERS: Record<MarkerShape, number> = {\n circle: 0,\n square: 1,\n triangle: 2,\n diamond: 3,\n cross: 4,\n plus: 5,\n};\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 /** Marker glyph. Default `\"circle\"`. */\n marker?: MarkerShape;\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\n// Marker glyphs via analytic signed-distance fields in the unit quad [-1,1]^2,\n// anti-aliased with screen-space derivatives (fwidth). Circle keeps its own soft\n// edge so existing charts are pixel-unchanged; other shapes share the SDF path.\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vLocal;\nin vec4 vColor;\nuniform vec4 uColor;\nuniform float uUseVertexColor;\nuniform int uMarker;\nout vec4 outColor;\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n// iq's equilateral-triangle SDF (apex toward +y).\nfloat sdTri(vec2 p) {\n const float k = sqrt(3.0);\n p.x = abs(p.x) - 1.0;\n p.y = p.y + 1.0 / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n p.x -= clamp(p.x, -2.0, 0.0);\n return -length(p) * sign(p.y);\n}\n\nvoid main() {\n vec2 p = vLocal;\n if (uMarker == 0) {\n // Circle — original soft-edged path, unchanged.\n float r = length(p);\n if (r > 1.0) discard;\n float alpha = smoothstep(1.0, 1.0 - 0.15, r);\n vec4 c0 = uUseVertexColor > 0.5 ? vColor : uColor;\n outColor = vec4(c0.rgb * c0.a * alpha, c0.a * alpha);\n return;\n }\n float d;\n if (uMarker == 1) d = sdBox(p, vec2(0.88)); // square\n else if (uMarker == 2) d = sdTri(p); // triangle (point up)\n else if (uMarker == 3) d = abs(p.x) + abs(p.y) - 1.0; // diamond\n else if (uMarker == 4) { // cross (×)\n vec2 q = vec2(p.x + p.y, p.x - p.y) * 0.70710678;\n d = min(sdBox(q, vec2(1.0, 0.30)), sdBox(q, vec2(0.30, 1.0)));\n } else { // plus (+)\n d = min(sdBox(p, vec2(1.0, 0.30)), sdBox(p, vec2(0.30, 1.0)));\n }\n float aa = fwidth(d) + 1e-4;\n float alpha = 1.0 - smoothstep(-aa, aa, d);\n if (alpha <= 0.0) discard;\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 marker: 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 this.marker = MARKERS[opts.marker ?? \"circle\"];\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 lut = colormapLUT(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 let t = (vals[i]! - lo) / span;\n t = t <= 0 ? 0 : t >= 1 ? 1 : t;\n const j = ((t * 255) | 0) * 3;\n colors[i * 4] = lut[j]!; colors[i * 4 + 1] = lut[j + 1]!; colors[i * 4 + 2] = lut[j + 2]!; 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\", \"uMarker\",\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.uniform1i(this.uniforms.uMarker!, this.marker);\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 { AxisConfig, 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\n/** Concrete axis styling, resolved from an {@link AxisConfig} against a {@link Theme}. */\nexport interface ResolvedAxisStyle {\n showAxisLine: boolean;\n axisLineColor: string;\n axisLineWidth: number;\n showTicks: boolean;\n tickColor: string;\n tickLength: number;\n tickMinorLength: number;\n tickWidth: number;\n labelColor: string;\n labelFont: string;\n labelRotation: number;\n labelStandoff: number;\n titleColor: string;\n titleFont: string;\n showGrid: boolean;\n gridColor: string;\n gridMinorColor: string;\n gridWidth: number;\n gridDash: number[];\n}\n\n/**\n * Fold an {@link AxisConfig}'s optional style fields onto the theme defaults.\n * Colored fields fall back to `colorOverride` (a secondary y-axis's `color`) before\n * the theme, so an unstyled colored axis still tints its line/ticks/labels/title.\n * With an empty config this reproduces the pre-styling look exactly.\n */\nexport function resolveAxisStyle(\n cfg: AxisConfig,\n theme: Theme,\n colorOverride?: string,\n): ResolvedAxisStyle {\n const line = colorOverride ?? theme.axis;\n const text = colorOverride ?? theme.text;\n return {\n showAxisLine: cfg.showAxisLine ?? true,\n axisLineColor: cfg.axisLineColor ?? line,\n axisLineWidth: cfg.axisLineWidth ?? 1,\n showTicks: cfg.showTicks ?? true,\n tickColor: cfg.tickColor ?? line,\n tickLength: cfg.tickLength ?? 5,\n tickMinorLength: 3,\n tickWidth: cfg.tickWidth ?? 1,\n labelColor: cfg.labelColor ?? text,\n labelFont: cfg.labelFont ?? theme.font,\n labelRotation: cfg.labelRotation ?? 0,\n labelStandoff: cfg.labelStandoff ?? 3,\n titleColor: cfg.titleColor ?? text,\n titleFont: cfg.titleFont ?? theme.font,\n showGrid: cfg.showGrid ?? true,\n gridColor: cfg.gridColor ?? theme.grid,\n gridMinorColor: cfg.gridMinorColor ?? theme.gridMinor,\n gridWidth: cfg.gridWidth ?? 1,\n gridDash: cfg.gridDash ?? [],\n };\n}\n\nexport interface PlotTitleOptions {\n text: string;\n /** CSS `font` shorthand. Default `\"600 15px system-ui, ...\"`. */\n font?: string;\n color?: string;\n align?: \"left\" | \"center\" | \"right\";\n}\n\n/** Draw the plot title in the reserved strip above the plot region. */\nexport function drawTitle(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n title: PlotTitleOptions,\n isDark: boolean,\n): void {\n ctx.save();\n ctx.font = title.font ?? \"600 15px system-ui, -apple-system, sans-serif\";\n ctx.fillStyle = title.color ?? (isDark ? \"#e2e8f0\" : \"#1e293b\");\n ctx.textBaseline = \"middle\";\n const align = title.align ?? \"center\";\n const y = region.top / 2;\n let x: number;\n if (align === \"left\") {\n ctx.textAlign = \"left\";\n x = region.left;\n } else if (align === \"right\") {\n ctx.textAlign = \"right\";\n x = region.left + region.width;\n } else {\n ctx.textAlign = \"center\";\n x = region.left + region.width / 2;\n }\n ctx.fillText(title.text, x, y);\n ctx.restore();\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, each axis styled independently. */\nexport function drawGrid(\n ctx: CanvasRenderingContext2D,\n region: PlotRegion,\n scaleX: Scale,\n scaleY: Scale,\n ticksX: Tick[],\n ticksY: Tick[],\n styleX: ResolvedAxisStyle,\n styleY: ResolvedAxisStyle,\n): void {\n ctx.save();\n if (styleX.showGrid) {\n ctx.lineWidth = styleX.gridWidth;\n ctx.setLineDash(styleX.gridDash);\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 ? styleX.gridMinorColor : styleX.gridColor;\n ctx.beginPath();\n ctx.moveTo(x, region.top);\n ctx.lineTo(x, region.top + region.height);\n ctx.stroke();\n }\n }\n if (styleY.showGrid) {\n ctx.lineWidth = styleY.gridWidth;\n ctx.setLineDash(styleY.gridDash);\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 ? styleY.gridMinorColor : styleY.gridColor;\n ctx.beginPath();\n ctx.moveTo(region.left, y);\n ctx.lineTo(region.left + region.width, y);\n ctx.stroke();\n }\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 style: ResolvedAxisStyle,\n title?: string,\n): void {\n ctx.save();\n ctx.lineWidth = style.axisLineWidth;\n const bottom = region.top + region.height;\n\n if (style.showAxisLine) {\n ctx.strokeStyle = style.axisLineColor;\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\n ctx.fillStyle = style.labelColor;\n ctx.font = style.labelFont;\n const rot = (style.labelRotation * Math.PI) / 180;\n for (const t of ticksX) {\n const x = Math.round(pxX(region, scaleX.norm(t.value))) + 0.5;\n const len = t.minor ? style.tickMinorLength : style.tickLength;\n if (style.showTicks) {\n ctx.strokeStyle = style.tickColor;\n ctx.lineWidth = style.tickWidth;\n ctx.beginPath();\n ctx.moveTo(x, bottom);\n ctx.lineTo(x, bottom + len);\n ctx.stroke();\n }\n if (!t.label) continue;\n const ly = bottom + (style.showTicks ? len : 0) + style.labelStandoff;\n if (rot !== 0) {\n // Rotate labels about the tick; right-align so they trail down-left.\n ctx.save();\n ctx.translate(x, ly);\n ctx.rotate(rot);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(t.label, 0, 0);\n ctx.restore();\n } else {\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.fillText(t.label, x, ly);\n }\n }\n\n if (title) {\n ctx.fillStyle = style.titleColor;\n ctx.font = style.titleFont;\n ctx.textAlign = \"center\";\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 /** 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 style: ResolvedAxisStyle,\n opts: YAxisDraw,\n): void {\n ctx.save();\n ctx.font = style.labelFont;\n ctx.lineWidth = style.axisLineWidth;\n\n const ax = Math.round(opts.x) + 0.5;\n const dir = opts.side === \"left\" ? -1 : 1;\n\n if (style.showAxisLine) {\n ctx.strokeStyle = style.axisLineColor;\n ctx.beginPath();\n ctx.moveTo(ax, region.top);\n ctx.lineTo(ax, region.top + region.height);\n ctx.stroke();\n }\n\n ctx.fillStyle = style.labelColor;\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 ? style.tickMinorLength : style.tickLength;\n if (style.showTicks) {\n ctx.strokeStyle = style.tickColor;\n ctx.lineWidth = style.tickWidth;\n ctx.beginPath();\n ctx.moveTo(ax, y);\n ctx.lineTo(ax + dir * len, y);\n ctx.stroke();\n }\n if (t.label) {\n ctx.fillText(t.label, ax + dir * ((style.showTicks ? len : 0) + style.labelStandoff + 1), y);\n }\n }\n\n if (opts.title) {\n ctx.save();\n ctx.fillStyle = style.titleColor;\n ctx.font = style.titleFont;\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\n/**\n * A categorical (factor) axis. Internally it is **linear over a band domain**\n * `[-0.5, n-0.5]`, so factor `i` sits at the band centre and `norm(i)` equals the\n * ordinary linear projection — the GPU transform needs no special handling, and a\n * layer plotting at integer indices lands on band centres automatically.\n * \"Categorical-ness\" lives only in the ticks/labels (one per factor).\n */\nexport class CategoricalScale implements Scale {\n readonly type = \"categorical\";\n readonly log = false;\n factors: string[];\n domain: Range;\n constructor(factors: string[] = []) {\n this.factors = factors;\n const n = factors.length;\n this.domain = n > 0 ? [-0.5, n - 0.5] : [-0.5, 0.5];\n }\n norm(value: number): number {\n const [a, b] = this.domain;\n return b === a ? 0 : (value - a) / (b - a);\n }\n // Continuous linear inverse (satisfies the Scale contract used by pan/box math).\n // The nearest factor index is `Math.round(scale.invert(t))`.\n invert(t: number): number {\n const [a, b] = this.domain;\n return a + t * (b - a);\n }\n ticks(): Tick[] {\n return this.factors.map((f, i) => ({ value: i, label: f, grid: false }));\n }\n formatTick(value: number): string {\n return this.factors[Math.round(value)] ?? \"\";\n }\n}\n\nexport type ScaleType = \"linear\" | \"log\" | \"time\" | \"categorical\";\n\nexport function makeScale(type: ScaleType, domain?: Range, factors?: string[]): 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 case \"categorical\":\n return new CategoricalScale(factors ?? []);\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 { GraphLayer, type GraphOptions } from \"./layers/graph.js\";\nimport { HeatmapLayer, type HeatmapOptions } from \"./layers/heatmap.js\";\nimport { HexbinLayer, type HexbinOptions } from \"./layers/hexbin.js\";\nimport { ImageLayer, type ImageOptions } from \"./layers/image.js\";\nimport type { Layer } from \"./layers/layer.js\";\nimport { LineLayer, type LineOptions } from \"./layers/line.js\";\nimport { forceLayout } from \"./graph/force.js\";\nimport { PatchesLayer, type PatchesOptions } from \"./layers/patches.js\";\nimport { PieLayer, type PieOptions } from \"./layers/pie.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 drawTitle,\n drawXAxis,\n drawYAxis,\n lightTheme,\n plotRegion,\n pxX,\n pxY,\n resolveAxisStyle,\n type Layout,\n type PlotTitleOptions,\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 /** Factor labels for a `\"categorical\"` axis (fixes the domain to the bands). */\n factors?: string[];\n}\n\n/** Legend placement + styling. `legend: true` uses all defaults. */\nexport interface LegendOptions {\n /** Corner within the plot region. Default `\"top-right\"`. */\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Stack entries vertically (default) or in a row. */\n orientation?: \"vertical\" | \"horizontal\";\n background?: string;\n border?: string;\n textColor?: string;\n font?: string;\n}\n\nexport interface YAxisOptions extends AxisConfig {\n type?: ScaleType;\n domain?: Range;\n /** Factor labels for a `\"categorical\"` axis. */\n factors?: string[];\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 series in a grouped/stacked bar chart. */\nexport interface BarSeries {\n /** Value per category (parallel to the shared `x` positions). */\n y: ArrayLike<number>;\n color?: string;\n name?: string;\n}\n\n/** Options for {@link Plot.addGroupedBars} — one cluster of bars per category. */\nexport interface GroupedBarOptions {\n /** Category positions (e.g. `0..n-1` for a categorical axis). */\n x: ArrayLike<number>;\n series: BarSeries[];\n /** Total width of one group (all its bars) in data units. Default 0.8. */\n groupWidth?: number;\n /** Fractional gap between bars within a group, 0..1. Default 0.1. */\n gap?: number;\n /** `\"v\"` vertical (default) or `\"h\"` horizontal bars. */\n orientation?: \"v\" | \"h\";\n yAxis?: string;\n}\n\n/** Options for {@link Plot.addStackedBars} — series stacked on top of each other. */\nexport interface StackedBarOptions {\n /** Category positions (e.g. `0..n-1` for a categorical axis). */\n x: ArrayLike<number>;\n series: BarSeries[];\n /** Bar width in data units. Defaults to 80% of the median spacing. */\n width?: number;\n /** `\"v\"` vertical (default) or `\"h\"` horizontal bars. */\n orientation?: \"v\" | \"h\";\n yAxis?: string;\n}\n\n/** One series in a stacked area chart. */\nexport interface AreaSeries {\n y: ArrayLike<number>;\n color?: string;\n name?: string;\n}\n\n/** Options for {@link Plot.addStackedArea}. */\nexport interface StackedAreaOptions {\n x: ArrayLike<number>;\n series: AreaSeries[];\n yAxis?: string;\n}\n\n/** Options for {@link Plot.addGraph}. Positions are optional — omit them (give `nodes`) to auto-lay-out. */\nexport interface GraphInput extends Omit<GraphOptions, \"x\" | \"y\"> {\n x?: ArrayLike<number>;\n y?: ArrayLike<number>;\n /** Node count when `x`/`y` are omitted (else inferred from the max edge index). */\n nodes?: number;\n}\n\n/**\n * A Canvas2D overlay marker drawn above the data, projected through the scales:\n * a full-width/height guide line (`span`), a shaded range (`band`), a rectangle\n * (`box`), or text (`label`). `yAxis` targets a secondary axis where relevant.\n */\nexport type Annotation =\n | { type: \"span\"; dim: Dim; value: number; color?: string; width?: number; dash?: number[]; yAxis?: string }\n | { type: \"band\"; dim: Dim; from: number; to: number; color?: string; yAxis?: string }\n | { type: \"box\"; x: Range; y: Range; color?: string; border?: string; yAxis?: string }\n | { type: \"label\"; x: number; y: number; text: string; color?: string; font?: string; align?: \"left\" | \"center\" | \"right\"; yAxis?: string };\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 /** Fill color for the plot region (inside the margins). Default transparent. */\n background?: string;\n /** Fill color for the whole canvas incl. margins. Default transparent. */\n border?: string;\n /** Plot title, drawn in a reserved strip above the plot. */\n title?: string | PlotTitleOptions;\n /** Show a legend of named series. `true` uses defaults; pass an object to place/style it. */\n legend?: boolean | LegendOptions;\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/** Extra top margin reserved for the plot title when one is set. */\nconst TITLE_RESERVE = 28;\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 private annotations: Annotation[] = [];\n private bgFill?: string;\n private borderFill?: string;\n private title: PlotTitleOptions | null;\n private legend: LegendOptions | null;\n private legendDiv: 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 // A categorical axis is fixed to its factor bands: never autoscale, and `home()`\n // restores that band domain.\n const xCat = sx.type === \"categorical\";\n this.scaleX = makeScale(sx.type ?? \"linear\", sx.domain ?? [0, 1], sx.factors);\n this.autoX = !xCat && sx.domain == null;\n this.initialX = xCat ? this.scaleX.domain : (sx.domain ?? null);\n this.axisX = new Axis(options.axes?.x);\n\n // Primary y axis.\n const yCat = sy.type === \"categorical\";\n const yScale = makeScale(sy.type ?? \"linear\", sy.domain ?? [0, 1], sy.factors);\n this.yAxes.set(\"y\", {\n id: \"y\",\n scale: yScale,\n axis: new Axis(options.axes?.y),\n side: \"left\",\n auto: !yCat && sy.domain == null,\n initial: yCat ? yScale.domain : (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.bgFill = options.background;\n this.borderFill = options.border;\n this.title =\n typeof options.title === \"string\" ? { text: options.title } : (options.title ?? null);\n this.legend = options.legend === true ? {} : (options.legend || null);\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 // Legend (a DOM overlay like the tooltip; positioned inside the plot region).\n this.legendDiv = document.createElement(\"div\");\n Object.assign(this.legendDiv.style, {\n position: \"absolute\",\n display: \"none\",\n zIndex: \"5\",\n pointerEvents: \"none\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n font: \"12px system-ui, -apple-system, sans-serif\",\n lineHeight: \"1.5\",\n background: this.isDark ? \"rgba(15,23,42,0.85)\" : \"rgba(255,255,255,0.9)\",\n color: this.isDark ? \"#e2e8f0\" : \"#1e293b\",\n border: `1px solid ${this.isDark ? \"rgba(148,163,184,0.25)\" : \"rgba(100,116,139,0.2)\"}`,\n } as CSSStyleDeclaration);\n container.appendChild(this.legendDiv);\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 + (this.title ? TITLE_RESERVE : 0),\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 /**\n * Grouped (clustered) bars: one {@link BarLayer} per series, each shifted within\n * its category group so the bars sit side by side. Returns the layers in order.\n */\n addGroupedBars(opts: GroupedBarOptions): BarLayer[] {\n const m = opts.series.length;\n if (m === 0) return [];\n const groupWidth = opts.groupWidth ?? 0.8;\n const slot = groupWidth / m;\n const barWidth = slot * (1 - (opts.gap ?? 0.1));\n const layers: BarLayer[] = [];\n for (let s = 0; s < m; s++) {\n const ser = opts.series[s]!;\n // Center the cluster on each category: offsets are symmetric about 0.\n const off = (s - (m - 1) / 2) * slot;\n layers.push(\n new BarLayer(this.gl, {\n x: opts.x,\n y: ser.y,\n width: barWidth,\n offset: off,\n color: ser.color,\n name: ser.name,\n orientation: opts.orientation,\n yAxis: opts.yAxis,\n }),\n );\n }\n for (const l of layers) this.register(l);\n return layers;\n }\n\n /**\n * Stacked bars: each series is drawn from the running cumulative total of the\n * ones before it, so they stack. Returns the layers bottom-to-top.\n */\n addStackedBars(opts: StackedBarOptions): BarLayer[] {\n const n = opts.x.length;\n const cum = new Float64Array(n); // running baseline per category\n const layers: BarLayer[] = [];\n for (const ser of opts.series) {\n const base = Float64Array.from(cum);\n const top = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n top[i] = cum[i]! + (ser.y[i] ?? 0);\n cum[i] = top[i]!;\n }\n layers.push(\n new BarLayer(this.gl, {\n x: opts.x,\n y: top,\n base,\n width: opts.width,\n color: ser.color,\n name: ser.name,\n orientation: opts.orientation,\n yAxis: opts.yAxis,\n }),\n );\n }\n for (const l of layers) this.register(l);\n return layers;\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 /** Filled polygons (choropleth-capable). Rings are triangulated with earcut. */\n addPatches(opts: PatchesOptions): PatchesLayer {\n return this.register(new PatchesLayer(this.gl, opts));\n }\n\n /** A pie / donut chart. Set `equalAspect: true` on the plot so it stays circular. */\n addPie(opts: PieOptions): PieLayer {\n return this.register(new PieLayer(this.gl, opts));\n }\n\n /** An RGBA image / URL drawn over a data-space extent. URLs redraw on load. */\n addImage(opts: ImageOptions): ImageLayer {\n return this.register(\n new ImageLayer(this.gl, {\n ...opts,\n onLoad: () => {\n this.requestRender();\n opts.onLoad?.();\n },\n }),\n );\n }\n\n /**\n * A node-link graph. Provide node `x`/`y`, or omit them (with `nodes`, or let the\n * count be inferred from the edges) to auto-place with a force-directed layout.\n */\n addGraph(opts: GraphInput): GraphLayer {\n let { x, y } = opts;\n if (!x || !y) {\n const n = opts.nodes ?? opts.edges.reduce((m, [a, b]) => Math.max(m, a, b), -1) + 1;\n const layout = forceLayout(n, opts.edges);\n x = layout.x;\n y = layout.y;\n }\n return this.register(new GraphLayer(this.gl, { ...opts, x, y }));\n }\n\n /**\n * Stacked area: each series is filled from the running cumulative total of the\n * ones before it. Returns the layers bottom-to-top.\n */\n addStackedArea(opts: StackedAreaOptions): AreaLayer[] {\n const n = opts.x.length;\n const cum = new Float64Array(n);\n const layers: AreaLayer[] = [];\n for (const ser of opts.series) {\n const base = Float64Array.from(cum);\n const top = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n top[i] = cum[i]! + (ser.y[i] ?? 0);\n cum[i] = top[i]!;\n }\n layers.push(\n new AreaLayer(this.gl, { x: opts.x, y: top, base, color: ser.color, name: ser.name, yAxis: opts.yAxis }),\n );\n }\n for (const l of layers) this.register(l);\n return layers;\n }\n\n /**\n * Add a Canvas2D annotation (span / band / box / label) drawn above the data.\n * Returns a disposer that removes just this annotation.\n */\n addAnnotation(a: Annotation): () => void {\n this.annotations.push(a);\n this.requestRender();\n return () => {\n const i = this.annotations.indexOf(a);\n if (i >= 0) {\n this.annotations.splice(i, 1);\n this.requestRender();\n }\n };\n }\n\n /** Remove all annotations. */\n clearAnnotations(): void {\n if (this.annotations.length === 0) return;\n this.annotations = [];\n this.requestRender();\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, factors, side, color, ...axisConfig } = opts;\n const cat = type === \"categorical\";\n const scale = makeScale(type ?? \"linear\", domain ?? [0, 1], factors);\n this.yAxes.set(id, {\n id,\n scale,\n axis: new Axis(axisConfig),\n side: side ?? \"right\",\n auto: !cat && domain == null,\n initial: cat ? scale.domain : (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 this.legendDiv.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 const styleX = resolveAxisStyle(this.axisX.config, this.theme);\n const styleYPrimary = resolveAxisStyle(primary.axis.config, this.theme, primary.color);\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 if (this.borderFill) {\n this.gridCtx.fillStyle = this.borderFill;\n this.gridCtx.fillRect(0, 0, layout.cssWidth, layout.cssHeight);\n }\n if (this.bgFill) {\n this.gridCtx.fillStyle = this.bgFill;\n this.gridCtx.fillRect(region.left, region.top, region.width, region.height);\n }\n drawGrid(this.gridCtx, region, this.scaleX, primary.scale, ticksX, ticksYPrimary, styleX, styleYPrimary);\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, styleX, 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 const styleY = ya === primary ? styleYPrimary : resolveAxisStyle(ya.axis.config, this.theme, ya.color);\n drawYAxis(this.axisCtx, region, ya.scale, ticks, styleY, {\n x: pos.x,\n side: ya.side,\n title: ya.axis.config.title,\n titleX: pos.titleX,\n });\n }\n\n // Plot title in the reserved top strip.\n if (this.title) drawTitle(this.axisCtx, region, this.title, this.isDark);\n\n // Annotations (span/band/box/label) above the data, clipped to the region.\n if (this.annotations.length) this.renderAnnotations(region);\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 // Legend of named series.\n this.updateLegend(region);\n }\n\n /** Named series that can appear in the legend: any layer exposing name + colorCss. */\n private legendEntries(): Array<{ name: string; colorCss: string }> {\n const out: Array<{ name: string; colorCss: string }> = [];\n for (const l of this.layers) {\n const a = l as Partial<{ name: string; colorCss: string }>;\n if (typeof a.name === \"string\" && a.name && typeof a.colorCss === \"string\") {\n out.push({ name: a.name, colorCss: a.colorCss });\n }\n }\n return out;\n }\n\n /** Rebuild and position the legend overlay (or hide it). */\n private updateLegend(region: ReturnType<typeof plotRegion>): void {\n const div = this.legendDiv;\n const entries = this.legend ? this.legendEntries() : [];\n if (!this.legend || entries.length === 0) {\n div.style.display = \"none\";\n return;\n }\n const cfg = this.legend;\n if (cfg.background) div.style.background = cfg.background;\n if (cfg.border) div.style.border = `1px solid ${cfg.border}`;\n if (cfg.textColor) div.style.color = cfg.textColor;\n if (cfg.font) div.style.font = cfg.font;\n const horizontal = cfg.orientation === \"horizontal\";\n div.style.display = \"flex\";\n div.style.flexDirection = horizontal ? \"row\" : \"column\";\n div.style.gap = horizontal ? \"12px\" : \"3px\";\n\n div.replaceChildren();\n for (const e of entries) {\n const row = document.createElement(\"div\");\n row.style.display = \"flex\";\n row.style.alignItems = \"center\";\n row.style.gap = \"6px\";\n const swatch = document.createElement(\"span\");\n Object.assign(swatch.style, {\n width: \"10px\",\n height: \"10px\",\n borderRadius: \"2px\",\n background: e.colorCss,\n flex: \"0 0 auto\",\n } as CSSStyleDeclaration);\n const label = document.createElement(\"span\");\n label.textContent = e.name;\n row.appendChild(swatch);\n row.appendChild(label);\n div.appendChild(row);\n }\n\n // Position inside the plot region, inset from the chosen corner.\n const inset = 8;\n const pos = cfg.position ?? \"top-right\";\n const w = div.offsetWidth;\n const h = div.offsetHeight;\n const left = pos.endsWith(\"left\")\n ? region.left + inset\n : region.left + region.width - w - inset;\n const top = pos.startsWith(\"top\")\n ? region.top + inset\n : region.top + region.height - h - inset;\n div.style.left = `${Math.max(0, left)}px`;\n div.style.top = `${Math.max(0, top)}px`;\n }\n\n /** Draw all annotations, projected through the scales and clipped to the region. */\n private renderAnnotations(region: ReturnType<typeof plotRegion>): void {\n const ctx = this.axisCtx;\n const left = region.left, right = region.left + region.width;\n const top = region.top, bottom = region.top + region.height;\n const yScaleOf = (id?: string): Scale => (this.yAxes.get(id ?? \"y\") ?? this.primaryY()).scale;\n const px = (v: number): number => pxX(region, this.scaleX.norm(v));\n const py = (s: Scale, v: number): number => pxY(region, s.norm(v));\n ctx.save();\n ctx.beginPath();\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n for (const a of this.annotations) {\n ctx.setLineDash([]);\n if (a.type === \"span\") {\n ctx.strokeStyle = a.color ?? this.theme.axis;\n ctx.lineWidth = a.width ?? 1;\n if (a.dash) ctx.setLineDash(a.dash);\n ctx.beginPath();\n if (a.dim === \"x\") {\n const x = Math.round(px(a.value)) + 0.5;\n ctx.moveTo(x, top); ctx.lineTo(x, bottom);\n } else {\n const y = Math.round(py(yScaleOf(a.yAxis), a.value)) + 0.5;\n ctx.moveTo(left, y); ctx.lineTo(right, y);\n }\n ctx.stroke();\n } else if (a.type === \"band\") {\n ctx.fillStyle = a.color ?? \"rgba(59,130,246,0.15)\";\n if (a.dim === \"x\") {\n const x0 = px(a.from), x1 = px(a.to);\n ctx.fillRect(Math.min(x0, x1), top, Math.abs(x1 - x0), bottom - top);\n } else {\n const s = yScaleOf(a.yAxis);\n const y0 = py(s, a.from), y1 = py(s, a.to);\n ctx.fillRect(left, Math.min(y0, y1), right - left, Math.abs(y1 - y0));\n }\n } else if (a.type === \"box\") {\n const s = yScaleOf(a.yAxis);\n const x0 = px(a.x[0]), x1 = px(a.x[1]);\n const y0 = py(s, a.y[0]), y1 = py(s, a.y[1]);\n const rx = Math.min(x0, x1), ry = Math.min(y0, y1);\n const rw = Math.abs(x1 - x0), rh = Math.abs(y1 - y0);\n if (a.color) { ctx.fillStyle = a.color; ctx.fillRect(rx, ry, rw, rh); }\n if (a.border) { ctx.strokeStyle = a.border; ctx.lineWidth = 1; ctx.strokeRect(rx + 0.5, ry + 0.5, rw, rh); }\n } else {\n const s = yScaleOf(a.yAxis);\n ctx.fillStyle = a.color ?? this.theme.text;\n ctx.font = a.font ?? this.theme.font;\n ctx.textAlign = a.align ?? \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(a.text, px(a.x), py(s, a.y));\n }\n }\n ctx.restore();\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","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, ColorInfo, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface Bar3DOptions {\n /** Grid x positions (world). */\n x: ArrayLike<number>;\n /** Grid z positions (world). */\n z: ArrayLike<number>;\n /** Bar heights. */\n y: ArrayLike<number>;\n /** Footprint (world units). Defaults to ~0.7× the median grid spacing. */\n width?: number;\n color?: string | Color;\n /** Color bars via a colormap (over `values`, default the heights). */\n colorBy?: { values?: ArrayLike<number>; colormap?: ColormapName; domain?: Range };\n name?: string;\n}\n\n// A unit cube: y in [0,1], x/z in [-0.5,0.5], with per-face normals.\nfunction buildCube(): Float32Array {\n const faces: { n: [number, number, number]; v: [number, number, number][] }[] = [\n { n: [1, 0, 0], v: [[0.5, 0, -0.5], [0.5, 1, -0.5], [0.5, 1, 0.5], [0.5, 0, -0.5], [0.5, 1, 0.5], [0.5, 0, 0.5]] },\n { n: [-1, 0, 0], v: [[-0.5, 0, 0.5], [-0.5, 1, 0.5], [-0.5, 1, -0.5], [-0.5, 0, 0.5], [-0.5, 1, -0.5], [-0.5, 0, -0.5]] },\n { n: [0, 1, 0], v: [[-0.5, 1, -0.5], [0.5, 1, -0.5], [0.5, 1, 0.5], [-0.5, 1, -0.5], [0.5, 1, 0.5], [-0.5, 1, 0.5]] },\n { n: [0, -1, 0], v: [[-0.5, 0, 0.5], [0.5, 0, 0.5], [0.5, 0, -0.5], [-0.5, 0, 0.5], [0.5, 0, -0.5], [-0.5, 0, -0.5]] },\n { n: [0, 0, 1], v: [[-0.5, 0, 0.5], [0.5, 0, 0.5], [0.5, 1, 0.5], [-0.5, 0, 0.5], [0.5, 1, 0.5], [-0.5, 1, 0.5]] },\n { n: [0, 0, -1], v: [[0.5, 0, -0.5], [-0.5, 0, -0.5], [-0.5, 1, -0.5], [0.5, 0, -0.5], [-0.5, 1, -0.5], [0.5, 1, -0.5]] },\n ];\n const out: number[] = [];\n for (const f of faces) for (const p of f.v) out.push(p[0], p[1], p[2], f.n[0], f.n[1], f.n[2]);\n return new Float32Array(out);\n}\nconst CUBE = buildCube();\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aCube; // unit cube (y in [0,1])\nlayout(location = 1) in vec3 aNormal;\nlayout(location = 2) in vec2 aBase; // instance x,z\nlayout(location = 3) in float aHeight;\nlayout(location = 4) in vec3 aColor;\nuniform mat4 uMVP;\nuniform float uWidth;\nout vec3 vColor;\nout vec3 vN;\nvoid main() {\n vec3 world = vec3(aBase.x + aCube.x * uWidth, aCube.y * aHeight, aBase.y + aCube.z * uWidth);\n vColor = aColor;\n vN = aNormal;\n gl_Position = uMVP * vec4(world, 1.0);\n}`;\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\nfunction medianSpacing(vals: ArrayLike<number>, n: number): number {\n const s = Array.from({ length: n }, (_, i) => vals[i]!).sort((a, b) => a - b);\n const diffs: number[] = [];\n for (let i = 1; i < n; i++) { const d = s[i]! - s[i - 1]!; if (d > 1e-9) diffs.push(d); }\n if (!diffs.length) return 1;\n diffs.sort((a, b) => a - b);\n return diffs[Math.floor(diffs.length / 2)]!;\n}\n\nlet counter = 0;\n\n/** 3D bars (columns) on an x/z grid, lit like the surface and optionally colormapped. */\nexport class Bar3DLayer implements Layer3D {\n readonly id: string;\n readonly name?: string;\n readonly colorCss?: 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 width: number;\n private b3: Bounds3;\n private cInfo: ColorInfo | null = null;\n private positions: Float32Array;\n private lightDir: [number, number, number] = [0.5, 1, 0.35];\n private ambient = 0.35;\n\n constructor(gl: WebGL2RenderingContext, opts: Bar3DOptions) {\n this.id = `bar3d-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.name = opts.name;\n const n = Math.min(opts.x.length, opts.y.length, opts.z.length);\n this.count = n;\n const dx = medianSpacing(opts.x, n), dz = medianSpacing(opts.z, n);\n this.width = opts.width ?? Math.min(dx, dz) * 0.7;\n\n const base = opts.color != null\n ? (Array.isArray(opts.color) ? (opts.color as Color) : parseColor(opts.color as string))\n : [0.24, 0.55, 0.96, 1] as Color;\n const cvals = opts.colorBy?.values ?? (opts.colorBy ? opts.y : null);\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 (cmap && cvals && !opts.colorBy?.domain) {\n for (let i = 0; i < n; i++) { const v = cvals[i]!; if (v < lo) lo = v; if (v > hi) hi = v; }\n }\n const span = (hi - lo) || 1;\n if (cmap) this.cInfo = { colormap: opts.colorBy!.colormap ?? \"viridis\", domain: [lo, hi], label: opts.name };\n else this.colorCss = opts.color != null && typeof opts.color === \"string\" ? opts.color : \"#3b82f6\";\n\n // Instance buffer: base(2) + height(1) + color(3).\n const inst = new Float32Array(n * 6);\n this.positions = new Float32Array(n * 3); // bar tops, for hover picking\n let minX = Infinity, maxX = -Infinity, minZ = Infinity, maxZ = -Infinity, minY = 0, maxY = 0;\n const hw = this.width / 2;\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, z = opts.z[i]!, h = opts.y[i]!;\n inst[i * 6] = x; inst[i * 6 + 1] = z; inst[i * 6 + 2] = h;\n this.positions[i * 3] = x; this.positions[i * 3 + 1] = h; this.positions[i * 3 + 2] = z;\n let c: [number, number, number];\n if (cmap && cvals) c = cmap((cvals[i]! - lo) / span);\n else c = [base[0], base[1], base[2]];\n inst[i * 6 + 3] = c[0]; inst[i * 6 + 4] = c[1]; inst[i * 6 + 5] = c[2];\n if (x - hw < minX) minX = x - hw; if (x + hw > maxX) maxX = x + hw;\n if (z - hw < minZ) minZ = z - hw; if (z + hw > maxZ) maxZ = z + hw;\n if (h < minY) minY = h; if (h > maxY) maxY = h;\n }\n this.b3 = { x: [minX, maxX], y: [minY, maxY], z: [minZ, maxZ] };\n\n this.vao = gl.createVertexArray()!;\n gl.bindVertexArray(this.vao);\n const cubeBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, cubeBuf);\n gl.bufferData(gl.ARRAY_BUFFER, CUBE, 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 const instBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, instBuf);\n gl.bufferData(gl.ARRAY_BUFFER, inst, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 2, gl.FLOAT, false, 24, 0);\n gl.vertexAttribDivisor(2, 1);\n gl.enableVertexAttribArray(3);\n gl.vertexAttribPointer(3, 1, gl.FLOAT, false, 24, 8);\n gl.vertexAttribDivisor(3, 1);\n gl.enableVertexAttribArray(4);\n gl.vertexAttribPointer(4, 3, gl.FLOAT, false, 24, 12);\n gl.vertexAttribDivisor(4, 1);\n gl.bindVertexArray(null);\n this.buffers = [cubeBuf, instBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uWidth\", \"uLightDir\", \"uAmbient\"]);\n }\n\n bounds3() { return this.count ? this.b3 : null; }\n\n colorInfo(): ColorInfo | null { return this.cInfo; }\n\n pickData() { return this.count ? { positions: this.positions } : null; }\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 if (this.count === 0) return;\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\n gl.uniform1f(this.uniforms.uWidth!, this.width);\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.drawArraysInstanced(gl.TRIANGLES, 0, 36, 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 { 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, ColorInfo, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface Contour3DOptions {\n /** Row-major height grid, length `cols * rows`. */\n values: ArrayLike<number>;\n cols: number;\n rows: number;\n /** World footprint. Defaults to unit indices. */\n extentX?: Range;\n extentZ?: Range;\n /** Iso levels: an explicit list, or a count of evenly-spaced levels. Default 10. */\n levels?: number[] | number;\n /** Single line color; if omitted, levels are colored by a colormap. */\n color?: string | Color;\n colormap?: ColormapName;\n name?: string;\n}\n\n// Marching squares: case → edge pairs (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 VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aColor;\nuniform mat4 uMVP;\nout vec3 vColor;\nvoid main() { vColor = aColor; gl_Position = uMVP * vec4(aPos, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor, 1.0); }`;\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\n/**\n * 3D contour: iso-height lines of a grid, each drawn at its own level height\n * (`y = level`) so they stack into a floating topographic map. Marching squares\n * on the CPU, per-vertex colored by level.\n */\nexport class Contour3DLayer implements Layer3D {\n readonly id: string;\n readonly name?: 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 vertCount: number;\n private b3: Bounds3;\n private cInfo: ColorInfo | null = null;\n\n constructor(gl: WebGL2RenderingContext, opts: Contour3DOptions) {\n this.id = `contour3d-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.name = opts.name;\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\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 lspan = vmax - vmin || 1;\n const count = typeof opts.levels === \"number\" ? opts.levels : 10;\n const levels = Array.isArray(opts.levels)\n ? opts.levels\n : Array.from({ length: count }, (_, i) => vmin + (lspan * (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 if (!fixed) this.cInfo = { colormap: opts.colormap ?? \"viridis\", domain: [vmin, vmax], label: opts.name };\n\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 data: number[] = [];\n for (const L of levels) {\n const col: [number, number, number] = fixed ? [fixed[0], fixed[1], fixed[2]] : cmap((L - vmin) / lspan);\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 const lerp = (t: number, ax: number, az: number, bx: number, bz: number): [number, number] =>\n [ax + (bx - ax) * t, az + (bz - az) * t];\n const edge = (e: number): [number, number] => {\n if (e === 0) return lerp((L - v0) / (v1 - v0 || 1e-9), wx(c), wz(r), wx(c + 1), wz(r));\n if (e === 1) return lerp((L - v1) / (v2 - v1 || 1e-9), wx(c + 1), wz(r), wx(c + 1), wz(r + 1));\n if (e === 2) return lerp((L - v2) / (v3 - v2 || 1e-9), wx(c + 1), wz(r + 1), wx(c), wz(r + 1));\n return lerp((L - v3) / (v0 - v3 || 1e-9), wx(c), wz(r + 1), wx(c), wz(r));\n };\n for (const [ea, eb] of segs) {\n const pa = edge(ea), pb = edge(eb);\n data.push(pa[0], L, pa[1], col[0], col[1], col[2]);\n data.push(pb[0], L, pb[1], col[0], col[1], col[2]);\n }\n }\n }\n }\n\n this.vertCount = data.length / 6;\n this.b3 = { x: [x0, x1], y: [vmin, vmax], z: [z0, z1] };\n\n this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.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, 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\"]);\n }\n\n bounds3() { return this.vertCount ? this.b3 : null; }\n\n colorInfo(): ColorInfo | null { return this.cInfo; }\n\n draw(gl: WebGL2RenderingContext, mvp: Mat4): void {\n if (this.vertCount === 0) return;\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.LINES, 0, this.vertCount);\n gl.bindVertexArray(null);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n }\n}\n","/**\n * Marching cubes: extract a triangle-mesh isosurface from a 3D scalar volume.\n * Pure and unit-tested. Uses the canonical Bourke/Bloyd edge + triangle tables.\n *\n * The volume is indexed `x + y*nx + z*nx*ny`. A corner is \"inside\" when its value\n * is below `isoLevel`. Vertex positions are linearly interpolated along the crossed\n * cube edges; normals come from the (central-difference) volume gradient so the\n * surface shades smoothly.\n */\nimport type { Range } from \"../types.js\";\n\n// Which of the 12 edges are crossed for each of the 256 corner-sign combinations.\nconst EDGE_TABLE = [\n 0x0, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n 0x190, 0x99, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n 0x230, 0x339, 0x33, 0x13a, 0x636, 0x73f, 0x435, 0x53c, 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n 0x3a0, 0x2a9, 0x1a3, 0xaa, 0x7a6, 0x6af, 0x5a5, 0x4ac, 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n 0x460, 0x569, 0x663, 0x76a, 0x66, 0x16f, 0x265, 0x36c, 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff, 0x3f5, 0x2fc, 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55, 0x15c, 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc, 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 0xcc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 0x15c, 0x55, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 0x2fc, 0x3f5, 0xff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, 0x36c, 0x265, 0x16f, 0x66, 0x76a, 0x663, 0x569, 0x460,\n 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa, 0x1a3, 0x2a9, 0x3a0,\n 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33, 0x339, 0x230,\n 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99, 0x190,\n 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0,\n];\n\n// Triangles (edge triplets, -1 terminated) for each of the 256 cases.\nconst TRI_TABLE = [\n [], [0, 8, 3], [0, 1, 9], [1, 8, 3, 9, 8, 1], [1, 2, 10], [0, 8, 3, 1, 2, 10], [9, 2, 10, 0, 2, 9], [2, 8, 3, 2, 10, 8, 10, 9, 8],\n [3, 11, 2], [0, 11, 2, 8, 11, 0], [1, 9, 0, 2, 3, 11], [1, 11, 2, 1, 9, 11, 9, 8, 11], [3, 10, 1, 11, 10, 3], [0, 10, 1, 0, 8, 10, 8, 11, 10], [3, 9, 0, 3, 11, 9, 11, 10, 9], [9, 8, 10, 10, 8, 11],\n [4, 7, 8], [4, 3, 0, 7, 3, 4], [0, 1, 9, 8, 4, 7], [4, 1, 9, 4, 7, 1, 7, 3, 1], [1, 2, 10, 8, 4, 7], [3, 4, 7, 3, 0, 4, 1, 2, 10], [9, 2, 10, 9, 0, 2, 8, 4, 7], [2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4],\n [8, 4, 7, 3, 11, 2], [11, 4, 7, 11, 2, 4, 2, 0, 4], [9, 0, 1, 8, 4, 7, 2, 3, 11], [4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1], [3, 10, 1, 3, 11, 10, 7, 8, 4], [1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4], [4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3], [4, 7, 11, 4, 11, 9, 9, 11, 10],\n [9, 5, 4], [9, 5, 4, 0, 8, 3], [0, 5, 4, 1, 5, 0], [8, 5, 4, 8, 3, 5, 3, 1, 5], [1, 2, 10, 9, 5, 4], [3, 0, 8, 1, 2, 10, 4, 9, 5], [5, 2, 10, 5, 4, 2, 4, 0, 2], [2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8],\n [9, 5, 4, 2, 3, 11], [0, 11, 2, 0, 8, 11, 4, 9, 5], [0, 5, 4, 0, 1, 5, 2, 3, 11], [2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5], [10, 3, 11, 10, 1, 3, 9, 5, 4], [4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10], [5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3], [5, 4, 8, 5, 8, 10, 10, 8, 11],\n [9, 7, 8, 5, 7, 9], [9, 3, 0, 9, 5, 3, 5, 7, 3], [0, 7, 8, 0, 1, 7, 1, 5, 7], [1, 5, 3, 3, 5, 7], [9, 7, 8, 9, 5, 7, 10, 1, 2], [10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3], [8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2], [2, 10, 5, 2, 5, 3, 3, 5, 7],\n [7, 9, 5, 7, 8, 9, 3, 11, 2], [9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11], [2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7], [11, 2, 1, 11, 1, 7, 7, 1, 5], [9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11], [5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0], [11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0], [11, 10, 5, 7, 11, 5],\n [10, 6, 5], [0, 8, 3, 5, 10, 6], [9, 0, 1, 5, 10, 6], [1, 8, 3, 1, 9, 8, 5, 10, 6], [1, 6, 5, 2, 6, 1], [1, 6, 5, 1, 2, 6, 3, 0, 8], [9, 6, 5, 9, 0, 6, 0, 2, 6], [5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8],\n [2, 3, 11, 10, 6, 5], [11, 0, 8, 11, 2, 0, 10, 6, 5], [0, 1, 9, 2, 3, 11, 5, 10, 6], [5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11], [6, 3, 11, 6, 5, 3, 5, 1, 3], [0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6], [3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9], [6, 5, 9, 6, 9, 11, 11, 9, 8],\n [5, 10, 6, 4, 7, 8], [4, 3, 0, 4, 7, 3, 6, 5, 10], [1, 9, 0, 5, 10, 6, 8, 4, 7], [10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4], [6, 1, 2, 6, 5, 1, 4, 7, 8], [1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7], [8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6], [7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9],\n [3, 11, 2, 7, 8, 4, 10, 6, 5], [5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11], [0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6], [9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6], [8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6], [5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11], [0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7], [6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9],\n [10, 4, 9, 6, 4, 10], [4, 10, 6, 4, 9, 10, 0, 8, 3], [10, 0, 1, 10, 6, 0, 6, 4, 0], [8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10], [1, 4, 9, 1, 2, 4, 2, 6, 4], [3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4], [0, 2, 4, 4, 2, 6], [8, 3, 2, 8, 2, 4, 4, 2, 6],\n [10, 4, 9, 10, 6, 4, 11, 2, 3], [0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6], [3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10], [6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1], [9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3], [8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1], [3, 11, 6, 3, 6, 0, 0, 6, 4], [6, 4, 8, 11, 6, 8],\n [7, 10, 6, 7, 8, 10, 8, 9, 10], [0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10], [10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0], [10, 6, 7, 10, 7, 1, 1, 7, 3], [1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7], [2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9], [7, 8, 0, 7, 0, 6, 6, 0, 2], [7, 3, 2, 6, 7, 2],\n [2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7], [2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7], [1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11], [11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1], [8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6], [0, 9, 1, 11, 6, 7], [7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0], [7, 11, 6],\n [7, 6, 11], [3, 0, 8, 11, 7, 6], [0, 1, 9, 11, 7, 6], [8, 1, 9, 8, 3, 1, 11, 7, 6], [10, 1, 2, 6, 11, 7], [1, 2, 10, 3, 0, 8, 6, 11, 7], [2, 9, 0, 2, 10, 9, 6, 11, 7], [6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8],\n [7, 2, 3, 6, 2, 7], [7, 0, 8, 7, 6, 0, 6, 2, 0], [2, 7, 6, 2, 3, 7, 0, 1, 9], [1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6], [10, 7, 6, 10, 1, 7, 1, 3, 7], [10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8], [0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7], [7, 6, 10, 7, 10, 8, 8, 10, 9],\n [6, 8, 4, 11, 8, 6], [3, 6, 11, 3, 0, 6, 0, 4, 6], [8, 6, 11, 8, 4, 6, 9, 0, 1], [9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6], [6, 8, 4, 6, 11, 8, 2, 10, 1], [1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6], [4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9], [10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3],\n [8, 2, 3, 8, 4, 2, 4, 6, 2], [0, 4, 2, 4, 6, 2], [1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8], [1, 9, 4, 1, 4, 2, 2, 4, 6], [8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1], [10, 1, 0, 10, 0, 6, 6, 0, 4], [4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3], [10, 9, 4, 6, 10, 4],\n [4, 9, 5, 7, 6, 11], [0, 8, 3, 4, 9, 5, 11, 7, 6], [5, 0, 1, 5, 4, 0, 7, 6, 11], [11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5], [9, 5, 4, 10, 1, 2, 7, 6, 11], [6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5], [7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2], [3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6],\n [7, 2, 3, 7, 6, 2, 5, 4, 9], [9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7], [3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0], [6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8], [9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7], [1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4], [4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10], [7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10],\n [6, 9, 5, 6, 11, 9, 11, 8, 9], [3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5], [0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11], [6, 11, 3, 6, 3, 5, 5, 3, 1], [1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6], [0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10], [11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5], [6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3],\n [5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2], [9, 5, 6, 9, 6, 0, 0, 6, 2], [1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8], [1, 5, 6, 2, 1, 6], [1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6], [10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0], [0, 3, 8, 5, 6, 10], [10, 5, 6],\n [11, 5, 10, 7, 5, 11], [11, 5, 10, 11, 7, 5, 8, 3, 0], [5, 11, 7, 5, 10, 11, 1, 9, 0], [10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1], [11, 1, 2, 11, 7, 1, 7, 5, 1], [0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11], [9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7], [7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2],\n [2, 5, 10, 2, 3, 5, 3, 7, 5], [8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5], [9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2], [9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2], [1, 3, 5, 3, 7, 5], [0, 8, 7, 0, 7, 1, 1, 7, 5], [9, 0, 3, 9, 3, 5, 5, 3, 7], [9, 8, 7, 5, 9, 7],\n [5, 8, 4, 5, 10, 8, 10, 11, 8], [5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0], [0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5], [10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4], [2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8], [0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11], [0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5], [9, 4, 5, 2, 11, 3],\n [2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4], [5, 10, 2, 5, 2, 4, 4, 2, 0], [3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9], [5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2], [8, 4, 5, 8, 5, 3, 3, 5, 1], [0, 4, 5, 1, 0, 5], [8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5], [9, 4, 5],\n [4, 11, 7, 4, 9, 11, 9, 10, 11], [0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11], [1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11], [3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4], [4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2], [9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3], [11, 7, 4, 11, 4, 2, 2, 4, 0], [11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4],\n [2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9], [9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7], [3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10], [1, 10, 2, 8, 7, 4], [4, 9, 1, 4, 1, 7, 7, 1, 3], [4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1], [4, 0, 3, 7, 4, 3], [4, 8, 7],\n [9, 10, 8, 10, 11, 8], [3, 0, 9, 3, 9, 11, 11, 9, 10], [0, 1, 10, 0, 10, 8, 8, 10, 11], [3, 1, 10, 11, 3, 10], [1, 2, 11, 1, 11, 9, 9, 11, 8], [3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9], [0, 2, 11, 8, 0, 11], [3, 2, 11],\n [2, 3, 8, 2, 8, 10, 10, 8, 9], [9, 10, 2, 0, 9, 2], [2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8], [1, 10, 2], [1, 3, 8, 9, 1, 8], [0, 9, 1], [0, 3, 8], [],\n];\n\n// The two corners each of the 12 edges connects (Bourke corner numbering).\nconst EDGE_CORNERS: [number, number][] = [\n [0, 1], [1, 2], [2, 3], [3, 0], [4, 5], [5, 6], [6, 7], [7, 4], [0, 4], [1, 5], [2, 6], [3, 7],\n];\n// Corner offsets within a cube.\nconst CORNER = [\n [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1],\n];\n\n/**\n * Extract the isosurface of `values` (dims `nx*ny*nz`, index `x + y*nx + z*nx*ny`)\n * at `isoLevel`. Returns a triangle soup of world-space positions + smooth normals.\n */\nexport function marchingCubes(\n values: ArrayLike<number>,\n dims: [number, number, number],\n isoLevel: number,\n extent?: { x: Range; y: Range; z: Range },\n): { positions: Float32Array; normals: Float32Array } {\n const [nx, ny, nz] = dims;\n const ex = extent?.x ?? [0, nx - 1];\n const ez = extent?.z ?? [0, nz - 1];\n const ey = extent?.y ?? [0, ny - 1];\n const wx = (x: number) => ex[0] + (x / Math.max(1, nx - 1)) * (ex[1] - ex[0]);\n const wy = (y: number) => ey[0] + (y / Math.max(1, ny - 1)) * (ey[1] - ey[0]);\n const wz = (z: number) => ez[0] + (z / Math.max(1, nz - 1)) * (ez[1] - ez[0]);\n const idx = (x: number, y: number, z: number) => x + y * nx + z * nx * ny;\n const val = (x: number, y: number, z: number) => values[idx(x, y, z)]!;\n // Central-difference gradient (points toward increasing value; negate for outward normal).\n const grad = (x: number, y: number, z: number): [number, number, number] => {\n const gx = val(Math.min(nx - 1, x + 1), y, z) - val(Math.max(0, x - 1), y, z);\n const gy = val(x, Math.min(ny - 1, y + 1), z) - val(x, Math.max(0, y - 1), z);\n const gz = val(x, y, Math.min(nz - 1, z + 1)) - val(x, y, Math.max(0, z - 1));\n return [gx, gy, gz];\n };\n\n const positions: number[] = [];\n const normals: number[] = [];\n const cornerVal = new Array<number>(8);\n const edgeP: [number, number, number][] = new Array(12);\n const edgeN: [number, number, number][] = new Array(12);\n\n for (let z = 0; z < nz - 1; z++) {\n for (let y = 0; y < ny - 1; y++) {\n for (let x = 0; x < nx - 1; x++) {\n let cubeIndex = 0;\n for (let i = 0; i < 8; i++) {\n const co = CORNER[i]!;\n cornerVal[i] = val(x + co[0]!, y + co[1]!, z + co[2]!);\n if (cornerVal[i]! < isoLevel) cubeIndex |= 1 << i;\n }\n const edges = EDGE_TABLE[cubeIndex]!;\n if (edges === 0) continue;\n for (let e = 0; e < 12; e++) {\n if (!(edges & (1 << e))) continue;\n const [a, b] = EDGE_CORNERS[e]!;\n const va = cornerVal[a]!, vb = cornerVal[b]!;\n const t = Math.abs(vb - va) < 1e-9 ? 0.5 : (isoLevel - va) / (vb - va);\n const ca = CORNER[a]!, cb = CORNER[b]!;\n const px = x + ca[0]! + (cb[0]! - ca[0]!) * t;\n const py = y + ca[1]! + (cb[1]! - ca[1]!) * t;\n const pz = z + ca[2]! + (cb[2]! - ca[2]!) * t;\n edgeP[e] = [wx(px), wy(py), wz(pz)];\n // Interpolate gradients at the two corners, then negate for an outward normal.\n const ga = grad(x + ca[0]!, y + ca[1]!, z + ca[2]!);\n const gb = grad(x + cb[0]!, y + cb[1]!, z + cb[2]!);\n let nxn = -(ga[0] + (gb[0] - ga[0]) * t);\n let nyn = -(ga[1] + (gb[1] - ga[1]) * t);\n let nzn = -(ga[2] + (gb[2] - ga[2]) * t);\n const nl = Math.hypot(nxn, nyn, nzn) || 1;\n nxn /= nl; nyn /= nl; nzn /= nl;\n edgeN[e] = [nxn, nyn, nzn];\n }\n const tris = TRI_TABLE[cubeIndex]!;\n for (let i = 0; i < tris.length; i += 3) {\n for (let k = 0; k < 3; k++) {\n const p = edgeP[tris[i + k]!]!;\n const nrm = edgeN[tris[i + k]!]!;\n positions.push(p[0], p[1], p[2]);\n normals.push(nrm[0], nrm[1], nrm[2]);\n }\n }\n }\n }\n }\n return { positions: new Float32Array(positions), normals: new Float32Array(normals) };\n}\n","import { parseColor, toColorCss } 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 { marchingCubes } from \"./marching-cubes.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface IsosurfaceOptions {\n /** Scalar volume, length `nx*ny*nz`, indexed `x + y*nx + z*nx*ny`. */\n values: ArrayLike<number>;\n dims: [number, number, number];\n /** The iso value to extract the surface at. */\n isoLevel: number;\n /** World extent of the volume. Defaults to unit indices. */\n extent?: { x: Range; y: Range; z: Range };\n color?: string | Color;\n /** Fill opacity 0..1. Default 1. */\n opacity?: number;\n name?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aNormal;\nuniform mat4 uMVP;\nout vec3 vN;\nvoid main() { vN = aNormal; gl_Position = uMVP * vec4(aPos, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vN;\nuniform vec3 uColor;\nuniform vec3 uLightDir;\nuniform float uAmbient;\nuniform float uOpacity;\nout vec4 outColor;\nvoid main() {\n // Two-sided: isosurfaces are viewed from inside and out.\n float d = abs(dot(normalize(vN), normalize(uLightDir)));\n float shade = uAmbient + (1.0 - uAmbient) * d;\n outColor = vec4(uColor * shade * uOpacity, uOpacity);\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\n/** A marching-cubes isosurface of a 3D scalar volume, lit and solid-colored. */\nexport class IsosurfaceLayer implements Layer3D {\n readonly id: string;\n readonly name?: string;\n readonly colorCss: 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 vertCount: number;\n private color: Color;\n private opacity: 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: IsosurfaceOptions) {\n this.id = `isosurface-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.name = opts.name;\n const ci = opts.color ?? \"#38bdf8\";\n this.color = Array.isArray(ci) ? (ci as Color) : parseColor(ci as string);\n this.colorCss = typeof ci === \"string\" ? ci : toColorCss(this.color);\n this.opacity = opts.opacity ?? 1;\n\n const { positions, normals } = marchingCubes(opts.values, opts.dims, opts.isoLevel, opts.extent);\n this.vertCount = positions.length / 3;\n const ex = opts.extent?.x ?? [0, opts.dims[0] - 1];\n const ey = opts.extent?.y ?? [0, opts.dims[1] - 1];\n const ez = opts.extent?.z ?? [0, opts.dims[2] - 1];\n this.b3 = { x: ex, y: ey, z: ez };\n\n // Interleave pos(3)+normal(3).\n const data = new Float32Array(this.vertCount * 6);\n for (let i = 0; i < this.vertCount; i++) {\n data[i * 6] = positions[i * 3]!; data[i * 6 + 1] = positions[i * 3 + 1]!; data[i * 6 + 2] = positions[i * 3 + 2]!;\n data[i * 6 + 3] = normals[i * 3]!; data[i * 6 + 4] = normals[i * 3 + 1]!; data[i * 6 + 5] = normals[i * 3 + 2]!;\n }\n\n this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.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\", \"uColor\", \"uLightDir\", \"uAmbient\", \"uOpacity\"]);\n }\n\n bounds3() { return this.vertCount ? this.b3 : null; }\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 if (this.vertCount === 0) return;\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\n gl.uniform3f(this.uniforms.uColor!, this.color[0], this.color[1], this.color[2]);\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.uniform1f(this.uniforms.uOpacity!, this.opacity);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLES, 0, this.vertCount);\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 type { Color } from \"../types.js\";\nimport type { Bounds3, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface Line3DOptions {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n z: ArrayLike<number>;\n color?: string | Color;\n name?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nuniform mat4 uMVP;\nvoid main() { gl_Position = uMVP * vec4(aPos, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 uColor;\nout vec4 outColor;\nvoid main() { outColor = uColor; }`;\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\n/** A 3D polyline / path (`GL_LINE_STRIP`). */\nexport class Line3DLayer implements Layer3D {\n readonly id: string;\n readonly name?: string;\n readonly colorCss: 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 color: Color;\n private b3: Bounds3;\n private positions: Float32Array;\n\n constructor(gl: WebGL2RenderingContext, opts: Line3DOptions) {\n this.id = `line3d-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.name = opts.name;\n const ci = opts.color ?? \"#38bdf8\";\n this.color = Array.isArray(ci) ? (ci as Color) : parseColor(ci as string);\n this.colorCss = typeof ci === \"string\" ? ci : toColorCss(this.color);\n\n const n = Math.min(opts.x.length, opts.y.length, opts.z.length);\n this.count = n;\n const data = new Float32Array(n * 3);\n this.positions = data;\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 * 3] = x; data[i * 3 + 1] = y; data[i * 3 + 2] = z;\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 this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\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 this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uColor\"]);\n }\n\n bounds3() { return this.count ? this.b3 : null; }\n\n pickData() { return this.count ? { positions: this.positions } : null; }\n\n /** Stream a new path. Call `plot.refresh()` afterwards to re-fit + redraw. */\n setData(x: ArrayLike<number>, y: ArrayLike<number>, z: ArrayLike<number>): void {\n const n = Math.min(x.length, y.length, z.length);\n this.count = n;\n const data = new Float32Array(n * 3);\n this.positions = data;\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n for (let i = 0; i < n; i++) {\n const px = x[i]!, py = y[i]!, pz = z[i]!;\n data[i * 3] = px; data[i * 3 + 1] = py; data[i * 3 + 2] = pz;\n if (px < minX) minX = px; if (px > maxX) maxX = px;\n if (py < minY) minY = py; if (py > maxY) maxY = py;\n if (pz < minZ) minZ = pz; if (pz > maxZ) maxZ = pz;\n }\n this.b3 = { x: [minX, maxX], y: [minY, maxY], z: [minZ, maxZ] };\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 draw(gl: WebGL2RenderingContext, mvp: Mat4): void {\n if (this.count < 2) return;\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\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.LINE_STRIP, 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","/** 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 { colormapLUT, type ColormapName } from \"../color/colormap.js\";\nimport { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { Bounds3, ColorInfo, 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 /** Uniform point diameter (px) when `sizes` is omitted. Default 4. */\n size?: number;\n /** Per-point diameter (px); overrides `size` where > 0. */\n sizes?: ArrayLike<number>;\n colorBy?: { values: ArrayLike<number>; colormap?: ColormapName; domain?: Range };\n /** Per-point tooltip text (parallel to x/y/z). */\n labels?: ArrayLike<string>;\n /** Series name (legend / colorbar label). */\n name?: string;\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aColor;\nlayout(location = 2) in float aSize;\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 = aSize > 0.0 ? aSize : 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 readonly name?: string;\n readonly colorCss?: 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 = { x: [0, 0], y: [0, 0], z: [0, 0] };\n private cInfo: ColorInfo | null = null;\n private positions: Float32Array;\n private labels?: ArrayLike<string>;\n /** Interleaved pos(3)+color(3)+size(1); positions are streamed in place. */\n private data: Float32Array;\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 this.name = opts.name;\n this.labels = opts.labels;\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 lut = opts.colorBy ? colormapLUT(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 // Legend swatch when solid-colored; colorbar info when colored by value.\n if (opts.colorBy) this.cInfo = { colormap: opts.colorBy.colormap ?? \"viridis\", domain: [lo, hi], label: opts.name };\n else (this as { colorCss?: string }).colorCss = toColorCss(base);\n\n this.data = new Float32Array(n * 7);\n this.positions = new Float32Array(n * 3);\n for (let i = 0; i < n; i++) {\n const x = opts.x[i]!, y = opts.y[i]!, z = opts.z[i]!;\n this.data[i * 7] = x; this.data[i * 7 + 1] = y; this.data[i * 7 + 2] = z;\n this.positions[i * 3] = x; this.positions[i * 3 + 1] = y; this.positions[i * 3 + 2] = z;\n if (lut && opts.colorBy) {\n let t = (opts.colorBy.values[i]! - lo) / span;\n t = t <= 0 ? 0 : t >= 1 ? 1 : t;\n const j = ((t * 255) | 0) * 3;\n this.data[i * 7 + 3] = lut[j]!; this.data[i * 7 + 4] = lut[j + 1]!; this.data[i * 7 + 5] = lut[j + 2]!;\n } else {\n this.data[i * 7 + 3] = base[0]; this.data[i * 7 + 4] = base[1]; this.data[i * 7 + 5] = base[2];\n }\n this.data[i * 7 + 6] = opts.sizes ? opts.sizes[i]! : 0;\n }\n this.updateBounds();\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, this.data, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 28, 0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 28, 12);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(2, 1, gl.FLOAT, false, 28, 24);\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uSize\"]);\n }\n\n private updateBounds(): void {\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n for (let i = 0; i < this.count; i++) {\n const x = this.positions[i * 3]!, y = this.positions[i * 3 + 1]!, z = this.positions[i * 3 + 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\n /** Stream new point positions (same count keeps colors/sizes). Call `plot.refresh()` after. */\n setData(x: ArrayLike<number>, y: ArrayLike<number>, z: ArrayLike<number>): void {\n const n = Math.min(x.length, y.length, z.length, this.count);\n for (let i = 0; i < n; i++) {\n const px = x[i]!, py = y[i]!, pz = z[i]!;\n this.data[i * 7] = px; this.data[i * 7 + 1] = py; this.data[i * 7 + 2] = pz;\n this.positions[i * 3] = px; this.positions[i * 3 + 1] = py; this.positions[i * 3 + 2] = pz;\n }\n this.updateBounds();\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, this.data, this.gl.DYNAMIC_DRAW);\n }\n\n bounds3() { return this.count ? this.b3 : null; }\n\n colorInfo(): ColorInfo | null { return this.cInfo; }\n\n pickData() {\n if (!this.count) return null;\n return { positions: this.positions, label: this.labels ? (i: number) => String(this.labels![i]) : undefined };\n }\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 { parseColor, toColorCss } from \"../gl/context.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range } from \"../types.js\";\nimport type { Bounds3, ColorInfo, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface Quiver3DOptions {\n /** Arrow base points. */\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n z: ArrayLike<number>;\n /** Vector components. */\n u: ArrayLike<number>;\n v: ArrayLike<number>;\n w: ArrayLike<number>;\n /** Multiply the vectors before drawing. Default 1. */\n scale?: number;\n color?: string | Color;\n /** Color arrows by magnitude via a colormap. */\n colorBy?: { colormap?: ColormapName; domain?: Range };\n /** Arrowhead length as a fraction of the arrow. Default 0.28. */\n headSize?: number;\n name?: string;\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;\nout vec3 vColor;\nvoid main() { vColor = aColor; gl_Position = uMVP * vec4(aPos, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor, 1.0); }`;\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 norm(x: number, y: number, z: number): [number, number, number] {\n const l = Math.hypot(x, y, z) || 1;\n return [x / l, y / l, z / l];\n}\nfunction cross(a: [number, number, number], b: [number, number, number]): [number, number, number] {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\nlet counter = 0;\n\n/** A 3D vector field: each arrow is a shaft + a 4-wing arrowhead, drawn as lines. */\nexport class Quiver3DLayer implements Layer3D {\n readonly id: string;\n readonly name?: string;\n readonly colorCss?: 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 vertCount: number;\n private b3: Bounds3;\n private cInfo: ColorInfo | null = null;\n private positions: Float32Array;\n\n constructor(gl: WebGL2RenderingContext, opts: Quiver3DOptions) {\n this.id = `quiver3d-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.name = opts.name;\n const scale = opts.scale ?? 1;\n const headSize = opts.headSize ?? 0.28;\n const n = Math.min(opts.x.length, opts.y.length, opts.z.length, opts.u.length, opts.v.length, opts.w.length);\n\n const base = opts.color != null\n ? (Array.isArray(opts.color) ? (opts.color as Color) : parseColor(opts.color as string))\n : [0.5, 0.8, 1, 1] as Color;\n const cmap = opts.colorBy ? colormap(opts.colorBy.colormap ?? \"viridis\") : null;\n // Magnitudes (for colorBy).\n let lo = opts.colorBy?.domain?.[0] ?? Infinity;\n let hi = opts.colorBy?.domain?.[1] ?? -Infinity;\n const mag = (i: number) => Math.hypot(opts.u[i]!, opts.v[i]!, opts.w[i]!);\n if (cmap && !opts.colorBy?.domain) {\n for (let i = 0; i < n; i++) { const m = mag(i); if (m < lo) lo = m; if (m > hi) hi = m; }\n }\n const span = (hi - lo) || 1;\n if (cmap) this.cInfo = { colormap: opts.colorBy!.colormap ?? \"viridis\", domain: [lo, hi], label: opts.name };\n else this.colorCss = typeof opts.color === \"string\" ? opts.color : toColorCss(base);\n\n const data: number[] = [];\n this.positions = new Float32Array(n * 3);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n const bump = (x: number, y: number, z: number) => {\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 for (let i = 0; i < n; i++) {\n const bx = opts.x[i]!, by = opts.y[i]!, bz = opts.z[i]!;\n const ux = opts.u[i]! * scale, uy = opts.v[i]! * scale, uz = opts.w[i]! * scale;\n const tx = bx + ux, ty = by + uy, tz = bz + uz;\n this.positions[i * 3] = bx; this.positions[i * 3 + 1] = by; this.positions[i * 3 + 2] = bz;\n const c = cmap ? cmap((mag(i) - lo) / span) : [base[0], base[1], base[2]] as [number, number, number];\n const seg = (x0: number, y0: number, z0: number, x1: number, y1: number, z1: number) => {\n data.push(x0, y0, z0, c[0], c[1], c[2], x1, y1, z1, c[0], c[1], c[2]);\n };\n seg(bx, by, bz, tx, ty, tz); // shaft\n bump(bx, by, bz); bump(tx, ty, tz);\n // Arrowhead: 4 wings back from the tip.\n const len = Math.hypot(ux, uy, uz);\n if (len > 1e-6) {\n const dir = norm(ux, uy, uz);\n const ref: [number, number, number] = Math.abs(dir[1]) > 0.9 ? [1, 0, 0] : [0, 1, 0];\n const p1 = norm(...cross(dir, ref));\n const p2 = norm(...cross(dir, p1));\n const hl = len * headSize, hw = hl * 0.5;\n const backX = tx - dir[0] * hl, backY = ty - dir[1] * hl, backZ = tz - dir[2] * hl;\n for (const p of [p1, p2, [-p1[0], -p1[1], -p1[2]] as [number, number, number], [-p2[0], -p2[1], -p2[2]] as [number, number, number]]) {\n seg(tx, ty, tz, backX + p[0] * hw, backY + p[1] * hw, backZ + p[2] * hw);\n }\n }\n }\n\n this.vertCount = data.length / 6;\n this.b3 = { x: [minX, maxX], y: [minY, maxY], z: [minZ, maxZ] };\n\n this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.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, 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\"]);\n }\n\n bounds3() { return this.vertCount ? this.b3 : null; }\n\n colorInfo(): ColorInfo | null { return this.cInfo; }\n\n pickData() { return this.positions.length ? { positions: this.positions } : null; }\n\n draw(gl: WebGL2RenderingContext, mvp: Mat4): void {\n if (this.vertCount === 0) return;\n gl.useProgram(this.program);\n gl.uniformMatrix4fv(this.uniforms.uMVP!, false, mvp);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.LINES, 0, this.vertCount);\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, ColorInfo, 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 /** Series name (colorbar label / legend). */\n name?: string;\n /** Render the grid as a wireframe (lines) instead of a lit filled surface. */\n wireframe?: boolean;\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\n// Wireframe: per-vertex color, no lighting.\nconst WF_VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos;\nlayout(location = 1) in vec3 aColor;\nuniform mat4 uMVP;\nout vec3 vColor;\nvoid main() { vColor = aColor; gl_Position = uMVP * vec4(aPos, 1.0); }`;\n\nconst WF_FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vColor;\nout vec4 outColor;\nvoid main() { outColor = vec4(vColor, 1.0); }`;\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}\nconst wireCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getWireProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = wireCache.get(gl);\n if (!p) { p = createProgram(gl, WF_VERT, WF_FRAG); wireCache.set(gl, p); }\n return p;\n}\n\nlet counter = 0;\n\nexport class SurfaceLayer implements Layer3D {\n readonly id: string;\n readonly name?: 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 cmapName: ColormapName;\n private vDomain: Range = [0, 1];\n private wireframe: boolean;\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.wireframe = opts.wireframe ?? false;\n this.program = this.wireframe ? getWireProgram(gl) : getProgram(gl);\n this.name = opts.name;\n this.cmapName = opts.colormap ?? \"viridis\";\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 this.b3 = { x: [x0, x1], y: [vmin, vmax], z: [z0, z1] };\n this.vDomain = [vmin, vmax];\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\n if (this.wireframe) {\n // Grid lines: per interior vertex, an edge to the right + down neighbour.\n const vertL = (c: number, r: number) => {\n const [cr, cg, cb] = cmap((at(c, r) - vmin) / span);\n data.push(wx(c), at(c, r), wz(r), cr, cg, cb);\n };\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n if (c < cols - 1) { vertL(c, r); vertL(c + 1, r); }\n if (r < rows - 1) { vertL(c, r); vertL(c, r + 1); }\n }\n }\n this.vertexCount = data.length / 6;\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(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 } else {\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 this.vertexCount = data.length / 9;\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 }\n gl.bindVertexArray(null);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uLightDir\", \"uAmbient\"]);\n }\n\n bounds3() { return this.b3; }\n\n colorInfo(): ColorInfo { return { colormap: this.cmapName, domain: this.vDomain, label: this.name }; }\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 if (this.wireframe) {\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.LINES, 0, this.vertexCount);\n } else {\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 }\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, ColorInfo, Layer3D } from \"./layer3d.js\";\nimport type { Mat4 } from \"./mat4.js\";\n\nexport interface VolumeOptions {\n /** Scalar volume, length `nx*ny*nz`, indexed `x + y*nx + z*nx*ny`. */\n values: ArrayLike<number>;\n dims: [number, number, number];\n /** World extent of the volume. Defaults to unit indices. */\n extent?: { x: Range; y: Range; z: Range };\n colormap?: ColormapName;\n /** Value range mapped to the colormap + opacity. Defaults to the data min/max. */\n domain?: Range;\n /** Overall opacity multiplier. Default 1. */\n density?: number;\n name?: string;\n}\n\nconst STEPS = 160;\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec3 aPos; // world position of the box corner\nlayout(location = 1) in vec3 aLocal; // [0,1]^3 texture coord of the corner\nuniform mat4 uMVP;\nout vec3 vLocal;\nvoid main() { vLocal = aLocal; gl_Position = uMVP * vec4(aPos, 1.0); }`;\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nin vec3 vLocal;\nuniform highp sampler3D uVolume;\nuniform sampler2D uLUT;\nuniform vec3 uCamLocal;\nuniform float uDensity;\nout vec4 outColor;\n\nvoid main() {\n vec3 dir = normalize(vLocal - uCamLocal);\n vec3 invDir = 1.0 / dir;\n vec3 t0 = (vec3(0.0) - uCamLocal) * invDir;\n vec3 t1 = (vec3(1.0) - uCamLocal) * invDir;\n vec3 tmin = min(t0, t1), tmax = max(t0, t1);\n float tNear = max(max(tmin.x, tmin.y), tmin.z);\n float tFar = min(min(tmax.x, tmax.y), tmax.z);\n tNear = max(tNear, 0.0);\n if (tFar <= tNear) discard;\n\n float dt = (tFar - tNear) / float(${STEPS});\n vec4 acc = vec4(0.0);\n for (int i = 0; i < ${STEPS}; i++) {\n float t = tNear + (float(i) + 0.5) * dt;\n vec3 p = uCamLocal + dir * t;\n float v = texture(uVolume, p).r; // normalized 0..1\n vec3 col = texture(uLUT, vec2(v, 0.5)).rgb;\n float a = clamp(v * uDensity * dt * 120.0, 0.0, 1.0);\n acc.rgb += (1.0 - acc.a) * col * a;\n acc.a += (1.0 - acc.a) * a;\n if (acc.a > 0.98) break;\n }\n if (acc.a < 0.001) discard;\n outColor = acc; // premultiplied\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\n// Unit cube [0,1]^3 corners → 36 verts (position == local texcoord; scaled to world at build).\nconst CUBE_CORNERS = [\n [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1],\n];\nconst CUBE_FACES = [\n [0, 1, 2, 0, 2, 3], [4, 6, 5, 4, 7, 6], [0, 4, 5, 0, 5, 1],\n [3, 2, 6, 3, 6, 7], [0, 3, 7, 0, 7, 4], [1, 5, 6, 1, 6, 2],\n];\n\nlet counter = 0;\n\n/**\n * Direct volume rendering: GPU raymarching through a 3D texture with front-to-back\n * alpha compositing and a colormap transfer function. Draws the volume's bounding\n * box (back faces) and integrates each ray across the box interior.\n */\nexport class VolumeLayer implements Layer3D {\n readonly id: string;\n readonly name?: string;\n private gl: WebGL2RenderingContext;\n private program: WebGLProgram;\n private vao: WebGLVertexArrayObject;\n private buffer: WebGLBuffer;\n private tex: WebGLTexture;\n private lut: WebGLTexture;\n private uniforms: Record<string, WebGLUniformLocation | null>;\n private b3: Bounds3;\n private ext: { x: Range; y: Range; z: Range };\n private density: number;\n private cmapName: ColormapName;\n private vDomain: Range;\n private camLocal: [number, number, number] = [0.5, 0.5, 2];\n\n constructor(gl: WebGL2RenderingContext, opts: VolumeOptions) {\n this.id = `volume-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.name = opts.name;\n this.density = opts.density ?? 1;\n this.cmapName = opts.colormap ?? \"viridis\";\n const [nx, ny, nz] = opts.dims;\n const ex = opts.extent?.x ?? [0, nx - 1];\n const ey = opts.extent?.y ?? [0, ny - 1];\n const ez = opts.extent?.z ?? [0, nz - 1];\n this.ext = { x: ex, y: ey, z: ez };\n this.b3 = { x: ex, y: ey, z: ez };\n\n let vmin = opts.domain?.[0] ?? Infinity;\n let vmax = opts.domain?.[1] ?? -Infinity;\n if (!opts.domain) {\n for (let i = 0; i < opts.values.length; i++) { const v = opts.values[i]!; if (v < vmin) vmin = v; if (v > vmax) vmax = v; }\n }\n this.vDomain = [vmin, vmax];\n const span = vmax - vmin || 1;\n\n // R8 3D texture (normalized value), linear-filtered.\n const voxels = new Uint8Array(nx * ny * nz);\n for (let i = 0; i < voxels.length; i++) voxels[i] = Math.max(0, Math.min(255, Math.round(((opts.values[i]! - vmin) / span) * 255)));\n this.tex = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_3D, this.tex);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage3D(gl.TEXTURE_3D, 0, gl.R8, nx, ny, nz, 0, gl.RED, gl.UNSIGNED_BYTE, voxels);\n gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_3D, null);\n\n // 256×1 colormap LUT.\n const cmap = colormap(this.cmapName);\n const lutPix = new Uint8Array(256 * 4);\n for (let i = 0; i < 256; i++) {\n const [r, g, b] = cmap(i / 255);\n lutPix[i * 4] = Math.round(r * 255); lutPix[i * 4 + 1] = Math.round(g * 255); lutPix[i * 4 + 2] = Math.round(b * 255); lutPix[i * 4 + 3] = 255;\n }\n this.lut = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, this.lut);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, lutPix);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n // Box geometry: world position (extent) + [0,1] local texcoord per corner.\n const data: number[] = [];\n for (const face of CUBE_FACES) {\n for (const ci of face) {\n const c = CUBE_CORNERS[ci]!;\n const wxp = ex[0] + c[0]! * (ex[1] - ex[0]);\n const wyp = ey[0] + c[1]! * (ey[1] - ey[0]);\n const wzp = ez[0] + c[2]! * (ez[1] - ez[0]);\n data.push(wxp, wyp, wzp, c[0]!, c[1]!, c[2]!);\n }\n }\n this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.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, 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\", \"uVolume\", \"uLUT\", \"uCamLocal\", \"uDensity\"]);\n }\n\n bounds3() { return this.b3; }\n\n colorInfo(): ColorInfo { return { colormap: this.cmapName, domain: this.vDomain, label: this.name }; }\n\n /** Set the camera position in world space; converted to the volume's [0,1] local space. */\n setCamera(worldEye: [number, number, number]): void {\n const { x, y, z } = this.ext;\n this.camLocal = [\n (worldEye[0] - x[0]) / ((x[1] - x[0]) || 1),\n (worldEye[1] - y[0]) / ((y[1] - y[0]) || 1),\n (worldEye[2] - z[0]) / ((z[1] - z[0]) || 1),\n ];\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.uCamLocal!, this.camLocal[0], this.camLocal[1], this.camLocal[2]);\n gl.uniform1f(this.uniforms.uDensity!, this.density);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_3D, this.tex);\n gl.uniform1i(this.uniforms.uVolume!, 0);\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, this.lut);\n gl.uniform1i(this.uniforms.uLUT!, 1);\n\n // Translucent: composite over the scene, don't write depth, integrate each ray\n // once by keeping only back faces.\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); // premultiplied\n gl.depthMask(false);\n gl.enable(gl.CULL_FACE);\n gl.cullFace(gl.FRONT);\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLES, 0, 36);\n gl.bindVertexArray(null);\n gl.disable(gl.CULL_FACE);\n gl.depthMask(true);\n gl.disable(gl.BLEND);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n dispose(): void {\n this.gl.deleteVertexArray(this.vao);\n this.gl.deleteBuffer(this.buffer);\n this.gl.deleteTexture(this.tex);\n this.gl.deleteTexture(this.lut);\n }\n}\n","import { autoTicks, defaultFormat } from \"../axes/ticks.js\";\nimport { colormap } from \"../color/colormap.js\";\nimport { createProgram, uniformLocations } from \"../gl/program.js\";\nimport { begin3D, getSharedGL, sizeShared } from \"../gl/shared.js\";\nimport type { Range } from \"../types.js\";\nimport { Bar3DLayer, type Bar3DOptions } from \"./bar3d.js\";\nimport { Contour3DLayer, type Contour3DOptions } from \"./contour3d.js\";\nimport { IsosurfaceLayer, type IsosurfaceOptions } from \"./isosurface.js\";\nimport type { Bounds3, Layer3D } from \"./layer3d.js\";\nimport { Line3DLayer, type Line3DOptions } from \"./line3d.js\";\nimport { lookAt, multiply, perspective, scaleTranslate, transformPoint, type Mat4 } from \"./mat4.js\";\nimport { PointCloudLayer, type PointCloudOptions } from \"./pointcloud.js\";\nimport { Quiver3DLayer, type Quiver3DOptions } from \"./quiver3d.js\";\nimport { SurfaceLayer, type SurfaceOptions } from \"./surface.js\";\nimport { VolumeLayer, type VolumeOptions } from \"./volume.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 /** Plot title, drawn top-center. */\n title?: string;\n /** Show a legend of named solid-colored layers. Default false. */\n legend?: boolean;\n /** Show a colorbar for the first colormapped layer. Default true when one exists. */\n colorbar?: boolean | { label?: string };\n /** Hover tooltip on the nearest pickable point. Default true. */\n hover?: boolean;\n /** Show a reset-view (home) button. Default true. */\n resetButton?: boolean;\n /** Draw grid lines on the back walls of the cube. Default true. */\n gridPlanes?: boolean;\n /** Auto-orbit the camera: `true` for a default speed, or radians/frame. Default off. */\n autoRotate?: boolean | number;\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 /** Tick positions in cube space [-1,1], per axis, for the grid planes. */\n private tickCube: { x: number[]; y: number[]; z: number[] } = { x: [], y: [], z: [] };\n private gridPlanes: boolean;\n private gridVao: WebGLVertexArrayObject | null = null;\n private gridBuf: WebGLBuffer | null = null;\n /** Normalize params (world→cube: `cube = s*world + t`), for the volume camera. */\n private norm = { sx: 1, sy: 1, sz: 1, tx: 0, ty: 0, tz: 0 };\n /** Auto-orbit speed (rad/frame); 0 = off. Paused while the pointer is down. */\n private autoRotateSpeed = 0;\n private rotating = false;\n private interacting = false;\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 // Chrome.\n private title?: string;\n private showLegend: boolean;\n private colorbarOpt: boolean | { label?: string };\n private legendDiv: HTMLDivElement;\n private colorbarDiv: HTMLDivElement;\n private tooltip: HTMLDivElement;\n private resetBtn: HTMLButtonElement | null = null;\n private hoverEnabled: boolean;\n /** Screen position (device px) of the picked point, for the highlight ring. */\n private hoverHit: { sx: number; sy: number } | null = null;\n /** Initial camera, restored by {@link resetView}. */\n private initialAz: number;\n private initialEl: number;\n private initialDist: number;\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.initialAz = this.azimuth;\n this.initialEl = this.elevation;\n this.initialDist = this.distance;\n this.axisLabels = options.axisLabels ?? {};\n this.title = options.title;\n this.showLegend = options.legend ?? false;\n this.colorbarOpt = options.colorbar ?? true;\n this.hoverEnabled = options.hover !== false;\n this.gridPlanes = options.gridPlanes !== false;\n\n // Legend + colorbar DOM overlays.\n this.legendDiv = document.createElement(\"div\");\n Object.assign(this.legendDiv.style, {\n position: \"absolute\", top: \"8px\", right: \"8px\", zIndex: \"5\", display: \"none\",\n pointerEvents: \"none\", padding: \"6px 8px\", borderRadius: \"6px\",\n font: \"12px system-ui, sans-serif\", lineHeight: \"1.5\",\n background: \"rgba(15,23,42,0.8)\", color: \"#e2e8f0\",\n border: \"1px solid rgba(148,163,184,0.25)\",\n } as CSSStyleDeclaration);\n container.appendChild(this.legendDiv);\n this.colorbarDiv = document.createElement(\"div\");\n Object.assign(this.colorbarDiv.style, {\n position: \"absolute\", bottom: \"12px\", right: \"10px\", zIndex: \"5\", display: \"none\",\n pointerEvents: \"none\", font: \"10px system-ui, sans-serif\", color: \"#cbd5e1\",\n textAlign: \"center\",\n } as CSSStyleDeclaration);\n container.appendChild(this.colorbarDiv);\n\n // Hover tooltip.\n this.tooltip = document.createElement(\"div\");\n Object.assign(this.tooltip.style, {\n position: \"absolute\", display: \"none\", zIndex: \"6\", pointerEvents: \"none\",\n padding: \"5px 7px\", borderRadius: \"6px\", font: \"12px system-ui, sans-serif\",\n whiteSpace: \"nowrap\", background: \"rgba(15,23,42,0.92)\", color: \"#e2e8f0\",\n border: \"1px solid rgba(148,163,184,0.3)\", boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n } as CSSStyleDeclaration);\n container.appendChild(this.tooltip);\n\n // Reset-view (home) button.\n if (options.resetButton !== false) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.title = \"Reset view\";\n btn.textContent = \"⌂\";\n Object.assign(btn.style, {\n position: \"absolute\", bottom: \"8px\", left: \"8px\", zIndex: \"6\",\n width: \"26px\", height: \"26px\", padding: \"0\", cursor: \"pointer\",\n borderRadius: \"6px\", font: \"15px system-ui, sans-serif\", lineHeight: \"24px\",\n background: \"rgba(15,23,42,0.8)\", color: \"#cbd5e1\",\n border: \"1px solid rgba(148,163,184,0.25)\",\n } as CSSStyleDeclaration);\n btn.addEventListener(\"click\", () => this.resetView());\n container.appendChild(btn);\n this.resetBtn = btn;\n }\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 this.gridVao = this.gl.createVertexArray()!;\n this.gridBuf = this.gl.createBuffer()!;\n this.bindLineVao(this.gridVao, this.gridBuf, 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 if (options.autoRotate) this.setAutoRotate(options.autoRotate);\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 /** A 3D polyline / path. */\n addLine3D(opts: Line3DOptions): Line3DLayer {\n const l = new Line3DLayer(this.gl, opts);\n this.layers.push(l);\n this.recompute();\n this.requestRender();\n return l;\n }\n\n /** 3D bars (columns) on an x/z grid, lit and optionally colormapped. */\n addBar3D(opts: Bar3DOptions): Bar3DLayer {\n const l = new Bar3DLayer(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 /** A 3D vector field (arrows), optionally colored by magnitude. */\n addQuiver3D(opts: Quiver3DOptions): Quiver3DLayer {\n const l = new Quiver3DLayer(this.gl, opts);\n this.layers.push(l);\n this.recompute();\n this.requestRender();\n return l;\n }\n\n /** 3D iso-height contour lines of a grid, stacked at their level heights. */\n addContour3D(opts: Contour3DOptions): Contour3DLayer {\n const l = new Contour3DLayer(this.gl, opts);\n this.layers.push(l);\n this.recompute();\n this.requestRender();\n return l;\n }\n\n /** A marching-cubes isosurface of a 3D scalar volume (lit, solid-colored). */\n addIsosurface(opts: IsosurfaceOptions): IsosurfaceLayer {\n const l = new IsosurfaceLayer(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 /** Direct volume rendering (GPU raymarch) of a 3D scalar field. */\n addVolume(opts: VolumeOptions): VolumeLayer {\n const l = new VolumeLayer(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 /** Auto-orbit the camera. `true` = default speed, number = radians/frame, `false`/0 stops. */\n setAutoRotate(speed: number | boolean): void {\n this.autoRotateSpeed = speed === true ? 0.006 : speed === false ? 0 : speed;\n if (this.autoRotateSpeed !== 0 && !this.rotating) {\n this.rotating = true;\n const loop = () => {\n if (this.autoRotateSpeed === 0) { this.rotating = false; return; }\n if (!this.interacting) { this.azimuth += this.autoRotateSpeed; this.render(); }\n requestAnimationFrame(loop);\n };\n requestAnimationFrame(loop);\n }\n }\n\n /** Restore the initial camera orientation and zoom. */\n resetView(): void {\n this.azimuth = this.initialAz;\n this.elevation = this.initialEl;\n this.distance = this.initialDist;\n this.requestRender();\n }\n\n /** Nearest pickable point to the cursor. Screen coords are device px. */\n private pick(clientX: number, clientY: number): { label: string; sx: number; sy: number } | null {\n const { mvp } = this.viewProj();\n const w = this.canvas.width, h = this.canvas.height;\n const rect = this.canvas.getBoundingClientRect();\n const cx = (clientX - rect.left) * this.dpr;\n const cy = (clientY - rect.top) * this.dpr;\n const gate = 14 * this.dpr;\n let bestD = gate * gate;\n let best: { label: string; sx: number; sy: number } | null = null;\n for (const l of this.layers) {\n const pd = l.pickData?.();\n if (!pd) continue;\n const pos = pd.positions;\n const n = pos.length / 3;\n for (let i = 0; i < n; i++) {\n const c = transformPoint(mvp, pos[i * 3]!, pos[i * 3 + 1]!, pos[i * 3 + 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 const dx = sx - cx, dy = sy - cy;\n const d = dx * dx + dy * dy;\n if (d < bestD) {\n bestD = d;\n best = {\n sx, sy,\n label: pd.label\n ? pd.label(i)\n : `${defaultFormat(pos[i * 3]!)}, ${defaultFormat(pos[i * 3 + 1]!)}, ${defaultFormat(pos[i * 3 + 2]!)}`,\n };\n }\n }\n }\n return best;\n }\n\n /** Show/hide the hover tooltip + highlight ring for the point under the cursor. */\n private updateHover(clientX: number, clientY: number): void {\n if (!this.hoverEnabled) return;\n const hit = this.pick(clientX, clientY);\n const had = this.hoverHit !== null;\n if (!hit) {\n this.tooltip.style.display = \"none\";\n if (had) { this.hoverHit = null; this.requestRender(); }\n return;\n }\n this.hoverHit = { sx: hit.sx, sy: hit.sy };\n this.requestRender(); // redraw so the highlight ring tracks the point\n const rect = this.canvas.getBoundingClientRect();\n this.tooltip.textContent = hit.label;\n this.tooltip.style.display = \"block\";\n const lx = clientX - rect.left, ly = clientY - rect.top;\n const cw = this.container.clientWidth, ch = this.container.clientHeight;\n const tw = this.tooltip.offsetWidth, th = this.tooltip.offsetHeight;\n let left = lx + 14; if (left + tw > cw) left = lx - tw - 14;\n let top = ly + 14; if (top + th > ch) top = ly - th - 14;\n this.tooltip.style.left = `${Math.max(0, left)}px`;\n this.tooltip.style.top = `${Math.max(0, top)}px`;\n }\n\n /** Remove a layer, re-fit, and redraw. */\n removeLayer(layer: Layer3D): void {\n const i = this.layers.indexOf(layer);\n if (i >= 0) {\n this.layers.splice(i, 1);\n layer.dispose();\n this.recompute();\n this.requestRender();\n }\n }\n\n /** Re-fit the axes to the data and redraw — call after a layer's `setData(...)`. */\n refresh(): void {\n this.recompute();\n this.requestRender();\n }\n\n destroy(): void {\n this.resizeObserver.disconnect();\n this.autoRotateSpeed = 0; // stop the orbit loop\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 if (this.gridVao) this.gl.deleteVertexArray(this.gridVao);\n this.gl.deleteBuffer(this.boxBuf);\n this.gl.deleteBuffer(this.tickBuf);\n if (this.gridBuf) this.gl.deleteBuffer(this.gridBuf);\n this.controlsEl?.remove();\n this.legendDiv.remove();\n this.colorbarDiv.remove();\n this.tooltip.remove();\n this.resetBtn?.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.norm = { 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 tc: { x: number[]; y: number[]; z: number[] } = { x: [], y: [], z: [] };\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 tc.x.push(cx);\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 tc.y.push(cy);\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 tc.z.push(cz);\n mark(-1, -1, cz, -1.06, -1, cz);\n labels.push({ p: [-1.16, -1, cz], text: defaultFormat(t.value) });\n }\n this.tickCube = tc;\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; eye: [number, number, number] } {\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), eye };\n }\n\n /** Build + draw grid lines on the 3 back walls (cube space) for the current eye. */\n private drawGridPlanes(vp: Mat4, eye: [number, number, number]): void {\n const tc = this.tickCube;\n if (!this.gridVao || (tc.x.length + tc.y.length + tc.z.length) === 0) return;\n const sx = eye[0] > 0 ? -1 : 1; // grid on the far wall so data stays unobscured\n const sy = eye[1] > 0 ? -1 : 1;\n const sz = eye[2] > 0 ? -1 : 1;\n const seg: number[] = [];\n const L = (x0: number, y0: number, z0: number, x1: number, y1: number, z1: number) =>\n seg.push(x0, y0, z0, x1, y1, z1);\n // Plane ⟂ X (at x=sx): lines of constant y (vary z) and constant z (vary y).\n for (const cy of tc.y) L(sx, cy, -1, sx, cy, 1);\n for (const cz of tc.z) L(sx, -1, cz, sx, 1, cz);\n // Plane ⟂ Y (floor/ceiling, at y=sy).\n for (const cx of tc.x) L(cx, sy, -1, cx, sy, 1);\n for (const cz of tc.z) L(-1, sy, cz, 1, sy, cz);\n // Plane ⟂ Z (at z=sz).\n for (const cx of tc.x) L(cx, -1, sz, cx, 1, sz);\n for (const cy of tc.y) L(-1, cy, sz, 1, cy, sz);\n\n const gl = this.gl;\n gl.bindVertexArray(this.gridVao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.gridBuf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(seg), gl.DYNAMIC_DRAW);\n gl.uniformMatrix4fv(this.lineUniforms.uVP!, false, vp);\n gl.uniform4f(this.lineUniforms.uColor!, 0.55, 0.6, 0.72, 0.22);\n gl.drawArrays(gl.LINES, 0, seg.length / 3);\n gl.bindVertexArray(null);\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, eye } = this.viewProj();\n\n gl.useProgram(this.lineProgram);\n // Back-wall grid planes (behind the data).\n if (this.gridPlanes) this.drawGridPlanes(vp, eye);\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 // Camera in world space (volume layers raymarch in their local [0,1] space).\n const n = this.norm;\n const worldEye: [number, number, number] = [(eye[0] - n.tx) / n.sx, (eye[1] - n.ty) / n.sy, (eye[2] - n.tz) / n.sz];\n for (const l of this.layers) {\n if (\"setCamera\" in l) (l as VolumeLayer).setCamera(worldEye);\n l.draw(gl, mvp);\n }\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 if (this.title) {\n const ctx = this.displayCtx;\n ctx.save();\n ctx.font = `600 ${15 * this.dpr}px system-ui, sans-serif`;\n ctx.fillStyle = \"#e2e8f0\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.fillText(this.title, w / 2, 10 * this.dpr);\n ctx.restore();\n }\n if (this.hoverHit) {\n const ctx = this.displayCtx;\n ctx.save();\n ctx.strokeStyle = \"#e2e8f0\";\n ctx.lineWidth = 2 * this.dpr;\n ctx.beginPath();\n ctx.arc(this.hoverHit.sx, this.hoverHit.sy, 7 * this.dpr, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n }\n this.updateLegend();\n this.updateColorbar();\n }\n\n /** DOM legend of named, solid-colored layers. */\n private updateLegend(): void {\n const div = this.legendDiv;\n const entries = this.showLegend\n ? this.layers.filter((l): l is Layer3D & { name: string; colorCss: string } =>\n typeof l.name === \"string\" && !!l.name && typeof l.colorCss === \"string\")\n : [];\n if (entries.length === 0) { div.style.display = \"none\"; return; }\n div.replaceChildren();\n for (const e of entries) {\n const row = document.createElement(\"div\");\n Object.assign(row.style, { display: \"flex\", alignItems: \"center\", gap: \"6px\" } as CSSStyleDeclaration);\n const sw = document.createElement(\"span\");\n Object.assign(sw.style, { width: \"10px\", height: \"10px\", borderRadius: \"2px\", background: e.colorCss, flex: \"0 0 auto\" } as CSSStyleDeclaration);\n const label = document.createElement(\"span\");\n label.textContent = e.name;\n row.appendChild(sw); row.appendChild(label);\n div.appendChild(row);\n }\n div.style.display = \"block\";\n }\n\n /** DOM colorbar for the first colormapped layer (gradient + value range). */\n private updateColorbar(): void {\n const div = this.colorbarDiv;\n if (this.colorbarOpt === false) { div.style.display = \"none\"; return; }\n let info = null as ReturnType<NonNullable<Layer3D[\"colorInfo\"]>> | null;\n for (const l of this.layers) {\n const ci = l.colorInfo?.();\n if (ci) { info = ci; break; }\n }\n if (!info) { div.style.display = \"none\"; return; }\n const cmap = colormap(info.colormap);\n // 12-stop CSS gradient. `to top` puts 0% at the bottom, so cmap(t) at t·100%\n // makes the high value (cmap(1)) sit at the top, matching the tick labels.\n const stops: string[] = [];\n for (let i = 0; i <= 12; i++) {\n const t = i / 12;\n const [r, g, b] = cmap(t);\n stops.push(`rgb(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)}) ${t * 100}%`);\n }\n const label = (typeof this.colorbarOpt === \"object\" ? this.colorbarOpt.label : undefined) ?? info.label;\n div.replaceChildren();\n if (label) {\n const cap = document.createElement(\"div\");\n cap.textContent = label;\n cap.style.marginBottom = \"3px\";\n div.appendChild(cap);\n }\n const rowWrap = document.createElement(\"div\");\n Object.assign(rowWrap.style, { display: \"flex\", alignItems: \"stretch\", gap: \"4px\", justifyContent: \"flex-end\" } as CSSStyleDeclaration);\n const bar = document.createElement(\"div\");\n Object.assign(bar.style, {\n width: \"10px\", height: \"90px\", borderRadius: \"2px\",\n background: `linear-gradient(to top, ${stops.join(\",\")})`,\n border: \"1px solid rgba(148,163,184,0.3)\",\n } as CSSStyleDeclaration);\n const ticks = document.createElement(\"div\");\n Object.assign(ticks.style, { display: \"flex\", flexDirection: \"column\", justifyContent: \"space-between\" } as CSSStyleDeclaration);\n const hi = document.createElement(\"span\"); hi.textContent = defaultFormat(info.domain[1]);\n const mid = document.createElement(\"span\"); mid.textContent = defaultFormat((info.domain[0] + info.domain[1]) / 2);\n const lo = document.createElement(\"span\"); lo.textContent = defaultFormat(info.domain[0]);\n ticks.appendChild(hi); ticks.appendChild(mid); ticks.appendChild(lo);\n rowWrap.appendChild(ticks); rowWrap.appendChild(bar);\n div.appendChild(rowWrap);\n div.style.display = \"block\";\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; this.interacting = true; lastX = e.clientX; lastY = e.clientY;\n el.setPointerCapture(e.pointerId); el.style.cursor = \"grabbing\";\n this.tooltip.style.display = \"none\"; // no hover while orbiting\n this.hoverHit = null;\n });\n el.addEventListener(\"pointermove\", (e) => {\n if (!dragging) {\n this.updateHover(e.clientX, e.clientY);\n return;\n }\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 el.addEventListener(\"pointerleave\", () => {\n this.tooltip.style.display = \"none\";\n if (this.hoverHit) { this.hoverHit = null; this.requestRender(); }\n });\n const end = (e: PointerEvent) => {\n dragging = false; this.interacting = 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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;AAAA,EAAO;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAC3G;AAGA,IAAM,YAAY;AAAA,EAChB,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EAChI,CAAC,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,EACnM,CAAC,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACrM,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,EAC7Q,CAAC,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACrM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,EACzQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACzO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC;AAAA,EAAG,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,EAC9S,CAAC,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACrM,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC;AAAA,EACxQ,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAC7Q,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EACnV,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAC5O,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAC3S,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACnR,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,CAAC;AAAA,EAC5S,CAAC,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAC/M,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,EACjQ,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACxR,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAC9P,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EACtR,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAC1U,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EACjU,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,IAAI,GAAG,CAAC;AAAA,EAC5P,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAC1R,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAC5P,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EACrU,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,CAAC;AAAA,EAC5P,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,EAAG,CAAC,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACtU,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,EAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG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","names":["norm","fmt","VERT","FRAG","programCache","getProgram","counter","lo","hi","bins","norm","VERT","FRAG","programCache","getProgram","counter","FRAG","medianSpacing","counter","VERT","FRAG","programCache","getProgram","counter","SEG_CORNERS","cache","programs","counter","SOLID_FRAG","programCache","counter","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter","programCache","VERT","FRAG","CORNERS","programCache","getProgram","counter","area","programCache","counter","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","VERT","FRAG","programCache","getProgram","medianSpacing","counter","CASES","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter","normalize","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","cross","counter","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter"]}
|