@vielzeug/prism 3.0.0 → 26.10.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 (160) hide show
  1. package/dist/_dev.cjs +1 -1
  2. package/dist/_dev.cjs.map +1 -1
  3. package/dist/_dev.js +1 -5
  4. package/dist/_dev.js.map +1 -1
  5. package/dist/animation/easing.cjs +1 -1
  6. package/dist/animation/easing.cjs.map +1 -1
  7. package/dist/animation/easing.js +1 -13
  8. package/dist/animation/easing.js.map +1 -1
  9. package/dist/animation/motion.cjs +1 -1
  10. package/dist/animation/motion.cjs.map +1 -1
  11. package/dist/animation/motion.js +1 -12
  12. package/dist/animation/motion.js.map +1 -1
  13. package/dist/animation/transition.cjs +1 -1
  14. package/dist/animation/transition.cjs.map +1 -1
  15. package/dist/animation/transition.js +1 -28
  16. package/dist/animation/transition.js.map +1 -1
  17. package/dist/animation/tween.cjs +1 -1
  18. package/dist/animation/tween.cjs.map +1 -1
  19. package/dist/animation/tween.js +1 -7
  20. package/dist/animation/tween.js.map +1 -1
  21. package/dist/axes/axis.cjs +1 -1
  22. package/dist/axes/axis.cjs.map +1 -1
  23. package/dist/axes/axis.js +1 -63
  24. package/dist/axes/axis.js.map +1 -1
  25. package/dist/axes/grid.cjs +1 -1
  26. package/dist/axes/grid.cjs.map +1 -1
  27. package/dist/axes/grid.js +1 -29
  28. package/dist/axes/grid.js.map +1 -1
  29. package/dist/axes/scale-utils.cjs +1 -1
  30. package/dist/axes/scale-utils.cjs.map +1 -1
  31. package/dist/axes/scale-utils.js +1 -10
  32. package/dist/axes/scale-utils.js.map +1 -1
  33. package/dist/charts/area/area-chart.cjs +1 -1
  34. package/dist/charts/area/area-chart.cjs.map +1 -1
  35. package/dist/charts/area/area-chart.js +1 -57
  36. package/dist/charts/area/area-chart.js.map +1 -1
  37. package/dist/charts/area/area-renderer.cjs +1 -1
  38. package/dist/charts/area/area-renderer.cjs.map +1 -1
  39. package/dist/charts/area/area-renderer.js +1 -73
  40. package/dist/charts/area/area-renderer.js.map +1 -1
  41. package/dist/charts/bar/bar-chart.cjs +1 -1
  42. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  43. package/dist/charts/bar/bar-chart.js +1 -169
  44. package/dist/charts/bar/bar-chart.js.map +1 -1
  45. package/dist/charts/bar/bar-hit-test.cjs +1 -1
  46. package/dist/charts/bar/bar-hit-test.cjs.map +1 -1
  47. package/dist/charts/bar/bar-hit-test.js +1 -29
  48. package/dist/charts/bar/bar-hit-test.js.map +1 -1
  49. package/dist/charts/bar/bar-renderer.cjs +1 -1
  50. package/dist/charts/bar/bar-renderer.cjs.map +1 -1
  51. package/dist/charts/bar/bar-renderer.js +1 -106
  52. package/dist/charts/bar/bar-renderer.js.map +1 -1
  53. package/dist/charts/line/line-chart.cjs +1 -1
  54. package/dist/charts/line/line-chart.cjs.map +1 -1
  55. package/dist/charts/line/line-chart.js +1 -58
  56. package/dist/charts/line/line-chart.js.map +1 -1
  57. package/dist/charts/line/line-renderer.cjs +1 -1
  58. package/dist/charts/line/line-renderer.cjs.map +1 -1
  59. package/dist/charts/line/line-renderer.js +1 -100
  60. package/dist/charts/line/line-renderer.js.map +1 -1
  61. package/dist/charts/pie/pie-chart.cjs +1 -1
  62. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  63. package/dist/charts/pie/pie-chart.js +1 -165
  64. package/dist/charts/pie/pie-chart.js.map +1 -1
  65. package/dist/charts/pie/pie-renderer.cjs +1 -1
  66. package/dist/charts/pie/pie-renderer.cjs.map +1 -1
  67. package/dist/charts/pie/pie-renderer.js +1 -76
  68. package/dist/charts/pie/pie-renderer.js.map +1 -1
  69. package/dist/charts/sparkline/sparkline.cjs +1 -1
  70. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  71. package/dist/charts/sparkline/sparkline.js +1 -191
  72. package/dist/charts/sparkline/sparkline.js.map +1 -1
  73. package/dist/core/cartesian-model.cjs +1 -1
  74. package/dist/core/cartesian-model.cjs.map +1 -1
  75. package/dist/core/cartesian-model.js +1 -30
  76. package/dist/core/cartesian-model.js.map +1 -1
  77. package/dist/core/cartesian-scales.cjs +1 -1
  78. package/dist/core/cartesian-scales.cjs.map +1 -1
  79. package/dist/core/cartesian-scales.js +1 -37
  80. package/dist/core/cartesian-scales.js.map +1 -1
  81. package/dist/core/chart-base.cjs +1 -1
  82. package/dist/core/chart-base.cjs.map +1 -1
  83. package/dist/core/chart-base.js +1 -53
  84. package/dist/core/chart-base.js.map +1 -1
  85. package/dist/core/chart-scaffold.cjs +1 -1
  86. package/dist/core/chart-scaffold.cjs.map +1 -1
  87. package/dist/core/chart-scaffold.js +1 -89
  88. package/dist/core/chart-scaffold.js.map +1 -1
  89. package/dist/core/layout.cjs +1 -1
  90. package/dist/core/layout.cjs.map +1 -1
  91. package/dist/core/layout.js +1 -22
  92. package/dist/core/layout.js.map +1 -1
  93. package/dist/core/responsive.cjs +1 -1
  94. package/dist/core/responsive.cjs.map +1 -1
  95. package/dist/core/responsive.js +1 -19
  96. package/dist/core/responsive.js.map +1 -1
  97. package/dist/devtools.cjs +1 -1
  98. package/dist/devtools.cjs.map +1 -1
  99. package/dist/devtools.js +1 -18
  100. package/dist/devtools.js.map +1 -1
  101. package/dist/errors.cjs +1 -1
  102. package/dist/errors.cjs.map +1 -1
  103. package/dist/errors.js +1 -9
  104. package/dist/errors.js.map +1 -1
  105. package/dist/index.js +1 -11
  106. package/dist/interaction/crosshair.cjs +1 -1
  107. package/dist/interaction/crosshair.cjs.map +1 -1
  108. package/dist/interaction/crosshair.js +1 -45
  109. package/dist/interaction/crosshair.js.map +1 -1
  110. package/dist/interaction/events.cjs +1 -1
  111. package/dist/interaction/events.cjs.map +1 -1
  112. package/dist/interaction/events.js +1 -11
  113. package/dist/interaction/events.js.map +1 -1
  114. package/dist/interaction/legend.cjs +1 -1
  115. package/dist/interaction/legend.cjs.map +1 -1
  116. package/dist/interaction/legend.js +1 -30
  117. package/dist/interaction/legend.js.map +1 -1
  118. package/dist/interaction/series-interaction.cjs +1 -1
  119. package/dist/interaction/series-interaction.cjs.map +1 -1
  120. package/dist/interaction/series-interaction.js +1 -97
  121. package/dist/interaction/series-interaction.js.map +1 -1
  122. package/dist/interaction/tooltip.cjs +1 -1
  123. package/dist/interaction/tooltip.cjs.map +1 -1
  124. package/dist/interaction/tooltip.js +1 -63
  125. package/dist/interaction/tooltip.js.map +1 -1
  126. package/dist/prism.cjs +1 -1
  127. package/dist/prism.cjs.map +1 -1
  128. package/dist/prism.iife.js +1 -1
  129. package/dist/prism.iife.js.map +1 -1
  130. package/dist/prism.js +1 -1
  131. package/dist/prism.js.map +1 -1
  132. package/dist/scales/band.cjs +1 -1
  133. package/dist/scales/band.cjs.map +1 -1
  134. package/dist/scales/band.js +1 -39
  135. package/dist/scales/band.js.map +1 -1
  136. package/dist/scales/linear.cjs +1 -1
  137. package/dist/scales/linear.cjs.map +1 -1
  138. package/dist/scales/linear.js +1 -43
  139. package/dist/scales/linear.js.map +1 -1
  140. package/dist/scales/time.cjs +1 -1
  141. package/dist/scales/time.cjs.map +1 -1
  142. package/dist/scales/time.js +1 -61
  143. package/dist/scales/time.js.map +1 -1
  144. package/dist/svg/element.cjs +1 -1
  145. package/dist/svg/element.cjs.map +1 -1
  146. package/dist/svg/element.js +1 -22
  147. package/dist/svg/element.js.map +1 -1
  148. package/dist/svg/path.cjs +1 -1
  149. package/dist/svg/path.cjs.map +1 -1
  150. package/dist/svg/path.js +1 -48
  151. package/dist/svg/path.js.map +1 -1
  152. package/dist/svg/text.cjs +1 -1
  153. package/dist/svg/text.cjs.map +1 -1
  154. package/dist/svg/text.js +1 -9
  155. package/dist/svg/text.js.map +1 -1
  156. package/dist/theme/index.cjs +1 -1
  157. package/dist/theme/index.cjs.map +1 -1
  158. package/dist/theme/index.js +1 -19
  159. package/dist/theme/index.js.map +1 -1
  160. package/package.json +5 -5
