@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,14 +1,14 @@
1
- import * as Z from "echarts";
2
- import { n as k, d as G, g as z, c as E, f as R } from "../option-builders-F-c9ELi1.js";
3
- import { jsx as b, jsxs as _ } from "react/jsx-runtime";
4
- import { c as W } from "react/compiler-runtime";
5
- import { Skeleton as v, Box as A } from "@mui/material";
1
+ import * as G from "echarts";
2
+ import { n as L, d as z, g as E, c as R, f as W } from "../option-builders-F-c9ELi1.js";
3
+ import { jsx as b, jsxs as $ } from "react/jsx-runtime";
4
+ import { c as Y } from "react/compiler-runtime";
5
+ import { Skeleton as k, Box as A } from "@mui/material";
6
6
  import "../widget-store-Bw5zRUGg.js";
7
7
  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";
@@ -20,14 +20,14 @@ import "zustand";
20
20
  import "zustand/vanilla";
21
21
  import "zustand/middleware";
22
22
  import "zustand/react/shallow";
23
- import { Z as T } from "../transforms-Cdx4fkU5.js";
24
- import { m as Y } from "../merge-options-DCkkHZIf.js";
25
- import { p as q } from "../data-zoom-layout-BH0LPwSy.js";
23
+ import { Z as O } from "../transforms-Cdx4fkU5.js";
24
+ import { m as q, r as U } from "../resolve-theme-color-BdojIw0K.js";
25
+ import { p as J } from "../data-zoom-layout-0QSptXG_.js";
26
26
  import "@mui/icons-material/FileDownload";
27
- import { a as U } from "../exports-Cx-f6m6U.js";
27
+ import { a as K } from "../exports-Cx-f6m6U.js";
28
28
  import "@mui/icons-material/ImageOutlined";
