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