@@ -1,77 +1,2 @@
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
-
1
+ function computeArcs(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,m=r>0?Math.asin(Math.min(1,s/2/r)):0,h=a,g=e.length;return e.map((e,a)=>{let o=Math.max(0,e.value)/d*f,s=h,_=h+o;h+=o;let v=Math.min(m,o/2);return{capEnd:u&&a===g-1,capStart:u&&a===0,centerX:t,centerY:n,color:e.color??l(a),cornerRadius:c,endAngle:_,index:a,innerRadius:i,outerRadius:r,padAngle:v,slice:e,startAngle:s}})}function p(e,t,n,r){return`${e+n*Math.sin(r)},${t-n*Math.cos(r)}`}function px(e,t,n){return e+t*Math.sin(n)}function py(e,t,n){return e-t*Math.cos(n)}function arcPath(e){let{capEnd:t,capStart:n,centerX:r,centerY:i,cornerRadius:a,endAngle:o,innerRadius:s,outerRadius:c,padAngle:l,startAngle:u}=e,d=o-u;if(d<=0)return``;if(d>=2*Math.PI-1e-6){let e=u+Math.PI;return s<=0?`M${p(r,i,c,u)}A${c},${c},0,1,1,${p(r,i,c,e)}A${c},${c},0,1,1,${p(r,i,c,u)}Z`:[`M${p(r,i,c,u)}`,`A${c},${c},0,1,1,${p(r,i,c,e)}`,`A${c},${c},0,1,1,${p(r,i,c,u)}`,`M${p(r,i,s,u)}`,`A${s},${s},0,1,0,${p(r,i,s,e)}`,`A${s},${s},0,1,0,${p(r,i,s,u)}`,`Z`].join(``)}let f=n?u:u+l,m=t?o:o-l;if(m<=f)return``;let h=m-f;if(a<=0){let e=+(h>Math.PI);return s<=0?`M${r},${i}L${p(r,i,c,f)}A${c},${c},0,${e},1,${p(r,i,c,m)}Z`:[`M${p(r,i,c,f)}`,`A${c},${c},0,${e},1,${p(r,i,c,m)}`,`L${p(r,i,s,m)}`,`A${s},${s},0,${e},0,${p(r,i,s,f)}`,`Z`].join(``)}let g=Math.min(a/c,h/2),_=Math.min(a/s,h/2),v=Math.min(a,(c-s)/2),y=(c-s)/2,b=f+(n?0:g),x=m-(t?0:g),S=f+(n?0:_),C=m-(t?0:_),w=+(x-b>Math.PI),T=+(C-S>Math.PI),E=px(r,c,f),D=py(i,c,f),O=px(r,c,m),k=py(i,c,m),A=px(r,s,f),j=py(i,s,f),M=px(r,s,m),N=py(i,s,m),P=v/(c-s),F=`${E+(A-E)*P},${D+(j-D)*P}`,I=`${O+(M-O)*P},${k+(N-k)*P}`,L=`${A+(E-A)*P},${j+(D-j)*P}`,R=`${M+(O-M)*P},${N+(k-N)*P}`,z=[];return n?z.push(`M${p(r,i,c,f)}`):(z.push(`M${F}`),z.push(`Q${E},${D},${p(r,i,c,b)}`)),z.push(`A${c},${c},0,${w},1,${p(r,i,c,x)}`),t?z.push(`A${y},${y},0,0,1,${p(r,i,s,m)}`):(z.push(`Q${O},${k},${I}`),z.push(`L${R}`),z.push(`Q${M},${N},${p(r,i,s,C)}`)),z.push(`A${s},${s},0,${T},0,${p(r,i,s,S)}`),n?z.push(`A${y},${y},0,0,0,${p(r,i,c,f)}`):z.push(`Q${A},${j},${L}`),z.push(`Z`),z.join(``)}function arcCentroid(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)}}export{arcCentroid,arcPath,computeArcs};
77
2
  //# sourceMappingURL=pie-renderer.js.map
