@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,18 +1,18 @@
1
1
  import "../../_dev.js";
2
- import { createSvgElement as e, setAttributes as t } from "../../svg/element.js";
3
- import { describeValues as n } from "../../interaction/announcer.js";
4
- import { comparisonContent as r } from "../../interaction/tooltip.js";
2
+ import { resolveEasing as e } from "../../animation/easing.js";
3
+ import { resolveMotion as t } from "../../animation/motion.js";
4
+ import { startTween as n } from "../../animation/transition.js";
5
+ import { tweenNumber as r } from "../../animation/tween.js";
5
6
  import { createRadialScaffold as i } from "../../core/chart-scaffold.js";
6
- import { seriesDomId as a } from "../../core/series-id.js";
7
- import { seriesColor as o } from "../../theme/index.js";
8
- import { resolveEasing as s } from "../../animation/easing.js";
9
- import { resolveMotion as c } from "../../animation/motion.js";
10
- import { tweenNumber as l } from "../../animation/tween.js";
11
- import { startTween as u } from "../../animation/transition.js";
12
- import { uniqueId as d } from "../../core/ids.js";
13
- import { polarX as f, polarY as p } from "../../core/polar.js";
7
+ import { uniqueId as a } from "../../core/ids.js";
8
+ import { polarX as o, polarY as s } from "../../core/polar.js";
9
+ import { seriesDomId as c } from "../../core/series-id.js";
10
+ import { describeValues as l } from "../../interaction/announcer.js";
11
+ import { comparisonContent as u } from "../../interaction/tooltip.js";
12
+ import { createSvgElement as d, setAttributes as f } from "../../svg/element.js";
13
+ import { seriesColor as p } from "../../theme/index.js";
14
14
  import { axisAngles as m, closedPath as h, fitRadius as g, labelPlacement as _, nearestAxis as v, normalize as y, radarPoints as b, resolveAxisDomains as x, ringPath as S, toRadians as C } from "./radar-geometry.js";
15
- //#region src/charts/radar/radar-chart.ts
15
+ // src/charts/radar/radar-chart.ts
16
16
  var w = 11, T = 12, E = 10, D = {
17
17
  ArrowDown: 1,
18
18
  ArrowLeft: -1,
@@ -29,10 +29,10 @@ function resolveGrid(e) {
29
29
  };
30
30
  }
