@gravity-ui/charts 1.43.1 → 1.45.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 (135) hide show
  1. package/dist/cjs/components/ChartInner/utils/zoom.js +3 -1
  2. package/dist/cjs/components/Tooltip/DefaultTooltipContent/index.js +31 -6
  3. package/dist/cjs/components/Tooltip/DefaultTooltipContent/utils.js +4 -5
  4. package/dist/cjs/core/constants/chart-types.d.ts +1 -0
  5. package/dist/cjs/core/constants/chart-types.js +1 -0
  6. package/dist/cjs/core/constants/defaults/annotation.d.ts +12 -0
  7. package/dist/cjs/core/constants/defaults/annotation.js +12 -0
  8. package/dist/cjs/core/constants/defaults/index.d.ts +1 -0
  9. package/dist/cjs/core/constants/defaults/index.js +1 -0
  10. package/dist/cjs/core/constants/defaults/series-options.d.ts +5 -1
  11. package/dist/cjs/core/constants/defaults/series-options.js +13 -0
  12. package/dist/cjs/core/i18n/keysets/en.json +2 -1
  13. package/dist/cjs/core/i18n/keysets/ru.json +2 -1
  14. package/dist/cjs/core/series/constants.d.ts +1 -1
  15. package/dist/cjs/core/series/constants.js +1 -1
  16. package/dist/cjs/core/series/prepare-annotation.d.ts +12 -0
  17. package/dist/cjs/core/series/prepare-annotation.js +31 -0
  18. package/dist/cjs/core/series/prepare-legend.js +2 -2
  19. package/dist/cjs/core/series/prepare-x-range.d.ts +11 -0
  20. package/dist/cjs/core/series/prepare-x-range.js +41 -0
  21. package/dist/cjs/core/series/prepareSeries.js +9 -0
  22. package/dist/cjs/core/series/types.d.ts +34 -2
  23. package/dist/cjs/core/types/chart/annotation.d.ts +45 -0
  24. package/dist/cjs/core/types/chart/annotation.js +1 -0
  25. package/dist/cjs/core/types/chart/area.d.ts +10 -1
  26. package/dist/cjs/core/types/chart/bar-x.d.ts +6 -0
  27. package/dist/cjs/core/types/chart/line.d.ts +8 -0
  28. package/dist/cjs/core/types/chart/marker.d.ts +6 -4
  29. package/dist/cjs/core/types/chart/series.d.ts +36 -2
  30. package/dist/cjs/core/types/chart/tooltip.d.ts +7 -1
  31. package/dist/cjs/core/types/chart/x-range.d.ts +59 -0
  32. package/dist/cjs/core/types/chart/x-range.js +1 -0
  33. package/dist/cjs/core/types/chart/zoom.d.ts +1 -1
  34. package/dist/cjs/core/types/index.d.ts +2 -0
  35. package/dist/cjs/core/types/index.js +2 -0
  36. package/dist/cjs/core/utils/axis/x-axis.js +9 -1
  37. package/dist/cjs/core/utils/color.js +6 -0
  38. package/dist/cjs/core/utils/common.js +10 -0
  39. package/dist/cjs/core/utils/get-closest-data.js +19 -0
  40. package/dist/cjs/core/utils/text.d.ts +8 -0
  41. package/dist/cjs/core/utils/text.js +9 -1
  42. package/dist/cjs/core/validation/index.js +13 -0
  43. package/dist/cjs/core/zoom/zoom.js +24 -7
  44. package/dist/cjs/hooks/useShapes/annotation/index.d.ts +14 -0
  45. package/dist/cjs/hooks/useShapes/annotation/index.js +200 -0
  46. package/dist/cjs/hooks/useShapes/area/index.d.ts +2 -0
  47. package/dist/cjs/hooks/useShapes/area/index.js +21 -2
  48. package/dist/cjs/hooks/useShapes/area/prepare-data.d.ts +2 -1
  49. package/dist/cjs/hooks/useShapes/area/prepare-data.js +45 -26
  50. package/dist/cjs/hooks/useShapes/area/types.d.ts +4 -0
  51. package/dist/cjs/hooks/useShapes/bar-x/index.d.ts +2 -0
  52. package/dist/cjs/hooks/useShapes/bar-x/index.js +30 -2
  53. package/dist/cjs/hooks/useShapes/bar-x/prepare-data.js +32 -11
  54. package/dist/cjs/hooks/useShapes/bar-x/types.d.ts +2 -0
  55. package/dist/cjs/hooks/useShapes/index.d.ts +2 -1
  56. package/dist/cjs/hooks/useShapes/index.js +22 -3
  57. package/dist/cjs/hooks/useShapes/line/index.d.ts +2 -0
  58. package/dist/cjs/hooks/useShapes/line/index.js +21 -7
  59. package/dist/cjs/hooks/useShapes/line/prepare-data.d.ts +2 -1
  60. package/dist/cjs/hooks/useShapes/line/prepare-data.js +28 -10
  61. package/dist/cjs/hooks/useShapes/line/types.d.ts +4 -0
  62. package/dist/cjs/hooks/useShapes/x-range/index.d.ts +14 -0
  63. package/dist/cjs/hooks/useShapes/x-range/index.js +115 -0
  64. package/dist/cjs/hooks/useShapes/x-range/prepare-data.d.ts +15 -0
  65. package/dist/cjs/hooks/useShapes/x-range/prepare-data.js +147 -0
  66. package/dist/cjs/hooks/useShapes/x-range/types.d.ts +12 -0
  67. package/dist/cjs/hooks/useShapes/x-range/types.js +1 -0
  68. package/dist/esm/components/ChartInner/utils/zoom.js +3 -1
  69. package/dist/esm/components/Tooltip/DefaultTooltipContent/index.js +31 -6
  70. package/dist/esm/components/Tooltip/DefaultTooltipContent/utils.js +4 -5
  71. package/dist/esm/core/constants/chart-types.d.ts +1 -0
  72. package/dist/esm/core/constants/chart-types.js +1 -0
  73. package/dist/esm/core/constants/defaults/annotation.d.ts +12 -0
  74. package/dist/esm/core/constants/defaults/annotation.js +12 -0
  75. package/dist/esm/core/constants/defaults/index.d.ts +1 -0
  76. package/dist/esm/core/constants/defaults/index.js +1 -0
  77. package/dist/esm/core/constants/defaults/series-options.d.ts +5 -1
  78. package/dist/esm/core/constants/defaults/series-options.js +13 -0
  79. package/dist/esm/core/i18n/keysets/en.json +2 -1
  80. package/dist/esm/core/i18n/keysets/ru.json +2 -1
  81. package/dist/esm/core/series/constants.d.ts +1 -1
  82. package/dist/esm/core/series/constants.js +1 -1
  83. package/dist/esm/core/series/prepare-annotation.d.ts +12 -0
  84. package/dist/esm/core/series/prepare-annotation.js +31 -0
  85. package/dist/esm/core/series/prepare-legend.js +2 -2
  86. package/dist/esm/core/series/prepare-x-range.d.ts +11 -0
  87. package/dist/esm/core/series/prepare-x-range.js +41 -0
  88. package/dist/esm/core/series/prepareSeries.js +9 -0
  89. package/dist/esm/core/series/types.d.ts +34 -2
  90. package/dist/esm/core/types/chart/annotation.d.ts +45 -0
  91. package/dist/esm/core/types/chart/annotation.js +1 -0
  92. package/dist/esm/core/types/chart/area.d.ts +10 -1
  93. package/dist/esm/core/types/chart/bar-x.d.ts +6 -0
  94. package/dist/esm/core/types/chart/line.d.ts +8 -0
  95. package/dist/esm/core/types/chart/marker.d.ts +6 -4
  96. package/dist/esm/core/types/chart/series.d.ts +36 -2
  97. package/dist/esm/core/types/chart/tooltip.d.ts +7 -1
  98. package/dist/esm/core/types/chart/x-range.d.ts +59 -0
  99. package/dist/esm/core/types/chart/x-range.js +1 -0
  100. package/dist/esm/core/types/chart/zoom.d.ts +1 -1
  101. package/dist/esm/core/types/index.d.ts +2 -0
  102. package/dist/esm/core/types/index.js +2 -0
  103. package/dist/esm/core/utils/axis/x-axis.js +9 -1
  104. package/dist/esm/core/utils/color.js +6 -0
  105. package/dist/esm/core/utils/common.js +10 -0
  106. package/dist/esm/core/utils/get-closest-data.js +19 -0
  107. package/dist/esm/core/utils/text.d.ts +8 -0
  108. package/dist/esm/core/utils/text.js +9 -1
  109. package/dist/esm/core/validation/index.js +13 -0
  110. package/dist/esm/core/zoom/zoom.js +24 -7
  111. package/dist/esm/hooks/useShapes/annotation/index.d.ts +14 -0
  112. package/dist/esm/hooks/useShapes/annotation/index.js +200 -0
  113. package/dist/esm/hooks/useShapes/area/index.d.ts +2 -0
  114. package/dist/esm/hooks/useShapes/area/index.js +21 -2
  115. package/dist/esm/hooks/useShapes/area/prepare-data.d.ts +2 -1
  116. package/dist/esm/hooks/useShapes/area/prepare-data.js +45 -26
  117. package/dist/esm/hooks/useShapes/area/types.d.ts +4 -0
  118. package/dist/esm/hooks/useShapes/bar-x/index.d.ts +2 -0
  119. package/dist/esm/hooks/useShapes/bar-x/index.js +30 -2
  120. package/dist/esm/hooks/useShapes/bar-x/prepare-data.js +32 -11
  121. package/dist/esm/hooks/useShapes/bar-x/types.d.ts +2 -0
  122. package/dist/esm/hooks/useShapes/index.d.ts +2 -1
  123. package/dist/esm/hooks/useShapes/index.js +22 -3
  124. package/dist/esm/hooks/useShapes/line/index.d.ts +2 -0
  125. package/dist/esm/hooks/useShapes/line/index.js +21 -7
  126. package/dist/esm/hooks/useShapes/line/prepare-data.d.ts +2 -1
  127. package/dist/esm/hooks/useShapes/line/prepare-data.js +28 -10
  128. package/dist/esm/hooks/useShapes/line/types.d.ts +4 -0
  129. package/dist/esm/hooks/useShapes/x-range/index.d.ts +14 -0
  130. package/dist/esm/hooks/useShapes/x-range/index.js +115 -0
  131. package/dist/esm/hooks/useShapes/x-range/prepare-data.d.ts +15 -0
  132. package/dist/esm/hooks/useShapes/x-range/prepare-data.js +147 -0
  133. package/dist/esm/hooks/useShapes/x-range/types.d.ts +12 -0
  134. package/dist/esm/hooks/useShapes/x-range/types.js +1 -0
  135. package/package.json +2 -2
