@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.
Files changed (105) hide show
  1. package/README.md +25 -10
  2. package/dist/_dev.js +1 -2
  3. package/dist/_tappers.js +1 -2
  4. package/dist/animation/easing.js +1 -2
  5. package/dist/animation/motion.js +0 -1
  6. package/dist/animation/reveal.cjs +1 -1
  7. package/dist/animation/reveal.cjs.map +1 -1
  8. package/dist/animation/reveal.js +29 -30
  9. package/dist/animation/transition.js +1 -2
  10. package/dist/animation/tween.js +1 -2
  11. package/dist/axes/axis.js +1 -2
  12. package/dist/axes/grid.js +1 -2
  13. package/dist/axes/scale-utils.js +1 -2
  14. package/dist/charts/area/area-chart.cjs +1 -1
  15. package/dist/charts/area/area-chart.cjs.map +1 -1
  16. package/dist/charts/area/area-chart.js +34 -35
  17. package/dist/charts/area/area-renderer.cjs +1 -1
  18. package/dist/charts/area/area-renderer.cjs.map +1 -1
  19. package/dist/charts/area/area-renderer.js +56 -57
  20. package/dist/charts/area/area-renderer.js.map +1 -1
  21. package/dist/charts/bar/bar-chart.cjs +1 -1
  22. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  23. package/dist/charts/bar/bar-chart.js +80 -81
  24. package/dist/charts/bar/bar-chart.js.map +1 -1
  25. package/dist/charts/bar/bar-hit-test.js +1 -2
  26. package/dist/charts/bar/bar-renderer.cjs +1 -1
  27. package/dist/charts/bar/bar-renderer.cjs.map +1 -1
  28. package/dist/charts/bar/bar-renderer.js +42 -43
  29. package/dist/charts/bar/bar-value-labels.cjs +1 -1
  30. package/dist/charts/bar/bar-value-labels.cjs.map +1 -1
  31. package/dist/charts/bar/bar-value-labels.js +17 -18
  32. package/dist/charts/heatmap/heatmap-chart.cjs +1 -1
  33. package/dist/charts/heatmap/heatmap-chart.cjs.map +1 -1
  34. package/dist/charts/heatmap/heatmap-chart.js +43 -44
  35. package/dist/charts/heatmap/heatmap-color.js +1 -2
  36. package/dist/charts/line/line-chart.cjs +1 -1
  37. package/dist/charts/line/line-chart.cjs.map +1 -1
  38. package/dist/charts/line/line-chart.js +41 -42
  39. package/dist/charts/line/line-renderer.cjs +1 -1
  40. package/dist/charts/line/line-renderer.cjs.map +1 -1
  41. package/dist/charts/line/line-renderer.js +81 -82
  42. package/dist/charts/line/line-renderer.js.map +1 -1
  43. package/dist/charts/pie/pie-chart.cjs +1 -1
  44. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  45. package/dist/charts/pie/pie-chart.js +69 -70
  46. package/dist/charts/pie/pie-renderer.js +1 -2
  47. package/dist/charts/radar/radar-chart.cjs +1 -1
  48. package/dist/charts/radar/radar-chart.cjs.map +1 -1
  49. package/dist/charts/radar/radar-chart.js +118 -119
  50. package/dist/charts/radar/radar-chart.js.map +1 -1
  51. package/dist/charts/radar/radar-geometry.cjs +1 -1
  52. package/dist/charts/radar/radar-geometry.cjs.map +1 -1
  53. package/dist/charts/radar/radar-geometry.js +15 -16
  54. package/dist/charts/scatter/scatter-chart.cjs +1 -1
  55. package/dist/charts/scatter/scatter-chart.cjs.map +1 -1
  56. package/dist/charts/scatter/scatter-chart.js +33 -34
  57. package/dist/charts/scatter/scatter-renderer.cjs +1 -1
  58. package/dist/charts/scatter/scatter-renderer.cjs.map +1 -1
  59. package/dist/charts/scatter/scatter-renderer.js +22 -23
  60. package/dist/charts/sparkline/sparkline.cjs +1 -1
  61. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  62. package/dist/charts/sparkline/sparkline.js +87 -88
  63. package/dist/charts/sparkline/sparkline.js.map +1 -1
  64. package/dist/core/cartesian-model.js +1 -2
  65. package/dist/core/cartesian-scales.js +1 -2
  66. package/dist/core/chart-base.cjs +1 -1
  67. package/dist/core/chart-base.cjs.map +1 -1
  68. package/dist/core/chart-base.js +13 -14
  69. package/dist/core/chart-scaffold.cjs +1 -1
  70. package/dist/core/chart-scaffold.cjs.map +1 -1
  71. package/dist/core/chart-scaffold.js +33 -34
  72. package/dist/core/datum-style.js +1 -2
  73. package/dist/core/ids.js +1 -2
  74. package/dist/core/layout.js +1 -2
  75. package/dist/core/polar.js +1 -2
  76. package/dist/core/responsive.js +1 -2
  77. package/dist/core/series-id.js +1 -2
  78. package/dist/errors.js +1 -2
  79. package/dist/index.cjs +1 -1
  80. package/dist/index.js +14 -14
  81. package/dist/interaction/announcer.js +1 -2
  82. package/dist/interaction/crosshair.js +1 -2
  83. package/dist/interaction/events.js +1 -2
  84. package/dist/interaction/legend.js +1 -2
  85. package/dist/interaction/scatter-interaction.cjs +1 -1
  86. package/dist/interaction/scatter-interaction.cjs.map +1 -1
  87. package/dist/interaction/scatter-interaction.js +26 -27
  88. package/dist/interaction/series-interaction.cjs +1 -1
  89. package/dist/interaction/series-interaction.cjs.map +1 -1
  90. package/dist/interaction/series-interaction.js +40 -41
  91. package/dist/interaction/tooltip.js +1 -2
  92. package/dist/prism.cjs +1 -1
  93. package/dist/prism.cjs.map +1 -1
  94. package/dist/prism.iife.js +1 -1
  95. package/dist/prism.iife.js.map +1 -1
  96. package/dist/prism.js +52 -103
  97. package/dist/prism.js.map +1 -1
  98. package/dist/scales/band.js +1 -2
  99. package/dist/scales/linear.js +1 -2
  100. package/dist/scales/time.js +1 -2
  101. package/dist/svg/element.js +1 -2
  102. package/dist/svg/path.js +1 -2
  103. package/dist/svg/text.js +1 -2
  104. package/dist/theme/index.js +1 -2
  105. package/package.json +6 -6
