@blueprint-chart/lib 2.9.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/charts/plugins/annotations/context.d.ts +5 -0
- package/dist/charts/plugins/annotations/shared.d.ts +7 -0
- package/dist/charts/types/dot-plot/annotations.d.ts +4 -0
- package/dist/charts/types/dot-plot/dot-plot.d.ts +4 -0
- package/dist/charts/types/dot-plot/issues.d.ts +11 -0
- package/dist/charts/types/dot-plot/mapping.d.ts +17 -0
- package/dist/charts/types/dot-plot/rows.d.ts +20 -0
- package/dist/charts/types/dot-plot/tooltip.d.ts +3 -0
- package/dist/charts/types/scatter/issues.d.ts +17 -0
- package/dist/charts/types/scatter/points.d.ts +1 -0
- package/dist/charts/types.d.ts +9 -1
- package/dist/embed.js +1 -1
- package/dist/enums.d.ts +14 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +374 -320
- package/dist/lib/lib.iife.js +25 -18
- package/dist/node-backend/index.js +2693 -2226
- package/dist/{render-bpc-BL73t_Ih.js → render-bpc-dodOcvDz.js} +2795 -2328
- package/dist/runtime/chart-css.d.ts +1 -1
- package/dist/{runtime-gzeMNwqx.js → runtime-D_vHKSyR.js} +1 -1
- package/dist/runtime.js +2 -2
- package/package.json +1 -1
- package/src/charts/chart.scss +3 -0
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
|
|
2
|
-
import { t as
|
|
3
|
-
import
|
|
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
|
|
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
|
|
35
|
+
function Lt(e) {
|
|
36
36
|
if (e === void 0 || e.trim() === "") return "none";
|
|
37
|
-
for (let t of
|
|
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
|
|
42
|
+
var O = (e, t, n) => ({
|
|
43
43
|
type: e,
|
|
44
44
|
fitness: t,
|
|
45
45
|
reason: n
|
|
46
|
-
}),
|
|
46
|
+
}), k = {
|
|
47
47
|
"1cat+1num": {
|
|
48
48
|
none: (e) => {
|
|
49
|
-
let t = [
|
|
50
|
-
return e <= 8 && (t.push(
|
|
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) =>
|
|
53
|
-
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
] : [
|
|
63
|
-
range: () => [
|
|
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: () => [
|
|
67
|
-
comparison: (e) =>
|
|
68
|
-
ranking: (e) =>
|
|
69
|
-
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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: () => [
|
|
81
|
-
range: () => [
|
|
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: () => [
|
|
85
|
-
relationship: (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: () => [
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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: () => [
|
|
95
|
-
ranking: () => [
|
|
96
|
-
"part-to-whole": () => [
|
|
97
|
-
"composition-over-time": () => [
|
|
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: () => [
|
|
101
|
-
trend: (e) =>
|
|
102
|
-
comparison: (e) =>
|
|
103
|
-
ranking: (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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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": () => [
|
|
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: () => [
|
|
111
|
+
other: { none: () => [O("bar-vertical", "good", "Default bar chart recommendation")] }
|
|
112
112
|
};
|
|
113
|
-
function
|
|
114
|
-
let r =
|
|
115
|
-
return i ? i(n) : [
|
|
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
|
|
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
|
|
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
|
|
144
|
-
return e.length === 0 ? [] :
|
|
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:
|
|
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
|
|
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
|
|
171
|
-
return
|
|
171
|
+
function Ut() {
|
|
172
|
+
return Ht;
|
|
172
173
|
}
|
|
173
174
|
//#endregion
|
|
174
175
|
//#region src/charts/colorblind.ts
|
|
175
|
-
var
|
|
176
|
+
var Wt = {
|
|
176
177
|
protanopia: "Protanopia (no red)",
|
|
177
178
|
deuteranopia: "Deuteranopia (no green)",
|
|
178
179
|
tritanopia: "Tritanopia (no blue)"
|
|
179
|
-
},
|
|
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
|
|
248
|
+
function Kt(e) {
|
|
248
249
|
return `bc-cvd-${e}`;
|
|
249
250
|
}
|
|
250
|
-
function
|
|
251
|
+
function qt(e) {
|
|
251
252
|
let t = "http://www.w3.org/2000/svg", n = document.createElementNS(t, "filter");
|
|
252
|
-
n.setAttribute("id",
|
|
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",
|
|
255
|
+
return r.setAttribute("type", "matrix"), r.setAttribute("values", Gt[e].join(" ")), n.appendChild(r), n;
|
|
255
256
|
}
|
|
256
|
-
function
|
|
257
|
+
function Jt(e) {
|
|
257
258
|
return e <= .04045 ? e / 12.92 : ((e + .055) / 1.055) ** 2.4;
|
|
258
259
|
}
|
|
259
|
-
function
|
|
260
|
+
function A(e) {
|
|
260
261
|
return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
|
|
261
262
|
}
|
|
262
|
-
function
|
|
263
|
-
let [n, r, i] = (
|
|
264
|
-
return
|
|
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
|
|
267
|
-
function
|
|
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) =>
|
|
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 =
|
|
278
|
-
a <
|
|
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:
|
|
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
|
|
296
|
+
return (e ?? []).flatMap((e) => e.split("\n").map((e) => `${t}// ${e.trim()}`));
|
|
299
297
|
}
|
|
300
298
|
function M(e, t) {
|
|
301
|
-
return
|
|
299
|
+
return t == null ? e : t.includes("\n") ? `${e} /* ${t} */` : `${e} // ${t}`;
|
|
302
300
|
}
|
|
303
|
-
function N(e) {
|
|
304
|
-
return
|
|
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 :
|
|
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 =
|
|
311
|
-
return [...
|
|
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
|
|
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" = ${
|
|
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 = [...
|
|
319
|
-
for (let r of e.entries) n.push(
|
|
320
|
-
return n.push(...
|
|
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 = [...
|
|
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(...
|
|
326
|
+
return r.push(...N(e, t)), r.join("\n");
|
|
326
327
|
}
|
|
327
328
|
function R(e, t) {
|
|
328
|
-
return [...
|
|
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 = [...
|
|
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(...
|
|
334
|
+
return n.push(...N(e, t)), n.join("\n");
|
|
334
335
|
}
|
|
335
336
|
function B(e, t) {
|
|
336
|
-
let n = e.kind ??
|
|
337
|
-
if (n ===
|
|
338
|
-
let n = [...
|
|
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(...
|
|
341
|
+
return n.push(...N(e, t)), n.join("\n");
|
|
341
342
|
}
|
|
342
|
-
if (n ===
|
|
343
|
-
let n = [...
|
|
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(...
|
|
346
|
+
return n.push(...N(e, t)), n.join("\n");
|
|
346
347
|
}
|
|
347
|
-
let r = "target" in e ? e.target : "", i = [...
|
|
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(...
|
|
350
|
+
return i.push(...N(e, t)), i.join("\n");
|
|
350
351
|
}
|
|
351
352
|
function V(e, t) {
|
|
352
|
-
let n = [...
|
|
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(...
|
|
355
|
+
return n.push(...N(e, t)), n.join("\n");
|
|
355
356
|
}
|
|
356
|
-
function
|
|
357
|
-
let n = e.name == null ? `${t}scene {` : `${t}scene ${
|
|
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(...
|
|
367
|
+
return r.push(...N(e, t)), r.join("\n");
|
|
367
368
|
}
|
|
368
369
|
function H(e, t) {
|
|
369
|
-
let n = [...
|
|
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(...
|
|
372
|
+
return n.push(...N(e, t)), n.join("\n");
|
|
372
373
|
}
|
|
373
|
-
function
|
|
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
|
|
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(
|
|
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(...
|
|
389
|
+
return t.push(...j(e.trailingComments, " "), "}"), t.join("\n");
|
|
389
390
|
}
|
|
390
|
-
function
|
|
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
|
|
398
|
-
let i = [...
|
|
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(...
|
|
401
|
+
return i.push(...N(e, t)), i.join("\n");
|
|
401
402
|
}
|
|
402
|
-
function
|
|
403
|
-
let i = e.properties.find((e) => e.key === "type"), a = i ? String(i.value) : n, o = e.name == null ? `${t}scene {` : `${t}scene ${
|
|
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(
|
|
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(...
|
|
419
|
+
return s.push(...N(e, t)), s.join("\n");
|
|
419
420
|
}
|
|
420
|
-
function
|
|
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 =
|
|
429
|
-
for (let n of e.series) t.push(
|
|
430
|
-
for (let n of e.scenes) t.push(
|
|
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(...
|
|
433
|
+
return t.push(...j(e.trailingComments, " "), "}"), t.join("\n");
|
|
433
434
|
}
|
|
434
|
-
function
|
|
435
|
+
function cn(e) {
|
|
435
436
|
let t = [`chart ${e.chartType} {`];
|
|
436
|
-
for (let n of e.properties)
|
|
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(
|
|
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(...
|
|
446
|
+
return t.push(...j(e.trailingComments, " "), "}"), t.join("\n");
|
|
446
447
|
}
|
|
447
448
|
//#endregion
|
|
448
449
|
//#region src/dsl/suggest.ts
|
|
449
|
-
function
|
|
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 =
|
|
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
|
|
473
|
+
var un = [
|
|
473
474
|
"x",
|
|
474
475
|
"y",
|
|
475
476
|
"size",
|
|
476
477
|
"group"
|
|
477
|
-
],
|
|
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
|
-
},
|
|
484
|
+
}, fn = {
|
|
484
485
|
x: "horizontal",
|
|
485
486
|
y: "vertical"
|
|
486
487
|
};
|
|
487
|
-
function
|
|
488
|
-
return [...
|
|
489
|
-
}
|
|
490
|
-
function
|
|
491
|
-
let
|
|
492
|
-
return
|
|
493
|
-
let
|
|
494
|
-
return !
|
|
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:
|
|
497
|
+
severity: r,
|
|
497
498
|
key: e,
|
|
498
|
-
message: `${e} names "${
|
|
499
|
-
suggestion: W(
|
|
499
|
+
message: `${e} names "${n}", which is not a column.`,
|
|
500
|
+
suggestion: W(n, i)
|
|
500
501
|
}];
|
|
501
502
|
});
|
|
502
503
|
}
|
|
503
|
-
function
|
|
504
|
+
function hn(e, t) {
|
|
504
505
|
if (!e.length) return [];
|
|
505
|
-
let
|
|
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: ${
|
|
510
|
+
message: `${`${e.length} ${e.length === 1 ? "row" : "rows"}`} not drawn: ${n.join(", ")}${r > 0 ? `, and ${r} more` : ""}.`
|
|
510
511
|
}];
|
|
511
512
|
}
|
|
512
|
-
function
|
|
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
|
|
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] !==
|
|
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: `${`${
|
|
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
|
|
530
|
-
let
|
|
531
|
-
if (!
|
|
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
|
|
538
|
-
if (
|
|
539
|
-
let { points:
|
|
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
|
|
542
|
-
...
|
|
543
|
-
...
|
|
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
|
|
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
|
-
]),
|
|
570
|
-
["theme",
|
|
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
|
-
]),
|
|
625
|
+
]), Dn = /* @__PURE__ */ new Set([
|
|
584
626
|
"lineSymbolSize",
|
|
585
627
|
"circleSize",
|
|
586
628
|
"fixedHeight",
|
|
587
629
|
"fixedWidth",
|
|
588
630
|
"maxWidth"
|
|
589
|
-
]),
|
|
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
|
-
]),
|
|
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
|
-
]),
|
|
664
|
+
]), An = /* @__PURE__ */ new Map([
|
|
623
665
|
["symbolShape", "lineSymbolShape"],
|
|
624
666
|
["symbolShowOn", "lineSymbolShowOn"],
|
|
625
667
|
["symbolStyle", "lineSymbolStyle"]
|
|
626
|
-
]),
|
|
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
|
-
]),
|
|
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
|
|
689
|
+
function Nn(e, t) {
|
|
648
690
|
return e.find((e) => e.key === t);
|
|
649
691
|
}
|
|
650
|
-
function
|
|
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
|
|
659
|
-
if (!
|
|
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
|
|
709
|
+
function Fn(e, t, n, r) {
|
|
668
710
|
let i = t.value, a = String(i).toLowerCase();
|
|
669
|
-
if (e.type ===
|
|
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
|
-
|
|
724
|
+
q(e.key, i, t, n, r);
|
|
683
725
|
}
|
|
684
726
|
}
|
|
685
|
-
function
|
|
686
|
-
let i = g(e), a = /* @__PURE__ */ new Set([...i.map((e) => e.key), ...
|
|
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
|
-
|
|
690
|
-
let s =
|
|
691
|
-
if (s && String(o.value) !== "" && !s.includes(String(o.value)) &&
|
|
692
|
-
let c =
|
|
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
|
-
|
|
744
|
+
Fn(c, o, t, r);
|
|
703
745
|
}
|
|
704
746
|
}
|
|
705
|
-
function
|
|
706
|
-
return e ===
|
|
747
|
+
function Ln(e) {
|
|
748
|
+
return e === T.Range ? jn : e === T.Free ? Mn : On;
|
|
707
749
|
}
|
|
708
|
-
function
|
|
709
|
-
return
|
|
750
|
+
function Rn(e) {
|
|
751
|
+
return l[e];
|
|
710
752
|
}
|
|
711
|
-
function
|
|
753
|
+
function zn(e, t, n) {
|
|
712
754
|
e.forEach((e, r) => {
|
|
713
|
-
let i = e.kind ??
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 (!
|
|
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,
|
|
786
|
+
suggestion: W(a.key, kn)
|
|
745
787
|
});
|
|
746
788
|
continue;
|
|
747
789
|
}
|
|
748
|
-
let o =
|
|
749
|
-
o?.length && !o.includes(String(a.value)) &&
|
|
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
|
|
795
|
+
function Vn(e, t, n) {
|
|
754
796
|
e.forEach((e, r) => {
|
|
755
|
-
|
|
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: ${[...
|
|
759
|
-
suggestion: W(e.transformType,
|
|
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
|
|
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
|
|
776
|
-
let n =
|
|
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
|
|
809
|
-
let t = [], n = [],
|
|
810
|
-
|
|
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,
|
|
815
|
-
}),
|
|
816
|
-
let
|
|
817
|
-
return !
|
|
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 &&
|
|
822
|
-
|
|
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
|
|
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
|
|
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
|
|
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 && !
|
|
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,
|
|
862
|
-
}) : (
|
|
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
|
|
908
|
+
function Jn(e, t, n, r, i, a) {
|
|
865
909
|
if (!e || e.entries.length === 0) return;
|
|
866
|
-
let o =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
914
|
-
let n =
|
|
966
|
+
function J(e, t) {
|
|
967
|
+
let n = b(t);
|
|
915
968
|
return {
|
|
916
969
|
id: e,
|
|
917
|
-
title:
|
|
918
|
-
description:
|
|
970
|
+
title: vr(n, "title"),
|
|
971
|
+
description: vr(n, "description"),
|
|
919
972
|
chartType: n.chartType,
|
|
920
|
-
tsvData:
|
|
921
|
-
serializedData:
|
|
973
|
+
tsvData: yr(n),
|
|
974
|
+
serializedData: br(n),
|
|
922
975
|
dsl: t
|
|
923
976
|
};
|
|
924
977
|
}
|
|
925
|
-
var
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
1051
|
+
var Er = {
|
|
998
1052
|
background: "#ffffff",
|
|
999
1053
|
color: "#333333"
|
|
1000
|
-
},
|
|
1054
|
+
}, Dr = {
|
|
1001
1055
|
background: "#1c1c1c",
|
|
1002
1056
|
color: "rgba(255, 255, 255, 0.9)"
|
|
1003
|
-
},
|
|
1004
|
-
function
|
|
1005
|
-
return e === "dark" ? { ...
|
|
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
|
|
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
|
|
1016
|
-
let e =
|
|
1069
|
+
function Ur() {
|
|
1070
|
+
let e = Hr();
|
|
1017
1071
|
return (t, n, r) => {
|
|
1018
|
-
let i = t.length * n *
|
|
1019
|
-
return e ? (e.font = `${r ? "bold " : ""}${n}px ${
|
|
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 *
|
|
1101
|
+
}), r += n.fontSize * jr;
|
|
1048
1102
|
return r;
|
|
1049
1103
|
}
|
|
1050
|
-
function
|
|
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
|
|
1055
|
-
let t = e.frame ?? {}, n =
|
|
1056
|
-
t.title && (
|
|
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:
|
|
1059
|
-
fontSize:
|
|
1112
|
+
top: u,
|
|
1113
|
+
fontSize: kr,
|
|
1060
1114
|
fontWeight: "bold",
|
|
1061
1115
|
fill: n.color
|
|
1062
|
-
})), t.description && (
|
|
1116
|
+
})), t.description && (u = Z(l, X(t.description, s, Ar, !1, c), {
|
|
1063
1117
|
x: o,
|
|
1064
|
-
top: t.title ?
|
|
1065
|
-
fontSize:
|
|
1118
|
+
top: t.title ? u + Mr : u,
|
|
1119
|
+
fontSize: Ar,
|
|
1066
1120
|
fill: n.color
|
|
1067
1121
|
}));
|
|
1068
|
-
let f =
|
|
1069
|
-
return
|
|
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:
|
|
1072
|
-
fontSize:
|
|
1125
|
+
top: v,
|
|
1126
|
+
fontSize: Y,
|
|
1073
1127
|
fontStyle: "italic",
|
|
1074
1128
|
fill: n.color
|
|
1075
|
-
}) +
|
|
1129
|
+
}) + Nr, Z(l, g, {
|
|
1076
1130
|
x: o,
|
|
1077
|
-
top:
|
|
1078
|
-
fontSize:
|
|
1131
|
+
top: v,
|
|
1132
|
+
fontSize: Y,
|
|
1079
1133
|
fill: n.color
|
|
1080
|
-
}), Z(
|
|
1134
|
+
}), Z(l, [Lr], {
|
|
1081
1135
|
x: e.width - i,
|
|
1082
|
-
top:
|
|
1083
|
-
fontSize:
|
|
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:
|
|
1094
|
-
height:
|
|
1147
|
+
width: s,
|
|
1148
|
+
height: _
|
|
1095
1149
|
},
|
|
1096
|
-
blocks:
|
|
1150
|
+
blocks: l,
|
|
1097
1151
|
background: t.transparentBackground ? null : n.background,
|
|
1098
1152
|
color: n.color,
|
|
1099
|
-
fontFamily:
|
|
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, """);
|
|
1107
1161
|
}
|
|
1108
|
-
function
|
|
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
|
|
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) =>
|
|
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
|
|
1136
|
-
function
|
|
1189
|
+
var Jr = 640, Yr = 400;
|
|
1190
|
+
function Xr() {
|
|
1137
1191
|
return typeof document < "u" && typeof document.createElement == "function";
|
|
1138
1192
|
}
|
|
1139
|
-
async function
|
|
1140
|
-
return
|
|
1193
|
+
async function Zr() {
|
|
1194
|
+
return Xr() ? Tr() : (await import("@blueprint-chart/lib/internal/node-backend")).createNodeBackend();
|
|
1141
1195
|
}
|
|
1142
|
-
async function
|
|
1196
|
+
async function Qr(e, t = {}) {
|
|
1143
1197
|
let n;
|
|
1144
1198
|
try {
|
|
1145
|
-
n = Me(
|
|
1199
|
+
n = Me(b(e));
|
|
1146
1200
|
} catch (e) {
|
|
1147
|
-
throw new
|
|
1201
|
+
throw new Sr(e instanceof Error ? e.message : String(e), { cause: e });
|
|
1148
1202
|
}
|
|
1149
|
-
let r = await
|
|
1203
|
+
let r = await Zr(), i = t.frame ?? !0, a = {
|
|
1150
1204
|
sceneIndex: t.scene,
|
|
1151
|
-
width: t.width ??
|
|
1152
|
-
height: t.height ??
|
|
1205
|
+
width: t.width ?? Jr,
|
|
1206
|
+
height: t.height ?? Yr
|
|
1153
1207
|
};
|
|
1154
1208
|
function o(e, t) {
|
|
1155
|
-
let { background: n, color: r } =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
1184
|
-
return
|
|
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 {
|
|
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 };
|