29
- import { b as J } from "../png-item-CS4z1iSH.js";
30
- function K({
29
+ import { b as Q } from "../png-item-CS4z1iSH.js";
30
+ function X({
31
31
  theme: e,
32
32
  formatter: t
33
33
  }) {
@@ -38,7 +38,7 @@ function K({
38
38
  top: parseInt(e.spacing(3)),
39
39
  right: parseInt(e.spacing(1)),
40
40
  // Default: no legend. Merger bumps this when there are >1 series.
41
- ...E(!1, e),
41
+ ...R(!1, e),
42
42
  containLabel: !0
43
43
  },
44
44
  tooltip: {
@@ -54,15 +54,15 @@ function K({
54
54
  axisPointer: {
55
55
  type: "line"
56
56
  },
57
- position: z(e),
58
- formatter: $(t)
57
+ position: E(e),
58
+ formatter: j(t)
59
59
  },
60
60
  // Legend styling baked here; `show` is toggled by the merger based on
61
61
  // series count. Histogram doesn't accept `labelFormatter` at the
62
62
  // options layer (bin labels are pre-formatted in the merger), so we
63
63
  // skip the legend `labelFormatter` argument too.
64
64
  legend: {
65
- ...G({
65
+ ...z({
66
66
  hasLegend: !1
67
67
  })
68
68
  },
@@ -88,8 +88,8 @@ function K({
88
88
  },
89
89
  yAxis: {
90
90
  type: "value",
91
- min: (i) => (a = i.min < 0 ? k(i.min) : 0, a),
92
- max: (i) => (o = i.max <= 0 ? 1 : k(i.max), o),
91
+ min: (i) => (a = i.min < 0 ? L(i.min) : 0, a),
92
+ max: (i) => (o = i.max <= 0 ? 1 : L(i.max), o),
93
93
  axisLine: {
94
94
  show: !1
95
95
  },
@@ -116,26 +116,26 @@ function K({
116
116
  }
117
117
  };
118
118
  }
119
- function Te(e) {
119
+ function _e(e) {
120
120
  const {
121
121
  theme: t,
122
122
  formatter: a,
123
123
  ticks: o,
124
- seriesNames: i,
124
+ series: i,
125
125
  labelFormatter: l,
126
126
  selection: s
127
127
  } = e, p = e.optionsOverride, n = s && s.length > 0 ? new Set(s) : null, m = [];
128
128
  for (let r = 0; r < o.length - 1; r++) {
129
- const u = o[r], d = o[r + 1], g = `${O(u)}–${O(d)}`;
129
+ const u = o[r], d = o[r + 1], g = `${_(u)}–${_(d)}`;
130
130
  m.push(l ? l(g) : g);
131
131
  }
132
132
  return (r, u, d) => {
133
133
  if (r == null) {
134
- const c = K({
134
+ const c = X({
135
135
  theme: t,
136
136
  formatter: a
137
137
  });
138
- return p ? Y(c, p) : c;
138
+ return p ? q(c, p) : c;
139
139
  }
140
140
  const g = Array.isArray(u) ? u : [];
141
141
  if (g.length === 0 || m.length === 0)
@@ -144,13 +144,13 @@ function Te(e) {
144
144
  dataset: [],
145
145
  series: []
146
146
  };
147
- const y = g.length > 1, x = Array.isArray(r.series) ? r.series : [], j = x[0] ?? {}, C = typeof r.yAxis == "object" && !Array.isArray(r.yAxis) ? r.yAxis : {}, S = typeof r.grid == "object" && !Array.isArray(r.grid) ? r.grid : {}, D = typeof r.tooltip == "object" && !Array.isArray(r.tooltip) ? r.tooltip : {}, H = typeof r.legend == "object" && !Array.isArray(r.legend) ? r.legend : {}, I = d?.formatter, {
147
+ const y = g.length > 1, x = Array.isArray(r.series) ? r.series : [], D = x[0] ?? {}, C = typeof r.yAxis == "object" && !Array.isArray(r.yAxis) ? r.yAxis : {}, S = typeof r.grid == "object" && !Array.isArray(r.grid) ? r.grid : {}, H = typeof r.tooltip == "object" && !Array.isArray(r.tooltip) ? r.tooltip : {}, V = typeof r.legend == "object" && !Array.isArray(r.legend) ? r.legend : {}, I = d?.formatter, {
148
148
  niceMinVal: F,
149
149
  niceMaxVal: M
150
- } = Q(g), L = q(r.dataZoom, y), V = typeof S.bottom == "number" ? S.bottom : 24, N = y ? 56 : V, B = L ? N + T.sliderHeight + T.sliderGap : N, P = {
150
+ } = ee(g), v = J(r.dataZoom, y), B = typeof S.bottom == "number" ? S.bottom : 24, T = y ? 56 : B, P = v ? T + O.sliderHeight + O.sliderGap : T, Z = {
151
151
  color: (c) => {
152
152
  const f = c.color;
153
- return n ? n.has(c.dataIndex) ? f : Z.color.modifyAlpha(f, 0.15) : f;
153
+ return n ? n.has(c.dataIndex) ? f : G.color.modifyAlpha(f, 0.15) : f;
154
154
  }
155
155
  };
156
156
  return {
@@ -159,12 +159,12 @@ function Te(e) {
159
159
  source: m.map((f, h) => [f, c[h] ?? 0])
160
160
  })),
161
161
  series: g.map((c, f) => {
162
- const h = x[f] ?? j;
162
+ const h = x[f] ?? D, N = U(t, i?.[f]?.color);
163
163
  return {
164
164
  ...typeof h == "object" ? h : {},
165
165
  type: "bar",
166
166
  datasetIndex: f,
167
- name: i?.[f] ?? `Series ${f + 1}`,
167
+ name: i?.[f]?.name ?? `Series ${f + 1}`,
168
168
  encode: {
169
169
  x: 0,
170
170
  y: 1
@@ -173,19 +173,22 @@ function Te(e) {
173
173
  emphasis: {
174
174
  focus: "series"
175
175
  },
176
- itemStyle: P
176
+ itemStyle: Z,
177
+ ...N ? {
178
+ color: N
179
+ } : {}
177
180
  };
178
181
  }),
179
182
  legend: {
180
- ...H,
183
+ ...V,
181
184
  show: y
182
185
  },
183
186
  grid: {
184
187
  ...S,
185
- bottom: B
188
+ bottom: P
186
189
  },
187
- ...L ? {
188
- dataZoom: L
190
+ ...v ? {
191
+ dataZoom: v
189
192
  } : {},
190
193
  yAxis: {
191
194
  ...C,
@@ -197,14 +200,14 @@ function Te(e) {
197
200
  }
198
201
  },
199
202
  tooltip: {
200
- ...D,
201
- formatter: $(I)
203
+ ...H,
204
+ formatter: j(I)
202
205
  }
203
206
  };
204
207
  };
205
208
  }
206
- function $(e) {
207
- return R((t) => {
209
+ function j(e) {
210
+ return W((t) => {
208
211
  const o = t.value?.[1], i = typeof o == "number" && e ? e(o) : o ?? "", l = typeof t.marker == "string" ? t.marker : "", s = t.seriesName ? `${t.seriesName}: ` : "";
209
212
  return {
210
213
  name: String(t.name ?? ""),
@@ -214,17 +217,17 @@ function $(e) {
214
217
  };
215
218
  });
216
219
  }
217
- function Q(e) {
220
+ function ee(e) {
218
221
  let t = -1 / 0;
219
222
  for (const a of e)
220
223
  for (const o of a)
221
224
  typeof o != "number" || !Number.isFinite(o) || o > t && (t = o);
222
225
  return {
223
226
  niceMinVal: 0,
224
- niceMaxVal: t <= 0 ? 1 : k(t)
227
+ niceMaxVal: t <= 0 ? 1 : L(t)
225
228
  };
226
229
  }
227
- function O(e) {
230
+ function _(e) {
228
231
  return Number.isInteger(e) ? String(e) : Number(e.toFixed(2)).toString();
229
232
  }
230
233
  const w = {
@@ -264,13 +267,13 @@ const w = {
264
267
  spacing: e
265
268
  }) => e(1.5)
266
269
  }
267
- }, X = (e) => ({
270
+ }, te = (e) => ({
268
271
  flex: 1,
269
272
  height: `${e}%`,
270
273
  minWidth: 8
271
274
  });
272
- function Oe(e) {
273
- const t = W(15), {
275
+ function $e(e) {
276
+ const t = Y(15), {
274
277
  bins: a
275
278
  } = e, o = a === void 0 ? 12 : a;
276
279
  let i, l, s, p, n;
@@ -281,31 +284,31 @@ function Oe(e) {
281
284
  const x = y / Math.max(1, o - 1);
282
285
  return Math.round(20 + 80 * Math.exp(-((x - 0.5) ** 2) * 8));
283
286
  });
284
- l = A, n = w.container, i = A, s = w.grid, p = d.map(te), t[0] = o, t[1] = i, t[2] = l, t[3] = s, t[4] = p, t[5] = n;
287
+ l = A, n = w.container, i = A, s = w.grid, p = d.map(oe), t[0] = o, t[1] = i, t[2] = l, t[3] = s, t[4] = p, t[5] = n;
285
288
  } else
286
289
  i = t[1], l = t[2], s = t[3], p = t[4], n = t[5];
287
290
  let m;
288
291
  t[6] !== i || t[7] !== s || t[8] !== p ? (m = /* @__PURE__ */ b(i, { sx: s, children: p }), t[6] = i, t[7] = s, t[8] = p, t[9] = m) : m = t[9];
289
292
  let r;
290
- t[10] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (r = /* @__PURE__ */ b(A, { sx: w.legend, children: [0, 1].map(ee) }), t[10] = r) : r = t[10];
293
+ t[10] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (r = /* @__PURE__ */ b(A, { sx: w.legend, children: [0, 1].map(re) }), t[10] = r) : r = t[10];
291
294
  let u;
292
- return t[11] !== l || t[12] !== n || t[13] !== m ? (u = /* @__PURE__ */ _(l, { sx: n, children: [
295
+ return t[11] !== l || t[12] !== n || t[13] !== m ? (u = /* @__PURE__ */ $(l, { sx: n, children: [
293
296
  m,
294
297
  r
295
298
  ] }), t[11] = l, t[12] = n, t[13] = m, t[14] = u) : u = t[14], u;
296
299
  }
297
- function ee(e) {
298
- return /* @__PURE__ */ _(A, { sx: w.legendItem, children: [
299
- /* @__PURE__ */ b(v, { variant: "circular", width: 8, height: 8 }),
300
- /* @__PURE__ */ b(v, { width: 48, height: 8 })
300
+ function re(e) {
301
+ return /* @__PURE__ */ $(A, { sx: w.legendItem, children: [
302
+ /* @__PURE__ */ b(k, { variant: "circular", width: 8, height: 8 }),
303
+ /* @__PURE__ */ b(k, { width: 48, height: 8 })
301
304
  ] }, `legend-${e}`);
302
305
  }
303
- function te(e, t) {
304
- return /* @__PURE__ */ b(v, { variant: "rectangular", sx: X(e) }, `bar-${t}`);
306
+ function oe(e, t) {
307
+ return /* @__PURE__ */ b(k, { variant: "rectangular", sx: te(e) }, `bar-${t}`);
305
308
  }
306
- function _e(e) {
309
+ function je(e) {
307
310
  const t = [];
308
- return e.getCaptureEl && t.push(J({
311
+ return e.getCaptureEl && t.push(Q({
309
312
  filename: e.filename,
310
313
  getCaptureEl: e.getCaptureEl,
311
314
  pixelRatio: e.pngPixelRatio,
@@ -323,7 +326,7 @@ function _e(e) {
323
326
  for (let r = 0; r < i; r++) m.push(a[r]?.[n] ?? 0);
324
327
  s.push(m);
325
328
  }
326
- const p = U(s);
329
+ const p = K(s);
327
330
  return Promise.resolve({
328
331
  url: p.url,
329
332
  filename: `${e.filename}.csv`,
@@ -332,19 +335,19 @@ function _e(e) {
332
335
  }
333
336
  }), t;
334
337
  }
335
- const $e = (e) => Array.isArray(e) ? e.map((t) => {
336
- if (!re(t)) return t;
338
+ const De = (e) => Array.isArray(e) ? e.map((t) => {
339
+ if (!ie(t)) return t;
337
340
  const a = t.reduce((o, i) => o + Math.abs(i), 0);
338
341
  return a <= 0 ? t : t.map((o) => o / a * 100);
339
342
  }) : e;
340
- function re(e) {
343
+ function ie(e) {
341
344
  return Array.isArray(e) ? e.every((t) => typeof t == "number" && Number.isFinite(t)) : !1;
342
345
  }
343
346
  export {
344
- Oe as HistogramSkeleton,
345
- _e as createHistogramDownloadConfig,
346
- Te as createHistogramOptionFactory,
347
- K as histogramOptions,
348
- $e as toRelativeHistogramData
347
+ $e as HistogramSkeleton,
348
+ je as createHistogramDownloadConfig,
349
+ _e as createHistogramOptionFactory,
350
+ X as histogramOptions,
351
+ De as toRelativeHistogramData
349
352
  };
350
353
  //# sourceMappingURL=histogram.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"histogram.js","sources":["../../src/widgets-v2/histogram/options.ts","../../src/widgets-v2/histogram/skeleton.tsx","../../src/widgets-v2/histogram/download.ts","../../src/widgets-v2/histogram/transforms.ts"],"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 } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n HistogramEChartsOption,\n HistogramOptionFactoryInput,\n HistogramOptionsInput,\n HistogramWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a histogram widget — axes,\n * grid, tooltip, value-axis label formatter, themed legend. Mirrors\n * {@link import('../bar/options').barOptions} so the two widgets share v1\n * look-and-feel: themed dark tooltip with positioner, CARTO color palette,\n * structural legend (`show` toggled by the merger based on series count),\n * y-axis labels rendered inside the plot via the `niceNum` closure pattern.\n *\n * Intentional deviations from bar (histogram-specific):\n * - **No `xAxis.axisLabel.formatter`.** Bin labels are pre-formatted in\n * the merger via `formatNumber(lo)–formatNumber(hi)` and optionally\n * the consumer's `labelFormatter`. The strings on the axis are\n * already display-ready, so there's nothing to post-format here.\n * - **Tooltip formatter reads the array-tuple row shape.** The dataset\n * uses positional `encode: { x: 0, y: 1 }`, so `item.value` comes in\n * as `[binLabel, count]` rather than bar's `{ name, value }` object.\n *\n * Intentionally data-agnostic: no series, no dataset, no x-axis category\n * data (those depend on data + ticks and are added by the option factory's\n * merge phase via {@link createHistogramOptionFactory}).\n */\nexport function histogramOptions({\n theme,\n formatter,\n}: HistogramOptionsInput): HistogramEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1 + bar).\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: buildHistogramTooltipFormatter(formatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count. Histogram doesn't accept `labelFormatter` at the\n // options layer (bin labels are pre-formatted in the merger), so we\n // skip the legend `labelFormatter` argument too.\n legend: {\n ...buildLegendConfig({ hasLegend: false }),\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 },\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 HistogramEChartsOption\n}\n\n/**\n * Returns the histogram widget's {@link OptionFactory} — one closure that\n * owns BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link histogramOptions}, optionally merging\n * the consumer-supplied `optionsOverride`. Called once by Provider to\n * seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`HistogramWidgetData` — `number[][]`) into the option via the\n * dataset API. Each series gets its own dataset of `[binLabel, count]`\n * pairs derived from `ticks`; series reference their dataset by\n * `datasetIndex` and are encoded by column position. Reactive\n * `ctx.formatter` (driven by RelativeData → `%`) plus `niceMin`/`niceMax`\n * are re-derived here so the y-axis label formatter and the tooltip\n * pick up live store values, mirroring bar.\n */\nexport function createHistogramOptionFactory(\n options: HistogramOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, ticks, seriesNames, labelFormatter, selection } =\n options\n const optionsOverride = options.optionsOverride\n const selectionSet =\n selection && selection.length > 0 ? new Set<number>(selection) : null\n\n const binLabels: string[] = []\n for (let i = 0; i < ticks.length - 1; i++) {\n const lo = ticks[i]!\n const hi = ticks[i + 1]!\n const raw = `${formatNumber(lo)}–${formatNumber(hi)}`\n binLabels.push(labelFormatter ? labelFormatter(raw) : raw)\n }\n\n return (option, data, ctx) => {\n if (option == null) {\n const structural = histogramOptions({ theme, formatter })\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: HistogramWidgetData = Array.isArray(data)\n ? (data as HistogramWidgetData)\n : []\n if (seriesArr.length === 0 || binLabels.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n\n const hasLegend = seriesArr.length > 1\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\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 baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n // Reactive (live store) formatter from ctx — distinct from the\n // closure-time `formatter` captured for the structural-build branch\n // above. RelativeData can install a percent formatter on the store\n // after the factory was constructed; the merge phase reads `ctx` to\n // pick that up.\n const liveFormatter = ctx?.formatter\n\n const { niceMinVal, niceMaxVal } = computeHistogramNiceBounds(seriesArr)\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push\n // the slider above the legend (if any) and reserve room in the grid.\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 // Dim non-selected bins via `series.itemStyle.color`. Per-row\n // `itemStyle` on dataset sources is silently ignored when\n // `series.encode` is in play.\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 bins 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 return selectionSet.has(params.dataIndex)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n },\n }\n\n return {\n ...option,\n dataset: seriesArr.map((counts) => ({\n source: binLabels.map(\n (label, i) => [label, counts[i] ?? 0] as [string, number],\n ),\n })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: seriesNames?.[i] ?? `Series ${i + 1}`,\n encode: { x: 0, y: 1 },\n barCategoryGap: '0%',\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: { ...baseGrid, bottom: gridBottom },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: niceMinVal,\n max: niceMaxVal,\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) 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: buildHistogramTooltipFormatter(liveFormatter),\n },\n } as EChartsOption\n }\n}\n\n/**\n * Tooltip formatter for the histogram's positional `[binLabel, count]`\n * row shape. ECharts surfaces the x-axis category through `item.name`\n * (already pre-formatted by the bin-label generator), and `item.value`\n * comes in as the array tuple — distinct from bar's `{ name, value }`\n * object row.\n */\nfunction buildHistogramTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as [string, number] | undefined\n const raw = row?.[1]\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 return {\n name: String(item.name ?? ''),\n seriesName,\n marker,\n value: formattedValue,\n }\n })\n}\n\nfunction computeHistogramNiceBounds(seriesArr: HistogramWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let max = -Infinity\n for (const counts of seriesArr) {\n for (const v of counts) {\n if (typeof v !== 'number' || !Number.isFinite(v)) continue\n if (v > max) max = v\n }\n }\n return {\n niceMinVal: 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\nfunction formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n)\n return Number(n.toFixed(2)).toString()\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 alignItems: 'flex-end',\n flex: '1 1 auto',\n gap: 0.5,\n width: '100%',\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 barSx = (height: number): SxProps<Theme> => ({\n flex: 1,\n height: `${height}%`,\n minWidth: 8,\n})\n\nexport interface HistogramSkeletonProps {\n bins?: number\n}\n\n/**\n * Loading state for the Histogram widget. Mirrors Bar's skeleton structure\n * — a grid of bars (bin-shaped silhouette, anchored to the bottom) plus a\n * legend stub — so the placeholder reads consistently with Bar.\n */\nexport function HistogramSkeleton({ bins = 12 }: HistogramSkeletonProps) {\n // Sample heights mimicking a typical bell-shaped distribution.\n const heights = Array.from({ length: bins }, (_, i) => {\n const t = i / Math.max(1, bins - 1)\n return Math.round(20 + 80 * Math.exp(-((t - 0.5) ** 2) * 8))\n })\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {heights.map((h, i) => (\n <Skeleton key={`bar-${i}`} variant='rectangular' sx={barSx(h)} />\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 buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { HistogramWidgetData } from './types'\n\n/**\n * Download menu items for histograms. Always includes a CSV item with\n * `bin_low, bin_high, series_1_count, series_2_count, …` columns (one row\n * per bin). When `getCaptureEl` is supplied, prepends a PNG item that\n * rasterises the captured element via `html2canvas`.\n */\nexport function createHistogramDownloadConfig(args: {\n filename: string\n getData: () => HistogramWidgetData\n getTicks: () => readonly number[]\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 ticks = args.getTicks()\n const seriesCount = data.length\n const header: unknown[] = ['bin_low', 'bin_high']\n for (let i = 0; i < seriesCount; i++) {\n header.push(args.seriesNames?.[i] ?? `series_${i + 1}`)\n }\n const rows: unknown[][] = [header]\n for (let bin = 0; bin < Math.max(0, ticks.length - 1); bin++) {\n const row: unknown[] = [ticks[bin], ticks[bin + 1]]\n for (let s = 0; s < seriesCount; s++) row.push(data[s]?.[bin] ?? 0)\n rows.push(row)\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","/**\n * Histogram-specific `RelativeData` transform. Histogram data is\n * `number[][]` — each series is a flat list of bin counts. This\n * rewrites each count to its share of the series total (0–100), so\n * pairing with `createPercentFormatter` renders the y-axis as\n * percentages.\n *\n * Pass to `<Widget.RelativeData transform={toRelativeHistogramData} />`.\n *\n * The denominator is the sum of |value| across the series so mixed-sign\n * inputs produce sane signed shares-of-magnitude. A series whose total\n * magnitude is zero (all-zero or empty input) is returned unchanged so\n * a stalled or empty data set doesn't show misleading 0% values. Inputs\n * whose shape isn't `number[][]` fall through untouched (same defensive\n * shape-check pattern as the default transform).\n */\nexport const toRelativeHistogramData = (input: unknown): unknown => {\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!isFlatNumberArray(series)) return series\n const total = series.reduce((acc, v) => acc + Math.abs(v), 0)\n if (total <= 0) return series\n return series.map((v) => (v / total) * 100)\n })\n}\n\nfunction isFlatNumberArray(v: unknown): v is number[] {\n if (!Array.isArray(v)) return false\n return v.every((item) => typeof item === 'number' && Number.isFinite(item))\n}\n"],"names":["histogramOptions","theme","formatter","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","buildHistogramTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","String","createHistogramOptionFactory","options","ticks","seriesNames","labelFormatter","selection","optionsOverride","selectionSet","length","Set","binLabels","i","lo","hi","raw","formatNumber","push","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","series","seriesTemplates","broadcastTemplate","baseYAxis","baseGrid","baseTooltip","baseLegend","liveFormatter","niceMinVal","niceMaxVal","computeHistogramNiceBounds","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","has","dataIndex","echarts","modifyAlpha","map","counts","source","label","_","template","datasetIndex","name","encode","x","y","barCategoryGap","emphasis","focus","itemStyle","createTooltipFormatter","item","formattedValue","marker","seriesName","v","Number","isFinite","n","isInteger","toFixed","toString","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","legendItem","barSx","minWidth","HistogramSkeleton","t0","$","_c","bins","t1","undefined","T0","T1","t2","t3","t4","heights","from","t","Math","round","exp","Box","_temp","t5","jsx","t6","Symbol","for","_temp2","t7","i_1","jsxs","Skeleton","h","i_0","createHistogramDownloadConfig","args","items","getCaptureEl","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","getTicks","seriesCount","header","rows","bin","row","s","handle","downloadToCSV","Promise","url","revoke","toRelativeHistogramData","input","isFlatNumberArray","total","reduce","acc","abs","every"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CO,SAASA,EAAiB;AAAA,EAC/BC,OAAAA;AAAAA,EACAC,WAAAA;AACqB,GAA2B;AAGhD,MAAIC,IAAU,GACVC,IAAU;AAEd,SAAO;AAAA,IACLC,MAAM;AAAA,MACJC,MAAMC,SAASN,EAAMO,QAAQ,CAAC,CAAC;AAAA,MAC/BC,KAAKF,SAASN,EAAMO,QAAQ,CAAC,CAAC;AAAA,MAC9BE,OAAOH,SAASN,EAAMO,QAAQ,CAAC,CAAC;AAAA;AAAA,MAEhC,GAAGG,EAAgB,IAAOV,CAAK;AAAA,MAC/BW,cAAc;AAAA,IAAA;AAAA,IAEhBC,SAAS;AAAA,MACPC,SAAS;AAAA,MACTC,iBAAiBd,EAAMe,QAAQC,KAAK,GAAG;AAAA,MACvCC,aAAa;AAAA,MACbC,SAAS,CAACZ,SAASN,EAAMO,QAAQ,CAAC,CAAC,GAAGD,SAASN,EAAMO,QAAQ,CAAC,CAAC,CAAC;AAAA,MAChEY,WAAW;AAAA,QACTC,OAAOpB,EAAMe,QAAQM,OAAOC;AAAAA,QAC5BC,UAAU;AAAA,QACVC,YAAYxB,EAAMyB,WAAWC,QAAQF;AAAAA,MAAAA;AAAAA,MAEvCG,aAAa;AAAA,QAAEC,MAAM;AAAA,MAAA;AAAA,MACrBC,UAAUC,EAAwB9B,CAAK;AAAA,MACvCC,WAAW8B,EAA+B9B,CAAS;AAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMrD+B,QAAQ;AAAA,MACN,GAAGC,EAAkB;AAAA,QAAEC,WAAW;AAAA,MAAA,CAAO;AAAA,IAAA;AAAA,IAE3CP,aAAa;AAAA,MAAEQ,WAAW;AAAA,QAAEf,OAAOpB,EAAMe,QAAQC,KAAK,GAAG;AAAA,MAAA;AAAA,IAAE;AAAA,IAC3DI,OAAO,CACLpB,EAAMe,QAAQqB,UAAUC,MACxB,GAAGC,OAAOC,OACPvC,EAAMe,QACJyB,aAAaC,QAAQ,CAAA,CAC1B,CAAC;AAAA,IAEHC,OAAO;AAAA,MACLd,MAAM;AAAA,MACNe,UAAU;AAAA,QAAEC,MAAM;AAAA,MAAA;AAAA,MAClBC,UAAU;AAAA,QAAED,MAAM;AAAA,MAAA;AAAA,MAClBE,WAAW;AAAA,QACT5B,SAAS,CAACZ,SAASN,EAAMO,QAAQ,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,QAC/CwC,QAAQ;AAAA,QACRC,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,IAEFC,OAAO;AAAA,MACLrB,MAAM;AAAA,MACNsB,KAAKA,CAACC,OACJjD,IAAUiD,EAAOD,MAAM,IAAIE,EAAQD,EAAOD,GAAG,IAAI,GAC1ChD;AAAAA,MAETmD,KAAKA,CAACF,OACJhD,IAAUgD,EAAOE,OAAO,IAAI,IAAID,EAAQD,EAAOE,GAAG,GAC3ClD;AAAAA,MAETwC,UAAU;AAAA,QAAEC,MAAM;AAAA,MAAA;AAAA,MAClBC,UAAU;AAAA,QAAED,MAAM;AAAA,MAAA;AAAA,MAClBU,WAAW;AAAA,QACTV,MAAM;AAAA,QACNT,WAAW;AAAA,UAAEf,OAAOpB,EAAMe,QAAQwC,QAAQ,CAAC,KAAKvD,EAAMe,QAAQyC;AAAAA,QAAAA;AAAAA,MAAQ;AAAA,MAExEV,WAAW;AAAA,QACTvB,UAAUvB,EAAMyB,WAAWgC,kBAAkBlC;AAAAA,QAC7CC,YAAYxB,EAAMyB,WAAWgC,kBAAkBjC;AAAAA,QAC/CuB,QAAQzC,SAASN,EAAMO,QAAQ,CAAC,CAAC;AAAA,QACjCqC,MAAM;AAAA,QACNc,cAAc;AAAA,QACdC,cAAc;AAAA,QACdC,eAAe;AAAA,QACfC,QAAQ;AAAA,QACR5D,WAAWA,CAAC6D,MACNA,MAAU3D,KAAW2D,MAAU5D,KAC/B4D,MAAU,IAAU,KACjB7D,IAAYA,EAAU6D,CAAK,IAAIC,OAAOD,CAAK;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEJ;AAmBO,SAASE,GACdC,GACe;AACf,QAAM;AAAA,IAAEjE,OAAAA;AAAAA,IAAOC,WAAAA;AAAAA,IAAWiE,OAAAA;AAAAA,IAAOC,aAAAA;AAAAA,IAAaC,gBAAAA;AAAAA,IAAgBC,WAAAA;AAAAA,EAAAA,IAC5DJ,GACIK,IAAkBL,EAAQK,iBAC1BC,IACJF,KAAaA,EAAUG,SAAS,IAAI,IAAIC,IAAYJ,CAAS,IAAI,MAE7DK,IAAsB,CAAA;AAC5B,WAASC,IAAI,GAAGA,IAAIT,EAAMM,SAAS,GAAGG,KAAK;AACzC,UAAMC,IAAKV,EAAMS,CAAC,GACZE,IAAKX,EAAMS,IAAI,CAAC,GAChBG,IAAM,GAAGC,EAAaH,CAAE,CAAC,IAAIG,EAAaF,CAAE,CAAC;AACnDH,IAAAA,EAAUM,KAAKZ,IAAiBA,EAAeU,CAAG,IAAIA,CAAG;AAAA,EAC3D;AAEA,SAAO,CAACG,GAAQC,GAAMC,MAAQ;AAC5B,QAAIF,KAAU,MAAM;AAClB,YAAMG,IAAarF,EAAiB;AAAA,QAAEC,OAAAA;AAAAA,QAAOC,WAAAA;AAAAA,MAAAA,CAAW;AACxD,aAAOqE,IACFe,EACCD,GACAd,CACF,IACAc;AAAAA,IACN;AAEA,UAAME,IAAiCC,MAAMC,QAAQN,CAAI,IACpDA,IACD,CAAA;AACJ,QAAII,EAAUd,WAAW,KAAKE,EAAUF,WAAW;AACjD,aAAO;AAAA,QAAE,GAAGS;AAAAA,QAAQQ,SAAS,CAAA;AAAA,QAAIC,QAAQ,CAAA;AAAA,MAAA;AAG3C,UAAMxD,IAAYoD,EAAUd,SAAS,GAC/BmB,IAAkBJ,MAAMC,QAAQP,EAAOS,MAAM,IAAIT,EAAOS,SAAS,CAAA,GACjEE,IAAoBD,EAAgB,CAAC,KAAK,CAAA,GAC1CE,IACJ,OAAOZ,EAAOhC,SAAU,YAAY,CAACsC,MAAMC,QAAQP,EAAOhC,KAAK,IAC3DgC,EAAOhC,QACP,CAAA,GACA6C,IACJ,OAAOb,EAAO7E,QAAS,YAAY,CAACmF,MAAMC,QAAQP,EAAO7E,IAAI,IACzD6E,EAAO7E,OACP,CAAA,GACA2F,IACJ,OAAOd,EAAOrE,WAAY,YAAY,CAAC2E,MAAMC,QAAQP,EAAOrE,OAAO,IAC/DqE,EAAOrE,UACP,CAAA,GACAoF,IACJ,OAAOf,EAAOjD,UAAW,YAAY,CAACuD,MAAMC,QAAQP,EAAOjD,MAAM,IAC7DiD,EAAOjD,SACP,CAAA,GAMAiE,IAAgBd,GAAKlF,WAErB;AAAA,MAAEiG,YAAAA;AAAAA,MAAYC,YAAAA;AAAAA,IAAAA,IAAeC,EAA2Bd,CAAS,GAIjEe,IAAiBC,EAA0BrB,EAAOsB,UAAUrE,CAAS,GACrEsE,IACJ,OAAOV,EAASW,UAAW,WAAWX,EAASW,SAAS,IACpDC,IAAaxE,IAAY,KAAKsE,GAC9BG,IAAaN,IACfK,IAAaE,EAAYC,eAAeD,EAAYE,YACpDJ,GAYEK,IAAe;AAAA,MACnB3F,OAAOA,CAAC4F,MAA+B;AACrC,cAAMC,IAAOD,EAAO5F;AACpB,eAAKmD,IACEA,EAAa2C,IAAIF,EAAOG,SAAS,IACpCF,IACAG,EAAQhG,MAAMiG,YAAYJ,GAAM,IAAI,IAHdA;AAAAA,MAI5B;AAAA,IAAA;AAGF,WAAO;AAAA,MACL,GAAGhC;AAAAA,MACHQ,SAASH,EAAUgC,IAAKC,CAAAA,OAAY;AAAA,QAClCC,QAAQ9C,EAAU4C,IAChB,CAACG,GAAO9C,MAAM,CAAC8C,GAAOF,EAAO5C,CAAC,KAAK,CAAC,CACtC;AAAA,MAAA,EACA;AAAA,MACFe,QAAQJ,EAAUgC,IAAI,CAACI,GAAG/C,MAAM;AAC9B,cAAMgD,IACHhC,EAAgBhB,CAAC,KACjBiB;AACH,eAAO;AAAA,UACL,GAAI,OAAO+B,KAAa,WAAWA,IAAW,CAAA;AAAA,UAC9C/F,MAAM;AAAA,UACNgG,cAAcjD;AAAAA,UACdkD,MAAM1D,IAAcQ,CAAC,KAAK,UAAUA,IAAI,CAAC;AAAA,UACzCmD,QAAQ;AAAA,YAAEC,GAAG;AAAA,YAAGC,GAAG;AAAA,UAAA;AAAA,UACnBC,gBAAgB;AAAA,UAChBC,UAAU;AAAA,YAAEC,OAAO;AAAA,UAAA;AAAA,UACnBC,WAAWrB;AAAAA,QAAAA;AAAAA,MAEf,CAAC;AAAA,MACD/E,QAAQ;AAAA,QAAE,GAAGgE;AAAAA,QAAYpD,MAAMV;AAAAA,MAAAA;AAAAA,MAC/B9B,MAAM;AAAA,QAAE,GAAG0F;AAAAA,QAAUW,QAAQE;AAAAA,MAAAA;AAAAA,MAC7B,GAAIN,IAAiB;AAAA,QAAEE,UAAUF;AAAAA,MAAAA,IAAmB,CAAA;AAAA,MACpDpD,OAAO;AAAA,QACL,GAAG4C;AAAAA,QACH3C,KAAKgD;AAAAA,QACL7C,KAAK8C;AAAAA,QACLrD,WAAW;AAAA,UACT,GAAK+C,EAAqC/C,aAAa,CAAA;AAAA,UACvD7C,WAAWA,CAAC6D,MACNA,MAAUqC,KAAcrC,MAAUoC,KAClCpC,MAAU,IAAU,KACjBmC,IAAgBA,EAAcnC,CAAK,IAAIC,OAAOD,CAAK;AAAA,QAC5D;AAAA,MACF;AAAA,MAEFlD,SAAS;AAAA,QACP,GAAGmF;AAAAA,QACH9F,WAAW8B,EAA+BkE,CAAa;AAAA,MAAA;AAAA,IACzD;AAAA,EAEJ;AACF;AASA,SAASlE,EACP9B,GACA;AACA,SAAOoI,EAAwBC,CAAAA,MAAS;AAEtC,UAAMxD,IADMwD,EAAKxE,QACC,CAAC,GACbyE,IACJ,OAAOzD,KAAQ,YAAY7E,IAAYA,EAAU6E,CAAG,IAAKA,KAAO,IAC5D0D,IAAS,OAAOF,EAAKE,UAAW,WAAWF,EAAKE,SAAS,IACzDC,IAAaH,EAAKG,aAAa,GAAGH,EAAKG,UAAU,OAAO;AAC9D,WAAO;AAAA,MACLZ,MAAM9D,OAAOuE,EAAKT,QAAQ,EAAE;AAAA,MAC5BY,YAAAA;AAAAA,MACAD,QAAAA;AAAAA,MACA1E,OAAOyE;AAAAA,IAAAA;AAAAA,EAEX,CAAC;AACH;AAEA,SAASnC,EAA2Bd,GAGlC;AACA,MAAIjC,IAAM;AACV,aAAWkE,KAAUjC;AACnB,eAAWoD,KAAKnB;AACd,MAAI,OAAOmB,KAAM,YAAY,CAACC,OAAOC,SAASF,CAAC,KAC3CA,IAAIrF,MAAKA,IAAMqF;AAGvB,SAAO;AAAA,IACLxC,YAAY;AAAA,IACZC,YAAY9C,KAAO,IAAI,IAAID,EAAQC,CAAG;AAAA,EAAA;AAE1C;AAEA,SAAS0B,EAAa8D,GAAmB;AACvC,SAAIF,OAAOG,UAAUD,CAAC,IAAU9E,OAAO8E,CAAC,IACjCF,OAAOE,EAAEE,QAAQ,CAAC,CAAC,EAAEC,SAAAA;AAC9B;AC9UA,MAAMC,IAAS;AAAA,EACbC,WAAW;AAAA,IACTC,SAAS;AAAA,IACTC,YAAY;AAAA,IACZC,gBAAgB;AAAA,IAChBC,eAAe;AAAA,IACfC,KAAKA,CAAC;AAAA,MAAEhJ,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,CAAC;AAAA,IAC/BiJ,QAAQA,CAAC;AAAA,MAAEjJ,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,EAAE;AAAA,EAAA;AAAA,EAErCH,MAAM;AAAA,IACJ+I,SAAS;AAAA,IACTC,YAAY;AAAA,IACZK,MAAM;AAAA,IACNF,KAAK;AAAA,IACLG,OAAO;AAAA,EAAA;AAAA,EAET1H,QAAQ;AAAA,IACNmH,SAAS;AAAA,IACTC,YAAY;AAAA,IACZG,KAAKA,CAAC;AAAA,MAAEhJ,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,CAAC;AAAA,IAC/BiJ,QAAQA,CAAC;AAAA,MAAEjJ,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,CAAC;AAAA,EAAA;AAAA,EAEpCoJ,YAAY;AAAA,IACVR,SAAS;AAAA,IACTC,YAAY;AAAA,IACZG,KAAKA,CAAC;AAAA,MAAEhJ,SAAAA;AAAAA,IAAAA,MAAcA,EAAQ,GAAG;AAAA,EAAA;AAErC,GAEMqJ,IAAQA,CAACJ,OAAoC;AAAA,EACjDC,MAAM;AAAA,EACND,QAAQ,GAAGA,CAAM;AAAA,EACjBK,UAAU;AACZ;AAWO,SAAAC,GAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAA2B;AAAA,IAAAC,MAAAC;AAAAA,EAAAA,IAAAJ,GAAEG,IAAAC,MAAAC,SAAA,KAAAD;AAAS,MAAAE,GAAAC,GAAAC,GAAAC,GAAAC;AAAA,MAAAT,SAAAE,GAAA;AAE3C,UAAAQ,IAAgBnF,MAAKoF,KAAM;AAAA,MAAAnG,QAAU0F;AAAAA,IAAAA,GAAQ,CAAAxC,GAAA/C,MAAA;AAC3C,YAAAiG,IAAUjG,IAAIkG,KAAIxH,IAAK,GAAG6G,IAAO,CAAC;AAAC,aAC5BW,KAAIC,MAAO,KAAK,KAAKD,KAAIE,IAAK,GAAGH,IAAI,QAAQ,KAAK,CAAC,CAAC;AAAA,IAAC,CAC7D;AAEEN,IAAAA,IAAAU,GAAQP,IAAAxB,EAAMC,WACZmB,IAAAW,GAAQT,IAAAtB,EAAM7I,MACZoK,IAAAE,EAAOpD,IAAK2D,EAEZ,GAACjB,OAAAE,GAAAF,OAAAK,GAAAL,OAAAM,GAAAN,OAAAO,GAAAP,OAAAQ,GAAAR,OAAAS;AAAAA,EAAA;AAAAJ,IAAAA,IAAAL,EAAA,CAAA,GAAAM,IAAAN,EAAA,CAAA,GAAAO,IAAAP,EAAA,CAAA,GAAAQ,IAAAR,EAAA,CAAA,GAAAS,IAAAT,EAAA,CAAA;AAAA,MAAAkB;AAAA,EAAAlB,EAAA,CAAA,MAAAK,KAAAL,SAAAO,KAAAP,EAAA,CAAA,MAAAQ,KAHJU,IAAA,gBAAAC,EAACd,GAAA,EAAQ,IAAAE,GACNC,UAAAA,GAGH,GAAMR,OAAAK,GAAAL,OAAAO,GAAAP,OAAAQ,GAAAR,OAAAkB,KAAAA,IAAAlB,EAAA,CAAA;AAAA,MAAAoB;AAAA,EAAApB,EAAA,EAAA,MAAAqB,uBAAAC,IAAA,2BAAA,KACNF,IAAA,gBAAAD,EAACH,GAAA,EAAQ,IAAA/B,EAAMjH,mBACX,GAAG,CAAC,EAACsF,IAAKiE,EAKX,EAAA,CACH,GAAMvB,QAAAoB,KAAAA,IAAApB,EAAA,EAAA;AAAA,MAAAwB;AAAA,SAAAxB,EAAA,EAAA,MAAAM,KAAAN,UAAAS,KAAAT,EAAA,EAAA,MAAAkB,KAbRM,sBAAClB,GAAA,EAAQ,IAAAG,GACPS,UAAAA;AAAAA,IAAAA;AAAAA,IAKAE;AAAAA,EAAAA,GAQF,GAAMpB,QAAAM,GAAAN,QAAAS,GAAAT,QAAAkB,GAAAlB,QAAAwB,KAAAA,IAAAxB,EAAA,EAAA,GAdNwB;AAcM;AArBH,SAAAD,GAAAE,GAAA;AAAA,SAeG,gBAAAC,EAACV,GAAA,EAA4B,IAAA/B,EAAMU,YACjC,UAAA;AAAA,IAAA,gBAAAwB,EAACQ,KAAiB,SAAA,YAAkB,OAAA,GAAW,QAAA,GAAC;AAAA,IAChD,gBAAAR,EAACQ,GAAA,EAAgB,OAAA,IAAY,QAAA,EAAA,CAAC;AAAA,EAAA,EAAA,GAFtB,UAAUhH,CAAC,EAGrB;AAAM;AAlBT,SAAAsG,GAAAW,GAAAC,GAAA;AAAA,SAUG,gBAAAV,EAACQ,GAAA,EAAkC,SAAA,eAAkB,IAAA/B,EAAMgC,CAAC,EAAA,GAA7C,OAAOjH,CAAC,EAAsC;AAAI;AC3CpE,SAASmH,GAA8BC,GAQ3B;AACjB,QAAMC,IAAwB,CAAA;AAC9B,SAAID,EAAKE,gBACPD,EAAMhH,KACJkH,EAAqB;AAAA,IACnBC,UAAUJ,EAAKI;AAAAA,IACfF,cAAcF,EAAKE;AAAAA,IACnBG,YAAYL,EAAKM;AAAAA,IACjBvL,iBAAiBiL,EAAKO;AAAAA,EAAAA,CACvB,CACH,GAEFN,EAAMhH,KAAK;AAAA,IACTuH,IAAI;AAAA,IACJ9E,OAAO;AAAA,IACP+E,SAASA,MAAM;AACb,YAAMtH,IAAO6G,EAAKU,QAAAA,GACZvI,IAAQ6H,EAAKW,SAAAA,GACbC,IAAczH,EAAKV,QACnBoI,IAAoB,CAAC,WAAW,UAAU;AAChD,eAASjI,IAAI,GAAGA,IAAIgI,GAAahI;AAC/BiI,QAAAA,EAAO5H,KAAK+G,EAAK5H,cAAcQ,CAAC,KAAK,UAAUA,IAAI,CAAC,EAAE;AAExD,YAAMkI,IAAoB,CAACD,CAAM;AACjC,eAASE,IAAM,GAAGA,IAAMjC,KAAKxH,IAAI,GAAGa,EAAMM,SAAS,CAAC,GAAGsI,KAAO;AAC5D,cAAMC,IAAiB,CAAC7I,EAAM4I,CAAG,GAAG5I,EAAM4I,IAAM,CAAC,CAAC;AAClD,iBAASE,IAAI,GAAGA,IAAIL,GAAaK,IAAKD,CAAAA,EAAI/H,KAAKE,EAAK8H,CAAC,IAAIF,CAAG,KAAK,CAAC;AAClED,QAAAA,EAAK7H,KAAK+H,CAAG;AAAA,MACf;AACA,YAAME,IAASC,EAAcL,CAAI;AACjC,aAAOM,QAAQX,QAAQ;AAAA,QACrBY,KAAKH,EAAOG;AAAAA,QACZjB,UAAU,GAAGJ,EAAKI,QAAQ;AAAA,QAC1BkB,QAAQJ,EAAOI;AAAAA,MAAAA,CAChB;AAAA,IACH;AAAA,EAAA,CACD,GACMrB;AACT;AC3CO,MAAMsB,KAA0BA,CAACC,MACjChI,MAAMC,QAAQ+H,CAAK,IACjBA,EAAMjG,IAAI,CAAC5B,MAA6B;AAC7C,MAAI,CAAC8H,GAAkB9H,CAAM,EAAG,QAAOA;AACvC,QAAM+H,IAAQ/H,EAAOgI,OAAO,CAACC,GAAKjF,MAAMiF,IAAM9C,KAAK+C,IAAIlF,CAAC,GAAG,CAAC;AAC5D,SAAI+E,KAAS,IAAU/H,IAChBA,EAAO4B,IAAKoB,CAAAA,MAAOA,IAAI+E,IAAS,GAAG;AAC5C,CAAC,IANiCF;AASpC,SAASC,GAAkB9E,GAA2B;AACpD,SAAKnD,MAAMC,QAAQkD,CAAC,IACbA,EAAEmF,MAAOvF,CAAAA,MAAS,OAAOA,KAAS,YAAYK,OAAOC,SAASN,CAAI,CAAC,IAD5C;AAEhC;"}
1
+ {"version":3,"file":"histogram.js","sources":["../../src/widgets-v2/histogram/options.ts","../../src/widgets-v2/histogram/skeleton.tsx","../../src/widgets-v2/histogram/download.ts","../../src/widgets-v2/histogram/transforms.ts"],"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 HistogramEChartsOption,\n HistogramOptionFactoryInput,\n HistogramOptionsInput,\n HistogramWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a histogram widget — axes,\n * grid, tooltip, value-axis label formatter, themed legend. Mirrors\n * {@link import('../bar/options').barOptions} so the two widgets share v1\n * look-and-feel: themed dark tooltip with positioner, CARTO color palette,\n * structural legend (`show` toggled by the merger based on series count),\n * y-axis labels rendered inside the plot via the `niceNum` closure pattern.\n *\n * Intentional deviations from bar (histogram-specific):\n * - **No `xAxis.axisLabel.formatter`.** Bin labels are pre-formatted in\n * the merger via `formatNumber(lo)–formatNumber(hi)` and optionally\n * the consumer's `labelFormatter`. The strings on the axis are\n * already display-ready, so there's nothing to post-format here.\n * - **Tooltip formatter reads the array-tuple row shape.** The dataset\n * uses positional `encode: { x: 0, y: 1 }`, so `item.value` comes in\n * as `[binLabel, count]` rather than bar's `{ name, value }` object.\n *\n * Intentionally data-agnostic: no series, no dataset, no x-axis category\n * data (those depend on data + ticks and are added by the option factory's\n * merge phase via {@link createHistogramOptionFactory}).\n */\nexport function histogramOptions({\n theme,\n formatter,\n}: HistogramOptionsInput): HistogramEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1 + bar).\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: buildHistogramTooltipFormatter(formatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count. Histogram doesn't accept `labelFormatter` at the\n // options layer (bin labels are pre-formatted in the merger), so we\n // skip the legend `labelFormatter` argument too.\n legend: {\n ...buildLegendConfig({ hasLegend: false }),\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 },\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 HistogramEChartsOption\n}\n\n/**\n * Returns the histogram widget's {@link OptionFactory} — one closure that\n * owns BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link histogramOptions}, optionally merging\n * the consumer-supplied `optionsOverride`. Called once by Provider to\n * seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`HistogramWidgetData` — `number[][]`) into the option via the\n * dataset API. Each series gets its own dataset of `[binLabel, count]`\n * pairs derived from `ticks`; series reference their dataset by\n * `datasetIndex` and are encoded by column position. Reactive\n * `ctx.formatter` (driven by RelativeData → `%`) plus `niceMin`/`niceMax`\n * are re-derived here so the y-axis label formatter and the tooltip\n * pick up live store values, mirroring bar.\n */\nexport function createHistogramOptionFactory(\n options: HistogramOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, ticks, series, labelFormatter, selection } = options\n const optionsOverride = options.optionsOverride\n const selectionSet =\n selection && selection.length > 0 ? new Set<number>(selection) : null\n\n const binLabels: string[] = []\n for (let i = 0; i < ticks.length - 1; i++) {\n const lo = ticks[i]!\n const hi = ticks[i + 1]!\n const raw = `${formatNumber(lo)}–${formatNumber(hi)}`\n binLabels.push(labelFormatter ? labelFormatter(raw) : raw)\n }\n\n return (option, data, ctx) => {\n if (option == null) {\n const structural = histogramOptions({ theme, formatter })\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: HistogramWidgetData = Array.isArray(data)\n ? (data as HistogramWidgetData)\n : []\n if (seriesArr.length === 0 || binLabels.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n\n const hasLegend = seriesArr.length > 1\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\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 baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n // Reactive (live store) formatter from ctx — distinct from the\n // closure-time `formatter` captured for the structural-build branch\n // above. RelativeData can install a percent formatter on the store\n // after the factory was constructed; the merge phase reads `ctx` to\n // pick that up.\n const liveFormatter = ctx?.formatter\n\n const { niceMinVal, niceMaxVal } = computeHistogramNiceBounds(seriesArr)\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push\n // the slider above the legend (if any) and reserve room in the grid.\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 // Dim non-selected bins via `series.itemStyle.color`. Per-row\n // `itemStyle` on dataset sources is silently ignored when\n // `series.encode` is in play.\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 bins 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 return selectionSet.has(params.dataIndex)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n },\n }\n\n return {\n ...option,\n dataset: seriesArr.map((counts) => ({\n source: binLabels.map(\n (label, i) => [label, counts[i] ?? 0] as [string, number],\n ),\n })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\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: 0, y: 1 },\n barCategoryGap: '0%',\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: { ...baseGrid, bottom: gridBottom },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: niceMinVal,\n max: niceMaxVal,\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) 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: buildHistogramTooltipFormatter(liveFormatter),\n },\n } as EChartsOption\n }\n}\n\n/**\n * Tooltip formatter for the histogram's positional `[binLabel, count]`\n * row shape. ECharts surfaces the x-axis category through `item.name`\n * (already pre-formatted by the bin-label generator), and `item.value`\n * comes in as the array tuple — distinct from bar's `{ name, value }`\n * object row.\n */\nfunction buildHistogramTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as [string, number] | undefined\n const raw = row?.[1]\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 return {\n name: String(item.name ?? ''),\n seriesName,\n marker,\n value: formattedValue,\n }\n })\n}\n\nfunction computeHistogramNiceBounds(seriesArr: HistogramWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let max = -Infinity\n for (const counts of seriesArr) {\n for (const v of counts) {\n if (typeof v !== 'number' || !Number.isFinite(v)) continue\n if (v > max) max = v\n }\n }\n return {\n niceMinVal: 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\nfunction formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n)\n return Number(n.toFixed(2)).toString()\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 alignItems: 'flex-end',\n flex: '1 1 auto',\n gap: 0.5,\n width: '100%',\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 barSx = (height: number): SxProps<Theme> => ({\n flex: 1,\n height: `${height}%`,\n minWidth: 8,\n})\n\nexport interface HistogramSkeletonProps {\n bins?: number\n}\n\n/**\n * Loading state for the Histogram widget. Mirrors Bar's skeleton structure\n * — a grid of bars (bin-shaped silhouette, anchored to the bottom) plus a\n * legend stub — so the placeholder reads consistently with Bar.\n */\nexport function HistogramSkeleton({ bins = 12 }: HistogramSkeletonProps) {\n // Sample heights mimicking a typical bell-shaped distribution.\n const heights = Array.from({ length: bins }, (_, i) => {\n const t = i / Math.max(1, bins - 1)\n return Math.round(20 + 80 * Math.exp(-((t - 0.5) ** 2) * 8))\n })\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {heights.map((h, i) => (\n <Skeleton key={`bar-${i}`} variant='rectangular' sx={barSx(h)} />\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 buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { HistogramWidgetData } from './types'\n\n/**\n * Download menu items for histograms. Always includes a CSV item with\n * `bin_low, bin_high, series_1_count, series_2_count, …` columns (one row\n * per bin). When `getCaptureEl` is supplied, prepends a PNG item that\n * rasterises the captured element via `html2canvas`.\n */\nexport function createHistogramDownloadConfig(args: {\n filename: string\n getData: () => HistogramWidgetData\n getTicks: () => readonly number[]\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 ticks = args.getTicks()\n const seriesCount = data.length\n const header: unknown[] = ['bin_low', 'bin_high']\n for (let i = 0; i < seriesCount; i++) {\n header.push(args.seriesNames?.[i] ?? `series_${i + 1}`)\n }\n const rows: unknown[][] = [header]\n for (let bin = 0; bin < Math.max(0, ticks.length - 1); bin++) {\n const row: unknown[] = [ticks[bin], ticks[bin + 1]]\n for (let s = 0; s < seriesCount; s++) row.push(data[s]?.[bin] ?? 0)\n rows.push(row)\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","/**\n * Histogram-specific `RelativeData` transform. Histogram data is\n * `number[][]` — each series is a flat list of bin counts. This\n * rewrites each count to its share of the series total (0–100), so\n * pairing with `createPercentFormatter` renders the y-axis as\n * percentages.\n *\n * Pass to `<Widget.RelativeData transform={toRelativeHistogramData} />`.\n *\n * The denominator is the sum of |value| across the series so mixed-sign\n * inputs produce sane signed shares-of-magnitude. A series whose total\n * magnitude is zero (all-zero or empty input) is returned unchanged so\n * a stalled or empty data set doesn't show misleading 0% values. Inputs\n * whose shape isn't `number[][]` fall through untouched (same defensive\n * shape-check pattern as the default transform).\n */\nexport const toRelativeHistogramData = (input: unknown): unknown => {\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!isFlatNumberArray(series)) return series\n const total = series.reduce((acc, v) => acc + Math.abs(v), 0)\n if (total <= 0) return series\n return series.map((v) => (v / total) * 100)\n })\n}\n\nfunction isFlatNumberArray(v: unknown): v is number[] {\n if (!Array.isArray(v)) return false\n return v.every((item) => typeof item === 'number' && Number.isFinite(item))\n}\n"],"names":["histogramOptions","theme","formatter","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","buildHistogramTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","String","createHistogramOptionFactory","options","ticks","series","labelFormatter","selection","optionsOverride","selectionSet","length","Set","binLabels","i","lo","hi","raw","formatNumber","push","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","seriesTemplates","broadcastTemplate","baseYAxis","baseGrid","baseTooltip","baseLegend","liveFormatter","niceMinVal","niceMaxVal","computeHistogramNiceBounds","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","has","dataIndex","echarts","modifyAlpha","map","counts","source","label","_","template","overrideColor","resolveThemeColor","datasetIndex","name","encode","x","y","barCategoryGap","emphasis","focus","itemStyle","createTooltipFormatter","item","formattedValue","marker","seriesName","v","Number","isFinite","n","isInteger","toFixed","toString","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","legendItem","barSx","minWidth","HistogramSkeleton","t0","$","_c","bins","t1","undefined","T0","T1","t2","t3","t4","heights","from","t","Math","round","exp","Box","_temp","t5","jsx","t6","Symbol","for","_temp2","t7","i_1","jsxs","Skeleton","h","i_0","createHistogramDownloadConfig","args","items","getCaptureEl","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","getTicks","seriesCount","header","seriesNames","rows","bin","row","s","handle","downloadToCSV","Promise","url","revoke","toRelativeHistogramData","input","isFlatNumberArray","total","reduce","acc","abs","every"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { c as p } from "react/compiler-runtime";
4
4
  import { Box as s, Skeleton as c } from "@mui/material";
5
5
  import "react";
6
6
  import "@mui/icons-material/FileDownload";
7
- import "../lasso-tool-BYbxrJ-7.js";
7
+ import "../lasso-tool-CDFj4zKY.js";
8
8
  import "../cjs-D4KH3azB.js";
9
9
  import "@mui/icons-material";
10
10
  import "html2canvas";