@@ -1 +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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"}
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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"}
@@ -1,2 +1,2 @@
1
- const e=require("../../svg/element.cjs"),t=require("../../errors.cjs"),n=require("../../core/chart-base.cjs"),r=require("../../animation/easing.cjs"),i=require("../../animation/motion.cjs"),a=require("../../animation/tween.cjs"),o=require("../../svg/path.cjs");function s(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 c(e,t,n,r=`linear`){if(e.length===0)return``;let i=s(e,t,n),a=i.map(e=>({x:e.x,y:n}));return o.areaPath(i,a,r??`linear`)}function l(e,t,n,r){if(e.length===0)return``;let i=s(e,t,n);return r===`monotone`?o.monotonePath(i):r===`step`?o.stepPath(i):o.linePath(i)}function u(t,n,o,s,c,l,u){let d=n.length,f=Math.max(1,o/d-1),p=o/d,m=Math.min(0,...n),h=Math.max(...n)-m||1,g=i.resolveMotion(l,0),_=g.duration,v=r.resolveEasing(g.easing);for(;t.children.length>d;){let e=t.lastElementChild;e&&t.removeChild(e)}for(let r=0;r<d;r++){let i=Math.max(1,(n[r]-m)/h*s),o=s-i,l=t.children[r];if(l||(l=e.createSvgElement(`rect`,{class:`prism-spark-bar`}),t.appendChild(l)),e.setAttributes(l,{fill:c,width:f,x:r*p}),_>0&&!l.hasAttribute(`data-init`)){l.setAttribute(`data-init`,`1`),e.setAttributes(l,{height:0,y:s});let t=null,n={h:0,y:s},r={h:i,y:o},c=i=>{if(u?.aborted)return;t===null&&(t=i);let o=v(Math.min(1,(i-t)/_));e.setAttributes(l,{height:a.tweenNumber(n.h,r.h,o),y:a.tweenNumber(n.y,r.y,o)}),o<1&&requestAnimationFrame(c)};requestAnimationFrame(c)}else l.setAttribute(`data-init`,`1`),e.setAttributes(l,{height:i,y:o})}}function d(e){return e.length>0&&e[0]!==null&&typeof e[0]==`object`}function f(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 p(e){return`var(--prism-color-${e%8+1})`}function m(r,i){let a=i.variant??`line`,o=i.color??`var(--prism-color-1)`,s=i.curve??`linear`,m=i.strokeWidth??1.5,h=i.fillOpacity??.2,g=i.data,_=n.createChartBase(r,{a11y:i.a11y,margin:{bottom:0,left:0,right:0,top:0}},x),{svg:v}=_;v.classList.add(`prism-sparkline`);let y=e.createSvgElement(`g`,{class:`prism-spark-inner`});v.appendChild(y);let b;function x(){let{height:t,width:n}=_.dimensions;for(;y.firstChild;)y.removeChild(y.firstChild);if(g.length!==0){if(a===`stack`&&d(g)){let r=e.createSvgElement(`g`,{class:`prism-spark-stack`});y.appendChild(r);let a=i.cornerRadius??4,o=g,s=o.reduce((e,t)=>e+Math.max(0,t.value),0);if(s>0){let c=(i.padPixels??0)/2,l=0;o.forEach((i,u)=>{let d=Math.round(l);l+=Math.max(0,i.value)/s*n;let m=u===o.length-1?n:Math.round(l),h=u===0,g=u===o.length-1,_=f(d+(h?0:c),0,Math.max(0,m-d-(h?0:c)-(g?0:c)),t,a,h,g),v=e.createSvgElement(`path`,{class:`prism-spark-stack-segment`});e.setAttributes(v,{d:_,fill:i.color??p(u)}),r.appendChild(v)})}}else if(a===`bar`){let r=e.createSvgElement(`g`,{class:`prism-spark-bars`});y.appendChild(r),u(r,g,n,t,o,i.transition,C.signal)}else{if(a===`area`){let r=e.createSvgElement(`path`,{class:`prism-spark-fill`}),i=c(g,n,t,s);e.setAttributes(r,{d:i,fill:o,"fill-opacity":h,stroke:`none`}),y.appendChild(r)}let r=e.createSvgElement(`path`,{class:`prism-spark-line`}),i=l(g,n,t,s);e.setAttributes(r,{d:i,fill:`none`,stroke:o,"stroke-width":m}),y.appendChild(r)}d(g)||S(g)}}function S(e){if(b?.(),b=void 0,!i.onHover&&!i.onClick||e.length<=1)return;let{width:t}=_.dimensions;v.style.cursor=`crosshair`;let n=t/(e.length-1),r=t=>{let r=v.getBoundingClientRect(),a=t.clientX-r.left,o=Math.max(0,Math.min(e.length-1,Math.round(a/n)));i.onHover?.(o,e[o])},a=()=>i.onHover?.(null,null),o=t=>{if(!i.onClick)return;let r=v.getBoundingClientRect(),a=t.clientX-r.left,o=Math.max(0,Math.min(e.length-1,Math.round(a/n)));i.onClick(o,e[o])};v.addEventListener(`mousemove`,r),v.addEventListener(`mouseleave`,a),v.addEventListener(`click`,o),b=()=>{v.removeEventListener(`mousemove`,r),v.removeEventListener(`mouseleave`,a),v.removeEventListener(`click`,o)}}let C=new AbortController,w=!1;try{return x(),{get disposalSignal(){return C.signal},dispose(){w||(w=!0,C.abort(),b?.(),_.dispose())},get disposed(){return w},el:v,update(e){if(w)throw new t.PrismRenderError(`Cannot update a disposed chart.`);g=e,x()},[Symbol.dispose](){this.dispose()}}}catch(e){throw C.abort(),b?.(),_.dispose(),e instanceof t.PrismRenderError?e:new t.PrismRenderError(`Failed to render chart.`,{cause:e})}}exports.createSparkline=m;
1
+ const e=require("../../svg/element.cjs"),t=require("../../errors.cjs"),n=require("../../core/chart-base.cjs"),r=require("../../animation/easing.cjs"),i=require("../../animation/motion.cjs"),a=require("../../animation/tween.cjs"),o=require("../../svg/path.cjs");function buildTopPoints(e,t,n){if(e.length===0)return[];let r=t/Math.max(1,e.length-1),i=Math.min(...e),a=Math.max(...e)-i||1;return e.map((e,t)=>({x:t*r,y:n-(e-i)/a*n}))}function buildAreaPath(e,t,n,r=`linear`){if(e.length===0)return``;let i=buildTopPoints(e,t,n),a=i.map(e=>({x:e.x,y:n}));return o.areaPath(i,a,r??`linear`)}function buildPath(e,t,n,r){if(e.length===0)return``;let i=buildTopPoints(e,t,n);return r===`monotone`?o.monotonePath(i):r===`step`?o.stepPath(i):o.linePath(i)}function renderSparkBars(t,n,o,s,c,l,u){let d=n.length,f=Math.max(1,o/d-1),p=o/d,m=Math.min(0,...n),h=Math.max(...n)-m||1,g=i.resolveMotion(l,0),_=g.duration,v=r.resolveEasing(g.easing);for(;t.children.length>d;){let e=t.lastElementChild;e&&t.removeChild(e)}for(let r=0;r<d;r++){let i=Math.max(1,(n[r]-m)/h*s),o=s-i,l=t.children[r];if(l||(l=e.createSvgElement(`rect`,{class:`prism-spark-bar`}),t.appendChild(l)),e.setAttributes(l,{fill:c,width:f,x:r*p}),_>0&&!l.hasAttribute(`data-init`)){l.setAttribute(`data-init`,`1`),e.setAttributes(l,{height:0,y:s});let t=null,n={h:0,y:s},r={h:i,y:o},frame=i=>{if(u?.aborted)return;t===null&&(t=i);let o=v(Math.min(1,(i-t)/_));e.setAttributes(l,{height:a.tweenNumber(n.h,r.h,o),y:a.tweenNumber(n.y,r.y,o)}),o<1&&requestAnimationFrame(frame)};requestAnimationFrame(frame)}else l.setAttribute(`data-init`,`1`),e.setAttributes(l,{height:i,y:o})}}function isStackData(e){return e.length>0&&e[0]!==null&&typeof e[0]==`object`}function buildRoundedStackRect(e,t,n,r,i,a,o){let s=Math.min(i,n/2,r/2),c=a?s:0,l=a?s:0,u=o?s:0,d=o?s:0;return[`M${e+c},${t}`,`H${e+n-u}`,u?`Q${e+n},${t} ${e+n},${t+u}`:``,`V${t+r-d}`,d?`Q${e+n},${t+r} ${e+n-d},${t+r}`:``,`H${e+l}`,l?`Q${e},${t+r} ${e},${t+r-l}`:``,`V${t+c}`,c?`Q${e},${t} ${e+c},${t}`:``,`Z`].filter(Boolean).join(``)}function defaultStackColor(e){return`var(--prism-color-${e%8+1})`}function createSparkline(r,i){let a=i.variant??`line`,o=i.color??`var(--prism-color-1)`,s=i.curve??`linear`,c=i.strokeWidth??1.5,l=i.fillOpacity??.2,u=i.data,d=n.createChartBase(r,{a11y:i.a11y,margin:{bottom:0,left:0,right:0,top:0}},renderAll),{svg:f}=d;f.classList.add(`prism-sparkline`);let p=e.createSvgElement(`g`,{class:`prism-spark-inner`});f.appendChild(p);let cleanupInteraction;function renderAll(){let{height:t,width:n}=d.dimensions;for(;p.firstChild;)p.removeChild(p.firstChild);if(u.length!==0){if(a===`stack`&&isStackData(u)){let r=e.createSvgElement(`g`,{class:`prism-spark-stack`});p.appendChild(r);let a=i.cornerRadius??4,o=u,s=o.reduce((e,t)=>e+Math.max(0,t.value),0);if(s>0){let c=(i.padPixels??0)/2,l=0;o.forEach((i,u)=>{let d=Math.round(l);l+=Math.max(0,i.value)/s*n;let f=u===o.length-1?n:Math.round(l),p=u===0,m=u===o.length-1,h=buildRoundedStackRect(d+(p?0:c),0,Math.max(0,f-d-(p?0:c)-(m?0:c)),t,a,p,m),g=e.createSvgElement(`path`,{class:`prism-spark-stack-segment`});e.setAttributes(g,{d:h,fill:i.color??defaultStackColor(u)}),r.appendChild(g)})}}else if(a===`bar`){let r=e.createSvgElement(`g`,{class:`prism-spark-bars`});p.appendChild(r),renderSparkBars(r,u,n,t,o,i.transition,m.signal)}else{if(a===`area`){let r=e.createSvgElement(`path`,{class:`prism-spark-fill`}),i=buildAreaPath(u,n,t,s);e.setAttributes(r,{d:i,fill:o,"fill-opacity":l,stroke:`none`}),p.appendChild(r)}let r=e.createSvgElement(`path`,{class:`prism-spark-line`}),i=buildPath(u,n,t,s);e.setAttributes(r,{d:i,fill:`none`,stroke:o,"stroke-width":c}),p.appendChild(r)}isStackData(u)||attachInteraction(u)}}function attachInteraction(e){if(cleanupInteraction?.(),cleanupInteraction=void 0,!i.onHover&&!i.onClick||e.length<=1)return;let{width:t}=d.dimensions;f.style.cursor=`crosshair`;let n=t/(e.length-1),handleMove=t=>{let r=f.getBoundingClientRect(),a=t.clientX-r.left,o=Math.max(0,Math.min(e.length-1,Math.round(a/n)));i.onHover?.(o,e[o])},handleLeave=()=>i.onHover?.(null,null),handleClick=t=>{if(!i.onClick)return;let r=f.getBoundingClientRect(),a=t.clientX-r.left,o=Math.max(0,Math.min(e.length-1,Math.round(a/n)));i.onClick(o,e[o])};f.addEventListener(`mousemove`,handleMove),f.addEventListener(`mouseleave`,handleLeave),f.addEventListener(`click`,handleClick),cleanupInteraction=()=>{f.removeEventListener(`mousemove`,handleMove),f.removeEventListener(`mouseleave`,handleLeave),f.removeEventListener(`click`,handleClick)}}let m=new AbortController,h=!1;try{return renderAll(),{get disposalSignal(){return m.signal},dispose(){h||(h=!0,m.abort(),cleanupInteraction?.(),d.dispose())},get disposed(){return h},el:f,update(e){if(h)throw new t.PrismRenderError(`Cannot update a disposed chart.`);u=e,renderAll()},[Symbol.dispose](){this.dispose()}}}catch(e){throw m.abort(),cleanupInteraction?.(),d.dispose(),e instanceof t.PrismRenderError?e:new t.PrismRenderError(`Failed to render chart.`,{cause:e})}}exports.createSparkline=createSparkline;
2
2
  //# sourceMappingURL=sparkline.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sparkline.cjs","names":[],"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
+ {"version":3,"file":"sparkline.cjs","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,192 +1,2 @@
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
- import { areaPath as s, linePath as c, monotonePath as l, stepPath as u } from "../../svg/path.js";
8
- //#region src/charts/sparkline/sparkline.ts
9
- function d(e, t, n) {
10
- if (e.length === 0) return [];
11
- let r = t / Math.max(1, e.length - 1), i = Math.min(...e), a = Math.max(...e) - i || 1;
12
- return e.map((e, t) => ({
13
- x: t * r,
14
- y: n - (e - i) / a * n
15
- }));
16
- }
17
- function f(e, t, n, r = "linear") {
18
- if (e.length === 0) return "";
19
- let i = d(e, t, n), a = i.map((e) => ({
20
- x: e.x,
21
- y: n
22
- }));
23
- return s(i, a, r ?? "linear");
24
- }
25
- function p(e, t, n, r) {
26
- if (e.length === 0) return "";
27
- let i = d(e, t, n);
28
- return r === "monotone" ? l(i) : r === "step" ? u(i) : c(i);
29
- }
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);
35
- }
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, {
39
- fill: l,
40
- width: p,
41
- x: i * m
42
- }), v > 0 && !u.hasAttribute("data-init")) {
43
- u.setAttribute("data-init", "1"), t(u, {
44
- height: 0,
45
- y: c
46
- });
47
- let e = null, n = {
48
- h: 0,
49
- y: c
50
- }, r = {
51
- h: a,
52
- y: s
53
- }, i = (a) => {
54
- if (d?.aborted) return;
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);
61
- };
62
- requestAnimationFrame(i);
63
- } else u.setAttribute("data-init", "1"), t(u, {
64
- height: a,
65
- y: s
66
- });
67
- }
68
- }
69
- function h(e) {
70
- return e.length > 0 && e[0] !== null && typeof e[0] == "object";
71
- }
72
- function g(e, t, n, r, i, a, o) {
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;
74
- return [
75
- `M${e + c},${t}`,
76
- `H${e + n - u}`,
77
- u ? `Q${e + n},${t} ${e + n},${t + u}` : "",
78
- `V${t + r - d}`,
79
- d ? `Q${e + n},${t + r} ${e + n - d},${t + r}` : "",
80
- `H${e + l}`,
81
- l ? `Q${e},${t + r} ${e},${t + r - l}` : "",
82
- `V${t + c}`,
83
- c ? `Q${e},${t} ${e + c},${t}` : "",
84
- "Z"
85
- ].filter(Boolean).join("");
86
- }
87
- function _(e) {
88
- return `var(--prism-color-${e % 8 + 1})`;
89
- }
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,
93
- margin: {
94
- bottom: 0,
95
- left: 0,
96
- right: 0,
97
- top: 0
98
- }
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) => {
115
- let f = Math.round(u);
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);
122
- });
123
- }
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);
127
- } else {
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,
132
- fill: s,
133
- "fill-opacity": u,
134
- stroke: "none"
135
- }), b.appendChild(i);
136
- }
137
- let i = e("path", { class: "prism-spark-line" }), a = p(d, r, n, c);
138
- t(i, {
139
- d: a,
140
- fill: "none",
141
- stroke: s,
142
- "stroke-width": l
143
- }), b.appendChild(i);
144
- }
145
- h(d) || C(d);
146
- }
147
- }
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]);
159
- };
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);
162
- };
163
- }
164
- let w = new AbortController(), T = !1;
165
- try {
166
- return S(), {
167
- get disposalSignal() {
168
- return w.signal;
169
- },
170
- dispose() {
171
- T || (T = !0, w.abort(), x?.(), v.dispose());
172
- },
173
- get disposed() {
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
- },
181
- [Symbol.dispose]() {
182
- this.dispose();
183
- }
184
- };
185
- } catch (e) {
186
- throw w.abort(), x?.(), v.dispose(), e instanceof n ? e : new n("Failed to render chart.", { cause: e });
187
- }
188
- }
189
- //#endregion
190
- export { v as createSparkline };
191
-
1
+ import{createSvgElement as e,setAttributes as t}from"../../svg/element.js";import{PrismRenderError as n}from"../../errors.js";import{createChartBase as r}from"../../core/chart-base.js";import{resolveEasing as i}from"../../animation/easing.js";import{resolveMotion as a}from"../../animation/motion.js";import{tweenNumber as o}from"../../animation/tween.js";import{areaPath as s,linePath as c,monotonePath as l,stepPath as u}from"../../svg/path.js";function buildTopPoints(e,t,n){if(e.length===0)return[];let r=t/Math.max(1,e.length-1),i=Math.min(...e),a=Math.max(...e)-i||1;return e.map((e,t)=>({x:t*r,y:n-(e-i)/a*n}))}function buildAreaPath(e,t,n,r=`linear`){if(e.length===0)return``;let i=buildTopPoints(e,t,n),a=i.map(e=>({x:e.x,y:n}));return s(i,a,r??`linear`)}function buildPath(e,t,n,r){if(e.length===0)return``;let i=buildTopPoints(e,t,n);return r===`monotone`?l(i):r===`step`?u(i):c(i)}function renderSparkBars(n,r,s,c,l,u,d){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);for(;n.children.length>f;){let e=n.lastElementChild;e&&n.removeChild(e)}for(let i=0;i<f;i++){let a=Math.max(1,(r[i]-h)/g*c),s=c-a,u=n.children[i];if(u||(u=e(`rect`,{class:`prism-spark-bar`}),n.appendChild(u)),t(u,{fill:l,width:p,x:i*m}),v>0&&!u.hasAttribute(`data-init`)){u.setAttribute(`data-init`,`1`),t(u,{height:0,y:c});let e=null,n={h:0,y:c},r={h:a,y:s},frame=i=>{if(d?.aborted)return;e===null&&(e=i);let a=y(Math.min(1,(i-e)/v));t(u,{height:o(n.h,r.h,a),y:o(n.y,r.y,a)}),a<1&&requestAnimationFrame(frame)};requestAnimationFrame(frame)}else u.setAttribute(`data-init`,`1`),t(u,{height:a,y:s})}}function isStackData(e){return e.length>0&&e[0]!==null&&typeof e[0]==`object`}function buildRoundedStackRect(e,t,n,r,i,a,o){let s=Math.min(i,n/2,r/2),c=a?s:0,l=a?s:0,u=o?s:0,d=o?s:0;return[`M${e+c},${t}`,`H${e+n-u}`,u?`Q${e+n},${t} ${e+n},${t+u}`:``,`V${t+r-d}`,d?`Q${e+n},${t+r} ${e+n-d},${t+r}`:``,`H${e+l}`,l?`Q${e},${t+r} ${e},${t+r-l}`:``,`V${t+c}`,c?`Q${e},${t} ${e+c},${t}`:``,`Z`].filter(Boolean).join(``)}function defaultStackColor(e){return`var(--prism-color-${e%8+1})`}function createSparkline(i,a){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,f=r(i,{a11y:a.a11y,margin:{bottom:0,left:0,right:0,top:0}},renderAll),{svg:p}=f;p.classList.add(`prism-sparkline`);let m=e(`g`,{class:`prism-spark-inner`});p.appendChild(m);let cleanupInteraction;function renderAll(){let{height:n,width:r}=f.dimensions;for(;m.firstChild;)m.removeChild(m.firstChild);if(d.length!==0){if(o===`stack`&&isStackData(d)){let i=e(`g`,{class:`prism-spark-stack`});m.appendChild(i);let o=a.cornerRadius??4,s=d,c=s.reduce((e,t)=>e+Math.max(0,t.value),0);if(c>0){let l=(a.padPixels??0)/2,u=0;s.forEach((a,d)=>{let f=Math.round(u);u+=Math.max(0,a.value)/c*r;let p=d===s.length-1?r:Math.round(u),m=d===0,h=d===s.length-1,g=buildRoundedStackRect(f+(m?0:l),0,Math.max(0,p-f-(m?0:l)-(h?0:l)),n,o,m,h),_=e(`path`,{class:`prism-spark-stack-segment`});t(_,{d:g,fill:a.color??defaultStackColor(d)}),i.appendChild(_)})}}else if(o===`bar`){let t=e(`g`,{class:`prism-spark-bars`});m.appendChild(t),renderSparkBars(t,d,r,n,s,a.transition,h.signal)}else{if(o===`area`){let i=e(`path`,{class:`prism-spark-fill`}),a=buildAreaPath(d,r,n,c);t(i,{d:a,fill:s,"fill-opacity":u,stroke:`none`}),m.appendChild(i)}let i=e(`path`,{class:`prism-spark-line`}),a=buildPath(d,r,n,c);t(i,{d:a,fill:`none`,stroke:s,"stroke-width":l}),m.appendChild(i)}isStackData(d)||attachInteraction(d)}}function attachInteraction(e){if(cleanupInteraction?.(),cleanupInteraction=void 0,!a.onHover&&!a.onClick||e.length<=1)return;let{width:t}=f.dimensions;p.style.cursor=`crosshair`;let n=t/(e.length-1),handleMove=t=>{let r=p.getBoundingClientRect(),i=t.clientX-r.left,o=Math.max(0,Math.min(e.length-1,Math.round(i/n)));a.onHover?.(o,e[o])},handleLeave=()=>a.onHover?.(null,null),handleClick=t=>{if(!a.onClick)return;let r=p.getBoundingClientRect(),i=t.clientX-r.left,o=Math.max(0,Math.min(e.length-1,Math.round(i/n)));a.onClick(o,e[o])};p.addEventListener(`mousemove`,handleMove),p.addEventListener(`mouseleave`,handleLeave),p.addEventListener(`click`,handleClick),cleanupInteraction=()=>{p.removeEventListener(`mousemove`,handleMove),p.removeEventListener(`mouseleave`,handleLeave),p.removeEventListener(`click`,handleClick)}}let h=new AbortController,g=!1;try{return renderAll(),{get disposalSignal(){return h.signal},dispose(){g||(g=!0,h.abort(),cleanupInteraction?.(),f.dispose())},get disposed(){return g},el:p,update(e){if(g)throw new n(`Cannot update a disposed chart.`);d=e,renderAll()},[Symbol.dispose](){this.dispose()}}}catch(e){throw h.abort(),cleanupInteraction?.(),f.dispose(),e instanceof n?e:new n(`Failed to render chart.`,{cause:e})}}export{createSparkline};
192
2
  //# sourceMappingURL=sparkline.js.map
