@vielzeug/prism 26.11.5 → 26.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -10
- package/dist/_dev.js +1 -2
- package/dist/_tappers.js +1 -2
- package/dist/animation/easing.js +1 -2
- package/dist/animation/motion.js +0 -1
- package/dist/animation/reveal.cjs +1 -1
- package/dist/animation/reveal.cjs.map +1 -1
- package/dist/animation/reveal.js +29 -30
- package/dist/animation/transition.js +1 -2
- package/dist/animation/tween.js +1 -2
- package/dist/axes/axis.js +1 -2
- package/dist/axes/grid.js +1 -2
- package/dist/axes/scale-utils.js +1 -2
- package/dist/charts/area/area-chart.cjs +1 -1
- package/dist/charts/area/area-chart.cjs.map +1 -1
- package/dist/charts/area/area-chart.js +34 -35
- package/dist/charts/area/area-renderer.cjs +1 -1
- package/dist/charts/area/area-renderer.cjs.map +1 -1
- package/dist/charts/area/area-renderer.js +56 -57
- package/dist/charts/area/area-renderer.js.map +1 -1
- package/dist/charts/bar/bar-chart.cjs +1 -1
- package/dist/charts/bar/bar-chart.cjs.map +1 -1
- package/dist/charts/bar/bar-chart.js +80 -81
- package/dist/charts/bar/bar-chart.js.map +1 -1
- package/dist/charts/bar/bar-hit-test.js +1 -2
- package/dist/charts/bar/bar-renderer.cjs +1 -1
- package/dist/charts/bar/bar-renderer.cjs.map +1 -1
- package/dist/charts/bar/bar-renderer.js +42 -43
- package/dist/charts/bar/bar-value-labels.cjs +1 -1
- package/dist/charts/bar/bar-value-labels.cjs.map +1 -1
- package/dist/charts/bar/bar-value-labels.js +17 -18
- package/dist/charts/heatmap/heatmap-chart.cjs +1 -1
- package/dist/charts/heatmap/heatmap-chart.cjs.map +1 -1
- package/dist/charts/heatmap/heatmap-chart.js +43 -44
- package/dist/charts/heatmap/heatmap-color.js +1 -2
- package/dist/charts/line/line-chart.cjs +1 -1
- package/dist/charts/line/line-chart.cjs.map +1 -1
- package/dist/charts/line/line-chart.js +41 -42
- package/dist/charts/line/line-renderer.cjs +1 -1
- package/dist/charts/line/line-renderer.cjs.map +1 -1
- package/dist/charts/line/line-renderer.js +81 -82
- package/dist/charts/line/line-renderer.js.map +1 -1
- package/dist/charts/pie/pie-chart.cjs +1 -1
- package/dist/charts/pie/pie-chart.cjs.map +1 -1
- package/dist/charts/pie/pie-chart.js +69 -70
- package/dist/charts/pie/pie-renderer.js +1 -2
- package/dist/charts/radar/radar-chart.cjs +1 -1
- package/dist/charts/radar/radar-chart.cjs.map +1 -1
- package/dist/charts/radar/radar-chart.js +118 -119
- package/dist/charts/radar/radar-chart.js.map +1 -1
- package/dist/charts/radar/radar-geometry.cjs +1 -1
- package/dist/charts/radar/radar-geometry.cjs.map +1 -1
- package/dist/charts/radar/radar-geometry.js +15 -16
- package/dist/charts/scatter/scatter-chart.cjs +1 -1
- package/dist/charts/scatter/scatter-chart.cjs.map +1 -1
- package/dist/charts/scatter/scatter-chart.js +33 -34
- package/dist/charts/scatter/scatter-renderer.cjs +1 -1
- package/dist/charts/scatter/scatter-renderer.cjs.map +1 -1
- package/dist/charts/scatter/scatter-renderer.js +22 -23
- package/dist/charts/sparkline/sparkline.cjs +1 -1
- package/dist/charts/sparkline/sparkline.cjs.map +1 -1
- package/dist/charts/sparkline/sparkline.js +87 -88
- package/dist/charts/sparkline/sparkline.js.map +1 -1
- package/dist/core/cartesian-model.js +1 -2
- package/dist/core/cartesian-scales.js +1 -2
- package/dist/core/chart-base.cjs +1 -1
- package/dist/core/chart-base.cjs.map +1 -1
- package/dist/core/chart-base.js +13 -14
- package/dist/core/chart-scaffold.cjs +1 -1
- package/dist/core/chart-scaffold.cjs.map +1 -1
- package/dist/core/chart-scaffold.js +33 -34
- package/dist/core/datum-style.js +1 -2
- package/dist/core/ids.js +1 -2
- package/dist/core/layout.js +1 -2
- package/dist/core/polar.js +1 -2
- package/dist/core/responsive.js +1 -2
- package/dist/core/series-id.js +1 -2
- package/dist/errors.js +1 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +14 -14
- package/dist/interaction/announcer.js +1 -2
- package/dist/interaction/crosshair.js +1 -2
- package/dist/interaction/events.js +1 -2
- package/dist/interaction/legend.js +1 -2
- package/dist/interaction/scatter-interaction.cjs +1 -1
- package/dist/interaction/scatter-interaction.cjs.map +1 -1
- package/dist/interaction/scatter-interaction.js +26 -27
- package/dist/interaction/series-interaction.cjs +1 -1
- package/dist/interaction/series-interaction.cjs.map +1 -1
- package/dist/interaction/series-interaction.js +40 -41
- package/dist/interaction/tooltip.js +1 -2
- package/dist/prism.cjs +1 -1
- package/dist/prism.cjs.map +1 -1
- package/dist/prism.iife.js +1 -1
- package/dist/prism.iife.js.map +1 -1
- package/dist/prism.js +52 -103
- package/dist/prism.js.map +1 -1
- package/dist/scales/band.js +1 -2
- package/dist/scales/linear.js +1 -2
- package/dist/scales/time.js +1 -2
- package/dist/svg/element.js +1 -2
- package/dist/svg/path.js +1 -2
- package/dist/svg/text.js +1 -2
- package/dist/theme/index.js +1 -2
- package/package.json +6 -6
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../
|
|
1
|
+
const e=require("../../axes/axis.cjs"),t=require("../../axes/grid.cjs"),n=require("../../core/cartesian-scales.cjs"),r=require("../../core/chart-scaffold.cjs"),i=require("../../core/layout.cjs"),a=require("../../core/series-id.cjs"),o=require("../../interaction/crosshair.cjs"),s=require("../../interaction/scatter-interaction.cjs"),c=require("../../interaction/series-interaction.cjs"),l=require("../../svg/element.cjs"),u=require("../../theme/index.cjs"),d=require("./scatter-renderer.cjs");function createScatterChart(f,p){let m=null,h=null,g=p.series;return r.createChartScaffold(f,p,(f,_)=>{let{groups:v,legend:y,tooltip:b}=f;y?.update(g.map((e,t)=>({color:u.seriesColor(t,e.color),name:e.name})));let x=f.dimensions,S=i.chartArea(x.width,x.height,x.margin),C=g.map(e=>e.data),w=C.flat().map(e=>e.key),T=C.flat().map(e=>e.value);if(w.length===0){r.clearCartesianDom(v,y,b,m),h?.replaceChildren();return}p.crosshair&&!m&&(m=o.createCrosshair(f.chartArea,p.crosshair));let E=n.buildXScale(w,S.width),D=n.buildYScale(T,S.height,!1),O=p.xAxis===!1?!1:p.xAxis??{},k=p.yAxis!==!1&&{grid:!0,...p.yAxis};for(k&&k.grid?t.renderGrid(v.grid,D,k.grid,S.width,`horizontal`,e.resolveTicks(D,k,e.resolveTickCount(k,S.height,`left`))):v.grid.replaceChildren(),O&&O.grid&&t.renderGrid(v.grid,E,O.grid,S.height,`vertical`,e.resolveTicks(E,O,e.resolveTickCount(O,S.width,`bottom`))),O?(e.positionAxis(v.xAxis,O.position??`bottom`,S.width,S.height),e.renderAxis(v.xAxis,E,O,S.width,`bottom`)):v.xAxis.replaceChildren(),k?(e.positionAxis(v.yAxis,k.position??`left`,S.width,S.height),e.renderAxis(v.yAxis,D,k,S.height,`left`)):v.yAxis.replaceChildren();v.series.children.length>g.length;)v.series.removeChild(v.series.lastChild);let A=[];for(let[e,t]of g.entries()){let n=v.series.children[e];n||(n=l.createSvgElement(`g`,{class:`prism-scatter-series`}),v.series.appendChild(n)),n.setAttribute(`data-series-id`,a.seriesDomId(t,e));let r=d.computeScatterPoints(t.data,E,D);A.push(r),d.renderScatterPoints(n,r,{color:u.seriesColor(e,t.color),disposalSignal:f.disposalSignal,marks:t.data,pointRadius:t.pointRadius??3,transition:_!==`resize`&&p.transition})}return b?.hide(),h=c.ensureMarkerGroup(f.chartArea,h),s.createScatterInteraction({announcer:f.announcer,colors:()=>g.map((e,t)=>u.seriesColor(t,e.color)),crosshair:m,dims:()=>f.dimensions,getData:()=>C,getPoints:()=>A,getSeriesList:()=>g,margin:x.margin,markers:h,onClick:p.onClick,onHover:p.onHover,seriesGroup:v.series,svg:f.svg,tooltip:b,tooltipFormat:typeof p.tooltip==`object`?p.tooltip:void 0})},e=>{g=e})}exports.createScatterChart=createScatterChart;
|
|
2
2
|
//# sourceMappingURL=scatter-chart.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scatter-chart.cjs","names":["createChartScaffold","seriesColor","chartArea","createCrosshair","buildXScale","buildYScale","resolveTicks","resolveTickCount","createSvgElement","seriesDomId","computeScatterPoints","ensureMarkerGroup","createScatterInteraction","
|
|
1
|
+
{"version":3,"file":"scatter-chart.cjs","names":["createChartScaffold","seriesColor","chartArea","createCrosshair","buildXScale","buildYScale","resolveTicks","resolveTickCount","createSvgElement","seriesDomId","computeScatterPoints","ensureMarkerGroup","createScatterInteraction","require_axis","require_grid","require_cartesian_scales","require_chart_scaffold","require_layout","require_series_id","require_crosshair","require_scatter_interaction","require_series_interaction","require_element","require_index","require_scatter_renderer","crosshair","markers","seriesList","config","container","ctx","legend","i","s","dims","area","allData","series","allX","datum","allY","groups","tooltip","xScale","yScale","xAxisConfig","yAxisConfig","allPoints","group","points","reason","data"],"sources":["../../../src/charts/scatter/scatter-chart.ts"],"sourcesContent":["import { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createScatterInteraction } from '../../interaction/scatter-interaction';\nimport { ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, ScatterChartConfig, ScatterSeriesConfig, XAxisConfig, YAxisConfig } from '../../types';\nimport { computeScatterPoints, renderScatterPoints } from './scatter-renderer';\n\nexport function createScatterChart(\n container: HTMLElement,\n config: ScatterChartConfig,\n): ChartHandle<ScatterSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((datum) => datum.value);\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n // Independent points have no baseline to anchor, so the y domain fits the data.\n const yScale = buildYScale(allY, area.height, false);\n\n // Axes render by default (value axis with gridlines); `false` opts out. The value\n // axis merges over its default so a partial config keeps the default gridlines.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : { grid: true, ...config.yAxis };\n\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(yScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n } else {\n groups.grid.replaceChildren();\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(xScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, yScale, yAxisConfig, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (const [i, series] of seriesList.entries()) {\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-scatter-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const points = computeScatterPoints(series.data, xScale, yScale);\n\n allPoints.push(points);\n\n renderScatterPoints(group, points, {\n color: seriesColor(i, series.color),\n disposalSignal: ctx.disposalSignal,\n marks: series.data,\n pointRadius: series.pointRadius ?? 3,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createScatterInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin: dims.margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n tooltipFormat: typeof config.tooltip === 'object' ? config.tooltip : undefined,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { chartArea as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
1
|
+
import { positionAxis as e, renderAxis as t, resolveTickCount as n, resolveTicks as r } from "../../axes/axis.js";
|
|
2
|
+
import { renderGrid as i } from "../../axes/grid.js";
|
|
3
|
+
import { buildXScale as a, buildYScale as o } from "../../core/cartesian-scales.js";
|
|
4
|
+
import { clearCartesianDom as s, createChartScaffold as c } from "../../core/chart-scaffold.js";
|
|
5
|
+
import { chartArea as l } from "../../core/layout.js";
|
|
6
|
+
import { seriesDomId as u } from "../../core/series-id.js";
|
|
7
|
+
import { createCrosshair as d } from "../../interaction/crosshair.js";
|
|
8
|
+
import { createScatterInteraction as f } from "../../interaction/scatter-interaction.js";
|
|
9
9
|
import { ensureMarkerGroup as p } from "../../interaction/series-interaction.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { createSvgElement as m } from "../../svg/element.js";
|
|
11
|
+
import { seriesColor as h } from "../../theme/index.js";
|
|
12
12
|
import { computeScatterPoints as g, renderScatterPoints as _ } from "./scatter-renderer.js";
|
|
13
|
-
|
|
13
|
+
// src/charts/scatter/scatter-chart.ts
|
|
14
14
|
function createScatterChart(v, y) {
|
|
15
15
|
let b = null, x = null, S = y.series;
|
|
16
|
-
return
|
|
17
|
-
let { groups: C, legend: w, tooltip: T } =
|
|
16
|
+
return c(v, y, (c, v) => {
|
|
17
|
+
let { groups: C, legend: w, tooltip: T } = c;
|
|
18
18
|
w?.update(S.map((e, t) => ({
|
|
19
|
-
color:
|
|
19
|
+
color: h(t, e.color),
|
|
20
20
|
name: e.name
|
|
21
21
|
})));
|
|
22
|
-
let E =
|
|
22
|
+
let E = c.dimensions, D = l(E.width, E.height, E.margin), O = S.map((e) => e.data), k = O.flat().map((e) => e.key), A = O.flat().map((e) => e.value);
|
|
23
23
|
if (k.length === 0) {
|
|
24
|
-
|
|
24
|
+
s(C, w, T, b), x?.replaceChildren();
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
-
y.crosshair && !b && (b =
|
|
28
|
-
let j =
|
|
27
|
+
y.crosshair && !b && (b = d(c.chartArea, y.crosshair));
|
|
28
|
+
let j = a(k, D.width), M = o(A, D.height, !1), N = y.xAxis === !1 ? !1 : y.xAxis ?? {}, P = y.yAxis !== !1 && {
|
|
29
29
|
grid: !0,
|
|
30
30
|
...y.yAxis
|
|
31
31
|
};
|
|
32
|
-
for (P && P.grid ?
|
|
32
|
+
for (P && P.grid ? i(C.grid, M, P.grid, D.width, "horizontal", r(M, P, n(P, D.height, "left"))) : C.grid.replaceChildren(), N && N.grid && i(C.grid, j, N.grid, D.height, "vertical", r(j, N, n(N, D.width, "bottom"))), N ? (e(C.xAxis, N.position ?? "bottom", D.width, D.height), t(C.xAxis, j, N, D.width, "bottom")) : C.xAxis.replaceChildren(), P ? (e(C.yAxis, P.position ?? "left", D.width, D.height), t(C.yAxis, M, P, D.height, "left")) : C.yAxis.replaceChildren(); C.series.children.length > S.length;) C.series.removeChild(C.series.lastChild);
|
|
33
33
|
let F = [];
|
|
34
|
-
for (let [
|
|
35
|
-
let
|
|
36
|
-
|
|
37
|
-
let
|
|
38
|
-
F.push(
|
|
39
|
-
color:
|
|
40
|
-
disposalSignal:
|
|
41
|
-
marks:
|
|
42
|
-
pointRadius:
|
|
34
|
+
for (let [e, t] of S.entries()) {
|
|
35
|
+
let n = C.series.children[e];
|
|
36
|
+
n || (n = m("g", { class: "prism-scatter-series" }), C.series.appendChild(n)), n.setAttribute("data-series-id", u(t, e));
|
|
37
|
+
let r = g(t.data, j, M);
|
|
38
|
+
F.push(r), _(n, r, {
|
|
39
|
+
color: h(e, t.color),
|
|
40
|
+
disposalSignal: c.disposalSignal,
|
|
41
|
+
marks: t.data,
|
|
42
|
+
pointRadius: t.pointRadius ?? 3,
|
|
43
43
|
transition: v !== "resize" && y.transition
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
|
-
return T?.hide(), x = p(
|
|
47
|
-
announcer:
|
|
48
|
-
colors: () => S.map((e, t) =>
|
|
46
|
+
return T?.hide(), x = p(c.chartArea, x), f({
|
|
47
|
+
announcer: c.announcer,
|
|
48
|
+
colors: () => S.map((e, t) => h(t, e.color)),
|
|
49
49
|
crosshair: b,
|
|
50
|
-
dims: () =>
|
|
50
|
+
dims: () => c.dimensions,
|
|
51
51
|
getData: () => O,
|
|
52
52
|
getPoints: () => F,
|
|
53
53
|
getSeriesList: () => S,
|
|
@@ -56,7 +56,7 @@ function createScatterChart(v, y) {
|
|
|
56
56
|
onClick: y.onClick,
|
|
57
57
|
onHover: y.onHover,
|
|
58
58
|
seriesGroup: C.series,
|
|
59
|
-
svg:
|
|
59
|
+
svg: c.svg,
|
|
60
60
|
tooltip: T,
|
|
61
61
|
tooltipFormat: typeof y.tooltip == "object" ? y.tooltip : void 0
|
|
62
62
|
});
|
|
@@ -64,7 +64,6 @@ function createScatterChart(v, y) {
|
|
|
64
64
|
S = e;
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
|
-
//#endregion
|
|
68
67
|
export { createScatterChart };
|
|
69
68
|
|
|
70
69
|
//# sourceMappingURL=scatter-chart.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_dev.cjs");const e=require("../../
|
|
1
|
+
require("../../_dev.cjs");const e=require("../../animation/easing.cjs"),t=require("../../animation/motion.cjs"),n=require("../../animation/transition.cjs"),r=require("../../animation/tween.cjs"),i=require("../../svg/element.cjs");var a=400,o=new WeakMap,s=new WeakMap;function computeScatterPoints(e,t,n){return e.some(e=>e.key==null)||e.some(e=>typeof e.key==`string`),e.map(e=>({x:t.map(e.key),y:n.map(e.value)}))}function renderScatterPoints(c,l,u){let d=t.resolveMotion(u.transition),f=u.marks??[],p=u.pointRadius;for(o.get(c)?.(),o.delete(c);c.children.length>l.length;)c.lastChild.remove();let m=s.get(c)??[],h=[],g=l.map((e,t)=>{let n=c.children[t];return n?h.push(Number(n.getAttribute(`r`))||0):(n=i.createSvgElement(`circle`,{class:`prism-scatter-point`}),c.appendChild(n),h.push(0)),i.setAttributes(n,{fill:u.color,opacity:f[t]?.opacity}),n}),paint=(e,t)=>{for(let[n,r]of g.entries())i.setAttributes(r,{cx:e[n].x,cy:e[n].y,r:t(n)});s.set(c,e)};if(d.duration===0){paint(l,()=>p);return}let _=l.map((e,t)=>m[t]??e),v=l.map((e,t)=>t).filter(e=>e>=m.length),y=new Map([...v].sort((e,t)=>l[e].x-l[t].x).map((e,t)=>[e,t])),b=Math.min(d.stagger,a/Math.max(1,v.length)),paintFrame=e=>{let t=l.map((t,n)=>e(y.get(n)??0));paint(l.map((e,n)=>({x:r.tweenNumber(_[n].x,e.x,t[n]),y:r.tweenNumber(_[n].y,e.y,t[n])})),e=>r.tweenNumber(h[e],p,t[e]))};paintFrame(()=>0),o.set(c,n.startTween({count:Math.max(1,v.length),duration:d.duration,easing:e.resolveEasing(d.easing),onComplete:()=>{o.delete(c),paint(l,()=>p)},onFrame:paintFrame,signal:u.disposalSignal,stagger:b}))}exports.computeScatterPoints=computeScatterPoints,exports.renderScatterPoints=renderScatterPoints;
|
|
2
2
|
//# sourceMappingURL=scatter-renderer.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scatter-renderer.cjs","names":["resolveMotion","createSvgElement","tweenNumber","startTween","resolveEasing","
|
|
1
|
+
{"version":3,"file":"scatter-renderer.cjs","names":["resolveMotion","createSvgElement","tweenNumber","startTween","resolveEasing","require_easing","require_motion","require_transition","require_tween","require_element","MAX_STAGGER_TOTAL","activeAnimations","drawnPoints","data","d","xScale","yScale","motion","options","marks","radius","parent","points","drawn","fromRadius","circles","circle","i","pts","radii","fromPts","to","entering","lanes","a","b","pointIndex","lane","stagger","eased","progress"],"sources":["../../../src/charts/scatter/scatter-renderer.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport type { DatumMark } from '../../core/datum-style';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionOption } from '../../types';\n\nexport interface ScatterRenderOptions {\n color: string;\n /** Aborted when the owning chart is disposed: stops the transition's `requestAnimationFrame` loop from rescheduling. */\n disposalSignal?: AbortSignal;\n /** Per-datum presentation parallel to `points`; only `opacity` applies to a scatter marker. */\n marks?: readonly DatumMark[];\n pointRadius: number;\n transition?: TransitionOption;\n}\n\n/** Upper bound on the total staggered delay entering points may add, whatever the per-point value. */\nconst MAX_STAGGER_TOTAL = 400;\n\nconst activeAnimations = new WeakMap<SVGGElement, () => void>();\n// Point positions currently on screen, so an update slides from them even mid-tween.\nconst drawnPoints = new WeakMap<SVGGElement, Point[]>();\n\n/**\n * Maps scatter data to plot-area points: `key` is the x position, `value` the y.\n * A string key is a data error here, not a band position.\n */\nexport function computeScatterPoints(\n data: ContinuousDatum[],\n xScale: Scale<Date | number>,\n yScale: Scale<number>,\n): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computeScatterPoints: datum.key is null or undefined: data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n } else if (data.some((d) => typeof d.key === 'string')) {\n warn('computeScatterPoints: string keys are not supported: scatter x values must be numbers or Dates.');\n }\n\n return data.map((d) => ({\n x: xScale.map(d.key as Date | number),\n y: yScale.map(d.value),\n }));\n}\n\n/**\n * Draws one scatter series as point markers. Entering points grow from radius 0 at\n * their final position (staggered in x order when `stagger` is set); existing points\n * slide from their drawn position. Disabled or reduced motion paints synchronously.\n */\nexport function renderScatterPoints(parent: SVGGElement, points: Point[], options: ScatterRenderOptions): void {\n const motion = resolveMotion(options.transition);\n const marks = options.marks ?? [];\n const radius = options.pointRadius;\n\n activeAnimations.get(parent)?.();\n activeAnimations.delete(parent);\n\n while (parent.children.length > points.length) parent.lastChild!.remove();\n\n const drawn = drawnPoints.get(parent) ?? [];\n const fromRadius: number[] = [];\n const circles = points.map((_, i) => {\n let circle = parent.children[i] as SVGCircleElement | undefined;\n\n if (circle) {\n fromRadius.push(Number(circle.getAttribute('r')) || 0);\n } else {\n circle = createSvgElement('circle', { class: 'prism-scatter-point' });\n parent.appendChild(circle);\n fromRadius.push(0);\n }\n\n setAttributes(circle, { fill: options.color, opacity: marks[i]?.opacity });\n\n return circle;\n });\n\n const paint = (pts: Point[], radii: (i: number) => number): void => {\n for (const [i, circle] of circles.entries()) setAttributes(circle, { cx: pts[i].x, cy: pts[i].y, r: radii(i) });\n\n drawnPoints.set(parent, pts);\n };\n\n if (motion.duration === 0) {\n paint(points, () => radius);\n\n return;\n }\n\n const fromPts = points.map((to, i) => drawn[i] ?? to);\n // Entering points (no drawn marker yet) take their own stagger lane in x order;\n // moving points all share lane 0 so an update never crawls.\n const entering = points.map((_, i) => i).filter((i) => i >= drawn.length);\n const lanes = new Map(\n [...entering].sort((a, b) => points[a].x - points[b].x).map((pointIndex, lane) => [pointIndex, lane]),\n );\n const stagger = Math.min(motion.stagger, MAX_STAGGER_TOTAL / Math.max(1, entering.length));\n\n const paintFrame = (progress: (lane: number) => number): void => {\n const eased = points.map((_, i) => progress(lanes.get(i) ?? 0));\n\n paint(\n points.map((to, i) => ({\n x: tweenNumber(fromPts[i].x, to.x, eased[i]),\n y: tweenNumber(fromPts[i].y, to.y, eased[i]),\n })),\n (i) => tweenNumber(fromRadius[i], radius, eased[i]),\n );\n };\n\n // The starting state goes on screen immediately: `startTween` only paints on\n // the first frame callback, which would otherwise leave one stale frame.\n paintFrame(() => 0);\n\n activeAnimations.set(\n parent,\n startTween({\n count: Math.max(1, entering.length),\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: () => {\n activeAnimations.delete(parent);\n paint(points, () => radius);\n },\n onFrame: paintFrame,\n signal: options.disposalSignal,\n stagger,\n }),\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import "../../_dev.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { tweenNumber as
|
|
6
|
-
import {
|
|
7
|
-
|
|
2
|
+
import { resolveEasing as e } from "../../animation/easing.js";
|
|
3
|
+
import { resolveMotion as t } from "../../animation/motion.js";
|
|
4
|
+
import { startTween as n } from "../../animation/transition.js";
|
|
5
|
+
import { tweenNumber as r } from "../../animation/tween.js";
|
|
6
|
+
import { createSvgElement as i, setAttributes as a } from "../../svg/element.js";
|
|
7
|
+
// src/charts/scatter/scatter-renderer.ts
|
|
8
8
|
var o = 400, s = /* @__PURE__ */ new WeakMap(), c = /* @__PURE__ */ new WeakMap();
|
|
9
9
|
function computeScatterPoints(e, t, n) {
|
|
10
10
|
return e.some((e) => e.key == null) || e.some((e) => typeof e.key == "string"), e.map((e) => ({
|
|
@@ -13,19 +13,19 @@ function computeScatterPoints(e, t, n) {
|
|
|
13
13
|
}));
|
|
14
14
|
}
|
|
15
15
|
function renderScatterPoints(l, u, d) {
|
|
16
|
-
let f =
|
|
16
|
+
let f = t(d.transition), p = d.marks ?? [], m = d.pointRadius;
|
|
17
17
|
for (s.get(l)?.(), s.delete(l); l.children.length > u.length;) l.lastChild.remove();
|
|
18
|
-
let h = c.get(l) ?? [], g = [], _ = u.map((
|
|
19
|
-
let
|
|
20
|
-
return
|
|
18
|
+
let h = c.get(l) ?? [], g = [], _ = u.map((e, t) => {
|
|
19
|
+
let n = l.children[t];
|
|
20
|
+
return n ? g.push(Number(n.getAttribute("r")) || 0) : (n = i("circle", { class: "prism-scatter-point" }), l.appendChild(n), g.push(0)), a(n, {
|
|
21
21
|
fill: d.color,
|
|
22
|
-
opacity: p[
|
|
23
|
-
}),
|
|
24
|
-
}), paint = (e,
|
|
25
|
-
for (let [
|
|
26
|
-
cx: e[
|
|
27
|
-
cy: e[
|
|
28
|
-
r: n
|
|
22
|
+
opacity: p[t]?.opacity
|
|
23
|
+
}), n;
|
|
24
|
+
}), paint = (e, t) => {
|
|
25
|
+
for (let [n, r] of _.entries()) a(r, {
|
|
26
|
+
cx: e[n].x,
|
|
27
|
+
cy: e[n].y,
|
|
28
|
+
r: t(n)
|
|
29
29
|
});
|
|
30
30
|
c.set(l, e);
|
|
31
31
|
};
|
|
@@ -36,14 +36,14 @@ function renderScatterPoints(l, u, d) {
|
|
|
36
36
|
let v = u.map((e, t) => h[t] ?? e), y = u.map((e, t) => t).filter((e) => e >= h.length), b = new Map([...y].sort((e, t) => u[e].x - u[t].x).map((e, t) => [e, t])), x = Math.min(f.stagger, o / Math.max(1, y.length)), paintFrame = (e) => {
|
|
37
37
|
let t = u.map((t, n) => e(b.get(n) ?? 0));
|
|
38
38
|
paint(u.map((e, n) => ({
|
|
39
|
-
x:
|
|
40
|
-
y:
|
|
41
|
-
})), (e) =>
|
|
39
|
+
x: r(v[n].x, e.x, t[n]),
|
|
40
|
+
y: r(v[n].y, e.y, t[n])
|
|
41
|
+
})), (e) => r(g[e], m, t[e]));
|
|
42
42
|
};
|
|
43
|
-
paintFrame(() => 0), s.set(l,
|
|
43
|
+
paintFrame(() => 0), s.set(l, n({
|
|
44
44
|
count: Math.max(1, y.length),
|
|
45
45
|
duration: f.duration,
|
|
46
|
-
easing:
|
|
46
|
+
easing: e(f.easing),
|
|
47
47
|
onComplete: () => {
|
|
48
48
|
s.delete(l), paint(u, () => m);
|
|
49
49
|
},
|
|
@@ -52,7 +52,6 @@ function renderScatterPoints(l, u, d) {
|
|
|
52
52
|
stagger: x
|
|
53
53
|
}));
|
|
54
54
|
}
|
|
55
|
-
//#endregion
|
|
56
55
|
export { computeScatterPoints, renderScatterPoints };
|
|
57
56
|
|
|
58
57
|
//# sourceMappingURL=scatter-renderer.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_dev.cjs");const e=require("../../
|
|
1
|
+
require("../../_dev.cjs");const e=require("../../_tappers.cjs"),t=require("../../animation/easing.cjs"),n=require("../../animation/motion.cjs"),r=require("../../animation/transition.cjs"),i=require("../../animation/tween.cjs"),a=require("../../core/chart-base.cjs"),o=require("../../core/ids.cjs"),s=require("../../errors.cjs"),c=require("../../svg/element.cjs"),l=require("../../svg/path.cjs");var u=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 l.areaPath(e,r,n??`linear`)}function buildPathFromPoints(e,t){return e.length===0?``:t===`monotone`?l.monotonePath(e):t===`step`?l.stepPath(e):l.linePath(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(l,d){let f=d.variant??`line`,p=d.color??`var(--prism-color-1)`,m=d.curve??`linear`,h=d.strokeWidth??1.5,g=d.fillOpacity,_=d.showEndPoint??!0,v=o.uniqueId(`prism-spark-fill`),y=e.createTappers(),b=n.resolveMotion(d.transition),x=t.resolveEasing(b.easing),S=d.data,C=null,w=null,T=a.createChartBase(l,{a11y:d.a11y,margin:{bottom:0,left:0,right:0,top:0}},()=>{y.emit({height:T.dimensions.height,type:`resize`,width:T.dimensions.width}),renderAll()}),{svg:E}=T;E.classList.add(`prism-sparkline`);let D=c.createSvgElement(`g`,{class:`prism-spark-inner`});E.appendChild(D);let cleanupInteraction;function plotArea(){let{height:e,width:t}=T.dimensions,n=f===`line`||f===`area`?u:0;return{h:Math.max(1,e-n*2),inset:n,w:Math.max(1,t-n*2)}}function animateValues(e,t,n){w?.();let a=C?.length===e.length?C:e.map(()=>t);a.every((t,n)=>t===e[n])||b.duration===0?(C=e,n(e)):(w=r.startTween({count:1,duration:b.duration,easing:x,onFrame:t=>{let r=t(0),o=e.map((e,t)=>i.tweenNumber(a[t],e,r));C=o,n(o)},signal:O.signal}),C=a,n(a))}function renderAll(){let{height:e,width:t}=T.dimensions,n=plotArea();for(;D.firstChild;)D.removeChild(D.firstChild);if(D.setAttribute(`transform`,`translate(${n.inset},${n.inset})`),S.length===0)C=null;else{if(!isStackData(S)&&S.some(e=>!Number.isFinite(e)),f===`stack`&&isStackData(S)){let n=c.createSvgElement(`g`,{class:`prism-spark-stack`});D.appendChild(n);let r=d.cornerRadius??4,i=S,a=i.reduce((e,t)=>e+Math.max(0,t.value),0),o=i.map((e,t)=>{let r=c.createSvgElement(`path`,{class:`prism-spark-stack-segment`});return c.setAttributes(r,{fill:e.color??defaultStackColor(t)}),n.appendChild(r),r});a>0?animateValues(i.map(e=>Math.max(0,e.value)),0,n=>{let i=n.reduce((e,t)=>e+t,0)||1,a=(d.padPixels??0)/2,s=0;n.forEach((c,l)=>{let u=Math.round(s);s+=c/i*t;let d=l===n.length-1?t:Math.round(s),f=l===0,p=l===n.length-1,m=u+(f?0:a),h=Math.max(0,d-u-(f?0:a)-(p?0:a));o[l]?.setAttribute(`d`,buildRoundedStackRect(m,0,h,e,r,f,p))})}):(w?.(),C=null)}else if(f===`bar`){let n=c.createSvgElement(`g`,{class:`prism-spark-bars`});D.appendChild(n);let r=S,i=Math.min(0,...r),a=Math.max(...r)-i||1,o=Math.max(1,t/r.length-1),s=t/r.length,l=r.map(()=>{let e=c.createSvgElement(`rect`,{class:`prism-spark-bar`,fill:p});return n.appendChild(e),e});animateValues(r,i,t=>{for(let[n,r]of l.entries()){let l=Math.max(1,(t[n]-i)/a*e);c.setAttributes(r,{height:l,width:o,x:n*s,y:e-l})}})}else{let e=S,t=Math.min(...e),r=Math.max(...e)-t||1,i=n.w/Math.max(1,e.length-1),pointsFromValues=e=>e.map((e,a)=>({x:a*i,y:n.h-(e-t)/r*n.h})),a=null;if(f===`area`){let e=c.createSvgElement(`defs`),t=c.createSvgElement(`linearGradient`,{id:v,x1:0,x2:0,y1:0,y2:1});for(let[e,n]of[[0,`prism-spark-stop-top`],[1,`prism-spark-stop-bottom`]]){let r=c.createSvgElement(`stop`,{class:n,offset:e,"stop-color":p});r.style.stopColor=p,t.appendChild(r)}e.appendChild(t),D.appendChild(e),a=c.createSvgElement(`path`,{class:`prism-spark-fill`}),c.setAttributes(a,{fill:`url(#${v})`,stroke:`none`}),a.style.fillOpacity=g===void 0?``:String(g),D.appendChild(a)}let o=c.createSvgElement(`path`,{class:`prism-spark-line`});c.setAttributes(o,{fill:`none`,stroke:p,"stroke-width":h}),D.appendChild(o);let s=_&&e.length>0?c.createSvgElement(`circle`,{class:`prism-spark-end`,fill:p,r:2.5}):null;s&&D.appendChild(s),animateValues(e,t,e=>{let t=pointsFromValues(e);c.setAttributes(o,{d:buildPathFromPoints(t,m)}),a&&c.setAttributes(a,{d:buildAreaPathFromPoints(t,n.h,m)});let r=t.at(-1);s&&r&&c.setAttributes(s,{cx:r.x,cy:r.y})})}isStackData(S)||attachInteraction(S)}}function attachInteraction(e){if(cleanupInteraction?.(),cleanupInteraction=void 0,!d.onHover&&!d.onClick||e.length<=1)return;let{h:t,inset:n,w:r}=plotArea();E.style.cursor=`crosshair`;let i=r/(e.length-1),a=f===`bar`?[]:buildTopPoints(e,r,t),o=c.createSvgElement(`circle`,{class:`prism-spark-marker`,fill:p,r:3.5}),indexAt=t=>Math.max(0,Math.min(e.length-1,Math.round((t-E.getBoundingClientRect().left-n)/i)));o.style.display=`none`,D.appendChild(o);let handleMove=t=>{let n=indexAt(t.clientX),r=a[n];r&&(c.setAttributes(o,{cx:r.x,cy:r.y}),o.style.display=``),d.onHover?.({index:n,originalEvent:t,value:e[n]})},handleLeave=()=>{o.style.display=`none`,d.onHover?.(null)},handleClick=t=>{if(!d.onClick)return;let n=indexAt(t.clientX);d.onClick({index:n,originalEvent:t,value:e[n]})};E.addEventListener(`mousemove`,handleMove),E.addEventListener(`mouseleave`,handleLeave),E.addEventListener(`click`,handleClick),cleanupInteraction=()=>{E.removeEventListener(`mousemove`,handleMove),E.removeEventListener(`mouseleave`,handleLeave),E.removeEventListener(`click`,handleClick)}}let O=new AbortController,k=!1;try{return renderAll(),{get disposalSignal(){return O.signal},dispose(){k||(k=!0,y.emit({type:`dispose`}),y.stop(),O.abort(),cleanupInteraction?.(),T.dispose())},get disposed(){return k},el:E,tap:y.tap,update(e){if(k)throw new s.PrismRenderError(`Cannot update a disposed chart.`);S=e,renderAll()},[Symbol.dispose](){this.dispose()}}}catch(e){throw O.abort(),cleanupInteraction?.(),T.dispose(),e instanceof s.PrismRenderError?e:new s.PrismRenderError(`Failed to render chart.`,{cause:e})}}exports.createSparkline=createSparkline;
|
|
2
2
|
//# sourceMappingURL=sparkline.cjs.map
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"sparkline.cjs","names":["areaPath","monotonePath","stepPath","linePath","uniqueId","createTappers","resolveMotion","resolveEasing","createChartBase","createSvgElement","startTween","tweenNumber","PrismRenderError","require__tappers","require_easing","require_motion","require_transition","require_tween","require_chart_base","require_ids","require_errors","require_element","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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"}
|