@@ -4,4 +4,4 @@ export declare const DEFAULT_LEGEND_SYMBOL_SIZE = 8;
4
4
  export declare const DEFAULT_LEGEND_SYMBOL_PADDING = 5;
5
5
  export declare const DEFAULT_DATALABELS_PADDING = 5;
6
6
  export declare const DEFAULT_HALO_OPTIONS: Required<Halo>;
7
- export declare const DEFAULT_POINT_MARKER_OPTIONS: Omit<Required<PointMarkerOptions>, 'enabled'>;
7
+ export declare const DEFAULT_POINT_MARKER_OPTIONS: Omit<Required<PointMarkerOptions>, 'color' | 'enabled'>;
@@ -7,8 +7,8 @@ export const DEFAULT_HALO_OPTIONS = {
7
7
  size: 6,
8
8
  };
9
9
  export const DEFAULT_POINT_MARKER_OPTIONS = {
10
- radius: 4,
11
10
  borderColor: '',
12
11
  borderWidth: 0,
12
+ radius: 4,
13
13
  symbol: 'circle',
14
14
  };
@@ -0,0 +1,12 @@
1
+ import type { ChartAnnotationLabel, ChartAnnotationPopup } from '../../types';
2
+ import type { PreparedAnnotation } from './types';
3
+ type AnnotationOptionsLabel = Omit<ChartAnnotationLabel, 'text'> | undefined;
4
+ export declare function prepareAnnotation(args: {
5
+ annotation: {
6
+ label: ChartAnnotationLabel;
7
+ popup?: ChartAnnotationPopup;
8
+ };
9
+ optionsLabel?: AnnotationOptionsLabel;
10
+ optionsPopup?: ChartAnnotationPopup;
11
+ }): Promise<PreparedAnnotation>;
12
+ export {};
@@ -0,0 +1,31 @@
1
+ import { annotationLabelDefaults, annotationPopupDefaults } from '../constants';
2
+ import { getTextSizeFn } from '../utils';
3
+ function resolvePadding(padding) {
4
+ if (padding === undefined) {
5
+ return annotationPopupDefaults.padding;
6
+ }
7
+ if (typeof padding === 'number') {
8
+ return [padding, padding];
9
+ }
10
+ return padding;
11
+ }
12
+ export async function prepareAnnotation(args) {
13
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
14
+ const { annotation, optionsLabel, optionsPopup } = args;
15
+ const style = Object.assign(Object.assign(Object.assign({}, annotationLabelDefaults.style), optionsLabel === null || optionsLabel === void 0 ? void 0 : optionsLabel.style), annotation.label.style);
16
+ const getTextSize = getTextSizeFn({ style });
17
+ const textSize = await getTextSize(annotation.label.text);
18
+ return {
19
+ label: {
20
+ style,
21
+ text: annotation.label.text,
22
+ size: { height: textSize.height, width: textSize.width },
23
+ },
24
+ popup: {
25
+ backgroundColor: (_c = (_b = (_a = annotation.popup) === null || _a === void 0 ? void 0 : _a.backgroundColor) !== null && _b !== void 0 ? _b : optionsPopup === null || optionsPopup === void 0 ? void 0 : optionsPopup.backgroundColor) !== null && _c !== void 0 ? _c : annotationPopupDefaults.backgroundColor,
26
+ borderRadius: (_f = (_e = (_d = annotation.popup) === null || _d === void 0 ? void 0 : _d.borderRadius) !== null && _e !== void 0 ? _e : optionsPopup === null || optionsPopup === void 0 ? void 0 : optionsPopup.borderRadius) !== null && _f !== void 0 ? _f : annotationPopupDefaults.borderRadius,
27
+ offset: (_j = (_h = (_g = annotation.popup) === null || _g === void 0 ? void 0 : _g.offset) !== null && _h !== void 0 ? _h : optionsPopup === null || optionsPopup === void 0 ? void 0 : optionsPopup.offset) !== null && _j !== void 0 ? _j : annotationPopupDefaults.offset,
28
+ padding: resolvePadding((_l = (_k = annotation.popup) === null || _k === void 0 ? void 0 : _k.padding) !== null && _l !== void 0 ? _l : optionsPopup === null || optionsPopup === void 0 ? void 0 : optionsPopup.padding),
29
+ },
30
+ };
31
+ }
@@ -136,7 +136,7 @@ async function getGroupedLegendItems(args) {
136
136
  else {
137
137
  resultItem.textWidth = textWidth;
138
138
  }
139
- textWidthsInLine.push(textWidth);
139
+ textWidthsInLine.push(resultItem.textWidth);
140
140
  const textsWidth = textWidthsInLine.reduce((acc, width) => acc + width, 0);
141
141
  if (!result[lineIndex]) {
142
142
  result[lineIndex] = [];
@@ -155,7 +155,7 @@ async function getGroupedLegendItems(args) {
155
155
  else if (isCurrentLineOverMaxWidth) {
156
156
  result[lineIndex].pop();
157
157
  lineIndex += 1;
158
- textWidthsInLine = [textWidth];
158
+ textWidthsInLine = [resultItem.textWidth];
159
159
  const nextLineIndex = lineIndex;
160
160
  result[nextLineIndex] = [];
161
161
  result[nextLineIndex].push(resultItem);
@@ -0,0 +1,11 @@
1
+ import type { ScaleOrdinal } from 'd3-scale';
2
+ import type { ChartSeriesOptions, XRangeSeries } from '../../types';
3
+ import type { PreparedLegend, PreparedXRangeSeries } from './types';
4
+ type PrepareXRangeSeriesArgs = {
5
+ colorScale: ScaleOrdinal<string, string>;
6
+ series: XRangeSeries[];
7
+ legend: PreparedLegend;
8
+ seriesOptions?: ChartSeriesOptions;
9
+ };
10
+ export declare function prepareXRangeSeries(args: PrepareXRangeSeriesArgs): PreparedXRangeSeries[];
11
+ export {};
@@ -0,0 +1,41 @@
1
+ import get from 'lodash/get';
2
+ import { getUniqId } from '../utils';
3
+ import { DASH_STYLE, DEFAULT_DATALABELS_STYLE } from '../constants';
4
+ import { DEFAULT_DATALABELS_PADDING } from './constants';
5
+ import { prepareLegendSymbol } from './utils';
6
+ export function prepareXRangeSeries(args) {
7
+ const { colorScale, series: seriesList, seriesOptions, legend } = args;
8
+ return seriesList.map((series) => {
9
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
10
+ const name = series.name || '';
11
+ const color = series.color || colorScale(name);
12
+ return {
13
+ type: series.type,
14
+ color,
15
+ name,
16
+ id: getUniqId(),
17
+ visible: get(series, 'visible', true),
18
+ legend: {
19
+ enabled: get(series, 'legend.enabled', legend.enabled),
20
+ symbol: prepareLegendSymbol(series),
21
+ groupId: (_b = (_a = series.legend) === null || _a === void 0 ? void 0 : _a.groupId) !== null && _b !== void 0 ? _b : getUniqId(),
22
+ itemText: (_d = (_c = series.legend) === null || _c === void 0 ? void 0 : _c.itemText) !== null && _d !== void 0 ? _d : name,
23
+ },
24
+ data: series.data,
25
+ opacity: (_e = series.opacity) !== null && _e !== void 0 ? _e : null,
26
+ borderRadius: (_h = (_f = series.borderRadius) !== null && _f !== void 0 ? _f : (_g = seriesOptions === null || seriesOptions === void 0 ? void 0 : seriesOptions['x-range']) === null || _g === void 0 ? void 0 : _g.borderRadius) !== null && _h !== void 0 ? _h : 0,
27
+ borderWidth: (_l = (_j = series.borderWidth) !== null && _j !== void 0 ? _j : (_k = seriesOptions === null || seriesOptions === void 0 ? void 0 : seriesOptions['x-range']) === null || _k === void 0 ? void 0 : _k.borderWidth) !== null && _l !== void 0 ? _l : 0,
28
+ borderColor: (_p = (_m = series.borderColor) !== null && _m !== void 0 ? _m : (_o = seriesOptions === null || seriesOptions === void 0 ? void 0 : seriesOptions['x-range']) === null || _o === void 0 ? void 0 : _o.borderColor) !== null && _p !== void 0 ? _p : 'var(--gcharts-shape-border-color)',
29
+ borderDashStyle: (_s = (_q = series.borderDashStyle) !== null && _q !== void 0 ? _q : (_r = seriesOptions === null || seriesOptions === void 0 ? void 0 : seriesOptions['x-range']) === null || _r === void 0 ? void 0 : _r.borderDashStyle) !== null && _s !== void 0 ? _s : DASH_STYLE.Solid,
30
+ cursor: get(series, 'cursor', null),
31
+ tooltip: series.tooltip,
32
+ dataLabels: {
33
+ enabled: get(series, 'dataLabels.enabled', false),
34
+ style: Object.assign({}, DEFAULT_DATALABELS_STYLE, (_t = series.dataLabels) === null || _t === void 0 ? void 0 : _t.style),
35
+ html: get(series, 'dataLabels.html', false),
36
+ padding: get(series, 'dataLabels.padding', DEFAULT_DATALABELS_PADDING),
37
+ format: (_u = series.dataLabels) === null || _u === void 0 ? void 0 : _u.format,
38
+ },
39
+ };
40
+ });
41
+ }
@@ -11,6 +11,7 @@ import { prepareSankeySeries } from './prepare-sankey';
11
11
  import { prepareScatterSeries } from './prepare-scatter';
12
12
  import { prepareTreemap } from './prepare-treemap';
13
13
  import { prepareWaterfallSeries } from './prepare-waterfall';
14
+ import { prepareXRangeSeries } from './prepare-x-range';
14
15
  export async function prepareSeries(args) {
15
16
  const { type, series, seriesOptions, legend, colors, colorScale } = args;
16
17
  switch (type) {
@@ -108,6 +109,14 @@ export async function prepareSeries(args) {
108
109
  colors,
109
110
  });
110
111
  }
112
+ case 'x-range': {
113
+ return prepareXRangeSeries({
114
+ series: series,
115
+ seriesOptions,
116
+ legend,
117
+ colorScale,
118
+ });
119
+ }
111
120
  default: {
112
121
  throw new ChartError({
113
122
  message: `Series type "${type}" does not support data preparation for series that do not support the presence of axes`,
@@ -1,5 +1,21 @@
1
- import type { AreaSeries, AreaSeriesData, BarXSeries, BarXSeriesData, BarYSeries, BarYSeriesData, BaseTextStyle, ChartLegend, ChartSeries, ChartSeriesRangeSliderOptions, ConnectorCurve, ConnectorShape, FunnelSeries, FunnelSeriesData, HeatmapSeries, HeatmapSeriesData, LineSeries, LineSeriesData, LineSeriesLineBaseStyle, PathLegendSymbolOptions, PieSeries, PieSeriesData, RadarSeries, RadarSeriesCategory, RadarSeriesData, RectLegendSymbolOptions, SankeySeries, SankeySeriesData, ScatterSeries, ScatterSeriesData, SymbolLegendSymbolOptions, TreemapSeries, TreemapSeriesData, ValueFormat, WaterfallSeries, WaterfallSeriesData } from '../../types';
1
+ import type { AreaSeries, AreaSeriesData, BarXSeries, BarXSeriesData, BarYSeries, BarYSeriesData, BaseTextStyle, ChartLegend, ChartSeries, ChartSeriesRangeSliderOptions, ConnectorCurve, ConnectorShape, FunnelSeries, FunnelSeriesData, HeatmapSeries, HeatmapSeriesData, LineSeries, LineSeriesData, LineSeriesLineBaseStyle, PathLegendSymbolOptions, PieSeries, PieSeriesData, RadarSeries, RadarSeriesCategory, RadarSeriesData, RectLegendSymbolOptions, SankeySeries, SankeySeriesData, ScatterSeries, ScatterSeriesData, SymbolLegendSymbolOptions, TreemapSeries, TreemapSeriesData, ValueFormat, WaterfallSeries, WaterfallSeriesData, XRangeSeries, XRangeSeriesData } from '../../types';
2
2
  import type { DashStyle, LayoutAlgorithm, LineCap, LineJoin, SeriesOptionsDefaults, SymbolType } from '../constants';
3
+ export type PreparedAnnotation = {
4
+ label: {
5
+ size: {
6
+ height: number;
7
+ width: number;
8
+ };
9
+ style: BaseTextStyle;
10
+ text: string;
11
+ };
12
+ popup: {
13
+ backgroundColor: string;
14
+ borderRadius: number;
15
+ offset: number;
16
+ padding: [number, number];
17
+ };
18
+ };
3
19
  export type RectLegendSymbol = {
4
20
  shape: 'rect';
5
21
  } & Required<RectLegendSymbolOptions>;
@@ -339,7 +355,23 @@ export type PreparedFunnelSeries = {
339
355
  };
340
356
  connectors: Required<FunnelSeries['connectors']>;
341
357
  } & BasePreparedSeries;
342
- export type PreparedSeries = PreparedScatterSeries | PreparedBarXSeries | PreparedBarYSeries | PreparedPieSeries | PreparedLineSeries | PreparedAreaSeries | PreparedTreemapSeries | PreparedWaterfallSeries | PreparedSankeySeries | PreparedRadarSeries | PreparedHeatmapSeries | PreparedFunnelSeries;
358
+ export type PreparedXRangeSeries = {
359
+ type: XRangeSeries['type'];
360
+ data: XRangeSeriesData[];
361
+ borderRadius: number;
362
+ borderWidth: number;
363
+ borderColor: string;
364
+ borderDashStyle: DashStyle;
365
+ opacity: number | null;
366
+ dataLabels: {
367
+ enabled: boolean;
368
+ style: BaseTextStyle;
369
+ html: boolean;
370
+ padding: number;
371
+ format?: ValueFormat;
372
+ };
373
+ } & BasePreparedSeries;
374
+ export type PreparedSeries = PreparedScatterSeries | PreparedBarXSeries | PreparedBarYSeries | PreparedPieSeries | PreparedLineSeries | PreparedAreaSeries | PreparedTreemapSeries | PreparedWaterfallSeries | PreparedSankeySeries | PreparedRadarSeries | PreparedHeatmapSeries | PreparedFunnelSeries | PreparedXRangeSeries;
343
375
  export type PreparedZoomableSeries = Extract<PreparedSeries, {
344
376
  data: Array<unknown>;
345
377
  }>;
@@ -0,0 +1,45 @@
1
+ import type { BaseTextStyle } from './base';
2
+ export interface ChartAnnotationLabel {
3
+ /** Annotation text */
4
+ text: string;
5
+ /** Text style. fontColor defaults to 'var(--g-color-text-light-primary)' */
6
+ style?: Partial<BaseTextStyle>;
7
+ }
8
+ export interface ChartAnnotationPopup {
9
+ /**
10
+ * Background color of the popup.
11
+ * @default 'var(--g-color-base-float-heavy)'
12
+ */
13
+ backgroundColor?: string;
14
+ /**
15
+ * Border radius of the popup.
16
+ * @default 4
17
+ */
18
+ borderRadius?: number;
19
+ /**
20
+ * Distance in pixels between the anchor point and the popup edge along the main axis.
21
+ * The main axis depends on the automatically chosen placement:
22
+ * for top/bottom — vertical distance, for left/right — horizontal distance.
23
+ * @default 5
24
+ */
25
+ offset?: number;
26
+ /**
27
+ * Popup padding. Number or [vertical, horizontal].
28
+ * @default [4, 8]
29
+ */
30
+ padding?: number | [number, number];
31
+ }
32
+ /** Default annotation settings applied to all data points in a series */
33
+ export interface ChartAnnotationSeriesOptions {
34
+ /** Default label style for annotations */
35
+ label?: Omit<ChartAnnotationLabel, 'text'>;
36
+ /** Default popup settings for annotations */
37
+ popup?: ChartAnnotationPopup;
38
+ }
39
+ /** Annotation for a specific data point. Renders as a popup with text label near the data point. */
40
+ export interface ChartPointAnnotation {
41
+ /** Text content and style of the annotation */
42
+ label: ChartAnnotationLabel;
43
+ /** Visual settings for the annotation popup container (background, padding, etc.) */
44
+ popup?: ChartAnnotationPopup;
45
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,6 @@
1
1
  import type { SERIES_TYPE } from '../../constants';
2
2
  import type { MeaningfulAny } from '../misc';
3
+ import type { ChartPointAnnotation } from './annotation';
3
4
  import type { BaseSeries, BaseSeriesData, BaseSeriesLegend } from './base';
4
5
  import type { RectLegendSymbolOptions } from './legend';
5
6
  import type { PointMarkerOptions } from './marker';
@@ -23,6 +24,8 @@ export interface AreaSeriesData<T = MeaningfulAny> extends BaseSeriesData<T> {
23
24
  label?: string | number;
24
25
  /** Individual marker options for the point. */
25
26
  marker?: {
27
+ /** Fill color of the marker for this point */
28
+ color?: string;
26
29
  /** States for a single point marker. */
27
30
  states?: {
28
31
  /** The normal state of a single point marker. */
@@ -35,6 +38,11 @@ export interface AreaSeriesData<T = MeaningfulAny> extends BaseSeriesData<T> {
35
38
  };
36
39
  };
37
40
  };
41
+ /**
42
+ * Annotation displayed near this data point as a bubble with text label and optional marker.
43
+ * Useful for highlighting specific values, events, or adding contextual notes.
44
+ */
45
+ annotation?: ChartPointAnnotation;
38
46
  }
39
47
  export type AreaMarkerSymbol = 'circle' | 'square';
40
48
  export interface AreaMarkerOptions extends PointMarkerOptions {
@@ -76,9 +84,10 @@ export interface AreaSeries<T = MeaningfulAny> extends BaseSeries {
76
84
  /**
77
85
  * Specifies how null or undefined values should be handled in the series.
78
86
  *
79
- * - `'connect'`: Connect points across null values (skip nulls in rendering)
87
+ * - `'connect'`: Connect points across null values (skip nulls in rendering). **Not supported with `stacking`.**
80
88
  * - `'zero'`: Treat null values as zero
81
89
  * - `'skip'`: Omit the data point (creates gap in area)
90
+ *
82
91
  * @default 'skip'
83
92
  */
84
93
  nullMode?: 'connect' | 'zero' | 'skip';
@@ -1,5 +1,6 @@
1
1
  import type { SERIES_TYPE } from '../../constants';
2
2
  import type { MeaningfulAny } from '../misc';
3
+ import type { ChartPointAnnotation } from './annotation';
3
4
  import type { BaseSeries, BaseSeriesData, BaseSeriesLegend } from './base';
4
5
  import type { RectLegendSymbolOptions } from './legend';
5
6
  import type { ChartSeriesOptions, ChartSeriesRangeSliderOptions } from './series';
@@ -27,6 +28,11 @@ export interface BarXSeriesData<T = MeaningfulAny> extends BaseSeriesData<T> {
27
28
  label?: string | number;
28
29
  /** Individual opacity for the bar-x column. */
29
30
  opacity?: number;
31
+ /**
32
+ * Annotation displayed near this data point as a bubble with text label.
33
+ * Useful for highlighting specific values, events, or adding contextual notes.
34
+ */
35
+ annotation?: ChartPointAnnotation;
30
36
  }
31
37
  export interface BarXSeries<T = MeaningfulAny> extends BaseSeries {
32
38
  type: typeof SERIES_TYPE.BarX;
@@ -1,5 +1,6 @@
1
1
  import type { DashStyle, LineCap, LineJoin, SERIES_TYPE } from '../../constants';
2
2
  import type { MeaningfulAny } from '../misc';
3
+ import type { ChartPointAnnotation } from './annotation';
3
4
  import type { BaseSeries, BaseSeriesData, BaseSeriesLegend } from './base';
4
5
  import type { RectLegendSymbolOptions } from './legend';
5
6
  import type { PointMarkerOptions } from './marker';
@@ -22,12 +23,19 @@ export interface LineSeriesData<T = MeaningfulAny> extends BaseSeriesData<T> {
22
23
  /** Data label value of the point. If not specified, the y value is used. */
23
24
  label?: string | number;
24
25
  marker?: {
26
+ /** Fill color of the marker for this point */
27
+ color?: string;
25
28
  states?: {
26
29
  normal?: {
27
30
  enabled: boolean;
28
31
  };
29
32
  };
30
33
  };
34
+ /**
35
+ * Annotation displayed near this data point as a bubble with text label and optional marker.
36
+ * Useful for highlighting specific values, events, or adding contextual notes.
37
+ */
38
+ annotation?: ChartPointAnnotation;
31
39
  }
32
40
  export interface LineSeriesLineBaseStyle {
33
41
  /**
@@ -1,12 +1,14 @@
1
1
  import type { SymbolType } from '../../constants';
2
2
  export interface PointMarkerOptions {
3
- /** Enable or disable the point marker */
4
- enabled?: boolean;
5
- /** The radius of the point marker */
6
- radius?: number;
7
3
  /** The color of the point marker's border */
8
4
  borderColor?: string;
9
5
  /** The width of the point marker's border */
10
6
  borderWidth?: number;
7
+ /** Fill color of the marker */
8
+ color?: string;
9
+ /** Enable or disable the point marker */
10
+ enabled?: boolean;
11
+ /** The radius of the point marker */
12
+ radius?: number;
11
13
  symbol?: `${SymbolType}`;
12
14
  }
@@ -1,6 +1,7 @@
1
1
  import type React from 'react';
2
2
  import type { DashStyle, LineCap, LineJoin } from '../../constants';
3
3
  import type { MeaningfulAny } from '../misc';
4
+ import type { ChartAnnotationSeriesOptions } from './annotation';
4
5
  import type { AreaSeries, AreaSeriesData } from './area';
5
6
  import type { BarXSeries, BarXSeriesData } from './bar-x';
6
7
  import type { BarYSeries, BarYSeriesData } from './bar-y';
@@ -15,8 +16,9 @@ import type { SankeySeries, SankeySeriesData } from './sankey';
15
16
  import type { ScatterSeries, ScatterSeriesData } from './scatter';
16
17
  import type { TreemapSeries, TreemapSeriesData } from './treemap';
17
18
  import type { WaterfallSeries, WaterfallSeriesData } from './waterfall';
18
- export type ChartSeries<T = MeaningfulAny> = ScatterSeries<T> | PieSeries<T> | BarXSeries<T> | BarYSeries<T> | LineSeries<T> | AreaSeries<T> | TreemapSeries<T> | WaterfallSeries<T> | SankeySeries<T> | RadarSeries<T> | HeatmapSeries<T> | FunnelSeries<T>;
19
- export type ChartSeriesData<T = MeaningfulAny> = ScatterSeriesData<T> | PieSeriesData<T> | BarXSeriesData<T> | BarYSeriesData<T> | LineSeriesData<T> | AreaSeriesData<T> | TreemapSeriesData<T> | WaterfallSeriesData<T> | SankeySeriesData<T> | RadarSeriesData<T> | HeatmapSeriesData<T> | FunnelSeriesData<T>;
19
+ import type { XRangeSeries, XRangeSeriesData } from './x-range';
20
+ export type ChartSeries<T = MeaningfulAny> = ScatterSeries<T> | PieSeries<T> | BarXSeries<T> | BarYSeries<T> | LineSeries<T> | AreaSeries<T> | TreemapSeries<T> | WaterfallSeries<T> | SankeySeries<T> | RadarSeries<T> | HeatmapSeries<T> | FunnelSeries<T> | XRangeSeries<T>;
21
+ export type ChartSeriesData<T = MeaningfulAny> = ScatterSeriesData<T> | PieSeriesData<T> | BarXSeriesData<T> | BarYSeriesData<T> | LineSeriesData<T> | AreaSeriesData<T> | TreemapSeriesData<T> | WaterfallSeriesData<T> | SankeySeriesData<T> | RadarSeriesData<T> | HeatmapSeriesData<T> | FunnelSeriesData<T> | XRangeSeriesData<T>;
20
22
  export interface DataLabelRendererData<T = MeaningfulAny> {
21
23
  data: ChartSeriesData<T>;
22
24
  }
@@ -100,6 +102,8 @@ export interface ChartSeriesOptions {
100
102
  hover?: BasicHoverState;
101
103
  inactive?: BasicInactiveState;
102
104
  };
105
+ /** Default annotation settings for all bar-x data points */
106
+ annotation?: ChartAnnotationSeriesOptions;
103
107
  };
104
108
  'bar-y'?: {
105
109
  /**
@@ -211,6 +215,8 @@ export interface ChartSeriesOptions {
211
215
  * @default 'round' when dashStyle is not 'solid', 'unset' when dashStyle is not 'solid'
212
216
  */
213
217
  linejoin?: `${LineJoin}`;
218
+ /** Default annotation settings for all line data points */
219
+ annotation?: ChartAnnotationSeriesOptions;
214
220
  };
215
221
  area?: {
216
222
  /**
@@ -230,6 +236,8 @@ export interface ChartSeriesOptions {
230
236
  };
231
237
  /** Options for the point markers of line series */
232
238
  marker?: PointMarkerOptions;
239
+ /** Default annotation settings for all area data points */
240
+ annotation?: ChartAnnotationSeriesOptions;
233
241
  };
234
242
  treemap?: {
235
243
  /** Options for the series states that provide additional styling information to the series. */
@@ -291,6 +299,32 @@ export interface ChartSeriesOptions {
291
299
  hover?: BasicHoverState;
292
300
  };
293
301
  };
302
+ 'x-range'?: {
303
+ /**
304
+ * The corner radius of the border surrounding each bar.
305
+ * @default 0
306
+ */
307
+ borderRadius?: number;
308
+ /**
309
+ * The width of the border surrounding each bar.
310
+ * @default 0
311
+ */
312
+ borderWidth?: number;
313
+ /**
314
+ * The color of the border surrounding each bar.
315
+ */
316
+ borderColor?: string;
317
+ /**
318
+ * The dash style of the border surrounding each bar.
319
+ * @default 'Solid'
320
+ */
321
+ borderDashStyle?: DashStyle;
322
+ /** Options for the series states that provide additional styling information to the series. */
323
+ states?: {
324
+ hover?: BasicHoverState;
325
+ inactive?: BasicInactiveState;
326
+ };
327
+ };
294
328
  }
295
329
  export type ChartSeriesRangeSliderOptions = {
296
330
  /**
@@ -15,6 +15,7 @@ import type { SankeySeries, SankeySeriesData } from './sankey';
15
15
  import type { ScatterSeries, ScatterSeriesData } from './scatter';
16
16
  import type { TreemapSeries, TreemapSeriesData } from './treemap';
17
17
  import type { WaterfallSeries, WaterfallSeriesData } from './waterfall';
18
+ import type { XRangeSeries, XRangeSeriesData } from './x-range';
18
19
  export interface TooltipDataChunkBarX<T = MeaningfulAny> {
19
20
  data: BarXSeriesData<T>;
20
21
  series: BarXSeries<T>;
@@ -46,6 +47,7 @@ export interface TooltipDataChunkLine<T = MeaningfulAny> {
46
47
  id: string;
47
48
  name: string;
48
49
  };
50
+ closest?: boolean;
49
51
  }
50
52
  export interface TooltipDataChunkArea<T = MeaningfulAny> {
51
53
  data: AreaSeriesData<T>;
@@ -87,7 +89,11 @@ export interface TooltipDataChunkFunnel<T = MeaningfulAny> {
87
89
  name: string;
88
90
  };
89
91
  }
90
- export type TooltipDataChunk<T = MeaningfulAny> = (TooltipDataChunkBarX<T> | TooltipDataChunkBarY<T> | TooltipDataChunkPie<T> | TooltipDataChunkScatter<T> | TooltipDataChunkLine<T> | TooltipDataChunkArea<T> | TooltipDataChunkTreemap<T> | TooltipDataChunkSankey<T> | TooltipDataChunkWaterfall<T> | TooltipDataChunkRadar<T> | TooltipDataChunkHeatmap<T> | TooltipDataChunkFunnel<T>) & {
92
+ export interface TooltipDataChunkXRange<T = MeaningfulAny> {
93
+ data: XRangeSeriesData<T>;
94
+ series: XRangeSeries<T>;
95
+ }
96
+ export type TooltipDataChunk<T = MeaningfulAny> = (TooltipDataChunkBarX<T> | TooltipDataChunkBarY<T> | TooltipDataChunkPie<T> | TooltipDataChunkScatter<T> | TooltipDataChunkLine<T> | TooltipDataChunkArea<T> | TooltipDataChunkTreemap<T> | TooltipDataChunkSankey<T> | TooltipDataChunkWaterfall<T> | TooltipDataChunkRadar<T> | TooltipDataChunkHeatmap<T> | TooltipDataChunkFunnel<T> | TooltipDataChunkXRange<T>) & {
91
97
  closest?: boolean;
92
98
  };
93
99
  export interface ChartTooltipRendererArgs<T = MeaningfulAny> {
@@ -0,0 +1,59 @@
1
+ import type { DashStyle, SERIES_TYPE } from '../../constants';
2
+ import type { MeaningfulAny } from '../misc';
3
+ import type { BaseSeries, BaseSeriesData, BaseSeriesLegend } from './base';
4
+ import type { RectLegendSymbolOptions } from './legend';
5
+ export interface XRangeSeriesData<T = MeaningfulAny> extends BaseSeriesData<T> {
6
+ /**
7
+ * The start value of the bar on the x-axis. Can be a numeric or timestamp value.
8
+ */
9
+ x0: number | string;
10
+ /**
11
+ * The end value of the bar on the x-axis. Can be a numeric or timestamp value.
12
+ */
13
+ x1: number | string;
14
+ /**
15
+ * The `y` value. Depending on the context it may represent:
16
+ * - a category value (for `category` y axis). If string, it is the category itself. If number, it is the index in `yAxis[0].categories`.
17
+ * - a numeric value (for `linear` y axis)
18
+ */
19
+ y?: string | number;
20
+ /** Individual color for the bar. Overrides the series color. */
21
+ color?: string;
22
+ /** Data label value. If not specified, the series name is used. */
23
+ label?: string | number;
24
+ /** Individual opacity for the bar. */
25
+ opacity?: number;
26
+ }
27
+ export interface XRangeSeries<T = MeaningfulAny> extends BaseSeries {
28
+ type: typeof SERIES_TYPE.XRange;
29
+ data: XRangeSeriesData<T>[];
30
+ /** The name of the series (used in legend, tooltip etc) */
31
+ name: string;
32
+ /** The main color of the series (hex, rgba) */
33
+ color?: string;
34
+ /** Individual opacity for the entire series. */
35
+ opacity?: number | null;
36
+ /**
37
+ * The corner radius of the border surrounding each bar.
38
+ * @default 0
39
+ */
40
+ borderRadius?: number;
41
+ /**
42
+ * The width of the border surrounding each bar.
43
+ * @default 0
44
+ */
45
+ borderWidth?: number;
46
+ /**
47
+ * The color of the border surrounding each bar.
48
+ */
49
+ borderColor?: string;
50
+ /**
51
+ * The dash style of the border surrounding each bar.
52
+ * @default 'Solid'
53
+ */
54
+ borderDashStyle?: DashStyle;
55
+ /** Individual series legend options. Has higher priority than legend options in widget data */
56
+ legend?: BaseSeriesLegend & {
57
+ symbol?: RectLegendSymbolOptions;
58
+ };
59
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -18,7 +18,7 @@ export interface ChartZoom {
18
18
  *
19
19
  * Supported zoom types by series type:
20
20
  * - `Area`, `Line`, `Scatter`: `x`, `y`, `xy`
21
- * - `BarX`: `x`
21
+ * - `BarX`, `XRange`: `x`
22
22
  * - `BarY`: `y`
23
23
  *
24
24
  * Default zoom type by series type:
@@ -7,6 +7,7 @@ import type { ChartTitle } from './chart/title';
7
7
  import type { ChartTooltip } from './chart/tooltip';
8
8
  import type { MeaningfulAny } from './misc';
9
9
  export * from './misc';
10
+ export * from './chart/annotation';
10
11
  export * from './chart/axis';
11
12
  export * from './chart/base';
12
13
  export * from './chart/chart';
@@ -30,6 +31,7 @@ export * from './chart/radar';
30
31
  export * from './chart/heatmap';
31
32
  export * from './chart/funnel';
32
33
  export * from './chart/brush';
34
+ export * from './chart/x-range';
33
35
  export interface ChartData<T = MeaningfulAny> {
34
36
  /**
35
37
  * General options for the chart.
@@ -1,4 +1,5 @@
1
1
  export * from './misc';
2
+ export * from './chart/annotation';
2
3
  export * from './chart/axis';
3
4
  export * from './chart/base';
4
5
  export * from './chart/chart';
@@ -22,3 +23,4 @@ export * from './chart/radar';
22
23
  export * from './chart/heatmap';
23
24
  export * from './chart/funnel';
24
25
  export * from './chart/brush';
26
+ export * from './chart/x-range';
@@ -12,7 +12,15 @@ function getTicksCount(args) {
12
12
  if (series) {
13
13
  const xDataSet = new Set();
14
14
  series === null || series === void 0 ? void 0 : series.forEach((item) => {
15
- if (isSeriesWithNumericalXValues(item)) {
15
+ if (item.type === 'x-range') {
16
+ item.data.forEach((d) => {
17
+ if (d.x0 !== null && d.x1 !== null) {
18
+ xDataSet.add(d.x0);
19
+ xDataSet.add(d.x1);
20
+ }
21
+ });
22
+ }
23
+ else if (isSeriesWithNumericalXValues(item)) {
16
24
  item.data.forEach((data) => {
17
25
  xDataSet.add(data.x);
18
26
  });
@@ -22,6 +22,12 @@ export function getDomainForContinuousColorScale(args) {
22
22
  acc.push(...s.data.map((d) => Number(d.y)));
23
23
  break;
24
24
  }
25
+ case 'x-range': {
26
+ // Use bar duration (x1 - x0) as the color domain value so that
27
+ // longer bars can be visually distinguished by color intensity.
28
+ acc.push(...s.data.map((d) => Math.abs(Number(d.x1) - Number(d.x0))));
29
+ break;
30
+ }
25
31
  default: {
26
32
  throw Error(`The method for calculation a domain for a continuous color scale for the "${s.type}" series is not defined`);
27
33
  }
@@ -57,6 +57,16 @@ export const getDomainDataXBySeries = (series) => {
57
57
  acc.push(...getDomainDataForStackedSeries(seriesList, 'y', 'x'));
58
58
  break;
59
59
  }
60
+ case 'x-range': {
61
+ seriesList.forEach((s) => {
62
+ s.data.forEach((d) => {
63
+ if (!isNil(d.x0) && !isNil(d.x1)) {
64
+ acc.push(d.x0, d.x1);
65
+ }
66
+ });
67
+ });
68
+ break;
69
+ }
60
70
  default: {
61
71
  seriesList.filter(isSeriesWithNumericalXValues).forEach((s) => {
62
72
  acc.push(...s.data.map((d) => d.x));