@carto/ps-react-ui 6.2.0 → 6.4.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 (91) hide show
  1. package/dist/actions-DyWNwvLu.js +1272 -0
  2. package/dist/actions-DyWNwvLu.js.map +1 -0
  3. package/dist/{category-DULnoxvk.js → category-BHBd5Pcc.js} +262 -245
  4. package/dist/category-BHBd5Pcc.js.map +1 -0
  5. package/dist/{option-builders-DQivvvbb.js → item-color-B7xkIpDZ.js} +26 -9
  6. package/dist/item-color-B7xkIpDZ.js.map +1 -0
  7. package/dist/scale-Bhx8HKEB.js +29 -0
  8. package/dist/scale-Bhx8HKEB.js.map +1 -0
  9. package/dist/types/widgets/actions/index.d.ts +1 -1
  10. package/dist/types/widgets/actions/relative-data/index.d.ts +1 -0
  11. package/dist/types/widgets/actions/relative-data/labels.d.ts +3 -0
  12. package/dist/types/widgets/actions/relative-data/relative-data.d.ts +16 -2
  13. package/dist/types/widgets/actions/relative-data/scale.d.ts +26 -0
  14. package/dist/types/widgets/actions/relative-data/style.d.ts +12 -0
  15. package/dist/types/widgets/bar/types.d.ts +6 -0
  16. package/dist/types/widgets/category/category.d.ts +2 -1
  17. package/dist/types/widgets/histogram/bins.d.ts +7 -0
  18. package/dist/types/widgets/histogram/download.d.ts +2 -2
  19. package/dist/types/widgets/histogram/index.d.ts +2 -1
  20. package/dist/types/widgets/histogram/options.d.ts +1 -1
  21. package/dist/types/widgets/histogram/transforms.d.ts +5 -4
  22. package/dist/types/widgets/histogram/types.d.ts +22 -5
  23. package/dist/types/widgets/index.d.ts +2 -2
  24. package/dist/types/widgets/pie/types.d.ts +6 -0
  25. package/dist/types/widgets/scatterplot/download.d.ts +2 -2
  26. package/dist/types/widgets/scatterplot/index.d.ts +2 -1
  27. package/dist/types/widgets/scatterplot/points.d.ts +7 -0
  28. package/dist/types/widgets/scatterplot/transforms.d.ts +4 -3
  29. package/dist/types/widgets/scatterplot/types.d.ts +21 -2
  30. package/dist/types/widgets/timeseries/types.d.ts +6 -0
  31. package/dist/types/widgets/utils/item-color.d.ts +26 -0
  32. package/dist/widgets/actions.js +1 -1
  33. package/dist/widgets/bar.js +87 -78
  34. package/dist/widgets/bar.js.map +1 -1
  35. package/dist/widgets/category.js +1 -1
  36. package/dist/widgets/histogram.js +129 -97
  37. package/dist/widgets/histogram.js.map +1 -1
  38. package/dist/widgets/pie.js +108 -89
  39. package/dist/widgets/pie.js.map +1 -1
  40. package/dist/widgets/scatterplot.js +147 -107
  41. package/dist/widgets/scatterplot.js.map +1 -1
  42. package/dist/widgets/timeseries.js +92 -83
  43. package/dist/widgets/timeseries.js.map +1 -1
  44. package/dist/widgets.js +2 -2
  45. package/dist/widgets.js.map +1 -1
  46. package/package.json +1 -1
  47. package/src/widgets/actions/fullscreen/fullscreen-store.test.tsx +77 -13
  48. package/src/widgets/actions/fullscreen/fullscreen.tsx +48 -5
  49. package/src/widgets/actions/index.ts +1 -0
  50. package/src/widgets/actions/relative-data/index.ts +1 -0
  51. package/src/widgets/actions/relative-data/labels.ts +6 -0
  52. package/src/widgets/actions/relative-data/relative-data.test.tsx +78 -1
  53. package/src/widgets/actions/relative-data/relative-data.tsx +137 -20
  54. package/src/widgets/actions/relative-data/scale.ts +48 -0
  55. package/src/widgets/actions/relative-data/style.ts +10 -0
  56. package/src/widgets/bar/options.test.ts +122 -0
  57. package/src/widgets/bar/options.ts +31 -16
  58. package/src/widgets/bar/types.ts +6 -0
  59. package/src/widgets/category/category.relative-data.test.tsx +51 -63
  60. package/src/widgets/category/category.tsx +25 -11
  61. package/src/widgets/histogram/bins.ts +22 -0
  62. package/src/widgets/histogram/download.test.ts +10 -0
  63. package/src/widgets/histogram/download.ts +7 -3
  64. package/src/widgets/histogram/index.ts +3 -0
  65. package/src/widgets/histogram/options.test.ts +62 -0
  66. package/src/widgets/histogram/options.ts +44 -19
  67. package/src/widgets/histogram/transforms.test.ts +21 -7
  68. package/src/widgets/histogram/transforms.ts +26 -12
  69. package/src/widgets/histogram/types.ts +25 -5
  70. package/src/widgets/index.ts +7 -1
  71. package/src/widgets/pie/options.test.ts +91 -0
  72. package/src/widgets/pie/options.ts +50 -20
  73. package/src/widgets/pie/types.ts +6 -0
  74. package/src/widgets/scatterplot/download.test.ts +9 -0
  75. package/src/widgets/scatterplot/download.ts +5 -3
  76. package/src/widgets/scatterplot/index.ts +3 -0
  77. package/src/widgets/scatterplot/options.test.ts +90 -0
  78. package/src/widgets/scatterplot/options.ts +53 -15
  79. package/src/widgets/scatterplot/points.ts +35 -0
  80. package/src/widgets/scatterplot/transforms.test.ts +19 -0
  81. package/src/widgets/scatterplot/transforms.ts +23 -18
  82. package/src/widgets/scatterplot/types.ts +25 -2
  83. package/src/widgets/timeseries/options.test.ts +65 -0
  84. package/src/widgets/timeseries/options.ts +37 -16
  85. package/src/widgets/timeseries/types.ts +6 -0
  86. package/src/widgets/utils/item-color.test.ts +74 -0
  87. package/src/widgets/utils/item-color.ts +55 -0
  88. package/dist/actions-CueYrfVr.js +0 -1150
  89. package/dist/actions-CueYrfVr.js.map +0 -1
  90. package/dist/category-DULnoxvk.js.map +0 -1
  91. package/dist/option-builders-DQivvvbb.js.map +0 -1