@@ -1 +1 @@
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
+ {"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");function e(e){return e instanceof Date?`date:${e.getTime()}`:`${typeof e}:${String(e)}`}function t(t,n){let r=[],i=new Map;return{domain:r,labels:i,series:t.map((t,a)=>{let o=new Map;for(let s of n[a]??[]){let n=e(s.key);if(o.has(n)){`${String(s.key)}${t.name}`;continue}o.set(n,s),i.has(n)||(i.set(n,s.key),r.push(n))}return{byKey:o,config:t}})}}exports.keyId=e,exports.normalizeCartesianSeries=t;
1
+ require("../_dev.cjs");function keyId(e){return e instanceof Date?`date:${e.getTime()}`:`${typeof e}:${String(e)}`}function normalizeCartesianSeries(e,t){let n=[],r=new Map;return{domain:n,labels:r,series:e.map((e,i)=>{let a=new Map;for(let o of t[i]??[]){let t=keyId(o.key);if(a.has(t)){`${String(o.key)}${e.name}`;continue}a.set(t,o),r.has(t)||(r.set(t,o.key),n.push(t))}return{byKey:a,config:e}})}}exports.keyId=keyId,exports.normalizeCartesianSeries=normalizeCartesianSeries;
2
2
  //# sourceMappingURL=cartesian-model.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-model.cjs","names":[],"sources":["../../src/core/cartesian-model.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { Datum, Series } from '../types';\n\nexport type CartesianKey = string;\n\nexport interface CartesianSeries<S extends Series = Series> {\n readonly byKey: ReadonlyMap<CartesianKey, Datum>;\n readonly config: S;\n}\n\nexport interface CartesianModel<S extends Series = Series> {\n readonly domain: CartesianKey[];\n readonly labels: ReadonlyMap<CartesianKey, Datum['key']>;\n readonly series: readonly CartesianSeries<S>[];\n}\n\nexport function keyId(key: Datum['key']): CartesianKey {\n if (key instanceof Date) return `date:${key.getTime()}`;\n\n return `${typeof key}:${String(key)}`;\n}\n\nexport function normalizeCartesianSeries<S extends Series>(\n series: readonly S[],\n data: readonly (readonly Datum[])[],\n): CartesianModel<S> {\n const domain: CartesianKey[] = [];\n const labels = new Map<CartesianKey, Datum['key']>();\n const normalized = series.map((config, seriesIndex) => {\n const byKey = new Map<CartesianKey, Datum>();\n\n for (const datum of data[seriesIndex] ?? []) {\n const id = keyId(datum.key);\n\n if (byKey.has(id)) {\n warn(`Duplicate datum key \"${String(datum.key)}\" in series \"${config.name}\"; keeping the first value.`);\n continue;\n }\n\n byKey.set(id, datum);\n\n if (!labels.has(id)) {\n labels.set(id, datum.key);\n domain.push(id);\n }\n }\n\n return { byKey, config } satisfies CartesianSeries<S>;\n });\n\n return { domain, labels, series: normalized };\n}\n"],"mappings":"uBAgBA,SAAgB,EAAM,EAAiC,CAGrD,OAFI,aAAe,KAAa,QAAQ,EAAI,QAAQ,IAE7C,GAAG,OAAO,EAAI,GAAG,OAAO,CAAG,GACpC,CAEA,SAAgB,EACd,EACA,EACmB,CACnB,IAAM,EAAyB,CAAC,EAC1B,EAAS,IAAI,IAuBnB,MAAO,CAAE,SAAQ,SAAQ,OAtBN,EAAO,KAAK,EAAQ,IAAgB,CACrD,IAAM,EAAQ,IAAI,IAElB,IAAK,IAAM,KAAS,EAAK,IAAgB,CAAC,EAAG,CAC3C,IAAM,EAAK,EAAM,EAAM,GAAG,EAE1B,GAAI,EAAM,IAAI,CAAE,EAAG,CACZ,GAAwB,OAAO,EAAM,GAAG,EAAxC,EAAyD,EAAO,KAAhE,EACL,QACF,CAEA,EAAM,IAAI,EAAI,CAAK,EAEd,EAAO,IAAI,CAAE,IAChB,EAAO,IAAI,EAAI,EAAM,GAAG,EACxB,EAAO,KAAK,CAAE,EAElB,CAEA,MAAO,CAAE,QAAO,QAAO,CACzB,CAEiC,CAAW,CAC9C"}
