@spteck/fluentui-react-charts 0.1.8

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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +462 -0
  3. package/dist/charts/BarChart/BarChart.d.ts +16 -0
  4. package/dist/charts/BarChart/index.d.ts +1 -0
  5. package/dist/charts/ComboChart/ComboChart.d.ts +16 -0
  6. package/dist/charts/ComboChart/index.d.ts +1 -0
  7. package/dist/charts/Doughnut/DoughnutChart.d.ts +14 -0
  8. package/dist/charts/Doughnut/index.d.ts +1 -0
  9. package/dist/charts/PieChart/PieChart.d.ts +14 -0
  10. package/dist/charts/PieChart/index.d.ts +1 -0
  11. package/dist/charts/areaChart/AreaChart.d.ts +15 -0
  12. package/dist/charts/areaChart/index.d.ts +1 -0
  13. package/dist/charts/barHorizontalChart/BarHotizontalChart.d.ts +15 -0
  14. package/dist/charts/barHorizontalChart/index.d.ts +1 -0
  15. package/dist/charts/bubbleChart/BubbleChart.d.ts +15 -0
  16. package/dist/charts/bubbleChart/index.d.ts +1 -0
  17. package/dist/charts/floatBarChart/FloatBarChart.d.ts +14 -0
  18. package/dist/charts/floatBarChart/index.d.ts +1 -0
  19. package/dist/charts/lineChart/LineChart.d.ts +14 -0
  20. package/dist/charts/lineChart/index.d.ts +1 -0
  21. package/dist/charts/polarChart/PolarChart.d.ts +14 -0
  22. package/dist/charts/polarChart/index.d.ts +1 -0
  23. package/dist/charts/radarChart/RadarChart.d.ts +14 -0
  24. package/dist/charts/radarChart/index.d.ts +1 -0
  25. package/dist/charts/scatterChart/ScatterChart.d.ts +14 -0
  26. package/dist/charts/scatterChart/index.d.ts +1 -0
  27. package/dist/charts/stackedLineChart/StackedLineChart.d.ts +14 -0
  28. package/dist/charts/stackedLineChart/index.d.ts +1 -0
  29. package/dist/charts/steamChart/SteamChart.d.ts +14 -0
  30. package/dist/charts/steamChart/index.d.ts +1 -0
  31. package/dist/components/DashBoard.d.ts +3 -0
  32. package/dist/components/RenderLegend/RenderLegend.d.ts +11 -0
  33. package/dist/components/RenderTooltip/RenderTooltip.d.ts +14 -0
  34. package/dist/components/buttonMenu/ButtonMenu.d.ts +3 -0
  35. package/dist/components/buttonMenu/IButtonMenuOption.d.ts +10 -0
  36. package/dist/components/buttonMenu/IButtonMenuProps.d.ts +37 -0
  37. package/dist/components/index.d.ts +15 -0
  38. package/dist/components/legendContainer/LegendContainer.d.ts +16 -0
  39. package/dist/components/legendeButton/LegendButton.d.ts +11 -0
  40. package/dist/components/renderSliceLegend/RenderSliceLegend.d.ts +9 -0
  41. package/dist/components/renderValueLegend/RenderValueLegend.d.ts +13 -0
  42. package/dist/components/stack/IStackProps.d.ts +76 -0
  43. package/dist/components/stack/Stack.d.ts +8 -0
  44. package/dist/components/themeProvider/ThemeProvider.d.ts +15 -0
  45. package/dist/constants/Constants.d.ts +1 -0
  46. package/dist/fluentui-react-charts.cjs.development.js +2916 -0
  47. package/dist/fluentui-react-charts.cjs.development.js.map +1 -0
  48. package/dist/fluentui-react-charts.cjs.production.min.js +2 -0
  49. package/dist/fluentui-react-charts.cjs.production.min.js.map +1 -0
  50. package/dist/fluentui-react-charts.esm.js +2905 -0
  51. package/dist/fluentui-react-charts.esm.js.map +1 -0
  52. package/dist/graphGlobalStyles/useGraphGlobalStyles.d.ts +5 -0
  53. package/dist/hooks/index.d.ts +1 -0
  54. package/dist/hooks/useGraphUtils.d.ts +38 -0
  55. package/dist/hooks/useResponsiveLegend.d.ts +8 -0
  56. package/dist/index.d.ts +3 -0
  57. package/dist/index.js +8 -0
  58. package/dist/models/IChart.d.ts +25 -0
  59. package/dist/models/index.d.ts +1 -0
  60. package/package.json +66 -0
  61. package/src/assets/sample1.png +0 -0
  62. package/src/assets/sample2.png +0 -0
  63. package/src/assets/sample3.png +0 -0
  64. package/src/charts/BarChart/BarChart.tsx +227 -0
  65. package/src/charts/BarChart/README.MD +335 -0
  66. package/src/charts/BarChart/index.ts +1 -0
  67. package/src/charts/ComboChart/ComboChart.tsx +209 -0
  68. package/src/charts/ComboChart/README.MD +347 -0
  69. package/src/charts/ComboChart/index.ts +1 -0
  70. package/src/charts/Doughnut/DoughnutChart.tsx +152 -0
  71. package/src/charts/Doughnut/README.MD +296 -0
  72. package/src/charts/Doughnut/index.ts +1 -0
  73. package/src/charts/PieChart/PieChart.tsx +148 -0
  74. package/src/charts/PieChart/README.MD +315 -0
  75. package/src/charts/PieChart/index.ts +1 -0
  76. package/src/charts/areaChart/AreaChart.tsx +195 -0
  77. package/src/charts/areaChart/README.MD +236 -0
  78. package/src/charts/areaChart/index.ts +1 -0
  79. package/src/charts/barHorizontalChart/BarHotizontalChart.tsx +200 -0
  80. package/src/charts/barHorizontalChart/README.MD +278 -0
  81. package/src/charts/barHorizontalChart/index.ts +2 -0
  82. package/src/charts/bubbleChart/BubbleChart.tsx +184 -0
  83. package/src/charts/bubbleChart/README.MD +275 -0
  84. package/src/charts/bubbleChart/index.ts +1 -0
  85. package/src/charts/floatBarChart/FloatBarChart.tsx +178 -0
  86. package/src/charts/floatBarChart/README.MD +354 -0
  87. package/src/charts/floatBarChart/index.ts +1 -0
  88. package/src/charts/lineChart/LineChart.tsx +200 -0
  89. package/src/charts/lineChart/README.MD +354 -0
  90. package/src/charts/lineChart/index.ts +1 -0
  91. package/src/charts/polarChart/PolarChart.tsx +161 -0
  92. package/src/charts/polarChart/README.MD +336 -0
  93. package/src/charts/polarChart/index.ts +1 -0
  94. package/src/charts/radarChart/README.MD +388 -0
  95. package/src/charts/radarChart/RadarChart.tsx +173 -0
  96. package/src/charts/radarChart/index.ts +1 -0
  97. package/src/charts/scatterChart/README.MD +335 -0
  98. package/src/charts/scatterChart/ScatterChart.tsx +155 -0
  99. package/src/charts/scatterChart/index.ts +1 -0
  100. package/src/charts/stackedLineChart/README.MD +396 -0
  101. package/src/charts/stackedLineChart/StackedLineChart.tsx +188 -0
  102. package/src/charts/stackedLineChart/index.ts +1 -0
  103. package/src/charts/steamChart/README.MD +414 -0
  104. package/src/charts/steamChart/SteamChart.tsx +236 -0
  105. package/src/charts/steamChart/index.ts +1 -0
  106. package/src/components/DashBoard.tsx +409 -0
  107. package/src/components/RenderLegend/RenderLegend.tsx +40 -0
  108. package/src/components/RenderTooltip/RenderTooltip.tsx +111 -0
  109. package/src/components/buttonMenu/ButtonMenu.tsx +186 -0
  110. package/src/components/buttonMenu/IButtonMenuOption.ts +9 -0
  111. package/src/components/buttonMenu/IButtonMenuProps.tsx +40 -0
  112. package/src/components/index.ts +15 -0
  113. package/src/components/legendContainer/LegendContainer.tsx +118 -0
  114. package/src/components/legendeButton/LegendButton.tsx +57 -0
  115. package/src/components/renderSliceLegend/RenderSliceLegend.tsx +46 -0
  116. package/src/components/renderValueLegend/RenderValueLegend.tsx +43 -0
  117. package/src/components/stack/IStackProps.tsx +94 -0
  118. package/src/components/stack/Stack.tsx +103 -0
  119. package/src/components/themeProvider/ThemeProvider.tsx +48 -0
  120. package/src/constants/Constants.tsx +23 -0
  121. package/src/graphGlobalStyles/useGraphGlobalStyles.ts +28 -0
  122. package/src/hooks/index.ts +1 -0
  123. package/src/hooks/useGraphUtils.tsx +314 -0
  124. package/src/hooks/useResponsiveLegend.ts +35 -0
  125. package/src/index.tsx +4 -0
  126. package/src/models/IChart.ts +50 -0
  127. package/src/models/index.ts +1 -0
