@spteck/fluentui-react-charts 1.0.6 → 1.0.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 (105) hide show
  1. package/dist/charts/BarChart/BarChart.d.ts +2 -1
  2. package/dist/charts/ComboChart/ComboChart.d.ts +2 -1
  3. package/dist/charts/Doughnut/DoughnutChart.d.ts +2 -1
  4. package/dist/charts/PieChart/PieChart.d.ts +2 -1
  5. package/dist/charts/areaChart/AreaChart.d.ts +2 -1
  6. package/dist/charts/barHorizontalChart/BarHotizontalChart.d.ts +2 -1
  7. package/dist/charts/bubbleChart/BubbleChart.d.ts +2 -1
  8. package/dist/charts/floatBarChart/FloatBarChart.d.ts +2 -1
  9. package/dist/charts/index.d.ts +14 -0
  10. package/dist/charts/lineChart/LineChart.d.ts +2 -1
  11. package/dist/charts/polarChart/PolarChart.d.ts +2 -1
  12. package/dist/charts/radarChart/RadarChart.d.ts +2 -1
  13. package/dist/charts/scatterChart/ScatterChart.d.ts +2 -1
  14. package/dist/charts/stackedLineChart/StackedLineChart.d.ts +2 -1
  15. package/dist/charts/steamChart/SteamChart.d.ts +2 -1
  16. package/dist/components/index.d.ts +0 -14
  17. package/dist/fluentui-react-charts.cjs.development.js +1367 -1066
  18. package/dist/fluentui-react-charts.cjs.development.js.map +1 -1
  19. package/dist/fluentui-react-charts.cjs.production.min.js +1 -1
  20. package/dist/fluentui-react-charts.cjs.production.min.js.map +1 -1
  21. package/dist/fluentui-react-charts.esm.js +1353 -1066
  22. package/dist/fluentui-react-charts.esm.js.map +1 -1
  23. package/dist/index.d.ts +1 -0
  24. package/package.json +4 -4
  25. package/src/assets/sample1.png +0 -0
  26. package/src/assets/sample2.png +0 -0
  27. package/src/assets/sample3.png +0 -0
  28. package/src/charts/BarChart/BarChart.tsx +0 -227
  29. package/src/charts/BarChart/README.MD +0 -335
  30. package/src/charts/BarChart/index.ts +0 -1
  31. package/src/charts/ComboChart/ComboChart.tsx +0 -209
  32. package/src/charts/ComboChart/README.MD +0 -347
  33. package/src/charts/ComboChart/index.ts +0 -1
  34. package/src/charts/Doughnut/DoughnutChart.tsx +0 -152
  35. package/src/charts/Doughnut/README.MD +0 -296
  36. package/src/charts/Doughnut/index.ts +0 -1
  37. package/src/charts/PieChart/PieChart.tsx +0 -148
  38. package/src/charts/PieChart/README.MD +0 -315
  39. package/src/charts/PieChart/index.ts +0 -1
  40. package/src/charts/areaChart/AreaChart.tsx +0 -195
  41. package/src/charts/areaChart/README.MD +0 -236
  42. package/src/charts/areaChart/index.ts +0 -1
  43. package/src/charts/barHorizontalChart/BarHotizontalChart.tsx +0 -200
  44. package/src/charts/barHorizontalChart/README.MD +0 -278
  45. package/src/charts/barHorizontalChart/index.ts +0 -2
  46. package/src/charts/bubbleChart/BubbleChart.tsx +0 -184
  47. package/src/charts/bubbleChart/README.MD +0 -275
  48. package/src/charts/bubbleChart/index.ts +0 -1
  49. package/src/charts/floatBarChart/FloatBarChart.tsx +0 -178
  50. package/src/charts/floatBarChart/README.MD +0 -354
  51. package/src/charts/floatBarChart/index.ts +0 -1
  52. package/src/charts/lineChart/LineChart.tsx +0 -200
  53. package/src/charts/lineChart/README.MD +0 -354
  54. package/src/charts/lineChart/index.ts +0 -1
  55. package/src/charts/polarChart/PolarChart.tsx +0 -161
  56. package/src/charts/polarChart/README.MD +0 -336
  57. package/src/charts/polarChart/index.ts +0 -1
  58. package/src/charts/radarChart/README.MD +0 -388
  59. package/src/charts/radarChart/RadarChart.tsx +0 -173
  60. package/src/charts/radarChart/index.ts +0 -1
  61. package/src/charts/scatterChart/README.MD +0 -335
  62. package/src/charts/scatterChart/ScatterChart.tsx +0 -155
  63. package/src/charts/scatterChart/index.ts +0 -1
  64. package/src/charts/stackedLineChart/README.MD +0 -396
  65. package/src/charts/stackedLineChart/StackedLineChart.tsx +0 -188
  66. package/src/charts/stackedLineChart/index.ts +0 -1
  67. package/src/charts/steamChart/README.MD +0 -414
  68. package/src/charts/steamChart/SteamChart.tsx +0 -236
  69. package/src/charts/steamChart/index.ts +0 -1
  70. package/src/components/RenderLabel/RenderLabel.tsx +0 -39
  71. package/src/components/RenderLabel/index.ts +0 -2
  72. package/src/components/RenderLabel/useRenderLabelStylesStyles.ts +0 -25
  73. package/src/components/RenderLegend/RenderLegend.tsx +0 -40
  74. package/src/components/RenderTooltip/RenderTooltip.tsx +0 -111
  75. package/src/components/buttonMenu/ButtonMenu.tsx +0 -186
  76. package/src/components/buttonMenu/IButtonMenuOption.ts +0 -9
  77. package/src/components/buttonMenu/IButtonMenuProps.tsx +0 -40
  78. package/src/components/dashboard/DashBoard.tsx +0 -314
  79. package/src/components/dashboard/ExampleDashboardUsage.tsx +0 -114
  80. package/src/components/dashboard/IDashboardProps.tsx +0 -11
  81. package/src/components/dashboard/NoDashboards.tsx +0 -26
  82. package/src/components/dashboard/index.ts +0 -3
  83. package/src/components/dashboard/selectZoom/SelectZoom.tsx +0 -189
  84. package/src/components/dashboard/useDashboardStyles.ts +0 -76
  85. package/src/components/index.ts +0 -17
  86. package/src/components/legendContainer/LegendContainer.tsx +0 -118
  87. package/src/components/legendeButton/LegendButton.tsx +0 -57
  88. package/src/components/renderSliceLegend/RenderSliceLegend.tsx +0 -46
  89. package/src/components/renderValueLegend/RenderValueLegend.tsx +0 -43
  90. package/src/components/stack/IStackProps.tsx +0 -94
  91. package/src/components/stack/Stack.tsx +0 -103
  92. package/src/components/svgImages/BusinessReportIcon.tsx +0 -218
  93. package/src/components/themeProvider/ThemeProvider.tsx +0 -48
  94. package/src/constants/Constants.tsx +0 -23
  95. package/src/graphGlobalStyles/useGraphGlobalStyles.ts +0 -28
  96. package/src/hooks/index.ts +0 -1
  97. package/src/hooks/useChartFactory.tsx +0 -136
  98. package/src/hooks/useChartUtils.tsx +0 -187
  99. package/src/hooks/useIndexedDBCache.ts +0 -122
  100. package/src/hooks/useResponsiveLegend.ts +0 -35
  101. package/src/index.tsx +0 -5
  102. package/src/models/ChartDatum.ts +0 -4
  103. package/src/models/ICardChartContainer.tsx +0 -11
  104. package/src/models/IChart.ts +0 -50
  105. package/src/models/index.ts +0 -3
@@ -4,18 +4,23 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
6
 
7
- var chart_js = require('chart.js');
7
+ var reactComponents = require('@fluentui/react-components');
8
8
  var React = require('react');
9
9
  var React__default = _interopDefault(React);
10
- var reactChartjs2 = require('react-chartjs-2');
11
- var ChartDataLabels = _interopDefault(require('chartjs-plugin-datalabels'));
12
- var reactComponents = require('@fluentui/react-components');
13
10
  var css = require('@emotion/css');
14
- var resizeObserver = require('@juggle/resize-observer');
15
11
  var reactIcons = require('@fluentui/react-icons');
16
12
  var react = require('@iconify/react');
17
- var m365Hooks = require('@spteck/m365-hooks');
13
+ var chart_js = require('chart.js');
14
+ var ChartDataLabels = _interopDefault(require('chartjs-plugin-datalabels'));
15
+ var reactChartjs2 = require('react-chartjs-2');
16
+ var resizeObserver = require('@juggle/resize-observer');
17
+ var idb = require('idb');
18
18
 
19
+ function _arrayLikeToArray(r, a) {
20
+ (null == a || a > r.length) && (a = r.length);
21
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
22
+ return n;
23
+ }
19
24
  function asyncGeneratorStep(n, t, e, r, o, a, c) {
20
25
  try {
21
26
  var i = n[a](c),
@@ -41,6 +46,23 @@ function _asyncToGenerator(n) {
41
46
  });
42
47
  };
43
48
  }
