blazeplot 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Chart-BW9JaHs6.js +2903 -0
- package/dist/Chart-BW9JaHs6.js.map +1 -0
- package/dist/OverlayUtils-Cw1o8UH-.js +35 -0
- package/dist/OverlayUtils-Cw1o8UH-.js.map +1 -0
- package/dist/core/SeriesStore.d.ts +2 -0
- package/dist/core/SeriesStore.d.ts.map +1 -1
- package/dist/core/UniformRingBuffer.d.ts +67 -0
- package/dist/core/UniformRingBuffer.d.ts.map +1 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/types.d.ts +5 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +153 -2304
- package/dist/index.js.map +1 -1
- package/dist/interaction/AxisController.d.ts +45 -3
- package/dist/interaction/AxisController.d.ts.map +1 -1
- package/dist/interaction/index.d.ts +1 -0
- package/dist/interaction/index.d.ts.map +1 -1
- package/dist/linked.d.ts +3 -0
- package/dist/linked.d.ts.map +1 -0
- package/dist/linked.js +64 -0
- package/dist/linked.js.map +1 -0
- package/dist/plugins/crosshair.d.ts +3 -0
- package/dist/plugins/crosshair.d.ts.map +1 -0
- package/dist/plugins/crosshair.js +192 -0
- package/dist/plugins/crosshair.js.map +1 -0
- package/dist/plugins/interactions.js +87 -65
- package/dist/plugins/interactions.js.map +1 -1
- package/dist/plugins/navigator.d.ts +3 -0
- package/dist/plugins/navigator.d.ts.map +1 -0
- package/dist/plugins/navigator.js +147 -0
- package/dist/plugins/navigator.js.map +1 -0
- package/dist/plugins/selection.d.ts +3 -0
- package/dist/plugins/selection.d.ts.map +1 -0
- package/dist/plugins/selection.js +144 -0
- package/dist/plugins/selection.js.map +1 -0
- package/dist/plugins/tooltip.js +29 -45
- package/dist/plugins/tooltip.js.map +1 -1
- package/dist/react.d.ts +14 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +30 -0
- package/dist/react.js.map +1 -0
- package/dist/ui/Chart.d.ts +79 -1
- package/dist/ui/Chart.d.ts.map +1 -1
- package/dist/ui/ChartLayout.d.ts +10 -0
- package/dist/ui/ChartLayout.d.ts.map +1 -1
- package/dist/ui/Crosshair.d.ts +60 -0
- package/dist/ui/Crosshair.d.ts.map +1 -0
- package/dist/ui/Interactions.d.ts.map +1 -1
- package/dist/ui/LinkedCharts.d.ts +23 -0
- package/dist/ui/LinkedCharts.d.ts.map +1 -0
- package/dist/ui/Navigator.d.ts +32 -0
- package/dist/ui/Navigator.d.ts.map +1 -0
- package/dist/ui/OverlayUtils.d.ts +17 -0
- package/dist/ui/OverlayUtils.d.ts.map +1 -0
- package/dist/ui/Selection.d.ts +64 -0
- package/dist/ui/Selection.d.ts.map +1 -0
- package/dist/ui/Tooltip.d.ts.map +1 -1
- package/dist/ui/theme.d.ts +12 -0
- package/dist/ui/theme.d.ts.map +1 -1
- package/package.json +29 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chart-BW9JaHs6.js","names":[],"sources":["../src/core/MinMaxPyramid.ts","../src/core/SeriesStore.ts","../src/core/search.ts","../src/core/RingBuffer.ts","../src/render/ShaderPrograms.ts","../src/render/Renderer.ts","../src/render/WebGL2Resources.ts","../src/render/ReglBackend.ts","../src/interaction/Camera2D.ts","../src/interaction/AxisController.ts","../src/ui/AxisOverlay.ts","../src/ui/ChartLayout.ts","../src/ui/theme.ts","../src/ui/Chart.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 let nextLength = current?.length ?? 0;\n if (nextLength <= 0) {\n nextLength = needed;\n } else {\n while (nextLength < needed) {\n nextLength = Math.max(needed, Math.ceil(nextLength * 1.5));\n }\n }\n\n const next = new Float32Array(nextLength);\n if (current) {\n next.set(current);\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, YAppendableDataset, OhlcDataset, RangeMinMaxDataset, RangeSampleCopyDataset, VisibleSampleCopyDataset, VisiblePointCopyDataset, MinMaxSegmentCopyDataset, 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\nfunction isOhlcDataset(dataset: Dataset): dataset is OhlcDataset {\n return \"getOpen\" in dataset && \"getHigh\" in dataset && \"getLow\" in dataset && \"getClose\" in dataset;\n}\n\nfunction hasAppendY(dataset: Dataset): dataset is YAppendableDataset {\n return \"appendY\" in dataset;\n}\n\nfunction hasCopySamplesRange(dataset: Dataset): dataset is RangeSampleCopyDataset {\n return \"copySamplesRange\" in dataset;\n}\n\nfunction hasCopyMinMaxSegments(dataset: Dataset): dataset is MinMaxSegmentCopyDataset {\n return \"copyMinMaxSegments\" in dataset;\n}\n\nfunction hasCopyVisibleSamples(dataset: Dataset): dataset is VisibleSampleCopyDataset {\n return \"copyVisibleSamples\" in dataset;\n}\n\nfunction hasCopyVisiblePoints(dataset: Dataset): dataset is VisiblePointCopyDataset {\n return \"copyVisiblePoints\" in dataset;\n}\n\nconst NEAREST_POINT_LEAF_SIZE = 64;\nconst SCATTER_INTERVAL_LEAF_SIZE = 64;\nconst SCATTER_BUCKET_RANGE_PRUNE_SIZE = 1024;\n\ntype PointSearchInterval = {\n readonly start: number;\n readonly end: number;\n readonly lowerBoundSq: number;\n};\n\nfunction interpolateY(x0: number, y0: number, x1: number, y1: number, x: number): number {\n if (x1 === x0) return y0;\n const t = (x - x0) / (x1 - x0);\n return y0 + (y1 - y0) * t;\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 _useDatasetRangeMinMax: 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.mode === \"scatter\") && config.downsample !== \"none\" ? new MinMaxPyramid() : null;\n this._useDatasetRangeMinMax = hasRangeMinMaxY(dataset);\n this.style = style;\n\n if (this.pyramid && dataset.length > 0 && !this._useDatasetRangeMinMax) {\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 appendY(y: ArrayLike<number>): void {\n if (!hasAppendY(this.dataset)) {\n throw new TypeError(\"SeriesStore dataset does not support appendY.\");\n }\n\n this.dataset.appendY(y);\n this._dirty = true;\n }\n\n markDirty(): void {\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 this._useDatasetRangeMinMax = hasRangeMinMaxY(this.dataset);\n this._useRawMinMaxScan = false;\n if (this.pyramid && !this._useDatasetRangeMinMax) this.pyramid.build(this.dataset);\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 (hasRangeMinMaxY(this.dataset)) {\n this._useDatasetRangeMinMax = true;\n this._useRawMinMaxScan = false;\n } else if (shiftedAtCapacity) {\n this._useDatasetRangeMinMax = false;\n this._useRawMinMaxScan = true;\n } else {\n this.pyramid.incrementalBuild(this.dataset);\n this._useDatasetRangeMinMax = false;\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 const length = Math.max(0, end - start);\n if (this._useDatasetRangeMinMax) {\n return this.queryRangeMinMax(start, length, pixelWidth);\n }\n\n return this.pyramid.query(viewport, pixelWidth, { start, length });\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 maxDistancePx: number = Infinity,\n ): SeriesSample | null {\n const range = this.visibleIndexRange(viewport);\n const xRange = viewport.xMax - viewport.xMin;\n const yRange = viewport.yMax - viewport.yMin;\n if (range.start >= range.end || plotWidth <= 0 || plotHeight <= 0 || xRange <= 0 || yRange <= 0) return null;\n\n const xScale = plotWidth / xRange;\n const yScale = plotHeight / yRange;\n let bestIndex = -1;\n let bestDistanceSq = maxDistancePx < 0\n ? -1\n : Number.isFinite(maxDistancePx)\n ? maxDistancePx * maxDistancePx\n : Infinity;\n\n const visitSample = (index: number): void => {\n const dx = (this.dataset.getX(index) - x) * xScale;\n const dy = (this.dataset.getY(index) - y) * yScale;\n const d2 = dx * dx + dy * dy;\n if (d2 < bestDistanceSq || (bestIndex < 0 && d2 <= bestDistanceSq)) {\n bestDistanceSq = d2;\n bestIndex = index;\n }\n };\n\n const lower = this.dataset.lowerBoundX(x);\n const nearest = Math.min(Math.max(lower, range.start), range.end - 1);\n visitSample(nearest);\n if (nearest > range.start) visitSample(nearest - 1);\n if (nearest + 1 < range.end) visitSample(nearest + 1);\n\n if (this.hasPointIntervalBounds() && range.end - range.start > NEAREST_POINT_LEAF_SIZE) {\n const rootBound = this.pointIntervalDistanceSq(range.start, range.end, x, y, xScale, yScale);\n const stack: PointSearchInterval[] = rootBound <= bestDistanceSq\n ? [{ start: range.start, end: range.end, lowerBoundSq: rootBound }]\n : [];\n\n while (stack.length > 0) {\n const interval = stack.pop()!;\n if (interval.lowerBoundSq > bestDistanceSq) continue;\n\n const length = interval.end - interval.start;\n if (length <= NEAREST_POINT_LEAF_SIZE) {\n for (let i = interval.start; i < interval.end; i++) visitSample(i);\n continue;\n }\n\n const mid = interval.start + (length >> 1);\n const leftBound = this.pointIntervalDistanceSq(interval.start, mid, x, y, xScale, yScale);\n const rightBound = this.pointIntervalDistanceSq(mid, interval.end, x, y, xScale, yScale);\n const left: PointSearchInterval = { start: interval.start, end: mid, lowerBoundSq: leftBound };\n const right: PointSearchInterval = { start: mid, end: interval.end, lowerBoundSq: rightBound };\n\n if (leftBound < rightBound) {\n if (rightBound <= bestDistanceSq) stack.push(right);\n if (leftBound <= bestDistanceSq) stack.push(left);\n } else {\n if (leftBound <= bestDistanceSq) stack.push(left);\n if (rightBound <= bestDistanceSq) stack.push(right);\n }\n }\n } else {\n let left = Math.min(lower - 1, range.end - 1);\n let right = Math.max(lower, range.start);\n while (left >= range.start || right < range.end) {\n const leftDxSq = left >= range.start ? this.pointXDistanceSq(left, x, xScale) : Infinity;\n const rightDxSq = right < range.end ? this.pointXDistanceSq(right, x, xScale) : Infinity;\n if (leftDxSq > bestDistanceSq && rightDxSq > bestDistanceSq) break;\n\n if (leftDxSq <= rightDxSq) {\n if (leftDxSq <= bestDistanceSq) visitSample(left);\n left--;\n } else {\n if (rightDxSq <= bestDistanceSq) visitSample(right);\n right++;\n }\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, xOrigin: number = 0): number {\n return this.copyVisibleSamples(viewport, target, maxPoints, \"points\", 0, xOrigin);\n }\n\n copyScatterVisible(\n viewport: Viewport,\n target: Float32Array,\n maxPoints: number,\n pixelWidth: number,\n pixelHeight: number,\n pointSize: number,\n xOrigin: number = 0,\n ): number {\n return this.copyVisiblePoints(viewport, target, maxPoints, pixelWidth, pixelHeight, pointSize, xOrigin);\n }\n\n copyScatterRange(\n start: number,\n end: number,\n viewport: Viewport,\n target: Float32Array,\n maxPoints: number,\n xOrigin: number = 0,\n pixelHeight: number = 0,\n pointSize: number = 0,\n ): number {\n if (maxPoints <= 0 || target.length < maxPoints * 2) return 0;\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 0;\n\n const yRange = viewport.yMax - viewport.yMin;\n const height = Math.max(0, Math.floor(pixelHeight));\n const safePointSize = Number.isFinite(pointSize) ? Math.max(0, pointSize) : 0;\n const yPad = yRange > 0 && height > 0 ? ((safePointSize * 0.5) / height) * yRange : 0;\n const yMin = viewport.yMin - yPad;\n const yMax = viewport.yMax + yPad;\n\n let count = 0;\n for (let i = from; i < to && count < maxPoints; i++) {\n const y = this.dataset.getY(i);\n if (y < yMin || y > yMax) continue;\n\n const offset = count * 2;\n target[offset] = this.dataset.getX(i) - xOrigin;\n target[offset + 1] = y;\n count++;\n }\n\n return count;\n }\n\n copyRawVisibleClipped(viewport: Viewport, target: Float32Array, maxPoints: number, xOrigin: number = 0): number {\n return this.copyClippedVisibleLine(viewport, target, maxPoints, xOrigin, \"data\");\n }\n\n copyRawVisibleClipSpace(viewport: Viewport, target: Float32Array, maxPoints: number): number {\n return this.copyClippedVisibleLine(viewport, target, maxPoints, 0, \"clip\");\n }\n\n copyRawRange(start: number, end: number, target: Float32Array, maxPoints: number, xOrigin: number = 0): number {\n return this.copySampleRange(start, end, target, maxPoints, \"points\", 0, xOrigin);\n }\n\n copyAreaVisible(viewport: Viewport, target: Float32Array, maxPoints: number, baseline: number = 0, xOrigin: number = 0): number {\n return this.copyVisibleSamples(viewport, target, maxPoints, \"area\", baseline, xOrigin) * 2;\n }\n\n copyAreaRange(start: number, end: number, target: Float32Array, maxPoints: number, baseline: number = 0, xOrigin: number = 0): number {\n return this.copySampleRange(start, end, target, maxPoints, \"area\", baseline, xOrigin) * 2;\n }\n\n copyMinMaxVisible(viewport: Viewport, target: Float32Array, maxSegments: number, xOrigin: number = 0): number {\n return this.copyMinMaxSegments(viewport, target, maxSegments, \"line-list\", xOrigin) * 2;\n }\n\n copyMinMaxInstanced(viewport: Viewport, target: Float32Array, maxSegments: number, xOrigin: number = 0): number {\n return this.copyMinMaxSegments(viewport, target, maxSegments, \"instanced\", xOrigin);\n }\n\n copyOhlcRange(start: number, end: number, target: Float32Array, maxCandles: number, tickWidth: number, xOrigin: number = 0): number {\n if (!isOhlcDataset(this.dataset) || maxCandles <= 0 || target.length < maxCandles * 12) return 0;\n\n const from = Math.max(0, Math.floor(start));\n const to = Math.min(this.dataset.length, Math.ceil(end));\n const count = Math.min(maxCandles, Math.max(0, to - from));\n const halfTick = tickWidth * 0.5;\n for (let i = 0; i < count; i++) {\n const index = from + i;\n const x = this.dataset.getX(index) - xOrigin;\n const open = this.dataset.getOpen(index);\n const high = this.dataset.getHigh(index);\n const low = this.dataset.getLow(index);\n const close = this.dataset.getClose(index);\n const offset = i * 12;\n target[offset] = x;\n target[offset + 1] = low;\n target[offset + 2] = x;\n target[offset + 3] = high;\n target[offset + 4] = x - halfTick;\n target[offset + 5] = open;\n target[offset + 6] = x;\n target[offset + 7] = open;\n target[offset + 8] = x;\n target[offset + 9] = close;\n target[offset + 10] = x + halfTick;\n target[offset + 11] = close;\n }\n\n return count;\n }\n\n copyOhlcTuplesRange(start: number, end: number, target: Float32Array, maxCandles: number, xOrigin: number = 0): number {\n if (!isOhlcDataset(this.dataset) || maxCandles <= 0 || target.length < maxCandles * 5) return 0;\n\n const from = Math.max(0, Math.floor(start));\n const to = Math.min(this.dataset.length, Math.ceil(end));\n const count = Math.min(maxCandles, Math.max(0, to - from));\n for (let i = 0; i < count; i++) {\n const index = from + i;\n const offset = i * 5;\n target[offset] = this.dataset.getX(index) - xOrigin;\n target[offset + 1] = this.dataset.getOpen(index);\n target[offset + 2] = this.dataset.getHigh(index);\n target[offset + 3] = this.dataset.getLow(index);\n target[offset + 4] = this.dataset.getClose(index);\n }\n\n return count;\n }\n\n visibleIndexRange(viewport: Viewport | undefined, outerPadding: number = 0): { start: number; end: number } {\n if (!viewport) return { start: 0, end: this.dataset.length };\n const pad = Math.max(0, Math.floor(outerPadding));\n return {\n start: Math.max(0, this.dataset.lowerBoundX(viewport.xMin) - pad),\n end: Math.min(this.dataset.length, this.dataset.upperBoundX(viewport.xMax) + pad),\n };\n }\n\n private pointXDistanceSq(index: number, x: number, xScale: number): number {\n const dx = (this.dataset.getX(index) - x) * xScale;\n return dx * dx;\n }\n\n private pointIntervalDistanceSq(\n start: number,\n end: number,\n x: number,\n y: number,\n xScale: number,\n yScale: number,\n ): number {\n if (end <= start) return Infinity;\n\n const x0 = this.dataset.getX(start);\n const x1 = this.dataset.getX(end - 1);\n const dx = x < x0 ? (x0 - x) * xScale : x > x1 ? (x - x1) * xScale : 0;\n\n const range = this.pointIntervalMinMaxY(start, end);\n if (!range) return Infinity;\n\n const dy = y < range.minY ? (range.minY - y) * yScale : y > range.maxY ? (y - range.maxY) * yScale : 0;\n return dx * dx + dy * dy;\n }\n\n private hasPointIntervalBounds(): boolean {\n return hasRangeMinMaxY(this.dataset) || (this.pyramid !== null && !this._dirty && !this._useRawMinMaxScan);\n }\n\n private pointIntervalMinMaxY(start: number, end: number): { minY: number; maxY: number } | null {\n if (hasRangeMinMaxY(this.dataset)) return this.dataset.rangeMinMaxY(start, end);\n if (this.pyramid && !this._dirty && !this._useRawMinMaxScan) return this.pyramid.rangeMinMax(this.dataset, start, end);\n return null;\n }\n\n private copyClippedVisibleLine(\n viewport: Viewport,\n target: Float32Array,\n maxPoints: number,\n xOrigin: number,\n output: \"data\" | \"clip\",\n ): number {\n if (maxPoints <= 0 || target.length < maxPoints * 2) return 0;\n\n const xRange = viewport.xMax - viewport.xMin;\n const yRange = viewport.yMax - viewport.yMin;\n if (output === \"clip\" && (xRange <= 0 || yRange <= 0)) return 0;\n\n const start = Math.max(0, this.dataset.lowerBoundX(viewport.xMin) - 1);\n const end = Math.min(this.dataset.length, this.dataset.upperBoundX(viewport.xMax) + 1);\n if (end - start <= 0) return 0;\n\n let count = 0;\n let lastX = NaN;\n let lastY = NaN;\n const addPoint = (x: number, y: number): boolean => {\n const outX = output === \"clip\" ? ((x - viewport.xMin) / xRange) * 2 - 1 : x - xOrigin;\n const outY = output === \"clip\" ? ((y - viewport.yMin) / yRange) * 2 - 1 : y;\n if (count > 0 && outX === lastX && outY === lastY) return true;\n if (count >= maxPoints) return false;\n const offset = count * 2;\n target[offset] = outX;\n target[offset + 1] = outY;\n count++;\n lastX = outX;\n lastY = outY;\n return true;\n };\n\n if (end - start === 1) {\n const x = this.dataset.getX(start);\n if (x < viewport.xMin || x > viewport.xMax) return 0;\n return addPoint(x, this.dataset.getY(start)) ? count : 0;\n }\n\n for (let i = start; i + 1 < end; i++) {\n const x0 = this.dataset.getX(i);\n const y0 = this.dataset.getY(i);\n const x1 = this.dataset.getX(i + 1);\n const y1 = this.dataset.getY(i + 1);\n if (x1 < viewport.xMin || x0 > viewport.xMax) continue;\n\n const clippedX0 = Math.max(x0, viewport.xMin);\n const clippedX1 = Math.min(x1, viewport.xMax);\n if (clippedX1 < clippedX0) continue;\n const clippedY0 = interpolateY(x0, y0, x1, y1, clippedX0);\n const clippedY1 = interpolateY(x0, y0, x1, y1, clippedX1);\n if (!addPoint(clippedX0, clippedY0) || !addPoint(clippedX1, clippedY1)) break;\n }\n\n return count;\n }\n\n private copyVisiblePoints(\n viewport: Viewport,\n target: Float32Array,\n maxPoints: number,\n pixelWidth: number,\n pixelHeight: number,\n pointSize: number,\n xOrigin: number,\n ): number {\n if (hasCopyVisiblePoints(this.dataset)) {\n return this.dataset.copyVisiblePoints(viewport, target, maxPoints, xOrigin, pixelWidth, pixelHeight, pointSize);\n }\n\n if (maxPoints <= 0 || target.length < maxPoints * 2) return 0;\n\n const xRange = viewport.xMax - viewport.xMin;\n const yRange = viewport.yMax - viewport.yMin;\n const width = Math.max(1, Math.floor(pixelWidth));\n const height = Math.max(1, Math.floor(pixelHeight));\n if (xRange <= 0 || yRange <= 0) return 0;\n\n const safePointSize = Number.isFinite(pointSize) ? Math.max(0, pointSize) : 0;\n const pointRadius = safePointSize * 0.5;\n const xPad = (pointRadius / width) * xRange;\n const yPad = (pointRadius / height) * yRange;\n const xMin = viewport.xMin - xPad;\n const xMax = viewport.xMax + xPad;\n const yMin = viewport.yMin - yPad;\n const yMax = viewport.yMax + yPad;\n\n const start = this.dataset.lowerBoundX(xMin);\n const end = this.dataset.upperBoundX(xMax);\n if (end <= start) return 0;\n\n if (end - start <= maxPoints) {\n return this.copyVisiblePointRange(start, end, yMin, yMax, target, maxPoints, xOrigin);\n }\n\n const hasIntervalBounds = this.hasPointIntervalBounds();\n const fullRange = hasIntervalBounds ? this.pointIntervalMinMaxY(start, end) : null;\n if (fullRange && (fullRange.maxY < yMin || fullRange.minY > yMax)) return 0;\n\n if (end - start <= maxPoints * 4) {\n const exact = this.copyVisiblePointsExact(start, end, yMin, yMax, target, maxPoints, xOrigin);\n if (!exact.overflow) return exact.count;\n }\n\n const fullRangeInside = fullRange !== null && fullRange.minY >= yMin && fullRange.maxY <= yMax;\n return this.copyVisiblePointBuckets(start, end, yMin, yMax, target, maxPoints, xOrigin, fullRangeInside, hasIntervalBounds);\n }\n\n private copyVisiblePointRange(\n start: number,\n end: number,\n yMin: number,\n yMax: number,\n target: Float32Array,\n maxPoints: number,\n xOrigin: number,\n ): number {\n let count = 0;\n for (let i = start; i < end && count < maxPoints; i++) {\n const y = this.dataset.getY(i);\n if (y < yMin || y > yMax) continue;\n\n const offset = count * 2;\n target[offset] = this.dataset.getX(i) - xOrigin;\n target[offset + 1] = y;\n count++;\n }\n return count;\n }\n\n private copyVisiblePointBuckets(\n start: number,\n end: number,\n yMin: number,\n yMax: number,\n target: Float32Array,\n maxPoints: number,\n xOrigin: number,\n fullRangeInside: boolean,\n hasIntervalBounds: boolean,\n ): number {\n const sourceCount = end - start;\n const bucketWidth = this.stableScatterBucketWidth(sourceCount, maxPoints);\n const alignedStart = Math.floor(start / bucketWidth) * bucketWidth;\n let count = 0;\n\n const writeIndex = (index: number): void => {\n const offset = count * 2;\n target[offset] = this.dataset.getX(index) - xOrigin;\n target[offset + 1] = this.dataset.getY(index);\n count++;\n };\n\n for (let bucketStart = alignedStart; bucketStart < end && count < maxPoints; bucketStart += bucketWidth) {\n const bucketEnd = Math.min(end, bucketStart + bucketWidth);\n const visibleStart = Math.max(start, bucketStart);\n if (bucketEnd <= visibleStart) continue;\n\n const representative = Math.max(\n visibleStart,\n Math.min(bucketEnd - 1, bucketStart + (bucketWidth >> 1)),\n );\n\n if (fullRangeInside) {\n writeIndex(representative);\n continue;\n }\n\n const range = hasIntervalBounds && bucketEnd - visibleStart >= SCATTER_BUCKET_RANGE_PRUNE_SIZE\n ? this.pointIntervalMinMaxY(visibleStart, bucketEnd)\n : null;\n if (range && (range.maxY < yMin || range.minY > yMax)) continue;\n if (range && range.minY >= yMin && range.maxY <= yMax) {\n writeIndex(representative);\n continue;\n }\n\n for (let i = visibleStart; i < bucketEnd; i++) {\n const y = this.dataset.getY(i);\n if (y < yMin || y > yMax) continue;\n\n const offset = count * 2;\n target[offset] = this.dataset.getX(i) - xOrigin;\n target[offset + 1] = y;\n count++;\n break;\n }\n }\n\n return count;\n }\n\n private stableScatterBucketWidth(sourceCount: number, maxPoints: number): number {\n const targetWidth = Math.max(1, Math.ceil(sourceCount / Math.max(1, maxPoints)));\n if (targetWidth <= 8) return targetWidth;\n return Math.ceil(targetWidth / 8) * 8;\n }\n\n private copyVisiblePointsExact(\n start: number,\n end: number,\n yMin: number,\n yMax: number,\n target: Float32Array,\n maxPoints: number,\n xOrigin: number,\n ): { count: number; overflow: boolean } {\n let count = 0;\n let overflow = false;\n const hasIntervalBounds = this.hasPointIntervalBounds();\n\n const writePoint = (index: number): boolean => {\n const y = this.dataset.getY(index);\n if (y < yMin || y > yMax) return true;\n if (count >= maxPoints) {\n overflow = true;\n return false;\n }\n\n const offset = count * 2;\n target[offset] = this.dataset.getX(index) - xOrigin;\n target[offset + 1] = y;\n count++;\n return true;\n };\n\n const visitLinear = (from: number, to: number): boolean => {\n for (let i = from; i < to; i++) {\n if (!writePoint(i)) return false;\n }\n return true;\n };\n\n const visitInterval = (from: number, to: number): boolean => {\n if (to <= from) return true;\n\n const range = hasIntervalBounds ? this.pointIntervalMinMaxY(from, to) : null;\n if (range && (range.maxY < yMin || range.minY > yMax)) return true;\n if (to - from <= SCATTER_INTERVAL_LEAF_SIZE || !hasIntervalBounds) return visitLinear(from, to);\n\n const mid = from + ((to - from) >> 1);\n return visitInterval(from, mid) && visitInterval(mid, to);\n };\n\n visitInterval(start, end);\n return { count, overflow };\n }\n\n private copyVisibleSamples(\n viewport: Viewport,\n target: Float32Array,\n maxPoints: number,\n layout: \"points\" | \"area\",\n baseline: number,\n xOrigin: number,\n ): number {\n if (hasCopyVisibleSamples(this.dataset)) {\n return this.dataset.copyVisibleSamples(viewport, target, maxPoints, layout, baseline, xOrigin);\n }\n\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) - xOrigin;\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 copySampleRange(\n start: number,\n end: number,\n target: Float32Array,\n maxPoints: number,\n layout: \"points\" | \"area\",\n baseline: number,\n xOrigin: number,\n ): number {\n if (hasCopySamplesRange(this.dataset)) {\n return this.dataset.copySamplesRange(start, end, target, maxPoints, layout, baseline, xOrigin);\n }\n\n const floatsPerSample = layout === \"points\" ? 2 : 4;\n if (maxPoints <= 0 || target.length < maxPoints * floatsPerSample) return 0;\n\n const from = Math.max(0, Math.floor(start));\n const to = Math.min(this.dataset.length, Math.ceil(end));\n const count = Math.min(maxPoints, Math.max(0, to - from));\n for (let i = 0; i < count; i++) {\n const index = from + i;\n const x = this.dataset.getX(index) - xOrigin;\n const y = this.dataset.getY(index);\n if (layout === \"points\") {\n const offset = i * 2;\n target[offset] = x;\n target[offset + 1] = y;\n } else {\n const offset = i * 4;\n target[offset] = x;\n target[offset + 1] = baseline;\n target[offset + 2] = x;\n target[offset + 3] = y;\n }\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 xOrigin: number,\n ): number {\n if (hasCopyMinMaxSegments(this.dataset)) {\n return this.dataset.copyMinMaxSegments(viewport, target, maxSegments, layout, xOrigin);\n }\n\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)) - xOrigin;\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._useDatasetRangeMinMax && hasRangeMinMaxY(this.dataset)) {\n return this.dataset.rangeMinMaxY(start, end);\n }\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 queryRangeMinMax(start: number, length: number, pixelWidth: number): LODView {\n if (pixelWidth <= 0 || length <= 0 || !hasRangeMinMaxY(this.dataset)) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const samplesPerPixel = Math.max(1, length / pixelWidth);\n const level = Math.max(0, Math.ceil(Math.log2(samplesPerPixel)) - 1);\n const bucketSampleWidth = 2 ** (level + 1);\n const queryStart = Math.max(0, start);\n const queryEnd = queryStart + length;\n const maxBucketCount = Math.ceil(this.dataset.length / bucketSampleWidth);\n const bucketStart = Math.max(0, Math.floor(queryStart / bucketSampleWidth));\n const bucketEnd = Math.min(maxBucketCount, Math.ceil(queryEnd / bucketSampleWidth));\n const bucketCount = Math.max(0, bucketEnd - bucketStart);\n const buckets = new Float32Array(bucketCount * 2);\n\n for (let bucket = 0; bucket < bucketCount; bucket++) {\n const sourceBucket = bucketStart + bucket;\n const rangeStart = sourceBucket * bucketSampleWidth;\n const rangeEnd = Math.min(this.dataset.length, rangeStart + bucketSampleWidth);\n const range = this.dataset.rangeMinMaxY(rangeStart, rangeEnd);\n if (!range) continue;\n buckets[bucket * 2] = range.minY;\n buckets[bucket * 2 + 1] = range.maxY;\n }\n\n return { buckets, bucketCount, level, samplesPerPixel };\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","export function lowerBound(length: number, valueAt: (index: number) => number, value: number): number {\n let lo = 0;\n let hi = length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (valueAt(mid) < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nexport function upperBound(length: number, valueAt: (index: number) => number, value: number): number {\n let lo = 0;\n let hi = length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (valueAt(mid) <= value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n","import { lowerBound, upperBound } from \"./search.js\";\nimport type { TimeRange } from \"./types.js\";\n\nexport type RingBufferOverflow = \"wrap\" | \"drop-new\" | \"error\";\n\nexport interface RingBufferOptions {\n readonly overflow?: RingBufferOverflow;\n}\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 private readonly overflow: RingBufferOverflow;\n\n constructor(capacity: number, options: RingBufferOptions = {}) {\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.overflow = options.overflow ?? \"wrap\";\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 if (this._length >= this.capacity) {\n if (this.overflow === \"drop-new\") return;\n if (this.overflow === \"error\") throw new RangeError(\"RingBuffer capacity exceeded.\");\n }\n\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 requested = Math.min(x.length, y.length);\n if (requested <= 0) return;\n\n if (this.overflow !== \"wrap\") {\n const available = this.capacity - this._length;\n if (requested > available && this.overflow === \"error\") {\n throw new RangeError(\"RingBuffer capacity exceeded.\");\n }\n\n const n = Math.min(requested, available);\n if (n <= 0) return;\n this.appendNoWrap(x, y, 0, n);\n return;\n }\n\n if (requested >= this.capacity) {\n const sourceOffset = requested - 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 this.appendNoWrap(x, y, 0, requested);\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 return lowerBound(this._length, (index) => this.getX(index), x);\n }\n\n upperBoundX(x: number): number {\n return upperBound(this._length, (index) => this.getX(index), x);\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 appendNoWrap(x: ArrayLike<number>, y: ArrayLike<number>, sourceOffset: number, count: number): void {\n let nextSourceOffset = sourceOffset;\n let remaining = count;\n while (remaining > 0) {\n const chunkCount = Math.min(remaining, this.capacity - this._head);\n this.copyIntoPhysical(this._head, x, y, nextSourceOffset, chunkCount);\n this._head = (this._head + chunkCount) % this.capacity;\n this._length = Math.min(this.capacity, this._length + chunkCount);\n nextSourceOffset += chunkCount;\n remaining -= chunkCount;\n }\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 private xOrigin: number = 0;\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, floatCount: number = data.length): void {\n const count = Math.max(0, Math.min(floatCount, data.length));\n this.backend.updateBuffer(buffer, count === data.length ? data : data.subarray(0, count));\n }\n\n viewport(x: number, y: number, width: number, height: number): void {\n this.backend.viewport(x, y, width, height);\n }\n\n setXOrigin(origin: number): void {\n this.xOrigin = Number.isFinite(origin) ? origin : 0;\n }\n\n getWebGLContext(): WebGL2RenderingContext | null {\n return this.backend.getContext?.() ?? null;\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 drawClipLineStrip(positions: GpuBuffer, count: number, style: SeriesStyle): void {\n this.drawClipPrimitive(\"line_strip\", positions, count, style);\n }\n\n drawClipLines(positions: GpuBuffer, count: number, style: SeriesStyle): void {\n this.drawClipPrimitive(\"lines\", positions, count, style);\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 drawPoints(\n positions: GpuBuffer,\n pointCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n canvasWidth: number,\n canvasHeight: number,\n ): void {\n if (this.supportsInstancedPoints) {\n this.drawPointsInstanced(positions, pointCount, style, camera, canvasWidth, canvasHeight);\n } else {\n this.drawPointSprites(positions, pointCount, style, camera);\n }\n }\n\n private 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 private 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 drawClipPrimitive(primitive: \"lines\" | \"line_strip\" | \"triangles\" | \"triangle_strip\", positions: GpuBuffer, count: number, style: SeriesStyle): void {\n this.scaleUniform[0] = 1;\n this.scaleUniform[1] = 1;\n this.offsetUniform[0] = 0;\n this.offsetUniform[1] = 0;\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 const shiftedXMin = camera.xMin - this.xOrigin;\n const shiftedXMax = camera.xMax - this.xOrigin;\n this.scaleUniform[0] = camera.xScale;\n this.scaleUniform[1] = camera.yScale;\n this.offsetUniform[0] = -(shiftedXMin + shiftedXMax) / (shiftedXMax - shiftedXMin);\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 backend's viewport API intentionally maps to a scissor box for plot clipping,\n // but regl must still be polled after canvas resizes so its full-drawing-buffer GL\n // viewport matches the new backing store. Otherwise WebGL content is rasterized with\n // stale dimensions while DOM hover markers use the current CSS rect.\n this.regl.poll();\n this.scissorBox = { x, y, w, h };\n }\n\n getContext(): WebGL2RenderingContext {\n return this.gl;\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 { 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 type AxisRenderTarget = \"x\" | \"y\";\nexport type BuiltInAxisScale = \"linear\" | \"time\" | \"log\" | \"symlog\" | \"categorical\";\n\nexport interface CustomAxisScale {\n readonly type: \"custom\";\n ticks?(min: number, max: number, maxTicks: number): readonly number[];\n formatTick?(value: number, axis: AxisRenderTarget): string;\n toScreen?(value: number): number;\n fromScreen?(value: number): number;\n}\n\nexport type AxisScale = BuiltInAxisScale | CustomAxisScale;\nexport type AxisTimeZone = \"local\" | \"utc\";\nexport type AxisTickFormatter = (value: number, axis: AxisRenderTarget) => string;\nexport type AxisTickFormat = string | AxisTickFormatter;\n\nexport interface AxisControllerAxisOptions {\n readonly scale?: AxisScale;\n readonly tickFormat?: AxisTickFormat;\n readonly timezone?: AxisTimeZone;\n readonly logBase?: number;\n readonly symlogConstant?: number;\n readonly categories?: readonly string[];\n}\n\nexport interface AxisControllerOptions {\n readonly x?: AxisControllerAxisOptions;\n readonly y?: AxisControllerAxisOptions;\n}\n\ntype TimeUnit = \"millisecond\" | \"second\" | \"minute\" | \"hour\" | \"day\" | \"month\" | \"year\";\n\ninterface TimeInterval {\n readonly unit: TimeUnit;\n readonly count: number;\n readonly approxMs: number;\n}\n\nconst SECOND = 1_000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst MONTH = 30 * DAY;\nconst YEAR = 365 * DAY;\n\nconst TIME_INTERVALS: readonly TimeInterval[] = [\n { unit: \"millisecond\", count: 1, approxMs: 1 },\n { unit: \"millisecond\", count: 5, approxMs: 5 },\n { unit: \"millisecond\", count: 10, approxMs: 10 },\n { unit: \"millisecond\", count: 50, approxMs: 50 },\n { unit: \"millisecond\", count: 100, approxMs: 100 },\n { unit: \"millisecond\", count: 250, approxMs: 250 },\n { unit: \"millisecond\", count: 500, approxMs: 500 },\n { unit: \"second\", count: 1, approxMs: SECOND },\n { unit: \"second\", count: 5, approxMs: 5 * SECOND },\n { unit: \"second\", count: 15, approxMs: 15 * SECOND },\n { unit: \"second\", count: 30, approxMs: 30 * SECOND },\n { unit: \"minute\", count: 1, approxMs: MINUTE },\n { unit: \"minute\", count: 5, approxMs: 5 * MINUTE },\n { unit: \"minute\", count: 15, approxMs: 15 * MINUTE },\n { unit: \"minute\", count: 30, approxMs: 30 * MINUTE },\n { unit: \"hour\", count: 1, approxMs: HOUR },\n { unit: \"hour\", count: 3, approxMs: 3 * HOUR },\n { unit: \"hour\", count: 6, approxMs: 6 * HOUR },\n { unit: \"hour\", count: 12, approxMs: 12 * HOUR },\n { unit: \"day\", count: 1, approxMs: DAY },\n { unit: \"day\", count: 2, approxMs: 2 * DAY },\n { unit: \"day\", count: 7, approxMs: 7 * DAY },\n { unit: \"month\", count: 1, approxMs: MONTH },\n { unit: \"month\", count: 3, approxMs: 3 * MONTH },\n { unit: \"month\", count: 6, approxMs: 6 * MONTH },\n { unit: \"year\", count: 1, approxMs: YEAR },\n { unit: \"year\", count: 2, approxMs: 2 * YEAR },\n { unit: \"year\", count: 5, approxMs: 5 * YEAR },\n { unit: \"year\", count: 10, approxMs: 10 * YEAR },\n];\n\nconst MONTH_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"] as const;\nconst MONTH_LONG = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"] as const;\nconst WEEKDAY_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"] as const;\nconst WEEKDAY_LONG = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"] as const;\n\nexport class AxisController {\n private options: AxisControllerOptions;\n private lastXTimeInterval: TimeInterval | null = null;\n private lastYTimeInterval: TimeInterval | null = null;\n\n constructor(private readonly camera: Camera2D, options: AxisControllerOptions = {}) {\n this.options = options;\n }\n\n setOptions(options: AxisControllerOptions): void {\n this.options = options;\n this.lastXTimeInterval = null;\n this.lastYTimeInterval = null;\n }\n\n getXTickValues(canvasWidth: number, maxTicks: number = 10, target: number[] = []): number[] {\n const axisOptions = this.options.x;\n if (axisOptions?.scale === \"time\") {\n const result = this.getTimeTickValues(this.camera.xMin, this.camera.xMax, canvasWidth, maxTicks, 80, target, axisOptions);\n this.lastXTimeInterval = this.lastTimeInterval;\n return result;\n }\n this.lastXTimeInterval = null;\n return this.getScaledTickValues(this.camera.xMin, this.camera.xMax, canvasWidth, maxTicks, 80, target, axisOptions, \"x\");\n }\n\n getYTickValues(canvasHeight: number, maxTicks: number = 10, target: number[] = []): number[] {\n const axisOptions = this.options.y;\n if (axisOptions?.scale === \"time\") {\n const result = this.getTimeTickValues(this.camera.yMin, this.camera.yMax, canvasHeight, maxTicks, 48, target, axisOptions);\n this.lastYTimeInterval = this.lastTimeInterval;\n return result;\n }\n this.lastYTimeInterval = null;\n return this.getScaledTickValues(this.camera.yMin, this.camera.yMax, canvasHeight, maxTicks, 48, target, axisOptions, \"y\");\n }\n\n formatValue(value: number, axis: AxisRenderTarget = \"y\"): string {\n const axisOptions = axis === \"x\" ? this.options.x : this.options.y;\n const tickFormat = axisOptions?.tickFormat;\n if (typeof tickFormat === \"function\") return tickFormat(value, axis);\n\n if (axisOptions?.scale && typeof axisOptions.scale === \"object\") {\n return axisOptions.scale.formatTick?.(value, axis) ?? this.formatLinearValue(value);\n }\n\n if (axisOptions?.scale === \"categorical\") {\n const index = Math.round(value);\n return axisOptions.categories?.[index] ?? String(index);\n }\n\n if (axisOptions?.scale === \"time\") {\n const interval = axis === \"x\" ? this.lastXTimeInterval : this.lastYTimeInterval;\n return this.formatTimeValue(value, tickFormat, axisOptions.timezone ?? \"local\", interval);\n }\n\n return this.formatLinearValue(value);\n }\n\n private lastTimeInterval: TimeInterval | null = null;\n\n private getScaledTickValues(\n min: number,\n max: number,\n pixelSize: number,\n maxTicks: number,\n minPixelSpacing: number,\n target: number[],\n options: AxisControllerAxisOptions | undefined,\n axis: AxisRenderTarget,\n ): number[] {\n const scale = options?.scale;\n if (scale && typeof scale === \"object\") {\n target.length = 0;\n const values = scale.ticks?.(min, max, maxTicks) ?? [];\n for (const value of values) target.push(value);\n return target;\n }\n if (scale === \"log\") return this.getLogTickValues(min, max, pixelSize, maxTicks, minPixelSpacing, target, options?.logBase);\n if (scale === \"categorical\") return this.getCategoricalTickValues(min, max, maxTicks, target, options?.categories);\n if (scale === \"symlog\") return this.getSymlogTickValues(min, max, pixelSize, maxTicks, minPixelSpacing, target, options?.symlogConstant);\n void axis;\n return this.getLinearTickValues(min, max, pixelSize, maxTicks, minPixelSpacing, target);\n }\n\n private getLogTickValues(min: number, max: number, pixelSize: number, maxTicks: number, minPixelSpacing: number, target: number[], base: number = 10): number[] {\n target.length = 0;\n const safeBase = Number.isFinite(base) && base > 1 ? base : 10;\n if (pixelSize <= 0 || maxTicks <= 0 || min <= 0 || max <= min) return target;\n const targetTicks = Math.max(2, Math.min(maxTicks, Math.floor(pixelSize / minPixelSpacing)));\n const firstExp = Math.floor(Math.log(min) / Math.log(safeBase));\n const lastExp = Math.ceil(Math.log(max) / Math.log(safeBase));\n const expStep = Math.max(1, Math.ceil((lastExp - firstExp) / Math.max(1, targetTicks - 1)));\n for (let exp = firstExp; exp <= lastExp && target.length < maxTicks + 2; exp += expStep) {\n const value = safeBase ** exp;\n if (value >= min / safeBase && value <= max * safeBase) target.push(value);\n }\n return target;\n }\n\n private getSymlogTickValues(min: number, max: number, pixelSize: number, maxTicks: number, minPixelSpacing: number, target: number[], constant: number = 1): number[] {\n const c = Number.isFinite(constant) && constant > 0 ? constant : 1;\n const transform = (value: number): number => Math.sign(value) * Math.log1p(Math.abs(value) / c);\n const inverse = (value: number): number => Math.sign(value) * c * Math.expm1(Math.abs(value));\n const scaled = this.getLinearTickValues(transform(min), transform(max), pixelSize, maxTicks, minPixelSpacing, target);\n for (let i = 0; i < scaled.length; i++) scaled[i] = this.normalizeTick(inverse(scaled[i]!), Math.abs(inverse(scaled[1] ?? scaled[0] ?? 1) - inverse(scaled[0] ?? 0)) || 1);\n return scaled;\n }\n\n private getCategoricalTickValues(min: number, max: number, maxTicks: number, target: number[], categories: readonly string[] | undefined): number[] {\n target.length = 0;\n const lower = Math.max(0, Math.ceil(min));\n const upper = Math.min(categories ? categories.length - 1 : Math.floor(max), Math.floor(max));\n if (upper < lower || maxTicks <= 0) return target;\n const step = Math.max(1, Math.ceil((upper - lower + 1) / maxTicks));\n for (let index = lower; index <= upper && target.length < maxTicks; index += step) target.push(index);\n return target;\n }\n\n private formatLinearValue(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 getLinearTickValues(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 getTimeTickValues(min: number, max: number, pixelSize: number, maxTicks: number, minPixelSpacing: number, target: number[], options: AxisControllerAxisOptions): number[] {\n target.length = 0;\n this.lastTimeInterval = null;\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 interval = this.chooseTimeInterval(range / (targetTicks - 1));\n const timezone = options.timezone ?? \"local\";\n this.lastTimeInterval = interval;\n\n let tick = this.floorTime(min, interval, timezone);\n let guard = 0;\n while (tick < min && guard < 4) {\n const next = this.advanceTime(tick, interval, timezone);\n if (next <= tick) break;\n tick = next;\n guard++;\n }\n\n const lowerBound = this.floorTime(min, interval, timezone);\n if (lowerBound < tick && target.length === 0) tick = lowerBound;\n\n for (let i = 0; i < maxTicks + 2 && tick <= max; i++) {\n target.push(tick);\n const next = this.advanceTime(tick, interval, timezone);\n if (next <= tick) break;\n tick = next;\n }\n\n if (target.length === 0) target.push(min, max);\n return target;\n }\n\n private chooseTimeInterval(rawStepMs: number): TimeInterval {\n for (const interval of TIME_INTERVALS) {\n if (interval.approxMs >= rawStepMs) return interval;\n }\n const years = Math.max(10, Math.ceil(rawStepMs / YEAR));\n const magnitude = 10 ** Math.floor(Math.log10(years));\n const normalized = years / magnitude;\n const count = normalized <= 1 ? magnitude : normalized <= 2 ? 2 * magnitude : normalized <= 5 ? 5 * magnitude : 10 * magnitude;\n return { unit: \"year\", count, approxMs: count * YEAR };\n }\n\n private floorTime(value: number, interval: TimeInterval, timezone: AxisTimeZone): number {\n if (!Number.isFinite(value)) return value;\n if (interval.unit === \"millisecond\") return Math.floor(value / interval.count) * interval.count;\n\n const date = new Date(value);\n const utc = timezone === \"utc\";\n const year = utc ? date.getUTCFullYear() : date.getFullYear();\n const month = utc ? date.getUTCMonth() : date.getMonth();\n const day = utc ? date.getUTCDate() : date.getDate();\n const hour = utc ? date.getUTCHours() : date.getHours();\n const minute = utc ? date.getUTCMinutes() : date.getMinutes();\n const second = utc ? date.getUTCSeconds() : date.getSeconds();\n\n switch (interval.unit) {\n case \"second\":\n return this.makeTime(timezone, year, month, day, hour, minute, Math.floor(second / interval.count) * interval.count, 0);\n case \"minute\":\n return this.makeTime(timezone, year, month, day, hour, Math.floor(minute / interval.count) * interval.count, 0, 0);\n case \"hour\":\n return this.makeTime(timezone, year, month, day, Math.floor(hour / interval.count) * interval.count, 0, 0, 0);\n case \"day\":\n return this.makeTime(timezone, year, month, Math.floor((day - 1) / interval.count) * interval.count + 1, 0, 0, 0, 0);\n case \"month\":\n return this.makeTime(timezone, year, Math.floor(month / interval.count) * interval.count, 1, 0, 0, 0, 0);\n case \"year\":\n return this.makeTime(timezone, Math.floor(year / interval.count) * interval.count, 0, 1, 0, 0, 0, 0);\n }\n }\n\n private advanceTime(value: number, interval: TimeInterval, timezone: AxisTimeZone): number {\n const date = new Date(value);\n const utc = timezone === \"utc\";\n switch (interval.unit) {\n case \"millisecond\":\n return value + interval.count;\n case \"second\":\n utc ? date.setUTCSeconds(date.getUTCSeconds() + interval.count) : date.setSeconds(date.getSeconds() + interval.count);\n return date.getTime();\n case \"minute\":\n utc ? date.setUTCMinutes(date.getUTCMinutes() + interval.count) : date.setMinutes(date.getMinutes() + interval.count);\n return date.getTime();\n case \"hour\":\n utc ? date.setUTCHours(date.getUTCHours() + interval.count) : date.setHours(date.getHours() + interval.count);\n return date.getTime();\n case \"day\":\n utc ? date.setUTCDate(date.getUTCDate() + interval.count) : date.setDate(date.getDate() + interval.count);\n return date.getTime();\n case \"month\":\n utc ? date.setUTCMonth(date.getUTCMonth() + interval.count) : date.setMonth(date.getMonth() + interval.count);\n return date.getTime();\n case \"year\":\n utc ? date.setUTCFullYear(date.getUTCFullYear() + interval.count) : date.setFullYear(date.getFullYear() + interval.count);\n return date.getTime();\n }\n }\n\n private makeTime(timezone: AxisTimeZone, year: number, month: number, day: number, hour: number, minute: number, second: number, millisecond: number): number {\n return timezone === \"utc\"\n ? Date.UTC(year, month, day, hour, minute, second, millisecond)\n : new Date(year, month, day, hour, minute, second, millisecond).getTime();\n }\n\n private formatTimeValue(value: number, tickFormat: string | undefined, timezone: AxisTimeZone, interval: TimeInterval | null): string {\n const date = new Date(value);\n if (tickFormat) return this.formatTimePattern(date, tickFormat, timezone);\n\n const approxMs = interval?.approxMs ?? 0;\n if (approxMs > 0 && approxMs < SECOND) return this.formatTimePattern(date, \"%H:%M:%S.%L\", timezone);\n if (approxMs > 0 && approxMs < DAY) return this.formatTimePattern(date, \"%H:%M:%S\", timezone);\n if (approxMs > 0 && approxMs < YEAR) return this.formatTimePattern(date, \"%b %d\", timezone);\n return this.formatTimePattern(date, \"%Y\", timezone);\n }\n\n private formatTimePattern(date: Date, pattern: string, timezone: AxisTimeZone): string {\n const utc = timezone === \"utc\";\n const year = utc ? date.getUTCFullYear() : date.getFullYear();\n const month = utc ? date.getUTCMonth() : date.getMonth();\n const day = utc ? date.getUTCDate() : date.getDate();\n const weekday = utc ? date.getUTCDay() : date.getDay();\n const hour = utc ? date.getUTCHours() : date.getHours();\n const minute = utc ? date.getUTCMinutes() : date.getMinutes();\n const second = utc ? date.getUTCSeconds() : date.getSeconds();\n const millisecond = utc ? date.getUTCMilliseconds() : date.getMilliseconds();\n\n return pattern.replace(/%[YymdbBaAHMSL%]/g, (token) => {\n switch (token) {\n case \"%Y\": return String(year).padStart(4, \"0\");\n case \"%y\": return String(year % 100).padStart(2, \"0\");\n case \"%m\": return String(month + 1).padStart(2, \"0\");\n case \"%d\": return String(day).padStart(2, \"0\");\n case \"%b\": return MONTH_SHORT[month] ?? \"\";\n case \"%B\": return MONTH_LONG[month] ?? \"\";\n case \"%a\": return WEEKDAY_SHORT[weekday] ?? \"\";\n case \"%A\": return WEEKDAY_LONG[weekday] ?? \"\";\n case \"%H\": return String(hour).padStart(2, \"0\");\n case \"%M\": return String(minute).padStart(2, \"0\");\n case \"%S\": return String(second).padStart(2, \"0\");\n case \"%L\": return String(millisecond).padStart(3, \"0\");\n case \"%%\": return \"%\";\n default: return token;\n }\n });\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\ntype RenderAxis = \"x\" | \"y\" | \"y2\";\n\nexport class AxisOverlay {\n private xPool: HTMLDivElement[] = [];\n private yPool: HTMLDivElement[] = [];\n private y2Pool: HTMLDivElement[] = [];\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n private readonly y2Ticks: number[] = [];\n\n constructor(\n private readonly layout: ChartLayoutElements,\n private readonly config: AxisOverlayConfig,\n private options: AxisOverlayOptions = {},\n ) {}\n\n setOptions(options: AxisOverlayOptions): void {\n this.options = options;\n for (const el of [...this.xPool, ...this.yPool, ...this.y2Pool]) {\n el.style.font = this.options.font ?? \"11px ui-monospace, monospace, sans-serif\";\n el.style.color = this.options.color ?? \"#bfd6ff\";\n }\n }\n\n update(camera: Camera2D, axis: AxisController, rightCamera: Camera2D = camera, rightAxis: AxisController = axis): 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 if (this.config.y2.visible) {\n rightAxis.getYTickValues(plotH, 8, this.y2Ticks);\n } else {\n this.y2Ticks.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 this.updateAxis(this.y2Pool, this.y2Ticks, \"y2\", rightCamera, plotW, plotH, rightAxis);\n }\n\n dispose(): void {\n for (const el of this.xPool) el.remove();\n for (const el of this.yPool) el.remove();\n for (const el of this.y2Pool) el.remove();\n this.xPool = [];\n this.yPool = [];\n this.y2Pool = [];\n }\n\n private parentForAxis(axis: RenderAxis): HTMLElement {\n if (axis === \"x\") {\n return this.config.x.position === \"outside\" ? this.layout.xAxis : this.layout.plot;\n }\n if (axis === \"y2\") {\n return this.config.y2.position === \"outside\" ? this.layout.y2Axis : 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: RenderAxis,\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, axis === \"x\" ? \"x\" : \"y\");\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 isRight = axis === \"y2\";\n const config = isRight ? this.config.y2 : this.config.y;\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 (config.position === \"outside\") {\n el.style.left = isRight ? \"4px\" : \"auto\";\n el.style.right = isRight ? \"auto\" : \"4px\";\n } else {\n el.style.left = isRight ? \"auto\" : \"4px\";\n el.style.right = isRight ? \"4px\" : \"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 readonly y2: 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 y2Axis: HTMLDivElement;\n readonly corner: HTMLDivElement;\n readonly cornerRight: HTMLDivElement;\n readonly title: HTMLDivElement;\n readonly subtitle: HTMLDivElement;\n readonly xAxisTitle: HTMLDivElement;\n readonly yAxisTitle: HTMLDivElement;\n readonly y2AxisTitle: HTMLDivElement;\n}\n\nexport const LEFT_AXIS_GUTTER_CSS = 52;\nexport const RIGHT_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 y2Axis: HTMLDivElement;\n readonly corner: HTMLDivElement;\n readonly cornerRight: HTMLDivElement;\n readonly title: HTMLDivElement;\n readonly subtitle: HTMLDivElement;\n readonly xAxisTitle: HTMLDivElement;\n readonly yAxisTitle: HTMLDivElement;\n readonly y2AxisTitle: 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.y2Axis = document.createElement(\"div\");\n this.corner = document.createElement(\"div\");\n this.cornerRight = document.createElement(\"div\");\n this.title = document.createElement(\"div\");\n this.subtitle = document.createElement(\"div\");\n this.xAxisTitle = document.createElement(\"div\");\n this.yAxisTitle = document.createElement(\"div\");\n this.y2AxisTitle = 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.y2Axis.className = \"blazeplot-axis blazeplot-axis-y2\";\n this.corner.className = \"blazeplot-axis-corner\";\n this.cornerRight.className = \"blazeplot-axis-corner blazeplot-axis-corner-right\";\n this.title.className = \"blazeplot-title\";\n this.subtitle.className = \"blazeplot-subtitle\";\n this.xAxisTitle.className = \"blazeplot-axis-title blazeplot-axis-title-x\";\n this.yAxisTitle.className = \"blazeplot-axis-title blazeplot-axis-title-y\";\n this.y2AxisTitle.className = \"blazeplot-axis-title blazeplot-axis-title-y2\";\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 hasOutsideY2 = config.y2.visible && config.y2.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) ${hasOutsideY2 ? RIGHT_AXIS_GUTTER_CSS : 0}px`;\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.y2Axis.style.display = hasOutsideY2 ? \"block\" : \"none\";\n this.xAxis.style.display = hasOutsideX ? \"block\" : \"none\";\n this.corner.style.display = hasOutsideX && hasOutsideY ? \"block\" : \"none\";\n this.cornerRight.style.display = hasOutsideX && hasOutsideY2 ? \"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.y2Axis);\n this.root.appendChild(this.corner);\n this.root.appendChild(this.xAxis);\n this.root.appendChild(this.cornerRight);\n this.root.appendChild(this.title);\n this.root.appendChild(this.subtitle);\n this.root.appendChild(this.xAxisTitle);\n this.root.appendChild(this.yAxisTitle);\n this.root.appendChild(this.y2AxisTitle);\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 this.root.style.boxSizing = \"border-box\";\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.y2Axis.style.position = \"relative\";\n this.y2Axis.style.gridColumn = \"3\";\n this.y2Axis.style.gridRow = \"1\";\n this.y2Axis.style.minWidth = \"0\";\n this.y2Axis.style.minHeight = \"0\";\n this.y2Axis.style.overflow = \"hidden\";\n this.y2Axis.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 this.cornerRight.style.gridColumn = \"3\";\n this.cornerRight.style.gridRow = \"2\";\n this.cornerRight.style.minWidth = \"0\";\n this.cornerRight.style.minHeight = \"0\";\n this.cornerRight.style.pointerEvents = \"none\";\n\n for (const el of [this.title, this.subtitle, this.xAxisTitle, this.yAxisTitle, this.y2AxisTitle]) {\n el.style.position = \"absolute\";\n el.style.pointerEvents = \"none\";\n el.style.userSelect = \"none\";\n el.style.whiteSpace = \"nowrap\";\n el.style.zIndex = \"18\";\n el.style.display = \"none\";\n }\n\n this.title.style.top = \"6px\";\n this.title.style.left = \"50%\";\n this.title.style.transform = \"translateX(-50%)\";\n this.title.style.textAlign = \"center\";\n\n this.subtitle.style.top = \"26px\";\n this.subtitle.style.left = \"50%\";\n this.subtitle.style.transform = \"translateX(-50%)\";\n this.subtitle.style.textAlign = \"center\";\n\n this.xAxisTitle.style.left = \"50%\";\n this.xAxisTitle.style.bottom = \"4px\";\n this.xAxisTitle.style.transform = \"translateX(-50%)\";\n this.xAxisTitle.style.textAlign = \"center\";\n\n this.yAxisTitle.style.left = \"4px\";\n this.yAxisTitle.style.top = \"50%\";\n this.yAxisTitle.style.transform = \"translateY(-50%) rotate(-90deg)\";\n this.yAxisTitle.style.transformOrigin = \"left center\";\n\n this.y2AxisTitle.style.right = \"4px\";\n this.y2AxisTitle.style.top = \"50%\";\n this.y2AxisTitle.style.transform = \"translateY(-50%) rotate(90deg)\";\n this.y2AxisTitle.style.transformOrigin = \"right center\";\n }\n}\n","export type RgbaColor = readonly [number, number, number, number];\nexport type CssColor = string;\nexport type ThemeColor = RgbaColor | CssColor;\n\nexport interface ChartTheme {\n readonly backgroundColor?: ThemeColor;\n readonly gridColor?: ThemeColor;\n readonly axisColor?: string;\n readonly axisFont?: string;\n readonly seriesColors?: readonly ThemeColor[];\n readonly tooltipBackgroundColor?: string;\n readonly tooltipTextColor?: string;\n readonly tooltipFont?: string;\n readonly legendBackgroundColor?: string;\n readonly legendBorderColor?: string;\n readonly legendTextColor?: string;\n readonly legendMutedTextColor?: string;\n readonly legendFont?: string;\n readonly titleColor?: string;\n readonly titleFont?: string;\n readonly subtitleColor?: string;\n readonly subtitleFont?: string;\n readonly axisTitleColor?: string;\n readonly axisTitleFont?: string;\n}\n\nexport interface ResolvedChartTheme {\n readonly backgroundColor: RgbaColor;\n readonly backgroundCssColor: string;\n readonly gridColor: RgbaColor;\n readonly axisColor: string;\n readonly axisFont: string;\n readonly seriesColors: readonly RgbaColor[];\n readonly tooltipBackgroundColor: string;\n readonly tooltipTextColor: string;\n readonly tooltipFont: string;\n readonly legendBackgroundColor: string;\n readonly legendBorderColor: string;\n readonly legendTextColor: string;\n readonly legendMutedTextColor: string;\n readonly legendFont: string;\n readonly titleColor: string;\n readonly titleFont: string;\n readonly subtitleColor: string;\n readonly subtitleFont: string;\n readonly axisTitleColor: string;\n readonly axisTitleFont: string;\n}\n\nconst DEFAULT_SERIES_COLORS: readonly RgbaColor[] = [\n [0.3, 0.6, 1.0, 1.0],\n [0.95, 0.35, 0.35, 1.0],\n [0.2, 0.8, 0.4, 0.9],\n [0.95, 0.72, 0.25, 1.0],\n [0.72, 0.45, 0.95, 1.0],\n [0.25, 0.85, 0.95, 1.0],\n];\n\nexport const DEFAULT_CHART_THEME: ResolvedChartTheme = {\n backgroundColor: [0.02, 0.02, 0.02, 1],\n backgroundCssColor: \"rgba(5, 5, 5, 1)\",\n gridColor: [0.22, 0.22, 0.22, 0.45],\n axisColor: \"#d4d4d4\",\n axisFont: \"11px ui-monospace, monospace, sans-serif\",\n seriesColors: DEFAULT_SERIES_COLORS,\n tooltipBackgroundColor: \"rgba(10, 10, 10, 0.88)\",\n tooltipTextColor: \"#e5e5e5\",\n tooltipFont: \"11px/1.35 ui-monospace, monospace\",\n legendBackgroundColor: \"rgba(10, 10, 10, 0.88)\",\n legendBorderColor: \"transparent\",\n legendTextColor: \"#e5e5e5\",\n legendMutedTextColor: \"#888\",\n legendFont: \"11px/1.35 ui-monospace, monospace\",\n titleColor: \"#f8fafc\",\n titleFont: \"600 14px system-ui, sans-serif\",\n subtitleColor: \"#cbd5e1\",\n subtitleFont: \"12px system-ui, sans-serif\",\n axisTitleColor: \"#d4d4d4\",\n axisTitleFont: \"12px system-ui, sans-serif\",\n};\n\nexport function resolveChartTheme(theme: ChartTheme | undefined, context?: Element): ResolvedChartTheme {\n if (!theme) return DEFAULT_CHART_THEME;\n\n const backgroundColor = resolveThemeColor(theme.backgroundColor, DEFAULT_CHART_THEME.backgroundColor, context);\n const seriesColors = theme.seriesColors?.length\n ? theme.seriesColors.map((color, index) => resolveThemeColor(\n color,\n DEFAULT_CHART_THEME.seriesColors[index % DEFAULT_CHART_THEME.seriesColors.length]!,\n context,\n ))\n : DEFAULT_CHART_THEME.seriesColors;\n\n return {\n backgroundColor,\n backgroundCssColor: themeColorToCss(theme.backgroundColor, DEFAULT_CHART_THEME.backgroundCssColor),\n gridColor: resolveThemeColor(theme.gridColor, DEFAULT_CHART_THEME.gridColor, context),\n axisColor: theme.axisColor ?? DEFAULT_CHART_THEME.axisColor,\n axisFont: theme.axisFont ?? DEFAULT_CHART_THEME.axisFont,\n seriesColors,\n tooltipBackgroundColor: theme.tooltipBackgroundColor ?? DEFAULT_CHART_THEME.tooltipBackgroundColor,\n tooltipTextColor: theme.tooltipTextColor ?? DEFAULT_CHART_THEME.tooltipTextColor,\n tooltipFont: theme.tooltipFont ?? DEFAULT_CHART_THEME.tooltipFont,\n legendBackgroundColor: theme.legendBackgroundColor ?? DEFAULT_CHART_THEME.legendBackgroundColor,\n legendBorderColor: theme.legendBorderColor ?? DEFAULT_CHART_THEME.legendBorderColor,\n legendTextColor: theme.legendTextColor ?? DEFAULT_CHART_THEME.legendTextColor,\n legendMutedTextColor: theme.legendMutedTextColor ?? DEFAULT_CHART_THEME.legendMutedTextColor,\n legendFont: theme.legendFont ?? DEFAULT_CHART_THEME.legendFont,\n titleColor: theme.titleColor ?? DEFAULT_CHART_THEME.titleColor,\n titleFont: theme.titleFont ?? DEFAULT_CHART_THEME.titleFont,\n subtitleColor: theme.subtitleColor ?? DEFAULT_CHART_THEME.subtitleColor,\n subtitleFont: theme.subtitleFont ?? DEFAULT_CHART_THEME.subtitleFont,\n axisTitleColor: theme.axisTitleColor ?? DEFAULT_CHART_THEME.axisTitleColor,\n axisTitleFont: theme.axisTitleFont ?? DEFAULT_CHART_THEME.axisTitleFont,\n };\n}\n\nexport function resolveThemeColor(color: ThemeColor | undefined, fallback: RgbaColor, context?: Element): RgbaColor {\n if (!color) return fallback;\n if (typeof color !== \"string\") return color;\n\n const resolved = resolveCssColor(color, context);\n const normalized = normalizeCanvasColor(resolved ?? color, context);\n return parseCssColor(resolved ?? color) ?? parseCssColor(normalized ?? \"\") ?? fallback;\n}\n\nexport function themeColorToCss(color: ThemeColor | undefined, fallback: string): string {\n if (!color) return fallback;\n return typeof color === \"string\" ? color : rgbaCss(color);\n}\n\nexport function rgbaCss(color: RgbaColor): string {\n return `rgba(${Math.round(color[0] * 255)}, ${Math.round(color[1] * 255)}, ${Math.round(color[2] * 255)}, ${color[3]})`;\n}\n\nexport function resolveCssColor(color: string, context?: Element): string | null {\n const doc = context?.ownerDocument ?? globalThis.document;\n if (!doc?.documentElement || typeof getComputedStyle === \"undefined\") return null;\n\n const parent = context instanceof HTMLElement ? context : doc.documentElement;\n const el = doc.createElement(\"span\");\n el.style.position = \"absolute\";\n el.style.visibility = \"hidden\";\n el.style.pointerEvents = \"none\";\n el.style.color = color;\n parent.appendChild(el);\n\n const resolved = getComputedStyle(el).color;\n el.remove();\n return resolved || null;\n}\n\nfunction parseCssColor(color: string): RgbaColor | null {\n const trimmed = color.trim();\n return parseRgbColor(trimmed) ?? parseSrgbColor(trimmed) ?? parseHexColor(trimmed);\n}\n\nfunction normalizeCanvasColor(color: string, context?: Element): string | null {\n const doc = context?.ownerDocument ?? globalThis.document;\n if (!doc?.createElement) return null;\n\n const canvas = doc.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n\n const sentinel = \"#010203\";\n ctx.fillStyle = sentinel;\n ctx.fillStyle = color;\n const normalized = String(ctx.fillStyle);\n return normalized === sentinel ? null : normalized;\n}\n\nfunction parseRgbColor(color: string): RgbaColor | null {\n const match = color.match(/^rgba?\\((.*)\\)$/i);\n if (!match) return null;\n\n const body = match[1]!.trim();\n const slashParts = body.split(\"/\").map((part) => part.trim());\n const rgbPart = slashParts[0]!;\n const alphaPart = slashParts[1];\n const rgb = rgbPart.includes(\",\")\n ? rgbPart.split(\",\").map((part) => part.trim()).filter(Boolean)\n : rgbPart.split(/\\s+/).filter(Boolean);\n\n if (rgb.length < 3) return null;\n const r = parseRgbChannel(rgb[0]!);\n const g = parseRgbChannel(rgb[1]!);\n const b = parseRgbChannel(rgb[2]!);\n const a = parseAlpha(alphaPart ?? (rgb.length > 3 ? rgb[3]! : undefined));\n if (r === null || g === null || b === null || a === null) return null;\n return [r, g, b, a];\n}\n\nfunction parseSrgbColor(color: string): RgbaColor | null {\n const match = color.match(/^color\\(\\s*srgb\\s+(.+)\\)$/i);\n if (!match) return null;\n\n const parts = match[1]!.split(\"/\").map((part) => part.trim());\n const channels = parts[0]!.split(/\\s+/).filter(Boolean);\n if (channels.length < 3) return null;\n\n const r = parseUnitChannel(channels[0]!);\n const g = parseUnitChannel(channels[1]!);\n const b = parseUnitChannel(channels[2]!);\n const a = parseAlpha(parts[1]);\n if (r === null || g === null || b === null || a === null) return null;\n return [r, g, b, a];\n}\n\nfunction parseHexColor(color: string): RgbaColor | null {\n const value = color.startsWith(\"#\") ? color.slice(1) : \"\";\n if (![3, 4, 6, 8].includes(value.length) || !/^[\\da-f]+$/i.test(value)) return null;\n\n const expanded = value.length <= 4\n ? [...value].map((char) => char + char).join(\"\")\n : value;\n const parsed = Number.parseInt(expanded, 16);\n if (!Number.isFinite(parsed)) return null;\n\n const r = ((parsed >> (expanded.length === 8 ? 24 : 16)) & 255) / 255;\n const g = ((parsed >> (expanded.length === 8 ? 16 : 8)) & 255) / 255;\n const b = ((parsed >> (expanded.length === 8 ? 8 : 0)) & 255) / 255;\n const a = expanded.length === 8 ? (parsed & 255) / 255 : 1;\n return [r, g, b, a];\n}\n\nfunction parseRgbChannel(value: string): number | null {\n if (value.endsWith(\"%\")) return clamp01(Number.parseFloat(value) / 100);\n return clamp01(Number.parseFloat(value) / 255);\n}\n\nfunction parseUnitChannel(value: string): number | null {\n if (value.endsWith(\"%\")) return clamp01(Number.parseFloat(value) / 100);\n return clamp01(Number.parseFloat(value));\n}\n\nfunction parseAlpha(value: string | undefined): number | null {\n if (!value) return 1;\n if (value.endsWith(\"%\")) return clamp01(Number.parseFloat(value) / 100);\n return clamp01(Number.parseFloat(value));\n}\n\nfunction clamp01(value: number): number | null {\n if (!Number.isFinite(value)) return null;\n return Math.min(1, Math.max(0, value));\n}\n","import type { SeriesConfig, SeriesStyle, Dataset, SeriesMode, SeriesSample, SeriesYAxis, Viewport } 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 { Camera2D } from \"../interaction/Camera2D.js\";\nimport { AxisController } from \"../interaction/AxisController.js\";\nimport type { AxisControllerAxisOptions, AxisScale, AxisTickFormat, AxisTimeZone } from \"../interaction/AxisController.js\";\nimport type { PanIntent, ViewportPolicy, ZoomIntent } from \"../interaction/types.js\";\nimport { AxisOverlay } from \"./AxisOverlay.js\";\nimport { ChartLayout } from \"./ChartLayout.js\";\nimport type { AxisPosition, NormalizedAxisConfig } from \"./ChartLayout.js\";\nimport { resolveChartTheme, rgbaCss } from \"./theme.js\";\nimport type { ChartTheme, ResolvedChartTheme } from \"./theme.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_TRIANGLE_CAPACITY = 4_096;\nconst FLOATS_PER_BAR_TRIANGLE = 12;\nconst FLOATS_PER_OHLC_CANDLE = 12;\nconst FLOATS_PER_OHLC_TUPLE = 5;\nconst GRID_LINE_VERTEX_CAPACITY = 64;\nconst DEFAULT_POINT_SIZE_PX = 4;\nconst MAX_EXACT_SCATTER_POINTS = RAW_LINE_VERTEX_CAPACITY * 4;\n\nexport interface TextOverlayConfig {\n readonly text: string;\n readonly visible?: boolean;\n readonly color?: string;\n readonly font?: string;\n readonly offsetX?: number;\n readonly offsetY?: number;\n}\n\nexport interface AxisTitleConfig extends TextOverlayConfig {}\n\nexport interface ChartTitleConfig extends TextOverlayConfig {\n readonly align?: \"left\" | \"center\" | \"right\";\n}\n\nexport interface AxisConfig extends AxisControllerAxisOptions {\n readonly visible?: boolean;\n readonly position?: AxisPosition;\n readonly scale?: AxisScale;\n readonly tickFormat?: AxisTickFormat;\n readonly timezone?: AxisTimeZone;\n readonly title?: string | AxisTitleConfig;\n}\n\nexport type ChartPickMode = \"nearest-x\" | \"nearest-point\";\nexport type ChartPickGroup = \"x\" | \"none\";\n\nexport interface ChartPickOptions {\n readonly mode?: ChartPickMode;\n readonly group?: ChartPickGroup;\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; y2?: boolean | AxisConfig };\n readonly title?: string | ChartTitleConfig;\n readonly subtitle?: string | ChartTitleConfig;\n readonly hover?: ChartPickOptions;\n readonly plugins?: readonly ChartPlugin[];\n readonly theme?: ChartTheme;\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 readonly yAxis: SeriesYAxis;\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 type ChartPointerEventType = \"click\" | \"dblclick\" | \"pointerdown\" | \"pointerup\" | \"pointermove\";\n\nexport interface ChartPointerEventState {\n readonly type: ChartPointerEventType;\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 button: number;\n readonly buttons: number;\n readonly altKey: boolean;\n readonly ctrlKey: boolean;\n readonly metaKey: boolean;\n readonly shiftKey: boolean;\n readonly items: readonly ChartPickItem[];\n}\n\nexport interface ChartSeriesClickEvent extends ChartPointerEventState {\n readonly item: ChartPickItem;\n}\n\nexport interface ChartViewportChangeEvent {\n readonly viewport: Viewport;\n readonly rightViewport: Viewport;\n}\n\nexport interface ChartSelectEvent<T = unknown> {\n readonly selection: T;\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 group: ChartPickGroup;\n readonly maxDistancePx: number;\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 ChartLayoutReservation {\n readonly top?: number;\n readonly right?: number;\n readonly bottom?: number;\n readonly left?: 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\ntype ResolvedAxisConfig = NormalizedAxisConfig & AxisControllerAxisOptions & { readonly title?: string | AxisTitleConfig };\n\ntype ResolvedAxesConfig = { x: ResolvedAxisConfig; y: ResolvedAxisConfig; y2: ResolvedAxisConfig };\n\nfunction normalizeAxisConfig(config: boolean | AxisConfig | undefined): ResolvedAxisConfig {\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 scale: config.scale,\n tickFormat: config.tickFormat,\n timezone: config.timezone,\n title: config.title,\n };\n}\n\nfunction normalizeAxesConfig(axes: ChartOptions[\"axes\"]): ResolvedAxesConfig {\n if (axes === false) {\n return {\n x: { visible: false, position: \"inside\" },\n y: { visible: false, position: \"inside\" },\n y2: { visible: false, position: \"inside\" },\n };\n }\n if (axes === true || axes === undefined) {\n return {\n x: { visible: true, position: \"inside\" },\n y: { visible: true, position: \"inside\" },\n y2: { visible: false, position: \"inside\" },\n };\n }\n return {\n x: normalizeAxisConfig(axes.x),\n y: normalizeAxisConfig(axes.y),\n y2: normalizeAxisConfig(axes.y2 ?? false),\n };\n}\n\nfunction textOverlayText(config: string | TextOverlayConfig | undefined): string {\n return typeof config === \"string\" ? config : config?.text ?? \"\";\n}\n\nfunction textOverlayVisible(config: string | TextOverlayConfig | undefined): boolean {\n return typeof config === \"string\" ? config.length > 0 : !!config && config.visible !== false && config.text.length > 0;\n}\n\nfunction textOverlayOffsetX(config: string | TextOverlayConfig | undefined): number {\n return typeof config === \"string\" ? 0 : config?.offsetX ?? 0;\n}\n\nfunction textOverlayOffsetY(config: string | TextOverlayConfig | undefined): number {\n return typeof config === \"string\" ? 0 : config?.offsetY ?? 0;\n}\n\ninterface PickCandidate {\n readonly sample: SeriesSample;\n readonly series: SeriesStore;\n readonly seriesIndex: number;\n}\n\nexport class Chart {\n private series: SeriesStore[] = [];\n private camera: Camera2D;\n private rightCamera: Camera2D;\n private axis: AxisController;\n private rightAxis: AxisController;\n private renderer: Renderer;\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: ResolvedAxesConfig;\n private resolvedTheme: ResolvedChartTheme;\n private _gridVisible: boolean;\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 readonly themeSubscribers = new Set<() => void>();\n private readonly renderSubscribers = new Set<(chart: Chart) => void>();\n private readonly layoutReservations = new Map<string, ChartLayoutReservation>();\n private readonly viewportSubscribers = new Set<(event: ChartViewportChangeEvent) => void>();\n private readonly selectSubscribers = new Set<(event: ChartSelectEvent) => void>();\n private readonly seriesClickSubscribers = new Set<(event: ChartSeriesClickEvent) => void>();\n private readonly pointerSubscribers: Record<ChartPointerEventType, Set<(event: ChartPointerEventState) => void>> = {\n click: new Set(),\n dblclick: new Set(),\n pointerdown: new Set(),\n pointerup: new Set(),\n pointermove: new Set(),\n };\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 currentXOrigin: number = 0;\n private _rafId: number = 0;\n private _hoverRafId: 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.scheduleHoverRefresh();\n if (this.pointerSubscribers.pointermove.size > 0) this.emitPointerEvent(\"pointermove\", event);\n };\n private readonly handlePointerDown = (event: PointerEvent): void => {\n this.emitPointerEvent(\"pointerdown\", event);\n };\n private readonly handlePointerUp = (event: PointerEvent): void => {\n this.emitPointerEvent(\"pointerup\", event);\n };\n private readonly handleClick = (event: MouseEvent): void => {\n const pointerEvent = this.emitPointerEvent(\"click\", event);\n const item = pointerEvent?.items[0];\n if (pointerEvent && item) this.emitSeriesClick({ ...pointerEvent, item });\n };\n private readonly handleDoubleClick = (event: MouseEvent): void => {\n this.emitPointerEvent(\"dblclick\", event);\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 this.resolvedTheme = resolveChartTheme(options.theme, target);\n this.normalizedAxes = normalizeAxesConfig(options.axes);\n this._gridVisible = options.grid !== false;\n\n this.layout = new ChartLayout(target, this.normalizedAxes);\n this.layout.root.style.background = this.resolvedTheme.backgroundCssColor;\n this.applyCanvasSize();\n this.camera = new Camera2D();\n this.rightCamera = new Camera2D();\n this.axis = new AxisController(this.camera, { x: this.normalizedAxes.x, y: this.normalizedAxes.y });\n this.rightAxis = new AxisController(this.rightCamera, { x: this.normalizedAxes.x, y: this.normalizedAxes.y2 });\n this.renderer = new Renderer(new ReglBackend(this.layout.canvas));\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_TRIANGLE_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 ?? this.resolvedTheme.gridColor,\n lineWidth: options.gridStyle?.lineWidth ?? 1,\n };\n\n if (this.normalizedAxes.x.visible || this.normalizedAxes.y.visible || this.normalizedAxes.y2.visible) {\n this.axisOverlay = new AxisOverlay(this.layout, this.normalizedAxes, {\n color: this.resolvedTheme.axisColor,\n font: this.resolvedTheme.axisFont,\n });\n }\n this.updateTextOverlays();\n\n this.canvas.addEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.addEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.addEventListener(\"click\", this.handleClick);\n this.canvas.addEventListener(\"dblclick\", this.handleDoubleClick);\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 get xAxisElement(): HTMLElement {\n return this.layout.xAxis;\n }\n\n get yAxisElement(): HTMLElement {\n return this.layout.yAxis;\n }\n\n get y2AxisElement(): HTMLElement {\n return this.layout.y2Axis;\n }\n\n get theme(): ResolvedChartTheme {\n return this.resolvedTheme;\n }\n\n getWebGLContext(): WebGL2RenderingContext | null {\n return this.renderer.getWebGLContext();\n }\n\n getCamera(yAxis: SeriesYAxis = \"left\"): Camera2D {\n return yAxis === \"right\" ? this.rightCamera : this.camera;\n }\n\n dataToPlot(x: number, y: number, yAxis: SeriesYAxis = \"left\"): [number, number] {\n const camera = this.getCamera(yAxis);\n const [clipX, clipY] = camera.toClip(x, y);\n return camera.toScreen(clipX, clipY, this.canvas.clientWidth, this.canvas.clientHeight);\n }\n\n clientToData(clientX: number, clientY: number, yAxis: SeriesYAxis = \"left\"): [number, number] | 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.getCamera(yAxis).viewport;\n return [\n viewport.xMin + (plotX / rect.width) * (viewport.xMax - viewport.xMin),\n viewport.yMax - (plotY / rect.height) * (viewport.yMax - viewport.yMin),\n ];\n }\n\n getViewport(yAxis: SeriesYAxis = \"left\"): Viewport {\n return this.getCamera(yAxis).viewport;\n }\n\n pan(intent: PanIntent): void {\n this.camera.pan(intent);\n this.syncRightCameraX();\n this.emitViewportChange();\n this.refreshHover();\n }\n\n zoom(intent: ZoomIntent): void {\n this.camera.zoom(intent);\n this.syncRightCameraX();\n this.emitViewportChange();\n this.refreshHover();\n }\n\n addSeries(config: SeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n if ((config.mode === \"ohlc\" || config.mode === \"candlestick\") && !config.dataset) {\n throw new TypeError(\"OHLC and candlestick series require an OhlcDataset.\");\n }\n const dataset: Dataset = config.dataset ?? this.createDefaultDataset(config);\n const palette = this.resolvedTheme.seriesColors;\n const paletteColor = palette[this.series.length % palette.length] ?? this.resolvedTheme.seriesColors[0]!;\n const color = style?.color ?? paletteColor;\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 tickWidth: style?.tickWidth ?? style?.barWidth ?? 0.8,\n upColor: style?.upColor ?? color,\n downColor: style?.downColor ?? style?.fillColor ?? [color[0], color[1], color[2], color[3] * 0.45],\n wickColor: style?.wickColor ?? color,\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 addOhlc(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n return this.addSeries({ ...config, mode: \"ohlc\" }, style);\n }\n\n addCandlestick(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n return this.addSeries({ ...config, mode: \"candlestick\" }, style);\n }\n\n private createDefaultDataset(config: SeriesConfig): Dataset {\n const { capacity } = config;\n if (typeof capacity !== \"number\" || !Number.isInteger(capacity) || capacity <= 0) {\n throw new TypeError(\"Series capacity must be a positive integer when no dataset is provided.\");\n }\n return new RingBuffer(capacity, { overflow: config.overflow });\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 yAxis: series.config.yAxis ?? \"left\",\n }));\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n this.camera.setViewport(v);\n this.rightCamera.setViewport(v);\n this.emitViewportChange();\n this.refreshHover();\n }\n\n setYViewport(yAxis: SeriesYAxis, v: { yMin?: number; yMax?: number }): void {\n this.getCamera(yAxis).setViewport(v);\n this.emitViewportChange();\n this.refreshHover();\n }\n\n resize(dpr: number = globalThis.devicePixelRatio): boolean {\n const resized = this.applyCanvasSize(dpr);\n if (resized) this.refreshHover();\n return resized;\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 setLayoutReservation(id: string, reservation: ChartLayoutReservation | null): void {\n if (reservation) {\n this.layoutReservations.set(id, reservation);\n } else {\n this.layoutReservations.delete(id);\n }\n this.applyLayoutReservations();\n this.resize();\n }\n\n subscribe(event: \"hover\", callback: (state: ChartHoverState | null) => void): () => void;\n subscribe(event: \"serieschange\", callback: () => void): () => void;\n subscribe(event: \"themechange\", callback: () => void): () => void;\n subscribe(event: \"render\", callback: (chart: Chart) => void): () => void;\n subscribe(event: \"viewportchange\", callback: (event: ChartViewportChangeEvent) => void): () => void;\n subscribe(event: \"select\", callback: (event: ChartSelectEvent) => void): () => void;\n subscribe(event: \"seriesclick\", callback: (event: ChartSeriesClickEvent) => void): () => void;\n subscribe(event: ChartPointerEventType, callback: (event: ChartPointerEventState) => void): () => void;\n subscribe(\n event: \"hover\" | \"serieschange\" | \"themechange\" | \"render\" | \"viewportchange\" | \"select\" | \"seriesclick\" | ChartPointerEventType,\n callback:\n | ((state: ChartHoverState | null) => void)\n | (() => void)\n | ((chart: Chart) => void)\n | ((event: ChartViewportChangeEvent) => void)\n | ((event: ChartSelectEvent) => void)\n | ((event: ChartSeriesClickEvent) => void)\n | ((event: ChartPointerEventState) => void),\n ): () => 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 if (event === \"themechange\") {\n const cb = callback as () => void;\n this.themeSubscribers.add(cb);\n return () => this.themeSubscribers.delete(cb);\n }\n\n if (event === \"render\") {\n const cb = callback as (chart: Chart) => void;\n this.renderSubscribers.add(cb);\n return () => this.renderSubscribers.delete(cb);\n }\n\n if (event === \"viewportchange\") {\n const cb = callback as (event: ChartViewportChangeEvent) => void;\n this.viewportSubscribers.add(cb);\n return () => this.viewportSubscribers.delete(cb);\n }\n\n if (event === \"select\") {\n const cb = callback as (event: ChartSelectEvent) => void;\n this.selectSubscribers.add(cb);\n return () => this.selectSubscribers.delete(cb);\n }\n\n if (event === \"seriesclick\") {\n const cb = callback as (event: ChartSeriesClickEvent) => void;\n this.seriesClickSubscribers.add(cb);\n return () => this.seriesClickSubscribers.delete(cb);\n }\n\n if (event in this.pointerSubscribers) {\n const cb = callback as (event: ChartPointerEventState) => void;\n this.pointerSubscribers[event as ChartPointerEventType].add(cb);\n return () => this.pointerSubscribers[event as ChartPointerEventType].delete(cb);\n }\n\n const cb = callback as () => void;\n this.seriesSubscribers.add(cb);\n return () => this.seriesSubscribers.delete(cb);\n }\n\n emitSelect(selection: unknown): void {\n const event: ChartSelectEvent = { selection };\n for (const callback of this.selectSubscribers) callback(event);\n }\n\n setTheme(theme?: ChartTheme): void {\n this.resolvedTheme = resolveChartTheme(theme, this.layout.root);\n this.applyTheme();\n this.emitThemeChange();\n this.refreshHover();\n }\n\n setGridVisible(visible: boolean): void {\n this._gridVisible = visible;\n }\n\n getGridVisible(): boolean {\n return this._gridVisible;\n }\n\n setAxes(axes: ChartOptions[\"axes\"]): void {\n this.normalizedAxes = normalizeAxesConfig(axes);\n this.axis.setOptions({ x: this.normalizedAxes.x, y: this.normalizedAxes.y });\n this.rightAxis.setOptions({ x: this.normalizedAxes.x, y: this.normalizedAxes.y2 });\n this.layout.update(this.normalizedAxes);\n this.axisOverlay?.dispose();\n this.axisOverlay = null;\n if (this.normalizedAxes.x.visible || this.normalizedAxes.y.visible || this.normalizedAxes.y2.visible) {\n this.axisOverlay = new AxisOverlay(this.layout, this.normalizedAxes, {\n color: this.resolvedTheme.axisColor,\n font: this.resolvedTheme.axisFont,\n });\n }\n this.updateTextOverlays();\n this.resize();\n this.refreshHover();\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 group = options.group ?? this.options.hover?.group ?? \"x\";\n const maxDistancePx = options.maxDistancePx ?? this.options.hover?.maxDistancePx ?? Infinity;\n const selected = mode === \"nearest-point\"\n ? this.findNearestPointCandidate(dataX, plotY, rect.width, rect.height, maxDistancePx)\n : this.findNearestXCandidate(dataX, rect.width, maxDistancePx);\n\n if (!selected) return null;\n\n const anchorX = selected.sample.x;\n const items = group === \"none\"\n ? [this.createPickItem(selected.sample, selected.series, selected.seriesIndex, clientX, clientY, rect)]\n : this.collectPickItems(anchorX, clientX, clientY, rect);\n return { clientX, clientY, plotX, plotY, dataX, dataY, anchorX, mode, group, maxDistancePx, 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 ctx.fillStyle = options.background ?? rgbaCss(this.resolvedTheme.backgroundColor);\n ctx.fillRect(0, 0, width, height);\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 this.syncRightCameraX();\n\n const [r, g, b, a] = this.resolvedTheme.backgroundColor;\n this.renderer.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.renderer.clear(r, g, b, a);\n\n const viewport = this.camera.viewport;\n this.currentXOrigin = viewport.xMin;\n this.renderer.setXOrigin(this.currentXOrigin);\n if (this._gridVisible) {\n const gridVertexCount = this.writeGridVertices(viewport);\n if (gridVertexCount > 0) {\n this.uploadGridData(gridVertexCount);\n this.renderer.drawClipLines(this.gridBuffer, gridVertexCount, this.gridStyle);\n this.stats.drawCalls++;\n }\n }\n\n for (const s of this.series) {\n if (!s.visible) continue;\n s.rebuildPyramid();\n this.drawSeries(s);\n }\n\n this.axisOverlay?.update(this.camera, this.axis, this.rightCamera, this.rightAxis);\n this.emitRender();\n\n this.stats.frameMs = performance.now() - frameStartedAt;\n if (this._hoverRafId !== 0) {\n cancelAnimationFrame(this._hoverRafId);\n this._hoverRafId = 0;\n }\n this.refreshHover();\n }\n\n dispose(): void {\n this.stop();\n this.resizeObserver?.disconnect();\n if (this._hoverRafId !== 0) cancelAnimationFrame(this._hoverRafId);\n this._hoverRafId = 0;\n this.canvas.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.removeEventListener(\"click\", this.handleClick);\n this.canvas.removeEventListener(\"dblclick\", this.handleDoubleClick);\n for (const dispose of this.pluginDisposers.splice(0)) dispose();\n this.axisOverlay?.dispose();\n this.renderer.dispose();\n this.layout.dispose();\n }\n\n private applyTheme(): void {\n this.layout.root.style.background = this.resolvedTheme.backgroundCssColor;\n if (this.options.gridStyle?.color === undefined) {\n this.gridStyle = { ...this.gridStyle, color: this.resolvedTheme.gridColor };\n }\n this.axisOverlay?.setOptions({\n color: this.resolvedTheme.axisColor,\n font: this.resolvedTheme.axisFont,\n });\n this.updateTextOverlays();\n }\n\n private updateTextOverlays(): void {\n this.applyChartTextOverlay(this.layout.title, this.options.title, {\n color: this.resolvedTheme.titleColor,\n font: this.resolvedTheme.titleFont,\n top: 6,\n });\n this.applyChartTextOverlay(this.layout.subtitle, this.options.subtitle, {\n color: this.resolvedTheme.subtitleColor,\n font: this.resolvedTheme.subtitleFont,\n top: 26,\n });\n this.applyAxisTitleOverlay(this.layout.xAxisTitle, this.normalizedAxes.x.title, \"x\");\n this.applyAxisTitleOverlay(this.layout.yAxisTitle, this.normalizedAxes.y.title, \"y\");\n this.applyAxisTitleOverlay(this.layout.y2AxisTitle, this.normalizedAxes.y2.title, \"y2\");\n }\n\n private applyChartTextOverlay(\n el: HTMLElement,\n config: string | ChartTitleConfig | undefined,\n defaults: { readonly color: string; readonly font: string; readonly top: number },\n ): void {\n const visible = textOverlayVisible(config);\n el.textContent = textOverlayText(config);\n el.style.display = visible ? \"block\" : \"none\";\n if (!visible) return;\n\n const align = typeof config === \"string\" ? \"center\" : config?.align ?? \"center\";\n el.style.color = typeof config === \"string\" ? defaults.color : config?.color ?? defaults.color;\n el.style.font = typeof config === \"string\" ? defaults.font : config?.font ?? defaults.font;\n el.style.top = `${defaults.top + textOverlayOffsetY(config)}px`;\n el.style.left = align === \"left\" ? `${8 + textOverlayOffsetX(config)}px` : align === \"right\" ? \"auto\" : `calc(50% + ${textOverlayOffsetX(config)}px)`;\n el.style.right = align === \"right\" ? `${8 - textOverlayOffsetX(config)}px` : \"auto\";\n el.style.transform = align === \"center\" ? \"translateX(-50%)\" : \"none\";\n el.style.textAlign = align;\n }\n\n private applyAxisTitleOverlay(el: HTMLElement, config: string | AxisTitleConfig | undefined, axis: \"x\" | \"y\" | \"y2\"): void {\n const visible = textOverlayVisible(config);\n el.textContent = textOverlayText(config);\n el.style.display = visible ? \"block\" : \"none\";\n if (!visible) return;\n\n el.style.color = typeof config === \"string\" ? this.resolvedTheme.axisTitleColor : config?.color ?? this.resolvedTheme.axisTitleColor;\n el.style.font = typeof config === \"string\" ? this.resolvedTheme.axisTitleFont : config?.font ?? this.resolvedTheme.axisTitleFont;\n if (axis === \"x\") {\n el.style.left = `calc(50% + ${textOverlayOffsetX(config)}px)`;\n el.style.bottom = `${4 - textOverlayOffsetY(config)}px`;\n el.style.transform = \"translateX(-50%)\";\n } else if (axis === \"y\") {\n el.style.left = `${4 + textOverlayOffsetX(config)}px`;\n el.style.top = `calc(50% + ${textOverlayOffsetY(config)}px)`;\n el.style.transform = \"translateY(-50%) rotate(-90deg)\";\n } else {\n el.style.right = `${4 - textOverlayOffsetX(config)}px`;\n el.style.top = `calc(50% + ${textOverlayOffsetY(config)}px)`;\n el.style.transform = \"translateY(-50%) rotate(90deg)\";\n }\n }\n\n private applyLayoutReservations(): void {\n let top = 0;\n let right = 0;\n let bottom = 0;\n let left = 0;\n for (const reservation of this.layoutReservations.values()) {\n top += Math.max(0, reservation.top ?? 0);\n right += Math.max(0, reservation.right ?? 0);\n bottom += Math.max(0, reservation.bottom ?? 0);\n left += Math.max(0, reservation.left ?? 0);\n }\n this.layout.root.style.padding = `${top}px ${right}px ${bottom}px ${left}px`;\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 cameraForSeries(series: SeriesStore): Camera2D {\n return series.config.yAxis === \"right\" ? this.rightCamera : this.camera;\n }\n\n private syncRightCameraX(): void {\n this.rightCamera.setViewport({ xMin: this.camera.xMin, xMax: this.camera.xMax });\n }\n\n private drawSeries(series: SeriesStore): void {\n const camera = this.cameraForSeries(series);\n const viewport = camera.viewport;\n switch (series.config.mode) {\n case \"area\":\n this.drawAreaSeries(series, viewport, camera);\n return;\n case \"bar\":\n this.drawBarSeries(series, viewport, camera);\n return;\n case \"ohlc\":\n this.drawOhlcSeries(series, viewport, camera);\n return;\n case \"candlestick\":\n this.drawCandlestickSeries(series, viewport, camera);\n return;\n case \"scatter\":\n this.drawScatterSeries(series, viewport, camera);\n return;\n default:\n this.drawLineSeries(series, viewport, camera);\n }\n }\n\n private drawLineSeries(series: SeriesStore, viewport: Viewport, camera: Camera2D): void {\n const visibleSamples = series.visibleSampleCount(viewport);\n const dense = series.hasLOD && visibleSamples > RAW_LINE_VERTEX_CAPACITY - 2;\n if (dense && this.renderer.supportsInstancedSegments) {\n const segmentCount = series.copyMinMaxInstanced(viewport, this.minMaxInstanceData, this.maxMinMaxSegments(), this.currentXOrigin);\n if (segmentCount <= 0) return;\n this.uploadMinMaxInstanceData(segmentCount);\n this.renderer.drawMinMaxSegmentsInstanced(this.minMaxInstanceBuffer, segmentCount, series.style, camera);\n this.recordDraw(\"minmax\", segmentCount * 2);\n return;\n }\n\n if (dense) {\n const count = series.copyMinMaxVisible(viewport, this.rawLineData, this.maxMinMaxSegments(), this.currentXOrigin);\n if (count < 2) return;\n this.uploadRawLineData(count);\n this.renderer.drawMinMaxSegments(this.rawLineBuffer, count, series.style, camera);\n this.recordDraw(\"minmax\", count);\n return;\n }\n\n const count = series.copyRawVisibleClipSpace(viewport, this.rawLineData, RAW_LINE_VERTEX_CAPACITY);\n if (count < 2) return;\n this.uploadRawLineData(count);\n this.renderer.drawClipLineStrip(this.rawLineBuffer, count, series.style);\n this.recordDraw(\"raw\", count);\n }\n\n private drawAreaSeries(series: SeriesStore, viewport: Viewport, camera: Camera2D): void {\n const range = series.visibleIndexRange(viewport, 1);\n if (range.end - range.start < 2) return;\n\n const baseline = series.style.baseline ?? 0;\n if (range.end - range.start > AREA_POINT_CAPACITY) {\n const areaVertexCount = series.copyAreaVisible(viewport, this.rawLineData, AREA_POINT_CAPACITY, baseline, this.currentXOrigin);\n if (areaVertexCount >= 4) {\n this.uploadRawLineData(areaVertexCount);\n this.renderer.drawAreaStrip(this.rawLineBuffer, areaVertexCount, series.style, camera);\n this.recordDraw(\"area\", areaVertexCount);\n }\n\n const lineVertexCount = series.copyRawVisible(viewport, this.rawLineData, AREA_POINT_CAPACITY, this.currentXOrigin);\n if (lineVertexCount >= 2) {\n this.uploadRawLineData(lineVertexCount);\n this.renderer.drawLineStrip(this.rawLineBuffer, lineVertexCount, series.style, camera);\n this.recordDraw(\"area\", lineVertexCount);\n }\n return;\n }\n\n for (let start = range.start; start < range.end;) {\n const areaVertexCount = series.copyAreaRange(start, range.end, this.rawLineData, AREA_POINT_CAPACITY, baseline, this.currentXOrigin);\n if (areaVertexCount < 4) break;\n\n this.uploadRawLineData(areaVertexCount);\n this.renderer.drawAreaStrip(this.rawLineBuffer, areaVertexCount, series.style, camera);\n this.recordDraw(\"area\", areaVertexCount);\n start += Math.max(1, (areaVertexCount >> 1) - 1);\n }\n\n for (let start = range.start; start < range.end;) {\n const lineVertexCount = series.copyRawRange(start, range.end, this.rawLineData, AREA_POINT_CAPACITY, this.currentXOrigin);\n if (lineVertexCount < 2) break;\n\n this.uploadRawLineData(lineVertexCount);\n this.renderer.drawLineStrip(this.rawLineBuffer, lineVertexCount, series.style, camera);\n this.recordDraw(\"area\", lineVertexCount);\n start += Math.max(1, lineVertexCount - 1);\n }\n\n }\n\n private drawOhlcSeries(series: SeriesStore, viewport: Viewport, camera: Camera2D): void {\n const range = series.visibleIndexRange(viewport);\n const maxCandles = Math.floor(this.rawLineData.length / FLOATS_PER_OHLC_CANDLE);\n for (let start = range.start; start < range.end;) {\n const candleCount = series.copyOhlcRange(start, range.end, this.rawLineData, maxCandles, series.style.tickWidth ?? series.style.barWidth ?? 0.8, this.currentXOrigin);\n if (candleCount <= 0) break;\n\n const vertexCount = candleCount * 6;\n this.uploadRawLineData(vertexCount);\n this.renderer.drawLines(this.rawLineBuffer, vertexCount, series.style, camera);\n this.recordDraw(\"raw\", vertexCount);\n start += candleCount;\n }\n }\n\n private drawCandlestickSeries(series: SeriesStore, viewport: Viewport, camera: Camera2D): void {\n const range = series.visibleIndexRange(viewport, 1);\n const maxCandles = Math.min(\n Math.floor(this.rawLineData.length / FLOATS_PER_OHLC_TUPLE),\n this.maxBarTriangleBars(),\n );\n const wickStyle: SeriesStyle = { ...series.style, color: series.style.wickColor ?? series.style.color };\n const upStyle: SeriesStyle = { ...series.style, color: series.style.upColor ?? series.style.color };\n const downStyle: SeriesStyle = { ...series.style, color: series.style.downColor ?? series.style.fillColor ?? series.style.color };\n\n for (let start = range.start; start < range.end;) {\n const candleCount = series.copyOhlcTuplesRange(start, range.end, this.rawLineData, maxCandles, this.currentXOrigin);\n if (candleCount <= 0) break;\n\n const wickVertexCount = this.writeCandlestickWicks(candleCount);\n if (wickVertexCount > 0) {\n this.uploadBarTriangleData(wickVertexCount);\n this.renderer.drawLines(this.barTriangleBuffer, wickVertexCount, wickStyle, camera);\n this.recordDraw(\"raw\", wickVertexCount);\n }\n\n const bodyWidth = series.style.barWidth ?? series.style.tickWidth ?? 0.8;\n this.drawCandlestickBodies(candleCount, bodyWidth, \"up\", upStyle, camera);\n this.drawCandlestickBodies(candleCount, bodyWidth, \"down\", downStyle, camera);\n start += candleCount;\n }\n }\n\n private drawScatterSeries(series: SeriesStore, viewport: Viewport, camera: Camera2D): void {\n const pointSize = series.style.pointSize ?? DEFAULT_POINT_SIZE_PX;\n\n const visibleSamples = series.visibleSampleCount(viewport);\n if (series.config.downsample === \"none\" && visibleSamples <= MAX_EXACT_SCATTER_POINTS) {\n const range = series.visibleIndexRange(viewport);\n for (let start = range.start; start < range.end; start += RAW_LINE_VERTEX_CAPACITY) {\n const count = series.copyScatterRange(\n start,\n Math.min(range.end, start + RAW_LINE_VERTEX_CAPACITY),\n viewport,\n this.rawLineData,\n RAW_LINE_VERTEX_CAPACITY,\n this.currentXOrigin,\n this.canvas.height,\n pointSize,\n );\n if (count <= 0) continue;\n\n this.uploadRawLineData(count);\n this.renderer.drawPoints(this.rawLineBuffer, count, series.style, camera, this.canvas.width, this.canvas.height);\n this.recordDraw(\"points\", count);\n }\n return;\n }\n\n const count = series.copyScatterVisible(\n viewport,\n this.rawLineData,\n RAW_LINE_VERTEX_CAPACITY,\n this.canvas.width,\n this.canvas.height,\n pointSize,\n this.currentXOrigin,\n );\n if (count <= 0) return;\n\n this.uploadRawLineData(count);\n this.renderer.drawPoints(this.rawLineBuffer, count, series.style, camera, this.canvas.width, this.canvas.height);\n this.recordDraw(\"points\", count);\n }\n\n private drawBarSeries(series: SeriesStore, viewport: Viewport, camera: Camera2D): void {\n const visibleSamples = series.visibleSampleCount(viewport);\n const rawBarCapacity = this.maxRawBarInstances();\n if (series.hasLOD && visibleSamples > rawBarCapacity) {\n const sampledCount = series.copyMinMaxInstanced(viewport, this.minMaxInstanceData, this.maxBarTriangleBars(), this.currentXOrigin);\n if (sampledCount <= 0) return;\n\n this.includeBaselineInBarRanges(sampledCount, series.style.baseline ?? 0);\n const vertexCount = this.writeBarBucketTriangles(sampledCount, viewport);\n this.drawBarTriangles(vertexCount, series.style, camera);\n return;\n }\n\n const range = series.visibleIndexRange(viewport, 1);\n const count = series.copyRawRange(range.start, range.end, this.rawLineData, rawBarCapacity, this.currentXOrigin);\n if (count <= 0) return;\n\n if (this.renderer.supportsInstancedBars) {\n this.uploadRawLineData(count);\n this.renderer.drawBarsInstanced(this.rawLineBuffer, count, series.style, camera);\n this.recordDraw(\"bars\", count);\n return;\n }\n\n const vertexCount = this.writeBarTriangles(count, series.style.baseline ?? 0, series.style.barWidth ?? 0.8);\n this.drawBarTriangles(vertexCount, series.style, camera);\n }\n\n private uploadRawLineData(vertexCount: number): void {\n this.uploadFloatData(this.rawLineBuffer, this.rawLineData, vertexCount * 2);\n }\n\n private uploadMinMaxInstanceData(instanceCount: number): void {\n this.uploadFloatData(this.minMaxInstanceBuffer, this.minMaxInstanceData, instanceCount * FLOATS_PER_MINMAX_SEGMENT_INSTANCE);\n }\n\n private uploadBarTriangleData(vertexCount: number): void {\n this.uploadFloatData(this.barTriangleBuffer, this.barTriangleData, vertexCount * 2);\n }\n\n private uploadGridData(vertexCount: number): void {\n this.uploadFloatData(this.gridBuffer, this.gridData, vertexCount * 2);\n }\n\n private uploadFloatData(buffer: GpuBuffer, data: Float32Array, floatCount: number): void {\n const count = Math.max(0, Math.min(floatCount, data.length));\n this.renderer.updateFloatBuffer(buffer, data, count);\n this.stats.uploadBytes += count * Float32Array.BYTES_PER_ELEMENT;\n }\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.maxBarTriangleBars());\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: Viewport,\n ): number {\n const count = Math.min(barCount, this.maxBarTriangleBars());\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, x1] = this.barBucketBounds(i, count, viewport);\n this.writeBarTriangle(i, x0, x1, minY, maxY);\n }\n return count * 6;\n }\n\n private barBucketBounds(\n index: number,\n count: number,\n viewport: { xMin: number; xMax: number },\n ): [number, number] {\n const x = this.minMaxInstanceData[index * 3]!;\n const viewportXMin = viewport.xMin - this.currentXOrigin;\n const viewportXMax = viewport.xMax - this.currentXOrigin;\n const viewportWidth = viewportXMax - viewportXMin;\n\n if (count <= 1) {\n const halfWidth = Math.max(0, viewportWidth * 0.5);\n return [\n Math.max(viewportXMin, x - halfWidth),\n Math.min(viewportXMax, x + halfWidth),\n ];\n }\n\n const prevX = index > 0 ? this.minMaxInstanceData[(index - 1) * 3]! : NaN;\n const nextX = index + 1 < count ? this.minMaxInstanceData[(index + 1) * 3]! : NaN;\n let x0 = index === 0 ? x - (nextX - x) * 0.5 : (prevX + x) * 0.5;\n let x1 = index + 1 === count ? x + (x - prevX) * 0.5 : (x + nextX) * 0.5;\n\n if (!Number.isFinite(x0) || !Number.isFinite(x1) || x1 <= x0) {\n const bucketWidth = viewportWidth / Math.max(1, count);\n x0 = viewportXMin + index * bucketWidth;\n x1 = index + 1 === count ? viewportXMax : x0 + bucketWidth;\n }\n\n return [\n Math.max(viewportXMin, x0),\n Math.min(viewportXMax, x1),\n ];\n }\n\n private writeCandlestickWicks(candleCount: number): number {\n for (let i = 0; i < candleCount; i++) {\n const src = i * FLOATS_PER_OHLC_TUPLE;\n const dst = i * 4;\n const x = this.rawLineData[src]!;\n const high = this.rawLineData[src + 2]!;\n const low = this.rawLineData[src + 3]!;\n this.barTriangleData[dst] = x;\n this.barTriangleData[dst + 1] = low;\n this.barTriangleData[dst + 2] = x;\n this.barTriangleData[dst + 3] = high;\n }\n return candleCount * 2;\n }\n\n private drawCandlestickBodies(\n candleCount: number,\n bodyWidth: number,\n direction: \"up\" | \"down\",\n style: SeriesStyle,\n camera: Camera2D,\n ): void {\n const halfWidth = bodyWidth * 0.5;\n let bodyCount = 0;\n for (let i = 0; i < candleCount && bodyCount < this.maxBarTriangleBars(); i++) {\n const src = i * FLOATS_PER_OHLC_TUPLE;\n const x = this.rawLineData[src]!;\n const open = this.rawLineData[src + 1]!;\n const close = this.rawLineData[src + 4]!;\n const isUp = close >= open;\n if ((direction === \"up\") !== isUp) continue;\n\n this.writeBarTriangle(bodyCount, x - halfWidth, x + halfWidth, Math.min(open, close), Math.max(open, close));\n bodyCount++;\n }\n\n this.drawBarTriangles(bodyCount * 6, style, camera);\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 drawBarTriangles(\n vertexCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n mode: \"bars\" | \"area\" = \"bars\",\n ): void {\n if (vertexCount <= 0) return;\n this.uploadBarTriangleData(vertexCount);\n this.renderer.drawBarTriangles(this.barTriangleBuffer, vertexCount, style, camera);\n this.recordDraw(mode, vertexCount);\n }\n\n private recordDraw(mode: \"raw\" | \"minmax\" | \"points\" | \"bars\" | \"area\", points: number, drawCalls: number = 1): void {\n this.recordRenderMode(mode);\n this.stats.pointsRendered += points;\n this.stats.drawCalls += drawCalls;\n }\n\n private findNearestXCandidate(\n dataX: number,\n plotWidth: number,\n maxDistancePx: number,\n ): PickCandidate | null {\n let best: PickCandidate | null = null;\n let bestDistancePx = Infinity;\n\n for (let seriesIndex = 0; seriesIndex < this.series.length; seriesIndex++) {\n const series = this.series[seriesIndex]!;\n if (!series.visible) continue;\n const viewport = this.cameraForSeries(series).viewport;\n const xScale = plotWidth / (viewport.xMax - viewport.xMin);\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, series, seriesIndex };\n bestDistancePx = distancePx;\n }\n }\n\n return best && bestDistancePx <= maxDistancePx ? best : null;\n }\n\n private findNearestPointCandidate(\n dataX: number,\n plotY: number,\n plotWidth: number,\n plotHeight: number,\n maxDistancePx: number,\n ): PickCandidate | null {\n let best: PickCandidate | null = null;\n for (let seriesIndex = 0; seriesIndex < this.series.length; seriesIndex++) {\n const series = this.series[seriesIndex]!;\n if (!series.visible) continue;\n const viewport = this.cameraForSeries(series).viewport;\n const dataY = viewport.yMax - (plotY / plotHeight) * (viewport.yMax - viewport.yMin);\n const sample = series.nearestSampleByPoint(dataX, dataY, viewport, plotWidth, plotHeight, maxDistancePx);\n if (!sample) continue;\n if (!best || (sample.distancePx ?? Infinity) < (best.sample.distancePx ?? Infinity)) {\n best = { sample, series, seriesIndex };\n }\n }\n\n return best && (best.sample.distancePx ?? Infinity) <= maxDistancePx ? best : null;\n }\n\n private collectPickItems(\n anchorX: number,\n clientX: number,\n clientY: 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, this.cameraForSeries(series).viewport);\n if (!sample) continue;\n items.push(this.createPickItem(sample, series, seriesIndex, clientX, clientY, rect));\n }\n return items;\n }\n\n private createPickItem(\n sample: SeriesSample,\n series: SeriesStore,\n seriesIndex: number,\n clientX: number,\n clientY: number,\n rect: DOMRect,\n ): ChartPickItem {\n const camera = this.cameraForSeries(series);\n const [clipX, clipY] = camera.toClip(sample.x, sample.y);\n const [plotX, plotY] = 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 return {\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\n private scheduleHoverRefresh(): void {\n if (this._hoverRafId !== 0) return;\n this._hoverRafId = requestAnimationFrame(() => {\n this._hoverRafId = 0;\n this.refreshHover();\n });\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 emitPointerEvent(type: ChartPointerEventType, source: MouseEvent | PointerEvent): ChartPointerEventState | null {\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return null;\n\n const plotX = source.clientX - rect.left;\n const plotY = source.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 hover = this.pick(source.clientX, source.clientY, this.options.hover);\n const event: ChartPointerEventState = {\n type,\n clientX: source.clientX,\n clientY: source.clientY,\n plotX,\n plotY,\n dataX,\n dataY,\n button: source.button,\n buttons: source.buttons,\n altKey: source.altKey,\n ctrlKey: source.ctrlKey,\n metaKey: source.metaKey,\n shiftKey: source.shiftKey,\n items: hover?.items ?? [],\n };\n for (const callback of this.pointerSubscribers[type]) callback(event);\n return event;\n }\n\n private emitSeriesClick(event: ChartSeriesClickEvent): void {\n for (const callback of this.seriesClickSubscribers) callback(event);\n }\n\n private emitViewportChange(): void {\n const event: ChartViewportChangeEvent = {\n viewport: this.camera.viewport,\n rightViewport: this.rightCamera.viewport,\n };\n for (const callback of this.viewportSubscribers) callback(event);\n }\n\n private emitSeriesChange(): void {\n for (const callback of this.seriesSubscribers) callback();\n this.refreshHover();\n }\n\n private emitThemeChange(): void {\n for (const callback of this.themeSubscribers) callback();\n }\n\n private emitRender(): void {\n for (const callback of this.renderSubscribers) callback(this);\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 maxBarTriangleBars(): number {\n return Math.min(BAR_TRIANGLE_CAPACITY, RAW_LINE_VERTEX_CAPACITY);\n }\n\n private maxRawBarInstances(): number {\n return this.renderer.supportsInstancedBars ? RAW_LINE_VERTEX_CAPACITY : this.maxBarTriangleBars();\n }\n\n private writeGridVertices(viewport: Viewport): 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] = this.xToClip(x, viewport);\n this.gridData[vertexCount * 2 + 1] = -1;\n vertexCount++;\n this.gridData[vertexCount * 2] = this.xToClip(x, viewport);\n this.gridData[vertexCount * 2 + 1] = 1;\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] = -1;\n this.gridData[vertexCount * 2 + 1] = this.yToClip(y, viewport);\n vertexCount++;\n this.gridData[vertexCount * 2] = 1;\n this.gridData[vertexCount * 2 + 1] = this.yToClip(y, viewport);\n vertexCount++;\n }\n\n return vertexCount;\n }\n\n private xToClip(x: number, viewport: Viewport): number {\n return ((x - viewport.xMin) / (viewport.xMax - viewport.xMin)) * 2 - 1;\n }\n\n private yToClip(y: number, viewport: Viewport): number {\n return ((y - viewport.yMin) / (viewport.yMax - viewport.yMin)) * 2 - 1;\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"],"mappings":"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"}
|