@gravity-ui/charts 1.40.0 → 1.41.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/README.md +4 -24
  2. package/dist/cjs/components/AxisX/AxisX.js +2 -1
  3. package/dist/cjs/components/AxisY/AxisY.js +2 -1
  4. package/dist/cjs/components/ChartInner/useChartInnerHandlers.d.ts +1 -1
  5. package/dist/cjs/components/ChartInner/useChartInnerHandlers.js +1 -1
  6. package/dist/cjs/components/ChartInner/useChartInnerProps.d.ts +1 -1
  7. package/dist/cjs/components/ChartInner/useChartInnerState.d.ts +1 -1
  8. package/dist/cjs/components/ChartInner/useDefaultState.d.ts +1 -1
  9. package/dist/cjs/components/Legend/index.js +3 -1
  10. package/dist/cjs/components/RangeSlider/utils.js +1 -1
  11. package/dist/cjs/components/Tooltip/DefaultTooltipContent/Row.js +4 -4
  12. package/dist/cjs/components/Tooltip/DefaultTooltipContent/RowWithAggregation.js +3 -2
  13. package/dist/cjs/components/Tooltip/DefaultTooltipContent/index.js +128 -118
  14. package/dist/cjs/components/Tooltip/index.d.ts +1 -1
  15. package/dist/cjs/components/Tooltip/styles.css +33 -7
  16. package/dist/cjs/components/index.d.ts +4 -1
  17. package/dist/cjs/components/index.js +9 -4
  18. package/dist/cjs/components/utils/index.js +1 -1
  19. package/dist/cjs/hooks/useAxis/x-axis.js +5 -2
  20. package/dist/cjs/hooks/useAxisScales/types.d.ts +1 -1
  21. package/dist/cjs/hooks/useAxisScales/x-scale.js +2 -1
  22. package/dist/cjs/hooks/useAxisScales/y-scale.js +2 -1
  23. package/dist/cjs/hooks/useBrush/index.js +2 -1
  24. package/dist/cjs/hooks/useBrush/types.d.ts +1 -1
  25. package/dist/cjs/hooks/useBrush/utils.d.ts +1 -1
  26. package/dist/cjs/hooks/useBrush/utils.js +2 -1
  27. package/dist/cjs/hooks/useCrosshair/index.d.ts +1 -1
  28. package/dist/cjs/hooks/useCrosshair/index.js +2 -1
  29. package/dist/cjs/hooks/useCrosshair/useCrosshairHover.d.ts +1 -1
  30. package/dist/cjs/hooks/useRangeSlider/index.js +1 -1
  31. package/dist/cjs/hooks/useSeries/index.js +2 -1
  32. package/dist/cjs/hooks/useSeries/prepare-area.d.ts +1 -1
  33. package/dist/cjs/hooks/useSeries/prepare-bar-x.d.ts +1 -1
  34. package/dist/cjs/hooks/useSeries/prepare-bar-y.d.ts +1 -1
  35. package/dist/cjs/hooks/useSeries/prepare-funnel.js +1 -1
  36. package/dist/cjs/hooks/useSeries/prepare-heatmap.d.ts +1 -1
  37. package/dist/cjs/hooks/useSeries/prepare-line.d.ts +1 -1
  38. package/dist/cjs/hooks/useSeries/prepare-pie.js +1 -1
  39. package/dist/cjs/hooks/useSeries/prepare-radar.js +1 -1
  40. package/dist/cjs/hooks/useSeries/prepare-sankey.d.ts +1 -1
  41. package/dist/cjs/hooks/useSeries/prepare-scatter.d.ts +1 -1
  42. package/dist/cjs/hooks/useSeries/prepare-treemap.d.ts +1 -1
  43. package/dist/cjs/hooks/useSeries/prepare-waterfall.d.ts +1 -1
  44. package/dist/cjs/hooks/useSeries/prepareSeries.d.ts +1 -1
  45. package/dist/cjs/hooks/useShapes/area/index.d.ts +1 -1
  46. package/dist/cjs/hooks/useShapes/area/index.js +3 -1
  47. package/dist/cjs/hooks/useShapes/area/prepare-data.d.ts +0 -1
  48. package/dist/cjs/hooks/useShapes/area/prepare-data.js +61 -31
  49. package/dist/cjs/hooks/useShapes/bar-x/index.d.ts +1 -1
  50. package/dist/cjs/hooks/useShapes/bar-x/index.js +2 -1
  51. package/dist/cjs/hooks/useShapes/bar-x/prepare-data.js +4 -3
  52. package/dist/cjs/hooks/useShapes/bar-x/types.d.ts +5 -0
  53. package/dist/cjs/hooks/useShapes/bar-y/index.d.ts +1 -1
  54. package/dist/cjs/hooks/useShapes/bar-y/index.js +2 -1
  55. package/dist/cjs/hooks/useShapes/bar-y/prepare-data.js +1 -1
  56. package/dist/cjs/hooks/useShapes/funnel/index.d.ts +1 -1
  57. package/dist/cjs/hooks/useShapes/funnel/index.js +2 -1
  58. package/dist/cjs/hooks/useShapes/funnel/prepare-data.js +1 -1
  59. package/dist/cjs/hooks/useShapes/funnel/types.d.ts +1 -1
  60. package/dist/cjs/hooks/useShapes/heatmap/index.d.ts +1 -1
  61. package/dist/cjs/hooks/useShapes/heatmap/index.js +2 -1
  62. package/dist/cjs/hooks/useShapes/index.d.ts +1 -1
  63. package/dist/cjs/hooks/useShapes/index.js +1 -2
  64. package/dist/cjs/hooks/useShapes/line/index.d.ts +1 -1
  65. package/dist/cjs/hooks/useShapes/line/index.js +3 -1
  66. package/dist/cjs/hooks/useShapes/marker.d.ts +1 -1
  67. package/dist/cjs/hooks/useShapes/marker.js +1 -1
  68. package/dist/cjs/hooks/useShapes/pie/index.d.ts +2 -1
  69. package/dist/cjs/hooks/useShapes/pie/index.js +3 -1
  70. package/dist/cjs/hooks/useShapes/pie/prepare-data.js +2 -1
  71. package/dist/cjs/hooks/useShapes/pie/types.d.ts +1 -1
  72. package/dist/cjs/hooks/useShapes/pie/utils.d.ts +1 -1
  73. package/dist/cjs/hooks/useShapes/pie/utils.js +1 -1
  74. package/dist/cjs/hooks/useShapes/radar/index.d.ts +1 -1
  75. package/dist/cjs/hooks/useShapes/radar/index.js +3 -1
  76. package/dist/cjs/hooks/useShapes/radar/prepare-data.js +3 -1
  77. package/dist/cjs/hooks/useShapes/sankey/index.d.ts +1 -1
  78. package/dist/cjs/hooks/useShapes/sankey/index.js +1 -1
  79. package/dist/cjs/hooks/useShapes/scatter/index.d.ts +1 -1
  80. package/dist/cjs/hooks/useShapes/scatter/index.js +1 -1
  81. package/dist/cjs/hooks/useShapes/treemap/index.d.ts +1 -1
  82. package/dist/cjs/hooks/useShapes/treemap/index.js +2 -1
  83. package/dist/cjs/hooks/useShapes/treemap/prepare-data.js +2 -1
  84. package/dist/cjs/hooks/useShapes/treemap/types.d.ts +1 -1
  85. package/dist/cjs/hooks/useShapes/utils.d.ts +1 -1
  86. package/dist/cjs/hooks/useShapes/utils.js +2 -1
  87. package/dist/cjs/hooks/useShapes/waterfall/index.d.ts +1 -1
  88. package/dist/cjs/hooks/useShapes/waterfall/index.js +3 -1
  89. package/dist/cjs/hooks/useTooltip/index.d.ts +1 -1
  90. package/dist/cjs/hooks/useZoom/index.js +1 -1
  91. package/dist/cjs/hooks/useZoom/utils.d.ts +1 -1
  92. package/dist/cjs/hooks/utils/bar-y.js +1 -1
  93. package/dist/cjs/hooks/utils/get-band-size.d.ts +1 -1
  94. package/dist/cjs/types/chart/pie.d.ts +1 -1
  95. package/dist/cjs/types/chart/tooltip.d.ts +24 -1
  96. package/dist/cjs/utils/chart/axis/common.d.ts +2 -1
  97. package/dist/cjs/utils/chart/axis/common.js +1 -1
  98. package/dist/cjs/utils/chart/axis-generators/bottom.d.ts +2 -1
  99. package/dist/cjs/utils/chart/axis-generators/bottom.js +2 -1
  100. package/dist/cjs/utils/chart/color.js +2 -1
  101. package/dist/cjs/utils/chart/common.js +2 -1
  102. package/dist/cjs/utils/chart/format.d.ts +1 -1
  103. package/dist/cjs/utils/chart/get-closest-data.js +2 -1
  104. package/dist/cjs/utils/chart/legend.d.ts +1 -1
  105. package/dist/cjs/utils/chart/series/sorting.js +1 -1
  106. package/dist/cjs/utils/chart/symbol.js +1 -1
  107. package/dist/cjs/utils/chart/text.d.ts +1 -1
  108. package/dist/cjs/utils/chart/ticks/datetime.js +2 -1
  109. package/dist/cjs/utils/chart/ticks/index.d.ts +1 -1
  110. package/dist/cjs/utils/dispatcher.js +1 -1
  111. package/dist/esm/components/AxisX/AxisX.js +2 -1
  112. package/dist/esm/components/AxisY/AxisY.js +2 -1
  113. package/dist/esm/components/ChartInner/useChartInnerHandlers.d.ts +1 -1
  114. package/dist/esm/components/ChartInner/useChartInnerHandlers.js +1 -1
  115. package/dist/esm/components/ChartInner/useChartInnerProps.d.ts +1 -1
  116. package/dist/esm/components/ChartInner/useChartInnerState.d.ts +1 -1
  117. package/dist/esm/components/ChartInner/useDefaultState.d.ts +1 -1
  118. package/dist/esm/components/Legend/index.js +3 -1
  119. package/dist/esm/components/RangeSlider/utils.js +1 -1
  120. package/dist/esm/components/Tooltip/DefaultTooltipContent/Row.js +4 -4
  121. package/dist/esm/components/Tooltip/DefaultTooltipContent/RowWithAggregation.js +3 -2
  122. package/dist/esm/components/Tooltip/DefaultTooltipContent/index.js +128 -118
  123. package/dist/esm/components/Tooltip/index.d.ts +1 -1
  124. package/dist/esm/components/Tooltip/styles.css +33 -7
  125. package/dist/esm/components/index.d.ts +4 -1
  126. package/dist/esm/components/index.js +9 -4
  127. package/dist/esm/components/utils/index.js +1 -1
  128. package/dist/esm/hooks/useAxis/x-axis.js +5 -2
  129. package/dist/esm/hooks/useAxisScales/types.d.ts +1 -1
  130. package/dist/esm/hooks/useAxisScales/x-scale.js +2 -1
  131. package/dist/esm/hooks/useAxisScales/y-scale.js +2 -1
  132. package/dist/esm/hooks/useBrush/index.js +2 -1
  133. package/dist/esm/hooks/useBrush/types.d.ts +1 -1
  134. package/dist/esm/hooks/useBrush/utils.d.ts +1 -1
  135. package/dist/esm/hooks/useBrush/utils.js +2 -1
  136. package/dist/esm/hooks/useCrosshair/index.d.ts +1 -1
  137. package/dist/esm/hooks/useCrosshair/index.js +2 -1
  138. package/dist/esm/hooks/useCrosshair/useCrosshairHover.d.ts +1 -1
  139. package/dist/esm/hooks/useRangeSlider/index.js +1 -1
  140. package/dist/esm/hooks/useSeries/index.js +2 -1
  141. package/dist/esm/hooks/useSeries/prepare-area.d.ts +1 -1
  142. package/dist/esm/hooks/useSeries/prepare-bar-x.d.ts +1 -1
  143. package/dist/esm/hooks/useSeries/prepare-bar-y.d.ts +1 -1
  144. package/dist/esm/hooks/useSeries/prepare-funnel.js +1 -1
  145. package/dist/esm/hooks/useSeries/prepare-heatmap.d.ts +1 -1
  146. package/dist/esm/hooks/useSeries/prepare-line.d.ts +1 -1
  147. package/dist/esm/hooks/useSeries/prepare-pie.js +1 -1
  148. package/dist/esm/hooks/useSeries/prepare-radar.js +1 -1
  149. package/dist/esm/hooks/useSeries/prepare-sankey.d.ts +1 -1
  150. package/dist/esm/hooks/useSeries/prepare-scatter.d.ts +1 -1
  151. package/dist/esm/hooks/useSeries/prepare-treemap.d.ts +1 -1
  152. package/dist/esm/hooks/useSeries/prepare-waterfall.d.ts +1 -1
  153. package/dist/esm/hooks/useSeries/prepareSeries.d.ts +1 -1
  154. package/dist/esm/hooks/useShapes/area/index.d.ts +1 -1
  155. package/dist/esm/hooks/useShapes/area/index.js +3 -1
  156. package/dist/esm/hooks/useShapes/area/prepare-data.d.ts +0 -1
  157. package/dist/esm/hooks/useShapes/area/prepare-data.js +61 -31
  158. package/dist/esm/hooks/useShapes/bar-x/index.d.ts +1 -1
  159. package/dist/esm/hooks/useShapes/bar-x/index.js +2 -1
  160. package/dist/esm/hooks/useShapes/bar-x/prepare-data.js +4 -3
  161. package/dist/esm/hooks/useShapes/bar-x/types.d.ts +5 -0
  162. package/dist/esm/hooks/useShapes/bar-y/index.d.ts +1 -1
  163. package/dist/esm/hooks/useShapes/bar-y/index.js +2 -1
  164. package/dist/esm/hooks/useShapes/bar-y/prepare-data.js +1 -1
  165. package/dist/esm/hooks/useShapes/funnel/index.d.ts +1 -1
  166. package/dist/esm/hooks/useShapes/funnel/index.js +2 -1
  167. package/dist/esm/hooks/useShapes/funnel/prepare-data.js +1 -1
  168. package/dist/esm/hooks/useShapes/funnel/types.d.ts +1 -1
  169. package/dist/esm/hooks/useShapes/heatmap/index.d.ts +1 -1
  170. package/dist/esm/hooks/useShapes/heatmap/index.js +2 -1
  171. package/dist/esm/hooks/useShapes/index.d.ts +1 -1
  172. package/dist/esm/hooks/useShapes/index.js +1 -2
  173. package/dist/esm/hooks/useShapes/line/index.d.ts +1 -1
  174. package/dist/esm/hooks/useShapes/line/index.js +3 -1
  175. package/dist/esm/hooks/useShapes/marker.d.ts +1 -1
  176. package/dist/esm/hooks/useShapes/marker.js +1 -1
  177. package/dist/esm/hooks/useShapes/pie/index.d.ts +2 -1
  178. package/dist/esm/hooks/useShapes/pie/index.js +3 -1
  179. package/dist/esm/hooks/useShapes/pie/prepare-data.js +2 -1
  180. package/dist/esm/hooks/useShapes/pie/types.d.ts +1 -1
  181. package/dist/esm/hooks/useShapes/pie/utils.d.ts +1 -1
  182. package/dist/esm/hooks/useShapes/pie/utils.js +1 -1
  183. package/dist/esm/hooks/useShapes/radar/index.d.ts +1 -1
  184. package/dist/esm/hooks/useShapes/radar/index.js +3 -1
  185. package/dist/esm/hooks/useShapes/radar/prepare-data.js +3 -1
  186. package/dist/esm/hooks/useShapes/sankey/index.d.ts +1 -1
  187. package/dist/esm/hooks/useShapes/sankey/index.js +1 -1
  188. package/dist/esm/hooks/useShapes/scatter/index.d.ts +1 -1
  189. package/dist/esm/hooks/useShapes/scatter/index.js +1 -1
  190. package/dist/esm/hooks/useShapes/treemap/index.d.ts +1 -1
  191. package/dist/esm/hooks/useShapes/treemap/index.js +2 -1
  192. package/dist/esm/hooks/useShapes/treemap/prepare-data.js +2 -1
  193. package/dist/esm/hooks/useShapes/treemap/types.d.ts +1 -1
  194. package/dist/esm/hooks/useShapes/utils.d.ts +1 -1
  195. package/dist/esm/hooks/useShapes/utils.js +2 -1
  196. package/dist/esm/hooks/useShapes/waterfall/index.d.ts +1 -1
  197. package/dist/esm/hooks/useShapes/waterfall/index.js +3 -1
  198. package/dist/esm/hooks/useTooltip/index.d.ts +1 -1
  199. package/dist/esm/hooks/useZoom/index.js +1 -1
  200. package/dist/esm/hooks/useZoom/utils.d.ts +1 -1
  201. package/dist/esm/hooks/utils/bar-y.js +1 -1
  202. package/dist/esm/hooks/utils/get-band-size.d.ts +1 -1
  203. package/dist/esm/types/chart/pie.d.ts +1 -1
  204. package/dist/esm/types/chart/tooltip.d.ts +24 -1
  205. package/dist/esm/utils/chart/axis/common.d.ts +2 -1
  206. package/dist/esm/utils/chart/axis/common.js +1 -1
  207. package/dist/esm/utils/chart/axis-generators/bottom.d.ts +2 -1
  208. package/dist/esm/utils/chart/axis-generators/bottom.js +2 -1
  209. package/dist/esm/utils/chart/color.js +2 -1
  210. package/dist/esm/utils/chart/common.js +2 -1
  211. package/dist/esm/utils/chart/format.d.ts +1 -1
  212. package/dist/esm/utils/chart/get-closest-data.js +2 -1
  213. package/dist/esm/utils/chart/legend.d.ts +1 -1
  214. package/dist/esm/utils/chart/series/sorting.js +1 -1
  215. package/dist/esm/utils/chart/symbol.js +1 -1
  216. package/dist/esm/utils/chart/text.d.ts +1 -1
  217. package/dist/esm/utils/chart/ticks/datetime.js +2 -1
  218. package/dist/esm/utils/chart/ticks/index.d.ts +1 -1
  219. package/dist/esm/utils/dispatcher.js +1 -1
  220. package/package.json +15 -2