@@ -1,15 +1,15 @@
1
1
  import "../../_dev.js";
2
- import { createSvgElement as e, setAttributes as t } from "../../svg/element.js";
3
- import { createTappers as n } from "../../_tappers.js";
4
- import { PrismRenderError as r } from "../../errors.js";
5
- import { createChartBase as i } from "../../core/chart-base.js";
6
- import { resolveEasing as a } from "../../animation/easing.js";
7
- import { resolveMotion as o } from "../../animation/motion.js";
8
- import { tweenNumber as s } from "../../animation/tween.js";
9
- import { startTween as c } from "../../animation/transition.js";
10
- import { uniqueId as l } from "../../core/ids.js";
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
- //#region src/charts/sparkline/sparkline.ts
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 = l("prism-spark-fill"), b = n(), x = o(d.transition), S = a(x.easing), C = d.data, w = null, T = null, E = i(u, {
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 = e("g", { class: "prism-spark-inner" });
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 r = w?.length === e.length ? w : e.map(() => t);
85
- r.every((t, n) => t === e[n]) || x.duration === 0 ? (w = e, n(e)) : (T = c({
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 i = t(0), a = e.map((e, t) => s(r[t], e, i));
91
- w = a, n(a);
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 = r, n(r));
94
+ }), w = a, n(a));
95
95
  }
