@vielzeug/prism 1.1.1

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 (273) hide show
  1. package/README.md +83 -0
  2. package/dist/_dev.cjs +2 -0
  3. package/dist/_dev.cjs.map +1 -0
  4. package/dist/_dev.d.ts +2 -0
  5. package/dist/_dev.d.ts.map +1 -0
  6. package/dist/_dev.js +12 -0
  7. package/dist/_dev.js.map +1 -0
  8. package/dist/animation/easing.cjs +2 -0
  9. package/dist/animation/easing.cjs.map +1 -0
  10. package/dist/animation/easing.d.ts +4 -0
  11. package/dist/animation/easing.d.ts.map +1 -0
  12. package/dist/animation/easing.js +14 -0
  13. package/dist/animation/easing.js.map +1 -0
  14. package/dist/animation/index.d.ts +6 -0
  15. package/dist/animation/index.d.ts.map +1 -0
  16. package/dist/animation/transition.cjs +2 -0
  17. package/dist/animation/transition.cjs.map +1 -0
  18. package/dist/animation/transition.d.ts +15 -0
  19. package/dist/animation/transition.d.ts.map +1 -0
  20. package/dist/animation/transition.js +28 -0
  21. package/dist/animation/transition.js.map +1 -0
  22. package/dist/animation/tween.cjs +2 -0
  23. package/dist/animation/tween.cjs.map +1 -0
  24. package/dist/animation/tween.d.ts +3 -0
  25. package/dist/animation/tween.d.ts.map +1 -0
  26. package/dist/animation/tween.js +8 -0
  27. package/dist/animation/tween.js.map +1 -0
  28. package/dist/axes/axis.cjs +2 -0
  29. package/dist/axes/axis.cjs.map +1 -0
  30. package/dist/axes/axis.d.ts +15 -0
  31. package/dist/axes/axis.d.ts.map +1 -0
  32. package/dist/axes/axis.js +60 -0
  33. package/dist/axes/axis.js.map +1 -0
  34. package/dist/axes/grid.cjs +2 -0
  35. package/dist/axes/grid.cjs.map +1 -0
  36. package/dist/axes/grid.d.ts +4 -0
  37. package/dist/axes/grid.d.ts.map +1 -0
  38. package/dist/axes/grid.js +30 -0
  39. package/dist/axes/grid.js.map +1 -0
  40. package/dist/axes/index.d.ts +3 -0
  41. package/dist/axes/index.d.ts.map +1 -0
  42. package/dist/axes/scale-utils.cjs +2 -0
  43. package/dist/axes/scale-utils.cjs.map +1 -0
  44. package/dist/axes/scale-utils.d.ts +17 -0
  45. package/dist/axes/scale-utils.d.ts.map +1 -0
  46. package/dist/axes/scale-utils.js +11 -0
  47. package/dist/axes/scale-utils.js.map +1 -0
  48. package/dist/axes/types.d.ts +2 -0
  49. package/dist/axes/types.d.ts.map +1 -0
  50. package/dist/charts/area/area-chart.cjs +2 -0
  51. package/dist/charts/area/area-chart.cjs.map +1 -0
  52. package/dist/charts/area/area-chart.d.ts +3 -0
  53. package/dist/charts/area/area-chart.d.ts.map +1 -0
  54. package/dist/charts/area/area-chart.js +58 -0
  55. package/dist/charts/area/area-chart.js.map +1 -0
  56. package/dist/charts/area/area-renderer.cjs +2 -0
  57. package/dist/charts/area/area-renderer.cjs.map +1 -0
  58. package/dist/charts/area/area-renderer.d.ts +14 -0
  59. package/dist/charts/area/area-renderer.d.ts.map +1 -0
  60. package/dist/charts/area/area-renderer.js +73 -0
  61. package/dist/charts/area/area-renderer.js.map +1 -0
  62. package/dist/charts/area/area-types.d.ts +2 -0
  63. package/dist/charts/area/area-types.d.ts.map +1 -0
  64. package/dist/charts/area/index.d.ts +2 -0
  65. package/dist/charts/area/index.d.ts.map +1 -0
  66. package/dist/charts/bar/bar-chart.cjs +2 -0
  67. package/dist/charts/bar/bar-chart.cjs.map +1 -0
  68. package/dist/charts/bar/bar-chart.d.ts +3 -0
  69. package/dist/charts/bar/bar-chart.d.ts.map +1 -0
  70. package/dist/charts/bar/bar-chart.js +151 -0
  71. package/dist/charts/bar/bar-chart.js.map +1 -0
  72. package/dist/charts/bar/bar-hit-test.cjs +2 -0
  73. package/dist/charts/bar/bar-hit-test.cjs.map +1 -0
  74. package/dist/charts/bar/bar-hit-test.d.ts +12 -0
  75. package/dist/charts/bar/bar-hit-test.d.ts.map +1 -0
  76. package/dist/charts/bar/bar-hit-test.js +29 -0
  77. package/dist/charts/bar/bar-hit-test.js.map +1 -0
  78. package/dist/charts/bar/bar-renderer.cjs +2 -0
  79. package/dist/charts/bar/bar-renderer.cjs.map +1 -0
  80. package/dist/charts/bar/bar-renderer.d.ts +19 -0
  81. package/dist/charts/bar/bar-renderer.d.ts.map +1 -0
  82. package/dist/charts/bar/bar-renderer.js +107 -0
  83. package/dist/charts/bar/bar-renderer.js.map +1 -0
  84. package/dist/charts/bar/bar-scale-context.d.ts +11 -0
  85. package/dist/charts/bar/bar-scale-context.d.ts.map +1 -0
  86. package/dist/charts/bar/bar-types.d.ts +2 -0
  87. package/dist/charts/bar/bar-types.d.ts.map +1 -0
  88. package/dist/charts/bar/index.d.ts +2 -0
  89. package/dist/charts/bar/index.d.ts.map +1 -0
  90. package/dist/charts/index.d.ts +6 -0
  91. package/dist/charts/index.d.ts.map +1 -0
  92. package/dist/charts/line/index.d.ts +2 -0
  93. package/dist/charts/line/index.d.ts.map +1 -0
  94. package/dist/charts/line/line-chart.cjs +2 -0
  95. package/dist/charts/line/line-chart.cjs.map +1 -0
  96. package/dist/charts/line/line-chart.d.ts +3 -0
  97. package/dist/charts/line/line-chart.d.ts.map +1 -0
  98. package/dist/charts/line/line-chart.js +59 -0
  99. package/dist/charts/line/line-chart.js.map +1 -0
  100. package/dist/charts/line/line-renderer.cjs +2 -0
  101. package/dist/charts/line/line-renderer.cjs.map +1 -0
  102. package/dist/charts/line/line-renderer.d.ts +15 -0
  103. package/dist/charts/line/line-renderer.d.ts.map +1 -0
  104. package/dist/charts/line/line-renderer.js +100 -0
  105. package/dist/charts/line/line-renderer.js.map +1 -0
  106. package/dist/charts/line/line-types.d.ts +2 -0
  107. package/dist/charts/line/line-types.d.ts.map +1 -0
  108. package/dist/charts/pie/index.d.ts +2 -0
  109. package/dist/charts/pie/index.d.ts.map +1 -0
  110. package/dist/charts/pie/pie-chart.cjs +2 -0
  111. package/dist/charts/pie/pie-chart.cjs.map +1 -0
  112. package/dist/charts/pie/pie-chart.d.ts +3 -0
  113. package/dist/charts/pie/pie-chart.d.ts.map +1 -0
  114. package/dist/charts/pie/pie-chart.js +156 -0
  115. package/dist/charts/pie/pie-chart.js.map +1 -0
  116. package/dist/charts/pie/pie-renderer.cjs +2 -0
  117. package/dist/charts/pie/pie-renderer.cjs.map +1 -0
  118. package/dist/charts/pie/pie-renderer.d.ts +23 -0
  119. package/dist/charts/pie/pie-renderer.d.ts.map +1 -0
  120. package/dist/charts/pie/pie-renderer.js +77 -0
  121. package/dist/charts/pie/pie-renderer.js.map +1 -0
  122. package/dist/charts/sparkline/index.d.ts +2 -0
  123. package/dist/charts/sparkline/index.d.ts.map +1 -0
  124. package/dist/charts/sparkline/sparkline.cjs +2 -0
  125. package/dist/charts/sparkline/sparkline.cjs.map +1 -0
  126. package/dist/charts/sparkline/sparkline.d.ts +3 -0
  127. package/dist/charts/sparkline/sparkline.d.ts.map +1 -0
  128. package/dist/charts/sparkline/sparkline.js +187 -0
  129. package/dist/charts/sparkline/sparkline.js.map +1 -0
  130. package/dist/core/cartesian-scales.cjs +2 -0
  131. package/dist/core/cartesian-scales.cjs.map +1 -0
  132. package/dist/core/cartesian-scales.d.ts +4 -0
  133. package/dist/core/cartesian-scales.d.ts.map +1 -0
  134. package/dist/core/cartesian-scales.js +54 -0
  135. package/dist/core/cartesian-scales.js.map +1 -0
  136. package/dist/core/chart-base.cjs +2 -0
  137. package/dist/core/chart-base.cjs.map +1 -0
  138. package/dist/core/chart-base.d.ts +14 -0
  139. package/dist/core/chart-base.d.ts.map +1 -0
  140. package/dist/core/chart-base.js +60 -0
  141. package/dist/core/chart-base.js.map +1 -0
  142. package/dist/core/chart-scaffold.cjs +2 -0
  143. package/dist/core/chart-scaffold.cjs.map +1 -0
  144. package/dist/core/chart-scaffold.d.ts +54 -0
  145. package/dist/core/chart-scaffold.d.ts.map +1 -0
  146. package/dist/core/chart-scaffold.js +104 -0
  147. package/dist/core/chart-scaffold.js.map +1 -0
  148. package/dist/core/index.d.ts +7 -0
  149. package/dist/core/index.d.ts.map +1 -0
  150. package/dist/core/layout.cjs +2 -0
  151. package/dist/core/layout.cjs.map +1 -0
  152. package/dist/core/layout.d.ts +7 -0
  153. package/dist/core/layout.d.ts.map +1 -0
  154. package/dist/core/layout.js +23 -0
  155. package/dist/core/layout.js.map +1 -0
  156. package/dist/core/responsive.cjs +2 -0
  157. package/dist/core/responsive.cjs.map +1 -0
  158. package/dist/core/responsive.d.ts +2 -0
  159. package/dist/core/responsive.d.ts.map +1 -0
  160. package/dist/core/responsive.js +20 -0
  161. package/dist/core/responsive.js.map +1 -0
  162. package/dist/devtools/index.d.ts +52 -0
  163. package/dist/devtools/index.d.ts.map +1 -0
  164. package/dist/devtools.cjs +2 -0
  165. package/dist/devtools.cjs.map +1 -0
  166. package/dist/devtools.js +19 -0
  167. package/dist/devtools.js.map +1 -0
  168. package/dist/errors.cjs +2 -0
  169. package/dist/errors.cjs.map +1 -0
  170. package/dist/errors.d.ts +16 -0
  171. package/dist/errors.d.ts.map +1 -0
  172. package/dist/errors.js +13 -0
  173. package/dist/errors.js.map +1 -0
  174. package/dist/index.cjs +1 -0
  175. package/dist/index.d.ts +19 -0
  176. package/dist/index.d.ts.map +1 -0
  177. package/dist/index.js +12 -0
  178. package/dist/interaction/crosshair.cjs +2 -0
  179. package/dist/interaction/crosshair.cjs.map +1 -0
  180. package/dist/interaction/crosshair.d.ts +13 -0
  181. package/dist/interaction/crosshair.d.ts.map +1 -0
  182. package/dist/interaction/crosshair.js +46 -0
  183. package/dist/interaction/crosshair.js.map +1 -0
  184. package/dist/interaction/events.cjs +2 -0
  185. package/dist/interaction/events.cjs.map +1 -0
  186. package/dist/interaction/events.d.ts +3 -0
  187. package/dist/interaction/events.d.ts.map +1 -0
  188. package/dist/interaction/events.js +12 -0
  189. package/dist/interaction/events.js.map +1 -0
  190. package/dist/interaction/hit-test.cjs +2 -0
  191. package/dist/interaction/hit-test.cjs.map +1 -0
  192. package/dist/interaction/hit-test.d.ts +3 -0
  193. package/dist/interaction/hit-test.d.ts.map +1 -0
  194. package/dist/interaction/hit-test.js +14 -0
  195. package/dist/interaction/hit-test.js.map +1 -0
  196. package/dist/interaction/index.d.ts +9 -0
  197. package/dist/interaction/index.d.ts.map +1 -0
  198. package/dist/interaction/legend.cjs +2 -0
  199. package/dist/interaction/legend.cjs.map +1 -0
  200. package/dist/interaction/legend.d.ts +12 -0
  201. package/dist/interaction/legend.d.ts.map +1 -0
  202. package/dist/interaction/legend.js +31 -0
  203. package/dist/interaction/legend.js.map +1 -0
  204. package/dist/interaction/series-interaction.cjs +2 -0
  205. package/dist/interaction/series-interaction.cjs.map +1 -0
  206. package/dist/interaction/series-interaction.d.ts +18 -0
  207. package/dist/interaction/series-interaction.d.ts.map +1 -0
  208. package/dist/interaction/series-interaction.js +58 -0
  209. package/dist/interaction/series-interaction.js.map +1 -0
  210. package/dist/interaction/tooltip.cjs +2 -0
  211. package/dist/interaction/tooltip.cjs.map +1 -0
  212. package/dist/interaction/tooltip.d.ts +10 -0
  213. package/dist/interaction/tooltip.d.ts.map +1 -0
  214. package/dist/interaction/tooltip.js +53 -0
  215. package/dist/interaction/tooltip.js.map +1 -0
  216. package/dist/prism.cjs +2 -0
  217. package/dist/prism.cjs.map +1 -0
  218. package/dist/prism.iife.js +2 -0
  219. package/dist/prism.iife.js.map +1 -0
  220. package/dist/prism.js +2 -0
  221. package/dist/prism.js.map +1 -0
  222. package/dist/scales/band.cjs +2 -0
  223. package/dist/scales/band.cjs.map +1 -0
  224. package/dist/scales/band.d.ts +3 -0
  225. package/dist/scales/band.d.ts.map +1 -0
  226. package/dist/scales/band.js +40 -0
  227. package/dist/scales/band.js.map +1 -0
  228. package/dist/scales/index.d.ts +4 -0
  229. package/dist/scales/index.d.ts.map +1 -0
  230. package/dist/scales/linear.cjs +2 -0
  231. package/dist/scales/linear.cjs.map +1 -0
  232. package/dist/scales/linear.d.ts +4 -0
  233. package/dist/scales/linear.d.ts.map +1 -0
  234. package/dist/scales/linear.js +44 -0
  235. package/dist/scales/linear.js.map +1 -0
  236. package/dist/scales/time.cjs +2 -0
  237. package/dist/scales/time.cjs.map +1 -0
  238. package/dist/scales/time.d.ts +4 -0
  239. package/dist/scales/time.d.ts.map +1 -0
  240. package/dist/scales/time.js +62 -0
  241. package/dist/scales/time.js.map +1 -0
  242. package/dist/scales/types.d.ts +19 -0
  243. package/dist/scales/types.d.ts.map +1 -0
  244. package/dist/svg/element.cjs +2 -0
  245. package/dist/svg/element.cjs.map +1 -0
  246. package/dist/svg/element.d.ts +4 -0
  247. package/dist/svg/element.d.ts.map +1 -0
  248. package/dist/svg/element.js +23 -0
  249. package/dist/svg/element.js.map +1 -0
  250. package/dist/svg/index.d.ts +5 -0
  251. package/dist/svg/index.d.ts.map +1 -0
  252. package/dist/svg/path.cjs +2 -0
  253. package/dist/svg/path.cjs.map +1 -0
  254. package/dist/svg/path.d.ts +9 -0
  255. package/dist/svg/path.d.ts.map +1 -0
  256. package/dist/svg/path.js +49 -0
  257. package/dist/svg/path.js.map +1 -0
  258. package/dist/svg/text.cjs +2 -0
  259. package/dist/svg/text.cjs.map +1 -0
  260. package/dist/svg/text.d.ts +7 -0
  261. package/dist/svg/text.d.ts.map +1 -0
  262. package/dist/svg/text.js +10 -0
  263. package/dist/svg/text.js.map +1 -0
  264. package/dist/theme/index.cjs +2 -0
  265. package/dist/theme/index.cjs.map +1 -0
  266. package/dist/theme/index.d.ts +6 -0
  267. package/dist/theme/index.d.ts.map +1 -0
  268. package/dist/theme/index.js +20 -0
  269. package/dist/theme/index.js.map +1 -0
  270. package/dist/theme/prism.css +342 -0
  271. package/dist/types.d.ts +204 -0
  272. package/dist/types.d.ts.map +1 -0
  273. package/package.json +79 -0
