@martinomagnifico/tablechart 1.0.7 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,61 +1,10 @@
1
- //#region src/js/config.ts
2
- var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablechart-bar", i = "tablechart-rule", a = "tablechart-line", o = "tablechart-head", s = "tablechart-slice", c = "tablechart-legend", l = "tablechart-hole", u = "tablechart-centre", d = "tablechart-break", f = "is-placed", p = "tablechart-sr", m = "is-shown", h = "is-printing", g = "tablechart-queued", _ = 1e3, v = {
3
- selector: "[data-chart]",
4
- aspect: .38,
5
- barfill: .58,
6
- ringfill: .42,
7
- animate: !0,
8
- entrance: .5,
9
- labels: "outside",
10
- shape: "straight",
11
- legend: !1,
12
- tooltip: "auto",
13
- tooltipparent: null,
14
- table: "never",
15
- totallabel: "Total",
16
- controls: !0,
17
- previouslabel: "Previous",
18
- nextlabel: "Next",
19
- stephint: "step of the chart",
20
- threshold: .5,
21
- replay: !1,
22
- langattribute: "data-i18n"
23
- }, y = "cubic-bezier(0.3, 0.3, 0.6, 1)", b = (e, t, n = 1) => ({
1
+ import { A as e, B as t, C as n, D as r, E as i, F as a, G as o, I as s, J as c, K as l, L as u, M as d, N as f, O as p, P as m, Q as h, R as g, S as _, T as v, U as y, V as b, W as x, X as S, Y as C, Z as w, _ as T, a as E, b as D, c as O, d as k, f as A, g as j, h as M, i as N, j as P, k as F, l as I, m as L, n as R, o as z, p as B, q as V, r as H, s as U, t as ee, u as te, v as ne, w as W, x as G, y as re, z as ie } from "./tablechart-shared2.mjs";
2
+ //#region src/js/functions/timing.ts
3
+ var K = "cubic-bezier(0.3, 0.3, 0.6, 1)", q = (e, t, n = 1) => ({
24
4
  start: e,
25
5
  span: t,
26
- easing: e + t >= n - 1e-4 ? y : "linear"
27
- }), x = (e, t) => `${e}:${t}`, S = "http://www.w3.org/2000/svg", C = (e) => Math.round(e * 100) / 100, w = (e, t = {}) => {
28
- let n = document.createElementNS(S, e);
29
- for (let e in t) {
30
- let r = t[e];
31
- n.setAttribute(e, String(typeof r == "number" ? C(r) : r));
32
- }
33
- return n;
34
- }, T = (e, t) => [e, ...t.classes].join(" "), E = (e, t) => {
35
- let n = document.createElement("span");
36
- return n.className = e, n.inert = !0, t.appendChild(n), n;
37
- }, D = (e, t, n, r, i) => {
38
- e.style.left = `${t / r * 100}%`, e.style.top = `${n / i * 100}%`;
39
- }, O = 0, k = (e, t, n, r) => {
40
- if (!t.length) return;
41
- let i = `tablechart-cut-${++O}`, a = w("mask", {
42
- id: i,
43
- maskUnits: "userSpaceOnUse"
44
- });
45
- a.appendChild(w("rect", {
46
- x: -n,
47
- y: -r,
48
- width: n * 3,
49
- height: r * 3,
50
- fill: "white"
51
- }));
52
- for (let e of t) e.setAttribute("fill", "black"), a.appendChild(e);
53
- let o = e.querySelector(":scope > defs");
54
- o || (o = w("defs"), e.prepend(o)), o.appendChild(a);
55
- let s = w("g", { mask: `url(#${i})` });
56
- for (let t of Array.from(e.childNodes)) t !== o && s.appendChild(t);
57
- e.appendChild(s);
58
- }, A = 0, j = (e) => Array.from(e.querySelectorAll(`.${r}`)).map((e) => {
6
+ easing: e + t >= n - 1e-4 ? K : "linear"
7
+ }), J = (e, t) => `${e}:${t}`, ae = 0, oe = (e) => Array.from(e.querySelectorAll(`.${G}`)).map((e) => {
59
8
  let t = e.tagName === "rect" ? [e] : Array.from(e.querySelectorAll("rect")), n = (e, t) => Number(e.getAttribute(t)), r = Math.min(...t.map((e) => n(e, "x"))), i = Math.min(...t.map((e) => n(e, "y"))), a = Math.max(...t.map((e) => n(e, "x") + n(e, "width"))), o = Math.max(...t.map((e) => n(e, "y") + n(e, "height"))), s = ["--start", "--span"].map((t) => e.style.getPropertyValue(t) && `${t}:${e.style.getPropertyValue(t)}`).filter(Boolean).join("; ");
60
9
  return {
61
10
  row: Number(e.dataset.row),
@@ -66,7 +15,7 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
66
15
  sideways: e.dataset.grow === "right",
67
16
  part: s
68
17
  };
69
- }), M = {
18
+ }), se = {
70
19
  create: () => null,
71
20
  draw(e, t, n) {
72
21
  let { rows: r, y: i, svg: a, breakAt: o } = n;
@@ -93,171 +42,255 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
93
42
  [c + 2 * l, t + o],
94
43
  [c + i, t - o]
95
44
  ];
96
- }, l = (e, t = !1) => e.map(([e, t], n) => `${n === 0 ? "M" : "L"} ${e.toFixed(1)} ${t.toFixed(1)}`).join(" ") + (t ? " Z" : ""), u = `tablechart-break-${++A}`, f = w("mask", {
45
+ }, l = (e, t = !1) => e.map(([e, t], n) => `${n === 0 ? "M" : "L"} ${e.toFixed(1)} ${t.toFixed(1)}`).join(" ") + (t ? " Z" : ""), u = `tablechart-break-${++ae}`, d = L("mask", {
97
46
  id: u,
98
47
  maskUnits: "userSpaceOnUse"
99
48
  });
100
- f.appendChild(w("rect", {
101
- x: -1e3,
49
+ d.appendChild(L("rect", {
50
+ x: -w,
102
51
  y: -n.height,
103
- width: _ * 3,
52
+ width: w * 3,
104
53
  height: n.height * 3,
105
54
  fill: "white"
106
55
  }));
107
- let p = [], m = i(o);
108
- for (let e of j(a)) {
109
- let t = e.sideways ? n.breakX : m;
110
- if (t === void 0 || !(e.sideways ? e.x < t && e.x + e.width > t : e.y < m && e.y + e.height > m)) continue;
111
- let [i, o] = e.sideways ? [c(e, t), c(e, t + n.breakGap)] : [c(e, m - n.breakGap), c(e, m)];
112
- f.appendChild(w("path", {
56
+ let f = [], p = i(o);
57
+ for (let e of oe(a)) {
58
+ let t = e.sideways ? n.breakX : p;
59
+ if (t === void 0 || !(e.sideways ? e.x < t && e.x + e.width > t : e.y < p && e.y + e.height > p)) continue;
60
+ let [i, o] = e.sideways ? [c(e, t), c(e, t + n.breakGap)] : [c(e, p - n.breakGap), c(e, p)];
61
+ d.appendChild(L("path", {
113
62
  d: l([...i, ...o.slice().reverse()], !0),
114
63
  fill: "black"
115
- })), p.push(i, o);
116
- let s = [x("--after", r[e.row - 1]?.slot ?? 0), e.part].filter(Boolean).join("; ");
117
- for (let e of [i, o]) a.appendChild(w("path", {
118
- class: d,
64
+ })), f.push(i, o);
65
+ let s = [J("--after", r[e.row - 1]?.slot ?? 0), e.part].filter(Boolean).join("; ");
66
+ for (let e of [i, o]) a.appendChild(L("path", {
67
+ class: _,
119
68
  "data-part": "edge",
120
69
  "data-note": n.note,
121
70
  d: l(e),
122
71
  style: s
123
72
  }));
124
73
  }
125
- if (!p.length) return;
126
- let h = Array.from(a.querySelectorAll(`.${d}`)), g = w("g", { mask: `url(#${u})` });
127
- for (let e of Array.from(a.childNodes)) h.includes(e) || g.appendChild(e);
128
- let v = w("defs");
129
- v.appendChild(f), a.prepend(v, g);
74
+ if (!f.length) return;
75
+ let m = Array.from(a.querySelectorAll(`.${_}`)), h = L("g", { mask: `url(#${u})` });
76
+ for (let e of Array.from(a.childNodes)) m.includes(e) || h.appendChild(e);
77
+ let g = L("defs");
78
+ g.appendChild(d), a.prepend(g, h);
130
79
  }
131
- }, N = (e) => {
132
- let t = -Infinity;
133
- for (let n of e) t = Math.max(t, n);
134
- return t;
135
- }, P = (e) => (e.split(/[.,]/)[1] || "").length, F = (e, t) => new Intl.NumberFormat(t || document.documentElement.lang || void 0, {
136
- minimumFractionDigits: e,
137
- maximumFractionDigits: e
138
- }), I = (e, t, n) => {
139
- let r = F(t, n).formatToParts(e), i = r[0]?.type === "minusSign" ? r[0].value : "";
140
- return [i, r.slice(+!!i).map((e) => e.value).join("")];
141
- }, L = (e) => Number.parseFloat((e.match(/-?[\d.,]+/) || ["NaN"])[0].replace(",", ".")), R = (e, t) => {
80
+ }, Y = (e, t) => {
142
81
  let n = document.createElement("span");
143
- if (n.className = "tablechart-badge", n.inert = !0, e.childElementCount > 0) for (let t of Array.from(e.children)) n.appendChild(t.cloneNode(!0));
82
+ if (n.className = D, n.inert = !0, e.childElementCount > 0) for (let t of Array.from(e.children)) n.appendChild(t.cloneNode(!0));
144
83
  else {
145
84
  n.textContent = (e.textContent || "").trim();
146
85
  let t = e.getAttribute("data-i18n");
147
86
  t && n.setAttribute("data-i18n", t);
148
87
  }
149
88
  return t.appendChild(n), n;
150
- }, z = (t, n, r, i) => {
151
- let a = L(t?.textContent || ""), o = Number.isNaN(a) ? !0 : Math.abs(n - a) <= .5, s = {
152
- label: r,
153
- computed: n,
154
- stated: a,
155
- agrees: o
89
+ }, ce = (e, t, n, r, i = "%") => {
90
+ let a = e?.textContent || "", o = O(a), s = i ? .5 : .5 * 10 ** -z(a.match(/-?[\d.,]+/)?.[0] ?? ""), c = Number.isNaN(o) ? !0 : Math.abs(t - o) <= s + 1e-9, l = {
91
+ label: n,
92
+ computed: t,
93
+ stated: o,
94
+ agrees: c
156
95
  };
157
- i.checks.push(s), o || console.warn(`[${e}] An annotation reads ${a}%, but ${r} is ${n.toFixed(1)}%. The chart shows your number.`);
158
- }, B = (e, t) => (t - e) / Math.abs(e) * 100, V = (e, t) => {
96
+ r.checks.push(l), c || console.warn(`[${f}] An annotation reads ${o}${i}, but ${n} is ${Number(t.toFixed(2))}${i}. The chart shows your number.`);
97
+ }, le = (e, t) => (t - e) / Math.abs(e) * 100, ue = (e, t) => {
159
98
  let n = (t, n) => {
160
99
  let r = Number.parseInt(e.getAttribute(t) ?? "", 10);
161
100
  return Number.isFinite(r) ? r - 1 : n;
162
101
  };
163
102
  return [n("data-from", 0), n("data-to", t - 1)];
164
- }, H = {
165
- create: R,
166
- draw(t, n, r) {
167
- let { rows: i, cx: s, y: c, unit: l, labelHeight: u, badgeHeight: d, height: f, svg: p, after: m } = r, [h, g] = V(t, i.length), v = i[h], y = i[g];
168
- if (!v || !y) {
169
- console.warn(`[${e}] A bracket points at a row that is not there (row ${h + 1} to ${g + 1}, of ${i.length}).`);
103
+ }, de = {
104
+ create: Y,
105
+ draw(e, t, n) {
106
+ let { rows: r, cx: i, y: a, unit: o, labelHeight: s, badgeHeight: c, height: l, svg: u, after: d } = n, [p, h] = ue(e, r.length), g = r[p], _ = r[h];
107
+ if (!g || !_) {
108
+ console.warn(`[${f}] A bracket points at a row that is not there (row ${p + 1} to ${h + 1}, of ${r.length}).`);
170
109
  return;
171
110
  }
172
- let b = 7 * l, S = 4 * l, C = s(h), T = s(g), E = Math.min(c(v.value), c(y.value)) - u - S - d * .9, O = (e) => c(e) - u - S, k = `M ${C} ${O(v.value)} L ${C} ${E} L ${T} ${E} L ${T} ${O(y.value) - b}`, A = (O(v.value) - E + Math.abs(T - C) + (O(y.value) - b - E)) / l + 1;
173
- p.appendChild(w("path", {
174
- class: a,
175
- "data-note": r.note,
176
- d: k,
177
- style: `--len:${A.toFixed(1)}; ${x("--after", m)}`
111
+ let v = 7 * o, y = 4 * o, b = i(p), x = i(h), S = Math.min(a(g.value), a(_.value)) - s - y - c * .9, C = (e) => a(e) - s - y, T = `M ${b} ${C(g.value)} L ${b} ${S} L ${x} ${S} L ${x} ${C(_.value) - v}`, E = (C(g.value) - S + Math.abs(x - b) + (C(_.value) - v - S)) / o + 1;
112
+ u.appendChild(L("path", {
113
+ class: m,
114
+ "data-note": n.note,
115
+ d: T,
116
+ style: `--len:${E.toFixed(1)}; ${J("--after", d)}`
178
117
  }));
179
- let j = O(y.value);
180
- p.appendChild(w("polygon", {
181
- class: o,
182
- "data-note": r.note,
183
- points: `${T},${j} ${T - b * .45},${j - b} ${T + b * .45},${j - b}`,
184
- style: x("--after", m)
185
- })), n && (D(n, (C + T) / 2, E, _, f), n.style.setProperty("--after", String(m))), z(n, B(v.value, y.value), `${v.value} to ${y.value}`, r);
118
+ let D = C(_.value);
119
+ u.appendChild(L("polygon", {
120
+ class: F,
121
+ "data-note": n.note,
122
+ points: `${x},${D} ${x - v * .45},${D - v} ${x + v * .45},${D - v}`,
123
+ style: J("--after", d)
124
+ })), t && (A(t, (b + x) / 2, S, w, l), t.style.setProperty("--after", String(d))), ce(t, le(g.value, _.value), `${g.value} to ${_.value}`, n);
186
125
  }
187
- }, U = /* @__PURE__ */ new WeakMap(), ee = (e) => {
188
- let t = [...e].filter((e) => !!e), n = t.map((e) => ({
189
- width: e.offsetWidth,
190
- height: e.offsetHeight
191
- }));
192
- t.forEach((e, t) => U.set(e, n[t]));
193
- }, W = (e) => U.get(e) ?? {
194
- width: e.offsetWidth,
195
- height: e.offsetHeight
196
- }, G = (e, t, n) => ((t / e) ** (1 / n) - 1) * 100, te = {
197
- create: R,
126
+ }, fe = (e, t, n) => {
127
+ let r = n.reduce((e, t) => e + t, 0);
128
+ if (e === "mean") return r ? t.reduce((e, t, r) => e + t * n[r], 0) / r : null;
129
+ if (e === "median") {
130
+ let e = t.map((e, t) => [e, n[t]]).sort((e, t) => e[0] - t[0]), i = 0;
131
+ for (let [t, [n, a]] of e.entries()) {
132
+ if (i += a, Math.abs(i - r / 2) < 1e-9 && e[t + 1]) return (n + e[t + 1][0]) / 2;
133
+ if (i > r / 2) return n;
134
+ }
135
+ return null;
136
+ }
137
+ let i = Number.parseFloat(e);
138
+ return Number.isFinite(i) ? i : null;
139
+ }, pe = {
140
+ create(e, t) {
141
+ if (!e.textContent?.trim()) return null;
142
+ let n = Y(e, t);
143
+ return n.dataset.kind = "reference", n;
144
+ },
145
+ draw(e, t, n) {
146
+ let { rows: r, cx: i, y: a, x: o, height: s, unit: c, svg: l, after: u } = n, d = r.filter((e) => !e.isTotal && !e.missing), p = e.hasAttribute("data-name"), m = (e.getAttribute(p ? "data-name" : "data-value") ?? "").trim(), h, g, _;
147
+ if (p) {
148
+ let e = d.map((e) => O(e.label));
149
+ if (n.categories[0]?.parentElement?.dataset.place === "beside" || e.some(Number.isNaN)) {
150
+ console.warn(`[${f}] A reference line among the names needs names that are numbers, under columns or points.`);
151
+ return;
152
+ }
153
+ let t = fe(m, e, d.map((e) => e.value)), a = t === null ? -1 : e.findIndex((n, r) => n <= t && t <= (e[r + 1] ?? n)), [o, s] = [d[a], d[a + 1] ?? d[a]].map((e) => i(r.indexOf(e))), c = t === null || a < 0 || e[a + 1] === void 0 || e[a + 1] === e[a] ? 0 : (t - e[a]) / (e[a + 1] - e[a]);
154
+ _ = t, g = a < 0 ? null : o + c * (s - o), h = !1;
155
+ } else _ = fe(m, d.map((e) => e.value), d.map(() => 1)), h = !o, g = _ === null ? null : o ? o(_) : a(_);
156
+ if (g === null || _ === null) {
157
+ console.warn(`[${f}] A reference line needs a number, "mean" or "median", not "${m}".`);
158
+ return;
159
+ }
160
+ let v = r.length > 0 ? i(r.length - 1) + i(0) : w, b = o ? s : a(0);
161
+ if (l.appendChild(L("line", {
162
+ class: y,
163
+ "data-note": n.note,
164
+ ...e.getAttribute("data-line") === "dotted" && { "data-line": "dotted" },
165
+ ...h ? {
166
+ x1: 0,
167
+ x2: v,
168
+ y1: g,
169
+ y2: g
170
+ } : {
171
+ x1: g,
172
+ x2: g,
173
+ y1: 0,
174
+ y2: b
175
+ },
176
+ style: J("--after", u)
177
+ })), t) {
178
+ let e = N(t).width * c, r = N(t).height * c, i = 4 * c, a = h ? [
179
+ [
180
+ v - e,
181
+ g - r / 2,
182
+ e,
183
+ r
184
+ ],
185
+ [
186
+ v - e,
187
+ g - r - i,
188
+ e,
189
+ r
190
+ ],
191
+ [
192
+ v - e,
193
+ g + i,
194
+ e,
195
+ r
196
+ ]
197
+ ] : [
198
+ 0,
199
+ r,
200
+ 2 * r
201
+ ].flatMap((t) => [
202
+ [
203
+ g - e / 2,
204
+ t,
205
+ e,
206
+ r
207
+ ],
208
+ [
209
+ g + i,
210
+ t,
211
+ e,
212
+ r
213
+ ],
214
+ [
215
+ g - i - e,
216
+ t,
217
+ e,
218
+ r
219
+ ]
220
+ ]), [o] = E([a], n.taken, [
221
+ 0,
222
+ 0,
223
+ w,
224
+ s
225
+ ]), l = a[o ?? 0];
226
+ n.taken.push(l), A(t, l[0] + e / 2, l[1] + r / 2, w, s), t.style.setProperty("--after", String(u)), (m === "mean" || m === "median") && ce(t, _, `the ${m}`, n, "");
227
+ }
228
+ }
229
+ }, me = (e, t, n) => ((t / e) ** (1 / n) - 1) * 100, he = {
230
+ create: Y,
198
231
  draw(e, t, n) {
199
- let { rows: r, cx: i, y: s, unit: c, labelHeight: l, height: u, svg: d, values: f, after: p } = n, m = r[0], h = r[r.length - 1];
200
- if (!m || !h) return;
201
- let g = l + 18 * c, v = 10 * c, y = 10 * c, b = i(0), S = s(m.value) - g, C = i(r.length - 1), T = s(h.value) - g, E = 0;
232
+ let { rows: r, cx: i, y: a, unit: o, labelHeight: s, height: c, svg: l, values: u, after: d } = n, f = r[0], p = r[r.length - 1];
233
+ if (!f || !p) return;
234
+ let h = s + 18 * o, g = 10 * o, _ = 10 * o, v = i(0), y = a(f.value) - h, b = i(r.length - 1), x = a(p.value) - h, S = 0;
202
235
  r.forEach((e, t) => {
203
- let n = C === b ? 0 : (i(t) - b) / (C - b), r = S + n * (T - S) - (s(e.value) - g);
204
- r > E && (E = r);
205
- }), S -= E, T -= E;
206
- let O = C - b, k = T - S, A = Math.hypot(O, k) || 1, j = O / A, M = k / A;
207
- b -= j * v, S -= M * v, C += j * v, T += M * v;
208
- let N = Number.parseFloat(e.getAttribute("data-at") || "0.5");
236
+ let n = b === v ? 0 : (i(t) - v) / (b - v), r = y + n * (x - y) - (a(e.value) - h);
237
+ r > S && (S = r);
238
+ }), y -= S, x -= S;
239
+ let C = b - v, T = x - y, E = Math.hypot(C, T) || 1, D = C / E, O = T / E;
240
+ v -= D * g, y -= O * g, b += D * g, x += O * g;
241
+ let k = Number.parseFloat(e.getAttribute("data-at") || "0.5");
209
242
  if (t) {
210
- let e = b + (C - b) * N, n = S + (T - S) * N, a = W(t).width * c / 2, o = n + W(t).height * c / 2 + 8 * c, u = 0;
243
+ let e = v + (b - v) * k, n = y + (x - y) * k, c = N(t).width * o / 2, l = n + N(t).height * o / 2 + 8 * o, d = 0;
211
244
  r.forEach((t, n) => {
212
- let r = (f[n] ? W(f[n]).width : 0) * c / 2;
213
- if (Math.abs(i(n) - e) >= a + r) return;
214
- let d = s(t.value) - 7 * c - l;
215
- u = Math.max(u, o - d);
216
- }), S -= u, T -= u;
245
+ let r = (u[n] ? N(u[n]).width : 0) * o / 2;
246
+ if (Math.abs(i(n) - e) >= c + r) return;
247
+ let f = a(t.value) - 7 * o - s;
248
+ d = Math.max(d, l - f);
249
+ }), y -= d, x -= d;
217
250
  }
218
- let P = C - j * y, F = T - M * y, I = Math.hypot(P - b, F - S) / c + 1;
219
- d.appendChild(w("line", {
220
- class: a,
251
+ let j = b - D * _, M = x - O * _, P = Math.hypot(j - v, M - y) / o + 1;
252
+ l.appendChild(L("line", {
253
+ class: m,
221
254
  "data-note": n.note,
222
- x1: b,
223
- y1: S,
224
- x2: P,
225
- y2: F,
226
- style: `--len:${I.toFixed(1)}; ${x("--after", p)}`
255
+ x1: v,
256
+ y1: y,
257
+ x2: j,
258
+ y2: M,
259
+ style: `--len:${P.toFixed(1)}; ${J("--after", d)}`
227
260
  }));
228
- let L = -M, R = j, B = y * .42;
229
- d.appendChild(w("polygon", {
230
- class: o,
261
+ let I = -O, R = D, z = _ * .42;
262
+ l.appendChild(L("polygon", {
263
+ class: F,
231
264
  "data-note": n.note,
232
265
  points: [
233
- `${C},${T}`,
234
- `${P + L * B},${F + R * B}`,
235
- `${P - L * B},${F - R * B}`
266
+ `${b},${x}`,
267
+ `${j + I * z},${M + R * z}`,
268
+ `${j - I * z},${M - R * z}`
236
269
  ].join(" "),
237
- style: x("--after", p)
238
- })), t && (D(t, b + (C - b) * N, S + (T - S) * N, _, u), t.style.setProperty("--after", String(p)));
239
- let V = Number.parseFloat(e.getAttribute("data-years") || "");
240
- !Number.isNaN(V) && V > 0 && z(t, G(m.value, h.value, V), `${m.value} to ${h.value} over ${V} years`, n);
270
+ style: J("--after", d)
271
+ })), t && (A(t, v + (b - v) * k, y + (x - y) * k, w, c), t.style.setProperty("--after", String(d)));
272
+ let B = Number.parseFloat(e.getAttribute("data-years") || "");
273
+ !Number.isNaN(B) && B > 0 && ce(t, me(f.value, p.value, B), `${f.value} to ${p.value} over ${B} years`, n);
241
274
  }
242
- }, ne = (e, t, n, r, i) => {
275
+ }, ge = (e, t, n, r, i) => {
243
276
  if (!r) return e / t * n;
244
277
  let { lo: a, hi: o, gap: s, share: c } = r, l = n * c, u = (n - l - i) / (a + (t - o)), d = l / (o - a);
245
278
  return e <= a ? e * u : e <= s ? a * u + (e - a) * d : e <= o ? a * u + (e - a) * d + i : a * u + l + i + (e - o) * u;
246
- }, re = (e, t, n) => {
279
+ }, _e = (e, t, n) => {
247
280
  let r = .15, i = Math.min(e * .7 / (t + (t - 1) * r), n), a = t * i + (t - 1) * i * r;
248
281
  return {
249
282
  size: i,
250
283
  gap: i * r,
251
284
  offset: (e) => -a / 2 + e * i * 1.15
252
285
  };
253
- }, ie = (e, t, n) => {
286
+ }, ve = (e, t, n) => {
254
287
  let r = e.series[n], i = e.series.some((e) => e.focus) && !r.focus;
255
288
  return {
256
289
  "data-series": n + 1,
257
290
  ...i && { "data-muted": "" },
258
- style: `--n:${n}; --m:${+!!i}; --palette:var(--tablechart-color-${n + 1}); ${x("--i", t.slot)}`
291
+ style: `--n:${n}; --m:${+!!i}; --palette:var(--tablechart-color-${n + 1}); ${J("--i", t.slot)}`
259
292
  };
260
- }, K = (e, t, n = !1) => {
293
+ }, ye = (e, t, n = !1) => {
261
294
  let r = 0, i = 0;
262
295
  return Array.from({ length: t }, (t, a) => {
263
296
  let o = e.cells[a] ?? e.cells[0], s = o.missing ? 0 : o.value;
@@ -284,40 +317,40 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
284
317
  cell: o
285
318
  };
286
319
  });
287
- }, q = (e, t, n = !1) => {
288
- let r = K(e, t, n);
320
+ }, be = (e, t, n = !1) => {
321
+ let r = ye(e, t, n);
289
322
  return {
290
323
  top: Math.max(0, ...r.map((e) => e.to)),
291
324
  bottom: Math.min(0, ...r.map((e) => e.to))
292
325
  };
293
- }, ae = (e, t) => {
294
- let { top: n, bottom: r } = q(e, t);
326
+ }, xe = (e, t) => {
327
+ let { top: n, bottom: r } = be(e, t);
295
328
  return n + r;
296
- }, oe = (e, t, n) => {
329
+ }, Se = (e, t, n) => {
297
330
  let r = t.series.some((e) => e.focus);
298
331
  e.style.setProperty("--n", String(n)), e.style.setProperty("--m", r && !t.series[n].focus ? "1" : "0"), e.style.setProperty("--palette", `var(--tablechart-color-${n + 1})`);
299
- }, se = (e, t, n, i = {}, a = "") => {
300
- let o = {
301
- class: T(r, t),
332
+ }, Ce = (e, t, n, r = {}, i = "") => {
333
+ let a = {
334
+ class: M(G, t),
302
335
  "data-kind": "bar",
303
336
  "data-row": n + 1,
304
- ...i
305
- }, s = x("--i", t.slot) + (a ? `; transform-origin: ${a}` : ""), c = w("g", {
306
- ...o,
337
+ ...r
338
+ }, o = J("--i", t.slot) + (i ? `; transform-origin: ${i}` : ""), s = L("g", {
339
+ ...a,
307
340
  "data-stack": "",
308
- style: s
341
+ style: o
309
342
  });
310
- return e.svg.appendChild(c), (r, a) => {
311
- let o = i["data-grow"] === void 0 ? {} : { "data-grow": i["data-grow"] };
312
- c.appendChild(w("rect", {
343
+ return e.svg.appendChild(s), (i, a) => {
344
+ let o = r["data-grow"] === void 0 ? {} : { "data-grow": r["data-grow"] };
345
+ s.appendChild(L("rect", {
313
346
  ...o,
314
347
  ...a,
315
- class: T("tablechart-piece", t),
348
+ class: M(u, t),
316
349
  "data-row": n + 1,
317
- ...ie(e, t, r)
350
+ ...ve(e, t, i)
318
351
  }));
319
352
  };
320
- }, ce = 6, le = (e, t, n) => e.some((e) => W(e).width * n > t - ce * n), J = (e, t, n) => t >= W(e).height * n * 1.6, ue = (e, t, n) => t >= W(e).width * n * 1.5, de = (e, t, n, r, i = .7) => {
353
+ }, we = 6, Te = (e, t, n) => e.some((e) => N(e).width * n > t - we * n), Ee = (e, t, n) => t >= N(e).height * n * 1.6, De = (e, t, n) => t >= N(e).width * n * 1.5, Oe = (e, t, n, r, i = .7) => {
321
354
  e.style.setProperty(r, "1");
322
355
  let a = 1;
323
356
  for (let e of t) {
@@ -326,10 +359,10 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
326
359
  }
327
360
  let o = a >= i ? a : 0;
328
361
  return e.style.setProperty(r, String(o || i)), o;
329
- }, fe = (e, t) => (e.sort((e, t) => e.y - t.y), e.forEach((n, r) => {
362
+ }, ke = (e, t) => (e.sort((e, t) => e.y - t.y), e.forEach((n, r) => {
330
363
  let i = e[r - 1];
331
364
  i && n.y < i.y + t && (n.y = i.y + t);
332
- }), e), pe = {
365
+ }), e), Ae = {
333
366
  segments: (e) => e.map((e) => ({
334
367
  ...e,
335
368
  from: 0,
@@ -349,45 +382,45 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
349
382
  categories: "beside",
350
383
  headroom: () => 0,
351
384
  draw(e) {
352
- let { segments: t, height: n, unit: a, svg: o, values: s, categories: c, config: l, barMax: u } = e, d = e.series.length > 1, f = Math.max(N(c.map((e) => W(e).width * a)), 0), p = Math.min(f + 10 * a, _ * .42);
353
- c[0]?.parentElement?.style.setProperty("--_beside", `${((p - 8 * a) / _ * 100).toFixed(2)}%`);
354
- let m = _ - 4 * a, h = e.stacked ? Math.max(N(e.rows.map((t) => q(t, e.series.length).top)), 0) || 1 : Math.max(N(e.rows.flatMap((t) => t.cells.slice(0, e.series.length).map((e) => Math.abs(e.value)))), 0) || 1, g = e.stacked ? Math.max(N(e.rows.map((t) => -q(t, e.series.length).bottom)), 0) : Math.max(N(e.rows.flatMap((t) => t.cells.slice(0, e.series.length).map((e) => -e.value))), 0), v = Math.max(h, e.squeeze?.hi ?? 0) + g, y = (t, n) => ne(Math.abs(t), v, n, e.squeeze, e.breakGap), b = n / t.length, S = (e) => (e + .5) * b, C = Math.min(b * l.barfill, u), E = re(b, e.series.length, u), O = s[0] ?? e.totals[0], k = O ? W(O).height * a * .56 : 0, A = Math.max(((d && !e.stacked ? E.size : C) - k) / 2, 5 * a), j = (e) => W(e).width * a, M = (e) => e.length ? N(e.map(j)) + A + 4 * a : 0, P = (t, n) => (e.rows[n].cells[t] ?? e.rows[n].cells[0]).value, F = e.seriesValues.flatMap((e, t) => e.map((e, n) => ({
385
+ let { segments: t, height: n, unit: r, svg: i, values: a, categories: o, config: s, barMax: c } = e, l = e.series.length > 1, u = Math.max(U(o.map((e) => N(e).width * r)), 0), d = Math.min(u + 10 * r, w * .42);
386
+ o[0]?.parentElement?.style.setProperty("--_beside", `${((d - 8 * r) / w * 100).toFixed(2)}%`);
387
+ let f = w - 4 * r, p = e.stacked ? Math.max(U(e.rows.map((t) => be(t, e.series.length).top)), 0) || 1 : Math.max(U(e.rows.flatMap((t) => t.cells.slice(0, e.series.length).map((e) => Math.abs(e.value)))), 0) || 1, m = e.stacked ? Math.max(U(e.rows.map((t) => -be(t, e.series.length).bottom)), 0) : Math.max(U(e.rows.flatMap((t) => t.cells.slice(0, e.series.length).map((e) => -e.value))), 0), h = Math.max(p, e.domain?.[1] ?? 0), g = Math.max(m, -(e.domain?.[0] ?? 0)), _ = Math.max(h, e.squeeze?.hi ?? 0) + g, v = (t, n) => ge(Math.abs(t), _, n, e.squeeze, e.breakGap), y = n / t.length, b = (e) => (e + .5) * y, S = Math.min(y * s.barfill, c), C = _e(y, e.series.length, c), T = a[0] ?? e.totals[0], E = T ? N(T).height * r * .56 : 0, D = Math.max(((l && !e.stacked ? C.size : S) - E) / 2, 5 * r), O = (e) => N(e).width * r, k = (e) => e.length ? U(e.map(O)) + D + 4 * r : 0, j = (t, n) => (e.rows[n].cells[t] ?? e.rows[n].cells[0]).value, P = e.seriesValues.flatMap((e, t) => e.map((e, n) => ({
355
388
  label: e,
356
- value: P(t, n)
357
- }))), I = (t) => {
358
- let n = q(e.rows[t], e.series.length);
389
+ value: j(t, n)
390
+ }))), F = (t) => {
391
+ let n = be(e.rows[t], e.series.length);
359
392
  return n.top === 0 && n.bottom < 0;
360
- }, L = e.stacked ? M(e.totals.filter((e, t) => !I(t))) : d ? M(F.filter((e) => e.value >= 0).map((e) => e.label)) : 0, R = e.stacked ? M(e.totals.filter((e, t) => I(t))) : d ? M(F.filter((e) => e.value < 0).map((e) => e.label)) : 0;
361
- if (!d && !e.stacked) for (let e = 0; e < 3; e++) {
362
- let e = m - p - L - R, n = t.map((e, t) => ({
393
+ }, I = e.stacked ? k(e.totals.filter((e, t) => !F(t))) : l ? k(P.filter((e) => e.value >= 0).map((e) => e.label)) : 0, R = e.stacked ? k(e.totals.filter((e, t) => F(t))) : l ? k(P.filter((e) => e.value < 0).map((e) => e.label)) : 0;
394
+ if (!l && !e.stacked) for (let e = 0; e < 3; e++) {
395
+ let e = f - d - I - R, n = t.map((e, t) => ({
363
396
  seg: e,
364
- label: s[t]
365
- })).filter(({ seg: t, label: n }) => !ue(n, y(t.value, e), a)), r = M(n.filter(({ seg: e }) => e.value >= 0).map(({ label: e }) => e)), i = M(n.filter(({ seg: e }) => e.value < 0).map(({ label: e }) => e));
366
- if (r <= L && i <= R) break;
367
- L = Math.max(L, r), R = Math.max(R, i);
397
+ label: a[t]
398
+ })).filter(({ seg: t, label: n }) => !De(n, v(t.value, e), r)), i = k(n.filter(({ seg: e }) => e.value >= 0).map(({ label: e }) => e)), o = k(n.filter(({ seg: e }) => e.value < 0).map(({ label: e }) => e));
399
+ if (i <= I && o <= R) break;
400
+ I = Math.max(I, i), R = Math.max(R, o);
368
401
  }
369
- let z = m - p - L - R, B = p + R + y(g, z), V = (e) => e < 0 ? B - y(e, z) : B + y(e, z);
370
- if (e.squeeze && (e.breakX = V(e.squeeze.gap)), e.stacked) {
371
- e.rows.forEach((t, r) => {
372
- let i = q(t, e.series.length), o = se(e, t, r, { "data-grow": "right" }, i.bottom < 0 ? `${B - V(i.bottom)}px center` : ""), s = S(r) - C / 2;
373
- K(t, e.series.length).forEach(({ from: t, to: i, cell: c }, l) => {
374
- let u = e.seriesValues[l][r];
375
- if (u.dataset.place = "none", c.missing || i === t) return;
376
- let d = Math.min(V(t), V(i)), f = Math.max(V(t), V(i));
377
- o(l, {
402
+ let z = f - d - I - R, B = d + R + v(g, z), V = (e) => e < 0 ? B - v(e, z) : B + v(e, z);
403
+ if (e.squeeze && (e.breakX = V(e.squeeze.gap)), e.x = V, e.stacked) {
404
+ e.rows.forEach((t, i) => {
405
+ let a = be(t, e.series.length), s = Ce(e, t, i, { "data-grow": "right" }, a.bottom < 0 ? `${B - V(a.bottom)}px center` : ""), c = b(i) - S / 2;
406
+ ye(t, e.series.length).forEach(({ from: t, to: a, cell: o }, l) => {
407
+ let u = e.seriesValues[l][i];
408
+ if (u.dataset.place = "none", o.missing || a === t) return;
409
+ let d = Math.min(V(t), V(a)), f = Math.max(V(t), V(a));
410
+ s(l, {
378
411
  x: d,
379
- y: s,
412
+ y: c,
380
413
  width: Math.max(f - d, 1),
381
- height: C,
382
- ...i < t && { "data-grow": "left" }
383
- }), u.dataset.place = "inside", u.toggleAttribute("data-left-out", !ue(u, f - d, a) || W(u).height * a > C), oe(u, e, l), D(u, (d + f) / 2, S(r), _, n);
414
+ height: S,
415
+ ...a < t && { "data-grow": "left" }
416
+ }), u.dataset.place = "inside", u.toggleAttribute("data-left-out", !De(u, f - d, r) || N(u).height * r > S), Se(u, e, l), A(u, (d + f) / 2, b(i), w, n);
384
417
  });
385
- let l = e.totals[r];
386
- l && (l.dataset.place = I(r) ? "before" : "after", D(l, I(r) ? V(i.bottom) - A : V(i.top) + A, S(r), _, n));
387
- let u = c[r];
388
- u && D(u, p - 8 * a, S(r), _, n);
389
- }), o.appendChild(w("line", {
390
- class: i,
418
+ let l = e.totals[i];
419
+ l && (l.dataset.place = F(i) ? "before" : "after", A(l, F(i) ? V(a.bottom) - D : V(a.top) + D, b(i), w, n));
420
+ let u = o[i];
421
+ u && A(u, d - 8 * r, b(i), w, n);
422
+ }), i.appendChild(L("line", {
423
+ class: x,
391
424
  x1: B,
392
425
  x2: B,
393
426
  y1: 0,
@@ -395,36 +428,36 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
395
428
  }));
396
429
  return;
397
430
  }
398
- if (d) {
431
+ if (l) {
399
432
  e.plot.dataset.grouped = "";
400
- let t = e.seriesValues.flat().filter((e) => e.dataset.missing === void 0), s = de(e.plot, t, (e) => ({
401
- size: W(e).height * a,
402
- room: E.size + E.gap * .5
433
+ let t = e.seriesValues.flat().filter((e) => e.dataset.missing === void 0), a = Oe(e.plot, t, (e) => ({
434
+ size: N(e).height * r,
435
+ room: C.size + C.gap * .5
403
436
  }), "--_fit");
404
- e.rows.forEach((t, i) => {
405
- e.series.forEach((a, c) => {
406
- let l = t.cells[c] ?? t.cells[0], u = e.seriesValues[c][i];
407
- if (l.missing) {
408
- u.dataset.place = "none";
437
+ e.rows.forEach((t, s) => {
438
+ e.series.forEach((r, o) => {
439
+ let c = t.cells[o] ?? t.cells[0], l = e.seriesValues[o][s];
440
+ if (c.missing) {
441
+ l.dataset.place = "none";
409
442
  return;
410
443
  }
411
- let d = V(l.value), f = l.value < 0, p = S(i) + E.offset(c);
412
- o.appendChild(w("rect", {
413
- class: T(r, t),
444
+ let u = V(c.value), d = c.value < 0, f = b(s) + C.offset(o);
445
+ i.appendChild(L("rect", {
446
+ class: M(G, t),
414
447
  "data-kind": "bar",
415
- "data-row": i + 1,
416
- "data-grow": f ? "left" : "right",
417
- x: Math.min(d, B),
418
- y: p,
419
- width: Math.max(Math.abs(d - B), 1),
420
- height: E.size,
421
- ...ie(e, t, c)
422
- })), u.dataset.place = f ? "before" : "after", u.toggleAttribute("data-left-out", !s), D(u, f ? d - A : d + A, p + E.size / 2, _, n);
448
+ "data-row": s + 1,
449
+ "data-grow": d ? "left" : "right",
450
+ x: Math.min(u, B),
451
+ y: f,
452
+ width: Math.max(Math.abs(u - B), 1),
453
+ height: C.size,
454
+ ...ve(e, t, o)
455
+ })), l.dataset.place = d ? "before" : "after", l.toggleAttribute("data-left-out", !a), A(l, d ? u - D : u + D, f + C.size / 2, w, n);
423
456
  });
424
- let l = c[i];
425
- l && D(l, p - 8 * a, S(i), _, n);
426
- }), o.appendChild(w("line", {
427
- class: i,
457
+ let c = o[s];
458
+ c && A(c, d - 8 * r, b(s), w, n);
459
+ }), i.appendChild(L("line", {
460
+ class: x,
428
461
  x1: B,
429
462
  x2: B,
430
463
  y1: 0,
@@ -432,33 +465,33 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
432
465
  }));
433
466
  return;
434
467
  }
435
- let H = t.map((e, t) => ue(s[t], Math.abs(V(e.value) - B), a));
436
- t.forEach((t, i) => {
437
- let l = V(t.value), u = S(i), d = t.value < 0, f = Math.abs(l - B);
438
- o.appendChild(w("rect", {
439
- class: T(r, t),
468
+ let H = t.map((e, t) => De(a[t], Math.abs(V(e.value) - B), r));
469
+ t.forEach((t, s) => {
470
+ let c = V(t.value), l = b(s), u = t.value < 0, f = Math.abs(c - B);
471
+ i.appendChild(L("rect", {
472
+ class: M(G, t),
440
473
  "data-kind": t.kind,
441
- "data-row": i + 1,
442
- "data-grow": d ? "left" : "right",
443
- x: Math.min(l, B),
444
- y: u - C / 2,
474
+ "data-row": s + 1,
475
+ "data-grow": u ? "left" : "right",
476
+ x: Math.min(c, B),
477
+ y: l - S / 2,
445
478
  width: Math.max(f, 1),
446
- height: C,
447
- style: x("--i", t.slot)
479
+ height: S,
480
+ style: J("--i", t.slot)
448
481
  }));
449
- let m = s[i], h = Math.max(Math.min(A, f - j(m) - 6 * a), 6 * a), g = d ? 1 : -1;
450
- m.dataset.place = H[i] ? "inside" : d ? "before" : "after", m.dataset.kind = t.kind, D(m, H[i] ? e.insideAlign === "center" ? (B + l) / 2 : e.insideAlign === "start" ? B - g * (h + j(m) / 2) : l + g * (h + j(m) / 2) : l - g * A, u, _, n);
451
- let v = c[i];
452
- v && D(v, p - 8 * a, u, _, n);
453
- }), o.appendChild(w("line", {
454
- class: i,
482
+ let p = a[s], m = Math.max(Math.min(D, f - O(p) - 6 * r), 6 * r), h = u ? 1 : -1;
483
+ p.dataset.place = H[s] ? "inside" : u ? "before" : "after", p.dataset.kind = t.kind, A(p, H[s] ? e.insideAlign === "center" ? (B + c) / 2 : e.insideAlign === "start" ? B - h * (m + O(p) / 2) : c + h * (m + O(p) / 2) : c - h * D, l, w, n);
484
+ let g = o[s];
485
+ g && A(g, d - 8 * r, l, w, n);
486
+ }), i.appendChild(L("line", {
487
+ class: x,
455
488
  x1: B,
456
489
  x2: B,
457
490
  y1: 0,
458
491
  y2: n
459
492
  }));
460
493
  }
461
- }, me = {
494
+ }, je = {
462
495
  segments: (e) => e.map((e) => ({
463
496
  ...e,
464
497
  from: 0,
@@ -472,102 +505,102 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
472
505
  breakable: !0,
473
506
  headroom: ({ labelHeight: e, badgeHeight: t, hasAnnotations: n, unit: r }) => e + 4 * r + (n ? t * 1.6 : 0),
474
507
  draw(e) {
475
- let { segments: t, cx: n, y: a, barWidth: o, height: s, unit: c, svg: l, values: u, labels: d, insideAlign: f } = e, p = a(0);
508
+ let { segments: t, cx: n, y: r, barWidth: i, height: a, unit: o, svg: s, values: c, labels: l, insideAlign: u } = e, d = r(0);
476
509
  if (e.stacked) {
477
- e.rows.forEach((t, r) => {
478
- let i = q(t, e.series.length), l = se(e, t, r, {}, i.bottom < 0 ? `center ${p - a(i.top)}px` : ""), u = n(r) - o / 2;
479
- K(t, e.series.length).forEach(({ from: t, to: i, cell: d }, f) => {
480
- let p = e.seriesValues[f][r];
481
- if (p.dataset.place = "none", d.missing || i === t) return;
482
- let m = Math.min(a(i), a(t)), h = Math.max(a(i), a(t));
510
+ e.rows.forEach((t, s) => {
511
+ let c = be(t, e.series.length), l = Ce(e, t, s, {}, c.bottom < 0 ? `center ${d - r(c.top)}px` : ""), u = n(s) - i / 2;
512
+ ye(t, e.series.length).forEach(({ from: t, to: c, cell: d }, f) => {
513
+ let p = e.seriesValues[f][s];
514
+ if (p.dataset.place = "none", d.missing || c === t) return;
515
+ let m = Math.min(r(c), r(t)), h = Math.max(r(c), r(t));
483
516
  l(f, {
484
517
  x: u,
485
518
  y: m,
486
- width: o,
519
+ width: i,
487
520
  height: Math.max(h - m, 1),
488
- ...i < t && { "data-grow": "down" }
489
- }), p.dataset.place = "inside", p.toggleAttribute("data-left-out", !J(p, h - m, c) || W(p).width * c > o - 4 * c), oe(p, e, f), D(p, n(r), (m + h) / 2, _, s);
521
+ ...c < t && { "data-grow": "down" }
522
+ }), p.dataset.place = "inside", p.toggleAttribute("data-left-out", !Ee(p, h - m, o) || N(p).width * o > i - 4 * o), Se(p, e, f), A(p, n(s), (m + h) / 2, w, a);
490
523
  });
491
- let d = e.totals[r];
492
- if (d) {
493
- let e = i.top === 0 && i.bottom < 0;
494
- d.dataset.place = e ? "below" : "outside", D(d, n(r), e ? a(i.bottom) + 4 * c : a(i.top) - 4 * c, _, s);
524
+ let f = e.totals[s];
525
+ if (f) {
526
+ let e = c.top === 0 && c.bottom < 0;
527
+ f.dataset.place = e ? "below" : "outside", A(f, n(s), e ? r(c.bottom) + 4 * o : r(c.top) - 4 * o, w, a);
495
528
  }
496
- }), l.appendChild(w("line", {
497
- class: i,
529
+ }), s.appendChild(L("line", {
530
+ class: x,
498
531
  x1: 0,
499
- x2: _,
500
- y1: p,
501
- y2: p
532
+ x2: w,
533
+ y1: d,
534
+ y2: d
502
535
  }));
503
536
  return;
504
537
  }
505
538
  if (e.series.length > 1) {
506
- let t = re(n(1) - n(0) || n(0) * 2, e.series.length, e.barMax);
539
+ let t = _e(n(1) - n(0) || n(0) * 2, e.series.length, e.barMax);
507
540
  e.plot.dataset.grouped = "";
508
- let o = e.seriesValues.flat().filter((e) => e.dataset.missing === void 0), u = de(e.plot, o, (e) => ({
509
- size: W(e).width * c,
541
+ let i = e.seriesValues.flat().filter((e) => e.dataset.missing === void 0), c = Oe(e.plot, i, (e) => ({
542
+ size: N(e).width * o,
510
543
  room: t.size + t.gap * .5
511
544
  }), "--_fit");
512
- e.rows.forEach((i, o) => {
513
- e.series.forEach((d, f) => {
514
- let m = i.cells[f] ?? i.cells[0], h = e.seriesValues[f][o], g = n(o) + t.offset(f);
515
- if (m.missing) {
516
- h.dataset.place = "none";
545
+ e.rows.forEach((i, l) => {
546
+ e.series.forEach((u, f) => {
547
+ let p = i.cells[f] ?? i.cells[0], m = e.seriesValues[f][l], h = n(l) + t.offset(f);
548
+ if (p.missing) {
549
+ m.dataset.place = "none";
517
550
  return;
518
551
  }
519
- let v = a(m.value), y = m.value < 0;
520
- l.appendChild(w("rect", {
521
- class: T(r, i),
552
+ let g = r(p.value), _ = p.value < 0;
553
+ s.appendChild(L("rect", {
554
+ class: M(G, i),
522
555
  "data-kind": "bar",
523
- "data-row": o + 1,
524
- ...y && { "data-grow": "down" },
525
- x: g,
526
- y: Math.min(v, p),
556
+ "data-row": l + 1,
557
+ ..._ && { "data-grow": "down" },
558
+ x: h,
559
+ y: Math.min(g, d),
527
560
  width: t.size,
528
- height: Math.max(Math.abs(p - v), 1),
529
- ...ie(e, i, f)
530
- })), h.dataset.place = y ? "below" : "outside", h.toggleAttribute("data-left-out", !u), D(h, g + t.size / 2, y ? v + 4 * c : v - 4 * c, _, s);
561
+ height: Math.max(Math.abs(d - g), 1),
562
+ ...ve(e, i, f)
563
+ })), m.dataset.place = _ ? "below" : "outside", m.toggleAttribute("data-left-out", !c), A(m, h + t.size / 2, _ ? g + 4 * o : g - 4 * o, w, a);
531
564
  });
532
- }), l.appendChild(w("line", {
533
- class: i,
565
+ }), s.appendChild(L("line", {
566
+ class: x,
534
567
  x1: 0,
535
- x2: _,
536
- y1: p,
537
- y2: p
568
+ x2: w,
569
+ y1: d,
570
+ y2: d
538
571
  }));
539
572
  return;
540
573
  }
541
- let m = le(u, o, c), h = t.map((e, t) => d === "inside" && !m && !e.missing && J(u[t], Math.abs(p - a(e.value)), c)), g = u[0] ? W(u[0]).height * c * .56 : 0, v = Infinity;
542
- for (let [e, t] of u.entries()) h[e] && (v = Math.min(v, (o - W(t).width * c) / 2));
574
+ let f = Te(c, i, o), p = t.map((e, t) => l === "inside" && !f && !e.missing && Ee(c[t], Math.abs(d - r(e.value)), o)), m = c[0] ? N(c[0]).height * o * .56 : 0, h = Infinity;
575
+ for (let [e, t] of c.entries()) p[e] && (h = Math.min(h, (i - N(t).width * o) / 2));
543
576
  t.forEach((e, t) => {
544
- let i = a(e.value), d = e.value < 0;
577
+ let l = r(e.value), f = e.value < 0;
545
578
  if (e.missing) {
546
- D(u[t], n(t), p - 4 * c, _, s), u[t].dataset.place = "outside";
579
+ A(c[t], n(t), d - 4 * o, w, a), c[t].dataset.place = "outside";
547
580
  return;
548
581
  }
549
- l.appendChild(w("rect", {
550
- class: T(r, e),
582
+ s.appendChild(L("rect", {
583
+ class: M(G, e),
551
584
  "data-kind": e.kind,
552
585
  "data-row": t + 1,
553
- ...d && { "data-grow": "down" },
554
- x: n(t) - o / 2,
555
- y: Math.min(i, p),
556
- width: o,
557
- height: Math.max(Math.abs(p - i), 1),
558
- style: x("--i", e.slot)
586
+ ...f && { "data-grow": "down" },
587
+ x: n(t) - i / 2,
588
+ y: Math.min(l, d),
589
+ width: i,
590
+ height: Math.max(Math.abs(d - l), 1),
591
+ style: J("--i", e.slot)
559
592
  }));
560
- let m = d ? -1 : 1, y = Math.min(v, (Math.abs(p - i) - g) / 2), b = f === "center" ? (i + p) / 2 : f === "start" ? p - m * (y + g / 2) : i + m * (y + g / 2), S = d ? i + 4 * c : i - 4 * c;
561
- D(u[t], n(t), h[t] ? b : S, _, s), u[t].dataset.place = h[t] ? "inside" : d ? "below" : "outside";
562
- }), l.appendChild(w("line", {
563
- class: i,
593
+ let g = f ? -1 : 1, _ = Math.min(h, (Math.abs(d - l) - m) / 2), v = u === "center" ? (l + d) / 2 : u === "start" ? d - g * (_ + m / 2) : l + g * (_ + m / 2), y = f ? l + 4 * o : l - 4 * o;
594
+ A(c[t], n(t), p[t] ? v : y, w, a), c[t].dataset.place = p[t] ? "inside" : f ? "below" : "outside";
595
+ }), s.appendChild(L("line", {
596
+ class: x,
564
597
  x1: 0,
565
- x2: _,
566
- y1: p,
567
- y2: p
598
+ x2: w,
599
+ y1: d,
600
+ y2: d
568
601
  }));
569
602
  }
570
- }, he = 0, ge = (e) => e.filter((e) => !e.isTotal), _e = {
603
+ }, Me = 0, Ne = (e) => e.filter((e) => !e.isTotal), Pe = {
571
604
  aspect: .66,
572
605
  centre: !0,
573
606
  headroom: () => 0,
@@ -577,104 +610,70 @@ var e = "tablechart", t = "tablechart-plot", n = "tablechart-value", r = "tablec
577
610
  to: e.value,
578
611
  kind: "bar"
579
612
  })),
580
- draw({ rows: e, height: t, unit: n, labelHeight: r, svg: i, values: a, config: o, centre: c }) {
581
- let l = t / 2, u = ge(e).reduce((e, t) => e + Math.abs(t.value), 0);
582
- if (!u) return;
583
- let d = r * 1.2 + 10 * n, f = Math.max(Math.min(_, t) / 2 - d, 10), p = f * o.ringfill, m = f - p / 2, h = 2 * Math.PI * m, g = [], v = 0, y = 0, S = 0;
584
- if (e.forEach((e, o) => {
585
- let c = a[o];
613
+ draw({ rows: e, height: t, unit: n, labelHeight: i, svg: a, values: o, config: s, centre: c }) {
614
+ let l = w / 2, u = t / 2, d = Ne(e).reduce((e, t) => e + Math.abs(t.value), 0);
615
+ if (!d) return;
616
+ let f = i * 1.2 + 10 * n, p = Math.max(Math.min(w, t) / 2 - f, 10), m = p * s.ringfill, h = p - m / 2, g = 2 * Math.PI * h, _ = [], v = 0, y = 0, b = 0;
617
+ if (e.forEach((e, r) => {
618
+ let s = o[r];
586
619
  if (e.isTotal) {
587
- c.dataset.place = "none";
620
+ s.dataset.place = "none";
588
621
  return;
589
622
  }
590
- let d = Math.abs(e.value) / u, C = b(S, d), E = `--share:${d.toFixed(4)}; --start:${C.start.toFixed(4)}; --span:${C.span.toFixed(4)};`, O = d * h, k = v / h * 2 * Math.PI - Math.PI / 2;
591
- g.push(k), i.appendChild(w("circle", {
592
- class: T(s, e),
623
+ let c = Math.abs(e.value) / d, f = q(b, c), x = `--share:${c.toFixed(4)}; --start:${f.start.toFixed(4)}; --span:${f.span.toFixed(4)};`, S = c * g, C = v / g * 2 * Math.PI - Math.PI / 2;
624
+ _.push(C), a.appendChild(L("circle", {
625
+ class: M(V, e),
593
626
  "data-slice": y + 1,
594
- "data-row": o + 1,
595
- cx: 500,
596
- cy: l,
597
- r: m,
598
- "stroke-width": p,
599
- transform: `rotate(-90 500 ${l})`,
600
- "stroke-dasharray": `${O.toFixed(1)} ${(h - O).toFixed(1)}`,
627
+ "data-row": r + 1,
628
+ cx: l,
629
+ cy: u,
630
+ r: h,
631
+ "stroke-width": m,
632
+ transform: `rotate(-90 ${l} ${u})`,
633
+ "stroke-dasharray": `${S.toFixed(1)} ${(g - S).toFixed(1)}`,
601
634
  "stroke-dashoffset": (-v).toFixed(1),
602
- style: `--n:${y}; --palette:var(--tablechart-color-${y + 1}); --arc:${O.toFixed(1)}; --circ:${h.toFixed(1)}; ${E} --ease:${C.easing}; ${x("--i", e.slot)}`
635
+ style: `--n:${y}; --palette:var(--tablechart-color-${y + 1}); --arc:${S.toFixed(1)}; --circ:${g.toFixed(1)}; ${x} --ease:${f.easing}; ${J("--i", e.slot)}`
603
636
  }));
604
- let A = k + O / h * Math.PI, j = Math.cos(A), M = Math.sin(A);
605
- i.appendChild(w("line", {
606
- class: "tablechart-leader",
607
- x1: 500 + j * (f + 2 * n),
608
- y1: l + M * (f + 2 * n),
609
- x2: 500 + j * (f + 7 * n),
610
- y2: l + M * (f + 7 * n),
611
- "data-row": o + 1,
612
- style: `${E} ${x("--i", e.slot)}`
613
- })), c.style.setProperty("--start", C.start.toFixed(4)), c.style.setProperty("--span", C.span.toFixed(4));
614
- let N = f + 9 * n, P = W(c).width * n / 2;
615
- D(c, 500 + j * (N + Math.abs(j) * P), l + M * (N + Math.abs(M) * r * .7), _, t), c.dataset.place = "around", v += O, S += d, y += 1;
616
- }), g.length > 1) {
617
- let e = m - p / 2 - 1, n = m + p / 2 + 1, r = `tablechart-slices-${++he}`, a = w("mask", {
618
- id: r,
637
+ let T = C + S / g * Math.PI, E = Math.cos(T), D = Math.sin(T);
638
+ a.appendChild(L("line", {
639
+ class: P,
640
+ x1: l + E * (p + 2 * n),
641
+ y1: u + D * (p + 2 * n),
642
+ x2: l + E * (p + 7 * n),
643
+ y2: u + D * (p + 7 * n),
644
+ "data-row": r + 1,
645
+ style: `${x} ${J("--i", e.slot)}`
646
+ })), s.style.setProperty("--start", f.start.toFixed(4)), s.style.setProperty("--span", f.span.toFixed(4));
647
+ let O = p + 9 * n, k = N(s).width * n / 2;
648
+ A(s, l + E * (O + Math.abs(E) * k), u + D * (O + Math.abs(D) * i * .7), w, t), s.dataset.place = "around", v += S, b += c, y += 1;
649
+ }), _.length > 1) {
650
+ let e = h - m / 2 - 1, n = h + m / 2 + 1, i = `tablechart-slices-${++Me}`, o = L("mask", {
651
+ id: i,
619
652
  maskUnits: "userSpaceOnUse"
620
653
  });
621
- a.appendChild(w("rect", {
654
+ o.appendChild(L("rect", {
622
655
  x: 0,
623
656
  y: 0,
624
- width: _,
657
+ width: w,
625
658
  height: t,
626
659
  fill: "white"
627
660
  }));
628
- for (let t of g) a.appendChild(w("line", {
629
- class: "tablechart-divide",
630
- x1: 500 + Math.cos(t) * e,
631
- y1: l + Math.sin(t) * e,
632
- x2: 500 + Math.cos(t) * n,
633
- y2: l + Math.sin(t) * n
661
+ for (let t of _) o.appendChild(L("line", {
662
+ class: r,
663
+ x1: l + Math.cos(t) * e,
664
+ y1: u + Math.sin(t) * e,
665
+ x2: l + Math.cos(t) * n,
666
+ y2: u + Math.sin(t) * n
634
667
  }));
635
- let o = w("g", { mask: `url(#${r})` });
636
- for (let e of Array.from(i.querySelectorAll(`.${s}`))) o.appendChild(e);
637
- let c = w("defs");
638
- c.appendChild(a), i.prepend(c, o);
668
+ let s = L("g", { mask: `url(#${i})` });
669
+ for (let e of Array.from(a.querySelectorAll(`.${V}`))) s.appendChild(e);
670
+ let c = L("defs");
671
+ c.appendChild(o), a.prepend(c, s);
639
672
  }
640
- c && D(c, 500, l, _, t);
641
- }
642
- }, ve = [
643
- "circle",
644
- "square",
645
- "diamond"
646
- ], ye = (e, t) => {
647
- let n = e[t]?.marker?.toLowerCase().split(/\s+/) ?? [], r = ve.find((e) => n.includes(e));
648
- return {
649
- shape: r ?? ve[Math.floor(t / 2) % ve.length],
650
- open: n.includes("open") || !n.includes("filled") && !r && t % 2 == 1
651
- };
652
- }, be = (e, t, n, r, i = {}) => {
653
- if (e === "square") {
654
- let e = r * .88;
655
- return w("rect", {
656
- x: t - e,
657
- y: n - e,
658
- width: e * 2,
659
- height: e * 2,
660
- ...i
661
- });
662
- }
663
- if (e === "diamond") {
664
- let e = r * 1.2;
665
- return w("polygon", {
666
- points: `${t},${n - e} ${t + e},${n} ${t},${n + e} ${t - e},${n}`,
667
- ...i
668
- });
673
+ c && A(c, l, u, w, t);
669
674
  }
670
- return w("circle", {
671
- cx: t,
672
- cy: n,
673
- r,
674
- ...i
675
- });
676
- }, Y = (e) => Number(e.toFixed(2));
677
- function xe(e, t) {
675
+ }, X = (e) => Number(e.toFixed(2));
676
+ function Fe(e, t) {
678
677
  let n = e.length;
679
678
  if (n < 2) return e.map(() => 0);
680
679
  let r = (n) => (t[n + 1] - t[n]) / (e[n + 1] - e[n] || 1), i = Array(n).fill(0);
@@ -691,17 +690,17 @@ function xe(e, t) {
691
690
  };
692
691
  return i[0] = a(0, 1, i[1]), i[n - 1] = a(n - 2, n - 1, i[n - 2]), i;
693
692
  }
694
- function Se(e, t, n, r) {
693
+ function Ie(e, t, n, r) {
695
694
  let i = (t[0] - e[0]) / 3;
696
695
  return [[e[0] + i, e[1] + n * i], [t[0] - i, t[1] - r * i]];
697
696
  }
698
- function Ce(e, t, n, r) {
699
- let [i, a] = Se(e, t, n, r), o = ([e, t]) => `${Y(e)},${Y(t)}`;
697
+ function Le(e, t, n, r) {
698
+ let [i, a] = Ie(e, t, n, r), o = ([e, t]) => `${X(e)},${X(t)}`;
700
699
  return `C${o(i)} ${o(a)} ${o(t)}`;
701
700
  }
702
- function we(e, t, n) {
701
+ function Re(e, t, n) {
703
702
  let r = Array(e).fill(0), i = [], a = () => {
704
- xe(i.map((e) => n(e)[0]), i.map((e) => n(e)[1])).forEach((e, t) => {
703
+ Fe(i.map((e) => n(e)[0]), i.map((e) => n(e)[1])).forEach((e, t) => {
705
704
  r[i[t]] = e;
706
705
  }), i = [];
707
706
  };
@@ -710,23 +709,23 @@ function we(e, t, n) {
710
709
  }
711
710
  //#endregion
712
711
  //#region src/js/charts/line.ts
713
- var Te = (e) => e.map((e) => ({
712
+ var ze = (e) => e.map((e) => ({
714
713
  ...e,
715
714
  from: 0,
716
715
  to: e.value,
717
716
  kind: "bar"
718
- })), Ee = (e) => ({
719
- segments: Te,
717
+ })), Be = (n) => ({
718
+ segments: ze,
720
719
  series: !0,
721
720
  stackable: !0,
722
721
  running: !0,
723
- swatch: e ? "box" : void 0,
722
+ swatch: n ? "box" : void 0,
724
723
  headroom: ({ labelHeight: e, unit: t }) => e * 1.6 + 6 * t,
725
- footroom: ({ labelHeight: t, unit: n, series: r, focused: i, stacked: a }) => !e && !a && r === 2 && !i ? t + 7 * n : 0,
726
- draw(t) {
727
- let { rows: n, series: r, seriesValues: a, names: o, cx: s, y: c, height: u, unit: d, labelHeight: f, svg: p, stacked: m } = t, h = t.shape === "step", g = t.shape === "smooth", v = r.length > 1, y = r.some((e) => e.focus), b = n.length - 1, x = c(0), S = n.length > 1 ? s(1) - s(0) : s(0) * 2;
728
- p.style.setProperty("--_base", `${Y(x)}px`);
729
- let C = (e) => `--rise:${Y(x - e)}px; `, T = (e, t) => n[t]?.cells[e] ?? n[t]?.cells[0], E = (e, t) => !T(e, t) || !!T(e, t)?.missing, O = n.map((e) => m ? K(e, r.length, !0) : null), A = (e, t) => O[t]?.[e].to ?? T(e, t)?.value ?? 0, j = (e, t) => O[t]?.[e].from ?? 0, M = (e, t) => [s(t), c(A(e, t))], N = r.map((e, t) => {
724
+ footroom: ({ labelHeight: e, unit: t, series: r, focused: i, stacked: a }) => !n && !a && r === 2 && !i ? e + 7 * t : 0,
725
+ draw(r) {
726
+ let { rows: i, series: a, seriesValues: s, names: c, cx: l, y: u, height: d, unit: f, labelHeight: p, svg: m, stacked: h } = r, g = r.shape === "step", _ = r.shape === "smooth", v = a.length > 1, y = a.some((e) => e.focus), b = i.length - 1, S = u(0), C = i.length > 1 ? l(1) - l(0) : l(0) * 2;
727
+ m.style.setProperty("--_base", `${X(S)}px`);
728
+ let D = (e) => `--rise:${X(S - e)}px; `, O = (e, t) => i[t]?.cells[e] ?? i[t]?.cells[0], k = (e, t) => !O(e, t) || !!O(e, t)?.missing, M = i.map((e) => h ? ye(e, a.length, !0) : null), P = (e, t) => M[t]?.[e].to ?? O(e, t)?.value ?? 0, F = (e, t) => M[t]?.[e].from ?? 0, I = (e, t) => [l(t), u(P(e, t))], z = a.map((e, t) => {
730
729
  if (!v) return {
731
730
  attrs: {},
732
731
  ink: ""
@@ -739,146 +738,177 @@ var Te = (e) => e.map((e) => ({
739
738
  },
740
739
  ink: `--n:${t}; --m:${+!!n}; --palette:var(--tablechart-color-${t + 1}); `
741
740
  };
742
- }), P = Math.min(b, 6);
743
- t.plot.style.setProperty("--count", String(P + 1));
744
- let F = b > 0 ? P / (h ? n.length : b) : 1, I = (e) => e * F, L = (e) => `--i:${Y(I(e))}`, R = (e) => {
745
- let t = [], r = -1;
746
- return n.forEach((n, i) => {
747
- E(e, i) || (r < 0 && (r = i), (i === b || E(e, i + 1)) && ((h || i > r) && t.push([r, i]), r = -1));
741
+ }), B = Math.min(b, 6);
742
+ r.plot.style.setProperty("--count", String(B + 1));
743
+ let V = b > 0 ? B / (g ? i.length : b) : 1, H = (e) => e * V, U = (e) => `--i:${X(H(e))}`, ne = (e) => {
744
+ let t = [], n = -1;
745
+ return i.forEach((r, i) => {
746
+ k(e, i) || (n < 0 && (n = i), (i === b || k(e, i + 1)) && ((g || i > n) && t.push([n, i]), n = -1));
748
747
  }), t;
749
- }, z = (e, t) => `--i:${Y(I(e) + 1)}; --d:${Y(I(h ? t + 1 : t) - I(e))}`, B = (e, t) => ({
748
+ }, W = (e, t) => `--i:${X(H(e) + 1)}; --d:${X(H(g ? t + 1 : t) - H(e))}`, G = (e, t) => ({
750
749
  "data-from": e + 1,
751
750
  "data-to": t + 1,
752
- ...h && { "data-flat": "" }
753
- }), V = g ? r.map((e, t) => we(n.length, (e) => E(t, e), (e) => M(t, e))) : [], H = g && e ? r.map((e, t) => we(n.length, (e) => E(t, e), (e) => [s(e), c(j(t, e))])) : [], U = (e, t, n) => {
751
+ ...g && { "data-flat": "" }
752
+ }), re = _ ? a.map((e, t) => Re(i.length, (e) => k(t, e), (e) => I(t, e))) : [], ie = _ && n ? a.map((e, t) => Re(i.length, (e) => k(t, e), (e) => [l(e), u(F(t, e))])) : [], K = (e, t, n) => {
754
753
  let r = [];
755
754
  return e.forEach(([i, a], o) => {
756
- h ? (r.push(`H${Y(i + n * S / 2)}`), o < e.length - 1 && r.push(`V${Y(e[o + 1][1])}`)) : o > 0 && r.push(t ? Ce(e[o - 1], [i, a], t[o - 1], t[o]) : `L${Y(i)},${Y(a)}`);
755
+ g ? (r.push(`H${X(i + n * C / 2)}`), o < e.length - 1 && r.push(`V${X(e[o + 1][1])}`)) : o > 0 && r.push(t ? Le(e[o - 1], [i, a], t[o - 1], t[o]) : `L${X(i)},${X(a)}`);
757
756
  }), r;
758
- }, ee = (e, t, r, i) => n.slice(t, r + 1).map((n, r) => [s(t + r), c(i(e, t + r))]), G = (e, t, n, r) => g ? e[t].slice(n, r + 1) : null, te = (e) => s(e) - (h ? S / 2 : 0), ne = (e) => s(e) + (h ? S / 2 : 0), re = (e) => {
759
- let t = w("g", {
760
- class: "tablechart-area",
761
- ...N[e].attrs,
762
- ...m && { "data-stacked": "" },
763
- style: N[e].ink
764
- }), n = R(e), r = w("g", {
765
- class: "tablechart-area-fill",
766
- style: `--rows:${Y(P + 1)}; ${n.length ? z(...n[0]) : ""}`
757
+ }, q = (e, t, n, r) => i.slice(t, n + 1).map((n, i) => [l(t + i), u(r(e, t + i))]), J = (e, t, n, r) => _ ? e[t].slice(n, r + 1) : null, ae = (e) => l(e) - (g ? C / 2 : 0), oe = (e) => l(e) + (g ? C / 2 : 0), se = (e) => {
758
+ let t = L("g", {
759
+ class: j,
760
+ ...z[e].attrs,
761
+ ...h && { "data-stacked": "" },
762
+ style: z[e].ink
763
+ }), n = ne(e), r = L("g", {
764
+ class: T,
765
+ style: `--rows:${X(B + 1)}; ${n.length ? W(...n[0]) : ""}`
767
766
  });
768
767
  t.appendChild(r);
769
768
  for (let [t, i] of n) {
770
- let n = ee(e, t, i, A), a = ee(e, t, i, j), o = G(H, e, t, i)?.reverse() ?? null, s = [
771
- `M${Y(te(t))},${Y(a[0][1])}`,
772
- `L${Y(te(t))},${Y(n[0][1])}`,
773
- ...U(n, G(V, e, t, i), 1),
774
- `L${Y(ne(i))},${Y(a[a.length - 1][1])}`,
775
- ...U(a.reverse(), o, -1),
769
+ let n = q(e, t, i, P), a = q(e, t, i, F), o = J(ie, e, t, i)?.reverse() ?? null, s = [
770
+ `M${X(ae(t))},${X(a[0][1])}`,
771
+ `L${X(ae(t))},${X(n[0][1])}`,
772
+ ...K(n, J(re, e, t, i), 1),
773
+ `L${X(oe(i))},${X(a[a.length - 1][1])}`,
774
+ ...K(a.reverse(), o, -1),
776
775
  "Z"
777
776
  ].join(" ");
778
- r.appendChild(w("path", {
777
+ r.appendChild(L("path", {
779
778
  d: s,
780
- ...B(t, i),
781
- style: z(t, i)
779
+ ...G(t, i),
780
+ style: W(t, i)
782
781
  }));
783
782
  }
784
- p.appendChild(t);
785
- }, ie = (e) => {
786
- let t = r[e];
787
- for (let [n, r] of R(e)) {
788
- let i = ee(e, n, r, A), a = [`M${Y(te(n))},${Y(i[0][1])}`, ...U(i, G(V, e, n, r), 1)].join(" ");
789
- p.appendChild(w("path", {
790
- class: "tablechart-series",
791
- ...N[e].attrs,
783
+ m.appendChild(t);
784
+ }, Y = (e) => {
785
+ let t = a[e];
786
+ for (let [n, r] of ne(e)) {
787
+ let i = q(e, n, r, P), a = [`M${X(ae(n))},${X(i[0][1])}`, ...K(i, J(re, e, n, r), 1)].join(" ");
788
+ m.appendChild(L("path", {
789
+ class: o,
790
+ ...z[e].attrs,
792
791
  d: a,
793
792
  ...t.line && { "data-line": t.line },
794
- ...B(n, r),
795
- style: `${N[e].ink}${z(n, r)}`
793
+ ...G(n, r),
794
+ style: `${z[e].ink}${W(n, r)}`
796
795
  }));
797
796
  }
798
797
  };
799
- e && r.forEach((e, t) => re(t)), r.forEach((e, t) => ie(t)), h || (() => {
800
- let e = r.map((e, t) => v ? ye(r, t) : {
798
+ n && a.forEach((e, t) => se(t)), a.forEach((e, t) => Y(t)), g || (() => {
799
+ let n = a.map((e, t) => v ? R(a, t) : {
801
800
  shape: "circle",
802
801
  open: !1
803
- }), t = (t, n, r) => {
804
- let [i, a] = M(t, n);
805
- return be(e[t].shape, i, a, 4 * d, {
802
+ }), r = (e, t, r) => {
803
+ let [i, a] = I(e, t);
804
+ return ee(n[e].shape, i, a, 4 * f, {
806
805
  ...r,
807
- style: `${r.style ?? ""}${C(a)}${L(n)}`
806
+ style: `${r.style ?? ""}${D(a)}${U(t)}`
808
807
  });
809
- }, i = (e) => n.map((e, t) => t).filter((t) => !E(e, t)), a = r.flatMap((n, r) => e[r].open ? i(r).map((e) => t(r, e, {
810
- class: l,
811
- "data-row": e + 1,
812
- ...v && { "data-series": r + 1 }
808
+ }, o = (e) => i.map((e, t) => t).filter((t) => !k(e, t)), s = a.flatMap((t, i) => n[i].open ? o(i).map((t) => r(i, t, {
809
+ class: e,
810
+ "data-row": t + 1,
811
+ ...v && { "data-series": i + 1 }
813
812
  })) : []);
814
- k(p, a, _, u), r.forEach((n, r) => {
815
- for (let n of i(r)) p.appendChild(t(r, n, {
816
- class: "tablechart-point",
817
- ...N[r].attrs,
818
- "data-marker": e[r].shape,
819
- ...e[r].open && { "data-open": "" },
820
- "data-row": n + 1,
821
- style: N[r].ink
813
+ te(m, s, w, d), a.forEach((e, i) => {
814
+ for (let e of o(i)) m.appendChild(r(i, e, {
815
+ class: t,
816
+ ...z[i].attrs,
817
+ "data-marker": n[i].shape,
818
+ ...n[i].open && { "data-open": "" },
819
+ "data-row": e + 1,
820
+ style: z[i].ink
822
821
  }));
823
822
  });
824
823
  })();
825
- let q = (e, t) => {
824
+ let ce = (e, t) => {
826
825
  let n = t;
827
- for (; n < b && !E(e, n + 1) && T(e, n + 1)?.value === T(e, t)?.value;) n++;
826
+ for (; n < b && !k(e, n + 1) && O(e, n + 1)?.value === O(e, t)?.value;) n++;
828
827
  return n;
829
- }, ae = (t, n) => {
830
- let i = T(t, n);
831
- if (!i || i.missing || h && n > 0 && !E(t, n - 1) && T(t, n - 1)?.value === i.value || y && !r[t].focus) return "none";
832
- if (m) return "middle";
833
- let a = i.value < 0 ? "below" : "above";
834
- if (!v || y || r.length > 2) return a;
835
- let o = T(1 - t, n);
836
- return !o || o.missing ? a : i.value > o.value || i.value === o.value && t === 0 || e && i.value >= 0 && M(t, n)[1] + 7 * d + f > x ? "above" : "below";
837
- }, oe = (e, t) => !m && !h ? v && !y && r.length > 2 : W(a[e][t]).width * d > (h ? q(e, t) - t + 1 : 1) * S - 4 * d || m && e > 0 && A(e, t) < j(e, t) ? !0 : m && Math.abs(c(j(e, t)) - c(A(e, t))) < f * 1.2;
838
- a.forEach((e, t) => {
828
+ }, le = (e, t) => {
829
+ let r = O(e, t);
830
+ if (!r || r.missing || g && t > 0 && !k(e, t - 1) && O(e, t - 1)?.value === r.value || y && !a[e].focus) return "none";
831
+ if (h) return "middle";
832
+ let i = r.value < 0 ? "below" : "above";
833
+ if (!v || y || a.length > 2) return i;
834
+ let o = O(1 - e, t);
835
+ return !o || o.missing ? i : r.value > o.value || r.value === o.value && e === 0 || n && r.value >= 0 && I(e, t)[1] + 7 * f + p > S ? "above" : "below";
836
+ }, ue = v && !y && a.length > 2 && !h && !g, de = /* @__PURE__ */ new Map();
837
+ if (ue) {
838
+ let e = i.flatMap((e, t) => a.map((e, n) => ({
839
+ s: n,
840
+ i: t,
841
+ value: O(n, t)?.value ?? 0
842
+ }))).filter(({ s: e, i: t }) => le(e, t) !== "none").sort((e, t) => e.i - t.i || t.value - e.value || e.s - t.s), t = (e) => e < 0 ? ["below", "above"] : ["above", "below"], n = e.map(({ s: e, i: n, value: r }) => {
843
+ let i = N(s[e][n]).width * f, [a, o] = I(e, n);
844
+ return t(r).map((e) => [
845
+ a - i / 2,
846
+ e === "above" ? o - 7 * f - p : o + 7 * f,
847
+ i,
848
+ p
849
+ ]);
850
+ }), r = a.flatMap((e, t) => i.flatMap((e, n) => {
851
+ if (k(t, n)) return [];
852
+ let [r, i] = I(t, n);
853
+ return [[
854
+ r - 4 * f,
855
+ i - 4 * f,
856
+ 8 * f,
857
+ 8 * f
858
+ ]];
859
+ })), o = E(n, r, [
860
+ 0,
861
+ 0,
862
+ l(b) + l(0),
863
+ d
864
+ ]);
865
+ e.forEach(({ s: e, i: n, value: r }, i) => de.set(s[e][n], o[i] === null ? null : t(r)[o[i]]));
866
+ }
867
+ let fe = (e, t) => ue ? de.get(s[e][t]) === null : !h && !g ? !1 : N(s[e][t]).width * f > (g ? ce(e, t) - t + 1 : 1) * C - 4 * f || h && e > 0 && P(e, t) < F(e, t) ? !0 : h && Math.abs(u(F(e, t)) - u(P(e, t))) < p * 1.2;
868
+ s.forEach((e, t) => {
839
869
  e.forEach((e, n) => {
840
- e.style.setProperty("--i", String(Y(h ? (I(n) + I(n + 1)) / 2 : I(n))));
841
- let r = ae(t, n);
842
- if (e.dataset.place = r === "above" ? "outside" : r, e.toggleAttribute("data-left-out", r !== "none" && oe(t, n)), h && r !== "none" ? e.dataset.rowEnd = String(q(t, n) + 1) : delete e.dataset.rowEnd, r === "none") return;
843
- let i = W(e).width * d / 2 + 4 * d, a = s(n);
844
- h ? a = (s(n) + s(q(t, n))) / 2 : r === "middle" && n === 0 ? a += i : r === "middle" && n === b && (a -= i);
845
- let o = c(A(t, n)), l = {
846
- middle: (c(j(t, n)) - o) / 2,
847
- above: -7 * d,
848
- below: 7 * d
870
+ e.style.setProperty("--i", String(X(g ? (H(n) + H(n + 1)) / 2 : H(n))));
871
+ let r = de.get(e) ?? le(t, n);
872
+ if (e.dataset.place = r === "above" ? "outside" : r, e.toggleAttribute("data-left-out", r !== "none" && fe(t, n)), g && r !== "none" ? e.dataset.rowEnd = String(ce(t, n) + 1) : delete e.dataset.rowEnd, r === "none") return;
873
+ let i = N(e).width * f / 2 + 4 * f, a = l(n);
874
+ g ? a = (l(n) + l(ce(t, n))) / 2 : r === "middle" && n === 0 ? a += i : r === "middle" && n === b && (a -= i);
875
+ let o = u(P(t, n)), s = {
876
+ middle: (u(F(t, n)) - o) / 2,
877
+ above: -7 * f,
878
+ below: 7 * f
849
879
  };
850
- D(e, a, o + l[r], _, u);
880
+ A(e, a, o + s[r], w, d);
851
881
  });
852
882
  });
853
- let se = o.map((e, t) => {
883
+ let pe = c.map((e, t) => {
854
884
  let n = b;
855
- for (; n > 0 && E(t, n);) n--;
856
- let [r, i] = M(t, n);
885
+ for (; n > 0 && k(t, n);) n--;
886
+ let [r, i] = I(t, n);
857
887
  return {
858
888
  name: e,
859
- x: (h ? r + S / 2 : r) + 10 * d,
860
- y: m ? (i + c(j(t, n))) / 2 : i
889
+ x: (g ? r + C / 2 : r) + 10 * f,
890
+ y: h ? (i + u(F(t, n))) / 2 : i
861
891
  };
862
- }), ce = (o[0] ? W(o[0]).height : 0) * d;
863
- for (let e of fe(se, ce)) D(e.name, e.x, e.y, _, u);
864
- let le = n.some((e) => e.cells.some((e) => !e.missing && e.value < 0)), J = !e && !m && r.length === 2 && !y && !le ? u - 2 * d : x;
865
- p.appendChild(w("line", {
866
- class: i,
892
+ }), me = (c[0] ? N(c[0]).height : 0) * f;
893
+ for (let e of ke(pe, me)) A(e.name, e.x, e.y, w, d);
894
+ let he = i.some((e) => e.cells.some((e) => !e.missing && e.value < 0)), ge = !n && !h && a.length === 2 && !y && !he ? d - 2 * f : S;
895
+ m.appendChild(L("line", {
896
+ class: x,
867
897
  x1: 0,
868
- x2: s(b) + s(0),
869
- y1: J,
870
- y2: J
898
+ x2: l(b) + l(0),
899
+ y1: ge,
900
+ y2: ge
871
901
  }));
872
902
  }
873
- }), De = Ee(!1), Oe = Ee(!0), ke = /* @__PURE__ */ new Set(), Ae = (t, n) => {
874
- if (Math.abs(t - n) <= Math.abs(n) / 100) return;
875
- let r = `[${e}] A total reads ${t}, but the steps before it add up to ${Number(n.toFixed(6))}. The chart shows your number.`;
876
- ke.has(r) || (ke.add(r), console.warn(r));
877
- }, je = {
903
+ }), Ve = Be(!1), He = Be(!0), Ue = /* @__PURE__ */ new Set(), We = (e, t) => {
904
+ if (Math.abs(e - t) <= Math.abs(t) / 100) return;
905
+ let n = `[${f}] A total reads ${e}, but the steps before it add up to ${Number(t.toFixed(6))}. The chart shows your number.`;
906
+ Ue.has(n) || (Ue.add(n), console.warn(n));
907
+ }, Ge = {
878
908
  segments: (e) => {
879
909
  let t = 0, n = !1;
880
910
  return e.map((e) => {
881
- if (e.isTotal) return n && Ae(e.value, t), n = !1, t = e.value, {
911
+ if (e.isTotal) return n && We(e.value, t), n = !1, t = e.value, {
882
912
  ...e,
883
913
  from: 0,
884
914
  to: e.value,
@@ -895,69 +925,69 @@ var Te = (e) => e.map((e) => ({
895
925
  },
896
926
  breakable: !0,
897
927
  headroom: ({ labelHeight: e, badgeHeight: t, hasAnnotations: n, unit: r }) => e + 6 * r + (n ? t * 1.6 : 0),
898
- draw({ segments: e, cx: t, y: n, barWidth: a, height: o, unit: s, svg: c, values: l, breakAt: u, insideAlign: d }) {
899
- let f = n(0), p = le(l, a, s), m = d ?? "center", h = e.map((t, r) => {
900
- let i = n(Math.max(t.from, t.to)), a = Math.abs(n(t.from) - n(t.to)), o = u !== null && Math.min(t.from, t.to) < u && Math.max(t.from, t.to) > u, c = t.kind === "total" && r > 0 && r === e.length - 1;
928
+ draw({ segments: e, cx: t, y: n, barWidth: r, height: i, unit: a, svg: o, values: s, breakAt: c, insideAlign: l }) {
929
+ let u = n(0), d = Te(s, r, a), f = l ?? "center", p = e.map((t, r) => {
930
+ let i = n(Math.max(t.from, t.to)), o = Math.abs(n(t.from) - n(t.to)), l = c !== null && Math.min(t.from, t.to) < c && Math.max(t.from, t.to) > c, u = t.kind === "total" && r > 0 && r === e.length - 1;
901
931
  return {
902
932
  top: i,
903
- length: a,
904
- down: t.kind === "down" || t.kind === "total" && (c ? t.to >= 0 : t.to < 0),
905
- inside: !o && !p && J(l[r], a, s)
933
+ length: o,
934
+ down: t.kind === "down" || t.kind === "total" && (u ? t.to >= 0 : t.to < 0),
935
+ inside: !l && !d && Ee(s[r], o, a)
906
936
  };
907
- }), g = l[0] ? W(l[0]).height * s * .56 : 0, v = Infinity;
908
- for (let [e, t] of h.entries()) t.inside && (v = Math.min(v, (a - W(l[e]).width * s) / 2));
909
- let b = e.length, S = (e, t, n = !1) => `--start:${(e / b).toFixed(4)}; --span:${(t / b).toFixed(4)}; --ease:${n ? y : "linear"};`;
910
- e.forEach((r, i) => {
911
- let o = e[i + 1];
912
- if (!o) return;
913
- let s = n(r.to), l = t(i) + a / 2, u = t(i + 1) - a / 2;
914
- c.appendChild(w("line", {
915
- class: "tablechart-connector",
937
+ }), m = s[0] ? N(s[0]).height * a * .56 : 0, h = Infinity;
938
+ for (let [e, t] of p.entries()) t.inside && (h = Math.min(h, (r - N(s[e]).width * a) / 2));
939
+ let g = e.length, _ = (e, t, n = !1) => `--start:${(e / g).toFixed(4)}; --span:${(t / g).toFixed(4)}; --ease:${n ? K : "linear"};`;
940
+ e.forEach((i, a) => {
941
+ let s = e[a + 1];
942
+ if (!s) return;
943
+ let c = n(i.to), l = t(a) + r / 2, u = t(a + 1) - r / 2;
944
+ o.appendChild(L("line", {
945
+ class: v,
916
946
  x1: l,
917
947
  x2: u,
918
- y1: s,
919
- y2: s,
920
- "data-row": i + 2,
921
- style: `${x("--i", o.slot)}; ${S(i + 1, 1 / 3)}`
948
+ y1: c,
949
+ y2: c,
950
+ "data-row": a + 2,
951
+ style: `${J("--i", s.slot)}; ${_(a + 1, 1 / 3)}`
922
952
  }));
923
- }), e.forEach((n, i) => {
924
- let { top: u, length: d, down: f, inside: p } = h[i];
925
- c.appendChild(w("rect", {
926
- class: T(r, n),
953
+ }), e.forEach((n, c) => {
954
+ let { top: l, length: u, down: d, inside: v } = p[c];
955
+ o.appendChild(L("rect", {
956
+ class: M(G, n),
927
957
  "data-kind": n.kind,
928
- "data-row": i + 1,
929
- "data-grow": f ? "down" : "up",
930
- x: t(i) - a / 2,
931
- y: u,
932
- width: a,
933
- height: Math.max(d, 1),
934
- style: `${x("--i", n.slot)}; ${S(i, 1, i === e.length - 1)}`
958
+ "data-row": c + 1,
959
+ "data-grow": d ? "down" : "up",
960
+ x: t(c) - r / 2,
961
+ y: l,
962
+ width: r,
963
+ height: Math.max(u, 1),
964
+ style: `${J("--i", n.slot)}; ${_(c, 1, c === e.length - 1)}`
935
965
  }));
936
- let y = l[i];
937
- y.style.setProperty("--start", (i / b).toFixed(4)), y.style.setProperty("--span", (1 / b).toFixed(4));
938
- let C = Math.min(v, (d - g) / 2), E = u + C + g / 2, O = u + d - C - g / 2, k = m === "center" ? u + d / 2 : m === "end" === f ? O : E;
939
- y.dataset.place = p ? "inside" : "outside", y.dataset.kind = n.kind;
940
- let A = p ? k : n.kind === "down" ? u + d + W(y).height * s + 3 * s : u - 3 * s;
941
- D(y, t(i), A, _, o);
942
- }), c.appendChild(w("line", {
943
- class: i,
966
+ let y = s[c];
967
+ y.style.setProperty("--start", (c / g).toFixed(4)), y.style.setProperty("--span", (1 / g).toFixed(4));
968
+ let b = Math.min(h, (u - m) / 2), x = l + b + m / 2, S = l + u - b - m / 2, C = f === "center" ? l + u / 2 : f === "end" === d ? S : x;
969
+ y.dataset.place = v ? "inside" : "outside", y.dataset.kind = n.kind;
970
+ let T = v ? C : n.kind === "down" ? l + u + N(y).height * a + 3 * a : l - 3 * a;
971
+ A(y, t(c), T, w, i);
972
+ }), o.appendChild(L("line", {
973
+ class: x,
944
974
  x1: 0,
945
- x2: _,
946
- y1: f,
947
- y2: f
975
+ x2: w,
976
+ y1: u,
977
+ y2: u
948
978
  }));
949
979
  }
950
- }, X = {
980
+ }, Z = {
951
981
  enabled: !1,
952
- log(...t) {
953
- X.enabled && console.log(`[${e}]`, ...t);
982
+ log(...e) {
983
+ Z.enabled && console.log(`[${f}]`, ...e);
954
984
  },
955
- timed(t, n, r) {
956
- if (!X.enabled) return r();
957
- let i = performance.now(), a = r(), o = performance.now() - i, s = n.querySelectorAll("tbody tr").length;
958
- return o > 50 ? console.warn(`[${e}] ${t} took ${o.toFixed(1)} ms for ${s} rows, more than 50 ms.`, n) : X.log(`${t} took ${o.toFixed(1)} ms for ${s} rows.`, n), a;
985
+ timed(e, t, n) {
986
+ if (!Z.enabled) return n();
987
+ let r = performance.now(), i = n(), a = performance.now() - r, o = t.querySelectorAll("tbody tr").length;
988
+ return a > 50 ? console.warn(`[${f}] ${e} took ${a.toFixed(1)} ms for ${o} rows, more than 50 ms.`, t) : Z.log(`${e} took ${a.toFixed(1)} ms for ${o} rows.`, t), i;
959
989
  }
960
- }, Me = (e) => {
990
+ }, Ke = (e) => {
961
991
  let t = (e?.textContent || "").trim(), n = t.match(/^(.*?)(-?\d+(?:[.,]\d+)?)(.*)$/);
962
992
  return {
963
993
  raw: t,
@@ -967,9 +997,9 @@ var Te = (e) => e.map((e) => ({
967
997
  missing: !n,
968
998
  value: n ? Number.parseFloat(n[2].replace(",", ".")) : 0
969
999
  };
970
- }, Ne = (e, t = "data-i18n") => Array.from(e.querySelectorAll("tbody tr")).map((e, n) => {
971
- let r = e.querySelector("th"), i = Array.from(e.querySelectorAll("td")).map(Me);
972
- return i.length || i.push(Me(null)), {
1000
+ }, qe = (e, t = "data-i18n") => Array.from(e.querySelectorAll("tbody tr")).map((e, n) => {
1001
+ let r = e.querySelector("th"), i = Array.from(e.querySelectorAll("td")).map(Ke);
1002
+ return i.length || i.push(Ke(null)), {
973
1003
  ...i[0],
974
1004
  label: (r?.textContent || "").trim(),
975
1005
  key: t && r?.getAttribute(t) || null,
@@ -978,8 +1008,8 @@ var Te = (e) => e.map((e) => ({
978
1008
  isTotal: e.getAttribute("data-kind") === "total",
979
1009
  slot: n
980
1010
  };
981
- }), Pe = (e) => Array.from(e.querySelector("thead tr:last-child")?.children ?? []).slice(1), Fe = (e) => e === "dashed" || e === "dotted" ? e : null, Ie = (e, t, n = "data-i18n") => {
982
- let r = Pe(e), i = Math.max(1, N(t.map((e) => e.cells.length)));
1011
+ }), Je = (e) => Array.from(e.querySelector("thead tr:last-child")?.children ?? []).slice(1), Ye = (e) => e === "dashed" || e === "dotted" ? e : null, Xe = (e, t, n = "data-i18n") => {
1012
+ let r = Je(e), i = Math.max(1, U(t.map((e) => e.cells.length)));
983
1013
  return Array.from({ length: i }, (e, t) => {
984
1014
  let i = r[t];
985
1015
  return {
@@ -987,33 +1017,84 @@ var Te = (e) => e.map((e) => ({
987
1017
  key: n && i?.getAttribute(n) || null,
988
1018
  focus: i?.getAttribute("data-kind") === "focus",
989
1019
  marker: i?.getAttribute("data-marker") ?? null,
990
- line: Fe(i?.getAttribute("data-line"))
1020
+ line: Ye(i?.getAttribute("data-line")),
1021
+ group: !!i?.hasAttribute("data-group")
991
1022
  };
992
1023
  });
993
- }, Le = (t, n) => {
994
- if (!n) return;
995
- let r = /* @__PURE__ */ new Map();
996
- for (let i of t) {
997
- let t = i.getAttribute("data-chart-keys") || null;
998
- if (!t) continue;
999
- if (r.has(t)) {
1000
- let n = r.get(t) + 1;
1001
- r.set(t, n), console.warn(`[${e}] Two charts have data-chart-keys="${t}", so this one uses "${t}-${n}" to keep their translations apart.`), t = `${t}-${n}`;
1002
- } else r.set(t, 1);
1003
- i.querySelectorAll("tbody th").forEach((e, r) => {
1004
- e.getAttribute(n) || e.setAttribute(n, `${t}-row${r + 1}`);
1024
+ }, Ze = (e, t) => {
1025
+ if (!t) return;
1026
+ let n = /* @__PURE__ */ new Map();
1027
+ for (let r of e) {
1028
+ let e = r.getAttribute("data-chart-keys") || null;
1029
+ if (!e) continue;
1030
+ if (n.has(e)) {
1031
+ let t = n.get(e) + 1;
1032
+ n.set(e, t), console.warn(`[${f}] Two charts have data-chart-keys="${e}", so this one uses "${e}-${t}" to keep their translations apart.`), e = `${e}-${t}`;
1033
+ } else n.set(e, 1);
1034
+ r.querySelectorAll("tbody th").forEach((n, r) => {
1035
+ n.getAttribute(t) || n.setAttribute(t, `${e}-row${r + 1}`);
1005
1036
  });
1006
- let a = Pe(i);
1007
- a.length > 1 && a.forEach((e, r) => {
1008
- e.getAttribute(n) || e.setAttribute(n, `${t}-col${r + 1}`);
1009
- }), X?.log?.(`Keys for "${t}" written onto ${i.querySelectorAll("tbody th").length} rows`);
1037
+ let i = Je(r);
1038
+ i.length > 1 && i.forEach((n, r) => {
1039
+ n.getAttribute(t) || n.setAttribute(t, `${e}-col${r + 1}`);
1040
+ }), i.forEach((n, i) => {
1041
+ if (!n.hasAttribute("data-group")) return;
1042
+ let a = [];
1043
+ r.querySelectorAll(`tbody tr > td:nth-of-type(${i + 1})`).forEach((n) => {
1044
+ let r = (n.textContent || "").trim();
1045
+ a.includes(r) || a.push(r), n.getAttribute(t) || n.setAttribute(t, `${e}-group${a.indexOf(r) + 1}`);
1046
+ });
1047
+ }), Z?.log?.(`Keys for "${e}" written onto ${r.querySelectorAll("tbody th").length} rows`);
1010
1048
  }
1011
- }, Re = [
1049
+ }, Qe = (e) => Number(e.toPrecision(12)), $e = (e, t) => {
1050
+ let n = e / Math.max(1, t) || 1, r = 10 ** Math.floor(Math.log10(n)), i = n / r;
1051
+ return Qe((i < 1.42 ? 1 : i < 3.17 ? 2 : i < 7.08 ? 5 : 10) * r);
1052
+ }, et = (e, t, n) => {
1053
+ let r = [];
1054
+ for (let i = Math.ceil(e / n - 1e-9); i * n <= t + n * 1e-9; i++) r.push(Qe(i * n));
1055
+ return r;
1056
+ }, tt = (e, t = e) => {
1057
+ do {
1058
+ let t = Math.round(e / 10 ** Math.floor(Math.log10(e) + 1e-9));
1059
+ e = Qe(e * (t === 2 ? 2.5 : 2));
1060
+ } while (Math.abs(e / t - Math.round(e / t)) > 1e-9);
1061
+ return e;
1062
+ }, nt = (e) => {
1063
+ let t = (e ?? "").trim().split(/\s+/).map(Number.parseFloat);
1064
+ return t.length > 1 && t.every(Number.isFinite) ? t.sort((e, t) => e - t) : null;
1065
+ }, rt = (e, t, n) => {
1066
+ if (n && n.length > 2) return {
1067
+ min: n[0],
1068
+ max: n[n.length - 1],
1069
+ step: 0,
1070
+ ticks: n
1071
+ };
1072
+ let r = n?.[0] ?? -U(e.map((e) => -e)), i = n?.[1] ?? U(e);
1073
+ if (!n) {
1074
+ let e = (i - r || Math.abs(i) || 1) * .05;
1075
+ r -= e, i += e;
1076
+ }
1077
+ let a = $e(i - r, t);
1078
+ return {
1079
+ min: r,
1080
+ max: i,
1081
+ step: a,
1082
+ ticks: et(r, i, a)
1083
+ };
1084
+ }, it = (e, t) => {
1085
+ let { step: n, ticks: r } = e;
1086
+ for (; n && r.length > 2 && !t(r);) n = tt(n, e.step), r = et(e.min, e.max, n);
1087
+ return {
1088
+ ...e,
1089
+ step: n,
1090
+ ticks: r
1091
+ };
1092
+ }, at = [
1012
1093
  "axis-break",
1013
1094
  "trend",
1014
1095
  "bracket"
1015
- ], ze = (e) => {
1016
- let t = e.hasAttribute("data-fragment"), n = Array.from(e.querySelectorAll("tbody tr")), r = Array.from(e.querySelector("thead tr:last-child")?.children ?? []).slice(1), i = Array.from(e.querySelectorAll("[data-annotation]")).filter((e) => Re.includes(e.getAttribute("data-annotation") ?? "")), a = (e) => e.hasAttribute("data-fragment"), o = n.map((e) => Array.from(e.querySelectorAll(":scope > td")));
1096
+ ], ot = (e) => {
1097
+ let t = e.hasAttribute("data-fragment"), n = Array.from(e.querySelectorAll("tbody tr")), r = Array.from(e.querySelector("thead tr:last-child")?.children ?? []).slice(1), i = Array.from(e.querySelectorAll("[data-annotation]")).filter((e) => at.includes(e.getAttribute("data-annotation") ?? "")), a = (e) => e.hasAttribute("data-fragment"), o = n.map((e) => Array.from(e.querySelectorAll(":scope > td")));
1017
1098
  if (!t && !n.some(a) && !r.some(a) && !o.flat().some(a) && !i.some(a)) return null;
1018
1099
  let s = [], c = /* @__PURE__ */ new Map(), l = [], u = (e) => {
1019
1100
  let t = e === null ? void 0 : c.get(e);
@@ -1071,7 +1152,7 @@ var Te = (e) => e.map((e) => ({
1071
1152
  count: s.length,
1072
1153
  indexes: s
1073
1154
  };
1074
- }, Be = (e) => {
1155
+ }, st = (e) => {
1075
1156
  let t = e.plan;
1076
1157
  if (!t) return;
1077
1158
  let n = (t) => t === null || e.step - t >= 1;
@@ -1082,90 +1163,90 @@ var Te = (e) => e.map((e) => ({
1082
1163
  let u = r.hasAttribute("data-flat") ? (l - e + 1) / (i - e + 1) : i > e ? Math.max(0, l - e) / (i - e) : 0;
1083
1164
  r.style.setProperty("--reveal", String(u));
1084
1165
  }
1085
- }, Ve = (e) => {
1166
+ }, ct = (e) => {
1086
1167
  let t = e.plan;
1087
1168
  if (!t) return;
1088
- let n = t.rows.length - 1, i = (e) => t.series.map((n, r) => t.cells[e]?.[r]?.step ?? n.step ?? t.rows[e]?.step ?? null), a = (e) => {
1089
- let t = i(e);
1169
+ let n = t.rows.length - 1, r = (e) => t.series.map((n, r) => t.cells[e]?.[r]?.step ?? n.step ?? t.rows[e]?.step ?? null), i = (e) => {
1170
+ let t = r(e);
1090
1171
  return t.some((e) => e === null) ? null : Math.min(...t);
1091
- }, o = new Set(e.totals), c = (e, t, n, r) => {
1172
+ }, a = new Set(e.totals), o = (e, t, n, r) => {
1092
1173
  e.style.setProperty(n, String(r)), e.style.removeProperty("--d"), t === null ? e.style.removeProperty("--step") : e.style.setProperty("--step", String(t));
1093
1174
  };
1094
- for (let r of e.figure.querySelectorAll("[data-row], [data-series], [data-note]")) {
1095
- if (r.closest("table, .tablechart-controls") || r.hasAttribute("data-from")) continue;
1096
- let e = Number(r.dataset.note);
1175
+ for (let s of e.figure.querySelectorAll("[data-row], [data-series], [data-note]")) {
1176
+ if (s.closest("table, .tablechart-controls") || s.hasAttribute("data-from")) continue;
1177
+ let e = Number(s.dataset.note);
1097
1178
  if (e > 0) {
1098
1179
  let n = t.notes[e - 1];
1099
- n && c(r, n.step, "--after", n.after);
1180
+ n && o(s, n.step, "--after", n.after);
1100
1181
  continue;
1101
1182
  }
1102
- let s = r.dataset.row ? Number(r.dataset.row) - 1 : n;
1103
- if (r.classList.contains("tablechart-connector")) {
1104
- let e = t.rows[s - 1], n = t.rows[s];
1183
+ let c = s.dataset.row ? Number(s.dataset.row) - 1 : n;
1184
+ if (s.classList.contains("tablechart-connector")) {
1185
+ let e = t.rows[c - 1], n = t.rows[c];
1105
1186
  if (e && n) {
1106
1187
  let t = (e.step ?? -1) > (n.step ?? -1);
1107
- c(r, t ? e.step : n.step, "--i", t ? e.slot + 1 : n.slot);
1188
+ o(s, t ? e.step : n.step, "--i", t ? e.slot + 1 : n.slot);
1108
1189
  }
1109
1190
  continue;
1110
1191
  }
1111
- if (o.has(r)) {
1112
- let e = i(s).filter((e) => e !== null);
1113
- c(r, e.length ? Math.max(...e) : null, "--i", t.rows[s]?.slot ?? 0);
1192
+ if (a.has(s)) {
1193
+ let e = r(c).filter((e) => e !== null);
1194
+ o(s, e.length ? Math.max(...e) : null, "--i", t.rows[c]?.slot ?? 0);
1114
1195
  continue;
1115
1196
  }
1116
- if (r.hasAttribute("data-stack")) {
1117
- c(r, a(s), "--i", t.rows[s]?.slot ?? 0);
1197
+ if (s.hasAttribute("data-stack")) {
1198
+ o(s, i(c), "--i", t.rows[c]?.slot ?? 0);
1118
1199
  continue;
1119
1200
  }
1120
- let l = r.dataset.series ? Number(r.dataset.series) - 1 : 0, u = r.dataset.series ? t.series[l] : void 0;
1121
- if (r.classList.contains("tablechart-piece")) {
1122
- let e = i(s)[l] ?? null, n = t.cells[s]?.[l];
1123
- c(r, e === a(s) ? null : e, "--i", n && n.step !== null ? n.slot : s);
1201
+ let l = s.dataset.series ? Number(s.dataset.series) - 1 : 0, u = s.dataset.series ? t.series[l] : void 0;
1202
+ if (s.classList.contains("tablechart-piece")) {
1203
+ let e = r(c)[l] ?? null, n = t.cells[c]?.[l];
1204
+ o(s, e === i(c) ? null : e, "--i", n && n.step !== null ? n.slot : c);
1124
1205
  continue;
1125
1206
  }
1126
- if (r.dataset.place === "legend") {
1207
+ if (s.dataset.place === "legend") {
1127
1208
  let e = Math.min(...t.cells.map((e) => e[l]?.step ?? Infinity));
1128
- c(r, u?.step ?? (Number.isFinite(e) ? e : null), "--i", 0);
1209
+ o(s, u?.step ?? (Number.isFinite(e) ? e : null), "--i", 0);
1129
1210
  continue;
1130
1211
  }
1131
- let d = t.cells[s]?.[l];
1132
- d && d.step !== null ? c(r, d.step, "--i", d.slot) : u && u.step !== null ? c(r, u.step, "--i", s) : t.rows[s] && c(r, t.rows[s].step, "--i", t.rows[s].slot);
1212
+ let d = t.cells[c]?.[l];
1213
+ d && d.step !== null ? o(s, d.step, "--i", d.slot) : u && u.step !== null ? o(s, u.step, "--i", c) : t.rows[c] && o(s, t.rows[c].step, "--i", t.rows[c].slot);
1133
1214
  }
1134
- let l = e.figure.querySelector(`.${u}`);
1135
- if (l) {
1215
+ let s = e.figure.querySelector(`.${W}`);
1216
+ if (s) {
1136
1217
  let e = [...t.rows, ...t.cells.flat()].map((e) => e.step ?? -1), n = Math.max(-1, ...e);
1137
- n < 0 ? c(l, null, "--i", 0) : c(l, n, "--i", e.filter((e) => e === n).length);
1218
+ n < 0 ? o(s, null, "--i", 0) : o(s, n, "--i", e.filter((e) => e === n).length);
1138
1219
  }
1139
- let d = [...t.rows, ...t.cells.flat()].map((e) => e.slot + 1), f = t.series.some((e) => e.step !== null) ? t.rows.length : 1;
1140
- e.plot.style.setProperty("--count", String(Math.max(f, ...d)));
1141
- let p = e.figure.querySelectorAll(`.${r}`), m = p[p.length - 1];
1142
- if (e.figure.dataset.chart === "waterfall" && m?.dataset.kind === "total" && p.length > 1) {
1143
- let e = Number(m.dataset.row) - 1;
1144
- (t.rows[e - 1]?.step ?? -1) > (t.rows[e]?.step ?? -1) && (m.dataset.grow = m.dataset.grow === "down" ? "up" : "down");
1220
+ let c = [...t.rows, ...t.cells.flat()].map((e) => e.slot + 1), l = t.series.some((e) => e.step !== null) ? t.rows.length : 1;
1221
+ e.plot.style.setProperty("--count", String(Math.max(l, ...c)));
1222
+ let u = e.figure.querySelectorAll(`.${G}`), d = u[u.length - 1];
1223
+ if (e.figure.dataset.chart === "waterfall" && d?.dataset.kind === "total" && u.length > 1) {
1224
+ let e = Number(d.dataset.row) - 1;
1225
+ (t.rows[e - 1]?.step ?? -1) > (t.rows[e]?.step ?? -1) && (d.dataset.grow = d.dataset.grow === "down" ? "up" : "down");
1145
1226
  }
1146
- let h = Array.from(e.figure.querySelectorAll(`.${s}`));
1147
- if (h.length) {
1148
- let t = (e) => e.style.getPropertyValue("--step") || "none", n = (e) => Number(e.style.getPropertyValue("--share") || 0), r = h.length, i = Math.max(0, h.findIndex((e, n) => t(e) !== t(h[(n - 1 + r) % r]))), a = [];
1227
+ let f = Array.from(e.figure.querySelectorAll(`.${V}`));
1228
+ if (f.length) {
1229
+ let t = (e) => e.style.getPropertyValue("--step") || "none", n = (e) => Number(e.style.getPropertyValue("--share") || 0), r = f.length, i = Math.max(0, f.findIndex((e, n) => t(e) !== t(f[(n - 1 + r) % r]))), a = [];
1149
1230
  for (let e = 0; e < r; e++) {
1150
- let n = h[(i + e) % r], o = a[a.length - 1];
1231
+ let n = f[(i + e) % r], o = a[a.length - 1];
1151
1232
  o && t(o[0]) === t(n) ? o.push(n) : a.push([n]);
1152
1233
  }
1153
1234
  let o = /* @__PURE__ */ new Map();
1154
1235
  for (let e of a) {
1155
1236
  let t = e.reduce((e, t) => e + n(t), 0), r = 0;
1156
- for (let i of e) o.set(i.dataset.row ?? "", b(r, n(i), t)), r += n(i);
1237
+ for (let i of e) o.set(i.dataset.row ?? "", q(r, n(i), t)), r += n(i);
1157
1238
  }
1158
1239
  for (let t of e.figure.querySelectorAll("[data-row]")) {
1159
1240
  let e = o.get(t.dataset.row ?? "");
1160
1241
  e && t.style.getPropertyValue("--start") && (t.style.setProperty("--start", e.start.toFixed(4)), t.style.setProperty("--span", e.span.toFixed(4)), t.classList.contains("tablechart-slice") && t.style.setProperty("--ease", e.easing));
1161
1242
  }
1162
1243
  }
1163
- Be(e);
1164
- }, He = (e, t, n = !1) => {
1244
+ st(e);
1245
+ }, lt = (e, t, n = !1) => {
1165
1246
  let r = e.plan;
1166
1247
  if (!r) return;
1167
1248
  let i = Math.min(Math.max(Math.round(t), 0), r.count), a = i !== e.step;
1168
- e.step = i, e.figure.style.setProperty("--_step", String(i)), Be(e);
1249
+ e.step = i, e.figure.style.setProperty("--_step", String(i)), st(e);
1169
1250
  let [o, s] = e.controls?.querySelectorAll("button") ?? [];
1170
1251
  o && (o.disabled = i === 0), s && (s.disabled = i === r.count), a && !n && e.figure.dispatchEvent(new CustomEvent("tablechart:step", {
1171
1252
  bubbles: !0,
@@ -1174,43 +1255,43 @@ var Te = (e) => e.map((e) => ({
1174
1255
  steps: r.count
1175
1256
  }
1176
1257
  }));
1177
- }, Ue = (e, t, n) => {
1258
+ }, ut = (e, t, n) => {
1178
1259
  let r = document.createElement("div");
1179
- r.className = "tablechart-controls";
1180
- let i = (r) => {
1260
+ r.className = i;
1261
+ let a = (r) => {
1181
1262
  let i = document.createElement("button");
1182
1263
  i.type = "button", i.className = `tablechart-${r}`, i.dataset.go = r;
1183
1264
  let a = document.createElement("span");
1184
1265
  a.className = "tablechart-control-icon", a.setAttribute("aria-hidden", "true");
1185
- let o = w("svg", {
1266
+ let o = L("svg", {
1186
1267
  viewBox: "0 0 16 16",
1187
1268
  focusable: "false"
1188
1269
  });
1189
- o.appendChild(w("path", { d: r === "next" ? "M6 3l5 5-5 5" : "M10 3L5 8l5 5" })), a.appendChild(o);
1270
+ o.appendChild(L("path", { d: r === "next" ? "M6 3l5 5-5 5" : "M10 3L5 8l5 5" })), a.appendChild(o);
1190
1271
  let s = document.createElement("span");
1191
1272
  s.className = "tablechart-control-label", s.textContent = e[r];
1192
- let c = t[r];
1193
- c && n && s.setAttribute(n, c);
1194
- let l = document.createElement("span");
1195
- return l.className = p, l.textContent = e.hint, t.hint && n && l.setAttribute(n, t.hint), i.append(...r === "next" ? [
1273
+ let l = t[r];
1274
+ l && n && s.setAttribute(n, l);
1275
+ let u = document.createElement("span");
1276
+ return u.className = c, u.textContent = e.hint, t.hint && n && u.setAttribute(n, t.hint), i.append(...r === "next" ? [
1196
1277
  s,
1197
- l,
1278
+ u,
1198
1279
  a
1199
1280
  ] : [
1200
1281
  a,
1201
1282
  s,
1202
- l
1283
+ u
1203
1284
  ]), i;
1204
1285
  };
1205
- return r.append(i("previous"), i("next")), r;
1206
- }, We = (e, t, n, r = {
1286
+ return r.append(a("previous"), a("next")), r;
1287
+ }, dt = (e, t, n, r = {
1207
1288
  x: 0,
1208
1289
  y: 0,
1209
1290
  scale: 1
1210
1291
  }, i = 2, a = 8, o = 12) => {
1211
1292
  let s = e.getBoundingClientRect(), c = s.width, l = s.height, u = Number.parseFloat(getComputedStyle(e).borderLeftWidth) || 0, d = t.getBoundingClientRect().height / 2 + (i - u) * r.scale, f = o * r.scale, { clientWidth: p, clientHeight: m } = document.documentElement, h = n.top - a, g = m - n.bottom - a, _ = l + d <= h ? !0 : l + d <= g ? !1 : h >= g, v = _ ? n.top - d - l : n.bottom + d, y = n.left + n.width / 2, b = Math.max(a, Math.min(y - c / 2, p - c - a));
1212
1293
  e.style.left = `${(b - r.x) / r.scale}px`, e.style.top = `${(Math.max(a, Math.min(v, m - l - a)) - r.y) / r.scale}px`, e.dataset.side = _ ? "top" : "bottom", t.style.left = `${Math.max(f, Math.min(y - b, c - f)) / r.scale - u}px`;
1213
- }, Ge = "tablechart-tooltip", Ke = [
1294
+ }, ft = "tablechart-tooltip", pt = [
1214
1295
  "--tablechart-surface",
1215
1296
  "--tablechart-tooltip-surface",
1216
1297
  "--tablechart-tooltip-color",
@@ -1218,51 +1299,51 @@ var Te = (e) => e.map((e) => ({
1218
1299
  "--tablechart-tooltip-radius",
1219
1300
  "--tablechart-tooltip-padding",
1220
1301
  "--tablechart-tooltip-shadow"
1221
- ], Z = null, qe, Je, Q = null, Ye = null, Xe = 0, $ = () => {
1222
- clearTimeout(Xe), Z && Q && (Z.hidden = !0, Q = null, Ye = null);
1223
- }, Ze = !1, Qe = !0, $e = NaN, et = NaN, tt = !1, nt = () => {
1224
- if (tt) return;
1225
- tt = !0, document.addEventListener("pointermove", (e) => {
1226
- e.pointerType === "mouse" && (Qe = e.screenX !== $e || e.screenY !== et, $e = e.screenX, et = e.screenY, Qe && (Ze = !1));
1302
+ ], Q = null, mt, ht, $ = null, gt = null, _t = 0, vt = () => {
1303
+ clearTimeout(_t), Q && $ && (Q.hidden = !0, $ = null, gt = null);
1304
+ }, yt = !1, bt = !0, xt = NaN, St = NaN, Ct = !1, wt = () => {
1305
+ if (Ct) return;
1306
+ Ct = !0, document.addEventListener("pointermove", (e) => {
1307
+ e.pointerType === "mouse" && (bt = e.screenX !== xt || e.screenY !== St, xt = e.screenX, St = e.screenY, bt && (yt = !1));
1227
1308
  }, {
1228
1309
  capture: !0,
1229
1310
  passive: !0
1230
1311
  });
1231
1312
  let e = () => {
1232
- Ze = !0, $();
1313
+ yt = !0, vt();
1233
1314
  };
1234
1315
  document.addEventListener("keydown", e, !0), window.addEventListener("scroll", e, {
1235
1316
  capture: !0,
1236
1317
  passive: !0
1237
1318
  });
1238
- }, rt = (e, t) => t / Number.parseFloat(getComputedStyle(e).width) || 1, it = (e) => {
1319
+ }, Tt = (e, t) => t / Number.parseFloat(getComputedStyle(e).width) || 1, Et = (e) => {
1239
1320
  let t = e.tooltipparent;
1240
1321
  return (typeof t == "string" ? document.querySelector(t) : t) ?? document.body;
1241
- }, at = () => {
1242
- clearTimeout(Xe), Xe = window.setTimeout($, 120);
1243
- }, ot = () => {
1322
+ }, Dt = () => {
1323
+ clearTimeout(_t), _t = window.setTimeout(vt, 120);
1324
+ }, Ot = () => {
1244
1325
  let e = document.createElement("div");
1245
- return e.className = Ge, e.setAttribute("aria-hidden", "true"), e.hidden = !0, qe = document.createElement("div"), Je = document.createElement("div"), Je.className = `${Ge}-arrow`, e.append(qe, Je), document.body.append(e), e.addEventListener("pointerenter", () => clearTimeout(Xe)), e.addEventListener("pointerleave", (e) => e.pointerType === "mouse" && at()), document.addEventListener("pointerdown", (t) => {
1326
+ return e.className = ft, e.setAttribute("aria-hidden", "true"), e.hidden = !0, mt = document.createElement("div"), ht = document.createElement("div"), ht.className = `${ft}-arrow`, e.append(mt, ht), document.body.append(e), e.addEventListener("pointerenter", () => clearTimeout(_t)), e.addEventListener("pointerleave", (e) => e.pointerType === "mouse" && Dt()), document.addEventListener("pointerdown", (t) => {
1246
1327
  let n = t.target;
1247
- Q && !Q.plot.contains(n) && !e.contains(n) && $();
1248
- }), window.addEventListener("resize", $), e;
1249
- }, st = (e, t) => {
1328
+ $ && !$.plot.contains(n) && !e.contains(n) && vt();
1329
+ }), window.addEventListener("resize", vt), e;
1330
+ }, kt = (e, t) => {
1250
1331
  let n = t ? t.style.getPropertyValue("--step") : "x";
1251
1332
  return n === "" || Number(n) < e.step;
1252
- }, ct = (e, t) => {
1333
+ }, At = (e, t) => {
1253
1334
  let n = e.svg.querySelector(`[data-series="${t + 1}"]:not(.tablechart-hole)`);
1254
1335
  if (!n) return;
1255
1336
  let r = getComputedStyle(n);
1256
1337
  return r.fill && r.fill !== "none" ? r.fill : r.stroke;
1257
- }, lt = (e, t, n) => {
1338
+ }, jt = (e, t, n) => {
1258
1339
  let r = e.series.length > 1, i = [];
1259
1340
  for (let [n, a] of e.seriesValues.entries()) {
1260
- if (!st(e, a[t])) continue;
1341
+ if (!kt(e, a[t])) continue;
1261
1342
  let o = r ? e.figure.querySelector(`.tablechart-name[data-series="${n + 1}"]`) : null;
1262
1343
  i.push({
1263
1344
  name: r ? o?.textContent ?? e.series[n].name : "",
1264
1345
  value: a[t].textContent ?? "",
1265
- colour: r ? ct(e, n) : void 0,
1346
+ colour: r ? At(e, n) : void 0,
1266
1347
  sample: o ? {
1267
1348
  marker: o.dataset.marker ?? null,
1268
1349
  open: o.hasAttribute("data-open"),
@@ -1272,11 +1353,11 @@ var Te = (e) => e.map((e) => ({
1272
1353
  });
1273
1354
  }
1274
1355
  let a = e.totals[t];
1275
- return i.length > 1 && st(e, a) && i.push({
1356
+ return i.length > 1 && kt(e, a) && i.push({
1276
1357
  name: n.totallabel,
1277
1358
  value: a.textContent ?? ""
1278
1359
  }), i;
1279
- }, ut = (e, t) => {
1360
+ }, Mt = (e, t) => {
1280
1361
  if (e.type.centre && e.values[t]) return e.values[t].getBoundingClientRect();
1281
1362
  let n = e.svg.querySelectorAll(`[data-row="${t + 1}"]:not(.tablechart-connector, .tablechart-leader)`), r = null;
1282
1363
  for (let e of n) {
@@ -1291,46 +1372,46 @@ var Te = (e) => e.map((e) => ({
1291
1372
  100
1292
1373
  ];
1293
1374
  return new DOMRect(i.left + i.width * a / 100, i.top + i.height * o / 100, i.width * s / 100, i.height * c / 100);
1294
- }, dt = (e, t, n) => {
1295
- if (clearTimeout(Xe), Q === e && Ye === t) return;
1296
- let r = (e.type.tooltip ?? lt)(e, t, n);
1297
- if (!r.length) return $();
1298
- Q && Q !== e && $(), Z ?? (Z = ot());
1375
+ }, Nt = (e, t, n) => {
1376
+ if (clearTimeout(_t), $ === e && gt === t) return;
1377
+ let r = (e.type.tooltip ?? jt)(e, t, n);
1378
+ if (!r.length) return vt();
1379
+ $ && $ !== e && vt(), Q ?? (Q = Ot());
1299
1380
  let i = (e, t, n, r = !1, i) => {
1300
1381
  let a = document.createElement("div");
1301
- if (a.className = `${Ge}-line`, n) {
1382
+ if (a.className = `${ft}-line`, n) {
1302
1383
  let e = document.createElement("span");
1303
- e.className = `${Ge}-key`, e.style.background = n, i?.box ? e.dataset.sample = "box" : i && (e.dataset.sample = "line", i.marker && (e.dataset.marker = i.marker), i.line && (e.dataset.line = i.line), e.toggleAttribute("data-open", i.open)), a.append(e);
1384
+ e.className = `${ft}-key`, e.style.background = n, i?.box ? e.dataset.sample = "box" : i && (e.dataset.sample = "line", i.marker && (e.dataset.marker = i.marker), i.line && (e.dataset.line = i.line), e.toggleAttribute("data-open", i.open)), a.append(e);
1304
1385
  }
1305
1386
  let o = document.createElement("span");
1306
- if (o.className = `${Ge}-${r ? "title" : "name"}`, o.textContent = e, a.append(o), t) {
1387
+ if (o.className = `${ft}-${r ? "title" : "name"}`, o.textContent = e, a.append(o), t) {
1307
1388
  e && o.append(":");
1308
1389
  let n = document.createElement("span");
1309
- n.className = `${Ge}-value`, n.textContent = t, a.append(n);
1390
+ n.className = `${ft}-value`, n.textContent = t, a.append(n);
1310
1391
  }
1311
1392
  return a;
1312
- }, a = e.categories[t]?.textContent ?? e.rows[t].label, o = r.length === 1 && !r[0].name;
1313
- qe.replaceChildren(i(a, o ? r[0].value : "", void 0, !0), ...o ? [] : r.map(({ name: e, value: t, colour: n, sample: r }) => i(e, t, n, !1, r)));
1314
- let s = getComputedStyle(e.figure);
1315
- for (let e of Ke) {
1316
- let t = s.getPropertyValue(e).trim();
1317
- t ? Z.style.setProperty(e, t) : Z.style.removeProperty(e);
1393
+ }, a = e.categories[t]?.textContent ?? e.rows[t].label, o = r.length === 1 && !r[0].name, s = r.every((e) => e.name && !e.value);
1394
+ mt.replaceChildren(...s ? [] : [i(a, o ? r[0].value : "", void 0, !0)], ...o ? [] : r.map(({ name: e, value: t, colour: n, sample: r }) => i(e, t, n, !1, r)));
1395
+ let c = getComputedStyle(e.figure);
1396
+ for (let e of pt) {
1397
+ let t = c.getPropertyValue(e).trim();
1398
+ t ? Q.style.setProperty(e, t) : Q.style.removeProperty(e);
1318
1399
  }
1319
- Z.style.setProperty("--_color", s.color), Z.style.colorScheme = s.colorScheme, Z.style.fontFamily = s.fontFamily;
1320
- let c = it(n);
1321
- Z.parentElement !== c && c.append(Z), Q = e, Ye = t, Z.hidden = !1, Z.style.left = "0px", Z.style.top = "0px";
1322
- let l = Z.getBoundingClientRect(), u = {
1323
- x: l.left,
1324
- y: l.top,
1325
- scale: rt(Z, l.width)
1326
- }, d = rt(e.plot, e.plot.getBoundingClientRect().width);
1327
- Z.style.fontSize = `${Number.parseFloat(s.fontSize) * d / u.scale}px`, We(Z, Je, ut(e, t), u);
1328
- }, ft = (e, t, n = !1) => {
1400
+ Q.style.setProperty("--_color", c.color), Q.style.colorScheme = c.colorScheme, Q.style.fontFamily = c.fontFamily;
1401
+ let l = Et(n);
1402
+ Q.parentElement !== l && l.append(Q), $ = e, gt = t, Q.hidden = !1, Q.style.left = "0px", Q.style.top = "0px";
1403
+ let u = Q.getBoundingClientRect(), d = {
1404
+ x: u.left,
1405
+ y: u.top,
1406
+ scale: Tt(Q, u.width)
1407
+ }, f = Tt(e.plot, e.plot.getBoundingClientRect().width);
1408
+ Q.style.fontSize = `${Number.parseFloat(c.fontSize) * f / d.scale}px`, dt(Q, ht, Mt(e, t), d);
1409
+ }, Pt = (e, t, n = !1) => {
1329
1410
  let { plot: r } = e;
1330
- r.setAttribute("data-hover", ""), nt();
1411
+ r.setAttribute("data-hover", ""), wt();
1331
1412
  let i = (t) => {
1332
1413
  if (e.rowAt) {
1333
- let n = r.getBoundingClientRect(), i = rt(r, n.width);
1414
+ let n = r.getBoundingClientRect(), i = Tt(r, n.width);
1334
1415
  return e.rowAt((t.clientX - n.left) / i, (t.clientY - n.top) / i);
1335
1416
  }
1336
1417
  let n = t.target.closest?.("[data-row]")?.getAttribute("data-row");
@@ -1340,13 +1421,13 @@ var Te = (e) => e.map((e) => ({
1340
1421
  else if (t.getAttribute("data-row") === String(e + 1)) return !0;
1341
1422
  return !1;
1342
1423
  }, s = null, c = (a) => {
1343
- if (a.type === "pointerdown") Ze = !1;
1344
- else if (a.pointerType === "mouse" && (!Qe || Ze)) return;
1424
+ if (a.type === "pointerdown") yt = !1;
1425
+ else if (a.pointerType === "mouse" && (!bt || yt)) return;
1345
1426
  if (!r.classList.contains("is-placed") || !e.figure.classList.contains("is-shown")) return;
1346
- if (n && !e.figure.hasAttribute("data-left-out")) return Q === e ? $() : void 0;
1427
+ if (n && !e.figure.hasAttribute("data-left-out")) return $ === e ? vt() : void 0;
1347
1428
  let c = i(a);
1348
- if (s = c, c === null || o(c)) return Q === e ? at() : void 0;
1349
- dt(e, c, t);
1429
+ if (s = c, c === null || o(c)) return $ === e ? vt() : void 0;
1430
+ Nt(e, c, t);
1350
1431
  }, l = (t) => {
1351
1432
  let n = t.target;
1352
1433
  return e.svg.contains(n) && n.hasAttribute("data-row") ? n : null;
@@ -1360,42 +1441,48 @@ var Te = (e) => e.map((e) => ({
1360
1441
  if (!r) return;
1361
1442
  a.delete(r);
1362
1443
  let i = Number(r.getAttribute("data-row")) - 1;
1363
- s === i && !o(i) && !Ze && dt(e, i, t);
1444
+ s === i && !o(i) && !yt && Nt(e, i, t);
1364
1445
  };
1365
1446
  e.svg.addEventListener("transitionend", u), e.svg.addEventListener("transitioncancel", u), r.addEventListener("pointermove", c), r.addEventListener("pointerdown", c), r.addEventListener("pointerleave", (t) => {
1366
- t.pointerType === "mouse" && (s = null, Q === e && at());
1447
+ t.pointerType === "mouse" && (s = null, $ === e && Dt());
1367
1448
  });
1368
- }, pt = (e) => {
1369
- Q === e && $();
1370
- }, mt = {
1371
- area: Oe,
1372
- bar: pe,
1373
- column: me,
1374
- donut: _e,
1375
- line: De,
1376
- waterfall: je
1377
- }, ht = {
1378
- "axis-break": M,
1379
- trend: te,
1380
- bracket: H
1381
- }, gt = Object.keys(ht), _t = (e) => {
1449
+ }, Ft = (e) => {
1450
+ $ === e && vt();
1451
+ }, It = {
1452
+ area: He,
1453
+ bar: Ae,
1454
+ column: je,
1455
+ donut: Pe,
1456
+ line: Ve,
1457
+ waterfall: Ge
1458
+ }, Lt = (e, t) => {
1459
+ It[e] = t;
1460
+ }, Rt = {
1461
+ "axis-break": se,
1462
+ trend: he,
1463
+ bracket: de,
1464
+ reference: pe
1465
+ }, zt = Object.keys(Rt), Bt = (e) => {
1382
1466
  let t = "";
1383
1467
  for (let n = e.previousSibling; n && (t = (n.textContent ?? "") + t, !t.trim()); n = n.previousSibling);
1384
1468
  return t.trim();
1385
- }, vt = [
1469
+ }, Vt = [
1386
1470
  "straight",
1387
1471
  "step",
1388
1472
  "smooth"
1389
- ], yt = (e, t) => {
1473
+ ], Ht = (e, t, n) => {
1474
+ let r = e.getAttribute(t);
1475
+ return r === null ? n : r !== "false";
1476
+ }, Ut = (e, t) => !!t.animate && e.getAttribute("data-chart-animate") !== "false", Wt = (e, t) => {
1390
1477
  let n = e.dataset.chartShape;
1391
- return n && vt.includes(n) ? n : vt.includes(t.shape) ? t.shape : "straight";
1392
- }, bt = (e) => {
1478
+ return n && Vt.includes(n) ? n : Vt.includes(t.shape) ? t.shape : "straight";
1479
+ }, Gt = (e) => {
1393
1480
  for (let t of e.querySelectorAll("br")) {
1394
- if (t.previousElementSibling?.classList.contains("tablechart-sr") || /[.!?:;,…]$/.test(_t(t))) continue;
1481
+ if (t.previousElementSibling?.classList.contains("tablechart-sr") || /[.!?:;,…]$/.test(Bt(t))) continue;
1395
1482
  let e = document.createElement("span");
1396
- e.className = p, e.textContent = ". ", t.before(e);
1483
+ e.className = c, e.textContent = ". ", t.before(e);
1397
1484
  }
1398
- }, xt = (e, t, n) => {
1485
+ }, Kt = (e, t, n) => {
1399
1486
  let r = e.querySelector("table");
1400
1487
  if (!r) return null;
1401
1488
  let i = r.querySelector("tfoot [data-chart-total]");
@@ -1406,174 +1493,238 @@ var Te = (e) => e.map((e) => ({
1406
1493
  s && n.langattribute && o.setAttribute(n.langattribute, `${s}-total`);
1407
1494
  let c = a.insertCell();
1408
1495
  return c.setAttribute("data-chart-total", ""), c.dataset.value = t.dataset.value ?? "0", a.prepend(o), c;
1409
- }, St = 0, Ct = (e) => {
1496
+ }, qt = 0, Jt = (e) => {
1410
1497
  let t = e.querySelector(":scope > figcaption");
1411
1498
  if (!t) return;
1412
- bt(t);
1499
+ Gt(t);
1413
1500
  let n = (e) => e.hasAttribute("aria-label") || e.hasAttribute("aria-labelledby"), r = (e) => {
1414
- t.id || (t.id = `tablechart-caption-${++St}`), e.setAttribute("aria-labelledby", t.id);
1501
+ t.id || (t.id = `tablechart-caption-${++qt}`), e.setAttribute("aria-labelledby", t.id);
1415
1502
  };
1416
1503
  e.tagName === "FIGURE" && !n(e) && r(e);
1417
1504
  let i = e.querySelector("table");
1418
1505
  i && !n(i) && !i.querySelector(":scope > caption") && r(i);
1419
- }, wt = (r, i, a = null) => {
1420
- let o = a ?? (r.getAttribute("data-chart") || "column"), s = mt[o];
1421
- if (!s) return console.warn(`[${e}] Unknown chart type "${o}". Known types: ${Object.keys(mt).join(", ")}.`), r.setAttribute("data-chart-empty", ""), null;
1422
- let l = Ne(r, i.langattribute);
1423
- if (!l.length) return console.warn(r.querySelector("table") ? `[${e}] A chart has no rows in its table, so there is nothing to draw.` : `[${e}] A chart has no table, so there is nothing to draw.`, r), r.setAttribute("data-chart-empty", ""), null;
1424
- Ct(r);
1425
- let d = Ie(r, l, i.langattribute);
1426
- d.length > 1 && !s.series && (console.warn(`[${e}] A ${o} chart uses only the first of its ${d.length} value columns.`), d = d.slice(0, 1));
1427
- let f = d.length > 1;
1428
- f && r.style.setProperty("--_series-count", String(d.length));
1429
- let p = r.hasAttribute("data-chart-stack");
1430
- p && !s.stackable && console.warn(`[${e}] A ${o} chart cannot be stacked.`);
1431
- let m = p && !!s.stackable && f, h = document.createElement("div");
1432
- h.className = t, h.setAttribute("aria-hidden", "true");
1433
- let g = w("svg", {
1506
+ }, Yt = (e, t, r = null) => {
1507
+ let i = r ?? (e.getAttribute("data-chart") || "column"), a = It[i];
1508
+ if (!a) return console.warn(`[${f}] Unknown chart type "${i}". Known types: ${Object.keys(It).join(", ")}.`), e.setAttribute("data-chart-empty", ""), null;
1509
+ let o = qe(e, t.langattribute);
1510
+ if (!o.length) return console.warn(e.querySelector("table") ? `[${f}] A chart has no rows in its table, so there is nothing to draw.` : `[${f}] A chart has no table, so there is nothing to draw.`, e), e.setAttribute("data-chart-empty", ""), null;
1511
+ Jt(e);
1512
+ let c = Xe(e, o, t.langattribute);
1513
+ c.length > 1 && !a.series && !a.columns && (console.warn(`[${f}] A ${i} chart uses only the first of its ${c.length} value columns.`), c = c.slice(0, 1));
1514
+ let l = c.length > 1;
1515
+ l && e.style.setProperty("--_series-count", String(c.length));
1516
+ let u = e.hasAttribute("data-chart-stack");
1517
+ u && !a.stackable && console.warn(`[${f}] A ${i} chart cannot be stacked.`);
1518
+ let p = u && !!a.stackable && l, m = document.createElement("div");
1519
+ m.className = ie, m.setAttribute("aria-hidden", "true");
1520
+ let h = L("svg", {
1434
1521
  role: "presentation",
1435
1522
  focusable: "false"
1436
1523
  });
1437
- h.appendChild(g), r.appendChild(h);
1438
- let _ = s.centre ? l.filter((e) => !e.isTotal) : l, v = Math.max(0, N(_.flatMap((e) => e.cells.slice(0, d.length).map((e) => P(e.number))))), y = d.map((e, t) => l.map((e, r) => {
1439
- let i = e.cells[t] ?? e.cells[0], a = E(n, h);
1440
- return a.classList.add(...e.classes), a.dataset.value = String(i.value), i.prefix && (a.dataset.prefix = i.prefix), i.suffix && (a.dataset.suffix = i.suffix), i.missing && (a.dataset.missing = i.raw), f && (a.dataset.series = String(t + 1)), a.dataset.row = String(r + 1), a.style.setProperty("--i", String(e.slot)), a;
1441
- })), b = y[0], x = m && s.totals ? l.map((e, t) => {
1442
- let r = E(n, h);
1443
- r.classList.add(...e.classes), r.dataset.kind = "total", r.dataset.row = String(t + 1), r.dataset.value = String(ae(e, d.length));
1444
- let i = e.cells[0];
1445
- return i.prefix && (r.dataset.prefix = i.prefix), i.suffix && (r.dataset.suffix = i.suffix), r.style.setProperty("--i", String(e.slot)), r;
1446
- }) : [], S = l[l.length - 1], C = d.some((e) => e.focus), T = r.getAttribute("data-chart-legend"), D = f && (T === null ? i.legend || s.legend !== void 0 : T !== "false") ? document.createElement("div") : null;
1447
- D && (D.className = c, D.setAttribute("aria-hidden", "true"), D.inert = !0);
1448
- let O = f ? d.map((e, t) => {
1449
- let n = E("tablechart-name", D ?? h);
1450
- D && (n.dataset.place = "legend");
1451
- let a = s.legend ?? s.swatch;
1452
- if (a && (n.dataset.swatch = a), n.textContent = e.name, !a && yt(r, i) !== "step") {
1453
- let e = ye(d, t);
1454
- n.dataset.marker = e.shape, n.toggleAttribute("data-open", e.open);
1524
+ m.appendChild(h), e.appendChild(m);
1525
+ let g = a.centre ? o.filter((e) => !e.isTotal) : o, _ = Math.max(0, U(g.flatMap((e) => e.cells.slice(0, c.length).map((e) => z(e.number))))), v = c.map((e, t) => Math.max(0, U(o.map((e) => z(e.cells[t]?.number ?? ""))))), y = c.map((e, t) => o.map((e, n) => {
1526
+ let r = e.cells[t] ?? e.cells[0], i = k(S, m);
1527
+ return i.classList.add(...e.classes), i.dataset.value = String(r.value), r.prefix && (i.dataset.prefix = r.prefix), r.suffix && (i.dataset.suffix = r.suffix), r.missing && (i.dataset.missing = r.raw), l && (i.dataset.series = String(t + 1)), a.columns && (i.dataset.decimals = String(v[t])), i.dataset.row = String(n + 1), i.style.setProperty("--i", String(e.slot)), i;
1528
+ })), b = y[0], x = p && a.totals ? o.map((e, t) => {
1529
+ let n = k(S, m);
1530
+ n.classList.add(...e.classes), n.dataset.kind = "total", n.dataset.row = String(t + 1), n.dataset.value = String(xe(e, c.length));
1531
+ let r = e.cells[0];
1532
+ return r.prefix && (n.dataset.prefix = r.prefix), r.suffix && (n.dataset.suffix = r.suffix), n.style.setProperty("--i", String(e.slot)), n;
1533
+ }) : [], w = o[o.length - 1], T = c.some((e) => e.focus), E = e.getAttribute("data-chart-legend"), D = l && !a.columns && (E === null ? t.legend || a.legend !== void 0 : E !== "false") ? document.createElement("div") : null;
1534
+ D && (D.className = d, D.setAttribute("aria-hidden", "true"), D.inert = !0);
1535
+ let O = l && !a.columns ? c.map((n, r) => {
1536
+ let i = k(s, D ?? m);
1537
+ D && (i.dataset.place = "legend");
1538
+ let o = a.legend ?? a.swatch;
1539
+ if (o && (i.dataset.swatch = o), i.textContent = n.name, !o && Wt(e, t) !== "step") {
1540
+ let e = R(c, r);
1541
+ i.dataset.marker = e.shape, i.toggleAttribute("data-open", e.open);
1455
1542
  }
1456
- return e.line && !a && (n.dataset.line = e.line), e.key && i.langattribute && n.setAttribute(i.langattribute, e.key), n.dataset.series = String(t + 1), n.style.setProperty("--n", String(t)), n.style.setProperty("--palette", `var(--tablechart-color-${t + 1})`), n.style.setProperty("--m", C && !e.focus ? "1" : "0"), n.style.setProperty("--i", String(S.slot)), n;
1457
- }) : [], k = s.centre ? E(u, h) : null;
1458
- if (k) {
1459
- let e = l.find((e) => e.isTotal), t = e ? e.value : l.reduce((e, t) => e + Math.abs(t.value), 0);
1460
- k.dataset.value = String(t), e && (k.dataset.decimals = String(P(e.number)));
1543
+ return n.line && !o && (i.dataset.line = n.line), n.key && t.langattribute && i.setAttribute(t.langattribute, n.key), i.dataset.series = String(r + 1), i.style.setProperty("--n", String(r)), i.style.setProperty("--palette", `var(--tablechart-color-${r + 1})`), i.style.setProperty("--m", T && !n.focus ? "1" : "0"), i.style.setProperty("--i", String(w.slot)), i;
1544
+ }) : [], A = a.centre ? k(W, m) : null;
1545
+ if (A) {
1546
+ let e = o.find((e) => e.isTotal), t = e ? e.value : o.reduce((e, t) => e + Math.abs(t.value), 0);
1547
+ A.dataset.value = String(t), e && (A.dataset.decimals = String(z(e.number)));
1461
1548
  }
1462
- let A = k && !l.some((e) => e.isTotal) ? xt(r, k, i) : null, j = s.categories === "beside", M = document.createElement("div");
1463
- M.className = "tablechart-categories", M.setAttribute("aria-hidden", "true"), M.inert = !0, j ? M.dataset.place = "beside" : s.centre && (M.dataset.place = "key"), M.style.setProperty("--_columns", String(l.length));
1464
- let F = 0;
1465
- for (let [e, t] of l.entries()) {
1466
- let n = document.createElement("span");
1467
- n.classList.add(...t.classes), n.textContent = t.label, t.key && i.langattribute && n.setAttribute(i.langattribute, t.key), s.centre && (n.dataset.kind = t.isTotal ? "total" : "slice", t.isTotal || (n.dataset.slice = String(F + 1), n.style.setProperty("--n", String(F)), n.style.setProperty("--palette", `var(--tablechart-color-${F + 1})`), F += 1)), n.style.setProperty("--i", String(t.slot)), n.dataset.row = String(e + 1), M.appendChild(n);
1549
+ let j = A && !o.some((e) => e.isTotal) ? Kt(e, A, t) : null, M = a.categories === "beside", N = document.createElement("div");
1550
+ N.className = n, N.setAttribute("aria-hidden", "true"), N.inert = !0, M ? N.dataset.place = "beside" : a.centre && (N.dataset.place = "key"), N.style.setProperty("--_columns", String(o.length));
1551
+ let P = 0;
1552
+ for (let [e, n] of o.entries()) {
1553
+ let r = document.createElement("span");
1554
+ r.classList.add(...n.classes), r.textContent = n.label, n.key && t.langattribute && r.setAttribute(t.langattribute, n.key), a.centre && (r.dataset.kind = n.isTotal ? "total" : "slice", n.isTotal || (r.dataset.slice = String(P + 1), r.style.setProperty("--n", String(P)), r.style.setProperty("--palette", `var(--tablechart-color-${P + 1})`), P += 1)), r.style.setProperty("--i", String(n.slot)), r.dataset.row = String(e + 1), N.appendChild(r);
1468
1555
  }
1469
- (j ? h : r).appendChild(M), D && r.appendChild(D);
1470
- let I = i.animate ? ze(r) : null;
1471
- I && r.setAttribute("data-steps", "");
1472
- let L = r.getAttribute("data-chart-keys"), R = I && i.controls ? Ue({
1473
- previous: i.previouslabel,
1474
- next: i.nextlabel,
1475
- hint: i.stephint
1556
+ (M ? m : e).appendChild(N), D && e.appendChild(D);
1557
+ let F = c.filter((e) => !e.group), I = !a.axes && !a.centre && Ht(e, "data-chart-axis", t.axis), B = a.axes ? {
1558
+ titles: F.slice(0, 2).map((e, n) => {
1559
+ let r = k(`${ne}-title`, m);
1560
+ return r.dataset.axis = n ? "y" : "x", r.textContent = e.name, e.key && t.langattribute && r.setAttribute(t.langattribute, e.key), r;
1561
+ }),
1562
+ ticks: k(`${C}s`, m),
1563
+ numbers: !0
1564
+ } : I || !a.centre && Ht(e, "data-chart-grid", t.grid) ? {
1565
+ titles: [],
1566
+ ticks: k(`${C}s`, m),
1567
+ numbers: I
1568
+ } : null;
1569
+ a.text?.({
1570
+ figure: e,
1571
+ plot: m,
1572
+ rows: o,
1573
+ series: c,
1574
+ config: t
1575
+ });
1576
+ let V = Ut(e, t) && !a.axes ? ot(e) : null;
1577
+ a.axes && e.querySelector("[data-fragment]") && Z.log(`A ${i} chart has no steps, so it is shown whole.`, e), V && e.setAttribute("data-steps", "");
1578
+ let H = e.getAttribute("data-chart-keys"), ee = V && t.controls ? ut({
1579
+ previous: t.previouslabel,
1580
+ next: t.nextlabel,
1581
+ hint: t.stephint
1476
1582
  }, {
1477
- previous: L && `${L}-previous`,
1478
- next: L && `${L}-next`,
1479
- hint: L && `${L}-step`
1480
- }, i.langattribute) : null;
1481
- R && r.appendChild(R);
1482
- let z = r.getAttribute("data-chart-table"), B = z && Et.includes(z) ? z : i.table;
1483
- if (B === "never") r.removeAttribute("data-table");
1583
+ previous: H && `${H}-previous`,
1584
+ next: H && `${H}-next`,
1585
+ hint: H && `${H}-step`
1586
+ }, t.langattribute) : null;
1587
+ ee && e.appendChild(ee);
1588
+ let te = e.getAttribute("data-chart-table"), G = te && Zt.includes(te) ? te : t.table;
1589
+ if (G === "never") e.removeAttribute("data-table");
1484
1590
  else {
1485
- r.setAttribute("data-table", B);
1486
- let e = r.querySelector(":scope > table");
1487
- e && r.append(e);
1591
+ e.setAttribute("data-table", G);
1592
+ let t = e.querySelector(":scope > table");
1593
+ t && e.append(t);
1488
1594
  }
1489
- let V = Array.from(r.querySelectorAll("[data-annotation]")).map((t) => {
1490
- let n = t.getAttribute("data-annotation"), r = ht[n];
1491
- if (!r) return console.warn(`[${e}] Unknown annotation "${n}". Known annotations: ${Object.keys(ht).join(", ")}.`), null;
1492
- let i = Number.parseInt(t.getAttribute("data-series") ?? "1", 10), a = i >= 1 && i <= d.length ? i - 1 : 0;
1493
- return i !== a + 1 && console.warn(`[${e}] An annotation reads line ${i}, which is not there; it reads line 1.`), {
1494
- spec: t,
1495
- type: r,
1496
- badge: r.create(t, h),
1497
- series: a,
1498
- after: l.length
1595
+ let re = Array.from(e.querySelectorAll("[data-annotation]")).map((e) => {
1596
+ let t = e.getAttribute("data-annotation"), n = Rt[t];
1597
+ if (!n) return console.warn(`[${f}] Unknown annotation "${t}". Known annotations: ${Object.keys(Rt).join(", ")}.`), null;
1598
+ let r = Number.parseInt(e.getAttribute("data-series") ?? "1", 10), i = r >= 1 && r <= c.length ? r - 1 : 0;
1599
+ return r !== i + 1 && console.warn(`[${f}] An annotation reads line ${r}, which is not there; it reads line 1.`), {
1600
+ spec: e,
1601
+ type: n,
1602
+ badge: n.create(e, m),
1603
+ series: i,
1604
+ after: o.length
1499
1605
  };
1500
1606
  }).filter((e) => e !== null);
1501
- i.animate && r.setAttribute("data-animate", Ot(r, o, i, !!I));
1502
- let H = {
1503
- figure: r,
1504
- plot: h,
1505
- svg: g,
1506
- rows: l,
1507
- decimals: v,
1508
- type: s,
1607
+ Ut(e, t) && e.setAttribute("data-animate", Qt(e, i, t, !!V));
1608
+ let K = {
1609
+ figure: e,
1610
+ plot: m,
1611
+ svg: h,
1612
+ rows: o,
1613
+ decimals: _,
1614
+ type: a,
1509
1615
  values: b,
1510
- series: d,
1616
+ series: c,
1511
1617
  seriesValues: y,
1512
1618
  names: D ? [] : O,
1513
- categories: Array.from(M.children),
1514
- centre: k,
1515
- stacked: m,
1619
+ categories: Array.from(N.children),
1620
+ centre: A,
1621
+ axes: B,
1622
+ stacked: p,
1516
1623
  totals: x,
1517
- totalCell: A,
1624
+ totalCell: j,
1518
1625
  rowAt: null,
1519
1626
  rowBox: null,
1520
- annotations: V,
1627
+ annotations: re,
1521
1628
  checks: [],
1522
- plan: I,
1629
+ plan: V,
1523
1630
  step: 0,
1524
- controls: R
1631
+ controls: ee
1525
1632
  };
1526
- R?.addEventListener("click", (e) => {
1633
+ ee?.addEventListener("click", (e) => {
1527
1634
  let t = e.target.closest("button")?.dataset.go;
1528
- t && He(H, H.step + (t === "next" ? 1 : -1));
1529
- }), He(H, 0, !0);
1530
- let U = r.getAttribute("data-chart-tooltip") ?? r.getAttribute("data-chart-hover"), ee = U === "false" ? !1 : U === "auto" ? "auto" : U !== null || i.hover !== !1 && i.tooltip;
1531
- return ee && ft(H, i, ee === "auto"), Nt(H, i), H;
1532
- }, Tt = {
1635
+ t && lt(K, K.step + (t === "next" ? 1 : -1));
1636
+ }), lt(K, 0, !0);
1637
+ let q = e.getAttribute("data-chart-tooltip"), J = q === "false" ? !1 : q === "auto" ? "auto" : q !== null || t.tooltip;
1638
+ return J && Pt(K, t, J === "auto"), rn(K, t), K;
1639
+ }, Xt = {
1533
1640
  grow: "grow",
1534
1641
  sweep: "sweep"
1535
- }, Et = [
1642
+ }, Zt = [
1536
1643
  "never",
1537
1644
  "auto",
1538
1645
  "print",
1539
1646
  "always"
1540
- ], Dt = {
1541
- ...Tt,
1542
- up: "grow",
1543
- across: "sweep"
1544
- }, Ot = (e, t, n, r) => {
1545
- let i = t === "line" || t === "area", a = i ? Dt : Tt, o = a[e.getAttribute("data-chart-animate") ?? ""] ?? a[String(n.animate)];
1546
- return i ? r ? "sweep" : o ?? "sweep" : t === "donut" || t === "waterfall" ? o ?? "grow" : "grow";
1547
- }, kt = (e) => {
1548
- let t = getComputedStyle(e), n = (t.getPropertyValue("--tablechart-value-align") || t.getPropertyValue("--tablechart-inside-align")).trim();
1549
- return n === "start" || n === "center" || n === "end" ? n : null;
1550
- }, At = (e, t, n, r) => {
1647
+ ], Qt = (e, t, n, r) => {
1648
+ let i = t === "line" || t === "area", a = Xt[e.getAttribute("data-chart-animate") ?? ""] ?? Xt[String(n.animate)];
1649
+ return i ? r ? "sweep" : a ?? "sweep" : t === "donut" || t === "waterfall" ? a ?? "grow" : "grow";
1650
+ }, $t = (e) => {
1651
+ let t = getComputedStyle(e).getPropertyValue("--tablechart-value-align").trim();
1652
+ return t === "start" || t === "center" || t === "end" ? t : null;
1653
+ }, en = (e, t, n, r) => {
1551
1654
  let i = getComputedStyle(e), a = (i.getPropertyValue(n).trim() || r).match(/^(\d+(?:\.\d+)?)(px|%|em|rem)$/);
1552
1655
  if (!a) return null;
1553
1656
  let o = Number(a[1]);
1554
- return a[2] === "%" ? o / 100 * _ : o * (a[2] === "em" ? Number.parseFloat(i.fontSize) : a[2] === "rem" ? Number.parseFloat(getComputedStyle(document.documentElement).fontSize) : 1) * t;
1555
- }, jt = (e, t) => At(e, t, "--tablechart-bar-max", "60px") ?? Infinity, Mt = (t, n) => {
1556
- let { plot: r, svg: i, rows: a, type: o, values: s, series: c, seriesValues: u, names: d, annotations: p } = t, m = r.clientWidth;
1557
- if (!m) return !1;
1558
- let h = _ / m, g = Number.parseFloat(t.figure.dataset.chartAspect ?? ""), v = _ * (g > 0 ? g : o.aspect ?? n.aspect);
1559
- r.classList.add(f);
1560
- for (let e of [...u.flat(), ...t.totals]) delete e.dataset.place;
1561
- r.style.removeProperty("--_fit"), t.categories[0]?.parentElement?.style.removeProperty("--_beside"), ee([
1562
- ...u.flat(),
1657
+ return a[2] === "%" ? o / 100 * w : o * (a[2] === "em" ? Number.parseFloat(i.fontSize) : a[2] === "rem" ? Number.parseFloat(getComputedStyle(document.documentElement).fontSize) : 1) * t;
1658
+ }, tn = (e, t) => en(e, t, "--tablechart-bar-max", "60px") ?? Infinity, nn = (t, n) => {
1659
+ let { plot: r, svg: i, rows: a, type: o, values: s, series: c, seriesValues: l, names: u, annotations: d } = t, m = Number.parseFloat(t.figure.dataset.chartAspect ?? ""), h = m > 0 ? m : o.aspect ?? n.aspect, _ = o.categories === "beside", v = t.axes && !o.axes ? t.axes : null, y = _ ? null : t.categories[0]?.parentElement, b = null;
1660
+ if (v) {
1661
+ r.style.margin = "", y && (y.style.marginLeft = "");
1662
+ let e = r.clientWidth;
1663
+ if (!e) return !1;
1664
+ let i = o.segments?.(a) ?? [], s = t.stacked ? a.flatMap((e) => Object.values(be(e, c.length, o.running))) : i.some((e) => e.kind === "up" || e.kind === "down") ? i.flatMap((e) => [e.from, e.to]) : a.flatMap((e) => e.cells.slice(0, c.length).filter((e) => !e.missing).map((e) => e.value)), l = Math.min(0, -U(s.map((e) => -e))), u = Math.max(0, U(s)), d = Number.parseFloat(getComputedStyle(r).fontSize) || 16, { chartScaleY: f, chartScale: p } = t.figure.dataset, m = nt(f ?? p);
1665
+ if (m && m.length > 2) b = {
1666
+ min: m[0],
1667
+ max: m[m.length - 1],
1668
+ step: 0,
1669
+ ticks: m
1670
+ };
1671
+ else {
1672
+ let [t, n] = m ?? [l, u], r = $e(n - t, Math.max((_ ? e / 9 : e * h / 3) / d, 2)), i = (e, t) => m ? e : Number(((t ? Math.ceil : Math.floor)(e / r - 1e-9 * (t ? 1 : -1)) * r).toPrecision(12)), a = i(t, !1), o = i(n, !0);
1673
+ b = {
1674
+ min: a,
1675
+ max: o,
1676
+ step: r,
1677
+ ticks: et(a, o, r)
1678
+ };
1679
+ }
1680
+ v.ticks.textContent = "";
1681
+ let g = a.find((e) => !e.missing), x = U(b.ticks.map((e) => z(String(e))));
1682
+ for (let e of b.ticks) {
1683
+ let t = k(C, v.ticks);
1684
+ t.dataset.value = String(e), t.dataset.place = "none", g?.prefix && (t.dataset.prefix = g.prefix), g?.suffix && (t.dataset.suffix = g.suffix), an(t, x, n.locale);
1685
+ }
1686
+ if (v.numbers) {
1687
+ let e = Array.from(v.ticks.children);
1688
+ for (let t of e) delete t.dataset.place;
1689
+ H(e), _ ? r.style.marginBottom = `${(e[0] ? N(e[0]).height : 0) + 6}px` : (r.style.marginLeft = `${U([0, ...e.map((e) => N(e).width)]) + 10}px`, y && (y.style.marginLeft = r.style.marginLeft));
1690
+ }
1691
+ }
1692
+ let x = r.clientWidth;
1693
+ if (!x) return !1;
1694
+ let S = w / x, T = w * h;
1695
+ r.classList.add(g);
1696
+ for (let e of [...l.flat(), ...t.totals]) delete e.dataset.place;
1697
+ r.style.removeProperty("--_fit"), t.categories[0]?.parentElement?.style.removeProperty("--_beside");
1698
+ let E = o.axes ? t.axes : null, D = [];
1699
+ if (E) {
1700
+ let e = Number.parseFloat(getComputedStyle(r).fontSize) || 16, i = c.flatMap((e, t) => e.group ? [] : [t]).slice(0, 2), o = a.filter((e) => i.every((t) => e.cells[t] && !e.cells[t].missing)), { chartScaleX: s, chartScaleY: l, chartScale: u } = t.figure.dataset, d = [nt(s), nt(l ?? u)];
1701
+ D = i.map((t, n) => rt(o.length ? o.map((e) => e.cells[t].value) : [0, 1], Math.max(n ? T / S / (e * 4) : x / (e * 9), 4), d[n])), E.ticks.textContent = "", D.forEach((e, t) => {
1702
+ let r = o[0]?.cells[i[t]], a = U(e.ticks.map((e) => z(String(e))));
1703
+ for (let i of e.ticks) {
1704
+ let e = k(C, E.ticks);
1705
+ e.dataset.axis = t ? "y" : "x", e.dataset.value = String(i), r?.prefix && (e.dataset.prefix = r.prefix), r?.suffix && (e.dataset.suffix = r.suffix), an(e, a, n.locale);
1706
+ }
1707
+ });
1708
+ }
1709
+ let O = E ? Array.from(E.ticks.children) : [];
1710
+ H([
1711
+ ...l.flat(),
1563
1712
  ...t.totals,
1564
- ...d,
1713
+ ...u,
1565
1714
  ...t.categories,
1566
- ...p.map((e) => e.badge)
1715
+ ...d.map((e) => e.badge),
1716
+ ...E?.titles ?? [],
1717
+ ...O
1567
1718
  ]);
1568
- let y = (s[0] ? W(s[0]).height : 0) * h, b = p[0]?.badge ? W(p[0].badge).height * h : 0, x = Math.max(v, At(t.figure, h, "--tablechart-min-height", "200px") ?? 0, o.minHeight?.({
1569
- labelHeight: y,
1570
- nameHeight: Math.max(0, N(t.categories.map((e) => W(e).height))) * h,
1571
- unit: h,
1719
+ let j = (s[0] ? N(s[0]).height : 0) * S, M = d[0]?.badge ? N(d[0].badge).height * S : 0, P = Math.max(T, en(t.figure, S, "--tablechart-min-height", "200px") ?? 0, o.minHeight?.({
1720
+ labelHeight: j,
1721
+ nameHeight: Math.max(0, U(t.categories.map((e) => N(e).height))) * S,
1722
+ unit: S,
1572
1723
  rows: a.length,
1573
1724
  series: c.length,
1574
1725
  stacked: t.stacked
1575
- }) ?? 0), S = t.stacked ? a.map((e) => {
1576
- let t = ae(e, c.length);
1726
+ }) ?? 0), F = t.stacked ? a.map((e) => {
1727
+ let t = xe(e, c.length);
1577
1728
  return {
1578
1729
  ...e,
1579
1730
  value: t,
@@ -1582,189 +1733,258 @@ var Te = (e) => e.map((e) => ({
1582
1733
  value: t
1583
1734
  } : e)
1584
1735
  };
1585
- }) : a, T = (o.segments ?? ((e) => e.map((e) => ({
1736
+ }) : a, I = (o.segments ?? ((e) => e.map((e) => ({
1586
1737
  ...e,
1587
1738
  from: 0,
1588
1739
  to: e.value,
1589
1740
  kind: "bar"
1590
- }))))(t.stacked ? S.map((e) => ({
1741
+ }))))(t.stacked ? F.map((e) => ({
1591
1742
  ...e,
1592
1743
  cells: [e.cells[0]]
1593
- })) : a), E = {
1594
- labelHeight: y,
1595
- badgeHeight: b,
1596
- hasAnnotations: p.length > 0,
1597
- unit: h,
1744
+ })) : a), R = {
1745
+ labelHeight: j,
1746
+ badgeHeight: M,
1747
+ hasAnnotations: d.length > 0,
1748
+ unit: S,
1598
1749
  series: c.length,
1599
1750
  focused: c.some((e) => e.focus),
1600
1751
  stacked: t.stacked
1601
- }, D = Math.max(((e) => t.stacked ? e(a.map((e) => q(e, c.length, o.running).top)) : e([...T.flatMap((e) => [
1752
+ }, V = Math.max(((e) => t.stacked ? e(a.map((e) => be(e, c.length, o.running).top)) : e([...I.flatMap((e) => [
1602
1753
  e.from,
1603
1754
  e.to,
1604
1755
  e.value
1605
- ]), ...a.flatMap((e) => e.cells.slice(0, c.length).map((e) => e.value))]))(N), 0), O = T.some((e) => e.kind === "up" || e.kind === "down") ? T.flatMap((e) => [e.from, e.to]) : t.stacked ? a.map((e) => q(e, c.length, o.running).bottom) : a.flatMap((e) => e.cells.slice(0, c.length).map((e) => e.value)), A = Math.min(-N(O.map((e) => -e)), 0), j = o.headroom?.(E) ?? y, M = 2 * h + (o.footroom?.(E) ?? 0) + (A < 0 ? y + 4 * h : 0), P = x - j - M, F = D * 1.02, I = A * 1.02, L = p.find((e) => e.spec.getAttribute("data-annotation") === "axis-break")?.spec, R = (e) => {
1606
- let t = Number.parseFloat(L?.getAttribute(e) ?? "");
1756
+ ]), ...a.flatMap((e) => e.cells.slice(0, c.length).map((e) => e.value))]))(U), 0), ee = I.some((e) => e.kind === "up" || e.kind === "down") ? I.flatMap((e) => [e.from, e.to]) : t.stacked ? a.map((e) => be(e, c.length, o.running).bottom) : a.flatMap((e) => e.cells.slice(0, c.length).map((e) => e.value)), W = Math.min(-U(ee.map((e) => -e)), 0), G = o.headroom?.(R) ?? j, re = 2 * S + (o.footroom?.(R) ?? 0) + (W < 0 ? j + 4 * S : 0), ie = P - G - re, K = b ? Math.max(b.max, V) : V * 1.02, q = b ? Math.min(b.min, W) : W * 1.02, J = d.find((e) => e.spec.getAttribute("data-annotation") === "axis-break")?.spec, ae = (e) => {
1757
+ let t = Number.parseFloat(J?.getAttribute(e) ?? "");
1607
1758
  return Number.isFinite(t) ? t : null;
1608
- }, z = R("data-from") ?? R("data-at"), B = R("data-to"), V = null;
1609
- if (L && (z !== null || B !== null)) {
1610
- let t = z ?? 0, n = B ?? F, r = B === null ? t : z === null ? n : (t + n) / 2, i = L.getAttribute("data-size"), a = i?.match(/^\s*(\d+(?:\.\d+)?)\s*%\s*$/);
1611
- i !== null && !a && console.warn(`[${e}] data-size="${i}" is not a percentage, such as 30%. Using the default.`);
1612
- let s = Math.min(Math.max(a ? Number(a[1]) / 100 : B === null ? .22 : .3, .05), .8), c = T.filter((e) => (e.kind === "up" || e.kind === "down") && Math.max(e.from, e.to) > t && Math.min(e.from, e.to) < n);
1613
- o.breakable ? A < 0 ? console.warn(`[${e}] A chart with values below zero cannot break its scale.`) : t < 0 || n <= t || n > F || t === 0 && n === F ? console.warn(`[${e}] A break from ${t} to ${n} does not fit a scale that runs from 0 to ${D}.`) : c.length ? console.warn(`[${e}] A break from ${t} to ${n} would cut a step that floats. Keep it below or above the steps.`) : V = {
1614
- lo: t,
1615
- hi: n,
1616
- gap: r,
1617
- share: s
1618
- } : console.warn(`[${e}] This kind of chart cannot break its scale.`);
1759
+ }, oe = ae("data-from") ?? ae("data-at"), se = ae("data-to"), Y = null;
1760
+ if (J && (oe !== null || se !== null)) {
1761
+ let e = oe ?? 0, t = se ?? K, n = se === null ? e : oe === null ? t : (e + t) / 2, r = J.getAttribute("data-size"), i = r?.match(/^\s*(\d+(?:\.\d+)?)\s*%\s*$/);
1762
+ r !== null && !i && console.warn(`[${f}] data-size="${r}" is not a percentage, such as 30%. Using the default.`);
1763
+ let a = Math.min(Math.max(i ? Number(i[1]) / 100 : se === null ? .22 : .3, .05), .8), s = I.filter((n) => (n.kind === "up" || n.kind === "down") && Math.max(n.from, n.to) > e && Math.min(n.from, n.to) < t);
1764
+ o.breakable ? W < 0 ? console.warn(`[${f}] A chart with values below zero cannot break its scale.`) : e < 0 || t <= e || t > K || e === 0 && t === K ? console.warn(`[${f}] A break from ${e} to ${t} does not fit a scale that runs from 0 to ${V}.`) : s.length ? console.warn(`[${f}] A break from ${e} to ${t} would cut a step that floats. Keep it below or above the steps.`) : Y = {
1765
+ lo: e,
1766
+ hi: t,
1767
+ gap: n,
1768
+ share: a
1769
+ } : console.warn(`[${f}] This kind of chart cannot break its scale.`);
1619
1770
  }
1620
- let H = V ? V.gap : null, U = (V && At(t.figure, h, "--tablechart-break-gap", "")) ?? 13, G = x - M, te = F - I || 1, ne = (e) => G - (e - I) / te * P;
1621
- if (V) {
1622
- let { lo: e, hi: t, gap: n, share: r } = V, i = P * r, a = (P - i - U) / (e + (F - t)), o = i / (t - e);
1623
- ne = (r) => r <= e ? G - r * a : r <= n ? G - e * a - (r - e) * o : r <= t ? G - e * a - (r - e) * o - U : G - e * a - i - U - (r - t) * a;
1771
+ let ce = Y ? Y.gap : null, le = (Y && en(t.figure, S, "--tablechart-break-gap", "")) ?? 13, ue = P - re, de = K - q || 1, fe = (e) => ue - (e - q) / de * ie;
1772
+ if (Y) {
1773
+ let { lo: e, hi: t, gap: n, share: r } = Y, i = ie * r, a = (ie - i - le) / (e + (K - t)), o = i / (t - e);
1774
+ fe = (r) => r <= e ? ue - r * a : r <= n ? ue - e * a - (r - e) * o : r <= t ? ue - e * a - (r - e) * o - le : ue - e * a - i - le - (r - t) * a;
1624
1775
  }
1625
- let re = d.length ? N(d.map((e) => W(e).width)) * h + 12 * h : 0, ie = t.categories[0]?.parentElement;
1626
- ie && (ie.style.paddingRight = re ? `${re / _ * 100}%` : "");
1627
- let K = (_ - re) / a.length, oe = (e) => (e + .5) * K, se = (e) => e >= 0 && e < a.length ? e : null;
1628
- t.rowAt = o.centre ? null : o.categories === "beside" ? (e, t) => se(Math.floor(t * h / (x / a.length))) : (e) => se(Math.floor(e * h / K));
1629
- let ce = K / _ * 100, le = 100 / a.length;
1630
- t.rowBox = o.categories === "beside" ? (e) => [
1776
+ let pe, me, he = [];
1777
+ if (E) {
1778
+ let e = 6 * S, [t, n] = E.titles, r = (e) => e ? N(e).width * S : 0, i = (e) => e ? N(e).height * S : 0, a = O.filter((e) => e.dataset.axis === "x"), o = O.filter((e) => e.dataset.axis === "y"), s = i(O[0]), c = r(n) + U([0, ...o.map(r)]) + 2 * e, l = s / 2;
1779
+ me = [
1780
+ c,
1781
+ l,
1782
+ w - c - U([0, ...a.map(r)]) / 2,
1783
+ P - l - i(t) - s - 2 * e
1784
+ ];
1785
+ let [u, d, f, p] = me, [m, h] = D, g = (e) => u + (e - m.min) / (m.max - m.min || 1) * f, _ = (e) => d + p - (e - h.min) / (h.max - h.min || 1) * p;
1786
+ pe = g, fe = _;
1787
+ let v = (e) => r(a.find((t) => Number(t.dataset.value) === e));
1788
+ he = [it(m, (t) => t.every((n, r) => !r || g(n) - g(t[r - 1]) > (v(n) + v(t[r - 1])) / 2 + e)).ticks, it(h, (t) => t.every((n, r) => !r || _(t[r - 1]) - _(n) > s + e / 2)).ticks];
1789
+ for (let t of O) {
1790
+ let n = Number(t.dataset.value), r = t.dataset.axis === "x" ? 0 : 1, i = he[r].includes(n);
1791
+ t.dataset.place = i ? r ? "before" : "below" : "none", i && A(t, r ? u - e : g(n), r ? _(n) : d + p + e, w, P);
1792
+ }
1793
+ t && A(t, u + f / 2, P - i(t), w, P), n && A(n, 0, d + p / 2, w, P);
1794
+ }
1795
+ let ge = u.length ? U(u.map((e) => N(e).width)) * S + 12 * S : 0, _e = t.categories[0]?.parentElement;
1796
+ _e && (_e.style.paddingRight = ge ? `${ge / w * 100}%` : "");
1797
+ let ve = (w - ge) / a.length, ye = (e) => (e + .5) * ve, Se = (e) => e >= 0 && e < a.length ? e : null;
1798
+ t.rowAt = o.centre ? null : o.categories === "beside" ? (e, t) => Se(Math.floor(t * S / (P / a.length))) : (e) => Se(Math.floor(e * S / ve));
1799
+ let Ce = ve / w * 100, we = 100 / a.length;
1800
+ if (t.rowBox = o.categories === "beside" ? (e) => [
1631
1801
  0,
1632
- e * le,
1802
+ e * we,
1633
1803
  100,
1634
- le
1804
+ we
1635
1805
  ] : (e) => [
1636
- e * ce,
1806
+ e * Ce,
1637
1807
  0,
1638
- ce,
1808
+ Ce,
1639
1809
  100
1640
- ], i.setAttribute("viewBox", `0 0 ${_} ${C(x)}`), i.textContent = "", t.checks = [];
1641
- let J = {
1810
+ ], i.setAttribute("viewBox", `0 0 ${w} ${B(P)}`), i.textContent = "", me && pe) {
1811
+ let [e, r, a, o] = me, [s, c] = he, l = pe;
1812
+ Ht(t.figure, "data-chart-grid", n.grid) && i.appendChild(L("path", {
1813
+ class: p,
1814
+ d: [...s.map((e) => `M${B(l(e))},${B(r)}V${B(r + o)}`), ...c.map((t) => `M${B(e)},${B(fe(t))}H${B(e + a)}`)].join("")
1815
+ })), i.appendChild(L("path", {
1816
+ class: ne,
1817
+ d: [
1818
+ `M${B(e)},${B(r)}V${B(r + o)}H${B(e + a)}`,
1819
+ ...s.map((e) => `M${B(l(e))},${B(r + o)}v${B(4 * S)}`),
1820
+ ...c.map((t) => `M${B(e)},${B(fe(t))}h${B(-4 * S)}`)
1821
+ ].join("")
1822
+ }));
1823
+ }
1824
+ t.checks = [];
1825
+ let Te = {
1642
1826
  rows: a,
1643
- segments: T,
1644
- cx: oe,
1645
- y: ne,
1646
- barWidth: Math.min(K * n.barfill, jt(t.figure, h)),
1647
- barMax: jt(t.figure, h),
1648
- height: x,
1649
- unit: h,
1650
- labelHeight: y,
1651
- badgeHeight: b,
1827
+ segments: I,
1828
+ cx: ye,
1829
+ y: fe,
1830
+ x: pe,
1831
+ frame: me,
1832
+ length: (e, n) => en(t.figure, S, e, n),
1833
+ barWidth: Math.min(ve * n.barfill, tn(t.figure, S)),
1834
+ barMax: tn(t.figure, S),
1835
+ height: P,
1836
+ unit: S,
1837
+ labelHeight: j,
1838
+ badgeHeight: M,
1652
1839
  after: a.length,
1653
1840
  note: 0,
1654
1841
  labels: t.figure.dataset.chartLabels === "inside" || t.figure.dataset.chartLabels !== "outside" && n.labels === "inside" ? "inside" : "outside",
1655
- insideAlign: kt(t.figure),
1656
- breakAt: H,
1657
- squeeze: V,
1658
- breakGap: U,
1842
+ insideAlign: $t(t.figure),
1843
+ breakAt: ce,
1844
+ squeeze: Y,
1845
+ breakGap: le,
1846
+ domain: b ? [b.min, b.max] : null,
1659
1847
  stacked: t.stacked,
1660
- shape: yt(t.figure, n),
1848
+ shape: Wt(t.figure, n),
1661
1849
  totals: t.totals,
1662
1850
  svg: i,
1663
1851
  plot: r,
1664
1852
  values: s,
1665
1853
  series: c,
1666
- seriesValues: u,
1667
- names: d,
1854
+ seriesValues: l,
1855
+ names: u,
1668
1856
  categories: t.categories,
1669
1857
  centre: t.centre,
1670
1858
  config: n,
1671
- checks: t.checks
1859
+ checks: t.checks,
1860
+ taken: []
1672
1861
  };
1673
- r.style.setProperty("--count", String(Math.max(1, ...a.map((e) => e.slot + 1)))), o.draw(J);
1674
- for (let [e, n] of p.entries()) {
1862
+ if (r.style.setProperty("--count", String(Math.max(1, ...a.map((e) => e.slot + 1)))), o.draw(Te), Te.rowAt && (t.rowAt = Te.rowAt), v && b) {
1863
+ let e = 6 * S, r = _ && Te.x ? Te.x : fe, a = Array.from(v.ticks.children), o = (e) => N(a.find((t) => Number(t.dataset.value) === e) ?? a[0]), s = it(b, (t) => t.every((n, i) => !i || (_ ? r(n) - r(t[i - 1]) > (o(n).width + o(t[i - 1]).width) / 2 * S + e : r(t[i - 1]) - r(n) > o(n).height * S + e / 2))).ticks.filter((e) => !Y || e <= Y.lo || e >= Y.hi);
1864
+ for (let t of a) {
1865
+ let n = Number(t.dataset.value), i = v.numbers && s.includes(n);
1866
+ t.dataset.place = i ? _ ? "below" : "before" : "none", i && A(t, _ ? r(n) : -e, _ ? P + e : r(n), w, P);
1867
+ }
1868
+ let c = w - ge;
1869
+ Ht(t.figure, "data-chart-grid", n.grid) && i.prepend(L("path", {
1870
+ class: p,
1871
+ d: s.map((e) => _ ? `M${B(r(e))},0V${B(P)}` : `M0,${B(r(e))}H${B(c)}`).join("")
1872
+ })), v.numbers && i.appendChild(L("path", {
1873
+ class: ne,
1874
+ d: [_ ? `M${B(r(b.min))},${B(P)}H${B(r(b.max))}` : `M0,${B(r(b.max))}V${B(r(b.min))}`, ...s.map((e) => _ ? `M${B(r(e))},${B(P)}v${B(4 * S)}` : `M0,${B(r(e))}h${B(-4 * S)}`)].join("")
1875
+ }));
1876
+ }
1877
+ for (let [e, n] of d.entries()) {
1675
1878
  n.badge?.setAttribute("data-note", String(e + 1));
1676
1879
  let r = n.series, i = (e) => ({
1677
1880
  ...e,
1678
1881
  ...e.cells[r] ?? e.cells[0]
1679
1882
  });
1680
1883
  n.type.draw(n.spec, n.badge, {
1681
- ...J,
1884
+ ...Te,
1682
1885
  ...t.stacked && {
1683
- rows: S,
1886
+ rows: F,
1684
1887
  ...t.totals.length && { values: t.totals }
1685
1888
  },
1686
1889
  ...r > 0 && !t.stacked && {
1687
1890
  rows: a.map(i),
1688
- segments: T.map((e) => {
1891
+ segments: I.map((e) => {
1689
1892
  let t = i(e);
1690
1893
  return e.kind === "bar" ? {
1691
1894
  ...t,
1692
1895
  to: t.value
1693
1896
  } : t;
1694
1897
  }),
1695
- values: u[r]
1898
+ values: l[r]
1696
1899
  },
1697
1900
  after: n.after,
1698
1901
  note: e + 1
1699
1902
  });
1700
1903
  }
1701
- Ve(t);
1702
- let ue = t.categories[0]?.parentElement;
1703
- ue && o.categories !== "beside" && !o.centre && de(ue, t.categories.filter((e) => e.offsetParent !== null), (e) => ({
1904
+ ct(t);
1905
+ let Ee = t.categories[0]?.parentElement;
1906
+ Ee && o.categories !== "beside" && !o.centre && Oe(Ee, t.categories.filter((e) => e.offsetParent !== null), (e) => ({
1704
1907
  size: e.scrollWidth,
1705
1908
  room: e.clientWidth
1706
- }), "--_name-fit"), k(i, p.flatMap(({ badge: e }) => {
1707
- if (!(e instanceof HTMLElement) || !e.offsetWidth) return [];
1708
- let t = e.offsetWidth * h, n = e.offsetHeight * h, r = Number.parseFloat(e.style.left) / 100 * _, i = Number.parseFloat(e.style.top) / 100 * x, a = getComputedStyle(e).borderTopLeftRadius, o = a.endsWith("%") ? Number.parseFloat(a) / 100 : null, s = (Number.parseFloat(a) || 0) * h;
1709
- return [w("rect", {
1710
- class: l,
1909
+ }), "--_name-fit");
1910
+ let De = d.flatMap(({ badge: t }) => {
1911
+ if (!(t instanceof HTMLElement) || !t.offsetWidth) return [];
1912
+ let n = t.offsetWidth * S, r = t.offsetHeight * S, i = Number.parseFloat(t.style.left) / 100 * w, a = Number.parseFloat(t.style.top) / 100 * P, o = getComputedStyle(t).borderTopLeftRadius, s = o.endsWith("%") ? Number.parseFloat(o) / 100 : null, c = (Number.parseFloat(o) || 0) * S;
1913
+ return [L("rect", {
1914
+ class: e,
1711
1915
  "data-for": "badge",
1712
- "data-note": e.dataset.note ?? "",
1713
- x: r - t / 2,
1714
- y: i - n / 2,
1715
- width: t,
1716
- height: n,
1717
- rx: o === null ? s : t * o,
1718
- ry: o === null ? s : n * o,
1719
- style: ["--after", "--step"].map((t) => e.style.getPropertyValue(t) && `${t}:${e.style.getPropertyValue(t)}`).filter(Boolean).join("; ")
1916
+ "data-note": t.dataset.note ?? "",
1917
+ x: i - n / 2,
1918
+ y: a - r / 2,
1919
+ width: n,
1920
+ height: r,
1921
+ rx: s === null ? c : n * s,
1922
+ ry: s === null ? c : r * s,
1923
+ style: ["--after", "--step"].map((e) => t.style.getPropertyValue(e) && `${e}:${t.style.getPropertyValue(e)}`).filter(Boolean).join("; ")
1720
1924
  })];
1721
- }), _, x);
1722
- let fe = (e) => e.dataset.missing !== void 0 || o.centre && a[Number(e.dataset.row) - 1]?.isTotal, pe = (e) => e.dataset.place !== "none" && !e.hasAttribute("data-left-out"), me = (e, t) => {
1925
+ }), ke = i.querySelector(`.${p}`);
1926
+ if (ke) {
1927
+ let n = r.getBoundingClientRect(), a = w / n.width, s = getComputedStyle(r), c = Number.parseFloat(s.lineHeight) / Number.parseFloat(s.fontSize) || 1.2, u = [
1928
+ ...l.flat(),
1929
+ ...t.totals,
1930
+ ...o.categories === "beside" ? t.categories : []
1931
+ ].flatMap((t) => {
1932
+ if (t.dataset.place === "none" || t.hidden || t.hasAttribute("data-left-out")) return [];
1933
+ let r = t.getBoundingClientRect(), i = r.height * a / c, o = Array.from(t.style).filter((e) => e.startsWith("--")).map((e) => `${e}:${t.style.getPropertyValue(e)}`);
1934
+ return r.width ? [L("rect", {
1935
+ class: e,
1936
+ "data-for": "text",
1937
+ x: (r.left - n.left) * a - 3 * S,
1938
+ y: (r.top - n.top) * a + (r.height * a - i) / 2 - S,
1939
+ width: r.width * a + 6 * S,
1940
+ height: i + 2 * S,
1941
+ style: o.join("; ")
1942
+ })] : [];
1943
+ });
1944
+ te(i, u, w, P, ke);
1945
+ }
1946
+ te(i, De, w, P);
1947
+ let Ae = (e) => e.dataset.missing !== void 0 || o.centre && a[Number(e.dataset.row) - 1]?.isTotal, je = (e) => e.dataset.place !== "none" && !e.hasAttribute("data-left-out"), Me = (e, t) => {
1723
1948
  let n = Number(e.dataset.row);
1724
- return t.some((e) => pe(e) && Number(e.dataset.row) <= n && n <= Number(e.dataset.rowEnd ?? e.dataset.row));
1949
+ return t.some((e) => je(e) && Number(e.dataset.row) <= n && n <= Number(e.dataset.rowEnd ?? e.dataset.row));
1725
1950
  };
1726
- return t.figure.toggleAttribute("data-left-out", [...u, t.totals].some((e) => e.some((t) => !fe(t) && !pe(t) && !me(t, e)))), !0;
1727
- }, Nt = (e, t) => {
1951
+ return t.figure.toggleAttribute("data-left-out", (o.columns ? [t.categories] : [...l, t.totals]).some((e) => e.some((t) => !Ae(t) && !je(t) && !Me(t, e)))), !0;
1952
+ }, rn = (e, t) => {
1728
1953
  let n = [
1729
1954
  ...e.seriesValues.flat(),
1730
1955
  ...e.totals,
1731
1956
  ...e.totalCell ? [e.totalCell] : []
1732
1957
  ];
1733
- for (let r of e.centre ? [...n, e.centre] : n) {
1734
- let { missing: n, prefix: i = "", suffix: a = "" } = r.dataset;
1735
- if (n !== void 0) {
1736
- r.textContent = n;
1737
- continue;
1738
- }
1739
- let [o, s] = I(Number.parseFloat(r.dataset.value || "0"), r.dataset.decimals ? Number(r.dataset.decimals) : e.decimals, t.locale);
1740
- if (r.textContent = i + (i ? o : "") + s + a, o && !i) {
1741
- let e = document.createElement("span");
1742
- e.className = "tablechart-minus", e.textContent = o, r.prepend(e);
1743
- }
1958
+ for (let r of e.centre ? [...n, e.centre] : n) r.dataset.missing === void 0 ? an(r, r.dataset.decimals ? Number(r.dataset.decimals) : e.decimals, t.locale) : r.textContent = r.dataset.missing;
1959
+ }, an = (e, t, n) => {
1960
+ let { prefix: r = "", suffix: i = "" } = e.dataset, [o, s] = I(Number.parseFloat(e.dataset.value || "0"), t, n);
1961
+ if (e.textContent = r + (r ? o : "") + s + i, o && !r) {
1962
+ let t = document.createElement("span");
1963
+ t.className = a, t.textContent = o, e.prepend(t);
1744
1964
  }
1745
- }, Pt = (e) => {
1746
- pt(e), e.plot.remove(), e.categories[0]?.parentElement?.remove(), e.figure.querySelector(`:scope > .${c}`)?.remove(), e.controls?.remove();
1747
- }, Ft = (e, t) => {
1748
- e.figure.classList.toggle(m, t);
1749
- }, It = (e) => e === "id" || e === "style" || e.startsWith("data-chart"), Lt = /^\s*(?:Table)?:\s+/, Rt = (e) => e?.tagName === "P" && Lt.test(e.textContent ?? ""), zt = (e) => {
1965
+ }, on = (e) => {
1966
+ Ft(e), e.plot.remove(), e.categories[0]?.parentElement?.remove(), e.figure.querySelector(`:scope > .${d}`)?.remove(), e.controls?.remove();
1967
+ }, sn = (e, t) => {
1968
+ e.figure.classList.toggle(l, t);
1969
+ }, cn = (e) => e === "id" || e === "style" || e.startsWith("data-chart"), ln = /^\s*(?:Table)?:\s+/, un = (e) => e?.tagName === "P" && ln.test(e.textContent ?? ""), dn = (e) => {
1750
1970
  let t = document.createElement("figcaption");
1751
1971
  for (let { name: n, value: r } of Array.from(e.attributes)) t.setAttribute(n, r);
1752
1972
  let n = e.firstChild;
1753
- n?.nodeType === Node.TEXT_NODE && (n.textContent = (n.textContent ?? "").replace(Lt, ""), n.textContent || n.remove());
1973
+ n?.nodeType === Node.TEXT_NODE && (n.textContent = (n.textContent ?? "").replace(ln, ""), n.textContent || n.remove());
1754
1974
  let r = Array.from(e.childNodes), i = r.findIndex((e) => e.nodeName === "BR");
1755
1975
  if (t.append(...i === -1 ? r : r.slice(0, i + 1)), i !== -1 && i < r.length - 1) {
1756
1976
  let e = document.createElement("span");
1757
1977
  e.append(...r.slice(i + 1)), t.append(e);
1758
1978
  }
1759
1979
  return e.remove(), t;
1760
- }, Bt = /^\s*([a-z][\w-]*)((?:\s+[\w-]+=[^\s:]+)*)\s*(:\s*|$)/, Vt = (e) => {
1761
- let t = Yt(e);
1980
+ }, fn = /^\s*([a-z][\w-]*)((?:\s+[\w-]+=[^\s:]+)*)\s*(:\s*|$)/, pn = (e) => {
1981
+ let t = xn(e);
1762
1982
  return t?.tagName === "P" ? t : e;
1763
- }, Ht = (e) => {
1764
- let t = Vt(e).firstChild;
1983
+ }, mn = (e) => {
1984
+ let t = pn(e).firstChild;
1765
1985
  if (t?.nodeType !== Node.TEXT_NODE) return null;
1766
- let n = Bt.exec(t.textContent ?? "");
1767
- if (!n || !gt.includes(n[1]) || !n[3] && t.nextSibling) return null;
1986
+ let n = fn.exec(t.textContent ?? "");
1987
+ if (!n || !zt.includes(n[1]) || !n[3] && t.nextSibling) return null;
1768
1988
  let r = n[2].trim().split(/\s+/).filter(Boolean).map((e) => e.split("="));
1769
1989
  return {
1770
1990
  name: n[1],
@@ -1772,11 +1992,11 @@ var Te = (e) => e.map((e) => ({
1772
1992
  text: t,
1773
1993
  length: n[0].length
1774
1994
  };
1775
- }, Ut = (e) => {
1995
+ }, hn = (e) => {
1776
1996
  if (e?.tagName !== "UL" && e?.tagName !== "OL") return null;
1777
- let t = Array.from(e.children), n = t.map((e) => e.hasAttribute("data-annotation") ? null : Ht(e));
1997
+ let t = Array.from(e.children), n = t.map((e) => e.hasAttribute("data-annotation") ? null : mn(e));
1778
1998
  return !t.length || t.some((e, t) => !n[t] && !e.hasAttribute("data-annotation")) ? null : (t.forEach((e, t) => {
1779
- let r = n[t], i = Vt(e);
1999
+ let r = n[t], i = pn(e);
1780
2000
  if (i !== e && i.replaceWith(...i.childNodes), r) {
1781
2001
  e.setAttribute("data-annotation", r.name);
1782
2002
  for (let [t, n] of r.options) e.setAttribute(`data-${t}`, n);
@@ -1784,21 +2004,21 @@ var Te = (e) => e.map((e) => ({
1784
2004
  }
1785
2005
  e.children.length && Array.from(e.childNodes).filter((e) => e.nodeType === Node.ELEMENT_NODE || e.textContent?.trim()).forEach((e, t) => {
1786
2006
  let n = document.createElement("span");
1787
- t === 0 && e instanceof HTMLElement && e.matches("em, i") ? (n.className = "tablechart-caption", n.append(...e.childNodes), e.replaceWith(n)) : e.nodeType === Node.TEXT_NODE && (n.textContent = (e.textContent ?? "").trim(), e.replaceWith(n));
2007
+ t === 0 && e instanceof HTMLElement && e.matches("em, i") ? (n.className = re, n.append(...e.childNodes), e.replaceWith(n)) : e.nodeType === Node.TEXT_NODE && (n.textContent = (e.textContent ?? "").trim(), e.replaceWith(n));
1788
2008
  });
1789
2009
  }), e.classList.add("chart-annotations"), e);
1790
- }, Wt = (e, t) => {
1791
- for (let { name: n, value: r } of Array.from(e.attributes)) (n === "class" || It(n)) && (t.setAttribute(n, r), e.removeAttribute(n));
1792
- }, Gt = (e) => e.map((e) => {
1793
- let t = e.closest("p"), n = Rt(t) ? t : e;
2010
+ }, gn = (e, t) => {
2011
+ for (let { name: n, value: r } of Array.from(e.attributes)) (n === "class" || cn(n)) && (t.setAttribute(n, r), e.removeAttribute(n));
2012
+ }, _n = (e) => e.map((e) => {
2013
+ let t = e.closest("p"), n = un(t) ? t : e;
1794
2014
  if (n.tagName !== "TABLE" && n.tagName !== "P") return n;
1795
2015
  let r = document.createElement("figure");
1796
- Wt(e, r), e.classList.length || e.removeAttribute("class");
1797
- let i = n.tagName === "TABLE" ? n : null, a = n.previousElementSibling, o = n.nextElementSibling, s = i ? Rt(a) ? a : Rt(o) ? o : null : n;
2016
+ gn(e, r), e.classList.length || e.removeAttribute("class");
2017
+ let i = n.tagName === "TABLE" ? n : null, a = n.previousElementSibling, o = n.nextElementSibling, s = i ? un(a) ? a : un(o) ? o : null : n;
1798
2018
  i && s === o && (o = o?.nextElementSibling ?? null);
1799
- let c = o?.classList.contains("chart-annotations") ? o : Ut(o);
1800
- return n.replaceWith(r), s && r.append(zt(s)), i && r.append(i), c && r.append(c), X?.log?.(`A ${i ? "table" : "caption"} with chart attributes was wrapped in a figure of its own`), r;
1801
- }), Kt = (e, t, n, r = document.createElement("table")) => {
2019
+ let c = o?.classList.contains("chart-annotations") ? o : hn(o);
2020
+ return n.replaceWith(r), s && r.append(dn(s)), i && r.append(i), c && r.append(c), Z?.log?.(`A ${i ? "table" : "caption"} with chart attributes was wrapped in a figure of its own`), r;
2021
+ }), vn = (e, t, n, r = document.createElement("table")) => {
1802
2022
  for (let e of r.querySelectorAll(":scope > tbody, :scope > tfoot, :scope > tr")) e.remove();
1803
2023
  if (!r.tHead && (t.length || n)) {
1804
2024
  let e = r.createTHead().insertRow(), i = document.createElement("th");
@@ -1818,7 +2038,7 @@ var Te = (e) => e.map((e) => ({
1818
2038
  for (let n of t.values ?? [t.value ?? null]) e.insertCell().textContent = n === null ? "" : String(n);
1819
2039
  }
1820
2040
  return r;
1821
- }, qt = (e) => {
2041
+ }, yn = (e) => {
1822
2042
  if (!e || typeof e != "object") return;
1823
2043
  let t = Object.entries(e), n = (e) => e === null || typeof e == "string" || typeof e == "number";
1824
2044
  if (t.length && t.every(([, e]) => n(e) || Array.isArray(e) && e.every(n))) return t.map(([e, t]) => Array.isArray(t) ? {
@@ -1828,30 +2048,30 @@ var Te = (e) => e.map((e) => ({
1828
2048
  label: e,
1829
2049
  value: t
1830
2050
  });
1831
- }, Jt = async (t) => {
1832
- await Promise.all(t.filter((e) => e.hasAttribute("data-chart-src")).map(async (t) => {
1833
- let n = t.getAttribute("data-chart-src"), r = Array.from(t.querySelectorAll("table")).find((e) => e.tHead) ?? null;
1834
- for (let e of t.querySelectorAll("table")) e !== r && e.remove();
2051
+ }, bn = async (e) => {
2052
+ await Promise.all(e.filter((e) => e.hasAttribute("data-chart-src")).map(async (e) => {
2053
+ let t = e.getAttribute("data-chart-src"), n = Array.from(e.querySelectorAll("table")).find((e) => e.tHead) ?? null;
2054
+ for (let t of e.querySelectorAll("table")) t !== n && t.remove();
1835
2055
  try {
1836
- let e = await fetch(n);
1837
- if (!e.ok) throw Error(`${e.status} ${e.statusText}`);
1838
- let i = await e.json(), a = Array.isArray(i) ? i : i?.rows ? Array.isArray(i.rows) ? i.rows : qt(i.rows) : qt(i);
2056
+ let r = await fetch(t);
2057
+ if (!r.ok) throw Error(`${r.status} ${r.statusText}`);
2058
+ let i = await r.json(), a = Array.isArray(i) ? i : i?.rows ? Array.isArray(i.rows) ? i.rows : yn(i.rows) : yn(i);
1839
2059
  if (!Array.isArray(a)) throw Error("no rows in it: a list of rows, an object with rows, or names with their values");
1840
- let o = Kt(a, Array.isArray(i?.series) ? i.series.map(String) : [], typeof i?.label == "string" ? i.label : "", r ?? void 0);
1841
- if (!r) {
1842
- let e = t.querySelector(":scope > figcaption");
1843
- e ? e.after(o) : t.prepend(o);
2060
+ let o = vn(a, Array.isArray(i?.series) ? i.series.map(String) : [], typeof i?.label == "string" ? i.label : "", n ?? void 0);
2061
+ if (!n) {
2062
+ let t = e.querySelector(":scope > figcaption");
2063
+ t ? t.after(o) : e.prepend(o);
1844
2064
  }
1845
- o.tHead || X?.log?.(`The table from "${n}" has no header row, so a screen reader cannot name its columns.`), X?.log?.(`Read ${a.length} rows from "${n}"`);
1846
- } catch (t) {
1847
- let r = window.location.protocol === "file:";
1848
- console.warn(`[${e}] Could not read the chart data in "${n}": ${t.message}.` + (r ? " A page opened as a file cannot fetch files; open it from a server." : ""));
2065
+ o.tHead || Z?.log?.(`The table from "${t}" has no header row, so a screen reader cannot name its columns.`), Z?.log?.(`Read ${a.length} rows from "${t}"`);
2066
+ } catch (e) {
2067
+ let n = window.location.protocol === "file:";
2068
+ console.warn(`[${f}] Could not read the chart data in "${t}": ${e.message}.` + (n ? " A page opened as a file cannot fetch files; open it from a server." : ""));
1849
2069
  }
1850
2070
  }));
1851
- }, Yt = (e) => {
2071
+ }, xn = (e) => {
1852
2072
  let t = Array.from(e.childNodes).filter((e) => e.nodeType === Node.ELEMENT_NODE || e.nodeType === Node.TEXT_NODE && e.textContent?.trim());
1853
2073
  return t.length === 1 && t[0] instanceof HTMLElement ? t[0] : null;
1854
- }, Xt = "strong, b, span.total", Zt = (e) => {
2074
+ }, Sn = "strong, b, span.total", Cn = (e) => {
1855
2075
  for (let t of e) {
1856
2076
  for (let e of t.querySelectorAll("tbody tr")) {
1857
2077
  let t = e.cells[0];
@@ -1859,16 +2079,16 @@ var Te = (e) => e.map((e) => ({
1859
2079
  let n = document.createElement("th");
1860
2080
  for (let { name: e, value: r } of Array.from(t.attributes)) n.setAttribute(e, r);
1861
2081
  n.append(...t.childNodes), t.replaceWith(n);
1862
- for (let t = Yt(n); t?.matches(Xt); t = Yt(n)) e.dataset.kind = "total", t.replaceWith(...t.childNodes);
2082
+ for (let t = xn(n); t?.matches(Sn); t = xn(n)) e.dataset.kind = "total", t.replaceWith(...t.childNodes);
1863
2083
  }
1864
2084
  let e = Array.from(t.querySelector("thead tr:last-child")?.children ?? []);
1865
- for (let t of e.slice(1)) for (let e = Yt(t); e?.matches(Xt); e = Yt(t)) t.setAttribute("data-kind", "focus"), e.replaceWith(...e.childNodes);
2085
+ for (let t of e.slice(1)) for (let e = xn(t); e?.matches(Sn); e = xn(t)) t.setAttribute("data-kind", "focus"), e.replaceWith(...e.childNodes);
1866
2086
  }
1867
- }, Qt = "data-chart-made", $t = () => window.matchMedia("(prefers-reduced-motion: reduce)").matches, en = (e) => new Promise((t) => setTimeout(t, e)), tn = (e, t) => {
2087
+ }, wn = "data-chart-made", Tn = () => window.matchMedia("(prefers-reduced-motion: reduce)").matches, En = (e) => new Promise((t) => setTimeout(t, e)), Dn = (e, t) => {
1868
2088
  let n = Number.parseFloat(e.dataset.chartEntrance ?? ""), r = Number.isFinite(n) ? n : t.entrance;
1869
2089
  return Math.min(Math.max(r, 0), 1);
1870
- }, nn = async (e, t) => {
1871
- if ($t()) return;
2090
+ }, On = async (e, t) => {
2091
+ if (Tn()) return;
1872
2092
  await new Promise(requestAnimationFrame);
1873
2093
  let n = e.getAnimations().filter((e) => e instanceof CSSAnimation);
1874
2094
  for (let t = e.parentElement; t && t !== document.body; t = t.parentElement) n.push(...t.getAnimations());
@@ -1879,11 +2099,11 @@ var Te = (e) => e.map((e) => ({
1879
2099
  let a = Number(n.delay ?? 0) + i * t;
1880
2100
  r = Math.max(r, a - Number(e.currentTime ?? 0));
1881
2101
  }
1882
- r > 0 && await en(r);
1883
- }, rn = (e) => {
2102
+ r > 0 && await En(r);
2103
+ }, kn = (e) => {
1884
2104
  for (let t = e; t && t !== document.body; t = t.parentElement) if (getComputedStyle(t).opacity === "0") return t;
1885
2105
  return null;
1886
- }, an = (e) => new Promise((t) => {
2106
+ }, An = (e) => new Promise((t) => {
1887
2107
  let n = ["animationstart", "transitionrun"], r = () => {
1888
2108
  for (let e of n) document.removeEventListener(e, i, !0);
1889
2109
  a.disconnect(), t();
@@ -1897,41 +2117,41 @@ var Te = (e) => e.map((e) => ({
1897
2117
  attributes: !0,
1898
2118
  attributeFilter: ["class", "style"]
1899
2119
  });
1900
- }), on = /* @__PURE__ */ new Set(), sn = null, cn = (e) => {
1901
- on.add(e), !sn && (sn = new MutationObserver(() => {
1902
- for (let e of on) e.relabel();
2120
+ }), jn = /* @__PURE__ */ new Set(), Mn = null, Nn = (e) => {
2121
+ jn.add(e), !Mn && (Mn = new MutationObserver(() => {
2122
+ for (let e of jn) e.relabel();
1903
2123
  requestAnimationFrame(() => requestAnimationFrame(() => {
1904
- for (let e of on) e.refresh();
2124
+ for (let e of jn) e.refresh();
1905
2125
  }));
1906
- }), sn.observe(document.documentElement, {
2126
+ }), Mn.observe(document.documentElement, {
1907
2127
  attributes: !0,
1908
2128
  attributeFilter: ["lang"]
1909
2129
  }));
1910
- }, ln = (e) => {
1911
- on.delete(e), !on.size && sn && (sn.disconnect(), sn = null);
1912
- }, un = ["column", "bar"], dn = (e) => {
2130
+ }, Pn = (e) => {
2131
+ jn.delete(e), !jn.size && Mn && (Mn.disconnect(), Mn = null);
2132
+ }, Fn = ["column", "bar"], In = (e) => {
1913
2133
  let t = e.getAttribute("data-chart") || "column";
1914
- if (!un.includes(t)) return null;
2134
+ if (!Fn.includes(t)) return null;
1915
2135
  let n = getComputedStyle(e).getPropertyValue("--tablechart-type").trim();
1916
- return un.includes(n) ? n : t;
1917
- }, fn = (e, t) => {
1918
- let n = e, r = dn(n.figure), i = null, a = !1, o = !1, s = async () => {
1919
- if (!t.animate) return Ft(n, !0);
2136
+ return Fn.includes(n) ? n : t;
2137
+ }, Ln = (e, t) => {
2138
+ let n = e, r = In(n.figure), i = null, a = !1, o = !1, s = async () => {
2139
+ if (!Ut(n.figure, t)) return sn(n, !0);
1920
2140
  let e = n.figure.classList.contains("is-shown");
1921
2141
  if (a && i !== null && !e && !o) {
1922
2142
  o = !0;
1923
- let e = $t() ? null : rn(n.figure);
1924
- e && await an(e), await nn(n.figure, tn(n.figure, t)), o = !1, (a || !t.replay) && Ft(n, !0);
1925
- } else !a && t.replay && e && Ft(n, !1);
2143
+ let e = Tn() ? null : kn(n.figure);
2144
+ e && await An(e), await On(n.figure, Dn(n.figure, t)), o = !1, (a || !t.replay) && sn(n, !0);
2145
+ } else !a && t.replay && e && sn(n, !1);
1926
2146
  }, c = () => {
1927
- let e = dn(n.figure);
2147
+ let e = In(n.figure);
1928
2148
  if (!e || e === r) return;
1929
- let a = X.timed("Building", n.figure, () => wt(n.figure, t, e));
1930
- a && (Pt(n), He(a, n.step, !0), n = a, r = e, i = null);
2149
+ let a = Z.timed("Building", n.figure, () => Yt(n.figure, t, e));
2150
+ a && (on(n), lt(a, n.step, !0), n = a, r = e, i = null);
1931
2151
  }, l = () => {
1932
2152
  c();
1933
2153
  let e = n.plot.clientWidth;
1934
- e && e !== i && X.timed("Layout", n.figure, () => Mt(n, t)) && (i = e, s());
2154
+ e && e !== i && Z.timed("Layout", n.figure, () => nn(n, t)) && (i = e, s());
1935
2155
  }, u = !1, d = new ResizeObserver(() => {
1936
2156
  u || (u = !0, requestAnimationFrame(() => {
1937
2157
  u = !1, l();
@@ -1939,20 +2159,20 @@ var Te = (e) => e.map((e) => ({
1939
2159
  }), f = new IntersectionObserver((e) => {
1940
2160
  for (let t of e) a = t.isIntersecting, s();
1941
2161
  }, { threshold: t.threshold }), p = () => {
1942
- n.figure.classList.add(h), Ft(n, !0), n.figure.offsetWidth;
1943
- }, m = () => n.figure.classList.remove(h), g = () => {
2162
+ n.figure.classList.add(b), sn(n, !0), n.figure.offsetWidth;
2163
+ }, m = () => n.figure.classList.remove(b), h = () => {
1944
2164
  i = null, l();
1945
- }, _ = {
1946
- relabel: () => Nt(n, t),
1947
- refresh: g
2165
+ }, g = {
2166
+ relabel: () => rn(n, t),
2167
+ refresh: h
1948
2168
  };
1949
- c(), l(), d.observe(n.figure), f.observe(n.figure), window.addEventListener("beforeprint", p), window.addEventListener("afterprint", m), cn(_);
1950
- let v = {
2169
+ c(), l(), d.observe(n.figure), f.observe(n.figure), window.addEventListener("beforeprint", p), window.addEventListener("afterprint", m), Nn(g);
2170
+ let _ = {
1951
2171
  figure: n.figure,
1952
- refresh: g,
1953
- next: () => He(n, n.step + 1),
1954
- previous: () => He(n, n.step - 1),
1955
- stepTo: (e) => He(n, e),
2172
+ refresh: h,
2173
+ next: () => lt(n, n.step + 1),
2174
+ previous: () => lt(n, n.step - 1),
2175
+ stepTo: (e) => lt(n, e),
1956
2176
  get step() {
1957
2177
  return n.step;
1958
2178
  },
@@ -1960,86 +2180,44 @@ var Te = (e) => e.map((e) => ({
1960
2180
  return n.plan?.count ?? 0;
1961
2181
  },
1962
2182
  destroy() {
1963
- d.disconnect(), f.disconnect(), window.removeEventListener("beforeprint", p), window.removeEventListener("afterprint", m), ln(_), pt(n), n.figure.tablechart === v && delete n.figure.tablechart;
2183
+ d.disconnect(), f.disconnect(), window.removeEventListener("beforeprint", p), window.removeEventListener("afterprint", m), Pn(g), Ft(n), n.figure.tablechart === _ && delete n.figure.tablechart;
1964
2184
  }
1965
2185
  };
1966
- return n.figure.tablechart = v, v;
1967
- }, pn = !1, mn = (t) => {
1968
- let n = t.find((e) => e.tagName !== "FIGURE");
1969
- !pn && n && (pn = !0, console.warn(`[${e}] A chart is a <${n.tagName.toLowerCase()}>. Use a <figure> with a <figcaption>, so the chart has a title, also for screen readers.`, n));
1970
- }, hn = async (e, t) => {
1971
- let n = Gt(e.filter((e) => !e.hasAttribute(Qt)));
1972
- return mn(n), await Jt(n), Zt(n), Le(n, t.langattribute), n;
1973
- }, gn = (e, t) => {
1974
- let n = X.timed("Building", e, () => wt(e, t));
1975
- return n ? (e.setAttribute(Qt, ""), fn(n, t)) : null;
1976
- }, _n = async (e, t = {}) => {
2186
+ return n.figure.tablechart = _, _;
2187
+ }, Rn = !1, zn = (e) => {
2188
+ let t = e.find((e) => e.tagName !== "FIGURE");
2189
+ !Rn && t && (Rn = !0, console.warn(`[${f}] A chart is a <${t.tagName.toLowerCase()}>. Use a <figure> with a <figcaption>, so the chart has a title, also for screen readers.`, t));
2190
+ }, Bn = async (e, t) => {
2191
+ let n = _n(e.filter((e) => !e.hasAttribute(wn)));
2192
+ return zn(n), await bn(n), Cn(n), Ze(n, t.langattribute), n;
2193
+ }, Vn = (e, t) => {
2194
+ let n = Z.timed("Building", e, () => Yt(e, t));
2195
+ return n ? (e.setAttribute(wn, ""), Ln(n, t)) : null;
2196
+ }, Hn = async (e, t = {}) => {
1977
2197
  if (e.tablechart) return e.tablechart;
1978
2198
  let n = {
1979
- ...v,
2199
+ ...h,
1980
2200
  ...t
1981
2201
  };
1982
- n.debug && (X.enabled = !0);
1983
- let [r] = await hn([e], n);
1984
- return r ? gn(r, n) : null;
1985
- }, vn = [
1986
- ["--tablechart-duration", "--tablechart-animation-element-duration"],
1987
- ["--tablechart-stagger", "--tablechart-animation-stagger, a share of the element time"],
1988
- ["--tablechart-easing", "--tablechart-animation-ease"],
1989
- ["--tablechart-category-size", "--tablechart-name-size"],
1990
- ["--tablechart-category-padding", "--tablechart-name-padding"],
1991
- ["--tablechart-categories-gap", "--tablechart-name-gap"],
1992
- ["--tablechart-inside-align", "--tablechart-value-align"],
1993
- ["--tablechart-bar-ink", "--tablechart-bar-value-color"],
1994
- ["--tablechart-piece-ink", "--tablechart-piece-value-color"],
1995
- ["--tablechart-up-ink", "--tablechart-up-value-color"],
1996
- ["--tablechart-down-ink", "--tablechart-down-value-color"],
1997
- ["--tablechart-total-ink", "--tablechart-total-value-color"],
1998
- ["--tablechart-series-ink", "--tablechart-series-own-color"],
1999
- ["--tablechart-dash", "--tablechart-series-dash"],
2000
- ["--tablechart-dot", "--tablechart-series-dot"],
2001
- ["--tablechart-muted-share", "--tablechart-series-muted-share"],
2002
- ["--tablechart-rule-color", "--tablechart-baseline-color"],
2003
- ["--tablechart-rule-width", "--tablechart-baseline-width"],
2004
- ["--tablechart-rule-opacity", "--tablechart-baseline-opacity"],
2005
- ["--tablechart-key-size", "--tablechart-legend-key-size"],
2006
- ["--tablechart-controls-justify", "--tablechart-control-justify"],
2007
- ["--tablechart-controls-gap", "--tablechart-control-gap"]
2008
- ], yn = {
2009
- up: "grow",
2010
- across: "sweep"
2011
- }, bn = !1, xn = (t, n) => {
2012
- if (bn) return;
2013
- let r = (e) => {
2014
- let t = yn[String(e)];
2015
- return t ? [`"${e}" is now "${t}"`] : [];
2016
- }, i = new Set(r(n.animate));
2017
- n.hover !== void 0 && i.add("the \"hover\" option is now \"tooltip\"");
2018
- for (let e of t) {
2019
- e.hasAttribute("data-chart-hover") && i.add("data-chart-hover is now data-chart-tooltip");
2020
- let t = getComputedStyle(e);
2021
- for (let [e, n] of vn) t.getPropertyValue(e).trim() && i.add(`${e} is now ${n}`);
2022
- for (let t of r(e.getAttribute("data-chart-animate"))) i.add(t);
2023
- }
2024
- i.size && (bn = !0, console.warn(`[${e}] ${[...i].join("; ")}. The old names work until the next minor version.`));
2025
- }, Sn = async (e = {}, t = document) => {
2202
+ n.debug && (Z.enabled = !0);
2203
+ let [r] = await Bn([e], n);
2204
+ return r ? Vn(r, n) : null;
2205
+ }, Un = async (e = {}, t = document) => {
2026
2206
  let n = {
2027
- ...v,
2207
+ ...h,
2028
2208
  ...e
2029
2209
  };
2030
- n.debug && (X.enabled = !0);
2031
- let r = await hn(Array.from(t.querySelectorAll(n.selector)), n);
2032
- xn(r, n);
2033
- let i = r.map((e) => gn(e, n)).filter((e) => e !== null);
2034
- return X.log(`Made ${i.length} chart(s).`), {
2035
- charts: i,
2210
+ n.debug && (Z.enabled = !0);
2211
+ let r = (await Bn(Array.from(t.querySelectorAll(n.selector)), n)).map((e) => Vn(e, n)).filter((e) => e !== null);
2212
+ return Z.log(`Made ${r.length} chart(s).`), {
2213
+ charts: r,
2036
2214
  refresh: () => {
2037
- for (let e of i) e.refresh();
2215
+ for (let e of r) e.refresh();
2038
2216
  },
2039
2217
  destroy: () => {
2040
- for (let e of i) e.destroy();
2218
+ for (let e of r) e.destroy();
2041
2219
  }
2042
2220
  };
2043
2221
  };
2044
2222
  //#endregion
2045
- export { h as _, Gt as a, v as b, wt as c, Ft as d, Pt as f, t as g, f as h, hn as i, Mt as l, Le as m, tn as n, Jt as o, He as p, Sn as r, Zt as s, _n as t, Nt as u, g as v, m as y };
2223
+ export { _n as a, Lt as c, rn as d, sn as f, Ze as h, Bn as i, Yt as l, lt as m, Dn as n, bn as o, on as p, Un as r, Cn as s, Hn as t, nn as u };