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