@vielzeug/prism 2.2.6 → 3.0.0

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 +19 -40
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +1 -2
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/axes/axis.cjs +1 -1
  7. package/dist/axes/axis.cjs.map +1 -1
  8. package/dist/axes/axis.d.ts +1 -0
  9. package/dist/axes/axis.d.ts.map +1 -1
  10. package/dist/axes/axis.js +15 -11
  11. package/dist/axes/axis.js.map +1 -1
  12. package/dist/charts/area/area-chart.cjs +1 -1
  13. package/dist/charts/area/area-chart.cjs.map +1 -1
  14. package/dist/charts/area/area-chart.d.ts +2 -2
  15. package/dist/charts/area/area-chart.d.ts.map +1 -1
  16. package/dist/charts/area/area-chart.js +45 -49
  17. package/dist/charts/area/area-chart.js.map +1 -1
  18. package/dist/charts/area/area-renderer.cjs +1 -1
  19. package/dist/charts/area/area-renderer.cjs.map +1 -1
  20. package/dist/charts/area/area-renderer.d.ts +2 -2
  21. package/dist/charts/area/area-renderer.d.ts.map +1 -1
  22. package/dist/charts/area/area-renderer.js +14 -14
  23. package/dist/charts/area/area-renderer.js.map +1 -1
  24. package/dist/charts/bar/bar-chart.cjs +1 -1
  25. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  26. package/dist/charts/bar/bar-chart.d.ts +2 -2
  27. package/dist/charts/bar/bar-chart.d.ts.map +1 -1
  28. package/dist/charts/bar/bar-chart.js +140 -143
  29. package/dist/charts/bar/bar-chart.js.map +1 -1
  30. package/dist/charts/bar/bar-hit-test.cjs +1 -1
  31. package/dist/charts/bar/bar-hit-test.cjs.map +1 -1
  32. package/dist/charts/bar/bar-hit-test.js +5 -4
  33. package/dist/charts/bar/bar-hit-test.js.map +1 -1
  34. package/dist/charts/bar/bar-renderer.cjs +1 -1
  35. package/dist/charts/bar/bar-renderer.js +24 -24
  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.d.ts +2 -2
  39. package/dist/charts/line/line-chart.d.ts.map +1 -1
  40. package/dist/charts/line/line-chart.js +46 -50
  41. package/dist/charts/line/line-chart.js.map +1 -1
  42. package/dist/charts/line/line-renderer.cjs +1 -1
  43. package/dist/charts/line/line-renderer.cjs.map +1 -1
  44. package/dist/charts/line/line-renderer.d.ts +2 -2
  45. package/dist/charts/line/line-renderer.d.ts.map +1 -1
  46. package/dist/charts/line/line-renderer.js +34 -34
  47. package/dist/charts/line/line-renderer.js.map +1 -1
  48. package/dist/charts/pie/pie-chart.cjs +1 -1
  49. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  50. package/dist/charts/pie/pie-chart.d.ts +2 -2
  51. package/dist/charts/pie/pie-chart.d.ts.map +1 -1
  52. package/dist/charts/pie/pie-chart.js +84 -79
  53. package/dist/charts/pie/pie-chart.js.map +1 -1
  54. package/dist/charts/sparkline/sparkline.cjs +1 -1
  55. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  56. package/dist/charts/sparkline/sparkline.d.ts +2 -2
  57. package/dist/charts/sparkline/sparkline.d.ts.map +1 -1
  58. package/dist/charts/sparkline/sparkline.js +100 -101
  59. package/dist/charts/sparkline/sparkline.js.map +1 -1
  60. package/dist/core/chart-base.cjs +1 -1
  61. package/dist/core/chart-base.cjs.map +1 -1
  62. package/dist/core/chart-base.d.ts +2 -4
  63. package/dist/core/chart-base.d.ts.map +1 -1
  64. package/dist/core/chart-base.js +21 -30
  65. package/dist/core/chart-base.js.map +1 -1
  66. package/dist/core/chart-scaffold.cjs +1 -1
  67. package/dist/core/chart-scaffold.cjs.map +1 -1
  68. package/dist/core/chart-scaffold.d.ts +9 -10
  69. package/dist/core/chart-scaffold.d.ts.map +1 -1
  70. package/dist/core/chart-scaffold.js +31 -43
  71. package/dist/core/chart-scaffold.js.map +1 -1
  72. package/dist/core/index.d.ts +0 -1
  73. package/dist/core/index.d.ts.map +1 -1
  74. package/dist/core/layout.cjs +1 -1
  75. package/dist/core/layout.cjs.map +1 -1
  76. package/dist/core/layout.js +1 -1
  77. package/dist/core/layout.js.map +1 -1
  78. package/dist/index.cjs +1 -1
  79. package/dist/index.d.ts +2 -6
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +11 -12
  82. package/dist/interaction/legend.cjs +1 -1
  83. package/dist/interaction/legend.cjs.map +1 -1
  84. package/dist/interaction/legend.js +1 -1
  85. package/dist/interaction/legend.js.map +1 -1
  86. package/dist/interaction/tooltip.cjs +1 -1
  87. package/dist/interaction/tooltip.cjs.map +1 -1
  88. package/dist/interaction/tooltip.d.ts.map +1 -1
  89. package/dist/interaction/tooltip.js +29 -29
  90. package/dist/interaction/tooltip.js.map +1 -1
  91. package/dist/prism.cjs +1 -1
  92. package/dist/prism.cjs.map +1 -1
  93. package/dist/prism.iife.js +1 -1
  94. package/dist/prism.iife.js.map +1 -1
  95. package/dist/prism.js +1 -1
  96. package/dist/prism.js.map +1 -1
  97. package/dist/types.d.ts +24 -48
  98. package/dist/types.d.ts.map +1 -1
  99. package/package.json +8 -9
  100. package/dist/core/resolve.cjs +0 -2
  101. package/dist/core/resolve.cjs.map +0 -1
  102. package/dist/core/resolve.d.ts +0 -9
  103. package/dist/core/resolve.d.ts.map +0 -1
  104. package/dist/core/resolve.js +0 -15
  105. package/dist/core/resolve.js.map +0 -1
@@ -1,3 +1,3 @@
1
- import type { ChartHandle, SparklineConfig } from '../../types';
2
- export declare function createSparkline(container: HTMLElement, config: SparklineConfig): ChartHandle;
1
+ import type { ChartHandle, SparklineConfig, StackSegment } from '../../types';
2
+ export declare function createSparkline(container: HTMLElement, config: SparklineConfig): ChartHandle<number[] | StackSegment[]>;
3
3
  //# sourceMappingURL=sparkline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sparkline.d.ts","sourceRoot":"","sources":["../../../src/charts/sparkline/sparkline.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAgB,MAAM,aAAa,CAAC;AAkJ9E,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAiL5F"}
