@carto/ps-react-ui 4.8.0 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/range-l4fNHLEg.js +213 -0
  2. package/dist/range-l4fNHLEg.js.map +1 -0
  3. package/dist/resolve-theme-color-BdojIw0K.js +47 -0
  4. package/dist/resolve-theme-color-BdojIw0K.js.map +1 -0
  5. package/dist/table-CQCAnDLb.js +388 -0
  6. package/dist/table-CQCAnDLb.js.map +1 -0
  7. package/dist/types/widgets-v2/bar/types.d.ts +8 -3
  8. package/dist/types/widgets-v2/category/types.d.ts +8 -4
  9. package/dist/types/widgets-v2/formula/types.d.ts +10 -7
  10. package/dist/types/widgets-v2/histogram/types.d.ts +7 -3
  11. package/dist/types/widgets-v2/index.d.ts +1 -0
  12. package/dist/types/widgets-v2/pie/types.d.ts +10 -3
  13. package/dist/types/widgets-v2/range/range-ui.d.ts +12 -4
  14. package/dist/types/widgets-v2/range/range.d.ts +13 -8
  15. package/dist/types/widgets-v2/scatterplot/types.d.ts +7 -3
  16. package/dist/types/widgets-v2/table/style.d.ts +0 -4
  17. package/dist/types/widgets-v2/table/table-ui.d.ts +7 -1
  18. package/dist/types/widgets-v2/table/table.d.ts +1 -1
  19. package/dist/types/widgets-v2/table/types.d.ts +13 -2
  20. package/dist/types/widgets-v2/timeseries/types.d.ts +7 -3
  21. package/dist/types/widgets-v2/types.d.ts +25 -0
  22. package/dist/types/widgets-v2/utils/index.d.ts +1 -0
  23. package/dist/types/widgets-v2/utils/resolve-theme-color.d.ts +18 -0
  24. package/dist/types/widgets-v2/utils/resolve-theme-color.test.d.ts +1 -0
  25. package/dist/widgets-v2/bar.js +58 -55
  26. package/dist/widgets-v2/bar.js.map +1 -1
  27. package/dist/widgets-v2/histogram.js +65 -62
  28. package/dist/widgets-v2/histogram.js.map +1 -1
  29. package/dist/widgets-v2/pie.js +100 -94
  30. package/dist/widgets-v2/pie.js.map +1 -1
  31. package/dist/widgets-v2/range.js +1 -1
  32. package/dist/widgets-v2/scatterplot.js +107 -101
  33. package/dist/widgets-v2/scatterplot.js.map +1 -1
  34. package/dist/widgets-v2/table.js +2 -2
  35. package/dist/widgets-v2/timeseries.js +85 -79
  36. package/dist/widgets-v2/timeseries.js.map +1 -1
  37. package/dist/widgets-v2/utils.js +4 -3
  38. package/dist/widgets-v2.js +2 -2
  39. package/dist/widgets-v2.js.map +1 -1
  40. package/package.json +3 -3
  41. package/src/widgets-v2/bar/options.test.ts +19 -2
  42. package/src/widgets-v2/bar/options.ts +9 -3
  43. package/src/widgets-v2/bar/types.ts +8 -3
  44. package/src/widgets-v2/category/types.ts +9 -4
  45. package/src/widgets-v2/formula/types.ts +11 -7
  46. package/src/widgets-v2/histogram/options.test.ts +16 -2
  47. package/src/widgets-v2/histogram/options.ts +5 -4
  48. package/src/widgets-v2/histogram/types.ts +7 -3
  49. package/src/widgets-v2/index.ts +3 -0
  50. package/src/widgets-v2/pie/options.test.ts +20 -4
  51. package/src/widgets-v2/pie/options.ts +21 -17
  52. package/src/widgets-v2/pie/types.ts +10 -3
  53. package/src/widgets-v2/range/range-ui.test.tsx +8 -2
  54. package/src/widgets-v2/range/range-ui.tsx +81 -14
  55. package/src/widgets-v2/range/range.tsx +14 -8
  56. package/src/widgets-v2/scatterplot/options.test.ts +15 -3
  57. package/src/widgets-v2/scatterplot/options.ts +15 -11
  58. package/src/widgets-v2/scatterplot/types.ts +7 -3
  59. package/src/widgets-v2/table/style.ts +2 -5
  60. package/src/widgets-v2/table/table-ui.tsx +40 -7
  61. package/src/widgets-v2/table/table.tsx +6 -1
  62. package/src/widgets-v2/table/types.ts +13 -2
  63. package/src/widgets-v2/timeseries/options.test.ts +17 -2
  64. package/src/widgets-v2/timeseries/options.ts +10 -3
  65. package/src/widgets-v2/timeseries/types.ts +7 -3
  66. package/src/widgets-v2/types.ts +25 -0
  67. package/src/widgets-v2/utils/index.ts +1 -0
  68. package/src/widgets-v2/utils/resolve-theme-color.test.ts +43 -0
  69. package/src/widgets-v2/utils/resolve-theme-color.ts +34 -0
  70. package/dist/merge-options-DCkkHZIf.js +0 -34
  71. package/dist/merge-options-DCkkHZIf.js.map +0 -1
  72. package/dist/range-DsqTjSpg.js +0 -186
  73. package/dist/range-DsqTjSpg.js.map +0 -1
  74. package/dist/table-HIpXuq4G.js +0 -390
  75. package/dist/table-HIpXuq4G.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import * as E from "echarts";