@@ -0,0 +1,26 @@
1
+ import { WidgetState } from '../../stores/types.js';
2
+ /**
3
+ * How far a bar reaches while `RelativeData` is on. The value is always
4
+ * the share of the series total; the scale only moves the end of the
5
+ * value axis: `'max'` ends it at the largest share so the top item fills
6
+ * the bar, `'total'` ends it at 100%.
7
+ */
8
+ export type RelativeScale = 'max' | 'total';
9
+ export declare const RELATIVE_DATA_ID = "relative-data";
10
+ /**
11
+ * The scale the value axis should use right now, or `null` when relative
12
+ * values are off. For widgets that size bars themselves (Category); the
13
+ * ECharts widgets get it through the config transform below.
14
+ */
15
+ export declare function selectRelativeScale(s: WidgetState): RelativeScale | null;
16
+ /**
17
+ * Config transform for `'total'`: pins the value axis to ±100. The widget
18
+ * mergers read numeric `yAxis.min` / `yAxis.max` back through
19
+ * {@link fixedAxisBounds} and apply each only on the side the data reaches.
20
+ */
21
+ export declare const toRelativeTotalAxis: (option: unknown) => unknown;
22
+ /** Numeric bounds a config transform set on the structural `yAxis`. */
23
+ export declare function fixedAxisBounds(yAxis: object): {
24
+ min?: number;
25
+ max?: number;
26
+ };
@@ -1,5 +1,9 @@
1
1
  import { Theme } from '@mui/material';
