blazeplot 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/core/MinMaxPyramid.ts","../src/core/SeriesStore.ts","../src/core/RingBuffer.ts","../src/render/ShaderPrograms.ts","../src/render/Renderer.ts","../src/render/WebGL2Resources.ts","../src/render/ReglBackend.ts","../src/interaction/InputController.ts","../src/interaction/Camera2D.ts","../src/interaction/AxisController.ts","../src/ui/AxisOverlay.ts","../src/ui/ChartLayout.ts","../src/ui/Chart.ts","../src/core/StaticDataset.ts"],"sourcesContent":["import type { Dataset, LODView, Viewport } from \"./types.js\";\n\nconst MAX_LEVELS = 16;\n\nexport class MinMaxPyramid {\n private levels: Float32Array[] = [];\n private levelLengths: Uint32Array;\n private levelSampleWidths: Uint32Array;\n private _builtLen: number = 0;\n private _lastRangeStart: number = NaN;\n\n constructor(readonly bucketSize: number = 2) {\n if (!Number.isInteger(bucketSize) || bucketSize < 2) {\n throw new RangeError(\"MinMaxPyramid bucketSize must be an integer >= 2.\");\n }\n\n this.levelLengths = new Uint32Array(MAX_LEVELS);\n this.levelSampleWidths = new Uint32Array(MAX_LEVELS);\n }\n\n build(source: Dataset): void {\n this.levels = [];\n this.levelLengths.fill(0);\n this.levelSampleWidths.fill(0);\n\n let srcLen = source.length;\n if (srcLen === 0) {\n this._builtLen = 0;\n this._lastRangeStart = NaN;\n return;\n }\n\n let prevLevel: Float32Array | null = null;\n let level = 0;\n\n while (srcLen > 0 && level < MAX_LEVELS) {\n const nextLen = Math.ceil(srcLen / this.bucketSize);\n const levelData = new Float32Array(nextLen * 2);\n\n for (let i = 0; i < srcLen; i += this.bucketSize) {\n let minY = Infinity;\n let maxY = -Infinity;\n const end = Math.min(i + this.bucketSize, srcLen);\n for (let j = i; j < end; j++) {\n if (prevLevel) {\n const prevMin = prevLevel[j * 2]!;\n const prevMax = prevLevel[j * 2 + 1]!;\n if (prevMin < minY) minY = prevMin;\n if (prevMax > maxY) maxY = prevMax;\n } else {\n const y = source.getY(j);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n const outIdx = Math.floor(i / this.bucketSize);\n levelData[outIdx * 2] = minY;\n levelData[outIdx * 2 + 1] = maxY;\n }\n\n this.levels[level] = levelData;\n this.levelLengths[level] = nextLen;\n this.levelSampleWidths[level] = this.bucketSize ** (level + 1);\n\n if (nextLen === 1) break;\n\n prevLevel = levelData;\n srcLen = nextLen;\n level++;\n }\n\n this._builtLen = source.length;\n this._lastRangeStart = source.range?.start ?? NaN;\n }\n\n incrementalBuild(source: Dataset): void {\n const newLen = source.length;\n const rangeStart = source.range?.start ?? NaN;\n\n if (newLen === 0) {\n this.levels = [];\n this.levelLengths.fill(0);\n this.levelSampleWidths.fill(0);\n this._builtLen = 0;\n this._lastRangeStart = NaN;\n return;\n }\n\n if (newLen < this._builtLen || rangeStart !== this._lastRangeStart) {\n this.build(source);\n return;\n }\n\n if (newLen === this._builtLen) return;\n\n this.appendTail(source, newLen - this._builtLen);\n this._builtLen = newLen;\n }\n\n private appendTail(source: Dataset, appendedCount: number): void {\n const newLen = source.length;\n const W = this.bucketSize;\n let changedIdx = newLen - appendedCount;\n\n for (let L = 0; L < MAX_LEVELS; L++) {\n const items: number = L === 0 ? newLen : this.levelLengths[L - 1]!;\n const first = Math.floor(changedIdx / W);\n const last = Math.ceil(items / W) - 1;\n\n if (first > last) break;\n\n this.levelSampleWidths[L] = W ** (L + 1);\n this.ensureLevelData(L, last + 1);\n\n for (let b = first; b <= last; b++) {\n const start = b * W;\n const end = Math.min((b + 1) * W, items);\n\n let minY = Infinity;\n let maxY = -Infinity;\n\n if (L === 0) {\n for (let j = start; j < end; j++) {\n const y = source.getY(j);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n } else {\n const prev = this.levels[L - 1]!;\n for (let j = start; j < end; j++) {\n const pMin = prev[j * 2]!;\n const pMax = prev[j * 2 + 1]!;\n if (pMin < minY) minY = pMin;\n if (pMax > maxY) maxY = pMax;\n }\n }\n\n const dst = this.levels[L]!;\n dst[b * 2] = minY;\n dst[b * 2 + 1] = maxY;\n }\n\n this.levelLengths[L] = last + 1;\n changedIdx = first;\n\n if (this.levelLengths[L]! <= 1) break;\n }\n }\n\n private ensureLevelData(level: number, minBuckets: number): void {\n const needed = minBuckets * 2;\n const current = this.levels[level];\n if (current && current.length >= needed) return;\n\n const next = new Float32Array(needed);\n if (current) {\n next.set(current.subarray(0, Math.min(current.length, needed)));\n }\n this.levels[level] = next;\n }\n\n query(_viewport: Viewport, pixelWidth: number, xRange: { start: number; length: number }): LODView {\n if (pixelWidth <= 0 || xRange.length <= 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const visibleSamples = xRange.length;\n const samplesPerPixel = Math.max(1, visibleSamples / pixelWidth);\n const level = Math.min(\n Math.max(0, Math.ceil(Math.log2(samplesPerPixel)) - 1),\n this.levels.length - 1,\n );\n\n const levelData = this.levels[level];\n const levelLen = this.levelLengths[level];\n const sampleWidth = this.levelSampleWidths[level];\n if (!levelData || levelLen === undefined || sampleWidth === undefined || levelLen === 0 || sampleWidth === 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel };\n }\n\n const queryStart = Math.max(0, xRange.start);\n const queryEnd = queryStart + xRange.length;\n const bucketStart = Math.max(0, Math.floor(queryStart / sampleWidth));\n const bucketEnd = Math.min(levelLen, Math.ceil(queryEnd / sampleWidth));\n const count = bucketEnd - bucketStart;\n\n if (count <= 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level, samplesPerPixel };\n }\n\n const result = new Float32Array(count * 2);\n for (let i = 0; i < count; i++) {\n const j = (bucketStart + i) * 2;\n result[i * 2] = levelData[j]!;\n result[i * 2 + 1] = levelData[j + 1]!;\n }\n\n return { buckets: result, bucketCount: count, level, samplesPerPixel };\n }\n}\n","import type { Dataset, AppendableDataset, LODView, Viewport, SeriesConfig, SeriesStyle } from \"./types.js\";\nimport { MinMaxPyramid } from \"./MinMaxPyramid.js\";\n\nexport class SeriesStore {\n readonly config: SeriesConfig;\n readonly style: SeriesStyle;\n private readonly dataset: Dataset;\n private readonly pyramid: MinMaxPyramid | null;\n\n private _dirty: boolean = false;\n private _visible: boolean = true;\n\n constructor(dataset: Dataset, config: SeriesConfig, style: SeriesStyle) {\n this.dataset = dataset;\n this.config = config;\n this.pyramid = config.mode === \"line\" && config.downsample !== \"none\" ? new MinMaxPyramid() : null;\n this.style = style;\n\n if (this.pyramid && dataset.length > 0) {\n this.pyramid.build(dataset);\n }\n }\n\n get hasLOD(): boolean {\n return this.pyramid !== null;\n }\n\n get dirty(): boolean {\n return this._dirty;\n }\n\n get length(): number {\n return this.dataset.length;\n }\n\n get visible(): boolean {\n return this._visible;\n }\n\n setVisible(visible: boolean): void {\n this._visible = visible;\n }\n\n append(x: ArrayLike<number>, y: ArrayLike<number>): void {\n if (!(\"push\" in this.dataset)) {\n throw new TypeError(\"SeriesStore dataset is not appendable.\");\n }\n\n const appendable = this.dataset as AppendableDataset;\n appendable.append(x, y);\n this._dirty = true;\n }\n\n clear(): void {\n if (!(\"clear\" in this.dataset)) {\n throw new TypeError(\"SeriesStore dataset is not clearable.\");\n }\n\n (this.dataset as AppendableDataset).clear();\n if (this.pyramid) this.pyramid.build(this.dataset);\n this._dirty = false;\n }\n\n rebuildPyramid(): void {\n if (!this._dirty) return;\n if (this.pyramid) this.pyramid.incrementalBuild(this.dataset);\n this._dirty = false;\n }\n\n query(viewport: Viewport, pixelWidth: number): LODView {\n if (!this.pyramid) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const range = this.dataset.range;\n if (!range) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n\n return this.pyramid.query(viewport, pixelWidth, {\n start,\n length: Math.max(0, end - start),\n });\n }\n\n visibleSampleCount(viewport: Viewport): number {\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n return Math.max(0, end - start);\n }\n\n copyRawVisible(viewport: Viewport, target: Float32Array, maxPoints: number): number {\n return this.copyVisibleSamples(viewport, target, maxPoints, \"points\", 0);\n }\n\n copyAreaVisible(viewport: Viewport, target: Float32Array, maxPoints: number, baseline: number = 0): number {\n return this.copyVisibleSamples(viewport, target, maxPoints, \"area\", baseline) * 2;\n }\n\n copyMinMaxVisible(viewport: Viewport, target: Float32Array, maxSegments: number): number {\n return this.copyMinMaxSegments(viewport, target, maxSegments, \"line-list\") * 2;\n }\n\n copyMinMaxInstanced(viewport: Viewport, target: Float32Array, maxSegments: number): number {\n return this.copyMinMaxSegments(viewport, target, maxSegments, \"instanced\");\n }\n\n private copyVisibleSamples(\n viewport: Viewport,\n target: Float32Array,\n maxPoints: number,\n layout: \"points\" | \"area\",\n baseline: number,\n ): number {\n const floatsPerSample = layout === \"points\" ? 2 : 4;\n if (maxPoints <= 0 || target.length < maxPoints * floatsPerSample) return 0;\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n const visible = end - start;\n if (visible <= 0) return 0;\n\n const stride = Math.max(1, Math.ceil(visible / maxPoints));\n let count = 0;\n for (let i = start; i < end && count < maxPoints; i += stride) {\n const x = this.dataset.getX(i);\n const y = this.dataset.getY(i);\n if (layout === \"points\") {\n const offset = count * 2;\n target[offset] = x;\n target[offset + 1] = y;\n } else {\n const offset = count * 4;\n target[offset] = x;\n target[offset + 1] = baseline;\n target[offset + 2] = x;\n target[offset + 3] = y;\n }\n count++;\n }\n\n return count;\n }\n\n private copyMinMaxSegments(\n viewport: Viewport,\n target: Float32Array,\n maxSegments: number,\n layout: \"line-list\" | \"instanced\",\n ): number {\n const floatsPerSegment = layout === \"line-list\" ? 4 : 3;\n if (!this.pyramid || maxSegments <= 0 || target.length < maxSegments * floatsPerSegment) return 0;\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n const visible = end - start;\n if (visible <= 0) return 0;\n\n const segmentCount = Math.min(maxSegments, visible);\n for (let segment = 0; segment < segmentCount; segment++) {\n const segmentStart = start + Math.floor((segment * visible) / segmentCount);\n const segmentEnd = start + Math.max(\n Math.floor(((segment + 1) * visible) / segmentCount),\n Math.floor((segment * visible) / segmentCount) + 1,\n );\n const clampedEnd = Math.min(end, segmentEnd);\n\n let minY = Infinity;\n let maxY = -Infinity;\n for (let i = segmentStart; i < clampedEnd; i++) {\n const y = this.dataset.getY(i);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n\n const x = this.dataset.getX(segmentStart + ((clampedEnd - segmentStart) >> 1));\n if (layout === \"line-list\") {\n const offset = segment * 4;\n target[offset] = x;\n target[offset + 1] = minY;\n target[offset + 2] = x;\n target[offset + 3] = maxY;\n } else {\n const offset = segment * 3;\n target[offset] = x;\n target[offset + 1] = minY;\n target[offset + 2] = maxY;\n }\n }\n\n return segmentCount;\n }\n}\n","import type { TimeRange } from \"./types.js\";\n\nexport class RingBuffer {\n readonly capacity: number;\n private _length: number = 0;\n private _head: number = 0;\n\n private readonly xData: Float64Array;\n private readonly yData: Float32Array;\n\n constructor(capacity: number) {\n if (!Number.isInteger(capacity) || capacity <= 0) {\n throw new RangeError(\"RingBuffer capacity must be a positive integer.\");\n }\n\n this.capacity = capacity;\n this.xData = new Float64Array(capacity);\n this.yData = new Float32Array(capacity);\n }\n\n get length(): number {\n return this._length;\n }\n\n get range(): TimeRange | null {\n if (this._length === 0) return null;\n return { start: this.getX(0), end: this.getX(this._length - 1) };\n }\n\n push(x: number, y: number): void {\n this.xData[this._head] = x;\n this.yData[this._head] = y;\n this._head = (this._head + 1) % this.capacity;\n if (this._length < this.capacity) this._length++;\n }\n\n append(x: ArrayLike<number>, y: ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n for (let i = 0; i < n; i++) {\n this.push(x[i]!, y[i]!);\n }\n }\n\n get(index: number): { x: number; y: number } | null {\n if (index < 0 || index >= this._length) return null;\n return { x: this.getX(index), y: this.getY(index) };\n }\n\n getX(index: number): number {\n this.assertValidIndex(index);\n return this.xData[this.logicalToPhysical(index)]!;\n }\n\n getY(index: number): number {\n this.assertValidIndex(index);\n return this.yData[this.logicalToPhysical(index)]!;\n }\n\n lowerBoundX(x: number): number {\n let lo = 0;\n let hi = this._length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.getX(mid) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n upperBoundX(x: number): number {\n let lo = 0;\n let hi = this._length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.getX(mid) <= x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n clear(): void {\n this._length = 0;\n this._head = 0;\n }\n\n private logicalToPhysical(index: number): number {\n return (this._head - this._length + index + this.capacity) % this.capacity;\n }\n\n private assertValidIndex(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this._length) {\n throw new RangeError(`RingBuffer index out of range: ${index}`);\n }\n }\n}\n","import lineVert from \"./shaders/line.vert?raw\";\nimport lineFrag from \"./shaders/line.frag?raw\";\nimport segmentVert from \"./shaders/segment.vert?raw\";\nimport segmentFrag from \"./shaders/segment.frag?raw\";\nimport pointVert from \"./shaders/point.vert?raw\";\nimport pointFrag from \"./shaders/point.frag?raw\";\nimport barVert from \"./shaders/bar.vert?raw\";\nimport barFrag from \"./shaders/bar.frag?raw\";\n\nexport const ShaderPrograms = {\n line: { vert: lineVert, frag: lineFrag },\n segment: { vert: segmentVert, frag: segmentFrag },\n point: { vert: pointVert, frag: pointFrag },\n bar: { vert: barVert, frag: barFrag },\n} as const;\n","import { ShaderPrograms } from \"./ShaderPrograms.js\";\nimport type { Camera2D } from \"../interaction/Camera2D.js\";\nimport type { AttributeSpec, GpuBackend, GpuBuffer, GpuProgram } from \"./types.js\";\nimport type { SeriesStyle } from \"../core/types.js\";\n\nconst FLOATS_PER_SEGMENT_INSTANCE = 3;\nconst FLOATS_PER_POINT_INSTANCE = 2;\nconst BYTES_PER_FLOAT = 4;\nconst DEFAULT_POINT_SIZE_PX = 4;\nconst DEFAULT_BAR_WIDTH_DATA = 0.8;\nconst DEFAULT_BASELINE = 0;\n\nexport class Renderer {\n private readonly lineProgram: GpuProgram;\n private readonly segmentProgram: GpuProgram;\n private readonly pointProgram: GpuProgram;\n private readonly barProgram: GpuProgram;\n private readonly segmentSelectBuffer: GpuBuffer;\n private readonly pointCornerBuffer: GpuBuffer;\n private readonly barCornerBuffer: GpuBuffer;\n private readonly scaleUniform: Float32Array = new Float32Array(2);\n private readonly offsetUniform: Float32Array = new Float32Array(2);\n private readonly canvasSizeUniform: Float32Array = new Float32Array(2);\n\n constructor(private backend: GpuBackend) {\n this.lineProgram = this.backend.createProgram(ShaderPrograms.line.vert, ShaderPrograms.line.frag);\n this.segmentProgram = this.backend.createProgram(ShaderPrograms.segment.vert, ShaderPrograms.segment.frag);\n this.pointProgram = this.backend.createProgram(ShaderPrograms.point.vert, ShaderPrograms.point.frag);\n this.barProgram = this.backend.createProgram(ShaderPrograms.bar.vert, ShaderPrograms.bar.frag);\n\n this.segmentSelectBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 2 });\n this.backend.updateBuffer(this.segmentSelectBuffer, new Float32Array([0, 1]));\n\n this.pointCornerBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 8 });\n this.backend.updateBuffer(this.pointCornerBuffer, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]));\n\n this.barCornerBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 8 });\n this.backend.updateBuffer(this.barCornerBuffer, new Float32Array([-0.5, 0, 0.5, 0, -0.5, 1, 0.5, 1]));\n }\n\n get supportsInstancedSegments(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n get supportsInstancedPoints(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n get supportsInstancedBars(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n clear(r: number, g: number, b: number, a: number): void {\n this.backend.clear(r, g, b, a);\n }\n\n createFloatBuffer(floatCount: number): GpuBuffer {\n return this.backend.createBuffer({ usage: \"stream\", type: \"float\", length: floatCount });\n }\n\n updateFloatBuffer(buffer: GpuBuffer, data: Float32Array): void {\n this.backend.updateBuffer(buffer, data);\n }\n\n viewport(x: number, y: number, width: number, height: number): void {\n this.backend.viewport(x, y, width, height);\n }\n\n drawLines(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLinePrimitive(\"lines\", positions, count, style, camera);\n }\n\n drawLineStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLinePrimitive(\"line_strip\", positions, count, style, camera);\n }\n\n drawMinMaxSegments(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLines(positions, count, style, camera);\n }\n\n drawMinMaxSegmentsInstanced(instanceBuffer: GpuBuffer, instanceCount: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n const stride = FLOATS_PER_SEGMENT_INSTANCE * BYTES_PER_FLOAT;\n const aX: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: 0 };\n const aMinY: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: BYTES_PER_FLOAT };\n const aMaxY: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: BYTES_PER_FLOAT * 2 };\n const aSelect: AttributeSpec = { buffer: this.segmentSelectBuffer, divisor: 0, stride: BYTES_PER_FLOAT, offset: 0 };\n\n this.backend.draw({\n program: this.segmentProgram,\n primitive: \"lines\",\n count: 2,\n instances: instanceCount,\n attributes: { aMaxY, aMinY, aSelect, aX },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.color,\n },\n });\n }\n\n drawPointsInstanced(\n instanceBuffer: GpuBuffer,\n pointCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n canvasWidth: number,\n canvasHeight: number,\n ): void {\n this.writeCameraUniforms(camera);\n this.canvasSizeUniform[0] = Math.max(1, canvasWidth);\n this.canvasSizeUniform[1] = Math.max(1, canvasHeight);\n\n const instanceStride = FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT;\n const aPosition: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: 0, size: 2 };\n const aCorner: AttributeSpec = { buffer: this.pointCornerBuffer, divisor: 0, stride: FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT, offset: 0, size: 2 };\n\n this.backend.draw({\n program: this.pointProgram,\n primitive: \"triangle_strip\",\n count: 4,\n instances: pointCount,\n attributes: { aCorner, aPosition },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uCanvasSize: this.canvasSizeUniform,\n uPointSize: style.pointSize ?? DEFAULT_POINT_SIZE_PX,\n uColor: style.color,\n },\n });\n }\n\n drawAreaStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n this.backend.draw({\n program: this.lineProgram,\n primitive: \"triangle_strip\",\n count,\n attributes: { position: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.fillColor ?? style.color,\n },\n });\n }\n\n drawBarsInstanced(\n instanceBuffer: GpuBuffer,\n barCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n ): void {\n this.writeCameraUniforms(camera);\n\n const instanceStride = FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT;\n const aPosition: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: 0, size: 2 };\n const aCorner: AttributeSpec = { buffer: this.barCornerBuffer, divisor: 0, stride: FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT, offset: 0, size: 2 };\n\n this.backend.draw({\n program: this.barProgram,\n primitive: \"triangle_strip\",\n count: 4,\n instances: barCount,\n attributes: { aCorner, aPosition },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uBarWidth: style.barWidth ?? DEFAULT_BAR_WIDTH_DATA,\n uBaseline: style.baseline ?? DEFAULT_BASELINE,\n uColor: style.color,\n },\n });\n }\n\n private drawLinePrimitive(primitive: \"lines\" | \"line_strip\", positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n this.backend.draw({\n program: this.lineProgram,\n primitive,\n count,\n attributes: { position: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.color,\n },\n });\n }\n\n private writeCameraUniforms(camera: Camera2D): void {\n this.scaleUniform[0] = camera.xScale;\n this.scaleUniform[1] = camera.yScale;\n this.offsetUniform[0] = camera.xOffset;\n this.offsetUniform[1] = camera.yOffset;\n }\n\n dispose(): void {\n this.backend.destroy();\n }\n}\n","import type { Regl, Buffer as ReglBuffer } from \"regl\";\n\ninterface PoolEntry {\n buffer: ReglBuffer;\n floatArray: Float32Array;\n floatCapacity: number;\n inUse: boolean;\n}\n\nconst POOL_SIZES = [1024, 4096, 16384, 32768, 131072];\n\nexport class WebGL2Resources {\n private readonly regl: Regl;\n private readonly pool: PoolEntry[] = [];\n private preAllocated: boolean = false;\n\n constructor(regl: Regl) {\n this.regl = regl;\n }\n\n get reglInstance(): Regl {\n return this.regl;\n }\n\n preAllocate(): void {\n if (this.preAllocated) return;\n this.preAllocated = true;\n\n for (const size of POOL_SIZES) {\n this.pool.push(this.createEntry(size, \"stream\"));\n }\n }\n\n acquire(floatCount: number, usage: \"static\" | \"dynamic\" | \"stream\" = \"stream\"): { buffer: ReglBuffer; array: Float32Array } {\n const needed = floatCount;\n let entry = this.findFree(needed);\n if (!entry) {\n const capacity = this.roundUp(needed);\n entry = this.createEntry(capacity, usage);\n this.pool.push(entry);\n }\n entry.inUse = true;\n return { buffer: entry.buffer, array: entry.floatArray };\n }\n\n release(buffer: ReglBuffer): void {\n for (const entry of this.pool) {\n if (entry.buffer === buffer) {\n entry.inUse = false;\n return;\n }\n }\n }\n\n destroy(): void {\n for (const entry of this.pool) {\n entry.buffer.destroy();\n }\n this.pool.length = 0;\n this.preAllocated = false;\n }\n\n private createEntry(floatCapacity: number, usage: \"static\" | \"dynamic\" | \"stream\"): PoolEntry {\n return {\n buffer: this.regl.buffer({\n length: floatCapacity * 4,\n usage,\n type: \"float\",\n }),\n floatArray: new Float32Array(floatCapacity),\n floatCapacity,\n inUse: false,\n };\n }\n\n private findFree(minCapacity: number): PoolEntry | undefined {\n return this.pool.find(e => !e.inUse && e.floatCapacity >= minCapacity);\n }\n\n private roundUp(n: number): number {\n for (const size of POOL_SIZES) {\n if (size >= n) return size;\n }\n const highest = POOL_SIZES[POOL_SIZES.length - 1]!;\n const nextPower = 1 << (32 - Math.clz32(n - 1));\n return Math.max(highest * 2, nextPower);\n }\n}\n","import createRegl from \"regl\";\nimport type { AttributeState, Buffer as ReglBuffer, DrawCommand, PrimitiveType, Regl, Uniform } from \"regl\";\nimport type { GpuBackend, GpuBuffer, GpuProgram, GpuResource, BufferSpec, DrawSpec, AttributeSpec, UniformValue } from \"./types.js\";\nimport { WebGL2Resources } from \"./WebGL2Resources.js\";\n\ntype ReglGpuBuffer = GpuBuffer & {\n readonly buffer: ReglBuffer;\n};\n\ntype ReglGpuProgram = GpuProgram & {\n readonly id: number;\n readonly vert: string;\n readonly frag: string;\n};\n\ninterface DrawProps {\n readonly count: number;\n readonly instances: number;\n readonly attributes: Readonly<Record<string, AttributeState>>;\n readonly uniforms: Readonly<Record<string, UniformValue>>;\n}\n\nfunction toReglContext(gl: WebGL2RenderingContext): WebGLRenderingContext {\n // regl's public types accept WebGLRenderingContext even though regl can run on WebGL2 contexts.\n return gl as unknown as WebGLRenderingContext;\n}\n\ninterface ScissorProps {\n scissorEnable?: boolean;\n scissorBox?: { x: number; y: number; width: number; height: number };\n}\n\nexport class ReglBackend implements GpuBackend {\n private gl: WebGL2RenderingContext;\n private regl: Regl;\n private resources: WebGL2Resources;\n private nextProgramId: number = 1;\n private commandCache: Map<string, DrawCommand> = new Map();\n private scissorBox: { x: number; y: number; w: number; h: number } | null = null;\n readonly capabilities: GpuBackend[\"capabilities\"];\n\n constructor(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n powerPreference: \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"BlazePlot requires WebGL2, but this browser/context does not support it.\");\n }\n\n this.gl = gl;\n this.regl = createRegl({\n gl: toReglContext(this.gl),\n extensions: [],\n optionalExtensions: [\n \"angle_instanced_arrays\",\n \"ext_disjoint_timer_query_webgl2\",\n ],\n });\n\n this.capabilities = {\n instancing: this.regl.hasExtension(\"angle_instanced_arrays\"),\n };\n\n this.resources = new WebGL2Resources(this.regl);\n this.resources.preAllocate();\n }\n\n createBuffer(spec: BufferSpec): GpuBuffer {\n const { buffer } = this.resources.acquire(spec.length, spec.usage);\n return {\n length: spec.length,\n type: spec.type,\n buffer,\n } as ReglGpuBuffer;\n }\n\n updateBuffer(buffer: GpuBuffer, data: Float32Array | Uint16Array, offset: number = 0): void {\n if (data.length + offset > buffer.length) {\n throw new RangeError(\"GPU buffer update exceeds allocated buffer length.\");\n }\n\n const bytesPerElement = buffer.type === \"float\" ? 4 : 2;\n this.asReglBuffer(buffer).buffer.subdata(data, offset * bytesPerElement);\n }\n\n createProgram(vert: string, frag: string): GpuProgram {\n return {\n id: this.nextProgramId++,\n vert,\n frag,\n } as ReglGpuProgram;\n }\n\n draw(spec: DrawSpec): void {\n if (spec.count <= 0) return;\n\n const program = this.asReglProgram(spec.program);\n const attributeNames = Object.keys(spec.attributes).sort();\n const uniformNames = Object.keys(spec.uniforms).sort();\n const key = [program.id, spec.primitive, attributeNames.join(\",\"), uniformNames.join(\",\"), spec.instances === undefined ? 0 : 1].join(\"|\");\n let command = this.commandCache.get(key);\n\n if (!command) {\n command = this.createDrawCommand(program, spec.primitive, attributeNames, uniformNames, spec.instances !== undefined);\n this.commandCache.set(key, command);\n }\n\n const attributes: Record<string, AttributeState> = {};\n for (const name of attributeNames) {\n attributes[name] = this.resolveAttribute(spec.attributes[name]!);\n }\n\n const props: DrawProps & ScissorProps = {\n count: spec.count,\n instances: spec.instances ?? 0,\n attributes,\n uniforms: spec.uniforms,\n };\n\n if (this.scissorBox) {\n props.scissorEnable = true;\n props.scissorBox = {\n x: this.scissorBox.x,\n y: this.scissorBox.y,\n width: this.scissorBox.w,\n height: this.scissorBox.h,\n };\n }\n\n command(props);\n }\n\n dispose(resource: GpuResource): void {\n if (this.isReglBuffer(resource)) {\n this.resources.release(resource.buffer);\n }\n }\n\n clear(r: number, g: number, b: number, a: number): void {\n this.regl.clear({ color: [r, g, b, a] });\n }\n\n viewport(x: number, y: number, w: number, h: number): void {\n this.scissorBox = { x, y, w, h };\n }\n\n destroy(): void {\n this.resources.destroy();\n this.regl.destroy();\n }\n\n private createDrawCommand(\n program: ReglGpuProgram,\n primitive: DrawSpec[\"primitive\"],\n attributeNames: readonly string[],\n uniformNames: readonly string[],\n instanced: boolean,\n ): DrawCommand {\n const attributes: Record<string, (context: object, props: DrawProps) => AttributeState> = {};\n for (const name of attributeNames) {\n attributes[name] = (_context, props) => props.attributes[name]!;\n }\n\n const uniforms: Record<string, (context: object, props: DrawProps) => Uniform> = {};\n for (const name of uniformNames) {\n uniforms[name] = (_context, props) => props.uniforms[name] as Uniform;\n }\n\n return this.regl({\n vert: program.vert,\n frag: program.frag,\n attributes,\n uniforms,\n primitive: this.toReglPrimitive(primitive),\n count: (_context: object, props: DrawProps) => props.count,\n instances: instanced ? (_context: object, props: DrawProps) => props.instances : undefined,\n depth: { enable: false },\n scissor: {\n enable: (_context: object, props: DrawProps & ScissorProps) => props.scissorEnable ?? false,\n box: (_context: object, props: DrawProps & ScissorProps) =>\n props.scissorBox ?? { x: 0, y: 0, width: 0, height: 0 },\n },\n });\n }\n\n private resolveAttribute(attribute: GpuBuffer | AttributeSpec): AttributeState {\n if (\"divisor\" in attribute) {\n return {\n buffer: this.asReglBuffer(attribute.buffer).buffer,\n divisor: attribute.divisor,\n stride: attribute.stride,\n offset: attribute.offset,\n size: attribute.size,\n } as AttributeState;\n }\n\n return this.asReglBuffer(attribute).buffer;\n }\n\n private asReglBuffer(buffer: GpuBuffer): ReglGpuBuffer {\n return buffer as ReglGpuBuffer;\n }\n\n private asReglProgram(program: GpuProgram): ReglGpuProgram {\n return program as ReglGpuProgram;\n }\n\n private isReglBuffer(resource: GpuResource): resource is ReglGpuBuffer {\n return \"length\" in resource && \"type\" in resource && \"buffer\" in resource;\n }\n\n private toReglPrimitive(primitive: DrawSpec[\"primitive\"]): PrimitiveType {\n switch (primitive) {\n case \"line_strip\":\n return \"line strip\";\n case \"triangle_strip\":\n return \"triangle strip\";\n default:\n return primitive;\n }\n }\n}\n","import type { Camera2D } from \"./Camera2D.js\";\nimport type { PanIntent, ViewportPolicy, ZoomIntent } from \"./types.js\";\n\nexport class InputController {\n private _enabled: boolean = true;\n private activePointerId: number | null = null;\n private lastX: number = 0;\n private lastY: number = 0;\n\n constructor(\n private readonly canvas: HTMLCanvasElement,\n private readonly camera: Camera2D,\n private readonly policy?: ViewportPolicy,\n ) {\n this.bindEvents();\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n private bindEvents(): void {\n this.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.addEventListener(\"pointercancel\", this.onPointerUp);\n this.canvas.addEventListener(\"wheel\", this.onWheel, { passive: false });\n }\n\n private onPointerDown = (e: PointerEvent): void => {\n if (!this._enabled || this.activePointerId !== null) return;\n this.activePointerId = e.pointerId;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n this.canvas.setPointerCapture(e.pointerId);\n };\n\n private onPointerMove = (e: PointerEvent): void => {\n if (!this._enabled || e.pointerId !== this.activePointerId) return;\n const rect = this.canvas.getBoundingClientRect();\n const dx = rect.width > 0 ? (this.lastX - e.clientX) / rect.width : 0;\n const dy = rect.height > 0 ? (e.clientY - this.lastY) / rect.height : 0;\n const intent = this.applyPanPolicy({ dx, dy });\n if (intent) this.camera.pan(intent);\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n };\n\n private onPointerUp = (e: PointerEvent): void => {\n if (e.pointerId !== this.activePointerId) return;\n this.activePointerId = null;\n if (this.canvas.hasPointerCapture(e.pointerId)) {\n this.canvas.releasePointerCapture(e.pointerId);\n }\n };\n\n private onWheel = (e: WheelEvent): void => {\n if (!this._enabled) return;\n e.preventDefault();\n const factor = e.deltaY < 0 ? 1.1 : 0.9;\n const rect = this.canvas.getBoundingClientRect();\n const cx = rect.width > 0 ? (e.clientX - rect.left) / rect.width : 0.5;\n const cy = rect.height > 0 ? 1 - (e.clientY - rect.top) / rect.height : 0.5;\n const intent = this.applyZoomPolicy({ factor, cx, cy, axis: \"xy\" });\n if (intent) this.camera.zoom(intent);\n };\n\n private applyPanPolicy(intent: PanIntent): PanIntent | null {\n if (!this.policy?.beforePan) return intent;\n return this.policy.beforePan(this.camera, intent);\n }\n\n private applyZoomPolicy(intent: ZoomIntent): ZoomIntent | null {\n if (!this.policy?.beforeZoom) return intent;\n return this.policy.beforeZoom(this.camera, intent);\n }\n\n dispose(): void {\n this.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.removeEventListener(\"pointercancel\", this.onPointerUp);\n this.canvas.removeEventListener(\"wheel\", this.onWheel);\n }\n}\n","import type { Viewport } from \"../core/types.js\";\nimport type { PanIntent, ZoomIntent } from \"./types.js\";\n\nexport class Camera2D {\n private _xMin: number = 0;\n private _xMax: number = 1;\n private _yMin: number = 0;\n private _yMax: number = 1;\n\n get xMin(): number {\n return this._xMin;\n }\n\n get xMax(): number {\n return this._xMax;\n }\n\n get yMin(): number {\n return this._yMin;\n }\n\n get yMax(): number {\n return this._yMax;\n }\n\n get viewport(): Viewport {\n return { xMin: this._xMin, xMax: this._xMax, yMin: this._yMin, yMax: this._yMax };\n }\n\n get xScale(): number {\n return 2 / (this._xMax - this._xMin);\n }\n\n get xOffset(): number {\n return -(this._xMin + this._xMax) / (this._xMax - this._xMin);\n }\n\n get yScale(): number {\n return 2 / (this._yMax - this._yMin);\n }\n\n get yOffset(): number {\n return -(this._yMin + this._yMax) / (this._yMax - this._yMin);\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n const next = {\n xMin: v.xMin ?? this._xMin,\n xMax: v.xMax ?? this._xMax,\n yMin: v.yMin ?? this._yMin,\n yMax: v.yMax ?? this._yMax,\n };\n Camera2D.assertValidViewport(next);\n this._xMin = next.xMin;\n this._xMax = next.xMax;\n this._yMin = next.yMin;\n this._yMax = next.yMax;\n }\n\n pan(intent: PanIntent): void {\n const { dx, dy } = intent;\n Camera2D.assertFinite(\"dx\", dx);\n Camera2D.assertFinite(\"dy\", dy);\n const rangeX = this._xMax - this._xMin;\n const rangeY = this._yMax - this._yMin;\n this.setViewport({\n xMin: this._xMin + dx * rangeX,\n xMax: this._xMax + dx * rangeX,\n yMin: this._yMin + dy * rangeY,\n yMax: this._yMax + dy * rangeY,\n });\n }\n\n zoom(intent: ZoomIntent): void {\n const { factor, cx, cy, axis } = intent;\n Camera2D.assertFinite(\"factor\", factor);\n Camera2D.assertFinite(\"cx\", cx);\n Camera2D.assertFinite(\"cy\", cy);\n if (factor <= 0) throw new RangeError(\"Camera2D zoom factor must be > 0.\");\n\n const rangeX = this._xMax - this._xMin;\n const rangeY = this._yMax - this._yMin;\n const dataCx = this._xMin + rangeX * cx;\n const dataCy = this._yMin + rangeY * cy;\n const newRangeX = axis === \"y\" ? rangeX : rangeX / factor;\n const newRangeY = axis === \"x\" ? rangeY : rangeY / factor;\n this.setViewport({\n xMin: dataCx - newRangeX * cx,\n xMax: dataCx + newRangeX * (1 - cx),\n yMin: dataCy - newRangeY * cy,\n yMax: dataCy + newRangeY * (1 - cy),\n });\n }\n\n toClip(x: number, y: number): [number, number] {\n return [\n x * this.xScale + this.xOffset,\n y * this.yScale + this.yOffset,\n ];\n }\n\n toScreen(clipX: number, clipY: number, canvasWidth: number, canvasHeight: number): [number, number] {\n return [\n (clipX + 1) * 0.5 * canvasWidth,\n (1 - clipY) * 0.5 * canvasHeight,\n ];\n }\n\n clone(): Camera2D {\n const c = new Camera2D();\n c.setViewport(this.viewport);\n return c;\n }\n\n private static assertValidViewport(v: Viewport): void {\n Camera2D.assertFinite(\"xMin\", v.xMin);\n Camera2D.assertFinite(\"xMax\", v.xMax);\n Camera2D.assertFinite(\"yMin\", v.yMin);\n Camera2D.assertFinite(\"yMax\", v.yMax);\n if (v.xMax <= v.xMin) throw new RangeError(\"Camera2D requires xMax > xMin.\");\n if (v.yMax <= v.yMin) throw new RangeError(\"Camera2D requires yMax > yMin.\");\n }\n\n private static assertFinite(name: string, value: number): void {\n if (!Number.isFinite(value)) throw new RangeError(`Camera2D ${name} must be finite.`);\n }\n}\n","import type { Camera2D } from \"./Camera2D.js\";\n\nexport class AxisController {\n constructor(private readonly camera: Camera2D) {}\n\n getXTickValues(canvasWidth: number, maxTicks: number = 10, target: number[] = []): number[] {\n return this.getTickValues(this.camera.xMin, this.camera.xMax, canvasWidth, maxTicks, 80, target);\n }\n\n getYTickValues(canvasHeight: number, maxTicks: number = 10, target: number[] = []): number[] {\n return this.getTickValues(this.camera.yMin, this.camera.yMax, canvasHeight, maxTicks, 48, target);\n }\n\n formatValue(value: number): string {\n if (Math.abs(value) < 1e-12) return \"0\";\n const abs = Math.abs(value);\n if (abs >= 1e6 || abs < 1e-3) return value.toExponential(2);\n if (abs >= 100) return value.toFixed(0);\n if (abs >= 10) return value.toFixed(1);\n return value.toFixed(2);\n }\n\n private getTickValues(min: number, max: number, pixelSize: number, maxTicks: number, minPixelSpacing: number, target: number[]): number[] {\n target.length = 0;\n if (pixelSize <= 0 || maxTicks <= 0) return target;\n\n const range = max - min;\n if (!Number.isFinite(range) || range <= 0) return target;\n\n const targetTicks = Math.max(2, Math.min(maxTicks, Math.floor(pixelSize / minPixelSpacing)));\n const step = this.niceStep(range / (targetTicks - 1));\n const firstIndex = Math.floor(min / step);\n const lastIndex = Math.ceil(max / step);\n\n for (let index = firstIndex; index <= lastIndex && target.length < maxTicks + 2; index++) {\n target.push(this.normalizeTick(index * step, step));\n }\n\n return target;\n }\n\n private niceStep(rawStep: number): number {\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n const normalized = rawStep / magnitude;\n\n if (normalized <= 1.5) return magnitude;\n if (normalized <= 3) return 2 * magnitude;\n if (normalized <= 7) return 5 * magnitude;\n return 10 * magnitude;\n }\n\n private normalizeTick(value: number, step: number): number {\n const decimals = Math.max(0, -Math.floor(Math.log10(step)) + 2);\n const normalized = Number(value.toFixed(decimals));\n return Object.is(normalized, -0) ? 0 : normalized;\n }\n}\n","import type { Camera2D } from \"../interaction/Camera2D.js\";\nimport type { AxisController } from \"../interaction/AxisController.js\";\nimport type { ChartLayoutElements, ChartLayoutConfig } from \"./ChartLayout.js\";\n\nexport interface AxisOverlayOptions {\n readonly font?: string;\n readonly color?: string;\n}\n\nexport type AxisOverlayConfig = ChartLayoutConfig;\n\nexport class AxisOverlay {\n private xPool: HTMLDivElement[] = [];\n private yPool: HTMLDivElement[] = [];\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n\n constructor(\n private readonly layout: ChartLayoutElements,\n private readonly config: AxisOverlayConfig,\n private readonly options: AxisOverlayOptions = {},\n ) {}\n\n update(camera: Camera2D, axis: AxisController): void {\n const plotW = Math.max(1, this.layout.plot.clientWidth);\n const plotH = Math.max(1, this.layout.plot.clientHeight);\n\n if (this.config.x.visible) {\n axis.getXTickValues(plotW, 12, this.xTicks);\n } else {\n this.xTicks.length = 0;\n }\n\n if (this.config.y.visible) {\n axis.getYTickValues(plotH, 8, this.yTicks);\n } else {\n this.yTicks.length = 0;\n }\n\n this.updateAxis(this.xPool, this.xTicks, \"x\", camera, plotW, plotH, axis);\n this.updateAxis(this.yPool, this.yTicks, \"y\", camera, plotW, plotH, axis);\n }\n\n dispose(): void {\n for (const el of this.xPool) el.remove();\n for (const el of this.yPool) el.remove();\n this.xPool = [];\n this.yPool = [];\n }\n\n private parentForAxis(axis: \"x\" | \"y\"): HTMLElement {\n if (axis === \"x\") {\n return this.config.x.position === \"outside\" ? this.layout.xAxis : this.layout.plot;\n }\n return this.config.y.position === \"outside\" ? this.layout.yAxis : this.layout.plot;\n }\n\n private updateAxis(\n pool: HTMLDivElement[],\n values: number[],\n axis: \"x\" | \"y\",\n camera: Camera2D,\n plotW: number,\n plotH: number,\n controller: AxisController,\n ): void {\n const parent = this.parentForAxis(axis);\n\n while (pool.length < values.length) {\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.pointerEvents = \"none\";\n el.style.whiteSpace = \"nowrap\";\n el.style.font = this.options.font ?? \"11px ui-monospace, monospace, sans-serif\";\n el.style.color = this.options.color ?? \"#bfd6ff\";\n el.style.userSelect = \"none\";\n parent.appendChild(el);\n pool.push(el);\n }\n\n for (const el of pool) {\n if (el.parentElement !== parent) parent.appendChild(el);\n }\n\n for (let i = values.length; i < pool.length; i++) {\n pool[i]!.style.display = \"none\";\n }\n\n for (let i = 0; i < values.length; i++) {\n const el = pool[i]!;\n const value = values[i]!;\n const text = controller.formatValue(value);\n if (el.textContent !== text) {\n el.textContent = text;\n }\n el.style.display = \"block\";\n\n if (axis === \"x\") {\n const [clipX] = camera.toClip(value, camera.yMin);\n const screenX = (clipX + 1) * 0.5 * plotW;\n el.style.left = `${screenX}px`;\n el.style.right = \"auto\";\n el.style.transform = \"translateX(-50%)\";\n if (this.config.x.position === \"outside\") {\n el.style.top = \"4px\";\n el.style.bottom = \"auto\";\n } else {\n el.style.top = \"auto\";\n el.style.bottom = \"4px\";\n }\n } else {\n const [, clipY] = camera.toClip(camera.xMin, value);\n const screenY = (1 - clipY) * 0.5 * plotH;\n el.style.top = `${screenY}px`;\n el.style.bottom = \"auto\";\n el.style.transform = \"translateY(-50%)\";\n if (this.config.y.position === \"outside\") {\n el.style.left = \"auto\";\n el.style.right = \"4px\";\n } else {\n el.style.left = \"4px\";\n el.style.right = \"auto\";\n }\n }\n }\n }\n}\n","export type AxisPosition = \"inside\" | \"outside\";\n\nexport interface NormalizedAxisConfig {\n readonly visible: boolean;\n readonly position: AxisPosition;\n}\n\nexport interface ChartLayoutConfig {\n readonly x: NormalizedAxisConfig;\n readonly y: NormalizedAxisConfig;\n}\n\nexport interface ChartLayoutElements {\n readonly root: HTMLDivElement;\n readonly plot: HTMLDivElement;\n readonly canvas: HTMLCanvasElement;\n readonly xAxis: HTMLDivElement;\n readonly yAxis: HTMLDivElement;\n readonly corner: HTMLDivElement;\n}\n\nexport const LEFT_AXIS_GUTTER_CSS = 52;\nexport const BOTTOM_AXIS_GUTTER_CSS = 28;\n\nexport class ChartLayout implements ChartLayoutElements {\n readonly root: HTMLDivElement;\n readonly plot: HTMLDivElement;\n readonly canvas: HTMLCanvasElement;\n readonly xAxis: HTMLDivElement;\n readonly yAxis: HTMLDivElement;\n readonly corner: HTMLDivElement;\n\n private readonly externalCanvas: boolean;\n private readonly originalCanvasCssText: string;\n private readonly originalCanvasParent: HTMLElement | null;\n\n constructor(target: HTMLElement, config: ChartLayoutConfig) {\n const canvasTarget = target instanceof HTMLCanvasElement ? target : null;\n this.externalCanvas = canvasTarget !== null;\n this.originalCanvasCssText = canvasTarget?.style.cssText ?? \"\";\n this.originalCanvasParent = canvasTarget?.parentElement ?? null;\n\n this.root = document.createElement(\"div\");\n this.plot = document.createElement(\"div\");\n this.canvas = canvasTarget ?? document.createElement(\"canvas\");\n this.xAxis = document.createElement(\"div\");\n this.yAxis = document.createElement(\"div\");\n this.corner = document.createElement(\"div\");\n\n this.root.className = \"blazeplot-root\";\n this.plot.className = \"blazeplot-plot\";\n this.canvas.classList.add(\"blazeplot-canvas\");\n this.xAxis.className = \"blazeplot-axis blazeplot-axis-x\";\n this.yAxis.className = \"blazeplot-axis blazeplot-axis-y\";\n this.corner.className = \"blazeplot-axis-corner\";\n\n this.applyBaseStyles();\n this.mount(target);\n this.update(config);\n }\n\n update(config: ChartLayoutConfig): void {\n const hasOutsideY = config.y.visible && config.y.position === \"outside\";\n const hasOutsideX = config.x.visible && config.x.position === \"outside\";\n\n this.root.style.gridTemplateColumns = `${hasOutsideY ? LEFT_AXIS_GUTTER_CSS : 0}px minmax(0, 1fr)`;\n this.root.style.gridTemplateRows = `minmax(0, 1fr) ${hasOutsideX ? BOTTOM_AXIS_GUTTER_CSS : 0}px`;\n this.yAxis.style.display = hasOutsideY ? \"block\" : \"none\";\n this.xAxis.style.display = hasOutsideX ? \"block\" : \"none\";\n this.corner.style.display = hasOutsideX && hasOutsideY ? \"block\" : \"none\";\n }\n\n dispose(): void {\n if (this.externalCanvas && this.originalCanvasParent) {\n this.canvas.style.cssText = this.originalCanvasCssText;\n this.originalCanvasParent.insertBefore(this.canvas, this.root);\n }\n this.root.remove();\n }\n\n private mount(target: HTMLElement): void {\n if (this.externalCanvas) {\n this.originalCanvasParent?.insertBefore(this.root, target);\n } else {\n target.appendChild(this.root);\n }\n\n this.root.appendChild(this.yAxis);\n this.root.appendChild(this.plot);\n this.root.appendChild(this.corner);\n this.root.appendChild(this.xAxis);\n this.plot.appendChild(this.canvas);\n }\n\n private applyBaseStyles(): void {\n this.root.style.display = \"grid\";\n this.root.style.width = \"100%\";\n this.root.style.height = \"100%\";\n this.root.style.minWidth = \"0\";\n this.root.style.minHeight = \"0\";\n this.root.style.overflow = \"hidden\";\n\n this.plot.style.position = \"relative\";\n this.plot.style.gridColumn = \"2\";\n this.plot.style.gridRow = \"1\";\n this.plot.style.minWidth = \"0\";\n this.plot.style.minHeight = \"0\";\n this.plot.style.overflow = \"hidden\";\n\n this.canvas.style.position = \"absolute\";\n this.canvas.style.inset = \"0\";\n this.canvas.style.display = \"block\";\n this.canvas.style.width = \"100%\";\n this.canvas.style.height = \"100%\";\n this.canvas.style.touchAction = \"none\";\n\n this.yAxis.style.position = \"relative\";\n this.yAxis.style.gridColumn = \"1\";\n this.yAxis.style.gridRow = \"1\";\n this.yAxis.style.minWidth = \"0\";\n this.yAxis.style.minHeight = \"0\";\n this.yAxis.style.overflow = \"hidden\";\n this.yAxis.style.pointerEvents = \"none\";\n\n this.xAxis.style.position = \"relative\";\n this.xAxis.style.gridColumn = \"2\";\n this.xAxis.style.gridRow = \"2\";\n this.xAxis.style.minWidth = \"0\";\n this.xAxis.style.minHeight = \"0\";\n this.xAxis.style.overflow = \"hidden\";\n this.xAxis.style.pointerEvents = \"none\";\n\n this.corner.style.gridColumn = \"1\";\n this.corner.style.gridRow = \"2\";\n this.corner.style.minWidth = \"0\";\n this.corner.style.minHeight = \"0\";\n this.corner.style.pointerEvents = \"none\";\n }\n}\n","import type { SeriesConfig, SeriesStyle, Dataset } from \"../core/types.js\";\nimport { SeriesStore } from \"../core/SeriesStore.js\";\nimport { RingBuffer } from \"../core/RingBuffer.js\";\nimport { Renderer } from \"../render/Renderer.js\";\nimport { ReglBackend } from \"../render/ReglBackend.js\";\nimport type { GpuBuffer } from \"../render/types.js\";\nimport { InputController } from \"../interaction/InputController.js\";\nimport { Camera2D } from \"../interaction/Camera2D.js\";\nimport { AxisController } from \"../interaction/AxisController.js\";\nimport type { ViewportPolicy } from \"../interaction/types.js\";\nimport { AxisOverlay } from \"./AxisOverlay.js\";\nimport { ChartLayout } from \"./ChartLayout.js\";\nimport type { AxisPosition, NormalizedAxisConfig } from \"./ChartLayout.js\";\n\nconst RAW_LINE_VERTEX_CAPACITY = 16_384;\nconst AREA_POINT_CAPACITY = RAW_LINE_VERTEX_CAPACITY >> 1;\nconst MINMAX_SEGMENT_CAPACITY = RAW_LINE_VERTEX_CAPACITY >> 1;\nconst FLOATS_PER_MINMAX_SEGMENT_INSTANCE = 3;\nconst GRID_LINE_VERTEX_CAPACITY = 64;\n\nexport interface AxisConfig {\n readonly visible?: boolean;\n readonly position?: AxisPosition;\n}\n\nexport interface ChartOptions {\n readonly viewportPolicy?: ViewportPolicy;\n readonly grid?: boolean;\n readonly gridStyle?: Partial<SeriesStyle>;\n readonly axes?: boolean | { x?: boolean | AxisConfig; y?: boolean | AxisConfig };\n}\n\nexport interface ChartFrameStats {\n fps: number;\n frameMs: number;\n pointsRendered: number;\n drawCalls: number;\n uploadBytes: number;\n renderMode: \"none\" | \"raw\" | \"minmax\" | \"points\" | \"bars\" | \"area\" | \"mixed\";\n}\n\nfunction normalizeAxisConfig(config: boolean | AxisConfig | undefined): NormalizedAxisConfig {\n if (config === false) return { visible: false, position: \"inside\" };\n if (config === true || config === undefined) return { visible: true, position: \"inside\" };\n return {\n visible: config.visible !== false,\n position: config.position ?? \"inside\",\n };\n}\n\nexport class Chart {\n private series: SeriesStore[] = [];\n private camera: Camera2D;\n private axis: AxisController;\n private renderer: Renderer;\n private input: InputController;\n private rawLineBuffer: GpuBuffer;\n private rawLineData: Float32Array;\n private minMaxInstanceBuffer: GpuBuffer;\n private minMaxInstanceData: Float32Array;\n private gridBuffer: GpuBuffer;\n private gridData: Float32Array;\n private gridStyle: SeriesStyle;\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n private axisOverlay: AxisOverlay | null = null;\n private normalizedAxes: { x: NormalizedAxisConfig; y: NormalizedAxisConfig };\n private layout: ChartLayout;\n private stats: ChartFrameStats = {\n fps: 0,\n frameMs: 0,\n pointsRendered: 0,\n drawCalls: 0,\n uploadBytes: 0,\n renderMode: \"none\",\n };\n private resizeObserver: ResizeObserver | null = null;\n private lastFrameAt: number = 0;\n private _rafId: number = 0;\n\n constructor(target: HTMLElement, private readonly options: ChartOptions = {}) {\n const axesOpt = options.axes;\n if (axesOpt === false) {\n this.normalizedAxes = { x: { visible: false, position: \"inside\" }, y: { visible: false, position: \"inside\" } };\n } else if (axesOpt === true || axesOpt === undefined) {\n this.normalizedAxes = { x: { visible: true, position: \"inside\" }, y: { visible: true, position: \"inside\" } };\n } else {\n this.normalizedAxes = {\n x: normalizeAxisConfig(axesOpt.x),\n y: normalizeAxisConfig(axesOpt.y),\n };\n }\n\n this.layout = new ChartLayout(target, this.normalizedAxes);\n this.applyCanvasSize();\n this.camera = new Camera2D();\n this.axis = new AxisController(this.camera);\n this.renderer = new Renderer(new ReglBackend(this.layout.canvas));\n this.input = new InputController(this.layout.canvas, this.camera, options.viewportPolicy);\n this.rawLineData = new Float32Array(RAW_LINE_VERTEX_CAPACITY * 2);\n this.rawLineBuffer = this.renderer.createFloatBuffer(this.rawLineData.length);\n this.minMaxInstanceData = new Float32Array(MINMAX_SEGMENT_CAPACITY * FLOATS_PER_MINMAX_SEGMENT_INSTANCE);\n this.minMaxInstanceBuffer = this.renderer.createFloatBuffer(this.minMaxInstanceData.length);\n this.gridData = new Float32Array(GRID_LINE_VERTEX_CAPACITY * 2);\n this.gridBuffer = this.renderer.createFloatBuffer(this.gridData.length);\n this.gridStyle = {\n color: options.gridStyle?.color ?? [0.22, 0.30, 0.44, 0.45],\n lineWidth: options.gridStyle?.lineWidth ?? 1,\n };\n\n if (this.normalizedAxes.x.visible || this.normalizedAxes.y.visible) {\n this.axisOverlay = new AxisOverlay(this.layout, this.normalizedAxes);\n }\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(this.layout.plot);\n }\n }\n\n get canvas(): HTMLCanvasElement {\n return this.layout.canvas;\n }\n\n addSeries(config: SeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n const dataset: Dataset = config.dataset ?? new RingBuffer(config.capacity);\n const color = style?.color ?? [0.3, 0.6, 1.0, 1.0];\n const s = new SeriesStore(dataset, config, {\n color,\n lineWidth: style?.lineWidth ?? 1,\n pointSize: style?.pointSize ?? 4,\n barWidth: style?.barWidth ?? 0.8,\n baseline: style?.baseline ?? 0,\n fillColor: style?.fillColor ?? [color[0], color[1], color[2], color[3] * 0.25],\n });\n this.series.push(s);\n return s;\n }\n\n removeSeries(series: SeriesStore): boolean {\n const index = this.series.indexOf(series);\n if (index === -1) return false;\n\n this.series.splice(index, 1);\n return true;\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n this.camera.setViewport(v);\n }\n\n resize(dpr: number = globalThis.devicePixelRatio): boolean {\n return this.applyCanvasSize(dpr);\n }\n\n getFrameStats(target: ChartFrameStats = { fps: 0, frameMs: 0, pointsRendered: 0, drawCalls: 0, uploadBytes: 0, renderMode: \"none\" }): ChartFrameStats {\n target.fps = this.stats.fps;\n target.frameMs = this.stats.frameMs;\n target.pointsRendered = this.stats.pointsRendered;\n target.drawCalls = this.stats.drawCalls;\n target.uploadBytes = this.stats.uploadBytes;\n target.renderMode = this.stats.renderMode;\n return target;\n }\n\n start(): void {\n const frame = (): void => {\n this._rafId = requestAnimationFrame(frame);\n this.render();\n };\n this._rafId = requestAnimationFrame(frame);\n }\n\n stop(): void {\n cancelAnimationFrame(this._rafId);\n }\n\n private render(): void {\n const frameStartedAt = performance.now();\n if (this.lastFrameAt > 0) {\n this.stats.fps = 1000 / (frameStartedAt - this.lastFrameAt);\n }\n this.lastFrameAt = frameStartedAt;\n this.stats.pointsRendered = 0;\n this.stats.drawCalls = 0;\n this.stats.uploadBytes = 0;\n this.stats.renderMode = \"none\";\n\n this.options.viewportPolicy?.beforeRender?.(this.camera);\n\n this.renderer.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.renderer.clear(0.08, 0.10, 0.16, 1);\n\n const viewport = this.camera.viewport;\n if (this.options.grid !== false) {\n const gridVertexCount = this.writeGridVertices(viewport);\n if (gridVertexCount > 0) {\n this.renderer.updateFloatBuffer(this.gridBuffer, this.gridData);\n this.renderer.drawLines(this.gridBuffer, gridVertexCount, this.gridStyle, this.camera);\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.gridData.byteLength;\n }\n }\n\n for (const s of this.series) {\n if (!s.visible) continue;\n if (s.config.mode === \"scatter\") {\n this.drawScatterSeries(s, viewport);\n continue;\n }\n if (s.config.mode === \"bar\") {\n this.drawBarSeries(s, viewport);\n continue;\n }\n if (s.config.mode === \"area\") {\n this.drawAreaSeries(s, viewport);\n continue;\n }\n\n const visibleSamples = s.visibleSampleCount(viewport);\n const dense = s.hasLOD && visibleSamples > RAW_LINE_VERTEX_CAPACITY;\n if (dense && this.renderer.supportsInstancedSegments) {\n const segmentCount = s.copyMinMaxInstanced(viewport, this.minMaxInstanceData, this.maxMinMaxSegments());\n if (segmentCount <= 0) continue;\n this.renderer.updateFloatBuffer(this.minMaxInstanceBuffer, this.minMaxInstanceData);\n this.renderer.drawMinMaxSegmentsInstanced(this.minMaxInstanceBuffer, segmentCount, s.style, this.camera);\n this.recordRenderMode(\"minmax\");\n this.stats.pointsRendered += segmentCount * 2;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.minMaxInstanceData.byteLength;\n continue;\n }\n\n const count = dense\n ? s.copyMinMaxVisible(viewport, this.rawLineData, this.maxMinMaxSegments())\n : s.copyRawVisible(viewport, this.rawLineData, RAW_LINE_VERTEX_CAPACITY);\n if (count < 2) continue;\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n if (dense) {\n this.renderer.drawMinMaxSegments(this.rawLineBuffer, count, s.style, this.camera);\n this.recordRenderMode(\"minmax\");\n } else {\n this.renderer.drawLineStrip(this.rawLineBuffer, count, s.style, this.camera);\n this.recordRenderMode(\"raw\");\n }\n this.stats.pointsRendered += count;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.rawLineData.byteLength;\n }\n\n this.axisOverlay?.update(this.camera, this.axis);\n\n this.stats.frameMs = performance.now() - frameStartedAt;\n }\n\n dispose(): void {\n this.stop();\n this.resizeObserver?.disconnect();\n this.input.dispose();\n this.axisOverlay?.dispose();\n this.renderer.dispose();\n this.layout.dispose();\n }\n\n private applyCanvasSize(dpr: number = globalThis.devicePixelRatio): boolean {\n const scale = Number.isFinite(dpr) ? Math.max(1, dpr) : 1;\n const width = Math.max(1, Math.floor(this.canvas.clientWidth * scale));\n const height = Math.max(1, Math.floor(this.canvas.clientHeight * scale));\n if (this.canvas.width === width && this.canvas.height === height) return false;\n\n this.canvas.width = width;\n this.canvas.height = height;\n return true;\n }\n\n private drawAreaSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n const baseline = series.style.baseline ?? 0;\n const areaVertexCount = series.copyAreaVisible(viewport, this.rawLineData, AREA_POINT_CAPACITY, baseline);\n if (areaVertexCount < 4) return;\n\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n this.renderer.drawAreaStrip(this.rawLineBuffer, areaVertexCount, series.style, this.camera);\n this.stats.pointsRendered += areaVertexCount;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.rawLineData.byteLength;\n\n const lineVertexCount = this.uploadRawInstances(series, viewport, AREA_POINT_CAPACITY);\n if (lineVertexCount >= 2) {\n this.renderer.drawLineStrip(this.rawLineBuffer, lineVertexCount, series.style, this.camera);\n this.stats.pointsRendered += lineVertexCount;\n this.stats.drawCalls++;\n }\n\n this.recordRenderMode(\"area\");\n }\n\n private drawScatterSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n if (!this.renderer.supportsInstancedPoints) return;\n const count = this.uploadRawInstances(series, viewport, RAW_LINE_VERTEX_CAPACITY);\n if (count <= 0) return;\n\n this.renderer.drawPointsInstanced(this.rawLineBuffer, count, series.style, this.camera, this.canvas.width, this.canvas.height);\n this.recordInstancedDraw(\"points\", count);\n }\n\n private drawBarSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n if (!this.renderer.supportsInstancedBars) return;\n const count = this.uploadRawInstances(series, viewport, RAW_LINE_VERTEX_CAPACITY);\n if (count <= 0) return;\n\n this.renderer.drawBarsInstanced(this.rawLineBuffer, count, series.style, this.camera);\n this.recordInstancedDraw(\"bars\", count);\n }\n\n private uploadRawInstances(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n maxPoints: number,\n ): number {\n const count = series.copyRawVisible(viewport, this.rawLineData, maxPoints);\n if (count <= 0) return 0;\n\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n this.stats.uploadBytes += this.rawLineData.byteLength;\n return count;\n }\n\n private recordInstancedDraw(mode: \"points\" | \"bars\", count: number): void {\n this.recordRenderMode(mode);\n this.stats.pointsRendered += count;\n this.stats.drawCalls++;\n }\n\n private maxMinMaxSegments(): number {\n return Math.min(this.canvas.width, MINMAX_SEGMENT_CAPACITY);\n }\n\n private writeGridVertices(\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): number {\n const plotW = Math.max(1, this.canvas.clientWidth);\n const plotH = Math.max(1, this.canvas.clientHeight);\n this.axis.getXTickValues(plotW, 12, this.xTicks);\n this.axis.getYTickValues(plotH, 8, this.yTicks);\n\n let vertexCount = 0;\n for (const x of this.xTicks) {\n if (vertexCount + 2 > GRID_LINE_VERTEX_CAPACITY) return vertexCount;\n this.gridData[vertexCount * 2] = x;\n this.gridData[vertexCount * 2 + 1] = viewport.yMin;\n vertexCount++;\n this.gridData[vertexCount * 2] = x;\n this.gridData[vertexCount * 2 + 1] = viewport.yMax;\n vertexCount++;\n }\n\n for (const y of this.yTicks) {\n if (vertexCount + 2 > GRID_LINE_VERTEX_CAPACITY) return vertexCount;\n this.gridData[vertexCount * 2] = viewport.xMin;\n this.gridData[vertexCount * 2 + 1] = y;\n vertexCount++;\n this.gridData[vertexCount * 2] = viewport.xMax;\n this.gridData[vertexCount * 2 + 1] = y;\n vertexCount++;\n }\n\n return vertexCount;\n }\n\n private recordRenderMode(mode: \"raw\" | \"minmax\" | \"points\" | \"bars\" | \"area\"): void {\n if (this.stats.renderMode === \"none\") {\n this.stats.renderMode = mode;\n } else if (this.stats.renderMode !== mode) {\n this.stats.renderMode = \"mixed\";\n }\n }\n}\n","import type { Dataset, TimeRange } from \"./types.js\";\n\nexport class StaticDataset implements Dataset {\n constructor(\n private readonly xData: ArrayLike<number>,\n private readonly yData: ArrayLike<number>,\n ) {}\n\n get length(): number {\n return Math.min(this.xData.length, this.yData.length);\n }\n\n get range(): TimeRange | null {\n if (this.length === 0) return null;\n return { start: this.xData[0]!, end: this.xData[this.length - 1]! };\n }\n\n getX(index: number): number {\n this.assertValidIndex(index);\n return this.xData[index]!;\n }\n\n getY(index: number): number {\n this.assertValidIndex(index);\n return this.yData[index]!;\n }\n\n lowerBoundX(x: number): number {\n let lo = 0;\n let hi = this.length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.xData[mid]! < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n upperBoundX(x: number): number {\n let lo = 0;\n let hi = this.length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.xData[mid]! <= x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n private assertValidIndex(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this.length) {\n throw new RangeError(`StaticDataset index out of range: ${index}`);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/core/MinMaxPyramid.ts","../src/core/SeriesStore.ts","../src/core/RingBuffer.ts","../src/render/ShaderPrograms.ts","../src/render/Renderer.ts","../src/render/WebGL2Resources.ts","../src/render/ReglBackend.ts","../src/interaction/InputController.ts","../src/interaction/Camera2D.ts","../src/interaction/AxisController.ts","../src/ui/AxisOverlay.ts","../src/ui/ChartLayout.ts","../src/ui/Chart.ts","../src/core/StaticDataset.ts"],"sourcesContent":["import type { Dataset, LODView, Viewport } from \"./types.js\";\n\nconst MAX_LEVELS = 16;\n\nexport class MinMaxPyramid {\n private levels: Float32Array[] = [];\n private levelLengths: Uint32Array;\n private levelSampleWidths: Uint32Array;\n private _builtLen: number = 0;\n private _lastRangeStart: number = NaN;\n\n constructor(readonly bucketSize: number = 2) {\n if (!Number.isInteger(bucketSize) || bucketSize < 2) {\n throw new RangeError(\"MinMaxPyramid bucketSize must be an integer >= 2.\");\n }\n\n this.levelLengths = new Uint32Array(MAX_LEVELS);\n this.levelSampleWidths = new Uint32Array(MAX_LEVELS);\n }\n\n build(source: Dataset): void {\n this.levels = [];\n this.levelLengths.fill(0);\n this.levelSampleWidths.fill(0);\n\n let srcLen = source.length;\n if (srcLen === 0) {\n this._builtLen = 0;\n this._lastRangeStart = NaN;\n return;\n }\n\n let prevLevel: Float32Array | null = null;\n let level = 0;\n\n while (srcLen > 0 && level < MAX_LEVELS) {\n const nextLen = Math.ceil(srcLen / this.bucketSize);\n const levelData = new Float32Array(nextLen * 2);\n\n for (let i = 0; i < srcLen; i += this.bucketSize) {\n let minY = Infinity;\n let maxY = -Infinity;\n const end = Math.min(i + this.bucketSize, srcLen);\n for (let j = i; j < end; j++) {\n if (prevLevel) {\n const prevMin = prevLevel[j * 2]!;\n const prevMax = prevLevel[j * 2 + 1]!;\n if (prevMin < minY) minY = prevMin;\n if (prevMax > maxY) maxY = prevMax;\n } else {\n const y = source.getY(j);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n const outIdx = Math.floor(i / this.bucketSize);\n levelData[outIdx * 2] = minY;\n levelData[outIdx * 2 + 1] = maxY;\n }\n\n this.levels[level] = levelData;\n this.levelLengths[level] = nextLen;\n this.levelSampleWidths[level] = this.bucketSize ** (level + 1);\n\n if (nextLen === 1) break;\n\n prevLevel = levelData;\n srcLen = nextLen;\n level++;\n }\n\n this._builtLen = source.length;\n this._lastRangeStart = source.range?.start ?? NaN;\n }\n\n incrementalBuild(source: Dataset): void {\n const newLen = source.length;\n const rangeStart = source.range?.start ?? NaN;\n\n if (newLen === 0) {\n this.levels = [];\n this.levelLengths.fill(0);\n this.levelSampleWidths.fill(0);\n this._builtLen = 0;\n this._lastRangeStart = NaN;\n return;\n }\n\n if (newLen < this._builtLen || rangeStart !== this._lastRangeStart) {\n this.build(source);\n return;\n }\n\n if (newLen === this._builtLen) return;\n\n this.appendTail(source, newLen - this._builtLen);\n this._builtLen = newLen;\n }\n\n private appendTail(source: Dataset, appendedCount: number): void {\n const newLen = source.length;\n const W = this.bucketSize;\n let changedIdx = newLen - appendedCount;\n\n for (let L = 0; L < MAX_LEVELS; L++) {\n const items: number = L === 0 ? newLen : this.levelLengths[L - 1]!;\n const first = Math.floor(changedIdx / W);\n const last = Math.ceil(items / W) - 1;\n\n if (first > last) break;\n\n this.levelSampleWidths[L] = W ** (L + 1);\n this.ensureLevelData(L, last + 1);\n\n for (let b = first; b <= last; b++) {\n const start = b * W;\n const end = Math.min((b + 1) * W, items);\n\n let minY = Infinity;\n let maxY = -Infinity;\n\n if (L === 0) {\n for (let j = start; j < end; j++) {\n const y = source.getY(j);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n } else {\n const prev = this.levels[L - 1]!;\n for (let j = start; j < end; j++) {\n const pMin = prev[j * 2]!;\n const pMax = prev[j * 2 + 1]!;\n if (pMin < minY) minY = pMin;\n if (pMax > maxY) maxY = pMax;\n }\n }\n\n const dst = this.levels[L]!;\n dst[b * 2] = minY;\n dst[b * 2 + 1] = maxY;\n }\n\n this.levelLengths[L] = last + 1;\n changedIdx = first;\n\n if (this.levelLengths[L]! <= 1) break;\n }\n }\n\n private ensureLevelData(level: number, minBuckets: number): void {\n const needed = minBuckets * 2;\n const current = this.levels[level];\n if (current && current.length >= needed) return;\n\n const next = new Float32Array(needed);\n if (current) {\n next.set(current.subarray(0, Math.min(current.length, needed)));\n }\n this.levels[level] = next;\n }\n\n rangeMinMax(source: Dataset, start: number, end: number): { minY: number; maxY: number } | null {\n const from = Math.max(0, Math.floor(start));\n const to = Math.min(source.length, Math.ceil(end));\n if (to <= from) return null;\n\n let minY = Infinity;\n let maxY = -Infinity;\n let i = from;\n\n while (i < to) {\n let level = -1;\n let width = 1;\n for (let L = this.levels.length - 1; L >= 0; L--) {\n const sampleWidth = this.levelSampleWidths[L]!;\n const bucket = Math.floor(i / sampleWidth);\n if (\n sampleWidth > 0 &&\n i % sampleWidth === 0 &&\n i + sampleWidth <= to &&\n bucket < this.levelLengths[L]!\n ) {\n level = L;\n width = sampleWidth;\n break;\n }\n }\n\n if (level >= 0) {\n const bucket = Math.floor(i / width);\n const data = this.levels[level]!;\n const pMin = data[bucket * 2]!;\n const pMax = data[bucket * 2 + 1]!;\n if (pMin < minY) minY = pMin;\n if (pMax > maxY) maxY = pMax;\n i += width;\n } else {\n const y = source.getY(i);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n i++;\n }\n }\n\n return Number.isFinite(minY) && Number.isFinite(maxY) ? { minY, maxY } : null;\n }\n\n query(_viewport: Viewport, pixelWidth: number, xRange: { start: number; length: number }): LODView {\n if (pixelWidth <= 0 || xRange.length <= 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const visibleSamples = xRange.length;\n const samplesPerPixel = Math.max(1, visibleSamples / pixelWidth);\n const level = Math.min(\n Math.max(0, Math.ceil(Math.log2(samplesPerPixel)) - 1),\n this.levels.length - 1,\n );\n\n const levelData = this.levels[level];\n const levelLen = this.levelLengths[level];\n const sampleWidth = this.levelSampleWidths[level];\n if (!levelData || levelLen === undefined || sampleWidth === undefined || levelLen === 0 || sampleWidth === 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel };\n }\n\n const queryStart = Math.max(0, xRange.start);\n const queryEnd = queryStart + xRange.length;\n const bucketStart = Math.max(0, Math.floor(queryStart / sampleWidth));\n const bucketEnd = Math.min(levelLen, Math.ceil(queryEnd / sampleWidth));\n const count = bucketEnd - bucketStart;\n\n if (count <= 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level, samplesPerPixel };\n }\n\n const result = new Float32Array(count * 2);\n for (let i = 0; i < count; i++) {\n const j = (bucketStart + i) * 2;\n result[i * 2] = levelData[j]!;\n result[i * 2 + 1] = levelData[j + 1]!;\n }\n\n return { buckets: result, bucketCount: count, level, samplesPerPixel };\n }\n}\n","import type { Dataset, AppendableDataset, RangeMinMaxDataset, LODView, Viewport, SeriesConfig, SeriesStyle, SeriesSample } from \"./types.js\";\nimport { MinMaxPyramid } from \"./MinMaxPyramid.js\";\n\nfunction hasRangeMinMaxY(dataset: Dataset): dataset is RangeMinMaxDataset {\n return \"rangeMinMaxY\" in dataset;\n}\n\nexport class SeriesStore {\n readonly config: SeriesConfig;\n readonly style: SeriesStyle;\n private readonly dataset: Dataset;\n private readonly pyramid: MinMaxPyramid | null;\n\n private _dirty: boolean = false;\n private _useRawMinMaxScan: boolean = false;\n private _lastBuildLength: number = 0;\n private _lastBuildRangeStart: number = NaN;\n private _visible: boolean = true;\n\n constructor(dataset: Dataset, config: SeriesConfig, style: SeriesStyle) {\n this.dataset = dataset;\n this.config = config;\n this.pyramid = (config.mode === \"line\" || config.mode === \"bar\") && config.downsample !== \"none\" ? new MinMaxPyramid() : null;\n this.style = style;\n\n if (this.pyramid && dataset.length > 0) {\n this.pyramid.build(dataset);\n }\n this._lastBuildLength = dataset.length;\n this._lastBuildRangeStart = dataset.range?.start ?? NaN;\n }\n\n get hasLOD(): boolean {\n return this.pyramid !== null;\n }\n\n get dirty(): boolean {\n return this._dirty;\n }\n\n get length(): number {\n return this.dataset.length;\n }\n\n get visible(): boolean {\n return this._visible;\n }\n\n setVisible(visible: boolean): void {\n this._visible = visible;\n }\n\n append(x: ArrayLike<number>, y: ArrayLike<number>): void {\n if (!(\"push\" in this.dataset)) {\n throw new TypeError(\"SeriesStore dataset is not appendable.\");\n }\n\n const appendable = this.dataset as AppendableDataset;\n appendable.append(x, y);\n this._dirty = true;\n }\n\n clear(): void {\n if (!(\"clear\" in this.dataset)) {\n throw new TypeError(\"SeriesStore dataset is not clearable.\");\n }\n\n (this.dataset as AppendableDataset).clear();\n if (this.pyramid) this.pyramid.build(this.dataset);\n this._useRawMinMaxScan = false;\n this._lastBuildLength = this.dataset.length;\n this._lastBuildRangeStart = this.dataset.range?.start ?? NaN;\n this._dirty = false;\n }\n\n rebuildPyramid(): void {\n if (!this._dirty) return;\n if (this.pyramid) {\n const length = this.dataset.length;\n const rangeStart = this.dataset.range?.start ?? NaN;\n const shiftedAtCapacity = length === this._lastBuildLength && rangeStart !== this._lastBuildRangeStart;\n if (shiftedAtCapacity) {\n this._useRawMinMaxScan = true;\n } else {\n this.pyramid.incrementalBuild(this.dataset);\n this._useRawMinMaxScan = false;\n }\n this._lastBuildLength = length;\n this._lastBuildRangeStart = rangeStart;\n }\n this._dirty = false;\n }\n\n query(viewport: Viewport, pixelWidth: number): LODView {\n if (!this.pyramid) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const range = this.dataset.range;\n if (!range) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n\n return this.pyramid.query(viewport, pixelWidth, {\n start,\n length: Math.max(0, end - start),\n });\n }\n\n visibleSampleCount(viewport: Viewport): number {\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n return Math.max(0, end - start);\n }\n\n sampleAt(index: number): SeriesSample | null {\n if (index < 0 || index >= this.dataset.length) return null;\n return { index, x: this.dataset.getX(index), y: this.dataset.getY(index) };\n }\n\n nearestSampleByX(x: number, viewport?: Viewport): SeriesSample | null {\n const range = this.visibleIndexRange(viewport);\n if (range.start >= range.end) return null;\n\n const lower = this.dataset.lowerBoundX(x);\n let bestIndex = Math.min(Math.max(lower, range.start), range.end - 1);\n const prevIndex = bestIndex - 1;\n if (prevIndex >= range.start) {\n const bestDx = Math.abs(this.dataset.getX(bestIndex) - x);\n const prevDx = Math.abs(this.dataset.getX(prevIndex) - x);\n if (prevDx <= bestDx) bestIndex = prevIndex;\n }\n\n return this.sampleAt(bestIndex);\n }\n\n nearestSampleByPoint(\n x: number,\n y: number,\n viewport: Viewport,\n plotWidth: number,\n plotHeight: number,\n ): SeriesSample | null {\n const range = this.visibleIndexRange(viewport);\n if (range.start >= range.end || plotWidth <= 0 || plotHeight <= 0) return null;\n\n const xScale = plotWidth / (viewport.xMax - viewport.xMin);\n const yScale = plotHeight / (viewport.yMax - viewport.yMin);\n let bestIndex = -1;\n let bestDistanceSq = Infinity;\n\n for (let i = range.start; i < range.end; i++) {\n const dx = (this.dataset.getX(i) - x) * xScale;\n const dy = (this.dataset.getY(i) - y) * yScale;\n const d2 = dx * dx + dy * dy;\n if (d2 < bestDistanceSq) {\n bestDistanceSq = d2;\n bestIndex = i;\n }\n }\n\n if (bestIndex < 0) return null;\n const sample = this.sampleAt(bestIndex);\n return sample ? { ...sample, distancePx: Math.sqrt(bestDistanceSq) } : null;\n }\n\n copyRawVisible(viewport: Viewport, target: Float32Array, maxPoints: number): number {\n return this.copyVisibleSamples(viewport, target, maxPoints, \"points\", 0);\n }\n\n copyAreaVisible(viewport: Viewport, target: Float32Array, maxPoints: number, baseline: number = 0): number {\n return this.copyVisibleSamples(viewport, target, maxPoints, \"area\", baseline) * 2;\n }\n\n copyMinMaxVisible(viewport: Viewport, target: Float32Array, maxSegments: number): number {\n return this.copyMinMaxSegments(viewport, target, maxSegments, \"line-list\") * 2;\n }\n\n copyMinMaxInstanced(viewport: Viewport, target: Float32Array, maxSegments: number): number {\n return this.copyMinMaxSegments(viewport, target, maxSegments, \"instanced\");\n }\n\n private visibleIndexRange(viewport: Viewport | undefined): { start: number; end: number } {\n if (!viewport) return { start: 0, end: this.dataset.length };\n return {\n start: this.dataset.lowerBoundX(viewport.xMin),\n end: this.dataset.upperBoundX(viewport.xMax),\n };\n }\n\n private copyVisibleSamples(\n viewport: Viewport,\n target: Float32Array,\n maxPoints: number,\n layout: \"points\" | \"area\",\n baseline: number,\n ): number {\n const floatsPerSample = layout === \"points\" ? 2 : 4;\n if (maxPoints <= 0 || target.length < maxPoints * floatsPerSample) return 0;\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n const visible = end - start;\n if (visible <= 0) return 0;\n\n const stride = Math.max(1, Math.ceil(visible / maxPoints));\n let count = 0;\n for (let i = start; i < end && count < maxPoints; i += stride) {\n const x = this.dataset.getX(i);\n const y = this.dataset.getY(i);\n if (layout === \"points\") {\n const offset = count * 2;\n target[offset] = x;\n target[offset + 1] = y;\n } else {\n const offset = count * 4;\n target[offset] = x;\n target[offset + 1] = baseline;\n target[offset + 2] = x;\n target[offset + 3] = y;\n }\n count++;\n }\n\n return count;\n }\n\n private copyMinMaxSegments(\n viewport: Viewport,\n target: Float32Array,\n maxSegments: number,\n layout: \"line-list\" | \"instanced\",\n ): number {\n const floatsPerSegment = layout === \"line-list\" ? 4 : 3;\n if (!this.pyramid || maxSegments <= 0 || target.length < maxSegments * floatsPerSegment) return 0;\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n const visible = end - start;\n if (visible <= 0) return 0;\n\n const segmentCount = Math.min(maxSegments, visible);\n for (let segment = 0; segment < segmentCount; segment++) {\n const segmentStart = start + Math.floor((segment * visible) / segmentCount);\n const segmentEnd = start + Math.max(\n Math.floor(((segment + 1) * visible) / segmentCount),\n Math.floor((segment * visible) / segmentCount) + 1,\n );\n const clampedEnd = Math.min(end, segmentEnd);\n\n const range = this.minMaxForRange(segmentStart, clampedEnd);\n if (!range) continue;\n\n const x = this.dataset.getX(segmentStart + ((clampedEnd - segmentStart) >> 1));\n const { minY, maxY } = range;\n if (layout === \"line-list\") {\n const offset = segment * 4;\n target[offset] = x;\n target[offset + 1] = minY;\n target[offset + 2] = x;\n target[offset + 3] = maxY;\n } else {\n const offset = segment * 3;\n target[offset] = x;\n target[offset + 1] = minY;\n target[offset + 2] = maxY;\n }\n }\n\n return segmentCount;\n }\n\n private minMaxForRange(start: number, end: number): { minY: number; maxY: number } | null {\n if (!this.pyramid || this._useRawMinMaxScan) {\n return this.rawMinMaxForRange(start, end);\n }\n return this.pyramid.rangeMinMax(this.dataset, start, end);\n }\n\n private rawMinMaxForRange(start: number, end: number): { minY: number; maxY: number } | null {\n if (hasRangeMinMaxY(this.dataset)) return this.dataset.rangeMinMaxY(start, end);\n\n const from = Math.max(0, Math.floor(start));\n const to = Math.min(this.dataset.length, Math.ceil(end));\n if (to <= from) return null;\n\n let minY = Infinity;\n let maxY = -Infinity;\n for (let i = from; i < to; i++) {\n const y = this.dataset.getY(i);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n return { minY, maxY };\n }\n}\n","import type { TimeRange } from \"./types.js\";\n\nexport class RingBuffer {\n readonly capacity: number;\n private _length: number = 0;\n private _head: number = 0;\n\n private readonly xData: Float64Array;\n private readonly yData: Float32Array;\n private readonly treeBase: number;\n private readonly minTree: Float32Array;\n private readonly maxTree: Float32Array;\n\n constructor(capacity: number) {\n if (!Number.isInteger(capacity) || capacity <= 0) {\n throw new RangeError(\"RingBuffer capacity must be a positive integer.\");\n }\n\n this.capacity = capacity;\n this.xData = new Float64Array(capacity);\n this.yData = new Float32Array(capacity);\n this.treeBase = RingBuffer.nextPowerOfTwo(capacity);\n this.minTree = new Float32Array(this.treeBase * 2);\n this.maxTree = new Float32Array(this.treeBase * 2);\n this.minTree.fill(Infinity);\n this.maxTree.fill(-Infinity);\n }\n\n get length(): number {\n return this._length;\n }\n\n get range(): TimeRange | null {\n if (this._length === 0) return null;\n return { start: this.getX(0), end: this.getX(this._length - 1) };\n }\n\n push(x: number, y: number): void {\n this.xData[this._head] = x;\n this.yData[this._head] = y;\n this.setTreeLeaf(this._head, y);\n this._head = (this._head + 1) % this.capacity;\n if (this._length < this.capacity) this._length++;\n }\n\n append(x: ArrayLike<number>, y: ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n if (n <= 0) return;\n\n if (n >= this.capacity) {\n const sourceOffset = n - this.capacity;\n this._head = 0;\n this._length = this.capacity;\n this.copyIntoPhysical(0, x, y, sourceOffset, this.capacity);\n return;\n }\n\n let sourceOffset = 0;\n let remaining = n;\n while (remaining > 0) {\n const count = Math.min(remaining, this.capacity - this._head);\n this.copyIntoPhysical(this._head, x, y, sourceOffset, count);\n this._head = (this._head + count) % this.capacity;\n this._length = Math.min(this.capacity, this._length + count);\n sourceOffset += count;\n remaining -= count;\n }\n }\n\n get(index: number): { x: number; y: number } | null {\n if (index < 0 || index >= this._length) return null;\n return { x: this.getX(index), y: this.getY(index) };\n }\n\n getX(index: number): number {\n this.assertValidIndex(index);\n return this.xData[this.logicalToPhysical(index)]!;\n }\n\n getY(index: number): number {\n this.assertValidIndex(index);\n return this.yData[this.logicalToPhysical(index)]!;\n }\n\n lowerBoundX(x: number): number {\n let lo = 0;\n let hi = this._length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.getX(mid) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n upperBoundX(x: number): number {\n let lo = 0;\n let hi = this._length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.getX(mid) <= x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n rangeMinMaxY(start: number, end: number): { minY: number; maxY: number } | null {\n const from = Math.max(0, Math.floor(start));\n const to = Math.min(this._length, Math.ceil(end));\n if (to <= from) return null;\n\n const physical = this.logicalToPhysical(from);\n const count = to - from;\n if (physical + count <= this.capacity) {\n return this.queryPhysicalMinMax(physical, physical + count);\n }\n\n const first = this.queryPhysicalMinMax(physical, this.capacity);\n const second = this.queryPhysicalMinMax(0, (physical + count) % this.capacity);\n if (!first) return second;\n if (!second) return first;\n return {\n minY: Math.min(first.minY, second.minY),\n maxY: Math.max(first.maxY, second.maxY),\n };\n }\n\n clear(): void {\n this._length = 0;\n this._head = 0;\n this.minTree.fill(Infinity);\n this.maxTree.fill(-Infinity);\n }\n\n private copyIntoPhysical(\n physicalStart: number,\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n sourceOffset: number,\n count: number,\n ): void {\n for (let i = 0; i < count; i++) {\n const physical = physicalStart + i;\n const value = y[sourceOffset + i]!;\n this.xData[physical] = x[sourceOffset + i]!;\n this.yData[physical] = value;\n const leaf = this.treeBase + physical;\n this.minTree[leaf] = value;\n this.maxTree[leaf] = value;\n }\n this.recomputeTreeRange(physicalStart, physicalStart + count);\n }\n\n private setTreeLeaf(physical: number, value: number): void {\n let index = this.treeBase + physical;\n this.minTree[index] = value;\n this.maxTree[index] = value;\n index >>= 1;\n while (index >= 1) {\n this.recomputeTreeNode(index);\n index >>= 1;\n }\n }\n\n private recomputeTreeRange(start: number, end: number): void {\n let left = (this.treeBase + start) >> 1;\n let right = (this.treeBase + end - 1) >> 1;\n while (left >= 1) {\n for (let index = left; index <= right; index++) {\n this.recomputeTreeNode(index);\n }\n if (left === 1) break;\n left >>= 1;\n right >>= 1;\n }\n }\n\n private recomputeTreeNode(index: number): void {\n const left = index << 1;\n const right = left + 1;\n const leftMin = this.minTree[left]!;\n const rightMin = this.minTree[right]!;\n const leftMax = this.maxTree[left]!;\n const rightMax = this.maxTree[right]!;\n this.minTree[index] = leftMin < rightMin ? leftMin : rightMin;\n this.maxTree[index] = leftMax > rightMax ? leftMax : rightMax;\n }\n\n private queryPhysicalMinMax(start: number, end: number): { minY: number; maxY: number } | null {\n if (end <= start) return null;\n\n let left = this.treeBase + start;\n let right = this.treeBase + end;\n let minY = Infinity;\n let maxY = -Infinity;\n while (left < right) {\n if (left & 1) {\n const yMin = this.minTree[left]!;\n const yMax = this.maxTree[left]!;\n if (yMin < minY) minY = yMin;\n if (yMax > maxY) maxY = yMax;\n left++;\n }\n if (right & 1) {\n right--;\n const yMin = this.minTree[right]!;\n const yMax = this.maxTree[right]!;\n if (yMin < minY) minY = yMin;\n if (yMax > maxY) maxY = yMax;\n }\n left >>= 1;\n right >>= 1;\n }\n\n return Number.isFinite(minY) && Number.isFinite(maxY) ? { minY, maxY } : null;\n }\n\n private logicalToPhysical(index: number): number {\n return (this._head - this._length + index + this.capacity) % this.capacity;\n }\n\n private assertValidIndex(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this._length) {\n throw new RangeError(`RingBuffer index out of range: ${index}`);\n }\n }\n\n private static nextPowerOfTwo(value: number): number {\n return 2 ** Math.ceil(Math.log2(value));\n }\n}\n","import lineVert from \"./shaders/line.vert?raw\";\nimport lineFrag from \"./shaders/line.frag?raw\";\nimport segmentVert from \"./shaders/segment.vert?raw\";\nimport segmentFrag from \"./shaders/segment.frag?raw\";\nimport pointVert from \"./shaders/point.vert?raw\";\nimport pointFrag from \"./shaders/point.frag?raw\";\nimport pointSpriteVert from \"./shaders/point-sprite.vert?raw\";\nimport pointSpriteFrag from \"./shaders/point-sprite.frag?raw\";\nimport barVert from \"./shaders/bar.vert?raw\";\nimport barRangeVert from \"./shaders/bar-range.vert?raw\";\nimport barFrag from \"./shaders/bar.frag?raw\";\n\nexport const ShaderPrograms = {\n line: { vert: lineVert, frag: lineFrag },\n segment: { vert: segmentVert, frag: segmentFrag },\n point: { vert: pointVert, frag: pointFrag },\n pointSprite: { vert: pointSpriteVert, frag: pointSpriteFrag },\n bar: { vert: barVert, frag: barFrag },\n barRange: { vert: barRangeVert, frag: barFrag },\n} as const;\n","import { ShaderPrograms } from \"./ShaderPrograms.js\";\nimport type { Camera2D } from \"../interaction/Camera2D.js\";\nimport type { AttributeSpec, GpuBackend, GpuBuffer, GpuProgram } from \"./types.js\";\nimport type { SeriesStyle } from \"../core/types.js\";\n\nconst FLOATS_PER_SEGMENT_INSTANCE = 3;\nconst FLOATS_PER_POINT_INSTANCE = 2;\nconst BYTES_PER_FLOAT = 4;\nconst DEFAULT_POINT_SIZE_PX = 4;\nconst DEFAULT_BAR_WIDTH_DATA = 0.8;\nconst DEFAULT_BASELINE = 0;\n\nexport class Renderer {\n private readonly lineProgram: GpuProgram;\n private readonly segmentProgram: GpuProgram;\n private readonly pointProgram: GpuProgram;\n private readonly pointSpriteProgram: GpuProgram;\n private readonly barProgram: GpuProgram;\n private readonly barRangeProgram: GpuProgram;\n private readonly segmentSelectBuffer: GpuBuffer;\n private readonly pointCornerBuffer: GpuBuffer;\n private readonly barCornerBuffer: GpuBuffer;\n private readonly scaleUniform: Float32Array = new Float32Array(2);\n private readonly offsetUniform: Float32Array = new Float32Array(2);\n private readonly canvasSizeUniform: Float32Array = new Float32Array(2);\n\n constructor(private backend: GpuBackend) {\n this.lineProgram = this.backend.createProgram(ShaderPrograms.line.vert, ShaderPrograms.line.frag);\n this.segmentProgram = this.backend.createProgram(ShaderPrograms.segment.vert, ShaderPrograms.segment.frag);\n this.pointProgram = this.backend.createProgram(ShaderPrograms.point.vert, ShaderPrograms.point.frag);\n this.pointSpriteProgram = this.backend.createProgram(ShaderPrograms.pointSprite.vert, ShaderPrograms.pointSprite.frag);\n this.barProgram = this.backend.createProgram(ShaderPrograms.bar.vert, ShaderPrograms.bar.frag);\n this.barRangeProgram = this.backend.createProgram(ShaderPrograms.barRange.vert, ShaderPrograms.barRange.frag);\n\n this.segmentSelectBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 2 });\n this.backend.updateBuffer(this.segmentSelectBuffer, new Float32Array([0, 1]));\n\n this.pointCornerBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 8 });\n this.backend.updateBuffer(this.pointCornerBuffer, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]));\n\n this.barCornerBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 8 });\n this.backend.updateBuffer(this.barCornerBuffer, new Float32Array([-0.5, 0, 0.5, 0, -0.5, 1, 0.5, 1]));\n }\n\n get supportsInstancedSegments(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n get supportsInstancedPoints(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n get supportsInstancedBars(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n clear(r: number, g: number, b: number, a: number): void {\n this.backend.clear(r, g, b, a);\n }\n\n createFloatBuffer(floatCount: number): GpuBuffer {\n return this.backend.createBuffer({ usage: \"stream\", type: \"float\", length: floatCount });\n }\n\n updateFloatBuffer(buffer: GpuBuffer, data: Float32Array): void {\n this.backend.updateBuffer(buffer, data);\n }\n\n viewport(x: number, y: number, width: number, height: number): void {\n this.backend.viewport(x, y, width, height);\n }\n\n drawLines(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLinePrimitive(\"lines\", positions, count, style, camera);\n }\n\n drawLineStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLinePrimitive(\"line_strip\", positions, count, style, camera);\n }\n\n drawMinMaxSegments(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLines(positions, count, style, camera);\n }\n\n drawMinMaxSegmentsInstanced(instanceBuffer: GpuBuffer, instanceCount: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n const stride = FLOATS_PER_SEGMENT_INSTANCE * BYTES_PER_FLOAT;\n const aX: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: 0 };\n const aMinY: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: BYTES_PER_FLOAT };\n const aMaxY: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: BYTES_PER_FLOAT * 2 };\n const aSelect: AttributeSpec = { buffer: this.segmentSelectBuffer, divisor: 0, stride: BYTES_PER_FLOAT, offset: 0 };\n\n this.backend.draw({\n program: this.segmentProgram,\n primitive: \"lines\",\n count: 2,\n instances: instanceCount,\n attributes: { aMaxY, aMinY, aSelect, aX },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.color,\n },\n });\n }\n\n drawPointsInstanced(\n instanceBuffer: GpuBuffer,\n pointCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n canvasWidth: number,\n canvasHeight: number,\n ): void {\n this.writeCameraUniforms(camera);\n this.canvasSizeUniform[0] = Math.max(1, canvasWidth);\n this.canvasSizeUniform[1] = Math.max(1, canvasHeight);\n\n const instanceStride = FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT;\n const aPosition: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: 0, size: 2 };\n const aCorner: AttributeSpec = { buffer: this.pointCornerBuffer, divisor: 0, stride: FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT, offset: 0, size: 2 };\n\n this.backend.draw({\n program: this.pointProgram,\n primitive: \"triangle_strip\",\n count: 4,\n instances: pointCount,\n attributes: { aCorner, aPosition },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uCanvasSize: this.canvasSizeUniform,\n uPointSize: style.pointSize ?? DEFAULT_POINT_SIZE_PX,\n uColor: style.color,\n },\n });\n }\n\n drawPointSprites(positions: GpuBuffer, pointCount: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n this.backend.draw({\n program: this.pointSpriteProgram,\n primitive: \"points\",\n count: pointCount,\n attributes: { aPosition: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uPointSize: style.pointSize ?? DEFAULT_POINT_SIZE_PX,\n uColor: style.color,\n },\n });\n }\n\n drawAreaStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n this.backend.draw({\n program: this.lineProgram,\n primitive: \"triangle_strip\",\n count,\n attributes: { position: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.fillColor ?? style.color,\n },\n });\n }\n\n drawBarsInstanced(\n instanceBuffer: GpuBuffer,\n barCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n ): void {\n this.writeCameraUniforms(camera);\n\n const instanceStride = FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT;\n const aPosition: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: 0, size: 2 };\n const aCorner: AttributeSpec = { buffer: this.barCornerBuffer, divisor: 0, stride: FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT, offset: 0, size: 2 };\n\n this.backend.draw({\n program: this.barProgram,\n primitive: \"triangle_strip\",\n count: 4,\n instances: barCount,\n attributes: { aCorner, aPosition },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uBarWidth: style.barWidth ?? DEFAULT_BAR_WIDTH_DATA,\n uBaseline: style.baseline ?? DEFAULT_BASELINE,\n uColor: style.color,\n },\n });\n }\n\n drawBarRangesInstanced(\n instanceBuffer: GpuBuffer,\n barCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n ): void {\n this.writeCameraUniforms(camera);\n\n const instanceStride = FLOATS_PER_SEGMENT_INSTANCE * BYTES_PER_FLOAT;\n const aX: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: 0 };\n const aMinY: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: BYTES_PER_FLOAT };\n const aMaxY: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: BYTES_PER_FLOAT * 2 };\n const aCorner: AttributeSpec = { buffer: this.barCornerBuffer, divisor: 0, stride: FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT, offset: 0, size: 2 };\n\n this.backend.draw({\n program: this.barRangeProgram,\n primitive: \"triangle_strip\",\n count: 4,\n instances: barCount,\n attributes: { aCorner, aMaxY, aMinY, aX },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uBarWidth: style.barWidth ?? DEFAULT_BAR_WIDTH_DATA,\n uColor: style.color,\n },\n });\n }\n\n drawBarTriangles(positions: GpuBuffer, vertexCount: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawTrianglePrimitive(positions, vertexCount, style, camera);\n }\n\n private drawLinePrimitive(primitive: \"lines\" | \"line_strip\", positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n this.backend.draw({\n program: this.lineProgram,\n primitive,\n count,\n attributes: { position: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.color,\n },\n });\n }\n\n private drawTrianglePrimitive(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n this.backend.draw({\n program: this.lineProgram,\n primitive: \"triangles\",\n count,\n attributes: { position: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.color,\n },\n });\n }\n\n private writeCameraUniforms(camera: Camera2D): void {\n this.scaleUniform[0] = camera.xScale;\n this.scaleUniform[1] = camera.yScale;\n this.offsetUniform[0] = camera.xOffset;\n this.offsetUniform[1] = camera.yOffset;\n }\n\n dispose(): void {\n this.backend.destroy();\n }\n}\n","import type { Regl, Buffer as ReglBuffer } from \"regl\";\n\ninterface PoolEntry {\n buffer: ReglBuffer;\n floatArray: Float32Array;\n floatCapacity: number;\n inUse: boolean;\n}\n\nconst POOL_SIZES = [1024, 4096, 16384, 32768, 131072];\n\nexport class WebGL2Resources {\n private readonly regl: Regl;\n private readonly pool: PoolEntry[] = [];\n private preAllocated: boolean = false;\n\n constructor(regl: Regl) {\n this.regl = regl;\n }\n\n get reglInstance(): Regl {\n return this.regl;\n }\n\n preAllocate(): void {\n if (this.preAllocated) return;\n this.preAllocated = true;\n\n for (const size of POOL_SIZES) {\n this.pool.push(this.createEntry(size, \"stream\"));\n }\n }\n\n acquire(floatCount: number, usage: \"static\" | \"dynamic\" | \"stream\" = \"stream\"): { buffer: ReglBuffer; array: Float32Array } {\n const needed = floatCount;\n let entry = this.findFree(needed);\n if (!entry) {\n const capacity = this.roundUp(needed);\n entry = this.createEntry(capacity, usage);\n this.pool.push(entry);\n }\n entry.inUse = true;\n return { buffer: entry.buffer, array: entry.floatArray };\n }\n\n release(buffer: ReglBuffer): void {\n for (const entry of this.pool) {\n if (entry.buffer === buffer) {\n entry.inUse = false;\n return;\n }\n }\n }\n\n destroy(): void {\n for (const entry of this.pool) {\n entry.buffer.destroy();\n }\n this.pool.length = 0;\n this.preAllocated = false;\n }\n\n private createEntry(floatCapacity: number, usage: \"static\" | \"dynamic\" | \"stream\"): PoolEntry {\n return {\n buffer: this.regl.buffer({\n length: floatCapacity * 4,\n usage,\n type: \"float\",\n }),\n floatArray: new Float32Array(floatCapacity),\n floatCapacity,\n inUse: false,\n };\n }\n\n private findFree(minCapacity: number): PoolEntry | undefined {\n return this.pool.find(e => !e.inUse && e.floatCapacity >= minCapacity);\n }\n\n private roundUp(n: number): number {\n for (const size of POOL_SIZES) {\n if (size >= n) return size;\n }\n const highest = POOL_SIZES[POOL_SIZES.length - 1]!;\n const nextPower = 1 << (32 - Math.clz32(n - 1));\n return Math.max(highest * 2, nextPower);\n }\n}\n","import createRegl from \"regl\";\nimport type { AttributeState, Buffer as ReglBuffer, DrawCommand, PrimitiveType, Regl, Uniform } from \"regl\";\nimport type { GpuBackend, GpuBuffer, GpuProgram, GpuResource, BufferSpec, DrawSpec, AttributeSpec, UniformValue } from \"./types.js\";\nimport { WebGL2Resources } from \"./WebGL2Resources.js\";\n\ntype ReglGpuBuffer = GpuBuffer & {\n readonly buffer: ReglBuffer;\n};\n\ntype ReglGpuProgram = GpuProgram & {\n readonly id: number;\n readonly vert: string;\n readonly frag: string;\n};\n\ninterface DrawProps {\n readonly count: number;\n readonly instances: number;\n readonly attributes: Readonly<Record<string, AttributeState>>;\n readonly uniforms: Readonly<Record<string, UniformValue>>;\n}\n\nfunction toReglContext(gl: WebGL2RenderingContext): WebGLRenderingContext {\n // regl's public types accept WebGLRenderingContext even though regl can run on WebGL2 contexts.\n return gl as unknown as WebGLRenderingContext;\n}\n\ninterface ScissorProps {\n scissorEnable?: boolean;\n scissorBox?: { x: number; y: number; width: number; height: number };\n}\n\nexport class ReglBackend implements GpuBackend {\n private gl: WebGL2RenderingContext;\n private regl: Regl;\n private resources: WebGL2Resources;\n private nextProgramId: number = 1;\n private commandCache: Map<string, DrawCommand> = new Map();\n private scissorBox: { x: number; y: number; w: number; h: number } | null = null;\n readonly capabilities: GpuBackend[\"capabilities\"];\n\n constructor(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n powerPreference: \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"BlazePlot requires WebGL2, but this browser/context does not support it.\");\n }\n\n this.gl = gl;\n this.regl = createRegl({\n gl: toReglContext(this.gl),\n extensions: [],\n optionalExtensions: [\n \"angle_instanced_arrays\",\n \"ext_disjoint_timer_query_webgl2\",\n ],\n });\n\n this.capabilities = {\n instancing: this.regl.hasExtension(\"angle_instanced_arrays\"),\n };\n\n this.resources = new WebGL2Resources(this.regl);\n this.resources.preAllocate();\n }\n\n createBuffer(spec: BufferSpec): GpuBuffer {\n const { buffer } = this.resources.acquire(spec.length, spec.usage);\n return {\n length: spec.length,\n type: spec.type,\n buffer,\n } as ReglGpuBuffer;\n }\n\n updateBuffer(buffer: GpuBuffer, data: Float32Array | Uint16Array, offset: number = 0): void {\n if (data.length + offset > buffer.length) {\n throw new RangeError(\"GPU buffer update exceeds allocated buffer length.\");\n }\n\n const bytesPerElement = buffer.type === \"float\" ? 4 : 2;\n this.asReglBuffer(buffer).buffer.subdata(data, offset * bytesPerElement);\n }\n\n createProgram(vert: string, frag: string): GpuProgram {\n return {\n id: this.nextProgramId++,\n vert,\n frag,\n } as ReglGpuProgram;\n }\n\n draw(spec: DrawSpec): void {\n if (spec.count <= 0) return;\n\n const program = this.asReglProgram(spec.program);\n const attributeNames = Object.keys(spec.attributes).sort();\n const uniformNames = Object.keys(spec.uniforms).sort();\n const key = [program.id, spec.primitive, attributeNames.join(\",\"), uniformNames.join(\",\"), spec.instances === undefined ? 0 : 1].join(\"|\");\n let command = this.commandCache.get(key);\n\n if (!command) {\n command = this.createDrawCommand(program, spec.primitive, attributeNames, uniformNames, spec.instances !== undefined);\n this.commandCache.set(key, command);\n }\n\n const attributes: Record<string, AttributeState> = {};\n for (const name of attributeNames) {\n attributes[name] = this.resolveAttribute(spec.attributes[name]!);\n }\n\n const props: DrawProps & ScissorProps = {\n count: spec.count,\n instances: spec.instances ?? 0,\n attributes,\n uniforms: spec.uniforms,\n };\n\n if (this.scissorBox) {\n props.scissorEnable = true;\n props.scissorBox = {\n x: this.scissorBox.x,\n y: this.scissorBox.y,\n width: this.scissorBox.w,\n height: this.scissorBox.h,\n };\n }\n\n command(props);\n }\n\n dispose(resource: GpuResource): void {\n if (this.isReglBuffer(resource)) {\n this.resources.release(resource.buffer);\n }\n }\n\n clear(r: number, g: number, b: number, a: number): void {\n this.regl.clear({ color: [r, g, b, a] });\n }\n\n viewport(x: number, y: number, w: number, h: number): void {\n this.scissorBox = { x, y, w, h };\n }\n\n destroy(): void {\n this.resources.destroy();\n this.regl.destroy();\n }\n\n private createDrawCommand(\n program: ReglGpuProgram,\n primitive: DrawSpec[\"primitive\"],\n attributeNames: readonly string[],\n uniformNames: readonly string[],\n instanced: boolean,\n ): DrawCommand {\n const attributes: Record<string, (context: object, props: DrawProps) => AttributeState> = {};\n for (const name of attributeNames) {\n attributes[name] = (_context, props) => props.attributes[name]!;\n }\n\n const uniforms: Record<string, (context: object, props: DrawProps) => Uniform> = {};\n for (const name of uniformNames) {\n uniforms[name] = (_context, props) => props.uniforms[name] as Uniform;\n }\n\n return this.regl({\n vert: program.vert,\n frag: program.frag,\n attributes,\n uniforms,\n primitive: this.toReglPrimitive(primitive),\n count: (_context: object, props: DrawProps) => props.count,\n instances: instanced ? (_context: object, props: DrawProps) => props.instances : undefined,\n depth: { enable: false },\n scissor: {\n enable: (_context: object, props: DrawProps & ScissorProps) => props.scissorEnable ?? false,\n box: (_context: object, props: DrawProps & ScissorProps) =>\n props.scissorBox ?? { x: 0, y: 0, width: 0, height: 0 },\n },\n });\n }\n\n private resolveAttribute(attribute: GpuBuffer | AttributeSpec): AttributeState {\n if (\"divisor\" in attribute) {\n return {\n buffer: this.asReglBuffer(attribute.buffer).buffer,\n divisor: attribute.divisor,\n stride: attribute.stride,\n offset: attribute.offset,\n size: attribute.size,\n } as AttributeState;\n }\n\n return this.asReglBuffer(attribute).buffer;\n }\n\n private asReglBuffer(buffer: GpuBuffer): ReglGpuBuffer {\n return buffer as ReglGpuBuffer;\n }\n\n private asReglProgram(program: GpuProgram): ReglGpuProgram {\n return program as ReglGpuProgram;\n }\n\n private isReglBuffer(resource: GpuResource): resource is ReglGpuBuffer {\n return \"length\" in resource && \"type\" in resource && \"buffer\" in resource;\n }\n\n private toReglPrimitive(primitive: DrawSpec[\"primitive\"]): PrimitiveType {\n switch (primitive) {\n case \"line_strip\":\n return \"line strip\";\n case \"triangle_strip\":\n return \"triangle strip\";\n default:\n return primitive;\n }\n }\n}\n","import type { Camera2D } from \"./Camera2D.js\";\nimport type { PanIntent, ViewportPolicy, ZoomIntent } from \"./types.js\";\n\nexport class InputController {\n private _enabled: boolean = true;\n private activePointerId: number | null = null;\n private lastX: number = 0;\n private lastY: number = 0;\n\n constructor(\n private readonly canvas: HTMLCanvasElement,\n private readonly camera: Camera2D,\n private readonly policy?: ViewportPolicy,\n ) {\n this.bindEvents();\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n private bindEvents(): void {\n this.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.addEventListener(\"pointercancel\", this.onPointerUp);\n this.canvas.addEventListener(\"wheel\", this.onWheel, { passive: false });\n }\n\n private onPointerDown = (e: PointerEvent): void => {\n if (!this._enabled || this.activePointerId !== null) return;\n this.activePointerId = e.pointerId;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n this.canvas.setPointerCapture(e.pointerId);\n };\n\n private onPointerMove = (e: PointerEvent): void => {\n if (!this._enabled || e.pointerId !== this.activePointerId) return;\n const rect = this.canvas.getBoundingClientRect();\n const dx = rect.width > 0 ? (this.lastX - e.clientX) / rect.width : 0;\n const dy = rect.height > 0 ? (e.clientY - this.lastY) / rect.height : 0;\n const intent = this.applyPanPolicy({ dx, dy });\n if (intent) this.camera.pan(intent);\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n };\n\n private onPointerUp = (e: PointerEvent): void => {\n if (e.pointerId !== this.activePointerId) return;\n this.activePointerId = null;\n if (this.canvas.hasPointerCapture(e.pointerId)) {\n this.canvas.releasePointerCapture(e.pointerId);\n }\n };\n\n private onWheel = (e: WheelEvent): void => {\n if (!this._enabled) return;\n e.preventDefault();\n const factor = e.deltaY < 0 ? 1.1 : 0.9;\n const rect = this.canvas.getBoundingClientRect();\n const cx = rect.width > 0 ? (e.clientX - rect.left) / rect.width : 0.5;\n const cy = rect.height > 0 ? 1 - (e.clientY - rect.top) / rect.height : 0.5;\n const intent = this.applyZoomPolicy({ factor, cx, cy, axis: \"xy\" });\n if (intent) this.camera.zoom(intent);\n };\n\n private applyPanPolicy(intent: PanIntent): PanIntent | null {\n if (!this.policy?.beforePan) return intent;\n return this.policy.beforePan(this.camera, intent);\n }\n\n private applyZoomPolicy(intent: ZoomIntent): ZoomIntent | null {\n if (!this.policy?.beforeZoom) return intent;\n return this.policy.beforeZoom(this.camera, intent);\n }\n\n dispose(): void {\n this.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.removeEventListener(\"pointercancel\", this.onPointerUp);\n this.canvas.removeEventListener(\"wheel\", this.onWheel);\n }\n}\n","import type { Viewport } from \"../core/types.js\";\nimport type { PanIntent, ZoomIntent } from \"./types.js\";\n\nexport class Camera2D {\n private _xMin: number = 0;\n private _xMax: number = 1;\n private _yMin: number = 0;\n private _yMax: number = 1;\n\n get xMin(): number {\n return this._xMin;\n }\n\n get xMax(): number {\n return this._xMax;\n }\n\n get yMin(): number {\n return this._yMin;\n }\n\n get yMax(): number {\n return this._yMax;\n }\n\n get viewport(): Viewport {\n return { xMin: this._xMin, xMax: this._xMax, yMin: this._yMin, yMax: this._yMax };\n }\n\n get xScale(): number {\n return 2 / (this._xMax - this._xMin);\n }\n\n get xOffset(): number {\n return -(this._xMin + this._xMax) / (this._xMax - this._xMin);\n }\n\n get yScale(): number {\n return 2 / (this._yMax - this._yMin);\n }\n\n get yOffset(): number {\n return -(this._yMin + this._yMax) / (this._yMax - this._yMin);\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n const next = {\n xMin: v.xMin ?? this._xMin,\n xMax: v.xMax ?? this._xMax,\n yMin: v.yMin ?? this._yMin,\n yMax: v.yMax ?? this._yMax,\n };\n Camera2D.assertValidViewport(next);\n this._xMin = next.xMin;\n this._xMax = next.xMax;\n this._yMin = next.yMin;\n this._yMax = next.yMax;\n }\n\n pan(intent: PanIntent): void {\n const { dx, dy } = intent;\n Camera2D.assertFinite(\"dx\", dx);\n Camera2D.assertFinite(\"dy\", dy);\n const rangeX = this._xMax - this._xMin;\n const rangeY = this._yMax - this._yMin;\n this.setViewport({\n xMin: this._xMin + dx * rangeX,\n xMax: this._xMax + dx * rangeX,\n yMin: this._yMin + dy * rangeY,\n yMax: this._yMax + dy * rangeY,\n });\n }\n\n zoom(intent: ZoomIntent): void {\n const { factor, cx, cy, axis } = intent;\n Camera2D.assertFinite(\"factor\", factor);\n Camera2D.assertFinite(\"cx\", cx);\n Camera2D.assertFinite(\"cy\", cy);\n if (factor <= 0) throw new RangeError(\"Camera2D zoom factor must be > 0.\");\n\n const rangeX = this._xMax - this._xMin;\n const rangeY = this._yMax - this._yMin;\n const dataCx = this._xMin + rangeX * cx;\n const dataCy = this._yMin + rangeY * cy;\n const newRangeX = axis === \"y\" ? rangeX : rangeX / factor;\n const newRangeY = axis === \"x\" ? rangeY : rangeY / factor;\n this.setViewport({\n xMin: dataCx - newRangeX * cx,\n xMax: dataCx + newRangeX * (1 - cx),\n yMin: dataCy - newRangeY * cy,\n yMax: dataCy + newRangeY * (1 - cy),\n });\n }\n\n toClip(x: number, y: number): [number, number] {\n return [\n x * this.xScale + this.xOffset,\n y * this.yScale + this.yOffset,\n ];\n }\n\n toScreen(clipX: number, clipY: number, canvasWidth: number, canvasHeight: number): [number, number] {\n return [\n (clipX + 1) * 0.5 * canvasWidth,\n (1 - clipY) * 0.5 * canvasHeight,\n ];\n }\n\n clone(): Camera2D {\n const c = new Camera2D();\n c.setViewport(this.viewport);\n return c;\n }\n\n private static assertValidViewport(v: Viewport): void {\n Camera2D.assertFinite(\"xMin\", v.xMin);\n Camera2D.assertFinite(\"xMax\", v.xMax);\n Camera2D.assertFinite(\"yMin\", v.yMin);\n Camera2D.assertFinite(\"yMax\", v.yMax);\n if (v.xMax <= v.xMin) throw new RangeError(\"Camera2D requires xMax > xMin.\");\n if (v.yMax <= v.yMin) throw new RangeError(\"Camera2D requires yMax > yMin.\");\n }\n\n private static assertFinite(name: string, value: number): void {\n if (!Number.isFinite(value)) throw new RangeError(`Camera2D ${name} must be finite.`);\n }\n}\n","import type { Camera2D } from \"./Camera2D.js\";\n\nexport class AxisController {\n constructor(private readonly camera: Camera2D) {}\n\n getXTickValues(canvasWidth: number, maxTicks: number = 10, target: number[] = []): number[] {\n return this.getTickValues(this.camera.xMin, this.camera.xMax, canvasWidth, maxTicks, 80, target);\n }\n\n getYTickValues(canvasHeight: number, maxTicks: number = 10, target: number[] = []): number[] {\n return this.getTickValues(this.camera.yMin, this.camera.yMax, canvasHeight, maxTicks, 48, target);\n }\n\n formatValue(value: number): string {\n if (Math.abs(value) < 1e-12) return \"0\";\n const abs = Math.abs(value);\n if (abs >= 1e6 || abs < 1e-3) return value.toExponential(2);\n if (abs >= 100) return value.toFixed(0);\n if (abs >= 10) return value.toFixed(1);\n return value.toFixed(2);\n }\n\n private getTickValues(min: number, max: number, pixelSize: number, maxTicks: number, minPixelSpacing: number, target: number[]): number[] {\n target.length = 0;\n if (pixelSize <= 0 || maxTicks <= 0) return target;\n\n const range = max - min;\n if (!Number.isFinite(range) || range <= 0) return target;\n\n const targetTicks = Math.max(2, Math.min(maxTicks, Math.floor(pixelSize / minPixelSpacing)));\n const step = this.niceStep(range / (targetTicks - 1));\n const firstIndex = Math.floor(min / step);\n const lastIndex = Math.ceil(max / step);\n\n for (let index = firstIndex; index <= lastIndex && target.length < maxTicks + 2; index++) {\n target.push(this.normalizeTick(index * step, step));\n }\n\n return target;\n }\n\n private niceStep(rawStep: number): number {\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n const normalized = rawStep / magnitude;\n\n if (normalized <= 1.5) return magnitude;\n if (normalized <= 3) return 2 * magnitude;\n if (normalized <= 7) return 5 * magnitude;\n return 10 * magnitude;\n }\n\n private normalizeTick(value: number, step: number): number {\n const decimals = Math.max(0, -Math.floor(Math.log10(step)) + 2);\n const normalized = Number(value.toFixed(decimals));\n return Object.is(normalized, -0) ? 0 : normalized;\n }\n}\n","import type { Camera2D } from \"../interaction/Camera2D.js\";\nimport type { AxisController } from \"../interaction/AxisController.js\";\nimport type { ChartLayoutElements, ChartLayoutConfig } from \"./ChartLayout.js\";\n\nexport interface AxisOverlayOptions {\n readonly font?: string;\n readonly color?: string;\n}\n\nexport type AxisOverlayConfig = ChartLayoutConfig;\n\nexport class AxisOverlay {\n private xPool: HTMLDivElement[] = [];\n private yPool: HTMLDivElement[] = [];\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n\n constructor(\n private readonly layout: ChartLayoutElements,\n private readonly config: AxisOverlayConfig,\n private readonly options: AxisOverlayOptions = {},\n ) {}\n\n update(camera: Camera2D, axis: AxisController): void {\n const plotW = Math.max(1, this.layout.plot.clientWidth);\n const plotH = Math.max(1, this.layout.plot.clientHeight);\n\n if (this.config.x.visible) {\n axis.getXTickValues(plotW, 12, this.xTicks);\n } else {\n this.xTicks.length = 0;\n }\n\n if (this.config.y.visible) {\n axis.getYTickValues(plotH, 8, this.yTicks);\n } else {\n this.yTicks.length = 0;\n }\n\n this.updateAxis(this.xPool, this.xTicks, \"x\", camera, plotW, plotH, axis);\n this.updateAxis(this.yPool, this.yTicks, \"y\", camera, plotW, plotH, axis);\n }\n\n dispose(): void {\n for (const el of this.xPool) el.remove();\n for (const el of this.yPool) el.remove();\n this.xPool = [];\n this.yPool = [];\n }\n\n private parentForAxis(axis: \"x\" | \"y\"): HTMLElement {\n if (axis === \"x\") {\n return this.config.x.position === \"outside\" ? this.layout.xAxis : this.layout.plot;\n }\n return this.config.y.position === \"outside\" ? this.layout.yAxis : this.layout.plot;\n }\n\n private updateAxis(\n pool: HTMLDivElement[],\n values: number[],\n axis: \"x\" | \"y\",\n camera: Camera2D,\n plotW: number,\n plotH: number,\n controller: AxisController,\n ): void {\n const parent = this.parentForAxis(axis);\n\n while (pool.length < values.length) {\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.pointerEvents = \"none\";\n el.style.whiteSpace = \"nowrap\";\n el.style.font = this.options.font ?? \"11px ui-monospace, monospace, sans-serif\";\n el.style.color = this.options.color ?? \"#bfd6ff\";\n el.style.userSelect = \"none\";\n parent.appendChild(el);\n pool.push(el);\n }\n\n for (const el of pool) {\n if (el.parentElement !== parent) parent.appendChild(el);\n }\n\n for (let i = values.length; i < pool.length; i++) {\n pool[i]!.style.display = \"none\";\n }\n\n for (let i = 0; i < values.length; i++) {\n const el = pool[i]!;\n const value = values[i]!;\n const text = controller.formatValue(value);\n if (el.textContent !== text) {\n el.textContent = text;\n }\n el.style.display = \"block\";\n\n if (axis === \"x\") {\n const [clipX] = camera.toClip(value, camera.yMin);\n const screenX = (clipX + 1) * 0.5 * plotW;\n el.style.left = `${screenX}px`;\n el.style.right = \"auto\";\n el.style.transform = \"translateX(-50%)\";\n if (this.config.x.position === \"outside\") {\n el.style.top = \"4px\";\n el.style.bottom = \"auto\";\n } else {\n el.style.top = \"auto\";\n el.style.bottom = \"4px\";\n }\n } else {\n const [, clipY] = camera.toClip(camera.xMin, value);\n const screenY = (1 - clipY) * 0.5 * plotH;\n el.style.top = `${screenY}px`;\n el.style.bottom = \"auto\";\n el.style.transform = \"translateY(-50%)\";\n if (this.config.y.position === \"outside\") {\n el.style.left = \"auto\";\n el.style.right = \"4px\";\n } else {\n el.style.left = \"4px\";\n el.style.right = \"auto\";\n }\n }\n }\n }\n}\n","export type AxisPosition = \"inside\" | \"outside\";\n\nexport interface NormalizedAxisConfig {\n readonly visible: boolean;\n readonly position: AxisPosition;\n}\n\nexport interface ChartLayoutConfig {\n readonly x: NormalizedAxisConfig;\n readonly y: NormalizedAxisConfig;\n}\n\nexport interface ChartLayoutElements {\n readonly root: HTMLDivElement;\n readonly plot: HTMLDivElement;\n readonly canvas: HTMLCanvasElement;\n readonly xAxis: HTMLDivElement;\n readonly yAxis: HTMLDivElement;\n readonly corner: HTMLDivElement;\n}\n\nexport const LEFT_AXIS_GUTTER_CSS = 52;\nexport const BOTTOM_AXIS_GUTTER_CSS = 28;\n\nexport class ChartLayout implements ChartLayoutElements {\n readonly root: HTMLDivElement;\n readonly plot: HTMLDivElement;\n readonly canvas: HTMLCanvasElement;\n readonly xAxis: HTMLDivElement;\n readonly yAxis: HTMLDivElement;\n readonly corner: HTMLDivElement;\n\n private readonly externalCanvas: boolean;\n private readonly originalCanvasCssText: string;\n private readonly originalCanvasParent: HTMLElement | null;\n\n constructor(target: HTMLElement, config: ChartLayoutConfig) {\n const canvasTarget = target instanceof HTMLCanvasElement ? target : null;\n this.externalCanvas = canvasTarget !== null;\n this.originalCanvasCssText = canvasTarget?.style.cssText ?? \"\";\n this.originalCanvasParent = canvasTarget?.parentElement ?? null;\n\n this.root = document.createElement(\"div\");\n this.plot = document.createElement(\"div\");\n this.canvas = canvasTarget ?? document.createElement(\"canvas\");\n this.xAxis = document.createElement(\"div\");\n this.yAxis = document.createElement(\"div\");\n this.corner = document.createElement(\"div\");\n\n this.root.className = \"blazeplot-root\";\n this.plot.className = \"blazeplot-plot\";\n this.canvas.classList.add(\"blazeplot-canvas\");\n this.xAxis.className = \"blazeplot-axis blazeplot-axis-x\";\n this.yAxis.className = \"blazeplot-axis blazeplot-axis-y\";\n this.corner.className = \"blazeplot-axis-corner\";\n\n this.applyBaseStyles();\n this.mount(target);\n this.update(config);\n }\n\n update(config: ChartLayoutConfig): void {\n const hasOutsideY = config.y.visible && config.y.position === \"outside\";\n const hasOutsideX = config.x.visible && config.x.position === \"outside\";\n\n this.root.style.gridTemplateColumns = `${hasOutsideY ? LEFT_AXIS_GUTTER_CSS : 0}px minmax(0, 1fr)`;\n this.root.style.gridTemplateRows = `minmax(0, 1fr) ${hasOutsideX ? BOTTOM_AXIS_GUTTER_CSS : 0}px`;\n this.yAxis.style.display = hasOutsideY ? \"block\" : \"none\";\n this.xAxis.style.display = hasOutsideX ? \"block\" : \"none\";\n this.corner.style.display = hasOutsideX && hasOutsideY ? \"block\" : \"none\";\n }\n\n dispose(): void {\n if (this.externalCanvas && this.originalCanvasParent) {\n this.canvas.style.cssText = this.originalCanvasCssText;\n this.originalCanvasParent.insertBefore(this.canvas, this.root);\n }\n this.root.remove();\n }\n\n private mount(target: HTMLElement): void {\n if (this.externalCanvas) {\n this.originalCanvasParent?.insertBefore(this.root, target);\n } else {\n target.appendChild(this.root);\n }\n\n this.root.appendChild(this.yAxis);\n this.root.appendChild(this.plot);\n this.root.appendChild(this.corner);\n this.root.appendChild(this.xAxis);\n this.plot.appendChild(this.canvas);\n }\n\n private applyBaseStyles(): void {\n this.root.style.position = \"relative\";\n this.root.style.display = \"grid\";\n this.root.style.width = \"100%\";\n this.root.style.height = \"100%\";\n this.root.style.minWidth = \"0\";\n this.root.style.minHeight = \"0\";\n this.root.style.overflow = \"hidden\";\n\n this.plot.style.position = \"relative\";\n this.plot.style.gridColumn = \"2\";\n this.plot.style.gridRow = \"1\";\n this.plot.style.minWidth = \"0\";\n this.plot.style.minHeight = \"0\";\n this.plot.style.overflow = \"hidden\";\n\n this.canvas.style.position = \"absolute\";\n this.canvas.style.inset = \"0\";\n this.canvas.style.display = \"block\";\n this.canvas.style.width = \"100%\";\n this.canvas.style.height = \"100%\";\n this.canvas.style.touchAction = \"none\";\n\n this.yAxis.style.position = \"relative\";\n this.yAxis.style.gridColumn = \"1\";\n this.yAxis.style.gridRow = \"1\";\n this.yAxis.style.minWidth = \"0\";\n this.yAxis.style.minHeight = \"0\";\n this.yAxis.style.overflow = \"hidden\";\n this.yAxis.style.pointerEvents = \"none\";\n\n this.xAxis.style.position = \"relative\";\n this.xAxis.style.gridColumn = \"2\";\n this.xAxis.style.gridRow = \"2\";\n this.xAxis.style.minWidth = \"0\";\n this.xAxis.style.minHeight = \"0\";\n this.xAxis.style.overflow = \"hidden\";\n this.xAxis.style.pointerEvents = \"none\";\n\n this.corner.style.gridColumn = \"1\";\n this.corner.style.gridRow = \"2\";\n this.corner.style.minWidth = \"0\";\n this.corner.style.minHeight = \"0\";\n this.corner.style.pointerEvents = \"none\";\n }\n}\n","import type { SeriesConfig, SeriesStyle, Dataset, SeriesMode, SeriesSample } from \"../core/types.js\";\nimport { SeriesStore } from \"../core/SeriesStore.js\";\nimport { RingBuffer } from \"../core/RingBuffer.js\";\nimport { Renderer } from \"../render/Renderer.js\";\nimport { ReglBackend } from \"../render/ReglBackend.js\";\nimport type { GpuBuffer } from \"../render/types.js\";\nimport { InputController } from \"../interaction/InputController.js\";\nimport { Camera2D } from \"../interaction/Camera2D.js\";\nimport { AxisController } from \"../interaction/AxisController.js\";\nimport type { ViewportPolicy } from \"../interaction/types.js\";\nimport { AxisOverlay } from \"./AxisOverlay.js\";\nimport { ChartLayout } from \"./ChartLayout.js\";\nimport type { AxisPosition, NormalizedAxisConfig } from \"./ChartLayout.js\";\n\nconst RAW_LINE_VERTEX_CAPACITY = 16_384;\nconst AREA_POINT_CAPACITY = RAW_LINE_VERTEX_CAPACITY >> 1;\nconst MINMAX_SEGMENT_CAPACITY = RAW_LINE_VERTEX_CAPACITY >> 1;\nconst FLOATS_PER_MINMAX_SEGMENT_INSTANCE = 3;\nconst BAR_FALLBACK_CAPACITY = 4_096;\nconst FLOATS_PER_BAR_TRIANGLE = 12;\nconst GRID_LINE_VERTEX_CAPACITY = 64;\n\nexport interface AxisConfig {\n readonly visible?: boolean;\n readonly position?: AxisPosition;\n}\n\nexport type ChartPickMode = \"nearest-x\" | \"nearest-point\";\n\nexport interface ChartPickOptions {\n readonly mode?: ChartPickMode;\n readonly maxDistancePx?: number;\n}\n\nexport interface ChartPluginHandle {\n dispose(): void;\n}\n\nexport interface ChartPlugin {\n install(chart: Chart): void | (() => void) | ChartPluginHandle;\n}\n\nexport interface ChartOptions {\n readonly viewportPolicy?: ViewportPolicy;\n readonly grid?: boolean;\n readonly gridStyle?: Partial<SeriesStyle>;\n readonly axes?: boolean | { x?: boolean | AxisConfig; y?: boolean | AxisConfig };\n readonly hover?: ChartPickOptions;\n readonly plugins?: readonly ChartPlugin[];\n}\n\nexport type TypedSeriesConfig = Omit<SeriesConfig, \"mode\">;\n\nexport interface ChartSeriesState {\n readonly series: SeriesStore;\n readonly index: number;\n readonly id?: string;\n readonly name?: string;\n readonly mode: SeriesMode;\n readonly visible: boolean;\n readonly color: readonly [number, number, number, number];\n}\n\nexport interface ChartPickItem extends SeriesSample {\n readonly series: SeriesStore;\n readonly seriesIndex: number;\n readonly id?: string;\n readonly name?: string;\n readonly mode: SeriesMode;\n readonly plotX: number;\n readonly plotY: number;\n readonly clientX: number;\n readonly clientY: number;\n}\n\nexport interface ChartHoverState {\n readonly clientX: number;\n readonly clientY: number;\n readonly plotX: number;\n readonly plotY: number;\n readonly dataX: number;\n readonly dataY: number;\n readonly anchorX: number;\n readonly mode: ChartPickMode;\n readonly items: readonly ChartPickItem[];\n}\n\nexport interface ChartScreenshotOptions {\n readonly type?: string;\n readonly quality?: number;\n readonly background?: string;\n readonly dpr?: number;\n}\n\nexport interface ChartFrameStats {\n fps: number;\n frameMs: number;\n pointsRendered: number;\n drawCalls: number;\n uploadBytes: number;\n renderMode: \"none\" | \"raw\" | \"minmax\" | \"points\" | \"bars\" | \"area\" | \"mixed\";\n}\n\nfunction normalizeAxisConfig(config: boolean | AxisConfig | undefined): NormalizedAxisConfig {\n if (config === false) return { visible: false, position: \"inside\" };\n if (config === true || config === undefined) return { visible: true, position: \"inside\" };\n return {\n visible: config.visible !== false,\n position: config.position ?? \"inside\",\n };\n}\n\nexport class Chart {\n private series: SeriesStore[] = [];\n private camera: Camera2D;\n private axis: AxisController;\n private renderer: Renderer;\n private input: InputController;\n private rawLineBuffer: GpuBuffer;\n private rawLineData: Float32Array;\n private minMaxInstanceBuffer: GpuBuffer;\n private minMaxInstanceData: Float32Array;\n private barTriangleBuffer: GpuBuffer;\n private barTriangleData: Float32Array;\n private gridBuffer: GpuBuffer;\n private gridData: Float32Array;\n private gridStyle: SeriesStyle;\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n private axisOverlay: AxisOverlay | null = null;\n private normalizedAxes: { x: NormalizedAxisConfig; y: NormalizedAxisConfig };\n private layout: ChartLayout;\n private stats: ChartFrameStats = {\n fps: 0,\n frameMs: 0,\n pointsRendered: 0,\n drawCalls: 0,\n uploadBytes: 0,\n renderMode: \"none\",\n };\n private resizeObserver: ResizeObserver | null = null;\n private readonly pluginDisposers: Array<() => void> = [];\n private readonly hoverSubscribers = new Set<(state: ChartHoverState | null) => void>();\n private readonly seriesSubscribers = new Set<() => void>();\n private currentHover: ChartHoverState | null = null;\n private lastPointerClientX: number = 0;\n private lastPointerClientY: number = 0;\n private pointerInPlot: boolean = false;\n private lastFrameAt: number = 0;\n private _rafId: number = 0;\n private readonly handlePointerMove = (event: PointerEvent): void => {\n this.pointerInPlot = true;\n this.lastPointerClientX = event.clientX;\n this.lastPointerClientY = event.clientY;\n this.refreshHover();\n };\n private readonly handlePointerLeave = (): void => {\n this.pointerInPlot = false;\n this.emitHover(null);\n };\n\n constructor(target: HTMLElement, private readonly options: ChartOptions = {}) {\n const axesOpt = options.axes;\n if (axesOpt === false) {\n this.normalizedAxes = { x: { visible: false, position: \"inside\" }, y: { visible: false, position: \"inside\" } };\n } else if (axesOpt === true || axesOpt === undefined) {\n this.normalizedAxes = { x: { visible: true, position: \"inside\" }, y: { visible: true, position: \"inside\" } };\n } else {\n this.normalizedAxes = {\n x: normalizeAxisConfig(axesOpt.x),\n y: normalizeAxisConfig(axesOpt.y),\n };\n }\n\n this.layout = new ChartLayout(target, this.normalizedAxes);\n this.applyCanvasSize();\n this.camera = new Camera2D();\n this.axis = new AxisController(this.camera);\n this.renderer = new Renderer(new ReglBackend(this.layout.canvas));\n this.input = new InputController(this.layout.canvas, this.camera, options.viewportPolicy);\n this.rawLineData = new Float32Array(RAW_LINE_VERTEX_CAPACITY * 2);\n this.rawLineBuffer = this.renderer.createFloatBuffer(this.rawLineData.length);\n this.minMaxInstanceData = new Float32Array(MINMAX_SEGMENT_CAPACITY * FLOATS_PER_MINMAX_SEGMENT_INSTANCE);\n this.minMaxInstanceBuffer = this.renderer.createFloatBuffer(this.minMaxInstanceData.length);\n this.barTriangleData = new Float32Array(BAR_FALLBACK_CAPACITY * FLOATS_PER_BAR_TRIANGLE);\n this.barTriangleBuffer = this.renderer.createFloatBuffer(this.barTriangleData.length);\n this.gridData = new Float32Array(GRID_LINE_VERTEX_CAPACITY * 2);\n this.gridBuffer = this.renderer.createFloatBuffer(this.gridData.length);\n this.gridStyle = {\n color: options.gridStyle?.color ?? [0.22, 0.30, 0.44, 0.45],\n lineWidth: options.gridStyle?.lineWidth ?? 1,\n };\n\n if (this.normalizedAxes.x.visible || this.normalizedAxes.y.visible) {\n this.axisOverlay = new AxisOverlay(this.layout, this.normalizedAxes);\n }\n\n this.canvas.addEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.addEventListener(\"pointerleave\", this.handlePointerLeave);\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(this.layout.plot);\n }\n\n for (const plugin of options.plugins ?? []) {\n const installed = plugin.install(this);\n if (typeof installed === \"function\") {\n this.pluginDisposers.push(installed);\n } else if (installed) {\n this.pluginDisposers.push(() => installed.dispose());\n }\n }\n }\n\n get canvas(): HTMLCanvasElement {\n return this.layout.canvas;\n }\n\n get rootElement(): HTMLElement {\n return this.layout.root;\n }\n\n get plotElement(): HTMLElement {\n return this.layout.plot;\n }\n\n dataToPlot(x: number, y: number): [number, number] {\n const [clipX, clipY] = this.camera.toClip(x, y);\n return this.camera.toScreen(clipX, clipY, this.canvas.clientWidth, this.canvas.clientHeight);\n }\n\n addSeries(config: SeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n const dataset: Dataset = config.dataset ?? new RingBuffer(config.capacity);\n const color = style?.color ?? [0.3, 0.6, 1.0, 1.0];\n const s = new SeriesStore(dataset, config, {\n color,\n lineWidth: style?.lineWidth ?? 1,\n pointSize: style?.pointSize ?? 4,\n barWidth: style?.barWidth ?? 0.8,\n baseline: style?.baseline ?? 0,\n fillColor: style?.fillColor ?? [color[0], color[1], color[2], color[3] * 0.25],\n });\n this.series.push(s);\n this.emitSeriesChange();\n return s;\n }\n\n addLine(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n return this.addSeries({ ...config, mode: \"line\" }, style);\n }\n\n addArea(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n return this.addSeries({ ...config, mode: \"area\" }, style);\n }\n\n addScatter(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n return this.addSeries({ ...config, mode: \"scatter\" }, style);\n }\n\n addBar(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n return this.addSeries({ ...config, mode: \"bar\" }, style);\n }\n\n removeSeries(series: SeriesStore): boolean {\n const index = this.series.indexOf(series);\n if (index === -1) return false;\n\n this.series.splice(index, 1);\n this.emitSeriesChange();\n return true;\n }\n\n setSeriesVisible(series: SeriesStore, visible: boolean): boolean {\n if (!this.series.includes(series)) return false;\n if (series.visible === visible) return true;\n series.setVisible(visible);\n this.emitSeriesChange();\n return true;\n }\n\n getSeriesState(): ChartSeriesState[] {\n return this.series.map((series, index) => ({\n series,\n index,\n id: series.config.id,\n name: series.config.name,\n mode: series.config.mode,\n visible: series.visible,\n color: series.style.color,\n }));\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n this.camera.setViewport(v);\n }\n\n resize(dpr: number = globalThis.devicePixelRatio): boolean {\n return this.applyCanvasSize(dpr);\n }\n\n getFrameStats(target: ChartFrameStats = { fps: 0, frameMs: 0, pointsRendered: 0, drawCalls: 0, uploadBytes: 0, renderMode: \"none\" }): ChartFrameStats {\n target.fps = this.stats.fps;\n target.frameMs = this.stats.frameMs;\n target.pointsRendered = this.stats.pointsRendered;\n target.drawCalls = this.stats.drawCalls;\n target.uploadBytes = this.stats.uploadBytes;\n target.renderMode = this.stats.renderMode;\n return target;\n }\n\n getHoverState(): ChartHoverState | null {\n return this.currentHover;\n }\n\n subscribe(event: \"hover\", callback: (state: ChartHoverState | null) => void): () => void;\n subscribe(event: \"serieschange\", callback: () => void): () => void;\n subscribe(event: \"hover\" | \"serieschange\", callback: ((state: ChartHoverState | null) => void) | (() => void)): () => void {\n if (event === \"hover\") {\n const cb = callback as (state: ChartHoverState | null) => void;\n this.hoverSubscribers.add(cb);\n return () => this.hoverSubscribers.delete(cb);\n }\n\n const cb = callback as () => void;\n this.seriesSubscribers.add(cb);\n return () => this.seriesSubscribers.delete(cb);\n }\n\n pick(clientX: number, clientY: number, options: ChartPickOptions = {}): ChartHoverState | null {\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return null;\n\n const plotX = clientX - rect.left;\n const plotY = clientY - rect.top;\n if (plotX < 0 || plotY < 0 || plotX > rect.width || plotY > rect.height) return null;\n\n const viewport = this.camera.viewport;\n const dataX = viewport.xMin + (plotX / rect.width) * (viewport.xMax - viewport.xMin);\n const dataY = viewport.yMax - (plotY / rect.height) * (viewport.yMax - viewport.yMin);\n const mode = options.mode ?? this.options.hover?.mode ?? \"nearest-x\";\n const maxDistancePx = options.maxDistancePx ?? this.options.hover?.maxDistancePx ?? Infinity;\n const anchorX = mode === \"nearest-point\"\n ? this.findNearestPointAnchor(dataX, dataY, viewport, rect.width, rect.height, maxDistancePx)\n : this.findNearestXAnchor(dataX, viewport, rect.width, maxDistancePx);\n\n if (anchorX === null) return null;\n\n const items = this.collectPickItems(anchorX, clientX, clientY, viewport, rect);\n return { clientX, clientY, plotX, plotY, dataX, dataY, anchorX, mode, items };\n }\n\n async screenshot(options: ChartScreenshotOptions = {}): Promise<Blob> {\n this.render();\n\n const rootRect = this.layout.root.getBoundingClientRect();\n const plotRect = this.layout.plot.getBoundingClientRect();\n const dpr = Number.isFinite(options.dpr) ? Math.max(1, options.dpr!) : Math.max(1, globalThis.devicePixelRatio || 1);\n const width = Math.max(1, Math.round(rootRect.width * dpr));\n const height = Math.max(1, Math.round(rootRect.height * dpr));\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Unable to create a 2D canvas context for screenshot export.\");\n\n if (options.background) {\n ctx.fillStyle = options.background;\n ctx.fillRect(0, 0, width, height);\n } else {\n ctx.clearRect(0, 0, width, height);\n }\n\n ctx.drawImage(\n this.canvas,\n (plotRect.left - rootRect.left) * dpr,\n (plotRect.top - rootRect.top) * dpr,\n plotRect.width * dpr,\n plotRect.height * dpr,\n );\n this.drawDomTextForScreenshot(ctx, rootRect, dpr);\n\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => blob ? resolve(blob) : reject(new Error(\"Unable to encode chart screenshot.\")),\n options.type ?? \"image/png\",\n options.quality,\n );\n });\n }\n\n start(): void {\n const frame = (): void => {\n this._rafId = requestAnimationFrame(frame);\n this.render();\n };\n this._rafId = requestAnimationFrame(frame);\n }\n\n stop(): void {\n cancelAnimationFrame(this._rafId);\n }\n\n private render(): void {\n const frameStartedAt = performance.now();\n if (this.lastFrameAt > 0) {\n this.stats.fps = 1000 / (frameStartedAt - this.lastFrameAt);\n }\n this.lastFrameAt = frameStartedAt;\n this.stats.pointsRendered = 0;\n this.stats.drawCalls = 0;\n this.stats.uploadBytes = 0;\n this.stats.renderMode = \"none\";\n\n this.options.viewportPolicy?.beforeRender?.(this.camera);\n\n this.renderer.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.renderer.clear(0.08, 0.10, 0.16, 1);\n\n const viewport = this.camera.viewport;\n if (this.options.grid !== false) {\n const gridVertexCount = this.writeGridVertices(viewport);\n if (gridVertexCount > 0) {\n this.renderer.updateFloatBuffer(this.gridBuffer, this.gridData);\n this.renderer.drawLines(this.gridBuffer, gridVertexCount, this.gridStyle, this.camera);\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.gridData.byteLength;\n }\n }\n\n for (const s of this.series) {\n if (!s.visible) continue;\n s.rebuildPyramid();\n if (s.config.mode === \"scatter\") {\n this.drawScatterSeries(s, viewport);\n continue;\n }\n if (s.config.mode === \"bar\") {\n this.drawBarSeries(s, viewport);\n continue;\n }\n if (s.config.mode === \"area\") {\n this.drawAreaSeries(s, viewport);\n continue;\n }\n\n const visibleSamples = s.visibleSampleCount(viewport);\n const dense = s.hasLOD && visibleSamples > RAW_LINE_VERTEX_CAPACITY;\n if (dense && this.renderer.supportsInstancedSegments) {\n const segmentCount = s.copyMinMaxInstanced(viewport, this.minMaxInstanceData, this.maxMinMaxSegments());\n if (segmentCount <= 0) continue;\n this.renderer.updateFloatBuffer(this.minMaxInstanceBuffer, this.minMaxInstanceData);\n this.renderer.drawMinMaxSegmentsInstanced(this.minMaxInstanceBuffer, segmentCount, s.style, this.camera);\n this.recordRenderMode(\"minmax\");\n this.stats.pointsRendered += segmentCount * 2;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.minMaxInstanceData.byteLength;\n continue;\n }\n\n const count = dense\n ? s.copyMinMaxVisible(viewport, this.rawLineData, this.maxMinMaxSegments())\n : s.copyRawVisible(viewport, this.rawLineData, RAW_LINE_VERTEX_CAPACITY);\n if (count < 2) continue;\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n if (dense) {\n this.renderer.drawMinMaxSegments(this.rawLineBuffer, count, s.style, this.camera);\n this.recordRenderMode(\"minmax\");\n } else {\n this.renderer.drawLineStrip(this.rawLineBuffer, count, s.style, this.camera);\n this.recordRenderMode(\"raw\");\n }\n this.stats.pointsRendered += count;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.rawLineData.byteLength;\n }\n\n this.axisOverlay?.update(this.camera, this.axis);\n\n this.stats.frameMs = performance.now() - frameStartedAt;\n this.refreshHover();\n }\n\n dispose(): void {\n this.stop();\n this.resizeObserver?.disconnect();\n this.canvas.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n for (const dispose of this.pluginDisposers.splice(0)) dispose();\n this.input.dispose();\n this.axisOverlay?.dispose();\n this.renderer.dispose();\n this.layout.dispose();\n }\n\n private applyCanvasSize(dpr: number = globalThis.devicePixelRatio): boolean {\n const scale = Number.isFinite(dpr) ? Math.max(1, dpr) : 1;\n const width = Math.max(1, Math.floor(this.canvas.clientWidth * scale));\n const height = Math.max(1, Math.floor(this.canvas.clientHeight * scale));\n if (this.canvas.width === width && this.canvas.height === height) return false;\n\n this.canvas.width = width;\n this.canvas.height = height;\n return true;\n }\n\n private drawAreaSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n const baseline = series.style.baseline ?? 0;\n const areaVertexCount = series.copyAreaVisible(viewport, this.rawLineData, AREA_POINT_CAPACITY, baseline);\n if (areaVertexCount < 4) return;\n\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n this.renderer.drawAreaStrip(this.rawLineBuffer, areaVertexCount, series.style, this.camera);\n this.stats.pointsRendered += areaVertexCount;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.rawLineData.byteLength;\n\n const lineVertexCount = this.uploadRawInstances(series, viewport, AREA_POINT_CAPACITY);\n if (lineVertexCount >= 2) {\n this.renderer.drawLineStrip(this.rawLineBuffer, lineVertexCount, series.style, this.camera);\n this.stats.pointsRendered += lineVertexCount;\n this.stats.drawCalls++;\n }\n\n this.recordRenderMode(\"area\");\n }\n\n private drawScatterSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n const count = this.uploadRawInstances(series, viewport, RAW_LINE_VERTEX_CAPACITY);\n if (count <= 0) return;\n\n if (this.renderer.supportsInstancedPoints) {\n this.renderer.drawPointsInstanced(this.rawLineBuffer, count, series.style, this.camera, this.canvas.width, this.canvas.height);\n } else {\n this.renderer.drawPointSprites(this.rawLineBuffer, count, series.style, this.camera);\n }\n this.recordInstancedDraw(\"points\", count);\n }\n\n private drawBarSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n const visibleSamples = series.visibleSampleCount(viewport);\n if (series.hasLOD && visibleSamples > RAW_LINE_VERTEX_CAPACITY) {\n const sampledCount = series.copyMinMaxInstanced(viewport, this.minMaxInstanceData, this.maxBarFallbackBars());\n if (sampledCount <= 0) return;\n\n this.includeBaselineInBarRanges(sampledCount, series.style.baseline ?? 0);\n const vertexCount = this.writeBarBucketTriangles(sampledCount, viewport);\n this.drawBarTriangleFallback(vertexCount, series.style);\n return;\n }\n\n const count = this.uploadRawInstances(series, viewport, this.maxBarFallbackBars());\n if (count <= 0) return;\n\n if (this.renderer.supportsInstancedBars) {\n this.renderer.drawBarsInstanced(this.rawLineBuffer, count, series.style, this.camera);\n this.recordInstancedDraw(\"bars\", count);\n return;\n }\n\n const vertexCount = this.writeBarTriangles(count, series.style.baseline ?? 0, series.style.barWidth ?? 0.8);\n this.drawBarTriangleFallback(vertexCount, series.style);\n }\n\n private uploadRawInstances(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n maxPoints: number,\n ): number {\n const count = series.copyRawVisible(viewport, this.rawLineData, maxPoints);\n if (count <= 0) return 0;\n\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n this.stats.uploadBytes += this.rawLineData.byteLength;\n return count;\n }\n\n private includeBaselineInBarRanges(barCount: number, baseline: number): void {\n for (let i = 0; i < barCount; i++) {\n const offset = i * FLOATS_PER_MINMAX_SEGMENT_INSTANCE;\n const minY = this.minMaxInstanceData[offset + 1]!;\n const maxY = this.minMaxInstanceData[offset + 2]!;\n this.minMaxInstanceData[offset + 1] = Math.min(baseline, minY);\n this.minMaxInstanceData[offset + 2] = Math.max(baseline, maxY);\n }\n }\n\n private writeBarTriangles(barCount: number, baseline: number, barWidth: number): number {\n const count = Math.min(barCount, this.maxBarFallbackBars());\n for (let i = 0; i < count; i++) {\n const x = this.rawLineData[i * 2]!;\n const y = this.rawLineData[i * 2 + 1]!;\n this.writeBarTriangle(i, x - barWidth * 0.5, x + barWidth * 0.5, baseline, y);\n }\n return count * 6;\n }\n\n private writeBarBucketTriangles(\n barCount: number,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): number {\n const count = Math.min(barCount, this.maxBarFallbackBars());\n const width = (viewport.xMax - viewport.xMin) / Math.max(1, count);\n for (let i = 0; i < count; i++) {\n const minY = this.minMaxInstanceData[i * 3 + 1]!;\n const maxY = this.minMaxInstanceData[i * 3 + 2]!;\n const x0 = viewport.xMin + i * width;\n const x1 = i === count - 1 ? viewport.xMax : x0 + width;\n this.writeBarTriangle(i, x0, x1, minY, maxY);\n }\n return count * 6;\n }\n\n private writeBarTriangle(index: number, x0: number, x1: number, y0: number, y1: number): void {\n const o = index * FLOATS_PER_BAR_TRIANGLE;\n this.barTriangleData[o] = x0;\n this.barTriangleData[o + 1] = y0;\n this.barTriangleData[o + 2] = x1;\n this.barTriangleData[o + 3] = y0;\n this.barTriangleData[o + 4] = x0;\n this.barTriangleData[o + 5] = y1;\n this.barTriangleData[o + 6] = x0;\n this.barTriangleData[o + 7] = y1;\n this.barTriangleData[o + 8] = x1;\n this.barTriangleData[o + 9] = y0;\n this.barTriangleData[o + 10] = x1;\n this.barTriangleData[o + 11] = y1;\n }\n\n private drawBarTriangleFallback(vertexCount: number, style: SeriesStyle): void {\n if (vertexCount <= 0) return;\n this.renderer.updateFloatBuffer(this.barTriangleBuffer, this.barTriangleData);\n this.stats.uploadBytes += this.barTriangleData.byteLength;\n this.renderer.drawBarTriangles(this.barTriangleBuffer, vertexCount, style, this.camera);\n this.recordInstancedDraw(\"bars\", vertexCount);\n }\n\n private recordInstancedDraw(mode: \"points\" | \"bars\", count: number): void {\n this.recordRenderMode(mode);\n this.stats.pointsRendered += count;\n this.stats.drawCalls++;\n }\n\n private findNearestXAnchor(\n dataX: number,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n plotWidth: number,\n maxDistancePx: number,\n ): number | null {\n let best: SeriesSample | null = null;\n let bestDistancePx = Infinity;\n const xScale = plotWidth / (viewport.xMax - viewport.xMin);\n\n for (const series of this.series) {\n if (!series.visible) continue;\n const sample = series.nearestSampleByX(dataX, viewport);\n if (!sample) continue;\n const distancePx = Math.abs(sample.x - dataX) * xScale;\n if (distancePx < bestDistancePx) {\n best = sample;\n bestDistancePx = distancePx;\n }\n }\n\n if (!best || bestDistancePx > maxDistancePx) return null;\n return best.x;\n }\n\n private findNearestPointAnchor(\n dataX: number,\n dataY: number,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n plotWidth: number,\n plotHeight: number,\n maxDistancePx: number,\n ): number | null {\n let best: SeriesSample | null = null;\n for (const series of this.series) {\n if (!series.visible) continue;\n const sample = series.nearestSampleByPoint(dataX, dataY, viewport, plotWidth, plotHeight);\n if (!sample) continue;\n if (!best || (sample.distancePx ?? Infinity) < (best.distancePx ?? Infinity)) {\n best = sample;\n }\n }\n\n if (!best || (best.distancePx ?? Infinity) > maxDistancePx) return null;\n return best.x;\n }\n\n private collectPickItems(\n anchorX: number,\n clientX: number,\n clientY: number,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n rect: DOMRect,\n ): ChartPickItem[] {\n const items: ChartPickItem[] = [];\n for (let seriesIndex = 0; seriesIndex < this.series.length; seriesIndex++) {\n const series = this.series[seriesIndex]!;\n if (!series.visible) continue;\n const sample = series.nearestSampleByX(anchorX, viewport);\n if (!sample) continue;\n\n const [clipX, clipY] = this.camera.toClip(sample.x, sample.y);\n const [plotX, plotY] = this.camera.toScreen(clipX, clipY, rect.width, rect.height);\n const itemClientX = rect.left + plotX;\n const itemClientY = rect.top + plotY;\n const dx = itemClientX - clientX;\n const dy = itemClientY - clientY;\n items.push({\n ...sample,\n distancePx: Math.hypot(dx, dy),\n series,\n seriesIndex,\n id: series.config.id,\n name: series.config.name,\n mode: series.config.mode,\n plotX,\n plotY,\n clientX: itemClientX,\n clientY: itemClientY,\n });\n }\n return items;\n }\n\n private refreshHover(): void {\n if (!this.pointerInPlot) return;\n this.emitHover(this.pick(this.lastPointerClientX, this.lastPointerClientY));\n }\n\n private emitHover(state: ChartHoverState | null): void {\n this.currentHover = state;\n for (const callback of this.hoverSubscribers) callback(state);\n }\n\n private emitSeriesChange(): void {\n for (const callback of this.seriesSubscribers) callback();\n this.refreshHover();\n }\n\n private drawDomTextForScreenshot(ctx: CanvasRenderingContext2D, rootRect: DOMRect, dpr: number): void {\n const elements = this.layout.root.querySelectorAll<HTMLElement>(\"div\");\n for (const el of elements) {\n const text = el.textContent;\n if (!text || el.children.length > 0) continue;\n\n const style = getComputedStyle(el);\n if (style.display === \"none\" || style.visibility === \"hidden\" || style.opacity === \"0\") continue;\n\n const rect = el.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) continue;\n\n ctx.save();\n ctx.scale(dpr, dpr);\n ctx.font = style.font;\n ctx.fillStyle = style.color;\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"left\";\n ctx.fillText(text, rect.left - rootRect.left, rect.top - rootRect.top);\n ctx.restore();\n }\n }\n\n private maxMinMaxSegments(): number {\n return Math.min(this.canvas.width, MINMAX_SEGMENT_CAPACITY);\n }\n\n private maxBarFallbackBars(): number {\n return Math.min(BAR_FALLBACK_CAPACITY, RAW_LINE_VERTEX_CAPACITY);\n }\n\n private writeGridVertices(\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): number {\n const plotW = Math.max(1, this.canvas.clientWidth);\n const plotH = Math.max(1, this.canvas.clientHeight);\n this.axis.getXTickValues(plotW, 12, this.xTicks);\n this.axis.getYTickValues(plotH, 8, this.yTicks);\n\n let vertexCount = 0;\n for (const x of this.xTicks) {\n if (vertexCount + 2 > GRID_LINE_VERTEX_CAPACITY) return vertexCount;\n this.gridData[vertexCount * 2] = x;\n this.gridData[vertexCount * 2 + 1] = viewport.yMin;\n vertexCount++;\n this.gridData[vertexCount * 2] = x;\n this.gridData[vertexCount * 2 + 1] = viewport.yMax;\n vertexCount++;\n }\n\n for (const y of this.yTicks) {\n if (vertexCount + 2 > GRID_LINE_VERTEX_CAPACITY) return vertexCount;\n this.gridData[vertexCount * 2] = viewport.xMin;\n this.gridData[vertexCount * 2 + 1] = y;\n vertexCount++;\n this.gridData[vertexCount * 2] = viewport.xMax;\n this.gridData[vertexCount * 2 + 1] = y;\n vertexCount++;\n }\n\n return vertexCount;\n }\n\n private recordRenderMode(mode: \"raw\" | \"minmax\" | \"points\" | \"bars\" | \"area\"): void {\n if (this.stats.renderMode === \"none\") {\n this.stats.renderMode = mode;\n } else if (this.stats.renderMode !== mode) {\n this.stats.renderMode = \"mixed\";\n }\n }\n}\n","import type { Dataset, TimeRange } from \"./types.js\";\n\nexport class StaticDataset implements Dataset {\n constructor(\n private readonly xData: ArrayLike<number>,\n private readonly yData: ArrayLike<number>,\n ) {}\n\n get length(): number {\n return Math.min(this.xData.length, this.yData.length);\n }\n\n get range(): TimeRange | null {\n if (this.length === 0) return null;\n return { start: this.xData[0]!, end: this.xData[this.length - 1]! };\n }\n\n getX(index: number): number {\n this.assertValidIndex(index);\n return this.xData[index]!;\n }\n\n getY(index: number): number {\n this.assertValidIndex(index);\n return this.yData[index]!;\n }\n\n lowerBoundX(x: number): number {\n let lo = 0;\n let hi = this.length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.xData[mid]! < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n upperBoundX(x: number): number {\n let lo = 0;\n let hi = this.length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.xData[mid]! <= x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n private assertValidIndex(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this.length) {\n throw new RangeError(`StaticDataset index out of range: ${index}`);\n }\n }\n}\n"],"mappings":"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"}