1
+ {"version":3,"file":"cartesian-model.cjs","names":[],"sources":["../../src/core/cartesian-model.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { Datum, Series } from '../types';\n\nexport type CartesianKey = string;\n\nexport interface CartesianSeries<S extends Series = Series> {\n readonly byKey: ReadonlyMap<CartesianKey, Datum>;\n readonly config: S;\n}\n\nexport interface CartesianModel<S extends Series = Series> {\n readonly domain: CartesianKey[];\n readonly labels: ReadonlyMap<CartesianKey, Datum['key']>;\n readonly series: readonly CartesianSeries<S>[];\n}\n\nexport function keyId(key: Datum['key']): CartesianKey {\n if (key instanceof Date) return `date:${key.getTime()}`;\n\n return `${typeof key}:${String(key)}`;\n}\n\nexport function normalizeCartesianSeries<S extends Series>(\n series: readonly S[],\n data: readonly (readonly Datum[])[],\n): CartesianModel<S> {\n const domain: CartesianKey[] = [];\n const labels = new Map<CartesianKey, Datum['key']>();\n const normalized = series.map((config, seriesIndex) => {\n const byKey = new Map<CartesianKey, Datum>();\n\n for (const datum of data[seriesIndex] ?? []) {\n const id = keyId(datum.key);\n\n if (byKey.has(id)) {\n warn(`Duplicate datum key \"${String(datum.key)}\" in series \"${config.name}\"; keeping the first value.`);\n continue;\n }\n\n byKey.set(id, datum);\n\n if (!labels.has(id)) {\n labels.set(id, datum.key);\n domain.push(id);\n }\n }\n\n return { byKey, config } satisfies CartesianSeries<S>;\n });\n\n return { domain, labels, series: normalized };\n}\n"],"mappings":"uBAgBA,SAAgB,MAAM,EAAiC,CAGrD,OAFI,aAAe,KAAa,QAAQ,EAAI,QAAQ,IAE7C,GAAG,OAAO,EAAI,GAAG,OAAO,CAAG,GACpC,CAEA,SAAgB,yBACd,EACA,EACmB,CACnB,IAAM,EAAyB,CAAC,EAC1B,EAAS,IAAI,IAuBnB,MAAO,CAAE,SAAQ,SAAQ,OAtBN,EAAO,KAAK,EAAQ,IAAgB,CACrD,IAAM,EAAQ,IAAI,IAElB,IAAK,IAAM,KAAS,EAAK,IAAgB,CAAC,EAAG,CAC3C,IAAM,EAAK,MAAM,EAAM,GAAG,EAE1B,GAAI,EAAM,IAAI,CAAE,EAAG,CACZ,GAAwB,OAAO,EAAM,GAAG,EAAxC,EAAyD,EAAO,KAAhE,EACL,QACF,CAEA,EAAM,IAAI,EAAI,CAAK,EAEd,EAAO,IAAI,CAAE,IAChB,EAAO,IAAI,EAAI,EAAM,GAAG,EACxB,EAAO,KAAK,CAAE,EAElB,CAEA,MAAO,CAAE,QAAO,QAAO,CACzB,CAEiC,CAAW,CAC9C"}
@@ -1,31 +1,2 @@
1
- import "../_dev.js";
2
- //#region src/core/cartesian-model.ts
3
- function e(e) {
4
- return e instanceof Date ? `date:${e.getTime()}` : `${typeof e}:${String(e)}`;
5
- }
6
- function t(t, n) {
7
- let r = [], i = /* @__PURE__ */ new Map();
8
- return {
9
- domain: r,
10
- labels: i,
11
- series: t.map((t, a) => {
12
- let o = /* @__PURE__ */ new Map();
13
- for (let s of n[a] ?? []) {
14
- let n = e(s.key);
15
- if (o.has(n)) {
16
- `${String(s.key)}${t.name}`;
17
- continue;
18
- }
19
- o.set(n, s), i.has(n) || (i.set(n, s.key), r.push(n));
20
- }
21
- return {
22
- byKey: o,
23
- config: t
24
- };
25
- })
26
- };
27
- }
28
- //#endregion
29
- export { e as keyId, t as normalizeCartesianSeries };
30
-
1
+ import"../_dev.js";function keyId(e){return e instanceof Date?`date:${e.getTime()}`:`${typeof e}:${String(e)}`}function normalizeCartesianSeries(e,t){let n=[],r=new Map;return{domain:n,labels:r,series:e.map((e,i)=>{let a=new Map;for(let o of t[i]??[]){let t=keyId(o.key);if(a.has(t)){`${String(o.key)}${e.name}`;continue}a.set(t,o),r.has(t)||(r.set(t,o.key),n.push(t))}return{byKey:a,config:e}})}}export{keyId,normalizeCartesianSeries};
31
2
  //# sourceMappingURL=cartesian-model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-model.js","names":[],"sources":["../../src/core/cartesian-model.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { Datum, Series } from '../types';\n\nexport type CartesianKey = string;\n\nexport interface CartesianSeries<S extends Series = Series> {\n readonly byKey: ReadonlyMap<CartesianKey, Datum>;\n readonly config: S;\n}\n\nexport interface CartesianModel<S extends Series = Series> {\n readonly domain: CartesianKey[];\n readonly labels: ReadonlyMap<CartesianKey, Datum['key']>;\n readonly series: readonly CartesianSeries<S>[];\n}\n\nexport function keyId(key: Datum['key']): CartesianKey {\n if (key instanceof Date) return `date:${key.getTime()}`;\n\n return `${typeof key}:${String(key)}`;\n}\n\nexport function normalizeCartesianSeries<S extends Series>(\n series: readonly S[],\n data: readonly (readonly Datum[])[],\n): CartesianModel<S> {\n const domain: CartesianKey[] = [];\n const labels = new Map<CartesianKey, Datum['key']>();\n const normalized = series.map((config, seriesIndex) => {\n const byKey = new Map<CartesianKey, Datum>();\n\n for (const datum of data[seriesIndex] ?? []) {\n const id = keyId(datum.key);\n\n if (byKey.has(id)) {\n warn(`Duplicate datum key \"${String(datum.key)}\" in series \"${config.name}\"; keeping the first value.`);\n continue;\n }\n\n byKey.set(id, datum);\n\n if (!labels.has(id)) {\n labels.set(id, datum.key);\n domain.push(id);\n }\n }\n\n return { byKey, config } satisfies CartesianSeries<S>;\n });\n\n return { domain, labels, series: normalized };\n}\n"],"mappings":";;AAgBA,SAAgB,EAAM,GAAiC;CAGrD,OAFI,aAAe,OAAa,QAAQ,EAAI,QAAQ,MAE7C,GAAG,OAAO,EAAI,GAAG,OAAO,CAAG;AACpC;AAEA,SAAgB,EACd,GACA,GACmB;CACnB,IAAM,IAAyB,CAAC,GAC1B,oBAAS,IAAI,IAAgC;CAuBnD,OAAO;EAAE;EAAQ;EAAQ,QAtBN,EAAO,KAAK,GAAQ,MAAgB;GACrD,IAAM,oBAAQ,IAAI,IAAyB;GAE3C,KAAK,IAAM,KAAS,EAAK,MAAgB,CAAC,GAAG;IAC3C,IAAM,IAAK,EAAM,EAAM,GAAG;IAE1B,IAAI,EAAM,IAAI,CAAE,GAAG;KACjB,AAAK,GAAwB,OAAO,EAAM,GAAG,EAAxC,EAAyD,EAAO,KAAhE;KACL;IACF;IAIA,AAFA,EAAM,IAAI,GAAI,CAAK,GAEd,EAAO,IAAI,CAAE,MAChB,EAAO,IAAI,GAAI,EAAM,GAAG,GACxB,EAAO,KAAK,CAAE;GAElB;GAEA,OAAO;IAAE;IAAO;GAAO;EACzB,CAEiC;CAAW;AAC9C"}
