resolvcharts 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +74 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +42 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +74 -32
- package/dist/index.mjs.map +1 -1
- package/dist/resolvcharts.global.min.js +195 -25
- package/dist/resolvcharts.global.min.js.map +1 -1
- package/dist/series-PmAjztEh.cjs +1191 -0
- package/dist/series-PmAjztEh.cjs.map +1 -0
- package/dist/series-wyqYpkXm.mjs +1191 -0
- package/dist/series-wyqYpkXm.mjs.map +1 -0
- package/package.json +17 -14
- package/dist/series-BdprL87H.mjs +0 -479
- package/dist/series-BdprL87H.mjs.map +0 -1
- package/dist/series-J_5Z6dah.cjs +0 -479
- package/dist/series-J_5Z6dah.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.iife.js","names":["MAX_BAR_W","RADIUS","hitScatter","hitSparkline","hitBaseline","d","exports","__defProp","__esmMin","err","fn","res","__exportAll","target","name","all","no_symbols","barGeometry","cats","d","slot","r","groupW","barW","x","catIdx","seriesIdx","base","yv","value","topRounded","rect","h","w","rad","ctx","up","y","stackedGeometry","yTop","v0","v1","yBot","renderBar","animate","ci","pos","neg","si","s","cur","prev","v","hitBar","px","cat","py","s0","inside","withAlpha","color","hex","c","n","alpha","m","mapSeriesPx","xs","ys","out","xd","xScale","xr","kx","bx","yd","yScale","yr","ky","by","lerp","t","inv","flow","f1","o","i","ti","p","yFallback","decScratch","decimateSeriesPx","maxPts","pixelWidth","firstX","firstY","col","minX","minY","maxX","maxY","lastX","lastY","cap","decimateM4","put","flush","nearestIndex","lo","hi","mid","dLo","isXY","smScratch","smoothPath","pts","segs","need","tang","dxi","a","b","mi","ti1","lim","x0","x1","y0","y1","FLOW_RIPPLE","seriesPoints","fb","buildPath","path","dn","curve","renderLine","fill","area","g","hitXY","idx","xVal","sx","values","yVal","sy","renderBaseline","basePx","regions","reg","renderCandles","wickUp","wickDown","bodyUp","bodyDown","volUp","volDown","bandH","bandBot","vol","bodyW","half","vmax","vk","cx","wick","ohlcStyle","op","cl","maxCols","cxA","oA","hA","lA","cA","vA","nc","prevCol","k","pitch","hitCandle","ovScratch","overlayPath","renderCombo","valAt","nCols","hitCombo","formatNumber","MAGNITUDES","formatSI","abs","digits","GAP","START","donutGeometry","cy","rOuter","rInner","angles","sweep","frac","a1","renderDonut","geo","an","a0","hitDonut","dx","dy","dist","angle","renderScatter","fallback","xMin","xMax","yp","renderSparkline","barRect","bar","end","barColor","renderWaterfall","hitWaterfall","makeCanvas","cssW","cssH","setup2d","canvas","settings","CanvasBackend","container","plot","linearScale","dd","d1","d0","dr","r1","r0","extent","min","max","padDomain","includeZero","pad","raf","cb","caf","id","sharedScheduler","now","easeOutCubic","FONT","lightTheme","darkTheme","categoricalLight","categoricalDark","resolveTheme","opt","accent","seriesColor","explicit","theme","index","STEPS","niceStep","raw","range","pow","norm","step","computeTicks","ticks","Tooltip","el","title","rows","row","sw","lab","val","parent","pw","ph","left","top","parseColor","parts","init_color","getGpuDevice","key","opts","cache","gpu","req","adapter","requiredFeatures","init_device","series_exports","GpuSeries","HEADER","LINE_WGSL","AREA_WGSL","POINTS_WGSL","UNIFORM_SIZE","BLEND","BUF_VERTEX_DST","BUF_UNIFORM_DST","BUF_RESOLVE_SRC","BUF_MAPREAD_DST","MAP_READ","init_series","device","timing","pl","mk","pairLayout","ptLayout","areaLayout","dpr","bytes","view","pass","instances","udata","params","ubuf","bind","pipe","vbufs","vertCount","pbuf","width","baseY","radius","qs","qb","rb","t0","t1","MODULES","GPU_KIND","Chart","more","eased","options","dom","data","open","high","low","close","hasVol","volume","totals","run","bars","slices","prevSeries","xRaw","sortedX","src","mod","fmtY","plotH","yTicks","gutter","nx","vis","f","to","volBand","scales","showGrid","fmtX","xTicks","kind","info","s2","hit","nowT","dt","win","drop","steady","series","yNew","prevY","nd","resortXY","ny","np","createChart"],"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/gpu/color.ts","../src/gpu/device.ts","../src/gpu/series.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","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","/** Parse a CSS color (#rgb, #rrggbb, rgb(), rgba()) into linear-ish 0-1 rgba. */\nexport function parseColor(c: string): [number, number, number, number] {\n if (c.startsWith(\"#\")) {\n const h = c.slice(1);\n if (h.length === 3) {\n return [\n parseInt(h[0] as string, 16) / 15,\n parseInt(h[1] as string, 16) / 15,\n parseInt(h[2] as string, 16) / 15,\n 1,\n ];\n }\n if (h.length === 6) {\n return [\n parseInt(h.slice(0, 2), 16) / 255,\n parseInt(h.slice(2, 4), 16) / 255,\n parseInt(h.slice(4, 6), 16) / 255,\n 1,\n ];\n }\n }\n const m = /rgba?\\(([^)]+)\\)/.exec(c);\n if (m) {\n const parts = (m[1] as string).split(\",\").map((v) => Number.parseFloat(v));\n return [\n (parts[0] ?? 0) / 255,\n (parts[1] ?? 0) / 255,\n (parts[2] ?? 0) / 255,\n parts[3] ?? 1,\n ];\n }\n return [0, 0, 0, 1];\n}\n","export interface GpuRequestOptions {\n powerPreference?: \"default\" | \"low-power\" | \"high-performance\";\n /** use WebGPU compatibility mode (GLES 3.1 / D3D11 reach) */\n compat?: boolean;\n /** request \"timestamp-query\" when the adapter supports it */\n timing?: boolean;\n}\n\n/** Shared GPUDevice across charts — adapters/devices are expensive to acquire. */\nconst cache = new Map<string, Promise<GPUDevice | null>>();\n\nexport function getGpuDevice(\n opts: GpuRequestOptions = {},\n): Promise<GPUDevice | null> {\n const key = JSON.stringify(opts);\n let p = cache.get(key);\n if (!p) {\n p = (async (): Promise<GPUDevice | null> => {\n const nav = typeof navigator === \"undefined\" ? null : navigator;\n const gpu = (nav as Navigator | null)?.gpu;\n if (!gpu) return null;\n const req: GPURequestAdapterOptions = {};\n if (opts.powerPreference && opts.powerPreference !== \"default\") {\n req.powerPreference = opts.powerPreference;\n }\n if (opts.compat) {\n (req as { featureLevel?: \"compatibility\" }).featureLevel =\n \"compatibility\";\n }\n const adapter = await gpu.requestAdapter(req);\n if (!adapter) return null;\n const requiredFeatures: GPUFeatureName[] = [];\n if (opts.timing && adapter.features.has(\"timestamp-query\")) {\n requiredFeatures.push(\"timestamp-query\");\n }\n return adapter.requestDevice({ requiredFeatures });\n })();\n p.catch(() => cache.delete(key));\n cache.set(key, p);\n }\n return p;\n}\n","import type { Rect } from \"../core/types\";\nimport { parseColor } from \"./color\";\nimport { type GpuRequestOptions, getGpuDevice } from \"./device\";\n\n/**\n * WebGPU series renderer. Points arrive as interleaved [x, y] CSS-pixel pairs\n * (the same Float32Array the canvas path decimates into) uploaded as vertex\n * buffers; the GPU only rasterizes — instanced segment quads for lines, a\n * triangle strip to the baseline for areas, SDF circle sprites for scatter.\n *\n * Vertex-pulling via attributes is used everywhere (no vertex-stage storage\n * buffers), so the same pipelines work in WebGPU compatibility mode.\n */\n\nconst HEADER = /* wgsl */ `\nstruct U {\n res: vec4f, // canvas w, h (device px), dpr, unused\n color: vec4f,\n p: vec4f, // line: width | area: baseY, plotTop, plotH | points: radius\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn toClip(p: vec2f) -> vec4f {\n let d = p * u.res.z;\n return vec4f(d.x / u.res.x * 2.0 - 1.0, 1.0 - d.y / u.res.y * 2.0, 0.0, 1.0);\n}\n`;\n\nconst LINE_WGSL = /* wgsl */ `\n${HEADER}\nconst OFF = array<vec2f, 6>(\n vec2f(0.0, -1.0), vec2f(0.0, 1.0), vec2f(1.0, -1.0),\n vec2f(0.0, 1.0), vec2f(1.0, 1.0), vec2f(1.0, -1.0),\n);\nstruct VOut {\n @builtin(position) pos: vec4f,\n @location(0) edge: f32,\n};\n@vertex fn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) a: vec2f,\n @location(1) b: vec2f,\n) -> VOut {\n let v = OFF[vi];\n var dir = b - a;\n let len = length(dir);\n if (len < 1e-6) {\n dir = vec2f(1.0, 0.0);\n } else {\n dir = dir / len;\n }\n let nrm = vec2f(-dir.y, dir.x);\n let halfW = u.p.x * 0.5;\n let aa = 0.9;\n let p = mix(a, b, v.x) + nrm * v.y * (halfW + aa);\n var o: VOut;\n o.pos = toClip(p);\n o.edge = v.y * (halfW + aa);\n return o;\n}\n@fragment fn fs(o: VOut) -> @location(0) vec4f {\n let halfW = u.p.x * 0.5;\n let a = 1.0 - smoothstep(halfW - 0.5, halfW + 0.9, abs(o.edge));\n return vec4f(u.color.rgb, u.color.a * a);\n}\n`;\n\nconst AREA_WGSL = /* wgsl */ `\n${HEADER}\nstruct VOut {\n @builtin(position) pos: vec4f,\n @location(0) grad: f32,\n};\n// triangle strip over a doubled buffer: buf[2k] and buf[2k+1] both hold\n// point k; even verts land on the path, odd verts drop to the baseline\n@vertex fn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) top: vec2f,\n) -> VOut {\n let isTop = (vi & 1u) == 0u;\n let baseY = u.p.x;\n let y = select(baseY, top.y, isTop);\n var o: VOut;\n o.pos = toClip(vec2f(top.x, y));\n o.grad = clamp((top.y - u.p.y) / max(u.p.z, 1.0), 0.0, 1.0);\n return o;\n}\n@fragment fn fs(o: VOut) -> @location(0) vec4f {\n let a = mix(0.16, 0.0, o.grad) * u.color.a;\n return vec4f(u.color.rgb, a);\n}\n`;\n\nconst POINTS_WGSL = /* wgsl */ `\n${HEADER}\nconst QUAD = array<vec2f, 6>(\n vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(-1.0, 1.0),\n vec2f(-1.0, 1.0), vec2f(1.0, -1.0), vec2f(1.0, 1.0),\n);\nstruct VOut {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n};\n@vertex fn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) c: vec2f,\n) -> VOut {\n let r = u.p.x;\n let q = QUAD[vi];\n var o: VOut;\n o.pos = toClip(c + q * r);\n o.local = q * r;\n return o;\n}\n@fragment fn fs(o: VOut) -> @location(0) vec4f {\n let r = u.p.x;\n let a = 1.0 - smoothstep(r - 1.2, r, length(o.local));\n return vec4f(u.color.rgb, u.color.a * a);\n}\n`;\n\nconst UNIFORM_SIZE = 64; // 4 x vec4f\nconst BLEND: GPUBlendState = {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n};\n\n// GPUBufferUsage flags (lib.dom has the types but not the const objects)\nconst BUF_VERTEX_DST = 0x28; // VERTEX | COPY_DST\nconst BUF_UNIFORM_DST = 0x48; // UNIFORM | COPY_DST\nconst BUF_RESOLVE_SRC = 0x204; // QUERY_RESOLVE | COPY_SRC\nconst BUF_MAPREAD_DST = 0x09; // MAP_READ | COPY_DST\nconst MAP_READ = 0x1;\n\nexport class GpuSeries {\n readonly canvas: HTMLCanvasElement;\n private device: GPUDevice;\n private ctx: GPUCanvasContext;\n private format: GPUTextureFormat;\n private pipes: {\n line: GPURenderPipeline;\n area: GPURenderPipeline;\n points: GPURenderPipeline;\n };\n private layout: GPUBindGroupLayout;\n private dpr = 1;\n private drawIdx = 0;\n private bufs: GPUBuffer[] = [];\n private encoder: GPUCommandEncoder | null = null;\n private pass: GPURenderPassEncoder | null = null;\n /** last measured GPU execution time in ms (when timing enabled) */\n gpuMs: number | null = null;\n private querySet: GPUQuerySet | null = null;\n private queryBuf: GPUBuffer | null = null;\n private readBuf: GPUBuffer | null = null;\n private reading = false;\n private areaScratch = new Float32Array(0);\n\n private constructor(\n device: GPUDevice,\n canvas: HTMLCanvasElement,\n timing: boolean,\n ) {\n this.device = device;\n if (timing && device.features.has(\"timestamp-query\")) {\n this.querySet = device.createQuerySet({ type: \"timestamp\", count: 2 });\n this.queryBuf = device.createBuffer({\n size: 16,\n usage: BUF_RESOLVE_SRC,\n });\n this.readBuf = device.createBuffer({\n size: 16,\n usage: BUF_MAPREAD_DST,\n });\n }\n this.canvas = canvas;\n canvas.style.cssText =\n \"position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none\";\n const ctx = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!ctx) throw new Error(\"resolvcharts: webgpu context unavailable\");\n this.ctx = ctx;\n this.format = navigator.gpu.getPreferredCanvasFormat();\n\n this.layout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n // GPUShaderStage.VERTEX | FRAGMENT\n visibility: 3,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const pl = device.createPipelineLayout({ bindGroupLayouts: [this.layout] });\n const mk = (\n code: string,\n topology: GPUPrimitiveTopology,\n buffers: GPUVertexBufferLayout[],\n ) =>\n device.createRenderPipeline({\n layout: pl,\n vertex: {\n module: device.createShaderModule({ code }),\n entryPoint: \"vs\",\n buffers,\n },\n fragment: {\n module: device.createShaderModule({ code }),\n entryPoint: \"fs\",\n targets: [{ format: this.format, blend: BLEND }],\n },\n primitive: { topology },\n });\n // line: same points buffer bound twice — slot 0 yields pts[i],\n // slot 1 (bound at +8 bytes) yields pts[i+1]\n const pairLayout: GPUVertexBufferLayout[] = [\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n },\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x2\" }],\n },\n ];\n const ptLayout: GPUVertexBufferLayout = {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n };\n const areaLayout: GPUVertexBufferLayout = {\n arrayStride: 8,\n stepMode: \"vertex\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n };\n this.pipes = {\n line: mk(LINE_WGSL, \"triangle-list\", pairLayout),\n area: mk(AREA_WGSL, \"triangle-strip\", [areaLayout]),\n points: mk(POINTS_WGSL, \"triangle-list\", [ptLayout]),\n };\n }\n\n static async create(opts: GpuRequestOptions = {}): Promise<GpuSeries | null> {\n const device = await getGpuDevice(opts);\n if (!device) return null;\n const canvas = document.createElement(\"canvas\");\n try {\n const g = new GpuSeries(device, canvas, !!opts.timing);\n return g;\n } catch {\n return null;\n }\n }\n\n setSize(cssW: number, cssH: number, dpr: number): void {\n this.dpr = dpr;\n this.canvas.width = Math.max(1, Math.round(cssW * dpr));\n this.canvas.height = Math.max(1, Math.round(cssH * dpr));\n this.ctx.configure({\n device: this.device,\n format: this.format,\n alphaMode: \"premultiplied\",\n });\n }\n\n private bufferFor(idx: number, bytes: number): GPUBuffer {\n let b = this.bufs[idx];\n if (!b || b.size < bytes) {\n b?.destroy();\n b = this.device.createBuffer({\n size: Math.max(256, bytes),\n usage: BUF_VERTEX_DST,\n });\n this.bufs[idx] = b;\n }\n return b;\n }\n\n begin(plot: Rect): void {\n this.encoder = this.device.createCommandEncoder();\n const view = this.ctx.getCurrentTexture().createView();\n this.pass = this.encoder.beginRenderPass({\n colorAttachments: [\n {\n view,\n loadOp: \"clear\",\n storeOp: \"store\",\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n },\n ],\n ...(this.querySet\n ? {\n timestampWrites: {\n querySet: this.querySet,\n beginningOfPassWriteIndex: 0,\n endOfPassWriteIndex: 1,\n },\n }\n : {}),\n });\n const d = this.dpr;\n this.pass.setScissorRect(\n Math.max(0, Math.floor(plot.x * d)),\n Math.max(0, Math.floor(plot.y * d)),\n Math.max(1, Math.floor(plot.w * d)),\n Math.max(1, Math.floor(plot.h * d)),\n );\n this.drawIdx = 0;\n }\n\n private draw(\n pipe: GPURenderPipeline,\n vbufs: { buf: GPUBuffer; offset: number }[],\n color: string,\n alpha: number,\n params: [number, number, number],\n vertCount: number,\n instances: number,\n ): void {\n const pass = this.pass;\n if (!pass || instances <= 0) return;\n const [r, g, b, a] = parseColor(color);\n const udata = new Float32Array(16);\n udata.set([this.canvas.width, this.canvas.height, this.dpr, 0]);\n udata.set([r, g, b, a * alpha], 4);\n udata.set(params, 8);\n const ubuf = this.device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUF_UNIFORM_DST,\n });\n this.device.queue.writeBuffer(ubuf, 0, udata);\n\n const bind = this.device.createBindGroup({\n layout: this.layout,\n entries: [{ binding: 0, resource: { buffer: ubuf } }],\n });\n pass.setPipeline(pipe);\n pass.setBindGroup(0, bind);\n for (let i = 0; i < vbufs.length; i++) {\n const v = vbufs[i];\n if (v) pass.setVertexBuffer(i, v.buf, v.offset);\n }\n pass.draw(vertCount, instances);\n }\n\n line(pts: Float32Array, color: string, width = 2): void {\n const n = pts.length / 2;\n const idx = this.drawIdx++;\n const pbuf = this.bufferFor(idx, pts.byteLength);\n this.device.queue.writeBuffer(pbuf, 0, pts as Float32Array<ArrayBuffer>);\n this.draw(\n this.pipes.line,\n [\n { buf: pbuf, offset: 0 },\n { buf: pbuf, offset: 8 },\n ],\n color,\n 1,\n [width, 0, 0],\n 6,\n n - 1,\n );\n }\n\n area(pts: Float32Array, color: string, baseY: number, plot: Rect): void {\n const n = pts.length / 2;\n // double each point so vertex_index can pick top vs baseline by parity\n if (this.areaScratch.length < n * 4) {\n this.areaScratch = new Float32Array(n * 4);\n }\n const d = this.areaScratch;\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 const o = 4 * i;\n d[o] = x;\n d[o + 1] = y;\n d[o + 2] = x;\n d[o + 3] = y;\n }\n const out = d.subarray(0, n * 4);\n const idx = this.drawIdx++;\n const pbuf = this.bufferFor(idx, out.byteLength);\n this.device.queue.writeBuffer(pbuf, 0, out as Float32Array<ArrayBuffer>);\n this.draw(\n this.pipes.area,\n [{ buf: pbuf, offset: 0 }],\n color,\n 1,\n [baseY, plot.y, plot.h],\n n * 2,\n 1,\n );\n }\n\n points(pts: Float32Array, color: string, radius = 2.5, alpha = 0.65): void {\n const n = pts.length / 2;\n const idx = this.drawIdx++;\n const pbuf = this.bufferFor(idx, pts.byteLength);\n this.device.queue.writeBuffer(pbuf, 0, pts as Float32Array<ArrayBuffer>);\n this.draw(\n this.pipes.points,\n [{ buf: pbuf, offset: 0 }],\n color,\n alpha,\n [radius, 0, 0],\n 6,\n n,\n );\n }\n\n end(): void {\n if (!this.pass || !this.encoder) return;\n this.pass.end();\n const qs = this.querySet;\n const qb = this.queryBuf;\n const rb = this.readBuf;\n if (qs && qb && rb && !this.reading) {\n this.encoder.resolveQuerySet(qs, 0, 2, qb, 0);\n this.encoder.copyBufferToBuffer(qb, 0, rb, 0, 16);\n this.reading = true;\n this.device.queue.submit([this.encoder.finish()]);\n void rb.mapAsync(MAP_READ).then(() => {\n const v = new BigUint64Array(rb.getMappedRange());\n const t0 = v[0];\n const t1 = v[1];\n if (t0 !== undefined && t1 !== undefined) {\n this.gpuMs = Number(t1 - t0) / 1e6;\n }\n rb.unmap();\n this.reading = false;\n });\n } else {\n this.device.queue.submit([this.encoder.finish()]);\n }\n this.pass = null;\n this.encoder = null;\n }\n\n destroy(): void {\n for (const b of this.bufs) b.destroy();\n this.queryBuf?.destroy();\n this.readBuf?.destroy();\n this.querySet?.destroy();\n this.bufs = [];\n this.ctx.unconfigure();\n this.canvas.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, seriesPoints } 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 { mapSeriesPx } from \"./decimate\";\nimport { formatSI } from \"./format\";\nimport { 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\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 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 const wantGpu =\n GPU_KIND[options.type] &&\n (options.renderer === \"webgpu\" || options.renderer === \"auto\");\n if (wantGpu) {\n void import(\"../gpu/series\").then(({ GpuSeries }) =>\n GpuSeries.create(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 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 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 { x, y: padDomain(min, max, includeZero) };\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 { x: [0, d.categories.length], y: padDomain(min, max, true) };\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: 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: padDomain(min, max, true),\n };\n }\n return { x: [0, 1], y: [0, 1] };\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 /** series rasterization on the GPU; grid/labels/hover stay on Canvas2D */\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 || !kind || d.kind !== \"xy\") {\n this.mod.render(this.renderContext(t, scales));\n return;\n }\n const r = this.renderContext(t, scales);\n const flow = this.options.flow ? FLOW_RIPPLE : 0;\n g.begin(this.backend.plot);\n for (const s of d.series) {\n if (kind === \"points\") {\n const pts = mapSeriesPx(\n d.sortedX,\n s.y,\n s.prevY,\n t,\n scales.yScale.domain[0],\n scales.xScale,\n scales.yScale,\n flow,\n );\n g.points(pts, s.color, 2.5, 0.65);\n continue;\n }\n const pts = seriesPoints(r, s);\n if (kind === \"area\") {\n const base = scales.yScale(Math.max(0, scales.yScale.domain[0]));\n g.area(pts, s.color, base, this.backend.plot);\n }\n g.line(pts, s.color, 2);\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 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 if (m > 1 && x < (sortedX[m - 2] as number)) resortXY(nd);\n this.data = nd;\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.iife.js","names":["MAX_BAR_W","RADIUS","hitScatter","hitSparkline","hitBaseline","d","exports","__defProp","__esmMin","err","fn","res","__exportAll","target","name","all","no_symbols","barGeometry","cats","d","slot","r","groupW","barW","x","catIdx","seriesIdx","base","yv","value","topRounded","rect","h","w","rad","ctx","up","y","stackedGeometry","yTop","v0","v1","yBot","renderBar","animate","ci","pos","neg","si","s","cur","prev","v","hitBar","px","cat","py","s0","inside","withAlpha","color","hex","c","n","alpha","m","mapSeriesPx","xs","ys","out","xd","xScale","xr","kx","bx","yd","yScale","yr","ky","by","lerp","t","inv","flow","f1","o","i","ti","p","yFallback","decScratch","decimateSeriesPx","maxPts","pixelWidth","firstX","firstY","col","minX","minY","maxX","maxY","lastX","lastY","cap","decimateM4","put","flush","nearestIndex","lo","hi","mid","dLo","isXY","smScratch","smoothPath","pts","segs","need","tang","dxi","a","b","mi","ti1","lim","x0","x1","y0","y1","FLOW_RIPPLE","seriesPoints","fb","buildPath","path","dn","curve","renderLine","fill","area","g","hitXY","idx","xVal","sx","values","yVal","sy","renderBaseline","basePx","regions","reg","renderCandles","wickUp","wickDown","bodyUp","bodyDown","volUp","volDown","bandH","bandBot","vol","bodyW","half","vmax","vk","cx","wick","ohlcStyle","op","cl","maxCols","cxA","oA","hA","lA","cA","vA","nc","prevCol","k","pitch","hitCandle","ovScratch","overlayPath","renderCombo","valAt","nCols","hitCombo","formatNumber","MAGNITUDES","formatSI","abs","digits","GAP","START","donutGeometry","cy","rOuter","rInner","angles","sweep","frac","a1","renderDonut","geo","an","a0","hitDonut","dx","dy","dist","angle","renderScatter","fallback","xMin","xMax","yp","renderSparkline","barRect","bar","end","barColor","renderWaterfall","hitWaterfall","makeCanvas","cssW","cssH","setup2d","canvas","settings","CanvasBackend","container","plot","linearScale","dd","d1","d0","dr","r1","r0","extent","min","max","padDomain","includeZero","pad","boundDomain","dom","raf","cb","caf","id","sharedScheduler","now","easeOutCubic","FONT","lightTheme","darkTheme","categoricalLight","categoricalDark","resolveTheme","opt","accent","seriesColor","explicit","theme","index","STEPS","niceStep","raw","range","pow","norm","step","computeTicks","ticks","Tooltip","el","title","rows","row","sw","lab","val","parent","pw","ph","left","top","parseColor","parts","init_color","getGpuDevice","key","opts","cache","gpu","req","adapter","requiredFeatures","device","init_device","series_exports","GpuSeries","HEADER","LINE_WGSL","LINE_FLAT_WGSL","AREA_WGSL","AREA_FLAT_WGSL","POINTS_WGSL","DECIMATE_WGSL","BUF_VERTEX_DST","BUF_UNIFORM_DST","BUF_RESOLVE_SRC","BUF_MAPREAD_DST","BUF_SERIES","BUF_DEC","MAP_READ","STAGE_ALL","UBYTES","UBUF_SIZE","DEC_ELEMS_PER_COL","BLEND","init_series","pl","decPl","mk","iXY","iXY1","iPrev","iPrev1","iPrevPt","vXY","vPrev","info","nd","dpr","xu","mn","mx","j","yu","encXY","encPrev","rev","q","n2","dropped","pNew","ex","ey","ep","prevYs","pOld","enc","xy","ex0","view","ex1","ax","ey0","ey1","ay","off","u","map","dec","cols","gapFillY","width","o0","o1","capA","rem","baseEnc","baseVal","baseCss","xyD","pvD","prevOff","radius","encoder","cp","pass","qs","qb","rb","t0","t1","MODULES","GPU_KIND","Chart","more","eased","options","data","open","high","low","close","hasVol","volume","totals","run","bars","slices","prevSeries","xRaw","sortedX","src","mod","fmtY","plotH","yTicks","gutter","nx","vis","f","to","volBand","scales","showGrid","fmtX","xTicks","kind","s2","hit","nowT","dt","win","drop","steady","series","yNew","prevY","resort","resortXY","ny","np","createChart"],"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/gpu/color.ts","../src/gpu/device.ts","../src/gpu/series.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","/** Parse a CSS color (#rgb, #rrggbb, rgb(), rgba()) into linear-ish 0-1 rgba. */\nexport function parseColor(c: string): [number, number, number, number] {\n if (c.startsWith(\"#\")) {\n const h = c.slice(1);\n if (h.length === 3) {\n return [\n parseInt(h[0] as string, 16) / 15,\n parseInt(h[1] as string, 16) / 15,\n parseInt(h[2] as string, 16) / 15,\n 1,\n ];\n }\n if (h.length === 6) {\n return [\n parseInt(h.slice(0, 2), 16) / 255,\n parseInt(h.slice(2, 4), 16) / 255,\n parseInt(h.slice(4, 6), 16) / 255,\n 1,\n ];\n }\n }\n const m = /rgba?\\(([^)]+)\\)/.exec(c);\n if (m) {\n const parts = (m[1] as string).split(\",\").map((v) => Number.parseFloat(v));\n return [\n (parts[0] ?? 0) / 255,\n (parts[1] ?? 0) / 255,\n (parts[2] ?? 0) / 255,\n parts[3] ?? 1,\n ];\n }\n return [0, 0, 0, 1];\n}\n","export interface GpuRequestOptions {\n powerPreference?: \"default\" | \"low-power\" | \"high-performance\";\n /** use WebGPU compatibility mode (GLES 3.1 / D3D11 reach) */\n compat?: boolean;\n /** request \"timestamp-query\" when the adapter supports it */\n timing?: boolean;\n /**\n * Accept software (fallback) adapters such as SwiftShader. Off by default:\n * a CPU-rasterized GPU device is usually slower than the Canvas2D path.\n */\n allowFallback?: boolean;\n}\n\n/** Shared GPUDevice across charts — adapters/devices are expensive to acquire. */\nconst cache = new Map<string, Promise<GPUDevice | null>>();\n\nexport function getGpuDevice(\n opts: GpuRequestOptions = {},\n): Promise<GPUDevice | null> {\n const key = JSON.stringify(opts);\n let p = cache.get(key);\n if (!p) {\n p = (async (): Promise<GPUDevice | null> => {\n try {\n const nav = typeof navigator === \"undefined\" ? null : navigator;\n const gpu = (nav as Navigator | null)?.gpu;\n if (!gpu) return null;\n const req: GPURequestAdapterOptions = {};\n if (opts.powerPreference && opts.powerPreference !== \"default\") {\n req.powerPreference = opts.powerPreference;\n }\n if (opts.compat) {\n (req as { featureLevel?: \"compatibility\" }).featureLevel =\n \"compatibility\";\n }\n // Firefox rejects requestAdapter() (instead of returning null) on\n // platforms where WebGPU isn't shipped — the catch treats both\n // outcomes as \"unavailable\"\n const adapter = await gpu.requestAdapter(req);\n if (!adapter) return null;\n if (\n !opts.allowFallback &&\n (adapter as { isFallbackAdapter?: boolean }).isFallbackAdapter\n ) {\n return null;\n }\n const requiredFeatures: GPUFeatureName[] = [];\n if (opts.timing && adapter.features.has(\"timestamp-query\")) {\n requiredFeatures.push(\"timestamp-query\");\n }\n const device = await adapter.requestDevice({ requiredFeatures });\n // evict on loss so the next getGpuDevice() re-requests a fresh\n // adapter+device (all GpuSeries instances share this cache entry)\n device.lost.then(() => cache.delete(key));\n return device;\n } catch {\n return null;\n }\n })();\n p.catch(() => cache.delete(key));\n cache.set(key, p);\n }\n return p;\n}\n","import type { NormalizedSeries, NormalizedXY, Rect } from \"../core/types\";\nimport { parseColor } from \"./color\";\nimport { type GpuRequestOptions, getGpuDevice } from \"./device\";\n\n/**\n * WebGPU series renderer. Data is uploaded once per series as affine-encoded\n * f32 [x, y] pairs (+ an encoded prevY channel for animation) and lives on the\n * GPU: the domain→pixel transform runs in the vertex shader, so pan/zoom,\n * resize and view animation are uniform writes, not buffer re-uploads.\n * Streaming `append()` writes only the new tail into a per-series ring buffer.\n *\n * When a series has more than ~2 points per pixel column a compute pass does\n * M4 decimation (first/min/max/last per column) into a GPU-side output buffer\n * — the CPU never rescans the data. Pipelines use instanced vertex attributes\n * everywhere (no vertex-stage storage buffers), so they also run in WebGPU\n * compatibility mode.\n */\n\nconst HEADER = /* wgsl */ `\nstruct U {\n res: vec4f, // canvas w,h (device px), dpr, pad\n color: vec4f,\n p: vec4f, // line: width | area: baseCssY, plotY, plotH | points: radius\n map: vec4f, // cssX = ex*map.x + map.y ; cssY = map.w - ey*map.z\n anim: vec4f, // t, flow, invN, pad\n ring: vec4f, // start, cap (0 = linear), n, pad\n dec: vec4f, // cols, gapFillYEnc, pad, pad\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn encToCss(e: vec2f) -> vec2f {\n return vec2f(e.x * u.map.x + u.map.y, u.map.w - e.y * u.map.z);\n}\nfn toClip(css: vec2f) -> vec4f {\n let d = css * u.res.z;\n return vec4f(d.x / u.res.x * 2.0 - 1.0, 1.0 - d.y / u.res.y * 2.0, 0.0, 1.0);\n}\nfn animT(i: f32) -> f32 {\n return clamp(\n u.anim.x * (1.0 + u.anim.y) - u.anim.y + i * u.anim.z, 0.0, 1.0,\n );\n}\n`;\n\nconst LINE_WGSL = /* wgsl */ `\n${HEADER}\nconst OFF = array<vec2f, 6>(\n vec2f(0.0, -1.0), vec2f(0.0, 1.0), vec2f(1.0, -1.0),\n vec2f(0.0, 1.0), vec2f(1.0, 1.0), vec2f(1.0, -1.0),\n);\nstruct VOut {\n @builtin(position) pos: vec4f,\n @location(0) edge: f32,\n};\nfn segQuad(v: vec2f, A: vec2f, B: vec2f) -> VOut {\n var dir = B - A;\n let len = length(dir);\n if (len < 1e-6) {\n dir = vec2f(1.0, 0.0);\n } else {\n dir = dir / len;\n }\n let nrm = vec2f(-dir.y, dir.x);\n let halfW = u.p.x * 0.5;\n let aa = 0.9;\n var o: VOut;\n o.pos = toClip(mix(A, B, v.x) + nrm * v.y * (halfW + aa));\n o.edge = v.y * (halfW + aa);\n return o;\n}\n@vertex fn vs(\n @builtin(vertex_index) vi: u32,\n @builtin(instance_index) inst: u32,\n @location(0) a: vec2f,\n @location(1) b: vec2f,\n @location(2) pa: f32,\n @location(3) pb: f32,\n) -> VOut {\n let ya = mix(pa, a.y, animT(f32(inst)));\n let yb = mix(pb, b.y, animT(f32(inst + 1u)));\n return segQuad(\n OFF[vi], encToCss(vec2f(a.x, ya)), encToCss(vec2f(b.x, yb)),\n );\n}\n@fragment fn fs(o: VOut) -> @location(0) vec4f {\n let halfW = u.p.x * 0.5;\n let a = 1.0 - smoothstep(halfW - 0.5, halfW + 0.9, abs(o.edge));\n return vec4f(u.color.rgb, u.color.a * a);\n}\n`;\n\n// decimated input: no prevY channel (compute already lerped); empty columns\n// carry an x=-1e30 sentinel so bridged segments can be killed\nconst LINE_FLAT_WGSL = /* wgsl */ `\n${HEADER}\nconst OFF = array<vec2f, 6>(\n vec2f(0.0, -1.0), vec2f(0.0, 1.0), vec2f(1.0, -1.0),\n vec2f(0.0, 1.0), vec2f(1.0, 1.0), vec2f(1.0, -1.0),\n);\nstruct VOut {\n @builtin(position) pos: vec4f,\n @location(0) edge: f32,\n};\n@vertex fn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) a: vec2f,\n @location(1) b: vec2f,\n) -> VOut {\n var o: VOut;\n if (a.x < -1e20 || b.x < -1e20) {\n o.pos = vec4f(0.0, 0.0, 2.0, 1.0); // outside clip z-range → discarded\n o.edge = 0.0;\n return o;\n }\n let A = encToCss(a);\n let B = encToCss(b);\n var dir = B - A;\n let len = length(dir);\n if (len < 1e-6) {\n dir = vec2f(1.0, 0.0);\n } else {\n dir = dir / len;\n }\n let nrm = vec2f(-dir.y, dir.x);\n let halfW = u.p.x * 0.5;\n let aa = 0.9;\n let v = OFF[vi];\n o.pos = toClip(mix(A, B, v.x) + nrm * v.y * (halfW + aa));\n o.edge = v.y * (halfW + aa);\n return o;\n}\n@fragment fn fs(o: VOut) -> @location(0) vec4f {\n let halfW = u.p.x * 0.5;\n let a = 1.0 - smoothstep(halfW - 0.5, halfW + 0.9, abs(o.edge));\n return vec4f(u.color.rgb, u.color.a * a);\n}\n`;\n\nconst AREA_WGSL = /* wgsl */ `\n${HEADER}\nstruct VOut {\n @builtin(position) pos: vec4f,\n @location(0) grad: f32,\n};\n// input is doubled point data (each point twice): even verts land on the\n// path, odd verts drop to the baseline\n@vertex fn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) top: vec2f,\n @location(1) prev: f32,\n) -> VOut {\n let isTop = (vi & 1u) == 0u;\n let y = mix(prev, top.y, animT(f32(vi >> 1u)));\n let css = encToCss(vec2f(top.x, y));\n var o: VOut;\n o.pos = toClip(vec2f(css.x, select(u.p.x, css.y, isTop)));\n o.grad = clamp((css.y - u.p.y) / max(u.p.z, 1.0), 0.0, 1.0);\n return o;\n}\n@fragment fn fs(o: VOut) -> @location(0) vec4f {\n let a = mix(0.16, 0.0, o.grad) * u.color.a;\n return vec4f(u.color.rgb, a);\n}\n`;\n\nconst AREA_FLAT_WGSL = /* wgsl */ `\n${HEADER}\nstruct VOut {\n @builtin(position) pos: vec4f,\n @location(0) grad: f32,\n};\n@vertex fn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) top: vec2f,\n) -> VOut {\n let isTop = (vi & 1u) == 0u;\n let css = encToCss(top);\n var o: VOut;\n o.pos = toClip(vec2f(css.x, select(u.p.x, css.y, isTop)));\n o.grad = clamp((css.y - u.p.y) / max(u.p.z, 1.0), 0.0, 1.0);\n return o;\n}\n@fragment fn fs(o: VOut) -> @location(0) vec4f {\n let a = mix(0.16, 0.0, o.grad) * u.color.a;\n return vec4f(u.color.rgb, a);\n}\n`;\n\nconst POINTS_WGSL = /* wgsl */ `\n${HEADER}\nconst QUAD = array<vec2f, 6>(\n vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(-1.0, 1.0),\n vec2f(-1.0, 1.0), vec2f(1.0, 1.0), vec2f(1.0, 1.0),\n);\nstruct VOut {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n};\n@vertex fn vs(\n @builtin(vertex_index) vi: u32,\n @builtin(instance_index) inst: u32,\n @location(0) c: vec2f,\n @location(1) prev: f32,\n) -> VOut {\n let r = u.p.x;\n let q = QUAD[vi];\n let y = mix(prev, c.y, animT(f32(inst)));\n let css = encToCss(vec2f(c.x, y));\n var o: VOut;\n o.pos = toClip(css + q * r);\n o.local = q * r;\n return o;\n}\n@fragment fn fs(o: VOut) -> @location(0) vec4f {\n let r = u.p.x;\n let a = 1.0 - smoothstep(r - 1.2, r, length(o.local));\n return vec4f(u.color.rgb, u.color.a * a);\n}\n`;\n\n// M4 decimation: one thread per absolute pixel column emits first/min/max/last\n// (encoded, y already lerped) into a line region (4 pts/col) and a doubled\n// area-strip region (8 verts/col). Empty columns → sentinel / baseline fill.\nconst DECIMATE_WGSL = /* wgsl */ `\n${HEADER}\n@group(1) @binding(0) var<storage, read> xy: array<vec2f>;\n@group(1) @binding(1) var<storage, read> prev: array<f32>;\n@group(1) @binding(2) var<storage, read_write> dst: array<vec2f>;\n\nfn physIdx(i: u32) -> u32 {\n let cap = u32(u.ring.y);\n if (cap == 0u) {\n return i;\n }\n return (u32(u.ring.x) + i) % cap;\n}\nfn xEnc(i: u32) -> f32 {\n return xy[physIdx(i)].x;\n}\nfn yLerp(i: u32) -> f32 {\n let p = physIdx(i);\n return mix(prev[p], xy[p].y, animT(f32(i)));\n}\nfn lowerBound(e: f32) -> u32 {\n var lo = 0u;\n var hi = u32(u.ring.z);\n while (lo < hi) {\n let mid = (lo + hi) >> 1u;\n if (xEnc(mid) < e) {\n lo = mid + 1u;\n } else {\n hi = mid;\n }\n }\n return lo;\n}\n\n@compute @workgroup_size(64)\nfn dec(@builtin(global_invocation_id) gid: vec3u) {\n let c = gid.x;\n let cols = u32(u.dec.x);\n if (c >= cols) {\n return;\n }\n let lineBase = c * 4u;\n let areaBase = cols * 4u + c * 8u;\n // encoded-x range mapping to css column [c, c+1)\n let lo = lowerBound((f32(c) - u.map.y) / u.map.x);\n let hi = lowerBound((f32(c) + 1.0 - u.map.y) / u.map.x);\n if (lo >= hi) {\n let sent = vec2f(-1e30, -1e30);\n for (var k = 0u; k < 4u; k++) {\n dst[lineBase + k] = sent;\n }\n let gp = vec2f((f32(c) + 0.5 - u.map.y) / u.map.x, u.dec.y);\n for (var k = 0u; k < 8u; k++) {\n dst[areaBase + k] = gp;\n }\n return;\n }\n var iMin = lo;\n var iMax = lo;\n var mn = yLerp(lo);\n var mx = mn;\n for (var i = lo + 1u; i < hi; i++) {\n let y = yLerp(i);\n if (y < mn) {\n mn = y;\n iMin = i;\n }\n if (y > mx) {\n mx = y;\n iMax = i;\n }\n }\n let xs = array<u32, 4>(lo, iMin, iMax, hi - 1u);\n for (var k = 0u; k < 4u; k++) {\n let i = xs[k];\n let pt = vec2f(xEnc(i), yLerp(i));\n dst[lineBase + k] = pt;\n dst[areaBase + 2u * k] = pt;\n dst[areaBase + 2u * k + 1u] = pt;\n }\n}\n`;\n\n// GPUBufferUsage flags (lib.dom has the types but not the const objects)\nconst BUF_VERTEX_DST = 0x28; // VERTEX | COPY_DST\nconst BUF_UNIFORM_DST = 0x48; // UNIFORM | COPY_DST\nconst BUF_RESOLVE_SRC = 0x204; // QUERY_RESOLVE | COPY_SRC\nconst BUF_MAPREAD_DST = 0x09; // MAP_READ | COPY_DST\nconst BUF_SERIES = 0xac; // STORAGE | VERTEX | COPY_DST | COPY_SRC\nconst BUF_DEC = 0xa0; // STORAGE | VERTEX\nconst MAP_READ = 0x1;\nconst STAGE_ALL = 7; // VERTEX | FRAGMENT | COMPUTE\n\nconst UVEC = 7; // vec4s per uniform slot\nconst UBYTES = 256; // dynamic-offset aligned stride\nconst UBUF_SIZE = 256 * 1024;\nconst DEC_ELEMS_PER_COL = 12; // 4 line pts + 8 doubled area verts\n\ninterface Slot {\n n: number;\n cap: number;\n start: number;\n enc: { xr: number; xu: number; yr: number; yu: number };\n /** physical-order CPU copies (ring layout: logical i at (start+i)%cap) */\n encXY: Float32Array;\n encPrev: Float32Array;\n xy: GPUBuffer;\n prev: GPUBuffer;\n /** doubled strip data for direct area draws */\n scratch: GPUBuffer | null;\n scratchN: number;\n dec: GPUBuffer | null;\n decCols: number;\n bg: GPUBindGroup | null;\n decStamp: number;\n}\n\ninterface View {\n x: readonly [number, number];\n y: readonly [number, number];\n}\n\ninterface DrawOp {\n pipe: GPURenderPipeline;\n vbufs: { buf: GPUBuffer; off: number }[];\n u: number;\n verts: number;\n insts: number;\n}\n\nexport class GpuSeries {\n canvas: HTMLCanvasElement;\n device: GPUDevice;\n private ctx: GPUCanvasContext;\n private format: GPUTextureFormat;\n private opts: GpuRequestOptions;\n private layout!: GPUBindGroupLayout;\n private decLayout!: GPUBindGroupLayout;\n private ubiGroup!: GPUBindGroup;\n private ubuf!: GPUBuffer;\n private pipes!: {\n line: GPURenderPipeline;\n lineFlat: GPURenderPipeline;\n area: GPURenderPipeline;\n areaFlat: GPURenderPipeline;\n points: GPURenderPipeline;\n dec: GPUComputePipeline;\n };\n private dpr = 1;\n private slots: Slot[] = [];\n private slotCount = 0;\n private appliedRev = -1;\n private draws: DrawOp[] = [];\n private cmps: { slot: Slot; u: number }[] = [];\n private uOff = 0;\n private stamp = 0;\n private plotR: Rect = { x: 0, y: 0, w: 1, h: 1 };\n private cols = 1;\n private t = 1;\n private flow = 0;\n private tailScratch = new Float32Array(4);\n /** last measured GPU execution time in ms (when timing enabled) */\n gpuMs: number | null = null;\n private querySet: GPUQuerySet | null = null;\n private queryBuf: GPUBuffer | null = null;\n private readBuf: GPUBuffer | null = null;\n private reading = false;\n private timing = false;\n private destroyed = false;\n /** true once the device is unrecoverable — the chart falls back to Canvas2D */\n dead = false;\n /** true while a lost device is being re-acquired */\n recovering = false;\n\n get unavailable(): boolean {\n return this.dead || this.recovering;\n }\n\n private constructor(\n device: GPUDevice,\n canvas: HTMLCanvasElement,\n opts: GpuRequestOptions,\n ) {\n this.opts = opts;\n this.timing = !!opts.timing;\n this.canvas = canvas;\n canvas.style.cssText =\n \"position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none\";\n const ctx = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!ctx) throw new Error(\"resolvcharts: webgpu context unavailable\");\n this.ctx = ctx;\n this.device = device;\n this.format = navigator.gpu.getPreferredCanvasFormat();\n this.setup(device);\n }\n\n static async create(opts: GpuRequestOptions = {}): Promise<GpuSeries | null> {\n const device = await getGpuDevice(opts);\n if (!device) return null;\n const canvas = document.createElement(\"canvas\");\n try {\n return new GpuSeries(device, canvas, opts);\n } catch {\n return null;\n }\n }\n\n /** (re)create all device-bound resources — called on init and after loss */\n private setup(device: GPUDevice): void {\n this.device = device;\n this.layout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_ALL,\n buffer: { type: \"uniform\", hasDynamicOffset: true },\n },\n ],\n });\n this.decLayout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: 4, buffer: { type: \"read-only-storage\" } },\n { binding: 1, visibility: 4, buffer: { type: \"read-only-storage\" } },\n { binding: 2, visibility: 4, buffer: { type: \"storage\" } },\n ],\n });\n this.ubuf = device.createBuffer({\n size: UBUF_SIZE,\n usage: BUF_UNIFORM_DST,\n });\n this.ubiGroup = device.createBindGroup({\n layout: this.layout,\n entries: [\n { binding: 0, resource: { buffer: this.ubuf, size: UVEC * 16 } },\n ],\n });\n const pl = device.createPipelineLayout({\n bindGroupLayouts: [this.layout],\n });\n const decPl = device.createPipelineLayout({\n bindGroupLayouts: [this.layout, this.decLayout],\n });\n const mk = (\n code: string,\n topology: GPUPrimitiveTopology,\n buffers: GPUVertexBufferLayout[],\n ) =>\n device.createRenderPipeline({\n layout: pl,\n vertex: {\n module: device.createShaderModule({ code }),\n entryPoint: \"vs\",\n buffers,\n },\n fragment: {\n module: device.createShaderModule({ code }),\n entryPoint: \"fs\",\n targets: [{ format: this.format, blend: BLEND }],\n },\n primitive: { topology },\n });\n const iXY: GPUVertexBufferLayout = {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n };\n const iXY1: GPUVertexBufferLayout = {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x2\" }],\n };\n const iPrev: GPUVertexBufferLayout = {\n arrayStride: 4,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 2, offset: 0, format: \"float32\" }],\n };\n const iPrev1: GPUVertexBufferLayout = {\n arrayStride: 4,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 3, offset: 0, format: \"float32\" }],\n };\n const iPrevPt: GPUVertexBufferLayout = {\n arrayStride: 4,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32\" }],\n };\n const vXY: GPUVertexBufferLayout = {\n arrayStride: 8,\n stepMode: \"vertex\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n };\n const vPrev: GPUVertexBufferLayout = {\n arrayStride: 4,\n stepMode: \"vertex\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32\" }],\n };\n this.pipes = {\n line: mk(LINE_WGSL, \"triangle-list\", [iXY, iXY1, iPrev, iPrev1]),\n lineFlat: mk(LINE_FLAT_WGSL, \"triangle-list\", [iXY, iXY1]),\n area: mk(AREA_WGSL, \"triangle-strip\", [vXY, vPrev]),\n areaFlat: mk(AREA_FLAT_WGSL, \"triangle-strip\", [vXY]),\n points: mk(POINTS_WGSL, \"triangle-list\", [iXY, iPrevPt]),\n dec: device.createComputePipeline({\n layout: decPl,\n compute: {\n module: device.createShaderModule({ code: DECIMATE_WGSL }),\n entryPoint: \"dec\",\n },\n }),\n };\n if (this.timing && device.features.has(\"timestamp-query\")) {\n this.querySet = device.createQuerySet({ type: \"timestamp\", count: 2 });\n this.queryBuf = device.createBuffer({\n size: 16,\n usage: BUF_RESOLVE_SRC,\n });\n this.readBuf = device.createBuffer({\n size: 16,\n usage: BUF_MAPREAD_DST,\n });\n }\n device.lost.then((info) => this.onLost(info));\n }\n\n private onLost(info: GPUDeviceLostInfo): void {\n if (this.destroyed) return;\n if (info.reason === \"destroyed\") {\n this.dead = true;\n return;\n }\n this.recovering = true;\n void getGpuDevice(this.opts).then((nd) => {\n if (!nd || this.destroyed) {\n this.fail();\n return;\n }\n try {\n this.teardownResources();\n this.setup(nd);\n try {\n this.configure();\n } catch {\n // some drivers reject reconfiguring a context with a new device —\n // swap in a fresh canvas instead\n const nc = document.createElement(\"canvas\");\n nc.width = this.canvas.width;\n nc.height = this.canvas.height;\n this.canvas.replaceWith(nc);\n this.canvas = nc;\n const ctx = nc.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!ctx) throw new Error(\"webgpu context lost\");\n this.ctx = ctx;\n this.configure();\n }\n this.appliedRev = -1; // force full re-upload on next frame\n this.recovering = false;\n } catch {\n this.fail();\n }\n });\n }\n\n private fail(): void {\n this.dead = true;\n this.recovering = false;\n this.destroy();\n }\n\n private teardownResources(): void {\n for (const s of this.slots) {\n s.xy.destroy();\n s.prev.destroy();\n s.scratch?.destroy();\n s.dec?.destroy();\n }\n this.slots = [];\n this.slotCount = 0;\n this.ubuf.destroy();\n this.queryBuf?.destroy();\n this.readBuf?.destroy();\n this.querySet?.destroy();\n this.querySet = null;\n this.queryBuf = null;\n this.readBuf = null;\n }\n\n private configure(): void {\n this.ctx.configure({\n device: this.device,\n format: this.format,\n alphaMode: \"premultiplied\",\n });\n }\n\n setSize(cssW: number, cssH: number, dpr: number): void {\n this.dpr = dpr;\n this.canvas.width = Math.max(1, Math.round(cssW * dpr));\n this.canvas.height = Math.max(1, Math.round(cssH * dpr));\n if (!this.unavailable) this.configure();\n }\n\n // ---------------------------------------------------------------- data --\n // Points are affine-encoded to f32: enc(v) = (v - ref) * unit. The shader\n // gets a second affine (encoded → css px) per frame, so any view window\n // lands on the same buffer without re-uploading. Ref/unit are fixed at\n // upload; out-of-range appends simply encode outside [0,1].\n\n private upload(i: number, xs: Float64Array, s: NormalizedSeries): void {\n const n = Math.min(xs.length, s.y.length);\n const xr = n > 0 ? (xs[0] as number) : 0;\n const xu =\n 1 /\n ((n > 0 ? (xs[n - 1] as number) - xr : 0) ||\n Math.max(1, Math.abs(xr), 1));\n let mn = Infinity;\n let mx = -Infinity;\n for (let j = 0; j < n; j++) {\n const v = s.y[j] as number;\n if (v < mn) mn = v;\n if (v > mx) mx = v;\n }\n const yr = mn === Infinity ? 0 : mn;\n const yu = 1 / (mx - mn || Math.max(1, Math.abs(yr)));\n let slot = this.slots[i];\n const cap = Math.max(1024, Math.ceil(n * 1.25));\n if (!slot || slot.cap < n) {\n slot?.xy.destroy();\n slot?.prev.destroy();\n slot?.dec?.destroy();\n slot = {\n n,\n cap,\n start: 0,\n enc: { xr, xu, yr, yu },\n encXY: new Float32Array(cap * 2),\n encPrev: new Float32Array(cap),\n xy: this.device.createBuffer({\n size: cap * 8,\n usage: BUF_SERIES,\n }),\n prev: this.device.createBuffer({\n size: cap * 4,\n usage: BUF_SERIES,\n }),\n scratch: null,\n scratchN: 0,\n dec: null,\n decCols: 0,\n bg: null,\n decStamp: -1,\n };\n this.slots[i] = slot;\n } else {\n slot.n = n;\n slot.start = 0;\n slot.enc = { xr, xu, yr, yu };\n slot.bg = null;\n slot.decStamp = -1;\n }\n const { encXY, encPrev } = slot;\n const prev = s.prevY;\n for (let j = 0; j < n; j++) {\n encXY[2 * j] = ((xs[j] as number) - xr) * xu;\n encXY[2 * j + 1] = ((s.y[j] as number) - yr) * yu;\n encPrev[j] = prev ? ((prev[j] as number) - yr) * yu : 0;\n }\n this.device.queue.writeBuffer(slot.xy, 0, encXY, 0, n * 2);\n this.device.queue.writeBuffer(slot.prev, 0, encPrev, 0, n);\n }\n\n /**\n * Full-upload hook: call once per frame with a revision that changes\n * whenever the data is replaced/rebuilt. Unchanged revisions are free.\n */\n syncData(d: NormalizedXY, rev: number): void {\n if (\n this.unavailable ||\n (rev === this.appliedRev && this.slotCount === d.series.length)\n ) {\n return;\n }\n for (let i = 0; i < d.series.length; i++) {\n const s = d.series[i];\n if (s) this.upload(i, d.sortedX, s);\n }\n this.slotCount = d.series.length;\n this.appliedRev = rev;\n }\n\n /**\n * Ring-buffer streaming append: writes only the appended tail per series.\n * `ys[i]` is the new y for series i, `prevYs[i]` the y it animates from\n * (the previous tail value), `dropped` how many leading points were evicted.\n */\n appended(\n x: number,\n ys: number[],\n prevYs: number[],\n dropped: number,\n ): boolean {\n if (this.unavailable) return false;\n const q = this.device.queue;\n for (let i = 0; i < this.slotCount; i++) {\n const s = this.slots[i];\n if (!s) return false;\n const n2 = s.n - dropped + 1;\n if (n2 > s.cap) this.grow(s, n2);\n s.start = (s.start + dropped) % s.cap;\n s.n = n2;\n const pNew = (s.start + s.n - 1) % s.cap;\n const { xr, xu, yr, yu } = s.enc;\n const ex = (x - xr) * xu;\n const ey = ((ys[i] ?? 0) - yr) * yu;\n const ep = ((prevYs[i] ?? 0) - yr) * yu;\n const t = this.tailScratch;\n t[0] = ex;\n t[1] = ey;\n q.writeBuffer(s.xy, pNew * 8, t, 0, 2);\n s.encXY[2 * pNew] = ex;\n s.encXY[2 * pNew + 1] = ey;\n t[0] = ep;\n q.writeBuffer(s.prev, pNew * 4, t, 0, 1);\n s.encPrev[pNew] = ep;\n // the displaced tail's prev channel becomes its own y (steady-state\n // invariant: prevY[i] = y[i] for every non-tail point)\n if (s.n > 1) {\n const pOld = (pNew + s.cap - 1) % s.cap;\n q.writeBuffer(s.prev, pOld * 4, t, 0, 1);\n s.encPrev[pOld] = ep;\n }\n }\n return true;\n }\n\n /** grow ring capacity, unwrapping logical order into the new buffer */\n private grow(s: Slot, need: number): void {\n const cap = Math.max(s.cap * 2, need + 1024);\n const a = s.cap - s.start;\n const enc = this.device.createCommandEncoder();\n const xy = this.device.createBuffer({ size: cap * 8, usage: BUF_SERIES });\n const prev = this.device.createBuffer({ size: cap * 4, usage: BUF_SERIES });\n enc.copyBufferToBuffer(s.xy, s.start * 8, xy, 0, a * 8);\n if (s.start > 0) enc.copyBufferToBuffer(s.xy, 0, xy, a * 8, s.start * 8);\n enc.copyBufferToBuffer(s.prev, s.start * 4, prev, 0, a * 4);\n if (s.start > 0)\n enc.copyBufferToBuffer(s.prev, 0, prev, a * 4, s.start * 4);\n this.device.queue.submit([enc.finish()]);\n s.xy.destroy();\n s.prev.destroy();\n s.xy = xy;\n s.prev = prev;\n const encXY = new Float32Array(cap * 2);\n const encPrev = new Float32Array(cap);\n encXY.set(s.encXY.subarray(s.start * 2, s.cap * 2), 0);\n encXY.set(s.encXY.subarray(0, s.start * 2), a * 2);\n encPrev.set(s.encPrev.subarray(s.start, s.cap), 0);\n encPrev.set(s.encPrev.subarray(0, s.start), a);\n s.encXY = encXY;\n s.encPrev = encPrev;\n s.cap = cap;\n s.start = 0;\n s.bg = null;\n }\n\n // --------------------------------------------------------------- frame --\n\n begin(plot: Rect, t = 1, flow = 0): void {\n this.plotR = plot;\n this.t = t;\n this.flow = flow;\n this.cols = Math.max(1, Math.ceil(plot.x + plot.w));\n this.stamp++;\n this.draws.length = 0;\n this.cmps.length = 0;\n this.uOff = 0;\n }\n\n /** encoded→css affine for this slot and view domain */\n private mapFor(s: Slot, view: View): [number, number, number, number] {\n const { xr, xu, yr, yu } = s.enc;\n const p = this.plotR;\n const ex0 = (view.x[0] - xr) * xu;\n const ex1 = (view.x[1] - xr) * xu;\n const ax = p.w / (ex1 - ex0 || 1e-30);\n const bx = p.x - ex0 * ax;\n const ey0 = (view.y[0] - yr) * yu;\n const ey1 = (view.y[1] - yr) * yu;\n const ay = p.h / (ey1 - ey0 || 1e-30);\n const by = p.y + ey1 * ay;\n return [ax, bx, ay, by];\n }\n\n private writeU(\n color: string,\n alpha: number,\n p: [number, number, number, number],\n map: [number, number, number, number],\n s: Slot,\n dec: [number, number],\n ): number {\n const off = this.uOff;\n this.uOff += UBYTES;\n const u = new Float32Array(UVEC * 4);\n u.set([this.canvas.width, this.canvas.height, this.dpr, 0]);\n const [r, g, b, a] = parseColor(color);\n u.set([r, g, b, a * alpha], 4);\n u.set(p, 8);\n u.set(map, 12);\n const inv = s.n > 1 ? this.flow / (s.n - 1) : 0;\n u.set([this.t, this.flow, inv, 0], 16);\n u.set([s.start, s.cap, s.n, 0], 20);\n u.set([dec[0], dec[1], 0, 0], 24);\n this.device.queue.writeBuffer(this.ubuf, off, u);\n return off;\n }\n\n private decimateWanted(s: Slot): boolean {\n return s.n > this.cols * 2;\n }\n\n private ensureDec(s: Slot): void {\n if (s.dec && s.decCols >= this.cols) return;\n s.dec?.destroy();\n const cols = Math.max(this.cols, Math.ceil(this.canvas.width / this.dpr));\n s.dec = this.device.createBuffer({\n size: cols * DEC_ELEMS_PER_COL * 8,\n usage: BUF_DEC,\n });\n s.decCols = cols;\n s.bg = null;\n }\n\n private dispatchDec(\n s: Slot,\n map: [number, number, number, number],\n gapFillY: number,\n ): void {\n if (s.decStamp === this.stamp) return;\n s.decStamp = this.stamp;\n this.ensureDec(s);\n if (!s.bg) {\n s.bg = this.device.createBindGroup({\n layout: this.decLayout,\n entries: [\n { binding: 0, resource: { buffer: s.xy } },\n { binding: 1, resource: { buffer: s.prev } },\n { binding: 2, resource: { buffer: s.dec as GPUBuffer } },\n ],\n });\n }\n const u = this.writeU(\"#ffffff\", 1, [0, 0, 0, 0], map, s, [\n this.cols,\n gapFillY,\n ]);\n this.cmps.push({ slot: s, u });\n }\n\n line(slot: number, color: string, width: number, view: View): void {\n const s = this.slots[slot];\n if (!s || s.n < 2) return;\n const map = this.mapFor(s, view);\n if (this.decimateWanted(s)) {\n this.dispatchDec(s, map, 0);\n const u = this.writeU(color, 1, [width, 0, 0, 0], map, s, [0, 0]);\n this.draws.push({\n pipe: this.pipes.lineFlat,\n vbufs: [\n { buf: s.dec as GPUBuffer, off: 0 },\n { buf: s.dec as GPUBuffer, off: 8 },\n ],\n u,\n verts: 6,\n insts: 4 * this.cols - 1,\n });\n return;\n }\n const u = this.writeU(color, 1, [width, 0, 0, 0], map, s, [0, 0]);\n const mk = (o0: number, o1: number, insts: number): DrawOp => ({\n pipe: this.pipes.line,\n vbufs: [\n { buf: s.xy, off: o0 * 8 },\n { buf: s.xy, off: o1 * 8 },\n { buf: s.prev, off: o0 * 4 },\n { buf: s.prev, off: o1 * 4 },\n ],\n u,\n verts: 6,\n insts,\n });\n if (s.start + s.n <= s.cap) {\n // contiguous run\n this.draws.push(mk(s.start, s.start + 1, s.n - 1));\n return;\n }\n // wrapped ring: run A (phys start..cap-1), bridging segment, run B (0..)\n const capA = s.cap - s.start;\n if (capA > 1) this.draws.push(mk(s.start, s.start + 1, capA - 1));\n // bridge: phys cap-1 → phys 0\n this.draws.push(mk(s.cap - 1, 0, 1));\n const rem = s.n - 1 - capA;\n if (rem > 0) this.draws.push(mk(0, 1, rem));\n }\n\n area(slot: number, color: string, baseVal: number, view: View): void {\n const s = this.slots[slot];\n if (!s || s.n < 2) return;\n const map = this.mapFor(s, view);\n const baseEnc = (baseVal - s.enc.yr) * s.enc.yu;\n const baseCss = map[3] - baseEnc * map[2];\n const p = this.plotR;\n if (this.decimateWanted(s)) {\n this.dispatchDec(s, map, baseEnc);\n const u = this.writeU(color, 1, [baseCss, p.y, p.h, 0], map, s, [0, 0]);\n this.draws.push({\n pipe: this.pipes.areaFlat,\n vbufs: [{ buf: s.dec as GPUBuffer, off: this.cols * 4 * 8 }],\n u,\n verts: 8 * this.cols,\n insts: 1,\n });\n return;\n }\n // direct strip: build doubled [x,y] + prev in logical order on CPU\n const m = s.n;\n const xyD = new Float32Array(m * 4);\n const pvD = new Float32Array(m * 2);\n for (let i = 0; i < m; i++) {\n const ph = (s.start + i) % s.cap;\n xyD[4 * i] = s.encXY[2 * ph] as number;\n xyD[4 * i + 1] = s.encXY[2 * ph + 1] as number;\n xyD[4 * i + 2] = xyD[4 * i] as number;\n xyD[4 * i + 3] = xyD[4 * i + 1] as number;\n pvD[2 * i] = s.encPrev[ph] as number;\n pvD[2 * i + 1] = pvD[2 * i] as number;\n }\n // scratch layout: doubled xy (m*16 B) then doubled prev (m*8 B)\n if (!s.scratch || s.scratchN < m) {\n s.scratch?.destroy();\n s.scratch = this.device.createBuffer({\n size: Math.max(4096, m * 24),\n usage: BUF_VERTEX_DST,\n });\n s.scratchN = m;\n }\n const prevOff = m * 16;\n this.device.queue.writeBuffer(s.scratch, 0, xyD);\n this.device.queue.writeBuffer(s.scratch, prevOff, pvD);\n const u = this.writeU(color, 1, [baseCss, p.y, p.h, 0], map, s, [0, 0]);\n this.draws.push({\n pipe: this.pipes.area,\n vbufs: [\n { buf: s.scratch, off: 0 },\n { buf: s.scratch, off: prevOff },\n ],\n u,\n verts: m * 2,\n insts: 1,\n });\n }\n\n points(\n slot: number,\n color: string,\n radius: number,\n alpha: number,\n view: View,\n ): void {\n const s = this.slots[slot];\n if (!s || s.n < 1) return;\n const map = this.mapFor(s, view);\n const u = this.writeU(color, alpha, [radius, 0, 0, 0], map, s, [0, 0]);\n const mk = (o0: number, insts: number): DrawOp => ({\n pipe: this.pipes.points,\n vbufs: [\n { buf: s.xy, off: o0 * 8 },\n { buf: s.prev, off: o0 * 4 },\n ],\n u,\n verts: 6,\n insts,\n });\n if (s.start + s.n <= s.cap) {\n this.draws.push(mk(s.start, s.n));\n return;\n }\n const capA = s.cap - s.start;\n this.draws.push(mk(s.start, capA));\n if (s.n - capA > 0) this.draws.push(mk(0, s.n - capA));\n }\n\n end(): void {\n if (this.unavailable || (!this.draws.length && !this.cmps.length)) return;\n try {\n const encoder = this.device.createCommandEncoder();\n if (this.cmps.length) {\n const cp = encoder.beginComputePass();\n cp.setPipeline(this.pipes.dec);\n for (const c of this.cmps) {\n cp.setBindGroup(0, this.ubiGroup, [c.u]);\n cp.setBindGroup(1, c.slot.bg as GPUBindGroup);\n cp.dispatchWorkgroups(Math.ceil(this.cols / 64));\n }\n cp.end();\n }\n if (this.draws.length) {\n const view = this.ctx.getCurrentTexture().createView();\n const d = this.dpr;\n const plot = this.plotR;\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view,\n loadOp: \"clear\",\n storeOp: \"store\",\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n },\n ],\n ...(this.querySet\n ? {\n timestampWrites: {\n querySet: this.querySet,\n beginningOfPassWriteIndex: 0,\n endOfPassWriteIndex: 1,\n },\n }\n : {}),\n });\n pass.setScissorRect(\n Math.max(0, Math.floor(plot.x * d)),\n Math.max(0, Math.floor(plot.y * d)),\n Math.max(1, Math.floor(plot.w * d)),\n Math.max(1, Math.floor(plot.h * d)),\n );\n for (const op of this.draws) {\n pass.setPipeline(op.pipe);\n pass.setBindGroup(0, this.ubiGroup, [op.u]);\n for (let i = 0; i < op.vbufs.length; i++) {\n const v = op.vbufs[i];\n if (v) pass.setVertexBuffer(i, v.buf, v.off);\n }\n pass.draw(op.verts, op.insts);\n }\n pass.end();\n }\n const qs = this.querySet;\n const qb = this.queryBuf;\n const rb = this.readBuf;\n if (qs && qb && rb && !this.reading) {\n encoder.resolveQuerySet(qs, 0, 2, qb, 0);\n encoder.copyBufferToBuffer(qb, 0, rb, 0, 16);\n this.reading = true;\n this.device.queue.submit([encoder.finish()]);\n void rb.mapAsync(MAP_READ).then(\n () => {\n const v = new BigUint64Array(rb.getMappedRange());\n const t0 = v[0];\n const t1 = v[1];\n if (t0 !== undefined && t1 !== undefined) {\n this.gpuMs = Number(t1 - t0) / 1e6;\n }\n rb.unmap();\n this.reading = false;\n },\n () => {\n this.reading = false;\n },\n );\n } else {\n this.device.queue.submit([encoder.finish()]);\n }\n } catch {\n // transient device loss mid-frame — onLost() drives recovery\n }\n }\n\n destroy(): void {\n this.destroyed = true;\n for (const s of this.slots) {\n s.xy.destroy();\n s.prev.destroy();\n s.scratch?.destroy();\n s.dec?.destroy();\n }\n this.slots = [];\n this.ubuf?.destroy();\n this.queryBuf?.destroy();\n this.readBuf?.destroy();\n this.querySet?.destroy();\n try {\n this.ctx.unconfigure();\n } catch {\n // context may already be dead\n }\n this.canvas.remove();\n }\n}\n\nconst BLEND: GPUBlendState = {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\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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"}
|