@@ -1,4 +1,5 @@
1
- import { path, select } from 'd3';
1
+ import { path } from 'd3-path';
2
+ import { select } from 'd3-selection';
2
3
  import get from 'lodash/get';
3
4
  import { getDataCategoryValue } from '../../utils';
4
5
  const ONE_POINT_DOMAIN_DATA_CAPACITY = 3;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { Dispatch } from 'd3';
2
+ import type { Dispatch } from 'd3-dispatch';
3
3
  import type { PreparedSeriesOptions } from '../../useSeries/types';
4
4
  import type { PreparedWaterfallData } from './types';
5
5
  export { prepareWaterfallData } from './prepare-data';
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
- import { color, line as lineGenerator, select } from 'd3';
2
+ import { color } from 'd3-color';
3
+ import { select } from 'd3-selection';
4
+ import { line as lineGenerator } from 'd3-shape';
3
5
  import get from 'lodash/get';
4
6
  import { DASH_STYLE } from '../../../constants';
5
7
  import { block, filterOverlappingLabels, getLineDashArray, getWaterfallPointColor, } from '../../../utils';
@@ -1,4 +1,4 @@
1
- import type { Dispatch } from 'd3';
1
+ import type { Dispatch } from 'd3-dispatch';
2
2
  import type { AxisPlotBand, AxisPlotLine, PointPosition, TooltipDataChunk } from '../../types';