1
+ {"version":3,"file":"cartesian-model.js","names":[],"sources":["../../src/core/cartesian-model.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { Datum, Series } from '../types';\n\nexport type CartesianKey = string;\n\nexport interface CartesianSeries<S extends Series = Series> {\n readonly byKey: ReadonlyMap<CartesianKey, Datum>;\n readonly config: S;\n}\n\nexport interface CartesianModel<S extends Series = Series> {\n readonly domain: CartesianKey[];\n readonly labels: ReadonlyMap<CartesianKey, Datum['key']>;\n readonly series: readonly CartesianSeries<S>[];\n}\n\nexport function keyId(key: Datum['key']): CartesianKey {\n if (key instanceof Date) return `date:${key.getTime()}`;\n\n return `${typeof key}:${String(key)}`;\n}\n\nexport function normalizeCartesianSeries<S extends Series>(\n series: readonly S[],\n data: readonly (readonly Datum[])[],\n): CartesianModel<S> {\n const domain: CartesianKey[] = [];\n const labels = new Map<CartesianKey, Datum['key']>();\n const normalized = series.map((config, seriesIndex) => {\n const byKey = new Map<CartesianKey, Datum>();\n\n for (const datum of data[seriesIndex] ?? []) {\n const id = keyId(datum.key);\n\n if (byKey.has(id)) {\n warn(`Duplicate datum key \"${String(datum.key)}\" in series \"${config.name}\"; keeping the first value.`);\n continue;\n }\n\n byKey.set(id, datum);\n\n if (!labels.has(id)) {\n labels.set(id, datum.key);\n domain.push(id);\n }\n }\n\n return { byKey, config } satisfies CartesianSeries<S>;\n });\n\n return { domain, labels, series: normalized };\n}\n"],"mappings":"mBAgBA,SAAgB,MAAM,EAAiC,CAGrD,OAFI,aAAe,KAAa,QAAQ,EAAI,QAAQ,IAE7C,GAAG,OAAO,EAAI,GAAG,OAAO,CAAG,GACpC,CAEA,SAAgB,yBACd,EACA,EACmB,CACnB,IAAM,EAAyB,CAAC,EAC1B,EAAS,IAAI,IAuBnB,MAAO,CAAE,SAAQ,SAAQ,OAtBN,EAAO,KAAK,EAAQ,IAAgB,CACrD,IAAM,EAAQ,IAAI,IAElB,IAAK,IAAM,KAAS,EAAK,IAAgB,CAAC,EAAG,CAC3C,IAAM,EAAK,MAAM,EAAM,GAAG,EAE1B,GAAI,EAAM,IAAI,CAAE,EAAG,CACZ,GAAwB,OAAO,EAAM,GAAG,EAAxC,EAAyD,EAAO,KAAhE,EACL,QACF,CAEA,EAAM,IAAI,EAAI,CAAK,EAEd,EAAO,IAAI,CAAE,IAChB,EAAO,IAAI,EAAI,EAAM,GAAG,EACxB,EAAO,KAAK,CAAE,EAElB,CAEA,MAAO,CAAE,QAAO,QAAO,CACzB,CAEiC,CAAW,CAC9C"}
@@ -1,2 +1,2 @@
1
- require("../_dev.cjs");const e=require("../scales/linear.cjs"),t=require("../scales/time.cjs");function n(n,r){if(n.length===0||n.some(e=>e==null)||n.some(e=>typeof e==`number`&&!Number.isFinite(e)))return e.linearScale({domain:[0,1],range:[0,r]});if(n[0]instanceof Date){let e=n,i=Math.min(...e.map(Number)),a=Math.max(...e.map(Number)),o=new Date(i),s=new Date(i===a?a+1:a);return t.timeScale({domain:[o,s],range:[0,r]})}let i=n,a=Math.min(...i),o=Math.max(...i);return e.linearScale({domain:[a,a===o?o+1:o],nice:!1,range:[0,r]})}function r(t,n,r=!0){if(t.length===0||t.some(e=>e==null)||t.some(e=>!Number.isFinite(e)))return e.linearScale({domain:[0,1],range:[n,0]});let i=Math.min(...t),a=r?Math.min(0,i):i,o=Math.max(...t);return e.linearScale({domain:[a,a===o?o+1:o],range:[n,0]})}exports.buildXScale=n,exports.buildYScale=r;
1
+ require("../_dev.cjs");const e=require("../scales/linear.cjs"),t=require("../scales/time.cjs");function buildXScale(n,r){if(n.length===0||n.some(e=>e==null)||n.some(e=>typeof e==`number`&&!Number.isFinite(e)))return e.linearScale({domain:[0,1],range:[0,r]});if(n[0]instanceof Date){let e=n,i=Math.min(...e.map(Number)),a=Math.max(...e.map(Number)),o=new Date(i),s=new Date(i===a?a+1:a);return t.timeScale({domain:[o,s],range:[0,r]})}let i=n,a=Math.min(...i),o=Math.max(...i);return e.linearScale({domain:[a,a===o?o+1:o],nice:!1,range:[0,r]})}function buildYScale(t,n,r=!0){if(t.length===0||t.some(e=>e==null)||t.some(e=>!Number.isFinite(e)))return e.linearScale({domain:[0,1],range:[n,0]});let i=Math.min(...t),a=r?Math.min(0,i):i,o=Math.max(...t);return e.linearScale({domain:[a,a===o?o+1:o],range:[n,0]})}exports.buildXScale=buildXScale,exports.buildYScale=buildYScale;
2
2
  //# sourceMappingURL=cartesian-scales.cjs.map