@vielzeug/prism 26.11.5 → 26.11.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +25 -10
  2. package/dist/_dev.js +1 -2
  3. package/dist/_tappers.js +1 -2
  4. package/dist/animation/easing.js +1 -2
  5. package/dist/animation/motion.js +0 -1
  6. package/dist/animation/reveal.cjs +1 -1
  7. package/dist/animation/reveal.cjs.map +1 -1
  8. package/dist/animation/reveal.js +29 -30
  9. package/dist/animation/transition.js +1 -2
  10. package/dist/animation/tween.js +1 -2
  11. package/dist/axes/axis.js +1 -2
  12. package/dist/axes/grid.js +1 -2
  13. package/dist/axes/scale-utils.js +1 -2
  14. package/dist/charts/area/area-chart.cjs +1 -1
  15. package/dist/charts/area/area-chart.cjs.map +1 -1
  16. package/dist/charts/area/area-chart.js +34 -35
  17. package/dist/charts/area/area-renderer.cjs +1 -1
  18. package/dist/charts/area/area-renderer.cjs.map +1 -1
  19. package/dist/charts/area/area-renderer.js +56 -57
  20. package/dist/charts/area/area-renderer.js.map +1 -1
  21. package/dist/charts/bar/bar-chart.cjs +1 -1
  22. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  23. package/dist/charts/bar/bar-chart.js +80 -81
  24. package/dist/charts/bar/bar-chart.js.map +1 -1
  25. package/dist/charts/bar/bar-hit-test.js +1 -2
  26. package/dist/charts/bar/bar-renderer.cjs +1 -1
  27. package/dist/charts/bar/bar-renderer.cjs.map +1 -1
  28. package/dist/charts/bar/bar-renderer.js +42 -43
  29. package/dist/charts/bar/bar-value-labels.cjs +1 -1
  30. package/dist/charts/bar/bar-value-labels.cjs.map +1 -1
  31. package/dist/charts/bar/bar-value-labels.js +17 -18
  32. package/dist/charts/heatmap/heatmap-chart.cjs +1 -1
  33. package/dist/charts/heatmap/heatmap-chart.cjs.map +1 -1
  34. package/dist/charts/heatmap/heatmap-chart.js +43 -44
  35. package/dist/charts/heatmap/heatmap-color.js +1 -2
  36. package/dist/charts/line/line-chart.cjs +1 -1
  37. package/dist/charts/line/line-chart.cjs.map +1 -1
  38. package/dist/charts/line/line-chart.js +41 -42
  39. package/dist/charts/line/line-renderer.cjs +1 -1
  40. package/dist/charts/line/line-renderer.cjs.map +1 -1
  41. package/dist/charts/line/line-renderer.js +81 -82
  42. package/dist/charts/line/line-renderer.js.map +1 -1
  43. package/dist/charts/pie/pie-chart.cjs +1 -1
  44. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  45. package/dist/charts/pie/pie-chart.js +69 -70
  46. package/dist/charts/pie/pie-renderer.js +1 -2
  47. package/dist/charts/radar/radar-chart.cjs +1 -1
  48. package/dist/charts/radar/radar-chart.cjs.map +1 -1
  49. package/dist/charts/radar/radar-chart.js +118 -119
  50. package/dist/charts/radar/radar-chart.js.map +1 -1
  51. package/dist/charts/radar/radar-geometry.cjs +1 -1
  52. package/dist/charts/radar/radar-geometry.cjs.map +1 -1
  53. package/dist/charts/radar/radar-geometry.js +15 -16
  54. package/dist/charts/scatter/scatter-chart.cjs +1 -1
  55. package/dist/charts/scatter/scatter-chart.cjs.map +1 -1
  56. package/dist/charts/scatter/scatter-chart.js +33 -34
  57. package/dist/charts/scatter/scatter-renderer.cjs +1 -1
  58. package/dist/charts/scatter/scatter-renderer.cjs.map +1 -1
  59. package/dist/charts/scatter/scatter-renderer.js +22 -23
  60. package/dist/charts/sparkline/sparkline.cjs +1 -1
  61. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  62. package/dist/charts/sparkline/sparkline.js +87 -88
  63. package/dist/charts/sparkline/sparkline.js.map +1 -1
  64. package/dist/core/cartesian-model.js +1 -2
  65. package/dist/core/cartesian-scales.js +1 -2
  66. package/dist/core/chart-base.cjs +1 -1
  67. package/dist/core/chart-base.cjs.map +1 -1
  68. package/dist/core/chart-base.js +13 -14
  69. package/dist/core/chart-scaffold.cjs +1 -1
  70. package/dist/core/chart-scaffold.cjs.map +1 -1
  71. package/dist/core/chart-scaffold.js +33 -34
  72. package/dist/core/datum-style.js +1 -2
  73. package/dist/core/ids.js +1 -2
  74. package/dist/core/layout.js +1 -2
  75. package/dist/core/polar.js +1 -2
  76. package/dist/core/responsive.js +1 -2
  77. package/dist/core/series-id.js +1 -2
  78. package/dist/errors.js +1 -2
  79. package/dist/index.cjs +1 -1
  80. package/dist/index.js +14 -14
  81. package/dist/interaction/announcer.js +1 -2
  82. package/dist/interaction/crosshair.js +1 -2
  83. package/dist/interaction/events.js +1 -2
  84. package/dist/interaction/legend.js +1 -2
  85. package/dist/interaction/scatter-interaction.cjs +1 -1
  86. package/dist/interaction/scatter-interaction.cjs.map +1 -1
  87. package/dist/interaction/scatter-interaction.js +26 -27
  88. package/dist/interaction/series-interaction.cjs +1 -1
  89. package/dist/interaction/series-interaction.cjs.map +1 -1
  90. package/dist/interaction/series-interaction.js +40 -41
  91. package/dist/interaction/tooltip.js +1 -2
  92. package/dist/prism.cjs +1 -1
  93. package/dist/prism.cjs.map +1 -1
  94. package/dist/prism.iife.js +1 -1
  95. package/dist/prism.iife.js.map +1 -1
  96. package/dist/prism.js +52 -103
  97. package/dist/prism.js.map +1 -1
  98. package/dist/scales/band.js +1 -2
  99. package/dist/scales/linear.js +1 -2
  100. package/dist/scales/time.js +1 -2
  101. package/dist/svg/element.js +1 -2
  102. package/dist/svg/path.js +1 -2
  103. package/dist/svg/text.js +1 -2
  104. package/dist/theme/index.js +1 -2
  105. package/package.json +6 -6
@@ -1,17 +1,17 @@
1
- import { createSvgElement as e, setAttributes as t } from "../../svg/element.js";
2
- import { estimateTextWidth as n } from "../../svg/text.js";
3
- import { createRadialScaffold as r } from "../../core/chart-scaffold.js";
4
- import { seriesColor as i } from "../../theme/index.js";
5
- import { resolveEasing as a } from "../../animation/easing.js";
6
- import { resolveMotion as o } from "../../animation/motion.js";
7
- import { tweenNumber as s } from "../../animation/tween.js";
8
- import { startTween as c } from "../../animation/transition.js";
1
+ import { resolveEasing as e } from "../../animation/easing.js";
2
+ import { resolveMotion as t } from "../../animation/motion.js";
3
+ import { startTween as n } from "../../animation/transition.js";
4
+ import { tweenNumber as r } from "../../animation/tween.js";
5
+ import { createRadialScaffold as i } from "../../core/chart-scaffold.js";
6
+ import { createSvgElement as a, setAttributes as o } from "../../svg/element.js";
7
+ import { estimateTextWidth as s } from "../../svg/text.js";
8
+ import { seriesColor as c } from "../../theme/index.js";
9
9
  import { arcCentroid as l, arcPath as u, computeArcs as d } from "./pie-renderer.js";
10
- //#region src/charts/pie/pie-chart.ts
10
+ // src/charts/pie/pie-chart.ts
11
11
  var f = 2 * Math.PI, p = 12;
12
12
  function labelFits(e, t) {
13
- let r = e.outerRadius - e.innerRadius, i = (e.outerRadius + e.innerRadius) / 2, a = (e.endAngle - e.startAngle - 2 * e.padAngle) * i;
14
- return r >= p * 1.4 && a >= n(t, p) + 8;
13
+ let n = e.outerRadius - e.innerRadius, r = (e.outerRadius + e.innerRadius) / 2, i = (e.endAngle - e.startAngle - 2 * e.padAngle) * r;
14
+ return n >= p * 1.4 && i >= s(t, p) + 8;
15
15
  }
16
16
  var m = -Math.PI / 2, h = Math.PI / 2;
17
17
  function semiAngles(e) {
@@ -23,100 +23,100 @@ function semiAngles(e) {
23
23
  start: 0
24
24
  };
25
25
  }