1
+ {"version":3,"file":"sparkline.d.ts","sourceRoot":"","sources":["../../../src/charts/sparkline/sparkline.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkJ9E,wBAAgB,eAAe,CAC7B,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,eAAe,GACtB,WAAW,CAAC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC,CA+KxC"}
@@ -1,13 +1,12 @@
1
- import { resolveEasing as e } from "../../animation/easing.js";
2
- import { resolveMotion as t } from "../../animation/motion.js";
3
- import { tweenNumber as n } from "../../animation/tween.js";
4
- import { createSvgElement as r, setAttributes as i } from "../../svg/element.js";
5
- import { createChartBase as a } from "../../core/chart-base.js";
6
- import { resolveMaybeSignal as o } from "../../core/resolve.js";
1
+ import { createSvgElement as e, setAttributes as t } from "../../svg/element.js";
2
+ import { PrismRenderError as n } from "../../errors.js";
3
+ import { createChartBase as r } from "../../core/chart-base.js";
4
+ import { resolveEasing as i } from "../../animation/easing.js";
5
+ import { resolveMotion as a } from "../../animation/motion.js";
6
+ import { tweenNumber as o } from "../../animation/tween.js";
7
7
  import { areaPath as s, linePath as c, monotonePath as l, stepPath as u } from "../../svg/path.js";
8
- import { createScope as d, effect as f } from "@vielzeug/ripple";
9
8
  //#region src/charts/sparkline/sparkline.ts
10
- function p(e, t, n) {
9
+ function d(e, t, n) {
11
10
  if (e.length === 0) return [];
12
11
  let r = t / Math.max(1, e.length - 1), i = Math.min(...e), a = Math.max(...e) - i || 1;
13
12
  return e.map((e, t) => ({
@@ -15,62 +14,62 @@ function p(e, t, n) {
15
14
  y: n - (e - i) / a * n
16
15
  }));
17
16
  }
18
- function m(e, t, n, r = "linear") {
17
+ function f(e, t, n, r = "linear") {
19
18
  if (e.length === 0) return "";
20
- let i = p(e, t, n), a = i.map((e) => ({
19
+ let i = d(e, t, n), a = i.map((e) => ({
21
20
  x: e.x,
22
21
  y: n
23
22
  }));
24
23
  return s(i, a, r ?? "linear");
25
24
  }
26
- function h(e, t, n, r) {
25
+ function p(e, t, n, r) {
27
26
  if (e.length === 0) return "";
28
- let i = p(e, t, n);
27
+ let i = d(e, t, n);
29
28
  return r === "monotone" ? l(i) : r === "step" ? u(i) : c(i);
30
29
  }
31
- function g(a, o, s, c, l, u, d) {
32
- let f = o.length, p = Math.max(1, s / f - 1), m = s / f, h = Math.min(0, ...o), g = Math.max(...o) - h || 1, _ = t(u, 0), v = _.duration, y = e(_.easing);
33
- for (; a.children.length > f;) {
34
- let e = a.lastElementChild;
35
- e && a.removeChild(e);
30
+ function m(n, r, s, c, l, u, d) {
31
+ let f = r.length, p = Math.max(1, s / f - 1), m = s / f, h = Math.min(0, ...r), g = Math.max(...r) - h || 1, _ = a(u, 0), v = _.duration, y = i(_.easing);
32
+ for (; n.children.length > f;) {
33
+ let e = n.lastElementChild;
34
+ e && n.removeChild(e);
36
35
  }
37
- for (let e = 0; e < f; e++) {
38
- let t = Math.max(1, (o[e] - h) / g * c), s = c - t, u = a.children[e];
39
- if (u || (u = r("rect", { class: "prism-spark-bar" }), a.appendChild(u)), i(u, {
36
+ for (let i = 0; i < f; i++) {
37
+ let a = Math.max(1, (r[i] - h) / g * c), s = c - a, u = n.children[i];
38
+ if (u || (u = e("rect", { class: "prism-spark-bar" }), n.appendChild(u)), t(u, {
40
39
  fill: l,
41
40
  width: p,
42
- x: e * m
41
+ x: i * m
43
42
  }), v > 0 && !u.hasAttribute("data-init")) {
44
- u.setAttribute("data-init", "1"), i(u, {
43
+ u.setAttribute("data-init", "1"), t(u, {
45
44
  height: 0,
46
45
  y: c
47
46
  });
48
- let e = null, r = {
47
+ let e = null, n = {
49
48
  h: 0,
50
49
  y: c
51
- }, a = {
52
- h: t,
50
+ }, r = {
51
+ h: a,
53
52
  y: s
54
- }, o = (t) => {
53
+ }, i = (a) => {
55
54
  if (d?.aborted) return;
56
- e === null && (e = t);
57
- let s = y(Math.min(1, (t - e) / v));
58
- i(u, {
59
- height: n(r.h, a.h, s),
60
- y: n(r.y, a.y, s)
61
- }), s < 1 && requestAnimationFrame(o);
55
+ e === null && (e = a);
56
+ let s = y(Math.min(1, (a - e) / v));
57
+ t(u, {
58
+ height: o(n.h, r.h, s),
59
+ y: o(n.y, r.y, s)
60
+ }), s < 1 && requestAnimationFrame(i);
62
61
  };
63
- requestAnimationFrame(o);
64
- } else u.setAttribute("data-init", "1"), i(u, {
65
- height: t,
62
+ requestAnimationFrame(i);
63
+ } else u.setAttribute("data-init", "1"), t(u, {
64
+ height: a,
66
65
  y: s
67
66
  });
68
67
  }
69
68
  }
70
- function _(e) {
69
+ function h(e) {
71
70
  return e.length > 0 && e[0] !== null && typeof e[0] == "object";
72
71
  }
73
- function v(e, t, n, r, i, a, o) {
72
+ function g(e, t, n, r, i, a, o) {
74
73
  let s = Math.min(i, n / 2, r / 2), c = a ? s : 0, l = a ? s : 0, u = o ? s : 0, d = o ? s : 0;
75
74
  return [
76
75
  `M${e + c},${t}`,
@@ -85,109 +84,109 @@ function v(e, t, n, r, i, a, o) {
85
84
  "Z"
86
85
  ].filter(Boolean).join("");
87
86
  }
88
- function y(e) {
87
+ function _(e) {
89
88
  return `var(--prism-color-${e % 8 + 1})`;
90
89
  }
91
- function b(e, t) {
92
- let n = t.variant ?? "line", s = t.color ?? "var(--prism-color-1)", c = t.curve ?? "linear", l = t.strokeWidth ?? 1.5, u = t.fillOpacity ?? .2, p = o(t.data), b = a(e, {
93
- ...t.a11y ? { a11y: t.a11y } : { ariaHidden: !0 },
90
+ function v(i, a) {
91
+ let o = a.variant ?? "line", s = a.color ?? "var(--prism-color-1)", c = a.curve ?? "linear", l = a.strokeWidth ?? 1.5, u = a.fillOpacity ?? .2, d = a.data, v = r(i, {
92
+ a11y: a.a11y,
94
93
  margin: {
95
94
  bottom: 0,
96
95
  left: 0,
97
96
  right: 0,
98
97
  top: 0
99
98
  }
100
- }), { svg: x } = b;
101
- x.classList.add("prism-sparkline");
102
- let S = r("g", { class: "prism-spark-inner" });
103
- x.appendChild(S);
104
- let C;
105
- function w() {
106
- let { height: e, width: a } = b.dimensions.value, o = p.value;
107
- for (; S.firstChild;) S.removeChild(S.firstChild);
108
- if (o.length !== 0) {
109
- if (n === "stack" && _(o)) {
110
- let n = r("g", { class: "prism-spark-stack" });
111
- S.appendChild(n);
112
- let s = t.cornerRadius ?? 4, c = o, l = c.reduce((e, t) => e + Math.max(0, t.value), 0);
113
- if (l > 0) {
114
- let o = (t.padPixels ?? 0) / 2, u = 0;
115
- c.forEach((t, d) => {
99
+ }, S), { svg: y } = v;
100
+ y.classList.add("prism-sparkline");
101
+ let b = e("g", { class: "prism-spark-inner" });
102
+ y.appendChild(b);
103
+ let x;
104
+ function S() {
105
+ let { height: n, width: r } = v.dimensions;
106
+ for (; b.firstChild;) b.removeChild(b.firstChild);
107
+ if (d.length !== 0) {
108
+ if (o === "stack" && h(d)) {
109
+ let i = e("g", { class: "prism-spark-stack" });
110
+ b.appendChild(i);
111
+ let o = a.cornerRadius ?? 4, s = d, c = s.reduce((e, t) => e + Math.max(0, t.value), 0);
112
+ if (c > 0) {
113
+ let l = (a.padPixels ?? 0) / 2, u = 0;
114
+ s.forEach((a, d) => {
116
115
  let f = Math.round(u);
117
- u += Math.max(0, t.value) / l * a;
118
- let p = d === c.length - 1 ? a : Math.round(u), m = d === 0, h = d === c.length - 1, g = v(f + (m ? 0 : o), 0, Math.max(0, p - f - (m ? 0 : o) - (h ? 0 : o)), e, s, m, h), _ = r("path", { class: "prism-spark-stack-segment" });
119
- i(_, {
120
- d: g,
121
- fill: t.color ?? y(d)
122
- }), n.appendChild(_);
116
+ u += Math.max(0, a.value) / c * r;
117
+ let p = d === s.length - 1 ? r : Math.round(u), m = d === 0, h = d === s.length - 1, v = g(f + (m ? 0 : l), 0, Math.max(0, p - f - (m ? 0 : l) - (h ? 0 : l)), n, o, m, h), y = e("path", { class: "prism-spark-stack-segment" });
118
+ t(y, {
119
+ d: v,
120
+ fill: a.color ?? _(d)
121
+ }), i.appendChild(y);
123
122
  });
124
123
  }
125
- } else if (n === "bar") {
126
- let n = r("g", { class: "prism-spark-bars" });
127
- S.appendChild(n), g(n, o, a, e, s, t.transition, E.signal);
124
+ } else if (o === "bar") {
125
+ let t = e("g", { class: "prism-spark-bars" });
126
+ b.appendChild(t), m(t, d, r, n, s, a.transition, w.signal);
128
127
  } else {
129
- if (n === "area") {
130
- let t = r("path", { class: "prism-spark-fill" }), n = m(o, a, e, c);
131
- i(t, {
132
- d: n,
128
+ if (o === "area") {
129
+ let i = e("path", { class: "prism-spark-fill" }), a = f(d, r, n, c);
130
+ t(i, {
131
+ d: a,
133
132
  fill: s,
134
133
  "fill-opacity": u,
135
134
  stroke: "none"
136
- }), S.appendChild(t);
135
+ }), b.appendChild(i);
137
136
  }
138
- let t = r("path", { class: "prism-spark-line" }), d = h(o, a, e, c);
139
- i(t, {
140
- d,
137
+ let i = e("path", { class: "prism-spark-line" }), a = p(d, r, n, c);
138
+ t(i, {
139
+ d: a,
141
140
  fill: "none",
142
141
  stroke: s,
143
142
  "stroke-width": l
144
- }), S.appendChild(t);
143
+ }), b.appendChild(i);
145
144
  }
146
- _(o) || T(o);
145
+ h(d) || C(d);
147
146
  }
148
147
  }
149
- function T(e) {
150
- if (C?.(), C = void 0, !t.onHover && !t.onClick || e.length <= 1) return;
151
- let { width: n } = b.dimensions.value;
152
- x.style.cursor = "crosshair";
153
- let r = n / (e.length - 1), i = (n) => {
154
- let i = x.getBoundingClientRect(), a = n.clientX - i.left, o = Math.max(0, Math.min(e.length - 1, Math.round(a / r)));
155
- t.onHover?.(o, e[o]);
156
- }, a = () => t.onHover?.(null, null), o = (n) => {
157
- if (!t.onClick) return;
158
- let i = x.getBoundingClientRect(), a = n.clientX - i.left, o = Math.max(0, Math.min(e.length - 1, Math.round(a / r)));
159
- t.onClick(o, e[o]);
148
+ function C(e) {
149
+ if (x?.(), x = void 0, !a.onHover && !a.onClick || e.length <= 1) return;
150
+ let { width: t } = v.dimensions;
151
+ y.style.cursor = "crosshair";
152
+ let n = t / (e.length - 1), r = (t) => {
153
+ let r = y.getBoundingClientRect(), i = t.clientX - r.left, o = Math.max(0, Math.min(e.length - 1, Math.round(i / n)));
154
+ a.onHover?.(o, e[o]);
155
+ }, i = () => a.onHover?.(null, null), o = (t) => {
156
+ if (!a.onClick) return;
157
+ let r = y.getBoundingClientRect(), i = t.clientX - r.left, o = Math.max(0, Math.min(e.length - 1, Math.round(i / n)));
158
+ a.onClick(o, e[o]);
160
159
  };
161
- x.addEventListener("mousemove", i), x.addEventListener("mouseleave", a), x.addEventListener("click", o), C = () => {
162
- x.removeEventListener("mousemove", i), x.removeEventListener("mouseleave", a), x.removeEventListener("click", o);
160
+ y.addEventListener("mousemove", r), y.addEventListener("mouseleave", i), y.addEventListener("click", o), x = () => {
161
+ y.removeEventListener("mousemove", r), y.removeEventListener("mouseleave", i), y.removeEventListener("click", o);
163
162
  };
164
163
  }
165
- let E = new AbortController(), D = d(), O = !1;
164
+ let w = new AbortController(), T = !1;
166
165
  try {
167
- return D.run(() => {
168
- f(() => {
169
- w();
170
- }, { scheduler: "microtask" });
171
- }), {
166
+ return S(), {
172
167
  get disposalSignal() {
173
- return E.signal;
168
+ return w.signal;
174
169
  },
175
170
  dispose() {
176
- O || (O = !0, E.abort(), C?.(), D.dispose(), b.dispose());
171
+ T || (T = !0, w.abort(), x?.(), v.dispose());
177
172
  },
178
173
  get disposed() {
179
- return O;
174
+ return T;
175
+ },
176
+ el: y,
177
+ update(e) {
178
+ if (T) throw new n("Cannot update a disposed chart.");
179
+ d = e, S();
180
180
  },
181
- el: x,
182
181
  [Symbol.dispose]() {
183
182
  this.dispose();
184
183
  }
185
184
  };
186
185
  } catch (e) {
187
- throw E.abort(), D.dispose(), b.dispose(), e;
186
+ throw w.abort(), x?.(), v.dispose(), e instanceof n ? e : new n("Failed to render chart.", { cause: e });
188
187
  }
189
188
  }
190
189
  //#endregion
191
- export { b as createSparkline };
190
+ export { v as createSparkline };
192
191
 
193
192
  //# sourceMappingURL=sparkline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sparkline.js","names":[],"sources":["../../../src/charts/sparkline/sparkline.ts"],"sourcesContent":["import { createScope, effect } from '@vielzeug/ripple';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { tweenNumber } from '../../animation/tween';\nimport { createChartBase } from '../../core/chart-base';\nimport { resolveMaybeSignal } from '../../core/resolve';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ChartHandle, SparklineConfig, StackSegment } from '../../types';\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 buildAreaPath(\n data: number[],\n width: number,\n height: number,\n curve: SparklineConfig['curve'] = 'linear',\n): string {\n if (data.length === 0) return '';\n\n const top = buildTopPoints(data, width, height);\n const bottom = top.map((p) => ({ x: p.x, y: height }));\n\n return areaPath(top, bottom, curve ?? 'linear');\n}\n\nfunction buildPath(data: number[], width: number, height: number, curve: SparklineConfig['curve']): string {\n if (data.length === 0) return '';\n\n const points = buildTopPoints(data, width, height);\n\n return curve === 'monotone' ? monotonePath(points) : curve === 'step' ? stepPath(points) : linePath(points);\n}\n\nfunction renderSparkBars(\n parent: SVGGElement,\n data: number[],\n width: number,\n height: number,\n color: string,\n transition?: SparklineConfig['transition'],\n disposalSignal?: AbortSignal,\n): void {\n const count = data.length;\n const barW = Math.max(1, width / count - 1);\n const gap = width / count;\n const min = Math.min(0, ...data);\n const max = Math.max(...data);\n const yRange = max - min || 1;\n const motion = resolveMotion(transition, 0);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n while (parent.children.length > count) {\n const last = parent.lastElementChild;\n\n if (last) parent.removeChild(last);\n }\n\n for (let i = 0; i < count; i++) {\n const finalH = Math.max(1, ((data[i] - min) / yRange) * height);\n const finalY = height - finalH;\n\n let rect = parent.children[i] as SVGRectElement | undefined;\n\n if (!rect) {\n rect = createSvgElement('rect', { class: 'prism-spark-bar' });\n parent.appendChild(rect);\n }\n\n setAttributes(rect, { fill: color, width: barW, x: i * gap });\n\n if (dur > 0 && !rect.hasAttribute('data-init')) {\n rect.setAttribute('data-init', '1');\n setAttributes(rect, { height: 0, y: height });\n\n let start: number | null = null;\n const from = { h: 0, y: height };\n const to = { h: finalH, y: finalY };\n\n const frame = (ts: number) => {\n if (disposalSignal?.aborted) return;\n\n if (start === null) start = ts;\n\n const t = easing(Math.min(1, (ts - start) / dur));\n\n setAttributes(rect!, {\n height: tweenNumber(from.h, to.h, t),\n y: tweenNumber(from.y, to.y, t),\n });\n\n if (t < 1) requestAnimationFrame(frame);\n };\n\n requestAnimationFrame(frame);\n } else {\n rect.setAttribute('data-init', '1');\n setAttributes(rect, { height: finalH, y: finalY });\n }\n }\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(container: HTMLElement, config: SparklineConfig): ChartHandle {\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 ?? 0.2;\n const dataSignal = resolveMaybeSignal(config.data);\n\n const base = createChartBase(container, {\n ...(config.a11y ? { a11y: config.a11y } : { ariaHidden: true }),\n margin: { bottom: 0, left: 0, right: 0, top: 0 },\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 function renderAll(): void {\n const { height: h, width: w } = base.dimensions.value;\n const data = dataSignal.value;\n\n while (innerGroup.firstChild) innerGroup.removeChild(innerGroup.firstChild);\n\n if (data.length === 0) return;\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\n if (total > 0) {\n const half = (config.padPixels ?? 0) / 2;\n let xAcc = 0;\n\n segs.forEach((seg, i) => {\n const xStart = Math.round(xAcc);\n\n xAcc += (Math.max(0, seg.value) / total) * w;\n\n const xEnd = i === segs.length - 1 ? w : Math.round(xAcc);\n const isFirst = i === 0;\n const isLast = i === segs.length - 1;\n const drawX = xStart + (isFirst ? 0 : half);\n const drawW = Math.max(0, xEnd - xStart - (isFirst ? 0 : half) - (isLast ? 0 : half));\n const d = buildRoundedStackRect(drawX, 0, drawW, h, cornerRadius, isFirst, isLast);\n const path = createSvgElement('path', { class: 'prism-spark-stack-segment' });\n\n setAttributes(path, { d, fill: seg.color ?? defaultStackColor(i) });\n stackGroup.appendChild(path);\n });\n }\n } else if (variant === 'bar') {\n const barsGroup = createSvgElement('g', { class: 'prism-spark-bars' });\n\n innerGroup.appendChild(barsGroup);\n renderSparkBars(barsGroup, data as number[], w, h, color, config.transition, ac.signal);\n } else {\n if (variant === 'area') {\n const fill = createSvgElement('path', { class: 'prism-spark-fill' });\n const fillD = buildAreaPath(data as number[], w, h, curve);\n\n setAttributes(fill, { d: fillD, fill: color, 'fill-opacity': fillOpacity, stroke: 'none' });\n innerGroup.appendChild(fill);\n }\n\n const path = createSvgElement('path', { class: 'prism-spark-line' });\n const pathD = buildPath(data as number[], w, h, curve);\n\n setAttributes(path, { d: pathD, fill: 'none', stroke: color, 'stroke-width': strokeWidth });\n innerGroup.appendChild(path);\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 { width: w } = base.dimensions.value;\n\n svg.style.cursor = 'crosshair';\n\n const xStep = w / (data.length - 1);\n\n const handleMove = (e: MouseEvent) => {\n const rect = svg.getBoundingClientRect();\n const relX = e.clientX - rect.left;\n const idx = Math.max(0, Math.min(data.length - 1, Math.round(relX / xStep)));\n\n config.onHover?.(idx, data[idx]);\n };\n\n const handleLeave = () => config.onHover?.(null, null);\n\n const handleClick = (e: MouseEvent) => {\n if (!config.onClick) return;\n\n const rect = svg.getBoundingClientRect();\n const relX = e.clientX - rect.left;\n const idx = Math.max(0, Math.min(data.length - 1, Math.round(relX / xStep)));\n\n config.onClick(idx, 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\n const scope = createScope();\n\n let isDisposed = false;\n\n try {\n scope.run(() => {\n effect(\n () => {\n renderAll();\n },\n { scheduler: 'microtask' },\n );\n });\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (isDisposed) return;\n\n isDisposed = true;\n ac.abort();\n cleanupInteraction?.();\n scope.dispose();\n base.dispose();\n },\n\n get disposed(): boolean {\n return isDisposed;\n },\n\n el: svg,\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n } catch (error) {\n ac.abort();\n scope.dispose();\n base.dispose();\n throw error;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sparkline.js","names":[],"sources":["../../../src/charts/sparkline/sparkline.ts"],"sourcesContent":["import { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { tweenNumber } from '../../animation/tween';\nimport { createChartBase } from '../../core/chart-base';\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, SparklineConfig, StackSegment } from '../../types';\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 buildAreaPath(\n data: number[],\n width: number,\n height: number,\n curve: SparklineConfig['curve'] = 'linear',\n): string {\n if (data.length === 0) return '';\n\n const top = buildTopPoints(data, width, height);\n const bottom = top.map((p) => ({ x: p.x, y: height }));\n\n return areaPath(top, bottom, curve ?? 'linear');\n}\n\nfunction buildPath(data: number[], width: number, height: number, curve: SparklineConfig['curve']): string {\n if (data.length === 0) return '';\n\n const points = buildTopPoints(data, width, height);\n\n return curve === 'monotone' ? monotonePath(points) : curve === 'step' ? stepPath(points) : linePath(points);\n}\n\nfunction renderSparkBars(\n parent: SVGGElement,\n data: number[],\n width: number,\n height: number,\n color: string,\n transition?: SparklineConfig['transition'],\n disposalSignal?: AbortSignal,\n): void {\n const count = data.length;\n const barW = Math.max(1, width / count - 1);\n const gap = width / count;\n const min = Math.min(0, ...data);\n const max = Math.max(...data);\n const yRange = max - min || 1;\n const motion = resolveMotion(transition, 0);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n while (parent.children.length > count) {\n const last = parent.lastElementChild;\n\n if (last) parent.removeChild(last);\n }\n\n for (let i = 0; i < count; i++) {\n const finalH = Math.max(1, ((data[i] - min) / yRange) * height);\n const finalY = height - finalH;\n\n let rect = parent.children[i] as SVGRectElement | undefined;\n\n if (!rect) {\n rect = createSvgElement('rect', { class: 'prism-spark-bar' });\n parent.appendChild(rect);\n }\n\n setAttributes(rect, { fill: color, width: barW, x: i * gap });\n\n if (dur > 0 && !rect.hasAttribute('data-init')) {\n rect.setAttribute('data-init', '1');\n setAttributes(rect, { height: 0, y: height });\n\n let start: number | null = null;\n const from = { h: 0, y: height };\n const to = { h: finalH, y: finalY };\n\n const frame = (ts: number) => {\n if (disposalSignal?.aborted) return;\n\n if (start === null) start = ts;\n\n const t = easing(Math.min(1, (ts - start) / dur));\n\n setAttributes(rect!, {\n height: tweenNumber(from.h, to.h, t),\n y: tweenNumber(from.y, to.y, t),\n });\n\n if (t < 1) requestAnimationFrame(frame);\n };\n\n requestAnimationFrame(frame);\n } else {\n rect.setAttribute('data-init', '1');\n setAttributes(rect, { height: finalH, y: finalY });\n }\n }\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 ?? 0.2;\n let data = config.data;\n\n const base = createChartBase(\n container,\n {\n a11y: config.a11y,\n margin: { bottom: 0, left: 0, right: 0, top: 0 },\n },\n renderAll,\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 function renderAll(): void {\n const { height: h, width: w } = base.dimensions;\n\n while (innerGroup.firstChild) innerGroup.removeChild(innerGroup.firstChild);\n\n if (data.length === 0) return;\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\n if (total > 0) {\n const half = (config.padPixels ?? 0) / 2;\n let xAcc = 0;\n\n segs.forEach((seg, i) => {\n const xStart = Math.round(xAcc);\n\n xAcc += (Math.max(0, seg.value) / total) * w;\n\n const xEnd = i === segs.length - 1 ? w : Math.round(xAcc);\n const isFirst = i === 0;\n const isLast = i === segs.length - 1;\n const drawX = xStart + (isFirst ? 0 : half);\n const drawW = Math.max(0, xEnd - xStart - (isFirst ? 0 : half) - (isLast ? 0 : half));\n const d = buildRoundedStackRect(drawX, 0, drawW, h, cornerRadius, isFirst, isLast);\n const path = createSvgElement('path', { class: 'prism-spark-stack-segment' });\n\n setAttributes(path, { d, fill: seg.color ?? defaultStackColor(i) });\n stackGroup.appendChild(path);\n });\n }\n } else if (variant === 'bar') {\n const barsGroup = createSvgElement('g', { class: 'prism-spark-bars' });\n\n innerGroup.appendChild(barsGroup);\n renderSparkBars(barsGroup, data as number[], w, h, color, config.transition, ac.signal);\n } else {\n if (variant === 'area') {\n const fill = createSvgElement('path', { class: 'prism-spark-fill' });\n const fillD = buildAreaPath(data as number[], w, h, curve);\n\n setAttributes(fill, { d: fillD, fill: color, 'fill-opacity': fillOpacity, stroke: 'none' });\n innerGroup.appendChild(fill);\n }\n\n const path = createSvgElement('path', { class: 'prism-spark-line' });\n const pathD = buildPath(data as number[], w, h, curve);\n\n setAttributes(path, { d: pathD, fill: 'none', stroke: color, 'stroke-width': strokeWidth });\n innerGroup.appendChild(path);\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 { width: w } = base.dimensions;\n\n svg.style.cursor = 'crosshair';\n\n const xStep = w / (data.length - 1);\n\n const handleMove = (e: MouseEvent) => {\n const rect = svg.getBoundingClientRect();\n const relX = e.clientX - rect.left;\n const idx = Math.max(0, Math.min(data.length - 1, Math.round(relX / xStep)));\n\n config.onHover?.(idx, data[idx]);\n };\n\n const handleLeave = () => config.onHover?.(null, null);\n\n const handleClick = (e: MouseEvent) => {\n if (!config.onClick) return;\n\n const rect = svg.getBoundingClientRect();\n const relX = e.clientX - rect.left;\n const idx = Math.max(0, Math.min(data.length - 1, Math.round(relX / xStep)));\n\n config.onClick(idx, 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 ac.abort();\n cleanupInteraction?.();\n base.dispose();\n },\n\n get disposed(): boolean {\n return isDisposed;\n },\n\n el: svg,\n\n update(next) {\n if (isDisposed) throw new PrismRenderError('Cannot update a disposed chart.');\n data = next;\n renderAll();\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n } catch (error) {\n ac.abort();\n cleanupInteraction?.();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require("../_dev.cjs");const e=require("../svg/element.cjs"),t=require("../errors.cjs"),n=require("./layout.cjs"),r=require("./responsive.cjs");let i=require("@vielzeug/ripple");function a(a,o){if(!(typeof a==`object`&&a&&a.nodeType===1&&typeof a.appendChild==`function`&&typeof a.getBoundingClientRect==`function`)){let e=a,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(o.margin),c=o.a11y,l=e.createSvgElement(`svg`,{...o.ariaHidden||c?.decorative?{"aria-hidden":`true`}:{...c?{"aria-label":c.ariaLabel,tabindex:`0`}:{},role:`img`},class:`prism-chart`,style:`display:block;width:100%;height:100%`}),u=e.createSvgElement(`g`,{class:`prism-chart-area`,transform:`translate(${s.left},${s.top})`});l.appendChild(u);let d=a.getBoundingClientRect();d.width===0||d.height;let f=typeof getComputedStyle<`u`?getComputedStyle(a):null;f&&f.position;let p=(0,i.signal)({height:d.height||300,margin:s,width:d.width||600}),m=r.observeResize(a,(t,n)=>{p.value={height:n,margin:s,width:t},e.setAttributes(l,{height:n,viewBox:`0 0 ${t} ${n}`,width:t})}),h=d.width||600,g=d.height||300;return e.setAttributes(l,{height:g,viewBox:`0 0 ${h} ${g}`,width:h}),a.appendChild(l),{chartArea:u,dimensions:p,dispose(){m(),l.remove()},svg:l}}exports.createChartBase=a;
1
+ require("../_dev.cjs");const e=require("../svg/element.cjs"),t=require("../errors.cjs"),n=require("./layout.cjs"),r=require("./responsive.cjs");function i(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;width:100%;height: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={height:d.height||300,margin:s,width:d.width||600},p=r.observeResize(i,(t,n)=>{f.height=n,f.width=t,e.setAttributes(l,{height:n,viewBox:`0 0 ${t} ${n}`,width:t}),o?.()}),m=d.width||600,h=d.height||300;return e.setAttributes(l,{height:h,viewBox:`0 0 ${m} ${h}`,width:m}),i.appendChild(l),{chartArea:u,dimensions:f,dispose(){p(),l.remove()},svg:l}}exports.createChartBase=i;
2
2
  //# sourceMappingURL=chart-base.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-base.cjs","names":[],"sources":["../../src/core/chart-base.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\nimport { signal } from '@vielzeug/ripple';\nimport { 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: Readable<ChartDimensions>;\n dispose(): void;\n svg: SVGSVGElement;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: { a11y?: ChartA11y; ariaHidden?: boolean; margin?: Partial<ChartMargin> },\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 ...(options.ariaHidden || a11y?.decorative\n ? { 'aria-hidden': 'true' }\n : {\n ...(a11y ? { 'aria-label': a11y.ariaLabel, tabindex: '0' } : {}),\n role: 'img',\n }),\n class: 'prism-chart',\n style: 'display:block;width:100%;height: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 computedStyle = typeof getComputedStyle !== 'undefined' ? getComputedStyle(container) : null;\n\n if (computedStyle && computedStyle.position === 'static') {\n warn(\n 'Chart container has position:static. Set position:relative (or absolute/fixed) on the container so tooltip and overlay elements are positioned correctly.',\n );\n }\n\n const dimensions = signal<ChartDimensions>({\n height: rect.height || 300,\n margin,\n width: rect.width || 600,\n });\n\n const stopObserving = observeResize(container, (width, height) => {\n dimensions.value = { height, margin, width };\n setAttributes(svg, { height, viewBox: `0 0 ${width} ${height}`, width });\n });\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\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 };\n}\n"],"mappings":"kLAiBA,SAAgB,EACd,EACA,EACW,CAaX,GAAI,EANF,OAAO,GAAc,UACrB,GACA,EAAU,WAAa,GACvB,OAAO,EAAU,aAAgB,YACjC,OAAO,EAAU,uBAA0B,YAEzB,CAClB,IAAM,EAAoB,EACpB,EACJ,IAAa,KACT,OACA,OAAO,GAAa,SACjB,EAAS,aAAa,MAAQ,SAC/B,OAAO,EAEf,MAAM,IAAI,EAAA,iBAAiB,8EAA8E,EAAK,EAAE,CAClH,CAEA,IAAM,EAAS,EAAA,cAAc,EAAQ,MAAM,EACrC,EAAO,EAAQ,KACf,EAAM,EAAA,iBAAiB,MAAO,CAClC,GAAI,EAAQ,YAAc,GAAM,WAC5B,CAAE,cAAe,MAAO,EACxB,CACE,GAAI,EAAO,CAAE,aAAc,EAAK,UAAW,SAAU,GAAI,EAAI,CAAC,EAC9D,KAAM,KACR,EACJ,MAAO,cACP,MAAO,sCACT,CAAC,EAEK,EAAiB,EAAA,iBAAiB,IAAK,CAC3C,MAAO,mBACP,UAAW,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI,EACpD,CAAC,EAED,EAAI,YAAY,CAAc,EAE9B,IAAM,EAAO,EAAU,sBAAsB,EAEzC,EAAK,QAAU,GAAK,EAAK,OAM7B,IAAM,EAAgB,OAAO,iBAAqB,IAAc,iBAAiB,CAAS,EAAI,KAE1F,GAAiB,EAAc,SAMnC,IAAM,GAAA,EAAa,EAAA,OAAA,CAAwB,CACzC,OAAQ,EAAK,QAAU,IACvB,SACA,MAAO,EAAK,OAAS,GACvB,CAAC,EAEK,EAAgB,EAAA,cAAc,GAAY,EAAO,IAAW,CAChE,EAAW,MAAQ,CAAE,SAAQ,SAAQ,OAAM,EAC3C,EAAA,cAAc,EAAK,CAAE,SAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,OAAM,CAAC,CACzE,CAAC,EAEK,EAAe,EAAK,OAAS,IAC7B,EAAgB,EAAK,QAAU,IAUrC,OARA,EAAA,cAAc,EAAK,CACjB,OAAQ,EACR,QAAS,OAAO,EAAa,GAAG,IAChC,MAAO,CACT,CAAC,EAED,EAAU,YAAY,CAAG,EAElB,CACL,UAAW,EACX,aACA,SAAU,CACR,EAAc,EACd,EAAI,OAAO,CACb,EACA,KACF,CACF"}
1
+ {"version":3,"file":"chart-base.cjs","names":[],"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}\n\nexport function createChartBase(\n container: HTMLElement,\n options: { a11y?: ChartA11y; margin?: Partial<ChartMargin> },\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 style: 'display:block;width:100%;height: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 dimensions: ChartDimensions = {\n height: rect.height || 300,\n margin,\n width: rect.width || 600,\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n dimensions.height = height;\n dimensions.width = width;\n setAttributes(svg, { height, viewBox: `0 0 ${width} ${height}`, width });\n onResize?.();\n });\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\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 };\n}\n"],"mappings":"gJAcA,SAAgB,EACd,EACA,EACA,EACW,CAaX,GAAI,EANF,OAAO,GAAc,UACrB,GACA,EAAU,WAAa,GACvB,OAAO,EAAU,aAAgB,YACjC,OAAO,EAAU,uBAA0B,YAEzB,CAClB,IAAM,EAAoB,EACpB,EACJ,IAAa,KACT,OACA,OAAO,GAAa,SACjB,EAAS,aAAa,MAAQ,SAC/B,OAAO,EAEf,MAAM,IAAI,EAAA,iBAAiB,8EAA8E,EAAK,EAAE,CAClH,CAEA,IAAM,EAAS,EAAA,cAAc,EAAQ,MAAM,EACrC,EAAO,EAAQ,KACf,EAAM,EAAA,iBAAiB,MAAO,CAClC,GAAI,CAAC,GAAQ,EAAK,WACd,CAAE,cAAe,MAAO,EACxB,CAAE,aAAc,EAAK,UAAW,KAAM,MAAO,SAAU,GAAI,EAC/D,MAAO,cACP,MAAO,sCACT,CAAC,EAEK,EAAiB,EAAA,iBAAiB,IAAK,CAC3C,MAAO,mBACP,UAAW,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI,EACpD,CAAC,EAED,EAAI,YAAY,CAAc,EAE9B,IAAM,EAAO,EAAU,sBAAsB,EAEzC,EAAK,QAAU,GAAK,EAAK,OAM7B,IAAM,EAA8B,CAClC,OAAQ,EAAK,QAAU,IACvB,SACA,MAAO,EAAK,OAAS,GACvB,EAEM,EAAgB,EAAA,cAAc,GAAY,EAAO,IAAW,CAChE,EAAW,OAAS,EACpB,EAAW,MAAQ,EACnB,EAAA,cAAc,EAAK,CAAE,SAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,OAAM,CAAC,EACvE,IAAW,CACb,CAAC,EAEK,EAAe,EAAK,OAAS,IAC7B,EAAgB,EAAK,QAAU,IAUrC,OARA,EAAA,cAAc,EAAK,CACjB,OAAQ,EACR,QAAS,OAAO,EAAa,GAAG,IAChC,MAAO,CACT,CAAC,EAED,EAAU,YAAY,CAAG,EAElB,CACL,UAAW,EACX,aACA,SAAU,CACR,EAAc,EACd,EAAI,OAAO,CACb,EACA,KACF,CACF"}
@@ -1,14 +1,12 @@
1
- import type { Readable } from '@vielzeug/ripple';
2
1
  import type { ChartA11y, ChartDimensions, ChartMargin } from '../types';
3
2
  export interface ChartBase {
4
3
  chartArea: SVGGElement;
5
- dimensions: Readable<ChartDimensions>;
4
+ dimensions: ChartDimensions;
6
5
  dispose(): void;
7
6
  svg: SVGSVGElement;
8
7
  }
9
8
  export declare function createChartBase(container: HTMLElement, options: {
10
9
  a11y?: ChartA11y;
11
- ariaHidden?: boolean;
12
10
  margin?: Partial<ChartMargin>;
13
- }): ChartBase;
11
+ }, onResize?: () => void): ChartBase;
14
12
  //# sourceMappingURL=chart-base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-base.d.ts","sourceRoot":"","sources":["../../src/core/chart-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMjD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIxE,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,IAAI,IAAI,CAAC;IAChB,GAAG,EAAE,aAAa,CAAC;CACpB;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CAAE,GACjF,SAAS,CA4FX"}
1
+ {"version":3,"file":"chart-base.d.ts","sourceRoot":"","sources":["../../src/core/chart-base.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIxE,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;IAChB,GAAG,EAAE,aAAa,CAAC;CACpB;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CAAE,EAC5D,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB,SAAS,CAmFX"}
@@ -3,20 +3,17 @@ import { createSvgElement as e, setAttributes as t } from "../svg/element.js";
3
3
  import { PrismRenderError as n } from "../errors.js";
4
4
  import { resolveMargin as r } from "./layout.js";
5
5
  import { observeResize as i } from "./responsive.js";
6
- import { signal as a } from "@vielzeug/ripple";
7
6
  //#region src/core/chart-base.ts
8
- function o(o, s) {
9
- if (!(typeof o == "object" && o && o.nodeType === 1 && typeof o.appendChild == "function" && typeof o.getBoundingClientRect == "function")) {
10
- let e = o, t = e === null ? "null" : typeof e == "object" ? e.constructor?.name ?? "object" : typeof e;
7
+ function a(a, o, s) {
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;
11
10
  throw new n(`Invalid chart configuration: \`container\` must be a DOM Element, received ${t}.`);
12
11
  }
13
- let c = r(s.margin), l = s.a11y, u = e("svg", {
14
- ...s.ariaHidden || l?.decorative ? { "aria-hidden": "true" } : {
15
- ...l ? {
16
- "aria-label": l.ariaLabel,
17
- tabindex: "0"
18
- } : {},
19
- role: "img"
12
+ let c = r(o.margin), l = o.a11y, u = e("svg", {
13
+ ...!l || l.decorative ? { "aria-hidden": "true" } : {
14
+ "aria-label": l.ariaLabel,
15
+ role: "img",
16
+ tabindex: "0"
20
17
  },
21
18
  class: "prism-chart",
22
19
  style: "display:block;width:100%;height:100%"
@@ -25,39 +22,33 @@ function o(o, s) {
25
22
  transform: `translate(${c.left},${c.top})`
26
23
  });
27
24
  u.appendChild(d);
28
- let f = o.getBoundingClientRect();
25
+ let f = a.getBoundingClientRect();
29
26
  f.width === 0 || f.height;
30
- let p = typeof getComputedStyle < "u" ? getComputedStyle(o) : null;
31
- p && p.position;
32
- let m = a({
27
+ let p = {
33
28
  height: f.height || 300,
34
29
  margin: c,
35
30
  width: f.width || 600
36
- }), h = i(o, (e, n) => {
37
- m.value = {
38
- height: n,
39
- margin: c,
40
- width: e
41
- }, t(u, {
31
+ }, m = i(a, (e, n) => {
32
+ p.height = n, p.width = e, t(u, {
42
33
  height: n,
43
34
  viewBox: `0 0 ${e} ${n}`,
44
35
  width: e
45
- });
46
- }), g = f.width || 600, _ = f.height || 300;
36
+ }), s?.();
37
+ }), h = f.width || 600, g = f.height || 300;
47
38
  return t(u, {
48
- height: _,
49
- viewBox: `0 0 ${g} ${_}`,
50
- width: g
51
- }), o.appendChild(u), {
39
+ height: g,
40
+ viewBox: `0 0 ${h} ${g}`,
41
+ width: h
42
+ }), a.appendChild(u), {
52
43
  chartArea: d,
53
- dimensions: m,
44
+ dimensions: p,
54
45
  dispose() {
55
- h(), u.remove();
46
+ m(), u.remove();
56
47
  },
57
48
  svg: u
58
49
  };
59
50
  }
60
51
  //#endregion
61
- export { o as createChartBase };
52
+ export { a as createChartBase };
62
53
 
63
54
  //# sourceMappingURL=chart-base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-base.js","names":[],"sources":["../../src/core/chart-base.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\nimport { signal } from '@vielzeug/ripple';\nimport { 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: Readable<ChartDimensions>;\n dispose(): void;\n svg: SVGSVGElement;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: { a11y?: ChartA11y; ariaHidden?: boolean; margin?: Partial<ChartMargin> },\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 ...(options.ariaHidden || a11y?.decorative\n ? { 'aria-hidden': 'true' }\n : {\n ...(a11y ? { 'aria-label': a11y.ariaLabel, tabindex: '0' } : {}),\n role: 'img',\n }),\n class: 'prism-chart',\n style: 'display:block;width:100%;height: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 computedStyle = typeof getComputedStyle !== 'undefined' ? getComputedStyle(container) : null;\n\n if (computedStyle && computedStyle.position === 'static') {\n warn(\n 'Chart container has position:static. Set position:relative (or absolute/fixed) on the container so tooltip and overlay elements are positioned correctly.',\n );\n }\n\n const dimensions = signal<ChartDimensions>({\n height: rect.height || 300,\n margin,\n width: rect.width || 600,\n });\n\n const stopObserving = observeResize(container, (width, height) => {\n dimensions.value = { height, margin, width };\n setAttributes(svg, { height, viewBox: `0 0 ${width} ${height}`, width });\n });\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\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 };\n}\n"],"mappings":";;;;;;;AAiBA,SAAgB,EACd,GACA,GACW;CAaX,IAAI,EANF,OAAO,KAAc,YACrB,KACA,EAAU,aAAa,KACvB,OAAO,EAAU,eAAgB,cACjC,OAAO,EAAU,yBAA0B,aAEzB;EAClB,IAAM,IAAoB,GACpB,IACJ,MAAa,OACT,SACA,OAAO,KAAa,WACjB,EAAS,aAAa,QAAQ,WAC/B,OAAO;EAEf,MAAM,IAAI,EAAiB,8EAA8E,EAAK,EAAE;CAClH;CAEA,IAAM,IAAS,EAAc,EAAQ,MAAM,GACrC,IAAO,EAAQ,MACf,IAAM,EAAiB,OAAO;EAClC,GAAI,EAAQ,cAAc,GAAM,aAC5B,EAAE,eAAe,OAAO,IACxB;GACE,GAAI,IAAO;IAAE,cAAc,EAAK;IAAW,UAAU;GAAI,IAAI,CAAC;GAC9D,MAAM;EACR;EACJ,OAAO;EACP,OAAO;CACT,CAAC,GAEK,IAAiB,EAAiB,KAAK;EAC3C,OAAO;EACP,WAAW,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI;CACpD,CAAC;CAED,EAAI,YAAY,CAAc;CAE9B,IAAM,IAAO,EAAU,sBAAsB;CAE7C,AAAI,EAAK,UAAU,KAAK,EAAK;CAM7B,IAAM,IAAgB,OAAO,mBAAqB,MAAc,iBAAiB,CAAS,IAAI;CAE9F,AAAI,KAAiB,EAAc;CAMnC,IAAM,IAAa,EAAwB;EACzC,QAAQ,EAAK,UAAU;EACvB;EACA,OAAO,EAAK,SAAS;CACvB,CAAC,GAEK,IAAgB,EAAc,IAAY,GAAO,MAAW;EAEhE,AADA,EAAW,QAAQ;GAAE;GAAQ;GAAQ;EAAM,GAC3C,EAAc,GAAK;GAAE;GAAQ,SAAS,OAAO,EAAM,GAAG;GAAU;EAAM,CAAC;CACzE,CAAC,GAEK,IAAe,EAAK,SAAS,KAC7B,IAAgB,EAAK,UAAU;CAUrC,OARA,EAAc,GAAK;EACjB,QAAQ;EACR,SAAS,OAAO,EAAa,GAAG;EAChC,OAAO;CACT,CAAC,GAED,EAAU,YAAY,CAAG,GAElB;EACL,WAAW;EACX;EACA,UAAU;GAER,AADA,EAAc,GACd,EAAI,OAAO;EACb;EACA;CACF;AACF"}
1
+ {"version":3,"file":"chart-base.js","names":[],"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}\n\nexport function createChartBase(\n container: HTMLElement,\n options: { a11y?: ChartA11y; margin?: Partial<ChartMargin> },\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 style: 'display:block;width:100%;height: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 dimensions: ChartDimensions = {\n height: rect.height || 300,\n margin,\n width: rect.width || 600,\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n dimensions.height = height;\n dimensions.width = width;\n setAttributes(svg, { height, viewBox: `0 0 ${width} ${height}`, width });\n onResize?.();\n });\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\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 };\n}\n"],"mappings":";;;;;;AAcA,SAAgB,EACd,GACA,GACA,GACW;CAaX,IAAI,EANF,OAAO,KAAc,YACrB,KACA,EAAU,aAAa,KACvB,OAAO,EAAU,eAAgB,cACjC,OAAO,EAAU,yBAA0B,aAEzB;EAClB,IAAM,IAAoB,GACpB,IACJ,MAAa,OACT,SACA,OAAO,KAAa,WACjB,EAAS,aAAa,QAAQ,WAC/B,OAAO;EAEf,MAAM,IAAI,EAAiB,8EAA8E,EAAK,EAAE;CAClH;CAEA,IAAM,IAAS,EAAc,EAAQ,MAAM,GACrC,IAAO,EAAQ,MACf,IAAM,EAAiB,OAAO;EAClC,GAAI,CAAC,KAAQ,EAAK,aACd,EAAE,eAAe,OAAO,IACxB;GAAE,cAAc,EAAK;GAAW,MAAM;GAAO,UAAU;EAAI;EAC/D,OAAO;EACP,OAAO;CACT,CAAC,GAEK,IAAiB,EAAiB,KAAK;EAC3C,OAAO;EACP,WAAW,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI;CACpD,CAAC;CAED,EAAI,YAAY,CAAc;CAE9B,IAAM,IAAO,EAAU,sBAAsB;CAE7C,AAAI,EAAK,UAAU,KAAK,EAAK;CAM7B,IAAM,IAA8B;EAClC,QAAQ,EAAK,UAAU;EACvB;EACA,OAAO,EAAK,SAAS;CACvB,GAEM,IAAgB,EAAc,IAAY,GAAO,MAAW;EAIhE,AAHA,EAAW,SAAS,GACpB,EAAW,QAAQ,GACnB,EAAc,GAAK;GAAE;GAAQ,SAAS,OAAO,EAAM,GAAG;GAAU;EAAM,CAAC,GACvE,IAAW;CACb,CAAC,GAEK,IAAe,EAAK,SAAS,KAC7B,IAAgB,EAAK,UAAU;CAUrC,OARA,EAAc,GAAK;EACjB,QAAQ;EACR,SAAS,OAAO,EAAa,GAAG;EAChC,OAAO;CACT,CAAC,GAED,EAAU,YAAY,CAAG,GAElB;EACL,WAAW;EACX;EACA,UAAU;GAER,AADA,EAAc,GACd,EAAI,OAAO;EACb;EACA;CACF;AACF"}
@@ -1,2 +1,2 @@
1
- require("../_dev.cjs");const e=require("../svg/element.cjs"),t=require("../interaction/legend.cjs"),n=require("../interaction/tooltip.cjs"),r=require("./chart-base.cjs");let i=require("@vielzeug/ripple");function a(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 o(e,a,o,c){let l=r.createChartBase(e,{a11y:a.a11y,margin:a.margin}),u=a.tooltip?n.createTooltip(e,a.tooltip):null,d=a.legend?t.createLegend(e,a.legend):null,f=new AbortController,p=o(l,u,d,f.signal),m=!1,h=s(l.svg),g=(0,i.createScope)();g.run(()=>{(0,i.effect)(()=>{m||h.attach(c(p))},{scheduler:`microtask`})});let _=[];if(a.plugins){let t={container:e,dimensions:l.dimensions,disposalSignal:f.signal,svg:l.svg};for(let e of a.plugins)try{e.install(t),_.push(e)}catch{}}return{get disposalSignal(){return f.signal},dispose(){if(!m){m=!0,f.abort(),h.detach();for(let e of _)try{e.dispose()}catch{}u?.dispose(),d?.dispose(),g.dispose(),l.dispose()}},get disposed(){return m},el:l.svg,[Symbol.dispose](){this.dispose()}}}function s(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 c(t,n,r){return o(t,n,(n,r,i,a)=>{let o={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(o.grid),n.chartArea.appendChild(o.xAxis),n.chartArea.appendChild(o.yAxis),n.chartArea.appendChild(o.series),{chartArea:n.chartArea,container:t,dimensions:n.dimensions,disposalSignal:a,groups:o,legend:i,svg:n.svg,tooltip:r}},r)}function l(e,t,n){return o(e,t,(t,n,r,i)=>({container:e,dimensions:t.dimensions,disposalSignal:i,legend:r,svg:t.svg,tooltip:n}),n)}exports.clearCartesianDom=a,exports.createChartScaffold=c,exports.createRadialScaffold=l;
1
+ const e=require("../svg/element.cjs"),t=require("../errors.cjs"),n=require("../interaction/legend.cjs"),r=require("../interaction/tooltip.cjs"),i=require("./chart-base.cjs");function a(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 o(e,a,o,c,l){let u=()=>{},d=i.createChartBase(e,{a11y:a.a11y,margin:a.margin},()=>u()),f=a.tooltip?r.createTooltip(e,a.tooltip):null,p=a.legend?n.createLegend(e,a.legend):null,m=new AbortController,h=o(d,f,p,m.signal),g=!1,_=s(d.svg);u=()=>{g||_.attach(c(h))};try{u()}catch(e){throw g=!0,m.abort(),_.detach(),f?.dispose(),p?.dispose(),d.dispose(),e instanceof t.PrismRenderError?e:new t.PrismRenderError(`Failed to render chart.`,{cause:e})}return{get disposalSignal(){return m.signal},dispose(){g||(g=!0,m.abort(),_.detach(),f?.dispose(),p?.dispose(),d.dispose())},get disposed(){return g},el:d.svg,update(e){if(g)throw new t.PrismRenderError(`Cannot update a disposed chart.`);l(e),u()},[Symbol.dispose](){this.dispose()}}}function s(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 c(t,n,r,i){return o(t,n,(n,r,i,a)=>{let o={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(o.grid),n.chartArea.appendChild(o.xAxis),n.chartArea.appendChild(o.yAxis),n.chartArea.appendChild(o.series),{chartArea:n.chartArea,container:t,dimensions:n.dimensions,disposalSignal:a,groups:o,legend:i,svg:n.svg,tooltip:r}},r,i)}function l(e,t,n,r){return o(e,t,(t,n,r,i)=>({container:e,dimensions:t.dimensions,disposalSignal:i,legend:r,svg:t.svg,tooltip:n}),n,r)}exports.clearCartesianDom=a,exports.createChartScaffold=c,exports.createRadialScaffold=l;
2
2
  //# sourceMappingURL=chart-scaffold.cjs.map