@photonviz/core 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +666 -5
- package/dist/index.js +1978 -727
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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/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"]}
|
|
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/layers/ohlc.ts","../src/color/colormap.ts","../src/layers/contour.ts","../src/layers/errorbar.ts","../src/graph/force.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/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","../src/finance/indicators.ts","../src/finance/transforms.ts","../src/finance/charts.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","import type { RenderType } from \"../types.js\";\n\n/** Map a layer's {@link RenderType} to a WebGL buffer-usage hint (default STATIC_DRAW). */\nexport function bufferUsage(gl: WebGL2RenderingContext, renderType?: RenderType): number {\n return renderType === \"dynamic\" ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n}\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 usage: 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: 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 this.usage = bufferUsage(gl, opts.renderType);\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, this.usage);\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.usage);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /**\n * Per-bar colors (overrides {@link color}). Handy for tinting each bar — e.g.\n * volume bars green/red by the candle's direction. Length should match `x`.\n */\n colors?: Array<string | Color>;\n /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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\nlayout(location = 2) in vec4 aColor; // per-bar color\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\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 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 toColor(input: string | Color): Color {\n return Array.isArray(input) ? (input as Color) : parseColor(input as string);\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 colorsInput?: Array<string | Color>;\n private usage: number;\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 this.usage = bufferUsage(gl, opts.renderType);\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 this.colorsInput = opts.colors;\n const colors = this.buildColors(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, this.usage);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, 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, this.usage);\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 = [cornerBuf, rectBuf, colorBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS]);\n }\n\n /** Per-bar color array (each bar uses its `colors[i]` or falls back to `color`). */\n private buildColors(n: number): Float32Array {\n const arr = new Float32Array(n * 4);\n const per = this.colorsInput;\n for (let i = 0; i < n; i++) {\n const c = per && per[i] != null ? toColor(per[i]!) : this.color;\n arr[i * 4] = c[0]; arr[i * 4 + 1] = c[1]; arr[i * 4 + 2] = c[2]; arr[i * 4 + 3] = c[3];\n }\n return arr;\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 optionally per-bar colors) and re-upload for streaming. */\n setData(\n x: ArrayLike<number>, y: ArrayLike<number>,\n base?: number | ArrayLike<number>, colors?: Array<string | Color>,\n ): 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.usage);\n if (colors !== undefined) this.colorsInput = colors;\n const colorArr = this.buildColors(n);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffers[2]!);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, colorArr, this.usage);\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.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 { bufferUsage, 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, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 = 0;\n private lineStart = 0;\n private lineCount = 0;\n private pointStart = 0;\n private pointCount = 0;\n // Styling captured at construction, reused by setData.\n private width: number;\n private showBox: boolean;\n private showViolin: boolean;\n private usage: number;\n\n constructor(gl: WebGL2RenderingContext, opts: BoxOptions) {\n this.id = `box-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.usage = bufferUsage(gl, opts.renderType);\n this.yAxis = opts.yAxis ?? \"y\";\n\n this.width = opts.width ?? 0.6;\n this.showBox = opts.box !== false;\n this.showViolin = opts.violin === true;\n\n const all = this.build(opts.groups);\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, all, this.usage);\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 /** Build box/whisker/violin geometry from the groups; sets refs, bounds and draw ranges. */\n private build(groups: BoxGroup[]): Float32Array {\n const hw = this.width / 2;\n const showBox = this.showBox;\n const showViolin = this.showViolin;\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 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 return new Float32Array([...tris.data, ...lines.data, ...points.data]);\n }\n\n /** Replace the box groups and rebuild the geometry (for streaming). */\n setData(groups: BoxGroup[], width?: number): void {\n if (width != null) this.width = width;\n const all = this.build(groups);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, all, this.usage);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\n name?: string;\n yAxis?: string;\n}\n\n/** The OHLC of a single candle — used by {@link CandlestickLayer.updateLast}/`appendCandle`. */\nexport interface Candle {\n x: number;\n open: number;\n high: number;\n low: number;\n close: number;\n}\n\n/** New OHLC arrays for {@link CandlestickLayer.setData} (colors/width stay fixed). */\nexport interface CandlestickData {\n x: ArrayLike<number>;\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n /** Optional new body width; keeps the previous width if omitted. */\n width?: number;\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 usage: number;\n private up: Color;\n private down: Color;\n /** Body width in data units (median-derived unless the user fixed it). */\n private bodyWidth = 1;\n private explicitWidth: number | undefined;\n // Retained OHLC (plain arrays so streaming can mutate/grow in place).\n private xs: number[] = [];\n private os: number[] = [];\n private hs: number[] = [];\n private ls: number[] = [];\n private cs: number[] = [];\n private rects = new Float32Array(0);\n private wicks = new Float32Array(0);\n private colors = new Float32Array(0);\n private count = 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: 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 this.usage = bufferUsage(gl, opts.renderType);\n\n this.up = toColor(opts.upColor ?? \"#26a69a\");\n this.down = toColor(opts.downColor ?? \"#ef5350\");\n this.colorCss = toColorCss(this.up);\n\n this.explicitWidth = opts.width;\n this.ingest(opts);\n this.rebuild();\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, this.rects, this.usage);\n const wickBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, wickBuf);\n gl.bufferData(gl.ARRAY_BUFFER, this.wicks, this.usage);\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, this.colors, this.usage);\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 /** Copy the incoming OHLC arrays into the retained plain arrays. */\n private ingest(d: CandlestickData): void {\n const n = Math.min(d.x.length, d.open.length, d.high.length, d.low.length, d.close.length);\n this.xs = Array.from({ length: n }, (_, i) => d.x[i]!);\n this.os = Array.from({ length: n }, (_, i) => d.open[i]!);\n this.hs = Array.from({ length: n }, (_, i) => d.high[i]!);\n this.ls = Array.from({ length: n }, (_, i) => d.low[i]!);\n this.cs = Array.from({ length: n }, (_, i) => d.close[i]!);\n if (d.width != null) this.explicitWidth = d.width;\n }\n\n /** Write candle `i`'s body rect, wick segment and up/down color into the arrays. */\n private emitCandle(i: number): void {\n const cx = this.xs[i]!, o = this.os[i]!, h = this.hs[i]!, l = this.ls[i]!, c = this.cs[i]!;\n const x0 = cx - this.bodyWidth / 2, x1 = cx + this.bodyWidth / 2;\n const r = this.rects, wk = this.wicks, col = this.colors;\n r[i * 4] = x0 - this.xRef; r[i * 4 + 1] = o - this.yRef;\n r[i * 4 + 2] = x1 - this.xRef; r[i * 4 + 3] = c - this.yRef;\n wk[i * 4] = cx - this.xRef; wk[i * 4 + 1] = l - this.yRef;\n wk[i * 4 + 2] = cx - this.xRef; wk[i * 4 + 3] = h - this.yRef;\n const cc = c >= o ? this.up : this.down;\n col[i * 4] = cc[0]; col[i * 4 + 1] = cc[1]; col[i * 4 + 2] = cc[2]; col[i * 4 + 3] = cc[3];\n }\n\n /** Recompute width/refs/bounds and refill the vertex arrays from the retained OHLC. */\n private rebuild(): void {\n const n = this.xs.length;\n this.count = n;\n this.bodyWidth = this.explicitWidth ?? medianSpacing(this.xs, n) * 0.7;\n this.rects = new Float32Array(n * 4);\n this.wicks = new Float32Array(n * 4);\n this.colors = new Float32Array(n * 4);\n this.xRef = n > 0 ? this.xs[0]! : 0;\n this.yRef = n > 0 ? this.os[0]! : 0;\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n this.emitCandle(i);\n minX = Math.min(minX, this.xs[i]! - this.bodyWidth / 2);\n maxX = Math.max(maxX, this.xs[i]! + this.bodyWidth / 2);\n minY = Math.min(minY, this.ls[i]!);\n maxY = Math.max(maxY, this.hs[i]!);\n }\n this.xBounds = n > 0 ? [minX, maxX] : [0, 0];\n this.yBounds = n > 0 ? [minY, maxY] : [0, 0];\n }\n\n /** Re-upload all three per-candle buffers (after a full rebuild). */\n private upload(): void {\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[2]!);\n gl.bufferData(gl.ARRAY_BUFFER, this.rects, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[3]!);\n gl.bufferData(gl.ARRAY_BUFFER, this.wicks, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[4]!);\n gl.bufferData(gl.ARRAY_BUFFER, this.colors, this.usage);\n }\n\n /** Replace every candle and re-upload (for streaming a whole new window). */\n setData(data: CandlestickData): void {\n this.ingest(data);\n this.rebuild();\n this.upload();\n }\n\n /**\n * Append one new candle (grows the series). Prefer {@link updateLast} for the\n * in-progress candle and `appendCandle` only when a bar closes and a new one opens.\n */\n appendCandle(c: Candle): void {\n this.xs.push(c.x); this.os.push(c.open); this.hs.push(c.high);\n this.ls.push(c.low); this.cs.push(c.close);\n this.rebuild();\n this.upload();\n }\n\n /**\n * Update the most recent candle in place — the cheap hot path for a live\n * (forming) bar. Only that candle's 12 floats are re-uploaded; bounds are\n * extended (never shrunk) to include it. No-op when the series is empty.\n */\n updateLast(c: Candle): void {\n const i = this.xs.length - 1;\n if (i < 0) return;\n this.xs[i] = c.x; this.os[i] = c.open; this.hs[i] = c.high;\n this.ls[i] = c.low; this.cs[i] = c.close;\n this.emitCandle(i);\n const gl = this.gl, off = i * 4;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[2]!);\n gl.bufferSubData(gl.ARRAY_BUFFER, off * 4, this.rects.subarray(off, off + 4));\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[3]!);\n gl.bufferSubData(gl.ARRAY_BUFFER, off * 4, this.wicks.subarray(off, off + 4));\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[4]!);\n gl.bufferSubData(gl.ARRAY_BUFFER, off * 4, this.colors.subarray(off, off + 4));\n this.xBounds = [\n Math.min(this.xBounds[0], c.x - this.bodyWidth / 2),\n Math.max(this.xBounds[1], c.x + this.bodyWidth / 2),\n ];\n this.yBounds = [Math.min(this.yBounds[0], c.low), Math.max(this.yBounds[1], c.high)];\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","import { parseColor, toColorCss } from \"../gl/context.js\";\nimport { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } from \"../types.js\";\nimport type { Candle, CandlestickData } from \"./candlestick.js\";\nimport type { DrawState, Layer } from \"./layer.js\";\n\n/**\n * An OHLC bar chart — the western cousin of the candlestick. Each period is a\n * vertical low→high line with a left tick at the open and a right tick at the\n * close, colored up/down by direction. Streams like {@link CandlestickLayer}.\n */\nexport interface OhlcOptions {\n /** Bar 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 /** Total tick span in data units (each open/close tick is half of this). Default 70% of 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 /** Line thickness in CSS px. Default 1.5. */\n lineWidth?: number;\n /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\n name?: string;\n yAxis?: string;\n}\n\n// Pixel-thick data-space segment, per-segment color (same idea as the candle wick).\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\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 SEG_CORNERS = new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]);\nconst SEGS_PER_BAR = 3; // vertical low→high, open tick (left), close tick (right)\n\nconst programCache = new WeakMap<WebGL2RenderingContext, WebGLProgram>();\nfunction getProgram(gl: WebGL2RenderingContext): WebGLProgram {\n let p = programCache.get(gl);\n if (!p) { p = createProgram(gl, SEG_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\nfunction toColor(input: string | Color): Color {\n return Array.isArray(input) ? (input as Color) : parseColor(input as string);\n}\n\nlet counter = 0;\n\nexport class OhlcLayer 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 lineWidth: number;\n private usage: number;\n private up: Color;\n private down: Color;\n private barWidth = 1;\n private explicitWidth: number | undefined;\n private xs: number[] = [];\n private os: number[] = [];\n private hs: number[] = [];\n private ls: number[] = [];\n private cs: number[] = [];\n private segs = new Float32Array(0);\n private colors = new Float32Array(0);\n private count = 0; // number of bars\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: OhlcOptions) {\n this.id = `ohlc-${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.lineWidth = opts.lineWidth ?? 1.5;\n this.usage = bufferUsage(gl, opts.renderType);\n this.up = toColor(opts.upColor ?? \"#26a69a\");\n this.down = toColor(opts.downColor ?? \"#ef5350\");\n this.colorCss = toColorCss(this.up);\n this.explicitWidth = opts.width;\n this.ingest(opts);\n this.rebuild();\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, SEG_CORNERS, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n const segBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, segBuf);\n gl.bufferData(gl.ARRAY_BUFFER, this.segs, this.usage);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 4, 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, this.colors, this.usage);\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 = [cornerBuf, segBuf, colorBuf];\n\n this.uniforms = uniformLocations(gl, this.program, [...TRANSFORM_UNIFORMS, \"uResolution\", \"uWidth\"]);\n }\n\n private ingest(d: CandlestickData): void {\n const n = Math.min(d.x.length, d.open.length, d.high.length, d.low.length, d.close.length);\n this.xs = Array.from({ length: n }, (_, i) => d.x[i]!);\n this.os = Array.from({ length: n }, (_, i) => d.open[i]!);\n this.hs = Array.from({ length: n }, (_, i) => d.high[i]!);\n this.ls = Array.from({ length: n }, (_, i) => d.low[i]!);\n this.cs = Array.from({ length: n }, (_, i) => d.close[i]!);\n if (d.width != null) this.explicitWidth = d.width;\n }\n\n /** Write bar `i`'s three segments (+ colors) at instance base `i * SEGS_PER_BAR`. */\n private emitBar(i: number): void {\n const cx = this.xs[i]!, o = this.os[i]!, h = this.hs[i]!, l = this.ls[i]!, c = this.cs[i]!;\n const half = this.barWidth / 2;\n const s = this.segs, col = this.colors;\n const b = i * SEGS_PER_BAR * 4;\n // vertical low→high\n s[b] = cx - this.xRef; s[b + 1] = l - this.yRef; s[b + 2] = cx - this.xRef; s[b + 3] = h - this.yRef;\n // open tick (left)\n s[b + 4] = cx - half - this.xRef; s[b + 5] = o - this.yRef; s[b + 6] = cx - this.xRef; s[b + 7] = o - this.yRef;\n // close tick (right)\n s[b + 8] = cx - this.xRef; s[b + 9] = c - this.yRef; s[b + 10] = cx + half - this.xRef; s[b + 11] = c - this.yRef;\n const cc = c >= o ? this.up : this.down;\n for (let k = 0; k < SEGS_PER_BAR; k++) {\n const o4 = (i * SEGS_PER_BAR + k) * 4;\n col[o4] = cc[0]; col[o4 + 1] = cc[1]; col[o4 + 2] = cc[2]; col[o4 + 3] = cc[3];\n }\n }\n\n private rebuild(): void {\n const n = this.xs.length;\n this.count = n;\n this.barWidth = this.explicitWidth ?? medianSpacing(this.xs, n) * 0.7;\n this.segs = new Float32Array(n * SEGS_PER_BAR * 4);\n this.colors = new Float32Array(n * SEGS_PER_BAR * 4);\n this.xRef = n > 0 ? this.xs[0]! : 0;\n this.yRef = n > 0 ? this.os[0]! : 0;\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n this.emitBar(i);\n minX = Math.min(minX, this.xs[i]! - this.barWidth / 2);\n maxX = Math.max(maxX, this.xs[i]! + this.barWidth / 2);\n minY = Math.min(minY, this.ls[i]!);\n maxY = Math.max(maxY, this.hs[i]!);\n }\n this.xBounds = n > 0 ? [minX, maxX] : [0, 0];\n this.yBounds = n > 0 ? [minY, maxY] : [0, 0];\n }\n\n private upload(): void {\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[1]!);\n gl.bufferData(gl.ARRAY_BUFFER, this.segs, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[2]!);\n gl.bufferData(gl.ARRAY_BUFFER, this.colors, this.usage);\n }\n\n /** Replace every bar and re-upload (for streaming a whole new window). */\n setData(data: CandlestickData): void {\n this.ingest(data);\n this.rebuild();\n this.upload();\n }\n\n /** Append one new bar (grows the series). */\n appendCandle(c: Candle): void {\n this.xs.push(c.x); this.os.push(c.open); this.hs.push(c.high);\n this.ls.push(c.low); this.cs.push(c.close);\n this.rebuild();\n this.upload();\n }\n\n /** Update the most recent bar in place — the cheap hot path for a live bar. */\n updateLast(c: Candle): void {\n const i = this.xs.length - 1;\n if (i < 0) return;\n this.xs[i] = c.x; this.os[i] = c.open; this.hs[i] = c.high;\n this.ls[i] = c.low; this.cs[i] = c.close;\n this.emitBar(i);\n const gl = this.gl, off = i * SEGS_PER_BAR * 4;\n const span = SEGS_PER_BAR * 4;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[1]!);\n gl.bufferSubData(gl.ARRAY_BUFFER, off * 4, this.segs.subarray(off, off + span));\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[2]!);\n gl.bufferSubData(gl.ARRAY_BUFFER, off * 4, this.colors.subarray(off, off + span));\n this.xBounds = [\n Math.min(this.xBounds[0], c.x - this.barWidth / 2),\n Math.max(this.xBounds[1], c.x + this.barWidth / 2),\n ];\n this.yBounds = [Math.min(this.yBounds[0], c.low), Math.max(this.yBounds[1], c.high)];\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.uniform2f(this.uniforms.uResolution!, state.pixelWidth, state.pixelHeight);\n gl.uniform1f(this.uniforms.uWidth!, this.lineWidth * state.dpr);\n gl.bindVertexArray(this.vao);\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count * SEGS_PER_BAR);\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","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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 = 0;\n private xRef: number;\n private yRef: number;\n private ext: { x: Range; y: Range };\n private cols: number;\n private rows: number;\n // Styling captured at construction, reused by setData.\n private levelsOpt: number[] | number | undefined;\n private cmap: ReturnType<typeof colormap>;\n private fixedColor: Color | null;\n private usage: number;\n\n constructor(gl: WebGL2RenderingContext, opts: ContourOptions) {\n this.id = `contour-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.usage = bufferUsage(gl, opts.renderType);\n this.yAxis = opts.yAxis ?? \"y\";\n this.ext = opts.extent;\n this.cols = opts.cols;\n this.rows = opts.rows;\n const [x0, y0] = [opts.extent.x[0], opts.extent.y[0]];\n this.xRef = x0; this.yRef = y0;\n\n this.levelsOpt = opts.levels;\n this.cmap = colormap(opts.colormap ?? \"viridis\");\n this.fixedColor = opts.color != null\n ? (Array.isArray(opts.color) ? (opts.color as Color) : parseColor(opts.color as string))\n : null;\n\n const data = this.build(opts.values, opts.cols, opts.rows);\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, this.usage);\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 /** Marching-squares the scalar field into iso-line segments; sets vertexCount. */\n private build(values: ArrayLike<number>, cols: number, rows: number): Float32Array {\n const [x0, x1] = this.ext.x, [y0, y1] = this.ext.y;\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 this.levelsOpt === \"number\" ? this.levelsOpt : 8;\n const levels = Array.isArray(this.levelsOpt)\n ? this.levelsOpt\n : Array.from({ length: count }, (_, i) => vmin + ((vmax - vmin) * (i + 1)) / (count + 1));\n\n const cmap = this.cmap;\n const fixed = this.fixedColor;\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 return new Float32Array(data);\n }\n\n /** Replace the scalar field and recompute the iso lines (for streaming). */\n setData(values: ArrayLike<number>, cols: number = this.cols, rows: number = this.rows): void {\n this.cols = cols;\n this.rows = rows;\n const data = this.build(values, cols, rows);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, data, this.usage);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\n name?: string;\n yAxis?: string;\n}\n\n/** New positions/errors for {@link ErrorBarLayer.setData} (styling stays fixed). */\nexport interface ErrorBarData {\n x: ArrayLike<number>;\n y: ArrayLike<number>;\n yerr?: ErrInput;\n yerrLow?: ErrInput;\n yerrHigh?: ErrInput;\n xerr?: ErrInput;\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 usage: number;\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 this.usage = bufferUsage(gl, opts.renderType);\n\n const { segs, caps, band } = this.build(opts);\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, segs, this.usage);\n const capBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, capBuf);\n gl.bufferData(gl.ARRAY_BUFFER, caps, this.usage);\n const bandBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, bandBuf);\n gl.bufferData(gl.ARRAY_BUFFER, band, this.usage);\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 /** Recompute refs/bounds/counts and the whisker/cap/band vertex arrays from new data. */\n private build(d: ErrorBarData): { segs: Float32Array; caps: Float32Array; band: Float32Array } {\n const n = Math.min(d.x.length, d.y.length);\n this.xRef = n > 0 ? d.x[0]! : 0;\n this.yRef = n > 0 ? d.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 = d.yerr != null || d.yerrLow != null || d.yerrHigh != null;\n const hasX = d.xerr != null;\n\n for (let i = 0; i < n; i++) {\n const x = d.x[i]!, y = d.y[i]!;\n const eyLo = d.yerrLow != null ? errAt(d.yerrLow, i) : errAt(d.yerr, i);\n const eyHi = d.yerrHigh != null ? errAt(d.yerrHigh, i) : errAt(d.yerr, i);\n const ex = errAt(d.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 return { segs: new Float32Array(segs), caps: new Float32Array(caps), band: new Float32Array(band) };\n }\n\n /** Replace the data and re-upload (for streaming). */\n setData(data: ErrorBarData): void {\n const gl = this.gl;\n const { segs, caps, band } = this.build(data);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[2]!);\n gl.bufferData(gl.ARRAY_BUFFER, segs, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[3]!);\n gl.bufferData(gl.ARRAY_BUFFER, caps, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[4]!);\n gl.bufferData(gl.ARRAY_BUFFER, band, this.usage);\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","/**\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","import { forceLayout } from \"../graph/force.js\";\nimport { parseColor, toColorCss } from \"../gl/context.js\";\nimport { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\n name?: string;\n yAxis?: string;\n}\n\n/** New nodes/edges for {@link GraphLayer.setData} (colors/size stay fixed). */\nexport interface GraphData {\n /** Node positions. Omit both to run a force layout from `edges`. */\n x?: ArrayLike<number>;\n y?: ArrayLike<number>;\n edges: ReadonlyArray<readonly [number, number]>;\n /** Node count for the force layout when `x`/`y` are omitted. Defaults to max edge index + 1. */\n nodeCount?: number;\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 = 0;\n private edgeVerts = 0;\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 private usage: number;\n\n constructor(gl: WebGL2RenderingContext, opts: GraphOptions) {\n this.id = `graph-${counter++}`;\n this.gl = gl;\n this.progs = getPrograms(gl);\n this.usage = bufferUsage(gl, opts.renderType);\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 { nodePos, edgePos } = this.build(opts.x, opts.y, opts.edges);\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, this.usage);\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, edgePos, this.usage);\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 /** Build node/edge vertex arrays from positions + edges; sets counts, refs and bounds. */\n private build(\n x: ArrayLike<number>, y: ArrayLike<number>,\n edges: ReadonlyArray<readonly [number, number]>,\n ): { nodePos: Float32Array; edgePos: Float32Array } {\n const n = Math.min(x.length, y.length);\n this.nodeCount = n;\n this.xRef = n > 0 ? x[0]! : 0;\n this.yRef = n > 0 ? 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 = x[i]!, py = 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 edges) {\n if (a < 0 || b < 0 || a >= n || b >= n) continue;\n edgePos.push(x[a]! - this.xRef, y[a]! - this.yRef, x[b]! - this.xRef, y[b]! - this.yRef);\n }\n this.edgeVerts = edgePos.length / 2;\n return { nodePos, edgePos: new Float32Array(edgePos) };\n }\n\n /**\n * Replace nodes and edges (for streaming). When `x`/`y` are omitted, node\n * positions are recomputed with the package's force layout from the edges.\n */\n setData(data: GraphData): void {\n let x = data.x, y = data.y;\n if (x == null || y == null) {\n let nc = data.nodeCount ?? 0;\n if (data.nodeCount == null) {\n for (const [a, b] of data.edges) nc = Math.max(nc, a + 1, b + 1);\n }\n const laid = forceLayout(nc, data.edges);\n x = laid.x; y = laid.y;\n }\n const { nodePos, edgePos } = this.build(x, y, data.edges);\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[0]!);\n gl.bufferData(gl.ARRAY_BUFFER, nodePos, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[1]!);\n gl.bufferData(gl.ARRAY_BUFFER, edgePos, this.usage);\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, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 // Styling captured at construction, reused by setData.\n private lut: Float32Array;\n private fixedDomain: Range | undefined;\n private cols: number;\n private rows: number;\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 this.lut = colormapLUT(opts.colormap ?? \"viridis\");\n this.fixedDomain = opts.domain;\n this.cols = opts.cols;\n this.rows = opts.rows;\n\n const texture = gl.createTexture()!;\n this.texture = texture;\n gl.bindTexture(gl.TEXTURE_2D, texture);\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 // Bake values into the RGBA texture via the colormap.\n this.uploadValues(opts.values, opts.cols, opts.rows);\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 /** Bake a `cols*rows` value grid into the RGBA data texture via the colormap. */\n private uploadValues(values: ArrayLike<number>, cols: number, rows: number): void {\n const gl = this.gl;\n const lut = this.lut;\n let lo = this.fixedDomain?.[0] ?? Infinity;\n let hi = this.fixedDomain?.[1] ?? -Infinity;\n if (!this.fixedDomain) {\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 gl.bindTexture(gl.TEXTURE_2D, this.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 gl.bindTexture(gl.TEXTURE_2D, null);\n }\n\n /** Replace the value grid and re-bake the data texture (for streaming). */\n setData(values: ArrayLike<number>, cols: number = this.cols, rows: number = this.rows): void {\n this.cols = cols;\n this.rows = rows;\n this.uploadValues(values, cols, rows);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 = 1;\n private cellCount = 0;\n private xRef = 0;\n private yRef = 0;\n private xBounds: Range = [0, 0];\n private yBounds: Range = [0, 0];\n // Styling captured at construction, reused by setData.\n private cmap: ReturnType<typeof colormap>;\n private explicitRadius: number | undefined;\n private domain: Range | undefined;\n private usage: number;\n\n constructor(gl: WebGL2RenderingContext, opts: HexbinOptions) {\n this.id = `hexbin-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.usage = bufferUsage(gl, opts.renderType);\n this.yAxis = opts.yAxis ?? \"y\";\n\n this.cmap = colormap(opts.colormap ?? \"viridis\");\n this.explicitRadius = opts.radius;\n this.domain = opts.domain;\n\n const { centers, colors } = this.build(opts.x, opts.y);\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, this.usage);\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, this.usage);\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 /** Bin the points into hex cells; sets radius, refs, bounds and cell count. */\n private build(\n x: ArrayLike<number>, y: ArrayLike<number>,\n ): { centers: Float32Array; colors: Float32Array } {\n const n = Math.min(x.length, y.length);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < n; i++) {\n const px = x[i]!, py = y[i]!;\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]; this.yBounds = [minY, maxY];\n const r = this.explicitRadius ?? ((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 = x[i]!, py = 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 lo = this.domain?.[0] ?? 1;\n const hi = this.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] = this.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 return { centers, colors };\n }\n\n /** Replace the point arrays, re-bin and re-upload the cells (for streaming). */\n setData(x: ArrayLike<number>, y: ArrayLike<number>): void {\n const { centers, colors } = this.build(x, y);\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[1]!);\n gl.bufferData(gl.ARRAY_BUFFER, centers, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[2]!);\n gl.bufferData(gl.ARRAY_BUFFER, colors, this.usage);\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, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 this.setSource(opts.source, opts.onLoad);\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 /** Point the texture at a new source: load a URL async, or upload a bitmap now. */\n private setSource(source: ImageSource, onLoad?: () => void): void {\n if (typeof source === \"string\") {\n if (this.img) this.img.onload = null;\n const img = new Image();\n this.img = img;\n img.crossOrigin = \"anonymous\";\n img.onload = () => {\n this.upload(img);\n onLoad?.();\n };\n img.src = source;\n } else {\n this.img = null;\n this.upload(source);\n }\n }\n\n /** Replace the image source and re-upload the texture (for streaming). */\n setData(source: ImageSource, onLoad?: () => void): void {\n this.setSource(source, onLoad);\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 { bufferUsage, 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, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 usage: 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 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 this.usage = bufferUsage(gl, opts.renderType);\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, this.usage);\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.usage);\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 * 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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 // Captured styling so streaming reuses it.\n private defRgba: Color;\n private opacity: number;\n private cmap: ReturnType<typeof colormap> | null;\n private domainOpt: Range | undefined;\n private usage: number;\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 this.defRgba = Array.isArray(defColor) ? (defColor as Color) : parseColor(defColor as string);\n this.colorCss = typeof defColor === \"string\" ? defColor : \"#3b82f6\";\n this.opacity = opts.opacity ?? 1;\n this.cmap = opts.colormap ? colormap(opts.colormap) : null;\n this.domainOpt = opts.domain;\n this.usage = bufferUsage(gl, opts.renderType);\n\n const { positions, colors } = this.build(opts.patches);\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, positions, this.usage);\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, colors, this.usage);\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 /** Triangulate the patches and recompute refs/bounds/vertexCount into position/color arrays. */\n private build(patches: Patch[]): { positions: Float32Array; colors: Float32Array } {\n const defRgba = this.defRgba, opacity = this.opacity, cmap = this.cmap;\n\n // Colormap domain (choropleth), if coloring by value.\n let lo = this.domainOpt?.[0] ?? Infinity;\n let hi = this.domainOpt?.[1] ?? -Infinity;\n if (cmap && !this.domainOpt) {\n for (const patch of 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 this.xRef = 0;\n this.yRef = 0;\n for (const patch of 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 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 return { positions: new Float32Array(positions), colors: new Float32Array(colors) };\n }\n\n /** Replace the patches and re-upload (for streaming). */\n setData(patches: Patch[]): void {\n const gl = this.gl;\n const { positions, colors } = this.build(patches);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[0]!);\n gl.bufferData(gl.ARRAY_BUFFER, positions, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[1]!);\n gl.bufferData(gl.ARRAY_BUFFER, colors, this.usage);\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 { bufferUsage, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 // Captured geometry/color options so streaming reuses them.\n private cx: number;\n private cy: number;\n private R: number;\n private rIn: number;\n private start: number;\n private colorsOpt: (string | Color)[] | undefined;\n private cmap: ReturnType<typeof colormap> | null;\n private usage: number;\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 this.cx = cx;\n this.cy = cy;\n this.R = opts.radius ?? 1;\n this.rIn = opts.innerRadius ?? 0;\n this.start = opts.startAngle ?? Math.PI / 2;\n this.xRef = cx;\n this.yRef = cy;\n this.xBounds = [cx - this.R, cx + this.R];\n this.yBounds = [cy - this.R, cy + this.R];\n this.colorCss = \"#3b82f6\";\n this.colorsOpt = opts.colors;\n this.cmap = opts.colormap ? colormap(opts.colormap) : null;\n this.usage = bufferUsage(gl, opts.renderType);\n\n const { positions, colors } = this.build(opts.values);\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, positions, this.usage);\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, colors, this.usage);\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 /** Recompute vertexCount and the position/color triangle soup from new slice values. */\n private build(values: ArrayLike<number>): { positions: Float32Array; colors: Float32Array } {\n const { cx, cy, R, rIn, start } = this;\n const n = values.length;\n let total = 0;\n for (let i = 0; i < n; i++) total += Math.max(0, values[i]!);\n if (total <= 0) total = 1;\n\n const cmap = this.cmap;\n const colorAt = (i: number): Color => {\n if (this.colorsOpt?.[i] != null) {\n const c = this.colorsOpt[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, 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 return { positions: new Float32Array(positions), colors: new Float32Array(colors) };\n }\n\n /** Replace the slice values and re-upload (for streaming). */\n setData(values: ArrayLike<number>): void {\n const gl = this.gl;\n const { positions, colors } = this.build(values);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[0]!);\n gl.bufferData(gl.ARRAY_BUFFER, positions, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[1]!);\n gl.bufferData(gl.ARRAY_BUFFER, colors, this.usage);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 explicitScale: number | undefined;\n private colorBy: QuiverOptions[\"colorBy\"];\n private usage: 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: 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 this.explicitScale = opts.scale;\n this.colorBy = opts.colorBy;\n this.usage = bufferUsage(gl, opts.renderType);\n\n const { arrows, colors } = this.build(opts.x, opts.y, opts.u, opts.v);\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, this.usage);\n const colorBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuf);\n gl.bufferData(gl.ARRAY_BUFFER, colors, this.usage);\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 /** Recompute count/refs/bounds and the arrow+color arrays from new x/y/u/v. */\n private build(\n x: ArrayLike<number>, y: ArrayLike<number>,\n u: ArrayLike<number>, v: ArrayLike<number>,\n ): { arrows: Float32Array; colors: Float32Array } {\n const n = Math.min(x.length, y.length, u.length, v.length);\n this.count = n;\n this.xRef = n > 0 ? x[0]! : 0;\n this.yRef = n > 0 ? 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(u[i]!, v[i]!));\n let scale = this.explicitScale;\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, x[i]!); maxX = Math.max(maxX, x[i]!);\n minY = Math.min(minY, y[i]!); maxY = Math.max(maxY, 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(this.colorBy?.colormap ?? \"viridis\");\n const vals = this.colorBy?.values;\n let lo = this.colorBy?.domain?.[0] ?? Infinity;\n let hi = this.colorBy?.domain?.[1] ?? -Infinity;\n if (this.useVertexColor && !this.colorBy?.domain) {\n for (let i = 0; i < n; i++) {\n const val = vals ? vals[i]! : Math.hypot(u[i]!, v[i]!);\n lo = Math.min(lo, val); hi = Math.max(hi, val);\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 xi = x[i]!, yi = y[i]!;\n const tx = xi + u[i]! * scale, ty = yi + v[i]! * scale;\n arrows[i * 4] = xi - this.xRef; arrows[i * 4 + 1] = yi - this.yRef;\n arrows[i * 4 + 2] = tx - this.xRef; arrows[i * 4 + 3] = ty - this.yRef;\n if (this.useVertexColor) {\n const val = vals ? vals[i]! : Math.hypot(u[i]!, v[i]!);\n const [r, g, b] = cmap((val - 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, xi, tx); maxX = Math.max(maxX, xi, tx);\n minY = Math.min(minY, yi, ty); maxY = Math.max(maxY, yi, ty);\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n return { arrows, colors };\n }\n\n /** Replace the data and re-upload (for streaming). */\n setData(\n x: ArrayLike<number>, y: ArrayLike<number>,\n u: ArrayLike<number>, v: ArrayLike<number>,\n ): void {\n const gl = this.gl;\n const { arrows, colors } = this.build(x, y, u, v);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[1]!);\n gl.bufferData(gl.ARRAY_BUFFER, arrows, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[2]!);\n gl.bufferData(gl.ARRAY_BUFFER, colors, this.usage);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 usage: 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.usage = bufferUsage(gl, opts.renderType);\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, this.usage);\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, this.usage);\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.usage);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport { setTransformUniforms, TRANSFORM_GLSL, TRANSFORM_UNIFORMS } from \"../gl/transform.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 usage: 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 this.usage = bufferUsage(gl, opts.renderType);\n\n const { segs, tips } = this.build(opts.x, opts.y);\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, this.usage);\n const tipBuf = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, tipBuf);\n gl.bufferData(gl.ARRAY_BUFFER, tips, this.usage);\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 /** Recompute count/refs/bounds and the stem+tip vertex arrays from new x/y. */\n private build(x: ArrayLike<number>, y: ArrayLike<number>): { segs: Float32Array; tips: Float32Array } {\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\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 xi = x[i]!, yi = y[i]!;\n this.xs[i] = xi; this.ys[i] = yi;\n segs[i * 4] = xi - this.xRef; segs[i * 4 + 1] = this.baseline - this.yRef;\n segs[i * 4 + 2] = xi - this.xRef; segs[i * 4 + 3] = yi - this.yRef;\n tips[i * 2] = xi - this.xRef; tips[i * 2 + 1] = yi - this.yRef;\n if (xi < minX) minX = xi; if (xi > maxX) maxX = xi;\n if (yi < minY) minY = yi; if (yi > maxY) maxY = yi;\n }\n this.xBounds = [minX, maxX];\n this.yBounds = [minY, maxY];\n return { segs, tips };\n }\n\n /** Replace the data and re-upload (for streaming). */\n setData(x: ArrayLike<number>, y: ArrayLike<number>): void {\n const gl = this.gl;\n const { segs, tips } = this.build(x, y);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[2]!);\n gl.bufferData(gl.ARRAY_BUFFER, segs, this.usage);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers[3]!);\n gl.bufferData(gl.ARRAY_BUFFER, tips, this.usage);\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\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n/**\n * An **ordinal time** axis — the standard financial x-axis. Bars are plotted at\n * evenly-spaced integer indices `0..n-1` (like {@link CategoricalScale}, so the\n * domain is the band `[-0.5, n-1+0.5]`), which **collapses market gaps**\n * (weekends, overnight, holidays) instead of leaving blank space the way a real\n * {@link TimeScale} would. Each index carries a timestamp; ticks are placed at\n * natural calendar boundaries (day / month / year, or hour / minute when zoomed\n * in) and subsampled toward the target count, so labels stay readable at any zoom.\n *\n * Plot your candles/bars at `x = 0,1,2,…` and pass the per-bar epoch-ms `times`.\n */\nexport class OrdinalTimeScale implements Scale {\n readonly type = \"ordinal-time\";\n readonly log = false;\n times: number[];\n domain: Range;\n constructor(times: ArrayLike<number> = []) {\n this.times = Array.from({ length: times.length }, (_, i) => times[i]!);\n const n = this.times.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 invert(t: number): number {\n const [a, b] = this.domain;\n return a + t * (b - a);\n }\n /** Timestamp at a (rounded, clamped) index. */\n private timeAt(i: number): number {\n const n = this.times.length;\n if (n === 0) return 0;\n const k = Math.max(0, Math.min(n - 1, Math.round(i)));\n return this.times[k]!;\n }\n ticks(target = 6): Tick[] {\n const n = this.times.length;\n if (n === 0) return [];\n const i0 = Math.max(0, Math.ceil(this.domain[0] - 1e-9));\n const i1 = Math.min(n - 1, Math.floor(this.domain[1] + 1e-9));\n if (i1 < i0) return [];\n // Calendar levels coarse→fine: a boundary key (marks a new period) + a label.\n const dayKey = (d: Date) => d.getFullYear() * 10000 + d.getMonth() * 100 + d.getDate();\n const levels = [\n { key: (d: Date) => d.getFullYear(), label: (d: Date) => `${d.getFullYear()}` },\n {\n key: (d: Date) => d.getFullYear() * 12 + d.getMonth(),\n label: (d: Date) => (d.getMonth() === 0 ? `${d.getFullYear()}` : MONTHS[d.getMonth()]!),\n },\n { key: dayKey, label: (d: Date) => `${d.getDate()} ${MONTHS[d.getMonth()]}` },\n { key: (d: Date) => dayKey(d) * 100 + d.getHours(), label: hhmm },\n { key: (d: Date) => (dayKey(d) * 100 + d.getHours()) * 100 + d.getMinutes(), label: hhmm },\n ];\n const boundaries = (lvl: (typeof levels)[number]): number[] => {\n const out: number[] = [];\n let prev = i0 > 0 ? lvl.key(new Date(this.times[i0 - 1]!)) : NaN;\n for (let i = i0; i <= i1; i++) {\n const k = lvl.key(new Date(this.times[i]!));\n if (k !== prev) { out.push(i); prev = k; }\n }\n return out;\n };\n // Finest level with any boundaries; stop once one yields at least `target`\n // (enough to subsample down — finer would only be denser).\n let best: { lvl: (typeof levels)[number]; b: number[] } | null = null;\n for (const lvl of levels) {\n const b = boundaries(lvl);\n if (b.length === 0) continue;\n best = { lvl, b };\n if (b.length >= target) break;\n }\n let idxs: number[];\n let label: (d: Date) => string;\n if (best) {\n idxs = best.b;\n label = best.lvl.label;\n if (idxs.length > target * 1.5) {\n const stride = Math.ceil(idxs.length / target);\n idxs = idxs.filter((_, k) => k % stride === 0);\n }\n } else {\n // No calendar change in view (e.g. a handful of same-minute bars): space evenly.\n idxs = [];\n const step = Math.max(1, Math.floor((i1 - i0) / Math.max(1, target - 1)));\n for (let i = i0; i <= i1; i += step) idxs.push(i);\n label = (d) => `${d.getDate()} ${MONTHS[d.getMonth()]} ${hhmm(d)}`;\n }\n return idxs.map((i) => ({ value: i, label: label(new Date(this.times[i]!)) }));\n }\n formatTick(value: number): string {\n const d = new Date(this.timeAt(value));\n return `${d.getDate()} ${MONTHS[d.getMonth()]} ${hhmm(d)}`;\n }\n}\n\nfunction hhmm(d: Date): string {\n return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\nexport type ScaleType = \"linear\" | \"log\" | \"time\" | \"categorical\" | \"ordinal-time\";\n\nexport function makeScale(\n type: ScaleType, domain?: Range, factors?: string[], times?: ArrayLike<number>,\n): 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 case \"ordinal-time\":\n return new OrdinalTimeScale(times ?? []);\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 { OhlcLayer, type OhlcOptions } from \"./layers/ohlc.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 * Per-index epoch-ms timestamps for an `\"ordinal-time\"` axis (finance/session\n * axis). Plot bars at integer indices `0..times.length-1`; gaps collapse and\n * ticks show calendar dates.\n */\n times?: ArrayLike<number>;\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 /** Per-index epoch-ms timestamps for an `\"ordinal-time\"` axis. */\n times?: ArrayLike<number>;\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 // Linked-pane plumbing (see linkX). View/cursor changes are emitted from render().\n private viewListeners: Array<(x: Range) => void> = [];\n private cursorListeners: Array<(dataX: number | null) => void> = [];\n private lastEmittedX: Range | null = null;\n private lastEmittedCursor: number | null = NaN as unknown as null;\n private linkedCursorX: 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 \"band\" axis (categorical factors or ordinal-time indices) is fixed to its\n // band domain: never autoscale, and `home()` restores that band domain.\n const xBand = sx.type === \"categorical\" || sx.type === \"ordinal-time\";\n this.scaleX = makeScale(sx.type ?? \"linear\", sx.domain ?? [0, 1], sx.factors, sx.times);\n this.autoX = !xBand && sx.domain == null;\n this.initialX = xBand ? this.scaleX.domain : (sx.domain ?? null);\n this.axisX = new Axis(options.axes?.x);\n\n // Primary y axis.\n const yBand = sy.type === \"categorical\" || sy.type === \"ordinal-time\";\n const yScale = makeScale(sy.type ?? \"linear\", sy.domain ?? [0, 1], sy.factors, sy.times);\n this.yAxes.set(\"y\", {\n id: \"y\",\n scale: yScale,\n axis: new Axis(options.axes?.y),\n side: \"left\",\n auto: !yBand && sy.domain == null,\n initial: yBand ? 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 /** An OHLC bar chart (low→high line with open/close ticks). Streams like candlesticks. */\n addOhlc(opts: OhlcOptions): OhlcLayer {\n return this.register(new OhlcLayer(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, times, side, color, ...axisConfig } = opts;\n const band = type === \"categorical\" || type === \"ordinal-time\";\n const scale = makeScale(type ?? \"linear\", domain ?? [0, 1], factors, times);\n this.yAxes.set(id, {\n id,\n scale,\n axis: new Axis(axisConfig),\n side: side ?? \"right\",\n auto: !band && domain == null,\n initial: band ? scale.domain : (domain ?? null),\n color,\n });\n this.autoscale();\n this.requestRender();\n }\n\n /** Whether a y axis with this id exists (the primary is always `\"y\"`). */\n hasYAxis(id: string): boolean {\n return this.yAxes.has(id);\n }\n\n /** Remove a secondary y axis. No-op for the primary `\"y\"` or an unknown id. */\n removeYAxis(id: string): void {\n if (id === \"y\" || !this.yAxes.has(id)) return;\n this.yAxes.delete(id);\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 /**\n * Subscribe to x-domain changes (pan / zoom / home / setView). Fires once per\n * frame after the domain settles. Returns an unsubscribe function. See {@link linkX}.\n */\n onViewChange(cb: (x: Range) => void): () => void {\n this.viewListeners.push(cb);\n return () => { this.viewListeners = this.viewListeners.filter((f) => f !== cb); };\n }\n\n /**\n * Subscribe to the hover cursor's data-space x (or `null` when it leaves the\n * plot). Returns an unsubscribe function. Used to share a crosshair across panes.\n */\n onCursorMove(cb: (dataX: number | null) => void): () => void {\n this.cursorListeners.push(cb);\n return () => { this.cursorListeners = this.cursorListeners.filter((f) => f !== cb); };\n }\n\n /** Draw a linked crosshair at this data-space x (pushed from another pane), or clear it with `null`. */\n setLinkedCursor(dataX: number | null): void {\n if (this.linkedCursorX === dataX) return;\n this.linkedCursorX = dataX;\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 /** Fire view/cursor listeners once the frame's x-domain + cursor are settled. */\n private emitLinks(region: ReturnType<typeof plotRegion>): void {\n const dx = this.scaleX.domain;\n if (!this.lastEmittedX || this.lastEmittedX[0] !== dx[0] || this.lastEmittedX[1] !== dx[1]) {\n this.lastEmittedX = [dx[0], dx[1]];\n for (const cb of this.viewListeners) cb(this.lastEmittedX);\n }\n if (this.cursorListeners.length) {\n const cx = this.hoverEnabled && this.hoverPx\n ? this.scaleX.invert(Math.max(0, Math.min(1, (this.hoverPx.x - region.left) / region.width)))\n : null;\n if (cx !== this.lastEmittedCursor) {\n this.lastEmittedCursor = cx;\n for (const cb of this.cursorListeners) cb(cx);\n }\n }\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 this.emitLinks(region);\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 // Linked crosshair pushed from another pane (see linkX).\n if (this.linkedCursorX != null) {\n const nx = this.scaleX.norm(this.linkedCursorX);\n if (nx >= -0.001 && nx <= 1.001) {\n drawCrosshair(this.axisCtx, region, pxX(region, nx), this.theme);\n }\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\n/**\n * Link the x-axis (pan / zoom) and hover crosshair of several plots so they move\n * together — the standard multi-pane financial layout (price on top, volume /\n * RSI / MACD below, all sharing one time axis). The plots should share the same\n * x-scale semantics (e.g. all `ordinal-time` over the same bars).\n *\n * ```ts\n * const detach = linkX([pricePlot, volumePlot, rsiPlot]);\n * // …later: detach();\n * ```\n *\n * @returns a function that unlinks them again.\n */\nexport function linkX(plots: Plot[]): () => void {\n let applying = false;\n const unsubs: Array<() => void> = [];\n for (const p of plots) {\n unsubs.push(\n p.onViewChange((x) => {\n if (applying) return;\n applying = true;\n for (const q of plots) if (q !== p) q.setView({ x });\n applying = false;\n }),\n );\n unsubs.push(\n p.onCursorMove((cx) => {\n for (const q of plots) if (q !== p) q.setLinkedCursor(cx);\n }),\n );\n }\n return () => { for (const u of unsubs) u(); };\n}\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, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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, renderType: opts.renderType });\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, renderType: opts.renderType });\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 instBuf!: 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 base: Color;\n private optWidth?: number;\n private colorByOpt?: Bar3DOptions[\"colorBy\"];\n private usage: number;\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 this.usage = bufferUsage(gl, opts.renderType);\n this.optWidth = opts.width;\n this.colorByOpt = opts.colorBy;\n this.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 if (!opts.colorBy) this.colorCss = opts.color != null && typeof opts.color === \"string\" ? opts.color : \"#3b82f6\";\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.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 this.instBuf = instBuf;\n\n this.build(opts.x, opts.z, opts.y);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uWidth\", \"uLightDir\", \"uAmbient\"]);\n }\n\n /** Build the per-bar instances (base/height/color) and (re)upload the instance buffer. */\n private build(x: ArrayLike<number>, z: ArrayLike<number>, y: ArrayLike<number>): void {\n const gl = this.gl;\n const n = Math.min(x.length, y.length, z.length);\n this.count = n;\n const dx = medianSpacing(x, n), dz = medianSpacing(z, n);\n this.width = this.optWidth ?? Math.min(dx, dz) * 0.7;\n\n const base = this.base;\n const cvals = this.colorByOpt?.values ?? (this.colorByOpt ? y : null);\n const cmap = this.colorByOpt ? colormap(this.colorByOpt.colormap ?? \"viridis\") : null;\n let lo = this.colorByOpt?.domain?.[0] ?? Infinity;\n let hi = this.colorByOpt?.domain?.[1] ?? -Infinity;\n if (cmap && cvals && !this.colorByOpt?.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: this.colorByOpt!.colormap ?? \"viridis\", domain: [lo, hi], label: this.name };\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 px = x[i]!, pz = z[i]!, h = y[i]!;\n inst[i * 6] = px; inst[i * 6 + 1] = pz; inst[i * 6 + 2] = h;\n this.positions[i * 3] = px; this.positions[i * 3 + 1] = h; this.positions[i * 3 + 2] = pz;\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 (px - hw < minX) minX = px - hw; if (px + hw > maxX) maxX = px + hw;\n if (pz - hw < minZ) minZ = pz - hw; if (pz + hw > maxZ) maxZ = pz + 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 gl.bindBuffer(gl.ARRAY_BUFFER, this.instBuf);\n gl.bufferData(gl.ARRAY_BUFFER, inst, this.usage);\n }\n\n /** Stream new bar positions/heights (instances rebuilt). Call `plot.refresh()` after. */\n setData(x: ArrayLike<number>, z: ArrayLike<number>, y: ArrayLike<number>): void {\n this.build(x, z, y);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 private cmapName: ColormapName;\n private fixed: Color | null;\n private levelsOpt?: number[] | number;\n private cols!: number;\n private rows!: number;\n private extentX!: Range;\n private extentZ!: Range;\n private usage: number;\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 this.usage = bufferUsage(gl, opts.renderType);\n this.cmapName = opts.colormap ?? \"viridis\";\n this.levelsOpt = opts.levels;\n this.fixed = opts.color != null\n ? (Array.isArray(opts.color) ? (opts.color as Color) : parseColor(opts.color as string))\n : null;\n\n this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n this.build(opts.values, opts.cols, opts.rows, opts.extentX, opts.extentZ);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\"]);\n }\n\n /** Marching-squares the grid at each iso level and (re)upload the line buffer. */\n private build(values: ArrayLike<number>, cols: number, rows: number, extentX?: Range, extentZ?: Range): void {\n const gl = this.gl;\n this.cols = cols; this.rows = rows;\n const [x0, x1] = extentX ?? [0, cols - 1];\n const [z0, z1] = extentZ ?? [0, rows - 1];\n this.extentX = [x0, x1]; this.extentZ = [z0, z1];\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 this.levelsOpt === \"number\" ? this.levelsOpt : 10;\n const levels = Array.isArray(this.levelsOpt)\n ? this.levelsOpt\n : Array.from({ length: count }, (_, i) => vmin + (lspan * (i + 1)) / (count + 1));\n\n const cmap = colormap(this.cmapName);\n const fixed = this.fixed;\n if (!fixed) this.cInfo = { colormap: this.cmapName, domain: [vmin, vmax], label: this.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 gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), this.usage);\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\n /** Stream a new scalar field (contours recomputed). Call `plot.refresh()` after. */\n setData(values: ArrayLike<number>, opts?: { cols?: number; rows?: number; extentX?: Range; extentZ?: Range }): void {\n this.build(\n values,\n opts?.cols ?? this.cols,\n opts?.rows ?? this.rows,\n opts?.extentX ?? this.extentX,\n opts?.extentZ ?? this.extentZ,\n );\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 usage: number;\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 this.usage = bufferUsage(gl, opts.renderType);\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 this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n this.build(opts.values, opts.dims, opts.isoLevel, opts.extent);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uColor\", \"uLightDir\", \"uAmbient\", \"uOpacity\"]);\n }\n\n /** Run marching cubes and (re)upload the interleaved pos/normal vertex buffer. */\n private build(\n values: ArrayLike<number>,\n dims: [number, number, number],\n isoLevel: number,\n extent?: { x: Range; y: Range; z: Range },\n ): void {\n const gl = this.gl;\n const { positions, normals } = marchingCubes(values, dims, isoLevel, extent);\n this.vertCount = positions.length / 3;\n const ex = extent?.x ?? [0, dims[0] - 1];\n const ey = extent?.y ?? [0, dims[1] - 1];\n const ez = extent?.z ?? [0, 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 gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, this.usage);\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\n /** Stream a new volume + iso level (marching-cubes mesh recomputed). Call `plot.refresh()` after. */\n setData(\n values: ArrayLike<number>,\n dims: [number, number, number],\n isoLevel: number,\n extent?: { x: Range; y: Range; z: Range },\n ): void {\n this.build(values, dims, isoLevel, extent);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 private usage: number;\n\n constructor(gl: WebGL2RenderingContext, opts: Line3DOptions) {\n this.id = `line3d-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.usage = bufferUsage(gl, opts.renderType);\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, this.usage);\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.usage);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 private usage: number;\n\n constructor(gl: WebGL2RenderingContext, opts: PointCloudOptions) {\n this.id = `points3d-${counter++}`;\n this.gl = gl;\n this.program = getProgram(gl);\n this.usage = bufferUsage(gl, opts.renderType);\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, this.usage);\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.usage);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Color, Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 private base: Color;\n private scale: number;\n private headSize: number;\n private colorByOpt?: Quiver3DOptions[\"colorBy\"];\n private usage: number;\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 this.usage = bufferUsage(gl, opts.renderType);\n this.scale = opts.scale ?? 1;\n this.headSize = opts.headSize ?? 0.28;\n this.colorByOpt = opts.colorBy;\n this.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 if (!opts.colorBy) this.colorCss = typeof opts.color === \"string\" ? opts.color : toColorCss(this.base);\n\n this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n this.build(opts.x, opts.y, opts.z, opts.u, opts.v, opts.w);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\"]);\n }\n\n /** Build the arrow line geometry (shaft + 4-wing head) and (re)upload the vertex buffer. */\n private build(\n x: ArrayLike<number>, y: ArrayLike<number>, z: ArrayLike<number>,\n u: ArrayLike<number>, v: ArrayLike<number>, w: ArrayLike<number>,\n ): void {\n const gl = this.gl;\n const scale = this.scale;\n const headSize = this.headSize;\n const n = Math.min(x.length, y.length, z.length, u.length, v.length, w.length);\n\n const base = this.base;\n const cmap = this.colorByOpt ? colormap(this.colorByOpt.colormap ?? \"viridis\") : null;\n // Magnitudes (for colorBy).\n let lo = this.colorByOpt?.domain?.[0] ?? Infinity;\n let hi = this.colorByOpt?.domain?.[1] ?? -Infinity;\n const mag = (i: number) => Math.hypot(u[i]!, v[i]!, w[i]!);\n if (cmap && !this.colorByOpt?.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: this.colorByOpt!.colormap ?? \"viridis\", domain: [lo, hi], label: this.name };\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 = x[i]!, by = y[i]!, bz = z[i]!;\n const ux = u[i]! * scale, uy = v[i]! * scale, uz = 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 gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), this.usage);\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\n /** Stream a new vector field (arrows rebuilt). Call `plot.refresh()` after. */\n setData(\n x: ArrayLike<number>, y: ArrayLike<number>, z: ArrayLike<number>,\n u: ArrayLike<number>, v: ArrayLike<number>, w: ArrayLike<number>,\n ): void {\n this.build(x, y, z, u, v, w);\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 cols!: number;\n private rows!: number;\n private extentX!: Range;\n private extentZ!: Range;\n private usage: number;\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 this.usage = bufferUsage(gl, opts.renderType);\n\n this.vao = gl.createVertexArray()!;\n this.buffer = gl.createBuffer()!;\n this.build(opts.values, opts.cols, opts.rows, opts.extentX, opts.extentZ);\n\n this.uniforms = uniformLocations(gl, this.program, [\"uMVP\", \"uLightDir\", \"uAmbient\"]);\n }\n\n /** Build the mesh (positions/normals/colors or wireframe) and (re)upload the vertex buffer. */\n private build(values: ArrayLike<number>, cols: number, rows: number, extentX?: Range, extentZ?: Range): void {\n const gl = this.gl;\n this.cols = cols; this.rows = rows;\n const [x0, x1] = extentX ?? [0, cols - 1];\n const [z0, z1] = extentZ ?? [0, rows - 1];\n this.extentX = [x0, x1]; this.extentZ = [z0, z1];\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(this.cmapName);\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 gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.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), this.usage);\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), this.usage);\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\n /** Stream a new height grid (mesh/normals/wireframe rebuilt). Call `plot.refresh()` after. */\n setData(values: ArrayLike<number>, opts?: { cols?: number; rows?: number; extentX?: Range; extentZ?: Range }): void {\n this.build(\n values,\n opts?.cols ?? this.cols,\n opts?.rows ?? this.rows,\n opts?.extentX ?? this.extentX,\n opts?.extentZ ?? this.extentZ,\n );\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 { bufferUsage, createProgram, uniformLocations } from \"../gl/program.js\";\nimport type { Range, RenderType } 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 /** Buffer-usage hint; set `\"dynamic\"` when streaming via setData. Default `\"static\"`. */\n renderType?: RenderType;\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 = [0, 1];\n private dims: [number, number, number];\n private domainOpt?: Range;\n private usage: number;\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.usage = bufferUsage(gl, opts.renderType);\n this.density = opts.density ?? 1;\n this.cmapName = opts.colormap ?? \"viridis\";\n this.dims = opts.dims;\n this.domainOpt = opts.domain;\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 // R8 3D texture (normalized value), linear-filtered.\n this.tex = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_3D, this.tex);\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 this.uploadVolume(opts.values);\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), this.usage);\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 /** Normalize the scalar field and (re)upload it into the R8 3D texture. */\n private uploadVolume(values: ArrayLike<number>): void {\n const gl = this.gl;\n const [nx, ny, nz] = this.dims;\n let vmin = this.domainOpt?.[0] ?? Infinity;\n let vmax = this.domainOpt?.[1] ?? -Infinity;\n if (!this.domainOpt) {\n for (let i = 0; i < values.length; i++) { const v = 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 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(((values[i]! - vmin) / span) * 255)));\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.bindTexture(gl.TEXTURE_3D, null);\n }\n\n /** Stream a new scalar volume (same dims); re-uploads the 3D texture. Call `plot.refresh()` after. */\n setData(values: ArrayLike<number>): void {\n this.uploadVolume(values);\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","/**\n * Technical-analysis indicators — pure array→array transforms you overlay on a\n * price chart (as lines/bands) or drop into a linked sub-pane (RSI, MACD).\n *\n * Every function returns a `Float64Array` the same length as its input, with a\n * leading run of `NaN` for the warm-up period (before enough data exists). Feed\n * the result straight to a line/area layer — plot helpers skip the NaN prefix.\n */\n\nfunction toF64(values: ArrayLike<number>): Float64Array {\n const out = new Float64Array(values.length);\n for (let i = 0; i < values.length; i++) out[i] = values[i]!;\n return out;\n}\n\n/** Simple moving average over `period` samples. */\nexport function sma(values: ArrayLike<number>, period: number): Float64Array {\n const n = values.length;\n const out = new Float64Array(n).fill(NaN);\n if (period <= 0 || n < period) return out;\n let sum = 0;\n for (let i = 0; i < n; i++) {\n sum += values[i]!;\n if (i >= period) sum -= values[i - period]!;\n if (i >= period - 1) out[i] = sum / period;\n }\n return out;\n}\n\n/** Weighted moving average (linear weights 1..period, newest heaviest). */\nexport function wma(values: ArrayLike<number>, period: number): Float64Array {\n const n = values.length;\n const out = new Float64Array(n).fill(NaN);\n if (period <= 0 || n < period) return out;\n const denom = (period * (period + 1)) / 2;\n for (let i = period - 1; i < n; i++) {\n let acc = 0;\n for (let k = 0; k < period; k++) acc += values[i - period + 1 + k]! * (k + 1);\n out[i] = acc / denom;\n }\n return out;\n}\n\n/**\n * Exponential moving average, α = 2/(period+1). Seeded with the SMA of the first\n * `period` samples at index `period-1` (the standard convention).\n */\nexport function ema(values: ArrayLike<number>, period: number): Float64Array {\n const n = values.length;\n const out = new Float64Array(n).fill(NaN);\n if (period <= 0 || n < period) return out;\n const alpha = 2 / (period + 1);\n let seed = 0;\n for (let i = 0; i < period; i++) seed += values[i]!;\n let prev = seed / period;\n out[period - 1] = prev;\n for (let i = period; i < n; i++) {\n prev = values[i]! * alpha + prev * (1 - alpha);\n out[i] = prev;\n }\n return out;\n}\n\n/** Rolling population standard deviation over `period` samples. */\nexport function rollingStd(values: ArrayLike<number>, period: number): Float64Array {\n const n = values.length;\n const out = new Float64Array(n).fill(NaN);\n if (period <= 0 || n < period) return out;\n let sum = 0, sumSq = 0;\n for (let i = 0; i < n; i++) {\n const v = values[i]!;\n sum += v; sumSq += v * v;\n if (i >= period) { const old = values[i - period]!; sum -= old; sumSq -= old * old; }\n if (i >= period - 1) {\n const mean = sum / period;\n const variance = Math.max(0, sumSq / period - mean * mean);\n out[i] = Math.sqrt(variance);\n }\n }\n return out;\n}\n\nexport interface BollingerBands {\n middle: Float64Array;\n upper: Float64Array;\n lower: Float64Array;\n}\n\n/** Bollinger Bands: SMA(period) ± `k`·rollingStd(period). Defaults 20, 2. */\nexport function bollinger(close: ArrayLike<number>, period = 20, k = 2): BollingerBands {\n const middle = sma(close, period);\n const sd = rollingStd(close, period);\n const n = close.length;\n const upper = new Float64Array(n).fill(NaN);\n const lower = new Float64Array(n).fill(NaN);\n for (let i = 0; i < n; i++) {\n if (!Number.isNaN(middle[i]!)) {\n upper[i] = middle[i]! + k * sd[i]!;\n lower[i] = middle[i]! - k * sd[i]!;\n }\n }\n return { middle, upper, lower };\n}\n\n/** Wilder's RSI over `period` (default 14). Values in 0..100; warm-up is NaN. */\nexport function rsi(close: ArrayLike<number>, period = 14): Float64Array {\n const n = close.length;\n const out = new Float64Array(n).fill(NaN);\n if (period <= 0 || n <= period) return out;\n let gain = 0, loss = 0;\n // Seed with the average gain/loss over the first `period` changes.\n for (let i = 1; i <= period; i++) {\n const ch = close[i]! - close[i - 1]!;\n if (ch >= 0) gain += ch; else loss -= ch;\n }\n let avgGain = gain / period, avgLoss = loss / period;\n out[period] = avgLoss === 0 ? 100 : 100 - 100 / (1 + avgGain / avgLoss);\n for (let i = period + 1; i < n; i++) {\n const ch = close[i]! - close[i - 1]!;\n const g = ch > 0 ? ch : 0, l = ch < 0 ? -ch : 0;\n avgGain = (avgGain * (period - 1) + g) / period;\n avgLoss = (avgLoss * (period - 1) + l) / period;\n out[i] = avgLoss === 0 ? 100 : 100 - 100 / (1 + avgGain / avgLoss);\n }\n return out;\n}\n\nexport interface Macd {\n macd: Float64Array;\n signal: Float64Array;\n histogram: Float64Array;\n}\n\n/** MACD: EMA(fast) − EMA(slow), its EMA(signal) line, and the histogram. Defaults 12/26/9. */\nexport function macd(close: ArrayLike<number>, fast = 12, slow = 26, signalPeriod = 9): Macd {\n const n = close.length;\n const emaFast = ema(close, fast);\n const emaSlow = ema(close, slow);\n const line = new Float64Array(n).fill(NaN);\n for (let i = 0; i < n; i++) {\n if (!Number.isNaN(emaFast[i]!) && !Number.isNaN(emaSlow[i]!)) line[i] = emaFast[i]! - emaSlow[i]!;\n }\n // Signal = EMA of the MACD line over its valid (non-NaN) region.\n const firstValid = line.findIndex((v) => !Number.isNaN(v));\n const signal = new Float64Array(n).fill(NaN);\n if (firstValid >= 0) {\n const seg = line.subarray(firstValid);\n const sig = ema(seg, signalPeriod);\n for (let i = 0; i < sig.length; i++) signal[firstValid + i] = sig[i]!;\n }\n const histogram = new Float64Array(n).fill(NaN);\n for (let i = 0; i < n; i++) {\n if (!Number.isNaN(line[i]!) && !Number.isNaN(signal[i]!)) histogram[i] = line[i]! - signal[i]!;\n }\n return { macd: line, signal, histogram };\n}\n\n/**\n * Volume-weighted average price, cumulative from the first sample: running\n * Σ(typical·volume) / Σ(volume), where typical = (high+low+close)/3.\n */\nexport function vwap(\n high: ArrayLike<number>, low: ArrayLike<number>, close: ArrayLike<number>, volume: ArrayLike<number>,\n): Float64Array {\n const n = Math.min(high.length, low.length, close.length, volume.length);\n const out = new Float64Array(n).fill(NaN);\n let cumPV = 0, cumV = 0;\n for (let i = 0; i < n; i++) {\n const typical = (high[i]! + low[i]! + close[i]!) / 3;\n cumPV += typical * volume[i]!;\n cumV += volume[i]!;\n out[i] = cumV === 0 ? NaN : cumPV / cumV;\n }\n return out;\n}\n\n/** True range per bar: max(H−L, |H−prevC|, |L−prevC|). First bar is H−L. */\nexport function trueRange(\n high: ArrayLike<number>, low: ArrayLike<number>, close: ArrayLike<number>,\n): Float64Array {\n const n = Math.min(high.length, low.length, close.length);\n const out = new Float64Array(n);\n if (n > 0) out[0] = high[0]! - low[0]!;\n for (let i = 1; i < n; i++) {\n const pc = close[i - 1]!;\n out[i] = Math.max(high[i]! - low[i]!, Math.abs(high[i]! - pc), Math.abs(low[i]! - pc));\n }\n return out;\n}\n\n/** Wilder's Average True Range over `period` (default 14). */\nexport function atr(\n high: ArrayLike<number>, low: ArrayLike<number>, close: ArrayLike<number>, period = 14,\n): Float64Array {\n const tr = trueRange(high, low, close);\n const n = tr.length;\n const out = new Float64Array(n).fill(NaN);\n if (n < period || period <= 0) return out;\n let sum = 0;\n for (let i = 0; i < period; i++) sum += tr[i]!;\n let prev = sum / period;\n out[period - 1] = prev;\n for (let i = period; i < n; i++) {\n prev = (prev * (period - 1) + tr[i]!) / period;\n out[i] = prev;\n }\n return out;\n}\n\n/** Index of the first non-NaN value (−1 if all NaN). Handy for trimming warm-up. */\nexport function firstFinite(values: ArrayLike<number>): number {\n for (let i = 0; i < values.length; i++) if (!Number.isNaN(values[i]!)) return i;\n return -1;\n}\n\nexport { toF64 as toFloat64 };\n","/**\n * Chart-type transforms: turn raw OHLC(V) into the geometry a specialist finance\n * chart needs. Each returns plain arrays you render with existing layers\n * (candlestick, bar, area, scatter) — see the `Plot.add*` helpers that wrap them.\n */\n\nexport interface Ohlc {\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n}\n\nexport interface OhlcArrays {\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n}\n\n/**\n * Heikin-Ashi candles — a smoothed OHLC that filters noise and makes trends\n * obvious. Output has the same length; feed it to a candlestick layer.\n *\n * haClose = (o+h+l+c)/4\n * haOpen = (prevHaOpen + prevHaClose)/2 (seed: (o₀+c₀)/2)\n * haHigh = max(h, haOpen, haClose)\n * haLow = min(l, haOpen, haClose)\n */\nexport function heikinAshi(d: Ohlc): OhlcArrays {\n const n = Math.min(d.open.length, d.high.length, d.low.length, d.close.length);\n const open = new Float64Array(n), high = new Float64Array(n), low = new Float64Array(n), close = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const o = d.open[i]!, h = d.high[i]!, l = d.low[i]!, c = d.close[i]!;\n const haClose = (o + h + l + c) / 4;\n const haOpen = i === 0 ? (o + c) / 2 : (open[i - 1]! + close[i - 1]!) / 2;\n close[i] = haClose;\n open[i] = haOpen;\n high[i] = Math.max(h, haOpen, haClose);\n low[i] = Math.min(l, haOpen, haClose);\n }\n return { open, high, low, close };\n}\n\n/** One brick / box for Renko & Line-break (each renders as a wickless candle body). */\nexport interface Brick {\n /** Sequential column index (0..n-1); bricks are evenly spaced, time is discarded. */\n x: number;\n open: number;\n close: number;\n /** `true` when close > open (up brick). */\n up: boolean;\n}\n\n/**\n * Renko bricks from a close series. A new brick is emitted each time price moves\n * a full `brickSize` from the last brick's close (multiple bricks if it jumps\n * several sizes). Time is discarded — bricks are placed at successive indices.\n */\nexport function renko(close: ArrayLike<number>, brickSize: number): Brick[] {\n const bricks: Brick[] = [];\n const n = close.length;\n if (n === 0 || brickSize <= 0) return bricks;\n let base = close[0]!;\n let x = 0;\n for (let i = 1; i < n; i++) {\n let diff = close[i]! - base;\n while (Math.abs(diff) >= brickSize) {\n const up = diff > 0;\n const open = base;\n const next = base + (up ? brickSize : -brickSize);\n bricks.push({ x: x++, open, close: next, up });\n base = next;\n diff = close[i]! - base;\n }\n }\n return bricks;\n}\n\n/**\n * Three-line-break (generalised to `lines`): a new up brick when close exceeds\n * the highest close of the last `lines` bricks, a down brick when it breaks the\n * lowest; otherwise nothing. Bricks are placed at successive indices.\n */\nexport function lineBreak(close: ArrayLike<number>, lines = 3): Brick[] {\n const bricks: Brick[] = [];\n const n = close.length;\n if (n === 0) return bricks;\n const ends: number[] = [close[0]!]; // brick close prices in order\n let x = 0;\n for (let i = 1; i < n; i++) {\n const c = close[i]!;\n const recent = ends.slice(-lines);\n const hi = Math.max(...recent);\n const lo = Math.min(...recent);\n if (c > hi) {\n bricks.push({ x: x++, open: ends[ends.length - 1]!, close: c, up: true });\n ends.push(c);\n } else if (c < lo) {\n bricks.push({ x: x++, open: ends[ends.length - 1]!, close: c, up: false });\n ends.push(c);\n }\n }\n return bricks;\n}\n\n/** One P&F column: a run of X's (rising) or O's (falling) spanning `from`→`to`. */\nexport interface PfColumn {\n col: number;\n kind: \"X\" | \"O\";\n from: number;\n to: number;\n /** Box centers filled in this column (for plotting the X/O glyphs). */\n boxes: number[];\n}\n\n/**\n * Point & Figure columns. Price is quantised to `boxSize`; a column of X's grows\n * while price rises, O's while it falls, and the column flips only after a\n * `reversal`-box move against it. Time is discarded.\n */\nexport function pointAndFigure(\n high: ArrayLike<number>, low: ArrayLike<number>, boxSize: number, reversal = 3,\n): PfColumn[] {\n const n = Math.min(high.length, low.length);\n const cols: PfColumn[] = [];\n if (n === 0 || boxSize <= 0) return cols;\n const q = (p: number) => Math.floor(p / boxSize) * boxSize;\n let dir: \"X\" | \"O\" | null = null;\n let top = q(high[0]!), bottom = q(low[0]!);\n let col = 0;\n const pushCol = (kind: \"X\" | \"O\", from: number, to: number) => {\n const boxes: number[] = [];\n for (let b = Math.min(from, to); b <= Math.max(from, to) + 1e-9; b += boxSize) boxes.push(b + boxSize / 2);\n cols.push({ col, kind, from, to, boxes });\n };\n for (let i = 1; i < n; i++) {\n const h = q(high[i]!), l = q(low[i]!);\n if (dir === null) { dir = h - bottom >= l - bottom ? \"X\" : \"O\"; }\n if (dir === \"X\") {\n if (h > top) top = h;\n else if (bottom - l >= reversal * boxSize || top - (l) >= reversal * boxSize) {\n pushCol(\"X\", bottom, top); col++; dir = \"O\"; bottom = l; // start new O column below\n }\n } else {\n if (l < bottom) bottom = l;\n else if (h - top >= reversal * boxSize || (h) - bottom >= reversal * boxSize) {\n pushCol(\"O\", top, bottom); col++; dir = \"X\"; top = h; // start new X column above\n }\n }\n }\n if (dir === \"X\") pushCol(\"X\", bottom, top);\n else if (dir === \"O\") pushCol(\"O\", top, bottom);\n return cols;\n}\n\nexport interface VolumeProfile {\n /** Bin center price for each level (length = bins). */\n levels: Float64Array;\n /** Total volume traded in each price bin. */\n volume: Float64Array;\n binSize: number;\n priceMin: number;\n priceMax: number;\n /** Bin index of the highest-volume level (the Point of Control). */\n pocIndex: number;\n}\n\n/**\n * Volume profile — a histogram of traded volume by price level. Plot it as\n * horizontal bars (`orientation:\"h\"`) with `levels` on the y axis.\n */\nexport function volumeProfile(\n price: ArrayLike<number>, volume: ArrayLike<number>, bins = 24,\n): VolumeProfile {\n const n = Math.min(price.length, volume.length);\n let lo = Infinity, hi = -Infinity;\n for (let i = 0; i < n; i++) { const p = price[i]!; if (p < lo) lo = p; if (p > hi) hi = p; }\n if (!isFinite(lo) || !isFinite(hi) || bins <= 0) {\n return { levels: new Float64Array(0), volume: new Float64Array(0), binSize: 0, priceMin: 0, priceMax: 0, pocIndex: -1 };\n }\n if (hi === lo) hi = lo + 1;\n const binSize = (hi - lo) / bins;\n const levels = new Float64Array(bins);\n const vol = new Float64Array(bins);\n for (let b = 0; b < bins; b++) levels[b] = lo + (b + 0.5) * binSize;\n for (let i = 0; i < n; i++) {\n let b = Math.floor((price[i]! - lo) / binSize);\n if (b < 0) b = 0; else if (b >= bins) b = bins - 1;\n vol[b] += volume[i]!;\n }\n let pocIndex = 0;\n for (let b = 1; b < bins; b++) if (vol[b]! > vol[pocIndex]!) pocIndex = b;\n return { levels, volume: vol, binSize, priceMin: lo, priceMax: hi, pocIndex };\n}\n\nexport interface DepthCurves {\n /** Bid side: prices ascending toward mid, cumulative volume (best bid = largest cum). */\n bidPrice: Float64Array;\n bidCum: Float64Array;\n /** Ask side: prices ascending away from mid, cumulative volume. */\n askPrice: Float64Array;\n askCum: Float64Array;\n}\n\n/**\n * Order-book depth curves. `bids`/`asks` are `[price, size]` pairs (any order);\n * returns cumulative-volume step curves ready for two step-area layers.\n */\nexport function depth(\n bids: ArrayLike<readonly [number, number]>, asks: ArrayLike<readonly [number, number]>,\n): DepthCurves {\n const b = Array.from({ length: bids.length }, (_, i) => bids[i]!).sort((p, q) => q[0] - p[0]); // high→low\n const a = Array.from({ length: asks.length }, (_, i) => asks[i]!).sort((p, q) => p[0] - q[0]); // low→high\n const bidPrice = new Float64Array(b.length), bidCum = new Float64Array(b.length);\n let cum = 0;\n for (let i = 0; i < b.length; i++) { cum += b[i]![1]; bidPrice[i] = b[i]![0]; bidCum[i] = cum; }\n // Reverse the bid side so prices run ascending (left→right) toward the mid.\n bidPrice.reverse(); bidCum.reverse();\n const askPrice = new Float64Array(a.length), askCum = new Float64Array(a.length);\n cum = 0;\n for (let i = 0; i < a.length; i++) { cum += a[i]![1]; askPrice[i] = a[i]![0]; askCum[i] = cum; }\n return { bidPrice, bidCum, askPrice, askCum };\n}\n","/**\n * Convenience builders for specialist finance charts. Each takes a {@link Plot}\n * and composes existing layers from a transform/indicator — mirroring the\n * `addMap(plot, …)` free-function style. Import from `@photonviz/core`.\n */\nimport type { AreaLayer } from \"../layers/area.js\";\nimport type { BarLayer } from \"../layers/bar.js\";\nimport { type Candle, type CandlestickLayer, type CandlestickOptions } from \"../layers/candlestick.js\";\nimport type { LineLayer } from \"../layers/line.js\";\nimport type { Plot } from \"../plot.js\";\nimport type { Color, RenderType } from \"../types.js\";\nimport { bollinger, firstFinite } from \"./indicators.js\";\nimport { depth, heikinAshi, renko, volumeProfile, type Brick } from \"./transforms.js\";\n\n/** Raw OHLC input shared by the candle-style helpers. */\nexport interface OhlcInput {\n x: ArrayLike<number>;\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n}\n\nexport interface HeikinAshiOptions extends Omit<CandlestickOptions, \"open\" | \"high\" | \"low\" | \"close\"> {\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n}\n\n/** Heikin-Ashi candles: smooth the OHLC, then draw it as a candlestick layer. */\nexport function addHeikinAshi(plot: Plot, opts: HeikinAshiOptions): CandlestickLayer {\n const ha = heikinAshi(opts);\n return plot.addCandlestick({ ...opts, open: ha.open, high: ha.high, low: ha.low, close: ha.close });\n}\n\nexport interface RenkoOptions {\n close: ArrayLike<number>;\n /** Fixed brick height in price units. */\n brickSize: number;\n upColor?: string | Color;\n downColor?: string | Color;\n name?: string;\n yAxis?: string;\n renderType?: RenderType;\n}\n\n/**\n * Renko chart — bricks at successive integer indices (time discarded). Rendered\n * as wickless candles, so pair it with an `ordinal-time`/linear x axis.\n */\nexport function addRenko(plot: Plot, opts: RenkoOptions): CandlestickLayer {\n const bricks: Brick[] = renko(opts.close, opts.brickSize);\n const n = bricks.length;\n const x = new Float64Array(n), open = new Float64Array(n), high = new Float64Array(n);\n const low = new Float64Array(n), close = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const b = bricks[i]!;\n x[i] = b.x; open[i] = b.open; close[i] = b.close;\n high[i] = Math.max(b.open, b.close); low[i] = Math.min(b.open, b.close);\n }\n return plot.addCandlestick({\n x, open, high, low, close, width: 1,\n upColor: opts.upColor, downColor: opts.downColor,\n wickWidth: 0.001, name: opts.name, yAxis: opts.yAxis, renderType: opts.renderType,\n });\n}\n\nexport interface VolumeProfileOptions {\n /** Price per sample (typically close). */\n price: ArrayLike<number>;\n volume: ArrayLike<number>;\n /** Number of price bins. Default 24. */\n bins?: number;\n color?: string | Color;\n /** Highlight the Point-of-Control bin with this color. */\n pocColor?: string | Color;\n name?: string;\n yAxis?: string;\n renderType?: RenderType;\n}\n\n/** Volume-by-price histogram as horizontal bars (price on the y axis). */\nexport function addVolumeProfile(plot: Plot, opts: VolumeProfileOptions): BarLayer {\n const vp = volumeProfile(opts.price, opts.volume, opts.bins ?? 24);\n const base = opts.color ?? \"#60a5fa\";\n const colors = opts.pocColor\n ? Array.from(vp.levels, (_, i) => (i === vp.pocIndex ? opts.pocColor! : base))\n : undefined;\n return plot.addBar({\n x: vp.levels, y: vp.volume, orientation: \"h\", base: 0,\n width: vp.binSize * 0.85, color: base, colors,\n name: opts.name, yAxis: opts.yAxis, renderType: opts.renderType,\n });\n}\n\nexport interface BollingerOptions {\n x: ArrayLike<number>;\n close: ArrayLike<number>;\n period?: number;\n k?: number;\n /** Line color for the bands + middle. Default light blue. */\n color?: string | Color;\n /** Fill color between the bands (omit to skip the fill). */\n bandColor?: string | Color;\n width?: number;\n yAxis?: string;\n renderType?: RenderType;\n}\n\n/** Bollinger Bands: a shaded band between upper/lower plus the three lines. */\nexport interface BollingerHandle {\n band?: AreaLayer;\n upper: LineLayer;\n middle: LineLayer;\n lower: LineLayer;\n}\n\nexport function addBollinger(plot: Plot, opts: BollingerOptions): BollingerHandle {\n const { middle, upper, lower } = bollinger(opts.close, opts.period ?? 20, opts.k ?? 2);\n const start = firstFinite(middle);\n const slice = (a: Float64Array) => (start < 0 ? a.subarray(0, 0) : a.subarray(start));\n const n = middle.length;\n const xs = new Float64Array(Math.max(0, n - Math.max(0, start)));\n for (let i = 0; i < xs.length; i++) xs[i] = opts.x[start + i]!;\n const color = opts.color ?? \"#a78bfa\";\n const width = opts.width ?? 1;\n const rt = opts.renderType;\n const band = opts.bandColor\n ? plot.addArea({ x: xs, y: slice(upper), base: slice(lower), color: opts.bandColor, yAxis: opts.yAxis, renderType: rt })\n : undefined;\n return {\n band,\n upper: plot.addLine({ x: xs, y: slice(upper), color, width, yAxis: opts.yAxis, renderType: rt }),\n middle: plot.addLine({ x: xs, y: slice(middle), color, width, name: \"BB\", yAxis: opts.yAxis, renderType: rt }),\n lower: plot.addLine({ x: xs, y: slice(lower), color, width, yAxis: opts.yAxis, renderType: rt }),\n };\n}\n\nexport interface DepthOptions {\n /** `[price, size]` levels (any order). */\n bids: ArrayLike<readonly [number, number]>;\n asks: ArrayLike<readonly [number, number]>;\n bidColor?: string | Color;\n askColor?: string | Color;\n yAxis?: string;\n renderType?: RenderType;\n}\n\n/** Order-book depth: cumulative bid/ask volume as two filled areas. */\nexport interface DepthHandle {\n bid: AreaLayer;\n ask: AreaLayer;\n}\n\nexport function addDepth(plot: Plot, opts: DepthOptions): DepthHandle {\n const d = depth(opts.bids, opts.asks);\n return {\n bid: plot.addArea({\n x: d.bidPrice, y: d.bidCum, base: 0,\n color: opts.bidColor ?? \"rgba(38,166,154,0.4)\", name: \"bids\", yAxis: opts.yAxis, renderType: opts.renderType,\n }),\n ask: plot.addArea({\n x: d.askPrice, y: d.askCum, base: 0,\n color: opts.askColor ?? \"rgba(239,83,80,0.4)\", name: \"asks\", yAxis: opts.yAxis, renderType: opts.renderType,\n }),\n };\n}\n\nexport type { Candle };\n"],"mappings":"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AO;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,EACvG;AAAA,EAAO;AAAA,EAAM;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,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;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,EACxG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;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,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;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,EAAM;AAAA,EAAO;AAAA,EAAO;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,EAAM;AAAA,EAAO;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,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,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAAG,CAAC,GAAG,GAAG,CAAC;AAAA,EAChQ,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","names":["norm","fmt","VERT","FRAG","programCache","getProgram","counter","lo","hi","bins","norm","VERT","FRAG","programCache","getProgram","counter","FRAG","medianSpacing","counter","toColor","FRAG","SEG_CORNERS","programCache","getProgram","medianSpacing","toColor","counter","VERT","FRAG","programCache","getProgram","counter","SEG_VERT","SEG_CORNERS","cache","programs","counter","area","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","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","x","y","z","VERT","FRAG","programCache","getProgram","counter","VERT","FRAG","programCache","getProgram","counter","histogram"]}
|