31
31
  function createRadarChart(O, k) {
32
- let { axes: A } = k, j = k.curve ?? "linear", M = k.fill ?? "solid", N = k.showPoints ?? !0, P = resolveGrid(k.grid), F = C(k.startAngle ?? 0), I = m(A.length, F), L = T + (k.showValues ? E : 0), R = d("prism-radar"), z = k.series, B = e("g", { class: "prism-radar" }), V = e("defs"), H = e("g", {
32
+ let { axes: A } = k, j = k.curve ?? "linear", M = k.fill ?? "solid", N = k.showPoints ?? !0, P = resolveGrid(k.grid), F = C(k.startAngle ?? 0), I = m(A.length, F), L = T + (k.showValues ? E : 0), R = a("prism-radar"), z = k.series, B = d("g", { class: "prism-radar" }), V = d("defs"), H = d("g", {
33
33
  "aria-hidden": "true",
34
34
  class: "prism-radar-grid"
35
- }), U = e("g", { class: "prism-radar-series-group" }), W = e("g", {
35
+ }), U = d("g", { class: "prism-radar-series-group" }), W = d("g", {
36
36
  "aria-hidden": "true",
37
37
  class: "prism-radar-labels"
38
38
  });
@@ -44,126 +44,126 @@ function createRadarChart(O, k) {
44
44
  }, datumAt = (e, t) => e.data.find((e) => e.key === A[t].key), valuesAt = (e) => z.map((t) => ({
45
45
  datum: datumAt(t, e),
46
46
  series: t
47
- })), formatValue = (e, t) => A[e].format?.(t) ?? String(t), describe = (e) => n(A[e].label, valuesAt(e), (t) => formatValue(e, t));
47
+ })), formatValue = (e, t) => A[e].format?.(t) ?? String(t), describe = (e) => l(A[e].label, valuesAt(e), (t) => formatValue(e, t));
48
48
  function draw(e) {
49
- let { cx: n, cy: r, radius: i } = J;
50
- e.forEach((e, a) => {
51
- let o = U.children[a];
52
- if (!o) return;
53
- let s = b(e, n, r, i, I);
54
- o.querySelector(".prism-radar-area")?.setAttribute("d", h(s, j)), o.querySelectorAll(".prism-radar-point").forEach((e, n) => {
55
- t(e, {
56
- cx: s[n].x,
57
- cy: s[n].y
49
+ let { cx: t, cy: n, radius: r } = J;
50
+ e.forEach((e, i) => {
51
+ let a = U.children[i];
52
+ if (!a) return;
53
+ let c = b(e, t, n, r, I);
54
+ a.querySelector(".prism-radar-area")?.setAttribute("d", h(c, j)), a.querySelectorAll(".prism-radar-point").forEach((e, t) => {
55
+ f(e, {
56
+ cx: c[t].x,
57
+ cy: c[t].y
58
58
  });
59
- }), o.querySelectorAll(".prism-radar-value").forEach((a, o) => {
60
- let s = i * e[o] + E;
61
- t(a, {
62
- x: f(n, s, I[o]),
63
- y: p(r, s, I[o])
59
+ }), a.querySelectorAll(".prism-radar-value").forEach((i, a) => {
60
+ let c = r * e[a] + E;
61
+ f(i, {
62
+ x: o(t, c, I[a]),
63
+ y: s(n, c, I[a])
64
64
  });
65
65
  });
66
66
  });
67
67
  }
68
- function renderGrid(t) {
68
+ function renderGrid(e) {
69
69
  if (H.replaceChildren(), !P) return;
70
- let { cx: n, cy: r, radius: i } = J, a = Math.max(1, Math.round(P.levels)), o = Array.from({ length: a }, (e, t) => S(P.shape, n, r, i * (t + 1) / a, I));
71
- if (P.bands) for (let t = a - 1; t >= 0; t -= 2) H.appendChild(e("path", {
70
+ let { cx: t, cy: n, radius: r } = J, i = Math.max(1, Math.round(P.levels)), a = Array.from({ length: i }, (e, a) => S(P.shape, t, n, r * (a + 1) / i, I));
71
+ if (P.bands) for (let e = i - 1; e >= 0; e -= 2) H.appendChild(d("path", {
72
72
  class: "prism-radar-band",
73
- d: `${o[t]}${o[t - 1] ?? ""}`,
73
+ d: `${a[e]}${a[e - 1] ?? ""}`,
74
74
  "fill-rule": "evenodd"
75
75
  }));
76
- for (let t of o) H.appendChild(e("path", {
76
+ for (let e of a) H.appendChild(d("path", {
77
77
  class: "prism-radar-ring",
78
- d: t,
78
+ d: e,
79
79
  fill: "none"
80
80
  }));
81
- I.forEach((t, a) => {
82
- H.appendChild(e("line", {
81
+ I.forEach((e, i) => {
82
+ H.appendChild(d("line", {
83
83
  class: "prism-radar-spoke",
84
- "data-axis": a,
85
- x1: n,
86
- x2: f(n, i, t),
87
- y1: r,
88
- y2: p(r, i, t)
84
+ "data-axis": i,
85
+ x1: t,
86
+ x2: o(t, r, e),
87
+ y1: n,
88
+ y2: s(n, r, e)
89
89
  }));
90
90
  });
91
- let [s, c] = t[0], l = t.every(([e, t]) => e === s && t === c);
92
- if (!P.labels || !l) return;
93
- let u = I[0] + Math.PI / I.length;
94
- for (let t = 1; t <= a; t++) {
95
- let o = i * t / a, l = e("text", {
91
+ let [c, l] = e[0], u = e.every(([e, t]) => e === c && t === l);
92
+ if (!P.labels || !u) return;
93
+ let f = I[0] + Math.PI / I.length;
94
+ for (let e = 1; e <= i; e++) {
95
+ let a = r * e / i, u = d("text", {
96
96
  class: "prism-radar-level",
97
97
  "dominant-baseline": "middle",
98
98
  "text-anchor": "middle",
99
- x: f(n, o, u),
100
- y: p(r, o, u)
99
+ x: o(t, a, f),
100
+ y: s(n, a, f)
101
101
  });
102
- l.textContent = formatValue(0, Math.round((s + (c - s) * t / a) * 100) / 100), H.appendChild(l);
102
+ u.textContent = formatValue(0, Math.round((c + (l - c) * e / i) * 100) / 100), H.appendChild(u);
103
103
  }
104
104
  }
105
105
  function renderLabels() {
106
106
  W.replaceChildren();
107
- let { cx: t, cy: n, radius: r } = J;
108
- A.forEach((i, a) => {
109
- let { anchor: o, baseline: s } = _(I[a]), c = e("text", {
107
+ let { cx: e, cy: t, radius: n } = J;
108
+ A.forEach((r, i) => {
109
+ let { anchor: a, baseline: c } = _(I[i]), l = d("text", {
110
110
  class: "prism-radar-axis-label",
111
- "dominant-baseline": s,
112
- "text-anchor": o,
113
- x: f(t, r + L, I[a]),
114
- y: p(n, r + L, I[a])
111
+ "dominant-baseline": c,
112
+ "text-anchor": a,
113
+ x: o(e, n + L, I[i]),
114
+ y: s(t, n + L, I[i])
115
115
  });
116
- c.textContent = i.label, W.appendChild(c);
116
+ l.textContent = r.label, W.appendChild(l);
117
117
  });
118
118
  }
119
119
  function renderSeries() {
120
- let { cx: n, cy: r, radius: i } = J;
120
+ let { cx: e, cy: t, radius: n } = J;
121
121
  for (V.replaceChildren(); U.children.length > z.length;) U.lastChild?.remove();
122
- z.forEach((s, c) => {
123
- let l = s.color ?? o(c), u = U.children[c];
124
- u || (u = e("g", { class: "prism-radar-series" }), U.appendChild(u)), u.setAttribute("data-series-id", a(s, c)), u.replaceChildren();
125
- let d = e("path", {
122
+ z.forEach((r, i) => {
123
+ let a = r.color ?? p(i), o = U.children[i];
124
+ o || (o = d("g", { class: "prism-radar-series" }), U.appendChild(o)), o.setAttribute("data-series-id", c(r, i)), o.replaceChildren();
125
+ let s = d("path", {
126
126
  class: `prism-radar-area prism-radar-area--${M}`,
127
- stroke: l,
127
+ stroke: a,
128
128
  "stroke-linejoin": "round",
129
129
  "stroke-width": 2
130
130
  });
131
131
  if (M === "gradient") {
132
- let a = `${R}-fill-${c}`, o = e("radialGradient", {
133
- cx: n,
134
- cy: r,
132
+ let r = `${R}-fill-${i}`, o = d("radialGradient", {
133
+ cx: e,
134
+ cy: t,
135
135
  gradientUnits: "userSpaceOnUse",
136
- id: a,
137
- r: i
136
+ id: r,
137
+ r: n
138
138
  });
139
- for (let [t, n] of [[0, .08], [1, .55]]) o.appendChild(e("stop", {
140
- offset: t,
141
- "stop-color": l,
142
- "stop-opacity": n,
143
- style: `stop-color:${l}`
139
+ for (let [e, t] of [[0, .08], [1, .55]]) o.appendChild(d("stop", {
140
+ offset: e,
141
+ "stop-color": a,
142
+ "stop-opacity": t,
143
+ style: `stop-color:${a}`
144
144
  }));
145
- V.appendChild(o), t(d, { fill: `url(#${a})` });
146
- } else t(d, {
147
- fill: M === "none" ? "none" : l,
145
+ V.appendChild(o), f(s, { fill: `url(#${r})` });
146
+ } else f(s, {
147
+ fill: M === "none" ? "none" : a,
148
148
  "fill-opacity": .25
149
149
  });
150
- u.appendChild(d), N && A.forEach((t, n) => {
151
- let r = !Number.isFinite(datumAt(s, n)?.value);
152
- u.appendChild(e("circle", {
153
- class: `prism-radar-point${r ? " prism-radar-point--missing" : ""}`,
154
- "data-axis": n,
155
- fill: r ? "none" : l,
150
+ o.appendChild(s), N && A.forEach((e, t) => {
151
+ let n = !Number.isFinite(datumAt(r, t)?.value);
152
+ o.appendChild(d("circle", {
153
+ class: `prism-radar-point${n ? " prism-radar-point--missing" : ""}`,
154
+ "data-axis": t,
155
+ fill: n ? "none" : a,
156
156
  r: 3,
157
- stroke: l
157
+ stroke: a
158
158
  }));
159
- }), k.showValues && A.forEach((t, n) => {
160
- let r = datumAt(s, n), { anchor: i, baseline: a } = _(I[n]), o = e("text", {
159
+ }), k.showValues && A.forEach((e, t) => {
160
+ let n = datumAt(r, t), { anchor: i, baseline: a } = _(I[t]), s = d("text", {
161
161
  "aria-hidden": "true",
162
162
  class: "prism-radar-value",
163
163
  "dominant-baseline": a,
164
164
  "text-anchor": i
165
165
  });
166
- o.textContent = r && Number.isFinite(r.value) ? formatValue(n, r.value) : "", u.appendChild(o);
166
+ s.textContent = n && Number.isFinite(n.value) ? formatValue(t, n.value) : "", o.appendChild(s);
167
167
  });
168
168
  });
169
169
  }
@@ -174,21 +174,21 @@ function createRadarChart(O, k) {
174
174
  t.classList.toggle(t.tagName === "line" ? "prism-radar-spoke--active" : "prism-radar-point--active", n);
175
175
  }
176
176
  }
177
- function animateTo(e, t) {
177
+ function animateTo(i, a) {
178
178
  K?.();
179
- let n = e.map((e, t) => e.map((e, n) => G[t]?.[n] ?? 0)), r = c(k.transition, { defaultDuration: 400 }), i = s(r.easing ?? "ease-out"), a = n.every((t, n) => t.every((t, r) => t === e[n][r]));
180
- r.duration === 0 || a ? (G = e, draw(e)) : K = u({
181
- count: e.length,
182
- duration: r.duration,
183
- easing: i,
184
- onFrame: (t) => {
185
- G = e.map((e, r) => {
186
- let i = t(r);
187
- return e.map((e, t) => l(n[r][t], e, i));
179
+ let o = i.map((e, t) => e.map((e, n) => G[t]?.[n] ?? 0)), s = t(k.transition, { defaultDuration: 400 }), c = e(s.easing ?? "ease-out"), l = o.every((e, t) => e.every((e, n) => e === i[t][n]));
180
+ s.duration === 0 || l ? (G = i, draw(i)) : K = n({
181
+ count: i.length,
182
+ duration: s.duration,
183
+ easing: c,
184
+ onFrame: (e) => {
185
+ G = i.map((t, n) => {
186
+ let i = e(n);
187
+ return t.map((e, t) => r(o[n][t], e, i));
188
188
  }), draw(G);
189
189
  },
190
- signal: t,
191
- stagger: r.stagger
190
+ signal: a,
191
+ stagger: s.stagger
192
192
  });
193
193
  }
194
194
  return i(O, {
@@ -196,9 +196,9 @@ function createRadarChart(O, k) {
196
196
  legend: k.legend,
197
197
  tooltip: k.tooltip
198
198
  }, (e) => {
199
- let { legend: t, svg: n, tooltip: i } = e;
200
- if (n.contains(B) || n.appendChild(B), i?.hide(), t?.update(z.map((e, t) => ({
201
- color: e.color ?? o(t),
199
+ let { legend: t, svg: n, tooltip: r } = e;
200
+ if (n.contains(B) || n.appendChild(B), r?.hide(), t?.update(z.map((e, t) => ({
201
+ color: e.color ?? p(t),
202
202
  name: e.name
203
203
  }))), A.length < 3) {
204
204
  for (let e of [
@@ -210,10 +210,10 @@ function createRadarChart(O, k) {
210
210
  G = [];
211
211
  return;
212
212
  }
213
- let { height: a, width: s } = e.dimensions, c = g(s, a, A.map((e) => e.label), I, w, L);
213
+ let { height: i, width: a } = e.dimensions, c = g(a, i, A.map((e) => e.label), I, w, L);
214
214
  J = {
215
- cx: s / 2,
216
- cy: a / 2,
215
+ cx: a / 2,
216
+ cy: i / 2,
217
217
  radius: c
218
218
  };
219
219
  let l = x(A, z, k.domain);
@@ -226,33 +226,33 @@ function createRadarChart(O, k) {
226
226
  index: e,
227
227
  originalEvent: t,
228
228
  values: valuesAt(e)
229
- }), activate = (t, a) => {
230
- setActive(t), k.onHover?.(eventFor(t, a));
231
- let s = describe(t);
232
- if (!i) {
233
- e.announcer.announce(s);
229
+ }), activate = (t, i) => {
230
+ setActive(t), k.onHover?.(eventFor(t, i));
231
+ let a = describe(t);
232
+ if (!r) {
233
+ e.announcer.announce(a);
234
234
  return;
235
235
  }
236
- let c = Math.max(0, ...G.map((e) => e[t] ?? 0)), l = n.getBoundingClientRect(), u = O.getBoundingClientRect(), d = valuesAt(t), m = d.find((e) => e.datum)?.datum, h = d.flatMap(({ datum: e, series: n }) => e ? [{
237
- color: n.color ?? o(z.indexOf(n)),
236
+ let c = Math.max(0, ...G.map((e) => e[t] ?? 0)), l = n.getBoundingClientRect(), d = O.getBoundingClientRect(), f = valuesAt(t), m = f.find((e) => e.datum)?.datum, h = f.flatMap(({ datum: e, series: n }) => e ? [{
237
+ color: n.color ?? p(z.indexOf(n)),
238
238
  name: n.name,
239
239
  value: formatValue(t, e.value)
240
240
  }] : []);
241
- i.show(f(J.cx, J.radius * c, I[t]) + (l.left - u.left), p(J.cy, J.radius * c, I[t]) + (l.top - u.top), {
241
+ r.show(o(J.cx, J.radius * c, I[t]) + (l.left - d.left), s(J.cy, J.radius * c, I[t]) + (l.top - d.top), {
242
242
  key: A[t].key,
243
243
  meta: {
244
244
  axis: A[t],
245
- text: s,
246
- values: d
245
+ text: a,
246
+ values: f
247
247
  },
248
248
  value: m?.value ?? 0
249
249
  }, {
250
- color: z[0]?.color ?? o(0),
250
+ color: z[0]?.color ?? p(0),
251
251
  data: [],
252
252
  name: A[t].label
253
- }, r(n.ownerDocument, A[t].label, h, s));
253
+ }, u(n.ownerDocument, A[t].label, h, a));
254
254
  }, deactivate = () => {
255
- setActive(-1), k.onHover?.(null), i?.hide(), e.announcer.clear();
255
+ setActive(-1), k.onHover?.(null), r?.hide(), e.announcer.clear();
256
256
  }, hitIndex = (e) => {
257
257
  let t = n.getBoundingClientRect(), r = e.clientX - t.left - J.cx, i = e.clientY - t.top - J.cy;
258
258
  return Math.hypot(r, i) > J.radius + L + 22 ? -1 : v(r, i, A.length, F);
@@ -276,7 +276,6 @@ function createRadarChart(O, k) {
276
276
  z = e;
277
277
  });
278
278
  }
279
- //#endregion
280
279
  export { createRadarChart };
281
280
 
282
281
  //# sourceMappingURL=radar-chart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"radar-chart.js","names":["LABEL_FONT_SIZE","LABEL_GAP","VALUE_OFFSET","ARROW_STEPS","grid","config","curve","fill","showPoints","startAngle","toRadians","angles","axisAngles","axes","labelGap","id","uniqueId","series","root","createSvgElement","defs","gridGroup","seriesGroup","labelGroup","drawn","activeTween","activeIndex","layout","s","d","index","value","describeValues","group","i","points","radarPoints","row","cx","cy","radius","closedPath","dot","j","r","text","polarX","polarY","levels","rings","ringPath","k","angle","d0","d1","domains","shared","a","b","labelPlacement","baseline","anchor","axis","color","seriesColor","seriesDomId","area","gradientId","gradient","offset","opacity","setAttributes","missing","datum","el","active","from","targets","motion","resolveMotion","easing","resolveEasing","unchanged","v","startTween","e","progress","tweenNumber","to","createRadialScaffold","container","ctx","svg","tooltip","legend","fitRadius","width","height","resolveAxisDomains","normalize","originalEvent","reach","svgRect","containerRect","values","first","rows","comparisonContent","rect","dx","event","dy","nearestAxis","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":"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"}
1
+ {"version":3,"file":"radar-chart.js","names":["LABEL_FONT_SIZE","LABEL_GAP","VALUE_OFFSET","ARROW_STEPS","grid","config","curve","fill","showPoints","startAngle","toRadians","angles","axisAngles","axes","labelGap","id","uniqueId","series","root","createSvgElement","defs","gridGroup","seriesGroup","labelGroup","drawn","activeTween","activeIndex","layout","s","d","index","value","describeValues","group","points","radarPoints","row","cx","cy","radius","closedPath","dot","j","r","text","polarX","polarY","levels","rings","ringPath","k","angle","d0","d1","domains","shared","a","b","labelPlacement","baseline","anchor","axis","color","seriesColor","seriesDomId","area","gradientId","gradient","offset","opacity","setAttributes","missing","datum","el","active","from","targets","i","motion","resolveMotion","easing","resolveEasing","unchanged","v","startTween","e","progress","tweenNumber","to","createRadialScaffold","container","ctx","svg","tooltip","legend","fitRadius","width","height","resolveAxisDomains","normalize","originalEvent","reach","svgRect","containerRect","values","first","rows","comparisonContent","rect","dx","event","dy","nearestAxis","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":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../../svg/text.cjs"),t=require("../../scales/linear.cjs"),n=require("../../core/polar.cjs");var r=2*Math.PI;function toRadians(e){return e*Math.PI/180}function axisAngles(e,t=0){return Array.from({length:e},(n,i)=>t+i*r/e)}function resolveAxisDomains(e,n,r){let i=r;if(!i){let e=n.flatMap(e=>e.data.map(e=>e.value)).filter(Number.isFinite),r=Math.min(0,...e),a=e.length?Math.max(...e):1;i=t.linearScale({domain:[r,a>r?a:r+1],range:[0,1]}).domain}return e.map(e=>[e.min??i[0],e.max??i[1]])}function normalize(e,[t,n]){return n===t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function radarPoints(e,t,r,i,a){return e.map((e,o)=>({x:n.polarX(t,i*e,a[o]),y:n.polarY(r,i*e,a[o])}))}function closedPath(e,t=`linear`){let n=e.length;if(n===0)return``;let[r]=e;if(t===`linear`||n<3)return`M${r.x},${r.y}${e.slice(1).map(e=>`L${e.x},${e.y}`).join(``)}Z`;let i=`M${r.x},${r.y}`;for(let t=0;t<n;t++){let r=e[(t-1+n)%n],a=e[t],o=e[(t+1)%n],s=e[(t+2)%n];i+=`C${a.x+(o.x-r.x)/6},${a.y+(o.y-r.y)/6} ${o.x-(s.x-a.x)/6},${o.y-(s.y-a.y)/6} ${o.x},${o.y}`}return`${i}Z`}function ringPath(e,t,n,r,i){return r<=0?``:e===`circle`?`M${t},${n-r}A${r},${r} 0 1 1 ${t},${n+r}A${r},${r} 0 1 1 ${t},${n-r}Z`:closedPath(radarPoints(i.map(()=>1),t,n,r,i))}function labelPlacement(e){let t=Math.sin(e),n=Math.cos(e);return{anchor:Math.abs(t)<.1?`middle`:t>0?`start`:`end`,baseline:n>.9?`auto`:n<-.9?`hanging`:`middle`}}function fitRadius(t,n,r,i,a,o){let s=0;r.forEach((t,n)=>{labelPlacement(i[n]).anchor!==`middle`&&(s=Math.max(s,e.estimateTextWidth(t,a)))});let c=a*1.3;return Math.max(8,Math.min(t/2-o-s,n/2-o-c))}function nearestAxis(e,t,n,i=0){if(n===0)return-1;let a=r/n,o=((Math.atan2(e,-t)-i)%r+r)%r;return Math.round(o/a)%n}exports.axisAngles=axisAngles,exports.closedPath=closedPath,exports.fitRadius=fitRadius,exports.labelPlacement=labelPlacement,exports.nearestAxis=nearestAxis,exports.normalize=normalize,exports.radarPoints=radarPoints,exports.resolveAxisDomains=resolveAxisDomains,exports.ringPath=ringPath,exports.toRadians=toRadians;
1
+ const e=require("../../core/polar.cjs"),t=require("../../scales/linear.cjs"),n=require("../../svg/text.cjs");var r=2*Math.PI;function toRadians(e){return e*Math.PI/180}function axisAngles(e,t=0){return Array.from({length:e},(n,i)=>t+i*r/e)}function resolveAxisDomains(e,n,r){let i=r;if(!i){let e=n.flatMap(e=>e.data.map(e=>e.value)).filter(Number.isFinite),r=Math.min(0,...e),a=e.length?Math.max(...e):1;i=t.linearScale({domain:[r,a>r?a:r+1],range:[0,1]}).domain}return e.map(e=>[e.min??i[0],e.max??i[1]])}function normalize(e,[t,n]){return n===t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function radarPoints(t,n,r,i,a){return t.map((t,o)=>({x:e.polarX(n,i*t,a[o]),y:e.polarY(r,i*t,a[o])}))}function closedPath(e,t=`linear`){let n=e.length;if(n===0)return``;let[r]=e;if(t===`linear`||n<3)return`M${r.x},${r.y}${e.slice(1).map(e=>`L${e.x},${e.y}`).join(``)}Z`;let i=`M${r.x},${r.y}`;for(let t=0;t<n;t++){let r=e[(t-1+n)%n],a=e[t],o=e[(t+1)%n],s=e[(t+2)%n];i+=`C${a.x+(o.x-r.x)/6},${a.y+(o.y-r.y)/6} ${o.x-(s.x-a.x)/6},${o.y-(s.y-a.y)/6} ${o.x},${o.y}`}return`${i}Z`}function ringPath(e,t,n,r,i){return r<=0?``:e===`circle`?`M${t},${n-r}A${r},${r} 0 1 1 ${t},${n+r}A${r},${r} 0 1 1 ${t},${n-r}Z`:closedPath(radarPoints(i.map(()=>1),t,n,r,i))}function labelPlacement(e){let t=Math.sin(e),n=Math.cos(e);return{anchor:Math.abs(t)<.1?`middle`:t>0?`start`:`end`,baseline:n>.9?`auto`:n<-.9?`hanging`:`middle`}}function fitRadius(e,t,r,i,a,o){let s=0;r.forEach((e,t)=>{labelPlacement(i[t]).anchor!==`middle`&&(s=Math.max(s,n.estimateTextWidth(e,a)))});let c=a*1.3;return Math.max(8,Math.min(e/2-o-s,t/2-o-c))}function nearestAxis(e,t,n,i=0){if(n===0)return-1;let a=r/n,o=((Math.atan2(e,-t)-i)%r+r)%r;return Math.round(o/a)%n}exports.axisAngles=axisAngles,exports.closedPath=closedPath,exports.fitRadius=fitRadius,exports.labelPlacement=labelPlacement,exports.nearestAxis=nearestAxis,exports.normalize=normalize,exports.radarPoints=radarPoints,exports.resolveAxisDomains=resolveAxisDomains,exports.ringPath=ringPath,exports.toRadians=toRadians;
2
2
  //# sourceMappingURL=radar-geometry.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"radar-geometry.cjs","names":["linearScale","polarX","polarY","estimateTextWidth","require_text","require_linear","require_polar","TWO_PI","degrees","count","startAngle","shared","domain","values","series","s","d","min","max","axes","axis","value","fractions","cx","radius","f","angles","i","cy","points","first","curve","p","p0","p1","p2","p3","shape","sin","angle","cos","side","labels","label","fontSize","lineHeight","width","gap","height","step","dx","dy"],"sources":["../../../src/charts/radar/radar-geometry.ts"],"sourcesContent":["import { polarX, polarY } from '../../core/polar';\nimport { linearScale } from '../../scales/linear';\nimport type { Point } from '../../svg/path';\nimport { estimateTextWidth } from '../../svg/text';\nimport type { RadarAxisConfig, RadarSeriesConfig } from '../../types';\n\nconst TWO_PI = 2 * Math.PI;\n\nexport type LabelAnchor = 'end' | 'middle' | 'start';\nexport type LabelBaseline = 'auto' | 'hanging' | 'middle';\n\nexport function toRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nexport function axisAngles(count: number, startAngle = 0): number[] {\n return Array.from({ length: count }, (_, i) => startAngle + (i * TWO_PI) / count);\n}\n\n/** Per-axis `[min, max]`: axis overrides win over `domain`, which wins over a nice range around the data. */\nexport function resolveAxisDomains(\n axes: readonly RadarAxisConfig[],\n series: readonly RadarSeriesConfig[],\n domain?: [number, number],\n): [number, number][] {\n let shared = domain;\n\n if (!shared) {\n const values = series.flatMap((s) => s.data.map((d) => d.value)).filter(Number.isFinite);\n const min = Math.min(0, ...values);\n const max = values.length ? Math.max(...values) : 1;\n\n shared = linearScale({ domain: [min, max > min ? max : min + 1], range: [0, 1] }).domain as [number, number];\n }\n\n return axes.map((axis) => [axis.min ?? shared[0], axis.max ?? shared[1]]);\n}\n\nexport function normalize(value: number, [min, max]: readonly [number, number]): number {\n if (max === min) return 0;\n\n return Math.max(0, Math.min(1, (value - min) / (max - min)));\n}\n\nexport function radarPoints(\n fractions: readonly number[],\n cx: number,\n cy: number,\n radius: number,\n angles: readonly number[],\n): Point[] {\n return fractions.map((f, i) => ({ x: polarX(cx, radius * f, angles[i]), y: polarY(cy, radius * f, angles[i]) }));\n}\n\n/** Closed outline through every point; `rounded` uses a closed Catmull–Rom spline. */\nexport function closedPath(points: readonly Point[], curve: 'linear' | 'rounded' = 'linear'): string {\n const n = points.length;\n\n if (n === 0) return '';\n\n const [first] = points;\n\n if (curve === 'linear' || n < 3) {\n return `M${first.x},${first.y}${points\n .slice(1)\n .map((p) => `L${p.x},${p.y}`)\n .join('')}Z`;\n }\n\n let d = `M${first.x},${first.y}`;\n\n for (let i = 0; i < n; i++) {\n const p0 = points[(i - 1 + n) % n];\n const p1 = points[i];\n const p2 = points[(i + 1) % n];\n const p3 = points[(i + 2) % n];\n\n d += `C${p1.x + (p2.x - p0.x) / 6},${p1.y + (p2.y - p0.y) / 6} ${p2.x - (p3.x - p1.x) / 6},${p2.y - (p3.y - p1.y) / 6} ${p2.x},${p2.y}`;\n }\n\n return `${d}Z`;\n}\n\nexport function ringPath(\n shape: 'circle' | 'polygon',\n cx: number,\n cy: number,\n r: number,\n angles: readonly number[],\n): string {\n if (r <= 0) return '';\n\n if (shape === 'circle') return `M${cx},${cy - r}A${r},${r} 0 1 1 ${cx},${cy + r}A${r},${r} 0 1 1 ${cx},${cy - r}Z`;\n\n return closedPath(\n radarPoints(\n angles.map(() => 1),\n cx,\n cy,\n r,\n angles,\n ),\n );\n}\n\nexport function labelPlacement(angle: number): { anchor: LabelAnchor; baseline: LabelBaseline } {\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n\n return {\n anchor: Math.abs(sin) < 0.1 ? 'middle' : sin > 0 ? 'start' : 'end',\n baseline: cos > 0.9 ? 'auto' : cos < -0.9 ? 'hanging' : 'middle',\n };\n}\n\n/** Largest radius that leaves room for the axis labels around it. */\nexport function fitRadius(\n width: number,\n height: number,\n labels: readonly string[],\n angles: readonly number[],\n fontSize: number,\n gap: number,\n): number {\n let side = 0;\n\n labels.forEach((label, i) => {\n if (labelPlacement(angles[i]).anchor !== 'middle') side = Math.max(side, estimateTextWidth(label, fontSize));\n });\n\n const lineHeight = fontSize * 1.3;\n\n return Math.max(8, Math.min(width / 2 - gap - side, height / 2 - gap - lineHeight));\n}\n\n/** Index of the axis closest in angle to the offset `(dx, dy)` from the centre. */\nexport function nearestAxis(dx: number, dy: number, count: number, startAngle = 0): number {\n if (count === 0) return -1;\n\n const step = TWO_PI / count;\n const angle = (((Math.atan2(dx, -dy) - startAngle) % TWO_PI) + TWO_PI) % TWO_PI;\n\n return Math.round(angle / step) % count;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"radar-geometry.cjs","names":["linearScale","polarX","polarY","estimateTextWidth","require_polar","require_linear","require_text","TWO_PI","degrees","count","startAngle","shared","domain","values","series","s","d","min","max","axes","axis","value","fractions","cx","radius","f","angles","i","cy","points","first","curve","p","p0","p1","p2","p3","shape","sin","angle","cos","side","labels","label","fontSize","lineHeight","width","gap","height","step","dx","dy"],"sources":["../../../src/charts/radar/radar-geometry.ts"],"sourcesContent":["import { polarX, polarY } from '../../core/polar';\nimport { linearScale } from '../../scales/linear';\nimport type { Point } from '../../svg/path';\nimport { estimateTextWidth } from '../../svg/text';\nimport type { RadarAxisConfig, RadarSeriesConfig } from '../../types';\n\nconst TWO_PI = 2 * Math.PI;\n\nexport type LabelAnchor = 'end' | 'middle' | 'start';\nexport type LabelBaseline = 'auto' | 'hanging' | 'middle';\n\nexport function toRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nexport function axisAngles(count: number, startAngle = 0): number[] {\n return Array.from({ length: count }, (_, i) => startAngle + (i * TWO_PI) / count);\n}\n\n/** Per-axis `[min, max]`: axis overrides win over `domain`, which wins over a nice range around the data. */\nexport function resolveAxisDomains(\n axes: readonly RadarAxisConfig[],\n series: readonly RadarSeriesConfig[],\n domain?: [number, number],\n): [number, number][] {\n let shared = domain;\n\n if (!shared) {\n const values = series.flatMap((s) => s.data.map((d) => d.value)).filter(Number.isFinite);\n const min = Math.min(0, ...values);\n const max = values.length ? Math.max(...values) : 1;\n\n shared = linearScale({ domain: [min, max > min ? max : min + 1], range: [0, 1] }).domain as [number, number];\n }\n\n return axes.map((axis) => [axis.min ?? shared[0], axis.max ?? shared[1]]);\n}\n\nexport function normalize(value: number, [min, max]: readonly [number, number]): number {\n if (max === min) return 0;\n\n return Math.max(0, Math.min(1, (value - min) / (max - min)));\n}\n\nexport function radarPoints(\n fractions: readonly number[],\n cx: number,\n cy: number,\n radius: number,\n angles: readonly number[],\n): Point[] {\n return fractions.map((f, i) => ({ x: polarX(cx, radius * f, angles[i]), y: polarY(cy, radius * f, angles[i]) }));\n}\n\n/** Closed outline through every point; `rounded` uses a closed Catmull–Rom spline. */\nexport function closedPath(points: readonly Point[], curve: 'linear' | 'rounded' = 'linear'): string {\n const n = points.length;\n\n if (n === 0) return '';\n\n const [first] = points;\n\n if (curve === 'linear' || n < 3) {\n return `M${first.x},${first.y}${points\n .slice(1)\n .map((p) => `L${p.x},${p.y}`)\n .join('')}Z`;\n }\n\n let d = `M${first.x},${first.y}`;\n\n for (let i = 0; i < n; i++) {\n const p0 = points[(i - 1 + n) % n];\n const p1 = points[i];\n const p2 = points[(i + 1) % n];\n const p3 = points[(i + 2) % n];\n\n d += `C${p1.x + (p2.x - p0.x) / 6},${p1.y + (p2.y - p0.y) / 6} ${p2.x - (p3.x - p1.x) / 6},${p2.y - (p3.y - p1.y) / 6} ${p2.x},${p2.y}`;\n }\n\n return `${d}Z`;\n}\n\nexport function ringPath(\n shape: 'circle' | 'polygon',\n cx: number,\n cy: number,\n r: number,\n angles: readonly number[],\n): string {\n if (r <= 0) return '';\n\n if (shape === 'circle') return `M${cx},${cy - r}A${r},${r} 0 1 1 ${cx},${cy + r}A${r},${r} 0 1 1 ${cx},${cy - r}Z`;\n\n return closedPath(\n radarPoints(\n angles.map(() => 1),\n cx,\n cy,\n r,\n angles,\n ),\n );\n}\n\nexport function labelPlacement(angle: number): { anchor: LabelAnchor; baseline: LabelBaseline } {\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n\n return {\n anchor: Math.abs(sin) < 0.1 ? 'middle' : sin > 0 ? 'start' : 'end',\n baseline: cos > 0.9 ? 'auto' : cos < -0.9 ? 'hanging' : 'middle',\n };\n}\n\n/** Largest radius that leaves room for the axis labels around it. */\nexport function fitRadius(\n width: number,\n height: number,\n labels: readonly string[],\n angles: readonly number[],\n fontSize: number,\n gap: number,\n): number {\n let side = 0;\n\n labels.forEach((label, i) => {\n if (labelPlacement(angles[i]).anchor !== 'middle') side = Math.max(side, estimateTextWidth(label, fontSize));\n });\n\n const lineHeight = fontSize * 1.3;\n\n return Math.max(8, Math.min(width / 2 - gap - side, height / 2 - gap - lineHeight));\n}\n\n/** Index of the axis closest in angle to the offset `(dx, dy)` from the centre. */\nexport function nearestAxis(dx: number, dy: number, count: number, startAngle = 0): number {\n if (count === 0) return -1;\n\n const step = TWO_PI / count;\n const angle = (((Math.atan2(dx, -dy) - startAngle) % TWO_PI) + TWO_PI) % TWO_PI;\n\n return Math.round(angle / step) % count;\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { estimateTextWidth as e } from "../../svg/text.js";
2
- import { linearScale as t } from "../../scales/linear.js";
3
- import { polarX as n, polarY as r } from "../../core/polar.js";
4
- //#region src/charts/radar/radar-geometry.ts
1
+ import { polarX as e, polarY as t } from "../../core/polar.js";
2
+ import { linearScale as n } from "../../scales/linear.js";
3
+ import { estimateTextWidth as r } from "../../svg/text.js";
4
+ // src/charts/radar/radar-geometry.ts
5
5
  var i = 2 * Math.PI;
6
6
  function toRadians(e) {
7
7
  return e * Math.PI / 180;
@@ -9,11 +9,11 @@ function toRadians(e) {
9
9
  function axisAngles(e, t = 0) {
10
10
  return Array.from({ length: e }, (n, r) => t + r * i / e);
11
11
  }
12
- function resolveAxisDomains(e, n, r) {
12
+ function resolveAxisDomains(e, t, r) {
13
13
  let i = r;
14
14
  if (!i) {
15
- let e = n.flatMap((e) => e.data.map((e) => e.value)).filter(Number.isFinite), r = Math.min(0, ...e), a = e.length ? Math.max(...e) : 1;
16
- i = t({
15
+ let e = t.flatMap((e) => e.data.map((e) => e.value)).filter(Number.isFinite), r = Math.min(0, ...e), a = e.length ? Math.max(...e) : 1;
16
+ i = n({
17
17
  domain: [r, a > r ? a : r + 1],
18
18
  range: [0, 1]
19
19
  }).domain;
@@ -23,10 +23,10 @@ function resolveAxisDomains(e, n, r) {
23
23
  function normalize(e, [t, n]) {
24
24
  return n === t ? 0 : Math.max(0, Math.min(1, (e - t) / (n - t)));
25
25
  }
26
- function radarPoints(e, t, i, a, o) {
27
- return e.map((e, s) => ({
28
- x: n(t, a * e, o[s]),
29
- y: r(i, a * e, o[s])
26
+ function radarPoints(n, r, i, a, o) {
27
+ return n.map((n, s) => ({
28
+ x: e(r, a * n, o[s]),
29
+ y: t(i, a * n, o[s])
30
30
  }));
31
31
  }
32
32
  function closedPath(e, t = "linear") {
@@ -51,20 +51,19 @@ function labelPlacement(e) {
51
51
  baseline: n > .9 ? "auto" : n < -.9 ? "hanging" : "middle"
52
52
  };
53
53
  }
54
- function fitRadius(t, n, r, i, a, o) {
54
+ function fitRadius(e, t, n, i, a, o) {
55
55
  let s = 0;
56
- r.forEach((t, n) => {
57
- labelPlacement(i[n]).anchor !== "middle" && (s = Math.max(s, e(t, a)));
56
+ n.forEach((e, t) => {
57
+ labelPlacement(i[t]).anchor !== "middle" && (s = Math.max(s, r(e, a)));
58
58
  });
59
59
  let c = a * 1.3;
60
- return Math.max(8, Math.min(t / 2 - o - s, n / 2 - o - c));
60
+ return Math.max(8, Math.min(e / 2 - o - s, t / 2 - o - c));
61
61
  }
62
62
  function nearestAxis(e, t, n, r = 0) {
63
63
  if (n === 0) return -1;
64
64
  let a = i / n, o = ((Math.atan2(e, -t) - r) % i + i) % i;
65
65
  return Math.round(o / a) % n;
66
66
  }
67
- //#endregion
68
67
  export { axisAngles, closedPath, fitRadius, labelPlacement, nearestAxis, normalize, radarPoints, resolveAxisDomains, ringPath, toRadians };
69
68
 
70
69
  //# sourceMappingURL=radar-geometry.js.map