2
- import { n as S, d as G, g as K, c as R, f as Y } from "../option-builders-F-c9ELi1.js";
3
- import { jsxs as C, jsx as d } from "react/jsx-runtime";
2
+ import { n as A, d as G, g as K, c as R, f as Y } from "../option-builders-F-c9ELi1.js";
3
+ import { jsxs as L, jsx as h } from "react/jsx-runtime";
4
4
  import { c as q } from "react/compiler-runtime";
5
- import { Box as w, Skeleton as b } from "@mui/material";
5
+ import { Box as S, Skeleton as w } from "@mui/material";
6
6
  import "../widget-store-Bw5zRUGg.js";
7
7
  import "zustand/shallow";
8
8
  import "@mui/icons-material";
@@ -21,18 +21,18 @@ import "zustand/vanilla";
21
21
  import "zustand/middleware";
22
22
  import "zustand/react/shallow";
23
23
  import { Z as B } from "../transforms-Cdx4fkU5.js";
24
- import { m as H } from "../merge-options-DCkkHZIf.js";
25
- import { p as U } from "../data-zoom-layout-BH0LPwSy.js";
24
+ import { m as H, r as U } from "../resolve-theme-color-BdojIw0K.js";
25
+ import { p as W } from "../data-zoom-layout-BH0LPwSy.js";
26
26
  import "@mui/icons-material/FileDownload";
27
- import { a as W } from "../exports-Cx-f6m6U.js";
27
+ import { a as J } from "../exports-Cx-f6m6U.js";
28
28
  import "@mui/icons-material/ImageOutlined";
