@spteck/fluentui-react-charts 0.1.8 → 1.0.0
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/components/RenderLabel/RenderLabel.d.ts +8 -0
- package/dist/components/RenderLabel/index.d.ts +2 -0
- package/dist/components/RenderLabel/useRenderLabelStylesStyles.d.ts +1 -0
- package/dist/components/dashboard/DashBoard.d.ts +4 -0
- package/dist/components/dashboard/ExampleDashboardUsage.d.ts +6 -0
- package/dist/components/dashboard/ICardChartContainer.d.ts +16 -0
- package/dist/components/dashboard/IDashboardProps.d.ts +9 -0
- package/dist/components/dashboard/NoDashboards.d.ts +5 -0
- package/dist/components/dashboard/index.d.ts +3 -0
- package/dist/components/dashboard/selectZoom/SelectZoom.d.ts +15 -0
- package/dist/components/dashboard/useDashboardStyles.d.ts +7 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/components/svgImages/BusinessReportIcon.d.ts +9 -0
- package/dist/fluentui-react-charts.cjs.development.js +2 -0
- 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 +2 -0
- package/dist/fluentui-react-charts.esm.js.map +1 -1
- package/dist/models/ChartDatum.d.ts +4 -0
- package/dist/models/index.d.ts +1 -0
- package/package.json +2 -3
- package/src/components/RenderLabel/RenderLabel.tsx +39 -0
- package/src/components/RenderLabel/index.ts +2 -0
- package/src/components/RenderLabel/useRenderLabelStylesStyles.ts +25 -0
- package/src/components/dashboard/DashBoard.tsx +220 -0
- package/src/components/dashboard/ExampleDashboardUsage.tsx +114 -0
- package/src/components/dashboard/ICardChartContainer.tsx +13 -0
- package/src/components/dashboard/IDashboardProps.tsx +13 -0
- package/src/components/dashboard/NoDashboards.tsx +26 -0
- package/src/components/dashboard/index.ts +4 -0
- package/src/components/dashboard/selectZoom/SelectZoom.tsx +189 -0
- package/src/components/dashboard/useDashboardStyles.ts +76 -0
- package/src/components/index.ts +3 -1
- package/src/components/svgImages/BusinessReportIcon.tsx +218 -0
- package/src/models/ChartDatum.ts +4 -0
- package/src/models/index.ts +1 -0
- package/dist/components/DashBoard.d.ts +0 -3
- package/src/components/DashBoard.tsx +0 -409
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluentui-react-charts.cjs.production.min.js","sources":["../src/components/legendeButton/LegendButton.tsx","../src/components/stack/Stack.tsx","../src/components/legendContainer/LegendContainer.tsx","../src/hooks/useResponsiveLegend.ts","../src/components/RenderLegend/RenderLegend.tsx","../src/graphGlobalStyles/useGraphGlobalStyles.ts","../src/charts/areaChart/AreaChart.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/useGraphUtils.tsx","../src/charts/BarChart/BarChart.tsx"],"sourcesContent":["// 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 { 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 {\n Menu,\n MenuButton,\n MenuItem,\n MenuList,\n MenuPopover,\n MenuTrigger,\n} from '@fluentui/react-components';\n\nimport { LegendButton } from '../legendeButton/LegendButton';\nimport React from 'react';\nimport Stack from '../stack/Stack';\nimport { css } from '@emotion/css';\n\ninterface LegendContainerProps<T> {\n items: T[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n renderLabel: (item: T) => string;\n getColor: (item: T) => string;\n}\n\nconst styles = {\n wrapper: css({\n display: 'flex',\n flexWrap: 'nowrap',\n overflow: 'hidden',\n justifyContent: 'center',\n gap: 10,\n padding: 2,\n width: '100%',\n boxSizing: 'border-box',\n }),\n};\n\nexport function LegendContainer<T extends { label: string }>(\n props: LegendContainerProps<T> & {\n containerRef: React.RefObject<HTMLDivElement>;\n \n visibleItems: T[];\n overflowItems: T[];\n }\n) {\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n visibleLabels,\n toggleLabel,\n renderLabel,\n getColor,\n } = props;\n\n return (\n <Stack\n justifyContent=\"center\"\n alignItems=\"center\"\n marginLeft=\"10px\"\n marginRight=\"10px\"\n marginTop=\"25px\"\n marginBottom=\"20px\"\n >\n <div ref={containerRef} className={styles.wrapper}>\n {visibleItems.map(item => {\n const label = item.label;\n const isVisible =\n visibleLabels.length === 0 || visibleLabels.includes(label);\n return (\n \n <LegendButton\n key={label}\n label={renderLabel(item)}\n color={getColor(item)}\n isVisible={isVisible}\n onClick={() => toggleLabel(label)}\n \n />\n \n );\n })}\n\n {overflowItems.length > 0 && (\n <Menu>\n <MenuTrigger disableButtonEnhancement>\n <MenuButton size=\"small\" appearance=\"transparent\">\n +{overflowItems.length}\n </MenuButton>\n </MenuTrigger>\n <MenuPopover style={{ minWidth: 'fit-content', maxWidth: '200px' }}>\n <MenuList>\n {overflowItems.map(item => {\n const label = item.label;\n const isVisible =\n visibleLabels.length === 0 || visibleLabels.includes(label);\n return (\n <MenuItem key={label} style={{ padding: 0 }}>\n \n <LegendButton\n label={renderLabel(item)}\n color={getColor(item)}\n isVisible={isVisible}\n onClick={() => toggleLabel(label)}\n style={{ width: '100px', textAlign: 'left' }}\n />\n \n \n </MenuItem>\n );\n })}\n </MenuList>\n </MenuPopover>\n </Menu>\n )}\n </div>\n </Stack>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { useGraphUtils } from './useGraphUtils';\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 } = useGraphUtils();\n useEffect(() => {\n const measure = () => {\n const containerWidth = containerRef.current?.offsetWidth ?? 0;\n const itemTotalWidth = BUTTON_WIDTH + GAP;\n const count = Math.floor(containerWidth / itemTotalWidth);\n setMaxVisible(count);\n };\n\n const debouncedMeasure = debounce(measure, 100); // debounce resize\n\n const observer = new ResizeObserver(debouncedMeasure);\n if (containerRef.current) observer.observe(containerRef.current);\n measure(); // initial\n\n return () => observer.disconnect();\n }, [items]);\n\n return {\n containerRef,\n visibleItems: items.slice(0, maxVisible),\n overflowItems: items.slice(maxVisible),\n };\n}\n","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface LegendControlProps {\n data: { label: string }[];\n visibleSeries: string[];\n seriesColors: Record<string, string>;\n toggleSeries: (label: string) => void;\n}\n\nconst RenderLegend: React.FC<LegendControlProps> = ({\n data,\n visibleSeries,\n seriesColors,\n toggleSeries,\n}) => {\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n } = useResponsiveLegend(data);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n \n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={data}\n visibleLabels={visibleSeries}\n toggleLabel={toggleSeries}\n renderLabel={d => d.label}\n getColor={d => seriesColors[d.label]}\n />\n );\n};\n\nexport default RenderLegend;\n","import { css } from \"@emotion/css\";\n\nexport const useGraphGlobalStyles = () => {\n return {\n chartWithLegend: css({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n chartArea: {\n flexGrow: 1,\n minHeight: 0,\n },\n }),\n chartArea: css`\n flex-grow: 1;\n min-height: 0;\n `,\n legendArea: css`\n margin-top: 0px;\n padding-top: 0px;\n \n margin-Left: 10px;\n margin-Right: 10px;\n \n `,\n };\n \n}","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Tooltip,\n Filler,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface AreaChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme?: Theme;\n}\n\nexport default function AreaChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDatalabels = false,\n theme = webLightTheme,\n stacked = false,\n}: AreaChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : null;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n fill: true,\n tension: 0.4,\n pointRadius: 2,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\n const options: ChartOptions<'line'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title ,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n }), [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Theme } from '@fluentui/react-theme';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n Title,\n ChartDataLabels,\n \n \n);\n\n\n\nexport interface BarHorizontalProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme: Theme;\n}\n\nexport default function BarHorizontalChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n stacked = false,\n showDatalabels = false,\n title,\n theme\n}: BarHorizontalProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\nconst styles = useGraphGlobalStyles();\n \n const { lightenColor, getFluentPalette , createFluentTooltip} = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const categorySet = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(datum => {\n categorySet.add(getPrimary(datum));\n });\n });\n return Array.from(categorySet);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n backgroundColor: seriesColors[series.label],\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n })),\n };\n }, [data, visibleSeries, allCategories, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'bar'> = useMemo(() => ({\n indexAxis: 'y',\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: {\n display: false,\n },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n stacked,\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n },\n }), [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea} >\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n \n );\n}\n","import {\n BubbleDataPoint,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Bubble } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n Tooltip,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface BubbleChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number | Date;\n getSecondary: (datum: T) => number;\n getRadius: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function BubbleChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n getRadius,\n showDataLabels,\n title,\n theme = webLightTheme,\n}: BubbleChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n\n const styles = useGraphGlobalStyles();\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const chartData = useMemo(() => {\n return {\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: series.data.map(d => ({\n x: getPrimary(d),\n y: getSecondary(d),\n r: getRadius(d),\n })) as BubbleDataPoint[],\n backgroundColor: seriesColors[series.label],\n borderColor: theme.colorNeutralStroke1,\n borderWidth: 1,\n hoverBorderWidth: 2,\n })),\n };\n }, [data, visibleSeries, getPrimary, getSecondary, getRadius, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'bubble'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bubble'>(theme),\n },\n scales: {\n x: {\n type:\n typeof getPrimary(data[0]?.data[0]) === 'number'\n ? 'linear'\n : 'category',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n }), [\n title,\n showDataLabels,\n theme,\n getPrimary,\n getSecondary,\n data,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n createFluentTooltip,\n ]);\n\n return (\n <>\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bubble data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n </>\n );\n}\n","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Chart } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n LineElement,\n PointElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface ComboChartProps<T> {\n data: {\n label: string;\n type: 'bar' | 'line';\n data: T[];\n yAxisID?: string;\n }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function ComboChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: ComboChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => series.data.forEach(d => set.add(getPrimary(d))));\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n const sortedSeries = data\n .filter(series => visibleSeries.includes(series.label))\n .sort((a, b) => {\n // Ensure bars come before lines\n if (a.type === 'bar' && b.type === 'line') return -1;\n if (a.type === 'line' && b.type === 'bar') return 1;\n return 0;\n });\n\n return {\n labels: allCategories,\n datasets: sortedSeries.map(series => ({\n type: series.type,\n label: series.label,\n yAxisID: series.yAxisID ?? 'y',\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n backgroundColor: seriesColors[series.label],\n borderColor: seriesColors[series.label],\n fill: series.type === 'bar',\n tension: series.type === 'line' ? 0.4 : 0,\n pointRadius: series.type === 'line' ? 3 : 0,\n borderWidth: series.type === 'line' ? 2 : 1,\n order: series.type === 'bar' ? 1 : 0, // Ensure bars are drawn first\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n \n\n const options: ChartOptions<'bar' | 'line'> = useMemo(() => ( {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bar' | 'line'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n position: 'left',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n stacked: false,\n },\n },\n }), [\n title,\n showDataLabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n createFluentTooltip,\n ]);\n\n return (\n <>\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Chart type=\"bar\" data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n </>\n );\n}\n","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface LegendEntry {\n label: string;\n value: number;\n color: string;\n}\n\nexport interface ValueLegendProps {\n entries: LegendEntry[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n}\n\nconst RenderValueLegend: React.FC<ValueLegendProps> = ({\n entries,\n visibleLabels,\n toggleLabel,\n}) => {\n const {\n containerRef,\n\n visibleItems,\n overflowItems,\n } = useResponsiveLegend(entries);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={entries}\n visibleLabels={visibleLabels}\n toggleLabel={toggleLabel}\n renderLabel={entry => `${entry.label}: ${entry.value}`}\n getColor={entry => entry.color}\n />\n );\n};\n\nexport default RenderValueLegend;\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Doughnut } from 'react-chartjs-2';\nimport RenderValueLegend from '../../components/renderValueLegend/RenderValueLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(ArcElement, Tooltip, Legend, Title);\n\nexport interface DoughnutChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function DoughnutChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n}: DoughnutChartProps<T>) {\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n\n const toggleLabel = (label: string): void => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\n const { allLabels, colors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n return { allLabels, colors };\n }, [valueMap, getFluentPalette, theme, lightenColor]);\n\n const { filteredLabels, values, visibleColors } = useMemo(() => {\n const filteredLabels = allLabels.filter(label => !hiddenLabels.includes(label));\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n return { filteredLabels, values, visibleColors };\n }, [allLabels, hiddenLabels, valueMap, colors]);\n\n const chartData = useMemo(() => ({\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n }), [filteredLabels, values, visibleColors]);\n\n const legendEntries = useMemo(() => {\n return allLabels.map((label, idx) => ({\n label,\n value: valueMap.get(label) || 0,\n color: colors[idx],\n }));\n }, [allLabels, valueMap, colors]);\n\n const options: ChartOptions<'doughnut'> = useMemo(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { display: false },\n tooltip: createFluentTooltip<'doughnut'>(theme),\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n formatter: (value: number) => value,\n },\n },\n }),\n [title, theme, showDataLabels, createFluentTooltip]\n );\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Doughnut data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderValueLegend\n entries={legendEntries}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface FloatingBarChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getRange: (datum: T) => [number, number]; // e.g., [min, max]\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function FloatingBarChart<T extends object>({\n data,\n getPrimary,\n getRange,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: FloatingBarChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getRange(match) : [0, 0];\n }),\n backgroundColor: seriesColors[series.label],\n borderRadius: 2,\n })),\n };\n }, [data, visibleSeries, allCategories, getPrimary, getRange, seriesColors]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options: ChartOptions<'bar'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n title,\n theme,\n showDataLabels,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n createFluentTooltip\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n LineElement,\n PointElement,\n CategoryScale,\n LinearScale,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface LineChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function LineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: LineChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette , createFluentTooltip} = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : null;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n tension: 0.4,\n fill: false,\n pointRadius: 4,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'line'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n },\n }), [\n title,\n theme,\n showDataLabels,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n createFluentTooltip\n ]);\n\n return (\n\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <div className={styles.legendArea} >\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n \n );\n}\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Pie } from 'react-chartjs-2';\nimport RenderValueLegend from '../../components/renderValueLegend/RenderValueLegend';\nimport { createFluentTooltip } from '../../hooks/useGraphUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(ArcElement, Tooltip, Legend, Title);\n\nexport interface PieChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function PieChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: PieChartProps<T>) {\n const { getFluentPalette, lightenColor } = useGraphUtils(theme);\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n const styles = useGraphGlobalStyles();\n const toggleLabel = (label: string): void => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\nconst { allLabels, colors, filteredLabels, values, visibleColors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n\n const filteredLabels = allLabels.filter(\n label => !hiddenLabels.includes(label)\n );\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n\n return { allLabels, colors, filteredLabels, values, visibleColors };\n}, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]);\n\nconst { chartData, legendEntries } = useMemo(() => {\n const chartData = {\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n };\n\n const legendEntries = allLabels.map((label, i) => ({\n label,\n value: valueMap.get(label) || 0,\n color: colors[i],\n }));\n\n return { chartData, legendEntries };\n}, [filteredLabels, values, visibleColors, allLabels, valueMap, colors]);\n\nconst options = useMemo<ChartOptions<'pie'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n tooltip: createFluentTooltip<'pie'>(theme),\n legend: { display: false },\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n },\n}), [theme, title, showDataLabels]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Pie data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderValueLegend\n entries={legendEntries}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface SliceLegendProps {\n labels: string[];\n colors: string[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n}\n\nconst RenderSliceLegend: React.FC<SliceLegendProps> = ({\n labels,\n colors,\n visibleLabels,\n toggleLabel,\n}) => {\n interface SliceLegendItem {\n label: string;\n color: string;\n }\n\n const items: SliceLegendItem[] = labels.map((label, i) => ({ label, color: colors[i] }));\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n } = useResponsiveLegend(items);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n \n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={items}\n visibleLabels={visibleLabels}\n toggleLabel={toggleLabel}\n renderLabel={item => item.label}\n getColor={item => item.color}\n />\n );\n};\n\nexport default RenderSliceLegend;\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n RadialLinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useGraphUtils } from '../../hooks/useGraphUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { PolarArea } from 'react-chartjs-2';\nimport RenderSliceLegend from '../../components/renderSliceLegend/RenderSliceLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n RadialLinearScale,\n ArcElement,\n Tooltip,\n Legend,\n Title,\n ChartDataLabels\n);\n\nexport interface PolarChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function PolarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n}: PolarChartProps<T>) {\n const { getFluentPalette, lightenColor } = useGraphUtils(theme);\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n const styles = useGraphGlobalStyles();\n const toggleLabel = (label: string) => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\nconst { allLabels, colors, filteredLabels, values, visibleColors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n\n const filteredLabels = allLabels.filter(\n label => !hiddenLabels.includes(label)\n );\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n\n return { allLabels, colors, filteredLabels, values, visibleColors };\n}, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]);\n\nconst chartData = useMemo(() => ({\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n}), [filteredLabels, values, visibleColors]);\n\nconst options = useMemo<ChartOptions<'polarArea'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n formatter: (value: number) => value,\n },\n tooltip: createFluentTooltip<'polarArea'>(theme),\n legend: { display: false },\n },\n scales: {\n r: {\n ticks: {\n color: theme.colorNeutralForeground1,\n backdropColor: 'transparent',\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n grid: {\n color: theme.colorNeutralStroke2,\n },\n },\n },\n}), [theme, title, showDataLabels, createFluentTooltip]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <PolarArea data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderSliceLegend\n labels={allLabels}\n colors={colors}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n","import {\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n PointElement,\n RadialLinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useGraphUtils } from '../../hooks/useGraphUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Radar } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n RadialLinearScale,\n PointElement,\n LineElement,\n Filler,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface RadarChartProps<T> {\n data: { label: string; data: T[] }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string; \n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function RadarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme, \n}: RadarChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette } = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const allLabels = useMemo(() => {\n const set = new Set<string>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getLabel(d)));\n });\n return Array.from(set);\n }, [data, getLabel]);\n\n const chartData = useMemo(() => {\n return {\n labels: allLabels,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allLabels.map(label => {\n const match = series.data.find(d => getLabel(d) === label);\n return match ? getValue(match) : 0;\n }),\n backgroundColor: seriesColors[series.label] + '33',\n borderColor: seriesColors[series.label],\n borderWidth: 2,\n pointBackgroundColor: seriesColors[series.label],\n })),\n };\n }, [data, visibleSeries, allLabels, getLabel, getValue, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options = useMemo<ChartOptions<'radar'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n tooltip: createFluentTooltip<'radar'>(theme),\n legend: { display: false },\n },\n scales: {\n r: {\n angleLines: { color: gridColor },\n grid: { color: gridColor },\n pointLabels: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n },\n },\n }), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n gridColor,\n labelColor,\n fontFamily,\n fontSize,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Radar data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n","import {\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n PointElement,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Scatter } from 'react-chartjs-2';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(LinearScale, PointElement, Tooltip, Legend);\n\nexport interface ScatterChartProps<T> {\n data: { label: string; data: T[] }[];\n getX: (datum: T) => number;\n getY: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function ScatterChart<T extends object>({\n data,\n getX,\n getY,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: ScatterChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n const styles = useGraphGlobalStyles();\n const { getFluentPalette, lightenColor, createFluentTooltip } = useGraphUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = React.useCallback((label: string) => {\n setVisibleSeries(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n }, []);\n\n const chartData = useMemo(() => {\n return {\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: series.data.map(d => ({ x: getX(d), y: getY(d) })),\n backgroundColor: seriesColors[series.label],\n borderColor: seriesColors[series.label],\n pointRadius: 4,\n })),\n };\n }, [data, visibleSeries, getX, getY, seriesColors]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'scatter'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'scatter'>(theme),\n },\n scales: {\n x: {\n type: 'linear',\n position: 'bottom',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n type: 'linear',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Scatter data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n LineElement,\n PointElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface StackedLineChartProps<T> {\n data: { label: string; data: T[] }[]; \n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function StackedLineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: StackedLineChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : 0;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n fill: true,\n tension: 0.4,\n pointRadius: 3,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, ToggleButton, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useGraphUtils } from '../../hooks/useGraphUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Stack } from '../../components/stack/Stack';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n LineElement,\n PointElement,\n Filler, \n CategoryScale,\n LinearScale,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface SteamChartProps<T> {\n data: { label: string; data: T[] }[]; \n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function SteamChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: SteamChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n const [showPercent, setShowPercent] = useState(false);\nconst styles = useGraphGlobalStyles();\n \n const { lightenColor, getFluentPalette } = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme]);\n\n const toggleSeries = React.useCallback(\n (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible\n ? prev.filter(l => l !== label)\n : [...prev, label];\n return next.length === 0 ? [data[0].label] : next;\n });\n },\n [data]\n );\n\n const allLabels = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const totalPerPoint = useMemo(() => {\n return allLabels.map(cat =>\n data.reduce((sum, series) => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return sum + (match ? getSecondary(match) : 0);\n }, 0)\n );\n }, [allLabels, data, getPrimary, getSecondary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allLabels,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map((series, ) => ({\n label: series.label,\n fill: true,\n backgroundColor: seriesColors[series.label],\n borderColor: 'transparent',\n borderWidth: 0,\n data: allLabels.map((cat, index) => {\n const match = series.data.find(d => getPrimary(d) === cat);\n const rawValue = match ? getSecondary(match) : 0;\n const total = totalPerPoint[index] || 1;\n return showPercent\n ? Math.round(((rawValue / total) * 100 + Number.EPSILON) * 100) / 100\n : Math.round((rawValue + Number.EPSILON) * 100) / 100;\n }),\n tension: 0.5,\n })),\n };\n }, [\n data,\n visibleSeries,\n allLabels,\n getPrimary,\n getSecondary,\n seriesColors,\n totalPerPoint,\n showPercent,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n animation: {\n duration: 800,\n easing: 'easeOutQuart',\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: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n interaction: {\n mode: 'index',\n intersect: false,\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n ticks: {\n callback: (value: string | number) => (showPercent ? `${value}%` : value),\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n min: 0,\n max: showPercent ? 100 : undefined,\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n showPercent,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <Stack justifyContent=\"center\" alignItems=\"center\" margin=\"7px\">\n <ToggleButton\n onClick={() => setShowPercent(p => !p)}\n shape=\"circular\"\n appearance=\"secondary\"\n size=\"small\"\n style={{ width: '150px' }}\n >\n {showPercent ? 'Show Raw Values' : 'Show %'}\n </ToggleButton>\n </Stack>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n","import {\n ChartType,\n TooltipCallbacks,\n TooltipItem,\n TooltipModel,\n TooltipOptions,\n} from 'chart.js';\nimport { 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/IChart';\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';\nimport { useMemo } from 'react';\n\n/**\n * Lightens a given hex color by a percentage amount (0 to 1).\n */\nexport const lightenColor = (hex: string, amount: number): string => {\n if (!/^#?[0-9A-Fa-f]{6}$/.test(hex)) return hex;\n if (hex.startsWith('#')) hex = hex.slice(1);\n\n let r = parseInt(hex.slice(0, 2), 16);\n let g = parseInt(hex.slice(2, 4), 16);\n let b = parseInt(hex.slice(4, 6), 16);\n\n r = Math.min(255, Math.floor(r + (255 - r) * amount));\n g = Math.min(255, Math.floor(g + (255 - g) * amount));\n b = Math.min(255, Math.floor(b + (255 - b) * amount));\n\n const toHex = (v: number) => v.toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\nexport const getFluentPalette = (_theme: Theme): string[] => [\n '#4e79a7',\n '#f28e2c',\n '#e15759',\n '#76b7b2',\n '#59a14f',\n '#edc949',\n '#af7aa1',\n '#ff9da7',\n '#9c755f',\n '#bab0ab',\n '#8cd17d',\n '#b6992d',\n '#d37295',\n '#fabfd2',\n '#79706e',\n];\n\nconst chartProps = (chart: IChart) => ({\n data: chart.data,\n title: chart.title,\n getPrimary: (d: any) => d.name,\n getSecondary: (d: any) => d.value,\n});\n\nconst getChartComponent = (chart: IChart, theme: Theme) => {\n const { type } = chart;\n const fuiTheme = theme ?? webLightTheme; \n switch (type) {\n case 'bar':\n return <BarChart {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n case 'line':\n return <LineChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'area':\n return <AreaChart {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n\n case 'bar-horizontal':\n return <BarHorizontalChart {...chartProps(chart)} stacked={true} theme={fuiTheme} />;\n case 'bubble':\n return (\n <BubbleChart {...chartProps(chart)} getRadius={d => d.radius ?? 1} theme={fuiTheme} />\n );\n case 'multiple-axes':\n return (\n <ComboChart\n {...chartProps(chart)}\n theme={fuiTheme}\n \n data={chart.data.map((series: any) => ({\n label: series.label,\n type: series.type ?? 'bar',\n data: series.data,\n yAxisID: series.secondaryAxisId,\n \n }))}\n />\n );\n case 'steam':\n return <SteamChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'floating-bar':\n return (\n <FloatingBarChart\n getRange={d => [d.min ?? 0, d.max ?? 0]}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'stacked-line':\n return <StackedLineChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'doughnut':\n return (\n <DoughnutChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'pie':\n return (\n <PieChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n showDataLabels={true}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'scatter':\n return (\n <ScatterChart\n getX={d => {\n if (typeof d.x === 'number') return d.x;\n if (typeof d.x === 'string') return Number(d.x) || 0;\n if (d.x instanceof Date) return d.x.getTime();\n return 0;\n }}\n getY={d => (typeof d.y === 'number' ? d.y : 0)}\n {...chartProps(chart)}\n theme={fuiTheme}\n showDataLabels={false}\n />\n );\n case 'polar':\n return (\n <PolarChart\n data={chart.data}\n getLabel={d => d.name}\n getValue={d => d.value ?? 0}\n title={chart.title}\n showDataLabels={true} \n theme={fuiTheme}\n />\n );\n case 'radar':\n return (\n <RadarChart\n data={chart.data}\n getLabel={d => d.name}\n getValue={d => d.value ?? 0}\n title={chart.title}\n theme={fuiTheme}\n />\n );\n\n default:\n throw new Error(`Unsupported chart type: ${type}`);\n }\n};\n\n/**\n * Smart Fluent tooltip generator with chart-type awareness.\n */\n\nexport function createFluentTooltip<TType extends ChartType>(\n theme: Theme\n): Partial<TooltipOptions<TType>> {\n const fontFamily = theme.fontFamilyBase;\n const fontSize = parseInt(theme.fontSizeBase200.replace('px', '')) || 14;\n const tooltipBg = theme.colorNeutralBackground1;\n const tooltipTitleColor = theme.colorNeutralForeground1;\n const tooltipBodyColor = theme.colorNeutralForeground2;\n const borderColor = theme.colorNeutralStroke2;\n\n const callbacks: TooltipCallbacks<TType> = {\n title(this: TooltipModel<TType>, context: TooltipItem<TType>[]) {\n return context[0]?.label ?? '';\n },\n\n label(this: TooltipModel<TType>, item: TooltipItem<TType>) {\n const datasetLabel =\n 'label' in (item.dataset as Record<string, any>) &&\n typeof (item.dataset as Record<string, any>).label === 'string'\n ? (item.dataset as Record<string, any>).label\n : 'Value';\n\n const raw = item.raw;\n\n // Bubble format { x, y, r }\n if (\n typeof raw === 'object' &&\n raw !== null &&\n 'x' in raw &&\n 'y' in raw &&\n 'r' in raw\n ) {\n const { x, y, r } = raw as any;\n return `${datasetLabel} — x: ${x}, y: ${y}, r: ${r}`;\n }\n\n // Scatter format { x, y }\n if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw) {\n const { x, y } = raw as any;\n return `${datasetLabel} — x: ${x}, y: ${y}`;\n }\n\n // Floating bar [min, max]\n if (Array.isArray(raw) && raw.length === 2) {\n const [min, max] = raw;\n return `${datasetLabel}: ${min} – ${max}`;\n }\n\n // Default: single number or string\n return `${datasetLabel}: ${raw}`;\n },\n\n beforeTitle: () => '',\n afterTitle: () => '',\n beforeBody: () => '',\n afterBody: () => '',\n beforeLabel: () => '',\n afterLabel: () => '',\n labelColor: () => undefined as any,\n labelTextColor: () => '',\n footer: () => '',\n beforeFooter: () => '',\n afterFooter: () => '',\n labelPointStyle: () => ({\n pointStyle: 'circle',\n rotation: 0,\n radius: 5,\n }),\n };\n\n return {\n enabled: true,\n displayColors: true,\n boxWidth: 10,\n boxHeight: 10,\n boxPadding: 5,\n backgroundColor: tooltipBg,\n borderColor,\n borderWidth: 1,\n cornerRadius: 4,\n padding: 10,\n titleColor: tooltipTitleColor,\n bodyColor: tooltipBodyColor,\n titleFont: { family: fontFamily, size: fontSize },\n bodyFont: { family: fontFamily, size: fontSize },\n callbacks,\n };\n}\n\n\n/**\n * Returns a Chart.js ticks callback to truncate long labels and add optional prefix/suffix.\n */\nexport const createAxisLabelFormatter = ({\n maxLength = 12,\n suffix = '',\n prefix = '',\n}: {\n maxLength?: number;\n suffix?: string;\n prefix?: string;\n}) => {\n return function (this: any, value: string | number): string {\n const label = typeof value === 'number' ? this.getLabelForValue(value) : String(value);\n const trimmed = label.length > maxLength ? label.slice(0, maxLength) + '…' : label;\n return `${prefix}${trimmed}${suffix}`;\n };\n};\n\n\nfunction debounce<T extends (...args: any[]) => void>(fn: T, delay: number): T {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return function(this: any, ...args: any[]) {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fn.apply(this, args), delay);\n } as T;\n}\n\n/**\n * useGraphUtils — shared theming and chart helpers.\n */\nexport function useGraphUtils(theme?: Theme) {\n return useMemo(\n () => ({\n lightenColor,\n getFluentPalette,\n getChartComponent,\n createFluentTooltip,\n createAxisLabelFormatter,\n debounce\n }),\n [theme]\n );\n}\n","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { createAxisLabelFormatter, useGraphUtils } from '../../hooks/useGraphUtils';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Theme } from '@fluentui/react-components';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface BarProps<T> {\n data: { label: string; data: T[]; type?: 'bar' | 'line' }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme: Theme;\n}\n\nexport default function BarChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDatalabels = false,\n stacked = false,\n theme,\n}: BarProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n const styles = useGraphGlobalStyles();\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n // Extract all unique x-axis categories (from all series)\n const allCategories = useMemo(() => {\n const categorySet = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(datum => {\n categorySet.add(getPrimary(datum));\n });\n });\n return Array.from(categorySet);\n }, [data, getPrimary]);\n\n // Construct Chart.js datasets\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n backgroundColor: seriesColors[series.label],\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n // Assign y-axis based on series type when stacked\n yAxisID: stacked ? (series.type === 'line' ? 'y1' : 'y') : 'y',\n })),\n };\n }, [data, visibleSeries, allCategories, seriesColors, stacked]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(\n () => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }),\n [theme]\n );\n\n const options: ChartOptions<'bar'> = useMemo(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: {\n display: false,\n },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n type: 'linear',\n position: 'left',\n stacked,\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n ...(stacked && {\n y1: {\n type: 'linear',\n position: 'right',\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n drawOnChartArea: false,\n },\n },\n }),\n },\n }),\n [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]\n );\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n"],"names":["LegendButton","_ref","label","isVisible","color","_ref$style","style","React","Tooltip","content","relationship","Button","ref","buttonRef","shape","size","appearance","onClick","_extends","backgroundColor","tokens","colorNeutralForeground1","borderColor","borderWidth","width","padding","textAlign","Caption1","as","display","overflow","textOverflow","whiteSpace","lineHeight","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","marginTop","marginBottom","marginLeft","marginRight","paddingTop","paddingBottom","paddingLeft","paddingRight","_ref$wrap","wrap","children","className","stackStyle","css","flexDirection","_ref$direction","height","flexWrap","background","mergeClasses","displayName","styles","wrapper","boxSizing","LegendContainer","props","overflowItems","visibleLabels","toggleLabel","renderLabel","getColor","containerRef","visibleItems","map","item","length","includes","key","Menu","MenuTrigger","disableButtonEnhancement","MenuButton","MenuPopover","minWidth","maxWidth","MenuList","MenuItem","useResponsiveLegend","items","useRef","_useState","useState","maxVisible","setMaxVisible","debounce","useGraphUtils","useEffect","measure","containerWidth","_containerRef$current","_containerRef$current2","current","offsetWidth","count","Math","floor","BUTTON_WIDTH","debouncedMeasure","observer","ResizeObserver","observe","disconnect","slice","RenderLegend","data","visibleSeries","seriesColors","toggleSeries","_useResponsiveLegend","d","useGraphGlobalStyles","chartWithLegend","chartArea","flexGrow","minHeight","_templateObject","_taggedTemplateLiteralLoose","legendArea","_templateObject2","AreaChart","getPrimary","getSecondary","title","_ref$showDatalabels","showDatalabels","_ref$theme","theme","webLightTheme","_ref$stacked","stacked","_data$","setVisibleSeries","_useGraphUtils","lightenColor","getFluentPalette","createFluentTooltip","useMemo","reduce","acc","series","idx","base","allCategories","set","Set","forEach","add","Array","from","chartData","labels","datasets","filter","cat","match","find","fill","tension","pointRadius","_useMemo","fontFamily","fontFamilyBase","fontSize","parseInt","fontSizeBase200","replace","labelColor","gridColor","colorNeutralStroke2","options","responsive","maintainAspectRatio","plugins","text","font","family","weight","fontWeightSemibold","top","bottom","datalabels","legend","tooltip","scales","x","ticks","grid","y","Line","prev","next","concat","BarHorizontalChart","categorySet","datum","found","indexAxis","Bar","BubbleChart","getRadius","showDataLabels","r","colorNeutralStroke1","hoverBorderWidth","_data$2","type","Bubble","ComboChart","_ref$showDataLabels","sortedSeries","sort","a","b","_series$yAxisID","yAxisID","order","position","Chart","register","CategoryScale","LinearScale","PointElement","LineElement","Filler","Legend","ChartDataLabels","Title","ChartJS","BarElement","RenderValueLegend","entries","entry","value","DoughnutChart","getLabel","getValue","hiddenLabels","setHiddenLabels","valueMap","Map","get","allLabels","keys","palette","colors","_","i","_useMemo2","filteredLabels","values","visibleColors","indexOf","legendEntries","formatter","Doughnut","FloatingBarChart","getRange","borderRadius","LineChart","PieChart","Pie","ArcElement","RenderSliceLegend","PolarChart","backdropColor","PolarArea","RadarChart","pointBackgroundColor","angleLines","pointLabels","Radar","ScatterChart","getX","getY","useCallback","Scatter","StackedLineChart","SteamChart","_useState2","showPercent","setShowPercent","totalPerPoint","sum","index","rawValue","round","Number","EPSILON","animation","duration","easing","interaction","mode","intersect","callback","min","max","undefined","ToggleButton","p","RadialLinearScale","hex","amount","test","startsWith","g","toHex","v","toString","padStart","_theme","chartProps","chart","name","getChartComponent","fuiTheme","BarChart","_d$radius","radius","_series$type","secondaryAxisId","_d$min","_d$max","_datum$value","_datum$value2","Date","getTime","_d$value","_d$value2","Error","enabled","displayColors","boxWidth","boxHeight","boxPadding","colorNeutralBackground1","cornerRadius","titleColor","bodyColor","colorNeutralForeground2","titleFont","bodyFont","callbacks","context","_context$0$label","_context$","datasetLabel","dataset","raw","isArray","beforeTitle","afterTitle","beforeBody","afterBody","beforeLabel","afterLabel","labelTextColor","footer","beforeFooter","afterFooter","labelPointStyle","pointStyle","rotation","createAxisLabelFormatter","maxLength","_ref$maxLength","_ref$suffix","suffix","_ref$prefix","prefix","this","getLabelForValue","String","trimmed","fn","delay","timer","args","_len","_key","arguments","clearTimeout","setTimeout","apply","_this","y1","drawOnChartArea"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fluentui-react-charts.cjs.production.min.js","sources":["../src/components/legendeButton/LegendButton.tsx","../src/components/stack/Stack.tsx","../src/components/legendContainer/LegendContainer.tsx","../src/hooks/useResponsiveLegend.ts","../src/components/RenderLegend/RenderLegend.tsx","../src/graphGlobalStyles/useGraphGlobalStyles.ts","../src/charts/areaChart/AreaChart.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/useGraphUtils.tsx","../src/charts/BarChart/BarChart.tsx"],"sourcesContent":["// 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 { 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 {\n Menu,\n MenuButton,\n MenuItem,\n MenuList,\n MenuPopover,\n MenuTrigger,\n} from '@fluentui/react-components';\n\nimport { LegendButton } from '../legendeButton/LegendButton';\nimport React from 'react';\nimport Stack from '../stack/Stack';\nimport { css } from '@emotion/css';\n\ninterface LegendContainerProps<T> {\n items: T[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n renderLabel: (item: T) => string;\n getColor: (item: T) => string;\n}\n\nconst styles = {\n wrapper: css({\n display: 'flex',\n flexWrap: 'nowrap',\n overflow: 'hidden',\n justifyContent: 'center',\n gap: 10,\n padding: 2,\n width: '100%',\n boxSizing: 'border-box',\n }),\n};\n\nexport function LegendContainer<T extends { label: string }>(\n props: LegendContainerProps<T> & {\n containerRef: React.RefObject<HTMLDivElement>;\n \n visibleItems: T[];\n overflowItems: T[];\n }\n) {\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n visibleLabels,\n toggleLabel,\n renderLabel,\n getColor,\n } = props;\n\n return (\n <Stack\n justifyContent=\"center\"\n alignItems=\"center\"\n marginLeft=\"10px\"\n marginRight=\"10px\"\n marginTop=\"25px\"\n marginBottom=\"20px\"\n >\n <div ref={containerRef} className={styles.wrapper}>\n {visibleItems.map(item => {\n const label = item.label;\n const isVisible =\n visibleLabels.length === 0 || visibleLabels.includes(label);\n return (\n \n <LegendButton\n key={label}\n label={renderLabel(item)}\n color={getColor(item)}\n isVisible={isVisible}\n onClick={() => toggleLabel(label)}\n \n />\n \n );\n })}\n\n {overflowItems.length > 0 && (\n <Menu>\n <MenuTrigger disableButtonEnhancement>\n <MenuButton size=\"small\" appearance=\"transparent\">\n +{overflowItems.length}\n </MenuButton>\n </MenuTrigger>\n <MenuPopover style={{ minWidth: 'fit-content', maxWidth: '200px' }}>\n <MenuList>\n {overflowItems.map(item => {\n const label = item.label;\n const isVisible =\n visibleLabels.length === 0 || visibleLabels.includes(label);\n return (\n <MenuItem key={label} style={{ padding: 0 }}>\n \n <LegendButton\n label={renderLabel(item)}\n color={getColor(item)}\n isVisible={isVisible}\n onClick={() => toggleLabel(label)}\n style={{ width: '100px', textAlign: 'left' }}\n />\n \n \n </MenuItem>\n );\n })}\n </MenuList>\n </MenuPopover>\n </Menu>\n )}\n </div>\n </Stack>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { useGraphUtils } from './useGraphUtils';\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 } = useGraphUtils();\n useEffect(() => {\n const measure = () => {\n const containerWidth = containerRef.current?.offsetWidth ?? 0;\n const itemTotalWidth = BUTTON_WIDTH + GAP;\n const count = Math.floor(containerWidth / itemTotalWidth);\n setMaxVisible(count);\n };\n\n const debouncedMeasure = debounce(measure, 100); // debounce resize\n\n const observer = new ResizeObserver(debouncedMeasure);\n if (containerRef.current) observer.observe(containerRef.current);\n measure(); // initial\n\n return () => observer.disconnect();\n }, [items]);\n\n return {\n containerRef,\n visibleItems: items.slice(0, maxVisible),\n overflowItems: items.slice(maxVisible),\n };\n}\n","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface LegendControlProps {\n data: { label: string }[];\n visibleSeries: string[];\n seriesColors: Record<string, string>;\n toggleSeries: (label: string) => void;\n}\n\nconst RenderLegend: React.FC<LegendControlProps> = ({\n data,\n visibleSeries,\n seriesColors,\n toggleSeries,\n}) => {\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n } = useResponsiveLegend(data);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n \n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={data}\n visibleLabels={visibleSeries}\n toggleLabel={toggleSeries}\n renderLabel={d => d.label}\n getColor={d => seriesColors[d.label]}\n />\n );\n};\n\nexport default RenderLegend;\n","import { css } from \"@emotion/css\";\n\nexport const useGraphGlobalStyles = () => {\n return {\n chartWithLegend: css({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n chartArea: {\n flexGrow: 1,\n minHeight: 0,\n },\n }),\n chartArea: css`\n flex-grow: 1;\n min-height: 0;\n `,\n legendArea: css`\n margin-top: 0px;\n padding-top: 0px;\n \n margin-Left: 10px;\n margin-Right: 10px;\n \n `,\n };\n \n}","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Tooltip,\n Filler,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface AreaChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme?: Theme;\n}\n\nexport default function AreaChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDatalabels = false,\n theme = webLightTheme,\n stacked = false,\n}: AreaChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : null;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n fill: true,\n tension: 0.4,\n pointRadius: 2,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\n const options: ChartOptions<'line'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title ,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n }), [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Theme } from '@fluentui/react-theme';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n Title,\n ChartDataLabels,\n \n \n);\n\n\n\nexport interface BarHorizontalProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme: Theme;\n}\n\nexport default function BarHorizontalChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n stacked = false,\n showDatalabels = false,\n title,\n theme\n}: BarHorizontalProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\nconst styles = useGraphGlobalStyles();\n \n const { lightenColor, getFluentPalette , createFluentTooltip} = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const categorySet = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(datum => {\n categorySet.add(getPrimary(datum));\n });\n });\n return Array.from(categorySet);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n backgroundColor: seriesColors[series.label],\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n })),\n };\n }, [data, visibleSeries, allCategories, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'bar'> = useMemo(() => ({\n indexAxis: 'y',\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: {\n display: false,\n },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n stacked,\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n },\n }), [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea} >\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n \n );\n}\n","import {\n BubbleDataPoint,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Bubble } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n Tooltip,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface BubbleChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number | Date;\n getSecondary: (datum: T) => number;\n getRadius: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function BubbleChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n getRadius,\n showDataLabels,\n title,\n theme = webLightTheme,\n}: BubbleChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n\n const styles = useGraphGlobalStyles();\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const chartData = useMemo(() => {\n return {\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: series.data.map(d => ({\n x: getPrimary(d),\n y: getSecondary(d),\n r: getRadius(d),\n })) as BubbleDataPoint[],\n backgroundColor: seriesColors[series.label],\n borderColor: theme.colorNeutralStroke1,\n borderWidth: 1,\n hoverBorderWidth: 2,\n })),\n };\n }, [data, visibleSeries, getPrimary, getSecondary, getRadius, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'bubble'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bubble'>(theme),\n },\n scales: {\n x: {\n type:\n typeof getPrimary(data[0]?.data[0]) === 'number'\n ? 'linear'\n : 'category',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n }), [\n title,\n showDataLabels,\n theme,\n getPrimary,\n getSecondary,\n data,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n createFluentTooltip,\n ]);\n\n return (\n <>\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bubble data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n </>\n );\n}\n","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Chart } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n LineElement,\n PointElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface ComboChartProps<T> {\n data: {\n label: string;\n type: 'bar' | 'line';\n data: T[];\n yAxisID?: string;\n }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function ComboChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: ComboChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => series.data.forEach(d => set.add(getPrimary(d))));\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n const sortedSeries = data\n .filter(series => visibleSeries.includes(series.label))\n .sort((a, b) => {\n // Ensure bars come before lines\n if (a.type === 'bar' && b.type === 'line') return -1;\n if (a.type === 'line' && b.type === 'bar') return 1;\n return 0;\n });\n\n return {\n labels: allCategories,\n datasets: sortedSeries.map(series => ({\n type: series.type,\n label: series.label,\n yAxisID: series.yAxisID ?? 'y',\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n backgroundColor: seriesColors[series.label],\n borderColor: seriesColors[series.label],\n fill: series.type === 'bar',\n tension: series.type === 'line' ? 0.4 : 0,\n pointRadius: series.type === 'line' ? 3 : 0,\n borderWidth: series.type === 'line' ? 2 : 1,\n order: series.type === 'bar' ? 1 : 0, // Ensure bars are drawn first\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n \n\n const options: ChartOptions<'bar' | 'line'> = useMemo(() => ( {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bar' | 'line'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n position: 'left',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n stacked: false,\n },\n },\n }), [\n title,\n showDataLabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n createFluentTooltip,\n ]);\n\n return (\n <>\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Chart type=\"bar\" data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n </>\n );\n}\n","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface LegendEntry {\n label: string;\n value: number;\n color: string;\n}\n\nexport interface ValueLegendProps {\n entries: LegendEntry[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n}\n\nconst RenderValueLegend: React.FC<ValueLegendProps> = ({\n entries,\n visibleLabels,\n toggleLabel,\n}) => {\n const {\n containerRef,\n\n visibleItems,\n overflowItems,\n } = useResponsiveLegend(entries);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={entries}\n visibleLabels={visibleLabels}\n toggleLabel={toggleLabel}\n renderLabel={entry => `${entry.label}: ${entry.value}`}\n getColor={entry => entry.color}\n />\n );\n};\n\nexport default RenderValueLegend;\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Doughnut } from 'react-chartjs-2';\nimport RenderValueLegend from '../../components/renderValueLegend/RenderValueLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(ArcElement, Tooltip, Legend, Title);\n\nexport interface DoughnutChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function DoughnutChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n}: DoughnutChartProps<T>) {\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n\n const toggleLabel = (label: string): void => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\n const { allLabels, colors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n return { allLabels, colors };\n }, [valueMap, getFluentPalette, theme, lightenColor]);\n\n const { filteredLabels, values, visibleColors } = useMemo(() => {\n const filteredLabels = allLabels.filter(label => !hiddenLabels.includes(label));\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n return { filteredLabels, values, visibleColors };\n }, [allLabels, hiddenLabels, valueMap, colors]);\n\n const chartData = useMemo(() => ({\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n }), [filteredLabels, values, visibleColors]);\n\n const legendEntries = useMemo(() => {\n return allLabels.map((label, idx) => ({\n label,\n value: valueMap.get(label) || 0,\n color: colors[idx],\n }));\n }, [allLabels, valueMap, colors]);\n\n const options: ChartOptions<'doughnut'> = useMemo(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { display: false },\n tooltip: createFluentTooltip<'doughnut'>(theme),\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n formatter: (value: number) => value,\n },\n },\n }),\n [title, theme, showDataLabels, createFluentTooltip]\n );\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Doughnut data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderValueLegend\n entries={legendEntries}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface FloatingBarChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getRange: (datum: T) => [number, number]; // e.g., [min, max]\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function FloatingBarChart<T extends object>({\n data,\n getPrimary,\n getRange,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: FloatingBarChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getRange(match) : [0, 0];\n }),\n backgroundColor: seriesColors[series.label],\n borderRadius: 2,\n })),\n };\n }, [data, visibleSeries, allCategories, getPrimary, getRange, seriesColors]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options: ChartOptions<'bar'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n title,\n theme,\n showDataLabels,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n createFluentTooltip\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n LineElement,\n PointElement,\n CategoryScale,\n LinearScale,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface LineChartProps<T> {\n data: { label: string; data: T[] }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function LineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: LineChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette , createFluentTooltip} = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : null;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n tension: 0.4,\n fill: false,\n pointRadius: 4,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options: ChartOptions<'line'> = useMemo(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n ticks: {\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n },\n }), [\n title,\n theme,\n showDataLabels,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n createFluentTooltip\n ]);\n\n return (\n\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <div className={styles.legendArea} >\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n \n );\n}\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Pie } from 'react-chartjs-2';\nimport RenderValueLegend from '../../components/renderValueLegend/RenderValueLegend';\nimport { createFluentTooltip } from '../../hooks/useGraphUtils';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(ArcElement, Tooltip, Legend, Title);\n\nexport interface PieChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function PieChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: PieChartProps<T>) {\n const { getFluentPalette, lightenColor } = useGraphUtils(theme);\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n const styles = useGraphGlobalStyles();\n const toggleLabel = (label: string): void => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\nconst { allLabels, colors, filteredLabels, values, visibleColors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n\n const filteredLabels = allLabels.filter(\n label => !hiddenLabels.includes(label)\n );\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n\n return { allLabels, colors, filteredLabels, values, visibleColors };\n}, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]);\n\nconst { chartData, legendEntries } = useMemo(() => {\n const chartData = {\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n };\n\n const legendEntries = allLabels.map((label, i) => ({\n label,\n value: valueMap.get(label) || 0,\n color: colors[i],\n }));\n\n return { chartData, legendEntries };\n}, [filteredLabels, values, visibleColors, allLabels, valueMap, colors]);\n\nconst options = useMemo<ChartOptions<'pie'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n tooltip: createFluentTooltip<'pie'>(theme),\n legend: { display: false },\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n },\n}), [theme, title, showDataLabels]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Pie data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderValueLegend\n entries={legendEntries}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n","import { LegendContainer } from '../legendContainer/LegendContainer';\nimport React from 'react';\nimport { useResponsiveLegend } from '../../hooks/useResponsiveLegend';\n\nexport interface SliceLegendProps {\n labels: string[];\n colors: string[];\n visibleLabels: string[];\n toggleLabel: (label: string) => void;\n}\n\nconst RenderSliceLegend: React.FC<SliceLegendProps> = ({\n labels,\n colors,\n visibleLabels,\n toggleLabel,\n}) => {\n interface SliceLegendItem {\n label: string;\n color: string;\n }\n\n const items: SliceLegendItem[] = labels.map((label, i) => ({ label, color: colors[i] }));\n const {\n containerRef,\n \n visibleItems,\n overflowItems,\n } = useResponsiveLegend(items);\n\n return (\n <LegendContainer\n containerRef={containerRef}\n \n visibleItems={visibleItems}\n overflowItems={overflowItems}\n items={items}\n visibleLabels={visibleLabels}\n toggleLabel={toggleLabel}\n renderLabel={item => item.label}\n getColor={item => item.color}\n />\n );\n};\n\nexport default RenderSliceLegend;\n","import {\n ArcElement,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n RadialLinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useGraphUtils } from '../../hooks/useGraphUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { PolarArea } from 'react-chartjs-2';\nimport RenderSliceLegend from '../../components/renderSliceLegend/RenderSliceLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n RadialLinearScale,\n ArcElement,\n Tooltip,\n Legend,\n Title,\n ChartDataLabels\n);\n\nexport interface PolarChartProps<T> {\n data: {\n label: string;\n data: T[];\n }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function PolarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = true,\n theme = webLightTheme,\n}: PolarChartProps<T>) {\n const { getFluentPalette, lightenColor } = useGraphUtils(theme);\n const [hiddenLabels, setHiddenLabels] = useState<string[]>([]);\n const styles = useGraphGlobalStyles();\n const toggleLabel = (label: string) => {\n setHiddenLabels(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const valueMap = useMemo(() => {\n const map = new Map<string, number>();\n data.forEach(series => {\n series.data.forEach(d => {\n const label = getLabel(d);\n const value = getValue(d);\n map.set(label, (map.get(label) || 0) + value);\n });\n });\n return map;\n }, [data, getLabel, getValue]);\n\nconst { allLabels, colors, filteredLabels, values, visibleColors } = useMemo(() => {\n const allLabels = Array.from(valueMap.keys());\n const palette = getFluentPalette(theme);\n const colors = allLabels.map((_, i) =>\n lightenColor(palette[i % palette.length], 0.3)\n );\n\n const filteredLabels = allLabels.filter(\n label => !hiddenLabels.includes(label)\n );\n const values = filteredLabels.map(label => valueMap.get(label) || 0);\n const visibleColors = filteredLabels.map(label => {\n const idx = allLabels.indexOf(label);\n return colors[idx];\n });\n\n return { allLabels, colors, filteredLabels, values, visibleColors };\n}, [valueMap, getFluentPalette, lightenColor, theme, hiddenLabels]);\n\nconst chartData = useMemo(() => ({\n labels: filteredLabels,\n datasets: [\n {\n data: values,\n backgroundColor: visibleColors,\n borderWidth: 1,\n },\n ],\n}), [filteredLabels, values, visibleColors]);\n\nconst options = useMemo<ChartOptions<'polarArea'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n formatter: (value: number) => value,\n },\n tooltip: createFluentTooltip<'polarArea'>(theme),\n legend: { display: false },\n },\n scales: {\n r: {\n ticks: {\n color: theme.colorNeutralForeground1,\n backdropColor: 'transparent',\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n grid: {\n color: theme.colorNeutralStroke2,\n },\n },\n },\n}), [theme, title, showDataLabels, createFluentTooltip]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <PolarArea data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderSliceLegend\n labels={allLabels}\n colors={colors}\n visibleLabels={filteredLabels}\n toggleLabel={toggleLabel}\n />\n </div>\n </div>\n );\n}\n","import {\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n PointElement,\n RadialLinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useGraphUtils } from '../../hooks/useGraphUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Radar } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n RadialLinearScale,\n PointElement,\n LineElement,\n Filler,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface RadarChartProps<T> {\n data: { label: string; data: T[] }[];\n getLabel: (datum: T) => string;\n getValue: (datum: T) => number;\n title?: string; \n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function RadarChart<T extends object>({\n data,\n getLabel,\n getValue,\n title,\n showDataLabels = false,\n theme = webLightTheme, \n}: RadarChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette } = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n };\n\n const allLabels = useMemo(() => {\n const set = new Set<string>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getLabel(d)));\n });\n return Array.from(set);\n }, [data, getLabel]);\n\n const chartData = useMemo(() => {\n return {\n labels: allLabels,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allLabels.map(label => {\n const match = series.data.find(d => getLabel(d) === label);\n return match ? getValue(match) : 0;\n }),\n backgroundColor: seriesColors[series.label] + '33',\n borderColor: seriesColors[series.label],\n borderWidth: 2,\n pointBackgroundColor: seriesColors[series.label],\n })),\n };\n }, [data, visibleSeries, allLabels, getLabel, getValue, seriesColors]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }), [theme]);\n\n const options = useMemo<ChartOptions<'radar'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n tooltip: createFluentTooltip<'radar'>(theme),\n legend: { display: false },\n },\n scales: {\n r: {\n angleLines: { color: gridColor },\n grid: { color: gridColor },\n pointLabels: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n },\n },\n }), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n gridColor,\n labelColor,\n fontFamily,\n fontSize,\n ]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Radar data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n","import {\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n PointElement,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Scatter } from 'react-chartjs-2';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(LinearScale, PointElement, Tooltip, Legend);\n\nexport interface ScatterChartProps<T> {\n data: { label: string; data: T[] }[];\n getX: (datum: T) => number;\n getY: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function ScatterChart<T extends object>({\n data,\n getX,\n getY,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: ScatterChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.map(s => s.label)\n );\n const styles = useGraphGlobalStyles();\n const { getFluentPalette, lightenColor, createFluentTooltip } = useGraphUtils(\n theme\n );\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = React.useCallback((label: string) => {\n setVisibleSeries(prev =>\n prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]\n );\n }, []);\n\n const chartData = useMemo(() => {\n return {\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: series.data.map(d => ({ x: getX(d), y: getY(d) })),\n backgroundColor: seriesColors[series.label],\n borderColor: seriesColors[series.label],\n pointRadius: 4,\n })),\n };\n }, [data, visibleSeries, getX, getY, seriesColors]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'scatter'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'scatter'>(theme),\n },\n scales: {\n x: {\n type: 'linear',\n position: 'bottom',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n type: 'linear',\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Scatter data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, webLightTheme } from '@fluentui/react-components';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\nimport { useGraphUtils } from '../../hooks/useGraphUtils';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n CategoryScale,\n LinearScale,\n LineElement,\n PointElement,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface StackedLineChartProps<T> {\n data: { label: string; data: T[] }[]; \n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function StackedLineChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: StackedLineChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const styles = useGraphGlobalStyles();\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data, theme]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n const allCategories = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n data: allCategories.map(cat => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return match ? getSecondary(match) : 0;\n }),\n borderColor: seriesColors[series.label],\n backgroundColor: seriesColors[series.label],\n fill: true,\n tension: 0.4,\n pointRadius: 3,\n })),\n };\n }, [\n data,\n visibleSeries,\n allCategories,\n getPrimary,\n getSecondary,\n seriesColors,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDataLabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n );\n}\n","import {\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Filler,\n Legend,\n LineElement,\n LinearScale,\n PointElement,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { Theme, ToggleButton, webLightTheme } from '@fluentui/react-components';\nimport { createFluentTooltip, useGraphUtils } from '../../hooks/useGraphUtils';\n\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { Line } from 'react-chartjs-2';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Stack } from '../../components/stack/Stack';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(ChartDataLabels);\nChartJS.register(\n LineElement,\n PointElement,\n Filler, \n CategoryScale,\n LinearScale,\n Tooltip,\n Legend,\n Title\n);\n\nexport interface SteamChartProps<T> {\n data: { label: string; data: T[] }[]; \n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n title?: string;\n showDataLabels?: boolean;\n theme?: Theme;\n}\n\nexport default function SteamChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDataLabels = false,\n theme = webLightTheme,\n}: SteamChartProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n const [showPercent, setShowPercent] = useState(false);\nconst styles = useGraphGlobalStyles();\n \n const { lightenColor, getFluentPalette } = useGraphUtils(theme);\n\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n acc[series.label] = lightenColor(base, 0.3);\n return acc;\n }, {} as Record<string, string>);\n }, [data, getFluentPalette, lightenColor, theme]);\n\n const toggleSeries = React.useCallback(\n (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible\n ? prev.filter(l => l !== label)\n : [...prev, label];\n return next.length === 0 ? [data[0].label] : next;\n });\n },\n [data]\n );\n\n const allLabels = useMemo(() => {\n const set = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(d => set.add(getPrimary(d)));\n });\n return Array.from(set);\n }, [data, getPrimary]);\n\n const totalPerPoint = useMemo(() => {\n return allLabels.map(cat =>\n data.reduce((sum, series) => {\n const match = series.data.find(d => getPrimary(d) === cat);\n return sum + (match ? getSecondary(match) : 0);\n }, 0)\n );\n }, [allLabels, data, getPrimary, getSecondary]);\n\n const chartData = useMemo(() => {\n return {\n labels: allLabels,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map((series, ) => ({\n label: series.label,\n fill: true,\n backgroundColor: seriesColors[series.label],\n borderColor: 'transparent',\n borderWidth: 0,\n data: allLabels.map((cat, index) => {\n const match = series.data.find(d => getPrimary(d) === cat);\n const rawValue = match ? getSecondary(match) : 0;\n const total = totalPerPoint[index] || 1;\n return showPercent\n ? Math.round(((rawValue / total) * 100 + Number.EPSILON) * 100) / 100\n : Math.round((rawValue + Number.EPSILON) * 100) / 100;\n }),\n tension: 0.5,\n })),\n };\n }, [\n data,\n visibleSeries,\n allLabels,\n getPrimary,\n getSecondary,\n seriesColors,\n totalPerPoint,\n showPercent,\n ]);\n\nconst { fontFamily, fontSize, labelColor, gridColor } = useMemo(() => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n}), [theme]);\n\nconst options = useMemo<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: false,\n animation: {\n duration: 800,\n easing: 'easeOutQuart',\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: { display: false },\n tooltip: createFluentTooltip<'line'>(theme),\n },\n interaction: {\n mode: 'index',\n intersect: false,\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n ticks: {\n callback: (value: string | number) => (showPercent ? `${value}%` : value),\n color: labelColor,\n font: { family: fontFamily, size: fontSize },\n },\n grid: { color: gridColor },\n min: 0,\n max: showPercent ? 100 : undefined,\n },\n },\n}), [\n theme,\n title,\n showDataLabels,\n createFluentTooltip,\n labelColor,\n fontFamily,\n fontSize,\n gridColor,\n showPercent,\n]);\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Line data={chartData} options={options} />\n </div>\n <Stack justifyContent=\"center\" alignItems=\"center\" margin=\"7px\">\n <ToggleButton\n onClick={() => setShowPercent(p => !p)}\n shape=\"circular\"\n appearance=\"secondary\"\n size=\"small\"\n style={{ width: '150px' }}\n >\n {showPercent ? 'Show Raw Values' : 'Show %'}\n </ToggleButton>\n </Stack>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n","import {\n ChartType,\n TooltipCallbacks,\n TooltipItem,\n TooltipModel,\n TooltipOptions,\n} from 'chart.js';\nimport { 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/IChart';\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';\nimport { useMemo } from 'react';\n\n/**\n * Lightens a given hex color by a percentage amount (0 to 1).\n */\nexport const lightenColor = (hex: string, amount: number): string => {\n if (!/^#?[0-9A-Fa-f]{6}$/.test(hex)) return hex;\n if (hex.startsWith('#')) hex = hex.slice(1);\n\n let r = parseInt(hex.slice(0, 2), 16);\n let g = parseInt(hex.slice(2, 4), 16);\n let b = parseInt(hex.slice(4, 6), 16);\n\n r = Math.min(255, Math.floor(r + (255 - r) * amount));\n g = Math.min(255, Math.floor(g + (255 - g) * amount));\n b = Math.min(255, Math.floor(b + (255 - b) * amount));\n\n const toHex = (v: number) => v.toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\nexport const getFluentPalette = (_theme: Theme): string[] => [\n '#4e79a7',\n '#f28e2c',\n '#e15759',\n '#76b7b2',\n '#59a14f',\n '#edc949',\n '#af7aa1',\n '#ff9da7',\n '#9c755f',\n '#bab0ab',\n '#8cd17d',\n '#b6992d',\n '#d37295',\n '#fabfd2',\n '#79706e',\n];\n\nconst chartProps = (chart: IChart) => ({\n data: chart.data,\n title: chart.title,\n getPrimary: (d: any) => d.name,\n getSecondary: (d: any) => d.value,\n});\n\nconst getChartComponent = (chart: IChart, theme: Theme) => {\n const { type } = chart;\n const fuiTheme = theme ?? webLightTheme; \n switch (type) {\n case 'bar':\n return <BarChart {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n case 'line':\n return <LineChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'area':\n return <AreaChart {...chartProps(chart)} stacked={false} theme={fuiTheme} />;\n\n case 'bar-horizontal':\n return <BarHorizontalChart {...chartProps(chart)} stacked={true} theme={fuiTheme} />;\n case 'bubble':\n return (\n <BubbleChart {...chartProps(chart)} getRadius={d => d.radius ?? 1} theme={fuiTheme} />\n );\n case 'multiple-axes':\n return (\n <ComboChart\n {...chartProps(chart)}\n theme={fuiTheme}\n \n data={chart.data.map((series: any) => ({\n label: series.label,\n type: series.type ?? 'bar',\n data: series.data,\n yAxisID: series.secondaryAxisId,\n \n }))}\n />\n );\n case 'steam':\n return <SteamChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'floating-bar':\n return (\n <FloatingBarChart\n getRange={d => [d.min ?? 0, d.max ?? 0]}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'stacked-line':\n return <StackedLineChart {...chartProps(chart)} theme={fuiTheme} />;\n case 'doughnut':\n return (\n <DoughnutChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'pie':\n return (\n <PieChart\n getLabel={datum => datum.name}\n getValue={datum => datum.value ?? 0}\n showDataLabels={true}\n {...chartProps(chart)}\n theme={fuiTheme}\n />\n );\n case 'scatter':\n return (\n <ScatterChart\n getX={d => {\n if (typeof d.x === 'number') return d.x;\n if (typeof d.x === 'string') return Number(d.x) || 0;\n if (d.x instanceof Date) return d.x.getTime();\n return 0;\n }}\n getY={d => (typeof d.y === 'number' ? d.y : 0)}\n {...chartProps(chart)}\n theme={fuiTheme}\n showDataLabels={false}\n />\n );\n case 'polar':\n return (\n <PolarChart\n data={chart.data}\n getLabel={d => d.name}\n getValue={d => d.value ?? 0}\n title={chart.title}\n showDataLabels={true} \n theme={fuiTheme}\n />\n );\n case 'radar':\n return (\n <RadarChart\n data={chart.data}\n getLabel={d => d.name}\n getValue={d => d.value ?? 0}\n title={chart.title}\n theme={fuiTheme}\n />\n );\n\n default:\n throw new Error(`Unsupported chart type: ${type}`);\n }\n};\n\n/**\n * Smart Fluent tooltip generator with chart-type awareness.\n */\n\nexport function createFluentTooltip<TType extends ChartType>(\n theme: Theme\n): Partial<TooltipOptions<TType>> {\n const fontFamily = theme.fontFamilyBase;\n const fontSize = parseInt(theme.fontSizeBase200.replace('px', '')) || 14;\n const tooltipBg = theme.colorNeutralBackground1;\n const tooltipTitleColor = theme.colorNeutralForeground1;\n const tooltipBodyColor = theme.colorNeutralForeground2;\n const borderColor = theme.colorNeutralStroke2;\n\n const callbacks: TooltipCallbacks<TType> = {\n title(this: TooltipModel<TType>, context: TooltipItem<TType>[]) {\n return context[0]?.label ?? '';\n },\n\n label(this: TooltipModel<TType>, item: TooltipItem<TType>) {\n const datasetLabel =\n 'label' in (item.dataset as Record<string, any>) &&\n typeof (item.dataset as Record<string, any>).label === 'string'\n ? (item.dataset as Record<string, any>).label\n : 'Value';\n\n const raw = item.raw;\n\n // Bubble format { x, y, r }\n if (\n typeof raw === 'object' &&\n raw !== null &&\n 'x' in raw &&\n 'y' in raw &&\n 'r' in raw\n ) {\n const { x, y, r } = raw as any;\n return `${datasetLabel} — x: ${x}, y: ${y}, r: ${r}`;\n }\n\n // Scatter format { x, y }\n if (typeof raw === 'object' && raw !== null && 'x' in raw && 'y' in raw) {\n const { x, y } = raw as any;\n return `${datasetLabel} — x: ${x}, y: ${y}`;\n }\n\n // Floating bar [min, max]\n if (Array.isArray(raw) && raw.length === 2) {\n const [min, max] = raw;\n return `${datasetLabel}: ${min} – ${max}`;\n }\n\n // Default: single number or string\n return `${datasetLabel}: ${raw}`;\n },\n\n beforeTitle: () => '',\n afterTitle: () => '',\n beforeBody: () => '',\n afterBody: () => '',\n beforeLabel: () => '',\n afterLabel: () => '',\n labelColor: () => undefined as any,\n labelTextColor: () => '',\n footer: () => '',\n beforeFooter: () => '',\n afterFooter: () => '',\n labelPointStyle: () => ({\n pointStyle: 'circle',\n rotation: 0,\n radius: 5,\n }),\n };\n\n return {\n enabled: true,\n displayColors: true,\n boxWidth: 10,\n boxHeight: 10,\n boxPadding: 5,\n backgroundColor: tooltipBg,\n borderColor,\n borderWidth: 1,\n cornerRadius: 4,\n padding: 10,\n titleColor: tooltipTitleColor,\n bodyColor: tooltipBodyColor,\n titleFont: { family: fontFamily, size: fontSize },\n bodyFont: { family: fontFamily, size: fontSize },\n callbacks,\n };\n}\n\n\n/**\n * Returns a Chart.js ticks callback to truncate long labels and add optional prefix/suffix.\n */\nexport const createAxisLabelFormatter = ({\n maxLength = 12,\n suffix = '',\n prefix = '',\n}: {\n maxLength?: number;\n suffix?: string;\n prefix?: string;\n}) => {\n return function (this: any, value: string | number): string {\n const label = typeof value === 'number' ? this.getLabelForValue(value) : String(value);\n const trimmed = label.length > maxLength ? label.slice(0, maxLength) + '…' : label;\n return `${prefix}${trimmed}${suffix}`;\n };\n};\n\n\nfunction debounce<T extends (...args: any[]) => void>(fn: T, delay: number): T {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return function(this: any, ...args: any[]) {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fn.apply(this, args), delay);\n } as T;\n}\n\n/**\n * useGraphUtils — shared theming and chart helpers.\n */\nexport function useGraphUtils(theme?: Theme) {\n return useMemo(\n () => ({\n lightenColor,\n getFluentPalette,\n getChartComponent,\n createFluentTooltip,\n createAxisLabelFormatter,\n debounce\n }),\n [theme]\n );\n}\n","import {\n BarElement,\n CategoryScale,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n Title,\n Tooltip,\n} from 'chart.js';\nimport React, { useMemo, useState } from 'react';\nimport { createAxisLabelFormatter, useGraphUtils } from '../../hooks/useGraphUtils';\n\nimport { Bar } from 'react-chartjs-2';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport RenderLegend from '../../components/RenderLegend/RenderLegend';\nimport { Theme } from '@fluentui/react-components';\nimport { useGraphGlobalStyles } from '../../graphGlobalStyles/useGraphGlobalStyles';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Tooltip,\n Legend,\n ChartDataLabels,\n Title\n);\n\nexport interface BarProps<T> {\n data: { label: string; data: T[]; type?: 'bar' | 'line' }[];\n getPrimary: (datum: T) => string | number;\n getSecondary: (datum: T) => number;\n stacked?: boolean;\n title?: string;\n showDatalabels?: boolean;\n theme: Theme;\n}\n\nexport default function BarChart<T extends object>({\n data,\n getPrimary,\n getSecondary,\n title,\n showDatalabels = false,\n stacked = false,\n theme,\n}: BarProps<T>) {\n const [visibleSeries, setVisibleSeries] = useState(() =>\n data.length > 1 ? data.map(s => s.label) : [data[0]?.label]\n );\n\n const { lightenColor, getFluentPalette, createFluentTooltip } = useGraphUtils(\n theme\n );\n const styles = useGraphGlobalStyles();\n const seriesColors = useMemo(() => {\n return data.reduce((acc, series, idx) => {\n const base = getFluentPalette(theme)[\n idx % getFluentPalette(theme).length\n ];\n const color = lightenColor(base, 0.3);\n acc[series.label] = color;\n return acc;\n }, {} as Record<string, string>);\n }, [data]);\n\n const toggleSeries = (label: string) => {\n setVisibleSeries(prev => {\n const isVisible = prev.includes(label);\n const next = isVisible ? prev.filter(l => l !== label) : [...prev, label];\n return next.length === 0 && data.length > 0 ? [data[0].label] : next;\n });\n };\n\n // Extract all unique x-axis categories (from all series)\n const allCategories = useMemo(() => {\n const categorySet = new Set<string | number>();\n data.forEach(series => {\n series.data.forEach(datum => {\n categorySet.add(getPrimary(datum));\n });\n });\n return Array.from(categorySet);\n }, [data, getPrimary]);\n\n // Construct Chart.js datasets\n const chartData = useMemo(() => {\n return {\n labels: allCategories,\n datasets: data\n .filter(series => visibleSeries.includes(series.label))\n .map(series => ({\n label: series.label,\n backgroundColor: seriesColors[series.label],\n data: allCategories.map(cat => {\n const found = series.data.find(d => getPrimary(d) === cat);\n return found ? getSecondary(found) : 0;\n }),\n // Assign y-axis based on series type when stacked\n yAxisID: stacked ? (series.type === 'line' ? 'y1' : 'y') : 'y',\n })),\n };\n }, [data, visibleSeries, allCategories, seriesColors, stacked]);\n\n const { fontFamily, fontSize, labelColor, gridColor } = useMemo(\n () => ({\n fontFamily: theme.fontFamilyBase,\n fontSize: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n labelColor: theme.colorNeutralForeground1,\n gridColor: theme.colorNeutralStroke2,\n }),\n [theme]\n );\n\n const options: ChartOptions<'bar'> = useMemo(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n\n plugins: {\n title: {\n display: !!title,\n text: title,\n font: {\n size: 14,\n family: theme.fontFamilyBase,\n weight: theme.fontWeightSemibold,\n },\n color: theme.colorNeutralForeground1,\n padding: {\n top: 20,\n bottom: 20,\n },\n },\n datalabels: {\n display: showDatalabels,\n color: theme.colorNeutralForeground1,\n font: {\n family: theme.fontFamilyBase,\n size: parseInt(theme.fontSizeBase200.replace('px', '')) || 14,\n },\n },\n legend: {\n display: false,\n },\n tooltip: createFluentTooltip<'bar'>(theme),\n },\n scales: {\n x: {\n stacked,\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n y: {\n type: 'linear',\n position: 'left',\n stacked,\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n color: gridColor,\n },\n },\n ...(stacked && {\n y1: {\n type: 'linear',\n position: 'right',\n ticks: {\n callback: createAxisLabelFormatter({ maxLength: 10 }),\n color: labelColor,\n font: {\n family: fontFamily,\n size: fontSize,\n },\n },\n grid: {\n drawOnChartArea: false,\n },\n },\n }),\n },\n }),\n [\n title,\n showDatalabels,\n theme,\n fontFamily,\n fontSize,\n labelColor,\n gridColor,\n stacked,\n createFluentTooltip,\n ]\n );\n\n return (\n <div className={styles.chartWithLegend}>\n <div className={styles.chartArea}>\n <Bar data={chartData} options={options} />\n </div>\n <div className={styles.legendArea}>\n <RenderLegend\n data={data}\n visibleSeries={visibleSeries}\n seriesColors={seriesColors}\n toggleSeries={toggleSeries}\n />\n </div>\n </div>\n );\n}\n"],"names":["LegendButton","_ref","label","isVisible","color","_ref$style","style","React","Tooltip","content","relationship","Button","ref","buttonRef","shape","size","appearance","onClick","_extends","backgroundColor","tokens","colorNeutralForeground1","borderColor","borderWidth","width","padding","textAlign","Caption1","as","display","overflow","textOverflow","whiteSpace","lineHeight","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","marginTop","marginBottom","marginLeft","marginRight","paddingTop","paddingBottom","paddingLeft","paddingRight","_ref$wrap","wrap","children","className","stackStyle","css","flexDirection","_ref$direction","height","flexWrap","background","mergeClasses","displayName","styles","wrapper","boxSizing","LegendContainer","props","overflowItems","visibleLabels","toggleLabel","renderLabel","getColor","containerRef","visibleItems","map","item","length","includes","key","Menu","MenuTrigger","disableButtonEnhancement","MenuButton","MenuPopover","minWidth","maxWidth","MenuList","MenuItem","useResponsiveLegend","items","useRef","_useState","useState","maxVisible","setMaxVisible","debounce","useGraphUtils","useEffect","measure","containerWidth","_containerRef$current","_containerRef$current2","current","offsetWidth","count","Math","floor","BUTTON_WIDTH","debouncedMeasure","observer","ResizeObserver","observe","disconnect","slice","RenderLegend","data","visibleSeries","seriesColors","toggleSeries","_useResponsiveLegend","d","useGraphGlobalStyles","chartWithLegend","chartArea","flexGrow","minHeight","_templateObject","_taggedTemplateLiteralLoose","legendArea","_templateObject2","AreaChart","getPrimary","getSecondary","title","_ref$showDatalabels","showDatalabels","_ref$theme","theme","webLightTheme","_ref$stacked","stacked","_data$","setVisibleSeries","_useGraphUtils","lightenColor","getFluentPalette","createFluentTooltip","useMemo","reduce","acc","series","idx","base","allCategories","set","Set","forEach","add","Array","from","chartData","labels","datasets","filter","cat","match","find","fill","tension","pointRadius","_useMemo","fontFamily","fontFamilyBase","fontSize","parseInt","fontSizeBase200","replace","labelColor","gridColor","colorNeutralStroke2","options","responsive","maintainAspectRatio","plugins","text","font","family","weight","fontWeightSemibold","top","bottom","datalabels","legend","tooltip","scales","x","ticks","grid","y","Line","prev","next","concat","BarHorizontalChart","categorySet","datum","found","indexAxis","Bar","BubbleChart","getRadius","showDataLabels","r","colorNeutralStroke1","hoverBorderWidth","_data$2","type","Bubble","ComboChart","_ref$showDataLabels","sortedSeries","sort","a","b","_series$yAxisID","yAxisID","order","position","Chart","register","CategoryScale","LinearScale","PointElement","LineElement","Filler","Legend","ChartDataLabels","Title","ChartJS","BarElement","RenderValueLegend","entries","entry","value","DoughnutChart","getLabel","getValue","hiddenLabels","setHiddenLabels","valueMap","Map","get","allLabels","keys","palette","colors","_","i","_useMemo2","filteredLabels","values","visibleColors","indexOf","legendEntries","formatter","Doughnut","FloatingBarChart","getRange","borderRadius","LineChart","PieChart","Pie","ArcElement","RenderSliceLegend","PolarChart","backdropColor","PolarArea","RadarChart","pointBackgroundColor","angleLines","pointLabels","Radar","ScatterChart","getX","getY","useCallback","Scatter","StackedLineChart","SteamChart","_useState2","showPercent","setShowPercent","totalPerPoint","sum","index","rawValue","round","Number","EPSILON","animation","duration","easing","interaction","mode","intersect","callback","min","max","undefined","ToggleButton","p","RadialLinearScale","hex","amount","test","startsWith","g","toHex","v","toString","padStart","_theme","chartProps","chart","name","getChartComponent","fuiTheme","BarChart","_d$radius","radius","_series$type","secondaryAxisId","_d$min","_d$max","_datum$value","_datum$value2","Date","getTime","_d$value","_d$value2","Error","enabled","displayColors","boxWidth","boxHeight","boxPadding","colorNeutralBackground1","cornerRadius","titleColor","bodyColor","colorNeutralForeground2","titleFont","bodyFont","callbacks","context","_context$0$label","_context$","datasetLabel","dataset","raw","isArray","beforeTitle","afterTitle","beforeBody","afterBody","beforeLabel","afterLabel","labelTextColor","footer","beforeFooter","afterFooter","labelPointStyle","pointStyle","rotation","createAxisLabelFormatter","maxLength","_ref$maxLength","_ref$suffix","suffix","_ref$prefix","prefix","this","getLabelForValue","String","trimmed","fn","delay","timer","args","_len","_key","arguments","clearTimeout","setTimeout","apply","_this","y1","drawOnChartArea"],"mappings":"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"}
|