resolvcharts 0.3.0 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["MAX_BAR_W","RADIUS","hitScatter","hitSparkline","hitBaseline","d"],"sources":["../src/charts/bar.ts","../src/core/color.ts","../src/core/decimate.ts","../src/core/hit.ts","../src/charts/registry.ts","../src/charts/line.ts","../src/charts/baseline.ts","../src/charts/candle.ts","../src/charts/combo.ts","../src/core/format.ts","../src/charts/donut.ts","../src/charts/scatter.ts","../src/charts/sparkline.ts","../src/charts/waterfall.ts","../src/core/canvas.ts","../src/core/scales.ts","../src/core/scheduler.ts","../src/core/theme.ts","../src/core/ticks.ts","../src/core/tooltip.ts","../src/core/chart.ts"],"sourcesContent":["import type { HoverInfo, NormalizedCategory, Rect } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nexport const MAX_BAR_W = 40;\nexport const GAP_RATIO = 0.2;\nexport const RADIUS = 3;\n\nexport function barGeometry(\n r: RenderContext,\n d: NormalizedCategory,\n catIdx: number,\n seriesIdx: number,\n value: number,\n): Rect | null {\n const cats = d.categories.length;\n if (cats === 0) return null;\n const slot = r.plot.w / cats;\n const groupW = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W * d.series.length);\n const barW = groupW / d.series.length;\n const slotX = r.plot.x + slot * catIdx + (slot - groupW) / 2;\n const x = slotX + barW * seriesIdx;\n const base = r.yScale(0);\n const yv = r.yScale(value);\n const y = Math.min(base, yv);\n const h = Math.abs(base - yv);\n return { x, y, w: barW, h };\n}\n\nexport function topRounded(\n ctx: CanvasRenderingContext2D,\n rect: Rect,\n rad: number,\n up: boolean,\n): void {\n const { x, y, w, h } = rect;\n if (h <= 0 || w <= 0) return;\n const r = Math.min(rad, h / 2, w / 2);\n ctx.beginPath();\n if (up) {\n ctx.moveTo(x, y + h);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h);\n } else {\n ctx.moveTo(x, y);\n ctx.lineTo(x + w, y);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y);\n }\n ctx.closePath();\n ctx.fill();\n}\n\nfunction stackedGeometry(\n r: RenderContext,\n d: NormalizedCategory,\n catIdx: number,\n v0: number,\n v1: number,\n): Rect | null {\n const cats = d.categories.length;\n if (cats === 0) return null;\n const slot = r.plot.w / cats;\n const w = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n const x = r.plot.x + slot * catIdx + (slot - w) / 2;\n const yTop = r.yScale(Math.max(v0, v1));\n const yBot = r.yScale(Math.min(v0, v1));\n return { x, y: yTop, w, h: Math.abs(yBot - yTop) };\n}\n\nexport function renderBar(r: RenderContext): void {\n if (r.data.kind !== \"category\") return;\n const d = r.data;\n const ctx = r.ctx;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h + 1);\n ctx.clip();\n const cats = d.categories.length;\n const slot = r.plot.w / Math.max(1, cats);\n const animate = r.t < 1;\n if (r.opts.stacked) {\n const w = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n for (let ci = 0; ci < cats; ci++) {\n const x = r.plot.x + slot * ci + (slot - w) / 2;\n let pos = 0;\n let neg = 0;\n for (let si = 0; si < d.series.length; si++) {\n const s = d.series[si];\n if (!s) continue;\n const cur = s.values[ci] ?? 0;\n const prev = s.prevValues?.[ci] ?? 0;\n const v = animate ? prev + (cur - prev) * r.t : cur;\n const v0 = v >= 0 ? pos : neg + v;\n const v1 = v >= 0 ? pos + v : neg;\n if (v >= 0) pos = v1;\n else neg = v0;\n const yTop = r.yScale(Math.max(v0, v1));\n const h = Math.abs(r.yScale(Math.min(v0, v1)) - yTop);\n if (h <= 0) continue;\n ctx.fillStyle = s.color;\n ctx.fillRect(x, yTop, w, h);\n }\n }\n } else {\n const groupW = Math.min(\n slot * (1 - GAP_RATIO),\n MAX_BAR_W * d.series.length,\n );\n const barW = groupW / d.series.length;\n const base = r.yScale(0);\n for (let si = 0; si < d.series.length; si++) {\n const s = d.series[si];\n if (!s) continue;\n ctx.fillStyle = s.color;\n for (let ci = 0; ci < cats; ci++) {\n const cur = s.values[ci] ?? 0;\n const prev = s.prevValues?.[ci] ?? 0;\n const v = animate ? prev + (cur - prev) * r.t : cur;\n const x = r.plot.x + slot * ci + (slot - groupW) / 2 + barW * si;\n const yv = r.yScale(v);\n const y = Math.min(base, yv);\n const h = Math.abs(base - yv);\n if (h <= 0) continue;\n topRounded(ctx, { x, y, w: barW, h }, RADIUS, v >= 0);\n }\n }\n }\n ctx.restore();\n}\n\nexport function hitBar(\n r: RenderContext,\n px: number,\n py: number,\n): HoverInfo | null {\n if (r.data.kind !== \"category\") return null;\n const d = r.data;\n const cats = d.categories.length;\n if (cats === 0 || px < r.plot.x || px > r.plot.x + r.plot.w) return null;\n const cat = Math.min(\n cats - 1,\n Math.max(0, Math.floor(((px - r.plot.x) / r.plot.w) * cats)),\n );\n if (r.opts.stacked) {\n let pos = 0;\n let neg = 0;\n for (let si = 0; si < d.series.length; si++) {\n const s = d.series[si];\n if (!s) continue;\n const v = s.values[cat] ?? 0;\n const v0 = v >= 0 ? pos : neg + v;\n const v1 = v >= 0 ? pos + v : neg;\n if (v >= 0) pos = v1;\n else neg = v0;\n const rect = stackedGeometry(r, d, cat, v0, v1);\n if (\n rect &&\n px >= rect.x &&\n px <= rect.x + rect.w &&\n py >= rect.y &&\n py <= rect.y + rect.h\n ) {\n return {\n kind: \"bar\",\n category: d.categories[cat] ?? \"\",\n seriesIndex: si,\n label: s.label,\n color: s.color,\n value: v,\n px: rect.x + rect.w / 2,\n py,\n rect,\n };\n }\n }\n // hover in slot but not on a segment: report nearest top segment\n const s0 = d.series[d.series.length - 1];\n if (!s0) return null;\n const rect = stackedGeometry(r, d, cat, 0, pos);\n if (!rect) return null;\n return {\n kind: \"bar\",\n category: d.categories[cat] ?? \"\",\n seriesIndex: d.series.length - 1,\n label: s0.label,\n color: s0.color,\n value: s0.values[cat] ?? 0,\n px: rect.x + rect.w / 2,\n py: rect.y,\n rect,\n };\n }\n for (let si = 0; si < d.series.length; si++) {\n const s = d.series[si];\n if (!s) continue;\n const rect = barGeometry(r, d, cat, si, s.values[cat] ?? 0);\n if (rect && px >= rect.x && px <= rect.x + rect.w) {\n const inside = py >= rect.y && py <= rect.y + rect.h;\n return {\n kind: \"bar\",\n category: d.categories[cat] ?? \"\",\n seriesIndex: si,\n label: s.label,\n color: s.color,\n value: s.values[cat] ?? 0,\n px: rect.x + rect.w / 2,\n py: inside ? py : rect.y,\n rect,\n };\n }\n }\n const s = d.series[0];\n const rect = s ? barGeometry(r, d, cat, 0, s.values[cat] ?? 0) : null;\n if (!s || !rect) return null;\n return {\n kind: \"bar\",\n category: d.categories[cat] ?? \"\",\n seriesIndex: 0,\n label: s.label,\n color: s.color,\n value: s.values[cat] ?? 0,\n px: r.plot.x + (r.plot.w / cats) * (cat + 0.5),\n py: rect.y,\n rect,\n };\n}\n","export function withAlpha(color: string, alpha: number): string {\n if (color.startsWith(\"#\")) {\n let hex = color.slice(1);\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const n = Number.parseInt(hex, 16);\n const r = (n >> 16) & 255;\n const g = (n >> 8) & 255;\n const b = n & 255;\n return `rgba(${r},${g},${b},${alpha})`;\n }\n const m = color.match(/^rgba?\\(([^)]+)\\)$/);\n if (m) {\n const parts = (m[1] as string).split(\",\").slice(0, 3).join(\",\");\n return `rgba(${parts},${alpha})`;\n }\n return color;\n}\n","import type { Scale } from \"./types\";\n\n/**\n * Map data-space points to pixel space (with optional lerp between prev and\n * current y for animation) into interleaved [x, y] pairs.\n */\nexport function mapSeriesPx(\n xs: Float64Array,\n ys: Float64Array,\n prev: Float64Array | null,\n t: number,\n yFallback: number,\n xScale: Scale,\n yScale: Scale,\n flow = 0,\n): Float32Array {\n const n = Math.min(xs.length, ys.length);\n const out = new Float32Array(Math.max(1, n) * 2);\n const xd = xScale.domain;\n const xr = xScale.range;\n const kx = (xr[1] - xr[0]) / (xd[1] - xd[0] || 1);\n const bx = xr[0] - xd[0] * kx;\n const yd = yScale.domain;\n const yr = yScale.range;\n const ky = (yr[1] - yr[0]) / (yd[1] - yd[0] || 1);\n const by = yr[0] - yd[0] * ky;\n const lerp = t < 1;\n // per-point progress: newest (rightmost) leads, tail lags by `flow`\n const inv = n > 1 ? flow / (n - 1) : 0;\n const f1 = 1 + flow;\n let o = 0;\n for (let i = 0; i < n; i++) {\n let yv = ys[i] as number;\n if (lerp) {\n let ti = flow > 0 ? t * f1 - flow + i * inv : t;\n if (ti < 0) ti = 0;\n else if (ti > 1) ti = 1;\n const p = prev ? (prev[i] as number) : yFallback;\n yv = p + (yv - p) * ti;\n }\n out[o] = bx + (xs[i] as number) * kx;\n out[o + 1] = by + yv * ky;\n o += 2;\n }\n return out.subarray(0, o);\n}\n\n/** pooled output for decimateSeriesPx — callers consume before the next call */\nlet decScratch = new Float32Array(0);\n\n/**\n * Fused map + M4 decimation: scales data-space points to pixel space on the\n * fly (lerping y when animating), so no intermediate pixel arrays are ever\n * allocated. xs must be monotonically non-decreasing.\n *\n * Returns a subarray view of a pooled buffer — consume it before calling\n * decimateSeriesPx/mapSeriesPx again.\n */\nexport function decimateSeriesPx(\n xs: Float64Array,\n ys: Float64Array,\n prev: Float64Array | null,\n t: number,\n yFallback: number,\n xScale: Scale,\n yScale: Scale,\n pixelWidth: number,\n flow = 0,\n): Float32Array {\n const n = Math.min(xs.length, ys.length);\n if (n === 0) return new Float32Array(0);\n const maxPts = Math.min(n, 4 * (Math.ceil(pixelWidth) + 8));\n if (decScratch.length < maxPts * 2) {\n decScratch = new Float32Array(Math.max(1, maxPts) * 2);\n }\n const out = decScratch;\n\n const xd = xScale.domain;\n const xr = xScale.range;\n const kx = (xr[1] - xr[0]) / (xd[1] - xd[0] || 1);\n const bx = xr[0] - xd[0] * kx;\n const yd = yScale.domain;\n const yr = yScale.range;\n const ky = (yr[1] - yr[0]) / (yd[1] - yd[0] || 1);\n const by = yr[0] - yd[0] * ky;\n const lerp = t < 1;\n const inv = n > 1 ? flow / (n - 1) : 0;\n const f1 = 1 + flow;\n\n let o = 0;\n let yv = ys[0] as number;\n if (lerp) {\n let ti = flow > 0 ? t * f1 - flow : t;\n if (ti < 0) ti = 0;\n else if (ti > 1) ti = 1;\n const p = prev ? (prev[0] as number) : yFallback;\n yv = p + (yv - p) * ti;\n }\n let firstX = bx + (xs[0] as number) * kx;\n let firstY = by + yv * ky;\n let col = Math.floor(firstX);\n let minX = firstX;\n let minY = firstY;\n let maxX = firstX;\n let maxY = firstY;\n let lastX = firstX;\n let lastY = firstY;\n\n const cap = out.length;\n for (let i = 1; i < n; i++) {\n const x = bx + (xs[i] as number) * kx;\n yv = ys[i] as number;\n if (lerp) {\n let ti = flow > 0 ? t * f1 - flow + i * inv : t;\n if (ti < 0) ti = 0;\n else if (ti > 1) ti = 1;\n const p = prev ? (prev[i] as number) : yFallback;\n yv = p + (yv - p) * ti;\n }\n const y = by + yv * ky;\n const c = Math.floor(x);\n if (c !== col) {\n if (o + 8 <= cap) {\n out[o] = firstX;\n out[o + 1] = firstY;\n o += 2;\n if (minY !== firstY || minX !== firstX) {\n out[o] = minX;\n out[o + 1] = minY;\n o += 2;\n }\n if (maxY !== minY || maxX !== minX) {\n out[o] = maxX;\n out[o + 1] = maxY;\n o += 2;\n }\n if (lastX !== maxX || lastY !== maxY) {\n out[o] = lastX;\n out[o + 1] = lastY;\n o += 2;\n }\n }\n col = c;\n firstX = x;\n firstY = y;\n minX = maxX = lastX = x;\n minY = maxY = lastY = y;\n } else {\n if (y < minY) {\n minY = y;\n minX = x;\n }\n if (y > maxY) {\n maxY = y;\n maxX = x;\n }\n lastX = x;\n lastY = y;\n }\n }\n if (o + 8 <= cap) {\n out[o] = firstX;\n out[o + 1] = firstY;\n o += 2;\n if (minY !== firstY || minX !== firstX) {\n out[o] = minX;\n out[o + 1] = minY;\n o += 2;\n }\n if (maxY !== minY || maxX !== minX) {\n out[o] = maxX;\n out[o + 1] = maxY;\n o += 2;\n }\n if (lastX !== maxX || lastY !== maxY) {\n out[o] = lastX;\n out[o + 1] = lastY;\n o += 2;\n }\n }\n return out.subarray(0, o);\n}\n\n/**\n * M4 (min-max) decimation: for each integer pixel column along x, keep the\n * first, min, max, and last points. Guarantees peaks are never dropped and\n * bounds path complexity to ~4 points per horizontal pixel.\n *\n * xs must be pixel-space x coordinates, monotonically non-decreasing.\n * ys must be pixel-space y coordinates of equal length.\n *\n * Returns interleaved [x, y] pairs ready for path construction.\n * @category Utilities\n */\nexport function decimateM4(\n xs: ArrayLike<number>,\n ys: ArrayLike<number>,\n pixelWidth: number,\n): Float32Array {\n const n = Math.min(xs.length, ys.length);\n if (n === 0) return new Float32Array(0);\n // Output points are always input points: ≤ n total, ≤ 4 per pixel column.\n const maxPts = Math.min(n, 4 * (Math.ceil(pixelWidth) + 8));\n const out = new Float32Array(Math.max(1, maxPts) * 2);\n\n let o = 0;\n let col = Math.floor(xs[0] as number);\n let firstX = xs[0] as number;\n let firstY = ys[0] as number;\n let minX = firstX;\n let minY = firstY;\n let maxX = firstX;\n let maxY = firstY;\n let lastX = firstX;\n let lastY = firstY;\n\n const put = (x: number, y: number): void => {\n if (o + 2 <= out.length) {\n out[o] = x;\n out[o + 1] = y;\n o += 2;\n }\n };\n\n const flush = () => {\n put(firstX, firstY);\n if (minY !== firstY || minX !== firstX) put(minX, minY);\n if (maxY !== minY || maxX !== minX) put(maxX, maxY);\n if (lastX !== maxX || lastY !== maxY) put(lastX, lastY);\n };\n\n for (let i = 1; i < n; i++) {\n const x = xs[i] as number;\n const y = ys[i] as number;\n const c = Math.floor(x);\n if (c !== col) {\n flush();\n col = c;\n firstX = x;\n firstY = y;\n minX = maxX = lastX = x;\n minY = maxY = lastY = y;\n } else {\n if (y < minY) {\n minY = y;\n minX = x;\n }\n if (y > maxY) {\n maxY = y;\n maxX = x;\n }\n lastX = x;\n lastY = y;\n }\n }\n flush();\n return out.subarray(0, o);\n}\n","/**\n * Binary search for the index whose value is nearest to `target`.\n * `xs` must be sorted ascending. Returns -1 for empty input.\n * @category Utilities\n */\nexport function nearestIndex(xs: ArrayLike<number>, target: number): number {\n const n = xs.length;\n if (n === 0) return -1;\n if (target <= (xs[0] as number)) return 0;\n if (target >= (xs[n - 1] as number)) return n - 1;\n let lo = 0;\n let hi = n - 1;\n while (hi - lo > 1) {\n const mid = (lo + hi) >> 1;\n if ((xs[mid] as number) < target) lo = mid;\n else hi = mid;\n }\n const dLo = Math.abs(target - (xs[lo] as number));\n const dHi = Math.abs(target - (xs[hi] as number));\n return dHi < dLo ? hi : lo;\n}\n","import type { CanvasBackend } from \"../core/canvas\";\nimport type {\n ChartOptions,\n NormalizedData,\n NormalizedXY,\n Rect,\n Scale,\n ThemeTokens,\n} from \"../core/types\";\n\nexport interface RenderContext {\n backend: CanvasBackend;\n ctx: CanvasRenderingContext2D;\n plot: Rect;\n theme: ThemeTokens;\n opts: ChartOptions;\n data: NormalizedData;\n xScale: Scale;\n yScale: Scale;\n /** eased animation progress, 0..1 */\n t: number;\n}\n\nexport type SeriesRenderer = (r: RenderContext) => void;\n\nexport function lerpY(\n s: { y: Float64Array; prevY: Float64Array | null },\n i: number,\n t: number,\n fallback: number,\n): number {\n const to = s.y[i] ?? fallback;\n const from = s.prevY?.[i] ?? fallback;\n return t >= 1 ? to : from + (to - from) * t;\n}\n\nexport function isXY(d: NormalizedData): d is NormalizedXY {\n return d.kind === \"xy\";\n}\n\n/** pooled scratch for smoothPath tangents — consumed within the call */\nlet smScratch = new Float64Array(0);\n\n/**\n * Monotone cubic path (Fritsch–Carlson tangents) — never overshoots data.\n * `pts` is interleaved [x0, y0, x1, y1, ...] with `n` points.\n */\nexport function smoothPath(\n ctx: CanvasPath,\n pts: ArrayLike<number>,\n n: number,\n): void {\n if (n < 3) {\n for (let i = 0; i < n; i++) {\n const x = pts[2 * i] as number;\n const y = pts[2 * i + 1] as number;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n return;\n }\n const segs = n - 1;\n const need = segs + n;\n if (smScratch.length < need) smScratch = new Float64Array(need);\n const m = smScratch.subarray(0, segs);\n const tang = smScratch.subarray(segs, segs + n);\n for (let i = 0; i < segs; i++) {\n const dxi = (pts[2 * (i + 1)] as number) - (pts[2 * i] as number);\n m[i] =\n dxi === 0\n ? 0\n : ((pts[2 * (i + 1) + 1] as number) - (pts[2 * i + 1] as number)) / dxi;\n }\n tang[0] = m[0] as number;\n for (let i = 1; i < segs; i++) {\n const a = m[i - 1] as number;\n const b = m[i] as number;\n tang[i] = a * b <= 0 ? 0 : (a + b) / 2;\n }\n tang[n - 1] = m[segs - 1] as number;\n for (let i = 0; i < segs; i++) {\n const mi = m[i] as number;\n if (mi !== 0) {\n const ti = tang[i] as number;\n const ti1 = tang[i + 1] as number;\n const lim = 3 * Math.abs(mi);\n if (Math.abs(ti) > lim) tang[i] = Math.sign(ti) * lim;\n if (Math.abs(ti1) > lim) tang[i + 1] = Math.sign(ti1) * lim;\n }\n }\n ctx.moveTo(pts[0] as number, pts[1] as number);\n for (let i = 0; i < segs; i++) {\n const x0 = pts[2 * i] as number;\n const x1 = pts[2 * (i + 1)] as number;\n const y0 = pts[2 * i + 1] as number;\n const y1 = pts[2 * (i + 1) + 1] as number;\n const h = (x1 - x0) / 3;\n ctx.bezierCurveTo(\n x0 + h,\n y0 + h * (tang[i] as number),\n x1 - h,\n y1 - h * (tang[i + 1] as number),\n x1,\n y1,\n );\n }\n}\n","import { withAlpha } from \"../core/color\";\nimport { decimateSeriesPx, mapSeriesPx } from \"../core/decimate\";\nimport { nearestIndex } from \"../core/hit\";\nimport type { HoverInfo, NormalizedSeries } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY, smoothPath } from \"./registry\";\n\n/** fraction of the tween the trailing edge lags behind the leading point */\nexport const FLOW_RIPPLE = 0.35;\n\nexport interface BuiltPath {\n path: Path2D;\n /** pixel x of the first drawn point (area fill edge) */\n firstX: number;\n /** pixel x of the last drawn point */\n lastX: number;\n /** pixel y of the last drawn point */\n lastY: number;\n}\n\n/**\n * Materialize one series as interleaved [x, y] pixel pairs: scales to pixel\n * space, lerps y while animating, and M4-decimates when points exceed ~1.5x\n * the plot width. Shared by the Canvas2D path builder and the WebGPU backend.\n */\nexport function seriesPoints(\n r: RenderContext,\n s: NormalizedSeries,\n yFallback?: number,\n): Float32Array {\n const d = r.data;\n if (!isXY(d)) throw new Error(\"unreachable\");\n const n = d.sortedX.length;\n if (n === 0) return new Float32Array(0);\n const fb = yFallback ?? r.yScale.domain[0];\n const flow = r.opts.flow ? FLOW_RIPPLE : 0;\n return n > r.plot.w * 1.5\n ? decimateSeriesPx(\n d.sortedX,\n s.y,\n s.prevY,\n r.t,\n fb,\n r.xScale,\n r.yScale,\n r.plot.w,\n flow,\n )\n : mapSeriesPx(d.sortedX, s.y, s.prevY, r.t, fb, r.xScale, r.yScale, flow);\n}\n\nexport function buildPath(\n r: RenderContext,\n s: NormalizedSeries,\n yFallback?: number,\n): BuiltPath {\n const path = new Path2D();\n const pts = seriesPoints(r, s, yFallback);\n const dn = pts.length / 2;\n if (dn === 0) return { path, firstX: 0, lastX: 0, lastY: 0 };\n const curve = r.opts.curve ?? \"linear\";\n if (curve === \"step\") {\n path.moveTo(pts[0] as number, pts[1] as number);\n for (let i = 1; i < dn; i++) {\n const x = pts[2 * i] as number;\n path.lineTo(x, pts[2 * i - 1] as number);\n path.lineTo(x, pts[2 * i + 1] as number);\n }\n } else if (curve === \"smooth\") {\n smoothPath(path, pts, dn);\n } else {\n path.moveTo(pts[0] as number, pts[1] as number);\n for (let i = 1; i < dn; i++) {\n path.lineTo(pts[2 * i] as number, pts[2 * i + 1] as number);\n }\n }\n return {\n path,\n firstX: pts[0] as number,\n lastX: pts[2 * dn - 2] as number,\n lastY: pts[2 * dn - 1] as number,\n };\n}\n\nexport function renderLine(r: RenderContext, fill: boolean): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const ctx = r.ctx;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h);\n ctx.clip();\n\n for (const s of d.series) {\n const { path, firstX, lastX } = buildPath(r, s);\n if (fill && lastX !== firstX) {\n const area = new Path2D(path);\n const base = r.yScale(Math.max(0, r.yScale.domain[0]));\n area.lineTo(lastX, base);\n area.lineTo(firstX, base);\n area.closePath();\n const g = ctx.createLinearGradient(0, r.plot.y, 0, r.plot.y + r.plot.h);\n g.addColorStop(0, withAlpha(s.color, 0.16));\n g.addColorStop(1, withAlpha(s.color, 0));\n ctx.fillStyle = g;\n ctx.fill(area);\n }\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n }\n ctx.restore();\n}\n\nexport function hitXY(r: RenderContext, px: number): HoverInfo | null {\n if (!isXY(r.data)) return null;\n const d = r.data;\n const idx = nearestIndex(d.sortedX, r.xScale.invert(px));\n if (idx < 0) return null;\n const xVal = d.sortedX[idx] as number;\n const sx = r.xScale(xVal);\n let py = r.plot.y + r.plot.h;\n const values = d.series.map((s) => {\n const yVal = s.y[idx] as number;\n const sy = r.yScale(yVal);\n if (sy < py) py = sy;\n return { label: s.label, color: s.color, y: yVal };\n });\n return { kind: \"point\", index: idx, x: xVal, px: sx, py, values };\n}\n","import { withAlpha } from \"../core/color\";\nimport { buildPath, hitXY } from \"./line\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY } from \"./registry\";\n\n/**\n * Baseline/delta chart: one line colored green above a reference value and\n * red below, with matching gradient fills (lightweight-charts BaselineSeries\n * model). Uses the first series only.\n */\nexport function renderBaseline(r: RenderContext): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const s = d.series[0];\n if (!s || d.sortedX.length === 0) return;\n const ctx = r.ctx;\n const base = r.opts.baseline ?? (s.y[0] as number);\n const basePx = Math.max(\n r.plot.y,\n Math.min(r.plot.y + r.plot.h, r.yScale(base)),\n );\n const { path, firstX, lastX } = buildPath(r, s, base);\n\n const area = new Path2D(path);\n area.lineTo(lastX, basePx);\n area.lineTo(firstX, basePx);\n area.closePath();\n\n const regions: {\n top: number;\n bot: number;\n color: string;\n gFrom: number;\n gTo: number;\n }[] = [\n { top: r.plot.y, bot: basePx, color: r.theme.up, gFrom: 0.28, gTo: 0.05 },\n {\n top: basePx,\n bot: r.plot.y + r.plot.h,\n color: r.theme.down,\n gFrom: 0.05,\n gTo: 0.28,\n },\n ];\n for (const reg of regions) {\n if (reg.bot - reg.top <= 0) continue;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, reg.top, r.plot.w, reg.bot - reg.top);\n ctx.clip();\n const g = ctx.createLinearGradient(0, reg.top, 0, reg.bot);\n g.addColorStop(0, withAlpha(reg.color, reg.gFrom));\n g.addColorStop(1, withAlpha(reg.color, reg.gTo));\n ctx.fillStyle = g;\n ctx.fill(area);\n ctx.strokeStyle = reg.color;\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n ctx.restore();\n }\n // baseline hairline\n ctx.strokeStyle = r.theme.axisBaseline;\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n const bx = Math.round(basePx) + 0.5;\n ctx.moveTo(r.plot.x, bx);\n ctx.lineTo(r.plot.x + r.plot.w, bx);\n ctx.stroke();\n ctx.setLineDash([]);\n}\n\nexport { hitXY as hitBaseline };\n","import { withAlpha } from \"../core/color\";\nimport { nearestIndex } from \"../core/hit\";\nimport type { HoverInfo } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nexport function renderCandles(r: RenderContext, ohlcStyle: boolean): void {\n if (r.data.kind !== \"ohlc\") return;\n const d = r.data;\n const ctx = r.ctx;\n const n = d.x.length;\n if (n === 0) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h);\n ctx.clip();\n ctx.globalAlpha = r.t >= 1 ? 1 : r.t;\n\n // inline scale math: ~3x faster than closure calls at candle scale\n const xd = r.xScale.domain;\n const xr = r.xScale.range;\n const kx = (xr[1] - xr[0]) / (xd[1] - xd[0] || 1);\n const bx = xr[0] - xd[0] * kx;\n const yd = r.yScale.domain;\n const yr = r.yScale.range;\n const ky = (yr[1] - yr[0]) / (yd[1] - yd[0] || 1);\n const by = yr[0] - yd[0] * ky;\n\n const wickUp = new Path2D();\n const wickDown = new Path2D();\n const bodyUp = new Path2D();\n const bodyDown = new Path2D();\n const volUp = new Path2D();\n const volDown = new Path2D();\n const bandH = d.volume ? r.plot.h * 0.18 : 0;\n const bandBot = r.plot.y + r.plot.h;\n const vol = d.volume;\n\n if (n <= r.plot.w) {\n // sparse: one mark per candle, exact rendering\n const bodyW = Math.min((r.plot.w / n) * 0.6, 14);\n const half = bodyW / 2;\n let vmax = 0;\n if (vol) {\n for (let i = 0; i < n; i++) {\n const v = vol[i] as number;\n if (v > vmax) vmax = v;\n }\n }\n const vk = vmax > 0 ? bandH / vmax : 0;\n for (let i = 0; i < n; i++) {\n const up = (d.close[i] as number) >= (d.open[i] as number);\n const cx = bx + (d.x[i] as number) * kx;\n const hi = by + (d.high[i] as number) * ky;\n const lo = by + (d.low[i] as number) * ky;\n const wick = up ? wickUp : wickDown;\n wick.moveTo(cx, hi);\n wick.lineTo(cx, lo);\n if (ohlcStyle) {\n const op = by + (d.open[i] as number) * ky;\n const cl = by + (d.close[i] as number) * ky;\n wick.moveTo(cx - half, op);\n wick.lineTo(cx, op);\n wick.moveTo(cx, cl);\n wick.lineTo(cx + half, cl);\n } else {\n const op = by + (d.open[i] as number) * ky;\n const cl = by + (d.close[i] as number) * ky;\n const body = up ? bodyUp : bodyDown;\n body.rect(\n cx - half,\n Math.min(op, cl),\n bodyW,\n Math.max(1, Math.abs(cl - op)),\n );\n }\n if (vol) {\n const v = vol[i] as number;\n if (v > 0) {\n const h = v * vk;\n (up ? volUp : volDown).rect(cx - half, bandBot - h, bodyW, h);\n }\n }\n }\n } else {\n // dense: aggregate candles per integer pixel column — same output as\n // trading terminals; bounds mark count to ~plot width\n const maxCols = Math.min(n, Math.ceil(r.plot.w) + 1);\n const cxA = new Float64Array(maxCols);\n const oA = new Float64Array(maxCols);\n const hA = new Float64Array(maxCols);\n const lA = new Float64Array(maxCols);\n const cA = new Float64Array(maxCols);\n const vA = new Float64Array(maxCols);\n let nc = 0;\n let prevCol = -1;\n for (let i = 0; i < n; i++) {\n const c = Math.floor(bx + (d.x[i] as number) * kx);\n if (c !== prevCol) {\n prevCol = c;\n const k = nc++;\n cxA[k] = c + 0.5;\n oA[k] = d.open[i] as number;\n hA[k] = d.high[i] as number;\n lA[k] = d.low[i] as number;\n cA[k] = d.close[i] as number;\n vA[k] = vol ? (vol[i] as number) : 0;\n } else {\n const k = nc - 1;\n const hi = d.high[i] as number;\n const lo = d.low[i] as number;\n if (hi > (hA[k] as number)) hA[k] = hi;\n if (lo < (lA[k] as number)) lA[k] = lo;\n cA[k] = d.close[i] as number;\n if (vol) vA[k] = (vA[k] as number) + (vol[i] as number);\n }\n }\n const pitch = r.plot.w / nc;\n const bodyW = Math.max(0.5, Math.min(pitch * 0.6, 14));\n const half = bodyW / 2;\n let vmax = 0;\n if (vol) {\n for (let k = 0; k < nc; k++) {\n if ((vA[k] as number) > vmax) vmax = vA[k] as number;\n }\n }\n const vk = vmax > 0 ? bandH / vmax : 0;\n for (let k = 0; k < nc; k++) {\n const cx = cxA[k] as number;\n const up = (cA[k] as number) >= (oA[k] as number);\n const wick = up ? wickUp : wickDown;\n wick.moveTo(cx, by + (hA[k] as number) * ky);\n wick.lineTo(cx, by + (lA[k] as number) * ky);\n if (ohlcStyle) {\n const op = by + (oA[k] as number) * ky;\n const cl = by + (cA[k] as number) * ky;\n wick.moveTo(cx - half, op);\n wick.lineTo(cx, op);\n wick.moveTo(cx, cl);\n wick.lineTo(cx + half, cl);\n } else {\n const op = by + (oA[k] as number) * ky;\n const cl = by + (cA[k] as number) * ky;\n (up ? bodyUp : bodyDown).rect(\n cx - half,\n Math.min(op, cl),\n bodyW,\n Math.max(1, Math.abs(cl - op)),\n );\n }\n if (vol) {\n const v = vA[k] as number;\n if (v > 0) {\n const h = v * vk;\n (up ? volUp : volDown).rect(cx - half, bandBot - h, bodyW, h);\n }\n }\n }\n }\n\n // wicks first so bodies draw on top\n ctx.lineWidth = 1;\n ctx.strokeStyle = r.theme.up;\n ctx.stroke(wickUp);\n ctx.strokeStyle = r.theme.down;\n ctx.stroke(wickDown);\n if (!ohlcStyle) {\n ctx.fillStyle = r.theme.up;\n ctx.fill(bodyUp);\n ctx.fillStyle = r.theme.down;\n ctx.fill(bodyDown);\n }\n if (vol) {\n ctx.fillStyle = withAlpha(r.theme.up, 0.35);\n ctx.fill(volUp);\n ctx.fillStyle = withAlpha(r.theme.down, 0.35);\n ctx.fill(volDown);\n }\n ctx.restore();\n}\n\nexport function hitCandle(r: RenderContext, px: number): HoverInfo | null {\n if (r.data.kind !== \"ohlc\") return null;\n const d = r.data;\n const idx = nearestIndex(d.x, r.xScale.invert(px));\n if (idx < 0) return null;\n return {\n kind: \"candle\",\n index: idx,\n x: d.x[idx] as number,\n open: d.open[idx] as number,\n high: d.high[idx] as number,\n low: d.low[idx] as number,\n close: d.close[idx] as number,\n px: r.xScale(d.x[idx] as number),\n py: r.yScale(d.close[idx] as number),\n };\n}\n","import { withAlpha } from \"../core/color\";\nimport type { HoverInfo, NormalizedCategory } from \"../core/types\";\nimport { GAP_RATIO, MAX_BAR_W, RADIUS, topRounded } from \"./bar\";\nimport type { RenderContext } from \"./registry\";\nimport { smoothPath } from \"./registry\";\n\ntype CatSeries = NormalizedCategory[\"series\"][number];\n\n/** pooled scratch for overlay [x, y] pairs — consumed within the call */\nlet ovScratch = new Float64Array(0);\n\nfunction overlayPath(r: RenderContext, pts: Float64Array, n: number): Path2D {\n const path = new Path2D();\n if (n === 0) return path;\n const curve = r.opts.curve ?? \"linear\";\n if (curve === \"step\") {\n path.moveTo(pts[0] as number, pts[1] as number);\n for (let i = 1; i < n; i++) {\n const x = pts[2 * i] as number;\n path.lineTo(x, pts[2 * i - 1] as number);\n path.lineTo(x, pts[2 * i + 1] as number);\n }\n } else if (curve === \"smooth\") {\n smoothPath(path, pts, n);\n } else {\n path.moveTo(pts[0] as number, pts[1] as number);\n for (let i = 1; i < n; i++) {\n path.lineTo(pts[2 * i] as number, pts[2 * i + 1] as number);\n }\n }\n return path;\n}\n\nexport function renderCombo(r: RenderContext): void {\n if (r.data.kind !== \"category\") return;\n const d = r.data;\n const ctx = r.ctx;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h + 1);\n ctx.clip();\n const cats = d.categories.length;\n const slot = r.plot.w / Math.max(1, cats);\n const animate = r.t < 1;\n const valAt = (s: CatSeries, ci: number): number => {\n const cur = s.values[ci] ?? 0;\n const prev = s.prevValues?.[ci] ?? 0;\n return animate ? prev + (cur - prev) * r.t : cur;\n };\n\n let nCols = 0;\n for (const s of d.series) if (s.kind === \"column\") nCols++;\n if (r.opts.stacked) {\n const w = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n for (let ci = 0; ci < cats; ci++) {\n const x = r.plot.x + slot * ci + (slot - w) / 2;\n let pos = 0;\n let neg = 0;\n for (const s of d.series) {\n if (s.kind !== \"column\") continue;\n const v = valAt(s, ci);\n const v0 = v >= 0 ? pos : neg + v;\n const v1 = v >= 0 ? pos + v : neg;\n if (v >= 0) pos = v1;\n else neg = v0;\n const yTop = r.yScale(Math.max(v0, v1));\n const h = Math.abs(r.yScale(Math.min(v0, v1)) - yTop);\n if (h <= 0) continue;\n ctx.fillStyle = s.color;\n ctx.fillRect(x, yTop, w, h);\n }\n }\n } else {\n const groupW = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W * nCols);\n const barW = groupW / Math.max(1, nCols);\n const base = r.yScale(0);\n let k = 0;\n for (const s of d.series) {\n if (s.kind !== \"column\") continue;\n ctx.fillStyle = s.color;\n for (let ci = 0; ci < cats; ci++) {\n const v = valAt(s, ci);\n const x = r.plot.x + slot * ci + (slot - groupW) / 2 + barW * k;\n const yv = r.yScale(v);\n const y = Math.min(base, yv);\n const h = Math.abs(base - yv);\n if (h <= 0) continue;\n topRounded(ctx, { x, y, w: barW, h }, RADIUS, v >= 0);\n }\n k++;\n }\n }\n\n // overlays ride on category centers\n const base = r.yScale(Math.max(0, r.yScale.domain[0]));\n if (ovScratch.length < cats * 2) ovScratch = new Float64Array(cats * 2);\n const pts = ovScratch;\n for (const s of d.series) {\n if (s.kind === \"column\") continue;\n for (let ci = 0; ci < cats; ci++) {\n pts[2 * ci] = r.plot.x + slot * (ci + 0.5);\n pts[2 * ci + 1] = r.yScale(valAt(s, ci));\n }\n const path = overlayPath(r, pts, cats);\n if (s.kind === \"area\" && cats > 1) {\n const area = new Path2D(path);\n area.lineTo(pts[2 * (cats - 1)] as number, base);\n area.lineTo(pts[0] as number, base);\n area.closePath();\n const g = ctx.createLinearGradient(0, r.plot.y, 0, r.plot.y + r.plot.h);\n g.addColorStop(0, withAlpha(s.color, 0.16));\n g.addColorStop(1, withAlpha(s.color, 0));\n ctx.fillStyle = g;\n ctx.fill(area);\n }\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n }\n ctx.restore();\n}\n\nexport function hitCombo(r: RenderContext, px: number): HoverInfo | null {\n if (r.data.kind !== \"category\") return null;\n const d = r.data;\n const cats = d.categories.length;\n if (cats === 0 || px < r.plot.x || px > r.plot.x + r.plot.w) return null;\n const cat = Math.min(\n cats - 1,\n Math.max(0, Math.floor(((px - r.plot.x) / r.plot.w) * cats)),\n );\n const slot = r.plot.w / cats;\n let py = r.plot.y + r.plot.h;\n const values = d.series.map((s) => {\n const y = s.values[cat] ?? 0;\n const sy = r.yScale(y);\n if (sy < py) py = sy;\n return { label: s.label, color: s.color, y };\n });\n return {\n kind: \"point\",\n index: cat,\n x: cat,\n px: r.plot.x + slot * (cat + 0.5),\n py,\n values,\n title: d.categories[cat] ?? \"\",\n };\n}\n","/** @category Formatting\n * Compact number formatting: integers verbatim, else 4 significant digits. */\nexport function formatNumber(v: number): string {\n if (!Number.isFinite(v)) return \"\";\n if (Number.isInteger(v) && Math.abs(v) < 1e15) return String(v);\n return String(Number(v.toPrecision(4)));\n}\n\nconst MAGNITUDES: [number, string][] = [\n [1e9, \"B\"],\n [1e6, \"M\"],\n [1e3, \"k\"],\n];\n\n/** @category Formatting\n * SI-suffixed formatting: `1.2k`, `3.4M`, `5B`. */\nexport function formatSI(v: number): string {\n if (!Number.isFinite(v)) return \"\";\n const abs = Math.abs(v);\n for (const [m, s] of MAGNITUDES) {\n if (abs >= m) {\n const n = v / m;\n const digits = n >= 100 || Number.isInteger(n) ? 0 : 1;\n return `${n.toFixed(digits)}${s}`;\n }\n }\n return formatNumber(v);\n}\n","import { formatSI } from \"../core/format\";\nimport type { HoverInfo, NormalizedDonut } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nconst INNER = 0.65;\nconst GAP = 0.015;\nconst START = -Math.PI / 2;\n\nexport interface DonutGeo {\n cx: number;\n cy: number;\n rOuter: number;\n rInner: number;\n angles: { a0: number; a1: number }[];\n}\n\nexport function donutGeometry(\n r: RenderContext,\n d: NormalizedDonut,\n t: number,\n): DonutGeo {\n const cx = r.plot.x + r.plot.w / 2;\n const cy = r.plot.y + r.plot.h / 2;\n const rOuter = Math.max(1, Math.min(r.plot.w, r.plot.h) / 2);\n const rInner = rOuter * INNER;\n const angles: { a0: number; a1: number }[] = [];\n let a = START;\n const sweep = Math.PI * 2 * Math.min(1, Math.max(0, t));\n for (const s of d.slices) {\n const frac = d.total > 0 ? s.value / d.total : 0;\n const a1 = a + frac * sweep;\n angles.push({ a0: a, a1 });\n a = a + frac * Math.PI * 2;\n }\n return { cx, cy, rOuter, rInner, angles };\n}\n\nexport function renderDonut(r: RenderContext): void {\n if (r.data.kind !== \"donut\") return;\n const d = r.data;\n const ctx = r.ctx;\n const geo = donutGeometry(r, d, r.t);\n for (let i = 0; i < d.slices.length; i++) {\n const s = d.slices[i];\n const an = geo.angles[i];\n if (!s || !an || an.a1 - an.a0 <= 0) continue;\n const a0 = an.a0 + GAP / 2;\n const a1 = an.a1 - GAP / 2;\n if (a1 <= a0) continue;\n ctx.beginPath();\n ctx.arc(geo.cx, geo.cy, geo.rOuter, a0, a1);\n ctx.arc(geo.cx, geo.cy, geo.rInner, a1, a0, true);\n ctx.closePath();\n ctx.fillStyle = s.color;\n ctx.fill();\n }\n if (d.slices.length > 0 && r.t > 0.5) {\n ctx.fillStyle = r.theme.text;\n ctx.font = `600 20px ${r.theme.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(formatSI(d.total), geo.cx, geo.cy);\n }\n}\n\nexport function hitDonut(\n r: RenderContext,\n px: number,\n py: number,\n): HoverInfo | null {\n if (r.data.kind !== \"donut\") return null;\n const d = r.data;\n const geo = donutGeometry(r, d, 1);\n const dx = px - geo.cx;\n const dy = py - geo.cy;\n const dist = Math.hypot(dx, dy);\n if (dist < geo.rInner || dist > geo.rOuter) return null;\n let angle = Math.atan2(dy, dx);\n while (angle < START) angle += Math.PI * 2;\n while (angle >= START + Math.PI * 2) angle -= Math.PI * 2;\n for (let i = 0; i < geo.angles.length; i++) {\n const an = geo.angles[i];\n const s = d.slices[i];\n if (!an || !s) continue;\n if (angle >= an.a0 && angle < an.a1) {\n return {\n kind: \"slice\",\n index: i,\n label: s.label,\n color: s.color,\n value: s.value,\n share: d.total > 0 ? s.value / d.total : 0,\n px,\n py,\n };\n }\n }\n return null;\n}\n","import { withAlpha } from \"../core/color\";\nimport { hitXY } from \"./line\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY } from \"./registry\";\n\nexport function renderScatter(r: RenderContext): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const ctx = r.ctx;\n const t = r.t;\n const lerp = t < 1;\n const fallback = r.yScale.domain[0];\n const xMin = r.plot.x - 3;\n const xMax = r.plot.x + r.plot.w + 3;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h);\n ctx.clip();\n for (const s of d.series) {\n const y = s.y;\n const prev = s.prevY;\n ctx.fillStyle = withAlpha(s.color, 0.65);\n ctx.beginPath();\n for (let i = 0; i < d.sortedX.length; i++) {\n const x = r.xScale(d.sortedX[i] as number);\n if (x < xMin || x > xMax) continue;\n let yv = y[i] as number;\n if (lerp) {\n const p = prev ? (prev[i] as number) : fallback;\n yv = p + (yv - p) * t;\n }\n const yp = r.yScale(yv);\n ctx.moveTo(x + 2.5, yp);\n ctx.arc(x, yp, 2.5, 0, Math.PI * 2);\n }\n ctx.fill();\n }\n ctx.restore();\n}\n\nexport { hitXY as hitScatter };\n","import { withAlpha } from \"../core/color\";\nimport { buildPath, hitXY } from \"./line\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY } from \"./registry\";\n\nexport function renderSparkline(r: RenderContext): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const ctx = r.ctx;\n const s = d.series[0];\n if (!s || d.sortedX.length === 0) return;\n const { path, firstX, lastX, lastY } = buildPath(r, s);\n const area = new Path2D(path);\n const base = r.plot.y + r.plot.h;\n area.lineTo(lastX, base);\n area.lineTo(firstX, base);\n area.closePath();\n ctx.fillStyle = withAlpha(s.color, 0.1);\n ctx.fill(area);\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n ctx.fillStyle = s.color;\n ctx.beginPath();\n ctx.arc(lastX, lastY, 2, 0, Math.PI * 2);\n ctx.fill();\n}\n\nexport { hitXY as hitSparkline };\n","import type { HoverInfo, NormalizedWaterfall, Rect } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nconst MAX_BAR_W = 48;\nconst GAP_RATIO = 0.25;\nconst RADIUS = 2;\n\nfunction barRect(\n r: RenderContext,\n d: NormalizedWaterfall,\n i: number,\n end: number,\n): Rect | null {\n const bar = d.bars[i];\n if (!bar) return null;\n const cats = d.bars.length;\n const slot = r.plot.w / Math.max(1, cats);\n const w = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n const x = r.plot.x + slot * i + (slot - w) / 2;\n const yTop = r.yScale(Math.max(bar.start, end));\n const yBot = r.yScale(Math.min(bar.start, end));\n return { x, y: yTop, w, h: Math.abs(yBot - yTop) };\n}\n\nfunction barColor(\n r: RenderContext,\n bar: { value: number; total: boolean },\n): string {\n if (bar.total) return r.theme.series[0] ?? r.theme.contextGray;\n return bar.value >= 0 ? r.theme.up : r.theme.down;\n}\n\nexport function renderWaterfall(r: RenderContext): void {\n if (r.data.kind !== \"waterfall\") return;\n const d = r.data;\n const ctx = r.ctx;\n const n = d.bars.length;\n const slot = r.plot.w / Math.max(1, n);\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h + 1);\n ctx.clip();\n\n // dashed connectors from each bar's end to the next bar's edge\n const barW = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n ctx.strokeStyle = r.theme.crosshair;\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n for (let i = 1; i < n; i++) {\n const prev = d.bars[i - 1];\n if (!prev) continue;\n const y = r.yScale(prev.end);\n ctx.moveTo(r.plot.x + slot * (i - 1) + (slot + barW) / 2, y);\n ctx.lineTo(r.plot.x + slot * i + (slot - barW) / 2, y);\n }\n ctx.stroke();\n ctx.setLineDash([]);\n\n for (let i = 0; i < n; i++) {\n const bar = d.bars[i];\n if (!bar) continue;\n const end = bar.total\n ? bar.end * r.t\n : bar.start + (bar.end - bar.start) * r.t;\n const rect = barRect(r, d, i, end);\n if (!rect) continue;\n ctx.fillStyle = barColor(r, bar);\n const rad = Math.min(RADIUS, rect.h / 2, rect.w / 2);\n ctx.beginPath();\n if (rect.h <= 0) {\n ctx.rect(rect.x, rect.y - 0.5, rect.w, 1);\n } else {\n ctx.roundRect(rect.x, rect.y, rect.w, rect.h, rad);\n }\n ctx.fill();\n }\n ctx.restore();\n}\n\nexport function hitWaterfall(\n r: RenderContext,\n px: number,\n _py: number,\n): HoverInfo | null {\n if (r.data.kind !== \"waterfall\") return null;\n const d = r.data;\n const n = d.bars.length;\n if (n === 0 || px < r.plot.x || px > r.plot.x + r.plot.w) return null;\n const i = Math.min(\n n - 1,\n Math.max(0, Math.floor(((px - r.plot.x) / r.plot.w) * n)),\n );\n const bar = d.bars[i];\n if (!bar) return null;\n const rect = barRect(r, d, i, bar.end);\n if (!rect) return null;\n return {\n kind: \"bar\",\n category: d.categories[i] ?? \"\",\n seriesIndex: 0,\n label: bar.total ? \"Total\" : \"Δ\",\n color: barColor(r, bar),\n value: bar.value,\n px: rect.x + rect.w / 2,\n py: rect.y,\n rect,\n };\n}\n","import type { Rect } from \"./types\";\n\n/**\n * Renderer seam. Canvas2D is the only backend for now; a WebGPU backend can\n * implement this contract later and interpret the same scene/marks.\n */\nexport interface RenderBackend {\n readonly kind: \"canvas2d\" | \"webgpu\";\n readonly width: number;\n readonly height: number;\n readonly plot: Rect;\n readonly main: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n resize(w: number, h: number): void;\n setPlot(plot: Rect): void;\n begin(): void;\n beginOverlay(): void;\n destroy(): void;\n}\n\nfunction makeCanvas(cssW: number, cssH: number): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n c.style.cssText =\n \"position:absolute;inset:0;width:100%;height:100%;display:block\";\n c.width = Math.max(1, Math.round(cssW));\n c.height = Math.max(1, Math.round(cssH));\n return c;\n}\n\nfunction setup2d(\n canvas: HTMLCanvasElement,\n settings: CanvasRenderingContext2DSettings,\n): CanvasRenderingContext2D {\n const ctx = canvas.getContext(\"2d\", settings);\n if (!ctx) throw new Error(\"resolvcharts: could not get 2d context\");\n return ctx;\n}\n\nexport class CanvasBackend implements RenderBackend {\n readonly kind = \"canvas2d\" as const;\n width: number;\n height: number;\n dpr: number;\n plot: Rect = { x: 0, y: 0, w: 0, h: 0 };\n readonly mainCanvas: HTMLCanvasElement;\n readonly overlayCanvas: HTMLCanvasElement;\n readonly main: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n private gridCache: HTMLCanvasElement | null = null;\n private gridCtx: CanvasRenderingContext2D | null = null;\n private container: HTMLElement;\n private settings: CanvasRenderingContext2DSettings;\n\n constructor(\n container: HTMLElement,\n cssW: number,\n cssH: number,\n settings: CanvasRenderingContext2DSettings = {},\n ) {\n this.container = container;\n this.settings = { alpha: true, ...settings };\n this.dpr = Math.max(1, window.devicePixelRatio || 1);\n this.width = cssW;\n this.height = cssH;\n this.mainCanvas = makeCanvas(cssW, cssH);\n this.overlayCanvas = makeCanvas(cssW, cssH);\n this.overlayCanvas.style.pointerEvents = \"none\";\n this.main = setup2d(this.mainCanvas, this.settings);\n this.overlay = setup2d(this.overlayCanvas, this.settings);\n container.append(this.mainCanvas, this.overlayCanvas);\n this.applySize();\n }\n\n private applySize(): void {\n const w = this.width * this.dpr;\n const h = this.height * this.dpr;\n for (const c of [this.mainCanvas, this.overlayCanvas]) {\n c.width = Math.max(1, Math.round(w));\n c.height = Math.max(1, Math.round(h));\n }\n for (const ctx of [this.main, this.overlay]) {\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n }\n if (this.gridCache) {\n this.gridCache.width = Math.max(1, Math.round(w));\n this.gridCache.height = Math.max(1, Math.round(h));\n this.gridCtx?.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n }\n }\n\n /** Static layer (grid/axes). Draw into returned ctx, then blitGrid(). */\n grid(): CanvasRenderingContext2D {\n if (!this.gridCache) {\n this.gridCache = document.createElement(\"canvas\");\n this.gridCache.width = Math.max(1, this.width * this.dpr);\n this.gridCache.height = Math.max(1, this.height * this.dpr);\n this.gridCtx = setup2d(this.gridCache, this.settings);\n this.gridCtx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n }\n const ctx = this.gridCtx as CanvasRenderingContext2D;\n ctx.clearRect(0, 0, this.width, this.height);\n return ctx;\n }\n\n blitGrid(): void {\n if (this.gridCache) {\n this.main.drawImage(this.gridCache, 0, 0, this.width, this.height);\n }\n }\n\n resize(w: number, h: number): void {\n this.dpr = Math.max(1, window.devicePixelRatio || 1);\n this.width = Math.max(1, w);\n this.height = Math.max(1, h);\n this.applySize();\n }\n\n setPlot(plot: Rect): void {\n this.plot = plot;\n }\n\n begin(): void {\n this.main.clearRect(0, 0, this.width, this.height);\n }\n\n beginOverlay(): void {\n this.overlay.clearRect(0, 0, this.width, this.height);\n }\n\n destroy(): void {\n this.mainCanvas.remove();\n this.overlayCanvas.remove();\n this.gridCache = null;\n this.gridCtx = null;\n void this.container;\n }\n}\n","import type { Scale } from \"./types\";\n\n/** @category Utilities\n * Linear scale from domain `[d0, d1]` to range `[r0, r1]`, with `invert`. */\nexport function linearScale(\n d0: number,\n d1: number,\n r0: number,\n r1: number,\n): Scale {\n const dd = d1 - d0 || 1;\n const dr = r1 - r0;\n const fn = ((v: number) => r0 + ((v - d0) / dd) * dr) as Scale;\n fn.invert = (px: number) => d0 + ((px - r0) / dr) * dd;\n fn.domain = [d0, d1];\n fn.range = [r0, r1];\n return fn;\n}\n\n/** @category Utilities\n * `[min, max]` of `values`; degenerate inputs get a sane fallback domain. */\nexport function extent(values: ArrayLike<number>): [number, number] {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i] as number;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (min === Infinity) return [0, 1];\n if (min === max)\n return min === 0\n ? [0, 1]\n : [min - Math.abs(min) * 0.1, max + Math.abs(max) * 0.1];\n return [min, max];\n}\n\n/** @category Utilities\n * Pad a domain by 5% on each end; `includeZero` anchors the axis at 0. */\nexport function padDomain(\n min: number,\n max: number,\n includeZero = false,\n): [number, number] {\n let lo = includeZero ? Math.min(0, min) : min;\n let hi = includeZero ? Math.max(0, max) : max;\n if (lo === hi) {\n hi = lo + 1;\n }\n const pad = (hi - lo) * 0.05;\n if (!includeZero) {\n lo -= pad;\n hi += pad;\n } else {\n if (lo < 0) lo -= pad;\n if (hi > 0) hi += pad;\n }\n return [lo, hi];\n}\n\n/** @category Utilities\n * Pin domain ends — each defined bound overrides the fitted value. */\nexport function boundDomain(\n dom: [number, number],\n min?: number,\n max?: number,\n): [number, number] {\n return [min ?? dom[0], max ?? dom[1]];\n}\n","type FrameFn = (now: number) => boolean;\n\nconst raf: (cb: (t: number) => void) => number =\n typeof requestAnimationFrame === \"function\"\n ? (cb) => requestAnimationFrame(cb)\n : (cb) => setTimeout(() => cb(Date.now()), 16) as unknown as number;\n\nconst caf: (id: number) => void =\n typeof cancelAnimationFrame === \"function\"\n ? (id) => cancelAnimationFrame(id)\n : (id) => clearTimeout(id);\n\n/**\n * Shared frame scheduler. Registered functions run once per animation frame\n * while they return true; the loop self-terminates when idle so charts burn\n * no CPU at rest.\n */\nexport class Scheduler {\n private items = new Set<FrameFn>();\n private id: number | null = null;\n\n add(fn: FrameFn): void {\n this.items.add(fn);\n if (this.id === null) {\n this.id = raf(this.tick);\n }\n }\n\n remove(fn: FrameFn): void {\n this.items.delete(fn);\n }\n\n private tick = (now: number): void => {\n this.id = null;\n for (const fn of [...this.items]) {\n if (!fn(now)) this.items.delete(fn);\n }\n if (this.items.size > 0) {\n this.id = raf(this.tick);\n }\n };\n\n destroy(): void {\n this.items.clear();\n if (this.id !== null) {\n caf(this.id);\n this.id = null;\n }\n }\n}\n\nexport const sharedScheduler: Scheduler = new Scheduler();\n\nexport const easeOutCubic: (t: number) => number = (t) => 1 - (1 - t) ** 3;\n","import type { ChartOptions, ThemeTokens } from \"./types\";\n\nconst FONT = 'Inter, system-ui, -apple-system, \"Segoe UI\", sans-serif';\n\n/** Built-in light theme.\n * @category Theming\n */\nexport const lightTheme: ThemeTokens = {\n bg: \"#ffffff\",\n text: \"#1f1f1f\",\n textMuted: \"#8a8a8a\",\n grid: \"rgba(0,0,0,0.07)\",\n axisBaseline: \"rgba(0,0,0,0.15)\",\n crosshair: \"rgba(0,0,0,0.25)\",\n series: [\"#0070f3\"],\n contextGray: \"#b0b0b0\",\n up: \"#0e9f6e\",\n down: \"#e5484d\",\n tooltipBg: \"#ffffff\",\n tooltipText: \"#1f1f1f\",\n tooltipMuted: \"#8a8a8a\",\n tooltipBorder: \"rgba(0,0,0,0.08)\",\n tooltipShadow: \"0 4px 14px rgba(0,0,0,0.08)\",\n fontFamily: FONT,\n};\n\n/** Built-in dark theme.\n * @category Theming\n */\nexport const darkTheme: ThemeTokens = {\n bg: \"#0a0a0a\",\n text: \"#ededed\",\n textMuted: \"#8a8a8a\",\n grid: \"rgba(255,255,255,0.07)\",\n axisBaseline: \"rgba(255,255,255,0.18)\",\n crosshair: \"rgba(255,255,255,0.3)\",\n series: [\"#3b9dff\"],\n contextGray: \"#5c5c5c\",\n up: \"#34c98e\",\n down: \"#f2555a\",\n tooltipBg: \"#161616\",\n tooltipText: \"#ededed\",\n tooltipMuted: \"#8a8a8a\",\n tooltipBorder: \"rgba(255,255,255,0.1)\",\n tooltipShadow: \"0 4px 14px rgba(0,0,0,0.4)\",\n fontFamily: FONT,\n};\n\nexport const categoricalLight: string[] = [\n \"#0070f3\",\n \"#0e9f6e\",\n \"#8e4ec6\",\n \"#f5a623\",\n];\nexport const categoricalDark: string[] = [\n \"#3b9dff\",\n \"#34c98e\",\n \"#a97ef0\",\n \"#f5b84d\",\n];\n\n/** Merge a theme option (`\"light\" | \"dark\" | partial tokens`) into full {@link ThemeTokens}.\n * @category Theming\n */\nexport function resolveTheme(\n opt: ChartOptions[\"theme\"],\n accent: string | undefined,\n): ThemeTokens {\n const base =\n opt === \"dark\"\n ? { ...darkTheme, series: [...categoricalDark] }\n : opt === \"light\" || opt === undefined\n ? { ...lightTheme, series: [...categoricalLight] }\n : { ...lightTheme, series: [...categoricalLight], ...opt };\n if (accent) base.series[0] = accent;\n return base;\n}\n\nexport function seriesColor(\n theme: ThemeTokens,\n index: number,\n explicit: string | undefined,\n): string {\n if (explicit) return explicit;\n return theme.series[index % theme.series.length] as string;\n}\n","const STEPS = [1, 2, 2.5, 5, 10];\n\nfunction niceStep(range: number, target: number): number {\n const raw = Math.abs(range) / Math.max(1, target);\n if (!Number.isFinite(raw) || raw === 0) return 1;\n const pow = 10 ** Math.floor(Math.log10(raw));\n const norm = raw / pow;\n let step = 10;\n for (const s of STEPS) {\n if (norm <= s) {\n step = s;\n break;\n }\n }\n return step * pow;\n}\n\n/** \"Nice\" round tick values covering `[min, max]`, ~`target` count.\n * @category Utilities\n */\nexport function computeTicks(min: number, max: number, target = 5): number[] {\n if (!(min < max)) return [min];\n const step = niceStep(max - min, target);\n const lo = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n for (let v = lo; v <= max + step * 1e-9; v += step) {\n ticks.push(Math.abs(v) < step * 1e-9 ? 0 : v);\n if (ticks.length > 1000) break;\n }\n return ticks;\n}\n","import type { ThemeTokens } from \"./types\";\n\nexport class Tooltip {\n readonly el: HTMLDivElement;\n private theme: ThemeTokens;\n\n constructor(container: HTMLElement, theme: ThemeTokens) {\n this.theme = theme;\n this.el = document.createElement(\"div\");\n this.el.style.cssText = [\n \"position:absolute\",\n \"pointer-events:none\",\n `background:${theme.tooltipBg}`,\n `border:1px solid ${theme.tooltipBorder}`,\n `box-shadow:${theme.tooltipShadow}`,\n \"border-radius:6px\",\n \"padding:6px 10px\",\n `font:12px ${theme.fontFamily}`,\n `color:${theme.tooltipText}`,\n \"white-space:nowrap\",\n \"opacity:0\",\n \"transition:opacity 80ms ease-out\",\n \"z-index:1\",\n \"left:0\",\n \"top:0\",\n ].join(\";\");\n container.appendChild(this.el);\n }\n\n setTheme(theme: ThemeTokens): void {\n this.theme = theme;\n const s = this.el.style;\n s.background = theme.tooltipBg;\n s.border = `1px solid ${theme.tooltipBorder}`;\n s.boxShadow = theme.tooltipShadow;\n s.color = theme.tooltipText;\n }\n\n show(\n x: number,\n y: number,\n rows: { color?: string; label: string; value: string }[],\n title?: string,\n ): void {\n const el = this.el;\n el.textContent = \"\";\n if (title) {\n const t = document.createElement(\"div\");\n t.style.cssText = `font-weight:600;margin-bottom:2px;color:${this.theme.tooltipText}`;\n t.textContent = title;\n el.appendChild(t);\n }\n for (const r of rows) {\n const row = document.createElement(\"div\");\n row.style.cssText =\n \"display:flex;align-items:center;gap:6px;line-height:1.5\";\n if (r.color) {\n const sw = document.createElement(\"span\");\n sw.style.cssText = `width:8px;height:2px;background:${r.color};display:inline-block;border-radius:1px`;\n row.appendChild(sw);\n }\n const lab = document.createElement(\"span\");\n lab.style.color = this.theme.tooltipMuted;\n lab.textContent = r.label;\n const val = document.createElement(\"span\");\n val.style.cssText = \"font-weight:600;margin-left:auto;padding-left:12px\";\n val.textContent = r.value;\n row.append(lab, val);\n el.appendChild(row);\n }\n el.style.opacity = \"1\";\n this.position(x, y);\n }\n\n private position(x: number, y: number): void {\n const el = this.el;\n const parent = el.parentElement;\n if (!parent) return;\n const pw = parent.clientWidth;\n const ph = parent.clientHeight;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n let left = x + 12;\n let top = y + 12;\n if (left + w > pw - 4) left = x - w - 12;\n if (top + h > ph - 4) top = y - h - 12;\n el.style.left = `${Math.max(0, left)}px`;\n el.style.top = `${Math.max(0, top)}px`;\n }\n\n hide(): void {\n this.el.style.opacity = \"0\";\n }\n\n destroy(): void {\n this.el.remove();\n }\n}\n","import { hitBar, renderBar } from \"../charts/bar\";\nimport { hitBaseline, renderBaseline } from \"../charts/baseline\";\nimport { hitCandle, renderCandles } from \"../charts/candle\";\nimport { hitCombo, renderCombo } from \"../charts/combo\";\nimport { hitDonut, renderDonut } from \"../charts/donut\";\nimport { FLOW_RIPPLE, hitXY, renderLine } from \"../charts/line\";\nimport type { RenderContext } from \"../charts/registry\";\nimport { hitScatter, renderScatter } from \"../charts/scatter\";\nimport { hitSparkline, renderSparkline } from \"../charts/sparkline\";\nimport { hitWaterfall, renderWaterfall } from \"../charts/waterfall\";\nimport { CanvasBackend } from \"./canvas\";\nimport { withAlpha } from \"./color\";\nimport { formatSI } from \"./format\";\nimport { boundDomain, extent, linearScale, padDomain } from \"./scales\";\nimport { easeOutCubic, sharedScheduler } from \"./scheduler\";\nimport { resolveTheme, seriesColor } from \"./theme\";\nimport { computeTicks } from \"./ticks\";\nimport { Tooltip } from \"./tooltip\";\nimport type {\n CategoryData,\n ChartData,\n ChartOptions,\n ChartType,\n DonutData,\n HoverInfo,\n NormalizedData,\n NormalizedXY,\n OHLCData,\n Rect,\n ThemeTokens,\n WaterfallBar,\n WaterfallData,\n XYData,\n} from \"./types\";\n\ninterface TypeModule {\n render: (r: RenderContext) => void;\n hit?: (r: RenderContext, px: number, py: number) => HoverInfo | null;\n axes: boolean;\n defaultTooltip: boolean;\n}\n\nconst MODULES: Record<ChartType, TypeModule> = {\n line: {\n render: (r) => renderLine(r, false),\n hit: (r, px) => hitXY(r, px),\n axes: true,\n defaultTooltip: true,\n },\n area: {\n render: (r) => renderLine(r, true),\n hit: (r, px) => hitXY(r, px),\n axes: true,\n defaultTooltip: true,\n },\n scatter: {\n render: renderScatter,\n hit: (r, px) => hitScatter(r, px),\n axes: true,\n defaultTooltip: true,\n },\n bar: { render: renderBar, hit: hitBar, axes: true, defaultTooltip: true },\n combo: {\n render: renderCombo,\n hit: (r, px) => hitCombo(r, px),\n axes: true,\n defaultTooltip: true,\n },\n sparkline: {\n render: renderSparkline,\n hit: (r, px) => hitSparkline(r, px),\n axes: false,\n defaultTooltip: false,\n },\n donut: {\n render: renderDonut,\n hit: hitDonut,\n axes: false,\n defaultTooltip: true,\n },\n candle: {\n render: (r) => renderCandles(r, false),\n hit: (r, px) => hitCandle(r, px),\n axes: true,\n defaultTooltip: true,\n },\n ohlc: {\n render: (r) => renderCandles(r, true),\n hit: (r, px) => hitCandle(r, px),\n axes: true,\n defaultTooltip: true,\n },\n waterfall: {\n render: renderWaterfall,\n hit: hitWaterfall,\n axes: true,\n defaultTooltip: true,\n },\n baseline: {\n render: renderBaseline,\n hit: (r, px) => hitBaseline(r, px),\n axes: true,\n defaultTooltip: true,\n },\n};\n\nconst LABEL_H = 20;\nconst GUTTER_PAD = 10;\n/** chart types with a WebGPU series path */\nconst GPU_KIND: Partial<Record<ChartType, \"line\" | \"area\" | \"points\">> = {\n line: \"line\",\n area: \"area\",\n sparkline: \"line\",\n scatter: \"points\",\n};\n/** points retained beyond the window's left edge so they slide off-screen instead of vanishing mid-plot */\nconst EDGE_KEEP = 3;\n/** default point count at which `renderer: \"auto\"` engages the GPU path */\nconst GPU_THRESHOLD = 100_000;\n\n/** Chart instance. Create via {@link createChart}.\n * @category Charts\n */\nexport class Chart {\n readonly el: HTMLElement;\n readonly options: ChartOptions;\n private theme: ThemeTokens;\n private backend: CanvasBackend;\n private tooltip: Tooltip | null = null;\n private mod: TypeModule;\n private data: NormalizedData;\n private ro: ResizeObserver | null = null;\n private rect: DOMRect | null = null;\n private pointer: { x: number; y: number } | null = null;\n private hover: HoverInfo | null = null;\n private animStart: number | null = null;\n private animDur = 0;\n private view: { x: [number, number]; y: [number, number] } = {\n x: [0, 1],\n y: [0, 1],\n };\n private viewFrom: { x: [number, number]; y: [number, number] } | null = null;\n private viewTo: { x: [number, number]; y: [number, number] } = {\n x: [0, 1],\n y: [0, 1],\n };\n private reduced = false;\n private destroyed = false;\n private pendingView = false;\n private gpu: import(\"../gpu/series\").GpuSeries | null = null;\n private gpuInit = false;\n /** bumped whenever xy data is replaced or reordered — triggers GPU re-upload */\n private dataRev = 0;\n private lastAppendAt = 0;\n private estInterval = 400;\n private onScroll = (): void => {\n this.rect = null;\n };\n private frame = (now: number): boolean => {\n if (this.destroyed) return false;\n if (this.pendingView) {\n // append() folds layout + animation restart into the frame so bursts\n // of appends share one domain computation per rendered frame\n this.pendingView = false;\n this.viewFrom = {\n x: [this.view.x[0], this.view.x[1]],\n y: [this.view.y[0], this.view.y[1]],\n };\n this.viewTo = this.layout();\n this.animDur = this.resolveAnimDur();\n this.animStart = -1;\n }\n let more = false;\n if (this.animStart !== null) {\n if (this.animStart === -1) this.animStart = now;\n const raw =\n this.animDur <= 0\n ? 1\n : Math.min(1, (now - this.animStart) / this.animDur);\n const eased = easeOutCubic(raw);\n this.lerpView(eased);\n this.render(eased);\n if (raw < 1) more = true;\n else this.animStart = null;\n }\n if (this.pointer) {\n this.applyHover(this.pointer.x, this.pointer.y);\n this.pointer = null;\n }\n return more;\n };\n\n constructor(el: HTMLElement, options: ChartOptions) {\n this.el = el;\n this.options = options;\n this.theme = resolveTheme(options.theme, options.accent);\n this.mod = MODULES[options.type];\n const style = getComputedStyle(el);\n if (style.position === \"static\") el.style.position = \"relative\";\n if (options.height) el.style.height = `${options.height}px`;\n const w = el.clientWidth || 320;\n const h = el.clientHeight || (options.type === \"sparkline\" ? 32 : 240);\n this.backend = new CanvasBackend(el, w, h, options.canvas);\n this.reduced =\n typeof matchMedia === \"function\" &&\n matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n const wantTooltip = options.tooltip ?? this.mod.defaultTooltip;\n if (wantTooltip) this.tooltip = new Tooltip(el, this.theme);\n this.data = this.normalize(options.data, null);\n this.maybeInitGpu();\n this.bindEvents();\n const dom = this.layout();\n this.view = { x: [...dom.x], y: [...dom.y] };\n this.viewTo = { x: [...dom.x], y: [...dom.y] };\n this.startAnimation(dom);\n }\n\n /**\n * Lazily acquire the WebGPU backend. `\"webgpu\"` attaches unconditionally;\n * `\"auto\"` waits until the xy point count crosses `gpuThreshold` — small\n * charts never pay adapter/device acquisition.\n */\n private maybeInitGpu(): void {\n if (this.gpu || this.gpuInit || this.destroyed) return;\n if (!GPU_KIND[this.options.type]) return;\n const r = this.options.renderer ?? \"auto\";\n if (r !== \"auto\" && r !== \"webgpu\") return;\n if (r === \"auto\") {\n const d = this.data;\n const pts =\n d.kind === \"xy\" ? d.sortedX.length * Math.max(1, d.series.length) : 0;\n if (pts < (this.options.gpuThreshold ?? GPU_THRESHOLD)) return;\n }\n this.gpuInit = true;\n void import(\"../gpu/series\").then(({ GpuSeries }) =>\n GpuSeries.create(this.options.gpu).then((g) => {\n if (!g || this.destroyed) {\n g?.destroy();\n return;\n }\n g.setSize(this.backend.width, this.backend.height, this.backend.dpr);\n this.backend.overlayCanvas.before(g.canvas);\n this.gpu = g;\n sharedScheduler.add((now) => {\n this.render(1);\n void now;\n return false;\n });\n }),\n );\n }\n\n private normalize(\n data: ChartData,\n prev: NormalizedData | null,\n ): NormalizedData {\n const t = this.options.type;\n if (t === \"candle\" || t === \"ohlc\") {\n const d = data as OHLCData;\n const n = d.candles.length;\n let idx: Uint32Array | null = null;\n for (let i = 1; i < n; i++) {\n if ((d.candles[i]?.x ?? i) < (d.candles[i - 1]?.x ?? i - 1)) {\n idx = new Uint32Array(n);\n for (let k = 0; k < n; k++) idx[k] = k;\n idx.sort((a, b) => (d.candles[a]?.x ?? 0) - (d.candles[b]?.x ?? 0));\n break;\n }\n }\n const x = new Float64Array(n);\n const open = new Float64Array(n);\n const high = new Float64Array(n);\n const low = new Float64Array(n);\n const close = new Float64Array(n);\n let hasVol = false;\n const volume = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const c = d.candles[idx ? (idx[i] as number) : i];\n x[i] = c?.x ?? i;\n open[i] = c?.open ?? 0;\n high[i] = c?.high ?? 0;\n low[i] = c?.low ?? 0;\n close[i] = c?.close ?? 0;\n volume[i] = c?.volume ?? 0;\n if (c?.volume != null && c.volume > 0) hasVol = true;\n }\n return {\n kind: \"ohlc\",\n x,\n open,\n high,\n low,\n close,\n volume: hasVol ? volume : null,\n };\n }\n if (t === \"waterfall\") {\n const d = data as WaterfallData;\n const totals = new Set(d.totals ?? []);\n let run = 0;\n const bars: WaterfallBar[] = d.categories.map((_, i) => {\n const v = d.values[i] ?? 0;\n if (totals.has(i)) {\n const bar: WaterfallBar = { start: 0, end: v, value: v, total: true };\n run = v;\n return bar;\n }\n const bar: WaterfallBar = {\n start: run,\n end: run + v,\n value: v,\n total: false,\n };\n run += v;\n return bar;\n });\n return { kind: \"waterfall\", categories: [...d.categories], bars };\n }\n if (t === \"donut\") {\n const d = data as DonutData;\n const slices = d.slices.map((s, i) => ({\n label: s.label,\n value: s.value,\n color: seriesColor(this.theme, i, s.color),\n }));\n const total = slices.reduce((a, s) => a + Math.max(0, s.value), 0);\n return { kind: \"donut\", slices, total };\n }\n if (t === \"bar\" || t === \"combo\") {\n const d = data as CategoryData;\n const prevSeries = prev?.kind === \"category\" ? prev.series : [];\n return {\n kind: \"category\",\n categories: [...d.categories],\n series: d.series.map((s, i) => ({\n label: s.label ?? `Series ${i + 1}`,\n color: seriesColor(this.theme, i, s.color),\n kind: s.kind ?? \"column\",\n values: Float64Array.from(s.values),\n prevValues: prevSeries[i]?.values ?? null,\n })),\n };\n }\n const d = data as XYData;\n const xRaw = Float64Array.from(d.x);\n const n = xRaw.length;\n // already-sorted x (the common case) skips the O(n log n) index sort\n let idx: Uint32Array | null = null;\n for (let i = 1; i < n; i++) {\n if ((xRaw[i] as number) < (xRaw[i - 1] as number)) {\n idx = new Uint32Array(n);\n for (let k = 0; k < n; k++) idx[k] = k;\n idx.sort((a, b) => (xRaw[a] as number) - (xRaw[b] as number));\n break;\n }\n }\n const sortedX = idx ? new Float64Array(n) : xRaw;\n if (idx) {\n for (let i = 0; i < n; i++) sortedX[i] = xRaw[idx[i] as number] as number;\n }\n const prevSeries = prev?.kind === \"xy\" ? prev.series : [];\n return {\n kind: \"xy\",\n sortedX,\n series: d.series.map((s, i) => {\n const y = new Float64Array(n);\n const src = s.y;\n if (idx) {\n for (let k = 0; k < n; k++) y[k] = src[idx[k] as number] as number;\n } else {\n for (let k = 0; k < n; k++) y[k] = src[k] as number;\n }\n return {\n label: s.label ?? `Series ${i + 1}`,\n color: seriesColor(this.theme, i, s.color),\n y,\n prevY: prevSeries[i]?.y ?? null,\n pathCache: null,\n };\n }),\n };\n }\n\n private bindEvents(): void {\n this.el.addEventListener(\"pointermove\", this.onMove, { passive: true });\n this.el.addEventListener(\"pointerleave\", this.onLeave, { passive: true });\n window.addEventListener(\"scroll\", this.onScroll, true);\n if (typeof ResizeObserver === \"function\") {\n this.ro = new ResizeObserver(() => this.resize());\n this.ro.observe(this.el);\n }\n }\n\n private onMove = (e: PointerEvent): void => {\n if (!this.rect) this.rect = this.el.getBoundingClientRect();\n this.pointer = {\n x: e.clientX - this.rect.left,\n y: e.clientY - this.rect.top,\n };\n sharedScheduler.add(this.frame);\n };\n\n private onLeave = (): void => {\n this.pointer = null;\n if (this.hover) {\n this.hover = null;\n this.backend.beginOverlay();\n this.tooltip?.hide();\n this.options.onHover?.(null);\n }\n };\n\n private layout(): { x: [number, number]; y: [number, number] } {\n const w = this.backend.width;\n const h = this.backend.height;\n const mod = this.mod;\n const dom = this.domains();\n if (!mod.axes) {\n this.backend.setPlot({ x: 2, y: 2, w: w - 4, h: h - 4 });\n return dom;\n }\n const ctx = this.backend.main;\n const fmtY = this.options.labels?.y ?? formatSI;\n const plotH = Math.max(1, h - 8 - LABEL_H);\n const yTicks =\n this.data.kind === \"donut\"\n ? []\n : computeTicks(dom.y[0], dom.y[1], Math.max(3, Math.floor(plotH / 48)));\n let gutter = 0;\n if (yTicks.length) {\n ctx.font = `11px ${this.theme.fontFamily}`;\n for (const t of yTicks) {\n gutter = Math.max(gutter, ctx.measureText(fmtY(t)).width);\n }\n gutter += GUTTER_PAD;\n }\n const plot: Rect = {\n x: gutter,\n y: 8,\n w: Math.max(1, w - gutter - 8),\n h: plotH,\n };\n this.backend.setPlot(plot);\n return dom;\n }\n\n private domains(): { x: [number, number]; y: [number, number] } {\n const d = this.data;\n if (d.kind === \"xy\") {\n const nx = d.sortedX.length;\n const vis = this.options.window ?? this.options.maxPoints;\n // kept edge points stay in the buffer but outside the visible domain\n const x0 = vis != null && nx > vis ? nx - vis : 0;\n // sortedX is monotonic — the extent is just first/last\n const x: [number, number] =\n nx > 0\n ? [d.sortedX[x0] as number, d.sortedX[nx - 1] as number]\n : [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (const s of d.series) {\n const y = s.y;\n for (let i = Math.min(x0, y.length); i < y.length; i++) {\n const v = y[i] as number;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n if (min === Infinity) {\n min = 0;\n max = 1;\n }\n const includeZero =\n this.options.type === \"area\" || this.options.type === \"sparkline\";\n return {\n x,\n y: this.yDomain(padDomain(min, max, includeZero)),\n };\n }\n if (d.kind === \"category\") {\n let min = Infinity;\n let max = -Infinity;\n if (this.options.stacked) {\n for (let ci = 0; ci < d.categories.length; ci++) {\n let pos = 0;\n let neg = 0;\n for (const s of d.series) {\n if (s.kind !== \"column\") continue;\n const v = s.values[ci] ?? 0;\n if (v >= 0) pos += v;\n else neg += v;\n }\n min = Math.min(min, neg);\n max = Math.max(max, pos);\n }\n for (const s of d.series) {\n if (s.kind === \"column\") continue;\n const e = extent(s.values);\n min = Math.min(min, e[0]);\n max = Math.max(max, e[1]);\n }\n } else {\n for (const s of d.series) {\n const e = extent(s.values);\n min = Math.min(min, e[0]);\n max = Math.max(max, e[1]);\n }\n }\n if (min === Infinity) {\n min = 0;\n max = 1;\n }\n return {\n x: [0, d.categories.length],\n y: this.yDomain(padDomain(min, max, true)),\n };\n }\n if (d.kind === \"ohlc\") {\n const x = extent(d.x);\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < d.x.length; i++) {\n const lo = d.low[i] as number;\n const hi = d.high[i] as number;\n if (lo < min) min = lo;\n if (hi > max) max = hi;\n }\n if (min === Infinity) {\n min = 0;\n max = 1;\n }\n return { x, y: this.yDomain(padDomain(min, max)) };\n }\n if (d.kind === \"waterfall\") {\n let min = Infinity;\n let max = -Infinity;\n for (const b of d.bars) {\n min = Math.min(min, b.start, b.end);\n max = Math.max(max, b.start, b.end);\n }\n if (min === Infinity) {\n min = 0;\n max = 1;\n }\n return {\n x: [0, d.bars.length],\n y: this.yDomain(padDomain(min, max, true)),\n };\n }\n return { x: [0, 1], y: this.yDomain([0, 1]) };\n }\n\n private yDomain(y: [number, number]): [number, number] {\n return boundDomain(y, this.options.yMin, this.options.yMax);\n }\n\n private lerpView(eased: number): void {\n const f = this.viewFrom;\n const to = this.viewTo;\n const v = this.view;\n if (!f || eased >= 1) {\n v.x[0] = to.x[0];\n v.x[1] = to.x[1];\n v.y[0] = to.y[0];\n v.y[1] = to.y[1];\n return;\n }\n v.x[0] = f.x[0] + (to.x[0] - f.x[0]) * eased;\n v.x[1] = f.x[1] + (to.x[1] - f.x[1]) * eased;\n v.y[0] = f.y[0] + (to.y[0] - f.y[0]) * eased;\n v.y[1] = f.y[1] + (to.y[1] - f.y[1]) * eased;\n }\n\n private makeScales(): {\n xScale: ReturnType<typeof linearScale>;\n yScale: ReturnType<typeof linearScale>;\n } {\n const plot = this.backend.plot;\n const dom = this.view;\n const volBand =\n this.data.kind === \"ohlc\" && this.data.volume ? plot.h * 0.18 : 0;\n return {\n xScale: linearScale(dom.x[0], dom.x[1], plot.x, plot.x + plot.w),\n yScale: linearScale(\n dom.y[0],\n dom.y[1],\n plot.y + plot.h - volBand,\n plot.y,\n ),\n };\n }\n\n private renderContext(t: number, scales = this.makeScales()): RenderContext {\n const { xScale, yScale } = scales;\n return {\n backend: this.backend,\n ctx: this.backend.main,\n plot: this.backend.plot,\n theme: this.theme,\n opts: this.options,\n data: this.data,\n xScale,\n yScale,\n t,\n };\n }\n\n private drawStatic(scales = this.makeScales()): void {\n if (!this.mod.axes) return;\n const ctx = this.backend.grid();\n const plot = this.backend.plot;\n const { xScale, yScale } = scales;\n const fmtY = this.options.labels?.y ?? formatSI;\n ctx.font = `11px ${this.theme.fontFamily}`;\n ctx.fillStyle = this.theme.textMuted;\n\n const showGrid = this.options.grid ?? true;\n const yTicks = computeTicks(\n yScale.domain[0],\n yScale.domain[1],\n Math.max(3, Math.floor(plot.h / 48)),\n );\n if (showGrid) {\n ctx.strokeStyle = this.theme.grid;\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (const t of yTicks) {\n const y = Math.round(yScale(t)) + 0.5;\n ctx.moveTo(plot.x, y);\n ctx.lineTo(plot.x + plot.w, y);\n }\n ctx.stroke();\n }\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n for (const t of yTicks) {\n ctx.fillText(fmtY(t), plot.x - GUTTER_PAD, yScale(t));\n }\n\n ctx.textBaseline = \"top\";\n const d = this.data;\n if (d.kind === \"category\" || d.kind === \"waterfall\") {\n ctx.textAlign = \"center\";\n const cats = d.categories;\n const n = d.kind === \"category\" ? cats.length : d.bars.length;\n const slot = plot.w / Math.max(1, n);\n for (let i = 0; i < n; i++) {\n ctx.fillText(\n cats[i] ?? \"\",\n plot.x + slot * (i + 0.5),\n plot.y + plot.h + 6,\n );\n }\n } else if (d.kind === \"xy\" || d.kind === \"ohlc\") {\n const fmtX = this.options.labels?.x ?? formatSI;\n const xTicks = computeTicks(\n xScale.domain[0],\n xScale.domain[1],\n Math.max(3, Math.floor(plot.w / 90)),\n );\n for (const t of xTicks) {\n const px = xScale(t);\n ctx.textAlign =\n px < plot.x + 24\n ? \"left\"\n : px > plot.x + plot.w - 24\n ? \"right\"\n : \"center\";\n ctx.fillText(fmtX(t), px, plot.y + plot.h + 6);\n }\n }\n if (this.options.type === \"bar\" || this.options.type === \"combo\") {\n const base = Math.round(yScale(0)) + 0.5;\n if (base >= plot.y && base <= plot.y + plot.h + 1) {\n ctx.strokeStyle = this.theme.axisBaseline;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.w, base);\n ctx.stroke();\n }\n }\n this.backend.blitGrid();\n }\n\n private render(t: number): void {\n this.backend.begin();\n const scales = this.makeScales();\n this.drawStatic(scales);\n if (this.gpu) this.gpuRender(t, scales);\n else this.mod.render(this.renderContext(t, scales));\n if (this.hover) this.drawHover(this.hover, scales.yScale);\n }\n\n /**\n * Series rasterization on the GPU; grid/labels/hover stay on Canvas2D.\n * Raw data lives in GPU buffers — the per-frame cost is uniform writes +\n * instanced draws, with compute decimation above the density threshold.\n */\n private gpuRender(\n t: number,\n scales: {\n xScale: ReturnType<typeof linearScale>;\n yScale: ReturnType<typeof linearScale>;\n },\n ): void {\n const g = this.gpu;\n const d = this.data;\n const kind = GPU_KIND[this.options.type];\n if (!g || g.unavailable || !kind || d.kind !== \"xy\") {\n this.mod.render(this.renderContext(t, scales));\n return;\n }\n g.syncData(d, this.dataRev);\n const view = { x: scales.xScale.domain, y: scales.yScale.domain };\n const flow = this.options.flow ? FLOW_RIPPLE : 0;\n g.begin(this.backend.plot, t, flow);\n for (let i = 0; i < d.series.length; i++) {\n const s = d.series[i];\n if (!s) continue;\n if (kind === \"points\") {\n g.points(i, s.color, 2.5, 0.65, view);\n continue;\n }\n if (kind === \"area\") {\n g.area(i, s.color, Math.max(0, scales.yScale.domain[0]), view);\n }\n g.line(i, s.color, 2, view);\n }\n g.end();\n }\n\n private drawHover(info: HoverInfo, yScale = this.makeScales().yScale): void {\n const o = this.backend.overlay;\n const plot = this.backend.plot;\n this.backend.beginOverlay();\n if (info.kind === \"point\" || info.kind === \"candle\") {\n o.strokeStyle = this.theme.crosshair;\n o.lineWidth = 1;\n o.beginPath();\n const x = Math.round(info.px) + 0.5;\n o.moveTo(x, plot.y);\n o.lineTo(x, plot.y + plot.h);\n o.stroke();\n const d = this.data;\n if (info.kind === \"point\" && (d.kind === \"xy\" || d.kind === \"category\")) {\n for (const v of info.values) {\n const s = d.series.find(\n (s2) => s2.label === v.label && s2.color === v.color,\n );\n const yv = s\n ? \"y\" in s\n ? s.y[info.index]\n : s.values[info.index]\n : v.y;\n o.fillStyle = v.color;\n o.strokeStyle = this.theme.bg;\n o.lineWidth = 2;\n o.beginPath();\n o.arc(info.px, yScale(yv as number), 4, 0, Math.PI * 2);\n o.fill();\n o.stroke();\n }\n }\n } else if (info.kind === \"bar\") {\n o.fillStyle = withAlpha(this.theme.text, 0.12);\n o.fillRect(info.rect.x, info.rect.y, info.rect.w, info.rect.h);\n } else {\n o.fillStyle = withAlpha(info.color, 0.25);\n const d = this.data;\n if (d.kind === \"donut\") {\n const cx = plot.x + plot.w / 2;\n const cy = plot.y + plot.h / 2;\n const rOuter = Math.min(plot.w, plot.h) / 2;\n const rInner = rOuter * 0.65;\n let a = -Math.PI / 2;\n for (let i = 0; i < d.slices.length; i++) {\n const s = d.slices[i];\n if (!s) continue;\n const frac = d.total > 0 ? s.value / d.total : 0;\n const a1 = a + frac * Math.PI * 2;\n if (i === info.index) {\n o.beginPath();\n o.arc(cx, cy, rOuter, a, a1);\n o.arc(cx, cy, rInner, a1, a, true);\n o.closePath();\n o.fill();\n }\n a = a1;\n }\n }\n }\n }\n\n private applyHover(px: number, py: number): void {\n const hit = this.mod.hit;\n if (!hit) return;\n const info = hit(this.renderContext(1), px, py);\n if (!info) {\n if (this.hover) {\n this.hover = null;\n this.backend.beginOverlay();\n this.tooltip?.hide();\n this.options.onHover?.(null);\n }\n return;\n }\n this.hover = info;\n this.drawHover(info);\n this.options.onHover?.(info);\n if (!this.tooltip) return;\n const fmtY = this.options.labels?.y ?? formatSI;\n if (info.kind === \"point\") {\n const fmtX = this.options.labels?.x ?? formatSI;\n this.tooltip.show(\n info.px,\n info.py,\n info.values.map((v) => ({\n color: v.color,\n label: v.label,\n value: fmtY(v.y),\n })),\n info.title ?? fmtX(info.x),\n );\n } else if (info.kind === \"bar\") {\n this.tooltip.show(\n info.px,\n info.py,\n [{ color: info.color, label: info.label, value: fmtY(info.value) }],\n info.category,\n );\n } else if (info.kind === \"candle\") {\n const fmtX = this.options.labels?.x ?? formatSI;\n this.tooltip.show(\n info.px,\n info.py,\n [\n { label: \"Open\", value: fmtY(info.open) },\n { label: \"High\", value: fmtY(info.high) },\n { label: \"Low\", value: fmtY(info.low) },\n { label: \"Close\", value: fmtY(info.close) },\n ],\n fmtX(info.x),\n );\n } else {\n this.tooltip.show(\n info.px,\n info.py,\n [{ color: info.color, label: info.label, value: fmtY(info.value) }],\n `${Math.round(info.share * 100)}%`,\n );\n }\n }\n\n private resolveAnimDur(): number {\n if (this.reduced) return 0;\n const a = this.options.animate ?? true;\n if (typeof a === \"number\") return Math.max(0, a);\n if (!a) return 0;\n // flow mode: tween for the measured append cadence so the pan finishes\n // exactly when the next sample arrives — perpetual motion, zero lag\n if (this.options.flow) {\n return Math.min(10_000, Math.max(60, this.estInterval));\n }\n return 400;\n }\n\n private startAnimation(\n dom: { x: [number, number]; y: [number, number] } = this.domains(),\n ): void {\n this.animDur = this.resolveAnimDur();\n this.viewFrom = {\n x: [this.view.x[0], this.view.x[1]],\n y: [this.view.y[0], this.view.y[1]],\n };\n this.viewTo = dom;\n this.animStart = -1;\n sharedScheduler.add(this.frame);\n }\n\n /** Replace the chart data; the view morphs to the new dataset. */\n setData(data: ChartData): void {\n const prev = this.data;\n this.data = this.normalize(data, prev);\n this.dataRev++;\n this.maybeInitGpu();\n const dom = this.layout();\n this.startAnimation(dom);\n }\n\n /**\n * Append one sample to every series of an xy chart (line/area/scatter/\n * sparkline). With `options.window`, old points are dropped FIFO and the\n * viewport pans smoothly. Non-monotonic x falls back to a resort.\n */\n append(x: number, y: number | number[]): void {\n const d = this.data;\n if (d.kind !== \"xy\") {\n throw new Error(\n \"[resolvcharts] append() requires xy data (line/area/scatter/sparkline)\",\n );\n }\n // EMA of append cadence — drives flow-mode tween duration\n const nowT =\n typeof performance === \"undefined\" ? Date.now() : performance.now();\n if (this.lastAppendAt > 0) {\n const dt = nowT - this.lastAppendAt;\n if (dt > 0 && dt < 60_000) {\n this.estInterval = this.estInterval * 0.7 + dt * 0.3;\n }\n }\n this.lastAppendAt = nowT;\n\n const ys = Array.isArray(y) ? y : [y];\n const n = d.sortedX.length;\n // retention cap: maxPoints wins, else window; the EDGE_KEEP margin keeps\n // outgoing points in the buffer so they animate fully off-screen\n const win = this.options.window;\n const cap =\n this.options.maxPoints != null\n ? this.options.maxPoints + EDGE_KEEP\n : win != null\n ? win + EDGE_KEEP\n : undefined;\n const drop = cap != null ? Math.max(0, n + 1 - cap) : 0;\n const m = n + 1 - drop;\n const steady = drop === 1;\n\n let sortedX: Float64Array;\n if (steady) {\n // window full: shift in place instead of reallocating\n sortedX = d.sortedX;\n sortedX.copyWithin(0, 1);\n sortedX[n - 1] = x;\n } else {\n sortedX = new Float64Array(m);\n sortedX.set(d.sortedX.subarray(drop));\n sortedX[m - 1] = x;\n }\n\n const series = d.series.map((s, i) => {\n const v = ys[i] ?? s.y[n - 1] ?? 0;\n let yNew: Float64Array;\n let prevY: Float64Array;\n if (steady) {\n // shifted in place, s.y now holds the previous alignment and its\n // last slot already equals yNew[m-2] — reuse it as prevY; recycle\n // the old prevY buffer as yNew so steady-state appends don't alloc\n s.y.copyWithin(0, 1);\n prevY = s.y;\n yNew = s.prevY && s.prevY.length === m ? s.prevY : new Float64Array(m);\n yNew.set(prevY);\n yNew[m - 1] = v;\n } else {\n yNew = new Float64Array(m);\n yNew.set(s.y.subarray(drop));\n yNew[m - 1] = v;\n prevY = new Float64Array(m);\n prevY.set(s.y.subarray(drop));\n prevY[m - 1] =\n m > 1 ? (yNew[m - 2] as number) : (yNew[m - 1] as number);\n }\n return {\n label: s.label,\n color: s.color,\n y: yNew,\n prevY,\n pathCache: null,\n };\n });\n\n const nd: NormalizedXY = { kind: \"xy\", sortedX, series };\n const resort = m > 1 && x < (sortedX[m - 2] as number);\n if (resort) resortXY(nd);\n this.data = nd;\n if (resort) {\n this.dataRev++;\n } else if (this.gpu && !this.gpu.unavailable) {\n // ring-buffer path: only the appended tail reaches the GPU. s.y[n-1]\n // still holds the pre-append tail value (steady state shifts in place),\n // which is what the new point animates up from\n const ok = this.gpu.appended(\n x,\n d.series.map((s, i) => ys[i] ?? (s.y[n - 1] as number)),\n d.series.map((s) => s.y[n - 1] as number),\n drop,\n );\n if (!ok) this.dataRev++;\n }\n this.maybeInitGpu();\n this.pendingView = true;\n sharedScheduler.add(this.frame);\n }\n\n /** Re-measure the container and re-render (called automatically via ResizeObserver). */\n resize(): void {\n const w = this.el.clientWidth || 320;\n const h =\n this.el.clientHeight || (this.options.type === \"sparkline\" ? 32 : 240);\n if (w === this.backend.width && h === this.backend.height) {\n if (this.backend.dpr === (window.devicePixelRatio || 1)) return;\n }\n this.backend.resize(w, h);\n this.gpu?.setSize(w, h, this.backend.dpr);\n this.rect = null;\n this.layout();\n this.animStart = null;\n sharedScheduler.add((now) => {\n this.render(1);\n void now;\n return false;\n });\n }\n\n /** Remove listeners, stop animation, release canvases and GPU resources. */\n destroy(): void {\n this.destroyed = true;\n sharedScheduler.remove(this.frame);\n this.ro?.disconnect();\n this.el.removeEventListener(\"pointermove\", this.onMove);\n this.el.removeEventListener(\"pointerleave\", this.onLeave);\n window.removeEventListener(\"scroll\", this.onScroll, true);\n this.tooltip?.destroy();\n this.gpu?.destroy();\n this.backend.destroy();\n }\n}\n\nfunction resortXY(d: NormalizedXY): void {\n const n = d.sortedX.length;\n const idx = new Uint32Array(n);\n for (let i = 0; i < n; i++) idx[i] = i;\n const xs = d.sortedX;\n idx.sort((a, b) => (xs[a] as number) - (xs[b] as number));\n const sx = new Float64Array(n);\n for (let i = 0; i < n; i++) sx[i] = xs[idx[i] as number] as number;\n d.sortedX = sx;\n for (const s of d.series) {\n const ny = new Float64Array(n);\n const np = s.prevY ? new Float64Array(n) : null;\n for (let i = 0; i < n; i++) {\n const k = idx[i] as number;\n ny[i] = s.y[k] as number;\n if (np && s.prevY) np[i] = s.prevY[k] as number;\n }\n s.y = ny;\n s.prevY = np;\n }\n}\n\n/**\n * Create a chart inside `el`.\n * @category Charts\n *\n * @example\n * ```ts\n * const chart = createChart(document.getElementById(\"c\")!, {\n * type: \"line\",\n * curve: \"smooth\",\n * flow: true,\n * window: 30,\n * data: { x: xs, series: [{ label: \"cpu\", y: ys }] },\n * });\n * setInterval(() => chart.append(Date.now(), sample()), 2000);\n * ```\n */\nexport function createChart(el: HTMLElement, options: ChartOptions): Chart {\n return new Chart(el, options);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["MAX_BAR_W","RADIUS","START","hitScatter","hitBubble","hitRangeArea","hitSparkline","hitBaseline","d"],"sources":["../src/charts/bar.ts","../src/core/color.ts","../src/core/decimate.ts","../src/core/hit.ts","../src/charts/registry.ts","../src/charts/line.ts","../src/charts/baseline.ts","../src/charts/bubble.ts","../src/charts/candle.ts","../src/charts/combo.ts","../src/core/format.ts","../src/charts/donut.ts","../src/core/theme.ts","../src/charts/funnel.ts","../src/charts/radar.ts","../src/charts/rangearea.ts","../src/charts/scatter.ts","../src/charts/sparkline.ts","../src/charts/waterfall.ts","../src/core/canvas.ts","../src/core/scales.ts","../src/core/scheduler.ts","../src/core/ticks.ts","../src/core/tooltip.ts","../src/core/chart.ts"],"sourcesContent":["import type { HoverInfo, NormalizedCategory, Rect } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nexport const MAX_BAR_W = 40;\nexport const GAP_RATIO = 0.2;\nexport const RADIUS = 3;\n\nexport function barGeometry(\n r: RenderContext,\n d: NormalizedCategory,\n catIdx: number,\n seriesIdx: number,\n value: number,\n): Rect | null {\n const cats = d.categories.length;\n if (cats === 0) return null;\n const slot = r.plot.w / cats;\n const groupW = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W * d.series.length);\n const barW = groupW / d.series.length;\n const slotX = r.plot.x + slot * catIdx + (slot - groupW) / 2;\n const x = slotX + barW * seriesIdx;\n const base = r.yScale(0);\n const yv = r.yScale(value);\n const y = Math.min(base, yv);\n const h = Math.abs(base - yv);\n return { x, y, w: barW, h };\n}\n\nexport function topRounded(\n ctx: CanvasRenderingContext2D,\n rect: Rect,\n rad: number,\n up: boolean,\n): void {\n const { x, y, w, h } = rect;\n if (h <= 0 || w <= 0) return;\n const r = Math.min(rad, h / 2, w / 2);\n ctx.beginPath();\n if (up) {\n ctx.moveTo(x, y + h);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h);\n } else {\n ctx.moveTo(x, y);\n ctx.lineTo(x + w, y);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y);\n }\n ctx.closePath();\n ctx.fill();\n}\n\nfunction stackedGeometry(\n r: RenderContext,\n d: NormalizedCategory,\n catIdx: number,\n v0: number,\n v1: number,\n): Rect | null {\n const cats = d.categories.length;\n if (cats === 0) return null;\n const slot = r.plot.w / cats;\n const w = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n const x = r.plot.x + slot * catIdx + (slot - w) / 2;\n const yTop = r.yScale(Math.max(v0, v1));\n const yBot = r.yScale(Math.min(v0, v1));\n return { x, y: yTop, w, h: Math.abs(yBot - yTop) };\n}\n\nexport function renderBar(r: RenderContext): void {\n if (r.data.kind !== \"category\") return;\n const d = r.data;\n const ctx = r.ctx;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h + 1);\n ctx.clip();\n const cats = d.categories.length;\n const slot = r.plot.w / Math.max(1, cats);\n const animate = r.t < 1;\n if (r.opts.stacked) {\n const w = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n for (let ci = 0; ci < cats; ci++) {\n const x = r.plot.x + slot * ci + (slot - w) / 2;\n let pos = 0;\n let neg = 0;\n for (let si = 0; si < d.series.length; si++) {\n const s = d.series[si];\n if (!s) continue;\n const cur = s.values[ci] ?? 0;\n const prev = s.prevValues?.[ci] ?? 0;\n const v = animate ? prev + (cur - prev) * r.t : cur;\n const v0 = v >= 0 ? pos : neg + v;\n const v1 = v >= 0 ? pos + v : neg;\n if (v >= 0) pos = v1;\n else neg = v0;\n const yTop = r.yScale(Math.max(v0, v1));\n const h = Math.abs(r.yScale(Math.min(v0, v1)) - yTop);\n if (h <= 0) continue;\n ctx.fillStyle = s.color;\n ctx.fillRect(x, yTop, w, h);\n }\n }\n } else {\n const groupW = Math.min(\n slot * (1 - GAP_RATIO),\n MAX_BAR_W * d.series.length,\n );\n const barW = groupW / d.series.length;\n const base = r.yScale(0);\n for (let si = 0; si < d.series.length; si++) {\n const s = d.series[si];\n if (!s) continue;\n ctx.fillStyle = s.color;\n for (let ci = 0; ci < cats; ci++) {\n const cur = s.values[ci] ?? 0;\n const prev = s.prevValues?.[ci] ?? 0;\n const v = animate ? prev + (cur - prev) * r.t : cur;\n const x = r.plot.x + slot * ci + (slot - groupW) / 2 + barW * si;\n const yv = r.yScale(v);\n const y = Math.min(base, yv);\n const h = Math.abs(base - yv);\n if (h <= 0) continue;\n topRounded(ctx, { x, y, w: barW, h }, RADIUS, v >= 0);\n }\n }\n }\n ctx.restore();\n}\n\nexport function hitBar(\n r: RenderContext,\n px: number,\n py: number,\n): HoverInfo | null {\n if (r.data.kind !== \"category\") return null;\n const d = r.data;\n const cats = d.categories.length;\n if (cats === 0 || px < r.plot.x || px > r.plot.x + r.plot.w) return null;\n const cat = Math.min(\n cats - 1,\n Math.max(0, Math.floor(((px - r.plot.x) / r.plot.w) * cats)),\n );\n if (r.opts.stacked) {\n let pos = 0;\n let neg = 0;\n for (let si = 0; si < d.series.length; si++) {\n const s = d.series[si];\n if (!s) continue;\n const v = s.values[cat] ?? 0;\n const v0 = v >= 0 ? pos : neg + v;\n const v1 = v >= 0 ? pos + v : neg;\n if (v >= 0) pos = v1;\n else neg = v0;\n const rect = stackedGeometry(r, d, cat, v0, v1);\n if (\n rect &&\n px >= rect.x &&\n px <= rect.x + rect.w &&\n py >= rect.y &&\n py <= rect.y + rect.h\n ) {\n return {\n kind: \"bar\",\n category: d.categories[cat] ?? \"\",\n seriesIndex: si,\n label: s.label,\n color: s.color,\n value: v,\n px: rect.x + rect.w / 2,\n py,\n rect,\n };\n }\n }\n // hover in slot but not on a segment: report nearest top segment\n const s0 = d.series[d.series.length - 1];\n if (!s0) return null;\n const rect = stackedGeometry(r, d, cat, 0, pos);\n if (!rect) return null;\n return {\n kind: \"bar\",\n category: d.categories[cat] ?? \"\",\n seriesIndex: d.series.length - 1,\n label: s0.label,\n color: s0.color,\n value: s0.values[cat] ?? 0,\n px: rect.x + rect.w / 2,\n py: rect.y,\n rect,\n };\n }\n for (let si = 0; si < d.series.length; si++) {\n const s = d.series[si];\n if (!s) continue;\n const rect = barGeometry(r, d, cat, si, s.values[cat] ?? 0);\n if (rect && px >= rect.x && px <= rect.x + rect.w) {\n const inside = py >= rect.y && py <= rect.y + rect.h;\n return {\n kind: \"bar\",\n category: d.categories[cat] ?? \"\",\n seriesIndex: si,\n label: s.label,\n color: s.color,\n value: s.values[cat] ?? 0,\n px: rect.x + rect.w / 2,\n py: inside ? py : rect.y,\n rect,\n };\n }\n }\n const s = d.series[0];\n const rect = s ? barGeometry(r, d, cat, 0, s.values[cat] ?? 0) : null;\n if (!s || !rect) return null;\n return {\n kind: \"bar\",\n category: d.categories[cat] ?? \"\",\n seriesIndex: 0,\n label: s.label,\n color: s.color,\n value: s.values[cat] ?? 0,\n px: r.plot.x + (r.plot.w / cats) * (cat + 0.5),\n py: rect.y,\n rect,\n };\n}\n","export function withAlpha(color: string, alpha: number): string {\n if (color.startsWith(\"#\")) {\n let hex = color.slice(1);\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const n = Number.parseInt(hex, 16);\n const r = (n >> 16) & 255;\n const g = (n >> 8) & 255;\n const b = n & 255;\n return `rgba(${r},${g},${b},${alpha})`;\n }\n const m = color.match(/^rgba?\\(([^)]+)\\)$/);\n if (m) {\n const parts = (m[1] as string).split(\",\").slice(0, 3).join(\",\");\n return `rgba(${parts},${alpha})`;\n }\n return color;\n}\n","import type { Scale } from \"./types\";\n\n/**\n * Map data-space points to pixel space (with optional lerp between prev and\n * current y for animation) into interleaved [x, y] pairs.\n */\nexport function mapSeriesPx(\n xs: Float64Array,\n ys: Float64Array,\n prev: Float64Array | null,\n t: number,\n yFallback: number,\n xScale: Scale,\n yScale: Scale,\n flow = 0,\n): Float32Array {\n const n = Math.min(xs.length, ys.length);\n const out = new Float32Array(Math.max(1, n) * 2);\n const xd = xScale.domain;\n const xr = xScale.range;\n const kx = (xr[1] - xr[0]) / (xd[1] - xd[0] || 1);\n const bx = xr[0] - xd[0] * kx;\n const yd = yScale.domain;\n const yr = yScale.range;\n const ky = (yr[1] - yr[0]) / (yd[1] - yd[0] || 1);\n const by = yr[0] - yd[0] * ky;\n const lerp = t < 1;\n // per-point progress: newest (rightmost) leads, tail lags by `flow`\n const inv = n > 1 ? flow / (n - 1) : 0;\n const f1 = 1 + flow;\n let o = 0;\n for (let i = 0; i < n; i++) {\n let yv = ys[i] as number;\n if (lerp) {\n let ti = flow > 0 ? t * f1 - flow + i * inv : t;\n if (ti < 0) ti = 0;\n else if (ti > 1) ti = 1;\n const p = prev ? (prev[i] as number) : yFallback;\n yv = p + (yv - p) * ti;\n }\n out[o] = bx + (xs[i] as number) * kx;\n out[o + 1] = by + yv * ky;\n o += 2;\n }\n return out.subarray(0, o);\n}\n\n/** pooled output for decimateSeriesPx — callers consume before the next call */\nlet decScratch = new Float32Array(0);\n\n/**\n * Fused map + M4 decimation: scales data-space points to pixel space on the\n * fly (lerping y when animating), so no intermediate pixel arrays are ever\n * allocated. xs must be monotonically non-decreasing.\n *\n * Returns a subarray view of a pooled buffer — consume it before calling\n * decimateSeriesPx/mapSeriesPx again.\n */\nexport function decimateSeriesPx(\n xs: Float64Array,\n ys: Float64Array,\n prev: Float64Array | null,\n t: number,\n yFallback: number,\n xScale: Scale,\n yScale: Scale,\n pixelWidth: number,\n flow = 0,\n): Float32Array {\n const n = Math.min(xs.length, ys.length);\n if (n === 0) return new Float32Array(0);\n const maxPts = Math.min(n, 4 * (Math.ceil(pixelWidth) + 8));\n if (decScratch.length < maxPts * 2) {\n decScratch = new Float32Array(Math.max(1, maxPts) * 2);\n }\n const out = decScratch;\n\n const xd = xScale.domain;\n const xr = xScale.range;\n const kx = (xr[1] - xr[0]) / (xd[1] - xd[0] || 1);\n const bx = xr[0] - xd[0] * kx;\n const yd = yScale.domain;\n const yr = yScale.range;\n const ky = (yr[1] - yr[0]) / (yd[1] - yd[0] || 1);\n const by = yr[0] - yd[0] * ky;\n const lerp = t < 1;\n const inv = n > 1 ? flow / (n - 1) : 0;\n const f1 = 1 + flow;\n\n let o = 0;\n let yv = ys[0] as number;\n if (lerp) {\n let ti = flow > 0 ? t * f1 - flow : t;\n if (ti < 0) ti = 0;\n else if (ti > 1) ti = 1;\n const p = prev ? (prev[0] as number) : yFallback;\n yv = p + (yv - p) * ti;\n }\n let firstX = bx + (xs[0] as number) * kx;\n let firstY = by + yv * ky;\n let col = Math.floor(firstX);\n let minX = firstX;\n let minY = firstY;\n let maxX = firstX;\n let maxY = firstY;\n let lastX = firstX;\n let lastY = firstY;\n\n const cap = out.length;\n for (let i = 1; i < n; i++) {\n const x = bx + (xs[i] as number) * kx;\n yv = ys[i] as number;\n if (lerp) {\n let ti = flow > 0 ? t * f1 - flow + i * inv : t;\n if (ti < 0) ti = 0;\n else if (ti > 1) ti = 1;\n const p = prev ? (prev[i] as number) : yFallback;\n yv = p + (yv - p) * ti;\n }\n const y = by + yv * ky;\n const c = Math.floor(x);\n if (c !== col) {\n if (o + 8 <= cap) {\n out[o] = firstX;\n out[o + 1] = firstY;\n o += 2;\n if (minY !== firstY || minX !== firstX) {\n out[o] = minX;\n out[o + 1] = minY;\n o += 2;\n }\n if (maxY !== minY || maxX !== minX) {\n out[o] = maxX;\n out[o + 1] = maxY;\n o += 2;\n }\n if (lastX !== maxX || lastY !== maxY) {\n out[o] = lastX;\n out[o + 1] = lastY;\n o += 2;\n }\n }\n col = c;\n firstX = x;\n firstY = y;\n minX = maxX = lastX = x;\n minY = maxY = lastY = y;\n } else {\n if (y < minY) {\n minY = y;\n minX = x;\n }\n if (y > maxY) {\n maxY = y;\n maxX = x;\n }\n lastX = x;\n lastY = y;\n }\n }\n if (o + 8 <= cap) {\n out[o] = firstX;\n out[o + 1] = firstY;\n o += 2;\n if (minY !== firstY || minX !== firstX) {\n out[o] = minX;\n out[o + 1] = minY;\n o += 2;\n }\n if (maxY !== minY || maxX !== minX) {\n out[o] = maxX;\n out[o + 1] = maxY;\n o += 2;\n }\n if (lastX !== maxX || lastY !== maxY) {\n out[o] = lastX;\n out[o + 1] = lastY;\n o += 2;\n }\n }\n return out.subarray(0, o);\n}\n\n/**\n * M4 (min-max) decimation: for each integer pixel column along x, keep the\n * first, min, max, and last points. Guarantees peaks are never dropped and\n * bounds path complexity to ~4 points per horizontal pixel.\n *\n * xs must be pixel-space x coordinates, monotonically non-decreasing.\n * ys must be pixel-space y coordinates of equal length.\n *\n * Returns interleaved [x, y] pairs ready for path construction.\n * @category Utilities\n */\nexport function decimateM4(\n xs: ArrayLike<number>,\n ys: ArrayLike<number>,\n pixelWidth: number,\n): Float32Array {\n const n = Math.min(xs.length, ys.length);\n if (n === 0) return new Float32Array(0);\n // Output points are always input points: ≤ n total, ≤ 4 per pixel column.\n const maxPts = Math.min(n, 4 * (Math.ceil(pixelWidth) + 8));\n const out = new Float32Array(Math.max(1, maxPts) * 2);\n\n let o = 0;\n let col = Math.floor(xs[0] as number);\n let firstX = xs[0] as number;\n let firstY = ys[0] as number;\n let minX = firstX;\n let minY = firstY;\n let maxX = firstX;\n let maxY = firstY;\n let lastX = firstX;\n let lastY = firstY;\n\n const put = (x: number, y: number): void => {\n if (o + 2 <= out.length) {\n out[o] = x;\n out[o + 1] = y;\n o += 2;\n }\n };\n\n const flush = () => {\n put(firstX, firstY);\n if (minY !== firstY || minX !== firstX) put(minX, minY);\n if (maxY !== minY || maxX !== minX) put(maxX, maxY);\n if (lastX !== maxX || lastY !== maxY) put(lastX, lastY);\n };\n\n for (let i = 1; i < n; i++) {\n const x = xs[i] as number;\n const y = ys[i] as number;\n const c = Math.floor(x);\n if (c !== col) {\n flush();\n col = c;\n firstX = x;\n firstY = y;\n minX = maxX = lastX = x;\n minY = maxY = lastY = y;\n } else {\n if (y < minY) {\n minY = y;\n minX = x;\n }\n if (y > maxY) {\n maxY = y;\n maxX = x;\n }\n lastX = x;\n lastY = y;\n }\n }\n flush();\n return out.subarray(0, o);\n}\n","/**\n * Binary search for the index whose value is nearest to `target`.\n * `xs` must be sorted ascending. Returns -1 for empty input.\n * @category Utilities\n */\nexport function nearestIndex(xs: ArrayLike<number>, target: number): number {\n const n = xs.length;\n if (n === 0) return -1;\n if (target <= (xs[0] as number)) return 0;\n if (target >= (xs[n - 1] as number)) return n - 1;\n let lo = 0;\n let hi = n - 1;\n while (hi - lo > 1) {\n const mid = (lo + hi) >> 1;\n if ((xs[mid] as number) < target) lo = mid;\n else hi = mid;\n }\n const dLo = Math.abs(target - (xs[lo] as number));\n const dHi = Math.abs(target - (xs[hi] as number));\n return dHi < dLo ? hi : lo;\n}\n","import type { CanvasBackend } from \"../core/canvas\";\nimport type {\n ChartOptions,\n CurveMode,\n NormalizedData,\n NormalizedXY,\n Rect,\n Scale,\n ThemeTokens,\n} from \"../core/types\";\n\nexport interface RenderContext {\n backend: CanvasBackend;\n ctx: CanvasRenderingContext2D;\n plot: Rect;\n theme: ThemeTokens;\n opts: ChartOptions;\n data: NormalizedData;\n xScale: Scale;\n yScale: Scale;\n /** eased animation progress, 0..1 */\n t: number;\n}\n\nexport type SeriesRenderer = (r: RenderContext) => void;\n\nexport function lerpY(\n s: { y: Float64Array; prevY: Float64Array | null },\n i: number,\n t: number,\n fallback: number,\n): number {\n const to = s.y[i] ?? fallback;\n const from = s.prevY?.[i] ?? fallback;\n return t >= 1 ? to : from + (to - from) * t;\n}\n\nexport function isXY(d: NormalizedData): d is NormalizedXY {\n return d.kind === \"xy\";\n}\n\n/** pooled scratch for smoothPath tangents — consumed within the call */\nlet smScratch = new Float64Array(0);\n\n/**\n * Monotone cubic path (Fritsch–Carlson tangents) — never overshoots data.\n * `pts` is interleaved [x0, y0, x1, y1, ...] with `n` points.\n */\nexport function smoothPath(\n ctx: CanvasPath,\n pts: ArrayLike<number>,\n n: number,\n connect = false,\n): void {\n if (n < 3) {\n for (let i = 0; i < n; i++) {\n const x = pts[2 * i] as number;\n const y = pts[2 * i + 1] as number;\n if (i === 0 && !connect) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n return;\n }\n const segs = n - 1;\n const need = segs + n;\n if (smScratch.length < need) smScratch = new Float64Array(need);\n const m = smScratch.subarray(0, segs);\n const tang = smScratch.subarray(segs, segs + n);\n for (let i = 0; i < segs; i++) {\n const dxi = (pts[2 * (i + 1)] as number) - (pts[2 * i] as number);\n m[i] =\n dxi === 0\n ? 0\n : ((pts[2 * (i + 1) + 1] as number) - (pts[2 * i + 1] as number)) / dxi;\n }\n tang[0] = m[0] as number;\n for (let i = 1; i < segs; i++) {\n const a = m[i - 1] as number;\n const b = m[i] as number;\n tang[i] = a * b <= 0 ? 0 : (a + b) / 2;\n }\n tang[n - 1] = m[segs - 1] as number;\n for (let i = 0; i < segs; i++) {\n const mi = m[i] as number;\n if (mi !== 0) {\n const ti = tang[i] as number;\n const ti1 = tang[i + 1] as number;\n const lim = 3 * Math.abs(mi);\n if (Math.abs(ti) > lim) tang[i] = Math.sign(ti) * lim;\n if (Math.abs(ti1) > lim) tang[i + 1] = Math.sign(ti1) * lim;\n }\n }\n if (connect) ctx.lineTo(pts[0] as number, pts[1] as number);\n else ctx.moveTo(pts[0] as number, pts[1] as number);\n for (let i = 0; i < segs; i++) {\n const x0 = pts[2 * i] as number;\n const x1 = pts[2 * (i + 1)] as number;\n const y0 = pts[2 * i + 1] as number;\n const y1 = pts[2 * (i + 1) + 1] as number;\n const h = (x1 - x0) / 3;\n ctx.bezierCurveTo(\n x0 + h,\n y0 + h * (tang[i] as number),\n x1 - h,\n y1 - h * (tang[i + 1] as number),\n x1,\n y1,\n );\n }\n}\n\n/**\n * Trace `n` interleaved [x, y] pixel points into `path` honoring `curve`\n * (linear / step / smooth). `connect` continues the current subpath with a\n * lineTo instead of starting a new one — used for closed band shapes.\n */\nexport function traceCurve(\n path: CanvasPath,\n pts: ArrayLike<number>,\n n: number,\n curve: CurveMode,\n connect = false,\n): void {\n if (n === 0) return;\n const join = (x: number, y: number) =>\n connect ? path.lineTo(x, y) : path.moveTo(x, y);\n if (curve === \"step\") {\n join(pts[0] as number, pts[1] as number);\n for (let i = 1; i < n; i++) {\n const x = pts[2 * i] as number;\n path.lineTo(x, pts[2 * i - 1] as number);\n path.lineTo(x, pts[2 * i + 1] as number);\n }\n } else if (curve === \"smooth\") {\n smoothPath(path, pts, n, connect);\n } else {\n join(pts[0] as number, pts[1] as number);\n for (let i = 1; i < n; i++) {\n path.lineTo(pts[2 * i] as number, pts[2 * i + 1] as number);\n }\n }\n}\n","import { withAlpha } from \"../core/color\";\nimport { decimateSeriesPx, mapSeriesPx } from \"../core/decimate\";\nimport { nearestIndex } from \"../core/hit\";\nimport type { HoverInfo } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY, traceCurve } from \"./registry\";\n\n/** fraction of the tween the trailing edge lags behind the leading point */\nexport const FLOW_RIPPLE = 0.35;\n\nexport interface BuiltPath {\n path: Path2D;\n /** pixel x of the first drawn point (area fill edge) */\n firstX: number;\n /** pixel x of the last drawn point */\n lastX: number;\n /** pixel y of the last drawn point */\n lastY: number;\n}\n\n/**\n * Materialize one series as interleaved [x, y] pixel pairs: scales to pixel\n * space, lerps y while animating, and M4-decimates when points exceed ~1.5x\n * the plot width. Shared by the Canvas2D path builder and the WebGPU backend.\n */\nexport function seriesPoints(\n r: RenderContext,\n s: { y: Float64Array; prevY: Float64Array | null },\n yFallback?: number,\n): Float32Array {\n const d = r.data;\n if (!isXY(d)) throw new Error(\"unreachable\");\n const n = d.sortedX.length;\n if (n === 0) return new Float32Array(0);\n const fb = yFallback ?? r.yScale.domain[0];\n const flow = r.opts.flow ? FLOW_RIPPLE : 0;\n return n > r.plot.w * 1.5\n ? decimateSeriesPx(\n d.sortedX,\n s.y,\n s.prevY,\n r.t,\n fb,\n r.xScale,\n r.yScale,\n r.plot.w,\n flow,\n )\n : mapSeriesPx(d.sortedX, s.y, s.prevY, r.t, fb, r.xScale, r.yScale, flow);\n}\n\nexport function buildPath(\n r: RenderContext,\n s: { y: Float64Array; prevY: Float64Array | null },\n yFallback?: number,\n): BuiltPath {\n const path = new Path2D();\n const pts = seriesPoints(r, s, yFallback);\n const dn = pts.length / 2;\n if (dn === 0) return { path, firstX: 0, lastX: 0, lastY: 0 };\n traceCurve(path, pts, dn, r.opts.curve ?? \"linear\");\n return {\n path,\n firstX: pts[0] as number,\n lastX: pts[2 * dn - 2] as number,\n lastY: pts[2 * dn - 1] as number,\n };\n}\n\nexport function renderLine(r: RenderContext, fill: boolean): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const ctx = r.ctx;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h);\n ctx.clip();\n\n for (const s of d.series) {\n const { path, firstX, lastX } = buildPath(r, s);\n if (fill && lastX !== firstX) {\n const area = new Path2D(path);\n const base = r.yScale(Math.max(0, r.yScale.domain[0]));\n area.lineTo(lastX, base);\n area.lineTo(firstX, base);\n area.closePath();\n const g = ctx.createLinearGradient(0, r.plot.y, 0, r.plot.y + r.plot.h);\n g.addColorStop(0, withAlpha(s.color, 0.16));\n g.addColorStop(1, withAlpha(s.color, 0));\n ctx.fillStyle = g;\n ctx.fill(area);\n }\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n }\n ctx.restore();\n}\n\nexport function hitXY(r: RenderContext, px: number): HoverInfo | null {\n if (!isXY(r.data)) return null;\n const d = r.data;\n const idx = nearestIndex(d.sortedX, r.xScale.invert(px));\n if (idx < 0) return null;\n const xVal = d.sortedX[idx] as number;\n const sx = r.xScale(xVal);\n let py = r.plot.y + r.plot.h;\n const values = d.series.map((s) => {\n const yVal = s.y[idx] as number;\n const sy = r.yScale(yVal);\n if (sy < py) py = sy;\n return { label: s.label, color: s.color, y: yVal };\n });\n return { kind: \"point\", index: idx, x: xVal, px: sx, py, values };\n}\n","import { withAlpha } from \"../core/color\";\nimport { buildPath, hitXY } from \"./line\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY } from \"./registry\";\n\n/**\n * Baseline/delta chart: one line colored green above a reference value and\n * red below, with matching gradient fills (lightweight-charts BaselineSeries\n * model). Uses the first series only.\n */\nexport function renderBaseline(r: RenderContext): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const s = d.series[0];\n if (!s || d.sortedX.length === 0) return;\n const ctx = r.ctx;\n const base = r.opts.baseline ?? (s.y[0] as number);\n const basePx = Math.max(\n r.plot.y,\n Math.min(r.plot.y + r.plot.h, r.yScale(base)),\n );\n const { path, firstX, lastX } = buildPath(r, s, base);\n\n const area = new Path2D(path);\n area.lineTo(lastX, basePx);\n area.lineTo(firstX, basePx);\n area.closePath();\n\n const regions: {\n top: number;\n bot: number;\n color: string;\n gFrom: number;\n gTo: number;\n }[] = [\n { top: r.plot.y, bot: basePx, color: r.theme.up, gFrom: 0.28, gTo: 0.05 },\n {\n top: basePx,\n bot: r.plot.y + r.plot.h,\n color: r.theme.down,\n gFrom: 0.05,\n gTo: 0.28,\n },\n ];\n for (const reg of regions) {\n if (reg.bot - reg.top <= 0) continue;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, reg.top, r.plot.w, reg.bot - reg.top);\n ctx.clip();\n const g = ctx.createLinearGradient(0, reg.top, 0, reg.bot);\n g.addColorStop(0, withAlpha(reg.color, reg.gFrom));\n g.addColorStop(1, withAlpha(reg.color, reg.gTo));\n ctx.fillStyle = g;\n ctx.fill(area);\n ctx.strokeStyle = reg.color;\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n ctx.restore();\n }\n // baseline hairline\n ctx.strokeStyle = r.theme.axisBaseline;\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n const bx = Math.round(basePx) + 0.5;\n ctx.moveTo(r.plot.x, bx);\n ctx.lineTo(r.plot.x + r.plot.w, bx);\n ctx.stroke();\n ctx.setLineDash([]);\n}\n\nexport { hitXY as hitBaseline };\n","import { withAlpha } from \"../core/color\";\nimport { hitXY } from \"./line\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY } from \"./registry\";\n\nconst MIN_R = 3;\nconst MAX_R = 16;\n\n/**\n * Bubble chart: scatter points sized by each series' `r` channel, mapped\n * linearly to [MIN_R, MAX_R] px across the dataset's radius extent.\n */\nexport function renderBubble(r: RenderContext): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const ctx = r.ctx;\n const t = r.t;\n const lerp = t < 1;\n const fallback = r.yScale.domain[0];\n let lo = Infinity;\n let hi = -Infinity;\n for (const s of d.series) {\n const rr = s.r;\n if (!rr) continue;\n for (let i = 0; i < rr.length; i++) {\n const v = rr[i] as number;\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n if (lo === Infinity) {\n lo = 0;\n hi = 1;\n }\n const span = hi - lo || 1;\n const grow = lerp ? t : 1;\n const rad = (v: number) =>\n (MIN_R + ((v - lo) / span) * (MAX_R - MIN_R)) * grow;\n const xMin = r.plot.x - MAX_R;\n const xMax = r.plot.x + r.plot.w + MAX_R;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h);\n ctx.clip();\n for (const s of d.series) {\n const y = s.y;\n const prev = s.prevY;\n const rr = s.r;\n ctx.fillStyle = withAlpha(s.color, 0.45);\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n for (let i = 0; i < d.sortedX.length; i++) {\n const x = r.xScale(d.sortedX[i] as number);\n if (x < xMin || x > xMax) continue;\n let yv = y[i] as number;\n if (lerp) {\n const p = prev ? (prev[i] as number) : fallback;\n yv = p + (yv - p) * t;\n }\n const yp = r.yScale(yv);\n const pr = rad(rr ? (rr[i] as number) : lo + span / 2);\n if (pr <= 0) continue;\n ctx.moveTo(x + pr, yp);\n ctx.arc(x, yp, pr, 0, Math.PI * 2);\n }\n ctx.fill();\n ctx.stroke();\n }\n ctx.restore();\n}\n\nexport { hitXY as hitBubble };\n","import { withAlpha } from \"../core/color\";\nimport { nearestIndex } from \"../core/hit\";\nimport type { HoverInfo } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nexport function renderCandles(r: RenderContext, ohlcStyle: boolean): void {\n if (r.data.kind !== \"ohlc\") return;\n const d = r.data;\n const ctx = r.ctx;\n const n = d.x.length;\n if (n === 0) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h);\n ctx.clip();\n ctx.globalAlpha = r.t >= 1 ? 1 : r.t;\n\n // inline scale math: ~3x faster than closure calls at candle scale\n const xd = r.xScale.domain;\n const xr = r.xScale.range;\n const kx = (xr[1] - xr[0]) / (xd[1] - xd[0] || 1);\n const bx = xr[0] - xd[0] * kx;\n const yd = r.yScale.domain;\n const yr = r.yScale.range;\n const ky = (yr[1] - yr[0]) / (yd[1] - yd[0] || 1);\n const by = yr[0] - yd[0] * ky;\n\n const wickUp = new Path2D();\n const wickDown = new Path2D();\n const bodyUp = new Path2D();\n const bodyDown = new Path2D();\n const volUp = new Path2D();\n const volDown = new Path2D();\n const bandH = d.volume ? r.plot.h * 0.18 : 0;\n const bandBot = r.plot.y + r.plot.h;\n const vol = d.volume;\n\n if (n <= r.plot.w) {\n // sparse: one mark per candle, exact rendering\n const bodyW = Math.min((r.plot.w / n) * 0.6, 14);\n const half = bodyW / 2;\n let vmax = 0;\n if (vol) {\n for (let i = 0; i < n; i++) {\n const v = vol[i] as number;\n if (v > vmax) vmax = v;\n }\n }\n const vk = vmax > 0 ? bandH / vmax : 0;\n for (let i = 0; i < n; i++) {\n const up = (d.close[i] as number) >= (d.open[i] as number);\n const cx = bx + (d.x[i] as number) * kx;\n const hi = by + (d.high[i] as number) * ky;\n const lo = by + (d.low[i] as number) * ky;\n const wick = up ? wickUp : wickDown;\n wick.moveTo(cx, hi);\n wick.lineTo(cx, lo);\n if (ohlcStyle) {\n const op = by + (d.open[i] as number) * ky;\n const cl = by + (d.close[i] as number) * ky;\n wick.moveTo(cx - half, op);\n wick.lineTo(cx, op);\n wick.moveTo(cx, cl);\n wick.lineTo(cx + half, cl);\n } else {\n const op = by + (d.open[i] as number) * ky;\n const cl = by + (d.close[i] as number) * ky;\n const body = up ? bodyUp : bodyDown;\n body.rect(\n cx - half,\n Math.min(op, cl),\n bodyW,\n Math.max(1, Math.abs(cl - op)),\n );\n }\n if (vol) {\n const v = vol[i] as number;\n if (v > 0) {\n const h = v * vk;\n (up ? volUp : volDown).rect(cx - half, bandBot - h, bodyW, h);\n }\n }\n }\n } else {\n // dense: aggregate candles per integer pixel column — same output as\n // trading terminals; bounds mark count to ~plot width\n const maxCols = Math.min(n, Math.ceil(r.plot.w) + 1);\n const cxA = new Float64Array(maxCols);\n const oA = new Float64Array(maxCols);\n const hA = new Float64Array(maxCols);\n const lA = new Float64Array(maxCols);\n const cA = new Float64Array(maxCols);\n const vA = new Float64Array(maxCols);\n let nc = 0;\n let prevCol = -1;\n for (let i = 0; i < n; i++) {\n const c = Math.floor(bx + (d.x[i] as number) * kx);\n if (c !== prevCol) {\n prevCol = c;\n const k = nc++;\n cxA[k] = c + 0.5;\n oA[k] = d.open[i] as number;\n hA[k] = d.high[i] as number;\n lA[k] = d.low[i] as number;\n cA[k] = d.close[i] as number;\n vA[k] = vol ? (vol[i] as number) : 0;\n } else {\n const k = nc - 1;\n const hi = d.high[i] as number;\n const lo = d.low[i] as number;\n if (hi > (hA[k] as number)) hA[k] = hi;\n if (lo < (lA[k] as number)) lA[k] = lo;\n cA[k] = d.close[i] as number;\n if (vol) vA[k] = (vA[k] as number) + (vol[i] as number);\n }\n }\n const pitch = r.plot.w / nc;\n const bodyW = Math.max(0.5, Math.min(pitch * 0.6, 14));\n const half = bodyW / 2;\n let vmax = 0;\n if (vol) {\n for (let k = 0; k < nc; k++) {\n if ((vA[k] as number) > vmax) vmax = vA[k] as number;\n }\n }\n const vk = vmax > 0 ? bandH / vmax : 0;\n for (let k = 0; k < nc; k++) {\n const cx = cxA[k] as number;\n const up = (cA[k] as number) >= (oA[k] as number);\n const wick = up ? wickUp : wickDown;\n wick.moveTo(cx, by + (hA[k] as number) * ky);\n wick.lineTo(cx, by + (lA[k] as number) * ky);\n if (ohlcStyle) {\n const op = by + (oA[k] as number) * ky;\n const cl = by + (cA[k] as number) * ky;\n wick.moveTo(cx - half, op);\n wick.lineTo(cx, op);\n wick.moveTo(cx, cl);\n wick.lineTo(cx + half, cl);\n } else {\n const op = by + (oA[k] as number) * ky;\n const cl = by + (cA[k] as number) * ky;\n (up ? bodyUp : bodyDown).rect(\n cx - half,\n Math.min(op, cl),\n bodyW,\n Math.max(1, Math.abs(cl - op)),\n );\n }\n if (vol) {\n const v = vA[k] as number;\n if (v > 0) {\n const h = v * vk;\n (up ? volUp : volDown).rect(cx - half, bandBot - h, bodyW, h);\n }\n }\n }\n }\n\n // wicks first so bodies draw on top\n ctx.lineWidth = 1;\n ctx.strokeStyle = r.theme.up;\n ctx.stroke(wickUp);\n ctx.strokeStyle = r.theme.down;\n ctx.stroke(wickDown);\n if (!ohlcStyle) {\n ctx.fillStyle = r.theme.up;\n ctx.fill(bodyUp);\n ctx.fillStyle = r.theme.down;\n ctx.fill(bodyDown);\n }\n if (vol) {\n ctx.fillStyle = withAlpha(r.theme.up, 0.35);\n ctx.fill(volUp);\n ctx.fillStyle = withAlpha(r.theme.down, 0.35);\n ctx.fill(volDown);\n }\n ctx.restore();\n}\n\nexport function hitCandle(r: RenderContext, px: number): HoverInfo | null {\n if (r.data.kind !== \"ohlc\") return null;\n const d = r.data;\n const idx = nearestIndex(d.x, r.xScale.invert(px));\n if (idx < 0) return null;\n return {\n kind: \"candle\",\n index: idx,\n x: d.x[idx] as number,\n open: d.open[idx] as number,\n high: d.high[idx] as number,\n low: d.low[idx] as number,\n close: d.close[idx] as number,\n px: r.xScale(d.x[idx] as number),\n py: r.yScale(d.close[idx] as number),\n };\n}\n","import { withAlpha } from \"../core/color\";\nimport type { HoverInfo, NormalizedCategory } from \"../core/types\";\nimport { GAP_RATIO, MAX_BAR_W, RADIUS, topRounded } from \"./bar\";\nimport type { RenderContext } from \"./registry\";\nimport { traceCurve } from \"./registry\";\n\ntype CatSeries = NormalizedCategory[\"series\"][number];\n\n/** pooled scratch for overlay [x, y] pairs — consumed within the call */\nlet ovScratch = new Float64Array(0);\n\nfunction overlayPath(r: RenderContext, pts: Float64Array, n: number): Path2D {\n const path = new Path2D();\n traceCurve(path, pts, n, r.opts.curve ?? \"linear\");\n return path;\n}\n\nexport function renderCombo(r: RenderContext): void {\n if (r.data.kind !== \"category\") return;\n const d = r.data;\n const ctx = r.ctx;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h + 1);\n ctx.clip();\n const cats = d.categories.length;\n const slot = r.plot.w / Math.max(1, cats);\n const animate = r.t < 1;\n const valAt = (s: CatSeries, ci: number): number => {\n const cur = s.values[ci] ?? 0;\n const prev = s.prevValues?.[ci] ?? 0;\n return animate ? prev + (cur - prev) * r.t : cur;\n };\n\n let nCols = 0;\n for (const s of d.series) if (s.kind === \"column\") nCols++;\n if (r.opts.stacked) {\n const w = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n for (let ci = 0; ci < cats; ci++) {\n const x = r.plot.x + slot * ci + (slot - w) / 2;\n let pos = 0;\n let neg = 0;\n for (const s of d.series) {\n if (s.kind !== \"column\") continue;\n const v = valAt(s, ci);\n const v0 = v >= 0 ? pos : neg + v;\n const v1 = v >= 0 ? pos + v : neg;\n if (v >= 0) pos = v1;\n else neg = v0;\n const yTop = r.yScale(Math.max(v0, v1));\n const h = Math.abs(r.yScale(Math.min(v0, v1)) - yTop);\n if (h <= 0) continue;\n ctx.fillStyle = s.color;\n ctx.fillRect(x, yTop, w, h);\n }\n }\n } else {\n const groupW = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W * nCols);\n const barW = groupW / Math.max(1, nCols);\n const base = r.yScale(0);\n let k = 0;\n for (const s of d.series) {\n if (s.kind !== \"column\") continue;\n ctx.fillStyle = s.color;\n for (let ci = 0; ci < cats; ci++) {\n const v = valAt(s, ci);\n const x = r.plot.x + slot * ci + (slot - groupW) / 2 + barW * k;\n const yv = r.yScale(v);\n const y = Math.min(base, yv);\n const h = Math.abs(base - yv);\n if (h <= 0) continue;\n topRounded(ctx, { x, y, w: barW, h }, RADIUS, v >= 0);\n }\n k++;\n }\n }\n\n // overlays ride on category centers\n const base = r.yScale(Math.max(0, r.yScale.domain[0]));\n if (ovScratch.length < cats * 2) ovScratch = new Float64Array(cats * 2);\n const pts = ovScratch;\n for (const s of d.series) {\n if (s.kind === \"column\") continue;\n for (let ci = 0; ci < cats; ci++) {\n pts[2 * ci] = r.plot.x + slot * (ci + 0.5);\n pts[2 * ci + 1] = r.yScale(valAt(s, ci));\n }\n const path = overlayPath(r, pts, cats);\n if (s.kind === \"area\" && cats > 1) {\n const area = new Path2D(path);\n area.lineTo(pts[2 * (cats - 1)] as number, base);\n area.lineTo(pts[0] as number, base);\n area.closePath();\n const g = ctx.createLinearGradient(0, r.plot.y, 0, r.plot.y + r.plot.h);\n g.addColorStop(0, withAlpha(s.color, 0.16));\n g.addColorStop(1, withAlpha(s.color, 0));\n ctx.fillStyle = g;\n ctx.fill(area);\n }\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n }\n ctx.restore();\n}\n\nexport function hitCombo(r: RenderContext, px: number): HoverInfo | null {\n if (r.data.kind !== \"category\") return null;\n const d = r.data;\n const cats = d.categories.length;\n if (cats === 0 || px < r.plot.x || px > r.plot.x + r.plot.w) return null;\n const cat = Math.min(\n cats - 1,\n Math.max(0, Math.floor(((px - r.plot.x) / r.plot.w) * cats)),\n );\n const slot = r.plot.w / cats;\n let py = r.plot.y + r.plot.h;\n const values = d.series.map((s) => {\n const y = s.values[cat] ?? 0;\n const sy = r.yScale(y);\n if (sy < py) py = sy;\n return { label: s.label, color: s.color, y };\n });\n return {\n kind: \"point\",\n index: cat,\n x: cat,\n px: r.plot.x + slot * (cat + 0.5),\n py,\n values,\n title: d.categories[cat] ?? \"\",\n };\n}\n","/** @category Formatting\n * Compact number formatting: integers verbatim, else 4 significant digits. */\nexport function formatNumber(v: number): string {\n if (!Number.isFinite(v)) return \"\";\n if (Number.isInteger(v) && Math.abs(v) < 1e15) return String(v);\n return String(Number(v.toPrecision(4)));\n}\n\nconst MAGNITUDES: [number, string][] = [\n [1e9, \"B\"],\n [1e6, \"M\"],\n [1e3, \"k\"],\n];\n\n/** @category Formatting\n * SI-suffixed formatting: `1.2k`, `3.4M`, `5B`. */\nexport function formatSI(v: number): string {\n if (!Number.isFinite(v)) return \"\";\n const abs = Math.abs(v);\n for (const [m, s] of MAGNITUDES) {\n if (abs >= m) {\n const n = v / m;\n const digits = n >= 100 || Number.isInteger(n) ? 0 : 1;\n return `${n.toFixed(digits)}${s}`;\n }\n }\n return formatNumber(v);\n}\n","import { formatSI } from \"../core/format\";\nimport type { HoverInfo, NormalizedDonut } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nconst INNER = 0.65;\nconst GAP = 0.015;\nconst START = -Math.PI / 2;\n\n/** donut keeps a center hole; pie fills to the middle */\nconst innerRatio = (r: RenderContext): number =>\n r.opts.type === \"pie\" ? 0 : INNER;\n\nexport interface DonutGeo {\n cx: number;\n cy: number;\n rOuter: number;\n rInner: number;\n angles: { a0: number; a1: number }[];\n}\n\nexport function donutGeometry(\n r: RenderContext,\n d: NormalizedDonut,\n t: number,\n): DonutGeo {\n const cx = r.plot.x + r.plot.w / 2;\n const cy = r.plot.y + r.plot.h / 2;\n const rOuter = Math.max(1, Math.min(r.plot.w, r.plot.h) / 2);\n const rInner = rOuter * innerRatio(r);\n const angles: { a0: number; a1: number }[] = [];\n let a = START;\n const sweep = Math.PI * 2 * Math.min(1, Math.max(0, t));\n for (const s of d.slices) {\n const frac = d.total > 0 ? s.value / d.total : 0;\n const a1 = a + frac * sweep;\n angles.push({ a0: a, a1 });\n a = a + frac * Math.PI * 2;\n }\n return { cx, cy, rOuter, rInner, angles };\n}\n\nexport function renderDonut(r: RenderContext): void {\n if (r.data.kind !== \"donut\") return;\n const d = r.data;\n const ctx = r.ctx;\n const geo = donutGeometry(r, d, r.t);\n for (let i = 0; i < d.slices.length; i++) {\n const s = d.slices[i];\n const an = geo.angles[i];\n if (!s || !an || an.a1 - an.a0 <= 0) continue;\n const a0 = an.a0 + GAP / 2;\n const a1 = an.a1 - GAP / 2;\n if (a1 <= a0) continue;\n ctx.beginPath();\n ctx.arc(geo.cx, geo.cy, geo.rOuter, a0, a1);\n if (geo.rInner > 0) {\n ctx.arc(geo.cx, geo.cy, geo.rInner, a1, a0, true);\n } else {\n // pie wedge: route through the center so closePath doesn't cut a chord\n ctx.lineTo(geo.cx, geo.cy);\n }\n ctx.closePath();\n ctx.fillStyle = s.color;\n ctx.fill();\n }\n if (r.opts.type !== \"pie\" && d.slices.length > 0 && r.t > 0.5) {\n ctx.fillStyle = r.theme.text;\n ctx.font = `600 20px ${r.theme.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(formatSI(d.total), geo.cx, geo.cy);\n }\n}\n\nexport function hitDonut(\n r: RenderContext,\n px: number,\n py: number,\n): HoverInfo | null {\n if (r.data.kind !== \"donut\") return null;\n const d = r.data;\n const geo = donutGeometry(r, d, 1);\n const dx = px - geo.cx;\n const dy = py - geo.cy;\n const dist = Math.hypot(dx, dy);\n if (dist < geo.rInner || dist > geo.rOuter) return null;\n let angle = Math.atan2(dy, dx);\n while (angle < START) angle += Math.PI * 2;\n while (angle >= START + Math.PI * 2) angle -= Math.PI * 2;\n for (let i = 0; i < geo.angles.length; i++) {\n const an = geo.angles[i];\n const s = d.slices[i];\n if (!an || !s) continue;\n if (angle >= an.a0 && angle < an.a1) {\n return {\n kind: \"slice\",\n index: i,\n label: s.label,\n color: s.color,\n value: s.value,\n share: d.total > 0 ? s.value / d.total : 0,\n px,\n py,\n };\n }\n }\n return null;\n}\n","import type { ChartOptions, ThemeTokens } from \"./types\";\n\nconst FONT = 'Inter, system-ui, -apple-system, \"Segoe UI\", sans-serif';\n\n/** Built-in light theme.\n * @category Theming\n */\nexport const lightTheme: ThemeTokens = {\n bg: \"#ffffff\",\n text: \"#1f1f1f\",\n textMuted: \"#8a8a8a\",\n grid: \"rgba(0,0,0,0.07)\",\n axisBaseline: \"rgba(0,0,0,0.15)\",\n crosshair: \"rgba(0,0,0,0.25)\",\n series: [\"#0070f3\"],\n contextGray: \"#b0b0b0\",\n up: \"#0e9f6e\",\n down: \"#e5484d\",\n tooltipBg: \"#ffffff\",\n tooltipText: \"#1f1f1f\",\n tooltipMuted: \"#8a8a8a\",\n tooltipBorder: \"rgba(0,0,0,0.08)\",\n tooltipShadow: \"0 4px 14px rgba(0,0,0,0.08)\",\n fontFamily: FONT,\n};\n\n/** Built-in dark theme.\n * @category Theming\n */\nexport const darkTheme: ThemeTokens = {\n bg: \"#0a0a0a\",\n text: \"#ededed\",\n textMuted: \"#8a8a8a\",\n grid: \"rgba(255,255,255,0.07)\",\n axisBaseline: \"rgba(255,255,255,0.18)\",\n crosshair: \"rgba(255,255,255,0.3)\",\n series: [\"#3b9dff\"],\n contextGray: \"#5c5c5c\",\n up: \"#34c98e\",\n down: \"#f2555a\",\n tooltipBg: \"#161616\",\n tooltipText: \"#ededed\",\n tooltipMuted: \"#8a8a8a\",\n tooltipBorder: \"rgba(255,255,255,0.1)\",\n tooltipShadow: \"0 4px 14px rgba(0,0,0,0.4)\",\n fontFamily: FONT,\n};\n\nexport const categoricalLight: string[] = [\n \"#0070f3\",\n \"#0e9f6e\",\n \"#8e4ec6\",\n \"#f5a623\",\n];\nexport const categoricalDark: string[] = [\n \"#3b9dff\",\n \"#34c98e\",\n \"#a97ef0\",\n \"#f5b84d\",\n];\n\n/** Merge a theme option (`\"light\" | \"dark\" | partial tokens`) into full {@link ThemeTokens}.\n * @category Theming\n */\nexport function resolveTheme(\n opt: ChartOptions[\"theme\"],\n accent: string | undefined,\n): ThemeTokens {\n const base =\n opt === \"dark\"\n ? { ...darkTheme, series: [...categoricalDark] }\n : opt === \"light\" || opt === undefined\n ? { ...lightTheme, series: [...categoricalLight] }\n : { ...lightTheme, series: [...categoricalLight], ...opt };\n if (accent) base.series[0] = accent;\n return base;\n}\n\nexport function seriesColor(\n theme: ThemeTokens,\n index: number,\n explicit: string | undefined,\n): string {\n if (explicit) return explicit;\n return theme.series[index % theme.series.length] as string;\n}\n","import { formatSI } from \"../core/format\";\nimport { seriesColor } from \"../core/theme\";\nimport type { HoverInfo, NormalizedCategory, Rect } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nconst ROW_GAP = 2;\nconst LABEL_MIN_W = 72;\n\ninterface Stage {\n cat: string;\n value: number;\n top: number;\n bot: number;\n w0: number;\n w1: number;\n color: string;\n}\n\n/**\n * Funnel: one stage per `categories` entry using the first series' values.\n * Each stage is a trapezoid whose bottom edge matches the next stage's top\n * width — the classic funnel silhouette.\n */\nfunction stages(r: RenderContext, d: NormalizedCategory, t: number): Stage[] {\n const s = d.series[0];\n if (!s) return [];\n const n = d.categories.length;\n let max = 0;\n for (let i = 0; i < s.values.length; i++) {\n const v = s.values[i] as number;\n if (v > max) max = v;\n }\n max ||= 1;\n const rowH = r.plot.h / Math.max(1, n);\n const out: Stage[] = [];\n for (let i = 0; i < n; i++) {\n const cur = s.values[i] ?? 0;\n const prev = s.prevValues?.[i] ?? 0;\n const v = t < 1 ? prev + (cur - prev) * t : cur;\n const cur1 = s.values[i + 1] ?? cur;\n const prev1 = s.prevValues?.[i + 1] ?? 0;\n const v1 = i + 1 < n ? (t < 1 ? prev1 + (cur1 - prev1) * t : cur1) : v;\n out.push({\n cat: d.categories[i] ?? \"\",\n value: cur,\n top: r.plot.y + rowH * i,\n bot: r.plot.y + rowH * (i + 1) - ROW_GAP,\n w0: (Math.max(0, v) / max) * r.plot.w,\n w1: (Math.max(0, v1) / max) * r.plot.w,\n color: seriesColor(r.theme, i, undefined),\n });\n }\n return out;\n}\n\nfunction stageRect(r: RenderContext, st: Stage): Rect {\n const cx = r.plot.x + r.plot.w / 2;\n const w = Math.max(st.w0, st.w1);\n return { x: cx - w / 2, y: st.top, w, h: st.bot - st.top };\n}\n\nexport function renderFunnel(r: RenderContext): void {\n if (r.data.kind !== \"category\") return;\n const d = r.data;\n const ctx = r.ctx;\n const cx = r.plot.x + r.plot.w / 2;\n for (const st of stages(r, d, r.t)) {\n ctx.beginPath();\n ctx.moveTo(cx - st.w0 / 2, st.top);\n ctx.lineTo(cx + st.w0 / 2, st.top);\n ctx.lineTo(cx + st.w1 / 2, st.bot);\n ctx.lineTo(cx - st.w1 / 2, st.bot);\n ctx.closePath();\n ctx.fillStyle = st.color;\n ctx.fill();\n const label = `${st.cat} · ${formatSI(st.value)}`;\n ctx.font = `11px ${r.theme.fontFamily}`;\n ctx.textBaseline = \"middle\";\n if (Math.min(st.w0, st.w1) >= LABEL_MIN_W) {\n ctx.fillStyle = \"#ffffff\";\n ctx.textAlign = \"center\";\n ctx.fillText(label, cx, (st.top + st.bot) / 2);\n } else {\n ctx.fillStyle = r.theme.textMuted;\n ctx.textAlign = \"left\";\n ctx.fillText(\n label,\n cx + Math.max(st.w0, st.w1) / 2 + 8,\n (st.top + st.bot) / 2,\n );\n }\n }\n}\n\nexport function hitFunnel(\n r: RenderContext,\n px: number,\n py: number,\n): HoverInfo | null {\n if (r.data.kind !== \"category\") return null;\n const d = r.data;\n const s = d.series[0];\n if (!s) return null;\n const cx = r.plot.x + r.plot.w / 2;\n for (const st of stages(r, d, 1)) {\n if (py < st.top || py > st.bot) continue;\n const frac = st.bot - st.top > 0 ? (py - st.top) / (st.bot - st.top) : 0;\n const w = st.w0 + (st.w1 - st.w0) * frac;\n if (Math.abs(px - cx) > w / 2 + 4) continue;\n return {\n kind: \"bar\",\n category: st.cat,\n seriesIndex: 0,\n label: s.label,\n color: st.color,\n value: st.value,\n px: cx,\n py,\n rect: stageRect(r, st),\n };\n }\n return null;\n}\n","import { withAlpha } from \"../core/color\";\nimport type { HoverInfo, NormalizedCategory } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nconst RINGS = 4;\nconst LABEL_PAD = 16;\nconst MIN_AXES = 3;\nconst START = -Math.PI / 2;\n\nexport interface RadarGeo {\n cx: number;\n cy: number;\n radius: number;\n max: number;\n}\n\nexport function radarGeo(r: RenderContext, d: NormalizedCategory): RadarGeo {\n const cx = r.plot.x + r.plot.w / 2;\n const cy = r.plot.y + r.plot.h / 2;\n const radius = Math.max(1, Math.min(r.plot.w, r.plot.h) / 2 - LABEL_PAD);\n let max = 0;\n for (const s of d.series) {\n for (let i = 0; i < s.values.length; i++) {\n const v = s.values[i] as number;\n if (v > max) max = v;\n }\n }\n return { cx, cy, radius, max: max || 1 };\n}\n\nconst angleOf = (i: number, n: number): number => START + (i / n) * Math.PI * 2;\n\nexport function renderRadar(r: RenderContext): void {\n if (r.data.kind !== \"category\") return;\n const d = r.data;\n const n = d.categories.length;\n if (n < MIN_AXES) return;\n const ctx = r.ctx;\n const { cx, cy, radius, max } = radarGeo(r, d);\n const animate = r.t < 1;\n\n ctx.strokeStyle = r.theme.grid;\n ctx.lineWidth = 1;\n for (let ring = 1; ring <= RINGS; ring++) {\n const rr = (radius * ring) / RINGS;\n ctx.beginPath();\n for (let i = 0; i <= n; i++) {\n const a = angleOf(i % n, n);\n const x = cx + Math.cos(a) * rr;\n const y = cy + Math.sin(a) * rr;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.stroke();\n }\n ctx.beginPath();\n for (let i = 0; i < n; i++) {\n const a = angleOf(i, n);\n ctx.moveTo(cx, cy);\n ctx.lineTo(cx + Math.cos(a) * radius, cy + Math.sin(a) * radius);\n }\n ctx.stroke();\n\n for (const s of d.series) {\n ctx.beginPath();\n for (let i = 0; i < n; i++) {\n const cur = s.values[i] ?? 0;\n const prev = s.prevValues?.[i] ?? 0;\n const v = animate ? prev + (cur - prev) * r.t : cur;\n const rr = (Math.max(0, v) / max) * radius;\n const a = angleOf(i, n);\n const x = cx + Math.cos(a) * rr;\n const y = cy + Math.sin(a) * rr;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n ctx.fillStyle = withAlpha(s.color, 0.16);\n ctx.fill();\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.stroke();\n ctx.fillStyle = s.color;\n ctx.beginPath();\n for (let i = 0; i < n; i++) {\n const cur = s.values[i] ?? 0;\n const prev = s.prevValues?.[i] ?? 0;\n const v = animate ? prev + (cur - prev) * r.t : cur;\n const rr = (Math.max(0, v) / max) * radius;\n const a = angleOf(i, n);\n const x = cx + Math.cos(a) * rr;\n const y = cy + Math.sin(a) * rr;\n ctx.moveTo(x + 2.5, y);\n ctx.arc(x, y, 2.5, 0, Math.PI * 2);\n }\n ctx.fill();\n }\n\n ctx.fillStyle = r.theme.textMuted;\n ctx.font = `11px ${r.theme.fontFamily}`;\n for (let i = 0; i < n; i++) {\n const a = angleOf(i, n);\n const lx = cx + Math.cos(a) * (radius + LABEL_PAD - 4);\n const ly = cy + Math.sin(a) * (radius + LABEL_PAD - 4);\n ctx.textAlign =\n Math.cos(a) > 0.3 ? \"left\" : Math.cos(a) < -0.3 ? \"right\" : \"center\";\n ctx.textBaseline =\n Math.sin(a) > 0.3 ? \"top\" : Math.sin(a) < -0.3 ? \"bottom\" : \"middle\";\n ctx.fillText(d.categories[i] ?? \"\", lx, ly);\n }\n}\n\nexport function hitRadar(\n r: RenderContext,\n px: number,\n py: number,\n): HoverInfo | null {\n if (r.data.kind !== \"category\") return null;\n const d = r.data;\n const n = d.categories.length;\n if (n < MIN_AXES) return null;\n const { cx, cy, radius } = radarGeo(r, d);\n const dx = px - cx;\n const dy = py - cy;\n if (Math.hypot(dx, dy) > radius + LABEL_PAD) return null;\n let rel = Math.atan2(dy, dx) - START;\n while (rel < 0) rel += Math.PI * 2;\n while (rel >= Math.PI * 2) rel -= Math.PI * 2;\n const i = Math.round((rel / (Math.PI * 2)) * n) % n;\n const values = d.series.map((s) => ({\n label: s.label,\n color: s.color,\n y: s.values[i] ?? 0,\n }));\n return {\n kind: \"point\",\n index: i,\n x: i,\n px,\n py,\n values,\n title: d.categories[i] ?? \"\",\n };\n}\n\n/** Hover accent: highlighted spoke + vertex dots (replaces the xy crosshair). */\nexport function drawRadarHover(r: RenderContext, info: HoverInfo): void {\n if (r.data.kind !== \"category\" || info.kind !== \"point\") return;\n const d = r.data;\n const n = d.categories.length;\n if (info.index < 0 || info.index >= n) return;\n const o = r.backend.overlay;\n const { cx, cy, radius, max } = radarGeo(r, d);\n const a = angleOf(info.index, n);\n o.strokeStyle = r.theme.crosshair;\n o.lineWidth = 1;\n o.beginPath();\n o.moveTo(cx, cy);\n o.lineTo(cx + Math.cos(a) * radius, cy + Math.sin(a) * radius);\n o.stroke();\n for (const s of d.series) {\n const v = s.values[info.index] ?? 0;\n const rr = (Math.max(0, v) / max) * radius;\n o.fillStyle = s.color;\n o.strokeStyle = r.theme.bg;\n o.lineWidth = 2;\n o.beginPath();\n o.arc(cx + Math.cos(a) * rr, cy + Math.sin(a) * rr, 4, 0, Math.PI * 2);\n o.fill();\n o.stroke();\n }\n}\n","import { withAlpha } from \"../core/color\";\nimport { hitXY, seriesPoints } from \"./line\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY, traceCurve } from \"./registry\";\n\n/** pooled scratch for the reversed lower edge — consumed within the call */\nlet revScratch = new Float64Array(0);\n\n/**\n * Range-area chart: a filled band between each series' `y` (lower edge) and\n * `y2` (upper edge) — confidence intervals, min/max envelopes. Series\n * without `y2` are skipped.\n */\nexport function renderRangeArea(r: RenderContext): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const ctx = r.ctx;\n const curve = r.opts.curve ?? \"linear\";\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h);\n ctx.clip();\n for (const s of d.series) {\n if (!s.y2) continue;\n const hi = seriesPoints(r, { y: s.y2, prevY: s.prevY2 });\n const lo = seriesPoints(r, s);\n const n = Math.min(hi.length, lo.length) / 2;\n if (n === 0) continue;\n if (revScratch.length < n * 2) revScratch = new Float64Array(n * 2);\n for (let i = 0; i < n; i++) {\n revScratch[2 * i] = lo[2 * (n - 1 - i)] as number;\n revScratch[2 * i + 1] = lo[2 * (n - 1 - i) + 1] as number;\n }\n const band = new Path2D();\n traceCurve(band, hi, n, curve);\n traceCurve(band, revScratch, n, curve, true);\n band.closePath();\n ctx.fillStyle = withAlpha(s.color, 0.2);\n ctx.fill(band);\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n // both edges as subpaths in one stroke call\n const edges = new Path2D();\n traceCurve(edges, hi, n, curve);\n traceCurve(edges, lo, n, curve);\n ctx.stroke(edges);\n }\n ctx.restore();\n}\n\nexport { hitXY as hitRangeArea };\n","import { withAlpha } from \"../core/color\";\nimport { hitXY } from \"./line\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY } from \"./registry\";\n\nexport function renderScatter(r: RenderContext): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const ctx = r.ctx;\n const t = r.t;\n const lerp = t < 1;\n const fallback = r.yScale.domain[0];\n const xMin = r.plot.x - 3;\n const xMax = r.plot.x + r.plot.w + 3;\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h);\n ctx.clip();\n for (const s of d.series) {\n const y = s.y;\n const prev = s.prevY;\n ctx.fillStyle = withAlpha(s.color, 0.65);\n ctx.beginPath();\n for (let i = 0; i < d.sortedX.length; i++) {\n const x = r.xScale(d.sortedX[i] as number);\n if (x < xMin || x > xMax) continue;\n let yv = y[i] as number;\n if (lerp) {\n const p = prev ? (prev[i] as number) : fallback;\n yv = p + (yv - p) * t;\n }\n const yp = r.yScale(yv);\n ctx.moveTo(x + 2.5, yp);\n ctx.arc(x, yp, 2.5, 0, Math.PI * 2);\n }\n ctx.fill();\n }\n ctx.restore();\n}\n\nexport { hitXY as hitScatter };\n","import { withAlpha } from \"../core/color\";\nimport { buildPath, hitXY } from \"./line\";\nimport type { RenderContext } from \"./registry\";\nimport { isXY } from \"./registry\";\n\nexport function renderSparkline(r: RenderContext): void {\n if (!isXY(r.data)) return;\n const d = r.data;\n const ctx = r.ctx;\n const s = d.series[0];\n if (!s || d.sortedX.length === 0) return;\n const { path, firstX, lastX, lastY } = buildPath(r, s);\n const area = new Path2D(path);\n const base = r.plot.y + r.plot.h;\n area.lineTo(lastX, base);\n area.lineTo(firstX, base);\n area.closePath();\n ctx.fillStyle = withAlpha(s.color, 0.1);\n ctx.fill(area);\n ctx.strokeStyle = s.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n ctx.fillStyle = s.color;\n ctx.beginPath();\n ctx.arc(lastX, lastY, 2, 0, Math.PI * 2);\n ctx.fill();\n}\n\nexport { hitXY as hitSparkline };\n","import type { HoverInfo, NormalizedWaterfall, Rect } from \"../core/types\";\nimport type { RenderContext } from \"./registry\";\n\nconst MAX_BAR_W = 48;\nconst GAP_RATIO = 0.25;\nconst RADIUS = 2;\n\nfunction barRect(\n r: RenderContext,\n d: NormalizedWaterfall,\n i: number,\n end: number,\n): Rect | null {\n const bar = d.bars[i];\n if (!bar) return null;\n const cats = d.bars.length;\n const slot = r.plot.w / Math.max(1, cats);\n const w = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n const x = r.plot.x + slot * i + (slot - w) / 2;\n const yTop = r.yScale(Math.max(bar.start, end));\n const yBot = r.yScale(Math.min(bar.start, end));\n return { x, y: yTop, w, h: Math.abs(yBot - yTop) };\n}\n\nfunction barColor(\n r: RenderContext,\n bar: { value: number; total: boolean },\n): string {\n if (bar.total) return r.theme.series[0] ?? r.theme.contextGray;\n return bar.value >= 0 ? r.theme.up : r.theme.down;\n}\n\nexport function renderWaterfall(r: RenderContext): void {\n if (r.data.kind !== \"waterfall\") return;\n const d = r.data;\n const ctx = r.ctx;\n const n = d.bars.length;\n const slot = r.plot.w / Math.max(1, n);\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(r.plot.x, r.plot.y, r.plot.w, r.plot.h + 1);\n ctx.clip();\n\n // dashed connectors from each bar's end to the next bar's edge\n const barW = Math.min(slot * (1 - GAP_RATIO), MAX_BAR_W);\n ctx.strokeStyle = r.theme.crosshair;\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n for (let i = 1; i < n; i++) {\n const prev = d.bars[i - 1];\n if (!prev) continue;\n const y = r.yScale(prev.end);\n ctx.moveTo(r.plot.x + slot * (i - 1) + (slot + barW) / 2, y);\n ctx.lineTo(r.plot.x + slot * i + (slot - barW) / 2, y);\n }\n ctx.stroke();\n ctx.setLineDash([]);\n\n for (let i = 0; i < n; i++) {\n const bar = d.bars[i];\n if (!bar) continue;\n const end = bar.total\n ? bar.end * r.t\n : bar.start + (bar.end - bar.start) * r.t;\n const rect = barRect(r, d, i, end);\n if (!rect) continue;\n ctx.fillStyle = barColor(r, bar);\n const rad = Math.min(RADIUS, rect.h / 2, rect.w / 2);\n ctx.beginPath();\n if (rect.h <= 0) {\n ctx.rect(rect.x, rect.y - 0.5, rect.w, 1);\n } else {\n ctx.roundRect(rect.x, rect.y, rect.w, rect.h, rad);\n }\n ctx.fill();\n }\n ctx.restore();\n}\n\nexport function hitWaterfall(\n r: RenderContext,\n px: number,\n _py: number,\n): HoverInfo | null {\n if (r.data.kind !== \"waterfall\") return null;\n const d = r.data;\n const n = d.bars.length;\n if (n === 0 || px < r.plot.x || px > r.plot.x + r.plot.w) return null;\n const i = Math.min(\n n - 1,\n Math.max(0, Math.floor(((px - r.plot.x) / r.plot.w) * n)),\n );\n const bar = d.bars[i];\n if (!bar) return null;\n const rect = barRect(r, d, i, bar.end);\n if (!rect) return null;\n return {\n kind: \"bar\",\n category: d.categories[i] ?? \"\",\n seriesIndex: 0,\n label: bar.total ? \"Total\" : \"Δ\",\n color: barColor(r, bar),\n value: bar.value,\n px: rect.x + rect.w / 2,\n py: rect.y,\n rect,\n };\n}\n","import type { Rect } from \"./types\";\n\n/**\n * Renderer seam. Canvas2D is the only backend for now; a WebGPU backend can\n * implement this contract later and interpret the same scene/marks.\n */\nexport interface RenderBackend {\n readonly kind: \"canvas2d\" | \"webgpu\";\n readonly width: number;\n readonly height: number;\n readonly plot: Rect;\n readonly main: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n resize(w: number, h: number): void;\n setPlot(plot: Rect): void;\n begin(): void;\n beginOverlay(): void;\n destroy(): void;\n}\n\nfunction makeCanvas(cssW: number, cssH: number): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n c.style.cssText =\n \"position:absolute;inset:0;width:100%;height:100%;display:block\";\n c.width = Math.max(1, Math.round(cssW));\n c.height = Math.max(1, Math.round(cssH));\n return c;\n}\n\nfunction setup2d(\n canvas: HTMLCanvasElement,\n settings: CanvasRenderingContext2DSettings,\n): CanvasRenderingContext2D {\n const ctx = canvas.getContext(\"2d\", settings);\n if (!ctx) throw new Error(\"resolvcharts: could not get 2d context\");\n return ctx;\n}\n\nexport class CanvasBackend implements RenderBackend {\n readonly kind = \"canvas2d\" as const;\n width: number;\n height: number;\n dpr: number;\n plot: Rect = { x: 0, y: 0, w: 0, h: 0 };\n readonly mainCanvas: HTMLCanvasElement;\n readonly overlayCanvas: HTMLCanvasElement;\n readonly main: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n private gridCache: HTMLCanvasElement | null = null;\n private gridCtx: CanvasRenderingContext2D | null = null;\n private container: HTMLElement;\n private settings: CanvasRenderingContext2DSettings;\n\n constructor(\n container: HTMLElement,\n cssW: number,\n cssH: number,\n settings: CanvasRenderingContext2DSettings = {},\n ) {\n this.container = container;\n this.settings = { alpha: true, ...settings };\n this.dpr = Math.max(1, window.devicePixelRatio || 1);\n this.width = cssW;\n this.height = cssH;\n this.mainCanvas = makeCanvas(cssW, cssH);\n this.overlayCanvas = makeCanvas(cssW, cssH);\n this.overlayCanvas.style.pointerEvents = \"none\";\n this.main = setup2d(this.mainCanvas, this.settings);\n this.overlay = setup2d(this.overlayCanvas, this.settings);\n container.append(this.mainCanvas, this.overlayCanvas);\n this.applySize();\n }\n\n private applySize(): void {\n const w = this.width * this.dpr;\n const h = this.height * this.dpr;\n for (const c of [this.mainCanvas, this.overlayCanvas]) {\n c.width = Math.max(1, Math.round(w));\n c.height = Math.max(1, Math.round(h));\n }\n for (const ctx of [this.main, this.overlay]) {\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n }\n if (this.gridCache) {\n this.gridCache.width = Math.max(1, Math.round(w));\n this.gridCache.height = Math.max(1, Math.round(h));\n this.gridCtx?.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n }\n }\n\n /** Static layer (grid/axes). Draw into returned ctx, then blitGrid(). */\n grid(): CanvasRenderingContext2D {\n if (!this.gridCache) {\n this.gridCache = document.createElement(\"canvas\");\n this.gridCache.width = Math.max(1, this.width * this.dpr);\n this.gridCache.height = Math.max(1, this.height * this.dpr);\n this.gridCtx = setup2d(this.gridCache, this.settings);\n this.gridCtx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n }\n const ctx = this.gridCtx as CanvasRenderingContext2D;\n ctx.clearRect(0, 0, this.width, this.height);\n return ctx;\n }\n\n blitGrid(): void {\n if (this.gridCache) {\n this.main.drawImage(this.gridCache, 0, 0, this.width, this.height);\n }\n }\n\n resize(w: number, h: number): void {\n this.dpr = Math.max(1, window.devicePixelRatio || 1);\n this.width = Math.max(1, w);\n this.height = Math.max(1, h);\n this.applySize();\n }\n\n setPlot(plot: Rect): void {\n this.plot = plot;\n }\n\n begin(): void {\n this.main.clearRect(0, 0, this.width, this.height);\n }\n\n beginOverlay(): void {\n this.overlay.clearRect(0, 0, this.width, this.height);\n }\n\n destroy(): void {\n this.mainCanvas.remove();\n this.overlayCanvas.remove();\n this.gridCache = null;\n this.gridCtx = null;\n void this.container;\n }\n}\n","import type { Scale } from \"./types\";\n\n/** @category Utilities\n * Linear scale from domain `[d0, d1]` to range `[r0, r1]`, with `invert`. */\nexport function linearScale(\n d0: number,\n d1: number,\n r0: number,\n r1: number,\n): Scale {\n const dd = d1 - d0 || 1;\n const dr = r1 - r0;\n const fn = ((v: number) => r0 + ((v - d0) / dd) * dr) as Scale;\n fn.invert = (px: number) => d0 + ((px - r0) / dr) * dd;\n fn.domain = [d0, d1];\n fn.range = [r0, r1];\n return fn;\n}\n\n/** @category Utilities\n * `[min, max]` of `values`; degenerate inputs get a sane fallback domain. */\nexport function extent(values: ArrayLike<number>): [number, number] {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i] as number;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (min === Infinity) return [0, 1];\n if (min === max)\n return min === 0\n ? [0, 1]\n : [min - Math.abs(min) * 0.1, max + Math.abs(max) * 0.1];\n return [min, max];\n}\n\n/** @category Utilities\n * Pad a domain by 5% on each end; `includeZero` anchors the axis at 0. */\nexport function padDomain(\n min: number,\n max: number,\n includeZero = false,\n): [number, number] {\n let lo = includeZero ? Math.min(0, min) : min;\n let hi = includeZero ? Math.max(0, max) : max;\n if (lo === hi) {\n hi = lo + 1;\n }\n const pad = (hi - lo) * 0.05;\n if (!includeZero) {\n lo -= pad;\n hi += pad;\n } else {\n if (lo < 0) lo -= pad;\n if (hi > 0) hi += pad;\n }\n return [lo, hi];\n}\n\n/** @category Utilities\n * Pin domain ends — each defined bound overrides the fitted value. */\nexport function boundDomain(\n dom: [number, number],\n min?: number,\n max?: number,\n): [number, number] {\n return [min ?? dom[0], max ?? dom[1]];\n}\n","type FrameFn = (now: number) => boolean;\n\nconst raf: (cb: (t: number) => void) => number =\n typeof requestAnimationFrame === \"function\"\n ? (cb) => requestAnimationFrame(cb)\n : (cb) => setTimeout(() => cb(Date.now()), 16) as unknown as number;\n\nconst caf: (id: number) => void =\n typeof cancelAnimationFrame === \"function\"\n ? (id) => cancelAnimationFrame(id)\n : (id) => clearTimeout(id);\n\n/**\n * Shared frame scheduler. Registered functions run once per animation frame\n * while they return true; the loop self-terminates when idle so charts burn\n * no CPU at rest.\n */\nexport class Scheduler {\n private items = new Set<FrameFn>();\n private id: number | null = null;\n\n add(fn: FrameFn): void {\n this.items.add(fn);\n if (this.id === null) {\n this.id = raf(this.tick);\n }\n }\n\n remove(fn: FrameFn): void {\n this.items.delete(fn);\n }\n\n private tick = (now: number): void => {\n this.id = null;\n for (const fn of [...this.items]) {\n if (!fn(now)) this.items.delete(fn);\n }\n if (this.items.size > 0) {\n this.id = raf(this.tick);\n }\n };\n\n destroy(): void {\n this.items.clear();\n if (this.id !== null) {\n caf(this.id);\n this.id = null;\n }\n }\n}\n\nexport const sharedScheduler: Scheduler = new Scheduler();\n\nexport const easeOutCubic: (t: number) => number = (t) => 1 - (1 - t) ** 3;\n","const STEPS = [1, 2, 2.5, 5, 10];\n\nfunction niceStep(range: number, target: number): number {\n const raw = Math.abs(range) / Math.max(1, target);\n if (!Number.isFinite(raw) || raw === 0) return 1;\n const pow = 10 ** Math.floor(Math.log10(raw));\n const norm = raw / pow;\n let step = 10;\n for (const s of STEPS) {\n if (norm <= s) {\n step = s;\n break;\n }\n }\n return step * pow;\n}\n\n/** \"Nice\" round tick values covering `[min, max]`, ~`target` count.\n * @category Utilities\n */\nexport function computeTicks(min: number, max: number, target = 5): number[] {\n if (!(min < max)) return [min];\n const step = niceStep(max - min, target);\n const lo = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n for (let v = lo; v <= max + step * 1e-9; v += step) {\n ticks.push(Math.abs(v) < step * 1e-9 ? 0 : v);\n if (ticks.length > 1000) break;\n }\n return ticks;\n}\n","import type { ThemeTokens } from \"./types\";\n\nexport class Tooltip {\n readonly el: HTMLDivElement;\n private theme: ThemeTokens;\n\n constructor(container: HTMLElement, theme: ThemeTokens) {\n this.theme = theme;\n this.el = document.createElement(\"div\");\n this.el.style.cssText = [\n \"position:absolute\",\n \"pointer-events:none\",\n `background:${theme.tooltipBg}`,\n `border:1px solid ${theme.tooltipBorder}`,\n `box-shadow:${theme.tooltipShadow}`,\n \"border-radius:6px\",\n \"padding:6px 10px\",\n `font:12px ${theme.fontFamily}`,\n `color:${theme.tooltipText}`,\n \"white-space:nowrap\",\n \"opacity:0\",\n \"transition:opacity 80ms ease-out\",\n \"z-index:1\",\n \"left:0\",\n \"top:0\",\n ].join(\";\");\n container.appendChild(this.el);\n }\n\n setTheme(theme: ThemeTokens): void {\n this.theme = theme;\n const s = this.el.style;\n s.background = theme.tooltipBg;\n s.border = `1px solid ${theme.tooltipBorder}`;\n s.boxShadow = theme.tooltipShadow;\n s.color = theme.tooltipText;\n }\n\n show(\n x: number,\n y: number,\n rows: { color?: string; label: string; value: string }[],\n title?: string,\n ): void {\n const el = this.el;\n el.textContent = \"\";\n if (title) {\n const t = document.createElement(\"div\");\n t.style.cssText = `font-weight:600;margin-bottom:2px;color:${this.theme.tooltipText}`;\n t.textContent = title;\n el.appendChild(t);\n }\n for (const r of rows) {\n const row = document.createElement(\"div\");\n row.style.cssText =\n \"display:flex;align-items:center;gap:6px;line-height:1.5\";\n if (r.color) {\n const sw = document.createElement(\"span\");\n sw.style.cssText = `width:8px;height:2px;background:${r.color};display:inline-block;border-radius:1px`;\n row.appendChild(sw);\n }\n const lab = document.createElement(\"span\");\n lab.style.color = this.theme.tooltipMuted;\n lab.textContent = r.label;\n const val = document.createElement(\"span\");\n val.style.cssText = \"font-weight:600;margin-left:auto;padding-left:12px\";\n val.textContent = r.value;\n row.append(lab, val);\n el.appendChild(row);\n }\n el.style.opacity = \"1\";\n this.position(x, y);\n }\n\n private position(x: number, y: number): void {\n const el = this.el;\n const parent = el.parentElement;\n if (!parent) return;\n const pw = parent.clientWidth;\n const ph = parent.clientHeight;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n let left = x + 12;\n let top = y + 12;\n if (left + w > pw - 4) left = x - w - 12;\n if (top + h > ph - 4) top = y - h - 12;\n el.style.left = `${Math.max(0, left)}px`;\n el.style.top = `${Math.max(0, top)}px`;\n }\n\n hide(): void {\n this.el.style.opacity = \"0\";\n }\n\n destroy(): void {\n this.el.remove();\n }\n}\n","import { hitBar, renderBar } from \"../charts/bar\";\nimport { hitBaseline, renderBaseline } from \"../charts/baseline\";\nimport { hitBubble, renderBubble } from \"../charts/bubble\";\nimport { hitCandle, renderCandles } from \"../charts/candle\";\nimport { hitCombo, renderCombo } from \"../charts/combo\";\nimport { hitDonut, renderDonut } from \"../charts/donut\";\nimport { hitFunnel, renderFunnel } from \"../charts/funnel\";\nimport { FLOW_RIPPLE, hitXY, renderLine } from \"../charts/line\";\nimport { drawRadarHover, hitRadar, renderRadar } from \"../charts/radar\";\nimport { hitRangeArea, renderRangeArea } from \"../charts/rangearea\";\nimport type { RenderContext } from \"../charts/registry\";\nimport { hitScatter, renderScatter } from \"../charts/scatter\";\nimport { hitSparkline, renderSparkline } from \"../charts/sparkline\";\nimport { hitWaterfall, renderWaterfall } from \"../charts/waterfall\";\nimport { CanvasBackend } from \"./canvas\";\nimport { withAlpha } from \"./color\";\nimport { formatSI } from \"./format\";\nimport { boundDomain, extent, linearScale, padDomain } from \"./scales\";\nimport { easeOutCubic, sharedScheduler } from \"./scheduler\";\nimport { resolveTheme, seriesColor } from \"./theme\";\nimport { computeTicks } from \"./ticks\";\nimport { Tooltip } from \"./tooltip\";\nimport type {\n CategoryData,\n ChartData,\n ChartOptions,\n ChartType,\n DonutData,\n HoverInfo,\n NormalizedData,\n NormalizedXY,\n OHLCData,\n Rect,\n ThemeTokens,\n WaterfallBar,\n WaterfallData,\n XYData,\n} from \"./types\";\n\ninterface TypeModule {\n render: (r: RenderContext) => void;\n hit?: (r: RenderContext, px: number, py: number) => HoverInfo | null;\n axes: boolean;\n defaultTooltip: boolean;\n}\n\nconst MODULES: Record<ChartType, TypeModule> = {\n line: {\n render: (r) => renderLine(r, false),\n hit: (r, px) => hitXY(r, px),\n axes: true,\n defaultTooltip: true,\n },\n area: {\n render: (r) => renderLine(r, true),\n hit: (r, px) => hitXY(r, px),\n axes: true,\n defaultTooltip: true,\n },\n scatter: {\n render: renderScatter,\n hit: (r, px) => hitScatter(r, px),\n axes: true,\n defaultTooltip: true,\n },\n bubble: {\n render: renderBubble,\n hit: (r, px) => hitBubble(r, px),\n axes: true,\n defaultTooltip: true,\n },\n rangearea: {\n render: renderRangeArea,\n hit: (r, px) => hitRangeArea(r, px),\n axes: true,\n defaultTooltip: true,\n },\n pie: {\n render: renderDonut,\n hit: hitDonut,\n axes: false,\n defaultTooltip: true,\n },\n radar: {\n render: renderRadar,\n hit: hitRadar,\n axes: false,\n defaultTooltip: true,\n },\n funnel: {\n render: renderFunnel,\n hit: hitFunnel,\n axes: false,\n defaultTooltip: true,\n },\n bar: { render: renderBar, hit: hitBar, axes: true, defaultTooltip: true },\n combo: {\n render: renderCombo,\n hit: (r, px) => hitCombo(r, px),\n axes: true,\n defaultTooltip: true,\n },\n sparkline: {\n render: renderSparkline,\n hit: (r, px) => hitSparkline(r, px),\n axes: false,\n defaultTooltip: false,\n },\n donut: {\n render: renderDonut,\n hit: hitDonut,\n axes: false,\n defaultTooltip: true,\n },\n candle: {\n render: (r) => renderCandles(r, false),\n hit: (r, px) => hitCandle(r, px),\n axes: true,\n defaultTooltip: true,\n },\n ohlc: {\n render: (r) => renderCandles(r, true),\n hit: (r, px) => hitCandle(r, px),\n axes: true,\n defaultTooltip: true,\n },\n waterfall: {\n render: renderWaterfall,\n hit: hitWaterfall,\n axes: true,\n defaultTooltip: true,\n },\n baseline: {\n render: renderBaseline,\n hit: (r, px) => hitBaseline(r, px),\n axes: true,\n defaultTooltip: true,\n },\n};\n\nconst LABEL_H = 20;\nconst GUTTER_PAD = 10;\n/** chart types with a WebGPU series path */\nconst GPU_KIND: Partial<Record<ChartType, \"line\" | \"area\" | \"points\">> = {\n line: \"line\",\n area: \"area\",\n sparkline: \"line\",\n scatter: \"points\",\n};\n/** points retained beyond the window's left edge so they slide off-screen instead of vanishing mid-plot */\nconst EDGE_KEEP = 3;\n/** default point count at which `renderer: \"auto\"` engages the GPU path */\nconst GPU_THRESHOLD = 100_000;\n\n/** Chart instance. Create via {@link createChart}.\n * @category Charts\n */\nexport class Chart {\n readonly el: HTMLElement;\n readonly options: ChartOptions;\n private theme: ThemeTokens;\n private backend: CanvasBackend;\n private tooltip: Tooltip | null = null;\n private mod: TypeModule;\n private data: NormalizedData;\n private ro: ResizeObserver | null = null;\n private rect: DOMRect | null = null;\n private pointer: { x: number; y: number } | null = null;\n private hover: HoverInfo | null = null;\n private animStart: number | null = null;\n private animDur = 0;\n private view: { x: [number, number]; y: [number, number] } = {\n x: [0, 1],\n y: [0, 1],\n };\n private viewFrom: { x: [number, number]; y: [number, number] } | null = null;\n private viewTo: { x: [number, number]; y: [number, number] } = {\n x: [0, 1],\n y: [0, 1],\n };\n private reduced = false;\n private destroyed = false;\n private pendingView = false;\n private gpu: import(\"../gpu/series\").GpuSeries | null = null;\n private gpuInit = false;\n /** bumped whenever xy data is replaced or reordered — triggers GPU re-upload */\n private dataRev = 0;\n private lastAppendAt = 0;\n private estInterval = 400;\n private onScroll = (): void => {\n this.rect = null;\n };\n private frame = (now: number): boolean => {\n if (this.destroyed) return false;\n if (this.pendingView) {\n // append() folds layout + animation restart into the frame so bursts\n // of appends share one domain computation per rendered frame\n this.pendingView = false;\n this.viewFrom = {\n x: [this.view.x[0], this.view.x[1]],\n y: [this.view.y[0], this.view.y[1]],\n };\n this.viewTo = this.layout();\n this.animDur = this.resolveAnimDur();\n this.animStart = -1;\n }\n let more = false;\n if (this.animStart !== null) {\n if (this.animStart === -1) this.animStart = now;\n const raw =\n this.animDur <= 0\n ? 1\n : Math.min(1, (now - this.animStart) / this.animDur);\n const eased = easeOutCubic(raw);\n this.lerpView(eased);\n this.render(eased);\n if (raw < 1) more = true;\n else this.animStart = null;\n }\n if (this.pointer) {\n this.applyHover(this.pointer.x, this.pointer.y);\n this.pointer = null;\n }\n return more;\n };\n\n constructor(el: HTMLElement, options: ChartOptions) {\n this.el = el;\n this.options = options;\n this.theme = resolveTheme(options.theme, options.accent);\n this.mod = MODULES[options.type];\n const style = getComputedStyle(el);\n if (style.position === \"static\") el.style.position = \"relative\";\n if (options.height) el.style.height = `${options.height}px`;\n const w = el.clientWidth || 320;\n const h = el.clientHeight || (options.type === \"sparkline\" ? 32 : 240);\n this.backend = new CanvasBackend(el, w, h, options.canvas);\n this.reduced =\n typeof matchMedia === \"function\" &&\n matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n const wantTooltip = options.tooltip ?? this.mod.defaultTooltip;\n if (wantTooltip) this.tooltip = new Tooltip(el, this.theme);\n this.data = this.normalize(options.data, null);\n this.maybeInitGpu();\n this.bindEvents();\n const dom = this.layout();\n this.view = { x: [...dom.x], y: [...dom.y] };\n this.viewTo = { x: [...dom.x], y: [...dom.y] };\n this.startAnimation(dom);\n }\n\n /**\n * Lazily acquire the WebGPU backend. `\"webgpu\"` attaches unconditionally;\n * `\"auto\"` waits until the xy point count crosses `gpuThreshold` — small\n * charts never pay adapter/device acquisition.\n */\n private maybeInitGpu(): void {\n if (this.gpu || this.gpuInit || this.destroyed) return;\n if (!GPU_KIND[this.options.type]) return;\n const r = this.options.renderer ?? \"auto\";\n if (r !== \"auto\" && r !== \"webgpu\") return;\n if (r === \"auto\") {\n const d = this.data;\n const pts =\n d.kind === \"xy\" ? d.sortedX.length * Math.max(1, d.series.length) : 0;\n if (pts < (this.options.gpuThreshold ?? GPU_THRESHOLD)) return;\n }\n this.gpuInit = true;\n void import(\"../gpu/series\").then(({ GpuSeries }) =>\n GpuSeries.create(this.options.gpu).then((g) => {\n if (!g || this.destroyed) {\n g?.destroy();\n return;\n }\n g.setSize(this.backend.width, this.backend.height, this.backend.dpr);\n this.backend.overlayCanvas.before(g.canvas);\n this.gpu = g;\n sharedScheduler.add((now) => {\n this.render(1);\n void now;\n return false;\n });\n }),\n );\n }\n\n private normalize(\n data: ChartData,\n prev: NormalizedData | null,\n ): NormalizedData {\n const t = this.options.type;\n if (t === \"candle\" || t === \"ohlc\") {\n const d = data as OHLCData;\n const n = d.candles.length;\n let idx: Uint32Array | null = null;\n for (let i = 1; i < n; i++) {\n if ((d.candles[i]?.x ?? i) < (d.candles[i - 1]?.x ?? i - 1)) {\n idx = new Uint32Array(n);\n for (let k = 0; k < n; k++) idx[k] = k;\n idx.sort((a, b) => (d.candles[a]?.x ?? 0) - (d.candles[b]?.x ?? 0));\n break;\n }\n }\n const x = new Float64Array(n);\n const open = new Float64Array(n);\n const high = new Float64Array(n);\n const low = new Float64Array(n);\n const close = new Float64Array(n);\n let hasVol = false;\n const volume = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const c = d.candles[idx ? (idx[i] as number) : i];\n x[i] = c?.x ?? i;\n open[i] = c?.open ?? 0;\n high[i] = c?.high ?? 0;\n low[i] = c?.low ?? 0;\n close[i] = c?.close ?? 0;\n volume[i] = c?.volume ?? 0;\n if (c?.volume != null && c.volume > 0) hasVol = true;\n }\n return {\n kind: \"ohlc\",\n x,\n open,\n high,\n low,\n close,\n volume: hasVol ? volume : null,\n };\n }\n if (t === \"waterfall\") {\n const d = data as WaterfallData;\n const totals = new Set(d.totals ?? []);\n let run = 0;\n const bars: WaterfallBar[] = d.categories.map((_, i) => {\n const v = d.values[i] ?? 0;\n if (totals.has(i)) {\n const bar: WaterfallBar = { start: 0, end: v, value: v, total: true };\n run = v;\n return bar;\n }\n const bar: WaterfallBar = {\n start: run,\n end: run + v,\n value: v,\n total: false,\n };\n run += v;\n return bar;\n });\n return { kind: \"waterfall\", categories: [...d.categories], bars };\n }\n if (t === \"donut\" || t === \"pie\") {\n const d = data as DonutData;\n const slices = d.slices.map((s, i) => ({\n label: s.label,\n value: s.value,\n color: seriesColor(this.theme, i, s.color),\n }));\n const total = slices.reduce((a, s) => a + Math.max(0, s.value), 0);\n return { kind: \"donut\", slices, total };\n }\n if (t === \"bar\" || t === \"combo\" || t === \"radar\" || t === \"funnel\") {\n const d = data as CategoryData;\n const prevSeries = prev?.kind === \"category\" ? prev.series : [];\n return {\n kind: \"category\",\n categories: [...d.categories],\n series: d.series.map((s, i) => ({\n label: s.label ?? `Series ${i + 1}`,\n color: seriesColor(this.theme, i, s.color),\n kind: s.kind ?? \"column\",\n values: Float64Array.from(s.values),\n prevValues: prevSeries[i]?.values ?? null,\n })),\n };\n }\n const d = data as XYData;\n const xRaw = Float64Array.from(d.x);\n const n = xRaw.length;\n // already-sorted x (the common case) skips the O(n log n) index sort\n let idx: Uint32Array | null = null;\n for (let i = 1; i < n; i++) {\n if ((xRaw[i] as number) < (xRaw[i - 1] as number)) {\n idx = new Uint32Array(n);\n for (let k = 0; k < n; k++) idx[k] = k;\n idx.sort((a, b) => (xRaw[a] as number) - (xRaw[b] as number));\n break;\n }\n }\n const sortedX = idx ? new Float64Array(n) : xRaw;\n if (idx) {\n for (let i = 0; i < n; i++) sortedX[i] = xRaw[idx[i] as number] as number;\n }\n const prevSeries = prev?.kind === \"xy\" ? prev.series : [];\n return {\n kind: \"xy\",\n sortedX,\n series: d.series.map((s, i) => {\n const chan = (\n src: ArrayLike<number> | undefined,\n ): Float64Array | null => {\n if (!src) return null;\n const out = new Float64Array(n);\n if (idx) {\n for (let k = 0; k < n; k++)\n out[k] = src[idx[k] as number] as number;\n } else {\n for (let k = 0; k < n; k++) out[k] = src[k] as number;\n }\n return out;\n };\n const y = chan(s.y) ?? new Float64Array(n);\n return {\n label: s.label ?? `Series ${i + 1}`,\n color: seriesColor(this.theme, i, s.color),\n y,\n prevY: prevSeries[i]?.y ?? null,\n r: chan(s.r),\n y2: chan(s.y2),\n prevY2: prevSeries[i]?.y2 ?? null,\n pathCache: null,\n };\n }),\n };\n }\n\n private bindEvents(): void {\n this.el.addEventListener(\"pointermove\", this.onMove, { passive: true });\n this.el.addEventListener(\"pointerleave\", this.onLeave, { passive: true });\n window.addEventListener(\"scroll\", this.onScroll, true);\n if (typeof ResizeObserver === \"function\") {\n this.ro = new ResizeObserver(() => this.resize());\n this.ro.observe(this.el);\n }\n }\n\n private onMove = (e: PointerEvent): void => {\n if (!this.rect) this.rect = this.el.getBoundingClientRect();\n this.pointer = {\n x: e.clientX - this.rect.left,\n y: e.clientY - this.rect.top,\n };\n sharedScheduler.add(this.frame);\n };\n\n private onLeave = (): void => {\n this.pointer = null;\n if (this.hover) {\n this.hover = null;\n this.backend.beginOverlay();\n this.tooltip?.hide();\n this.options.onHover?.(null);\n }\n };\n\n private layout(): { x: [number, number]; y: [number, number] } {\n const w = this.backend.width;\n const h = this.backend.height;\n const mod = this.mod;\n const dom = this.domains();\n if (!mod.axes) {\n this.backend.setPlot({ x: 2, y: 2, w: w - 4, h: h - 4 });\n return dom;\n }\n const ctx = this.backend.main;\n const fmtY = this.options.labels?.y ?? formatSI;\n const plotH = Math.max(1, h - 8 - LABEL_H);\n const yTicks =\n this.data.kind === \"donut\"\n ? []\n : computeTicks(dom.y[0], dom.y[1], Math.max(3, Math.floor(plotH / 48)));\n let gutter = 0;\n if (yTicks.length) {\n ctx.font = `11px ${this.theme.fontFamily}`;\n for (const t of yTicks) {\n gutter = Math.max(gutter, ctx.measureText(fmtY(t)).width);\n }\n gutter += GUTTER_PAD;\n }\n const plot: Rect = {\n x: gutter,\n y: 8,\n w: Math.max(1, w - gutter - 8),\n h: plotH,\n };\n this.backend.setPlot(plot);\n return dom;\n }\n\n private domains(): { x: [number, number]; y: [number, number] } {\n const d = this.data;\n if (d.kind === \"xy\") {\n const nx = d.sortedX.length;\n const vis = this.options.window ?? this.options.maxPoints;\n // kept edge points stay in the buffer but outside the visible domain\n const x0 = vis != null && nx > vis ? nx - vis : 0;\n // sortedX is monotonic — the extent is just first/last\n const x: [number, number] =\n nx > 0\n ? [d.sortedX[x0] as number, d.sortedX[nx - 1] as number]\n : [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (const s of d.series) {\n const y = s.y;\n for (let i = Math.min(x0, y.length); i < y.length; i++) {\n const v = y[i] as number;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n const y2 = s.y2;\n if (y2) {\n for (let i = Math.min(x0, y2.length); i < y2.length; i++) {\n const v = y2[i] as number;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n }\n if (min === Infinity) {\n min = 0;\n max = 1;\n }\n const includeZero =\n this.options.type === \"area\" || this.options.type === \"sparkline\";\n return {\n x,\n y: this.yDomain(padDomain(min, max, includeZero)),\n };\n }\n if (d.kind === \"category\") {\n let min = Infinity;\n let max = -Infinity;\n if (this.options.stacked) {\n for (let ci = 0; ci < d.categories.length; ci++) {\n let pos = 0;\n let neg = 0;\n for (const s of d.series) {\n if (s.kind !== \"column\") continue;\n const v = s.values[ci] ?? 0;\n if (v >= 0) pos += v;\n else neg += v;\n }\n min = Math.min(min, neg);\n max = Math.max(max, pos);\n }\n for (const s of d.series) {\n if (s.kind === \"column\") continue;\n const e = extent(s.values);\n min = Math.min(min, e[0]);\n max = Math.max(max, e[1]);\n }\n } else {\n for (const s of d.series) {\n const e = extent(s.values);\n min = Math.min(min, e[0]);\n max = Math.max(max, e[1]);\n }\n }\n if (min === Infinity) {\n min = 0;\n max = 1;\n }\n return {\n x: [0, d.categories.length],\n y: this.yDomain(padDomain(min, max, true)),\n };\n }\n if (d.kind === \"ohlc\") {\n const x = extent(d.x);\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < d.x.length; i++) {\n const lo = d.low[i] as number;\n const hi = d.high[i] as number;\n if (lo < min) min = lo;\n if (hi > max) max = hi;\n }\n if (min === Infinity) {\n min = 0;\n max = 1;\n }\n return { x, y: this.yDomain(padDomain(min, max)) };\n }\n if (d.kind === \"waterfall\") {\n let min = Infinity;\n let max = -Infinity;\n for (const b of d.bars) {\n min = Math.min(min, b.start, b.end);\n max = Math.max(max, b.start, b.end);\n }\n if (min === Infinity) {\n min = 0;\n max = 1;\n }\n return {\n x: [0, d.bars.length],\n y: this.yDomain(padDomain(min, max, true)),\n };\n }\n return { x: [0, 1], y: this.yDomain([0, 1]) };\n }\n\n private yDomain(y: [number, number]): [number, number] {\n return boundDomain(y, this.options.yMin, this.options.yMax);\n }\n\n private lerpView(eased: number): void {\n const f = this.viewFrom;\n const to = this.viewTo;\n const v = this.view;\n if (!f || eased >= 1) {\n v.x[0] = to.x[0];\n v.x[1] = to.x[1];\n v.y[0] = to.y[0];\n v.y[1] = to.y[1];\n return;\n }\n v.x[0] = f.x[0] + (to.x[0] - f.x[0]) * eased;\n v.x[1] = f.x[1] + (to.x[1] - f.x[1]) * eased;\n v.y[0] = f.y[0] + (to.y[0] - f.y[0]) * eased;\n v.y[1] = f.y[1] + (to.y[1] - f.y[1]) * eased;\n }\n\n private makeScales(): {\n xScale: ReturnType<typeof linearScale>;\n yScale: ReturnType<typeof linearScale>;\n } {\n const plot = this.backend.plot;\n const dom = this.view;\n const volBand =\n this.data.kind === \"ohlc\" && this.data.volume ? plot.h * 0.18 : 0;\n return {\n xScale: linearScale(dom.x[0], dom.x[1], plot.x, plot.x + plot.w),\n yScale: linearScale(\n dom.y[0],\n dom.y[1],\n plot.y + plot.h - volBand,\n plot.y,\n ),\n };\n }\n\n private renderContext(t: number, scales = this.makeScales()): RenderContext {\n const { xScale, yScale } = scales;\n return {\n backend: this.backend,\n ctx: this.backend.main,\n plot: this.backend.plot,\n theme: this.theme,\n opts: this.options,\n data: this.data,\n xScale,\n yScale,\n t,\n };\n }\n\n private drawStatic(scales = this.makeScales()): void {\n if (!this.mod.axes) return;\n const ctx = this.backend.grid();\n const plot = this.backend.plot;\n const { xScale, yScale } = scales;\n const fmtY = this.options.labels?.y ?? formatSI;\n ctx.font = `11px ${this.theme.fontFamily}`;\n ctx.fillStyle = this.theme.textMuted;\n\n const showGrid = this.options.grid ?? true;\n const yTicks = computeTicks(\n yScale.domain[0],\n yScale.domain[1],\n Math.max(3, Math.floor(plot.h / 48)),\n );\n if (showGrid) {\n ctx.strokeStyle = this.theme.grid;\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (const t of yTicks) {\n const y = Math.round(yScale(t)) + 0.5;\n ctx.moveTo(plot.x, y);\n ctx.lineTo(plot.x + plot.w, y);\n }\n ctx.stroke();\n }\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n for (const t of yTicks) {\n ctx.fillText(fmtY(t), plot.x - GUTTER_PAD, yScale(t));\n }\n\n ctx.textBaseline = \"top\";\n const d = this.data;\n if (d.kind === \"category\" || d.kind === \"waterfall\") {\n ctx.textAlign = \"center\";\n const cats = d.categories;\n const n = d.kind === \"category\" ? cats.length : d.bars.length;\n const slot = plot.w / Math.max(1, n);\n for (let i = 0; i < n; i++) {\n ctx.fillText(\n cats[i] ?? \"\",\n plot.x + slot * (i + 0.5),\n plot.y + plot.h + 6,\n );\n }\n } else if (d.kind === \"xy\" || d.kind === \"ohlc\") {\n const fmtX = this.options.labels?.x ?? formatSI;\n const xTicks = computeTicks(\n xScale.domain[0],\n xScale.domain[1],\n Math.max(3, Math.floor(plot.w / 90)),\n );\n for (const t of xTicks) {\n const px = xScale(t);\n ctx.textAlign =\n px < plot.x + 24\n ? \"left\"\n : px > plot.x + plot.w - 24\n ? \"right\"\n : \"center\";\n ctx.fillText(fmtX(t), px, plot.y + plot.h + 6);\n }\n }\n if (this.options.type === \"bar\" || this.options.type === \"combo\") {\n const base = Math.round(yScale(0)) + 0.5;\n if (base >= plot.y && base <= plot.y + plot.h + 1) {\n ctx.strokeStyle = this.theme.axisBaseline;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.w, base);\n ctx.stroke();\n }\n }\n this.backend.blitGrid();\n }\n\n private render(t: number): void {\n this.backend.begin();\n const scales = this.makeScales();\n this.drawStatic(scales);\n if (this.gpu) this.gpuRender(t, scales);\n else this.mod.render(this.renderContext(t, scales));\n if (this.hover) this.drawHover(this.hover, scales.yScale);\n }\n\n /**\n * Series rasterization on the GPU; grid/labels/hover stay on Canvas2D.\n * Raw data lives in GPU buffers — the per-frame cost is uniform writes +\n * instanced draws, with compute decimation above the density threshold.\n */\n private gpuRender(\n t: number,\n scales: {\n xScale: ReturnType<typeof linearScale>;\n yScale: ReturnType<typeof linearScale>;\n },\n ): void {\n const g = this.gpu;\n const d = this.data;\n const kind = GPU_KIND[this.options.type];\n if (!g || g.unavailable || !kind || d.kind !== \"xy\") {\n this.mod.render(this.renderContext(t, scales));\n return;\n }\n g.syncData(d, this.dataRev);\n const view = { x: scales.xScale.domain, y: scales.yScale.domain };\n const flow = this.options.flow ? FLOW_RIPPLE : 0;\n g.begin(this.backend.plot, t, flow);\n for (let i = 0; i < d.series.length; i++) {\n const s = d.series[i];\n if (!s) continue;\n if (kind === \"points\") {\n g.points(i, s.color, 2.5, 0.65, view);\n continue;\n }\n if (kind === \"area\") {\n g.area(i, s.color, Math.max(0, scales.yScale.domain[0]), view);\n }\n g.line(i, s.color, 2, view);\n }\n g.end();\n }\n\n private drawHover(info: HoverInfo, yScale = this.makeScales().yScale): void {\n const o = this.backend.overlay;\n const plot = this.backend.plot;\n this.backend.beginOverlay();\n if (info.kind === \"point\" && this.options.type === \"radar\") {\n drawRadarHover(this.renderContext(1), info);\n return;\n }\n if (info.kind === \"point\" || info.kind === \"candle\") {\n o.strokeStyle = this.theme.crosshair;\n o.lineWidth = 1;\n o.beginPath();\n const x = Math.round(info.px) + 0.5;\n o.moveTo(x, plot.y);\n o.lineTo(x, plot.y + plot.h);\n o.stroke();\n const d = this.data;\n if (info.kind === \"point\" && (d.kind === \"xy\" || d.kind === \"category\")) {\n for (const v of info.values) {\n const s = d.series.find(\n (s2) => s2.label === v.label && s2.color === v.color,\n );\n const yv = s\n ? \"y\" in s\n ? s.y[info.index]\n : s.values[info.index]\n : v.y;\n o.fillStyle = v.color;\n o.strokeStyle = this.theme.bg;\n o.lineWidth = 2;\n o.beginPath();\n o.arc(info.px, yScale(yv as number), 4, 0, Math.PI * 2);\n o.fill();\n o.stroke();\n }\n }\n } else if (info.kind === \"bar\") {\n o.fillStyle = withAlpha(this.theme.text, 0.12);\n o.fillRect(info.rect.x, info.rect.y, info.rect.w, info.rect.h);\n } else {\n o.fillStyle = withAlpha(info.color, 0.25);\n const d = this.data;\n if (d.kind === \"donut\") {\n const cx = plot.x + plot.w / 2;\n const cy = plot.y + plot.h / 2;\n const rOuter = Math.min(plot.w, plot.h) / 2;\n const rInner = this.options.type === \"pie\" ? 0 : rOuter * 0.65;\n let a = -Math.PI / 2;\n for (let i = 0; i < d.slices.length; i++) {\n const s = d.slices[i];\n if (!s) continue;\n const frac = d.total > 0 ? s.value / d.total : 0;\n const a1 = a + frac * Math.PI * 2;\n if (i === info.index) {\n o.beginPath();\n o.arc(cx, cy, rOuter, a, a1);\n o.arc(cx, cy, rInner, a1, a, true);\n o.closePath();\n o.fill();\n }\n a = a1;\n }\n }\n }\n }\n\n private applyHover(px: number, py: number): void {\n const hit = this.mod.hit;\n if (!hit) return;\n const info = hit(this.renderContext(1), px, py);\n if (!info) {\n if (this.hover) {\n this.hover = null;\n this.backend.beginOverlay();\n this.tooltip?.hide();\n this.options.onHover?.(null);\n }\n return;\n }\n this.hover = info;\n this.drawHover(info);\n this.options.onHover?.(info);\n if (!this.tooltip) return;\n const fmtY = this.options.labels?.y ?? formatSI;\n if (info.kind === \"point\") {\n const fmtX = this.options.labels?.x ?? formatSI;\n this.tooltip.show(\n info.px,\n info.py,\n info.values.map((v) => ({\n color: v.color,\n label: v.label,\n value: fmtY(v.y),\n })),\n info.title ?? fmtX(info.x),\n );\n } else if (info.kind === \"bar\") {\n this.tooltip.show(\n info.px,\n info.py,\n [{ color: info.color, label: info.label, value: fmtY(info.value) }],\n info.category,\n );\n } else if (info.kind === \"candle\") {\n const fmtX = this.options.labels?.x ?? formatSI;\n this.tooltip.show(\n info.px,\n info.py,\n [\n { label: \"Open\", value: fmtY(info.open) },\n { label: \"High\", value: fmtY(info.high) },\n { label: \"Low\", value: fmtY(info.low) },\n { label: \"Close\", value: fmtY(info.close) },\n ],\n fmtX(info.x),\n );\n } else {\n this.tooltip.show(\n info.px,\n info.py,\n [{ color: info.color, label: info.label, value: fmtY(info.value) }],\n `${Math.round(info.share * 100)}%`,\n );\n }\n }\n\n private resolveAnimDur(): number {\n if (this.reduced) return 0;\n const a = this.options.animate ?? true;\n if (typeof a === \"number\") return Math.max(0, a);\n if (!a) return 0;\n // flow mode: tween for the measured append cadence so the pan finishes\n // exactly when the next sample arrives — perpetual motion, zero lag\n if (this.options.flow) {\n return Math.min(10_000, Math.max(60, this.estInterval));\n }\n return 400;\n }\n\n private startAnimation(\n dom: { x: [number, number]; y: [number, number] } = this.domains(),\n ): void {\n this.animDur = this.resolveAnimDur();\n this.viewFrom = {\n x: [this.view.x[0], this.view.x[1]],\n y: [this.view.y[0], this.view.y[1]],\n };\n this.viewTo = dom;\n this.animStart = -1;\n sharedScheduler.add(this.frame);\n }\n\n /** Replace the chart data; the view morphs to the new dataset. */\n setData(data: ChartData): void {\n const prev = this.data;\n this.data = this.normalize(data, prev);\n this.dataRev++;\n this.maybeInitGpu();\n const dom = this.layout();\n this.startAnimation(dom);\n }\n\n /**\n * Append one sample to every series of an xy chart (line/area/scatter/\n * sparkline). With `options.window`, old points are dropped FIFO and the\n * viewport pans smoothly. Non-monotonic x falls back to a resort.\n */\n append(x: number, y: number | number[]): void {\n const d = this.data;\n if (d.kind !== \"xy\") {\n throw new Error(\n \"[resolvcharts] append() requires xy data (line/area/scatter/bubble/rangearea/sparkline)\",\n );\n }\n // EMA of append cadence — drives flow-mode tween duration\n const nowT =\n typeof performance === \"undefined\" ? Date.now() : performance.now();\n if (this.lastAppendAt > 0) {\n const dt = nowT - this.lastAppendAt;\n if (dt > 0 && dt < 60_000) {\n this.estInterval = this.estInterval * 0.7 + dt * 0.3;\n }\n }\n this.lastAppendAt = nowT;\n\n const ys = Array.isArray(y) ? y : [y];\n const n = d.sortedX.length;\n // retention cap: maxPoints wins, else window; the EDGE_KEEP margin keeps\n // outgoing points in the buffer so they animate fully off-screen\n const win = this.options.window;\n const cap =\n this.options.maxPoints != null\n ? this.options.maxPoints + EDGE_KEEP\n : win != null\n ? win + EDGE_KEEP\n : undefined;\n const drop = cap != null ? Math.max(0, n + 1 - cap) : 0;\n const m = n + 1 - drop;\n const steady = drop === 1;\n\n let sortedX: Float64Array;\n if (steady) {\n // window full: shift in place instead of reallocating\n sortedX = d.sortedX;\n sortedX.copyWithin(0, 1);\n sortedX[n - 1] = x;\n } else {\n sortedX = new Float64Array(m);\n sortedX.set(d.sortedX.subarray(drop));\n sortedX[m - 1] = x;\n }\n\n const series = d.series.map((s, i) => {\n const v = ys[i] ?? s.y[n - 1] ?? 0;\n let yNew: Float64Array;\n let prevY: Float64Array;\n if (steady) {\n // shifted in place, s.y now holds the previous alignment and its\n // last slot already equals yNew[m-2] — reuse it as prevY; recycle\n // the old prevY buffer as yNew so steady-state appends don't alloc\n s.y.copyWithin(0, 1);\n prevY = s.y;\n yNew = s.prevY && s.prevY.length === m ? s.prevY : new Float64Array(m);\n yNew.set(prevY);\n yNew[m - 1] = v;\n } else {\n yNew = new Float64Array(m);\n yNew.set(s.y.subarray(drop));\n yNew[m - 1] = v;\n prevY = new Float64Array(m);\n prevY.set(s.y.subarray(drop));\n prevY[m - 1] =\n m > 1 ? (yNew[m - 2] as number) : (yNew[m - 1] as number);\n }\n // auxiliary channels (bubble r, rangearea y2) ride along — the new\n // tail duplicates the last retained value\n let rNew: Float64Array | null = null;\n if (s.r) {\n rNew = new Float64Array(m);\n rNew.set(s.r.subarray(drop));\n rNew[m - 1] = s.r[n - 1] as number;\n }\n let y2New: Float64Array | null = null;\n let prevY2: Float64Array | null = null;\n if (s.y2) {\n y2New = new Float64Array(m);\n y2New.set(s.y2.subarray(drop));\n y2New[m - 1] = s.y2[n - 1] as number;\n prevY2 = new Float64Array(m);\n prevY2.set(s.y2.subarray(drop));\n prevY2[m - 1] =\n m > 1 ? (y2New[m - 2] as number) : (y2New[m - 1] as number);\n }\n return {\n label: s.label,\n color: s.color,\n y: yNew,\n prevY,\n r: rNew,\n y2: y2New,\n prevY2,\n pathCache: null,\n };\n });\n\n const nd: NormalizedXY = { kind: \"xy\", sortedX, series };\n const resort = m > 1 && x < (sortedX[m - 2] as number);\n if (resort) resortXY(nd);\n this.data = nd;\n if (resort) {\n this.dataRev++;\n } else if (this.gpu && !this.gpu.unavailable) {\n // ring-buffer path: only the appended tail reaches the GPU. s.y[n-1]\n // still holds the pre-append tail value (steady state shifts in place),\n // which is what the new point animates up from\n const ok = this.gpu.appended(\n x,\n d.series.map((s, i) => ys[i] ?? (s.y[n - 1] as number)),\n d.series.map((s) => s.y[n - 1] as number),\n drop,\n );\n if (!ok) this.dataRev++;\n }\n this.maybeInitGpu();\n this.pendingView = true;\n sharedScheduler.add(this.frame);\n }\n\n /** Re-measure the container and re-render (called automatically via ResizeObserver). */\n resize(): void {\n const w = this.el.clientWidth || 320;\n const h =\n this.el.clientHeight || (this.options.type === \"sparkline\" ? 32 : 240);\n if (w === this.backend.width && h === this.backend.height) {\n if (this.backend.dpr === (window.devicePixelRatio || 1)) return;\n }\n this.backend.resize(w, h);\n this.gpu?.setSize(w, h, this.backend.dpr);\n this.rect = null;\n this.layout();\n this.animStart = null;\n sharedScheduler.add((now) => {\n this.render(1);\n void now;\n return false;\n });\n }\n\n /** Remove listeners, stop animation, release canvases and GPU resources. */\n destroy(): void {\n this.destroyed = true;\n sharedScheduler.remove(this.frame);\n this.ro?.disconnect();\n this.el.removeEventListener(\"pointermove\", this.onMove);\n this.el.removeEventListener(\"pointerleave\", this.onLeave);\n window.removeEventListener(\"scroll\", this.onScroll, true);\n this.tooltip?.destroy();\n this.gpu?.destroy();\n this.backend.destroy();\n }\n}\n\nfunction resortXY(d: NormalizedXY): void {\n const n = d.sortedX.length;\n const idx = new Uint32Array(n);\n for (let i = 0; i < n; i++) idx[i] = i;\n const xs = d.sortedX;\n idx.sort((a, b) => (xs[a] as number) - (xs[b] as number));\n const sx = new Float64Array(n);\n for (let i = 0; i < n; i++) sx[i] = xs[idx[i] as number] as number;\n d.sortedX = sx;\n for (const s of d.series) {\n const ny = new Float64Array(n);\n const np = s.prevY ? new Float64Array(n) : null;\n const nr = s.r ? new Float64Array(n) : null;\n const ny2 = s.y2 ? new Float64Array(n) : null;\n const np2 = s.prevY2 ? new Float64Array(n) : null;\n for (let i = 0; i < n; i++) {\n const k = idx[i] as number;\n ny[i] = s.y[k] as number;\n if (np && s.prevY) np[i] = s.prevY[k] as number;\n if (nr && s.r) nr[i] = s.r[k] as number;\n if (ny2 && s.y2) ny2[i] = s.y2[k] as number;\n if (np2 && s.prevY2) np2[i] = s.prevY2[k] as number;\n }\n s.y = ny;\n s.prevY = np;\n s.r = nr;\n s.y2 = ny2;\n s.prevY2 = np2;\n }\n}\n\n/**\n * Create a chart inside `el`.\n * @category Charts\n *\n * @example\n * ```ts\n * const chart = createChart(document.getElementById(\"c\")!, {\n * type: \"line\",\n * curve: \"smooth\",\n * flow: true,\n * window: 30,\n * data: { x: xs, series: [{ label: \"cpu\", y: ys }] },\n * });\n * setInterval(() => chart.append(Date.now(), sample()), 2000);\n * ```\n */\nexport function createChart(el: HTMLElement, options: ChartOptions): Chart {\n return new Chart(el, options);\n}\n"],"mappings":"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"}