29
- import { b as J } from "../png-item-CS4z1iSH.js";
30
- function Q({
29
+ import { b as Q } from "../png-item-CS4z1iSH.js";
30
+ function X({
31
31
  theme: e,
32
32
  formatter: o,
33
33
  labelFormatter: r
34
34
  }) {
35
- let s = 0, i = 1;
35
+ let a = 0, i = 1;
36
36
  return {
37
37
  grid: {
38
38
  left: parseInt(e.spacing(1)),
@@ -90,8 +90,8 @@ function Q({
90
90
  },
91
91
  yAxis: {
92
92
  type: "value",
93
- min: (n) => (s = n.min < 0 ? S(n.min) : 0, s),
94
- max: (n) => (i = n.max <= 0 ? 1 : S(n.max), i),
93
+ min: (n) => (a = n.min < 0 ? A(n.min) : 0, a),
94
+ max: (n) => (i = n.max <= 0 ? 1 : A(n.max), i),
95
95
  axisLine: {
96
96
  show: !1
97
97
  },
@@ -113,55 +113,55 @@ function Q({
113
113
  showMinLabel: !0,
114
114
  verticalAlign: "bottom",
115
115
  inside: !0,
116
- formatter: (n) => n !== i && n !== s || n === 0 ? "" : o ? o(n) : String(n)
116
+ formatter: (n) => n !== i && n !== a || n === 0 ? "" : o ? o(n) : String(n)
117
117
  }
118
118
  }
119
119
  };
120
120
  }
121
- function Ne(e) {
121
+ function Me(e) {
122
122
  const {
123
123
  theme: o,
124
124
  formatter: r,
125
- labelFormatter: s,
125
+ labelFormatter: a,
126
126
  optionsOverride: i
127
- } = e, n = e.seriesNames, c = e.smooth ?? !0, g = e.area ?? !1, m = e.selection, p = m && m.length > 0 ? new Set(m) : null, l = (t) => t instanceof Date ? t.getTime() : t;
128
- return (t, f, A) => {
127
+ } = e, n = e.series, c = e.smooth ?? !0, d = e.area ?? !1, m = e.selection, p = m && m.length > 0 ? new Set(m) : null, l = (t) => t instanceof Date ? t.getTime() : t;
128
+ return (t, f, v) => {
129
129
  if (t == null) {
130
- const a = Q({
130
+ const s = X({
131
131
  theme: o,
132
132
  formatter: r,
133
- labelFormatter: s
133
+ labelFormatter: a
134
134
  });
135
- return i ? H(a, i) : a;
135
+ return i ? H(s, i) : s;
136
136
  }
137
- const y = Array.isArray(f) ? f : [];
138
- if (y.length === 0)
137
+ const x = Array.isArray(f) ? f : [];
138
+ if (x.length === 0)
139
139
  return {
140
140
  ...t,
141
141
  dataset: [],
142
142
  series: []
143
143
  };
144
- const v = y.length > 1, D = Array.isArray(t.series) ? t.series : [], _ = D[0] ?? {}, N = typeof t.yAxis == "object" && !Array.isArray(t.yAxis) ? t.yAxis : {}, k = typeof t.grid == "object" && !Array.isArray(t.grid) ? t.grid : {}, V = typeof t.tooltip == "object" && !Array.isArray(t.tooltip) ? t.tooltip : {}, P = typeof t.legend == "object" && !Array.isArray(t.legend) ? t.legend : {}, I = A?.formatter, {
145
- niceMinVal: O,
146
- niceMaxVal: M
147
- } = X(y), L = U(t.dataZoom, v), Z = typeof k.bottom == "number" ? k.bottom : 24, j = v ? 56 : Z, $ = L ? j + B.sliderHeight + B.sliderGap : j, z = {
148
- color: (a) => {
149
- const x = a.value?.name, T = a.color;
150
- return !p || x == null || p.has(l(x)) ? T : E.color.modifyAlpha(T, 0.15);
144
+ const k = x.length > 1, D = Array.isArray(t.series) ? t.series : [], _ = D[0] ?? {}, O = typeof t.yAxis == "object" && !Array.isArray(t.yAxis) ? t.yAxis : {}, T = typeof t.grid == "object" && !Array.isArray(t.grid) ? t.grid : {}, V = typeof t.tooltip == "object" && !Array.isArray(t.tooltip) ? t.tooltip : {}, P = typeof t.legend == "object" && !Array.isArray(t.legend) ? t.legend : {}, C = v?.formatter, {
145
+ niceMinVal: M,
146
+ niceMaxVal: j
147
+ } = ee(x), I = W(t.dataZoom, k), Z = typeof T.bottom == "number" ? T.bottom : 24, N = k ? 56 : Z, $ = I ? N + B.sliderHeight + B.sliderGap : N, z = {
148
+ color: (s) => {
149
+ const b = s.value?.name, u = s.color;
150
+ return !p || b == null || p.has(l(b)) ? u : E.color.modifyAlpha(u, 0.15);
151
151
  }
152
152
  };
153
153
  return {
154
154
  ...t,
155
- dataset: y.map((a) => ({
156
- source: a
155
+ dataset: x.map((s) => ({
156
+ source: s
157
157
  })),
158
- series: y.map((a, h) => {
159
- const x = D[h] ?? _;
158
+ series: x.map((s, y) => {
159
+ const b = D[y] ?? _, u = U(o, n?.[y]?.color);
160
160
  return {
161
- ...typeof x == "object" ? x : {},
161
+ ...typeof b == "object" ? b : {},
162
162
  type: "line",
163
- datasetIndex: h,
164
- name: n?.[h] ?? `Series ${h + 1}`,
163
+ datasetIndex: y,
164
+ name: n?.[y]?.name ?? `Series ${y + 1}`,
165
165
  encode: {
166
166
  x: "name",
167
167
  y: "value"
@@ -171,65 +171,71 @@ function Ne(e) {
171
171
  // color callback has something to dim — a continuous line would
172
172
  // hide the visual selection feedback.
173
173
  showSymbol: p != null,
174
- ...g ? {
174
+ ...d ? {
175
175
  areaStyle: {}
176
176
  } : {},
177
177
  emphasis: {
178
178
  focus: "series"
179
179
  },
180
- itemStyle: z
180
+ itemStyle: z,
181
+ ...u ? {
182
+ color: u,
183
+ lineStyle: {
184
+ color: u
185
+ }
186
+ } : {}
181
187
  };
182
188
  }),
183
189
  legend: {
184
190
  ...P,
185
- show: v
191
+ show: k
186
192
  },
187
193
  grid: {
188
- ...k,
194
+ ...T,
189
195
  bottom: $
190
196
  },
191
- ...L ? {
192
- dataZoom: L
197
+ ...I ? {
198
+ dataZoom: I
193
199
  } : {},
194
200
  yAxis: {
195
- ...N,
196
- min: O,
197
- max: M,
201
+ ...O,
202
+ min: M,
203
+ max: j,
198
204
  axisLabel: {
199
- ...N.axisLabel ?? {},
200
- formatter: (a) => a !== M && a !== O || a === 0 ? "" : I ? I(a) : String(a)
205
+ ...O.axisLabel ?? {},
206
+ formatter: (s) => s !== j && s !== M || s === 0 ? "" : C ? C(s) : String(s)
201
207
  }
202
208
  },
203
209
  tooltip: {
204
210
  ...V,
205
- formatter: F(I, s)
211
+ formatter: F(C, a)
206
212
  }
207
213
  };
208
214
  };
209
215
  }
210
216
  function F(e, o) {
211
217
  return Y((r) => {
212
- const s = r.value, i = s?.value, n = typeof i == "number" && e ? e(i) : i ?? "", c = typeof r.marker == "string" ? r.marker : "", g = r.seriesName ? `${r.seriesName}: ` : "", m = s?.name ?? r.name, p = o && m != null ? o(m instanceof Date ? m : new Date(m)) : m ?? "";
218
+ const a = r.value, i = a?.value, n = typeof i == "number" && e ? e(i) : i ?? "", c = typeof r.marker == "string" ? r.marker : "", d = r.seriesName ? `${r.seriesName}: ` : "", m = a?.name ?? r.name, p = o && m != null ? o(m instanceof Date ? m : new Date(m)) : m ?? "";
213
219
  return {
214
220
  name: String(p),
215
- seriesName: g,
221
+ seriesName: d,
216
222
  marker: c,
217
223
  value: n
218
224
  };
219
225
  });
220
226
  }
221
- function X(e) {
227
+ function ee(e) {
222
228
  let o = 0, r = -1 / 0;
223
229
  for (const n of e)
224
230
  for (const c of n)
225
231
  typeof c?.value != "number" || !Number.isFinite(c.value) || (c.value < o && (o = c.value), c.value > r && (r = c.value));
226
- const s = o < 0 ? S(o) : 0, i = r <= 0 ? 1 : S(r);
232
+ const a = o < 0 ? A(o) : 0, i = r <= 0 ? 1 : A(r);
227
233
  return {
228
- niceMinVal: s,
234
+ niceMinVal: a,
229
235
  niceMaxVal: i
230
236
  };
231
237
  }
232
- const u = {
238
+ const g = {
233
239
  container: {
234
240
  display: "flex",
235
241
  flexDirection: "column",
@@ -285,29 +291,29 @@ const u = {
285
291
  }) => e(1.5)
286
292
  }
287
293
  };
288
- function Oe() {
294
+ function je() {
289
295
  const e = q(2);
290
296
  let o;
291
- e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (o = /* @__PURE__ */ C(w, { sx: u.graph, children: [
292
- /* @__PURE__ */ d(b, { variant: "rectangular", sx: u.segmentA }),
293
- /* @__PURE__ */ d(b, { variant: "rectangular", sx: u.segmentB }),
294
- /* @__PURE__ */ d(b, { variant: "rectangular", sx: u.segmentC })
297
+ e[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (o = /* @__PURE__ */ L(S, { sx: g.graph, children: [
298
+ /* @__PURE__ */ h(w, { variant: "rectangular", sx: g.segmentA }),
299
+ /* @__PURE__ */ h(w, { variant: "rectangular", sx: g.segmentB }),
300
+ /* @__PURE__ */ h(w, { variant: "rectangular", sx: g.segmentC })
295
301
  ] }), e[0] = o) : o = e[0];
296
302
  let r;
297
- return e[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (r = /* @__PURE__ */ C(w, { sx: u.container, children: [
303
+ return e[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (r = /* @__PURE__ */ L(S, { sx: g.container, children: [
298
304
  o,
299
- /* @__PURE__ */ d(w, { sx: u.legend, children: [0, 1].map(ee) })
305
+ /* @__PURE__ */ h(S, { sx: g.legend, children: [0, 1].map(te) })
300
306
  ] }), e[1] = r) : r = e[1], r;
301
307
  }
302
- function ee(e) {
303
- return /* @__PURE__ */ C(w, { sx: u.legendItem, children: [
304
- /* @__PURE__ */ d(b, { variant: "circular", width: 8, height: 8 }),
305
- /* @__PURE__ */ d(b, { width: 48, height: 8 })
308
+ function te(e) {
309
+ return /* @__PURE__ */ L(S, { sx: g.legendItem, children: [
310
+ /* @__PURE__ */ h(w, { variant: "circular", width: 8, height: 8 }),
311
+ /* @__PURE__ */ h(w, { width: 48, height: 8 })
306
312
  ] }, `legend-${e}`);
307
313
  }
308
- function Me(e) {
314
+ function Ne(e) {
309
315
  const o = [];
310
- return e.getCaptureEl && o.push(J({
316
+ return e.getCaptureEl && o.push(Q({
311
317
  filename: e.filename,
312
318
  getCaptureEl: e.getCaptureEl,
313
319
  pixelRatio: e.pngPixelRatio,
@@ -316,22 +322,22 @@ function Me(e) {
316
322
  id: "csv",
317
323
  label: "Download as CSV",
318
324
  resolve: () => {
319
- const r = e.getData(), s = r.length, i = [], n = /* @__PURE__ */ new Set();
325
+ const r = e.getData(), a = r.length, i = [], n = /* @__PURE__ */ new Set();
320
326
  for (const l of r)
321
327
  for (const t of l) {
322
328
  const f = String(t.name);
323
329
  n.has(f) || (n.add(f), i.push(t.name));
324
330
  }
325
- const c = r.map((l) => new Map(l.map((t) => [String(t.name), t.value]))), g = ["time"];
326
- for (let l = 0; l < s; l++)
327
- g.push(e.seriesNames?.[l] ?? `series_${l + 1}`);
328
- const m = [g];
331
+ const c = r.map((l) => new Map(l.map((t) => [String(t.name), t.value]))), d = ["time"];
332
+ for (let l = 0; l < a; l++)
333
+ d.push(e.seriesNames?.[l] ?? `series_${l + 1}`);
334
+ const m = [d];
329
335
  for (const l of i) {
330
- const t = [te(l)], f = String(l);
331
- for (const A of c) t.push(A.get(f) ?? "");
336
+ const t = [re(l)], f = String(l);
337
+ for (const v of c) t.push(v.get(f) ?? "");
332
338
  m.push(t);
333
339
  }
334
- const p = W(m);
340
+ const p = J(m);
335
341
  return Promise.resolve({
336
342
  url: p.url,
337
343
  filename: `${e.filename}.csv`,
@@ -340,13 +346,13 @@ function Me(e) {
340
346
  }
341
347
  }), o;
342
348
  }
343
- function te(e) {
349
+ function re(e) {
344
350
  return e instanceof Date ? e.toISOString() : typeof e == "number" ? new Date(e).toISOString() : e;
345
351
  }
346
352
  export {
347
- Oe as TimeseriesSkeleton,
348
- Me as createTimeseriesDownloadConfig,
349
- Ne as createTimeseriesOptionFactory,
350
- Q as timeseriesOptions
353
+ je as TimeseriesSkeleton,
354
+ Ne as createTimeseriesDownloadConfig,
355
+ Me as createTimeseriesOptionFactory,
356
+ X as timeseriesOptions
351
357
  };
352
358
  //# sourceMappingURL=timeseries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeseries.js","sources":["../../src/widgets-v2/timeseries/options.ts","../../src/widgets-v2/timeseries/skeleton.tsx","../../src/widgets-v2/timeseries/download.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 TimeseriesEChartsOption,\n TimeseriesOptionFactoryInput,\n TimeseriesOptionsInput,\n TimeseriesWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a timeseries widget —\n * time x-axis, value y-axis, themed tooltip, themed legend, CARTO color\n * palette. Mirrors {@link import('../bar/options').barOptions} so all\n * four ECharts widgets share v1 look-and-feel.\n *\n * Intentional deviations from bar (timeseries-specific):\n * - **X-axis is `type: 'time'`** (not 'category'). ECharts handles\n * uneven sample spacing and zoom-level-aware label formatting.\n * `labelFormatter` is wrapped so the consumer sees a `Date`, not\n * a numeric timestamp.\n * - **Tooltip body reads `{ name, value }` rows**, same as bar, but\n * the `name` may arrive as `Date | number | string`. The\n * `labelFormatter` receives a `Date` regardless.\n *\n * Intentionally data-agnostic: no series, no dataset, no `legend.show`\n * (those depend on data and are added by the option factory's merge\n * phase via {@link createTimeseriesOptionFactory}).\n */\nexport function timeseriesOptions({\n theme,\n formatter,\n labelFormatter,\n}: TimeseriesOptionsInput): TimeseriesEChartsOption {\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: buildTimeseriesTooltipFormatter(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 }),\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: 'time',\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: (value: number) => labelFormatter(new Date(value)),\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 TimeseriesEChartsOption\n}\n\n/**\n * Returns the timeseries widget's {@link OptionFactory} — one closure\n * that owns BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link timeseriesOptions}, 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 * (`TimeseriesWidgetData`) into the option via the dataset API: one\n * dataset per series, each series referencing its dataset by index,\n * encoded by `name` (x — time) and `value` (y). Mirrors {@link import('../bar/options').createBarOptionFactory}:\n * series-template merge for `addStack`, reactive formatters from\n * `ctx`, `niceNum`-rounded y-axis bounds at fusion time, and\n * `positionDataZoomForLegend` layout for ZoomToggle sliders.\n */\nexport function createTimeseriesOptionFactory(\n options: TimeseriesOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride } = options\n const seriesNames = options.seriesNames\n const smooth = options.smooth ?? true\n const area = options.area ?? false\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n // `name` may be Date | number | string. Normalize to the same type the\n // selection is keyed on (Date → ms) so Set lookups match.\n const normalizeName = (n: Date | number | string): string | number =>\n n instanceof Date ? n.getTime() : n\n return (option, data, ctx) => {\n if (option == null) {\n const structural = timeseriesOptions({ 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 TimeseriesWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\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\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. `labelFormatter` (Date → string) is structural-only —\n // not relativizable — so the merge branch reads the closure-time value.\n const liveFormatter = ctx?.formatter\n\n const { niceMinVal, niceMaxVal } = computeTimeseriesNiceBounds(seriesArr)\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 // Dim non-selected points via `series.itemStyle.color`. Per-row\n // `itemStyle` on dataset object-rows 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 points would stay dimmed forever after an external clear.\n // Always 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 datum = params.value as\n | { name?: Date | number | string }\n | undefined\n const raw = datum?.name\n const base = params.color as string\n if (!selectionSet || raw == null) return base\n return selectionSet.has(normalizeName(raw))\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 return {\n ...(typeof template === 'object' ? template : {}),\n type: 'line' as const,\n datasetIndex: i,\n name: seriesNames?.[i] ?? `Series ${i + 1}`,\n encode: { x: 'name', y: 'value' },\n smooth,\n // When a selection is active, surface markers so the per-point\n // color callback has something to dim — a continuous line would\n // hide the visual selection feedback.\n showSymbol: selectionSet != null,\n ...(area ? { areaStyle: {} } : {}),\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: buildTimeseriesTooltipFormatter(\n liveFormatter,\n labelFormatter,\n ),\n },\n } as EChartsOption\n }\n}\n\n/**\n * Tooltip formatter for the timeseries `{ name, value }` row shape.\n * `name` arrives as `Date | number | string` (the time-axis stores the\n * raw value the consumer supplied). The consumer's `labelFormatter`\n * expects a `Date`, so we coerce non-Date values via `new Date(...)`\n * before invoking it.\n */\nfunction buildTimeseriesTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: Date) => string) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as\n | { name?: Date | number | string; value?: number }\n | undefined\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 rawName = row?.name ?? item.name\n const name =\n labelFormatter && rawName != null\n ? labelFormatter(rawName instanceof Date ? rawName : new Date(rawName))\n : (rawName ?? '')\n return { name: String(name), seriesName, marker, value: formattedValue }\n })\n}\n\nfunction computeTimeseriesNiceBounds(seriesArr: TimeseriesWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n const niceMinVal = min < 0 ? niceNum(min) : 0\n const niceMaxVal = max <= 0 ? 1 : niceNum(max)\n return { niceMinVal, niceMaxVal }\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n graph: {\n position: 'relative',\n flex: '1 1 auto',\n width: '100%',\n },\n segmentA: {\n position: 'absolute',\n left: 0,\n right: '70%',\n top: '60%',\n height: 4,\n },\n segmentB: {\n position: 'absolute',\n left: '25%',\n right: '40%',\n top: '35%',\n height: 4,\n },\n segmentC: {\n position: 'absolute',\n left: '55%',\n right: 0,\n top: '50%',\n height: 4,\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\n/**\n * Loading state for the Timeseries widget. Mirrors a line chart's\n * silhouette — three thin horizontal segments at staggered offsets to\n * suggest a moving line, plus a 2-dot legend stub. Sibling-consistent\n * with Bar / Histogram / Scatter skeletons (column-flex container with\n * legend strip below).\n */\nexport function TimeseriesSkeleton() {\n return (\n <Box sx={styles.container}>\n <Box sx={styles.graph}>\n <Skeleton variant='rectangular' sx={styles.segmentA} />\n <Skeleton variant='rectangular' sx={styles.segmentB} />\n <Skeleton variant='rectangular' sx={styles.segmentC} />\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 { TimeseriesWidgetData } from './types'\n\n/**\n * Download menu items for the Timeseries widget. Always includes a CSV\n * item with `time, series_1, series_2, …` columns (one row per unique time\n * across all series; ISO-8601 strings for `Date`/numeric times). When\n * `getCaptureEl` is supplied, prepends a PNG item that rasterises the\n * captured element via `html2canvas`.\n */\nexport function createTimeseriesDownloadConfig(args: {\n filename: string\n getData: () => TimeseriesWidgetData\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 seriesCount = data.length\n\n // Collect every unique time, preserving insertion order.\n const timeKeys: (Date | number | string)[] = []\n const seenKeys = new Set<string>()\n for (const series of data) {\n for (const point of series) {\n const key = String(point.name)\n if (!seenKeys.has(key)) {\n seenKeys.add(key)\n timeKeys.push(point.name)\n }\n }\n }\n\n // Build a quick lookup per series for O(rows × series) emit.\n const lookups = data.map(\n (series) => new Map(series.map((p) => [String(p.name), p.value])),\n )\n\n const header: unknown[] = ['time']\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 (const key of timeKeys) {\n const row: unknown[] = [formatTime(key)]\n const lookupKey = String(key)\n for (const lookup of lookups) row.push(lookup.get(lookupKey) ?? '')\n rows.push(row)\n }\n\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n\nfunction formatTime(v: Date | number | string): string {\n if (v instanceof Date) return v.toISOString()\n if (typeof v === 'number') return new Date(v).toISOString()\n return v\n}\n"],"names":["timeseriesOptions","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","buildTimeseriesTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","value","Date","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","String","createTimeseriesOptionFactory","options","optionsOverride","seriesNames","smooth","area","selection","selectionSet","length","Set","normalizeName","n","getTime","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","series","seriesTemplates","broadcastTemplate","baseYAxis","baseGrid","baseTooltip","baseLegend","liveFormatter","niceMinVal","niceMaxVal","computeTimeseriesNiceBounds","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","raw","name","base","has","echarts","modifyAlpha","map","s","source","_","i","template","datasetIndex","encode","x","y","showSymbol","areaStyle","emphasis","focus","itemStyle","createTooltipFormatter","item","row","formattedValue","marker","seriesName","rawName","d","Number","isFinite","styles","container","display","flexDirection","justifyContent","gap","height","graph","flex","width","segmentA","segmentB","segmentC","alignItems","legendItem","TimeseriesSkeleton","$","_c","t0","Symbol","for","jsxs","Box","jsx","Skeleton","t1","_temp","createTimeseriesDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","label","resolve","getData","seriesCount","timeKeys","seenKeys","point","key","add","lookups","Map","p","header","rows","formatTime","lookupKey","lookup","get","handle","downloadToCSV","Promise","url","revoke","v","toISOString"],"mappings":"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"}
1
+ {"version":3,"file":"timeseries.js","sources":["../../src/widgets-v2/timeseries/options.ts","../../src/widgets-v2/timeseries/skeleton.tsx","../../src/widgets-v2/timeseries/download.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 TimeseriesEChartsOption,\n TimeseriesOptionFactoryInput,\n TimeseriesOptionsInput,\n TimeseriesWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a timeseries widget —\n * time x-axis, value y-axis, themed tooltip, themed legend, CARTO color\n * palette. Mirrors {@link import('../bar/options').barOptions} so all\n * four ECharts widgets share v1 look-and-feel.\n *\n * Intentional deviations from bar (timeseries-specific):\n * - **X-axis is `type: 'time'`** (not 'category'). ECharts handles\n * uneven sample spacing and zoom-level-aware label formatting.\n * `labelFormatter` is wrapped so the consumer sees a `Date`, not\n * a numeric timestamp.\n * - **Tooltip body reads `{ name, value }` rows**, same as bar, but\n * the `name` may arrive as `Date | number | string`. The\n * `labelFormatter` receives a `Date` regardless.\n *\n * Intentionally data-agnostic: no series, no dataset, no `legend.show`\n * (those depend on data and are added by the option factory's merge\n * phase via {@link createTimeseriesOptionFactory}).\n */\nexport function timeseriesOptions({\n theme,\n formatter,\n labelFormatter,\n}: TimeseriesOptionsInput): TimeseriesEChartsOption {\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: buildTimeseriesTooltipFormatter(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 }),\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: 'time',\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: (value: number) => labelFormatter(new Date(value)),\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 TimeseriesEChartsOption\n}\n\n/**\n * Returns the timeseries widget's {@link OptionFactory} — one closure\n * that owns BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link timeseriesOptions}, 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 * (`TimeseriesWidgetData`) into the option via the dataset API: one\n * dataset per series, each series referencing its dataset by index,\n * encoded by `name` (x — time) and `value` (y). Mirrors {@link import('../bar/options').createBarOptionFactory}:\n * series-template merge for `addStack`, reactive formatters from\n * `ctx`, `niceNum`-rounded y-axis bounds at fusion time, and\n * `positionDataZoomForLegend` layout for ZoomToggle sliders.\n */\nexport function createTimeseriesOptionFactory(\n options: TimeseriesOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride } = options\n const series = options.series\n const smooth = options.smooth ?? true\n const area = options.area ?? false\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n // `name` may be Date | number | string. Normalize to the same type the\n // selection is keyed on (Date → ms) so Set lookups match.\n const normalizeName = (n: Date | number | string): string | number =>\n n instanceof Date ? n.getTime() : n\n return (option, data, ctx) => {\n if (option == null) {\n const structural = timeseriesOptions({ 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 TimeseriesWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\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\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. `labelFormatter` (Date → string) is structural-only —\n // not relativizable — so the merge branch reads the closure-time value.\n const liveFormatter = ctx?.formatter\n\n const { niceMinVal, niceMaxVal } = computeTimeseriesNiceBounds(seriesArr)\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 // Dim non-selected points via `series.itemStyle.color`. Per-row\n // `itemStyle` on dataset object-rows 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 points would stay dimmed forever after an external clear.\n // Always 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 datum = params.value as\n | { name?: Date | number | string }\n | undefined\n const raw = datum?.name\n const base = params.color as string\n if (!selectionSet || raw == null) return base\n return selectionSet.has(normalizeName(raw))\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 // For line series, set BOTH `series[i].color` (legend swatch +\n // markers) AND `series[i].lineStyle.color` (the line itself) so\n // the override paints everywhere a series has a colour slot.\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'line' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 'name', y: 'value' },\n smooth,\n // When a selection is active, surface markers so the per-point\n // color callback has something to dim — a continuous line would\n // hide the visual selection feedback.\n showSymbol: selectionSet != null,\n ...(area ? { areaStyle: {} } : {}),\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor\n ? { color: overrideColor, lineStyle: { color: overrideColor } }\n : {}),\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: buildTimeseriesTooltipFormatter(\n liveFormatter,\n labelFormatter,\n ),\n },\n } as EChartsOption\n }\n}\n\n/**\n * Tooltip formatter for the timeseries `{ name, value }` row shape.\n * `name` arrives as `Date | number | string` (the time-axis stores the\n * raw value the consumer supplied). The consumer's `labelFormatter`\n * expects a `Date`, so we coerce non-Date values via `new Date(...)`\n * before invoking it.\n */\nfunction buildTimeseriesTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: Date) => string) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as\n | { name?: Date | number | string; value?: number }\n | undefined\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 rawName = row?.name ?? item.name\n const name =\n labelFormatter && rawName != null\n ? labelFormatter(rawName instanceof Date ? rawName : new Date(rawName))\n : (rawName ?? '')\n return { name: String(name), seriesName, marker, value: formattedValue }\n })\n}\n\nfunction computeTimeseriesNiceBounds(seriesArr: TimeseriesWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n const niceMinVal = min < 0 ? niceNum(min) : 0\n const niceMaxVal = max <= 0 ? 1 : niceNum(max)\n return { niceMinVal, niceMaxVal }\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n graph: {\n position: 'relative',\n flex: '1 1 auto',\n width: '100%',\n },\n segmentA: {\n position: 'absolute',\n left: 0,\n right: '70%',\n top: '60%',\n height: 4,\n },\n segmentB: {\n position: 'absolute',\n left: '25%',\n right: '40%',\n top: '35%',\n height: 4,\n },\n segmentC: {\n position: 'absolute',\n left: '55%',\n right: 0,\n top: '50%',\n height: 4,\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\n/**\n * Loading state for the Timeseries widget. Mirrors a line chart's\n * silhouette — three thin horizontal segments at staggered offsets to\n * suggest a moving line, plus a 2-dot legend stub. Sibling-consistent\n * with Bar / Histogram / Scatter skeletons (column-flex container with\n * legend strip below).\n */\nexport function TimeseriesSkeleton() {\n return (\n <Box sx={styles.container}>\n <Box sx={styles.graph}>\n <Skeleton variant='rectangular' sx={styles.segmentA} />\n <Skeleton variant='rectangular' sx={styles.segmentB} />\n <Skeleton variant='rectangular' sx={styles.segmentC} />\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 { TimeseriesWidgetData } from './types'\n\n/**\n * Download menu items for the Timeseries widget. Always includes a CSV\n * item with `time, series_1, series_2, …` columns (one row per unique time\n * across all series; ISO-8601 strings for `Date`/numeric times). When\n * `getCaptureEl` is supplied, prepends a PNG item that rasterises the\n * captured element via `html2canvas`.\n */\nexport function createTimeseriesDownloadConfig(args: {\n filename: string\n getData: () => TimeseriesWidgetData\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 seriesCount = data.length\n\n // Collect every unique time, preserving insertion order.\n const timeKeys: (Date | number | string)[] = []\n const seenKeys = new Set<string>()\n for (const series of data) {\n for (const point of series) {\n const key = String(point.name)\n if (!seenKeys.has(key)) {\n seenKeys.add(key)\n timeKeys.push(point.name)\n }\n }\n }\n\n // Build a quick lookup per series for O(rows × series) emit.\n const lookups = data.map(\n (series) => new Map(series.map((p) => [String(p.name), p.value])),\n )\n\n const header: unknown[] = ['time']\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 (const key of timeKeys) {\n const row: unknown[] = [formatTime(key)]\n const lookupKey = String(key)\n for (const lookup of lookups) row.push(lookup.get(lookupKey) ?? '')\n rows.push(row)\n }\n\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n\nfunction formatTime(v: Date | number | string): string {\n if (v instanceof Date) return v.toISOString()\n if (typeof v === 'number') return new Date(v).toISOString()\n return v\n}\n"],"names":["timeseriesOptions","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","buildTimeseriesTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","value","Date","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","String","createTimeseriesOptionFactory","options","optionsOverride","series","smooth","area","selection","selectionSet","length","Set","normalizeName","n","getTime","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","seriesTemplates","broadcastTemplate","baseYAxis","baseGrid","baseTooltip","baseLegend","liveFormatter","niceMinVal","niceMaxVal","computeTimeseriesNiceBounds","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","raw","name","base","has","echarts","modifyAlpha","map","s","source","_","i","template","overrideColor","resolveThemeColor","datasetIndex","encode","x","y","showSymbol","areaStyle","emphasis","focus","itemStyle","createTooltipFormatter","item","row","formattedValue","marker","seriesName","rawName","d","Number","isFinite","styles","container","display","flexDirection","justifyContent","gap","height","graph","flex","width","segmentA","segmentB","segmentC","alignItems","legendItem","TimeseriesSkeleton","$","_c","t0","Symbol","for","jsxs","Box","jsx","Skeleton","t1","_temp","createTimeseriesDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","label","resolve","getData","seriesCount","timeKeys","seenKeys","point","key","add","lookups","Map","p","header","seriesNames","rows","formatTime","lookupKey","lookup","get","handle","downloadToCSV","Promise","url","revoke","v","toISOString"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { m as r } from "../merge-options-DCkkHZIf.js";
2
- import { p } from "../data-zoom-layout-BH0LPwSy.js";
1
+ import { m as r, r as m } from "../resolve-theme-color-BdojIw0K.js";
2
+ import { p as a } from "../data-zoom-layout-BH0LPwSy.js";
3
3
  export {
4
4
  r as mergeOptions,
5
- p as positionDataZoomForLegend
5
+ a as positionDataZoomForLegend,
6
+ m as resolveThemeColor
6
7
  };
7
8
  //# sourceMappingURL=utils.js.map
@@ -23,9 +23,9 @@ import "@mui/icons-material/ImageOutlined";
23
23
  import { a as ft, F as pt } from "./formula-DuC0NQLH.js";
24
24
  import "react-markdown";
25
25
  import { b as ut, a as mt } from "./spread-CTuIXZSM.js";
26
- import { a as gt, R as ht } from "./range-DsqTjSpg.js";
26
+ import { a as gt, R as ht } from "./range-l4fNHLEg.js";
27
27
  import { f as yt, C as xt } from "./category-DwaeYjpX.js";
28
- import { c as bt, T as vt } from "./table-HIpXuq4G.js";
28
+ import { c as bt, T as vt } from "./table-CQCAnDLb.js";
29
29
  function St(t) {
30
30
  const e = k(31), {
31
31
  id: n,