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