@vielzeug/prism 26.10.14 → 26.10.16

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 (162) hide show
  1. package/dist/_dev.cjs.map +1 -1
  2. package/dist/_dev.js +6 -1
  3. package/dist/_dev.js.map +1 -1
  4. package/dist/_tappers.cjs.map +1 -1
  5. package/dist/_tappers.js +25 -1
  6. package/dist/_tappers.js.map +1 -1
  7. package/dist/animation/easing.cjs.map +1 -1
  8. package/dist/animation/easing.js +15 -1
  9. package/dist/animation/easing.js.map +1 -1
  10. package/dist/animation/motion.cjs.map +1 -1
  11. package/dist/animation/motion.js +15 -1
  12. package/dist/animation/motion.js.map +1 -1
  13. package/dist/animation/reveal.cjs.map +1 -1
  14. package/dist/animation/reveal.js +97 -1
  15. package/dist/animation/reveal.js.map +1 -1
  16. package/dist/animation/transition.cjs.map +1 -1
  17. package/dist/animation/transition.js +39 -1
  18. package/dist/animation/transition.js.map +1 -1
  19. package/dist/animation/tween.cjs.map +1 -1
  20. package/dist/animation/tween.js +7 -1
  21. package/dist/animation/tween.js.map +1 -1
  22. package/dist/axes/axis.cjs.map +1 -1
  23. package/dist/axes/axis.js +76 -1
  24. package/dist/axes/axis.js.map +1 -1
  25. package/dist/axes/grid.cjs.map +1 -1
  26. package/dist/axes/grid.js +29 -1
  27. package/dist/axes/grid.js.map +1 -1
  28. package/dist/axes/scale-utils.cjs.map +1 -1
  29. package/dist/axes/scale-utils.js +10 -1
  30. package/dist/axes/scale-utils.js.map +1 -1
  31. package/dist/charts/area/area-chart.cjs.map +1 -1
  32. package/dist/charts/area/area-chart.js +71 -1
  33. package/dist/charts/area/area-chart.js.map +1 -1
  34. package/dist/charts/area/area-renderer.cjs.map +1 -1
  35. package/dist/charts/area/area-renderer.js +128 -1
  36. package/dist/charts/area/area-renderer.js.map +1 -1
  37. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  38. package/dist/charts/bar/bar-chart.js +228 -1
  39. package/dist/charts/bar/bar-chart.js.map +1 -1
  40. package/dist/charts/bar/bar-hit-test.cjs.map +1 -1
  41. package/dist/charts/bar/bar-hit-test.js +25 -1
  42. package/dist/charts/bar/bar-hit-test.js.map +1 -1
  43. package/dist/charts/bar/bar-renderer.cjs.map +1 -1
  44. package/dist/charts/bar/bar-renderer.js +139 -1
  45. package/dist/charts/bar/bar-renderer.js.map +1 -1
  46. package/dist/charts/line/line-chart.cjs.map +1 -1
  47. package/dist/charts/line/line-chart.js +93 -1
  48. package/dist/charts/line/line-chart.js.map +1 -1
  49. package/dist/charts/line/line-renderer.cjs.map +1 -1
  50. package/dist/charts/line/line-renderer.js +143 -1
  51. package/dist/charts/line/line-renderer.js.map +1 -1
  52. package/dist/charts/pie/pie-chart.cjs +1 -1
  53. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  54. package/dist/charts/pie/pie-chart.js +207 -1
  55. package/dist/charts/pie/pie-chart.js.map +1 -1
  56. package/dist/charts/pie/pie-renderer.cjs.map +1 -1
  57. package/dist/charts/pie/pie-renderer.js +68 -1
  58. package/dist/charts/pie/pie-renderer.js.map +1 -1
  59. package/dist/charts/radar/radar-chart.cjs +1 -1
  60. package/dist/charts/radar/radar-chart.cjs.map +1 -1
  61. package/dist/charts/radar/radar-chart.js +281 -1
  62. package/dist/charts/radar/radar-chart.js.map +1 -1
  63. package/dist/charts/radar/radar-geometry.cjs.map +1 -1
  64. package/dist/charts/radar/radar-geometry.js +69 -1
  65. package/dist/charts/radar/radar-geometry.js.map +1 -1
  66. package/dist/charts/scatter/scatter-chart.cjs.map +1 -1
  67. package/dist/charts/scatter/scatter-chart.js +69 -1
  68. package/dist/charts/scatter/scatter-chart.js.map +1 -1
  69. package/dist/charts/scatter/scatter-renderer.cjs.map +1 -1
  70. package/dist/charts/scatter/scatter-renderer.js +57 -1
  71. package/dist/charts/scatter/scatter-renderer.js.map +1 -1
  72. package/dist/charts/sparkline/sparkline.cjs +1 -1
  73. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  74. package/dist/charts/sparkline/sparkline.js +251 -1
  75. package/dist/charts/sparkline/sparkline.js.map +1 -1
  76. package/dist/core/cartesian-model.cjs +1 -1
  77. package/dist/core/cartesian-model.cjs.map +1 -1
  78. package/dist/core/cartesian-model.js +26 -1
  79. package/dist/core/cartesian-model.js.map +1 -1
  80. package/dist/core/cartesian-scales.cjs.map +1 -1
  81. package/dist/core/cartesian-scales.js +38 -1
  82. package/dist/core/cartesian-scales.js.map +1 -1
  83. package/dist/core/chart-base.cjs.map +1 -1
  84. package/dist/core/chart-base.js +62 -1
  85. package/dist/core/chart-base.js.map +1 -1
  86. package/dist/core/chart-scaffold.cjs.map +1 -1
  87. package/dist/core/chart-scaffold.js +103 -1
  88. package/dist/core/chart-scaffold.js.map +1 -1
  89. package/dist/core/datum-style.cjs +1 -1
  90. package/dist/core/datum-style.cjs.map +1 -1
  91. package/dist/core/datum-style.js +22 -1
  92. package/dist/core/datum-style.js.map +1 -1
  93. package/dist/core/ids.cjs.map +1 -1
  94. package/dist/core/ids.js +8 -1
  95. package/dist/core/ids.js.map +1 -1
  96. package/dist/core/layout.cjs.map +1 -1
  97. package/dist/core/layout.js +22 -1
  98. package/dist/core/layout.js.map +1 -1
  99. package/dist/core/polar.cjs.map +1 -1
  100. package/dist/core/polar.js +13 -1
  101. package/dist/core/polar.js.map +1 -1
  102. package/dist/core/responsive.cjs.map +1 -1
  103. package/dist/core/responsive.js +20 -1
  104. package/dist/core/responsive.js.map +1 -1
  105. package/dist/core/series-id.cjs.map +1 -1
  106. package/dist/core/series-id.js +7 -1
  107. package/dist/core/series-id.js.map +1 -1
  108. package/dist/errors.cjs.map +1 -1
  109. package/dist/errors.js +9 -1
  110. package/dist/errors.js.map +1 -1
  111. package/dist/index.js +13 -1
  112. package/dist/interaction/announcer.cjs.map +1 -1
  113. package/dist/interaction/announcer.js +25 -1
  114. package/dist/interaction/announcer.js.map +1 -1
  115. package/dist/interaction/crosshair.cjs.map +1 -1
  116. package/dist/interaction/crosshair.js +37 -1
  117. package/dist/interaction/crosshair.js.map +1 -1
  118. package/dist/interaction/events.cjs.map +1 -1
  119. package/dist/interaction/events.js +11 -1
  120. package/dist/interaction/events.js.map +1 -1
  121. package/dist/interaction/legend.cjs.map +1 -1
  122. package/dist/interaction/legend.js +31 -1
  123. package/dist/interaction/legend.js.map +1 -1
  124. package/dist/interaction/scatter-interaction.cjs.map +1 -1
  125. package/dist/interaction/scatter-interaction.js +105 -1
  126. package/dist/interaction/scatter-interaction.js.map +1 -1
  127. package/dist/interaction/series-interaction.cjs.map +1 -1
  128. package/dist/interaction/series-interaction.js +163 -1
  129. package/dist/interaction/series-interaction.js.map +1 -1
  130. package/dist/interaction/tooltip.cjs +1 -1
  131. package/dist/interaction/tooltip.cjs.map +1 -1
  132. package/dist/interaction/tooltip.js +87 -1
  133. package/dist/interaction/tooltip.js.map +1 -1
  134. package/dist/prism.cjs +1 -1
  135. package/dist/prism.cjs.map +1 -1
  136. package/dist/prism.iife.js +1 -1
  137. package/dist/prism.iife.js.map +1 -1
  138. package/dist/prism.js +2930 -1
  139. package/dist/prism.js.map +1 -1
  140. package/dist/scales/band.cjs.map +1 -1
  141. package/dist/scales/band.js +39 -1
  142. package/dist/scales/band.js.map +1 -1
  143. package/dist/scales/linear.cjs.map +1 -1
  144. package/dist/scales/linear.js +43 -1
  145. package/dist/scales/linear.js.map +1 -1
  146. package/dist/scales/time.cjs.map +1 -1
  147. package/dist/scales/time.js +61 -1
  148. package/dist/scales/time.js.map +1 -1
  149. package/dist/svg/element.cjs +1 -1
  150. package/dist/svg/element.cjs.map +1 -1
  151. package/dist/svg/element.js +16 -1
  152. package/dist/svg/element.js.map +1 -1
  153. package/dist/svg/path.cjs.map +1 -1
  154. package/dist/svg/path.js +48 -1
  155. package/dist/svg/path.js.map +1 -1
  156. package/dist/svg/text.cjs.map +1 -1
  157. package/dist/svg/text.js +13 -1
  158. package/dist/svg/text.js.map +1 -1
  159. package/dist/theme/index.cjs.map +1 -1
  160. package/dist/theme/index.js +37 -1
  161. package/dist/theme/index.js.map +1 -1
  162. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"sparkline.cjs","names":[],"sources":["../../../src/charts/sparkline/sparkline.ts"],"sourcesContent":["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":"2YAeA,IAAM,EAAa,EAEnB,SAAS,eAAe,EAAgB,EAAe,EAAyB,CAC9E,GAAI,EAAK,SAAW,EAAG,MAAO,CAAC,EAE/B,IAAM,EAAQ,EAAQ,KAAK,IAAI,EAAG,EAAK,OAAS,CAAC,EAC3C,EAAM,KAAK,IAAI,GAAG,CAAI,EAEtB,EADM,KAAK,IAAI,GAAG,CACT,EAAM,GAAO,EAE5B,OAAO,EAAK,KAAK,EAAG,KAAO,CACzB,EAAG,EAAI,EACP,EAAG,GAAW,EAAI,GAAO,EAAU,CACrC,EAAE,CACJ,CAEA,SAAS,wBAAwB,EAAc,EAAgB,EAAyC,CACtG,GAAI,EAAI,SAAW,EAAG,MAAO,GAE7B,IAAM,EAAS,EAAI,IAAK,IAAO,CAAE,EAAG,EAAE,EAAG,EAAG,CAAO,EAAE,EAErD,OAAO,EAAA,SAAS,EAAK,EAAQ,GAAS,QAAQ,CAChD,CAEA,SAAS,oBAAoB,EAAiB,EAAyC,CAGrF,OAFI,EAAO,SAAW,EAAU,GAEzB,IAAU,WAAa,EAAA,aAAa,CAAM,EAAI,IAAU,OAAS,EAAA,SAAS,CAAM,EAAI,EAAA,SAAS,CAAM,CAC5G,CAEA,SAAS,YAAY,EAAyD,CAC5E,OAAO,EAAK,OAAS,GAAK,EAAK,KAAO,MAAQ,OAAO,EAAK,IAAO,QACnE,CAEA,SAAS,sBACP,EACA,EACA,EACA,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAO,KAAK,IAAI,EAAG,EAAI,EAAG,EAAI,CAAC,EAC/B,EAAK,EAAY,EAAO,EACxB,EAAK,EAAY,EAAO,EACxB,EAAK,EAAa,EAAO,EACzB,EAAK,EAAa,EAAO,EAE/B,MAAO,CACL,IAAI,EAAI,EAAG,GAAG,IACd,IAAI,EAAI,EAAI,IACZ,EAAK,IAAI,EAAI,EAAE,GAAG,EAAE,GAAG,EAAI,EAAE,GAAG,EAAI,IAAO,GAC3C,IAAI,EAAI,EAAI,IACZ,EAAK,IAAI,EAAI,EAAE,GAAG,EAAI,EAAE,GAAG,EAAI,EAAI,EAAG,GAAG,EAAI,IAAM,GACnD,IAAI,EAAI,IACR,EAAK,IAAI,EAAE,GAAG,EAAI,EAAE,GAAG,EAAE,GAAG,EAAI,EAAI,IAAO,GAC3C,IAAI,EAAI,IACR,EAAK,IAAI,EAAE,GAAG,EAAE,GAAG,EAAI,EAAG,GAAG,IAAM,GACnC,GACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,EAAE,CACZ,CAEA,SAAS,kBAAkB,EAAmB,CAC5C,MAAO,qBAAsB,EAAI,EAAK,EAAE,EAC1C,CAEA,SAAgB,gBACd,EACA,EACwC,CACxC,IAAM,EAAU,EAAO,SAAW,OAC5B,EAAQ,EAAO,OAAS,uBACxB,EAAQ,EAAO,OAAS,SACxB,EAAc,EAAO,aAAe,IACpC,EAAc,EAAO,YACrB,EAAe,EAAO,cAAgB,GACtC,EAAa,EAAA,SAAS,kBAAkB,EACxC,EAAU,EAAA,cAA0B,EACpC,EAAS,EAAA,cAAc,EAAO,UAAU,EACxC,EAAS,EAAA,cAAc,EAAO,MAAM,EACtC,EAAO,EAAO,KAGd,EAA+B,KAC/B,EAAmC,KAEjC,EAAO,EAAA,gBACX,EACA,CACE,KAAM,EAAO,KACb,OAAQ,CAAE,OAAQ,EAAG,KAAM,EAAG,MAAO,EAAG,IAAK,CAAE,CACjD,MACM,CACJ,EAAQ,KAAK,CAAE,OAAQ,EAAK,WAAW,OAAQ,KAAM,SAAU,MAAO,EAAK,WAAW,KAAM,CAAC,EAC7F,UAAU,CACZ,CACF,EAEM,CAAE,OAAQ,EAEhB,EAAI,UAAU,IAAI,iBAAiB,EAEnC,IAAM,EAAa,EAAA,iBAAiB,IAAK,CAAE,MAAO,mBAAoB,CAAC,EAEvE,EAAI,YAAY,CAAU,EAE1B,IAAI,mBAGJ,SAAS,UAAoD,CAC3D,GAAM,CAAE,SAAQ,SAAU,EAAK,WACzB,EAAQ,IAAY,QAAU,IAAY,OAAS,EAAa,EAEtE,MAAO,CAAE,EAAG,KAAK,IAAI,EAAG,EAAS,EAAQ,CAAC,EAAG,QAAO,EAAG,KAAK,IAAI,EAAG,EAAQ,EAAQ,CAAC,CAAE,CACxF,CAQA,SAAS,cAAc,EAAc,EAAoB,EAAyC,CAChG,IAAc,EAEd,IAAM,EAAO,GAAa,SAAW,EAAG,OAAS,EAAc,EAAG,QAAU,CAAU,EAGtF,GAFkB,EAAK,OAAO,EAAO,IAAM,IAAU,EAAG,EAEpD,GAAa,EAAO,WAAa,EAAG,CACtC,EAAc,EACd,EAAM,CAAE,EAER,MACF,CAEA,EAAc,EAAA,WAAW,CACvB,MAAO,EACP,SAAU,EAAO,SACjB,SACA,QAAU,GAAa,CACrB,IAAM,EAAI,EAAS,CAAC,EACd,EAAS,EAAG,KAAK,EAAO,IAAM,EAAA,YAAY,EAAK,GAAI,EAAO,CAAC,CAAC,EAElE,EAAc,EACd,EAAM,CAAM,CACd,EACA,OAAQ,EAAG,MACb,CAAC,EAGD,EAAc,EACd,EAAM,CAAI,CACZ,CAEA,SAAS,WAAkB,CACzB,GAAM,CAAE,OAAQ,EAAG,MAAO,GAAM,EAAK,WAC/B,EAAO,SAAS,EAEtB,KAAO,EAAW,YAAY,EAAW,YAAY,EAAW,UAAU,EAI1E,GAFA,EAAW,aAAa,YAAa,aAAa,EAAK,MAAM,GAAG,EAAK,MAAM,EAAE,EAEzE,EAAK,SAAW,EAAG,CACrB,EAAc,KAEd,MACF,CAMA,GAJI,CAAC,YAAY,CAAI,GAAK,EAAK,KAAM,GAAM,CAAC,OAAO,SAAS,CAAC,CAAC,EAI1D,IAAY,SAAW,YAAY,CAAI,EAAG,CAC5C,IAAM,EAAa,EAAA,iBAAiB,IAAK,CAAE,MAAO,mBAAoB,CAAC,EAEvE,EAAW,YAAY,CAAU,EAEjC,IAAM,EAAe,EAAO,cAAgB,EACtC,EAAO,EACP,EAAQ,EAAK,QAAQ,EAAG,IAAM,EAAI,KAAK,IAAI,EAAG,EAAE,KAAK,EAAG,CAAC,EACzD,EAAQ,EAAK,KAAK,EAAK,IAAM,CACjC,IAAM,EAAO,EAAA,iBAAiB,OAAQ,CAAE,MAAO,2BAA4B,CAAC,EAK5E,OAHA,EAAA,cAAc,EAAM,CAAE,KAAM,EAAI,OAAS,kBAAkB,CAAC,CAAE,CAAC,EAC/D,EAAW,YAAY,CAAI,EAEpB,CACT,CAAC,EAEG,EAAQ,EACV,cACE,EAAK,IAAK,GAAQ,KAAK,IAAI,EAAG,EAAI,KAAK,CAAC,EACxC,EACC,GAAW,CACV,IAAM,EAAe,EAAO,QAAQ,EAAG,IAAM,EAAI,EAAG,CAAC,GAAK,EACpD,GAAQ,EAAO,WAAa,GAAK,EACnC,EAAO,EAEX,EAAO,SAAS,EAAO,IAAM,CAC3B,IAAM,EAAS,KAAK,MAAM,CAAI,EAE9B,GAAS,EAAQ,EAAgB,EAEjC,IAAM,EAAO,IAAM,EAAO,OAAS,EAAI,EAAI,KAAK,MAAM,CAAI,EACpD,EAAU,IAAM,EAChB,EAAS,IAAM,EAAO,OAAS,EAC/B,EAAQ,GAAU,EAAU,EAAI,GAChC,EAAQ,KAAK,IAAI,EAAG,EAAO,GAAU,EAAU,EAAI,IAAS,EAAS,EAAI,EAAK,EAEpF,EAAM,EAAE,EAAE,aAAa,IAAK,sBAAsB,EAAO,EAAG,EAAO,EAAG,EAAc,EAAS,CAAM,CAAC,CACtG,CAAC,CACH,CACF,GAIA,IAAc,EACd,EAAc,KAElB,MAAO,GAAI,IAAY,MAAO,CAC5B,IAAM,EAAY,EAAA,iBAAiB,IAAK,CAAE,MAAO,kBAAmB,CAAC,EAErE,EAAW,YAAY,CAAS,EAEhC,IAAM,EAAS,EACT,EAAS,KAAK,IAAI,EAAG,GAAG,CAAM,EAC9B,EAAW,KAAK,IAAI,GAAG,CAAM,EAAI,GAAU,EAC3C,EAAO,KAAK,IAAI,EAAG,EAAI,EAAO,OAAS,CAAC,EACxC,EAAM,EAAI,EAAO,OACjB,EAAQ,EAAO,QAAU,CAC7B,IAAM,EAAO,EAAA,iBAAiB,OAAQ,CAAE,MAAO,kBAAmB,KAAM,CAAM,CAAC,EAI/E,OAFA,EAAU,YAAY,CAAI,EAEnB,CACT,CAAC,EAED,cAAc,EAAQ,EAAS,GAAU,CACvC,IAAK,GAAM,CAAC,EAAG,KAAS,EAAM,QAAQ,EAAG,CACvC,IAAM,EAAY,KAAK,IAAI,GAAK,EAAM,GAAK,GAAU,EAAY,CAAC,EAElE,EAAA,cAAc,EAAM,CAAE,OAAQ,EAAW,MAAO,EAAM,EAAG,EAAI,EAAK,EAAG,EAAI,CAAU,CAAC,CACtF,CACF,CAAC,CACH,KAAO,CACL,IAAM,EAAS,EAGT,EAAU,KAAK,IAAI,GAAG,CAAM,EAC5B,EAAY,KAAK,IAAI,GAAG,CAAM,EAAI,GAAW,EAC7C,EAAQ,EAAK,EAAI,KAAK,IAAI,EAAG,EAAO,OAAS,CAAC,EAC9C,iBAAoB,GACxB,EAAM,KAAK,EAAG,KAAO,CAAE,EAAG,EAAI,EAAO,EAAG,EAAK,GAAM,EAAI,GAAW,EAAa,EAAK,CAAE,EAAE,EAEtF,EAA8B,KAElC,GAAI,IAAY,OAAQ,CACtB,IAAM,EAAO,EAAA,iBAAiB,MAAM,EAC9B,EAAW,EAAA,iBAAiB,iBAAkB,CAAE,GAAI,EAAY,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,CAAE,CAAC,EAElG,IAAK,GAAM,CAAC,EAAQ,IAAc,CAChC,CAAC,EAAG,sBAAsB,EAC1B,CAAC,EAAG,yBAAyB,CAC/B,EAAY,CACV,IAAM,EAAO,EAAA,iBAAiB,OAAQ,CAAE,MAAO,EAAW,SAAQ,aAAc,CAAM,CAAC,EAEvF,EAAK,MAAM,UAAY,EACvB,EAAS,YAAY,CAAI,CAC3B,CAEA,EAAK,YAAY,CAAQ,EACzB,EAAW,YAAY,CAAI,EAE3B,EAAO,EAAA,iBAAiB,OAAQ,CAAE,MAAO,kBAAmB,CAAC,EAE7D,EAAA,cAAc,EAAM,CAAE,KAAM,QAAQ,EAAW,GAAI,OAAQ,MAAO,CAAC,EACnE,EAAK,MAAM,YAAc,IAAgB,IAAA,GAAY,GAAK,OAAO,CAAW,EAC5E,EAAW,YAAY,CAAI,CAC7B,CAEA,IAAM,EAAO,EAAA,iBAAiB,OAAQ,CAAE,MAAO,kBAAmB,CAAC,EAEnE,EAAA,cAAc,EAAM,CAAE,KAAM,OAAQ,OAAQ,EAAO,eAAgB,CAAY,CAAC,EAChF,EAAW,YAAY,CAAI,EAE3B,IAAM,EACJ,GAAgB,EAAO,OAAS,EAC5B,EAAA,iBAAiB,SAAU,CAAE,MAAO,kBAAmB,KAAM,EAAO,EAAG,GAAI,CAAC,EAC5E,KAEF,GAAQ,EAAW,YAAY,CAAM,EAEzC,cAAc,EAAQ,EAAU,GAAU,CACxC,IAAM,EAAM,iBAAiB,CAAK,EAElC,EAAA,cAAc,EAAM,CAAE,EAAG,oBAAoB,EAAK,CAAK,CAAE,CAAC,EAEtD,GAAM,EAAA,cAAc,EAAM,CAAE,EAAG,wBAAwB,EAAK,EAAK,EAAG,CAAK,CAAE,CAAC,EAEhF,IAAM,EAAM,EAAI,GAAG,EAAE,EAEjB,GAAU,GAAK,EAAA,cAAc,EAAQ,CAAE,GAAI,EAAI,EAAG,GAAI,EAAI,CAAE,CAAC,CACnE,CAAC,CACH,CAEK,YAAY,CAAI,GAAG,kBAAkB,CAAgB,CAC5D,CAEA,SAAS,kBAAkB,EAAsB,CAM/C,GALA,qBAAqB,EACrB,mBAAqB,IAAA,GAEjB,CAAC,EAAO,SAAW,CAAC,EAAO,SAE3B,EAAK,QAAU,EAAG,OAEtB,GAAM,CAAE,IAAG,QAAO,KAAM,SAAS,EAEjC,EAAI,MAAM,OAAS,YAEnB,IAAM,EAAQ,GAAK,EAAK,OAAS,GAC3B,EAAS,IAAY,MAAQ,CAAC,EAAI,eAAe,EAAM,EAAG,CAAC,EAC3D,EAAS,EAAA,iBAAiB,SAAU,CAAE,MAAO,qBAAsB,KAAM,EAAO,EAAG,GAAI,CAAC,EACxF,QAAW,GACf,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,OAAS,EAAG,KAAK,OAAO,EAAU,EAAI,sBAAsB,CAAC,CAAC,KAAO,GAAS,CAAK,CAAC,CAAC,EAEjH,EAAO,MAAM,QAAU,OACvB,EAAW,YAAY,CAAM,EAE7B,IAAM,WAAc,GAAkB,CACpC,IAAM,EAAM,QAAQ,EAAE,OAAO,EACvB,EAAQ,EAAO,GAEjB,IACF,EAAA,cAAc,EAAQ,CAAE,GAAI,EAAM,EAAG,GAAI,EAAM,CAAE,CAAC,EAClD,EAAO,MAAM,QAAU,IAGzB,EAAO,UAAU,CAAE,MAAO,EAAK,cAAe,EAAG,MAAO,EAAK,EAAK,CAAC,CACrE,EAEM,gBAAoB,CACxB,EAAO,MAAM,QAAU,OACvB,EAAO,UAAU,IAAI,CACvB,EAEM,YAAe,GAAkB,CACrC,GAAI,CAAC,EAAO,QAAS,OAErB,IAAM,EAAM,QAAQ,EAAE,OAAO,EAE7B,EAAO,QAAQ,CAAE,MAAO,EAAK,cAAe,EAAG,MAAO,EAAK,EAAK,CAAC,CACnE,EAEA,EAAI,iBAAiB,YAAa,UAAU,EAC5C,EAAI,iBAAiB,aAAc,WAAW,EAC9C,EAAI,iBAAiB,QAAS,WAAW,EAEzC,uBAA2B,CACzB,EAAI,oBAAoB,YAAa,UAAU,EAC/C,EAAI,oBAAoB,aAAc,WAAW,EACjD,EAAI,oBAAoB,QAAS,WAAW,CAC9C,CACF,CAEA,IAAM,EAAK,IAAI,gBACX,EAAa,GAEjB,GAAI,CAGF,OAFA,UAAU,EAEH,CACL,IAAI,gBAA8B,CAChC,OAAO,EAAG,MACZ,EAEA,SAAU,CACJ,IAEJ,EAAa,GACb,EAAQ,KAAK,CAAE,KAAM,SAAU,CAAC,EAChC,EAAQ,KAAK,EACb,EAAG,MAAM,EACT,qBAAqB,EACrB,EAAK,QAAQ,EACf,EAEA,IAAI,UAAoB,CACtB,OAAO,CACT,EAEA,GAAI,EAEJ,IAAK,EAAQ,IAEb,OAAO,EAAM,CACX,GAAI,EAAY,MAAM,IAAI,EAAA,iBAAiB,iCAAiC,EAC5E,EAAO,EACP,UAAU,CACZ,EAEA,CAAC,OAAO,UAAW,CACjB,KAAK,QAAQ,CACf,CACF,CACF,OAAS,EAAO,CAId,MAHA,EAAG,MAAM,EACT,qBAAqB,EACrB,EAAK,QAAQ,EACP,aAAiB,EAAA,iBAAmB,EAAQ,IAAI,EAAA,iBAAiB,0BAA2B,CAAE,MAAO,CAAM,CAAC,CACpH,CACF"}
