@martinomagnifico/tablechart 0.1.2 → 1.0.0

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