@blueprint-chart/lib 2.10.0 → 2.11.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.
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { $ as e, $t as t, A as n, At as r, B as i, Bt as a, C as o, Ct as s, D as c, Dt as l, E as u, Et as d, F as f, Ft as p, G as m, Gt as h, H as g, Ht as ee, I as _, It as v, J as y, Jt as te, K as ne, Kt as re, L as ie, Lt as ae, M as b, Mt as oe, N as se, Nt as ce, O as le, Ot as ue, P as x, Pt as de, Q as fe, Qt as pe, R as me, Rt as he, S as ge, St as _e, T as ve, Tt as ye, U as S, Ut as be, V as xe, Vt as Se, W as Ce, Wt as we, X as C, Xt as Te, Y as Ee, Yt as De, Z as Oe, Zt as ke, _ as Ae, _t as je, a as Me, at as Ne, b as Pe, bt as Fe, c as Ie, ct as Le, d as Re, dt as ze, en as Be, et as Ve, f as He, ft as Ue, g as We, gt as Ge, h as Ke, ht as qe, i as Je, it as Ye, j as Xe, jt as Ze, k as Qe, kt as $e, l as et, lt as tt, m as nt, mt as rt, n as it, nn as at, nt as ot, o as st, ot as ct, p as lt, pt as ut, q as dt, qt as ft, r as pt, rn as mt, rt as ht, s as gt, st as _t, t as vt, tn as yt, tt as bt, u as xt, ut as St, v as Ct, vt as wt, w as Tt, wt as Et, x as Dt, xt as Ot, y as kt, yt as At, z as w, zt as jt } from "./render-bpc-BL73t_Ih.js";
2
- import { t as Mt } from "./runtime-gzeMNwqx.js";
3
- import T from "chroma-js";
1
+ import { $ as e, $t as t, A as n, At as r, B as i, Bt as a, C as o, Ct as s, D as c, Dt as l, E as u, Et as d, F as f, Ft as p, G as m, Gt as h, H as g, Ht as ee, I as te, It as _, J as v, Jt as ne, K as re, Kt as ie, L as ae, Lt as oe, M as y, Mt as se, N as ce, Nt as le, O as ue, Ot as de, P as b, Pt as x, Q as fe, Qt as pe, R as S, Rt as me, S as he, St as ge, T as _e, Tt as ve, U as C, Ut as ye, V as be, Vt as xe, W as Se, Wt as Ce, X as we, Xt as Te, Y as Ee, Yt as De, Z as Oe, Zt as ke, _ as Ae, _t as je, a as Me, an as Ne, at as Pe, b as Fe, bt as Ie, c as Le, cn as Re, ct as ze, d as Be, dt as Ve, en as He, et as Ue, f as We, ft as Ge, g as Ke, gt as qe, h as Je, ht as Ye, i as Xe, in as Ze, it as Qe, j as $e, jt as et, k as w, kt as T, l as tt, lt as nt, m as rt, mt as it, n as at, nn as ot, nt as st, o as ct, on as lt, ot as ut, p as dt, pt as ft, q as pt, qt as mt, r as ht, rn as gt, rt as _t, s as vt, sn as yt, st as bt, t as xt, tn as St, tt as Ct, u as wt, ut as Tt, v as Et, vt as Dt, w as Ot, wt as kt, x as At, xt as jt, y as Mt, yt as Nt, z as E, zt as Pt } from "./render-bpc-dodOcvDz.js";
2
+ import { t as Ft } from "./runtime-D_vHKSyR.js";
3
+ import D from "chroma-js";
4
4
  //#region src/recommendations/intent.ts