96
96
  function renderAll() {
97
- let { height: n, width: r } = E.dimensions, i = plotArea();
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(${i.inset},${i.inset})`), C.length === 0) w = null;
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 i = e("g", { class: "prism-spark-stack" });
103
- O.appendChild(i);
104
- let a = d.cornerRadius ?? 4, o = C, s = o.reduce((e, t) => e + Math.max(0, t.value), 0), c = o.map((n, r) => {
105
- let a = e("path", { class: "prism-spark-stack-segment" });
106
- return t(a, { fill: n.color ?? defaultStackColor(r) }), i.appendChild(a), a;
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
- s > 0 ? animateValues(o.map((e) => Math.max(0, e.value)), 0, (e) => {
109
- let t = e.reduce((e, t) => e + t, 0) || 1, i = (d.padPixels ?? 0) / 2, o = 0;
110
- e.forEach((s, l) => {
111
- let u = Math.round(o);
112
- o += s / t * r;
113
- let d = l === e.length - 1 ? r : Math.round(o), f = l === 0, p = l === e.length - 1, m = u + (f ? 0 : i), h = Math.max(0, d - u - (f ? 0 : i) - (p ? 0 : i));
114
- c[l]?.setAttribute("d", buildRoundedStackRect(m, 0, h, n, a, f, p));
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 i = e("g", { class: "prism-spark-bars" });
119
- O.appendChild(i);
120
- let a = C, o = Math.min(0, ...a), s = Math.max(...a) - o || 1, c = Math.max(1, r / a.length - 1), l = r / a.length, u = a.map(() => {
121
- let t = e("rect", {
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 i.appendChild(t), t;
125
+ return n.appendChild(e), e;
126
126
  });
127
- animateValues(a, o, (e) => {
128
- for (let [r, i] of u.entries()) {
129
- let a = Math.max(1, (e[r] - o) / s * n);
130
- t(i, {
131
- height: a,
132
- width: c,
133
- x: r * l,
134
- y: n - a
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 n = C, r = Math.min(...n), a = Math.max(...n) - r || 1, o = i.w / Math.max(1, n.length - 1), pointsFromValues = (e) => e.map((e, t) => ({
140
- x: t * o,
141
- y: i.h - (e - r) / a * i.h
142
- })), s = null;
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 n = e("defs"), r = e("linearGradient", {
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 [t, n] of [[0, "prism-spark-stop-top"], [1, "prism-spark-stop-bottom"]]) {
152
- let i = e("stop", {
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: t,
154
+ offset: e,
155
155
  "stop-color": p
156
156
  });
157
- i.style.stopColor = p, r.appendChild(i);
157
+ r.style.stopColor = p, t.appendChild(r);
158
158
  }
159
- n.appendChild(r), O.appendChild(n), s = e("path", { class: "prism-spark-fill" }), t(s, {
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
- }), s.style.fillOpacity = _ === void 0 ? "" : String(_), O.appendChild(s);
162
+ }), a.style.fillOpacity = _ === void 0 ? "" : String(_), O.appendChild(a);
163
163
  }
164
- let c = e("path", { class: "prism-spark-line" });
165
- t(c, {
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(c);
170
- let l = v && n.length > 0 ? e("circle", {
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
- l && O.appendChild(l), animateValues(n, r, (e) => {
176
- let n = pointsFromValues(e);
177
- t(c, { d: buildPathFromPoints(n, h) }), s && t(s, { d: buildAreaPathFromPoints(n, i.h, h) });
178
- let r = n.at(-1);
179
- l && r && t(l, {
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(n) {
189
- if (cleanupInteraction?.(), cleanupInteraction = void 0, !d.onHover && !d.onClick || n.length <= 1) return;
190
- let { h: r, inset: i, w: a } = plotArea();
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 o = a / (n.length - 1), s = f === "bar" ? [] : buildTopPoints(n, a, r), c = e("circle", {
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 = (e) => Math.max(0, Math.min(n.length - 1, Math.round((e - D.getBoundingClientRect().left - i) / o)));
197
- c.style.display = "none", O.appendChild(c);
198
- let handleMove = (e) => {
199
- let r = indexAt(e.clientX), i = s[r];
200
- i && (t(c, {
201
- cx: i.x,
202
- cy: i.y
203
- }), c.style.display = ""), d.onHover?.({
204
- index: r,
205
- originalEvent: e,
206
- value: n[r]
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
- c.style.display = "none", d.onHover?.(null);
210
- }, handleClick = (e) => {
209
+ o.style.display = "none", d.onHover?.(null);
210
+ }, handleClick = (t) => {
211
211
  if (!d.onClick) return;
212
- let t = indexAt(e.clientX);
212
+ let n = indexAt(t.clientX);
213
213
  d.onClick({
214
- index: t,
215
- originalEvent: e,
216
- value: n[t]
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 r("Cannot update a disposed chart.");
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 r ? e : new r("Failed to render chart.", { cause: e });
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":"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"}
@@ -1,5 +1,5 @@
1
1
  import "../_dev.js";
2
- //#region src/core/cartesian-model.ts
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
- //#region src/core/cartesian-scales.ts
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
@@ -1,2 +1,2 @@
1
- require("../_dev.cjs");const e=require("../svg/element.cjs"),t=require("../errors.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 e=i,n=e===null?`null`:typeof e==`object`?e.constructor?.name??`object`:typeof e;throw new t.PrismRenderError(`Invalid chart configuration: \`container\` must be a DOM Element, received ${n}.`)}let s=n.resolveMargin(a.margin),c=a.a11y,l=e.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=e.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 t=Math.max(0,_-(a.chrome?.()?.offsetHeight??0));g=t,m.height=t,e.setAttributes(l,{height:t,viewBox:`0 0 ${m.width} ${t}`})},v=r.observeResize(i,(t,n)=>{_=n;let r=a.chrome?.()?.offsetHeight??0,i=Math.max(0,n-r);(t!==h||i!==g)&&(h=t,g=i,m.height=i,m.width=t,e.setAttributes(l,{height:i,viewBox:`0 0 ${t} ${i}`,width:t}),o?.())});return e.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;
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","require_element","require_errors","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,EACpBnB,EAAA,cAAcU,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,EACnBvB,EAAA,cAAcU,EAAK,CAAE,OAAQY,EAAW,QAAS,OAAOC,EAAM,GAAGD,IAAa,OAAM,CAAC,EACrFE,IAAW,EACb,CAAC,EAUD,OARAxB,EAAA,cAAcU,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"}
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"}
@@ -1,15 +1,15 @@
1
1
  import "../_dev.js";