49
+ function _createForOfIteratorHelperLoose(r, e) {
50
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
51
+ if (t) return (t = t.call(r)).next.bind(t);
52
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
53
+ t && (r = t);
54
+ var o = 0;
55
+ return function () {
56
+ return o >= r.length ? {
57
+ done: !0
58
+ } : {
59
+ done: !1,
60
+ value: r[o++]
61
+ };
62
+ };
63
+ }
64
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
65
+ }
44
66
  function _extends() {
45
67
  return _extends = Object.assign ? Object.assign.bind() : function (n) {
46
68
  for (var e = 1; e < arguments.length; e++) {
@@ -163,212 +185,220 @@ function _regeneratorDefine(e, r, n, t) {
163
185
  function _taggedTemplateLiteralLoose(e, t) {
164
186
  return t || (t = e.slice(0)), e.raw = t, e;
165
187
  }
188
+ function _unsupportedIterableToArray(r, a) {
189
+ if (r) {
190
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
191
+ var t = {}.toString.call(r).slice(8, -1);
192
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
193
+ }
194
+ }
166
195
 
167
- /**
168
- * Lightens a given hex color by a percentage amount (0 to 1).
169
- */
170
- var lightenColor = function lightenColor(hex, amount) {
171
- if (!/^#?[0-9A-Fa-f]{6}$/.test(hex)) return hex;
172
- if (hex.startsWith('#')) hex = hex.slice(1);
173
- var r = parseInt(hex.slice(0, 2), 16);
174
- var g = parseInt(hex.slice(2, 4), 16);
175
- var b = parseInt(hex.slice(4, 6), 16);
176
- r = Math.min(255, Math.floor(r + (255 - r) * amount));
177
- g = Math.min(255, Math.floor(g + (255 - g) * amount));
178
- b = Math.min(255, Math.floor(b + (255 - b) * amount));
179
- var toHex = function toHex(v) {
180
- return v.toString(16).padStart(2, '0');
181
- };
182
- return "#" + toHex(r) + toHex(g) + toHex(b);
183
- };
184
- var getFluentPalette = function getFluentPalette(_theme) {
185
- return ['#4e79a7', '#f28e2c', '#e15759', '#76b7b2', '#59a14f', '#edc949', '#af7aa1', '#ff9da7', '#9c755f', '#bab0ab', '#8cd17d', '#b6992d', '#d37295', '#fabfd2', '#79706e'];
186
- };
187
- /**
188
- * Smart Fluent tooltip generator with chart-type awareness.
189
- */
190
- function createFluentTooltip(theme) {
191
- var fontFamily = theme.fontFamilyBase;
192
- var fontSize = parseInt(theme.fontSizeBase200.replace('px', '')) || 14;
193
- var tooltipBg = theme.colorNeutralBackground1;
194
- var tooltipTitleColor = theme.colorNeutralForeground1;
195
- var tooltipBodyColor = theme.colorNeutralForeground2;
196
- var borderColor = theme.colorNeutralStroke2;
197
- var callbacks = {
198
- title: function title(context) {
199
- var _context$0$label, _context$;
200
- return (_context$0$label = (_context$ = context[0]) == null ? void 0 : _context$.label) != null ? _context$0$label : '';
196
+ var BusinessReportIcon = function BusinessReportIcon(_ref) {
197
+ var _ref$width = _ref.width,
198
+ width = _ref$width === void 0 ? 200 : _ref$width,
199
+ _ref$height = _ref.height,
200
+ height = _ref$height === void 0 ? 200 : _ref$height,
201
+ className = _ref.className,
202
+ style = _ref.style;
203
+ return React__default.createElement("svg", {
204
+ width: width,
205
+ height: height,
206
+ viewBox: "200 400 1400 1000",
207
+ className: className,
208
+ style: _extends({
209
+ fill: reactComponents.tokens.colorNeutralForeground2
210
+ }, style),
211
+ xmlns: "http://www.w3.org/2000/svg"
212
+ }, React__default.createElement("g", {
213
+ id: "BACKGROUND"
214
+ }, React__default.createElement("rect", {
215
+ style: {
216
+ fill: reactComponents.tokens.colorNeutralBackground1
201
217
  },
202
- label: function label(item) {
203
- var datasetLabel = 'label' in item.dataset && typeof item.dataset.label === 'string' ? item.dataset.label : 'Value';
204
- var raw = item.raw;
205
- // Bubble format { x, y, r }
206
- if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw && 'r' in raw) {
207
- var x = raw.x,
208
- y = raw.y,
209
- r = raw.r;
210
- return datasetLabel + " \u2014 x: " + x + ", y: " + y + ", r: " + r;
211
- }
212
- // Scatter format { x, y }
213
- if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw) {
214
- var _x = raw.x,
215
- _y = raw.y;
216
- return datasetLabel + " \u2014 x: " + _x + ", y: " + _y;
217
- }
218
- // Floating bar [min, max]
219
- if (Array.isArray(raw) && raw.length === 2) {
220
- var min = raw[0],
221
- max = raw[1];
222
- return datasetLabel + ": " + min + " \u2013 " + max;
223
- }
224
- // Default: single number or string
225
- return datasetLabel + ": " + raw;
218
+ x: "200",
219
+ y: "400",
220
+ width: "1400",
221
+ height: "1000"
222
+ })), React__default.createElement("g", null, React__default.createElement("g", null, React__default.createElement("rect", {
223
+ x: "486.006",
224
+ y: "568.026",
225
+ style: {
226
+ fill: reactComponents.tokens.colorNeutralBackground1
226
227
  },
227
- beforeTitle: function beforeTitle() {
228
- return '';
228
+ width: "1038.994",
229
+ height: "768.164"
230
+ }), React__default.createElement("path", {
231
+ style: {
232
+ fill: reactComponents.tokens.colorNeutralStroke1
229
233
  },
230
- afterTitle: function afterTitle() {
231
- return '';
234
+ d: "M1527.5,1338.69H483.506V565.526H1527.5V1338.69z M488.506,1333.69H1522.5V570.526H488.506V1333.69z"
235
+ })), React__default.createElement("g", null, React__default.createElement("rect", {
236
+ x: "558.003",
237
+ y: "1086.698",
238
+ style: {
239
+ fill: reactComponents.tokens.colorNeutralForeground3,
240
+ opacity: 0.3
232
241
  },
233
- beforeBody: function beforeBody() {
234
- return '';
242
+ width: "85",
243
+ height: "164.492"
244
+ }), React__default.createElement("rect", {
245
+ x: "693.003",
246
+ y: "1004.672",
247
+ style: {
248
+ fill: reactComponents.tokens.colorNeutralForeground3,
249
+ opacity: 0.3
235
250
  },
236
- afterBody: function afterBody() {
237
- return '';
251
+ width: "85",
252
+ height: "246.519"
253
+ }), React__default.createElement("rect", {
254
+ x: "828.003",
255
+ y: "835.487",
256
+ style: {
257
+ fill: reactComponents.tokens.colorNeutralForeground3,
258
+ opacity: 0.3
238
259
  },
239
- beforeLabel: function beforeLabel() {
240
- return '';
260
+ width: "85",
261
+ height: "415.703"
262
+ }), React__default.createElement("rect", {
263
+ x: "963.003",
264
+ y: "955.6",
265
+ style: {
266
+ fill: reactComponents.tokens.colorNeutralForeground3,
267
+ opacity: 0.3
241
268
  },
242
- afterLabel: function afterLabel() {
243
- return '';
269
+ width: "85",
270
+ height: "295.591"
271
+ }), React__default.createElement("rect", {
272
+ x: "1098.003",
273
+ y: "825.238",
274
+ style: {
275
+ fill: reactComponents.tokens.colorNeutralForeground3,
276
+ opacity: 0.3
244
277
  },
245
- labelColor: function labelColor() {
246
- return undefined;
278
+ width: "85",
279
+ height: "425.952"
280
+ }), React__default.createElement("rect", {
281
+ x: "1233.003",
282
+ y: "847.489",
283
+ style: {
284
+ fill: reactComponents.tokens.colorNeutralForeground3,
285
+ opacity: 0.3
247
286
  },
248
- labelTextColor: function labelTextColor() {
249
- return '';
287
+ width: "85",
288
+ height: "403.701"
289
+ }), React__default.createElement("rect", {
290
+ x: "1368.003",
291
+ y: "699.989",
292
+ style: {
293
+ fill: reactComponents.tokens.colorNeutralForeground3,
294
+ opacity: 0.3
250
295
  },
251
- footer: function footer() {
252
- return '';
296
+ width: "85",
297
+ height: "551.201"
298
+ }), React__default.createElement("polygon", {
299
+ style: {
300
+ fill: reactComponents.tokens.colorBrandBackground
253
301
  },
254
- beforeFooter: function beforeFooter() {
255
- return '';
302
+ points: "583.634,1185.919 581.366,1181.462 723.336,1109.231 869.748,909.808 1003.791,1050.114 1141.593,912.312 1275.235,928.549 1409.365,774.548 1413.135,777.833 1277.265,933.832 1143.407,917.569 1003.709,1057.267 870.251,917.573 726.664,1113.149"
303
+ })), React__default.createElement("rect", {
304
+ x: "796.336",
305
+ y: "662.857",
306
+ style: {
307
+ fill: reactComponents.tokens.colorBrandBackground
256
308
  },
257
- afterFooter: function afterFooter() {
258
- return '';
309
+ width: "418.333",
310
+ height: "5"
311
+ }), React__default.createElement("rect", {
312
+ x: "937.543",
313
+ y: "717.857",
314
+ style: {
315
+ fill: reactComponents.tokens.colorBrandBackground
259
316
  },
260
- labelPointStyle: function labelPointStyle() {
261
- return {
262
- pointStyle: 'circle',
263
- rotation: 0,
264
- radius: 5
265
- };
266
- }
267
- };
268
- return {
269
- enabled: true,
270
- displayColors: true,
271
- boxWidth: 10,
272
- boxHeight: 10,
273
- boxPadding: 5,
274
- backgroundColor: tooltipBg,
275
- borderColor: borderColor,
276
- borderWidth: 1,
277
- cornerRadius: 4,
278
- padding: 10,
279
- titleColor: tooltipTitleColor,
280
- bodyColor: tooltipBodyColor,
281
- titleFont: {
282
- family: fontFamily,
283
- size: fontSize
317
+ width: "135.92",
318
+ height: "5"
319
+ })), React__default.createElement("g", null, React__default.createElement("g", null, React__default.createElement("rect", {
320
+ x: "264.978",
321
+ y: "441.049",
322
+ style: {
323
+ fill: reactComponents.tokens.colorNeutralBackground1
284
324
  },
285
- bodyFont: {
286
- family: fontFamily,
287
- size: fontSize
325
+ width: "482.581",
326
+ height: "379.067"
327
+ }), React__default.createElement("path", {
328
+ style: {
329
+ fill: reactComponents.tokens.colorNeutralStroke1
288
330
  },
289
- callbacks: callbacks
290
- };
291
- }
292
- /**
293
- * Returns a Chart.js ticks callback to truncate long labels and add optional prefix/suffix.
294
- */
295
- var createAxisLabelFormatter = function createAxisLabelFormatter(_ref) {
296
- var _ref$maxLength = _ref.maxLength,
297
- maxLength = _ref$maxLength === void 0 ? 12 : _ref$maxLength,
298
- _ref$suffix = _ref.suffix,
299
- suffix = _ref$suffix === void 0 ? '' : _ref$suffix,
300
- _ref$prefix = _ref.prefix,
301
- prefix = _ref$prefix === void 0 ? '' : _ref$prefix;
302
- return function (value) {
303
- var label = typeof value === 'number' ? this.getLabelForValue(value) : String(value);
304
- var trimmed = label.length > maxLength ? label.slice(0, maxLength) + '…' : label;
305
- return "" + prefix + trimmed + suffix;
306
- };
307
- };
308
- function debounce(fn, delay) {
309
- var timer = null;
310
- return function () {
311
- var _this = this;
312
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
313
- args[_key] = arguments[_key];
314
- }
315
- if (timer) clearTimeout(timer);
316
- timer = setTimeout(function () {
317
- return fn.apply(_this, args);
318
- }, delay);
319
- };
320
- }
321
- /**
322
- * useChartUtils — shared theming and chart helpers.
323
- */
324
- function useChartUtils(theme) {
325
- return React.useMemo(function () {
326
- return {
327
- lightenColor: lightenColor,
328
- getFluentPalette: getFluentPalette,
329
- createFluentTooltip: createFluentTooltip,
330
- createAxisLabelFormatter: createAxisLabelFormatter,
331
- debounce: debounce
332
- };
333
- }, [theme]);
334
- }
335
-
336
- var LegendButton = function LegendButton(_ref) {
337
- var label = _ref.label,
338
- isVisible = _ref.isVisible,
339
- color = _ref.color,
340
- onClick = _ref.onClick,
341
- _ref$style = _ref.style,
342
- style = _ref$style === void 0 ? {} : _ref$style,
343
- buttonRef = _ref.buttonRef;
344
- return React__default.createElement(reactComponents.Tooltip, {
345
- content: label,
346
- relationship: "label"
347
- }, React__default.createElement(reactComponents.Button, {
348
- ref: buttonRef,
349
- shape: "circular",
350
- size: "small",
351
- appearance: isVisible ? 'primary' : 'outline',
352
- onClick: onClick,
353
- style: _extends({
354
- backgroundColor: isVisible ? color : 'transparent',
355
- color: isVisible ? '#fff' : reactComponents.tokens.colorNeutralForeground1,
356
- borderColor: color,
357
- borderWidth: 1,
358
- width: '100px',
359
- padding: '4px 8px',
360
- textAlign: 'center'
361
- }, style)
362
- }, React__default.createElement(reactComponents.Caption1, {
363
- as: "span",
331
+ d: "M750.06,822.616H262.478V438.549H750.06V822.616z M267.478,817.616H745.06V443.549H267.478V817.616z"
332
+ })), React__default.createElement("g", null, React__default.createElement("g", null, React__default.createElement("rect", {
333
+ x: "330.537",
334
+ y: "503.15",
364
335
  style: {
365
- display: 'block',
366
- overflow: 'hidden',
367
- textOverflow: 'ellipsis',
368
- whiteSpace: 'nowrap',
369
- lineHeight: '1.25'
370
- }
371
- }, label)));
336
+ fill: reactComponents.tokens.colorNeutralForeground3,
337
+ opacity: 0.3
338
+ },
339
+ width: "108.842",
340
+ height: "61.633"
341
+ }), React__default.createElement("g", null, React__default.createElement("rect", {
342
+ x: "485.277",
343
+ y: "509.093",
344
+ style: {
345
+ fill: reactComponents.tokens.colorBrandBackground
346
+ },
347
+ width: "198.014",
348
+ height: "2.623"
349
+ }), React__default.createElement("rect", {
350
+ x: "485.277",
351
+ y: "532.656",
352
+ style: {
353
+ fill: reactComponents.tokens.colorNeutralForeground3,
354
+ opacity: 0.3
355
+ },
356
+ width: "198.014",
357
+ height: "2.623"
358
+ }), React__default.createElement("rect", {
359
+ x: "485.277",
360
+ y: "556.218",
361
+ style: {
362
+ fill: reactComponents.tokens.colorNeutralForeground3,
363
+ opacity: 0.3
364
+ },
365
+ width: "198.014",
366
+ height: "2.623"
367
+ }))), React__default.createElement("g", null, React__default.createElement("g", null, React__default.createElement("rect", {
368
+ x: "381.691",
369
+ y: "687.747",
370
+ style: {
371
+ fill: reactComponents.tokens.colorNeutralForeground3,
372
+ opacity: 0.3
373
+ },
374
+ width: "22.73",
375
+ height: "70.417"
376
+ }), React__default.createElement("rect", {
377
+ x: "404.421",
378
+ y: "653.482",
379
+ style: {
380
+ fill: reactComponents.tokens.colorBrandBackground
381
+ },
382
+ width: "22.73",
383
+ height: "104.682"
384
+ })), React__default.createElement("g", null, React__default.createElement("rect", {
385
+ x: "466.491",
386
+ y: "641.634",
387
+ style: {
388
+ fill: reactComponents.tokens.colorNeutralForeground3,
389
+ opacity: 0.3
390
+ },
391
+ width: "22.73",
392
+ height: "116.089"
393
+ }), React__default.createElement("rect", {
394
+ x: "489.221",
395
+ y: "714.758",
396
+ style: {
397
+ fill: reactComponents.tokens.colorBrandBackground
398
+ },
399
+ width: "22.73",
400
+ height: "42.965"
401
+ }))))));
372
402
  };
373
403
 
374
404
  /**
@@ -445,910 +475,541 @@ var Stack = /*#__PURE__*/React__default.memo(function (_ref) {
445
475
  });
446
476
  Stack.displayName = "Stack";
447
477
 
448
- var styles = {
449
- wrapper: /*#__PURE__*/css.css({
450
- display: 'flex',
451
- flexWrap: 'nowrap',
452
- overflow: 'hidden',
453
- justifyContent: 'center',
454
- gap: 10,
455
- padding: 2,
456
- width: '100%',
457
- boxSizing: 'border-box'
458
- })
478
+ var NoDashboards = function NoDashboards(props) {
479
+ var height = props.height;
480
+ return React.createElement(React.Fragment, null, React.createElement(Stack, {
481
+ style: {
482
+ height: height || "100%"
483
+ },
484
+ justifyContent: "Center",
485
+ alignItems: "Center"
486
+ }, React.createElement(BusinessReportIcon, {
487
+ width: 200,
488
+ height: 200
489
+ }), React.createElement(reactComponents.Text, {
490
+ size: 500,
491
+ weight: 'semibold'
492
+ }, "No Dashboards Available")));
459
493
  };
460
- function LegendContainer(props) {
461
- var containerRef = props.containerRef,
462
- visibleItems = props.visibleItems,
463
- overflowItems = props.overflowItems,
464
- visibleLabels = props.visibleLabels,
465
- toggleLabel = props.toggleLabel,
466
- renderLabel = props.renderLabel,
467
- getColor = props.getColor;
468
- return React__default.createElement(Stack, {
469
- justifyContent: "center",
470
- alignItems: "center",
471
- marginLeft: "10px",
472
- marginRight: "10px",
473
- marginTop: "25px",
474
- marginBottom: "20px"
475
- }, React__default.createElement("div", {
476
- ref: containerRef,
477
- className: styles.wrapper
478
- }, visibleItems.map(function (item) {
479
- var label = item.label;
480
- var isVisible = visibleLabels.length === 0 || visibleLabels.includes(label);
481
- return React__default.createElement(LegendButton, {
482
- key: label,
483
- label: renderLabel(item),
484
- color: getColor(item),
485
- isVisible: isVisible,
486
- onClick: function onClick() {
487
- return toggleLabel(label);
488
- }
489
- });
490
- }), overflowItems.length > 0 && React__default.createElement(reactComponents.Menu, null, React__default.createElement(reactComponents.MenuTrigger, {
491
- disableButtonEnhancement: true
492
- }, React__default.createElement(reactComponents.MenuButton, {
493
- size: "small",
494
- appearance: "transparent"
495
- }, "+", overflowItems.length)), React__default.createElement(reactComponents.MenuPopover, {
494
+
495
+ var useRenderLabelStyles = /*#__PURE__*/reactComponents.makeStyles({
496
+ labelContainer: /*#__PURE__*/_extends({
497
+ display: "flex",
498
+ flexDirection: "row",
499
+ justifyContent: "flex-start",
500
+ alignItems: "center"
501
+ }, /*#__PURE__*/reactComponents.shorthands.gap("6px")),
502
+ iconStyles: {
503
+ width: "26px"
504
+ },
505
+ item: {
506
+ paddingLeft: "15px"
507
+ }
508
+ });
509
+
510
+ var RenderLabel = function RenderLabel(props) {
511
+ var label = props.label,
512
+ icon = props.icon,
513
+ isRequired = props.isRequired;
514
+ var styles = useRenderLabelStyles();
515
+ return React.createElement(React.Fragment, null, React.createElement("div", {
516
+ className: styles.labelContainer
517
+ }, icon && React.isValidElement(icon) ? icon : React.createElement(react.Icon, {
518
+ icon: icon,
519
+ className: styles.iconStyles,
520
+ width: "20px",
521
+ height: "20px",
522
+ color: reactComponents.tokens.colorBrandForeground1
523
+ }), React.createElement(reactComponents.Caption1, {
496
524
  style: {
497
- minWidth: 'fit-content',
498
- maxWidth: '200px'
525
+ color: reactComponents.tokens.colorBrandForeground1
499
526
  }
500
- }, React__default.createElement(reactComponents.MenuList, null, overflowItems.map(function (item) {
501
- var label = item.label;
502
- var isVisible = visibleLabels.length === 0 || visibleLabels.includes(label);
503
- return React__default.createElement(reactComponents.MenuItem, {
504
- key: label,
505
- style: {
506
- padding: 0
507
- }
508
- }, React__default.createElement(LegendButton, {
509
- label: renderLabel(item),
510
- color: getColor(item),
511
- isVisible: isVisible,
512
- onClick: function onClick() {
513
- return toggleLabel(label);
514
- },
515
- style: {
516
- width: '100px',
517
- textAlign: 'left'
518
- }
519
- }));
520
- }))))));
521
- }
522
-
523
- var BUTTON_WIDTH = 100;
524
- var GAP = 10;
525
- function useResponsiveLegend(items) {
526
- var containerRef = React.useRef(null);
527
- var _useState = React.useState(items.length),
528
- maxVisible = _useState[0],
529
- setMaxVisible = _useState[1];
530
- var _useChartUtils = useChartUtils(),
531
- debounce = _useChartUtils.debounce;
532
- React.useEffect(function () {
533
- var measure = function measure() {
534
- var _containerRef$current, _containerRef$current2;
535
- var containerWidth = (_containerRef$current = (_containerRef$current2 = containerRef.current) == null ? void 0 : _containerRef$current2.offsetWidth) != null ? _containerRef$current : 0;
536
- var itemTotalWidth = BUTTON_WIDTH + GAP;
537
- var count = Math.floor(containerWidth / itemTotalWidth);
538
- setMaxVisible(count);
539
- };
540
- var debouncedMeasure = debounce(measure, 100); // debounce resize
541
- var observer = new resizeObserver.ResizeObserver(debouncedMeasure);
542
- if (containerRef.current) observer.observe(containerRef.current);
543
- measure(); // initial
544
- return function () {
545
- return observer.disconnect();
546
- };
547
- }, [items]);
548
- return {
549
- containerRef: containerRef,
550
- visibleItems: items.slice(0, maxVisible),
551
- overflowItems: items.slice(maxVisible)
552
- };
553
- }
554
-
555
- var RenderLegend = function RenderLegend(_ref) {
556
- var data = _ref.data,
557
- visibleSeries = _ref.visibleSeries,
558
- seriesColors = _ref.seriesColors,
559
- toggleSeries = _ref.toggleSeries;
560
- var _useResponsiveLegend = useResponsiveLegend(data),
561
- containerRef = _useResponsiveLegend.containerRef,
562
- visibleItems = _useResponsiveLegend.visibleItems,
563
- overflowItems = _useResponsiveLegend.overflowItems;
564
- return React__default.createElement(LegendContainer, {
565
- containerRef: containerRef,
566
- visibleItems: visibleItems,
567
- overflowItems: overflowItems,
568
- items: data,
569
- visibleLabels: visibleSeries,
570
- toggleLabel: toggleSeries,
571
- renderLabel: function renderLabel(d) {
572
- return d.label;
573
- },
574
- getColor: function getColor(d) {
575
- return seriesColors[d.label];
527
+ }, label), React.createElement(reactComponents.Caption1, {
528
+ style: {
529
+ color: reactComponents.tokens.colorPaletteRedForeground1
576
530
  }
577
- });
531
+ }, isRequired ? " *" : "")));
578
532
  };
579
533
 
580
- var _templateObject, _templateObject2;
581
- var useGraphGlobalStyles = function useGraphGlobalStyles() {
534
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
535
+ var useStyles = function useStyles() {
582
536
  return {
583
- chartWithLegend: css.css({
537
+ gridContainer: css.css(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n display: grid;\n gap: 4px;\n padding: 8px;\n justify-content: center;\n "]))),
538
+ cell: css.css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["\n width: 30px;\n height: 30px;\n border: 1px solid ", ";\n background-color: ", ";\n cursor: pointer;\n transition: background-color 150ms ease, transform 150ms ease;\n will-change: background-color, transform;\n "])), reactComponents.tokens.colorNeutralStroke1, reactComponents.tokens.colorNeutralBackground1),
539
+ hoveredCell: css.css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteralLoose(["\n background-color: ", ";\n transform: scale(1.05);\n "])), reactComponents.tokens.colorNeutralBackground1Hover),
540
+ selectedCell: css.css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteralLoose(["\n background-color: ", ";\n "])), reactComponents.tokens.colorNeutralBackground1Selected),
541
+ menuPopover: css.css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteralLoose(["\n min-width: fit-content;\n "]))),
542
+ bottomText: css.css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteralLoose(["\n padding-left: 8px;\n padding-right: 8px;\n "]))),
543
+ zoomContainer: css.css({
584
544
  display: 'flex',
585
- flexDirection: 'column',
586
- height: '100%',
587
- chartArea: {
588
- flexGrow: 1,
589
- minHeight: 0
590
- }
591
- }),
592
- chartArea: css.css(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n flex-grow: 1;\n min-height: 0;\n "]))),
593
- 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 "])))
545
+ flexDirection: 'row',
546
+ alignItems: 'center',
547
+ gap: '6px',
548
+ width: '100%',
549
+ boxSizing: 'border-box',
550
+ padding: '8px 0px'
551
+ })
594
552
  };
595
553
  };
596
-
597
- chart_js.Chart.register(chart_js.CategoryScale, chart_js.LinearScale, chart_js.BarElement, chart_js.Tooltip, chart_js.Legend, ChartDataLabels, chart_js.Title);
598
- function BarChart(_ref) {
599
- var data = _ref.data,
600
- getPrimary = _ref.getPrimary,
601
- getSecondary = _ref.getSecondary,
602
- title = _ref.title,
603
- _ref$showDatalabels = _ref.showDatalabels,
604
- showDatalabels = _ref$showDatalabels === void 0 ? false : _ref$showDatalabels,
605
- _ref$stacked = _ref.stacked,
606
- stacked = _ref$stacked === void 0 ? false : _ref$stacked,
607
- theme = _ref.theme;
608
- var _useState = React.useState(function () {
609
- var _data$;
610
- return data.length > 1 ? data.map(function (s) {
611
- return s.label;
612
- }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
613
- }),
614
- visibleSeries = _useState[0],
615
- setVisibleSeries = _useState[1];
616
- var _useChartUtils = useChartUtils(theme),
617
- lightenColor = _useChartUtils.lightenColor,
618
- getFluentPalette = _useChartUtils.getFluentPalette,
619
- createFluentTooltip = _useChartUtils.createFluentTooltip;
620
- var styles = useGraphGlobalStyles();
621
- var seriesColors = React.useMemo(function () {
622
- return data.reduce(function (acc, series, idx) {
623
- var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
624
- var color = lightenColor(base, 0.3);
625
- acc[series.label] = color;
626
- return acc;
627
- }, {});
628
- }, [data]);
629
- var toggleSeries = function toggleSeries(label) {
630
- setVisibleSeries(function (prev) {
631
- var isVisible = prev.includes(label);
632
- var next = isVisible ? prev.filter(function (l) {
633
- return l !== label;
634
- }) : [].concat(prev, [label]);
635
- return next.length === 0 && data.length > 0 ? [data[0].label] : next;
636
- });
554
+ var SelectZoom = function SelectZoom(props) {
555
+ var onChange = props.onChange,
556
+ defaultValues = props.values,
557
+ maxCols = props.maxCols,
558
+ maxRows = props.maxRows;
559
+ var Settings = reactIcons.bundleIcon(reactIcons.Settings20Filled, reactIcons.Settings20Regular);
560
+ var styles = useStyles();
561
+ var _React$useState = React.useState(defaultValues),
562
+ values = _React$useState[0],
563
+ setValues = _React$useState[1];
564
+ var _React$useState2 = React.useState(null),
565
+ hovered = _React$useState2[0],
566
+ setHovered = _React$useState2[1];
567
+ var _React$useState3 = React.useState(false),
568
+ open = _React$useState3[0],
569
+ setOpen = _React$useState3[1];
570
+ React.useEffect(function () {
571
+ setValues(defaultValues);
572
+ }, [defaultValues]);
573
+ var onOpenChange = function onOpenChange(_, data) {
574
+ setOpen(data.open);
575
+ setHovered(null);
637
576
  };
638
- // Extract all unique x-axis categories (from all series)
639
- var allCategories = React.useMemo(function () {
640
- var categorySet = new Set();
641
- data.forEach(function (series) {
642
- series.data.forEach(function (datum) {
643
- categorySet.add(getPrimary(datum));
644
- });
645
- });
646
- return Array.from(categorySet);
647
- }, [data, getPrimary]);
648
- // Construct Chart.js datasets
649
- var chartData = React.useMemo(function () {
650
- return {
651
- labels: allCategories,
652
- datasets: data.filter(function (series) {
653
- return visibleSeries.includes(series.label);
654
- }).map(function (series) {
655
- return {
656
- label: series.label,
657
- backgroundColor: seriesColors[series.label],
658
- data: allCategories.map(function (cat) {
659
- var found = series.data.find(function (d) {
660
- return getPrimary(d) === cat;
661
- });
662
- return found ? getSecondary(found) : 0;
663
- }),
664
- // Assign y-axis based on series type when stacked
665
- yAxisID: stacked ? series.type === 'line' ? 'y1' : 'y' : 'y'
666
- };
667
- })
577
+ var handleCellClick = function handleCellClick(row, col) {
578
+ var newValues = {
579
+ spanCols: col + 1,
580
+ spanRows: row + 1
668
581
  };
669
- }, [data, visibleSeries, allCategories, seriesColors, stacked]);
670
- var _useMemo = React.useMemo(function () {
671
- return {
672
- fontFamily: theme.fontFamilyBase,
673
- fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
674
- labelColor: theme.colorNeutralForeground1,
675
- gridColor: theme.colorNeutralStroke2
676
- };
677
- }, [theme]),
678
- fontFamily = _useMemo.fontFamily,
679
- fontSize = _useMemo.fontSize,
680
- labelColor = _useMemo.labelColor,
681
- gridColor = _useMemo.gridColor;
682
- var options = React.useMemo(function () {
683
- return {
684
- responsive: true,
685
- maintainAspectRatio: false,
686
- plugins: {
687
- title: {
688
- display: !!title,
689
- text: title,
690
- font: {
691
- size: 14,
692
- family: theme.fontFamilyBase,
693
- weight: theme.fontWeightSemibold
582
+ setValues(newValues);
583
+ onChange == null || onChange(newValues);
584
+ setOpen(false);
585
+ };
586
+ var handleCellHover = function handleCellHover(row, col) {
587
+ setHovered({
588
+ spanCols: col + 1,
589
+ spanRows: row + 1
590
+ });
591
+ };
592
+ var handleMouseLeave = function handleMouseLeave() {
593
+ setHovered(null);
594
+ };
595
+ var renderGridCells = function renderGridCells() {
596
+ var cells = [];
597
+ var _loop = function _loop(row) {
598
+ var _loop2 = function _loop2(col) {
599
+ var isSelected = row < values.spanRows && col < values.spanCols;
600
+ var isHovered = hovered && row < hovered.spanRows && col < hovered.spanCols;
601
+ cells.push(React.createElement("div", {
602
+ key: row + "-" + col,
603
+ className: styles.cell + " " + (isHovered ? styles.hoveredCell : "") + " " + (isSelected ? styles.selectedCell : ""),
604
+ onMouseEnter: function onMouseEnter() {
605
+ return handleCellHover(row, col);
694
606
  },
695
- color: theme.colorNeutralForeground1,
696
- padding: {
697
- top: 20,
698
- bottom: 20
699
- }
700
- },
701
- datalabels: {
702
- display: showDatalabels,
703
- color: theme.colorNeutralForeground1,
704
- font: {
705
- family: theme.fontFamilyBase,
706
- size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
607
+ onClick: function onClick() {
608
+ return handleCellClick(row, col);
707
609
  }
708
- },
709
- legend: {
710
- display: false
711
- },
712
- tooltip: createFluentTooltip(theme)
713
- },
714
- scales: _extends({
715
- x: {
716
- stacked: stacked,
717
- ticks: {
718
- callback: createAxisLabelFormatter({
719
- maxLength: 10
720
- }),
721
- color: labelColor,
722
- font: {
723
- family: fontFamily,
724
- size: fontSize
725
- }
726
- },
727
- grid: {
728
- color: gridColor
729
- }
730
- },
731
- y: {
732
- type: 'linear',
733
- position: 'left',
734
- stacked: stacked,
735
- ticks: {
736
- callback: createAxisLabelFormatter({
737
- maxLength: 10
738
- }),
739
- color: labelColor,
740
- font: {
741
- family: fontFamily,
742
- size: fontSize
743
- }
744
- },
745
- grid: {
746
- color: gridColor
747
- }
748
- }
749
- }, stacked && {
750
- y1: {
751
- type: 'linear',
752
- position: 'right',
753
- ticks: {
754
- callback: createAxisLabelFormatter({
755
- maxLength: 10
756
- }),
757
- color: labelColor,
758
- font: {
759
- family: fontFamily,
760
- size: fontSize
761
- }
762
- },
763
- grid: {
764
- drawOnChartArea: false
765
- }
766
- }
767
- })
768
- };
769
- }, [title, showDatalabels, theme, fontFamily, fontSize, labelColor, gridColor, stacked, createFluentTooltip]);
770
- return React__default.createElement("div", {
771
- className: styles.chartWithLegend
772
- }, React__default.createElement("div", {
773
- className: styles.chartArea
774
- }, React__default.createElement(reactChartjs2.Bar, {
775
- data: chartData,
776
- options: options
777
- })), React__default.createElement("div", {
778
- className: styles.legendArea
779
- }, React__default.createElement(RenderLegend, {
780
- data: data,
781
- visibleSeries: visibleSeries,
782
- seriesColors: seriesColors,
783
- toggleSeries: toggleSeries
784
- })));
785
- }
786
-
787
- chart_js.Chart.register(ChartDataLabels);
788
- 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);
789
- function ComboChart(_ref) {
790
- var data = _ref.data,
791
- getPrimary = _ref.getPrimary,
792
- getSecondary = _ref.getSecondary,
793
- title = _ref.title,
794
- _ref$showDataLabels = _ref.showDataLabels,
795
- showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
796
- _ref$theme = _ref.theme,
797
- theme = _ref$theme === void 0 ? reactComponents.webLightTheme : _ref$theme;
798
- var _useState = React.useState(function () {
799
- return data.map(function (s) {
800
- return s.label;
801
- });
802
- }),
803
- visibleSeries = _useState[0],
804
- setVisibleSeries = _useState[1];
805
- var styles = useGraphGlobalStyles();
806
- var _useChartUtils = useChartUtils(theme),
807
- lightenColor = _useChartUtils.lightenColor,
808
- getFluentPalette = _useChartUtils.getFluentPalette,
809
- createFluentTooltip = _useChartUtils.createFluentTooltip;
810
- var seriesColors = React.useMemo(function () {
811
- return data.reduce(function (acc, series, idx) {
812
- var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
813
- acc[series.label] = lightenColor(base, 0.3);
814
- return acc;
815
- }, {});
816
- }, [data, theme]);
817
- var toggleSeries = function toggleSeries(label) {
818
- setVisibleSeries(function (prev) {
819
- var isVisible = prev.includes(label);
820
- var next = isVisible ? prev.filter(function (l) {
821
- return l !== label;
822
- }) : [].concat(prev, [label]);
823
- return next.length === 0 ? [data[0].label] : next;
824
- });
825
- };
826
- var allCategories = React.useMemo(function () {
827
- var set = new Set();
828
- data.forEach(function (series) {
829
- return series.data.forEach(function (d) {
830
- return set.add(getPrimary(d));
831
- });
832
- });
833
- return Array.from(set);
834
- }, [data, getPrimary]);
835
- var chartData = React.useMemo(function () {
836
- var sortedSeries = data.filter(function (series) {
837
- return visibleSeries.includes(series.label);
838
- }).sort(function (a, b) {
839
- // Ensure bars come before lines
840
- if (a.type === 'bar' && b.type === 'line') return -1;
841
- if (a.type === 'line' && b.type === 'bar') return 1;
842
- return 0;
843
- });
844
- return {
845
- labels: allCategories,
846
- datasets: sortedSeries.map(function (series) {
847
- var _series$yAxisID;
848
- return {
849
- type: series.type,
850
- label: series.label,
851
- yAxisID: (_series$yAxisID = series.yAxisID) != null ? _series$yAxisID : 'y',
852
- data: allCategories.map(function (cat) {
853
- var found = series.data.find(function (d) {
854
- return getPrimary(d) === cat;
855
- });
856
- return found ? getSecondary(found) : 0;
857
- }),
858
- backgroundColor: seriesColors[series.label],
859
- borderColor: seriesColors[series.label],
860
- fill: series.type === 'bar',
861
- tension: series.type === 'line' ? 0.4 : 0,
862
- pointRadius: series.type === 'line' ? 3 : 0,
863
- borderWidth: series.type === 'line' ? 2 : 1,
864
- order: series.type === 'bar' ? 1 : 0
865
- };
866
- })
867
- };
868
- }, [data, visibleSeries, allCategories, getPrimary, getSecondary, seriesColors]);
869
- var _useMemo = React.useMemo(function () {
870
- return {
871
- fontFamily: theme.fontFamilyBase,
872
- fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
873
- labelColor: theme.colorNeutralForeground1,
874
- gridColor: theme.colorNeutralStroke2
610
+ }));
875
611
  };
876
- }, [theme]),
877
- fontFamily = _useMemo.fontFamily,
878
- fontSize = _useMemo.fontSize,
879
- labelColor = _useMemo.labelColor,
880
- gridColor = _useMemo.gridColor;
881
- var options = React.useMemo(function () {
882
- return {
883
- responsive: true,
884
- maintainAspectRatio: false,
885
- plugins: {
886
- title: {
887
- display: !!title,
888
- text: title,
889
- font: {
890
- size: 14,
891
- family: theme.fontFamilyBase,
892
- weight: theme.fontWeightSemibold
893
- },
894
- color: theme.colorNeutralForeground1,
895
- padding: {
896
- top: 20,
897
- bottom: 20
898
- }
899
- },
900
- datalabels: {
901
- display: showDataLabels,
902
- color: theme.colorNeutralForeground1,
903
- font: {
904
- family: theme.fontFamilyBase,
905
- size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
906
- }
907
- },
908
- legend: {
909
- display: false
910
- },
911
- tooltip: createFluentTooltip(theme)
912
- },
913
- scales: {
914
- x: {
915
- ticks: {
916
- color: labelColor,
917
- font: {
918
- family: fontFamily,
919
- size: fontSize
920
- }
921
- },
922
- grid: {
923
- color: gridColor
924
- }
925
- },
926
- y: {
927
- position: 'left',
928
- ticks: {
929
- color: labelColor,
930
- font: {
931
- family: fontFamily,
932
- size: fontSize
933
- }
934
- },
935
- grid: {
936
- color: gridColor
937
- },
938
- stacked: false
939
- }
612
+ for (var col = 0; col < maxCols; col++) {
613
+ _loop2(col);
940
614
  }
941
615
  };
942
- }, [title, showDataLabels, theme, fontFamily, fontSize, labelColor, gridColor, createFluentTooltip]);
943
- return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
944
- className: styles.chartWithLegend
945
- }, React__default.createElement("div", {
946
- className: styles.chartArea
947
- }, React__default.createElement(reactChartjs2.Chart, {
948
- type: "bar",
949
- data: chartData,
950
- options: options
951
- })), React__default.createElement("div", {
952
- className: styles.legendArea
953
- }, React__default.createElement(RenderLegend, {
954
- data: data,
955
- visibleSeries: visibleSeries,
956
- seriesColors: seriesColors,
957
- toggleSeries: toggleSeries
958
- }))));
959
- }
960
-
961
- var BusinessReportIcon = function BusinessReportIcon(_ref) {
962
- var _ref$width = _ref.width,
963
- width = _ref$width === void 0 ? 200 : _ref$width,
964
- _ref$height = _ref.height,
965
- height = _ref$height === void 0 ? 200 : _ref$height,
966
- className = _ref.className,
967
- style = _ref.style;
968
- return React__default.createElement("svg", {
969
- width: width,
970
- height: height,
971
- viewBox: "200 400 1400 1000",
972
- className: className,
973
- style: _extends({
974
- fill: reactComponents.tokens.colorNeutralForeground2
975
- }, style),
976
- xmlns: "http://www.w3.org/2000/svg"
977
- }, React__default.createElement("g", {
978
- id: "BACKGROUND"
979
- }, React__default.createElement("rect", {
980
- style: {
981
- fill: reactComponents.tokens.colorNeutralBackground1
982
- },
983
- x: "200",
984
- y: "400",
985
- width: "1400",
986
- height: "1000"
987
- })), React__default.createElement("g", null, React__default.createElement("g", null, React__default.createElement("rect", {
988
- x: "486.006",
989
- y: "568.026",
990
- style: {
991
- fill: reactComponents.tokens.colorNeutralBackground1
992
- },
993
- width: "1038.994",
994
- height: "768.164"
995
- }), React__default.createElement("path", {
996
- style: {
997
- fill: reactComponents.tokens.colorNeutralStroke1
998
- },
999
- d: "M1527.5,1338.69H483.506V565.526H1527.5V1338.69z M488.506,1333.69H1522.5V570.526H488.506V1333.69z"
1000
- })), React__default.createElement("g", null, React__default.createElement("rect", {
1001
- x: "558.003",
1002
- y: "1086.698",
1003
- style: {
1004
- fill: reactComponents.tokens.colorNeutralForeground3,
1005
- opacity: 0.3
1006
- },
1007
- width: "85",
1008
- height: "164.492"
1009
- }), React__default.createElement("rect", {
1010
- x: "693.003",
1011
- y: "1004.672",
1012
- style: {
1013
- fill: reactComponents.tokens.colorNeutralForeground3,
1014
- opacity: 0.3
1015
- },
1016
- width: "85",
1017
- height: "246.519"
1018
- }), React__default.createElement("rect", {
1019
- x: "828.003",
1020
- y: "835.487",
1021
- style: {
1022
- fill: reactComponents.tokens.colorNeutralForeground3,
1023
- opacity: 0.3
1024
- },
1025
- width: "85",
1026
- height: "415.703"
1027
- }), React__default.createElement("rect", {
1028
- x: "963.003",
1029
- y: "955.6",
1030
- style: {
1031
- fill: reactComponents.tokens.colorNeutralForeground3,
1032
- opacity: 0.3
1033
- },
1034
- width: "85",
1035
- height: "295.591"
1036
- }), React__default.createElement("rect", {
1037
- x: "1098.003",
1038
- y: "825.238",
1039
- style: {
1040
- fill: reactComponents.tokens.colorNeutralForeground3,
1041
- opacity: 0.3
1042
- },
1043
- width: "85",
1044
- height: "425.952"
1045
- }), React__default.createElement("rect", {
1046
- x: "1233.003",
1047
- y: "847.489",
616
+ for (var row = 0; row < maxRows; row++) {
617
+ _loop(row);
618
+ }
619
+ return cells;
620
+ };
621
+ // Compute popover width dynamically
622
+ var popoverWidth = React.useMemo(function () {
623
+ return 30 * maxCols + 4 * (maxCols - 1) + 32;
624
+ }, [maxCols]); // 30px for each cell, 4px gap, and 32px padding (16 left and right)
625
+ return React.createElement(reactComponents.Menu, {
626
+ open: open,
627
+ onOpenChange: onOpenChange
628
+ }, React.createElement(reactComponents.MenuTrigger, {
629
+ disableButtonEnhancement: true
630
+ }, React.createElement(reactComponents.Tooltip, {
631
+ content: "Configure",
632
+ relationship: "label"
633
+ }, React.createElement(reactComponents.MenuButton, {
634
+ icon: React.createElement(Settings, null),
635
+ size: "small",
636
+ appearance: "transparent"
637
+ }))), React.createElement(reactComponents.MenuPopover, {
1048
638
  style: {
1049
- fill: reactComponents.tokens.colorNeutralForeground3,
1050
- opacity: 0.3
1051
- },
1052
- width: "85",
1053
- height: "403.701"
1054
- }), React__default.createElement("rect", {
1055
- x: "1368.003",
1056
- y: "699.989",
639
+ width: popoverWidth + "px",
640
+ minWidth: "120px",
641
+ padding: 8
642
+ }
643
+ }, React.createElement("div", {
644
+ className: styles.zoomContainer
645
+ }, React.createElement(RenderLabel, {
646
+ label: "Span (" + values.spanCols + " \xD7 " + values.spanRows + ")"
647
+ })), React.createElement("div", {
648
+ className: styles.gridContainer,
1057
649
  style: {
1058
- fill: reactComponents.tokens.colorNeutralForeground3,
1059
- opacity: 0.3
650
+ gridTemplateColumns: "repeat(" + maxCols + ", 30px)",
651
+ gridTemplateRows: "repeat(" + maxRows + ", 30px)"
1060
652
  },
1061
- width: "85",
1062
- height: "551.201"
1063
- }), React__default.createElement("polygon", {
653
+ onMouseLeave: handleMouseLeave
654
+ }, renderGridCells()), React.createElement(reactComponents.Caption1, {
655
+ className: styles.bottomText
656
+ }, "Click to set span")));
657
+ };
658
+
659
+ var LegendButton = function LegendButton(_ref) {
660
+ var label = _ref.label,
661
+ isVisible = _ref.isVisible,
662
+ color = _ref.color,
663
+ onClick = _ref.onClick,
664
+ _ref$style = _ref.style,
665
+ style = _ref$style === void 0 ? {} : _ref$style,
666
+ buttonRef = _ref.buttonRef;
667
+ return React__default.createElement(reactComponents.Tooltip, {
668
+ content: label,
669
+ relationship: "label"
670
+ }, React__default.createElement(reactComponents.Button, {
671
+ ref: buttonRef,
672
+ shape: "circular",
673
+ size: "small",
674
+ appearance: isVisible ? 'primary' : 'outline',
675
+ onClick: onClick,
676
+ style: _extends({
677
+ backgroundColor: isVisible ? color : 'transparent',
678
+ color: isVisible ? '#fff' : reactComponents.tokens.colorNeutralForeground1,
679
+ borderColor: color,
680
+ borderWidth: 1,
681
+ width: '100px',
682
+ padding: '4px 8px',
683
+ textAlign: 'center'
684
+ }, style)
685
+ }, React__default.createElement(reactComponents.Caption1, {
686
+ as: "span",
1064
687
  style: {
1065
- fill: reactComponents.tokens.colorBrandBackground
1066
- },
1067
- points: "583.634,1185.919 581.366,1181.462 723.336,1109.231 869.748,909.808 1003.791,1050.114 1141.593,912.312 1275.235,928.549 1409.365,774.548 1413.135,777.833 1277.265,933.832 1143.407,917.569 1003.709,1057.267 870.251,917.573 726.664,1113.149"
1068
- })), React__default.createElement("rect", {
1069
- x: "796.336",
1070
- y: "662.857",
688
+ display: 'block',
689
+ overflow: 'hidden',
690
+ textOverflow: 'ellipsis',
691
+ whiteSpace: 'nowrap',
692
+ lineHeight: '1.25'
693
+ }
694
+ }, label)));
695
+ };
696
+
697
+ var styles = {
698
+ wrapper: /*#__PURE__*/css.css({
699
+ display: 'flex',
700
+ flexWrap: 'nowrap',
701
+ overflow: 'hidden',
702
+ justifyContent: 'center',
703
+ gap: 10,
704
+ padding: 2,
705
+ width: '100%',
706
+ boxSizing: 'border-box'
707
+ })
708
+ };
709
+ function LegendContainer(props) {
710
+ var containerRef = props.containerRef,
711
+ visibleItems = props.visibleItems,
712
+ overflowItems = props.overflowItems,
713
+ visibleLabels = props.visibleLabels,
714
+ toggleLabel = props.toggleLabel,
715
+ renderLabel = props.renderLabel,
716
+ getColor = props.getColor;
717
+ return React__default.createElement(Stack, {
718
+ justifyContent: "center",
719
+ alignItems: "center",
720
+ marginLeft: "10px",
721
+ marginRight: "10px",
722
+ marginTop: "25px",
723
+ marginBottom: "20px"
724
+ }, React__default.createElement("div", {
725
+ ref: containerRef,
726
+ className: styles.wrapper
727
+ }, visibleItems.map(function (item) {
728
+ var label = item.label;
729
+ var isVisible = visibleLabels.length === 0 || visibleLabels.includes(label);
730
+ return React__default.createElement(LegendButton, {
731
+ key: label,
732
+ label: renderLabel(item),
733
+ color: getColor(item),
734
+ isVisible: isVisible,
735
+ onClick: function onClick() {
736
+ return toggleLabel(label);
737
+ }
738
+ });
739
+ }), overflowItems.length > 0 && React__default.createElement(reactComponents.Menu, null, React__default.createElement(reactComponents.MenuTrigger, {
740
+ disableButtonEnhancement: true
741
+ }, React__default.createElement(reactComponents.MenuButton, {
742
+ size: "small",
743
+ appearance: "transparent"
744
+ }, "+", overflowItems.length)), React__default.createElement(reactComponents.MenuPopover, {
1071
745
  style: {
1072
- fill: reactComponents.tokens.colorBrandBackground
746
+ minWidth: 'fit-content',
747
+ maxWidth: '200px'
748
+ }
749
+ }, React__default.createElement(reactComponents.MenuList, null, overflowItems.map(function (item) {
750
+ var label = item.label;
751
+ var isVisible = visibleLabels.length === 0 || visibleLabels.includes(label);
752
+ return React__default.createElement(reactComponents.MenuItem, {
753
+ key: label,
754
+ style: {
755
+ padding: 0
756
+ }
757
+ }, React__default.createElement(LegendButton, {
758
+ label: renderLabel(item),
759
+ color: getColor(item),
760
+ isVisible: isVisible,
761
+ onClick: function onClick() {
762
+ return toggleLabel(label);
763
+ },
764
+ style: {
765
+ width: '100px',
766
+ textAlign: 'left'
767
+ }
768
+ }));
769
+ }))))));
770
+ }
771
+
772
+ /**
773
+ * Lightens a given hex color by a percentage amount (0 to 1).
774
+ */
775
+ var lightenColor = function lightenColor(hex, amount) {
776
+ if (!/^#?[0-9A-Fa-f]{6}$/.test(hex)) return hex;
777
+ if (hex.startsWith('#')) hex = hex.slice(1);
778
+ var r = parseInt(hex.slice(0, 2), 16);
779
+ var g = parseInt(hex.slice(2, 4), 16);
780
+ var b = parseInt(hex.slice(4, 6), 16);
781
+ r = Math.min(255, Math.floor(r + (255 - r) * amount));
782
+ g = Math.min(255, Math.floor(g + (255 - g) * amount));
783
+ b = Math.min(255, Math.floor(b + (255 - b) * amount));
784
+ var toHex = function toHex(v) {
785
+ return v.toString(16).padStart(2, '0');
786
+ };
787
+ return "#" + toHex(r) + toHex(g) + toHex(b);
788
+ };
789
+ var getFluentPalette = function getFluentPalette(_theme) {
790
+ return ['#4e79a7', '#f28e2c', '#e15759', '#76b7b2', '#59a14f', '#edc949', '#af7aa1', '#ff9da7', '#9c755f', '#bab0ab', '#8cd17d', '#b6992d', '#d37295', '#fabfd2', '#79706e'];
791
+ };
792
+ /**
793
+ * Smart Fluent tooltip generator with chart-type awareness.
794
+ */
795
+ function createFluentTooltip(theme) {
796
+ var fontFamily = theme.fontFamilyBase;
797
+ var fontSize = parseInt(theme.fontSizeBase200.replace('px', '')) || 14;
798
+ var tooltipBg = theme.colorNeutralBackground1;
799
+ var tooltipTitleColor = theme.colorNeutralForeground1;
800
+ var tooltipBodyColor = theme.colorNeutralForeground2;
801
+ var borderColor = theme.colorNeutralStroke2;
802
+ var callbacks = {
803
+ title: function title(context) {
804
+ var _context$0$label, _context$;
805
+ return (_context$0$label = (_context$ = context[0]) == null ? void 0 : _context$.label) != null ? _context$0$label : '';
1073
806
  },
1074
- width: "418.333",
1075
- height: "5"
1076
- }), React__default.createElement("rect", {
1077
- x: "937.543",
1078
- y: "717.857",
1079
- style: {
1080
- fill: reactComponents.tokens.colorBrandBackground
807
+ label: function label(item) {
808
+ var datasetLabel = 'label' in item.dataset && typeof item.dataset.label === 'string' ? item.dataset.label : 'Value';
809
+ var raw = item.raw;
810
+ // Bubble format { x, y, r }
811
+ if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw && 'r' in raw) {
812
+ var x = raw.x,
813
+ y = raw.y,
814
+ r = raw.r;
815
+ return datasetLabel + " \u2014 x: " + x + ", y: " + y + ", r: " + r;
816
+ }
817
+ // Scatter format { x, y }
818
+ if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw) {
819
+ var _x = raw.x,
820
+ _y = raw.y;
821
+ return datasetLabel + " \u2014 x: " + _x + ", y: " + _y;
822
+ }
823
+ // Floating bar [min, max]
824
+ if (Array.isArray(raw) && raw.length === 2) {
825
+ var min = raw[0],
826
+ max = raw[1];
827
+ return datasetLabel + ": " + min + " \u2013 " + max;
828
+ }
829
+ // Default: single number or string
830
+ return datasetLabel + ": " + raw;
1081
831
  },
1082
- width: "135.92",
1083
- height: "5"
1084
- })), React__default.createElement("g", null, React__default.createElement("g", null, React__default.createElement("rect", {
1085
- x: "264.978",
1086
- y: "441.049",
1087
- style: {
1088
- fill: reactComponents.tokens.colorNeutralBackground1
832
+ beforeTitle: function beforeTitle() {
833
+ return '';
1089
834
  },
1090
- width: "482.581",
1091
- height: "379.067"
1092
- }), React__default.createElement("path", {
1093
- style: {
1094
- fill: reactComponents.tokens.colorNeutralStroke1
835
+ afterTitle: function afterTitle() {
836
+ return '';
1095
837
  },
1096
- d: "M750.06,822.616H262.478V438.549H750.06V822.616z M267.478,817.616H745.06V443.549H267.478V817.616z"
1097
- })), React__default.createElement("g", null, React__default.createElement("g", null, React__default.createElement("rect", {
1098
- x: "330.537",
1099
- y: "503.15",
1100
- style: {
1101
- fill: reactComponents.tokens.colorNeutralForeground3,
1102
- opacity: 0.3
838
+ beforeBody: function beforeBody() {
839
+ return '';
1103
840
  },
1104
- width: "108.842",
1105
- height: "61.633"
1106
- }), React__default.createElement("g", null, React__default.createElement("rect", {
1107
- x: "485.277",
1108
- y: "509.093",
1109
- style: {
1110
- fill: reactComponents.tokens.colorBrandBackground
841
+ afterBody: function afterBody() {
842
+ return '';
1111
843
  },
1112
- width: "198.014",
1113
- height: "2.623"
1114
- }), React__default.createElement("rect", {
1115
- x: "485.277",
1116
- y: "532.656",
1117
- style: {
1118
- fill: reactComponents.tokens.colorNeutralForeground3,
1119
- opacity: 0.3
844
+ beforeLabel: function beforeLabel() {
845
+ return '';
1120
846
  },
1121
- width: "198.014",
1122
- height: "2.623"
1123
- }), React__default.createElement("rect", {
1124
- x: "485.277",
1125
- y: "556.218",
1126
- style: {
1127
- fill: reactComponents.tokens.colorNeutralForeground3,
1128
- opacity: 0.3
847
+ afterLabel: function afterLabel() {
848
+ return '';
1129
849
  },
1130
- width: "198.014",
1131
- height: "2.623"
1132
- }))), React__default.createElement("g", null, React__default.createElement("g", null, React__default.createElement("rect", {
1133
- x: "381.691",
1134
- y: "687.747",
1135
- style: {
1136
- fill: reactComponents.tokens.colorNeutralForeground3,
1137
- opacity: 0.3
850
+ labelColor: function labelColor() {
851
+ return undefined;
1138
852
  },
1139
- width: "22.73",
1140
- height: "70.417"
1141
- }), React__default.createElement("rect", {
1142
- x: "404.421",
1143
- y: "653.482",
1144
- style: {
1145
- fill: reactComponents.tokens.colorBrandBackground
853
+ labelTextColor: function labelTextColor() {
854
+ return '';
1146
855
  },
1147
- width: "22.73",
1148
- height: "104.682"
1149
- })), React__default.createElement("g", null, React__default.createElement("rect", {
1150
- x: "466.491",
1151
- y: "641.634",
1152
- style: {
1153
- fill: reactComponents.tokens.colorNeutralForeground3,
1154
- opacity: 0.3
856
+ footer: function footer() {
857
+ return '';
1155
858
  },
1156
- width: "22.73",
1157
- height: "116.089"
1158
- }), React__default.createElement("rect", {
1159
- x: "489.221",
1160
- y: "714.758",
1161
- style: {
1162
- fill: reactComponents.tokens.colorBrandBackground
859
+ beforeFooter: function beforeFooter() {
860
+ return '';
1163
861
  },
1164
- width: "22.73",
1165
- height: "42.965"
1166
- }))))));
1167
- };
1168
-
1169
- var NoDashboards = function NoDashboards(props) {
1170
- var height = props.height;
1171
- return React.createElement(React.Fragment, null, React.createElement(Stack, {
1172
- style: {
1173
- height: height || "100%"
862
+ afterFooter: function afterFooter() {
863
+ return '';
1174
864
  },
1175
- justifyContent: "Center",
1176
- alignItems: "Center"
1177
- }, React.createElement(BusinessReportIcon, {
1178
- width: 200,
1179
- height: 200
1180
- }), React.createElement(reactComponents.Text, {
1181
- size: 500,
1182
- weight: 'semibold'
1183
- }, "No Dashboards Available")));
1184
- };
1185
-
1186
- var useRenderLabelStyles = /*#__PURE__*/reactComponents.makeStyles({
1187
- labelContainer: /*#__PURE__*/_extends({
1188
- display: "flex",
1189
- flexDirection: "row",
1190
- justifyContent: "flex-start",
1191
- alignItems: "center"
1192
- }, /*#__PURE__*/reactComponents.shorthands.gap("6px")),
1193
- iconStyles: {
1194
- width: "26px"
1195
- },
1196
- item: {
1197
- paddingLeft: "15px"
1198
- }
1199
- });
1200
-
1201
- var RenderLabel = function RenderLabel(props) {
1202
- var label = props.label,
1203
- icon = props.icon,
1204
- isRequired = props.isRequired;
1205
- var styles = useRenderLabelStyles();
1206
- return React.createElement(React.Fragment, null, React.createElement("div", {
1207
- className: styles.labelContainer
1208
- }, icon && React.isValidElement(icon) ? icon : React.createElement(react.Icon, {
1209
- icon: icon,
1210
- className: styles.iconStyles,
1211
- width: "20px",
1212
- height: "20px",
1213
- color: reactComponents.tokens.colorBrandForeground1
1214
- }), React.createElement(reactComponents.Caption1, {
1215
- style: {
1216
- color: reactComponents.tokens.colorBrandForeground1
1217
- }
1218
- }, label), React.createElement(reactComponents.Caption1, {
1219
- style: {
1220
- color: reactComponents.tokens.colorPaletteRedForeground1
865
+ labelPointStyle: function labelPointStyle() {
866
+ return {
867
+ pointStyle: 'circle',
868
+ rotation: 0,
869
+ radius: 5
870
+ };
1221
871
  }
1222
- }, isRequired ? " *" : "")));
1223
- };
1224
-
1225
- var _templateObject$1, _templateObject2$1, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
1226
- var useStyles = function useStyles() {
872
+ };
1227
873
  return {
1228
- gridContainer: css.css(_templateObject$1 || (_templateObject$1 = _taggedTemplateLiteralLoose(["\n display: grid;\n gap: 4px;\n padding: 8px;\n justify-content: center;\n "]))),
1229
- cell: css.css(_templateObject2$1 || (_templateObject2$1 = _taggedTemplateLiteralLoose(["\n width: 30px;\n height: 30px;\n border: 1px solid ", ";\n background-color: ", ";\n cursor: pointer;\n transition: background-color 150ms ease, transform 150ms ease;\n will-change: background-color, transform;\n "])), reactComponents.tokens.colorNeutralStroke1, reactComponents.tokens.colorNeutralBackground1),
1230
- hoveredCell: css.css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteralLoose(["\n background-color: ", ";\n transform: scale(1.05);\n "])), reactComponents.tokens.colorNeutralBackground1Hover),
1231
- selectedCell: css.css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteralLoose(["\n background-color: ", ";\n "])), reactComponents.tokens.colorNeutralBackground1Selected),
1232
- menuPopover: css.css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteralLoose(["\n min-width: fit-content;\n "]))),
1233
- bottomText: css.css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteralLoose(["\n padding-left: 8px;\n padding-right: 8px;\n "])))
874
+ enabled: true,
875
+ displayColors: true,
876
+ boxWidth: 10,
877
+ boxHeight: 10,
878
+ boxPadding: 5,
879
+ backgroundColor: tooltipBg,
880
+ borderColor: borderColor,
881
+ borderWidth: 1,
882
+ cornerRadius: 4,
883
+ padding: 10,
884
+ titleColor: tooltipTitleColor,
885
+ bodyColor: tooltipBodyColor,
886
+ titleFont: {
887
+ family: fontFamily,
888
+ size: fontSize
889
+ },
890
+ bodyFont: {
891
+ family: fontFamily,
892
+ size: fontSize
893
+ },
894
+ callbacks: callbacks
895
+ };
896
+ }
897
+ /**
898
+ * Returns a Chart.js ticks callback to truncate long labels and add optional prefix/suffix.
899
+ */
900
+ var createAxisLabelFormatter = function createAxisLabelFormatter(_ref) {
901
+ var _ref$maxLength = _ref.maxLength,
902
+ maxLength = _ref$maxLength === void 0 ? 12 : _ref$maxLength,
903
+ _ref$suffix = _ref.suffix,
904
+ suffix = _ref$suffix === void 0 ? '' : _ref$suffix,
905
+ _ref$prefix = _ref.prefix,
906
+ prefix = _ref$prefix === void 0 ? '' : _ref$prefix;
907
+ return function (value) {
908
+ var label = typeof value === 'number' ? this.getLabelForValue(value) : String(value);
909
+ var trimmed = label.length > maxLength ? label.slice(0, maxLength) + '…' : label;
910
+ return "" + prefix + trimmed + suffix;
1234
911
  };
1235
912
  };
1236
- var SelectZoom = function SelectZoom(props) {
1237
- var onChange = props.onChange,
1238
- defaultValues = props.values,
1239
- maxCols = props.maxCols,
1240
- maxRows = props.maxRows;
1241
- var Settings = reactIcons.bundleIcon(reactIcons.Settings20Filled, reactIcons.Settings20Regular);
1242
- var styles = useStyles();
1243
- var _React$useState = React.useState(defaultValues),
1244
- values = _React$useState[0],
1245
- setValues = _React$useState[1];
1246
- var _React$useState2 = React.useState(null),
1247
- hovered = _React$useState2[0],
1248
- setHovered = _React$useState2[1];
1249
- var _React$useState3 = React.useState(false),
1250
- open = _React$useState3[0],
1251
- setOpen = _React$useState3[1];
1252
- React.useEffect(function () {
1253
- setValues(defaultValues);
1254
- }, [defaultValues]);
1255
- var onOpenChange = function onOpenChange(_, data) {
1256
- setOpen(data.open);
1257
- setHovered(null);
913
+ function debounce(fn, delay) {
914
+ var timer = null;
915
+ return function () {
916
+ var _this = this;
917
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
918
+ args[_key] = arguments[_key];
919
+ }
920
+ if (timer) clearTimeout(timer);
921
+ timer = setTimeout(function () {
922
+ return fn.apply(_this, args);
923
+ }, delay);
1258
924
  };
1259
- var handleCellClick = function handleCellClick(row, col) {
1260
- var newValues = {
1261
- spanCols: col + 1,
1262
- spanRows: row + 1
925
+ }
926
+ /**
927
+ * useChartUtils — shared theming and chart helpers.
928
+ */
929
+ function useChartUtils(theme) {
930
+ return React.useMemo(function () {
931
+ return {
932
+ lightenColor: lightenColor,
933
+ getFluentPalette: getFluentPalette,
934
+ createFluentTooltip: createFluentTooltip,
935
+ createAxisLabelFormatter: createAxisLabelFormatter,
936
+ debounce: debounce
1263
937
  };
1264
- setValues(newValues);
1265
- onChange == null || onChange(newValues);
1266
- setOpen(false);
1267
- };
1268
- var handleCellHover = function handleCellHover(row, col) {
1269
- setHovered({
1270
- spanCols: col + 1,
1271
- spanRows: row + 1
1272
- });
1273
- };
1274
- var handleMouseLeave = function handleMouseLeave() {
1275
- setHovered(null);
1276
- };
1277
- var renderGridCells = function renderGridCells() {
1278
- var cells = [];
1279
- var _loop = function _loop(row) {
1280
- var _loop2 = function _loop2(col) {
1281
- var isSelected = row < values.spanRows && col < values.spanCols;
1282
- var isHovered = hovered && row < hovered.spanRows && col < hovered.spanCols;
1283
- cells.push(React.createElement("div", {
1284
- key: row + "-" + col,
1285
- className: styles.cell + " " + (isHovered ? styles.hoveredCell : "") + " " + (isSelected ? styles.selectedCell : ""),
1286
- onMouseEnter: function onMouseEnter() {
1287
- return handleCellHover(row, col);
1288
- },
1289
- onClick: function onClick() {
1290
- return handleCellClick(row, col);
1291
- }
1292
- }));
1293
- };
1294
- for (var col = 0; col < maxCols; col++) {
1295
- _loop2(col);
1296
- }
938
+ }, [theme]);
939
+ }
940
+
941
+ var BUTTON_WIDTH = 100;
942
+ var GAP = 10;
943
+ function useResponsiveLegend(items) {
944
+ var containerRef = React.useRef(null);
945
+ var _useState = React.useState(items.length),
946
+ maxVisible = _useState[0],
947
+ setMaxVisible = _useState[1];
948
+ var _useChartUtils = useChartUtils(),
949
+ debounce = _useChartUtils.debounce;
950
+ React.useEffect(function () {
951
+ var measure = function measure() {
952
+ var _containerRef$current, _containerRef$current2;
953
+ var containerWidth = (_containerRef$current = (_containerRef$current2 = containerRef.current) == null ? void 0 : _containerRef$current2.offsetWidth) != null ? _containerRef$current : 0;
954
+ var itemTotalWidth = BUTTON_WIDTH + GAP;
955
+ var count = Math.floor(containerWidth / itemTotalWidth);
956
+ setMaxVisible(count);
1297
957
  };
1298
- for (var row = 0; row < maxRows; row++) {
1299
- _loop(row);
1300
- }
1301
- return cells;
958
+ var debouncedMeasure = debounce(measure, 100); // debounce resize
959
+ var observer = new resizeObserver.ResizeObserver(debouncedMeasure);
960
+ if (containerRef.current) observer.observe(containerRef.current);
961
+ measure(); // initial
962
+ return function () {
963
+ return observer.disconnect();
964
+ };
965
+ }, [items]);
966
+ return {
967
+ containerRef: containerRef,
968
+ visibleItems: items.slice(0, maxVisible),
969
+ overflowItems: items.slice(maxVisible)
1302
970
  };
1303
- // Compute popover width dynamically
1304
- var popoverWidth = React.useMemo(function () {
1305
- return 30 * maxCols + 4 * (maxCols - 1) + 32;
1306
- }, [maxCols]); // 30px for each cell, 4px gap, and 32px padding (16 left and right)
1307
- return React.createElement(reactComponents.Menu, {
1308
- open: open,
1309
- onOpenChange: onOpenChange
1310
- }, React.createElement(reactComponents.MenuTrigger, {
1311
- disableButtonEnhancement: true
1312
- }, React.createElement(reactComponents.Tooltip, {
1313
- content: "Configure",
1314
- relationship: "label"
1315
- }, React.createElement(reactComponents.MenuButton, {
1316
- icon: React.createElement(Settings, null),
1317
- size: "small",
1318
- appearance: "transparent"
1319
- }))), React.createElement(reactComponents.MenuPopover, {
1320
- style: {
1321
- width: popoverWidth + "px",
1322
- minWidth: "120px",
1323
- padding: 8
1324
- }
1325
- }, React.createElement("div", {
1326
- style: {
1327
- display: "flex",
1328
- flexDirection: "row",
1329
- alignItems: "center",
1330
- gap: "6px",
1331
- width: "100%",
1332
- boxSizing: "border-box",
1333
- padding: "8px"
1334
- }
1335
- }, React.createElement(RenderLabel, {
1336
- label: "Selected Span (" + values.spanCols + " \xD7 " + values.spanRows + ")",
1337
- icon: React.createElement(react.Icon, {
1338
- icon: "fluent:number-row-20-regular",
1339
- width: "32",
1340
- height: "32"
1341
- })
1342
- })), React.createElement("div", {
1343
- className: styles.gridContainer,
1344
- style: {
1345
- gridTemplateColumns: "repeat(" + maxCols + ", 30px)",
1346
- gridTemplateRows: "repeat(" + maxRows + ", 30px)"
971
+ }
972
+
973
+ var RenderLegend = function RenderLegend(_ref) {
974
+ var data = _ref.data,
975
+ visibleSeries = _ref.visibleSeries,
976
+ seriesColors = _ref.seriesColors,
977
+ toggleSeries = _ref.toggleSeries;
978
+ var _useResponsiveLegend = useResponsiveLegend(data),
979
+ containerRef = _useResponsiveLegend.containerRef,
980
+ visibleItems = _useResponsiveLegend.visibleItems,
981
+ overflowItems = _useResponsiveLegend.overflowItems;
982
+ return React__default.createElement(LegendContainer, {
983
+ containerRef: containerRef,
984
+ visibleItems: visibleItems,
985
+ overflowItems: overflowItems,
986
+ items: data,
987
+ visibleLabels: visibleSeries,
988
+ toggleLabel: toggleSeries,
989
+ renderLabel: function renderLabel(d) {
990
+ return d.label;
1347
991
  },
1348
- onMouseLeave: handleMouseLeave
1349
- }, renderGridCells()), React.createElement(reactComponents.Caption1, {
1350
- className: styles.bottomText
1351
- }, "Click to set span")));
992
+ getColor: function getColor(d) {
993
+ return seriesColors[d.label];
994
+ }
995
+ });
996
+ };
997
+
998
+ var _templateObject$1, _templateObject2$1;
999
+ var useGraphGlobalStyles = function useGraphGlobalStyles() {
1000
+ return {
1001
+ chartWithLegend: css.css({
1002
+ display: 'flex',
1003
+ flexDirection: 'column',
1004
+ height: '100%',
1005
+ chartArea: {
1006
+ flexGrow: 1,
1007
+ minHeight: 0
1008
+ }
1009
+ }),
1010
+ chartArea: css.css(_templateObject$1 || (_templateObject$1 = _taggedTemplateLiteralLoose(["\n flex-grow: 1;\n min-height: 0;\n "]))),
1011
+ legendArea: css.css(_templateObject2$1 || (_templateObject2$1 = _taggedTemplateLiteralLoose(["\n margin-top: 0px;\n padding-top: 0px;\n \n margin-Left: 10px;\n margin-Right: 10px;\n \n "])))
1012
+ };
1352
1013
  };
1353
1014
 
1354
1015
  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);
@@ -1424,7 +1085,169 @@ function AreaChart(_ref) {
1424
1085
  };
1425
1086
  })
1426
1087
  };
1427
- }, [data, visibleSeries, allCategories, getPrimary, getSecondary, seriesColors]);
1088
+ }, [data, visibleSeries, allCategories, getPrimary, getSecondary, seriesColors]);
1089
+ var _useMemo = React.useMemo(function () {
1090
+ return {
1091
+ fontFamily: theme.fontFamilyBase,
1092
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
1093
+ labelColor: theme.colorNeutralForeground1,
1094
+ gridColor: theme.colorNeutralStroke2
1095
+ };
1096
+ }, [theme]),
1097
+ fontFamily = _useMemo.fontFamily,
1098
+ fontSize = _useMemo.fontSize,
1099
+ labelColor = _useMemo.labelColor,
1100
+ gridColor = _useMemo.gridColor;
1101
+ var options = React.useMemo(function () {
1102
+ return {
1103
+ responsive: true,
1104
+ maintainAspectRatio: false,
1105
+ plugins: {
1106
+ title: {
1107
+ display: !!title,
1108
+ text: title,
1109
+ font: {
1110
+ size: 14,
1111
+ family: theme.fontFamilyBase,
1112
+ weight: theme.fontWeightSemibold
1113
+ },
1114
+ color: theme.colorNeutralForeground1,
1115
+ padding: {
1116
+ top: 20,
1117
+ bottom: 20
1118
+ }
1119
+ },
1120
+ datalabels: {
1121
+ display: showDatalabels,
1122
+ color: theme.colorNeutralForeground1,
1123
+ font: {
1124
+ family: theme.fontFamilyBase,
1125
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1126
+ }
1127
+ },
1128
+ legend: {
1129
+ display: false
1130
+ },
1131
+ tooltip: createFluentTooltip(theme)
1132
+ },
1133
+ scales: {
1134
+ x: {
1135
+ stacked: stacked,
1136
+ ticks: {
1137
+ color: labelColor,
1138
+ font: {
1139
+ family: fontFamily,
1140
+ size: fontSize
1141
+ }
1142
+ },
1143
+ grid: {
1144
+ color: gridColor
1145
+ }
1146
+ },
1147
+ y: {
1148
+ stacked: stacked,
1149
+ ticks: {
1150
+ color: labelColor,
1151
+ font: {
1152
+ family: fontFamily,
1153
+ size: fontSize
1154
+ }
1155
+ },
1156
+ grid: {
1157
+ color: gridColor
1158
+ }
1159
+ }
1160
+ }
1161
+ };
1162
+ }, [title, showDatalabels, theme, fontFamily, fontSize, labelColor, gridColor, stacked, createFluentTooltip]);
1163
+ return React__default.createElement("div", {
1164
+ className: styles.chartWithLegend
1165
+ }, React__default.createElement("div", {
1166
+ className: styles.chartArea
1167
+ }, React__default.createElement(reactChartjs2.Line, {
1168
+ data: chartData,
1169
+ options: options
1170
+ })), React__default.createElement(RenderLegend, {
1171
+ data: data,
1172
+ visibleSeries: visibleSeries,
1173
+ seriesColors: seriesColors,
1174
+ toggleSeries: toggleSeries
1175
+ }));
1176
+ }
1177
+
1178
+ chart_js.Chart.register(chart_js.CategoryScale, chart_js.LinearScale, chart_js.BarElement, chart_js.Tooltip, chart_js.Legend, ChartDataLabels, chart_js.Title);
1179
+ function BarChart(_ref) {
1180
+ var data = _ref.data,
1181
+ getPrimary = _ref.getPrimary,
1182
+ getSecondary = _ref.getSecondary,
1183
+ title = _ref.title,
1184
+ _ref$showDatalabels = _ref.showDatalabels,
1185
+ showDatalabels = _ref$showDatalabels === void 0 ? false : _ref$showDatalabels,
1186
+ _ref$stacked = _ref.stacked,
1187
+ stacked = _ref$stacked === void 0 ? false : _ref$stacked,
1188
+ theme = _ref.theme;
1189
+ var _useState = React.useState(function () {
1190
+ var _data$;
1191
+ return data.length > 1 ? data.map(function (s) {
1192
+ return s.label;
1193
+ }) : [(_data$ = data[0]) == null ? void 0 : _data$.label];
1194
+ }),
1195
+ visibleSeries = _useState[0],
1196
+ setVisibleSeries = _useState[1];
1197
+ var _useChartUtils = useChartUtils(theme),
1198
+ lightenColor = _useChartUtils.lightenColor,
1199
+ getFluentPalette = _useChartUtils.getFluentPalette,
1200
+ createFluentTooltip = _useChartUtils.createFluentTooltip;
1201
+ var styles = useGraphGlobalStyles();
1202
+ var seriesColors = React.useMemo(function () {
1203
+ return data.reduce(function (acc, series, idx) {
1204
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
1205
+ var color = lightenColor(base, 0.3);
1206
+ acc[series.label] = color;
1207
+ return acc;
1208
+ }, {});
1209
+ }, [data]);
1210
+ var toggleSeries = function toggleSeries(label) {
1211
+ setVisibleSeries(function (prev) {
1212
+ var isVisible = prev.includes(label);
1213
+ var next = isVisible ? prev.filter(function (l) {
1214
+ return l !== label;
1215
+ }) : [].concat(prev, [label]);
1216
+ return next.length === 0 && data.length > 0 ? [data[0].label] : next;
1217
+ });
1218
+ };
1219
+ // Extract all unique x-axis categories (from all series)
1220
+ var allCategories = React.useMemo(function () {
1221
+ var categorySet = new Set();
1222
+ data.forEach(function (series) {
1223
+ series.data.forEach(function (datum) {
1224
+ categorySet.add(getPrimary(datum));
1225
+ });
1226
+ });
1227
+ return Array.from(categorySet);
1228
+ }, [data, getPrimary]);
1229
+ // Construct Chart.js datasets
1230
+ var chartData = React.useMemo(function () {
1231
+ return {
1232
+ labels: allCategories,
1233
+ datasets: data.filter(function (series) {
1234
+ return visibleSeries.includes(series.label);
1235
+ }).map(function (series) {
1236
+ return {
1237
+ label: series.label,
1238
+ backgroundColor: seriesColors[series.label],
1239
+ data: allCategories.map(function (cat) {
1240
+ var found = series.data.find(function (d) {
1241
+ return getPrimary(d) === cat;
1242
+ });
1243
+ return found ? getSecondary(found) : 0;
1244
+ }),
1245
+ // Assign y-axis based on series type when stacked
1246
+ yAxisID: stacked ? series.type === 'line' ? 'y1' : 'y' : 'y'
1247
+ };
1248
+ })
1249
+ };
1250
+ }, [data, visibleSeries, allCategories, seriesColors, stacked]);
1428
1251
  var _useMemo = React.useMemo(function () {
1429
1252
  return {
1430
1253
  fontFamily: theme.fontFamilyBase,
@@ -1469,10 +1292,13 @@ function AreaChart(_ref) {
1469
1292
  },
1470
1293
  tooltip: createFluentTooltip(theme)
1471
1294
  },
1472
- scales: {
1295
+ scales: _extends({
1473
1296
  x: {
1474
1297
  stacked: stacked,
1475
1298
  ticks: {
1299
+ callback: createAxisLabelFormatter({
1300
+ maxLength: 10
1301
+ }),
1476
1302
  color: labelColor,
1477
1303
  font: {
1478
1304
  family: fontFamily,
@@ -1484,8 +1310,13 @@ function AreaChart(_ref) {
1484
1310
  }
1485
1311
  },
1486
1312
  y: {
1313
+ type: 'linear',
1314
+ position: 'left',
1487
1315
  stacked: stacked,
1488
1316
  ticks: {
1317
+ callback: createAxisLabelFormatter({
1318
+ maxLength: 10
1319
+ }),
1489
1320
  color: labelColor,
1490
1321
  font: {
1491
1322
  family: fontFamily,
@@ -1496,22 +1327,42 @@ function AreaChart(_ref) {
1496
1327
  color: gridColor
1497
1328
  }
1498
1329
  }
1499
- }
1330
+ }, stacked && {
1331
+ y1: {
1332
+ type: 'linear',
1333
+ position: 'right',
1334
+ ticks: {
1335
+ callback: createAxisLabelFormatter({
1336
+ maxLength: 10
1337
+ }),
1338
+ color: labelColor,
1339
+ font: {
1340
+ family: fontFamily,
1341
+ size: fontSize
1342
+ }
1343
+ },
1344
+ grid: {
1345
+ drawOnChartArea: false
1346
+ }
1347
+ }
1348
+ })
1500
1349
  };
1501
1350
  }, [title, showDatalabels, theme, fontFamily, fontSize, labelColor, gridColor, stacked, createFluentTooltip]);
1502
1351
  return React__default.createElement("div", {
1503
1352
  className: styles.chartWithLegend
1504
1353
  }, React__default.createElement("div", {
1505
1354
  className: styles.chartArea
1506
- }, React__default.createElement(reactChartjs2.Line, {
1355
+ }, React__default.createElement(reactChartjs2.Bar, {
1507
1356
  data: chartData,
1508
1357
  options: options
1509
- })), React__default.createElement(RenderLegend, {
1358
+ })), React__default.createElement("div", {
1359
+ className: styles.legendArea
1360
+ }, React__default.createElement(RenderLegend, {
1510
1361
  data: data,
1511
1362
  visibleSeries: visibleSeries,
1512
1363
  seriesColors: seriesColors,
1513
1364
  toggleSeries: toggleSeries
1514
- }));
1365
+ })));
1515
1366
  }
1516
1367
 
1517
1368
  chart_js.Chart.register(chart_js.CategoryScale, chart_js.LinearScale, chart_js.BarElement, chart_js.Tooltip, chart_js.Legend, chart_js.Title, ChartDataLabels);
@@ -1828,6 +1679,180 @@ function BubbleChart(_ref) {
1828
1679
  }))));
1829
1680
  }
1830
1681
 
1682
+ chart_js.Chart.register(ChartDataLabels);
1683
+ 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);
1684
+ function ComboChart(_ref) {
1685
+ var data = _ref.data,
1686
+ getPrimary = _ref.getPrimary,
1687
+ getSecondary = _ref.getSecondary,
1688
+ title = _ref.title,
1689
+ _ref$showDataLabels = _ref.showDataLabels,
1690
+ showDataLabels = _ref$showDataLabels === void 0 ? false : _ref$showDataLabels,
1691
+ _ref$theme = _ref.theme,
1692
+ theme = _ref$theme === void 0 ? reactComponents.webLightTheme : _ref$theme;
1693
+ var _useState = React.useState(function () {
1694
+ return data.map(function (s) {
1695
+ return s.label;
1696
+ });
1697
+ }),
1698
+ visibleSeries = _useState[0],
1699
+ setVisibleSeries = _useState[1];
1700
+ var styles = useGraphGlobalStyles();
1701
+ var _useChartUtils = useChartUtils(theme),
1702
+ lightenColor = _useChartUtils.lightenColor,
1703
+ getFluentPalette = _useChartUtils.getFluentPalette,
1704
+ createFluentTooltip = _useChartUtils.createFluentTooltip;
1705
+ var seriesColors = React.useMemo(function () {
1706
+ return data.reduce(function (acc, series, idx) {
1707
+ var base = getFluentPalette(theme)[idx % getFluentPalette(theme).length];
1708
+ acc[series.label] = lightenColor(base, 0.3);
1709
+ return acc;
1710
+ }, {});
1711
+ }, [data, theme]);
1712
+ var toggleSeries = function toggleSeries(label) {
1713
+ setVisibleSeries(function (prev) {
1714
+ var isVisible = prev.includes(label);
1715
+ var next = isVisible ? prev.filter(function (l) {
1716
+ return l !== label;
1717
+ }) : [].concat(prev, [label]);
1718
+ return next.length === 0 ? [data[0].label] : next;
1719
+ });
1720
+ };
1721
+ var allCategories = React.useMemo(function () {
1722
+ var set = new Set();
1723
+ data.forEach(function (series) {
1724
+ return series.data.forEach(function (d) {
1725
+ return set.add(getPrimary(d));
1726
+ });
1727
+ });
1728
+ return Array.from(set);
1729
+ }, [data, getPrimary]);
1730
+ var chartData = React.useMemo(function () {
1731
+ var sortedSeries = data.filter(function (series) {
1732
+ return visibleSeries.includes(series.label);
1733
+ }).sort(function (a, b) {
1734
+ // Ensure bars come before lines
1735
+ if (a.type === 'bar' && b.type === 'line') return -1;
1736
+ if (a.type === 'line' && b.type === 'bar') return 1;
1737
+ return 0;
1738
+ });
1739
+ return {
1740
+ labels: allCategories,
1741
+ datasets: sortedSeries.map(function (series) {
1742
+ var _series$yAxisID;
1743
+ return {
1744
+ type: series.type,
1745
+ label: series.label,
1746
+ yAxisID: (_series$yAxisID = series.yAxisID) != null ? _series$yAxisID : 'y',
1747
+ data: allCategories.map(function (cat) {
1748
+ var found = series.data.find(function (d) {
1749
+ return getPrimary(d) === cat;
1750
+ });
1751
+ return found ? getSecondary(found) : 0;
1752
+ }),
1753
+ backgroundColor: seriesColors[series.label],
1754
+ borderColor: seriesColors[series.label],
1755
+ fill: series.type === 'bar',
1756
+ tension: series.type === 'line' ? 0.4 : 0,
1757
+ pointRadius: series.type === 'line' ? 3 : 0,
1758
+ borderWidth: series.type === 'line' ? 2 : 1,
1759
+ order: series.type === 'bar' ? 1 : 0
1760
+ };
1761
+ })
1762
+ };
1763
+ }, [data, visibleSeries, allCategories, getPrimary, getSecondary, seriesColors]);
1764
+ var _useMemo = React.useMemo(function () {
1765
+ return {
1766
+ fontFamily: theme.fontFamilyBase,
1767
+ fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,
1768
+ labelColor: theme.colorNeutralForeground1,
1769
+ gridColor: theme.colorNeutralStroke2
1770
+ };
1771
+ }, [theme]),
1772
+ fontFamily = _useMemo.fontFamily,
1773
+ fontSize = _useMemo.fontSize,
1774
+ labelColor = _useMemo.labelColor,
1775
+ gridColor = _useMemo.gridColor;
1776
+ var options = React.useMemo(function () {
1777
+ return {
1778
+ responsive: true,
1779
+ maintainAspectRatio: false,
1780
+ plugins: {
1781
+ title: {
1782
+ display: !!title,
1783
+ text: title,
1784
+ font: {
1785
+ size: 14,
1786
+ family: theme.fontFamilyBase,
1787
+ weight: theme.fontWeightSemibold
1788
+ },
1789
+ color: theme.colorNeutralForeground1,
1790
+ padding: {
1791
+ top: 20,
1792
+ bottom: 20
1793
+ }
1794
+ },
1795
+ datalabels: {
1796
+ display: showDataLabels,
1797
+ color: theme.colorNeutralForeground1,
1798
+ font: {
1799
+ family: theme.fontFamilyBase,
1800
+ size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14
1801
+ }
1802
+ },
1803
+ legend: {
1804
+ display: false
1805
+ },
1806
+ tooltip: createFluentTooltip(theme)
1807
+ },
1808
+ scales: {
1809
+ x: {
1810
+ ticks: {
1811
+ color: labelColor,
1812
+ font: {
1813
+ family: fontFamily,
1814
+ size: fontSize
1815
+ }
1816
+ },
1817
+ grid: {
1818
+ color: gridColor
1819
+ }
1820
+ },
1821
+ y: {
1822
+ position: 'left',
1823
+ ticks: {
1824
+ color: labelColor,
1825
+ font: {
1826
+ family: fontFamily,
1827
+ size: fontSize
1828
+ }
1829
+ },
1830
+ grid: {
1831
+ color: gridColor
1832
+ },
1833
+ stacked: false
1834
+ }
1835
+ }
1836
+ };
1837
+ }, [title, showDataLabels, theme, fontFamily, fontSize, labelColor, gridColor, createFluentTooltip]);
1838
+ return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
1839
+ className: styles.chartWithLegend
1840
+ }, React__default.createElement("div", {
1841
+ className: styles.chartArea
1842
+ }, React__default.createElement(reactChartjs2.Chart, {
1843
+ type: "bar",
1844
+ data: chartData,
1845
+ options: options
1846
+ })), React__default.createElement("div", {
1847
+ className: styles.legendArea
1848
+ }, React__default.createElement(RenderLegend, {
1849
+ data: data,
1850
+ visibleSeries: visibleSeries,
1851
+ seriesColors: seriesColors,
1852
+ toggleSeries: toggleSeries
1853
+ }))));
1854
+ }
1855
+
1831
1856
  var RenderValueLegend = function RenderValueLegend(_ref) {
1832
1857
  var entries = _ref.entries,
1833
1858
  visibleLabels = _ref.visibleLabels,
@@ -3509,6 +3534,268 @@ var useDashboardStyles = function useDashboardStyles() {
3509
3534
  };
3510
3535
  };
3511
3536
 
3537
+ var CACHE = "application-cache";
3538
+ var openDatabase = /*#__PURE__*/function () {
3539
+ var _ref = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
3540
+ return _regenerator().w(function (_context) {
3541
+ while (1) switch (_context.n) {
3542
+ case 0:
3543
+ return _context.a(2, idb.openDB('app-cache-db', 1, {
3544
+ upgrade: function upgrade(db) {
3545
+ db.createObjectStore(CACHE);
3546
+ }
3547
+ }));
3548
+ }
3549
+ }, _callee);
3550
+ }));
3551
+ return function openDatabase() {
3552
+ return _ref.apply(this, arguments);
3553
+ };
3554
+ }();
3555
+ var getCachedData = /*#__PURE__*/function () {
3556
+ var _ref2 = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(key) {
3557
+ var db, cached;
3558
+ return _regenerator().w(function (_context2) {
3559
+ while (1) switch (_context2.n) {
3560
+ case 0:
3561
+ _context2.n = 1;
3562
+ return openDatabase();
3563
+ case 1:
3564
+ db = _context2.v;
3565
+ _context2.n = 2;
3566
+ return db.get(CACHE, key);
3567
+ case 2:
3568
+ cached = _context2.v;
3569
+ return _context2.a(2, cached ? cached.data : undefined);
3570
+ }
3571
+ }, _callee2);
3572
+ }));
3573
+ return function getCachedData(_x) {
3574
+ return _ref2.apply(this, arguments);
3575
+ };
3576
+ }();
3577
+ var setCachedData = /*#__PURE__*/function () {
3578
+ var _ref3 = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(key, data) {
3579
+ var db;
3580
+ return _regenerator().w(function (_context3) {
3581
+ while (1) switch (_context3.n) {
3582
+ case 0:
3583
+ _context3.n = 1;
3584
+ return openDatabase();
3585
+ case 1:
3586
+ db = _context3.v;
3587
+ _context3.n = 2;
3588
+ return db.put(CACHE, {
3589
+ data: data,
3590
+ timestamp: Date.now()
3591
+ }, key);
3592
+ case 2:
3593
+ return _context3.a(2);
3594
+ }
3595
+ }, _callee3);
3596
+ }));
3597
+ return function setCachedData(_x2, _x3) {
3598
+ return _ref3.apply(this, arguments);
3599
+ };
3600
+ }();
3601
+ var deleteCachedData = /*#__PURE__*/function () {
3602
+ var _ref4 = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(key) {
3603
+ var db;
3604
+ return _regenerator().w(function (_context4) {
3605
+ while (1) switch (_context4.n) {
3606
+ case 0:
3607
+ _context4.n = 1;
3608
+ return openDatabase();
3609
+ case 1:
3610
+ db = _context4.v;
3611
+ _context4.n = 2;
3612
+ return db["delete"](CACHE, key);
3613
+ case 2:
3614
+ return _context4.a(2);
3615
+ }
3616
+ }, _callee4);
3617
+ }));
3618
+ return function deleteCachedData(_x4) {
3619
+ return _ref4.apply(this, arguments);
3620
+ };
3621
+ }();
3622
+ var clearCache = /*#__PURE__*/function () {
3623
+ var _ref5 = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {
3624
+ var db;
3625
+ return _regenerator().w(function (_context5) {
3626
+ while (1) switch (_context5.n) {
3627
+ case 0:
3628
+ _context5.n = 1;
3629
+ return openDatabase();
3630
+ case 1:
3631
+ db = _context5.v;
3632
+ _context5.n = 2;
3633
+ return db.clear(CACHE);
3634
+ case 2:
3635
+ return _context5.a(2);
3636
+ }
3637
+ }, _callee5);
3638
+ }));
3639
+ return function clearCache() {
3640
+ return _ref5.apply(this, arguments);
3641
+ };
3642
+ }();
3643
+ var clearExpiredCache = /*#__PURE__*/function () {
3644
+ var _ref6 = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(maxAge) {
3645
+ var db, allKeys, now, _iterator, _step, key, cached;
3646
+ return _regenerator().w(function (_context6) {
3647
+ while (1) switch (_context6.n) {
3648
+ case 0:
3649
+ _context6.n = 1;
3650
+ return openDatabase();
3651
+ case 1:
3652
+ db = _context6.v;
3653
+ _context6.n = 2;
3654
+ return db.getAllKeys(CACHE);
3655
+ case 2:
3656
+ allKeys = _context6.v;
3657
+ now = Date.now();
3658
+ _iterator = _createForOfIteratorHelperLoose(allKeys);
3659
+ case 3:
3660
+ if ((_step = _iterator()).done) {
3661
+ _context6.n = 6;
3662
+ break;
3663
+ }
3664
+ key = _step.value;
3665
+ _context6.n = 4;
3666
+ return db.get(CACHE, key);
3667
+ case 4:
3668
+ cached = _context6.v;
3669
+ if (!(cached && now - cached.timestamp > maxAge)) {
3670
+ _context6.n = 5;
3671
+ break;
3672
+ }
3673
+ _context6.n = 5;
3674
+ return db["delete"](CACHE, key);
3675
+ case 5:
3676
+ _context6.n = 3;
3677
+ break;
3678
+ case 6:
3679
+ return _context6.a(2);
3680
+ }
3681
+ }, _callee6);
3682
+ }));
3683
+ return function clearExpiredCache(_x5) {
3684
+ return _ref6.apply(this, arguments);
3685
+ };
3686
+ }();
3687
+ var DEFAULT_MAX_AGE = 24 * 60 * 60 * 1000; // 1 day in milliseconds
3688
+ /**
3689
+ * Custom hook to manage IndexedDB cache with a specified maximum age.
3690
+ *
3691
+ * @template T - The type of data to be cached.
3692
+ * @param {number} [maxAge=DEFAULT_MAX_AGE] - The maximum age (in milliseconds) for cached data before it is considered expired.
3693
+ * @returns {UseIndexedDBCacheReturn<T>} An object containing methods to interact with the cache.
3694
+ *
3695
+ * @example
3696
+ * const { getData, setData, deleteData, clearAllCache } = useIndexedDBCache<MyDataType>(3600000);
3697
+ *
3698
+ * @function
3699
+ * @name useIndexedDBCache
3700
+ * @memberof hooks
3701
+ * @inner
3702
+ *
3703
+ * @typedef {Object} UseIndexedDBCacheReturn<T>
3704
+ * @property {function(string): Promise<T | undefined>} getData - Retrieves cached data by key.
3705
+ * @property {function(string, T): Promise<void>} setData - Caches data with a specified key.
3706
+ * @property {function(string): Promise<void>} deleteData - Deletes cached data by key.
3707
+ * @property {function(): Promise<void>} clearAllCache - Clears all cached data.
3708
+ */
3709
+ var useIndexedDBCache = function useIndexedDBCache(maxAge) {
3710
+ if (maxAge === void 0) {
3711
+ maxAge = DEFAULT_MAX_AGE;
3712
+ }
3713
+ React.useEffect(function () {
3714
+ // Clear expired cache on component mount
3715
+ _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7() {
3716
+ return _regenerator().w(function (_context7) {
3717
+ while (1) switch (_context7.n) {
3718
+ case 0:
3719
+ _context7.n = 1;
3720
+ return clearExpiredCache(maxAge);
3721
+ case 1:
3722
+ return _context7.a(2);
3723
+ }
3724
+ }, _callee7);
3725
+ }))();
3726
+ }, [maxAge]);
3727
+ var getData = /*#__PURE__*/function () {
3728
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(key) {
3729
+ return _regenerator().w(function (_context8) {
3730
+ while (1) switch (_context8.n) {
3731
+ case 0:
3732
+ _context8.n = 1;
3733
+ return getCachedData(key);
3734
+ case 1:
3735
+ return _context8.a(2, _context8.v);
3736
+ }
3737
+ }, _callee8);
3738
+ }));
3739
+ return function getData(_x6) {
3740
+ return _ref8.apply(this, arguments);
3741
+ };
3742
+ }();
3743
+ var setData = /*#__PURE__*/function () {
3744
+ var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9(key, data) {
3745
+ return _regenerator().w(function (_context9) {
3746
+ while (1) switch (_context9.n) {
3747
+ case 0:
3748
+ _context9.n = 1;
3749
+ return setCachedData(key, data);
3750
+ case 1:
3751
+ return _context9.a(2);
3752
+ }
3753
+ }, _callee9);
3754
+ }));
3755
+ return function setData(_x7, _x8) {
3756
+ return _ref9.apply(this, arguments);
3757
+ };
3758
+ }();
3759
+ var deleteData = /*#__PURE__*/function () {
3760
+ var _ref0 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0(key) {
3761
+ return _regenerator().w(function (_context0) {
3762
+ while (1) switch (_context0.n) {
3763
+ case 0:
3764
+ _context0.n = 1;
3765
+ return deleteCachedData(key);
3766
+ case 1:
3767
+ return _context0.a(2);
3768
+ }
3769
+ }, _callee0);
3770
+ }));
3771
+ return function deleteData(_x9) {
3772
+ return _ref0.apply(this, arguments);
3773
+ };
3774
+ }();
3775
+ var clearAllCache = /*#__PURE__*/function () {
3776
+ var _ref1 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee1() {
3777
+ return _regenerator().w(function (_context1) {
3778
+ while (1) switch (_context1.n) {
3779
+ case 0:
3780
+ _context1.n = 1;
3781
+ return clearCache();
3782
+ case 1:
3783
+ return _context1.a(2);
3784
+ }
3785
+ }, _callee1);
3786
+ }));
3787
+ return function clearAllCache() {
3788
+ return _ref1.apply(this, arguments);
3789
+ };
3790
+ }();
3791
+ return {
3792
+ getData: getData,
3793
+ setData: setData,
3794
+ deleteData: deleteData,
3795
+ clearAllCache: clearAllCache
3796
+ };
3797
+ };
3798
+
3512
3799
  var MINIMUM_DASHBOARD_WIDTH = 600;
