@martinomagnifico/tablechart 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
- import { C as e, L as t, T as n, _ as r, b as i, g as a, x as o } from "./tablechart-shared.mjs";
2
- // src/js/summary.ts
3
- var s = {
1
+ import { E as e, S as t, V as n, _ as r, b as i, g as a, w as o, x as s } from "./tablechart-shared.mjs";
2
+ // src/js/summary/config.ts
3
+ var c = {
4
4
  selector: "[data-chart]:not(th)",
5
5
  delimiters: ["{", "}"],
6
6
  langattribute: "data-i18n",
@@ -13,57 +13,69 @@ var s = {
13
13
  unclear: "unclear",
14
14
  above: "above",
15
15
  below: "below"
16
- }
17
- }, c = "chart-summary", l = "data-summary-ready", u = "data-summary-template", d = "data-summary-text", f = ["line", "area"], p = [
16
+ },
17
+ groups: 10
18
+ }, l = { config: null }, u = [
19
+ "delimiters",
20
+ "locale",
21
+ "flat",
22
+ "outliers",
23
+ "words",
24
+ "groups"
25
+ ], d = "chart-summary", f = "data-summary-ready", p = "data-summary-template", m = "data-summary-text", h = [
26
+ "line",
27
+ "area",
28
+ "candlestick"
29
+ ], g = { candlestick: 4 }, _ = [
18
30
  "extremes",
19
31
  "range",
20
32
  "change",
21
33
  "trend",
22
34
  "outliers",
23
- "notes"
24
- ], m = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), h = 0, g = /* @__PURE__ */ new Set(), _ = (e) => {
25
- g.has(e) || (g.add(e), console.warn(`[${t}] ${e}`));
26
- }, v = (t) => {
27
- let n = t.filter((e) => !e.missing), r = n.reduce((t, n) => e(n.number) > e(t.number) ? n : t, n[0] ?? t[0]);
28
- if (!r) return;
29
- let i = n.reduce((e, t) => e + t.value, 0);
35
+ "notes",
36
+ "groups"
37
+ ], v = /* @__PURE__ */ new Set(["rank", "rank.low"]), y = /* @__PURE__ */ new Set(), b = (e) => {
38
+ y.has(e) || (y.add(e), console.warn(`[${n}] ${e}`));
39
+ }, x = (e, t) => {
40
+ let n = Math.max(1, Math.min(Math.round(t), e.length));
41
+ return Array.from({ length: n }, (t, r) => e.slice(Math.floor(r * e.length / n), Math.floor((r + 1) * e.length / n)));
42
+ }, S = (e) => (t) => ({
43
+ high: 1 + e.filter((e) => e > t).length,
44
+ low: 1 + e.filter((e) => e < t).length
45
+ }), C = (e) => {
46
+ let t = e.filter((e) => !e.missing), n = t.reduce((e, t) => o(t.number) > o(e.number) ? t : e, t[0] ?? e[0]);
47
+ if (!n) return;
48
+ let r = t.reduce((e, t) => e + t.value, 0);
30
49
  return {
31
- ...r,
50
+ ...n,
32
51
  raw: "",
33
- number: i.toFixed(e(r.number)),
34
- missing: !n.length,
35
- value: i
52
+ number: r.toFixed(o(n.number)),
53
+ missing: !t.length,
54
+ value: r
36
55
  };
37
- }, y = (t, s, c, l) => {
38
- let u = o(t, c.langattribute), d = i(t, u.filter((e) => !e.isTotal), c.langattribute), p = s < 0, m = u.filter((e) => !e.isTotal).map((e) => p ? {
56
+ }, w = (t, n, c, l) => {
57
+ let u = s(t, c.langattribute), d = i(t, u.filter((e) => !e.isTotal), c.langattribute), f = n < 0, p = u.filter((e) => !e.isTotal).map((e) => f ? {
39
58
  ...e,
40
- cells: [v(e.cells.slice(0, d.length))].filter((e) => !!e)
41
- } : e), h = p ? 0 : s, g = p ? void 0 : d[s], _ = (e, t) => {
59
+ cells: [C(e.cells.slice(0, d.length))].filter((e) => !!e)
60
+ } : e), m = f ? 0 : n, g = f ? void 0 : d[n], _ = (e, t) => {
42
61
  if (!t || !c.langattribute) return e;
43
62
  let n = document.createElement("span");
44
63
  return n.setAttribute(c.langattribute, t), n.textContent = e, n;
45
- }, y = Math.max(0, ...m.map((t) => e(t.cells[h]?.number ?? ""))), b = (e, t, r = y) => {
46
- let [i, a] = n(e, r, l);
47
- return t.prefix + i + a + t.suffix;
48
- }, x = (e) => new Intl.NumberFormat(l, {
64
+ }, v = Math.max(0, ...p.map((e) => o(e.cells[m]?.number ?? ""))), y = (t, n, r = v) => {
65
+ let [i, a] = e(t, r, l);
66
+ return n.prefix + i + a + n.suffix;
67
+ }, b = (e) => new Intl.NumberFormat(l, {
49
68
  style: "percent",
50
69
  maximumFractionDigits: +(Math.abs(e) < 10)
51
- }).format(e / 100), S = (e) => _(e.label, e.key), C = t.querySelector(":scope > figcaption"), w = C?.querySelector("b, strong") ?? C, T = {
70
+ }).format(e / 100), w = (e) => _(e.label, e.key), T = t.querySelector(":scope > figcaption"), E = T?.querySelector("b, strong") ?? T, D = {
52
71
  values: {
53
- title: _((w?.textContent ?? "").trim(), c.langattribute && w?.getAttribute(c.langattribute) || null),
54
- rows: n(m.length, 0, l).join(""),
72
+ title: _((E?.textContent ?? "").trim(), c.langattribute && E?.getAttribute(c.langattribute) || null),
73
+ rows: e(p.length, 0, l).join(""),
55
74
  series: g ? _(g.name, g.key) : ""
56
75
  },
57
- counts: { rows: m.length }
58
- }, E = m.filter((e) => e.note), D = E.length ? {
59
- values: { "notes.count": n(E.length, 0, l).join("") },
60
- counts: { "notes.count": E.length },
61
- items: E.map((e) => ({
62
- name: S(e),
63
- note: _(e.note ?? "", e.noteKey)
64
- }))
65
- } : null, O = m.flatMap((e, t) => {
66
- let n = e.cells[h];
76
+ counts: { rows: p.length }
77
+ }, O = p.flatMap((e, t) => {
78
+ let n = e.cells[m];
67
79
  return n && !n.missing ? [{
68
80
  row: e,
69
81
  cell: n,
@@ -71,113 +83,164 @@ var s = {
71
83
  y: n.value
72
84
  }] : [];
73
85
  });
86
+ D.values.values = e(O.length, 0, l).join(""), D.counts.values = O.length;
87
+ let k = S(O.map((e) => e.y)), A = (t) => {
88
+ let { high: n, low: r } = k(t);
89
+ return {
90
+ values: {
91
+ rank: e(n, 0, l).join(""),
92
+ "rank.low": e(r, 0, l).join("")
93
+ },
94
+ counts: {
95
+ rank: n,
96
+ "rank.low": r
97
+ }
98
+ };
99
+ }, j = (e, t) => {
100
+ if (t === void 0) return { values: e };
101
+ let n = A(t);
102
+ return {
103
+ values: {
104
+ ...e,
105
+ ...n.values
106
+ },
107
+ counts: n.counts
108
+ };
109
+ }, M = p.filter((e) => e.note), N = M.length ? {
110
+ values: { "notes.count": e(M.length, 0, l).join("") },
111
+ counts: { "notes.count": M.length },
112
+ items: M.map((e) => {
113
+ let t = e.cells[m], n = t && !t.missing ? t : void 0, r = {
114
+ name: w(e),
115
+ note: _(e.note ?? "", e.noteKey)
116
+ };
117
+ return n && (r.value = y(n.value, n)), j(r, n?.value);
118
+ })
119
+ } : null;
74
120
  if (!O.length) return {
75
- chart: T,
76
- notes: D,
121
+ chart: D,
122
+ notes: N,
77
123
  extremes: null,
78
124
  range: null,
79
125
  change: null,
80
126
  trend: null,
81
- outliers: null
127
+ outliers: null,
128
+ groups: null
82
129
  };
83
- let k = O[0], A = O[0];
84
- for (let e of O) e.y > k.y && (k = e), e.y < A.y && (A = e);
85
- let j = { values: {
86
- "highest.name": S(k.row),
87
- "highest.value": b(k.y, k.cell),
88
- "lowest.name": S(A.row),
89
- "lowest.value": b(A.y, A.cell)
90
- } }, M = p ? void 0 : u.find((e) => e.isTotal)?.cells[h], N = M && !M.missing ? M.value : O.reduce((e, t) => e + t.y, 0);
91
- j.values.total = b(N, k.cell), N > 0 && O.every((e) => e.y >= 0) && (j.values["highest.share"] = x(k.y / N * 100), j.values["lowest.share"] = x(A.y / N * 100));
92
- let P = { values: {
93
- "range.from": b(A.y, A.cell),
94
- "range.to": b(k.y, k.cell),
95
- "range.difference": b(k.y - A.y, k.cell)
96
- } }, F = t.getAttribute("data-chart") || "column";
97
- if (!f.includes(F) && !t.hasAttribute("data-chart-ordered")) return {
98
- chart: T,
99
- notes: D,
100
- extremes: j,
101
- range: P
130
+ let P = O[0], F = O[0];
131
+ for (let e of O) e.y > P.y && (P = e), e.y < F.y && (F = e);
132
+ let I = { values: {
133
+ "highest.name": w(P.row),
134
+ "highest.value": y(P.y, P.cell),
135
+ "lowest.name": w(F.row),
136
+ "lowest.value": y(F.y, F.cell)
137
+ } }, L = f ? void 0 : u.find((e) => e.isTotal)?.cells[m], R = L && !L.missing ? L.value : O.reduce((e, t) => e + t.y, 0);
138
+ I.values.total = y(R, P.cell), R > 0 && O.every((e) => e.y >= 0) && (I.values["highest.share"] = b(P.y / R * 100), I.values["lowest.share"] = b(F.y / R * 100));
139
+ let z = { values: {
140
+ "range.from": y(F.y, F.cell),
141
+ "range.to": y(P.y, P.cell),
142
+ "range.difference": y(P.y - F.y, P.cell)
143
+ } }, B = t.getAttribute("data-chart") || "column";
144
+ if (!h.includes(B) && !t.hasAttribute("data-chart-ordered")) return {
145
+ chart: D,
146
+ notes: N,
147
+ extremes: I,
148
+ range: z
102
149
  };
103
150
  if (O.length < 2) return {
104
- chart: T,
105
- notes: D,
106
- extremes: j,
107
- range: P,
151
+ chart: D,
152
+ notes: N,
153
+ extremes: I,
154
+ range: z,
108
155
  change: null,
109
156
  trend: null,
110
- outliers: null
157
+ outliers: null,
158
+ groups: null
111
159
  };
112
- let { share: I } = a(O), L = (e) => Math.abs(e) < c.flat ? "flat" : e > 0 ? "up" : "down", R = O[0], z = O[O.length - 1], B = I(z.y - R.y, R.y), V = {
160
+ let V = {
161
+ values: {},
162
+ items: x(O, c.groups).map((e) => {
163
+ let t = e.map((e) => e.y), n = e[0].cell;
164
+ return { values: {
165
+ from: w(e[0].row),
166
+ to: w(e[e.length - 1].row),
167
+ lowest: y(Math.min(...t), n),
168
+ average: y(t.reduce((e, t) => e + t, 0) / t.length, n),
169
+ highest: y(Math.max(...t), n)
170
+ } };
171
+ })
172
+ }, { share: H } = a(O), U = (e) => Math.abs(e) < c.flat ? "flat" : e > 0 ? "up" : "down", W = O[0], G = O[O.length - 1], K = H(G.y - W.y, W.y), q = {
113
173
  values: {
114
- "first.name": S(R.row),
115
- "first.value": b(R.y, R.cell),
116
- "last.name": S(z.row),
117
- "last.value": b(z.y, z.cell),
118
- "change.difference": b(Math.abs(z.y - R.y), z.cell),
119
- "change.percent": x(Math.abs(B)),
120
- change: c.words[L(B)]
174
+ "first.name": w(W.row),
175
+ "first.value": y(W.y, W.cell),
176
+ "last.name": w(G.row),
177
+ "last.value": y(G.y, G.cell),
178
+ "change.difference": y(Math.abs(G.y - W.y), G.cell),
179
+ "change.percent": b(Math.abs(K)),
180
+ change: c.words[U(K)]
121
181
  },
122
- when: L(B)
123
- }, H = r(O, c.flat, c.outliers);
124
- if (!H) return {
125
- chart: T,
126
- notes: D,
127
- extremes: j,
128
- range: P,
129
- change: V,
182
+ when: U(K)
183
+ }, J = r(O, c.flat, c.outliers);
184
+ if (!J) return {
185
+ chart: D,
186
+ notes: N,
187
+ extremes: I,
188
+ range: z,
189
+ change: q,
190
+ groups: V,
130
191
  trend: null,
131
192
  outliers: null
132
193
  };
133
- let { course: U, line: W, outside: G } = H, K = {
194
+ let { course: Y, line: X, outside: Z } = J, Q = {
134
195
  values: {
135
- trend: c.words[U],
136
- "trend.percent": x(Math.abs(I(W(z.x) - W(R.x), W(R.x)))),
137
- "trend.from": b(W(R.x), R.cell),
138
- "trend.to": b(W(z.x), z.cell),
139
- "flat.percent": x(c.flat),
140
- "outliers.percent": x(c.outliers)
196
+ trend: c.words[Y],
197
+ "trend.percent": b(Math.abs(H(X(G.x) - X(W.x), X(W.x)))),
198
+ "trend.from": y(X(W.x), W.cell),
199
+ "trend.to": y(X(G.x), G.cell),
200
+ "flat.percent": b(c.flat),
201
+ "outliers.percent": b(c.outliers)
141
202
  },
142
- when: U
203
+ when: Y
143
204
  };
144
- return U === "unclear" ? {
145
- chart: T,
146
- notes: D,
147
- extremes: j,
148
- range: P,
149
- change: V,
150
- trend: K
205
+ return Y === "unclear" ? {
206
+ chart: D,
207
+ notes: N,
208
+ extremes: I,
209
+ range: z,
210
+ change: q,
211
+ groups: V,
212
+ trend: Q
151
213
  } : {
152
- chart: T,
153
- notes: D,
154
- extremes: j,
155
- range: P,
156
- change: V,
157
- trend: K,
158
- outliers: G.length ? {
159
- values: { "outliers.count": n(G.length, 0, l).join("") },
160
- counts: { "outliers.count": G.length },
161
- items: G.map((e) => ({
162
- name: S(e.row),
163
- value: b(e.y, e.cell),
164
- expected: b(W(e.x), e.cell),
165
- deviation: x(Math.abs(I(e.y - W(e.x), W(e.x)))),
166
- side: c.words[e.y > W(e.x) ? "above" : "below"]
167
- }))
214
+ chart: D,
215
+ notes: N,
216
+ extremes: I,
217
+ range: z,
218
+ change: q,
219
+ groups: V,
220
+ trend: Q,
221
+ outliers: Z.length ? {
222
+ values: { "outliers.count": e(Z.length, 0, l).join("") },
223
+ counts: { "outliers.count": Z.length },
224
+ items: Z.map((e) => j({
225
+ name: w(e.row),
226
+ value: y(e.y, e.cell),
227
+ expected: y(X(e.x), e.cell),
228
+ deviation: b(Math.abs(H(e.y - X(e.x), X(e.x)))),
229
+ side: c.words[e.y > X(e.x) ? "above" : "below"]
230
+ }, e.y))
168
231
  } : null
169
232
  };
170
- }, b = (e, t, n, r, i) => {
171
- let [a, o] = r.delimiters, s = RegExp(`${m(a)}([\\w.]+)(\\|.*?)?${m(o)}`, "g"), c = document.createTreeWalker(e, NodeFilter.SHOW_TEXT), l = [];
233
+ }, T = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), E = (e, t, n, r, i) => {
234
+ let [a, o] = r.delimiters, s = RegExp(`${T(a)}([\\w.]+)(\\|.*?)?${T(o)}`, "g"), c = document.createTreeWalker(e, NodeFilter.SHOW_TEXT), l = [];
172
235
  for (; c.nextNode();) l.push(c.currentNode);
173
236
  for (let e of l) {
174
237
  let r = e.textContent ?? "", a = [], o = 0;
175
238
  for (let e of r.matchAll(s)) {
176
239
  let [s, c, l] = e, u = t[c];
177
- if (u === void 0) _(`A summary has the placeholder ${s}, which no analysis fills.`);
240
+ if (u === void 0) b(`A summary has the placeholder ${s}, which no analysis fills.`);
178
241
  else {
179
242
  if (l && n[c] !== void 0) {
180
- let e = Object.fromEntries(l.slice(1).split("|").map((e) => [e.slice(0, e.indexOf(":")), e.slice(e.indexOf(":") + 1)])), t = e[new Intl.PluralRules(i).select(n[c])] ?? e.other;
243
+ let e = Object.fromEntries(l.slice(1).split("|").map((e) => [e.slice(0, e.indexOf(":")), e.slice(e.indexOf(":") + 1)])), t = e[new Intl.PluralRules(i, { type: v.has(c) ? "ordinal" : "cardinal" }).select(n[c])] ?? e.other;
181
244
  t !== void 0 && (u = t.replace("#", typeof u == "string" ? u : u.textContent ?? ""));
182
245
  }
183
246
  a.push(r.slice(o, e.index), typeof u == "string" ? u : u.cloneNode(!0)), o = (e.index ?? 0) + s.length;
@@ -185,16 +248,59 @@ var s = {
185
248
  }
186
249
  a.length && (a.push(r.slice(o)), e.replaceWith(...a));
187
250
  }
188
- }, x = (e, t) => {
251
+ }, D = "data-summary-options", O = (e, t, r) => {
252
+ try {
253
+ return JSON.parse(e);
254
+ } catch {
255
+ console.warn(`[${n}] ${r} needs JSON.`, t);
256
+ return;
257
+ }
258
+ }, k = (e, t) => {
259
+ let n = e.getAttribute(`data-summary-${t}`)?.trim();
260
+ if (!n) return;
261
+ if (t === "locale") return n;
262
+ if (t === "words") return O(n, e, "data-summary-words");
263
+ if (t === "delimiters") {
264
+ let e = n.split(/\s+/);
265
+ return e.length === 2 ? e : void 0;
266
+ }
267
+ let r = Number.parseFloat(n);
268
+ return Number.isFinite(r) ? r : void 0;
269
+ }, A = (e, t) => {
270
+ let n = [];
271
+ for (let t = e; t; t = t.parentElement) {
272
+ let e = t.getAttribute(D), r = e ? O(e, t, D) : void 0;
273
+ r && typeof r == "object" && n.unshift(r);
274
+ }
275
+ let r = {};
276
+ for (let t of u) {
277
+ let n = k(e, t);
278
+ n !== void 0 && (r[t] = n);
279
+ }
280
+ n.push(r);
281
+ let i = t;
282
+ for (let e of n) {
283
+ let t = Object.fromEntries(Object.entries(e).filter(([e]) => u.includes(e)));
284
+ i = {
285
+ ...i,
286
+ ...t,
287
+ words: {
288
+ ...i.words,
289
+ ...t.words
290
+ }
291
+ };
292
+ }
293
+ return i;
294
+ }, j = 0, M = (e, t) => {
189
295
  let n = e.dataset.summary;
190
296
  if (n === void 0) return !0;
191
- if (p.includes(n) || _(`A summary asks for the analysis "${n}", which does not exist.`), !(n in t)) return !1;
297
+ if (_.includes(n) || b(`A summary asks for the analysis "${n}", which does not exist.`), !(n in t)) return !1;
192
298
  let r = t[n], i = e.dataset.when;
193
299
  return e.hasAttribute("data-none") ? !r : !!r && (!i || r.when === i);
194
- }, S = (e, t, n, r) => {
300
+ }, N = (e, t, n, r) => {
195
301
  let i = e.cloneNode(!0);
196
302
  for (let e of [
197
- u,
303
+ p,
198
304
  "hidden",
199
305
  "id",
200
306
  "data-summary",
@@ -203,9 +309,9 @@ var s = {
203
309
  "data-series",
204
310
  ...n.langattribute ? [n.langattribute] : []
205
311
  ]) i.removeAttribute(e);
206
- i.setAttribute(d, "");
312
+ i.setAttribute(m, "");
207
313
  let a = Object.values(t).filter((e) => !!e), o = Object.assign({}, ...a.map((e) => e.values)), s = Object.assign({}, ...a.map((e) => e.counts ?? {}));
208
- for (let e of i.querySelectorAll("[data-summary]")) if (!x(e, t)) e.remove();
314
+ for (let e of i.querySelectorAll("[data-summary]")) if (!M(e, t)) e.remove();
209
315
  else for (let t of [
210
316
  "data-summary",
211
317
  "data-none",
@@ -214,75 +320,87 @@ var s = {
214
320
  for (let e of i.querySelectorAll("[data-each]")) {
215
321
  let i = (t[e.dataset.each ?? ""]?.items ?? []).map((t) => {
216
322
  let i = e.cloneNode(!0);
217
- return i.removeAttribute("data-each"), b(i, {
323
+ return i.removeAttribute("data-each"), E(i, {
218
324
  ...o,
219
- ...t
220
- }, s, n, r), i;
221
- }), a = new Intl.ListFormat(r, { type: "conjunction" }).formatToParts(i.map((e, t) => String(t)));
325
+ ...t.values
326
+ }, {
327
+ ...s,
328
+ ...t.counts
329
+ }, n, r), i;
330
+ });
331
+ if (e.matches("tr, li")) {
332
+ e.replaceWith(...i);
333
+ continue;
334
+ }
335
+ let a = new Intl.ListFormat(r, { type: "conjunction" }).formatToParts(i.map((e, t) => String(t)));
222
336
  e.replaceWith(...a.map((e) => e.type === "element" ? i[Number(e.value)] : e.value));
223
337
  }
224
- return b(i, o, s, n, r), i;
225
- }, C = (e, t = {}) => {
226
- let n = {
227
- ...s,
228
- ...t
229
- }, r = n.locale || document.documentElement.lang || void 0, i = e.querySelector(`:scope > .${c}`);
230
- if (!i || !e.querySelector("tbody tr")) return;
231
- i.id || (i.id = `tablechart-summary-${++h}`);
232
- let a = (e.getAttribute("aria-describedby") ?? "").split(/\s+/).filter(Boolean);
233
- a.includes(i.id) || e.setAttribute("aria-describedby", [...a, i.id].join(" "));
234
- for (let e of i.querySelectorAll(`:scope > [${d}]`)) e.remove();
235
- let o = /* @__PURE__ */ new Map();
236
- for (let t of i.querySelectorAll(":scope > *")) {
237
- t.setAttribute(u, ""), t.hidden = !0;
238
- let i = t.dataset.series === "total" ? -1 : Math.max(1, Number.parseInt(t.dataset.series ?? "1", 10) || 1) - 1;
239
- o.has(i) || o.set(i, y(e, i, n, r));
240
- let a = o.get(i);
241
- x(t, a) && t.after(S(t, a, n, r));
338
+ return E(i, o, s, n, r), i;
339
+ }, P = (e, n = l.config ?? {}) => {
340
+ let r = A(e, {
341
+ ...c,
342
+ ...n,
343
+ words: {
344
+ ...c.words,
345
+ ...n.words
346
+ }
347
+ }), i = r.locale || document.documentElement.lang || void 0, a = e.querySelector(`:scope > .${d}`);
348
+ if (!a || !t(e)?.querySelector("tbody tr")) return;
349
+ a.id || (a.id = `tablechart-summary-${++j}`);
350
+ let o = (e.getAttribute("aria-describedby") ?? "").split(/\s+/).filter(Boolean);
351
+ o.includes(a.id) || e.setAttribute("aria-describedby", [...o, a.id].join(" "));
352
+ for (let e of a.querySelectorAll(`:scope > [${m}]`)) e.remove();
353
+ let s = /* @__PURE__ */ new Map();
354
+ for (let t of a.querySelectorAll(":scope > *")) {
355
+ t.setAttribute(p, ""), t.hidden = !0;
356
+ let n = String(g[e.getAttribute("data-chart") ?? ""] ?? 1), a = t.dataset.series === "total" ? -1 : Math.max(1, Number.parseInt(t.dataset.series ?? n, 10) || 1) - 1;
357
+ s.has(a) || s.set(a, w(e, a, r, i));
358
+ let o = s.get(a);
359
+ M(t, o) && t.after(N(t, o, r, i));
242
360
  }
243
- }, w = null, T = (e = {}) => {
244
- let t = {
245
- ...s,
361
+ }, F = (e = {}) => {
362
+ let n = {
363
+ ...c,
246
364
  ...e,
247
365
  words: {
248
- ...s.words,
366
+ ...c.words,
249
367
  ...e.words
250
368
  }
251
369
  };
252
- if (w) return;
253
- w = t;
254
- let n = () => Array.from(document.querySelectorAll(t.selector)).filter((e) => e.querySelector(`:scope > .${c}`)), r = /* @__PURE__ */ new Set(), i = document.documentElement, a = () => {
255
- r.size || i.hasAttribute(l) || !n().every((e) => e.querySelector("tbody tr")) || (i.setAttribute(l, ""), document.dispatchEvent(new CustomEvent("tablechart:summary-ready")));
256
- }, o = (e) => {
257
- i.removeAttribute(l), r.size || requestAnimationFrame(() => {
258
- let e = [...r];
259
- r.clear();
260
- for (let n of e) C(n, t);
261
- a();
262
- }), r.add(e);
263
- }, d = /* @__PURE__ */ new WeakSet(), f = (e) => {
264
- let t = [...e.querySelectorAll(`:scope > .${c} > [${u}]`), ...e.querySelectorAll(":scope > table")];
265
- for (let n of t) d.has(n) || (d.add(n), new MutationObserver(() => o(e)).observe(n, {
370
+ if (l.config) return;
371
+ l.config = n;
372
+ let r = () => Array.from(document.querySelectorAll(n.selector)).filter((e) => e.querySelector(`:scope > .${d}`)), i = /* @__PURE__ */ new Set(), a = document.documentElement, o = () => {
373
+ i.size || a.hasAttribute("data-summary-ready") || !r().every((e) => t(e)?.querySelector("tbody tr")) || (a.setAttribute(f, ""), document.dispatchEvent(new CustomEvent("tablechart:summary-ready")));
374
+ }, s = (e) => {
375
+ a.removeAttribute(f), i.size || requestAnimationFrame(() => {
376
+ let e = [...i];
377
+ i.clear();
378
+ for (let t of e) P(t, n);
379
+ o();
380
+ }), i.add(e);
381
+ }, u = /* @__PURE__ */ new WeakSet(), m = (e) => {
382
+ let t = [...e.querySelectorAll(`:scope > .${d} > [${p}]`), ...e.querySelectorAll(":scope > table")];
383
+ for (let n of t) u.has(n) || (u.add(n), new MutationObserver(() => s(e)).observe(n, {
266
384
  subtree: !0,
267
385
  childList: !0,
268
386
  characterData: !0
269
387
  }));
270
- }, p = (e) => {
271
- C(e, t), f(e);
388
+ }, h = (e) => {
389
+ P(e, n), m(e);
272
390
  };
273
- for (let e of n()) p(e);
274
- a(), document.addEventListener("tablechart:table", (e) => {
275
- let n = e.target;
276
- n instanceof HTMLElement && n.matches(t.selector) && n.querySelector(`:scope > .${c}`) && (p(n), a());
277
- }), t.locale || new MutationObserver(() => {
278
- for (let e of n()) o(e);
391
+ for (let e of r()) h(e);
392
+ o(), document.addEventListener("tablechart:table", (e) => {
393
+ let t = e.target;
394
+ t instanceof HTMLElement && t.matches(n.selector) && t.querySelector(":scope > .chart-summary") && (h(t), o());
395
+ }), n.locale || new MutationObserver(() => {
396
+ for (let e of r()) s(e);
279
397
  }).observe(document.documentElement, {
280
398
  attributes: !0,
281
399
  attributeFilter: ["lang"]
282
400
  });
283
- }, E = {
284
- init: T,
285
- fill: C,
286
- defaults: s
401
+ }, I = {
402
+ init: F,
403
+ fill: P,
404
+ defaults: c
287
405
  };
288
- export { E as Summary, C as fill, T as init, s as summaryDefaults };
406
+ export { I as Summary, P as fill, F as init, c as summaryDefaults };