2
- import { createSvgElement as e, setAttributes as t } from "../svg/element.js";
3
- import { PrismRenderError as n } from "../errors.js";
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
- //#region src/core/chart-base.ts
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 e = a, t = e === null ? "null" : typeof e == "object" ? e.constructor?.name ?? "object" : typeof e;
10
- throw new n(`Invalid chart configuration: \`container\` must be a DOM Element, received ${t}.`);
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 = e("svg", {
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 = e("g", {
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, t(u, {
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, n) => {
38
- v = n;
39
- let r = o.chrome?.()?.offsetHeight ?? 0, i = Math.max(0, n - r);
40
- (e !== g || i !== _) && (g = e, _ = i, h.height = i, h.width = e, t(u, {
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 t(u, {
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("../svg/element.cjs"),t=require("../_tappers.cjs"),n=require("../errors.cjs"),r=require("../interaction/announcer.cjs"),i=require("../interaction/legend.cjs"),a=require("../interaction/tooltip.cjs"),o=require("./chart-base.cjs");function clearCartesianDom(t,n,r,i){e.removeChildren(t.series),e.removeChildren(t.grid),e.removeChildren(t.xAxis),e.removeChildren(t.yAxis),n?.update([]),r?.hide(),i?.hide()}function runScaffold(e,s,c,l,u){let render=e=>{},d=t.createTappers(),f=null,p=o.createChartBase(e,{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?a.createTooltip(e,s.tooltip):null;f=s.legend?i.createLegend(e,s.legend,()=>p.syncChrome()):null;let h=new AbortController,g=c(p,m,f,h.signal,r.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 n.PrismRenderError?e:new n.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 n.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(t,n,r,i){return runScaffold(t,n,(n,r,i,a,o)=>{let s={grid:e.createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-grid`}),series:e.createSvgElement(`g`,{class:`prism-series`}),xAxis:e.createSvgElement(`g`,{class:`prism-x-axis`}),yAxis:e.createSvgElement(`g`,{class:`prism-y-axis`})};return n.chartArea.appendChild(s.grid),n.chartArea.appendChild(s.xAxis),n.chartArea.appendChild(s.yAxis),n.chartArea.appendChild(s.series),{announcer:o,chartArea:n.chartArea,container:t,dimensions:n.dimensions,disposalSignal:a,groups:s,legend:i,svg:n.svg,tooltip:r}},r,i)}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;
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