3513
3800
  var MAX_ROWS = 4;
3514
3801
  var DASHBOARD_LAYOUT_CACHE_KEY = 'dashboard-layout-settings';
@@ -3526,11 +3813,11 @@ var Dashboard = function Dashboard(_ref) {
3526
3813
  var _useChartFactory = useChartFactory(),
3527
3814
  getChartComponent = _useChartFactory.getChartComponent;
3528
3815
  // Cache with 30-day expiration for dashboard layout settings
3529
- var _useIndexedDBCache = m365Hooks.useIndexedDBCache(CACHE_EXPIRATION_DAYS * 24 * 60 * 60 * 1000),
3816
+ var _useIndexedDBCache = useIndexedDBCache(CACHE_EXPIRATION_DAYS * 24 * 60 * 60 * 1000),
3530
3817
  getData = _useIndexedDBCache.getData,
3531
3818
  setData = _useIndexedDBCache.setData;
3532
3819
  // Cache for card order
3533
- var _useIndexedDBCache2 = m365Hooks.useIndexedDBCache(CACHE_EXPIRATION_DAYS * 24 * 60 * 60 * 1000),
3820
+ var _useIndexedDBCache2 = useIndexedDBCache(CACHE_EXPIRATION_DAYS * 24 * 60 * 60 * 1000),
3534
3821
  getOrderData = _useIndexedDBCache2.getData,
3535
3822
  setOrderData = _useIndexedDBCache2.setData;
3536
3823
  var _useState = React.useState([]),
@@ -3612,7 +3899,7 @@ var Dashboard = function Dashboard(_ref) {
3612
3899
  };
3613
3900
  }();
