@spteck/fluentui-react-charts 1.0.11 → 1.0.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"fluentui-react-charts.cjs.production.min.js","sources":["../src/components/svgImages/BusinessReportIcon.tsx","../src/components/stack/Stack.tsx","../src/components/dashboard/NoDashboards.tsx","../src/components/RenderLabel/useRenderLabelStylesStyles.ts","../src/components/RenderLabel/RenderLabel.tsx","../src/components/dashboard/selectZoom/SelectZoom.tsx","../src/components/legendeButton/LegendButton.tsx","../src/components/legendContainer/LegendContainer.tsx","../src/hooks/useChartUtils.tsx","../src/hooks/useResponsiveLegend.ts","../src/components/RenderLegend/RenderLegend.tsx","../src/graphGlobalStyles/useGraphGlobalStyles.ts","../src/charts/areaChart/AreaChart.tsx","../src/charts/BarChart/BarChart.tsx","../src/charts/barHorizontalChart/BarHotizontalChart.tsx","../src/charts/bubbleChart/BubbleChart.tsx","../src/charts/ComboChart/ComboChart.tsx","../src/components/renderValueLegend/RenderValueLegend.tsx","../src/charts/Doughnut/DoughnutChart.tsx","../src/charts/floatBarChart/FloatBarChart.tsx","../src/charts/lineChart/LineChart.tsx","../src/charts/PieChart/PieChart.tsx","../src/components/renderSliceLegend/RenderSliceLegend.tsx","../src/charts/polarChart/PolarChart.tsx","../src/charts/radarChart/RadarChart.tsx","../src/charts/scatterChart/ScatterChart.tsx","../src/charts/stackedLineChart/StackedLineChart.tsx","../src/charts/steamChart/SteamChart.tsx","../src/hooks/useChartFactory.tsx","../src/hooks/useIndexedDBCache.ts","../src/components/dashboard/DashBoard.tsx","../src/components/dashboard/useDashboardStyles.ts"],"sourcesContent":["import React from \"react\";\nimport { tokens } from \"@fluentui/react-components\";\n\ninterface BusinessReportIconProps {\n width?: number;\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const BusinessReportIcon: React.FC<BusinessReportIconProps> = ({\n width = 200,\n height = 200,\n className,\n style,\n}) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"200 400 1400 1000\"\n className={className}\n style={{\n fill: tokens.colorNeutralForeground2,\n ...style,\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g id=\"BACKGROUND\">\n <rect\n style={{ fill: tokens.colorNeutralBackground1 }}\n x=\"200\"\n y=\"400\"\n width=\"1400\"\n height=\"1000\"\n />\n </g>\n\n {/* Main chart/dashboard area */}\n <g>\n <g>\n <rect\n x=\"486.006\"\n y=\"568.026\"\n style={{ fill: tokens.colorNeutralBackground1 }}\n width=\"1038.994\"\n height=\"768.164\"\n />\n <path\n style={{ fill: tokens.colorNeutralStroke1 }}\n d=\"M1527.5,1338.69H483.506V565.526H1527.5V1338.69z M488.506,1333.69H1522.5V570.526H488.506V1333.69z\"\n />\n </g>\n <g>\n {/* Chart bars */}\n <rect\n x=\"558.003\"\n y=\"1086.698\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"164.492\"\n />\n <rect\n x=\"693.003\"\n y=\"1004.672\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"246.519\"\n />\n <rect\n x=\"828.003\"\n y=\"835.487\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"415.703\"\n />\n <rect\n x=\"963.003\"\n y=\"955.6\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"295.591\"\n />\n <rect\n x=\"1098.003\"\n y=\"825.238\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"425.952\"\n />\n <rect\n x=\"1233.003\"\n y=\"847.489\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"403.701\"\n />\n <rect\n x=\"1368.003\"\n y=\"699.989\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"551.201\"\n />\n {/* Chart line */}\n <polygon\n style={{ fill: tokens.colorBrandBackground }}\n 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\"\n />\n </g>\n {/* Chart grid lines */}\n <rect\n x=\"796.336\"\n y=\"662.857\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"418.333\"\n height=\"5\"\n />\n <rect\n x=\"937.543\"\n y=\"717.857\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"135.92\"\n height=\"5\"\n />\n </g>\n\n {/* Small chart on left */}\n <g>\n <g>\n <rect\n x=\"264.978\"\n y=\"441.049\"\n style={{ fill: tokens.colorNeutralBackground1 }}\n width=\"482.581\"\n height=\"379.067\"\n />\n <path\n style={{ fill: tokens.colorNeutralStroke1 }}\n d=\"M750.06,822.616H262.478V438.549H750.06V822.616z M267.478,817.616H745.06V443.549H267.478V817.616z\"\n />\n </g>\n <g>\n {/* Small chart elements */}\n <g>\n <rect\n x=\"330.537\"\n y=\"503.15\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"108.842\"\n height=\"61.633\"\n />\n <g>\n <rect\n x=\"485.277\"\n y=\"509.093\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"198.014\"\n height=\"2.623\"\n />\n <rect\n x=\"485.277\"\n y=\"532.656\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"198.014\"\n height=\"2.623\"\n />\n <rect\n x=\"485.277\"\n y=\"556.218\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"198.014\"\n height=\"2.623\"\n />\n </g>\n </g>\n {/* Bar chart elements */}\n <g>\n <g>\n <rect\n x=\"381.691\"\n y=\"687.747\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"22.73\"\n height=\"70.417\"\n />\n <rect\n x=\"404.421\"\n y=\"653.482\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"22.73\"\n height=\"104.682\"\n />\n </g>\n <g>\n <rect\n x=\"466.491\"\n y=\"641.634\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"22.73\"\n height=\"116.089\"\n />\n <rect\n x=\"489.221\"\n y=\"714.758\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"22.73\"\n height=\"42.965\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n};\n\nexport default BusinessReportIcon;\n","import { mergeClasses, tokens } from \"@fluentui/react-components\";\n\nimport { IStackProps } from \"./IStackProps\";\nimport React from \"react\";\nimport { css } from \"@emotion/css\";\n\n/**\n * Mapping of predefined sizes to Fluent UI tokens.\n */\nconst sizeMap: Record<string, string> = {\n xs: tokens.spacingHorizontalXS,\n s: tokens.spacingHorizontalS,\n m: tokens.spacingHorizontalM,\n l: tokens.spacingHorizontalL,\n xl: tokens.spacingHorizontalXL,\n xxl: tokens.spacingHorizontalXXL,\n};\n\n/**\n * Stack component provides a flexible layout using Flexbox.\n * It allows stacking child components either horizontally or vertically with predefined spacing options.\n */\nexport const Stack: React.FC<IStackProps> = React.memo(\n ({\n direction = \"vertical\",\n justifyContent = \"flex-start\",\n alignItems = \"stretch\",\n gap,\n columnGap,\n rowGap,\n margin,\n padding,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n width,\n height,\n wrap = false,\n children,\n style,\n className,\n overflow,\n background\n }) => {\n const stackStyle = css({\n display: \"flex\",\n flexDirection: direction === \"horizontal\" ? \"row\" : \"column\",\n justifyContent,\n alignItems,\n gap: gap && sizeMap[gap] ? sizeMap[gap] : gap,\n columnGap:\n columnGap && sizeMap[columnGap] ? sizeMap[columnGap] : columnGap,\n rowGap: rowGap && sizeMap[rowGap] ? sizeMap[rowGap] : rowGap,\n margin: margin && sizeMap[margin] ? sizeMap[margin] : margin,\n padding: padding && sizeMap[padding] ? sizeMap[padding] : padding,\n marginTop:\n marginTop && sizeMap[marginTop] ? sizeMap[marginTop] : marginTop,\n marginBottom:\n marginBottom && sizeMap[marginBottom]\n ? sizeMap[marginBottom]\n : marginBottom,\n marginLeft:\n marginLeft && sizeMap[marginLeft] ? sizeMap[marginLeft] : marginLeft,\n marginRight:\n marginRight && sizeMap[marginRight]\n ? sizeMap[marginRight]\n : marginRight,\n paddingTop:\n paddingTop && sizeMap[paddingTop] ? sizeMap[paddingTop] : paddingTop,\n paddingBottom:\n paddingBottom && sizeMap[paddingBottom]\n ? sizeMap[paddingBottom]\n : paddingBottom,\n paddingLeft:\n paddingLeft && sizeMap[paddingLeft]\n ? sizeMap[paddingLeft]\n : paddingLeft,\n paddingRight:\n paddingRight && sizeMap[paddingRight]\n ? sizeMap[paddingRight]\n : paddingRight,\n width,\n height,\n overflow,\n flexWrap: wrap ? \"wrap\" : \"nowrap\",\n backgroundColor: background,\n ...style,\n });\n\n return (\n <div className={mergeClasses(className, stackStyle)}>{children}</div>\n );\n }\n);\n\nStack.displayName = \"Stack\";\n\nexport default Stack;\n","import * as React from 'react';\n\nimport BusinessReportIcon from '../svgImages/BusinessReportIcon';\nimport Stack from '../stack/Stack';\nimport { Text } from '@fluentui/react-components';\n\nexport interface INoDashboardsProps {\n height?: string;\n}\n\nexport const NoDashboards: React.FunctionComponent<INoDashboardsProps> = (props: React.PropsWithChildren<INoDashboardsProps>) => {\n const { height } = props;\n\n return (\n <>\n <Stack\n style={{ height: height || \"100%\" }}\n justifyContent=\"Center\"\n alignItems=\"Center\"\n >\n <BusinessReportIcon width={200} height={200} />\n <Text size={500} weight='semibold'>No Dashboards Available</Text>\n </Stack>\n </>\n );\n};","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n makeStyles,\n shorthands,\n} from '@fluentui/react-components';\n\nexport const useRenderLabelStyles = makeStyles({\n\n labelContainer: {\n display: \"flex\",\n flexDirection: \"row\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n ...shorthands.gap(\"6px\"),\n },\n iconStyles: {\n width: \"26px\",\n },\n item: {\n paddingLeft: \"15px\",\n },\n \n\n});\n","import * as React from 'react';\n\nimport {\n Caption1,\n tokens,\n} from '@fluentui/react-components';\nimport { Icon } from '@iconify/react';\n\nimport { useRenderLabelStyles } from './useRenderLabelStylesStyles';\n\nexport interface IRenderLabelProps {\n label: string; icon?: string | JSX.Element; isRequired?: boolean\n}\n\nexport const RenderLabel: React.FunctionComponent<IRenderLabelProps> = (props: React.PropsWithChildren<IRenderLabelProps>) => {\n const { label, icon, isRequired } = props;\n const styles = useRenderLabelStyles();\n return (\n <>\n <div className={styles.labelContainer}>\n {icon && React.isValidElement(icon) ? (\n icon\n ) : (\n <Icon\n icon={icon as string}\n className={styles.iconStyles}\n width={\"20px\"}\n height={\"20px\"}\n color={tokens.colorBrandForeground1}\n />\n )}\n <Caption1 style={{ color: tokens.colorBrandForeground1 }}>{label}</Caption1>\n <Caption1 style={{ color: tokens.colorPaletteRedForeground1 }}>{isRequired ? \" *\" : \"\"}</Caption1>\n </div>\n </>\n );\n};\n\nexport default RenderLabel;\n","import * as React from \"react\";\n\nimport {\n Caption1,\n Menu,\n MenuButton,\n MenuPopover,\n MenuProps,\n MenuTrigger,\n Tooltip,\n tokens,\n} from \"@fluentui/react-components\";\nimport {\n Settings20Filled,\n Settings20Regular,\n bundleIcon,\n} from \"@fluentui/react-icons\";\n\nimport { RenderLabel } from \"../../RenderLabel\";\nimport { css } from \"@emotion/css\";\n\nexport interface ISelectZoomProps {\n IsOpen: boolean;\n onChange?: (value: { spanCols: number; spanRows: number }) => void;\n values: { spanCols: number; spanRows: number };\n maxCols: number;\n maxRows: number;\n}\n\nconst useStyles = (): {\n gridContainer: string;\n cell: string;\n hoveredCell: string;\n selectedCell: string;\n menuPopover: string;\n bottomText: string;\n zoomContainer: string;\n} => ({\n gridContainer: css`\n display: grid;\n gap: 4px;\n padding: 8px;\n justify-content: center;\n `,\n cell: css`\n width: 30px;\n height: 30px;\n border: 1px solid ${tokens.colorNeutralStroke1};\n background-color: ${tokens.colorNeutralBackground1};\n cursor: pointer;\n transition: background-color 150ms ease, transform 150ms ease;\n will-change: background-color, transform;\n `,\n hoveredCell: css`\n background-color: ${tokens.colorNeutralBackground1Hover};\n transform: scale(1.05);\n `,\n selectedCell: css`\n background-color: ${tokens.colorNeutralBackground1Selected};\n `,\n menuPopover: css`\n min-width: fit-content;\n `,\n bottomText: css`\n padding-left: 8px;\n padding-right: 8px;\n `,\n zoomContainer: css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: '6px',\n width: '100%',\n boxSizing: 'border-box',\n \n padding: '8px 0px',\n \n }),\n});\n\nexport const SelectZoom: React.FunctionComponent<ISelectZoomProps> = (\n props: React.PropsWithChildren<ISelectZoomProps>\n) => {\n const { onChange, values: defaultValues, maxCols, maxRows } = props;\n const Settings = bundleIcon(Settings20Filled, Settings20Regular);\n const styles = useStyles();\n\n const [values, setValues] = React.useState(defaultValues);\n const [hovered, setHovered] = React.useState<{\n spanCols: number;\n spanRows: number;\n } | null>(null);\n const [open, setOpen] = React.useState(false);\n\n React.useEffect(() => {\n setValues(defaultValues);\n }, [defaultValues]);\n\n const onOpenChange: MenuProps[\"onOpenChange\"] = (_, data) => {\n setOpen(data.open);\n setHovered(null);\n };\n\n const handleCellClick = (row: number, col: number):void => {\n const newValues = { spanCols: col + 1, spanRows: row + 1 };\n setValues(newValues);\n onChange?.(newValues);\n setOpen(false);\n };\n\n const handleCellHover = (row: number, col: number):void => {\n setHovered({ spanCols: col + 1, spanRows: row + 1 });\n };\n\n const handleMouseLeave = ():void => {\n setHovered(null);\n };\n\n const renderGridCells = (): React.ReactNode[] => {\n const cells: React.ReactNode[] = [];\n for (let row = 0; row < maxRows; row++) {\n for (let col = 0; col < maxCols; col++) {\n const isSelected = row < values.spanRows && col < values.spanCols;\n const isHovered =\n hovered && row < hovered.spanRows && col < hovered.spanCols;\n cells.push(\n <div\n key={`${row}-${col}`}\n className={`${styles.cell} ${isHovered ? styles.hoveredCell : \"\"} ${\n isSelected ? styles.selectedCell : \"\"\n }`}\n onMouseEnter={() => handleCellHover(row, col)}\n onClick={() => handleCellClick(row, col)}\n />\n );\n }\n }\n return cells;\n };\n\n // Compute popover width dynamically\n const popoverWidth = React.useMemo(() => (30 * maxCols) + (4 * (maxCols - 1)) + 32, [maxCols]); // 30px for each cell, 4px gap, and 32px padding (16 left and right)\n\n return (\n <Menu open={open} onOpenChange={onOpenChange}>\n <MenuTrigger disableButtonEnhancement>\n <Tooltip content=\"Configure\" relationship=\"label\">\n <MenuButton\n icon={<Settings />}\n size=\"small\"\n appearance=\"transparent\"\n />\n </Tooltip>\n </MenuTrigger>\n\n <MenuPopover\n style={{ width: `${popoverWidth}px`, minWidth: \"120px\", padding: 8 }}\n >\n <div\n className={styles.zoomContainer} \n >\n <RenderLabel\n label={`Span (${values.spanCols} × ${values.spanRows})`}\n \n />\n </div>\n\n {/* Grid */}\n <div\n className={styles.gridContainer}\n style={{\n gridTemplateColumns: `repeat(${maxCols}, 30px)`,\n gridTemplateRows: `repeat(${maxRows}, 30px)`,\n }}\n onMouseLeave={handleMouseLeave}\n >\n {renderGridCells()}\n </div>\n\n <Caption1 className={styles.bottomText}>Click to set span</Caption1>\n </MenuPopover>\n </Menu>\n );\n};\n","// LegendButton.tsx\nimport { Button, Caption1, Tooltip, tokens } from '@fluentui/react-components';\n\nimport React from 'react';\n\ninterface LegendButtonProps {\n label: string;\n isVisible: boolean;\n color: string;\n onClick: () => void;\n style?: React.CSSProperties;\n buttonRef?: React.Ref<HTMLButtonElement>;\n}\n\nexport const LegendButton: React.FC<LegendButtonProps> = ({\n label,\n isVisible,\n color,\n onClick,\n style = {},\n buttonRef,\n}) => {\n return (\n <Tooltip content={label} relationship=\"label\">\n <Button\n ref={buttonRef}\n shape=\"circular\"\n size=\"small\"\n appearance={isVisible ? 'primary' : 'outline'}\n onClick={onClick}\n style={{\n backgroundColor: isVisible ? color : 'transparent',\n color: isVisible ? '#fff' : tokens.colorNeutralForeground1,\n borderColor: color,\n borderWidth: 1,\n width: '100px',\n padding: '4px 8px',\n textAlign: 'center',\n ...style,\n }}\n >\n <Caption1\n as=\"span\"\n style={{\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n lineHeight: '1.25',\n }}\n >\n {label}\n </Caption1>\n </Button>\n </Tooltip>\n );\n};\n","import {\n Menu,\n MenuButton,\n MenuItem,\n MenuList,\n MenuPopover,\n MenuTrigger,\n} from '@fluentui/react-components';\n\nimport { LegendButton } from '../legendeButton/LegendButton';\nimport React from 'react';\nimport Stack from '../stack/Stack';\nimport { css } from '@emotion/css';\n\ninterface LegendContainerProps<T> {\n items: T[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n renderLabel: (item: T) => string;\n getColor: (item: T) => string;\n}\n\nconst styles = {\n wrapper: css({\n display: 'flex',\n flexWrap: 'nowrap',\n overflow: 'hidden',\n justifyContent: 'center',\n gap: 10,\n padding: 2,\n width: '100%',\n boxSizing: 'border-box',\n }),\n};\n\nexport function LegendContainer<T extends { label: string }>(\n props: LegendContainerProps<T> & {\n containerRef: React.RefObject<HTMLDivElement>;\n \n visibleItems: T[];\n overflowItems: T[];\n }\n) {\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n visibleLabels,\n toggleLabel,\n renderLabel,\n getColor,\n } = props;\n\n return (\n <Stack\n justifyContent=\"center\"\n alignItems=\"center\"\n marginLeft=\"10px\"\n marginRight=\"10px\"\n marginTop=\"25px\"\n marginBottom=\"20px\"\n >\n <div ref={containerRef} className={styles.wrapper}>\n {visibleItems.map(item => {\n const label = item.label;\n const isVisible =\n visibleLabels.length === 0 || visibleLabels.includes(label);\n return (\n \n <LegendButton\n key={label}\n label={renderLabel(item)}\n color={getColor(item)}\n isVisible={isVisible}\n onClick={() => toggleLabel(label)}\n \n />\n \n );\n })}\n\n {overflowItems.length > 0 && (\n <Menu>\n <MenuTrigger disableButtonEnhancement>\n <MenuButton size=\"small\" appearance=\"transparent\">\n +{overflowItems.length}\n </MenuButton>\n </MenuTrigger>\n <MenuPopover style={{ minWidth: 'fit-content', maxWidth: '200px' }}>\n <MenuList>\n {overflowItems.map(item => {\n const label = item.label;\n const isVisible =\n visibleLabels.length === 0 || visibleLabels.includes(label);\n return (\n <MenuItem key={label} style={{ padding: 0 }}>\n \n <LegendButton\n label={renderLabel(item)}\n color={getColor(item)}\n isVisible={isVisible}\n onClick={() => toggleLabel(label)}\n style={{ width: '100px', textAlign: 'left' }}\n />\n \n \n </MenuItem>\n );\n })}\n </MenuList>\n </MenuPopover>\n </Menu>\n )}\n </div>\n </Stack>\n );\n}\n","import {\n ChartType,\n TooltipCallbacks,\n TooltipItem,\n TooltipModel,\n TooltipOptions,\n} from 'chart.js';\n\nimport { Theme } from '@fluentui/react-components';\nimport { useMemo } from 'react';\n\n/**\n * Lightens a given hex color by a percentage amount (0 to 1).\n */\nexport const lightenColor = (hex: string, amount: number): string => {\n if (!/^#?[0-9A-Fa-f]{6}$/.test(hex)) return hex;\n if (hex.startsWith('#')) hex = hex.slice(1);\n\n let r = parseInt(hex.slice(0, 2), 16);\n let g = parseInt(hex.slice(2, 4), 16);\n let b = parseInt(hex.slice(4, 6), 16);\n\n r = Math.min(255, Math.floor(r + (255 - r) * amount));\n g = Math.min(255, Math.floor(g + (255 - g) * amount));\n b = Math.min(255, Math.floor(b + (255 - b) * amount));\n\n const toHex = (v: number) => v.toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\nexport const getFluentPalette = (_theme: Theme): string[] => [\n '#4e79a7',\n '#f28e2c',\n '#e15759',\n '#76b7b2',\n '#59a14f',\n '#edc949',\n '#af7aa1',\n '#ff9da7',\n '#9c755f',\n '#bab0ab',\n '#8cd17d',\n '#b6992d',\n '#d37295',\n '#fabfd2',\n '#79706e',\n];\n\n\n\n/**\n * Returns animation configuration for instant interactions.\n * Disables hover/tooltip animations for immediate response.\n */\nexport const getInstantInteractionAnimations = () => ({\n animation: false as const, // Disable all animations\n transitions: {\n active: {\n animation: {\n duration: 0, // No delay on hover\n },\n },\n },\n});\n\n/**\n * Smart Fluent tooltip generator with chart-type awareness.\n * Optimized for fast performance with reduced animation delays.\n */\n\nexport function createFluentTooltip<TType extends ChartType>(\n theme: Theme\n): Partial<TooltipOptions<TType>> {\n const fontFamily = theme.fontFamilyBase;\n const fontSize = parseInt(theme.fontSizeBase200.replace('px', '')) || 14;\n const tooltipBg = theme.colorNeutralBackground1;\n const tooltipTitleColor = theme.colorNeutralForeground1;\n const tooltipBodyColor = theme.colorNeutralForeground2;\n const borderColor = theme.colorNeutralStroke2;\n\n const callbacks: TooltipCallbacks<TType> = {\n title(this: TooltipModel<TType>, context: TooltipItem<TType>[]) {\n return context[0]?.label ?? '';\n },\n\n label(this: TooltipModel<TType>, item: TooltipItem<TType>) {\n const datasetLabel =\n 'label' in (item.dataset as Record<string, any>) &&\n typeof (item.dataset as Record<string, any>).label === 'string'\n ? (item.dataset as Record<string, any>).label\n : 'Value';\n\n const raw = item.raw;\n\n // Bubble format { x, y, r }\n if (\n typeof raw === 'object' &&\n raw !== null &&\n 'x' in raw &&\n 'y' in raw &&\n 'r' in raw\n ) {\n const { x, y, r } = raw as any;\n return `${datasetLabel} — x: ${x}, y: ${y}, r: ${r}`;\n }\n\n // Scatter format { x, y }\n if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw) {\n const { x, y } = raw as any;\n return `${datasetLabel} — x: ${x}, y: ${y}`;\n }\n\n // Floating bar [min, max]\n if (Array.isArray(raw) && raw.length === 2) {\n const [min, max] = raw;\n return `${datasetLabel}: ${min} – ${max}`;\n }\n\n // Default: single number or string\n return `${datasetLabel}: ${raw}`;\n },\n\n beforeTitle: () => '',\n afterTitle: () => '',\n beforeBody: () => '',\n afterBody: () => '',\n beforeLabel: () => '',\n afterLabel: () => '',\n labelColor: () => undefined as any,\n labelTextColor: () => '',\n footer: () => '',\n beforeFooter: () => '',\n afterFooter: () => '',\n labelPointStyle: () => ({\n pointStyle: 'circle',\n rotation: 0,\n radius: 5,\n }),\n };\n\n return {\n enabled: true,\n displayColors: true,\n boxWidth: 10,\n boxHeight: 10,\n boxPadding: 5,\n backgroundColor: tooltipBg,\n borderColor,\n borderWidth: 1,\n cornerRadius: 4,\n padding: 10,\n titleColor: tooltipTitleColor,\n bodyColor: tooltipBodyColor,\n titleFont: { family: fontFamily, size: fontSize },\n bodyFont: { family: fontFamily, size: fontSize },\n // Performance optimizations for faster tooltip display\n animation: {\n duration: 0, // Disable tooltip animation for instant display\n },\n callbacks,\n };\n}\n\n\n/**\n * Returns a Chart.js ticks callback to truncate long labels and add optional prefix/suffix.\n */\nexport const createAxisLabelFormatter = ({\n maxLength = 12,\n suffix = '',\n prefix = '',\n}: {\n maxLength?: number;\n suffix?: string;\n prefix?: string;\n}) => {\n return function (this: any, value: string | number): string {\n const label = typeof value === 'number' ? this.getLabelForValue(value) : String(value);\n const trimmed = label.length > maxLength ? label.slice(0, maxLength) + '…' : label;\n return `${prefix}${trimmed}${suffix}`;\n };\n};\n\n\nfunction debounce<T extends (...args: any[]) => void>(fn: T, delay: number): T {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return function(this: any, ...args: any[]) {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fn.apply(this, args), delay);\n } as T;\n}\n\n/**\n * useChartUtils — shared theming and chart helpers.\n */\nexport function useChartUtils(theme?: Theme) {\n return useMemo(\n () => ({\n lightenColor,\n getFluentPalette,\n createFluentTooltip,\n createAxisLabelFormatter,\n debounce,\n getInstantInteractionAnimations\n }),\n [theme]\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { useChartUtils } from './useChartUtils';\n\nconst BUTTON_WIDTH = 100;\nconst GAP = 10;\n\nexport function useResponsiveLegend<T extends { label: string }>(items: T[]) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [maxVisible, setMaxVisible] = useState(items.length);\n const { debounce } = useChartUtils();\n useEffect(() => {\n const measure = () => {\n const containerWidth = containerRef.current?.offsetWidth ?? 0;\n const itemTotalWidth = BUTTON_WIDTH + GAP;\n const count = Math.floor(containerWidth / itemTotalWidth);\n setMaxVisible(count);\n };\n\n const debouncedMeasure = debounce(measure, 100); // debounce resize\n\n const observer = new ResizeObserver(debouncedMeasure);\n if (containerRef.current) observer.observe(containerRef.current);\n measure(); // initial\n\n return () => observer.disconnect();\n }, [items]);\n\n return {\n containerRef,\n visibleItems: items.slice(0, maxVisible),\n overflowItems: items.slice(maxVisible),\n };\n}\n","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface LegendControlProps {\n data: { label: string }[];\n visibleSeries: string[];\n seriesColors: Record<string, string>;\n toggleSeries: (label: string) => void;\n}\n\nconst RenderLegend: React.FC<LegendControlProps> = ({\n data,\n visibleSeries,\n seriesColors,\n toggleSeries,\n}) => {\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n } = useResponsiveLegend(data);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n \n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={data}\n visibleLabels={visibleSeries}\n toggleLabel={toggleSeries}\n renderLabel={d => d.label}\n getColor={d => seriesColors[d.label]}\n />\n );\n};\n\nexport default RenderLegend;\n","import { css } from \"@emotion/css\";\n\nexport const useGraphGlobalStyles = () => {\n return {\n chartWithLegend: css({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n chartArea: {\n flexGrow: 1,\n minHeight: 0,\n },\n }),\n chartArea: css`\n flex-grow: 1;\n min-height: 0;\n `,\n legendArea: css`\n margin-top: 0px;\n padding-top: 0px;\n \n margin-Left: 10px;\n margin-Right: 10px;\n \n `,\n };\n \n}","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Tooltip,\n Filler,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface AreaChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme?: Theme;\n}\n\nexport function AreaChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDatalabels = false,\n theme = webLightTheme,\n stacked = false,\n}: AreaChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : null;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n fill: true,\n tension: 0.4,\n pointRadius: 2,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\n const options: ChartOptions<'line'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title ,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n }), [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n\nexport default AreaChart;","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { createAxisLabelFormatter, useChartUtils } from '../../hooks/useChartUtils';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Theme } from '@fluentui/react-components';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface BarProps<T> {\n data: { label: string; data: T[]; type?: 'bar' | 'line' }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme: Theme;\n}\n\nexport function BarChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDatalabels = false,\n stacked = false,\n theme,\n}: BarProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n const styles = useGraphGlobalStyles();\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n // Extract all unique x-axis categories (from all series)\n const allCategories = useMemo(() => {\n const categorySet = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(datum => {\n categorySet.add(getPrimary(datum));\n });\n });\n return Array.from(categorySet);\n }, [data, getPrimary]);\n\n // Construct Chart.js datasets\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n backgroundColor: seriesColors[series.label],\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n // Assign y-axis based on series type when stacked\n yAxisID: stacked ? (series.type === 'line' ? 'y1' : 'y') : 'y',\n })),\n };\n }, [data, visibleSeries, allCategories, seriesColors, stacked]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(\n () => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }),\n [theme]\n );\n\n const options: ChartOptions<'bar'> = useMemo(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(), // Disable animations for instant tooltip\n\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: {\n display: false,\n },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n type: 'linear',\n position: 'left',\n stacked,\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n ...(stacked && {\n y1: {\n type: 'linear',\n position: 'right',\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n drawOnChartArea: false,\n },\n },\n }),\n },\n }),\n [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]\n );\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n\nexport default BarChart;","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Theme } from '@fluentui/react-theme';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n Title,\n ChartDataLabels,\n \n \n);\n\n\n\nexport interface BarHorizontalProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme: Theme;\n}\n\nexport function BarHorizontalChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n stacked = false,\n showDatalabels = false,\n title,\n theme\n}: BarHorizontalProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\nconst styles = useGraphGlobalStyles();\n \n const { lightenColor, getFluentPalette , createFluentTooltip, getInstantInteractionAnimations} = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const categorySet = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(datum => {\n categorySet.add(getPrimary(datum));\n });\n });\n return Array.from(categorySet);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n backgroundColor: seriesColors[series.label],\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n })),\n };\n }, [data, visibleSeries, allCategories, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'bar'> = useMemo(() => ({\n indexAxis: 'y',\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: {\n display: false,\n },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n stacked,\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n },\n }), [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea} >\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n \n );\n}\nexport default BarHorizontalChart;","import {\n BubbleDataPoint,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Bubble } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n Tooltip,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface BubbleChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number | Date;\n getSecondary: (datum: T) => number;\n getRadius: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function BubbleChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n getRadius,\n showDataLabels,\n title,\n theme = webLightTheme,\n}: BubbleChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n\n const styles = useGraphGlobalStyles();\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const chartData = useMemo(() => {\n return {\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: series.data.map(d => ({\n x: getPrimary(d),\n y: getSecondary(d),\n r: getRadius(d),\n })) as BubbleDataPoint[],\n backgroundColor: seriesColors[series.label],\n borderColor: theme.colorNeutralStroke1,\n borderWidth: 1,\n hoverBorderWidth: 2,\n })),\n };\n }, [data, visibleSeries, getPrimary, getSecondary, getRadius, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'bubble'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bubble'>(theme),\n },\n scales: {\n x: {\n type:\n typeof getPrimary(data[0]?.data[0]) === 'number'\n ? 'linear'\n : 'category',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n }), [\n title,\n showDataLabels,\n theme,\n getPrimary,\n getSecondary,\n data,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n createFluentTooltip,\n ]);\n\n return (\n <>\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bubble data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n </>\n );\n}\n\nexport default BubbleChart;","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Chart } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n LineElement,\n PointElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface ComboChartProps<T> {\n data: {\n label: string;\n type: 'bar' | 'line';\n data: T[];\n yAxisID?: string;\n }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function ComboChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: ComboChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => series.data.forEach(d => set.add(getPrimary(d))));\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n const sortedSeries = data\n .filter(series => visibleSeries.includes(series.label))\n .sort((a, b) => {\n // Ensure bars come before lines\n if (a.type === 'bar' && b.type === 'line') return -1;\n if (a.type === 'line' && b.type === 'bar') return 1;\n return 0;\n });\n\n return {\n labels: allCategories,\n datasets: sortedSeries.map(series => ({\n type: series.type,\n label: series.label,\n yAxisID: series.yAxisID ?? 'y',\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n backgroundColor: seriesColors[series.label],\n borderColor: seriesColors[series.label],\n fill: series.type === 'bar',\n tension: series.type === 'line' ? 0.4 : 0,\n pointRadius: series.type === 'line' ? 3 : 0,\n borderWidth: series.type === 'line' ? 2 : 1,\n order: series.type === 'bar' ? 1 : 0, // Ensure bars are drawn first\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n \n\n const options: ChartOptions<'bar' | 'line'> = useMemo(() => ( {\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bar' | 'line'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n position: 'left',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n stacked: false,\n },\n },\n }), [\n title,\n showDataLabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n createFluentTooltip,\n ]);\n\n return (\n <>\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Chart type=\"bar\" data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n </>\n );\n}\n\nexport default ComboChart;","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface LegendEntry {\n label: string;\n value: number;\n color: string;\n}\n\nexport interface ValueLegendProps {\n entries: LegendEntry[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n}\n\nconst RenderValueLegend: React.FC<ValueLegendProps> = ({\n entries,\n visibleLabels,\n toggleLabel,\n}) => {\n const {\n containerRef,\n\n visibleItems,\n overflowItems,\n } = useResponsiveLegend(entries);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={entries}\n visibleLabels={visibleLabels}\n toggleLabel={toggleLabel}\n renderLabel={entry => `${entry.label}: ${entry.value}`}\n getColor={entry => entry.color}\n />\n );\n};\n\nexport default RenderValueLegend;\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Doughnut } from 'react-chartjs-2';\nimport RenderValueLegend from '../../components/renderValueLegend/RenderValueLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(ArcElement, Tooltip, Legend, Title);\n\nexport interface DoughnutChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function DoughnutChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n}: DoughnutChartProps<T>) {\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n\n const toggleLabel = (label: string): void => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\n const { allLabels, colors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n return { allLabels, colors };\n }, [valueMap, getFluentPalette, theme, lightenColor]);\n\n const { filteredLabels, values, visibleColors } = useMemo(() => {\n const filteredLabels = allLabels.filter(label => !hiddenLabels.includes(label));\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n return { filteredLabels, values, visibleColors };\n }, [allLabels, hiddenLabels, valueMap, colors]);\n\n const chartData = useMemo(() => ({\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n }), [filteredLabels, values, visibleColors]);\n\n const legendEntries = useMemo(() => {\n return allLabels.map((label, idx) => ({\n label,\n value: valueMap.get(label) || 0,\n color: colors[idx],\n }));\n }, [allLabels, valueMap, colors]);\n\n const options: ChartOptions<'doughnut'> = useMemo(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n legend: { display: false },\n tooltip: createFluentTooltip<'doughnut'>(theme),\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n formatter: (value: number) => value,\n },\n },\n }),\n [title, theme, showDataLabels, createFluentTooltip]\n );\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Doughnut data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderValueLegend\n entries={legendEntries}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n\nexport default DoughnutChart;","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface FloatingBarChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getRange: (datum: T) => [number, number]; // e.g., [min, max]\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function FloatingBarChart<T extends object>({\n data,\n getPrimary,\n getRange,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: FloatingBarChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getRange(match) : [0, 0];\n }),\n backgroundColor: seriesColors[series.label],\n borderRadius: 2,\n })),\n };\n }, [data, visibleSeries, allCategories, getPrimary, getRange, seriesColors]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options: ChartOptions<'bar'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n title,\n theme,\n showDataLabels,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n createFluentTooltip\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n\nexport default FloatingBarChart;","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n LineElement,\n PointElement,\n CategoryScale,\n LinearScale,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface LineChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function LineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: LineChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette , createFluentTooltip, getInstantInteractionAnimations} = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : null;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n tension: 0.4,\n fill: false,\n pointRadius: 4,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'line'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n },\n }), [\n title,\n theme,\n showDataLabels,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n createFluentTooltip\n ]);\n\n return (\n\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <div className={styles.legendArea} >\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n \n );\n}\nexport default LineChart;","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Pie } from 'react-chartjs-2';\nimport RenderValueLegend from '../../components/renderValueLegend/RenderValueLegend';\nimport { createFluentTooltip, getInstantInteractionAnimations } from '../../hooks/useChartUtils';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(ArcElement, Tooltip, Legend, Title);\n\nexport interface PieChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function PieChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: PieChartProps<T>) {\n const { getFluentPalette, lightenColor } = useChartUtils(theme);\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n const styles = useGraphGlobalStyles();\n const toggleLabel = (label: string): void => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\nconst { allLabels, colors, filteredLabels, values, visibleColors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n\n const filteredLabels = allLabels.filter(\n label => !hiddenLabels.includes(label)\n );\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n\n return { allLabels, colors, filteredLabels, values, visibleColors };\n}, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]);\n\nconst { chartData, legendEntries } = useMemo(() => {\n const chartData = {\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n };\n\n const legendEntries = allLabels.map((label, i) => ({\n label,\n value: valueMap.get(label) || 0,\n color: colors[i],\n }));\n\n return { chartData, legendEntries };\n}, [filteredLabels, values, visibleColors, allLabels, valueMap, colors]);\n\nconst options = useMemo<ChartOptions<'pie'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(), // Disable animations for instant tooltip\n plugins: {\n tooltip: createFluentTooltip<'pie'>(theme),\n legend: { display: false },\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n },\n}), [theme, title, showDataLabels]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Pie data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderValueLegend\n entries={legendEntries}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n\nexport default PieChart;","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface SliceLegendProps {\n labels: string[];\n colors: string[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n}\n\nconst RenderSliceLegend: React.FC<SliceLegendProps> = ({\n labels,\n colors,\n visibleLabels,\n toggleLabel,\n}) => {\n interface SliceLegendItem {\n label: string;\n color: string;\n }\n\n const items: SliceLegendItem[] = labels.map((label, i) => ({ label, color: colors[i] }));\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n } = useResponsiveLegend(items);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n \n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={items}\n visibleLabels={visibleLabels}\n toggleLabel={toggleLabel}\n renderLabel={item => item.label}\n getColor={item => item.color}\n />\n );\n};\n\nexport default RenderSliceLegend;\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n RadialLinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useChartUtils } from '../../hooks/useChartUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { PolarArea } from 'react-chartjs-2';\nimport RenderSliceLegend from '../../components/renderSliceLegend/RenderSliceLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n RadialLinearScale,\n ArcElement,\n Tooltip,\n Legend,\n Title,\n ChartDataLabels\n);\n\nexport interface PolarChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function PolarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n}: PolarChartProps<T>) {\n const { getFluentPalette, lightenColor, getInstantInteractionAnimations } = useChartUtils(theme);\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n const styles = useGraphGlobalStyles();\n const toggleLabel = (label: string) => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\nconst { allLabels, colors, filteredLabels, values, visibleColors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n\n const filteredLabels = allLabels.filter(\n label => !hiddenLabels.includes(label)\n );\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n\n return { allLabels, colors, filteredLabels, values, visibleColors };\n}, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]);\n\nconst chartData = useMemo(() => ({\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n}), [filteredLabels, values, visibleColors]);\n\nconst options = useMemo<ChartOptions<'polarArea'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n formatter: (value: number) => value,\n },\n tooltip: createFluentTooltip<'polarArea'>(theme),\n legend: { display: false },\n },\n scales: {\n r: {\n ticks: {\n color: theme.colorNeutralForeground1,\n backdropColor: 'transparent',\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n grid: {\n color: theme.colorNeutralStroke2,\n },\n },\n },\n}), [theme, title, showDataLabels, createFluentTooltip]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <PolarArea data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderSliceLegend\n labels={allLabels}\n colors={colors}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n\nexport default PolarChart;","import {\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n PointElement,\n RadialLinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useChartUtils } from '../../hooks/useChartUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Radar } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n RadialLinearScale,\n PointElement,\n LineElement,\n Filler,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface RadarChartProps<T> {\n data: { label: string; data: T[] }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string; \n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function RadarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme, \n}: RadarChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, getInstantInteractionAnimations } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const allLabels = useMemo(() => {\n const set = new Set<string>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getLabel(d)));\n });\n return Array.from(set);\n }, [data, getLabel]);\n\n const chartData = useMemo(() => {\n return {\n labels: allLabels,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allLabels.map(label => {\n const match = series.data.find(d => getLabel(d) === label);\n return match ? getValue(match) : 0;\n }),\n backgroundColor: seriesColors[series.label] + '33',\n borderColor: seriesColors[series.label],\n borderWidth: 2,\n pointBackgroundColor: seriesColors[series.label],\n })),\n };\n }, [data, visibleSeries, allLabels, getLabel, getValue, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options = useMemo<ChartOptions<'radar'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n tooltip: createFluentTooltip<'radar'>(theme),\n legend: { display: false },\n },\n scales: {\n r: {\n angleLines: { color: gridColor },\n grid: { color: gridColor },\n pointLabels: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n },\n },\n }), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n gridColor,\n labelColor,\n fontFamily,\n fontSize,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Radar data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n\nexport default RadarChart;","import {\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n PointElement,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Scatter } from 'react-chartjs-2';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(LinearScale, PointElement, Tooltip, Legend);\n\nexport interface ScatterChartProps<T> {\n data: { label: string; data: T[] }[];\n getX: (datum: T) => number;\n getY: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function ScatterChart<T extends object>({\n data,\n getX,\n getY,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: ScatterChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n const styles = useGraphGlobalStyles();\n const { getFluentPalette, lightenColor, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = React.useCallback((label: string) => {\n setVisibleSeries(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n }, []);\n\n const chartData = useMemo(() => {\n return {\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: series.data.map(d => ({ x: getX(d), y: getY(d) })),\n backgroundColor: seriesColors[series.label],\n borderColor: seriesColors[series.label],\n pointRadius: 4,\n })),\n };\n }, [data, visibleSeries, getX, getY, seriesColors]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'scatter'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'scatter'>(theme),\n },\n scales: {\n x: {\n type: 'linear',\n position: 'bottom',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n type: 'linear',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Scatter data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n\nexport default ScatterChart;","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n LineElement,\n PointElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface StackedLineChartProps<T> {\n data: { label: string; data: T[] }[]; \n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function StackedLineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: StackedLineChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : 0;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n fill: true,\n tension: 0.4,\n pointRadius: 3,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n\nexport default StackedLineChart;","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, ToggleButton, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useChartUtils } from '../../hooks/useChartUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Stack } from '../../components/stack/Stack';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n LineElement,\n PointElement,\n Filler, \n CategoryScale,\n LinearScale,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface SteamChartProps<T> {\n data: { label: string; data: T[] }[]; \n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function SteamChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: SteamChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n const [showPercent, setShowPercent] = useState(false);\nconst styles = useGraphGlobalStyles();\n \n const { lightenColor, getFluentPalette, getInstantInteractionAnimations } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme]);\n\n const toggleSeries = React.useCallback(\n (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible\n ? prev.filter(l => l !== label)\n : [...prev, label];\n return next.length === 0 ? [data[0].label] : next;\n });\n },\n [data]\n );\n\n const allLabels = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const totalPerPoint = useMemo(() => {\n return allLabels.map(cat =>\n data.reduce((sum, series) => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return sum + (match ? getSecondary(match) : 0);\n }, 0)\n );\n }, [allLabels, data, getPrimary, getSecondary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allLabels,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map((series, ) => ({\n label: series.label,\n fill: true,\n backgroundColor: seriesColors[series.label],\n borderColor: 'transparent',\n borderWidth: 0,\n data: allLabels.map((cat, index) => {\n const match = series.data.find(d => getPrimary(d) === cat);\n const rawValue = match ? getSecondary(match) : 0;\n const total = totalPerPoint[index] || 1;\n return showPercent\n ? Math.round(((rawValue / total) * 100 + Number.EPSILON) * 100) / 100\n : Math.round((rawValue + Number.EPSILON) * 100) / 100;\n }),\n tension: 0.5,\n })),\n };\n }, [\n data,\n visibleSeries,\n allLabels,\n getPrimary,\n getSecondary,\n seriesColors,\n totalPerPoint,\n showPercent,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n interaction: {\n mode: 'index',\n intersect: false,\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n ticks: {\n callback: (value: string | number) => (showPercent ? `${value}%` : value),\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n min: 0,\n max: showPercent ? 100 : undefined,\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n showPercent,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <Stack justifyContent=\"center\" alignItems=\"center\" margin=\"7px\">\n <ToggleButton\n onClick={() => setShowPercent(p => !p)}\n shape=\"circular\"\n appearance=\"secondary\"\n size=\"small\"\n style={{ width: '150px' }}\n >\n {showPercent ? 'Show Raw Values' : 'Show %'}\n </ToggleButton>\n </Stack>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n\nexport default SteamChart;","import { Theme, webLightTheme } from \"@fluentui/react-components\";\n\nimport AreaChart from '../charts/areaChart/AreaChart';\nimport BarChart from '../charts/BarChart/BarChart';\nimport BarHorizontalChart from '../charts/barHorizontalChart/BarHotizontalChart';\nimport BubbleChart from '../charts/bubbleChart/BubbleChart';\nimport ComboChart from '../charts/ComboChart/ComboChart';\nimport DoughnutChart from '../charts/Doughnut/DoughnutChart';\nimport FloatingBarChart from '../charts/floatBarChart/FloatBarChart';\nimport { IChart } from \"../models\";\nimport LineChart from '../charts/lineChart/LineChart';\nimport PieChart from '../charts/PieChart/PieChart';\nimport PolarChart from '../charts/polarChart/PolarChart';\nimport RadarChart from '../charts/radarChart/RadarChart';\nimport React from 'react';\nimport ScatterChart from '../charts/scatterChart/ScatterChart';\nimport StackedLineChart from '../charts/stackedLineChart/StackedLineChart';\nimport SteamChart from '../charts/steamChart/SteamChart';\n\nconst chartProps = (chart: IChart) => ({\n data: chart.data,\n title: chart.title,\n getPrimary: (d: any) => d.name,\n getSecondary: (d: any) => d.value,\n});\n\nconst getChartComponent = (chart: IChart, theme: Theme) => {\n const { type } = chart;\n const fuiTheme = theme ?? webLightTheme; \n switch (type) {\n case 'bar':\n return <BarChart {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n case 'line':\n return <LineChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'area':\n return <AreaChart {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n\n case 'bar-horizontal':\n return <BarHorizontalChart {...chartProps(chart)} stacked={true} theme={fuiTheme} />;\n case 'bubble':\n return (\n <BubbleChart {...chartProps(chart)} getRadius={d => d.radius ?? 1} theme={fuiTheme} />\n );\n case 'multiple-axes':\n return (\n <ComboChart\n {...chartProps(chart)}\n theme={fuiTheme}\n \n data={chart.data.map((series: any) => ({\n label: series.label,\n type: series.type ?? 'bar',\n data: series.data,\n yAxisID: series.secondaryAxisId,\n \n }))}\n />\n );\n case 'steam':\n return <SteamChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'floating-bar':\n return (\n <FloatingBarChart\n getRange={d => [d.min ?? 0, d.max ?? 0]}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'stacked-line':\n return <StackedLineChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'doughnut':\n return (\n <DoughnutChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'pie':\n return (\n <PieChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n showDataLabels={true}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'scatter':\n return (\n <ScatterChart\n getX={d => {\n if (typeof d.x === 'number') return d.x;\n if (typeof d.x === 'string') return Number(d.x) || 0;\n if (d.x instanceof Date) return d.x.getTime();\n return 0;\n }}\n getY={d => (typeof d.y === 'number' ? d.y : 0)}\n {...chartProps(chart)}\n theme={fuiTheme}\n showDataLabels={false}\n />\n );\n case 'polar':\n return (\n <PolarChart\n data={chart.data}\n getLabel={d => d.name}\n getValue={d => d.value ?? 0}\n title={chart.title}\n showDataLabels={true} \n theme={fuiTheme}\n />\n );\n case 'radar':\n return (\n <RadarChart\n data={chart.data}\n getLabel={d => d.name}\n getValue={d => d.value ?? 0}\n title={chart.title}\n theme={fuiTheme}\n />\n );\n\n default:\n throw new Error(`Unsupported chart type: ${type}`);\n }\n};\n\nexport const useChartFactory = () => {\n return React.useMemo(() => ({\n getChartComponent\n }), []);\n};","import {\n DBSchema,\n openDB,\n} from 'idb';\n\nimport { useEffect } from 'react';\n\nexport interface CacheData<T> {\n data: T;\n timestamp: number;\n}\n\ninterface CacheDB<T> extends DBSchema {\n cache: {\n key: string;\n value: CacheData<T>;\n };\n}\n\ninterface UseIndexedDBCacheReturn<T> {\n getData: (key: string) => Promise<T | undefined>;\n setData: (key: string, data: T) => Promise<void>;\n deleteData: (key: string) => Promise<void>;\n clearAllCache: () => Promise<void>;\n}\n\nconst CACHE: string = \"application-cache\";\n\nconst openDatabase = async <T>() => {\n return openDB<CacheDB<T>>('app-cache-db', 1, {\n upgrade(db) {\n db.createObjectStore(CACHE as never);\n },\n });\n};\n\nconst getCachedData = async <T>(key: string): Promise<T | undefined> => {\n const db = await openDatabase<T>();\n const cached = await db.get((CACHE as never), key);\n return cached ? cached.data : undefined;\n};\n\nconst setCachedData = async <T>(key: string, data: T): Promise<void> => {\n const db = await openDatabase<T>();\n await db.put(CACHE as never, { data, timestamp: Date.now() }, key);\n};\n\nconst deleteCachedData = async (key: string): Promise<void> => {\n const db = await openDatabase<any>();\n await db.delete(CACHE as never, key);\n};\n\nconst clearCache = async (): Promise<void> => {\n const db = await openDatabase<any>();\n await db.clear(CACHE as never);\n};\n\nconst clearExpiredCache = async (maxAge: number): Promise<void> => {\n const db = await openDatabase<any>();\n const allKeys = await db.getAllKeys(CACHE as never);\n const now = Date.now();\n\n for (const key of allKeys) {\n const cached = await db.get(CACHE as never, key as string);\n if (cached && now - cached.timestamp > maxAge) {\n await db.delete(CACHE as never, key);\n }\n }\n};\nconst DEFAULT_MAX_AGE = 24 * 60 * 60 * 1000; // 1 day in milliseconds\n/**\n * Custom hook to manage IndexedDB cache with a specified maximum age.\n *\n * @template T - The type of data to be cached.\n * @param {number} [maxAge=DEFAULT_MAX_AGE] - The maximum age (in milliseconds) for cached data before it is considered expired.\n * @returns {UseIndexedDBCacheReturn<T>} An object containing methods to interact with the cache.\n *\n * @example\n * const { getData, setData, deleteData, clearAllCache } = useIndexedDBCache<MyDataType>(3600000);\n *\n * @function\n * @name useIndexedDBCache\n * @memberof hooks\n * @inner\n *\n * @typedef {Object} UseIndexedDBCacheReturn<T>\n * @property {function(string): Promise<T | undefined>} getData - Retrieves cached data by key.\n * @property {function(string, T): Promise<void>} setData - Caches data with a specified key.\n * @property {function(string): Promise<void>} deleteData - Deletes cached data by key.\n * @property {function(): Promise<void>} clearAllCache - Clears all cached data.\n */\nexport const useIndexedDBCache = <T>(maxAge: number = DEFAULT_MAX_AGE): UseIndexedDBCacheReturn<T> => {\n useEffect(() => {\n // Clear expired cache on component mount\n (async () => {\n await clearExpiredCache(maxAge);\n })();\n }, [maxAge]);\n\n const getData = async (key: string): Promise<T | undefined> => {\n return await getCachedData<T>(key);\n };\n\n const setData = async (key: string, data: T): Promise<void> => {\n await setCachedData<T>(key, data);\n };\n\n const deleteData = async (key: string): Promise<void> => {\n await deleteCachedData(key);\n };\n\n const clearAllCache = async (): Promise<void> => {\n await clearCache();\n };\n\n return { getData, setData, deleteData, clearAllCache };\n};\n\nexport default useIndexedDBCache;\n","import { Card, CardHeader, Text, Theme } from '@fluentui/react-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { ICardChartContainer } from '../../models/ICardChartContainer';\nimport { IDashboardProps } from './IDashboardProps';\nimport { NoDashboards } from './NoDashboards';\nimport { SelectZoom } from './selectZoom/SelectZoom';\nimport { useChartFactory } from '../../hooks/useChartFactory';\nimport { useDashboardStyles } from './useDashboardStyles';\nimport { useIndexedDBCache } from '../../hooks/useIndexedDBCache';\n\nconst MINIMUM_DASHBOARD_WIDTH = 600;\nconst MAX_ROWS = 4;\nconst DASHBOARD_LAYOUT_CACHE_KEY = 'dashboard-layout-settings';\nconst DASHBOARD_ORDER_CACHE_KEY = 'dashboard-card-order';\nconst CACHE_EXPIRATION_DAYS = 30;\n\nexport const Dashboard: React.FC<IDashboardProps> = ({\n cardCharts,\n theme,\n containerWidth,\n containerHeight = '100%',\n maxSpanRows = MAX_ROWS,\n}) => {\n const styles = useDashboardStyles();\n const { getChartComponent } = useChartFactory();\n \n // Cache with 30-day expiration for dashboard layout settings\n const { getData, setData } = useIndexedDBCache<Record<string, { spanCols: number; spanRows: number }>>(\n CACHE_EXPIRATION_DAYS * 24 * 60 * 60 * 1000\n );\n\n // Cache for card order\n const { \n getData: getOrderData, \n setData: setOrderData \n } = useIndexedDBCache<string[]>(\n CACHE_EXPIRATION_DAYS * 24 * 60 * 60 * 1000\n );\n\n \n\n const [CardChartContainer, setCardChartContainer] = useState<\n ICardChartContainer[]\n >([]);\n\n const [sizes, setSizes] = useState<\n Record<string, { spanCols: number; spanRows: number }>\n >({});\n const dragItem = useRef<number | null>(null);\n const dragOverItem = useRef<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n // Load cached card order and sizes\n const initializeData = async () => {\n try {\n const [cachedSizes, cachedOrder] = await Promise.all([\n getData(DASHBOARD_LAYOUT_CACHE_KEY),\n getOrderData(DASHBOARD_ORDER_CACHE_KEY)\n ]);\n \n // Restore card order if available, otherwise use original order\n let orderedCards = cardCharts;\n if (cachedOrder && cachedOrder.length > 0) {\n // Reorder cards based on cached order, but handle cases where cards might have been added/removed\n const cardMap = new Map(cardCharts.map(card => [card.id, card]));\n const validCachedOrder = cachedOrder.filter(id => cardMap.has(id));\n const missingCards = cardCharts.filter(card => !cachedOrder.includes(card.id));\n \n orderedCards = [\n ...validCachedOrder.map(id => cardMap.get(id)!),\n ...missingCards\n ];\n }\n \n setCardChartContainer(orderedCards);\n \n const initialSizes: Record<\n string,\n { spanCols: number; spanRows: number }\n > = {};\n \n cardCharts.forEach(c => {\n const cachedSize = cachedSizes?.[c.id];\n initialSizes[c.id] = {\n spanCols: cachedSize?.spanCols ?? c.defaultSpan?.spanCols ?? 1,\n spanRows: cachedSize?.spanRows ?? c.defaultSpan?.spanRows ?? 1,\n };\n });\n \n setSizes(initialSizes);\n } catch (error) {\n // Fallback to default values if cache fails\n console.warn('Failed to load dashboard data from cache:', error);\n setCardChartContainer(cardCharts);\n const fallbackSizes: Record<\n string,\n { spanCols: number; spanRows: number }\n > = {};\n cardCharts.forEach(c => {\n fallbackSizes[c.id] = {\n spanCols: c.defaultSpan?.spanCols ?? 1,\n spanRows: c.defaultSpan?.spanRows ?? 1,\n };\n });\n setSizes(fallbackSizes);\n }\n };\n \n initializeData();\n }, [cardCharts]); // Only depend on cardCharts - getData/getOrderData are stable\n\n // Save sizes to cache whenever they change\n useEffect(() => {\n const saveSizesToCache = async () => {\n try {\n await setData(DASHBOARD_LAYOUT_CACHE_KEY, sizes);\n } catch (error) {\n console.warn('Failed to save dashboard layout to cache:', error);\n }\n };\n\n // Only save if sizes is not empty (avoid saving initial empty state)\n if (Object.keys(sizes).length > 0) {\n saveSizesToCache();\n }\n }, [sizes]); // Only depend on sizes - setData is stable\n\n // Save card order to cache whenever it changes\n useEffect(() => {\n const saveOrderToCache = async () => {\n try {\n const cardOrder = CardChartContainer.map(card => card.id);\n await setOrderData(DASHBOARD_ORDER_CACHE_KEY, cardOrder);\n } catch (error) {\n console.warn('Failed to save dashboard order to cache:', error);\n }\n };\n\n // Only save if CardChartContainer is not empty\n if (CardChartContainer.length > 0) {\n saveOrderToCache();\n }\n }, [CardChartContainer]); // Only depend on CardChartContainer - setOrderData is stable\n\n useEffect(() => {\n if (containerWidth <= MINIMUM_DASHBOARD_WIDTH) {\n setSizes(() => {\n const reset: Record<\n string,\n { spanCols: number; spanRows: number }\n > = {};\n CardChartContainer.forEach(c => {\n reset[c.id] = { spanCols: 1, spanRows: 1 };\n });\n return reset;\n });\n }\n }, [containerWidth, CardChartContainer]);\n\n const showZoom = useMemo(() => containerWidth > MINIMUM_DASHBOARD_WIDTH, [\n containerWidth,\n ]);\n\n const { minCardWidth, gridGap, containerPadding } = useMemo(\n () => ({\n minCardWidth: 350,\n gridGap: 16,\n containerPadding: 20,\n }),\n []\n );\n\n const innerWidth = containerWidth - containerPadding * 2;\n const columns = useMemo(\n () => Math.floor((innerWidth + gridGap) / (minCardWidth + gridGap)),\n [innerWidth, gridGap, minCardWidth]\n );\n const maxZoom = Math.max(columns, 1);\n\n const handleSort = useCallback(() => {\n if (\n dragItem.current !== null &&\n dragOverItem.current !== null &&\n dragItem.current !== dragOverItem.current\n ) {\n const copy = [...CardChartContainer];\n const [moved] = copy.splice(dragItem.current, 1);\n copy.splice(dragOverItem.current, 0, moved);\n setCardChartContainer(copy);\n }\n dragItem.current = null;\n dragOverItem.current = null;\n }, [CardChartContainer]);\n\n const handleZoomSelect = useCallback(\n (id: string, span: { spanCols: number; spanRows: number }) => {\n const newSizes = {\n spanCols: Math.min(Math.max(span.spanCols, 1), maxZoom),\n spanRows: Math.min(Math.max(span.spanRows, 1), maxSpanRows),\n };\n \n setSizes(prev => ({\n ...prev,\n [id]: newSizes,\n }));\n },\n [maxZoom, maxSpanRows]\n );\n\n const defaultColsAndRowSpanBasedOnNumberColumns = useMemo(() => {\n return CardChartContainer.reduce((acc, card) => {\n acc[card.id] = {\n spanCols: Math.min(card.defaultSpan?.spanCols ?? 1, columns),\n spanRows: card.defaultSpan?.spanRows ?? 1,\n };\n return acc;\n }, {} as Record<string, { spanCols: number; spanRows: number }>);\n }, [CardChartContainer, columns]);\n\n const renderCards = useMemo(() => {\n return CardChartContainer.map((cardContainer, idx) => (\n <div\n className={styles.cardWrapper}\n key={cardContainer.id}\n draggable\n onDragStart={() => (dragItem.current = idx)}\n onDragEnter={() => (dragOverItem.current = idx)}\n onDragOver={e => e.preventDefault()}\n onDragEnd={handleSort}\n style={{\n gridColumnEnd: sizes[cardContainer.id]?.spanCols\n ? `span ${sizes[cardContainer.id].spanCols}`\n : `span ${defaultColsAndRowSpanBasedOnNumberColumns[\n cardContainer.id\n ]?.spanCols || 1}`,\n gridRowEnd: sizes[cardContainer.id]?.spanRows\n ? `span ${sizes[cardContainer.id].spanRows}`\n : `span ${defaultColsAndRowSpanBasedOnNumberColumns[\n cardContainer.id\n ]?.spanRows || 1}`,\n }}\n >\n <Card className={styles.cardBody}>\n <CardHeader\n header={\n <Text weight=\"semibold\" size={400}>\n {cardContainer.cardTitle}\n </Text>\n }\n action={\n showZoom ? (\n <SelectZoom\n values={\n sizes[cardContainer.id] ||\n defaultColsAndRowSpanBasedOnNumberColumns[\n cardContainer.id\n ] || { spanCols: 1, spanRows: 1 }\n }\n maxCols={maxZoom}\n maxRows={maxSpanRows}\n IsOpen={false}\n onChange={v => handleZoomSelect(cardContainer.id, v)}\n />\n ) : (\n undefined\n )\n }\n />\n <div\n className={styles.chartContainer}\n style={{ height: containerHeight }}\n >\n {theme &&\n theme.fontSizeBase100 &&\n getChartComponent(cardContainer.chart, theme as Theme)}\n </div>\n </Card>\n </div>\n ));\n }, [\n CardChartContainer,\n handleSort,\n sizes,\n styles.cardBody,\n styles.chartContainer,\n showZoom,\n maxZoom,\n getChartComponent,\n handleZoomSelect,\n theme,\n ]);\n\n if (CardChartContainer.length === 0) {\n return <NoDashboards />;\n }\n\n return (\n <>\n <div ref={containerRef} className={styles.dashboardContainer} style={{ height: containerHeight }}>\n {renderCards}\n </div>\n </>\n );\n};\n\nexport default Dashboard;\n","import { css } from '@emotion/css';\nimport { tokens } from '@fluentui/react-components';\n\nexport const useDashboardStyles = (): {\n dashboardContainer: string;\n cardBody: string;\n chartContainer: string;\n cardDescription: string;\n cardWrapper: string;\n} => {\n return {\n dashboardContainer: css({\n display: 'grid',\n padding: '20px',\n gap: '16px',\n backgroundColor: tokens.colorNeutralBackground2,\n gridTemplateColumns: 'repeat(auto-fill, minmax(350px, 1fr))',\n gridAutoRows: '350px',\n overflowY: 'auto',\n overflowX: 'hidden',\n\n // Scrollbar styles\n '::-webkit-scrollbar': {\n width: '5px', // Width for vertical scrollbars\n height: '5px', // Height for horizontal scrollbars\n },\n '::-webkit-scrollbar-track': {\n background: tokens.colorNeutralBackground4, // Light gray for the track\n borderRadius: '10px',\n },\n '::-webkit-scrollbar-thumb': {\n background: tokens.colorBrandStroke2Hover, // Dark gray for the thumb\n borderRadius: '10px',\n },\n '::-webkit-scrollbar-thumb:hover': {\n background: tokens.colorNeutralStroke2, // Dark gray for the thumb\n },\n\n justifyContent: 'center',\n gridAutoFlow: 'dense',\n }),\n cardBody: css({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n minHeight: '320px',\n }),\n chartContainer: css({\n flex: 1,\n width: '100%',\n minHeight: '280px',\n }),\n cardDescription: css({\n color: `${tokens.colorNeutralForeground2}`,\n marginTop: '4px',\n }),\n\n cardWrapper: css({\n position: 'relative',\n height: '100%',\n minHeight: '300px',\n borderRadius: tokens.borderRadiusMedium,\n transition: 'all 0.2s ease',\n\n '&:hover': {\n transform: 'translateY(-2px)',\n boxShadow: `${tokens.shadow16}`,\n },\n\n '&:active': {\n transform: 'translateY(0)',\n boxShadow: `${tokens.shadow8}`,\n },\n }),\n };\n};\n"],"names":["BusinessReportIcon","_ref","width","_ref$height","height","React","_ref$width","viewBox","className","style","_extends","fill","tokens","colorNeutralForeground2","xmlns","id","colorNeutralBackground1","x","y","colorNeutralStroke1","d","colorNeutralForeground3","opacity","colorBrandBackground","points","sizeMap","xs","spacingHorizontalXS","s","spacingHorizontalS","m","spacingHorizontalM","l","spacingHorizontalL","xl","spacingHorizontalXL","xxl","spacingHorizontalXXL","Stack","memo","direction","_ref$justifyContent","justifyContent","_ref$alignItems","alignItems","gap","columnGap","rowGap","margin","padding","marginTop","marginBottom","marginLeft","marginRight","paddingTop","paddingBottom","paddingLeft","paddingRight","_ref$wrap","wrap","children","stackStyle","css","display","flexDirection","_ref$direction","overflow","flexWrap","backgroundColor","background","mergeClasses","displayName","NoDashboards","props","Text","size","weight","useRenderLabelStyles","makeStyles","labelContainer","shorthands","iconStyles","item","RenderLabel","label","icon","isRequired","styles","Icon","color","colorBrandForeground1","Caption1","colorPaletteRedForeground1","SelectZoom","onChange","defaultValues","values","maxCols","maxRows","Settings","bundleIcon","Settings20Filled","Settings20Regular","gridContainer","_templateObject","_taggedTemplateLiteralLoose","cell","_templateObject2","hoveredCell","_templateObject3","colorNeutralBackground1Hover","selectedCell","_templateObject4","colorNeutralBackground1Selected","menuPopover","_templateObject5","bottomText","_templateObject6","zoomContainer","boxSizing","_React$useState","setValues","_React$useState2","hovered","setHovered","_React$useState3","open","setOpen","popoverWidth","Menu","onOpenChange","_","data","MenuTrigger","disableButtonEnhancement","Tooltip","content","relationship","MenuButton","appearance","MenuPopover","minWidth","spanCols","spanRows","gridTemplateColumns","gridTemplateRows","onMouseLeave","cells","_loop","row","_loop2","col","push","key","onMouseEnter","handleCellHover","onClick","newValues","handleCellClick","renderGridCells","LegendButton","isVisible","_ref$style","Button","ref","buttonRef","shape","colorNeutralForeground1","borderColor","borderWidth","textAlign","as","textOverflow","whiteSpace","lineHeight","wrapper","LegendContainer","overflowItems","visibleLabels","toggleLabel","renderLabel","getColor","containerRef","visibleItems","map","length","includes","maxWidth","MenuList","MenuItem","lightenColor","hex","amount","test","startsWith","slice","r","parseInt","g","b","Math","min","floor","toHex","v","toString","padStart","getFluentPalette","_theme","getInstantInteractionAnimations","animation","transitions","active","duration","createFluentTooltip","theme","fontFamily","fontFamilyBase","fontSize","fontSizeBase200","replace","enabled","displayColors","boxWidth","boxHeight","boxPadding","colorNeutralStroke2","cornerRadius","titleColor","bodyColor","titleFont","family","bodyFont","callbacks","title","context","_context$0$label","_context$","datasetLabel","dataset","raw","Array","isArray","beforeTitle","afterTitle","beforeBody","afterBody","beforeLabel","afterLabel","labelColor","labelTextColor","footer","beforeFooter","afterFooter","labelPointStyle","pointStyle","rotation","radius","createAxisLabelFormatter","maxLength","_ref$maxLength","_ref$suffix","suffix","_ref$prefix","prefix","value","this","getLabelForValue","String","trimmed","debounce","fn","delay","timer","args","_len","_key","arguments","clearTimeout","setTimeout","apply","_this","useChartUtils","useMemo","useResponsiveLegend","items","useRef","_useState","useState","maxVisible","setMaxVisible","useEffect","measure","containerWidth","_containerRef$current","_containerRef$current2","current","offsetWidth","count","BUTTON_WIDTH","debouncedMeasure","observer","ResizeObserver","observe","disconnect","RenderLegend","visibleSeries","seriesColors","toggleSeries","_useResponsiveLegend","useGraphGlobalStyles","chartWithLegend","chartArea","flexGrow","minHeight","legendArea","AreaChart","getPrimary","getSecondary","_ref$showDatalabels","showDatalabels","_ref$theme","webLightTheme","_ref$stacked","stacked","_data$","setVisibleSeries","_useChartUtils","reduce","acc","series","idx","base","allCategories","set","Set","forEach","add","from","chartData","labels","datasets","filter","cat","match","find","tension","pointRadius","_useMemo","gridColor","options","responsive","maintainAspectRatio","plugins","text","font","fontWeightSemibold","top","bottom","datalabels","legend","tooltip","scales","ticks","grid","Line","prev","next","concat","BarChart","categorySet","datum","found","yAxisID","type","callback","position","y1","drawOnChartArea","Bar","BarHorizontalChart","indexAxis","BubbleChart","getRadius","showDataLabels","hoverBorderWidth","_data$2","Bubble","ComboChart","_ref$showDataLabels","sortedSeries","sort","a","_series$yAxisID","order","Chart","register","CategoryScale","LinearScale","PointElement","LineElement","Filler","Legend","ChartDataLabels","Title","ChartJS","BarElement","RenderValueLegend","entries","entry","DoughnutChart","getLabel","getValue","hiddenLabels","setHiddenLabels","valueMap","Map","get","allLabels","keys","palette","colors","i","_useMemo2","filteredLabels","visibleColors","indexOf","legendEntries","formatter","Doughnut","FloatingBarChart","getRange","borderRadius","LineChart","PieChart","Pie","ArcElement","RenderSliceLegend","PolarChart","backdropColor","PolarArea","RadarChart","pointBackgroundColor","angleLines","pointLabels","Radar","ScatterChart","getX","getY","useCallback","Scatter","StackedLineChart","SteamChart","_useState2","showPercent","setShowPercent","totalPerPoint","sum","index","rawValue","round","Number","EPSILON","interaction","mode","intersect","max","undefined","ToggleButton","p","RadialLinearScale","chartProps","chart","name","getChartComponent","fuiTheme","_d$radius","_series$type","secondaryAxisId","_d$min","_d$max","_datum$value","_datum$value2","Date","getTime","_d$value","_d$value2","Error","useChartFactory","CACHE","openDatabase","_asyncToGenerator","_regenerator","_callee","w","_context","n","openDB","upgrade","db","createObjectStore","getCachedData","_ref2","_callee2","cached","_context2","_x","setCachedData","_ref3","_callee3","_context3","put","timestamp","now","_x2","_x3","deleteCachedData","_ref4","_callee4","_context4","_x4","clearCache","_ref5","_callee5","_context5","clear","clearExpiredCache","_ref6","_callee6","maxAge","allKeys","_iterator","_step","_context6","getAllKeys","_createForOfIteratorHelperLoose","done","_x5","useIndexedDBCache","_callee7","_context7","getData","_ref8","_callee8","_context8","_x6","setData","_ref9","_callee9","_context9","_x7","_x8","deleteData","_ref0","_callee0","_context0","_x9","clearAllCache","_ref1","_callee1","_context1","cardCharts","_ref$containerHeight","containerHeight","_ref$maxSpanRows","maxSpanRows","dashboardContainer","colorNeutralBackground2","gridAutoRows","overflowY","overflowX","::-webkit-scrollbar","::-webkit-scrollbar-track","colorNeutralBackground4","::-webkit-scrollbar-thumb","colorBrandStroke2Hover","::-webkit-scrollbar-thumb:hover","gridAutoFlow","cardBody","chartContainer","flex","cardDescription","cardWrapper","borderRadiusMedium","transition","&:hover","transform","boxShadow","shadow16","&:active","shadow8","_useIndexedDBCache","CACHE_EXPIRATION_DAYS","_useIndexedDBCache2","getOrderData","setOrderData","CardChartContainer","setCardChartContainer","sizes","setSizes","dragItem","dragOverItem","_yield$Promise$all","cachedSizes","cachedOrder","orderedCards","cardMap","validCachedOrder","missingCards","initialSizes","fallbackSizes","Promise","all","card","has","c","cachedSize","_cachedSize$spanCols","_c$defaultSpan","defaultSpan","_cachedSize$spanRows","_c$defaultSpan2","console","warn","_c$defaultSpan$spanCo","_c$defaultSpan3","_c$defaultSpan$spanRo","_c$defaultSpan4","initializeData","saveSizesToCache","Object","saveOrderToCache","cardOrder","reset","showZoom","minCardWidth","gridGap","containerPadding","innerWidth","columns","maxZoom","handleSort","copy","_copy$splice","splice","handleZoomSelect","span","newSizes","_extends2","defaultColsAndRowSpanBasedOnNumberColumns","_card$defaultSpan$spa","_card$defaultSpan","_card$defaultSpan$spa2","_card$defaultSpan2","renderCards","cardContainer","_sizes$cardContainer$","_defaultColsAndRowSpa","_sizes$cardContainer$2","_defaultColsAndRowSpa2","draggable","onDragStart","onDragEnter","onDragOver","e","preventDefault","onDragEnd","gridColumnEnd","gridRowEnd","Card","CardHeader","header","cardTitle","action","IsOpen","fontSizeBase100"],"mappings":"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"}
1
+ {"version":3,"file":"fluentui-react-charts.cjs.production.min.js","sources":["../src/components/svgImages/BusinessReportIcon.tsx","../src/components/stack/Stack.tsx","../src/components/dashboard/NoDashboards.tsx","../src/components/RenderLabel/useRenderLabelStylesStyles.ts","../src/components/RenderLabel/RenderLabel.tsx","../src/components/dashboard/selectZoom/SelectZoom.tsx","../src/components/legendeButton/LegendButton.tsx","../src/components/legendContainer/LegendContainer.tsx","../src/hooks/useChartUtils.tsx","../src/hooks/useResponsiveLegend.ts","../src/components/RenderLegend/RenderLegend.tsx","../src/graphGlobalStyles/useGraphGlobalStyles.ts","../src/charts/areaChart/AreaChart.tsx","../src/charts/BarChart/BarChart.tsx","../src/charts/barHorizontalChart/BarHotizontalChart.tsx","../src/charts/bubbleChart/BubbleChart.tsx","../src/charts/ComboChart/ComboChart.tsx","../src/components/renderValueLegend/RenderValueLegend.tsx","../src/charts/Doughnut/DoughnutChart.tsx","../src/charts/floatBarChart/FloatBarChart.tsx","../src/charts/lineChart/LineChart.tsx","../src/charts/PieChart/PieChart.tsx","../src/components/renderSliceLegend/RenderSliceLegend.tsx","../src/charts/polarChart/PolarChart.tsx","../src/charts/radarChart/RadarChart.tsx","../src/charts/scatterChart/ScatterChart.tsx","../src/charts/stackedLineChart/StackedLineChart.tsx","../src/charts/steamChart/SteamChart.tsx","../src/hooks/useChartFactory.tsx","../src/hooks/useIndexedDBCache.ts","../src/components/dashboard/DashBoard.tsx","../src/components/dashboard/useDashboardStyles.ts"],"sourcesContent":["import React from \"react\";\nimport { tokens } from \"@fluentui/react-components\";\n\ninterface BusinessReportIconProps {\n width?: number;\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const BusinessReportIcon: React.FC<BusinessReportIconProps> = ({\n width = 200,\n height = 200,\n className,\n style,\n}) => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"200 400 1400 1000\"\n className={className}\n style={{\n fill: tokens.colorNeutralForeground2,\n ...style,\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g id=\"BACKGROUND\">\n <rect\n style={{ fill: tokens.colorNeutralBackground1 }}\n x=\"200\"\n y=\"400\"\n width=\"1400\"\n height=\"1000\"\n />\n </g>\n\n {/* Main chart/dashboard area */}\n <g>\n <g>\n <rect\n x=\"486.006\"\n y=\"568.026\"\n style={{ fill: tokens.colorNeutralBackground1 }}\n width=\"1038.994\"\n height=\"768.164\"\n />\n <path\n style={{ fill: tokens.colorNeutralStroke1 }}\n d=\"M1527.5,1338.69H483.506V565.526H1527.5V1338.69z M488.506,1333.69H1522.5V570.526H488.506V1333.69z\"\n />\n </g>\n <g>\n {/* Chart bars */}\n <rect\n x=\"558.003\"\n y=\"1086.698\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"164.492\"\n />\n <rect\n x=\"693.003\"\n y=\"1004.672\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"246.519\"\n />\n <rect\n x=\"828.003\"\n y=\"835.487\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"415.703\"\n />\n <rect\n x=\"963.003\"\n y=\"955.6\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"295.591\"\n />\n <rect\n x=\"1098.003\"\n y=\"825.238\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"425.952\"\n />\n <rect\n x=\"1233.003\"\n y=\"847.489\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"403.701\"\n />\n <rect\n x=\"1368.003\"\n y=\"699.989\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"85\"\n height=\"551.201\"\n />\n {/* Chart line */}\n <polygon\n style={{ fill: tokens.colorBrandBackground }}\n 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\"\n />\n </g>\n {/* Chart grid lines */}\n <rect\n x=\"796.336\"\n y=\"662.857\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"418.333\"\n height=\"5\"\n />\n <rect\n x=\"937.543\"\n y=\"717.857\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"135.92\"\n height=\"5\"\n />\n </g>\n\n {/* Small chart on left */}\n <g>\n <g>\n <rect\n x=\"264.978\"\n y=\"441.049\"\n style={{ fill: tokens.colorNeutralBackground1 }}\n width=\"482.581\"\n height=\"379.067\"\n />\n <path\n style={{ fill: tokens.colorNeutralStroke1 }}\n d=\"M750.06,822.616H262.478V438.549H750.06V822.616z M267.478,817.616H745.06V443.549H267.478V817.616z\"\n />\n </g>\n <g>\n {/* Small chart elements */}\n <g>\n <rect\n x=\"330.537\"\n y=\"503.15\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"108.842\"\n height=\"61.633\"\n />\n <g>\n <rect\n x=\"485.277\"\n y=\"509.093\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"198.014\"\n height=\"2.623\"\n />\n <rect\n x=\"485.277\"\n y=\"532.656\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"198.014\"\n height=\"2.623\"\n />\n <rect\n x=\"485.277\"\n y=\"556.218\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"198.014\"\n height=\"2.623\"\n />\n </g>\n </g>\n {/* Bar chart elements */}\n <g>\n <g>\n <rect\n x=\"381.691\"\n y=\"687.747\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"22.73\"\n height=\"70.417\"\n />\n <rect\n x=\"404.421\"\n y=\"653.482\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"22.73\"\n height=\"104.682\"\n />\n </g>\n <g>\n <rect\n x=\"466.491\"\n y=\"641.634\"\n style={{ fill: tokens.colorNeutralForeground3, opacity: 0.3 }}\n width=\"22.73\"\n height=\"116.089\"\n />\n <rect\n x=\"489.221\"\n y=\"714.758\"\n style={{ fill: tokens.colorBrandBackground }}\n width=\"22.73\"\n height=\"42.965\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n};\n\nexport default BusinessReportIcon;\n","import { mergeClasses, tokens } from \"@fluentui/react-components\";\n\nimport { IStackProps } from \"./IStackProps\";\nimport React from \"react\";\nimport { css } from \"@emotion/css\";\n\n/**\n * Mapping of predefined sizes to Fluent UI tokens.\n */\nconst sizeMap: Record<string, string> = {\n xs: tokens.spacingHorizontalXS,\n s: tokens.spacingHorizontalS,\n m: tokens.spacingHorizontalM,\n l: tokens.spacingHorizontalL,\n xl: tokens.spacingHorizontalXL,\n xxl: tokens.spacingHorizontalXXL,\n};\n\n/**\n * Stack component provides a flexible layout using Flexbox.\n * It allows stacking child components either horizontally or vertically with predefined spacing options.\n */\nexport const Stack: React.FC<IStackProps> = React.memo(\n ({\n direction = \"vertical\",\n justifyContent = \"flex-start\",\n alignItems = \"stretch\",\n gap,\n columnGap,\n rowGap,\n margin,\n padding,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n width,\n height,\n wrap = false,\n children,\n style,\n className,\n overflow,\n background\n }) => {\n const stackStyle = css({\n display: \"flex\",\n flexDirection: direction === \"horizontal\" ? \"row\" : \"column\",\n justifyContent,\n alignItems,\n gap: gap && sizeMap[gap] ? sizeMap[gap] : gap,\n columnGap:\n columnGap && sizeMap[columnGap] ? sizeMap[columnGap] : columnGap,\n rowGap: rowGap && sizeMap[rowGap] ? sizeMap[rowGap] : rowGap,\n margin: margin && sizeMap[margin] ? sizeMap[margin] : margin,\n padding: padding && sizeMap[padding] ? sizeMap[padding] : padding,\n marginTop:\n marginTop && sizeMap[marginTop] ? sizeMap[marginTop] : marginTop,\n marginBottom:\n marginBottom && sizeMap[marginBottom]\n ? sizeMap[marginBottom]\n : marginBottom,\n marginLeft:\n marginLeft && sizeMap[marginLeft] ? sizeMap[marginLeft] : marginLeft,\n marginRight:\n marginRight && sizeMap[marginRight]\n ? sizeMap[marginRight]\n : marginRight,\n paddingTop:\n paddingTop && sizeMap[paddingTop] ? sizeMap[paddingTop] : paddingTop,\n paddingBottom:\n paddingBottom && sizeMap[paddingBottom]\n ? sizeMap[paddingBottom]\n : paddingBottom,\n paddingLeft:\n paddingLeft && sizeMap[paddingLeft]\n ? sizeMap[paddingLeft]\n : paddingLeft,\n paddingRight:\n paddingRight && sizeMap[paddingRight]\n ? sizeMap[paddingRight]\n : paddingRight,\n width,\n height,\n overflow,\n flexWrap: wrap ? \"wrap\" : \"nowrap\",\n backgroundColor: background,\n ...style,\n });\n\n return (\n <div className={mergeClasses(className, stackStyle)}>{children}</div>\n );\n }\n);\n\nStack.displayName = \"Stack\";\n\nexport default Stack;\n","import * as React from 'react';\n\nimport BusinessReportIcon from '../svgImages/BusinessReportIcon';\nimport Stack from '../stack/Stack';\nimport { Text } from '@fluentui/react-components';\n\nexport interface INoDashboardsProps {\n height?: string;\n}\n\nexport const NoDashboards: React.FunctionComponent<INoDashboardsProps> = (props: React.PropsWithChildren<INoDashboardsProps>) => {\n const { height } = props;\n\n return (\n <>\n <Stack\n style={{ height: height || \"100%\" }}\n justifyContent=\"Center\"\n alignItems=\"Center\"\n >\n <BusinessReportIcon width={200} height={200} />\n <Text size={500} weight='semibold'>No Dashboards Available</Text>\n </Stack>\n </>\n );\n};","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n makeStyles,\n shorthands,\n} from '@fluentui/react-components';\n\nexport const useRenderLabelStyles = makeStyles({\n\n labelContainer: {\n display: \"flex\",\n flexDirection: \"row\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n ...shorthands.gap(\"6px\"),\n },\n iconStyles: {\n width: \"26px\",\n },\n item: {\n paddingLeft: \"15px\",\n },\n \n\n});\n","import * as React from 'react';\n\nimport {\n Caption1,\n tokens,\n} from '@fluentui/react-components';\nimport { Icon } from '@iconify/react';\n\nimport { useRenderLabelStyles } from './useRenderLabelStylesStyles';\n\nexport interface IRenderLabelProps {\n label: string; icon?: string | JSX.Element; isRequired?: boolean\n}\n\nexport const RenderLabel: React.FunctionComponent<IRenderLabelProps> = (props: React.PropsWithChildren<IRenderLabelProps>) => {\n const { label, icon, isRequired } = props;\n const styles = useRenderLabelStyles();\n return (\n <>\n <div className={styles.labelContainer}>\n {icon && React.isValidElement(icon) ? (\n icon\n ) : (\n <Icon\n icon={icon as string}\n className={styles.iconStyles}\n width={\"20px\"}\n height={\"20px\"}\n color={tokens.colorBrandForeground1}\n />\n )}\n <Caption1 style={{ color: tokens.colorBrandForeground1 }}>{label}</Caption1>\n <Caption1 style={{ color: tokens.colorPaletteRedForeground1 }}>{isRequired ? \" *\" : \"\"}</Caption1>\n </div>\n </>\n );\n};\n\nexport default RenderLabel;\n","import * as React from \"react\";\n\nimport {\n Caption1,\n Menu,\n MenuButton,\n MenuPopover,\n MenuProps,\n MenuTrigger,\n Tooltip,\n tokens,\n} from \"@fluentui/react-components\";\nimport {\n Settings20Filled,\n Settings20Regular,\n bundleIcon,\n} from \"@fluentui/react-icons\";\n\nimport { RenderLabel } from \"../../RenderLabel\";\nimport { css } from \"@emotion/css\";\n\nexport interface ISelectZoomProps {\n IsOpen: boolean;\n onChange?: (value: { spanCols: number; spanRows: number }) => void;\n values: { spanCols: number; spanRows: number };\n maxCols: number;\n maxRows: number;\n}\n\nconst useStyles = (): {\n gridContainer: string;\n cell: string;\n hoveredCell: string;\n selectedCell: string;\n menuPopover: string;\n bottomText: string;\n zoomContainer: string;\n} => ({\n gridContainer: css`\n display: grid;\n gap: 4px;\n padding: 8px;\n justify-content: center;\n `,\n cell: css`\n width: 30px;\n height: 30px;\n border: 1px solid ${tokens.colorNeutralStroke1};\n background-color: ${tokens.colorNeutralBackground1};\n cursor: pointer;\n transition: background-color 150ms ease, transform 150ms ease;\n will-change: background-color, transform;\n `,\n hoveredCell: css`\n background-color: ${tokens.colorNeutralBackground1Hover};\n transform: scale(1.05);\n `,\n selectedCell: css`\n background-color: ${tokens.colorNeutralBackground1Selected};\n `,\n menuPopover: css`\n min-width: fit-content;\n `,\n bottomText: css`\n padding-left: 8px;\n padding-right: 8px;\n `,\n zoomContainer: css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: '6px',\n width: '100%',\n boxSizing: 'border-box',\n \n padding: '8px 0px',\n \n }),\n});\n\nexport const SelectZoom: React.FunctionComponent<ISelectZoomProps> = (\n props: React.PropsWithChildren<ISelectZoomProps>\n) => {\n const { onChange, values: defaultValues, maxCols, maxRows } = props;\n const Settings = bundleIcon(Settings20Filled, Settings20Regular);\n const styles = useStyles();\n\n const [values, setValues] = React.useState(defaultValues);\n const [hovered, setHovered] = React.useState<{\n spanCols: number;\n spanRows: number;\n } | null>(null);\n const [open, setOpen] = React.useState(false);\n\n React.useEffect(() => {\n setValues(defaultValues);\n }, [defaultValues]);\n\n const onOpenChange: MenuProps[\"onOpenChange\"] = (_, data) => {\n setOpen(data.open);\n setHovered(null);\n };\n\n const handleCellClick = (row: number, col: number):void => {\n const newValues = { spanCols: col + 1, spanRows: row + 1 };\n setValues(newValues);\n onChange?.(newValues);\n setOpen(false);\n };\n\n const handleCellHover = (row: number, col: number):void => {\n setHovered({ spanCols: col + 1, spanRows: row + 1 });\n };\n\n const handleMouseLeave = ():void => {\n setHovered(null);\n };\n\n const renderGridCells = (): React.ReactNode[] => {\n const cells: React.ReactNode[] = [];\n for (let row = 0; row < maxRows; row++) {\n for (let col = 0; col < maxCols; col++) {\n const isSelected = row < values.spanRows && col < values.spanCols;\n const isHovered =\n hovered && row < hovered.spanRows && col < hovered.spanCols;\n cells.push(\n <div\n key={`${row}-${col}`}\n className={`${styles.cell} ${isHovered ? styles.hoveredCell : \"\"} ${\n isSelected ? styles.selectedCell : \"\"\n }`}\n onMouseEnter={() => handleCellHover(row, col)}\n onClick={() => handleCellClick(row, col)}\n />\n );\n }\n }\n return cells;\n };\n\n // Compute popover width dynamically\n const popoverWidth = React.useMemo(() => (30 * maxCols) + (4 * (maxCols - 1)) + 32, [maxCols]); // 30px for each cell, 4px gap, and 32px padding (16 left and right)\n\n return (\n <Menu open={open} onOpenChange={onOpenChange}>\n <MenuTrigger disableButtonEnhancement>\n <Tooltip content=\"Configure\" relationship=\"label\">\n <MenuButton\n icon={<Settings />}\n size=\"small\"\n appearance=\"transparent\"\n />\n </Tooltip>\n </MenuTrigger>\n\n <MenuPopover\n style={{ width: `${popoverWidth}px`, minWidth: \"120px\", padding: 8 }}\n >\n <div\n className={styles.zoomContainer} \n >\n <RenderLabel\n label={`Span (${values.spanCols} × ${values.spanRows})`}\n \n />\n </div>\n\n {/* Grid */}\n <div\n className={styles.gridContainer}\n style={{\n gridTemplateColumns: `repeat(${maxCols}, 30px)`,\n gridTemplateRows: `repeat(${maxRows}, 30px)`,\n }}\n onMouseLeave={handleMouseLeave}\n >\n {renderGridCells()}\n </div>\n\n <Caption1 className={styles.bottomText}>Click to set span</Caption1>\n </MenuPopover>\n </Menu>\n );\n};\n","// LegendButton.tsx\nimport { Button, Caption1, Tooltip, tokens } from '@fluentui/react-components';\n\nimport React from 'react';\n\ninterface LegendButtonProps {\n label: string;\n isVisible: boolean;\n color: string;\n onClick: () => void;\n style?: React.CSSProperties;\n buttonRef?: React.Ref<HTMLButtonElement>;\n}\n\nexport const LegendButton: React.FC<LegendButtonProps> = ({\n label,\n isVisible,\n color,\n onClick,\n style = {},\n buttonRef,\n}) => {\n return (\n <Tooltip content={label} relationship=\"label\">\n <Button\n ref={buttonRef}\n shape=\"circular\"\n size=\"small\"\n appearance={isVisible ? 'primary' : 'outline'}\n onClick={onClick}\n style={{\n backgroundColor: isVisible ? color : 'transparent',\n color: isVisible ? '#fff' : tokens.colorNeutralForeground1,\n borderColor: color,\n borderWidth: 1,\n width: '100px',\n padding: '4px 8px',\n textAlign: 'center',\n ...style,\n }}\n >\n <Caption1\n as=\"span\"\n style={{\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n lineHeight: '1.25',\n }}\n >\n {label}\n </Caption1>\n </Button>\n </Tooltip>\n );\n};\n","import {\n Menu,\n MenuButton,\n MenuItem,\n MenuList,\n MenuPopover,\n MenuTrigger,\n} from '@fluentui/react-components';\n\nimport { LegendButton } from '../legendeButton/LegendButton';\nimport React from 'react';\nimport Stack from '../stack/Stack';\nimport { css } from '@emotion/css';\n\ninterface LegendContainerProps<T> {\n items: T[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n renderLabel: (item: T) => string;\n getColor: (item: T) => string;\n}\n\nconst styles = {\n wrapper: css({\n display: 'flex',\n flexWrap: 'nowrap',\n overflow: 'hidden',\n justifyContent: 'center',\n gap: 10,\n padding: 2,\n width: '100%',\n boxSizing: 'border-box',\n }),\n};\n\nexport function LegendContainer<T extends { label: string }>(\n props: LegendContainerProps<T> & {\n containerRef: React.RefObject<HTMLDivElement>;\n \n visibleItems: T[];\n overflowItems: T[];\n }\n) {\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n visibleLabels,\n toggleLabel,\n renderLabel,\n getColor,\n } = props;\n\n return (\n <Stack\n justifyContent=\"center\"\n alignItems=\"center\"\n marginLeft=\"10px\"\n marginRight=\"10px\"\n marginTop=\"25px\"\n marginBottom=\"20px\"\n >\n <div ref={containerRef} className={styles.wrapper}>\n {visibleItems.map(item => {\n const label = item.label;\n const isVisible =\n visibleLabels.length === 0 || visibleLabels.includes(label);\n return (\n \n <LegendButton\n key={label}\n label={renderLabel(item)}\n color={getColor(item)}\n isVisible={isVisible}\n onClick={() => toggleLabel(label)}\n \n />\n \n );\n })}\n\n {overflowItems.length > 0 && (\n <Menu>\n <MenuTrigger disableButtonEnhancement>\n <MenuButton size=\"small\" appearance=\"transparent\">\n +{overflowItems.length}\n </MenuButton>\n </MenuTrigger>\n <MenuPopover style={{ minWidth: 'fit-content', maxWidth: '200px' }}>\n <MenuList>\n {overflowItems.map(item => {\n const label = item.label;\n const isVisible =\n visibleLabels.length === 0 || visibleLabels.includes(label);\n return (\n <MenuItem key={label} style={{ padding: 0 }}>\n \n <LegendButton\n label={renderLabel(item)}\n color={getColor(item)}\n isVisible={isVisible}\n onClick={() => toggleLabel(label)}\n style={{ width: '100px', textAlign: 'left' }}\n />\n \n \n </MenuItem>\n );\n })}\n </MenuList>\n </MenuPopover>\n </Menu>\n )}\n </div>\n </Stack>\n );\n}\n","import {\n ChartType,\n TooltipCallbacks,\n TooltipItem,\n TooltipModel,\n TooltipOptions,\n} from 'chart.js';\n\nimport { Theme } from '@fluentui/react-components';\nimport { useMemo } from 'react';\n\n/**\n * Lightens a given hex color by a percentage amount (0 to 1).\n */\nexport const lightenColor = (hex: string, amount: number): string => {\n if (!/^#?[0-9A-Fa-f]{6}$/.test(hex)) return hex;\n if (hex.startsWith('#')) hex = hex.slice(1);\n\n let r = parseInt(hex.slice(0, 2), 16);\n let g = parseInt(hex.slice(2, 4), 16);\n let b = parseInt(hex.slice(4, 6), 16);\n\n r = Math.min(255, Math.floor(r + (255 - r) * amount));\n g = Math.min(255, Math.floor(g + (255 - g) * amount));\n b = Math.min(255, Math.floor(b + (255 - b) * amount));\n\n const toHex = (v: number) => v.toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\nexport const getFluentPalette = (theme: Theme): string[] => {\n // Check if theme is dark by looking at global color tokens\n const isDark = theme.colorNeutralBackground1.startsWith('#1') || theme.colorNeutralBackground1 === '#000000';\n\n return isDark\n ? [\n '#2899f5', // Blue (Higher luminance for dark surfaces)\n '#ff8c00', // Orange\n '#32cd32', // Green\n '#f06b71', // Red\n '#c390f2', // Purple\n '#00b7c3', // Teal\n '#ffb900', // Yellow/Gold\n '#b4a0ff', // Lavender\n '#60cdff', // Light Blue\n '#92c353', // Lime\n ]\n : [\n '#0078d4', // Microsoft Blue\n '#d83b01', // Deep Orange\n '#107c10', // Forest Green\n '#a4262c', // Dark Red\n '#5c2d91', // Rich Purple\n '#008272', // Dark Teal\n '#c43148', // Berry\n '#005a9e', // Navy\n '#8764b8', // Orchid\n '#498205', // Moss Green\n ];\n};\n\n\n\n/**\n * Returns animation configuration for instant interactions.\n * Disables hover/tooltip animations for immediate response.\n */\nexport const getInstantInteractionAnimations = () => ({\n animation: false as const, // Disable all animations\n transitions: {\n active: {\n animation: {\n duration: 0, // No delay on hover\n },\n },\n },\n});\n\n/**\n * Smart Fluent tooltip generator with chart-type awareness.\n * Optimized for fast performance with reduced animation delays.\n */\n\nexport function createFluentTooltip<TType extends ChartType>(\n theme: Theme\n): Partial<TooltipOptions<TType>> {\n const fontFamily = theme.fontFamilyBase;\n const fontSize = parseInt(theme.fontSizeBase200.replace('px', '')) || 14;\n const tooltipBg = theme.colorNeutralBackground1;\n const tooltipTitleColor = theme.colorNeutralForeground1;\n const tooltipBodyColor = theme.colorNeutralForeground1;\n const borderColor = theme.colorNeutralStroke2;\n\n const callbacks: TooltipCallbacks<TType> = {\n title(this: TooltipModel<TType>, context: TooltipItem<TType>[]) {\n return context[0]?.label ?? '';\n },\n\n label(this: TooltipModel<TType>, item: TooltipItem<TType>) {\n const datasetLabel =\n 'label' in (item.dataset as Record<string, any>) &&\n typeof (item.dataset as Record<string, any>).label === 'string'\n ? (item.dataset as Record<string, any>).label\n : 'Value';\n\n const raw = item.raw;\n\n // Bubble format { x, y, r }\n if (\n typeof raw === 'object' &&\n raw !== null &&\n 'x' in raw &&\n 'y' in raw &&\n 'r' in raw\n ) {\n const { x, y, r } = raw as any;\n return `${datasetLabel} — x: ${x}, y: ${y}, r: ${r}`;\n }\n\n // Scatter format { x, y }\n if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw) {\n const { x, y } = raw as any;\n return `${datasetLabel} — x: ${x}, y: ${y}`;\n }\n\n // Floating bar [min, max]\n if (Array.isArray(raw) && raw.length === 2) {\n const [min, max] = raw;\n return `${datasetLabel}: ${min} – ${max}`;\n }\n\n // Default: single number or string\n return `${datasetLabel}: ${raw}`;\n },\n\n beforeTitle: () => '',\n afterTitle: () => '',\n beforeBody: () => '',\n afterBody: () => '',\n beforeLabel: () => '',\n afterLabel: () => '',\n labelColor: () => undefined as any,\n labelTextColor: () => '',\n footer: () => '',\n beforeFooter: () => '',\n afterFooter: () => '',\n labelPointStyle: () => ({\n pointStyle: 'circle',\n rotation: 0,\n radius: 5,\n }),\n };\n\n return {\n enabled: true,\n displayColors: true,\n boxWidth: 10,\n boxHeight: 10,\n boxPadding: 5,\n backgroundColor: tooltipBg,\n borderColor,\n borderWidth: 1,\n cornerRadius: 4,\n padding: 10,\n titleColor: tooltipTitleColor,\n bodyColor: tooltipBodyColor,\n titleFont: { family: fontFamily, size: fontSize },\n bodyFont: { family: fontFamily, size: fontSize },\n // Performance optimizations for faster tooltip display\n animation: {\n duration: 0, // Disable tooltip animation for instant display\n },\n callbacks,\n };\n}\n\n\n/**\n * Returns a Chart.js ticks callback to truncate long labels and add optional prefix/suffix.\n */\nexport const createAxisLabelFormatter = ({\n maxLength = 12,\n suffix = '',\n prefix = '',\n}: {\n maxLength?: number;\n suffix?: string;\n prefix?: string;\n}) => {\n return function (this: any, value: string | number): string {\n const label = typeof value === 'number' ? this.getLabelForValue(value) : String(value);\n const trimmed = label.length > maxLength ? label.slice(0, maxLength) + '…' : label;\n return `${prefix}${trimmed}${suffix}`;\n };\n};\n\n\nfunction debounce<T extends (...args: any[]) => void>(fn: T, delay: number): T {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return function(this: any, ...args: any[]) {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fn.apply(this, args), delay);\n } as T;\n}\n\n/**\n * useChartUtils — shared theming and chart helpers.\n */\nexport function useChartUtils(theme?: Theme) {\n return useMemo(\n () => ({\n lightenColor,\n getFluentPalette,\n createFluentTooltip,\n createAxisLabelFormatter,\n debounce,\n getInstantInteractionAnimations\n }),\n [theme]\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { useChartUtils } from './useChartUtils';\n\nconst BUTTON_WIDTH = 100;\nconst GAP = 10;\n\nexport function useResponsiveLegend<T extends { label: string }>(items: T[]) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [maxVisible, setMaxVisible] = useState(items.length);\n const { debounce } = useChartUtils();\n useEffect(() => {\n const measure = () => {\n const containerWidth = containerRef.current?.offsetWidth ?? 0;\n const itemTotalWidth = BUTTON_WIDTH + GAP;\n const count = Math.floor(containerWidth / itemTotalWidth);\n setMaxVisible(count);\n };\n\n const debouncedMeasure = debounce(measure, 100); // debounce resize\n\n const observer = new ResizeObserver(debouncedMeasure);\n if (containerRef.current) observer.observe(containerRef.current);\n measure(); // initial\n\n return () => observer.disconnect();\n }, [items]);\n\n return {\n containerRef,\n visibleItems: items.slice(0, maxVisible),\n overflowItems: items.slice(maxVisible),\n };\n}\n","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface LegendControlProps {\n data: { label: string }[];\n visibleSeries: string[];\n seriesColors: Record<string, string>;\n toggleSeries: (label: string) => void;\n}\n\nconst RenderLegend: React.FC<LegendControlProps> = ({\n data,\n visibleSeries,\n seriesColors,\n toggleSeries,\n}) => {\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n } = useResponsiveLegend(data);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n \n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={data}\n visibleLabels={visibleSeries}\n toggleLabel={toggleSeries}\n renderLabel={d => d.label}\n getColor={d => seriesColors[d.label]}\n />\n );\n};\n\nexport default RenderLegend;\n","import { css } from \"@emotion/css\";\n\nexport const useGraphGlobalStyles = () => {\n return {\n chartWithLegend: css({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n chartArea: {\n flexGrow: 1,\n minHeight: 0,\n },\n }),\n chartArea: css`\n flex-grow: 1;\n min-height: 0;\n `,\n legendArea: css`\n margin-top: 0px;\n padding-top: 0px;\n \n margin-Left: 10px;\n margin-Right: 10px;\n \n `,\n };\n \n}","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Tooltip,\n Filler,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface AreaChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme?: Theme;\n}\n\nexport function AreaChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDatalabels = false,\n theme = webLightTheme,\n stacked = false,\n}: AreaChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : null;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n fill: true,\n tension: 0.4,\n pointRadius: 2,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\n const options: ChartOptions<'line'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title ,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n }), [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n\nexport default AreaChart;","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { createAxisLabelFormatter, useChartUtils } from '../../hooks/useChartUtils';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Theme } from '@fluentui/react-components';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface BarProps<T> {\n data: { label: string; data: T[]; type?: 'bar' | 'line' }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme: Theme;\n}\n\nexport function BarChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDatalabels = false,\n stacked = false,\n theme,\n}: BarProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n const styles = useGraphGlobalStyles();\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n // Extract all unique x-axis categories (from all series)\n const allCategories = useMemo(() => {\n const categorySet = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(datum => {\n categorySet.add(getPrimary(datum));\n });\n });\n return Array.from(categorySet);\n }, [data, getPrimary]);\n\n // Construct Chart.js datasets\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n backgroundColor: seriesColors[series.label],\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n // Assign y-axis based on series type when stacked\n yAxisID: stacked ? (series.type === 'line' ? 'y1' : 'y') : 'y',\n })),\n };\n }, [data, visibleSeries, allCategories, seriesColors, stacked]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(\n () => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }),\n [theme]\n );\n\n const options: ChartOptions<'bar'> = useMemo(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(), // Disable animations for instant tooltip\n\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: {\n display: false,\n },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n type: 'linear',\n position: 'left',\n stacked,\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n ...(stacked && {\n y1: {\n type: 'linear',\n position: 'right',\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n drawOnChartArea: false,\n },\n },\n }),\n },\n }),\n [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]\n );\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n\nexport default BarChart;","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Theme } from '@fluentui/react-theme';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n Title,\n ChartDataLabels,\n \n \n);\n\n\n\nexport interface BarHorizontalProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme: Theme;\n}\n\nexport function BarHorizontalChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n stacked = false,\n showDatalabels = false,\n title,\n theme\n}: BarHorizontalProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\nconst styles = useGraphGlobalStyles();\n \n const { lightenColor, getFluentPalette , createFluentTooltip, getInstantInteractionAnimations} = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const categorySet = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(datum => {\n categorySet.add(getPrimary(datum));\n });\n });\n return Array.from(categorySet);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n backgroundColor: seriesColors[series.label],\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n })),\n };\n }, [data, visibleSeries, allCategories, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'bar'> = useMemo(() => ({\n indexAxis: 'y',\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: {\n display: false,\n },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n stacked,\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n },\n }), [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea} >\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n \n );\n}\nexport default BarHorizontalChart;","import {\n BubbleDataPoint,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Bubble } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n Tooltip,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface BubbleChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number | Date;\n getSecondary: (datum: T) => number;\n getRadius: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function BubbleChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n getRadius,\n showDataLabels,\n title,\n theme = webLightTheme,\n}: BubbleChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n\n const styles = useGraphGlobalStyles();\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const chartData = useMemo(() => {\n return {\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: series.data.map(d => ({\n x: getPrimary(d),\n y: getSecondary(d),\n r: getRadius(d),\n })) as BubbleDataPoint[],\n backgroundColor: seriesColors[series.label],\n borderColor: theme.colorNeutralStroke1,\n borderWidth: 1,\n hoverBorderWidth: 2,\n })),\n };\n }, [data, visibleSeries, getPrimary, getSecondary, getRadius, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'bubble'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bubble'>(theme),\n },\n scales: {\n x: {\n type:\n typeof getPrimary(data[0]?.data[0]) === 'number'\n ? 'linear'\n : 'category',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n }), [\n title,\n showDataLabels,\n theme,\n getPrimary,\n getSecondary,\n data,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n createFluentTooltip,\n ]);\n\n return (\n <>\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bubble data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n </>\n );\n}\n\nexport default BubbleChart;","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Chart } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n LineElement,\n PointElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface ComboChartProps<T> {\n data: {\n label: string;\n type: 'bar' | 'line';\n data: T[];\n yAxisID?: string;\n }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n /**\n * 'legacy' keeps previous behaviour (single 'y' axis, non-stacked x).\n * 'dual' enables named y-axes ('y-bar' and 'y-line') and stacked x for bars.\n */\n axesMode?: 'legacy' | 'dual';\n}\n\nexport function ComboChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n axesMode = 'legacy',\n}: ComboChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => series.data.forEach(d => set.add(getPrimary(d))));\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n const sortedSeries = data\n .filter(series => visibleSeries.includes(series.label))\n .sort((a, b) => {\n // Ensure bars come before lines\n if (a.type === 'bar' && b.type === 'line') return -1;\n if (a.type === 'line' && b.type === 'bar') return 1;\n return 0;\n });\n\n return {\n labels: allCategories,\n datasets: sortedSeries.map(series => ({\n type: series.type,\n label: series.label,\n // Respect explicit series yAxisID if provided (retro-compatibility).\n yAxisID: series.yAxisID ?? (axesMode === 'dual' ? (series.type === 'bar' ? 'y-bar' : 'y-line') : 'y'),\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n // In dual mode, group bars into a common stack so they stack on x axis\n stack: axesMode === 'dual' && series.type === 'bar' ? 'barStack' : undefined,\n backgroundColor: seriesColors[series.label],\n borderColor: seriesColors[series.label],\n fill: series.type === 'bar',\n tension: series.type === 'line' ? 0.4 : 0,\n pointRadius: series.type === 'line' ? 3 : 0,\n borderWidth: series.type === 'line' ? 2 : 1,\n order: series.type === 'bar' ? 1 : 0, // Ensure bars are drawn first\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n \n\n const options: ChartOptions<'bar' | 'line'> = useMemo(() => {\n const base = {\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bar' | 'line'>(theme),\n },\n } as ChartOptions<'bar' | 'line'>;\n\n if (axesMode === 'dual') {\n return {\n ...base,\n scales: {\n x: {\n stacked: true,\n ticks: { color: labelColor, font: { family: fontFamily, size: fontSize } },\n grid: { color: gridColor },\n },\n 'y-bar': {\n type: 'linear',\n position: 'left',\n stacked: true,\n offset: true,\n ticks: { color: labelColor, font: { family: fontFamily, size: fontSize } },\n grid: { color: gridColor },\n },\n 'y-line': {\n type: 'linear',\n position: 'right',\n stacked: false,\n ticks: { color: labelColor, font: { family: fontFamily, size: fontSize } },\n grid: { color: gridColor },\n },\n },\n };\n }\n\n return {\n ...base,\n scales: {\n x: {\n ticks: { color: labelColor, font: { family: fontFamily, size: fontSize } },\n grid: { color: gridColor },\n },\n y: {\n position: 'left',\n ticks: { color: labelColor, font: { family: fontFamily, size: fontSize } },\n grid: { color: gridColor },\n stacked: false,\n },\n },\n };\n }, [\n title,\n showDataLabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n createFluentTooltip,\n getInstantInteractionAnimations,\n axesMode,\n ]);\n\n return (\n <>\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Chart type=\"bar\" data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n </>\n );\n}\n\nexport default ComboChart;","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface LegendEntry {\n label: string;\n value: number;\n color: string;\n}\n\nexport interface ValueLegendProps {\n entries: LegendEntry[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n}\n\nconst RenderValueLegend: React.FC<ValueLegendProps> = ({\n entries,\n visibleLabels,\n toggleLabel,\n}) => {\n const {\n containerRef,\n\n visibleItems,\n overflowItems,\n } = useResponsiveLegend(entries);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={entries}\n visibleLabels={visibleLabels}\n toggleLabel={toggleLabel}\n renderLabel={entry => `${entry.label}: ${entry.value}`}\n getColor={entry => entry.color}\n />\n );\n};\n\nexport default RenderValueLegend;\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Doughnut } from 'react-chartjs-2';\nimport RenderValueLegend from '../../components/renderValueLegend/RenderValueLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(ArcElement, Tooltip, Legend, Title);\n\nexport interface DoughnutChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function DoughnutChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n}: DoughnutChartProps<T>) {\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n\n const toggleLabel = (label: string): void => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\n const { allLabels, colors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n return { allLabels, colors };\n }, [valueMap, getFluentPalette, theme, lightenColor]);\n\n const { filteredLabels, values, visibleColors } = useMemo(() => {\n const filteredLabels = allLabels.filter(label => !hiddenLabels.includes(label));\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n return { filteredLabels, values, visibleColors };\n }, [allLabels, hiddenLabels, valueMap, colors]);\n\n const chartData = useMemo(() => ({\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n }), [filteredLabels, values, visibleColors]);\n\n const legendEntries = useMemo(() => {\n return allLabels.map((label, idx) => ({\n label,\n value: valueMap.get(label) || 0,\n color: colors[idx],\n }));\n }, [allLabels, valueMap, colors]);\n\n const options: ChartOptions<'doughnut'> = useMemo(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n legend: { display: false },\n tooltip: createFluentTooltip<'doughnut'>(theme),\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n formatter: (value: number) => value,\n },\n },\n }),\n [title, theme, showDataLabels, createFluentTooltip]\n );\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Doughnut data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderValueLegend\n entries={legendEntries}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n\nexport default DoughnutChart;","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface FloatingBarChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getRange: (datum: T) => [number, number]; // e.g., [min, max]\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function FloatingBarChart<T extends object>({\n data,\n getPrimary,\n getRange,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: FloatingBarChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getRange(match) : [0, 0];\n }),\n backgroundColor: seriesColors[series.label],\n borderRadius: 2,\n })),\n };\n }, [data, visibleSeries, allCategories, getPrimary, getRange, seriesColors]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options: ChartOptions<'bar'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n title,\n theme,\n showDataLabels,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n createFluentTooltip\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n\nexport default FloatingBarChart;","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n LineElement,\n PointElement,\n CategoryScale,\n LinearScale,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface LineChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function LineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: LineChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette , createFluentTooltip, getInstantInteractionAnimations} = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : null;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n tension: 0.4,\n fill: false,\n pointRadius: 4,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'line'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n },\n }), [\n title,\n theme,\n showDataLabels,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n createFluentTooltip\n ]);\n\n return (\n\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <div className={styles.legendArea} >\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n \n );\n}\nexport default LineChart;","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Pie } from 'react-chartjs-2';\nimport RenderValueLegend from '../../components/renderValueLegend/RenderValueLegend';\nimport { createFluentTooltip, getInstantInteractionAnimations } from '../../hooks/useChartUtils';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(ArcElement, Tooltip, Legend, Title);\n\nexport interface PieChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function PieChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: PieChartProps<T>) {\n const { getFluentPalette, lightenColor } = useChartUtils(theme);\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n const styles = useGraphGlobalStyles();\n const toggleLabel = (label: string): void => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\nconst { allLabels, colors, filteredLabels, values, visibleColors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n\n const filteredLabels = allLabels.filter(\n label => !hiddenLabels.includes(label)\n );\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n\n return { allLabels, colors, filteredLabels, values, visibleColors };\n}, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]);\n\nconst { chartData, legendEntries } = useMemo(() => {\n const chartData = {\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n };\n\n const legendEntries = allLabels.map((label, i) => ({\n label,\n value: valueMap.get(label) || 0,\n color: colors[i],\n }));\n\n return { chartData, legendEntries };\n}, [filteredLabels, values, visibleColors, allLabels, valueMap, colors]);\n\nconst options = useMemo<ChartOptions<'pie'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(), // Disable animations for instant tooltip\n plugins: {\n tooltip: createFluentTooltip<'pie'>(theme),\n legend: { display: false },\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n },\n}), [theme, title, showDataLabels]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Pie data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderValueLegend\n entries={legendEntries}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n\nexport default PieChart;","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface SliceLegendProps {\n labels: string[];\n colors: string[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n}\n\nconst RenderSliceLegend: React.FC<SliceLegendProps> = ({\n labels,\n colors,\n visibleLabels,\n toggleLabel,\n}) => {\n interface SliceLegendItem {\n label: string;\n color: string;\n }\n\n const items: SliceLegendItem[] = labels.map((label, i) => ({ label, color: colors[i] }));\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n } = useResponsiveLegend(items);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n \n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={items}\n visibleLabels={visibleLabels}\n toggleLabel={toggleLabel}\n renderLabel={item => item.label}\n getColor={item => item.color}\n />\n );\n};\n\nexport default RenderSliceLegend;\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n RadialLinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useChartUtils } from '../../hooks/useChartUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { PolarArea } from 'react-chartjs-2';\nimport RenderSliceLegend from '../../components/renderSliceLegend/RenderSliceLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n RadialLinearScale,\n ArcElement,\n Tooltip,\n Legend,\n Title,\n ChartDataLabels\n);\n\nexport interface PolarChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function PolarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n}: PolarChartProps<T>) {\n const { getFluentPalette, lightenColor, getInstantInteractionAnimations } = useChartUtils(theme);\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n const styles = useGraphGlobalStyles();\n const toggleLabel = (label: string) => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\nconst { allLabels, colors, filteredLabels, values, visibleColors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n\n const filteredLabels = allLabels.filter(\n label => !hiddenLabels.includes(label)\n );\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n\n return { allLabels, colors, filteredLabels, values, visibleColors };\n}, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]);\n\nconst chartData = useMemo(() => ({\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n}), [filteredLabels, values, visibleColors]);\n\nconst options = useMemo<ChartOptions<'polarArea'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n formatter: (value: number) => value,\n },\n tooltip: createFluentTooltip<'polarArea'>(theme),\n legend: { display: false },\n },\n scales: {\n r: {\n ticks: {\n color: theme.colorNeutralForeground1,\n backdropColor: 'transparent',\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n grid: {\n color: theme.colorNeutralStroke2,\n },\n },\n },\n}), [theme, title, showDataLabels, createFluentTooltip]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <PolarArea data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderSliceLegend\n labels={allLabels}\n colors={colors}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n\nexport default PolarChart;","import {\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n PointElement,\n RadialLinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useChartUtils } from '../../hooks/useChartUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Radar } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n RadialLinearScale,\n PointElement,\n LineElement,\n Filler,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface RadarChartProps<T> {\n data: { label: string; data: T[] }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string; \n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function RadarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme, \n}: RadarChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, getInstantInteractionAnimations } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const allLabels = useMemo(() => {\n const set = new Set<string>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getLabel(d)));\n });\n return Array.from(set);\n }, [data, getLabel]);\n\n const chartData = useMemo(() => {\n return {\n labels: allLabels,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allLabels.map(label => {\n const match = series.data.find(d => getLabel(d) === label);\n return match ? getValue(match) : 0;\n }),\n backgroundColor: seriesColors[series.label] + '33',\n borderColor: seriesColors[series.label],\n borderWidth: 2,\n pointBackgroundColor: seriesColors[series.label],\n })),\n };\n }, [data, visibleSeries, allLabels, getLabel, getValue, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options = useMemo<ChartOptions<'radar'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n tooltip: createFluentTooltip<'radar'>(theme),\n legend: { display: false },\n },\n scales: {\n r: {\n angleLines: { color: gridColor },\n grid: { color: gridColor },\n pointLabels: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n },\n },\n }), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n gridColor,\n labelColor,\n fontFamily,\n fontSize,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Radar data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n\nexport default RadarChart;","import {\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n PointElement,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Scatter } from 'react-chartjs-2';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(LinearScale, PointElement, Tooltip, Legend);\n\nexport interface ScatterChartProps<T> {\n data: { label: string; data: T[] }[];\n getX: (datum: T) => number;\n getY: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function ScatterChart<T extends object>({\n data,\n getX,\n getY,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: ScatterChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n const styles = useGraphGlobalStyles();\n const { getFluentPalette, lightenColor, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = React.useCallback((label: string) => {\n setVisibleSeries(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n }, []);\n\n const chartData = useMemo(() => {\n return {\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: series.data.map(d => ({ x: getX(d), y: getY(d) })),\n backgroundColor: seriesColors[series.label],\n borderColor: seriesColors[series.label],\n pointRadius: 4,\n })),\n };\n }, [data, visibleSeries, getX, getY, seriesColors]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'scatter'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'scatter'>(theme),\n },\n scales: {\n x: {\n type: 'linear',\n position: 'bottom',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n type: 'linear',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Scatter data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n\nexport default ScatterChart;","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useChartUtils } from '../../hooks/useChartUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n LineElement,\n PointElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface StackedLineChartProps<T> {\n data: { label: string; data: T[] }[]; \n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function StackedLineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: StackedLineChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip, getInstantInteractionAnimations } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : 0;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n fill: true,\n tension: 0.4,\n pointRadius: 3,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n\nexport default StackedLineChart;","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, ToggleButton, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useChartUtils } from '../../hooks/useChartUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Stack } from '../../components/stack/Stack';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n LineElement,\n PointElement,\n Filler, \n CategoryScale,\n LinearScale,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface SteamChartProps<T> {\n data: { label: string; data: T[] }[]; \n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport function SteamChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: SteamChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n const [showPercent, setShowPercent] = useState(false);\nconst styles = useGraphGlobalStyles();\n \n const { lightenColor, getFluentPalette, getInstantInteractionAnimations } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme]);\n\n const toggleSeries = React.useCallback(\n (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible\n ? prev.filter(l => l !== label)\n : [...prev, label];\n return next.length === 0 ? [data[0].label] : next;\n });\n },\n [data]\n );\n\n const allLabels = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const totalPerPoint = useMemo(() => {\n return allLabels.map(cat =>\n data.reduce((sum, series) => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return sum + (match ? getSecondary(match) : 0);\n }, 0)\n );\n }, [allLabels, data, getPrimary, getSecondary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allLabels,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map((series, ) => ({\n label: series.label,\n fill: true,\n backgroundColor: seriesColors[series.label],\n borderColor: 'transparent',\n borderWidth: 0,\n data: allLabels.map((cat, index) => {\n const match = series.data.find(d => getPrimary(d) === cat);\n const rawValue = match ? getSecondary(match) : 0;\n const total = totalPerPoint[index] || 1;\n return showPercent\n ? Math.round(((rawValue / total) * 100 + Number.EPSILON) * 100) / 100\n : Math.round((rawValue + Number.EPSILON) * 100) / 100;\n }),\n tension: 0.5,\n })),\n };\n }, [\n data,\n visibleSeries,\n allLabels,\n getPrimary,\n getSecondary,\n seriesColors,\n totalPerPoint,\n showPercent,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n ...getInstantInteractionAnimations(),\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n interaction: {\n mode: 'index',\n intersect: false,\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n ticks: {\n callback: (value: string | number) => (showPercent ? `${value}%` : value),\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n min: 0,\n max: showPercent ? 100 : undefined,\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n showPercent,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <Stack justifyContent=\"center\" alignItems=\"center\" margin=\"7px\">\n <ToggleButton\n onClick={() => setShowPercent(p => !p)}\n shape=\"circular\"\n appearance=\"secondary\"\n size=\"small\"\n style={{ width: '150px' }}\n >\n {showPercent ? 'Show Raw Values' : 'Show %'}\n </ToggleButton>\n </Stack>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n\nexport default SteamChart;","import { Theme, webLightTheme } from \"@fluentui/react-components\";\n\nimport AreaChart from '../charts/areaChart/AreaChart';\nimport BarChart from '../charts/BarChart/BarChart';\nimport BarHorizontalChart from '../charts/barHorizontalChart/BarHotizontalChart';\nimport BubbleChart from '../charts/bubbleChart/BubbleChart';\nimport ComboChart from '../charts/ComboChart/ComboChart';\nimport DoughnutChart from '../charts/Doughnut/DoughnutChart';\nimport FloatingBarChart from '../charts/floatBarChart/FloatBarChart';\nimport { IChart } from \"../models\";\nimport LineChart from '../charts/lineChart/LineChart';\nimport PieChart from '../charts/PieChart/PieChart';\nimport PolarChart from '../charts/polarChart/PolarChart';\nimport RadarChart from '../charts/radarChart/RadarChart';\nimport React from 'react';\nimport ScatterChart from '../charts/scatterChart/ScatterChart';\nimport StackedLineChart from '../charts/stackedLineChart/StackedLineChart';\nimport SteamChart from '../charts/steamChart/SteamChart';\n\nconst chartProps = (chart: IChart) => ({\n data: chart.data,\n title: chart.title,\n getPrimary: (d: any) => d.name,\n getSecondary: (d: any) => d.value,\n});\n\nconst getChartComponent = (chart: IChart, theme: Theme) => {\n const { type } = chart;\n const fuiTheme = theme ?? webLightTheme; \n switch (type) {\n case 'bar':\n return <BarChart {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n case 'line':\n return <LineChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'area':\n return <AreaChart {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n\n case 'bar-horizontal':\n return <BarHorizontalChart {...chartProps(chart)} stacked={true} theme={fuiTheme} />;\n case 'bubble':\n return (\n <BubbleChart {...chartProps(chart)} getRadius={d => d.radius ?? 1} theme={fuiTheme} />\n );\n case 'multiple-axes':\n return (\n <ComboChart\n {...chartProps(chart)}\n theme={fuiTheme}\n // allow the originating chart descriptor to opt into dual axes\n axesMode={(chart as any).axesMode ?? 'dual'}\n \n data={chart.data.map((series: any) => ({\n label: series.label,\n type: series.type ?? 'bar',\n data: series.data,\n yAxisID: series.secondaryAxisId,\n \n }))}\n />\n );\n case 'steam':\n return <SteamChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'floating-bar':\n return (\n <FloatingBarChart\n getRange={d => [d.min ?? 0, d.max ?? 0]}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'stacked-line':\n return <StackedLineChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'doughnut':\n return (\n <DoughnutChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'pie':\n return (\n <PieChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n showDataLabels={true}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'scatter':\n return (\n <ScatterChart\n getX={d => {\n if (typeof d.x === 'number') return d.x;\n if (typeof d.x === 'string') return Number(d.x) || 0;\n if (d.x instanceof Date) return d.x.getTime();\n return 0;\n }}\n getY={d => (typeof d.y === 'number' ? d.y : 0)}\n {...chartProps(chart)}\n theme={fuiTheme}\n showDataLabels={false}\n />\n );\n case 'polar':\n return (\n <PolarChart\n data={chart.data}\n getLabel={d => d.name}\n getValue={d => d.value ?? 0}\n title={chart.title}\n showDataLabels={true} \n theme={fuiTheme}\n />\n );\n case 'radar':\n return (\n <RadarChart\n data={chart.data}\n getLabel={d => d.name}\n getValue={d => d.value ?? 0}\n title={chart.title}\n theme={fuiTheme}\n />\n );\n\n default:\n throw new Error(`Unsupported chart type: ${type}`);\n }\n};\n\nexport const useChartFactory = () => {\n return React.useMemo(() => ({\n getChartComponent\n }), []);\n};","import {\n DBSchema,\n openDB,\n} from 'idb';\n\nimport { useEffect } from 'react';\n\nexport interface CacheData<T> {\n data: T;\n timestamp: number;\n}\n\ninterface CacheDB<T> extends DBSchema {\n cache: {\n key: string;\n value: CacheData<T>;\n };\n}\n\ninterface UseIndexedDBCacheReturn<T> {\n getData: (key: string) => Promise<T | undefined>;\n setData: (key: string, data: T) => Promise<void>;\n deleteData: (key: string) => Promise<void>;\n clearAllCache: () => Promise<void>;\n}\n\nconst CACHE: string = \"application-cache\";\n\nconst openDatabase = async <T>() => {\n return openDB<CacheDB<T>>('app-cache-db', 1, {\n upgrade(db) {\n db.createObjectStore(CACHE as never);\n },\n });\n};\n\nconst getCachedData = async <T>(key: string): Promise<T | undefined> => {\n const db = await openDatabase<T>();\n const cached = await db.get((CACHE as never), key);\n return cached ? cached.data : undefined;\n};\n\nconst setCachedData = async <T>(key: string, data: T): Promise<void> => {\n const db = await openDatabase<T>();\n await db.put(CACHE as never, { data, timestamp: Date.now() }, key);\n};\n\nconst deleteCachedData = async (key: string): Promise<void> => {\n const db = await openDatabase<any>();\n await db.delete(CACHE as never, key);\n};\n\nconst clearCache = async (): Promise<void> => {\n const db = await openDatabase<any>();\n await db.clear(CACHE as never);\n};\n\nconst clearExpiredCache = async (maxAge: number): Promise<void> => {\n const db = await openDatabase<any>();\n const allKeys = await db.getAllKeys(CACHE as never);\n const now = Date.now();\n\n for (const key of allKeys) {\n const cached = await db.get(CACHE as never, key as string);\n if (cached && now - cached.timestamp > maxAge) {\n await db.delete(CACHE as never, key);\n }\n }\n};\nconst DEFAULT_MAX_AGE = 24 * 60 * 60 * 1000; // 1 day in milliseconds\n/**\n * Custom hook to manage IndexedDB cache with a specified maximum age.\n *\n * @template T - The type of data to be cached.\n * @param {number} [maxAge=DEFAULT_MAX_AGE] - The maximum age (in milliseconds) for cached data before it is considered expired.\n * @returns {UseIndexedDBCacheReturn<T>} An object containing methods to interact with the cache.\n *\n * @example\n * const { getData, setData, deleteData, clearAllCache } = useIndexedDBCache<MyDataType>(3600000);\n *\n * @function\n * @name useIndexedDBCache\n * @memberof hooks\n * @inner\n *\n * @typedef {Object} UseIndexedDBCacheReturn<T>\n * @property {function(string): Promise<T | undefined>} getData - Retrieves cached data by key.\n * @property {function(string, T): Promise<void>} setData - Caches data with a specified key.\n * @property {function(string): Promise<void>} deleteData - Deletes cached data by key.\n * @property {function(): Promise<void>} clearAllCache - Clears all cached data.\n */\nexport const useIndexedDBCache = <T>(maxAge: number = DEFAULT_MAX_AGE): UseIndexedDBCacheReturn<T> => {\n useEffect(() => {\n // Clear expired cache on component mount\n (async () => {\n await clearExpiredCache(maxAge);\n })();\n }, [maxAge]);\n\n const getData = async (key: string): Promise<T | undefined> => {\n return await getCachedData<T>(key);\n };\n\n const setData = async (key: string, data: T): Promise<void> => {\n await setCachedData<T>(key, data);\n };\n\n const deleteData = async (key: string): Promise<void> => {\n await deleteCachedData(key);\n };\n\n const clearAllCache = async (): Promise<void> => {\n await clearCache();\n };\n\n return { getData, setData, deleteData, clearAllCache };\n};\n\nexport default useIndexedDBCache;\n","import { Card, CardHeader, Text, Theme } from '@fluentui/react-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { ICardChartContainer } from '../../models/ICardChartContainer';\nimport { IDashboardProps } from './IDashboardProps';\nimport { NoDashboards } from './NoDashboards';\nimport { SelectZoom } from './selectZoom/SelectZoom';\nimport { useChartFactory } from '../../hooks/useChartFactory';\nimport { useDashboardStyles } from './useDashboardStyles';\nimport { useIndexedDBCache } from '../../hooks/useIndexedDBCache';\n\nconst MINIMUM_DASHBOARD_WIDTH = 600;\nconst MAX_ROWS = 4;\nconst DASHBOARD_LAYOUT_CACHE_KEY = 'dashboard-layout-settings';\nconst DASHBOARD_ORDER_CACHE_KEY = 'dashboard-card-order';\nconst CACHE_EXPIRATION_DAYS = 30;\n\nexport const Dashboard: React.FC<IDashboardProps> = ({\n cardCharts,\n theme,\n containerWidth,\n containerHeight = '100%',\n maxSpanRows = MAX_ROWS,\n}) => {\n const styles = useDashboardStyles();\n const { getChartComponent } = useChartFactory();\n \n // Cache with 30-day expiration for dashboard layout settings\n const { getData, setData } = useIndexedDBCache<Record<string, { spanCols: number; spanRows: number }>>(\n CACHE_EXPIRATION_DAYS * 24 * 60 * 60 * 1000\n );\n\n // Cache for card order\n const { \n getData: getOrderData, \n setData: setOrderData \n } = useIndexedDBCache<string[]>(\n CACHE_EXPIRATION_DAYS * 24 * 60 * 60 * 1000\n );\n\n \n\n const [CardChartContainer, setCardChartContainer] = useState<\n ICardChartContainer[]\n >([]);\n\n const [sizes, setSizes] = useState<\n Record<string, { spanCols: number; spanRows: number }>\n >({});\n const dragItem = useRef<number | null>(null);\n const dragOverItem = useRef<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n // Load cached card order and sizes\n const initializeData = async () => {\n try {\n const [cachedSizes, cachedOrder] = await Promise.all([\n getData(DASHBOARD_LAYOUT_CACHE_KEY),\n getOrderData(DASHBOARD_ORDER_CACHE_KEY)\n ]);\n \n // Restore card order if available, otherwise use original order\n let orderedCards = cardCharts;\n if (cachedOrder && cachedOrder.length > 0) {\n // Reorder cards based on cached order, but handle cases where cards might have been added/removed\n const cardMap = new Map(cardCharts.map(card => [card.id, card]));\n const validCachedOrder = cachedOrder.filter(id => cardMap.has(id));\n const missingCards = cardCharts.filter(card => !cachedOrder.includes(card.id));\n \n orderedCards = [\n ...validCachedOrder.map(id => cardMap.get(id)!),\n ...missingCards\n ];\n }\n \n setCardChartContainer(orderedCards);\n \n const initialSizes: Record<\n string,\n { spanCols: number; spanRows: number }\n > = {};\n \n cardCharts.forEach(c => {\n const cachedSize = cachedSizes?.[c.id];\n initialSizes[c.id] = {\n spanCols: cachedSize?.spanCols ?? c.defaultSpan?.spanCols ?? 1,\n spanRows: cachedSize?.spanRows ?? c.defaultSpan?.spanRows ?? 1,\n };\n });\n \n setSizes(initialSizes);\n } catch (error) {\n // Fallback to default values if cache fails\n console.warn('Failed to load dashboard data from cache:', error);\n setCardChartContainer(cardCharts);\n const fallbackSizes: Record<\n string,\n { spanCols: number; spanRows: number }\n > = {};\n cardCharts.forEach(c => {\n fallbackSizes[c.id] = {\n spanCols: c.defaultSpan?.spanCols ?? 1,\n spanRows: c.defaultSpan?.spanRows ?? 1,\n };\n });\n setSizes(fallbackSizes);\n }\n };\n \n initializeData();\n }, [cardCharts]); // Only depend on cardCharts - getData/getOrderData are stable\n\n // Save sizes to cache whenever they change\n useEffect(() => {\n const saveSizesToCache = async () => {\n try {\n await setData(DASHBOARD_LAYOUT_CACHE_KEY, sizes);\n } catch (error) {\n console.warn('Failed to save dashboard layout to cache:', error);\n }\n };\n\n // Only save if sizes is not empty (avoid saving initial empty state)\n if (Object.keys(sizes).length > 0) {\n saveSizesToCache();\n }\n }, [sizes]); // Only depend on sizes - setData is stable\n\n // Save card order to cache whenever it changes\n useEffect(() => {\n const saveOrderToCache = async () => {\n try {\n const cardOrder = CardChartContainer.map(card => card.id);\n await setOrderData(DASHBOARD_ORDER_CACHE_KEY, cardOrder);\n } catch (error) {\n console.warn('Failed to save dashboard order to cache:', error);\n }\n };\n\n // Only save if CardChartContainer is not empty\n if (CardChartContainer.length > 0) {\n saveOrderToCache();\n }\n }, [CardChartContainer]); // Only depend on CardChartContainer - setOrderData is stable\n\n useEffect(() => {\n if (containerWidth <= MINIMUM_DASHBOARD_WIDTH) {\n setSizes(() => {\n const reset: Record<\n string,\n { spanCols: number; spanRows: number }\n > = {};\n CardChartContainer.forEach(c => {\n reset[c.id] = { spanCols: 1, spanRows: 1 };\n });\n return reset;\n });\n }\n }, [containerWidth, CardChartContainer]);\n\n const showZoom = useMemo(() => containerWidth > MINIMUM_DASHBOARD_WIDTH, [\n containerWidth,\n ]);\n\n const { minCardWidth, gridGap, containerPadding } = useMemo(\n () => ({\n minCardWidth: 350,\n gridGap: 16,\n containerPadding: 20,\n }),\n []\n );\n\n const innerWidth = containerWidth - containerPadding * 2;\n const columns = useMemo(\n () => Math.floor((innerWidth + gridGap) / (minCardWidth + gridGap)),\n [innerWidth, gridGap, minCardWidth]\n );\n const maxZoom = Math.max(columns, 1);\n\n const handleSort = useCallback(() => {\n if (\n dragItem.current !== null &&\n dragOverItem.current !== null &&\n dragItem.current !== dragOverItem.current\n ) {\n const copy = [...CardChartContainer];\n const [moved] = copy.splice(dragItem.current, 1);\n copy.splice(dragOverItem.current, 0, moved);\n setCardChartContainer(copy);\n }\n dragItem.current = null;\n dragOverItem.current = null;\n }, [CardChartContainer]);\n\n const handleZoomSelect = useCallback(\n (id: string, span: { spanCols: number; spanRows: number }) => {\n const newSizes = {\n spanCols: Math.min(Math.max(span.spanCols, 1), maxZoom),\n spanRows: Math.min(Math.max(span.spanRows, 1), maxSpanRows),\n };\n \n setSizes(prev => ({\n ...prev,\n [id]: newSizes,\n }));\n },\n [maxZoom, maxSpanRows]\n );\n\n const defaultColsAndRowSpanBasedOnNumberColumns = useMemo(() => {\n return CardChartContainer.reduce((acc, card) => {\n acc[card.id] = {\n spanCols: Math.min(card.defaultSpan?.spanCols ?? 1, columns),\n spanRows: card.defaultSpan?.spanRows ?? 1,\n };\n return acc;\n }, {} as Record<string, { spanCols: number; spanRows: number }>);\n }, [CardChartContainer, columns]);\n\n const renderCards = useMemo(() => {\n return CardChartContainer.map((cardContainer, idx) => (\n <div\n className={styles.cardWrapper}\n key={cardContainer.id}\n draggable\n onDragStart={() => (dragItem.current = idx)}\n onDragEnter={() => (dragOverItem.current = idx)}\n onDragOver={e => e.preventDefault()}\n onDragEnd={handleSort}\n style={{\n gridColumnEnd: sizes[cardContainer.id]?.spanCols\n ? `span ${sizes[cardContainer.id].spanCols}`\n : `span ${defaultColsAndRowSpanBasedOnNumberColumns[\n cardContainer.id\n ]?.spanCols || 1}`,\n gridRowEnd: sizes[cardContainer.id]?.spanRows\n ? `span ${sizes[cardContainer.id].spanRows}`\n : `span ${defaultColsAndRowSpanBasedOnNumberColumns[\n cardContainer.id\n ]?.spanRows || 1}`,\n }}\n >\n <Card className={styles.cardBody}>\n <CardHeader\n header={\n <Text weight=\"semibold\" size={400}>\n {cardContainer.cardTitle}\n </Text>\n }\n action={\n showZoom ? (\n <SelectZoom\n values={\n sizes[cardContainer.id] ||\n defaultColsAndRowSpanBasedOnNumberColumns[\n cardContainer.id\n ] || { spanCols: 1, spanRows: 1 }\n }\n maxCols={maxZoom}\n maxRows={maxSpanRows}\n IsOpen={false}\n onChange={v => handleZoomSelect(cardContainer.id, v)}\n />\n ) : (\n undefined\n )\n }\n />\n <div\n className={styles.chartContainer}\n style={{ height: containerHeight }}\n >\n {theme &&\n theme.fontSizeBase100 &&\n getChartComponent(cardContainer.chart, theme as Theme)}\n </div>\n </Card>\n </div>\n ));\n }, [\n CardChartContainer,\n handleSort,\n sizes,\n styles.cardBody,\n styles.chartContainer,\n showZoom,\n maxZoom,\n getChartComponent,\n handleZoomSelect,\n theme,\n ]);\n\n if (CardChartContainer.length === 0) {\n return <NoDashboards />;\n }\n\n return (\n <>\n <div ref={containerRef} className={styles.dashboardContainer} style={{ height: containerHeight }}>\n {renderCards}\n </div>\n </>\n );\n};\n\nexport default Dashboard;\n","import { css } from '@emotion/css';\nimport { tokens } from '@fluentui/react-components';\n\nexport const useDashboardStyles = (): {\n dashboardContainer: string;\n cardBody: string;\n chartContainer: string;\n cardDescription: string;\n cardWrapper: string;\n} => {\n return {\n dashboardContainer: css({\n display: 'grid',\n padding: '20px',\n gap: '16px',\n backgroundColor: tokens.colorNeutralBackground2,\n gridTemplateColumns: 'repeat(auto-fill, minmax(350px, 1fr))',\n gridAutoRows: '350px',\n overflowY: 'auto',\n overflowX: 'hidden',\n\n // Scrollbar styles\n '::-webkit-scrollbar': {\n width: '5px', // Width for vertical scrollbars\n height: '5px', // Height for horizontal scrollbars\n },\n '::-webkit-scrollbar-track': {\n background: tokens.colorNeutralBackground4, // Light gray for the track\n borderRadius: '10px',\n },\n '::-webkit-scrollbar-thumb': {\n background: tokens.colorBrandStroke2Hover, // Dark gray for the thumb\n borderRadius: '10px',\n },\n '::-webkit-scrollbar-thumb:hover': {\n background: tokens.colorNeutralStroke2, // Dark gray for the thumb\n },\n\n justifyContent: 'center',\n gridAutoFlow: 'dense',\n }),\n cardBody: css({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n minHeight: '320px',\n }),\n chartContainer: css({\n flex: 1,\n width: '100%',\n minHeight: '280px',\n }),\n cardDescription: css({\n color: `${tokens.colorNeutralForeground2}`,\n marginTop: '4px',\n }),\n\n cardWrapper: css({\n position: 'relative',\n height: '100%',\n minHeight: '300px',\n borderRadius: tokens.borderRadiusMedium,\n transition: 'all 0.2s ease',\n\n '&:hover': {\n transform: 'translateY(-2px)',\n boxShadow: `${tokens.shadow16}`,\n },\n\n '&:active': {\n transform: 'translateY(0)',\n boxShadow: `${tokens.shadow8}`,\n },\n }),\n };\n};\n"],"names":["BusinessReportIcon","_ref","width","_ref$height","height","React","_ref$width","viewBox","className","style","_extends","fill","tokens","colorNeutralForeground2","xmlns","id","colorNeutralBackground1","x","y","colorNeutralStroke1","d","colorNeutralForeground3","opacity","colorBrandBackground","points","sizeMap","xs","spacingHorizontalXS","s","spacingHorizontalS","m","spacingHorizontalM","l","spacingHorizontalL","xl","spacingHorizontalXL","xxl","spacingHorizontalXXL","Stack","memo","direction","_ref$justifyContent","justifyContent","_ref$alignItems","alignItems","gap","columnGap","rowGap","margin","padding","marginTop","marginBottom","marginLeft","marginRight","paddingTop","paddingBottom","paddingLeft","paddingRight","_ref$wrap","wrap","children","stackStyle","css","display","flexDirection","_ref$direction","overflow","flexWrap","backgroundColor","background","mergeClasses","displayName","NoDashboards","props","Text","size","weight","useRenderLabelStyles","makeStyles","labelContainer","shorthands","iconStyles","item","RenderLabel","label","icon","isRequired","styles","Icon","color","colorBrandForeground1","Caption1","colorPaletteRedForeground1","SelectZoom","onChange","defaultValues","values","maxCols","maxRows","Settings","bundleIcon","Settings20Filled","Settings20Regular","gridContainer","_templateObject","_taggedTemplateLiteralLoose","cell","_templateObject2","hoveredCell","_templateObject3","colorNeutralBackground1Hover","selectedCell","_templateObject4","colorNeutralBackground1Selected","menuPopover","_templateObject5","bottomText","_templateObject6","zoomContainer","boxSizing","_React$useState","setValues","_React$useState2","hovered","setHovered","_React$useState3","open","setOpen","popoverWidth","Menu","onOpenChange","_","data","MenuTrigger","disableButtonEnhancement","Tooltip","content","relationship","MenuButton","appearance","MenuPopover","minWidth","spanCols","spanRows","gridTemplateColumns","gridTemplateRows","onMouseLeave","cells","_loop","row","_loop2","col","push","key","onMouseEnter","handleCellHover","onClick","newValues","handleCellClick","renderGridCells","LegendButton","isVisible","_ref$style","Button","ref","buttonRef","shape","colorNeutralForeground1","borderColor","borderWidth","textAlign","as","textOverflow","whiteSpace","lineHeight","wrapper","LegendContainer","overflowItems","visibleLabels","toggleLabel","renderLabel","getColor","containerRef","visibleItems","map","length","includes","maxWidth","MenuList","MenuItem","lightenColor","hex","amount","test","startsWith","slice","r","parseInt","g","b","Math","min","floor","toHex","v","toString","padStart","getFluentPalette","theme","getInstantInteractionAnimations","animation","transitions","active","duration","createFluentTooltip","fontFamily","fontFamilyBase","fontSize","fontSizeBase200","replace","enabled","displayColors","boxWidth","boxHeight","boxPadding","colorNeutralStroke2","cornerRadius","titleColor","bodyColor","titleFont","family","bodyFont","callbacks","title","context","_context$0$label","_context$","datasetLabel","dataset","raw","Array","isArray","beforeTitle","afterTitle","beforeBody","afterBody","beforeLabel","afterLabel","labelColor","labelTextColor","footer","beforeFooter","afterFooter","labelPointStyle","pointStyle","rotation","radius","createAxisLabelFormatter","maxLength","_ref$maxLength","_ref$suffix","suffix","_ref$prefix","prefix","value","this","getLabelForValue","String","trimmed","debounce","fn","delay","timer","args","_len","_key","arguments","clearTimeout","setTimeout","apply","_this","useChartUtils","useMemo","useResponsiveLegend","items","useRef","_useState","useState","maxVisible","setMaxVisible","useEffect","measure","containerWidth","_containerRef$current","_containerRef$current2","current","offsetWidth","count","BUTTON_WIDTH","debouncedMeasure","observer","ResizeObserver","observe","disconnect","RenderLegend","visibleSeries","seriesColors","toggleSeries","_useResponsiveLegend","useGraphGlobalStyles","chartWithLegend","chartArea","flexGrow","minHeight","legendArea","AreaChart","getPrimary","getSecondary","_ref$showDatalabels","showDatalabels","_ref$theme","webLightTheme","_ref$stacked","stacked","_data$","setVisibleSeries","_useChartUtils","reduce","acc","series","idx","base","allCategories","set","Set","forEach","add","from","chartData","labels","datasets","filter","cat","match","find","tension","pointRadius","_useMemo","gridColor","options","responsive","maintainAspectRatio","plugins","text","font","fontWeightSemibold","top","bottom","datalabels","legend","tooltip","scales","ticks","grid","Line","prev","next","concat","BarChart","categorySet","datum","found","yAxisID","type","callback","position","y1","drawOnChartArea","Bar","BarHorizontalChart","indexAxis","BubbleChart","getRadius","showDataLabels","hoverBorderWidth","_data$2","Bubble","ComboChart","_ref$showDataLabels","_ref$axesMode","axesMode","sortedSeries","sort","a","_series$yAxisID","stack","undefined","order","y-bar","offset","y-line","Chart","register","CategoryScale","LinearScale","PointElement","LineElement","Filler","Legend","ChartDataLabels","Title","ChartJS","BarElement","RenderValueLegend","entries","entry","DoughnutChart","getLabel","getValue","hiddenLabels","setHiddenLabels","valueMap","Map","get","allLabels","keys","palette","colors","i","_useMemo2","filteredLabels","visibleColors","indexOf","legendEntries","formatter","Doughnut","FloatingBarChart","getRange","borderRadius","LineChart","PieChart","Pie","ArcElement","RenderSliceLegend","PolarChart","backdropColor","PolarArea","RadarChart","pointBackgroundColor","angleLines","pointLabels","Radar","ScatterChart","getX","getY","useCallback","Scatter","StackedLineChart","SteamChart","_useState2","showPercent","setShowPercent","totalPerPoint","sum","index","rawValue","round","Number","EPSILON","interaction","mode","intersect","max","ToggleButton","p","RadialLinearScale","chartProps","chart","name","getChartComponent","fuiTheme","_d$radius","_chart$axesMode","_series$type","secondaryAxisId","_d$min","_d$max","_datum$value","_datum$value2","Date","getTime","_d$value","_d$value2","Error","useChartFactory","CACHE","openDatabase","_asyncToGenerator","_regenerator","_callee","w","_context","n","openDB","upgrade","db","createObjectStore","getCachedData","_ref2","_callee2","cached","_context2","_x","setCachedData","_ref3","_callee3","_context3","put","timestamp","now","_x2","_x3","deleteCachedData","_ref4","_callee4","_context4","_x4","clearCache","_ref5","_callee5","_context5","clear","clearExpiredCache","_ref6","_callee6","maxAge","allKeys","_iterator","_step","_context6","getAllKeys","_createForOfIteratorHelperLoose","done","_x5","useIndexedDBCache","_callee7","_context7","getData","_ref8","_callee8","_context8","_x6","setData","_ref9","_callee9","_context9","_x7","_x8","deleteData","_ref0","_callee0","_context0","_x9","clearAllCache","_ref1","_callee1","_context1","cardCharts","_ref$containerHeight","containerHeight","_ref$maxSpanRows","maxSpanRows","dashboardContainer","colorNeutralBackground2","gridAutoRows","overflowY","overflowX","::-webkit-scrollbar","::-webkit-scrollbar-track","colorNeutralBackground4","::-webkit-scrollbar-thumb","colorBrandStroke2Hover","::-webkit-scrollbar-thumb:hover","gridAutoFlow","cardBody","chartContainer","flex","cardDescription","cardWrapper","borderRadiusMedium","transition","&:hover","transform","boxShadow","shadow16","&:active","shadow8","_useIndexedDBCache","CACHE_EXPIRATION_DAYS","_useIndexedDBCache2","getOrderData","setOrderData","CardChartContainer","setCardChartContainer","sizes","setSizes","dragItem","dragOverItem","_yield$Promise$all","cachedSizes","cachedOrder","orderedCards","cardMap","validCachedOrder","missingCards","initialSizes","fallbackSizes","Promise","all","card","has","c","cachedSize","_cachedSize$spanCols","_c$defaultSpan","defaultSpan","_cachedSize$spanRows","_c$defaultSpan2","console","warn","_c$defaultSpan$spanCo","_c$defaultSpan3","_c$defaultSpan$spanRo","_c$defaultSpan4","initializeData","saveSizesToCache","Object","saveOrderToCache","cardOrder","reset","showZoom","minCardWidth","gridGap","containerPadding","innerWidth","columns","maxZoom","handleSort","copy","_copy$splice","splice","handleZoomSelect","span","newSizes","_extends2","defaultColsAndRowSpanBasedOnNumberColumns","_card$defaultSpan$spa","_card$defaultSpan","_card$defaultSpan$spa2","_card$defaultSpan2","renderCards","cardContainer","_sizes$cardContainer$","_defaultColsAndRowSpa","_sizes$cardContainer$2","_defaultColsAndRowSpa2","draggable","onDragStart","onDragEnter","onDragOver","e","preventDefault","onDragEnd","gridColumnEnd","gridRowEnd","Card","CardHeader","header","cardTitle","action","IsOpen","fontSizeBase100"],"mappings":"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"}