@carto/ps-react-ui 4.8.0 → 4.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/{change-column-Cidl_M-4.js → change-column-B4IT0rh6.js} +2 -2
  2. package/dist/{change-column-Cidl_M-4.js.map → change-column-B4IT0rh6.js.map} +1 -1
  3. package/dist/components.js +4 -3
  4. package/dist/components.js.map +1 -1
  5. package/dist/{data-zoom-layout-BH0LPwSy.js → data-zoom-layout-0QSptXG_.js} +2 -2
  6. package/dist/{data-zoom-layout-BH0LPwSy.js.map → data-zoom-layout-0QSptXG_.js.map} +1 -1
  7. package/dist/{download-config-DNLkypdN.js → download-config-CzmjOT2T.js} +2 -2
  8. package/dist/{download-config-DNLkypdN.js.map → download-config-CzmjOT2T.js.map} +1 -1
  9. package/dist/{lasso-tool-BYbxrJ-7.js → lasso-tool-CDFj4zKY.js} +2 -1
  10. package/dist/lasso-tool-CDFj4zKY.js.map +1 -0
  11. package/dist/range-l4fNHLEg.js +213 -0
  12. package/dist/range-l4fNHLEg.js.map +1 -0
  13. package/dist/resolve-theme-color-BdojIw0K.js +47 -0
  14. package/dist/resolve-theme-color-BdojIw0K.js.map +1 -0
  15. package/dist/{spread-CTuIXZSM.js → spread-Y9R1f5dm.js} +2 -2
  16. package/dist/{spread-CTuIXZSM.js.map → spread-Y9R1f5dm.js.map} +1 -1
  17. package/dist/table-CQCAnDLb.js +388 -0
  18. package/dist/table-CQCAnDLb.js.map +1 -0
  19. package/dist/types/components/lasso-tool/styles.d.ts +1 -0
  20. package/dist/types/components/measurement-tools/styles.d.ts +1 -0
  21. package/dist/types/widgets/actions/brush-toggle/style.d.ts +1 -1
  22. package/dist/types/widgets/actions/shared/styles.d.ts +1 -1
  23. package/dist/types/widgets/actions/zoom-toggle/style.d.ts +1 -1
  24. package/dist/types/widgets/echart/types.d.ts +1 -1
  25. package/dist/types/widgets/toolbar-actions/styles.d.ts +1 -1
  26. package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +1 -1
  27. package/dist/types/widgets-v2/actions/change-column/style.d.ts +1 -1
  28. package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +1 -1
  29. package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +1 -1
  30. package/dist/types/widgets-v2/actions/relative-data/style.d.ts +1 -1
  31. package/dist/types/widgets-v2/actions/searcher/style.d.ts +1 -1
  32. package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +1 -1
  33. package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +1 -1
  34. package/dist/types/widgets-v2/bar/types.d.ts +8 -3
  35. package/dist/types/widgets-v2/category/types.d.ts +8 -4
  36. package/dist/types/widgets-v2/formula/types.d.ts +10 -7
  37. package/dist/types/widgets-v2/histogram/types.d.ts +7 -3
  38. package/dist/types/widgets-v2/index.d.ts +1 -0
  39. package/dist/types/widgets-v2/pie/types.d.ts +10 -3
  40. package/dist/types/widgets-v2/range/range-ui.d.ts +12 -4
  41. package/dist/types/widgets-v2/range/range.d.ts +13 -8
  42. package/dist/types/widgets-v2/scatterplot/types.d.ts +7 -3
  43. package/dist/types/widgets-v2/table/style.d.ts +0 -4
  44. package/dist/types/widgets-v2/table/table-ui.d.ts +7 -1
  45. package/dist/types/widgets-v2/table/table.d.ts +1 -1
  46. package/dist/types/widgets-v2/table/types.d.ts +13 -2
  47. package/dist/types/widgets-v2/timeseries/types.d.ts +7 -3
  48. package/dist/types/widgets-v2/types.d.ts +25 -0
  49. package/dist/types/widgets-v2/utils/index.d.ts +1 -0
  50. package/dist/types/widgets-v2/utils/resolve-theme-color.d.ts +18 -0
  51. package/dist/types/widgets-v2/utils/resolve-theme-color.test.d.ts +1 -0
  52. package/dist/types/widgets-v2/wrapper/style.d.ts +1 -2
  53. package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +6 -1
  54. package/dist/widgets/actions.js +1 -1
  55. package/dist/widgets/bar.js +1 -1
  56. package/dist/widgets/category.js +1 -1
  57. package/dist/widgets/formula.js +1 -1
  58. package/dist/widgets/histogram.js +1 -1
  59. package/dist/widgets/markdown.js +1 -1
  60. package/dist/widgets/pie.js +1 -1
  61. package/dist/widgets/scatterplot.js +1 -1
  62. package/dist/widgets/spread.js +1 -1
  63. package/dist/widgets/table.js +1 -1
  64. package/dist/widgets/timeseries.js +1 -1
  65. package/dist/widgets/utils.js +1 -1
  66. package/dist/widgets/wrapper.js +1 -1
  67. package/dist/widgets-v2/actions.js +1 -1
  68. package/dist/widgets-v2/bar.js +59 -56
  69. package/dist/widgets-v2/bar.js.map +1 -1
  70. package/dist/widgets-v2/category.js +1 -1
  71. package/dist/widgets-v2/formula.js +1 -1
  72. package/dist/widgets-v2/histogram.js +66 -63
  73. package/dist/widgets-v2/histogram.js.map +1 -1
  74. package/dist/widgets-v2/markdown.js +1 -1
  75. package/dist/widgets-v2/pie.js +101 -95
  76. package/dist/widgets-v2/pie.js.map +1 -1
  77. package/dist/widgets-v2/range.js +1 -1
  78. package/dist/widgets-v2/scatterplot.js +108 -102
  79. package/dist/widgets-v2/scatterplot.js.map +1 -1
  80. package/dist/widgets-v2/spread.js +2 -2
  81. package/dist/widgets-v2/table.js +3 -3
  82. package/dist/widgets-v2/timeseries.js +86 -80
  83. package/dist/widgets-v2/timeseries.js.map +1 -1
  84. package/dist/widgets-v2/utils.js +4 -3
  85. package/dist/widgets-v2.js +229 -229
  86. package/dist/widgets-v2.js.map +1 -1
  87. package/package.json +5 -3
  88. package/src/components/lasso-tool/styles.ts +1 -0
  89. package/src/components/measurement-tools/styles.ts +1 -0
  90. package/src/widgets/echart/types.ts +1 -1
  91. package/src/widgets-v2/bar/options.test.ts +19 -2
  92. package/src/widgets-v2/bar/options.ts +9 -3
  93. package/src/widgets-v2/bar/types.ts +8 -3
  94. package/src/widgets-v2/category/types.ts +9 -4
  95. package/src/widgets-v2/formula/types.ts +11 -7
  96. package/src/widgets-v2/histogram/options.test.ts +16 -2
  97. package/src/widgets-v2/histogram/options.ts +5 -4
  98. package/src/widgets-v2/histogram/types.ts +7 -3
  99. package/src/widgets-v2/index.ts +3 -0
  100. package/src/widgets-v2/pie/options.test.ts +20 -4
  101. package/src/widgets-v2/pie/options.ts +21 -17
  102. package/src/widgets-v2/pie/types.ts +10 -3
  103. package/src/widgets-v2/range/range-ui.test.tsx +8 -2
  104. package/src/widgets-v2/range/range-ui.tsx +81 -14
  105. package/src/widgets-v2/range/range.tsx +14 -8
  106. package/src/widgets-v2/scatterplot/options.test.ts +15 -3
  107. package/src/widgets-v2/scatterplot/options.ts +15 -11
  108. package/src/widgets-v2/scatterplot/types.ts +7 -3
  109. package/src/widgets-v2/table/style.ts +2 -5
  110. package/src/widgets-v2/table/table-ui.tsx +40 -7
  111. package/src/widgets-v2/table/table.tsx +6 -1
  112. package/src/widgets-v2/table/types.ts +13 -2
  113. package/src/widgets-v2/timeseries/options.test.ts +17 -2
  114. package/src/widgets-v2/timeseries/options.ts +10 -3
  115. package/src/widgets-v2/timeseries/types.ts +7 -3
  116. package/src/widgets-v2/types.ts +25 -0
  117. package/src/widgets-v2/utils/index.ts +1 -0
  118. package/src/widgets-v2/utils/resolve-theme-color.test.ts +43 -0
  119. package/src/widgets-v2/utils/resolve-theme-color.ts +34 -0
  120. package/src/widgets-v2/wrapper/style.ts +1 -2
  121. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +30 -0
  122. package/src/widgets-v2/wrapper/widget-wrapper.tsx +11 -1
  123. package/dist/lasso-tool-BYbxrJ-7.js.map +0 -1
  124. package/dist/merge-options-DCkkHZIf.js +0 -34
  125. package/dist/merge-options-DCkkHZIf.js.map +0 -1
  126. package/dist/range-DsqTjSpg.js +0 -186
  127. package/dist/range-DsqTjSpg.js.map +0 -1
  128. package/dist/table-HIpXuq4G.js +0 -390
  129. package/dist/table-HIpXuq4G.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import * as w from "echarts";
