@vielzeug/prism 26.11.4 → 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,15 +1,15 @@
|
|
|
1
1
|
import "../../_dev.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
2
|
+
import { createTappers as e } from "../../_tappers.js";
|
|
3
|
+
import { resolveEasing as t } from "../../animation/easing.js";
|
|
4
|
+
import { resolveMotion as n } from "../../animation/motion.js";
|
|
5
|
+
import { startTween as r } from "../../animation/transition.js";
|
|
6
|
+
import { tweenNumber as i } from "../../animation/tween.js";
|
|
7
|
+
import { createChartBase as a } from "../../core/chart-base.js";
|
|
8
|
+
import { uniqueId as o } from "../../core/ids.js";
|
|
9
|
+
import { PrismRenderError as s } from "../../errors.js";
|
|
10
|
+
import { createSvgElement as c, setAttributes as l } from "../../svg/element.js";
|
|
11
11
|
import { areaPath as u, linePath as d, monotonePath as f, stepPath as p } from "../../svg/path.js";
|
|
12
|
-
|
|
12
|
+
// src/charts/sparkline/sparkline.ts
|
|
13
13
|
var m = 5;
|
|
14
14
|
function buildTopPoints(e, t, n) {
|
|
15
15
|
if (e.length === 0) return [];
|
|
@@ -52,7 +52,7 @@ function defaultStackColor(e) {
|
|
|
52
52
|
return `var(--prism-color-${e % 8 + 1})`;
|
|
53
53
|
}
|
|
54
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 =
|
|
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 = o("prism-spark-fill"), b = e(), x = n(d.transition), S = t(x.easing), C = d.data, w = null, T = null, E = a(u, {
|
|
56
56
|
a11y: d.a11y,
|
|
57
57
|
margin: {
|
|
58
58
|
bottom: 0,
|
|
@@ -68,7 +68,7 @@ function createSparkline(u, d) {
|
|
|
68
68
|
}), renderAll();
|
|
69
69
|
}), { svg: D } = E;
|
|
70
70
|
D.classList.add("prism-sparkline");
|
|
71
|
-
let O =
|
|
71
|
+
let O = c("g", { class: "prism-spark-inner" });
|
|
72
72
|
D.appendChild(O);
|
|
73
73
|
let cleanupInteraction;
|
|
74
74
|
function plotArea() {
|
|
@@ -81,102 +81,102 @@ function createSparkline(u, d) {
|
|
|
81
81
|
}
|
|
82
82
|
function animateValues(e, t, n) {
|
|
83
83
|
T?.();
|
|
84
|
-
let
|
|
85
|
-
|
|
84
|
+
let a = w?.length === e.length ? w : e.map(() => t);
|
|
85
|
+
a.every((t, n) => t === e[n]) || x.duration === 0 ? (w = e, n(e)) : (T = r({
|
|
86
86
|
count: 1,
|
|
87
87
|
duration: x.duration,
|
|
88
88
|
easing: S,
|
|
89
89
|
onFrame: (t) => {
|
|
90
|
-
let
|
|
91
|
-
w =
|
|
90
|
+
let r = t(0), o = e.map((e, t) => i(a[t], e, r));
|
|
91
|
+
w = o, n(o);
|
|
92
92
|
},
|
|
93
93
|
signal: k.signal
|
|
94
|
-
}), w =
|
|
94
|
+
}), w = a, n(a));
|
|
95
95
|
}
|
|
96
96
|
function renderAll() {
|
|
97
|
-
let { height:
|
|
97
|
+
let { height: e, width: t } = E.dimensions, n = plotArea();
|
|
98
98
|
for (; O.firstChild;) O.removeChild(O.firstChild);
|
|
99
|
-
if (O.setAttribute("transform", `translate(${
|
|
99
|
+
if (O.setAttribute("transform", `translate(${n.inset},${n.inset})`), C.length === 0) w = null;
|
|
100
100
|
else {
|
|
101
101
|
if (!isStackData(C) && C.some((e) => !Number.isFinite(e)), f === "stack" && isStackData(C)) {
|
|
102
|
-
let
|
|
103
|
-
O.appendChild(
|
|
104
|
-
let
|
|
105
|
-
let
|
|
106
|
-
return
|
|
102
|
+
let n = c("g", { class: "prism-spark-stack" });
|
|
103
|
+
O.appendChild(n);
|
|
104
|
+
let r = d.cornerRadius ?? 4, i = C, a = i.reduce((e, t) => e + Math.max(0, t.value), 0), o = i.map((e, t) => {
|
|
105
|
+
let r = c("path", { class: "prism-spark-stack-segment" });
|
|
106
|
+
return l(r, { fill: e.color ?? defaultStackColor(t) }), n.appendChild(r), r;
|
|
107
107
|
});
|
|
108
|
-
|
|
109
|
-
let
|
|
110
|
-
|
|
111
|
-
let u = Math.round(
|
|
112
|
-
|
|
113
|
-
let d = l ===
|
|
114
|
-
|
|
108
|
+
a > 0 ? animateValues(i.map((e) => Math.max(0, e.value)), 0, (n) => {
|
|
109
|
+
let i = n.reduce((e, t) => e + t, 0) || 1, a = (d.padPixels ?? 0) / 2, s = 0;
|
|
110
|
+
n.forEach((c, l) => {
|
|
111
|
+
let u = Math.round(s);
|
|
112
|
+
s += c / i * t;
|
|
113
|
+
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));
|
|
114
|
+
o[l]?.setAttribute("d", buildRoundedStackRect(m, 0, h, e, r, f, p));
|
|
115
115
|
});
|
|
116
116
|
}) : (T?.(), w = null);
|
|
117
117
|
} else if (f === "bar") {
|
|
118
|
-
let
|
|
119
|
-
O.appendChild(
|
|
120
|
-
let
|
|
121
|
-
let
|
|
118
|
+
let n = c("g", { class: "prism-spark-bars" });
|
|
119
|
+
O.appendChild(n);
|
|
120
|
+
let r = C, i = Math.min(0, ...r), a = Math.max(...r) - i || 1, o = Math.max(1, t / r.length - 1), s = t / r.length, u = r.map(() => {
|
|
121
|
+
let e = c("rect", {
|
|
122
122
|
class: "prism-spark-bar",
|
|
123
123
|
fill: p
|
|
124
124
|
});
|
|
125
|
-
return
|
|
125
|
+
return n.appendChild(e), e;
|
|
126
126
|
});
|
|
127
|
-
animateValues(
|
|
128
|
-
for (let [
|
|
129
|
-
let
|
|
130
|
-
|
|
131
|
-
height:
|
|
132
|
-
width:
|
|
133
|
-
x:
|
|
134
|
-
y:
|
|
127
|
+
animateValues(r, i, (t) => {
|
|
128
|
+
for (let [n, r] of u.entries()) {
|
|
129
|
+
let c = Math.max(1, (t[n] - i) / a * e);
|
|
130
|
+
l(r, {
|
|
131
|
+
height: c,
|
|
132
|
+
width: o,
|
|
133
|
+
x: n * s,
|
|
134
|
+
y: e - c
|
|
135
135
|
});
|
|
136
136
|
}
|
|
137
137
|
});
|
|
138
138
|
} else {
|
|
139
|
-
let
|
|
140
|
-
x:
|
|
141
|
-
y:
|
|
142
|
-
})),
|
|
139
|
+
let e = C, 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) => ({
|
|
140
|
+
x: a * i,
|
|
141
|
+
y: n.h - (e - t) / r * n.h
|
|
142
|
+
})), a = null;
|
|
143
143
|
if (f === "area") {
|
|
144
|
-
let
|
|
144
|
+
let e = c("defs"), t = c("linearGradient", {
|
|
145
145
|
id: y,
|
|
146
146
|
x1: 0,
|
|
147
147
|
x2: 0,
|
|
148
148
|
y1: 0,
|
|
149
149
|
y2: 1
|
|
150
150
|
});
|
|
151
|
-
for (let [
|
|
152
|
-
let
|
|
151
|
+
for (let [e, n] of [[0, "prism-spark-stop-top"], [1, "prism-spark-stop-bottom"]]) {
|
|
152
|
+
let r = c("stop", {
|
|
153
153
|
class: n,
|
|
154
|
-
offset:
|
|
154
|
+
offset: e,
|
|
155
155
|
"stop-color": p
|
|
156
156
|
});
|
|
157
|
-
|
|
157
|
+
r.style.stopColor = p, t.appendChild(r);
|
|
158
158
|
}
|
|
159
|
-
|
|
159
|
+
e.appendChild(t), O.appendChild(e), a = c("path", { class: "prism-spark-fill" }), l(a, {
|
|
160
160
|
fill: `url(#${y})`,
|
|
161
161
|
stroke: "none"
|
|
162
|
-
}),
|
|
162
|
+
}), a.style.fillOpacity = _ === void 0 ? "" : String(_), O.appendChild(a);
|
|
163
163
|
}
|
|
164
|
-
let
|
|
165
|
-
|
|
164
|
+
let o = c("path", { class: "prism-spark-line" });
|
|
165
|
+
l(o, {
|
|
166
166
|
fill: "none",
|
|
167
167
|
stroke: p,
|
|
168
168
|
"stroke-width": g
|
|
169
|
-
}), O.appendChild(
|
|
170
|
-
let
|
|
169
|
+
}), O.appendChild(o);
|
|
170
|
+
let s = v && e.length > 0 ? c("circle", {
|
|
171
171
|
class: "prism-spark-end",
|
|
172
172
|
fill: p,
|
|
173
173
|
r: 2.5
|
|
174
174
|
}) : null;
|
|
175
|
-
|
|
176
|
-
let
|
|
177
|
-
|
|
178
|
-
let r =
|
|
179
|
-
|
|
175
|
+
s && O.appendChild(s), animateValues(e, t, (e) => {
|
|
176
|
+
let t = pointsFromValues(e);
|
|
177
|
+
l(o, { d: buildPathFromPoints(t, h) }), a && l(a, { d: buildAreaPathFromPoints(t, n.h, h) });
|
|
178
|
+
let r = t.at(-1);
|
|
179
|
+
s && r && l(s, {
|
|
180
180
|
cx: r.x,
|
|
181
181
|
cy: r.y
|
|
182
182
|
});
|
|
@@ -185,35 +185,35 @@ function createSparkline(u, d) {
|
|
|
185
185
|
isStackData(C) || attachInteraction(C);
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
|
-
function attachInteraction(
|
|
189
|
-
if (cleanupInteraction?.(), cleanupInteraction = void 0, !d.onHover && !d.onClick ||
|
|
190
|
-
let { h:
|
|
188
|
+
function attachInteraction(e) {
|
|
189
|
+
if (cleanupInteraction?.(), cleanupInteraction = void 0, !d.onHover && !d.onClick || e.length <= 1) return;
|
|
190
|
+
let { h: t, inset: n, w: r } = plotArea();
|
|
191
191
|
D.style.cursor = "crosshair";
|
|
192
|
-
let
|
|
192
|
+
let i = r / (e.length - 1), a = f === "bar" ? [] : buildTopPoints(e, r, t), o = c("circle", {
|
|
193
193
|
class: "prism-spark-marker",
|
|
194
194
|
fill: p,
|
|
195
195
|
r: 3.5
|
|
196
|
-
}), indexAt = (
|
|
197
|
-
|
|
198
|
-
let handleMove = (
|
|
199
|
-
let
|
|
200
|
-
|
|
201
|
-
cx:
|
|
202
|
-
cy:
|
|
203
|
-
}),
|
|
204
|
-
index:
|
|
205
|
-
originalEvent:
|
|
206
|
-
value: n
|
|
196
|
+
}), indexAt = (t) => Math.max(0, Math.min(e.length - 1, Math.round((t - D.getBoundingClientRect().left - n) / i)));
|
|
197
|
+
o.style.display = "none", O.appendChild(o);
|
|
198
|
+
let handleMove = (t) => {
|
|
199
|
+
let n = indexAt(t.clientX), r = a[n];
|
|
200
|
+
r && (l(o, {
|
|
201
|
+
cx: r.x,
|
|
202
|
+
cy: r.y
|
|
203
|
+
}), o.style.display = ""), d.onHover?.({
|
|
204
|
+
index: n,
|
|
205
|
+
originalEvent: t,
|
|
206
|
+
value: e[n]
|
|
207
207
|
});
|
|
208
208
|
}, handleLeave = () => {
|
|
209
|
-
|
|
210
|
-
}, handleClick = (
|
|
209
|
+
o.style.display = "none", d.onHover?.(null);
|
|
210
|
+
}, handleClick = (t) => {
|
|
211
211
|
if (!d.onClick) return;
|
|
212
|
-
let
|
|
212
|
+
let n = indexAt(t.clientX);
|
|
213
213
|
d.onClick({
|
|
214
|
-
index:
|
|
215
|
-
originalEvent:
|
|
216
|
-
value: n
|
|
214
|
+
index: n,
|
|
215
|
+
originalEvent: t,
|
|
216
|
+
value: e[n]
|
|
217
217
|
});
|
|
218
218
|
};
|
|
219
219
|
D.addEventListener("mousemove", handleMove), D.addEventListener("mouseleave", handleLeave), D.addEventListener("click", handleClick), cleanupInteraction = () => {
|
|
@@ -235,7 +235,7 @@ function createSparkline(u, d) {
|
|
|
235
235
|
el: D,
|
|
236
236
|
tap: b.tap,
|
|
237
237
|
update(e) {
|
|
238
|
-
if (A) throw new
|
|
238
|
+
if (A) throw new s("Cannot update a disposed chart.");
|
|
239
239
|
C = e, renderAll();
|
|
240
240
|
},
|
|
241
241
|
[Symbol.dispose]() {
|
|
@@ -243,10 +243,9 @@ function createSparkline(u, d) {
|
|
|
243
243
|
}
|
|
244
244
|
};
|
|
245
245
|
} catch (e) {
|
|
246
|
-
throw k.abort(), cleanupInteraction?.(), E.dispose(), e instanceof
|
|
246
|
+
throw k.abort(), cleanupInteraction?.(), E.dispose(), e instanceof s ? e : new s("Failed to render chart.", { cause: e });
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
|
-
//#endregion
|
|
250
249
|
export { createSparkline };
|
|
251
250
|
|
|
252
251
|
//# sourceMappingURL=sparkline.js.map
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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":";;;;;;;;;;;;AAeA,IAAMA,IAAa;AAEnB,SAAS,eAAe,GAAgB,GAAe,GAAyB;CAC9E,IAAIC,EAAK,WAAW,GAAG,OAAO,CAAC;CAE/B,IAAMC,IAAQC,IAAQ,KAAK,IAAI,GAAGF,EAAK,SAAS,CAAC,GAC3CG,IAAM,KAAK,IAAI,GAAGH,CAAI,GAEtBI,IADM,KAAK,IAAI,GAAGJ,CACT,IAAMG,KAAO;CAE5B,OAAOH,EAAK,KAAK,GAAG,OAAO;EACzB,GAAGK,IAAIJ;EACP,GAAGK,KAAWC,IAAIJ,KAAOC,IAAUE;CACrC,EAAE;AACJ;AAEA,SAAS,wBAAwB,GAAc,GAAgB,GAAyC;CACtG,IAAIE,EAAI,WAAW,GAAG,OAAO;CAE7B,IAAMC,IAASD,EAAI,KAAK,OAAO;EAAE,GAAGE,EAAE;EAAG,GAAGJ;CAAO,EAAE;CAErD,OAAOK,EAASH,GAAKC,GAAQG,KAAS,QAAQ;AAChD;AAEA,SAAS,oBAAoB,GAAiB,GAAyC;CAGrF,OAFIC,EAAO,WAAW,IAAU,KAEzBD,MAAU,aAAaE,EAAaD,CAAM,IAAID,MAAU,SAASG,EAASF,CAAM,IAAIG,EAASH,CAAM;AAC5G;AAEA,SAAS,YAAY,GAAyD;CAC5E,OAAOb,EAAK,SAAS,KAAKA,EAAK,OAAO,QAAQ,OAAOA,EAAK,MAAO;AACnE;AAEA,SAAS,sBACP,GACA,GACA,GACA,GACA,GACA,GACA,GACQ;CACR,IAAMiB,IAAO,KAAK,IAAIC,GAAGC,IAAI,GAAGC,IAAI,CAAC,GAC/BC,IAAKC,IAAYL,IAAO,GACxBM,IAAKD,IAAYL,IAAO,GACxBO,IAAKC,IAAaR,IAAO,GACzBS,IAAKD,IAAaR,IAAO;CAE/B,OAAO;EACL,IAAIU,IAAIN,EAAG,GAAGO;EACd,IAAID,IAAIR,IAAIK;EACZA,IAAK,IAAIG,IAAIR,EAAE,GAAGS,EAAE,GAAGD,IAAIR,EAAE,GAAGS,IAAIJ,MAAO;EAC3C,IAAII,IAAIR,IAAIM;EACZA,IAAK,IAAIC,IAAIR,EAAE,GAAGS,IAAIR,EAAE,GAAGO,IAAIR,IAAIO,EAAG,GAAGE,IAAIR,MAAM;EACnD,IAAIO,IAAIJ;EACRA,IAAK,IAAII,EAAE,GAAGC,IAAIR,EAAE,GAAGO,EAAE,GAAGC,IAAIR,IAAIG,MAAO;EAC3C,IAAIK,IAAIP;EACRA,IAAK,IAAIM,EAAE,GAAGC,EAAE,GAAGD,IAAIN,EAAG,GAAGO,MAAM;EACnC;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,EAAE;AACZ;AAEA,SAAS,kBAAkB,GAAmB;CAC5C,OAAO,qBAAsBvB,IAAI,IAAK,EAAE;AAC1C;AAEA,SAAgB,gBACd,GACA,GACwC;CACxC,IAAMwB,IAAUC,EAAO,WAAW,QAC5BC,IAAQD,EAAO,SAAS,wBACxBlB,IAAQkB,EAAO,SAAS,UACxBE,IAAcF,EAAO,eAAe,KACpCG,IAAcH,EAAO,aACrBI,IAAeJ,EAAO,gBAAgB,IACtCK,IAAaC,EAAS,kBAAkB,GACxCC,IAAUC,EAA0B,GACpCC,IAASC,EAAcV,EAAO,UAAU,GACxCW,IAASC,EAAcH,EAAO,MAAM,GACtCvC,IAAO8B,EAAO,MAGda,IAA+B,MAC/BC,IAAmC,MAEjCC,IAAOC,EACXC,GACA;EACE,MAAMjB,EAAO;EACb,QAAQ;GAAE,QAAQ;GAAG,MAAM;GAAG,OAAO;GAAG,KAAK;EAAE;CACjD,SACM;EAEJ,AADAO,EAAQ,KAAK;GAAE,QAAQQ,EAAK,WAAW;GAAQ,MAAM;GAAU,OAAOA,EAAK,WAAW;EAAM,CAAC,GAC7F,UAAU;CACZ,CACF,GAEM,EAAE,WAAQA;CAEhB,EAAI,UAAU,IAAI,iBAAiB;CAEnC,IAAMG,IAAaC,EAAiB,KAAK,EAAE,OAAO,oBAAoB,CAAC;CAEvE,EAAI,YAAYD,CAAU;CAE1B,IAAI;CAGJ,SAAS,WAAoD;EAC3D,IAAM,EAAE,WAAQ,aAAUH,EAAK,YACzBK,IAAQrB,MAAY,UAAUA,MAAY,SAAS9B,IAAa;EAEtE,OAAO;GAAE,GAAG,KAAK,IAAI,GAAGO,IAAS4C,IAAQ,CAAC;GAAG;GAAO,GAAG,KAAK,IAAI,GAAGhD,IAAQgD,IAAQ,CAAC;EAAE;CACxF;CAQA,SAAS,cAAc,GAAc,GAAoB,GAAyC;EAChG,IAAc;EAEd,IAAMC,IAAOR,GAAa,WAAWS,EAAG,SAAST,IAAcS,EAAG,UAAUC,CAAU;EAGtF,AAFkBF,EAAK,OAAO,GAAO,MAAMG,MAAUF,EAAG/C,EAEpD,KAAakC,EAAO,aAAa,KACnC,IAAca,GACdG,EAAMH,CAAE,MAKV,IAAcI,EAAW;GACvB,OAAO;GACP,UAAUjB,EAAO;GACjB;GACA,UAAU,MAAa;IACrB,IAAMkB,IAAIC,EAAS,CAAC,GACdC,IAASP,EAAG,KAAK,GAAO,MAAMQ,EAAYT,EAAK9C,IAAIiD,GAAOG,CAAC,CAAC;IAGlE,AADA,IAAcE,GACdJ,EAAMI,CAAM;GACd;GACA,QAAQE,EAAG;EACb,CAAC,GAGD,IAAcV,GACdI,EAAMJ,CAAI;CACZ;CAEA,SAAS,YAAkB;EACzB,IAAM,EAAE,QAAQ/B,GAAG,OAAOD,MAAM0B,EAAK,YAC/BiB,IAAO,SAAS;EAEtB,OAAOd,EAAW,aAAY,EAAW,YAAYA,EAAW,UAAU;EAI1E,IAFAA,EAAW,aAAa,aAAa,aAAac,EAAK,MAAM,GAAGA,EAAK,MAAM,EAAE,GAEzE9D,EAAK,WAAW,GAClB,IAAc;OAKhB;GAIA,IAJI,CAAC,YAAYA,CAAI,KAAKA,EAAK,MAAM,MAAM,CAAC,OAAO,SAASO,CAAC,CAAC,GAI1DsB,MAAY,WAAW,YAAY7B,CAAI,GAAG;IAC5C,IAAM+D,IAAad,EAAiB,KAAK,EAAE,OAAO,oBAAoB,CAAC;IAEvE,EAAW,YAAYc,CAAU;IAEjC,IAAMC,IAAelC,EAAO,gBAAgB,GACtCmC,IAAOjE,GACPkE,IAAQD,EAAK,QAAQ,GAAG,MAAME,IAAI,KAAK,IAAI,GAAGC,EAAE,KAAK,GAAG,CAAC,GACzDC,IAAQJ,EAAK,KAAK,GAAK,MAAM;KACjC,IAAMK,IAAOrB,EAAiB,QAAQ,EAAE,OAAO,4BAA4B,CAAC;KAK5E,OAHAsB,EAAcD,GAAM,EAAE,MAAME,EAAI,SAAS,kBAAkBnE,CAAC,EAAE,CAAC,GAC/D0D,EAAW,YAAYO,CAAI,GAEpBA;IACT,CAAC;IAED,AAAIJ,IAAQ,IACV,cACED,EAAK,KAAK,MAAQ,KAAK,IAAI,GAAGO,EAAI,KAAK,CAAC,GACxC,IACC,MAAW;KACV,IAAMC,IAAed,EAAO,QAAQ,GAAG,MAAMQ,IAAI5D,GAAG,CAAC,KAAK,GACpDmE,KAAQ5C,EAAO,aAAa,KAAK,GACnC6C,IAAO;KAEX,EAAO,SAAS,GAAO,MAAM;MAC3B,IAAMC,IAAS,KAAK,MAAMD,CAAI;MAE9B,KAASrB,IAAQmB,IAAgBtD;MAEjC,IAAM0D,IAAOxE,MAAMsD,EAAO,SAAS,IAAIxC,IAAI,KAAK,MAAMwD,CAAI,GACpDG,IAAUzE,MAAM,GAChB0E,IAAS1E,MAAMsD,EAAO,SAAS,GAC/BqB,IAAQJ,KAAUE,IAAU,IAAIJ,IAChCO,IAAQ,KAAK,IAAI,GAAGJ,IAAOD,KAAUE,IAAU,IAAIJ,MAASK,IAAS,IAAIL,EAAK;MAEpF,EAAMrE,EAAE,EAAE,aAAa,KAAK,sBAAsB2E,GAAO,GAAGC,GAAO7D,GAAG4C,GAAcc,GAASC,CAAM,CAAC;KACtG,CAAC;IACH,CACF,KAIAnC,IAAc,GACd,IAAc;GAElB,OAAO,IAAIf,MAAY,OAAO;IAC5B,IAAMqD,IAAYjC,EAAiB,KAAK,EAAE,OAAO,mBAAmB,CAAC;IAErE,EAAW,YAAYiC,CAAS;IAEhC,IAAMvB,IAAS3D,GACTmF,IAAS,KAAK,IAAI,GAAG,GAAGxB,CAAM,GAC9ByB,IAAW,KAAK,IAAI,GAAGzB,CAAM,IAAIwB,KAAU,GAC3CE,IAAO,KAAK,IAAI,GAAGlE,IAAIwC,EAAO,SAAS,CAAC,GACxC2B,IAAMnE,IAAIwC,EAAO,QACjB4B,IAAQ5B,EAAO,UAAU;KAC7B,IAAM6B,IAAOvC,EAAiB,QAAQ;MAAE,OAAO;MAAmB,MAAMlB;KAAM,CAAC;KAI/E,OAFAmD,EAAU,YAAYM,CAAI,GAEnBA;IACT,CAAC;IAED,cAAc7B,GAAQwB,IAAS,MAAU;KACvC,KAAK,IAAM,CAAC9E,GAAGmF,MAASD,EAAM,QAAQ,GAAG;MACvC,IAAME,IAAY,KAAK,IAAI,IAAKC,EAAMrF,KAAK8E,KAAUC,IAAYhE,CAAC;MAElE,EAAcoE,GAAM;OAAE,QAAQC;OAAW,OAAOJ;OAAM,GAAGhF,IAAIiF;OAAK,GAAGlE,IAAIqE;MAAU,CAAC;KACtF;IACF,CAAC;GACH,OAAO;IACL,IAAM9B,IAAS3D,GAGT2F,IAAU,KAAK,IAAI,GAAGhC,CAAM,GAC5BiC,IAAY,KAAK,IAAI,GAAGjC,CAAM,IAAIgC,KAAW,GAC7C1F,IAAQ6D,EAAK,IAAI,KAAK,IAAI,GAAGH,EAAO,SAAS,CAAC,GAC9C,oBAAoB,MACxB+B,EAAM,KAAK,GAAG,OAAO;KAAE,GAAGrF,IAAIJ;KAAO,GAAG6D,EAAK,KAAMvD,IAAIoF,KAAWC,IAAa9B,EAAK;IAAE,EAAE,GAEtF+B,IAA8B;IAElC,IAAIhE,MAAY,QAAQ;KACtB,IAAMiE,IAAO7C,EAAiB,MAAM,GAC9B8C,IAAW9C,EAAiB,kBAAkB;MAAE,IAAId;MAAY,IAAI;MAAG,IAAI;MAAG,IAAI;MAAG,IAAI;KAAE,CAAC;KAElG,KAAK,IAAM,CAAC6D,GAAQC,MAAc,CAChC,CAAC,GAAG,sBAAsB,GAC1B,CAAC,GAAG,yBAAyB,CAC/B,GAAY;MACV,IAAMC,IAAOjD,EAAiB,QAAQ;OAAE,OAAOgD;OAAW;OAAQ,cAAclE;MAAM,CAAC;MAGvF,AADA,EAAK,MAAM,YAAYA,GACvBgE,EAAS,YAAYG,CAAI;KAC3B;KASA,AAPAJ,EAAK,YAAYC,CAAQ,GACzB/C,EAAW,YAAY8C,CAAI,GAE3B,IAAO7C,EAAiB,QAAQ,EAAE,OAAO,mBAAmB,CAAC,GAE7DsB,EAAcsB,GAAM;MAAE,MAAM,QAAQ1D,EAAW;MAAI,QAAQ;KAAO,CAAC,GACnE,EAAK,MAAM,cAAcF,MAAgB,KAAA,IAAY,KAAK,OAAOA,CAAW,GAC5Ee,EAAW,YAAY6C,CAAI;IAC7B;IAEA,IAAMvB,IAAOrB,EAAiB,QAAQ,EAAE,OAAO,mBAAmB,CAAC;IAGnE,AADAsB,EAAcD,GAAM;KAAE,MAAM;KAAQ,QAAQvC;KAAO,gBAAgBC;IAAY,CAAC,GAChFgB,EAAW,YAAYsB,CAAI;IAE3B,IAAM6B,IACJjE,KAAgByB,EAAO,SAAS,IAC5BV,EAAiB,UAAU;KAAE,OAAO;KAAmB,MAAMlB;KAAO,GAAG;IAAI,CAAC,IAC5E;IAIN,AAFIoE,KAAQnD,EAAW,YAAYmD,CAAM,GAEzC,cAAcxC,GAAQgC,IAAU,MAAU;KACxC,IAAMnF,IAAM,iBAAiBkF,CAAK;KAIlC,AAFAnB,EAAcD,GAAM,EAAE,GAAG,oBAAoB9D,GAAKI,CAAK,EAAE,CAAC,GAEtDiF,KAAMtB,EAAcsB,GAAM,EAAE,GAAG,wBAAwBrF,GAAKsD,EAAK,GAAGlD,CAAK,EAAE,CAAC;KAEhF,IAAMwF,IAAM5F,EAAI,GAAG,EAAE;KAErB,AAAI2F,KAAUC,KAAK7B,EAAc4B,GAAQ;MAAE,IAAIC,EAAI;MAAG,IAAIA,EAAI;KAAE,CAAC;IACnE,CAAC;GACH;GAEA,AAAK,YAAYpG,CAAI,KAAG,kBAAkBA,CAAgB;EAxI+B;CAyI3F;CAEA,SAAS,kBAAkB,GAAsB;EAM/C,IALA,qBAAqB,GACrB,qBAAqB,KAAA,GAEjB,CAAC8B,EAAO,WAAW,CAACA,EAAO,WAE3B9B,EAAK,UAAU,GAAG;EAEtB,IAAM,EAAE,MAAG,UAAO,SAAM,SAAS;EAEjC,EAAI,MAAM,SAAS;EAEnB,IAAMC,IAAQkB,KAAKnB,EAAK,SAAS,IAC3Ba,IAASgB,MAAY,QAAQ,CAAC,IAAI,eAAe7B,GAAMmB,GAAGC,CAAC,GAC3DiF,IAASpD,EAAiB,UAAU;GAAE,OAAO;GAAsB,MAAMlB;GAAO,GAAG;EAAI,CAAC,GACxF,WAAW,MACf,KAAK,IAAI,GAAG,KAAK,IAAI/B,EAAK,SAAS,GAAG,KAAK,OAAOsG,IAAUC,EAAI,sBAAsB,CAAC,CAAC,OAAOrD,KAASjD,CAAK,CAAC,CAAC;EAGjH,AADA,EAAO,MAAM,UAAU,QACvB+C,EAAW,YAAYqD,CAAM;EAE7B,IAAM,cAAc,MAAkB;GACpC,IAAMG,IAAM,QAAQ/C,EAAE,OAAO,GACvBgD,IAAQ5F,EAAO2F;GAOrB,AALIC,MACFlC,EAAc8B,GAAQ;IAAE,IAAII,EAAM;IAAG,IAAIA,EAAM;GAAE,CAAC,GAClD,EAAO,MAAM,UAAU,KAGzB3E,EAAO,UAAU;IAAE,OAAO0E;IAAK,eAAe/C;IAAG,OAAOzD,EAAKwG;GAAK,CAAC;EACrE,GAEM,oBAAoB;GAExB,AADA,EAAO,MAAM,UAAU,QACvB1E,EAAO,UAAU,IAAI;EACvB,GAEM,eAAe,MAAkB;GACrC,IAAI,CAACA,EAAO,SAAS;GAErB,IAAM0E,IAAM,QAAQ/C,EAAE,OAAO;GAE7B,EAAO,QAAQ;IAAE,OAAO+C;IAAK,eAAe/C;IAAG,OAAOzD,EAAKwG;GAAK,CAAC;EACnE;EAMA,AAJAD,EAAI,iBAAiB,aAAa,UAAU,GAC5CA,EAAI,iBAAiB,cAAc,WAAW,GAC9CA,EAAI,iBAAiB,SAAS,WAAW,GAEzC,2BAA2B;GAGzB,AAFAA,EAAI,oBAAoB,aAAa,UAAU,GAC/CA,EAAI,oBAAoB,cAAc,WAAW,GACjDA,EAAI,oBAAoB,SAAS,WAAW;EAC9C;CACF;CAEA,IAAM1C,IAAK,IAAI,gBAAgB,GAC3B6C,IAAa;CAEjB,IAAI;EAGF,OAFA,UAAU,GAEH;GACL,IAAI,iBAA8B;IAChC,OAAO7C,EAAG;GACZ;GAEA,UAAU;IACR,AAAI6C,MAEJ,IAAa,IACbrE,EAAQ,KAAK,EAAE,MAAM,UAAU,CAAC,GAChCA,EAAQ,KAAK,GACbwB,EAAG,MAAM,GACT,qBAAqB,GACrBhB,EAAK,QAAQ;GACf;GAEA,IAAI,WAAoB;IACtB,OAAO6D;GACT;GAEA,IAAIH;GAEJ,KAAKlE,EAAQ;GAEb,OAAO,GAAM;IACX,IAAIqE,GAAY,MAAM,IAAIC,EAAiB,iCAAiC;IAE5E,AADA,IAAOC,GACP,UAAU;GACZ;GAEA,CAAC,OAAO,WAAW;IACjB,KAAK,QAAQ;GACf;EACF;CACF,SAASC,GAAO;EAId,MAHAhD,EAAG,MAAM,GACT,qBAAqB,GACrBhB,EAAK,QAAQ,GACPgE,aAAiBF,IAAmBE,IAAQ,IAAIF,EAAiB,2BAA2B,EAAE,OAAOE,EAAM,CAAC;CACpH;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "../_dev.js";
|
|
2
|
-
|
|
2
|
+
// src/core/cartesian-model.ts
|
|
3
3
|
function keyId(e) {
|
|
4
4
|
return e instanceof Date ? `date:${e.getTime()}` : `${typeof e}:${String(e)}`;
|
|
5
5
|
}
|
|
@@ -21,7 +21,6 @@ function normalizeCartesianSeries(e, t) {
|
|
|
21
21
|
})
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
|
-
//#endregion
|
|
25
24
|
export { keyId, normalizeCartesianSeries };
|
|
26
25
|
|
|
27
26
|
//# sourceMappingURL=cartesian-model.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../_dev.js";
|
|
2
2
|
import { linearScale as e } from "../scales/linear.js";
|
|
3
3
|
import { timeScale as t } from "../scales/time.js";
|
|
4
|
-
|
|
4
|
+
// src/core/cartesian-scales.ts
|
|
5
5
|
function buildXScale(n, r) {
|
|
6
6
|
if (n.length === 0 || n.some((e) => e == null) || n.some((e) => typeof e == "number" && !Number.isFinite(e))) return e({
|
|
7
7
|
domain: [0, 1],
|
|
@@ -33,7 +33,6 @@ function buildYScale(t, n, r = !0) {
|
|
|
33
33
|
range: [n, 0]
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
|
-
//#endregion
|
|
37
36
|
export { buildXScale, buildYScale };
|
|
38
37
|
|
|
39
38
|
//# sourceMappingURL=cartesian-scales.js.map
|
package/dist/core/chart-base.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_dev.cjs");const e=require("../
|
|
1
|
+
require("../_dev.cjs");const e=require("../errors.cjs"),t=require("../svg/element.cjs"),n=require("./layout.cjs"),r=require("./responsive.cjs");function createChartBase(i,a,o){if(!(typeof i==`object`&&i&&i.nodeType===1&&typeof i.appendChild==`function`&&typeof i.getBoundingClientRect==`function`)){let t=i,n=t===null?`null`:typeof t==`object`?t.constructor?.name??`object`:typeof t;throw new e.PrismRenderError(`Invalid chart configuration: \`container\` must be a DOM Element, received ${n}.`)}let s=n.resolveMargin(a.margin),c=a.a11y,l=t.createSvgElement(`svg`,{...!c||c.decorative?{"aria-hidden":`true`}:{"aria-label":c.ariaLabel,role:`img`,tabindex:`0`},class:`prism-chart`,style:`display:block;max-width:100%`}),u=t.createSvgElement(`g`,{class:`prism-chart-area`,transform:`translate(${s.left},${s.top})`});l.appendChild(u);let d=i.getBoundingClientRect();d.width===0||d.height;let f=d.width||600,p=d.height||300,m={height:p,margin:s,width:f},h=f,g=p,_=p,syncChrome=()=>{let e=Math.max(0,_-(a.chrome?.()?.offsetHeight??0));g=e,m.height=e,t.setAttributes(l,{height:e,viewBox:`0 0 ${m.width} ${e}`})},v=r.observeResize(i,(e,n)=>{_=n;let r=a.chrome?.()?.offsetHeight??0,i=Math.max(0,n-r);(e!==h||i!==g)&&(h=e,g=i,m.height=i,m.width=e,t.setAttributes(l,{height:i,viewBox:`0 0 ${e} ${i}`,width:e}),o?.())});return t.setAttributes(l,{height:p,viewBox:`0 0 ${f} ${p}`,width:f}),i.appendChild(l),{chartArea:u,dimensions:m,dispose(){v(),l.remove()},svg:l,syncChrome}}exports.createChartBase=createChartBase;
|
|
2
2
|
//# sourceMappingURL=chart-base.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-base.cjs","names":["PrismRenderError","resolveMargin","createSvgElement","observeResize","
|
|
1
|
+
{"version":3,"file":"chart-base.cjs","names":["PrismRenderError","resolveMargin","createSvgElement","observeResize","require_errors","require_element","require_layout","require_responsive","container","received","kind","margin","options","a11y","svg","chartAreaGroup","rect","initialWidth","initialHeight","dimensions","appliedWidth","appliedHeight","containerHeight","height","stopObserving","chromeHeight","svgHeight","width","onResize"],"sources":["../../src/core/chart-base.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { PrismRenderError } from '../errors';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { ChartA11y, ChartDimensions, ChartMargin } from '../types';\nimport { resolveMargin } from './layout';\nimport { observeResize } from './responsive';\n\nexport interface ChartBase {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n dispose(): void;\n svg: SVGSVGElement;\n syncChrome(): void;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: {\n a11y?: ChartA11y;\n /**\n * The chart's own in-flow chrome inside the container (the legend). Its height is\n * subtracted from every resize-driven svg height: the container's content box contains\n * the svg plus this chrome, so assigning the full content height back to the svg would\n * grow the container by the chrome's height on every pass — unbounded growth in any\n * auto-height container. Subtracting it makes the layout converge on the fixed point\n * `container = svg + chrome` instead.\n */\n chrome?: () => HTMLElement | null;\n margin?: Partial<ChartMargin>;\n },\n onResize?: () => void,\n): ChartBase {\n // Duck-typed rather than `instanceof Element`: an `instanceof` check would reject a\n // structurally valid Element from a different realm (e.g. an Element created via\n // `iframe.contentDocument.createElement(...)`, whose prototype chain terminates in that\n // iframe's own `Element` constructor), which is a legitimate usage pattern this package\n // doesn't otherwise restrict.\n const isElementLike =\n typeof container === 'object' &&\n container !== null &&\n container.nodeType === 1 &&\n typeof container.appendChild === 'function' &&\n typeof container.getBoundingClientRect === 'function';\n\n if (!isElementLike) {\n const received: unknown = container;\n const kind =\n received === null\n ? 'null'\n : typeof received === 'object'\n ? (received.constructor?.name ?? 'object')\n : typeof received;\n\n throw new PrismRenderError(`Invalid chart configuration: \\`container\\` must be a DOM Element, received ${kind}.`);\n }\n\n const margin = resolveMargin(options.margin);\n const a11y = options.a11y;\n const svg = createSvgElement('svg', {\n ...(!a11y || a11y.decorative\n ? { 'aria-hidden': 'true' }\n : { 'aria-label': a11y.ariaLabel, role: 'img', tabindex: '0' }),\n class: 'prism-chart',\n // The svg's width/height attributes are its single source of sizing truth (set below and\n // on every resize pass, chrome excluded). CSS percentage sizing here would override the\n // attributes: `height: 100%` fills the whole container, so the in-flow legend rides past\n // the container's edge instead of inside the height the resize pass reserved for it.\n style: 'display:block;max-width:100%',\n });\n\n const chartAreaGroup = createSvgElement('g', {\n class: 'prism-chart-area',\n transform: `translate(${margin.left},${margin.top})`,\n });\n\n svg.appendChild(chartAreaGroup);\n\n const rect = container.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0) {\n warn(\n 'Chart container has zero dimensions. Ensure the container has a defined width and height before mounting a chart.',\n );\n }\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\n\n const dimensions: ChartDimensions = {\n height: initialHeight,\n margin,\n width: initialWidth,\n };\n\n // The dimensions the svg currently carries. A resize pass only re-renders when the\n // effective drawing size moves away from these.\n let appliedWidth = initialWidth;\n let appliedHeight = initialHeight;\n let containerHeight = initialHeight;\n\n // Legend updates reserve their space synchronously, before a renderer builds scales.\n const syncChrome = (): void => {\n const height = Math.max(0, containerHeight - (options.chrome?.()?.offsetHeight ?? 0));\n\n appliedHeight = height;\n dimensions.height = height;\n setAttributes(svg, { height, viewBox: `0 0 ${dimensions.width} ${height}` });\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n containerHeight = height;\n const chromeHeight = options.chrome?.()?.offsetHeight ?? 0;\n const svgHeight = Math.max(0, height - chromeHeight);\n\n // A ResizeObserver fires once for the initial observation, at the size the chart was\n // already built at. Re-rendering there is a no-op for layout but cancels a mount\n // entrance still in flight (the renderers treat the redraw as an already-drawn\n // update and snap to final), so a chart would never animate on first paint. Skip the\n // pass unless the effective size — legend chrome included — has genuinely changed.\n if (width === appliedWidth && svgHeight === appliedHeight) return;\n\n appliedWidth = width;\n appliedHeight = svgHeight;\n dimensions.height = svgHeight;\n dimensions.width = width;\n setAttributes(svg, { height: svgHeight, viewBox: `0 0 ${width} ${svgHeight}`, width });\n onResize?.();\n });\n\n setAttributes(svg, {\n height: initialHeight,\n viewBox: `0 0 ${initialWidth} ${initialHeight}`,\n width: initialWidth,\n });\n\n container.appendChild(svg);\n\n return {\n chartArea: chartAreaGroup,\n dimensions,\n dispose() {\n stopObserving();\n svg.remove();\n },\n svg,\n syncChrome,\n };\n}\n"],"mappings":"A,gJAeA,SAAgB,gBACd,EACA,EAaA,EACW,CAaX,GAAI,EANF,OAAOQ,GAAc,UACrBA,GACAA,EAAU,WAAa,GACvB,OAAOA,EAAU,aAAgB,YACjC,OAAOA,EAAU,uBAA0B,YAEzB,CAClB,IAAMC,EAAoBD,EACpBE,EACJD,IAAa,KACT,OACA,OAAOA,GAAa,SACjBA,EAAS,aAAa,MAAQ,SAC/B,OAAOA,EAEf,MAAM,IAAIT,EAAAA,iBAAiB,8EAA8EU,EAAK,EAAE,CAClH,CAEA,IAAMC,EAASV,EAAAA,cAAcW,EAAQ,MAAM,EACrCC,EAAOD,EAAQ,KACfE,EAAMZ,EAAAA,iBAAiB,MAAO,CAClC,GAAI,CAACW,GAAQA,EAAK,WACd,CAAE,cAAe,MAAO,EACxB,CAAE,aAAcA,EAAK,UAAW,KAAM,MAAO,SAAU,GAAI,EAC/D,MAAO,cAKP,MAAO,8BACT,CAAC,EAEKE,EAAiBb,EAAAA,iBAAiB,IAAK,CAC3C,MAAO,mBACP,UAAW,aAAaS,EAAO,KAAK,GAAGA,EAAO,IAAI,EACpD,CAAC,EAEDG,EAAI,YAAYC,CAAc,EAE9B,IAAMC,EAAOR,EAAU,sBAAsB,EAEzCQ,EAAK,QAAU,GAAKA,EAAK,OAM7B,IAAMC,EAAeD,EAAK,OAAS,IAC7BE,EAAgBF,EAAK,QAAU,IAE/BG,EAA8B,CAClC,OAAQD,EACR,SACA,MAAOD,CACT,EAIIG,EAAeH,EACfI,EAAgBH,EAChBI,EAAkBJ,EAGhB,eAAyB,CAC7B,IAAMK,EAAS,KAAK,IAAI,EAAGD,GAAmBV,EAAQ,SAAS,CAAC,EAAE,cAAgB,EAAE,EAEpF,EAAgBW,EAChB,EAAW,OAASA,EACpBlB,EAAA,cAAcS,EAAK,CAAE,SAAQ,QAAS,OAAOK,EAAW,MAAM,GAAGI,GAAS,CAAC,CAC7E,EAEMC,EAAgBrB,EAAAA,cAAcK,GAAY,EAAO,IAAW,CAChE,EAAkBe,EAClB,IAAME,EAAeb,EAAQ,SAAS,CAAC,EAAE,cAAgB,EACnDc,EAAY,KAAK,IAAI,EAAGH,EAASE,CAAY,GAO/CE,IAAUP,GAAgBM,IAAcL,KAE5C,EAAeM,EACf,EAAgBD,EAChB,EAAW,OAASA,EACpB,EAAW,MAAQC,EACnBtB,EAAA,cAAcS,EAAK,CAAE,OAAQY,EAAW,QAAS,OAAOC,EAAM,GAAGD,IAAa,OAAM,CAAC,EACrFE,IAAW,EACb,CAAC,EAUD,OARAvB,EAAA,cAAcS,EAAK,CACjB,OAAQI,EACR,QAAS,OAAOD,EAAa,GAAGC,IAChC,MAAOD,CACT,CAAC,EAEDT,EAAU,YAAYM,CAAG,EAElB,CACL,UAAWC,EACX,aACA,SAAU,CACRS,EAAc,EACdV,EAAI,OAAO,CACb,EACA,MACA,UACF,CACF,C"}
|
package/dist/core/chart-base.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import "../_dev.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { PrismRenderError as e } from "../errors.js";
|
|
3
|
+
import { createSvgElement as t, setAttributes as n } from "../svg/element.js";
|
|
4
4
|
import { resolveMargin as r } from "./layout.js";
|
|
5
5
|
import { observeResize as i } from "./responsive.js";
|
|
6
|
-
|
|
6
|
+
// src/core/chart-base.ts
|
|
7
7
|
function createChartBase(a, o, s) {
|
|
8
8
|
if (!(typeof a == "object" && a && a.nodeType === 1 && typeof a.appendChild == "function" && typeof a.getBoundingClientRect == "function")) {
|
|
9
|
-
let
|
|
10
|
-
throw new
|
|
9
|
+
let t = a, n = t === null ? "null" : typeof t == "object" ? t.constructor?.name ?? "object" : typeof t;
|
|
10
|
+
throw new e(`Invalid chart configuration: \`container\` must be a DOM Element, received ${n}.`);
|
|
11
11
|
}
|
|
12
|
-
let c = r(o.margin), l = o.a11y, u =
|
|
12
|
+
let c = r(o.margin), l = o.a11y, u = t("svg", {
|
|
13
13
|
...!l || l.decorative ? { "aria-hidden": "true" } : {
|
|
14
14
|
"aria-label": l.ariaLabel,
|
|
15
15
|
role: "img",
|
|
@@ -17,7 +17,7 @@ function createChartBase(a, o, s) {
|
|
|
17
17
|
},
|
|
18
18
|
class: "prism-chart",
|
|
19
19
|
style: "display:block;max-width:100%"
|
|
20
|
-
}), d =
|
|
20
|
+
}), d = t("g", {
|
|
21
21
|
class: "prism-chart-area",
|
|
22
22
|
transform: `translate(${c.left},${c.top})`
|
|
23
23
|
});
|
|
@@ -30,20 +30,20 @@ function createChartBase(a, o, s) {
|
|
|
30
30
|
width: p
|
|
31
31
|
}, g = p, _ = m, v = m, syncChrome = () => {
|
|
32
32
|
let e = Math.max(0, v - (o.chrome?.()?.offsetHeight ?? 0));
|
|
33
|
-
_ = e, h.height = e,
|
|
33
|
+
_ = e, h.height = e, n(u, {
|
|
34
34
|
height: e,
|
|
35
35
|
viewBox: `0 0 ${h.width} ${e}`
|
|
36
36
|
});
|
|
37
|
-
}, y = i(a, (e,
|
|
38
|
-
v =
|
|
39
|
-
let r = o.chrome?.()?.offsetHeight ?? 0, i = Math.max(0,
|
|
40
|
-
(e !== g || i !== _) && (g = e, _ = i, h.height = i, h.width = e,
|
|
37
|
+
}, y = i(a, (e, t) => {
|
|
38
|
+
v = t;
|
|
39
|
+
let r = o.chrome?.()?.offsetHeight ?? 0, i = Math.max(0, t - r);
|
|
40
|
+
(e !== g || i !== _) && (g = e, _ = i, h.height = i, h.width = e, n(u, {
|
|
41
41
|
height: i,
|
|
42
42
|
viewBox: `0 0 ${e} ${i}`,
|
|
43
43
|
width: e
|
|
44
44
|
}), s?.());
|
|
45
45
|
});
|
|
46
|
-
return
|
|
46
|
+
return n(u, {
|
|
47
47
|
height: m,
|
|
48
48
|
viewBox: `0 0 ${p} ${m}`,
|
|
49
49
|
width: p
|
|
@@ -57,7 +57,6 @@ function createChartBase(a, o, s) {
|
|
|
57
57
|
syncChrome
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
//#endregion
|
|
61
60
|
export { createChartBase };
|
|
62
61
|
|
|
63
62
|
//# sourceMappingURL=chart-base.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../
|
|
1
|
+
const e=require("../_tappers.cjs"),t=require("../errors.cjs"),n=require("../interaction/announcer.cjs"),r=require("../interaction/legend.cjs"),i=require("../interaction/tooltip.cjs"),a=require("../svg/element.cjs"),o=require("./chart-base.cjs");function clearCartesianDom(e,t,n,r){a.removeChildren(e.series),a.removeChildren(e.grid),a.removeChildren(e.xAxis),a.removeChildren(e.yAxis),t?.update([]),n?.hide(),r?.hide()}function runScaffold(a,s,c,l,u){let render=e=>{},d=e.createTappers(),f=null,p=o.createChartBase(a,{a11y:s.a11y,chrome:()=>f?.el??null,margin:s.margin},()=>{d.emit({height:p.dimensions.height,type:`resize`,width:p.dimensions.width}),render(`resize`)}),m=s.tooltip?i.createTooltip(a,s.tooltip):null;f=s.legend?r.createLegend(a,s.legend,()=>p.syncChrome()):null;let h=new AbortController,g=c(p,m,f,h.signal,n.createAnnouncer(p.svg,`prism-live`)),_=!1,v=makeEventManager(p.svg);render=e=>{_||v.attach(l(g,e))};try{render(`mount`)}catch(e){throw _=!0,h.abort(),v.detach(),m?.dispose(),f?.dispose(),p.dispose(),e instanceof t.PrismRenderError?e:new t.PrismRenderError(`Failed to render chart.`,{cause:e})}return{get disposalSignal(){return h.signal},dispose(){_||(_=!0,d.emit({type:`dispose`}),d.stop(),h.abort(),v.detach(),m?.dispose(),f?.dispose(),p.dispose())},get disposed(){return _},el:p.svg,tap:d.tap,update(e){if(_)throw new t.PrismRenderError(`Cannot update a disposed chart.`);u(e),render(`update`)},[Symbol.dispose](){this.dispose()}}}function makeEventManager(e){let t=null;return{attach(n){t&&=(t.onMouseMove&&e.removeEventListener(`mousemove`,t.onMouseMove),t.onMouseLeave&&e.removeEventListener(`mouseleave`,t.onMouseLeave),t.onClick&&e.removeEventListener(`click`,t.onClick),t.onKeyDown&&e.removeEventListener(`keydown`,t.onKeyDown),null),n&&(t=n,n.onMouseMove&&e.addEventListener(`mousemove`,n.onMouseMove),n.onMouseLeave&&e.addEventListener(`mouseleave`,n.onMouseLeave),n.onClick&&e.addEventListener(`click`,n.onClick),n.onKeyDown&&e.addEventListener(`keydown`,n.onKeyDown))},detach(){this.attach(void 0)}}}function createChartScaffold(e,t,n,r){return runScaffold(e,t,(t,n,r,i,o)=>{let s={grid:a.createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-grid`}),series:a.createSvgElement(`g`,{class:`prism-series`}),xAxis:a.createSvgElement(`g`,{class:`prism-x-axis`}),yAxis:a.createSvgElement(`g`,{class:`prism-y-axis`})};return t.chartArea.appendChild(s.grid),t.chartArea.appendChild(s.xAxis),t.chartArea.appendChild(s.yAxis),t.chartArea.appendChild(s.series),{announcer:o,chartArea:t.chartArea,container:e,dimensions:t.dimensions,disposalSignal:i,groups:s,legend:r,svg:t.svg,tooltip:n}},n,r)}function createRadialScaffold(e,t,n,r){return runScaffold(e,t,(t,n,r,i,a)=>({announcer:a,container:e,dimensions:t.dimensions,disposalSignal:i,legend:r,svg:t.svg,tooltip:n}),n,r)}exports.clearCartesianDom=clearCartesianDom,exports.createChartScaffold=createChartScaffold,exports.createRadialScaffold=createRadialScaffold;
|
|
2
2
|
//# sourceMappingURL=chart-scaffold.cjs.map
|