@martinomagnifico/tablechart 1.0.1 → 1.0.3

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