@redsift/charts 11.5.0-muiv5 → 11.6.0-alpha.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 (73) hide show
  1. package/_internal/Arc.js +2 -0
  2. package/_internal/Arc.js.map +1 -0
  3. package/_internal/Arc2.js +117 -0
  4. package/_internal/Arc2.js.map +1 -0
  5. package/_internal/Arcs.js +2 -0
  6. package/_internal/Arcs.js.map +1 -0
  7. package/_internal/Arcs2.js +94 -0
  8. package/_internal/Arcs2.js.map +1 -0
  9. package/_internal/Axis.js +2 -0
  10. package/_internal/Axis.js.map +1 -0
  11. package/_internal/Axis2.js +388 -0
  12. package/_internal/Axis2.js.map +1 -0
  13. package/_internal/Bar.js +2 -0
  14. package/_internal/Bar.js.map +1 -0
  15. package/_internal/Bar2.js +170 -0
  16. package/_internal/Bar2.js.map +1 -0
  17. package/_internal/BarChart.js +2 -0
  18. package/_internal/BarChart.js.map +1 -0
  19. package/_internal/BarChart2.js +1419 -0
  20. package/_internal/BarChart2.js.map +1 -0
  21. package/_internal/ChartContainer.js +2 -0
  22. package/_internal/ChartContainer.js.map +1 -0
  23. package/_internal/ChartContainer2.js +266 -0
  24. package/_internal/ChartContainer2.js.map +1 -0
  25. package/_internal/DataPoint.js +2 -0
  26. package/_internal/DataPoint.js.map +1 -0
  27. package/_internal/DataPoint2.js +110 -0
  28. package/_internal/DataPoint2.js.map +1 -0
  29. package/_internal/Dot.js +2 -0
  30. package/_internal/Dot.js.map +1 -0
  31. package/_internal/Dot2.js +110 -0
  32. package/_internal/Dot2.js.map +1 -0
  33. package/_internal/Legend.js +2 -0
  34. package/_internal/Legend.js.map +1 -0
  35. package/_internal/Legend3.js +84 -0
  36. package/_internal/Legend3.js.map +1 -0
  37. package/_internal/LegendItem.js +2 -0
  38. package/_internal/LegendItem.js.map +1 -0
  39. package/_internal/LegendItem2.js +153 -0
  40. package/_internal/LegendItem2.js.map +1 -0
  41. package/_internal/Line.js +2 -0
  42. package/_internal/Line.js.map +1 -0
  43. package/_internal/Line2.js +59 -0
  44. package/_internal/Line2.js.map +1 -0
  45. package/_internal/LineChart.js +2 -0
  46. package/_internal/LineChart.js.map +1 -0
  47. package/_internal/LineChart2.js +669 -0
  48. package/_internal/LineChart2.js.map +1 -0
  49. package/_internal/PieChart.js +2 -0
  50. package/_internal/PieChart.js.map +1 -0
  51. package/_internal/PieChart2.js +605 -0
  52. package/_internal/PieChart2.js.map +1 -0
  53. package/_internal/ScatterPlot.js +2 -0
  54. package/_internal/ScatterPlot.js.map +1 -0
  55. package/_internal/ScatterPlot2.js +744 -0
  56. package/_internal/ScatterPlot2.js.map +1 -0
  57. package/_internal/_rollupPluginBabelHelpers.js +93 -0
  58. package/_internal/_rollupPluginBabelHelpers.js.map +1 -0
  59. package/_internal/config.js +13 -0
  60. package/_internal/config.js.map +1 -0
  61. package/_internal/legend2.js +21 -0
  62. package/_internal/legend2.js.map +1 -0
  63. package/_internal/scheme.js +47 -0
  64. package/_internal/scheme.js.map +1 -0
  65. package/_internal/theme.js +79 -0
  66. package/_internal/theme.js.map +1 -0
  67. package/_internal/useFormatCategoricalData.js +56 -0
  68. package/_internal/useFormatCategoricalData.js.map +1 -0
  69. package/index.js +17 -5118
  70. package/index.js.map +1 -1
  71. package/index2.js +16 -0
  72. package/index2.js.map +1 -0
  73. package/package.json +4 -4
