resolvcharts 0.1.0 → 0.2.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/README.md +92 -26
- package/dist/index.cjs +216 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +111 -22
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +111 -22
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +216 -35
- package/dist/index.mjs.map +1 -1
- package/dist/resolvcharts.global.min.js +8 -8
- package/dist/resolvcharts.global.min.js.map +1 -1
- package/package.json +7 -2
|
@@ -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","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","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/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\nconst MAX_BAR_W = 40;\nconst GAP_RATIO = 0.2;\nconst 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\nfunction 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 */\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 */\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","/** 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/** 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 alpha: boolean,\n): CanvasRenderingContext2D {\n const ctx = canvas.getContext(\"2d\", { alpha });\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\n constructor(container: HTMLElement, cssW: number, cssH: number) {\n this.container = container;\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, true);\n this.overlay = setup2d(this.overlayCanvas, true);\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, true);\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/** 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/** `[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/** 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\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\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\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\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 { 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 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\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);\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\") {\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 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 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 } 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\") {\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 (d.kind === \"xy\" && info.kind === \"point\") {\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 ? s.y[info.index] : 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 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 *\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","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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"}
|