5
- var Nt = [
5
+ var It = [
6
6
  {
7
7
  intent: "range",
8
8
  pattern: /\b(range|high and low|high\/low|margin of error|confidence interval|confidence|interval|plus or minus|spread between)\b/i
@@ -32,103 +32,104 @@ var Nt = [
32
32
  pattern: /\b(compares?|compared|comparison|versus|vs\.?|more than|difference between|across|than)\b/i
33
33
  }
34
34
  ];
35
- function E(e) {
35
+ function Lt(e) {
36
36
  if (e === void 0 || e.trim() === "") return "none";
37
- for (let t of Nt) if (t.pattern.test(e)) return t.intent;
37
+ for (let t of It) if (t.pattern.test(e)) return t.intent;
38
38
  return "none";
39
39
  }
40
40
  //#endregion
41
41
  //#region src/recommendations/decisionTable.ts
42
- var D = (e, t, n) => ({
42
+ var O = (e, t, n) => ({
43
43
  type: e,
44
44
  fitness: t,
45
45
  reason: n
46
- }), O = {
46
+ }), k = {
47
47
  "1cat+1num": {
48
48
  none: (e) => {
49
- let t = [D("bar-vertical", "best", "1 categorical + 1 numeric — classic bar chart"), D("bar-horizontal", "good", "Horizontal bars work well for long labels")];
50
- return e <= 8 && (t.push(D("donut", "good", `${e} items — suitable for part-of-whole`)), t.push(D("pie", "alternative", "Pie chart for part-of-whole"))), t;
49
+ let t = [O("bar-vertical", "best", "1 categorical + 1 numeric — classic bar chart"), O("bar-horizontal", "good", "Horizontal bars work well for long labels")];
50
+ return e <= 8 && (t.push(O("donut", "good", `${e} items — suitable for part-of-whole`)), t.push(O("pie", "alternative", "Pie chart for part-of-whole"))), t;
51
51
  },
52
- comparison: (e) => O["1cat+1num"].none(e),
53
- ranking: () => [D("bar-horizontal", "best", "Ranked categories read best as horizontal bars"), D("bar-vertical", "good", "Vertical bars also work for ranking")],
52
+ comparison: (e) => k["1cat+1num"].none(e),
53
+ ranking: () => [O("bar-horizontal", "best", "Ranked categories read best as horizontal bars"), O("bar-vertical", "good", "Vertical bars also work for ranking")],
54
54
  "part-to-whole": (e) => e <= 5 ? [
55
- D("pie", "best", `${e} slices — pie reads cleanly for very small N`),
56
- D("donut", "good", "Donut for part-of-whole with a center label"),
57
- D("bar-vertical", "alternative", "Bars if precise comparison matters")
55
+ O("pie", "best", `${e} slices — pie reads cleanly for very small N`),
56
+ O("donut", "good", "Donut for part-of-whole with a center label"),
57
+ O("bar-vertical", "alternative", "Bars if precise comparison matters")
58
58
  ] : e <= 8 ? [
59
- D("donut", "best", `${e} slices — donut for part-of-whole`),
60
- D("pie", "good", "Pie for part-of-whole"),
61
- D("bar-vertical", "alternative", "Bars if precise comparison matters")
62
- ] : [D("bar-vertical", "best", `${e} categories — too many for a readable pie`), D("bar-horizontal", "good", "Horizontal bars for long labels")],
63
- range: () => [D("bar-vertical", "best", "A single numeric column carries no range — plain bars read the value directly"), D("bar-horizontal", "good", "Horizontal bars work well for long labels")]
59
+ O("donut", "best", `${e} slices — donut for part-of-whole`),
60
+ O("pie", "good", "Pie for part-of-whole"),
61
+ O("bar-vertical", "alternative", "Bars if precise comparison matters")
62
+ ] : [O("bar-vertical", "best", `${e} categories — too many for a readable pie`), O("bar-horizontal", "good", "Horizontal bars for long labels")],
63
+ range: () => [O("bar-vertical", "best", "A single numeric column carries no range — plain bars read the value directly"), O("bar-horizontal", "good", "Horizontal bars work well for long labels")]
64
64
  },
65
65
  "1cat+Nnum": {
66
- none: () => [D("bar-multi", "best", "1 categorical + multiple numeric columns — compare groups"), D("line-multi", "good", "Can also show as a multi-line chart")],
67
- comparison: (e) => O["1cat+Nnum"].none(e),
68
- ranking: (e) => O["1cat+Nnum"].none(e),
69
- trend: () => [D("line-multi", "best", "A trend or crossover story reads best as lines, even over categorical periods"), D("bar-multi", "alternative", "Grouped bars if per-period comparison matters more than the trend")],
66
+ none: () => [O("bar-multi", "best", "1 categorical + multiple numeric columns — compare groups"), O("line-multi", "good", "Can also show as a multi-line chart")],
67
+ comparison: (e) => k["1cat+Nnum"].none(e),
68
+ ranking: (e) => k["1cat+Nnum"].none(e),
69
+ trend: () => [O("line-multi", "best", "A trend or crossover story reads best as lines, even over categorical periods"), O("bar-multi", "alternative", "Grouped bars if per-period comparison matters more than the trend")],
70
70
  "part-to-whole": () => [
71
- D("bar-stacked", "best", "Stacked bars show composition within each category"),
72
- D("column-stacked", "good", "Stacked columns for the same composition"),
73
- D("bar-multi", "alternative", "Grouped bars if comparison beats composition")
71
+ O("bar-stacked", "best", "Stacked bars show composition within each category"),
72
+ O("column-stacked", "good", "Stacked columns for the same composition"),
73
+ O("bar-multi", "alternative", "Grouped bars if comparison beats composition")
74
74
  ],
75
75
  "composition-over-time": () => [
76
- D("column-stacked", "best", "Stacked columns show composition across discrete periods"),
77
- D("bar-stacked", "good", "Stacked bars for the same composition"),
78
- D("area-stacked", "alternative", "Stacked area if the periods are continuous time")
76
+ O("column-stacked", "best", "Stacked columns show composition across discrete periods"),
77
+ O("bar-stacked", "good", "Stacked bars for the same composition"),
78
+ O("area-stacked", "alternative", "Stacked area if the periods are continuous time")
79
79
  ],
80
- relationship: () => [D("scatter", "best", "Two numeric columns per item — a scatter plot shows how they move together"), D("line-multi", "alternative", "Lines if the categories have a natural order")],
81
- range: () => [D("bar-split", "best", "Diverging bars show values around a shared baseline"), D("bar-multi", "alternative", "Grouped bars if there is no shared baseline")]
80
+ relationship: () => [O("scatter", "best", "Two numeric columns per item — a scatter plot shows how they move together"), O("line-multi", "alternative", "Lines if the categories have a natural order")],
81
+ range: () => [O("dot-plot", "best", "A dot with a bar from low to high shows each value with its margin. Set dotStyle = \"range\" and pick the low and high columns"), O("bar-split", "alternative", "Split bars if each bound should read as its own panel")]
82
82
  },
83
83
  "1cat+text+Nnum": {
84
- none: () => [D("scatter", "best", "A label, a text column and several numbers — plot one number against another"), D("bar-multi", "alternative", "Grouped bars if comparing values per row matters more")],
85
- relationship: (e) => O["1cat+text+Nnum"].none(e)
84
+ none: () => [O("scatter", "best", "A label, a text column and several numbers — plot one number against another"), O("bar-multi", "alternative", "Grouped bars if comparing values per row matters more")],
85
+ relationship: (e) => k["1cat+text+Nnum"].none(e)
86
86
  },
87
87
  "1date+1num": {
88
- none: () => [D("line", "best", "1 date + 1 numeric column — ideal for trend"), D("bar-vertical", "alternative", "Can also show as bars")],
88
+ none: () => [O("line", "best", "1 date + 1 numeric column — ideal for trend"), O("bar-vertical", "alternative", "Can also show as bars")],
89
89
  trend: () => [
90
- D("line", "best", "1 date + 1 numeric column — ideal for trend"),
91
- D("area", "good", "Filled area emphasizes magnitude over time"),
92
- D("bar-vertical", "alternative", "Can also show as bars")
90
+ O("line", "best", "1 date + 1 numeric column — ideal for trend"),
91
+ O("area", "good", "Filled area emphasizes magnitude over time"),
92
+ O("bar-vertical", "alternative", "Can also show as bars")
93
93
  ],
94
- comparison: () => [D("bar-vertical", "best", "Bars for comparing discrete time points"), D("line", "good", "Line if the trend matters more than the comparison")],
95
- ranking: () => [D("bar-vertical", "best", "Bars for ranking discrete time points"), D("line", "good", "Line for the underlying trend")],
96
- "part-to-whole": () => [D("area", "best", "Filled area reads as magnitude/share over time"), D("line", "good", "Line for the underlying trend")],
97
- "composition-over-time": () => [D("area", "best", "Filled area shows magnitude over time"), D("line", "good", "Line for the underlying trend")]
94
+ comparison: () => [O("bar-vertical", "best", "Bars for comparing discrete time points"), O("line", "good", "Line if the trend matters more than the comparison")],
95
+ ranking: () => [O("bar-vertical", "best", "Bars for ranking discrete time points"), O("line", "good", "Line for the underlying trend")],
96
+ "part-to-whole": () => [O("area", "best", "Filled area reads as magnitude/share over time"), O("line", "good", "Line for the underlying trend")],
97
+ "composition-over-time": () => [O("area", "best", "Filled area shows magnitude over time"), O("line", "good", "Line for the underlying trend")]
98
98
  },
99
99
  "1date+Nnum": {
100
- none: () => [D("line-multi", "best", "1 date + multiple numeric columns — compare trends"), D("bar-multi", "alternative", "Can also show as grouped bars")],
101
- trend: (e) => O["1date+Nnum"].none(e),
102
- comparison: (e) => O["1date+Nnum"].none(e),
103
- ranking: (e) => O["1date+Nnum"].none(e),
100
+ none: () => [O("line-multi", "best", "1 date + multiple numeric columns — compare trends"), O("bar-multi", "alternative", "Can also show as grouped bars")],
101
+ trend: (e) => k["1date+Nnum"].none(e),
102
+ comparison: (e) => k["1date+Nnum"].none(e),
103
+ ranking: (e) => k["1date+Nnum"].none(e),
104
104
  "composition-over-time": () => [
105
- D("area-stacked", "best", "Stacked area shows composition over continuous time"),
106
- D("column-stacked", "good", "Stacked columns for the same composition"),
107
- D("line-multi", "alternative", "Multi-line if composition is not the point")
105
+ O("area-stacked", "best", "Stacked area shows composition over continuous time"),
106
+ O("column-stacked", "good", "Stacked columns for the same composition"),
107
+ O("line-multi", "alternative", "Multi-line if composition is not the point")
108
108
  ],
109
- "part-to-whole": () => [D("area-stacked", "best", "Stacked area shows share over time"), D("line-multi", "good", "Multi-line if absolute trends matter more")]
109
+ "part-to-whole": () => [O("area-stacked", "best", "Stacked area shows share over time"), O("line-multi", "good", "Multi-line if absolute trends matter more")]
110
110
  },
111
- other: { none: () => [D("bar-vertical", "good", "Default bar chart recommendation")] }
111
+ other: { none: () => [O("bar-vertical", "good", "Default bar chart recommendation")] }
112
112
  };
113
- function Pt(e, t, n) {
114
- let r = O[e], i = r[t] ?? r.none;
115
- return i ? i(n) : [D("bar-vertical", "good", "Default bar chart recommendation")];
113
+ function Rt(e, t, n) {
114
+ let r = k[e], i = r[t] ?? r.none;
115
+ return i ? i(n) : [O("bar-vertical", "good", "Default bar chart recommendation")];
116
116
  }
117
117
  //#endregion
118
118
  //#region src/recommendations/shape.ts
119
- function Ft(e, t) {
119
+ function zt(e, t) {
120
120
  let n = e[0] === "date", r = e.filter((e) => e === "string").length, i = n ? e.filter((e) => e === "date").length : 0, a = e.filter((e) => e === "number" || e === "date" && !n).length;
121
121
  return i === 1 && r === 0 && a >= 1 ? a === 1 ? "1date+1num" : "1date+Nnum" : r === 1 && i === 0 && a >= 1 ? a === 1 ? "1cat+1num" : "1cat+Nnum" : e[0] === "string" && i === 0 && r >= 2 && a >= 2 ? "1cat+text+Nnum" : "other";
122
122
  }
123
123
  //#endregion
124
124
  //#region src/recommendations/types.ts
125
- var It = {
125
+ var Bt = {
126
126
  "bar-vertical": "Vertical Bar Chart",
127
127
  "bar-horizontal": "Horizontal Bar Chart",
128
128
  "bar-multi": "Grouped Bar Chart",
129
129
  "bar-grouped": "Grouped Bar Chart",
130
130
  "bar-stacked": "Stacked Bar Chart",
131
131
  "bar-split": "Diverging Bar Chart",
132
+ "dot-plot": "Dot Plot",
132
133
  "column-stacked": "Stacked Column Chart",
133
134
  line: "Line Chart",
134
135
  "line-multi": "Multi-Line Chart",
@@ -140,17 +141,17 @@ var It = {
140
141
  };
141
142
  //#endregion
142
143
  //#region src/recommendations/recommend.ts
143
- function Lt(e, t, n) {
144
- return e.length === 0 ? [] : Pt(Ft(e, t), E(n), t).map((e) => ({
144
+ function Vt(e, t, n) {
145
+ return e.length === 0 ? [] : Rt(zt(e, t), Lt(n), t).map((e) => ({
145
146
  chartType: e.type,
146
- label: It[e.type] ?? e.type,
147
+ label: Bt[e.type] ?? e.type,
147
148
  fitness: e.fitness,
148
149
  reason: e.reason
149
150
  }));
150
151
  }
151
152
  //#endregion
152
153
  //#region src/charts/themes/index.ts
153
- var Rt = [
154
+ var Ht = [
154
155
  {
155
156
  name: "blueprint",
156
157
  label: "Blueprint",
@@ -167,16 +168,16 @@ var Rt = [
167
168
  description: "Charts on the blueprint canvas with the full brand palette"
168
169
  }
169
170
  ];
170
- function zt() {
171
- return Rt;
171
+ function Ut() {
172
+ return Ht;
172
173
  }
173
174
  //#endregion
174
175
  //#region src/charts/colorblind.ts
175
- var Bt = {
176
+ var Wt = {
176
177
  protanopia: "Protanopia (no red)",
177
178
  deuteranopia: "Deuteranopia (no green)",
178
179
  tritanopia: "Tritanopia (no blue)"
179
- }, Vt = {
180
+ }, Gt = {
180
181
  protanopia: [
181
182
  .152286,
182
183
  1.052583,
@@ -244,27 +245,27 @@ var Bt = {
244
245
  0
245
246
  ]
246
247
  };
247
- function Ht(e) {
248
+ function Kt(e) {
248
249
  return `bc-cvd-${e}`;
249
250
  }
250
- function Ut(e) {
251
+ function qt(e) {
251
252
  let t = "http://www.w3.org/2000/svg", n = document.createElementNS(t, "filter");
252
- n.setAttribute("id", Ht(e)), n.setAttribute("color-interpolation-filters", "linearRGB");
253
+ n.setAttribute("id", Kt(e)), n.setAttribute("color-interpolation-filters", "linearRGB");
253
254
  let r = document.createElementNS(t, "feColorMatrix");
254
- return r.setAttribute("type", "matrix"), r.setAttribute("values", Vt[e].join(" ")), n.appendChild(r), n;
255
+ return r.setAttribute("type", "matrix"), r.setAttribute("values", Gt[e].join(" ")), n.appendChild(r), n;
255
256
  }
256
- function Wt(e) {
257
+ function Jt(e) {
257
258
  return e <= .04045 ? e / 12.92 : ((e + .055) / 1.055) ** 2.4;
258
259
  }
259
- function k(e) {
260
+ function A(e) {
260
261
  return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
261
262
  }
262
- function Gt(e, t) {
263
- let [n, r, i] = (T.valid(e) ? T(e) : T("#000")).rgb().map((e) => Wt(e / 255)), a = Vt[t], o = k(a[0] * n + a[1] * r + a[2] * i), s = k(a[5] * n + a[6] * r + a[7] * i), c = k(a[10] * n + a[11] * r + a[12] * i), l = (e) => Math.min(255, Math.max(0, Math.round(e * 255)));
264
- return T(l(o), l(s), l(c)).hex();
263
+ function Yt(e, t) {
264
+ let [n, r, i] = (D.valid(e) ? D(e) : D("#000")).rgb().map((e) => Jt(e / 255)), a = Gt[t], o = A(a[0] * n + a[1] * r + a[2] * i), s = A(a[5] * n + a[6] * r + a[7] * i), c = A(a[10] * n + a[11] * r + a[12] * i), l = (e) => Math.min(255, Math.max(0, Math.round(e * 255)));
265
+ return D(l(o), l(s), l(c)).hex();
265
266
  }
266
- var Kt = 10;
267
- function qt(e) {
267
+ var Xt = 10;
268
+ function Zt(e) {
268
269
  if (e.length < 2) return [];
269
270
  let t = [
270
271
  "protanopia",
@@ -272,10 +273,10 @@ function qt(e) {
272
273
  "tritanopia"
273
274
  ], n = [];
274
275
  for (let r of t) {
275
- let t = e.map((e) => Gt(e, r)), i = [];
276
+ let t = e.map((e) => Yt(e, r)), i = [];
276
277
  for (let n = 0; n < t.length; n++) for (let r = n + 1; r < t.length; r++) {
277
- let a = T.deltaE(t[n], t[r]);
278
- a < Kt && i.push({
278
+ let a = D.deltaE(t[n], t[r]);
279
+ a < Xt && i.push({
279
280
  a: e[n],
280
281
  b: e[r],
281
282
  deltaE: a
@@ -283,7 +284,7 @@ function qt(e) {
283
284
  }
284
285
  i.length > 0 && n.push({
285
286
  type: r,
286
- label: Bt[r],
287
+ label: Wt[r],
287
288
  pairs: i
288
289
  });
289
290
  }
@@ -291,70 +292,70 @@ function qt(e) {
291
292
  }
292
293
  //#endregion
293
294
  //#region src/dsl/serializer.ts
294
- function A(e, t) {
295
- return (e ?? []).flatMap((e) => e.split("\n").map((e) => `${t}// ${e.trim()}`));
296
- }
297
295
  function j(e, t) {
298
- return t == null ? e : t.includes("\n") ? `${e} /* ${t} */` : `${e} // ${t}`;
296
+ return (e ?? []).flatMap((e) => e.split("\n").map((e) => `${t}// ${e.trim()}`));
299
297
  }
300
298
  function M(e, t) {
301
- return [...A(e.trailingComments, `${t} `), j(`${t}}`, e.trailingComment)];
299
+ return t == null ? e : t.includes("\n") ? `${e} /* ${t} */` : `${e} // ${t}`;
302
300
  }
303
- function N(e) {
304
- return typeof e.value == "number" ? e.isPercentage ? `${e.value}%` : `${e.value}` : typeof e.value == "string" && e.value.startsWith("#") ? w(e.value) : typeof e.value == "string" && /^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e.value) ? e.value : w(String(e.value));
301
+ function N(e, t) {
302
+ return [...j(e.trailingComments, `${t} `), M(`${t}}`, e.trailingComment)];
305
303
  }
306
304
  function P(e) {
307
- return /^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e) ? e : w(e);
305
+ return typeof e.value == "number" ? e.isPercentage ? `${e.value}%` : `${e.value}` : typeof e.value == "string" && e.value.startsWith("#") ? E(e.value) : typeof e.value == "string" && /^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e.value) ? e.value : E(String(e.value));
306
+ }
307
+ function Qt(e) {
308
+ return /^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e) ? e : E(e);
308
309
  }
309
310
  function F(e, t) {
310
- let n = j(`${t}${P(e.key)} = ${N(e)}`, e.trailingComment);
311
- return [...A(e.leadingComments, t), n].join("\n");
311
+ let n = M(`${t}${Qt(e.key)} = ${P(e)}`, e.trailingComment);
312
+ return [...j(e.leadingComments, t), n].join("\n");
312
313
  }
313
- function Jt(e, t) {
314
+ function $t(e, t) {
314
315
  let n;
315
- return n = e.key === "series" && e.quotedKey && !(e.values && e.values.length > 1) ? `${t}"series" = ${N(e)}` : e.values && e.values.length > 1 ? `${t}${e.key === "series" && !e.quotedKey ? e.key : w(e.key)} = ${e.values.map((e) => typeof e == "number" ? `${e}` : w(String(e))).join(",")}` : `${t}${P(e.key)} = ${N(e)}`, [...A(e.leadingComments, t), j(n, e.trailingComment)].join("\n");
316
+ return n = e.key === "series" && e.quotedKey && !(e.values && e.values.length > 1) ? `${t}"series" = ${P(e)}` : e.values && e.values.length > 1 ? `${t}${e.key === "series" && !e.quotedKey ? e.key : E(e.key)} = ${e.values.map((e) => typeof e == "number" ? `${e}` : E(String(e))).join(",")}` : `${t}${Qt(e.key)} = ${P(e)}`, [...j(e.leadingComments, t), M(n, e.trailingComment)].join("\n");
316
317
  }
317
318
  function I(e, t) {
318
- let n = [...A(e.leadingComments, t), `${t}data {`];
319
- for (let r of e.entries) n.push(Jt(r, `${t} `));
320
- return n.push(...M(e, t)), n.join("\n");
319
+ let n = [...j(e.leadingComments, t), `${t}data {`];
320
+ for (let r of e.entries) n.push($t(r, `${t} `));
321
+ return n.push(...N(e, t)), n.join("\n");
321
322
  }
322
323
  function L(e, t) {
323
- let n = e.fromHighlight ? "highlight" : "colorize", r = [...A(e.leadingComments, t), `${t}${n} ${w(e.target)} {`];
324
+ let n = e.fromHighlight ? "highlight" : "colorize", r = [...j(e.leadingComments, t), `${t}${n} ${E(e.target)} {`];
324
325
  for (let n of e.properties) r.push(F(n, `${t} `));
325
- return r.push(...M(e, t)), r.join("\n");
326
+ return r.push(...N(e, t)), r.join("\n");
326
327
  }
327
328
  function R(e, t) {
328
- return [...A(e.leadingComments, t), j(`${t}highlight ${w(e.target)}`, e.trailingComment)].join("\n");
329
+ return [...j(e.leadingComments, t), M(`${t}highlight ${E(e.target)}`, e.trailingComment)].join("\n");
329
330
  }
330
331
  function z(e, t) {
331
- let n = [...A(e.leadingComments, t), `${t}area-fill ${w(e.from)} ${w(e.to)} {`];
332
+ let n = [...j(e.leadingComments, t), `${t}area-fill ${E(e.from)} ${E(e.to)} {`];
332
333
  for (let r of e.properties) n.push(F(r, `${t} `));
333
- return n.push(...M(e, t)), n.join("\n");
334
+ return n.push(...N(e, t)), n.join("\n");
334
335
  }
335
336
  function B(e, t) {
336
- let n = e.kind ?? d.Point;
337
- if (n === d.Range) {
338
- let n = [...A(e.leadingComments, t), `${t}range {`];
337
+ let n = e.kind ?? T.Point;
338
+ if (n === T.Range) {
339
+ let n = [...j(e.leadingComments, t), `${t}range {`];
339
340
  for (let r of e.properties) n.push(F(r, `${t} `));
340
- return n.push(...M(e, t)), n.join("\n");
341
+ return n.push(...N(e, t)), n.join("\n");
341
342
  }
342
- if (n === d.Free) {
343
- let n = [...A(e.leadingComments, t), `${t}note {`];
343
+ if (n === T.Free) {
344
+ let n = [...j(e.leadingComments, t), `${t}note {`];
344
345
  for (let r of e.properties) n.push(F(r, `${t} `));
345
- return n.push(...M(e, t)), n.join("\n");
346
+ return n.push(...N(e, t)), n.join("\n");
346
347
  }
347
- let r = "target" in e ? e.target : "", i = [...A(e.leadingComments, t), `${t}annotation ${w(r)} {`];
348
+ let r = "target" in e ? e.target : "", i = [...j(e.leadingComments, t), `${t}annotation ${E(r)} {`];
348
349
  for (let n of e.properties) i.push(F(n, `${t} `));
349
- return i.push(...M(e, t)), i.join("\n");
350
+ return i.push(...N(e, t)), i.join("\n");
350
351
  }
351
352
  function V(e, t) {
352
- let n = [...A(e.leadingComments, t), `${t}series ${w(e.name)} {`];
353
+ let n = [...j(e.leadingComments, t), `${t}series ${E(e.name)} {`];
353
354
  for (let r of e.properties) n.push(F(r, `${t} `));
354
- return n.push(...M(e, t)), n.join("\n");
355
+ return n.push(...N(e, t)), n.join("\n");
355
356
  }
356
- function Yt(e, t) {
357
- let n = e.name == null ? `${t}scene {` : `${t}scene ${w(e.name)} {`, r = [...A(e.leadingComments, t), n];
357
+ function en(e, t) {
358
+ let n = e.name == null ? `${t}scene {` : `${t}scene ${E(e.name)} {`, r = [...j(e.leadingComments, t), n];
358
359
  for (let n of e.properties) r.push(F(n, `${t} `));
359
360
  e.data && r.push(I(e.data, `${t} `));
360
361
  for (let n of e.colorizes) r.push(L(n, `${t} `));
@@ -363,18 +364,18 @@ function Yt(e, t) {
363
364
  for (let n of e.annotations) r.push(B(n, `${t} `));
364
365
  for (let n of e.series) r.push(V(n, `${t} `));
365
366
  for (let n of e.transforms) r.push(H(n, `${t} `));
366
- return r.push(...M(e, t)), r.join("\n");
367
+ return r.push(...N(e, t)), r.join("\n");
367
368
  }
368
369
  function H(e, t) {
369
- let n = [...A(e.leadingComments, t), `${t}transform ${e.transformType} {`];
370
+ let n = [...j(e.leadingComments, t), `${t}transform ${e.transformType} {`];
370
371
  for (let r of e.properties) n.push(F(r, `${t} `));
371
- return n.push(...M(e, t)), n.join("\n");
372
+ return n.push(...N(e, t)), n.join("\n");
372
373
  }
373
- function Xt(e, t, n) {
374
+ function tn(e, t, n) {
374
375
  let r = g(n).find((t) => t.key === e);
375
376
  return !r || r.default === void 0 ? !1 : String(r.default) === String(t);
376
377
  }
377
- function Zt(e) {
378
+ function nn(e) {
378
379
  let t = [`chart ${e.chartType} {`];
379
380
  for (let n of e.properties) t.push(F(n, " "));
380
381
  e.data && t.push(I(e.data, " "));
@@ -383,24 +384,24 @@ function Zt(e) {
383
384
  for (let n of e.areaFills) t.push(z(n, " "));
384
385
  for (let n of e.annotations) t.push(B(n, " "));
385
386
  for (let n of e.series) t.push(V(n, " "));
386
- for (let n of e.scenes) t.push(Yt(n, " "));
387
+ for (let n of e.scenes) t.push(en(n, " "));
387
388
  for (let n of e.transforms) t.push(H(n, " "));
388
- return t.push(...A(e.trailingComments, " "), "}"), t.join("\n");
389
+ return t.push(...j(e.trailingComments, " "), "}"), t.join("\n");
389
390
  }
390
- function Qt(e) {
391
+ function rn(e) {
391
392
  return new Map(e.map((e) => [e.key, e.value]));
392
393
  }
393
394
  function U(e, t, n, r) {
394
395
  let i = g(n).find((t) => t.key === e);
395
396
  return i ? r.has(e) ? String(r.get(e)) === String(t) : i.default !== void 0 && String(i.default) === String(t) : !1;
396
397
  }
397
- function $t(e, t, n, r) {
398
- let i = [...A(e.leadingComments, t), `${t}series ${w(e.name)} {`];
398
+ function an(e, t, n, r) {
399
+ let i = [...j(e.leadingComments, t), `${t}series ${E(e.name)} {`];
399
400
  for (let a of e.properties) (a.isPercentage || !U(a.key, a.value, n, r)) && i.push(F(a, `${t} `));
400
- return i.push(...M(e, t)), i.join("\n");
401
+ return i.push(...N(e, t)), i.join("\n");
401
402
  }
402
- function en(e, t, n, r) {
403
- let i = e.properties.find((e) => e.key === "type"), a = i ? String(i.value) : n, o = e.name == null ? `${t}scene {` : `${t}scene ${w(e.name)} {`, s = [...A(e.leadingComments, t), o], c = new Map(r);
403
+ function on(e, t, n, r) {
404
+ let i = e.properties.find((e) => e.key === "type"), a = i ? String(i.value) : n, o = e.name == null ? `${t}scene {` : `${t}scene ${E(e.name)} {`, s = [...j(e.leadingComments, t), o], c = new Map(r);
404
405
  for (let n of e.properties) {
405
406
  if (n.key === "type") {
406
407
  s.push(F(n, `${t} `));
@@ -413,11 +414,11 @@ function en(e, t, n, r) {
413
414
  for (let n of e.highlights) s.push(R(n, `${t} `));
414
415
  for (let n of e.areaFills) s.push(z(n, `${t} `));
415
416
  for (let n of e.annotations) s.push(B(n, `${t} `));
416
- for (let n of e.series) s.push($t(n, `${t} `, a, c));
417
+ for (let n of e.series) s.push(an(n, `${t} `, a, c));
417
418
  for (let n of e.transforms) s.push(H(n, `${t} `));
418
- return s.push(...M(e, t)), s.join("\n");
419
+ return s.push(...N(e, t)), s.join("\n");
419
420
  }
420
- function tn(e) {
421
+ function sn(e) {
421
422
  let t = [`chart ${e.chartType} {`], n = /* @__PURE__ */ new Map();
422
423
  for (let r of e.properties) (r.isPercentage || !U(r.key, r.value, e.chartType, n)) && t.push(F(r, " "));
423
424
  e.data && t.push(I(e.data, " "));
@@ -425,28 +426,28 @@ function tn(e) {
425
426
  for (let n of e.highlights) t.push(R(n, " "));
426
427
  for (let n of e.areaFills) t.push(z(n, " "));
427
428
  for (let n of e.annotations) t.push(B(n, " "));
428
- let r = Qt(e.properties);
429
- for (let n of e.series) t.push($t(n, " ", e.chartType, r));
430
- for (let n of e.scenes) t.push(en(n, " ", e.chartType, r));
429
+ let r = rn(e.properties);
430
+ for (let n of e.series) t.push(an(n, " ", e.chartType, r));
431
+ for (let n of e.scenes) t.push(on(n, " ", e.chartType, r));
431
432
  for (let n of e.transforms) t.push(H(n, " "));
432
- return t.push(...A(e.trailingComments, " "), "}"), t.join("\n");
433
+ return t.push(...j(e.trailingComments, " "), "}"), t.join("\n");
433
434
  }
434
- function nn(e) {
435
+ function cn(e) {
435
436
  let t = [`chart ${e.chartType} {`];
436
- for (let n of e.properties) Xt(n.key, n.value, e.chartType) || t.push(F(n, " "));
437
+ for (let n of e.properties) tn(n.key, n.value, e.chartType) || t.push(F(n, " "));
437
438
  e.data && t.push(I(e.data, " "));
438
439
  for (let n of e.colorizes) t.push(L(n, " "));
439
440
  for (let n of e.highlights) t.push(R(n, " "));
440
441
  for (let n of e.areaFills) t.push(z(n, " "));
441
442
  for (let n of e.annotations) t.push(B(n, " "));
442
443
  for (let n of e.series) t.push(V(n, " "));
443
- for (let n of e.scenes) t.push(Yt(n, " "));
444
+ for (let n of e.scenes) t.push(en(n, " "));
444
445
  for (let n of e.transforms) t.push(H(n, " "));
445
- return t.push(...A(e.trailingComments, " "), "}"), t.join("\n");
446
+ return t.push(...j(e.trailingComments, " "), "}"), t.join("\n");
446
447
  }
447
448
  //#endregion
448
449
  //#region src/dsl/suggest.ts
449
- function rn(e, t) {
450
+ function ln(e, t) {
450
451
  let n = [Array.from({ length: t.length + 1 }, (e, t) => t)];
451
452
  for (let r = 1; r <= e.length; r++) {
452
453
  n.push([r]);
@@ -460,7 +461,7 @@ function rn(e, t) {
460
461
  function W(e, t) {
461
462
  let n, r = Infinity;
462
463
  for (let i of t) {
463
- let t = rn(e.toLowerCase(), i.toLowerCase());
464
+ let t = ln(e.toLowerCase(), i.toLowerCase());
464
465
  t < r && (r = t, n = i);
465
466
  }
466
467
  if (n === void 0) return;
@@ -469,83 +470,124 @@ function W(e, t) {
469
470
  }
470
471
  //#endregion
471
472
  //#region src/charts/types/scatter/issues.ts
472
- var an = [
473
+ var un = [
473
474
  "x",
474
475
  "y",
475
476
  "size",
476
477
  "group"
477
- ], on = 5, sn = {
478
+ ], dn = {
478
479
  "missing-x": "missing x",
479
480
  "missing-y": "missing y",
480
481
  "invalid-size": "size must be above 0",
481
482
  "non-positive-log-x": "x must be above 0 on a log axis",
482
483
  "non-positive-log-y": "y must be above 0 on a log axis"
483
- }, cn = {
484
+ }, fn = {
484
485
  x: "horizontal",
485
486
  y: "vertical"
486
487
  };
487
- function ln(e) {
488
- return [...Ee(e), ...(e.textColumns ?? []).map((e) => e.name)];
489
- }
490
- function un(e, t) {
491
- let n = ln(e);
492
- return an.flatMap((e) => {
493
- let r = t[e];
494
- return !r || r === "none" || n.includes(r) ? [] : [{
488
+ function pn(e) {
489
+ return [...fe(e), ...(e.textColumns ?? []).map((e) => e.name)];
490
+ }
491
+ function mn(e, t, n, r) {
492
+ let i = pn(e);
493
+ return n.flatMap((e) => {
494
+ let n = t[e];
495
+ return !n || n === "none" || i.includes(n) ? [] : [{
495
496
  code: "unknown-column",
496
- severity: "error",
497
+ severity: r,
497
498
  key: e,
498
- message: `${e} names "${r}", which is not a column.`,
499
- suggestion: W(r, n)
499
+ message: `${e} names "${n}", which is not a column.`,
500
+ suggestion: W(n, i)
500
501
  }];
501
502
  });
502
503
  }
503
- function dn(e) {
504
+ function hn(e, t) {
504
505
  if (!e.length) return [];
505
- let t = e.slice(0, on).map((e) => `"${e.name}" (${sn[e.reason]})`), n = e.length - t.length;
506
+ let n = e.slice(0, 5).map((e) => `"${e.name}" (${t[e.reason]})`), r = e.length - n.length;
506
507
  return [{
507
508
  code: "dropped-rows",
508
509
  severity: "warning",
509
- message: `${`${e.length} ${e.length === 1 ? "row" : "rows"}`} not drawn: ${t.join(", ")}${n > 0 ? `, and ${n} more` : ""}.`
510
+ message: `${`${e.length} ${e.length === 1 ? "row" : "rows"}`} not drawn: ${n.join(", ")}${r > 0 ? `, and ${r} more` : ""}.`
510
511
  }];
511
512
  }
512
- function fn(e) {
513
+ function gn(e) {
513
514
  return e.map((e) => ({
514
515
  code: "trend-skipped",
515
516
  severity: "warning",
516
517
  message: `Trend line skipped${e === "overall" ? "" : ` for ${e}`}: needs at least 3 points.`
517
518
  }));
518
519
  }
519
- function pn(e, t) {
520
+ function _n(e, t) {
520
521
  return ["x", "y"].flatMap((n) => ["min", "max"].flatMap((r) => {
521
522
  let i = t[n]?.[r];
522
- return e[n] !== ft.Log || i === void 0 || String(i).trim() === "" || !(Number(i) <= 0) ? [] : [{
523
+ return e[n] !== pe.Log || i === void 0 || String(i).trim() === "" || !(Number(i) <= 0) ? [] : [{
523
524
  code: "log-range-ignored",
524
525
  severity: "warning",
525
- message: `${`${cn[n]}Range${r === "min" ? "Min" : "Max"}`} must be above 0 on a log axis; it is ignored.`
526
+ message: `${`${fn[n]}Range${r === "min" ? "Min" : "Max"}`} must be above 0 on a log axis; it is ignored.`
526
527
  }];
527
528
  }));
528
529
  }
529
- function mn(e, t, n, r, i) {
530
- let a = un(e, t), o = C(e, t);
531
- if (!o.y) return [...a, {
530
+ function vn(t, n, r, i, a) {
531
+ let o = mn(t, n, un, "error"), s = e(t, n);
532
+ if (!s.y) return [...o, {
532
533
  code: "scatter-missing-y",
533
534
  severity: "error",
534
535
  key: "y",
535
536
  message: "Scatter needs at least two numeric columns."
536
537
  }];
537
- let s = pn(n, r);
538
- if (a.length) return [...a, ...s];
539
- let { points: c, dropped: l } = dt(e, o, n), u = m(i) ? ne(c, i, n).skipped : [];
538
+ let c = _n(r, i);
539
+ if (o.length) return [...o, ...c];
540
+ let { points: l, dropped: u } = we(t, s, r), d = v(a) ? Ee(l, a, r).skipped : [];
540
541
  return [
541
- ...dn(l),
542
- ...fn(u),
543
- ...s
542
+ ...hn(u, dn),
543
+ ...gn(d),
544
+ ...c
545
+ ];
546
+ }
547
+ //#endregion
548
+ //#region src/charts/types/dot-plot/issues.ts
549
+ var yn = ["low", "high"], bn = {
550
+ "missing-value": "missing value",
551
+ "missing-range": "missing low or high",
552
+ "non-positive-log": "values must be above 0 on a log axis"
553
+ }, G = (e) => e.map((e) => `"${e}"`).join(", ");
554
+ function xn(e) {
555
+ let t = e.filter(({ values: [e], low: t = -Infinity, high: n = Infinity }) => e < Math.min(t, n) || e > Math.max(t, n));
556
+ if (!t.length) return [];
557
+ let n = t.slice(0, 5).map((e) => e.name), r = t.length - n.length;
558
+ return [{
559
+ code: "value-outside-range",
560
+ severity: "warning",
561
+ message: `${`${t.length} ${t.length === 1 ? "row has" : "rows have"}`} a value outside low to high: ${G(n)}${r > 0 ? `, and ${r} more` : ""}.`
562
+ }];
563
+ }
564
+ function Sn(e, t) {
565
+ return t.length ? [{
566
+ code: "ignored-columns",
567
+ severity: "warning",
568
+ message: `Range mode uses ${G(e)} as the value and ignores ${G(t)}.`
569
+ }] : [];
570
+ }
571
+ function Cn(e, t) {
572
+ return e.dotStyle !== Pt.Range || t === "range" ? [] : [{
573
+ code: "missing-range-columns",
574
+ severity: "warning",
575
+ message: "Range style needs a low and a high column. Pick them in low and high."
576
+ }];
577
+ }
578
+ function wn(e, t, n) {
579
+ let r = pt(e, t), { rows: i, dropped: a } = m(e, r, n);
580
+ return [
581
+ ...mn(e, t, yn, "warning"),
582
+ ...Cn(t, r.mode),
583
+ ...hn(a, bn),
584
+ ...r.mode === "range" ? xn(i) : [],
585
+ ...Sn(r.values, r.ignored)
544
586
  ];
545
587
  }
546
588
  //#endregion
547
589
  //#region src/dsl/validate.ts
548
- var hn = /* @__PURE__ */ new Set([
590
+ var Tn = /* @__PURE__ */ new Set([
549
591
  "title",
550
592
  "description",
551
593
  "byline",
@@ -566,8 +608,8 @@ var hn = /* @__PURE__ */ new Set([
566
608
  "maxWidth",
567
609
  "player",
568
610
  "playerPosition"
569
- ]), gn = /* @__PURE__ */ new Map([
570
- ["theme", zt().map((e) => e.name)],
611
+ ]), En = /* @__PURE__ */ new Map([
612
+ ["theme", Ut().map((e) => e.name)],
571
613
  ["player", [
572
614
  "buttons",
573
615
  "progress-bar",
@@ -580,13 +622,13 @@ var hn = /* @__PURE__ */ new Set([
580
622
  "center",
581
623
  "right"
582
624
  ]]
583
- ]), _n = /* @__PURE__ */ new Set([
625
+ ]), Dn = /* @__PURE__ */ new Set([
584
626
  "lineSymbolSize",
585
627
  "circleSize",
586
628
  "fixedHeight",
587
629
  "fixedWidth",
588
630
  "maxWidth"
589
- ]), G = st, vn = /* @__PURE__ */ new Set([
631
+ ]), K = ct, On = /* @__PURE__ */ new Set([
590
632
  "text",
591
633
  "repeat",
592
634
  "textColor",
@@ -604,7 +646,7 @@ var hn = /* @__PURE__ */ new Set([
604
646
  "circleSize",
605
647
  "circleStyle",
606
648
  "circleColor"
607
- ]), yn = /* @__PURE__ */ new Set([
649
+ ]), kn = /* @__PURE__ */ new Set([
608
650
  "color",
609
651
  "lineWidth",
610
652
  "dash",
@@ -619,11 +661,11 @@ var hn = /* @__PURE__ */ new Set([
619
661
  "symbolStyle",
620
662
  "symbolSize",
621
663
  "symbolOpacity"
622
- ]), bn = /* @__PURE__ */ new Map([
664
+ ]), An = /* @__PURE__ */ new Map([
623
665
  ["symbolShape", "lineSymbolShape"],
624
666
  ["symbolShowOn", "lineSymbolShowOn"],
625
667
  ["symbolStyle", "lineSymbolStyle"]
626
- ]), xn = /* @__PURE__ */ new Set([
668
+ ]), jn = /* @__PURE__ */ new Set([
627
669
  "start",
628
670
  "end",
629
671
  "repeat",
@@ -635,7 +677,7 @@ var hn = /* @__PURE__ */ new Set([
635
677
  "direction",
636
678
  "text",
637
679
  "textColor"
638
- ]), Sn = /* @__PURE__ */ new Set([
680
+ ]), Mn = /* @__PURE__ */ new Set([
639
681
  "text",
640
682
  "x",
641
683
  "y",
@@ -644,10 +686,10 @@ var hn = /* @__PURE__ */ new Set([
644
686
  "maxWidth",
645
687
  "textOutline"
646
688
  ]);
647
- function Cn(e, t) {
689
+ function Nn(e, t) {
648
690
  return e.find((e) => e.key === t);
649
691
  }
650
- function K(e, t, n, r, i) {
692
+ function q(e, t, n, r, i) {
651
693
  i.push({
652
694
  code: "invalid-choice",
653
695
  path: r,
@@ -655,8 +697,8 @@ function K(e, t, n, r, i) {
655
697
  suggestion: W(String(t), n.filter((e) => e !== ""))
656
698
  });
657
699
  }
658
- function wn(e, t, n) {
659
- if (!_n.has(e.key)) return;
700
+ function Pn(e, t, n) {
701
+ if (!Dn.has(e.key)) return;
660
702
  let r = parseFloat(String(e.value));
661
703
  Number.isFinite(r) && r < 0 && n.push({
662
704
  code: "invalid-number",
@@ -664,9 +706,9 @@ function wn(e, t, n) {
664
706
  message: `${e.key} must not be negative; got "${e.value}".`
665
707
  });
666
708
  }
667
- function Tn(e, t, n, r) {
709
+ function Fn(e, t, n, r) {
668
710
  let i = t.value, a = String(i).toLowerCase();
669
- if (e.type === $e.Boolean) {
711
+ if (e.type === le.Boolean) {
670
712
  if (e.key === "valueLabels" && a === "percent" || i === !0 || i === !1 || a === "true" || a === "false") return;
671
713
  r.push({
672
714
  code: "invalid-boolean",
@@ -679,17 +721,17 @@ function Tn(e, t, n, r) {
679
721
  if (e.choices && e.choices.length > 0) {
680
722
  let t = e.choices.map((e) => e.value);
681
723
  if (t.includes(String(i)) || String(i) === "" && t.includes("")) return;
682
- K(e.key, i, t, n, r);
724
+ q(e.key, i, t, n, r);
683
725
  }
684
726
  }
685
- function En(e, t, n, r) {
686
- let i = g(e), a = /* @__PURE__ */ new Set([...i.map((e) => e.key), ...hn]);
727
+ function In(e, t, n, r) {
728
+ let i = g(e), a = /* @__PURE__ */ new Set([...i.map((e) => e.key), ...Tn]);
687
729
  for (let o of t) {
688
730
  let t = `${n}.${o.key}`;
689
- wn(o, t, r);
690
- let s = gn.get(o.key);
691
- if (s && String(o.value) !== "" && !s.includes(String(o.value)) && K(o.key, o.value, s, t, r), hn.has(o.key)) continue;
692
- let c = Cn(i, o.key);
731
+ Pn(o, t, r);
732
+ let s = En.get(o.key);
733
+ if (s && String(o.value) !== "" && !s.includes(String(o.value)) && q(o.key, o.value, s, t, r), Tn.has(o.key)) continue;
734
+ let c = Nn(i, o.key);
693
735
  if (!c) {
694
736
  r.push({
695
737
  code: "unknown-property",
@@ -699,28 +741,28 @@ function En(e, t, n, r) {
699
741
  });
700
742
  continue;
701
743
  }
702
- Tn(c, o, t, r);
744
+ Fn(c, o, t, r);
703
745
  }
704
746
  }
705
- function Dn(e) {
706
- return e === d.Range ? xn : e === d.Free ? Sn : vn;
747
+ function Ln(e) {
748
+ return e === T.Range ? jn : e === T.Free ? Mn : On;
707
749
  }
708
- function On(e) {
709
- return Et[e];
750
+ function Rn(e) {
751
+ return l[e];
710
752
  }
711
- function kn(e, t, n) {
753
+ function zn(e, t, n) {
712
754
  e.forEach((e, r) => {
713
- let i = e.kind ?? d.Point, a = Dn(i), o = On(i);
755
+ let i = e.kind ?? T.Point, a = Ln(i), o = Rn(i);
714
756
  for (let i of e.properties) {
715
757
  let e = `${t}.${o}[${r}].${i.key}`;
716
- wn(i, e, n), !a.has(i.key) && n.push({
758
+ Pn(i, e, n), !a.has(i.key) && n.push({
717
759
  code: "unknown-annotation-property",
718
760
  path: e,
719
761
  message: `Unknown ${o} property "${i.key}"; it will be silently ignored.`,
720
762
  suggestion: W(i.key, a)
721
763
  });
722
764
  }
723
- let s = b(e.properties).get("repeat");
765
+ let s = y(e.properties).get("repeat");
724
766
  if (s !== void 0) {
725
767
  let e = String(s).toLowerCase();
726
768
  e === "true" || e === "false" || typeof s == "number" && Number.isInteger(s) && s >= 1 || n.push({
@@ -731,36 +773,36 @@ function kn(e, t, n) {
731
773
  }
732
774
  });
733
775
  }
734
- function An(e, t, n, r) {
776
+ function Bn(e, t, n, r) {
735
777
  let i = g(e);
736
778
  t.forEach((e, t) => {
737
779
  for (let a of e.properties) {
738
780
  let e = `${n}.series[${t}].${a.key}`;
739
- if (!yn.has(a.key)) {
781
+ if (!kn.has(a.key)) {
740
782
  r.push({
741
783
  code: "unknown-series-property",
742
784
  path: e,
743
785
  message: `Unknown series property "${a.key}"; it will be silently ignored.`,
744
- suggestion: W(a.key, yn)
786
+ suggestion: W(a.key, kn)
745
787
  });
746
788
  continue;
747
789
  }
748
- let o = Cn(i, bn.get(a.key) ?? a.key)?.choices?.map((e) => e.value);
749
- o?.length && !o.includes(String(a.value)) && K(a.key, a.value, o, e, r);
790
+ let o = Nn(i, An.get(a.key) ?? a.key)?.choices?.map((e) => e.value);
791
+ o?.length && !o.includes(String(a.value)) && q(a.key, a.value, o, e, r);
750
792
  }
751
793
  });
752
794
  }
753
- function jn(e, t, n) {
795
+ function Vn(e, t, n) {
754
796
  e.forEach((e, r) => {
755
- G.has(e.transformType) || n.push({
797
+ K.has(e.transformType) || n.push({
756
798
  code: "unknown-transform",
757
799
  path: `${t}.transform[${r}]`,
758
- message: `Unknown transform type "${e.transformType}". Known types: ${[...G].map((e) => `"${e}"`).join(", ")}.`,
759
- suggestion: W(e.transformType, G)
800
+ message: `Unknown transform type "${e.transformType}". Known types: ${[...K].map((e) => `"${e}"`).join(", ")}.`,
801
+ suggestion: W(e.transformType, K)
760
802
  });
761
803
  });
762
804
  }
763
- function Mn(e) {
805
+ function Hn(e) {
764
806
  let t = /* @__PURE__ */ new Set();
765
807
  for (let n of [e.data, ...e.scenes.map((e) => e.data)]) for (let e of n?.entries ?? []) {
766
808
  if (e.key === "series" && !e.quotedKey) {
@@ -772,8 +814,8 @@ function Mn(e) {
772
814
  }
773
815
  return t;
774
816
  }
775
- function Nn(e, t) {
776
- let n = Mn(e);
817
+ function Un(e, t) {
818
+ let n = Hn(e);
777
819
  if (n.size === 0) return;
778
820
  let r = [
779
821
  {
@@ -805,28 +847,30 @@ function Nn(e, t) {
805
847
  });
806
848
  });
807
849
  }
808
- function Pn(e) {
809
- let t = [], n = [], i = S(), a = i.includes(e.chartType);
810
- a || t.push({
850
+ function Wn(e) {
851
+ let t = [], n = [], r = C(), i = r.includes(e.chartType);
852
+ i || t.push({
811
853
  code: "unknown-chart-type",
812
854
  path: "chartType",
813
855
  message: `Unknown chart type "${e.chartType}".`,
814
- suggestion: W(e.chartType, i)
815
- }), a && En(e.chartType, e.properties, "chart", t), jn(e.transforms, "chart", t), kn(e.annotations, "chart", t), a && An(e.chartType, e.series, "chart", t);
816
- let o = !!e.data && e.data.entries.length > 0, s = e.scenes.some((e) => !!e.data && e.data.entries.length > 0);
817
- return !o && !s && t.push({
856
+ suggestion: W(e.chartType, r)
857
+ }), i && In(e.chartType, e.properties, "chart", t), Vn(e.transforms, "chart", t), zn(e.annotations, "chart", t), i && Bn(e.chartType, e.series, "chart", t);
858
+ let a = !!e.data && e.data.entries.length > 0, o = e.scenes.some((e) => !!e.data && e.data.entries.length > 0);
859
+ return !a && !o && t.push({
818
860
  code: "missing-data",
819
861
  path: "data",
820
862
  message: e.data && e.data.entries.length === 0 ? "Data block is empty." : "Chart has no data."
821
- }), e.data && Fn(e.data.entries, n), e.data && In(e.data.entries, n), Nn(e, n), e.chartType === r.Scatter && Rn(e.data, e.properties, "chart", "data", t, n), e.scenes.forEach((i, a) => {
822
- Ln(i, e.chartType, a, t), (i.properties.find((e) => e.key === "type")?.value ?? e.chartType) === r.Scatter && Rn(i.data, [...e.properties, ...i.properties], `scene[${a}]`, `scene[${a}].data`, t, n);
863
+ }), e.data && Gn(e.data.entries, n), e.data && Kn(e.data.entries, n), Un(e, n), e.chartType === x.Scatter && Jn(e.data, e.properties, "chart", "data", t, n), e.chartType === x.DotPlot && Yn(e.data, e.properties, "chart", "data", n), e.scenes.forEach((r, i) => {
864
+ qn(r, e.chartType, i, t);
865
+ let a = r.properties.find((e) => e.key === "type")?.value ?? e.chartType;
866
+ a === x.Scatter && Jn(r.data, [...e.properties, ...r.properties], `scene[${i}]`, `scene[${i}].data`, t, n), a === x.DotPlot && Yn(r.data, [...e.properties, ...r.properties], `scene[${i}]`, `scene[${i}].data`, n);
823
867
  }), {
824
868
  valid: t.length === 0,
825
869
  errors: t,
826
870
  warnings: n
827
871
  };
828
872
  }
829
- function Fn(e, t) {
873
+ function Gn(e, t) {
830
874
  let n = e.findIndex((e) => e.key === "series" && !e.quotedKey);
831
875
  if (n === -1) return;
832
876
  let r = e[n], i = r.values ?? [r.value];
@@ -842,7 +886,7 @@ function Fn(e, t) {
842
886
  suggestion: "Move the series row to the top of the data block."
843
887
  });
844
888
  }
845
- function In(e, t) {
889
+ function Kn(e, t) {
846
890
  let n = /* @__PURE__ */ new Map();
847
891
  for (let t of e) t.key === "series" && !t.quotedKey || n.set(t.key, (n.get(t.key) ?? 0) + 1);
848
892
  for (let [e, r] of n) r > 1 && t.push({
@@ -852,18 +896,18 @@ function In(e, t) {
852
896
  suggestion: `"${e} (2)"`
853
897
  });
854
898
  }
855
- function Ln(e, t, n, r) {
899
+ function qn(e, t, n, r) {
856
900
  let i = `scene[${n}]`, a = e.properties.find((e) => e.key === "type")?.value, o = a == null ? t : String(a);
857
- a != null && !S().includes(o) ? r.push({
901
+ a != null && !C().includes(o) ? r.push({
858
902
  code: "unknown-chart-type",
859
903
  path: `${i}.type`,
860
904
  message: `Unknown chart type "${o}".`,
861
- suggestion: W(o, S())
862
- }) : (En(o, e.properties, i, r), An(o, e.series, i, r)), jn(e.transforms, i, r), kn(e.annotations, i, r);
905
+ suggestion: W(o, C())
906
+ }) : (In(o, e.properties, i, r), Bn(o, e.series, i, r)), Vn(e.transforms, i, r), zn(e.annotations, i, r);
863
907
  }
864
- function Rn(e, t, n, r, i, a) {
908
+ function Jn(e, t, n, r, i, a) {
865
909
  if (!e || e.entries.length === 0) return;
866
- let o = b(t), s = (e) => o.has(e) ? String(o.get(e)) : void 0, c = (e) => s(e), l = (e) => ({
910
+ let o = y(t), s = (e) => o.has(e) ? String(o.get(e)) : void 0, c = (e) => s(e), l = (e) => ({
867
911
  min: s(`${e}RangeMin`),
868
912
  max: s(`${e}RangeMax`)
869
913
  }), u = {
@@ -878,9 +922,18 @@ function Rn(e, t, n, r, i, a) {
878
922
  x: l("horizontal"),
879
923
  y: l("vertical")
880
924
  };
881
- for (let t of mn(me(Qe(e)), u, d, f, s("trend"))) (t.severity === "error" ? i : a).push(zn(t, t.key ? `${n}.${t.key}` : r));
925
+ for (let t of vn(S(w(e)), u, d, f, s("trend"))) (t.severity === "error" ? i : a).push(Xn(t, t.key ? `${n}.${t.key}` : r));
882
926
  }
883
- function zn({ code: e, message: t, suggestion: n }, r) {
927
+ function Yn(e, t, n, r, i) {
928
+ if (!e || e.entries.length === 0) return;
929
+ let a = y(t), o = (e) => a.has(e) ? String(a.get(e)) : void 0, s = {
930
+ dotStyle: o("dotStyle"),
931
+ low: o("low"),
932
+ high: o("high")
933
+ };
934
+ for (let t of wn(S(w(e)), s, o("horizontalScaleType"))) i.push(Xn(t, t.key ? `${n}.${t.key}` : r));
935
+ }
936
+ function Xn({ code: e, message: t, suggestion: n }, r) {
884
937
  return {
885
938
  code: e,
886
939
  path: r,
@@ -890,14 +943,14 @@ function zn({ code: e, message: t, suggestion: n }, r) {
890
943
  }
891
944
  //#endregion
892
945
  //#region src/samples/letter-frequency.bpc?raw
893
- var Bn = "chart bar-vertical {\n title = \"E is the most frequent letter in English\"\n description = \"How often each letter appears in typical English text\"\n byline = \"Pierre Romera\"\n source = \"Lewand, Cryptological Mathematics\"\n sourceUrl = \"https://en.wikipedia.org/wiki/Letter_frequency\"\n note = \"Based on analysis of 40,000 words from English prose\"\n colorPalette = \"London\"\n sort = descending\n\n highlight \"E\"\n\n data {\n \"E\" = 12.70\n \"T\" = 9.06\n \"A\" = 8.17\n \"O\" = 7.51\n \"I\" = 6.97\n \"N\" = 6.75\n \"S\" = 6.33\n \"H\" = 6.09\n \"R\" = 5.99\n \"D\" = 4.25\n }\n}\n", Vn = "chart bar-vertical {\n // the headline above the chart\n title = \"China emits more CO₂ than the US and India combined\"\n description = \"Annual emissions in billion tonnes, 2023\"\n source = \"Our World in Data\"\n sourceUrl = \"https://ourworldindata.org/co2-emissions\"\n\n // one row per country: \"label\" = value\n data {\n \"China\" = 12.17\n \"United States\" = 4.92\n \"India\" = 3.06\n \"Russia\" = 1.73\n \"Japan\" = 0.99\n \"Germany\" = 0.59\n }\n\n // highlight pops one bar in the accent color\n highlight \"China\"\n\n // an annotation points a callout at a single bar\n annotation \"India\" {\n text = \"Surpassed EU in 2023\"\n showLine = true\n anchorDirection = N\n textOffsetX = 66\n textOffsetY = -41\n lineStyle = curve-left\n showArrow = true\n lineTargetDistance = 26\n showCircle = false\n }\n}\n", Hn = "chart bar-horizontal {\n title = \"Mandarin has nearly twice as many native speakers as Spanish\"\n description = \"Number of native speakers worldwide, in millions\"\n source = \"Ethnologue\"\n sourceUrl = \"https://ethnologue.com\"\n byline = \"Pierre Romera\"\n sort = descending\n\n highlight \"Mandarin\"\n\n data {\n \"Mandarin\" = 988\n \"Spanish\" = 487\n \"English\" = 372\n \"Hindi\" = 347\n \"Bengali\" = 232\n \"Portuguese\" = 252\n \"Russian\" = 133\n \"Japanese\" = 124\n }\n}\n", Un = "chart line-multi {\n title = \"China now buys more electric cars than the rest of the world combined\"\n description = \"Electric car sales by region, millions per year\"\n source = \"IEA Global EV Outlook 2024\"\n sourceUrl = \"https://www.iea.org/reports/global-ev-outlook-2024\"\n colorPalette = \"Maya\"\n tooltips = true\n\n data {\n series = \"China\",\"Europe\",\"United States\",\"Rest of world\"\n \"2018\" = 1.1,0.4,0.36,0.1\n \"2020\" = 1.3,1.4,0.30,0.2\n \"2021\" = 3.3,2.3,0.63,0.4\n \"2022\" = 6.0,2.7,1.0,0.7\n \"2023\" = 8.1,3.2,1.4,1.0\n }\n}\n", Wn = "chart bar-multi {\n title = \"USA tops Paris 2024 with 126 medals across all categories\"\n description = \"2024 Paris Summer Games — top six nations\"\n source = \"Olympics.com\"\n sourceUrl = \"https://olympics.com\"\n colors = \"#eeca3b, #c0c0c0, #cd7f32\"\n sort = descending\n\n data {\n series = \"Gold\",\"Silver\",\"Bronze\"\n \"USA\" = 40,44,42\n \"China\" = 40,27,24\n \"Japan\" = 20,12,13\n \"Great Britain\" = 14,22,29\n \"Australia\" = 18,19,16\n \"France\" = 16,26,22\n }\n}\n", Gn = "chart line {\n title = \"2024 was the hottest year on record\"\n description = \"Deviation from the 1951–1980 average, in °C\"\n source = \"NASA GISS\"\n sourceUrl = \"https://data.giss.nasa.gov/gistemp/\"\n tooltips = true\n crosshair = false\n lineSymbols = true\n\n data {\n \"1980\" = 0.26\n \"1985\" = 0.12\n \"1990\" = 0.45\n \"1995\" = 0.45\n \"2000\" = 0.39\n \"2005\" = 0.68\n \"2010\" = 0.73\n \"2015\" = 0.9\n \"2020\" = 1.01\n \"2024\" = 1.28\n }\n\n annotation \"2015\" {\n text = \"2015 Paris Agreement to limit global warming to 1.5°C \"\n maxWidth = 224\n showLine = true\n lineStyle = curve-right\n showArrow = true\n showCircle = true\n }\n}\n", Kn = "chart line {\n title = \"Bitcoin surged past $90,000 in 2024\"\n description = \"USD, year-end closing price\"\n source = \"CoinGecko\"\n sourceUrl = \"https://www.coingecko.com\"\n colors = \"#f7931a\"\n lineSymbols = true\n lineSymbolShowOn = \"all\"\n lineSymbolShape = \"diamond\"\n verticalNumberFormat = \",.0f\"\n tooltips = true\n\n annotation \"2021\" {\n text = \"All-time high cycle\"\n textOffsetY = -12\n showArrow = true\n }\n\n data {\n \"2016\" = 963\n \"2017\" = 14156\n \"2018\" = 3742\n \"2019\" = 7194\n \"2020\" = 29080\n \"2021\" = 46306\n \"2022\" = 16547\n \"2023\" = 42258\n \"2024\" = 93429\n }\n}\n", qn = "chart line-multi {\n title = \"The income share of the top 1% has surged since 1980\"\n description = \"Pre-tax national income captured by the top 1%, percent\"\n source = \"World Inequality Database\"\n sourceUrl = \"https://wid.world\"\n colorPalette = \"Egypt\"\n tooltips = true\n lineSymbols = true\n lineSymbolShowOn = \"all\"\n\n data {\n series = \"United States\",\"India\",\"China\",\"France\"\n \"1980\" = 10.4,7.5,6.6,7.5\n \"1990\" = 14.7,10.7,8.3,9.0\n \"2000\" = 17.3,10.5,10.5,11.3\n \"2010\" = 17.9,16.4,15.2,11.0\n \"2021\" = 19.9,22.1,15.7,12.7\n }\n\n scene \"US doubles\" {\n title = \"The US top 1% nearly doubled its income share since 1980\"\n highlight \"United States\"\n }\n\n scene \"India overtakes\" {\n title = \"India is now the most unequal of these major economies\"\n highlight \"India\"\n }\n\n scene \"France's modest rise\" {\n title = \"France's top 1% rose far less than the US or India\"\n highlight \"France\"\n }\n}\n", Jn = "chart pie {\n title = \"Asia is home to nearly 60% of the world's population\"\n description = \"Estimated share, 2024\"\n source = \"United Nations\"\n sourceUrl = \"https://population.un.org\"\n colorPalette = \"Klimt\"\n legendPosition = \"right\"\n tooltips = true\n\n data {\n \"Asia\" = 58.9\n \"Africa\" = 18.6\n \"Europe\" = 9.1\n \"Latin America\" = 8.1\n \"North America\" = 4.7\n }\n}\n", Yn = "chart bar-vertical {\n title = \"Brazil produces more coffee than the next three countries combined\"\n description = \"Million 60-kg bags, 2023/24 crop year\"\n source = \"USDA Foreign Agricultural Service\"\n sourceUrl = \"https://www.fas.usda.gov/data/coffee-world-markets-and-trade\"\n colorPalette = \"Harvey\"\n\n data {\n \"Brazil\" = 66.4\n \"Vietnam\" = 27.5\n \"Colombia\" = 12.76\n \"Ethiopia\" = 9.13\n \"Indonesia\" = 7.65\n \"Honduras\" = 5.5\n }\n\n highlight \"Brazil\"\n\n transform sort {\n column = \"value\"\n direction = descending\n }\n}\n", Xn = "chart donut {\n title = \"The richest 1% own more wealth than the entire bottom 90% combined\"\n description = \"Share of global wealth by group, 2021\"\n source = \"World Inequality Report 2022\"\n sourceUrl = \"https://wir2022.wid.world\"\n colorPalette = \"Imperator\"\n legendPosition = \"right\"\n displayAsPercentage = true\n tooltips = true\n\n data {\n \"Top 1%\" = 38\n \"Next 9%\" = 38\n \"Middle 40%\" = 22\n \"Bottom 50%\" = 2\n }\n\n scene \"Top 1% spotlight\" {\n title = \"The top 1% hold 38% of all global wealth\"\n description = \"Share of global wealth by group, 2021\"\n highlight \"Top 1%\"\n }\n\n scene \"Bottom half\" {\n title = \"The bottom half of humanity owns just 2%\"\n description = \"Share of global wealth by group, 2021\"\n highlight \"Bottom 50%\"\n }\n\n scene \"Income tells a softer story\" {\n title = \"Income is concentrated too — but less than wealth\"\n description = \"Share of global income by the same groups, 2021\"\n highlight \"Top 1%\"\n data {\n \"Top 1%\" = 19\n \"Next 9%\" = 33\n \"Middle 40%\" = 39\n \"Bottom 50%\" = 9\n }\n }\n}\n", Zn = "chart area {\n title = \"The US national debt has more than tripled since 2008\"\n description = \"Total federal debt outstanding, trillions of dollars\"\n source = \"U.S. Treasury, Fiscal Data\"\n sourceUrl = \"https://fiscaldata.treasury.gov\"\n\n annotation \"2008\" {\n text = \"Financial crisis\"\n showArrow = true\n textOffsetY = -14\n }\n\n data {\n \"2000\" = 5.7\n \"2004\" = 7.4\n \"2008\" = 10.0\n \"2012\" = 16.1\n \"2016\" = 19.6\n \"2020\" = 26.9\n \"2024\" = 35.5\n }\n}\n", Qn = "chart area-stacked {\n title = \"Renewables' share of global energy has more than doubled since 2000\"\n description = \"Share of global primary energy by source, 2000–2023\"\n source = \"Our World in Data\"\n sourceUrl = \"https://ourworldindata.org/energy-mix\"\n stackPercent = true\n areaSortMode = descending\n\n data {\n series = \"Coal\",\"Oil\",\"Gas\",\"Renewables\"\n \"2000\" = 27456,43017,23994,2997\n \"2005\" = 36201,47017,27439,3510\n \"2010\" = 42016,48193,31593,4868\n \"2015\" = 43695,51294,34780,6400\n \"2020\" = 42316,49101,38704,8569\n \"2023\" = 45319,54839,40151,10325\n }\n}\n", $n = "chart column-stacked {\n title = \"Natural gas and renewables pushed coal off the US power grid\"\n description = \"Share of US electricity generation by source, percent\"\n source = \"U.S. Energy Information Administration\"\n sourceUrl = \"https://www.eia.gov/electricity\"\n stackMode = \"percent\"\n\n data {\n series = \"Coal\",\"Natural gas\",\"Nuclear\",\"Renewables\"\n \"2010\" = 45,24,20,10\n \"2015\" = 33,33,20,13\n \"2020\" = 19,39,20,20\n \"2023\" = 16,43,19,21\n }\n}\n", er = "chart bar-stacked {\n title = \"India has far more children than China, and a workforce nearly as large\"\n description = \"Millions of people, 2023\"\n source = \"UN Population Division\"\n sourceUrl = \"https://population.un.org\"\n colorPalette = \"London\"\n\n data {\n series = \"0-14\",\"15-64\",\"65+\"\n \"China\" = 232,988,200\n \"India\" = 354,978,97\n \"USA\" = 58,216,59\n \"Indonesia\" = 67,189,21\n \"Brazil\" = 43,148,24\n }\n}\n", tr = "chart area-stacked {\n title = \"EU subsidies to new members surged after enlargement\"\n description = \"Agricultural subsidies to post-socialist EU members, million euros\"\n source = \"Eurostat\"\n sourceUrl = \"https://ec.europa.eu/eurostat\"\n colorPalette = \"Enara\"\n interpolation = \"linear\"\n heightMode = \"aspect-ratio\"\n aspectRatio = \"1:1\"\n\n data {\n series = \"Indirect subsidies\",\"Direct subsidies\"\n \"2000\" = 370,800\n \"2001\" = 445,896\n \"2002\" = 567,816\n \"2003\" = 641,950\n \"2004\" = 1908,2434\n \"2005\" = 2234,3509\n \"2006\" = 2576,4356\n \"2007\" = 2467,5429\n \"2008\" = 2672,6655\n \"2009\" = 2474,7195\n \"2010\" = 2117,8207\n \"2011\" = 1863,9230\n \"2012\" = 1528,9191\n \"2013\" = 1251,10252\n \"2014\" = 1132,10987\n \"2015\" = 1687,10145\n }\n\n scene \"Indirect subsidies shrank\" {\n title = \"Indirect subsidies were cut under WTO pressure\"\n description = \"Subsidies tied to specific crops fell foul of World Trade Organization rules\"\n\n highlight \"Indirect subsidies\"\n }\n\n scene \"Direct subsidies dominate\" {\n title = \"Direct per-hectare payments now dominate\"\n description = \"The larger the fields, the more money farmers receive\"\n\n highlight \"Direct subsidies\"\n }\n\n scene \"Bulgaria: subsidies explode\" {\n title = \"Bulgarian farmers received almost nothing before 2007 accession\"\n description = \"More than three-quarters of Bulgarian subsidies are direct payments — the highest share among new members\"\n\n data {\n series = \"Indirect subsidies\",\"Direct subsidies\"\n \"2000\" = 0,5\n \"2001\" = 0,33\n \"2002\" = 0,48\n \"2003\" = 0,69\n \"2004\" = 0,67\n \"2005\" = 0,87\n \"2006\" = 0,57\n \"2007\" = 59,250\n \"2008\" = 75,484\n \"2009\" = 97,415\n \"2010\" = 79,466\n \"2011\" = 94,458\n \"2012\" = 120,617\n \"2013\" = 132,852\n \"2014\" = 143,821\n \"2015\" = 213,677\n }\n\n highlight \"Direct subsidies\"\n }\n\n scene \"Bulgarian farms grew\" {\n title = \"Average farm size in Bulgaria quadrupled\"\n description = \"Average farm size in hectares\"\n type = line\n\n data {\n \"2005\" = 5\n \"2007\" = 6\n \"2010\" = 12\n \"2013\" = 18\n }\n }\n\n scene \"Production rose\" {\n title = \"Bulgarian farm production rose from 3 to 4 billion euros\"\n description = \"Total production of Bulgarian farms, million euros\"\n type = area\n\n data {\n \"2000\" = 2933\n \"2001\" = 3240\n \"2002\" = 3051\n \"2003\" = 2816\n \"2004\" = 3049\n \"2005\" = 3011\n \"2006\" = 3111\n \"2007\" = 3038\n \"2008\" = 4148\n \"2009\" = 3437\n \"2010\" = 3486\n \"2011\" = 4038\n \"2012\" = 4161\n \"2013\" = 4115\n \"2014\" = 4138\n \"2015\" = 3915\n }\n }\n\n scene \"Cash crops replaced vegetables\" {\n title = \"Cash crops replaced vegetables in Bulgaria\"\n description = \"Production of Bulgarian farms, million euros\"\n type = area-stacked\n\n data {\n series = \"Vegetables\",\"Cash crops\",\"Other production\"\n \"2000\" = 464,615,1854\n \"2001\" = 458,777,2005\n \"2002\" = 577,850,1624\n \"2003\" = 539,818,1459\n \"2004\" = 483,1103,1463\n \"2005\" = 492,994,1525\n \"2006\" = 510,1083,1518\n \"2007\" = 436,936,1666\n \"2008\" = 541,2045,1563\n \"2009\" = 243,1553,1641\n \"2010\" = 184,2173,1128\n \"2011\" = 120,2853,1065\n \"2012\" = 117,2900,1144\n \"2013\" = 139,2802,1174\n \"2014\" = 143,3082,914\n \"2015\" = 144,2986,785\n }\n\n highlight \"Cash crops\"\n }\n\n scene \"Vegetables collapsed\" {\n title = \"Vegetable production fell by a factor of three\"\n description = \"A traditional Bulgarian cultivation shrank as subsidies favoured large fields\"\n\n highlight \"Vegetables\"\n }\n\n scene \"Every vegetable declined\" {\n title = \"Bulgarian vegetable production collapsed across the board\"\n description = \"Production volume indexed to 2001 = 100\"\n type = line-multi\n lineSymbols = false\n\n data {\n series = \"Cabbages\",\"Tomatoes\",\"Watermelons\",\"Carrots\",\"Onions\",\"Garlic\",\"Strawberries\"\n \"2001\" = 100,100,100,100,100,100,100\n \"2002\" = 79,90,124,64,106,95,100\n \"2003\" = 100,157,177,142,118,98,72\n \"2004\" = 84,87,83,245,124,138,74\n \"2005\" = 50,46,62,30,40,93,42\n \"2006\" = 52,78,113,95,56,80,56\n \"2007\" = 36,49,64,74,29,30,38\n \"2008\" = 47,49,66,97,44,29,55\n \"2009\" = 28,38,74,105,23,39,55\n \"2010\" = 57,42,51,76,53,57,37\n \"2011\" = 32,38,56,86,47,43,45\n \"2012\" = 34,34,46,69,29,43,31\n \"2013\" = 33,43,53,39,36,40,24\n \"2014\" = 31,44,28,69,37,8,27\n \"2015\" = 31,45,50,57,25,18,32\n }\n }\n\n scene \"Jobs disappeared\" {\n title = \"Family farmers disappeared while salaried ag jobs held steady\"\n description = \"EU agricultural employment, thousands of full-time equivalents\"\n type = line-multi\n lineSymbols = false\n\n data {\n series = \"Salaried workers\",\"Non-salaried workers\"\n \"2000\" = 2678,12194\n \"2001\" = 2598,11586\n \"2002\" = 2658,10795\n \"2003\" = 2563,10609\n \"2004\" = 2560,9999\n \"2005\" = 2501,10047\n \"2006\" = 2499,9782\n \"2007\" = 2437,9231\n \"2008\" = 2416,8971\n \"2009\" = 2348,8672\n \"2010\" = 2335,7808\n \"2011\" = 2322,7551\n \"2012\" = 2325,7501\n \"2013\" = 2297,7425\n \"2014\" = 2366,7183\n \"2015\" = 2413,6928\n \"2016\" = 2457,6741\n }\n\n highlight \"Non-salaried workers\"\n }\n}\n", nr = "chart bar-horizontal {\n title = \"China emits more CO₂ than the US and India combined\"\n description = \"Annual emissions in billion tonnes, 2023\"\n source = \"Our World in Data\"\n sourceUrl = \"https://ourworldindata.org/co2-emissions\"\n byline = \"Pierre Romera\"\n\n data {\n \"China\" = 12.17\n \"United States\" = 4.92\n \"India\" = 3.06\n \"Russia\" = 1.73\n \"Japan\" = 0.99\n \"Germany\" = 0.59\n }\n\n scene \"China spotlight\" {\n title = \"China alone emits more than the US and India together\"\n highlight \"China\"\n }\n\n scene \"India rising\" {\n title = \"India passed the EU to become the third-largest emitter\"\n highlight \"India\"\n }\n\n scene \"Japan declining\" {\n title = \"Japan's emissions have fallen since their 2013 peak\"\n highlight \"Japan\"\n }\n\n scene \"Per capita reframe\" {\n title = \"Per person, Gulf states dwarf the biggest emitters\"\n description = \"CO₂ emissions per capita, tonnes per person, 2023\"\n highlight \"Qatar\"\n data {\n \"Qatar\" = 40.13\n \"United Arab Emirates\" = 19.77\n \"United States\" = 14.32\n \"China\" = 8.56\n \"India\" = 2.13\n }\n }\n}\n", rr = "chart bar-split {\n title = \"CDU/CSU led German polls at 29 % ahead of the 2021 election\"\n description = \"How Germany would vote in the September 2021 federal election, according to polling in the previous June\"\n source = \"FG Wahlen\"\n sourceUrl = \"https://www.forschungsgruppe.de\"\n note = \"Margin of error at 10%: +/- 2 percentage points; at 40%: +/- 3 percentage points\"\n\n data {\n series = \"Poll\",\"High\",\"Low\"\n \"CDU/CSU\" = 29,32,27\n \"Greens\" = 22,25,20\n \"SPD\" = 14,16,12\n \"AfD\" = 10,12,8\n \"FDP\" = 10,12,8\n \"Left\" = 7,9,5\n }\n}\n", ir = "chart bar-grouped {\n title = \"Asia Pacific holds more renewable capacity than all other regions combined\"\n description = \"Installed capacity in gigawatts (GW), 2023\"\n source = \"IRENA\"\n sourceUrl = \"https://www.irena.org/Publications/2024/Mar/Renewable-capacity-statistics-2024\"\n colorPalette = \"Folklore\"\n\n data {\n series = \"Solar\",\"Wind\",\"Hydro\"\n \"Asia Pacific\" = 870,520,650\n \"Europe\" = 290,260,230\n \"North America\" = 150,170,200\n \"Latin America\" = 50,40,190\n \"Africa\" = 12,9,40\n }\n}\n", ar = "chart scatter {\n title = \"Richer countries live longer, but Nigeria lags far behind its wealth\"\n description = \"Life expectancy in years against GDP per capita (PPP, constant international dollars, log scale), 60 countries, bubble size is population in millions\"\n source = \"World Bank, World Development Indicators\"\n sourceUrl = \"https://databank.worldbank.org/source/world-development-indicators\"\n horizontalScaleType = \"log\"\n trend = \"overall\"\n\n data {\n series = \"GDP per capita\",\"Life expectancy\",\"Population\",\"Region\"\n \"Argentina\" = 26630, 76.8, 45.0, \"Americas\"\n \"Australia\" = 58049, 82.9, 25.3, \"East Asia & Pacific\"\n \"Bangladesh\" = 6838, 72.6, 164.9, \"South Asia\"\n \"Bolivia\" = 11931, 67.8, 11.7, \"Americas\"\n \"Brazil\" = 18019, 75.8, 207.5, \"Americas\"\n \"Botswana\" = 18106, 67.2, 2.3, \"Sub-Saharan Africa\"\n \"Canada\" = 57584, 82.2, 37.6, \"Americas\"\n \"Switzerland\" = 81695, 83.9, 8.6, \"Europe & Central Asia\"\n \"Chile\" = 28228, 80.3, 19.2, \"Americas\"\n \"China\" = 18821, 77.9, 1407.7, \"East Asia & Pacific\"\n \"Cote d'Ivoire\" = 5895, 60.3, 28.2, \"Sub-Saharan Africa\"\n \"Colombia\" = 17337, 76.8, 49.9, \"Americas\"\n \"Costa Rica\" = 23497, 80.3, 5.0, \"Americas\"\n \"Germany\" = 62950, 81.3, 83.1, \"Europe & Central Asia\"\n \"Ecuador\" = 13870, 77.3, 17.3, \"Americas\"\n \"Egypt\" = 15027, 71.2, 107.6, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Spain\" = 46896, 83.8, 47.1, \"Europe & Central Asia\"\n \"Ethiopia\" = 2438, 65.7, 115.7, \"Sub-Saharan Africa\"\n \"France\" = 53449, 82.8, 67.4, \"Europe & Central Asia\"\n \"United Kingdom\" = 53374, 81.4, 66.6, \"Europe & Central Asia\"\n \"Ghana\" = 6508, 64.5, 31.3, \"Sub-Saharan Africa\"\n \"Greece\" = 33503, 81.6, 10.7, \"Europe & Central Asia\"\n \"Guatemala\" = 11466, 71.6, 17.1, \"Americas\"\n \"Haiti\" = 3362, 64.3, 11.1, \"Americas\"\n \"Indonesia\" = 12758, 70.3, 272.5, \"East Asia & Pacific\"\n \"India\" = 7702, 70.7, 1389.0, \"South Asia\"\n \"Iran\" = 14841, 76.9, 87.1, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Israel\" = 44492, 82.8, 9.1, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Italy\" = 49691, 83.5, 59.7, \"Europe & Central Asia\"\n \"Jordan\" = 10168, 76.9, 10.7, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Japan\" = 46055, 84.4, 126.6, \"East Asia & Pacific\"\n \"Kenya\" = 5172, 62.9, 51.2, \"Sub-Saharan Africa\"\n \"Cambodia\" = 6449, 70.1, 16.5, \"East Asia & Pacific\"\n \"South Korea\" = 49791, 83.2, 51.8, \"East Asia & Pacific\"\n \"Sri Lanka\" = 14637, 76.7, 21.8, \"South Asia\"\n \"Morocco\" = 8768, 74.2, 36.2, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Mexico\" = 21704, 74.5, 125.8, \"Americas\"\n \"Malaysia\" = 31301, 75.9, 33.4, \"East Asia & Pacific\"\n \"Nigeria\" = 8362, 53.0, 209.5, \"Sub-Saharan Africa\"\n \"Norway\" = 90773, 83.0, 5.3, \"Europe & Central Asia\"\n \"New Zealand\" = 47392, 82.1, 5.0, \"East Asia & Pacific\"\n \"Pakistan\" = 5296, 66.7, 230.8, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Peru\" = 15461, 76.3, 32.4, \"Americas\"\n \"Philippines\" = 9452, 69.7, 110.8, \"East Asia & Pacific\"\n \"Poland\" = 38182, 77.9, 38.0, \"Europe & Central Asia\"\n \"Portugal\" = 40188, 81.7, 10.3, \"Europe & Central Asia\"\n \"Romania\" = 36399, 75.6, 19.4, \"Europe & Central Asia\"\n \"Russia\" = 37319, 73.1, 145.5, \"Europe & Central Asia\"\n \"Rwanda\" = 2754, 66.7, 12.8, \"Sub-Saharan Africa\"\n \"Saudi Arabia\" = 62648, 78.3, 30.1, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Senegal\" = 4071, 67.7, 16.4, \"Sub-Saharan Africa\"\n \"Sweden\" = 61071, 83.1, 10.3, \"Europe & Central Asia\"\n \"Thailand\" = 21280, 77.2, 71.5, \"East Asia & Pacific\"\n \"Turkey\" = 28741, 77.7, 82.6, \"Europe & Central Asia\"\n \"Tanzania\" = 3485, 66.0, 59.2, \"Sub-Saharan Africa\"\n \"Ukraine\" = 17637, 73.9, 45.0, \"Europe & Central Asia\"\n \"Uruguay\" = 30011, 77.5, 3.4, \"Americas\"\n \"United States\" = 69121, 78.8, 330.2, \"Americas\"\n \"Vietnam\" = 11629, 74.2, 97.2, \"East Asia & Pacific\"\n \"South Africa\" = 14353, 66.1, 59.6, \"Sub-Saharan Africa\" }\n\n highlight \"Nigeria\"\n\n annotation \"Nigeria\" {\n text = \"17 years below the trend\"\n showLine = true\n anchorDirection = SW\n textOffsetX = -60\n textOffsetY = 50\n lineStyle = elbow\n showArrow = false\n lineTargetDistance = 10\n }\n\n scene \"1990\" {\n title = \"In 1990 the same countries were poorer and lived shorter lives\"\n data {\n series = \"GDP per capita\",\"Life expectancy\",\"Population\",\"Region\"\n \"Argentina\" = 17007, 71.6, 32.8, \"Americas\"\n \"Australia\" = 36268, 77.0, 17.1, \"East Asia & Pacific\"\n \"Bangladesh\" = 2070, 55.8, 111.6, \"South Asia\"\n \"Bolivia\" = 6247, 56.8, 7.1, \"Americas\"\n \"Brazil\" = 12633, 65.9, 149.1, \"Americas\"\n \"Botswana\" = 10521, 60.1, 1.3, \"Sub-Saharan Africa\"\n \"Canada\" = 40475, 77.4, 27.7, \"Americas\"\n \"Switzerland\" = 63921, 77.2, 6.7, \"Europe & Central Asia\"\n \"Chile\" = 10955, 73.7, 13.4, \"Americas\"\n \"China\" = 1667, 68.2, 1135.2, \"East Asia & Pacific\"\n \"Cote d'Ivoire\" = 5256, 52.8, 12.2, \"Sub-Saharan Africa\"\n \"Colombia\" = 9999, 68.7, 32.4, \"Americas\"\n \"Costa Rica\" = 10980, 76.1, 3.1, \"Americas\"\n \"Germany\" = 42355, 75.1, 79.4, \"Europe & Central Asia\"\n \"Ecuador\" = 9105, 68.4, 10.5, \"Americas\"\n \"Egypt\" = 8007, 62.5, 58.4, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Spain\" = 31773, 76.8, 38.9, \"Europe & Central Asia\"\n \"Ethiopia\" = 874, 45.1, 47.6, \"Sub-Saharan Africa\"\n \"France\" = 38656, 76.6, 58.3, \"Europe & Central Asia\"\n \"United Kingdom\" = 33531, 75.9, 57.2, \"Europe & Central Asia\"\n \"Ghana\" = 2786, 55.4, 15.4, \"Sub-Saharan Africa\"\n \"Greece\" = 26916, 76.9, 10.2, \"Europe & Central Asia\"\n \"Guatemala\" = 7595, 61.8, 9.0, \"Americas\"\n \"Haiti\" = 3923, 53.2, 6.9, \"Americas\"\n \"Indonesia\" = 4873, 63.2, 183.5, \"East Asia & Pacific\"\n \"India\" = 2140, 58.6, 865.0, \"South Asia\"\n \"Iran\" = 9656, 64.1, 58.4, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Israel\" = 25341, 76.6, 4.7, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Italy\" = 42657, 77.0, 56.7, \"Europe & Central Asia\"\n \"Jordan\" = 8242, 70.1, 3.6, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Japan\" = 36138, 78.8, 123.5, \"East Asia & Pacific\"\n \"Kenya\" = 4177, 58.3, 22.9, \"Sub-Saharan Africa\"\n \"Cambodia\" = 2646, 55.2, 7.4, \"East Asia & Pacific\"\n \"South Korea\" = 14378, 71.6, 42.9, \"East Asia & Pacific\"\n \"Sri Lanka\" = 4562, 69.2, 16.4, \"South Asia\"\n \"Morocco\" = 4419, 62.4, 24.4, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Mexico\" = 17170, 69.0, 82.8, \"Americas\"\n \"Malaysia\" = 12014, 71.0, 17.8, \"East Asia & Pacific\"\n \"Nigeria\" = 5424, 45.7, 97.1, \"Sub-Saharan Africa\"\n \"Norway\" = 56608, 76.5, 4.2, \"Europe & Central Asia\"\n \"New Zealand\" = 30786, 75.4, 3.3, \"East Asia & Pacific\"\n \"Pakistan\" = 3200, 59.7, 116.2, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Peru\" = 6316, 64.0, 22.0, \"Americas\"\n \"Philippines\" = 4504, 64.4, 62.9, \"East Asia & Pacific\"\n \"Poland\" = 12821, 70.9, 38.1, \"Europe & Central Asia\"\n \"Portugal\" = 27191, 74.0, 10.0, \"Europe & Central Asia\"\n \"Romania\" = 16317, 69.7, 23.2, \"Europe & Central Asia\"\n \"Russia\" = 29644, 68.9, 148.0, \"Europe & Central Asia\"\n \"Rwanda\" = 1166, 47.8, 7.4, \"Sub-Saharan Africa\"\n \"Saudi Arabia\" = 65197, 68.9, 10.6, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Senegal\" = 2923, 56.7, 7.7, \"Sub-Saharan Africa\"\n \"Sweden\" = 40200, 77.5, 8.6, \"Europe & Central Asia\"\n \"Thailand\" = 8703, 68.9, 54.7, \"East Asia & Pacific\"\n \"Turkey\" = 12184, 67.8, 56.0, \"Europe & Central Asia\"\n \"Tanzania\" = 1794, 52.0, 26.1, \"Sub-Saharan Africa\"\n \"Ukraine\" = 22816, 70.4, 52.1, \"Europe & Central Asia\"\n \"Uruguay\" = 14061, 73.0, 3.1, \"Americas\"\n \"United States\" = 44384, 75.2, 249.6, \"Americas\"\n \"Vietnam\" = 2468, 69.0, 65.5, \"East Asia & Pacific\"\n \"South Africa\" = 10811, 62.9, 40.7, \"Sub-Saharan Africa\" }\n }\n}\n";
946
+ var Zn = "chart bar-vertical {\n title = \"E is the most frequent letter in English\"\n description = \"How often each letter appears in typical English text\"\n byline = \"Pierre Romera\"\n source = \"Lewand, Cryptological Mathematics\"\n sourceUrl = \"https://en.wikipedia.org/wiki/Letter_frequency\"\n note = \"Based on analysis of 40,000 words from English prose\"\n colorPalette = \"London\"\n sort = descending\n\n highlight \"E\"\n\n data {\n \"E\" = 12.70\n \"T\" = 9.06\n \"A\" = 8.17\n \"O\" = 7.51\n \"I\" = 6.97\n \"N\" = 6.75\n \"S\" = 6.33\n \"H\" = 6.09\n \"R\" = 5.99\n \"D\" = 4.25\n }\n}\n", Qn = "chart bar-vertical {\n // the headline above the chart\n title = \"China emits more CO₂ than the US and India combined\"\n description = \"Annual emissions in billion tonnes, 2023\"\n source = \"Our World in Data\"\n sourceUrl = \"https://ourworldindata.org/co2-emissions\"\n\n // one row per country: \"label\" = value\n data {\n \"China\" = 12.17\n \"United States\" = 4.92\n \"India\" = 3.06\n \"Russia\" = 1.73\n \"Japan\" = 0.99\n \"Germany\" = 0.59\n }\n\n // highlight pops one bar in the accent color\n highlight \"China\"\n\n // an annotation points a callout at a single bar\n annotation \"India\" {\n text = \"Surpassed EU in 2023\"\n showLine = true\n anchorDirection = N\n textOffsetX = 66\n textOffsetY = -41\n lineStyle = curve-left\n showArrow = true\n lineTargetDistance = 26\n showCircle = false\n }\n}\n", $n = "chart bar-horizontal {\n title = \"Mandarin has nearly twice as many native speakers as Spanish\"\n description = \"Number of native speakers worldwide, in millions\"\n source = \"Ethnologue\"\n sourceUrl = \"https://ethnologue.com\"\n byline = \"Pierre Romera\"\n sort = descending\n\n highlight \"Mandarin\"\n\n data {\n \"Mandarin\" = 988\n \"Spanish\" = 487\n \"English\" = 372\n \"Hindi\" = 347\n \"Bengali\" = 232\n \"Portuguese\" = 252\n \"Russian\" = 133\n \"Japanese\" = 124\n }\n}\n", er = "chart line-multi {\n title = \"China now buys more electric cars than the rest of the world combined\"\n description = \"Electric car sales by region, millions per year\"\n source = \"IEA Global EV Outlook 2024\"\n sourceUrl = \"https://www.iea.org/reports/global-ev-outlook-2024\"\n colorPalette = \"Maya\"\n tooltips = true\n\n data {\n series = \"China\",\"Europe\",\"United States\",\"Rest of world\"\n \"2018\" = 1.1,0.4,0.36,0.1\n \"2020\" = 1.3,1.4,0.30,0.2\n \"2021\" = 3.3,2.3,0.63,0.4\n \"2022\" = 6.0,2.7,1.0,0.7\n \"2023\" = 8.1,3.2,1.4,1.0\n }\n}\n", tr = "chart bar-multi {\n title = \"USA tops Paris 2024 with 126 medals across all categories\"\n description = \"2024 Paris Summer Games — top six nations\"\n source = \"Olympics.com\"\n sourceUrl = \"https://olympics.com\"\n colors = \"#eeca3b, #c0c0c0, #cd7f32\"\n sort = descending\n\n data {\n series = \"Gold\",\"Silver\",\"Bronze\"\n \"USA\" = 40,44,42\n \"China\" = 40,27,24\n \"Japan\" = 20,12,13\n \"Great Britain\" = 14,22,29\n \"Australia\" = 18,19,16\n \"France\" = 16,26,22\n }\n}\n", nr = "chart line {\n title = \"2024 was the hottest year on record\"\n description = \"Deviation from the 1951–1980 average, in °C\"\n source = \"NASA GISS\"\n sourceUrl = \"https://data.giss.nasa.gov/gistemp/\"\n tooltips = true\n crosshair = false\n lineSymbols = true\n\n data {\n \"1980\" = 0.26\n \"1985\" = 0.12\n \"1990\" = 0.45\n \"1995\" = 0.45\n \"2000\" = 0.39\n \"2005\" = 0.68\n \"2010\" = 0.73\n \"2015\" = 0.9\n \"2020\" = 1.01\n \"2024\" = 1.28\n }\n\n annotation \"2015\" {\n text = \"2015 Paris Agreement to limit global warming to 1.5°C \"\n maxWidth = 224\n showLine = true\n lineStyle = curve-right\n showArrow = true\n showCircle = true\n }\n}\n", rr = "chart line {\n title = \"Bitcoin surged past $90,000 in 2024\"\n description = \"USD, year-end closing price\"\n source = \"CoinGecko\"\n sourceUrl = \"https://www.coingecko.com\"\n colors = \"#f7931a\"\n lineSymbols = true\n lineSymbolShowOn = \"all\"\n lineSymbolShape = \"diamond\"\n verticalNumberFormat = \",.0f\"\n tooltips = true\n\n annotation \"2021\" {\n text = \"All-time high cycle\"\n textOffsetY = -12\n showArrow = true\n }\n\n data {\n \"2016\" = 963\n \"2017\" = 14156\n \"2018\" = 3742\n \"2019\" = 7194\n \"2020\" = 29080\n \"2021\" = 46306\n \"2022\" = 16547\n \"2023\" = 42258\n \"2024\" = 93429\n }\n}\n", ir = "chart line-multi {\n title = \"The income share of the top 1% has surged since 1980\"\n description = \"Pre-tax national income captured by the top 1%, percent\"\n source = \"World Inequality Database\"\n sourceUrl = \"https://wid.world\"\n colorPalette = \"Egypt\"\n tooltips = true\n lineSymbols = true\n lineSymbolShowOn = \"all\"\n\n data {\n series = \"United States\",\"India\",\"China\",\"France\"\n \"1980\" = 10.4,7.5,6.6,7.5\n \"1990\" = 14.7,10.7,8.3,9.0\n \"2000\" = 17.3,10.5,10.5,11.3\n \"2010\" = 17.9,16.4,15.2,11.0\n \"2021\" = 19.9,22.1,15.7,12.7\n }\n\n scene \"US doubles\" {\n title = \"The US top 1% nearly doubled its income share since 1980\"\n highlight \"United States\"\n }\n\n scene \"India overtakes\" {\n title = \"India is now the most unequal of these major economies\"\n highlight \"India\"\n }\n\n scene \"France's modest rise\" {\n title = \"France's top 1% rose far less than the US or India\"\n highlight \"France\"\n }\n}\n", ar = "chart pie {\n title = \"Asia is home to nearly 60% of the world's population\"\n description = \"Estimated share, 2024\"\n source = \"United Nations\"\n sourceUrl = \"https://population.un.org\"\n colorPalette = \"Klimt\"\n legendPosition = \"right\"\n tooltips = true\n\n data {\n \"Asia\" = 58.9\n \"Africa\" = 18.6\n \"Europe\" = 9.1\n \"Latin America\" = 8.1\n \"North America\" = 4.7\n }\n}\n", or = "chart bar-vertical {\n title = \"Brazil produces more coffee than the next three countries combined\"\n description = \"Million 60-kg bags, 2023/24 crop year\"\n source = \"USDA Foreign Agricultural Service\"\n sourceUrl = \"https://www.fas.usda.gov/data/coffee-world-markets-and-trade\"\n colorPalette = \"Harvey\"\n\n data {\n \"Brazil\" = 66.4\n \"Vietnam\" = 27.5\n \"Colombia\" = 12.76\n \"Ethiopia\" = 9.13\n \"Indonesia\" = 7.65\n \"Honduras\" = 5.5\n }\n\n highlight \"Brazil\"\n\n transform sort {\n column = \"value\"\n direction = descending\n }\n}\n", sr = "chart donut {\n title = \"The richest 1% own more wealth than the entire bottom 90% combined\"\n description = \"Share of global wealth by group, 2021\"\n source = \"World Inequality Report 2022\"\n sourceUrl = \"https://wir2022.wid.world\"\n colorPalette = \"Imperator\"\n legendPosition = \"right\"\n displayAsPercentage = true\n tooltips = true\n\n data {\n \"Top 1%\" = 38\n \"Next 9%\" = 38\n \"Middle 40%\" = 22\n \"Bottom 50%\" = 2\n }\n\n scene \"Top 1% spotlight\" {\n title = \"The top 1% hold 38% of all global wealth\"\n description = \"Share of global wealth by group, 2021\"\n highlight \"Top 1%\"\n }\n\n scene \"Bottom half\" {\n title = \"The bottom half of humanity owns just 2%\"\n description = \"Share of global wealth by group, 2021\"\n highlight \"Bottom 50%\"\n }\n\n scene \"Income tells a softer story\" {\n title = \"Income is concentrated too — but less than wealth\"\n description = \"Share of global income by the same groups, 2021\"\n highlight \"Top 1%\"\n data {\n \"Top 1%\" = 19\n \"Next 9%\" = 33\n \"Middle 40%\" = 39\n \"Bottom 50%\" = 9\n }\n }\n}\n", cr = "chart area {\n title = \"The US national debt has more than tripled since 2008\"\n description = \"Total federal debt outstanding, trillions of dollars\"\n source = \"U.S. Treasury, Fiscal Data\"\n sourceUrl = \"https://fiscaldata.treasury.gov\"\n\n annotation \"2008\" {\n text = \"Financial crisis\"\n showArrow = true\n textOffsetY = -14\n }\n\n data {\n \"2000\" = 5.7\n \"2004\" = 7.4\n \"2008\" = 10.0\n \"2012\" = 16.1\n \"2016\" = 19.6\n \"2020\" = 26.9\n \"2024\" = 35.5\n }\n}\n", lr = "chart area-stacked {\n title = \"Renewables' share of global energy has more than doubled since 2000\"\n description = \"Share of global primary energy by source, 2000–2023\"\n source = \"Our World in Data\"\n sourceUrl = \"https://ourworldindata.org/energy-mix\"\n stackPercent = true\n areaSortMode = descending\n\n data {\n series = \"Coal\",\"Oil\",\"Gas\",\"Renewables\"\n \"2000\" = 27456,43017,23994,2997\n \"2005\" = 36201,47017,27439,3510\n \"2010\" = 42016,48193,31593,4868\n \"2015\" = 43695,51294,34780,6400\n \"2020\" = 42316,49101,38704,8569\n \"2023\" = 45319,54839,40151,10325\n }\n}\n", ur = "chart column-stacked {\n title = \"Natural gas and renewables pushed coal off the US power grid\"\n description = \"Share of US electricity generation by source, percent\"\n source = \"U.S. Energy Information Administration\"\n sourceUrl = \"https://www.eia.gov/electricity\"\n stackMode = \"percent\"\n\n data {\n series = \"Coal\",\"Natural gas\",\"Nuclear\",\"Renewables\"\n \"2010\" = 45,24,20,10\n \"2015\" = 33,33,20,13\n \"2020\" = 19,39,20,20\n \"2023\" = 16,43,19,21\n }\n}\n", dr = "chart bar-stacked {\n title = \"India has far more children than China, and a workforce nearly as large\"\n description = \"Millions of people, 2023\"\n source = \"UN Population Division\"\n sourceUrl = \"https://population.un.org\"\n colorPalette = \"London\"\n\n data {\n series = \"0-14\",\"15-64\",\"65+\"\n \"China\" = 232,988,200\n \"India\" = 354,978,97\n \"USA\" = 58,216,59\n \"Indonesia\" = 67,189,21\n \"Brazil\" = 43,148,24\n }\n}\n", fr = "chart area-stacked {\n title = \"EU subsidies to new members surged after enlargement\"\n description = \"Agricultural subsidies to post-socialist EU members, million euros\"\n source = \"Eurostat\"\n sourceUrl = \"https://ec.europa.eu/eurostat\"\n colorPalette = \"Enara\"\n interpolation = \"linear\"\n heightMode = \"aspect-ratio\"\n aspectRatio = \"1:1\"\n\n data {\n series = \"Indirect subsidies\",\"Direct subsidies\"\n \"2000\" = 370,800\n \"2001\" = 445,896\n \"2002\" = 567,816\n \"2003\" = 641,950\n \"2004\" = 1908,2434\n \"2005\" = 2234,3509\n \"2006\" = 2576,4356\n \"2007\" = 2467,5429\n \"2008\" = 2672,6655\n \"2009\" = 2474,7195\n \"2010\" = 2117,8207\n \"2011\" = 1863,9230\n \"2012\" = 1528,9191\n \"2013\" = 1251,10252\n \"2014\" = 1132,10987\n \"2015\" = 1687,10145\n }\n\n scene \"Indirect subsidies shrank\" {\n title = \"Indirect subsidies were cut under WTO pressure\"\n description = \"Subsidies tied to specific crops fell foul of World Trade Organization rules\"\n\n highlight \"Indirect subsidies\"\n }\n\n scene \"Direct subsidies dominate\" {\n title = \"Direct per-hectare payments now dominate\"\n description = \"The larger the fields, the more money farmers receive\"\n\n highlight \"Direct subsidies\"\n }\n\n scene \"Bulgaria: subsidies explode\" {\n title = \"Bulgarian farmers received almost nothing before 2007 accession\"\n description = \"More than three-quarters of Bulgarian subsidies are direct payments — the highest share among new members\"\n\n data {\n series = \"Indirect subsidies\",\"Direct subsidies\"\n \"2000\" = 0,5\n \"2001\" = 0,33\n \"2002\" = 0,48\n \"2003\" = 0,69\n \"2004\" = 0,67\n \"2005\" = 0,87\n \"2006\" = 0,57\n \"2007\" = 59,250\n \"2008\" = 75,484\n \"2009\" = 97,415\n \"2010\" = 79,466\n \"2011\" = 94,458\n \"2012\" = 120,617\n \"2013\" = 132,852\n \"2014\" = 143,821\n \"2015\" = 213,677\n }\n\n highlight \"Direct subsidies\"\n }\n\n scene \"Bulgarian farms grew\" {\n title = \"Average farm size in Bulgaria quadrupled\"\n description = \"Average farm size in hectares\"\n type = line\n\n data {\n \"2005\" = 5\n \"2007\" = 6\n \"2010\" = 12\n \"2013\" = 18\n }\n }\n\n scene \"Production rose\" {\n title = \"Bulgarian farm production rose from 3 to 4 billion euros\"\n description = \"Total production of Bulgarian farms, million euros\"\n type = area\n\n data {\n \"2000\" = 2933\n \"2001\" = 3240\n \"2002\" = 3051\n \"2003\" = 2816\n \"2004\" = 3049\n \"2005\" = 3011\n \"2006\" = 3111\n \"2007\" = 3038\n \"2008\" = 4148\n \"2009\" = 3437\n \"2010\" = 3486\n \"2011\" = 4038\n \"2012\" = 4161\n \"2013\" = 4115\n \"2014\" = 4138\n \"2015\" = 3915\n }\n }\n\n scene \"Cash crops replaced vegetables\" {\n title = \"Cash crops replaced vegetables in Bulgaria\"\n description = \"Production of Bulgarian farms, million euros\"\n type = area-stacked\n\n data {\n series = \"Vegetables\",\"Cash crops\",\"Other production\"\n \"2000\" = 464,615,1854\n \"2001\" = 458,777,2005\n \"2002\" = 577,850,1624\n \"2003\" = 539,818,1459\n \"2004\" = 483,1103,1463\n \"2005\" = 492,994,1525\n \"2006\" = 510,1083,1518\n \"2007\" = 436,936,1666\n \"2008\" = 541,2045,1563\n \"2009\" = 243,1553,1641\n \"2010\" = 184,2173,1128\n \"2011\" = 120,2853,1065\n \"2012\" = 117,2900,1144\n \"2013\" = 139,2802,1174\n \"2014\" = 143,3082,914\n \"2015\" = 144,2986,785\n }\n\n highlight \"Cash crops\"\n }\n\n scene \"Vegetables collapsed\" {\n title = \"Vegetable production fell by a factor of three\"\n description = \"A traditional Bulgarian cultivation shrank as subsidies favoured large fields\"\n\n highlight \"Vegetables\"\n }\n\n scene \"Every vegetable declined\" {\n title = \"Bulgarian vegetable production collapsed across the board\"\n description = \"Production volume indexed to 2001 = 100\"\n type = line-multi\n lineSymbols = false\n\n data {\n series = \"Cabbages\",\"Tomatoes\",\"Watermelons\",\"Carrots\",\"Onions\",\"Garlic\",\"Strawberries\"\n \"2001\" = 100,100,100,100,100,100,100\n \"2002\" = 79,90,124,64,106,95,100\n \"2003\" = 100,157,177,142,118,98,72\n \"2004\" = 84,87,83,245,124,138,74\n \"2005\" = 50,46,62,30,40,93,42\n \"2006\" = 52,78,113,95,56,80,56\n \"2007\" = 36,49,64,74,29,30,38\n \"2008\" = 47,49,66,97,44,29,55\n \"2009\" = 28,38,74,105,23,39,55\n \"2010\" = 57,42,51,76,53,57,37\n \"2011\" = 32,38,56,86,47,43,45\n \"2012\" = 34,34,46,69,29,43,31\n \"2013\" = 33,43,53,39,36,40,24\n \"2014\" = 31,44,28,69,37,8,27\n \"2015\" = 31,45,50,57,25,18,32\n }\n }\n\n scene \"Jobs disappeared\" {\n title = \"Family farmers disappeared while salaried ag jobs held steady\"\n description = \"EU agricultural employment, thousands of full-time equivalents\"\n type = line-multi\n lineSymbols = false\n\n data {\n series = \"Salaried workers\",\"Non-salaried workers\"\n \"2000\" = 2678,12194\n \"2001\" = 2598,11586\n \"2002\" = 2658,10795\n \"2003\" = 2563,10609\n \"2004\" = 2560,9999\n \"2005\" = 2501,10047\n \"2006\" = 2499,9782\n \"2007\" = 2437,9231\n \"2008\" = 2416,8971\n \"2009\" = 2348,8672\n \"2010\" = 2335,7808\n \"2011\" = 2322,7551\n \"2012\" = 2325,7501\n \"2013\" = 2297,7425\n \"2014\" = 2366,7183\n \"2015\" = 2413,6928\n \"2016\" = 2457,6741\n }\n\n highlight \"Non-salaried workers\"\n }\n}\n", pr = "chart bar-horizontal {\n title = \"China emits more CO₂ than the US and India combined\"\n description = \"Annual emissions in billion tonnes, 2023\"\n source = \"Our World in Data\"\n sourceUrl = \"https://ourworldindata.org/co2-emissions\"\n byline = \"Pierre Romera\"\n\n data {\n \"China\" = 12.17\n \"United States\" = 4.92\n \"India\" = 3.06\n \"Russia\" = 1.73\n \"Japan\" = 0.99\n \"Germany\" = 0.59\n }\n\n scene \"China spotlight\" {\n title = \"China alone emits more than the US and India together\"\n highlight \"China\"\n }\n\n scene \"India rising\" {\n title = \"India passed the EU to become the third-largest emitter\"\n highlight \"India\"\n }\n\n scene \"Japan declining\" {\n title = \"Japan's emissions have fallen since their 2013 peak\"\n highlight \"Japan\"\n }\n\n scene \"Per capita reframe\" {\n title = \"Per person, Gulf states dwarf the biggest emitters\"\n description = \"CO₂ emissions per capita, tonnes per person, 2023\"\n highlight \"Qatar\"\n data {\n \"Qatar\" = 40.13\n \"United Arab Emirates\" = 19.77\n \"United States\" = 14.32\n \"China\" = 8.56\n \"India\" = 2.13\n }\n }\n}\n", mr = "chart dot-plot {\n title = \"CDU/CSU led German polls at 29 % ahead of the 2021 election\"\n description = \"How Germany would vote in the September 2021 federal election, according to polling in the previous June\"\n source = \"FG Wahlen\"\n sourceUrl = \"https://www.forschungsgruppe.de\"\n note = \"Margin of error at 10%: +/- 2 percentage points; at 40%: +/- 3 percentage points\"\n dotStyle = \"range\"\n\n data {\n series = \"Poll\",\"High\",\"Low\"\n \"CDU/CSU\" = 29,32,27\n \"Greens\" = 22,25,20\n \"SPD\" = 14,16,12\n \"AfD\" = 10,12,8\n \"FDP\" = 10,12,8\n \"Left\" = 7,9,5\n }\n}\n", hr = "chart bar-grouped {\n title = \"Asia Pacific holds more renewable capacity than all other regions combined\"\n description = \"Installed capacity in gigawatts (GW), 2023\"\n source = \"IRENA\"\n sourceUrl = \"https://www.irena.org/Publications/2024/Mar/Renewable-capacity-statistics-2024\"\n colorPalette = \"Folklore\"\n\n data {\n series = \"Solar\",\"Wind\",\"Hydro\"\n \"Asia Pacific\" = 870,520,650\n \"Europe\" = 290,260,230\n \"North America\" = 150,170,200\n \"Latin America\" = 50,40,190\n \"Africa\" = 12,9,40\n }\n}\n", gr = "chart scatter {\n title = \"Richer countries live longer, but Nigeria lags far behind its wealth\"\n description = \"Life expectancy in years against GDP per capita (PPP, constant international dollars, log scale), 60 countries, bubble size is population in millions\"\n source = \"World Bank, World Development Indicators\"\n sourceUrl = \"https://databank.worldbank.org/source/world-development-indicators\"\n horizontalScaleType = \"log\"\n trend = \"overall\"\n\n data {\n series = \"GDP per capita\",\"Life expectancy\",\"Population\",\"Region\"\n \"Argentina\" = 26630, 76.8, 45.0, \"Americas\"\n \"Australia\" = 58049, 82.9, 25.3, \"East Asia & Pacific\"\n \"Bangladesh\" = 6838, 72.6, 164.9, \"South Asia\"\n \"Bolivia\" = 11931, 67.8, 11.7, \"Americas\"\n \"Brazil\" = 18019, 75.8, 207.5, \"Americas\"\n \"Botswana\" = 18106, 67.2, 2.3, \"Sub-Saharan Africa\"\n \"Canada\" = 57584, 82.2, 37.6, \"Americas\"\n \"Switzerland\" = 81695, 83.9, 8.6, \"Europe & Central Asia\"\n \"Chile\" = 28228, 80.3, 19.2, \"Americas\"\n \"China\" = 18821, 77.9, 1407.7, \"East Asia & Pacific\"\n \"Cote d'Ivoire\" = 5895, 60.3, 28.2, \"Sub-Saharan Africa\"\n \"Colombia\" = 17337, 76.8, 49.9, \"Americas\"\n \"Costa Rica\" = 23497, 80.3, 5.0, \"Americas\"\n \"Germany\" = 62950, 81.3, 83.1, \"Europe & Central Asia\"\n \"Ecuador\" = 13870, 77.3, 17.3, \"Americas\"\n \"Egypt\" = 15027, 71.2, 107.6, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Spain\" = 46896, 83.8, 47.1, \"Europe & Central Asia\"\n \"Ethiopia\" = 2438, 65.7, 115.7, \"Sub-Saharan Africa\"\n \"France\" = 53449, 82.8, 67.4, \"Europe & Central Asia\"\n \"United Kingdom\" = 53374, 81.4, 66.6, \"Europe & Central Asia\"\n \"Ghana\" = 6508, 64.5, 31.3, \"Sub-Saharan Africa\"\n \"Greece\" = 33503, 81.6, 10.7, \"Europe & Central Asia\"\n \"Guatemala\" = 11466, 71.6, 17.1, \"Americas\"\n \"Haiti\" = 3362, 64.3, 11.1, \"Americas\"\n \"Indonesia\" = 12758, 70.3, 272.5, \"East Asia & Pacific\"\n \"India\" = 7702, 70.7, 1389.0, \"South Asia\"\n \"Iran\" = 14841, 76.9, 87.1, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Israel\" = 44492, 82.8, 9.1, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Italy\" = 49691, 83.5, 59.7, \"Europe & Central Asia\"\n \"Jordan\" = 10168, 76.9, 10.7, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Japan\" = 46055, 84.4, 126.6, \"East Asia & Pacific\"\n \"Kenya\" = 5172, 62.9, 51.2, \"Sub-Saharan Africa\"\n \"Cambodia\" = 6449, 70.1, 16.5, \"East Asia & Pacific\"\n \"South Korea\" = 49791, 83.2, 51.8, \"East Asia & Pacific\"\n \"Sri Lanka\" = 14637, 76.7, 21.8, \"South Asia\"\n \"Morocco\" = 8768, 74.2, 36.2, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Mexico\" = 21704, 74.5, 125.8, \"Americas\"\n \"Malaysia\" = 31301, 75.9, 33.4, \"East Asia & Pacific\"\n \"Nigeria\" = 8362, 53.0, 209.5, \"Sub-Saharan Africa\"\n \"Norway\" = 90773, 83.0, 5.3, \"Europe & Central Asia\"\n \"New Zealand\" = 47392, 82.1, 5.0, \"East Asia & Pacific\"\n \"Pakistan\" = 5296, 66.7, 230.8, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Peru\" = 15461, 76.3, 32.4, \"Americas\"\n \"Philippines\" = 9452, 69.7, 110.8, \"East Asia & Pacific\"\n \"Poland\" = 38182, 77.9, 38.0, \"Europe & Central Asia\"\n \"Portugal\" = 40188, 81.7, 10.3, \"Europe & Central Asia\"\n \"Romania\" = 36399, 75.6, 19.4, \"Europe & Central Asia\"\n \"Russia\" = 37319, 73.1, 145.5, \"Europe & Central Asia\"\n \"Rwanda\" = 2754, 66.7, 12.8, \"Sub-Saharan Africa\"\n \"Saudi Arabia\" = 62648, 78.3, 30.1, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Senegal\" = 4071, 67.7, 16.4, \"Sub-Saharan Africa\"\n \"Sweden\" = 61071, 83.1, 10.3, \"Europe & Central Asia\"\n \"Thailand\" = 21280, 77.2, 71.5, \"East Asia & Pacific\"\n \"Turkey\" = 28741, 77.7, 82.6, \"Europe & Central Asia\"\n \"Tanzania\" = 3485, 66.0, 59.2, \"Sub-Saharan Africa\"\n \"Ukraine\" = 17637, 73.9, 45.0, \"Europe & Central Asia\"\n \"Uruguay\" = 30011, 77.5, 3.4, \"Americas\"\n \"United States\" = 69121, 78.8, 330.2, \"Americas\"\n \"Vietnam\" = 11629, 74.2, 97.2, \"East Asia & Pacific\"\n \"South Africa\" = 14353, 66.1, 59.6, \"Sub-Saharan Africa\" }\n\n highlight \"Nigeria\"\n\n annotation \"Nigeria\" {\n text = \"17 years below the trend\"\n showLine = true\n anchorDirection = SW\n textOffsetX = -60\n textOffsetY = 50\n lineStyle = elbow\n showArrow = false\n lineTargetDistance = 10\n }\n\n scene \"1990\" {\n title = \"In 1990 the same countries were poorer and lived shorter lives\"\n data {\n series = \"GDP per capita\",\"Life expectancy\",\"Population\",\"Region\"\n \"Argentina\" = 17007, 71.6, 32.8, \"Americas\"\n \"Australia\" = 36268, 77.0, 17.1, \"East Asia & Pacific\"\n \"Bangladesh\" = 2070, 55.8, 111.6, \"South Asia\"\n \"Bolivia\" = 6247, 56.8, 7.1, \"Americas\"\n \"Brazil\" = 12633, 65.9, 149.1, \"Americas\"\n \"Botswana\" = 10521, 60.1, 1.3, \"Sub-Saharan Africa\"\n \"Canada\" = 40475, 77.4, 27.7, \"Americas\"\n \"Switzerland\" = 63921, 77.2, 6.7, \"Europe & Central Asia\"\n \"Chile\" = 10955, 73.7, 13.4, \"Americas\"\n \"China\" = 1667, 68.2, 1135.2, \"East Asia & Pacific\"\n \"Cote d'Ivoire\" = 5256, 52.8, 12.2, \"Sub-Saharan Africa\"\n \"Colombia\" = 9999, 68.7, 32.4, \"Americas\"\n \"Costa Rica\" = 10980, 76.1, 3.1, \"Americas\"\n \"Germany\" = 42355, 75.1, 79.4, \"Europe & Central Asia\"\n \"Ecuador\" = 9105, 68.4, 10.5, \"Americas\"\n \"Egypt\" = 8007, 62.5, 58.4, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Spain\" = 31773, 76.8, 38.9, \"Europe & Central Asia\"\n \"Ethiopia\" = 874, 45.1, 47.6, \"Sub-Saharan Africa\"\n \"France\" = 38656, 76.6, 58.3, \"Europe & Central Asia\"\n \"United Kingdom\" = 33531, 75.9, 57.2, \"Europe & Central Asia\"\n \"Ghana\" = 2786, 55.4, 15.4, \"Sub-Saharan Africa\"\n \"Greece\" = 26916, 76.9, 10.2, \"Europe & Central Asia\"\n \"Guatemala\" = 7595, 61.8, 9.0, \"Americas\"\n \"Haiti\" = 3923, 53.2, 6.9, \"Americas\"\n \"Indonesia\" = 4873, 63.2, 183.5, \"East Asia & Pacific\"\n \"India\" = 2140, 58.6, 865.0, \"South Asia\"\n \"Iran\" = 9656, 64.1, 58.4, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Israel\" = 25341, 76.6, 4.7, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Italy\" = 42657, 77.0, 56.7, \"Europe & Central Asia\"\n \"Jordan\" = 8242, 70.1, 3.6, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Japan\" = 36138, 78.8, 123.5, \"East Asia & Pacific\"\n \"Kenya\" = 4177, 58.3, 22.9, \"Sub-Saharan Africa\"\n \"Cambodia\" = 2646, 55.2, 7.4, \"East Asia & Pacific\"\n \"South Korea\" = 14378, 71.6, 42.9, \"East Asia & Pacific\"\n \"Sri Lanka\" = 4562, 69.2, 16.4, \"South Asia\"\n \"Morocco\" = 4419, 62.4, 24.4, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Mexico\" = 17170, 69.0, 82.8, \"Americas\"\n \"Malaysia\" = 12014, 71.0, 17.8, \"East Asia & Pacific\"\n \"Nigeria\" = 5424, 45.7, 97.1, \"Sub-Saharan Africa\"\n \"Norway\" = 56608, 76.5, 4.2, \"Europe & Central Asia\"\n \"New Zealand\" = 30786, 75.4, 3.3, \"East Asia & Pacific\"\n \"Pakistan\" = 3200, 59.7, 116.2, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Peru\" = 6316, 64.0, 22.0, \"Americas\"\n \"Philippines\" = 4504, 64.4, 62.9, \"East Asia & Pacific\"\n \"Poland\" = 12821, 70.9, 38.1, \"Europe & Central Asia\"\n \"Portugal\" = 27191, 74.0, 10.0, \"Europe & Central Asia\"\n \"Romania\" = 16317, 69.7, 23.2, \"Europe & Central Asia\"\n \"Russia\" = 29644, 68.9, 148.0, \"Europe & Central Asia\"\n \"Rwanda\" = 1166, 47.8, 7.4, \"Sub-Saharan Africa\"\n \"Saudi Arabia\" = 65197, 68.9, 10.6, \"Middle East, North Africa, Afghanistan & Pakistan\"\n \"Senegal\" = 2923, 56.7, 7.7, \"Sub-Saharan Africa\"\n \"Sweden\" = 40200, 77.5, 8.6, \"Europe & Central Asia\"\n \"Thailand\" = 8703, 68.9, 54.7, \"East Asia & Pacific\"\n \"Turkey\" = 12184, 67.8, 56.0, \"Europe & Central Asia\"\n \"Tanzania\" = 1794, 52.0, 26.1, \"Sub-Saharan Africa\"\n \"Ukraine\" = 22816, 70.4, 52.1, \"Europe & Central Asia\"\n \"Uruguay\" = 14061, 73.0, 3.1, \"Americas\"\n \"United States\" = 44384, 75.2, 249.6, \"Americas\"\n \"Vietnam\" = 2468, 69.0, 65.5, \"East Asia & Pacific\"\n \"South Africa\" = 10811, 62.9, 40.7, \"Sub-Saharan Africa\" }\n }\n}\n", _r = "chart dot-plot {\n title = \"Zimbabwe gained over 16 years of life expectancy since 2000, the United States under 1\"\n description = \"Life expectancy at birth in years, 2000 and 2022, for 10 countries\"\n source = \"World Bank, World Development Indicators\"\n sourceUrl = \"https://data.worldbank.org/indicator/SP.DYN.LE00.IN\"\n arrows = \"forward\"\n sortMode = \"gap\"\n\n data {\n series = \"2000\",\"2022\"\n \"Zimbabwe\" = 46.0, 62.4\n \"Ethiopia\" = 50.9, 66.9\n \"Nigeria\" = 47.1, 54.1\n \"India\" = 62.7, 71.7\n \"Russia\" = 65.5, 72.5\n \"South Africa\" = 58.4, 65.5\n \"China\" = 72.3, 78.2\n \"Japan\" = 81.1, 84.0\n \"Germany\" = 77.9, 80.6\n \"United States\" = 76.6, 77.4\n }\n}\n";
894
947
  //#endregion
895
948
  //#region src/samples.ts
896
- function or(e, t) {
949
+ function vr(e, t) {
897
950
  let n = e.properties.find((e) => e.key === t);
898
951
  return n ? String(n.value) : "";
899
952
  }
900
- function sr(e) {
953
+ function yr(e) {
901
954
  if (!e.data) return "";
902
955
  let t = e.data.entries, n = t.find((e) => e.key === "series" && !e.quotedKey);
903
956
  return n ? [["category", ...String(n.value).split(",")].join(" "), ...t.filter((e) => !(e.key === "series" && !e.quotedKey)).map((e) => {
@@ -905,60 +958,61 @@ function sr(e) {
905
958
  return [e.key, ...t].join(" ");
906
959
  })].join("\n") : [["label", "value"].join(" "), ...t.map((e) => [e.key, String(e.value)].join(" "))].join("\n");
907
960
  }
908
- function cr(e) {
961
+ function br(e) {
909
962
  if (!e.data) return "";
910
963
  let t = e.data.entries, n = t.find((e) => e.key === "series" && !e.quotedKey);
911
964
  return n ? [`series = "${String(n.value)}"`, ...t.filter((e) => !(e.key === "series" && !e.quotedKey)).map((e) => `"${e.key}" = "${String(e.value)}"`)].join("\n") : t.map((e) => `"${e.key}" = ${String(e.value)}`).join("\n");
912
965
  }
913
- function q(e, t) {
914
- let n = x(t);
966
+ function J(e, t) {
967
+ let n = b(t);
915
968
  return {
916
969
  id: e,
917
- title: or(n, "title"),
918
- description: or(n, "description"),
970
+ title: vr(n, "title"),
971
+ description: vr(n, "description"),
919
972
  chartType: n.chartType,
920
- tsvData: sr(n),
921
- serializedData: cr(n),
973
+ tsvData: yr(n),
974
+ serializedData: br(n),
922
975
  dsl: t
923
976
  };
924
977
  }
925
- var lr = [
926
- q("letter-frequency", Bn),
927
- q("co2-emissions", Vn),
928
- q("coffee-production", Yn),
929
- q("spoken-languages", Hn),
930
- q("quarterly-revenue", Un),
931
- q("medal-count", Wn),
932
- q("temperature-anomaly", Gn),
933
- q("bitcoin-price", Kn),
934
- q("unemployment-rates", qn),
935
- q("browser-market", Xn),
936
- q("world-population", Jn),
937
- q("stock-price-area", Zn),
938
- q("energy-mix-stacked-area", Qn),
939
- q("quarterly-stacked-columns", $n),
940
- q("population-stacked-bar", er),
941
- q("election-polls", rr),
942
- q("renewable-capacity", ir),
943
- q("farm-compass", tr),
944
- q("co2-emissions-story", nr),
945
- q("life-expectancy-wealth", ar)
946
- ], ur = class extends Error {
978
+ var xr = [
979
+ J("letter-frequency", Zn),
980
+ J("co2-emissions", Qn),
981
+ J("coffee-production", or),
982
+ J("spoken-languages", $n),
983
+ J("quarterly-revenue", er),
984
+ J("medal-count", tr),
985
+ J("temperature-anomaly", nr),
986
+ J("bitcoin-price", rr),
987
+ J("unemployment-rates", ir),
988
+ J("browser-market", sr),
989
+ J("world-population", ar),
990
+ J("stock-price-area", cr),
991
+ J("energy-mix-stacked-area", lr),
992
+ J("quarterly-stacked-columns", ur),
993
+ J("population-stacked-bar", dr),
994
+ J("renewable-capacity", hr),
995
+ J("farm-compass", fr),
996
+ J("co2-emissions-story", pr),
997
+ J("life-expectancy-wealth", gr),
998
+ J("election-polls", mr),
999
+ J("life-expectancy-gains", _r)
1000
+ ], Sr = class extends Error {
947
1001
  constructor(e, t) {
948
1002
  super(e, t), this.name = "ChartParseError";
949
1003
  }
950
- }, dr = class extends Error {
1004
+ }, Cr = class extends Error {
951
1005
  constructor(e = "PNG export is only available in Node. Use toSvg() in the browser.") {
952
1006
  super(e), this.name = "PngBrowserUnsupportedError";
953
1007
  }
954
- }, fr = class extends Error {
1008
+ }, wr = class extends Error {
955
1009
  constructor(e) {
956
1010
  super(e), this.name = "MissingNodeRenderDepsError";
957
1011
  }
958
1012
  };
959
1013
  //#endregion
960
1014
  //#region src/render/backends/dom-backend.ts
961
- function pr() {
1015
+ function Tr() {
962
1016
  return {
963
1017
  kind: "dom",
964
1018
  createContainer(e, t) {
@@ -969,7 +1023,7 @@ function pr() {
969
1023
  };
970
1024
  },
971
1025
  renderToContainer(e, t, n) {
972
- it(e, t, {
1026
+ at(e, t, {
973
1027
  sceneIndex: n.sceneIndex,
974
1028
  thumbnail: n.thumbnail ?? !1,
975
1029
  transition: !1,
@@ -988,23 +1042,23 @@ function pr() {
988
1042
  throw Error("dom-backend: renderToContainer produced no frame");
989
1043
  },
990
1044
  rasterizePng() {
991
- return Promise.reject(new dr());
1045
+ return Promise.reject(new Cr());
992
1046
  }
993
1047
  };
994
1048
  }
995
1049
  //#endregion
996
1050
  //#region src/render/frame-svg.ts
997
- var mr = {
1051
+ var Er = {
998
1052
  background: "#ffffff",
999
1053
  color: "#333333"
1000
- }, hr = {
1054
+ }, Dr = {
1001
1055
  background: "#1c1c1c",
1002
1056
  color: "rgba(255, 255, 255, 0.9)"
1003
- }, gr = "sans-serif", _r = 20, vr = 14, J = 12, Y = 1.25, yr = 4, br = 8, xr = 12, Sr = 40, Cr = "16px", wr = "Blueprint Chart", Tr = "Source: ", Er = " · ", Dr = .6;
1004
- function Or(e) {
1005
- return e === "dark" ? { ...hr } : { ...mr };
1057
+ }, Or = "sans-serif", kr = 20, Ar = 14, Y = 12, jr = 1.25, Mr = 4, Nr = 8, Pr = 12, Fr = 40, Ir = "16px", Lr = "Blueprint Chart", Rr = "Source: ", zr = " · ", Br = .6;
1058
+ function Vr(e) {
1059
+ return e === "dark" ? { ...Dr } : { ...Er };
1006
1060
  }
1007
- function kr() {
1061
+ function Hr() {
1008
1062
  if (typeof document > "u") return null;
1009
1063
  try {
1010
1064
  return document.createElement("canvas").getContext("2d");
@@ -1012,11 +1066,11 @@ function kr() {
1012
1066
  return null;
1013
1067
  }
1014
1068
  }
1015
- function Ar() {
1016
- let e = kr();
1069
+ function Ur() {
1070
+ let e = Hr();
1017
1071
  return (t, n, r) => {
1018
- let i = t.length * n * Dr;
1019
- return e ? (e.font = `${r ? "bold " : ""}${n}px ${gr}`, Math.max(e.measureText(t).width, i)) : i;
1072
+ let i = t.length * n * Br;
1073
+ return e ? (e.font = `${r ? "bold " : ""}${n}px ${Or}`, Math.max(e.measureText(t).width, i)) : i;
1020
1074
  };
1021
1075
  }
1022
1076
  function X(e, t, n, r, i) {
@@ -1044,43 +1098,43 @@ function Z(e, t, n) {
1044
1098
  fontStyle: n.fontStyle,
1045
1099
  fill: n.fill,
1046
1100
  anchor: n.anchor
1047
- }), r += n.fontSize * Y;
1101
+ }), r += n.fontSize * jr;
1048
1102
  return r;
1049
1103
  }
1050
- function jr(e) {
1104
+ function Wr(e) {
1051
1105
  let t = parseFloat(e) || 0;
1052
1106
  return /r?em$/.test(e) ? t * 16 : t;
1053
1107
  }
1054
- function Mr(e) {
1055
- let t = e.frame ?? {}, n = Or(e.theme), [r, i, a, o] = s(t.padding ?? Cr).map(jr), c = Math.max(e.width - o - i, 1), l = Ar(), u = [], d = r;
1056
- t.title && (d = Z(u, X(t.title, c, _r, !0, l), {
1108
+ function Gr(e) {
1109
+ let t = e.frame ?? {}, n = Vr(e.theme), [r, i, a, o] = d(t.padding ?? Ir).map(Wr), s = Math.max(e.width - o - i, 1), c = Ur(), l = [], u = r;
1110
+ t.title && (u = Z(l, X(t.title, s, kr, !0, c), {
1057
1111
  x: o,
1058
- top: d,
1059
- fontSize: _r,
1112
+ top: u,
1113
+ fontSize: kr,
1060
1114
  fontWeight: "bold",
1061
1115
  fill: n.color
1062
- })), t.description && (d = Z(u, X(t.description, c, vr, !1, l), {
1116
+ })), t.description && (u = Z(l, X(t.description, s, Ar, !1, c), {
1063
1117
  x: o,
1064
- top: t.title ? d + yr : d,
1065
- fontSize: vr,
1118
+ top: t.title ? u + Mr : u,
1119
+ fontSize: Ar,
1066
1120
  fill: n.color
1067
1121
  }));
1068
- let f = d, p = t.note ? X(t.note, c, J, !1, l) : [], m = l(wr, J, !1), h = [t.byline, t.source ? Tr + t.source : ""].filter(Boolean).join(Er), g = h ? X(h, Math.max(c - m - xr, 1), J, !1, l) : [], ee = Math.max(g.length, 1), _ = p.length * J * Y + br + ee * J * Y + a, v = Math.max(e.height - f - _, Sr), y = f + v;
1069
- return y = Z(u, p, {
1122
+ let f = u, p = t.note ? X(t.note, s, Y, !1, c) : [], m = c(Lr, Y, !1), h = [t.byline, t.source ? Rr + t.source : ""].filter(Boolean).join(zr), g = h ? X(h, Math.max(s - m - Pr, 1), Y, !1, c) : [], ee = Math.max(g.length, 1), te = p.length * Y * jr + Nr + ee * Y * jr + a, _ = Math.max(e.height - f - te, Fr), v = f + _;
1123
+ return v = Z(l, p, {
1070
1124
  x: o,
1071
- top: y,
1072
- fontSize: J,
1125
+ top: v,
1126
+ fontSize: Y,
1073
1127
  fontStyle: "italic",
1074
1128
  fill: n.color
1075
- }) + br, Z(u, g, {
1129
+ }) + Nr, Z(l, g, {
1076
1130
  x: o,
1077
- top: y,
1078
- fontSize: J,
1131
+ top: v,
1132
+ fontSize: Y,
1079
1133
  fill: n.color
1080
- }), Z(u, [wr], {
1134
+ }), Z(l, [Lr], {
1081
1135
  x: e.width - i,
1082
- top: y,
1083
- fontSize: J,
1136
+ top: v,
1137
+ fontSize: Y,
1084
1138
  fontWeight: "600",
1085
1139
  fill: n.color,
1086
1140
  anchor: "end"
@@ -1090,13 +1144,13 @@ function Mr(e) {
1090
1144
  plot: {
1091
1145
  x: o,
1092
1146
  y: f,
1093
- width: c,
1094
- height: v
1147
+ width: s,
1148
+ height: _
1095
1149
  },
1096
- blocks: u,
1150
+ blocks: l,
1097
1151
  background: t.transparentBackground ? null : n.background,
1098
1152
  color: n.color,
1099
- fontFamily: gr
1153
+ fontFamily: Or
1100
1154
  };
1101
1155
  }
1102
1156
  function Q(e) {
@@ -1105,7 +1159,7 @@ function Q(e) {
1105
1159
  function $(e) {
1106
1160
  return Q(e).replace(/"/g, "&quot;");
1107
1161
  }
1108
- function Nr(e, t) {
1162
+ function Kr(e, t) {
1109
1163
  return [
1110
1164
  `<text x="${e.x}" y="${e.y}" font-size="${e.fontSize}px"`,
1111
1165
  e.fontFamily ? ` font-family="${$(e.fontFamily)}"` : "",
@@ -1117,7 +1171,7 @@ function Nr(e, t) {
1117
1171
  "</text>"
1118
1172
  ].join("");
1119
1173
  }
1120
- function Pr(e, t, n) {
1174
+ function qr(e, t, n) {
1121
1175
  return [
1122
1176
  `<svg xmlns="http://www.w3.org/2000/svg" width="${e.width}" height="${e.height}"`,
1123
1177
  ` viewBox="0 0 ${e.width} ${e.height}" role="img" aria-label="${$(n.label)}"`,
@@ -1125,34 +1179,34 @@ function Pr(e, t, n) {
1125
1179
  `<title>${Q(n.label)}</title>`,
1126
1180
  `<desc>${Q(n.description)}</desc>`,
1127
1181
  e.background ? `<rect width="100%" height="100%" fill="${$(e.background)}"></rect>` : "",
1128
- ...e.blocks.map((t) => Nr(t, e)),
1182
+ ...e.blocks.map((t) => Kr(t, e)),
1129
1183
  `<g transform="translate(${e.plot.x},${e.plot.y})">${t}</g>`,
1130
1184
  "</svg>"
1131
1185
  ].join("");
1132
1186
  }
1133
1187
  //#endregion
1134
1188
  //#region src/render/public-render.ts
1135
- var Fr = 640, Ir = 400;
1136
- function Lr() {
1189
+ var Jr = 640, Yr = 400;
1190
+ function Xr() {
1137
1191
  return typeof document < "u" && typeof document.createElement == "function";
1138
1192
  }
1139
- async function Rr() {
1140
- return Lr() ? pr() : (await import("@blueprint-chart/lib/internal/node-backend")).createNodeBackend();
1193
+ async function Zr() {
1194
+ return Xr() ? Tr() : (await import("@blueprint-chart/lib/internal/node-backend")).createNodeBackend();
1141
1195
  }
1142
- async function zr(e, t = {}) {
1196
+ async function Qr(e, t = {}) {
1143
1197
  let n;
1144
1198
  try {
1145
- n = Me(x(e));
1199
+ n = Me(b(e));
1146
1200
  } catch (e) {
1147
- throw new ur(e instanceof Error ? e.message : String(e), { cause: e });
1201
+ throw new Sr(e instanceof Error ? e.message : String(e), { cause: e });
1148
1202
  }
1149
- let r = await Rr(), i = t.frame ?? !0, a = {
1203
+ let r = await Zr(), i = t.frame ?? !0, a = {
1150
1204
  sceneIndex: t.scene,
1151
- width: t.width ?? Fr,
1152
- height: t.height ?? Ir
1205
+ width: t.width ?? Jr,
1206
+ height: t.height ?? Yr
1153
1207
  };
1154
1208
  function o(e, t) {
1155
- let { background: n, color: r } = Or(t);
1209
+ let { background: n, color: r } = Vr(t);
1156
1210
  e.style.backgroundColor = n, e.style.setProperty("--bc-text-color", r);
1157
1211
  }
1158
1212
  function s(e, i) {
@@ -1163,7 +1217,7 @@ async function zr(e, t = {}) {
1163
1217
  });
1164
1218
  }
1165
1219
  function c(e) {
1166
- let c = e.width ?? a.width, l = e.height ?? a.height, u = Je(n, a.sceneIndex), d = t.theme ?? u.theme;
1220
+ let c = e.width ?? a.width, l = e.height ?? a.height, u = Xe(n, a.sceneIndex), d = t.theme ?? u.theme;
1167
1221
  if (!i) {
1168
1222
  let { container: e, cleanup: t } = r.createContainer(c, l);
1169
1223
  try {
@@ -1172,7 +1226,7 @@ async function zr(e, t = {}) {
1172
1226
  t();
1173
1227
  }
1174
1228
  }
1175
- let f = Mr({
1229
+ let f = Gr({
1176
1230
  width: c,
1177
1231
  height: l,
1178
1232
  frame: u.frame,
@@ -1180,8 +1234,8 @@ async function zr(e, t = {}) {
1180
1234
  }), { container: p, cleanup: m } = r.createContainer(f.plot.width, f.plot.height);
1181
1235
  try {
1182
1236
  o(p, d), s(p, !0);
1183
- let e = pt(u.chartType, u.frame, u.data);
1184
- return Pr(f, r.serializeSvg(p), e);
1237
+ let e = ht(u.chartType, u.frame, u.data);
1238
+ return qr(f, r.serializeSvg(p), e);
1185
1239
  } finally {
1186
1240
  m();
1187
1241
  }
@@ -1218,4 +1272,4 @@ async function zr(e, t = {}) {
1218
1272
  return l;
1219
1273
  }
1220
1274
  //#endregion
1221
- export { Et as ANNOTATION_KIND_KEYWORD, ye as Anchor, d as AnnotationKind, l as AnnotationLineStyle, ue as AxisDirection, Ne as BC_TRANSITION_NAME, $e as ChartOptionType, ur as ChartParseError, r as ChartType, Ze as CompassDirection, oe as CrosshairDirection, ce as CrosshairStyle, Fe as DEFAULT_BAR_GAP, de as DirectLabelMode, p as DslNodeType, v as FilterCondition, ae as FrameSizing, he as GridStyle, jt as Interpolation, a as LabelPosition, Se as LabelRotation, ee as LegendPosition, be as LineStyle, y as MAPPING_NONE, fr as MissingNodeRenderDepsError, Ct as NULL_VALUE, we as Orientation, h as ParseOperationCategory, dr as PngBrowserUnsupportedError, re as RangeAnchor, ft as ScaleType, ot as SceneTransition, te as SortDirection, De as SortMode, Te as StackMode, ke as StrokeStyle, pe as SymbolShape, t as SymbolShowOn, Be as SymbolStyle, st as TRANSFORM_TYPES, yt as TickPosition, at as TransformType, mt as ValueLabelPosition, Ge as adjustColorsForBackground, gt as applyTransformNodes, Ie as applyTransformNodesToChartData, et as applyTransformSteps, Me as astToDefinition, ie as buildChartOptions, Pr as buildFrameSvg, Mt as buildSrcdoc, Re as chartDataToTable, qt as checkCvdColors, E as classifyIntent, He as cleanNumericValue, ze as commitFadeOut, nn as compactSerialize, tn as compactSerializeDeep, Tt as convertAnnotations, ve as convertAreaFills, u as convertColorizes, c as convertHighlights, le as convertSeriesOverrides, qe as createCanvas, Ut as createCvdSvgFilter, _e as createFrame, Qe as dataEntriesToString, lt as detectColumnTypes, n as extractChartTypeOptions, Xe as extractSceneOverrides, Ue as fadeIn, Ve as featureJoin, Ye as getCachedChart, xe as getChart, g as getChartOptions, f as getChartTypeDefaults, Ht as getCvdFilterId, Pe as getOutputType, ht as getSceneTransition, ut as getTransitionDuration, nt as isDateValue, Ke as isNumberValue, Oe as isSeriesHidden, Dt as isTypeCompatible, S as listCharts, ct as listPalettes, zt as listThemes, Ee as numericColumns, x as parse, We as parseBpcData, me as parseData, ge as parseOperationMap, o as parseOperations, b as propertyMap, w as quoteDslString, Lt as recommendCharts, Ce as registerChart, zr as render, vt as renderBpc, it as renderChart, tt as renderHorizontalAxis, Le as renderLegend, St as renderVerticalAxis, je as resolveBackgroundColor, Ot as resolveBarGapPadding, _ as resolveChartTypeOptions, _t as resolvePalette, C as resolveScatterMapping, Je as resolveScene, fe as resolveSeriesColor, e as resolveSeriesInterpolation, lr as samples, Zt as serialize, Ae as serializeTableData, Ft as shapeOf, Gt as simulateCvdColor, rt as snapshotForFadeOut, bt as snapshotLiveAttrs, i as stripDigitGroupSpaces, se as toBool, xt as transformNodesToSteps, kt as transformValue, Pn as validateChart, wt as wcagContrastRatio, At as wcagLevel };
1275
+ export { l as ANNOTATION_KIND_KEYWORD, de as Anchor, T as AnnotationKind, r as AnnotationLineStyle, et as ArrowDirection, se as AxisDirection, ze as BC_TRANSITION_NAME, le as ChartOptionType, Sr as ChartParseError, x as ChartType, p as CompassDirection, _ as CrosshairDirection, oe as CrosshairStyle, s as DEFAULT_BAR_GAP, me as DirectLabelMode, Pt as DotStyle, a as DslNodeType, xe as FilterCondition, ee as FrameSizing, ye as GridStyle, Ce as Interpolation, h as LabelPosition, ie as LabelRotation, mt as LegendPosition, ne as LineStyle, Oe as MAPPING_NONE, wr as MissingNodeRenderDepsError, Et as NULL_VALUE, De as Orientation, Te as ParseOperationCategory, Cr as PngBrowserUnsupportedError, ke as RangeAnchor, pe as ScaleType, Pe as SceneTransition, t as SortDirection, He as SortMode, St as StackMode, ot as StrokeStyle, gt as SymbolShape, Ze as SymbolShowOn, Ne as SymbolStyle, ct as TRANSFORM_TYPES, lt as TickPosition, yt as TransformType, Re as ValueLabelPosition, Nt as adjustColorsForBackground, vt as applyTransformNodes, Le as applyTransformNodesToChartData, tt as applyTransformSteps, Me as astToDefinition, ae as buildChartOptions, qr as buildFrameSvg, Ft as buildSrcdoc, Be as chartDataToTable, Zt as checkCvdColors, Lt as classifyIntent, We as cleanNumericValue, it as commitFadeOut, cn as compactSerialize, sn as compactSerializeDeep, Ot as convertAnnotations, _e as convertAreaFills, u as convertColorizes, c as convertHighlights, ue as convertSeriesOverrides, Dt as createCanvas, qt as createCvdSvgFilter, ve as createFrame, w as dataEntriesToString, dt as detectColumnTypes, re as detectRangeColumn, n as extractChartTypeOptions, $e as extractSceneOverrides, Ye as fadeIn, _t as featureJoin, bt as getCachedChart, be as getChart, g as getChartOptions, f as getChartTypeDefaults, Kt as getCvdFilterId, Fe as getOutputType, ut as getSceneTransition, qe as getTransitionDuration, rt as isDateValue, Je as isNumberValue, Ue as isSeriesHidden, At as isTypeCompatible, C as listCharts, nt as listPalettes, Ut as listThemes, fe as numericColumns, b as parse, Ke as parseBpcData, S as parseData, he as parseOperationMap, o as parseOperations, y as propertyMap, E as quoteDslString, Vt as recommendCharts, Se as registerChart, Qr as render, xt as renderBpc, at as renderChart, Ge as renderHorizontalAxis, Ve as renderLegend, ft as renderVerticalAxis, Ie as resolveBackgroundColor, kt as resolveBarGapPadding, te as resolveChartTypeOptions, pt as resolveDotPlotMapping, Tt as resolvePalette, e as resolveScatterMapping, Xe as resolveScene, Ct as resolveSeriesColor, st as resolveSeriesInterpolation, xr as samples, nn as serialize, Ae as serializeTableData, zt as shapeOf, Yt as simulateCvdColor, je as snapshotForFadeOut, Qe as snapshotLiveAttrs, i as stripDigitGroupSpaces, ce as toBool, wt as transformNodesToSteps, Mt as transformValue, Wn as validateChart, jt as wcagContrastRatio, ge as wcagLevel };