3
3
  import type { PreparedTooltip } from '../types';
4
4
  import type { PreparedXAxis, PreparedYAxis } from '../useAxis/types';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { select } from 'd3';
2
+ import { select } from 'd3-selection';
3
3
  import { useBrush } from '../useBrush';
4
4
  import { selectionToZoomBounds } from './utils';
5
5
  export function useZoom(props) {
@@ -1,4 +1,4 @@
1
- import type { BrushSelection } from 'd3';
1
+ import type { BrushSelection } from 'd3-brush';
2
2
  import type { ZoomType } from '../../constants';
3
3
  import type { PreparedXAxis, PreparedYAxis } from '../useAxis/types';
4
4
  import type { ChartScale } from '../useAxisScales/types';
@@ -1,4 +1,4 @@
1
- import { max } from 'd3';
1
+ import { max } from 'd3-array';
2
2
  import get from 'lodash/get';
3
3
  import { getDataCategoryValue } from '../../utils';
4
4
  import { MIN_BAR_GAP, MIN_BAR_GROUP_GAP, MIN_BAR_WIDTH } from '../constants';
@@ -1,4 +1,4 @@
1
- import type { AxisDomain, AxisScale } from 'd3';
1
+ import type { AxisDomain, AxisScale } from 'd3-axis';
2
2
  export declare function getBandSize({ domain, scale, }: {
3
3
  domain: AxisDomain[];
4
4
  scale: AxisScale<AxisDomain> | undefined;
@@ -1,4 +1,4 @@
1
- import type { BaseType } from 'd3';
1
+ import type { BaseType } from 'd3-selection';
2
2
  import type { SERIES_TYPE } from '../../constants';
3
3
  import type { MeaningfulAny } from '../misc';
4
4
  import type { BaseSeries, BaseSeriesData, BaseSeriesLegend } from './base';
@@ -113,6 +113,10 @@ export type ChartTooltipRowRendererArgs = {
113
113
  value: string | number | null | undefined;
114
114
  formattedValue?: string;
115
115
  hovered?: TooltipDataChunk<unknown>[];
116
+ /**
117
+ * CSS class name pre-built with active/striped modifiers.
118
+ * Apply it to the root `<tr>` element of the returned row: `<tr className={className}>`.
119
+ */
116
120
  className?: string;
117
121
  };
118
122
  export type ChartTooltipSortComparator<T = MeaningfulAny> = (a: TooltipDataChunk<T>, b: TooltipDataChunk<T>) => number;
@@ -123,7 +127,26 @@ export interface ChartTooltip<T = MeaningfulAny> {
123
127
  /**
124
128
  * Defines the way a single data/series is displayed (corresponding to a separate selected point/ruler/shape on the chart).
125
129
  * It is useful in cases where you need to display additional information, but keep the general format of the tooltip.
126
- * If a string is returned, it will be interpreted as raw HTML and inserted without escaping.
130
+ *
131
+ * The returned React element must be a `<tr>` so that it fits into the table layout used by the tooltip.
132
+ * Apply the `className` arg to the root `<tr>` to get the correct active/striped styles.
133
+ *
134
+ * If a string is returned, it will be parsed as HTML and rendered as-is — the string must be a complete
135
+ * `<tr>...</tr>` element.
136
+ * @example React element
137
+ * ```tsx
138
+ * rowRenderer: ({id, name, value, className}) => (
139
+ * <tr key={id} className={className}>
140
+ * <td>{name}</td>
141
+ * <td>{value}</td>
142
+ * </tr>
143
+ * )
144
+ * ```
145
+ * @example Raw HTML string
146
+ * ```ts
147
+ * rowRenderer: ({name, value, className}) =>
148
+ * `<tr class="${className}"><td>${name}</td><td>${value}</td></tr>`
149
+ * ```
127
150
  */
128
151
  rowRenderer?: ((args: ChartTooltipRowRendererArgs) => React.ReactElement | string) | null;
129
152
  pin?: {
@@ -1,4 +1,5 @@
1
- import type { AxisDomain, AxisScale, ScaleBand, ScaleTime } from 'd3';
1
+ import type { AxisDomain, AxisScale } from 'd3-axis';
2
+ import type { ScaleBand, ScaleTime } from 'd3-scale';
2
3
  import type { ChartScale, PreparedAxis, PreparedAxisPlotBand, PreparedSplit } from '../../../hooks';
3
4
  import type { ChartAxis } from '../../../types';
4
5
  import type { AxisDirection } from '../types';
@@ -1,4 +1,4 @@
1
- import { ascending, descending, reverse, sort } from 'd3';
1
+ import { ascending, descending, reverse, sort } from 'd3-array';
2
2
  import clamp from 'lodash/clamp';
3
3
  import { getScaleTicks } from '../ticks';
4
4
  export function getTicksCountByPixelInterval({ axis, axisWidth, }) {
@@ -1,4 +1,5 @@
1
- import type { AxisDomain, AxisScale, Selection } from 'd3';
1
+ import type { AxisDomain, AxisScale } from 'd3-axis';
2
+ import type { Selection } from 'd3-selection';
2
3
  import type { BaseTextStyle, MeaningfulAny } from '../../../types';
3
4
  interface AxisBottomArgs {
4
5
  domain: {
@@ -1,4 +1,5 @@
1
- import { path, select } from 'd3';
1
+ import { path } from 'd3-path';
2
+ import { select } from 'd3-selection';
2
3
  import { getAxisItems, getXAxisOffset, getXTickPosition } from '../axis/common';
3
4
  import { calculateCos, calculateSin } from '../math';
4
5
  import { getLabelsSize, setEllipsisForOverflowText } from '../text';
@@ -1,4 +1,5 @@
1
- import { range, scaleLinear } from 'd3';
1
+ import { range } from 'd3-array';
2
+ import { scaleLinear } from 'd3-scale';
2
3
  export function getDomainForContinuousColorScale(args) {
3
4
  const { series } = args;
4
5
  const values = series.reduce((acc, s) => {
@@ -1,4 +1,5 @@
1
- import { group, select } from 'd3';
1
+ import { group } from 'd3-array';
2
+ import { select } from 'd3-selection';
2
3
  import get from 'lodash/get';
3
4
  import isNil from 'lodash/isNil';
4
5
  import sortBy from 'lodash/sortBy';
@@ -1,4 +1,4 @@
1
- import type { AxisDomain } from 'd3';
1
+ import type { AxisDomain } from 'd3-axis';
2
2
  import type { PreparedAxis } from '../../hooks';
3
3
  import type { CustomFormat, ValueFormat } from '../../types';
4
4
  export declare function getFormattedValue(args: {
@@ -1,4 +1,5 @@
1
- import { Delaunay, bisector, sort } from 'd3';
1
+ import { bisector, sort } from 'd3-array';
2
+ import { Delaunay } from 'd3-delaunay';
2
3
  import get from 'lodash/get';
3
4
  import groupBy from 'lodash/groupBy';
4
5
  function getClosestYIndex(items, y) {
@@ -1,4 +1,4 @@
1
- import type { Selection } from 'd3';
1
+ import type { Selection } from 'd3-selection';
2
2
  export declare function createGradientRect(container: Selection<SVGGElement, unknown, null, undefined>, args: {
3
3
  x?: number;
4
4
  y?: number;
@@ -1,4 +1,4 @@
1
- import { sort } from 'd3';
1
+ import { sort } from 'd3-array';
2
2
  import { isEmpty } from 'lodash';
3
3
  import get from 'lodash/get';
4
4
  import { SERIES_TYPE } from '../../../constants';
@@ -1,4 +1,4 @@
1
- import { symbolCircle, symbolDiamond2, symbolSquare, symbolTriangle2 } from 'd3';
1
+ import { symbolCircle, symbolDiamond2, symbolSquare, symbolTriangle2 } from 'd3-shape';
2
2
  import { SymbolType } from '../../constants';
3
3
  export const getSymbolType = (index) => {
4
4
  const scatterStyles = Object.values(SymbolType);
@@ -1,4 +1,4 @@
1
- import type { Selection } from 'd3';
1
+ import type { Selection } from 'd3-selection';
2
2
  import type { BaseTextStyle, MeaningfulAny } from '../../types';
3
3
  export declare function handleOverflowingText(tSpan: SVGTSpanElement | null, maxWidth: number, textWidth?: number): void;
4
4
  export declare function setEllipsisForOverflowText<T>(selection: Selection<SVGTextElement, T, null, unknown>, maxWidth: number, textWidth?: number): void;
@@ -1,4 +1,5 @@
1
- import { bisector, tickStep, utcDay, utcHour, utcMillisecond, utcMinute, utcMonth, utcSecond, utcMonday as utcWeek, utcYear, } from 'd3';
1
+ import { bisector, tickStep } from 'd3-array';
2
+ import { utcDay, utcHour, utcMillisecond, utcMinute, utcMonth, utcSecond, utcMonday as utcWeek, utcYear, } from 'd3-time';
2
3
  import { DAY, HOUR, MINUTE, MONTH, SECOND, WEEK, YEAR } from '../../../constants';
3
4
  const tickIntervals = [
4
5
  [utcSecond, 1, SECOND],
@@ -1,4 +1,4 @@
1
- import type { AxisDomain, AxisScale } from 'd3';
1
+ import type { AxisDomain, AxisScale } from 'd3-axis';
2
2
  import type { ChartScale } from '../../../hooks';
3
3
  export declare function getScaleTicks({ scale, ticksCount, }: {
4
4
  scale: ChartScale | AxisScale<AxisDomain>;
@@ -1,4 +1,4 @@
1
- import { dispatch } from 'd3';
1
+ import { dispatch } from 'd3-dispatch';
2
2
  export const EventType = {
3
3
  CLICK_CHART: 'click-chart',
4
4
  HOVER_SHAPE: 'hover-shape',
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { line, select } from 'd3';
2
+ import { select } from 'd3-selection';
3
+ import { line } from 'd3-shape';
3
4
  import { HtmlLayer } from '../../hooks/useShapes/HtmlLayer';
4
5
  import { block, getLineDashArray } from '../../utils';
5
6
  import './styles.css';
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { line, select } from 'd3';
2
+ import { select } from 'd3-selection';
3
+ import { line } from 'd3-shape';
3
4
  import { HtmlLayer } from '../../hooks/useShapes/HtmlLayer';
4
5
  import { block, getLineDashArray } from '../../utils';
5
6
  import './styles.css';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { Dispatch } from 'd3';
2
+ import type { Dispatch } from 'd3-dispatch';
3
3
  import type { PreparedXAxis, PreparedYAxis, ShapeData } from '../../hooks';
4
4
  import type { ChartScale } from '../../hooks/useAxisScales/types';
5
5
  import type { useChartInnerState } from './useChartInnerState';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { pointer } from 'd3';
2
+ import { pointer } from 'd3-selection';
3
3
  import get from 'lodash/get';
4
4
  import throttle from 'lodash/throttle';
5
5
  import { IS_TOUCH_ENABLED } from '../../constants';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { Dispatch } from 'd3';
2
+ import type { Dispatch } from 'd3-dispatch';
3
3
  import type { ChartScale, LegendItem, OnLegendItemClick, PreparedLegend, PreparedSeries, PreparedSplit, PreparedXAxis, PreparedYAxis, RangeSliderState, ShapeData, ZoomState } from '../../hooks';
4
4
  import type { PreparedChart } from '../../hooks/types';
5
5
  import type { LegendConfig } from '../../types';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { Dispatch } from 'd3';
2
+ import type { Dispatch } from 'd3-dispatch';
3
3
  import type { PreparedRangeSlider, PreparedTooltip, RangeSliderState, ZoomState } from '../../hooks';
4
4
  type Props = {
5
5
  dispatcher: Dispatch<object>;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { Dispatch } from 'd3';
2
+ import type { Dispatch } from 'd3-dispatch';
3
3
  import type { PreparedXAxis, PreparedYAxis, ShapeData } from '../../hooks';
4
4
  import type { ChartScale } from '../../hooks/useAxisScales/types';
5
5
  type Props = {
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
- import { scaleLinear, select, symbol } from 'd3';
2
+ import { scaleLinear } from 'd3-scale';
3
+ import { select } from 'd3-selection';
4
+ import { symbol } from 'd3-shape';
3
5
  import { CONTINUOUS_LEGEND_SIZE } from '../../constants';
4
6
  import { formatNumber } from '../../libs';
5
7
  import { block, createGradientRect, getContinuesColorFn, getLabelsSize, getSymbol, getUniqId, } from '../../utils';
@@ -1,4 +1,4 @@
1
- import { path } from 'd3';
1
+ import { path } from 'd3-path';
2
2
  export function getFramedPath(args) {
3
3
  const { height, strokeWidth, width } = args;
4
4
  const p = path();
@@ -12,8 +12,8 @@ export function Row(props) {
12
12
  }
13
13
  return null;
14
14
  }, [color, colorSymbol]);
15
- return (React.createElement("div", { className: b('content-row', { active, striped }, className), style: style },
16
- colorItem,
17
- React.createElement("span", { className: b('content-row-label') }, label),
18
- value && React.createElement("span", { className: b('content-row-value') }, value)));
15
+ return (React.createElement("tr", { className: b('content-row', { active, striped }, className), style: style },
16
+ colorItem && React.createElement("td", { className: b('content-row-color-cell') }, colorItem),
17
+ React.createElement("td", { className: b('content-row-label-cell') }, label),
18
+ value && React.createElement("td", { className: b('content-row-value-cell') }, value)));
19
19
  }
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { block } from '../../../utils';
3
3
  import { getFormattedValue } from '../../../utils/chart/format';
4
- import { Row } from './Row';
5
4
  import { getBuiltInAggregatedValue, getBuiltInAggregationLabel } from './utils';
6
5
  const b = block('tooltip');
7
6
  export function RowWithAggregation(props) {
@@ -19,5 +18,7 @@ export function RowWithAggregation(props) {
19
18
  format: valueFormat || { type: 'number' },
20
19
  })
21
20
  : resultValue;
22
- return (React.createElement(Row, { className: b('content-row-totals'), label: resultLabel, style: style, value: formattedResultValue }));
21
+ return (React.createElement("div", { className: b('content-row', { totals: true }), style: style },
22
+ React.createElement("span", { className: b('content-row-totals-label') }, resultLabel),
23
+ formattedResultValue && (React.createElement("span", { className: b('content-row-totals-value') }, formattedResultValue))));
23
24
  }
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { Divider } from '@gravity-ui/uikit';
3
+ import parse from 'html-react-parser';
3
4
  import get from 'lodash/get';
4
5
  import isEqual from 'lodash/isEqual';
5
6
  import { usePrevious } from '../../../hooks';
@@ -35,7 +36,7 @@ export const DefaultTooltipContent = ({ hovered, pinned, rowRenderer, totals, va
35
36
  hovered,
36
37
  });
37
38
  if (typeof result === 'string') {
38
- return React.createElement("div", { key: id, dangerouslySetInnerHTML: { __html: result } });
39
+ return React.createElement(React.Fragment, { key: id }, parse(result));
39
40
  }
40
41
  return result;
41
42
  }
@@ -75,127 +76,136 @@ export const DefaultTooltipContent = ({ hovered, pinned, rowRenderer, totals, va
75
76
  setScrollBarWidth(0);
76
77
  }
77
78
  }, [pinned]);
79
+ const rowsContent = (React.createElement(React.Fragment, null, visibleHovered.map((seriesItem, i) => {
80
+ var _a;
81
+ const { data, series, closest } = seriesItem;
82
+ const id = `${get(series, 'id')}_${i}`;
83
+ const color = get(data, 'color') || get(series, 'color');
84
+ // TODO: improve active item display https://github.com/gravity-ui/charts/issues/208
85
+ const active = closest && hovered.length > 1;
86
+ const striped = (i + 1) % 2 === 0;
87
+ const rowValueFormat = get(series, 'tooltip.valueFormat', valueFormat);
88
+ switch (series.type) {
89
+ case 'scatter':
90
+ case 'line':
91
+ case 'area':
92
+ case 'bar-x': {
93
+ const format = rowValueFormat || getDefaultValueFormat({ axis: yAxis });
94
+ const formattedValue = getFormattedValue({
95
+ value: hoveredValues[i],
96
+ format,
97
+ });
98
+ return renderRow({
99
+ id,
100
+ active,
101
+ color,
102
+ name: series.name,
103
+ striped,
104
+ value: hoveredValues[i],
105
+ formattedValue,
106
+ series,
107
+ });
108
+ }
109
+ case 'waterfall': {
110
+ const isTotal = get(data, 'total', false);
111
+ const subTotalValue = (_a = seriesItem.subTotal) !== null && _a !== void 0 ? _a : 0;
112
+ const format = rowValueFormat || getDefaultValueFormat({ axis: yAxis });
113
+ const subTotal = getFormattedValue({
114
+ value: subTotalValue,
115
+ format,
116
+ });
117
+ const formattedValue = getFormattedValue({
118
+ value: hoveredValues[i],
119
+ format,
120
+ });
121
+ return (React.createElement(React.Fragment, { key: id },
122
+ !isTotal && (React.createElement(React.Fragment, null,
123
+ React.createElement("div", { className: b('series-name') }, getXRowData(data, xAxis)),
124
+ React.createElement(Row, { label: series.name, value: formattedValue }))),
125
+ React.createElement(Row, { label: isTotal ? 'Total' : 'Subtotal', value: subTotal })));
126
+ }
127
+ case 'bar-y': {
128
+ const format = rowValueFormat || getDefaultValueFormat({ axis: xAxis });
129
+ const formattedValue = getFormattedValue({
130
+ value: hoveredValues[i],
131
+ format,
132
+ });
133
+ return renderRow({
134
+ id,
135
+ active,
136
+ color,
137
+ name: series.name,
138
+ striped,
139
+ value: hoveredValues[i],
140
+ formattedValue,
141
+ });
142
+ }
143
+ case 'pie':
144
+ case 'heatmap':
145
+ case 'treemap':
146
+ case 'funnel': {
147
+ const seriesData = data;
148
+ const formattedValue = getFormattedValue({
149
+ value: hoveredValues[i],
150
+ format: rowValueFormat || { type: 'number' },
151
+ });
152
+ return renderRow({
153
+ id,
154
+ color,
155
+ name: [seriesData.name || seriesData.id].flat().join('\n'),
156
+ value: hoveredValues[i],
157
+ formattedValue,
158
+ });
159
+ }
160
+ case 'sankey': {
161
+ const { target, data: source } = seriesItem;
162
+ const formattedValue = getFormattedValue({
163
+ value: hoveredValues[i],
164
+ format: rowValueFormat || { type: 'number' },
165
+ });
166
+ return renderRow({
167
+ id,
168
+ color,
169
+ name: `${source.name} → ${target === null || target === void 0 ? void 0 : target.name}`,
170
+ value: hoveredValues[i],
171
+ formattedValue,
172
+ });
173
+ }
174
+ case 'radar': {
175
+ const radarSeries = series;
176
+ const formattedValue = getFormattedValue({
177
+ value: hoveredValues[i],
178
+ format: rowValueFormat || { type: 'number' },
179
+ });
180
+ return renderRow({
181
+ id,
182
+ color,
183
+ active,
184
+ name: radarSeries.name || radarSeries.id,
185
+ value: hoveredValues[i],
186
+ formattedValue,
187
+ });
188
+ }
189
+ default: {
190
+ return null;
191
+ }
192
+ }
193
+ })));
78
194
  return (React.createElement("div", { className: b('content'), "data-qa": qa },
79
195
  formattedHeadValue && (React.createElement("div", { className: b('series-name') },
80
196
  React.createElement("div", { className: b('series-name-text'), dangerouslySetInnerHTML: { __html: formattedHeadValue } }))),
81
197
  React.createElement("div", { className: b('content-rows', { pinned }), ref: contentRowsRef, style: pinned ? { maxHeight: maxContentRowsHeight } : undefined },
82
- visibleHovered.map((seriesItem, i) => {
83
- var _a;
84
- const { data, series, closest } = seriesItem;
85
- const id = `${get(series, 'id')}_${i}`;
86
- const color = get(data, 'color') || get(series, 'color');
87
- // TODO: improve action item display https://github.com/gravity-ui/charts/issues/208
88
- const active = closest && hovered.length > 1;
89
- const striped = (i + 1) % 2 === 0;
90
- const rowValueFormat = get(series, 'tooltip.valueFormat', valueFormat);
91
- switch (series.type) {
92
- case 'scatter':
93
- case 'line':
94
- case 'area':
95
- case 'bar-x': {
96
- const format = rowValueFormat || getDefaultValueFormat({ axis: yAxis });
97
- const formattedValue = getFormattedValue({
98
- value: hoveredValues[i],
99
- format,
100
- });
101
- return renderRow({
102
- id,
103
- active,
104
- color,
105
- name: series.name,
106
- striped,
107
- value: hoveredValues[i],
108
- formattedValue,
109
- series,
110
- });
111
- }
112
- case 'waterfall': {
113
- const isTotal = get(data, 'total', false);
114
- const subTotalValue = (_a = seriesItem.subTotal) !== null && _a !== void 0 ? _a : 0;
115
- const format = rowValueFormat || getDefaultValueFormat({ axis: yAxis });
116
- const subTotal = getFormattedValue({
117
- value: subTotalValue,
118
- format,
119
- });
120
- const formattedValue = getFormattedValue({
121
- value: hoveredValues[i],
122
- format,
123
- });
124
- return (React.createElement(React.Fragment, { key: id },
125
- !isTotal && (React.createElement(React.Fragment, null,
126
- React.createElement("div", { className: b('series-name') }, getXRowData(data, xAxis)),
127
- React.createElement(Row, { label: series.name, value: formattedValue }))),
128
- React.createElement(Row, { label: isTotal ? 'Total' : 'Subtotal', value: subTotal })));
129
- }
130
- case 'bar-y': {
131
- const format = rowValueFormat || getDefaultValueFormat({ axis: xAxis });
132
- const formattedValue = getFormattedValue({
133
- value: hoveredValues[i],
134
- format,
135
- });
136
- return renderRow({
137
- id,
138
- active,
139
- color,
140
- name: series.name,
141
- striped,
142
- value: hoveredValues[i],
143
- formattedValue,
144
- });
145
- }
146
- case 'pie':
147
- case 'heatmap':
148
- case 'treemap':
149
- case 'funnel': {
150
- const seriesData = data;
151
- const formattedValue = getFormattedValue({
152
- value: hoveredValues[i],
153
- format: rowValueFormat || { type: 'number' },
154
- });
155
- return renderRow({
156
- id,
157
- color,
158
- name: [seriesData.name || seriesData.id].flat().join('\n'),
159
- value: hoveredValues[i],
160
- formattedValue,
161
- });
162
- }
163
- case 'sankey': {
164
- const { target, data: source } = seriesItem;
165
- const formattedValue = getFormattedValue({
166
- value: hoveredValues[i],
167
- format: rowValueFormat || { type: 'number' },
168
- });
169
- return renderRow({
170
- id,
171
- color,
172
- name: `${source.name} → ${target === null || target === void 0 ? void 0 : target.name}`,
173
- value: hoveredValues[i],
174
- formattedValue,
175
- });
176
- }
177
- case 'radar': {
178
- const radarSeries = series;
179
- const formattedValue = getFormattedValue({
180
- value: hoveredValues[i],
181
- format: rowValueFormat || { type: 'number' },
182
- });
183
- return renderRow({
184
- id,
185
- color,
186
- active,
187
- name: radarSeries.name || radarSeries.id,
188
- value: hoveredValues[i],
189
- formattedValue,
190
- });
191
- }
192
- default: {
193
- return null;
194
- }
195
- }
196
- }),
197
- Boolean(restHoveredValues.length) && (React.createElement(Row, { label: i18n('tooltip', 'label_more', { count: restHoveredValues.length }), striped: (visibleHovered.length + 1) % 2 === 0 }))),
198
+ React.createElement("table", { className: b('content-rows-table') },
199
+ React.createElement("tbody", null, rowsContent))),
200
+ Boolean(restHoveredValues.length) && (React.createElement("div", { className: b('content-row', {
201
+ striped: (visibleHovered.length + 1) % 2 === 0,
202
+ }) }, i18n('tooltip', 'label_more', { count: restHoveredValues.length }))),
198
203
  (totals === null || totals === void 0 ? void 0 : totals.enabled) && hovered.length > 1 && (React.createElement(React.Fragment, null,
199
204
  React.createElement(Divider, { className: b('content-row-totals-divider') }),
200
- React.createElement(RowWithAggregation, { aggregation: getPreparedAggregation({ hovered, totals, xAxis, yAxis }), label: totals.label, style: { marginRight: scrollBarWidth }, values: hoveredValues, valueFormat: (_a = totals.valueFormat) !== null && _a !== void 0 ? _a : valueFormat })))));
205
+ React.createElement(RowWithAggregation, { aggregation: getPreparedAggregation({
206
+ hovered,
207
+ totals,
208
+ xAxis,
209
+ yAxis,
210
+ }), label: totals.label, style: { marginRight: scrollBarWidth }, values: hoveredValues, valueFormat: (_a = totals.valueFormat) !== null && _a !== void 0 ? _a : valueFormat })))));
201
211
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { Dispatch } from 'd3';
2
+ import type { Dispatch } from 'd3-dispatch';
3
3
  import type { PreparedTooltip, PreparedXAxis, PreparedYAxis } from '../../hooks';
4
4
  import './styles.css';
5
5
  type TooltipProps = {