@vielzeug/prism 26.10.5 → 26.10.7

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.
Files changed (79) hide show
  1. package/README.md +1 -1
  2. package/dist/axes/axis.cjs +1 -1
  3. package/dist/axes/axis.cjs.map +1 -1
  4. package/dist/axes/axis.d.ts +10 -3
  5. package/dist/axes/axis.d.ts.map +1 -1
  6. package/dist/axes/axis.js +1 -1
  7. package/dist/axes/axis.js.map +1 -1
  8. package/dist/axes/grid.cjs +1 -1
  9. package/dist/axes/grid.cjs.map +1 -1
  10. package/dist/axes/grid.d.ts +1 -1
  11. package/dist/axes/grid.d.ts.map +1 -1
  12. package/dist/axes/grid.js +1 -1
  13. package/dist/axes/grid.js.map +1 -1
  14. package/dist/charts/area/area-chart.cjs +1 -1
  15. package/dist/charts/area/area-chart.cjs.map +1 -1
  16. package/dist/charts/area/area-chart.d.ts.map +1 -1
  17. package/dist/charts/area/area-chart.js +1 -1
  18. package/dist/charts/area/area-chart.js.map +1 -1
  19. package/dist/charts/bar/bar-chart.cjs +1 -1
  20. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  21. package/dist/charts/bar/bar-chart.d.ts.map +1 -1
  22. package/dist/charts/bar/bar-chart.js +1 -1
  23. package/dist/charts/bar/bar-chart.js.map +1 -1
  24. package/dist/charts/line/line-chart.cjs +1 -1
  25. package/dist/charts/line/line-chart.cjs.map +1 -1
  26. package/dist/charts/line/line-chart.d.ts.map +1 -1
  27. package/dist/charts/line/line-chart.js +1 -1
  28. package/dist/charts/line/line-chart.js.map +1 -1
  29. package/dist/charts/scatter/index.d.ts +2 -0
  30. package/dist/charts/scatter/index.d.ts.map +1 -0
  31. package/dist/charts/scatter/scatter-chart.cjs +2 -0
  32. package/dist/charts/scatter/scatter-chart.cjs.map +1 -0
  33. package/dist/charts/scatter/scatter-chart.d.ts +3 -0
  34. package/dist/charts/scatter/scatter-chart.d.ts.map +1 -0
  35. package/dist/charts/scatter/scatter-chart.js +2 -0
  36. package/dist/charts/scatter/scatter-chart.js.map +1 -0
  37. package/dist/charts/scatter/scatter-renderer.cjs +2 -0
  38. package/dist/charts/scatter/scatter-renderer.cjs.map +1 -0
  39. package/dist/charts/scatter/scatter-renderer.d.ts +24 -0
  40. package/dist/charts/scatter/scatter-renderer.d.ts.map +1 -0
  41. package/dist/charts/scatter/scatter-renderer.js +2 -0
  42. package/dist/charts/scatter/scatter-renderer.js.map +1 -0
  43. package/dist/index.cjs +1 -1
  44. package/dist/index.d.ts +2 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/interaction/announcer.cjs +1 -1
  48. package/dist/interaction/announcer.cjs.map +1 -1
  49. package/dist/interaction/announcer.d.ts +1 -1
  50. package/dist/interaction/announcer.d.ts.map +1 -1
  51. package/dist/interaction/announcer.js +1 -1
  52. package/dist/interaction/announcer.js.map +1 -1
  53. package/dist/interaction/scatter-interaction.cjs +2 -0
  54. package/dist/interaction/scatter-interaction.cjs.map +1 -0
  55. package/dist/interaction/scatter-interaction.d.ts +36 -0
  56. package/dist/interaction/scatter-interaction.d.ts.map +1 -0
  57. package/dist/interaction/scatter-interaction.js +2 -0
  58. package/dist/interaction/scatter-interaction.js.map +1 -0
  59. package/dist/interaction/series-interaction.cjs +1 -1
  60. package/dist/interaction/series-interaction.cjs.map +1 -1
  61. package/dist/interaction/series-interaction.d.ts +3 -1
  62. package/dist/interaction/series-interaction.d.ts.map +1 -1
  63. package/dist/interaction/series-interaction.js +1 -1
  64. package/dist/interaction/series-interaction.js.map +1 -1
  65. package/dist/interaction/tooltip.cjs +1 -1
  66. package/dist/interaction/tooltip.cjs.map +1 -1
  67. package/dist/interaction/tooltip.d.ts.map +1 -1
  68. package/dist/interaction/tooltip.js +1 -1
  69. package/dist/interaction/tooltip.js.map +1 -1
  70. package/dist/prism.cjs +1 -1
  71. package/dist/prism.cjs.map +1 -1
  72. package/dist/prism.iife.js +1 -1
  73. package/dist/prism.iife.js.map +1 -1
  74. package/dist/prism.js +1 -1
  75. package/dist/prism.js.map +1 -1
  76. package/dist/theme/prism.css +6 -0
  77. package/dist/types.d.ts +38 -5
  78. package/dist/types.d.ts.map +1 -1
  79. package/package.json +4 -3
package/dist/prism.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"prism.js","names":[],"sources":["../src/_dev.ts","../src/svg/element.ts","../src/svg/text.ts","../src/axes/scale-utils.ts","../src/axes/axis.ts","../src/axes/grid.ts","../src/scales/linear.ts","../src/scales/time.ts","../src/core/cartesian-scales.ts","../src/_tappers.ts","../src/errors.ts","../src/interaction/announcer.ts","../src/interaction/legend.ts","../src/interaction/tooltip.ts","../src/core/layout.ts","../src/core/responsive.ts","../src/core/chart-base.ts","../src/core/chart-scaffold.ts","../src/core/series-id.ts","../src/interaction/crosshair.ts","../src/core/cartesian-model.ts","../src/interaction/events.ts","../src/interaction/series-interaction.ts","../src/theme/index.ts","../src/animation/easing.ts","../src/animation/motion.ts","../src/animation/tween.ts","../src/animation/transition.ts","../src/core/datum-style.ts","../src/core/ids.ts","../src/svg/path.ts","../src/charts/area/area-renderer.ts","../src/charts/area/area-chart.ts","../src/scales/band.ts","../src/charts/bar/bar-hit-test.ts","../src/animation/reveal.ts","../src/charts/bar/bar-renderer.ts","../src/charts/bar/bar-chart.ts","../src/charts/line/line-renderer.ts","../src/charts/line/line-chart.ts","../src/core/polar.ts","../src/charts/pie/pie-renderer.ts","../src/charts/pie/pie-chart.ts","../src/charts/radar/radar-geometry.ts","../src/charts/radar/radar-chart.ts","../src/charts/sparkline/sparkline.ts"],"sourcesContent":["/** @internal */\nconst isDev = !(globalThis as { __PRISM_PROD__?: boolean }).__PRISM_PROD__;\n\n/**\n * Emits a `console.warn` in development builds only.\n * @internal\n * @security Messages may include user-supplied data (e.g. category names, x-values).\n * Never pass PII, tokens, or secrets as chart data labels.\n */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/prism] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n","import { warn } from '../_dev';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nexport function createSvgElement<K extends keyof SVGElementTagNameMap>(\n tag: K,\n attrs?: Record<string, number | string | undefined>,\n): SVGElementTagNameMap[K] {\n const el = document.createElementNS(SVG_NS, tag);\n\n if (attrs) setAttributes(el, attrs);\n\n return el;\n}\n\nexport function setAttributes(el: SVGElement, attrs: Record<string, number | string | undefined>): void {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === undefined) {\n el.removeAttribute(key);\n\n continue;\n }\n\n if (typeof value === 'number' && !Number.isFinite(value)) {\n warn(\n `setAttributes: attribute \"${key}\" on <${el.tagName}> received a non-finite value (${value}): check upstream scale/geometry math for invalid input.`,\n );\n }\n\n el.setAttribute(key, String(value));\n }\n}\n\nexport function removeChildren(el: SVGElement): void {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n}\n","import { createSvgElement } from './element';\n\n/** Average glyph width relative to font size; jsdom cannot measure SVG text, so labels are estimated. */\nconst GLYPH_WIDTH = 0.6;\n\nexport function estimateTextWidth(text: string, fontSize: number): number {\n return text.length * fontSize * GLYPH_WIDTH;\n}\n\nexport function createTextElement(\n content: string,\n attrs?: Record<string, number | string | undefined>,\n): SVGTextElement {\n const text = createSvgElement('text', attrs);\n\n text.textContent = content;\n\n return text;\n}\n","import type { BandScale, Scale } from '../types';\n\nexport type AnyScale = BandScale | Scale<Date> | Scale<number>;\n\nfunction isBandScale(scale: AnyScale): scale is BandScale {\n return typeof (scale as BandScale).bandwidth === 'function';\n}\n\n/**\n * Maps a tick value through any of prism's three scale kinds, centering band-scale\n * ticks on their band (bandScale.map() returns a band's left edge by design).\n *\n * Overloaded so a caller's `tick` type must match the scale kind it's paired with :\n * `AxisConfig`/`GridConfig` accept any scale kind, so the runtime discrimination\n * inside the implementation is unavoidable, but the overload set keeps that a single\n * isolated cast here instead of an unchecked `Date | number | string` accepted at\n * every call site.\n */\nexport function mapTick(scale: BandScale, tick: string): number;\nexport function mapTick(scale: Scale<Date>, tick: Date): number;\nexport function mapTick(scale: Scale<number>, tick: number): number;\n// Fallback overload for callers (axis.ts/grid.ts) holding an already-erased `AnyScale`\n// union: the type-correlated overloads above are what protect a caller with a\n// narrower, known scale type from mismatching it with the wrong tick type.\nexport function mapTick(scale: AnyScale, tick: Date | number | string): number;\nexport function mapTick(scale: AnyScale, tick: Date | number | string): number {\n if (isBandScale(scale)) return scale.map(tick as string) + scale.bandwidth() / 2;\n\n return (scale as Scale<Date | number>).map(tick as Date | number);\n}\n","import { createSvgElement, removeChildren, setAttributes } from '../svg/element';\nimport { createTextElement, estimateTextWidth } from '../svg/text';\nimport type { AxisConfig, AxisPosition } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\n/** Default `--prism-font-size-label` in px, used to estimate category label size. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 8;\n\nconst defaultTickFormat = (v: Date | number | string): string =>\n v instanceof Date ? v.toLocaleDateString(undefined, { month: 'short', year: 'numeric' }) : String(v);\n\n/**\n * Resolves the tick count an axis will render for a given scale/length: shared with\n * `renderGrid` so gridlines line up with axis ticks. `defaultPosition` must match the\n * one passed to the corresponding `renderAxis` call ('bottom' for xAxis, 'left' for yAxis).\n */\nexport function positionAxis(parent: SVGGElement, position: AxisPosition, width: number, height: number): void {\n const transform =\n position === 'bottom' ? `translate(0,${height})` : position === 'right' ? `translate(${width},0)` : undefined;\n\n if (transform) parent.setAttribute('transform', transform);\n else parent.removeAttribute('transform');\n}\n\nexport function resolveTickCount(config: AxisConfig, length: number, defaultPosition: AxisPosition): number {\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const defaultTickCount = isHorizontal ? Math.max(2, Math.floor(length / 80)) : Math.max(2, Math.floor(length / 50));\n\n return config.tickCount ?? defaultTickCount;\n}\n\n/** How many category labels fit along the axis without their estimated boxes overlapping. */\nfunction categoryTickCount(\n domain: readonly string[],\n format: (value: string) => string,\n length: number,\n isHorizontal: boolean,\n): number {\n if (domain.length === 0) return 0;\n\n const size = isHorizontal\n ? Math.max(...domain.map((value) => estimateTextWidth(format(value), LABEL_FONT_SIZE)))\n : LABEL_FONT_SIZE * 1.3;\n\n return Math.max(1, Math.min(domain.length, Math.floor(length / (size + LABEL_GAP))));\n}\n\n/**\n * `defaultPosition` is applied when `config.position` is unset: pass `'bottom'` for an\n * xAxis call and `'left'` for a yAxis call so an unconfigured axis renders on its\n * conventional side instead of always defaulting to a horizontal bottom axis.\n */\nexport function renderAxis(\n parent: SVGGElement,\n scale: AnyScale,\n config: AxisConfig,\n length: number,\n defaultPosition: AxisPosition = 'bottom',\n): void {\n removeChildren(parent);\n\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const isInverted = position === 'top' || position === 'left';\n const tickSize = 6;\n const tickDirection = isInverted ? -1 : 1;\n\n const axisLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-line',\n x1: isHorizontal ? 0 : 0,\n x2: isHorizontal ? length : 0,\n y1: isHorizontal ? 0 : 0,\n y2: isHorizontal ? 0 : length,\n });\n\n parent.appendChild(axisLine);\n\n const format = config.tickFormat ?? defaultTickFormat;\n const tickCount =\n config.tickCount === undefined && 'bandwidth' in scale\n ? categoryTickCount(scale.domain, format, length, isHorizontal)\n : resolveTickCount(config, length, defaultPosition);\n const ticks = scale.ticks(tickCount);\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const tickLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-tick',\n x1: isHorizontal ? pos : 0,\n x2: isHorizontal ? pos : tickSize * tickDirection,\n y1: isHorizontal ? 0 : pos,\n y2: isHorizontal ? tickSize * tickDirection : pos,\n });\n\n parent.appendChild(tickLine);\n\n const label = createTextElement(format(tick), {\n 'aria-hidden': 'true',\n class: 'prism-axis-label',\n 'dominant-baseline': isHorizontal ? (isInverted ? 'auto' : 'hanging') : 'middle',\n 'text-anchor': isHorizontal ? 'middle' : isInverted ? 'end' : 'start',\n x: isHorizontal ? pos : tickSize * tickDirection * 1.5,\n y: isHorizontal ? tickSize * tickDirection * 1.5 : pos,\n });\n\n parent.appendChild(label);\n }\n\n if (config.label) {\n const labelEl = createTextElement(config.label, {\n class: 'prism-axis-title',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n });\n\n if (isHorizontal) {\n setAttributes(labelEl, { x: length / 2, y: tickSize * tickDirection * 6 });\n } else {\n setAttributes(labelEl, {\n transform: `translate(${tickSize * tickDirection * 7}, ${length / 2}) rotate(-90)`,\n });\n }\n\n parent.appendChild(labelEl);\n }\n}\n","import { createSvgElement, removeChildren } from '../svg/element';\nimport type { GridConfig } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\nexport function renderGrid(\n parent: SVGGElement,\n scale: AnyScale,\n config: GridConfig | true,\n crossLength: number,\n direction: 'horizontal' | 'vertical',\n tickCount = 10,\n): void {\n removeChildren(parent);\n\n const color = (config !== true && config.color) || undefined;\n const dash = (config !== true && config.dash) || undefined;\n const ticks = scale.ticks(tickCount);\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const attrs: Record<string, number | string | undefined> = {\n class: 'prism-grid-line',\n stroke: color ?? 'var(--prism-grid-color)',\n 'stroke-dasharray': dash,\n 'stroke-opacity': 'var(--prism-grid-opacity)',\n };\n\n if (direction === 'vertical') {\n Object.assign(attrs, { x1: pos, x2: pos, y1: 0, y2: crossLength });\n } else {\n Object.assign(attrs, { x1: 0, x2: crossLength, y1: pos, y2: pos });\n }\n\n parent.appendChild(createSvgElement('line', attrs));\n }\n}\n","import type { Scale } from '../types';\nimport type { LinearScaleConfig } from './types';\n\nfunction niceNumber(value: number, round: boolean): number {\n const exp = Math.floor(Math.log10(value));\n const frac = value / 10 ** exp;\n let nice: number;\n\n if (round) {\n if (frac < 1.5) nice = 1;\n else if (frac < 3) nice = 2;\n else if (frac < 7) nice = 5;\n else nice = 10;\n } else {\n if (frac <= 1) nice = 1;\n else if (frac <= 2) nice = 2;\n else if (frac <= 5) nice = 5;\n else nice = 10;\n }\n\n return nice * 10 ** exp;\n}\n\nfunction niceRange(min: number, max: number, tickCount: number): [number, number] {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1];\n\n if (min > max) [min, max] = [max, min];\n\n if (min === max) return [min - 1, max + 1];\n\n const range = niceNumber(max - min, false);\n const step = niceNumber(range / Math.max(1, tickCount - 1), true);\n\n return [Math.floor(min / step) * step, Math.ceil(max / step) * step];\n}\n\nexport function linearScale(config: LinearScaleConfig): Scale<number> {\n // Every method below closes over `config`/these helpers directly instead of reading\n // `this`: the returned object stays fully functional when destructured, e.g.\n // `const { map } = linearScale(cfg)`.\n const getDomain = (): [number, number] =>\n config.nice === false ? config.domain : niceRange(config.domain[0], config.domain[1], 10);\n const getRange = (): [number, number] => config.range;\n\n return {\n get domain(): [number, number] {\n return getDomain();\n },\n\n invert(pixel: number): number {\n const [d0, d1] = getDomain();\n const [r0, r1] = getRange();\n\n if (r1 === r0) return d0;\n\n const t = (pixel - r0) / (r1 - r0);\n\n return d0 + t * (d1 - d0);\n },\n\n map(value: number): number {\n const [d0, d1] = getDomain();\n const [r0, r1] = getRange();\n\n if (d1 === d0) return r0;\n\n let t = (value - d0) / (d1 - d0);\n\n if (config.clamp) {\n t = Math.max(0, Math.min(1, t));\n }\n\n return r0 + t * (r1 - r0);\n },\n\n get range(): [number, number] {\n return getRange();\n },\n\n ticks(count = 10): number[] {\n if (count <= 0) return [];\n\n const [d0, d1] = getDomain();\n\n if (d0 === d1 || count === 1) return [d0];\n\n // Normalize ordering so a reversed domain (e.g. an explicitly inverted axis with\n // `nice: false`) doesn't feed a negative range into niceNumber()'s Math.log10.\n const lo = Math.min(d0, d1);\n const hi = Math.max(d0, d1);\n const range = niceNumber(hi - lo, false);\n const step = niceNumber(range / (count - 1), true);\n const start = Math.ceil(lo / step) * step;\n const end = Math.floor(hi / step) * step;\n const ticks: number[] = [];\n\n for (let v = start; v <= end + step * 0.5; v += step) {\n ticks.push(Math.round(v * 1e12) / 1e12);\n }\n\n return ticks;\n },\n };\n}\n","import type { Scale } from '../types';\nimport type { TimeScaleConfig } from './types';\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst MONTH = 30 * DAY;\nconst YEAR = 365 * DAY;\n\nconst TIME_INTERVALS = [\n SECOND,\n 5 * SECOND,\n 15 * SECOND,\n 30 * SECOND,\n MINUTE,\n 5 * MINUTE,\n 15 * MINUTE,\n 30 * MINUTE,\n HOUR,\n 3 * HOUR,\n 6 * HOUR,\n 12 * HOUR,\n DAY,\n 7 * DAY,\n MONTH,\n 3 * MONTH,\n 6 * MONTH,\n YEAR,\n];\n\nfunction chooseInterval(range: number, count: number): number {\n const target = Math.abs(range) / Math.max(1, count);\n\n for (const interval of TIME_INTERVALS) {\n if (interval >= target) return interval;\n }\n\n return YEAR;\n}\n\nfunction niceDomain(domain: [Date, Date], count: number): [Date, Date] {\n let [d0, d1] = domain;\n\n if (d0.getTime() > d1.getTime()) [d0, d1] = [d1, d0];\n\n const range = d1.getTime() - d0.getTime();\n const interval = chooseInterval(range, count);\n\n return [\n new Date(Math.floor(d0.getTime() / interval) * interval),\n new Date(Math.ceil(d1.getTime() / interval) * interval),\n ];\n}\n\nexport function timeScale(config: TimeScaleConfig): Scale<Date> {\n // Every method below closes over `config`/these helpers directly instead of reading\n // `this`: the returned object stays fully functional when destructured, e.g.\n // `const { map } = timeScale(cfg)`.\n const getDomain = (): [Date, Date] => (config.nice === false ? config.domain : niceDomain(config.domain, 10));\n const getRange = (): [number, number] => config.range;\n\n return {\n get domain(): [Date, Date] {\n return getDomain();\n },\n\n invert(pixel: number): Date {\n const [d0, d1] = getDomain();\n const [r0, r1] = getRange();\n\n if (r1 === r0) return d0;\n\n const t = (pixel - r0) / (r1 - r0);\n\n return new Date(d0.getTime() + t * (d1.getTime() - d0.getTime()));\n },\n\n map(value: Date): number {\n const [d0, d1] = getDomain();\n const [r0, r1] = getRange();\n const dRange = d1.getTime() - d0.getTime();\n\n if (dRange === 0) return r0;\n\n const t = (value.getTime() - d0.getTime()) / dRange;\n\n return r0 + t * (r1 - r0);\n },\n\n get range(): [number, number] {\n return getRange();\n },\n\n ticks(count = 10): Date[] {\n const [d0, d1] = getDomain();\n const range = d1.getTime() - d0.getTime();\n const interval = chooseInterval(range, count);\n const start = Math.ceil(d0.getTime() / interval) * interval;\n const ticks: Date[] = [];\n\n for (let t = start; t <= d1.getTime(); t += interval) {\n ticks.push(new Date(t));\n }\n\n return ticks;\n },\n };\n}\n","import { warn } from '../_dev';\nimport { linearScale } from '../scales/linear';\nimport { timeScale } from '../scales/time';\nimport type { Scale } from '../types';\n\nexport function buildXScale(allX: (Date | number)[], width: number): Scale<Date> | Scale<number> {\n if (allX.length === 0) return linearScale({ domain: [0, 1], range: [0, width] });\n\n if (allX.some((v) => v == null)) {\n warn(\n 'buildXScale: one or more x values are null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX.some((v) => typeof v === 'number' && !Number.isFinite(v))) {\n warn('buildXScale: one or more x values are NaN or Infinity: check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX[0] instanceof Date) {\n const dates = allX as Date[];\n const minMs = Math.min(...dates.map(Number));\n const maxMs = Math.max(...dates.map(Number));\n const min = new Date(minMs);\n const max = new Date(minMs === maxMs ? maxMs + 1 : maxMs);\n\n return timeScale({ domain: [min, max], nice: false, range: [0, width] });\n }\n\n const nums = allX as number[];\n const minN = Math.min(...nums);\n const maxN = Math.max(...nums);\n\n return linearScale({ domain: [minN, minN === maxN ? maxN + 1 : maxN], nice: false, range: [0, width] });\n}\n\nexport function buildYScale(allY: number[], height: number, includeZero = true): Scale<number> {\n if (allY.length === 0) return linearScale({ domain: [0, 1], range: [height, 0] });\n\n if (allY.some((v) => v == null)) {\n warn(\n 'buildYScale: one or more y values are null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n if (allY.some((v) => !Number.isFinite(v))) {\n warn('buildYScale: one or more y values are NaN or Infinity: check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n const rawMin = Math.min(...allY);\n const minY = includeZero ? Math.min(0, rawMin) : rawMin;\n const maxY = Math.max(...allY);\n\n return linearScale({ domain: [minY, minY === maxY ? maxY + 1 : maxY], range: [height, 0] });\n}\n","/**\n * Shared `tap()` machinery for chart handles.\n *\n * @internal Private to the package: consumers observe charts through\n * `ChartHandle.tap()`, never through this module.\n */\n\nexport interface Tappers<E extends { readonly type: string }> {\n /** Delivers `event` to every registered handler, swallowing handler errors. */\n emit(event: E): void;\n /** Clears every handler; later `tap()` calls return a no-op unsubscribe. */\n stop(): void;\n tap(handler: (event: E) => void, options?: { readonly signal?: AbortSignal }): () => void;\n}\n\nexport function createTappers<E extends { readonly type: string }>(): Tappers<E> {\n const tappers = new Set<(event: E) => void>();\n let stopped = false;\n\n return {\n emit(event) {\n // Zero-overhead guard: observation costs nothing while nobody is watching.\n if (tappers.size === 0) return;\n\n for (const handler of tappers) {\n try {\n handler(event);\n } catch {\n // Observability must never affect chart behavior.\n }\n }\n },\n stop() {\n stopped = true;\n tappers.clear();\n },\n tap(handler, options) {\n if (stopped || options?.signal?.aborted) return () => {};\n\n tappers.add(handler);\n\n const detach = (): void => {\n tappers.delete(handler);\n };\n\n options?.signal?.addEventListener('abort', detach, { once: true });\n\n return detach;\n },\n };\n}\n","/** Base class for all prism errors. Use `instanceof PrismError` to catch any prism-originated error. */\nexport class PrismError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a chart is given a structurally invalid configuration it cannot render at all (e.g. a non-Element `container`). Recoverable issues like empty or malformed data emit a dev-mode warning instead: see the package docs for details. */\nexport class PrismRenderError extends PrismError {}\n","import { createSvgElement } from '../svg/element';\nimport type { Datum, Series } from '../types';\n\nexport interface Announcer {\n announce(text: string): void;\n clear(): void;\n}\n\n/** \"Label: A 6, B 9\": the comparison text shared by tooltips and announcements. */\nexport function describeValues(\n label: string,\n values: readonly { datum: Datum | undefined; series: Series }[],\n format: (value: number) => string = String,\n): string {\n return `${label}: ${values.map(({ datum, series }) => `${series.name} ${datum ? format(datum.value) : 'n/a'}`).join(', ')}`;\n}\n\n/** Polite status region for charts whose visuals are aria-hidden. */\nexport function createAnnouncer(parent: SVGElement, className: string): Announcer {\n // Off-canvas rather than CSS-hidden so announcements work without prism's stylesheet.\n const region = createSvgElement('text', {\n 'aria-live': 'polite',\n class: className,\n role: 'status',\n x: -9999,\n y: -9999,\n });\n\n parent.appendChild(region);\n\n return {\n announce(text) {\n region.textContent = text;\n },\n clear() {\n region.textContent = '';\n },\n };\n}\n","import type { LegendConfig, LegendPosition } from '../types';\n\nexport interface LegendState {\n dispose(): void;\n el: HTMLDivElement | null;\n update(series: { color: string; name: string }[]): void;\n [Symbol.dispose](): void;\n}\n\nfunction resolvePosition(config: LegendConfig | true): LegendPosition {\n if (config === true) return 'bottom';\n\n return config.position ?? 'bottom';\n}\n\nexport function createLegend(container: HTMLElement, config: LegendConfig | true, onLayout?: () => void): LegendState {\n const position = resolvePosition(config);\n const el = document.createElement('div');\n\n el.className = `prism-legend prism-legend-${position}`;\n\n if (position === 'top') {\n container.insertBefore(el, container.firstChild);\n } else {\n container.appendChild(el);\n }\n\n const disposeHandle = (): void => {\n el.remove();\n };\n\n return {\n dispose: disposeHandle,\n el,\n [Symbol.dispose]: disposeHandle,\n update(series) {\n el.replaceChildren();\n for (const s of series) {\n const item = document.createElement('div');\n\n item.className = 'prism-legend-item';\n\n const dot = document.createElement('span');\n\n dot.className = 'prism-legend-dot';\n dot.style.backgroundColor = s.color;\n\n const label = document.createElement('span');\n\n label.className = 'prism-legend-label';\n label.textContent = s.name;\n\n item.appendChild(dot);\n item.appendChild(label);\n el.appendChild(item);\n }\n onLayout?.();\n },\n };\n}\n","import { computePosition, flip, offset, shift } from '@vielzeug/orbit';\nimport type { Datum, Series, TooltipConfig } from '../types';\n\nexport interface TooltipRow {\n color: string;\n name: string;\n value: string;\n}\n\n/** Inline so the spoken text stays hidden even without prism's stylesheet. */\nconst SCREEN_READER_ONLY =\n 'position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap';\n\n/**\n * Title plus one swatch row per series; text only, so data is never parsed as HTML.\n * `spoken` is what the tooltip's live region announces; the visual rows are aria-hidden.\n */\nexport function comparisonContent(\n doc: Document,\n title: string,\n rows: readonly TooltipRow[],\n spoken: string,\n): HTMLElement {\n const body = doc.createElement('div');\n const sr = doc.createElement('span');\n const visual = doc.createElement('div');\n const head = doc.createElement('div');\n\n body.className = 'prism-tooltip-body';\n sr.className = 'prism-tooltip-sr';\n sr.style.cssText = SCREEN_READER_ONLY;\n sr.textContent = spoken;\n visual.setAttribute('aria-hidden', 'true');\n head.className = 'prism-tooltip-title';\n head.textContent = title;\n visual.appendChild(head);\n\n for (const row of rows) {\n const line = doc.createElement('div');\n const swatch = doc.createElement('span');\n const name = doc.createElement('span');\n const value = doc.createElement('span');\n\n line.className = 'prism-tooltip-row';\n swatch.className = 'prism-tooltip-swatch';\n swatch.style.setProperty('--prism-swatch', row.color);\n name.className = 'prism-tooltip-name';\n name.textContent = row.name;\n value.className = 'prism-tooltip-value';\n value.textContent = row.value;\n line.append(swatch, name, value);\n visual.appendChild(line);\n }\n\n body.append(sr, visual);\n\n return body;\n}\n\nexport interface TooltipState {\n dispose(): void;\n el: HTMLDivElement | null;\n hide(): void;\n /** `content` replaces the default `series: value` body when no custom `render` is configured. */\n show(x: number, y: number, datum: Datum, series: Series, content?: Node | string): void;\n [Symbol.dispose](): void;\n}\n\nexport function createTooltip(container: HTMLElement, config?: TooltipConfig | true): TooltipState {\n const previousPosition = container.style.position;\n const changedPosition = getComputedStyle(container).position === 'static';\n\n if (changedPosition) container.style.position = 'relative';\n\n const el = container.ownerDocument.createElement('div');\n\n el.className = 'prism-tooltip';\n el.style.position = 'absolute';\n el.style.pointerEvents = 'none';\n el.style.top = '0';\n el.style.left = '0';\n // Non-modal status text: announced by assistive tech whenever content/hide state changes.\n el.setAttribute('role', 'status');\n el.setAttribute('aria-live', 'polite');\n container.appendChild(el);\n\n const tooltipOffset: number = (config !== true && config?.offset) || 8;\n const render = config !== true ? config?.render : undefined;\n\n // Opacity stays inline (the transition is declared in CSS against the token\n // duration); the class carries the rise, which needs to combine with the\n // left/top positioning without fighting it.\n const setVisible = (next: boolean): void => {\n el.classList.toggle('prism-tooltip--visible', next);\n el.style.opacity = next ? '1' : '0';\n };\n\n let revealFrame: number | null = null;\n let clearTimer: ReturnType<typeof setTimeout> | null = null;\n let visible = false;\n\n const cancelClear = (): void => {\n if (clearTimer === null) return;\n\n clearTimeout(clearTimer);\n clearTimer = null;\n };\n\n const cancelReveal = (): void => {\n if (revealFrame === null) return;\n\n cancelAnimationFrame(revealFrame);\n revealFrame = null;\n };\n\n const disposeHandle = (): void => {\n cancelReveal();\n cancelClear();\n el.remove();\n if (changedPosition && container.style.position === 'relative') container.style.position = previousPosition;\n };\n\n return {\n dispose: disposeHandle,\n el,\n hide() {\n cancelReveal();\n cancelClear();\n visible = false;\n setVisible(false);\n clearTimer = setTimeout(() => {\n clearTimer = null;\n\n if (!visible) el.textContent = '';\n }, 150);\n },\n show(x: number, y: number, datum: Datum, series: Series, content?: Node | string) {\n if (!container.isConnected) return;\n\n cancelClear();\n\n const body = render ? render(datum, series) : (content ?? `${series.name}: ${datum.value}`);\n\n if (typeof body === 'string') el.textContent = body;\n else el.replaceChildren(body);\n\n const virtualRef = {\n getBoundingClientRect: () => {\n const rect = container.getBoundingClientRect();\n\n return {\n bottom: rect.top + y,\n height: 0,\n left: rect.left + x,\n right: rect.left + x,\n top: rect.top + y,\n width: 0,\n x: rect.left + x,\n y: rect.top + y,\n };\n },\n };\n\n const { x: positionX, y: positionY } = computePosition(virtualRef, el, {\n containingBlock: container,\n middleware: [offset(tooltipOffset), flip(), shift({ padding: 8 })],\n placement: 'top',\n });\n\n el.style.left = `${positionX}px`;\n el.style.top = `${positionY}px`;\n\n if (visible) {\n if (revealFrame === null) setVisible(true);\n\n return;\n }\n\n visible = true;\n setVisible(false);\n // One frame at the hidden state first: without it the browser has no\n // starting value to transition from and the tooltip would just appear.\n revealFrame = requestAnimationFrame(() => {\n revealFrame = null;\n\n if (visible) setVisible(true);\n });\n },\n [Symbol.dispose]: disposeHandle,\n };\n}\n","import type { ChartMargin } from '../types';\n\nconst DEFAULT_MARGIN: ChartMargin = { bottom: 48, left: 50, right: 20, top: 20 };\n\nexport function resolveMargin(margin?: Partial<ChartMargin>): ChartMargin {\n return { ...DEFAULT_MARGIN, ...margin };\n}\n\nexport function chartArea(width: number, height: number, margin: ChartMargin): { height: number; width: number } {\n return {\n height: Math.max(0, height - margin.top - margin.bottom),\n width: Math.max(0, width - margin.left - margin.right),\n };\n}\n","export function observeResize(el: HTMLElement, callback: (width: number, height: number) => void): () => void {\n // Environments without ResizeObserver (jsdom, SSR) get a no-op subscription: the chart\n // keeps its initial getBoundingClientRect size and never observes, instead of throwing.\n if (typeof ResizeObserver === 'undefined') return () => {};\n\n let rafId: number | null = null;\n\n const observer = new ResizeObserver((entries) => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n rafId = requestAnimationFrame(() => {\n rafId = null;\n\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n callback(width, height);\n }\n });\n });\n\n observer.observe(el);\n\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n observer.disconnect();\n };\n}\n","import { warn } from '../_dev';\nimport { PrismRenderError } from '../errors';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { ChartA11y, ChartDimensions, ChartMargin } from '../types';\nimport { resolveMargin } from './layout';\nimport { observeResize } from './responsive';\n\nexport interface ChartBase {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n dispose(): void;\n svg: SVGSVGElement;\n syncChrome(): void;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: {\n a11y?: ChartA11y;\n /**\n * The chart's own in-flow chrome inside the container (the legend). Its height is\n * subtracted from every resize-driven svg height: the container's content box contains\n * the svg plus this chrome, so assigning the full content height back to the svg would\n * grow the container by the chrome's height on every pass — unbounded growth in any\n * auto-height container. Subtracting it makes the layout converge on the fixed point\n * `container = svg + chrome` instead.\n */\n chrome?: () => HTMLElement | null;\n margin?: Partial<ChartMargin>;\n },\n onResize?: () => void,\n): ChartBase {\n // Duck-typed rather than `instanceof Element`: an `instanceof` check would reject a\n // structurally valid Element from a different realm (e.g. an Element created via\n // `iframe.contentDocument.createElement(...)`, whose prototype chain terminates in that\n // iframe's own `Element` constructor), which is a legitimate usage pattern this package\n // doesn't otherwise restrict.\n const isElementLike =\n typeof container === 'object' &&\n container !== null &&\n container.nodeType === 1 &&\n typeof container.appendChild === 'function' &&\n typeof container.getBoundingClientRect === 'function';\n\n if (!isElementLike) {\n const received: unknown = container;\n const kind =\n received === null\n ? 'null'\n : typeof received === 'object'\n ? (received.constructor?.name ?? 'object')\n : typeof received;\n\n throw new PrismRenderError(`Invalid chart configuration: \\`container\\` must be a DOM Element, received ${kind}.`);\n }\n\n const margin = resolveMargin(options.margin);\n const a11y = options.a11y;\n const svg = createSvgElement('svg', {\n ...(!a11y || a11y.decorative\n ? { 'aria-hidden': 'true' }\n : { 'aria-label': a11y.ariaLabel, role: 'img', tabindex: '0' }),\n class: 'prism-chart',\n // The svg's width/height attributes are its single source of sizing truth (set below and\n // on every resize pass, chrome excluded). CSS percentage sizing here would override the\n // attributes: `height: 100%` fills the whole container, so the in-flow legend rides past\n // the container's edge instead of inside the height the resize pass reserved for it.\n style: 'display:block;max-width:100%',\n });\n\n const chartAreaGroup = createSvgElement('g', {\n class: 'prism-chart-area',\n transform: `translate(${margin.left},${margin.top})`,\n });\n\n svg.appendChild(chartAreaGroup);\n\n const rect = container.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0) {\n warn(\n 'Chart container has zero dimensions. Ensure the container has a defined width and height before mounting a chart.',\n );\n }\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\n\n const dimensions: ChartDimensions = {\n height: initialHeight,\n margin,\n width: initialWidth,\n };\n\n // The dimensions the svg currently carries. A resize pass only re-renders when the\n // effective drawing size moves away from these.\n let appliedWidth = initialWidth;\n let appliedHeight = initialHeight;\n let containerHeight = initialHeight;\n\n // Legend updates reserve their space synchronously, before a renderer builds scales.\n const syncChrome = (): void => {\n const height = Math.max(0, containerHeight - (options.chrome?.()?.offsetHeight ?? 0));\n\n appliedHeight = height;\n dimensions.height = height;\n setAttributes(svg, { height, viewBox: `0 0 ${dimensions.width} ${height}` });\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n containerHeight = height;\n const chromeHeight = options.chrome?.()?.offsetHeight ?? 0;\n const svgHeight = Math.max(0, height - chromeHeight);\n\n // A ResizeObserver fires once for the initial observation, at the size the chart was\n // already built at. Re-rendering there is a no-op for layout but cancels a mount\n // entrance still in flight (the renderers treat the redraw as an already-drawn\n // update and snap to final), so a chart would never animate on first paint. Skip the\n // pass unless the effective size — legend chrome included — has genuinely changed.\n if (width === appliedWidth && svgHeight === appliedHeight) return;\n\n appliedWidth = width;\n appliedHeight = svgHeight;\n dimensions.height = svgHeight;\n dimensions.width = width;\n setAttributes(svg, { height: svgHeight, viewBox: `0 0 ${width} ${svgHeight}`, width });\n onResize?.();\n });\n\n setAttributes(svg, {\n height: initialHeight,\n viewBox: `0 0 ${initialWidth} ${initialHeight}`,\n width: initialWidth,\n });\n\n container.appendChild(svg);\n\n return {\n chartArea: chartAreaGroup,\n dimensions,\n dispose() {\n stopObserving();\n svg.remove();\n },\n svg,\n syncChrome,\n };\n}\n","import { createTappers } from '../_tappers';\nimport { PrismRenderError } from '../errors';\nimport { type Announcer, createAnnouncer } from '../interaction/announcer';\nimport type { CrosshairState } from '../interaction/crosshair';\nimport type { LegendState } from '../interaction/legend';\nimport { createLegend } from '../interaction/legend';\nimport type { TooltipState } from '../interaction/tooltip';\nimport { createTooltip } from '../interaction/tooltip';\nimport { createSvgElement, removeChildren } from '../svg/element';\nimport type { BaseChartConfig, ChartDimensions, ChartHandle, PrismEvent } from '../types';\nimport { createChartBase } from './chart-base';\n\nexport interface ScaffoldGroups {\n grid: SVGGElement;\n series: SVGGElement;\n xAxis: SVGGElement;\n yAxis: SVGGElement;\n}\n\n/**\n * Clears a cartesian chart's series/grid/axis groups and hides its legend/tooltip/crosshair :\n * shared by every cartesian chart factory's \"no data\" early-return so an update\n * to empty data leaves a fully blank chart, not a half-cleared one.\n */\nexport function clearCartesianDom(\n groups: ScaffoldGroups,\n legend: LegendState | null,\n tooltip: TooltipState | null,\n crosshair?: CrosshairState | null,\n): void {\n removeChildren(groups.series);\n removeChildren(groups.grid);\n removeChildren(groups.xAxis);\n removeChildren(groups.yAxis);\n legend?.update([]);\n tooltip?.hide();\n crosshair?.hide();\n}\n\nexport interface ScaffoldContext {\n /** Speaks hover/keyboard values when no tooltip is shown (the tooltip is its own live region). */\n announcer: Announcer;\n chartArea: SVGGElement;\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed: renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n groups: ScaffoldGroups;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface RadialScaffoldContext {\n announcer: Announcer;\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed: renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface ChartEventHandlers {\n onClick?: (event: MouseEvent) => void;\n onKeyDown?: (event: KeyboardEvent) => void;\n onMouseLeave?: (event: MouseEvent) => void;\n onMouseMove?: (event: MouseEvent) => void;\n}\n\ntype RenderReason = 'mount' | 'resize' | 'update';\n\nfunction runScaffold<TCtx, TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n buildCtx: (\n base: {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n svg: SVGSVGElement;\n },\n tooltip: TooltipState | null,\n legend: LegendState | null,\n disposalSignal: AbortSignal,\n announcer: Announcer,\n ) => TCtx,\n renderFn: (ctx: TCtx, reason: RenderReason) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n let render = (_reason: RenderReason) => {};\n const tappers = createTappers<PrismEvent>();\n // Bottom legends follow the SVG. Populate them before measuring chart geometry,\n // so the first observer notification does not interrupt the entrance.\n let legend: LegendState | null = null;\n const base = createChartBase(\n container,\n { a11y: config.a11y, chrome: () => legend?.el ?? null, margin: config.margin },\n () => {\n tappers.emit({ height: base.dimensions.height, type: 'resize', width: base.dimensions.width });\n render('resize');\n },\n );\n const tooltip = config.tooltip ? createTooltip(container, config.tooltip) : null;\n legend = config.legend ? createLegend(container, config.legend, () => base.syncChrome()) : null;\n const ac = new AbortController();\n const ctx = buildCtx(base, tooltip, legend, ac.signal, createAnnouncer(base.svg, 'prism-live'));\n\n let disposed = false;\n const events = makeEventManager(base.svg);\n\n render = (reason) => {\n if (disposed) return;\n events.attach(renderFn(ctx, reason));\n };\n\n try {\n render('mount');\n } catch (error) {\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (disposed) return;\n\n disposed = true;\n tappers.emit({ type: 'dispose' });\n tappers.stop();\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n },\n\n get disposed(): boolean {\n return disposed;\n },\n\n el: base.svg,\n\n tap: tappers.tap,\n\n update(data) {\n if (disposed) throw new PrismRenderError('Cannot update a disposed chart.');\n updateData(data);\n render('update');\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n}\n\nfunction makeEventManager(svg: SVGSVGElement): {\n attach(handlers: ChartEventHandlers | undefined): void;\n detach(): void;\n} {\n let active: ChartEventHandlers | null = null;\n\n return {\n attach(handlers) {\n if (active) {\n if (active.onMouseMove) svg.removeEventListener('mousemove', active.onMouseMove);\n\n if (active.onMouseLeave) svg.removeEventListener('mouseleave', active.onMouseLeave);\n\n if (active.onClick) svg.removeEventListener('click', active.onClick);\n\n if (active.onKeyDown) svg.removeEventListener('keydown', active.onKeyDown);\n\n active = null;\n }\n\n if (!handlers) return;\n\n active = handlers;\n\n if (handlers.onMouseMove) svg.addEventListener('mousemove', handlers.onMouseMove);\n\n if (handlers.onMouseLeave) svg.addEventListener('mouseleave', handlers.onMouseLeave);\n\n if (handlers.onClick) svg.addEventListener('click', handlers.onClick);\n\n if (handlers.onKeyDown) svg.addEventListener('keydown', handlers.onKeyDown);\n },\n detach() {\n this.attach(undefined);\n },\n };\n}\n\n/**\n * Cartesian scaffold: provides grid/axis/series SVG groups and a render loop.\n * `renderFn` returns optional `ChartEventHandlers` that are attached/replaced\n * after every data update or resize.\n */\nexport function createChartScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: ScaffoldContext, reason: RenderReason) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal, announcer) => {\n const groups: ScaffoldGroups = {\n // Grid lines are purely decorative relative to the root svg's own role=\"img\"/aria-label.\n // Axis groups are NOT hidden wholesale: they can contain a meaningful `.prism-axis-title`;\n // `renderAxis` marks its own decorative tick lines/labels individually instead.\n grid: createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-grid' }),\n series: createSvgElement('g', { class: 'prism-series' }),\n xAxis: createSvgElement('g', { class: 'prism-x-axis' }),\n yAxis: createSvgElement('g', { class: 'prism-y-axis' }),\n };\n\n base.chartArea.appendChild(groups.grid);\n base.chartArea.appendChild(groups.xAxis);\n base.chartArea.appendChild(groups.yAxis);\n base.chartArea.appendChild(groups.series);\n\n return {\n announcer,\n chartArea: base.chartArea,\n container,\n dimensions: base.dimensions,\n disposalSignal,\n groups,\n legend,\n svg: base.svg,\n tooltip,\n } satisfies ScaffoldContext;\n },\n renderFn,\n updateData,\n );\n}\n\n/**\n * Radial scaffold: for charts that do not use cartesian axis groups\n * (pie, donut, semi). Provides only tooltip, legend, and the SVG root.\n */\nexport function createRadialScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: RadialScaffoldContext, reason: RenderReason) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal, announcer) =>\n ({\n announcer,\n container,\n dimensions: base.dimensions,\n disposalSignal,\n legend,\n svg: base.svg,\n tooltip,\n }) satisfies RadialScaffoldContext,\n renderFn,\n updateData,\n );\n}\n","import type { Series } from '../types';\n\n/**\n * Stable `data-series-id` value for a series group: the sanitized explicit\n * `id`, else the positional `series-<index>` fallback. Characters outside\n * `[A-Za-z0-9_-]` become `-` so the value is always attribute-safe.\n */\nexport function seriesDomId(series: Pick<Series, 'id' | 'name'> | undefined, index: number): string {\n return series?.id ? series.id.replace(/[^A-Za-z0-9_-]/g, '-') : `series-${index}`;\n}\n","import { createSvgElement, setAttributes } from '../svg/element';\nimport type { CrosshairConfig } from '../types';\n\nexport interface CrosshairState {\n hide(): void;\n show(x: number, y: number, width: number, height: number): void;\n /** When `false`, the crosshair follows the raw mouse position instead of snapping to the nearest datum. */\n readonly snap: boolean;\n}\n\n/**\n * Guide lines for the hovered position. Each line is drawn at the origin and placed\n * with a `transform`, so the CSS transition on `transform` glides a snapped guide to\n * the next datum. (`x1`/`y1` are not animatable CSS geometry properties, so the\n * position has to live in the transform.) Because the group starts `display: none`,\n * the first show places the guide instantly instead of sliding it in from the origin.\n */\nexport function createCrosshair(parent: SVGGElement, config?: CrosshairConfig | true): CrosshairState {\n const showVertical = config === true || config?.vertical !== false;\n const showHorizontal = config !== true && config?.horizontal === true;\n const snap = config === true || config?.snap !== false;\n\n const group = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-crosshair', style: 'display:none' });\n\n const vLine = showVertical\n ? createSvgElement('line', { class: 'prism-crosshair-v', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n const hLine = showHorizontal\n ? createSvgElement('line', { class: 'prism-crosshair-h', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n\n if (vLine) group.appendChild(vLine);\n\n if (hLine) group.appendChild(hLine);\n\n parent.appendChild(group);\n\n return {\n hide() {\n group.style.display = 'none';\n },\n show(x: number, y: number, width: number, height: number) {\n group.style.display = '';\n\n if (vLine) {\n setAttributes(vLine, { x1: 0, x2: 0, y1: 0, y2: height });\n vLine.style.transform = `translateX(${x}px)`;\n }\n\n if (hLine) {\n setAttributes(hLine, { x1: 0, x2: width, y1: 0, y2: 0 });\n hLine.style.transform = `translateY(${y}px)`;\n }\n },\n snap,\n };\n}\n","import { warn } from '../_dev';\nimport type { Datum, Series } from '../types';\n\nexport type CartesianKey = string;\n\nexport interface CartesianSeries<S extends Series = Series> {\n readonly byKey: ReadonlyMap<CartesianKey, Datum>;\n readonly config: S;\n}\n\nexport interface CartesianModel<S extends Series = Series> {\n readonly domain: CartesianKey[];\n readonly labels: ReadonlyMap<CartesianKey, Datum['key']>;\n readonly series: readonly CartesianSeries<S>[];\n}\n\nexport function keyId(key: Datum['key']): CartesianKey {\n if (key instanceof Date) return `date:${key.getTime()}`;\n\n return `${typeof key}:${String(key)}`;\n}\n\nexport function normalizeCartesianSeries<S extends Series>(\n series: readonly S[],\n data: readonly (readonly Datum[])[],\n): CartesianModel<S> {\n const domain: CartesianKey[] = [];\n const labels = new Map<CartesianKey, Datum['key']>();\n const normalized = series.map((config, seriesIndex) => {\n const byKey = new Map<CartesianKey, Datum>();\n\n for (const datum of data[seriesIndex] ?? []) {\n const id = keyId(datum.key);\n\n if (byKey.has(id)) {\n warn(`Duplicate datum key \"${String(datum.key)}\" in series \"${config.name}\"; keeping the first value.`);\n continue;\n }\n\n byKey.set(id, datum);\n\n if (!labels.has(id)) {\n labels.set(id, datum.key);\n domain.push(id);\n }\n }\n\n return { byKey, config } satisfies CartesianSeries<S>;\n });\n\n return { domain, labels, series: normalized };\n}\n","import type { Point } from '../svg/path';\n\nexport function getMousePosition(svg: SVGSVGElement, event: MouseEvent, offsetX: number, offsetY: number): Point {\n const rect = svg.getBoundingClientRect();\n\n return {\n x: event.clientX - rect.left - offsetX,\n y: event.clientY - rect.top - offsetY,\n };\n}\n","import { keyId } from '../core/cartesian-model';\nimport type { ChartEventHandlers } from '../core/chart-scaffold';\nimport { chartArea } from '../core/layout';\nimport { createSvgElement } from '../svg/element';\nimport type { Point } from '../svg/path';\nimport type { ChartDimensions, ChartEvent, ChartMargin, Datum, Series, SeriesValue } from '../types';\nimport { type Announcer, describeValues } from './announcer';\nimport type { CrosshairState } from './crosshair';\nimport { getMousePosition } from './events';\nimport { comparisonContent, type TooltipState } from './tooltip';\n\nexport interface SeriesInteractionOptions {\n announcer: Announcer;\n colors: () => string[];\n crosshair?: CrosshairState | null;\n dims: () => ChartDimensions;\n getData: () => Datum[][];\n getPoints: () => Point[][];\n getSeriesList: () => Series[];\n /** Effective chart margin (including any dual-axis widening): hit bounds and tooltip offsets use this, never the shared dimensions. */\n margin: ChartMargin;\n /** Receives one marker per series at the active key. */\n markers: SVGGElement;\n onClick?: ((event: ChartEvent) => void) | undefined;\n onHover?: ((event: ChartEvent | null) => void) | undefined;\n /** Parent of the per-series groups; the nearest series is emphasised and the rest dim. */\n seriesGroup: SVGGElement;\n svg: SVGSVGElement;\n tooltip?: TooltipState | null;\n}\n\ninterface KeyEntry {\n datum: Datum | undefined;\n point: Point | undefined;\n}\n\nconst keyOrder = (key: Datum['key']): number => (key instanceof Date ? key.getTime() : Number(key));\n\nexport function keyLabel(key: Datum['key']): string {\n return key instanceof Date ? key.toLocaleDateString() : String(key);\n}\n\nfunction findNearestKey(allData: Datum[][], allPoints: Point[][], posX: number): Datum['key'] | null {\n let nearest: Datum['key'] | null = null;\n let minXDistance = Infinity;\n\n for (let seriesIndex = 0; seriesIndex < allPoints.length; seriesIndex++) {\n for (let datumIndex = 0; datumIndex < (allPoints[seriesIndex]?.length ?? 0); datumIndex++) {\n const datum = allData[seriesIndex]?.[datumIndex];\n const point = allPoints[seriesIndex]?.[datumIndex];\n\n if (!datum || !point) continue;\n\n const distance = Math.abs(point.x - posX);\n\n if (distance < minXDistance) {\n minXDistance = distance;\n nearest = datum.key;\n }\n }\n }\n\n return nearest;\n}\n\nexport function createSeriesInteraction(opts: SeriesInteractionOptions): ChartEventHandlers {\n let keyboardIndex = -1;\n let active = false;\n\n const renderedHit = (event: Event): { datum: Datum; point: Point; seriesIndex: number } | null => {\n const target = event.target;\n if (\n !(target instanceof SVGElement) ||\n target.tagName.toLowerCase() !== 'circle' ||\n !opts.seriesGroup.contains(target) ||\n !target.parentElement\n )\n return null;\n let group: Element | null = target.parentElement;\n while (group && group.parentNode !== opts.seriesGroup) group = group.parentElement;\n if (!group) return null;\n const seriesIndex = [...opts.seriesGroup.children].indexOf(group);\n const datumIndex = [...target.parentElement.children].indexOf(target);\n const datum = opts.getData()[seriesIndex]?.[datumIndex];\n const point = opts.getPoints()[seriesIndex]?.[datumIndex];\n return datum && point ? { datum, point, seriesIndex } : null;\n };\n\n const entriesAt = (key: Datum['key']): KeyEntry[] => {\n const id = keyId(key);\n const allPoints = opts.getPoints();\n\n return opts.getData().map((data, seriesIndex) => {\n const datumIndex = data.findIndex((datum) => keyId(datum.key) === id);\n\n return datumIndex === -1\n ? { datum: undefined, point: undefined }\n : { datum: data[datumIndex], point: allPoints[seriesIndex]?.[datumIndex] };\n });\n };\n\n const nearestIndex = (entries: KeyEntry[], posY: number): number => {\n let best = -1;\n let minDistance = Infinity;\n\n entries.forEach(({ point }, index) => {\n if (!point) return;\n\n const distance = Number.isFinite(posY) ? Math.abs(point.y - posY) : 0;\n\n if (distance < minDistance) {\n minDistance = distance;\n best = index;\n }\n });\n\n return best;\n };\n\n const highlight = (entries: KeyEntry[], emphasised: number): void => {\n const colors = opts.colors();\n\n opts.markers.replaceChildren();\n entries.forEach(({ point }, index) => {\n if (!point) return;\n\n opts.markers.appendChild(\n createSvgElement('circle', {\n class: 'prism-active-point',\n cx: point.x,\n cy: point.y,\n fill: colors[index],\n r: 4,\n }),\n );\n });\n\n const groups = [...opts.seriesGroup.children];\n\n opts.seriesGroup.classList.toggle('prism-series-focused', emphasised >= 0 && groups.length > 1);\n for (const [index, group] of groups.entries()) group.classList.toggle('prism-series-active', index === emphasised);\n };\n\n const clear = (): void => {\n opts.crosshair?.hide();\n opts.tooltip?.hide();\n opts.announcer.clear();\n highlight([], -1);\n active = false;\n opts.onHover?.(null);\n };\n\n const eventFor = (\n key: Datum['key'],\n posY: number,\n originalEvent: Event,\n ): { entries: KeyEntry[]; event: ChartEvent; index: number } | null => {\n const entries = entriesAt(key);\n const hit = renderedHit(originalEvent);\n const index = hit?.seriesIndex ?? nearestIndex(entries, posY);\n if (hit) entries[index] = { datum: hit.datum, point: hit.point };\n const seriesList = opts.getSeriesList();\n const datum = entries[index]?.datum;\n\n if (index < 0 || !datum) return null;\n\n const values: SeriesValue[] = entries.map((entry, i) => ({ datum: entry.datum, series: seriesList[i] }));\n\n return { entries, event: { datum, originalEvent, series: seriesList[index], values }, index };\n };\n\n const focus = (key: Datum['key'], pos: Point | null, originalEvent: Event): void => {\n const found = eventFor(key, pos?.y ?? Number.NaN, originalEvent);\n\n if (!found) return;\n\n const { entries, event, index } = found;\n const point = entries[index].point!;\n const dims = opts.dims();\n const area = chartArea(dims.width, dims.height, opts.margin);\n const raw = opts.crosshair?.snap === false && pos;\n const label = keyLabel(key);\n const values = event.values ?? [];\n const colors = opts.colors();\n\n opts.crosshair?.show(raw ? pos.x : point.x, raw ? pos.y : point.y, area.width, area.height);\n highlight(entries, index);\n\n const spoken = describeValues(label, values);\n\n if (opts.tooltip) {\n const rows = values.flatMap(({ datum, series }, i) =>\n datum ? [{ color: colors[i], name: series.name, value: String(datum.value) }] : [],\n );\n\n opts.tooltip.show(\n point.x + opts.margin.left,\n point.y + opts.margin.top,\n event.datum,\n event.series,\n comparisonContent(opts.svg.ownerDocument, label, rows, spoken),\n );\n } else {\n opts.announcer.announce(spoken);\n }\n\n active = true;\n opts.onHover?.(event);\n };\n\n const pointerKey = (event: MouseEvent): { key: Datum['key']; pos: Point } | null => {\n const rendered = renderedHit(event);\n if (rendered) return { key: rendered.datum.key, pos: rendered.point };\n const allPoints = opts.getPoints();\n\n if (allPoints.every((points) => points.length === 0)) return null;\n\n const dims = opts.dims();\n const pos = getMousePosition(opts.svg, event, opts.margin.left, opts.margin.top);\n const area = chartArea(dims.width, dims.height, opts.margin);\n\n if (pos.x < 0 || pos.x > area.width || pos.y < 0 || pos.y > area.height) return null;\n\n const key = findNearestKey(opts.getData(), allPoints, pos.x);\n\n return key === null ? null : { key, pos };\n };\n\n const sortedKeys = (): Datum['key'][] =>\n [\n ...new Map(\n opts\n .getData()\n .flat()\n .map((datum) => [keyId(datum.key), datum.key]),\n ).values(),\n ].sort((a, b) => keyOrder(a) - keyOrder(b));\n\n const onMouseMove = (event: MouseEvent): void => {\n const hit = pointerKey(event);\n\n if (hit) focus(hit.key, hit.pos, event);\n else if (active) clear();\n };\n\n const onClick = (event: MouseEvent): void => {\n if (!opts.onClick) return;\n\n const hit = pointerKey(event);\n const found = hit && eventFor(hit.key, hit.pos.y, event);\n\n if (found) opts.onClick(found.event);\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n const keys = sortedKeys();\n\n if (keys.length === 0) return;\n\n const last = keys.length - 1;\n const target: Record<string, number> = {\n ArrowLeft: keyboardIndex < 0 ? last : Math.max(0, keyboardIndex - 1),\n ArrowRight: keyboardIndex < 0 ? 0 : Math.min(last, keyboardIndex + 1),\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n keyboardIndex = target[event.key];\n focus(keys[keyboardIndex], null, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && keyboardIndex >= 0 && opts.onClick) {\n event.preventDefault();\n\n const found = eventFor(keys[keyboardIndex], Number.NaN, event);\n\n if (found) opts.onClick(found.event);\n } else if (event.key === 'Escape') {\n keyboardIndex = -1;\n clear();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: clear, onMouseMove };\n}\n\n/** Group for the per-series active markers, reused across renders. */\nexport function ensureMarkerGroup(parent: SVGGElement, current: SVGGElement | null): SVGGElement {\n if (current && parent.contains(current)) return current;\n\n const group = createSvgElement('g', {\n 'aria-hidden': 'true',\n class: 'prism-active-points',\n 'pointer-events': 'none',\n });\n\n parent.appendChild(group);\n\n return group;\n}\n","import type { PrismTheme, ThemeScope } from '../types';\n\nconst MAX_THEME_COLORS = 8;\n\n// Every scalar PrismTheme key mapped to the CSS custom property it drives. setTheme/resetTheme\n// iterate this single table, so expanding the theme surface is one row here plus one field on\n// PrismTheme — the two can never drift apart. `colors` is handled separately: it fans out to\n// indexed slots that must all be cleared, not just overwritten.\nconst THEME_TOKENS = {\n axisColor: '--prism-axis-color',\n fontFamily: '--prism-font-family',\n gridColor: '--prism-grid-color',\n gridOpacity: '--prism-grid-opacity',\n textColor: '--prism-text-color',\n textColorSecondary: '--prism-text-color-secondary',\n tooltipBg: '--prism-tooltip-bg',\n tooltipBorder: '--prism-tooltip-border',\n tooltipColor: '--prism-tooltip-color',\n} as const satisfies Record<keyof Omit<PrismTheme, 'colors'>, string>;\n\nfunction target(options?: ThemeScope): HTMLElement {\n return options?.scope ?? document.documentElement;\n}\n\n/**\n * Apply theme tokens as CSS custom properties. Writes to `options.scope` when given, otherwise\n * to `document.documentElement`. A scoped call themes one subtree (charts render inside it, so\n * their `var(--prism-*)` lookups resolve against it) without touching `:root`.\n */\nexport function setTheme(theme: PrismTheme, options?: ThemeScope): void {\n const root = target(options);\n\n if (theme.colors) {\n // Clear (not just overwrite) every color slot a previous setTheme() may have used, so a\n // theme with fewer colors than the last one leaves no stale values on higher-index slots.\n for (let i = 0; i < MAX_THEME_COLORS; i++) {\n const color = theme.colors[i];\n\n if (color) {\n root.style.setProperty(`--prism-color-${i + 1}`, color);\n } else {\n root.style.removeProperty(`--prism-color-${i + 1}`);\n }\n }\n }\n\n for (const [key, property] of Object.entries(THEME_TOKENS)) {\n const value = theme[key as keyof typeof THEME_TOKENS];\n\n if (value !== undefined) root.style.setProperty(property, String(value));\n }\n}\n\n/** Clear every custom property `setTheme()` can set on `options.scope` (default `documentElement`), restoring prism's default theme from `theme.css`. */\nexport function resetTheme(options?: ThemeScope): void {\n const root = target(options);\n\n for (let i = 1; i <= MAX_THEME_COLORS; i++) root.style.removeProperty(`--prism-color-${i}`);\n\n for (const property of Object.values(THEME_TOKENS)) root.style.removeProperty(property);\n}\n\nexport function seriesColor(index: number, override?: string): string {\n return override ?? `var(--prism-color-${(index % MAX_THEME_COLORS) + 1})`;\n}\n","export type EasingFn = (t: number) => number;\n\n/** Overshoot coefficient behind CSS `cubic-bezier(.34, 1.56, .64, 1)`. */\nconst BACK_OVERSHOOT = 1.70158;\n\n/**\n * The named curves a {@link TransitionConfig} can select. The `ease-*` curves are cubic,\n * matching the feel of the CSS easing keywords; `expo-out` decelerates hard for data\n * reveals and `back-out` overshoots slightly for bar entrances.\n */\nexport const easings = {\n 'back-out': (t: number) => 1 + (BACK_OVERSHOOT + 1) * (t - 1) ** 3 + BACK_OVERSHOOT * (t - 1) ** 2,\n 'ease-in': (t: number) => t * t * t,\n 'ease-in-out': (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2),\n 'ease-out': (t: number) => 1 - (1 - t) ** 3,\n 'expo-out': (t: number) => (t >= 1 ? 1 : 1 - 2 ** (-10 * t)),\n linear: (t: number) => t,\n} satisfies Record<string, EasingFn>;\n\n/** The literal names {@link resolveEasing} accepts, derived from {@link easings}. */\nexport type EasingName = keyof typeof easings;\n\nexport function resolveEasing(easing: string | ((t: number) => number) | undefined): EasingFn {\n if (typeof easing === 'function') return easing;\n\n // `Object.hasOwn` guards against `easing` being a prototype-chain key (e.g. `'__proto__'`,\n // `'constructor'`): a plain bracket lookup on those would silently resolve to an\n // `Object.prototype` value instead of `undefined`, which is either not callable (throws)\n // or callable but not an easing function (produces garbage interpolation).\n if (easing !== undefined && Object.hasOwn(easings, easing)) {\n return (easings as Record<string, EasingFn>)[easing];\n }\n\n return easings['ease-out'];\n}\n","import type { TransitionConfig, TransitionOption } from '../types';\n\n/** Duration (ms) every chart uses when motion is enabled without an explicit `duration`. */\nexport const DEFAULT_DURATION = 300;\n\n/**\n * Resolves a user-facing `transition` option into concrete motion values.\n *\n * - `false` disables motion entirely: renderers apply their final state synchronously.\n * - `true` (or omitted) enables motion with the chart's `defaultDuration`/`defaultStagger`.\n * - `preference: 'system'` (the default) disables motion when the user prefers reduced motion.\n */\nexport function resolveMotion(\n config?: TransitionOption,\n defaults?: { defaultDuration?: number; defaultStagger?: number },\n): TransitionConfig & { duration: number; stagger: number } {\n if (config === false) return { duration: 0, stagger: 0 };\n\n const options = config === true ? undefined : config;\n const preference = options?.preference ?? 'system';\n const reduced = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration =\n preference === 'never' || (preference === 'system' && reduced)\n ? 0\n : (options?.duration ?? defaults?.defaultDuration ?? DEFAULT_DURATION);\n\n return { ...options, duration, stagger: Math.max(0, options?.stagger ?? defaults?.defaultStagger ?? 0) };\n}\n","export function tweenNumber(from: number, to: number, t: number): number {\n return from + (to - from) * t;\n}\n","import type { TransitionConfig } from '../types';\nimport type { EasingFn } from './easing';\nimport { resolveEasing } from './easing';\nimport { resolveMotion } from './motion';\nimport { tweenNumber } from './tween';\n\nexport interface AnimationTarget {\n attrs: Record<string, { from: number; to: number }>;\n el: SVGElement;\n}\n\nexport interface TweenOptions {\n /** Number of staggered lanes; the loop runs until the last lane finishes. */\n count: number;\n /** Milliseconds per lane. A non-positive value completes synchronously. */\n duration: number;\n easing: EasingFn;\n onComplete?: () => void;\n /**\n * Runs once per frame (and once synchronously for a zero-length tween). Receives a\n * `progress(lane)` resolver returning that lane's eased 0-1 value, so callers\n * interpolate their own values without re-deriving elapsed time.\n */\n onFrame: (progress: (lane: number) => number) => void;\n /** Aborted when the owning chart is disposed: cancels the in-flight frame. */\n signal?: AbortSignal;\n /** Per-lane delay in milliseconds; each lane starts `stagger` ms after the previous. */\n stagger?: number;\n}\n\n/**\n * The package's single `requestAnimationFrame` tween loop. Every animated surface\n * (bar, line, area, pie, radar, sparkline) drives its transition through here, so\n * disposal-correctness is enforced in exactly one place: an aborted `signal` cancels\n * the in-flight frame and stops rescheduling.\n *\n * Elapsed time comes from the timestamp the browser passes to the frame callback,\n * never a captured `performance.now()`. Returns a `cancel()` function for superseding\n * a tween before it ends.\n */\nexport function startTween(options: TweenOptions): () => void {\n const { count, duration, easing, stagger = 0, signal, onFrame, onComplete } = options;\n\n if (signal?.aborted) return () => {};\n\n // A zero-length (or reduced-motion) tween applies its final frame synchronously: no rAF.\n if (duration <= 0) {\n onFrame(() => 1);\n onComplete?.();\n\n return () => {};\n }\n\n if (count === 0) {\n onComplete?.();\n\n return () => {};\n }\n\n const totalDuration = duration + stagger * (count - 1);\n let startTime: number | null = null;\n let rafId: number | null = null;\n let cancelled = false;\n\n const cancel = (): void => {\n cancelled = true;\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n signal?.removeEventListener('abort', cancel);\n };\n\n const frame = (timestamp: number): void => {\n if (cancelled || signal?.aborted) return;\n\n if (startTime === null) startTime = timestamp;\n\n const elapsed = timestamp - startTime;\n\n onFrame((lane) => easing(Math.max(0, Math.min(1, (elapsed - lane * stagger) / duration))));\n\n if (elapsed < totalDuration) {\n rafId = requestAnimationFrame(frame);\n } else {\n rafId = null;\n signal?.removeEventListener('abort', cancel);\n onComplete?.();\n }\n };\n\n signal?.addEventListener('abort', cancel, { once: true });\n rafId = requestAnimationFrame(frame);\n\n return cancel;\n}\n\n/**\n * Runs a batch of numeric-attribute tweens through {@link startTween}, sharing one\n * `requestAnimationFrame` loop. Returns the loop's `cancel()` function.\n */\nexport function animate(\n targets: AnimationTarget[],\n config?: TransitionConfig,\n onComplete?: () => void,\n signal?: AbortSignal,\n): () => void {\n const motion = resolveMotion(config);\n\n return startTween({\n count: targets.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete,\n onFrame: (progress) => {\n for (const [lane, target] of targets.entries()) {\n const eased = progress(lane);\n\n for (const [attr, { from, to }] of Object.entries(target.attrs)) {\n target.el.setAttribute(attr, String(tweenNumber(from, to, eased)));\n }\n }\n },\n signal,\n stagger: motion.stagger,\n });\n}\n","import type { Datum } from '../types';\n\nexport type DatumMark = Pick<Datum, 'dash' | 'opacity'>;\n\n/** True when any datum carries a presentation field, forcing the styled-runs path. */\nexport function hasStyledRuns(marks: readonly DatumMark[] | undefined): boolean {\n return marks?.some((mark) => mark && (mark.dash !== undefined || mark.opacity !== undefined)) ?? false;\n}\n\nexport interface StyleRun {\n dash?: string;\n end: number;\n opacity?: number;\n /** Index of the run's first point. */\n start: number;\n}\n\n/**\n * Groups consecutive segments that share one datum style into runs. Datum `i`\n * styles the segment from point `i` to point `i+1` (Chart.js-style segment\n * semantics), so the last datum's style has no segment to paint and is ignored.\n */\nexport function computeStyleRuns(marks: readonly DatumMark[], pointCount: number): StyleRun[] {\n const segmentCount = Math.max(0, pointCount - 1);\n\n if (segmentCount === 0) return [];\n\n const runs: StyleRun[] = [];\n\n for (let i = 0; i < segmentCount; i++) {\n const mark = marks[i] ?? {};\n const prev = runs[runs.length - 1];\n\n if (prev && prev.dash === mark.dash && prev.opacity === mark.opacity) {\n prev.end = i + 1;\n\n continue;\n }\n\n runs.push({ dash: mark.dash, end: i + 1, opacity: mark.opacity, start: i });\n }\n\n return runs;\n}\n","let next = 0;\n\n/** Document-unique id for SVG references such as gradients. */\nexport function uniqueId(prefix: string): string {\n next += 1;\n\n return `${prefix}-${next}`;\n}\n","export interface Point {\n x: number;\n y: number;\n}\n\nexport function linePath(points: Point[]): string {\n if (points.length === 0) return '';\n\n let d = `M${points[0].x},${points[0].y}`;\n\n for (let i = 1; i < points.length; i++) {\n d += `L${points[i].x},${points[i].y}`;\n }\n\n return d;\n}\n\nexport function monotonePath(points: Point[]): string {\n if (points.length < 3) return linePath(points);\n\n const n = points.length;\n const tangents: Point[] = [];\n\n for (let i = 0; i < n; i++) {\n if (i === 0) {\n tangents.push({ x: points[1].x - points[0].x, y: points[1].y - points[0].y });\n } else if (i === n - 1) {\n tangents.push({ x: points[n - 1].x - points[n - 2].x, y: points[n - 1].y - points[n - 2].y });\n } else {\n tangents.push({ x: (points[i + 1].x - points[i - 1].x) / 2, y: (points[i + 1].y - points[i - 1].y) / 2 });\n }\n }\n\n let d = `M${points[0].x},${points[0].y}`;\n\n for (let i = 0; i < n - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const t0 = tangents[i];\n const t1 = tangents[i + 1];\n const dx = (p1.x - p0.x) / 3;\n\n d += `C${p0.x + dx},${p0.y + t0.y / 3},${p1.x - dx},${p1.y - t1.y / 3},${p1.x},${p1.y}`;\n }\n\n return d;\n}\n\nexport function stepPath(points: Point[]): string {\n if (points.length === 0) return '';\n\n let d = `M${points[0].x},${points[0].y}`;\n\n for (let i = 1; i < points.length; i++) {\n const midX = (points[i - 1].x + points[i].x) / 2;\n\n d += `H${midX}V${points[i].y}H${points[i].x}`;\n }\n\n return d;\n}\n\nexport function areaPath(\n topPoints: Point[],\n bottomPoints: Point[],\n curve: 'linear' | 'monotone' | 'step' = 'linear',\n): string {\n if (topPoints.length === 0) return '';\n\n const topPath =\n curve === 'monotone' ? monotonePath(topPoints) : curve === 'step' ? stepPath(topPoints) : linePath(topPoints);\n let d = topPath;\n const reversed = [...bottomPoints].reverse();\n\n if (reversed.length > 0) {\n d += `L${reversed[0].x},${reversed[0].y}`;\n for (let i = 1; i < reversed.length; i++) {\n d += `L${reversed[i].x},${reversed[i].y}`;\n }\n }\n\n d += 'Z';\n\n return d;\n}\n","import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport { computeStyleRuns, type DatumMark, hasStyledRuns, type StyleRun } from '../../core/datum-style';\nimport { uniqueId } from '../../core/ids';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionOption } from '../../types';\n\nexport interface AreaRenderOptions {\n color: string;\n curve: 'linear' | 'monotone' | 'step';\n /** Aborted when the owning chart is disposed: stops the transition's `requestAnimationFrame` loop from rescheduling. */\n disposalSignal?: AbortSignal;\n fill: 'gradient' | 'solid';\n /** Explicit opacity beats the `--prism-area-opacity` theme token. */\n fillOpacity?: number;\n /** Per-datum presentation parallel to `points`; styled runs split the top line into subpaths. */\n marks?: readonly DatumMark[];\n showLine: boolean;\n transition?: TransitionOption;\n}\n\nconst activeAreaAnimations = new WeakMap<SVGGElement, () => void>();\nconst drawnPoints = new WeakMap<SVGGElement, Point[]>();\n\nfunction buildLinePath(pts: Point[], curve: AreaRenderOptions['curve']): string {\n return curve === 'monotone' ? monotonePath(pts) : curve === 'step' ? stepPath(pts) : linePath(pts);\n}\n\n/** A vertical gradient fading to transparent at the baseline, or a flat fill. */\nfunction applyAreaFill(parent: SVGGElement, fill: SVGPathElement, options: AreaRenderOptions): void {\n let gradient = parent.querySelector<SVGLinearGradientElement>('linearGradient');\n\n if (options.fill === 'gradient') {\n if (!gradient) {\n const defs = createSvgElement('defs');\n\n gradient = createSvgElement('linearGradient', { id: uniqueId('prism-area-fill'), x1: 0, x2: 0, y1: 0, y2: 1 });\n gradient.append(\n createSvgElement('stop', { class: 'prism-area-stop-top', offset: 0 }),\n createSvgElement('stop', { class: 'prism-area-stop-bottom', offset: 1 }),\n );\n defs.appendChild(gradient);\n parent.insertBefore(defs, parent.firstChild);\n }\n\n for (const stop of gradient.querySelectorAll('stop')) {\n stop.setAttribute('stop-color', options.color);\n stop.style.stopColor = options.color;\n }\n\n setAttributes(fill, { fill: `url(#${gradient.id})` });\n } else {\n gradient?.parentElement?.remove();\n setAttributes(fill, { fill: options.color });\n }\n\n setAttributes(fill, { class: `prism-area-fill prism-area-fill--${options.fill}`, stroke: 'none' });\n fill.style.fillOpacity = options.fillOpacity === undefined ? '' : String(options.fillOpacity);\n}\n\nexport function renderArea(parent: SVGGElement, points: Point[], baselineY: number, options: AreaRenderOptions): void {\n const motion = resolveMotion(options.transition);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n let fill = parent.querySelector<SVGPathElement>('.prism-area-fill');\n\n if (!fill) {\n fill = createSvgElement('path', { class: 'prism-area-fill' });\n parent.appendChild(fill);\n }\n\n applyAreaFill(parent, fill, options);\n\n let line: SVGPathElement | null = null;\n let runs: readonly StyleRun[] = [];\n let lines: SVGPathElement[] = [];\n const styled = hasStyledRuns(options.marks);\n const marks = options.marks ?? [];\n\n if (options.showLine) {\n if (styled) {\n runs = computeStyleRuns(marks, points.length);\n\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-area-line')];\n\n for (const extra of existing.slice(runs.length)) extra.remove();\n\n lines = runs.map((_, r) => {\n const reuse = existing[r];\n\n if (reuse) return reuse;\n\n const created = createSvgElement('path', { class: 'prism-area-line', fill: 'none' });\n\n parent.appendChild(created);\n\n return created;\n });\n\n for (const [r, run] of runs.entries()) {\n setAttributes(lines[r], {\n opacity: run.opacity,\n stroke: options.color,\n 'stroke-dasharray': run.dash,\n 'stroke-width': 2,\n });\n }\n\n line = null;\n } else {\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-area-line')];\n\n for (const stale of existing.slice(1)) stale.remove();\n\n line = existing[0] ?? null;\n\n if (!line) {\n line = createSvgElement('path', { class: 'prism-area-line', fill: 'none' });\n parent.appendChild(line);\n }\n\n setAttributes(line, {\n opacity: undefined,\n stroke: options.color,\n 'stroke-dasharray': undefined,\n 'stroke-width': 2,\n });\n }\n } else {\n for (const stale of parent.querySelectorAll('.prism-area-line')) stale.remove();\n }\n\n const drawLine = (pts: Point[]): void => {\n if (!options.showLine) return;\n\n if (styled) {\n for (const [r, run] of runs.entries()) {\n setAttributes(lines[r], { d: buildLinePath(pts.slice(run.start, run.end + 1), options.curve) });\n }\n } else if (line) {\n setAttributes(line, { d: buildLinePath(pts, options.curve) });\n }\n };\n\n if (dur === 0) {\n const bottomPoints = points.map((p) => ({ x: p.x, y: baselineY }));\n\n setAttributes(fill, { d: areaPath(points, bottomPoints, options.curve) });\n\n drawLine(points);\n drawnPoints.set(parent, points);\n\n return;\n }\n\n activeAreaAnimations.get(parent)?.();\n\n const hasExisting = drawnPoints.has(parent);\n // A first render has no drawn shape to interpolate from: the mount animation\n // grows the area out of its baseline instead.\n const rawFrom: Point[] = hasExisting\n ? (drawnPoints.get(parent) ?? points)\n : points.map((p) => ({ x: p.x, y: baselineY }));\n const fromPoints: Point[] = points.map((_, i) => rawFrom[i] ?? rawFrom[rawFrom.length - 1] ?? points[i]);\n\n const paintFrame = (e: number): void => {\n const interpolated: Point[] = points.map((to, i) => ({\n x: tweenNumber(fromPoints[i].x, to.x, e),\n y: tweenNumber(fromPoints[i].y, to.y, e),\n }));\n const interpolatedBottom = interpolated.map((p) => ({ x: p.x, y: baselineY }));\n\n drawnPoints.set(parent, interpolated);\n setAttributes(fill!, { d: areaPath(interpolated, interpolatedBottom, options.curve) });\n drawLine(interpolated);\n };\n\n // The starting geometry goes on screen immediately: `startTween` only paints on\n // the first frame callback, which would otherwise leave one blank frame.\n paintFrame(0);\n\n activeAreaAnimations.set(\n parent,\n startTween({\n count: 1,\n duration: dur,\n easing,\n onComplete: () => {\n activeAreaAnimations.delete(parent);\n drawnPoints.set(parent, points);\n },\n onFrame: (progress) => paintFrame(progress(0)),\n signal: options.disposalSignal,\n }),\n );\n}\n\nexport function computeAreaPoints(\n data: ContinuousDatum[],\n xScale: Scale<Date | number>,\n yScale: Scale<number>,\n): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computeAreaPoints: datum.key is null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n } else if (data.some((d) => typeof d.key === 'string')) {\n warn('computeAreaPoints: string keys are not supported for line/area charts: use numeric or Date keys.');\n }\n\n return data.map((d) => ({\n x: xScale.map(d.key as Date | number),\n y: yScale.map(d.value),\n }));\n}\n","import { positionAxis, renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { AreaChartConfig, AreaSeriesConfig, ChartHandle, XAxisConfig, YAxisConfig } from '../../types';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle<AreaSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n const yScale = buildYScale(allY, area.height);\n const baselineY = yScale.map(0);\n\n // Axes render by default (value axis with gridlines); `false` opts out.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : (config.yAxis ?? { grid: true });\n\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTickCount(yAxisConfig, area.height, 'left'),\n );\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTickCount(xAxisConfig, area.width, 'bottom'),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, yScale, yAxisConfig, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-area-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const points = computeAreaPoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderArea(group, points, baselineY, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n fill: series.fill ?? 'gradient',\n fillOpacity: series.fillOpacity,\n marks: series.data,\n showLine: series.showLine !== false,\n transition: config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createSeriesInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin: ctx.dimensions.margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n","import { warn } from '../_dev';\nimport type { BandScale } from '../types';\nimport type { BandScaleConfig } from './types';\n\nexport function bandScale(config: BandScaleConfig): BandScale {\n // Every method below closes over `config`/these helpers directly instead of reading\n // `this`: the returned object stays fully functional when destructured, e.g.\n // `const { map } = bandScale(cfg)`.\n const getDomain = (): string[] => config.domain;\n const getRange = (): [number, number] => config.range;\n\n const getBandwidth = (): number => {\n const n = getDomain().length;\n\n if (n === 0) return 0;\n\n const [r0, r1] = getRange();\n const padding = config.padding ?? 0.1;\n const totalWidth = r1 - r0;\n\n return totalWidth / (n + (n - 1) * padding + (config.paddingOuter ?? padding) * 2);\n };\n\n return {\n bandwidth: getBandwidth,\n\n get domain(): string[] {\n return getDomain();\n },\n\n gap(): number {\n const padding = config.padding ?? 0.1;\n\n return getBandwidth() * padding;\n },\n\n map(value: string): number {\n const domain = getDomain();\n const idx = domain.indexOf(value);\n\n if (idx === -1) {\n warn(`bandScale.map: unknown category \"${value}\"`);\n\n return 0;\n }\n\n const [r0] = getRange();\n const bw = getBandwidth();\n const padding = config.padding ?? 0.1;\n const outer = config.paddingOuter ?? padding;\n\n return r0 + outer * bw + idx * (bw + bw * padding);\n },\n\n get range(): [number, number] {\n return getRange();\n },\n\n ticks(count?: number): string[] {\n const domain = getDomain();\n\n if (count === undefined || count >= domain.length) return [...domain];\n\n if (count <= 0) return [];\n\n const step = Math.ceil(domain.length / count);\n\n return domain.filter((_, i) => i % step === 0);\n },\n };\n}\n","import type { BarScaleContext } from './bar-scale-context';\n\nexport function findCatIdx(pos: number, categories: string[], sc: BarScaleContext): number {\n for (let i = 0; i < categories.length; i++) {\n const center = sc.bandCenter(categories[i]);\n const start = center - sc.bandwidth / 2;\n\n if (pos >= start && pos < start + sc.bandwidth) return i;\n }\n\n return -1;\n}\n\nexport function findSeriesIdx(\n pos: { x: number; y: number },\n catIdx: number,\n categories: string[],\n sc: BarScaleContext,\n seriesCount: number,\n): number {\n if (sc.stacked) {\n if (sc.horizontal) {\n for (let si = 0; si < seriesCount; si++) {\n const rightX = sc.valueScale.map(sc.stackedTops[si]?.[catIdx] ?? 0);\n\n if (rightX >= pos.x) return si;\n }\n\n return seriesCount - 1;\n } else {\n for (let si = 0; si < seriesCount; si++) {\n const topY = sc.valueScale.map(sc.stackedTops[si]?.[catIdx] ?? 0);\n\n if (topY <= pos.y) return si;\n }\n\n return seriesCount - 1;\n }\n } else {\n const subSize = sc.bandwidth / seriesCount;\n const bandStart = sc.bandCenter(categories[catIdx]) - sc.bandwidth / 2;\n const offset = sc.horizontal ? pos.y - bandStart : pos.x - bandStart;\n const subIdx = Math.floor(offset / subSize);\n\n return Math.max(0, Math.min(seriesCount - 1, subIdx));\n }\n}\n","import { uniqueId } from '../core/ids';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { TransitionConfig } from '../types';\nimport { resolveEasing } from './easing';\nimport { startTween } from './transition';\n\nconst activeReveals = new WeakMap<Element, () => void>();\n\nexport function cancelReveal(parent: Element): void {\n activeReveals.get(parent)?.();\n}\n\n/** Traces final line geometry without replacing its dash or per-datum styling. */\nexport function playTraceReveal(\n parent: SVGGElement,\n bounds: { height: number; width: number },\n paths: readonly { d: string; end: number; start: number }[],\n strokeWidth: number,\n motion: TransitionConfig & { duration: number },\n signal?: AbortSignal,\n): () => void {\n cancelReveal(parent);\n if (motion.duration <= 0 || signal?.aborted) return () => {};\n\n const maskId = uniqueId('prism-trace');\n const host = createSvgElement('defs');\n const padding = strokeWidth / 2;\n const mask = createSvgElement('mask', {\n height: bounds.height + strokeWidth,\n id: maskId,\n maskContentUnits: 'userSpaceOnUse',\n maskUnits: 'userSpaceOnUse',\n width: bounds.width + strokeWidth,\n x: -padding,\n y: -padding,\n });\n const traces = paths.map(({ d }) => {\n const trace = createSvgElement('path', {\n d,\n fill: 'none',\n pathLength: 1,\n stroke: 'white',\n 'stroke-dasharray': '1 1',\n 'stroke-dashoffset': 1,\n 'stroke-width': strokeWidth,\n });\n mask.appendChild(trace);\n return trace;\n });\n host.appendChild(mask);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('mask', `url(#${maskId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('mask');\n host.remove();\n signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: 1,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n const e = progress(0);\n for (const [i, trace] of traces.entries()) {\n const { start, end } = paths[i];\n const revealed = Math.max(0, Math.min(1, (e - start) / (end - start)));\n trace.setAttribute('stroke-dashoffset', String(1 - revealed));\n }\n },\n signal,\n });\n return finish;\n}\n\nexport interface GrowRevealLane {\n anchor: number;\n height: number;\n width: number;\n x: number;\n y: number;\n}\n\n/** Reveals finished bars from their own baseline without distorting rounded corners. */\nexport function playGrowReveal(\n parent: SVGGElement,\n lanes: readonly GrowRevealLane[],\n paintFinal: () => void,\n motion: TransitionConfig & { duration: number },\n options: { axis: 'x' | 'y'; signal?: AbortSignal; stagger?: number },\n): () => void {\n cancelReveal(parent);\n paintFinal();\n if (motion.duration <= 0 || lanes.length === 0 || options.signal?.aborted) return () => {};\n\n const clipId = uniqueId('prism-reveal');\n const host = createSvgElement('defs');\n const clipPath = createSvgElement('clipPath', { id: clipId });\n const rects = lanes.map((lane) => {\n const rect = createSvgElement('rect', { height: 0, width: 0, x: lane.x, y: lane.y });\n clipPath.appendChild(rect);\n return rect;\n });\n host.appendChild(clipPath);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('clip-path', `url(#${clipId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('clip-path');\n host.remove();\n options.signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n options.signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: lanes.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n for (const [i, rect] of rects.entries()) {\n const lane = lanes[i];\n const e = Math.max(0, Math.min(1, progress(i)));\n if (options.axis === 'y') {\n const top = lane.anchor + (lane.y - lane.anchor) * e;\n const bottom = lane.anchor + (lane.y + lane.height - lane.anchor) * e;\n setAttributes(rect, { height: Math.max(0, bottom - top), width: lane.width, y: top });\n } else {\n const left = lane.anchor + (lane.x - lane.anchor) * e;\n const right = lane.anchor + (lane.x + lane.width - lane.anchor) * e;\n setAttributes(rect, { height: lane.height, width: Math.max(0, right - left), x: left });\n }\n }\n },\n signal: options.signal,\n stagger: options.stagger,\n });\n return finish;\n}\n","import { resolveMotion } from '../../animation/motion';\nimport { type GrowRevealLane, playGrowReveal } from '../../animation/reveal';\nimport type { AnimationTarget } from '../../animation/transition';\nimport { animate } from '../../animation/transition';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { BandScale, Scale, TransitionOption } from '../../types';\n\nexport interface BarRenderOptions {\n baselineYs?: number[];\n borderRadius: number;\n color: string;\n /** Aborted when the owning chart is disposed: stops in-flight transitions from rescheduling. */\n disposalSignal?: AbortSignal;\n horizontal?: boolean;\n seriesCount: number;\n seriesIndex: number;\n stacked?: boolean;\n transition?: TransitionOption;\n}\n\n/** Preserve the stagger for bars inserted by a data update, not the initial entrance. */\nconst DEFAULT_NEW_BAR_STAGGER = 20;\n/** Upper bound on the total staggered delay a bar chart may add, whatever the per-bar value. */\nconst MAX_STAGGER_TOTAL = 400;\n\nconst activeBarAnimations = new WeakMap<SVGGElement, () => void>();\n\n/**\n * The group's bars in data order. Queried by class rather than by `children` index\n * because a mount reveal injects a `<defs>` into the same group.\n */\nfunction barsOf(parent: SVGGElement): SVGRectElement[] {\n return [...parent.children].filter((child): child is SVGRectElement => child.classList.contains('prism-bar'));\n}\n\nexport function renderBars(\n parent: SVGGElement,\n data: { base: number; dash?: string; key: string; opacity?: number; present: boolean; y: number }[],\n xScale: BandScale,\n yScale: Scale<number>,\n baselineY: number,\n options: BarRenderOptions,\n): void {\n activeBarAnimations.get(parent)?.();\n activeBarAnimations.delete(parent);\n const existingBars = barsOf(parent);\n\n for (const extra of existingBars.slice(data.length)) extra.remove();\n\n const bandwidth = xScale.bandwidth();\n const barBand = options.stacked ? bandwidth : bandwidth / options.seriesCount;\n const bandSize = Math.max(0, barBand - 1);\n const offset = options.stacked ? 0 : barBand * options.seriesIndex;\n const horizontal = options.horizontal ?? false;\n // A group with no bars yet is mounting: every bar enters together through a grow\n // reveal. A group that already has bars updates in place (with per-bar attr tweens).\n const isMount = existingBars.length === 0;\n\n const enterTargets: AnimationTarget[] = [];\n const updateTargets: AnimationTarget[] = [];\n const lanes: GrowRevealLane[] = [];\n const motion = resolveMotion(options.transition, { defaultStagger: isMount ? 0 : DEFAULT_NEW_BAR_STAGGER });\n const animateBars = motion.duration > 0;\n // A long category axis must not stretch the entrance past ~400 ms of added delay.\n const enterStagger = Math.min(motion.stagger, MAX_STAGGER_TOTAL / Math.max(1, data.length));\n\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n const bandPos = xScale.map(d.key) + offset;\n const barBaselineY = options.baselineYs ? options.baselineYs[i] : baselineY;\n const valuePx = yScale.map(d.y);\n\n let rect = existingBars[i];\n\n const isNew = !rect;\n\n if (!rect) {\n rect = createSvgElement('rect', { class: 'prism-bar' });\n parent.appendChild(rect);\n }\n\n rect.style.display = d.present ? '' : 'none';\n\n // Presentation attributes (not inline styles) so CSS interaction states\n // like the focus-dim rule keep winning over per-datum styling.\n setAttributes(rect, {\n opacity: d.opacity,\n stroke: d.dash ? options.color : undefined,\n 'stroke-dasharray': d.dash,\n 'stroke-width': d.dash ? 1 : undefined,\n });\n\n if (horizontal) {\n // Horizontal: category on Y axis, value on X axis\n // baselineY here is actually the baseline X (yScale.map(0) in value-space mapped to screen X)\n const finalWidth = Math.max(0, Math.abs(barBaselineY - valuePx));\n const finalX = Math.min(valuePx, barBaselineY);\n\n setAttributes(rect, {\n fill: options.color,\n height: bandSize,\n rx: options.borderRadius,\n ry: options.borderRadius,\n y: bandPos,\n });\n\n if (isMount) {\n // Final geometry now; the grow reveal below uncovers it lane by lane.\n setAttributes(rect, { width: finalWidth, x: finalX });\n\n if (animateBars) {\n lanes.push({ anchor: barBaselineY, height: bandSize, width: finalWidth, x: finalX, y: bandPos });\n }\n } else if (animateBars) {\n if (isNew) {\n setAttributes(rect, { width: 0, x: barBaselineY });\n enterTargets.push({\n attrs: { width: { from: 0, to: finalWidth }, x: { from: barBaselineY, to: finalX } },\n el: rect,\n });\n } else {\n updateTargets.push({\n attrs: {\n width: { from: Number(rect.getAttribute('width') ?? finalWidth), to: finalWidth },\n x: { from: Number(rect.getAttribute('x') ?? finalX), to: finalX },\n },\n el: rect,\n });\n }\n } else {\n setAttributes(rect, { width: finalWidth, x: finalX });\n }\n } else {\n // Vertical (default)\n const finalHeight = Math.max(0, Math.abs(barBaselineY - valuePx));\n const finalY = Math.min(valuePx, barBaselineY);\n\n setAttributes(rect, {\n fill: options.color,\n rx: options.borderRadius,\n ry: options.borderRadius,\n width: bandSize,\n x: bandPos,\n });\n\n if (isMount) {\n // Final geometry now; the grow reveal below uncovers it lane by lane, so a\n // rounded bar never renders as a corner-clamped 1-3 px sliver mid-grow.\n setAttributes(rect, { height: finalHeight, y: finalY });\n\n if (animateBars) {\n lanes.push({ anchor: barBaselineY, height: finalHeight, width: bandSize, x: bandPos, y: finalY });\n }\n } else if (animateBars) {\n if (isNew) {\n setAttributes(rect, { height: 0, y: barBaselineY });\n enterTargets.push({\n attrs: { height: { from: 0, to: finalHeight }, y: { from: barBaselineY, to: finalY } },\n el: rect,\n });\n } else {\n updateTargets.push({\n attrs: {\n height: { from: Number(rect.getAttribute('height') ?? finalHeight), to: finalHeight },\n y: { from: Number(rect.getAttribute('y') ?? finalY), to: finalY },\n },\n el: rect,\n });\n }\n } else {\n setAttributes(rect, { height: finalHeight, y: finalY });\n }\n }\n }\n\n if (animateBars) {\n const cancels: (() => void)[] = [];\n\n if (isMount && lanes.length > 0) {\n cancels.push(\n playGrowReveal(parent, lanes, () => {}, motion, {\n axis: horizontal ? 'x' : 'y',\n signal: options.disposalSignal,\n stagger: enterStagger,\n }),\n );\n }\n\n if (enterTargets.length > 0) {\n cancels.push(animate(enterTargets, { ...motion, stagger: enterStagger }, undefined, options.disposalSignal));\n }\n\n if (updateTargets.length > 0) {\n cancels.push(animate(updateTargets, { ...motion, stagger: 0 }, undefined, options.disposalSignal));\n }\n\n activeBarAnimations.set(parent, () => {\n for (const cancel of cancels) cancel();\n });\n }\n}\n","import { warn } from '../../_dev';\nimport { positionAxis, renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { normalizeCartesianSeries } from '../../core/cartesian-model';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { describeValues } from '../../interaction/announcer';\nimport { getMousePosition } from '../../interaction/events';\nimport { comparisonContent } from '../../interaction/tooltip';\nimport { bandScale } from '../../scales/band';\nimport { linearScale } from '../../scales/linear';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport type {\n BarChartConfig,\n BarSeriesConfig,\n BarVariant,\n ChartEvent,\n ChartHandle,\n SeriesValue,\n XAxisConfig,\n YAxisConfig,\n} from '../../types';\nimport { findCatIdx, findSeriesIdx } from './bar-hit-test';\nimport { renderBars } from './bar-renderer';\nimport type { BarScaleContext } from './bar-scale-context';\n\nfunction variantFlags(variant: BarVariant): { horizontal: boolean; stacked: boolean } {\n return {\n horizontal: variant === 'grouped-horizontal' || variant === 'stacked-horizontal',\n stacked: variant === 'stacked' || variant === 'stacked-horizontal',\n };\n}\n\n// ─── Chart ────────────────────────────────────────────────────────────────────\n\nexport function createBarChart(container: HTMLElement, config: BarChartConfig): ChartHandle<BarSeriesConfig[]> {\n let seriesList = config.series;\n let band: SVGRectElement | null = null;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const sourceData = seriesList.map((series) => series.data);\n const model = normalizeCartesianSeries(seriesList, sourceData);\n const categories = model.domain;\n const allData = model.series.map(({ byKey }) => categories.map((key) => byKey.get(key)));\n const categoryAxis = (axis: XAxisConfig | YAxisConfig) => {\n return {\n ...axis,\n tickFormat: (value: Date | number | string) => {\n const key = String(value);\n const label = model.labels.get(key) ?? value;\n\n return axis.tickFormat ? axis.tickFormat(label) : String(label);\n },\n };\n };\n\n if (categories.length === 0) {\n clearCartesianDom(groups, legend, tooltip);\n band?.remove();\n band = null;\n\n return;\n }\n\n const { horizontal, stacked } = variantFlags(config.variant ?? 'grouped');\n\n // Axes render by default; `false` opts out. The value axis carries gridlines by\n // default, the category axis does not; an explicit config is used verbatim.\n const xAxisConfig: XAxisConfig | false =\n config.xAxis === false ? false : (config.xAxis ?? (horizontal ? { grid: true } : {}));\n const yAxisConfig: YAxisConfig | false =\n config.yAxis === false ? false : (config.yAxis ?? (horizontal ? {} : { grid: true }));\n\n // Value domain\n let vMax: number;\n let vMin: number;\n\n if (stacked) {\n if (allData.some((seriesData) => seriesData.some((datum) => (datum?.value ?? 0) < 0))) {\n warn(\n 'createBarChart: negative values in a stacked/stacked-horizontal series are clamped to 0: stacking mixed-sign data is not supported.',\n );\n }\n\n const sums = categories.map((_, categoryIndex) =>\n allData.reduce((sum, seriesData) => sum + Math.max(0, seriesData[categoryIndex]?.value ?? 0), 0),\n );\n\n vMax = Math.max(...sums);\n vMin = 0;\n } else {\n const allY = allData.flatMap((seriesData) => seriesData.flatMap((datum) => (datum ? [datum.value] : [])));\n\n vMax = Math.max(...allY);\n vMin = Math.min(0, ...allY);\n }\n\n // Build uniform scale context\n const catScale = horizontal\n ? bandScale({ domain: categories, range: [0, area.height] })\n : bandScale({ domain: categories, range: [0, area.width] });\n\n const valScale = horizontal\n ? linearScale({ domain: [vMin, vMax], range: [0, area.width] })\n : linearScale({ domain: [vMin, vMax], range: [area.height, 0] });\n\n const stackedTops: number[][] = [];\n const stackTops = Object.create(null) as Record<string, number>;\n\n for (const cat of categories) stackTops[cat] = 0;\n\n const sc: BarScaleContext = {\n bandCenter: (cat) => catScale.map(cat) + catScale.bandwidth() / 2,\n bandwidth: catScale.bandwidth(),\n baselinePx: valScale.map(0),\n horizontal,\n stacked,\n stackedTops,\n valueScale: valScale,\n };\n\n // Axes & grid\n if (horizontal) {\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n valScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTickCount(xAxisConfig, area.width, 'bottom'),\n );\n }\n\n if (yAxisConfig !== false) {\n const yAxis = categoryAxis(yAxisConfig);\n\n positionAxis(groups.yAxis, yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, catScale, yAxis, area.height, 'left');\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, valScale, xAxisConfig, area.width, 'bottom');\n }\n } else {\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n valScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTickCount(yAxisConfig, area.height, 'left'),\n );\n }\n\n if (xAxisConfig !== false) {\n const xAxis = categoryAxis(xAxisConfig);\n\n positionAxis(groups.xAxis, xAxis.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, catScale, xAxis, area.width, 'bottom');\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, valScale, yAxisConfig, area.height, 'left');\n }\n }\n\n // Series groups\n // Stacked segments stay square so they join cleanly.\n const themeRadius = stacked\n ? 0\n : Number.parseFloat(getComputedStyle(ctx.svg).getPropertyValue('--prism-bar-radius')) || 0;\n\n while (groups.series.children.length > seriesList.length) {\n const last = groups.series.lastElementChild;\n\n if (last) groups.series.removeChild(last);\n }\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-bar-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const barData = categories.map((key, categoryIndex) => {\n const datum = allData[i]?.[categoryIndex];\n\n if (stacked) {\n const base = stackTops[key] ?? 0;\n const top = base + Math.max(0, datum?.value ?? 0);\n\n stackTops[key] = top;\n\n return { base, dash: datum?.dash, key, opacity: datum?.opacity, present: datum !== undefined, y: top };\n }\n\n return {\n base: 0,\n dash: datum?.dash,\n key,\n opacity: datum?.opacity,\n present: datum !== undefined,\n y: datum?.value ?? 0,\n };\n });\n\n stackedTops[i] = barData.map((d) => d.y);\n\n const baselineYs = stacked ? barData.map((d) => valScale.map(d.base)) : undefined;\n\n renderBars(group, barData, catScale, valScale, sc.baselinePx, {\n baselineYs,\n borderRadius: series.borderRadius ?? themeRadius,\n color: seriesColor(i, series.color),\n disposalSignal: ctx.disposalSignal,\n horizontal,\n seriesCount: seriesList.length,\n seriesIndex: i,\n stacked,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n groups.series.classList.toggle('prism-bars-stacked', stacked);\n\n if (!band || !ctx.chartArea.contains(band)) {\n band = createSvgElement('rect', { 'aria-hidden': 'true', class: 'prism-bar-band', 'pointer-events': 'none' });\n ctx.chartArea.insertBefore(band, groups.series);\n }\n\n band.style.display = 'none';\n\n // ─── Event handlers (close over render-derived state) ─────────────────────\n\n const colors = seriesList.map((s, i) => seriesColor(i, s.color));\n const labelOf = (catIdx: number): string => String(model.labels.get(categories[catIdx]) ?? categories[catIdx]);\n let activeCat = -1;\n\n const valuesAt = (catIdx: number): SeriesValue[] =>\n seriesList.map((series, si) => ({ datum: allData[si]?.[catIdx], series }));\n\n const eventAt = (catIdx: number, seriesIdx: number, originalEvent: Event): ChartEvent | null => {\n const values = valuesAt(catIdx);\n const preferred = values[seriesIdx]?.datum ? seriesIdx : values.findIndex((v) => v.datum);\n const datum = values[preferred]?.datum;\n\n return datum ? { datum, originalEvent, series: seriesList[preferred], values } : null;\n };\n\n const setActive = (catIdx: number): void => {\n activeCat = catIdx;\n groups.series.classList.toggle('prism-bars-focused', catIdx >= 0);\n\n for (const group of groups.series.children) {\n for (const [i, rect] of [...group.children].entries())\n rect.classList.toggle('prism-bar--active', i === catIdx);\n }\n\n if (!band) return;\n\n band.style.display = catIdx < 0 ? 'none' : '';\n\n if (catIdx < 0) return;\n\n const start = sc.bandCenter(categories[catIdx]) - catScale.bandwidth() / 2 - catScale.gap() / 2;\n const size = catScale.bandwidth() + catScale.gap();\n const a = chartArea(ctx.dimensions.width, ctx.dimensions.height, ctx.dimensions.margin);\n\n setAttributes(\n band,\n horizontal\n ? { height: size, width: a.width, x: 0, y: start }\n : { height: a.height, width: size, x: start, y: 0 },\n );\n };\n\n const activate = (catIdx: number, seriesIdx: number, originalEvent: Event): void => {\n const event = eventAt(catIdx, seriesIdx, originalEvent);\n\n if (!event) return;\n\n setActive(catIdx);\n\n const values = event.values ?? [];\n const spoken = describeValues(labelOf(catIdx), values);\n\n if (tooltip) {\n const tops = values.map((v, si) =>\n stacked ? (stackedTops[si]?.[catIdx] ?? 0) : Math.max(0, v.datum?.value ?? 0),\n );\n const valuePx = valScale.map(Math.max(...tops));\n const bandCenterPx = sc.bandCenter(categories[catIdx]);\n const { margin } = ctx.dimensions;\n const rows = values.flatMap((v, si) =>\n v.datum ? [{ color: colors[si], name: v.series.name, value: String(v.datum.value) }] : [],\n );\n\n tooltip.show(\n (horizontal ? valuePx : bandCenterPx) + margin.left,\n (horizontal ? bandCenterPx : valuePx) + margin.top,\n event.datum,\n event.series,\n comparisonContent(ctx.svg.ownerDocument, labelOf(catIdx), rows, spoken),\n );\n } else {\n ctx.announcer.announce(spoken);\n }\n\n config.onHover?.(event);\n };\n\n const deactivate = (): void => {\n setActive(-1);\n tooltip?.hide();\n ctx.announcer.clear();\n config.onHover?.(null);\n };\n\n const hit = (event: MouseEvent): { catIdx: number; seriesIdx: number } | null => {\n const d = ctx.dimensions;\n const pos = getMousePosition(ctx.svg, event, d.margin.left, d.margin.top);\n const a = chartArea(d.width, d.height, d.margin);\n\n if (pos.x < 0 || pos.x > a.width || pos.y < 0 || pos.y > a.height) return null;\n\n const catIdx = findCatIdx(horizontal ? pos.y : pos.x, categories, sc);\n\n return catIdx === -1\n ? null\n : { catIdx, seriesIdx: findSeriesIdx(pos, catIdx, categories, sc, seriesList.length) };\n };\n\n const onMouseMove = (event: MouseEvent) => {\n const target = hit(event);\n\n if (target) activate(target.catIdx, target.seriesIdx, event);\n else if (activeCat >= 0) deactivate();\n };\n\n const onClick = (event: MouseEvent) => {\n const target = config.onClick && hit(event);\n const chartEvent = target && eventAt(target.catIdx, target.seriesIdx, event);\n\n if (chartEvent) config.onClick?.(chartEvent);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n const last = categories.length - 1;\n const prev = activeCat < 0 ? last : Math.max(0, activeCat - 1);\n const next = activeCat < 0 ? 0 : Math.min(last, activeCat + 1);\n const target: Record<string, number> = {\n ArrowDown: next,\n ArrowLeft: prev,\n ArrowRight: next,\n ArrowUp: prev,\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n activate(target[event.key], 0, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && activeCat >= 0 && config.onClick) {\n event.preventDefault();\n\n const chartEvent = eventAt(activeCat, 0, event);\n\n if (chartEvent) config.onClick(chartEvent);\n } else if (event.key === 'Escape') {\n deactivate();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: deactivate, onMouseMove };\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n","import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { cancelReveal, playTraceReveal } from '../../animation/reveal';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport { computeStyleRuns, type DatumMark, hasStyledRuns, type StyleRun } from '../../core/datum-style';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionOption } from '../../types';\n\nexport interface LineRenderOptions {\n /** Plot-area size in area-local coordinates: bounds the entrance mask. */\n bounds: { height: number; width: number };\n color: string;\n curve: 'linear' | 'monotone' | 'step';\n /** Aborted when the owning chart is disposed: stops the transition's `requestAnimationFrame` loop from rescheduling. */\n disposalSignal?: AbortSignal;\n /** Per-datum presentation parallel to `points`; styled runs split the line into subpaths. */\n marks?: readonly DatumMark[];\n pointRadius: number;\n showPoints: boolean;\n /** Explicit width beats the `--prism-line-width` theme token. */\n strokeWidth?: number;\n transition?: TransitionOption;\n}\n\nconst activeAnimations = new WeakMap<SVGGElement, () => void>();\n// Geometry currently on screen, so an update interpolates from it even when the\n// series hides its point markers (the dots would otherwise be the only record).\nconst drawnPoints = new WeakMap<SVGGElement, Point[]>();\n\nfunction buildPath(pts: Point[], curve: LineRenderOptions['curve']): string {\n return curve === 'monotone' ? monotonePath(pts) : curve === 'step' ? stepPath(pts) : linePath(pts);\n}\n\nexport function renderLine(parent: SVGGElement, points: Point[], options: LineRenderOptions): void {\n const styled = hasStyledRuns(options.marks);\n const marks = options.marks ?? [];\n const motion = resolveMotion(options.transition);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n let path: SVGPathElement | null = null;\n let runs: readonly StyleRun[] = [];\n let runPaths: SVGPathElement[] = [];\n\n if (styled) {\n runs = computeStyleRuns(marks, points.length);\n\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-line-path')];\n\n for (const extra of existing.slice(runs.length)) extra.remove();\n\n runPaths = runs.map((_, r) => {\n const reuse = existing[r];\n\n if (reuse) return reuse;\n\n const created = createSvgElement('path', { class: 'prism-line-path', fill: 'none' });\n\n parent.appendChild(created);\n\n return created;\n });\n\n for (const [r, run] of runs.entries()) {\n setAttributes(runPaths[r], {\n opacity: run.opacity,\n stroke: options.color,\n 'stroke-dasharray': run.dash,\n 'stroke-width': options.strokeWidth ?? 2,\n });\n runPaths[r].style.strokeWidth = options.strokeWidth === undefined ? '' : String(options.strokeWidth);\n }\n } else {\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-line-path')];\n\n path = existing[0] ?? null;\n\n for (const stale of existing.slice(1)) stale.remove();\n\n if (!path) {\n path = createSvgElement('path', { class: 'prism-line-path', fill: 'none' });\n parent.appendChild(path);\n }\n\n setAttributes(path, {\n opacity: undefined,\n stroke: options.color,\n 'stroke-dasharray': undefined,\n 'stroke-width': options.strokeWidth ?? 2,\n });\n path.style.strokeWidth = options.strokeWidth === undefined ? '' : String(options.strokeWidth);\n }\n\n const draw = (pts: Point[]): void => {\n if (styled) {\n for (const [r, run] of runs.entries()) {\n setAttributes(runPaths[r], { d: buildPath(pts.slice(run.start, run.end + 1), options.curve) });\n }\n } else {\n setAttributes(path!, { d: buildPath(pts, options.curve) });\n }\n };\n\n let dotsGroup = parent.querySelector<SVGGElement>('.prism-line-dots');\n\n if (options.showPoints) {\n if (!dotsGroup) {\n dotsGroup = createSvgElement('g', { class: 'prism-line-dots' });\n parent.appendChild(dotsGroup);\n }\n } else if (dotsGroup) {\n dotsGroup.remove();\n dotsGroup = null;\n }\n\n if (dur === 0) {\n activeAnimations.get(parent)?.();\n cancelReveal(parent);\n draw(points);\n drawnPoints.set(parent, points);\n\n if (dotsGroup) {\n while (dotsGroup.children.length > points.length) dotsGroup.removeChild(dotsGroup.lastChild!);\n\n for (let i = 0; i < points.length; i++) {\n let c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (!c) {\n c = createSvgElement('circle', { class: 'prism-line-dot' });\n dotsGroup.appendChild(c);\n }\n\n setAttributes(c, {\n cx: points[i].x,\n cy: points[i].y,\n fill: options.color,\n opacity: marks[i]?.opacity,\n r: options.pointRadius,\n });\n }\n }\n\n return;\n }\n\n activeAnimations.get(parent)?.();\n cancelReveal(parent);\n\n const isMount = !drawnPoints.has(parent);\n\n if (dotsGroup) {\n while (dotsGroup.children.length > points.length) dotsGroup.removeChild(dotsGroup.lastChild!);\n\n for (let i = dotsGroup.children.length; i < points.length; i++) {\n const c = createSvgElement('circle', { class: 'prism-line-dot' });\n\n setAttributes(c, {\n fill: options.color,\n opacity: marks[i]?.opacity,\n r: options.pointRadius,\n });\n dotsGroup.appendChild(c);\n }\n\n for (let i = 0; i < dotsGroup.children.length; i++) {\n setAttributes(dotsGroup.children[i] as SVGCircleElement, { opacity: marks[i]?.opacity });\n }\n }\n\n if (isMount) {\n draw(points);\n drawnPoints.set(parent, points);\n\n if (dotsGroup) {\n for (const [i, point] of points.entries()) {\n const c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (c) setAttributes(c, { cx: point.x, cy: point.y });\n }\n }\n\n if (points.length > 1) {\n const renderedPath = path ?? runPaths[0];\n const strokeWidth = options.strokeWidth ?? (Number.parseFloat(getComputedStyle(renderedPath).strokeWidth) || 2);\n const traces = styled\n ? runs.map((run, i) => ({\n d: runPaths[i].getAttribute('d')!,\n end: run.end / (points.length - 1),\n start: run.start / (points.length - 1),\n }))\n : [{ d: path!.getAttribute('d')!, end: 1, start: 0 }];\n\n // A wide trace also uncovers markers as it reaches them, without a second timeline.\n playTraceReveal(\n parent,\n options.bounds,\n traces,\n Math.max(strokeWidth, options.showPoints ? options.pointRadius * 2 : 0) + 2,\n resolveMotion(options.transition, { defaultDuration: 420 }),\n options.disposalSignal,\n );\n }\n\n return;\n }\n\n const fromPts: Point[] = [];\n const drawn = drawnPoints.get(parent) ?? points;\n\n for (const [i, to] of points.entries()) {\n fromPts.push(drawn[i] ?? drawn.at(-1) ?? to);\n }\n\n const paintFrame = (e: number): void => {\n const interpolated: Point[] = points.map((to, i) => {\n const from = fromPts[i] ?? to;\n\n return { x: tweenNumber(from.x, to.x, e), y: tweenNumber(from.y, to.y, e) };\n });\n\n drawnPoints.set(parent, interpolated);\n draw(interpolated);\n\n if (dotsGroup) {\n for (let i = 0; i < points.length; i++) {\n const c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (c) setAttributes(c, { cx: interpolated[i].x, cy: interpolated[i].y });\n }\n }\n };\n\n // The starting geometry goes on screen immediately: `startTween` only paints on\n // the first frame callback, which would otherwise leave one blank frame.\n paintFrame(0);\n\n activeAnimations.set(\n parent,\n startTween({\n count: 1,\n duration: dur,\n easing,\n onComplete: () => {\n activeAnimations.delete(parent);\n drawnPoints.set(parent, points);\n },\n onFrame: (progress) => paintFrame(progress(0)),\n signal: options.disposalSignal,\n }),\n );\n}\n\nexport function computePoints(data: ContinuousDatum[], xScale: Scale<Date | number>, yScale: Scale<number>): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computePoints: datum.key is null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n } else if (data.some((d) => typeof d.key === 'string')) {\n warn('computePoints: string keys are not supported for line/area charts: use numeric or Date keys.');\n }\n\n return data.map((d) => ({\n x: xScale.map(d.key as Date | number),\n y: yScale.map(d.value),\n }));\n}\n","import { positionAxis, renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea, resolveMargin } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, LineChartConfig, LineSeriesConfig, XAxisConfig, YAxisConfig } from '../../types';\nimport { computePoints, renderLine } from './line-renderer';\n\nexport function createLineChart(container: HTMLElement, config: LineChartConfig): ChartHandle<LineSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let rightAxis: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const hasRight = seriesList.some((series) => series.yAxis === 'right');\n const hasLeftData = seriesList.some((series) => series.yAxis !== 'right' && series.data.length > 0);\n // The right axis widens the right margin; the effective margin stays local to this\n // render pass (and is handed to the interaction layer) instead of mutating shared dims.\n const margin = {\n ...resolveMargin(config.margin),\n right:\n config.margin?.right ??\n (hasRight ? (config.rightYAxis?.label ? 72 : 50) : resolveMargin(config.margin).right),\n };\n const area = chartArea(dims.width, dims.height, margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const leftY = seriesList\n .filter((series) => series.yAxis !== 'right')\n .flatMap((series) => series.data.map((datum) => datum.value));\n const rightY = seriesList\n .filter((series) => series.yAxis === 'right')\n .flatMap((series) => series.data.map((datum) => datum.value));\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n rightAxis?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n const yScale = buildYScale(leftY, area.height);\n const rightYScale = buildYScale(rightY, area.height);\n\n // Axes render by default (value axis with gridlines); `false` opts out.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : (config.yAxis ?? { grid: true });\n\n if (yAxisConfig && yAxisConfig.grid && (!hasRight || hasLeftData)) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTickCount(yAxisConfig, area.height, 'left'),\n );\n } else {\n groups.grid.replaceChildren();\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTickCount(xAxisConfig, area.width, 'bottom'),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig && (!hasRight || hasLeftData)) {\n const axis = { ...yAxisConfig, position: hasRight ? ('left' as const) : (yAxisConfig.position ?? 'left') };\n positionAxis(groups.yAxis, axis.position, area.width, area.height);\n renderAxis(groups.yAxis, yScale, axis, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n if (hasRight) {\n if (!rightAxis) {\n rightAxis = createSvgElement('g', { class: 'prism-y-axis-right' });\n ctx.chartArea.appendChild(rightAxis);\n }\n const axis = { ...config.rightYAxis, position: 'right' as const };\n positionAxis(rightAxis, 'right', area.width, area.height);\n renderAxis(rightAxis, rightYScale, axis, area.height, 'right');\n } else {\n rightAxis?.replaceChildren();\n }\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-line-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const seriesScale = series.yAxis === 'right' ? rightYScale : yScale;\n const points = computePoints(allData[i], xScale, seriesScale);\n\n allPoints.push(points);\n\n renderLine(group, points, {\n bounds: { height: area.height, width: area.width },\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n marks: series.data,\n pointRadius: series.pointRadius ?? 3,\n showPoints: series.showPoints ?? false,\n strokeWidth: series.strokeWidth,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createSeriesInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n","// Angles are radians measured clockwise from 12 o'clock.\n\nexport function polarX(cx: number, r: number, angle: number): number {\n return cx + r * Math.sin(angle);\n}\n\nexport function polarY(cy: number, r: number, angle: number): number {\n return cy - r * Math.cos(angle);\n}\n\n/** SVG path coordinate pair (`x,y`) for a polar position. */\nexport function polarPoint(cx: number, cy: number, r: number, angle: number): string {\n return `${polarX(cx, r, angle)},${polarY(cy, r, angle)}`;\n}\n","import { polarPoint as p, polarX as px, polarY as py } from '../../core/polar';\nimport type { PieSliceConfig } from '../../types';\n\nexport interface Arc {\n capEnd: boolean;\n capStart: boolean;\n centerX: number;\n centerY: number;\n color: string;\n cornerRadius: number;\n endAngle: number;\n index: number;\n innerRadius: number;\n outerRadius: number;\n padAngle: number;\n slice: PieSliceConfig;\n startAngle: number;\n}\n\nexport function computeArcs(\n slices: PieSliceConfig[],\n cx: number,\n cy: number,\n outerRadius: number,\n innerRadius: number,\n startAngle: number,\n endAngle: number,\n padPixels: number,\n cornerRadius: number,\n defaultColors: (i: number) => string,\n capEnds = false,\n): Arc[] {\n const total = slices.reduce((s, d) => s + Math.max(0, d.value), 0);\n\n if (total === 0) return [];\n\n const range = endAngle - startAngle;\n const halfGapAngle = outerRadius > 0 ? Math.asin(Math.min(1, padPixels / 2 / outerRadius)) : 0;\n\n let currentAngle = startAngle;\n const n = slices.length;\n\n return slices.map((slice, i) => {\n const fraction = Math.max(0, slice.value) / total;\n const sliceRange = fraction * range;\n const rawStart = currentAngle;\n const rawEnd = currentAngle + sliceRange;\n\n currentAngle += sliceRange;\n\n const padAngle = Math.min(halfGapAngle, sliceRange / 2);\n\n return {\n capEnd: capEnds && i === n - 1,\n capStart: capEnds && i === 0,\n centerX: cx,\n centerY: cy,\n color: slice.color ?? defaultColors(i),\n cornerRadius,\n endAngle: rawEnd,\n index: i,\n innerRadius,\n outerRadius,\n padAngle,\n slice,\n startAngle: rawStart,\n };\n });\n}\n\nexport function arcPath(arc: Arc): string {\n const {\n capEnd,\n capStart,\n centerX: cx,\n centerY: cy,\n cornerRadius: cr,\n endAngle,\n innerRadius,\n outerRadius,\n padAngle,\n startAngle,\n } = arc;\n\n const sweep = endAngle - startAngle;\n\n if (sweep <= 0) return '';\n\n // ── Full circle ─────────────────────────────────────────────────────────────\n if (sweep >= 2 * Math.PI - 1e-6) {\n const mid = startAngle + Math.PI;\n\n if (innerRadius <= 0) {\n return `M${p(cx, cy, outerRadius, startAngle)}A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, mid)}A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, startAngle)}Z`;\n }\n\n return [\n `M${p(cx, cy, outerRadius, startAngle)}`,\n `A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, mid)}`,\n `A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, startAngle)}`,\n `M${p(cx, cy, innerRadius, startAngle)}`,\n `A${innerRadius},${innerRadius},0,1,0,${p(cx, cy, innerRadius, mid)}`,\n `A${innerRadius},${innerRadius},0,1,0,${p(cx, cy, innerRadius, startAngle)}`,\n 'Z',\n ].join('');\n }\n\n // Cap ends don't get a padAngle inset (no adjacent slice on that side)\n const sa = capStart ? startAngle : startAngle + padAngle;\n const ea = capEnd ? endAngle : endAngle - padAngle;\n\n if (ea <= sa) return '';\n\n const paddedSweep = ea - sa;\n\n // ── No rounding ─────────────────────────────────────────────────────────────\n if (cr <= 0) {\n const large = paddedSweep > Math.PI ? 1 : 0;\n\n if (innerRadius <= 0) {\n return `M${cx},${cy}L${p(cx, cy, outerRadius, sa)}A${outerRadius},${outerRadius},0,${large},1,${p(cx, cy, outerRadius, ea)}Z`;\n }\n\n return [\n `M${p(cx, cy, outerRadius, sa)}`,\n `A${outerRadius},${outerRadius},0,${large},1,${p(cx, cy, outerRadius, ea)}`,\n `L${p(cx, cy, innerRadius, ea)}`,\n `A${innerRadius},${innerRadius},0,${large},0,${p(cx, cy, innerRadius, sa)}`,\n 'Z',\n ].join('');\n }\n\n // ── Rounded corners (or semicircle caps at open ends) ────────────────────────\n // Corner bezier pull amounts\n const outerPull = Math.min(cr / outerRadius, paddedSweep / 2);\n const innerPull = Math.min(cr / innerRadius, paddedSweep / 2);\n const radialPull = Math.min(cr, (outerRadius - innerRadius) / 2);\n const capR = (outerRadius - innerRadius) / 2; // semicircle cap radius\n\n // Shortened arc angles (for corners)\n const oS = sa + (capStart ? 0 : outerPull);\n const oE = ea - (capEnd ? 0 : outerPull);\n const iS = sa + (capStart ? 0 : innerPull);\n const iE = ea - (capEnd ? 0 : innerPull);\n\n const largeO = oE - oS > Math.PI ? 1 : 0;\n const largeI = iE - iS > Math.PI ? 1 : 0;\n\n // Unrounded corner cartesian positions (at full sa/ea, not shortened)\n const cxOs = px(cx, outerRadius, sa);\n const cyOs = py(cy, outerRadius, sa);\n const cxOe = px(cx, outerRadius, ea);\n const cyOe = py(cy, outerRadius, ea);\n const cxIs = px(cx, innerRadius, sa);\n const cyIs = py(cy, innerRadius, sa);\n const cxIe = px(cx, innerRadius, ea);\n const cyIe = py(cy, innerRadius, ea);\n\n const frac = radialPull / (outerRadius - innerRadius);\n const pOsRad = `${cxOs + (cxIs - cxOs) * frac},${cyOs + (cyIs - cyOs) * frac}`;\n const pOeRad = `${cxOe + (cxIe - cxOe) * frac},${cyOe + (cyIe - cyOe) * frac}`;\n const pIsRad = `${cxIs + (cxOs - cxIs) * frac},${cyIs + (cyOs - cyIs) * frac}`;\n const pIeRad = `${cxIe + (cxOe - cxIe) * frac},${cyIe + (cyOe - cyIe) * frac}`;\n\n const segs: string[] = [];\n\n // Start edge\n if (capStart) {\n segs.push(`M${p(cx, cy, outerRadius, sa)}`);\n } else {\n segs.push(`M${pOsRad}`);\n segs.push(`Q${cxOs},${cyOs},${p(cx, cy, outerRadius, oS)}`);\n }\n\n // Outer arc\n segs.push(`A${outerRadius},${outerRadius},0,${largeO},1,${p(cx, cy, outerRadius, oE)}`);\n\n // End edge\n if (capEnd) {\n // Semicircle cap from outer-end → inner-end, bulging away from center (CW)\n segs.push(`A${capR},${capR},0,0,1,${p(cx, cy, innerRadius, ea)}`);\n } else {\n segs.push(`Q${cxOe},${cyOe},${pOeRad}`);\n segs.push(`L${pIeRad}`);\n segs.push(`Q${cxIe},${cyIe},${p(cx, cy, innerRadius, iE)}`);\n }\n\n // Inner arc (reversed, CCW)\n segs.push(`A${innerRadius},${innerRadius},0,${largeI},0,${p(cx, cy, innerRadius, iS)}`);\n\n // Start edge close\n if (capStart) {\n // Semicircle cap from inner-start → outer-start, bulging away from center (CCW)\n segs.push(`A${capR},${capR},0,0,0,${p(cx, cy, outerRadius, sa)}`);\n } else {\n segs.push(`Q${cxIs},${cyIs},${pIsRad}`);\n }\n\n segs.push('Z');\n\n return segs.join('');\n}\n\nexport function arcCentroid(arc: Arc): { x: number; y: number } {\n const mid = (arc.startAngle + arc.endAngle) / 2;\n const r = (arc.outerRadius + arc.innerRadius) / 2;\n\n return {\n x: arc.centerX + r * Math.sin(mid),\n y: arc.centerY - r * Math.cos(mid),\n };\n}\n","import { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport type { ChartEventHandlers } from '../../core/chart-scaffold';\nimport { createRadialScaffold } from '../../core/chart-scaffold';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { estimateTextWidth } from '../../svg/text';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, PieChartConfig, PieSliceConfig } from '../../types';\nimport { type Arc, arcCentroid, arcPath, computeArcs } from './pie-renderer';\n\nconst TWO_PI = 2 * Math.PI;\n/** Default `--prism-pie-label-size` in px, used to decide whether a label fits its slice. */\nconst LABEL_FONT_SIZE = 12;\n\n/** A label fits when its slice is wide enough along the centroid arc and thick enough radially. */\nfunction labelFits(arc: Arc, label: string): boolean {\n const thickness = arc.outerRadius - arc.innerRadius;\n const midRadius = (arc.outerRadius + arc.innerRadius) / 2;\n const arcLength = (arc.endAngle - arc.startAngle - 2 * arc.padAngle) * midRadius;\n\n return thickness >= LABEL_FONT_SIZE * 1.4 && arcLength >= estimateTextWidth(label, LABEL_FONT_SIZE) + 8;\n}\n\nconst SEMI_START = -Math.PI / 2; // -90° = 9-o'clock (left)\nconst SEMI_END = Math.PI / 2; // +90° = 3-o'clock (right) → true 180° half-circle\n\nfunction semiAngles(variant: PieChartConfig['variant']): { end: number; start: number } {\n return variant === 'semi' ? { end: SEMI_END, start: SEMI_START } : { end: TWO_PI, start: 0 };\n}\n\nexport function createPieChart(container: HTMLElement, config: PieChartConfig): ChartHandle<PieSliceConfig[]> {\n const variant = config.variant ?? 'pie';\n const padPixels = config.padPixels ?? (variant === 'pie' ? 0 : 8);\n const cornerRadius = config.cornerRadius ?? (variant === 'pie' ? 0 : 8);\n let data = config.data;\n\n // Pie SVG elements live directly on the SVG (not inside chartArea groups).\n // We create them once and reuse across renders.\n const bgCircle = createSvgElement('circle', { class: 'prism-pie-bg', 'pointer-events': 'none' });\n const pieGroup = createSvgElement('g', {\n class: 'prism-pie-slices',\n 'shape-rendering': 'geometricPrecision',\n });\n const labelGroup = createSvgElement('g', { class: 'prism-pie-labels', 'pointer-events': 'none' });\n\n // Current arcs shared between renderFn and event handlers via closure.\n let currentArcs: Arc[] = [];\n // The geometry actually on screen right now (mid-tween included): the update\n // morph interpolates from this, so interrupting a tween never jumps.\n let drawnArcs: Arc[] = [];\n let activeTween: (() => void) | null = null;\n\n function renderLabels(slices: PieSliceConfig[]): void {\n labelGroup.replaceChildren();\n\n for (let i = 0; i < currentArcs.length; i++) {\n const arc = currentArcs[i];\n const slice = slices[i];\n\n if (!slice?.label || !labelFits(arc, slice.label)) continue;\n\n const { x, y } = arcCentroid(arc);\n const text = createSvgElement('text', { class: 'prism-pie-label' });\n\n setAttributes(text, {\n 'dominant-baseline': 'middle',\n fill: 'var(--prism-pie-label-color, #fff)',\n 'font-family': 'var(--prism-font-family, system-ui)',\n 'font-size': 'var(--prism-pie-label-size, 12px)',\n 'text-anchor': 'middle',\n x,\n y,\n });\n\n text.textContent = slice.label;\n labelGroup.appendChild(text);\n }\n }\n\n return createRadialScaffold(\n container,\n {\n a11y: config.a11y,\n legend: config.legend,\n tooltip: config.tooltip,\n },\n (ctx): ChartEventHandlers => {\n const { legend, svg, tooltip } = ctx;\n const hasSlices = data.some((slice) => slice.value > 0);\n legend?.update(\n hasSlices ? data.map((slice, i) => ({ color: slice.color ?? seriesColor(i), name: slice.label ?? '' })) : [],\n );\n\n // Append pie groups to SVG on first render (idempotent).\n if (!svg.contains(bgCircle)) {\n svg.appendChild(bgCircle);\n svg.appendChild(pieGroup);\n svg.appendChild(labelGroup);\n }\n\n const { height: h, width: w } = ctx.dimensions;\n const isSemi = variant === 'semi';\n const cx = w / 2;\n const cy = isSemi ? h * 0.85 : h / 2;\n const padding = 8;\n const outer = isSemi ? Math.min(cx, cy) - padding : Math.min(w, h) / 2 - padding;\n const defaultInner = variant === 'pie' ? 0 : Math.round(outer * 0.55);\n const inner = config.innerRadius !== undefined ? config.innerRadius : defaultInner;\n const outerR = Math.max(inner + 1, outer);\n\n const slices = data;\n const { end, start } = semiAngles(variant);\n\n currentArcs = computeArcs(\n slices,\n cx,\n cy,\n outerR,\n inner,\n start,\n end,\n padPixels,\n cornerRadius,\n (i) => seriesColor(i),\n false,\n );\n\n setAttributes(bgCircle, { cx, cy, r: inner > 0 ? inner : 0 });\n bgCircle.setAttribute('style', 'fill:var(--prism-bg,#fff)');\n\n while (pieGroup.children.length > currentArcs.length) pieGroup.removeChild(pieGroup.lastChild!);\n\n labelGroup.replaceChildren();\n\n const motion = resolveMotion(config.transition);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n for (let i = 0; i < currentArcs.length; i++) {\n const arc = currentArcs[i];\n let path = pieGroup.children[i] as SVGPathElement | undefined;\n\n if (!path) {\n path = createSvgElement('path', { class: 'prism-pie-slice' });\n pieGroup.appendChild(path);\n }\n\n path.setAttribute('fill', arc.color);\n path.setAttribute('stroke', 'none');\n path.style.cursor = config.onClick || config.onHover ? 'pointer' : '';\n }\n\n activeTween?.();\n\n // Mount sweeps the ring in once; an update morphs every slice from its\n // drawn angles to the new ones, which reads as the data changing rather\n // than the chart redrawing.\n const isMount = drawnArcs.length === 0;\n const fromArcs = drawnArcs;\n\n activeTween = startTween({\n count: 1,\n duration: dur,\n easing,\n onComplete: () => renderLabels(slices),\n onFrame: (progress) => {\n const e = progress(0);\n\n if (isMount) {\n const revealAngle = tweenNumber(start, end, e);\n\n drawnArcs = currentArcs.map((a, j) => {\n const el = pieGroup.children[j] as SVGPathElement | undefined;\n\n if (!el) return a;\n\n if (revealAngle <= a.startAngle) {\n setAttributes(el, { d: '' });\n\n return { ...a, endAngle: a.startAngle };\n }\n\n const visibleEnd = Math.min(a.endAngle, revealAngle);\n\n setAttributes(el, { d: arcPath({ ...a, endAngle: visibleEnd }) });\n\n return { ...a, endAngle: visibleEnd };\n });\n\n return;\n }\n\n drawnArcs = currentArcs.map((to, j) => {\n const el = pieGroup.children[j] as SVGPathElement | undefined;\n const lastDrawn = fromArcs.at(-1);\n // A slice that was not drawn before grows out of the end of the last drawn one.\n const from: Arc = fromArcs[j] ?? {\n ...to,\n endAngle: lastDrawn?.endAngle ?? start,\n startAngle: lastDrawn?.endAngle ?? start,\n };\n const morphed: Arc = {\n ...to,\n endAngle: tweenNumber(from.endAngle, to.endAngle, e),\n innerRadius: tweenNumber(from.innerRadius, to.innerRadius, e),\n outerRadius: tweenNumber(from.outerRadius, to.outerRadius, e),\n padAngle: tweenNumber(from.padAngle, to.padAngle, e),\n startAngle: tweenNumber(from.startAngle, to.startAngle, e),\n };\n\n if (!el) return morphed;\n\n setAttributes(el, {\n d: morphed.endAngle - morphed.startAngle <= 1e-6 ? '' : arcPath(morphed),\n });\n\n return morphed;\n });\n },\n signal: ctx.disposalSignal,\n });\n\n tooltip?.hide();\n\n const total = currentArcs.reduce((sum, arc) => sum + Math.max(0, arc.slice.value), 0);\n let activeIndex = -1;\n\n const describe = (arc: Arc): string => {\n const percent = total > 0 ? Math.round((Math.max(0, arc.slice.value) / total) * 1000) / 10 : 0;\n\n return `${arc.slice.label ?? `Slice ${arc.index + 1}`}: ${arc.slice.value} (${percent}%)`;\n };\n\n const setActive = (index: number): void => {\n activeIndex = index;\n pieGroup.classList.toggle('prism-pie-focused', index >= 0);\n for (const [i, el] of [...pieGroup.children].entries())\n el.classList.toggle('prism-pie-slice--active', i === index);\n };\n\n const activate = (index: number, originalEvent: Event): void => {\n const arc = currentArcs[index];\n\n if (!arc) return;\n\n setActive(index);\n config.onHover?.({ index, originalEvent, slice: arc.slice });\n\n const text = describe(arc);\n\n if (!tooltip) {\n ctx.announcer.announce(text);\n\n return;\n }\n\n const { x, y } = arcCentroid(arc);\n const svgRect = svg.getBoundingClientRect();\n const contR = container.getBoundingClientRect();\n\n tooltip.show(\n x + (svgRect.left - contR.left),\n y + (svgRect.top - contR.top),\n { key: index, value: arc.slice.value },\n { color: arc.color, data: [], name: arc.slice.label ?? '' },\n text,\n );\n };\n\n const deactivate = (): void => {\n setActive(-1);\n tooltip?.hide();\n ctx.announcer.clear();\n config.onHover?.(null);\n };\n\n const hitAt = (e: MouseEvent): number => {\n const svgRect = svg.getBoundingClientRect();\n\n return hitTestArc(currentArcs, e.clientX - svgRect.left, e.clientY - svgRect.top, variant);\n };\n\n const onMouseMove = (e: MouseEvent): void => {\n const hit = hitAt(e);\n\n if (hit >= 0) {\n if (hit !== activeIndex) activate(hit, e);\n } else if (activeIndex >= 0) {\n deactivate();\n }\n };\n\n const onClick = (e: MouseEvent): void => {\n if (!config.onClick) return;\n\n const hit = hitAt(e);\n\n if (hit >= 0) config.onClick({ index: hit, originalEvent: e, slice: currentArcs[hit].slice });\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n const count = currentArcs.length;\n\n if (count === 0) return;\n\n const step: Record<string, number> = { ArrowDown: 1, ArrowLeft: -1, ArrowRight: 1, ArrowUp: -1 };\n\n if (e.key in step) {\n e.preventDefault();\n activate(\n activeIndex < 0 ? (step[e.key] > 0 ? 0 : count - 1) : (activeIndex + step[e.key] + count) % count,\n e,\n );\n } else if (e.key === 'Home' || e.key === 'End') {\n e.preventDefault();\n activate(e.key === 'Home' ? 0 : count - 1, e);\n } else if ((e.key === 'Enter' || e.key === ' ') && activeIndex >= 0 && config.onClick) {\n e.preventDefault();\n config.onClick({ index: activeIndex, originalEvent: e, slice: currentArcs[activeIndex].slice });\n } else if (e.key === 'Escape') {\n deactivate();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: deactivate, onMouseMove };\n },\n (next) => {\n data = next;\n },\n );\n}\n\nfunction hitTestArc(arcs: Arc[], mx: number, my: number, variant: PieChartConfig['variant']): number {\n for (let i = 0; i < arcs.length; i++) {\n const arc = arcs[i];\n const dx = mx - arc.centerX;\n const dy = my - arc.centerY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < arc.outerRadius && dist >= arc.innerRadius) {\n const rawAngle = Math.atan2(dx, -dy);\n\n if (variant === 'semi') {\n if (rawAngle >= arc.startAngle - 1e-9 && rawAngle <= arc.endAngle + 1e-9) return i;\n } else {\n const angle = rawAngle < 0 ? rawAngle + TWO_PI : rawAngle;\n\n if (angle >= arc.startAngle - 1e-9 && angle <= arc.endAngle + 1e-9) return i;\n }\n }\n }\n\n return -1;\n}\n","import { polarX, polarY } from '../../core/polar';\nimport { linearScale } from '../../scales/linear';\nimport type { Point } from '../../svg/path';\nimport { estimateTextWidth } from '../../svg/text';\nimport type { RadarAxisConfig, RadarSeriesConfig } from '../../types';\n\nconst TWO_PI = 2 * Math.PI;\n\nexport type LabelAnchor = 'end' | 'middle' | 'start';\nexport type LabelBaseline = 'auto' | 'hanging' | 'middle';\n\nexport function toRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nexport function axisAngles(count: number, startAngle = 0): number[] {\n return Array.from({ length: count }, (_, i) => startAngle + (i * TWO_PI) / count);\n}\n\n/** Per-axis `[min, max]`: axis overrides win over `domain`, which wins over a nice range around the data. */\nexport function resolveAxisDomains(\n axes: readonly RadarAxisConfig[],\n series: readonly RadarSeriesConfig[],\n domain?: [number, number],\n): [number, number][] {\n let shared = domain;\n\n if (!shared) {\n const values = series.flatMap((s) => s.data.map((d) => d.value)).filter(Number.isFinite);\n const min = Math.min(0, ...values);\n const max = values.length ? Math.max(...values) : 1;\n\n shared = linearScale({ domain: [min, max > min ? max : min + 1], range: [0, 1] }).domain as [number, number];\n }\n\n return axes.map((axis) => [axis.min ?? shared[0], axis.max ?? shared[1]]);\n}\n\nexport function normalize(value: number, [min, max]: readonly [number, number]): number {\n if (max === min) return 0;\n\n return Math.max(0, Math.min(1, (value - min) / (max - min)));\n}\n\nexport function radarPoints(\n fractions: readonly number[],\n cx: number,\n cy: number,\n radius: number,\n angles: readonly number[],\n): Point[] {\n return fractions.map((f, i) => ({ x: polarX(cx, radius * f, angles[i]), y: polarY(cy, radius * f, angles[i]) }));\n}\n\n/** Closed outline through every point; `rounded` uses a closed Catmull–Rom spline. */\nexport function closedPath(points: readonly Point[], curve: 'linear' | 'rounded' = 'linear'): string {\n const n = points.length;\n\n if (n === 0) return '';\n\n const [first] = points;\n\n if (curve === 'linear' || n < 3) {\n return `M${first.x},${first.y}${points\n .slice(1)\n .map((p) => `L${p.x},${p.y}`)\n .join('')}Z`;\n }\n\n let d = `M${first.x},${first.y}`;\n\n for (let i = 0; i < n; i++) {\n const p0 = points[(i - 1 + n) % n];\n const p1 = points[i];\n const p2 = points[(i + 1) % n];\n const p3 = points[(i + 2) % n];\n\n d += `C${p1.x + (p2.x - p0.x) / 6},${p1.y + (p2.y - p0.y) / 6} ${p2.x - (p3.x - p1.x) / 6},${p2.y - (p3.y - p1.y) / 6} ${p2.x},${p2.y}`;\n }\n\n return `${d}Z`;\n}\n\nexport function ringPath(\n shape: 'circle' | 'polygon',\n cx: number,\n cy: number,\n r: number,\n angles: readonly number[],\n): string {\n if (r <= 0) return '';\n\n if (shape === 'circle') return `M${cx},${cy - r}A${r},${r} 0 1 1 ${cx},${cy + r}A${r},${r} 0 1 1 ${cx},${cy - r}Z`;\n\n return closedPath(\n radarPoints(\n angles.map(() => 1),\n cx,\n cy,\n r,\n angles,\n ),\n );\n}\n\nexport function labelPlacement(angle: number): { anchor: LabelAnchor; baseline: LabelBaseline } {\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n\n return {\n anchor: Math.abs(sin) < 0.1 ? 'middle' : sin > 0 ? 'start' : 'end',\n baseline: cos > 0.9 ? 'auto' : cos < -0.9 ? 'hanging' : 'middle',\n };\n}\n\n/** Largest radius that leaves room for the axis labels around it. */\nexport function fitRadius(\n width: number,\n height: number,\n labels: readonly string[],\n angles: readonly number[],\n fontSize: number,\n gap: number,\n): number {\n let side = 0;\n\n labels.forEach((label, i) => {\n if (labelPlacement(angles[i]).anchor !== 'middle') side = Math.max(side, estimateTextWidth(label, fontSize));\n });\n\n const lineHeight = fontSize * 1.3;\n\n return Math.max(8, Math.min(width / 2 - gap - side, height / 2 - gap - lineHeight));\n}\n\n/** Index of the axis closest in angle to the offset `(dx, dy)` from the centre. */\nexport function nearestAxis(dx: number, dy: number, count: number, startAngle = 0): number {\n if (count === 0) return -1;\n\n const step = TWO_PI / count;\n const angle = (((Math.atan2(dx, -dy) - startAngle) % TWO_PI) + TWO_PI) % TWO_PI;\n\n return Math.round(angle / step) % count;\n}\n","import { devOnly, warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport type { ChartEventHandlers } from '../../core/chart-scaffold';\nimport { createRadialScaffold } from '../../core/chart-scaffold';\nimport { uniqueId } from '../../core/ids';\nimport { polarX, polarY } from '../../core/polar';\nimport { seriesDomId } from '../../core/series-id';\nimport { describeValues } from '../../interaction/announcer';\nimport { comparisonContent } from '../../interaction/tooltip';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport type {\n ChartHandle,\n RadarAxisConfig,\n RadarAxisValue,\n RadarChartConfig,\n RadarEvent,\n RadarGridConfig,\n RadarSeriesConfig,\n} from '../../types';\nimport {\n axisAngles,\n closedPath,\n fitRadius,\n labelPlacement,\n nearestAxis,\n normalize,\n radarPoints,\n resolveAxisDomains,\n ringPath,\n toRadians,\n} from './radar-geometry';\n\n/** Default `--prism-font-size-label` (0.6875rem) in px, used to reserve label room. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 12;\nconst VALUE_OFFSET = 10;\nconst ARROW_STEPS: Record<string, number> = { ArrowDown: 1, ArrowLeft: -1, ArrowRight: 1, ArrowUp: -1 };\n\nfunction warnOnInvalid(axes: readonly RadarAxisConfig[], series: readonly RadarSeriesConfig[]): void {\n devOnly(() => {\n if (axes.length < 3) warn(`Radar chart needs at least 3 axes, received ${axes.length}.`);\n\n const keys = new Set(axes.map((axis) => axis.key));\n\n if (keys.size !== axes.length) warn('Radar chart axis keys must be unique.');\n\n for (const s of series) {\n for (const d of s.data) {\n if (!keys.has(d.key)) warn(`Radar series \"${s.name}\" has a value for unknown axis \"${d.key}\".`);\n }\n }\n });\n}\n\nfunction resolveGrid(grid: RadarChartConfig['grid']): Required<RadarGridConfig> | null {\n if (grid === false) return null;\n\n return { bands: true, labels: false, levels: 4, shape: 'polygon', ...(typeof grid === 'object' ? grid : {}) };\n}\n\nexport function createRadarChart(container: HTMLElement, config: RadarChartConfig): ChartHandle<RadarSeriesConfig[]> {\n const { axes } = config;\n const curve = config.curve ?? 'linear';\n const fill = config.fill ?? 'solid';\n const showPoints = config.showPoints ?? true;\n const grid = resolveGrid(config.grid);\n const startAngle = toRadians(config.startAngle ?? 0);\n const angles = axisAngles(axes.length, startAngle);\n const labelGap = LABEL_GAP + (config.showValues ? VALUE_OFFSET : 0);\n const id = uniqueId('prism-radar');\n let series = config.series;\n\n warnOnInvalid(axes, series);\n\n const root = createSvgElement('g', { class: 'prism-radar' });\n const defs = createSvgElement('defs');\n const gridGroup = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-radar-grid' });\n const seriesGroup = createSvgElement('g', { class: 'prism-radar-series-group' });\n const labelGroup = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-radar-labels' });\n\n root.append(defs, gridGroup, seriesGroup, labelGroup);\n\n let drawn: number[][] = [];\n let activeTween: (() => void) | null = null;\n let activeIndex = -1;\n let layout = { cx: 0, cy: 0, radius: 0 };\n\n const datumAt = (s: RadarSeriesConfig, index: number) => s.data.find((d) => d.key === axes[index].key);\n const valuesAt = (index: number): RadarAxisValue[] => series.map((s) => ({ datum: datumAt(s, index), series: s }));\n const formatValue = (index: number, value: number): string => axes[index].format?.(value) ?? String(value);\n const describe = (index: number): string =>\n describeValues(axes[index].label, valuesAt(index), (value) => formatValue(index, value));\n\n function draw(fractions: number[][]): void {\n const { cx, cy, radius } = layout;\n\n fractions.forEach((row, i) => {\n const group = seriesGroup.children[i];\n\n if (!group) return;\n\n const points = radarPoints(row, cx, cy, radius, angles);\n\n group.querySelector('.prism-radar-area')?.setAttribute('d', closedPath(points, curve));\n group.querySelectorAll<SVGCircleElement>('.prism-radar-point').forEach((dot, j) => {\n setAttributes(dot, { cx: points[j].x, cy: points[j].y });\n });\n group.querySelectorAll<SVGTextElement>('.prism-radar-value').forEach((text, j) => {\n const r = radius * row[j] + VALUE_OFFSET;\n\n setAttributes(text, { x: polarX(cx, r, angles[j]), y: polarY(cy, r, angles[j]) });\n });\n });\n }\n\n function renderGrid(domains: [number, number][]): void {\n gridGroup.replaceChildren();\n\n if (!grid) return;\n\n const { cx, cy, radius } = layout;\n const levels = Math.max(1, Math.round(grid.levels));\n const rings = Array.from({ length: levels }, (_, k) =>\n ringPath(grid.shape, cx, cy, (radius * (k + 1)) / levels, angles),\n );\n\n if (grid.bands) {\n // Shade alternate rings, starting from the outermost.\n for (let k = levels - 1; k >= 0; k -= 2) {\n gridGroup.appendChild(\n createSvgElement('path', {\n class: 'prism-radar-band',\n d: `${rings[k]}${rings[k - 1] ?? ''}`,\n 'fill-rule': 'evenodd',\n }),\n );\n }\n }\n\n for (const d of rings)\n gridGroup.appendChild(createSvgElement('path', { class: 'prism-radar-ring', d, fill: 'none' }));\n\n angles.forEach((angle, i) => {\n gridGroup.appendChild(\n createSvgElement('line', {\n class: 'prism-radar-spoke',\n 'data-axis': i,\n x1: cx,\n x2: polarX(cx, radius, angle),\n y1: cy,\n y2: polarY(cy, radius, angle),\n }),\n );\n });\n\n const [d0, d1] = domains[0];\n const shared = domains.every(([a, b]) => a === d0 && b === d1);\n\n if (!grid.labels || !shared) return;\n\n // Between the first two spokes, so level values never collide with vertex values.\n const angle = angles[0] + Math.PI / angles.length;\n\n for (let k = 1; k <= levels; k++) {\n const r = (radius * k) / levels;\n const text = createSvgElement('text', {\n class: 'prism-radar-level',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n x: polarX(cx, r, angle),\n y: polarY(cy, r, angle),\n });\n\n text.textContent = formatValue(0, Math.round((d0 + ((d1 - d0) * k) / levels) * 100) / 100);\n gridGroup.appendChild(text);\n }\n }\n\n function renderLabels(): void {\n labelGroup.replaceChildren();\n\n const { cx, cy, radius } = layout;\n\n axes.forEach((axis, i) => {\n const { anchor, baseline } = labelPlacement(angles[i]);\n const text = createSvgElement('text', {\n class: 'prism-radar-axis-label',\n 'dominant-baseline': baseline,\n 'text-anchor': anchor,\n x: polarX(cx, radius + labelGap, angles[i]),\n y: polarY(cy, radius + labelGap, angles[i]),\n });\n\n text.textContent = axis.label;\n labelGroup.appendChild(text);\n });\n }\n\n function renderSeries(): void {\n const { cx, cy, radius } = layout;\n\n defs.replaceChildren();\n\n while (seriesGroup.children.length > series.length) seriesGroup.lastChild?.remove();\n\n series.forEach((s, i) => {\n const color = s.color ?? seriesColor(i);\n let group = seriesGroup.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-radar-series' });\n seriesGroup.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(s, i));\n\n group.replaceChildren();\n\n const area = createSvgElement('path', {\n class: `prism-radar-area prism-radar-area--${fill}`,\n stroke: color,\n 'stroke-linejoin': 'round',\n 'stroke-width': 2,\n });\n\n if (fill === 'gradient') {\n const gradientId = `${id}-fill-${i}`;\n const gradient = createSvgElement('radialGradient', {\n cx,\n cy,\n gradientUnits: 'userSpaceOnUse',\n id: gradientId,\n r: radius,\n });\n\n for (const [offset, opacity] of [\n [0, 0.08],\n [1, 0.55],\n ]) {\n gradient.appendChild(\n createSvgElement('stop', {\n offset,\n 'stop-color': color,\n 'stop-opacity': opacity,\n style: `stop-color:${color}`,\n }),\n );\n }\n\n defs.appendChild(gradient);\n setAttributes(area, { fill: `url(#${gradientId})` });\n } else {\n setAttributes(area, { fill: fill === 'none' ? 'none' : color, 'fill-opacity': 0.25 });\n }\n\n group.appendChild(area);\n\n if (showPoints) {\n axes.forEach((_, j) => {\n const missing = !Number.isFinite(datumAt(s, j)?.value);\n\n group.appendChild(\n createSvgElement('circle', {\n class: `prism-radar-point${missing ? ' prism-radar-point--missing' : ''}`,\n 'data-axis': j,\n fill: missing ? 'none' : color,\n r: 3,\n stroke: color,\n }),\n );\n });\n }\n\n if (config.showValues) {\n axes.forEach((_, j) => {\n const datum = datumAt(s, j);\n const { anchor, baseline } = labelPlacement(angles[j]);\n const text = createSvgElement('text', {\n 'aria-hidden': 'true',\n class: 'prism-radar-value',\n 'dominant-baseline': baseline,\n 'text-anchor': anchor,\n });\n\n text.textContent = datum && Number.isFinite(datum.value) ? formatValue(j, datum.value) : '';\n group.appendChild(text);\n });\n }\n });\n }\n\n function setActive(index: number): void {\n activeIndex = index;\n for (const el of root.querySelectorAll('[data-axis]')) {\n const active = Number(el.getAttribute('data-axis')) === index;\n\n el.classList.toggle(el.tagName === 'line' ? 'prism-radar-spoke--active' : 'prism-radar-point--active', active);\n }\n }\n\n function animateTo(targets: number[][], signal: AbortSignal): void {\n activeTween?.();\n\n const from = targets.map((row, i) => row.map((_, j) => drawn[i]?.[j] ?? 0));\n // Radar morphs a whole polygon, so it reads better slightly slower than the shared default.\n const motion = resolveMotion(config.transition, { defaultDuration: 400 });\n const easing = resolveEasing(motion.easing ?? 'ease-out');\n const unchanged = from.every((row, i) => row.every((v, j) => v === targets[i][j]));\n\n if (motion.duration === 0 || unchanged) {\n drawn = targets;\n draw(targets);\n\n return;\n }\n\n activeTween = startTween({\n count: targets.length,\n duration: motion.duration,\n easing,\n onFrame: (progress) => {\n drawn = targets.map((row, i) => {\n const e = progress(i);\n\n return row.map((to, j) => tweenNumber(from[i][j], to, e));\n });\n draw(drawn);\n },\n signal,\n stagger: motion.stagger,\n });\n }\n\n return createRadialScaffold(\n container,\n { a11y: config.a11y, legend: config.legend, tooltip: config.tooltip },\n (ctx): ChartEventHandlers | undefined => {\n const { legend, svg, tooltip } = ctx;\n\n if (!svg.contains(root)) svg.appendChild(root);\n\n tooltip?.hide();\n legend?.update(series.map((s, i) => ({ color: s.color ?? seriesColor(i), name: s.name })));\n\n if (axes.length < 3) {\n for (const group of [defs, gridGroup, seriesGroup, labelGroup]) group.replaceChildren();\n drawn = [];\n\n return undefined;\n }\n\n const { height, width } = ctx.dimensions;\n const radius = fitRadius(\n width,\n height,\n axes.map((axis) => axis.label),\n angles,\n LABEL_FONT_SIZE,\n labelGap,\n );\n\n layout = { cx: width / 2, cy: height / 2, radius };\n\n const domains = resolveAxisDomains(axes, series, config.domain);\n\n renderGrid(domains);\n renderLabels();\n renderSeries();\n animateTo(\n series.map((s) =>\n axes.map((_, j) => {\n const value = datumAt(s, j)?.value;\n\n return value !== undefined && Number.isFinite(value) ? normalize(value, domains[j]) : 0;\n }),\n ),\n ctx.disposalSignal,\n );\n setActive(activeIndex);\n\n const eventFor = (index: number, originalEvent: Event): RadarEvent => ({\n axis: axes[index],\n index,\n originalEvent,\n values: valuesAt(index),\n });\n\n const activate = (index: number, originalEvent: Event): void => {\n setActive(index);\n config.onHover?.(eventFor(index, originalEvent));\n\n const text = describe(index);\n\n if (!tooltip) {\n ctx.announcer.announce(text);\n\n return;\n }\n\n const reach = Math.max(0, ...drawn.map((row) => row[index] ?? 0));\n const svgRect = svg.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const values = valuesAt(index);\n const first = values.find((v) => v.datum)?.datum;\n const rows = values.flatMap(({ datum, series: s }) =>\n datum\n ? [\n {\n color: s.color ?? seriesColor(series.indexOf(s)),\n name: s.name,\n value: formatValue(index, datum.value),\n },\n ]\n : [],\n );\n\n tooltip.show(\n polarX(layout.cx, layout.radius * reach, angles[index]) + (svgRect.left - containerRect.left),\n polarY(layout.cy, layout.radius * reach, angles[index]) + (svgRect.top - containerRect.top),\n { key: axes[index].key, meta: { axis: axes[index], text, values }, value: first?.value ?? 0 },\n { color: series[0]?.color ?? seriesColor(0), data: [], name: axes[index].label },\n comparisonContent(svg.ownerDocument, axes[index].label, rows, text),\n );\n };\n\n const deactivate = (): void => {\n setActive(-1);\n config.onHover?.(null);\n tooltip?.hide();\n ctx.announcer.clear();\n };\n\n const hitIndex = (event: MouseEvent): number => {\n const rect = svg.getBoundingClientRect();\n const dx = event.clientX - rect.left - layout.cx;\n const dy = event.clientY - rect.top - layout.cy;\n\n if (Math.hypot(dx, dy) > layout.radius + labelGap + LABEL_FONT_SIZE * 2) return -1;\n\n return nearestAxis(dx, dy, axes.length, startAngle);\n };\n\n return {\n onClick(event) {\n const index = hitIndex(event);\n\n if (index >= 0) config.onClick?.(eventFor(index, event));\n },\n onKeyDown(event) {\n const step = ARROW_STEPS[event.key];\n\n if (step !== undefined) {\n event.preventDefault();\n activate(activeIndex < 0 ? 0 : (activeIndex + step + axes.length) % axes.length, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && activeIndex >= 0 && config.onClick) {\n event.preventDefault();\n config.onClick(eventFor(activeIndex, event));\n } else if (event.key === 'Escape') {\n deactivate();\n }\n },\n onMouseLeave: deactivate,\n onMouseMove(event) {\n const index = hitIndex(event);\n\n if (index < 0) {\n if (activeIndex >= 0) deactivate();\n } else if (index !== activeIndex) {\n activate(index, event);\n }\n },\n };\n },\n (next) => {\n series = next;\n warnOnInvalid(axes, series);\n },\n );\n}\n","import { warn } from '../../_dev';\nimport { createTappers } from '../../_tappers';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport { createChartBase } from '../../core/chart-base';\nimport { uniqueId } from '../../core/ids';\nimport { PrismRenderError } from '../../errors';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ChartHandle, PrismEvent, SparklineConfig, StackSegment } from '../../types';\n\n/** Fits the 3.5px hover marker plus its ring inside the SVG. */\nconst PLOT_INSET = 5;\n\nfunction buildTopPoints(data: number[], width: number, height: number): Point[] {\n if (data.length === 0) return [];\n\n const xStep = width / Math.max(1, data.length - 1);\n const min = Math.min(...data);\n const max = Math.max(...data);\n const yRange = max - min || 1;\n\n return data.map((v, i) => ({\n x: i * xStep,\n y: height - ((v - min) / yRange) * height,\n }));\n}\n\nfunction buildAreaPathFromPoints(top: Point[], height: number, curve: SparklineConfig['curve']): string {\n if (top.length === 0) return '';\n\n const bottom = top.map((p) => ({ x: p.x, y: height }));\n\n return areaPath(top, bottom, curve ?? 'linear');\n}\n\nfunction buildPathFromPoints(points: Point[], curve: SparklineConfig['curve']): string {\n if (points.length === 0) return '';\n\n return curve === 'monotone' ? monotonePath(points) : curve === 'step' ? stepPath(points) : linePath(points);\n}\n\nfunction isStackData(data: number[] | StackSegment[]): data is StackSegment[] {\n return data.length > 0 && data[0] !== null && typeof data[0] === 'object';\n}\n\nfunction buildRoundedStackRect(\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n roundLeft: boolean,\n roundRight: boolean,\n): string {\n const maxR = Math.min(r, w / 2, h / 2);\n const tl = roundLeft ? maxR : 0;\n const bl = roundLeft ? maxR : 0;\n const tr = roundRight ? maxR : 0;\n const br = roundRight ? maxR : 0;\n\n return [\n `M${x + tl},${y}`,\n `H${x + w - tr}`,\n tr ? `Q${x + w},${y} ${x + w},${y + tr}` : '',\n `V${y + h - br}`,\n br ? `Q${x + w},${y + h} ${x + w - br},${y + h}` : '',\n `H${x + bl}`,\n bl ? `Q${x},${y + h} ${x},${y + h - bl}` : '',\n `V${y + tl}`,\n tl ? `Q${x},${y} ${x + tl},${y}` : '',\n 'Z',\n ]\n .filter(Boolean)\n .join('');\n}\n\nfunction defaultStackColor(i: number): string {\n return `var(--prism-color-${(i % 8) + 1})`;\n}\n\nexport function createSparkline(\n container: HTMLElement,\n config: SparklineConfig,\n): ChartHandle<number[] | StackSegment[]> {\n const variant = config.variant ?? 'line';\n const color = config.color ?? 'var(--prism-color-1)';\n const curve = config.curve ?? 'linear';\n const strokeWidth = config.strokeWidth ?? 1.5;\n const fillOpacity = config.fillOpacity;\n const showEndPoint = config.showEndPoint ?? true;\n const gradientId = uniqueId('prism-spark-fill');\n const tappers = createTappers<PrismEvent>();\n const motion = resolveMotion(config.transition);\n const easing = resolveEasing(motion.easing);\n let data = config.data;\n // Values currently on screen (mid-tween included), in data space so a resize\n // never re-animates: every variant interpolates these and repaints.\n let drawnValues: number[] | null = null;\n let activeTween: (() => void) | null = null;\n\n const base = createChartBase(\n container,\n {\n a11y: config.a11y,\n margin: { bottom: 0, left: 0, right: 0, top: 0 },\n },\n () => {\n tappers.emit({ height: base.dimensions.height, type: 'resize', width: base.dimensions.width });\n renderAll();\n },\n );\n\n const { svg } = base;\n\n svg.classList.add('prism-sparkline');\n\n const innerGroup = createSvgElement('g', { class: 'prism-spark-inner' });\n\n svg.appendChild(innerGroup);\n\n let cleanupInteraction: (() => void) | undefined;\n\n /** Line and area plots are inset so dots on the first and last values are not clipped. */\n function plotArea(): { h: number; inset: number; w: number } {\n const { height, width } = base.dimensions;\n const inset = variant === 'line' || variant === 'area' ? PLOT_INSET : 0;\n\n return { h: Math.max(1, height - inset * 2), inset, w: Math.max(1, width - inset * 2) };\n }\n\n /**\n * Tweens the plotted values from what is on screen to `to`, repainting through\n * `paint`. A first render (or a length change, which has no per-index\n * predecessor) grows out of `floorValue`, the scale's minimum. Unchanged values\n * — a resize re-layout, for instance — repaint without animating.\n */\n function animateValues(to: number[], floorValue: number, paint: (values: number[]) => void): void {\n activeTween?.();\n\n const from = drawnValues?.length === to.length ? drawnValues : to.map(() => floorValue);\n const unchanged = from.every((value, i) => value === to[i]);\n\n if (unchanged || motion.duration === 0) {\n drawnValues = to;\n paint(to);\n\n return;\n }\n\n activeTween = startTween({\n count: 1,\n duration: motion.duration,\n easing,\n onFrame: (progress) => {\n const e = progress(0);\n const values = to.map((value, i) => tweenNumber(from[i], value, e));\n\n drawnValues = values;\n paint(values);\n },\n signal: ac.signal,\n });\n // Paint the starting geometry now: the tween only paints on its first frame\n // callback, which would otherwise leave one blank frame after mount.\n drawnValues = from;\n paint(from);\n }\n\n function renderAll(): void {\n const { height: h, width: w } = base.dimensions;\n const plot = plotArea();\n\n while (innerGroup.firstChild) innerGroup.removeChild(innerGroup.firstChild);\n\n innerGroup.setAttribute('transform', `translate(${plot.inset},${plot.inset})`);\n\n if (data.length === 0) {\n drawnValues = null;\n\n return;\n }\n\n if (!isStackData(data) && data.some((v) => !Number.isFinite(v))) {\n warn('createSparkline: data contains non-finite values; they are drawn as the minimum.');\n }\n\n if (variant === 'stack' && isStackData(data)) {\n const stackGroup = createSvgElement('g', { class: 'prism-spark-stack' });\n\n innerGroup.appendChild(stackGroup);\n\n const cornerRadius = config.cornerRadius ?? 4;\n const segs = data as StackSegment[];\n const total = segs.reduce((s, d) => s + Math.max(0, d.value), 0);\n const paths = segs.map((seg, i) => {\n const path = createSvgElement('path', { class: 'prism-spark-stack-segment' });\n\n setAttributes(path, { fill: seg.color ?? defaultStackColor(i) });\n stackGroup.appendChild(path);\n\n return path;\n });\n\n if (total > 0) {\n animateValues(\n segs.map((seg) => Math.max(0, seg.value)),\n 0,\n (values) => {\n const runningTotal = values.reduce((s, v) => s + v, 0) || 1;\n const half = (config.padPixels ?? 0) / 2;\n let xAcc = 0;\n\n values.forEach((value, i) => {\n const xStart = Math.round(xAcc);\n\n xAcc += (value / runningTotal) * w;\n\n const xEnd = i === values.length - 1 ? w : Math.round(xAcc);\n const isFirst = i === 0;\n const isLast = i === values.length - 1;\n const drawX = xStart + (isFirst ? 0 : half);\n const drawW = Math.max(0, xEnd - xStart - (isFirst ? 0 : half) - (isLast ? 0 : half));\n\n paths[i]?.setAttribute('d', buildRoundedStackRect(drawX, 0, drawW, h, cornerRadius, isFirst, isLast));\n });\n },\n );\n } else {\n // Nothing to draw: clear the recorded geometry so a later update cannot\n // interpolate from values that are no longer on screen.\n activeTween?.();\n drawnValues = null;\n }\n } else if (variant === 'bar') {\n const barsGroup = createSvgElement('g', { class: 'prism-spark-bars' });\n\n innerGroup.appendChild(barsGroup);\n\n const values = data as number[];\n const barMin = Math.min(0, ...values);\n const barRange = Math.max(...values) - barMin || 1;\n const barW = Math.max(1, w / values.length - 1);\n const gap = w / values.length;\n const rects = values.map(() => {\n const rect = createSvgElement('rect', { class: 'prism-spark-bar', fill: color });\n\n barsGroup.appendChild(rect);\n\n return rect;\n });\n\n animateValues(values, barMin, (frame) => {\n for (const [i, rect] of rects.entries()) {\n const barHeight = Math.max(1, ((frame[i] - barMin) / barRange) * h);\n\n setAttributes(rect, { height: barHeight, width: barW, x: i * gap, y: h - barHeight });\n }\n });\n } else {\n const values = data as number[];\n // The scale is fixed to the target values, so a tween moves points along\n // stable axes instead of wobbling as the domain follows each frame.\n const lineMin = Math.min(...values);\n const lineRange = Math.max(...values) - lineMin || 1;\n const xStep = plot.w / Math.max(1, values.length - 1);\n const pointsFromValues = (frame: number[]): Point[] =>\n frame.map((v, i) => ({ x: i * xStep, y: plot.h - ((v - lineMin) / lineRange) * plot.h }));\n\n let fill: SVGPathElement | null = null;\n\n if (variant === 'area') {\n const defs = createSvgElement('defs');\n const gradient = createSvgElement('linearGradient', { id: gradientId, x1: 0, x2: 0, y1: 0, y2: 1 });\n\n for (const [offset, className] of [\n [0, 'prism-spark-stop-top'],\n [1, 'prism-spark-stop-bottom'],\n ] as const) {\n const stop = createSvgElement('stop', { class: className, offset, 'stop-color': color });\n\n stop.style.stopColor = color;\n gradient.appendChild(stop);\n }\n\n defs.appendChild(gradient);\n innerGroup.appendChild(defs);\n\n fill = createSvgElement('path', { class: 'prism-spark-fill' });\n\n setAttributes(fill, { fill: `url(#${gradientId})`, stroke: 'none' });\n fill.style.fillOpacity = fillOpacity === undefined ? '' : String(fillOpacity);\n innerGroup.appendChild(fill);\n }\n\n const path = createSvgElement('path', { class: 'prism-spark-line' });\n\n setAttributes(path, { fill: 'none', stroke: color, 'stroke-width': strokeWidth });\n innerGroup.appendChild(path);\n\n const endDot =\n showEndPoint && values.length > 0\n ? createSvgElement('circle', { class: 'prism-spark-end', fill: color, r: 2.5 })\n : null;\n\n if (endDot) innerGroup.appendChild(endDot);\n\n animateValues(values, lineMin, (frame) => {\n const top = pointsFromValues(frame);\n\n setAttributes(path, { d: buildPathFromPoints(top, curve) });\n\n if (fill) setAttributes(fill, { d: buildAreaPathFromPoints(top, plot.h, curve) });\n\n const end = top.at(-1);\n\n if (endDot && end) setAttributes(endDot, { cx: end.x, cy: end.y });\n });\n }\n\n if (!isStackData(data)) attachInteraction(data as number[]);\n }\n\n function attachInteraction(data: number[]): void {\n cleanupInteraction?.();\n cleanupInteraction = undefined;\n\n if (!config.onHover && !config.onClick) return;\n\n if (data.length <= 1) return;\n\n const { h, inset, w } = plotArea();\n\n svg.style.cursor = 'crosshair';\n\n const xStep = w / (data.length - 1);\n const points = variant === 'bar' ? [] : buildTopPoints(data, w, h);\n const marker = createSvgElement('circle', { class: 'prism-spark-marker', fill: color, r: 3.5 });\n const indexAt = (clientX: number): number =>\n Math.max(0, Math.min(data.length - 1, Math.round((clientX - svg.getBoundingClientRect().left - inset) / xStep)));\n\n marker.style.display = 'none';\n innerGroup.appendChild(marker);\n\n const handleMove = (e: MouseEvent) => {\n const idx = indexAt(e.clientX);\n const point = points[idx];\n\n if (point) {\n setAttributes(marker, { cx: point.x, cy: point.y });\n marker.style.display = '';\n }\n\n config.onHover?.({ index: idx, originalEvent: e, value: data[idx] });\n };\n\n const handleLeave = () => {\n marker.style.display = 'none';\n config.onHover?.(null);\n };\n\n const handleClick = (e: MouseEvent) => {\n if (!config.onClick) return;\n\n const idx = indexAt(e.clientX);\n\n config.onClick({ index: idx, originalEvent: e, value: data[idx] });\n };\n\n svg.addEventListener('mousemove', handleMove);\n svg.addEventListener('mouseleave', handleLeave);\n svg.addEventListener('click', handleClick);\n\n cleanupInteraction = () => {\n svg.removeEventListener('mousemove', handleMove);\n svg.removeEventListener('mouseleave', handleLeave);\n svg.removeEventListener('click', handleClick);\n };\n }\n\n const ac = new AbortController();\n let isDisposed = false;\n\n try {\n renderAll();\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (isDisposed) return;\n\n isDisposed = true;\n tappers.emit({ type: 'dispose' });\n tappers.stop();\n ac.abort();\n cleanupInteraction?.();\n base.dispose();\n },\n\n get disposed(): boolean {\n return isDisposed;\n },\n\n el: svg,\n\n tap: tappers.tap,\n\n update(next) {\n if (isDisposed) throw new PrismRenderError('Cannot update a disposed chart.');\n data = next;\n renderAll();\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n } catch (error) {\n ac.abort();\n cleanupInteraction?.();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"prism.js","names":[],"sources":["../src/_dev.ts","../src/svg/element.ts","../src/svg/text.ts","../src/axes/scale-utils.ts","../src/axes/axis.ts","../src/axes/grid.ts","../src/scales/linear.ts","../src/scales/time.ts","../src/core/cartesian-scales.ts","../src/_tappers.ts","../src/errors.ts","../src/interaction/announcer.ts","../src/interaction/legend.ts","../src/interaction/tooltip.ts","../src/core/layout.ts","../src/core/responsive.ts","../src/core/chart-base.ts","../src/core/chart-scaffold.ts","../src/core/series-id.ts","../src/interaction/crosshair.ts","../src/core/cartesian-model.ts","../src/interaction/events.ts","../src/interaction/series-interaction.ts","../src/theme/index.ts","../src/animation/easing.ts","../src/animation/motion.ts","../src/animation/tween.ts","../src/animation/transition.ts","../src/core/datum-style.ts","../src/core/ids.ts","../src/svg/path.ts","../src/charts/area/area-renderer.ts","../src/charts/area/area-chart.ts","../src/scales/band.ts","../src/charts/bar/bar-hit-test.ts","../src/animation/reveal.ts","../src/charts/bar/bar-renderer.ts","../src/charts/bar/bar-chart.ts","../src/charts/line/line-renderer.ts","../src/charts/line/line-chart.ts","../src/core/polar.ts","../src/charts/pie/pie-renderer.ts","../src/charts/pie/pie-chart.ts","../src/charts/radar/radar-geometry.ts","../src/charts/radar/radar-chart.ts","../src/interaction/scatter-interaction.ts","../src/charts/scatter/scatter-renderer.ts","../src/charts/scatter/scatter-chart.ts","../src/charts/sparkline/sparkline.ts"],"sourcesContent":["/** @internal */\nconst isDev = !(globalThis as { __PRISM_PROD__?: boolean }).__PRISM_PROD__;\n\n/**\n * Emits a `console.warn` in development builds only.\n * @internal\n * @security Messages may include user-supplied data (e.g. category names, x-values).\n * Never pass PII, tokens, or secrets as chart data labels.\n */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/prism] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n","import { warn } from '../_dev';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nexport function createSvgElement<K extends keyof SVGElementTagNameMap>(\n tag: K,\n attrs?: Record<string, number | string | undefined>,\n): SVGElementTagNameMap[K] {\n const el = document.createElementNS(SVG_NS, tag);\n\n if (attrs) setAttributes(el, attrs);\n\n return el;\n}\n\nexport function setAttributes(el: SVGElement, attrs: Record<string, number | string | undefined>): void {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === undefined) {\n el.removeAttribute(key);\n\n continue;\n }\n\n if (typeof value === 'number' && !Number.isFinite(value)) {\n warn(\n `setAttributes: attribute \"${key}\" on <${el.tagName}> received a non-finite value (${value}): check upstream scale/geometry math for invalid input.`,\n );\n }\n\n el.setAttribute(key, String(value));\n }\n}\n\nexport function removeChildren(el: SVGElement): void {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n}\n","import { createSvgElement } from './element';\n\n/** Average glyph width relative to font size; jsdom cannot measure SVG text, so labels are estimated. */\nconst GLYPH_WIDTH = 0.6;\n\nexport function estimateTextWidth(text: string, fontSize: number): number {\n return text.length * fontSize * GLYPH_WIDTH;\n}\n\nexport function createTextElement(\n content: string,\n attrs?: Record<string, number | string | undefined>,\n): SVGTextElement {\n const text = createSvgElement('text', attrs);\n\n text.textContent = content;\n\n return text;\n}\n","import type { BandScale, Scale } from '../types';\n\nexport type AnyScale = BandScale | Scale<Date> | Scale<number>;\n\nfunction isBandScale(scale: AnyScale): scale is BandScale {\n return typeof (scale as BandScale).bandwidth === 'function';\n}\n\n/**\n * Maps a tick value through any of prism's three scale kinds, centering band-scale\n * ticks on their band (bandScale.map() returns a band's left edge by design).\n *\n * Overloaded so a caller's `tick` type must match the scale kind it's paired with :\n * `AxisConfig`/`GridConfig` accept any scale kind, so the runtime discrimination\n * inside the implementation is unavoidable, but the overload set keeps that a single\n * isolated cast here instead of an unchecked `Date | number | string` accepted at\n * every call site.\n */\nexport function mapTick(scale: BandScale, tick: string): number;\nexport function mapTick(scale: Scale<Date>, tick: Date): number;\nexport function mapTick(scale: Scale<number>, tick: number): number;\n// Fallback overload for callers (axis.ts/grid.ts) holding an already-erased `AnyScale`\n// union: the type-correlated overloads above are what protect a caller with a\n// narrower, known scale type from mismatching it with the wrong tick type.\nexport function mapTick(scale: AnyScale, tick: Date | number | string): number;\nexport function mapTick(scale: AnyScale, tick: Date | number | string): number {\n if (isBandScale(scale)) return scale.map(tick as string) + scale.bandwidth() / 2;\n\n return (scale as Scale<Date | number>).map(tick as Date | number);\n}\n","import { devOnly, warn } from '../_dev';\nimport { createSvgElement, removeChildren, setAttributes } from '../svg/element';\nimport { createTextElement, estimateTextWidth } from '../svg/text';\nimport type { AxisConfig, AxisPosition } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\n/** Default `--prism-font-size-label` in px, used to estimate category label size. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 8;\n\nconst COMPACT = new Intl.NumberFormat(undefined, { maximumSignificantDigits: 3, notation: 'compact' });\n\n/**\n * Dates localize; magnitudes of 1e5 and above render in compact notation (\"123K\",\n * \"1.23M\") so a long number cannot crop against the default 50 px value-axis margin.\n * With three significant digits every compact label is at most as wide as \"99999\",\n * the widest plain label below the threshold. Opt out with `tickFormat: String`.\n */\nconst defaultTickFormat = (v: Date | number | string): string => {\n if (v instanceof Date) return v.toLocaleDateString(undefined, { month: 'short', year: 'numeric' });\n if (typeof v === 'number' && Math.abs(v) >= 1e5) return COMPACT.format(v);\n\n return String(v);\n};\n\n/**\n * The single tick source for an axis and its gridlines: explicit `tickValues` when set,\n * scale-generated ticks otherwise. Keeping grid on this same array is what stops\n * gridlines from drifting off the rendered ticks.\n */\nexport function resolveTicks(scale: AnyScale, config: AxisConfig, tickCount: number): (Date | number | string)[] {\n return config.tickValues ? [...config.tickValues] : scale.ticks(tickCount);\n}\n\n/** Development-only check that explicit tickValues match the scale they render on. */\nfunction warnOffScaleTicks(scale: AnyScale, tickValues: ReadonlyArray<Date | number | string>): void {\n devOnly(() => {\n if ('bandwidth' in scale) {\n for (const tick of tickValues) {\n if (!scale.domain.includes(tick as string)) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is not a category in the band scale's domain.`);\n }\n }\n\n return;\n }\n\n const toMs = (v: Date | number): number => (v instanceof Date ? v.getTime() : v);\n const [a, b] = scale.domain;\n const lo = Math.min(toMs(a), toMs(b));\n const hi = Math.max(toMs(a), toMs(b));\n\n for (const tick of tickValues) {\n const value = tick instanceof Date ? tick.getTime() : Number(tick);\n\n if (Number.isNaN(value) || value < lo || value > hi) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is outside the axis domain and renders off-canvas.`);\n }\n }\n });\n}\n\n/**\n * Resolves the tick count an axis will render for a given scale/length: charts pass it to\n * `resolveTicks` for both the axis and its gridlines so the two stay aligned.\n * `defaultPosition` must match the one passed to the corresponding `renderAxis` call\n * ('bottom' for xAxis, 'left' for yAxis).\n */\nexport function positionAxis(parent: SVGGElement, position: AxisPosition, width: number, height: number): void {\n const transform =\n position === 'bottom' ? `translate(0,${height})` : position === 'right' ? `translate(${width},0)` : undefined;\n\n if (transform) parent.setAttribute('transform', transform);\n else parent.removeAttribute('transform');\n}\n\nexport function resolveTickCount(config: AxisConfig, length: number, defaultPosition: AxisPosition): number {\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const defaultTickCount = isHorizontal ? Math.max(2, Math.floor(length / 80)) : Math.max(2, Math.floor(length / 50));\n\n return config.tickCount ?? defaultTickCount;\n}\n\n/** How many category labels fit along the axis without their estimated boxes overlapping. */\nfunction categoryTickCount(\n domain: readonly string[],\n format: (value: string) => string,\n length: number,\n isHorizontal: boolean,\n): number {\n if (domain.length === 0) return 0;\n\n const size = isHorizontal\n ? Math.max(...domain.map((value) => estimateTextWidth(format(value), LABEL_FONT_SIZE)))\n : LABEL_FONT_SIZE * 1.3;\n\n return Math.max(1, Math.min(domain.length, Math.floor(length / (size + LABEL_GAP))));\n}\n\n/**\n * `defaultPosition` is applied when `config.position` is unset: pass `'bottom'` for an\n * xAxis call and `'left'` for a yAxis call so an unconfigured axis renders on its\n * conventional side instead of always defaulting to a horizontal bottom axis.\n */\nexport function renderAxis(\n parent: SVGGElement,\n scale: AnyScale,\n config: AxisConfig,\n length: number,\n defaultPosition: AxisPosition = 'bottom',\n): void {\n removeChildren(parent);\n\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const isInverted = position === 'top' || position === 'left';\n const tickSize = 6;\n const tickDirection = isInverted ? -1 : 1;\n\n const axisLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-line',\n x1: isHorizontal ? 0 : 0,\n x2: isHorizontal ? length : 0,\n y1: isHorizontal ? 0 : 0,\n y2: isHorizontal ? 0 : length,\n });\n\n parent.appendChild(axisLine);\n\n const format = config.tickFormat ?? defaultTickFormat;\n const tickCount =\n config.tickCount === undefined && 'bandwidth' in scale\n ? categoryTickCount(scale.domain, format, length, isHorizontal)\n : resolveTickCount(config, length, defaultPosition);\n const ticks = resolveTicks(scale, config, tickCount);\n\n if (config.tickValues) warnOffScaleTicks(scale, config.tickValues);\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const tickLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-tick',\n x1: isHorizontal ? pos : 0,\n x2: isHorizontal ? pos : tickSize * tickDirection,\n y1: isHorizontal ? 0 : pos,\n y2: isHorizontal ? tickSize * tickDirection : pos,\n });\n\n parent.appendChild(tickLine);\n\n const label = createTextElement(format(tick), {\n 'aria-hidden': 'true',\n class: 'prism-axis-label',\n 'dominant-baseline': isHorizontal ? (isInverted ? 'auto' : 'hanging') : 'middle',\n 'text-anchor': isHorizontal ? 'middle' : isInverted ? 'end' : 'start',\n x: isHorizontal ? pos : tickSize * tickDirection * 1.5,\n y: isHorizontal ? tickSize * tickDirection * 1.5 : pos,\n });\n\n parent.appendChild(label);\n }\n\n if (config.label) {\n const labelEl = createTextElement(config.label, {\n class: 'prism-axis-title',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n });\n\n if (isHorizontal) {\n setAttributes(labelEl, { x: length / 2, y: tickSize * tickDirection * 6 });\n } else {\n setAttributes(labelEl, {\n transform: `translate(${tickSize * tickDirection * 7}, ${length / 2}) rotate(-90)`,\n });\n }\n\n parent.appendChild(labelEl);\n }\n}\n","import { createSvgElement, removeChildren } from '../svg/element';\nimport type { GridConfig } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\nexport function renderGrid(\n parent: SVGGElement,\n scale: AnyScale,\n config: GridConfig | true,\n crossLength: number,\n direction: 'horizontal' | 'vertical',\n ticks: readonly (Date | number | string)[],\n): void {\n removeChildren(parent);\n\n const color = (config !== true && config.color) || undefined;\n const dash = (config !== true && config.dash) || undefined;\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const attrs: Record<string, number | string | undefined> = {\n class: 'prism-grid-line',\n stroke: color ?? 'var(--prism-grid-color)',\n 'stroke-dasharray': dash,\n 'stroke-opacity': 'var(--prism-grid-opacity)',\n };\n\n if (direction === 'vertical') {\n Object.assign(attrs, { x1: pos, x2: pos, y1: 0, y2: crossLength });\n } else {\n Object.assign(attrs, { x1: 0, x2: crossLength, y1: pos, y2: pos });\n }\n\n parent.appendChild(createSvgElement('line', attrs));\n }\n}\n","import type { Scale } from '../types';\nimport type { LinearScaleConfig } from './types';\n\nfunction niceNumber(value: number, round: boolean): number {\n const exp = Math.floor(Math.log10(value));\n const frac = value / 10 ** exp;\n let nice: number;\n\n if (round) {\n if (frac < 1.5) nice = 1;\n else if (frac < 3) nice = 2;\n else if (frac < 7) nice = 5;\n else nice = 10;\n } else {\n if (frac <= 1) nice = 1;\n else if (frac <= 2) nice = 2;\n else if (frac <= 5) nice = 5;\n else nice = 10;\n }\n\n return nice * 10 ** exp;\n}\n\nfunction niceRange(min: number, max: number, tickCount: number): [number, number] {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1];\n\n if (min > max) [min, max] = [max, min];\n\n if (min === max) return [min - 1, max + 1];\n\n const range = niceNumber(max - min, false);\n const step = niceNumber(range / Math.max(1, tickCount - 1), true);\n\n return [Math.floor(min / step) * step, Math.ceil(max / step) * step];\n}\n\nexport function linearScale(config: LinearScaleConfig): Scale<number> {\n // Every method below closes over `config`/these helpers directly instead of reading\n // `this`: the returned object stays fully functional when destructured, e.g.\n // `const { map } = linearScale(cfg)`.\n const getDomain = (): [number, number] =>\n config.nice === false ? config.domain : niceRange(config.domain[0], config.domain[1], 10);\n const getRange = (): [number, number] => config.range;\n\n return {\n get domain(): [number, number] {\n return getDomain();\n },\n\n invert(pixel: number): number {\n const [d0, d1] = getDomain();\n const [r0, r1] = getRange();\n\n if (r1 === r0) return d0;\n\n const t = (pixel - r0) / (r1 - r0);\n\n return d0 + t * (d1 - d0);\n },\n\n map(value: number): number {\n const [d0, d1] = getDomain();\n const [r0, r1] = getRange();\n\n if (d1 === d0) return r0;\n\n let t = (value - d0) / (d1 - d0);\n\n if (config.clamp) {\n t = Math.max(0, Math.min(1, t));\n }\n\n return r0 + t * (r1 - r0);\n },\n\n get range(): [number, number] {\n return getRange();\n },\n\n ticks(count = 10): number[] {\n if (count <= 0) return [];\n\n const [d0, d1] = getDomain();\n\n if (d0 === d1 || count === 1) return [d0];\n\n // Normalize ordering so a reversed domain (e.g. an explicitly inverted axis with\n // `nice: false`) doesn't feed a negative range into niceNumber()'s Math.log10.\n const lo = Math.min(d0, d1);\n const hi = Math.max(d0, d1);\n const range = niceNumber(hi - lo, false);\n const step = niceNumber(range / (count - 1), true);\n const start = Math.ceil(lo / step) * step;\n const end = Math.floor(hi / step) * step;\n const ticks: number[] = [];\n\n for (let v = start; v <= end + step * 0.5; v += step) {\n ticks.push(Math.round(v * 1e12) / 1e12);\n }\n\n return ticks;\n },\n };\n}\n","import type { Scale } from '../types';\nimport type { TimeScaleConfig } from './types';\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst MONTH = 30 * DAY;\nconst YEAR = 365 * DAY;\n\nconst TIME_INTERVALS = [\n SECOND,\n 5 * SECOND,\n 15 * SECOND,\n 30 * SECOND,\n MINUTE,\n 5 * MINUTE,\n 15 * MINUTE,\n 30 * MINUTE,\n HOUR,\n 3 * HOUR,\n 6 * HOUR,\n 12 * HOUR,\n DAY,\n 7 * DAY,\n MONTH,\n 3 * MONTH,\n 6 * MONTH,\n YEAR,\n];\n\nfunction chooseInterval(range: number, count: number): number {\n const target = Math.abs(range) / Math.max(1, count);\n\n for (const interval of TIME_INTERVALS) {\n if (interval >= target) return interval;\n }\n\n return YEAR;\n}\n\nfunction niceDomain(domain: [Date, Date], count: number): [Date, Date] {\n let [d0, d1] = domain;\n\n if (d0.getTime() > d1.getTime()) [d0, d1] = [d1, d0];\n\n const range = d1.getTime() - d0.getTime();\n const interval = chooseInterval(range, count);\n\n return [\n new Date(Math.floor(d0.getTime() / interval) * interval),\n new Date(Math.ceil(d1.getTime() / interval) * interval),\n ];\n}\n\nexport function timeScale(config: TimeScaleConfig): Scale<Date> {\n // Every method below closes over `config`/these helpers directly instead of reading\n // `this`: the returned object stays fully functional when destructured, e.g.\n // `const { map } = timeScale(cfg)`.\n const getDomain = (): [Date, Date] => (config.nice === false ? config.domain : niceDomain(config.domain, 10));\n const getRange = (): [number, number] => config.range;\n\n return {\n get domain(): [Date, Date] {\n return getDomain();\n },\n\n invert(pixel: number): Date {\n const [d0, d1] = getDomain();\n const [r0, r1] = getRange();\n\n if (r1 === r0) return d0;\n\n const t = (pixel - r0) / (r1 - r0);\n\n return new Date(d0.getTime() + t * (d1.getTime() - d0.getTime()));\n },\n\n map(value: Date): number {\n const [d0, d1] = getDomain();\n const [r0, r1] = getRange();\n const dRange = d1.getTime() - d0.getTime();\n\n if (dRange === 0) return r0;\n\n const t = (value.getTime() - d0.getTime()) / dRange;\n\n return r0 + t * (r1 - r0);\n },\n\n get range(): [number, number] {\n return getRange();\n },\n\n ticks(count = 10): Date[] {\n const [d0, d1] = getDomain();\n const range = d1.getTime() - d0.getTime();\n const interval = chooseInterval(range, count);\n const start = Math.ceil(d0.getTime() / interval) * interval;\n const ticks: Date[] = [];\n\n for (let t = start; t <= d1.getTime(); t += interval) {\n ticks.push(new Date(t));\n }\n\n return ticks;\n },\n };\n}\n","import { warn } from '../_dev';\nimport { linearScale } from '../scales/linear';\nimport { timeScale } from '../scales/time';\nimport type { Scale } from '../types';\n\nexport function buildXScale(allX: (Date | number)[], width: number): Scale<Date> | Scale<number> {\n if (allX.length === 0) return linearScale({ domain: [0, 1], range: [0, width] });\n\n if (allX.some((v) => v == null)) {\n warn(\n 'buildXScale: one or more x values are null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX.some((v) => typeof v === 'number' && !Number.isFinite(v))) {\n warn('buildXScale: one or more x values are NaN or Infinity: check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX[0] instanceof Date) {\n const dates = allX as Date[];\n const minMs = Math.min(...dates.map(Number));\n const maxMs = Math.max(...dates.map(Number));\n const min = new Date(minMs);\n const max = new Date(minMs === maxMs ? maxMs + 1 : maxMs);\n\n return timeScale({ domain: [min, max], nice: false, range: [0, width] });\n }\n\n const nums = allX as number[];\n const minN = Math.min(...nums);\n const maxN = Math.max(...nums);\n\n return linearScale({ domain: [minN, minN === maxN ? maxN + 1 : maxN], nice: false, range: [0, width] });\n}\n\nexport function buildYScale(allY: number[], height: number, includeZero = true): Scale<number> {\n if (allY.length === 0) return linearScale({ domain: [0, 1], range: [height, 0] });\n\n if (allY.some((v) => v == null)) {\n warn(\n 'buildYScale: one or more y values are null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n if (allY.some((v) => !Number.isFinite(v))) {\n warn('buildYScale: one or more y values are NaN or Infinity: check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n const rawMin = Math.min(...allY);\n const minY = includeZero ? Math.min(0, rawMin) : rawMin;\n const maxY = Math.max(...allY);\n\n return linearScale({ domain: [minY, minY === maxY ? maxY + 1 : maxY], range: [height, 0] });\n}\n","/**\n * Shared `tap()` machinery for chart handles.\n *\n * @internal Private to the package: consumers observe charts through\n * `ChartHandle.tap()`, never through this module.\n */\n\nexport interface Tappers<E extends { readonly type: string }> {\n /** Delivers `event` to every registered handler, swallowing handler errors. */\n emit(event: E): void;\n /** Clears every handler; later `tap()` calls return a no-op unsubscribe. */\n stop(): void;\n tap(handler: (event: E) => void, options?: { readonly signal?: AbortSignal }): () => void;\n}\n\nexport function createTappers<E extends { readonly type: string }>(): Tappers<E> {\n const tappers = new Set<(event: E) => void>();\n let stopped = false;\n\n return {\n emit(event) {\n // Zero-overhead guard: observation costs nothing while nobody is watching.\n if (tappers.size === 0) return;\n\n for (const handler of tappers) {\n try {\n handler(event);\n } catch {\n // Observability must never affect chart behavior.\n }\n }\n },\n stop() {\n stopped = true;\n tappers.clear();\n },\n tap(handler, options) {\n if (stopped || options?.signal?.aborted) return () => {};\n\n tappers.add(handler);\n\n const detach = (): void => {\n tappers.delete(handler);\n };\n\n options?.signal?.addEventListener('abort', detach, { once: true });\n\n return detach;\n },\n };\n}\n","/** Base class for all prism errors. Use `instanceof PrismError` to catch any prism-originated error. */\nexport class PrismError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a chart is given a structurally invalid configuration it cannot render at all (e.g. a non-Element `container`). Recoverable issues like empty or malformed data emit a dev-mode warning instead: see the package docs for details. */\nexport class PrismRenderError extends PrismError {}\n","import { createSvgElement } from '../svg/element';\nimport type { Datum, Series } from '../types';\n\nexport interface Announcer {\n announce(text: string): void;\n clear(): void;\n}\n\n/** \"Label: A 6, B 9\": the comparison text shared by tooltips and announcements. */\nexport function describeValues(\n label: string,\n values: readonly { datum: Datum | undefined; series: Series }[],\n format: (value: number, datum: Datum, series: Series) => string = String,\n): string {\n return `${label}: ${values\n .map(({ datum, series }) => `${series.name} ${datum ? format(datum.value, datum, series) : 'n/a'}`)\n .join(', ')}`;\n}\n\n/** Polite status region for charts whose visuals are aria-hidden. */\nexport function createAnnouncer(parent: SVGElement, className: string): Announcer {\n // Off-canvas rather than CSS-hidden so announcements work without prism's stylesheet.\n const region = createSvgElement('text', {\n 'aria-live': 'polite',\n class: className,\n role: 'status',\n x: -9999,\n y: -9999,\n });\n\n parent.appendChild(region);\n\n return {\n announce(text) {\n region.textContent = text;\n },\n clear() {\n region.textContent = '';\n },\n };\n}\n","import type { LegendConfig, LegendPosition } from '../types';\n\nexport interface LegendState {\n dispose(): void;\n el: HTMLDivElement | null;\n update(series: { color: string; name: string }[]): void;\n [Symbol.dispose](): void;\n}\n\nfunction resolvePosition(config: LegendConfig | true): LegendPosition {\n if (config === true) return 'bottom';\n\n return config.position ?? 'bottom';\n}\n\nexport function createLegend(container: HTMLElement, config: LegendConfig | true, onLayout?: () => void): LegendState {\n const position = resolvePosition(config);\n const el = document.createElement('div');\n\n el.className = `prism-legend prism-legend-${position}`;\n\n if (position === 'top') {\n container.insertBefore(el, container.firstChild);\n } else {\n container.appendChild(el);\n }\n\n const disposeHandle = (): void => {\n el.remove();\n };\n\n return {\n dispose: disposeHandle,\n el,\n [Symbol.dispose]: disposeHandle,\n update(series) {\n el.replaceChildren();\n for (const s of series) {\n const item = document.createElement('div');\n\n item.className = 'prism-legend-item';\n\n const dot = document.createElement('span');\n\n dot.className = 'prism-legend-dot';\n dot.style.backgroundColor = s.color;\n\n const label = document.createElement('span');\n\n label.className = 'prism-legend-label';\n label.textContent = s.name;\n\n item.appendChild(dot);\n item.appendChild(label);\n el.appendChild(item);\n }\n onLayout?.();\n },\n };\n}\n","import { computePosition, flip, getClippingAncestorRect, offset, type Rect, shift } from '@vielzeug/orbit';\nimport type { Datum, Series, TooltipConfig } from '../types';\n\nexport interface TooltipRow {\n color: string;\n name: string;\n value: string;\n}\n\n/** Inline so the spoken text stays hidden even without prism's stylesheet. */\nconst SCREEN_READER_ONLY =\n 'position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap';\n\n/**\n * The shift boundary: the chart container intersected with the tooltip's clipping-ancestor\n * rect (what a host `overflow: hidden` actually shows). Clamping to the container alone would\n * let the tooltip sit inside a container that is itself clipped by a smaller ancestor; the\n * intersection keeps it inside what is actually visible. A degenerate intersection (zero area)\n * falls back to the container rect.\n */\nfunction shiftBoundary(container: HTMLElement, tooltip: HTMLElement): Rect {\n const box = container.getBoundingClientRect();\n const containerRect: Rect = { height: box.height, width: box.width, x: box.x, y: box.y };\n const visible = getClippingAncestorRect(tooltip);\n const x = Math.max(containerRect.x, visible.x);\n const y = Math.max(containerRect.y, visible.y);\n const right = Math.min(containerRect.x + containerRect.width, visible.x + visible.width);\n const bottom = Math.min(containerRect.y + containerRect.height, visible.y + visible.height);\n\n if (right <= x || bottom <= y) return containerRect;\n\n return { height: bottom - y, width: right - x, x, y };\n}\n\n/**\n * Title plus one swatch row per series; text only, so data is never parsed as HTML.\n * `spoken` is what the tooltip's live region announces; the visual rows are aria-hidden.\n */\nexport function comparisonContent(\n doc: Document,\n title: string,\n rows: readonly TooltipRow[],\n spoken: string,\n): HTMLElement {\n const body = doc.createElement('div');\n const sr = doc.createElement('span');\n const visual = doc.createElement('div');\n const head = doc.createElement('div');\n\n body.className = 'prism-tooltip-body';\n sr.className = 'prism-tooltip-sr';\n sr.style.cssText = SCREEN_READER_ONLY;\n sr.textContent = spoken;\n visual.setAttribute('aria-hidden', 'true');\n head.className = 'prism-tooltip-title';\n head.textContent = title;\n visual.appendChild(head);\n\n for (const row of rows) {\n const line = doc.createElement('div');\n const swatch = doc.createElement('span');\n const name = doc.createElement('span');\n const value = doc.createElement('span');\n\n line.className = 'prism-tooltip-row';\n swatch.className = 'prism-tooltip-swatch';\n swatch.style.setProperty('--prism-swatch', row.color);\n name.className = 'prism-tooltip-name';\n name.textContent = row.name;\n value.className = 'prism-tooltip-value';\n value.textContent = row.value;\n line.append(swatch, name, value);\n visual.appendChild(line);\n }\n\n body.append(sr, visual);\n\n return body;\n}\n\nexport interface TooltipState {\n dispose(): void;\n el: HTMLDivElement | null;\n hide(): void;\n /** `content` replaces the default `series: value` body when no custom `render` is configured. */\n show(x: number, y: number, datum: Datum, series: Series, content?: Node | string): void;\n [Symbol.dispose](): void;\n}\n\nexport function createTooltip(container: HTMLElement, config?: TooltipConfig | true): TooltipState {\n const previousPosition = container.style.position;\n const changedPosition = getComputedStyle(container).position === 'static';\n\n if (changedPosition) container.style.position = 'relative';\n\n const el = container.ownerDocument.createElement('div');\n\n el.className = 'prism-tooltip';\n el.style.position = 'absolute';\n el.style.pointerEvents = 'none';\n el.style.top = '0';\n el.style.left = '0';\n // Non-modal status text: announced by assistive tech whenever content/hide state changes.\n el.setAttribute('role', 'status');\n el.setAttribute('aria-live', 'polite');\n container.appendChild(el);\n\n const tooltipOffset: number = (config !== true && config?.offset) || 8;\n const render = config !== true ? config?.render : undefined;\n\n // Opacity stays inline (the transition is declared in CSS against the token\n // duration); the class carries the rise, which needs to combine with the\n // left/top positioning without fighting it.\n const setVisible = (next: boolean): void => {\n el.classList.toggle('prism-tooltip--visible', next);\n el.style.opacity = next ? '1' : '0';\n };\n\n let revealFrame: number | null = null;\n let clearTimer: ReturnType<typeof setTimeout> | null = null;\n let visible = false;\n\n const cancelClear = (): void => {\n if (clearTimer === null) return;\n\n clearTimeout(clearTimer);\n clearTimer = null;\n };\n\n const cancelReveal = (): void => {\n if (revealFrame === null) return;\n\n cancelAnimationFrame(revealFrame);\n revealFrame = null;\n };\n\n const disposeHandle = (): void => {\n cancelReveal();\n cancelClear();\n el.remove();\n if (changedPosition && container.style.position === 'relative') container.style.position = previousPosition;\n };\n\n return {\n dispose: disposeHandle,\n el,\n hide() {\n cancelReveal();\n cancelClear();\n visible = false;\n setVisible(false);\n clearTimer = setTimeout(() => {\n clearTimer = null;\n\n if (!visible) el.textContent = '';\n }, 150);\n },\n show(x: number, y: number, datum: Datum, series: Series, content?: Node | string) {\n if (!container.isConnected) return;\n\n cancelClear();\n\n const body = render ? render(datum, series) : (content ?? `${series.name}: ${datum.value}`);\n\n if (typeof body === 'string') el.textContent = body;\n else el.replaceChildren(body);\n\n const virtualRef = {\n getBoundingClientRect: () => {\n const rect = container.getBoundingClientRect();\n\n return {\n bottom: rect.top + y,\n height: 0,\n left: rect.left + x,\n right: rect.left + x,\n top: rect.top + y,\n width: 0,\n x: rect.left + x,\n y: rect.top + y,\n };\n },\n };\n\n const { x: positionX, y: positionY } = computePosition(virtualRef, el, {\n containingBlock: container,\n middleware: [offset(tooltipOffset), flip(), shift({ boundary: shiftBoundary(container, el), padding: 8 })],\n placement: 'top',\n });\n\n el.style.left = `${positionX}px`;\n el.style.top = `${positionY}px`;\n\n if (visible) {\n if (revealFrame === null) setVisible(true);\n\n return;\n }\n\n visible = true;\n setVisible(false);\n // One frame at the hidden state first: without it the browser has no\n // starting value to transition from and the tooltip would just appear.\n revealFrame = requestAnimationFrame(() => {\n revealFrame = null;\n\n if (visible) setVisible(true);\n });\n },\n [Symbol.dispose]: disposeHandle,\n };\n}\n","import type { ChartMargin } from '../types';\n\nconst DEFAULT_MARGIN: ChartMargin = { bottom: 48, left: 50, right: 20, top: 20 };\n\nexport function resolveMargin(margin?: Partial<ChartMargin>): ChartMargin {\n return { ...DEFAULT_MARGIN, ...margin };\n}\n\nexport function chartArea(width: number, height: number, margin: ChartMargin): { height: number; width: number } {\n return {\n height: Math.max(0, height - margin.top - margin.bottom),\n width: Math.max(0, width - margin.left - margin.right),\n };\n}\n","export function observeResize(el: HTMLElement, callback: (width: number, height: number) => void): () => void {\n // Environments without ResizeObserver (jsdom, SSR) get a no-op subscription: the chart\n // keeps its initial getBoundingClientRect size and never observes, instead of throwing.\n if (typeof ResizeObserver === 'undefined') return () => {};\n\n let rafId: number | null = null;\n\n const observer = new ResizeObserver((entries) => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n rafId = requestAnimationFrame(() => {\n rafId = null;\n\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n callback(width, height);\n }\n });\n });\n\n observer.observe(el);\n\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n observer.disconnect();\n };\n}\n","import { warn } from '../_dev';\nimport { PrismRenderError } from '../errors';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { ChartA11y, ChartDimensions, ChartMargin } from '../types';\nimport { resolveMargin } from './layout';\nimport { observeResize } from './responsive';\n\nexport interface ChartBase {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n dispose(): void;\n svg: SVGSVGElement;\n syncChrome(): void;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: {\n a11y?: ChartA11y;\n /**\n * The chart's own in-flow chrome inside the container (the legend). Its height is\n * subtracted from every resize-driven svg height: the container's content box contains\n * the svg plus this chrome, so assigning the full content height back to the svg would\n * grow the container by the chrome's height on every pass — unbounded growth in any\n * auto-height container. Subtracting it makes the layout converge on the fixed point\n * `container = svg + chrome` instead.\n */\n chrome?: () => HTMLElement | null;\n margin?: Partial<ChartMargin>;\n },\n onResize?: () => void,\n): ChartBase {\n // Duck-typed rather than `instanceof Element`: an `instanceof` check would reject a\n // structurally valid Element from a different realm (e.g. an Element created via\n // `iframe.contentDocument.createElement(...)`, whose prototype chain terminates in that\n // iframe's own `Element` constructor), which is a legitimate usage pattern this package\n // doesn't otherwise restrict.\n const isElementLike =\n typeof container === 'object' &&\n container !== null &&\n container.nodeType === 1 &&\n typeof container.appendChild === 'function' &&\n typeof container.getBoundingClientRect === 'function';\n\n if (!isElementLike) {\n const received: unknown = container;\n const kind =\n received === null\n ? 'null'\n : typeof received === 'object'\n ? (received.constructor?.name ?? 'object')\n : typeof received;\n\n throw new PrismRenderError(`Invalid chart configuration: \\`container\\` must be a DOM Element, received ${kind}.`);\n }\n\n const margin = resolveMargin(options.margin);\n const a11y = options.a11y;\n const svg = createSvgElement('svg', {\n ...(!a11y || a11y.decorative\n ? { 'aria-hidden': 'true' }\n : { 'aria-label': a11y.ariaLabel, role: 'img', tabindex: '0' }),\n class: 'prism-chart',\n // The svg's width/height attributes are its single source of sizing truth (set below and\n // on every resize pass, chrome excluded). CSS percentage sizing here would override the\n // attributes: `height: 100%` fills the whole container, so the in-flow legend rides past\n // the container's edge instead of inside the height the resize pass reserved for it.\n style: 'display:block;max-width:100%',\n });\n\n const chartAreaGroup = createSvgElement('g', {\n class: 'prism-chart-area',\n transform: `translate(${margin.left},${margin.top})`,\n });\n\n svg.appendChild(chartAreaGroup);\n\n const rect = container.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0) {\n warn(\n 'Chart container has zero dimensions. Ensure the container has a defined width and height before mounting a chart.',\n );\n }\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\n\n const dimensions: ChartDimensions = {\n height: initialHeight,\n margin,\n width: initialWidth,\n };\n\n // The dimensions the svg currently carries. A resize pass only re-renders when the\n // effective drawing size moves away from these.\n let appliedWidth = initialWidth;\n let appliedHeight = initialHeight;\n let containerHeight = initialHeight;\n\n // Legend updates reserve their space synchronously, before a renderer builds scales.\n const syncChrome = (): void => {\n const height = Math.max(0, containerHeight - (options.chrome?.()?.offsetHeight ?? 0));\n\n appliedHeight = height;\n dimensions.height = height;\n setAttributes(svg, { height, viewBox: `0 0 ${dimensions.width} ${height}` });\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n containerHeight = height;\n const chromeHeight = options.chrome?.()?.offsetHeight ?? 0;\n const svgHeight = Math.max(0, height - chromeHeight);\n\n // A ResizeObserver fires once for the initial observation, at the size the chart was\n // already built at. Re-rendering there is a no-op for layout but cancels a mount\n // entrance still in flight (the renderers treat the redraw as an already-drawn\n // update and snap to final), so a chart would never animate on first paint. Skip the\n // pass unless the effective size — legend chrome included — has genuinely changed.\n if (width === appliedWidth && svgHeight === appliedHeight) return;\n\n appliedWidth = width;\n appliedHeight = svgHeight;\n dimensions.height = svgHeight;\n dimensions.width = width;\n setAttributes(svg, { height: svgHeight, viewBox: `0 0 ${width} ${svgHeight}`, width });\n onResize?.();\n });\n\n setAttributes(svg, {\n height: initialHeight,\n viewBox: `0 0 ${initialWidth} ${initialHeight}`,\n width: initialWidth,\n });\n\n container.appendChild(svg);\n\n return {\n chartArea: chartAreaGroup,\n dimensions,\n dispose() {\n stopObserving();\n svg.remove();\n },\n svg,\n syncChrome,\n };\n}\n","import { createTappers } from '../_tappers';\nimport { PrismRenderError } from '../errors';\nimport { type Announcer, createAnnouncer } from '../interaction/announcer';\nimport type { CrosshairState } from '../interaction/crosshair';\nimport type { LegendState } from '../interaction/legend';\nimport { createLegend } from '../interaction/legend';\nimport type { TooltipState } from '../interaction/tooltip';\nimport { createTooltip } from '../interaction/tooltip';\nimport { createSvgElement, removeChildren } from '../svg/element';\nimport type { BaseChartConfig, ChartDimensions, ChartHandle, PrismEvent } from '../types';\nimport { createChartBase } from './chart-base';\n\nexport interface ScaffoldGroups {\n grid: SVGGElement;\n series: SVGGElement;\n xAxis: SVGGElement;\n yAxis: SVGGElement;\n}\n\n/**\n * Clears a cartesian chart's series/grid/axis groups and hides its legend/tooltip/crosshair :\n * shared by every cartesian chart factory's \"no data\" early-return so an update\n * to empty data leaves a fully blank chart, not a half-cleared one.\n */\nexport function clearCartesianDom(\n groups: ScaffoldGroups,\n legend: LegendState | null,\n tooltip: TooltipState | null,\n crosshair?: CrosshairState | null,\n): void {\n removeChildren(groups.series);\n removeChildren(groups.grid);\n removeChildren(groups.xAxis);\n removeChildren(groups.yAxis);\n legend?.update([]);\n tooltip?.hide();\n crosshair?.hide();\n}\n\nexport interface ScaffoldContext {\n /** Speaks hover/keyboard values when no tooltip is shown (the tooltip is its own live region). */\n announcer: Announcer;\n chartArea: SVGGElement;\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed: renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n groups: ScaffoldGroups;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface RadialScaffoldContext {\n announcer: Announcer;\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed: renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface ChartEventHandlers {\n onClick?: (event: MouseEvent) => void;\n onKeyDown?: (event: KeyboardEvent) => void;\n onMouseLeave?: (event: MouseEvent) => void;\n onMouseMove?: (event: MouseEvent) => void;\n}\n\ntype RenderReason = 'mount' | 'resize' | 'update';\n\nfunction runScaffold<TCtx, TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n buildCtx: (\n base: {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n svg: SVGSVGElement;\n },\n tooltip: TooltipState | null,\n legend: LegendState | null,\n disposalSignal: AbortSignal,\n announcer: Announcer,\n ) => TCtx,\n renderFn: (ctx: TCtx, reason: RenderReason) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n let render = (_reason: RenderReason) => {};\n const tappers = createTappers<PrismEvent>();\n // Bottom legends follow the SVG. Populate them before measuring chart geometry,\n // so the first observer notification does not interrupt the entrance.\n let legend: LegendState | null = null;\n const base = createChartBase(\n container,\n { a11y: config.a11y, chrome: () => legend?.el ?? null, margin: config.margin },\n () => {\n tappers.emit({ height: base.dimensions.height, type: 'resize', width: base.dimensions.width });\n render('resize');\n },\n );\n const tooltip = config.tooltip ? createTooltip(container, config.tooltip) : null;\n legend = config.legend ? createLegend(container, config.legend, () => base.syncChrome()) : null;\n const ac = new AbortController();\n const ctx = buildCtx(base, tooltip, legend, ac.signal, createAnnouncer(base.svg, 'prism-live'));\n\n let disposed = false;\n const events = makeEventManager(base.svg);\n\n render = (reason) => {\n if (disposed) return;\n events.attach(renderFn(ctx, reason));\n };\n\n try {\n render('mount');\n } catch (error) {\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (disposed) return;\n\n disposed = true;\n tappers.emit({ type: 'dispose' });\n tappers.stop();\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n },\n\n get disposed(): boolean {\n return disposed;\n },\n\n el: base.svg,\n\n tap: tappers.tap,\n\n update(data) {\n if (disposed) throw new PrismRenderError('Cannot update a disposed chart.');\n updateData(data);\n render('update');\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n}\n\nfunction makeEventManager(svg: SVGSVGElement): {\n attach(handlers: ChartEventHandlers | undefined): void;\n detach(): void;\n} {\n let active: ChartEventHandlers | null = null;\n\n return {\n attach(handlers) {\n if (active) {\n if (active.onMouseMove) svg.removeEventListener('mousemove', active.onMouseMove);\n\n if (active.onMouseLeave) svg.removeEventListener('mouseleave', active.onMouseLeave);\n\n if (active.onClick) svg.removeEventListener('click', active.onClick);\n\n if (active.onKeyDown) svg.removeEventListener('keydown', active.onKeyDown);\n\n active = null;\n }\n\n if (!handlers) return;\n\n active = handlers;\n\n if (handlers.onMouseMove) svg.addEventListener('mousemove', handlers.onMouseMove);\n\n if (handlers.onMouseLeave) svg.addEventListener('mouseleave', handlers.onMouseLeave);\n\n if (handlers.onClick) svg.addEventListener('click', handlers.onClick);\n\n if (handlers.onKeyDown) svg.addEventListener('keydown', handlers.onKeyDown);\n },\n detach() {\n this.attach(undefined);\n },\n };\n}\n\n/**\n * Cartesian scaffold: provides grid/axis/series SVG groups and a render loop.\n * `renderFn` returns optional `ChartEventHandlers` that are attached/replaced\n * after every data update or resize.\n */\nexport function createChartScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: ScaffoldContext, reason: RenderReason) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal, announcer) => {\n const groups: ScaffoldGroups = {\n // Grid lines are purely decorative relative to the root svg's own role=\"img\"/aria-label.\n // Axis groups are NOT hidden wholesale: they can contain a meaningful `.prism-axis-title`;\n // `renderAxis` marks its own decorative tick lines/labels individually instead.\n grid: createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-grid' }),\n series: createSvgElement('g', { class: 'prism-series' }),\n xAxis: createSvgElement('g', { class: 'prism-x-axis' }),\n yAxis: createSvgElement('g', { class: 'prism-y-axis' }),\n };\n\n base.chartArea.appendChild(groups.grid);\n base.chartArea.appendChild(groups.xAxis);\n base.chartArea.appendChild(groups.yAxis);\n base.chartArea.appendChild(groups.series);\n\n return {\n announcer,\n chartArea: base.chartArea,\n container,\n dimensions: base.dimensions,\n disposalSignal,\n groups,\n legend,\n svg: base.svg,\n tooltip,\n } satisfies ScaffoldContext;\n },\n renderFn,\n updateData,\n );\n}\n\n/**\n * Radial scaffold: for charts that do not use cartesian axis groups\n * (pie, donut, semi). Provides only tooltip, legend, and the SVG root.\n */\nexport function createRadialScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: RadialScaffoldContext, reason: RenderReason) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal, announcer) =>\n ({\n announcer,\n container,\n dimensions: base.dimensions,\n disposalSignal,\n legend,\n svg: base.svg,\n tooltip,\n }) satisfies RadialScaffoldContext,\n renderFn,\n updateData,\n );\n}\n","import type { Series } from '../types';\n\n/**\n * Stable `data-series-id` value for a series group: the sanitized explicit\n * `id`, else the positional `series-<index>` fallback. Characters outside\n * `[A-Za-z0-9_-]` become `-` so the value is always attribute-safe.\n */\nexport function seriesDomId(series: Pick<Series, 'id' | 'name'> | undefined, index: number): string {\n return series?.id ? series.id.replace(/[^A-Za-z0-9_-]/g, '-') : `series-${index}`;\n}\n","import { createSvgElement, setAttributes } from '../svg/element';\nimport type { CrosshairConfig } from '../types';\n\nexport interface CrosshairState {\n hide(): void;\n show(x: number, y: number, width: number, height: number): void;\n /** When `false`, the crosshair follows the raw mouse position instead of snapping to the nearest datum. */\n readonly snap: boolean;\n}\n\n/**\n * Guide lines for the hovered position. Each line is drawn at the origin and placed\n * with a `transform`, so the CSS transition on `transform` glides a snapped guide to\n * the next datum. (`x1`/`y1` are not animatable CSS geometry properties, so the\n * position has to live in the transform.) Because the group starts `display: none`,\n * the first show places the guide instantly instead of sliding it in from the origin.\n */\nexport function createCrosshair(parent: SVGGElement, config?: CrosshairConfig | true): CrosshairState {\n const showVertical = config === true || config?.vertical !== false;\n const showHorizontal = config !== true && config?.horizontal === true;\n const snap = config === true || config?.snap !== false;\n\n const group = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-crosshair', style: 'display:none' });\n\n const vLine = showVertical\n ? createSvgElement('line', { class: 'prism-crosshair-v', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n const hLine = showHorizontal\n ? createSvgElement('line', { class: 'prism-crosshair-h', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n\n if (vLine) group.appendChild(vLine);\n\n if (hLine) group.appendChild(hLine);\n\n parent.appendChild(group);\n\n return {\n hide() {\n group.style.display = 'none';\n },\n show(x: number, y: number, width: number, height: number) {\n group.style.display = '';\n\n if (vLine) {\n setAttributes(vLine, { x1: 0, x2: 0, y1: 0, y2: height });\n vLine.style.transform = `translateX(${x}px)`;\n }\n\n if (hLine) {\n setAttributes(hLine, { x1: 0, x2: width, y1: 0, y2: 0 });\n hLine.style.transform = `translateY(${y}px)`;\n }\n },\n snap,\n };\n}\n","import { warn } from '../_dev';\nimport type { Datum, Series } from '../types';\n\nexport type CartesianKey = string;\n\nexport interface CartesianSeries<S extends Series = Series> {\n readonly byKey: ReadonlyMap<CartesianKey, Datum>;\n readonly config: S;\n}\n\nexport interface CartesianModel<S extends Series = Series> {\n readonly domain: CartesianKey[];\n readonly labels: ReadonlyMap<CartesianKey, Datum['key']>;\n readonly series: readonly CartesianSeries<S>[];\n}\n\nexport function keyId(key: Datum['key']): CartesianKey {\n if (key instanceof Date) return `date:${key.getTime()}`;\n\n return `${typeof key}:${String(key)}`;\n}\n\nexport function normalizeCartesianSeries<S extends Series>(\n series: readonly S[],\n data: readonly (readonly Datum[])[],\n): CartesianModel<S> {\n const domain: CartesianKey[] = [];\n const labels = new Map<CartesianKey, Datum['key']>();\n const normalized = series.map((config, seriesIndex) => {\n const byKey = new Map<CartesianKey, Datum>();\n\n for (const datum of data[seriesIndex] ?? []) {\n const id = keyId(datum.key);\n\n if (byKey.has(id)) {\n warn(`Duplicate datum key \"${String(datum.key)}\" in series \"${config.name}\"; keeping the first value.`);\n continue;\n }\n\n byKey.set(id, datum);\n\n if (!labels.has(id)) {\n labels.set(id, datum.key);\n domain.push(id);\n }\n }\n\n return { byKey, config } satisfies CartesianSeries<S>;\n });\n\n return { domain, labels, series: normalized };\n}\n","import type { Point } from '../svg/path';\n\nexport function getMousePosition(svg: SVGSVGElement, event: MouseEvent, offsetX: number, offsetY: number): Point {\n const rect = svg.getBoundingClientRect();\n\n return {\n x: event.clientX - rect.left - offsetX,\n y: event.clientY - rect.top - offsetY,\n };\n}\n","import { keyId } from '../core/cartesian-model';\nimport type { ChartEventHandlers } from '../core/chart-scaffold';\nimport { chartArea } from '../core/layout';\nimport { createSvgElement } from '../svg/element';\nimport type { Point } from '../svg/path';\nimport type { ChartDimensions, ChartEvent, ChartMargin, Datum, Series, SeriesValue, TooltipConfig } from '../types';\nimport { type Announcer, describeValues } from './announcer';\nimport type { CrosshairState } from './crosshair';\nimport { getMousePosition } from './events';\nimport { comparisonContent, type TooltipState } from './tooltip';\n\nexport interface SeriesInteractionOptions {\n announcer: Announcer;\n colors: () => string[];\n crosshair?: CrosshairState | null;\n dims: () => ChartDimensions;\n getData: () => Datum[][];\n getPoints: () => Point[][];\n getSeriesList: () => Series[];\n /** Effective chart margin (including any dual-axis widening): hit bounds and tooltip offsets use this, never the shared dimensions. */\n margin: ChartMargin;\n /** Receives one marker per series at the active key. */\n markers: SVGGElement;\n onClick?: ((event: ChartEvent) => void) | undefined;\n onHover?: ((event: ChartEvent | null) => void) | undefined;\n /** Parent of the per-series groups; the nearest series is emphasised and the rest dim. */\n seriesGroup: SVGGElement;\n svg: SVGSVGElement;\n tooltip?: TooltipState | null;\n /** Value/title formatters from the tooltip config, applied to rows and spoken text alike. */\n tooltipFormat?: Pick<TooltipConfig, 'titleFormat' | 'valueFormat'>;\n}\n\ninterface KeyEntry {\n datum: Datum | undefined;\n point: Point | undefined;\n}\n\nconst keyOrder = (key: Datum['key']): number => (key instanceof Date ? key.getTime() : Number(key));\n\nexport function keyLabel(key: Datum['key']): string {\n return key instanceof Date ? key.toLocaleDateString() : String(key);\n}\n\nfunction findNearestKey(allData: Datum[][], allPoints: Point[][], posX: number): Datum['key'] | null {\n let nearest: Datum['key'] | null = null;\n let minXDistance = Infinity;\n\n for (let seriesIndex = 0; seriesIndex < allPoints.length; seriesIndex++) {\n for (let datumIndex = 0; datumIndex < (allPoints[seriesIndex]?.length ?? 0); datumIndex++) {\n const datum = allData[seriesIndex]?.[datumIndex];\n const point = allPoints[seriesIndex]?.[datumIndex];\n\n if (!datum || !point) continue;\n\n const distance = Math.abs(point.x - posX);\n\n if (distance < minXDistance) {\n minXDistance = distance;\n nearest = datum.key;\n }\n }\n }\n\n return nearest;\n}\n\nexport function createSeriesInteraction(opts: SeriesInteractionOptions): ChartEventHandlers {\n let keyboardIndex = -1;\n let active = false;\n\n const renderedHit = (event: Event): { datum: Datum; point: Point; seriesIndex: number } | null => {\n const target = event.target;\n if (\n !(target instanceof SVGElement) ||\n target.tagName.toLowerCase() !== 'circle' ||\n !opts.seriesGroup.contains(target) ||\n !target.parentElement\n )\n return null;\n let group: Element | null = target.parentElement;\n while (group && group.parentNode !== opts.seriesGroup) group = group.parentElement;\n if (!group) return null;\n const seriesIndex = [...opts.seriesGroup.children].indexOf(group);\n const datumIndex = [...target.parentElement.children].indexOf(target);\n const datum = opts.getData()[seriesIndex]?.[datumIndex];\n const point = opts.getPoints()[seriesIndex]?.[datumIndex];\n return datum && point ? { datum, point, seriesIndex } : null;\n };\n\n const entriesAt = (key: Datum['key']): KeyEntry[] => {\n const id = keyId(key);\n const allPoints = opts.getPoints();\n\n return opts.getData().map((data, seriesIndex) => {\n const datumIndex = data.findIndex((datum) => keyId(datum.key) === id);\n\n return datumIndex === -1\n ? { datum: undefined, point: undefined }\n : { datum: data[datumIndex], point: allPoints[seriesIndex]?.[datumIndex] };\n });\n };\n\n const nearestIndex = (entries: KeyEntry[], posY: number): number => {\n let best = -1;\n let minDistance = Infinity;\n\n entries.forEach(({ point }, index) => {\n if (!point) return;\n\n const distance = Number.isFinite(posY) ? Math.abs(point.y - posY) : 0;\n\n if (distance < minDistance) {\n minDistance = distance;\n best = index;\n }\n });\n\n return best;\n };\n\n const highlight = (entries: KeyEntry[], emphasised: number): void => {\n const colors = opts.colors();\n\n opts.markers.replaceChildren();\n entries.forEach(({ point }, index) => {\n if (!point) return;\n\n opts.markers.appendChild(\n createSvgElement('circle', {\n class: 'prism-active-point',\n cx: point.x,\n cy: point.y,\n fill: colors[index],\n r: 4,\n }),\n );\n });\n\n const groups = [...opts.seriesGroup.children];\n\n opts.seriesGroup.classList.toggle('prism-series-focused', emphasised >= 0 && groups.length > 1);\n for (const [index, group] of groups.entries()) group.classList.toggle('prism-series-active', index === emphasised);\n };\n\n const clear = (): void => {\n opts.crosshair?.hide();\n opts.tooltip?.hide();\n opts.announcer.clear();\n highlight([], -1);\n active = false;\n opts.onHover?.(null);\n };\n\n const eventFor = (\n key: Datum['key'],\n posY: number,\n originalEvent: Event,\n ): { entries: KeyEntry[]; event: ChartEvent; index: number } | null => {\n const entries = entriesAt(key);\n const hit = renderedHit(originalEvent);\n const index = hit?.seriesIndex ?? nearestIndex(entries, posY);\n if (hit) entries[index] = { datum: hit.datum, point: hit.point };\n const seriesList = opts.getSeriesList();\n const datum = entries[index]?.datum;\n\n if (index < 0 || !datum) return null;\n\n const values: SeriesValue[] = entries.map((entry, i) => ({ datum: entry.datum, series: seriesList[i] }));\n\n return { entries, event: { datum, originalEvent, series: seriesList[index], values }, index };\n };\n\n const focus = (key: Datum['key'], pos: Point | null, originalEvent: Event): void => {\n const found = eventFor(key, pos?.y ?? Number.NaN, originalEvent);\n\n if (!found) return;\n\n const { entries, event, index } = found;\n const point = entries[index].point!;\n const dims = opts.dims();\n const area = chartArea(dims.width, dims.height, opts.margin);\n const raw = opts.crosshair?.snap === false && pos;\n const label = opts.tooltipFormat?.titleFormat ? opts.tooltipFormat.titleFormat(key) : keyLabel(key);\n const values = event.values ?? [];\n const colors = opts.colors();\n const valueFormat = opts.tooltipFormat?.valueFormat;\n\n opts.crosshair?.show(raw ? pos.x : point.x, raw ? pos.y : point.y, area.width, area.height);\n highlight(entries, index);\n\n const spoken = describeValues(label, values, valueFormat ?? String);\n\n if (opts.tooltip) {\n const rows = values.flatMap(({ datum, series }, i) =>\n datum\n ? [\n {\n color: colors[i],\n name: series.name,\n value: valueFormat ? valueFormat(datum.value, datum, series) : String(datum.value),\n },\n ]\n : [],\n );\n\n opts.tooltip.show(\n point.x + opts.margin.left,\n point.y + opts.margin.top,\n event.datum,\n event.series,\n comparisonContent(opts.svg.ownerDocument, label, rows, spoken),\n );\n } else {\n opts.announcer.announce(spoken);\n }\n\n active = true;\n opts.onHover?.(event);\n };\n\n const pointerKey = (event: MouseEvent): { key: Datum['key']; pos: Point } | null => {\n const rendered = renderedHit(event);\n if (rendered) return { key: rendered.datum.key, pos: rendered.point };\n const allPoints = opts.getPoints();\n\n if (allPoints.every((points) => points.length === 0)) return null;\n\n const dims = opts.dims();\n const pos = getMousePosition(opts.svg, event, opts.margin.left, opts.margin.top);\n const area = chartArea(dims.width, dims.height, opts.margin);\n\n if (pos.x < 0 || pos.x > area.width || pos.y < 0 || pos.y > area.height) return null;\n\n const key = findNearestKey(opts.getData(), allPoints, pos.x);\n\n return key === null ? null : { key, pos };\n };\n\n const sortedKeys = (): Datum['key'][] =>\n [\n ...new Map(\n opts\n .getData()\n .flat()\n .map((datum) => [keyId(datum.key), datum.key]),\n ).values(),\n ].sort((a, b) => keyOrder(a) - keyOrder(b));\n\n const onMouseMove = (event: MouseEvent): void => {\n const hit = pointerKey(event);\n\n if (hit) focus(hit.key, hit.pos, event);\n else if (active) clear();\n };\n\n const onClick = (event: MouseEvent): void => {\n if (!opts.onClick) return;\n\n const hit = pointerKey(event);\n const found = hit && eventFor(hit.key, hit.pos.y, event);\n\n if (found) opts.onClick(found.event);\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n const keys = sortedKeys();\n\n if (keys.length === 0) return;\n\n const last = keys.length - 1;\n const target: Record<string, number> = {\n ArrowLeft: keyboardIndex < 0 ? last : Math.max(0, keyboardIndex - 1),\n ArrowRight: keyboardIndex < 0 ? 0 : Math.min(last, keyboardIndex + 1),\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n keyboardIndex = target[event.key];\n focus(keys[keyboardIndex], null, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && keyboardIndex >= 0 && opts.onClick) {\n event.preventDefault();\n\n const found = eventFor(keys[keyboardIndex], Number.NaN, event);\n\n if (found) opts.onClick(found.event);\n } else if (event.key === 'Escape') {\n keyboardIndex = -1;\n clear();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: clear, onMouseMove };\n}\n\n/** Group for the per-series active markers, reused across renders. */\nexport function ensureMarkerGroup(parent: SVGGElement, current: SVGGElement | null): SVGGElement {\n if (current && parent.contains(current)) return current;\n\n const group = createSvgElement('g', {\n 'aria-hidden': 'true',\n class: 'prism-active-points',\n 'pointer-events': 'none',\n });\n\n parent.appendChild(group);\n\n return group;\n}\n","import type { PrismTheme, ThemeScope } from '../types';\n\nconst MAX_THEME_COLORS = 8;\n\n// Every scalar PrismTheme key mapped to the CSS custom property it drives. setTheme/resetTheme\n// iterate this single table, so expanding the theme surface is one row here plus one field on\n// PrismTheme — the two can never drift apart. `colors` is handled separately: it fans out to\n// indexed slots that must all be cleared, not just overwritten.\nconst THEME_TOKENS = {\n axisColor: '--prism-axis-color',\n fontFamily: '--prism-font-family',\n gridColor: '--prism-grid-color',\n gridOpacity: '--prism-grid-opacity',\n textColor: '--prism-text-color',\n textColorSecondary: '--prism-text-color-secondary',\n tooltipBg: '--prism-tooltip-bg',\n tooltipBorder: '--prism-tooltip-border',\n tooltipColor: '--prism-tooltip-color',\n} as const satisfies Record<keyof Omit<PrismTheme, 'colors'>, string>;\n\nfunction target(options?: ThemeScope): HTMLElement {\n return options?.scope ?? document.documentElement;\n}\n\n/**\n * Apply theme tokens as CSS custom properties. Writes to `options.scope` when given, otherwise\n * to `document.documentElement`. A scoped call themes one subtree (charts render inside it, so\n * their `var(--prism-*)` lookups resolve against it) without touching `:root`.\n */\nexport function setTheme(theme: PrismTheme, options?: ThemeScope): void {\n const root = target(options);\n\n if (theme.colors) {\n // Clear (not just overwrite) every color slot a previous setTheme() may have used, so a\n // theme with fewer colors than the last one leaves no stale values on higher-index slots.\n for (let i = 0; i < MAX_THEME_COLORS; i++) {\n const color = theme.colors[i];\n\n if (color) {\n root.style.setProperty(`--prism-color-${i + 1}`, color);\n } else {\n root.style.removeProperty(`--prism-color-${i + 1}`);\n }\n }\n }\n\n for (const [key, property] of Object.entries(THEME_TOKENS)) {\n const value = theme[key as keyof typeof THEME_TOKENS];\n\n if (value !== undefined) root.style.setProperty(property, String(value));\n }\n}\n\n/** Clear every custom property `setTheme()` can set on `options.scope` (default `documentElement`), restoring prism's default theme from `theme.css`. */\nexport function resetTheme(options?: ThemeScope): void {\n const root = target(options);\n\n for (let i = 1; i <= MAX_THEME_COLORS; i++) root.style.removeProperty(`--prism-color-${i}`);\n\n for (const property of Object.values(THEME_TOKENS)) root.style.removeProperty(property);\n}\n\nexport function seriesColor(index: number, override?: string): string {\n return override ?? `var(--prism-color-${(index % MAX_THEME_COLORS) + 1})`;\n}\n","export type EasingFn = (t: number) => number;\n\n/** Overshoot coefficient behind CSS `cubic-bezier(.34, 1.56, .64, 1)`. */\nconst BACK_OVERSHOOT = 1.70158;\n\n/**\n * The named curves a {@link TransitionConfig} can select. The `ease-*` curves are cubic,\n * matching the feel of the CSS easing keywords; `expo-out` decelerates hard for data\n * reveals and `back-out` overshoots slightly for bar entrances.\n */\nexport const easings = {\n 'back-out': (t: number) => 1 + (BACK_OVERSHOOT + 1) * (t - 1) ** 3 + BACK_OVERSHOOT * (t - 1) ** 2,\n 'ease-in': (t: number) => t * t * t,\n 'ease-in-out': (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2),\n 'ease-out': (t: number) => 1 - (1 - t) ** 3,\n 'expo-out': (t: number) => (t >= 1 ? 1 : 1 - 2 ** (-10 * t)),\n linear: (t: number) => t,\n} satisfies Record<string, EasingFn>;\n\n/** The literal names {@link resolveEasing} accepts, derived from {@link easings}. */\nexport type EasingName = keyof typeof easings;\n\nexport function resolveEasing(easing: string | ((t: number) => number) | undefined): EasingFn {\n if (typeof easing === 'function') return easing;\n\n // `Object.hasOwn` guards against `easing` being a prototype-chain key (e.g. `'__proto__'`,\n // `'constructor'`): a plain bracket lookup on those would silently resolve to an\n // `Object.prototype` value instead of `undefined`, which is either not callable (throws)\n // or callable but not an easing function (produces garbage interpolation).\n if (easing !== undefined && Object.hasOwn(easings, easing)) {\n return (easings as Record<string, EasingFn>)[easing];\n }\n\n return easings['ease-out'];\n}\n","import type { TransitionConfig, TransitionOption } from '../types';\n\n/** Duration (ms) every chart uses when motion is enabled without an explicit `duration`. */\nexport const DEFAULT_DURATION = 300;\n\n/**\n * Resolves a user-facing `transition` option into concrete motion values.\n *\n * - `false` disables motion entirely: renderers apply their final state synchronously.\n * - `true` (or omitted) enables motion with the chart's `defaultDuration`/`defaultStagger`.\n * - `preference: 'system'` (the default) disables motion when the user prefers reduced motion.\n */\nexport function resolveMotion(\n config?: TransitionOption,\n defaults?: { defaultDuration?: number; defaultStagger?: number },\n): TransitionConfig & { duration: number; stagger: number } {\n if (config === false) return { duration: 0, stagger: 0 };\n\n const options = config === true ? undefined : config;\n const preference = options?.preference ?? 'system';\n const reduced = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration =\n preference === 'never' || (preference === 'system' && reduced)\n ? 0\n : (options?.duration ?? defaults?.defaultDuration ?? DEFAULT_DURATION);\n\n return { ...options, duration, stagger: Math.max(0, options?.stagger ?? defaults?.defaultStagger ?? 0) };\n}\n","export function tweenNumber(from: number, to: number, t: number): number {\n return from + (to - from) * t;\n}\n","import type { TransitionConfig } from '../types';\nimport type { EasingFn } from './easing';\nimport { resolveEasing } from './easing';\nimport { resolveMotion } from './motion';\nimport { tweenNumber } from './tween';\n\nexport interface AnimationTarget {\n attrs: Record<string, { from: number; to: number }>;\n el: SVGElement;\n}\n\nexport interface TweenOptions {\n /** Number of staggered lanes; the loop runs until the last lane finishes. */\n count: number;\n /** Milliseconds per lane. A non-positive value completes synchronously. */\n duration: number;\n easing: EasingFn;\n onComplete?: () => void;\n /**\n * Runs once per frame (and once synchronously for a zero-length tween). Receives a\n * `progress(lane)` resolver returning that lane's eased 0-1 value, so callers\n * interpolate their own values without re-deriving elapsed time.\n */\n onFrame: (progress: (lane: number) => number) => void;\n /** Aborted when the owning chart is disposed: cancels the in-flight frame. */\n signal?: AbortSignal;\n /** Per-lane delay in milliseconds; each lane starts `stagger` ms after the previous. */\n stagger?: number;\n}\n\n/**\n * The package's single `requestAnimationFrame` tween loop. Every animated surface\n * (bar, line, area, pie, radar, sparkline) drives its transition through here, so\n * disposal-correctness is enforced in exactly one place: an aborted `signal` cancels\n * the in-flight frame and stops rescheduling.\n *\n * Elapsed time comes from the timestamp the browser passes to the frame callback,\n * never a captured `performance.now()`. Returns a `cancel()` function for superseding\n * a tween before it ends.\n */\nexport function startTween(options: TweenOptions): () => void {\n const { count, duration, easing, stagger = 0, signal, onFrame, onComplete } = options;\n\n if (signal?.aborted) return () => {};\n\n // A zero-length (or reduced-motion) tween applies its final frame synchronously: no rAF.\n if (duration <= 0) {\n onFrame(() => 1);\n onComplete?.();\n\n return () => {};\n }\n\n if (count === 0) {\n onComplete?.();\n\n return () => {};\n }\n\n const totalDuration = duration + stagger * (count - 1);\n let startTime: number | null = null;\n let rafId: number | null = null;\n let cancelled = false;\n\n const cancel = (): void => {\n cancelled = true;\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n signal?.removeEventListener('abort', cancel);\n };\n\n const frame = (timestamp: number): void => {\n if (cancelled || signal?.aborted) return;\n\n if (startTime === null) startTime = timestamp;\n\n const elapsed = timestamp - startTime;\n\n onFrame((lane) => easing(Math.max(0, Math.min(1, (elapsed - lane * stagger) / duration))));\n\n if (elapsed < totalDuration) {\n rafId = requestAnimationFrame(frame);\n } else {\n rafId = null;\n signal?.removeEventListener('abort', cancel);\n onComplete?.();\n }\n };\n\n signal?.addEventListener('abort', cancel, { once: true });\n rafId = requestAnimationFrame(frame);\n\n return cancel;\n}\n\n/**\n * Runs a batch of numeric-attribute tweens through {@link startTween}, sharing one\n * `requestAnimationFrame` loop. Returns the loop's `cancel()` function.\n */\nexport function animate(\n targets: AnimationTarget[],\n config?: TransitionConfig,\n onComplete?: () => void,\n signal?: AbortSignal,\n): () => void {\n const motion = resolveMotion(config);\n\n return startTween({\n count: targets.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete,\n onFrame: (progress) => {\n for (const [lane, target] of targets.entries()) {\n const eased = progress(lane);\n\n for (const [attr, { from, to }] of Object.entries(target.attrs)) {\n target.el.setAttribute(attr, String(tweenNumber(from, to, eased)));\n }\n }\n },\n signal,\n stagger: motion.stagger,\n });\n}\n","import type { Datum } from '../types';\n\nexport type DatumMark = Pick<Datum, 'dash' | 'opacity'>;\n\n/** True when any datum carries a presentation field, forcing the styled-runs path. */\nexport function hasStyledRuns(marks: readonly DatumMark[] | undefined): boolean {\n return marks?.some((mark) => mark && (mark.dash !== undefined || mark.opacity !== undefined)) ?? false;\n}\n\nexport interface StyleRun {\n dash?: string;\n end: number;\n opacity?: number;\n /** Index of the run's first point. */\n start: number;\n}\n\n/**\n * Groups consecutive segments that share one datum style into runs. Datum `i`\n * styles the segment from point `i` to point `i+1` (Chart.js-style segment\n * semantics), so the last datum's style has no segment to paint and is ignored.\n */\nexport function computeStyleRuns(marks: readonly DatumMark[], pointCount: number): StyleRun[] {\n const segmentCount = Math.max(0, pointCount - 1);\n\n if (segmentCount === 0) return [];\n\n const runs: StyleRun[] = [];\n\n for (let i = 0; i < segmentCount; i++) {\n const mark = marks[i] ?? {};\n const prev = runs[runs.length - 1];\n\n if (prev && prev.dash === mark.dash && prev.opacity === mark.opacity) {\n prev.end = i + 1;\n\n continue;\n }\n\n runs.push({ dash: mark.dash, end: i + 1, opacity: mark.opacity, start: i });\n }\n\n return runs;\n}\n","let next = 0;\n\n/** Document-unique id for SVG references such as gradients. */\nexport function uniqueId(prefix: string): string {\n next += 1;\n\n return `${prefix}-${next}`;\n}\n","export interface Point {\n x: number;\n y: number;\n}\n\nexport function linePath(points: Point[]): string {\n if (points.length === 0) return '';\n\n let d = `M${points[0].x},${points[0].y}`;\n\n for (let i = 1; i < points.length; i++) {\n d += `L${points[i].x},${points[i].y}`;\n }\n\n return d;\n}\n\nexport function monotonePath(points: Point[]): string {\n if (points.length < 3) return linePath(points);\n\n const n = points.length;\n const tangents: Point[] = [];\n\n for (let i = 0; i < n; i++) {\n if (i === 0) {\n tangents.push({ x: points[1].x - points[0].x, y: points[1].y - points[0].y });\n } else if (i === n - 1) {\n tangents.push({ x: points[n - 1].x - points[n - 2].x, y: points[n - 1].y - points[n - 2].y });\n } else {\n tangents.push({ x: (points[i + 1].x - points[i - 1].x) / 2, y: (points[i + 1].y - points[i - 1].y) / 2 });\n }\n }\n\n let d = `M${points[0].x},${points[0].y}`;\n\n for (let i = 0; i < n - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const t0 = tangents[i];\n const t1 = tangents[i + 1];\n const dx = (p1.x - p0.x) / 3;\n\n d += `C${p0.x + dx},${p0.y + t0.y / 3},${p1.x - dx},${p1.y - t1.y / 3},${p1.x},${p1.y}`;\n }\n\n return d;\n}\n\nexport function stepPath(points: Point[]): string {\n if (points.length === 0) return '';\n\n let d = `M${points[0].x},${points[0].y}`;\n\n for (let i = 1; i < points.length; i++) {\n const midX = (points[i - 1].x + points[i].x) / 2;\n\n d += `H${midX}V${points[i].y}H${points[i].x}`;\n }\n\n return d;\n}\n\nexport function areaPath(\n topPoints: Point[],\n bottomPoints: Point[],\n curve: 'linear' | 'monotone' | 'step' = 'linear',\n): string {\n if (topPoints.length === 0) return '';\n\n const topPath =\n curve === 'monotone' ? monotonePath(topPoints) : curve === 'step' ? stepPath(topPoints) : linePath(topPoints);\n let d = topPath;\n const reversed = [...bottomPoints].reverse();\n\n if (reversed.length > 0) {\n d += `L${reversed[0].x},${reversed[0].y}`;\n for (let i = 1; i < reversed.length; i++) {\n d += `L${reversed[i].x},${reversed[i].y}`;\n }\n }\n\n d += 'Z';\n\n return d;\n}\n","import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport { computeStyleRuns, type DatumMark, hasStyledRuns, type StyleRun } from '../../core/datum-style';\nimport { uniqueId } from '../../core/ids';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionOption } from '../../types';\n\nexport interface AreaRenderOptions {\n color: string;\n curve: 'linear' | 'monotone' | 'step';\n /** Aborted when the owning chart is disposed: stops the transition's `requestAnimationFrame` loop from rescheduling. */\n disposalSignal?: AbortSignal;\n fill: 'gradient' | 'solid';\n /** Explicit opacity beats the `--prism-area-opacity` theme token. */\n fillOpacity?: number;\n /** Per-datum presentation parallel to `points`; styled runs split the top line into subpaths. */\n marks?: readonly DatumMark[];\n showLine: boolean;\n transition?: TransitionOption;\n}\n\nconst activeAreaAnimations = new WeakMap<SVGGElement, () => void>();\nconst drawnPoints = new WeakMap<SVGGElement, Point[]>();\n\nfunction buildLinePath(pts: Point[], curve: AreaRenderOptions['curve']): string {\n return curve === 'monotone' ? monotonePath(pts) : curve === 'step' ? stepPath(pts) : linePath(pts);\n}\n\n/** A vertical gradient fading to transparent at the baseline, or a flat fill. */\nfunction applyAreaFill(parent: SVGGElement, fill: SVGPathElement, options: AreaRenderOptions): void {\n let gradient = parent.querySelector<SVGLinearGradientElement>('linearGradient');\n\n if (options.fill === 'gradient') {\n if (!gradient) {\n const defs = createSvgElement('defs');\n\n gradient = createSvgElement('linearGradient', { id: uniqueId('prism-area-fill'), x1: 0, x2: 0, y1: 0, y2: 1 });\n gradient.append(\n createSvgElement('stop', { class: 'prism-area-stop-top', offset: 0 }),\n createSvgElement('stop', { class: 'prism-area-stop-bottom', offset: 1 }),\n );\n defs.appendChild(gradient);\n parent.insertBefore(defs, parent.firstChild);\n }\n\n for (const stop of gradient.querySelectorAll('stop')) {\n stop.setAttribute('stop-color', options.color);\n stop.style.stopColor = options.color;\n }\n\n setAttributes(fill, { fill: `url(#${gradient.id})` });\n } else {\n gradient?.parentElement?.remove();\n setAttributes(fill, { fill: options.color });\n }\n\n setAttributes(fill, { class: `prism-area-fill prism-area-fill--${options.fill}`, stroke: 'none' });\n fill.style.fillOpacity = options.fillOpacity === undefined ? '' : String(options.fillOpacity);\n}\n\nexport function renderArea(parent: SVGGElement, points: Point[], baselineY: number, options: AreaRenderOptions): void {\n const motion = resolveMotion(options.transition);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n let fill = parent.querySelector<SVGPathElement>('.prism-area-fill');\n\n if (!fill) {\n fill = createSvgElement('path', { class: 'prism-area-fill' });\n parent.appendChild(fill);\n }\n\n applyAreaFill(parent, fill, options);\n\n let line: SVGPathElement | null = null;\n let runs: readonly StyleRun[] = [];\n let lines: SVGPathElement[] = [];\n const styled = hasStyledRuns(options.marks);\n const marks = options.marks ?? [];\n\n if (options.showLine) {\n if (styled) {\n runs = computeStyleRuns(marks, points.length);\n\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-area-line')];\n\n for (const extra of existing.slice(runs.length)) extra.remove();\n\n lines = runs.map((_, r) => {\n const reuse = existing[r];\n\n if (reuse) return reuse;\n\n const created = createSvgElement('path', { class: 'prism-area-line', fill: 'none' });\n\n parent.appendChild(created);\n\n return created;\n });\n\n for (const [r, run] of runs.entries()) {\n setAttributes(lines[r], {\n opacity: run.opacity,\n stroke: options.color,\n 'stroke-dasharray': run.dash,\n 'stroke-width': 2,\n });\n }\n\n line = null;\n } else {\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-area-line')];\n\n for (const stale of existing.slice(1)) stale.remove();\n\n line = existing[0] ?? null;\n\n if (!line) {\n line = createSvgElement('path', { class: 'prism-area-line', fill: 'none' });\n parent.appendChild(line);\n }\n\n setAttributes(line, {\n opacity: undefined,\n stroke: options.color,\n 'stroke-dasharray': undefined,\n 'stroke-width': 2,\n });\n }\n } else {\n for (const stale of parent.querySelectorAll('.prism-area-line')) stale.remove();\n }\n\n const drawLine = (pts: Point[]): void => {\n if (!options.showLine) return;\n\n if (styled) {\n for (const [r, run] of runs.entries()) {\n setAttributes(lines[r], { d: buildLinePath(pts.slice(run.start, run.end + 1), options.curve) });\n }\n } else if (line) {\n setAttributes(line, { d: buildLinePath(pts, options.curve) });\n }\n };\n\n if (dur === 0) {\n const bottomPoints = points.map((p) => ({ x: p.x, y: baselineY }));\n\n setAttributes(fill, { d: areaPath(points, bottomPoints, options.curve) });\n\n drawLine(points);\n drawnPoints.set(parent, points);\n\n return;\n }\n\n activeAreaAnimations.get(parent)?.();\n\n const hasExisting = drawnPoints.has(parent);\n // A first render has no drawn shape to interpolate from: the mount animation\n // grows the area out of its baseline instead.\n const rawFrom: Point[] = hasExisting\n ? (drawnPoints.get(parent) ?? points)\n : points.map((p) => ({ x: p.x, y: baselineY }));\n const fromPoints: Point[] = points.map((_, i) => rawFrom[i] ?? rawFrom[rawFrom.length - 1] ?? points[i]);\n\n const paintFrame = (e: number): void => {\n const interpolated: Point[] = points.map((to, i) => ({\n x: tweenNumber(fromPoints[i].x, to.x, e),\n y: tweenNumber(fromPoints[i].y, to.y, e),\n }));\n const interpolatedBottom = interpolated.map((p) => ({ x: p.x, y: baselineY }));\n\n drawnPoints.set(parent, interpolated);\n setAttributes(fill!, { d: areaPath(interpolated, interpolatedBottom, options.curve) });\n drawLine(interpolated);\n };\n\n // The starting geometry goes on screen immediately: `startTween` only paints on\n // the first frame callback, which would otherwise leave one blank frame.\n paintFrame(0);\n\n activeAreaAnimations.set(\n parent,\n startTween({\n count: 1,\n duration: dur,\n easing,\n onComplete: () => {\n activeAreaAnimations.delete(parent);\n drawnPoints.set(parent, points);\n },\n onFrame: (progress) => paintFrame(progress(0)),\n signal: options.disposalSignal,\n }),\n );\n}\n\nexport function computeAreaPoints(\n data: ContinuousDatum[],\n xScale: Scale<Date | number>,\n yScale: Scale<number>,\n): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computeAreaPoints: datum.key is null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n } else if (data.some((d) => typeof d.key === 'string')) {\n warn('computeAreaPoints: string keys are not supported for line/area charts: use numeric or Date keys.');\n }\n\n return data.map((d) => ({\n x: xScale.map(d.key as Date | number),\n y: yScale.map(d.value),\n }));\n}\n","import { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { AreaChartConfig, AreaSeriesConfig, ChartHandle, XAxisConfig, YAxisConfig } from '../../types';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle<AreaSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n const yScale = buildYScale(allY, area.height);\n const baselineY = yScale.map(0);\n\n // Axes render by default (value axis with gridlines); `false` opts out. The value\n // axis merges over its default so a partial config (e.g. only `tickFormat`) keeps\n // the default gridlines.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : { grid: true, ...config.yAxis };\n\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(yScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(xScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, yScale, yAxisConfig, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-area-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const points = computeAreaPoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderArea(group, points, baselineY, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n fill: series.fill ?? 'gradient',\n fillOpacity: series.fillOpacity,\n marks: series.data,\n showLine: series.showLine !== false,\n transition: config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createSeriesInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin: ctx.dimensions.margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n tooltipFormat: typeof config.tooltip === 'object' ? config.tooltip : undefined,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n","import { warn } from '../_dev';\nimport type { BandScale } from '../types';\nimport type { BandScaleConfig } from './types';\n\nexport function bandScale(config: BandScaleConfig): BandScale {\n // Every method below closes over `config`/these helpers directly instead of reading\n // `this`: the returned object stays fully functional when destructured, e.g.\n // `const { map } = bandScale(cfg)`.\n const getDomain = (): string[] => config.domain;\n const getRange = (): [number, number] => config.range;\n\n const getBandwidth = (): number => {\n const n = getDomain().length;\n\n if (n === 0) return 0;\n\n const [r0, r1] = getRange();\n const padding = config.padding ?? 0.1;\n const totalWidth = r1 - r0;\n\n return totalWidth / (n + (n - 1) * padding + (config.paddingOuter ?? padding) * 2);\n };\n\n return {\n bandwidth: getBandwidth,\n\n get domain(): string[] {\n return getDomain();\n },\n\n gap(): number {\n const padding = config.padding ?? 0.1;\n\n return getBandwidth() * padding;\n },\n\n map(value: string): number {\n const domain = getDomain();\n const idx = domain.indexOf(value);\n\n if (idx === -1) {\n warn(`bandScale.map: unknown category \"${value}\"`);\n\n return 0;\n }\n\n const [r0] = getRange();\n const bw = getBandwidth();\n const padding = config.padding ?? 0.1;\n const outer = config.paddingOuter ?? padding;\n\n return r0 + outer * bw + idx * (bw + bw * padding);\n },\n\n get range(): [number, number] {\n return getRange();\n },\n\n ticks(count?: number): string[] {\n const domain = getDomain();\n\n if (count === undefined || count >= domain.length) return [...domain];\n\n if (count <= 0) return [];\n\n const step = Math.ceil(domain.length / count);\n\n return domain.filter((_, i) => i % step === 0);\n },\n };\n}\n","import type { BarScaleContext } from './bar-scale-context';\n\nexport function findCatIdx(pos: number, categories: string[], sc: BarScaleContext): number {\n for (let i = 0; i < categories.length; i++) {\n const center = sc.bandCenter(categories[i]);\n const start = center - sc.bandwidth / 2;\n\n if (pos >= start && pos < start + sc.bandwidth) return i;\n }\n\n return -1;\n}\n\nexport function findSeriesIdx(\n pos: { x: number; y: number },\n catIdx: number,\n categories: string[],\n sc: BarScaleContext,\n seriesCount: number,\n): number {\n if (sc.stacked) {\n if (sc.horizontal) {\n for (let si = 0; si < seriesCount; si++) {\n const rightX = sc.valueScale.map(sc.stackedTops[si]?.[catIdx] ?? 0);\n\n if (rightX >= pos.x) return si;\n }\n\n return seriesCount - 1;\n } else {\n for (let si = 0; si < seriesCount; si++) {\n const topY = sc.valueScale.map(sc.stackedTops[si]?.[catIdx] ?? 0);\n\n if (topY <= pos.y) return si;\n }\n\n return seriesCount - 1;\n }\n } else {\n const subSize = sc.bandwidth / seriesCount;\n const bandStart = sc.bandCenter(categories[catIdx]) - sc.bandwidth / 2;\n const offset = sc.horizontal ? pos.y - bandStart : pos.x - bandStart;\n const subIdx = Math.floor(offset / subSize);\n\n return Math.max(0, Math.min(seriesCount - 1, subIdx));\n }\n}\n","import { uniqueId } from '../core/ids';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { TransitionConfig } from '../types';\nimport { resolveEasing } from './easing';\nimport { startTween } from './transition';\n\nconst activeReveals = new WeakMap<Element, () => void>();\n\nexport function cancelReveal(parent: Element): void {\n activeReveals.get(parent)?.();\n}\n\n/** Traces final line geometry without replacing its dash or per-datum styling. */\nexport function playTraceReveal(\n parent: SVGGElement,\n bounds: { height: number; width: number },\n paths: readonly { d: string; end: number; start: number }[],\n strokeWidth: number,\n motion: TransitionConfig & { duration: number },\n signal?: AbortSignal,\n): () => void {\n cancelReveal(parent);\n if (motion.duration <= 0 || signal?.aborted) return () => {};\n\n const maskId = uniqueId('prism-trace');\n const host = createSvgElement('defs');\n const padding = strokeWidth / 2;\n const mask = createSvgElement('mask', {\n height: bounds.height + strokeWidth,\n id: maskId,\n maskContentUnits: 'userSpaceOnUse',\n maskUnits: 'userSpaceOnUse',\n width: bounds.width + strokeWidth,\n x: -padding,\n y: -padding,\n });\n const traces = paths.map(({ d }) => {\n const trace = createSvgElement('path', {\n d,\n fill: 'none',\n pathLength: 1,\n stroke: 'white',\n 'stroke-dasharray': '1 1',\n 'stroke-dashoffset': 1,\n 'stroke-width': strokeWidth,\n });\n mask.appendChild(trace);\n return trace;\n });\n host.appendChild(mask);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('mask', `url(#${maskId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('mask');\n host.remove();\n signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: 1,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n const e = progress(0);\n for (const [i, trace] of traces.entries()) {\n const { start, end } = paths[i];\n const revealed = Math.max(0, Math.min(1, (e - start) / (end - start)));\n trace.setAttribute('stroke-dashoffset', String(1 - revealed));\n }\n },\n signal,\n });\n return finish;\n}\n\nexport interface GrowRevealLane {\n anchor: number;\n height: number;\n width: number;\n x: number;\n y: number;\n}\n\n/** Reveals finished bars from their own baseline without distorting rounded corners. */\nexport function playGrowReveal(\n parent: SVGGElement,\n lanes: readonly GrowRevealLane[],\n paintFinal: () => void,\n motion: TransitionConfig & { duration: number },\n options: { axis: 'x' | 'y'; signal?: AbortSignal; stagger?: number },\n): () => void {\n cancelReveal(parent);\n paintFinal();\n if (motion.duration <= 0 || lanes.length === 0 || options.signal?.aborted) return () => {};\n\n const clipId = uniqueId('prism-reveal');\n const host = createSvgElement('defs');\n const clipPath = createSvgElement('clipPath', { id: clipId });\n const rects = lanes.map((lane) => {\n const rect = createSvgElement('rect', { height: 0, width: 0, x: lane.x, y: lane.y });\n clipPath.appendChild(rect);\n return rect;\n });\n host.appendChild(clipPath);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('clip-path', `url(#${clipId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('clip-path');\n host.remove();\n options.signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n options.signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: lanes.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n for (const [i, rect] of rects.entries()) {\n const lane = lanes[i];\n const e = Math.max(0, Math.min(1, progress(i)));\n if (options.axis === 'y') {\n const top = lane.anchor + (lane.y - lane.anchor) * e;\n const bottom = lane.anchor + (lane.y + lane.height - lane.anchor) * e;\n setAttributes(rect, { height: Math.max(0, bottom - top), width: lane.width, y: top });\n } else {\n const left = lane.anchor + (lane.x - lane.anchor) * e;\n const right = lane.anchor + (lane.x + lane.width - lane.anchor) * e;\n setAttributes(rect, { height: lane.height, width: Math.max(0, right - left), x: left });\n }\n }\n },\n signal: options.signal,\n stagger: options.stagger,\n });\n return finish;\n}\n","import { resolveMotion } from '../../animation/motion';\nimport { type GrowRevealLane, playGrowReveal } from '../../animation/reveal';\nimport type { AnimationTarget } from '../../animation/transition';\nimport { animate } from '../../animation/transition';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { BandScale, Scale, TransitionOption } from '../../types';\n\nexport interface BarRenderOptions {\n baselineYs?: number[];\n borderRadius: number;\n color: string;\n /** Aborted when the owning chart is disposed: stops in-flight transitions from rescheduling. */\n disposalSignal?: AbortSignal;\n horizontal?: boolean;\n seriesCount: number;\n seriesIndex: number;\n stacked?: boolean;\n transition?: TransitionOption;\n}\n\n/** Preserve the stagger for bars inserted by a data update, not the initial entrance. */\nconst DEFAULT_NEW_BAR_STAGGER = 20;\n/** Upper bound on the total staggered delay a bar chart may add, whatever the per-bar value. */\nconst MAX_STAGGER_TOTAL = 400;\n\nconst activeBarAnimations = new WeakMap<SVGGElement, () => void>();\n\n/**\n * The group's bars in data order. Queried by class rather than by `children` index\n * because a mount reveal injects a `<defs>` into the same group.\n */\nfunction barsOf(parent: SVGGElement): SVGRectElement[] {\n return [...parent.children].filter((child): child is SVGRectElement => child.classList.contains('prism-bar'));\n}\n\nexport function renderBars(\n parent: SVGGElement,\n data: { base: number; dash?: string; key: string; opacity?: number; present: boolean; y: number }[],\n xScale: BandScale,\n yScale: Scale<number>,\n baselineY: number,\n options: BarRenderOptions,\n): void {\n activeBarAnimations.get(parent)?.();\n activeBarAnimations.delete(parent);\n const existingBars = barsOf(parent);\n\n for (const extra of existingBars.slice(data.length)) extra.remove();\n\n const bandwidth = xScale.bandwidth();\n const barBand = options.stacked ? bandwidth : bandwidth / options.seriesCount;\n const bandSize = Math.max(0, barBand - 1);\n const offset = options.stacked ? 0 : barBand * options.seriesIndex;\n const horizontal = options.horizontal ?? false;\n // A group with no bars yet is mounting: every bar enters together through a grow\n // reveal. A group that already has bars updates in place (with per-bar attr tweens).\n const isMount = existingBars.length === 0;\n\n const enterTargets: AnimationTarget[] = [];\n const updateTargets: AnimationTarget[] = [];\n const lanes: GrowRevealLane[] = [];\n const motion = resolveMotion(options.transition, { defaultStagger: isMount ? 0 : DEFAULT_NEW_BAR_STAGGER });\n const animateBars = motion.duration > 0;\n // A long category axis must not stretch the entrance past ~400 ms of added delay.\n const enterStagger = Math.min(motion.stagger, MAX_STAGGER_TOTAL / Math.max(1, data.length));\n\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n const bandPos = xScale.map(d.key) + offset;\n const barBaselineY = options.baselineYs ? options.baselineYs[i] : baselineY;\n const valuePx = yScale.map(d.y);\n\n let rect = existingBars[i];\n\n const isNew = !rect;\n\n if (!rect) {\n rect = createSvgElement('rect', { class: 'prism-bar' });\n parent.appendChild(rect);\n }\n\n rect.style.display = d.present ? '' : 'none';\n\n // Presentation attributes (not inline styles) so CSS interaction states\n // like the focus-dim rule keep winning over per-datum styling.\n setAttributes(rect, {\n opacity: d.opacity,\n stroke: d.dash ? options.color : undefined,\n 'stroke-dasharray': d.dash,\n 'stroke-width': d.dash ? 1 : undefined,\n });\n\n if (horizontal) {\n // Horizontal: category on Y axis, value on X axis\n // baselineY here is actually the baseline X (yScale.map(0) in value-space mapped to screen X)\n const finalWidth = Math.max(0, Math.abs(barBaselineY - valuePx));\n const finalX = Math.min(valuePx, barBaselineY);\n\n setAttributes(rect, {\n fill: options.color,\n height: bandSize,\n rx: options.borderRadius,\n ry: options.borderRadius,\n y: bandPos,\n });\n\n if (isMount) {\n // Final geometry now; the grow reveal below uncovers it lane by lane.\n setAttributes(rect, { width: finalWidth, x: finalX });\n\n if (animateBars) {\n lanes.push({ anchor: barBaselineY, height: bandSize, width: finalWidth, x: finalX, y: bandPos });\n }\n } else if (animateBars) {\n if (isNew) {\n setAttributes(rect, { width: 0, x: barBaselineY });\n enterTargets.push({\n attrs: { width: { from: 0, to: finalWidth }, x: { from: barBaselineY, to: finalX } },\n el: rect,\n });\n } else {\n updateTargets.push({\n attrs: {\n width: { from: Number(rect.getAttribute('width') ?? finalWidth), to: finalWidth },\n x: { from: Number(rect.getAttribute('x') ?? finalX), to: finalX },\n },\n el: rect,\n });\n }\n } else {\n setAttributes(rect, { width: finalWidth, x: finalX });\n }\n } else {\n // Vertical (default)\n const finalHeight = Math.max(0, Math.abs(barBaselineY - valuePx));\n const finalY = Math.min(valuePx, barBaselineY);\n\n setAttributes(rect, {\n fill: options.color,\n rx: options.borderRadius,\n ry: options.borderRadius,\n width: bandSize,\n x: bandPos,\n });\n\n if (isMount) {\n // Final geometry now; the grow reveal below uncovers it lane by lane, so a\n // rounded bar never renders as a corner-clamped 1-3 px sliver mid-grow.\n setAttributes(rect, { height: finalHeight, y: finalY });\n\n if (animateBars) {\n lanes.push({ anchor: barBaselineY, height: finalHeight, width: bandSize, x: bandPos, y: finalY });\n }\n } else if (animateBars) {\n if (isNew) {\n setAttributes(rect, { height: 0, y: barBaselineY });\n enterTargets.push({\n attrs: { height: { from: 0, to: finalHeight }, y: { from: barBaselineY, to: finalY } },\n el: rect,\n });\n } else {\n updateTargets.push({\n attrs: {\n height: { from: Number(rect.getAttribute('height') ?? finalHeight), to: finalHeight },\n y: { from: Number(rect.getAttribute('y') ?? finalY), to: finalY },\n },\n el: rect,\n });\n }\n } else {\n setAttributes(rect, { height: finalHeight, y: finalY });\n }\n }\n }\n\n if (animateBars) {\n const cancels: (() => void)[] = [];\n\n if (isMount && lanes.length > 0) {\n cancels.push(\n playGrowReveal(parent, lanes, () => {}, motion, {\n axis: horizontal ? 'x' : 'y',\n signal: options.disposalSignal,\n stagger: enterStagger,\n }),\n );\n }\n\n if (enterTargets.length > 0) {\n cancels.push(animate(enterTargets, { ...motion, stagger: enterStagger }, undefined, options.disposalSignal));\n }\n\n if (updateTargets.length > 0) {\n cancels.push(animate(updateTargets, { ...motion, stagger: 0 }, undefined, options.disposalSignal));\n }\n\n activeBarAnimations.set(parent, () => {\n for (const cancel of cancels) cancel();\n });\n }\n}\n","import { warn } from '../../_dev';\nimport { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { normalizeCartesianSeries } from '../../core/cartesian-model';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { describeValues } from '../../interaction/announcer';\nimport { getMousePosition } from '../../interaction/events';\nimport { comparisonContent } from '../../interaction/tooltip';\nimport { bandScale } from '../../scales/band';\nimport { linearScale } from '../../scales/linear';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport type {\n BarChartConfig,\n BarSeriesConfig,\n BarVariant,\n ChartEvent,\n ChartHandle,\n Datum,\n SeriesValue,\n XAxisConfig,\n YAxisConfig,\n} from '../../types';\nimport { findCatIdx, findSeriesIdx } from './bar-hit-test';\nimport { renderBars } from './bar-renderer';\nimport type { BarScaleContext } from './bar-scale-context';\n\nfunction variantFlags(variant: BarVariant): { horizontal: boolean; stacked: boolean } {\n return {\n horizontal: variant === 'grouped-horizontal' || variant === 'stacked-horizontal',\n stacked: variant === 'stacked' || variant === 'stacked-horizontal',\n };\n}\n\n// ─── Chart ────────────────────────────────────────────────────────────────────\n\nexport function createBarChart(container: HTMLElement, config: BarChartConfig): ChartHandle<BarSeriesConfig[]> {\n let seriesList = config.series;\n let band: SVGRectElement | null = null;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const sourceData = seriesList.map((series) => series.data);\n const model = normalizeCartesianSeries(seriesList, sourceData);\n const categories = model.domain;\n const allData = model.series.map(({ byKey }) => categories.map((key) => byKey.get(key)));\n const categoryAxis = (axis: XAxisConfig | YAxisConfig) => {\n return {\n ...axis,\n tickFormat: (value: Date | number | string) => {\n const key = String(value);\n const label = model.labels.get(key) ?? value;\n\n return axis.tickFormat ? axis.tickFormat(label) : String(label);\n },\n };\n };\n\n if (categories.length === 0) {\n clearCartesianDom(groups, legend, tooltip);\n band?.remove();\n band = null;\n\n return;\n }\n\n const { horizontal, stacked } = variantFlags(config.variant ?? 'grouped');\n\n // Axes render by default; `false` opts out. The value axis (x when horizontal, y\n // otherwise) carries gridlines by default and merges over that default, so a partial\n // config (e.g. only `tickFormat`) keeps the gridlines; the category axis defaults to none.\n const xAxisConfig: XAxisConfig | false =\n config.xAxis === false ? false : horizontal ? { grid: true, ...config.xAxis } : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false =\n config.yAxis === false ? false : horizontal ? (config.yAxis ?? {}) : { grid: true, ...config.yAxis };\n\n // Value domain\n let vMax: number;\n let vMin: number;\n\n if (stacked) {\n if (allData.some((seriesData) => seriesData.some((datum) => (datum?.value ?? 0) < 0))) {\n warn(\n 'createBarChart: negative values in a stacked/stacked-horizontal series are clamped to 0: stacking mixed-sign data is not supported.',\n );\n }\n\n const sums = categories.map((_, categoryIndex) =>\n allData.reduce((sum, seriesData) => sum + Math.max(0, seriesData[categoryIndex]?.value ?? 0), 0),\n );\n\n vMax = Math.max(...sums);\n vMin = 0;\n } else {\n const allY = allData.flatMap((seriesData) => seriesData.flatMap((datum) => (datum ? [datum.value] : [])));\n\n vMax = Math.max(...allY);\n vMin = Math.min(0, ...allY);\n }\n\n // Build uniform scale context\n const catScale = horizontal\n ? bandScale({ domain: categories, range: [0, area.height] })\n : bandScale({ domain: categories, range: [0, area.width] });\n\n const valScale = horizontal\n ? linearScale({ domain: [vMin, vMax], range: [0, area.width] })\n : linearScale({ domain: [vMin, vMax], range: [area.height, 0] });\n\n const stackedTops: number[][] = [];\n const stackTops = Object.create(null) as Record<string, number>;\n\n for (const cat of categories) stackTops[cat] = 0;\n\n const sc: BarScaleContext = {\n bandCenter: (cat) => catScale.map(cat) + catScale.bandwidth() / 2,\n bandwidth: catScale.bandwidth(),\n baselinePx: valScale.map(0),\n horizontal,\n stacked,\n stackedTops,\n valueScale: valScale,\n };\n\n // Axes & grid\n if (horizontal) {\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n valScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(valScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (yAxisConfig !== false) {\n const yAxis = categoryAxis(yAxisConfig);\n\n positionAxis(groups.yAxis, yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, catScale, yAxis, area.height, 'left');\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, valScale, xAxisConfig, area.width, 'bottom');\n }\n } else {\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n valScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(valScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n }\n\n if (xAxisConfig !== false) {\n const xAxis = categoryAxis(xAxisConfig);\n\n positionAxis(groups.xAxis, xAxis.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, catScale, xAxis, area.width, 'bottom');\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, valScale, yAxisConfig, area.height, 'left');\n }\n }\n\n // Series groups\n // Stacked segments stay square so they join cleanly.\n const themeRadius = stacked\n ? 0\n : Number.parseFloat(getComputedStyle(ctx.svg).getPropertyValue('--prism-bar-radius')) || 0;\n\n while (groups.series.children.length > seriesList.length) {\n const last = groups.series.lastElementChild;\n\n if (last) groups.series.removeChild(last);\n }\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-bar-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const barData = categories.map((key, categoryIndex) => {\n const datum = allData[i]?.[categoryIndex];\n\n if (stacked) {\n const base = stackTops[key] ?? 0;\n const top = base + Math.max(0, datum?.value ?? 0);\n\n stackTops[key] = top;\n\n return { base, dash: datum?.dash, key, opacity: datum?.opacity, present: datum !== undefined, y: top };\n }\n\n return {\n base: 0,\n dash: datum?.dash,\n key,\n opacity: datum?.opacity,\n present: datum !== undefined,\n y: datum?.value ?? 0,\n };\n });\n\n stackedTops[i] = barData.map((d) => d.y);\n\n const baselineYs = stacked ? barData.map((d) => valScale.map(d.base)) : undefined;\n\n renderBars(group, barData, catScale, valScale, sc.baselinePx, {\n baselineYs,\n borderRadius: series.borderRadius ?? themeRadius,\n color: seriesColor(i, series.color),\n disposalSignal: ctx.disposalSignal,\n horizontal,\n seriesCount: seriesList.length,\n seriesIndex: i,\n stacked,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n groups.series.classList.toggle('prism-bars-stacked', stacked);\n\n if (!band || !ctx.chartArea.contains(band)) {\n band = createSvgElement('rect', { 'aria-hidden': 'true', class: 'prism-bar-band', 'pointer-events': 'none' });\n ctx.chartArea.insertBefore(band, groups.series);\n }\n\n band.style.display = 'none';\n\n // ─── Event handlers (close over render-derived state) ─────────────────────\n\n const colors = seriesList.map((s, i) => seriesColor(i, s.color));\n const labelOf = (catIdx: number): string => String(model.labels.get(categories[catIdx]) ?? categories[catIdx]);\n const tooltipFormat = typeof config.tooltip === 'object' ? config.tooltip : undefined;\n const keyOf = (catIdx: number): Datum['key'] => model.labels.get(categories[catIdx]) ?? categories[catIdx];\n const titleOf = (catIdx: number): string =>\n tooltipFormat?.titleFormat ? tooltipFormat.titleFormat(keyOf(catIdx)) : labelOf(catIdx);\n const formatValue = tooltipFormat?.valueFormat ?? String;\n let activeCat = -1;\n\n const valuesAt = (catIdx: number): SeriesValue[] =>\n seriesList.map((series, si) => ({ datum: allData[si]?.[catIdx], series }));\n\n const eventAt = (catIdx: number, seriesIdx: number, originalEvent: Event): ChartEvent | null => {\n const values = valuesAt(catIdx);\n const preferred = values[seriesIdx]?.datum ? seriesIdx : values.findIndex((v) => v.datum);\n const datum = values[preferred]?.datum;\n\n return datum ? { datum, originalEvent, series: seriesList[preferred], values } : null;\n };\n\n const setActive = (catIdx: number): void => {\n activeCat = catIdx;\n groups.series.classList.toggle('prism-bars-focused', catIdx >= 0);\n\n for (const group of groups.series.children) {\n for (const [i, rect] of [...group.children].entries())\n rect.classList.toggle('prism-bar--active', i === catIdx);\n }\n\n if (!band) return;\n\n band.style.display = catIdx < 0 ? 'none' : '';\n\n if (catIdx < 0) return;\n\n const start = sc.bandCenter(categories[catIdx]) - catScale.bandwidth() / 2 - catScale.gap() / 2;\n const size = catScale.bandwidth() + catScale.gap();\n const a = chartArea(ctx.dimensions.width, ctx.dimensions.height, ctx.dimensions.margin);\n\n setAttributes(\n band,\n horizontal\n ? { height: size, width: a.width, x: 0, y: start }\n : { height: a.height, width: size, x: start, y: 0 },\n );\n };\n\n const activate = (catIdx: number, seriesIdx: number, originalEvent: Event): void => {\n const event = eventAt(catIdx, seriesIdx, originalEvent);\n\n if (!event) return;\n\n setActive(catIdx);\n\n const values = event.values ?? [];\n const spoken = describeValues(titleOf(catIdx), values, formatValue);\n\n if (tooltip) {\n const tops = values.map((v, si) =>\n stacked ? (stackedTops[si]?.[catIdx] ?? 0) : Math.max(0, v.datum?.value ?? 0),\n );\n const valuePx = valScale.map(Math.max(...tops));\n const bandCenterPx = sc.bandCenter(categories[catIdx]);\n const { margin } = ctx.dimensions;\n const rows = values.flatMap((v, si) =>\n v.datum\n ? [{ color: colors[si], name: v.series.name, value: formatValue(v.datum.value, v.datum, v.series) }]\n : [],\n );\n\n tooltip.show(\n (horizontal ? valuePx : bandCenterPx) + margin.left,\n (horizontal ? bandCenterPx : valuePx) + margin.top,\n event.datum,\n event.series,\n comparisonContent(ctx.svg.ownerDocument, titleOf(catIdx), rows, spoken),\n );\n } else {\n ctx.announcer.announce(spoken);\n }\n\n config.onHover?.(event);\n };\n\n const deactivate = (): void => {\n setActive(-1);\n tooltip?.hide();\n ctx.announcer.clear();\n config.onHover?.(null);\n };\n\n const hit = (event: MouseEvent): { catIdx: number; seriesIdx: number } | null => {\n const d = ctx.dimensions;\n const pos = getMousePosition(ctx.svg, event, d.margin.left, d.margin.top);\n const a = chartArea(d.width, d.height, d.margin);\n\n if (pos.x < 0 || pos.x > a.width || pos.y < 0 || pos.y > a.height) return null;\n\n const catIdx = findCatIdx(horizontal ? pos.y : pos.x, categories, sc);\n\n return catIdx === -1\n ? null\n : { catIdx, seriesIdx: findSeriesIdx(pos, catIdx, categories, sc, seriesList.length) };\n };\n\n const onMouseMove = (event: MouseEvent) => {\n const target = hit(event);\n\n if (target) activate(target.catIdx, target.seriesIdx, event);\n else if (activeCat >= 0) deactivate();\n };\n\n const onClick = (event: MouseEvent) => {\n const target = config.onClick && hit(event);\n const chartEvent = target && eventAt(target.catIdx, target.seriesIdx, event);\n\n if (chartEvent) config.onClick?.(chartEvent);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n const last = categories.length - 1;\n const prev = activeCat < 0 ? last : Math.max(0, activeCat - 1);\n const next = activeCat < 0 ? 0 : Math.min(last, activeCat + 1);\n const target: Record<string, number> = {\n ArrowDown: next,\n ArrowLeft: prev,\n ArrowRight: next,\n ArrowUp: prev,\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n activate(target[event.key], 0, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && activeCat >= 0 && config.onClick) {\n event.preventDefault();\n\n const chartEvent = eventAt(activeCat, 0, event);\n\n if (chartEvent) config.onClick(chartEvent);\n } else if (event.key === 'Escape') {\n deactivate();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: deactivate, onMouseMove };\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n","import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { cancelReveal, playTraceReveal } from '../../animation/reveal';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport { computeStyleRuns, type DatumMark, hasStyledRuns, type StyleRun } from '../../core/datum-style';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionOption } from '../../types';\n\nexport interface LineRenderOptions {\n /** Plot-area size in area-local coordinates: bounds the entrance mask. */\n bounds: { height: number; width: number };\n color: string;\n curve: 'linear' | 'monotone' | 'step';\n /** Aborted when the owning chart is disposed: stops the transition's `requestAnimationFrame` loop from rescheduling. */\n disposalSignal?: AbortSignal;\n /** Per-datum presentation parallel to `points`; styled runs split the line into subpaths. */\n marks?: readonly DatumMark[];\n pointRadius: number;\n showPoints: boolean;\n /** Explicit width beats the `--prism-line-width` theme token. */\n strokeWidth?: number;\n transition?: TransitionOption;\n}\n\nconst activeAnimations = new WeakMap<SVGGElement, () => void>();\n// Geometry currently on screen, so an update interpolates from it even when the\n// series hides its point markers (the dots would otherwise be the only record).\nconst drawnPoints = new WeakMap<SVGGElement, Point[]>();\n\nfunction buildPath(pts: Point[], curve: LineRenderOptions['curve']): string {\n return curve === 'monotone' ? monotonePath(pts) : curve === 'step' ? stepPath(pts) : linePath(pts);\n}\n\nexport function renderLine(parent: SVGGElement, points: Point[], options: LineRenderOptions): void {\n const styled = hasStyledRuns(options.marks);\n const marks = options.marks ?? [];\n const motion = resolveMotion(options.transition);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n let path: SVGPathElement | null = null;\n let runs: readonly StyleRun[] = [];\n let runPaths: SVGPathElement[] = [];\n\n if (styled) {\n runs = computeStyleRuns(marks, points.length);\n\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-line-path')];\n\n for (const extra of existing.slice(runs.length)) extra.remove();\n\n runPaths = runs.map((_, r) => {\n const reuse = existing[r];\n\n if (reuse) return reuse;\n\n const created = createSvgElement('path', { class: 'prism-line-path', fill: 'none' });\n\n parent.appendChild(created);\n\n return created;\n });\n\n for (const [r, run] of runs.entries()) {\n setAttributes(runPaths[r], {\n opacity: run.opacity,\n stroke: options.color,\n 'stroke-dasharray': run.dash,\n 'stroke-width': options.strokeWidth ?? 2,\n });\n runPaths[r].style.strokeWidth = options.strokeWidth === undefined ? '' : String(options.strokeWidth);\n }\n } else {\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-line-path')];\n\n path = existing[0] ?? null;\n\n for (const stale of existing.slice(1)) stale.remove();\n\n if (!path) {\n path = createSvgElement('path', { class: 'prism-line-path', fill: 'none' });\n parent.appendChild(path);\n }\n\n setAttributes(path, {\n opacity: undefined,\n stroke: options.color,\n 'stroke-dasharray': undefined,\n 'stroke-width': options.strokeWidth ?? 2,\n });\n path.style.strokeWidth = options.strokeWidth === undefined ? '' : String(options.strokeWidth);\n }\n\n const draw = (pts: Point[]): void => {\n if (styled) {\n for (const [r, run] of runs.entries()) {\n setAttributes(runPaths[r], { d: buildPath(pts.slice(run.start, run.end + 1), options.curve) });\n }\n } else {\n setAttributes(path!, { d: buildPath(pts, options.curve) });\n }\n };\n\n let dotsGroup = parent.querySelector<SVGGElement>('.prism-line-dots');\n\n if (options.showPoints) {\n if (!dotsGroup) {\n dotsGroup = createSvgElement('g', { class: 'prism-line-dots' });\n parent.appendChild(dotsGroup);\n }\n } else if (dotsGroup) {\n dotsGroup.remove();\n dotsGroup = null;\n }\n\n if (dur === 0) {\n activeAnimations.get(parent)?.();\n cancelReveal(parent);\n draw(points);\n drawnPoints.set(parent, points);\n\n if (dotsGroup) {\n while (dotsGroup.children.length > points.length) dotsGroup.removeChild(dotsGroup.lastChild!);\n\n for (let i = 0; i < points.length; i++) {\n let c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (!c) {\n c = createSvgElement('circle', { class: 'prism-line-dot' });\n dotsGroup.appendChild(c);\n }\n\n setAttributes(c, {\n cx: points[i].x,\n cy: points[i].y,\n fill: options.color,\n opacity: marks[i]?.opacity,\n r: options.pointRadius,\n });\n }\n }\n\n return;\n }\n\n activeAnimations.get(parent)?.();\n cancelReveal(parent);\n\n const isMount = !drawnPoints.has(parent);\n\n if (dotsGroup) {\n while (dotsGroup.children.length > points.length) dotsGroup.removeChild(dotsGroup.lastChild!);\n\n for (let i = dotsGroup.children.length; i < points.length; i++) {\n const c = createSvgElement('circle', { class: 'prism-line-dot' });\n\n setAttributes(c, {\n fill: options.color,\n opacity: marks[i]?.opacity,\n r: options.pointRadius,\n });\n dotsGroup.appendChild(c);\n }\n\n for (let i = 0; i < dotsGroup.children.length; i++) {\n setAttributes(dotsGroup.children[i] as SVGCircleElement, { opacity: marks[i]?.opacity });\n }\n }\n\n if (isMount) {\n draw(points);\n drawnPoints.set(parent, points);\n\n if (dotsGroup) {\n for (const [i, point] of points.entries()) {\n const c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (c) setAttributes(c, { cx: point.x, cy: point.y });\n }\n }\n\n if (points.length > 1) {\n const renderedPath = path ?? runPaths[0];\n const strokeWidth = options.strokeWidth ?? (Number.parseFloat(getComputedStyle(renderedPath).strokeWidth) || 2);\n const traces = styled\n ? runs.map((run, i) => ({\n d: runPaths[i].getAttribute('d')!,\n end: run.end / (points.length - 1),\n start: run.start / (points.length - 1),\n }))\n : [{ d: path!.getAttribute('d')!, end: 1, start: 0 }];\n\n // A wide trace also uncovers markers as it reaches them, without a second timeline.\n playTraceReveal(\n parent,\n options.bounds,\n traces,\n Math.max(strokeWidth, options.showPoints ? options.pointRadius * 2 : 0) + 2,\n resolveMotion(options.transition, { defaultDuration: 420 }),\n options.disposalSignal,\n );\n }\n\n return;\n }\n\n const fromPts: Point[] = [];\n const drawn = drawnPoints.get(parent) ?? points;\n\n for (const [i, to] of points.entries()) {\n fromPts.push(drawn[i] ?? drawn.at(-1) ?? to);\n }\n\n const paintFrame = (e: number): void => {\n const interpolated: Point[] = points.map((to, i) => {\n const from = fromPts[i] ?? to;\n\n return { x: tweenNumber(from.x, to.x, e), y: tweenNumber(from.y, to.y, e) };\n });\n\n drawnPoints.set(parent, interpolated);\n draw(interpolated);\n\n if (dotsGroup) {\n for (let i = 0; i < points.length; i++) {\n const c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (c) setAttributes(c, { cx: interpolated[i].x, cy: interpolated[i].y });\n }\n }\n };\n\n // The starting geometry goes on screen immediately: `startTween` only paints on\n // the first frame callback, which would otherwise leave one blank frame.\n paintFrame(0);\n\n activeAnimations.set(\n parent,\n startTween({\n count: 1,\n duration: dur,\n easing,\n onComplete: () => {\n activeAnimations.delete(parent);\n drawnPoints.set(parent, points);\n },\n onFrame: (progress) => paintFrame(progress(0)),\n signal: options.disposalSignal,\n }),\n );\n}\n\nexport function computePoints(data: ContinuousDatum[], xScale: Scale<Date | number>, yScale: Scale<number>): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computePoints: datum.key is null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n } else if (data.some((d) => typeof d.key === 'string')) {\n warn('computePoints: string keys are not supported for line/area charts: use numeric or Date keys.');\n }\n\n return data.map((d) => ({\n x: xScale.map(d.key as Date | number),\n y: yScale.map(d.value),\n }));\n}\n","import { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea, resolveMargin } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, LineChartConfig, LineSeriesConfig, XAxisConfig, YAxisConfig } from '../../types';\nimport { computePoints, renderLine } from './line-renderer';\n\nexport function createLineChart(container: HTMLElement, config: LineChartConfig): ChartHandle<LineSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let rightAxis: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const hasRight = seriesList.some((series) => series.yAxis === 'right');\n const hasLeftData = seriesList.some((series) => series.yAxis !== 'right' && series.data.length > 0);\n // The right axis widens the right margin; the effective margin stays local to this\n // render pass (and is handed to the interaction layer) instead of mutating shared dims.\n const margin = {\n ...resolveMargin(config.margin),\n right:\n config.margin?.right ??\n (hasRight ? (config.rightYAxis?.label ? 72 : 50) : resolveMargin(config.margin).right),\n };\n const area = chartArea(dims.width, dims.height, margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const leftY = seriesList\n .filter((series) => series.yAxis !== 'right')\n .flatMap((series) => series.data.map((datum) => datum.value));\n const rightY = seriesList\n .filter((series) => series.yAxis === 'right')\n .flatMap((series) => series.data.map((datum) => datum.value));\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n rightAxis?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n const yScale = buildYScale(leftY, area.height);\n const rightYScale = buildYScale(rightY, area.height);\n\n // Axes render by default (value axis with gridlines); `false` opts out. The value\n // axis merges over its default so a partial config (e.g. only `tickFormat`) keeps\n // the default gridlines.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : { grid: true, ...config.yAxis };\n\n if (yAxisConfig && yAxisConfig.grid && (!hasRight || hasLeftData)) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(yScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n } else {\n groups.grid.replaceChildren();\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(xScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig && (!hasRight || hasLeftData)) {\n const axis = { ...yAxisConfig, position: hasRight ? ('left' as const) : (yAxisConfig.position ?? 'left') };\n positionAxis(groups.yAxis, axis.position, area.width, area.height);\n renderAxis(groups.yAxis, yScale, axis, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n if (hasRight) {\n if (!rightAxis) {\n rightAxis = createSvgElement('g', { class: 'prism-y-axis-right' });\n ctx.chartArea.appendChild(rightAxis);\n }\n const axis = { ...config.rightYAxis, position: 'right' as const };\n positionAxis(rightAxis, 'right', area.width, area.height);\n renderAxis(rightAxis, rightYScale, axis, area.height, 'right');\n } else {\n rightAxis?.replaceChildren();\n }\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-line-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const seriesScale = series.yAxis === 'right' ? rightYScale : yScale;\n const points = computePoints(allData[i], xScale, seriesScale);\n\n allPoints.push(points);\n\n renderLine(group, points, {\n bounds: { height: area.height, width: area.width },\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n marks: series.data,\n pointRadius: series.pointRadius ?? 3,\n showPoints: series.showPoints ?? false,\n strokeWidth: series.strokeWidth,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createSeriesInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n tooltipFormat: typeof config.tooltip === 'object' ? config.tooltip : undefined,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n","// Angles are radians measured clockwise from 12 o'clock.\n\nexport function polarX(cx: number, r: number, angle: number): number {\n return cx + r * Math.sin(angle);\n}\n\nexport function polarY(cy: number, r: number, angle: number): number {\n return cy - r * Math.cos(angle);\n}\n\n/** SVG path coordinate pair (`x,y`) for a polar position. */\nexport function polarPoint(cx: number, cy: number, r: number, angle: number): string {\n return `${polarX(cx, r, angle)},${polarY(cy, r, angle)}`;\n}\n","import { polarPoint as p, polarX as px, polarY as py } from '../../core/polar';\nimport type { PieSliceConfig } from '../../types';\n\nexport interface Arc {\n capEnd: boolean;\n capStart: boolean;\n centerX: number;\n centerY: number;\n color: string;\n cornerRadius: number;\n endAngle: number;\n index: number;\n innerRadius: number;\n outerRadius: number;\n padAngle: number;\n slice: PieSliceConfig;\n startAngle: number;\n}\n\nexport function computeArcs(\n slices: PieSliceConfig[],\n cx: number,\n cy: number,\n outerRadius: number,\n innerRadius: number,\n startAngle: number,\n endAngle: number,\n padPixels: number,\n cornerRadius: number,\n defaultColors: (i: number) => string,\n capEnds = false,\n): Arc[] {\n const total = slices.reduce((s, d) => s + Math.max(0, d.value), 0);\n\n if (total === 0) return [];\n\n const range = endAngle - startAngle;\n const halfGapAngle = outerRadius > 0 ? Math.asin(Math.min(1, padPixels / 2 / outerRadius)) : 0;\n\n let currentAngle = startAngle;\n const n = slices.length;\n\n return slices.map((slice, i) => {\n const fraction = Math.max(0, slice.value) / total;\n const sliceRange = fraction * range;\n const rawStart = currentAngle;\n const rawEnd = currentAngle + sliceRange;\n\n currentAngle += sliceRange;\n\n const padAngle = Math.min(halfGapAngle, sliceRange / 2);\n\n return {\n capEnd: capEnds && i === n - 1,\n capStart: capEnds && i === 0,\n centerX: cx,\n centerY: cy,\n color: slice.color ?? defaultColors(i),\n cornerRadius,\n endAngle: rawEnd,\n index: i,\n innerRadius,\n outerRadius,\n padAngle,\n slice,\n startAngle: rawStart,\n };\n });\n}\n\nexport function arcPath(arc: Arc): string {\n const {\n capEnd,\n capStart,\n centerX: cx,\n centerY: cy,\n cornerRadius: cr,\n endAngle,\n innerRadius,\n outerRadius,\n padAngle,\n startAngle,\n } = arc;\n\n const sweep = endAngle - startAngle;\n\n if (sweep <= 0) return '';\n\n // ── Full circle ─────────────────────────────────────────────────────────────\n if (sweep >= 2 * Math.PI - 1e-6) {\n const mid = startAngle + Math.PI;\n\n if (innerRadius <= 0) {\n return `M${p(cx, cy, outerRadius, startAngle)}A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, mid)}A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, startAngle)}Z`;\n }\n\n return [\n `M${p(cx, cy, outerRadius, startAngle)}`,\n `A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, mid)}`,\n `A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, startAngle)}`,\n `M${p(cx, cy, innerRadius, startAngle)}`,\n `A${innerRadius},${innerRadius},0,1,0,${p(cx, cy, innerRadius, mid)}`,\n `A${innerRadius},${innerRadius},0,1,0,${p(cx, cy, innerRadius, startAngle)}`,\n 'Z',\n ].join('');\n }\n\n // Cap ends don't get a padAngle inset (no adjacent slice on that side)\n const sa = capStart ? startAngle : startAngle + padAngle;\n const ea = capEnd ? endAngle : endAngle - padAngle;\n\n if (ea <= sa) return '';\n\n const paddedSweep = ea - sa;\n\n // ── No rounding ─────────────────────────────────────────────────────────────\n if (cr <= 0) {\n const large = paddedSweep > Math.PI ? 1 : 0;\n\n if (innerRadius <= 0) {\n return `M${cx},${cy}L${p(cx, cy, outerRadius, sa)}A${outerRadius},${outerRadius},0,${large},1,${p(cx, cy, outerRadius, ea)}Z`;\n }\n\n return [\n `M${p(cx, cy, outerRadius, sa)}`,\n `A${outerRadius},${outerRadius},0,${large},1,${p(cx, cy, outerRadius, ea)}`,\n `L${p(cx, cy, innerRadius, ea)}`,\n `A${innerRadius},${innerRadius},0,${large},0,${p(cx, cy, innerRadius, sa)}`,\n 'Z',\n ].join('');\n }\n\n // ── Rounded corners (or semicircle caps at open ends) ────────────────────────\n // Corner bezier pull amounts\n const outerPull = Math.min(cr / outerRadius, paddedSweep / 2);\n const innerPull = Math.min(cr / innerRadius, paddedSweep / 2);\n const radialPull = Math.min(cr, (outerRadius - innerRadius) / 2);\n const capR = (outerRadius - innerRadius) / 2; // semicircle cap radius\n\n // Shortened arc angles (for corners)\n const oS = sa + (capStart ? 0 : outerPull);\n const oE = ea - (capEnd ? 0 : outerPull);\n const iS = sa + (capStart ? 0 : innerPull);\n const iE = ea - (capEnd ? 0 : innerPull);\n\n const largeO = oE - oS > Math.PI ? 1 : 0;\n const largeI = iE - iS > Math.PI ? 1 : 0;\n\n // Unrounded corner cartesian positions (at full sa/ea, not shortened)\n const cxOs = px(cx, outerRadius, sa);\n const cyOs = py(cy, outerRadius, sa);\n const cxOe = px(cx, outerRadius, ea);\n const cyOe = py(cy, outerRadius, ea);\n const cxIs = px(cx, innerRadius, sa);\n const cyIs = py(cy, innerRadius, sa);\n const cxIe = px(cx, innerRadius, ea);\n const cyIe = py(cy, innerRadius, ea);\n\n const frac = radialPull / (outerRadius - innerRadius);\n const pOsRad = `${cxOs + (cxIs - cxOs) * frac},${cyOs + (cyIs - cyOs) * frac}`;\n const pOeRad = `${cxOe + (cxIe - cxOe) * frac},${cyOe + (cyIe - cyOe) * frac}`;\n const pIsRad = `${cxIs + (cxOs - cxIs) * frac},${cyIs + (cyOs - cyIs) * frac}`;\n const pIeRad = `${cxIe + (cxOe - cxIe) * frac},${cyIe + (cyOe - cyIe) * frac}`;\n\n const segs: string[] = [];\n\n // Start edge\n if (capStart) {\n segs.push(`M${p(cx, cy, outerRadius, sa)}`);\n } else {\n segs.push(`M${pOsRad}`);\n segs.push(`Q${cxOs},${cyOs},${p(cx, cy, outerRadius, oS)}`);\n }\n\n // Outer arc\n segs.push(`A${outerRadius},${outerRadius},0,${largeO},1,${p(cx, cy, outerRadius, oE)}`);\n\n // End edge\n if (capEnd) {\n // Semicircle cap from outer-end → inner-end, bulging away from center (CW)\n segs.push(`A${capR},${capR},0,0,1,${p(cx, cy, innerRadius, ea)}`);\n } else {\n segs.push(`Q${cxOe},${cyOe},${pOeRad}`);\n segs.push(`L${pIeRad}`);\n segs.push(`Q${cxIe},${cyIe},${p(cx, cy, innerRadius, iE)}`);\n }\n\n // Inner arc (reversed, CCW)\n segs.push(`A${innerRadius},${innerRadius},0,${largeI},0,${p(cx, cy, innerRadius, iS)}`);\n\n // Start edge close\n if (capStart) {\n // Semicircle cap from inner-start → outer-start, bulging away from center (CCW)\n segs.push(`A${capR},${capR},0,0,0,${p(cx, cy, outerRadius, sa)}`);\n } else {\n segs.push(`Q${cxIs},${cyIs},${pIsRad}`);\n }\n\n segs.push('Z');\n\n return segs.join('');\n}\n\nexport function arcCentroid(arc: Arc): { x: number; y: number } {\n const mid = (arc.startAngle + arc.endAngle) / 2;\n const r = (arc.outerRadius + arc.innerRadius) / 2;\n\n return {\n x: arc.centerX + r * Math.sin(mid),\n y: arc.centerY - r * Math.cos(mid),\n };\n}\n","import { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport type { ChartEventHandlers } from '../../core/chart-scaffold';\nimport { createRadialScaffold } from '../../core/chart-scaffold';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { estimateTextWidth } from '../../svg/text';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, PieChartConfig, PieSliceConfig } from '../../types';\nimport { type Arc, arcCentroid, arcPath, computeArcs } from './pie-renderer';\n\nconst TWO_PI = 2 * Math.PI;\n/** Default `--prism-pie-label-size` in px, used to decide whether a label fits its slice. */\nconst LABEL_FONT_SIZE = 12;\n\n/** A label fits when its slice is wide enough along the centroid arc and thick enough radially. */\nfunction labelFits(arc: Arc, label: string): boolean {\n const thickness = arc.outerRadius - arc.innerRadius;\n const midRadius = (arc.outerRadius + arc.innerRadius) / 2;\n const arcLength = (arc.endAngle - arc.startAngle - 2 * arc.padAngle) * midRadius;\n\n return thickness >= LABEL_FONT_SIZE * 1.4 && arcLength >= estimateTextWidth(label, LABEL_FONT_SIZE) + 8;\n}\n\nconst SEMI_START = -Math.PI / 2; // -90° = 9-o'clock (left)\nconst SEMI_END = Math.PI / 2; // +90° = 3-o'clock (right) → true 180° half-circle\n\nfunction semiAngles(variant: PieChartConfig['variant']): { end: number; start: number } {\n return variant === 'semi' ? { end: SEMI_END, start: SEMI_START } : { end: TWO_PI, start: 0 };\n}\n\nexport function createPieChart(container: HTMLElement, config: PieChartConfig): ChartHandle<PieSliceConfig[]> {\n const variant = config.variant ?? 'pie';\n const padPixels = config.padPixels ?? (variant === 'pie' ? 0 : 8);\n const cornerRadius = config.cornerRadius ?? (variant === 'pie' ? 0 : 8);\n let data = config.data;\n\n // Pie SVG elements live directly on the SVG (not inside chartArea groups).\n // We create them once and reuse across renders.\n const bgCircle = createSvgElement('circle', { class: 'prism-pie-bg', 'pointer-events': 'none' });\n const pieGroup = createSvgElement('g', {\n class: 'prism-pie-slices',\n 'shape-rendering': 'geometricPrecision',\n });\n const labelGroup = createSvgElement('g', { class: 'prism-pie-labels', 'pointer-events': 'none' });\n\n // Current arcs shared between renderFn and event handlers via closure.\n let currentArcs: Arc[] = [];\n // The geometry actually on screen right now (mid-tween included): the update\n // morph interpolates from this, so interrupting a tween never jumps.\n let drawnArcs: Arc[] = [];\n let activeTween: (() => void) | null = null;\n\n function renderLabels(slices: PieSliceConfig[]): void {\n labelGroup.replaceChildren();\n\n for (let i = 0; i < currentArcs.length; i++) {\n const arc = currentArcs[i];\n const slice = slices[i];\n\n if (!slice?.label || !labelFits(arc, slice.label)) continue;\n\n const { x, y } = arcCentroid(arc);\n const text = createSvgElement('text', { class: 'prism-pie-label' });\n\n setAttributes(text, {\n 'dominant-baseline': 'middle',\n fill: 'var(--prism-pie-label-color, #fff)',\n 'font-family': 'var(--prism-font-family, system-ui)',\n 'font-size': 'var(--prism-pie-label-size, 12px)',\n 'text-anchor': 'middle',\n x,\n y,\n });\n\n text.textContent = slice.label;\n labelGroup.appendChild(text);\n }\n }\n\n return createRadialScaffold(\n container,\n {\n a11y: config.a11y,\n legend: config.legend,\n tooltip: config.tooltip,\n },\n (ctx): ChartEventHandlers => {\n const { legend, svg, tooltip } = ctx;\n const hasSlices = data.some((slice) => slice.value > 0);\n legend?.update(\n hasSlices ? data.map((slice, i) => ({ color: slice.color ?? seriesColor(i), name: slice.label ?? '' })) : [],\n );\n\n // Append pie groups to SVG on first render (idempotent).\n if (!svg.contains(bgCircle)) {\n svg.appendChild(bgCircle);\n svg.appendChild(pieGroup);\n svg.appendChild(labelGroup);\n }\n\n const { height: h, width: w } = ctx.dimensions;\n const isSemi = variant === 'semi';\n const cx = w / 2;\n const cy = isSemi ? h * 0.85 : h / 2;\n const padding = 8;\n const outer = isSemi ? Math.min(cx, cy) - padding : Math.min(w, h) / 2 - padding;\n const defaultInner = variant === 'pie' ? 0 : Math.round(outer * 0.55);\n const inner = config.innerRadius !== undefined ? config.innerRadius : defaultInner;\n const outerR = Math.max(inner + 1, outer);\n\n const slices = data;\n const { end, start } = semiAngles(variant);\n\n currentArcs = computeArcs(\n slices,\n cx,\n cy,\n outerR,\n inner,\n start,\n end,\n padPixels,\n cornerRadius,\n (i) => seriesColor(i),\n false,\n );\n\n setAttributes(bgCircle, { cx, cy, r: inner > 0 ? inner : 0 });\n bgCircle.setAttribute('style', 'fill:var(--prism-bg,#fff)');\n\n while (pieGroup.children.length > currentArcs.length) pieGroup.removeChild(pieGroup.lastChild!);\n\n labelGroup.replaceChildren();\n\n const motion = resolveMotion(config.transition);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n for (let i = 0; i < currentArcs.length; i++) {\n const arc = currentArcs[i];\n let path = pieGroup.children[i] as SVGPathElement | undefined;\n\n if (!path) {\n path = createSvgElement('path', { class: 'prism-pie-slice' });\n pieGroup.appendChild(path);\n }\n\n path.setAttribute('fill', arc.color);\n path.setAttribute('stroke', 'none');\n path.style.cursor = config.onClick || config.onHover ? 'pointer' : '';\n }\n\n activeTween?.();\n\n // Mount sweeps the ring in once; an update morphs every slice from its\n // drawn angles to the new ones, which reads as the data changing rather\n // than the chart redrawing.\n const isMount = drawnArcs.length === 0;\n const fromArcs = drawnArcs;\n\n activeTween = startTween({\n count: 1,\n duration: dur,\n easing,\n onComplete: () => renderLabels(slices),\n onFrame: (progress) => {\n const e = progress(0);\n\n if (isMount) {\n const revealAngle = tweenNumber(start, end, e);\n\n drawnArcs = currentArcs.map((a, j) => {\n const el = pieGroup.children[j] as SVGPathElement | undefined;\n\n if (!el) return a;\n\n if (revealAngle <= a.startAngle) {\n setAttributes(el, { d: '' });\n\n return { ...a, endAngle: a.startAngle };\n }\n\n const visibleEnd = Math.min(a.endAngle, revealAngle);\n\n setAttributes(el, { d: arcPath({ ...a, endAngle: visibleEnd }) });\n\n return { ...a, endAngle: visibleEnd };\n });\n\n return;\n }\n\n drawnArcs = currentArcs.map((to, j) => {\n const el = pieGroup.children[j] as SVGPathElement | undefined;\n const lastDrawn = fromArcs.at(-1);\n // A slice that was not drawn before grows out of the end of the last drawn one.\n const from: Arc = fromArcs[j] ?? {\n ...to,\n endAngle: lastDrawn?.endAngle ?? start,\n startAngle: lastDrawn?.endAngle ?? start,\n };\n const morphed: Arc = {\n ...to,\n endAngle: tweenNumber(from.endAngle, to.endAngle, e),\n innerRadius: tweenNumber(from.innerRadius, to.innerRadius, e),\n outerRadius: tweenNumber(from.outerRadius, to.outerRadius, e),\n padAngle: tweenNumber(from.padAngle, to.padAngle, e),\n startAngle: tweenNumber(from.startAngle, to.startAngle, e),\n };\n\n if (!el) return morphed;\n\n setAttributes(el, {\n d: morphed.endAngle - morphed.startAngle <= 1e-6 ? '' : arcPath(morphed),\n });\n\n return morphed;\n });\n },\n signal: ctx.disposalSignal,\n });\n\n tooltip?.hide();\n\n const total = currentArcs.reduce((sum, arc) => sum + Math.max(0, arc.slice.value), 0);\n let activeIndex = -1;\n\n const describe = (arc: Arc): string => {\n const percent = total > 0 ? Math.round((Math.max(0, arc.slice.value) / total) * 1000) / 10 : 0;\n\n return `${arc.slice.label ?? `Slice ${arc.index + 1}`}: ${arc.slice.value} (${percent}%)`;\n };\n\n const setActive = (index: number): void => {\n activeIndex = index;\n pieGroup.classList.toggle('prism-pie-focused', index >= 0);\n for (const [i, el] of [...pieGroup.children].entries())\n el.classList.toggle('prism-pie-slice--active', i === index);\n };\n\n const activate = (index: number, originalEvent: Event): void => {\n const arc = currentArcs[index];\n\n if (!arc) return;\n\n setActive(index);\n config.onHover?.({ index, originalEvent, slice: arc.slice });\n\n const text = describe(arc);\n\n if (!tooltip) {\n ctx.announcer.announce(text);\n\n return;\n }\n\n const { x, y } = arcCentroid(arc);\n const svgRect = svg.getBoundingClientRect();\n const contR = container.getBoundingClientRect();\n\n tooltip.show(\n x + (svgRect.left - contR.left),\n y + (svgRect.top - contR.top),\n { key: index, value: arc.slice.value },\n { color: arc.color, data: [], name: arc.slice.label ?? '' },\n text,\n );\n };\n\n const deactivate = (): void => {\n setActive(-1);\n tooltip?.hide();\n ctx.announcer.clear();\n config.onHover?.(null);\n };\n\n const hitAt = (e: MouseEvent): number => {\n const svgRect = svg.getBoundingClientRect();\n\n return hitTestArc(currentArcs, e.clientX - svgRect.left, e.clientY - svgRect.top, variant);\n };\n\n const onMouseMove = (e: MouseEvent): void => {\n const hit = hitAt(e);\n\n if (hit >= 0) {\n if (hit !== activeIndex) activate(hit, e);\n } else if (activeIndex >= 0) {\n deactivate();\n }\n };\n\n const onClick = (e: MouseEvent): void => {\n if (!config.onClick) return;\n\n const hit = hitAt(e);\n\n if (hit >= 0) config.onClick({ index: hit, originalEvent: e, slice: currentArcs[hit].slice });\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n const count = currentArcs.length;\n\n if (count === 0) return;\n\n const step: Record<string, number> = { ArrowDown: 1, ArrowLeft: -1, ArrowRight: 1, ArrowUp: -1 };\n\n if (e.key in step) {\n e.preventDefault();\n activate(\n activeIndex < 0 ? (step[e.key] > 0 ? 0 : count - 1) : (activeIndex + step[e.key] + count) % count,\n e,\n );\n } else if (e.key === 'Home' || e.key === 'End') {\n e.preventDefault();\n activate(e.key === 'Home' ? 0 : count - 1, e);\n } else if ((e.key === 'Enter' || e.key === ' ') && activeIndex >= 0 && config.onClick) {\n e.preventDefault();\n config.onClick({ index: activeIndex, originalEvent: e, slice: currentArcs[activeIndex].slice });\n } else if (e.key === 'Escape') {\n deactivate();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: deactivate, onMouseMove };\n },\n (next) => {\n data = next;\n },\n );\n}\n\nfunction hitTestArc(arcs: Arc[], mx: number, my: number, variant: PieChartConfig['variant']): number {\n for (let i = 0; i < arcs.length; i++) {\n const arc = arcs[i];\n const dx = mx - arc.centerX;\n const dy = my - arc.centerY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < arc.outerRadius && dist >= arc.innerRadius) {\n const rawAngle = Math.atan2(dx, -dy);\n\n if (variant === 'semi') {\n if (rawAngle >= arc.startAngle - 1e-9 && rawAngle <= arc.endAngle + 1e-9) return i;\n } else {\n const angle = rawAngle < 0 ? rawAngle + TWO_PI : rawAngle;\n\n if (angle >= arc.startAngle - 1e-9 && angle <= arc.endAngle + 1e-9) return i;\n }\n }\n }\n\n return -1;\n}\n","import { polarX, polarY } from '../../core/polar';\nimport { linearScale } from '../../scales/linear';\nimport type { Point } from '../../svg/path';\nimport { estimateTextWidth } from '../../svg/text';\nimport type { RadarAxisConfig, RadarSeriesConfig } from '../../types';\n\nconst TWO_PI = 2 * Math.PI;\n\nexport type LabelAnchor = 'end' | 'middle' | 'start';\nexport type LabelBaseline = 'auto' | 'hanging' | 'middle';\n\nexport function toRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nexport function axisAngles(count: number, startAngle = 0): number[] {\n return Array.from({ length: count }, (_, i) => startAngle + (i * TWO_PI) / count);\n}\n\n/** Per-axis `[min, max]`: axis overrides win over `domain`, which wins over a nice range around the data. */\nexport function resolveAxisDomains(\n axes: readonly RadarAxisConfig[],\n series: readonly RadarSeriesConfig[],\n domain?: [number, number],\n): [number, number][] {\n let shared = domain;\n\n if (!shared) {\n const values = series.flatMap((s) => s.data.map((d) => d.value)).filter(Number.isFinite);\n const min = Math.min(0, ...values);\n const max = values.length ? Math.max(...values) : 1;\n\n shared = linearScale({ domain: [min, max > min ? max : min + 1], range: [0, 1] }).domain as [number, number];\n }\n\n return axes.map((axis) => [axis.min ?? shared[0], axis.max ?? shared[1]]);\n}\n\nexport function normalize(value: number, [min, max]: readonly [number, number]): number {\n if (max === min) return 0;\n\n return Math.max(0, Math.min(1, (value - min) / (max - min)));\n}\n\nexport function radarPoints(\n fractions: readonly number[],\n cx: number,\n cy: number,\n radius: number,\n angles: readonly number[],\n): Point[] {\n return fractions.map((f, i) => ({ x: polarX(cx, radius * f, angles[i]), y: polarY(cy, radius * f, angles[i]) }));\n}\n\n/** Closed outline through every point; `rounded` uses a closed Catmull–Rom spline. */\nexport function closedPath(points: readonly Point[], curve: 'linear' | 'rounded' = 'linear'): string {\n const n = points.length;\n\n if (n === 0) return '';\n\n const [first] = points;\n\n if (curve === 'linear' || n < 3) {\n return `M${first.x},${first.y}${points\n .slice(1)\n .map((p) => `L${p.x},${p.y}`)\n .join('')}Z`;\n }\n\n let d = `M${first.x},${first.y}`;\n\n for (let i = 0; i < n; i++) {\n const p0 = points[(i - 1 + n) % n];\n const p1 = points[i];\n const p2 = points[(i + 1) % n];\n const p3 = points[(i + 2) % n];\n\n d += `C${p1.x + (p2.x - p0.x) / 6},${p1.y + (p2.y - p0.y) / 6} ${p2.x - (p3.x - p1.x) / 6},${p2.y - (p3.y - p1.y) / 6} ${p2.x},${p2.y}`;\n }\n\n return `${d}Z`;\n}\n\nexport function ringPath(\n shape: 'circle' | 'polygon',\n cx: number,\n cy: number,\n r: number,\n angles: readonly number[],\n): string {\n if (r <= 0) return '';\n\n if (shape === 'circle') return `M${cx},${cy - r}A${r},${r} 0 1 1 ${cx},${cy + r}A${r},${r} 0 1 1 ${cx},${cy - r}Z`;\n\n return closedPath(\n radarPoints(\n angles.map(() => 1),\n cx,\n cy,\n r,\n angles,\n ),\n );\n}\n\nexport function labelPlacement(angle: number): { anchor: LabelAnchor; baseline: LabelBaseline } {\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n\n return {\n anchor: Math.abs(sin) < 0.1 ? 'middle' : sin > 0 ? 'start' : 'end',\n baseline: cos > 0.9 ? 'auto' : cos < -0.9 ? 'hanging' : 'middle',\n };\n}\n\n/** Largest radius that leaves room for the axis labels around it. */\nexport function fitRadius(\n width: number,\n height: number,\n labels: readonly string[],\n angles: readonly number[],\n fontSize: number,\n gap: number,\n): number {\n let side = 0;\n\n labels.forEach((label, i) => {\n if (labelPlacement(angles[i]).anchor !== 'middle') side = Math.max(side, estimateTextWidth(label, fontSize));\n });\n\n const lineHeight = fontSize * 1.3;\n\n return Math.max(8, Math.min(width / 2 - gap - side, height / 2 - gap - lineHeight));\n}\n\n/** Index of the axis closest in angle to the offset `(dx, dy)` from the centre. */\nexport function nearestAxis(dx: number, dy: number, count: number, startAngle = 0): number {\n if (count === 0) return -1;\n\n const step = TWO_PI / count;\n const angle = (((Math.atan2(dx, -dy) - startAngle) % TWO_PI) + TWO_PI) % TWO_PI;\n\n return Math.round(angle / step) % count;\n}\n","import { devOnly, warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport type { ChartEventHandlers } from '../../core/chart-scaffold';\nimport { createRadialScaffold } from '../../core/chart-scaffold';\nimport { uniqueId } from '../../core/ids';\nimport { polarX, polarY } from '../../core/polar';\nimport { seriesDomId } from '../../core/series-id';\nimport { describeValues } from '../../interaction/announcer';\nimport { comparisonContent } from '../../interaction/tooltip';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport type {\n ChartHandle,\n RadarAxisConfig,\n RadarAxisValue,\n RadarChartConfig,\n RadarEvent,\n RadarGridConfig,\n RadarSeriesConfig,\n} from '../../types';\nimport {\n axisAngles,\n closedPath,\n fitRadius,\n labelPlacement,\n nearestAxis,\n normalize,\n radarPoints,\n resolveAxisDomains,\n ringPath,\n toRadians,\n} from './radar-geometry';\n\n/** Default `--prism-font-size-label` (0.6875rem) in px, used to reserve label room. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 12;\nconst VALUE_OFFSET = 10;\nconst ARROW_STEPS: Record<string, number> = { ArrowDown: 1, ArrowLeft: -1, ArrowRight: 1, ArrowUp: -1 };\n\nfunction warnOnInvalid(axes: readonly RadarAxisConfig[], series: readonly RadarSeriesConfig[]): void {\n devOnly(() => {\n if (axes.length < 3) warn(`Radar chart needs at least 3 axes, received ${axes.length}.`);\n\n const keys = new Set(axes.map((axis) => axis.key));\n\n if (keys.size !== axes.length) warn('Radar chart axis keys must be unique.');\n\n for (const s of series) {\n for (const d of s.data) {\n if (!keys.has(d.key)) warn(`Radar series \"${s.name}\" has a value for unknown axis \"${d.key}\".`);\n }\n }\n });\n}\n\nfunction resolveGrid(grid: RadarChartConfig['grid']): Required<RadarGridConfig> | null {\n if (grid === false) return null;\n\n return { bands: true, labels: false, levels: 4, shape: 'polygon', ...(typeof grid === 'object' ? grid : {}) };\n}\n\nexport function createRadarChart(container: HTMLElement, config: RadarChartConfig): ChartHandle<RadarSeriesConfig[]> {\n const { axes } = config;\n const curve = config.curve ?? 'linear';\n const fill = config.fill ?? 'solid';\n const showPoints = config.showPoints ?? true;\n const grid = resolveGrid(config.grid);\n const startAngle = toRadians(config.startAngle ?? 0);\n const angles = axisAngles(axes.length, startAngle);\n const labelGap = LABEL_GAP + (config.showValues ? VALUE_OFFSET : 0);\n const id = uniqueId('prism-radar');\n let series = config.series;\n\n warnOnInvalid(axes, series);\n\n const root = createSvgElement('g', { class: 'prism-radar' });\n const defs = createSvgElement('defs');\n const gridGroup = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-radar-grid' });\n const seriesGroup = createSvgElement('g', { class: 'prism-radar-series-group' });\n const labelGroup = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-radar-labels' });\n\n root.append(defs, gridGroup, seriesGroup, labelGroup);\n\n let drawn: number[][] = [];\n let activeTween: (() => void) | null = null;\n let activeIndex = -1;\n let layout = { cx: 0, cy: 0, radius: 0 };\n\n const datumAt = (s: RadarSeriesConfig, index: number) => s.data.find((d) => d.key === axes[index].key);\n const valuesAt = (index: number): RadarAxisValue[] => series.map((s) => ({ datum: datumAt(s, index), series: s }));\n const formatValue = (index: number, value: number): string => axes[index].format?.(value) ?? String(value);\n const describe = (index: number): string =>\n describeValues(axes[index].label, valuesAt(index), (value) => formatValue(index, value));\n\n function draw(fractions: number[][]): void {\n const { cx, cy, radius } = layout;\n\n fractions.forEach((row, i) => {\n const group = seriesGroup.children[i];\n\n if (!group) return;\n\n const points = radarPoints(row, cx, cy, radius, angles);\n\n group.querySelector('.prism-radar-area')?.setAttribute('d', closedPath(points, curve));\n group.querySelectorAll<SVGCircleElement>('.prism-radar-point').forEach((dot, j) => {\n setAttributes(dot, { cx: points[j].x, cy: points[j].y });\n });\n group.querySelectorAll<SVGTextElement>('.prism-radar-value').forEach((text, j) => {\n const r = radius * row[j] + VALUE_OFFSET;\n\n setAttributes(text, { x: polarX(cx, r, angles[j]), y: polarY(cy, r, angles[j]) });\n });\n });\n }\n\n function renderGrid(domains: [number, number][]): void {\n gridGroup.replaceChildren();\n\n if (!grid) return;\n\n const { cx, cy, radius } = layout;\n const levels = Math.max(1, Math.round(grid.levels));\n const rings = Array.from({ length: levels }, (_, k) =>\n ringPath(grid.shape, cx, cy, (radius * (k + 1)) / levels, angles),\n );\n\n if (grid.bands) {\n // Shade alternate rings, starting from the outermost.\n for (let k = levels - 1; k >= 0; k -= 2) {\n gridGroup.appendChild(\n createSvgElement('path', {\n class: 'prism-radar-band',\n d: `${rings[k]}${rings[k - 1] ?? ''}`,\n 'fill-rule': 'evenodd',\n }),\n );\n }\n }\n\n for (const d of rings)\n gridGroup.appendChild(createSvgElement('path', { class: 'prism-radar-ring', d, fill: 'none' }));\n\n angles.forEach((angle, i) => {\n gridGroup.appendChild(\n createSvgElement('line', {\n class: 'prism-radar-spoke',\n 'data-axis': i,\n x1: cx,\n x2: polarX(cx, radius, angle),\n y1: cy,\n y2: polarY(cy, radius, angle),\n }),\n );\n });\n\n const [d0, d1] = domains[0];\n const shared = domains.every(([a, b]) => a === d0 && b === d1);\n\n if (!grid.labels || !shared) return;\n\n // Between the first two spokes, so level values never collide with vertex values.\n const angle = angles[0] + Math.PI / angles.length;\n\n for (let k = 1; k <= levels; k++) {\n const r = (radius * k) / levels;\n const text = createSvgElement('text', {\n class: 'prism-radar-level',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n x: polarX(cx, r, angle),\n y: polarY(cy, r, angle),\n });\n\n text.textContent = formatValue(0, Math.round((d0 + ((d1 - d0) * k) / levels) * 100) / 100);\n gridGroup.appendChild(text);\n }\n }\n\n function renderLabels(): void {\n labelGroup.replaceChildren();\n\n const { cx, cy, radius } = layout;\n\n axes.forEach((axis, i) => {\n const { anchor, baseline } = labelPlacement(angles[i]);\n const text = createSvgElement('text', {\n class: 'prism-radar-axis-label',\n 'dominant-baseline': baseline,\n 'text-anchor': anchor,\n x: polarX(cx, radius + labelGap, angles[i]),\n y: polarY(cy, radius + labelGap, angles[i]),\n });\n\n text.textContent = axis.label;\n labelGroup.appendChild(text);\n });\n }\n\n function renderSeries(): void {\n const { cx, cy, radius } = layout;\n\n defs.replaceChildren();\n\n while (seriesGroup.children.length > series.length) seriesGroup.lastChild?.remove();\n\n series.forEach((s, i) => {\n const color = s.color ?? seriesColor(i);\n let group = seriesGroup.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-radar-series' });\n seriesGroup.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(s, i));\n\n group.replaceChildren();\n\n const area = createSvgElement('path', {\n class: `prism-radar-area prism-radar-area--${fill}`,\n stroke: color,\n 'stroke-linejoin': 'round',\n 'stroke-width': 2,\n });\n\n if (fill === 'gradient') {\n const gradientId = `${id}-fill-${i}`;\n const gradient = createSvgElement('radialGradient', {\n cx,\n cy,\n gradientUnits: 'userSpaceOnUse',\n id: gradientId,\n r: radius,\n });\n\n for (const [offset, opacity] of [\n [0, 0.08],\n [1, 0.55],\n ]) {\n gradient.appendChild(\n createSvgElement('stop', {\n offset,\n 'stop-color': color,\n 'stop-opacity': opacity,\n style: `stop-color:${color}`,\n }),\n );\n }\n\n defs.appendChild(gradient);\n setAttributes(area, { fill: `url(#${gradientId})` });\n } else {\n setAttributes(area, { fill: fill === 'none' ? 'none' : color, 'fill-opacity': 0.25 });\n }\n\n group.appendChild(area);\n\n if (showPoints) {\n axes.forEach((_, j) => {\n const missing = !Number.isFinite(datumAt(s, j)?.value);\n\n group.appendChild(\n createSvgElement('circle', {\n class: `prism-radar-point${missing ? ' prism-radar-point--missing' : ''}`,\n 'data-axis': j,\n fill: missing ? 'none' : color,\n r: 3,\n stroke: color,\n }),\n );\n });\n }\n\n if (config.showValues) {\n axes.forEach((_, j) => {\n const datum = datumAt(s, j);\n const { anchor, baseline } = labelPlacement(angles[j]);\n const text = createSvgElement('text', {\n 'aria-hidden': 'true',\n class: 'prism-radar-value',\n 'dominant-baseline': baseline,\n 'text-anchor': anchor,\n });\n\n text.textContent = datum && Number.isFinite(datum.value) ? formatValue(j, datum.value) : '';\n group.appendChild(text);\n });\n }\n });\n }\n\n function setActive(index: number): void {\n activeIndex = index;\n for (const el of root.querySelectorAll('[data-axis]')) {\n const active = Number(el.getAttribute('data-axis')) === index;\n\n el.classList.toggle(el.tagName === 'line' ? 'prism-radar-spoke--active' : 'prism-radar-point--active', active);\n }\n }\n\n function animateTo(targets: number[][], signal: AbortSignal): void {\n activeTween?.();\n\n const from = targets.map((row, i) => row.map((_, j) => drawn[i]?.[j] ?? 0));\n // Radar morphs a whole polygon, so it reads better slightly slower than the shared default.\n const motion = resolveMotion(config.transition, { defaultDuration: 400 });\n const easing = resolveEasing(motion.easing ?? 'ease-out');\n const unchanged = from.every((row, i) => row.every((v, j) => v === targets[i][j]));\n\n if (motion.duration === 0 || unchanged) {\n drawn = targets;\n draw(targets);\n\n return;\n }\n\n activeTween = startTween({\n count: targets.length,\n duration: motion.duration,\n easing,\n onFrame: (progress) => {\n drawn = targets.map((row, i) => {\n const e = progress(i);\n\n return row.map((to, j) => tweenNumber(from[i][j], to, e));\n });\n draw(drawn);\n },\n signal,\n stagger: motion.stagger,\n });\n }\n\n return createRadialScaffold(\n container,\n { a11y: config.a11y, legend: config.legend, tooltip: config.tooltip },\n (ctx): ChartEventHandlers | undefined => {\n const { legend, svg, tooltip } = ctx;\n\n if (!svg.contains(root)) svg.appendChild(root);\n\n tooltip?.hide();\n legend?.update(series.map((s, i) => ({ color: s.color ?? seriesColor(i), name: s.name })));\n\n if (axes.length < 3) {\n for (const group of [defs, gridGroup, seriesGroup, labelGroup]) group.replaceChildren();\n drawn = [];\n\n return undefined;\n }\n\n const { height, width } = ctx.dimensions;\n const radius = fitRadius(\n width,\n height,\n axes.map((axis) => axis.label),\n angles,\n LABEL_FONT_SIZE,\n labelGap,\n );\n\n layout = { cx: width / 2, cy: height / 2, radius };\n\n const domains = resolveAxisDomains(axes, series, config.domain);\n\n renderGrid(domains);\n renderLabels();\n renderSeries();\n animateTo(\n series.map((s) =>\n axes.map((_, j) => {\n const value = datumAt(s, j)?.value;\n\n return value !== undefined && Number.isFinite(value) ? normalize(value, domains[j]) : 0;\n }),\n ),\n ctx.disposalSignal,\n );\n setActive(activeIndex);\n\n const eventFor = (index: number, originalEvent: Event): RadarEvent => ({\n axis: axes[index],\n index,\n originalEvent,\n values: valuesAt(index),\n });\n\n const activate = (index: number, originalEvent: Event): void => {\n setActive(index);\n config.onHover?.(eventFor(index, originalEvent));\n\n const text = describe(index);\n\n if (!tooltip) {\n ctx.announcer.announce(text);\n\n return;\n }\n\n const reach = Math.max(0, ...drawn.map((row) => row[index] ?? 0));\n const svgRect = svg.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const values = valuesAt(index);\n const first = values.find((v) => v.datum)?.datum;\n const rows = values.flatMap(({ datum, series: s }) =>\n datum\n ? [\n {\n color: s.color ?? seriesColor(series.indexOf(s)),\n name: s.name,\n value: formatValue(index, datum.value),\n },\n ]\n : [],\n );\n\n tooltip.show(\n polarX(layout.cx, layout.radius * reach, angles[index]) + (svgRect.left - containerRect.left),\n polarY(layout.cy, layout.radius * reach, angles[index]) + (svgRect.top - containerRect.top),\n { key: axes[index].key, meta: { axis: axes[index], text, values }, value: first?.value ?? 0 },\n { color: series[0]?.color ?? seriesColor(0), data: [], name: axes[index].label },\n comparisonContent(svg.ownerDocument, axes[index].label, rows, text),\n );\n };\n\n const deactivate = (): void => {\n setActive(-1);\n config.onHover?.(null);\n tooltip?.hide();\n ctx.announcer.clear();\n };\n\n const hitIndex = (event: MouseEvent): number => {\n const rect = svg.getBoundingClientRect();\n const dx = event.clientX - rect.left - layout.cx;\n const dy = event.clientY - rect.top - layout.cy;\n\n if (Math.hypot(dx, dy) > layout.radius + labelGap + LABEL_FONT_SIZE * 2) return -1;\n\n return nearestAxis(dx, dy, axes.length, startAngle);\n };\n\n return {\n onClick(event) {\n const index = hitIndex(event);\n\n if (index >= 0) config.onClick?.(eventFor(index, event));\n },\n onKeyDown(event) {\n const step = ARROW_STEPS[event.key];\n\n if (step !== undefined) {\n event.preventDefault();\n activate(activeIndex < 0 ? 0 : (activeIndex + step + axes.length) % axes.length, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && activeIndex >= 0 && config.onClick) {\n event.preventDefault();\n config.onClick(eventFor(activeIndex, event));\n } else if (event.key === 'Escape') {\n deactivate();\n }\n },\n onMouseLeave: deactivate,\n onMouseMove(event) {\n const index = hitIndex(event);\n\n if (index < 0) {\n if (activeIndex >= 0) deactivate();\n } else if (index !== activeIndex) {\n activate(index, event);\n }\n },\n };\n },\n (next) => {\n series = next;\n warnOnInvalid(axes, series);\n },\n );\n}\n","import type { ChartEventHandlers } from '../core/chart-scaffold';\nimport { chartArea } from '../core/layout';\nimport { createSvgElement } from '../svg/element';\nimport type { Point } from '../svg/path';\nimport type { ChartDimensions, ChartEvent, ChartMargin, ContinuousDatum, Series, TooltipConfig } from '../types';\nimport { type Announcer, describeValues } from './announcer';\nimport type { CrosshairState } from './crosshair';\nimport { getMousePosition } from './events';\nimport { keyLabel } from './series-interaction';\nimport { comparisonContent, type TooltipState } from './tooltip';\n\nexport interface ScatterInteractionOptions {\n announcer: Announcer;\n colors: () => string[];\n crosshair?: CrosshairState | null;\n dims: () => ChartDimensions;\n /** Per-series data, parallel to `getPoints`; each datum is one independent point. */\n getData: () => ContinuousDatum[][];\n getPoints: () => Point[][];\n getSeriesList: () => Series[];\n /** Effective chart margin: hit bounds and tooltip offsets use this, never the shared dimensions. */\n margin: ChartMargin;\n /** Receives the single active-point marker. */\n markers: SVGGElement;\n onClick?: ((event: ChartEvent) => void) | undefined;\n onHover?: ((event: ChartEvent | null) => void) | undefined;\n /** Parent of the per-series point groups; the active series is emphasised and the rest dim. */\n seriesGroup: SVGGElement;\n svg: SVGSVGElement;\n tooltip?: TooltipState | null;\n /** Value/title formatters from the tooltip config, applied to the row and spoken text alike. */\n tooltipFormat?: Pick<TooltipConfig, 'titleFormat' | 'valueFormat'>;\n}\n\ninterface Hit {\n datum: ContinuousDatum;\n point: Point;\n seriesIndex: number;\n}\n\n/**\n * Pointer and keyboard interaction for a scatter plot. A scatter point is an\n * independent `(x, y)` pair rather than one sample at a shared key, so the active\n * point is the one nearest the pointer in two dimensions, events carry no\n * cross-series `values`, and keyboard navigation walks every point in x order.\n */\nexport function createScatterInteraction(opts: ScatterInteractionOptions): ChartEventHandlers {\n let keyboardIndex = -1;\n let active = false;\n\n const hitAt = (seriesIndex: number, pointIndex: number): Hit | null => {\n const datum = opts.getData()[seriesIndex]?.[pointIndex];\n const point = opts.getPoints()[seriesIndex]?.[pointIndex];\n\n return datum && point ? { datum, point, seriesIndex } : null;\n };\n\n const renderedHit = (event: Event): Hit | null => {\n const target = event.target;\n\n if (\n !(target instanceof SVGElement) ||\n !target.classList.contains('prism-scatter-point') ||\n !target.parentElement ||\n target.parentElement.parentNode !== opts.seriesGroup\n )\n return null;\n\n return hitAt(\n [...opts.seriesGroup.children].indexOf(target.parentElement),\n [...target.parentElement.children].indexOf(target),\n );\n };\n\n const nearestHit = (pos: Point): Hit | null => {\n let best: Hit | null = null;\n let minDistance = Infinity;\n\n for (const [seriesIndex, points] of opts.getPoints().entries()) {\n for (const pointIndex of points.keys()) {\n const hit = hitAt(seriesIndex, pointIndex);\n\n if (!hit) continue;\n\n const distance = Math.hypot(hit.point.x - pos.x, hit.point.y - pos.y);\n\n if (distance < minDistance) {\n minDistance = distance;\n best = hit;\n }\n }\n }\n\n return best;\n };\n\n // Every point across every series in x order (then y, then series order), for keyboard traversal.\n const orderedHits = (): Hit[] => {\n const hits: Hit[] = [];\n\n for (const [seriesIndex, data] of opts.getData().entries()) {\n for (const pointIndex of data.keys()) {\n const hit = hitAt(seriesIndex, pointIndex);\n\n if (hit) hits.push(hit);\n }\n }\n\n return hits.sort((a, b) => a.point.x - b.point.x || a.point.y - b.point.y || a.seriesIndex - b.seriesIndex);\n };\n\n const eventFor = (hit: Hit, originalEvent: Event): ChartEvent => ({\n datum: hit.datum,\n originalEvent,\n series: opts.getSeriesList()[hit.seriesIndex],\n });\n\n const highlight = (hit: Hit | null): void => {\n const groups = [...opts.seriesGroup.children];\n\n opts.markers.replaceChildren();\n\n if (hit) {\n opts.markers.appendChild(\n createSvgElement('circle', {\n class: 'prism-active-point',\n cx: hit.point.x,\n cy: hit.point.y,\n fill: opts.colors()[hit.seriesIndex],\n r: 4,\n }),\n );\n }\n\n opts.seriesGroup.classList.toggle('prism-series-focused', hit !== null && groups.length > 1);\n for (const [index, group] of groups.entries())\n group.classList.toggle('prism-series-active', index === hit?.seriesIndex);\n };\n\n const clear = (): void => {\n opts.crosshair?.hide();\n opts.tooltip?.hide();\n opts.announcer.clear();\n highlight(null);\n active = false;\n opts.onHover?.(null);\n };\n\n const focus = (hit: Hit, raw: Point | null, originalEvent: Event): void => {\n const dims = opts.dims();\n const area = chartArea(dims.width, dims.height, opts.margin);\n const follow = opts.crosshair?.snap === false && raw;\n const event = eventFor(hit, originalEvent);\n const { datum, series } = event;\n const label = opts.tooltipFormat?.titleFormat ? opts.tooltipFormat.titleFormat(datum.key) : keyLabel(datum.key);\n const valueFormat = opts.tooltipFormat?.valueFormat;\n const spoken = describeValues(label, [{ datum, series }], valueFormat ?? String);\n\n opts.crosshair?.show(follow ? raw.x : hit.point.x, follow ? raw.y : hit.point.y, area.width, area.height);\n highlight(hit);\n\n if (opts.tooltip) {\n const row = {\n color: opts.colors()[hit.seriesIndex],\n name: series.name,\n value: valueFormat ? valueFormat(datum.value, datum, series) : String(datum.value),\n };\n\n opts.tooltip.show(\n hit.point.x + opts.margin.left,\n hit.point.y + opts.margin.top,\n datum,\n series,\n comparisonContent(opts.svg.ownerDocument, label, [row], spoken),\n );\n } else {\n opts.announcer.announce(spoken);\n }\n\n active = true;\n opts.onHover?.(event);\n };\n\n const pointerHit = (event: MouseEvent): { hit: Hit; raw: Point } | null => {\n const rendered = renderedHit(event);\n\n if (rendered) return { hit: rendered, raw: rendered.point };\n\n const dims = opts.dims();\n const raw = getMousePosition(opts.svg, event, opts.margin.left, opts.margin.top);\n const area = chartArea(dims.width, dims.height, opts.margin);\n\n if (raw.x < 0 || raw.x > area.width || raw.y < 0 || raw.y > area.height) return null;\n\n const hit = nearestHit(raw);\n\n return hit ? { hit, raw } : null;\n };\n\n const onMouseMove = (event: MouseEvent): void => {\n const found = pointerHit(event);\n\n if (found) focus(found.hit, found.raw, event);\n else if (active) clear();\n };\n\n const onClick = (event: MouseEvent): void => {\n if (!opts.onClick) return;\n\n const found = pointerHit(event);\n\n if (found) opts.onClick(eventFor(found.hit, event));\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n const hits = orderedHits();\n\n if (hits.length === 0) return;\n\n const last = hits.length - 1;\n const target: Record<string, number> = {\n ArrowLeft: keyboardIndex < 0 ? last : Math.max(0, keyboardIndex - 1),\n ArrowRight: keyboardIndex < 0 ? 0 : Math.min(last, keyboardIndex + 1),\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n keyboardIndex = target[event.key];\n focus(hits[keyboardIndex], null, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && keyboardIndex >= 0 && opts.onClick) {\n event.preventDefault();\n opts.onClick(eventFor(hits[keyboardIndex], event));\n } else if (event.key === 'Escape') {\n keyboardIndex = -1;\n clear();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: clear, onMouseMove };\n}\n","import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport type { DatumMark } from '../../core/datum-style';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionOption } from '../../types';\n\nexport interface ScatterRenderOptions {\n color: string;\n /** Aborted when the owning chart is disposed: stops the transition's `requestAnimationFrame` loop from rescheduling. */\n disposalSignal?: AbortSignal;\n /** Per-datum presentation parallel to `points`; only `opacity` applies to a scatter marker. */\n marks?: readonly DatumMark[];\n pointRadius: number;\n transition?: TransitionOption;\n}\n\n/** Upper bound on the total staggered delay entering points may add, whatever the per-point value. */\nconst MAX_STAGGER_TOTAL = 400;\n\nconst activeAnimations = new WeakMap<SVGGElement, () => void>();\n// Point positions currently on screen, so an update slides from them even mid-tween.\nconst drawnPoints = new WeakMap<SVGGElement, Point[]>();\n\n/**\n * Maps scatter data to plot-area points: `key` is the x position, `value` the y.\n * A string key is a data error here, not a band position.\n */\nexport function computeScatterPoints(\n data: ContinuousDatum[],\n xScale: Scale<Date | number>,\n yScale: Scale<number>,\n): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computeScatterPoints: datum.key is null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n } else if (data.some((d) => typeof d.key === 'string')) {\n warn('computeScatterPoints: string keys are not supported: scatter x values must be numbers or Dates.');\n }\n\n return data.map((d) => ({\n x: xScale.map(d.key as Date | number),\n y: yScale.map(d.value),\n }));\n}\n\n/**\n * Draws one scatter series as point markers. Entering points grow from radius 0 at\n * their final position (staggered in x order when `stagger` is set); existing points\n * slide from their drawn position. Disabled or reduced motion paints synchronously.\n */\nexport function renderScatterPoints(parent: SVGGElement, points: Point[], options: ScatterRenderOptions): void {\n const motion = resolveMotion(options.transition);\n const marks = options.marks ?? [];\n const radius = options.pointRadius;\n\n activeAnimations.get(parent)?.();\n activeAnimations.delete(parent);\n\n while (parent.children.length > points.length) parent.lastChild!.remove();\n\n const drawn = drawnPoints.get(parent) ?? [];\n const fromRadius: number[] = [];\n const circles = points.map((_, i) => {\n let circle = parent.children[i] as SVGCircleElement | undefined;\n\n if (circle) {\n fromRadius.push(Number(circle.getAttribute('r')) || 0);\n } else {\n circle = createSvgElement('circle', { class: 'prism-scatter-point' });\n parent.appendChild(circle);\n fromRadius.push(0);\n }\n\n setAttributes(circle, { fill: options.color, opacity: marks[i]?.opacity });\n\n return circle;\n });\n\n const paint = (pts: Point[], radii: (i: number) => number): void => {\n for (const [i, circle] of circles.entries()) setAttributes(circle, { cx: pts[i].x, cy: pts[i].y, r: radii(i) });\n\n drawnPoints.set(parent, pts);\n };\n\n if (motion.duration === 0) {\n paint(points, () => radius);\n\n return;\n }\n\n const fromPts = points.map((to, i) => drawn[i] ?? to);\n // Entering points (no drawn marker yet) take their own stagger lane in x order;\n // moving points all share lane 0 so an update never crawls.\n const entering = points.map((_, i) => i).filter((i) => i >= drawn.length);\n const lanes = new Map(\n [...entering].sort((a, b) => points[a].x - points[b].x).map((pointIndex, lane) => [pointIndex, lane]),\n );\n const stagger = Math.min(motion.stagger, MAX_STAGGER_TOTAL / Math.max(1, entering.length));\n\n const paintFrame = (progress: (lane: number) => number): void => {\n const eased = points.map((_, i) => progress(lanes.get(i) ?? 0));\n\n paint(\n points.map((to, i) => ({\n x: tweenNumber(fromPts[i].x, to.x, eased[i]),\n y: tweenNumber(fromPts[i].y, to.y, eased[i]),\n })),\n (i) => tweenNumber(fromRadius[i], radius, eased[i]),\n );\n };\n\n // The starting state goes on screen immediately: `startTween` only paints on\n // the first frame callback, which would otherwise leave one stale frame.\n paintFrame(() => 0);\n\n activeAnimations.set(\n parent,\n startTween({\n count: Math.max(1, entering.length),\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: () => {\n activeAnimations.delete(parent);\n paint(points, () => radius);\n },\n onFrame: paintFrame,\n signal: options.disposalSignal,\n stagger,\n }),\n );\n}\n","import { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createScatterInteraction } from '../../interaction/scatter-interaction';\nimport { ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, ScatterChartConfig, ScatterSeriesConfig, XAxisConfig, YAxisConfig } from '../../types';\nimport { computeScatterPoints, renderScatterPoints } from './scatter-renderer';\n\nexport function createScatterChart(\n container: HTMLElement,\n config: ScatterChartConfig,\n): ChartHandle<ScatterSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((datum) => datum.value);\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n // Independent points have no baseline to anchor, so the y domain fits the data.\n const yScale = buildYScale(allY, area.height, false);\n\n // Axes render by default (value axis with gridlines); `false` opts out. The value\n // axis merges over its default so a partial config keeps the default gridlines.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : { grid: true, ...config.yAxis };\n\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(yScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n } else {\n groups.grid.replaceChildren();\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(xScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, yScale, yAxisConfig, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (const [i, series] of seriesList.entries()) {\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-scatter-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const points = computeScatterPoints(series.data, xScale, yScale);\n\n allPoints.push(points);\n\n renderScatterPoints(group, points, {\n color: seriesColor(i, series.color),\n disposalSignal: ctx.disposalSignal,\n marks: series.data,\n pointRadius: series.pointRadius ?? 3,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createScatterInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin: dims.margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n tooltipFormat: typeof config.tooltip === 'object' ? config.tooltip : undefined,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n","import { warn } from '../../_dev';\nimport { createTappers } from '../../_tappers';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport { createChartBase } from '../../core/chart-base';\nimport { uniqueId } from '../../core/ids';\nimport { PrismRenderError } from '../../errors';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ChartHandle, PrismEvent, SparklineConfig, StackSegment } from '../../types';\n\n/** Fits the 3.5px hover marker plus its ring inside the SVG. */\nconst PLOT_INSET = 5;\n\nfunction buildTopPoints(data: number[], width: number, height: number): Point[] {\n if (data.length === 0) return [];\n\n const xStep = width / Math.max(1, data.length - 1);\n const min = Math.min(...data);\n const max = Math.max(...data);\n const yRange = max - min || 1;\n\n return data.map((v, i) => ({\n x: i * xStep,\n y: height - ((v - min) / yRange) * height,\n }));\n}\n\nfunction buildAreaPathFromPoints(top: Point[], height: number, curve: SparklineConfig['curve']): string {\n if (top.length === 0) return '';\n\n const bottom = top.map((p) => ({ x: p.x, y: height }));\n\n return areaPath(top, bottom, curve ?? 'linear');\n}\n\nfunction buildPathFromPoints(points: Point[], curve: SparklineConfig['curve']): string {\n if (points.length === 0) return '';\n\n return curve === 'monotone' ? monotonePath(points) : curve === 'step' ? stepPath(points) : linePath(points);\n}\n\nfunction isStackData(data: number[] | StackSegment[]): data is StackSegment[] {\n return data.length > 0 && data[0] !== null && typeof data[0] === 'object';\n}\n\nfunction buildRoundedStackRect(\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n roundLeft: boolean,\n roundRight: boolean,\n): string {\n const maxR = Math.min(r, w / 2, h / 2);\n const tl = roundLeft ? maxR : 0;\n const bl = roundLeft ? maxR : 0;\n const tr = roundRight ? maxR : 0;\n const br = roundRight ? maxR : 0;\n\n return [\n `M${x + tl},${y}`,\n `H${x + w - tr}`,\n tr ? `Q${x + w},${y} ${x + w},${y + tr}` : '',\n `V${y + h - br}`,\n br ? `Q${x + w},${y + h} ${x + w - br},${y + h}` : '',\n `H${x + bl}`,\n bl ? `Q${x},${y + h} ${x},${y + h - bl}` : '',\n `V${y + tl}`,\n tl ? `Q${x},${y} ${x + tl},${y}` : '',\n 'Z',\n ]\n .filter(Boolean)\n .join('');\n}\n\nfunction defaultStackColor(i: number): string {\n return `var(--prism-color-${(i % 8) + 1})`;\n}\n\nexport function createSparkline(\n container: HTMLElement,\n config: SparklineConfig,\n): ChartHandle<number[] | StackSegment[]> {\n const variant = config.variant ?? 'line';\n const color = config.color ?? 'var(--prism-color-1)';\n const curve = config.curve ?? 'linear';\n const strokeWidth = config.strokeWidth ?? 1.5;\n const fillOpacity = config.fillOpacity;\n const showEndPoint = config.showEndPoint ?? true;\n const gradientId = uniqueId('prism-spark-fill');\n const tappers = createTappers<PrismEvent>();\n const motion = resolveMotion(config.transition);\n const easing = resolveEasing(motion.easing);\n let data = config.data;\n // Values currently on screen (mid-tween included), in data space so a resize\n // never re-animates: every variant interpolates these and repaints.\n let drawnValues: number[] | null = null;\n let activeTween: (() => void) | null = null;\n\n const base = createChartBase(\n container,\n {\n a11y: config.a11y,\n margin: { bottom: 0, left: 0, right: 0, top: 0 },\n },\n () => {\n tappers.emit({ height: base.dimensions.height, type: 'resize', width: base.dimensions.width });\n renderAll();\n },\n );\n\n const { svg } = base;\n\n svg.classList.add('prism-sparkline');\n\n const innerGroup = createSvgElement('g', { class: 'prism-spark-inner' });\n\n svg.appendChild(innerGroup);\n\n let cleanupInteraction: (() => void) | undefined;\n\n /** Line and area plots are inset so dots on the first and last values are not clipped. */\n function plotArea(): { h: number; inset: number; w: number } {\n const { height, width } = base.dimensions;\n const inset = variant === 'line' || variant === 'area' ? PLOT_INSET : 0;\n\n return { h: Math.max(1, height - inset * 2), inset, w: Math.max(1, width - inset * 2) };\n }\n\n /**\n * Tweens the plotted values from what is on screen to `to`, repainting through\n * `paint`. A first render (or a length change, which has no per-index\n * predecessor) grows out of `floorValue`, the scale's minimum. Unchanged values\n * — a resize re-layout, for instance — repaint without animating.\n */\n function animateValues(to: number[], floorValue: number, paint: (values: number[]) => void): void {\n activeTween?.();\n\n const from = drawnValues?.length === to.length ? drawnValues : to.map(() => floorValue);\n const unchanged = from.every((value, i) => value === to[i]);\n\n if (unchanged || motion.duration === 0) {\n drawnValues = to;\n paint(to);\n\n return;\n }\n\n activeTween = startTween({\n count: 1,\n duration: motion.duration,\n easing,\n onFrame: (progress) => {\n const e = progress(0);\n const values = to.map((value, i) => tweenNumber(from[i], value, e));\n\n drawnValues = values;\n paint(values);\n },\n signal: ac.signal,\n });\n // Paint the starting geometry now: the tween only paints on its first frame\n // callback, which would otherwise leave one blank frame after mount.\n drawnValues = from;\n paint(from);\n }\n\n function renderAll(): void {\n const { height: h, width: w } = base.dimensions;\n const plot = plotArea();\n\n while (innerGroup.firstChild) innerGroup.removeChild(innerGroup.firstChild);\n\n innerGroup.setAttribute('transform', `translate(${plot.inset},${plot.inset})`);\n\n if (data.length === 0) {\n drawnValues = null;\n\n return;\n }\n\n if (!isStackData(data) && data.some((v) => !Number.isFinite(v))) {\n warn('createSparkline: data contains non-finite values; they are drawn as the minimum.');\n }\n\n if (variant === 'stack' && isStackData(data)) {\n const stackGroup = createSvgElement('g', { class: 'prism-spark-stack' });\n\n innerGroup.appendChild(stackGroup);\n\n const cornerRadius = config.cornerRadius ?? 4;\n const segs = data as StackSegment[];\n const total = segs.reduce((s, d) => s + Math.max(0, d.value), 0);\n const paths = segs.map((seg, i) => {\n const path = createSvgElement('path', { class: 'prism-spark-stack-segment' });\n\n setAttributes(path, { fill: seg.color ?? defaultStackColor(i) });\n stackGroup.appendChild(path);\n\n return path;\n });\n\n if (total > 0) {\n animateValues(\n segs.map((seg) => Math.max(0, seg.value)),\n 0,\n (values) => {\n const runningTotal = values.reduce((s, v) => s + v, 0) || 1;\n const half = (config.padPixels ?? 0) / 2;\n let xAcc = 0;\n\n values.forEach((value, i) => {\n const xStart = Math.round(xAcc);\n\n xAcc += (value / runningTotal) * w;\n\n const xEnd = i === values.length - 1 ? w : Math.round(xAcc);\n const isFirst = i === 0;\n const isLast = i === values.length - 1;\n const drawX = xStart + (isFirst ? 0 : half);\n const drawW = Math.max(0, xEnd - xStart - (isFirst ? 0 : half) - (isLast ? 0 : half));\n\n paths[i]?.setAttribute('d', buildRoundedStackRect(drawX, 0, drawW, h, cornerRadius, isFirst, isLast));\n });\n },\n );\n } else {\n // Nothing to draw: clear the recorded geometry so a later update cannot\n // interpolate from values that are no longer on screen.\n activeTween?.();\n drawnValues = null;\n }\n } else if (variant === 'bar') {\n const barsGroup = createSvgElement('g', { class: 'prism-spark-bars' });\n\n innerGroup.appendChild(barsGroup);\n\n const values = data as number[];\n const barMin = Math.min(0, ...values);\n const barRange = Math.max(...values) - barMin || 1;\n const barW = Math.max(1, w / values.length - 1);\n const gap = w / values.length;\n const rects = values.map(() => {\n const rect = createSvgElement('rect', { class: 'prism-spark-bar', fill: color });\n\n barsGroup.appendChild(rect);\n\n return rect;\n });\n\n animateValues(values, barMin, (frame) => {\n for (const [i, rect] of rects.entries()) {\n const barHeight = Math.max(1, ((frame[i] - barMin) / barRange) * h);\n\n setAttributes(rect, { height: barHeight, width: barW, x: i * gap, y: h - barHeight });\n }\n });\n } else {\n const values = data as number[];\n // The scale is fixed to the target values, so a tween moves points along\n // stable axes instead of wobbling as the domain follows each frame.\n const lineMin = Math.min(...values);\n const lineRange = Math.max(...values) - lineMin || 1;\n const xStep = plot.w / Math.max(1, values.length - 1);\n const pointsFromValues = (frame: number[]): Point[] =>\n frame.map((v, i) => ({ x: i * xStep, y: plot.h - ((v - lineMin) / lineRange) * plot.h }));\n\n let fill: SVGPathElement | null = null;\n\n if (variant === 'area') {\n const defs = createSvgElement('defs');\n const gradient = createSvgElement('linearGradient', { id: gradientId, x1: 0, x2: 0, y1: 0, y2: 1 });\n\n for (const [offset, className] of [\n [0, 'prism-spark-stop-top'],\n [1, 'prism-spark-stop-bottom'],\n ] as const) {\n const stop = createSvgElement('stop', { class: className, offset, 'stop-color': color });\n\n stop.style.stopColor = color;\n gradient.appendChild(stop);\n }\n\n defs.appendChild(gradient);\n innerGroup.appendChild(defs);\n\n fill = createSvgElement('path', { class: 'prism-spark-fill' });\n\n setAttributes(fill, { fill: `url(#${gradientId})`, stroke: 'none' });\n fill.style.fillOpacity = fillOpacity === undefined ? '' : String(fillOpacity);\n innerGroup.appendChild(fill);\n }\n\n const path = createSvgElement('path', { class: 'prism-spark-line' });\n\n setAttributes(path, { fill: 'none', stroke: color, 'stroke-width': strokeWidth });\n innerGroup.appendChild(path);\n\n const endDot =\n showEndPoint && values.length > 0\n ? createSvgElement('circle', { class: 'prism-spark-end', fill: color, r: 2.5 })\n : null;\n\n if (endDot) innerGroup.appendChild(endDot);\n\n animateValues(values, lineMin, (frame) => {\n const top = pointsFromValues(frame);\n\n setAttributes(path, { d: buildPathFromPoints(top, curve) });\n\n if (fill) setAttributes(fill, { d: buildAreaPathFromPoints(top, plot.h, curve) });\n\n const end = top.at(-1);\n\n if (endDot && end) setAttributes(endDot, { cx: end.x, cy: end.y });\n });\n }\n\n if (!isStackData(data)) attachInteraction(data as number[]);\n }\n\n function attachInteraction(data: number[]): void {\n cleanupInteraction?.();\n cleanupInteraction = undefined;\n\n if (!config.onHover && !config.onClick) return;\n\n if (data.length <= 1) return;\n\n const { h, inset, w } = plotArea();\n\n svg.style.cursor = 'crosshair';\n\n const xStep = w / (data.length - 1);\n const points = variant === 'bar' ? [] : buildTopPoints(data, w, h);\n const marker = createSvgElement('circle', { class: 'prism-spark-marker', fill: color, r: 3.5 });\n const indexAt = (clientX: number): number =>\n Math.max(0, Math.min(data.length - 1, Math.round((clientX - svg.getBoundingClientRect().left - inset) / xStep)));\n\n marker.style.display = 'none';\n innerGroup.appendChild(marker);\n\n const handleMove = (e: MouseEvent) => {\n const idx = indexAt(e.clientX);\n const point = points[idx];\n\n if (point) {\n setAttributes(marker, { cx: point.x, cy: point.y });\n marker.style.display = '';\n }\n\n config.onHover?.({ index: idx, originalEvent: e, value: data[idx] });\n };\n\n const handleLeave = () => {\n marker.style.display = 'none';\n config.onHover?.(null);\n };\n\n const handleClick = (e: MouseEvent) => {\n if (!config.onClick) return;\n\n const idx = indexAt(e.clientX);\n\n config.onClick({ index: idx, originalEvent: e, value: data[idx] });\n };\n\n svg.addEventListener('mousemove', handleMove);\n svg.addEventListener('mouseleave', handleLeave);\n svg.addEventListener('click', handleClick);\n\n cleanupInteraction = () => {\n svg.removeEventListener('mousemove', handleMove);\n svg.removeEventListener('mouseleave', handleLeave);\n svg.removeEventListener('click', handleClick);\n };\n }\n\n const ac = new AbortController();\n let isDisposed = false;\n\n try {\n renderAll();\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (isDisposed) return;\n\n isDisposed = true;\n tappers.emit({ type: 'dispose' });\n tappers.stop();\n ac.abort();\n cleanupInteraction?.();\n base.dispose();\n },\n\n get disposed(): boolean {\n return isDisposed;\n },\n\n el: svg,\n\n tap: tappers.tap,\n\n update(next) {\n if (isDisposed) throw new PrismRenderError('Cannot update a disposed chart.');\n data = next;\n renderAll();\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n } catch (error) {\n ac.abort();\n cleanupInteraction?.();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n}\n"],"mappings":"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"}