@carto/ps-react-ui 4.12.0 → 4.12.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.
- package/dist/{echart-BMPpj7n_.js → echart-Bdvbfx9s.js} +2 -2
- package/dist/echart-Bdvbfx9s.js.map +1 -0
- package/dist/{option-builders-F-c9ELi1.js → option-builders-DPeoyQaM.js} +41 -33
- package/dist/option-builders-DPeoyQaM.js.map +1 -0
- package/dist/types/widgets/utils/chart-config/index.d.ts +1 -1
- package/dist/types/widgets-v2/pie/skeleton.d.ts +9 -0
- package/dist/widgets/bar.js +1 -1
- package/dist/widgets/histogram.js +1 -1
- package/dist/widgets/pie.js +1 -1
- package/dist/widgets/scatterplot.js +5 -5
- package/dist/widgets/timeseries.js +1 -1
- package/dist/widgets/utils.js +1 -1
- package/dist/widgets-v2/bar.js +64 -64
- package/dist/widgets-v2/bar.js.map +1 -1
- package/dist/widgets-v2/echart.js +1 -1
- package/dist/widgets-v2/histogram.js +89 -89
- package/dist/widgets-v2/histogram.js.map +1 -1
- package/dist/widgets-v2/pie.js +149 -95
- package/dist/widgets-v2/pie.js.map +1 -1
- package/dist/widgets-v2/scatterplot.js +153 -157
- package/dist/widgets-v2/scatterplot.js.map +1 -1
- package/dist/widgets-v2/timeseries.js +74 -74
- package/dist/widgets-v2/timeseries.js.map +1 -1
- package/dist/widgets-v2.js +2 -2
- package/package.json +1 -1
- package/src/widgets/utils/chart-config/index.ts +1 -0
- package/src/widgets/utils/chart-config/option-builders.test.ts +34 -0
- package/src/widgets/utils/chart-config/option-builders.ts +21 -0
- package/src/widgets-v2/bar/options.ts +3 -2
- package/src/widgets-v2/echart/edge-label-clamp.ts +7 -4
- package/src/widgets-v2/histogram/options.ts +3 -2
- package/src/widgets-v2/pie/skeleton.test.tsx +6 -3
- package/src/widgets-v2/pie/skeleton.tsx +69 -7
- package/src/widgets-v2/scatterplot/options.ts +3 -6
- package/src/widgets-v2/timeseries/options.ts +3 -2
- package/dist/echart-BMPpj7n_.js.map +0 -1
- package/dist/option-builders-F-c9ELi1.js.map +0 -1
- package/dist/types/widgets/utils/chart-config/option-builders.d.ts +0 -124
package/dist/widgets-v2/bar.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import { n as y, d as
|
|
3
|
-
import { jsx as
|
|
4
|
-
import { c as
|
|
5
|
-
import { Box as
|
|
1
|
+
import * as N from "echarts";
|
|
2
|
+
import { h as B, n as y, d as R, g as H, c as W, f as Y } from "../option-builders-DPeoyQaM.js";
|
|
3
|
+
import { jsx as d, jsxs as _ } from "react/jsx-runtime";
|
|
4
|
+
import { c as q } from "react/compiler-runtime";
|
|
5
|
+
import { Box as g, Skeleton as I } from "@mui/material";
|
|
6
6
|
import "../widget-store-Bw5zRUGg.js";
|
|
7
7
|
import "zustand/shallow";
|
|
8
8
|
import "@mui/icons-material";
|
|
@@ -20,12 +20,12 @@ import "zustand";
|
|
|
20
20
|
import "zustand/vanilla";
|
|
21
21
|
import "zustand/middleware";
|
|
22
22
|
import "zustand/react/shallow";
|
|
23
|
-
import { Z as
|
|
24
|
-
import { m as
|
|
25
|
-
import { p as
|
|
26
|
-
import { b as
|
|
27
|
-
import { b as
|
|
28
|
-
function
|
|
23
|
+
import { Z as O } from "../transforms-Cdx4fkU5.js";
|
|
24
|
+
import { m as z, r as U } from "../resolve-theme-color-BdojIw0K.js";
|
|
25
|
+
import { p as V } from "../data-zoom-layout-CkVnm6ej.js";
|
|
26
|
+
import { b as J } from "../png-item-9dNbB37T.js";
|
|
27
|
+
import { b as K } from "../csv-item-hH_Gt7ur.js";
|
|
28
|
+
function Q({
|
|
29
29
|
theme: e,
|
|
30
30
|
formatter: o,
|
|
31
31
|
labelFormatter: t
|
|
@@ -37,7 +37,7 @@ function K({
|
|
|
37
37
|
top: parseInt(e.spacing(3)),
|
|
38
38
|
right: parseInt(e.spacing(1)),
|
|
39
39
|
// Default: no legend. Merger bumps this when there are >1 series.
|
|
40
|
-
...
|
|
40
|
+
...W(!1, e),
|
|
41
41
|
containLabel: !0
|
|
42
42
|
},
|
|
43
43
|
tooltip: {
|
|
@@ -53,13 +53,13 @@ function K({
|
|
|
53
53
|
axisPointer: {
|
|
54
54
|
type: "line"
|
|
55
55
|
},
|
|
56
|
-
position:
|
|
57
|
-
formatter:
|
|
56
|
+
position: H(e),
|
|
57
|
+
formatter: M(o, t)
|
|
58
58
|
},
|
|
59
59
|
// Legend styling baked here; `show` is toggled by the merger based on
|
|
60
60
|
// series count.
|
|
61
61
|
legend: {
|
|
62
|
-
...
|
|
62
|
+
...R({
|
|
63
63
|
hasLegend: !1,
|
|
64
64
|
labelFormatter: t
|
|
65
65
|
})
|
|
@@ -79,6 +79,7 @@ function K({
|
|
|
79
79
|
show: !1
|
|
80
80
|
},
|
|
81
81
|
axisLabel: {
|
|
82
|
+
...B(e),
|
|
82
83
|
padding: [parseInt(e.spacing(0.5)), 0, 0, 0],
|
|
83
84
|
margin: 0,
|
|
84
85
|
hideOverlap: !0,
|
|
@@ -104,8 +105,7 @@ function K({
|
|
|
104
105
|
}
|
|
105
106
|
},
|
|
106
107
|
axisLabel: {
|
|
107
|
-
|
|
108
|
-
fontFamily: e.typography.overlineDelicate?.fontFamily,
|
|
108
|
+
...B(e),
|
|
109
109
|
margin: parseInt(e.spacing(1)),
|
|
110
110
|
show: !0,
|
|
111
111
|
showMaxLabel: !0,
|
|
@@ -117,48 +117,48 @@ function K({
|
|
|
117
117
|
}
|
|
118
118
|
};
|
|
119
119
|
}
|
|
120
|
-
function
|
|
120
|
+
function Te(e) {
|
|
121
121
|
const {
|
|
122
122
|
theme: o,
|
|
123
123
|
formatter: t,
|
|
124
124
|
labelFormatter: s,
|
|
125
125
|
optionsOverride: n
|
|
126
|
-
} = e, a = e.series, c = e.selection,
|
|
127
|
-
return (i,
|
|
126
|
+
} = e, a = e.series, c = e.selection, f = c && c.length > 0 ? new Set(c) : null;
|
|
127
|
+
return (i, C, v) => {
|
|
128
128
|
if (i == null) {
|
|
129
|
-
const r =
|
|
129
|
+
const r = Q({
|
|
130
130
|
theme: o,
|
|
131
131
|
formatter: t,
|
|
132
132
|
labelFormatter: s
|
|
133
133
|
});
|
|
134
|
-
return n ?
|
|
134
|
+
return n ? z(r, n) : r;
|
|
135
135
|
}
|
|
136
|
-
const
|
|
137
|
-
if (
|
|
136
|
+
const u = Array.isArray(C) ? C : [];
|
|
137
|
+
if (u.length === 0)
|
|
138
138
|
return {
|
|
139
139
|
...i,
|
|
140
140
|
dataset: [],
|
|
141
141
|
series: []
|
|
142
142
|
};
|
|
143
|
-
const b =
|
|
144
|
-
let
|
|
145
|
-
const
|
|
143
|
+
const b = u.length > 1, D = typeof i.legend == "object" && !Array.isArray(i.legend) ? i.legend : {}, x = typeof i.grid == "object" && !Array.isArray(i.grid) ? i.grid : {}, F = typeof i.tooltip == "object" && !Array.isArray(i.tooltip) ? i.tooltip : {}, k = typeof i.yAxis == "object" && !Array.isArray(i.yAxis) ? i.yAxis : {}, T = Array.isArray(i.series) ? i.series : [], Z = T[0] ?? {}, h = v?.formatter, P = v?.labelFormatter;
|
|
144
|
+
let A = 0, w = 1;
|
|
145
|
+
const L = V(i.dataZoom, b), $ = typeof x.bottom == "number" ? x.bottom : 24, j = b ? 56 : $, E = L ? j + O.sliderHeight + O.sliderGap : j, G = {
|
|
146
146
|
color: (r) => {
|
|
147
147
|
const l = r.color;
|
|
148
|
-
if (!
|
|
148
|
+
if (!f) return l;
|
|
149
149
|
const m = r.value?.name ?? r.name;
|
|
150
|
-
return m != null &&
|
|
150
|
+
return m != null && f.has(m) ? l : N.color.modifyAlpha(l, 0.15);
|
|
151
151
|
}
|
|
152
152
|
};
|
|
153
153
|
return {
|
|
154
154
|
...i,
|
|
155
|
-
dataset:
|
|
155
|
+
dataset: u.map((r) => ({
|
|
156
156
|
source: r
|
|
157
157
|
})),
|
|
158
|
-
series:
|
|
159
|
-
const
|
|
158
|
+
series: u.map((r, l) => {
|
|
159
|
+
const S = T[l] ?? Z, m = U(o, a?.[l]?.color);
|
|
160
160
|
return {
|
|
161
|
-
...typeof
|
|
161
|
+
...typeof S == "object" ? S : {},
|
|
162
162
|
type: "bar",
|
|
163
163
|
datasetIndex: l,
|
|
164
164
|
name: a?.[l]?.name ?? `Series ${l + 1}`,
|
|
@@ -170,7 +170,7 @@ function ke(e) {
|
|
|
170
170
|
emphasis: {
|
|
171
171
|
focus: "series"
|
|
172
172
|
},
|
|
173
|
-
itemStyle:
|
|
173
|
+
itemStyle: G,
|
|
174
174
|
...m ? {
|
|
175
175
|
color: m
|
|
176
176
|
} : {}
|
|
@@ -182,33 +182,33 @@ function ke(e) {
|
|
|
182
182
|
},
|
|
183
183
|
grid: {
|
|
184
184
|
...x,
|
|
185
|
-
bottom:
|
|
185
|
+
bottom: E
|
|
186
186
|
},
|
|
187
|
-
...
|
|
188
|
-
dataZoom:
|
|
187
|
+
...L ? {
|
|
188
|
+
dataZoom: L
|
|
189
189
|
} : {},
|
|
190
190
|
yAxis: {
|
|
191
191
|
...k,
|
|
192
|
-
min: (r) => (
|
|
193
|
-
max: (r) => (
|
|
192
|
+
min: (r) => (A = r.min < 0 ? y(r.min) : 0, A),
|
|
193
|
+
max: (r) => (w = r.max <= 0 ? 1 : y(r.max), w),
|
|
194
194
|
axisLabel: {
|
|
195
195
|
...k.axisLabel ?? {},
|
|
196
|
-
formatter: (r) => r !==
|
|
196
|
+
formatter: (r) => r !== w && r !== A || r === 0 ? "" : h ? h(r) : String(r)
|
|
197
197
|
}
|
|
198
198
|
},
|
|
199
199
|
tooltip: {
|
|
200
200
|
...F,
|
|
201
|
-
formatter:
|
|
201
|
+
formatter: M(h, P)
|
|
202
202
|
}
|
|
203
203
|
};
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
|
-
function
|
|
207
|
-
return
|
|
208
|
-
const n = t.value?.value, a = typeof n == "number" && e ? e(n) : n ?? "", c = typeof t.marker == "string" ? t.marker : "",
|
|
206
|
+
function M(e, o) {
|
|
207
|
+
return Y((t) => {
|
|
208
|
+
const n = t.value?.value, a = typeof n == "number" && e ? e(n) : n ?? "", c = typeof t.marker == "string" ? t.marker : "", f = t.seriesName ? `${t.seriesName}: ` : "", i = o ? String(o(t.name ?? "")) : t.name ?? "";
|
|
209
209
|
return {
|
|
210
210
|
name: String(i),
|
|
211
|
-
seriesName:
|
|
211
|
+
seriesName: f,
|
|
212
212
|
marker: c,
|
|
213
213
|
value: a
|
|
214
214
|
};
|
|
@@ -262,34 +262,34 @@ const p = {
|
|
|
262
262
|
spacing: e
|
|
263
263
|
}) => e(1.5)
|
|
264
264
|
}
|
|
265
|
-
},
|
|
266
|
-
function
|
|
267
|
-
const e =
|
|
265
|
+
}, X = ["20%", "40%", "60%", "20%", "80%"];
|
|
266
|
+
function je() {
|
|
267
|
+
const e = q(2);
|
|
268
268
|
let o;
|
|
269
|
-
e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (o = /* @__PURE__ */
|
|
269
|
+
e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (o = /* @__PURE__ */ d(g, { sx: p.grid, children: X.map(te) }), e[0] = o) : o = e[0];
|
|
270
270
|
let t;
|
|
271
|
-
return e[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t = /* @__PURE__ */
|
|
271
|
+
return e[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t = /* @__PURE__ */ _(g, { sx: p.container, children: [
|
|
272
272
|
o,
|
|
273
|
-
/* @__PURE__ */
|
|
273
|
+
/* @__PURE__ */ d(g, { sx: p.legend, children: [0, 1].map(ee) })
|
|
274
274
|
] }), e[1] = t) : t = e[1], t;
|
|
275
275
|
}
|
|
276
|
-
function
|
|
277
|
-
return /* @__PURE__ */
|
|
278
|
-
/* @__PURE__ */
|
|
279
|
-
/* @__PURE__ */
|
|
276
|
+
function ee(e) {
|
|
277
|
+
return /* @__PURE__ */ _(g, { sx: p.legendItem, children: [
|
|
278
|
+
/* @__PURE__ */ d(I, { variant: "circular", width: 8, height: 8 }),
|
|
279
|
+
/* @__PURE__ */ d(I, { width: 48, height: 8 })
|
|
280
280
|
] }, `legend-${e}`);
|
|
281
281
|
}
|
|
282
|
-
function
|
|
283
|
-
return /* @__PURE__ */
|
|
282
|
+
function te(e, o) {
|
|
283
|
+
return /* @__PURE__ */ d(I, { sx: p.bar, variant: "rectangular", height: e }, `bar-${o}`);
|
|
284
284
|
}
|
|
285
|
-
function
|
|
285
|
+
function Be(e) {
|
|
286
286
|
const o = [];
|
|
287
|
-
return e.getCaptureEl && o.push(
|
|
287
|
+
return e.getCaptureEl && o.push(J({
|
|
288
288
|
filename: e.filename,
|
|
289
289
|
getCaptureEl: e.getCaptureEl,
|
|
290
290
|
pixelRatio: e.pngPixelRatio,
|
|
291
291
|
backgroundColor: e.pngBackgroundColor
|
|
292
|
-
})), o.push(
|
|
292
|
+
})), o.push(K({
|
|
293
293
|
filename: e.filename,
|
|
294
294
|
getRows: () => {
|
|
295
295
|
const t = e.getData(), s = [];
|
|
@@ -302,9 +302,9 @@ function je(e) {
|
|
|
302
302
|
})), o;
|
|
303
303
|
}
|
|
304
304
|
export {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
305
|
+
je as BarSkeleton,
|
|
306
|
+
Q as barOptions,
|
|
307
|
+
Be as createBarDownloadConfig,
|
|
308
|
+
Te as createBarOptionFactory
|
|
309
309
|
};
|
|
310
310
|
//# sourceMappingURL=bar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar.js","sources":["../../src/widgets-v2/bar/options.ts","../../src/widgets-v2/bar/skeleton.tsx","../../src/widgets-v2/bar/download.tsx"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport { ZOOM_LAYOUT } from '../actions/zoom-toggle'\nimport type { OptionFactory } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n BarEChartsOption,\n BarOptionFactoryInput,\n BarOptionsInput,\n BarWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a bar widget — axes, grid,\n * tooltip styling, themed legend. Intentionally data-agnostic: no series,\n * no dataset, no `legend.show` (those depend on data and are added by the\n * option factory's merge phase). This separation is what lets data-side\n * pipeline transforms (Searcher, RelativeData) drive the rendered chart —\n * the merge happens at render time inside the Echart bridge.\n *\n * Styling matches the v1 `barConfig` look-and-feel: minimal axes (only\n * min/max y-labels rendered inside the plot via `niceNum`), themed tooltip,\n * scroll legend, and CARTO color palette. The y-axis min/max + label\n * formatter and the tooltip formatter are wired here for the no-data case;\n * {@link createBarOptionFactory} re-derives them at fusion time so reactive\n * formatter changes (RelativeData) and stack templates (StackToggle) flow\n * through to the chart.\n */\nexport function barOptions({\n theme,\n formatter,\n labelFormatter,\n}: BarOptionsInput): BarEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1).\n let niceMin = 0\n let niceMax = 1\n\n return {\n grid: {\n left: parseInt(theme.spacing(1)),\n top: parseInt(theme.spacing(3)),\n right: parseInt(theme.spacing(1)),\n // Default: no legend. Merger bumps this when there are >1 series.\n ...buildGridConfig(false, theme),\n containLabel: true,\n },\n tooltip: {\n trigger: 'axis',\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 axisPointer: { type: 'line' },\n position: createTooltipPositioner(theme),\n formatter: buildBarTooltipFormatter(formatter, labelFormatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count.\n legend: {\n ...buildLegendConfig({ hasLegend: false, labelFormatter }),\n },\n axisPointer: { lineStyle: { color: theme.palette.grey[400] } },\n color: [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n xAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n margin: 0,\n hideOverlap: true,\n ...(labelFormatter && {\n formatter: (v: string | number) => String(labelFormatter(v)),\n }),\n },\n },\n yAxis: {\n type: 'value',\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\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 axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n show: true,\n showMaxLabel: true,\n showMinLabel: true,\n verticalAlign: 'bottom',\n inside: true,\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n } as BarEChartsOption\n}\n\n/**\n * Returns the bar widget's {@link OptionFactory} — a single closure that\n * handles BOTH option-construction phases:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link barOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store; configTransforms (StackToggle /\n * ZoomToggle / BrushToggle) then mutate it via the pipeline middleware.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`BarWidgetData`) into the option via the dataset API: one dataset\n * per series, each series referencing its dataset by index, encoded\n * by `name` (x) and `value` (y). Spreads any series-template fields\n * already on the incoming option (e.g. `{ stack: 'total' }` from\n * `addStack`) into every emitted series so configTransforms compose\n * end-to-end. Reactive `ctx.formatter` / `ctx.labelFormatter` drive\n * the y-axis min/max-only label and the tooltip formatter at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n *\n * Stable identity when the inputs don't change (consumers should wrap the\n * call in `useMemo` keyed on the same inputs).\n */\nexport function createBarOptionFactory(\n options: BarOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride } = options\n const series = options.series\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 // Structural phase: Provider seeds rawOptions with this branch. No data\n // is read; we just emit the theme-aware base (optionally with override).\n if (option == null) {\n const structural = barOptions({ 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 BarWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n const hasLegend = seriesArr.length > 1\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 baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\n : {}\n\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n\n // Reactive (live store) formatters from ctx — distinct from the\n // closure-time `formatter` / `labelFormatter` captured for the\n // structural-build branch above. RelativeData can install a percent\n // formatter on the store after the factory was constructed; the merge\n // phase reads `ctx` to pick that up.\n const liveFormatter = ctx?.formatter\n const liveLabelFormatter = ctx?.labelFormatter\n\n // Closure shared between the yAxis min/max callbacks and the label\n // formatter, so only the rounded extents are labelled (matches v1).\n // Delegating the extent to ECharts (rather than precomputing scalars\n // from the raw data) is what keeps stacked bars inside the plot: when\n // StackToggle marks the series, ECharts feeds the *post-stack* extent\n // to these callbacks, so `niceNum` rounds the stacked total instead of\n // a single series.\n let niceMin = 0\n let niceMax = 1\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push the\n // slider above the legend (if any) and reserve room in the grid below.\n const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)\n const fallbackBottom =\n typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24\n const baseBottom = hasLegend ? 56 : fallbackBottom\n const gridBottom = dataZoomLayout\n ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap\n : baseBottom\n\n // When a selection is active, dim non-selected bars by routing the\n // resolved palette color through `modifyAlpha`. Per-row `itemStyle` on\n // dataset object-rows is silently ignored when `series.encode` is in\n // play — the callback approach is the standard ECharts pattern for\n // per-data styling derived from a dataset.\n //\n // We *always* emit `itemStyle.color` (a passthrough when nothing is\n // selected), not conditionally — dropping the key between renders\n // would let ECharts' default merge keep the previous callback alive\n // and bars would stay dimmed forever after an external clear. Always\n // emitting lets normal merge swap the callback in place, no\n // `replaceMerge` and no entry-animation flash on selection on/off.\n const dimItemStyle = {\n color: (params: CallbackDataParams) => {\n const base = 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\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 // Per-series `color` override: ECharts sets `params.color` from\n // `series[i].color` when resolving styles, so the dim callback\n // above keeps working — it just dims the user's colour rather\n // than the palette default.\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 'name', y: 'value' },\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: {\n ...baseGrid,\n bottom: gridBottom,\n },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return liveFormatter ? liveFormatter(value) : String(value)\n },\n },\n } as EChartsOption['yAxis'],\n tooltip: {\n ...baseTooltip,\n formatter: buildBarTooltipFormatter(liveFormatter, liveLabelFormatter),\n },\n } as EChartsOption\n }\n}\n\nfunction buildBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as { name?: string | number; value?: number }\n const raw = row?.value\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 : (item.name ?? '')\n return { name: String(name), seriesName, marker, value: formattedValue }\n })\n}\n","import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n grid: {\n display: 'flex',\n justifyContent: 'space-between',\n flex: '1 1 auto',\n alignItems: 'flex-end',\n width: '100%',\n },\n bar: {\n flex: 1,\n maxWidth: ({ spacing }) => spacing(12),\n '& + &': {\n marginLeft: ({ spacing }) => spacing(1),\n },\n },\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n height: ({ spacing }) => spacing(5),\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(1.5),\n },\n} satisfies Record<string, SxProps<Theme>>\n\nconst BAR_HEIGHTS = ['20%', '40%', '60%', '20%', '80%'] as const\n\n/**\n * Loading state for the Bar widget. Mirrors a bar chart's silhouette — five\n * vertical bars at staggered heights anchored to the bottom, plus a legend\n * stub — so the skeleton reads as \"a bar chart\" rather than a generic list.\n */\nexport function BarSkeleton() {\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {BAR_HEIGHTS.map((height, i) => (\n <Skeleton\n key={`bar-${i}`}\n sx={styles.bar}\n variant='rectangular'\n height={height}\n />\n ))}\n </Box>\n <Box sx={styles.legend}>\n {[0, 1].map((i) => (\n <Box key={`legend-${i}`} sx={styles.legendItem}>\n <Skeleton variant='circular' width={8} height={8} />\n <Skeleton width={48} height={8} />\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n","import {\n buildCsvDownloadItem,\n buildPngDownloadItem,\n type DownloadItem,\n} from '../actions/download'\nimport type { BarWidgetData } from './types'\n\nexport interface BarDownloadConfigArgs {\n filename: string\n getData: () => BarWidgetData\n /**\n * Optional getter for the widget's capture element (registered by\n * `Widget.State` on its success path). When provided, a PNG item is\n * prepended to the returned list. Wire it to\n * `() => getCaptureEl(id)`.\n */\n getCaptureEl?: () => HTMLElement | null\n /** PNG `pixelRatio` (default 2). */\n pngPixelRatio?: number\n /** PNG `backgroundColor` (default transparent). */\n pngBackgroundColor?: string | null\n}\n\n/**\n * Builds download items for the Bar widget. Always includes a CSV item\n * with one `name,value` block per series, separated by an empty row when\n * there are multiple. When `getCaptureEl` is supplied, also prepends a PNG\n * item that rasterises the captured element via `html2canvas`.\n */\nexport function createBarDownloadConfig(\n args: BarDownloadConfigArgs,\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 buildCsvDownloadItem({\n filename: args.filename,\n getRows: () => {\n const data = args.getData()\n const rows: unknown[][] = []\n for (const [i, series] of data.entries()) {\n if (i > 0) rows.push([])\n rows.push(['name', 'value'])\n for (const d of series) rows.push([d.name, d.value])\n }\n return rows\n },\n }),\n )\n return items\n}\n"],"names":["barOptions","theme","formatter","labelFormatter","niceMin","niceMax","grid","left","parseInt","spacing","top","right","buildGridConfig","containLabel","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","textStyle","color","common","white","fontSize","fontFamily","typography","caption","axisPointer","type","position","createTooltipPositioner","buildBarTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","v","String","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","createBarOptionFactory","options","optionsOverride","series","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","baseLegend","baseGrid","baseTooltip","baseYAxis","seriesTemplates","broadcastTemplate","liveFormatter","liveLabelFormatter","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","name","has","echarts","modifyAlpha","map","s","source","_","i","template","overrideColor","resolveThemeColor","datasetIndex","encode","x","y","barMaxWidth","emphasis","focus","itemStyle","createTooltipFormatter","item","raw","formattedValue","marker","seriesName","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","bar","maxWidth","marginLeft","legendItem","BAR_HEIGHTS","BarSkeleton","$","_c","t0","Symbol","for","jsx","Box","_temp","t1","_temp2","i_0","jsxs","Skeleton","createBarDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","buildCsvDownloadItem","getRows","getData","rows","entries","d"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bar.js","sources":["../../src/widgets-v2/bar/options.ts","../../src/widgets-v2/bar/skeleton.tsx","../../src/widgets-v2/bar/download.tsx"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildAxisLabelStyle,\n buildGridConfig,\n buildLegendConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport { ZOOM_LAYOUT } from '../actions/zoom-toggle'\nimport type { OptionFactory } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n BarEChartsOption,\n BarOptionFactoryInput,\n BarOptionsInput,\n BarWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a bar widget — axes, grid,\n * tooltip styling, themed legend. Intentionally data-agnostic: no series,\n * no dataset, no `legend.show` (those depend on data and are added by the\n * option factory's merge phase). This separation is what lets data-side\n * pipeline transforms (Searcher, RelativeData) drive the rendered chart —\n * the merge happens at render time inside the Echart bridge.\n *\n * Styling matches the v1 `barConfig` look-and-feel: minimal axes (only\n * min/max y-labels rendered inside the plot via `niceNum`), themed tooltip,\n * scroll legend, and CARTO color palette. The y-axis min/max + label\n * formatter and the tooltip formatter are wired here for the no-data case;\n * {@link createBarOptionFactory} re-derives them at fusion time so reactive\n * formatter changes (RelativeData) and stack templates (StackToggle) flow\n * through to the chart.\n */\nexport function barOptions({\n theme,\n formatter,\n labelFormatter,\n}: BarOptionsInput): BarEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1).\n let niceMin = 0\n let niceMax = 1\n\n return {\n grid: {\n left: parseInt(theme.spacing(1)),\n top: parseInt(theme.spacing(3)),\n right: parseInt(theme.spacing(1)),\n // Default: no legend. Merger bumps this when there are >1 series.\n ...buildGridConfig(false, theme),\n containLabel: true,\n },\n tooltip: {\n trigger: 'axis',\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 axisPointer: { type: 'line' },\n position: createTooltipPositioner(theme),\n formatter: buildBarTooltipFormatter(formatter, labelFormatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count.\n legend: {\n ...buildLegendConfig({ hasLegend: false, labelFormatter }),\n },\n axisPointer: { lineStyle: { color: theme.palette.grey[400] } },\n color: [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n xAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n ...buildAxisLabelStyle(theme),\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n margin: 0,\n hideOverlap: true,\n ...(labelFormatter && {\n formatter: (v: string | number) => String(labelFormatter(v)),\n }),\n },\n },\n yAxis: {\n type: 'value',\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\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 axisLabel: {\n ...buildAxisLabelStyle(theme),\n margin: parseInt(theme.spacing(1)),\n show: true,\n showMaxLabel: true,\n showMinLabel: true,\n verticalAlign: 'bottom',\n inside: true,\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n } as BarEChartsOption\n}\n\n/**\n * Returns the bar widget's {@link OptionFactory} — a single closure that\n * handles BOTH option-construction phases:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link barOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store; configTransforms (StackToggle /\n * ZoomToggle / BrushToggle) then mutate it via the pipeline middleware.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`BarWidgetData`) into the option via the dataset API: one dataset\n * per series, each series referencing its dataset by index, encoded\n * by `name` (x) and `value` (y). Spreads any series-template fields\n * already on the incoming option (e.g. `{ stack: 'total' }` from\n * `addStack`) into every emitted series so configTransforms compose\n * end-to-end. Reactive `ctx.formatter` / `ctx.labelFormatter` drive\n * the y-axis min/max-only label and the tooltip formatter at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n *\n * Stable identity when the inputs don't change (consumers should wrap the\n * call in `useMemo` keyed on the same inputs).\n */\nexport function createBarOptionFactory(\n options: BarOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride } = options\n const series = options.series\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 // Structural phase: Provider seeds rawOptions with this branch. No data\n // is read; we just emit the theme-aware base (optionally with override).\n if (option == null) {\n const structural = barOptions({ 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 BarWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n const hasLegend = seriesArr.length > 1\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 baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\n : {}\n\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n\n // Reactive (live store) formatters from ctx — distinct from the\n // closure-time `formatter` / `labelFormatter` captured for the\n // structural-build branch above. RelativeData can install a percent\n // formatter on the store after the factory was constructed; the merge\n // phase reads `ctx` to pick that up.\n const liveFormatter = ctx?.formatter\n const liveLabelFormatter = ctx?.labelFormatter\n\n // Closure shared between the yAxis min/max callbacks and the label\n // formatter, so only the rounded extents are labelled (matches v1).\n // Delegating the extent to ECharts (rather than precomputing scalars\n // from the raw data) is what keeps stacked bars inside the plot: when\n // StackToggle marks the series, ECharts feeds the *post-stack* extent\n // to these callbacks, so `niceNum` rounds the stacked total instead of\n // a single series.\n let niceMin = 0\n let niceMax = 1\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push the\n // slider above the legend (if any) and reserve room in the grid below.\n const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)\n const fallbackBottom =\n typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24\n const baseBottom = hasLegend ? 56 : fallbackBottom\n const gridBottom = dataZoomLayout\n ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap\n : baseBottom\n\n // When a selection is active, dim non-selected bars by routing the\n // resolved palette color through `modifyAlpha`. Per-row `itemStyle` on\n // dataset object-rows is silently ignored when `series.encode` is in\n // play — the callback approach is the standard ECharts pattern for\n // per-data styling derived from a dataset.\n //\n // We *always* emit `itemStyle.color` (a passthrough when nothing is\n // selected), not conditionally — dropping the key between renders\n // would let ECharts' default merge keep the previous callback alive\n // and bars would stay dimmed forever after an external clear. Always\n // emitting lets normal merge swap the callback in place, no\n // `replaceMerge` and no entry-animation flash on selection on/off.\n const dimItemStyle = {\n color: (params: CallbackDataParams) => {\n const base = 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\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 // Per-series `color` override: ECharts sets `params.color` from\n // `series[i].color` when resolving styles, so the dim callback\n // above keeps working — it just dims the user's colour rather\n // than the palette default.\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 'name', y: 'value' },\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: {\n ...baseGrid,\n bottom: gridBottom,\n },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return liveFormatter ? liveFormatter(value) : String(value)\n },\n },\n } as EChartsOption['yAxis'],\n tooltip: {\n ...baseTooltip,\n formatter: buildBarTooltipFormatter(liveFormatter, liveLabelFormatter),\n },\n } as EChartsOption\n }\n}\n\nfunction buildBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as { name?: string | number; value?: number }\n const raw = row?.value\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 : (item.name ?? '')\n return { name: String(name), seriesName, marker, value: formattedValue }\n })\n}\n","import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n grid: {\n display: 'flex',\n justifyContent: 'space-between',\n flex: '1 1 auto',\n alignItems: 'flex-end',\n width: '100%',\n },\n bar: {\n flex: 1,\n maxWidth: ({ spacing }) => spacing(12),\n '& + &': {\n marginLeft: ({ spacing }) => spacing(1),\n },\n },\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n height: ({ spacing }) => spacing(5),\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(1.5),\n },\n} satisfies Record<string, SxProps<Theme>>\n\nconst BAR_HEIGHTS = ['20%', '40%', '60%', '20%', '80%'] as const\n\n/**\n * Loading state for the Bar widget. Mirrors a bar chart's silhouette — five\n * vertical bars at staggered heights anchored to the bottom, plus a legend\n * stub — so the skeleton reads as \"a bar chart\" rather than a generic list.\n */\nexport function BarSkeleton() {\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {BAR_HEIGHTS.map((height, i) => (\n <Skeleton\n key={`bar-${i}`}\n sx={styles.bar}\n variant='rectangular'\n height={height}\n />\n ))}\n </Box>\n <Box sx={styles.legend}>\n {[0, 1].map((i) => (\n <Box key={`legend-${i}`} sx={styles.legendItem}>\n <Skeleton variant='circular' width={8} height={8} />\n <Skeleton width={48} height={8} />\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n","import {\n buildCsvDownloadItem,\n buildPngDownloadItem,\n type DownloadItem,\n} from '../actions/download'\nimport type { BarWidgetData } from './types'\n\nexport interface BarDownloadConfigArgs {\n filename: string\n getData: () => BarWidgetData\n /**\n * Optional getter for the widget's capture element (registered by\n * `Widget.State` on its success path). When provided, a PNG item is\n * prepended to the returned list. Wire it to\n * `() => getCaptureEl(id)`.\n */\n getCaptureEl?: () => HTMLElement | null\n /** PNG `pixelRatio` (default 2). */\n pngPixelRatio?: number\n /** PNG `backgroundColor` (default transparent). */\n pngBackgroundColor?: string | null\n}\n\n/**\n * Builds download items for the Bar widget. Always includes a CSV item\n * with one `name,value` block per series, separated by an empty row when\n * there are multiple. When `getCaptureEl` is supplied, also prepends a PNG\n * item that rasterises the captured element via `html2canvas`.\n */\nexport function createBarDownloadConfig(\n args: BarDownloadConfigArgs,\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 buildCsvDownloadItem({\n filename: args.filename,\n getRows: () => {\n const data = args.getData()\n const rows: unknown[][] = []\n for (const [i, series] of data.entries()) {\n if (i > 0) rows.push([])\n rows.push(['name', 'value'])\n for (const d of series) rows.push([d.name, d.value])\n }\n return rows\n },\n }),\n )\n return items\n}\n"],"names":["barOptions","theme","formatter","labelFormatter","niceMin","niceMax","grid","left","parseInt","spacing","top","right","buildGridConfig","containLabel","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","textStyle","color","common","white","fontSize","fontFamily","typography","caption","axisPointer","type","position","createTooltipPositioner","buildBarTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","buildAxisLabelStyle","margin","hideOverlap","v","String","yAxis","min","extent","niceNum","max","splitLine","black","divider","showMaxLabel","showMinLabel","verticalAlign","inside","value","createBarOptionFactory","options","optionsOverride","series","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","baseLegend","baseGrid","baseTooltip","baseYAxis","seriesTemplates","broadcastTemplate","liveFormatter","liveLabelFormatter","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","name","has","echarts","modifyAlpha","map","s","source","_","i","template","overrideColor","resolveThemeColor","datasetIndex","encode","x","y","barMaxWidth","emphasis","focus","itemStyle","createTooltipFormatter","item","raw","formattedValue","marker","seriesName","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","bar","maxWidth","marginLeft","legendItem","BAR_HEIGHTS","BarSkeleton","$","_c","t0","Symbol","for","jsx","Box","_temp","t1","_temp2","i_0","jsxs","Skeleton","createBarDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","buildCsvDownloadItem","getRows","getData","rows","entries","d"],"mappings":"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"}
|