@@ -0,0 +1,2905 @@
1
+ import { Chart, CategoryScale, LinearScale, PointElement, LineElement, Tooltip as Tooltip$1, Filler, Legend, Title, BarElement, ArcElement, RadialLinearScale } from 'chart.js';
2
+ import React__default, { useRef, useState, useEffect, useMemo } from 'react';
3
+ import { Tooltip, Button, tokens, Caption1, mergeClasses, Menu, MenuTrigger, MenuButton, MenuPopover, MenuList, MenuItem, webLightTheme, ToggleButton } from '@fluentui/react-components';
4
+ import ChartDataLabels from 'chartjs-plugin-datalabels';
5
+ import { Line, Bar, Bubble, Chart as Chart$1, Doughnut, Pie, PolarArea, Radar, Scatter } from 'react-chartjs-2';
6
+ import { css } from '@emotion/css';
7
+ import { ResizeObserver } from '@juggle/resize-observer';
8
+
9
+ function _extends() {
10
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
11
+ for (var e = 1; e < arguments.length; e++) {
12
+ var t = arguments[e];
13
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
14
+ }
15
+ return n;
16
+ }, _extends.apply(null, arguments);
17
+ }
18
+ function _taggedTemplateLiteralLoose(e, t) {
19
+ return t || (t = e.slice(0)), e.raw = t, e;
20
+ }
21
+
22
+ var LegendButton = function LegendButton(_ref) {
23
+ var label = _ref.label,
24
+ isVisible = _ref.isVisible,
25
+ color = _ref.color,
26
+ onClick = _ref.onClick,
27
+ _ref$style = _ref.style,
28
+ style = _ref$style === void 0 ? {} : _ref$style,
29
+ buttonRef = _ref.buttonRef;
30
+ return React__default.createElement(Tooltip, {
31
+ content: label,
32
+ relationship: "label"
33
+ }, React__default.createElement(Button, {
34
+ ref: buttonRef,
35
+ shape: "circular",
36
+ size: "small",
37
+ appearance: isVisible ? 'primary' : 'outline',
38
+ onClick: onClick,
39
+ style: _extends({
40
+ backgroundColor: isVisible ? color : 'transparent',
41
+ color: isVisible ? '#fff' : tokens.colorNeutralForeground1,
42
+ borderColor: color,
43
+ borderWidth: 1,
44
+ width: '100px',
45
+ padding: '4px 8px',
46
+ textAlign: 'center'
47
+ }, style)
48
+ }, React__default.createElement(Caption1, {
49
+ as: "span",
50
+ style: {
51
+ display: 'block',
52
+ overflow: 'hidden',
53
+ textOverflow: 'ellipsis',
54
+ whiteSpace: 'nowrap',
55
+ lineHeight: '1.25'
56
+ }
57
+ }, label)));
58
+ };
59
+
60
+ /**
61
+ * Mapping of predefined sizes to Fluent UI tokens.
62
+ */
63
+ var sizeMap = {
64
+ xs: tokens.spacingHorizontalXS,
65
+ s: tokens.spacingHorizontalS,
66
+ m: tokens.spacingHorizontalM,
67
+ l: tokens.spacingHorizontalL,
68
+ xl: tokens.spacingHorizontalXL,
69
+ xxl: tokens.spacingHorizontalXXL
70
+ };
71
+ /**
72
+ * Stack component provides a flexible layout using Flexbox.
73
+ * It allows stacking child components either horizontally or vertically with predefined spacing options.
74
+ */
75
+ var Stack = /*#__PURE__*/React__default.memo(function (_ref) {
76
+ var _ref$direction = _ref.direction,
77
+ direction = _ref$direction === void 0 ? "vertical" : _ref$direction,
78
+ _ref$justifyContent = _ref.justifyContent,
79
+ justifyContent = _ref$justifyContent === void 0 ? "flex-start" : _ref$justifyContent,
80
+ _ref$alignItems = _ref.alignItems,
81
+ alignItems = _ref$alignItems === void 0 ? "stretch" : _ref$alignItems,
82
+ gap = _ref.gap,
83
+ columnGap = _ref.columnGap,
84
+ rowGap = _ref.rowGap,
85
+ margin = _ref.margin,
86
+ padding = _ref.padding,
87
+ marginTop = _ref.marginTop,
88
+ marginBottom = _ref.marginBottom,
89
+ marginLeft = _ref.marginLeft,
90
+ marginRight = _ref.marginRight,
91
+ paddingTop = _ref.paddingTop,
92
+ paddingBottom = _ref.paddingBottom,
93
+ paddingLeft = _ref.paddingLeft,
94
+ paddingRight = _ref.paddingRight,
95
+ width = _ref.width,
96
+ height = _ref.height,
97
+ _ref$wrap = _ref.wrap,
98
+ wrap = _ref$wrap === void 0 ? false : _ref$wrap,
99
+ children = _ref.children,
100
+ style = _ref.style,
101
+ className = _ref.className,
102
+ overflow = _ref.overflow,
103
+ background = _ref.background;
104
+ var stackStyle = css(_extends({
105
+ display: "flex",
106
+ flexDirection: direction === "horizontal" ? "row" : "column",
107
+ justifyContent: justifyContent,
108
+ alignItems: alignItems,
109
+ gap: gap && sizeMap[gap] ? sizeMap[gap] : gap,
110
+ columnGap: columnGap && sizeMap[columnGap] ? sizeMap[columnGap] : columnGap,
111
+ rowGap: rowGap && sizeMap[rowGap] ? sizeMap[rowGap] : rowGap,
112
+ margin: margin && sizeMap[margin] ? sizeMap[margin] : margin,
113
+ padding: padding && sizeMap[padding] ? sizeMap[padding] : padding,
114
+ marginTop: marginTop && sizeMap[marginTop] ? sizeMap[marginTop] : marginTop,
115
+ marginBottom: marginBottom && sizeMap[marginBottom] ? sizeMap[marginBottom] : marginBottom,
116
+ marginLeft: marginLeft && sizeMap[marginLeft] ? sizeMap[marginLeft] : marginLeft,
117
+ marginRight: marginRight && sizeMap[marginRight] ? sizeMap[marginRight] : marginRight,
118
+ paddingTop: paddingTop && sizeMap[paddingTop] ? sizeMap[paddingTop] : paddingTop,
119
+ paddingBottom: paddingBottom && sizeMap[paddingBottom] ? sizeMap[paddingBottom] : paddingBottom,
120
+ paddingLeft: paddingLeft && sizeMap[paddingLeft] ? sizeMap[paddingLeft] : paddingLeft,
121
+ paddingRight: paddingRight && sizeMap[paddingRight] ? sizeMap[paddingRight] : paddingRight,
122
+ width: width,
123
+ height: height,
124
+ overflow: overflow,
125
+ flexWrap: wrap ? "wrap" : "nowrap",
126
+ backgroundColor: background
127
+ }, style));
128
+ return React__default.createElement("div", {
129
+ className: mergeClasses(className, stackStyle)
130
+ }, children);
131
+ });
132
+ Stack.displayName = "Stack";
133
+
134
+ var styles = {
135
+ wrapper: /*#__PURE__*/css({
136
+ display: 'flex',
137
+ flexWrap: 'nowrap',
138
+ overflow: 'hidden',
139
+ justifyContent: 'center',
140
+ gap: 10,
141
+ padding: 2,
142
+ width: '100%',
143
+ boxSizing: 'border-box'
144
+ })
145
+ };
146
+ function LegendContainer(props) {
147
+ var containerRef = props.containerRef,
148
+ visibleItems = props.visibleItems,
149
+ overflowItems = props.overflowItems,
150
+ visibleLabels = props.visibleLabels,
151
+ toggleLabel = props.toggleLabel,
152
+ renderLabel = props.renderLabel,
153
+ getColor = props.getColor;
154
+ return React__default.createElement(Stack, {
155
+ justifyContent: "center",
156
+ alignItems: "center",
157
+ marginLeft: "10px",
158
+ marginRight: "10px",
159
+ marginTop: "25px",
160
+ marginBottom: "20px"
161
+ }, React__default.createElement("div", {
162
+ ref: containerRef,
163
+ className: styles.wrapper
164
+ }, visibleItems.map(function (item) {
165
+ var label = item.label;
166
+ var isVisible = visibleLabels.length === 0 || visibleLabels.includes(label);
167
+ return React__default.createElement(LegendButton, {
168
+ key: label,
169
+ label: renderLabel(item),
170
+ color: getColor(item),
171
+ isVisible: isVisible,
172
+ onClick: function onClick() {
173
+ return toggleLabel(label);
174
+ }
175
+ });
176
+ }), overflowItems.length > 0 && React__default.createElement(Menu, null, React__default.createElement(MenuTrigger, {
177
+ disableButtonEnhancement: true
178
+ }, React__default.createElement(MenuButton, {
179
+ size: "small",
180
+ appearance: "transparent"
181
+ }, "+", overflowItems.length)), React__default.createElement(MenuPopover, {
182
+ style: {
183
+ minWidth: 'fit-content',
184
+ maxWidth: '200px'
185
+ }
186
+ }, React__default.createElement(MenuList, null, overflowItems.map(function (item) {
187
+ var label = item.label;
188
+ var isVisible = visibleLabels.length === 0 || visibleLabels.includes(label);
189
+ return React__default.createElement(MenuItem, {
190
+ key: label,
191
+ style: {
192
+ padding: 0
193
+ }
194
+ }, React__default.createElement(LegendButton, {
195
+ label: renderLabel(item),
196
+ color: getColor(item),
197
+ isVisible: isVisible,
198
+ onClick: function onClick() {
199
+ return toggleLabel(label);
200
+ },
201
+ style: {
202
+ width: '100px',
203
+ textAlign: 'left'
204
+ }
205
+ }));
206
+ }))))));
207
+ }
208
+
209
+ var BUTTON_WIDTH = 100;
210
+ var GAP = 10;
211
+ function useResponsiveLegend(items) {
212
+ var containerRef = useRef(null);
213
+ var _useState = useState(items.length),
214
+ maxVisible = _useState[0],
215
+ setMaxVisible = _useState[1];
216
+ var _useGraphUtils = useGraphUtils(),
217
+ debounce = _useGraphUtils.debounce;
218
+ useEffect(function () {
219
+ var measure = function measure() {
220
+ var _containerRef$current, _containerRef$current2;
221
+ var containerWidth = (_containerRef$current = (_containerRef$current2 = containerRef.current) == null ? void 0 : _containerRef$current2.offsetWidth) != null ? _containerRef$current : 0;
222
+ var itemTotalWidth = BUTTON_WIDTH + GAP;
223
+ var count = Math.floor(containerWidth / itemTotalWidth);
224
+ setMaxVisible(count);
225
+ };
226
+ var debouncedMeasure = debounce(measure, 100); // debounce resize
227
+ var observer = new ResizeObserver(debouncedMeasure);
228
+ if (containerRef.current) observer.observe(containerRef.current);
229
+ measure(); // initial
230
+ return function () {
231
+ return observer.disconnect();
232
+ };
233
+ }, [items]);
234
+ return {
235
+ containerRef: containerRef,
236
+ visibleItems: items.slice(0, maxVisible),
237
+ overflowItems: items.slice(maxVisible)
238
+ };
239
+ }
240
+
241
+ var RenderLegend = function RenderLegend(_ref) {
242
+ var data = _ref.data,
243
+ visibleSeries = _ref.visibleSeries,
244
+ seriesColors = _ref.seriesColors,
245
+ toggleSeries = _ref.toggleSeries;
246
+ var _useResponsiveLegend = useResponsiveLegend(data),
247
+ containerRef = _useResponsiveLegend.containerRef,
248
+ visibleItems = _useResponsiveLegend.visibleItems,
249
+ overflowItems = _useResponsiveLegend.overflowItems;
250
+ return React__default.createElement(LegendContainer, {
251
+ containerRef: containerRef,
252
+ visibleItems: visibleItems,
253
+ overflowItems: overflowItems,
254
+ items: data,
255
+ visibleLabels: visibleSeries,
256
+ toggleLabel: toggleSeries,
257
+ renderLabel: function renderLabel(d) {
258
+ return d.label;
259
+ },
260
+ getColor: function getColor(d) {
261
+ return seriesColors[d.label];
262
+ }
263
+ });
264
+ };
265
+
266
+ var _templateObject, _templateObject2;
267
+ var useGraphGlobalStyles = function useGraphGlobalStyles() {
268
+ return {
269
+ chartWithLegend: css({
270
+ display: 'flex',
271
+ flexDirection: 'column',
272
+ height: '100%',
273
+ chartArea: {
274
+ flexGrow: 1,
275
+ minHeight: 0
276
+ }
277
+ }),
278
+ chartArea: css(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n flex-grow: 1;\n min-height: 0;\n "]))),
279
+ legendArea: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["\n margin-top: 0px;\n padding-top: 0px;\n \n margin-Left: 10px;\n margin-Right: 10px;\n \n "])))
280
+ };
281
+ };
282
+
283
+ Chart.register(CategoryScale, LinearScale, PointElement, LineElement, Tooltip$1, Filler, Legend, ChartDataLabels, Title);
284
+ function AreaChart(_ref) {
285
+ var data = _ref.data,
286
+ getPrimary = _ref.getPrimary,
287
+ getSecondary = _ref.getSecondary,
288
+ title = _ref.title,
289
+ _ref$showDatalabels = _ref.showDatalabels,
290
+ showDatalabels = _ref$showDatalabels === void 0 ? false : _ref$showDatalabels,
291
+ _ref$theme = _ref.theme,
292
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme,
293
+ _ref$stacked = _ref.stacked,
294
+ stacked = _ref$stacked === void 0 ? false : _ref$stacked;
295
+ var _useState = useState(function () {
296
+ var _data$;
297
+ return data.length > 1 ? data.map(function (s) {
298
+ return s.label;
299
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
300
+ }),
301
+ visibleSeries = _useState[0],
302
+ setVisibleSeries = _useState[1];
303
+ var styles = useGraphGlobalStyles();
304
+ var _useGraphUtils = useGraphUtils(theme),
305
+ lightenColor = _useGraphUtils.lightenColor,
306
+ getFluentPalette = _useGraphUtils.getFluentPalette,
307
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
308
+ var seriesColors = useMemo(function () {
309
+ return data.reduce(function (acc, series, idx) {
310
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
311
+ var color = lightenColor(base, 0.3);
312
+ acc[series.label] = color;
313
+ return acc;
314
+ }, {});
315
+ }, [data, theme]);
316
+ var toggleSeries = function toggleSeries(label) {
317
+ setVisibleSeries(function (prev) {
318
+ var isVisible = prev.includes(label);
319
+ var next = isVisible ? prev.filter(function (l) {
320
+ return l !== label;
321
+ }) : [].concat(prev, [label]);
322
+ return next.length === 0 && data.length > 0 ? [data[0].label] : next;
323
+ });
324
+ };
325
+ var allCategories = useMemo(function () {
326
+ var set = new Set();
327
+ data.forEach(function (series) {
328
+ series.data.forEach(function (d) {
329
+ return set.add(getPrimary(d));
330
+ });
331
+ });
332
+ return Array.from(set);
333
+ }, [data, getPrimary]);
334
+ var chartData = useMemo(function () {
335
+ return {
336
+ labels: allCategories,
337
+ datasets: data.filter(function (series) {
338
+ return visibleSeries.includes(series.label);
339
+ }).map(function (series) {
340
+ return {
341
+ label: series.label,
342
+ data: allCategories.map(function (cat) {
343
+ var match = series.data.find(function (d) {
344
+ return getPrimary(d) === cat;
345
+ });
346
+ return match ? getSecondary(match) : null;
347
+ }),
348
+ borderColor: seriesColors[series.label],
349
+ backgroundColor: seriesColors[series.label],
350
+ fill: true,
351
+ tension: 0.4,
352
+ pointRadius: 2
353
+ };
354
+ })
355
+ };
356
+ }, [data, visibleSeries, allCategories, getPrimary, getSecondary, seriesColors]);
357
+ var _useMemo = useMemo(function () {
358
+ return {
359
+ fontFamily: theme.fontFamilyBase,
360
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
361
+ labelColor: theme.colorNeutralForeground1,
362
+ gridColor: theme.colorNeutralStroke2
363
+ };
364
+ }, [theme]),
365
+ fontFamily = _useMemo.fontFamily,
366
+ fontSize = _useMemo.fontSize,
367
+ labelColor = _useMemo.labelColor,
368
+ gridColor = _useMemo.gridColor;
369
+ var options = useMemo(function () {
370
+ return {
371
+ responsive: true,
372
+ maintainAspectRatio: false,
373
+ plugins: {
374
+ title: {
375
+ display: !!title,
376
+ text: title,
377
+ font: {
378
+ size: 14,
379
+ family: theme.fontFamilyBase,
380
+ weight: theme.fontWeightSemibold
381
+ },
382
+ color: theme.colorNeutralForeground1,
383
+ padding: {
384
+ top: 20,
385
+ bottom: 20
386
+ }
387
+ },
388
+ datalabels: {
389
+ display: showDatalabels,
390
+ color: theme.colorNeutralForeground1,
391
+ font: {
392
+ family: theme.fontFamilyBase,
393
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
394
+ }
395
+ },
396
+ legend: {
397
+ display: false
398
+ },
399
+ tooltip: createFluentTooltip(theme)
400
+ },
401
+ scales: {
402
+ x: {
403
+ stacked: stacked,
404
+ ticks: {
405
+ color: labelColor,
406
+ font: {
407
+ family: fontFamily,
408
+ size: fontSize
409
+ }
410
+ },
411
+ grid: {
412
+ color: gridColor
413
+ }
414
+ },
415
+ y: {
416
+ stacked: stacked,
417
+ ticks: {
418
+ color: labelColor,
419
+ font: {
420
+ family: fontFamily,
421
+ size: fontSize
422
+ }
423
+ },
424
+ grid: {
425
+ color: gridColor
426
+ }
427
+ }
428
+ }
429
+ };
430
+ }, [title, showDatalabels, theme, fontFamily, fontSize, labelColor, gridColor, stacked, createFluentTooltip]);
431
+ return React__default.createElement("div", {
432
+ className: styles.chartWithLegend
433
+ }, React__default.createElement("div", {
434
+ className: styles.chartArea
435
+ }, React__default.createElement(Line, {
436
+ data: chartData,
437
+ options: options
438
+ })), React__default.createElement(RenderLegend, {
439
+ data: data,
440
+ visibleSeries: visibleSeries,
441
+ seriesColors: seriesColors,
442
+ toggleSeries: toggleSeries
443
+ }));
444
+ }
445
+
446
+ Chart.register(CategoryScale, LinearScale, BarElement, Tooltip$1, Legend, Title, ChartDataLabels);
447
+ function BarHorizontalChart(_ref) {
448
+ var data = _ref.data,
449
+ getPrimary = _ref.getPrimary,
450
+ getSecondary = _ref.getSecondary,
451
+ _ref$stacked = _ref.stacked,
452
+ stacked = _ref$stacked === void 0 ? false : _ref$stacked,
453
+ _ref$showDatalabels = _ref.showDatalabels,
454
+ showDatalabels = _ref$showDatalabels === void 0 ? false : _ref$showDatalabels,
455
+ title = _ref.title,
456
+ theme = _ref.theme;
457
+ var _useState = useState(function () {
458
+ var _data$;
459
+ return data.length > 1 ? data.map(function (s) {
460
+ return s.label;
461
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
462
+ }),
463
+ visibleSeries = _useState[0],
464
+ setVisibleSeries = _useState[1];
465
+ var styles = useGraphGlobalStyles();
466
+ var _useGraphUtils = useGraphUtils(theme),
467
+ lightenColor = _useGraphUtils.lightenColor,
468
+ getFluentPalette = _useGraphUtils.getFluentPalette,
469
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
470
+ var seriesColors = useMemo(function () {
471
+ return data.reduce(function (acc, series, idx) {
472
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
473
+ var color = lightenColor(base, 0.3);
474
+ acc[series.label] = color;
475
+ return acc;
476
+ }, {});
477
+ }, [data]);
478
+ var toggleSeries = function toggleSeries(label) {
479
+ setVisibleSeries(function (prev) {
480
+ var isVisible = prev.includes(label);
481
+ var next = isVisible ? prev.filter(function (l) {
482
+ return l !== label;
483
+ }) : [].concat(prev, [label]);
484
+ return next.length === 0 && data.length > 0 ? [data[0].label] : next;
485
+ });
486
+ };
487
+ var allCategories = useMemo(function () {
488
+ var categorySet = new Set();
489
+ data.forEach(function (series) {
490
+ series.data.forEach(function (datum) {
491
+ categorySet.add(getPrimary(datum));
492
+ });
493
+ });
494
+ return Array.from(categorySet);
495
+ }, [data, getPrimary]);
496
+ var chartData = useMemo(function () {
497
+ return {
498
+ labels: allCategories,
499
+ datasets: data.filter(function (series) {
500
+ return visibleSeries.includes(series.label);
501
+ }).map(function (series) {
502
+ return {
503
+ label: series.label,
504
+ backgroundColor: seriesColors[series.label],
505
+ data: allCategories.map(function (cat) {
506
+ var found = series.data.find(function (d) {
507
+ return getPrimary(d) === cat;
508
+ });
509
+ return found ? getSecondary(found) : 0;
510
+ })
511
+ };
512
+ })
513
+ };
514
+ }, [data, visibleSeries, allCategories, seriesColors]);
515
+ var _useMemo = useMemo(function () {
516
+ return {
517
+ fontFamily: theme.fontFamilyBase,
518
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
519
+ labelColor: theme.colorNeutralForeground1,
520
+ gridColor: theme.colorNeutralStroke2
521
+ };
522
+ }, [theme]),
523
+ fontFamily = _useMemo.fontFamily,
524
+ fontSize = _useMemo.fontSize,
525
+ labelColor = _useMemo.labelColor,
526
+ gridColor = _useMemo.gridColor;
527
+ var options = useMemo(function () {
528
+ return {
529
+ indexAxis: 'y',
530
+ responsive: true,
531
+ maintainAspectRatio: false,
532
+ plugins: {
533
+ title: {
534
+ display: !!title,
535
+ text: title,
536
+ font: {
537
+ size: 14,
538
+ family: theme.fontFamilyBase,
539
+ weight: theme.fontWeightSemibold
540
+ },
541
+ color: theme.colorNeutralForeground1,
542
+ padding: {
543
+ top: 20,
544
+ bottom: 20
545
+ }
546
+ },
547
+ datalabels: {
548
+ display: showDatalabels,
549
+ color: theme.colorNeutralForeground1,
550
+ font: {
551
+ family: theme.fontFamilyBase,
552
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
553
+ }
554
+ },
555
+ legend: {
556
+ display: false
557
+ },
558
+ tooltip: createFluentTooltip(theme)
559
+ },
560
+ scales: {
561
+ x: {
562
+ stacked: stacked,
563
+ ticks: {
564
+ color: labelColor,
565
+ font: {
566
+ family: fontFamily,
567
+ size: fontSize
568
+ }
569
+ },
570
+ grid: {
571
+ color: gridColor
572
+ }
573
+ },
574
+ y: {
575
+ stacked: stacked,
576
+ ticks: {
577
+ color: labelColor,
578
+ font: {
579
+ family: fontFamily,
580
+ size: fontSize
581
+ }
582
+ },
583
+ grid: {
584
+ color: gridColor
585
+ }
586
+ }
587
+ }
588
+ };
589
+ }, [title, showDatalabels, theme, fontFamily, fontSize, labelColor, gridColor, stacked, createFluentTooltip]);
590
+ return React__default.createElement("div", {
591
+ className: styles.chartWithLegend
592
+ }, React__default.createElement("div", {
593
+ className: styles.chartArea
594
+ }, React__default.createElement(Bar, {
595
+ data: chartData,
596
+ options: options
597
+ })), React__default.createElement("div", {
598
+ className: styles.legendArea
599
+ }, React__default.createElement(RenderLegend, {
600
+ data: data,
601
+ visibleSeries: visibleSeries,
602
+ seriesColors: seriesColors,
603
+ toggleSeries: toggleSeries
604
+ })));
605
+ }
606
+
607
+ Chart.register(CategoryScale, LinearScale, PointElement, Tooltip$1, Legend, ChartDataLabels, Title);
608
+ function BubbleChart(_ref) {
609
+ var data = _ref.data,
610
+ getPrimary = _ref.getPrimary,
611
+ getSecondary = _ref.getSecondary,
612
+ getRadius = _ref.getRadius,
613
+ showDataLabels = _ref.showDataLabels,
614
+ title = _ref.title,
615
+ _ref$theme = _ref.theme,
616
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
617
+ var _useState = useState(function () {
618
+ var _data$;
619
+ return data.length > 1 ? data.map(function (s) {
620
+ return s.label;
621
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
622
+ }),
623
+ visibleSeries = _useState[0],
624
+ setVisibleSeries = _useState[1];
625
+ var _useGraphUtils = useGraphUtils(theme),
626
+ lightenColor = _useGraphUtils.lightenColor,
627
+ getFluentPalette = _useGraphUtils.getFluentPalette,
628
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
629
+ var styles = useGraphGlobalStyles();
630
+ var seriesColors = useMemo(function () {
631
+ return data.reduce(function (acc, series, idx) {
632
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
633
+ var color = lightenColor(base, 0.3);
634
+ acc[series.label] = color;
635
+ return acc;
636
+ }, {});
637
+ }, [data, theme]);
638
+ var toggleSeries = function toggleSeries(label) {
639
+ setVisibleSeries(function (prev) {
640
+ var isVisible = prev.includes(label);
641
+ var next = isVisible ? prev.filter(function (l) {
642
+ return l !== label;
643
+ }) : [].concat(prev, [label]);
644
+ return next.length === 0 && data.length > 0 ? [data[0].label] : next;
645
+ });
646
+ };
647
+ var chartData = useMemo(function () {
648
+ return {
649
+ datasets: data.filter(function (series) {
650
+ return visibleSeries.includes(series.label);
651
+ }).map(function (series) {
652
+ return {
653
+ label: series.label,
654
+ data: series.data.map(function (d) {
655
+ return {
656
+ x: getPrimary(d),
657
+ y: getSecondary(d),
658
+ r: getRadius(d)
659
+ };
660
+ }),
661
+ backgroundColor: seriesColors[series.label],
662
+ borderColor: theme.colorNeutralStroke1,
663
+ borderWidth: 1,
664
+ hoverBorderWidth: 2
665
+ };
666
+ })
667
+ };
668
+ }, [data, visibleSeries, getPrimary, getSecondary, getRadius, seriesColors]);
669
+ var _useMemo = useMemo(function () {
670
+ return {
671
+ fontFamily: theme.fontFamilyBase,
672
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
673
+ labelColor: theme.colorNeutralForeground1,
674
+ gridColor: theme.colorNeutralStroke2
675
+ };
676
+ }, [theme]),
677
+ fontFamily = _useMemo.fontFamily,
678
+ fontSize = _useMemo.fontSize,
679
+ labelColor = _useMemo.labelColor,
680
+ gridColor = _useMemo.gridColor;
681
+ var options = useMemo(function () {
682
+ var _data$2;
683
+ return {
684
+ responsive: true,
685
+ maintainAspectRatio: false,
686
+ plugins: {
687
+ title: {
688
+ display: !!title,
689
+ text: title,
690
+ font: {
691
+ size: 14,
692
+ family: theme.fontFamilyBase,
693
+ weight: theme.fontWeightSemibold
694
+ },
695
+ color: theme.colorNeutralForeground1,
696
+ padding: {
697
+ top: 20,
698
+ bottom: 20
699
+ }
700
+ },
701
+ datalabels: {
702
+ display: showDataLabels,
703
+ color: theme.colorNeutralForeground1,
704
+ font: {
705
+ family: theme.fontFamilyBase,
706
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
707
+ }
708
+ },
709
+ legend: {
710
+ display: false
711
+ },
712
+ tooltip: createFluentTooltip(theme)
713
+ },
714
+ scales: {
715
+ x: {
716
+ type: typeof getPrimary((_data$2 = data[0]) == null ? void 0 : _data$2.data[0]) === 'number' ? 'linear' : 'category',
717
+ ticks: {
718
+ color: labelColor,
719
+ font: {
720
+ family: fontFamily,
721
+ size: fontSize
722
+ }
723
+ },
724
+ grid: {
725
+ color: gridColor
726
+ }
727
+ },
728
+ y: {
729
+ ticks: {
730
+ color: labelColor,
731
+ font: {
732
+ family: fontFamily,
733
+ size: fontSize
734
+ }
735
+ },
736
+ grid: {
737
+ color: gridColor
738
+ }
739
+ }
740
+ }
741
+ };
742
+ }, [title, showDataLabels, theme, getPrimary, getSecondary, data, fontFamily, fontSize, labelColor, gridColor, createFluentTooltip]);
743
+ return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
744
+ className: styles.chartWithLegend
745
+ }, React__default.createElement("div", {
746
+ className: styles.chartArea
747
+ }, React__default.createElement(Bubble, {
748
+ data: chartData,
749
+ options: options
750
+ })), React__default.createElement("div", {
751
+ className: styles.legendArea
752
+ }, React__default.createElement(RenderLegend, {
753
+ data: data,
754
+ visibleSeries: visibleSeries,
755
+ seriesColors: seriesColors,
756
+ toggleSeries: toggleSeries
757
+ }))));
758
+ }
759
+
760
+ Chart.register(ChartDataLabels);
761
+ Chart.register(CategoryScale, LinearScale, BarElement, LineElement, PointElement, Tooltip$1, Legend, Title);
762
+ function ComboChart(_ref) {
763
+ var data = _ref.data,
764
+ getPrimary = _ref.getPrimary,
765
+ getSecondary = _ref.getSecondary,
766
+ title = _ref.title,
767
+ _ref$showDataLabels = _ref.showDataLabels,
768
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
769
+ _ref$theme = _ref.theme,
770
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
771
+ var _useState = useState(function () {
772
+ return data.map(function (s) {
773
+ return s.label;
774
+ });
775
+ }),
776
+ visibleSeries = _useState[0],
777
+ setVisibleSeries = _useState[1];
778
+ var styles = useGraphGlobalStyles();
779
+ var _useGraphUtils = useGraphUtils(theme),
780
+ lightenColor = _useGraphUtils.lightenColor,
781
+ getFluentPalette = _useGraphUtils.getFluentPalette,
782
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
783
+ var seriesColors = useMemo(function () {
784
+ return data.reduce(function (acc, series, idx) {
785
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
786
+ acc[series.label] = lightenColor(base, 0.3);
787
+ return acc;
788
+ }, {});
789
+ }, [data, theme]);
790
+ var toggleSeries = function toggleSeries(label) {
791
+ setVisibleSeries(function (prev) {
792
+ var isVisible = prev.includes(label);
793
+ var next = isVisible ? prev.filter(function (l) {
794
+ return l !== label;
795
+ }) : [].concat(prev, [label]);
796
+ return next.length === 0 ? [data[0].label] : next;
797
+ });
798
+ };
799
+ var allCategories = useMemo(function () {
800
+ var set = new Set();
801
+ data.forEach(function (series) {
802
+ return series.data.forEach(function (d) {
803
+ return set.add(getPrimary(d));
804
+ });
805
+ });
806
+ return Array.from(set);
807
+ }, [data, getPrimary]);
808
+ var chartData = useMemo(function () {
809
+ var sortedSeries = data.filter(function (series) {
810
+ return visibleSeries.includes(series.label);
811
+ }).sort(function (a, b) {
812
+ // Ensure bars come before lines
813
+ if (a.type === 'bar' && b.type === 'line') return -1;
814
+ if (a.type === 'line' && b.type === 'bar') return 1;
815
+ return 0;
816
+ });
817
+ return {
818
+ labels: allCategories,
819
+ datasets: sortedSeries.map(function (series) {
820
+ var _series$yAxisID;
821
+ return {
822
+ type: series.type,
823
+ label: series.label,
824
+ yAxisID: (_series$yAxisID = series.yAxisID) != null ? _series$yAxisID : 'y',
825
+ data: allCategories.map(function (cat) {
826
+ var found = series.data.find(function (d) {
827
+ return getPrimary(d) === cat;
828
+ });
829
+ return found ? getSecondary(found) : 0;
830
+ }),
831
+ backgroundColor: seriesColors[series.label],
832
+ borderColor: seriesColors[series.label],
833
+ fill: series.type === 'bar',
834
+ tension: series.type === 'line' ? 0.4 : 0,
835
+ pointRadius: series.type === 'line' ? 3 : 0,
836
+ borderWidth: series.type === 'line' ? 2 : 1,
837
+ order: series.type === 'bar' ? 1 : 0
838
+ };
839
+ })
840
+ };
841
+ }, [data, visibleSeries, allCategories, getPrimary, getSecondary, seriesColors]);
842
+ var _useMemo = useMemo(function () {
843
+ return {
844
+ fontFamily: theme.fontFamilyBase,
845
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
846
+ labelColor: theme.colorNeutralForeground1,
847
+ gridColor: theme.colorNeutralStroke2
848
+ };
849
+ }, [theme]),
850
+ fontFamily = _useMemo.fontFamily,
851
+ fontSize = _useMemo.fontSize,
852
+ labelColor = _useMemo.labelColor,
853
+ gridColor = _useMemo.gridColor;
854
+ var options = useMemo(function () {
855
+ return {
856
+ responsive: true,
857
+ maintainAspectRatio: false,
858
+ plugins: {
859
+ title: {
860
+ display: !!title,
861
+ text: title,
862
+ font: {
863
+ size: 14,
864
+ family: theme.fontFamilyBase,
865
+ weight: theme.fontWeightSemibold
866
+ },
867
+ color: theme.colorNeutralForeground1,
868
+ padding: {
869
+ top: 20,
870
+ bottom: 20
871
+ }
872
+ },
873
+ datalabels: {
874
+ display: showDataLabels,
875
+ color: theme.colorNeutralForeground1,
876
+ font: {
877
+ family: theme.fontFamilyBase,
878
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
879
+ }
880
+ },
881
+ legend: {
882
+ display: false
883
+ },
884
+ tooltip: createFluentTooltip(theme)
885
+ },
886
+ scales: {
887
+ x: {
888
+ ticks: {
889
+ color: labelColor,
890
+ font: {
891
+ family: fontFamily,
892
+ size: fontSize
893
+ }
894
+ },
895
+ grid: {
896
+ color: gridColor
897
+ }
898
+ },
899
+ y: {
900
+ position: 'left',
901
+ ticks: {
902
+ color: labelColor,
903
+ font: {
904
+ family: fontFamily,
905
+ size: fontSize
906
+ }
907
+ },
908
+ grid: {
909
+ color: gridColor
910
+ },
911
+ stacked: false
912
+ }
913
+ }
914
+ };
915
+ }, [title, showDataLabels, theme, fontFamily, fontSize, labelColor, gridColor, createFluentTooltip]);
916
+ return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
917
+ className: styles.chartWithLegend
918
+ }, React__default.createElement("div", {
919
+ className: styles.chartArea
920
+ }, React__default.createElement(Chart$1, {
921
+ type: "bar",
922
+ data: chartData,
923
+ options: options
924
+ })), React__default.createElement("div", {
925
+ className: styles.legendArea
926
+ }, React__default.createElement(RenderLegend, {
927
+ data: data,
928
+ visibleSeries: visibleSeries,
929
+ seriesColors: seriesColors,
930
+ toggleSeries: toggleSeries
931
+ }))));
932
+ }
933
+
934
+ var RenderValueLegend = function RenderValueLegend(_ref) {
935
+ var entries = _ref.entries,
936
+ visibleLabels = _ref.visibleLabels,
937
+ toggleLabel = _ref.toggleLabel;
938
+ var _useResponsiveLegend = useResponsiveLegend(entries),
939
+ containerRef = _useResponsiveLegend.containerRef,
940
+ visibleItems = _useResponsiveLegend.visibleItems,
941
+ overflowItems = _useResponsiveLegend.overflowItems;
942
+ return React__default.createElement(LegendContainer, {
943
+ containerRef: containerRef,
944
+ visibleItems: visibleItems,
945
+ overflowItems: overflowItems,
946
+ items: entries,
947
+ visibleLabels: visibleLabels,
948
+ toggleLabel: toggleLabel,
949
+ renderLabel: function renderLabel(entry) {
950
+ return entry.label + ": " + entry.value;
951
+ },
952
+ getColor: function getColor(entry) {
953
+ return entry.color;
954
+ }
955
+ });
956
+ };
957
+
958
+ Chart.register(ChartDataLabels);
959
+ Chart.register(ArcElement, Tooltip$1, Legend, Title);
960
+ function DoughnutChart(_ref) {
961
+ var data = _ref.data,
962
+ getLabel = _ref.getLabel,
963
+ getValue = _ref.getValue,
964
+ title = _ref.title,
965
+ _ref$showDataLabels = _ref.showDataLabels,
966
+ showDataLabels = _ref$showDataLabels === void 0 ? true : _ref$showDataLabels,
967
+ _ref$theme = _ref.theme,
968
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
969
+ var styles = useGraphGlobalStyles();
970
+ var _useGraphUtils = useGraphUtils(theme),
971
+ lightenColor = _useGraphUtils.lightenColor,
972
+ getFluentPalette = _useGraphUtils.getFluentPalette,
973
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
974
+ var _useState = useState([]),
975
+ hiddenLabels = _useState[0],
976
+ setHiddenLabels = _useState[1];
977
+ var toggleLabel = function toggleLabel(label) {
978
+ setHiddenLabels(function (prev) {
979
+ return prev.includes(label) ? prev.filter(function (l) {
980
+ return l !== label;
981
+ }) : [].concat(prev, [label]);
982
+ });
983
+ };
984
+ var valueMap = useMemo(function () {
985
+ var map = new Map();
986
+ data.forEach(function (series) {
987
+ series.data.forEach(function (d) {
988
+ var label = getLabel(d);
989
+ var value = getValue(d);
990
+ map.set(label, (map.get(label) || 0) + value);
991
+ });
992
+ });
993
+ return map;
994
+ }, [data, getLabel, getValue]);
995
+ var _useMemo = useMemo(function () {
996
+ var allLabels = Array.from(valueMap.keys());
997
+ var palette = getFluentPalette(theme);
998
+ var colors = allLabels.map(function (_, i) {
999
+ return lightenColor(palette[i % palette.length], 0.3);
1000
+ });
1001
+ return {
1002
+ allLabels: allLabels,
1003
+ colors: colors
1004
+ };
1005
+ }, [valueMap, getFluentPalette, theme, lightenColor]),
1006
+ allLabels = _useMemo.allLabels,
1007
+ colors = _useMemo.colors;
1008
+ var _useMemo2 = useMemo(function () {
1009
+ var filteredLabels = allLabels.filter(function (label) {
1010
+ return !hiddenLabels.includes(label);
1011
+ });
1012
+ var values = filteredLabels.map(function (label) {
1013
+ return valueMap.get(label) || 0;
1014
+ });
1015
+ var visibleColors = filteredLabels.map(function (label) {
1016
+ var idx = allLabels.indexOf(label);
1017
+ return colors[idx];
1018
+ });
1019
+ return {
1020
+ filteredLabels: filteredLabels,
1021
+ values: values,
1022
+ visibleColors: visibleColors
1023
+ };
1024
+ }, [allLabels, hiddenLabels, valueMap, colors]),
1025
+ filteredLabels = _useMemo2.filteredLabels,
1026
+ values = _useMemo2.values,
1027
+ visibleColors = _useMemo2.visibleColors;
1028
+ var chartData = useMemo(function () {
1029
+ return {
1030
+ labels: filteredLabels,
1031
+ datasets: [{
1032
+ data: values,
1033
+ backgroundColor: visibleColors,
1034
+ borderWidth: 1
1035
+ }]
1036
+ };
1037
+ }, [filteredLabels, values, visibleColors]);
1038
+ var legendEntries = useMemo(function () {
1039
+ return allLabels.map(function (label, idx) {
1040
+ return {
1041
+ label: label,
1042
+ value: valueMap.get(label) || 0,
1043
+ color: colors[idx]
1044
+ };
1045
+ });
1046
+ }, [allLabels, valueMap, colors]);
1047
+ var options = useMemo(function () {
1048
+ return {
1049
+ responsive: true,
1050
+ maintainAspectRatio: false,
1051
+ plugins: {
1052
+ legend: {
1053
+ display: false
1054
+ },
1055
+ tooltip: createFluentTooltip(theme),
1056
+ title: {
1057
+ display: !!title,
1058
+ text: title,
1059
+ font: {
1060
+ size: 14,
1061
+ family: theme.fontFamilyBase,
1062
+ weight: theme.fontWeightSemibold
1063
+ },
1064
+ color: theme.colorNeutralForeground1,
1065
+ padding: {
1066
+ top: 20,
1067
+ bottom: 20
1068
+ }
1069
+ },
1070
+ datalabels: {
1071
+ display: showDataLabels,
1072
+ color: theme.colorNeutralForeground1,
1073
+ font: {
1074
+ family: theme.fontFamilyBase,
1075
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1076
+ },
1077
+ formatter: function formatter(value) {
1078
+ return value;
1079
+ }
1080
+ }
1081
+ }
1082
+ };
1083
+ }, [title, theme, showDataLabels, createFluentTooltip]);
1084
+ return React__default.createElement("div", {
1085
+ className: styles.chartWithLegend
1086
+ }, React__default.createElement("div", {
1087
+ className: styles.chartArea
1088
+ }, React__default.createElement(Doughnut, {
1089
+ data: chartData,
1090
+ options: options
1091
+ })), React__default.createElement("div", {
1092
+ className: styles.legendArea
1093
+ }, React__default.createElement(RenderValueLegend, {
1094
+ entries: legendEntries,
1095
+ visibleLabels: filteredLabels,
1096
+ toggleLabel: toggleLabel
1097
+ })));
1098
+ }
1099
+
1100
+ Chart.register(ChartDataLabels);
1101
+ Chart.register(CategoryScale, LinearScale, BarElement, Tooltip$1, Legend, Title);
1102
+ function FloatingBarChart(_ref) {
1103
+ var data = _ref.data,
1104
+ getPrimary = _ref.getPrimary,
1105
+ getRange = _ref.getRange,
1106
+ title = _ref.title,
1107
+ _ref$showDataLabels = _ref.showDataLabels,
1108
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
1109
+ _ref$theme = _ref.theme,
1110
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
1111
+ var _useState = useState(function () {
1112
+ var _data$;
1113
+ return data.length > 1 ? data.map(function (s) {
1114
+ return s.label;
1115
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
1116
+ }),
1117
+ visibleSeries = _useState[0],
1118
+ setVisibleSeries = _useState[1];
1119
+ var styles = useGraphGlobalStyles();
1120
+ var _useGraphUtils = useGraphUtils(theme),
1121
+ lightenColor = _useGraphUtils.lightenColor,
1122
+ getFluentPalette = _useGraphUtils.getFluentPalette,
1123
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
1124
+ var seriesColors = useMemo(function () {
1125
+ return data.reduce(function (acc, series, idx) {
1126
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
1127
+ var color = lightenColor(base, 0.3);
1128
+ acc[series.label] = color;
1129
+ return acc;
1130
+ }, {});
1131
+ }, [data, theme]);
1132
+ var toggleSeries = function toggleSeries(label) {
1133
+ setVisibleSeries(function (prev) {
1134
+ var isVisible = prev.includes(label);
1135
+ var next = isVisible ? prev.filter(function (l) {
1136
+ return l !== label;
1137
+ }) : [].concat(prev, [label]);
1138
+ return next.length === 0 && data.length > 0 ? [data[0].label] : next;
1139
+ });
1140
+ };
1141
+ var allCategories = useMemo(function () {
1142
+ var set = new Set();
1143
+ data.forEach(function (series) {
1144
+ series.data.forEach(function (d) {
1145
+ return set.add(getPrimary(d));
1146
+ });
1147
+ });
1148
+ return Array.from(set);
1149
+ }, [data, getPrimary]);
1150
+ var chartData = useMemo(function () {
1151
+ return {
1152
+ labels: allCategories,
1153
+ datasets: data.filter(function (series) {
1154
+ return visibleSeries.includes(series.label);
1155
+ }).map(function (series) {
1156
+ return {
1157
+ label: series.label,
1158
+ data: allCategories.map(function (cat) {
1159
+ var match = series.data.find(function (d) {
1160
+ return getPrimary(d) === cat;
1161
+ });
1162
+ return match ? getRange(match) : [0, 0];
1163
+ }),
1164
+ backgroundColor: seriesColors[series.label],
1165
+ borderRadius: 2
1166
+ };
1167
+ })
1168
+ };
1169
+ }, [data, visibleSeries, allCategories, getPrimary, getRange, seriesColors]);
1170
+ var _useMemo = useMemo(function () {
1171
+ return {
1172
+ fontFamily: theme.fontFamilyBase,
1173
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
1174
+ labelColor: theme.colorNeutralForeground1,
1175
+ gridColor: theme.colorNeutralStroke2
1176
+ };
1177
+ }, [theme]),
1178
+ fontFamily = _useMemo.fontFamily,
1179
+ fontSize = _useMemo.fontSize,
1180
+ labelColor = _useMemo.labelColor,
1181
+ gridColor = _useMemo.gridColor;
1182
+ var options = useMemo(function () {
1183
+ return {
1184
+ responsive: true,
1185
+ maintainAspectRatio: false,
1186
+ plugins: {
1187
+ title: {
1188
+ display: !!title,
1189
+ text: title,
1190
+ font: {
1191
+ size: 14,
1192
+ family: theme.fontFamilyBase,
1193
+ weight: theme.fontWeightSemibold
1194
+ },
1195
+ color: theme.colorNeutralForeground1,
1196
+ padding: {
1197
+ top: 20,
1198
+ bottom: 20
1199
+ }
1200
+ },
1201
+ datalabels: {
1202
+ display: showDataLabels,
1203
+ color: theme.colorNeutralForeground1,
1204
+ font: {
1205
+ family: theme.fontFamilyBase,
1206
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1207
+ }
1208
+ },
1209
+ legend: {
1210
+ display: false
1211
+ },
1212
+ tooltip: createFluentTooltip(theme)
1213
+ },
1214
+ scales: {
1215
+ x: {
1216
+ ticks: {
1217
+ color: labelColor,
1218
+ font: {
1219
+ family: fontFamily,
1220
+ size: fontSize
1221
+ }
1222
+ },
1223
+ grid: {
1224
+ color: gridColor
1225
+ }
1226
+ },
1227
+ y: {
1228
+ ticks: {
1229
+ color: labelColor,
1230
+ font: {
1231
+ family: fontFamily,
1232
+ size: fontSize
1233
+ }
1234
+ },
1235
+ grid: {
1236
+ color: gridColor
1237
+ }
1238
+ }
1239
+ }
1240
+ };
1241
+ }, [title, theme, showDataLabels, labelColor, fontFamily, fontSize, gridColor, createFluentTooltip]);
1242
+ return React__default.createElement("div", {
1243
+ className: styles.chartWithLegend
1244
+ }, React__default.createElement("div", {
1245
+ className: styles.chartArea
1246
+ }, React__default.createElement(Bar, {
1247
+ data: chartData,
1248
+ options: options
1249
+ })), React__default.createElement("div", {
1250
+ className: styles.legendArea
1251
+ }, React__default.createElement(RenderLegend, {
1252
+ data: data,
1253
+ visibleSeries: visibleSeries,
1254
+ seriesColors: seriesColors,
1255
+ toggleSeries: toggleSeries
1256
+ })));
1257
+ }
1258
+
1259
+ Chart.register(ChartDataLabels);
1260
+ Chart.register(LineElement, PointElement, CategoryScale, LinearScale, Tooltip$1, Legend, Title);
1261
+ function LineChart(_ref) {
1262
+ var data = _ref.data,
1263
+ getPrimary = _ref.getPrimary,
1264
+ getSecondary = _ref.getSecondary,
1265
+ title = _ref.title,
1266
+ _ref$showDataLabels = _ref.showDataLabels,
1267
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
1268
+ _ref$theme = _ref.theme,
1269
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
1270
+ var _useState = useState(function () {
1271
+ var _data$;
1272
+ return data.length > 1 ? data.map(function (s) {
1273
+ return s.label;
1274
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
1275
+ }),
1276
+ visibleSeries = _useState[0],
1277
+ setVisibleSeries = _useState[1];
1278
+ var styles = useGraphGlobalStyles();
1279
+ var _useGraphUtils = useGraphUtils(theme),
1280
+ lightenColor = _useGraphUtils.lightenColor,
1281
+ getFluentPalette = _useGraphUtils.getFluentPalette,
1282
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
1283
+ var seriesColors = useMemo(function () {
1284
+ return data.reduce(function (acc, series, idx) {
1285
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
1286
+ var color = lightenColor(base, 0.3);
1287
+ acc[series.label] = color;
1288
+ return acc;
1289
+ }, {});
1290
+ }, [data, theme]);
1291
+ var toggleSeries = function toggleSeries(label) {
1292
+ setVisibleSeries(function (prev) {
1293
+ var isVisible = prev.includes(label);
1294
+ var next = isVisible ? prev.filter(function (l) {
1295
+ return l !== label;
1296
+ }) : [].concat(prev, [label]);
1297
+ return next.length === 0 && data.length > 0 ? [data[0].label] : next;
1298
+ });
1299
+ };
1300
+ var allCategories = useMemo(function () {
1301
+ var set = new Set();
1302
+ data.forEach(function (series) {
1303
+ series.data.forEach(function (d) {
1304
+ return set.add(getPrimary(d));
1305
+ });
1306
+ });
1307
+ return Array.from(set);
1308
+ }, [data, getPrimary]);
1309
+ var chartData = useMemo(function () {
1310
+ return {
1311
+ labels: allCategories,
1312
+ datasets: data.filter(function (series) {
1313
+ return visibleSeries.includes(series.label);
1314
+ }).map(function (series) {
1315
+ return {
1316
+ label: series.label,
1317
+ data: allCategories.map(function (cat) {
1318
+ var match = series.data.find(function (d) {
1319
+ return getPrimary(d) === cat;
1320
+ });
1321
+ return match ? getSecondary(match) : null;
1322
+ }),
1323
+ borderColor: seriesColors[series.label],
1324
+ backgroundColor: seriesColors[series.label],
1325
+ tension: 0.4,
1326
+ fill: false,
1327
+ pointRadius: 4
1328
+ };
1329
+ })
1330
+ };
1331
+ }, [data, visibleSeries, allCategories, getPrimary, getSecondary, seriesColors]);
1332
+ var _useMemo = useMemo(function () {
1333
+ return {
1334
+ fontFamily: theme.fontFamilyBase,
1335
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
1336
+ labelColor: theme.colorNeutralForeground1,
1337
+ gridColor: theme.colorNeutralStroke2
1338
+ };
1339
+ }, [theme]),
1340
+ fontFamily = _useMemo.fontFamily,
1341
+ fontSize = _useMemo.fontSize,
1342
+ labelColor = _useMemo.labelColor,
1343
+ gridColor = _useMemo.gridColor;
1344
+ var options = useMemo(function () {
1345
+ return {
1346
+ responsive: true,
1347
+ maintainAspectRatio: false,
1348
+ plugins: {
1349
+ title: {
1350
+ display: !!title,
1351
+ text: title,
1352
+ font: {
1353
+ size: 14,
1354
+ family: theme.fontFamilyBase,
1355
+ weight: theme.fontWeightSemibold
1356
+ },
1357
+ color: theme.colorNeutralForeground1,
1358
+ padding: {
1359
+ top: 20,
1360
+ bottom: 20
1361
+ }
1362
+ },
1363
+ datalabels: {
1364
+ display: showDataLabels,
1365
+ color: theme.colorNeutralForeground1,
1366
+ font: {
1367
+ family: theme.fontFamilyBase,
1368
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1369
+ }
1370
+ },
1371
+ legend: {
1372
+ display: false
1373
+ },
1374
+ tooltip: createFluentTooltip(theme)
1375
+ },
1376
+ scales: {
1377
+ x: {
1378
+ ticks: {
1379
+ color: labelColor,
1380
+ font: {
1381
+ family: fontFamily,
1382
+ size: fontSize
1383
+ }
1384
+ },
1385
+ grid: {
1386
+ color: gridColor
1387
+ }
1388
+ },
1389
+ y: {
1390
+ ticks: {
1391
+ color: labelColor,
1392
+ font: {
1393
+ family: fontFamily,
1394
+ size: fontSize
1395
+ }
1396
+ },
1397
+ grid: {
1398
+ color: gridColor
1399
+ }
1400
+ }
1401
+ }
1402
+ };
1403
+ }, [title, theme, showDataLabels, labelColor, fontFamily, fontSize, gridColor, createFluentTooltip]);
1404
+ return React__default.createElement("div", {
1405
+ className: styles.chartWithLegend
1406
+ }, React__default.createElement("div", {
1407
+ className: styles.chartArea
1408
+ }, React__default.createElement(Line, {
1409
+ data: chartData,
1410
+ options: options
1411
+ })), React__default.createElement("div", {
1412
+ className: styles.legendArea
1413
+ }, React__default.createElement(RenderLegend, {
1414
+ data: data,
1415
+ visibleSeries: visibleSeries,
1416
+ seriesColors: seriesColors,
1417
+ toggleSeries: toggleSeries
1418
+ })));
1419
+ }
1420
+
1421
+ Chart.register(ChartDataLabels);
1422
+ Chart.register(ArcElement, Tooltip$1, Legend, Title);
1423
+ function PieChart(_ref) {
1424
+ var data = _ref.data,
1425
+ getLabel = _ref.getLabel,
1426
+ getValue = _ref.getValue,
1427
+ title = _ref.title,
1428
+ _ref$showDataLabels = _ref.showDataLabels,
1429
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
1430
+ _ref$theme = _ref.theme,
1431
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
1432
+ var _useGraphUtils = useGraphUtils(theme),
1433
+ getFluentPalette = _useGraphUtils.getFluentPalette,
1434
+ lightenColor = _useGraphUtils.lightenColor;
1435
+ var _useState = useState([]),
1436
+ hiddenLabels = _useState[0],
1437
+ setHiddenLabels = _useState[1];
1438
+ var styles = useGraphGlobalStyles();
1439
+ var toggleLabel = function toggleLabel(label) {
1440
+ setHiddenLabels(function (prev) {
1441
+ return prev.includes(label) ? prev.filter(function (l) {
1442
+ return l !== label;
1443
+ }) : [].concat(prev, [label]);
1444
+ });
1445
+ };
1446
+ var valueMap = useMemo(function () {
1447
+ var map = new Map();
1448
+ data.forEach(function (series) {
1449
+ series.data.forEach(function (d) {
1450
+ var label = getLabel(d);
1451
+ var value = getValue(d);
1452
+ map.set(label, (map.get(label) || 0) + value);
1453
+ });
1454
+ });
1455
+ return map;
1456
+ }, [data, getLabel, getValue]);
1457
+ var _useMemo = useMemo(function () {
1458
+ var allLabels = Array.from(valueMap.keys());
1459
+ var palette = getFluentPalette(theme);
1460
+ var colors = allLabels.map(function (_, i) {
1461
+ return lightenColor(palette[i % palette.length], 0.3);
1462
+ });
1463
+ var filteredLabels = allLabels.filter(function (label) {
1464
+ return !hiddenLabels.includes(label);
1465
+ });
1466
+ var values = filteredLabels.map(function (label) {
1467
+ return valueMap.get(label) || 0;
1468
+ });
1469
+ var visibleColors = filteredLabels.map(function (label) {
1470
+ var idx = allLabels.indexOf(label);
1471
+ return colors[idx];
1472
+ });
1473
+ return {
1474
+ allLabels: allLabels,
1475
+ colors: colors,
1476
+ filteredLabels: filteredLabels,
1477
+ values: values,
1478
+ visibleColors: visibleColors
1479
+ };
1480
+ }, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]),
1481
+ allLabels = _useMemo.allLabels,
1482
+ colors = _useMemo.colors,
1483
+ filteredLabels = _useMemo.filteredLabels,
1484
+ values = _useMemo.values,
1485
+ visibleColors = _useMemo.visibleColors;
1486
+ var _useMemo2 = useMemo(function () {
1487
+ var chartData = {
1488
+ labels: filteredLabels,
1489
+ datasets: [{
1490
+ data: values,
1491
+ backgroundColor: visibleColors,
1492
+ borderWidth: 1
1493
+ }]
1494
+ };
1495
+ var legendEntries = allLabels.map(function (label, i) {
1496
+ return {
1497
+ label: label,
1498
+ value: valueMap.get(label) || 0,
1499
+ color: colors[i]
1500
+ };
1501
+ });
1502
+ return {
1503
+ chartData: chartData,
1504
+ legendEntries: legendEntries
1505
+ };
1506
+ }, [filteredLabels, values, visibleColors, allLabels, valueMap, colors]),
1507
+ chartData = _useMemo2.chartData,
1508
+ legendEntries = _useMemo2.legendEntries;
1509
+ var options = useMemo(function () {
1510
+ return {
1511
+ responsive: true,
1512
+ maintainAspectRatio: false,
1513
+ plugins: {
1514
+ tooltip: createFluentTooltip(theme),
1515
+ legend: {
1516
+ display: false
1517
+ },
1518
+ title: {
1519
+ display: !!title,
1520
+ text: title,
1521
+ font: {
1522
+ size: 14,
1523
+ family: theme.fontFamilyBase,
1524
+ weight: theme.fontWeightSemibold
1525
+ },
1526
+ color: theme.colorNeutralForeground1,
1527
+ padding: {
1528
+ top: 20,
1529
+ bottom: 20
1530
+ }
1531
+ },
1532
+ datalabels: {
1533
+ display: showDataLabels,
1534
+ color: theme.colorNeutralForeground1,
1535
+ font: {
1536
+ family: theme.fontFamilyBase,
1537
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1538
+ }
1539
+ }
1540
+ }
1541
+ };
1542
+ }, [theme, title, showDataLabels]);
1543
+ return React__default.createElement("div", {
1544
+ className: styles.chartWithLegend
1545
+ }, React__default.createElement("div", {
1546
+ className: styles.chartArea
1547
+ }, React__default.createElement(Pie, {
1548
+ data: chartData,
1549
+ options: options
1550
+ })), React__default.createElement("div", {
1551
+ className: styles.legendArea
1552
+ }, React__default.createElement(RenderValueLegend, {
1553
+ entries: legendEntries,
1554
+ visibleLabels: filteredLabels,
1555
+ toggleLabel: toggleLabel
1556
+ })));
1557
+ }
1558
+
1559
+ var RenderSliceLegend = function RenderSliceLegend(_ref) {
1560
+ var labels = _ref.labels,
1561
+ colors = _ref.colors,
1562
+ visibleLabels = _ref.visibleLabels,
1563
+ toggleLabel = _ref.toggleLabel;
1564
+ var items = labels.map(function (label, i) {
1565
+ return {
1566
+ label: label,
1567
+ color: colors[i]
1568
+ };
1569
+ });
1570
+ var _useResponsiveLegend = useResponsiveLegend(items),
1571
+ containerRef = _useResponsiveLegend.containerRef,
1572
+ visibleItems = _useResponsiveLegend.visibleItems,
1573
+ overflowItems = _useResponsiveLegend.overflowItems;
1574
+ return React__default.createElement(LegendContainer, {
1575
+ containerRef: containerRef,
1576
+ visibleItems: visibleItems,
1577
+ overflowItems: overflowItems,
1578
+ items: items,
1579
+ visibleLabels: visibleLabels,
1580
+ toggleLabel: toggleLabel,
1581
+ renderLabel: function renderLabel(item) {
1582
+ return item.label;
1583
+ },
1584
+ getColor: function getColor(item) {
1585
+ return item.color;
1586
+ }
1587
+ });
1588
+ };
1589
+
1590
+ Chart.register(RadialLinearScale, ArcElement, Tooltip$1, Legend, Title, ChartDataLabels);
1591
+ function PolarChart(_ref) {
1592
+ var data = _ref.data,
1593
+ getLabel = _ref.getLabel,
1594
+ getValue = _ref.getValue,
1595
+ title = _ref.title,
1596
+ _ref$showDataLabels = _ref.showDataLabels,
1597
+ showDataLabels = _ref$showDataLabels === void 0 ? true : _ref$showDataLabels,
1598
+ _ref$theme = _ref.theme,
1599
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
1600
+ var _useGraphUtils = useGraphUtils(theme),
1601
+ getFluentPalette = _useGraphUtils.getFluentPalette,
1602
+ lightenColor = _useGraphUtils.lightenColor;
1603
+ var _useState = useState([]),
1604
+ hiddenLabels = _useState[0],
1605
+ setHiddenLabels = _useState[1];
1606
+ var styles = useGraphGlobalStyles();
1607
+ var toggleLabel = function toggleLabel(label) {
1608
+ setHiddenLabels(function (prev) {
1609
+ return prev.includes(label) ? prev.filter(function (l) {
1610
+ return l !== label;
1611
+ }) : [].concat(prev, [label]);
1612
+ });
1613
+ };
1614
+ var valueMap = useMemo(function () {
1615
+ var map = new Map();
1616
+ data.forEach(function (series) {
1617
+ series.data.forEach(function (d) {
1618
+ var label = getLabel(d);
1619
+ var value = getValue(d);
1620
+ map.set(label, (map.get(label) || 0) + value);
1621
+ });
1622
+ });
1623
+ return map;
1624
+ }, [data, getLabel, getValue]);
1625
+ var _useMemo = useMemo(function () {
1626
+ var allLabels = Array.from(valueMap.keys());
1627
+ var palette = getFluentPalette(theme);
1628
+ var colors = allLabels.map(function (_, i) {
1629
+ return lightenColor(palette[i % palette.length], 0.3);
1630
+ });
1631
+ var filteredLabels = allLabels.filter(function (label) {
1632
+ return !hiddenLabels.includes(label);
1633
+ });
1634
+ var values = filteredLabels.map(function (label) {
1635
+ return valueMap.get(label) || 0;
1636
+ });
1637
+ var visibleColors = filteredLabels.map(function (label) {
1638
+ var idx = allLabels.indexOf(label);
1639
+ return colors[idx];
1640
+ });
1641
+ return {
1642
+ allLabels: allLabels,
1643
+ colors: colors,
1644
+ filteredLabels: filteredLabels,
1645
+ values: values,
1646
+ visibleColors: visibleColors
1647
+ };
1648
+ }, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]),
1649
+ allLabels = _useMemo.allLabels,
1650
+ colors = _useMemo.colors,
1651
+ filteredLabels = _useMemo.filteredLabels,
1652
+ values = _useMemo.values,
1653
+ visibleColors = _useMemo.visibleColors;
1654
+ var chartData = useMemo(function () {
1655
+ return {
1656
+ labels: filteredLabels,
1657
+ datasets: [{
1658
+ data: values,
1659
+ backgroundColor: visibleColors,
1660
+ borderWidth: 1
1661
+ }]
1662
+ };
1663
+ }, [filteredLabels, values, visibleColors]);
1664
+ var options = useMemo(function () {
1665
+ return {
1666
+ responsive: true,
1667
+ maintainAspectRatio: false,
1668
+ plugins: {
1669
+ title: {
1670
+ display: !!title,
1671
+ text: title,
1672
+ font: {
1673
+ size: 14,
1674
+ family: theme.fontFamilyBase,
1675
+ weight: theme.fontWeightSemibold
1676
+ },
1677
+ color: theme.colorNeutralForeground1,
1678
+ padding: {
1679
+ top: 20,
1680
+ bottom: 20
1681
+ }
1682
+ },
1683
+ datalabels: {
1684
+ display: showDataLabels,
1685
+ color: theme.colorNeutralForeground1,
1686
+ font: {
1687
+ family: theme.fontFamilyBase,
1688
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1689
+ },
1690
+ formatter: function formatter(value) {
1691
+ return value;
1692
+ }
1693
+ },
1694
+ tooltip: createFluentTooltip(theme),
1695
+ legend: {
1696
+ display: false
1697
+ }
1698
+ },
1699
+ scales: {
1700
+ r: {
1701
+ ticks: {
1702
+ color: theme.colorNeutralForeground1,
1703
+ backdropColor: 'transparent',
1704
+ font: {
1705
+ family: theme.fontFamilyBase,
1706
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1707
+ }
1708
+ },
1709
+ grid: {
1710
+ color: theme.colorNeutralStroke2
1711
+ }
1712
+ }
1713
+ }
1714
+ };
1715
+ }, [theme, title, showDataLabels, createFluentTooltip]);
1716
+ return React__default.createElement("div", {
1717
+ className: styles.chartWithLegend
1718
+ }, React__default.createElement("div", {
1719
+ className: styles.chartArea
1720
+ }, React__default.createElement(PolarArea, {
1721
+ data: chartData,
1722
+ options: options
1723
+ })), React__default.createElement("div", {
1724
+ className: styles.legendArea
1725
+ }, React__default.createElement(RenderSliceLegend, {
1726
+ labels: allLabels,
1727
+ colors: colors,
1728
+ visibleLabels: filteredLabels,
1729
+ toggleLabel: toggleLabel
1730
+ })));
1731
+ }
1732
+
1733
+ Chart.register(ChartDataLabels);
1734
+ Chart.register(RadialLinearScale, PointElement, LineElement, Filler, Tooltip$1, Legend, Title);
1735
+ function RadarChart(_ref) {
1736
+ var data = _ref.data,
1737
+ getLabel = _ref.getLabel,
1738
+ getValue = _ref.getValue,
1739
+ title = _ref.title,
1740
+ _ref$showDataLabels = _ref.showDataLabels,
1741
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
1742
+ _ref$theme = _ref.theme,
1743
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
1744
+ var _useState = useState(function () {
1745
+ return data.map(function (s) {
1746
+ return s.label;
1747
+ });
1748
+ }),
1749
+ visibleSeries = _useState[0],
1750
+ setVisibleSeries = _useState[1];
1751
+ var styles = useGraphGlobalStyles();
1752
+ var _useGraphUtils = useGraphUtils(theme),
1753
+ lightenColor = _useGraphUtils.lightenColor,
1754
+ getFluentPalette = _useGraphUtils.getFluentPalette;
1755
+ var seriesColors = useMemo(function () {
1756
+ return data.reduce(function (acc, series, idx) {
1757
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
1758
+ acc[series.label] = lightenColor(base, 0.3);
1759
+ return acc;
1760
+ }, {});
1761
+ }, [data, getFluentPalette, lightenColor, theme]);
1762
+ var toggleSeries = function toggleSeries(label) {
1763
+ setVisibleSeries(function (prev) {
1764
+ return prev.includes(label) ? prev.filter(function (l) {
1765
+ return l !== label;
1766
+ }) : [].concat(prev, [label]);
1767
+ });
1768
+ };
1769
+ var allLabels = useMemo(function () {
1770
+ var set = new Set();
1771
+ data.forEach(function (series) {
1772
+ series.data.forEach(function (d) {
1773
+ return set.add(getLabel(d));
1774
+ });
1775
+ });
1776
+ return Array.from(set);
1777
+ }, [data, getLabel]);
1778
+ var chartData = useMemo(function () {
1779
+ return {
1780
+ labels: allLabels,
1781
+ datasets: data.filter(function (series) {
1782
+ return visibleSeries.includes(series.label);
1783
+ }).map(function (series) {
1784
+ return {
1785
+ label: series.label,
1786
+ data: allLabels.map(function (label) {
1787
+ var match = series.data.find(function (d) {
1788
+ return getLabel(d) === label;
1789
+ });
1790
+ return match ? getValue(match) : 0;
1791
+ }),
1792
+ backgroundColor: seriesColors[series.label] + '33',
1793
+ borderColor: seriesColors[series.label],
1794
+ borderWidth: 2,
1795
+ pointBackgroundColor: seriesColors[series.label]
1796
+ };
1797
+ })
1798
+ };
1799
+ }, [data, visibleSeries, allLabels, getLabel, getValue, seriesColors]);
1800
+ var _useMemo = useMemo(function () {
1801
+ return {
1802
+ fontFamily: theme.fontFamilyBase,
1803
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
1804
+ labelColor: theme.colorNeutralForeground1,
1805
+ gridColor: theme.colorNeutralStroke2
1806
+ };
1807
+ }, [theme]),
1808
+ fontFamily = _useMemo.fontFamily,
1809
+ fontSize = _useMemo.fontSize,
1810
+ labelColor = _useMemo.labelColor,
1811
+ gridColor = _useMemo.gridColor;
1812
+ var options = useMemo(function () {
1813
+ return {
1814
+ responsive: true,
1815
+ maintainAspectRatio: false,
1816
+ plugins: {
1817
+ title: {
1818
+ display: !!title,
1819
+ text: title,
1820
+ font: {
1821
+ size: 14,
1822
+ family: theme.fontFamilyBase,
1823
+ weight: theme.fontWeightSemibold
1824
+ },
1825
+ color: theme.colorNeutralForeground1,
1826
+ padding: {
1827
+ top: 20,
1828
+ bottom: 20
1829
+ }
1830
+ },
1831
+ datalabels: {
1832
+ display: showDataLabels,
1833
+ color: theme.colorNeutralForeground1,
1834
+ font: {
1835
+ family: theme.fontFamilyBase,
1836
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1837
+ }
1838
+ },
1839
+ tooltip: createFluentTooltip(theme),
1840
+ legend: {
1841
+ display: false
1842
+ }
1843
+ },
1844
+ scales: {
1845
+ r: {
1846
+ angleLines: {
1847
+ color: gridColor
1848
+ },
1849
+ grid: {
1850
+ color: gridColor
1851
+ },
1852
+ pointLabels: {
1853
+ color: labelColor,
1854
+ font: {
1855
+ family: fontFamily,
1856
+ size: fontSize
1857
+ }
1858
+ },
1859
+ ticks: {
1860
+ color: labelColor,
1861
+ font: {
1862
+ family: fontFamily,
1863
+ size: fontSize
1864
+ }
1865
+ }
1866
+ }
1867
+ }
1868
+ };
1869
+ }, [theme, title, showDataLabels, createFluentTooltip, gridColor, labelColor, fontFamily, fontSize]);
1870
+ return React__default.createElement("div", {
1871
+ className: styles.chartWithLegend
1872
+ }, React__default.createElement("div", {
1873
+ className: styles.chartArea
1874
+ }, React__default.createElement(Radar, {
1875
+ data: chartData,
1876
+ options: options
1877
+ })), React__default.createElement(RenderLegend, {
1878
+ data: data,
1879
+ visibleSeries: visibleSeries,
1880
+ seriesColors: seriesColors,
1881
+ toggleSeries: toggleSeries
1882
+ }));
1883
+ }
1884
+
1885
+ Chart.register(ChartDataLabels);
1886
+ Chart.register(LinearScale, PointElement, Tooltip$1, Legend);
1887
+ function ScatterChart(_ref) {
1888
+ var data = _ref.data,
1889
+ getX = _ref.getX,
1890
+ getY = _ref.getY,
1891
+ title = _ref.title,
1892
+ _ref$showDataLabels = _ref.showDataLabels,
1893
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
1894
+ _ref$theme = _ref.theme,
1895
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
1896
+ var _useState = useState(function () {
1897
+ return data.map(function (s) {
1898
+ return s.label;
1899
+ });
1900
+ }),
1901
+ visibleSeries = _useState[0],
1902
+ setVisibleSeries = _useState[1];
1903
+ var styles = useGraphGlobalStyles();
1904
+ var _useGraphUtils = useGraphUtils(theme),
1905
+ getFluentPalette = _useGraphUtils.getFluentPalette,
1906
+ lightenColor = _useGraphUtils.lightenColor,
1907
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
1908
+ var seriesColors = useMemo(function () {
1909
+ return data.reduce(function (acc, series, idx) {
1910
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
1911
+ acc[series.label] = lightenColor(base, 0.3);
1912
+ return acc;
1913
+ }, {});
1914
+ }, [data, theme]);
1915
+ var toggleSeries = React__default.useCallback(function (label) {
1916
+ setVisibleSeries(function (prev) {
1917
+ return prev.includes(label) ? prev.filter(function (l) {
1918
+ return l !== label;
1919
+ }) : [].concat(prev, [label]);
1920
+ });
1921
+ }, []);
1922
+ var chartData = useMemo(function () {
1923
+ return {
1924
+ datasets: data.filter(function (series) {
1925
+ return visibleSeries.includes(series.label);
1926
+ }).map(function (series) {
1927
+ return {
1928
+ label: series.label,
1929
+ data: series.data.map(function (d) {
1930
+ return {
1931
+ x: getX(d),
1932
+ y: getY(d)
1933
+ };
1934
+ }),
1935
+ backgroundColor: seriesColors[series.label],
1936
+ borderColor: seriesColors[series.label],
1937
+ pointRadius: 4
1938
+ };
1939
+ })
1940
+ };
1941
+ }, [data, visibleSeries, getX, getY, seriesColors]);
1942
+ var _useMemo = useMemo(function () {
1943
+ return {
1944
+ fontFamily: theme.fontFamilyBase,
1945
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
1946
+ labelColor: theme.colorNeutralForeground1,
1947
+ gridColor: theme.colorNeutralStroke2
1948
+ };
1949
+ }, [theme]),
1950
+ fontFamily = _useMemo.fontFamily,
1951
+ fontSize = _useMemo.fontSize,
1952
+ labelColor = _useMemo.labelColor,
1953
+ gridColor = _useMemo.gridColor;
1954
+ var options = useMemo(function () {
1955
+ return {
1956
+ responsive: true,
1957
+ maintainAspectRatio: false,
1958
+ plugins: {
1959
+ title: {
1960
+ display: !!title,
1961
+ text: title,
1962
+ font: {
1963
+ size: 14,
1964
+ family: theme.fontFamilyBase,
1965
+ weight: theme.fontWeightSemibold
1966
+ },
1967
+ color: theme.colorNeutralForeground1,
1968
+ padding: {
1969
+ top: 20,
1970
+ bottom: 20
1971
+ }
1972
+ },
1973
+ datalabels: {
1974
+ display: showDataLabels,
1975
+ color: theme.colorNeutralForeground1,
1976
+ font: {
1977
+ family: theme.fontFamilyBase,
1978
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1979
+ }
1980
+ },
1981
+ legend: {
1982
+ display: false
1983
+ },
1984
+ tooltip: createFluentTooltip(theme)
1985
+ },
1986
+ scales: {
1987
+ x: {
1988
+ type: 'linear',
1989
+ position: 'bottom',
1990
+ ticks: {
1991
+ color: labelColor,
1992
+ font: {
1993
+ family: fontFamily,
1994
+ size: fontSize
1995
+ }
1996
+ },
1997
+ grid: {
1998
+ color: gridColor
1999
+ }
2000
+ },
2001
+ y: {
2002
+ type: 'linear',
2003
+ ticks: {
2004
+ color: labelColor,
2005
+ font: {
2006
+ family: fontFamily,
2007
+ size: fontSize
2008
+ }
2009
+ },
2010
+ grid: {
2011
+ color: gridColor
2012
+ }
2013
+ }
2014
+ }
2015
+ };
2016
+ }, [theme, title, showDataLabels, createFluentTooltip, labelColor, fontFamily, fontSize, gridColor]);
2017
+ return React__default.createElement("div", {
2018
+ className: styles.chartWithLegend
2019
+ }, React__default.createElement("div", {
2020
+ className: styles.chartArea
2021
+ }, React__default.createElement(Scatter, {
2022
+ data: chartData,
2023
+ options: options
2024
+ })), React__default.createElement(RenderLegend, {
2025
+ data: data,
2026
+ visibleSeries: visibleSeries,
2027
+ seriesColors: seriesColors,
2028
+ toggleSeries: toggleSeries
2029
+ }));
2030
+ }
2031
+
2032
+ Chart.register(ChartDataLabels);
2033
+ Chart.register(CategoryScale, LinearScale, LineElement, PointElement, Tooltip$1, Legend, Title);
2034
+ function StackedLineChart(_ref) {
2035
+ var data = _ref.data,
2036
+ getPrimary = _ref.getPrimary,
2037
+ getSecondary = _ref.getSecondary,
2038
+ title = _ref.title,
2039
+ _ref$showDataLabels = _ref.showDataLabels,
2040
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
2041
+ _ref$theme = _ref.theme,
2042
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
2043
+ var _useState = useState(function () {
2044
+ var _data$;
2045
+ return data.length > 1 ? data.map(function (s) {
2046
+ return s.label;
2047
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
2048
+ }),
2049
+ visibleSeries = _useState[0],
2050
+ setVisibleSeries = _useState[1];
2051
+ var styles = useGraphGlobalStyles();
2052
+ var _useGraphUtils = useGraphUtils(theme),
2053
+ lightenColor = _useGraphUtils.lightenColor,
2054
+ getFluentPalette = _useGraphUtils.getFluentPalette,
2055
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
2056
+ var seriesColors = useMemo(function () {
2057
+ return data.reduce(function (acc, series, idx) {
2058
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
2059
+ var color = lightenColor(base, 0.3);
2060
+ acc[series.label] = color;
2061
+ return acc;
2062
+ }, {});
2063
+ }, [data, theme]);
2064
+ var toggleSeries = function toggleSeries(label) {
2065
+ setVisibleSeries(function (prev) {
2066
+ var isVisible = prev.includes(label);
2067
+ var next = isVisible ? prev.filter(function (l) {
2068
+ return l !== label;
2069
+ }) : [].concat(prev, [label]);
2070
+ return next.length === 0 && data.length > 0 ? [data[0].label] : next;
2071
+ });
2072
+ };
2073
+ var allCategories = useMemo(function () {
2074
+ var set = new Set();
2075
+ data.forEach(function (series) {
2076
+ series.data.forEach(function (d) {
2077
+ return set.add(getPrimary(d));
2078
+ });
2079
+ });
2080
+ return Array.from(set);
2081
+ }, [data, getPrimary]);
2082
+ var chartData = useMemo(function () {
2083
+ return {
2084
+ labels: allCategories,
2085
+ datasets: data.filter(function (series) {
2086
+ return visibleSeries.includes(series.label);
2087
+ }).map(function (series) {
2088
+ return {
2089
+ label: series.label,
2090
+ data: allCategories.map(function (cat) {
2091
+ var match = series.data.find(function (d) {
2092
+ return getPrimary(d) === cat;
2093
+ });
2094
+ return match ? getSecondary(match) : 0;
2095
+ }),
2096
+ borderColor: seriesColors[series.label],
2097
+ backgroundColor: seriesColors[series.label],
2098
+ fill: true,
2099
+ tension: 0.4,
2100
+ pointRadius: 3
2101
+ };
2102
+ })
2103
+ };
2104
+ }, [data, visibleSeries, allCategories, getPrimary, getSecondary, seriesColors]);
2105
+ var _useMemo = useMemo(function () {
2106
+ return {
2107
+ fontFamily: theme.fontFamilyBase,
2108
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
2109
+ labelColor: theme.colorNeutralForeground1,
2110
+ gridColor: theme.colorNeutralStroke2
2111
+ };
2112
+ }, [theme]),
2113
+ fontFamily = _useMemo.fontFamily,
2114
+ fontSize = _useMemo.fontSize,
2115
+ labelColor = _useMemo.labelColor,
2116
+ gridColor = _useMemo.gridColor;
2117
+ var options = useMemo(function () {
2118
+ return {
2119
+ responsive: true,
2120
+ maintainAspectRatio: false,
2121
+ plugins: {
2122
+ title: {
2123
+ display: !!title,
2124
+ text: title,
2125
+ font: {
2126
+ size: 14,
2127
+ family: theme.fontFamilyBase,
2128
+ weight: theme.fontWeightSemibold
2129
+ },
2130
+ color: theme.colorNeutralForeground1,
2131
+ padding: {
2132
+ top: 20,
2133
+ bottom: 20
2134
+ }
2135
+ },
2136
+ datalabels: {
2137
+ display: showDataLabels,
2138
+ color: theme.colorNeutralForeground1,
2139
+ font: {
2140
+ family: theme.fontFamilyBase,
2141
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
2142
+ }
2143
+ },
2144
+ legend: {
2145
+ display: false
2146
+ },
2147
+ tooltip: createFluentTooltip(theme)
2148
+ },
2149
+ scales: {
2150
+ x: {
2151
+ stacked: true,
2152
+ ticks: {
2153
+ color: labelColor,
2154
+ font: {
2155
+ family: fontFamily,
2156
+ size: fontSize
2157
+ }
2158
+ },
2159
+ grid: {
2160
+ color: gridColor
2161
+ }
2162
+ },
2163
+ y: {
2164
+ stacked: true,
2165
+ ticks: {
2166
+ color: labelColor,
2167
+ font: {
2168
+ family: fontFamily,
2169
+ size: fontSize
2170
+ }
2171
+ },
2172
+ grid: {
2173
+ color: gridColor
2174
+ }
2175
+ }
2176
+ }
2177
+ };
2178
+ }, [theme, title, showDataLabels, createFluentTooltip, labelColor, fontFamily, fontSize, gridColor]);
2179
+ return React__default.createElement("div", {
2180
+ className: styles.chartWithLegend
2181
+ }, React__default.createElement("div", {
2182
+ className: styles.chartArea
2183
+ }, React__default.createElement(Line, {
2184
+ data: chartData,
2185
+ options: options
2186
+ })), React__default.createElement(RenderLegend, {
2187
+ data: data,
2188
+ visibleSeries: visibleSeries,
2189
+ seriesColors: seriesColors,
2190
+ toggleSeries: toggleSeries
2191
+ }));
2192
+ }
2193
+
2194
+ Chart.register(ChartDataLabels);
2195
+ Chart.register(LineElement, PointElement, Filler, CategoryScale, LinearScale, Tooltip$1, Legend, Title);
2196
+ function SteamChart(_ref) {
2197
+ var data = _ref.data,
2198
+ getPrimary = _ref.getPrimary,
2199
+ getSecondary = _ref.getSecondary,
2200
+ title = _ref.title,
2201
+ _ref$showDataLabels = _ref.showDataLabels,
2202
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
2203
+ _ref$theme = _ref.theme,
2204
+ theme = _ref$theme === void 0 ? webLightTheme : _ref$theme;
2205
+ var _useState = useState(function () {
2206
+ var _data$;
2207
+ return data.length > 1 ? data.map(function (s) {
2208
+ return s.label;
2209
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
2210
+ }),
2211
+ visibleSeries = _useState[0],
2212
+ setVisibleSeries = _useState[1];
2213
+ var _useState2 = useState(false),
2214
+ showPercent = _useState2[0],
2215
+ setShowPercent = _useState2[1];
2216
+ var styles = useGraphGlobalStyles();
2217
+ var _useGraphUtils = useGraphUtils(theme),
2218
+ lightenColor = _useGraphUtils.lightenColor,
2219
+ getFluentPalette = _useGraphUtils.getFluentPalette;
2220
+ var seriesColors = useMemo(function () {
2221
+ return data.reduce(function (acc, series, idx) {
2222
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
2223
+ acc[series.label] = lightenColor(base, 0.3);
2224
+ return acc;
2225
+ }, {});
2226
+ }, [data, getFluentPalette, lightenColor, theme]);
2227
+ var toggleSeries = React__default.useCallback(function (label) {
2228
+ setVisibleSeries(function (prev) {
2229
+ var isVisible = prev.includes(label);
2230
+ var next = isVisible ? prev.filter(function (l) {
2231
+ return l !== label;
2232
+ }) : [].concat(prev, [label]);
2233
+ return next.length === 0 ? [data[0].label] : next;
2234
+ });
2235
+ }, [data]);
2236
+ var allLabels = useMemo(function () {
2237
+ var set = new Set();
2238
+ data.forEach(function (series) {
2239
+ series.data.forEach(function (d) {
2240
+ return set.add(getPrimary(d));
2241
+ });
2242
+ });
2243
+ return Array.from(set);
2244
+ }, [data, getPrimary]);
2245
+ var totalPerPoint = useMemo(function () {
2246
+ return allLabels.map(function (cat) {
2247
+ return data.reduce(function (sum, series) {
2248
+ var match = series.data.find(function (d) {
2249
+ return getPrimary(d) === cat;
2250
+ });
2251
+ return sum + (match ? getSecondary(match) : 0);
2252
+ }, 0);
2253
+ });
2254
+ }, [allLabels, data, getPrimary, getSecondary]);
2255
+ var chartData = useMemo(function () {
2256
+ return {
2257
+ labels: allLabels,
2258
+ datasets: data.filter(function (series) {
2259
+ return visibleSeries.includes(series.label);
2260
+ }).map(function (series) {
2261
+ return {
2262
+ label: series.label,
2263
+ fill: true,
2264
+ backgroundColor: seriesColors[series.label],
2265
+ borderColor: 'transparent',
2266
+ borderWidth: 0,
2267
+ data: allLabels.map(function (cat, index) {
2268
+ var match = series.data.find(function (d) {
2269
+ return getPrimary(d) === cat;
2270
+ });
2271
+ var rawValue = match ? getSecondary(match) : 0;
2272
+ var total = totalPerPoint[index] || 1;
2273
+ return showPercent ? Math.round((rawValue / total * 100 + Number.EPSILON) * 100) / 100 : Math.round((rawValue + Number.EPSILON) * 100) / 100;
2274
+ }),
2275
+ tension: 0.5
2276
+ };
2277
+ })
2278
+ };
2279
+ }, [data, visibleSeries, allLabels, getPrimary, getSecondary, seriesColors, totalPerPoint, showPercent]);
2280
+ var _useMemo = useMemo(function () {
2281
+ return {
2282
+ fontFamily: theme.fontFamilyBase,
2283
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
2284
+ labelColor: theme.colorNeutralForeground1,
2285
+ gridColor: theme.colorNeutralStroke2
2286
+ };
2287
+ }, [theme]),
2288
+ fontFamily = _useMemo.fontFamily,
2289
+ fontSize = _useMemo.fontSize,
2290
+ labelColor = _useMemo.labelColor,
2291
+ gridColor = _useMemo.gridColor;
2292
+ var options = useMemo(function () {
2293
+ return {
2294
+ responsive: true,
2295
+ maintainAspectRatio: false,
2296
+ animation: {
2297
+ duration: 800,
2298
+ easing: 'easeOutQuart'
2299
+ },
2300
+ plugins: {
2301
+ title: {
2302
+ display: !!title,
2303
+ text: title,
2304
+ font: {
2305
+ size: 14,
2306
+ family: theme.fontFamilyBase,
2307
+ weight: theme.fontWeightSemibold
2308
+ },
2309
+ color: theme.colorNeutralForeground1,
2310
+ padding: {
2311
+ top: 20,
2312
+ bottom: 20
2313
+ }
2314
+ },
2315
+ datalabels: {
2316
+ display: showDataLabels,
2317
+ color: theme.colorNeutralForeground1,
2318
+ font: {
2319
+ family: theme.fontFamilyBase,
2320
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
2321
+ }
2322
+ },
2323
+ legend: {
2324
+ display: false
2325
+ },
2326
+ tooltip: createFluentTooltip(theme)
2327
+ },
2328
+ interaction: {
2329
+ mode: 'index',
2330
+ intersect: false
2331
+ },
2332
+ scales: {
2333
+ x: {
2334
+ stacked: true,
2335
+ ticks: {
2336
+ color: labelColor,
2337
+ font: {
2338
+ family: fontFamily,
2339
+ size: fontSize
2340
+ }
2341
+ },
2342
+ grid: {
2343
+ color: gridColor
2344
+ }
2345
+ },
2346
+ y: {
2347
+ stacked: true,
2348
+ ticks: {
2349
+ callback: function callback(value) {
2350
+ return showPercent ? value + "%" : value;
2351
+ },
2352
+ color: labelColor,
2353
+ font: {
2354
+ family: fontFamily,
2355
+ size: fontSize
2356
+ }
2357
+ },
2358
+ grid: {
2359
+ color: gridColor
2360
+ },
2361
+ min: 0,
2362
+ max: showPercent ? 100 : undefined
2363
+ }
2364
+ }
2365
+ };
2366
+ }, [theme, title, showDataLabels, createFluentTooltip, labelColor, fontFamily, fontSize, gridColor, showPercent]);
2367
+ return React__default.createElement("div", {
2368
+ className: styles.chartWithLegend
2369
+ }, React__default.createElement("div", {
2370
+ className: styles.chartArea
2371
+ }, React__default.createElement(Line, {
2372
+ data: chartData,
2373
+ options: options
2374
+ })), React__default.createElement(Stack, {
2375
+ justifyContent: "center",
2376
+ alignItems: "center",
2377
+ margin: "7px"
2378
+ }, React__default.createElement(ToggleButton, {
2379
+ onClick: function onClick() {
2380
+ return setShowPercent(function (p) {
2381
+ return !p;
2382
+ });
2383
+ },
2384
+ shape: "circular",
2385
+ appearance: "secondary",
2386
+ size: "small",
2387
+ style: {
2388
+ width: '150px'
2389
+ }
2390
+ }, showPercent ? 'Show Raw Values' : 'Show %')), React__default.createElement("div", {
2391
+ className: styles.legendArea
2392
+ }, React__default.createElement(RenderLegend, {
2393
+ data: data,
2394
+ visibleSeries: visibleSeries,
2395
+ seriesColors: seriesColors,
2396
+ toggleSeries: toggleSeries
2397
+ })));
2398
+ }
2399
+
2400
+ /**
2401
+ * Lightens a given hex color by a percentage amount (0 to 1).
2402
+ */
2403
+ var lightenColor = function lightenColor(hex, amount) {
2404
+ if (!/^#?[0-9A-Fa-f]{6}$/.test(hex)) return hex;
2405
+ if (hex.startsWith('#')) hex = hex.slice(1);
2406
+ var r = parseInt(hex.slice(0, 2), 16);
2407
+ var g = parseInt(hex.slice(2, 4), 16);
2408
+ var b = parseInt(hex.slice(4, 6), 16);
2409
+ r = Math.min(255, Math.floor(r + (255 - r) * amount));
2410
+ g = Math.min(255, Math.floor(g + (255 - g) * amount));
2411
+ b = Math.min(255, Math.floor(b + (255 - b) * amount));
2412
+ var toHex = function toHex(v) {
2413
+ return v.toString(16).padStart(2, '0');
2414
+ };
2415
+ return "#" + toHex(r) + toHex(g) + toHex(b);
2416
+ };
2417
+ var getFluentPalette = function getFluentPalette(_theme) {
2418
+ return ['#4e79a7', '#f28e2c', '#e15759', '#76b7b2', '#59a14f', '#edc949', '#af7aa1', '#ff9da7', '#9c755f', '#bab0ab', '#8cd17d', '#b6992d', '#d37295', '#fabfd2', '#79706e'];
2419
+ };
2420
+ var chartProps = function chartProps(chart) {
2421
+ return {
2422
+ data: chart.data,
2423
+ title: chart.title,
2424
+ getPrimary: function getPrimary(d) {
2425
+ return d.name;
2426
+ },
2427
+ getSecondary: function getSecondary(d) {
2428
+ return d.value;
2429
+ }
2430
+ };
2431
+ };
2432
+ var getChartComponent = function getChartComponent(chart, theme) {
2433
+ var type = chart.type;
2434
+ var fuiTheme = theme != null ? theme : webLightTheme;
2435
+ switch (type) {
2436
+ case 'bar':
2437
+ return React__default.createElement(BarChart, Object.assign({}, chartProps(chart), {
2438
+ stacked: false,
2439
+ theme: fuiTheme
2440
+ }));
2441
+ case 'line':
2442
+ return React__default.createElement(LineChart, Object.assign({}, chartProps(chart), {
2443
+ theme: fuiTheme
2444
+ }));
2445
+ case 'area':
2446
+ return React__default.createElement(AreaChart, Object.assign({}, chartProps(chart), {
2447
+ stacked: false,
2448
+ theme: fuiTheme
2449
+ }));
2450
+ case 'bar-horizontal':
2451
+ return React__default.createElement(BarHorizontalChart, Object.assign({}, chartProps(chart), {
2452
+ stacked: true,
2453
+ theme: fuiTheme
2454
+ }));
2455
+ case 'bubble':
2456
+ return React__default.createElement(BubbleChart, Object.assign({}, chartProps(chart), {
2457
+ getRadius: function getRadius(d) {
2458
+ var _d$radius;
2459
+ return (_d$radius = d.radius) != null ? _d$radius : 1;
2460
+ },
2461
+ theme: fuiTheme
2462
+ }));
2463
+ case 'multiple-axes':
2464
+ return React__default.createElement(ComboChart, Object.assign({}, chartProps(chart), {
2465
+ theme: fuiTheme,
2466
+ data: chart.data.map(function (series) {
2467
+ var _series$type;
2468
+ return {
2469
+ label: series.label,
2470
+ type: (_series$type = series.type) != null ? _series$type : 'bar',
2471
+ data: series.data,
2472
+ yAxisID: series.secondaryAxisId
2473
+ };
2474
+ })
2475
+ }));
2476
+ case 'steam':
2477
+ return React__default.createElement(SteamChart, Object.assign({}, chartProps(chart), {
2478
+ theme: fuiTheme
2479
+ }));
2480
+ case 'floating-bar':
2481
+ return React__default.createElement(FloatingBarChart, Object.assign({
2482
+ getRange: function getRange(d) {
2483
+ var _d$min, _d$max;
2484
+ return [(_d$min = d.min) != null ? _d$min : 0, (_d$max = d.max) != null ? _d$max : 0];
2485
+ }
2486
+ }, chartProps(chart), {
2487
+ theme: fuiTheme
2488
+ }));
2489
+ case 'stacked-line':
2490
+ return React__default.createElement(StackedLineChart, Object.assign({}, chartProps(chart), {
2491
+ theme: fuiTheme
2492
+ }));
2493
+ case 'doughnut':
2494
+ return React__default.createElement(DoughnutChart, Object.assign({
2495
+ getLabel: function getLabel(datum) {
2496
+ return datum.name;
2497
+ },
2498
+ getValue: function getValue(datum) {
2499
+ var _datum$value;
2500
+ return (_datum$value = datum.value) != null ? _datum$value : 0;
2501
+ }
2502
+ }, chartProps(chart), {
2503
+ theme: fuiTheme
2504
+ }));
2505
+ case 'pie':
2506
+ return React__default.createElement(PieChart, Object.assign({
2507
+ getLabel: function getLabel(datum) {
2508
+ return datum.name;
2509
+ },
2510
+ getValue: function getValue(datum) {
2511
+ var _datum$value2;
2512
+ return (_datum$value2 = datum.value) != null ? _datum$value2 : 0;
2513
+ },
2514
+ showDataLabels: true
2515
+ }, chartProps(chart), {
2516
+ theme: fuiTheme
2517
+ }));
2518
+ case 'scatter':
2519
+ return React__default.createElement(ScatterChart, Object.assign({
2520
+ getX: function getX(d) {
2521
+ if (typeof d.x === 'number') return d.x;
2522
+ if (typeof d.x === 'string') return Number(d.x) || 0;
2523
+ if (d.x instanceof Date) return d.x.getTime();
2524
+ return 0;
2525
+ },
2526
+ getY: function getY(d) {
2527
+ return typeof d.y === 'number' ? d.y : 0;
2528
+ }
2529
+ }, chartProps(chart), {
2530
+ theme: fuiTheme,
2531
+ showDataLabels: false
2532
+ }));
2533
+ case 'polar':
2534
+ return React__default.createElement(PolarChart, {
2535
+ data: chart.data,
2536
+ getLabel: function getLabel(d) {
2537
+ return d.name;
2538
+ },
2539
+ getValue: function getValue(d) {
2540
+ var _d$value;
2541
+ return (_d$value = d.value) != null ? _d$value : 0;
2542
+ },
2543
+ title: chart.title,
2544
+ showDataLabels: true,
2545
+ theme: fuiTheme
2546
+ });
2547
+ case 'radar':
2548
+ return React__default.createElement(RadarChart, {
2549
+ data: chart.data,
2550
+ getLabel: function getLabel(d) {
2551
+ return d.name;
2552
+ },
2553
+ getValue: function getValue(d) {
2554
+ var _d$value2;
2555
+ return (_d$value2 = d.value) != null ? _d$value2 : 0;
2556
+ },
2557
+ title: chart.title,
2558
+ theme: fuiTheme
2559
+ });
2560
+ default:
2561
+ throw new Error("Unsupported chart type: " + type);
2562
+ }
2563
+ };
2564
+ /**
2565
+ * Smart Fluent tooltip generator with chart-type awareness.
2566
+ */
2567
+ function createFluentTooltip(theme) {
2568
+ var fontFamily = theme.fontFamilyBase;
2569
+ var fontSize = parseInt(theme.fontSizeBase200.replace('px', '')) || 14;
2570
+ var tooltipBg = theme.colorNeutralBackground1;
2571
+ var tooltipTitleColor = theme.colorNeutralForeground1;
2572
+ var tooltipBodyColor = theme.colorNeutralForeground2;
2573
+ var borderColor = theme.colorNeutralStroke2;
2574
+ var callbacks = {
2575
+ title: function title(context) {
2576
+ var _context$0$label, _context$;
2577
+ return (_context$0$label = (_context$ = context[0]) == null ? void 0 : _context$.label) != null ? _context$0$label : '';
2578
+ },
2579
+ label: function label(item) {
2580
+ var datasetLabel = 'label' in item.dataset && typeof item.dataset.label === 'string' ? item.dataset.label : 'Value';
2581
+ var raw = item.raw;
2582
+ // Bubble format { x, y, r }
2583
+ if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw && 'r' in raw) {
2584
+ var x = raw.x,
2585
+ y = raw.y,
2586
+ r = raw.r;
2587
+ return datasetLabel + " \u2014 x: " + x + ", y: " + y + ", r: " + r;
2588
+ }
2589
+ // Scatter format { x, y }
2590
+ if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw) {
2591
+ var _x = raw.x,
2592
+ _y = raw.y;
2593
+ return datasetLabel + " \u2014 x: " + _x + ", y: " + _y;
2594
+ }
2595
+ // Floating bar [min, max]
2596
+ if (Array.isArray(raw) && raw.length === 2) {
2597
+ var min = raw[0],
2598
+ max = raw[1];
2599
+ return datasetLabel + ": " + min + " \u2013 " + max;
2600
+ }
2601
+ // Default: single number or string
2602
+ return datasetLabel + ": " + raw;
2603
+ },
2604
+ beforeTitle: function beforeTitle() {
2605
+ return '';
2606
+ },
2607
+ afterTitle: function afterTitle() {
2608
+ return '';
2609
+ },
2610
+ beforeBody: function beforeBody() {
2611
+ return '';
2612
+ },
2613
+ afterBody: function afterBody() {
2614
+ return '';
2615
+ },
2616
+ beforeLabel: function beforeLabel() {
2617
+ return '';
2618
+ },
2619
+ afterLabel: function afterLabel() {
2620
+ return '';
2621
+ },
2622
+ labelColor: function labelColor() {
2623
+ return undefined;
2624
+ },
2625
+ labelTextColor: function labelTextColor() {
2626
+ return '';
2627
+ },
2628
+ footer: function footer() {
2629
+ return '';
2630
+ },
2631
+ beforeFooter: function beforeFooter() {
2632
+ return '';
2633
+ },
2634
+ afterFooter: function afterFooter() {
2635
+ return '';
2636
+ },
2637
+ labelPointStyle: function labelPointStyle() {
2638
+ return {
2639
+ pointStyle: 'circle',
2640
+ rotation: 0,
2641
+ radius: 5
2642
+ };
2643
+ }
2644
+ };
2645
+ return {
2646
+ enabled: true,
2647
+ displayColors: true,
2648
+ boxWidth: 10,
2649
+ boxHeight: 10,
2650
+ boxPadding: 5,
2651
+ backgroundColor: tooltipBg,
2652
+ borderColor: borderColor,
2653
+ borderWidth: 1,
2654
+ cornerRadius: 4,
2655
+ padding: 10,
2656
+ titleColor: tooltipTitleColor,
2657
+ bodyColor: tooltipBodyColor,
2658
+ titleFont: {
2659
+ family: fontFamily,
2660
+ size: fontSize
2661
+ },
2662
+ bodyFont: {
2663
+ family: fontFamily,
2664
+ size: fontSize
2665
+ },
2666
+ callbacks: callbacks
2667
+ };
2668
+ }
2669
+ /**
2670
+ * Returns a Chart.js ticks callback to truncate long labels and add optional prefix/suffix.
2671
+ */
2672
+ var createAxisLabelFormatter = function createAxisLabelFormatter(_ref) {
2673
+ var _ref$maxLength = _ref.maxLength,
2674
+ maxLength = _ref$maxLength === void 0 ? 12 : _ref$maxLength,
2675
+ _ref$suffix = _ref.suffix,
2676
+ suffix = _ref$suffix === void 0 ? '' : _ref$suffix,
2677
+ _ref$prefix = _ref.prefix,
2678
+ prefix = _ref$prefix === void 0 ? '' : _ref$prefix;
2679
+ return function (value) {
2680
+ var label = typeof value === 'number' ? this.getLabelForValue(value) : String(value);
2681
+ var trimmed = label.length > maxLength ? label.slice(0, maxLength) + '…' : label;
2682
+ return "" + prefix + trimmed + suffix;
2683
+ };
2684
+ };
2685
+ function debounce(fn, delay) {
2686
+ var timer = null;
2687
+ return function () {
2688
+ var _this = this;
2689
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2690
+ args[_key] = arguments[_key];
2691
+ }
2692
+ if (timer) clearTimeout(timer);
2693
+ timer = setTimeout(function () {
2694
+ return fn.apply(_this, args);
2695
+ }, delay);
2696
+ };
2697
+ }
2698
+ /**
2699
+ * useGraphUtils — shared theming and chart helpers.
2700
+ */
2701
+ function useGraphUtils(theme) {
2702
+ return useMemo(function () {
2703
+ return {
2704
+ lightenColor: lightenColor,
2705
+ getFluentPalette: getFluentPalette,
2706
+ getChartComponent: getChartComponent,
2707
+ createFluentTooltip: createFluentTooltip,
2708
+ createAxisLabelFormatter: createAxisLabelFormatter,
2709
+ debounce: debounce
2710
+ };
2711
+ }, [theme]);
2712
+ }
2713
+
2714
+ Chart.register(CategoryScale, LinearScale, BarElement, Tooltip$1, Legend, ChartDataLabels, Title);
2715
+ function BarChart(_ref) {
2716
+ var data = _ref.data,
2717
+ getPrimary = _ref.getPrimary,
2718
+ getSecondary = _ref.getSecondary,
2719
+ title = _ref.title,
2720
+ _ref$showDatalabels = _ref.showDatalabels,
2721
+ showDatalabels = _ref$showDatalabels === void 0 ? false : _ref$showDatalabels,
2722
+ _ref$stacked = _ref.stacked,
2723
+ stacked = _ref$stacked === void 0 ? false : _ref$stacked,
2724
+ theme = _ref.theme;
2725
+ var _useState = useState(function () {
2726
+ var _data$;
2727
+ return data.length > 1 ? data.map(function (s) {
2728
+ return s.label;
2729
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
2730
+ }),
2731
+ visibleSeries = _useState[0],
2732
+ setVisibleSeries = _useState[1];
2733
+ var _useGraphUtils = useGraphUtils(theme),
2734
+ lightenColor = _useGraphUtils.lightenColor,
2735
+ getFluentPalette = _useGraphUtils.getFluentPalette,
2736
+ createFluentTooltip = _useGraphUtils.createFluentTooltip;
2737
+ var styles = useGraphGlobalStyles();
2738
+ var seriesColors = useMemo(function () {
2739
+ return data.reduce(function (acc, series, idx) {
2740
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
2741
+ var color = lightenColor(base, 0.3);
2742
+ acc[series.label] = color;
2743
+ return acc;
2744
+ }, {});
2745
+ }, [data]);
2746
+ var toggleSeries = function toggleSeries(label) {
2747
+ setVisibleSeries(function (prev) {
2748
+ var isVisible = prev.includes(label);
2749
+ var next = isVisible ? prev.filter(function (l) {
2750
+ return l !== label;
2751
+ }) : [].concat(prev, [label]);
2752
+ return next.length === 0 && data.length > 0 ? [data[0].label] : next;
2753
+ });
2754
+ };
2755
+ // Extract all unique x-axis categories (from all series)
2756
+ var allCategories = useMemo(function () {
2757
+ var categorySet = new Set();
2758
+ data.forEach(function (series) {
2759
+ series.data.forEach(function (datum) {
2760
+ categorySet.add(getPrimary(datum));
2761
+ });
2762
+ });
2763
+ return Array.from(categorySet);
2764
+ }, [data, getPrimary]);
2765
+ // Construct Chart.js datasets
2766
+ var chartData = useMemo(function () {
2767
+ return {
2768
+ labels: allCategories,
2769
+ datasets: data.filter(function (series) {
2770
+ return visibleSeries.includes(series.label);
2771
+ }).map(function (series) {
2772
+ return {
2773
+ label: series.label,
2774
+ backgroundColor: seriesColors[series.label],
2775
+ data: allCategories.map(function (cat) {
2776
+ var found = series.data.find(function (d) {
2777
+ return getPrimary(d) === cat;
2778
+ });
2779
+ return found ? getSecondary(found) : 0;
2780
+ }),
2781
+ // Assign y-axis based on series type when stacked
2782
+ yAxisID: stacked ? series.type === 'line' ? 'y1' : 'y' : 'y'
2783
+ };
2784
+ })
2785
+ };
2786
+ }, [data, visibleSeries, allCategories, seriesColors, stacked]);
2787
+ var _useMemo = useMemo(function () {
2788
+ return {
2789
+ fontFamily: theme.fontFamilyBase,
2790
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
2791
+ labelColor: theme.colorNeutralForeground1,
2792
+ gridColor: theme.colorNeutralStroke2
2793
+ };
2794
+ }, [theme]),
2795
+ fontFamily = _useMemo.fontFamily,
2796
+ fontSize = _useMemo.fontSize,
2797
+ labelColor = _useMemo.labelColor,
2798
+ gridColor = _useMemo.gridColor;
2799
+ var options = useMemo(function () {
2800
+ return {
2801
+ responsive: true,
2802
+ maintainAspectRatio: false,
2803
+ plugins: {
2804
+ title: {
2805
+ display: !!title,
2806
+ text: title,
2807
+ font: {
2808
+ size: 14,
2809
+ family: theme.fontFamilyBase,
2810
+ weight: theme.fontWeightSemibold
2811
+ },
2812
+ color: theme.colorNeutralForeground1,
2813
+ padding: {
2814
+ top: 20,
2815
+ bottom: 20
2816
+ }
2817
+ },
2818
+ datalabels: {
2819
+ display: showDatalabels,
2820
+ color: theme.colorNeutralForeground1,
2821
+ font: {
2822
+ family: theme.fontFamilyBase,
2823
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
2824
+ }
2825
+ },
2826
+ legend: {
2827
+ display: false
2828
+ },
2829
+ tooltip: createFluentTooltip(theme)
2830
+ },
2831
+ scales: _extends({
2832
+ x: {
2833
+ stacked: stacked,
2834
+ ticks: {
2835
+ callback: createAxisLabelFormatter({
2836
+ maxLength: 10
2837
+ }),
2838
+ color: labelColor,
2839
+ font: {
2840
+ family: fontFamily,
2841
+ size: fontSize
2842
+ }
2843
+ },
2844
+ grid: {
2845
+ color: gridColor
2846
+ }
2847
+ },
2848
+ y: {
2849
+ type: 'linear',
2850
+ position: 'left',
2851
+ stacked: stacked,
2852
+ ticks: {
2853
+ callback: createAxisLabelFormatter({
2854
+ maxLength: 10
2855
+ }),
2856
+ color: labelColor,
2857
+ font: {
2858
+ family: fontFamily,
2859
+ size: fontSize
2860
+ }
2861
+ },
2862
+ grid: {
2863
+ color: gridColor
2864
+ }
2865
+ }
2866
+ }, stacked && {
2867
+ y1: {
2868
+ type: 'linear',
2869
+ position: 'right',
2870
+ ticks: {
2871
+ callback: createAxisLabelFormatter({
2872
+ maxLength: 10
2873
+ }),
2874
+ color: labelColor,
2875
+ font: {
2876
+ family: fontFamily,
2877
+ size: fontSize
2878
+ }
2879
+ },
2880
+ grid: {
2881
+ drawOnChartArea: false
2882
+ }
2883
+ }
2884
+ })
2885
+ };
2886
+ }, [title, showDatalabels, theme, fontFamily, fontSize, labelColor, gridColor, stacked, createFluentTooltip]);
2887
+ return React__default.createElement("div", {
2888
+ className: styles.chartWithLegend
2889
+ }, React__default.createElement("div", {
2890
+ className: styles.chartArea
2891
+ }, React__default.createElement(Bar, {
2892
+ data: chartData,
2893
+ options: options
2894
+ })), React__default.createElement("div", {
2895
+ className: styles.legendArea
2896
+ }, React__default.createElement(RenderLegend, {
2897
+ data: data,
2898
+ visibleSeries: visibleSeries,
2899
+ seriesColors: seriesColors,
2900
+ toggleSeries: toggleSeries
2901
+ })));
2902
+ }
2903
+
2904
+ export { createAxisLabelFormatter, createFluentTooltip, getFluentPalette, lightenColor, useGraphUtils };
2905
+ //# sourceMappingURL=fluentui-react-charts.esm.js.map