@spteck/fluentui-react-charts 1.1.4 → 1.1.6
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.
- package/dist/charts/lineChart/LineChart.d.ts +3 -1
- package/dist/fluentui-react-charts.cjs.development.js +22 -8
- package/dist/fluentui-react-charts.cjs.development.js.map +1 -1
- package/dist/fluentui-react-charts.cjs.production.min.js +1 -1
- package/dist/fluentui-react-charts.cjs.production.min.js.map +1 -1
- package/dist/fluentui-react-charts.esm.js +22 -8
- package/dist/fluentui-react-charts.esm.js.map +1 -1
- package/dist/hooks/useChartUtils.d.ts +2 -0
- package/package.json +1 -1
|
@@ -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/constants/palettes.ts","../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","\nexport const paletteDark4 = [\n '#F87171', // Red\n '#FB923C', // Orange\n '#FDE047', // Yellow\n '#86EFAC', // Green\n '#7DD3FC', // Light Blue\n '#C084FC', // Purple\n '#F9A8D4', // Pink\n '#FED7AA' // Peach\n];export const paletteLight4 = [\n '#DC2626', // Red\n '#EA580C', // Orange\n '#EAB308', // Yellow\n '#16A34A', // Green\n '#0284C7', // Light Blue\n '#9333EA', // Purple\n '#DB2777', // Pink\n '#C2410C' // Peach\n];\nexport const paletteDark3 = [\n '#60A5FA', // Blue\n '#34D399', // Green\n '#FBBF24', // Amber\n '#F472B6', // Pink\n '#A78BFA', // Purple\n '#FB923C', // Orange\n '#2DD4BF', // Teal\n '#FB7185' // Rose\n];\nexport const paletteLight3 = [\n '#2563EB', // Blue\n '#059669', // Green\n '#D97706', // Amber\n '#DB2777', // Pink\n '#7C3AED', // Purple\n '#EA580C', // Orange\n '#0D9488', // Teal\n '#E11D48' // Rose\n];\nexport const paletteLight1 = [\n '#289CEF', // Communication Blue\n '#f05075ff', // Deep Orange\n '#45B0A2', // **DARK FOREST GREEN** (New)\n '#a4262c', // Dark Red\n '#F49E31', // Rich Purple\n '#A366FF', // **DARK TEAL/PINE** (New)\n '#FCCE51', // Berry\n '#062843ff', // Navy\n '#7f7f82ff', // Orchid\n '#376102ff', // Moss Green (Darker than original) */\n '#4e79a7',\n];\nexport const paletteLight2 = [\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];\nexport const paletteDark1 = [\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];\nexport const paletteDark2 = [\n ...paletteLight2\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';\nimport { paletteDark1, paletteDark2, paletteDark3, paletteDark4, paletteLight1, paletteLight2, paletteLight3, paletteLight4 } from '../constants/palettes';\n\nconst getPalleteById = (id: number, isDark: boolean): string[] => {\n switch (id) {\n case 1:\n return isDark ? paletteDark1 : paletteLight1;\n case 2:\n return isDark ? paletteDark2 : paletteLight2;\n case 3:\n return isDark ? paletteDark3 : paletteLight3;\n case 4:\n return isDark ? paletteDark4 : paletteLight4;\n default:\n return isDark ? paletteDark1 : paletteLight1;\n }\n};\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 = (\n theme: Theme,\n paletteId?: number\n): string[] => {\n // Check if theme is dark by looking at global color tokens\n const isDark =\n theme.colorNeutralBackground1.startsWith('#1') ||\n theme.colorNeutralBackground1 === '#000000';\n\n return getPalleteById(paletteId ?? 1, isDark);\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 // optional options: allow a global extraField (string or function) that will be\n // appended to the default label. If a dataset supplies `extraField` (string or\n // array indexed by data point) that value will be used instead of the global\n // option. Example: value (x%) where x% is the extraField value.\n opts?: {\n extraField?:\n | string\n | ((item: TooltipItem<TType>) => string | number | undefined);\n }\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 dataset = item.dataset as Record<string, any>;\n const datasetLabel =\n 'label' in dataset && typeof dataset.label === 'string'\n ? dataset.label\n : 'Value';\n\n const raw = item.raw;\n\n // determine extraField value, precedence: dataset.extraField > opts.extraField\n let extra: string | number | undefined;\n if (dataset && dataset.extraField !== undefined) {\n const ef = dataset.extraField;\n // dataset extraField can be array (per-data) or single value\n if (Array.isArray(ef)) extra = ef[item.dataIndex ?? 0];\n else extra = ef;\n } else if (opts && opts.extraField) {\n if (typeof opts.extraField === 'function') {\n extra = opts.extraField(item);\n } else {\n extra = opts.extraField;\n }\n }\n\n const suffix =\n extra !== undefined && extra !== null ? ` (${String(extra)})` : '';\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}${suffix}`;\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}${suffix}`;\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}${suffix}`;\n }\n\n // Default: single number or string\n return `${datasetLabel}: ${raw}${suffix}`;\n },\n\n beforeTitle: () => '',\n afterTitle: () => '',\n beforeBody: () => '',\n afterBody: () => '',\n beforeLabel: () => '',\n afterLabel: () => '',\n // Provide sensible defaults for tooltip label colors using dataset colors when available\n labelColor: (item: TooltipItem<TType>) => {\n const ds = (item.dataset as any) || {};\n // dataset colors can be a single value or an array per data point\n let bg = ds.backgroundColor;\n if (Array.isArray(bg)) bg = bg[item.dataIndex ?? 0];\n let border = ds.borderColor;\n if (Array.isArray(border)) border = border[item.dataIndex ?? 0];\n\n const backgroundColor = bg ?? ds.pointBackgroundColor ?? tooltipBg;\n const borderColorOut = border ?? ds.pointBorderColor ?? borderColor;\n\n return { borderColor: borderColorOut, backgroundColor };\n },\n labelTextColor: () => tooltipTitleColor,\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 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 * 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 =\n typeof value === 'number' ? this.getLabelForValue(value) : String(value);\n const trimmed =\n label.length > maxLength ? label.slice(0, maxLength) + '…' : label;\n return `${prefix}${trimmed}${suffix}`;\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'line'>) => string | number | undefined;\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 renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bar'>) => string | number | undefined;\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 renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bar'>) => string | number | undefined;\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 renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel } ),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bubble'>) => string | number | undefined;\n}\n\nexport function BubbleChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n getRadius,\n showDataLabels,\n title,\n renderTooltipLabel,\n theme = webLightTheme,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bar' | 'line'>) => string | number | undefined;\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 renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel } ),\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 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 TooltipItem,\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\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 renderTooltipLabel?: (item: TooltipItem<'doughnut'>) => string | number | undefined;\n paletteId?: number;\n}\n\nexport function DoughnutChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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, paletteId);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n return { allLabels, colors };\n }, [valueMap, getFluentPalette, theme, lightenColor, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bar'>) => string | number | undefined;\n}\n\nexport function FloatingBarChart<T extends object>({\n data,\n getPrimary,\n getRange,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel } ),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'line'>) => string | number | undefined;\n}\n\nexport function LineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'pie'>) => string | number | undefined;\n}\n\nexport function PieChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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, paletteId);\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, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'polarArea'>) => string | number | undefined;\n}\n\nexport function PolarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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, paletteId);\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, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'radar'>) => string | number | undefined;\n}\n\nexport function RadarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme, \n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'scatter'>) => string | number | undefined;\n}\n\nexport function ScatterChart<T extends object>({\n data,\n getX,\n getY,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'line'>) => string | number | undefined;\n}\n\nexport function StackedLineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel } ),\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 TooltipItem,\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 renderTooltipLabel?: (\n item: TooltipItem<'line'>\n ) => string | number | undefined;\n paletteId?: number;\n}\n\nexport function SteamChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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);\n const styles = useGraphGlobalStyles();\n\n const {\n lightenColor,\n getFluentPalette,\n getInstantInteractionAnimations,\n } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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) /\n 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\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 = useMemo<ChartOptions<'line'>>(\n () => ({\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 extraField: renderTooltipLabel,\n }),\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) =>\n 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 [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n showPercent,\n ]\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;\n","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 // forward optional renderTooltipLabel if provided on the chart config\n renderTooltipLabel: (chart as any).renderTooltipLabel,\n paletteId: (chart as any).paletteId,\n});\n\nconst getChartComponent = (chart: IChart, theme: Theme) => {\n const { type, showDataLabels } = chart;\n const fuiTheme = theme ?? webLightTheme; \n switch (type) {\n case 'bar':\n return <BarChart {...chartProps(chart)} showDatalabels={showDataLabels ?? false} stacked={false} theme={fuiTheme} />;\n case 'line':\n return <LineChart showDataLabels={showDataLabels ?? false} {...chartProps(chart)} theme={fuiTheme} />;\n case 'area':\n return <AreaChart showDatalabels={showDataLabels ?? false} {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n\n case 'bar-horizontal':\n return <BarHorizontalChart showDatalabels={showDataLabels ?? false} {...chartProps(chart)} stacked={true} theme={fuiTheme} />;\n case 'bubble':\n return (\n <BubbleChart showDataLabels={showDataLabels ?? false} {...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 showDataLabels={showDataLabels ?? false}\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 showDataLabels={showDataLabels ?? false}{...chartProps(chart)} theme={fuiTheme} />;\n case 'floating-bar':\n return (\n <FloatingBarChart\n getRange={d => [d.min ?? 0, d.max ?? 0]}\n showDataLabels={showDataLabels ?? false}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'stacked-line':\n return <StackedLineChart showDataLabels={showDataLabels ?? false} {...chartProps(chart)} theme={fuiTheme} />;\n case 'doughnut':\n return (\n <DoughnutChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n showDataLabels={showDataLabels ?? false}\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={showDataLabels ?? false}\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={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={showDataLabels ?? false} \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 showDataLabels={showDataLabels ?? false}\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 , paddingTop: cardContainer.chart.title ? 0 : 16 }}\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","paletteDark4","paletteLight4","paletteDark3","paletteLight3","paletteLight1","paletteLight2","paletteDark1","paletteDark2","concat","lightenColor","hex","amount","test","startsWith","slice","r","parseInt","g","b","Math","min","floor","toHex","v","toString","padStart","getFluentPalette","theme","paletteId","isDark","getPalleteById","getInstantInteractionAnimations","animation","transitions","active","duration","createFluentTooltip","opts","fontFamily","fontFamilyBase","fontSize","fontSizeBase200","replace","tooltipBg","tooltipTitleColor","colorNeutralStroke2","enabled","displayColors","boxWidth","boxHeight","boxPadding","cornerRadius","titleColor","titleFont","family","bodyFont","callbacks","title","context","_context$0$label","_context$","extra","dataset","datasetLabel","raw","undefined","extraField","_item$dataIndex","ef","Array","isArray","dataIndex","suffix","String","beforeTitle","afterTitle","beforeBody","afterBody","beforeLabel","afterLabel","labelColor","ds","bg","_item$dataIndex2","border","_item$dataIndex3","pointBackgroundColor","_ref2","pointBorderColor","labelTextColor","footer","beforeFooter","afterFooter","labelPointStyle","pointStyle","rotation","radius","createAxisLabelFormatter","_ref3","maxLength","_ref3$maxLength","_ref3$suffix","_ref3$prefix","prefix","value","this","getLabelForValue","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","renderTooltipLabel","_ref$paletteId","_data$","setVisibleSeries","_useChartUtils","palette","reduce","acc","series","idx","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","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","order","base","y-bar","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","colors","i","_useMemo2","filteredLabels","visibleColors","indexOf","legendEntries","formatter","Doughnut","FloatingBarChart","getRange","borderRadius","LineChart","PieChart","Pie","ArcElement","RenderSliceLegend","PolarChart","backdropColor","PolarArea","RadarChart","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","_callee2","cached","_context2","_x","setCachedData","_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/constants/palettes.ts","../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","\nexport const paletteDark4 = [\n '#F87171', // Red\n '#FB923C', // Orange\n '#FDE047', // Yellow\n '#86EFAC', // Green\n '#7DD3FC', // Light Blue\n '#C084FC', // Purple\n '#F9A8D4', // Pink\n '#FED7AA' // Peach\n];export const paletteLight4 = [\n '#DC2626', // Red\n '#EA580C', // Orange\n '#EAB308', // Yellow\n '#16A34A', // Green\n '#0284C7', // Light Blue\n '#9333EA', // Purple\n '#DB2777', // Pink\n '#C2410C' // Peach\n];\nexport const paletteDark3 = [\n '#60A5FA', // Blue\n '#34D399', // Green\n '#FBBF24', // Amber\n '#F472B6', // Pink\n '#A78BFA', // Purple\n '#FB923C', // Orange\n '#2DD4BF', // Teal\n '#FB7185' // Rose\n];\nexport const paletteLight3 = [\n '#2563EB', // Blue\n '#059669', // Green\n '#D97706', // Amber\n '#DB2777', // Pink\n '#7C3AED', // Purple\n '#EA580C', // Orange\n '#0D9488', // Teal\n '#E11D48' // Rose\n];\nexport const paletteLight1 = [\n '#289CEF', // Communication Blue\n '#f05075ff', // Deep Orange\n '#45B0A2', // **DARK FOREST GREEN** (New)\n '#a4262c', // Dark Red\n '#F49E31', // Rich Purple\n '#A366FF', // **DARK TEAL/PINE** (New)\n '#FCCE51', // Berry\n '#062843ff', // Navy\n '#7f7f82ff', // Orchid\n '#376102ff', // Moss Green (Darker than original) */\n '#4e79a7',\n];\nexport const paletteLight2 = [\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];\nexport const paletteDark1 = [\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];\nexport const paletteDark2 = [\n ...paletteLight2\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';\nimport { paletteDark1, paletteDark2, paletteDark3, paletteDark4, paletteLight1, paletteLight2, paletteLight3, paletteLight4 } from '../constants/palettes';\n\nconst getPalleteById = (id: number, isDark: boolean): string[] => {\n switch (id) {\n case 1:\n return isDark ? paletteDark1 : paletteLight1;\n case 2:\n return isDark ? paletteDark2 : paletteLight2;\n case 3:\n return isDark ? paletteDark3 : paletteLight3;\n case 4:\n return isDark ? paletteDark4 : paletteLight4;\n default:\n return isDark ? paletteDark1 : paletteLight1;\n }\n};\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 = (\n theme: Theme,\n paletteId?: number\n): string[] => {\n // Check if theme is dark by looking at global color tokens\n const isDark =\n theme.colorNeutralBackground1.startsWith('#1') ||\n theme.colorNeutralBackground1 === '#000000';\n\n return getPalleteById(paletteId ?? 1, isDark);\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 // optional options: allow a global extraField (string or function) that will be\n // appended to the default label. If a dataset supplies `extraField` (string or\n // array indexed by data point) that value will be used instead of the global\n // option. Example: value (x%) where x% is the extraField value.\n opts?: {\n extraField?:\n | string\n | ((item: TooltipItem<TType>) => string | number | undefined);\n // numberFormat can be an Intl.NumberFormatOptions object to be used with\n // Intl.NumberFormat, or a function that receives a number and returns a string.\n numberFormat?: Intl.NumberFormatOptions | ((v: number) => string);\n // Optional locale or locales for Intl.NumberFormat (e.g. 'en-US')\n locale?: string | string[];\n }\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 \n\n const callbacks: TooltipCallbacks<TType> = {\n \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 dataset = item.dataset as Record<string, any>;\n const datasetLabel =\n 'label' in dataset && typeof dataset.label === 'string'\n ? dataset.label\n : 'Value';\n\n const raw = item.raw;\n\n // Prepare number formatter based on opts\n const numberFormatter: ((v: number) => string) =\n typeof opts?.numberFormat === 'function'\n ? opts.numberFormat\n : new Intl.NumberFormat(opts?.locale as any, typeof opts?.numberFormat === 'object' ? opts?.numberFormat : undefined).format;\n\n // Helper to format numeric values for tooltips using the configured formatter\n const formatVal = (v: any) =>\n typeof v === 'number' ? numberFormatter(v) : String(v);\n\n // determine extraField value, precedence: dataset.extraField > opts.extraField\n let extra: string | number | undefined;\n if (dataset && dataset.extraField !== undefined) {\n const ef = dataset.extraField;\n // dataset extraField can be array (per-data) or single value\n if (Array.isArray(ef)) extra = ef[item.dataIndex ?? 0];\n else extra = ef;\n } else if (opts && opts.extraField) {\n if (typeof opts.extraField === 'function') {\n extra = opts.extraField(item);\n } else {\n extra = opts.extraField;\n }\n }\n\n const suffix =\n extra !== undefined && extra !== null ? `${String(extra)}` : '';\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: ${formatVal(x)}, y: ${formatVal(\n y\n )}, r: ${formatVal(r)}${suffix}`;\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: ${formatVal(x)}, y: ${formatVal(\n y\n )}${suffix}`;\n }\n\n // Floating bar [min, max]\n if (Array.isArray(raw) && raw.length === 2) {\n const [min, max] = raw;\n return `${datasetLabel}: ${formatVal(min)} – ${formatVal(max)}${suffix}`;\n }\n\n // Default: single number or string\n return `${datasetLabel}: ${formatVal(raw)}${suffix}`;\n },\n\n beforeTitle: () => '',\n afterTitle: () => '',\n beforeBody: () => '',\n afterBody: () => '',\n beforeLabel: () => '',\n afterLabel: () => '',\n // Provide sensible defaults for tooltip label colors using dataset colors when available\n labelColor: (item: TooltipItem<TType>) => {\n const ds = (item.dataset as any) || {};\n // dataset colors can be a single value or an array per data point\n let bg = ds.backgroundColor;\n if (Array.isArray(bg)) bg = bg[item.dataIndex ?? 0];\n let border = ds.borderColor;\n if (Array.isArray(border)) border = border[item.dataIndex ?? 0];\n\n const backgroundColor = bg ?? ds.pointBackgroundColor ?? tooltipBg;\n const borderColorOut = border ?? ds.pointBorderColor ?? borderColor;\n\n return { borderColor: borderColorOut, backgroundColor };\n },\n labelTextColor: () => tooltipTitleColor,\n footer: () => '',\n beforeFooter: () => '',\n afterFooter: () => '',\n labelPointStyle: () => ({\n pointStyle: 'circle',\n rotation: 0,\n radius: 5,\n }),\n };\n\n return {\n external: undefined,\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 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 * 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 =\n typeof value === 'number' ? this.getLabelForValue(value) : String(value);\n const trimmed =\n label.length > maxLength ? label.slice(0, maxLength) + '…' : label;\n return `${prefix}${trimmed}${suffix}`;\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'line'>) => string | number | undefined;\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 renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bar'>) => string | number | undefined;\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 renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bar'>) => string | number | undefined;\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 renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel } ),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bubble'>) => string | number | undefined;\n}\n\nexport function BubbleChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n getRadius,\n showDataLabels,\n title,\n renderTooltipLabel,\n theme = webLightTheme,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bar' | 'line'>) => string | number | undefined;\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 renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel } ),\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 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 TooltipItem,\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\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 renderTooltipLabel?: (item: TooltipItem<'doughnut'>) => string | number | undefined;\n paletteId?: number;\n}\n\nexport function DoughnutChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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, paletteId);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n return { allLabels, colors };\n }, [valueMap, getFluentPalette, theme, lightenColor, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'bar'>) => string | number | undefined;\n}\n\nexport function FloatingBarChart<T extends object>({\n data,\n getPrimary,\n getRange,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel } ),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'line'>) => string | number | undefined;\n // Optional number formatting options to control tooltip number display\n numberFormat?: Intl.NumberFormatOptions | ((v: number) => string);\n locale?: string | string[];\n}\n\nexport function LineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\n numberFormat,\n locale,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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 extraField: renderTooltipLabel,\n numberFormat,\n locale,\n }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'pie'>) => string | number | undefined;\n}\n\nexport function PieChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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, paletteId);\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, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'polarArea'>) => string | number | undefined;\n}\n\nexport function PolarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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, paletteId);\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, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'radar'>) => string | number | undefined;\n}\n\nexport function RadarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme, \n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'scatter'>) => string | number | undefined;\n}\n\nexport function ScatterChart<T extends object>({\n data,\n getX,\n getY,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel }),\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 TooltipItem,\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 paletteId?: number;\n renderTooltipLabel?: (item: TooltipItem<'line'>) => string | number | undefined;\n}\n\nexport function StackedLineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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 const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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, { extraField: renderTooltipLabel } ),\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 TooltipItem,\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 renderTooltipLabel?: (\n item: TooltipItem<'line'>\n ) => string | number | undefined;\n paletteId?: number;\n}\n\nexport function SteamChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n renderTooltipLabel,\n paletteId = 1,\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);\n const styles = useGraphGlobalStyles();\n\n const {\n lightenColor,\n getFluentPalette,\n getInstantInteractionAnimations,\n } = useChartUtils(theme);\n\n const seriesColors = useMemo(() => {\n const palette = getFluentPalette(theme, paletteId);\n return data.reduce((acc, series, idx) => {\n const base = palette[idx % palette.length];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme, paletteId]);\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) /\n 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\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 = useMemo<ChartOptions<'line'>>(\n () => ({\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 extraField: renderTooltipLabel,\n }),\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) =>\n 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 [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n showPercent,\n ]\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;\n","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 // forward optional renderTooltipLabel if provided on the chart config\n renderTooltipLabel: (chart as any).renderTooltipLabel,\n paletteId: (chart as any).paletteId,\n // forward optional number formatting options\n numberFormat: (chart as any).numberFormat,\n locale: (chart as any).locale,\n});\n\nconst getChartComponent = (chart: IChart, theme: Theme) => {\n const { type, showDataLabels } = chart;\n const fuiTheme = theme ?? webLightTheme; \n switch (type) {\n case 'bar':\n return <BarChart {...chartProps(chart)} showDatalabels={showDataLabels ?? false} stacked={false} theme={fuiTheme} />;\n case 'line':\n return <LineChart showDataLabels={showDataLabels ?? false} {...chartProps(chart)} theme={fuiTheme} />;\n case 'area':\n return <AreaChart showDatalabels={showDataLabels ?? false} {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n\n case 'bar-horizontal':\n return <BarHorizontalChart showDatalabels={showDataLabels ?? false} {...chartProps(chart)} stacked={true} theme={fuiTheme} />;\n case 'bubble':\n return (\n <BubbleChart showDataLabels={showDataLabels ?? false} {...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 showDataLabels={showDataLabels ?? false}\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 showDataLabels={showDataLabels ?? false}{...chartProps(chart)} theme={fuiTheme} />;\n case 'floating-bar':\n return (\n <FloatingBarChart\n getRange={d => [d.min ?? 0, d.max ?? 0]}\n showDataLabels={showDataLabels ?? false}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'stacked-line':\n return <StackedLineChart showDataLabels={showDataLabels ?? false} {...chartProps(chart)} theme={fuiTheme} />;\n case 'doughnut':\n return (\n <DoughnutChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n showDataLabels={showDataLabels ?? false}\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={showDataLabels ?? false}\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={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={showDataLabels ?? false} \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 showDataLabels={showDataLabels ?? false}\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 , paddingTop: cardContainer.chart.title ? 0 : 16 }}\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","paletteDark4","paletteLight4","paletteDark3","paletteLight3","paletteLight1","paletteLight2","paletteDark1","paletteDark2","concat","lightenColor","hex","amount","test","startsWith","slice","r","parseInt","g","b","Math","min","floor","toHex","v","toString","padStart","getFluentPalette","theme","paletteId","isDark","getPalleteById","getInstantInteractionAnimations","animation","transitions","active","duration","createFluentTooltip","opts","fontFamily","fontFamilyBase","fontSize","fontSizeBase200","replace","tooltipBg","tooltipTitleColor","colorNeutralStroke2","external","undefined","enabled","displayColors","boxWidth","boxHeight","boxPadding","cornerRadius","titleColor","titleFont","family","bodyFont","callbacks","title","context","_context$0$label","_context$","extra","dataset","datasetLabel","raw","numberFormatter","numberFormat","Intl","NumberFormat","locale","format","formatVal","String","extraField","_item$dataIndex","ef","Array","isArray","dataIndex","suffix","max","beforeTitle","afterTitle","beforeBody","afterBody","beforeLabel","afterLabel","labelColor","ds","bg","_item$dataIndex2","border","_item$dataIndex3","pointBackgroundColor","_ref2","pointBorderColor","labelTextColor","footer","beforeFooter","afterFooter","labelPointStyle","pointStyle","rotation","radius","createAxisLabelFormatter","_ref3","maxLength","_ref3$maxLength","_ref3$suffix","_ref3$prefix","prefix","value","this","getLabelForValue","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","renderTooltipLabel","_ref$paletteId","_data$","setVisibleSeries","_useChartUtils","palette","reduce","acc","series","idx","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","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","order","base","y-bar","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","colors","i","_useMemo2","filteredLabels","visibleColors","indexOf","legendEntries","formatter","Doughnut","FloatingBarChart","getRange","borderRadius","LineChart","PieChart","Pie","ArcElement","RenderSliceLegend","PolarChart","backdropColor","PolarArea","RadarChart","angleLines","pointLabels","Radar","ScatterChart","getX","getY","useCallback","Scatter","StackedLineChart","SteamChart","_useState2","showPercent","setShowPercent","totalPerPoint","sum","index","rawValue","round","Number","EPSILON","interaction","mode","intersect","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","_callee2","cached","_context2","_x","setCachedData","_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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"}
|