@@ -0,0 +1,156 @@
1
+ import { createSvgElement as e, setAttributes as t } from "../../svg/element.js";
2
+ import { createRadialScaffold as n } from "../../core/chart-scaffold.js";
3
+ import { seriesColor as r } from "../../theme/index.js";
4
+ import { resolveEasing as i } from "../../animation/easing.js";
5
+ import { tweenNumber as a } from "../../animation/tween.js";
6
+ import { arcCentroid as o, arcPath as s, computeArcs as c } from "./pie-renderer.js";
7
+ import { isReactive as l } from "@vielzeug/ripple";
8
+ //#region src/charts/pie/pie-chart.ts
9
+ var u = 2 * Math.PI, d = -Math.PI / 2, f = Math.PI / 2;
10
+ function p(e) {
11
+ return e === "semi" ? {
12
+ end: f,
13
+ start: d
14
+ } : {
15
+ end: u,
16
+ start: 0
17
+ };
18
+ }
19
+ function m(u, d) {
20
+ let f = d.variant ?? "pie", m = d.padPixels ?? (f === "pie" ? 0 : 8), g = d.cornerRadius ?? (f === "pie" ? 0 : 8), _ = e("circle", {
21
+ class: "prism-pie-bg",
22
+ "pointer-events": "none"
23
+ }), v = e("g", {
24
+ class: "prism-pie-slices",
25
+ "shape-rendering": "geometricPrecision"
26
+ }), y = e("g", {
27
+ class: "prism-pie-labels",
28
+ "pointer-events": "none"
29
+ }), b = [], x = null;
30
+ function S(n) {
31
+ for (; y.children.length > b.length;) y.removeChild(y.lastChild);
32
+ for (let r = 0; r < b.length; r++) {
33
+ let i = b[r], a = n[r];
34
+ if (!a?.label) continue;
35
+ let { x: s, y: c } = o(i), l = y.children[r];
36
+ l || (l = e("text", { class: "prism-pie-label" }), y.appendChild(l)), t(l, {
37
+ "dominant-baseline": "middle",
38
+ fill: "var(--prism-pie-label-color, #fff)",
39
+ "font-family": "var(--prism-font-family, system-ui)",
40
+ "font-size": "var(--prism-pie-label-size, 12px)",
41
+ "text-anchor": "middle",
42
+ x: s,
43
+ y: c
44
+ }), l.textContent = a.label;
45
+ }
46
+ }
47
+ let C = n(u, {
48
+ ariaLabel: d.ariaLabel,
49
+ legend: d.legend,
50
+ plugins: d.plugins,
51
+ tooltip: d.tooltip
52
+ }, (n) => {
53
+ let { legend: C, svg: w, tooltip: T } = n;
54
+ w.contains(_) || (w.appendChild(_), w.appendChild(v), w.appendChild(y));
55
+ let { height: E, width: D } = n.dimensions.value, O = f === "semi", k = D / 2, A = O ? E * .85 : E / 2, j = O ? Math.min(k, A) - 8 : Math.min(D, E) / 2 - 8, M = f === "pie" ? 0 : Math.round(j * .55), N = d.innerRadius === void 0 ? M : d.innerRadius, P = Math.max(N + 1, j), F = l(d.data) ? d.data.value : d.data, { end: I, start: L } = p(f);
56
+ for (b = c(F, k, A, P, N, L, I, m, g, (e) => r(e), !1), t(_, {
57
+ cx: k,
58
+ cy: A,
59
+ r: N > 0 ? N : 0
60
+ }), _.setAttribute("style", "fill:var(--prism-bg,#fff)"); v.children.length > b.length;) v.removeChild(v.lastChild);
61
+ for (; y.children.length > b.length;) y.removeChild(y.lastChild);
62
+ let R = d.transition?.duration ?? 400, z = i(d.transition?.easing);
63
+ for (let t = 0; t < b.length; t++) {
64
+ let n = b[t], r = v.children[t];
65
+ r || (r = e("path", { class: "prism-pie-slice" }), v.appendChild(r)), r.setAttribute("fill", n.color), r.setAttribute("stroke", "none"), r.style.cursor = d.onClick || d.onHover ? "pointer" : "";
66
+ }
67
+ if (x !== null && (cancelAnimationFrame(x), x = null), R > 0) {
68
+ let e = null, n = (r) => {
69
+ e === null && (e = r);
70
+ let i = z(Math.min(1, (r - e) / R)), o = a(L, I, i);
71
+ for (let e = 0; e < b.length; e++) {
72
+ let n = b[e], r = v.children[e];
73
+ if (r) if (o <= n.startAngle) t(r, { d: "" });
74
+ else {
75
+ let e = Math.min(n.endAngle, o);
76
+ t(r, { d: s({
77
+ ...n,
78
+ endAngle: e
79
+ }) });
80
+ }
81
+ }
82
+ i < 1 ? x = requestAnimationFrame(n) : (x = null, S(F));
83
+ };
84
+ x = requestAnimationFrame(n);
85
+ } else {
86
+ for (let e = 0; e < b.length; e++) {
87
+ let n = b[e], r = v.children[e];
88
+ r && t(r, { d: s(n) });
89
+ }
90
+ S(F);
91
+ }
92
+ return C?.update(b.map((e) => ({
93
+ color: e.color,
94
+ name: e.slice.label ?? ""
95
+ }))), T?.hide(), {
96
+ onClick: (e) => {
97
+ if (!d.onClick) return;
98
+ let t = w.getBoundingClientRect(), n = e.clientX - t.left, r = e.clientY - t.top, i = h(b, n, r, f);
99
+ i >= 0 && d.onClick(b[i].slice, i);
100
+ },
101
+ onMouseLeave: () => {
102
+ d.onHover?.(null, null), T?.hide();
103
+ },
104
+ onMouseMove: (e) => {
105
+ let t = w.getBoundingClientRect(), n = e.clientX - t.left, r = e.clientY - t.top, i = h(b, n, r, f);
106
+ if (i >= 0) {
107
+ let e = b[i];
108
+ d.onHover?.(e.slice, i);
109
+ let { x: n, y: r } = o(e), a = u.getBoundingClientRect();
110
+ T?.show(n + (t.left - a.left), r + (t.top - a.top), {
111
+ key: i,
112
+ value: e.slice.value
113
+ }, {
114
+ color: e.color,
115
+ data: [],
116
+ name: e.slice.label ?? ""
117
+ });
118
+ } else d.onHover?.(null, null), T?.hide();
119
+ }
120
+ };
121
+ });
122
+ return {
123
+ get disposalSignal() {
124
+ return C.disposalSignal;
125
+ },
126
+ dispose() {
127
+ x !== null && (cancelAnimationFrame(x), x = null), C.dispose();
128
+ },
129
+ get disposed() {
130
+ return C.disposed;
131
+ },
132
+ el: C.el,
133
+ [Symbol.dispose]() {
134
+ this.dispose();
135
+ }
136
+ };
137
+ }
138
+ function h(e, t, n, r) {
139
+ for (let i = 0; i < e.length; i++) {
140
+ let a = e[i], o = t - a.centerX, s = n - a.centerY, c = Math.sqrt(o * o + s * s);
141
+ if (c < a.outerRadius && c >= a.innerRadius) {
142
+ let e = Math.atan2(o, -s);
143
+ if (r === "semi") {
144
+ if (e >= a.startAngle - 1e-9 && e <= a.endAngle + 1e-9) return i;
145
+ } else {
146
+ let t = e < 0 ? e + u : e;
147
+ if (t >= a.startAngle - 1e-9 && t <= a.endAngle + 1e-9) return i;
148
+ }
149
+ }
150
+ }
151
+ return -1;
152
+ }
153
+ //#endregion
154
+ export { m as createPieChart };
155
+
156
+ //# sourceMappingURL=pie-chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-chart.js","names":[],"sources":["../../../src/charts/pie/pie-chart.ts"],"sourcesContent":["import { isReactive } from '@vielzeug/ripple';\n\nimport type { ChartEventHandlers } from '../../core/chart-scaffold';\nimport type { ChartHandle, PieChartConfig, PieSliceConfig } from '../../types';\n\nimport { resolveEasing } from '../../animation/easing';\nimport { tweenNumber } from '../../animation/tween';\nimport { createRadialScaffold } from '../../core/chart-scaffold';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport { type Arc, arcCentroid, arcPath, computeArcs } from './pie-renderer';\n\nconst TWO_PI = 2 * Math.PI;\n\nconst SEMI_START = -Math.PI / 2; // -90° = 9-o'clock (left)\nconst SEMI_END = Math.PI / 2; // +90° = 3-o'clock (right) → true 180° half-circle\n\nfunction semiAngles(variant: PieChartConfig['variant']): { end: number; start: number } {\n return variant === 'semi' ? { end: SEMI_END, start: SEMI_START } : { end: TWO_PI, start: 0 };\n}\n\nexport function createPieChart(container: HTMLElement, config: PieChartConfig): ChartHandle {\n const variant = config.variant ?? 'pie';\n const padPixels = config.padPixels ?? (variant === 'pie' ? 0 : 8);\n const cornerRadius = config.cornerRadius ?? (variant === 'pie' ? 0 : 8);\n\n // Pie SVG elements live directly on the SVG (not inside chartArea groups).\n // We create them once and reuse across renders.\n const bgCircle = createSvgElement('circle', { class: 'prism-pie-bg', 'pointer-events': 'none' });\n const pieGroup = createSvgElement('g', {\n class: 'prism-pie-slices',\n 'shape-rendering': 'geometricPrecision',\n });\n const labelGroup = createSvgElement('g', { class: 'prism-pie-labels', 'pointer-events': 'none' });\n\n // Current arcs shared between renderFn and event handlers via closure.\n let currentArcs: Arc[] = [];\n let activeRaf: number | null = null;\n\n function renderLabels(slices: PieSliceConfig[]): void {\n while (labelGroup.children.length > currentArcs.length) labelGroup.removeChild(labelGroup.lastChild!);\n\n for (let i = 0; i < currentArcs.length; i++) {\n const arc = currentArcs[i];\n const slice = slices[i];\n\n if (!slice?.label) continue;\n\n const { x, y } = arcCentroid(arc);\n let text = labelGroup.children[i] as SVGTextElement | undefined;\n\n if (!text) {\n text = createSvgElement('text', { class: 'prism-pie-label' });\n labelGroup.appendChild(text);\n }\n\n setAttributes(text, {\n 'dominant-baseline': 'middle',\n fill: 'var(--prism-pie-label-color, #fff)',\n 'font-family': 'var(--prism-font-family, system-ui)',\n 'font-size': 'var(--prism-pie-label-size, 12px)',\n 'text-anchor': 'middle',\n x,\n y,\n });\n\n text.textContent = slice.label;\n }\n }\n\n const handle = createRadialScaffold(\n container,\n { ariaLabel: config.ariaLabel, legend: config.legend, plugins: config.plugins, tooltip: config.tooltip },\n (ctx): ChartEventHandlers => {\n const { legend, svg, tooltip } = ctx;\n\n // Append pie groups to SVG on first render (idempotent).\n if (!svg.contains(bgCircle)) {\n svg.appendChild(bgCircle);\n svg.appendChild(pieGroup);\n svg.appendChild(labelGroup);\n }\n\n const { height: h, width: w } = ctx.dimensions.value;\n const isSemi = variant === 'semi';\n const cx = w / 2;\n const cy = isSemi ? h * 0.85 : h / 2;\n const padding = 8;\n const outer = isSemi ? Math.min(cx, cy) - padding : Math.min(w, h) / 2 - padding;\n const defaultInner = variant === 'pie' ? 0 : Math.round(outer * 0.55);\n const inner = config.innerRadius !== undefined ? config.innerRadius : defaultInner;\n const outerR = Math.max(inner + 1, outer);\n\n const slices = isReactive(config.data) ? config.data.value : config.data;\n const { end, start } = semiAngles(variant);\n\n currentArcs = computeArcs(\n slices,\n cx,\n cy,\n outerR,\n inner,\n start,\n end,\n padPixels,\n cornerRadius,\n (i) => seriesColor(i),\n false,\n );\n\n setAttributes(bgCircle, { cx, cy, r: inner > 0 ? inner : 0 });\n bgCircle.setAttribute('style', 'fill:var(--prism-bg,#fff)');\n\n while (pieGroup.children.length > currentArcs.length) pieGroup.removeChild(pieGroup.lastChild!);\n\n while (labelGroup.children.length > currentArcs.length) labelGroup.removeChild(labelGroup.lastChild!);\n\n const dur = config.transition?.duration ?? 400;\n const easing = resolveEasing(config.transition?.easing);\n\n for (let i = 0; i < currentArcs.length; i++) {\n const arc = currentArcs[i];\n let path = pieGroup.children[i] as SVGPathElement | undefined;\n\n if (!path) {\n path = createSvgElement('path', { class: 'prism-pie-slice' });\n pieGroup.appendChild(path);\n }\n\n path.setAttribute('fill', arc.color);\n path.setAttribute('stroke', 'none');\n path.style.cursor = config.onClick || config.onHover ? 'pointer' : '';\n }\n\n if (activeRaf !== null) {\n cancelAnimationFrame(activeRaf);\n activeRaf = null;\n }\n\n if (dur > 0) {\n let rafStart: number | null = null;\n\n const frame = (ts: number) => {\n if (rafStart === null) rafStart = ts;\n\n const t = easing(Math.min(1, (ts - rafStart) / dur));\n const revealAngle = tweenNumber(start, end, t);\n\n for (let j = 0; j < currentArcs.length; j++) {\n const a = currentArcs[j];\n const el = pieGroup.children[j] as SVGPathElement | undefined;\n\n if (!el) continue;\n\n if (revealAngle <= a.startAngle) {\n setAttributes(el, { d: '' });\n } else {\n const visibleEnd = Math.min(a.endAngle, revealAngle);\n\n setAttributes(el, { d: arcPath({ ...a, endAngle: visibleEnd }) });\n }\n }\n\n if (t < 1) {\n activeRaf = requestAnimationFrame(frame);\n } else {\n activeRaf = null;\n renderLabels(slices);\n }\n };\n\n activeRaf = requestAnimationFrame(frame);\n } else {\n for (let j = 0; j < currentArcs.length; j++) {\n const a = currentArcs[j];\n const el = pieGroup.children[j] as SVGPathElement | undefined;\n\n if (el) setAttributes(el, { d: arcPath(a) });\n }\n\n renderLabels(slices);\n }\n\n legend?.update(currentArcs.map((arc) => ({ color: arc.color, name: arc.slice.label ?? '' })));\n tooltip?.hide();\n\n const onMouseMove = (e: MouseEvent): void => {\n const svgRect = svg.getBoundingClientRect();\n const mx = e.clientX - svgRect.left;\n const my = e.clientY - svgRect.top;\n const hit = hitTestArc(currentArcs, mx, my, variant);\n\n if (hit >= 0) {\n const arc = currentArcs[hit];\n\n config.onHover?.(arc.slice, hit);\n\n const { x, y } = arcCentroid(arc);\n const contR = container.getBoundingClientRect();\n\n tooltip?.show(\n x + (svgRect.left - contR.left),\n y + (svgRect.top - contR.top),\n { key: hit, value: arc.slice.value },\n { color: arc.color, data: [], name: arc.slice.label ?? '' },\n );\n } else {\n config.onHover?.(null, null);\n tooltip?.hide();\n }\n };\n\n const onMouseLeave = (): void => {\n config.onHover?.(null, null);\n tooltip?.hide();\n };\n\n const onClick = (e: MouseEvent): void => {\n if (!config.onClick) return;\n\n const svgRect = svg.getBoundingClientRect();\n const mx = e.clientX - svgRect.left;\n const my = e.clientY - svgRect.top;\n const hit = hitTestArc(currentArcs, mx, my, variant);\n\n if (hit >= 0) config.onClick(currentArcs[hit].slice, hit);\n };\n\n return { onClick, onMouseLeave, onMouseMove };\n },\n );\n\n return {\n get disposalSignal(): AbortSignal {\n return handle.disposalSignal;\n },\n\n dispose() {\n if (activeRaf !== null) {\n cancelAnimationFrame(activeRaf);\n activeRaf = null;\n }\n\n handle.dispose();\n },\n\n get disposed(): boolean {\n return handle.disposed;\n },\n\n el: handle.el,\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n}\n\nfunction hitTestArc(arcs: Arc[], mx: number, my: number, variant: PieChartConfig['variant']): number {\n for (let i = 0; i < arcs.length; i++) {\n const arc = arcs[i];\n const dx = mx - arc.centerX;\n const dy = my - arc.centerY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < arc.outerRadius && dist >= arc.innerRadius) {\n const rawAngle = Math.atan2(dx, -dy);\n\n if (variant === 'semi') {\n if (rawAngle >= arc.startAngle - 1e-9 && rawAngle <= arc.endAngle + 1e-9) return i;\n } else {\n const angle = rawAngle < 0 ? rawAngle + TWO_PI : rawAngle;\n\n if (angle >= arc.startAngle - 1e-9 && angle <= arc.endAngle + 1e-9) return i;\n }\n }\n }\n\n return -1;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function e(e,t,n,r,i,a,o,s,c,l,u=!1){let d=e.reduce((e,t)=>e+Math.max(0,t.value),0);if(d===0)return[];let f=o-a,p=r>0?Math.asin(Math.min(1,s/2/r)):0,m=a,h=e.length;return e.map((e,a)=>{let o=Math.max(0,e.value)/d*f,s=m,g=m+o;m+=o;let _=Math.min(p,o/2);return{capEnd:u&&a===h-1,capStart:u&&a===0,centerX:t,centerY:n,color:e.color??l(a),cornerRadius:c,endAngle:g,index:a,innerRadius:i,outerRadius:r,padAngle:_,slice:e,startAngle:s}})}function t(e,t,n,r){return`${e+n*Math.sin(r)},${t-n*Math.cos(r)}`}function n(e,t,n){return e+t*Math.sin(n)}function r(e,t,n){return e-t*Math.cos(n)}function i(e){let{capEnd:i,capStart:a,centerX:o,centerY:s,cornerRadius:c,endAngle:l,innerRadius:u,outerRadius:d,padAngle:f,startAngle:p}=e,m=l-p;if(m<=0)return``;if(m>=2*Math.PI-1e-6){let e=p+Math.PI;return u<=0?`M${t(o,s,d,p)}A${d},${d},0,1,1,${t(o,s,d,e)}A${d},${d},0,1,1,${t(o,s,d,p)}Z`:[`M${t(o,s,d,p)}`,`A${d},${d},0,1,1,${t(o,s,d,e)}`,`A${d},${d},0,1,1,${t(o,s,d,p)}`,`M${t(o,s,u,p)}`,`A${u},${u},0,1,0,${t(o,s,u,e)}`,`A${u},${u},0,1,0,${t(o,s,u,p)}`,`Z`].join(``)}let h=a?p:p+f,g=i?l:l-f;if(g<=h)return``;let _=g-h;if(c<=0){let e=+(_>Math.PI);return u<=0?`M${o},${s}L${t(o,s,d,h)}A${d},${d},0,${e},1,${t(o,s,d,g)}Z`:[`M${t(o,s,d,h)}`,`A${d},${d},0,${e},1,${t(o,s,d,g)}`,`L${t(o,s,u,g)}`,`A${u},${u},0,${e},0,${t(o,s,u,h)}`,`Z`].join(``)}let v=Math.min(c/d,_/2),y=Math.min(c/u,_/2),b=Math.min(c,(d-u)/2),x=(d-u)/2,S=h+(a?0:v),C=g-(i?0:v),w=h+(a?0:y),T=g-(i?0:y),E=+(C-S>Math.PI),D=+(T-w>Math.PI),O=n(o,d,h),k=r(s,d,h),A=n(o,d,g),j=r(s,d,g),M=n(o,u,h),N=r(s,u,h),P=n(o,u,g),F=r(s,u,g),I=b/(d-u),L=`${O+(M-O)*I},${k+(N-k)*I}`,R=`${A+(P-A)*I},${j+(F-j)*I}`,z=`${M+(O-M)*I},${N+(k-N)*I}`,B=`${P+(A-P)*I},${F+(j-F)*I}`,V=[];return a?V.push(`M${t(o,s,d,h)}`):(V.push(`M${L}`),V.push(`Q${O},${k},${t(o,s,d,S)}`)),V.push(`A${d},${d},0,${E},1,${t(o,s,d,C)}`),i?V.push(`A${x},${x},0,0,1,${t(o,s,u,g)}`):(V.push(`Q${A},${j},${R}`),V.push(`L${B}`),V.push(`Q${P},${F},${t(o,s,u,T)}`)),V.push(`A${u},${u},0,${D},0,${t(o,s,u,w)}`),a?V.push(`A${x},${x},0,0,0,${t(o,s,d,h)}`):V.push(`Q${M},${N},${z}`),V.push(`Z`),V.join(``)}function a(e){let t=(e.startAngle+e.endAngle)/2,n=(e.outerRadius+e.innerRadius)/2;return{x:e.centerX+n*Math.sin(t),y:e.centerY-n*Math.cos(t)}}exports.arcCentroid=a,exports.arcPath=i,exports.computeArcs=e;
2
+ //# sourceMappingURL=pie-renderer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-renderer.cjs","names":[],"sources":["../../../src/charts/pie/pie-renderer.ts"],"sourcesContent":["import type { PieSliceConfig } from '../../types';\n\nexport interface Arc {\n capEnd: boolean;\n capStart: boolean;\n centerX: number;\n centerY: number;\n color: string;\n cornerRadius: number;\n endAngle: number;\n index: number;\n innerRadius: number;\n outerRadius: number;\n padAngle: number;\n slice: PieSliceConfig;\n startAngle: number;\n}\n\nexport function computeArcs(\n slices: PieSliceConfig[],\n cx: number,\n cy: number,\n outerRadius: number,\n innerRadius: number,\n startAngle: number,\n endAngle: number,\n padPixels: number,\n cornerRadius: number,\n defaultColors: (i: number) => string,\n capEnds = false,\n): Arc[] {\n const total = slices.reduce((s, d) => s + Math.max(0, d.value), 0);\n\n if (total === 0) return [];\n\n const range = endAngle - startAngle;\n const halfGapAngle = outerRadius > 0 ? Math.asin(Math.min(1, padPixels / 2 / outerRadius)) : 0;\n\n let currentAngle = startAngle;\n const n = slices.length;\n\n return slices.map((slice, i) => {\n const fraction = Math.max(0, slice.value) / total;\n const sliceRange = fraction * range;\n const rawStart = currentAngle;\n const rawEnd = currentAngle + sliceRange;\n\n currentAngle += sliceRange;\n\n const padAngle = Math.min(halfGapAngle, sliceRange / 2);\n\n return {\n capEnd: capEnds && i === n - 1,\n capStart: capEnds && i === 0,\n centerX: cx,\n centerY: cy,\n color: slice.color ?? defaultColors(i),\n cornerRadius,\n endAngle: rawEnd,\n index: i,\n innerRadius,\n outerRadius,\n padAngle,\n slice,\n startAngle: rawStart,\n };\n });\n}\n\n// Polar to cartesian, returns x,y string for SVG path\nfunction p(cx: number, cy: number, r: number, a: number): string {\n return `${cx + r * Math.sin(a)},${cy - r * Math.cos(a)}`;\n}\n\n// Cartesian x component\nfunction px(cx: number, r: number, a: number): number {\n return cx + r * Math.sin(a);\n}\n\n// Cartesian y component\nfunction py(cy: number, r: number, a: number): number {\n return cy - r * Math.cos(a);\n}\n\nexport function arcPath(arc: Arc): string {\n const {\n capEnd,\n capStart,\n centerX: cx,\n centerY: cy,\n cornerRadius: cr,\n endAngle,\n innerRadius,\n outerRadius,\n padAngle,\n startAngle,\n } = arc;\n\n const sweep = endAngle - startAngle;\n\n if (sweep <= 0) return '';\n\n // ── Full circle ─────────────────────────────────────────────────────────────\n if (sweep >= 2 * Math.PI - 1e-6) {\n const mid = startAngle + Math.PI;\n\n if (innerRadius <= 0) {\n return `M${p(cx, cy, outerRadius, startAngle)}A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, mid)}A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, startAngle)}Z`;\n }\n\n return [\n `M${p(cx, cy, outerRadius, startAngle)}`,\n `A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, mid)}`,\n `A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, startAngle)}`,\n `M${p(cx, cy, innerRadius, startAngle)}`,\n `A${innerRadius},${innerRadius},0,1,0,${p(cx, cy, innerRadius, mid)}`,\n `A${innerRadius},${innerRadius},0,1,0,${p(cx, cy, innerRadius, startAngle)}`,\n 'Z',\n ].join('');\n }\n\n // Cap ends don't get a padAngle inset (no adjacent slice on that side)\n const sa = capStart ? startAngle : startAngle + padAngle;\n const ea = capEnd ? endAngle : endAngle - padAngle;\n\n if (ea <= sa) return '';\n\n const paddedSweep = ea - sa;\n\n // ── No rounding ─────────────────────────────────────────────────────────────\n if (cr <= 0) {\n const large = paddedSweep > Math.PI ? 1 : 0;\n\n if (innerRadius <= 0) {\n return `M${cx},${cy}L${p(cx, cy, outerRadius, sa)}A${outerRadius},${outerRadius},0,${large},1,${p(cx, cy, outerRadius, ea)}Z`;\n }\n\n return [\n `M${p(cx, cy, outerRadius, sa)}`,\n `A${outerRadius},${outerRadius},0,${large},1,${p(cx, cy, outerRadius, ea)}`,\n `L${p(cx, cy, innerRadius, ea)}`,\n `A${innerRadius},${innerRadius},0,${large},0,${p(cx, cy, innerRadius, sa)}`,\n 'Z',\n ].join('');\n }\n\n // ── Rounded corners (or semicircle caps at open ends) ────────────────────────\n // Corner bezier pull amounts\n const outerPull = Math.min(cr / outerRadius, paddedSweep / 2);\n const innerPull = Math.min(cr / innerRadius, paddedSweep / 2);\n const radialPull = Math.min(cr, (outerRadius - innerRadius) / 2);\n const capR = (outerRadius - innerRadius) / 2; // semicircle cap radius\n\n // Shortened arc angles (for corners)\n const oS = sa + (capStart ? 0 : outerPull);\n const oE = ea - (capEnd ? 0 : outerPull);\n const iS = sa + (capStart ? 0 : innerPull);\n const iE = ea - (capEnd ? 0 : innerPull);\n\n const largeO = oE - oS > Math.PI ? 1 : 0;\n const largeI = iE - iS > Math.PI ? 1 : 0;\n\n // Unrounded corner cartesian positions (at full sa/ea, not shortened)\n const cxOs = px(cx, outerRadius, sa);\n const cyOs = py(cy, outerRadius, sa);\n const cxOe = px(cx, outerRadius, ea);\n const cyOe = py(cy, outerRadius, ea);\n const cxIs = px(cx, innerRadius, sa);\n const cyIs = py(cy, innerRadius, sa);\n const cxIe = px(cx, innerRadius, ea);\n const cyIe = py(cy, innerRadius, ea);\n\n const frac = radialPull / (outerRadius - innerRadius);\n const pOsRad = `${cxOs + (cxIs - cxOs) * frac},${cyOs + (cyIs - cyOs) * frac}`;\n const pOeRad = `${cxOe + (cxIe - cxOe) * frac},${cyOe + (cyIe - cyOe) * frac}`;\n const pIsRad = `${cxIs + (cxOs - cxIs) * frac},${cyIs + (cyOs - cyIs) * frac}`;\n const pIeRad = `${cxIe + (cxOe - cxIe) * frac},${cyIe + (cyOe - cyIe) * frac}`;\n\n const segs: string[] = [];\n\n // Start edge\n if (capStart) {\n segs.push(`M${p(cx, cy, outerRadius, sa)}`);\n } else {\n segs.push(`M${pOsRad}`);\n segs.push(`Q${cxOs},${cyOs},${p(cx, cy, outerRadius, oS)}`);\n }\n\n // Outer arc\n segs.push(`A${outerRadius},${outerRadius},0,${largeO},1,${p(cx, cy, outerRadius, oE)}`);\n\n // End edge\n if (capEnd) {\n // Semicircle cap from outer-end → inner-end, bulging away from center (CW)\n segs.push(`A${capR},${capR},0,0,1,${p(cx, cy, innerRadius, ea)}`);\n } else {\n segs.push(`Q${cxOe},${cyOe},${pOeRad}`);\n segs.push(`L${pIeRad}`);\n segs.push(`Q${cxIe},${cyIe},${p(cx, cy, innerRadius, iE)}`);\n }\n\n // Inner arc (reversed, CCW)\n segs.push(`A${innerRadius},${innerRadius},0,${largeI},0,${p(cx, cy, innerRadius, iS)}`);\n\n // Start edge close\n if (capStart) {\n // Semicircle cap from inner-start → outer-start, bulging away from center (CCW)\n segs.push(`A${capR},${capR},0,0,0,${p(cx, cy, outerRadius, sa)}`);\n } else {\n segs.push(`Q${cxIs},${cyIs},${pIsRad}`);\n }\n\n segs.push('Z');\n\n return segs.join('');\n}\n\nexport function arcCentroid(arc: Arc): { x: number; y: number } {\n const mid = (arc.startAngle + arc.endAngle) / 2;\n const r = (arc.outerRadius + arc.innerRadius) / 2;\n\n return {\n x: arc.centerX + r * Math.sin(mid),\n y: arc.centerY - r * Math.cos(mid),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { PieSliceConfig } from '../../types';
2
+ export interface Arc {
3
+ capEnd: boolean;
4
+ capStart: boolean;
5
+ centerX: number;
6
+ centerY: number;
7
+ color: string;
8
+ cornerRadius: number;
9
+ endAngle: number;
10
+ index: number;
11
+ innerRadius: number;
12
+ outerRadius: number;
13
+ padAngle: number;
14
+ slice: PieSliceConfig;
15
+ startAngle: number;
16
+ }
17
+ export declare function computeArcs(slices: PieSliceConfig[], cx: number, cy: number, outerRadius: number, innerRadius: number, startAngle: number, endAngle: number, padPixels: number, cornerRadius: number, defaultColors: (i: number) => string, capEnds?: boolean): Arc[];
18
+ export declare function arcPath(arc: Arc): string;
19
+ export declare function arcCentroid(arc: Arc): {
20
+ x: number;
21
+ y: number;
22
+ };
23
+ //# sourceMappingURL=pie-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-renderer.d.ts","sourceRoot":"","sources":["../../../src/charts/pie/pie-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,cAAc,EAAE,EACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EACpC,OAAO,UAAQ,GACd,GAAG,EAAE,CAqCP;AAiBD,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAmIxC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ9D"}
@@ -0,0 +1,77 @@
1
+ //#region src/charts/pie/pie-renderer.ts
2
+ function e(e, t, n, r, i, a, o, s, c, l, u = !1) {
3
+ let d = e.reduce((e, t) => e + Math.max(0, t.value), 0);
4
+ if (d === 0) return [];
5
+ let f = o - a, p = r > 0 ? Math.asin(Math.min(1, s / 2 / r)) : 0, m = a, h = e.length;
6
+ return e.map((e, a) => {
7
+ let o = Math.max(0, e.value) / d * f, s = m, g = m + o;
8
+ m += o;
9
+ let _ = Math.min(p, o / 2);
10
+ return {
11
+ capEnd: u && a === h - 1,
12
+ capStart: u && a === 0,
13
+ centerX: t,
14
+ centerY: n,
15
+ color: e.color ?? l(a),
16
+ cornerRadius: c,
17
+ endAngle: g,
18
+ index: a,
19
+ innerRadius: i,
20
+ outerRadius: r,
21
+ padAngle: _,
22
+ slice: e,
23
+ startAngle: s
24
+ };
25
+ });
26
+ }
27
+ function t(e, t, n, r) {
28
+ return `${e + n * Math.sin(r)},${t - n * Math.cos(r)}`;
29
+ }
30
+ function n(e, t, n) {
31
+ return e + t * Math.sin(n);
32
+ }
33
+ function r(e, t, n) {
34
+ return e - t * Math.cos(n);
35
+ }
36
+ function i(e) {
37
+ let { capEnd: i, capStart: a, centerX: o, centerY: s, cornerRadius: c, endAngle: l, innerRadius: u, outerRadius: d, padAngle: f, startAngle: p } = e, m = l - p;
38
+ if (m <= 0) return "";
39
+ if (m >= 2 * Math.PI - 1e-6) {
40
+ let e = p + Math.PI;
41
+ return u <= 0 ? `M${t(o, s, d, p)}A${d},${d},0,1,1,${t(o, s, d, e)}A${d},${d},0,1,1,${t(o, s, d, p)}Z` : [
42
+ `M${t(o, s, d, p)}`,
43
+ `A${d},${d},0,1,1,${t(o, s, d, e)}`,
44
+ `A${d},${d},0,1,1,${t(o, s, d, p)}`,
45
+ `M${t(o, s, u, p)}`,
46
+ `A${u},${u},0,1,0,${t(o, s, u, e)}`,
47
+ `A${u},${u},0,1,0,${t(o, s, u, p)}`,
48
+ "Z"
49
+ ].join("");
50
+ }
51
+ let h = a ? p : p + f, g = i ? l : l - f;
52
+ if (g <= h) return "";
53
+ let _ = g - h;
54
+ if (c <= 0) {
55
+ let e = +(_ > Math.PI);
56
+ return u <= 0 ? `M${o},${s}L${t(o, s, d, h)}A${d},${d},0,${e},1,${t(o, s, d, g)}Z` : [
57
+ `M${t(o, s, d, h)}`,
58
+ `A${d},${d},0,${e},1,${t(o, s, d, g)}`,
59
+ `L${t(o, s, u, g)}`,
60
+ `A${u},${u},0,${e},0,${t(o, s, u, h)}`,
61
+ "Z"
62
+ ].join("");
63
+ }
64
+ let v = Math.min(c / d, _ / 2), y = Math.min(c / u, _ / 2), b = Math.min(c, (d - u) / 2), x = (d - u) / 2, S = h + (a ? 0 : v), C = g - (i ? 0 : v), w = h + (a ? 0 : y), T = g - (i ? 0 : y), E = +(C - S > Math.PI), D = +(T - w > Math.PI), O = n(o, d, h), k = r(s, d, h), A = n(o, d, g), j = r(s, d, g), M = n(o, u, h), N = r(s, u, h), P = n(o, u, g), F = r(s, u, g), I = b / (d - u), L = `${O + (M - O) * I},${k + (N - k) * I}`, R = `${A + (P - A) * I},${j + (F - j) * I}`, z = `${M + (O - M) * I},${N + (k - N) * I}`, B = `${P + (A - P) * I},${F + (j - F) * I}`, V = [];
65
+ return a ? V.push(`M${t(o, s, d, h)}`) : (V.push(`M${L}`), V.push(`Q${O},${k},${t(o, s, d, S)}`)), V.push(`A${d},${d},0,${E},1,${t(o, s, d, C)}`), i ? V.push(`A${x},${x},0,0,1,${t(o, s, u, g)}`) : (V.push(`Q${A},${j},${R}`), V.push(`L${B}`), V.push(`Q${P},${F},${t(o, s, u, T)}`)), V.push(`A${u},${u},0,${D},0,${t(o, s, u, w)}`), a ? V.push(`A${x},${x},0,0,0,${t(o, s, d, h)}`) : V.push(`Q${M},${N},${z}`), V.push("Z"), V.join("");
66
+ }
67
+ function a(e) {
68
+ let t = (e.startAngle + e.endAngle) / 2, n = (e.outerRadius + e.innerRadius) / 2;
69
+ return {
70
+ x: e.centerX + n * Math.sin(t),
71
+ y: e.centerY - n * Math.cos(t)
72
+ };
73
+ }
74
+ //#endregion
75
+ export { a as arcCentroid, i as arcPath, e as computeArcs };
76
+
77
+ //# sourceMappingURL=pie-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-renderer.js","names":[],"sources":["../../../src/charts/pie/pie-renderer.ts"],"sourcesContent":["import type { PieSliceConfig } from '../../types';\n\nexport interface Arc {\n capEnd: boolean;\n capStart: boolean;\n centerX: number;\n centerY: number;\n color: string;\n cornerRadius: number;\n endAngle: number;\n index: number;\n innerRadius: number;\n outerRadius: number;\n padAngle: number;\n slice: PieSliceConfig;\n startAngle: number;\n}\n\nexport function computeArcs(\n slices: PieSliceConfig[],\n cx: number,\n cy: number,\n outerRadius: number,\n innerRadius: number,\n startAngle: number,\n endAngle: number,\n padPixels: number,\n cornerRadius: number,\n defaultColors: (i: number) => string,\n capEnds = false,\n): Arc[] {\n const total = slices.reduce((s, d) => s + Math.max(0, d.value), 0);\n\n if (total === 0) return [];\n\n const range = endAngle - startAngle;\n const halfGapAngle = outerRadius > 0 ? Math.asin(Math.min(1, padPixels / 2 / outerRadius)) : 0;\n\n let currentAngle = startAngle;\n const n = slices.length;\n\n return slices.map((slice, i) => {\n const fraction = Math.max(0, slice.value) / total;\n const sliceRange = fraction * range;\n const rawStart = currentAngle;\n const rawEnd = currentAngle + sliceRange;\n\n currentAngle += sliceRange;\n\n const padAngle = Math.min(halfGapAngle, sliceRange / 2);\n\n return {\n capEnd: capEnds && i === n - 1,\n capStart: capEnds && i === 0,\n centerX: cx,\n centerY: cy,\n color: slice.color ?? defaultColors(i),\n cornerRadius,\n endAngle: rawEnd,\n index: i,\n innerRadius,\n outerRadius,\n padAngle,\n slice,\n startAngle: rawStart,\n };\n });\n}\n\n// Polar to cartesian, returns x,y string for SVG path\nfunction p(cx: number, cy: number, r: number, a: number): string {\n return `${cx + r * Math.sin(a)},${cy - r * Math.cos(a)}`;\n}\n\n// Cartesian x component\nfunction px(cx: number, r: number, a: number): number {\n return cx + r * Math.sin(a);\n}\n\n// Cartesian y component\nfunction py(cy: number, r: number, a: number): number {\n return cy - r * Math.cos(a);\n}\n\nexport function arcPath(arc: Arc): string {\n const {\n capEnd,\n capStart,\n centerX: cx,\n centerY: cy,\n cornerRadius: cr,\n endAngle,\n innerRadius,\n outerRadius,\n padAngle,\n startAngle,\n } = arc;\n\n const sweep = endAngle - startAngle;\n\n if (sweep <= 0) return '';\n\n // ── Full circle ─────────────────────────────────────────────────────────────\n if (sweep >= 2 * Math.PI - 1e-6) {\n const mid = startAngle + Math.PI;\n\n if (innerRadius <= 0) {\n return `M${p(cx, cy, outerRadius, startAngle)}A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, mid)}A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, startAngle)}Z`;\n }\n\n return [\n `M${p(cx, cy, outerRadius, startAngle)}`,\n `A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, mid)}`,\n `A${outerRadius},${outerRadius},0,1,1,${p(cx, cy, outerRadius, startAngle)}`,\n `M${p(cx, cy, innerRadius, startAngle)}`,\n `A${innerRadius},${innerRadius},0,1,0,${p(cx, cy, innerRadius, mid)}`,\n `A${innerRadius},${innerRadius},0,1,0,${p(cx, cy, innerRadius, startAngle)}`,\n 'Z',\n ].join('');\n }\n\n // Cap ends don't get a padAngle inset (no adjacent slice on that side)\n const sa = capStart ? startAngle : startAngle + padAngle;\n const ea = capEnd ? endAngle : endAngle - padAngle;\n\n if (ea <= sa) return '';\n\n const paddedSweep = ea - sa;\n\n // ── No rounding ─────────────────────────────────────────────────────────────\n if (cr <= 0) {\n const large = paddedSweep > Math.PI ? 1 : 0;\n\n if (innerRadius <= 0) {\n return `M${cx},${cy}L${p(cx, cy, outerRadius, sa)}A${outerRadius},${outerRadius},0,${large},1,${p(cx, cy, outerRadius, ea)}Z`;\n }\n\n return [\n `M${p(cx, cy, outerRadius, sa)}`,\n `A${outerRadius},${outerRadius},0,${large},1,${p(cx, cy, outerRadius, ea)}`,\n `L${p(cx, cy, innerRadius, ea)}`,\n `A${innerRadius},${innerRadius},0,${large},0,${p(cx, cy, innerRadius, sa)}`,\n 'Z',\n ].join('');\n }\n\n // ── Rounded corners (or semicircle caps at open ends) ────────────────────────\n // Corner bezier pull amounts\n const outerPull = Math.min(cr / outerRadius, paddedSweep / 2);\n const innerPull = Math.min(cr / innerRadius, paddedSweep / 2);\n const radialPull = Math.min(cr, (outerRadius - innerRadius) / 2);\n const capR = (outerRadius - innerRadius) / 2; // semicircle cap radius\n\n // Shortened arc angles (for corners)\n const oS = sa + (capStart ? 0 : outerPull);\n const oE = ea - (capEnd ? 0 : outerPull);\n const iS = sa + (capStart ? 0 : innerPull);\n const iE = ea - (capEnd ? 0 : innerPull);\n\n const largeO = oE - oS > Math.PI ? 1 : 0;\n const largeI = iE - iS > Math.PI ? 1 : 0;\n\n // Unrounded corner cartesian positions (at full sa/ea, not shortened)\n const cxOs = px(cx, outerRadius, sa);\n const cyOs = py(cy, outerRadius, sa);\n const cxOe = px(cx, outerRadius, ea);\n const cyOe = py(cy, outerRadius, ea);\n const cxIs = px(cx, innerRadius, sa);\n const cyIs = py(cy, innerRadius, sa);\n const cxIe = px(cx, innerRadius, ea);\n const cyIe = py(cy, innerRadius, ea);\n\n const frac = radialPull / (outerRadius - innerRadius);\n const pOsRad = `${cxOs + (cxIs - cxOs) * frac},${cyOs + (cyIs - cyOs) * frac}`;\n const pOeRad = `${cxOe + (cxIe - cxOe) * frac},${cyOe + (cyIe - cyOe) * frac}`;\n const pIsRad = `${cxIs + (cxOs - cxIs) * frac},${cyIs + (cyOs - cyIs) * frac}`;\n const pIeRad = `${cxIe + (cxOe - cxIe) * frac},${cyIe + (cyOe - cyIe) * frac}`;\n\n const segs: string[] = [];\n\n // Start edge\n if (capStart) {\n segs.push(`M${p(cx, cy, outerRadius, sa)}`);\n } else {\n segs.push(`M${pOsRad}`);\n segs.push(`Q${cxOs},${cyOs},${p(cx, cy, outerRadius, oS)}`);\n }\n\n // Outer arc\n segs.push(`A${outerRadius},${outerRadius},0,${largeO},1,${p(cx, cy, outerRadius, oE)}`);\n\n // End edge\n if (capEnd) {\n // Semicircle cap from outer-end → inner-end, bulging away from center (CW)\n segs.push(`A${capR},${capR},0,0,1,${p(cx, cy, innerRadius, ea)}`);\n } else {\n segs.push(`Q${cxOe},${cyOe},${pOeRad}`);\n segs.push(`L${pIeRad}`);\n segs.push(`Q${cxIe},${cyIe},${p(cx, cy, innerRadius, iE)}`);\n }\n\n // Inner arc (reversed, CCW)\n segs.push(`A${innerRadius},${innerRadius},0,${largeI},0,${p(cx, cy, innerRadius, iS)}`);\n\n // Start edge close\n if (capStart) {\n // Semicircle cap from inner-start → outer-start, bulging away from center (CCW)\n segs.push(`A${capR},${capR},0,0,0,${p(cx, cy, outerRadius, sa)}`);\n } else {\n segs.push(`Q${cxIs},${cyIs},${pIsRad}`);\n }\n\n segs.push('Z');\n\n return segs.join('');\n}\n\nexport function arcCentroid(arc: Arc): { x: number; y: number } {\n const mid = (arc.startAngle + arc.endAngle) / 2;\n const r = (arc.outerRadius + arc.innerRadius) / 2;\n\n return {\n x: arc.centerX + r * Math.sin(mid),\n y: arc.centerY - r * Math.cos(mid),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { createSparkline } from './sparkline';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/charts/sparkline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../svg/element.cjs"),t=require("../../core/chart-base.cjs"),n=require("../../animation/easing.cjs"),r=require("../../animation/tween.cjs"),i=require("../../svg/path.cjs");let a=require("@vielzeug/ripple");function o(e,t,n){if(e.length===0)return[];let r=t/Math.max(1,e.length-1),i=Math.min(...e),a=Math.max(...e)-i||1;return e.map((e,t)=>({x:t*r,y:n-(e-i)/a*n}))}function s(e,t,n,r=`linear`){if(e.length===0)return``;let a=o(e,t,n);return i.areaPath(a,a.map(e=>({x:e.x,y:n})),r??`linear`)}function c(e,t,n,r){if(e.length===0)return``;let a=o(e,t,n);return r===`monotone`?i.monotonePath(a):r===`step`?i.stepPath(a):i.linePath(a)}function l(t,i,a,o,s,c,l){let u=i.length,d=Math.max(1,a/u-1),f=a/u,p=Math.min(0,...i),m=Math.max(...i)-p||1,h=c?.duration??0,g=n.resolveEasing(c?.easing);for(;t.children.length>u;){let e=t.lastElementChild;e&&t.removeChild(e)}for(let n=0;n<u;n++){let a=Math.max(1,(i[n]-p)/m*o),c=o-a,u=t.children[n];if(u||(u=e.createSvgElement(`rect`,{class:`prism-spark-bar`}),t.appendChild(u)),e.setAttributes(u,{fill:s,width:d,x:n*f}),h>0&&!u.hasAttribute(`data-init`)){u.setAttribute(`data-init`,`1`),e.setAttributes(u,{height:0,y:o});let t=null,n={h:0,y:o},i={h:a,y:c},s=a=>{if(l?.aborted)return;t===null&&(t=a);let o=g(Math.min(1,(a-t)/h));e.setAttributes(u,{height:r.tweenNumber(n.h,i.h,o),y:r.tweenNumber(n.y,i.y,o)}),o<1&&requestAnimationFrame(s)};requestAnimationFrame(s)}else u.setAttribute(`data-init`,`1`),e.setAttributes(u,{height:a,y:c})}}function u(e){return e.length>0&&e[0]!==null&&typeof e[0]==`object`}function d(e,t,n,r,i,a,o){let s=Math.min(i,n/2,r/2),c=a?s:0,l=a?s:0,u=o?s:0,d=o?s:0;return[`M${e+c},${t}`,`H${e+n-u}`,u?`Q${e+n},${t} ${e+n},${t+u}`:``,`V${t+r-d}`,d?`Q${e+n},${t+r} ${e+n-d},${t+r}`:``,`H${e+l}`,l?`Q${e},${t+r} ${e},${t+r-l}`:``,`V${t+c}`,c?`Q${e},${t} ${e+c},${t}`:``,`Z`].filter(Boolean).join(``)}function f(e){return`var(--prism-color-${e%8+1})`}function p(n,r){let i=r.variant??`line`,o=r.color??`var(--prism-color-1)`,p=r.curve??`linear`,m=r.strokeWidth??1.5,h=r.fillOpacity??.2,g=t.createChartBase(n,{...r.ariaLabel?{ariaLabel:r.ariaLabel}:{ariaHidden:!0},margin:{bottom:0,left:0,right:0,top:0}}),{svg:_}=g;_.classList.add(`prism-sparkline`);let v=e.createSvgElement(`g`,{class:`prism-spark-inner`});_.appendChild(v);let y;function b(){let{height:t,width:n}=g.dimensions.value,_=(0,a.isReactive)(r.data)?r.data.value:r.data;for(;v.firstChild;)v.removeChild(v.firstChild);if(_.length!==0){if(i===`stack`&&u(_)){let i=e.createSvgElement(`g`,{class:`prism-spark-stack`});v.appendChild(i);let a=r.cornerRadius??4,o=_,s=o.reduce((e,t)=>e+Math.max(0,t.value),0);if(s>0){let c=(r.padPixels??0)/2,l=0;o.forEach((r,u)=>{let p=Math.round(l);l+=Math.max(0,r.value)/s*n;let m=u===o.length-1?n:Math.round(l),h=u===0,g=u===o.length-1,_=d(p+(h?0:c),0,Math.max(0,m-p-(h?0:c)-(g?0:c)),t,a,h,g),v=e.createSvgElement(`path`,{class:`prism-spark-stack-segment`});e.setAttributes(v,{d:_,fill:r.color??f(u)}),i.appendChild(v)})}}else if(i===`bar`){let i=e.createSvgElement(`g`,{class:`prism-spark-bars`});v.appendChild(i),l(i,_,n,t,o,r.transition,S.signal)}else{if(i===`area`){let r=e.createSvgElement(`path`,{class:`prism-spark-fill`});e.setAttributes(r,{d:s(_,n,t,p),fill:o,"fill-opacity":h,stroke:`none`}),v.appendChild(r)}let r=e.createSvgElement(`path`,{class:`prism-spark-line`});e.setAttributes(r,{d:c(_,n,t,p),fill:`none`,stroke:o,"stroke-width":m}),v.appendChild(r)}u(_)||x(_)}}function x(e){if(y?.(),y=void 0,!r.onHover&&!r.onClick||e.length<=1)return;let{width:t}=g.dimensions.value;_.style.cursor=`crosshair`;let n=t/(e.length-1),i=t=>{let i=_.getBoundingClientRect(),a=t.clientX-i.left,o=Math.max(0,Math.min(e.length-1,Math.round(a/n)));r.onHover?.(o,e[o])},a=()=>r.onHover?.(null,null),o=t=>{if(!r.onClick)return;let i=_.getBoundingClientRect(),a=t.clientX-i.left,o=Math.max(0,Math.min(e.length-1,Math.round(a/n)));r.onClick(o,e[o])};_.addEventListener(`mousemove`,i),_.addEventListener(`mouseleave`,a),_.addEventListener(`click`,o),y=()=>{_.removeEventListener(`mousemove`,i),_.removeEventListener(`mouseleave`,a),_.removeEventListener(`click`,o)}}let S=new AbortController,C=(0,a.scope)(()=>{(0,a.effect)(()=>{b()},{scheduler:`microtask`})}),w=!1;return{get disposalSignal(){return S.signal},dispose(){w||(w=!0,S.abort(),y?.(),C.dispose(),g.dispose())},get disposed(){return w},el:_,[Symbol.dispose](){this.dispose()}}}exports.createSparkline=p;
2
+ //# sourceMappingURL=sparkline.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkline.cjs","names":[],"sources":["../../../src/charts/sparkline/sparkline.ts"],"sourcesContent":["import { effect, isReactive, scope } from '@vielzeug/ripple';\n\nimport type { Point } from '../../svg/path';\nimport type { ChartHandle, SparklineConfig, StackSegment } from '../../types';\n\nimport { resolveEasing } from '../../animation/easing';\nimport { tweenNumber } from '../../animation/tween';\nimport { createChartBase } from '../../core/chart-base';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\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 dur = transition?.duration ?? 0;\n const easing = resolveEasing(transition?.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\n const base = createChartBase(container, {\n ...(config.ariaLabel ? { ariaLabel: config.ariaLabel } : { 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 = isReactive(config.data) ? config.data.value : config.data;\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 s = scope(() => {\n effect(\n () => {\n renderAll();\n },\n { scheduler: 'microtask' },\n );\n });\n\n let isDisposed = false;\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 s.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}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ChartHandle, SparklineConfig } from '../../types';
2
+ export declare function createSparkline(container: HTMLElement, config: SparklineConfig): ChartHandle;
3
+ //# sourceMappingURL=sparkline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkline.d.ts","sourceRoot":"","sources":["../../../src/charts/sparkline/sparkline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAgB,MAAM,aAAa,CAAC;AAuJ9E,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAuK5F"}
@@ -0,0 +1,187 @@
1
+ import { createSvgElement as e, setAttributes as t } from "../../svg/element.js";
2
+ import { createChartBase as n } from "../../core/chart-base.js";
3
+ import { resolveEasing as r } from "../../animation/easing.js";
4
+ import { tweenNumber as i } from "../../animation/tween.js";
5
+ import { areaPath as a, linePath as o, monotonePath as s, stepPath as c } from "../../svg/path.js";
6
+ import { effect as l, isReactive as u, scope as d } from "@vielzeug/ripple";
7
+ //#region src/charts/sparkline/sparkline.ts
8
+ function f(e, t, n) {
9
+ if (e.length === 0) return [];
10
+ let r = t / Math.max(1, e.length - 1), i = Math.min(...e), a = Math.max(...e) - i || 1;
11
+ return e.map((e, t) => ({
12
+ x: t * r,
13
+ y: n - (e - i) / a * n
14
+ }));
15
+ }
16
+ function p(e, t, n, r = "linear") {
17
+ if (e.length === 0) return "";
18
+ let i = f(e, t, n);
19
+ return a(i, i.map((e) => ({
20
+ x: e.x,
21
+ y: n
22
+ })), r ?? "linear");
23
+ }
24
+ function m(e, t, n, r) {
25
+ if (e.length === 0) return "";
26
+ let i = f(e, t, n);
27
+ return r === "monotone" ? s(i) : r === "step" ? c(i) : o(i);
28
+ }
29
+ function h(n, a, o, s, c, l, u) {
30
+ let d = a.length, f = Math.max(1, o / d - 1), p = o / d, m = Math.min(0, ...a), h = Math.max(...a) - m || 1, g = l?.duration ?? 0, _ = r(l?.easing);
31
+ for (; n.children.length > d;) {
32
+ let e = n.lastElementChild;
33
+ e && n.removeChild(e);
34
+ }
35
+ for (let r = 0; r < d; r++) {
36
+ let o = Math.max(1, (a[r] - m) / h * s), l = s - o, d = n.children[r];
37
+ if (d || (d = e("rect", { class: "prism-spark-bar" }), n.appendChild(d)), t(d, {
38
+ fill: c,
39
+ width: f,
40
+ x: r * p
41
+ }), g > 0 && !d.hasAttribute("data-init")) {
42
+ d.setAttribute("data-init", "1"), t(d, {
43
+ height: 0,
44
+ y: s
45
+ });
46
+ let e = null, n = {
47
+ h: 0,
48
+ y: s
49
+ }, r = {
50
+ h: o,
51
+ y: l
52
+ }, a = (o) => {
53
+ if (u?.aborted) return;
54
+ e === null && (e = o);
55
+ let s = _(Math.min(1, (o - e) / g));
56
+ t(d, {
57
+ height: i(n.h, r.h, s),
58
+ y: i(n.y, r.y, s)
59
+ }), s < 1 && requestAnimationFrame(a);
60
+ };
61
+ requestAnimationFrame(a);
62
+ } else d.setAttribute("data-init", "1"), t(d, {
63
+ height: o,
64
+ y: l
65
+ });
66
+ }
67
+ }
68
+ function g(e) {
69
+ return e.length > 0 && e[0] !== null && typeof e[0] == "object";
70
+ }
71
+ function _(e, t, n, r, i, a, o) {
72
+ 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;
73
+ return [
74
+ `M${e + c},${t}`,
75
+ `H${e + n - u}`,
76
+ u ? `Q${e + n},${t} ${e + n},${t + u}` : "",
77
+ `V${t + r - d}`,
78
+ d ? `Q${e + n},${t + r} ${e + n - d},${t + r}` : "",
79
+ `H${e + l}`,
80
+ l ? `Q${e},${t + r} ${e},${t + r - l}` : "",
81
+ `V${t + c}`,
82
+ c ? `Q${e},${t} ${e + c},${t}` : "",
83
+ "Z"
84
+ ].filter(Boolean).join("");
85
+ }
86
+ function v(e) {
87
+ return `var(--prism-color-${e % 8 + 1})`;
88
+ }
89
+ function y(r, i) {
90
+ let a = i.variant ?? "line", o = i.color ?? "var(--prism-color-1)", s = i.curve ?? "linear", c = i.strokeWidth ?? 1.5, f = i.fillOpacity ?? .2, y = n(r, {
91
+ ...i.ariaLabel ? { ariaLabel: i.ariaLabel } : { ariaHidden: !0 },
92
+ margin: {
93
+ bottom: 0,
94
+ left: 0,
95
+ right: 0,
96
+ top: 0
97
+ }
98
+ }), { svg: b } = y;
99
+ b.classList.add("prism-sparkline");
100
+ let x = e("g", { class: "prism-spark-inner" });
101
+ b.appendChild(x);
102
+ let S;
103
+ function C() {
104
+ let { height: n, width: r } = y.dimensions.value, l = u(i.data) ? i.data.value : i.data;
105
+ for (; x.firstChild;) x.removeChild(x.firstChild);
106
+ if (l.length !== 0) {
107
+ if (a === "stack" && g(l)) {
108
+ let a = e("g", { class: "prism-spark-stack" });
109
+ x.appendChild(a);
110
+ let o = i.cornerRadius ?? 4, s = l, c = s.reduce((e, t) => e + Math.max(0, t.value), 0);
111
+ if (c > 0) {
112
+ let l = (i.padPixels ?? 0) / 2, u = 0;
113
+ s.forEach((i, d) => {
114
+ let f = Math.round(u);
115
+ u += Math.max(0, i.value) / c * r;
116
+ let p = d === s.length - 1 ? r : Math.round(u), m = d === 0, h = d === s.length - 1, 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" });
117
+ t(y, {
118
+ d: g,
119
+ fill: i.color ?? v(d)
120
+ }), a.appendChild(y);
121
+ });
122
+ }
123
+ } else if (a === "bar") {
124
+ let t = e("g", { class: "prism-spark-bars" });
125
+ x.appendChild(t), h(t, l, r, n, o, i.transition, T.signal);
126
+ } else {
127
+ if (a === "area") {
128
+ let i = e("path", { class: "prism-spark-fill" });
129
+ t(i, {
130
+ d: p(l, r, n, s),
131
+ fill: o,
132
+ "fill-opacity": f,
133
+ stroke: "none"
134
+ }), x.appendChild(i);
135
+ }
136
+ let i = e("path", { class: "prism-spark-line" });
137
+ t(i, {
138
+ d: m(l, r, n, s),
139
+ fill: "none",
140
+ stroke: o,
141
+ "stroke-width": c
142
+ }), x.appendChild(i);
143
+ }
144
+ g(l) || w(l);
145
+ }
146
+ }
147
+ function w(e) {
148
+ if (S?.(), S = void 0, !i.onHover && !i.onClick || e.length <= 1) return;
149
+ let { width: t } = y.dimensions.value;
150
+ b.style.cursor = "crosshair";
151
+ let n = t / (e.length - 1), r = (t) => {
152
+ let r = b.getBoundingClientRect(), a = t.clientX - r.left, o = Math.max(0, Math.min(e.length - 1, Math.round(a / n)));
153
+ i.onHover?.(o, e[o]);
154
+ }, a = () => i.onHover?.(null, null), o = (t) => {
155
+ if (!i.onClick) return;
156
+ let r = b.getBoundingClientRect(), a = t.clientX - r.left, o = Math.max(0, Math.min(e.length - 1, Math.round(a / n)));
157
+ i.onClick(o, e[o]);
158
+ };
159
+ b.addEventListener("mousemove", r), b.addEventListener("mouseleave", a), b.addEventListener("click", o), S = () => {
160
+ b.removeEventListener("mousemove", r), b.removeEventListener("mouseleave", a), b.removeEventListener("click", o);
161
+ };
162
+ }
163
+ let T = new AbortController(), E = d(() => {
164
+ l(() => {
165
+ C();
166
+ }, { scheduler: "microtask" });
167
+ }), D = !1;
168
+ return {
169
+ get disposalSignal() {
170
+ return T.signal;
171
+ },
172
+ dispose() {
173
+ D || (D = !0, T.abort(), S?.(), E.dispose(), y.dispose());
174
+ },
175
+ get disposed() {
176
+ return D;
177
+ },
178
+ el: b,
179
+ [Symbol.dispose]() {
180
+ this.dispose();
181
+ }
182
+ };
183
+ }
184
+ //#endregion
185
+ export { y as createSparkline };
186
+
187
+ //# sourceMappingURL=sparkline.js.map