26
- function createPieChart(n, f) {
27
- let p = f.variant ?? "pie", m = f.padPixels ?? (p === "pie" ? 0 : 8), h = f.cornerRadius ?? (p === "pie" ? 0 : 8), g = f.data, _ = e("circle", {
26
+ function createPieChart(s, f) {
27
+ let p = f.variant ?? "pie", m = f.padPixels ?? (p === "pie" ? 0 : 8), h = f.cornerRadius ?? (p === "pie" ? 0 : 8), g = f.data, _ = a("circle", {
28
28
  class: "prism-pie-bg",
29
29
  "pointer-events": "none"
30
- }), v = e("g", {
30
+ }), v = a("g", {
31
31
  class: "prism-pie-slices",
32
32
  "shape-rendering": "geometricPrecision"
33
- }), y = e("g", {
33
+ }), y = a("g", {
34
34
  class: "prism-pie-labels",
35
35
  "pointer-events": "none"
36
36
  }), b = [], x = [], S = null;
37
- function renderLabels(n) {
37
+ function renderLabels(e) {
38
38
  y.replaceChildren();
39
- for (let r = 0; r < b.length; r++) {
40
- let i = b[r], a = n[r];
41
- if (!a?.label || !labelFits(i, a.label)) continue;
42
- let { x: o, y: s } = l(i), c = e("text", { class: "prism-pie-label" });
43
- t(c, {
39
+ for (let t = 0; t < b.length; t++) {
40
+ let n = b[t], r = e[t];
41
+ if (!r?.label || !labelFits(n, r.label)) continue;
42
+ let { x: i, y: s } = l(n), c = a("text", { class: "prism-pie-label" });
43
+ o(c, {
44
44
  "dominant-baseline": "middle",
45
45
  fill: "var(--prism-pie-label-color, #fff)",
46
46
  "font-family": "var(--prism-font-family, system-ui)",
47
47
  "font-size": "var(--prism-pie-label-size, 12px)",
48
48
  "text-anchor": "middle",
49
- x: o,
49
+ x: i,
50
50
  y: s
51
- }), c.textContent = a.label, y.appendChild(c);
51
+ }), c.textContent = r.label, y.appendChild(c);
52
52
  }
53
53
  }
54
- return r(n, {
54
+ return i(s, {
55
55
  a11y: f.a11y,
56
56
  legend: f.legend,
57
57
  tooltip: f.tooltip
58
- }, (r) => {
59
- let { legend: C, svg: w, tooltip: T } = r, E = g.some((e) => e.value > 0);
58
+ }, (i) => {
59
+ let { legend: C, svg: w, tooltip: T } = i, E = g.some((e) => e.value > 0);
60
60
  C?.update(E ? g.map((e, t) => ({
61
- color: e.color ?? i(t),
61
+ color: e.color ?? c(t),
62
62
  name: e.label ?? ""
63
63
  })) : []), w.contains(_) || (w.appendChild(_), w.appendChild(v), w.appendChild(y));
64
- let { height: D, width: O } = r.dimensions, k = p === "semi", A = O / 2, j = k ? D * .85 : D / 2, M = k ? Math.min(A, j) - 8 : Math.min(O, D) / 2 - 8, N = p === "pie" ? 0 : Math.round(M * .55), P = f.innerRadius === void 0 ? N : f.innerRadius, F = Math.max(P + 1, M), I = g, { end: L, start: R } = semiAngles(p);
65
- for (b = d(I, A, j, F, P, R, L, m, h, (e) => i(e), !1), t(_, {
64
+ let { height: D, width: O } = i.dimensions, k = p === "semi", A = O / 2, j = k ? D * .85 : D / 2, M = k ? Math.min(A, j) - 8 : Math.min(O, D) / 2 - 8, N = p === "pie" ? 0 : Math.round(M * .55), P = f.innerRadius === void 0 ? N : f.innerRadius, F = Math.max(P + 1, M), I = g, { end: L, start: R } = semiAngles(p);
65
+ for (b = d(I, A, j, F, P, R, L, m, h, (e) => c(e), !1), o(_, {
66
66
  cx: A,
67
67
  cy: j,
68
68
  r: P > 0 ? P : 0
69
69
  }), _.setAttribute("style", "fill:var(--prism-bg,#fff)"); v.children.length > b.length;) v.removeChild(v.lastChild);
70
70
  y.replaceChildren();
71
- let z = o(f.transition), B = z.duration, V = a(z.easing);
72
- for (let t = 0; t < b.length; t++) {
73
- let n = b[t], r = v.children[t];
74
- r || (r = e("path", { class: "prism-pie-slice" }), v.appendChild(r)), r.setAttribute("fill", n.color), r.setAttribute("stroke", "none"), r.style.cursor = f.onClick || f.onHover ? "pointer" : "";
71
+ let z = t(f.transition), B = z.duration, V = e(z.easing);
72
+ for (let e = 0; e < b.length; e++) {
73
+ let t = b[e], n = v.children[e];
74
+ n || (n = a("path", { class: "prism-pie-slice" }), v.appendChild(n)), n.setAttribute("fill", t.color), n.setAttribute("stroke", "none"), n.style.cursor = f.onClick || f.onHover ? "pointer" : "";
75
75
  }
76
76
  S?.();
77
77
  let H = x.length === 0, U = x;
78
- S = c({
78
+ S = n({
79
79
  count: 1,
80
80
  duration: B,
81
81
  easing: V,
82
82
  onComplete: () => renderLabels(I),
83
83
  onFrame: (e) => {
84
- let n = e(0);
84
+ let t = e(0);
85
85
  if (H) {
86
- let e = s(R, L, n);
87
- x = b.map((n, r) => {
88
- let i = v.children[r];
89
- if (!i) return n;
90
- if (e <= n.startAngle) return t(i, { d: "" }), {
91
- ...n,
92
- endAngle: n.startAngle
86
+ let e = r(R, L, t);
87
+ x = b.map((t, n) => {
88
+ let r = v.children[n];
89
+ if (!r) return t;
90
+ if (e <= t.startAngle) return o(r, { d: "" }), {
91
+ ...t,
92
+ endAngle: t.startAngle
93
93
  };
94
- let a = Math.min(n.endAngle, e);
95
- return t(i, { d: u({
96
- ...n,
97
- endAngle: a
94
+ let i = Math.min(t.endAngle, e);
95
+ return o(r, { d: u({
96
+ ...t,
97
+ endAngle: i
98
98
  }) }), {
99
- ...n,
100
- endAngle: a
99
+ ...t,
100
+ endAngle: i
101
101
  };
102
102
  });
103
- } else x = b.map((e, r) => {
104
- let i = v.children[r], a = U.at(-1), o = U[r] ?? {
103
+ } else x = b.map((e, n) => {
104
+ let i = v.children[n], a = U.at(-1), s = U[n] ?? {
105
105
  ...e,
106
106
  endAngle: a?.endAngle ?? R,
107
107
  startAngle: a?.endAngle ?? R
108
108
  }, c = {
109
109
  ...e,
110
- endAngle: s(o.endAngle, e.endAngle, n),
111
- innerRadius: s(o.innerRadius, e.innerRadius, n),
112
- outerRadius: s(o.outerRadius, e.outerRadius, n),
113
- padAngle: s(o.padAngle, e.padAngle, n),
114
- startAngle: s(o.startAngle, e.startAngle, n)
110
+ endAngle: r(s.endAngle, e.endAngle, t),
111
+ innerRadius: r(s.innerRadius, e.innerRadius, t),
112
+ outerRadius: r(s.outerRadius, e.outerRadius, t),
113
+ padAngle: r(s.padAngle, e.padAngle, t),
114
+ startAngle: r(s.startAngle, e.startAngle, t)
115
115
  };
116
- return i && t(i, { d: c.endAngle - c.startAngle <= 1e-6 ? "" : u(c) }), c;
116
+ return i && o(i, { d: c.endAngle - c.startAngle <= 1e-6 ? "" : u(c) }), c;
117
117
  });
118
118
  },
119
- signal: r.disposalSignal
119
+ signal: i.disposalSignal
120
120
  }), T?.hide();
121
121
  let W = b.reduce((e, t) => e + Math.max(0, t.slice.value), 0), G = -1, describe = (e) => {
122
122
  let t = W > 0 ? Math.round(Math.max(0, e.slice.value) / W * 1e3) / 10 : 0;
@@ -125,29 +125,29 @@ function createPieChart(n, f) {
125
125
  G = e, v.classList.toggle("prism-pie-focused", e >= 0);
126
126
  for (let [t, n] of [...v.children].entries()) n.classList.toggle("prism-pie-slice--active", t === e);
127
127
  }, activate = (e, t) => {
128
- let i = b[e];
129
- if (!i) return;
128
+ let n = b[e];
129
+ if (!n) return;
130
130
  setActive(e), f.onHover?.({
131
131
  index: e,
132
132
  originalEvent: t,
133
- slice: i.slice
133
+ slice: n.slice
134
134
  });
135
- let a = describe(i);
135
+ let r = describe(n);
136
136
  if (!T) {
137
- r.announcer.announce(a);
137
+ i.announcer.announce(r);
138
138
  return;
139
139
  }
140
- let { x: o, y: s } = l(i), c = w.getBoundingClientRect(), u = n.getBoundingClientRect();
141
- T.show(o + (c.left - u.left), s + (c.top - u.top), {
140
+ let { x: a, y: o } = l(n), c = w.getBoundingClientRect(), u = s.getBoundingClientRect();
141
+ T.show(a + (c.left - u.left), o + (c.top - u.top), {
142
142
  key: e,
143
- value: i.slice.value
143
+ value: n.slice.value
144
144
  }, {
145
- color: i.color,
145
+ color: n.color,
146
146
  data: [],
147
- name: i.slice.label ?? ""
148
- }, a);
147
+ name: n.slice.label ?? ""
148
+ }, r);
149
149
  }, deactivate = () => {
150
- setActive(-1), T?.hide(), r.announcer.clear(), f.onHover?.(null);
150
+ setActive(-1), T?.hide(), i.announcer.clear(), f.onHover?.(null);
151
151
  }, hitAt = (e) => {
152
152
  let t = w.getBoundingClientRect();
153
153
  return hitTestArc(b, e.clientX - t.left, e.clientY - t.top, p);
@@ -202,7 +202,6 @@ function hitTestArc(e, t, n, r) {
202
202
  }
203
203
  return -1;
204
204
  }
205
- //#endregion
206
205
  export { createPieChart };
207
206
 
208
207
  //# sourceMappingURL=pie-chart.js.map
@@ -1,5 +1,5 @@
1
1
  import { polarPoint as e, polarX as t, polarY as n } from "../../core/polar.js";
2
- //#region src/charts/pie/pie-renderer.ts
2
+ // src/charts/pie/pie-renderer.ts
3
3
  function computeArcs(e, t, n, r, i, a, o, s, c, l, u = !1) {
4
4
  let d = e.reduce((e, t) => e + Math.max(0, t.value), 0);
5
5
  if (d === 0) return [];
@@ -63,7 +63,6 @@ function arcCentroid(e) {
63
63
  y: e.centerY - n * Math.cos(t)
64
64
  };
65
65
  }
66
- //#endregion
67
66
  export { arcCentroid, arcPath, computeArcs };
68
67
 
69
68
  //# sourceMappingURL=pie-renderer.js.map
@@ -1,2 +1,2 @@
1
- require("../../_dev.cjs");const e=require("../../svg/element.cjs"),t=require("../../interaction/announcer.cjs"),n=require("../../interaction/tooltip.cjs"),r=require("../../core/chart-scaffold.cjs"),i=require("../../core/series-id.cjs"),a=require("../../theme/index.cjs"),o=require("../../animation/easing.cjs"),s=require("../../animation/motion.cjs"),c=require("../../animation/tween.cjs"),l=require("../../animation/transition.cjs"),u=require("../../core/ids.cjs"),d=require("../../core/polar.cjs"),f=require("./radar-geometry.cjs");var p=11,m=12,h=10,g={ArrowDown:1,ArrowLeft:-1,ArrowRight:1,ArrowUp:-1};function resolveGrid(e){return e===!1?null:{bands:!0,labels:!1,levels:4,shape:`polygon`,...typeof e==`object`?e:{}}}function createRadarChart(_,v){let{axes:y}=v,b=v.curve??`linear`,x=v.fill??`solid`,S=v.showPoints??!0,C=resolveGrid(v.grid),w=f.toRadians(v.startAngle??0),T=f.axisAngles(y.length,w),E=m+(v.showValues?h:0),D=u.uniqueId(`prism-radar`),O=v.series,k=e.createSvgElement(`g`,{class:`prism-radar`}),A=e.createSvgElement(`defs`),j=e.createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-radar-grid`}),M=e.createSvgElement(`g`,{class:`prism-radar-series-group`}),N=e.createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-radar-labels`});k.append(A,j,M,N);let P=[],F=null,I=-1,L={cx:0,cy:0,radius:0},datumAt=(e,t)=>e.data.find(e=>e.key===y[t].key),valuesAt=e=>O.map(t=>({datum:datumAt(t,e),series:t})),formatValue=(e,t)=>y[e].format?.(t)??String(t),describe=e=>t.describeValues(y[e].label,valuesAt(e),t=>formatValue(e,t));function draw(t){let{cx:n,cy:r,radius:i}=L;t.forEach((t,a)=>{let o=M.children[a];if(!o)return;let s=f.radarPoints(t,n,r,i,T);o.querySelector(`.prism-radar-area`)?.setAttribute(`d`,f.closedPath(s,b)),o.querySelectorAll(`.prism-radar-point`).forEach((t,n)=>{e.setAttributes(t,{cx:s[n].x,cy:s[n].y})}),o.querySelectorAll(`.prism-radar-value`).forEach((a,o)=>{let s=i*t[o]+h;e.setAttributes(a,{x:d.polarX(n,s,T[o]),y:d.polarY(r,s,T[o])})})})}function renderGrid(t){if(j.replaceChildren(),!C)return;let{cx:n,cy:r,radius:i}=L,a=Math.max(1,Math.round(C.levels)),o=Array.from({length:a},(e,t)=>f.ringPath(C.shape,n,r,i*(t+1)/a,T));if(C.bands)for(let t=a-1;t>=0;t-=2)j.appendChild(e.createSvgElement(`path`,{class:`prism-radar-band`,d:`${o[t]}${o[t-1]??``}`,"fill-rule":`evenodd`}));for(let t of o)j.appendChild(e.createSvgElement(`path`,{class:`prism-radar-ring`,d:t,fill:`none`}));T.forEach((t,a)=>{j.appendChild(e.createSvgElement(`line`,{class:`prism-radar-spoke`,"data-axis":a,x1:n,x2:d.polarX(n,i,t),y1:r,y2:d.polarY(r,i,t)}))});let[s,c]=t[0],l=t.every(([e,t])=>e===s&&t===c);if(!C.labels||!l)return;let u=T[0]+Math.PI/T.length;for(let t=1;t<=a;t++){let o=i*t/a,l=e.createSvgElement(`text`,{class:`prism-radar-level`,"dominant-baseline":`middle`,"text-anchor":`middle`,x:d.polarX(n,o,u),y:d.polarY(r,o,u)});l.textContent=formatValue(0,Math.round((s+(c-s)*t/a)*100)/100),j.appendChild(l)}}function renderLabels(){N.replaceChildren();let{cx:t,cy:n,radius:r}=L;y.forEach((i,a)=>{let{anchor:o,baseline:s}=f.labelPlacement(T[a]),c=e.createSvgElement(`text`,{class:`prism-radar-axis-label`,"dominant-baseline":s,"text-anchor":o,x:d.polarX(t,r+E,T[a]),y:d.polarY(n,r+E,T[a])});c.textContent=i.label,N.appendChild(c)})}function renderSeries(){let{cx:t,cy:n,radius:r}=L;for(A.replaceChildren();M.children.length>O.length;)M.lastChild?.remove();O.forEach((o,s)=>{let c=o.color??a.seriesColor(s),l=M.children[s];l||(l=e.createSvgElement(`g`,{class:`prism-radar-series`}),M.appendChild(l)),l.setAttribute(`data-series-id`,i.seriesDomId(o,s)),l.replaceChildren();let u=e.createSvgElement(`path`,{class:`prism-radar-area prism-radar-area--${x}`,stroke:c,"stroke-linejoin":`round`,"stroke-width":2});if(x===`gradient`){let i=`${D}-fill-${s}`,a=e.createSvgElement(`radialGradient`,{cx:t,cy:n,gradientUnits:`userSpaceOnUse`,id:i,r});for(let[t,n]of[[0,.08],[1,.55]])a.appendChild(e.createSvgElement(`stop`,{offset:t,"stop-color":c,"stop-opacity":n,style:`stop-color:${c}`}));A.appendChild(a),e.setAttributes(u,{fill:`url(#${i})`})}else e.setAttributes(u,{fill:x===`none`?`none`:c,"fill-opacity":.25});l.appendChild(u),S&&y.forEach((t,n)=>{let r=!Number.isFinite(datumAt(o,n)?.value);l.appendChild(e.createSvgElement(`circle`,{class:`prism-radar-point${r?` prism-radar-point--missing`:``}`,"data-axis":n,fill:r?`none`:c,r:3,stroke:c}))}),v.showValues&&y.forEach((t,n)=>{let r=datumAt(o,n),{anchor:i,baseline:a}=f.labelPlacement(T[n]),s=e.createSvgElement(`text`,{"aria-hidden":`true`,class:`prism-radar-value`,"dominant-baseline":a,"text-anchor":i});s.textContent=r&&Number.isFinite(r.value)?formatValue(n,r.value):``,l.appendChild(s)})})}function setActive(e){I=e;for(let t of k.querySelectorAll(`[data-axis]`)){let n=Number(t.getAttribute(`data-axis`))===e;t.classList.toggle(t.tagName===`line`?`prism-radar-spoke--active`:`prism-radar-point--active`,n)}}function animateTo(e,t){F?.();let n=e.map((e,t)=>e.map((e,n)=>P[t]?.[n]??0)),r=s.resolveMotion(v.transition,{defaultDuration:400}),i=o.resolveEasing(r.easing??`ease-out`),a=n.every((t,n)=>t.every((t,r)=>t===e[n][r]));r.duration===0||a?(P=e,draw(e)):F=l.startTween({count:e.length,duration:r.duration,easing:i,onFrame:t=>{P=e.map((e,r)=>{let i=t(r);return e.map((e,t)=>c.tweenNumber(n[r][t],e,i))}),draw(P)},signal:t,stagger:r.stagger})}return r.createRadialScaffold(_,{a11y:v.a11y,legend:v.legend,tooltip:v.tooltip},e=>{let{legend:t,svg:r,tooltip:i}=e;if(r.contains(k)||r.appendChild(k),i?.hide(),t?.update(O.map((e,t)=>({color:e.color??a.seriesColor(t),name:e.name}))),y.length<3){for(let e of[A,j,M,N])e.replaceChildren();P=[];return}let{height:o,width:s}=e.dimensions,c=f.fitRadius(s,o,y.map(e=>e.label),T,p,E);L={cx:s/2,cy:o/2,radius:c};let l=f.resolveAxisDomains(y,O,v.domain);renderGrid(l),renderLabels(),renderSeries(),animateTo(O.map(e=>y.map((t,n)=>{let r=datumAt(e,n)?.value;return r!==void 0&&Number.isFinite(r)?f.normalize(r,l[n]):0})),e.disposalSignal),setActive(I);let eventFor=(e,t)=>({axis:y[e],index:e,originalEvent:t,values:valuesAt(e)}),activate=(t,o)=>{setActive(t),v.onHover?.(eventFor(t,o));let s=describe(t);if(!i){e.announcer.announce(s);return}let c=Math.max(0,...P.map(e=>e[t]??0)),l=r.getBoundingClientRect(),u=_.getBoundingClientRect(),f=valuesAt(t),p=f.find(e=>e.datum)?.datum,m=f.flatMap(({datum:e,series:n})=>e?[{color:n.color??a.seriesColor(O.indexOf(n)),name:n.name,value:formatValue(t,e.value)}]:[]);i.show(d.polarX(L.cx,L.radius*c,T[t])+(l.left-u.left),d.polarY(L.cy,L.radius*c,T[t])+(l.top-u.top),{key:y[t].key,meta:{axis:y[t],text:s,values:f},value:p?.value??0},{color:O[0]?.color??a.seriesColor(0),data:[],name:y[t].label},n.comparisonContent(r.ownerDocument,y[t].label,m,s))},deactivate=()=>{setActive(-1),v.onHover?.(null),i?.hide(),e.announcer.clear()},hitIndex=e=>{let t=r.getBoundingClientRect(),n=e.clientX-t.left-L.cx,i=e.clientY-t.top-L.cy;return Math.hypot(n,i)>L.radius+E+22?-1:f.nearestAxis(n,i,y.length,w)};return{onClick(e){let t=hitIndex(e);t>=0&&v.onClick?.(eventFor(t,e))},onKeyDown(e){let t=g[e.key];t===void 0?(e.key===`Enter`||e.key===` `)&&I>=0&&v.onClick?(e.preventDefault(),v.onClick(eventFor(I,e))):e.key===`Escape`&&deactivate():(e.preventDefault(),activate(I<0?0:(I+t+y.length)%y.length,e))},onMouseLeave:deactivate,onMouseMove(e){let t=hitIndex(e);t<0?I>=0&&deactivate():t!==I&&activate(t,e)}}},e=>{O=e})}exports.createRadarChart=createRadarChart;
1
+ require("../../_dev.cjs");const e=require("../../animation/easing.cjs"),t=require("../../animation/motion.cjs"),n=require("../../animation/transition.cjs"),r=require("../../animation/tween.cjs"),i=require("../../core/chart-scaffold.cjs"),a=require("../../core/ids.cjs"),o=require("../../core/polar.cjs"),s=require("../../core/series-id.cjs"),c=require("../../interaction/announcer.cjs"),l=require("../../interaction/tooltip.cjs"),u=require("../../svg/element.cjs"),d=require("../../theme/index.cjs"),f=require("./radar-geometry.cjs");var p=11,m=12,h=10,g={ArrowDown:1,ArrowLeft:-1,ArrowRight:1,ArrowUp:-1};function resolveGrid(e){return e===!1?null:{bands:!0,labels:!1,levels:4,shape:`polygon`,...typeof e==`object`?e:{}}}function createRadarChart(_,v){let{axes:y}=v,b=v.curve??`linear`,x=v.fill??`solid`,S=v.showPoints??!0,C=resolveGrid(v.grid),w=f.toRadians(v.startAngle??0),T=f.axisAngles(y.length,w),E=m+(v.showValues?h:0),D=a.uniqueId(`prism-radar`),O=v.series,k=u.createSvgElement(`g`,{class:`prism-radar`}),A=u.createSvgElement(`defs`),j=u.createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-radar-grid`}),M=u.createSvgElement(`g`,{class:`prism-radar-series-group`}),N=u.createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-radar-labels`});k.append(A,j,M,N);let P=[],F=null,I=-1,L={cx:0,cy:0,radius:0},datumAt=(e,t)=>e.data.find(e=>e.key===y[t].key),valuesAt=e=>O.map(t=>({datum:datumAt(t,e),series:t})),formatValue=(e,t)=>y[e].format?.(t)??String(t),describe=e=>c.describeValues(y[e].label,valuesAt(e),t=>formatValue(e,t));function draw(e){let{cx:t,cy:n,radius:r}=L;e.forEach((e,i)=>{let a=M.children[i];if(!a)return;let s=f.radarPoints(e,t,n,r,T);a.querySelector(`.prism-radar-area`)?.setAttribute(`d`,f.closedPath(s,b)),a.querySelectorAll(`.prism-radar-point`).forEach((e,t)=>{u.setAttributes(e,{cx:s[t].x,cy:s[t].y})}),a.querySelectorAll(`.prism-radar-value`).forEach((i,a)=>{let s=r*e[a]+h;u.setAttributes(i,{x:o.polarX(t,s,T[a]),y:o.polarY(n,s,T[a])})})})}function renderGrid(e){if(j.replaceChildren(),!C)return;let{cx:t,cy:n,radius:r}=L,i=Math.max(1,Math.round(C.levels)),a=Array.from({length:i},(e,a)=>f.ringPath(C.shape,t,n,r*(a+1)/i,T));if(C.bands)for(let e=i-1;e>=0;e-=2)j.appendChild(u.createSvgElement(`path`,{class:`prism-radar-band`,d:`${a[e]}${a[e-1]??``}`,"fill-rule":`evenodd`}));for(let e of a)j.appendChild(u.createSvgElement(`path`,{class:`prism-radar-ring`,d:e,fill:`none`}));T.forEach((e,i)=>{j.appendChild(u.createSvgElement(`line`,{class:`prism-radar-spoke`,"data-axis":i,x1:t,x2:o.polarX(t,r,e),y1:n,y2:o.polarY(n,r,e)}))});let[s,c]=e[0],l=e.every(([e,t])=>e===s&&t===c);if(!C.labels||!l)return;let d=T[0]+Math.PI/T.length;for(let e=1;e<=i;e++){let a=r*e/i,l=u.createSvgElement(`text`,{class:`prism-radar-level`,"dominant-baseline":`middle`,"text-anchor":`middle`,x:o.polarX(t,a,d),y:o.polarY(n,a,d)});l.textContent=formatValue(0,Math.round((s+(c-s)*e/i)*100)/100),j.appendChild(l)}}function renderLabels(){N.replaceChildren();let{cx:e,cy:t,radius:n}=L;y.forEach((r,i)=>{let{anchor:a,baseline:s}=f.labelPlacement(T[i]),c=u.createSvgElement(`text`,{class:`prism-radar-axis-label`,"dominant-baseline":s,"text-anchor":a,x:o.polarX(e,n+E,T[i]),y:o.polarY(t,n+E,T[i])});c.textContent=r.label,N.appendChild(c)})}function renderSeries(){let{cx:e,cy:t,radius:n}=L;for(A.replaceChildren();M.children.length>O.length;)M.lastChild?.remove();O.forEach((r,i)=>{let a=r.color??d.seriesColor(i),o=M.children[i];o||(o=u.createSvgElement(`g`,{class:`prism-radar-series`}),M.appendChild(o)),o.setAttribute(`data-series-id`,s.seriesDomId(r,i)),o.replaceChildren();let c=u.createSvgElement(`path`,{class:`prism-radar-area prism-radar-area--${x}`,stroke:a,"stroke-linejoin":`round`,"stroke-width":2});if(x===`gradient`){let r=`${D}-fill-${i}`,o=u.createSvgElement(`radialGradient`,{cx:e,cy:t,gradientUnits:`userSpaceOnUse`,id:r,r:n});for(let[e,t]of[[0,.08],[1,.55]])o.appendChild(u.createSvgElement(`stop`,{offset:e,"stop-color":a,"stop-opacity":t,style:`stop-color:${a}`}));A.appendChild(o),u.setAttributes(c,{fill:`url(#${r})`})}else u.setAttributes(c,{fill:x===`none`?`none`:a,"fill-opacity":.25});o.appendChild(c),S&&y.forEach((e,t)=>{let n=!Number.isFinite(datumAt(r,t)?.value);o.appendChild(u.createSvgElement(`circle`,{class:`prism-radar-point${n?` prism-radar-point--missing`:``}`,"data-axis":t,fill:n?`none`:a,r:3,stroke:a}))}),v.showValues&&y.forEach((e,t)=>{let n=datumAt(r,t),{anchor:i,baseline:a}=f.labelPlacement(T[t]),s=u.createSvgElement(`text`,{"aria-hidden":`true`,class:`prism-radar-value`,"dominant-baseline":a,"text-anchor":i});s.textContent=n&&Number.isFinite(n.value)?formatValue(t,n.value):``,o.appendChild(s)})})}function setActive(e){I=e;for(let t of k.querySelectorAll(`[data-axis]`)){let n=Number(t.getAttribute(`data-axis`))===e;t.classList.toggle(t.tagName===`line`?`prism-radar-spoke--active`:`prism-radar-point--active`,n)}}function animateTo(i,a){F?.();let o=i.map((e,t)=>e.map((e,n)=>P[t]?.[n]??0)),s=t.resolveMotion(v.transition,{defaultDuration:400}),c=e.resolveEasing(s.easing??`ease-out`),l=o.every((e,t)=>e.every((e,n)=>e===i[t][n]));s.duration===0||l?(P=i,draw(i)):F=n.startTween({count:i.length,duration:s.duration,easing:c,onFrame:e=>{P=i.map((t,n)=>{let i=e(n);return t.map((e,t)=>r.tweenNumber(o[n][t],e,i))}),draw(P)},signal:a,stagger:s.stagger})}return i.createRadialScaffold(_,{a11y:v.a11y,legend:v.legend,tooltip:v.tooltip},e=>{let{legend:t,svg:n,tooltip:r}=e;if(n.contains(k)||n.appendChild(k),r?.hide(),t?.update(O.map((e,t)=>({color:e.color??d.seriesColor(t),name:e.name}))),y.length<3){for(let e of[A,j,M,N])e.replaceChildren();P=[];return}let{height:i,width:a}=e.dimensions,s=f.fitRadius(a,i,y.map(e=>e.label),T,p,E);L={cx:a/2,cy:i/2,radius:s};let c=f.resolveAxisDomains(y,O,v.domain);renderGrid(c),renderLabels(),renderSeries(),animateTo(O.map(e=>y.map((t,n)=>{let r=datumAt(e,n)?.value;return r!==void 0&&Number.isFinite(r)?f.normalize(r,c[n]):0})),e.disposalSignal),setActive(I);let eventFor=(e,t)=>({axis:y[e],index:e,originalEvent:t,values:valuesAt(e)}),activate=(t,i)=>{setActive(t),v.onHover?.(eventFor(t,i));let a=describe(t);if(!r){e.announcer.announce(a);return}let s=Math.max(0,...P.map(e=>e[t]??0)),c=n.getBoundingClientRect(),u=_.getBoundingClientRect(),f=valuesAt(t),p=f.find(e=>e.datum)?.datum,m=f.flatMap(({datum:e,series:n})=>e?[{color:n.color??d.seriesColor(O.indexOf(n)),name:n.name,value:formatValue(t,e.value)}]:[]);r.show(o.polarX(L.cx,L.radius*s,T[t])+(c.left-u.left),o.polarY(L.cy,L.radius*s,T[t])+(c.top-u.top),{key:y[t].key,meta:{axis:y[t],text:a,values:f},value:p?.value??0},{color:O[0]?.color??d.seriesColor(0),data:[],name:y[t].label},l.comparisonContent(n.ownerDocument,y[t].label,m,a))},deactivate=()=>{setActive(-1),v.onHover?.(null),r?.hide(),e.announcer.clear()},hitIndex=e=>{let t=n.getBoundingClientRect(),r=e.clientX-t.left-L.cx,i=e.clientY-t.top-L.cy;return Math.hypot(r,i)>L.radius+E+22?-1:f.nearestAxis(r,i,y.length,w)};return{onClick(e){let t=hitIndex(e);t>=0&&v.onClick?.(eventFor(t,e))},onKeyDown(e){let t=g[e.key];t===void 0?(e.key===`Enter`||e.key===` `)&&I>=0&&v.onClick?(e.preventDefault(),v.onClick(eventFor(I,e))):e.key===`Escape`&&deactivate():(e.preventDefault(),activate(I<0?0:(I+t+y.length)%y.length,e))},onMouseLeave:deactivate,onMouseMove(e){let t=hitIndex(e);t<0?I>=0&&deactivate():t!==I&&activate(t,e)}}},e=>{O=e})}exports.createRadarChart=createRadarChart;
2
2
  //# sourceMappingURL=radar-chart.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"radar-chart.cjs","names":["toRadians","axisAngles","uniqueId","createSvgElement","describeValues","radarPoints","closedPath","polarX","polarY","ringPath","labelPlacement","seriesColor","seriesDomId","resolveMotion","resolveEasing","startTween","tweenNumber","createRadialScaffold","fitRadius","resolveAxisDomains","normalize","comparisonContent","nearestAxis","require_element","require_announcer","require_tooltip","require_chart_scaffold","require_series_id","require_index","require_easing","require_motion","require_tween","require_transition","require_ids","require_polar","require_radar_geometry","LABEL_FONT_SIZE","LABEL_GAP","VALUE_OFFSET","ARROW_STEPS","grid","config","curve","fill","showPoints","startAngle","angles","axes","labelGap","id","series","root","defs","gridGroup","seriesGroup","labelGroup","drawn","activeTween","activeIndex","layout","s","d","index","value","fractions","group","i","points","row","cx","cy","radius","dot","j","r","text","levels","rings","k","angle","d0","d1","domains","shared","a","b","baseline","anchor","axis","color","area","gradientId","gradient","offset","opacity","missing","datum","el","active","from","targets","motion","easing","unchanged","v","e","progress","to","container","ctx","svg","tooltip","legend","width","height","originalEvent","reach","svgRect","containerRect","values","first","rows","rect","dx","event","dy","step","next"],"sources":["../../../src/charts/radar/radar-chart.ts"],"sourcesContent":["import { devOnly, warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport type { ChartEventHandlers } from '../../core/chart-scaffold';\nimport { createRadialScaffold } from '../../core/chart-scaffold';\nimport { uniqueId } from '../../core/ids';\nimport { polarX, polarY } from '../../core/polar';\nimport { seriesDomId } from '../../core/series-id';\nimport { describeValues } from '../../interaction/announcer';\nimport { comparisonContent } from '../../interaction/tooltip';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport type {\n ChartHandle,\n RadarAxisConfig,\n RadarAxisValue,\n RadarChartConfig,\n RadarEvent,\n RadarGridConfig,\n RadarSeriesConfig,\n} from '../../types';\nimport {\n axisAngles,\n closedPath,\n fitRadius,\n labelPlacement,\n nearestAxis,\n normalize,\n radarPoints,\n resolveAxisDomains,\n ringPath,\n toRadians,\n} from './radar-geometry';\n\n/** Default `--prism-font-size-label` (0.6875rem) in px, used to reserve label room. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 12;\nconst VALUE_OFFSET = 10;\nconst ARROW_STEPS: Record<string, number> = { ArrowDown: 1, ArrowLeft: -1, ArrowRight: 1, ArrowUp: -1 };\n\nfunction warnOnInvalid(axes: readonly RadarAxisConfig[], series: readonly RadarSeriesConfig[]): void {\n devOnly(() => {\n if (axes.length < 3) warn(`Radar chart needs at least 3 axes, received ${axes.length}.`);\n\n const keys = new Set(axes.map((axis) => axis.key));\n\n if (keys.size !== axes.length) warn('Radar chart axis keys must be unique.');\n\n for (const s of series) {\n for (const d of s.data) {\n if (!keys.has(d.key)) warn(`Radar series \"${s.name}\" has a value for unknown axis \"${d.key}\".`);\n }\n }\n });\n}\n\nfunction resolveGrid(grid: RadarChartConfig['grid']): Required<RadarGridConfig> | null {\n if (grid === false) return null;\n\n return { bands: true, labels: false, levels: 4, shape: 'polygon', ...(typeof grid === 'object' ? grid : {}) };\n}\n\nexport function createRadarChart(container: HTMLElement, config: RadarChartConfig): ChartHandle<RadarSeriesConfig[]> {\n const { axes } = config;\n const curve = config.curve ?? 'linear';\n const fill = config.fill ?? 'solid';\n const showPoints = config.showPoints ?? true;\n const grid = resolveGrid(config.grid);\n const startAngle = toRadians(config.startAngle ?? 0);\n const angles = axisAngles(axes.length, startAngle);\n const labelGap = LABEL_GAP + (config.showValues ? VALUE_OFFSET : 0);\n const id = uniqueId('prism-radar');\n let series = config.series;\n\n warnOnInvalid(axes, series);\n\n const root = createSvgElement('g', { class: 'prism-radar' });\n const defs = createSvgElement('defs');\n const gridGroup = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-radar-grid' });\n const seriesGroup = createSvgElement('g', { class: 'prism-radar-series-group' });\n const labelGroup = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-radar-labels' });\n\n root.append(defs, gridGroup, seriesGroup, labelGroup);\n\n let drawn: number[][] = [];\n let activeTween: (() => void) | null = null;\n let activeIndex = -1;\n let layout = { cx: 0, cy: 0, radius: 0 };\n\n const datumAt = (s: RadarSeriesConfig, index: number) => s.data.find((d) => d.key === axes[index].key);\n const valuesAt = (index: number): RadarAxisValue[] => series.map((s) => ({ datum: datumAt(s, index), series: s }));\n const formatValue = (index: number, value: number): string => axes[index].format?.(value) ?? String(value);\n const describe = (index: number): string =>\n describeValues(axes[index].label, valuesAt(index), (value) => formatValue(index, value));\n\n function draw(fractions: number[][]): void {\n const { cx, cy, radius } = layout;\n\n fractions.forEach((row, i) => {\n const group = seriesGroup.children[i];\n\n if (!group) return;\n\n const points = radarPoints(row, cx, cy, radius, angles);\n\n group.querySelector('.prism-radar-area')?.setAttribute('d', closedPath(points, curve));\n group.querySelectorAll<SVGCircleElement>('.prism-radar-point').forEach((dot, j) => {\n setAttributes(dot, { cx: points[j].x, cy: points[j].y });\n });\n group.querySelectorAll<SVGTextElement>('.prism-radar-value').forEach((text, j) => {\n const r = radius * row[j] + VALUE_OFFSET;\n\n setAttributes(text, { x: polarX(cx, r, angles[j]), y: polarY(cy, r, angles[j]) });\n });\n });\n }\n\n function renderGrid(domains: [number, number][]): void {\n gridGroup.replaceChildren();\n\n if (!grid) return;\n\n const { cx, cy, radius } = layout;\n const levels = Math.max(1, Math.round(grid.levels));\n const rings = Array.from({ length: levels }, (_, k) =>\n ringPath(grid.shape, cx, cy, (radius * (k + 1)) / levels, angles),\n );\n\n if (grid.bands) {\n // Shade alternate rings, starting from the outermost.\n for (let k = levels - 1; k >= 0; k -= 2) {\n gridGroup.appendChild(\n createSvgElement('path', {\n class: 'prism-radar-band',\n d: `${rings[k]}${rings[k - 1] ?? ''}`,\n 'fill-rule': 'evenodd',\n }),\n );\n }\n }\n\n for (const d of rings)\n gridGroup.appendChild(createSvgElement('path', { class: 'prism-radar-ring', d, fill: 'none' }));\n\n angles.forEach((angle, i) => {\n gridGroup.appendChild(\n createSvgElement('line', {\n class: 'prism-radar-spoke',\n 'data-axis': i,\n x1: cx,\n x2: polarX(cx, radius, angle),\n y1: cy,\n y2: polarY(cy, radius, angle),\n }),\n );\n });\n\n const [d0, d1] = domains[0];\n const shared = domains.every(([a, b]) => a === d0 && b === d1);\n\n if (!grid.labels || !shared) return;\n\n // Between the first two spokes, so level values never collide with vertex values.\n const angle = angles[0] + Math.PI / angles.length;\n\n for (let k = 1; k <= levels; k++) {\n const r = (radius * k) / levels;\n const text = createSvgElement('text', {\n class: 'prism-radar-level',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n x: polarX(cx, r, angle),\n y: polarY(cy, r, angle),\n });\n\n text.textContent = formatValue(0, Math.round((d0 + ((d1 - d0) * k) / levels) * 100) / 100);\n gridGroup.appendChild(text);\n }\n }\n\n function renderLabels(): void {\n labelGroup.replaceChildren();\n\n const { cx, cy, radius } = layout;\n\n axes.forEach((axis, i) => {\n const { anchor, baseline } = labelPlacement(angles[i]);\n const text = createSvgElement('text', {\n class: 'prism-radar-axis-label',\n 'dominant-baseline': baseline,\n 'text-anchor': anchor,\n x: polarX(cx, radius + labelGap, angles[i]),\n y: polarY(cy, radius + labelGap, angles[i]),\n });\n\n text.textContent = axis.label;\n labelGroup.appendChild(text);\n });\n }\n\n function renderSeries(): void {\n const { cx, cy, radius } = layout;\n\n defs.replaceChildren();\n\n while (seriesGroup.children.length > series.length) seriesGroup.lastChild?.remove();\n\n series.forEach((s, i) => {\n const color = s.color ?? seriesColor(i);\n let group = seriesGroup.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-radar-series' });\n seriesGroup.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(s, i));\n\n group.replaceChildren();\n\n const area = createSvgElement('path', {\n class: `prism-radar-area prism-radar-area--${fill}`,\n stroke: color,\n 'stroke-linejoin': 'round',\n 'stroke-width': 2,\n });\n\n if (fill === 'gradient') {\n const gradientId = `${id}-fill-${i}`;\n const gradient = createSvgElement('radialGradient', {\n cx,\n cy,\n gradientUnits: 'userSpaceOnUse',\n id: gradientId,\n r: radius,\n });\n\n for (const [offset, opacity] of [\n [0, 0.08],\n [1, 0.55],\n ]) {\n gradient.appendChild(\n createSvgElement('stop', {\n offset,\n 'stop-color': color,\n 'stop-opacity': opacity,\n style: `stop-color:${color}`,\n }),\n );\n }\n\n defs.appendChild(gradient);\n setAttributes(area, { fill: `url(#${gradientId})` });\n } else {\n setAttributes(area, { fill: fill === 'none' ? 'none' : color, 'fill-opacity': 0.25 });\n }\n\n group.appendChild(area);\n\n if (showPoints) {\n axes.forEach((_, j) => {\n const missing = !Number.isFinite(datumAt(s, j)?.value);\n\n group.appendChild(\n createSvgElement('circle', {\n class: `prism-radar-point${missing ? ' prism-radar-point--missing' : ''}`,\n 'data-axis': j,\n fill: missing ? 'none' : color,\n r: 3,\n stroke: color,\n }),\n );\n });\n }\n\n if (config.showValues) {\n axes.forEach((_, j) => {\n const datum = datumAt(s, j);\n const { anchor, baseline } = labelPlacement(angles[j]);\n const text = createSvgElement('text', {\n 'aria-hidden': 'true',\n class: 'prism-radar-value',\n 'dominant-baseline': baseline,\n 'text-anchor': anchor,\n });\n\n text.textContent = datum && Number.isFinite(datum.value) ? formatValue(j, datum.value) : '';\n group.appendChild(text);\n });\n }\n });\n }\n\n function setActive(index: number): void {\n activeIndex = index;\n for (const el of root.querySelectorAll('[data-axis]')) {\n const active = Number(el.getAttribute('data-axis')) === index;\n\n el.classList.toggle(el.tagName === 'line' ? 'prism-radar-spoke--active' : 'prism-radar-point--active', active);\n }\n }\n\n function animateTo(targets: number[][], signal: AbortSignal): void {\n activeTween?.();\n\n const from = targets.map((row, i) => row.map((_, j) => drawn[i]?.[j] ?? 0));\n // Radar morphs a whole polygon, so it reads better slightly slower than the shared default.\n const motion = resolveMotion(config.transition, { defaultDuration: 400 });\n const easing = resolveEasing(motion.easing ?? 'ease-out');\n const unchanged = from.every((row, i) => row.every((v, j) => v === targets[i][j]));\n\n if (motion.duration === 0 || unchanged) {\n drawn = targets;\n draw(targets);\n\n return;\n }\n\n activeTween = startTween({\n count: targets.length,\n duration: motion.duration,\n easing,\n onFrame: (progress) => {\n drawn = targets.map((row, i) => {\n const e = progress(i);\n\n return row.map((to, j) => tweenNumber(from[i][j], to, e));\n });\n draw(drawn);\n },\n signal,\n stagger: motion.stagger,\n });\n }\n\n return createRadialScaffold(\n container,\n { a11y: config.a11y, legend: config.legend, tooltip: config.tooltip },\n (ctx): ChartEventHandlers | undefined => {\n const { legend, svg, tooltip } = ctx;\n\n if (!svg.contains(root)) svg.appendChild(root);\n\n tooltip?.hide();\n legend?.update(series.map((s, i) => ({ color: s.color ?? seriesColor(i), name: s.name })));\n\n if (axes.length < 3) {\n for (const group of [defs, gridGroup, seriesGroup, labelGroup]) group.replaceChildren();\n drawn = [];\n\n return undefined;\n }\n\n const { height, width } = ctx.dimensions;\n const radius = fitRadius(\n width,\n height,\n axes.map((axis) => axis.label),\n angles,\n LABEL_FONT_SIZE,\n labelGap,\n );\n\n layout = { cx: width / 2, cy: height / 2, radius };\n\n const domains = resolveAxisDomains(axes, series, config.domain);\n\n renderGrid(domains);\n renderLabels();\n renderSeries();\n animateTo(\n series.map((s) =>\n axes.map((_, j) => {\n const value = datumAt(s, j)?.value;\n\n return value !== undefined && Number.isFinite(value) ? normalize(value, domains[j]) : 0;\n }),\n ),\n ctx.disposalSignal,\n );\n setActive(activeIndex);\n\n const eventFor = (index: number, originalEvent: Event): RadarEvent => ({\n axis: axes[index],\n index,\n originalEvent,\n values: valuesAt(index),\n });\n\n const activate = (index: number, originalEvent: Event): void => {\n setActive(index);\n config.onHover?.(eventFor(index, originalEvent));\n\n const text = describe(index);\n\n if (!tooltip) {\n ctx.announcer.announce(text);\n\n return;\n }\n\n const reach = Math.max(0, ...drawn.map((row) => row[index] ?? 0));\n const svgRect = svg.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const values = valuesAt(index);\n const first = values.find((v) => v.datum)?.datum;\n const rows = values.flatMap(({ datum, series: s }) =>\n datum\n ? [\n {\n color: s.color ?? seriesColor(series.indexOf(s)),\n name: s.name,\n value: formatValue(index, datum.value),\n },\n ]\n : [],\n );\n\n tooltip.show(\n polarX(layout.cx, layout.radius * reach, angles[index]) + (svgRect.left - containerRect.left),\n polarY(layout.cy, layout.radius * reach, angles[index]) + (svgRect.top - containerRect.top),\n { key: axes[index].key, meta: { axis: axes[index], text, values }, value: first?.value ?? 0 },\n { color: series[0]?.color ?? seriesColor(0), data: [], name: axes[index].label },\n comparisonContent(svg.ownerDocument, axes[index].label, rows, text),\n );\n };\n\n const deactivate = (): void => {\n setActive(-1);\n config.onHover?.(null);\n tooltip?.hide();\n ctx.announcer.clear();\n };\n\n const hitIndex = (event: MouseEvent): number => {\n const rect = svg.getBoundingClientRect();\n const dx = event.clientX - rect.left - layout.cx;\n const dy = event.clientY - rect.top - layout.cy;\n\n if (Math.hypot(dx, dy) > layout.radius + labelGap + LABEL_FONT_SIZE * 2) return -1;\n\n return nearestAxis(dx, dy, axes.length, startAngle);\n };\n\n return {\n onClick(event) {\n const index = hitIndex(event);\n\n if (index >= 0) config.onClick?.(eventFor(index, event));\n },\n onKeyDown(event) {\n const step = ARROW_STEPS[event.key];\n\n if (step !== undefined) {\n event.preventDefault();\n activate(activeIndex < 0 ? 0 : (activeIndex + step + axes.length) % axes.length, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && activeIndex >= 0 && config.onClick) {\n event.preventDefault();\n config.onClick(eventFor(activeIndex, event));\n } else if (event.key === 'Escape') {\n deactivate();\n }\n },\n onMouseLeave: deactivate,\n onMouseMove(event) {\n const index = hitIndex(event);\n\n if (index < 0) {\n if (activeIndex >= 0) deactivate();\n } else if (index !== activeIndex) {\n activate(index, event);\n }\n },\n };\n },\n (next) => {\n series = next;\n warnOnInvalid(axes, series);\n },\n );\n}\n"],"mappings":"A,shBAqCA,IAAMoC,EAAkB,GAClBC,EAAY,GACZC,EAAe,GACfC,EAAsC,CAAE,UAAW,EAAG,UAAW,GAAI,WAAY,EAAG,QAAS,EAAG,EAkBtG,SAAS,YAAY,EAAkE,CAGrF,OAFIC,IAAS,GAAc,KAEpB,CAAE,MAAO,GAAM,OAAQ,GAAO,OAAQ,EAAG,MAAO,UAAW,GAAI,OAAOA,GAAS,SAAWA,EAAO,CAAC,CAAG,CAC9G,CAEA,SAAgB,iBAAiB,EAAwB,EAA4D,CACnH,GAAM,CAAE,QAASC,EACXC,EAAQD,EAAO,OAAS,SACxBE,EAAOF,EAAO,MAAQ,QACtBG,EAAaH,EAAO,YAAc,GAClCD,EAAO,YAAYC,EAAO,IAAI,EAC9BI,EAAa7C,EAAAA,UAAUyC,EAAO,YAAc,CAAC,EAC7CK,EAAS7C,EAAAA,WAAW8C,EAAK,OAAQF,CAAU,EAC3CG,EAAWX,GAAaI,EAAO,WAAaH,EAAe,GAC3DW,EAAK/C,EAAAA,SAAS,aAAa,EAC7BgD,EAAST,EAAO,OAIdU,EAAOhD,EAAAA,iBAAiB,IAAK,CAAE,MAAO,aAAc,CAAC,EACrDiD,EAAOjD,EAAAA,iBAAiB,MAAM,EAC9BkD,EAAYlD,EAAAA,iBAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,kBAAmB,CAAC,EACtFmD,EAAcnD,EAAAA,iBAAiB,IAAK,CAAE,MAAO,0BAA2B,CAAC,EACzEoD,EAAapD,EAAAA,iBAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,oBAAqB,CAAC,EAE/FgD,EAAK,OAAOC,EAAMC,EAAWC,EAAaC,CAAU,EAEpD,IAAIC,EAAoB,CAAC,EACrBC,EAAmC,KACnCC,EAAc,GACdC,EAAS,CAAE,GAAI,EAAG,GAAI,EAAG,OAAQ,CAAE,EAEjC,SAAW,EAAsB,IAAkBC,EAAE,KAAK,KAAM,GAAMC,EAAE,MAAQd,EAAKe,EAAM,CAAC,GAAG,EAC/F,SAAY,GAAoCZ,EAAO,IAAK,IAAO,CAAE,MAAO,QAAQU,EAAGE,CAAK,EAAG,OAAQF,CAAE,EAAE,EAC3G,aAAe,EAAe,IAA0Bb,EAAKe,EAAM,CAAC,SAASC,CAAK,GAAK,OAAOA,CAAK,EACnG,SAAY,GAChB3D,EAAAA,eAAe2C,EAAKe,EAAM,CAAC,MAAO,SAASA,CAAK,EAAI,GAAU,YAAYA,EAAOC,CAAK,CAAC,EAEzF,SAAS,KAAK,EAA6B,CACzC,GAAM,CAAE,KAAI,KAAI,UAAWJ,EAE3BK,EAAU,SAAS,EAAK,IAAM,CAC5B,IAAMC,EAAQX,EAAY,SAASY,GAEnC,GAAI,CAACD,EAAO,OAEZ,IAAME,EAAS9D,EAAAA,YAAY+D,EAAKC,EAAIC,EAAIC,EAAQzB,CAAM,EAEtDmB,EAAM,cAAc,mBAAmB,CAAC,EAAE,aAAa,IAAK3D,EAAAA,WAAW6D,EAAQzB,CAAK,CAAC,EACrFuB,EAAM,iBAAmC,oBAAoB,CAAC,CAAC,SAAS,EAAK,IAAM,CACjF1C,EAAA,cAAciD,EAAK,CAAE,GAAIL,EAAOM,EAAE,CAAC,EAAG,GAAIN,EAAOM,EAAE,CAAC,CAAE,CAAC,CACzD,CAAC,EACDR,EAAM,iBAAiC,oBAAoB,CAAC,CAAC,SAAS,EAAM,IAAM,CAChF,IAAMS,EAAIH,EAASH,EAAIK,GAAKnC,EAE5Bf,EAAA,cAAcoD,EAAM,CAAE,EAAGpE,EAAAA,OAAO8D,EAAIK,EAAG5B,EAAO2B,EAAE,EAAG,EAAGjE,EAAAA,OAAO8D,EAAII,EAAG5B,EAAO2B,EAAE,CAAE,CAAC,CAClF,CAAC,CACH,CAAC,CACH,CAEA,SAAS,WAAW,EAAmC,CAGrD,GAFApB,EAAU,gBAAgB,EAEtB,CAACb,EAAM,OAEX,GAAM,CAAE,KAAI,KAAI,UAAWmB,EACrBiB,EAAS,KAAK,IAAI,EAAG,KAAK,MAAMpC,EAAK,MAAM,CAAC,EAC5CqC,EAAQ,MAAM,KAAK,CAAE,OAAQD,CAAO,GAAI,EAAG,IAC/CnE,EAAAA,SAAS+B,EAAK,MAAO6B,EAAIC,EAAKC,GAAUO,EAAI,GAAMF,EAAQ9B,CAAM,CAClE,EAEA,GAAIN,EAAK,MAEP,IAAK,IAAIsC,EAAIF,EAAS,EAAGE,GAAK,EAAG,GAAK,EACpCzB,EAAU,YACRlD,EAAAA,iBAAiB,OAAQ,CACvB,MAAO,mBACP,EAAG,GAAG0E,EAAMC,KAAKD,EAAMC,EAAI,IAAM,KACjC,YAAa,SACf,CAAC,CACH,EAIJ,IAAK,IAAMjB,KAAKgB,EACdxB,EAAU,YAAYlD,EAAAA,iBAAiB,OAAQ,CAAE,MAAO,mBAAoB,IAAG,KAAM,MAAO,CAAC,CAAC,EAEhG2C,EAAO,SAAS,EAAO,IAAM,CAC3BO,EAAU,YACRlD,EAAAA,iBAAiB,OAAQ,CACvB,MAAO,oBACP,YAAa+D,EACb,GAAIG,EACJ,GAAI9D,EAAAA,OAAO8D,EAAIE,EAAQQ,CAAK,EAC5B,GAAIT,EACJ,GAAI9D,EAAAA,OAAO8D,EAAIC,EAAQQ,CAAK,CAC9B,CAAC,CACH,CACF,CAAC,EAED,GAAM,CAACC,EAAIC,GAAMC,EAAQ,GACnBC,EAASD,EAAQ,OAAO,CAACE,EAAGC,KAAOD,IAAMJ,GAAMK,IAAMJ,CAAE,EAE7D,GAAI,CAACzC,EAAK,QAAU,CAAC2C,EAAQ,OAG7B,IAAMJ,EAAQjC,EAAO,GAAK,KAAK,GAAKA,EAAO,OAE3C,IAAK,IAAIgC,EAAI,EAAGA,GAAKF,EAAQ,IAAK,CAChC,IAAMF,EAAKH,EAASO,EAAKF,EACnBD,EAAOxE,EAAAA,iBAAiB,OAAQ,CACpC,MAAO,oBACP,oBAAqB,SACrB,cAAe,SACf,EAAGI,EAAAA,OAAO8D,EAAIK,EAAGK,CAAK,EACtB,EAAGvE,EAAAA,OAAO8D,EAAII,EAAGK,CAAK,CACxB,CAAC,EAED,EAAK,YAAc,YAAY,EAAG,KAAK,OAAOC,GAAOC,EAAKD,GAAMF,EAAKF,GAAU,GAAG,EAAI,GAAG,EACzFvB,EAAU,YAAYsB,CAAI,CAC5B,CACF,CAEA,SAAS,cAAqB,CAC5BpB,EAAW,gBAAgB,EAE3B,GAAM,CAAE,KAAI,KAAI,UAAWI,EAE3BZ,EAAK,SAAS,EAAM,IAAM,CACxB,GAAM,CAAE,SAAQ,YAAarC,EAAAA,eAAeoC,EAAOoB,EAAE,EAC/CS,EAAOxE,EAAAA,iBAAiB,OAAQ,CACpC,MAAO,yBACP,oBAAqBmF,EACrB,cAAeC,EACf,EAAGhF,EAAAA,OAAO8D,EAAIE,EAASvB,EAAUF,EAAOoB,EAAE,EAC1C,EAAG1D,EAAAA,OAAO8D,EAAIC,EAASvB,EAAUF,EAAOoB,EAAE,CAC5C,CAAC,EAED,EAAK,YAAcsB,EAAK,MACxBjC,EAAW,YAAYoB,CAAI,CAC7B,CAAC,CACH,CAEA,SAAS,cAAqB,CAC5B,GAAM,CAAE,KAAI,KAAI,UAAWhB,EAI3B,IAFAP,EAAK,gBAAgB,EAEdE,EAAY,SAAS,OAASJ,EAAO,QAAQI,EAAY,WAAW,OAAO,EAElFJ,EAAO,SAAS,EAAG,IAAM,CACvB,IAAMuC,EAAQ7B,EAAE,OAASjD,EAAAA,YAAYuD,CAAC,EAClCD,EAAQX,EAAY,SAASY,GAE5BD,IACH,EAAQ9D,EAAAA,iBAAiB,IAAK,CAAE,MAAO,oBAAqB,CAAC,EAC7DmD,EAAY,YAAYW,CAAK,GAG/BA,EAAM,aAAa,iBAAkBrD,EAAAA,YAAYgD,EAAGM,CAAC,CAAC,EAEtDD,EAAM,gBAAgB,EAEtB,IAAMyB,EAAOvF,EAAAA,iBAAiB,OAAQ,CACpC,MAAO,sCAAsCwC,IAC7C,OAAQ8C,EACR,kBAAmB,QACnB,eAAgB,CAClB,CAAC,EAED,GAAI9C,IAAS,WAAY,CACvB,IAAMgD,EAAa,GAAG1C,EAAG,QAAQiB,IAC3B0B,EAAWzF,EAAAA,iBAAiB,iBAAkB,CAClD,KACA,KACA,cAAe,iBACf,GAAIwF,EACDpB,CACL,CAAC,EAED,IAAK,GAAM,CAACsB,EAAQC,IAAY,CAC9B,CAAC,EAAG,GAAI,EACR,CAAC,EAAG,GAAI,CACV,EACEF,EAAS,YACPzF,EAAAA,iBAAiB,OAAQ,CACvB,SACA,aAAcsF,EACd,eAAgBK,EAChB,MAAO,cAAcL,GACvB,CAAC,CACH,EAGFrC,EAAK,YAAYwC,CAAQ,EACzBrE,EAAA,cAAcmE,EAAM,CAAE,KAAM,QAAQC,EAAW,EAAG,CAAC,CACrD,MACEpE,EAAA,cAAcmE,EAAM,CAAE,KAAM/C,IAAS,OAAS,OAAS8C,EAAO,eAAgB,GAAK,CAAC,EAGtFxB,EAAM,YAAYyB,CAAI,EAElB9C,GACFG,EAAK,SAAS,EAAG,IAAM,CACrB,IAAMgD,EAAU,CAAC,OAAO,SAAS,QAAQnC,EAAGa,CAAC,CAAC,EAAE,KAAK,EAErDR,EAAM,YACJ9D,EAAAA,iBAAiB,SAAU,CACzB,MAAO,oBAAoB4F,EAAU,8BAAgC,KACrE,YAAatB,EACb,KAAMsB,EAAU,OAASN,EACzB,EAAG,EACH,OAAQA,CACV,CAAC,CACH,CACF,CAAC,EAGChD,EAAO,YACTM,EAAK,SAAS,EAAG,IAAM,CACrB,IAAMiD,EAAQ,QAAQpC,EAAGa,CAAC,EACpB,CAAE,SAAQ,YAAa/D,EAAAA,eAAeoC,EAAO2B,EAAE,EAC/CE,EAAOxE,EAAAA,iBAAiB,OAAQ,CACpC,cAAe,OACf,MAAO,oBACP,oBAAqBmF,EACrB,cAAeC,CACjB,CAAC,EAED,EAAK,YAAcS,GAAS,OAAO,SAASA,EAAM,KAAK,EAAI,YAAYvB,EAAGuB,EAAM,KAAK,EAAI,GACzF/B,EAAM,YAAYU,CAAI,CACxB,CAAC,CAEL,CAAC,CACH,CAEA,SAAS,UAAU,EAAqB,CACtC,EAAcb,EACd,IAAK,IAAMmC,KAAM9C,EAAK,iBAAiB,aAAa,EAAG,CACrD,IAAM+C,EAAS,OAAOD,EAAG,aAAa,WAAW,CAAC,IAAMnC,EAExDmC,EAAG,UAAU,OAAOA,EAAG,UAAY,OAAS,4BAA8B,4BAA6BC,CAAM,CAC/G,CACF,CAEA,SAAS,UAAU,EAAqB,EAA2B,CACjEzC,IAAc,EAEd,IAAM0C,EAAOC,EAAQ,KAAK,EAAK,IAAMhC,EAAI,KAAK,EAAG,IAAMZ,EAAMU,EAAE,GAAGO,IAAM,CAAC,CAAC,EAEpE4B,EAASxF,EAAAA,cAAc4B,EAAO,WAAY,CAAE,gBAAiB,GAAI,CAAC,EAClE6D,EAASxF,EAAAA,cAAcuF,EAAO,QAAU,UAAU,EAClDE,EAAYJ,EAAK,OAAO,EAAK,IAAM/B,EAAI,OAAO,EAAG,IAAMoC,IAAMJ,EAAQlC,EAAE,CAACO,EAAE,CAAC,EAE7E4B,EAAO,WAAa,GAAKE,GAC3B,EAAQH,EACR,KAAKA,CAAO,GAKd,EAAcrF,EAAAA,WAAW,CACvB,MAAOqF,EAAQ,OACf,SAAUC,EAAO,SACjB,SACA,QAAU,GAAa,CACrB,EAAQD,EAAQ,KAAK,EAAK,IAAM,CAC9B,IAAMK,EAAIC,EAASxC,CAAC,EAEpB,OAAOE,EAAI,KAAK,EAAI,IAAMpD,EAAAA,YAAYmF,EAAKjC,EAAE,CAACO,GAAIkC,EAAIF,CAAC,CAAC,CAC1D,CAAC,EACD,KAAKjD,CAAK,CACZ,EACA,SACA,QAAS6C,EAAO,OAClB,CAAC,CACH,CAEA,OAAOpF,EAAAA,qBACL2F,EACA,CAAE,KAAMnE,EAAO,KAAM,OAAQA,EAAO,OAAQ,QAASA,EAAO,OAAQ,EACnE,GAAwC,CACvC,GAAM,CAAE,SAAQ,MAAK,WAAYoE,EAOjC,GALKC,EAAI,SAAS3D,CAAI,GAAG2D,EAAI,YAAY3D,CAAI,EAE7C4D,GAAS,KAAK,EACdC,GAAQ,OAAO9D,EAAO,KAAK,EAAG,KAAO,CAAE,MAAOU,EAAE,OAASjD,EAAAA,YAAYuD,CAAC,EAAG,KAAMN,EAAE,IAAK,EAAE,CAAC,EAErFb,EAAK,OAAS,EAAG,CACnB,IAAK,IAAMkB,IAAS,CAACb,EAAMC,EAAWC,EAAaC,CAAU,EAAGU,EAAM,gBAAgB,EACtF,EAAQ,CAAC,EAET,MACF,CAEA,GAAM,CAAE,SAAQ,SAAU4C,EAAI,WACxBtC,EAASrD,EAAAA,UACb+F,EACAC,EACAnE,EAAK,IAAK,GAASyC,EAAK,KAAK,EAC7B1C,EACAV,EACAY,CACF,EAEA,EAAS,CAAE,GAAIiE,EAAQ,EAAG,GAAIC,EAAS,EAAG,QAAO,EAEjD,IAAMhC,EAAU/D,EAAAA,mBAAmB4B,EAAMG,EAAQT,EAAO,MAAM,EAE9D,WAAWyC,CAAO,EAClB,aAAa,EACb,aAAa,EACb,UACEhC,EAAO,IAAK,GACVH,EAAK,KAAK,EAAG,IAAM,CACjB,IAAMgB,EAAQ,QAAQH,EAAGa,CAAC,CAAC,EAAE,MAE7B,OAAOV,IAAU,IAAA,IAAa,OAAO,SAASA,CAAK,EAAI3C,EAAAA,UAAU2C,EAAOmB,EAAQT,EAAE,EAAI,CACxF,CAAC,CACH,EACAoC,EAAI,cACN,EACA,UAAUnD,CAAW,EAErB,IAAM,UAAY,EAAe,KAAsC,CACrE,KAAMX,EAAKe,GACX,QACA,gBACA,OAAQ,SAASA,CAAK,CACxB,GAEM,UAAY,EAAe,IAA+B,CAC9D,UAAUA,CAAK,EACfrB,EAAO,UAAU,SAASqB,EAAOqD,CAAa,CAAC,EAE/C,IAAMxC,EAAO,SAASb,CAAK,EAE3B,GAAI,CAACiD,EAAS,CACZF,EAAI,UAAU,SAASlC,CAAI,EAE3B,MACF,CAEA,IAAMyC,EAAQ,KAAK,IAAI,EAAG,GAAG5D,EAAM,IAAK,GAAQY,EAAIN,IAAU,CAAC,CAAC,EAC1DuD,EAAUP,EAAI,sBAAsB,EACpCQ,EAAgBV,EAAU,sBAAsB,EAChDW,EAAS,SAASzD,CAAK,EACvB0D,EAAQD,EAAO,KAAM,GAAMf,EAAE,KAAK,CAAC,EAAE,MACrCiB,EAAOF,EAAO,SAAS,CAAE,QAAO,OAAQ3D,KAC5CoC,EACI,CACE,CACE,MAAOpC,EAAE,OAASjD,EAAAA,YAAYuC,EAAO,QAAQU,CAAC,CAAC,EAC/C,KAAMA,EAAE,KACR,MAAO,YAAYE,EAAOkC,EAAM,KAAK,CACvC,CACF,EACA,CAAC,CACP,EAEAe,EAAQ,KACNxG,EAAAA,OAAOoD,EAAO,GAAIA,EAAO,OAASyD,EAAOtE,EAAOgB,EAAM,GAAKuD,EAAQ,KAAOC,EAAc,MACxF9G,EAAAA,OAAOmD,EAAO,GAAIA,EAAO,OAASyD,EAAOtE,EAAOgB,EAAM,GAAKuD,EAAQ,IAAMC,EAAc,KACvF,CAAE,IAAKvE,EAAKe,EAAM,CAAC,IAAK,KAAM,CAAE,KAAMf,EAAKe,GAAQ,OAAM,QAAO,EAAG,MAAO0D,GAAO,OAAS,CAAE,EAC5F,CAAE,MAAOtE,EAAO,EAAE,EAAE,OAASvC,EAAAA,YAAY,CAAC,EAAG,KAAM,CAAC,EAAG,KAAMoC,EAAKe,EAAM,CAAC,KAAM,EAC/EzC,EAAAA,kBAAkByF,EAAI,cAAe/D,EAAKe,EAAM,CAAC,MAAO2D,EAAM9C,CAAI,CACpE,CACF,EAEM,eAAyB,CAC7B,UAAU,EAAE,EACZlC,EAAO,UAAU,IAAI,EACrBsE,GAAS,KAAK,EACdF,EAAI,UAAU,MAAM,CACtB,EAEM,SAAY,GAA8B,CAC9C,IAAMa,EAAOZ,EAAI,sBAAsB,EACjCa,EAAKC,EAAM,QAAUF,EAAK,KAAO/D,EAAO,GACxCkE,EAAKD,EAAM,QAAUF,EAAK,IAAM/D,EAAO,GAI7C,OAFI,KAAK,MAAMgE,EAAIE,CAAE,EAAIlE,EAAO,OAASX,EAAW,GAA4B,GAEzE1B,EAAAA,YAAYqG,EAAIE,EAAI9E,EAAK,OAAQF,CAAU,CACpD,EAEA,MAAO,CACL,QAAQ,EAAO,CACb,IAAMiB,EAAQ,SAAS8D,CAAK,EAExB9D,GAAS,GAAGrB,EAAO,UAAU,SAASqB,EAAO8D,CAAK,CAAC,CACzD,EACA,UAAU,EAAO,CACf,IAAME,EAAOvF,EAAYqF,EAAM,KAE3BE,IAAS,IAAA,IAGDF,EAAM,MAAQ,SAAWA,EAAM,MAAQ,MAAQlE,GAAe,GAAKjB,EAAO,SACpFmF,EAAM,eAAe,EACrBnF,EAAO,QAAQ,SAASiB,EAAakE,CAAK,CAAC,GAClCA,EAAM,MAAQ,UACvB,WAAW,GANXA,EAAM,eAAe,EACrB,SAASlE,EAAc,EAAI,GAAKA,EAAcoE,EAAO/E,EAAK,QAAUA,EAAK,OAAQ6E,CAAK,EAO1F,EACA,aAAc,WACd,YAAY,EAAO,CACjB,IAAM9D,EAAQ,SAAS8D,CAAK,EAExB9D,EAAQ,EACNJ,GAAe,GAAG,WAAW,EACxBI,IAAUJ,GACnB,SAASI,EAAO8D,CAAK,CAEzB,CACF,CACF,EACC,GAAS,CACR,EAASG,CAEX,CACF,CACF,C"}
1
+ {"version":3,"file":"radar-chart.cjs","names":["toRadians","axisAngles","uniqueId","createSvgElement","describeValues","radarPoints","closedPath","polarX","polarY","ringPath","labelPlacement","seriesColor","seriesDomId","resolveMotion","resolveEasing","startTween","tweenNumber","createRadialScaffold","fitRadius","resolveAxisDomains","normalize","comparisonContent","nearestAxis","require_easing","require_motion","require_transition","require_tween","require_chart_scaffold","require_ids","require_polar","require_series_id","require_announcer","require_tooltip","require_element","require_index","require_radar_geometry","LABEL_FONT_SIZE","LABEL_GAP","VALUE_OFFSET","ARROW_STEPS","grid","config","curve","fill","showPoints","startAngle","angles","axes","labelGap","id","series","root","defs","gridGroup","seriesGroup","labelGroup","drawn","activeTween","activeIndex","layout","s","d","index","value","fractions","group","points","row","cx","cy","radius","dot","j","r","text","levels","rings","k","angle","d0","d1","domains","shared","a","b","baseline","anchor","axis","color","area","gradientId","gradient","offset","opacity","missing","datum","el","active","from","targets","i","motion","easing","unchanged","v","e","progress","to","container","ctx","svg","tooltip","legend","width","height","originalEvent","reach","svgRect","containerRect","values","first","rows","rect","dx","event","dy","step","next"],"sources":["../../../src/charts/radar/radar-chart.ts"],"sourcesContent":["import { devOnly, warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport type { ChartEventHandlers } from '../../core/chart-scaffold';\nimport { createRadialScaffold } from '../../core/chart-scaffold';\nimport { uniqueId } from '../../core/ids';\nimport { polarX, polarY } from '../../core/polar';\nimport { seriesDomId } from '../../core/series-id';\nimport { describeValues } from '../../interaction/announcer';\nimport { comparisonContent } from '../../interaction/tooltip';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport type {\n ChartHandle,\n RadarAxisConfig,\n RadarAxisValue,\n RadarChartConfig,\n RadarEvent,\n RadarGridConfig,\n RadarSeriesConfig,\n} from '../../types';\nimport {\n axisAngles,\n closedPath,\n fitRadius,\n labelPlacement,\n nearestAxis,\n normalize,\n radarPoints,\n resolveAxisDomains,\n ringPath,\n toRadians,\n} from './radar-geometry';\n\n/** Default `--prism-font-size-label` (0.6875rem) in px, used to reserve label room. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 12;\nconst VALUE_OFFSET = 10;\nconst ARROW_STEPS: Record<string, number> = { ArrowDown: 1, ArrowLeft: -1, ArrowRight: 1, ArrowUp: -1 };\n\nfunction warnOnInvalid(axes: readonly RadarAxisConfig[], series: readonly RadarSeriesConfig[]): void {\n devOnly(() => {\n if (axes.length < 3) warn(`Radar chart needs at least 3 axes, received ${axes.length}.`);\n\n const keys = new Set(axes.map((axis) => axis.key));\n\n if (keys.size !== axes.length) warn('Radar chart axis keys must be unique.');\n\n for (const s of series) {\n for (const d of s.data) {\n if (!keys.has(d.key)) warn(`Radar series \"${s.name}\" has a value for unknown axis \"${d.key}\".`);\n }\n }\n });\n}\n\nfunction resolveGrid(grid: RadarChartConfig['grid']): Required<RadarGridConfig> | null {\n if (grid === false) return null;\n\n return { bands: true, labels: false, levels: 4, shape: 'polygon', ...(typeof grid === 'object' ? grid : {}) };\n}\n\nexport function createRadarChart(container: HTMLElement, config: RadarChartConfig): ChartHandle<RadarSeriesConfig[]> {\n const { axes } = config;\n const curve = config.curve ?? 'linear';\n const fill = config.fill ?? 'solid';\n const showPoints = config.showPoints ?? true;\n const grid = resolveGrid(config.grid);\n const startAngle = toRadians(config.startAngle ?? 0);\n const angles = axisAngles(axes.length, startAngle);\n const labelGap = LABEL_GAP + (config.showValues ? VALUE_OFFSET : 0);\n const id = uniqueId('prism-radar');\n let series = config.series;\n\n warnOnInvalid(axes, series);\n\n const root = createSvgElement('g', { class: 'prism-radar' });\n const defs = createSvgElement('defs');\n const gridGroup = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-radar-grid' });\n const seriesGroup = createSvgElement('g', { class: 'prism-radar-series-group' });\n const labelGroup = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-radar-labels' });\n\n root.append(defs, gridGroup, seriesGroup, labelGroup);\n\n let drawn: number[][] = [];\n let activeTween: (() => void) | null = null;\n let activeIndex = -1;\n let layout = { cx: 0, cy: 0, radius: 0 };\n\n const datumAt = (s: RadarSeriesConfig, index: number) => s.data.find((d) => d.key === axes[index].key);\n const valuesAt = (index: number): RadarAxisValue[] => series.map((s) => ({ datum: datumAt(s, index), series: s }));\n const formatValue = (index: number, value: number): string => axes[index].format?.(value) ?? String(value);\n const describe = (index: number): string =>\n describeValues(axes[index].label, valuesAt(index), (value) => formatValue(index, value));\n\n function draw(fractions: number[][]): void {\n const { cx, cy, radius } = layout;\n\n fractions.forEach((row, i) => {\n const group = seriesGroup.children[i];\n\n if (!group) return;\n\n const points = radarPoints(row, cx, cy, radius, angles);\n\n group.querySelector('.prism-radar-area')?.setAttribute('d', closedPath(points, curve));\n group.querySelectorAll<SVGCircleElement>('.prism-radar-point').forEach((dot, j) => {\n setAttributes(dot, { cx: points[j].x, cy: points[j].y });\n });\n group.querySelectorAll<SVGTextElement>('.prism-radar-value').forEach((text, j) => {\n const r = radius * row[j] + VALUE_OFFSET;\n\n setAttributes(text, { x: polarX(cx, r, angles[j]), y: polarY(cy, r, angles[j]) });\n });\n });\n }\n\n function renderGrid(domains: [number, number][]): void {\n gridGroup.replaceChildren();\n\n if (!grid) return;\n\n const { cx, cy, radius } = layout;\n const levels = Math.max(1, Math.round(grid.levels));\n const rings = Array.from({ length: levels }, (_, k) =>\n ringPath(grid.shape, cx, cy, (radius * (k + 1)) / levels, angles),\n );\n\n if (grid.bands) {\n // Shade alternate rings, starting from the outermost.\n for (let k = levels - 1; k >= 0; k -= 2) {\n gridGroup.appendChild(\n createSvgElement('path', {\n class: 'prism-radar-band',\n d: `${rings[k]}${rings[k - 1] ?? ''}`,\n 'fill-rule': 'evenodd',\n }),\n );\n }\n }\n\n for (const d of rings)\n gridGroup.appendChild(createSvgElement('path', { class: 'prism-radar-ring', d, fill: 'none' }));\n\n angles.forEach((angle, i) => {\n gridGroup.appendChild(\n createSvgElement('line', {\n class: 'prism-radar-spoke',\n 'data-axis': i,\n x1: cx,\n x2: polarX(cx, radius, angle),\n y1: cy,\n y2: polarY(cy, radius, angle),\n }),\n );\n });\n\n const [d0, d1] = domains[0];\n const shared = domains.every(([a, b]) => a === d0 && b === d1);\n\n if (!grid.labels || !shared) return;\n\n // Between the first two spokes, so level values never collide with vertex values.\n const angle = angles[0] + Math.PI / angles.length;\n\n for (let k = 1; k <= levels; k++) {\n const r = (radius * k) / levels;\n const text = createSvgElement('text', {\n class: 'prism-radar-level',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n x: polarX(cx, r, angle),\n y: polarY(cy, r, angle),\n });\n\n text.textContent = formatValue(0, Math.round((d0 + ((d1 - d0) * k) / levels) * 100) / 100);\n gridGroup.appendChild(text);\n }\n }\n\n function renderLabels(): void {\n labelGroup.replaceChildren();\n\n const { cx, cy, radius } = layout;\n\n axes.forEach((axis, i) => {\n const { anchor, baseline } = labelPlacement(angles[i]);\n const text = createSvgElement('text', {\n class: 'prism-radar-axis-label',\n 'dominant-baseline': baseline,\n 'text-anchor': anchor,\n x: polarX(cx, radius + labelGap, angles[i]),\n y: polarY(cy, radius + labelGap, angles[i]),\n });\n\n text.textContent = axis.label;\n labelGroup.appendChild(text);\n });\n }\n\n function renderSeries(): void {\n const { cx, cy, radius } = layout;\n\n defs.replaceChildren();\n\n while (seriesGroup.children.length > series.length) seriesGroup.lastChild?.remove();\n\n series.forEach((s, i) => {\n const color = s.color ?? seriesColor(i);\n let group = seriesGroup.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-radar-series' });\n seriesGroup.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(s, i));\n\n group.replaceChildren();\n\n const area = createSvgElement('path', {\n class: `prism-radar-area prism-radar-area--${fill}`,\n stroke: color,\n 'stroke-linejoin': 'round',\n 'stroke-width': 2,\n });\n\n if (fill === 'gradient') {\n const gradientId = `${id}-fill-${i}`;\n const gradient = createSvgElement('radialGradient', {\n cx,\n cy,\n gradientUnits: 'userSpaceOnUse',\n id: gradientId,\n r: radius,\n });\n\n for (const [offset, opacity] of [\n [0, 0.08],\n [1, 0.55],\n ]) {\n gradient.appendChild(\n createSvgElement('stop', {\n offset,\n 'stop-color': color,\n 'stop-opacity': opacity,\n style: `stop-color:${color}`,\n }),\n );\n }\n\n defs.appendChild(gradient);\n setAttributes(area, { fill: `url(#${gradientId})` });\n } else {\n setAttributes(area, { fill: fill === 'none' ? 'none' : color, 'fill-opacity': 0.25 });\n }\n\n group.appendChild(area);\n\n if (showPoints) {\n axes.forEach((_, j) => {\n const missing = !Number.isFinite(datumAt(s, j)?.value);\n\n group.appendChild(\n createSvgElement('circle', {\n class: `prism-radar-point${missing ? ' prism-radar-point--missing' : ''}`,\n 'data-axis': j,\n fill: missing ? 'none' : color,\n r: 3,\n stroke: color,\n }),\n );\n });\n }\n\n if (config.showValues) {\n axes.forEach((_, j) => {\n const datum = datumAt(s, j);\n const { anchor, baseline } = labelPlacement(angles[j]);\n const text = createSvgElement('text', {\n 'aria-hidden': 'true',\n class: 'prism-radar-value',\n 'dominant-baseline': baseline,\n 'text-anchor': anchor,\n });\n\n text.textContent = datum && Number.isFinite(datum.value) ? formatValue(j, datum.value) : '';\n group.appendChild(text);\n });\n }\n });\n }\n\n function setActive(index: number): void {\n activeIndex = index;\n for (const el of root.querySelectorAll('[data-axis]')) {\n const active = Number(el.getAttribute('data-axis')) === index;\n\n el.classList.toggle(el.tagName === 'line' ? 'prism-radar-spoke--active' : 'prism-radar-point--active', active);\n }\n }\n\n function animateTo(targets: number[][], signal: AbortSignal): void {\n activeTween?.();\n\n const from = targets.map((row, i) => row.map((_, j) => drawn[i]?.[j] ?? 0));\n // Radar morphs a whole polygon, so it reads better slightly slower than the shared default.\n const motion = resolveMotion(config.transition, { defaultDuration: 400 });\n const easing = resolveEasing(motion.easing ?? 'ease-out');\n const unchanged = from.every((row, i) => row.every((v, j) => v === targets[i][j]));\n\n if (motion.duration === 0 || unchanged) {\n drawn = targets;\n draw(targets);\n\n return;\n }\n\n activeTween = startTween({\n count: targets.length,\n duration: motion.duration,\n easing,\n onFrame: (progress) => {\n drawn = targets.map((row, i) => {\n const e = progress(i);\n\n return row.map((to, j) => tweenNumber(from[i][j], to, e));\n });\n draw(drawn);\n },\n signal,\n stagger: motion.stagger,\n });\n }\n\n return createRadialScaffold(\n container,\n { a11y: config.a11y, legend: config.legend, tooltip: config.tooltip },\n (ctx): ChartEventHandlers | undefined => {\n const { legend, svg, tooltip } = ctx;\n\n if (!svg.contains(root)) svg.appendChild(root);\n\n tooltip?.hide();\n legend?.update(series.map((s, i) => ({ color: s.color ?? seriesColor(i), name: s.name })));\n\n if (axes.length < 3) {\n for (const group of [defs, gridGroup, seriesGroup, labelGroup]) group.replaceChildren();\n drawn = [];\n\n return undefined;\n }\n\n const { height, width } = ctx.dimensions;\n const radius = fitRadius(\n width,\n height,\n axes.map((axis) => axis.label),\n angles,\n LABEL_FONT_SIZE,\n labelGap,\n );\n\n layout = { cx: width / 2, cy: height / 2, radius };\n\n const domains = resolveAxisDomains(axes, series, config.domain);\n\n renderGrid(domains);\n renderLabels();\n renderSeries();\n animateTo(\n series.map((s) =>\n axes.map((_, j) => {\n const value = datumAt(s, j)?.value;\n\n return value !== undefined && Number.isFinite(value) ? normalize(value, domains[j]) : 0;\n }),\n ),\n ctx.disposalSignal,\n );\n setActive(activeIndex);\n\n const eventFor = (index: number, originalEvent: Event): RadarEvent => ({\n axis: axes[index],\n index,\n originalEvent,\n values: valuesAt(index),\n });\n\n const activate = (index: number, originalEvent: Event): void => {\n setActive(index);\n config.onHover?.(eventFor(index, originalEvent));\n\n const text = describe(index);\n\n if (!tooltip) {\n ctx.announcer.announce(text);\n\n return;\n }\n\n const reach = Math.max(0, ...drawn.map((row) => row[index] ?? 0));\n const svgRect = svg.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const values = valuesAt(index);\n const first = values.find((v) => v.datum)?.datum;\n const rows = values.flatMap(({ datum, series: s }) =>\n datum\n ? [\n {\n color: s.color ?? seriesColor(series.indexOf(s)),\n name: s.name,\n value: formatValue(index, datum.value),\n },\n ]\n : [],\n );\n\n tooltip.show(\n polarX(layout.cx, layout.radius * reach, angles[index]) + (svgRect.left - containerRect.left),\n polarY(layout.cy, layout.radius * reach, angles[index]) + (svgRect.top - containerRect.top),\n { key: axes[index].key, meta: { axis: axes[index], text, values }, value: first?.value ?? 0 },\n { color: series[0]?.color ?? seriesColor(0), data: [], name: axes[index].label },\n comparisonContent(svg.ownerDocument, axes[index].label, rows, text),\n );\n };\n\n const deactivate = (): void => {\n setActive(-1);\n config.onHover?.(null);\n tooltip?.hide();\n ctx.announcer.clear();\n };\n\n const hitIndex = (event: MouseEvent): number => {\n const rect = svg.getBoundingClientRect();\n const dx = event.clientX - rect.left - layout.cx;\n const dy = event.clientY - rect.top - layout.cy;\n\n if (Math.hypot(dx, dy) > layout.radius + labelGap + LABEL_FONT_SIZE * 2) return -1;\n\n return nearestAxis(dx, dy, axes.length, startAngle);\n };\n\n return {\n onClick(event) {\n const index = hitIndex(event);\n\n if (index >= 0) config.onClick?.(eventFor(index, event));\n },\n onKeyDown(event) {\n const step = ARROW_STEPS[event.key];\n\n if (step !== undefined) {\n event.preventDefault();\n activate(activeIndex < 0 ? 0 : (activeIndex + step + axes.length) % axes.length, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && activeIndex >= 0 && config.onClick) {\n event.preventDefault();\n config.onClick(eventFor(activeIndex, event));\n } else if (event.key === 'Escape') {\n deactivate();\n }\n },\n onMouseLeave: deactivate,\n onMouseMove(event) {\n const index = hitIndex(event);\n\n if (index < 0) {\n if (activeIndex >= 0) deactivate();\n } else if (index !== activeIndex) {\n activate(index, event);\n }\n },\n };\n },\n (next) => {\n series = next;\n warnOnInvalid(axes, series);\n },\n );\n}\n"],"mappings":"A,shBAqCA,IAAMoC,EAAkB,GAClBC,EAAY,GACZC,EAAe,GACfC,EAAsC,CAAE,UAAW,EAAG,UAAW,GAAI,WAAY,EAAG,QAAS,EAAG,EAkBtG,SAAS,YAAY,EAAkE,CAGrF,OAFIC,IAAS,GAAc,KAEpB,CAAE,MAAO,GAAM,OAAQ,GAAO,OAAQ,EAAG,MAAO,UAAW,GAAI,OAAOA,GAAS,SAAWA,EAAO,CAAC,CAAG,CAC9G,CAEA,SAAgB,iBAAiB,EAAwB,EAA4D,CACnH,GAAM,CAAE,QAASC,EACXC,EAAQD,EAAO,OAAS,SACxBE,EAAOF,EAAO,MAAQ,QACtBG,EAAaH,EAAO,YAAc,GAClCD,EAAO,YAAYC,EAAO,IAAI,EAC9BI,EAAa7C,EAAAA,UAAUyC,EAAO,YAAc,CAAC,EAC7CK,EAAS7C,EAAAA,WAAW8C,EAAK,OAAQF,CAAU,EAC3CG,EAAWX,GAAaI,EAAO,WAAaH,EAAe,GAC3DW,EAAK/C,EAAAA,SAAS,aAAa,EAC7BgD,EAAST,EAAO,OAIdU,EAAOhD,EAAAA,iBAAiB,IAAK,CAAE,MAAO,aAAc,CAAC,EACrDiD,EAAOjD,EAAAA,iBAAiB,MAAM,EAC9BkD,EAAYlD,EAAAA,iBAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,kBAAmB,CAAC,EACtFmD,EAAcnD,EAAAA,iBAAiB,IAAK,CAAE,MAAO,0BAA2B,CAAC,EACzEoD,EAAapD,EAAAA,iBAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,oBAAqB,CAAC,EAE/FgD,EAAK,OAAOC,EAAMC,EAAWC,EAAaC,CAAU,EAEpD,IAAIC,EAAoB,CAAC,EACrBC,EAAmC,KACnCC,EAAc,GACdC,EAAS,CAAE,GAAI,EAAG,GAAI,EAAG,OAAQ,CAAE,EAEjC,SAAW,EAAsB,IAAkBC,EAAE,KAAK,KAAM,GAAMC,EAAE,MAAQd,EAAKe,EAAM,CAAC,GAAG,EAC/F,SAAY,GAAoCZ,EAAO,IAAK,IAAO,CAAE,MAAO,QAAQU,EAAGE,CAAK,EAAG,OAAQF,CAAE,EAAE,EAC3G,aAAe,EAAe,IAA0Bb,EAAKe,EAAM,CAAC,SAASC,CAAK,GAAK,OAAOA,CAAK,EACnG,SAAY,GAChB3D,EAAAA,eAAe2C,EAAKe,EAAM,CAAC,MAAO,SAASA,CAAK,EAAI,GAAU,YAAYA,EAAOC,CAAK,CAAC,EAEzF,SAAS,KAAK,EAA6B,CACzC,GAAM,CAAE,KAAI,KAAI,UAAWJ,EAE3BK,EAAU,SAAS,EAAK,IAAM,CAC5B,IAAMC,EAAQX,EAAY,SAAS,GAEnC,GAAI,CAACW,EAAO,OAEZ,IAAMC,EAAS7D,EAAAA,YAAY8D,EAAKC,EAAIC,EAAIC,EAAQxB,CAAM,EAEtDmB,EAAM,cAAc,mBAAmB,CAAC,EAAE,aAAa,IAAK3D,EAAAA,WAAW4D,EAAQxB,CAAK,CAAC,EACrFuB,EAAM,iBAAmC,oBAAoB,CAAC,CAAC,SAAS,EAAK,IAAM,CACjFhC,EAAA,cAAcsC,EAAK,CAAE,GAAIL,EAAOM,EAAE,CAAC,EAAG,GAAIN,EAAOM,EAAE,CAAC,CAAE,CAAC,CACzD,CAAC,EACDP,EAAM,iBAAiC,oBAAoB,CAAC,CAAC,SAAS,EAAM,IAAM,CAChF,IAAMQ,EAAIH,EAASH,EAAIK,GAAKlC,EAE5BL,EAAA,cAAcyC,EAAM,CAAE,EAAGnE,EAAAA,OAAO6D,EAAIK,EAAG3B,EAAO0B,EAAE,EAAG,EAAGhE,EAAAA,OAAO6D,EAAII,EAAG3B,EAAO0B,EAAE,CAAE,CAAC,CAClF,CAAC,CACH,CAAC,CACH,CAEA,SAAS,WAAW,EAAmC,CAGrD,GAFAnB,EAAU,gBAAgB,EAEtB,CAACb,EAAM,OAEX,GAAM,CAAE,KAAI,KAAI,UAAWmB,EACrBgB,EAAS,KAAK,IAAI,EAAG,KAAK,MAAMnC,EAAK,MAAM,CAAC,EAC5CoC,EAAQ,MAAM,KAAK,CAAE,OAAQD,CAAO,GAAI,EAAG,IAC/ClE,EAAAA,SAAS+B,EAAK,MAAO4B,EAAIC,EAAKC,GAAUO,EAAI,GAAMF,EAAQ7B,CAAM,CAClE,EAEA,GAAIN,EAAK,MAEP,IAAK,IAAIqC,EAAIF,EAAS,EAAGE,GAAK,EAAG,GAAK,EACpCxB,EAAU,YACRlD,EAAAA,iBAAiB,OAAQ,CACvB,MAAO,mBACP,EAAG,GAAGyE,EAAMC,KAAKD,EAAMC,EAAI,IAAM,KACjC,YAAa,SACf,CAAC,CACH,EAIJ,IAAK,IAAMhB,KAAKe,EACdvB,EAAU,YAAYlD,EAAAA,iBAAiB,OAAQ,CAAE,MAAO,mBAAoB,IAAG,KAAM,MAAO,CAAC,CAAC,EAEhG2C,EAAO,SAAS,EAAO,IAAM,CAC3BO,EAAU,YACRlD,EAAAA,iBAAiB,OAAQ,CACvB,MAAO,oBACP,YAAa,EACb,GAAIiE,EACJ,GAAI7D,EAAAA,OAAO6D,EAAIE,EAAQQ,CAAK,EAC5B,GAAIT,EACJ,GAAI7D,EAAAA,OAAO6D,EAAIC,EAAQQ,CAAK,CAC9B,CAAC,CACH,CACF,CAAC,EAED,GAAM,CAACC,EAAIC,GAAMC,EAAQ,GACnBC,EAASD,EAAQ,OAAO,CAACE,EAAGC,KAAOD,IAAMJ,GAAMK,IAAMJ,CAAE,EAE7D,GAAI,CAACxC,EAAK,QAAU,CAAC0C,EAAQ,OAG7B,IAAMJ,EAAQhC,EAAO,GAAK,KAAK,GAAKA,EAAO,OAE3C,IAAK,IAAI+B,EAAI,EAAGA,GAAKF,EAAQ,IAAK,CAChC,IAAMF,EAAKH,EAASO,EAAKF,EACnBD,EAAOvE,EAAAA,iBAAiB,OAAQ,CACpC,MAAO,oBACP,oBAAqB,SACrB,cAAe,SACf,EAAGI,EAAAA,OAAO6D,EAAIK,EAAGK,CAAK,EACtB,EAAGtE,EAAAA,OAAO6D,EAAII,EAAGK,CAAK,CACxB,CAAC,EAED,EAAK,YAAc,YAAY,EAAG,KAAK,OAAOC,GAAOC,EAAKD,GAAMF,EAAKF,GAAU,GAAG,EAAI,GAAG,EACzFtB,EAAU,YAAYqB,CAAI,CAC5B,CACF,CAEA,SAAS,cAAqB,CAC5BnB,EAAW,gBAAgB,EAE3B,GAAM,CAAE,KAAI,KAAI,UAAWI,EAE3BZ,EAAK,SAAS,EAAM,IAAM,CACxB,GAAM,CAAE,SAAQ,YAAarC,EAAAA,eAAeoC,EAAO,EAAE,EAC/C4B,EAAOvE,EAAAA,iBAAiB,OAAQ,CACpC,MAAO,yBACP,oBAAqBkF,EACrB,cAAeC,EACf,EAAG/E,EAAAA,OAAO6D,EAAIE,EAAStB,EAAUF,EAAO,EAAE,EAC1C,EAAGtC,EAAAA,OAAO6D,EAAIC,EAAStB,EAAUF,EAAO,EAAE,CAC5C,CAAC,EAED,EAAK,YAAcyC,EAAK,MACxBhC,EAAW,YAAYmB,CAAI,CAC7B,CAAC,CACH,CAEA,SAAS,cAAqB,CAC5B,GAAM,CAAE,KAAI,KAAI,UAAWf,EAI3B,IAFAP,EAAK,gBAAgB,EAEdE,EAAY,SAAS,OAASJ,EAAO,QAAQI,EAAY,WAAW,OAAO,EAElFJ,EAAO,SAAS,EAAG,IAAM,CACvB,IAAMsC,EAAQ5B,EAAE,OAASjD,EAAAA,YAAY,CAAC,EAClCsD,EAAQX,EAAY,SAAS,GAE5BW,IACH,EAAQ9D,EAAAA,iBAAiB,IAAK,CAAE,MAAO,oBAAqB,CAAC,EAC7DmD,EAAY,YAAYW,CAAK,GAG/BA,EAAM,aAAa,iBAAkBrD,EAAAA,YAAYgD,EAAG,CAAC,CAAC,EAEtDK,EAAM,gBAAgB,EAEtB,IAAMwB,EAAOtF,EAAAA,iBAAiB,OAAQ,CACpC,MAAO,sCAAsCwC,IAC7C,OAAQ6C,EACR,kBAAmB,QACnB,eAAgB,CAClB,CAAC,EAED,GAAI7C,IAAS,WAAY,CACvB,IAAM+C,EAAa,GAAGzC,EAAG,QAAQ,IAC3B0C,EAAWxF,EAAAA,iBAAiB,iBAAkB,CAClD,KACA,KACA,cAAe,iBACf,GAAIuF,EACJ,EAAGpB,CACL,CAAC,EAED,IAAK,GAAM,CAACsB,EAAQC,IAAY,CAC9B,CAAC,EAAG,GAAI,EACR,CAAC,EAAG,GAAI,CACV,EACEF,EAAS,YACPxF,EAAAA,iBAAiB,OAAQ,CACvB,SACA,aAAcqF,EACd,eAAgBK,EAChB,MAAO,cAAcL,GACvB,CAAC,CACH,EAGFpC,EAAK,YAAYuC,CAAQ,EACzB1D,EAAA,cAAcwD,EAAM,CAAE,KAAM,QAAQC,EAAW,EAAG,CAAC,CACrD,MACEzD,EAAA,cAAcwD,EAAM,CAAE,KAAM9C,IAAS,OAAS,OAAS6C,EAAO,eAAgB,GAAK,CAAC,EAGtFvB,EAAM,YAAYwB,CAAI,EAElB7C,GACFG,EAAK,SAAS,EAAG,IAAM,CACrB,IAAM+C,EAAU,CAAC,OAAO,SAAS,QAAQlC,EAAGY,CAAC,CAAC,EAAE,KAAK,EAErDP,EAAM,YACJ9D,EAAAA,iBAAiB,SAAU,CACzB,MAAO,oBAAoB2F,EAAU,8BAAgC,KACrE,YAAatB,EACb,KAAMsB,EAAU,OAASN,EACzB,EAAG,EACH,OAAQA,CACV,CAAC,CACH,CACF,CAAC,EAGC/C,EAAO,YACTM,EAAK,SAAS,EAAG,IAAM,CACrB,IAAMgD,EAAQ,QAAQnC,EAAGY,CAAC,EACpB,CAAE,SAAQ,YAAa9D,EAAAA,eAAeoC,EAAO0B,EAAE,EAC/CE,EAAOvE,EAAAA,iBAAiB,OAAQ,CACpC,cAAe,OACf,MAAO,oBACP,oBAAqBkF,EACrB,cAAeC,CACjB,CAAC,EAED,EAAK,YAAcS,GAAS,OAAO,SAASA,EAAM,KAAK,EAAI,YAAYvB,EAAGuB,EAAM,KAAK,EAAI,GACzF9B,EAAM,YAAYS,CAAI,CACxB,CAAC,CAEL,CAAC,CACH,CAEA,SAAS,UAAU,EAAqB,CACtC,EAAcZ,EACd,IAAK,IAAMkC,KAAM7C,EAAK,iBAAiB,aAAa,EAAG,CACrD,IAAM8C,EAAS,OAAOD,EAAG,aAAa,WAAW,CAAC,IAAMlC,EAExDkC,EAAG,UAAU,OAAOA,EAAG,UAAY,OAAS,4BAA8B,4BAA6BC,CAAM,CAC/G,CACF,CAEA,SAAS,UAAU,EAAqB,EAA2B,CACjExC,IAAc,EAEd,IAAMyC,EAAOC,EAAQ,KAAK,EAAK,IAAMhC,EAAI,KAAK,EAAG,IAAMX,EAAM4C,EAAE,GAAG5B,IAAM,CAAC,CAAC,EAEpE6B,EAASxF,EAAAA,cAAc4B,EAAO,WAAY,CAAE,gBAAiB,GAAI,CAAC,EAClE6D,EAASxF,EAAAA,cAAcuF,EAAO,QAAU,UAAU,EAClDE,EAAYL,EAAK,OAAO,EAAK,IAAM/B,EAAI,OAAO,EAAG,IAAMqC,IAAML,EAAQC,EAAE,CAAC5B,EAAE,CAAC,EAE7E6B,EAAO,WAAa,GAAKE,GAC3B,EAAQJ,EACR,KAAKA,CAAO,GAKd,EAAcpF,EAAAA,WAAW,CACvB,MAAOoF,EAAQ,OACf,SAAUE,EAAO,SACjB,SACA,QAAU,GAAa,CACrB,EAAQF,EAAQ,KAAK,EAAK,IAAM,CAC9B,IAAMM,EAAIC,EAASN,CAAC,EAEpB,OAAOjC,EAAI,KAAK,EAAI,IAAMnD,EAAAA,YAAYkF,EAAKE,EAAE,CAAC5B,GAAImC,EAAIF,CAAC,CAAC,CAC1D,CAAC,EACD,KAAKjD,CAAK,CACZ,EACA,SACA,QAAS6C,EAAO,OAClB,CAAC,CACH,CAEA,OAAOpF,EAAAA,qBACL2F,EACA,CAAE,KAAMnE,EAAO,KAAM,OAAQA,EAAO,OAAQ,QAASA,EAAO,OAAQ,EACnE,GAAwC,CACvC,GAAM,CAAE,SAAQ,MAAK,WAAYoE,EAOjC,GALKC,EAAI,SAAS3D,CAAI,GAAG2D,EAAI,YAAY3D,CAAI,EAE7C4D,GAAS,KAAK,EACdC,GAAQ,OAAO9D,EAAO,KAAK,EAAG,KAAO,CAAE,MAAOU,EAAE,OAASjD,EAAAA,YAAYyF,CAAC,EAAG,KAAMxC,EAAE,IAAK,EAAE,CAAC,EAErFb,EAAK,OAAS,EAAG,CACnB,IAAK,IAAMkB,IAAS,CAACb,EAAMC,EAAWC,EAAaC,CAAU,EAAGU,EAAM,gBAAgB,EACtF,EAAQ,CAAC,EAET,MACF,CAEA,GAAM,CAAE,SAAQ,SAAU4C,EAAI,WACxBvC,EAASpD,EAAAA,UACb+F,EACAC,EACAnE,EAAK,IAAK,GAASwC,EAAK,KAAK,EAC7BzC,EACAV,EACAY,CACF,EAEA,EAAS,CAAE,GAAIiE,EAAQ,EAAG,GAAIC,EAAS,EAAG,QAAO,EAEjD,IAAMjC,EAAU9D,EAAAA,mBAAmB4B,EAAMG,EAAQT,EAAO,MAAM,EAE9D,WAAWwC,CAAO,EAClB,aAAa,EACb,aAAa,EACb,UACE/B,EAAO,IAAK,GACVH,EAAK,KAAK,EAAG,IAAM,CACjB,IAAMgB,EAAQ,QAAQH,EAAGY,CAAC,CAAC,EAAE,MAE7B,OAAOT,IAAU,IAAA,IAAa,OAAO,SAASA,CAAK,EAAI3C,EAAAA,UAAU2C,EAAOkB,EAAQT,EAAE,EAAI,CACxF,CAAC,CACH,EACAqC,EAAI,cACN,EACA,UAAUnD,CAAW,EAErB,IAAM,UAAY,EAAe,KAAsC,CACrE,KAAMX,EAAKe,GACX,QACA,gBACA,OAAQ,SAASA,CAAK,CACxB,GAEM,UAAY,EAAe,IAA+B,CAC9D,UAAUA,CAAK,EACfrB,EAAO,UAAU,SAASqB,EAAOqD,CAAa,CAAC,EAE/C,IAAMzC,EAAO,SAASZ,CAAK,EAE3B,GAAI,CAACiD,EAAS,CACZF,EAAI,UAAU,SAASnC,CAAI,EAE3B,MACF,CAEA,IAAM0C,EAAQ,KAAK,IAAI,EAAG,GAAG5D,EAAM,IAAK,GAAQW,EAAIL,IAAU,CAAC,CAAC,EAC1DuD,EAAUP,EAAI,sBAAsB,EACpCQ,EAAgBV,EAAU,sBAAsB,EAChDW,EAAS,SAASzD,CAAK,EACvB0D,EAAQD,EAAO,KAAM,GAAMf,EAAE,KAAK,CAAC,EAAE,MACrCiB,EAAOF,EAAO,SAAS,CAAE,QAAO,OAAQ3D,KAC5CmC,EACI,CACE,CACE,MAAOnC,EAAE,OAASjD,EAAAA,YAAYuC,EAAO,QAAQU,CAAC,CAAC,EAC/C,KAAMA,EAAE,KACR,MAAO,YAAYE,EAAOiC,EAAM,KAAK,CACvC,CACF,EACA,CAAC,CACP,EAEAgB,EAAQ,KACNxG,EAAAA,OAAOoD,EAAO,GAAIA,EAAO,OAASyD,EAAOtE,EAAOgB,EAAM,GAAKuD,EAAQ,KAAOC,EAAc,MACxF9G,EAAAA,OAAOmD,EAAO,GAAIA,EAAO,OAASyD,EAAOtE,EAAOgB,EAAM,GAAKuD,EAAQ,IAAMC,EAAc,KACvF,CAAE,IAAKvE,EAAKe,EAAM,CAAC,IAAK,KAAM,CAAE,KAAMf,EAAKe,GAAQ,OAAM,QAAO,EAAG,MAAO0D,GAAO,OAAS,CAAE,EAC5F,CAAE,MAAOtE,EAAO,EAAE,EAAE,OAASvC,EAAAA,YAAY,CAAC,EAAG,KAAM,CAAC,EAAG,KAAMoC,EAAKe,EAAM,CAAC,KAAM,EAC/EzC,EAAAA,kBAAkByF,EAAI,cAAe/D,EAAKe,EAAM,CAAC,MAAO2D,EAAM/C,CAAI,CACpE,CACF,EAEM,eAAyB,CAC7B,UAAU,EAAE,EACZjC,EAAO,UAAU,IAAI,EACrBsE,GAAS,KAAK,EACdF,EAAI,UAAU,MAAM,CACtB,EAEM,SAAY,GAA8B,CAC9C,IAAMa,EAAOZ,EAAI,sBAAsB,EACjCa,EAAKC,EAAM,QAAUF,EAAK,KAAO/D,EAAO,GACxCkE,EAAKD,EAAM,QAAUF,EAAK,IAAM/D,EAAO,GAI7C,OAFI,KAAK,MAAMgE,EAAIE,CAAE,EAAIlE,EAAO,OAASX,EAAW,GAA4B,GAEzE1B,EAAAA,YAAYqG,EAAIE,EAAI9E,EAAK,OAAQF,CAAU,CACpD,EAEA,MAAO,CACL,QAAQ,EAAO,CACb,IAAMiB,EAAQ,SAAS8D,CAAK,EAExB9D,GAAS,GAAGrB,EAAO,UAAU,SAASqB,EAAO8D,CAAK,CAAC,CACzD,EACA,UAAU,EAAO,CACf,IAAME,EAAOvF,EAAYqF,EAAM,KAE3BE,IAAS,IAAA,IAGDF,EAAM,MAAQ,SAAWA,EAAM,MAAQ,MAAQlE,GAAe,GAAKjB,EAAO,SACpFmF,EAAM,eAAe,EACrBnF,EAAO,QAAQ,SAASiB,EAAakE,CAAK,CAAC,GAClCA,EAAM,MAAQ,UACvB,WAAW,GANXA,EAAM,eAAe,EACrB,SAASlE,EAAc,EAAI,GAAKA,EAAcoE,EAAO/E,EAAK,QAAUA,EAAK,OAAQ6E,CAAK,EAO1F,EACA,aAAc,WACd,YAAY,EAAO,CACjB,IAAM9D,EAAQ,SAAS8D,CAAK,EAExB9D,EAAQ,EACNJ,GAAe,GAAG,WAAW,EACxBI,IAAUJ,GACnB,SAASI,EAAO8D,CAAK,CAEzB,CACF,CACF,EACC,GAAS,CACR,EAASG,CAEX,CACF,CACF,C"}