3614
3901
  initializeData();
3615
- }, [cardCharts, getData, getOrderData]);
3902
+ }, [cardCharts]); // Only depend on cardCharts - getData/getOrderData are stable
3616
3903
  // Save sizes to cache whenever they change
3617
3904
  React.useEffect(function () {
3618
3905
  var saveSizesToCache = /*#__PURE__*/function () {
@@ -3644,7 +3931,7 @@ var Dashboard = function Dashboard(_ref) {
3644
3931
  if (Object.keys(sizes).length > 0) {
3645
3932
  saveSizesToCache();
3646
3933
  }
3647
- }, [sizes, setData]);
3934
+ }, [sizes]); // Only depend on sizes - setData is stable
3648
3935
  // Save card order to cache whenever it changes
3649
3936
  React.useEffect(function () {
3650
3937
  var saveOrderToCache = /*#__PURE__*/function () {
@@ -3679,7 +3966,7 @@ var Dashboard = function Dashboard(_ref) {
3679
3966
  if (CardChartContainer.length > 0) {
3680
3967
  saveOrderToCache();
3681
3968
  }
3682
- }, [CardChartContainer, setOrderData]);
3969
+ }, [CardChartContainer]); // Only depend on CardChartContainer - setOrderData is stable
3683
3970
  React.useEffect(function () {
3684
3971
  if (containerWidth <= MINIMUM_DASHBOARD_WIDTH) {
3685
3972
  setSizes(function () {
@@ -3803,7 +4090,21 @@ var Dashboard = function Dashboard(_ref) {
3803
4090
  }, renderCards));
3804
4091
  };
3805
4092
 
4093
+ exports.AreaChart = AreaChart;
4094
+ exports.BarChart = BarChart;
4095
+ exports.BarHorizontalChart = BarHorizontalChart;
4096
+ exports.BubbleChart = BubbleChart;
4097
+ exports.ComboChart = ComboChart;
3806
4098
  exports.Dashboard = Dashboard;
4099
+ exports.DoughnutChart = DoughnutChart;
4100
+ exports.FloatingBarChart = FloatingBarChart;
4101
+ exports.LineChart = LineChart;
4102
+ exports.PieChart = PieChart;
4103
+ exports.PolarChart = PolarChart;
4104
+ exports.RadarChart = RadarChart;
4105
+ exports.ScatterChart = ScatterChart;
4106
+ exports.StackedLineChart = StackedLineChart;
4107
+ exports.SteamChart = SteamChart;
3807
4108
  exports.createAxisLabelFormatter = createAxisLabelFormatter;
3808
4109
  exports.createFluentTooltip = createFluentTooltip;
3809
4110
  exports.getFluentPalette = getFluentPalette;