2
- import { g as L, d as N, h as j, c as T, f as I, n as A } from "../option-builders-F-c9ELi1.js";
3
- import { jsx as k } from "react/jsx-runtime";
2
+ import { g as L, d as N, h as j, c as T, f as C, n as A } from "../option-builders-F-c9ELi1.js";
3
+ import { jsx as I } from "react/jsx-runtime";
4
4
  import { c as O } from "react/compiler-runtime";
5
5
  import { Box as P, Skeleton as $ } from "@mui/material";
6
6
  import "../widget-store-Bw5zRUGg.js";
@@ -8,13 +8,13 @@ import "zustand/shallow";
8
8
  import "@mui/icons-material";
9
9
  import "react";
10
10
  import "html2canvas";
11
- import "../lasso-tool-BYbxrJ-7.js";
11
+ import "../lasso-tool-CDFj4zKY.js";
12
12
  import "../cjs-D4KH3azB.js";
13
13
  import "@dnd-kit/core";
14
14
  import "@dnd-kit/sortable";
15
15
  import "@dnd-kit/utilities";
16
16
  import "react-dom";
17
- import { m as V } from "../merge-options-DCkkHZIf.js";
17
+ import { m as V, r as D } from "../resolve-theme-color-BdojIw0K.js";
18
18
  import "@mui/icons-material/ZoomIn";
19
19
  import "../widget-context-DTGO0Yta.js";
20
20
  import "zustand";
@@ -22,11 +22,11 @@ import "zustand/vanilla";
22
22
  import "zustand/middleware";
23
23
  import "zustand/react/shallow";
24
24
  import "@mui/icons-material/FileDownload";
25
- import { a as D } from "../exports-Cx-f6m6U.js";
25
+ import { a as M } from "../exports-Cx-f6m6U.js";
26
26
  import "@mui/icons-material/ImageOutlined";