1
+ {"version":3,"file":"sparkline.cjs","names":["areaPath","monotonePath","stepPath","linePath","uniqueId","createTappers","resolveMotion","resolveEasing","createChartBase","createSvgElement","startTween","tweenNumber","PrismRenderError","require_element","require__tappers","require_errors","require_chart_base","require_easing","require_motion","require_tween","require_transition","require_ids","require_path","PLOT_INSET","data","xStep","width","min","yRange","i","height","v","top","bottom","p","curve","points","maxR","r","w","h","tl","roundLeft","bl","tr","roundRight","br","x","y","variant","config","color","strokeWidth","fillOpacity","showEndPoint","gradientId","tappers","motion","easing","drawnValues","activeTween","base","container","svg","innerGroup","inset","from","to","floorValue","value","paint","e","progress","values","ac","plot","stackGroup","cornerRadius","segs","total","s","d","paths","path","seg","runningTotal","half","xAcc","xStart","xEnd","isFirst","isLast","drawX","drawW","barsGroup","barMin","barRange","barW","gap","rects","rect","barHeight","frame","lineMin","lineRange","fill","defs","gradient","offset","className","stop","endDot","end","marker","clientX","idx","point","isDisposed","next","error"],"sources":["../../../src/charts/sparkline/sparkline.ts"],"sourcesContent":["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,2 +1,252 @@
1
- import"../../_dev.js";import{createSvgElement as e,setAttributes as t}from"../../svg/element.js";import{createTappers as n}from"../../_tappers.js";import{PrismRenderError as r}from"../../errors.js";import{createChartBase as i}from"../../core/chart-base.js";import{resolveEasing as a}from"../../animation/easing.js";import{resolveMotion as o}from"../../animation/motion.js";import{tweenNumber as s}from"../../animation/tween.js";import{startTween as c}from"../../animation/transition.js";import{uniqueId as l}from"../../core/ids.js";import{areaPath as u,linePath as d,monotonePath as f,stepPath as p}from"../../svg/path.js";var m=5;function buildTopPoints(e,t,n){if(e.length===0)return[];let r=t/Math.max(1,e.length-1),i=Math.min(...e),a=Math.max(...e)-i||1;return e.map((e,t)=>({x:t*r,y:n-(e-i)/a*n}))}function buildAreaPathFromPoints(e,t,n){if(e.length===0)return``;let r=e.map(e=>({x:e.x,y:t}));return u(e,r,n??`linear`)}function buildPathFromPoints(e,t){return e.length===0?``:t===`monotone`?f(e):t===`step`?p(e):d(e)}function isStackData(e){return e.length>0&&e[0]!==null&&typeof e[0]==`object`}function buildRoundedStackRect(e,t,n,r,i,a,o){let s=Math.min(i,n/2,r/2),c=a?s:0,l=a?s:0,u=o?s:0,d=o?s:0;return[`M${e+c},${t}`,`H${e+n-u}`,u?`Q${e+n},${t} ${e+n},${t+u}`:``,`V${t+r-d}`,d?`Q${e+n},${t+r} ${e+n-d},${t+r}`:``,`H${e+l}`,l?`Q${e},${t+r} ${e},${t+r-l}`:``,`V${t+c}`,c?`Q${e},${t} ${e+c},${t}`:``,`Z`].filter(Boolean).join(``)}function defaultStackColor(e){return`var(--prism-color-${e%8+1})`}function createSparkline(u,d){let f=d.variant??`line`,p=d.color??`var(--prism-color-1)`,h=d.curve??`linear`,g=d.strokeWidth??1.5,_=d.fillOpacity,v=d.showEndPoint??!0,y=l(`prism-spark-fill`),b=n(),x=o(d.transition),S=a(x.easing),C=d.data,w=null,T=null,E=i(u,{a11y:d.a11y,margin:{bottom:0,left:0,right:0,top:0}},()=>{b.emit({height:E.dimensions.height,type:`resize`,width:E.dimensions.width}),renderAll()}),{svg:D}=E;D.classList.add(`prism-sparkline`);let O=e(`g`,{class:`prism-spark-inner`});D.appendChild(O);let cleanupInteraction;function plotArea(){let{height:e,width:t}=E.dimensions,n=f===`line`||f===`area`?m:0;return{h:Math.max(1,e-n*2),inset:n,w:Math.max(1,t-n*2)}}function animateValues(e,t,n){T?.();let r=w?.length===e.length?w:e.map(()=>t);if(r.every((t,n)=>t===e[n])||x.duration===0){w=e,n(e);return}T=c({count:1,duration:x.duration,easing:S,onFrame:t=>{let i=t(0),a=e.map((e,t)=>s(r[t],e,i));w=a,n(a)},signal:k.signal}),w=r,n(r)}function renderAll(){let{height:n,width:r}=E.dimensions,i=plotArea();for(;O.firstChild;)O.removeChild(O.firstChild);if(O.setAttribute(`transform`,`translate(${i.inset},${i.inset})`),C.length===0){w=null;return}if(!isStackData(C)&&C.some(e=>!Number.isFinite(e)),f===`stack`&&isStackData(C)){let i=e(`g`,{class:`prism-spark-stack`});O.appendChild(i);let a=d.cornerRadius??4,o=C,s=o.reduce((e,t)=>e+Math.max(0,t.value),0),c=o.map((n,r)=>{let a=e(`path`,{class:`prism-spark-stack-segment`});return t(a,{fill:n.color??defaultStackColor(r)}),i.appendChild(a),a});s>0?animateValues(o.map(e=>Math.max(0,e.value)),0,e=>{let t=e.reduce((e,t)=>e+t,0)||1,i=(d.padPixels??0)/2,o=0;e.forEach((s,l)=>{let u=Math.round(o);o+=s/t*r;let d=l===e.length-1?r:Math.round(o),f=l===0,p=l===e.length-1,m=u+(f?0:i),h=Math.max(0,d-u-(f?0:i)-(p?0:i));c[l]?.setAttribute(`d`,buildRoundedStackRect(m,0,h,n,a,f,p))})}):(T?.(),w=null)}else if(f===`bar`){let i=e(`g`,{class:`prism-spark-bars`});O.appendChild(i);let a=C,o=Math.min(0,...a),s=Math.max(...a)-o||1,c=Math.max(1,r/a.length-1),l=r/a.length,u=a.map(()=>{let t=e(`rect`,{class:`prism-spark-bar`,fill:p});return i.appendChild(t),t});animateValues(a,o,e=>{for(let[r,i]of u.entries()){let a=Math.max(1,(e[r]-o)/s*n);t(i,{height:a,width:c,x:r*l,y:n-a})}})}else{let n=C,r=Math.min(...n),a=Math.max(...n)-r||1,o=i.w/Math.max(1,n.length-1),pointsFromValues=e=>e.map((e,t)=>({x:t*o,y:i.h-(e-r)/a*i.h})),s=null;if(f===`area`){let n=e(`defs`),r=e(`linearGradient`,{id:y,x1:0,x2:0,y1:0,y2:1});for(let[t,n]of[[0,`prism-spark-stop-top`],[1,`prism-spark-stop-bottom`]]){let i=e(`stop`,{class:n,offset:t,"stop-color":p});i.style.stopColor=p,r.appendChild(i)}n.appendChild(r),O.appendChild(n),s=e(`path`,{class:`prism-spark-fill`}),t(s,{fill:`url(#${y})`,stroke:`none`}),s.style.fillOpacity=_===void 0?``:String(_),O.appendChild(s)}let c=e(`path`,{class:`prism-spark-line`});t(c,{fill:`none`,stroke:p,"stroke-width":g}),O.appendChild(c);let l=v&&n.length>0?e(`circle`,{class:`prism-spark-end`,fill:p,r:2.5}):null;l&&O.appendChild(l),animateValues(n,r,e=>{let n=pointsFromValues(e);t(c,{d:buildPathFromPoints(n,h)}),s&&t(s,{d:buildAreaPathFromPoints(n,i.h,h)});let r=n.at(-1);l&&r&&t(l,{cx:r.x,cy:r.y})})}isStackData(C)||attachInteraction(C)}function attachInteraction(n){if(cleanupInteraction?.(),cleanupInteraction=void 0,!d.onHover&&!d.onClick||n.length<=1)return;let{h:r,inset:i,w:a}=plotArea();D.style.cursor=`crosshair`;let o=a/(n.length-1),s=f===`bar`?[]:buildTopPoints(n,a,r),c=e(`circle`,{class:`prism-spark-marker`,fill:p,r:3.5}),indexAt=e=>Math.max(0,Math.min(n.length-1,Math.round((e-D.getBoundingClientRect().left-i)/o)));c.style.display=`none`,O.appendChild(c);let handleMove=e=>{let r=indexAt(e.clientX),i=s[r];i&&(t(c,{cx:i.x,cy:i.y}),c.style.display=``),d.onHover?.({index:r,originalEvent:e,value:n[r]})},handleLeave=()=>{c.style.display=`none`,d.onHover?.(null)},handleClick=e=>{if(!d.onClick)return;let t=indexAt(e.clientX);d.onClick({index:t,originalEvent:e,value:n[t]})};D.addEventListener(`mousemove`,handleMove),D.addEventListener(`mouseleave`,handleLeave),D.addEventListener(`click`,handleClick),cleanupInteraction=()=>{D.removeEventListener(`mousemove`,handleMove),D.removeEventListener(`mouseleave`,handleLeave),D.removeEventListener(`click`,handleClick)}}let k=new AbortController,A=!1;try{return renderAll(),{get disposalSignal(){return k.signal},dispose(){A||(A=!0,b.emit({type:`dispose`}),b.stop(),k.abort(),cleanupInteraction?.(),E.dispose())},get disposed(){return A},el:D,tap:b.tap,update(e){if(A)throw new r(`Cannot update a disposed chart.`);C=e,renderAll()},[Symbol.dispose](){this.dispose()}}}catch(e){throw k.abort(),cleanupInteraction?.(),E.dispose(),e instanceof r?e:new r(`Failed to render chart.`,{cause:e})}}export{createSparkline};
1
+ import "../../_dev.js";
2
+ import { createSvgElement as e, setAttributes as t } from "../../svg/element.js";
3
+ import { createTappers as n } from "../../_tappers.js";
4
+ import { PrismRenderError as r } from "../../errors.js";
5
+ import { createChartBase as i } from "../../core/chart-base.js";
6
+ import { resolveEasing as a } from "../../animation/easing.js";
7
+ import { resolveMotion as o } from "../../animation/motion.js";
8
+ import { tweenNumber as s } from "../../animation/tween.js";
9
+ import { startTween as c } from "../../animation/transition.js";
10
+ import { uniqueId as l } from "../../core/ids.js";
11
+ import { areaPath as u, linePath as d, monotonePath as f, stepPath as p } from "../../svg/path.js";
12
+ //#region src/charts/sparkline/sparkline.ts
13
+ var m = 5;
14
+ function buildTopPoints(e, t, n) {
15
+ if (e.length === 0) return [];
16
+ let r = t / Math.max(1, e.length - 1), i = Math.min(...e), a = Math.max(...e) - i || 1;
17
+ return e.map((e, t) => ({
18
+ x: t * r,
19
+ y: n - (e - i) / a * n
20
+ }));
21
+ }
22
+ function buildAreaPathFromPoints(e, t, n) {
23
+ if (e.length === 0) return "";
24
+ let r = e.map((e) => ({
25
+ x: e.x,
26
+ y: t
27
+ }));
28
+ return u(e, r, n ?? "linear");
29
+ }
30
+ function buildPathFromPoints(e, t) {
31
+ return e.length === 0 ? "" : t === "monotone" ? f(e) : t === "step" ? p(e) : d(e);
32
+ }
33
+ function isStackData(e) {
34
+ return e.length > 0 && e[0] !== null && typeof e[0] == "object";
35
+ }
36
+ function buildRoundedStackRect(e, t, n, r, i, a, o) {
37
+ let s = Math.min(i, n / 2, r / 2), c = a ? s : 0, l = a ? s : 0, u = o ? s : 0, d = o ? s : 0;
38
+ return [
39
+ `M${e + c},${t}`,
40
+ `H${e + n - u}`,
41
+ u ? `Q${e + n},${t} ${e + n},${t + u}` : "",
42
+ `V${t + r - d}`,
43
+ d ? `Q${e + n},${t + r} ${e + n - d},${t + r}` : "",
44
+ `H${e + l}`,
45
+ l ? `Q${e},${t + r} ${e},${t + r - l}` : "",
46
+ `V${t + c}`,
47
+ c ? `Q${e},${t} ${e + c},${t}` : "",
48
+ "Z"
49
+ ].filter(Boolean).join("");
50
+ }
51
+ function defaultStackColor(e) {
52
+ return `var(--prism-color-${e % 8 + 1})`;
53
+ }
54
+ function createSparkline(u, d) {
55
+ let f = d.variant ?? "line", p = d.color ?? "var(--prism-color-1)", h = d.curve ?? "linear", g = d.strokeWidth ?? 1.5, _ = d.fillOpacity, v = d.showEndPoint ?? !0, y = l("prism-spark-fill"), b = n(), x = o(d.transition), S = a(x.easing), C = d.data, w = null, T = null, E = i(u, {
56
+ a11y: d.a11y,
57
+ margin: {
58
+ bottom: 0,
59
+ left: 0,
60
+ right: 0,
61
+ top: 0
62
+ }
63
+ }, () => {
64
+ b.emit({
65
+ height: E.dimensions.height,
66
+ type: "resize",
67
+ width: E.dimensions.width
68
+ }), renderAll();
69
+ }), { svg: D } = E;
70
+ D.classList.add("prism-sparkline");
71
+ let O = e("g", { class: "prism-spark-inner" });
72
+ D.appendChild(O);
73
+ let cleanupInteraction;
74
+ function plotArea() {
75
+ let { height: e, width: t } = E.dimensions, n = f === "line" || f === "area" ? m : 0;
76
+ return {
77
+ h: Math.max(1, e - n * 2),
78
+ inset: n,
79
+ w: Math.max(1, t - n * 2)
80
+ };
81
+ }
82
+ function animateValues(e, t, n) {
83
+ T?.();
84
+ let r = w?.length === e.length ? w : e.map(() => t);
85
+ r.every((t, n) => t === e[n]) || x.duration === 0 ? (w = e, n(e)) : (T = c({
86
+ count: 1,
87
+ duration: x.duration,
88
+ easing: S,
89
+ onFrame: (t) => {
90
+ let i = t(0), a = e.map((e, t) => s(r[t], e, i));
91
+ w = a, n(a);
92
+ },
93
+ signal: k.signal
94
+ }), w = r, n(r));
95
+ }
96
+ function renderAll() {
97
+ let { height: n, width: r } = E.dimensions, i = plotArea();
98
+ for (; O.firstChild;) O.removeChild(O.firstChild);
99
+ if (O.setAttribute("transform", `translate(${i.inset},${i.inset})`), C.length === 0) w = null;
100
+ else {
101
+ if (!isStackData(C) && C.some((e) => !Number.isFinite(e)), f === "stack" && isStackData(C)) {
102
+ let i = e("g", { class: "prism-spark-stack" });
103
+ O.appendChild(i);
104
+ let a = d.cornerRadius ?? 4, o = C, s = o.reduce((e, t) => e + Math.max(0, t.value), 0), c = o.map((n, r) => {
105
+ let a = e("path", { class: "prism-spark-stack-segment" });
106
+ return t(a, { fill: n.color ?? defaultStackColor(r) }), i.appendChild(a), a;
107
+ });
108
+ s > 0 ? animateValues(o.map((e) => Math.max(0, e.value)), 0, (e) => {
109
+ let t = e.reduce((e, t) => e + t, 0) || 1, i = (d.padPixels ?? 0) / 2, o = 0;
110
+ e.forEach((s, l) => {
111
+ let u = Math.round(o);
112
+ o += s / t * r;
113
+ let d = l === e.length - 1 ? r : Math.round(o), f = l === 0, p = l === e.length - 1, m = u + (f ? 0 : i), h = Math.max(0, d - u - (f ? 0 : i) - (p ? 0 : i));
114
+ c[l]?.setAttribute("d", buildRoundedStackRect(m, 0, h, n, a, f, p));
115
+ });
116
+ }) : (T?.(), w = null);
117
+ } else if (f === "bar") {
118
+ let i = e("g", { class: "prism-spark-bars" });
119
+ O.appendChild(i);
120
+ let a = C, o = Math.min(0, ...a), s = Math.max(...a) - o || 1, c = Math.max(1, r / a.length - 1), l = r / a.length, u = a.map(() => {
121
+ let t = e("rect", {
122
+ class: "prism-spark-bar",
123
+ fill: p
124
+ });
125
+ return i.appendChild(t), t;
126
+ });
127
+ animateValues(a, o, (e) => {
128
+ for (let [r, i] of u.entries()) {
129
+ let a = Math.max(1, (e[r] - o) / s * n);
130
+ t(i, {
131
+ height: a,
132
+ width: c,
133
+ x: r * l,
134
+ y: n - a
135
+ });
136
+ }
137
+ });
138
+ } else {
139
+ let n = C, r = Math.min(...n), a = Math.max(...n) - r || 1, o = i.w / Math.max(1, n.length - 1), pointsFromValues = (e) => e.map((e, t) => ({
140
+ x: t * o,
141
+ y: i.h - (e - r) / a * i.h
142
+ })), s = null;
143
+ if (f === "area") {
144
+ let n = e("defs"), r = e("linearGradient", {
145
+ id: y,
146
+ x1: 0,
147
+ x2: 0,
148
+ y1: 0,
149
+ y2: 1
150
+ });
151
+ for (let [t, n] of [[0, "prism-spark-stop-top"], [1, "prism-spark-stop-bottom"]]) {
152
+ let i = e("stop", {
153
+ class: n,
154
+ offset: t,
155
+ "stop-color": p
156
+ });
157
+ i.style.stopColor = p, r.appendChild(i);
158
+ }
159
+ n.appendChild(r), O.appendChild(n), s = e("path", { class: "prism-spark-fill" }), t(s, {
160
+ fill: `url(#${y})`,
161
+ stroke: "none"
162
+ }), s.style.fillOpacity = _ === void 0 ? "" : String(_), O.appendChild(s);
163
+ }
164
+ let c = e("path", { class: "prism-spark-line" });
165
+ t(c, {
166
+ fill: "none",
167
+ stroke: p,
168
+ "stroke-width": g
169
+ }), O.appendChild(c);
170
+ let l = v && n.length > 0 ? e("circle", {
171
+ class: "prism-spark-end",
172
+ fill: p,
173
+ r: 2.5
174
+ }) : null;
175
+ l && O.appendChild(l), animateValues(n, r, (e) => {
176
+ let n = pointsFromValues(e);
177
+ t(c, { d: buildPathFromPoints(n, h) }), s && t(s, { d: buildAreaPathFromPoints(n, i.h, h) });
178
+ let r = n.at(-1);
179
+ l && r && t(l, {
180
+ cx: r.x,
181
+ cy: r.y
182
+ });
183
+ });
184
+ }
185
+ isStackData(C) || attachInteraction(C);
186
+ }
187
+ }
188
+ function attachInteraction(n) {
189
+ if (cleanupInteraction?.(), cleanupInteraction = void 0, !d.onHover && !d.onClick || n.length <= 1) return;
190
+ let { h: r, inset: i, w: a } = plotArea();
191
+ D.style.cursor = "crosshair";
192
+ let o = a / (n.length - 1), s = f === "bar" ? [] : buildTopPoints(n, a, r), c = e("circle", {
193
+ class: "prism-spark-marker",
194
+ fill: p,
195
+ r: 3.5
196
+ }), indexAt = (e) => Math.max(0, Math.min(n.length - 1, Math.round((e - D.getBoundingClientRect().left - i) / o)));
197
+ c.style.display = "none", O.appendChild(c);
198
+ let handleMove = (e) => {
199
+ let r = indexAt(e.clientX), i = s[r];
200
+ i && (t(c, {
201
+ cx: i.x,
202
+ cy: i.y
203
+ }), c.style.display = ""), d.onHover?.({
204
+ index: r,
205
+ originalEvent: e,
206
+ value: n[r]
207
+ });
208
+ }, handleLeave = () => {
209
+ c.style.display = "none", d.onHover?.(null);
210
+ }, handleClick = (e) => {
211
+ if (!d.onClick) return;
212
+ let t = indexAt(e.clientX);
213
+ d.onClick({
214
+ index: t,
215
+ originalEvent: e,
216
+ value: n[t]
217
+ });
218
+ };
219
+ D.addEventListener("mousemove", handleMove), D.addEventListener("mouseleave", handleLeave), D.addEventListener("click", handleClick), cleanupInteraction = () => {
220
+ D.removeEventListener("mousemove", handleMove), D.removeEventListener("mouseleave", handleLeave), D.removeEventListener("click", handleClick);
221
+ };
222
+ }
223
+ let k = new AbortController(), A = !1;
224
+ try {
225
+ return renderAll(), {
226
+ get disposalSignal() {
227
+ return k.signal;
228
+ },
229
+ dispose() {
230
+ A || (A = !0, b.emit({ type: "dispose" }), b.stop(), k.abort(), cleanupInteraction?.(), E.dispose());
231
+ },
232
+ get disposed() {
233
+ return A;
234
+ },
235
+ el: D,
236
+ tap: b.tap,
237
+ update(e) {
238
+ if (A) throw new r("Cannot update a disposed chart.");
239
+ C = e, renderAll();
240
+ },
241
+ [Symbol.dispose]() {
242
+ this.dispose();
243
+ }
244
+ };
245
+ } catch (e) {
246
+ throw k.abort(), cleanupInteraction?.(), E.dispose(), e instanceof r ? e : new r("Failed to render chart.", { cause: e });
247
+ }
248
+ }
249
+ //#endregion
250
+ export { createSparkline };
251
+
2
252
  //# sourceMappingURL=sparkline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sparkline.js","names":[],"sources":["../../../src/charts/sparkline/sparkline.ts"],"sourcesContent":["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":"sparkline.js","names":["PLOT_INSET","data","xStep","width","min","yRange","i","height","v","top","bottom","p","areaPath","curve","points","monotonePath","stepPath","linePath","maxR","r","w","h","tl","roundLeft","bl","tr","roundRight","br","x","y","variant","config","color","strokeWidth","fillOpacity","showEndPoint","gradientId","uniqueId","tappers","createTappers","motion","resolveMotion","easing","resolveEasing","drawnValues","activeTween","base","createChartBase","container","innerGroup","createSvgElement","inset","from","to","floorValue","value","paint","startTween","e","progress","values","tweenNumber","ac","plot","stackGroup","cornerRadius","segs","total","s","d","paths","path","setAttributes","seg","runningTotal","half","xAcc","xStart","xEnd","isFirst","isLast","drawX","drawW","barsGroup","barMin","barRange","barW","gap","rects","rect","barHeight","frame","lineMin","lineRange","fill","defs","gradient","offset","className","stop","endDot","end","marker","clientX","svg","idx","point","isDisposed","PrismRenderError","next","error"],"sources":["../../../src/charts/sparkline/sparkline.ts"],"sourcesContent":["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,2 +1,2 @@
1
- require("../_dev.cjs");function keyId(e){return e instanceof Date?`date:${e.getTime()}`:`${typeof e}:${String(e)}`}function normalizeCartesianSeries(e,t){let n=[],r=new Map;return{domain:n,labels:r,series:e.map((e,i)=>{let a=new Map;for(let o of t[i]??[]){let t=keyId(o.key);if(a.has(t)){`${String(o.key)}${e.name}`;continue}a.set(t,o),r.has(t)||(r.set(t,o.key),n.push(t))}return{byKey:a,config:e}})}}exports.keyId=keyId,exports.normalizeCartesianSeries=normalizeCartesianSeries;
1
+ require("../_dev.cjs");function keyId(e){return e instanceof Date?`date:${e.getTime()}`:`${typeof e}:${String(e)}`}function normalizeCartesianSeries(e,t){let n=[],r=new Map;return{domain:n,labels:r,series:e.map((e,i)=>{let a=new Map;for(let o of t[i]??[]){let t=keyId(o.key);a.has(t)?`${String(o.key)}${e.name}`:(a.set(t,o),r.has(t)||(r.set(t,o.key),n.push(t)))}return{byKey:a,config:e}})}}exports.keyId=keyId,exports.normalizeCartesianSeries=normalizeCartesianSeries;
2
2
  //# sourceMappingURL=cartesian-model.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-model.cjs","names":[],"sources":["../../src/core/cartesian-model.ts"],"sourcesContent":["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"],"mappings":"uBAgBA,SAAgB,MAAM,EAAiC,CAGrD,OAFI,aAAe,KAAa,QAAQ,EAAI,QAAQ,IAE7C,GAAG,OAAO,EAAI,GAAG,OAAO,CAAG,GACpC,CAEA,SAAgB,yBACd,EACA,EACmB,CACnB,IAAM,EAAyB,CAAC,EAC1B,EAAS,IAAI,IAuBnB,MAAO,CAAE,SAAQ,SAAQ,OAtBN,EAAO,KAAK,EAAQ,IAAgB,CACrD,IAAM,EAAQ,IAAI,IAElB,IAAK,IAAM,KAAS,EAAK,IAAgB,CAAC,EAAG,CAC3C,IAAM,EAAK,MAAM,EAAM,GAAG,EAE1B,GAAI,EAAM,IAAI,CAAE,EAAG,CACZ,GAAwB,OAAO,EAAM,GAAG,EAAxC,EAAyD,EAAO,KAAhE,EACL,QACF,CAEA,EAAM,IAAI,EAAI,CAAK,EAEd,EAAO,IAAI,CAAE,IAChB,EAAO,IAAI,EAAI,EAAM,GAAG,EACxB,EAAO,KAAK,CAAE,EAElB,CAEA,MAAO,CAAE,QAAO,QAAO,CACzB,CAEiC,CAAW,CAC9C"}
1
+ {"version":3,"file":"cartesian-model.cjs","names":["key","domain","labels","series","byKey","datum","data","seriesIndex","id","config"],"sources":["../../src/core/cartesian-model.ts"],"sourcesContent":["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"],"mappings":"A,uBAgBA,SAAgB,MAAM,EAAiC,CAGrD,OAFIA,aAAe,KAAa,QAAQA,EAAI,QAAQ,IAE7C,GAAG,OAAOA,EAAI,GAAG,OAAOA,CAAG,GACpC,CAEA,SAAgB,yBACd,EACA,EACmB,CACnB,IAAMC,EAAyB,CAAC,EAC1BC,EAAS,IAAI,IAuBnB,MAAO,CAAE,SAAQ,SAAQ,OAtBNC,EAAO,KAAK,EAAQ,IAAgB,CACrD,IAAMC,EAAQ,IAAI,IAElB,IAAK,IAAMC,KAASC,EAAKC,IAAgB,CAAC,EAAG,CAC3C,IAAMC,EAAK,MAAMH,EAAM,GAAG,EAEtBD,EAAM,IAAII,CAAE,EACT,GAAwB,OAAOH,EAAM,GAAG,EAAxC,EAAyDI,EAAO,KAAhE,GAIPL,EAAM,IAAII,EAAIH,CAAK,EAEdH,EAAO,IAAIM,CAAE,IAChBN,EAAO,IAAIM,EAAIH,EAAM,GAAG,EACxBJ,EAAO,KAAKO,CAAE,GAElB,CAEA,MAAO,CAAE,QAAO,QAAO,CACzB,CAEiC,CAAW,CAC9C,C"}
@@ -1,2 +1,27 @@
1
- import"../_dev.js";function keyId(e){return e instanceof Date?`date:${e.getTime()}`:`${typeof e}:${String(e)}`}function normalizeCartesianSeries(e,t){let n=[],r=new Map;return{domain:n,labels:r,series:e.map((e,i)=>{let a=new Map;for(let o of t[i]??[]){let t=keyId(o.key);if(a.has(t)){`${String(o.key)}${e.name}`;continue}a.set(t,o),r.has(t)||(r.set(t,o.key),n.push(t))}return{byKey:a,config:e}})}}export{keyId,normalizeCartesianSeries};
1
+ import "../_dev.js";
2
+ //#region src/core/cartesian-model.ts
3
+ function keyId(e) {
4
+ return e instanceof Date ? `date:${e.getTime()}` : `${typeof e}:${String(e)}`;
5
+ }
6
+ function normalizeCartesianSeries(e, t) {
7
+ let n = [], r = /* @__PURE__ */ new Map();
8
+ return {
9
+ domain: n,
10
+ labels: r,
11
+ series: e.map((e, i) => {
12
+ let a = /* @__PURE__ */ new Map();
13
+ for (let o of t[i] ?? []) {
14
+ let t = keyId(o.key);
15
+ a.has(t) ? `${String(o.key)}${e.name}` : (a.set(t, o), r.has(t) || (r.set(t, o.key), n.push(t)));
16
+ }
17
+ return {
18
+ byKey: a,
19
+ config: e
20
+ };
21
+ })
22
+ };
23
+ }
24
+ //#endregion
25
+ export { keyId, normalizeCartesianSeries };
26
+
2
27
  //# sourceMappingURL=cartesian-model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-model.js","names":[],"sources":["../../src/core/cartesian-model.ts"],"sourcesContent":["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"],"mappings":"mBAgBA,SAAgB,MAAM,EAAiC,CAGrD,OAFI,aAAe,KAAa,QAAQ,EAAI,QAAQ,IAE7C,GAAG,OAAO,EAAI,GAAG,OAAO,CAAG,GACpC,CAEA,SAAgB,yBACd,EACA,EACmB,CACnB,IAAM,EAAyB,CAAC,EAC1B,EAAS,IAAI,IAuBnB,MAAO,CAAE,SAAQ,SAAQ,OAtBN,EAAO,KAAK,EAAQ,IAAgB,CACrD,IAAM,EAAQ,IAAI,IAElB,IAAK,IAAM,KAAS,EAAK,IAAgB,CAAC,EAAG,CAC3C,IAAM,EAAK,MAAM,EAAM,GAAG,EAE1B,GAAI,EAAM,IAAI,CAAE,EAAG,CACZ,GAAwB,OAAO,EAAM,GAAG,EAAxC,EAAyD,EAAO,KAAhE,EACL,QACF,CAEA,EAAM,IAAI,EAAI,CAAK,EAEd,EAAO,IAAI,CAAE,IAChB,EAAO,IAAI,EAAI,EAAM,GAAG,EACxB,EAAO,KAAK,CAAE,EAElB,CAEA,MAAO,CAAE,QAAO,QAAO,CACzB,CAEiC,CAAW,CAC9C"}
1
+ {"version":3,"file":"cartesian-model.js","names":["key","domain","labels","series","byKey","datum","data","seriesIndex","id","config"],"sources":["../../src/core/cartesian-model.ts"],"sourcesContent":["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"],"mappings":";;AAgBA,SAAgB,MAAM,GAAiC;CAGrD,OAFIA,aAAe,OAAa,QAAQA,EAAI,QAAQ,MAE7C,GAAG,OAAOA,EAAI,GAAG,OAAOA,CAAG;AACpC;AAEA,SAAgB,yBACd,GACA,GACmB;CACnB,IAAMC,IAAyB,CAAC,GAC1BC,oBAAS,IAAI,IAAgC;CAuBnD,OAAO;EAAE;EAAQ;EAAQ,QAtBNC,EAAO,KAAK,GAAQ,MAAgB;GACrD,IAAMC,oBAAQ,IAAI,IAAyB;GAE3C,KAAK,IAAMC,KAASC,EAAKC,MAAgB,CAAC,GAAG;IAC3C,IAAMC,IAAK,MAAMH,EAAM,GAAG;IAE1B,AAAID,EAAM,IAAII,CAAE,IACT,GAAwB,OAAOH,EAAM,GAAG,EAAxC,EAAyDI,EAAO,KAAhE,KAIPL,EAAM,IAAII,GAAIH,CAAK,GAEdH,EAAO,IAAIM,CAAE,MAChBN,EAAO,IAAIM,GAAIH,EAAM,GAAG,GACxBJ,EAAO,KAAKO,CAAE;GAElB;GAEA,OAAO;IAAE;IAAO;GAAO;EACzB,CAEiC;CAAW;AAC9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-scales.cjs","names":[],"sources":["../../src/core/cartesian-scales.ts"],"sourcesContent":["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"],"mappings":"+FAKA,SAAgB,YAAY,EAAyB,EAA4C,CAW/F,GAVI,EAAK,SAAW,GAEhB,EAAK,KAAM,GAAM,GAAK,IAAI,GAQ1B,EAAK,KAAM,GAAM,OAAO,GAAM,UAAY,CAAC,OAAO,SAAS,CAAC,CAAC,EAG/D,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,EAG1D,GAAI,EAAK,aAAc,KAAM,CAC3B,IAAM,EAAQ,EACR,EAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,EACrC,EAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,EACrC,EAAM,IAAI,KAAK,CAAK,EACpB,EAAM,IAAI,KAAK,IAAU,EAAQ,EAAQ,EAAI,CAAK,EAExD,OAAO,EAAA,UAAU,CAAE,OAAQ,CAAC,EAAK,CAAG,EAAG,KAAM,GAAO,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,CACzE,CAEA,IAAM,EAAO,EACP,EAAO,KAAK,IAAI,GAAG,CAAI,EACvB,EAAO,KAAK,IAAI,GAAG,CAAI,EAE7B,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,IAAS,EAAO,EAAO,EAAI,CAAI,EAAG,KAAM,GAAO,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,CACxG,CAEA,SAAgB,YAAY,EAAgB,EAAgB,EAAc,GAAqB,CAW7F,GAVI,EAAK,SAAW,GAEhB,EAAK,KAAM,GAAM,GAAK,IAAI,GAQ1B,EAAK,KAAM,GAAM,CAAC,OAAO,SAAS,CAAC,CAAC,EAGtC,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAQ,CAAC,CAAE,CAAC,EAG3D,IAAM,EAAS,KAAK,IAAI,GAAG,CAAI,EACzB,EAAO,EAAc,KAAK,IAAI,EAAG,CAAM,EAAI,EAC3C,EAAO,KAAK,IAAI,GAAG,CAAI,EAE7B,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,IAAS,EAAO,EAAO,EAAI,CAAI,EAAG,MAAO,CAAC,EAAQ,CAAC,CAAE,CAAC,CAC5F"}
1
+ {"version":3,"file":"cartesian-scales.cjs","names":["linearScale","timeScale","require_linear","require_time","allX","v","width","dates","minMs","maxMs","min","max","nums","minN","maxN","allY","height","rawMin","minY","includeZero","maxY"],"sources":["../../src/core/cartesian-scales.ts"],"sourcesContent":["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"],"mappings":"A,+FAKA,SAAgB,YAAY,EAAyB,EAA4C,CAW/F,GAVII,EAAK,SAAW,GAEhBA,EAAK,KAAM,GAAMC,GAAK,IAAI,GAQ1BD,EAAK,KAAM,GAAM,OAAOC,GAAM,UAAY,CAAC,OAAO,SAASA,CAAC,CAAC,EAG/D,OAAOL,EAAAA,YAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAGM,CAAK,CAAE,CAAC,EAG1D,GAAIF,EAAK,aAAc,KAAM,CAC3B,IAAMG,EAAQH,EACRI,EAAQ,KAAK,IAAI,GAAGD,EAAM,IAAI,MAAM,CAAC,EACrCE,EAAQ,KAAK,IAAI,GAAGF,EAAM,IAAI,MAAM,CAAC,EACrCG,EAAM,IAAI,KAAKF,CAAK,EACpBG,EAAM,IAAI,KAAKH,IAAUC,EAAQA,EAAQ,EAAIA,CAAK,EAExD,OAAOR,EAAAA,UAAU,CAAE,OAAQ,CAACS,EAAKC,CAAG,EAAG,KAAM,GAAO,MAAO,CAAC,EAAGL,CAAK,CAAE,CAAC,CACzE,CAEA,IAAMM,EAAOR,EACPS,EAAO,KAAK,IAAI,GAAGD,CAAI,EACvBE,EAAO,KAAK,IAAI,GAAGF,CAAI,EAE7B,OAAOZ,EAAAA,YAAY,CAAE,OAAQ,CAACa,EAAMA,IAASC,EAAOA,EAAO,EAAIA,CAAI,EAAG,KAAM,GAAO,MAAO,CAAC,EAAGR,CAAK,CAAE,CAAC,CACxG,CAEA,SAAgB,YAAY,EAAgB,EAAgB,EAAc,GAAqB,CAW7F,GAVIS,EAAK,SAAW,GAEhBA,EAAK,KAAM,GAAMV,GAAK,IAAI,GAQ1BU,EAAK,KAAM,GAAM,CAAC,OAAO,SAASV,CAAC,CAAC,EAGtC,OAAOL,EAAAA,YAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAACgB,EAAQ,CAAC,CAAE,CAAC,EAG3D,IAAMC,EAAS,KAAK,IAAI,GAAGF,CAAI,EACzBG,EAAOC,EAAc,KAAK,IAAI,EAAGF,CAAM,EAAIA,EAC3CG,EAAO,KAAK,IAAI,GAAGL,CAAI,EAE7B,OAAOf,EAAAA,YAAY,CAAE,OAAQ,CAACkB,EAAMA,IAASE,EAAOA,EAAO,EAAIA,CAAI,EAAG,MAAO,CAACJ,EAAQ,CAAC,CAAE,CAAC,CAC5F,C"}