@@ -0,0 +1,669 @@
1
+ import { _ as _objectWithoutProperties, a as _extends, b as _objectSpread2 } from './_rollupPluginBabelHelpers.js';
2
+ import React__default, { forwardRef, useRef, useEffect } from 'react';
3
+ import classNames from 'classnames';
4
+ import { useTheme, useMessageFormatter, Flexbox, useId } from '@redsift/design-system';
5
+ import { L as LegendVariant, T as TooltipVariant } from './legend2.js';
6
+ import { C as ChartSize, g as getSortingMethod, i as isValidDate, u as useColor, m as mergeLegends, a as ColorTheme } from './theme.js';
7
+ import styled from 'styled-components';
8
+ import { C as ChartContainer } from './ChartContainer2.js';
9
+ import { scaleLinear, extent, scaleTime, scalePoint, line } from 'd3';
10
+ import { A as Axis, a as AxisVariant } from './Axis2.js';
11
+ import { L as Line } from './Line2.js';
12
+ import { D as Dot, a as DotVariant } from './Dot2.js';
13
+ import { L as Legend } from './Legend3.js';
14
+
15
+ /**
16
+ * Component's labels variant.
17
+ */
18
+ const LineChartLegendVariant = {
19
+ none: 'none',
20
+ externalLabel: 'externalLabel',
21
+ externalLabelValue: 'externalLabelValue',
22
+ externalLabelPercent: 'externalLabelPercent',
23
+ custom: 'custom'
24
+ };
25
+
26
+ /**
27
+ * Component props.
28
+ */
29
+
30
+ /**
31
+ * Component style.
32
+ */
33
+ const StyledLineChart = styled(ChartContainer)``;
34
+ const StyledLineChartEmptyText = styled.div`
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ height: 100%;
39
+ width: 100%;
40
+ display: flex;
41
+ flex-direction: column;
42
+ justify-content: center;
43
+ align-items: center;
44
+ pointer-events: none;
45
+
46
+ > * {
47
+ max-width: ${_ref => {
48
+ let {
49
+ $maxWidth
50
+ } = _ref;
51
+ return $maxWidth;
52
+ }}px;
53
+ }
54
+
55
+ > span {
56
+ font-family: var(--redsift-typography-font-family-poppins);
57
+ color: ${_ref2 => {
58
+ let {
59
+ $theme
60
+ } = _ref2;
61
+ return `var(--redsift-color-${$theme}-components-text-primary)`;
62
+ }};
63
+ font-size: ${_ref3 => {
64
+ let {
65
+ $textSize
66
+ } = _ref3;
67
+ return $textSize;
68
+ }}px;
69
+ line-height: ${_ref4 => {
70
+ let {
71
+ $textSize
72
+ } = _ref4;
73
+ return $textSize;
74
+ }}px;
75
+ }
76
+ `;
77
+
78
+ const _excluded$3 = ["className"];
79
+ const LoadingLineChart = /*#__PURE__*/forwardRef((props, ref) => {
80
+ const {
81
+ className
82
+ } = props,
83
+ forwardedProps = _objectWithoutProperties(props, _excluded$3);
84
+ return /*#__PURE__*/React__default.createElement(StyledLineChart, _extends({}, forwardedProps, {
85
+ className: className,
86
+ ref: ref
87
+ }), "Loading...");
88
+ });
89
+
90
+ const sizeToDimension = size => {
91
+ if (typeof size !== 'string') {
92
+ return size;
93
+ }
94
+ switch (size) {
95
+ case ChartSize.small:
96
+ return {
97
+ width: 600,
98
+ height: 300,
99
+ fontSize: 30
100
+ };
101
+ case ChartSize.medium:
102
+ default:
103
+ return {
104
+ width: 750,
105
+ height: 375,
106
+ fontSize: 34
107
+ };
108
+ case ChartSize.large:
109
+ return {
110
+ width: 900,
111
+ height: 450,
112
+ fontSize: 38
113
+ };
114
+ }
115
+ };
116
+ const statsBy = (arr, sortingMethod) => {
117
+ const counts = arr.reduce((prev, curr) => {
118
+ if (!curr.value) {
119
+ return prev;
120
+ }
121
+ if (!prev[curr.key[1]]) {
122
+ prev[curr.key[1]] = {
123
+ value: curr.value,
124
+ min: curr.value,
125
+ max: curr.value,
126
+ values: [curr.value]
127
+ };
128
+ } else {
129
+ prev[curr.key[1]] = {
130
+ value: prev[curr.key[1]].value + curr.value,
131
+ min: Math.min(prev[curr.key[1]].min, curr.value),
132
+ max: Math.max(prev[curr.key[1]].max, curr.value),
133
+ values: [...prev[curr.key[1]].values, curr.value]
134
+ };
135
+ }
136
+ return prev;
137
+ }, {});
138
+ return Object.keys(counts).map(key => ({
139
+ key: key,
140
+ value: counts[key].value,
141
+ min: counts[key].min,
142
+ max: counts[key].max,
143
+ values: counts[key].values,
144
+ first: counts[key].values[0],
145
+ last: counts[key].values[counts[key].values.length - 1],
146
+ trending: {
147
+ overall: (counts[key].values[counts[key].values.length - 1] - counts[key].values[0]) * 100 / counts[key].values[0]
148
+ }
149
+ })).sort(getSortingMethod(sortingMethod));
150
+ };
151
+
152
+ const _excluded$2 = ["className", "data", "emptyComponent", "localeText", "size"];
153
+ const EmptyLineChart = /*#__PURE__*/forwardRef((props, ref) => {
154
+ const {
155
+ className,
156
+ data: propsData,
157
+ emptyComponent,
158
+ localeText,
159
+ size
160
+ } = props,
161
+ forwardedProps = _objectWithoutProperties(props, _excluded$2);
162
+ const theme = useTheme();
163
+ const cache = useRef();
164
+ const data = propsData;
165
+ useEffect(() => {
166
+ cache.current = data;
167
+ });
168
+ const chartDimensions = sizeToDimension(size);
169
+ const width = chartDimensions.width;
170
+ const height = chartDimensions.height;
171
+ const margins = {
172
+ top: 16,
173
+ left: 48,
174
+ right: 16,
175
+ bottom: 48
176
+ };
177
+ const chartWidth = width - margins.left - margins.right;
178
+ return /*#__PURE__*/React__default.createElement(StyledLineChart, _extends({}, forwardedProps, {
179
+ className: className,
180
+ ref: ref
181
+ }), emptyComponent !== null && emptyComponent !== void 0 ? emptyComponent : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(StyledLineChartEmptyText, {
182
+ $maxWidth: width,
183
+ $textSize: chartDimensions.fontSize / 2,
184
+ $theme: theme
185
+ }, /*#__PURE__*/React__default.createElement("span", null, localeText === null || localeText === void 0 ? void 0 : localeText.emptyChartText)), /*#__PURE__*/React__default.createElement("svg", {
186
+ width: width,
187
+ height: height
188
+ }, /*#__PURE__*/React__default.createElement("g", {
189
+ transform: `translate(${margins.left},${margins.top})`
190
+ }, /*#__PURE__*/React__default.createElement(Axis, {
191
+ position: "bottom",
192
+ length: width - 32,
193
+ scale: scaleLinear().domain([]).range([0, chartWidth]),
194
+ x: 0,
195
+ y: height,
196
+ tickValues: 4
197
+ })))));
198
+ });
199
+
200
+ var enUS = {
201
+ "interactive-chart": "Interactive Line Chart",
202
+ "static-chart": "Static Line Chart",
203
+ "definition-linear": "Linear Line Chart with {circleLength} circles.",
204
+ "definition-linear-with-categories": "Linear Line Chart with {categoryLength} categories and {circleLength} circles.",
205
+ "definition-ordinal": "Ordinal Line Chart with {circleLength} circles.",
206
+ "x-axis-numbers-definition": "The chart has {numAxis, plural, =0 {0 X axis} =1 {1 X axis} other {# X axes}} displaying numbers from {start, number} to {end, number}.",
207
+ "y-axis-numbers-definition": "The chart has {numAxis, plural, =0 {0 Y axis} =1 {1 Y axis} other {# Y axes}} displaying numbers from {start, number} to {end, number}.",
208
+ "x-axis-dates-definition": "The chart has {numAxis, plural, =0 {0 X axis} =1 {1 X axis} other {# X axes}} displaying dates from {start, date, ::yyyyMMdd} to {end, date, ::yyyyMMdd}.",
209
+ "y-axis-dates-definition": "The chart has {numAxis, plural, =0 {0 Y axis} =1 {1 Y axis} other {# Y axes}} displaying dates from {start, date, ::yyyyMMdd} to {end, date, ::yyyyMMdd}.",
210
+ "x-axis-categories-definition": "The chart has {numAxis, plural, =0 {0 X axis} =1 {1 X axis} other {# X axes}} displaying categories.",
211
+ "y-axis-categories-definition": "The chart has {numAxis, plural, =0 {0 Y axis} =1 {1 Y axis} other {# Y axes}} displaying categories.",
212
+ "series-legend": "{category}, line {categoryIndex} of {categoryLength} with {circleLength} circles"
213
+ };
214
+
215
+ var frFR = {
216
+ "interactive-chart": "Graphique en courbe interactif",
217
+ "static-chart": "Graphique en courbe statique",
218
+ "definition-linear": "Graphique en courbe contenant {circleLength} points répartis sur un axe linéraire.",
219
+ "definition-linear-with-categories": "Graphique en courbe contenant {categoryLength} courbes et {circleLength} points répartis sur un axe linéraire.",
220
+ "definition-ordinal": "Graphique en courbe contenant {circleLength} points.",
221
+ "x-axis-numbers-definition": "Le graphique a {numAxis, plural, =0 {0 axe X} =1 {1 axe X} other {# axes X}} affichant des nombres allant de {start, number} à {end, number}.",
222
+ "y-axis-numbers-definition": "Le graphique a {numAxis, plural, =0 {0 axe Y} =1 {1 axe Y} other {# axes Y}} affichant des nombres allant de {start, number} à {end, number}.",
223
+ "x-axis-dates-definition": "Le graphique a {numAxis, plural, =0 {0 axe X} =1 {1 axe X} other {# axes X}} affichant des dates allant de {start, date, ::yyyyMMdd} à {end, date, ::yyyyMMdd}.",
224
+ "y-axis-dates-definition": "Le graphique a {numAxis, plural, =0 {0 axe Y} =1 {1 axe Y} other {# axes Y}} affichant des dates allant de {start, date, ::yyyyMMdd} à {end, date, ::yyyyMMdd}.",
225
+ "x-axis-categories-definition": "Le graphique a {numAxis, plural, =0 {0 axe X} =1 {1 axe X} other {# axes X}} affichant des categories.",
226
+ "y-axis-categories-definition": "Le graphique a {numAxis, plural, =0 {0 axe Y} =1 {1 axe Y} other {# axes Y}} affichant des categories.",
227
+ "series-legend": "{category}, courbe {categoryIndex} sur {categoryLength} contenant {circleLength} points"
228
+ };
229
+
230
+ var intlMessages = {
231
+ 'en-US': enUS,
232
+ 'fr-FR': frFR
233
+ };
234
+
235
+ const _excluded$1 = ["className", "data", "dotRole", "disableAnimations", "getDotAnchorProps", "id", "isDotSelected", "labelDecorator", "legendDecorator", "legendVariant", "legendProps", "margins", "onDotClick", "size", "sortingMethod", "colorTheme", "tooltipDecorator", "tooltipVariant", "xAxisVariant", "xAxisPlacement", "xAxisTickFormat", "xAxisTickPadding", "xAxisTickRotation", "xAxisTickSize", "xAxisTickValues", "xAxisMinValue", "xAxisMaxValue", "xAxisTickRemodelling", "yAxisVariant", "yAxisPlacement", "yAxisTickFormat", "yAxisTickPadding", "yAxisTickRotation", "yAxisTickSize", "yAxisTickValues", "yAxisMinValue", "yAxisMaxValue", "yAxisTickRemodelling", "dateParser"],
236
+ _excluded2 = ["extraLegendItems"];
237
+ const RenderedLineChart = /*#__PURE__*/forwardRef((props, ref) => {
238
+ const {
239
+ className,
240
+ data: propsData,
241
+ dotRole,
242
+ disableAnimations,
243
+ getDotAnchorProps,
244
+ id,
245
+ isDotSelected,
246
+ labelDecorator,
247
+ legendDecorator,
248
+ legendVariant,
249
+ legendProps,
250
+ margins: propsMargins,
251
+ onDotClick,
252
+ size,
253
+ sortingMethod,
254
+ colorTheme,
255
+ tooltipDecorator,
256
+ tooltipVariant,
257
+ xAxisVariant,
258
+ xAxisPlacement,
259
+ xAxisTickFormat: propsXAxisTickFormat,
260
+ xAxisTickPadding,
261
+ xAxisTickRotation,
262
+ xAxisTickSize,
263
+ xAxisTickValues,
264
+ xAxisMinValue,
265
+ xAxisMaxValue,
266
+ xAxisTickRemodelling,
267
+ yAxisVariant,
268
+ yAxisPlacement,
269
+ yAxisTickFormat,
270
+ yAxisTickPadding,
271
+ yAxisTickRotation,
272
+ yAxisTickSize,
273
+ yAxisTickValues,
274
+ yAxisMinValue,
275
+ yAxisMaxValue,
276
+ yAxisTickRemodelling,
277
+ dateParser
278
+ } = props,
279
+ forwardedProps = _objectWithoutProperties(props, _excluded$1);
280
+ const cache = useRef();
281
+ const theme = useTheme();
282
+ const format = useMessageFormatter(intlMessages);
283
+ const xScaleType = propsData[0].key[0] instanceof Date ? 'Date' : typeof propsData[0].key[0] === 'number' ? 'number' : typeof propsData[0].key[0] === 'string' && isValidDate(propsData[0].key[0]) ? 'dateString' : typeof propsData[0].key[0] === 'string' ? 'string' : undefined;
284
+ const data = xScaleType === 'number' ? propsData.filter(datum => typeof datum.key[0] === 'number' && !Number.isNaN(datum.key[0])) : xScaleType === 'dateString' ? propsData.filter(datum => isValidDate(datum.key[0])) : xScaleType === 'string' ? propsData.filter(datum => typeof datum.key[0] === 'string') : xScaleType === 'Date' ? propsData.filter(datum => datum.key[0] instanceof Date) : propsData;
285
+ useEffect(() => {
286
+ cache.current = data;
287
+ });
288
+ const svgRef = useRef();
289
+ const chartDimensions = sizeToDimension(size);
290
+ const width = chartDimensions.width;
291
+ const height = chartDimensions.height;
292
+ const margins = _objectSpread2({
293
+ top: xAxisVariant === AxisVariant.default || xAxisVariant === AxisVariant.tickValue ? 24 : 8,
294
+ left: yAxisVariant === AxisVariant.default || yAxisVariant === AxisVariant.tickValue ? 48 : 8,
295
+ right: yAxisVariant === AxisVariant.default || yAxisVariant === AxisVariant.tickValue ? 48 : 8,
296
+ bottom: xAxisVariant === AxisVariant.default || xAxisVariant === AxisVariant.tickValue ? 24 : 8
297
+ }, propsMargins);
298
+ const chartHeight = height - margins.top - margins.bottom;
299
+ const chartWidth = width - margins.left - margins.right;
300
+ const scaleX = (() => {
301
+ if (xScaleType === 'number') {
302
+ var _ref, _ref2;
303
+ const domain = extent(data, d => d.key[0]);
304
+ domain[0] = (_ref = xAxisMinValue) !== null && _ref !== void 0 ? _ref : domain[0];
305
+ domain[1] = (_ref2 = xAxisMaxValue) !== null && _ref2 !== void 0 ? _ref2 : domain[1];
306
+ return scaleLinear().domain(domain).range([0, chartWidth]).nice();
307
+ } else if (xScaleType === 'dateString') {
308
+ var _ref3, _ref4;
309
+ const domain = extent(data, d => Date.parse(d.key[0]));
310
+ domain[0] = (_ref3 = xAxisMinValue) !== null && _ref3 !== void 0 ? _ref3 : domain[0];
311
+ domain[1] = (_ref4 = xAxisMaxValue) !== null && _ref4 !== void 0 ? _ref4 : domain[1];
312
+ return scaleTime().domain([new Date(domain[0]), new Date(domain[1])]).range([0, chartWidth]).nice();
313
+ } else if (xScaleType === 'Date') {
314
+ var _ref5, _ref6;
315
+ const domain = extent(data, d => d.key[0].valueOf());
316
+ domain[0] = (_ref5 = xAxisMinValue) !== null && _ref5 !== void 0 ? _ref5 : domain[0];
317
+ domain[1] = (_ref6 = xAxisMaxValue) !== null && _ref6 !== void 0 ? _ref6 : domain[1];
318
+ return scaleTime().domain([new Date(domain[0]), new Date(domain[1])]).range([0, chartWidth]).nice();
319
+ } else {
320
+ var _ref7, _ref8;
321
+ const domain = xAxisTickValues && Array.isArray(xAxisTickValues) ? xAxisTickValues : data.map(d => d.key[0]);
322
+ domain[0] = (_ref7 = xAxisMinValue) !== null && _ref7 !== void 0 ? _ref7 : domain[0];
323
+ domain[1] = (_ref8 = xAxisMaxValue) !== null && _ref8 !== void 0 ? _ref8 : domain[1];
324
+ return scalePoint().domain(domain).range([0, chartWidth]);
325
+ }
326
+ })();
327
+ const scaleY = (() => {
328
+ var _ref9, _ref10;
329
+ const domain = extent(data, d => d.value);
330
+ domain[0] = (_ref9 = yAxisMinValue) !== null && _ref9 !== void 0 ? _ref9 : domain[0];
331
+ domain[1] = (_ref10 = yAxisMaxValue) !== null && _ref10 !== void 0 ? _ref10 : domain[1];
332
+ return scaleLinear().domain(domain).range([chartHeight, 0]).nice();
333
+ })();
334
+ const xAxisTickFormat = propsXAxisTickFormat !== null && propsXAxisTickFormat !== void 0 ? propsXAxisTickFormat : xScaleType === 'Date' || xScaleType === 'dateString' ? scaleX.tickFormat() : undefined;
335
+ const hasCategory = data[0] && data[0].key.length >= 2 && data[0].key[1] !== null && data[0].key[1] !== undefined;
336
+ const statsByCategory = statsBy(data, sortingMethod);
337
+ const colorScale = useColor({
338
+ data: statsByCategory,
339
+ colorTheme: colorTheme,
340
+ category: d => d.key,
341
+ theme
342
+ });
343
+ const circles = data.sort((a, b) => {
344
+ if (xScaleType === 'number') {
345
+ if (a.key[0] < b.key[0]) return -1;
346
+ if (a.key[0] > b.key[0]) return 1;
347
+ return 0;
348
+ } else if (xScaleType === 'dateString') {
349
+ if (Date.parse(a.key[0]) < Date.parse(b.key[0])) return -1;
350
+ if (Date.parse(a.key[0]) > Date.parse(b.key[0])) return 1;
351
+ return 0;
352
+ } else if (xScaleType === 'Date') {
353
+ if (a.key[0].valueOf() < b.key[0].valueOf()) return -1;
354
+ if (a.key[0].valueOf() > b.key[0].valueOf()) return 1;
355
+ return 0;
356
+ } else if (xScaleType === 'string' && xAxisTickValues && Array.isArray(xAxisTickValues)) {
357
+ if (xAxisTickValues.indexOf(a.key[0]) < xAxisTickValues.indexOf(b.key[0])) return -1;
358
+ if (xAxisTickValues.indexOf(a.key[0]) > xAxisTickValues.indexOf(b.key[0])) return 1;
359
+ return 0;
360
+ }
361
+ return 0;
362
+ }).filter(d => d.value !== null).map(d => {
363
+ var _d$key$;
364
+ return {
365
+ category: (_d$key$ = d.key[1]) !== null && _d$key$ !== void 0 ? _d$key$ : 'default',
366
+ x: xScaleType === 'dateString' ? dateParser ? dateParser(d.key[0]) : new Date(Date.parse(d.key[0])) : d.key[0],
367
+ y: d.value,
368
+ data: {
369
+ key: d.key,
370
+ value: d.value
371
+ },
372
+ points: [d]
373
+ };
374
+ });
375
+ const lines = hasCategory ? Object.values(circles.reduce((prev, curr) => {
376
+ if (!prev[curr.category]) {
377
+ prev[curr.category] = [];
378
+ }
379
+ prev[curr.category].push(curr);
380
+ return prev;
381
+ }, {})) : [circles];
382
+ const createLine = line().x(d => scaleX(d.x)).y(d => scaleY(d.y));
383
+ const categories = [];
384
+ const pivotedTable = circles.reduce((acc, item) => {
385
+ const {
386
+ x,
387
+ category,
388
+ y
389
+ } = item;
390
+ if (!categories.includes(category)) {
391
+ categories.push(category);
392
+ }
393
+ const formattedKey = xAxisTickFormat ? xAxisTickFormat(x) : x.toString();
394
+ let entry = acc.find(e => e.key === formattedKey);
395
+ if (!entry) {
396
+ entry = {
397
+ key: formattedKey
398
+ };
399
+ acc.push(entry);
400
+ }
401
+ entry[category] = y;
402
+ return acc;
403
+ }, []);
404
+ const _ref11 = legendProps || {},
405
+ {
406
+ extraLegendItems
407
+ } = _ref11,
408
+ forwardedLegendProps = _objectWithoutProperties(_ref11, _excluded2);
409
+ return /*#__PURE__*/React__default.createElement(StyledLineChart, _extends({
410
+ mode: typeof onDotClick === 'function' || typeof getDotAnchorProps === 'function' ? 'interactive' : 'static',
411
+ definition: hasCategory ? format('definition-linear-with-categories', {
412
+ categoryLength: categories.length,
413
+ circleLength: circles.length
414
+ }) : format('definition-linear', {
415
+ circleLength: circles.length
416
+ }),
417
+ xAxisDefinition: xScaleType !== 'string' ? format(`x-axis-${xScaleType === 'number' ? 'numbers' : 'dates'}-definition`, {
418
+ numAxis: xAxisPlacement === 'both' ? 2 : 1,
419
+ start: scaleX.domain()[0],
420
+ end: scaleX.domain()[1]
421
+ }) : format('x-axis-categories-definition', {
422
+ numAxis: xAxisPlacement === 'both' ? 2 : 1
423
+ }),
424
+ yAxisDefinition: format('y-axis-numbers-definition', {
425
+ numAxis: yAxisPlacement === 'both' ? 2 : 1,
426
+ start: scaleY.domain()[0],
427
+ end: scaleY.domain()[1]
428
+ }),
429
+ dataTableRepresentation: hasCategory ? {
430
+ header: /*#__PURE__*/React__default.createElement("thead", null, /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("th", {
431
+ scope: "col"
432
+ }, xScaleType === 'Date' || xScaleType === 'dateString' ? 'Date' : 'Key'), categories.map(category => /*#__PURE__*/React__default.createElement("th", {
433
+ key: category,
434
+ scope: "col"
435
+ }, category)))),
436
+ body: /*#__PURE__*/React__default.createElement("tbody", null, pivotedTable.map(row => /*#__PURE__*/React__default.createElement("tr", {
437
+ key: row.key
438
+ }, /*#__PURE__*/React__default.createElement("th", {
439
+ scope: "row"
440
+ }, row.key), categories.map(category => /*#__PURE__*/React__default.createElement("th", {
441
+ key: `${row.key}-${category}-${row[category]}`,
442
+ scope: "col"
443
+ }, row[category])))))
444
+ } : {
445
+ header: /*#__PURE__*/React__default.createElement("thead", null, /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("th", {
446
+ scope: "col"
447
+ }, xScaleType === 'Date' || xScaleType === 'dateString' ? 'Date' : 'Key'), /*#__PURE__*/React__default.createElement("th", {
448
+ scope: "col"
449
+ }, "Value"))),
450
+ body: /*#__PURE__*/React__default.createElement("tbody", null, circles.map(datum => {
451
+ const key = xAxisTickFormat ? xAxisTickFormat(datum.x) : datum.x.toString();
452
+ return /*#__PURE__*/React__default.createElement("tr", {
453
+ key: key
454
+ }, /*#__PURE__*/React__default.createElement("th", {
455
+ scope: "row"
456
+ }, key), /*#__PURE__*/React__default.createElement("td", null, datum.y));
457
+ }))
458
+ }
459
+ }, forwardedProps, {
460
+ id: id,
461
+ className: className,
462
+ ref: ref
463
+ }), /*#__PURE__*/React__default.createElement(Flexbox, {
464
+ flexDirection: "column",
465
+ alignItems: "center",
466
+ gap: "8"
467
+ }, /*#__PURE__*/React__default.createElement("svg", {
468
+ ref: svgRef,
469
+ width: width,
470
+ height: height,
471
+ "aria-label": typeof onDotClick === 'function' || typeof getDotAnchorProps === 'function' ? format('interactive-chart') : format('static-chart'),
472
+ "aria-hidden": "false"
473
+ }, /*#__PURE__*/React__default.createElement("g", {
474
+ transform: `translate(${margins.left},${margins.top})`,
475
+ "aria-hidden": "true"
476
+ }, lines.map((line, index) => {
477
+ return /*#__PURE__*/React__default.createElement(Line, {
478
+ color: colorScale === null || colorScale === void 0 ? void 0 : colorScale(line[0].category),
479
+ data: line.filter(point => point.y !== null),
480
+ disableAnimations: disableAnimations,
481
+ createLine: createLine,
482
+ key: `line _${index}`
483
+ });
484
+ })), categories.map((category, categoryIndex) => {
485
+ const filteredCircles = circles.filter(circle => circle.category === category);
486
+ return /*#__PURE__*/React__default.createElement("g", _extends({
487
+ key: `${id}-series-${category}`,
488
+ transform: `translate(${margins.left},${margins.top})`,
489
+ "aria-hidden": "false",
490
+ role: "region"
491
+ }, hasCategory ? {
492
+ 'aria-label': `${category}, category ${categoryIndex + 1} of ${categories.length} with ${filteredCircles.length} circles`
493
+ } : {}), filteredCircles.map((circle, index) => {
494
+ const scaleXDomain = scaleX.domain();
495
+ const scaleYDomain = scaleY.domain();
496
+ if (xScaleType === 'number' && (circle.x < scaleXDomain[0] || circle.x > scaleXDomain[1] || circle.y < scaleYDomain[0] || circle.y > scaleYDomain[1])) {
497
+ return null;
498
+ }
499
+ const to = _objectSpread2(_objectSpread2({}, circle), {}, {
500
+ r: 4
501
+ });
502
+ return /*#__PURE__*/React__default.createElement(Dot, {
503
+ id: `id${id}__circle-${categoryIndex}.${index}`,
504
+ color: colorScale === null || colorScale === void 0 ? void 0 : colorScale(circle.category),
505
+ data: to,
506
+ dataset: circles,
507
+ isSelected: Boolean(isDotSelected === null || isDotSelected === void 0 ? void 0 : isDotSelected(to)),
508
+ anchorProps: getDotAnchorProps ? getDotAnchorProps(to) : undefined,
509
+ key: `circle _${categoryIndex}.${index}`,
510
+ labelDecorator: labelDecorator,
511
+ onClick: onDotClick,
512
+ role: dotRole,
513
+ scaleX: scaleX,
514
+ scaleY: scaleY,
515
+ tooltipDecorator: tooltipDecorator,
516
+ tooltipVariant: tooltipVariant,
517
+ variant: DotVariant.hollow
518
+ });
519
+ }));
520
+ }), /*#__PURE__*/React__default.createElement("g", {
521
+ transform: `translate(${margins.left},${margins.top})`
522
+ }, ['bottom', 'both'].includes(xAxisPlacement) ? /*#__PURE__*/React__default.createElement(Axis, {
523
+ disableAnimations: disableAnimations,
524
+ position: "bottom",
525
+ length: chartWidth,
526
+ scale: scaleX,
527
+ x: 0,
528
+ y: chartHeight,
529
+ tickValues: xAxisTickValues !== null && xAxisTickValues !== void 0 ? xAxisTickValues : 8,
530
+ tickPadding: xAxisTickPadding,
531
+ tickRotation: xAxisTickRotation,
532
+ tickSize: xAxisTickSize,
533
+ tickFormat: xAxisTickFormat,
534
+ tickRemodelling: xAxisTickRemodelling,
535
+ variant: xAxisVariant
536
+ }) : null, ['top', 'both'].includes(xAxisPlacement) ? /*#__PURE__*/React__default.createElement(Axis, {
537
+ disableAnimations: disableAnimations,
538
+ position: "top",
539
+ length: chartWidth,
540
+ scale: scaleX,
541
+ x: 0,
542
+ y: 0,
543
+ tickValues: xAxisTickValues !== null && xAxisTickValues !== void 0 ? xAxisTickValues : 8,
544
+ tickPadding: xAxisTickPadding,
545
+ tickRotation: xAxisTickRotation,
546
+ tickSize: xAxisTickSize,
547
+ tickFormat: xAxisTickFormat,
548
+ tickRemodelling: xAxisTickRemodelling,
549
+ variant: xAxisVariant
550
+ }) : null, ['left', 'both'].includes(yAxisPlacement) ? /*#__PURE__*/React__default.createElement(Axis, {
551
+ disableAnimations: disableAnimations,
552
+ position: "left",
553
+ length: chartHeight,
554
+ scale: scaleY,
555
+ x: 0,
556
+ y: chartHeight,
557
+ tickValues: yAxisTickValues !== null && yAxisTickValues !== void 0 ? yAxisTickValues : 8,
558
+ tickPadding: yAxisTickPadding,
559
+ tickRotation: yAxisTickRotation,
560
+ tickSize: yAxisTickSize,
561
+ tickFormat: yAxisTickFormat,
562
+ tickRemodelling: yAxisTickRemodelling,
563
+ variant: yAxisVariant
564
+ }) : null, ['right', 'both'].includes(yAxisPlacement) ? /*#__PURE__*/React__default.createElement(Axis, {
565
+ disableAnimations: disableAnimations,
566
+ position: "right",
567
+ length: chartHeight,
568
+ scale: scaleY,
569
+ x: chartWidth,
570
+ y: chartHeight,
571
+ tickValues: yAxisTickValues !== null && yAxisTickValues !== void 0 ? yAxisTickValues : 8,
572
+ tickPadding: yAxisTickPadding,
573
+ tickRotation: yAxisTickRotation,
574
+ tickSize: yAxisTickSize,
575
+ tickFormat: yAxisTickFormat,
576
+ tickRemodelling: yAxisTickRemodelling,
577
+ variant: yAxisVariant
578
+ }) : null))), hasCategory && legendVariant !== LineChartLegendVariant.none ? /*#__PURE__*/React__default.createElement(Legend, _extends({
579
+ data: (extraLegendItems ? mergeLegends(extraLegendItems, statsByCategory).sort(getSortingMethod(sortingMethod)) : statsByCategory).map(d => _objectSpread2(_objectSpread2({}, d), {}, {
580
+ color: colorScale === null || colorScale === void 0 ? void 0 : colorScale(d.key)
581
+ })),
582
+ variant: legendVariant === LineChartLegendVariant.externalLabelValue ? LegendVariant.value : legendVariant === LineChartLegendVariant.externalLabelPercent ? LegendVariant.percent : legendVariant === LineChartLegendVariant.externalLabel ? LegendVariant.label : LegendVariant.custom,
583
+ legendDecorator: legendDecorator ? (datum, props) => legendDecorator(datum, props) : undefined
584
+ }, forwardedLegendProps)) : null);
585
+ });
586
+
587
+ const _excluded = ["className", "colorTheme", "data", "dotRole", "emptyComponent", "id", "isDotSelected", "labelDecorator", "legendDecorator", "legendVariant", "localeText", "onDotClick", "size", "sortingMethod", "tooltipDecorator", "tooltipVariant", "xAxisPlacement", "xAxisVariant", "yAxisPlacement", "yAxisVariant"];
588
+ const COMPONENT_NAME = 'LineChart';
589
+ const CLASSNAME = 'redsift-line-chart';
590
+ const LineChart = /*#__PURE__*/forwardRef((props, ref) => {
591
+ const {
592
+ className,
593
+ colorTheme = ColorTheme.dark,
594
+ data: propsData,
595
+ dotRole,
596
+ emptyComponent,
597
+ id: propsId,
598
+ isDotSelected,
599
+ labelDecorator,
600
+ legendDecorator,
601
+ legendVariant: propsLegendVariant,
602
+ localeText = {
603
+ emptyChartText: 'No Data'
604
+ },
605
+ onDotClick,
606
+ size = ChartSize.medium,
607
+ sortingMethod = 'desc-value',
608
+ tooltipDecorator,
609
+ tooltipVariant = TooltipVariant.none,
610
+ xAxisPlacement = 'bottom',
611
+ xAxisVariant = AxisVariant.default,
612
+ yAxisPlacement = 'left',
613
+ yAxisVariant = AxisVariant.default
614
+ } = props,
615
+ forwardedProps = _objectWithoutProperties(props, _excluded);
616
+ const [_id] = useId();
617
+ const id = propsId !== null && propsId !== void 0 ? propsId : _id;
618
+ const legendVariant = propsLegendVariant !== null && propsLegendVariant !== void 0 ? propsLegendVariant : LineChartLegendVariant.externalLabel;
619
+ if (propsData === undefined || propsData === null) {
620
+ return /*#__PURE__*/React__default.createElement(LoadingLineChart, _extends({
621
+ id: id
622
+ }, forwardedProps, {
623
+ ref: ref
624
+ }));
625
+ }
626
+ if (propsData.length === 0) {
627
+ return /*#__PURE__*/React__default.createElement(EmptyLineChart, _extends({
628
+ data: propsData,
629
+ emptyComponent: emptyComponent,
630
+ localeText: localeText,
631
+ size: size,
632
+ sortingMethod: sortingMethod,
633
+ xAxisPlacement: xAxisPlacement,
634
+ xAxisVariant: xAxisVariant,
635
+ yAxisPlacement: yAxisPlacement,
636
+ yAxisVariant: yAxisVariant
637
+ }, forwardedProps, {
638
+ ref: ref
639
+ }));
640
+ }
641
+ return /*#__PURE__*/React__default.createElement(RenderedLineChart, _extends({
642
+ className: classNames(LineChart.className, className),
643
+ colorTheme: colorTheme,
644
+ data: propsData,
645
+ dotRole: dotRole,
646
+ id: id,
647
+ isDotSelected: isDotSelected,
648
+ labelDecorator: labelDecorator,
649
+ legendDecorator: legendDecorator,
650
+ legendVariant: legendVariant,
651
+ localeText: localeText,
652
+ onDotClick: onDotClick,
653
+ size: size,
654
+ sortingMethod: sortingMethod,
655
+ tooltipDecorator: tooltipDecorator,
656
+ tooltipVariant: tooltipVariant,
657
+ xAxisPlacement: xAxisPlacement,
658
+ xAxisVariant: xAxisVariant,
659
+ yAxisPlacement: yAxisPlacement,
660
+ yAxisVariant: yAxisVariant
661
+ }, forwardedProps, {
662
+ ref: ref
663
+ }));
664
+ });
665
+ LineChart.className = CLASSNAME;
666
+ LineChart.displayName = COMPONENT_NAME;
667
+
668
+ export { LineChart as L, StyledLineChart as S, LineChartLegendVariant as a, StyledLineChartEmptyText as b };
669
+ //# sourceMappingURL=LineChart2.js.map