27
- import { b as M } from "../png-item-CS4z1iSH.js";
28
- const z = ["58%", "74%"];
29
- function B({
27
+ import { b as z } from "../png-item-CS4z1iSH.js";
28
+ const B = ["58%", "74%"];
29
+ function _({
30
30
  theme: e,
31
31
  formatter: r,
32
32
  labelFormatter: t
@@ -63,7 +63,7 @@ function B({
63
63
  fontFamily: e.typography.caption.fontFamily
64
64
  },
65
65
  position: L(e),
66
- formatter: F(r, t)
66
+ formatter: k(r, t)
67
67
  },
68
68
  // V1 used `qualitative.bold` only (no `secondary.main` prefix) because
69
69
  // pie slices are categorical — each slice deserves a distinct palette
@@ -103,59 +103,59 @@ function B({
103
103
  }]
104
104
  };
105
105
  }
106
- function be(e) {
106
+ function ve(e) {
107
107
  const {
108
108
  theme: r,
109
109
  formatter: t,
110
- labelFormatter: a,
110
+ labelFormatter: n,
111
111
  optionsOverride: o,
112
- seriesNames: s
113
- } = e, l = e.radius ?? z, u = e.selection, d = u && u.length > 0 ? new Set(u) : null;
114
- return (c, p, b) => {
115
- if (c == null) {
116
- const v = B({
112
+ series: s
113
+ } = e, c = e.radius ?? B, d = e.selection, m = d && d.length > 0 ? new Set(d) : null;
114
+ return (u, p, b) => {
115
+ if (u == null) {
116
+ const v = _({
117
117
  theme: r,
118
118
  formatter: t,
119
- labelFormatter: a
119
+ labelFormatter: n
120
120
  });
121
121
  return o ? V(v, o) : v;
122
122
  }
123
123
  const g = Array.isArray(p) ? p : [];
124
124
  return g.length === 0 ? {
125
- ...c,
125
+ ...u,
126
126
  dataset: [],
127
127
  series: []
128
- } : g.length > 1 ? W(c, g, r, s, b, d) : _(c, g, l, s, b, d);
128
+ } : g.length > 1 ? E(u, g, r, s, b, m) : W(u, g, c, s, b, m);
129
129
  };
130
130
  }
131
- function _(e, r, t, a, o, s) {
132
- const l = Array.isArray(e.series) ? e.series : [], u = l[0] ?? {}, d = typeof e.tooltip == "object" && !Array.isArray(e.tooltip) ? e.tooltip : {}, c = typeof e.legend == "object" && !Array.isArray(e.legend) ? e.legend : {}, p = o?.formatter, b = o?.labelFormatter, g = Array.isArray(e.color) ? e.color : [], v = (n) => (g.length > 0 ? g[n.dataIndex % g.length] : void 0) ?? n.color, S = (n) => {
133
- const m = v(n);
134
- if (!s) return m;
135
- const f = n.value?.name ?? n.name;
136
- return f != null && s.has(f) ? m : w.color.modifyAlpha(m, 0.15);
137
- }, i = (n) => {
131
+ function W(e, r, t, n, o, s) {
132
+ const c = Array.isArray(e.series) ? e.series : [], d = c[0] ?? {}, m = typeof e.tooltip == "object" && !Array.isArray(e.tooltip) ? e.tooltip : {}, u = typeof e.legend == "object" && !Array.isArray(e.legend) ? e.legend : {}, p = o?.formatter, b = o?.labelFormatter, g = Array.isArray(e.color) ? e.color : [], v = (a) => (g.length > 0 ? g[a.dataIndex % g.length] : void 0) ?? a.color, S = (a) => {
133
+ const l = v(a);
134
+ if (!s) return l;
135
+ const f = a.value?.name ?? a.name;
136
+ return f != null && s.has(f) ? l : w.color.modifyAlpha(l, 0.15);
137
+ }, i = (a) => {
138
138
  const {
139
- name: m
140
- } = n, y = n.encode?.value?.[0];
139
+ name: l
140
+ } = a, y = a.encode?.value?.[0];
141
141
  if (y === void 0) return "";
142
- const f = Object.values(n.data ?? {}).at(y), h = typeof f == "number" ? p ? p(f) : String(f) : typeof f == "string" ? f : "", x = String(b ? b(m ?? "") : m ?? "");
142
+ const f = Object.values(a.data ?? {}).at(y), h = typeof f == "number" ? p ? p(f) : String(f) : typeof f == "string" ? f : "", x = String(b ? b(l ?? "") : l ?? "");
143
143
  return `{c|${h}}
144
144
 
145
145
  {b|${x}}`;
146
146
  };
147
147
  return {
148
148
  ...e,
149
- dataset: r.map((n) => ({
150
- source: n
149
+ dataset: r.map((a) => ({
150
+ source: a
151
151
  })),
152
- series: r.map((n, m) => {
153
- const y = l[m] ?? u, f = typeof y == "object" ? y : {}, h = f.label ?? {}, x = f.itemStyle ?? {};
152
+ series: r.map((a, l) => {
153
+ const y = c[l] ?? d, f = typeof y == "object" ? y : {}, h = f.label ?? {}, x = f.itemStyle ?? {};
154
154
  return {
155
155
  ...f,
156
156
  type: "pie",
157
- datasetIndex: m,
158
- name: a?.[m] ?? `Series ${m + 1}`,
157
+ datasetIndex: l,
158
+ name: n?.[l]?.name ?? `Series ${l + 1}`,
159
159
  radius: [...t],
160
160
  // Lift the donut up so the bottom-anchored legend has the
161
161
  // vertical real estate to wrap to multiple rows for long
@@ -180,21 +180,21 @@ function _(e, r, t, a, o, s) {
180
180
  // Legend always shows for pie (mirrors v1) — slice names drive the
181
181
  // entries, so even a single donut benefits from a category list.
182
182
  legend: {
183
- ...c,
183
+ ...u,
184
184
  show: !0
185
185
  },
186
186
  tooltip: {
187
- ...d,
188
- formatter: F(p, b)
187
+ ...m,
188
+ formatter: k(p, b)
189
189
  }
190
190
  };
191
191
  }
192
- function W(e, r, t, a, o, s) {
193
- const l = typeof e.tooltip == "object" && !Array.isArray(e.tooltip) ? e.tooltip : {}, u = typeof e.legend == "object" && !Array.isArray(e.legend) ? e.legend : {}, d = typeof e.grid == "object" && !Array.isArray(e.grid) ? e.grid : {}, c = o?.formatter, p = o?.labelFormatter, {
192
+ function E(e, r, t, n, o, s) {
193
+ const c = typeof e.tooltip == "object" && !Array.isArray(e.tooltip) ? e.tooltip : {}, d = typeof e.legend == "object" && !Array.isArray(e.legend) ? e.legend : {}, m = typeof e.grid == "object" && !Array.isArray(e.grid) ? e.grid : {}, u = o?.formatter, p = o?.labelFormatter, {
194
194
  niceMinVal: b,
195
195
  niceMaxVal: g
196
- } = H(r), v = Array.isArray(e.color) ? e.color : [], S = (i) => {
197
- const n = i.seriesIndex ?? 0, y = (v.length > 0 ? v[n % v.length] : void 0) ?? i.color;
196
+ } = R(r), v = Array.isArray(e.color) ? e.color : [], S = (i) => {
197
+ const a = i.seriesIndex ?? 0, y = (v.length > 0 ? v[a % v.length] : void 0) ?? i.color;
198
198
  if (!s) return y;
199
199
  const h = i.value?.name ?? i.name;
200
200
  return h != null && s.has(h) ? y : w.color.modifyAlpha(y, 0.15);
@@ -205,7 +205,7 @@ function W(e, r, t, a, o, s) {
205
205
  source: i
206
206
  })),
207
207
  grid: {
208
- ...d,
208
+ ...m,
209
209
  ...T(!0, t),
210
210
  right: parseInt(t.spacing(4)),
211
211
  containLabel: !0
@@ -213,19 +213,25 @@ function W(e, r, t, a, o, s) {
213
213
  // Drop pie-specific structural keys that shouldn't render in the
214
214
  // bar fallback. ECharts ignores undefined keys, so this is a clean
215
215
  // override.
216
- series: r.map((i, n) => ({
217
- datasetIndex: n,
218
- type: "bar",
219
- name: a?.[n] ?? `Series ${n + 1}`,
220
- barMaxWidth: 100,
221
- emphasis: {
222
- focus: "series"
223
- },
224
- ...j(c, "x"),
225
- itemStyle: {
226
- color: S
227
- }
228
- })),
216
+ series: r.map((i, a) => {
217
+ const l = D(t, n?.[a]?.color);
218
+ return {
219
+ datasetIndex: a,
220
+ type: "bar",
221
+ name: n?.[a]?.name ?? `Series ${a + 1}`,
222
+ barMaxWidth: 100,
223
+ emphasis: {
224
+ focus: "series"
225
+ },
226
+ ...j(u, "x"),
227
+ itemStyle: {
228
+ color: S
229
+ },
230
+ ...l ? {
231
+ color: l
232
+ } : {}
233
+ };
234
+ }),
229
235
  xAxis: {
230
236
  type: "value",
231
237
  // Closures over the pre-computed nice bounds — ECharts calls them
@@ -258,7 +264,7 @@ function W(e, r, t, a, o, s) {
258
264
  margin: parseInt(t.spacing(1)),
259
265
  showMaxLabel: !0,
260
266
  showMinLabel: !0,
261
- formatter: (i) => i !== g && i !== b || i === 0 ? "" : c ? c(i) : String(i)
267
+ formatter: (i) => i !== g && i !== b || i === 0 ? "" : u ? u(i) : String(i)
262
268
  }
263
269
  },
264
270
  yAxis: {
@@ -277,49 +283,49 @@ function W(e, r, t, a, o, s) {
277
283
  }
278
284
  },
279
285
  legend: {
280
- ...u,
286
+ ...d,
281
287
  show: !0
282
288
  },
283
289
  tooltip: {
284
- ...l,
290
+ ...c,
285
291
  trigger: "axis",
286
- formatter: E(c, p)
292
+ formatter: H(u, p)
287
293
  }
288
294
  };
289
295
  }
290
- function E(e, r) {
291
- return I((t) => {
292
- const a = t.encode?.x?.at(0), o = a !== void 0 ? t.dimensionNames?.[a] : void 0, s = t.value && typeof t.value == "object" && !Array.isArray(t.value) ? t.value : void 0, l = o && s ? s[o] : void 0, u = typeof l == "number" && e ? e(l) : l ?? "", d = typeof t.marker == "string" ? t.marker : "", c = t.seriesName ? `${t.seriesName}: ` : "";
296
+ function H(e, r) {
297
+ return C((t) => {
298
+ const n = t.encode?.x?.at(0), o = n !== void 0 ? t.dimensionNames?.[n] : void 0, s = t.value && typeof t.value == "object" && !Array.isArray(t.value) ? t.value : void 0, c = o && s ? s[o] : void 0, d = typeof c == "number" && e ? e(c) : c ?? "", m = typeof t.marker == "string" ? t.marker : "", u = t.seriesName ? `${t.seriesName}: ` : "";
293
299
  return {
294
300
  name: String(r ? r(t.name ?? "") : t.name ?? ""),
295
- seriesName: c,
296
- marker: d,
297
- value: u
301
+ seriesName: u,
302
+ marker: m,
303
+ value: d
298
304
  };
299
305
  });
300
306
  }
301
- function H(e) {
307
+ function R(e) {
302
308
  let r = 0, t = -1 / 0;
303
- for (const a of e)
304
- for (const o of a)
309
+ for (const n of e)
310
+ for (const o of n)
305
311
  typeof o?.value != "number" || !Number.isFinite(o.value) || (o.value < r && (r = o.value), o.value > t && (t = o.value));
306
312
  return {
307
313
  niceMinVal: r < 0 ? A(r) : 0,
308
314
  niceMaxVal: t <= 0 ? 1 : A(t)
309
315
  };
310
316
  }
311
- function F(e, r) {
312
- return I((t) => {
313
- const a = t.encode?.value?.at(0) ?? 1, s = (t.value && typeof t.value == "object" && !Array.isArray(t.value) ? Object.values(t.value) : [])[a], l = typeof s == "number" && e ? e(s) : s ?? "", u = typeof t.marker == "string" ? t.marker : "", d = t.seriesName ? `${t.seriesName}: ` : "";
317
+ function k(e, r) {
318
+ return C((t) => {
319
+ const n = t.encode?.value?.at(0) ?? 1, s = (t.value && typeof t.value == "object" && !Array.isArray(t.value) ? Object.values(t.value) : [])[n], c = typeof s == "number" && e ? e(s) : s ?? "", d = typeof t.marker == "string" ? t.marker : "", m = t.seriesName ? `${t.seriesName}: ` : "";
314
320
  return {
315
321
  name: String(r ? r(t.name ?? "") : t.name ?? ""),
316
- seriesName: d,
317
- marker: u,
318
- value: l
322
+ seriesName: m,
323
+ marker: d,
324
+ value: c
319
325
  };
320
326
  });
321
327
  }
322
- const C = {
328
+ const F = {
323
329
  root: {
324
330
  display: "flex",
325
331
  alignItems: "center",
@@ -334,21 +340,21 @@ const C = {
334
340
  borderRadius: "50%"
335
341
  }
336
342
  };
337
- function ve(e) {
343
+ function he(e) {
338
344
  const r = O(2), {
339
345
  count: t
340
- } = e, a = t === void 0 ? 1 : t;
346
+ } = e, n = t === void 0 ? 1 : t;
341
347
  let o;
342
- return r[0] !== a ? (o = /* @__PURE__ */ k(P, { sx: C.root, children: Array.from({
343
- length: a
344
- }).map(R) }), r[0] = a, r[1] = o) : o = r[1], o;
348
+ return r[0] !== n ? (o = /* @__PURE__ */ I(P, { sx: F.root, children: Array.from({
349
+ length: n
350
+ }).map(G) }), r[0] = n, r[1] = o) : o = r[1], o;
345
351
  }
346
- function R(e, r) {
347
- return /* @__PURE__ */ k($, { variant: "circular", sx: C.donut }, `donut-${r}`);
352
+ function G(e, r) {
353
+ return /* @__PURE__ */ I($, { variant: "circular", sx: F.donut }, `donut-${r}`);
348
354
  }
349
- function he(e) {
355
+ function Se(e) {
350
356
  const r = [];
351
- return e.getCaptureEl && r.push(M({
357
+ return e.getCaptureEl && r.push(z({
352
358
  filename: e.filename,
353
359
  getCaptureEl: e.getCaptureEl,
354
360
  pixelRatio: e.pngPixelRatio,
@@ -357,13 +363,13 @@ function he(e) {
357
363
  id: "csv",
358
364
  label: "Download as CSV",
359
365
  resolve: () => {
360
- const t = e.getData(), a = [["series", "name", "value"]];
361
- for (const [s, l] of t.entries()) {
362
- const u = e.seriesNames?.[s] ?? `series_${s + 1}`;
363
- for (const d of l)
364
- a.push([u, d.name, d.value]);
366
+ const t = e.getData(), n = [["series", "name", "value"]];
367
+ for (const [s, c] of t.entries()) {
368
+ const d = e.seriesNames?.[s] ?? `series_${s + 1}`;
369
+ for (const m of c)
370
+ n.push([d, m.name, m.value]);
365
371
  }
366
- const o = D(a);
372
+ const o = M(n);
367
373
  return Promise.resolve({
368
374
  url: o.url,
369
375
  filename: `${e.filename}.csv`,
@@ -373,9 +379,9 @@ function he(e) {
373
379
  }), r;
374
380
  }
375
381
  export {
376
- ve as PieSkeleton,
377
- he as createPieDownloadConfig,
378
- be as createPieOptionFactory,
379
- B as pieOptions
382
+ he as PieSkeleton,
383
+ Se as createPieDownloadConfig,
384
+ ve as createPieOptionFactory,
385
+ _ as pieOptions
380
386
  };
381
387
  //# sourceMappingURL=pie.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pie.js","sources":["../../src/widgets-v2/pie/options.ts","../../src/widgets-v2/pie/skeleton.tsx","../../src/widgets-v2/pie/download.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n buildSeriesLabelConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport type { OptionFactory, OptionFactoryContext } from '../echart'\nimport { mergeOptions } from '../utils'\nimport type {\n PieEChartsOption,\n PieOptionFactoryInput,\n PieOptionsInput,\n PieWidgetData,\n} from './types'\n\nconst DEFAULT_RADIUS: readonly [string, string] = ['58%', '74%']\n\n/**\n * Builds the **structural** ECharts option for a pie / donut widget.\n * Mirrors v1's pie look-and-feel: themed legend (`buildLegendConfig`),\n * themed tooltip via `createTooltipPositioner` / `createTooltipFormatter`,\n * `qualitative.bold` color palette, slice borders against the paper\n * background, hover-emphasis disabled, and a centered rich-text label.\n *\n * Layered like Bar / Histogram:\n * - **Theme-aware bits** live here on a series template (slice border,\n * center-label rich style sizes, emphasis-disabled).\n * - **Reactive bits** (tooltip value formatter, center-label text,\n * selection-driven dim) are re-emitted by\n * {@link createPieOptionFactory} at fusion time so RelativeData's\n * percent override flows through.\n */\nexport function pieOptions({\n theme,\n formatter,\n labelFormatter,\n}: PieOptionsInput): PieEChartsOption {\n return {\n legend: {\n ...buildLegendConfig({ hasLegend: true, labelFormatter }),\n // Pie reads better with a centered legend (the donut is radially\n // symmetric — left-aligning the legend below it visually unbalances\n // the chart). Override `buildLegendConfig`'s `type: 'scroll'` with\n // `'plain'` so long category lists wrap to multiple rows instead\n // of clipping the last visible item against the chart container.\n // The wider `itemGap` gives chips breathing room in the typical\n // 3–6 category case.\n left: 'center',\n type: 'scroll',\n itemGap: 16,\n },\n tooltip: {\n // Pie uses item-trigger (no axis); the rest of the styling mirrors\n // bar/histogram so the dashboard reads consistently — dark\n // grey[900] bg, white caption-font text, padded, with the shared\n // overflow-aware positioner.\n trigger: 'item',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n position: createTooltipPositioner(theme),\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n // V1 used `qualitative.bold` only (no `secondary.main` prefix) because\n // pie slices are categorical — each slice deserves a distinct palette\n // entry from the start, not a primary highlight.\n color: Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n // Pie template. The merger spreads this into each per-data series it\n // emits — borderColor / borderWidth / emphasis-disabled / label rich\n // sizes all survive through.\n series: [\n {\n type: 'pie',\n colorBy: 'data',\n avoidLabelOverlap: true,\n selectedOffset: 0,\n emphasis: { disabled: true },\n itemStyle: {\n borderColor: theme.palette.background.paper,\n borderWidth: 1,\n },\n label: {\n show: true,\n position: 'center',\n rich: {\n b: { fontSize: 16, fontWeight: 'normal', lineHeight: 20 },\n c: { fontSize: 28, fontWeight: 'bold', lineHeight: 27 },\n },\n },\n },\n ],\n }\n}\n\n/**\n * Returns the pie widget's {@link OptionFactory} — one closure that owns\n * BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link pieOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`PieWidgetData`) into the option via the dataset API. Single-series\n * → donut (one dataset, `series[i].encode = { itemName: 'name', value: 'value' }`).\n * Multi-series → horizontal-bar fallback (mirrors v1 pie). Reactive\n * formatters from `ctx` drive the tooltip + center label at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n */\nexport function createPieOptionFactory(\n options: PieOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride, seriesNames } =\n options\n const radius = options.radius ?? DEFAULT_RADIUS\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n return (option, data, ctx) => {\n if (option == null) {\n const structural = pieOptions({ theme, formatter, labelFormatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr = Array.isArray(data) ? (data as PieWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n if (seriesArr.length > 1) {\n return buildMultiSeriesBarFusion(\n option,\n seriesArr,\n theme,\n seriesNames,\n ctx,\n selectionSet,\n )\n }\n return buildSingleSeriesPieFusion(\n option,\n seriesArr,\n radius,\n seriesNames,\n ctx,\n selectionSet,\n )\n }\n}\n\n/**\n * Single-series donut fusion. Spreads the structural pie series template\n * into per-data series with center/radius/encoding, wires the reactive\n * center-label / tooltip formatters and the per-data palette-aware\n * selection-dim callback.\n */\nfunction buildSingleSeriesPieFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n radius: readonly [string, string],\n seriesNames: readonly string[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n // Pie wants `colorBy: 'data'` — each slice draws from the option's\n // `color` palette by data index. But installing an `itemStyle.color`\n // callback disables ECharts' automatic per-data cycling, and\n // `params.color` collapses to the series color (so every slice goes\n // the same color). We re-implement the per-data palette resolution\n // here so the multicolor look survives selection-driven dimming.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const resolvePaletteColor = (params: CallbackDataParams): string => {\n const swatch =\n palette.length > 0\n ? palette[params.dataIndex % palette.length]\n : undefined\n return swatch ?? (params.color as string)\n }\n\n // Always emit `itemStyle.color` (passthrough when nothing is selected),\n // not conditionally — same anti-stale-callback rationale as bar /\n // histogram. The slice border + width come from the structural\n // template's `itemStyle` and survive via the spread below.\n const colorFn = (params: CallbackDataParams): string => {\n const base = resolvePaletteColor(params)\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n // Center label formatter — lives in the merger because it reads\n // reactive `formatter` / `labelFormatter` from ctx. The rich tags\n // `{c|…}` and `{b|…}` reference the rich styles baked into the\n // structural label template.\n const labelTextFormatter = (params: CallbackDataParams): string => {\n const { name } = params\n const encodeIndex = params.encode?.value?.[0]\n if (encodeIndex === undefined) return ''\n const value = (Object.values(params.data ?? {}) as unknown[]).at(\n encodeIndex,\n )\n // `value` here is the resolved dataset cell — for pie data it's a\n // `string | number` primitive. Anything else is a misuse we won't\n // dress up with `String(...)` (would render \"[object Object]\").\n const formattedValue =\n typeof value === 'number'\n ? formatter\n ? formatter(value)\n : String(value)\n : typeof value === 'string'\n ? value\n : ''\n const formattedName = labelFormatter\n ? String(labelFormatter(name ?? ''))\n : String(name ?? '')\n return `{c|${formattedValue}}\\n\\n{b|${formattedName}}`\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const templateObj = typeof template === 'object' ? template : {}\n const templateLabel = (templateObj as { label?: object }).label ?? {}\n const templateItemStyle =\n (templateObj as { itemStyle?: object }).itemStyle ?? {}\n return {\n ...templateObj,\n type: 'pie' as const,\n datasetIndex: i,\n name: seriesNames?.[i] ?? `Series ${i + 1}`,\n radius: [...radius],\n // Lift the donut up so the bottom-anchored legend has the\n // vertical real estate to wrap to multiple rows for long\n // category lists — at exactly `50%` the bottom slices crowd\n // the chips and `type: 'plain'` legends can't expand upward\n // without overlapping the donut.\n center: ['50%', '38%'] as [string, string],\n encode: { itemName: 'name', value: 'value' },\n label: {\n ...templateLabel,\n formatter: labelTextFormatter,\n },\n itemStyle: {\n ...templateItemStyle,\n color: colorFn,\n },\n }\n }),\n // Legend always shows for pie (mirrors v1) — slice names drive the\n // entries, so even a single donut benefits from a category list.\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n }\n}\n\n/**\n * Multi-series horizontal-bar fusion. Mirrors v1 pie's \"pie data with\n * >1 series collapses into a horizontal bar chart\" behavior — side-by-\n * side donuts don't read well when you're comparing the same categories\n * across cohorts, so swap to a value-on-x / category-on-y bar layout.\n *\n * Pie data shape is identical to bar's (`{ name, value }[][]`), so the\n * same dataset feeds either layout without transformation.\n */\nfunction buildMultiSeriesBarFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n theme: Theme,\n seriesNames: readonly string[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)\n\n // Per-series palette — multi-series bars take one color per series\n // (not per-data, unlike donut slices). Same anti-stale-callback rule:\n // always emit the callback so a transition to/from a selection\n // replaces the previous closure cleanly.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const barColorFn = (params: CallbackDataParams): string => {\n const seriesIdx = params.seriesIndex ?? 0\n const seriesSwatch =\n palette.length > 0 ? palette[seriesIdx % palette.length] : undefined\n const base = (seriesSwatch ?? params.color) as string\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n grid: {\n ...baseGrid,\n ...buildGridConfig(true, theme),\n right: parseInt(theme.spacing(4)),\n containLabel: true,\n },\n // Drop pie-specific structural keys that shouldn't render in the\n // bar fallback. ECharts ignores undefined keys, so this is a clean\n // override.\n series: seriesArr.map((_, i) => ({\n datasetIndex: i,\n type: 'bar' as const,\n name: seriesNames?.[i] ?? `Series ${i + 1}`,\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n ...buildSeriesLabelConfig(formatter, 'x'),\n itemStyle: { color: barColorFn },\n })),\n xAxis: {\n type: 'value',\n // Closures over the pre-computed nice bounds — ECharts calls them\n // once per render to resolve the axis extents.\n min: () => niceMinVal,\n max: () => niceMaxVal,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n // Value labels render BELOW the axis line (default placement),\n // NOT inside the plot. Bar/histogram use `inside: true` +\n // `verticalAlign: 'bottom'` for their *vertical* y-axis where the\n // axis is the left wall — labels inside read like grid annotations.\n // A horizontal bar chart's value axis is the x-axis, and `inside`\n // there pushes the max label *behind* the bar (it visually\n // disappears once a bar reaches the right edge). Use the default\n // below-the-axis placement so the rounded extents stay readable.\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n showMaxLabel: true,\n showMinLabel: true,\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n yAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n ...(labelFormatter && {\n formatter: (value: string | number) => String(labelFormatter(value)),\n }),\n },\n },\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n trigger: 'axis',\n formatter: buildHorizontalBarTooltipFormatter(formatter, labelFormatter),\n },\n } as EChartsOption\n}\n\n/**\n * Tooltip formatter for the horizontal-bar fallback. Reads the value by\n * `encode.x` dimension index (v1 parity) so it stays robust to\n * downstream changes that rename dataset columns.\n */\nfunction buildHorizontalBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.x?.at(0)\n const dimName =\n encodeIndex !== undefined ? item.dimensionNames?.[encodeIndex] : undefined\n const row =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (item.value as Record<string, string | number>)\n : undefined\n const raw = dimName && row ? row[dimName] : undefined\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n\n/**\n * Min/max bounds over every datum's `.value` across all series. Used by\n * the horizontal-bar fallback's x-axis label formatter so we only render\n * labels at the rounded extents (matches v1 + bar / histogram).\n */\nfunction computeNiceBounds(seriesArr: PieWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n return {\n niceMinVal: min < 0 ? niceNum(min) : 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\n/**\n * Tooltip formatter for pie slices. `item.value` is the dataset row\n * object (e.g. `{ name: 'A', value: 10 }`); we pull the value by\n * `encode.value`'s dimension index, formatted via the reactive `formatter`\n * if present. Slice name passes through `labelFormatter`.\n */\nfunction buildPieTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.value?.at(0) ?? 1\n const values =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (Object.values(item.value) as (string | number)[])\n : []\n const raw = values[encodeIndex]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n py: 1,\n gap: 2,\n },\n donut: {\n width: 160,\n height: 160,\n borderRadius: '50%',\n },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface PieSkeletonProps {\n count?: number\n}\n\nexport function PieSkeleton({ count = 1 }: PieSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`donut-${i}`} variant='circular' sx={styles.donut} />\n ))}\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { PieWidgetData } from './types'\n\n/**\n * Download menu items for the Pie widget. Always includes a CSV item with\n * `series, name, value` columns (one row per slice; series labels come from\n * `seriesNames` if provided, else `series_<n>`). When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createPieDownloadConfig(args: {\n filename: string\n getData: () => PieWidgetData\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'Download as CSV',\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = [['series', 'name', 'value']]\n for (const [i, series] of data.entries()) {\n const seriesName = args.seriesNames?.[i] ?? `series_${i + 1}`\n for (const slice of series) {\n rows.push([seriesName, slice.name, slice.value])\n }\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["DEFAULT_RADIUS","pieOptions","theme","formatter","labelFormatter","legend","buildLegendConfig","hasLegend","left","type","itemGap","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","parseInt","spacing","textStyle","color","common","white","fontSize","fontFamily","typography","caption","position","createTooltipPositioner","buildPieTooltipFormatter","Object","values","qualitative","bold","series","colorBy","avoidLabelOverlap","selectedOffset","emphasis","disabled","itemStyle","borderColor","background","paper","label","show","rich","b","fontWeight","lineHeight","c","createPieOptionFactory","options","optionsOverride","seriesNames","radius","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","buildMultiSeriesBarFusion","buildSingleSeriesPieFusion","seriesTemplates","broadcastTemplate","baseTooltip","baseLegend","resolvePaletteColor","params","dataIndex","undefined","colorFn","base","name","value","has","echarts","modifyAlpha","labelTextFormatter","encodeIndex","encode","at","formattedValue","String","formattedName","map","s","source","_","i","template","templateObj","templateLabel","templateItemStyle","datasetIndex","center","itemName","baseGrid","grid","niceMinVal","niceMaxVal","computeNiceBounds","barColorFn","seriesIdx","seriesIndex","buildGridConfig","right","containLabel","barMaxWidth","focus","buildSeriesLabelConfig","xAxis","min","max","axisLine","axisTick","splitLine","lineStyle","black","divider","axisLabel","overlineDelicate","margin","showMaxLabel","showMinLabel","yAxis","buildHorizontalBarTooltipFormatter","createTooltipFormatter","item","x","dimName","dimensionNames","row","raw","marker","seriesName","d","Number","isFinite","niceNum","styles","root","display","alignItems","justifyContent","minHeight","py","gap","donut","width","height","borderRadius","PieSkeleton","t0","$","_c","count","t1","t2","Box","from","_temp","jsx","Skeleton","createPieDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","rows","entries","slice","handle","downloadToCSV","Promise","url","revoke"],"mappings":"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"}
1
+ {"version":3,"file":"pie.js","sources":["../../src/widgets-v2/pie/options.ts","../../src/widgets-v2/pie/skeleton.tsx","../../src/widgets-v2/pie/download.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n buildSeriesLabelConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport type { OptionFactory, OptionFactoryContext } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport type { WidgetSeries } from '../types'\nimport type {\n PieEChartsOption,\n PieOptionFactoryInput,\n PieOptionsInput,\n PieWidgetData,\n} from './types'\n\nconst DEFAULT_RADIUS: readonly [string, string] = ['58%', '74%']\n\n/**\n * Builds the **structural** ECharts option for a pie / donut widget.\n * Mirrors v1's pie look-and-feel: themed legend (`buildLegendConfig`),\n * themed tooltip via `createTooltipPositioner` / `createTooltipFormatter`,\n * `qualitative.bold` color palette, slice borders against the paper\n * background, hover-emphasis disabled, and a centered rich-text label.\n *\n * Layered like Bar / Histogram:\n * - **Theme-aware bits** live here on a series template (slice border,\n * center-label rich style sizes, emphasis-disabled).\n * - **Reactive bits** (tooltip value formatter, center-label text,\n * selection-driven dim) are re-emitted by\n * {@link createPieOptionFactory} at fusion time so RelativeData's\n * percent override flows through.\n */\nexport function pieOptions({\n theme,\n formatter,\n labelFormatter,\n}: PieOptionsInput): PieEChartsOption {\n return {\n legend: {\n ...buildLegendConfig({ hasLegend: true, labelFormatter }),\n // Pie reads better with a centered legend (the donut is radially\n // symmetric — left-aligning the legend below it visually unbalances\n // the chart). Override `buildLegendConfig`'s `type: 'scroll'` with\n // `'plain'` so long category lists wrap to multiple rows instead\n // of clipping the last visible item against the chart container.\n // The wider `itemGap` gives chips breathing room in the typical\n // 3–6 category case.\n left: 'center',\n type: 'scroll',\n itemGap: 16,\n },\n tooltip: {\n // Pie uses item-trigger (no axis); the rest of the styling mirrors\n // bar/histogram so the dashboard reads consistently — dark\n // grey[900] bg, white caption-font text, padded, with the shared\n // overflow-aware positioner.\n trigger: 'item',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n position: createTooltipPositioner(theme),\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n // V1 used `qualitative.bold` only (no `secondary.main` prefix) because\n // pie slices are categorical — each slice deserves a distinct palette\n // entry from the start, not a primary highlight.\n color: Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n // Pie template. The merger spreads this into each per-data series it\n // emits — borderColor / borderWidth / emphasis-disabled / label rich\n // sizes all survive through.\n series: [\n {\n type: 'pie',\n colorBy: 'data',\n avoidLabelOverlap: true,\n selectedOffset: 0,\n emphasis: { disabled: true },\n itemStyle: {\n borderColor: theme.palette.background.paper,\n borderWidth: 1,\n },\n label: {\n show: true,\n position: 'center',\n rich: {\n b: { fontSize: 16, fontWeight: 'normal', lineHeight: 20 },\n c: { fontSize: 28, fontWeight: 'bold', lineHeight: 27 },\n },\n },\n },\n ],\n }\n}\n\n/**\n * Returns the pie widget's {@link OptionFactory} — one closure that owns\n * BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link pieOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`PieWidgetData`) into the option via the dataset API. Single-series\n * → donut (one dataset, `series[i].encode = { itemName: 'name', value: 'value' }`).\n * Multi-series → horizontal-bar fallback (mirrors v1 pie). Reactive\n * formatters from `ctx` drive the tooltip + center label at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n */\nexport function createPieOptionFactory(\n options: PieOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride, series } = options\n const radius = options.radius ?? DEFAULT_RADIUS\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n return (option, data, ctx) => {\n if (option == null) {\n const structural = pieOptions({ theme, formatter, labelFormatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr = Array.isArray(data) ? (data as PieWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n if (seriesArr.length > 1) {\n return buildMultiSeriesBarFusion(\n option,\n seriesArr,\n theme,\n series,\n ctx,\n selectionSet,\n )\n }\n return buildSingleSeriesPieFusion(\n option,\n seriesArr,\n radius,\n series,\n ctx,\n selectionSet,\n )\n }\n}\n\n/**\n * Single-series donut fusion. Spreads the structural pie series template\n * into per-data series with center/radius/encoding, wires the reactive\n * center-label / tooltip formatters and the per-data palette-aware\n * selection-dim callback.\n */\nfunction buildSingleSeriesPieFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n radius: readonly [string, string],\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n // Pie wants `colorBy: 'data'` — each slice draws from the option's\n // `color` palette by data index. But installing an `itemStyle.color`\n // callback disables ECharts' automatic per-data cycling, and\n // `params.color` collapses to the series color (so every slice goes\n // the same color). We re-implement the per-data palette resolution\n // here so the multicolor look survives selection-driven dimming.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const resolvePaletteColor = (params: CallbackDataParams): string => {\n const swatch =\n palette.length > 0\n ? palette[params.dataIndex % palette.length]\n : undefined\n return swatch ?? (params.color as string)\n }\n\n // Always emit `itemStyle.color` (passthrough when nothing is selected),\n // not conditionally — same anti-stale-callback rationale as bar /\n // histogram. The slice border + width come from the structural\n // template's `itemStyle` and survive via the spread below.\n const colorFn = (params: CallbackDataParams): string => {\n const base = resolvePaletteColor(params)\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n // Center label formatter — lives in the merger because it reads\n // reactive `formatter` / `labelFormatter` from ctx. The rich tags\n // `{c|…}` and `{b|…}` reference the rich styles baked into the\n // structural label template.\n const labelTextFormatter = (params: CallbackDataParams): string => {\n const { name } = params\n const encodeIndex = params.encode?.value?.[0]\n if (encodeIndex === undefined) return ''\n const value = (Object.values(params.data ?? {}) as unknown[]).at(\n encodeIndex,\n )\n // `value` here is the resolved dataset cell — for pie data it's a\n // `string | number` primitive. Anything else is a misuse we won't\n // dress up with `String(...)` (would render \"[object Object]\").\n const formattedValue =\n typeof value === 'number'\n ? formatter\n ? formatter(value)\n : String(value)\n : typeof value === 'string'\n ? value\n : ''\n const formattedName = labelFormatter\n ? String(labelFormatter(name ?? ''))\n : String(name ?? '')\n return `{c|${formattedValue}}\\n\\n{b|${formattedName}}`\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const templateObj = typeof template === 'object' ? template : {}\n const templateLabel = (templateObj as { label?: object }).label ?? {}\n const templateItemStyle =\n (templateObj as { itemStyle?: object }).itemStyle ?? {}\n return {\n ...templateObj,\n type: 'pie' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n radius: [...radius],\n // Lift the donut up so the bottom-anchored legend has the\n // vertical real estate to wrap to multiple rows for long\n // category lists — at exactly `50%` the bottom slices crowd\n // the chips and `type: 'plain'` legends can't expand upward\n // without overlapping the donut.\n center: ['50%', '38%'] as [string, string],\n encode: { itemName: 'name', value: 'value' },\n label: {\n ...templateLabel,\n formatter: labelTextFormatter,\n },\n itemStyle: {\n ...templateItemStyle,\n color: colorFn,\n },\n }\n }),\n // Legend always shows for pie (mirrors v1) — slice names drive the\n // entries, so even a single donut benefits from a category list.\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n }\n}\n\n/**\n * Multi-series horizontal-bar fusion. Mirrors v1 pie's \"pie data with\n * >1 series collapses into a horizontal bar chart\" behavior — side-by-\n * side donuts don't read well when you're comparing the same categories\n * across cohorts, so swap to a value-on-x / category-on-y bar layout.\n *\n * Pie data shape is identical to bar's (`{ name, value }[][]`), so the\n * same dataset feeds either layout without transformation.\n */\nfunction buildMultiSeriesBarFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n theme: Theme,\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)\n\n // Per-series palette — multi-series bars take one color per series\n // (not per-data, unlike donut slices). Same anti-stale-callback rule:\n // always emit the callback so a transition to/from a selection\n // replaces the previous closure cleanly.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const barColorFn = (params: CallbackDataParams): string => {\n const seriesIdx = params.seriesIndex ?? 0\n const seriesSwatch =\n palette.length > 0 ? palette[seriesIdx % palette.length] : undefined\n const base = (seriesSwatch ?? params.color) as string\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n grid: {\n ...baseGrid,\n ...buildGridConfig(true, theme),\n right: parseInt(theme.spacing(4)),\n containLabel: true,\n },\n // Drop pie-specific structural keys that shouldn't render in the\n // bar fallback. ECharts ignores undefined keys, so this is a clean\n // override.\n series: seriesArr.map((_, i) => {\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n datasetIndex: i,\n type: 'bar' as const,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n ...buildSeriesLabelConfig(formatter, 'x'),\n itemStyle: { color: barColorFn },\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n xAxis: {\n type: 'value',\n // Closures over the pre-computed nice bounds — ECharts calls them\n // once per render to resolve the axis extents.\n min: () => niceMinVal,\n max: () => niceMaxVal,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n // Value labels render BELOW the axis line (default placement),\n // NOT inside the plot. Bar/histogram use `inside: true` +\n // `verticalAlign: 'bottom'` for their *vertical* y-axis where the\n // axis is the left wall — labels inside read like grid annotations.\n // A horizontal bar chart's value axis is the x-axis, and `inside`\n // there pushes the max label *behind* the bar (it visually\n // disappears once a bar reaches the right edge). Use the default\n // below-the-axis placement so the rounded extents stay readable.\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n showMaxLabel: true,\n showMinLabel: true,\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n yAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n ...(labelFormatter && {\n formatter: (value: string | number) => String(labelFormatter(value)),\n }),\n },\n },\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n trigger: 'axis',\n formatter: buildHorizontalBarTooltipFormatter(formatter, labelFormatter),\n },\n } as EChartsOption\n}\n\n/**\n * Tooltip formatter for the horizontal-bar fallback. Reads the value by\n * `encode.x` dimension index (v1 parity) so it stays robust to\n * downstream changes that rename dataset columns.\n */\nfunction buildHorizontalBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.x?.at(0)\n const dimName =\n encodeIndex !== undefined ? item.dimensionNames?.[encodeIndex] : undefined\n const row =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (item.value as Record<string, string | number>)\n : undefined\n const raw = dimName && row ? row[dimName] : undefined\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n\n/**\n * Min/max bounds over every datum's `.value` across all series. Used by\n * the horizontal-bar fallback's x-axis label formatter so we only render\n * labels at the rounded extents (matches v1 + bar / histogram).\n */\nfunction computeNiceBounds(seriesArr: PieWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n return {\n niceMinVal: min < 0 ? niceNum(min) : 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\n/**\n * Tooltip formatter for pie slices. `item.value` is the dataset row\n * object (e.g. `{ name: 'A', value: 10 }`); we pull the value by\n * `encode.value`'s dimension index, formatted via the reactive `formatter`\n * if present. Slice name passes through `labelFormatter`.\n */\nfunction buildPieTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.value?.at(0) ?? 1\n const values =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (Object.values(item.value) as (string | number)[])\n : []\n const raw = values[encodeIndex]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n py: 1,\n gap: 2,\n },\n donut: {\n width: 160,\n height: 160,\n borderRadius: '50%',\n },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface PieSkeletonProps {\n count?: number\n}\n\nexport function PieSkeleton({ count = 1 }: PieSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`donut-${i}`} variant='circular' sx={styles.donut} />\n ))}\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { PieWidgetData } from './types'\n\n/**\n * Download menu items for the Pie widget. Always includes a CSV item with\n * `series, name, value` columns (one row per slice; series labels come from\n * `seriesNames` if provided, else `series_<n>`). When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createPieDownloadConfig(args: {\n filename: string\n getData: () => PieWidgetData\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'Download as CSV',\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = [['series', 'name', 'value']]\n for (const [i, series] of data.entries()) {\n const seriesName = args.seriesNames?.[i] ?? `series_${i + 1}`\n for (const slice of series) {\n rows.push([seriesName, slice.name, slice.value])\n }\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["DEFAULT_RADIUS","pieOptions","theme","formatter","labelFormatter","legend","buildLegendConfig","hasLegend","left","type","itemGap","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","parseInt","spacing","textStyle","color","common","white","fontSize","fontFamily","typography","caption","position","createTooltipPositioner","buildPieTooltipFormatter","Object","values","qualitative","bold","series","colorBy","avoidLabelOverlap","selectedOffset","emphasis","disabled","itemStyle","borderColor","background","paper","label","show","rich","b","fontWeight","lineHeight","c","createPieOptionFactory","options","optionsOverride","radius","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","buildMultiSeriesBarFusion","buildSingleSeriesPieFusion","seriesTemplates","broadcastTemplate","baseTooltip","baseLegend","resolvePaletteColor","params","dataIndex","undefined","colorFn","base","name","value","has","echarts","modifyAlpha","labelTextFormatter","encodeIndex","encode","at","formattedValue","String","formattedName","map","s","source","_","i","template","templateObj","templateLabel","templateItemStyle","datasetIndex","center","itemName","baseGrid","grid","niceMinVal","niceMaxVal","computeNiceBounds","barColorFn","seriesIdx","seriesIndex","buildGridConfig","right","containLabel","overrideColor","resolveThemeColor","barMaxWidth","focus","buildSeriesLabelConfig","xAxis","min","max","axisLine","axisTick","splitLine","lineStyle","black","divider","axisLabel","overlineDelicate","margin","showMaxLabel","showMinLabel","yAxis","buildHorizontalBarTooltipFormatter","createTooltipFormatter","item","x","dimName","dimensionNames","row","raw","marker","seriesName","d","Number","isFinite","niceNum","styles","root","display","alignItems","justifyContent","minHeight","py","gap","donut","width","height","borderRadius","PieSkeleton","t0","$","_c","count","t1","t2","Box","from","_temp","jsx","Skeleton","createPieDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","rows","entries","seriesNames","slice","handle","downloadToCSV","Promise","url","revoke"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { R as y, a as R } from "../range-DsqTjSpg.js";
1
+ import { R as y, a as R } from "../range-l4fNHLEg.js";
2
2
  import { jsx as r, jsxs as c } from "react/jsx-runtime";
3
3
  import { c as p } from "react/compiler-runtime";
4
4
  import { Box as a, Skeleton as i } from "@mui/material";