2
2
  export declare const styles: {
3
+ group: {
4
+ display: "inline-flex";
5
+ alignItems: "center";
6
+ };
3
7
  toggle: {
4
8
  p: number;
5
9
  '& .MuiSvgIcon-root': {
@@ -9,4 +13,12 @@ export declare const styles: {
9
13
  toggleActive: {
10
14
  background: (theme: Theme) => string;
11
15
  };
16
+ arrow: {
17
+ p: number;
18
+ width: number;
19
+ borderRadius: number;
20
+ '& .MuiSvgIcon-root': {
21
+ fontSize: number;
22
+ };
23
+ };
12
24
  };
@@ -5,6 +5,12 @@ import { WidgetSeries } from '../types.js';
5
5
  export interface BarDatum {
6
6
  name: string | number;
7
7
  value: number;
8
+ /**
9
+ * Optional colour for this item (CSS colour or theme palette path such as
10
+ * `'primary.main'`). Wins over the template's `itemStyle.color` and the
11
+ * series colour; selection dimming still applies on top.
12
+ */
13
+ color?: string;
8
14
  }
9
15
  /** v2 bar widget data shape: array of series, each a flat list of `{name, value}`. */
10
16
  export type BarWidgetData = readonly (readonly BarDatum[])[];
@@ -29,7 +29,8 @@ export interface CategoryProps {
29
29
  * stay coherent across data transforms (e.g., the Searcher filtering
30
30
  * rows in and out — bars don't rescale just because the larger rows
31
31
  * got hidden). Pass an explicit number to fix the denominator
32
- * regardless of the data.
32
+ * regardless of the data. Ignored while `RelativeData` is on, whose
33
+ * `scale` decides the denominator instead.
33
34
  */
34
35
  maxOverride?: number;
35
36
  /**
@@ -0,0 +1,7 @@
1
+ import { HistogramBin } from './types.js';
2
+ /** Count of a {@link HistogramBin}, whichever form it takes. */
3
+ export declare function getHistogramBinValue(bin: HistogramBin): number;
4
+ /** Whether `v` is a valid {@link HistogramBin} with a finite count. */
5
+ export declare function isHistogramBin(v: unknown): v is HistogramBin;
6
+ /** Same bin with its count replaced; keeps the object form (and `color`). */
7
+ export declare function withHistogramBinValue(bin: HistogramBin, value: number): HistogramBin;
@@ -1,12 +1,12 @@
1
1
  import { DownloadItem, WidgetDownloadArgs } from '../actions/download/index.js';
2
- import { HistogramWidgetData } from './types.js';
2
+ import { HistogramBin, HistogramWidgetData } from './types.js';
3
3
  /**
4
4
  * Download menu items for histograms. Always includes a CSV item with
5
5
  * `bin_low, bin_high, series_1_count, series_2_count, …` columns (one row
6
6
  * per bin). When `getCaptureEl` is given, prepends a PNG item that
7
7
  * rasterises the captured element via `html2canvas`.
8
8
  */
9
- export declare function createHistogramDownloadConfig(args: WidgetDownloadArgs<HistogramWidgetData> & {
9
+ export declare function createHistogramDownloadConfig(args: WidgetDownloadArgs<HistogramWidgetData<HistogramBin>> & {
10
10
  getTicks: () => readonly number[];
11
11
  seriesNames?: readonly string[];
12
12
  }): DownloadItem[];
@@ -2,4 +2,5 @@ export { histogramOptions, createHistogramOptionFactory } from './options.js';
2
2
  export { HistogramSkeleton, type HistogramSkeletonProps } from './skeleton.js';
3
3
  export { createHistogramDownloadConfig } from './download.js';
4
4
  export { toRelativeHistogramData, filterHistogramByLockedBins, } from './transforms.js';
5
- export type { HistogramWidgetData, HistogramOptionsInput, HistogramOptionFactoryInput, HistogramEChartsOption, } from './types.js';
5
+ export { getHistogramBinValue } from './bins.js';
6
+ export type { HistogramBin, HistogramBinObject, HistogramWidgetData, HistogramOptionsInput, HistogramOptionFactoryInput, HistogramEChartsOption, } from './types.js';
@@ -31,7 +31,7 @@ export declare function histogramOptions({ theme, formatter, }: HistogramOptions
31
31
  * the consumer-supplied `optionsOverride`. Called once by Provider to
32
32
  * seed `rawOptions` in the store.
33
33
  * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`
34
- * (`HistogramWidgetData` — `number[][]`) into the option via the
34
+ * (`HistogramWidgetData` — `HistogramBin[][]`) into the option via the
35
35
  * dataset API. Each series gets its own dataset of `[binLabel, count]`
36
36
  * pairs derived from `ticks`; series reference their dataset by
37
37
  * `datasetIndex` and are encoded by column position. Reactive
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Histogram-specific `RelativeData` transform. Histogram data is
3
- * `number[][]` — each series is a flat list of bin counts. This
3
+ * `HistogramBin[][]` — each series is a flat list of bin counts (plain
4
+ * numbers or `{ value, color? }`, whose shape is kept). This
4
5
  * rewrites each count to its share of the series total (0–100), so
5
6
  * pairing with `createPercentFormatter` renders the y-axis as
6
7
  * percentages.
@@ -11,13 +12,13 @@
11
12
  * inputs produce sane signed shares-of-magnitude. A series whose total
12
13
  * magnitude is zero (all-zero or empty input) is returned unchanged so
13
14
  * a stalled or empty data set doesn't show misleading 0% values. Inputs
14
- * whose shape isn't `number[][]` fall through untouched (same defensive
15
+ * whose shape isn't `HistogramBin[][]` fall through untouched (same defensive
15
16
  * shape-check pattern as the default transform).
16
17
  */
17
18
  export declare const toRelativeHistogramData: (input: unknown) => unknown;
18
19
  /**
19
- * `LockSelection` filter for Histogram. Data is `number[][]` — a flat list
20
- * of bin counts per series, positionally paired with `ticks` (bin `i` covers
20
+ * `LockSelection` filter for Histogram. Data is `HistogramBin[][]` — a flat
21
+ * list of bin counts per series, positionally paired with `ticks` (bin `i` covers
21
22
  * `[ticks[i], ticks[i+1])`). Unlike name-keyed widgets, locked-out bins can't
22
23
  * be REMOVED — that would shift every later bin's index and desync it from
23
24
  * its `ticks` range. Zeroing them out instead preserves array length/position,
@@ -2,12 +2,29 @@ import { Theme } from '@mui/material';
2
2
  import { EChartsOption } from 'echarts';
3
3
  import { WidgetSeries } from '../types.js';
4
4
  /**
5
- * Histogram widget data — array of series, each a flat array of bin counts.
6
- * The option factory's merge phase (see {@link createHistogramOptionFactory})
7
- * combines this with `ticks` to produce a 2-column dataset (`[binLabel, count]`)
8
- * for ECharts.
5
+ * One histogram bin: either its count, or `{ value, color? }` to give the
6
+ * bar its own colour (CSS colour or theme palette path such as
7
+ * `'primary.main'`). A bin `color` wins over the template's
8
+ * `itemStyle.color` and the series colour; selection dimming still applies.
9
9
  */
10
- export type HistogramWidgetData = readonly (readonly number[])[];
10
+ export type HistogramBin = number | HistogramBinObject;
11
+ /** Object form of a {@link HistogramBin}. */
12
+ export interface HistogramBinObject {
13
+ value: number;
14
+ color?: string;
15
+ }
16
+ /**
17
+ * Histogram widget data — array of series, each a flat array of bins. The
18
+ * option factory's merge phase (see {@link createHistogramOptionFactory})
19
+ * combines this with `ticks` to produce a 2-column dataset
20
+ * (`[binLabel, count]`) for ECharts.
21
+ *
22
+ * Defaults to plain counts (`number[][]`) so existing code that reads bins
23
+ * as numbers keeps type-checking; use `HistogramWidgetData<HistogramBin>`
24
+ * to also accept `{ value, color? }` bins. Every histogram API (option
25
+ * factory, transforms, download) accepts both forms.
26
+ */
27
+ export type HistogramWidgetData<B extends HistogramBin = number> = readonly (readonly B[])[];
11
28
  /** Inputs to the structural-only {@link histogramOptions} builder. */
12
29
  export interface HistogramOptionsInput {
13
30
  theme: Theme;
@@ -96,12 +96,12 @@ export type { ToolboxLabels } from './toolbox/labels.js';
96
96
  export type { EchartProps, EchartUIProps, EchartsEventHandler } from './echart/index.js';
97
97
  export type { NoteProps, NoteMarkdownProps } from './note/widget-note.js';
98
98
  export type { NoteLabels } from './note/labels.js';
99
- export type { SearcherProps, SearcherToggleProps, StackToggleProps, ShowAllToggleProps, ZoomToggleProps, BrushToggleProps, RelativeDataProps, DownloadProps, DownloadItem, DownloadContext, FullScreenTriggerProps, FullScreenSlotProps, LockSelectionProps, LockSelectionKey, ChangeColumnProps, ChangeColumnItem, } from './actions/index.js';
99
+ export type { SearcherProps, SearcherToggleProps, StackToggleProps, ShowAllToggleProps, ZoomToggleProps, BrushToggleProps, RelativeDataProps, RelativeScale, DownloadProps, DownloadItem, DownloadContext, FullScreenTriggerProps, FullScreenSlotProps, LockSelectionProps, LockSelectionKey, ChangeColumnProps, ChangeColumnItem, } from './actions/index.js';
100
100
  export type { FormulaUIProps, FormulaDataItem, FormulaWidgetData, } from './formula/index.js';
101
101
  export type { MarkdownUIProps, MarkdownWidgetData } from './markdown/index.js';
102
102
  export type { PieDatum, PieWidgetData } from './pie/index.js';
103
103
  export type { TimeseriesDatum, TimeseriesWidgetData } from './timeseries/index.js';
104
- export type { ScatterplotDatum, ScatterplotWidgetData } from './scatterplot/index.js';
104
+ export type { ScatterplotDatum, ScatterplotPoint, ScatterplotItem, ScatterplotWidgetData, } from './scatterplot/index.js';
105
105
  export type { SpreadUIProps, SpreadDataItem, SpreadWidgetData, SpreadVariant, } from './spread/index.js';
106
106
  export type { RangeProps, RangeUIProps, RangeDataItem, RangeWidgetData, RangeItemValue, } from './range/index.js';
107
107
  export type { CategoryProps, CategoryUIProps, CategoryDataItem, CategoryWidgetData, CategoryKey, CategorySeriesConfig, CategoryLabels, } from './category/index.js';
@@ -5,6 +5,12 @@ import { WidgetSeries } from '../types.js';
5
5
  export interface PieDatum {
6
6
  name: string | number;
7
7
  value: number;
8
+ /**
9
+ * Optional colour for this item (CSS colour or theme palette path such as
10
+ * `'primary.main'`). Wins over the template's `itemStyle.color` and the
11
+ * series colour; selection dimming still applies on top.
12
+ */
13
+ color?: string;
8
14
  }
9
15
  /** Pie widget data — one slice array per series (rendered as side-by-side donuts). */
10
16
  export type PieWidgetData = readonly (readonly PieDatum[])[];
@@ -1,11 +1,11 @@
1
1
  import { DownloadItem, WidgetDownloadArgs } from '../actions/download/index.js';
2
- import { ScatterplotWidgetData } from './types.js';
2
+ import { ScatterplotItem, ScatterplotWidgetData } from './types.js';
3
3
  /**
4
4
  * Download menu items for the Scatterplot widget. Always includes a CSV item
5
5
  * with `series, x, y` columns (one row per point). When `getCaptureEl` is
6
6
  * given, prepends a PNG item that rasterises the captured element via
7
7
  * `html2canvas`.
8
8
  */
9
- export declare function createScatterplotDownloadConfig(args: WidgetDownloadArgs<ScatterplotWidgetData> & {
9
+ export declare function createScatterplotDownloadConfig(args: WidgetDownloadArgs<ScatterplotWidgetData<ScatterplotItem>> & {
10
10
  seriesNames?: readonly string[];
11
11
  }): DownloadItem[];
@@ -2,4 +2,5 @@ export { scatterplotOptions, createScatterplotOptionFactory } from './options.js
2
2
  export { ScatterplotSkeleton, type ScatterplotSkeletonProps } from './skeleton.js';
3
3
  export { createScatterplotDownloadConfig } from './download.js';
4
4
  export { toRelativeScatterplotData, filterScatterplotByLockedPoints, } from './transforms.js';
5
- export type { ScatterplotDatum, ScatterplotWidgetData, ScatterplotOptionsInput, ScatterplotOptionFactoryInput, ScatterplotEChartsOption, } from './types.js';
5
+ export { getScatterplotXY } from './points.js';
6
+ export type { ScatterplotDatum, ScatterplotPoint, ScatterplotItem, ScatterplotWidgetData, ScatterplotOptionsInput, ScatterplotOptionFactoryInput, ScatterplotEChartsOption, } from './types.js';
@@ -0,0 +1,7 @@
1
+ import { ScatterplotItem } from './types.js';
2
+ /** `[x, y]` of a {@link ScatterplotItem}, whichever form it takes. */
3
+ export declare function getScatterplotXY(point: ScatterplotItem): readonly [number, number];
4
+ /** Whether `v` is a valid {@link ScatterplotItem} with finite coordinates. */
5
+ export declare function isScatterplotDatum(v: unknown): v is ScatterplotItem;
6
+ /** Same point with new coordinates; keeps the object form (and `color`). */
7
+ export declare function withScatterplotXY(point: ScatterplotItem, x: number, y: number): ScatterplotItem;
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Scatterplot-specific `RelativeData` transform. Scatter data is
3
- * `[number, number][]` — each series is a list of `[x, y]` tuples.
3
+ * `ScatterplotItem[][]` — each series is a list of `[x, y]` tuples or
4
+ * `{ x, y, color? }` points (whose shape is kept).
4
5
  * Relative is a values-axis concept, so this rewrites `y` to its
5
6
  * share of the series's total `y` (0–100) and leaves `x` raw — x is
6
7
  * coordinate space, not part of the cohort total.
@@ -11,12 +12,12 @@
11
12
  * y values produce sane signed shares-of-magnitude. A series whose
12
13
  * total y-magnitude is zero (all-zero or empty input) is returned
13
14
  * unchanged so a stalled or empty data set doesn't show misleading 0%
14
- * values. Inputs whose shape isn't `[number, number][]` fall through
15
+ * values. Inputs whose shape isn't `ScatterplotItem[]` fall through
15
16
  * untouched.
16
17
  */
17
18
  export declare const toRelativeScatterplotData: (input: unknown) => unknown;
18
19
  /**
19
- * `LockSelection` filter for Scatterplot. Data is `[number, number][][]` —
20
+ * `LockSelection` filter for Scatterplot. Data is `ScatterplotItem[][]` —
20
21
  * points have no `name`, so selection (and locking) is keyed on a synthetic
21
22
  * `${seriesIndex}:${dataIndex}` string (same format `useChartSelection`'s
22
23
  * `keyFromClick`/`keysFromBrush` produce for this widget). Unlike Histogram,
@@ -3,8 +3,27 @@ import { EChartsOption } from 'echarts';
3
3
  import { WidgetSeries } from '../types.js';
4
4
  /** A single point — `[x, y]` tuple. */
5
5
  export type ScatterplotDatum = readonly [number, number];
6
- /** Scatterplot widget data — array of series, each a list of `[x, y]` tuples. */
7
- export type ScatterplotWidgetData = readonly (readonly ScatterplotDatum[])[];
6
+ /**
7
+ * Object form of a point, to give it its own colour. `color` (CSS colour or
8
+ * theme palette path such as `'primary.main'`) wins over the template's
9
+ * `itemStyle.color` and the series colour; selection dimming still applies.
10
+ */
11
+ export interface ScatterplotPoint {
12
+ x: number;
13
+ y: number;
14
+ color?: string;
15
+ }
16
+ /** Any accepted point: an `[x, y]` tuple or a {@link ScatterplotPoint}. */
17
+ export type ScatterplotItem = ScatterplotDatum | ScatterplotPoint;
18
+ /**
19
+ * Scatterplot widget data — array of series, each a list of points.
20
+ *
21
+ * Defaults to `[x, y]` tuples so existing code that destructures points
22
+ * keeps type-checking; use `ScatterplotWidgetData<ScatterplotItem>` to also
23
+ * accept `{ x, y, color? }` points. Every scatterplot API (option factory,
24
+ * transforms, download) accepts both forms.
25
+ */
26
+ export type ScatterplotWidgetData<P extends ScatterplotItem = ScatterplotDatum> = readonly (readonly P[])[];
8
27
  /** Inputs to the structural-only {@link scatterplotOptions} builder. */
9
28
  export interface ScatterplotOptionsInput {
10
29
  theme: Theme;
@@ -9,6 +9,12 @@ import { WidgetSeries } from '../types.js';
9
9
  export interface TimeseriesDatum {
10
10
  name: Date | number | string;
11
11
  value: number;
12
+ /**
13
+ * Optional colour for this item (CSS colour or theme palette path such as
14
+ * `'primary.main'`). Wins over the template's `itemStyle.color` and the
15
+ * series colour; selection dimming still applies on top.
16
+ */
17
+ color?: string;
12
18
  }
13
19
  /** Timeseries widget data — one array of points per series. */
14
20
  export type TimeseriesWidgetData = readonly (readonly TimeseriesDatum[])[];
@@ -0,0 +1,26 @@
1
+ import { Theme } from '@mui/material';
2
+ import { CallbackDataParams } from 'echarts/types/dist/shared';
3
+ /** ECharts `itemStyle.color` callback, as emitted by the chart widgets. */
4
+ export type ItemColorCallback = (params: CallbackDataParams) => string;
5
+ /**
6
+ * Builds the callback that resolves the **base** colour of every item of one
7
+ * series, before any selection dimming. Priority:
8
+ *
9
+ * 1. the datum's own `color` (`datums[params.dataIndex].color`);
10
+ * 2. the consumer's `template.itemStyle.color` (from `optionsOverride`):
11
+ * a string is used as is, a function is called with the ECharts params;
12
+ * 3. `fallback` — the widget's default (series colour / palette).
13
+ *
14
+ * The datum is looked up by `params.dataIndex` in the widget's own data
15
+ * rather than read off `params.data`, so it works whatever the dataset row
16
+ * shape is (object rows, `[label, count]` tuples, `[x, y]` tuples).
17
+ *
18
+ * Datum and template colours go through {@link resolveThemeColor}, same as
19
+ * per-series colours, so palette paths such as `'primary.main'` work.
20
+ */
21
+ export declare function createItemColorResolver({ theme, datums, template, fallback, }: {
22
+ theme: Theme;
23
+ datums: readonly unknown[];
24
+ template: unknown;
25
+ fallback: ItemColorCallback;
26
+ }): ItemColorCallback;
@@ -1,4 +1,4 @@
1
- import { C as e, E as t, S as n, T as r, _ as i, a, b as o, c as s, d as c, f as l, g as u, h as d, i as f, l as p, m, n as h, o as g, p as _, r as v, s as y, t as b, u as x, v as S, w as C, x as w, y as T } from "../actions-CueYrfVr.js";
1
+ import { C as e, E as t, S as n, T as r, _ as i, a, b as o, c as s, d as c, f as l, g as u, h as d, i as f, l as p, m, n as h, o as g, p as _, r as v, s as y, t as b, u as x, v as S, w as C, x as w, y as T } from "../actions-DyWNwvLu.js";
2
2
  import { a as E, i as D, n as O, r as k, t as A } from "../zoom-toggle-MmLjMTEw.js";
3
3
  import { a as j, c as M, d as N, f as P, i as F, l as I, n as L, o as R, p as z, r as B, s as V, t as H, u as U } from "../download-B4sykOFm.js";
4
4
  export { l as BrushToggle, j as CSVIcon, b as ChangeColumn, _ as DEFAULT_BRUSH_TOGGLE_LABELS, h as DEFAULT_CHANGE_COLUMN_LABELS, I as DEFAULT_DOWNLOAD_LABELS, y as DEFAULT_FULLSCREEN_LABELS, f as DEFAULT_LOCK_SELECTION_LABELS, p as DEFAULT_RELATIVE_DATA_LABELS, r as DEFAULT_SEARCHER_LABELS, S as DEFAULT_SHOW_ALL_LABELS, o as DEFAULT_STACK_TOGGLE_LABELS, O as DEFAULT_ZOOM_TOGGLE_LABELS, F as DOWNLOAD_ITEM_IDS, M as Download, g as FullScreen, v as LockSelection, R as MarkdownIcon, V as PNGIcon, s as RelativeData, d as SHOW_ALL_ID, n as Searcher, e as SearcherToggle, u as ShowAllToggle, T as StackToggle, k as ZOOM_LAYOUT, A as ZoomToggle, m as addBrush, w as addStack, D as addZoom, L as buildCsvDownloadItem, B as buildPngDownloadItem, E as createAddZoom, x as createPercentFormatter, U as downloadDOMToPNG, N as downloadToCSV, a as filterByLockedItems, t as filterBySearchText, C as setSearcherText, i as setShowAll, P as toCsvString, c as toRelativeData, z as triggerLinkDownload, H as withPngItem };
@@ -1,20 +1,21 @@
1
1
  import { r as e } from "../zoom-toggle-MmLjMTEw.js";
2
- import { n as t, t as n } from "../download-B4sykOFm.js";
3
- import { n as r, r as i, t as a } from "../utils-C-eWwOhE.js";
4
- import { a as o, n as s, o as c, r as l, s as u, t as d } from "../option-builders-DQivvvbb.js";
5
- import { c as f } from "react/compiler-runtime";
6
- import { Box as p, Skeleton as m } from "@mui/material";
7
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
8
- import * as _ from "echarts";
2
+ import { n as t } from "../scale-Bhx8HKEB.js";
3
+ import { n, t as r } from "../download-B4sykOFm.js";
4
+ import { n as i, r as a, t as o } from "../utils-C-eWwOhE.js";
5
+ import { c as s, i as c, n as l, o as u, r as d, s as f, t as p } from "../item-color-B7xkIpDZ.js";
6
+ import { c as m } from "react/compiler-runtime";
7
+ import { Box as h, Skeleton as g } from "@mui/material";
8
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
9
+ import * as y from "echarts";
9
10
  //#region src/widgets/bar/options.ts
10
- function v({ theme: e, formatter: t, labelFormatter: n }) {
11
+ function b({ theme: e, formatter: t, labelFormatter: n }) {
11
12
  let r = 0, i = 1;
12
13
  return {
13
14
  grid: {
14
15
  left: parseInt(e.spacing(1)),
15
16
  top: parseInt(e.spacing(3)),
16
17
  right: parseInt(e.spacing(1)),
17
- ...s(!1, e),
18
+ ...d(!1, e),
18
19
  containLabel: !0
19
20
  },
20
21
  tooltip: {
@@ -28,10 +29,10 @@ function v({ theme: e, formatter: t, labelFormatter: n }) {
28
29
  fontFamily: e.typography.caption.fontFamily
29
30
  },
30
31
  axisPointer: { type: "line" },
31
- position: c(e),
32
- formatter: b(t, n)
32
+ position: f(e),
33
+ formatter: S(t, n)
33
34
  },
34
- legend: { ...l({
35
+ legend: { ...c({
35
36
  hasLegend: !1,
36
37
  labelFormatter: n
37
38
  }) },
@@ -42,7 +43,7 @@ function v({ theme: e, formatter: t, labelFormatter: n }) {
42
43
  axisLine: { show: !1 },
43
44
  axisTick: { show: !1 },
44
45
  axisLabel: {
45
- ...d(e),
46
+ ...l(e),
46
47
  padding: [
47
48
  parseInt(e.spacing(.5)),
48
49
  0,
@@ -57,8 +58,8 @@ function v({ theme: e, formatter: t, labelFormatter: n }) {
57
58
  },
58
59
  yAxis: {
59
60
  type: "value",
60
- min: (e) => (r = e.min < 0 ? u(e.min) : 0, r),
61
- max: (e) => (i = e.max <= 0 ? 1 : u(e.max), i),
61
+ min: (e) => (r = e.min < 0 ? s(e.min) : 0, r),
62
+ max: (e) => (i = e.max <= 0 ? 1 : s(e.max), i),
62
63
  axisLine: { show: !1 },
63
64
  axisTick: { show: !1 },
64
65
  splitLine: {
@@ -66,7 +67,7 @@ function v({ theme: e, formatter: t, labelFormatter: n }) {
66
67
  lineStyle: { color: e.palette.black?.[4] ?? e.palette.divider }
67
68
  },
68
69
  axisLabel: {
69
- ...d(e),
70
+ ...l(e),
70
71
  margin: parseInt(e.spacing(1)),
71
72
  show: !0,
72
73
  showMaxLabel: !0,
@@ -78,76 +79,84 @@ function v({ theme: e, formatter: t, labelFormatter: n }) {
78
79
  }
79
80
  };
80
81
  }
81
- function y(t) {
82
- let { theme: n, formatter: o, labelFormatter: s, optionsOverride: c } = t, l = t.series, d = t.selection, f = d && d.length > 0 ? new Set(d) : null;
83
- return (t, d, p) => {
84
- if (t == null) {
85
- let e = v({
86
- theme: n,
87
- formatter: o,
88
- labelFormatter: s
82
+ function x(n) {
83
+ let { theme: r, formatter: c, labelFormatter: l, optionsOverride: u } = n, d = n.series, f = n.selection, m = f && f.length > 0 ? new Set(f) : null;
84
+ return (n, f, h) => {
85
+ if (n == null) {
86
+ let e = b({
87
+ theme: r,
88
+ formatter: c,
89
+ labelFormatter: l
89
90
  });
90
- return c ? i(e, c) : e;
91
+ return u ? a(e, u) : e;
91
92
  }
92
- let m = Array.isArray(d) ? d : [];
93
- if (m.length === 0) return {
94
- ...t,
93
+ let g = Array.isArray(f) ? f : [];
94
+ if (g.length === 0) return {
95
+ ...n,
95
96
  dataset: [],
96
97
  series: []
97
98
  };
98
- let h = m.length > 1, g = typeof t.legend == "object" && !Array.isArray(t.legend) ? t.legend : {}, y = typeof t.grid == "object" && !Array.isArray(t.grid) ? t.grid : {}, x = typeof t.tooltip == "object" && !Array.isArray(t.tooltip) ? t.tooltip : {}, S = typeof t.yAxis == "object" && !Array.isArray(t.yAxis) ? t.yAxis : {}, C = Array.isArray(t.series) ? t.series : [], w = C[0] ?? {}, T = p?.formatter, E = p?.labelFormatter, D = 0, O = 1, k = r(t.dataZoom, h), A = typeof y.bottom == "number" ? y.bottom : 24, j = h ? 56 : A, M = k ? j + e.sliderHeight + e.sliderGap : j, N = { color: (e) => {
99
- let t = e.color;
100
- if (!f) return t;
101
- let n = e.value?.name ?? e.name;
102
- return n != null && f.has(n) ? t : _.color.modifyAlpha(t, .15);
103
- } };
99
+ let _ = g.length > 1, v = typeof n.legend == "object" && !Array.isArray(n.legend) ? n.legend : {}, x = typeof n.grid == "object" && !Array.isArray(n.grid) ? n.grid : {}, C = typeof n.tooltip == "object" && !Array.isArray(n.tooltip) ? n.tooltip : {}, w = typeof n.yAxis == "object" && !Array.isArray(n.yAxis) ? n.yAxis : {}, T = t(w), E = Array.isArray(n.series) ? n.series : [], D = E[0] ?? {}, O = h?.formatter, k = h?.labelFormatter, A = 0, j = 1, M = i(n.dataZoom, _), N = typeof x.bottom == "number" ? x.bottom : 24, P = _ ? 56 : N, F = M ? P + e.sliderHeight + e.sliderGap : P, I = (e, t) => {
100
+ let n = p({
101
+ theme: r,
102
+ datums: e,
103
+ template: t,
104
+ fallback: (e) => e.color
105
+ });
106
+ return { color: (e) => {
107
+ let t = n(e);
108
+ if (!m) return t;
109
+ let r = e.value?.name ?? e.name;
110
+ return r != null && m.has(r) ? t : y.color.modifyAlpha(t, .15);
111
+ } };
112
+ };
104
113
  return {
105
- ...t,
106
- dataset: m.map((e) => ({ source: e })),
107
- series: m.map((e, t) => {
108
- let r = C[t] ?? w, i = a(n, l?.[t]?.color);
114
+ ...n,
115
+ dataset: g.map((e) => ({ source: e })),
116
+ series: g.map((e, t) => {
117
+ let n = E[t] ?? D, i = o(r, d?.[t]?.color);
109
118
  return {
110
- ...typeof r == "object" ? r : {},
119
+ ...typeof n == "object" ? n : {},
111
120
  type: "bar",
112
121
  datasetIndex: t,
113
- name: l?.[t]?.name ?? `Series ${t + 1}`,
122
+ name: d?.[t]?.name ?? `Series ${t + 1}`,
114
123
  encode: {
115
124
  x: "name",
116
125
  y: "value"
117
126
  },
118
127
  barMaxWidth: 100,
119
128
  emphasis: { focus: "series" },
120
- itemStyle: N,
129
+ itemStyle: I(e, n),
121
130
  ...i ? { color: i } : {}
122
131
  };
123
132
  }),
124
133
  legend: {
125
- ...g,
126
- show: h
134
+ ...v,
135
+ show: _
127
136
  },
128
137
  grid: {
129
- ...y,
130
- bottom: M
138
+ ...x,
139
+ bottom: F
131
140
  },
132
- ...k ? { dataZoom: k } : {},
141
+ ...M ? { dataZoom: M } : {},
133
142
  yAxis: {
134
- ...S,
135
- min: (e) => (D = e.min < 0 ? u(e.min) : 0, D),
136
- max: (e) => (O = e.max <= 0 ? 1 : u(e.max), O),
143
+ ...w,
144
+ min: (e) => (A = e.min < 0 ? T.min ?? s(e.min) : 0, A),
145
+ max: (e) => (j = e.max <= 0 ? 1 : T.max ?? s(e.max), j),
137
146
  axisLabel: {
138
- ...S.axisLabel ?? {},
139
- formatter: (e) => e !== O && e !== D || e === 0 ? "" : T ? T(e) : String(e)
147
+ ...w.axisLabel ?? {},
148
+ formatter: (e) => e !== j && e !== A || e === 0 ? "" : O ? O(e) : String(e)
140
149
  }
141
150
  },
142
151
  tooltip: {
143
- ...x,
144
- formatter: b(T, E)
152
+ ...C,
153
+ formatter: S(O, k)
145
154
  }
146
155
  };
147
156
  };
148
157
  }
149
- function b(e, t) {
150
- return o((n) => {
158
+ function S(e, t) {
159
+ return u((n) => {
151
160
  let r = n.value?.value, i = typeof r == "number" && e ? e(r) : r ?? "", a = typeof n.marker == "string" ? n.marker : "", o = n.seriesName ? `${n.seriesName}: ` : "", s = t ? String(t(n.name ?? "")) : n.name ?? "";
152
161
  return {
153
162
  name: String(s),
@@ -159,7 +168,7 @@ function b(e, t) {
159
168
  }
160
169
  //#endregion
161
170
  //#region src/widgets/bar/skeleton.tsx
162
- var x = {
171
+ var C = {
163
172
  container: {
164
173
  display: "flex",
165
174
  alignItems: "center",
@@ -191,52 +200,52 @@ var x = {
191
200
  alignItems: "center",
192
201
  gap: ({ spacing: e }) => e(1.5)
193
202
  }
194
- }, S = [
203
+ }, w = [
195
204
  "20%",
196
205
  "40%",
197
206
  "60%",
198
207
  "20%",
199
208
  "80%"
200
209
  ];
201
- function C() {
202
- let e = f(2), t;
203
- e[0] === Symbol.for("react.memo_cache_sentinel") ? (t = /* @__PURE__ */ h(p, {
204
- sx: x.grid,
205
- children: S.map(T)
210
+ function T() {
211
+ let e = m(2), t;
212
+ e[0] === Symbol.for("react.memo_cache_sentinel") ? (t = /* @__PURE__ */ _(h, {
213
+ sx: C.grid,
214
+ children: w.map(D)
206
215
  }), e[0] = t) : t = e[0];
207
216
  let n;
208
- return e[1] === Symbol.for("react.memo_cache_sentinel") ? (n = /* @__PURE__ */ g(p, {
209
- sx: x.container,
210
- children: [t, /* @__PURE__ */ h(p, {
211
- sx: x.legend,
212
- children: [0, 1].map(w)
217
+ return e[1] === Symbol.for("react.memo_cache_sentinel") ? (n = /* @__PURE__ */ v(h, {
218
+ sx: C.container,
219
+ children: [t, /* @__PURE__ */ _(h, {
220
+ sx: C.legend,
221
+ children: [0, 1].map(E)
213
222
  })]
214
223
  }), e[1] = n) : n = e[1], n;
215
224
  }
216
- function w(e) {
217
- return /* @__PURE__ */ g(p, {
218
- sx: x.legendItem,
219
- children: [/* @__PURE__ */ h(m, {
225
+ function E(e) {
226
+ return /* @__PURE__ */ v(h, {
227
+ sx: C.legendItem,
228
+ children: [/* @__PURE__ */ _(g, {
220
229
  variant: "circular",
221
230
  width: 8,
222
231
  height: 8
223
- }), /* @__PURE__ */ h(m, {
232
+ }), /* @__PURE__ */ _(g, {
224
233
  width: 48,
225
234
  height: 8
226
235
  })]
227
236
  }, `legend-${e}`);
228
237
  }
229
- function T(e, t) {
230
- return /* @__PURE__ */ h(m, {
231
- sx: x.bar,
238
+ function D(e, t) {
239
+ return /* @__PURE__ */ _(g, {
240
+ sx: C.bar,
232
241
  variant: "rectangular",
233
242
  height: e
234
243
  }, `bar-${t}`);
235
244
  }
236
245
  //#endregion
237
246
  //#region src/widgets/bar/download.tsx
238
- function E(e) {
239
- return n(e, t({
247
+ function O(e) {
248
+ return r(e, n({
240
249
  filename: e.filename,
241
250
  getRows: (t) => {
242
251
  let n = e.getData(t), r = [];
@@ -249,6 +258,6 @@ function E(e) {
249
258
  }));
250
259
  }
251
260
  //#endregion
252
- export { C as BarSkeleton, v as barOptions, E as createBarDownloadConfig, y as createBarOptionFactory };
261
+ export { T as BarSkeleton, b as barOptions, O as createBarDownloadConfig, x as createBarOptionFactory };
253
262
 
254
263
  //# sourceMappingURL=bar.js.map