@martinomagnifico/tablechart 1.0.3 → 1.0.4

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