@martinomagnifico/tablechart 0.1.3 → 1.0.1

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,185 +683,152 @@ 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 = /* @__PURE__ */ new Set(), ze = (t, n) => {
815
+ if (Math.abs(t - n) <= Math.abs(n) / 100) return;
816
+ let r = `[${e}] A total reads ${t}, but the steps before it add up to ${Number(n.toFixed(6))}. The chart shows what you wrote; this is only a check.`;
817
+ Re.has(r) || (Re.add(r), console.warn(r));
818
+ }, Be = {
823
819
  segments: (e) => {
824
- let t = 0;
820
+ let t = 0, n = !1;
825
821
  return e.map((e) => {
826
- if (e.isTotal) return t = e.value, {
822
+ if (e.isTotal) return n && ze(e.value, t), n = !1, t = e.value, {
827
823
  ...e,
828
824
  from: 0,
829
825
  to: e.value,
830
826
  kind: "total"
831
827
  };
832
- let n = t;
833
- return t += e.value, {
828
+ let r = t;
829
+ return t += e.value, n = !0, {
834
830
  ...e,
835
- from: n,
831
+ from: r,
836
832
  to: t,
837
833
  kind: e.value >= 0 ? "up" : "down"
838
834
  };
@@ -840,44 +836,53 @@ var Ae = (e) => e.map((e) => ({
840
836
  },
841
837
  breakable: !0,
842
838
  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);
839
+ draw({ segments: e, cx: t, y: n, barWidth: r, height: a, unit: c, svg: l, values: u, breakAt: d, closing: f, insideAlign: p }) {
840
+ let m = n(0), h = _e(u, r, c), g = p ?? "center", _ = e.map((t, r) => {
841
+ let i = n(Math.max(t.from, t.to)), a = Math.abs(n(t.from) - n(t.to)), o = d !== null && Math.min(t.from, t.to) < d && Math.max(t.from, t.to) > d;
842
+ return {
843
+ top: i,
844
+ length: a,
845
+ down: t.kind === "down" || t.kind === "total" && r > 0 && r === e.length - 1 && f === "down",
846
+ inside: !o && !h && ve(u[r], a, c)
847
+ };
848
+ }), v = u[0] ? Y(u[0]).height * c * .56 : 0, y = Infinity;
849
+ for (let [e, t] of _.entries()) t.inside && (y = Math.min(y, (r - Y(u[e]).width * c) / 2));
845
850
  e.forEach((i, a) => {
846
851
  let o = e[a + 1];
847
852
  if (!o) return;
848
853
  let c = n(i.to), u = t(a) + r / 2, d = t(a + 1) - r / 2;
849
- l.appendChild(N("line", {
854
+ l.appendChild(F("line", {
850
855
  class: s,
851
856
  x1: u,
852
857
  x2: d,
853
858
  y1: c,
854
859
  y2: c,
855
860
  "data-row": a + 2,
856
- style: j("--i", o.slot)
861
+ style: N("--i", o.slot)
857
862
  }));
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),
863
+ }), e.forEach((e, n) => {
864
+ let { top: o, length: s, down: d, inside: f } = _[n];
865
+ l.appendChild(F("rect", {
866
+ class: I(i, e),
862
867
  "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,
868
+ "data-row": n + 1,
869
+ "data-grow": d ? "down" : "up",
870
+ x: t(n) - r / 2,
871
+ y: o,
867
872
  width: r,
868
- height: Math.max(f, 1),
869
- style: j("--i", e.slot)
873
+ height: Math.max(s, 1),
874
+ style: N("--i", e.slot)
870
875
  }));
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", {
876
+ let p = u[n], m = Math.min(y, (s - v) / 2), h = o + m + v / 2, b = o + s - m - v / 2, x = g === "center" ? o + s / 2 : g === "end" === d ? b : h;
877
+ p.dataset.place = f ? "inside" : "outside", p.dataset.kind = e.kind;
878
+ let S = f ? x : e.kind === "down" ? o + s + Y(p).height * c + 3 * c : o - 3 * c;
879
+ R(p, t(n), S, j, a);
880
+ }), l.appendChild(F("line", {
876
881
  class: o,
877
882
  x1: 0,
878
- x2: k,
879
- y1: f,
880
- y2: f
883
+ x2: j,
884
+ y1: m,
885
+ y2: m
881
886
  }));
882
887
  }
883
888
  }, Z = {
@@ -890,7 +895,7 @@ var Ae = (e) => e.map((e) => ({
890
895
  let i = performance.now(), a = r(), o = performance.now() - i, s = n.querySelectorAll("tbody tr").length;
891
896
  return o > 50 ? console.warn(`[${e}] ${t} took ${o.toFixed(1)} ms for ${s} rows, more than 50 ms.`, n) : Z.log(`${t} took ${o.toFixed(1)} ms for ${s} rows.`, n), a;
892
897
  }
893
- }, Fe = (e) => {
898
+ }, Ve = (e) => {
894
899
  let t = (e?.textContent || "").trim(), n = t.match(/^(.*?)(-?\d+(?:[.,]\d+)?)(.*)$/);
895
900
  return {
896
901
  raw: t,
@@ -900,9 +905,9 @@ var Ae = (e) => e.map((e) => ({
900
905
  missing: !n,
901
906
  value: n ? Number.parseFloat(n[2].replace(",", ".")) : 0
902
907
  };
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)), {
908
+ }, He = (e, t = "data-i18n") => Array.from(e.querySelectorAll("tbody tr")).map((e, n) => {
909
+ let r = e.querySelector("th"), i = Array.from(e.querySelectorAll("td")).map(Ve);
910
+ return i.length || i.push(Ve(null)), {
906
911
  ...i[0],
907
912
  label: (r?.textContent || "").trim(),
908
913
  key: t && r?.getAttribute(t) || null,
@@ -911,8 +916,8 @@ var Ae = (e) => e.map((e) => ({
911
916
  isTotal: e.getAttribute("data-kind") === "total",
912
917
  slot: n
913
918
  };
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)));
919
+ }), Ue = (e) => Array.from(e.querySelector("thead tr:last-child")?.children ?? []).slice(1), We = (e) => e === "dashed" || e === "dotted" ? e : null, Ge = (e, t, n = "data-i18n") => {
920
+ let r = Ue(e), i = Math.max(1, U(t.map((e) => e.cells.length)));
916
921
  return Array.from({ length: i }, (e, t) => {
917
922
  let i = r[t];
918
923
  return {
@@ -920,10 +925,10 @@ var Ae = (e) => e.map((e) => ({
920
925
  key: n && i?.getAttribute(n) || null,
921
926
  focus: i?.getAttribute("data-kind") === "focus",
922
927
  marker: i?.getAttribute("data-marker") ?? null,
923
- line: Re(i?.getAttribute("data-line"))
928
+ line: We(i?.getAttribute("data-line"))
924
929
  };
925
930
  });
926
- }, Be = (t, n) => {
931
+ }, Ke = (t, n) => {
927
932
  if (!n) return;
928
933
  let r = /* @__PURE__ */ new Map();
929
934
  for (let i of t) {
@@ -936,40 +941,178 @@ var Ae = (e) => e.map((e) => ({
936
941
  i.querySelectorAll("tbody th").forEach((e, r) => {
937
942
  e.getAttribute(n) || e.setAttribute(n, `${t}-row${r + 1}`);
938
943
  });
939
- let a = Le(i);
944
+ let a = Ue(i);
940
945
  a.length > 1 && a.forEach((e, r) => {
941
946
  e.getAttribute(n) || e.setAttribute(n, `${t}-col${r + 1}`);
942
947
  }), Z?.log?.(`Keys for "${t}" written onto ${i.querySelectorAll("tbody th").length} rows`);
943
948
  }
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) => {
949
+ }, qe = [
950
+ "axis-break",
951
+ "trend",
952
+ "bracket"
953
+ ], Je = (e) => {
954
+ let t = e.hasAttribute("data-fragment"), n = Array.from(e.querySelectorAll("tbody tr")), r = Array.from(e.querySelector("thead tr:last-child")?.children ?? []).slice(1), i = Array.from(e.querySelectorAll("[data-annotation]")).filter((e) => qe.includes(e.getAttribute("data-annotation") ?? "")), a = (e) => e.hasAttribute("data-fragment");
955
+ if (!t && !n.some(a) && !r.some(a) && !i.some(a)) return null;
956
+ let o = [], s = /* @__PURE__ */ new Map(), c = [], l = (e) => {
957
+ let t = e === null ? void 0 : s.get(e);
958
+ return t === void 0 && (t = o.length, o.push(e), c.push(0), e !== null && s.set(e, t)), t;
959
+ }, u = 0, d = e.getAttribute("data-chart") === "donut", f = (e) => d && e.getAttribute("data-kind") === "total", p = n.map((e) => {
960
+ if (f(e)) return {
961
+ step: null,
962
+ slot: 0
963
+ };
964
+ if (!t && !a(e)) return {
965
+ step: null,
966
+ slot: u++
967
+ };
968
+ let n = l(e.getAttribute("data-fragment-index"));
969
+ return {
970
+ step: n,
971
+ slot: c[n]++
972
+ };
973
+ }), m = Math.max(-1, ...p.map((e) => e.step ?? -1));
974
+ if (m >= 0) for (let [e, t] of n.entries()) f(t) && (p[e] = {
975
+ step: m,
976
+ slot: c[m]++
977
+ });
978
+ let h = r.map((e) => ({ step: a(e) ? l(e.getAttribute("data-fragment-index")) : null }));
979
+ return {
980
+ rows: p,
981
+ series: h,
982
+ notes: i.map((e) => {
983
+ let t = (t, n) => {
984
+ let r = Number.parseInt(e.getAttribute(t) ?? "", 10);
985
+ return Number.isFinite(r) ? r - 1 : n;
986
+ }, [n, r] = e.getAttribute("data-annotation") === "bracket" ? [t("data-from", 0), t("data-to", p.length - 1)] : [0, p.length - 1], i = null;
987
+ for (let e = Math.min(n, r); e <= Math.max(n, r); e++) {
988
+ let t = p[e]?.step ?? null;
989
+ t !== null && (i === null || t > i) && (i = t);
990
+ }
991
+ let o = h[t("data-series", 0)]?.step ?? null;
992
+ o !== null && (i === null || o > i) && (i = o), a(e) && (i = l(e.getAttribute("data-fragment-index")));
993
+ let s = i === null ? p.length : p.filter((e) => e.step === i).length;
994
+ return {
995
+ step: i,
996
+ after: s
997
+ };
998
+ }),
999
+ count: o.length,
1000
+ indexes: o
1001
+ };
1002
+ }, Ye = (e) => {
1003
+ let t = e.plan;
1004
+ if (!t) return;
1005
+ let n = (t) => t === null || e.step - t >= 1;
1006
+ for (let r of e.figure.querySelectorAll("[data-from]")) {
1007
+ let e = Number(r.dataset.from) - 1, i = Number(r.dataset.to) - 1, a = r.closest("[data-series]")?.dataset.series, o = a ? t.series[Number(a) - 1] : void 0, s = e - 1;
1008
+ if (o && o.step !== null) s = n(o.step) ? i : e - 1;
1009
+ else for (; s < i && n(t.rows[s + 1]?.step ?? null);) s++;
1010
+ let c = r.hasAttribute("data-flat") ? (s - e + 1) / (i - e + 1) : i > e ? Math.max(0, s - e) / (i - e) : 0;
1011
+ r.style.setProperty("--reveal", String(c));
1012
+ }
1013
+ }, Xe = (e) => {
1014
+ let t = e.plan;
1015
+ if (!t) return;
1016
+ let n = t.rows.length - 1, r = (e, t, n, r) => {
1017
+ e.style.setProperty(n, String(r)), e.style.removeProperty("--d"), t === null ? e.style.removeProperty("--step") : e.style.setProperty("--step", String(t));
1018
+ };
1019
+ for (let i of e.figure.querySelectorAll("[data-row], [data-series], [data-note]")) {
1020
+ if (i.closest("table, .tablechart-controls") || i.hasAttribute("data-from")) continue;
1021
+ let e = Number(i.dataset.note);
1022
+ if (e > 0) {
1023
+ let n = t.notes[e - 1];
1024
+ n && r(i, n.step, "--after", n.after);
1025
+ continue;
1026
+ }
1027
+ let a = i.dataset.row ? Number(i.dataset.row) - 1 : n;
1028
+ if (i.classList.contains("tablechart-connector")) {
1029
+ let e = t.rows[a - 1], n = t.rows[a];
1030
+ if (e && n) {
1031
+ let t = (e.step ?? -1) > (n.step ?? -1);
1032
+ r(i, t ? e.step : n.step, "--i", t ? e.slot + 1 : n.slot);
1033
+ }
1034
+ continue;
1035
+ }
1036
+ let o = i.dataset.series ? t.series[Number(i.dataset.series) - 1] : void 0;
1037
+ o && o.step !== null ? r(i, o.step, "--i", a) : t.rows[a] && r(i, t.rows[a].step, "--i", t.rows[a].slot);
1038
+ }
1039
+ let i = e.figure.querySelector(`.${x}`);
1040
+ if (i) {
1041
+ let e = Math.max(-1, ...t.rows.map((e) => e.step ?? -1));
1042
+ e < 0 ? r(i, null, "--i", 0) : r(i, e, "--i", t.rows.filter((t) => t.step === e).length);
1043
+ }
1044
+ Ye(e);
1045
+ }, Q = (e, t, n = !1) => {
1046
+ let r = e.plan;
1047
+ if (!r) return;
1048
+ let i = Math.min(Math.max(Math.round(t), 0), r.count), a = i !== e.step;
1049
+ e.step = i, e.figure.style.setProperty("--tablechart-step", String(i)), Ye(e);
1050
+ let [o, s] = e.controls?.querySelectorAll("button") ?? [];
1051
+ o && (o.disabled = i === 0), s && (s.disabled = i === r.count), a && !n && e.figure.dispatchEvent(new CustomEvent("tablechart:step", {
1052
+ bubbles: !0,
1053
+ detail: {
1054
+ step: i,
1055
+ steps: r.count
1056
+ }
1057
+ }));
1058
+ }, Ze = (e, t, n) => {
1059
+ let r = document.createElement("div");
1060
+ r.className = A;
1061
+ let i = (r) => {
1062
+ let i = document.createElement("button");
1063
+ i.type = "button", i.className = `tablechart-${r}`, i.dataset.go = r;
1064
+ let a = document.createElement("span");
1065
+ a.className = "tablechart-control-icon", a.setAttribute("aria-hidden", "true");
1066
+ let o = F("svg", {
1067
+ viewBox: "0 0 16 16",
1068
+ focusable: "false"
1069
+ });
1070
+ o.appendChild(F("path", { d: r === "next" ? "M6 3l5 5-5 5" : "M10 3L5 8l5 5" })), a.appendChild(o);
1071
+ let s = document.createElement("span");
1072
+ s.className = "tablechart-control-label", s.textContent = e[r];
1073
+ let c = t[r];
1074
+ c && n && s.setAttribute(n, c);
1075
+ let l = document.createElement("span");
1076
+ return l.className = E, l.textContent = e.hint, t.hint && n && l.setAttribute(n, t.hint), i.append(...r === "next" ? [
1077
+ s,
1078
+ l,
1079
+ a
1080
+ ] : [
1081
+ a,
1082
+ s,
1083
+ l
1084
+ ]), i;
1085
+ };
1086
+ return r.append(i("previous"), i("next")), r;
1087
+ }, Qe = {
1088
+ area: Le,
1089
+ bar: Se,
1090
+ column: Ce,
1091
+ donut: Ee,
1092
+ line: Ie,
1093
+ waterfall: Be
1094
+ }, $e = {
1095
+ "axis-break": H,
1096
+ trend: ce,
1097
+ bracket: ie
1098
+ }, et = Object.keys($e), tt = (e) => {
956
1099
  let t = "";
957
1100
  for (let n = e.previousSibling; n && (t = (n.textContent ?? "") + t, !t.trim()); n = n.previousSibling);
958
1101
  return t.trim();
959
- }, Ge = [
1102
+ }, nt = [
960
1103
  "straight",
961
1104
  "step",
962
1105
  "smooth"
963
- ], Ke = (e, t) => {
1106
+ ], rt = (e, t) => {
964
1107
  let n = e.dataset.chartShape;
965
- return n && Ge.includes(n) ? n : Ge.includes(t.shape) ? t.shape : "straight";
966
- }, qe = (e) => {
1108
+ return n && nt.includes(n) ? n : nt.includes(t.shape) ? t.shape : "straight";
1109
+ }, it = (e) => {
967
1110
  for (let t of e.querySelectorAll("br")) {
968
- if (t.previousElementSibling?.classList.contains("tablechart-sr") || /[.!?:;,…]$/.test(We(t))) continue;
1111
+ if (t.previousElementSibling?.classList.contains("tablechart-sr") || /[.!?:;,…]$/.test(tt(t))) continue;
969
1112
  let e = document.createElement("span");
970
1113
  e.className = E, e.textContent = ". ", t.before(e);
971
1114
  }
972
- }, Je = (e, t, n) => {
1115
+ }, at = (e, t, n) => {
973
1116
  let r = e.querySelector("table");
974
1117
  if (!r) return null;
975
1118
  let i = r.querySelector("tfoot [data-chart-total]");
@@ -980,23 +1123,23 @@ var Ae = (e) => e.map((e) => ({
980
1123
  s && n.langattribute && o.setAttribute(n.langattribute, `${s}-total`);
981
1124
  let c = a.insertCell();
982
1125
  return c.setAttribute("data-chart-total", ""), c.dataset.value = t.dataset.value ?? "0", a.prepend(o), c;
983
- }, Ye = 0, Xe = (e) => {
1126
+ }, ot = 0, st = (e) => {
984
1127
  let t = e.querySelector(":scope > figcaption");
985
1128
  if (!t) return;
986
- qe(t);
1129
+ it(t);
987
1130
  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);
1131
+ t.id || (t.id = `tablechart-caption-${++ot}`), e.setAttribute("aria-labelledby", t.id);
989
1132
  };
990
1133
  e.tagName === "FIGURE" && !n(e) && r(e);
991
1134
  let i = e.querySelector("table");
992
1135
  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);
1136
+ }, ct = (i, a, o = null) => {
1137
+ let s = o ?? (i.getAttribute("data-chart") || "column"), c = Qe[s];
1138
+ if (!c) return console.warn(`[${e}] Unknown chart type "${s}". Known types: ${Object.keys(Qe).join(", ")}.`), i.setAttribute("data-chart-empty", ""), null;
1139
+ let l = He(i, a.langattribute);
997
1140
  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);
1141
+ st(i);
1142
+ let u = Ge(i, l, a.langattribute);
1000
1143
  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
1144
  let d = u.length > 1;
1002
1145
  d && i.style.setProperty("--tablechart-series-count", String(u.length));
@@ -1006,46 +1149,58 @@ var Ae = (e) => e.map((e) => ({
1006
1149
  p && l.some((e) => e.cells.slice(0, u.length).some((e) => e.value < 0)) && console.warn(`[${e}] A stacked chart has a value below zero. It takes no room in the stack.`);
1007
1150
  let m = document.createElement("div");
1008
1151
  m.className = t, m.setAttribute("aria-hidden", "true");
1009
- let h = N("svg", {
1152
+ let h = F("svg", {
1010
1153
  role: "presentation",
1011
1154
  focusable: "false"
1012
1155
  });
1013
1156
  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);
1157
+ let g = c.centre ? l.filter((e) => !e.isTotal) : l, y = Math.max(0, U(g.flatMap((e) => e.cells.slice(0, u.length).map((e) => W(e.number))))), b = u.map((e, t) => l.map((e, n) => {
1158
+ let i = e.cells[t] ?? e.cells[0], a = L(r, m);
1016
1159
  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
1160
  })), 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));
1161
+ let n = L(r, m);
1162
+ n.classList.add(...e.classes), n.dataset.kind = "total", n.dataset.row = String(t + 1), n.dataset.value = String(pe(e, u.length));
1020
1163
  let i = e.cells[0];
1021
1164
  return i.prefix && (n.dataset.prefix = i.prefix), i.suffix && (n.dataset.suffix = i.suffix), n.style.setProperty("--i", String(e.slot)), n;
1022
1165
  }) : [], 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
1166
  D && (D.className = v, D.setAttribute("aria-hidden", "true"), D.inert = !0);
1024
1167
  let O = d ? u.map((e, t) => {
1025
- let n = F(_, D ?? m);
1168
+ let n = L(_, D ?? m);
1026
1169
  D && (n.dataset.place = "legend");
1027
1170
  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);
1171
+ if (r && (n.dataset.swatch = r), n.textContent = e.name, !r && rt(i, a) !== "step") {
1172
+ let e = Oe(u, t);
1030
1173
  n.dataset.marker = e.shape, n.toggleAttribute("data-open", e.open);
1031
1174
  }
1032
1175
  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;
1176
+ }) : [], k = c.centre ? L(x, m) : null;
1034
1177
  if (k) {
1035
1178
  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)));
1179
+ k.dataset.value = String(t), e && (k.dataset.decimals = String(W(e.number)));
1037
1180
  }
1038
- let A = k && !l.some((e) => e.isTotal) ? Je(i, k, a) : null, j = c.categories === "beside", M = document.createElement("div");
1181
+ let A = k && !l.some((e) => e.isTotal) ? at(i, k, a) : null, j = c.categories === "beside", M = document.createElement("div");
1039
1182
  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;
1183
+ let N = 0;
1041
1184
  for (let [e, t] of l.entries()) {
1042
1185
  let n = document.createElement("span");
1043
- 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(P + 1), n.style.setProperty("--n", String(P)), n.style.setProperty("--palette", `var(--tablechart-color-${P + 1})`), P += 1)), n.style.setProperty("--i", String(t.slot)), n.dataset.row = String(e + 1), M.appendChild(n);
1186
+ 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
1187
  }
1045
1188
  (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;
1189
+ let P = a.animate ? Je(i) : null;
1190
+ P && (i.setAttribute("data-steps", ""), i.setAttribute("data-chart-animate", "across"));
1191
+ let I = i.getAttribute("data-chart-keys"), R = P && a.controls ? Ze({
1192
+ previous: a.previouslabel,
1193
+ next: a.nextlabel,
1194
+ hint: a.stephint
1195
+ }, {
1196
+ previous: I && `${I}-previous`,
1197
+ next: I && `${I}-next`,
1198
+ hint: I && `${I}-step`
1199
+ }, a.langattribute) : null;
1200
+ R && i.appendChild(R);
1201
+ let z = Array.from(i.querySelectorAll("[data-annotation]")).map((t) => {
1202
+ let n = t.getAttribute("data-annotation"), r = $e[n];
1203
+ if (!r) return console.warn(`[${e}] Unknown annotation "${n}". Known annotations: ${Object.keys($e).join(", ")}.`), null;
1049
1204
  let i = Number.parseInt(t.getAttribute("data-series") ?? "1", 10), a = i >= 1 && i <= u.length ? i - 1 : 0;
1050
1205
  return i !== a + 1 && console.warn(`[${e}] An annotation reads line ${i}, which the chart does not have; it reads the first.`), {
1051
1206
  spec: t,
@@ -1059,7 +1214,7 @@ var Ae = (e) => e.map((e) => ({
1059
1214
  let e = i.getAttribute("data-chart-animate"), t = (e === "up" || e === "across" ? e : a.animate) === "up" && (s === "line" || s === "area");
1060
1215
  i.setAttribute("data-animate", t ? "up" : "");
1061
1216
  }
1062
- let L = {
1217
+ let B = {
1063
1218
  figure: i,
1064
1219
  plot: m,
1065
1220
  svg: h,
@@ -1077,37 +1232,46 @@ var Ae = (e) => e.map((e) => ({
1077
1232
  totalCell: A,
1078
1233
  rowAt: null,
1079
1234
  rowBox: null,
1080
- annotations: I,
1081
- checks: []
1235
+ annotations: z,
1236
+ checks: [],
1237
+ plan: P,
1238
+ step: 0,
1239
+ controls: R
1082
1240
  };
1083
- return a.hover && i.getAttribute("data-chart-hover") !== "false" && rt(L), tt(L, a), L;
1084
- }, Qe = (e, t, n, r) => {
1241
+ return R?.addEventListener("click", (e) => {
1242
+ let t = e.target.closest("button")?.dataset.go;
1243
+ t && Q(B, B.step + (t === "next" ? 1 : -1));
1244
+ }), Q(B, 0, !0), a.hover && i.getAttribute("data-chart-hover") !== "false" && gt(B), pt(B, a), B;
1245
+ }, lt = (e) => {
1246
+ let t = getComputedStyle(e).getPropertyValue("--tablechart-inside-align").trim();
1247
+ return t === "start" || t === "center" || t === "end" ? t : null;
1248
+ }, ut = (e, t, n, r) => {
1085
1249
  let i = getComputedStyle(e), a = (i.getPropertyValue(n).trim() || r).match(/^(\d+(?:\.\d+)?)(px|%|em|rem)$/);
1086
1250
  if (!a) return null;
1087
1251
  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) => {
1252
+ return a[2] === "%" ? o / 100 * j : o * (a[2] === "em" ? Number.parseFloat(i.fontSize) : a[2] === "rem" ? Number.parseFloat(getComputedStyle(document.documentElement).fontSize) : 1) * t;
1253
+ }, dt = (e, t) => ut(e, t, "--tablechart-bar-max", "60px") ?? Infinity, ft = (t, n) => {
1090
1254
  let { plot: r, svg: i, rows: a, type: o, values: s, series: c, seriesValues: l, names: u, annotations: d } = t, f = r.clientWidth;
1091
1255
  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);
1256
+ let p = j / f, m = Number.parseFloat(t.figure.dataset.chartAspect ?? ""), h = j * (m > 0 ? m : o.aspect ?? n.aspect);
1093
1257
  r.classList.add(w);
1094
1258
  for (let e of [...l.flat(), ...t.totals]) delete e.dataset.place;
1095
- r.style.removeProperty("--tablechart-fit"), re([
1259
+ r.style.removeProperty("--tablechart-fit"), oe([
1096
1260
  ...l.flat(),
1097
1261
  ...t.totals,
1098
1262
  ...u,
1099
1263
  ...t.categories,
1100
1264
  ...d.map((e) => e.badge)
1101
1265
  ]);
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?.({
1266
+ let g = (s[0] ? Y(s[0]).height : 0) * p, _ = d[0]?.badge ? Y(d[0].badge).height * p : 0, v = Math.max(h, ut(t.figure, p, "--tablechart-min-height", "200px") ?? 0, o.minHeight?.({
1103
1267
  labelHeight: g,
1104
- nameHeight: Math.max(0, B(t.categories.map((e) => J(e).height))) * p,
1268
+ nameHeight: Math.max(0, U(t.categories.map((e) => Y(e).height))) * p,
1105
1269
  unit: p,
1106
1270
  rows: a.length,
1107
1271
  series: c.length,
1108
1272
  stacked: t.stacked
1109
1273
  }) ?? 0), y = t.stacked ? a.map((e) => {
1110
- let t = ce(e, c.length);
1274
+ let t = pe(e, c.length);
1111
1275
  return {
1112
1276
  ...e,
1113
1277
  value: t,
@@ -1132,53 +1296,53 @@ var Ae = (e) => e.map((e) => ({
1132
1296
  series: c.length,
1133
1297
  focused: c.some((e) => e.focus),
1134
1298
  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) => [
1299
+ }, C = o.headroom?.(S) ?? g, T = 2 * p + (o.footroom?.(S) ?? 0), E = C, D = t.stacked ? Math.max(U(y.map((e) => e.value)), 0) : Math.max(U(x.flatMap((e) => [
1136
1300
  e.from,
1137
1301
  e.to,
1138
1302
  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) ?? "");
1303
+ ])), U(a.flatMap((e) => e.cells.slice(0, c.length).map((e) => e.value)))), O = v - E - T, k = D * 1.02, A = d.find((e) => e.spec.getAttribute("data-annotation") === "axis-break")?.spec, M = (e) => {
1304
+ let t = Number.parseFloat(A?.getAttribute(e) ?? "");
1141
1305
  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*$/);
1306
+ }, N = M("data-from") ?? M("data-at"), P = M("data-to"), I = null;
1307
+ if (A && (N !== null || P !== null)) {
1308
+ let t = N ?? 0, n = P ?? k, r = P === null ? t : N === null ? n : (t + n) / 2, i = A.getAttribute("data-size"), a = i?.match(/^\s*(\d+(?:\.\d+)?)\s*%\s*$/);
1145
1309
  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 = {
1310
+ let s = Math.min(Math.max(a ? Number(a[1]) / 100 : P === null ? .22 : .3, .05), .8), c = x.filter((e) => (e.kind === "up" || e.kind === "down") && Math.max(e.from, e.to) > t && Math.min(e.from, e.to) < n);
1311
+ o.breakable ? t < 0 || n <= t || n > k || t === 0 && n === k ? console.warn(`[${e}] A break from ${t} to ${n} does not fit a scale that runs from 0 to ${D}.`) : c.length ? console.warn(`[${e}] A break from ${t} to ${n} would cut a step that floats. Keep it below or above the steps.`) : I = {
1148
1312
  lo: t,
1149
1313
  hi: n,
1150
1314
  gap: r,
1151
1315
  share: s
1152
1316
  } : console.warn(`[${e}] This kind of chart cannot break its scale.`);
1153
1317
  }
1154
- let L = I ? I.gap : null, R = v - T, z = (e) => R - e / A * O;
1318
+ let L = I ? I.gap : null, R = (I && ut(t.figure, p, "--tablechart-break-gap", "")) ?? 13, z = v - T, ee = (e) => z - e / k * O;
1155
1319
  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;
1320
+ let { lo: e, hi: t, gap: n, share: r } = I, i = O * r, a = (O - i - R) / (e + (k - t)), o = i / (t - e);
1321
+ ee = (r) => r <= e ? z - r * a : r <= n ? z - e * a - (r - e) * o : r <= t ? z - e * a - (r - e) * o - R : z - e * a - i - R - (r - t) * a;
1158
1322
  }
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;
1323
+ let V = u.length ? U(u.map((e) => Y(e).width)) * p + 12 * p : 0, H = t.categories[0]?.parentElement;
1324
+ H && (H.style.paddingRight = V ? `${V / j * 100}%` : "");
1325
+ let W = (j - V) / a.length, te = (e) => (e + .5) * W, G = (e) => e >= 0 && e < a.length ? e : null;
1326
+ t.rowAt = o.centre ? null : o.categories === "beside" ? (e, t) => G(Math.floor(t * p / (v / a.length))) : (e) => G(Math.floor(e * p / W));
1327
+ let K = W / j * 100, q = 100 / a.length;
1164
1328
  t.rowBox = o.categories === "beside" ? (e) => [
1165
1329
  0,
1166
- e * K,
1330
+ e * q,
1167
1331
  100,
1168
- K
1332
+ q
1169
1333
  ] : (e) => [
1170
- e * te,
1334
+ e * K,
1171
1335
  0,
1172
- te,
1336
+ K,
1173
1337
  100
1174
- ], i.setAttribute("viewBox", `0 0 ${k} ${v}`), i.textContent = "", t.checks = [];
1175
- let ne = {
1338
+ ], i.setAttribute("viewBox", `0 0 ${j} ${v}`), i.textContent = "", t.checks = [];
1339
+ let J = {
1176
1340
  rows: a,
1177
1341
  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),
1342
+ cx: te,
1343
+ y: ee,
1344
+ barWidth: Math.min(W * n.barfill, dt(t.figure, p)),
1345
+ barMax: dt(t.figure, p),
1182
1346
  height: v,
1183
1347
  unit: p,
1184
1348
  labelHeight: g,
@@ -1186,9 +1350,13 @@ var Ae = (e) => e.map((e) => ({
1186
1350
  after: a.length,
1187
1351
  note: 0,
1188
1352
  labels: t.figure.dataset.chartLabels === "inside" || t.figure.dataset.chartLabels !== "outside" && n.labels === "inside" ? "inside" : "outside",
1353
+ closing: (t.figure.dataset.chartClosing ?? n.closing) === "up" ? "up" : "down",
1354
+ insideAlign: lt(t.figure),
1189
1355
  breakAt: L,
1356
+ squeeze: I,
1357
+ breakGap: R,
1190
1358
  stacked: t.stacked,
1191
- shape: Ke(t.figure, n),
1359
+ shape: rt(t.figure, n),
1192
1360
  totals: t.totals,
1193
1361
  svg: i,
1194
1362
  plot: r,
@@ -1201,12 +1369,7 @@ var Ae = (e) => e.map((e) => ({
1201
1369
  config: n,
1202
1370
  checks: t.checks
1203
1371
  };
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");
1372
+ o.draw(J);
1210
1373
  for (let [e, n] of d.entries()) {
1211
1374
  n.badge?.setAttribute("data-note", String(e + 1));
1212
1375
  let r = n.series, i = (e) => ({
@@ -1214,7 +1377,7 @@ var Ae = (e) => e.map((e) => ({
1214
1377
  ...e.cells[r] ?? e.cells[0]
1215
1378
  });
1216
1379
  n.type.draw(n.spec, n.badge, {
1217
- ...ne,
1380
+ ...J,
1218
1381
  ...t.stacked && {
1219
1382
  rows: y,
1220
1383
  ...t.totals.length && { values: t.totals }
@@ -1234,10 +1397,15 @@ var Ae = (e) => e.map((e) => ({
1234
1397
  note: e + 1
1235
1398
  });
1236
1399
  }
1237
- return ee(i, d.flatMap(({ badge: e }) => {
1400
+ Xe(t);
1401
+ let ne = t.categories[0]?.parentElement;
1402
+ return ne && o.categories !== "beside" && !o.centre && be(ne, t.categories.filter((e) => e.offsetParent !== null), (e) => ({
1403
+ size: e.scrollWidth,
1404
+ room: e.clientWidth
1405
+ }), "--tablechart-name-fit"), B(i, d.flatMap(({ badge: e }) => {
1238
1406
  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", {
1407
+ let t = e.offsetWidth * p, n = e.offsetHeight * p, r = Number.parseFloat(e.style.left) / 100 * j, i = Number.parseFloat(e.style.top) / 100 * v, a = getComputedStyle(e).borderTopLeftRadius, o = a.endsWith("%") ? Number.parseFloat(a) / 100 : null, s = (Number.parseFloat(a) || 0) * p;
1408
+ return [F("rect", {
1241
1409
  class: b,
1242
1410
  "data-for": "badge",
1243
1411
  "data-note": e.dataset.note ?? "",
@@ -1247,10 +1415,10 @@ var Ae = (e) => e.map((e) => ({
1247
1415
  height: n,
1248
1416
  rx: o === null ? s : t * o,
1249
1417
  ry: o === null ? s : n * o,
1250
- style: ["--after"].map((t) => e.style.getPropertyValue(t) && `${t}:${e.style.getPropertyValue(t)}`).filter(Boolean).join("; ")
1418
+ style: ["--after", "--step"].map((t) => e.style.getPropertyValue(t) && `${t}:${e.style.getPropertyValue(t)}`).filter(Boolean).join("; ")
1251
1419
  })];
1252
- }), k, v), !0;
1253
- }, tt = (e, t) => {
1420
+ }), j, v), !0;
1421
+ }, pt = (e, t) => {
1254
1422
  let n = [
1255
1423
  ...e.seriesValues.flat(),
1256
1424
  ...e.totals,
@@ -1262,13 +1430,17 @@ var Ae = (e) => e.map((e) => ({
1262
1430
  r.textContent = n;
1263
1431
  continue;
1264
1432
  }
1265
- r.textContent = i + H(Number.parseFloat(r.dataset.value || "0"), r.dataset.decimals ? Number(r.dataset.decimals) : e.decimals, t.locale) + a;
1433
+ let [o, s] = G(Number.parseFloat(r.dataset.value || "0"), r.dataset.decimals ? Number(r.dataset.decimals) : e.decimals, t.locale);
1434
+ if (r.textContent = i + (i ? o : "") + s + a, o && !i) {
1435
+ let e = document.createElement("span");
1436
+ e.className = D, e.textContent = o, r.prepend(e);
1437
+ }
1266
1438
  }
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) => {
1439
+ }, mt = (e) => {
1440
+ e.plot.remove(), e.categories[0]?.parentElement?.remove(), e.figure.querySelector(`:scope > .${v}`)?.remove(), e.controls?.remove();
1441
+ }, ht = (e, t) => {
1442
+ e.figure.classList.toggle(O, t), t || e.plot.removeAttribute("data-pointed");
1443
+ }, gt = (e) => {
1272
1444
  let { plot: t } = e, n = () => [...e.seriesValues.flat(), ...e.totals], r = (e, t) => {
1273
1445
  let n = Number(e.dataset.row), r = Number(e.dataset.rowEnd ?? n);
1274
1446
  return t >= n && t <= r;
@@ -1303,25 +1475,25 @@ var Ae = (e) => e.map((e) => ({
1303
1475
  }), document.addEventListener("pointerdown", (e) => {
1304
1476
  t.contains(e.target) || a();
1305
1477
  });
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) => {
1478
+ }, _t = (e) => e === "id" || e === "style" || e.startsWith("data-chart"), vt = /^\s*(?:Table)?:\s+/, yt = (e) => e?.tagName === "P" && vt.test(e.textContent ?? ""), bt = (e) => {
1307
1479
  let t = document.createElement("figcaption");
1308
1480
  for (let { name: n, value: r } of Array.from(e.attributes)) t.setAttribute(n, r);
1309
1481
  let n = e.firstChild;
1310
- n?.nodeType === Node.TEXT_NODE && (n.textContent = (n.textContent ?? "").replace(at, ""), n.textContent || n.remove());
1482
+ n?.nodeType === Node.TEXT_NODE && (n.textContent = (n.textContent ?? "").replace(vt, ""), n.textContent || n.remove());
1311
1483
  let r = Array.from(e.childNodes), i = r.findIndex((e) => e.nodeName === "BR");
1312
1484
  if (t.append(...i === -1 ? r : r.slice(0, i + 1)), i !== -1 && i < r.length - 1) {
1313
1485
  let e = document.createElement("span");
1314
1486
  e.append(...r.slice(i + 1)), t.append(e);
1315
1487
  }
1316
1488
  return e.remove(), t;
1317
- }, ct = /^\s*([a-z][\w-]*)((?:\s+[\w-]+=[^\s:]+)*)\s*(:\s*|$)/, lt = (e) => {
1318
- let t = gt(e);
1489
+ }, xt = /^\s*([a-z][\w-]*)((?:\s+[\w-]+=[^\s:]+)*)\s*(:\s*|$)/, St = (e) => {
1490
+ let t = kt(e);
1319
1491
  return t?.tagName === "P" ? t : e;
1320
- }, ut = (e) => {
1321
- let t = lt(e).firstChild;
1492
+ }, Ct = (e) => {
1493
+ let t = St(e).firstChild;
1322
1494
  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;
1495
+ let n = xt.exec(t.textContent ?? "");
1496
+ if (!n || !et.includes(n[1]) || !n[3] && t.nextSibling) return null;
1325
1497
  let r = n[2].trim().split(/\s+/).filter(Boolean).map((e) => e.split("="));
1326
1498
  return {
1327
1499
  name: n[1],
@@ -1329,11 +1501,11 @@ var Ae = (e) => e.map((e) => ({
1329
1501
  text: t,
1330
1502
  length: n[0].length
1331
1503
  };
1332
- }, dt = (e) => {
1504
+ }, wt = (e) => {
1333
1505
  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));
1506
+ let t = Array.from(e.children), n = t.map((e) => e.hasAttribute("data-annotation") ? null : Ct(e));
1335
1507
  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);
1508
+ let r = n[t], i = St(e);
1337
1509
  if (i !== e && i.replaceWith(...i.childNodes), r) {
1338
1510
  e.setAttribute("data-annotation", r.name);
1339
1511
  for (let [t, n] of r.options) e.setAttribute(`data-${t}`, n);
@@ -1344,18 +1516,18 @@ var Ae = (e) => e.map((e) => ({
1344
1516
  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
1517
  });
1346
1518
  }), 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;
1519
+ }, Tt = (e, t) => {
1520
+ for (let { name: n, value: r } of Array.from(e.attributes)) (n === "class" || _t(n)) && (t.setAttribute(n, r), e.removeAttribute(n));
1521
+ }, Et = (e) => e.map((e) => {
1522
+ let t = e.closest("p"), n = yt(t) ? t : e;
1351
1523
  if (n.tagName !== "TABLE" && n.tagName !== "P") return n;
1352
1524
  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;
1525
+ Tt(e, r), e.classList.length || e.removeAttribute("class");
1526
+ let i = n.tagName === "TABLE" ? n : null, a = n.previousElementSibling, o = n.nextElementSibling, s = i ? yt(a) ? a : yt(o) ? o : null : n;
1355
1527
  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 = []) => {
1528
+ let c = o?.classList.contains("chart-annotations") ? o : wt(o);
1529
+ return n.replaceWith(r), s && r.append(bt(s)), i && r.append(i), c && r.append(c), Z?.log?.(`A ${i ? "table" : "caption"} with chart attributes was wrapped in a figure of its own`), r;
1530
+ }), Dt = (e, t = []) => {
1359
1531
  let n = document.createElement("table");
1360
1532
  if (t.length) {
1361
1533
  let e = n.createTHead().insertRow();
@@ -1374,7 +1546,7 @@ var Ae = (e) => e.map((e) => ({
1374
1546
  for (let n of t.values ?? [t.value ?? null]) e.insertCell().textContent = n === null ? "" : String(n);
1375
1547
  }
1376
1548
  return n;
1377
- }, ht = async (t) => {
1549
+ }, Ot = async (t) => {
1378
1550
  await Promise.all(t.filter((e) => e.hasAttribute("data-chart-src")).map(async (t) => {
1379
1551
  let n = t.getAttribute("data-chart-src");
1380
1552
  for (let e of t.querySelectorAll("table")) e.remove();
@@ -1383,17 +1555,17 @@ var Ae = (e) => e.map((e) => ({
1383
1555
  if (!e.ok) throw Error(`${e.status} ${e.statusText}`);
1384
1556
  let r = await e.json(), i = Array.isArray(r) ? r : r?.rows;
1385
1557
  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);
1558
+ let a = Array.isArray(r?.series) ? r.series.map(String) : [], o = t.querySelector(":scope > figcaption"), s = Dt(i, a);
1387
1559
  o ? o.after(s) : t.prepend(s), Z?.log?.(`Read ${i.length} rows from "${n}"`);
1388
1560
  } catch (t) {
1389
1561
  let r = window.location.protocol === "file:";
1390
1562
  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
1563
  }
1392
1564
  }));
1393
- }, gt = (e) => {
1565
+ }, kt = (e) => {
1394
1566
  let t = Array.from(e.childNodes).filter((e) => e.nodeType === Node.ELEMENT_NODE || e.nodeType === Node.TEXT_NODE && e.textContent?.trim());
1395
1567
  return t.length === 1 && t[0] instanceof HTMLElement ? t[0] : null;
1396
- }, _t = "strong, b, span.total", vt = (e) => {
1568
+ }, At = "strong, b, span.total", jt = (e) => {
1397
1569
  for (let t of e) {
1398
1570
  for (let e of t.querySelectorAll("tbody tr")) {
1399
1571
  let t = e.cells[0];
@@ -1401,16 +1573,16 @@ var Ae = (e) => e.map((e) => ({
1401
1573
  let n = document.createElement("th");
1402
1574
  for (let { name: e, value: r } of Array.from(t.attributes)) n.setAttribute(e, r);
1403
1575
  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);
1576
+ for (let t = kt(n); t?.matches(At); t = kt(n)) e.dataset.kind = "total", t.replaceWith(...t.childNodes);
1405
1577
  }
1406
1578
  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);
1579
+ for (let t of e.slice(1)) for (let e = kt(t); e?.matches(At); e = kt(t)) t.setAttribute("data-kind", "focus"), e.replaceWith(...e.childNodes);
1408
1580
  }
1409
- }, yt = "data-chart-made", bt = () => window.matchMedia("(prefers-reduced-motion: reduce)").matches, xt = (e) => new Promise((t) => setTimeout(t, e)), St = (e, t) => {
1581
+ }, Mt = "data-chart-made", Nt = () => window.matchMedia("(prefers-reduced-motion: reduce)").matches, Pt = (e) => new Promise((t) => setTimeout(t, e)), Ft = (e, t) => {
1410
1582
  let n = Number.parseFloat(e.dataset.chartEntrance ?? ""), r = Number.isFinite(n) ? n : t.entrance;
1411
1583
  return Math.min(Math.max(r, 0), 1);
1412
- }, Ct = async (e, t) => {
1413
- if (bt()) return;
1584
+ }, It = async (e, t) => {
1585
+ if (Nt()) return;
1414
1586
  await new Promise(requestAnimationFrame);
1415
1587
  let n = e.getAnimations().filter((e) => e instanceof CSSAnimation);
1416
1588
  for (let t = e.parentElement; t && t !== document.body; t = t.parentElement) n.push(...t.getAnimations());
@@ -1421,11 +1593,11 @@ var Ae = (e) => e.map((e) => ({
1421
1593
  let a = Number(n.delay ?? 0) + i * t;
1422
1594
  r = Math.max(r, a - Number(e.currentTime ?? 0));
1423
1595
  }
1424
- r > 0 && await xt(r);
1425
- }, wt = (e) => {
1596
+ r > 0 && await Pt(r);
1597
+ }, Lt = (e) => {
1426
1598
  for (let t = e; t && t !== document.body; t = t.parentElement) if (getComputedStyle(t).opacity === "0") return t;
1427
1599
  return null;
1428
- }, Tt = (e) => new Promise((t) => {
1600
+ }, Rt = (e) => new Promise((t) => {
1429
1601
  let n = ["animationstart", "transitionrun"], r = () => {
1430
1602
  for (let e of n) document.removeEventListener(e, i, !0);
1431
1603
  a.disconnect(), t();
@@ -1439,84 +1611,93 @@ var Ae = (e) => e.map((e) => ({
1439
1611
  attributes: !0,
1440
1612
  attributeFilter: ["class", "style"]
1441
1613
  });
1442
- }), Et = /* @__PURE__ */ new Set(), $ = null, Dt = (e) => {
1443
- Et.add(e), !$ && ($ = new MutationObserver(() => {
1444
- for (let e of Et) e.relabel();
1614
+ }), zt = /* @__PURE__ */ new Set(), $ = null, Bt = (e) => {
1615
+ zt.add(e), !$ && ($ = new MutationObserver(() => {
1616
+ for (let e of zt) e.relabel();
1445
1617
  requestAnimationFrame(() => requestAnimationFrame(() => {
1446
- for (let e of Et) e.refresh();
1618
+ for (let e of zt) e.refresh();
1447
1619
  }));
1448
1620
  }), $.observe(document.documentElement, {
1449
1621
  attributes: !0,
1450
1622
  attributeFilter: ["lang"]
1451
1623
  }));
1452
- }, Ot = (e) => {
1453
- Et.delete(e), !(Et.size || !$) && ($.disconnect(), $ = null);
1454
- }, kt = ["column", "bar"], At = (e) => {
1624
+ }, Vt = (e) => {
1625
+ zt.delete(e), !(zt.size || !$) && ($.disconnect(), $ = null);
1626
+ }, Ht = ["column", "bar"], Ut = (e) => {
1455
1627
  let t = e.getAttribute("data-chart") || "column";
1456
- if (!kt.includes(t)) return null;
1628
+ if (!Ht.includes(t)) return null;
1457
1629
  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);
1630
+ return Ht.includes(n) ? n : t;
1631
+ }, Wt = (e, t) => {
1632
+ let n = e, r = Ut(n.figure), i = null, a = !1, o = !1, s = async () => {
1633
+ if (!t.animate) return ht(n, !0);
1462
1634
  let e = n.figure.classList.contains("is-shown");
1463
1635
  if (a && i !== null && !e && !o) {
1464
1636
  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);
1637
+ let e = Nt() ? null : Lt(n.figure);
1638
+ e && await Rt(e), await It(n.figure, Ft(n.figure, t)), o = !1, (a || !t.replay) && ht(n, !0);
1639
+ } else !a && t.replay && e && ht(n, !1);
1468
1640
  }, c = () => {
1469
- let e = At(n.figure);
1641
+ let e = Ut(n.figure);
1470
1642
  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);
1643
+ let a = Z.timed("Building", n.figure, () => ct(n.figure, t, e));
1644
+ a && (mt(n), Q(a, n.step, !0), n = a, r = e, i = null);
1473
1645
  }, l = () => {
1474
1646
  c();
1475
1647
  let e = n.plot.clientWidth;
1476
- !e || e === i || Z.timed("Layout", n.figure, () => et(n, t)) && (i = e, s());
1648
+ !e || e === i || Z.timed("Layout", n.figure, () => ft(n, t)) && (i = e, s());
1477
1649
  }, u = !1, d = new ResizeObserver(() => {
1478
1650
  u || (u = !0, requestAnimationFrame(() => {
1479
1651
  u = !1, l();
1480
1652
  }));
1481
1653
  }), f = new IntersectionObserver((e) => {
1482
1654
  for (let t of e) a = t.isIntersecting, s();
1483
- }, { threshold: t.threshold }), p = () => Q(n, !0), m = () => {
1655
+ }, { threshold: t.threshold }), p = () => ht(n, !0), m = () => {
1484
1656
  i = null, l();
1485
1657
  }, h = {
1486
- relabel: () => tt(n, t),
1658
+ relabel: () => pt(n, t),
1487
1659
  refresh: m
1488
1660
  };
1489
- c(), l(), d.observe(n.figure), f.observe(n.figure), window.addEventListener("beforeprint", p), Dt(h);
1661
+ c(), l(), d.observe(n.figure), f.observe(n.figure), window.addEventListener("beforeprint", p), Bt(h);
1490
1662
  let g = {
1491
1663
  figure: n.figure,
1492
1664
  refresh: m,
1665
+ next: () => Q(n, n.step + 1),
1666
+ previous: () => Q(n, n.step - 1),
1667
+ stepTo: (e) => Q(n, e),
1668
+ get step() {
1669
+ return n.step;
1670
+ },
1671
+ get steps() {
1672
+ return n.plan?.count ?? 0;
1673
+ },
1493
1674
  destroy() {
1494
- d.disconnect(), f.disconnect(), window.removeEventListener("beforeprint", p), Ot(h), n.figure.tablechart === g && delete n.figure.tablechart;
1675
+ d.disconnect(), f.disconnect(), window.removeEventListener("beforeprint", p), Vt(h), n.figure.tablechart === g && delete n.figure.tablechart;
1495
1676
  }
1496
1677
  };
1497
1678
  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 = {}) => {
1679
+ }, Gt = async (e, t) => {
1680
+ let n = Et(e.filter((e) => !e.hasAttribute(Mt)));
1681
+ return await Ot(n), jt(n), Ke(n, t.langattribute), n;
1682
+ }, Kt = (e, t) => {
1683
+ let n = Z.timed("Building", e, () => ct(e, t));
1684
+ return n ? (e.setAttribute(Mt, ""), Wt(n, t)) : null;
1685
+ }, qt = async (e, t = {}) => {
1505
1686
  if (e.tablechart) return e.tablechart;
1506
1687
  let n = {
1507
- ...A,
1688
+ ...M,
1508
1689
  ...t
1509
1690
  };
1510
1691
  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) => {
1692
+ let [r] = await Gt([e], n);
1693
+ return r ? Kt(r, n) : null;
1694
+ }, Jt = async (e = {}, t = document) => {
1514
1695
  let n = {
1515
- ...A,
1696
+ ...M,
1516
1697
  ...e
1517
1698
  };
1518
1699
  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);
1700
+ let r = (await Gt(Array.from(t.querySelectorAll(n.selector)), n)).map((e) => Kt(e, n)).filter((e) => e !== null);
1520
1701
  return Z.log(`Made ${r.length} chart(s).`), {
1521
1702
  charts: r,
1522
1703
  refresh: () => {
@@ -1528,4 +1709,4 @@ var Ae = (e) => e.map((e) => ({
1528
1709
  };
1529
1710
  };
1530
1711
  //#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 };
1712
+ export { k as _, Et as a, ct as c, ht as d, mt as f, t as g, w as h, Gt as i, ft as l, Ke as m, Ft as n, Ot as o, Q as p, Jt as r, jt as s, qt as t, pt as u, O as v, M as y };