@bpfdev/oly-ui 1.0.10 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AddCommentInput/AddCommentInput.tsx","../src/components/AdvancedFiltersDialog/AdvancedFiltersDialog.tsx","../src/components/FalconMultiSelect/FalconMultiSelect.tsx","../src/components/ButtonWithIcon/ButtonWithIcon.tsx","../src/components/ChartWidgetInfoButton/ChartWidgetInfoButton.tsx","../src/components/utils/ChartWidgetHeaderSeparator/ChartWidgetHeaderSeparator.tsx","../src/components/utils/ChartEmptyState/ChartEmptyState.tsx","../src/components/WidgetHeaderFilter/WidgetHeaderFilter.tsx","../src/components/widgets/RankedBarList/RankedBarList.tsx","../src/components/filters/TimePeriodFilter/TimePeriodFilter.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownCustomizationContext.tsx","../src/components/QueueTimeBreakdown/queueTimeBreakdown.rechartsTooltip.ts","../src/components/QueueTimeBreakdown/queueTimeBreakdownCustomization.merge.ts","../src/components/tabs/ChartWidgetSegmentedTabs/ChartWidgetSegmentedTabs.tsx","../src/components/card/KpiStatCard/KpiStatCard.tsx","../src/components/card/KpiStatCard/useAnimatedMetric.ts","../src/components/FalconButton/FalconButton.tsx","../src/components/FalconAuditTimeline/FalconAuditTimeline.tsx","../src/components/FalconExportDialog/FalconExportDialog.tsx","../src/components/FalconExportReportDialog/FalconExportReportDialog.tsx","../src/components/FalconDIstrictFilter/FalconDIstrictFilter.tsx","../src/components/FalconStatBanner/FalconStatBanner.tsx","../src/components/FalconStatBanner/FalconStatBannerGroup.tsx","../src/components/FalconGrayButton/FalconGrayButton.tsx","../src/components/FalconPagination/FalconPagination.tsx","../src/components/FalconSelect/FalconSelect.tsx","../src/components/FalconSingleSwitch/FalconSingleSwitch.tsx","../src/components/FalconTable/FalconTable.tsx","../src/components/FalconTicketColumsFilter/FalconTicketColumsFilter.tsx","../src/components/FalconTicketFilter/FalconTicketFilter.tsx","../src/components/filters/timePeriodFilter.infoPopover.ts","../src/components/HeatMapChartLegend/HeatMapChartLegend.tsx","../src/components/ProgressBarNumber/ProgressBarNumber.tsx","../src/components/widgets/FootfallByAgeGroups/FootfallByAgeGroups.tsx","../src/components/_chart/resolveChartCardMaxWidth.ts","../src/components/widgets/FootfallByGender/FootfallByGender.tsx","../src/components/widgets/PasserbyConversion/PasserbyConversion.tsx","../src/components/_chart/useChartPlotScrollToEnd.ts","../src/components/widgets/WalkinAnalysis/WalkinAnalysis.tsx","../src/components/widgets/WalkinTraffic/WalkinTraffic.tsx","../src/components/BillingCounterAnalytics/billingCounterAnalytics.chartTokens.ts","../src/components/BillingCounterAnalytics/billingCounterAnalytics.defaultInfoPopover.ts","../src/components/BillingCounterAnalytics/billingCounterAnalytics.mock.ts","../src/components/BillingCounterAnalytics/BillingCounterAnalytics.tsx","../src/components/BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge.ts","../src/components/BillingCounterAnalytics/BillingCounterAnalyticsCustomizationContext.tsx","../src/components/BillingCounterAnalytics/BillingCounterAnalyticsTooltip.tsx","../src/components/QueueTimeBreakdown/queueTimeBreakdown.chartTokens.ts","../src/components/QueueTimeBreakdown/QueueTimeBreakdown.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdown.types.ts","../src/components/QueueTimeBreakdown/QueueTimeBreakdownArea.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownAreaTooltip.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownDonut.tsx","../src/components/QueueTimeBreakdown/QueueTimeBreakdownStackedBar.tsx","../src/components/QueueTimeBreakdown/queueTimeBreakdown.mock.ts","../src/components/widgets/FootFallHeatMap/FootFallHeatMapView.tsx","../src/components/widgets/FootFallHeatMap/FootFallHeatMapView.types.ts","../src/components/widgets/FootFallHeatMap/footfallHeatMapDerivedStrip.ts","../src/components/widgets/FootFallHeatMap/footfallHeatMapTree.ts","../src/components/widgets/FootFallHeatMap/ZoneWiseKpiCards.tsx","../src/components/widgets/PeakBillingHours/peakBillingHours.defaultInfoPopover.ts","../src/components/widgets/PeakBillingHours/peakBillingHours.mock.ts","../src/components/widgets/PeakBillingHours/PeakBillingHours.tsx","../src/components/widgets/PeakBillingHours/PeakBillingHoursCustomizationContext.tsx","../src/components/widgets/PeakBillingHours/PeakBillingHoursTooltip.tsx","../src/components/FalconThemeProvider/FalconThemeProvider.tsx"],"sourcesContent":["import { Button, InputAdornment, TextField } from '@mui/material';\nimport type { ChangeEvent } from 'react';\nimport type { AddCommentInputProps } from './AddCommentInput.types';\n\nexport const AddCommentInput = ({\n value,\n setValue,\n handleAddComment,\n placeholder = 'Write Comment here',\n buttonLabel = 'Add Comment',\n}: AddCommentInputProps) => {\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value);\n };\n\n return (\n <TextField\n label=\"\"\n fullWidth\n sx={{ width: '550px', maxWidth: '100%' }}\n value={value}\n placeholder={placeholder}\n onChange={handleChange}\n type=\"text\"\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <Button\n variant=\"contained\"\n sx={{\n background: '#000',\n color: '#fff',\n position: 'absolute',\n right: 0,\n top: 0,\n padding: '16px',\n cursor: 'pointer',\n borderRadius: '0 5px 5px 0',\n }}\n onClick={handleAddComment}\n onMouseDown={(e) => e.preventDefault()}\n >\n {buttonLabel}\n </Button>\n </InputAdornment>\n ),\n }}\n />\n );\n};\n","import { Close as CloseIcon } from '@mui/icons-material';\nimport {\n\tBox,\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogTitle,\n\tIconButton,\n\tTypography,\n} from '@mui/material';\nimport { FalconMultiSelect } from '../FalconMultiSelect';\nimport type { AdvancedFiltersDialogProps } from './AdvancedFiltersDialog.types';\n\nconst defaultLocationOptions = [\n\t{ id: 1, label: 'Location A' },\n\t{ id: 2, label: 'Location B' },\n];\n\nconst defaultBusinessAreaOptions = [\n\t{ id: 1, label: 'Retail' },\n\t{ id: 2, label: 'Healthcare' },\n];\n\nexport const AdvancedFiltersDialog = ({\n\topen,\n\tonClose,\n\tlocationOptions = defaultLocationOptions.map((option) => ({\n\t\tid: option.id,\n\t\tname: option.label,\n\t})),\n\tbusinessAreaOptions = defaultBusinessAreaOptions.map((option) => ({\n\t\tid: option.id,\n\t\tname: option.label,\n\t})),\n\tselectedLocations = [],\n\tselectedBusinessAreas = [],\n\tonLocationsChange = () => { },\n\tonBusinessAreasChange = () => { },\n\tonApply,\n\tonCancel,\n}: AdvancedFiltersDialogProps) => {\n\tconst handleApply = () => {\n\t\tonApply?.();\n\t\tonClose();\n\t};\n\n\tconst handleCancel = () => {\n\t\tonCancel?.();\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n\t\t\t<DialogTitle>\n\t\t\t\t<Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t<Typography variant=\"h6\">Advanced Filters</Typography>\n\t\t\t\t\t<IconButton onClick={onClose} size=\"small\" aria-label=\"Close\">\n\t\t\t\t\t\t<CloseIcon />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Box>\n\t\t\t</DialogTitle>\n\t\t\t<DialogContent>\n\t\t\t\t<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n\t\t\t\t\t<FalconMultiSelect\n\t\t\t\t\t\tlabel=\"Locations\"\n\t\t\t\t\t\tlist={locationOptions}\n\t\t\t\t\t\tdata={selectedLocations}\n\t\t\t\t\t\tsetData={onLocationsChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<FalconMultiSelect\n\t\t\t\t\t\tlabel=\"Business Areas\"\n\t\t\t\t\t\tlist={businessAreaOptions}\n\t\t\t\t\t\tdata={selectedBusinessAreas}\n\t\t\t\t\t\tsetData={onBusinessAreasChange}\n\t\t\t\t\t/>\n\t\t\t\t</Box>\n\t\t\t</DialogContent>\n\t\t\t<DialogActions>\n\t\t\t\t<Button onClick={handleCancel}>Cancel</Button>\n\t\t\t\t<Button variant=\"contained\" onClick={handleApply}>\n\t\t\t\t\tApply\n\t\t\t\t</Button>\n\t\t\t</DialogActions>\n\t\t</Dialog>\n\t);\n};\n","import { Icon } from '@iconify/react';\nimport { Stack, Typography } from '@mui/material';\nimport Autocomplete, {\n AutocompleteCloseReason,\n autocompleteClasses,\n} from '@mui/material/Autocomplete';\nimport Box from '@mui/material/Box';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport Checkbox from '@mui/material/Checkbox';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Popper from '@mui/material/Popper';\nimport TextField from '@mui/material/TextField';\nimport { styled } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n FalconMultiSelectOption,\n FalconMultiSelectProps,\n} from './FalconMultiSelect.types';\n\nexport const FalconMultiSelect = ({\n // core\n label,\n data,\n setData,\n list,\n // trigger\n triggerBg = '#EFEFEF',\n triggerColor,\n triggerMinWidth = 250,\n triggerBorderRadius = '6px',\n triggerSx,\n // popper panel\n popperWidth = 300,\n popperBorderColor = '#e1e4e8',\n popperBorderColorDark = '#30363d',\n popperBg = '#fff',\n popperBgDark = '#1c2128',\n popperColor = '#24292e',\n popperColorDark = '#c9d1d9',\n // options\n optionBorderColor = '#D6D6D6',\n optionHeight = 60,\n checkboxColor = 'green',\n checkboxCheckedColor = '#6750A4',\n // search\n searchLabel = 'Search State',\n searchIconColor = '#49454F',\n // buttons\n applyBg = '#333',\n applyColor = 'white',\n applyLabel = 'Apply',\n clearColor = 'black',\n clearLabel = 'Clear',\n}: FalconMultiSelectProps) => {\n const [checked, setChecked] = React.useState<FalconMultiSelectOption[]>(\n data ?? []\n );\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [pendingValue, setPendingValue] = React.useState<\n FalconMultiSelectOption[]\n >([]);\n\n const open = Boolean(anchorEl);\n const id = open ? 'falcon-multiselect' : undefined;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n setPendingValue(checked);\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n if (anchorEl) anchorEl.focus();\n setAnchorEl(null);\n };\n\n const handleApply = () => {\n setData(checked);\n handleClose();\n };\n\n const handleClear = () => {\n setChecked([]);\n setData([]);\n handleClose();\n };\n\n const handleToggle = (option: FalconMultiSelectOption) => {\n setChecked(prev => {\n const exists = prev.some(x => x.id === option.id);\n return exists ? prev.filter(x => x.id !== option.id) : [...prev, option];\n });\n };\n\n const triggerLabel =\n checked.length === 0\n ? `Filter by ${label}`\n : checked.length === 1\n ? checked[0].name\n : `${checked[0].name}, ${checked[1].name}${checked.length > 2 ? '…' : ''}`;\n\n return (\n <React.Fragment>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={2}\n onClick={handleClick}\n sx={{\n minWidth: triggerMinWidth,\n background: triggerBg,\n borderRadius: triggerBorderRadius,\n cursor: 'pointer',\n padding: '12px',\n ...(triggerColor ? { color: triggerColor } : {}),\n ...triggerSx,\n }}\n >\n <Typography\n variant=\"body2\"\n sx={triggerColor ? { color: triggerColor } : undefined}\n >\n {triggerLabel}\n </Typography>\n <Icon\n icon={open ? 'tabler:chevron-up' : 'tabler:chevron-down'}\n color={triggerColor}\n />\n </Stack>\n\n <StyledPopper\n id={id}\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n ownerState={{\n popperWidth,\n popperBorderColor,\n popperBorderColorDark,\n popperBg,\n popperBgDark,\n popperColor,\n popperColorDark,\n }}\n >\n <ClickAwayListener onClickAway={handleClose}>\n <div>\n <Autocomplete\n open\n multiple\n onClose={(\n _: React.SyntheticEvent,\n reason: AutocompleteCloseReason\n ) => {\n if (reason === 'escape') handleClose();\n }}\n value={pendingValue}\n onChange={(_, newValue) => setPendingValue(newValue)}\n disableCloseOnSelect\n slots={{ popper: PopperComponent }}\n noOptionsText=\"No labels\"\n options={list}\n getOptionLabel={option => option.name}\n isOptionEqualToValue={(option, val) => option.id === val.id}\n renderOption={(props, option) => (\n <li\n {...props}\n key={option.id}\n style={{\n height: optionHeight,\n border: `1px solid ${optionBorderColor}`,\n margin: '16px 12px',\n flexShrink: 0,\n borderRadius: 6,\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <Box\n sx={{\n flexGrow: 3,\n borderRadius: '3px',\n ml: 1,\n mt: '1px',\n justifyContent: 'start',\n alignItems: 'center',\n width: '80%',\n fontSize: '13px',\n }}\n >\n {option.name}\n </Box>\n <Box\n component=\"span\"\n sx={{\n flexShrink: 0,\n borderRadius: '3px',\n mr: 1,\n mt: '2px',\n flexGrow: 1,\n justifyContent: 'end',\n width: '20%',\n alignItems: 'center',\n }}\n >\n <Checkbox\n slotProps={{ input: { 'aria-label': option.name } }}\n checked={checked.some(x => x.id === option.id)}\n onChange={() => handleToggle(option)}\n sx={{\n color: checkboxColor,\n '&.Mui-checked': { color: checkboxCheckedColor },\n }}\n />\n </Box>\n </li>\n )}\n renderInput={params => (\n <Box\n sx={{\n position: 'relative',\n '& > :not(style)': { width: '100%' },\n }}\n >\n <TextField\n label={searchLabel}\n variant=\"filled\"\n sx={{\n width: '100%',\n margin: '10px',\n '& > :not(style)': { width: '94%' },\n }}\n ref={params.InputProps.ref}\n slotProps={{ htmlInput: params.inputProps }}\n />\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ position: 'absolute', left: 110, top: 30 }}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.76 13.27L20.49 19L19 20.49L13.27 14.76C12.2 15.53 10.91 16 9.5 16C5.91 16 3 13.09 3 9.5C3 5.91 5.91 3 9.5 3C13.09 3 16 5.91 16 9.5C16 10.91 15.53 12.2 14.76 13.27ZM9.5 5C7.01 5 5 7.01 5 9.5C5 11.99 7.01 14 9.5 14C11.99 14 14 11.99 14 9.5C14 7.01 11.99 5 9.5 5Z\"\n fill={searchIconColor}\n />\n </svg>\n </Box>\n )}\n />\n\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n m: '8px',\n height: 110,\n }}\n >\n <ActionButton\n onClick={handleApply}\n sx={{\n height: '42px',\n borderRadius: '3px',\n background: applyBg,\n margin: '5px 0 10px 0',\n color: applyColor,\n }}\n >\n {applyLabel}\n </ActionButton>\n <ActionButton\n onClick={handleClear}\n sx={{\n height: '42px',\n borderRadius: '3px',\n mb: '8px',\n color: clearColor,\n }}\n >\n {clearLabel}\n </ActionButton>\n </Box>\n </div>\n </ClickAwayListener>\n </StyledPopper>\n </React.Fragment>\n );\n};\n\n// ─── Internal types ──────────────────────────────────────────────────────────\n\ninterface PopperComponentProps {\n anchorEl?: unknown;\n disablePortal?: boolean;\n open: boolean;\n}\n\ninterface StyledPopperOwnerState {\n popperWidth: number | string;\n popperBorderColor: string;\n popperBorderColorDark: string;\n popperBg: string;\n popperBgDark: string;\n popperColor: string;\n popperColorDark: string;\n}\n\n// ─── Styled components ───────────────────────────────────────────────────────\n\nconst StyledAutocompletePopper = styled('div')(({ theme }) => ({\n [`& .${autocompleteClasses.paper}`]: {\n boxShadow: 'none',\n color: 'inherit',\n fontSize: 13,\n },\n [`& .${autocompleteClasses.listbox}`]: {\n backgroundColor: theme.palette.mode === 'light' ? '#fff' : '#1c2128',\n padding: 0,\n [`& .${autocompleteClasses.option}`]: {\n minHeight: 'auto',\n alignItems: 'flex-start',\n padding: 8,\n borderBottom: `1px solid ${theme.palette.mode === 'light' ? '#eaecef' : '#30363d'}`,\n '&[aria-selected=\"true\"]': { backgroundColor: 'transparent' },\n [`&.${autocompleteClasses.focused}, &.${autocompleteClasses.focused}[aria-selected=\"true\"]`]:\n {\n backgroundColor: theme.palette.action.hover,\n },\n },\n },\n [`&.${autocompleteClasses.popperDisablePortal}`]: { position: 'relative' },\n}));\n\nfunction PopperComponent({\n disablePortal: _d,\n anchorEl: _a,\n open: _o,\n ...other\n}: PopperComponentProps) {\n return <StyledAutocompletePopper {...other} />;\n}\n\nconst StyledPopper = styled(Popper, {\n shouldForwardProp: prop => prop !== 'ownerState',\n})<{ ownerState: StyledPopperOwnerState }>(({ theme, ownerState }) => ({\n border: `1px solid ${theme.palette.mode === 'light' ? ownerState.popperBorderColor : ownerState.popperBorderColorDark}`,\n boxShadow: `0 8px 24px ${theme.palette.mode === 'light' ? 'rgba(149, 157, 165, 0.2)' : 'rgb(1, 4, 9)'}`,\n borderRadius: 6,\n width: ownerState.popperWidth,\n zIndex: theme.zIndex.modal,\n fontSize: 13,\n color:\n theme.palette.mode === 'light'\n ? ownerState.popperColor\n : ownerState.popperColorDark,\n backgroundColor:\n theme.palette.mode === 'light'\n ? ownerState.popperBg\n : ownerState.popperBgDark,\n}));\n\nconst ActionButton = styled(ButtonBase)(() => ({\n fontSize: 13,\n width: '100%',\n textAlign: 'left',\n paddingBottom: 8,\n fontWeight: 600,\n '& span': { width: '100%' },\n '& svg': { width: 16, height: 16 },\n}));\n","import { Box, Button, Typography } from '@mui/material';\nimport type { ButtonWithIconProps } from './ButtonWithIcon.types';\n\nexport const ButtonWithIcon = ({\n size = 'large',\n variant = 'contained',\n children,\n icon,\n ...props\n}: ButtonWithIconProps) => (\n <Button\n fullWidth\n size={size}\n variant={variant}\n sx={{ minWidth: '200px', maxWidth: '250px', backgroundColor: 'white', color: 'black' }}\n {...props}\n >\n <Box display=\"flex\" gap={1} justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"inherit\">{children}</Typography>\n {icon && (\n <Box mt={0.25} ml={0.5}>\n {icon}\n </Box>\n )}\n </Box>\n </Button>\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport IconButton from '@mui/material/IconButton';\nimport Popper, { type PopperPlacementType } from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from './ChartWidgetInfoButton.types';\n\nconst defaultIconColor = '#6750A4';\nconst defaultTriggerBg = '#EFEFEF';\nconst defaultTriggerHoverBg = '#E5E5E5';\nconst defaultButtonSize = 30;\nconst defaultIconSize = 22;\nconst defaultPopoverWidth = 320;\nconst compactButtonSize = 22;\nconst compactIconSize = 15;\nconst compactPopoverWidth = 240;\nconst popperBorder = '#e1e4e8';\nconst popperBorderDark = '#30363d';\n\n/** Triangle + track sized from trigger so legend-sized buttons get a smaller, proportional caret. */\nfunction resolveCaretMetrics(triggerWidth: number): {\n caretInset: number;\n trackW: number;\n halfOuter: number;\n halfInner: number;\n triH: number;\n stripH: number;\n} {\n const compact = triggerWidth <= 26;\n const halfOuter = compact ? 6 : 9;\n const halfInner = halfOuter - 1;\n const triH = compact ? 7 : 10;\n const stripH = triH;\n const minTrack = halfOuter * 2 + 4;\n const trackW = Math.max(triggerWidth, minTrack);\n /** Inset of the caret track from the popper’s start/end edge that aligns with the anchor (see `caretHorizontalAxis`). */\n const caretInset = Math.max(0, (triggerWidth - trackW) / 2);\n return { caretInset, trackW, halfOuter, halfInner, triH, stripH };\n}\n\n/** Popper flips to `top-*` when there is no room below; caret must attach on the edge that faces the anchor. */\nfunction popoverCaretPointsDown(placement: PopperPlacementType): boolean {\n return placement.startsWith('top');\n}\n\n/**\n * Maps Popper placement to where the caret sits on the panel width.\n * `bottom-end` / `top-end` → anchor’s end edge; `*-start` → start edge; `top`/`bottom` → centered under anchor.\n */\nfunction caretHorizontalAxis(\n placement: PopperPlacementType\n): 'end' | 'start' | 'center' {\n if (placement === 'bottom' || placement === 'top') {\n return 'center';\n }\n if (placement.endsWith('-start')) {\n return 'start';\n }\n if (placement.endsWith('-end')) {\n return 'end';\n }\n /* `auto`, side placements: keep caret readable */\n if (placement.startsWith('left') || placement.startsWith('right')) {\n return 'center';\n }\n return 'end';\n}\n\nfunction PopoverCaret({\n metrics,\n border,\n paperBg,\n pointsDown,\n placement,\n}: {\n metrics: ReturnType<typeof resolveCaretMetrics>;\n border: string;\n paperBg: string;\n /** `true` when placement is `top-*` (panel above the button; arrow on bottom of panel). */\n pointsDown: boolean;\n placement: PopperPlacementType;\n}) {\n const { caretInset, trackW, halfOuter, halfInner, triH, stripH } = metrics;\n const horizontal = caretHorizontalAxis(placement);\n\n const trackPositionSx =\n horizontal === 'center'\n ? {\n insetInlineStart: '50%',\n marginInlineStart: `${-trackW / 2}px`,\n width: trackW,\n }\n : horizontal === 'start'\n ? { insetInlineStart: caretInset, width: trackW }\n : { insetInlineEnd: caretInset, width: trackW };\n\n return (\n <Box\n aria-hidden\n sx={{\n position: 'relative',\n zIndex: 3,\n height: stripH,\n width: '100%',\n flexShrink: 0,\n pointerEvents: 'none',\n }}\n >\n <Box\n sx={{\n position: 'absolute',\n ...trackPositionSx,\n ...(pointsDown ? { top: 0 } : { bottom: 0 }),\n height: stripH,\n zIndex: 2,\n ...(pointsDown\n ? {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n top: 0,\n transform: 'translateX(-50%)',\n borderLeft: `${halfOuter}px solid transparent`,\n borderRight: `${halfOuter}px solid transparent`,\n borderTop: `${triH}px solid ${border}`,\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n top: '-2px',\n transform: 'translateX(-50%)',\n borderLeft: `${halfInner}px solid transparent`,\n borderRight: `${halfInner}px solid transparent`,\n borderTop: `${triH}px solid ${paperBg}`,\n },\n }\n : {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n bottom: 0,\n transform: 'translateX(-50%)',\n borderLeft: `${halfOuter}px solid transparent`,\n borderRight: `${halfOuter}px solid transparent`,\n borderBottom: `${triH}px solid ${border}`,\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n bottom: '-2px',\n transform: 'translateX(-50%)',\n borderLeft: `${halfInner}px solid transparent`,\n borderRight: `${halfInner}px solid transparent`,\n borderBottom: `${triH}px solid ${paperBg}`,\n },\n }),\n }}\n />\n </Box>\n );\n}\n\nfunction InfoPopoverPanel({\n content,\n width,\n isDark,\n triggerWidth,\n placement,\n compact,\n}: {\n content: ChartWidgetInfoPopoverContent;\n width: number;\n isDark: boolean;\n /** Matches the anchor button width so the caret lines up with the icon center (right-aligned popper). */\n triggerWidth: number;\n /** Actual Popper placement (may flip when there is no space below). */\n placement: PopperPlacementType;\n /** Smaller padding and type scale (see `ChartWidgetInfoButton` `density=\"compact\"`). */\n compact: boolean;\n}) {\n const helpTitle = content.helpTitle ?? 'How does it help?';\n const border = isDark ? popperBorderDark : popperBorder;\n const paperBg = isDark ? '#1c2128' : '#fff';\n const textPrimary = isDark ? '#f0f6fc' : '#1a1a1a';\n const textSecondary = isDark ? '#8b949e' : '#424242';\n\n const panelShadow = isDark\n ? '0 10px 24px rgb(1, 4, 9)'\n : '0 10px 24px rgba(15, 23, 42, 0.14)';\n\n const metrics = resolveCaretMetrics(triggerWidth);\n const caretDown = popoverCaretPointsDown(placement);\n\n const titleFs = compact ? 13 : 16;\n const bodyFs = compact ? 12 : 14;\n const helpFs = compact ? 12 : 14;\n const stackSpacing = compact ? 1 : 1.75;\n const paperPadding = compact ? 1.5 : 2.25;\n\n const paper = (\n <Box\n sx={{\n position: 'relative',\n zIndex: 1,\n width: '100%',\n ...(caretDown ? { mb: '-2px' } : { mt: '-2px' }),\n border: `1px solid ${border}`,\n borderRadius: compact ? 1.5 : 2,\n bgcolor: paperBg,\n p: paperPadding,\n boxShadow: panelShadow,\n }}\n >\n <Stack spacing={stackSpacing} sx={{ position: 'relative', zIndex: 1 }}>\n <Typography\n component=\"h3\"\n sx={{\n fontWeight: 700,\n fontSize: titleFs,\n lineHeight: 1.35,\n color: textPrimary,\n }}\n >\n {content.title}\n </Typography>\n <Typography\n sx={{\n fontSize: bodyFs,\n lineHeight: 1.5,\n color: textSecondary,\n }}\n >\n {content.description}\n </Typography>\n <Typography\n sx={{\n fontWeight: 700,\n fontSize: helpFs,\n lineHeight: 1.35,\n color: textPrimary,\n pt: compact ? 0 : 0.25,\n }}\n >\n {helpTitle}\n </Typography>\n <Box\n component=\"ul\"\n sx={{\n m: 0,\n pl: compact ? 2 : 2.5,\n color: textSecondary,\n fontSize: bodyFs,\n lineHeight: 1.55,\n listStyleType: 'disc',\n listStylePosition: 'outside',\n '& li': {\n display: 'list-item',\n mb: compact ? 0.5 : 0.75,\n '&:last-of-type': { mb: 0 },\n },\n }}\n >\n {content.helpBullets.map(item => (\n <Typography\n key={item}\n component=\"li\"\n sx={{\n fontSize: bodyFs,\n lineHeight: 1.55,\n display: 'list-item',\n }}\n >\n {item}\n </Typography>\n ))}\n </Box>\n </Stack>\n </Box>\n );\n\n const caret = (\n <PopoverCaret\n metrics={metrics}\n border={border}\n paperBg={paperBg}\n pointsDown={caretDown}\n placement={placement}\n />\n );\n\n return (\n <Box sx={{ position: 'relative', width }}>\n {caretDown ? (\n <>\n {paper}\n {caret}\n </>\n ) : (\n <>\n {caret}\n {paper}\n </>\n )}\n </Box>\n );\n}\n\nconst hoverCloseDelayMs = 120;\n\nexport const ChartWidgetInfoButton = ({\n onClick,\n ariaLabel = 'More information',\n sx,\n iconColor = defaultIconColor,\n buttonBg = defaultTriggerBg,\n buttonHoverBg = defaultTriggerHoverBg,\n iconSize: iconSizeProp,\n buttonSize: buttonSizeProp,\n popover,\n popoverWidth: popoverWidthProp,\n density = 'default',\n}: ChartWidgetInfoButtonProps) => {\n const isCompact = density === 'compact';\n const buttonSize =\n buttonSizeProp ?? (isCompact ? compactButtonSize : defaultButtonSize);\n const iconSize =\n iconSizeProp ?? (isCompact ? compactIconSize : defaultIconSize);\n const popoverWidth =\n popoverWidthProp ?? (isCompact ? compactPopoverWidth : defaultPopoverWidth);\n const theme = useTheme();\n const isDark = theme.palette.mode === 'dark';\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const open = Boolean(anchorEl) && Boolean(popover);\n\n const clearCloseTimer = React.useCallback(() => {\n if (closeTimerRef.current !== null) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n React.useEffect(() => () => clearCloseTimer(), [clearCloseTimer]);\n\n const scheduleClose = React.useCallback(() => {\n clearCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setAnchorEl(null);\n closeTimerRef.current = null;\n }, hoverCloseDelayMs);\n }, [clearCloseTimer]);\n\n const handleButtonMouseEnter = (\n event: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!popover) return;\n clearCloseTimer();\n setAnchorEl(event.currentTarget);\n };\n\n const handleButtonMouseLeave = () => {\n if (!popover) return;\n scheduleClose();\n };\n\n const handlePopperMouseEnter = () => {\n clearCloseTimer();\n };\n\n const handlePopperMouseLeave = () => {\n scheduleClose();\n };\n\n const handleToggle = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.();\n if (!popover) return;\n clearCloseTimer();\n setAnchorEl(prev => (prev ? null : event.currentTarget));\n };\n\n const handleClose = () => {\n clearCloseTimer();\n setAnchorEl(null);\n };\n\n return (\n <Box sx={{ flexShrink: 0, position: 'relative', display: 'inline-flex' }}>\n <IconButton\n type=\"button\"\n size=\"small\"\n onClick={handleToggle}\n onMouseEnter={handleButtonMouseEnter}\n onMouseLeave={handleButtonMouseLeave}\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup={popover ? 'dialog' : undefined}\n sx={{\n flexShrink: 0,\n bgcolor: buttonBg,\n width: buttonSize,\n height: buttonSize,\n minWidth: buttonSize,\n p: 0,\n border: 'none',\n borderRadius: '50%',\n '&:hover': { bgcolor: buttonHoverBg },\n ...sx,\n }}\n >\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n lineHeight: 0,\n pointerEvents: 'none',\n }}\n >\n <Icon\n icon=\"bi:info\"\n width={iconSize}\n height={iconSize}\n color={iconColor}\n />\n </Box>\n </IconButton>\n\n {popover ? (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-end\"\n sx={{ zIndex: theme.zIndex.modal }}\n modifiers={[\n {\n name: 'offset',\n options: { offset: [0, 4] },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: [\n 'bottom-start',\n 'bottom',\n 'top-end',\n 'top-start',\n 'top',\n ],\n },\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 12,\n altAxis: true,\n },\n },\n ]}\n >\n {({ placement }) => (\n <ClickAwayListener onClickAway={handleClose}>\n <Box\n onMouseEnter={handlePopperMouseEnter}\n onMouseLeave={handlePopperMouseLeave}\n >\n <InfoPopoverPanel\n content={popover}\n width={popoverWidth}\n isDark={isDark}\n triggerWidth={buttonSize}\n placement={placement ?? 'bottom-end'}\n compact={isCompact}\n />\n </Box>\n </ClickAwayListener>\n )}\n </Popper>\n ) : null}\n </Box>\n );\n};\n","import Divider from '@mui/material/Divider';\n\nexport const ChartWidgetHeaderSeparator = () => (\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{\n alignSelf: 'center',\n borderColor: '#E0E0E0',\n height: 40,\n my: 0.5,\n }}\n />\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { ChartEmptyStateProps } from './ChartEmptyState.types';\n\nfunction mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) return undefined;\n if (flat.length === 1) return flat[0];\n return flat.flat() as SxProps<Theme>;\n}\n\n/**\n * A reusable empty state / placeholder component specifically for charts.\n */\nexport function ChartEmptyState({\n minHeight = 300,\n icon = 'mdi:chart-box-outline',\n iconSize = 40,\n iconColor = '#9CA3AF',\n title = 'No Data Available',\n subtitle = \"There's no data to display in this chart yet\",\n gap = 1,\n containerSx,\n titleSx,\n subtitleSx,\n titleWeight = 700,\n subtitleWeight = 400,\n direction = 'column',\n}: ChartEmptyStateProps): React.ReactElement {\n return (\n <Box\n sx={mergeSx(\n {\n display: 'flex',\n minHeight,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: direction,\n gap,\n },\n containerSx\n )}\n >\n {icon && (\n <Icon\n icon={icon}\n width={iconSize}\n height={iconSize}\n color={iconColor}\n />\n )}\n {title && (\n <Typography\n sx={mergeSx(\n {\n fontSize: '18px',\n fontWeight: titleWeight,\n color: '#374151',\n lineHeight: 1.2,\n textAlign: 'center',\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography\n sx={mergeSx(\n {\n fontSize: '14px',\n fontWeight: subtitleWeight,\n color: '#6B7280',\n textAlign: 'center',\n },\n subtitleSx\n )}\n >\n {subtitle}\n </Typography>\n )}\n </Box>\n );\n}\n\nexport default ChartEmptyState;\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { WidgetHeaderFilterProps } from './WidgetHeaderFilter.types';\n\nconst defaultTriggerBg = '#F3F3F3';\n/** Default trigger width (px). Override with **`triggerMinWidth`** for wider filters or dense layouts. */\nconst defaultTriggerMinWidth = 160;\nconst defaultTriggerBorderRadius = '10px';\n/** Fixed panel width when `popperMatchTrigger={false}` and `popperWidth` is omitted (Falcon multi-select default). */\nconst defaultFixedPopperWidth = 300;\n\n/** When `popperMatchTrigger` is true, the list matches the trigger width (see Popper modifiers below). */\nconst headerFilterPopperModifiersMatchTrigger: NonNullable<\n React.ComponentProps<typeof Popper>['modifiers']\n> = [\n { name: 'offset', options: { offset: [0, 2] } },\n {\n name: 'sameWidth',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn({ state }) {\n state.styles.popper.width = `${state.rects.reference.width}px`;\n },\n effect({ state }) {\n const { reference, popper } = state.elements;\n if (reference instanceof HTMLElement) {\n popper.style.width = `${reference.getBoundingClientRect().width}px`;\n }\n },\n },\n];\n\nconst headerFilterPopperModifiersOffsetOnly: NonNullable<\n React.ComponentProps<typeof Popper>['modifiers']\n> = [{ name: 'offset', options: { offset: [0, 2] } }];\n\ntype FilterOption = { id: number; name: string };\n\nfunction selectionSummary(selected: FilterOption[]): string {\n if (selected.length === 0) return 'All';\n if (selected.length === 1) return selected[0].name;\n return `${selected[0].name}, ${selected[1].name}${selected.length > 2 ? '…' : ''}`;\n}\n\nfunction multiSelectionSummary(selected: FilterOption[]): string {\n if (selected.length === 0) return 'All';\n if (selected.length === 1) return selected[0].name;\n return `${selected.length} Stores`;\n}\n\n/**\n * Widget header filter styled like the provided mock:\n * two-line trigger + simple dropdown list.\n */\nexport const WidgetHeaderFilter = ({\n label,\n list,\n groupedList,\n data,\n setData,\n triggerBg = defaultTriggerBg,\n triggerColor,\n triggerMinWidth = defaultTriggerMinWidth,\n triggerBorderRadius = defaultTriggerBorderRadius,\n triggerSx,\n popperMatchTrigger = true,\n popperWidth,\n popperSx,\n popperBorderColor = '#e1e4e8',\n popperBorderColorDark = '#30363d',\n popperBg = '#fff',\n popperBgDark = '#1c2128',\n popperColor = '#24292e',\n popperColorDark = '#c9d1d9',\n multiSelect = false,\n searchPlaceholder = 'Search',\n applyLabel = 'Apply',\n cancelLabel = 'Cancel',\n checkboxColor = '#5B5B69',\n checkboxCheckedColor = '#6750A4',\n groupHeaderBg = 'rgba(0,0,0,0.03)',\n groupHeaderColor = '#111827',\n groupHeaderFontSize = 14,\n optionTextColor = '#111827',\n searchIconColor = '#49454F',\n searchTextColor = '#111827',\n searchPlaceholderColor = '#6B7280',\n applyBg = '#6750A4',\n applyColor = '#FFFFFF',\n cancelBg = 'transparent',\n cancelColor = '#374151',\n cancelBorderColor = '#9CA3AF',\n triggerLabelSx,\n triggerValueSx,\n listItemSx,\n}: WidgetHeaderFilterProps) => {\n const theme = useTheme();\n const isDark = theme.palette.mode === 'dark';\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [draftSelection, setDraftSelection] =\n React.useState<FilterOption[]>(data);\n const [query, setQuery] = React.useState('');\n\n const open = Boolean(anchorEl);\n const matchTriggerWidth = multiSelect ? true : popperMatchTrigger;\n const fixedPopperWidth = popperWidth ?? defaultFixedPopperWidth;\n\n const valueLine = multiSelect\n ? multiSelectionSummary(data)\n : selectionSummary(data);\n const triggerTextColor = triggerColor ?? '#1a1a1a';\n const triggerChevronColor = triggerColor ?? '#101010';\n\n const handleOpen = (event: React.MouseEvent<HTMLElement>) => {\n if (multiSelect) {\n setDraftSelection(data);\n setQuery('');\n }\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSelect = (option: FilterOption) => {\n setData([option]);\n handleClose();\n };\n\n const toggleOption = (option: FilterOption) => {\n setDraftSelection(prev => {\n const exists = prev.some(item => item.id === option.id);\n return exists\n ? prev.filter(item => item.id !== option.id)\n : [...prev, option];\n });\n };\n\n const handleApply = () => {\n setData(draftSelection);\n handleClose();\n };\n\n const filteredList = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return list;\n return list.filter(option => option.name.toLowerCase().includes(q));\n }, [list, query]);\n\n const filteredGroupedList = React.useMemo(() => {\n if (!groupedList) return [];\n const q = query.trim().toLowerCase();\n return groupedList\n .map(group => ({\n title: group.title,\n options: q\n ? group.options.filter(option =>\n option.name.toLowerCase().includes(q)\n )\n : group.options,\n }))\n .filter(group => group.options.length > 0);\n }, [groupedList, query]);\n\n return (\n <Box sx={{ flexShrink: 0, position: 'relative' }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n spacing={1.5}\n onClick={handleOpen}\n sx={{\n minWidth: triggerMinWidth,\n background: triggerBg,\n borderRadius: triggerBorderRadius,\n cursor: 'pointer',\n px: multiSelect ? 1.25 : 1.75,\n py: multiSelect ? 0.5 : 0.65,\n border: '1px solid #D8D8E5',\n color: triggerTextColor,\n ...triggerSx,\n }}\n >\n <Stack spacing={0.125} sx={{ flex: 1, minWidth: 0, textAlign: 'left' }}>\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n fontWeight: 700,\n fontSize: multiSelect ? 12 : 13,\n lineHeight: 1.2,\n },\n ...(triggerLabelSx ? [triggerLabelSx] : []),\n ] as SxProps<Theme>\n }\n >\n {label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n fontWeight: 500,\n fontSize: multiSelect ? 13 : 14,\n lineHeight: 1.2,\n },\n ...(triggerValueSx ? [triggerValueSx] : []),\n ] as SxProps<Theme>\n }\n >\n {valueLine}\n </Typography>\n </Stack>\n <Icon\n icon={open ? 'tabler:chevron-up' : 'tabler:chevron-down'}\n width={multiSelect ? 16 : 18}\n height={multiSelect ? 16 : 18}\n color={triggerChevronColor}\n style={{ flexShrink: 0 }}\n />\n </Stack>\n\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n sx={{ zIndex: theme.zIndex.modal }}\n modifiers={\n matchTriggerWidth\n ? headerFilterPopperModifiersMatchTrigger\n : headerFilterPopperModifiersOffsetOnly\n }\n >\n <ClickAwayListener onClickAway={handleClose}>\n <Paper\n elevation={8}\n sx={{\n width: matchTriggerWidth ? '100%' : fixedPopperWidth,\n border: `1px solid ${isDark ? popperBorderColorDark : popperBorderColor}`,\n borderRadius: 1.5,\n bgcolor: isDark ? popperBgDark : popperBg,\n color: isDark ? popperColorDark : popperColor,\n overflow: 'hidden',\n boxShadow:\n theme.palette.mode === 'light'\n ? '0 10px 24px rgba(15, 23, 42, 0.14)'\n : '0 10px 24px rgb(1, 4, 9)',\n ...popperSx,\n }}\n >\n <List disablePadding>\n {multiSelect ? (\n <React.Fragment>\n <Box sx={{ px: 1.25, pt: 1.25, pb: 0.75 }}>\n <TextField\n fullWidth\n size=\"small\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n sx={{\n '& .MuiInputBase-input': {\n color: searchTextColor,\n },\n '& .MuiInputBase-input::placeholder': {\n color: searchPlaceholderColor,\n opacity: 1,\n },\n }}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <Icon\n icon=\"tabler:search\"\n width={18}\n height={18}\n color={searchIconColor}\n />\n </InputAdornment>\n ),\n },\n }}\n />\n </Box>\n <Box sx={{ maxHeight: 220, overflowY: 'auto' }}>\n {filteredGroupedList.length > 0\n ? filteredGroupedList.map(group => (\n <React.Fragment key={`group-${group.title}`}>\n <Box\n sx={{\n px: 1.25,\n py: 0.7,\n bgcolor: groupHeaderBg,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n }}\n >\n <Typography\n sx={{\n fontSize: groupHeaderFontSize,\n fontWeight: 700,\n color: groupHeaderColor,\n }}\n >\n {group.title}\n </Typography>\n </Box>\n {group.options.map(option => {\n const checked = draftSelection.some(\n item => item.id === option.id\n );\n return (\n <ListItemButton\n key={option.id}\n onClick={() => toggleOption(option)}\n dense\n sx={\n [\n {\n py: 0.45,\n px: 1.25,\n minHeight: 36,\n borderBottom:\n '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': {\n borderBottom: 'none',\n },\n '&:hover': {\n bgcolor: 'rgba(0,0,0,0.03)',\n },\n },\n ...(listItemSx ? [listItemSx] : []),\n ] as SxProps<Theme>\n }\n >\n <Checkbox\n checked={checked}\n disableRipple\n size=\"small\"\n sx={{\n mr: 0.75,\n color: checkboxColor,\n '&.Mui-checked': {\n color: checkboxCheckedColor,\n },\n }}\n />\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n lineHeight: 1.2,\n fontWeight: 500,\n color: optionTextColor,\n },\n }}\n />\n </ListItemButton>\n );\n })}\n </React.Fragment>\n ))\n : filteredList.map(option => {\n const checked = draftSelection.some(\n item => item.id === option.id\n );\n return (\n <ListItemButton\n key={option.id}\n onClick={() => toggleOption(option)}\n dense\n sx={\n [\n {\n py: 0.45,\n px: 1.25,\n minHeight: 36,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': { borderBottom: 'none' },\n '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' },\n },\n ...(listItemSx ? [listItemSx] : []),\n ] as SxProps<Theme>\n }\n >\n <Checkbox\n checked={checked}\n disableRipple\n size=\"small\"\n sx={{\n mr: 0.75,\n color: checkboxColor,\n '&.Mui-checked': {\n color: checkboxCheckedColor,\n },\n }}\n />\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n lineHeight: 1.2,\n fontWeight: 500,\n color: optionTextColor,\n },\n }}\n />\n </ListItemButton>\n );\n })}\n </Box>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ px: 1.25, py: 1, borderTop: '1px solid #E5E7EB' }}\n >\n <Button\n variant=\"outlined\"\n fullWidth\n onClick={handleClose}\n sx={{\n textTransform: 'none',\n fontWeight: 600,\n minHeight: 34,\n py: 0.4,\n bgcolor: cancelBg,\n color: cancelColor,\n borderColor: cancelBorderColor,\n '&:hover': {\n bgcolor: cancelBg,\n borderColor: cancelBorderColor,\n },\n }}\n >\n {cancelLabel}\n </Button>\n <Button\n variant=\"contained\"\n fullWidth\n onClick={handleApply}\n sx={{\n textTransform: 'none',\n fontWeight: 700,\n minHeight: 34,\n py: 0.4,\n bgcolor: applyBg,\n color: applyColor,\n '&:hover': { bgcolor: applyBg },\n }}\n >\n {applyLabel}\n </Button>\n </Stack>\n </React.Fragment>\n ) : (\n list.map(option => (\n <ListItemButton\n key={option.id}\n onClick={() => handleSelect(option)}\n dense\n sx={\n [\n {\n py: 0.75,\n px: 2,\n minHeight: 36,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': { borderBottom: 'none' },\n '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' },\n },\n ...(listItemSx ? [listItemSx] : []),\n ] as SxProps<Theme>\n }\n >\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1.3,\n },\n }}\n />\n </ListItemButton>\n ))\n )}\n </List>\n </Paper>\n </ClickAwayListener>\n </Popper>\n </Box>\n );\n};\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n RankedBarListItem,\n RankedBarListProps,\n RankedBarListSegment,\n RankedBarListSegmentTooltipRenderContext,\n} from './RankedBarList.types';\n\nconst defaultBarColor = '#8963F0';\nconst defaultTrackColor = '#E8E8E8';\n\nfunction defaultFormatSegmentTooltip(\n segment: RankedBarListSegment,\n _row: RankedBarListItem\n): string {\n return `${segment.label} : ${segment.value}`;\n}\n\n/** MUI Popper surface: no padding so the custom card controls layout. */\nconst segmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst defaultSegmentTooltipCardSx: SxProps<Theme> = {\n maxWidth: 280,\n bgcolor: '#fff',\n borderRadius: 1,\n border: '1px solid #E8E8E8',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n overflow: 'hidden',\n};\n\nfunction SegmentTooltipTitle({\n segment,\n row,\n formatSegmentTooltip,\n segmentTooltipSx,\n}: {\n segment: RankedBarListSegment;\n row: RankedBarListItem;\n formatSegmentTooltip: (\n segment: RankedBarListSegment,\n row: RankedBarListItem\n ) => string;\n segmentTooltipSx?: SxProps<Theme>;\n}): React.ReactElement {\n const customText = formatSegmentTooltip(segment, row);\n const defaultPattern = `${segment.label} : ${segment.value}`;\n const useStructured = customText === defaultPattern;\n\n const cardSx = segmentTooltipSx\n ? ([defaultSegmentTooltipCardSx, segmentTooltipSx] as SxProps<Theme>)\n : defaultSegmentTooltipCardSx;\n\n return (\n <Box sx={cardSx}>\n <Box sx={{ height: 3, bgcolor: 'grey.200', width: '100%' }} />\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 0.5,\n rowGap: 0.5,\n px: 1.5,\n py: 1.25,\n }}\n >\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: segment.color,\n flexShrink: 0,\n }}\n />\n {useStructured ? (\n <>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.label}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {' : '}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.value}\n </Typography>\n </>\n ) : (\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {customText}\n </Typography>\n )}\n </Box>\n </Box>\n );\n}\n\nfunction resolveCardMaxWidth(\n cardMaxWidth: RankedBarListProps['cardMaxWidth'],\n fullWidth: boolean | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (fullWidth) {\n return '100%';\n }\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return `${cardMaxWidth}px`;\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? `${cardMaxWidth.xs}px`\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? `${cardMaxWidth.sm}px`\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? `${cardMaxWidth.md}px`\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n\nfunction RankedBarRowTrack({\n pct,\n row,\n barColor,\n barTrackColor,\n barHeight,\n isBarWidthAnimationActive,\n formatSegmentTooltip,\n renderSegmentTooltip,\n segmentTooltipSx,\n}: {\n pct: number;\n row: RankedBarListItem;\n barColor: string;\n barTrackColor: string;\n barHeight: number;\n isBarWidthAnimationActive: boolean;\n formatSegmentTooltip: (\n segment: RankedBarListSegment,\n row: RankedBarListItem\n ) => string;\n renderSegmentTooltip?: RankedBarListProps['renderSegmentTooltip'];\n segmentTooltipSx?: SxProps<Theme>;\n}): React.ReactElement {\n const segments = row.segments;\n const segSum = segments?.reduce((acc, s) => acc + s.value, 0) ?? 0;\n const useStack = Boolean(segments?.length) && segSum > 0;\n\n const widthTransition = isBarWidthAnimationActive\n ? (theme: Theme) =>\n theme.transitions.create('width', {\n duration: theme.transitions.duration.shorter,\n })\n : 'none';\n\n /** Theme `borderRadius: 2` can exceed bar height and causes uneven corner clamping between slices. */\n const endCapRadius = `${Math.max(1, Math.floor(barHeight / 2))}px`;\n\n return (\n <Box\n sx={{\n height: barHeight,\n borderRadius: endCapRadius,\n bgcolor: barTrackColor,\n overflow: 'hidden',\n width: '100%',\n }}\n >\n {useStack && segments ? (\n <Box\n sx={{\n height: barHeight,\n width: `${pct}%`,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'stretch',\n alignContent: 'stretch',\n minWidth: 0,\n transition: widthTransition,\n }}\n >\n {segments.map((seg, i) => (\n <Tooltip\n key={seg.id}\n title={(() => {\n if (renderSegmentTooltip) {\n const custom = renderSegmentTooltip({\n segment: seg,\n row,\n } satisfies RankedBarListSegmentTooltipRenderContext);\n return custom == null ? '' : custom;\n }\n return (\n <SegmentTooltipTitle\n segment={seg}\n row={row}\n formatSegmentTooltip={formatSegmentTooltip}\n segmentTooltipSx={segmentTooltipSx}\n />\n );\n })()}\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: segmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n flexGrow: seg.value,\n flexShrink: 1,\n flexBasis: 0,\n minWidth: 2,\n height: barHeight,\n minHeight: barHeight,\n maxHeight: barHeight,\n boxSizing: 'border-box',\n lineHeight: 0,\n bgcolor: seg.color,\n cursor: 'default',\n ...(i === 0\n ? {\n borderTopLeftRadius: endCapRadius,\n borderBottomLeftRadius: endCapRadius,\n }\n : {}),\n ...(i === segments.length - 1\n ? {\n borderTopRightRadius: endCapRadius,\n borderBottomRightRadius: endCapRadius,\n }\n : {}),\n }}\n />\n </Tooltip>\n ))}\n </Box>\n ) : (\n <Box\n sx={{\n height: '100%',\n width: `${pct}%`,\n borderRadius: endCapRadius,\n bgcolor: barColor,\n transition: widthTransition,\n }}\n />\n )}\n </Box>\n );\n}\n\n/**\n * Ranked list widget: title row, optional header actions, scrollable list of labels with\n * horizontal bars sized by numeric value (highest value = full bar width).\n */\nexport const RankedBarList = ({\n title,\n items,\n sortByValueDescending = true,\n maxValue: maxValueProp,\n listHeaderLabel = 'Cameras (High to Low)',\n valueColumnHeader = 'No. of Alerts',\n showSortControl: showSortControlProp = true,\n onSortClick,\n headerActions,\n barColor = defaultBarColor,\n barTrackColor = defaultTrackColor,\n barHeight = 7,\n formatSegmentTooltip = defaultFormatSegmentTooltip,\n renderSegmentTooltip,\n segmentTooltipSx,\n listMaxHeight = 280,\n fullWidth,\n fillHeight,\n cardMaxWidth,\n cardSx,\n emptyStatePlaceholderProps,\n isBarWidthAnimationActive = true,\n scrollListToTopOnItemsChange = true,\n customization,\n}: RankedBarListProps) => {\n const showSortControl = customization?.showSortControl ?? showSortControlProp;\n\n const listScrollRef = React.useRef<HTMLDivElement>(null);\n\n const itemsSignature = React.useMemo(\n () =>\n items\n .map(i => {\n const seg =\n i.segments?.map(s => `${s.id}:${s.value}`).join('|') ?? '';\n return `${i.id}:${i.value}:${seg}`;\n })\n .join('\\0'),\n [items]\n );\n\n React.useLayoutEffect(() => {\n if (!scrollListToTopOnItemsChange) {\n return;\n }\n const el = listScrollRef.current;\n if (!el) {\n return;\n }\n el.scrollTop = 0;\n }, [itemsSignature, scrollListToTopOnItemsChange]);\n\n const rows = React.useMemo(() => {\n const copy = [...items];\n if (sortByValueDescending) {\n copy.sort((a, b) => b.value - a.value);\n }\n return copy;\n }, [items, sortByValueDescending]);\n\n const maxValue = React.useMemo(() => {\n if (maxValueProp !== undefined && maxValueProp > 0) {\n return maxValueProp;\n }\n const m = rows.reduce((acc, r) => Math.max(acc, r.value), 0);\n return m > 0 ? m : 1;\n }, [maxValueProp, rows]);\n\n return (\n <Box\n sx={{\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n minWidth: 0,\n maxWidth: resolveCardMaxWidth(cardMaxWidth, fullWidth),\n boxSizing: 'border-box',\n ...(fillHeight\n ? {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n }\n : {}),\n ...cardSx,\n }}\n >\n <Stack\n spacing={2}\n sx={\n fillHeight ? { flex: 1, minHeight: 0, overflow: 'hidden' } : undefined\n }\n >\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n sx={fillHeight ? { flexShrink: 0 } : undefined}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={\n [\n {\n fontWeight: 700,\n color: 'text.primary',\n pr: 1,\n fontSize: { xs: 16, sm: 18 },\n },\n ...(customization?.titleSx != null\n ? [customization.titleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0 }}>{headerActions}</Box>\n ) : null}\n </Stack>\n\n <Box\n sx={{\n border: '1px solid #E8E8E8',\n borderRadius: 2,\n bgcolor: '#FAFAFA',\n overflow: 'hidden',\n ...(fillHeight\n ? {\n flex: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n }\n : {}),\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{\n px: 2,\n py: 1.25,\n borderBottom: '1px solid rgba(0,0,0,0.08)',\n bgcolor: '#fff',\n flexShrink: 0,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 600, color: 'text.primary', fontSize: 13 },\n ...(customization?.listHeaderSx != null\n ? [customization.listHeaderSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {listHeaderLabel}\n </Typography>\n {showSortControl ? (\n <IconButton\n size=\"small\"\n aria-label=\"Sort\"\n onClick={onSortClick}\n sx={{ p: 0.35, color: 'text.secondary' }}\n >\n <Icon icon=\"tabler:arrows-sort\" width={18} height={18} />\n </IconButton>\n ) : null}\n </Stack>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 600, color: 'text.secondary', fontSize: 12 },\n ...(customization?.listHeaderSx != null\n ? [customization.listHeaderSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {valueColumnHeader}\n </Typography>\n </Stack>\n\n <Box\n ref={listScrollRef}\n sx={{\n ...(fillHeight\n ? {\n flex: 1,\n minHeight: 0,\n maxHeight: 'none',\n }\n : { maxHeight: listMaxHeight }),\n overflowY: 'auto',\n bgcolor: '#fff',\n }}\n >\n {rows.length === 0 ? (\n <ChartEmptyState\n minHeight={220}\n {...emptyStatePlaceholderProps}\n />\n ) : (\n rows.map((row, index) => {\n const pct = Math.min(\n 100,\n Math.max(0, (row.value / maxValue) * 100)\n );\n return (\n <Box\n key={row.id}\n sx={{\n px: 2,\n py: 1.5,\n borderBottom:\n index < rows.length - 1\n ? '1px solid rgba(0,0,0,0.06)'\n : 'none',\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{ mb: 0.75 }}\n >\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: 'text.primary',\n fontWeight: 500,\n fontSize: 14,\n },\n ...(customization?.rowTypographySx != null\n ? [customization.rowTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {row.label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: 'text.primary',\n fontWeight: 600,\n fontSize: 14,\n minWidth: 28,\n textAlign: 'right',\n },\n ...(customization?.valueTypographySx != null\n ? [customization.valueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {row.value}\n </Typography>\n </Stack>\n <RankedBarRowTrack\n pct={pct}\n row={row}\n barColor={barColor}\n barTrackColor={barTrackColor}\n barHeight={barHeight}\n isBarWidthAnimationActive={isBarWidthAnimationActive}\n formatSegmentTooltip={formatSegmentTooltip}\n renderSegmentTooltip={renderSegmentTooltip}\n segmentTooltipSx={segmentTooltipSx}\n />\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n </Stack>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from '../../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\nimport { useQueueTimeBreakdownCustomization } from '../../QueueTimeBreakdown/QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from '../../QueueTimeBreakdown/QueueTimeBreakdown.types';\nimport { mergeSx } from '../../QueueTimeBreakdown/queueTimeBreakdownCustomization.merge';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\n\nfunction mergeInfoButtonPresentation(\n fromTheme: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> | undefined,\n fromProps: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> | undefined\n): Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> {\n return {\n ...fromTheme,\n ...fromProps,\n sx: mergeSx(fromTheme?.sx, fromProps?.sx),\n };\n}\n\nexport type TimePeriodFilterProps = {\n selectedFilter: QueueTimeChartFilter;\n onFilterChange: React.Dispatch<React.SetStateAction<QueueTimeChartFilter>>;\n /**\n * Info popover beside D/W/M/Y. Pass **`ChartWidgetInfoPopoverContent`** to show separator +\n * **ChartWidgetInfoButton**. Omit or **`null`** hides them (no implicit copy). For standalone use,\n * prefer **`TIME_PERIOD_FILTER_INFO_POPOVER`** (neutral D/W/M/Y). **`TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN`**\n * is for **QueueTimeBreakdown** only — that card injects it when **`infoPopover`** is omitted; do not\n * use the breakdown preset on **TimePeriodFilter** outside that widget.\n */\n infoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Presentation for **ChartWidgetInfoButton** (ignored when **infoPopover** is omitted or **`null`**).\n * Overrides the same fields from **customization.periodFilter.infoButtonProps** when both are set.\n */\n infoButtonProps?: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>>;\n /** Overrides the same keys from **customization.periodFilter.rootSx** when both are set. */\n sx?: SxProps<Theme>;\n};\n\nconst PERIODS = ['Day', 'Week', 'Month', 'Year'] as const;\n\nfunction periodLetter(period: (typeof PERIODS)[number]): string {\n switch (period) {\n case 'Day':\n return 'D';\n case 'Week':\n return 'W';\n case 'Month':\n return 'M';\n case 'Year':\n return 'Y';\n default:\n return '';\n }\n}\n\n/**\n * Day / Week / Month / Year segmented control — square D/W/M/Y cells, optional info button.\n * Layout-neutral: no title or page-level alignment; wrap in your own **Stack** / **Box** or pass **sx**.\n *\n * Theme **customization.periodFilter** supports colours, **toggleGroupSx**, **toggleButtonSx**,\n * **infoStackSx**, and **infoButtonProps**; component **infoButtonProps** override theme **infoButtonProps** for overlapping keys.\n *\n * Source: **`packages/falcon-ui/src/components/filters/TimePeriodFilter/`** (see **`components/tabs/`** for a similar package layout).\n */\nexport function TimePeriodFilter({\n selectedFilter,\n onFilterChange,\n infoPopover,\n infoButtonProps,\n sx,\n}: TimePeriodFilterProps): React.ReactElement {\n const { periodFilter: pf } = useQueueTimeBreakdownCustomization();\n const SEGMENT_PX = pf?.segmentSizePx ?? 36;\n const borderRadius = pf?.borderRadiusPx ?? 8;\n const fontSize = pf?.fontSizePx ?? 13;\n const borderCol = pf?.borderColor ?? '#E5E7EB';\n const trackBg = pf?.trackBackground ?? '#F3F4F6';\n const dividerCol = pf?.dividerColor ?? borderCol;\n const inactiveColor = pf?.inactiveColor ?? '#0f172a';\n const activeBg = pf?.activeBackground ?? '#000000';\n const activeColor = pf?.activeColor ?? '#ffffff';\n const hoverBg = pf?.inactiveHoverBackground ?? 'rgba(15, 23, 42, 0.06)';\n\n const handleChange = (\n _event: React.MouseEvent<HTMLElement>,\n next: QueueTimeChartFilter | null\n ): void => {\n if (next !== null) {\n onFilterChange(next);\n }\n };\n\n const resolvedInfoPopover: ChartWidgetInfoPopoverContent | null =\n infoPopover ?? null;\n\n const mergedInfoButton = React.useMemo(\n () =>\n mergeInfoButtonPresentation(pf?.infoButtonProps, infoButtonProps ?? {}),\n [pf?.infoButtonProps, infoButtonProps]\n );\n\n return (\n <Box\n sx={mergeSx(\n {\n display: 'inline-flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 1.5,\n rowGap: 1,\n },\n pf?.rootSx,\n sx\n )}\n >\n <ToggleButtonGroup\n exclusive\n value={selectedFilter}\n onChange={handleChange}\n aria-label=\"Time period\"\n sx={mergeSx(\n {\n display: 'inline-flex',\n width: 'auto',\n border: `1px solid ${borderCol}`,\n borderRadius: `${borderRadius}px`,\n overflow: 'hidden',\n bgcolor: trackBg,\n '& .MuiToggleButtonGroup-grouped': {\n border: 0,\n borderRadius: 0,\n margin: 0,\n },\n '& .MuiToggleButton-root': {\n boxSizing: 'border-box',\n width: SEGMENT_PX,\n height: SEGMENT_PX,\n minWidth: SEGMENT_PX,\n maxWidth: SEGMENT_PX,\n px: 0,\n py: 0,\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 700,\n fontSize: `${fontSize}px`,\n lineHeight: 1,\n textTransform: 'none',\n color: inactiveColor,\n bgcolor: 'transparent',\n border: 'none',\n '&:not(:first-of-type)': {\n borderLeft: `1px solid ${dividerCol}`,\n },\n '&:hover': {\n bgcolor: hoverBg,\n },\n '&.Mui-selected': {\n bgcolor: activeBg,\n color: activeColor,\n '&:hover': {\n bgcolor: activeBg,\n },\n },\n },\n },\n pf?.toggleGroupSx\n )}\n >\n {PERIODS.map(period => (\n <ToggleButton\n key={period}\n value={period}\n disableRipple\n sx={mergeSx(pf?.toggleButtonSx)}\n >\n {periodLetter(period)}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n {resolvedInfoPopover ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={mergeSx({ flexShrink: 0 }, pf?.infoStackSx)}\n >\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n {...mergedInfoButton}\n popover={resolvedInfoPopover}\n ariaLabel={mergedInfoButton.ariaLabel ?? 'Time period information'}\n />\n </Stack>\n ) : null}\n </Box>\n );\n}\n","import * as React from 'react';\nimport type { QueueTimeBreakdownCustomization } from './queueTimeBreakdown.customization.types';\n\nconst QueueTimeBreakdownCustomizationContext =\n React.createContext<QueueTimeBreakdownCustomization>({});\n\nexport type QueueTimeBreakdownCustomizationProviderProps = {\n value: QueueTimeBreakdownCustomization;\n children: React.ReactNode;\n};\n\nexport function QueueTimeBreakdownCustomizationProvider({\n value,\n children,\n}: QueueTimeBreakdownCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <QueueTimeBreakdownCustomizationContext.Provider value={memo}>\n {children}\n </QueueTimeBreakdownCustomizationContext.Provider>\n );\n}\n\nexport function useQueueTimeBreakdownCustomization(): QueueTimeBreakdownCustomization {\n return React.useContext(QueueTimeBreakdownCustomizationContext);\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * Shared Recharts `<Tooltip />` look for QueueTimeBreakdown (donut / stacked bar):\n * light panel, rounded corners — matches dashboard light tooltip reference.\n */\nexport const queueRechartsTooltipContentStyle: CSSProperties = {\n backgroundColor: '#F4F4F5',\n border: '1px solid #E4E4E7',\n borderRadius: 8,\n padding: '8px 12px',\n fontSize: 12,\n lineHeight: 1.45,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.1)',\n};\n\nexport const queueRechartsTooltipItemStyle: CSSProperties = {\n color: '#3f3f46',\n fontSize: 12,\n padding: '4px 0',\n};\n\n/** Category line when Recharts renders a label (stacked bar / donut). */\nexport const queueRechartsTooltipLabelStyleCategory: CSSProperties = {\n color: '#71717A',\n fontSize: 12,\n fontWeight: 600,\n marginBottom: 8,\n paddingBottom: 8,\n borderBottom: '1px solid #D4D4D8',\n};\n\nexport const queueRechartsTooltipLabelStyleMuted: CSSProperties = {\n color: '#71717A',\n fontSize: 12,\n fontWeight: 600,\n};\n","import type { CSSProperties } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type {\n QueueTimeAreaTooltipTheme,\n QueueTimeRechartsTooltipTheme,\n} from './queueTimeBreakdown.customization.types';\nimport {\n queueRechartsTooltipContentStyle,\n queueRechartsTooltipItemStyle,\n queueRechartsTooltipLabelStyleMuted,\n} from './queueTimeBreakdown.rechartsTooltip';\n\nexport function mergeCss(a: CSSProperties, b?: CSSProperties): CSSProperties {\n if (!b) {\n return { ...a };\n }\n return { ...a, ...b };\n}\n\nexport function mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) {\n return undefined;\n }\n if (flat.length === 1) {\n return flat[0];\n }\n return flat.flat() as SxProps<Theme>;\n}\n\nexport function mergeRechartsTooltipStyles(\n overrides?: QueueTimeRechartsTooltipTheme\n): {\n contentStyle: CSSProperties;\n itemStyle: CSSProperties;\n labelStyle: CSSProperties;\n wrapperStyle: CSSProperties;\n} {\n return {\n contentStyle: mergeCss(\n queueRechartsTooltipContentStyle,\n overrides?.contentStyle\n ),\n itemStyle: mergeCss(queueRechartsTooltipItemStyle, overrides?.itemStyle),\n labelStyle: mergeCss(\n queueRechartsTooltipLabelStyleMuted,\n overrides?.labelStyle\n ),\n wrapperStyle: mergeCss({ outline: 'none' }, overrides?.wrapperStyle),\n };\n}\n\nconst defaultAreaTooltipBase: Required<QueueTimeAreaTooltipTheme> = {\n container: {\n background: '#F4F4F5',\n border: '1px solid #E4E4E7',\n borderRadius: 8,\n width: 'max-content',\n maxWidth: 220,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.1)',\n overflow: 'hidden',\n fontSize: 11,\n fontFamily: 'inherit',\n },\n header: {\n background: '#EBEBED',\n padding: '6px 8px',\n color: '#71717A',\n fontWeight: 600,\n borderBottom: '1px solid #D4D4D8',\n },\n body: { padding: '6px 8px' },\n row: {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '3px 0',\n whiteSpace: 'nowrap',\n },\n dot: {\n width: 7,\n height: 7,\n borderRadius: '50%',\n flexShrink: 0,\n },\n label: { color: '#71717A' },\n value: { fontWeight: 600, color: '#18181B' },\n};\n\nexport function mergeAreaTooltipStyles(\n overrides?: QueueTimeAreaTooltipTheme\n): Required<QueueTimeAreaTooltipTheme> {\n return {\n container: mergeCss(defaultAreaTooltipBase.container, overrides?.container),\n header: mergeCss(defaultAreaTooltipBase.header, overrides?.header),\n body: mergeCss(defaultAreaTooltipBase.body, overrides?.body),\n row: mergeCss(defaultAreaTooltipBase.row, overrides?.row),\n dot: mergeCss(defaultAreaTooltipBase.dot, overrides?.dot),\n label: mergeCss(defaultAreaTooltipBase.label, overrides?.label),\n value: mergeCss(defaultAreaTooltipBase.value, overrides?.value),\n };\n}\n","import Box from '@mui/material/Box';\nimport * as React from 'react';\nimport type { ChartWidgetSegmentedTabsProps } from './ChartWidgetSegmentedTabs.types';\n\ntype IndicatorRect = {\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\nconst defaultIndicator: IndicatorRect = {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n};\n\n/**\n * Pill-style segmented control for chart cards (e.g. Walk-in scope tabs, billing analytics).\n *\n * **Defaults** match the classic walk-in look: grey track, **white** selected pill, dark text, light shadow.\n * Override **`trackBackgroundColor`**, **`activeTabBackground`**, **`activeTabColor`**, **`inactiveTabColor`**, and\n * **`activeTabBoxShadow`** for other themes (e.g. violet selected pill + white text, **`activeTabBoxShadow: 'none'`**).\n *\n * Use **`tabLayout=\"equalWidth\"`** when the track is full width and each tab should grow to **fill** the bar;\n * default **`intrinsic`** keeps label-sized pills aligned to the **start** (walk-in style).\n *\n * The active segment uses a **sliding pill** (animated with **`tabIndicatorTransitionMs`**).\n */\nexport const ChartWidgetSegmentedTabs = ({\n tabs,\n activeTabId,\n onTabChange,\n ariaLabel = 'Scope',\n fullWidth = true,\n tabFontSize = 14,\n rootSx,\n trackBackgroundColor = '#ECECEC',\n activeTabBackground = '#fff',\n activeTabColor = '#2a2a2a',\n inactiveTabColor = '#2a2a2a',\n activeTabBoxShadow = '0 1px 2px rgba(0,0,0,0.08)',\n tabLayout = 'intrinsic',\n activeTabFontWeight = 700,\n inactiveTabFontWeight = 600,\n tabIndicatorTransitionMs = 260,\n}: ChartWidgetSegmentedTabsProps) => {\n const trackRef = React.useRef<HTMLDivElement>(null);\n const tabRefs = React.useRef<(HTMLDivElement | null)[]>([]);\n const [indicator, setIndicator] =\n React.useState<IndicatorRect>(defaultIndicator);\n\n const activeIndex = React.useMemo(() => {\n const i = tabs.findIndex(t => t.id === activeTabId);\n return i >= 0 ? i : 0;\n }, [tabs, activeTabId]);\n\n const updateIndicator = React.useCallback(() => {\n const track = trackRef.current;\n const tabEl = tabRefs.current[activeIndex];\n if (!track || !tabEl) {\n return;\n }\n const trackRect = track.getBoundingClientRect();\n const tabRect = tabEl.getBoundingClientRect();\n setIndicator({\n left: tabRect.left - trackRect.left,\n top: tabRect.top - trackRect.top,\n width: tabRect.width,\n height: tabRect.height,\n });\n }, [activeIndex]);\n\n React.useLayoutEffect(() => {\n updateIndicator();\n }, [updateIndicator, tabs, activeTabId, tabLayout, fullWidth]);\n\n React.useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) {\n return;\n }\n const ro = new ResizeObserver(() => {\n updateIndicator();\n });\n ro.observe(track);\n return () => {\n ro.disconnect();\n };\n }, [updateIndicator]);\n\n return (\n <Box\n ref={trackRef}\n sx={{\n position: 'relative',\n display: 'flex',\n p: 0.5,\n borderRadius: 999,\n bgcolor: trackBackgroundColor,\n gap: 0.5,\n flexWrap: tabLayout === 'equalWidth' ? 'nowrap' : 'wrap',\n boxSizing: 'border-box',\n ...(fullWidth\n ? { alignSelf: 'stretch', width: '100%' }\n : {\n alignSelf: 'flex-start',\n width: 'fit-content',\n maxWidth: '100%',\n }),\n ...rootSx,\n }}\n role=\"tablist\"\n aria-label={ariaLabel}\n >\n {indicator.width > 0 ? (\n <Box\n aria-hidden\n sx={{\n position: 'absolute',\n left: indicator.left,\n top: indicator.top,\n width: indicator.width,\n height: indicator.height,\n borderRadius: 999,\n bgcolor: activeTabBackground,\n boxShadow: activeTabBoxShadow,\n transition: `left ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), top ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), width ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), height ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n ) : null}\n {tabs.map((tab, index) => {\n const selected = tab.id === activeTabId;\n return (\n <Box\n key={tab.id}\n ref={(el: HTMLDivElement | null) => {\n tabRefs.current[index] = el;\n }}\n role=\"tab\"\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n onClick={() => onTabChange(tab.id)}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onTabChange(tab.id);\n }\n }}\n sx={{\n position: 'relative',\n zIndex: 1,\n px: 2.25,\n py: 0.85,\n borderRadius: 999,\n cursor: 'pointer',\n userSelect: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n bgcolor: 'transparent',\n fontWeight: selected\n ? activeTabFontWeight\n : inactiveTabFontWeight,\n fontSize: tabFontSize,\n color: selected ? activeTabColor : inactiveTabColor,\n transition: theme =>\n theme.transitions.create(['color'], {\n duration: theme.transitions.duration.shorter,\n }),\n ...(tabLayout === 'equalWidth'\n ? {\n flex: '1 1 0',\n minWidth: 0,\n }\n : {}),\n }}\n >\n {tabLayout === 'equalWidth' ? (\n <Box\n component=\"span\"\n sx={{\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n width: '100%',\n }}\n >\n {tab.label}\n </Box>\n ) : (\n tab.label\n )}\n </Box>\n );\n })}\n </Box>\n );\n};\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport type { TypographyProps } from '@mui/material/Typography';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport type { KpiStatCardProps } from './KpiStatCard.types';\nimport { useAnimatedMetric } from './useAnimatedMetric';\n\nconst defaultInlineIconSize = 48;\n/** Decorative icon inside the detailed card badge (px). */\nconst defaultDetailedIconSize = 30;\n/** Width/height of the top-right icon backdrop (px). */\nconst defaultIconBackdropSize = 48;\nconst defaultIconColor = '#5c6bc0';\n\n/** @default when `metricColor` omitted */\nconst defaultMetricColor = '#000000';\n\n/** Detailed card defaults (px). */\nconst defaultCardWidthPx = 247;\nconst defaultCardPaddingPx = 12;\nconst defaultBlockGapPx = 8;\nconst defaultInlineCardMinHeightPx = 96;\nconst defaultDetailedCardMinHeightPx = 118;\n\n/** Row trend defaults (px). */\nconst defaultRowTrendFontSizePx = 12;\nconst defaultRowTrendIconSizePx = 16;\n\nfunction formatValue(value: string | number): string {\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n return value;\n}\n\ntype KpiMetricValueDisplayProps = {\n value: string | number;\n metricColor: string;\n animateValue: boolean;\n valueAnimationDurationMs: number;\n valueAnimationUseGrouping: boolean;\n valueAnimationLocale?: string;\n layout: 'inline' | 'detailed';\n valueTypographySx?: SxProps<Theme>;\n};\n\nfunction KpiMetricValueDisplay({\n value,\n metricColor,\n animateValue,\n valueAnimationDurationMs,\n valueAnimationUseGrouping,\n valueAnimationLocale,\n layout,\n valueTypographySx,\n}: KpiMetricValueDisplayProps) {\n const isNumeric = typeof value === 'number' && Number.isFinite(value);\n const animated = useAnimatedMetric(\n isNumeric ? value : 0,\n isNumeric && animateValue,\n valueAnimationDurationMs\n );\n\n const displayText =\n isNumeric && animateValue\n ? Math.round(animated).toLocaleString(valueAnimationLocale, {\n useGrouping: valueAnimationUseGrouping,\n })\n : formatValue(value);\n\n const tooltipText = formatValue(value);\n\n if (layout === 'inline') {\n return (\n <OverflowTooltipTypography\n tooltip={tooltipText}\n variant=\"h5\"\n fontWeight={700}\n lineHeight={1.2}\n sx={\n [\n { color: metricColor, width: '100%' },\n ...(valueTypographySx != null ? [valueTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {displayText}\n </OverflowTooltipTypography>\n );\n }\n\n return (\n <OverflowTooltipTypography\n tooltip={tooltipText}\n variant=\"h4\"\n fontWeight={700}\n sx={\n [\n {\n color: metricColor,\n fontSize: { xs: 26, sm: 30 },\n minWidth: 0,\n flex: '0 1 auto',\n },\n ...(valueTypographySx != null ? [valueTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {displayText}\n </OverflowTooltipTypography>\n );\n}\n\ntype OverflowTooltipTypographyProps = TypographyProps & { tooltip: string };\n\n/**\n * Shows {@link Tooltip} with full text only when the line is truncated (ellipsis).\n */\nfunction OverflowTooltipTypography({\n tooltip,\n ...typographyProps\n}: OverflowTooltipTypographyProps) {\n const ref = useRef<HTMLElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) {\n return;\n }\n const update = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth + 0.5);\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => {\n ro.disconnect();\n };\n }, [tooltip, typographyProps.children]);\n\n return (\n <Tooltip\n title={tooltip}\n disableHoverListener={!isTruncated}\n placement=\"top-start\"\n enterDelay={400}\n >\n <Typography ref={ref} noWrap {...typographyProps} />\n </Tooltip>\n );\n}\n\nexport const KpiStatCard = (props: KpiStatCardProps) => {\n const {\n title,\n value,\n icon,\n iconColor = defaultIconColor,\n sx,\n customization,\n } = props;\n const displayValue = value ?? '-';\n const labelTypographySx = customization?.labelTypographySx;\n const valueTypographySx = customization?.valueTypographySx;\n const trendComparisonTypographySx =\n customization?.trendComparisonTypographySx;\n const stackedComparisonTypographySx =\n customization?.stackedComparisonTypographySx;\n const metricColor = props.metricColor ?? defaultMetricColor;\n const animateValue = props.animateValue ?? true;\n const valueAnimationDurationMs = props.valueAnimationDurationMs ?? 1000;\n const valueAnimationUseGrouping = props.valueAnimationUseGrouping ?? true;\n const { valueAnimationLocale } = props;\n const iconSize =\n props.iconSize ??\n (props.variant === 'inline'\n ? defaultInlineIconSize\n : defaultDetailedIconSize);\n\n if (props.variant === 'inline') {\n const { cardMinHeightPx = defaultInlineCardMinHeightPx, cardMaxHeightPx } =\n props;\n return (\n <Paper\n elevation={0}\n sx={{\n p: 2,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 2,\n minHeight: cardMinHeightPx,\n ...(cardMaxHeightPx != null\n ? { maxHeight: cardMaxHeightPx, overflow: 'auto' as const }\n : {}),\n ...sx,\n }}\n >\n <Box\n sx={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Icon\n icon={icon}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n />\n </Box>\n <Stack\n spacing={0.5}\n alignItems=\"flex-start\"\n justifyContent=\"center\"\n sx={{ flex: 1, minWidth: 0 }}\n >\n <OverflowTooltipTypography\n tooltip={title}\n variant=\"subtitle2\"\n fontWeight={700}\n color=\"text.primary\"\n sx={\n [\n { width: '100%' },\n ...(labelTypographySx != null ? [labelTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </OverflowTooltipTypography>\n <KpiMetricValueDisplay\n value={displayValue}\n metricColor={metricColor}\n animateValue={animateValue}\n valueAnimationDurationMs={valueAnimationDurationMs}\n valueAnimationUseGrouping={valueAnimationUseGrouping}\n valueAnimationLocale={valueAnimationLocale}\n layout=\"inline\"\n valueTypographySx={valueTypographySx}\n />\n </Stack>\n </Paper>\n );\n }\n\n const {\n trend,\n infoPopover,\n infoPlacement = 'value',\n iconBackdropColor = '#EDE7F6',\n iconBackdropShape = 'rounded',\n trendColor,\n titleColor = 'text.secondary',\n cardWidthPx = defaultCardWidthPx,\n cardPaddingPx = defaultCardPaddingPx,\n blockGapPx = defaultBlockGapPx,\n cardMinHeightPx = defaultDetailedCardMinHeightPx,\n cardMaxHeightPx,\n iconBackdropSizePx = defaultIconBackdropSize,\n rowTrendFontSizePx = defaultRowTrendFontSizePx,\n rowTrendIconSizePx = defaultRowTrendIconSizePx,\n rowTrendComparisonColor,\n } = props;\n\n const resolvedTrendColor =\n trendColor ?? (trend?.direction === 'down' ? '#d32f2f' : '#2e7d32');\n const trendLayout = trend?.layout ?? 'row';\n const stackedHighlightColor = trend?.comparisonColor ?? '#5E35B1';\n const stackedPrefixColor = trend?.comparisonPrefixColor ?? 'text.secondary';\n const rowComparisonColor = rowTrendComparisonColor ?? 'text.secondary';\n\n const trendPercentLabel = trend?.percentLabel ?? '0%';\n const trendComparisonText = trend?.comparisonText ?? 'vs yesterday';\n const trendDirection = trend?.direction;\n\n const stackedSplit =\n trendLayout === 'stacked' &&\n typeof trend?.comparisonPrefix === 'string' &&\n trend?.comparisonPrefix.length > 0 &&\n typeof trend?.comparisonHighlight === 'string' &&\n trend?.comparisonHighlight.length > 0;\n\n const infoButton = infoPopover ? (\n <ChartWidgetInfoButton\n density=\"compact\"\n popover={infoPopover}\n ariaLabel={`${title} more information`}\n sx={{ flexShrink: 0 }}\n />\n ) : null;\n\n return (\n <Paper\n elevation={0}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n boxSizing: 'border-box',\n width: cardWidthPx,\n maxWidth: '100%',\n p: `${cardPaddingPx}px`,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n boxShadow: '0 1px 3px rgba(0,0,0,0.06)',\n position: 'relative',\n overflow: cardMaxHeightPx != null ? 'auto' : 'hidden',\n minHeight: cardMinHeightPx,\n ...(cardMaxHeightPx != null ? { maxHeight: cardMaxHeightPx } : {}),\n ...sx,\n }}\n >\n <Stack\n spacing={`${blockGapPx}px`}\n alignItems=\"stretch\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n {props.slotHeader ? (\n <Box sx={{ width: '100%' }}>{props.slotHeader}</Box>\n ) : null}\n\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Stack\n spacing={`${blockGapPx}px`}\n alignItems=\"flex-start\"\n sx={{ flex: 1, minWidth: 0, pr: 7 }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n useFlexGap\n sx={{ minWidth: 0, alignSelf: 'stretch', maxWidth: '100%' }}\n >\n <OverflowTooltipTypography\n tooltip={title}\n variant=\"body2\"\n fontWeight={600}\n sx={\n [\n {\n color: titleColor,\n minWidth: 0,\n flex: '0 1 auto',\n },\n ...(labelTypographySx != null ? [labelTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </OverflowTooltipTypography>\n {infoPlacement === 'title' ? infoButton : null}\n </Stack>\n\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n useFlexGap\n sx={{ minWidth: 0, alignSelf: 'stretch', maxWidth: '100%' }}\n >\n <KpiMetricValueDisplay\n value={displayValue}\n metricColor={metricColor}\n animateValue={animateValue}\n valueAnimationDurationMs={valueAnimationDurationMs}\n valueAnimationUseGrouping={valueAnimationUseGrouping}\n valueAnimationLocale={valueAnimationLocale}\n layout=\"detailed\"\n valueTypographySx={valueTypographySx}\n />\n {infoPlacement === 'value' ? infoButton : null}\n </Stack>\n\n {trendLayout === 'stacked' ? (\n stackedSplit ? (\n <Typography\n variant=\"body2\"\n component=\"div\"\n sx={\n [\n {\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Typography\n component=\"span\"\n variant=\"body2\"\n sx={\n [\n { fontWeight: 400, color: stackedPrefixColor },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonPrefix}\n </Typography>\n <Typography\n component=\"span\"\n variant=\"body2\"\n sx={\n [\n { fontWeight: 400, color: stackedHighlightColor },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonHighlight}\n </Typography>\n </Typography>\n ) : typeof trend.comparisonText === 'string' ? (\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: trend.comparisonColor ?? 'text.secondary',\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonText}\n </Typography>\n ) : trend.comparisonText != null ? (\n <Box\n sx={\n [\n {\n typography: 'body2',\n color: trend.comparisonColor ?? 'text.secondary',\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n '& strong': { fontWeight: 600 },\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonText}\n </Box>\n ) : null\n ) : (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n flexWrap=\"nowrap\"\n useFlexGap\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Typography\n component=\"span\"\n fontWeight={600}\n sx={{\n color: resolvedTrendColor,\n flexShrink: 0,\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n }}\n >\n {trendPercentLabel}\n </Typography>\n {trendDirection && (\n <Box sx={{ flexShrink: 0, lineHeight: 0, display: 'flex' }}>\n <Icon\n icon={\n trendDirection === 'down'\n ? 'mdi:trending-down'\n : 'mdi:trending-up'\n }\n width={rowTrendIconSizePx}\n height={rowTrendIconSizePx}\n style={{ color: resolvedTrendColor }}\n />\n </Box>\n )}\n {typeof trendComparisonText === 'string' ? (\n <OverflowTooltipTypography\n tooltip={trendComparisonText}\n component=\"span\"\n fontWeight={700}\n sx={\n [\n {\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n color: rowComparisonColor,\n minWidth: 0,\n flex: '1 1 auto',\n },\n ...(trendComparisonTypographySx != null\n ? [trendComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trendComparisonText}\n </OverflowTooltipTypography>\n ) : (\n <Box\n sx={\n [\n {\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n fontWeight: 700,\n color: rowComparisonColor,\n minWidth: 0,\n flex: '1 1 auto',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n '& strong': {\n fontWeight: 700,\n color: rowComparisonColor,\n fontSize: 'inherit',\n },\n },\n ...(trendComparisonTypographySx != null\n ? [trendComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trendComparisonText}\n </Box>\n )}\n </Stack>\n )}\n </Stack>\n </Stack>\n </Stack>\n\n <Box\n sx={{\n position: 'absolute',\n top: cardPaddingPx,\n right: cardPaddingPx,\n width: iconBackdropSizePx,\n height: iconBackdropSizePx,\n borderRadius: iconBackdropShape === 'round' ? '50%' : 2,\n bgcolor: iconBackdropColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n zIndex: 1,\n }}\n >\n <Icon\n icon={icon}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n />\n </Box>\n </Paper>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * Ease-out cubic for a natural deceleration (similar to many count-up UIs).\n */\nfunction easeOutCubic(t: number): number {\n return 1 - (1 - t) ** 3;\n}\n\n/**\n * Animates a numeric metric when `target` changes. First paint uses `target` with no tween\n * (avoids flashing from 0 on mount). Opt out with `enabled: false`.\n */\nexport function useAnimatedMetric(\n target: number,\n enabled: boolean,\n durationMs: number\n): number {\n const [display, setDisplay] = useState(target);\n const displayRef = useRef(target);\n const didMountRef = useRef(false);\n const rafRef = useRef(0);\n\n useEffect(() => {\n const cancelRaf = () => {\n if (rafRef.current !== 0) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = 0;\n }\n };\n\n if (!enabled || !Number.isFinite(target)) {\n cancelRaf();\n displayRef.current = target;\n setDisplay(target);\n return;\n }\n\n if (!didMountRef.current) {\n didMountRef.current = true;\n displayRef.current = target;\n setDisplay(target);\n return;\n }\n\n const from = displayRef.current;\n if (from === target) {\n return;\n }\n\n cancelRaf();\n const start = performance.now();\n let cancelled = false;\n\n const step = (now: number) => {\n if (cancelled) {\n return;\n }\n const elapsed = now - start;\n const t = Math.min(1, elapsed / durationMs);\n const eased = easeOutCubic(t);\n const next = from + (target - from) * eased;\n displayRef.current = next;\n setDisplay(next);\n if (t < 1) {\n rafRef.current = requestAnimationFrame(step);\n } else {\n displayRef.current = target;\n setDisplay(target);\n rafRef.current = 0;\n }\n };\n\n rafRef.current = requestAnimationFrame(step);\n\n return () => {\n cancelled = true;\n cancelRaf();\n };\n }, [target, enabled, durationMs]);\n\n return display;\n}\n","import { Button as MuiButton, CircularProgress } from '@mui/material';\nimport type { FalconButtonProps } from './FalconButton.types';\n\nexport const FalconButton = ({\n loading = false,\n disabled,\n children,\n size = 'large',\n variant = 'contained',\n type = 'submit',\n fullWidth = true,\n className = 'falcon-btn',\n ...props\n}: FalconButtonProps) => (\n <MuiButton\n disabled={disabled || loading}\n size={size}\n variant={variant}\n type={type}\n fullWidth={fullWidth}\n className={className}\n {...props}\n >\n {loading ? <CircularProgress size={16} color=\"inherit\" /> : children}\n </MuiButton>\n);\n","import { Icon } from '@iconify/react';\nimport { Box, Card, Typography, IconButton } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport React, { useMemo, useState } from 'react';\n\nimport {\n AuditRunItem,\n FalconAuditTimelineProps,\n MonthData,\n} from './FalconAuditTimeline.types';\n\nconst defaultMonths: MonthData[] = [\n { label: 'Jan', count: 0 },\n { label: 'Feb', count: 0 },\n { label: 'Mar', count: 2 },\n { label: 'Apr', count: 2 },\n { label: 'May', count: 2 },\n { label: 'Jun', count: 2 },\n { label: 'Jul', count: 2 },\n { label: 'Aug', count: 2 },\n { label: 'Sep', count: 2 },\n { label: 'Oct', count: 2 },\n { label: 'Nov', count: 2 },\n { label: 'Dec', count: 2 },\n];\n\n/** Stable string key that uniquely identifies a month bucket. */\nconst getMonthKey = (m: MonthData) =>\n m.year !== undefined ? `${m.label}-${m.year}` : m.label;\n\nconst getOrdinalStr = (n: number) => {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n return n + (s[(v - 20) % 10] || s[v] || s[0]);\n};\n\nconst RenderIcon = ({\n icon,\n defaultIcon,\n style,\n}: {\n icon?: string | React.ReactNode;\n defaultIcon: string;\n style?: React.CSSProperties;\n}) => {\n if (!icon) return <Icon icon={defaultIcon} style={style} />;\n if (typeof icon === 'string') return <Icon icon={icon} style={style} />;\n return <>{icon}</>;\n};\n\nconst MonthButton: React.FC<{\n month: MonthData;\n isSelected: boolean;\n onClick: () => void;\n brandFont: string;\n primaryColor: string;\n inactiveMonthBg: string;\n monthFontSize: string;\n monthFontWeight: string | number;\n calendarIcon?: string | React.ReactNode;\n}> = ({\n month,\n isSelected,\n onClick,\n brandFont,\n primaryColor,\n inactiveMonthBg,\n monthFontSize,\n monthFontWeight,\n calendarIcon,\n}) => (\n <Box\n onClick={onClick}\n sx={{\n minWidth: '89px !important',\n height: '29.5px !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n gap: '6px !important',\n borderRadius: '10px !important',\n padding: '0px 12px !important',\n background: isSelected\n ? `${primaryColor} !important`\n : `${inactiveMonthBg} !important`,\n cursor: 'pointer !important',\n boxSizing: 'border-box !important',\n flexShrink: 0,\n transition: 'all 0.2s ease',\n }}\n >\n <RenderIcon\n icon={calendarIcon}\n defaultIcon=\"tabler:calendar\"\n style={{\n width: '14px',\n height: '14px',\n color: isSelected ? '#FFFFFF' : '#6B7280',\n }}\n />\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${monthFontWeight} !important`,\n fontSize: `${monthFontSize} !important`,\n lineHeight: '16.5px !important',\n letterSpacing: '0.06px !important',\n color: isSelected ? '#FFFFFF !important' : '#6B7280 !important',\n whiteSpace: 'nowrap',\n }}\n >\n {month.label}\n </Typography>\n <Box\n sx={{\n width: '19px !important',\n height: '18px !important',\n borderRadius: '4px !important',\n background: isSelected\n ? 'rgba(255, 255, 255, 0.2) !important'\n : '#FFFFFF !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n }}\n >\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${monthFontWeight} !important`,\n fontSize: '10px !important',\n lineHeight: '100% !important',\n letterSpacing: '0.17px !important',\n color: isSelected ? '#FFFFFF !important' : '#6B7280 !important',\n }}\n >\n {month.count}\n </Typography>\n </Box>\n </Box>\n);\n\nconst TimelineEventCard: React.FC<{\n date: string;\n ordinal: string;\n status: 'completed' | 'upcoming';\n onClick?: () => void;\n onExportClick?: (e: React.MouseEvent) => void;\n brandFont: string;\n interFont: string;\n completedColor: string;\n upcomingColor: string;\n eventCardBg: string;\n eventDateSize: string;\n eventDateWeight: string | number;\n ordinalSize: string;\n ordinalWeight: string | number;\n exportIcon?: string | React.ReactNode;\n exportButtonText?: string;\n upcomingButtonText?: string;\n}> = ({\n date,\n ordinal,\n status,\n onClick,\n onExportClick,\n brandFont,\n interFont,\n completedColor,\n upcomingColor,\n eventCardBg,\n eventDateSize,\n eventDateWeight,\n ordinalSize,\n ordinalWeight,\n exportIcon,\n exportButtonText = 'Export Report',\n upcomingButtonText = 'Upcoming',\n}) => (\n <Box\n onClick={onClick}\n sx={{\n width: '130px !important',\n height: '67px !important',\n display: 'flex !important',\n flexDirection: 'column !important',\n justifyContent: 'space-between !important',\n gap: '6px !important',\n borderRadius: '10px !important',\n border: '1px solid #E5E7EB !important',\n background: `${eventCardBg} !important`,\n padding: '8px 10px !important',\n boxSizing: 'border-box !important',\n flexShrink: 0,\n }}\n >\n <Box\n sx={{\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'space-between !important',\n width: '100% !important',\n }}\n >\n <Box\n sx={{\n display: 'flex !important',\n alignItems: 'center !important',\n gap: '6px !important',\n }}\n >\n <Box\n sx={{\n width: '8px !important',\n height: '8px !important',\n borderRadius: '50% !important',\n background:\n status === 'completed'\n ? `${completedColor} !important`\n : `${upcomingColor} !important`,\n }}\n />\n <Typography\n sx={{\n fontFamily: `${interFont} !important`,\n fontWeight: `${eventDateWeight} !important`,\n fontSize: `${eventDateSize} !important`,\n lineHeight: '16.5px !important',\n color: '#0A0A0A !important',\n }}\n >\n {date}\n </Typography>\n </Box>\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${ordinalWeight} !important`,\n fontSize: `${ordinalSize} !important`,\n lineHeight: '13.5px !important',\n letterSpacing: '0.17px !important',\n color: '#6B7280 !important',\n }}\n >\n {ordinal}\n </Typography>\n </Box>\n {status === 'completed' ? (\n <Box\n onClick={e => {\n if (onExportClick) {\n e.stopPropagation();\n onExportClick(e);\n }\n }}\n sx={{\n width: '100% !important',\n height: '28px !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n gap: '4px !important',\n borderRadius: '6px !important',\n border: '1px solid #D1D5DC !important',\n background: '#FFFFFF !important',\n padding: '4px 6px !important',\n boxSizing: 'border-box !important',\n cursor: 'pointer !important',\n }}\n >\n <RenderIcon\n icon={exportIcon}\n defaultIcon=\"tabler:upload\"\n style={{ width: '14px', height: '14px', color: '#222222' }}\n />\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '600 !important',\n fontSize: '10px !important',\n lineHeight: '20px !important',\n color: '#222222 !important',\n whiteSpace: 'nowrap',\n }}\n >\n {exportButtonText}\n </Typography>\n </Box>\n ) : (\n <Box\n sx={{\n width: '100% !important',\n height: '28px !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n borderRadius: '6px !important',\n border: '1px solid #EFEFEF !important',\n background: '#EFEFEF !important',\n padding: '4px 6px !important',\n boxSizing: 'border-box !important',\n }}\n >\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '600 !important',\n fontSize: '10px !important',\n lineHeight: '20px !important',\n color: '#222222 !important',\n whiteSpace: 'nowrap',\n }}\n >\n {upcomingButtonText}\n </Typography>\n </Box>\n )}\n </Box>\n);\n\nexport const FalconAuditTimeline: React.FC<FalconAuditTimelineProps> = ({\n title = 'Audit Timeline',\n months = defaultMonths,\n auditRuns,\n initialSelectedMonth = 'Mar',\n initialSelectedYear,\n onMonthChange,\n year = 2026,\n onPrevYearClick,\n onNextYearClick,\n onExportReportClick,\n emptyStateMessage = 'No Audit Scheduled',\n exportButtonText = 'Export Report',\n upcomingButtonText = 'Upcoming',\n showTitle = true,\n showYearSelector = true,\n brandFont = '\"Neue Haas Grotesk Display Pro\", Arial, sans-serif',\n interFont = '\"Inter\", Arial, sans-serif',\n headerFontSize = '20px',\n headerFontWeight = '700',\n headerColor = '#101828',\n monthFontSize = '12px',\n monthFontWeight = '600',\n eventDateSize = '11px',\n eventDateWeight = '700',\n borderRadius = '14px',\n borderWidth = '1px',\n borderColor = '#E5E7EB',\n boxShadow = 'none',\n primaryColor = '#5B21B6',\n completedColor = '#00A63E',\n upcomingColor = '#D08700',\n inactiveMonthBg = '#F3F4F6',\n eventCardBg = '#F9FAFB',\n calendarIcon,\n chevronLeftIcon,\n chevronRightIcon,\n exportIcon,\n eventsMaxHeight = '280px',\n cardMaxWidth = '1324px',\n hideScrollbar = false,\n scrollbarWidth = '6px',\n scrollbarThumbColor = '#D1D5DB',\n scrollbarTrackColor = 'transparent',\n timeControlsRowSx,\n}) => {\n const getInitialKey = () => {\n if (initialSelectedYear !== undefined) {\n const match = months.find(\n m => m.label === initialSelectedMonth && m.year === initialSelectedYear\n );\n if (match) return getMonthKey(match);\n }\n const match = months.find(m => m.label === initialSelectedMonth);\n return match\n ? getMonthKey(match)\n : getMonthKey(months[0] ?? { label: initialSelectedMonth, count: 0 });\n };\n\n const [selectedKey, setSelectedKey] = useState<string>(getInitialKey);\n\n const activeMonth = months.find(m => getMonthKey(m) === selectedKey);\n\n const handleMonthChange = (m: MonthData) => {\n const key = getMonthKey(m);\n setSelectedKey(key);\n if (onMonthChange) {\n onMonthChange(m.label, m.year);\n }\n };\n\n // Year shown in the selector: prefer the selected month's year, fall back to prop\n const displayYear = activeMonth?.year ?? year;\n\n // Audit runs for the active month\n const activeRuns: AuditRunItem[] = useMemo(() => {\n if (!auditRuns || !activeMonth) return [];\n return auditRuns.filter(\n r =>\n r.month === activeMonth.label &&\n (activeMonth.year === undefined ||\n r.year === undefined ||\n r.year === activeMonth.year)\n );\n }, [auditRuns, activeMonth]);\n\n const isZeroCount = activeMonth && activeMonth.count === 0;\n\n const renderEventCards = () => {\n if (!activeMonth || activeMonth.count === 0) {\n return (\n <Box\n sx={{\n width: '100% !important',\n maxWidth: '1292px !important',\n height: '49px !important',\n borderRadius: '10px !important',\n border: '1px solid #E5E7EB !important',\n background: `${eventCardBg} !important`,\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n padding: '8px 14px !important',\n gap: '6px !important',\n boxSizing: 'border-box !important',\n }}\n >\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '600 !important',\n fontSize: '11px !important',\n lineHeight: '13.5px !important',\n letterSpacing: '0.17px !important',\n color: '#6B7280 !important',\n }}\n >\n {emptyStateMessage}\n </Typography>\n </Box>\n );\n }\n\n // Render from real auditRuns when available\n if (auditRuns) {\n if (activeRuns.length === 0) {\n return (\n <Box\n sx={{\n width: '100% !important',\n maxWidth: '1292px !important',\n height: '49px !important',\n borderRadius: '10px !important',\n border: '1px solid #E5E7EB !important',\n background: `${eventCardBg} !important`,\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n padding: '8px 14px !important',\n boxSizing: 'border-box !important',\n }}\n >\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '600 !important',\n fontSize: '11px !important',\n lineHeight: '13.5px !important',\n letterSpacing: '0.17px !important',\n color: '#6B7280 !important',\n }}\n >\n {emptyStateMessage}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Box\n sx={{\n display: 'flex !important',\n alignItems: 'flex-start !important',\n gap: '8px !important',\n width: '100% !important',\n flexWrap: 'wrap',\n overflowY: 'auto',\n maxHeight: eventsMaxHeight,\n paddingRight: hideScrollbar ? 0 : '4px',\n scrollbarWidth: hideScrollbar ? 'none' : 'auto',\n '&::-webkit-scrollbar': {\n width: hideScrollbar ? 0 : scrollbarWidth,\n display: hideScrollbar ? 'none' : undefined,\n },\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: scrollbarThumbColor,\n borderRadius: '999px',\n },\n '&::-webkit-scrollbar-track': {\n backgroundColor: scrollbarTrackColor,\n },\n }}\n >\n {activeRuns.map((run, idx) => (\n <TimelineEventCard\n key={run.run_number}\n date={run.date}\n ordinal={run.label ?? getOrdinalStr(idx + 1)}\n status={run.status === 'done' ? 'completed' : 'upcoming'}\n onExportClick={\n onExportReportClick\n ? e => onExportReportClick(e, run.date)\n : undefined\n }\n brandFont={brandFont}\n interFont={interFont}\n completedColor={completedColor}\n upcomingColor={upcomingColor}\n eventCardBg={eventCardBg}\n eventDateSize={eventDateSize}\n eventDateWeight={eventDateWeight}\n ordinalSize=\"9px\"\n ordinalWeight=\"500\"\n exportIcon={exportIcon}\n exportButtonText={exportButtonText}\n upcomingButtonText={upcomingButtonText}\n />\n ))}\n </Box>\n );\n }\n\n // Legacy fallback: hardcoded two cards per month\n const monthIndex = months.findIndex(m => getMonthKey(m) === selectedKey);\n const precedingEvents = Math.max(0, monthIndex - 2) * 2;\n const isFirstActiveMonth =\n monthIndex === months.findIndex(m => m.count > 0);\n\n return (\n <Box\n sx={{\n display: 'flex !important',\n alignItems: 'center !important',\n gap: '8px !important',\n width: '100% !important',\n }}\n >\n <TimelineEventCard\n date={`${activeMonth.label} 5`}\n ordinal={getOrdinalStr(precedingEvents + 1)}\n status={isFirstActiveMonth ? 'completed' : 'upcoming'}\n onExportClick={\n onExportReportClick\n ? e => onExportReportClick(e, `${activeMonth.label} 5`)\n : undefined\n }\n brandFont={brandFont}\n interFont={interFont}\n completedColor={completedColor}\n upcomingColor={upcomingColor}\n eventCardBg={eventCardBg}\n eventDateSize={eventDateSize}\n eventDateWeight={eventDateWeight}\n ordinalSize=\"9px\"\n ordinalWeight=\"500\"\n exportIcon={exportIcon}\n exportButtonText={exportButtonText}\n upcomingButtonText={upcomingButtonText}\n />\n <TimelineEventCard\n date={`${activeMonth.label} 20`}\n ordinal={getOrdinalStr(precedingEvents + 2)}\n status=\"upcoming\"\n brandFont={brandFont}\n interFont={interFont}\n completedColor={completedColor}\n upcomingColor={upcomingColor}\n eventCardBg={eventCardBg}\n eventDateSize={eventDateSize}\n eventDateWeight={eventDateWeight}\n ordinalSize=\"9px\"\n ordinalWeight=\"500\"\n exportIcon={exportIcon}\n exportButtonText={exportButtonText}\n upcomingButtonText={upcomingButtonText}\n />\n </Box>\n );\n };\n\n return (\n <Card\n sx={{\n width: '100% !important',\n maxWidth: `${cardMaxWidth} !important`,\n height: 'auto !important',\n minHeight: isZeroCount ? '166px !important' : '200px !important',\n padding: '16px !important',\n borderRadius: `${borderRadius} !important`,\n border: `${borderWidth} solid ${borderColor} !important`,\n background: '#FFFFFF !important',\n display: 'flex !important',\n flexDirection: 'column !important',\n gap: '14px !important',\n boxShadow: `${boxShadow} !important`,\n boxSizing: 'border-box !important',\n }}\n >\n {showTitle && (\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${headerFontWeight} !important`,\n fontSize: `${headerFontSize} !important`,\n lineHeight: '27px !important',\n color: `${headerColor} !important`,\n }}\n >\n {title}\n </Typography>\n )}\n\n <Box\n sx={\n [\n {\n display: 'flex !important',\n alignItems: 'center !important',\n gap: '8px !important',\n overflowX: 'auto',\n overflowY: 'hidden',\n paddingBottom: '2px',\n },\n ...(timeControlsRowSx ? [timeControlsRowSx] : []),\n ] as SxProps<Theme>\n }\n >\n {showYearSelector && (\n <Box\n sx={{\n minWidth: '124px !important',\n height: '29px !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'space-between !important',\n borderRadius: '100px !important',\n background: `${primaryColor}14 !important`,\n padding: '0px 8px !important',\n boxSizing: 'border-box !important',\n flexShrink: 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={onPrevYearClick}\n sx={{ padding: '2px !important' }}\n >\n <RenderIcon\n icon={chevronLeftIcon}\n defaultIcon=\"tabler:chevron-left\"\n style={{ fontSize: '14px', color: '#0A0A0A' }}\n />\n </IconButton>\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '700 !important',\n fontSize: '11px !important',\n lineHeight: '16.5px !important',\n letterSpacing: '0.06px !important',\n color: '#0A0A0A !important',\n whiteSpace: 'nowrap',\n }}\n >\n Year {displayYear}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={onNextYearClick}\n sx={{ padding: '2px !important' }}\n >\n <RenderIcon\n icon={chevronRightIcon}\n defaultIcon=\"tabler:chevron-right\"\n style={{ fontSize: '14px', color: '#0A0A0A' }}\n />\n </IconButton>\n </Box>\n )}\n\n {months.map(month => (\n <MonthButton\n key={getMonthKey(month)}\n month={month}\n isSelected={getMonthKey(month) === selectedKey}\n onClick={() => handleMonthChange(month)}\n brandFont={brandFont}\n primaryColor={primaryColor}\n inactiveMonthBg={inactiveMonthBg}\n monthFontSize={monthFontSize}\n monthFontWeight={monthFontWeight}\n calendarIcon={calendarIcon}\n />\n ))}\n </Box>\n\n {renderEventCards()}\n </Card>\n );\n};\n","import React, { useState } from 'react';\nimport {\n Box,\n Button,\n Checkbox,\n FormControlLabel,\n Typography,\n styled,\n Paper,\n Stack,\n Popover,\n} from '@mui/material';\nimport { Icon } from '@iconify/react';\nimport { FalconExportDialogProps } from './FalconExportDialog.types';\n\n// STYLED COMPONENTS\nconst RootPaper = styled(Paper)(() => ({\n width: 600,\n minHeight: 'auto',\n height: 'auto',\n borderRadius: 16,\n padding: '30px',\n background: '#FFFFFF',\n display: 'flex',\n flexDirection: 'column',\n boxSizing: 'border-box',\n boxShadow: '0px 4px 10px rgba(0, 0, 0, 0.05)',\n justifyContent: 'flex-start',\n alignItems: 'initial',\n}));\n\nconst Title = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '30px !important',\n lineHeight: '100%',\n color: '#000000',\n textAlign: 'center',\n letterSpacing: '0%',\n marginBottom: 0,\n}));\n\nconst DateBox = styled(Box)(() => ({\n width: 259,\n height: 54,\n borderRadius: 6,\n background: '#FFFFFF',\n border: '1px solid #D6D6D6',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: '0 14px',\n boxSizing: 'border-box',\n position: 'relative',\n}));\n\nconst DateLabel = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '100%',\n color: '#8F90A6',\n letterSpacing: '0.5px',\n marginBottom: 4,\n}));\n\nconst DateValue = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '100%',\n color: '#555770',\n letterSpacing: '0.5px',\n}));\n\nconst CheckboxLabel = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '20px',\n color: '#000000',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n}));\n\nconst CloseButton = styled(Button)(() => ({\n width: 124,\n height: 42,\n borderRadius: 8,\n background: '#E0E0E0 !important',\n color: '#333333 !important',\n fontFamily: 'Roboto',\n fontWeight: '600 !important',\n fontSize: '14px !important',\n lineHeight: '20px',\n textTransform: 'none',\n padding: '10px 24px',\n boxShadow: 'none !important',\n '&:hover': {\n background: '#E0E0E0 !important',\n boxShadow: 'none !important',\n },\n}));\n\nconst ExportMainButton = styled(Button)(() => ({\n width: 402,\n height: 42,\n borderRadius: 8,\n background: '#401070 !important',\n color: '#FFFFFF !important',\n fontFamily: 'Roboto',\n fontWeight: '600 !important',\n fontSize: '14px !important',\n lineHeight: '20px',\n textTransform: 'none',\n padding: '4px 40px',\n boxShadow: 'none !important',\n '&:hover': {\n background: '#401070 !important',\n boxShadow: 'none !important',\n },\n}));\n\n// DATE PICKER STYLED COMPONENTS\nconst PickerPaper = styled(Paper)(() => ({\n width: 316.5,\n borderRadius: 5,\n padding: 24,\n background: '#FFFFFF',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0px 8px 30px rgba(0, 0, 0, 0.1)',\n boxSizing: 'border-box',\n}));\n\nconst PickerHeader = styled(Box)(() => ({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 20,\n}));\n\nconst HeaderText = styled(Typography)(() => ({\n fontFamily: '\"Neue Haas Grotesk Display Pro\", sans-serif',\n fontWeight: 700,\n fontSize: '14px',\n lineHeight: '18.36px',\n color: '#1B1B1B',\n}));\n\nconst DayLabel = styled(Typography)(() => ({\n fontFamily: '\"Neue Haas Grotesk Display Pro\", sans-serif',\n fontWeight: 600,\n fontSize: '14px',\n lineHeight: '18.36px',\n color: '#6C6C6C',\n textAlign: 'center',\n width: '100%',\n}));\n\nconst DateCell = styled(Box, {\n shouldForwardProp: prop => prop !== 'isCurrentMonth' && prop !== 'isSelected',\n})<{ isCurrentMonth?: boolean; isSelected?: boolean }>(\n ({ isCurrentMonth, isSelected }) => ({\n fontFamily: '\"Neue Haas Grotesk Display Pro\", sans-serif',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18.36px',\n color: isSelected ? '#FFFFFF' : isCurrentMonth ? '#1B1B1B' : '#C6C6C6',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n cursor: 'pointer',\n borderRadius: '50%',\n backgroundColor: isSelected ? '#401070' : 'transparent',\n '&:hover': {\n backgroundColor: isSelected ? '#401070' : '#F5F5F5',\n },\n })\n);\n\nconst PickerCancelButton = styled(Button)(() => ({\n textTransform: 'none',\n borderRadius: 4,\n height: 32,\n width: 80,\n padding: '6px 0',\n fontSize: '12px',\n fontWeight: 600,\n boxShadow: 'none !important',\n}));\n\nconst PickerApplyButton = styled(Button)(() => ({\n textTransform: 'none',\n borderRadius: 4,\n height: 32,\n width: 80,\n padding: '6px 0',\n fontSize: '12px',\n fontWeight: 600,\n boxShadow: 'none !important',\n}));\n\n// COMPONENT IMPLEMENTATION\nexport const FalconExportDialog: React.FC<FalconExportDialogProps> = ({\n title = 'Export Report',\n fromDateTitle = 'From',\n fromDateValue: initialFromDate = '',\n toDateTitle = 'To',\n toDateValue: initialToDate = '',\n onClose,\n onExport,\n exportButtonText = 'Export',\n closeButtonText = 'Close',\n initialExportCsv = true,\n initialExportPdf = false,\n calendarIcon = 'solar:calendar-bold',\n primaryColor = '#401070',\n secondaryColor = '#DFDFE0',\n titleColor = '#000000',\n brandFont = '\"Neue Haas Grotesk Display Pro\", Arial, sans-serif',\n robotoFont = '\"Roboto\", Arial, sans-serif',\n titleFontSize = '30px',\n titleFontWeight = 600,\n labelFontSize = '14px',\n labelFontWeight = 600,\n valueFontSize = '14px',\n valueFontWeight = 600,\n borderRadius = 16,\n boxShadow = '0px 4px 10px rgba(0, 0, 0, 0.05)',\n exportButtonWidth = 402,\n exportButtonHeight = 42,\n closeButtonWidth = 124,\n closeButtonHeight = 42,\n dateBoxWidth = 259,\n dateBoxHeight = 44,\n exportCsvText = 'Export CSV',\n exportPdfText = 'Export PDF',\n calendarPrimaryColor,\n calendarSelectedTextColor = '#FFFFFF',\n calendarBackgroundColor = '#FFFFFF',\n calendarHeaderColor = '#000000',\n calendarDayLabelColor = '#A5A5A5',\n calendarDateColor = '#0A0A0A',\n checkboxColor,\n exportButtonHoverBg,\n closeButtonHoverBg,\n calendarApplyButtonBg,\n calendarApplyButtonHoverBg,\n calendarCancelButtonBg = '#F3F4F6',\n calendarCancelButtonHoverBg = '#E5E7EB',\n}) => {\n const [exportCsv, setExportCsv] = useState(initialExportCsv);\n const [exportPdf, setExportPdf] = useState(initialExportPdf);\n\n const activePrimaryColor = primaryColor;\n const activeCalendarPrimary = calendarPrimaryColor || activePrimaryColor;\n const activeCheckboxColor = checkboxColor || '#7C3AED';\n const [fromDate, setFromDate] = useState(initialFromDate);\n const [toDate, setToDate] = useState(initialToDate);\n\n // Calendar View States\n const [viewMonth, setViewMonth] = useState(6);\n const [viewYear, setViewYear] = useState(2025);\n const [selectedDay, setSelectedDay] = useState<number | null>(15);\n\n const months = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n\n const handleNextMonth = () => {\n if (viewMonth === 11) {\n if (viewYear < 2050) {\n setViewMonth(0);\n setViewYear(prev => prev + 1);\n }\n } else {\n setViewMonth(prev => prev + 1);\n }\n };\n\n const handlePrevMonth = () => {\n if (viewMonth === 0) {\n if (viewYear > 2000) {\n setViewMonth(11);\n setViewYear(prev => prev - 1);\n }\n } else {\n setViewMonth(prev => prev - 1);\n }\n };\n\n const handlePrevYear = () => {\n if (viewYear > 2000) setViewYear(prev => prev - 1);\n };\n\n const handleNextYear = () => {\n if (viewYear < 2050) setViewYear(prev => prev + 1);\n };\n\n // Popover States\n const [fromAnchorEl, setFromAnchorEl] = useState<HTMLElement | null>(null);\n const [toAnchorEl, setToAnchorEl] = useState<HTMLElement | null>(null);\n\n const handleExport = () => {\n if (onExport) {\n onExport({ csv: exportCsv, pdf: exportPdf });\n }\n };\n\n const renderCalendar = (\n onCancel: () => void,\n onApply: (day: number) => void\n ) => (\n <PickerPaper sx={{ background: `${calendarBackgroundColor} !important` }}>\n <PickerHeader>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Icon\n icon=\"mdi:chevron-left\"\n width={20}\n color={activeCalendarPrimary}\n style={{ cursor: 'pointer' }}\n onClick={handlePrevMonth}\n />\n <HeaderText\n sx={{\n color: `${calendarHeaderColor} !important`,\n fontFamily: `${brandFont} !important`,\n }}\n >\n {months[viewMonth]}\n </HeaderText>\n <Icon\n icon=\"mdi:chevron-right\"\n width={20}\n color={activeCalendarPrimary}\n style={{ cursor: 'pointer' }}\n onClick={handleNextMonth}\n />\n </Stack>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Icon\n icon=\"mdi:chevron-left\"\n width={20}\n color={activeCalendarPrimary}\n style={{ cursor: 'pointer' }}\n onClick={handlePrevYear}\n />\n <HeaderText\n sx={{\n color: `${calendarHeaderColor} !important`,\n fontFamily: `${brandFont} !important`,\n }}\n >\n {viewYear}\n </HeaderText>\n <Icon\n icon=\"mdi:chevron-right\"\n width={20}\n color={activeCalendarPrimary}\n style={{ cursor: 'pointer' }}\n onClick={handleNextYear}\n />\n </Stack>\n </PickerHeader>\n\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: '4px',\n width: '100%',\n justifyItems: 'center',\n alignItems: 'center',\n }}\n >\n {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((day, index) => (\n <Box\n key={index}\n sx={{ width: '100%', display: 'flex', justifyContent: 'center' }}\n >\n <DayLabel\n sx={{\n color: `${calendarDayLabelColor} !important`,\n fontFamily: `${brandFont} !important`,\n }}\n >\n {day}\n </DayLabel>\n </Box>\n ))}\n {(() => {\n const firstDay = new Date(viewYear, viewMonth, 1).getDay();\n const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();\n const daysInPrevMonth = new Date(viewYear, viewMonth, 0).getDate();\n const days = [];\n\n // Previous month days filler\n for (let i = firstDay - 1; i >= 0; i--) {\n days.push({\n date: daysInPrevMonth - i,\n isCurrent: false,\n type: 'prev',\n });\n }\n\n // Current month days\n for (let i = 1; i <= daysInMonth; i++) {\n days.push({\n date: i,\n isCurrent: true,\n type: 'current',\n });\n }\n\n // Next month days filler to complete 35 or 42 cells\n const totalCellsNeeded = days.length > 35 ? 42 : 35;\n const remaining = totalCellsNeeded - days.length;\n for (let i = 1; i <= remaining; i++) {\n days.push({\n date: i,\n isCurrent: false,\n type: 'next',\n });\n }\n\n return days.map((dayObj, index) => {\n const isSelected = dayObj.isCurrent && dayObj.date === selectedDay;\n\n return (\n <Box\n key={index}\n sx={{\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n <DateCell\n isCurrentMonth={dayObj.isCurrent}\n isSelected={isSelected}\n sx={{\n fontFamily: `${brandFont} !important`,\n color: isSelected\n ? `${calendarSelectedTextColor} !important`\n : `${calendarDateColor} !important`,\n background: isSelected\n ? `${activeCalendarPrimary} !important`\n : 'transparent',\n opacity: dayObj.isCurrent ? 1 : 0.4,\n }}\n onClick={() => {\n if (dayObj.isCurrent) {\n setSelectedDay(dayObj.date);\n } else if (dayObj.type === 'prev') {\n handlePrevMonth();\n setSelectedDay(dayObj.date);\n } else if (dayObj.type === 'next') {\n handleNextMonth();\n setSelectedDay(dayObj.date);\n }\n }}\n >\n {dayObj.date}\n </DateCell>\n </Box>\n );\n });\n })()}\n </Box>\n\n <Stack\n direction=\"row\"\n justifyContent=\"flex-end\"\n spacing=\"12px\"\n sx={{ mt: '24px !important' }}\n >\n <PickerCancelButton\n onClick={onCancel}\n sx={{\n fontFamily: `${robotoFont} !important`,\n color: '#555770 !important',\n background: `${calendarCancelButtonBg} !important`,\n '&:hover': {\n background: `${calendarCancelButtonHoverBg} !important`,\n },\n }}\n >\n Cancel\n </PickerCancelButton>\n <PickerApplyButton\n onClick={() => selectedDay !== null && onApply(selectedDay)}\n sx={{\n fontFamily: `${robotoFont} !important`,\n background: `${calendarApplyButtonBg || activeCalendarPrimary} !important`,\n color: `${calendarSelectedTextColor} !important`,\n '&:hover': {\n background: `${calendarApplyButtonHoverBg || calendarApplyButtonBg || activeCalendarPrimary} !important`,\n },\n }}\n >\n Apply\n </PickerApplyButton>\n </Stack>\n </PickerPaper>\n );\n\n return (\n <RootPaper\n elevation={0}\n sx={{\n borderRadius:\n typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius,\n boxShadow: boxShadow,\n }}\n >\n <Title\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${titleFontWeight} !important`,\n fontSize: `${titleFontSize} !important`,\n color: `${titleColor} !important`,\n }}\n >\n {title}\n </Title>\n\n <Stack\n spacing=\"0\"\n alignItems=\"flex-start\"\n sx={{ pt: '24px', width: '100%' }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '24px',\n width: 538,\n }}\n >\n <Stack direction=\"row\" spacing=\"20px\">\n <DateBox\n onClick={e => setFromAnchorEl(e.currentTarget)}\n sx={{\n cursor: 'pointer',\n width:\n typeof dateBoxWidth === 'number'\n ? `${dateBoxWidth}px`\n : dateBoxWidth,\n height:\n typeof dateBoxHeight === 'number'\n ? `${dateBoxHeight}px`\n : dateBoxHeight,\n }}\n >\n <DateLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {fromDateTitle}\n </DateLabel>\n <DateValue\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${valueFontWeight} !important`,\n fontSize: `${valueFontSize} !important`,\n }}\n >\n {fromDate || (\n <span style={{ color: '#8F90A6', fontWeight: 500 }}>\n Select Date\n </span>\n )}\n </DateValue>\n <Box\n sx={{\n position: 'absolute',\n right: 14,\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n <Icon\n color=\"#555770\"\n height={20}\n icon={calendarIcon}\n width={18}\n />\n </Box>\n </DateBox>\n\n <DateBox\n onClick={e => setToAnchorEl(e.currentTarget)}\n sx={{\n cursor: 'pointer',\n width:\n typeof dateBoxWidth === 'number'\n ? `${dateBoxWidth}px`\n : dateBoxWidth,\n height:\n typeof dateBoxHeight === 'number'\n ? `${dateBoxHeight}px`\n : dateBoxHeight,\n }}\n >\n <DateLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {toDateTitle}\n </DateLabel>\n <DateValue\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${valueFontWeight} !important`,\n fontSize: `${valueFontSize} !important`,\n }}\n >\n {toDate || (\n <span style={{ color: '#8F90A6', fontWeight: 500 }}>\n Select Date\n </span>\n )}\n </DateValue>\n <Box\n sx={{\n position: 'absolute',\n right: 14,\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n <Icon\n color=\"#555770\"\n height={20}\n icon={calendarIcon}\n width={18}\n />\n </Box>\n </DateBox>\n </Stack>\n\n <Stack\n direction=\"row\"\n spacing=\"24px\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%' }}\n >\n <FormControlLabel\n control={\n <Checkbox\n checked={exportCsv}\n onChange={e => setExportCsv(e.target.checked)}\n sx={{\n color: '#49454F',\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n border: 'none !important',\n },\n }}\n />\n }\n label={\n <CheckboxLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {exportCsvText}{' '}\n <img src=\"/icons/csv.png\" alt=\"csv icon\" width={20} />\n </CheckboxLabel>\n }\n />\n <FormControlLabel\n control={\n <Checkbox\n checked={exportPdf}\n onChange={e => setExportPdf(e.target.checked)}\n sx={{\n color: '#49454F',\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n border: 'none !important',\n },\n }}\n />\n }\n label={\n <CheckboxLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {exportPdfText}{' '}\n <img src=\"/icons/pdf.png\" alt=\"pdf icon\" width={20} />\n </CheckboxLabel>\n }\n />\n </Stack>\n </Box>\n\n <Stack\n direction=\"row\"\n spacing=\"12px\"\n sx={{\n mt: '24px !important',\n width: '100%',\n justifyContent: 'flex-start',\n }}\n >\n <CloseButton\n onClick={onClose}\n variant=\"contained\"\n sx={{\n background: `${secondaryColor} !important`,\n fontFamily: `${robotoFont} !important`,\n width:\n typeof closeButtonWidth === 'number'\n ? `${closeButtonWidth}px`\n : closeButtonWidth,\n height:\n typeof closeButtonHeight === 'number'\n ? `${closeButtonHeight}px`\n : closeButtonHeight,\n '&:hover': {\n background: `${closeButtonHoverBg || secondaryColor} !important`,\n },\n }}\n >\n {closeButtonText}\n </CloseButton>\n <ExportMainButton\n onClick={handleExport}\n variant=\"contained\"\n sx={{\n background: `${primaryColor} !important`,\n fontFamily: `${robotoFont} !important`,\n width:\n typeof exportButtonWidth === 'number'\n ? `${exportButtonWidth}px`\n : exportButtonWidth,\n height:\n typeof exportButtonHeight === 'number'\n ? `${exportButtonHeight}px`\n : exportButtonHeight,\n '&:hover': {\n background: `${exportButtonHoverBg || primaryColor} !important`,\n },\n }}\n >\n {exportButtonText}\n </ExportMainButton>\n </Stack>\n </Stack>\n\n <Popover\n open={Boolean(fromAnchorEl)}\n anchorEl={fromAnchorEl}\n onClose={() => setFromAnchorEl(null)}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n PaperProps={{\n sx: {\n borderRadius: 5,\n boxShadow: 'none',\n background: 'transparent',\n mt: 1,\n },\n }}\n >\n {renderCalendar(\n () => setFromAnchorEl(null),\n day => {\n const newDateStr = `${day} ${months[viewMonth]} ${viewYear}`;\n if (toDate) {\n const [toDayStr, toMonthStr, toYearStr] = toDate.split(' ');\n const currentToDate = new Date(\n parseInt(toYearStr),\n months.indexOf(toMonthStr),\n parseInt(toDayStr)\n );\n const newFromDate = new Date(viewYear, viewMonth, day);\n if (newFromDate > currentToDate) {\n setToDate(newDateStr);\n }\n }\n setFromDate(newDateStr);\n setFromAnchorEl(null);\n }\n )}\n </Popover>\n\n <Popover\n open={Boolean(toAnchorEl)}\n anchorEl={toAnchorEl}\n onClose={() => setToAnchorEl(null)}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n PaperProps={{\n sx: {\n borderRadius: 5,\n boxShadow: 'none',\n background: 'transparent',\n mt: 1,\n },\n }}\n >\n {renderCalendar(\n () => setToAnchorEl(null),\n day => {\n const newDateStr = `${day} ${months[viewMonth]} ${viewYear}`;\n if (fromDate) {\n const [fromDayStr, fromMonthStr, fromYearStr] =\n fromDate.split(' ');\n const currentFromDate = new Date(\n parseInt(fromYearStr),\n months.indexOf(fromMonthStr),\n parseInt(fromDayStr)\n );\n const newToDate = new Date(viewYear, viewMonth, day);\n if (newToDate < currentFromDate) {\n setFromDate(newDateStr);\n }\n }\n setToDate(newDateStr);\n setToAnchorEl(null);\n }\n )}\n </Popover>\n </RootPaper>\n );\n};\n\nexport default FalconExportDialog;\n","import React, { useState } from 'react';\nimport {\n Box,\n Button,\n Checkbox,\n FormControlLabel,\n InputAdornment,\n TextField,\n Typography,\n styled,\n Paper,\n Stack,\n} from '@mui/material';\nimport { Icon } from '@iconify/react';\nimport {\n FalconExportReportDialogProps,\n FilterOption,\n} from './FalconExportReportDialog.types';\n\n// STYLED COMPONENTS\nconst RootPaper = styled(Paper)(() => ({\n width: 600,\n minHeight: 'auto',\n height: 'auto',\n borderRadius: 16,\n padding: '30px',\n background: '#FFFFFF',\n display: 'flex',\n flexDirection: 'column',\n boxSizing: 'border-box',\n boxShadow: '0px 4px 10px rgba(0, 0, 0, 0.05)',\n justifyContent: 'flex-start',\n alignItems: 'initial',\n}));\n\nconst Title = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '30px !important',\n lineHeight: '100%',\n color: '#000000',\n textAlign: 'center',\n letterSpacing: '0%',\n marginBottom: 0,\n}));\n\nconst CheckboxLabel = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '20px',\n color: '#000000',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n}));\n\nconst CloseButton = styled(Button)(() => ({\n width: 124,\n height: 42,\n borderRadius: 8,\n background: '#DFDFE0 !important',\n color: '#333333 !important',\n fontFamily: 'Roboto',\n fontWeight: '600 !important',\n fontSize: '14px !important',\n lineHeight: '20px',\n textTransform: 'none',\n padding: '10px 24px',\n boxShadow: 'none !important',\n '&:hover': {\n background: '#DFDFE0 !important',\n boxShadow: 'none !important',\n },\n}));\n\nconst ExportMainButton = styled(Button)(() => ({\n width: 402,\n height: 42,\n borderRadius: 8,\n background: '#401070 !important',\n color: '#FFFFFF !important',\n fontFamily: 'Roboto',\n fontWeight: '600 !important',\n fontSize: '14px !important',\n lineHeight: '20px',\n textTransform: 'none',\n padding: '4px 40px',\n boxShadow: 'none !important',\n '&:hover': {\n background: '#401070 !important',\n boxShadow: 'none !important',\n },\n}));\n\n// FILTER DROPDOWN PANEL\nconst DropdownSearchField = styled(TextField)(() => ({\n '& .MuiOutlinedInput-root': {\n height: '40px',\n borderRadius: '0',\n backgroundColor: '#FFFFFF',\n '& fieldset': { border: 'none' },\n },\n '& .MuiInputBase-input': {\n fontFamily: 'Roboto, sans-serif',\n fontWeight: 400,\n fontSize: '16px',\n lineHeight: '24px',\n letterSpacing: '0.5px',\n color: '#000000',\n padding: '0 8px',\n '&::placeholder': { color: '#8F90A6', opacity: 1 },\n },\n}));\n\nconst FilterDropdownPanel = styled(Box)(() => ({\n position: 'fixed',\n borderBottomLeftRadius: '16px',\n borderBottomRightRadius: '16px',\n backgroundColor: '#FFFFFF',\n boxShadow: '0px 4px 20px rgba(0,0,0,0.18)',\n zIndex: 1400,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n minWidth: '200px !important',\n}));\n\n// FILTER\nconst FilterContainer = styled(Box)(() => ({\n width: 538,\n display: 'flex',\n flexDirection: 'column',\n gap: 24,\n paddingTop: 0,\n}));\n\nconst FilterCard = styled(Box)(() => ({\n width: 538,\n borderRadius: 12,\n padding: 14,\n background: '#0000000A',\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n boxSizing: 'border-box',\n}));\n\nconst FilterTitle = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: '600 !important',\n fontSize: '16px !important',\n lineHeight: '20px !important',\n letterSpacing: '-0.15px !important',\n color: '#0A0A0A',\n}));\n\nconst FilterDropdownCard = styled(Box)(() => ({\n width: 160,\n height: 45,\n borderRadius: 8,\n padding: '6px 14px',\n border: '1px solid #D6D6D6',\n background: '#FFFFFF',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n boxSizing: 'border-box',\n cursor: 'pointer',\n}));\n\nconst FilterDropdownLabel = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '100%',\n letterSpacing: '0px',\n color: '#8F90A6',\n}));\n\nconst FilterDropdownValue = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '13px !important',\n lineHeight: '100%',\n letterSpacing: '0px',\n color: '#555770',\n}));\n\nconst DEFAULT_FILTERS: FilterOption[] = [\n {\n label: 'North',\n selected: 4,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n {\n label: 'South',\n selected: 3,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n {\n label: 'West',\n selected: 2,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n {\n label: 'East',\n selected: 0,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n {\n label: 'Central',\n selected: 1,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n];\n\nexport const FalconExportReportDialog: React.FC<\n FalconExportReportDialogProps\n> = ({\n title = 'Export Report',\n onClose,\n onExport,\n filters = DEFAULT_FILTERS,\n filterStoreMapping = {},\n exportButtonText = 'Export',\n closeButtonText = 'Close',\n initialExportCsv = true,\n initialExportPdf = false,\n primaryColor = '#401070',\n secondaryColor = '#DFDFE0',\n titleColor = '#000000',\n brandFont = '\"Neue Haas Grotesk Display Pro\", Arial, sans-serif',\n robotoFont = '\"Roboto\", Arial, sans-serif',\n titleFontSize = '30px',\n titleFontWeight = 600,\n filterTitleFontSize = '16px',\n filterTitleFontWeight = 600,\n labelFontSize = '14px',\n labelFontWeight = 600,\n valueFontSize = '13px',\n valueFontWeight = 600,\n borderRadius = 16,\n boxShadow = '0px 4px 10px rgba(0, 0, 0, 0.05)',\n exportButtonWidth = 402,\n exportButtonHeight = 42,\n closeButtonWidth = 124,\n closeButtonHeight = 42,\n filterBoxWidth = 160,\n filterBoxHeight = 45,\n exportCsvText = 'Export CSV',\n exportPdfText = 'Export PDF',\n dropdownBackgroundColor = '#FFFFFF',\n dropdownTextColor = '#1C1B1F',\n dropdownItemFontFamily = '\"Roboto\", sans-serif',\n dropdownItemFontSize = '14px',\n dropdownHoverColor = '#F3F4F6',\n checkboxColor,\n exportButtonHoverBg,\n closeButtonHoverBg,\n dropdownApplyButtonBg,\n dropdownApplyButtonHoverBg,\n dropdownClearButtonBg = '#FFFFFF',\n dropdownClearButtonHoverBg = '#F9FAFB',\n}) => {\n const [exportCsv, setExportCsv] = useState(initialExportCsv);\n const [exportPdf, setExportPdf] = useState(initialExportPdf);\n\n const activePrimaryColor = primaryColor;\n const activeCheckboxColor = checkboxColor || '#7C3AED';\n\n // Filter dropdown states\n const [openFilterLabel, setOpenFilterLabel] = useState<string | null>(null);\n const [filterAnchorEl, setFilterAnchorEl] = useState<HTMLElement | null>(\n null\n );\n const [filterSearch, setFilterSearch] = useState('');\n const [filterSelections, setFilterSelections] = useState<\n Record<string, Set<string>>\n >(() => {\n const init: Record<string, Set<string>> = {};\n filters.forEach(f => {\n const stores = f.stores ?? filterStoreMapping[f.label] ?? [];\n init[f.label] = new Set(stores.slice(0, f.selected));\n });\n return init;\n });\n const [pendingFilterSelections, setPendingFilterSelections] = useState<\n Set<string>\n >(new Set());\n\n const openFilterDropdown = (label: string, el: HTMLElement) => {\n setOpenFilterLabel(label);\n setFilterAnchorEl(el);\n setFilterSearch('');\n setPendingFilterSelections(new Set(filterSelections[label] ?? []));\n };\n\n const closeFilterDropdown = () => {\n setOpenFilterLabel(null);\n setFilterAnchorEl(null);\n setFilterSearch('');\n };\n\n const togglePendingFilter = (store: string) => {\n setPendingFilterSelections(prev => {\n const next = new Set(prev);\n if (next.has(store)) {\n next.delete(store);\n } else {\n next.add(store);\n }\n return next;\n });\n };\n\n const applyFilterDropdown = () => {\n if (!openFilterLabel) return;\n setFilterSelections(prev => ({\n ...prev,\n [openFilterLabel]: new Set(pendingFilterSelections),\n }));\n closeFilterDropdown();\n };\n\n const getFilterStores = (label: string): string[] => {\n const filter = filters.find(f => f.label === label);\n return filter?.stores ?? filterStoreMapping[label] ?? [];\n };\n\n const getFilterCount = (label: string) => filterSelections[label]?.size ?? 0;\n\n const handleExport = () => {\n if (onExport) {\n onExport({ csv: exportCsv, pdf: exportPdf });\n }\n };\n\n const totalStoresSelected = filters.reduce(\n (acc, f) => acc + getFilterCount(f.label),\n 0\n );\n\n return (\n <RootPaper\n elevation={0}\n sx={{\n borderRadius:\n typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius,\n boxShadow: boxShadow,\n }}\n >\n <Title\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${titleFontWeight} !important`,\n fontSize: `${titleFontSize} !important`,\n color: `${titleColor} !important`,\n }}\n >\n {title}\n </Title>\n\n <Stack\n spacing=\"0\"\n alignItems=\"flex-start\"\n sx={{ pt: '24px', width: '100%' }}\n >\n <FilterContainer>\n <FilterCard>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <FilterTitle\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${filterTitleFontWeight} !important`,\n fontSize: `${filterTitleFontSize} !important`,\n }}\n >\n Filter\n </FilterTitle>\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '400 !important',\n fontSize: '16px !important',\n lineHeight: '20px !important',\n letterSpacing: '-0.15px !important',\n color: '#515151',\n }}\n >\n {totalStoresSelected} Stores Selected\n </Typography>\n </Box>\n <Box\n sx={{\n width: '510px !important',\n margin: '0 auto',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '12px',\n justifyContent: 'flex-start',\n }}\n >\n {filters.map((filter, index) => (\n <FilterDropdownCard\n key={index}\n onClick={e =>\n openFilterDropdown(\n filter.label,\n e.currentTarget as HTMLElement\n )\n }\n sx={{\n width:\n typeof filterBoxWidth === 'number'\n ? `${filterBoxWidth}px`\n : filterBoxWidth,\n height:\n typeof filterBoxHeight === 'number'\n ? `${filterBoxHeight}px`\n : filterBoxHeight,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n }}\n >\n <FilterDropdownLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {filter.label}:\n </FilterDropdownLabel>\n <FilterDropdownValue\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${valueFontWeight} !important`,\n fontSize: `${valueFontSize} !important`,\n }}\n >\n {getFilterCount(filter.label)} selected\n </FilterDropdownValue>\n </Box>\n <Icon\n icon=\"mdi:chevron-down\"\n width={19}\n height={19}\n color=\"#555770\"\n style={{ flexShrink: 0 }}\n />\n </FilterDropdownCard>\n ))}\n\n {/* Filter Dropdown Panel */}\n {openFilterLabel &&\n filterAnchorEl &&\n (() => {\n const rect = filterAnchorEl.getBoundingClientRect();\n const allStores = getFilterStores(openFilterLabel);\n const filtered = allStores.filter(s =>\n s.toLowerCase().includes(filterSearch.toLowerCase())\n );\n return (\n <>\n <Box\n onClick={closeFilterDropdown}\n sx={{ position: 'fixed', inset: 0, zIndex: 1399 }}\n />\n <FilterDropdownPanel\n sx={{\n top: rect.bottom,\n left: rect.left,\n width: '200px !important',\n backgroundColor: `${dropdownBackgroundColor} !important`,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n borderBottom: '1px solid #E5E7EB',\n px: '12px',\n }}\n >\n <DropdownSearchField\n fullWidth\n placeholder=\"Search Store\"\n value={filterSearch}\n onChange={e => setFilterSearch(e.target.value)}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <Icon\n icon=\"tabler:search\"\n width={18}\n height={18}\n color=\"#8F90A6\"\n />\n </InputAdornment>\n ),\n }}\n />\n </Box>\n <Box\n sx={{\n maxHeight: '200px',\n overflowY: 'auto',\n '&::-webkit-scrollbar': { display: 'none' },\n msOverflowStyle: 'none',\n scrollbarWidth: 'none',\n }}\n >\n {filtered.map(store => (\n <Box\n key={store}\n onClick={() => togglePendingFilter(store)}\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n px: '16px',\n py: '8px',\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: `${dropdownHoverColor} !important`,\n },\n }}\n >\n <Checkbox\n size=\"small\"\n checked={pendingFilterSelections.has(store)}\n disableRipple\n sx={{\n p: 0,\n width: 18,\n height: 18,\n color: `${activeCheckboxColor} !important`,\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: '18px',\n border: 'none !important',\n },\n }}\n />\n <Typography\n sx={{\n fontFamily: `${dropdownItemFontFamily} !important`,\n fontWeight: 400,\n fontSize: `${dropdownItemFontSize} !important`,\n color: `${dropdownTextColor} !important`,\n }}\n >\n {store}\n </Typography>\n </Box>\n ))}\n </Box>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n px: '14px',\n py: '12px',\n borderTop: '1px solid #E5E7EB',\n }}\n >\n <Button\n onClick={() => {\n setPendingFilterSelections(new Set());\n if (openFilterLabel) {\n setFilterSelections(prev => ({\n ...prev,\n [openFilterLabel]: new Set(),\n }));\n closeFilterDropdown();\n }\n }}\n sx={{\n width: '80px',\n height: '34px',\n fontFamily: 'Roboto, sans-serif',\n fontWeight: 500,\n fontSize: '12px',\n color: '#333333',\n backgroundColor: `${dropdownClearButtonBg} !important`,\n border: '1px solid #8F90A6',\n textTransform: 'none',\n borderRadius: '4px',\n '&:hover': {\n backgroundColor: `${dropdownClearButtonHoverBg} !important`,\n },\n }}\n >\n Clear\n </Button>\n <Button\n onClick={applyFilterDropdown}\n sx={{\n width: '80px',\n height: '34px',\n fontFamily: 'Roboto, sans-serif',\n fontWeight: 500,\n fontSize: '12px',\n color: '#FFFFFF',\n backgroundColor: `${dropdownApplyButtonBg || activePrimaryColor} !important`,\n textTransform: 'none',\n borderRadius: '4px',\n '&:hover': {\n backgroundColor: `${dropdownApplyButtonHoverBg || dropdownApplyButtonBg || activePrimaryColor} !important`,\n },\n }}\n >\n Apply\n </Button>\n </Box>\n </FilterDropdownPanel>\n </>\n );\n })()}\n </Box>\n </FilterCard>\n\n <Stack\n direction=\"row\"\n spacing=\"24px\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%' }}\n >\n <FormControlLabel\n control={\n <Checkbox\n checked={exportCsv}\n onChange={e => setExportCsv(e.target.checked)}\n sx={{\n color: '#49454F',\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n border: 'none !important',\n },\n }}\n />\n }\n label={\n <CheckboxLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {exportCsvText}{' '}\n <img src=\"/icons/csv.png\" alt=\"csv icon\" width={20} />\n </CheckboxLabel>\n }\n />\n <FormControlLabel\n control={\n <Checkbox\n checked={exportPdf}\n onChange={e => setExportPdf(e.target.checked)}\n sx={{\n color: '#49454F',\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n border: 'none !important',\n },\n }}\n />\n }\n label={\n <CheckboxLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {exportPdfText}{' '}\n <img src=\"/icons/pdf.png\" alt=\"pdf icon\" width={20} />\n </CheckboxLabel>\n }\n />\n </Stack>\n </FilterContainer>\n\n <Stack\n direction=\"row\"\n spacing=\"12px\"\n sx={{\n mt: '24px !important',\n width: '100%',\n justifyContent: 'flex-start',\n }}\n >\n <CloseButton\n onClick={onClose}\n variant=\"contained\"\n sx={{\n background: `${secondaryColor} !important`,\n fontFamily: `${robotoFont} !important`,\n width:\n typeof closeButtonWidth === 'number'\n ? `${closeButtonWidth}px`\n : closeButtonWidth,\n height:\n typeof closeButtonHeight === 'number'\n ? `${closeButtonHeight}px`\n : closeButtonHeight,\n '&:hover': {\n background: `${closeButtonHoverBg || secondaryColor} !important`,\n },\n }}\n >\n {closeButtonText}\n </CloseButton>\n <ExportMainButton\n onClick={handleExport}\n variant=\"contained\"\n sx={{\n background: `${primaryColor} !important`,\n fontFamily: `${robotoFont} !important`,\n width:\n typeof exportButtonWidth === 'number'\n ? `${exportButtonWidth}px`\n : exportButtonWidth,\n height:\n typeof exportButtonHeight === 'number'\n ? `${exportButtonHeight}px`\n : exportButtonHeight,\n '&:hover': {\n background: `${exportButtonHoverBg || primaryColor} !important`,\n },\n }}\n >\n {exportButtonText}\n </ExportMainButton>\n </Stack>\n </Stack>\n </RootPaper>\n );\n};\n","import { Autocomplete, TextField } from '@mui/material';\nimport type { FalconDIstrictFilterProps } from './FalconDIstrictFilter.types';\n\n/** District filter — full implementation can be migrated from apps/docs. */\nexport const FalconDIstrictFilter = ({\n label = 'District',\n options = [],\n value = [],\n onChange,\n}: FalconDIstrictFilterProps) => (\n <Autocomplete\n multiple\n options={options}\n value={value}\n onChange={(_, newValue) => onChange?.(newValue)}\n getOptionLabel={(opt) =>\n typeof opt === 'object' && opt !== null ? opt.label : ''\n }\n isOptionEqualToValue={(a, b) => a.id === b.id}\n renderInput={(params) => (\n <TextField {...params} label={label} placeholder=\"Select districts\" />\n )}\n />\n);\n","import { Box, Typography } from '@mui/material';\nimport { Icon } from '@iconify/react';\nimport type { FalconStatBannerProps } from './FalconStatBanner.types';\n\nconst TREND_UP_COLOR = '#6D9F92';\nconst TREND_DOWN_COLOR = '#ED1C24';\n\nconst formatValue = (value: string | number): string =>\n typeof value === 'number' ? value.toLocaleString() : value;\n\nexport const FalconStatBanner = ({\n label,\n value,\n color = '#1BA9B5',\n textColor = '#fff',\n width = '100%',\n height,\n fontSize = '1rem',\n fontWeight = 600,\n trend,\n trendPlacement = 'inline',\n sx,\n className,\n}: FalconStatBannerProps) => {\n const accentColor =\n trend?.direction === 'up' ? TREND_UP_COLOR : TREND_DOWN_COLOR;\n\n const badgeBg = trend?.badgeBg ?? '#fff';\n const badgeColor = trend?.badgeColor ?? accentColor;\n const badgeIconBg = trend?.badgeIconBg ?? accentColor;\n const badgeIconColor = trend?.badgeIconColor ?? '#fff';\n\n const showTrend = Boolean(trend?.label);\n const isEnd = showTrend && trendPlacement === 'end';\n\n return (\n <Box\n className={className}\n sx={{\n width,\n bgcolor: color,\n borderRadius: '50px',\n px: 4,\n display: 'flex',\n alignItems: 'center',\n justifyContent: isEnd ? 'space-between' : 'center',\n gap: showTrend ? 2 : 0,\n ...(height ? { height } : { py: 1.5 }),\n ...sx,\n }}\n >\n <Typography\n variant=\"body1\"\n sx={{ color: textColor, fontSize, lineHeight: 1.4 }}\n >\n {label}:{' '}\n <Box component=\"span\" sx={{ fontWeight }}>\n {formatValue(value)}\n </Box>\n </Typography>\n\n {showTrend && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n bgcolor: badgeBg,\n borderRadius: '50px',\n px: 2,\n py: 0.75,\n flexShrink: 0,\n }}\n >\n <Typography\n variant=\"body2\"\n sx={{\n color: badgeColor,\n fontSize: '0.8rem',\n fontWeight: 600,\n lineHeight: 1,\n }}\n >\n {trend!.label}\n </Typography>\n <Box\n sx={{\n width: 18,\n height: 18,\n borderRadius: '50%',\n bgcolor: badgeIconBg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <Icon\n icon={\n trend!.direction === 'up' ? 'mdi:arrow-up' : 'mdi:arrow-down'\n }\n color={badgeIconColor}\n width={11}\n height={11}\n />\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import { Box, Stack } from '@mui/material';\nimport { FalconStatBanner } from './FalconStatBanner';\nimport type { FalconStatBannerGroupProps } from './FalconStatBannerGroup.types';\n\nexport const FalconStatBannerGroup = ({\n banners,\n spacing = 2,\n sx,\n}: FalconStatBannerGroupProps) => (\n <Stack direction=\"row\" spacing={spacing} sx={{ width: '100%', ...sx }}>\n {banners.map(({ width, ...bannerProps }, index) => (\n <Box\n key={index}\n sx={width ? { width, flexShrink: 0 } : { flex: 1, minWidth: 0 }}\n >\n <FalconStatBanner width=\"100%\" {...bannerProps} />\n </Box>\n ))}\n </Stack>\n);\n","import { Box, Stack, Typography, useTheme } from '@mui/material';\nimport type { FalconGrayButtonProps } from './FalconGrayButton.types';\n\nexport const FalconGrayButton = ({\n text,\n Icon,\n onClick,\n}: FalconGrayButtonProps) => {\n const theme = useTheme();\n return (\n <Box\n sx={{\n cursor: onClick ? 'pointer' : 'default',\n padding: 4,\n borderRadius: '8px',\n background: theme.palette.secondary?.light ?? '#f0f0f0',\n }}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n >\n <Stack direction=\"row\" justifyContent=\"center\" gap={4} alignItems=\"center\">\n {Icon}\n <Typography fontSize={12} align=\"center\" fontWeight=\"bold\">\n {text}\n </Typography>\n </Stack>\n </Box>\n );\n};\n","import { Box, Divider, Stack } from '@mui/material';\nimport type { FalconPaginationProps } from './FalconPagination.types';\n\nconst selectStyle = {\n border: 'none',\n backgroundColor: 'transparent',\n padding: '5px 10px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#555770',\n cursor: 'pointer',\n outline: 'none',\n} as const;\n\nconst optionStyle = { padding: '5px 10px' } as const;\n\nconst btnStyle = {\n border: 'none',\n backgroundColor: 'transparent',\n padding: '5px 10px',\n cursor: 'pointer',\n outline: 'none',\n} as const;\n\nexport const FalconPagination = ({\n pageNo,\n setPageNo,\n perPage,\n setPerPage,\n totalItems,\n perPageOptions = [12, 24, 36],\n}: FalconPaginationProps) => {\n const totalPage = Math.ceil(totalItems / perPage) || 1;\n\n return (\n <Stack\n spacing={2}\n alignItems=\"center\"\n direction=\"row\"\n width=\"100%\"\n bgcolor=\"#F0F0F0\"\n >\n <Box>\n <select\n style={selectStyle}\n value={perPage}\n onChange={(e) => setPerPage(Number(e.target.value))}\n aria-label=\"Items per page\"\n >\n {perPageOptions.map((n) => (\n <option key={n} style={optionStyle} value={n}>\n {n}\n </option>\n ))}\n </select>\n </Box>\n <Divider orientation=\"vertical\" flexItem />\n\n <Box sx={{ flex: 1 }}>\n <Box sx={{ color: '#525252', fontFamily: 'roboto' }}>\n {perPage * (pageNo - 1) + 1} - {Math.min(perPage * pageNo, totalItems)}{' '}\n of {totalItems} items\n </Box>\n </Box>\n <Divider orientation=\"vertical\" flexItem />\n\n <Stack alignItems=\"center\" direction=\"row\" gap={1}>\n <Box>\n <select\n style={selectStyle}\n value={pageNo}\n onChange={(e) => setPageNo(Number(e.target.value))}\n aria-label=\"Page number\"\n >\n {Array.from({ length: totalPage }, (_, i) => (\n <option key={i} style={optionStyle} value={i + 1}>\n {i + 1}\n </option>\n ))}\n </select>\n </Box>\n <Box sx={{ color: '#525252', fontFamily: 'roboto' }}>\n of {totalPage} pages\n </Box>\n </Stack>\n\n <Divider orientation=\"vertical\" flexItem />\n\n <Stack direction=\"row\" gap={1}>\n <button\n type=\"button\"\n disabled={pageNo === 1}\n onClick={() => setPageNo(pageNo - 1)}\n style={btnStyle}\n aria-label=\"Previous page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path d=\"M10 12L5 8L10 4V12Z\" fill=\"#161616\" />\n </svg>\n </button>\n <button\n type=\"button\"\n disabled={pageNo === totalPage}\n onClick={() => setPageNo(pageNo + 1)}\n style={btnStyle}\n aria-label=\"Next page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path d=\"M6 4L11 8L6 12V4Z\" fill=\"#161616\" />\n </svg>\n </button>\n </Stack>\n </Stack>\n );\n};\n","import {\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n SelectChangeEvent,\n} from '@mui/material';\nimport type { FalconSelectProps } from './FalconSelect.types';\n\nfunction normalizeOptions(\n options: string[] | { value: string; label: string }[]\n): { value: string; label: string }[] {\n return options.map((opt) =>\n typeof opt === 'string' ? { value: opt.toLowerCase(), label: opt } : opt\n );\n}\n\nexport const FalconSelect = ({\n label,\n value,\n onChange,\n options,\n disabled = false,\n clearable = true,\n}: FalconSelectProps) => {\n const items = normalizeOptions(options);\n const handleChange = (event: SelectChangeEvent<string>) => {\n const v = event.target.value as string;\n onChange(v !== '' ? v : '');\n };\n\n return (\n <FormControl variant=\"filled\" fullWidth color=\"primary\">\n <InputLabel id={`falcon-select-${label}-label`}>\n Select {label} *\n </InputLabel>\n <Select\n disabled={disabled}\n value={value?.toLowerCase() ?? ''}\n label={`Select ${label}`}\n onChange={handleChange}\n labelId={`falcon-select-${label}-label`}\n id={`falcon-select-${label}`}\n >\n {clearable && (\n <MenuItem value=\"\">\n <em>--Clear--</em>\n </MenuItem>\n )}\n {items.map((item, i) => (\n <MenuItem key={i} value={item.value}>\n {item.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n","import Stack from '@mui/material/Stack';\nimport Switch from '@mui/material/Switch';\nimport { styled } from '@mui/material/styles';\nimport type { FalconSingleSwitchProps } from './FalconSingleSwitch.types';\n\nconst AntSwitch = styled(Switch)(() => ({\n width: 28,\n height: 16,\n padding: 0,\n display: 'flex',\n '&:active': {\n '& .MuiSwitch-thumb': { width: 15 },\n '& .MuiSwitch-switchBase.Mui-checked': { transform: 'translateX(9px)' },\n },\n '& .MuiSwitch-switchBase': {\n padding: 2,\n '&.Mui-checked': {\n transform: 'translateX(12px)',\n color: '#fff',\n '& + .MuiSwitch-track': { opacity: 1 },\n },\n },\n '& .MuiSwitch-thumb': {\n boxShadow: '0 2px 4px 0 rgb(0 35 11 / 20%)',\n width: 12,\n height: 12,\n borderRadius: 6,\n },\n '& .MuiSwitch-track': {\n borderRadius: 8,\n opacity: 1,\n backgroundColor: 'rgba(0,0,0,.25)',\n boxSizing: 'border-box',\n },\n}));\n\nexport const FalconSingleSwitch = ({\n color,\n setStatus,\n value = false,\n onChange,\n}: FalconSingleSwitchProps) => {\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => {\n setStatus?.(checked);\n onChange?.(event, checked);\n };\n\n return (\n <Stack direction=\"row\" margin={2} spacing={1} alignItems=\"center\">\n <AntSwitch\n checked={value}\n onChange={handleChange}\n color={color}\n size=\"medium\"\n inputProps={{ 'aria-label': 'toggle' }}\n />\n </Stack>\n );\n};\n","import { Box } from '@mui/material';\nimport { DataGrid } from '@mui/x-data-grid';\nimport { useState } from 'react';\nimport type { FalconTableProps } from './FalconTable.types';\n\nexport const FalconTable = <T extends Record<string, unknown>>({\n rows,\n getRowId,\n columns,\n pageSizeOptions = [7, 10, 25, 50],\n}: FalconTableProps<T>) => {\n const [paginationModel, setPaginationModel] = useState({\n page: 0,\n pageSize: 7,\n });\n\n return (\n <Box\n sx={{\n border: '2px solid #F2F2F2',\n padding: '16px',\n borderRadius: '12px',\n }}\n >\n <DataGrid\n autoHeight\n sx={{\n minHeight: '48px',\n '& .MuiDataGrid-columnHeaders': {\n borderBottom: '0px',\n borderRadius: '6px !important',\n },\n '& .MuiDataGrid-columnHeaderTitle': {\n color: '#7A7A7A !important',\n },\n }}\n rows={rows ?? []}\n getRowId={getRowId}\n columns={columns}\n disableRowSelectionOnClick\n pageSizeOptions={pageSizeOptions}\n paginationModel={paginationModel}\n onPaginationModelChange={setPaginationModel}\n />\n </Box>\n );\n};\n","import { Box, Typography } from '@mui/material';\nimport type { FalconTicketColumsFilterProps } from './FalconTicketColumsFilter.types';\n\n/** Column filter UI — full implementation can be migrated from apps/docs. */\nexport const FalconTicketColumsFilter = ({\n columns = [],\n selected = [],\n onSelectionChange,\n}: FalconTicketColumsFilterProps) => (\n <Box sx={{ p: 2, minWidth: 280 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n Select columns\n </Typography>\n {columns.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No columns configured. Pass columns prop.\n </Typography>\n ) : (\n <Typography variant=\"body2\">\n {selected.length} of {columns.length} selected\n </Typography>\n )}\n {onSelectionChange && (\n <Typography variant=\"caption\" display=\"block\" sx={{ mt: 1 }}>\n (Column checkboxes to be wired from app)\n </Typography>\n )}\n </Box>\n);\n","import { Button, Popover } from '@mui/material';\nimport { useState } from 'react';\nimport type { FalconTicketFilterProps } from './FalconTicketFilter.types';\n\nexport const FalconTicketFilter = ({\n children,\n label = 'FILTERS',\n open: controlledOpen,\n onOpenChange,\n}: FalconTicketFilterProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const open = controlledOpen ?? internalOpen;\n const setOpen = onOpenChange ?? setInternalOpen;\n\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n setOpen(true);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n setOpen(false);\n };\n\n return (\n <>\n <Button onClick={handleClick} variant=\"outlined\" size=\"medium\">\n {label}\n </Button>\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <div style={{ padding: 16, minWidth: 280 }}>{children}</div>\n </Popover>\n </>\n );\n};\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\n/**\n * Ready-made **`ChartWidgetInfoPopoverContent`** for **TimePeriodFilter** (D / W / M / Y) when you want\n * generic help — **not** tied to **QueueTimeBreakdown** or any other specific card.\n *\n * **Use this when:** you show the period control next to charts or KPIs on any page and need a short\n * explanation of what the control does and why it matters, without duplicating copy in your app.\n *\n * **What it contains (for authors / Storybook):**\n * - **`title`:** “Time period” — names the control.\n * - **`description`:** Explains that switching day / week / month / year changes grouping or how the time axis is labelled.\n * - **`helpTitle`:** “How does it help?”\n * - **`helpBullets`:** (1) Align the view with your reporting window; (2) Keep period in sync with other controls on the page.\n *\n * Pass as **`infoPopover={TIME_PERIOD_FILTER_INFO_POPOVER}`** on **TimePeriodFilter**, or use your own\n * **`ChartWidgetInfoPopoverContent`** if you need product-specific wording.\n */\nexport const TIME_PERIOD_FILTER_INFO_POPOVER: ChartWidgetInfoPopoverContent = {\n title: 'Time period',\n description:\n 'Switch between day, week, month, and year to change how data is grouped or how the time axis is labelled.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'Match the view to your reporting window (e.g. weekly reviews vs monthly rollups).',\n 'Use the same period across controls on the page so everything stays in sync.',\n ],\n};\n\n/**\n * Info copy aligned with the **QueueTimeBreakdown** composite card (header next to D/W/M/Y).\n * **QueueTimeBreakdown** uses this when **`infoPopover`** is omitted on the card.\n * Use **`TIME_PERIOD_FILTER_INFO_POPOVER`** instead when the filter is not on that card.\n */\nexport const TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN: ChartWidgetInfoPopoverContent =\n {\n title: 'Queue Time Breakdown',\n description:\n 'Shows how visitors distribute across queue-time buckets for each row, compares today vs yesterday in the donuts, and plots the trend for the selected period (day, week, month, year).',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'See which stores or zones keep people longer in each time band.',\n 'Switch D / W / M / Y to align the area chart with your reporting window.',\n 'Compare donut slices to spot day-over-day shifts in bucket mix.',\n ],\n };\n\n/** @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER}. */\nexport const CHART_PERIOD_FILTER_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER;\n\n/** @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN}. */\nexport const QUEUE_TIME_BREAKDOWN_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN;\n\n/**\n * @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN}.\n */\nexport const DEFAULT_QUEUE_TIME_BREAKDOWN_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN;\n","import type { HeatMapChartLegendProps } from './HeatMapChartLegend.types';\n\nexport const HeatMapChartLegend = ({\n title,\n items,\n gradientId,\n gradientStops,\n}: HeatMapChartLegendProps) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n marginBottom: '16px',\n fontFamily: 'sans-serif',\n }}\n >\n <span\n style={{\n fontSize: '12px',\n fontWeight: 700,\n color: '#374151',\n minWidth: '80px',\n textAlign: 'right',\n }}\n >\n {title}\n </span>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n flex: 1,\n maxWidth: '600px',\n }}\n >\n <svg\n width=\"100%\"\n height=\"32\"\n style={{ filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1))' }}\n >\n <defs>\n <linearGradient\n id={gradientId}\n x1=\"0%\"\n y1=\"0%\"\n x2=\"100%\"\n y2=\"0%\"\n >\n {gradientStops.map((stop, index) => (\n <stop\n key={index}\n offset={stop.offset}\n stopColor={stop.color}\n stopOpacity=\"1\"\n />\n ))}\n </linearGradient>\n </defs>\n <rect\n width=\"100%\"\n height=\"100%\"\n fill={`url(#${gradientId})`}\n />\n </svg>\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: '16px',\n paddingRight: '16px',\n }}\n >\n {items.map((item, index) => (\n <span\n key={index}\n style={{\n fontSize: '9px',\n fontWeight: 600,\n color: 'white',\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.5)',\n letterSpacing: '0.025em',\n }}\n >\n {item.label}\n </span>\n ))}\n </div>\n </div>\n </div>\n);\n","import type { ProgressBarNumberProps } from './ProgressBarNumber.types';\n\nconst FullProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeWidth={4}\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nconst HalfProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeWidth={4}\n strokeDasharray={85}\n strokeDashoffset={130}\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nconst NoProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeOpacity=\"0.1\"\n strokeWidth=\"4\"\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nexport const ProgressBarNumber = ({\n number,\n progress,\n numColor,\n}: ProgressBarNumberProps) => {\n if (progress === 0) {\n return <NoProgress number={number} numColor={numColor} />;\n }\n if (progress === 50) {\n return <HalfProgress number={number} numColor={numColor} />;\n }\n if (progress === 100) {\n return <FullProgress number={number} numColor={numColor} />;\n }\n return <div>Invalid Progress</div>;\n};\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n LabelList,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootfallByAgeGroupsProps,\n FootfallByAgeGroupsRow,\n FootfallByAgeGroupsSeries,\n FootfallByAgeGroupsTooltipRenderContext,\n FootfallByAgeGroupsTooltipStyles,\n} from './FootfallByAgeGroups.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_BY_AGE_CHART_MARGIN = {\n top: 16,\n right: 8,\n left: 6,\n bottom: 0,\n} as const;\nconst OLY_DEFAULT_FOOTFALL_BY_AGE_STACK_TOTAL_LABEL_FILL = '#28293D' as const;\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\n/** Merge MUI \\`sx\\` with a base object (supports array / function overrides). */\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction rowTotal(\n row: FootfallByAgeGroupsRow,\n series: FootfallByAgeGroupsSeries[]\n): number {\n return series.reduce((acc, s) => {\n const v = row[s.dataKey];\n return acc + (typeof v === 'number' ? v : Number(v) || 0);\n }, 0);\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}K`;\n }\n return String(value);\n}\n\ntype SVGTextAnchor = 'inherit' | 'start' | 'middle' | 'end';\n\ntype MultiLineTickProps = {\n x?: number;\n y?: number;\n payload?: { value: string };\n angle?: number;\n dx?: number;\n style?: Record<string, string | number>;\n textAnchor?: SVGTextAnchor;\n fontSize?: number;\n};\n\nfunction MultiLineTick({\n x = 0,\n y = 0,\n payload,\n angle = -38,\n dx = 0,\n style,\n textAnchor = 'end',\n fontSize = 12,\n}: MultiLineTickProps): React.ReactElement | null {\n if (!payload?.value) return null;\n const lines = String(payload.value).split('\\n');\n const lineHeight = fontSize * 1.3;\n const isHorizontal = angle === 0;\n const anchor: SVGTextAnchor = isHorizontal ? 'middle' : textAnchor;\n const dy0 = isHorizontal ? lineHeight * 0.35 : 4;\n\n return (\n <g transform={`translate(${x + dx},${y})`}>\n <text\n transform={`rotate(${angle})`}\n textAnchor={anchor}\n fontSize={fontSize}\n fill=\"#666\"\n {...style}\n >\n {lines.map((line, i) => (\n <tspan key={i} x={0} dy={i === 0 ? dy0 : lineHeight}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n\ntype FootfallAgeTooltipProps = TooltipContentProps & {\n series: FootfallByAgeGroupsSeries[];\n categoryLabel: string;\n overallLabel: string;\n tooltipStyles?: FootfallByAgeGroupsTooltipStyles;\n};\n\nfunction FootfallAgeTooltip({\n active,\n payload,\n label,\n series,\n categoryLabel,\n overallLabel,\n tooltipStyles,\n}: FootfallAgeTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const total = payload.reduce((sum: number, entry: TooltipPayloadEntry) => {\n const v = entry.value;\n const n = typeof v === 'number' ? v : Number(v);\n return sum + (Number.isFinite(n) ? n : 0);\n }, 0);\n\n const ts = tooltipStyles;\n const sectionBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: '8px',\n };\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: 'white',\n borderRadius: '8px',\n padding: '16px',\n minWidth: '180px',\n maxWidth: '260px',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n { ...sectionBase, marginBottom: '8px' },\n ts?.sectionRow\n )}\n >\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {categoryLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {label}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {overallLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {total.toLocaleString()}\n </div>\n </div>\n {series.map((s: FootfallByAgeGroupsSeries) => {\n const entry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === s.dataKey\n );\n const raw = entry?.value;\n const value = typeof raw === 'number' ? raw : Number(raw ?? 0);\n return (\n <div style={mergeCss(sectionBase, ts?.sectionRow)} key={s.dataKey}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: s.color,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 700,\n },\n ts?.seriesName\n )}\n >\n {s.label}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {value.toLocaleString()}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/** Props passed by Recharts `LabelList` `content` renderer. */\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n index?: number;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction StackTotalLabel({\n series,\n rows,\n x,\n y,\n width,\n height,\n index,\n stackTotalFill,\n}: RechartsBarLabelListProps & {\n series: FootfallByAgeGroupsSeries[];\n rows: FootfallByAgeGroupsRow[];\n stackTotalFill: string;\n}) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n const nh = toNum(height);\n if (\n index === undefined ||\n nx === undefined ||\n ny === undefined ||\n nw === undefined ||\n nh === undefined\n ) {\n return null;\n }\n const row = rows[index];\n if (!row) return null;\n const total = rowTotal(row, series);\n const cx = nx + nw / 2;\n const cy = ny - 10;\n return (\n <text\n x={cx}\n y={cy}\n fill={stackTotalFill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(total)}\n </text>\n );\n}\n\n/**\n * Stacked bar chart for footfall (or counts) by age groups per category, with hover dimming, optional horizontal scroll, and a custom tooltip.\n */\nconst defaultMinWidthPerCategory = 56;\n/** Default Recharts \\`maxBarSize\\` cap (slimmer than category min width when bands are wide). */\nconst defaultMaxBarThickness = 36;\n/** Left/right space for Y-axis ticks and padding inside the scrollable plot. */\nconst chartWidthAxisGutter = 72;\n\nconst defaultChartMargin = OLY_DEFAULT_FOOTFALL_BY_AGE_CHART_MARGIN;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n stackTotalLabelFill: OLY_DEFAULT_FOOTFALL_BY_AGE_STACK_TOTAL_LABEL_FILL,\n} as const;\n\nexport function FootfallByAgeGroups({\n title,\n data,\n series,\n isLoading = false,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipCategoryLabel = 'Time',\n tooltipOverallLabel = 'Overall',\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n chartMargin: chartMarginProp,\n yAxisTickDx = -8,\n yAxisTickStyle,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n dimmedStackOpacity = 0.35,\n barStackId = 'footfall-by-age-groups',\n xAxisTickAngle = 0,\n xAxisTickDx = 0,\n xAxisTickStyle,\n}: FootfallByAgeGroupsProps) {\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n\n const handleMouseEnter = React.useCallback((_: unknown, index: number) => {\n setActiveIndex(index);\n }, []);\n\n const handleMouseLeave = React.useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo(\n () => data.map(row => ({ ...row })),\n [data]\n );\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row =>\n series.some(s => {\n const raw = row[s.dataKey];\n const value =\n typeof raw === 'number'\n ? raw\n : raw === null || raw === undefined\n ? 0\n : Number(raw);\n return Number.isFinite(value) && value > 0;\n })\n ),\n [processedData, series]\n );\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n /**\n * Explicit pixel width so Recharts lays out correctly inside `overflow-x: auto` (ResponsiveContainer + % widths clip in flex/Storybook).\n * When category scroll is active: at least category minimum or the visible viewport, whichever is wider.\n */\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const barOpacity = (index: number) =>\n activeIndex === null || activeIndex === index ? 1 : dimmedStackOpacity;\n\n const lastSeriesIndex = series.length - 1;\n\n const chartMargin = React.useMemo(\n () => chartMarginProp ?? defaultChartMargin,\n [chartMarginProp]\n );\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend && !isLoading && hasMeaningfulData && series.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {series.map(s => (\n <Stack\n key={s.dataKey}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: s.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {s.legendLabel ?? s.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height=\"100%\" />\n ) : hasMeaningfulData ? (\n <BarChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n onMouseLeave={handleMouseLeave}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n interval={0}\n height={68}\n tickMargin={10}\n tick={\n <MultiLineTick\n angle={xAxisTickAngle}\n dx={xAxisTickDx}\n style={xAxisTickStyle}\n />\n }\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n dx={yAxisTickDx}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400, ...yAxisTickStyle }}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n allowEscapeViewBox={{ x: true, y: true }}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n series,\n } satisfies FootfallByAgeGroupsTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <FootfallAgeTooltip\n {...tooltipProps}\n series={series}\n categoryLabel={tooltipCategoryLabel}\n overallLabel={tooltipOverallLabel}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n {series.map((s, i) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label}\n stackId={barStackId}\n fill={s.color}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`${s.dataKey}-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {i === lastSeriesIndex ? (\n <LabelList\n content={(labelProps: RechartsBarLabelListProps) => (\n <StackTotalLabel\n {...labelProps}\n series={series}\n rows={processedData}\n stackTotalFill={chartColors.stackTotalLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n ))}\n </BarChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","/** Shared max-width rules for chart cards (WalkinAnalysis-style). */\nexport type ChartCardMaxWidth =\n | number\n | string\n | {\n xs?: number | string;\n sm?: number | string;\n md?: number | string;\n };\n\nexport function resolveChartCardMaxWidth(\n cardMaxWidth: ChartCardMaxWidth | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return `${cardMaxWidth}px`;\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? `${cardMaxWidth.xs}px`\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? `${cardMaxWidth.sm}px`\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? `${cardMaxWidth.md}px`\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n LabelList,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootfallByGenderChartColors,\n FootfallByGenderHorizontalScroll,\n FootfallByGenderProps,\n FootfallByGenderRow,\n FootfallByGenderTooltipRenderContext,\n FootfallByGenderTooltipStyles,\n} from './FootfallByGender.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_CHART_MARGIN = {\n top: 16,\n right: 8,\n left: 4,\n bottom: 0,\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_SERIES_COLORS = {\n male: '#7266E9',\n female: '#E85D4C',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_BAR_VALUE_LABEL_FILL = '#4B5563' as const;\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nconst defaultSeriesLabels = { male: 'Male', female: 'Female' } as const;\nconst defaultSeriesColors = OLY_DEFAULT_FOOTFALL_GENDER_SERIES_COLORS;\n\nconst defaultMinWidthPerCategory = 72;\nconst defaultMaxBarThickness = 32;\nconst chartWidthAxisGutter = 88;\n\nconst defaultChartMargin = OLY_DEFAULT_FOOTFALL_GENDER_CHART_MARGIN;\n\nconst defaultChartColors: FootfallByGenderChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n barValueLabelFill: OLY_DEFAULT_FOOTFALL_GENDER_BAR_VALUE_LABEL_FILL,\n};\n\nconst topReserveForBarLabels = 58;\nconst topReserveNoBarLabels = 28;\nconst topReserveForGrowthBadges = 90;\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n index?: number;\n value?: number | string;\n}\n\nfunction toNum(v: number | string | undefined): number | undefined {\n if (v === undefined) return undefined;\n return typeof v === 'number' ? v : Number(v);\n}\n\ninterface GrowthBadgeLabelProps extends RechartsBarLabelListProps {\n rows: FootfallByGenderRow[];\n barGap: number;\n series: 'male' | 'female';\n badgeWidth?: number;\n badgeHeight?: number;\n badgeOffsetY?: number;\n}\n\nfunction GrowthBadgeLabel({\n x,\n y,\n width,\n index,\n rows,\n barGap,\n series,\n badgeWidth = 45,\n badgeHeight = 38,\n badgeOffsetY = 35,\n}: GrowthBadgeLabelProps): React.ReactElement | null {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (\n index === undefined ||\n nx === undefined ||\n ny === undefined ||\n nw === undefined\n ) {\n return null;\n }\n\n const row = rows[index];\n if (!row || !Number.isFinite(row.ffGrowthPercent)) return null;\n\n // Only render from whichever bar is taller; male wins ties.\n const maleTaller = row.male >= row.female;\n if (series === 'male' && !maleTaller) return null;\n if (series === 'female' && maleTaller) return null;\n\n const pct = row.ffGrowthPercent as number;\n const isPositive = pct >= 0;\n const color = isPositive ? '#6D9F92' : '#ED1C24';\n const iconName = isPositive ? 'mdi:arrow-up' : 'mdi:arrow-down';\n const label = `${isPositive ? '+' : ''}${pct.toFixed(1)}%`;\n\n const centerX = series === 'male' ? nx + nw + barGap / 2 : nx - barGap / 2;\n const foX = centerX - badgeWidth / 2;\n const foY = ny - badgeOffsetY - badgeHeight;\n\n return (\n <foreignObject\n x={foX}\n y={foY}\n width={badgeWidth}\n height={badgeHeight}\n style={{ overflow: 'visible' }}\n >\n <div\n {...({ xmlns: 'http://www.w3.org/1999/xhtml' } as object)}\n style={{\n width: `${badgeWidth}px`,\n height: `${badgeHeight}px`,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '2px',\n background: '#F3F4F6',\n borderRadius: '6px',\n boxShadow: '0 1px 3px rgba(0,0,0,0.08)',\n border: '1px solid #E5E7EB',\n boxSizing: 'border-box',\n padding: '3px 4px',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: color,\n flexShrink: 0,\n }}\n >\n <Icon icon={iconName} color=\"#fff\" width={8} height={8} />\n </div>\n <span\n style={{\n fontSize: '9px',\n fontWeight: 700,\n color,\n whiteSpace: 'nowrap',\n lineHeight: 1,\n }}\n >\n {label}\n </span>\n </div>\n </foreignObject>\n );\n}\n\ntype SVGTextAnchor = 'inherit' | 'start' | 'middle' | 'end';\n\ntype MultiLineTickProps = {\n x?: number;\n y?: number;\n payload?: { value: string };\n angle?: number;\n dx?: number;\n style?: Record<string, string | number>;\n textAnchor?: SVGTextAnchor;\n fontSize?: number;\n};\n\nfunction MultiLineTick({\n x = 0,\n y = 0,\n payload,\n angle = -38,\n dx = 0,\n style,\n textAnchor = 'end',\n fontSize = 12,\n}: MultiLineTickProps): React.ReactElement | null {\n if (!payload?.value) return null;\n const lines = String(payload.value).split('\\n');\n const lineHeight = fontSize * 1.3;\n const isHorizontal = angle === 0;\n const anchor: SVGTextAnchor = isHorizontal ? 'middle' : textAnchor;\n const dy0 = isHorizontal ? lineHeight * 0.35 : 4;\n\n return (\n <g transform={`translate(${x + dx},${y})`}>\n <text\n transform={`rotate(${angle})`}\n textAnchor={anchor}\n fontSize={fontSize}\n fill=\"#666\"\n {...style}\n >\n {lines.map((line, i) => (\n <tspan key={i} x={0} dy={i === 0 ? dy0 : lineHeight}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ntype GenderTooltipProps = TooltipContentProps & {\n categoryLabel: string;\n overallLabel: string;\n seriesLabels: { male: string; female: string };\n seriesColors: { male: string; female: string };\n tooltipStyles?: FootfallByGenderTooltipStyles;\n};\n\nfunction GenderTooltip({\n active,\n payload,\n label,\n categoryLabel,\n overallLabel,\n seriesLabels,\n seriesColors,\n tooltipStyles,\n}: GenderTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const maleEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === 'male'\n );\n const femaleEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === 'female'\n );\n const male = Number(maleEntry?.value ?? 0);\n const female = Number(femaleEntry?.value ?? 0);\n const total = male + female;\n\n const ts = tooltipStyles;\n const sectionBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: '8px',\n };\n\n return (\n <div\n style={mergeCss(\n {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'stretch',\n },\n ts?.wrapper\n )}\n >\n <div\n style={{\n position: 'absolute',\n left: -6,\n top: 18,\n width: 0,\n height: 0,\n borderTop: '6px solid transparent',\n borderBottom: '6px solid transparent',\n borderRight: '7px solid #fff',\n zIndex: 1,\n filter: 'drop-shadow(-1px 0 0 #E8E8E8)',\n }}\n aria-hidden\n />\n <div\n style={mergeCss(\n {\n position: 'relative',\n zIndex: 2,\n backgroundColor: 'white',\n borderRadius: '8px',\n padding: '10px 12px 10px',\n width: 'max-content',\n maxWidth: 200,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n { ...sectionBase, marginBottom: '8px' },\n ts?.sectionRow\n )}\n >\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {categoryLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {label}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {overallLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {total.toLocaleString()}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: seriesColors.male,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.seriesName\n )}\n >\n {seriesLabels.male}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {male.toLocaleString()}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: seriesColors.female,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.seriesName\n )}\n >\n {seriesLabels.female}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {female.toLocaleString()}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction resolveCategoryScroll(\n minWidthPerCategory: number,\n horizontalScroll: FootfallByGenderHorizontalScroll,\n categoryCount: number\n): boolean {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScroll === 'off') {\n return false;\n }\n if (horizontalScroll === 'on') {\n return true;\n }\n return categoryCount > 1;\n}\n\n/**\n * Grouped bar chart: two series (male / female) per category, with hover dimming and a custom tooltip.\n */\nexport function FootfallByGender({\n title,\n data,\n isLoading = false,\n seriesLabels: seriesLabelsProp,\n seriesColors: seriesColorsProp,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barGap = 0,\n showLegend = true,\n showBarValueLabels = true,\n showGrowthBadges = false,\n dimmedBarOpacity = 0.3,\n hoveredBarOpacity = 0.9,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendOverlaySx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartViewportSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipCategoryLabel = 'Region',\n tooltipOverallLabel = 'Overall Walk-ins',\n tooltipStyles,\n renderTooltip,\n chartMargin: chartMarginProp,\n yAxisTickDx = -6,\n yAxisTickStyle,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n yAxisTickFormatter,\n xAxisTickAngle = 0,\n xAxisTickDx = 0,\n xAxisTickStyle,\n barValueLabelAngle = 0,\n growthBadgeWidth = 45,\n growthBadgeHeight = 38,\n growthBadgeOffsetY = 35,\n}: FootfallByGenderProps) {\n const seriesLabels = { ...defaultSeriesLabels, ...seriesLabelsProp };\n const seriesColors = { ...defaultSeriesColors, ...seriesColorsProp };\n\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n\n const handleMouseEnter = React.useCallback((_: unknown, index: number) => {\n setActiveIndex(index);\n }, []);\n\n const handleMouseLeave = React.useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo((): FootfallByGenderRow[] => {\n return data.map(row => ({ ...row }));\n }, [data]);\n\n const hasMaleBar = React.useMemo(\n () => processedData.some(r => typeof r.male === 'number' && r.male > 0),\n [processedData]\n );\n const hasFemaleBar = React.useMemo(\n () => processedData.some(r => typeof r.female === 'number' && r.female > 0),\n [processedData]\n );\n const showMaleLegend = React.useMemo(\n () => processedData.some(r => typeof r.male === 'number'),\n [processedData]\n );\n const showFemaleLegend = React.useMemo(\n () => processedData.some(r => typeof r.female === 'number'),\n [processedData]\n );\n const visibleBarCount = (hasMaleBar ? 1 : 0) + (hasFemaleBar ? 1 : 0) || 1;\n\n const hasGrowthBadges = React.useMemo(\n () =>\n showGrowthBadges &&\n processedData.some(r => Number.isFinite(r.ffGrowthPercent)),\n [showGrowthBadges, processedData]\n );\n\n const categoryScrollActive = React.useMemo(\n () =>\n resolveCategoryScroll(\n minWidthPerCategory,\n horizontalScrollProp,\n processedData.length\n ),\n [horizontalScrollProp, minWidthPerCategory, processedData.length]\n );\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n // Recharts v2 applies barCategoryGap on BOTH sides of the band:\n // originalSize = (bandSize - 2 × barCategoryGap - barGap × (len-1)) / len\n // For bars of width `targetBarWidth` with no inner gap between Male and Female\n // we need originalSize === targetBarWidth, so:\n // barCategoryGap = (bandSize - 2 × targetBarWidth - barGap) / 2\n // For dense charts where bandSize is already small, clamp to 0.\n const targetBarWidth = maxBarSizeProp ?? defaultMaxBarThickness;\n\n const resolvedBarCategoryGapPx = React.useMemo(() => {\n const effectiveWidth = chartWidthPx > 0 ? chartWidthPx : containerWidth;\n if (effectiveWidth <= 0) return 4;\n const n = Math.max(processedData.length, 1);\n const plotWidth = effectiveWidth - chartWidthAxisGutter;\n const bandSize = plotWidth / n;\n const gapBetweenBars = visibleBarCount > 1 ? barGap : 0;\n return Math.max(\n 0,\n (bandSize - targetBarWidth * visibleBarCount - gapBetweenBars) / 2\n );\n }, [\n processedData.length,\n chartWidthPx,\n containerWidth,\n barGap,\n targetBarWidth,\n visibleBarCount,\n ]);\n\n // maxBarSize must be ≥ targetBarWidth so it doesn't cause Recharts to\n // center each bar inside its originalSize slot (which creates a visible gap).\n const resolvedMaxBarSize = targetBarWidth;\n\n const chartMargin = React.useMemo(() => {\n let top: number;\n if (hasGrowthBadges) top = topReserveForGrowthBadges;\n else if (showBarValueLabels) top = topReserveForBarLabels;\n else top = topReserveNoBarLabels;\n if (chartMarginProp) return chartMarginProp;\n return { ...defaultChartMargin, top };\n }, [hasGrowthBadges, showBarValueLabels, chartMarginProp]);\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const yAxisTick = yAxisTickFormatter ?? formatYAxisTickDefault;\n\n const barOpacity = (index: number) =>\n activeIndex === null || activeIndex === index\n ? hoveredBarOpacity\n : dimmedBarOpacity;\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n },\n chartViewportSx\n )}\n >\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n height: '100%',\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height=\"100%\" />\n ) : processedData.length > 0 ? (\n <BarChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n barGap={barGap}\n barCategoryGap={resolvedBarCategoryGapPx}\n maxBarSize={resolvedMaxBarSize}\n onMouseLeave={handleMouseLeave}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n interval={0}\n height={68}\n tickMargin={10}\n tick={\n <MultiLineTick\n angle={xAxisTickAngle}\n dx={xAxisTickDx}\n style={xAxisTickStyle}\n />\n }\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n width={52}\n dx={yAxisTickDx}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400, ...yAxisTickStyle }}\n tickFormatter={yAxisTick}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n allowEscapeViewBox={{ x: true, y: true }}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n } satisfies FootfallByGenderTooltipRenderContext);\n return customTooltip == null ? null : (\n <>{customTooltip}</>\n );\n }\n return (\n <GenderTooltip\n {...tooltipProps}\n categoryLabel={tooltipCategoryLabel}\n overallLabel={tooltipOverallLabel}\n seriesLabels={seriesLabels}\n seriesColors={seriesColors}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n {hasMaleBar ? (\n <Bar\n dataKey=\"male\"\n name={seriesLabels.male}\n fill={seriesColors.male}\n barSize={resolvedMaxBarSize}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`m-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n dataKey=\"male\"\n position=\"top\"\n offset={10}\n fill={chartColors.barValueLabelFill}\n fontSize={12}\n fontWeight={500}\n angle={barValueLabelAngle}\n formatter={label => formatBarLabel(Number(label))}\n />\n ) : null}\n {hasGrowthBadges ? (\n <LabelList\n dataKey=\"male\"\n content={labelProps => (\n <GrowthBadgeLabel\n {...(labelProps as RechartsBarLabelListProps)}\n rows={processedData}\n barGap={barGap}\n series=\"male\"\n badgeWidth={growthBadgeWidth}\n badgeHeight={growthBadgeHeight}\n badgeOffsetY={growthBadgeOffsetY}\n />\n )}\n />\n ) : null}\n </Bar>\n ) : null}\n {hasFemaleBar ? (\n <Bar\n dataKey=\"female\"\n name={seriesLabels.female}\n fill={seriesColors.female}\n barSize={resolvedMaxBarSize}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`f-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n dataKey=\"female\"\n position=\"top\"\n offset={10}\n fill={chartColors.barValueLabelFill}\n fontSize={12}\n fontWeight={500}\n angle={barValueLabelAngle}\n formatter={label => formatBarLabel(Number(label))}\n />\n ) : null}\n {hasGrowthBadges ? (\n <LabelList\n dataKey=\"female\"\n content={labelProps => (\n <GrowthBadgeLabel\n {...(labelProps as RechartsBarLabelListProps)}\n rows={processedData}\n barGap={barGap}\n series=\"female\"\n badgeWidth={growthBadgeWidth}\n badgeHeight={growthBadgeHeight}\n badgeOffsetY={growthBadgeOffsetY}\n />\n )}\n />\n ) : null}\n </Bar>\n ) : null}\n </BarChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n {showLegend && !isLoading && processedData.length > 0 ? (\n <Box\n component=\"ul\"\n sx={sxChain(\n {\n position: 'absolute',\n top: 6,\n right: 10,\n zIndex: 2,\n listStyle: 'none',\n m: 0,\n p: 0,\n pl: 1,\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n pointerEvents: 'none',\n },\n legendOverlaySx\n )}\n >\n {showMaleLegend ? (\n <Box\n component=\"li\"\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n },\n legendItemSx\n )}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n borderRadius: '3px',\n bgcolor: seriesColors.male,\n flexShrink: 0,\n },\n legendSwatchSx\n )}\n />\n <Typography\n component=\"span\"\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {seriesLabels.male}\n </Typography>\n </Box>\n ) : null}\n {showFemaleLegend ? (\n <Box\n component=\"li\"\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n },\n legendItemSx\n )}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n borderRadius: '3px',\n bgcolor: seriesColors.female,\n flexShrink: 0,\n },\n legendSwatchSx\n )}\n />\n <Typography\n component=\"span\"\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {seriesLabels.female}\n </Typography>\n </Box>\n ) : null}\n </Box>\n ) : null}\n </Box>\n </Stack>\n </Box>\n );\n}\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n CartesianGrid,\n Cell,\n ComposedChart,\n LabelList,\n Line,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { useChartPlotScrollToEnd } from '../../_chart/useChartPlotScrollToEnd';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n PasserbyConversionChartColors,\n PasserbyConversionProps,\n PasserbyConversionRow,\n PasserbyConversionTooltipRenderContext,\n PasserbyConversionTooltipStyles,\n} from './PasserbyConversion.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_PASSERBY_CHART_MARGIN = {\n top: 16,\n right: 8,\n left: 6,\n bottom: 0,\n} as const;\nconst OLY_DEFAULT_PASSERBY_CHART_SERIES_COLORS = {\n passerbyBarFill: '#FFCC4D',\n walkInsBarFill: '#008099',\n conversionLineStroke: '#6B4C84',\n barValueLabelFill: '#374151',\n} as const;\n\nconst PASSERBY_KEY = 'passerby';\nconst WALKINS_KEY = 'walkIns';\nconst CONVERSION_KEY = 'conversion';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\ntype SVGTextAnchor = 'inherit' | 'start' | 'middle' | 'end';\n\ntype MultiLineTickProps = {\n x?: number;\n y?: number;\n payload?: { value: string };\n angle?: number;\n dx?: number;\n style?: Record<string, string | number>;\n textAnchor?: SVGTextAnchor;\n fontSize?: number;\n};\n\nfunction MultiLineTick({\n x = 0,\n y = 0,\n payload,\n angle = -42,\n dx = 0,\n style,\n textAnchor = 'end',\n fontSize = 12,\n}: MultiLineTickProps): React.ReactElement | null {\n if (!payload?.value) return null;\n const lines = String(payload.value).split('\\n');\n const lineHeight = fontSize * 1.3;\n const isHorizontal = angle === 0;\n const anchor: SVGTextAnchor = isHorizontal ? 'middle' : textAnchor;\n const dy0 = isHorizontal ? lineHeight * 0.35 : 4;\n\n return (\n <g transform={`translate(${x + dx},${y})`}>\n <text\n transform={`rotate(${angle})`}\n textAnchor={anchor}\n fontSize={fontSize}\n fill=\"#666\"\n {...style}\n >\n {lines.map((line, i) => (\n <tspan key={i} x={0} dy={i === 0 ? dy0 : lineHeight}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction BarTopLabel({\n x,\n y,\n width,\n value,\n fill,\n}: RechartsBarLabelListProps & { fill: string }) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 10;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(n)}\n </text>\n );\n}\n\nfunction tooltipDatumFromPayload(\n payload: TooltipContentProps['payload']\n): PasserbyConversionRow | undefined {\n const raw = payload?.[0]?.payload;\n if (\n raw &&\n typeof raw === 'object' &&\n PASSERBY_KEY in raw &&\n WALKINS_KEY in raw\n ) {\n return raw as PasserbyConversionRow;\n }\n return undefined;\n}\n\ntype ConversionTooltipProps = TooltipContentProps & {\n timeLabel: string;\n overallLabel: string;\n walkInsLabel: string;\n passerbyLabel: string;\n conversionLabel: string;\n formatConversion: (value: number) => string;\n colors: { walkIns: string; passerby: string; conversion: string };\n showConversionRow: boolean;\n tooltipStyles?: PasserbyConversionTooltipStyles;\n};\n\nfunction ConversionTooltip({\n active,\n payload,\n label,\n timeLabel,\n overallLabel,\n walkInsLabel,\n passerbyLabel,\n conversionLabel,\n formatConversion,\n colors,\n showConversionRow,\n tooltipStyles,\n}: ConversionTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const datum = tooltipDatumFromPayload(payload);\n const passerbyEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === PASSERBY_KEY\n );\n const walkEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === WALKINS_KEY\n );\n const passerby = Number(passerbyEntry?.value ?? 0);\n const walkIns = Number(walkEntry?.value ?? 0);\n const overall = passerby + walkIns;\n\n const timeDisplay =\n datum?.timeSlotLabel !== undefined && datum.timeSlotLabel !== ''\n ? datum.timeSlotLabel\n : String(label);\n\n const convRaw = datum?.conversion;\n const conversion =\n typeof convRaw === 'number' && Number.isFinite(convRaw) ? convRaw : NaN;\n const showConv = showConversionRow && Number.isFinite(conversion);\n\n const ts = tooltipStyles;\n const rowBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 6,\n rowGap: 2,\n marginBottom: 8,\n };\n const labelStyle = mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 700 },\n ts?.label\n );\n const valueStyle = mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.value\n );\n const dotBase = mergeCss(\n {\n width: 10,\n height: 10,\n borderRadius: '50%',\n flexShrink: 0,\n },\n ts?.seriesDot\n );\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: '#fff',\n borderRadius: 8,\n padding: '12px 14px',\n width: 'max-content',\n maxWidth: 220,\n minWidth: 0,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{timeLabel}:</span>\n <span style={valueStyle}>{timeDisplay}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{overallLabel}:</span>\n <span style={valueStyle}>{overall.toLocaleString()}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.walkIns })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {walkInsLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {walkIns.toLocaleString()}\n </span>\n </div>\n <div\n style={mergeCss(\n { ...rowBase, marginBottom: showConv ? 8 : 0 },\n ts?.row\n )}\n >\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.passerby })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {passerbyLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {passerby.toLocaleString()}\n </span>\n </div>\n {showConv ? (\n <div style={mergeCss({ ...rowBase, marginBottom: 0 }, ts?.row)}>\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.conversion })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {conversionLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {formatConversion(conversion)}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst defaultMinWidthPerCategory = 56;\nconst defaultMaxBarThickness = 28;\nconst chartWidthAxisGutter = 108;\n\nconst defaultChartMargin = OLY_DEFAULT_PASSERBY_CHART_MARGIN;\n\nconst topReserveForBarLabels = 52;\nconst topReserveNoBarLabels = 22;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n ...OLY_DEFAULT_PASSERBY_CHART_SERIES_COLORS,\n} as const;\n\nfunction defaultFormatTooltipConversion(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nexport function PasserbyConversion({\n title,\n data,\n isLoading = false,\n timeSlots,\n fillMissingTimeSlots = true,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n passerbySeriesName = 'Passerby',\n walkInsSeriesName = 'Walk-ins',\n conversionSeriesName = 'Conversion',\n lineType = 'natural',\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barGap = 0,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipTimeLabel = 'Time',\n tooltipOverallLabel = 'Overall',\n tooltipWalkInsLabel,\n tooltipPasserbyLabel,\n tooltipConversionLabel = 'Conversion(%)',\n formatTooltipConversion = defaultFormatTooltipConversion,\n conversionAxisLabel,\n yAxisTickFormatter,\n conversionAxisTickFormatter,\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n showConversionLine: showConversionLineProp,\n showBarValueLabels = true,\n chartMargin: chartMarginProp,\n yAxisTickDx = -8,\n yAxisTickStyle,\n conversionAxisTickDx = 0,\n conversionAxisTickStyle,\n rightYAxisTickDx,\n rightYAxisTickStyle,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n scrollChartToEndOnDataChange = true,\n xAxisTickAngle = 0,\n xAxisTickDx = 0,\n xAxisTickStyle,\n}: PasserbyConversionProps) {\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n\n const handleBarMouseEnter = React.useCallback((_: unknown, index: number) => {\n setActiveIndex(index);\n }, []);\n\n const handleChartMouseLeave = React.useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo(() => {\n const clone = data.map(row => ({ ...row }));\n if (!timeSlots || !fillMissingTimeSlots) {\n return clone;\n }\n const byName = new Map(clone.map(r => [r.name, r] as const));\n return timeSlots.map(slot => {\n const existing = byName.get(slot.name);\n if (existing) return existing;\n return {\n name: slot.name,\n timeSlotLabel: slot.timeSlotLabel ?? slot.name,\n passerby: 0,\n walkIns: 0,\n conversion: null,\n };\n });\n }, [data, timeSlots, fillMissingTimeSlots]);\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row => {\n const conversionValue =\n typeof row.conversion === 'number' && Number.isFinite(row.conversion)\n ? row.conversion\n : 0;\n return row.passerby > 0 || row.walkIns > 0 || conversionValue !== 0;\n }),\n [processedData]\n );\n\n const hasConversionData = React.useMemo(\n () =>\n processedData.some(\n r => typeof r.conversion === 'number' && Number.isFinite(r.conversion)\n ),\n [processedData]\n );\n\n const showConversionLine =\n showConversionLineProp !== undefined\n ? showConversionLineProp\n : hasConversionData;\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useChartPlotScrollToEnd(scrollRef, {\n enabled: scrollChartToEndOnDataChange,\n categoryScrollActive,\n dataLength: processedData.length,\n dataVersion: processedData,\n });\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n // Recharts v2 applies barCategoryGap on BOTH sides of the band:\n // originalSize = (bandSize - 2 × barCategoryGap - barGap × (len-1)) / len\n // For bars of width `targetBarWidth` with no inner gap between Passerby and\n // Walk-ins we need originalSize === targetBarWidth, so:\n // barCategoryGap = (bandSize - 2 × targetBarWidth - barGap) / 2\n // For dense charts where bandSize is already small, clamp to 0.\n const targetBarWidth = maxBarSizeProp ?? defaultMaxBarThickness;\n\n // Actual horizontal chrome that eats into plot width:\n // left margin (4) + left YAxis (44) + (right YAxis 44 when conversion line shown)\n // + right margin (52 with conversion line, 8 without).\n // Underestimating this caused Recharts' real bandSize to be smaller than ours,\n // which in turn made the resolved `barCategoryGap` too large and bars to shrink\n // below `maxBarSize` — so the `n=1` and `n=2` cases produced different widths.\n const resolvedPlotGutterPx = React.useMemo(() => {\n const leftAxisWidth = 44;\n const rightAxisWidth = showConversionLine ? 44 : 0;\n const leftMargin = chartMarginProp?.left ?? defaultChartMargin.left;\n const rightMargin =\n chartMarginProp?.right ??\n (showConversionLine ? 52 : defaultChartMargin.right);\n return leftMargin + leftAxisWidth + rightAxisWidth + rightMargin;\n }, [showConversionLine, chartMarginProp]);\n\n const resolvedBarCategoryGapPx = React.useMemo(() => {\n const effectiveWidth = chartWidthPx > 0 ? chartWidthPx : containerWidth;\n if (effectiveWidth <= 0) return 4;\n const n = Math.max(processedData.length, 1);\n const plotWidth = effectiveWidth - resolvedPlotGutterPx;\n const bandSize = plotWidth / n;\n const numericBarGap = typeof barGap === 'number' ? barGap : 0;\n return Math.max(0, (bandSize - targetBarWidth * 2 - numericBarGap) / 2);\n }, [\n processedData.length,\n chartWidthPx,\n containerWidth,\n barGap,\n targetBarWidth,\n resolvedPlotGutterPx,\n ]);\n\n const resolvedMaxBarSize = targetBarWidth;\n\n const chartColors = React.useMemo(\n (): Required<PasserbyConversionChartColors> => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n const right = showConversionLine ? 52 : defaultChartMargin.right;\n if (chartMarginProp) return chartMarginProp;\n return { ...defaultChartMargin, top, right };\n }, [showBarValueLabels, showConversionLine, chartMarginProp]);\n\n const yTickLeft = yAxisTickFormatter ?? formatYAxisTickDefault;\n const yTickRight = conversionAxisTickFormatter ?? formatYAxisTickDefault;\n\n const barFillOpacity = React.useCallback(\n (index: number) =>\n activeIndex === null || activeIndex === index ? 1 : 0.38,\n [activeIndex]\n );\n\n const resolvedWalkInsTooltipLabel = tooltipWalkInsLabel ?? walkInsSeriesName;\n const resolvedPasserbyTooltipLabel =\n tooltipPasserbyLabel ?? passerbySeriesName;\n\n const legendItems = React.useMemo(() => {\n const items: {\n key: string;\n label: string;\n color: string;\n isLine?: boolean;\n }[] = [\n {\n key: 'walkins',\n label: walkInsSeriesName,\n color: chartColors.walkInsBarFill,\n },\n {\n key: 'passerby',\n label: passerbySeriesName,\n color: chartColors.passerbyBarFill,\n },\n ];\n if (showConversionLine) {\n items.push({\n key: 'conversion',\n label: conversionSeriesName,\n color: chartColors.conversionLineStroke,\n isLine: true,\n });\n }\n return items;\n }, [\n passerbySeriesName,\n walkInsSeriesName,\n conversionSeriesName,\n chartColors.walkInsBarFill,\n chartColors.passerbyBarFill,\n chartColors.conversionLineStroke,\n showConversionLine,\n ]);\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n width: '100%',\n minWidth: 0,\n },\n titleRowSx\n )}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'left',\n flex: 1,\n minWidth: 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0, display: 'flex', alignItems: 'center' }}>\n {headerActions}\n </Box>\n ) : null}\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend &&\n !isLoading &&\n hasMeaningfulData &&\n legendItems.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {legendItems.map(item => (\n <Stack\n key={item.key}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n {item.isLine ? (\n <Box\n sx={sxChain(\n {\n width: 16,\n height: 3,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: 0.5,\n alignSelf: 'center',\n },\n legendSwatchSx\n )}\n />\n ) : (\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n )}\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {item.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height=\"100%\" />\n ) : hasMeaningfulData ? (\n <ComposedChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n barGap={barGap}\n barCategoryGap={resolvedBarCategoryGapPx}\n style={{ overflow: 'visible' }}\n onMouseLeave={handleChartMouseLeave}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n xAxisId=\"bottom\"\n interval={0}\n height={68}\n tickMargin={10}\n tick={\n <MultiLineTick\n angle={xAxisTickAngle}\n dx={xAxisTickDx}\n style={xAxisTickStyle}\n />\n }\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n yAxisId=\"left\"\n dx={yAxisTickDx}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400, ...yAxisTickStyle }}\n tickFormatter={yTickLeft}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n width={44}\n />\n {showConversionLine ? (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n dx={rightYAxisTickDx ?? conversionAxisTickDx}\n tickSize={8}\n tick={{\n fontSize: 12,\n fontWeight: 400,\n ...(rightYAxisTickStyle ?? conversionAxisTickStyle),\n }}\n tickFormatter={yTickRight}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n width={44}\n {...(conversionAxisLabel\n ? {\n label: {\n value: conversionAxisLabel,\n angle: 90,\n position: 'insideRight' as const,\n offset: 8,\n style: {\n fill: '#424242',\n fontSize: 11,\n fontWeight: 500,\n textAnchor: 'middle' as const,\n },\n },\n }\n : {})}\n />\n ) : null}\n <Tooltip\n cursor={false}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n showConversionLine,\n } satisfies PasserbyConversionTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <ConversionTooltip\n {...tooltipProps}\n timeLabel={tooltipTimeLabel}\n overallLabel={tooltipOverallLabel}\n walkInsLabel={resolvedWalkInsTooltipLabel}\n passerbyLabel={resolvedPasserbyTooltipLabel}\n conversionLabel={tooltipConversionLabel}\n formatConversion={formatTooltipConversion}\n colors={{\n walkIns: chartColors.walkInsBarFill,\n passerby: chartColors.passerbyBarFill,\n conversion: chartColors.conversionLineStroke,\n }}\n showConversionRow={showConversionLine}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n <Bar\n yAxisId=\"left\"\n xAxisId=\"bottom\"\n dataKey={PASSERBY_KEY}\n name={passerbySeriesName}\n fill={chartColors.passerbyBarFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n onMouseEnter={handleBarMouseEnter}\n >\n {processedData.map((_, i) => (\n <Cell\n key={`pb-${i}`}\n fill={chartColors.passerbyBarFill}\n fillOpacity={barFillOpacity(i)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n <Bar\n yAxisId=\"left\"\n xAxisId=\"bottom\"\n dataKey={WALKINS_KEY}\n name={walkInsSeriesName}\n fill={chartColors.walkInsBarFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n onMouseEnter={handleBarMouseEnter}\n >\n {processedData.map((_, i) => (\n <Cell\n key={`wi-${i}`}\n fill={chartColors.walkInsBarFill}\n fillOpacity={barFillOpacity(i)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n {showConversionLine ? (\n <Line\n yAxisId=\"right\"\n xAxisId=\"bottom\"\n type={lineType}\n dataKey={CONVERSION_KEY}\n name={conversionSeriesName}\n stroke={chartColors.conversionLineStroke}\n strokeWidth={2}\n dot={{\n r: 3,\n fill: chartColors.conversionLineStroke,\n strokeWidth: 0,\n }}\n connectNulls={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n />\n ) : null}\n </ComposedChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","import * as React from 'react';\n\n/**\n * When the plot is wider than the viewport (`overflow-x: auto`), scrolls horizontally\n * to the end after data updates so the latest categories stay in view.\n */\nexport function useChartPlotScrollToEnd(\n scrollRef: React.RefObject<HTMLElement | null>,\n options: {\n enabled: boolean;\n categoryScrollActive: boolean;\n dataLength: number;\n /** Triggers when row content changes (e.g. pass `processedData`). */\n dataVersion: unknown;\n }\n): void {\n const { enabled, categoryScrollActive, dataLength, dataVersion } = options;\n\n React.useLayoutEffect(() => {\n if (!enabled) {\n return;\n }\n if (!categoryScrollActive) {\n return;\n }\n if (dataLength === 0) {\n return;\n }\n const el = scrollRef.current;\n if (!el) {\n return;\n }\n const scrollToEnd = (): void => {\n el.scrollLeft = Math.max(0, el.scrollWidth - el.clientWidth);\n };\n scrollToEnd();\n requestAnimationFrame(scrollToEnd);\n }, [enabled, categoryScrollActive, dataLength, dataVersion, scrollRef]);\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type {\n WalkinAnalysisCardMaxWidth,\n WalkinAnalysisPieSize,\n WalkinAnalysisProps,\n WalkinAnalysisSlice,\n WalkinAnalysisTooltipRenderContext,\n WalkinAnalysisTypography,\n} from './WalkinAnalysis.types';\n\nconst OLY_LIFESTYLE_STRONG_TITLE_COLOR = '#0f172a' as const;\nconst OLY_LIFESTYLE_LEGEND_VALUE_COLOR = '#64748B' as const;\n\nconst walkinPieSizeDefaults = { xs: 180, sm: 220, md: 260 } as const;\n\nfunction px(n: number): string {\n return `${n}px`;\n}\n\nfunction resolveFontSize(\n value: number | string | undefined,\n fallbackPx: number\n): number | string {\n if (value === undefined) return fallbackPx;\n if (typeof value === 'number') return value;\n return value;\n}\n\nfunction resolveCardMaxWidth(\n cardMaxWidth: WalkinAnalysisCardMaxWidth | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return px(cardMaxWidth);\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? px(cardMaxWidth.xs)\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? px(cardMaxWidth.sm)\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? px(cardMaxWidth.md)\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n\nfunction useWalkinResolvedPieSize(\n pieSize: WalkinAnalysisPieSize | undefined\n): number {\n const theme = useTheme();\n const mdUp = useMediaQuery(theme.breakpoints.up('md'));\n const smUp = useMediaQuery(theme.breakpoints.up('sm'));\n\n if (typeof pieSize === 'number') {\n return pieSize;\n }\n const merged = {\n xs: pieSize?.xs ?? walkinPieSizeDefaults.xs,\n sm: pieSize?.sm ?? walkinPieSizeDefaults.sm,\n md: pieSize?.md ?? walkinPieSizeDefaults.md,\n };\n if (mdUp) return merged.md;\n if (smUp) return merged.sm;\n return merged.xs;\n}\n\nconst numberFormatter = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 0,\n});\n\n/** Recharts `Pie` row: positive counts only (zero-count slices stay in the legend only). */\ntype WalkinPieDatum = Pick<\n WalkinAnalysisSlice,\n 'id' | 'label' | 'color' | 'segmentPercentColor'\n> & { value: number };\n\nfunction walkinSlicesToPieData(\n slices: WalkinAnalysisSlice[]\n): WalkinPieDatum[] {\n return slices\n .filter(s => s.count > 0)\n .map(s => ({\n id: s.id,\n label: s.label,\n value: s.count,\n color: s.color,\n segmentPercentColor: s.segmentPercentColor,\n }));\n}\n\ntype WalkinPieTooltipProps = TooltipContentProps & {\n sliceTotal: number;\n titleFontSize: number | string;\n valueFontSize: number | string;\n};\n\nfunction WalkinPieTooltip({\n active,\n payload,\n sliceTotal,\n titleFontSize,\n valueFontSize,\n}: WalkinPieTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length) {\n return null;\n }\n const first = payload[0] as TooltipPayloadEntry;\n const datum = first.payload as WalkinPieDatum | undefined;\n if (!datum || typeof datum.value !== 'number') {\n return null;\n }\n const pct = sliceTotal > 0 ? Math.round((datum.value / sliceTotal) * 100) : 0;\n return (\n <Box\n sx={{\n bgcolor: '#fff',\n borderRadius: 1,\n px: 1.5,\n py: 1.25,\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n border: '1px solid #E8E8E8',\n minWidth: 168,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 0.75 }}>\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: 0.5,\n bgcolor: datum.color,\n flexShrink: 0,\n }}\n />\n <Typography\n sx={{\n fontSize: titleFontSize,\n fontWeight: 700,\n color: OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n lineHeight: 1.3,\n }}\n >\n {datum.label}\n </Typography>\n </Stack>\n <Typography\n variant=\"body2\"\n sx={{\n color: OLY_LIFESTYLE_LEGEND_VALUE_COLOR,\n fontSize: valueFontSize,\n }}\n >\n {numberFormatter.format(datum.value)} ({pct}%)\n </Typography>\n </Box>\n );\n}\n\nfunction WalkinPiePercentLabel(props: {\n cx?: number;\n cy?: number;\n midAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n percent?: number;\n payload?: WalkinPieDatum;\n fontSize: number | string;\n}): React.ReactElement | null {\n const {\n cx: cxProp,\n cy: cyProp,\n midAngle: midProp,\n innerRadius: innerProp,\n outerRadius: outerProp,\n percent: percentProp,\n payload,\n fontSize,\n } = props;\n const cx = cxProp ?? 0;\n const cy = cyProp ?? 0;\n const midAngle = midProp ?? 0;\n const innerRadius = innerProp ?? 0;\n const outerRadius = outerProp ?? 0;\n const percent = percentProp ?? 0;\n const rounded = Math.round(percent * 100);\n if (rounded <= 0) {\n return null;\n }\n const labelRadius = innerRadius + (outerRadius - innerRadius) * 0.58;\n const rad = (-midAngle * Math.PI) / 180;\n const x = cx + labelRadius * Math.cos(rad);\n const y = cy + labelRadius * Math.sin(rad);\n return (\n <text\n x={x}\n y={y}\n fill={payload?.segmentPercentColor ?? '#fff'}\n fontSize={fontSize}\n fontWeight={600}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n >\n {rounded}%\n </text>\n );\n}\n\nfunction WalkinPieChart({\n slices,\n size,\n typography,\n activeTabId,\n renderTooltip,\n emptyStatePlaceholderProps,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n}: {\n slices: WalkinAnalysisSlice[];\n size: number;\n typography: WalkinAnalysisTypography | undefined;\n activeTabId: string;\n renderTooltip?: WalkinAnalysisProps['renderTooltip'];\n emptyStatePlaceholderProps?: WalkinAnalysisProps['emptyStatePlaceholderProps'];\n isChartAnimationActive?: boolean;\n chartAnimationDuration?: number;\n}) {\n const total = slices.reduce((sum, s) => sum + s.count, 0);\n const pieData = React.useMemo(() => walkinSlicesToPieData(slices), [slices]);\n\n const piePercentSize = resolveFontSize(typography?.piePercent, 14);\n const tooltipTitleSize = resolveFontSize(typography?.tooltipTitle, 13);\n const tooltipValueSize = resolveFontSize(typography?.tooltipValue, 12);\n\n if (total <= 0) {\n return <ChartEmptyState minHeight={size} {...emptyStatePlaceholderProps} />;\n }\n\n const outerRadius = size * 0.42;\n\n return (\n <Box\n role=\"img\"\n aria-label=\"Walk-in analysis pie chart\"\n sx={{\n width: size,\n height: size,\n lineHeight: 0,\n '& .recharts-surface:focus': { outline: 'none' },\n }}\n >\n <ResponsiveContainer width={size} height={size}>\n <PieChart key={activeTabId}>\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n slices,\n total,\n activeTabId,\n } satisfies WalkinAnalysisTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <WalkinPieTooltip\n {...tooltipProps}\n sliceTotal={total}\n titleFontSize={tooltipTitleSize}\n valueFontSize={tooltipValueSize}\n />\n );\n }}\n wrapperStyle={{ outline: 'none', zIndex: 2 }}\n />\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"label\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={0}\n outerRadius={outerRadius}\n startAngle={90}\n endAngle={450}\n paddingAngle={0}\n stroke=\"none\"\n labelLine={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n label={labelProps => (\n <WalkinPiePercentLabel\n {...labelProps}\n fontSize={piePercentSize}\n />\n )}\n >\n {pieData.map(entry => (\n <Cell key={entry.id} fill={entry.color} stroke=\"none\" />\n ))}\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Walk-in style analysis card: title row (optional `headerActions`), tabs, Recharts pie, legend.\n * Pie and legend are driven by `slices` (`label`, `count`, `color`, optional legend / segment % colors).\n */\nexport const WalkinAnalysis = ({\n title,\n tabs,\n activeTabId,\n onTabChange,\n segmentedTabsFullWidth,\n segmentedTabsSx,\n slices,\n headerActions,\n cardSx,\n cardMaxWidth,\n pieSize,\n typography,\n customization,\n emptyStatePlaceholderProps,\n renderTooltip,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n}: WalkinAnalysisProps) => {\n const resolvedPieSize = useWalkinResolvedPieSize(pieSize);\n const total = slices.reduce((sum, s) => sum + s.count, 0);\n\n return (\n <Box\n sx={{\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n ...cardSx,\n }}\n >\n <Stack spacing={2.5}>\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n {...(customization?.titleRowStackSx != null\n ? {\n sx: [customization.titleRowStackSx] as SxProps<Theme>,\n }\n : {})}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={\n [\n {\n fontWeight: 700,\n color: OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n pr: 1,\n ...(typography?.title != null\n ? { fontSize: typography.title }\n : {}),\n },\n ...(customization?.titleSx != null\n ? [customization.titleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0 }}>{headerActions}</Box>\n ) : null}\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Analysis scope\"\n fullWidth={segmentedTabsFullWidth}\n tabFontSize={typography?.tabs}\n rootSx={segmentedTabsSx}\n />\n\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n spacing={3}\n alignItems=\"center\"\n justifyContent=\"flex-start\"\n sx={\n [\n { width: '100%' },\n ...(customization?.chartLegendRowSx != null\n ? [customization.chartLegendRowSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Box\n sx={\n [\n { flexShrink: 0, lineHeight: 0 },\n ...(customization?.pieChartBoxSx != null\n ? [customization.pieChartBoxSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <WalkinPieChart\n slices={slices}\n size={resolvedPieSize}\n typography={typography}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n emptyStatePlaceholderProps={emptyStatePlaceholderProps}\n isChartAnimationActive={isChartAnimationActive}\n chartAnimationDuration={chartAnimationDuration}\n />\n </Box>\n <Stack\n spacing={2}\n sx={\n [\n {\n flex: 1,\n minWidth: 0,\n alignSelf: { xs: 'stretch', sm: 'auto' },\n width: { xs: '100%', sm: 'auto' },\n },\n ...(customization?.legendColumnStackSx != null\n ? [customization.legendColumnStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {slices.map(slice => {\n const pct =\n total > 0 ? Math.round((slice.count / total) * 100) : 0;\n return (\n <Stack key={slice.id} spacing={0.75}>\n <Typography\n sx={\n [\n {\n fontStyle: 'italic',\n fontWeight: 700,\n color:\n slice.legendLabelColor ??\n OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n fontSize: resolveFontSize(\n typography?.legendLabel,\n 13\n ),\n },\n ...(customization?.legendTypographySx != null\n ? [customization.legendTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {slice.label}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Box\n sx={{\n width: 14,\n height: 14,\n borderRadius: 0.5,\n bgcolor: slice.color,\n flexShrink: 0,\n }}\n />\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color:\n slice.legendValueColor ??\n OLY_LIFESTYLE_LEGEND_VALUE_COLOR,\n fontSize: resolveFontSize(\n typography?.legendValue,\n 12\n ),\n },\n ...(customization?.legendTypographySx != null\n ? [customization.legendTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {numberFormatter.format(slice.count)} ({pct}%)\n </Typography>\n {slice.legendInfo ? (\n <Box sx={{ display: 'inline-flex', flexShrink: 0 }}>\n {slice.legendInfo}\n </Box>\n ) : null}\n </Stack>\n </Stack>\n );\n })}\n </Stack>\n </Stack>\n </Stack>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n CartesianGrid,\n ComposedChart,\n LabelList,\n Line,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { useChartPlotScrollToEnd } from '../../_chart/useChartPlotScrollToEnd';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n WalkinTrafficProps,\n WalkinTrafficRow,\n WalkinTrafficTooltipRenderContext,\n WalkinTrafficTooltipStyles,\n} from './WalkinTraffic.types';\n\nconst defaultFfGrowthTooltipFooterNote =\n \"*This FF Growth % compares today's hourly FF with the same hours on this date last year.\";\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_WALKIN_TRAFFIC_CHART_MARGIN = {\n top: 16,\n right: 8,\n left: 6,\n bottom: 0,\n} as const;\nconst OLY_DEFAULT_WALKIN_TRAFFIC_CHART_SERIES_COLORS = {\n barFill: '#0086A9',\n lineStroke: '#4B5563',\n barValueLabelFill: '#374151',\n} as const;\n\nfunction hasFooterText(note: string | null | undefined): note is string {\n return typeof note === 'string' && note.trim().length > 0;\n}\n\nfunction tooltipDatumFromPayload(\n payload: TooltipContentProps['payload']\n): WalkinTrafficRow | undefined {\n const raw = payload?.[0]?.payload;\n if (raw && typeof raw === 'object' && 'walkIns' in raw) {\n return raw as WalkinTrafficRow;\n }\n return undefined;\n}\n\nfunction GrowthDirectionIcon({ direction }: { direction: 'up' | 'down' }) {\n const bg = direction === 'up' ? '#22C55E' : '#EF4444';\n const glyph = direction === 'up' ? '▲' : '▼';\n return (\n <span\n style={{\n display: 'inline-flex',\n width: 16,\n height: 16,\n borderRadius: '50%',\n backgroundColor: bg,\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: 6,\n flexShrink: 0,\n }}\n aria-hidden\n >\n <span\n style={{\n color: '#fff',\n fontSize: 8,\n lineHeight: 1,\n transform: direction === 'up' ? undefined : 'translateY(0.5px)',\n }}\n >\n {glyph}\n </span>\n </span>\n );\n}\n\nconst BAR_KEY = 'walkIns';\nconst TREND_KEY = 'trend';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\ntype SVGTextAnchor = 'inherit' | 'start' | 'middle' | 'end';\n\ntype MultiLineTickProps = {\n x?: number;\n y?: number;\n payload?: { value: string };\n angle?: number;\n dx?: number;\n style?: Record<string, string | number>;\n textAnchor?: SVGTextAnchor;\n fontSize?: number;\n};\n\nfunction MultiLineTick({\n x = 0,\n y = 0,\n payload,\n angle = -42,\n dx = 0,\n style,\n textAnchor = 'end',\n fontSize = 12,\n}: MultiLineTickProps): React.ReactElement | null {\n if (!payload?.value) return null;\n const lines = String(payload.value).split('\\n');\n const lineHeight = fontSize * 1.3;\n const isHorizontal = angle === 0;\n const anchor: SVGTextAnchor = isHorizontal ? 'middle' : textAnchor;\n const dy0 = isHorizontal ? lineHeight * 0.35 : 4;\n\n return (\n <g transform={`translate(${x + dx},${y})`}>\n <text\n transform={`rotate(${angle})`}\n textAnchor={anchor}\n fontSize={fontSize}\n fill=\"#666\"\n {...style}\n >\n {lines.map((line, i) => (\n <tspan key={i} x={0} dy={i === 0 ? dy0 : lineHeight}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction BarTopLabel({\n x,\n y,\n width,\n value,\n fill,\n}: RechartsBarLabelListProps & { fill: string }) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 10;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(n)}\n </text>\n );\n}\n\ntype TrafficTooltipProps = TooltipContentProps & {\n tooltipTitle: string;\n timeLabel: string;\n currentYearLabel: string;\n lastYearLabel: string;\n growthLabel: string;\n footerNote: string | null | undefined;\n showTrendLine: boolean;\n accentColor: string;\n tooltipStyles?: WalkinTrafficTooltipStyles;\n};\n\nfunction TrafficTooltip({\n active,\n payload,\n label,\n tooltipTitle,\n timeLabel,\n currentYearLabel,\n lastYearLabel,\n growthLabel,\n footerNote,\n showTrendLine,\n accentColor,\n tooltipStyles,\n}: TrafficTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const datum = tooltipDatumFromPayload(payload);\n\n const barEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === BAR_KEY\n );\n const lineEntry = showTrendLine\n ? payload.find((p: TooltipPayloadEntry) => String(p.dataKey) === TREND_KEY)\n : undefined;\n\n const walk = Number(barEntry?.value ?? 0);\n const trendRaw = lineEntry?.value;\n const trend =\n typeof trendRaw === 'number'\n ? trendRaw\n : trendRaw === null || trendRaw === undefined\n ? NaN\n : Number(trendRaw);\n\n const timeDisplay =\n datum?.timeSlotLabel !== undefined && datum.timeSlotLabel !== ''\n ? datum.timeSlotLabel\n : String(label);\n\n const growthRaw = datum?.ffGrowthPercent;\n const growth =\n typeof growthRaw === 'number' && Number.isFinite(growthRaw)\n ? growthRaw\n : NaN;\n const showGrowthRow = Number.isFinite(growth);\n const growthDirection: 'up' | 'down' | null = !showGrowthRow\n ? null\n : growth > 0\n ? 'up'\n : growth < 0\n ? 'down'\n : null;\n\n const showFooter = hasFooterText(footerNote) && showGrowthRow;\n const footerText =\n showFooter && typeof footerNote === 'string' ? footerNote.trim() : '';\n\n const ts = tooltipStyles;\n const rowBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'baseline',\n flexWrap: 'wrap',\n columnGap: 4,\n rowGap: 2,\n marginBottom: 6,\n };\n\n const labelStyle = mergeCss(\n { color: '#1a1a1a', fontSize: 11, fontWeight: 700 },\n ts?.label\n );\n const valueStyle = mergeCss(\n { color: '#757575', fontSize: 11, fontWeight: 400 },\n ts?.value\n );\n\n return (\n <div\n style={mergeCss(\n {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'stretch',\n },\n ts?.wrapper\n )}\n >\n <div\n style={{\n position: 'absolute',\n left: -6,\n top: 18,\n width: 0,\n height: 0,\n borderTop: '6px solid transparent',\n borderBottom: '6px solid transparent',\n borderRight: '7px solid #fff',\n zIndex: 1,\n filter: 'drop-shadow(-1px 0 0 #E8E8E8)',\n }}\n aria-hidden\n />\n <div\n style={mergeCss(\n {\n position: 'relative',\n zIndex: 2,\n backgroundColor: '#fff',\n borderRadius: 8,\n padding: '10px 12px 10px',\n width: 'max-content',\n maxWidth: 200,\n minWidth: 0,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n marginBottom: 8,\n },\n ts?.header\n )}\n >\n <span\n style={mergeCss(\n {\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: accentColor,\n flexShrink: 0,\n },\n ts?.headerDot\n )}\n />\n <span\n style={mergeCss(\n {\n color: '#1a1a1a',\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.25,\n },\n ts?.headerTitle\n )}\n >\n {tooltipTitle}\n </span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{timeLabel}:</span>\n <span style={valueStyle}>{timeDisplay}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{currentYearLabel}:</span>\n <span style={valueStyle}>\n {Number.isFinite(walk) ? walk.toLocaleString() : '—'}\n </span>\n </div>\n {showTrendLine && Number.isFinite(trend) ? (\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{lastYearLabel}:</span>\n <span style={valueStyle}>{trend.toLocaleString()}</span>\n </div>\n ) : null}\n {showGrowthRow ? (\n <div\n style={mergeCss(\n {\n ...rowBase,\n alignItems: 'center',\n marginBottom: showFooter ? 8 : 0,\n },\n ts?.row\n )}\n >\n <span style={labelStyle}>{growthLabel}:</span>\n <span style={valueStyle}>\n {`${Number.isInteger(growth) ? String(growth) : growth.toFixed(1)}%`}\n </span>\n {growthDirection ? (\n <GrowthDirectionIcon direction={growthDirection} />\n ) : null}\n </div>\n ) : null}\n {showFooter ? (\n <p\n style={mergeCss(\n {\n margin: 0,\n paddingTop: 8,\n borderTop: '1px solid #ECECEC',\n color: '#8A8A8A',\n fontSize: 9,\n fontStyle: 'italic',\n lineHeight: 1.4,\n },\n ts?.footer\n )}\n >\n {footerText}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n\nconst defaultMinWidthPerCategory = 52;\nconst defaultMaxBarThickness = 36;\nconst chartWidthAxisGutter = 72;\n\nconst defaultChartMargin = OLY_DEFAULT_WALKIN_TRAFFIC_CHART_MARGIN;\n\nconst topReserveForBarLabels = 52;\nconst topReserveNoBarLabels = 22;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n ...OLY_DEFAULT_WALKIN_TRAFFIC_CHART_SERIES_COLORS,\n} as const;\n\nexport function WalkinTraffic({\n title,\n data,\n isLoading = false,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n barSeriesName = 'Walk-ins',\n lineSeriesName = 'Trend',\n lineType = 'natural',\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipTitle = 'Overall Walk-in Traffic',\n tooltipTimeLabel,\n tooltipCurrentYearLabel = 'This year',\n tooltipLastYearLabel = 'Last year',\n tooltipGrowthLabel = 'FF Growth%',\n tooltipFooterNote: tooltipFooterNoteProp,\n tooltipHourLabel,\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n showTrendLine: showTrendLineProp,\n showLineInLegend = false,\n showBarValueLabels = true,\n chartMargin: chartMarginProp,\n yAxisTickDx = -8,\n yAxisTickStyle,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n yAxisTickFormatter,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n scrollChartToEndOnDataChange = true,\n xAxisTickAngle = 0,\n xAxisTickDx = 0,\n xAxisTickStyle,\n}: WalkinTrafficProps) {\n const tooltipFooterNote =\n tooltipFooterNoteProp === undefined\n ? defaultFfGrowthTooltipFooterNote\n : tooltipFooterNoteProp;\n\n const processedData = React.useMemo(\n () => data.map(row => ({ ...row })),\n [data]\n );\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row => {\n const trendValue =\n typeof row.trend === 'number' && Number.isFinite(row.trend)\n ? row.trend\n : 0;\n return row.walkIns > 0 || trendValue !== 0;\n }),\n [processedData]\n );\n\n const hasTrendData = React.useMemo(\n () =>\n processedData.some(\n r => typeof r.trend === 'number' && Number.isFinite(r.trend)\n ),\n [processedData]\n );\n\n const showTrendLine =\n showTrendLineProp !== undefined ? showTrendLineProp : hasTrendData;\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useChartPlotScrollToEnd(scrollRef, {\n enabled: scrollChartToEndOnDataChange,\n categoryScrollActive,\n dataLength: processedData.length,\n dataVersion: processedData,\n });\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n if (chartMarginProp) return chartMarginProp;\n return { ...defaultChartMargin, top };\n }, [showBarValueLabels, chartMarginProp]);\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const yTick = yAxisTickFormatter ?? formatYAxisTickDefault;\n\n const resolvedTooltipTimeLabel =\n tooltipTimeLabel ?? tooltipHourLabel ?? 'Time';\n\n const legendItems = React.useMemo(() => {\n const items: {\n key: string;\n label: string;\n color: string;\n isLine?: boolean;\n }[] = [\n {\n key: 'bar',\n label: barSeriesName,\n color: chartColors.barFill,\n },\n ];\n if (showTrendLine && showLineInLegend) {\n items.push({\n key: 'line',\n label: lineSeriesName,\n color: chartColors.lineStroke,\n isLine: true,\n });\n }\n return items;\n }, [\n barSeriesName,\n chartColors.barFill,\n chartColors.lineStroke,\n lineSeriesName,\n showLineInLegend,\n showTrendLine,\n ]);\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend &&\n !isLoading &&\n hasMeaningfulData &&\n legendItems.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {legendItems.map(item => (\n <Stack\n key={item.key}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n {item.isLine ? (\n <Box\n sx={sxChain(\n {\n width: 16,\n height: 3,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: 0.5,\n alignSelf: 'center',\n },\n legendSwatchSx\n )}\n />\n ) : (\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n )}\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {item.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height=\"100%\" />\n ) : hasMeaningfulData ? (\n <ComposedChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n interval={0}\n height={68}\n tickMargin={10}\n tick={\n <MultiLineTick\n angle={xAxisTickAngle}\n dx={xAxisTickDx}\n style={xAxisTickStyle}\n />\n }\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n dx={yAxisTickDx}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400, ...yAxisTickStyle }}\n tickFormatter={yTick}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n showTrendLine,\n } satisfies WalkinTrafficTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <TrafficTooltip\n {...tooltipProps}\n tooltipTitle={tooltipTitle}\n timeLabel={resolvedTooltipTimeLabel}\n currentYearLabel={tooltipCurrentYearLabel}\n lastYearLabel={tooltipLastYearLabel}\n growthLabel={tooltipGrowthLabel}\n footerNote={tooltipFooterNote}\n showTrendLine={showTrendLine}\n accentColor={chartColors.barFill}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n <Bar\n dataKey={BAR_KEY}\n name={barSeriesName}\n fill={chartColors.barFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={[2, 2, 0, 0]}\n >\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n {showTrendLine ? (\n <Line\n type={lineType}\n dataKey={TREND_KEY}\n name={lineSeriesName}\n stroke={chartColors.lineStroke}\n strokeWidth={2}\n dot={false}\n connectNulls={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n />\n ) : null}\n </ComposedChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","/** Primary line + tooltip fill (violet). */\nexport const BILLING_COUNTER_LINE_PRIMARY = '#7C3AED' as const;\n\n/** Default pill track behind segmented tabs. */\nexport const BILLING_COUNTER_TABS_TRACK_BG = '#E8E8E8' as const;\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\nexport const DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n {\n title: 'Billing Counter Analytics',\n description:\n 'Trend lines for billing-counter visits, average queue time, and alerts. Switch tabs to compare metrics over the same date range.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'Track daily load at billing counters and spot spikes.',\n 'Monitor queue-time trends to adjust staffing.',\n 'See when alert volume rises relative to traffic.',\n ],\n };\n","import type { ChartWidgetSegmentedTab } from '../tabs/ChartWidgetSegmentedTabs';\nimport type { BillingCounterAnalyticsPoint } from './BillingCounterAnalytics.types';\n\nexport const billingCounterDefaultTabs: ChartWidgetSegmentedTab[] = [\n { id: 'visits', label: 'Billing Counter Visits' },\n { id: 'queue', label: 'Avg. Queue Time' },\n { id: 'alerts', label: 'Alerts Generated' },\n];\n\nconst X_LABELS = [\n 'Jan 12',\n 'Jan 13',\n 'Jan 14',\n 'Jan 15',\n 'Jan 16',\n 'Jan 17',\n 'Jan 18',\n 'Jan 19',\n 'Jan 20',\n 'Jan 21',\n 'Jan 22',\n 'Jan 23',\n 'Today',\n] as const;\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.min(hi, Math.max(lo, n));\n}\n\nfunction seriesForTab(\n phase: number,\n scale: number,\n bias: number\n): BillingCounterAnalyticsPoint[] {\n return X_LABELS.map((label, i) => {\n const wobble = Math.sin((i + phase) * 0.55) * scale;\n const ramp = i * 2.2;\n const raw = 52 + wobble + ramp * 0.15 + bias;\n return {\n label,\n value: clamp(Math.round(raw), 18, 98),\n };\n });\n}\n\n/** Demo datasets aligned with **billingCounterDefaultTabs** ids. */\nexport const billingCounterMockSeriesByTabId: Record<\n string,\n BillingCounterAnalyticsPoint[]\n> = {\n visits: seriesForTab(0, 22, 0),\n queue: seriesForTab(2.1, 18, -8),\n alerts: seriesForTab(4.2, 28, -18),\n};\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { ChartWidgetHeaderSeparator } from '../utils/ChartWidgetHeaderSeparator';\nimport { ChartWidgetInfoButton } from '../ChartWidgetInfoButton';\nimport { ChartWidgetSegmentedTabs } from '../tabs/ChartWidgetSegmentedTabs';\nimport { ChartEmptyState } from '../utils/ChartEmptyState';\nimport {\n BILLING_COUNTER_LINE_PRIMARY,\n BILLING_COUNTER_TABS_TRACK_BG,\n} from './billingCounterAnalytics.chartTokens';\nimport { DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER } from './billingCounterAnalytics.defaultInfoPopover';\nimport { mergeSx } from './billingCounterAnalyticsCustomization.merge';\nimport {\n BillingCounterAnalyticsCustomizationProvider,\n useBillingCounterAnalyticsCustomization,\n} from './BillingCounterAnalyticsCustomizationContext';\nimport type {\n BillingCounterAnalyticsProps,\n BillingCounterAnalyticsTooltipRenderContext,\n} from './BillingCounterAnalytics.types';\nimport { BillingCounterAnalyticsTooltip } from './BillingCounterAnalyticsTooltip';\n\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_CHART_AXIS_TICK_FILL = '#64748B' as const;\n\nfunction LinePlot({\n data,\n yAxisDomain,\n yAxisTicks,\n activeTabId,\n renderTooltip,\n}: {\n data: { label: string; value: number }[];\n yAxisDomain: [number, number];\n yAxisTicks: number[];\n activeTabId: string;\n renderTooltip?: BillingCounterAnalyticsProps['renderTooltip'];\n}): React.ReactElement {\n const { lineChart: lc } = useBillingCounterAnalyticsCustomization();\n const height = lc?.heightPx ?? 300;\n const lineColor = lc?.lineColor ?? BILLING_COUNTER_LINE_PRIMARY;\n const strokeW = lc?.lineStrokeWidth ?? 2;\n const gridStroke =\n lc?.gridStroke ?? OLY_DEFAULT_COMPOSED_CHART_CHROME.cartesianGridStroke;\n const dash = lc?.gridStrokeDasharray ?? '3 3';\n const m = {\n top: lc?.margin?.top ?? 12,\n right: lc?.margin?.right ?? 16,\n bottom: lc?.margin?.bottom ?? 8,\n left: lc?.margin?.left ?? 4,\n };\n const xFill = lc?.xAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yFill = lc?.yAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yWidth = lc?.yAxisWidth ?? 36;\n const cursorStroke = lc?.cursorStroke ?? '#9CA3AF';\n const cursorDash = lc?.cursorStrokeDasharray ?? '4 4';\n const lineType = lc?.lineType ?? 'linear';\n\n return (\n <Box sx={{ width: '100%', height, mt: 0.5 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={data} margin={m}>\n <CartesianGrid\n strokeDasharray={dash}\n vertical={false}\n stroke={gridStroke}\n />\n <XAxis\n dataKey=\"label\"\n tick={{ fill: xFill, fontSize: 11 }}\n tickLine={false}\n axisLine={{\n stroke: OLY_DEFAULT_COMPOSED_CHART_CHROME.axisTickLineStroke,\n }}\n interval={0}\n height={40}\n />\n <YAxis\n domain={yAxisDomain}\n ticks={yAxisTicks}\n tick={{ fill: yFill, fontSize: 11 }}\n tickLine={false}\n axisLine={false}\n width={yWidth}\n />\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n data,\n activeTabId,\n } satisfies BillingCounterAnalyticsTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return <BillingCounterAnalyticsTooltip {...tooltipProps} />;\n }}\n cursor={{ stroke: cursorStroke, strokeDasharray: cursorDash }}\n allowEscapeViewBox={{ x: false, y: true }}\n />\n <Line\n type={lineType}\n dataKey=\"value\"\n stroke={lineColor}\n strokeWidth={strokeW}\n strokeLinejoin=\"miter\"\n strokeLinecap=\"butt\"\n dot={false}\n activeDot={{\n r: 5,\n fill: lineColor,\n stroke: '#ffffff',\n strokeWidth: 2,\n }}\n isAnimationActive={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Billing counter analytics card: title row (optional info), pill tabs, Recharts line chart with violet styling.\n */\nexport function BillingCounterAnalytics({\n title = 'Billing Counter Analytics',\n tabs,\n activeTabId,\n onTabChange,\n data,\n seriesByTabId,\n yAxisDomain = [0, 100],\n yAxisTicks = [20, 40, 60, 80, 100],\n infoPopover,\n renderTooltip,\n emptyStatePlaceholderProps,\n customization,\n}: BillingCounterAnalyticsProps): React.ReactElement {\n const chartData = React.useMemo(() => {\n if (seriesByTabId) {\n return seriesByTabId[activeTabId] ?? [];\n }\n return data ?? [];\n }, [seriesByTabId, data, activeTabId]);\n\n const resolvedInfo =\n infoPopover === undefined\n ? DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER\n : infoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const st = customization?.segmentedTabs;\n const titleSx = mergeSx(\n {\n fontWeight: 700,\n fontSize: { xs: '1rem', sm: '1.05rem' },\n color: '#0f172a',\n },\n customization?.header?.titleSx\n );\n\n return (\n <BillingCounterAnalyticsCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack spacing={1.75} sx={{ width: '100%' }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={2}\n flexWrap=\"wrap\"\n >\n <Typography sx={titleSx}>{title}</Typography>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ flexShrink: 0 }}\n >\n {resolvedInfo ? (\n <>\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n popover={resolvedInfo}\n ariaLabel=\"Billing counter analytics information\"\n />\n </>\n ) : null}\n </Stack>\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Billing counter metric\"\n trackBackgroundColor={\n st?.trackBackgroundColor ?? BILLING_COUNTER_TABS_TRACK_BG\n }\n activeTabBackground={\n st?.activeTabBackground ?? BILLING_COUNTER_LINE_PRIMARY\n }\n activeTabColor={st?.activeTabColor ?? '#ffffff'}\n inactiveTabColor={st?.inactiveTabColor ?? '#525252'}\n activeTabBoxShadow={st?.activeTabBoxShadow ?? 'none'}\n fullWidth={st?.fullWidth ?? true}\n tabFontSize={st?.tabFontSize ?? 14}\n rootSx={st?.rootSx}\n tabLayout={st?.tabLayout ?? 'equalWidth'}\n activeTabFontWeight={st?.activeTabFontWeight ?? 700}\n inactiveTabFontWeight={st?.inactiveTabFontWeight ?? 600}\n />\n\n {chartData.length > 0 ? (\n <LinePlot\n data={chartData}\n yAxisDomain={yAxisDomain}\n yAxisTicks={yAxisTicks}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n />\n ) : (\n <ChartEmptyState\n minHeight={300}\n {...emptyStatePlaceholderProps}\n />\n )}\n </Stack>\n </CardContent>\n </Card>\n </BillingCounterAnalyticsCustomizationProvider>\n );\n}\n\nexport default BillingCounterAnalytics;\n","import type { CSSProperties } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport function mergeCss(a: CSSProperties, b?: CSSProperties): CSSProperties {\n if (!b) {\n return { ...a };\n }\n return { ...a, ...b };\n}\n\nexport function mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) {\n return undefined;\n }\n if (flat.length === 1) {\n return flat[0];\n }\n return flat.flat() as SxProps<Theme>;\n}\n","import * as React from 'react';\nimport type { BillingCounterAnalyticsCustomization } from './billingCounterAnalytics.customization.types';\n\nconst BillingCounterAnalyticsCustomizationContext =\n React.createContext<BillingCounterAnalyticsCustomization>({});\n\nexport type BillingCounterAnalyticsCustomizationProviderProps = {\n value: BillingCounterAnalyticsCustomization;\n children: React.ReactNode;\n};\n\nexport function BillingCounterAnalyticsCustomizationProvider({\n value,\n children,\n}: BillingCounterAnalyticsCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <BillingCounterAnalyticsCustomizationContext.Provider value={memo}>\n {children}\n </BillingCounterAnalyticsCustomizationContext.Provider>\n );\n}\n\nexport function useBillingCounterAnalyticsCustomization(): BillingCounterAnalyticsCustomization {\n return React.useContext(BillingCounterAnalyticsCustomizationContext);\n}\n","import * as React from 'react';\nimport type { TooltipContentProps } from 'recharts';\nimport { mergeCss } from './billingCounterAnalyticsCustomization.merge';\nimport { useBillingCounterAnalyticsCustomization } from './BillingCounterAnalyticsCustomizationContext';\n\nfunction formatTooltipValue(n: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(\n Math.round(n)\n );\n}\n\nexport function BillingCounterAnalyticsTooltip(\n props: TooltipContentProps\n): React.ReactElement | null {\n const { active, payload, label } = props;\n const { lineChart: lc } = useBillingCounterAnalyticsCustomization();\n const tt = lc?.tooltip;\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const raw = payload[0]?.value;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN;\n if (!Number.isFinite(num)) {\n return null;\n }\n\n const labelText = label !== undefined && label !== null ? String(label) : '—';\n\n const borderColor = tt?.borderColor ?? '#E5E7EB';\n const radius = tt?.borderRadiusPx ?? 6;\n const shadow = tt?.boxShadow ?? '0 4px 14px rgba(15, 23, 42, 0.12)';\n const topBg = tt?.topBarBackground ?? '#E5E7EB';\n const topH = tt?.topBarHeightPx ?? 8;\n const bodyBg = tt?.bodyBackground ?? '#FFFFFF';\n const fs = tt?.fontSizePx ?? 13;\n const gap = tt?.lineGapPx ?? 6;\n const dateP = tt?.dateLabelPrefix ?? 'Date: ';\n const totalP = tt?.totalLabelPrefix ?? 'Total: ';\n const prefixFw = tt?.prefixFontWeight ?? 400;\n const valueFw = tt?.valueFontWeight ?? 700;\n\n const uniformText =\n tt?.textColor != null &&\n tt?.prefixColor === undefined &&\n tt?.valueColor === undefined;\n const prefixCol = uniformText ? tt.textColor : (tt?.prefixColor ?? '#6B7280');\n const valueCol = uniformText ? tt.textColor : (tt?.valueColor ?? '#111827');\n\n const rowStyle: React.CSSProperties = {\n fontSize: fs,\n lineHeight: 1.35,\n margin: 0,\n };\n\n const bodyStyle = mergeCss(\n {\n boxSizing: 'border-box',\n backgroundColor: bodyBg,\n padding: '10px 12px',\n },\n tt?.bodyStyle\n );\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n minWidth: 160,\n maxWidth: 280,\n }}\n >\n <div\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: bodyBg,\n boxShadow: shadow,\n }}\n >\n <div\n style={{\n height: topH,\n backgroundColor: topBg,\n flexShrink: 0,\n }}\n aria-hidden\n />\n <div style={bodyStyle}>\n <div style={rowStyle}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {dateP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {labelText}\n </span>\n </div>\n <div style={{ ...rowStyle, marginTop: gap }}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {totalP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {formatTooltipValue(num)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Shared queue-time visualization palette (stacked bar, donut, area).\n * Four violet shades, light → dark (segment index order) — pill bar / donut / area.\n */\nexport const QUEUE_CHART_COLORS = [\n '#E9E5FF',\n '#C4B5FD',\n '#8B5CF6',\n '#6D28D9',\n] as const;\n\n/** Thin horizontal stacked bar height (px); pill radius uses half of this. */\nexport const QUEUE_STACKED_BAR_THICKNESS_PX = 8;\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport * as React from 'react';\nimport { ChartWidgetInfoButton } from '../ChartWidgetInfoButton';\nimport { ChartEmptyState } from '../utils/ChartEmptyState';\nimport { TimePeriodFilter } from '../filters/TimePeriodFilter';\nimport { TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN } from '../filters/timePeriodFilter.infoPopover';\nimport type {\n QueueTimeBreakdownProps,\n QueueTimeChartFilter,\n} from './QueueTimeBreakdown.types';\nimport { QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC } from './QueueTimeBreakdown.types';\nimport QueueTimeBreakdownArea, {\n getQueueTimeBreakdownAreaSeriesData,\n getQueueTimeBreakdownAreaXAxisData,\n} from './QueueTimeBreakdownArea';\nimport { QueueTimeBreakdownCustomizationProvider } from './QueueTimeBreakdownCustomizationContext';\nimport { QueueTimeBreakdownDonut } from './QueueTimeBreakdownDonut';\nimport { QueueTimeBreakdownStackedBar } from './QueueTimeBreakdownStackedBar';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\nimport { mergeSx } from './queueTimeBreakdownCustomization.merge';\n\nfunction defaultBucketLegendFromPalette(palette: readonly string[]) {\n return [\n { percent: '12%', label: '> 16mins', color: palette[0 % palette.length] },\n { percent: '22%', label: '7 - 15mins', color: palette[1 % palette.length] },\n { percent: '36%', label: '3 - 6mins', color: palette[2 % palette.length] },\n { percent: '16%', label: '1 - 2mins', color: palette[3 % palette.length] },\n ] as const;\n}\n\n/**\n * Queue time breakdown dashboard widget: stacked bars, queue buckets, donut comparison, area chart (Recharts).\n */\nexport function QueueTimeBreakdown({\n data,\n Donut_data,\n donutYesterdayData,\n headerImageSrc,\n headlineTotal = '14,123',\n headlineSubtitle = 'Queue Time Breakdown Of All Visitors',\n dataComparisonTitle = 'Data Comparison:',\n queueBucketLegend,\n title = 'Queue Time Breakdown',\n infoPopover,\n headlineInfoPopover,\n renderAreaTooltip,\n renderDonutTooltip,\n renderStackedBarTooltip,\n customization,\n}: QueueTimeBreakdownProps): React.ReactElement {\n const isSmallScreen = useMediaQuery('(max-width:600px)');\n const [filter, setFilter] = React.useState<QueueTimeChartFilter>('Day');\n const yesterdayDonut = donutYesterdayData ?? Donut_data;\n const hasComparisonData = React.useMemo(() => {\n const values = [...Donut_data, ...yesterdayDonut];\n return values.some(value => Number.isFinite(value) && value > 0);\n }, [Donut_data, yesterdayDonut]);\n const hasBarData = React.useMemo(\n () => data.some(row => row.data.some(seg => (seg.data[0] ?? 0) > 0)),\n [data]\n );\n const palette =\n customization?.chartPalette && customization.chartPalette.length > 0\n ? customization.chartPalette\n : QUEUE_CHART_COLORS;\n const legend = queueBucketLegend ?? defaultBucketLegendFromPalette(palette);\n const resolvedHeaderImageSrc =\n headerImageSrc === undefined\n ? QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC\n : headerImageSrc;\n const resolvedPeriodInfoPopover =\n infoPopover === undefined\n ? TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN\n : infoPopover;\n const resolvedHeadlineInfoPopover =\n headlineInfoPopover === undefined\n ? resolvedPeriodInfoPopover\n : headlineInfoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const periodTitleSx = mergeSx(\n { fontWeight: 700, color: '#0f172a' },\n customization?.periodFilter?.titleSx\n );\n\n return (\n <QueueTimeBreakdownCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent sx={mergeSx(customization?.rootCard?.cardContentSx)}>\n <Stack width=\"100%\" direction=\"column\" gap={3} mb={4}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n gap={2}\n width=\"100%\"\n >\n <Typography\n variant={isSmallScreen ? 'subtitle2' : 'body1'}\n sx={periodTitleSx}\n >\n {title}\n </Typography>\n <TimePeriodFilter\n selectedFilter={filter}\n onFilterChange={setFilter}\n infoPopover={resolvedPeriodInfoPopover}\n />\n </Stack>\n <Box>\n <Grid container spacing={3}>\n <Grid size={{ md: 6, xs: 12 }}>\n <Stack\n gap={1}\n sx={mergeSx(customization?.leftColumn?.columnStackSx)}\n >\n <Stack>\n <Stack\n direction=\"row\"\n gap={4}\n justifyContent=\"start\"\n alignItems=\"center\"\n >\n {resolvedHeaderImageSrc ? (\n <Box\n component=\"img\"\n src={resolvedHeaderImageSrc}\n alt=\"\"\n width={52}\n height={52}\n sx={{ objectFit: 'contain' }}\n />\n ) : null}\n <Stack>\n <Typography\n sx={mergeSx(\n {\n fontSize: '20px',\n fontWeight: 600,\n color: '#222222',\n },\n customization?.header?.headlineSx\n )}\n >\n {headlineTotal}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" gap={1}>\n <Typography\n sx={mergeSx(\n {\n fontSize: '11px',\n fontWeight: 400,\n color: '#222222',\n },\n customization?.header?.subtitleSx\n )}\n >\n {headlineSubtitle}\n </Typography>\n {resolvedHeadlineInfoPopover ? (\n <ChartWidgetInfoButton\n density=\"compact\"\n popover={resolvedHeadlineInfoPopover}\n ariaLabel=\"Queue time breakdown information\"\n />\n ) : null}\n </Stack>\n </Stack>\n </Stack>\n </Stack>\n <Stack\n sx={mergeSx(customization?.leftColumn?.barRowsStackSx)}\n >\n {data.map(item => (\n <QueueTimeBreakdownStackedBar\n key={item.name}\n row={item}\n legendRows={legend}\n renderTooltip={renderStackedBarTooltip}\n />\n ))}\n </Stack>\n </Stack>\n <Typography\n sx={mergeSx(\n {\n marginTop: '10px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#222222',\n },\n customization?.dataComparison?.titleSx\n )}\n >\n {dataComparisonTitle}\n </Typography>\n <Card\n elevation={0}\n sx={mergeSx(\n {\n cursor: 'pointer',\n marginTop: '10px',\n bgcolor: '#FFFFFF',\n border: '1px solid #E5E7EB',\n borderRadius: 2,\n },\n customization?.dataComparison?.cardSx\n )}\n >\n <CardContent sx={{ padding: '4px 8px' }}>\n {hasComparisonData ? (\n <Stack\n direction=\"row\"\n justifyContent=\"space-evenly\"\n alignItems=\"center\"\n >\n <Stack width=\"50%\">\n <QueueTimeBreakdownDonut\n averageData={Donut_data}\n chartFilter={filter}\n LabelName=\"Today\"\n renderTooltip={renderDonutTooltip}\n />\n </Stack>\n <Box\n component=\"span\"\n sx={mergeSx(\n {\n height: '180px',\n width: '2px',\n backgroundColor: '#D8D9E4',\n display: 'inline-block',\n },\n customization?.dataComparison?.dividerSx\n )}\n />\n <Stack width=\"50%\">\n <QueueTimeBreakdownDonut\n averageData={yesterdayDonut}\n chartFilter={filter}\n LabelName=\"Yesterday\"\n renderTooltip={renderDonutTooltip}\n />\n </Stack>\n </Stack>\n ) : (\n <ChartEmptyState minHeight={220} />\n )}\n </CardContent>\n </Card>\n </Grid>\n\n <Grid size={{ md: 6, xs: 12 }}>\n <Card\n elevation={0}\n sx={mergeSx(\n {\n cursor: 'pointer',\n borderRadius: '8px',\n border: '1px solid #E5E7EB',\n bgcolor: '#FFFFFF',\n height: '100%',\n },\n customization?.areaChart?.cardSx\n )}\n >\n <CardContent\n sx={mergeSx(\n { padding: '10px 8px' },\n customization?.areaChart?.cardContentSx\n )}\n >\n {hasBarData ? (\n <QueueTimeBreakdownArea\n series={getQueueTimeBreakdownAreaSeriesData(filter)}\n xAxis={getQueueTimeBreakdownAreaXAxisData(filter)}\n renderTooltip={renderAreaTooltip}\n />\n ) : (\n <ChartEmptyState minHeight={330} />\n )}\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n </Box>\n </Stack>\n </CardContent>\n </Card>\n </QueueTimeBreakdownCustomizationProvider>\n );\n}\n\nexport default QueueTimeBreakdown;\n\nexport { generateMockPerformanceData } from './queueTimeBreakdown.mock';\n","import type { ChartWidgetInfoPopoverContent } from '../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\nimport type { QueueTimeBreakdownCustomization } from './queueTimeBreakdown.customization.types';\nimport type { QueueTimeBreakdownAreaProps } from './QueueTimeBreakdownArea';\nimport type { QueueTimeBreakdownDonutProps } from './QueueTimeBreakdownDonut';\nimport type { QueueTimeBreakdownStackedBarProps } from './QueueTimeBreakdownStackedBar';\n\nexport type { QueueTimeBreakdownCustomization };\n\n/**\n * Header illustration for the queue breakdown card.\n * Default GIF path (place under app **`public`** or override with **`headerImageSrc`**).\n */\nexport const QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC =\n '/images/icon/DwellBreakdownIcon.gif' as const;\n\n/** One series slice for Apex stacked horizontal bars. */\nexport type QueueTimeStackedSeriesItem = {\n name: string;\n data: number[];\n};\n\n/** One row of stacked-bar data (e.g. per store). */\nexport type QueueTimeBreakdownBarRow = {\n name: string;\n data: QueueTimeStackedSeriesItem[];\n total: number;\n};\n\nexport type QueueTimeChartFilter = 'Day' | 'Week' | 'Month' | 'Year';\n\n/** Optional legend chip under the stacked bars (percent + label + color). */\nexport type QueueBucketLegendItem = {\n percent: string;\n label: string;\n color: string;\n};\n\nexport type QueueTimeBreakdownProps = {\n /** Stacked horizontal bar rows. */\n data: QueueTimeBreakdownBarRow[];\n /** Donut slice values (e.g. today). */\n Donut_data: number[];\n /** Optional second donut; defaults to Donut_data for both sides. */\n donutYesterdayData?: number[];\n total_visitor_today?: number;\n overall_visitor_per_hour?: number;\n overall_visitor_per_min?: number;\n top_store?: string;\n /**\n * Header illustration URL. Defaults to {@link QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC}\n * (same asset as the queue-time dashboard widget). Pass `''` to hide the icon.\n */\n headerImageSrc?: string;\n /** Main KPI number shown next to the icon. */\n headlineTotal?: string;\n /** Subtitle under the headline. */\n headlineSubtitle?: string;\n /** Row title above the donut comparison card. */\n dataComparisonTitle?: string;\n /** Legend under the stacked bars; defaults to four queue buckets. */\n queueBucketLegend?: QueueBucketLegendItem[];\n /** Card / widget title. */\n title?: string;\n /**\n * Header info popover (next to D/W/M/Y). When omitted, the widget uses\n * **`TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN`**. Pass **`null`** to hide the separator and\n * **`ChartWidgetInfoButton`**. Standalone **`TimePeriodFilter`** does not inject popover copy implicitly.\n */\n infoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Info popover shown beside the headline subtitle (\"Avg. Queue Time Breakdown...\").\n * Defaults to the same content used by `infoPopover` when omitted.\n * Pass `null` to hide the subtitle info button.\n */\n headlineInfoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Full custom tooltip renderer for the area chart.\n */\n renderAreaTooltip?: QueueTimeBreakdownAreaProps['renderTooltip'];\n /**\n * Full custom tooltip renderer for both donut charts.\n */\n renderDonutTooltip?: QueueTimeBreakdownDonutProps['renderTooltip'];\n /**\n * Full custom tooltip renderer for each stacked bar row.\n */\n renderStackedBarTooltip?: QueueTimeBreakdownStackedBarProps['renderTooltip'];\n /** Visual / layout overrides for all sub-widgets (tooltips, palette, D/W/M/Y control, etc.). */\n customization?: QueueTimeBreakdownCustomization;\n};\n","import { Stack } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport type { QueueTimeChartFilter } from './QueueTimeBreakdown.types';\nimport {\n QueueTimeBreakdownAreaTooltip,\n type QueueTimeBreakdownAreaTooltipProps,\n} from './QueueTimeBreakdownAreaTooltip';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\n\nexport type QueueTimeAreaSeriesPoint = {\n name: string;\n data: number[];\n};\n\nexport type QueueTimeBreakdownAreaProps = {\n series: QueueTimeAreaSeriesPoint[];\n xAxis: string[];\n renderTooltip?: (\n context: QueueTimeBreakdownAreaTooltipRenderContext\n ) => ReactNode;\n};\n\nexport type QueueTimeBreakdownAreaTooltipRenderContext = {\n tooltipProps: TooltipContentProps;\n chartData: Record<string, string | number>[];\n series: QueueTimeAreaSeriesPoint[];\n xAxis: string[];\n};\n\nfunction mergeAreaData(\n seriesList: QueueTimeAreaSeriesPoint[],\n categories: string[]\n): Record<string, string | number>[] {\n return categories.map((cat, i) => {\n const row: Record<string, string | number> = { name: cat };\n seriesList.forEach(s => {\n row[s.name] = s.data[i] ?? 0;\n });\n return row;\n });\n}\n\nconst defaultMargin = { top: 8, right: 8, bottom: 8, left: 8 };\n\nconst QueueTimeBreakdownArea = ({\n series,\n xAxis,\n renderTooltip,\n}: QueueTimeBreakdownAreaProps): React.ReactElement => {\n const theme = useTheme();\n const { chartPalette, areaChart: ac } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const chartData = React.useMemo(\n () => mergeAreaData(series, xAxis),\n [series, xAxis]\n );\n const stackH = ac?.stackHeightPx ?? 330;\n const chartH = ac?.chartHeightPx ?? 350;\n const margin = React.useMemo(\n () => ({ ...defaultMargin, ...ac?.margin }),\n [ac?.margin]\n );\n const gridStroke = ac?.gridStroke ?? theme.palette.divider;\n const yLabel = ac?.yAxisLabel ?? 'No of Visitors';\n\n const allZero = React.useMemo(() => {\n if (chartData.length === 0) return true;\n return chartData.every(row =>\n series.every(s => {\n const val = row[s.name];\n return (typeof val === 'number' ? val : Number(val)) === 0;\n })\n );\n }, [chartData, series]);\n\n const yDomain = allZero\n ? ([0, 16000] as [number, number])\n : ([0, 'auto'] as [number, string]);\n const yTickCount = allZero ? 5 : undefined;\n\n return (\n <Stack justifyContent=\"center\" height={stackH}>\n <ResponsiveContainer width=\"100%\" height={chartH}>\n <AreaChart data={chartData} margin={margin}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke={gridStroke}\n vertical={false}\n />\n <XAxis\n dataKey=\"name\"\n tick={{ fill: theme.palette.text.secondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n />\n <YAxis\n domain={yDomain}\n tickCount={yTickCount}\n tick={{ fill: theme.palette.text.secondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n tickFormatter={v => {\n const n = typeof v === 'number' ? v : Number(v);\n const safe = Number.isFinite(n) ? n : 0;\n return safe > 1000 ? `${Math.ceil(safe / 1000)}k` : String(safe);\n }}\n label={{\n value: yLabel,\n angle: -90,\n position: 'insideLeft',\n style: { fill: theme.palette.text.secondary, fontSize: 11 },\n }}\n />\n {series.map((s, i) => (\n <Area\n key={s.name}\n type=\"monotone\"\n dataKey={s.name}\n stackId=\"queueArea\"\n stroke={palette[i % palette.length]}\n fill={palette[i % palette.length]}\n fillOpacity={1}\n strokeWidth={0}\n />\n ))}\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const custom = renderTooltip({\n tooltipProps,\n chartData,\n series,\n xAxis,\n });\n return custom == null ? null : <>{custom}</>;\n }\n const { active, payload, label } = tooltipProps;\n return (\n <QueueTimeBreakdownAreaTooltip\n active={active}\n label={label}\n payload={\n payload as QueueTimeBreakdownAreaTooltipProps['payload']\n }\n styleOverrides={ac?.areaTooltip}\n />\n );\n }}\n cursor={{\n stroke: ac?.cursorStroke ?? '#D4D4D8',\n strokeWidth: ac?.cursorStrokeWidth ?? 1,\n }}\n wrapperStyle={{ outline: 'none' }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </Stack>\n );\n};\n\nexport default QueueTimeBreakdownArea;\n\nconst xDays = [\n 'April 1',\n 'April 2',\n 'April 3',\n 'April 4',\n 'April 5',\n 'April 6',\n 'Today',\n];\nconst xWeeks = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\nconst xMonths = ['Jan', 'Feb', 'Mar', 'Apr'];\nconst xYears = ['2018', '2019', '2020', '2021', '2022', '2023', '2024'];\n\nexport function getQueueTimeBreakdownAreaXAxisData(\n type: QueueTimeChartFilter\n): string[] {\n switch (type) {\n case 'Day':\n return xDays;\n case 'Week':\n return xWeeks;\n case 'Month':\n return xMonths;\n case 'Year':\n return xYears;\n default:\n return xDays;\n }\n}\n\nexport function getQueueTimeBreakdownAreaSeriesData(\n type: QueueTimeChartFilter\n): QueueTimeAreaSeriesPoint[] {\n const axis = getQueueTimeBreakdownAreaXAxisData(type);\n const areas = ['1-15 mins', '16-30 mins', '30-45 mins', '> 45 mins'] as const;\n const out: QueueTimeAreaSeriesPoint[] = [];\n\n areas.forEach(area => {\n const data: number[] = [];\n const range =\n area === '1-15 mins'\n ? 500\n : area === '16-30 mins'\n ? 1000\n : area === '30-45 mins'\n ? 2000\n : 1500;\n for (let i = 0; i < axis.length; i += 1) {\n data.push(range + i * 100 * Math.floor(Math.random() * 10));\n }\n out.push({ name: area, data });\n });\n\n return out;\n}\n","import * as React from 'react';\nimport type { QueueTimeAreaTooltipTheme } from './queueTimeBreakdown.customization.types';\nimport { mergeAreaTooltipStyles } from './queueTimeBreakdownCustomization.merge';\n\n/** Normalized row after Recharts payload cast. */\ntype TooltipRow = {\n value?: unknown;\n name?: unknown;\n color?: string;\n dataKey?: unknown;\n};\n\nexport type QueueTimeBreakdownAreaTooltipProps = {\n active?: boolean;\n payload?: ReadonlyArray<TooltipRow>;\n label?: unknown;\n /** Merged with built-in defaults; set via `QueueTimeBreakdown` `customization.areaChart.areaTooltip`. */\n styleOverrides?: QueueTimeAreaTooltipTheme;\n};\n\nfunction numberFromTooltipValue(v: unknown): number {\n if (typeof v === 'number' && Number.isFinite(v)) {\n return v;\n }\n if (typeof v === 'string') {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n }\n if (Array.isArray(v) && v.length > 0) {\n const first = v[0];\n if (typeof first === 'number' && Number.isFinite(first)) {\n return first;\n }\n }\n return 0;\n}\n\nfunction formatVisitorValue(n: number): string {\n if (!Number.isFinite(n)) {\n return '';\n }\n if (Math.abs(n) >= 1000) {\n return `${(n / 1000).toFixed(1)}k`;\n }\n return String(Math.round(n));\n}\n\n/**\n * Area chart tooltip — header strip + rows: dot · label : value.\n * Styles are customizable via `styleOverrides` (see `QueueTimeAreaTooltipTheme`).\n */\nexport function QueueTimeBreakdownAreaTooltip({\n active,\n payload,\n label,\n styleOverrides,\n}: QueueTimeBreakdownAreaTooltipProps): React.ReactElement | null {\n const s = React.useMemo(\n () => mergeAreaTooltipStyles(styleOverrides),\n [styleOverrides]\n );\n\n if (!active || payload == null || payload.length === 0) {\n return null;\n }\n\n return (\n <div style={s.container}>\n <div style={s.header}>{label != null ? String(label) : ''}</div>\n <div style={s.body}>\n {payload.map((entry, i) => {\n const name =\n typeof entry.name === 'string'\n ? entry.name\n : entry.name != null\n ? String(entry.name)\n : '';\n const safe = numberFromTooltipValue(entry.value);\n const color =\n typeof entry.color === 'string' ? entry.color : '#8B5CF6';\n const key =\n entry.dataKey != null ? String(entry.dataKey) : `row-${i}`;\n return (\n <div key={key} style={s.row}>\n <span\n style={{\n ...s.dot,\n backgroundColor: color,\n }}\n />\n <span style={s.label}>{`${name} :`}</span>\n <span style={s.value}>{formatVisitorValue(safe)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from './QueueTimeBreakdown.types';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\nimport {\n mergeRechartsTooltipStyles,\n mergeSx,\n} from './queueTimeBreakdownCustomization.merge';\n\nconst RADIAN = Math.PI / 180;\n\nfunction DefaultDonutTooltip({\n tooltipProps,\n pieData,\n palette,\n}: {\n tooltipProps: TooltipContentProps;\n pieData: PieDatum[];\n total: number;\n palette: readonly string[];\n}): React.ReactElement | null {\n const { active, payload } = tooltipProps;\n if (!active || !payload?.length) {\n return null;\n }\n const entry = payload[0];\n const name = entry?.name ?? '';\n const rawValue = entry?.value;\n const value =\n typeof rawValue === 'number' ? rawValue : (Number(rawValue) ?? 0);\n const colorIndex = pieData.findIndex(d => d.name === name);\n const color = palette[colorIndex % palette.length];\n\n return (\n <Box\n sx={{\n pointerEvents: 'none',\n backgroundColor: '#FFFFFF',\n border: '1px solid #E5E7EB',\n borderRadius: 1.5,\n boxShadow: '0 4px 14px rgba(15, 23, 42, 0.12)',\n zIndex: 9999,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ height: 3, bgcolor: '#E5E7EB', width: '100%' }} />\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n sx={{ px: '10px', py: '6px' }}\n >\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: color,\n flexShrink: 0,\n }}\n />\n <Stack direction=\"row\" spacing={0.5} alignItems=\"baseline\">\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 500,\n color: '#6B7280',\n lineHeight: 1,\n }}\n >\n {name}:\n </Typography>\n <Typography\n sx={{\n fontSize: 14,\n fontWeight: 700,\n color: '#374151',\n lineHeight: 1,\n }}\n >\n {value.toLocaleString()}\n </Typography>\n </Stack>\n </Stack>\n </Box>\n );\n}\n\n/** Recharts `Pie` label payload (subset we need). */\ntype PieSectorLabelPayload = {\n cx?: number;\n cy?: number;\n midAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n percent?: number;\n index?: number;\n};\n\ntype DonutInnerLabelExtra = {\n lightSliceFill?: string;\n darkSliceFill?: string;\n};\n\n/** Percent text at mid-annulus so it reads inside the donut ring (not outside). */\nfunction DonutInnerPercentLabel(\n props: Readonly<PieSectorLabelPayload & DonutInnerLabelExtra>\n): React.ReactElement | null {\n const {\n cx,\n cy,\n midAngle,\n innerRadius,\n outerRadius,\n percent,\n index = 0,\n lightSliceFill = '#5B21B6',\n darkSliceFill = '#FFFFFF',\n } = props;\n if (\n cx == null ||\n cy == null ||\n midAngle == null ||\n innerRadius == null ||\n outerRadius == null ||\n percent == null\n ) {\n return null;\n }\n const p = percent;\n if (p < 0.025) {\n return null;\n }\n const midR = innerRadius + (outerRadius - innerRadius) / 2;\n const x = cx + midR * Math.cos(-midAngle * RADIAN);\n const y = cy + midR * Math.sin(-midAngle * RADIAN);\n const text = `${(p * 100).toFixed(0)}%`;\n const lightSlice = index < 2;\n const fill = lightSlice ? lightSliceFill : darkSliceFill;\n\n return (\n <text\n x={x}\n y={y}\n fill={fill}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={11}\n fontWeight={600}\n style={{\n pointerEvents: 'none',\n textShadow: lightSlice ? 'none' : '0 1px 2px rgba(0,0,0,0.45)',\n }}\n >\n {text}\n </text>\n );\n}\n\nconst DEFAULT_LABELS = [\n '0-20 years old (male)',\n '21-45 years old (male)',\n '46-60 years old (male)',\n '60+ years old (male)',\n] as const;\n\nexport type QueueTimeBreakdownDonutProps = {\n chartFilter: QueueTimeChartFilter;\n averageData: number[];\n LabelName: string;\n labels?: readonly string[];\n renderTooltip?: (\n context: QueueTimeBreakdownDonutTooltipRenderContext\n ) => ReactNode;\n};\n\ntype PieDatum = { name: string; value: number };\n\nexport type QueueTimeBreakdownDonutTooltipRenderContext = {\n tooltipProps: TooltipContentProps;\n pieData: PieDatum[];\n total: number;\n chartFilter: QueueTimeChartFilter;\n labelName: string;\n};\n\nexport function QueueTimeBreakdownDonut({\n chartFilter,\n averageData,\n LabelName,\n labels = DEFAULT_LABELS,\n renderTooltip,\n}: QueueTimeBreakdownDonutProps): React.ReactElement {\n const { chartPalette, donut: dn } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const tt = React.useMemo(\n () => mergeRechartsTooltipStyles(dn?.tooltip),\n [dn?.tooltip]\n );\n const innerR = dn?.innerRadius ?? 58;\n const outerR = dn?.outerRadius ?? 88;\n const padAngle = dn?.paddingAngle ?? 0;\n const chartH = dn?.chartHeightPx ?? 220;\n\n const pieData: PieDatum[] = React.useMemo(() => {\n return labels.map((name, i) => ({\n name,\n value: Math.max(0, averageData[i] ?? 0),\n }));\n }, [averageData, labels]);\n\n const total = pieData.reduce((s, d) => s + d.value, 0) || 1;\n\n return (\n <Box\n sx={mergeSx(\n { position: 'relative', width: '100%', minHeight: 200 },\n dn?.containerSx\n )}\n >\n <ResponsiveContainer width=\"100%\" height={chartH}>\n <PieChart key={chartFilter}>\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={innerR}\n outerRadius={outerR}\n paddingAngle={padAngle}\n labelLine={false}\n label={(props: PieSectorLabelPayload) => (\n <DonutInnerPercentLabel\n {...props}\n lightSliceFill={dn?.innerPercentOnLightSliceFill}\n darkSliceFill={dn?.innerPercentOnDarkSliceFill}\n />\n )}\n >\n {pieData.map((_, index) => (\n <Cell\n key={`cell-${index}`}\n fill={palette[index % palette.length]}\n stroke=\"none\"\n />\n ))}\n </Pie>\n <Tooltip\n contentStyle={tt.contentStyle}\n itemStyle={tt.itemStyle}\n labelStyle={tt.labelStyle}\n wrapperStyle={{ ...tt.wrapperStyle, zIndex: 9999 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const custom = renderTooltip({\n tooltipProps,\n pieData,\n total,\n chartFilter,\n labelName: LabelName,\n });\n return custom == null ? null : <>{custom}</>;\n }\n return (\n <DefaultDonutTooltip\n tooltipProps={tooltipProps}\n pieData={pieData}\n total={total}\n palette={palette}\n />\n );\n }}\n formatter={\n renderTooltip\n ? undefined\n : (value, name) => {\n const v =\n value == null\n ? 0\n : typeof value === 'number'\n ? value\n : Number(value);\n const safe = Number.isFinite(v) ? v : 0;\n const label =\n typeof name === 'string' ? name : String(name ?? '');\n return [`${((safe / total) * 100).toFixed(0)}%`, label];\n }\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <Box\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n textAlign: 'center',\n }}\n >\n <Typography\n sx={mergeSx(\n { fontSize: '13px', fontWeight: 600, color: '#373d3f' },\n dn?.centerLabelSx\n )}\n >\n {LabelName}\n </Typography>\n </Box>\n </Box>\n );\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\nimport * as React from 'react';\nimport type {\n QueueBucketLegendItem,\n QueueTimeBreakdownBarRow,\n} from './QueueTimeBreakdown.types';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport {\n QUEUE_CHART_COLORS,\n QUEUE_STACKED_BAR_THICKNESS_PX,\n} from './queueTimeBreakdown.chartTokens';\nimport { mergeSx } from './queueTimeBreakdownCustomization.merge';\n\nconst segmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst defaultSegmentTooltipCardSx: SxProps<Theme> = {\n minWidth: 160,\n bgcolor: '#fff',\n borderRadius: 1.5,\n border: '1px solid #E5E7EB',\n boxShadow: '0 4px 14px rgba(15, 23, 42, 0.12)',\n overflow: 'hidden',\n pointerEvents: 'none',\n zIndex: 9999,\n};\n\nfunction SegmentTooltip({\n name,\n value,\n color,\n}: {\n name: string;\n value: number;\n pct: string;\n color: string;\n}): React.ReactElement {\n return (\n <Box sx={defaultSegmentTooltipCardSx}>\n <Box sx={{ height: 3, bgcolor: '#E5E7EB', width: '100%' }} />\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n sx={{ px: '10px', py: '6px' }}\n >\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: color,\n flexShrink: 0,\n }}\n />\n <Stack direction=\"row\" spacing={0.5} alignItems=\"baseline\">\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 500,\n color: '#6B7280',\n lineHeight: 1,\n }}\n >\n {name}:\n </Typography>\n <Typography\n sx={{\n fontSize: 14,\n fontWeight: 700,\n color: '#374151',\n lineHeight: 1,\n }}\n >\n {value.toLocaleString()}\n </Typography>\n </Stack>\n </Stack>\n </Box>\n );\n}\n\nexport type QueueTimeBreakdownStackedBarProps = {\n row: QueueTimeBreakdownBarRow;\n /** One entry per segment: percent line + range line (aligned under each slice). */\n legendRows: readonly QueueBucketLegendItem[];\n renderTooltip?: (\n context: QueueTimeBreakdownStackedBarTooltipRenderContext\n ) => ReactNode;\n};\n\nexport type QueueTimeBreakdownStackedBarTooltipRenderContext = {\n row: QueueTimeBreakdownBarRow;\n segmentIndex: number;\n percent: number;\n count: number;\n color: string;\n};\n\n/**\n * Custom horizontal 100% stacked bar — slim pill with rounded ends.\n * Segments are individually hoverable with MUI tooltips.\n */\nexport function QueueTimeBreakdownStackedBar({\n row,\n legendRows,\n renderTooltip,\n}: QueueTimeBreakdownStackedBarProps): React.ReactElement {\n const { chartPalette, stackedBar: sb } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n\n const rawValues = React.useMemo(\n () => row.data.map(seg => Math.max(0, seg.data[0] ?? 0)),\n [row.data]\n );\n const total = React.useMemo(\n () => rawValues.reduce((a, b) => a + b, 0) || 1,\n [rawValues]\n );\n const pcts = React.useMemo(\n () => rawValues.map(v => (v / total) * 100),\n [rawValues, total]\n );\n\n const h = sb?.barThicknessPx ?? Math.max(14, QUEUE_STACKED_BAR_THICKNESS_PX);\n const isAllZero = rawValues.every(v => v === 0);\n const emptySegments =\n legendRows.length > 0\n ? legendRows\n : row.data.map((d, i) => ({\n label: d.name,\n percent: '0%',\n color: palette[i % palette.length],\n }));\n\n return (\n <Stack spacing={0} sx={{ width: '100%', mb: 1.5 }}>\n <Box\n sx={{\n width: '100%',\n height: h,\n display: 'flex',\n overflow: 'hidden',\n borderRadius: 0,\n }}\n >\n {isAllZero ? (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n bgcolor: '#E5E7EB',\n }}\n />\n ) : (\n pcts.map((p, i) => {\n if (p <= 0) return null;\n const color = palette[i % palette.length];\n const segName = legendRows[i]?.label ?? row.data[i]?.name ?? '';\n const count = rawValues[i];\n const pctStr = p.toFixed(1);\n\n return (\n <Tooltip\n key={`seg-${row.name}-${i}`}\n title={\n renderTooltip ? (\n renderTooltip({\n row,\n segmentIndex: i,\n percent: p,\n count,\n color,\n })\n ) : (\n <SegmentTooltip\n name={segName}\n value={count}\n pct={pctStr}\n color={color}\n />\n )\n }\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: segmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n width: `${p}%`,\n height: '100%',\n bgcolor: color,\n cursor: 'pointer',\n transition: 'opacity 0.2s',\n '&:hover': {\n opacity: 0.85,\n },\n }}\n />\n </Tooltip>\n );\n })\n )}\n </Box>\n\n <Box\n sx={mergeSx(\n {\n display: 'flex',\n flexDirection: 'row',\n width: '100%',\n mt: 2,\n alignItems: 'flex-start',\n },\n sb?.labelRowContainerSx\n )}\n >\n {isAllZero\n ? emptySegments.map((seg, i) => {\n const labelText = seg.label ?? row.data[i]?.name ?? '';\n const sharePct = 100 / emptySegments.length;\n\n return (\n <Box\n key={`empty-lbl-${row.name}-${i}`}\n sx={mergeSx(\n {\n flex: `0 0 ${sharePct}%`,\n minWidth: 0,\n maxWidth: `${sharePct}%`,\n px: 0.75,\n textAlign: 'center',\n overflow: 'hidden',\n },\n sb?.segmentBoxSx\n )}\n >\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(13px, 1.2vw, 20px)',\n fontWeight: 700,\n color: '#7A7F87',\n lineHeight: 1.15,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelPercentSx\n )}\n >\n 0 (0%)\n </Typography>\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(9px, 0.9vw, 11px)',\n fontWeight: 600,\n color: '#7A7F87',\n lineHeight: 1.25,\n mt: 0.4,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelRangeSx\n )}\n >\n {labelText}\n </Typography>\n </Box>\n );\n })\n : pcts.map((p, i) => {\n const leg = legendRows[i];\n const labelText = leg?.label ?? row.data[i]?.name ?? '';\n const countValue = rawValues[i];\n const sharePct = 100 / pcts.length;\n\n let displayText: string;\n if (countValue <= 0) {\n displayText = '0';\n } else {\n const pctText = leg?.percent ?? `${Math.round(p)}%`;\n const countText = new Intl.NumberFormat('en-US').format(\n countValue\n );\n displayText = `${countText} (${pctText})`;\n }\n\n return (\n <Box\n key={`lbl-${row.name}-${i}`}\n title={`${displayText} ${labelText}`.trim()}\n sx={mergeSx(\n {\n flex: `0 0 ${sharePct}%`,\n minWidth: 0,\n maxWidth: `${sharePct}%`,\n px: 0.75,\n textAlign: 'center',\n overflow: 'hidden',\n },\n sb?.segmentBoxSx\n )}\n >\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(13px, 1.2vw, 20px)',\n fontWeight: 700,\n color: '#7A7F87',\n lineHeight: 1.15,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelPercentSx\n )}\n >\n {displayText}\n </Typography>\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(9px, 0.9vw, 11px)',\n fontWeight: 600,\n color: '#7A7F87',\n lineHeight: 1.25,\n mt: 0.4,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelRangeSx\n )}\n >\n {labelText}\n </Typography>\n </Box>\n );\n })}\n </Box>\n </Stack>\n );\n}\n","import type { QueueTimeBreakdownBarRow } from './QueueTimeBreakdown.types';\n\nconst ageGroups = [\n '0-20 years old (male)',\n '21-45 years old (male)',\n '46-60 years old (male)',\n '60+ years old (male)',\n] as const;\n\nconst storeList = ['Max Indonesia'] as const;\n\n/** Demo data for Storybook / prototyping. */\nexport function generateMockPerformanceData(): QueueTimeBreakdownBarRow[] {\n const data: QueueTimeBreakdownBarRow[] = [];\n\n storeList.forEach(store => {\n data.push({\n name: store,\n data: ageGroups.map(age => ({\n name: age,\n data: [Math.floor(Math.random() * 1000)],\n })),\n total: Math.floor(Math.random() * 10000),\n });\n });\n\n return data;\n}\n","'use client';\n\nimport { Icon } from '@iconify/react';\nimport {\n Box,\n Button,\n IconButton,\n Paper,\n Skeleton,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { ResponsiveContainer, Treemap } from 'recharts';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootFallHeatMapIconColor,\n FootFallHeatMapIconSize,\n FootFallHeatMapIconSizeContext,\n FootFallHeatMapKpiStripPresentation,\n FootFallHeatMapKpiStripSegmentTooltipRenderContext,\n FootFallHeatMapTileIconRole,\n FootFallHeatMapViewProps,\n} from './FootFallHeatMapView.types';\nimport { DEFAULT_FOOTFALL_TILE_ICONS } from './FootFallHeatMapView.types';\nimport {\n deriveFootfallHeatMapKpiStrip,\n type FootfallHeatMapDerivedStrip,\n} from './footfallHeatMapDerivedStrip';\nimport {\n buildTreemapNodes,\n createTreemapTileColorResolver,\n getNestedList,\n hashColor,\n parseMinutes,\n parseZoneKpiStripFromRaw,\n preprocessData,\n skipSingleBranchLevels,\n type TreemapNode,\n type ZoneAnalyticsFlatItem,\n type ZoneAnalyticsHierarchy,\n} from './footfallHeatMapTree';\n\nexport type {\n FootFallHeatMapKpiStripPresentation,\n FootFallHeatMapKpiSummaryCardItem,\n FootFallHeatMapSummaryKpis,\n FootFallHeatMapViewProps,\n} from './FootFallHeatMapView.types';\n\ninterface DataShape {\n previous: TreemapNode[][];\n current: TreemapNode[];\n}\n\ntype RankedStripItem =\n FootfallHeatMapDerivedStrip['rankedBarList']['items'][number];\ntype RankedStripSegment = NonNullable<RankedStripItem['segments']>[number];\n\nfunction toDisplayNumber(value: number): string {\n if (!Number.isFinite(value)) return '0';\n return new Intl.NumberFormat('en-IN').format(value);\n}\n\nfunction resolveSegmentFill(\n presentation: FootFallHeatMapKpiStripPresentation | undefined,\n segmentIndex: number,\n dataColor: string | undefined\n): string {\n const palette = presentation?.segmentColors;\n if (palette && palette.length > 0) {\n return palette[segmentIndex % palette.length] ?? dataColor ?? '#90A4AE';\n }\n return dataColor ?? '#90A4AE';\n}\n\nfunction InlineStatCard({\n icon,\n title,\n value,\n sx,\n iconColor = '#1565C0',\n}: {\n icon: string;\n title: string;\n value: number;\n sx?: SxProps<Theme>;\n iconColor?: string;\n}) {\n return (\n <Paper\n elevation={0}\n sx={\n [\n {\n bgcolor: '#fff',\n border: '1px solid #E0E0E0',\n borderRadius: 2,\n p: 1.5,\n minWidth: 180,\n flex: '1 1 240px',\n maxWidth: 340,\n },\n ...(sx ? [sx] : []),\n ] as SxProps<Theme>\n }\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.5}>\n <Icon\n icon={icon}\n width={28}\n height={28}\n color={iconColor}\n style={{ flexShrink: 0 }}\n />\n <Stack spacing={0.15}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 500, color: 'text.primary' }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"h6\"\n sx={{ lineHeight: 1.1, fontWeight: 700, color: 'text.primary' }}\n >\n {toDisplayNumber(value)}\n </Typography>\n </Stack>\n </Stack>\n </Paper>\n );\n}\n\nfunction InlineSegmentStrip({\n item,\n scaleTotal,\n presentation,\n}: {\n item: RankedStripItem;\n scaleTotal: number;\n presentation?: FootFallHeatMapKpiStripPresentation;\n}) {\n const segments = item.segments ?? [];\n const lastIdx = segments.length - 1;\n const segmentTotal = segments.reduce((sum, seg) => sum + seg.value, 0);\n const total = item.value > 0 ? item.value : segmentTotal;\n const scaleBase = scaleTotal > 0 ? scaleTotal : total;\n const filledPercent = Math.max(\n 0,\n Math.min(100, scaleBase > 0 ? (total / scaleBase) * 100 : 0)\n );\n const barHeight = presentation?.barHeight ?? 12;\n const trackInsetPx = presentation?.trackInsetPx ?? 3;\n const trackBg = presentation?.trackBackgroundColor ?? '#ECEFF3';\n return (\n <Stack spacing={0.75}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={1}\n >\n <Typography\n variant=\"subtitle2\"\n sx={\n [\n { fontWeight: 700 },\n ...(presentation?.segmentTitleSx\n ? [presentation.segmentTitleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {item.label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 700, color: 'text.secondary' },\n ...(presentation?.segmentValueSx\n ? [presentation.segmentValueSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {toDisplayNumber(item.value)}\n </Typography>\n </Stack>\n <Box\n sx={{\n width: '100%',\n height: barHeight,\n borderRadius: 999,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'stretch',\n backgroundColor: trackBg,\n px: `${trackInsetPx}px`,\n boxSizing: 'border-box',\n }}\n >\n {segments.map((segment, idx) => {\n const widthPercent =\n total > 0 ? (segment.value / total) * filledPercent : 0;\n const isLast = idx === lastIdx;\n const fill = resolveSegmentFill(presentation, idx, segment.color);\n return (\n <Tooltip\n key={segment.id}\n title={(() => {\n if (presentation?.renderSegmentTooltip) {\n const custom = presentation.renderSegmentTooltip({\n segment,\n segmentIndex: idx,\n itemLabel: item.label,\n itemValue: item.value,\n } satisfies FootFallHeatMapKpiStripSegmentTooltipRenderContext);\n return custom == null ? '' : custom;\n }\n return (\n <InlineSegmentTooltipCard\n segment={segment}\n dotColor={fill}\n cardSx={presentation?.segmentTooltipCardSx}\n />\n );\n })()}\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: inlineSegmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n width: `${Math.max(0, widthPercent)}%`,\n backgroundColor: fill,\n minWidth: segment.value > 0 ? 3 : 0,\n cursor: 'pointer',\n borderTopLeftRadius: idx === 0 ? 999 : 0,\n borderBottomLeftRadius: idx === 0 ? 999 : 0,\n borderTopRightRadius: isLast ? 999 : 0,\n borderBottomRightRadius: isLast ? 999 : 0,\n }}\n />\n </Tooltip>\n );\n })}\n </Box>\n </Stack>\n );\n}\n\n/** Match the segmented tooltip shell used in RankedBarList. */\nconst inlineSegmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst inlineSegmentTooltipCardSx: SxProps<Theme> = {\n maxWidth: 280,\n bgcolor: '#fff',\n borderRadius: 1,\n border: '1px solid #E8E8E8',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n overflow: 'hidden',\n};\n\nfunction InlineSegmentTooltipCard({\n segment,\n dotColor,\n cardSx,\n}: {\n segment: RankedStripSegment;\n dotColor: string;\n cardSx?: SxProps<Theme>;\n}): React.ReactElement {\n const tooltipSurfaceSx = cardSx\n ? ([inlineSegmentTooltipCardSx, cardSx] as SxProps<Theme>)\n : inlineSegmentTooltipCardSx;\n return (\n <Box sx={tooltipSurfaceSx}>\n <Box sx={{ height: 3, bgcolor: 'grey.200', width: '100%' }} />\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 0.5,\n rowGap: 0.5,\n px: 1.5,\n py: 1.25,\n }}\n >\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: dotColor,\n flexShrink: 0,\n }}\n />\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.label}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {' : '}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {toDisplayNumber(segment.value)}\n </Typography>\n </Box>\n </Box>\n );\n}\n\nfunction FootfallHeatMapKpiRankedBlock({\n strip,\n stackSx,\n presentation,\n}: {\n strip: FootfallHeatMapDerivedStrip;\n stackSx?: SxProps<Theme>;\n presentation?: FootFallHeatMapKpiStripPresentation;\n}) {\n const { summaryKpis, rankedBarList } = strip;\n const scaleTotal = Math.max(\n summaryKpis.overallVisitors,\n ...rankedBarList.items.map(item => item.value)\n );\n const statIcon = presentation?.statCardIconColor ?? '#1565C0';\n const customSummary = presentation?.summaryCards?.(summaryKpis);\n const useCustomSummary = customSummary !== undefined;\n\n return (\n <Stack\n spacing={2}\n sx={\n [\n { width: '100%' },\n ...(stackSx ? [stackSx] : []),\n ...(presentation?.kpiContainerSx\n ? [presentation.kpiContainerSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {useCustomSummary && customSummary.length === 0 ? null : (\n <Stack\n direction=\"row\"\n spacing={1.5}\n flexWrap=\"wrap\"\n useFlexGap\n sx={\n presentation?.summaryRowSx\n ? ([presentation.summaryRowSx] as SxProps<Theme>)\n : undefined\n }\n >\n {useCustomSummary\n ? customSummary.map(card => (\n <InlineStatCard\n key={card.id}\n icon={card.icon ?? 'mdi:chart-box-outline'}\n title={card.title}\n value={card.value}\n sx={\n [presentation?.statCardSx, card.sx].filter(\n Boolean\n ) as SxProps<Theme>\n }\n iconColor={card.iconColor ?? statIcon}\n />\n ))\n : [\n <InlineStatCard\n key=\"default-stores\"\n icon=\"mdi:store-marker-outline\"\n title=\"No. of Stores\"\n value={summaryKpis.storeCount}\n sx={presentation?.statCardSx}\n iconColor={statIcon}\n />,\n <InlineStatCard\n key=\"default-visitors\"\n icon=\"fluent:people-community-16-filled\"\n title=\"Overall Visitors\"\n value={summaryKpis.overallVisitors}\n sx={presentation?.statCardSx}\n iconColor={statIcon}\n />,\n ]}\n </Stack>\n )}\n <Stack\n spacing={1.25}\n sx={\n [\n { pt: 0.5, pb: 1 },\n ...(presentation?.rankedListStackSx\n ? [presentation.rankedListStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {rankedBarList.items.map(item => (\n <InlineSegmentStrip\n key={item.id}\n item={item}\n scaleTotal={scaleTotal}\n presentation={presentation}\n />\n ))}\n </Stack>\n </Stack>\n );\n}\n\ntype HierarchyLevel = 'Country' | 'Region' | 'State' | 'City';\nconst HIERARCHY_LEVELS: readonly HierarchyLevel[] = [\n 'Country',\n 'Region',\n 'State',\n 'City',\n] as const;\n\nfunction collectNodesAtDepth(\n nodes: TreemapNode[],\n depth: number\n): TreemapNode[] {\n if (depth <= 0) return nodes;\n return nodes.flatMap(node => collectNodesAtDepth(node.list ?? [], depth - 1));\n}\n\nfunction normalizeNodePercentages(nodes: TreemapNode[]): TreemapNode[] {\n const totalRaw = nodes.reduce((sum, node) => sum + (node._raw ?? 0), 0) || 1;\n return nodes.map(node => {\n const raw = node._raw ?? 0;\n const pct = (raw / totalRaw) * 100;\n return {\n ...node,\n value: pct,\n originalValue: pct,\n };\n });\n}\n\nfunction parseStartPath(path?: string | string[] | null): string[] {\n if (!path) return [];\n const raw = Array.isArray(path) ? path : String(path).split('/');\n return raw.map(segment => String(segment).trim()).filter(Boolean);\n}\n\nfunction scopeNodesByPath(\n rootNodes: TreemapNode[],\n startFromPath?: string | string[] | null,\n mode: 'children' | 'self' = 'children'\n): TreemapNode[] | null {\n const segments = parseStartPath(startFromPath);\n if (segments.length === 0) return null;\n\n let current = rootNodes;\n let matched: TreemapNode | undefined;\n\n for (const segment of segments) {\n const key = segment.toLowerCase();\n matched = current.find(\n node => String(node.name).trim().toLowerCase() === key\n );\n if (!matched) return null;\n current = matched.list ?? [];\n }\n\n if (!matched) return null;\n\n if (mode === 'self') {\n return normalizeNodePercentages([matched]);\n }\n\n if ((matched.list ?? []).length > 0) {\n return normalizeNodePercentages(matched.list);\n }\n\n return normalizeNodePercentages([matched]);\n}\n\nfunction buildRootNodesFromInitial(\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[],\n sortBy: 'walkins' | 'dwell',\n startFromLevel: HierarchyLevel,\n startFromPath: string | string[] | undefined,\n startFromPathMode: 'children' | 'self',\n tileColorFromSeed: (seed: string) => string\n): TreemapNode[] {\n if (Array.isArray(initialData)) {\n const items = initialData as ZoneAnalyticsFlatItem[];\n const total =\n items.reduce(\n (sum, it) =>\n sum +\n (sortBy === 'walkins'\n ? it.visitor_count\n : parseMinutes(it.avg_dwell_time)),\n 0\n ) || 1;\n\n return items.map(it => {\n const raw =\n sortBy === 'walkins'\n ? it.visitor_count\n : parseMinutes(it.avg_dwell_time);\n const percentage = (raw / total) * 100;\n\n return {\n name: it.category_name,\n value: percentage,\n originalValue: percentage,\n color: tileColorFromSeed(`flat/${it.category_id}`),\n overallData: { count: it.visitor_count, dwell: it.avg_dwell_time },\n list: [],\n leafMetrics: undefined,\n zoneKpiStrip: parseZoneKpiStripFromRaw(\n it as unknown as Record<string, unknown>\n ),\n _raw: raw,\n };\n });\n }\n\n const hierarchical = initialData as ZoneAnalyticsHierarchy;\n const topContainer =\n (hierarchical?.Country && {\n key: 'Country' as const,\n container: hierarchical.Country,\n }) ||\n (hierarchical?.Region && {\n key: 'Region' as const,\n container: hierarchical.Region,\n }) ||\n (hierarchical?.State && {\n key: 'State' as const,\n container: hierarchical.State,\n }) ||\n (hierarchical?.City && {\n key: 'City' as const,\n container: hierarchical.City,\n }) ||\n null;\n\n if (!topContainer) return [];\n\n const builtRoot = buildTreemapNodes({\n container: topContainer.container as Record<string, unknown>,\n sortBy,\n pathKey: topContainer.key,\n tileColorFromSeed,\n });\n\n const scopedNodes = scopeNodesByPath(\n builtRoot,\n startFromPath,\n startFromPathMode\n );\n if (scopedNodes) return scopedNodes;\n\n const topIdx = HIERARCHY_LEVELS.indexOf(topContainer.key);\n const startIdx = HIERARCHY_LEVELS.indexOf(startFromLevel);\n if (topIdx === -1 || startIdx === -1 || startIdx <= topIdx) {\n return builtRoot;\n }\n\n const depthDelta = startIdx - topIdx;\n const collected = collectNodesAtDepth(builtRoot, depthDelta);\n return normalizeNodePercentages(collected);\n}\n\nfunction resolveIconSize(\n prop: FootFallHeatMapIconSize | undefined,\n ctx: FootFallHeatMapIconSizeContext\n): number {\n if (prop === undefined || prop === 'auto') {\n return Math.max(8, ctx.baseIconSize);\n }\n if (typeof prop === 'number') {\n return Math.max(8, prop);\n }\n return Math.max(8, prop(ctx));\n}\n\nfunction resolveIconColor(\n prop: FootFallHeatMapIconColor | undefined,\n tileColor: string,\n role: FootFallHeatMapTileIconRole\n): string {\n const p = prop ?? 'tile';\n if (p === 'tile') {\n if (role === 'header') return '#757575';\n return tileColor;\n }\n if (typeof p === 'string') return p;\n return p({ tileColor, role });\n}\n\n/**\n * In-store zone treemap with drill-down and leaf KPIs. Pass `initialData` from your API or mocks.\n */\nexport function FootFallHeatMapView({\n initialData,\n isLoading = false,\n isFetching = false,\n error,\n title = 'In-Store Zone Performance',\n infoTooltip = 'How different sections or product zones perform by traffic share. Block size = share of activity.',\n brandLabel = 'Reliance Digital',\n icons: iconsProp,\n iconSize: iconSizeProp,\n iconColor: iconColorProp,\n headerInfoIconSize = 22,\n treemap: treemapProp,\n tree: treeProp,\n kpiStrip: kpiStripPresentation,\n emptyStatePlaceholderProps,\n onPathChange,\n}: FootFallHeatMapViewProps) {\n const sortBy = treeProp?.sortBy ?? 'walkins';\n const startFromLevel = treeProp?.startFromLevel ?? 'Region';\n const startFromPath = treeProp?.startFromPath;\n const startFromPathMode = treeProp?.startFromPathMode ?? 'children';\n const terminalNodeView = treeProp?.terminalNodeView ?? 'details';\n const collapseSingleChildLevels =\n treeProp?.collapseSingleChildLevels ?? false;\n const customBuildNodes = treeProp?.buildNodes;\n const icons = { ...DEFAULT_FOOTFALL_TILE_ICONS, ...iconsProp };\n const treemapLayout = {\n heightWithBreadcrumb: treemapProp?.heightWithBreadcrumb ?? 400,\n heightWithoutBreadcrumb: treemapProp?.heightWithoutBreadcrumb ?? 450,\n terminalSingleCardHeight: treemapProp?.terminalSingleCardHeight,\n leafDetailsBodyHeight: treemapProp?.leafDetailsBodyHeight,\n leafDetailsBodySx: treemapProp?.leafDetailsBodySx,\n aspectRatio: treemapProp?.aspectRatio ?? 4 / 3,\n stroke: treemapProp?.stroke ?? '#ffffff',\n fill: treemapProp?.fill ?? '#ffffff',\n tileMetrics: treemapProp?.tileMetrics,\n tileColors: treemapProp?.tileColors,\n };\n const tileMetrics = treemapLayout.tileMetrics;\n const tileColorFromSeed = useMemo(\n () => createTreemapTileColorResolver(treemapLayout.tileColors),\n [treemapLayout.tileColors]\n );\n const [data, setData] = useState<DataShape>({\n previous: [],\n current: [],\n });\n const [showLeaf, setShowLeaf] = useState(false);\n const [trackingDetails, setTrackingDetails] = useState<TreemapNode[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!initialData) {\n setData({ previous: [], current: [] });\n setShowLeaf(false);\n setTrackingDetails([]);\n return;\n }\n\n setLoading(true);\n const built = customBuildNodes\n ? customBuildNodes(initialData, { sortBy, tileColorFromSeed })\n : buildRootNodesFromInitial(\n initialData,\n sortBy,\n startFromLevel,\n startFromPath,\n startFromPathMode,\n tileColorFromSeed\n );\n const rootNodes = collapseSingleChildLevels\n ? skipSingleBranchLevels(built)\n : preprocessData(built);\n setData({ previous: [], current: rootNodes });\n setShowLeaf(false);\n setTrackingDetails([]);\n setLoading(false);\n }, [\n initialData,\n sortBy,\n customBuildNodes,\n collapseSingleChildLevels,\n startFromLevel,\n startFromPath,\n startFromPathMode,\n tileColorFromSeed,\n ]);\n\n const derivedKpiStrip = useMemo(() => {\n if (isLoading || loading || !initialData) return null;\n const activeZoneForStrip: TreemapNode | undefined =\n trackingDetails.length > 0\n ? trackingDetails[trackingDetails.length - 1]\n : undefined;\n return deriveFootfallHeatMapKpiStrip(\n activeZoneForStrip,\n data.current ?? []\n );\n }, [isLoading, loading, initialData, trackingDetails, data]);\n\n const formatPercentage = (value: number) => {\n if (typeof value !== 'number') return '0%';\n const formatted = value.toFixed(2);\n const trimmed = formatted.replace(/\\.?0+$/, '');\n return `${trimmed}%`;\n };\n\n const renderCustomizedContent = (\n props: Record<string, unknown>\n ): React.ReactElement => {\n const x = props.x as number;\n const y = props.y as number;\n const width = props.width as number;\n const height = props.height as number;\n const name = props.name as string;\n const index = props.index as number;\n const payload =\n (props?.payload as TreemapNode & { payload?: TreemapNode }) ?? props;\n const inner = (payload as { payload?: TreemapNode }).payload ?? payload;\n const originalValue =\n (inner as TreemapNode)?.originalValue ??\n data?.current[index]?.originalValue;\n const tileColor =\n (inner as TreemapNode)?.color ??\n (props?.color as string) ??\n (props?.fill as string) ??\n hashColor(String(name ?? index ?? ''));\n\n const handleClick = () => {\n const p = inner as TreemapNode;\n setTrackingDetails(pre => {\n const expectedDepth = data.previous.length;\n const normalizedPath = pre.slice(0, expectedDepth);\n const nextDetails = [...normalizedPath, p];\n onPathChange?.(\n nextDetails.map(t => String(t?.name ?? '').trim()).filter(Boolean)\n );\n return nextDetails;\n });\n\n const nested = getNestedList(p);\n const hasNestedChildren = Boolean(nested?.length);\n const isStoresLevel = p?._childContainerKey === 'Stores';\n const shouldShowDetails =\n terminalNodeView === 'details' && (!hasNestedChildren || isStoresLevel);\n const shouldDrillDeeper = hasNestedChildren && !shouldShowDetails;\n\n if (shouldDrillDeeper) {\n setShowLeaf(false);\n setData({\n previous: [[...data.current], ...data.previous],\n current: collapseSingleChildLevels\n ? skipSingleBranchLevels(nested ?? [])\n : preprocessData(nested ?? []),\n });\n return;\n }\n\n if (shouldShowDetails) {\n setShowLeaf(true);\n setData({\n previous: [[...data.current], ...data.previous],\n current: [],\n });\n return;\n }\n\n const alreadyFocusedTerminalTile =\n !hasNestedChildren &&\n data.current.length === 1 &&\n String(data.current[0]?.name ?? '') === String(p?.name ?? '');\n if (alreadyFocusedTerminalTile) return;\n\n setShowLeaf(false);\n setData({\n previous: [[...data.current], ...data.previous],\n current: preprocessData([p]),\n });\n };\n\n const minDim = Math.min(width, height);\n const effectiveDim = Math.sqrt(width * height);\n const isLarge = minDim > 200;\n const isSmall = minDim <= 120;\n\n const fontSize = Math.max(11, Math.min(24, Math.floor(effectiveDim * 0.1)));\n const baseIconSize = Math.max(10, fontSize - 2);\n const padding = Math.max(0.5, Math.min(3, minDim * 0.015));\n\n const sizeCtx = (\n role: FootFallHeatMapTileIconRole\n ): FootFallHeatMapIconSizeContext => ({\n baseIconSize,\n role,\n fontSize,\n minDim,\n effectiveDim,\n });\n\n const visitorsIconPx = resolveIconSize(iconSizeProp, sizeCtx('visitors'));\n const dwellIconPx = resolveIconSize(iconSizeProp, sizeCtx('dwell'));\n const visitorsIconColor = resolveIconColor(\n iconColorProp,\n tileColor,\n 'visitors'\n );\n const dwellIconColor = resolveIconColor(iconColorProp, tileColor, 'dwell');\n\n const p = inner as TreemapNode;\n\n return (\n <foreignObject\n x={x}\n y={y}\n width={width}\n height={height}\n style={{ borderRadius: '12px', overflow: 'hidden' }}\n >\n <Stack\n onClick={handleClick}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') handleClick();\n }}\n role=\"button\"\n tabIndex={0}\n sx={{\n backgroundColor: tileColor,\n color: '#FFFFFF',\n p: padding,\n textAlign: 'center',\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: isSmall\n ? width > height\n ? 'row'\n : 'column'\n : 'column',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n overflow: 'hidden',\n border: '1px solid #FFFFFF',\n gap: isSmall ? 1 : 2,\n borderRadius: '12px',\n transition: 'transform 0.5s ease-in-out',\n '&:hover': {\n transform: 'scale(1.10)',\n },\n }}\n >\n <Stack\n direction={isSmall ? 'row' : 'column'}\n justifyContent=\"center\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n sx={{\n mb: isSmall ? 0.5 : 1,\n }}\n >\n <Typography\n sx={{\n fontSize: `${fontSize}px!important`,\n fontWeight: 500,\n fontFamily: 'Noto Sans, sans-serif',\n color: '#fff',\n maxWidth: '100%',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n lineHeight: 1.2,\n textAlign: 'center',\n }}\n title={name}\n >\n {name}\n </Typography>\n <Typography\n sx={{\n fontSize: `${fontSize}px!important`,\n fontWeight: '700',\n textAlign: 'center',\n color: '#fff',\n }}\n >\n {formatPercentage(Number(originalValue))}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n sx={\n [\n {\n gap: isSmall ? 0.5 : 1,\n },\n ...(tileMetrics?.metricsRowStackSx != null\n ? [tileMetrics.metricsRowStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n sx={\n [\n {\n backgroundColor: '#f4f4f4',\n color: '#333',\n px: isLarge ? 2 : 1,\n py: isLarge ? 1 : 0.3,\n borderRadius: 10,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n },\n ...(tileMetrics?.metricPillStackSx != null\n ? [tileMetrics.metricPillStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Box\n sx={\n [\n {\n backgroundColor: '#ffff',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n ...(tileMetrics?.metricPillIconBoxSx != null\n ? [tileMetrics.metricPillIconBoxSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Icon\n icon={icons.visitors}\n color={visitorsIconColor}\n fontSize={visitorsIconPx}\n />\n </Box>\n <Typography\n sx={\n [\n {\n fontSize: `${Math.max(8, fontSize * 0.6)}px !important`,\n fontWeight: 600,\n fontFamily: 'Noto Sans, sans-serif',\n whiteSpace: 'nowrap',\n },\n ...(tileMetrics?.metricPillValueTypographySx != null\n ? [tileMetrics.metricPillValueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {p?.overallData ? p?.overallData.count : ''}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n sx={\n [\n {\n backgroundColor: '#f4f4f4',\n color: '#333',\n px: isLarge ? 2 : 1,\n py: isLarge ? 1 : 0.3,\n borderRadius: 10,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n },\n ...(tileMetrics?.metricPillStackSx != null\n ? [tileMetrics.metricPillStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Box\n sx={\n [\n {\n backgroundColor: '#ffff',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n ...(tileMetrics?.metricPillIconBoxSx != null\n ? [tileMetrics.metricPillIconBoxSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Icon\n icon={icons.dwell}\n color={dwellIconColor}\n fontSize={dwellIconPx}\n />\n </Box>\n <Typography\n sx={\n [\n {\n fontSize: `${Math.max(8, fontSize * 0.6)}px !important`,\n fontWeight: 600,\n fontFamily: 'Noto Sans, sans-serif',\n whiteSpace: 'nowrap',\n },\n ...(tileMetrics?.metricPillValueTypographySx != null\n ? [tileMetrics.metricPillValueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {p?.overallData ? p?.overallData.dwell : ''}\n </Typography>\n </Stack>\n </Stack>\n </Stack>\n </foreignObject>\n );\n };\n\n const handleClose = () => {\n setShowLeaf(false);\n const history = trackingDetails.slice(0, -1);\n setTrackingDetails(history);\n onPathChange?.(\n history.map(t => String(t?.name ?? '').trim()).filter(Boolean)\n );\n const obj1 = {\n current: data.previous[0] ?? [],\n previous: data.previous.slice(1),\n };\n setData(obj1);\n };\n\n const LabelTag = ({ textColor = '#f0f0f0' }: { textColor?: string }) => {\n const pathSegments = trackingDetails\n .map(t => String(t?.name ?? '').trim())\n .filter(Boolean);\n const breadcrumbSegments = Array.from(new Set([...pathSegments].reverse()));\n\n return (\n <Stack direction=\"row\" alignItems=\"baseline\" flexWrap=\"wrap\" gap={1.5}>\n {breadcrumbSegments.length === 0 ? (\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: '12px !important',\n },\n }}\n fontSize={'26px !important'}\n fontWeight={600}\n color={textColor}\n >\n {brandLabel}\n </Typography>\n ) : (\n <>\n {breadcrumbSegments.map((seg, i) => (\n <React.Fragment key={`${seg}-${i}`}>\n {i > 0 ? (\n <Typography\n component=\"span\"\n fontSize={'15px !important'}\n fontWeight={400}\n color={textColor}\n sx={{ px: 0.25 }}\n >\n /\n </Typography>\n ) : null}\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: i === 0 ? '12px !important' : '11px !important',\n },\n }}\n fontSize={i === 0 ? '26px !important' : '15px !important'}\n fontWeight={i === 0 ? 600 : 500}\n color={textColor}\n >\n {seg}\n </Typography>\n </React.Fragment>\n ))}\n {brandLabel ? (\n <>\n <Typography\n component=\"span\"\n fontSize={'15px !important'}\n fontWeight={400}\n color={textColor}\n >\n /\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: '11px !important',\n },\n }}\n fontSize={'15px !important'}\n fontWeight={500}\n color={textColor}\n >\n {brandLabel}\n </Typography>\n </>\n ) : null}\n </>\n )}\n </Stack>\n );\n };\n\n const is500Error =\n error !== null &&\n error !== undefined &&\n typeof error === 'object' &&\n 'status' in error &&\n (error as { status: number }).status === 500;\n\n if (is500Error) {\n return (\n <Box sx={{ p: 4, textAlign: 'center' }}>\n <Typography color=\"error\">\n Something went wrong (500). Try again later.\n </Typography>\n </Box>\n );\n }\n\n if (isLoading || loading) {\n return (\n <Skeleton\n variant=\"rectangular\"\n width=\"100%\"\n height={400}\n sx={{ borderRadius: '10px' }}\n />\n );\n }\n\n const showChart = !isLoading && initialData && !loading;\n\n const headerDataForBreadcrumb =\n trackingDetails.length > 0 ? trackingDetails.at(-1) : undefined;\n const headerData = headerDataForBreadcrumb;\n const isDrilledIntoZone = Boolean(\n showChart &&\n data?.previous &&\n data.previous.length > 0 &&\n headerDataForBreadcrumb\n );\n\n const zoneBarColor = headerData?.color ?? '#0A4FCB';\n /** Breadcrumb + % always white on the zone-colored drill bar (design). */\n const zoneBarHeaderFg = '#fff';\n\n const isTerminalSingleCardView = Boolean(\n showChart &&\n !showLeaf &&\n trackingDetails.length > 0 &&\n data.current.length === 1 &&\n !(getNestedList(data.current[0])?.length ?? 0)\n );\n /**\n * `terminalNodeView: \"card\"` keeps a single treemap tile at the leaf — but the zone KPI strip above\n * already shows the same zone name, share %, and breakdown. Omit the treemap to avoid a duplicate\n * “full chart” block (Story: Hierarchical (Terminal card reduced height)).\n */\n const hideTreemapForTerminalCardWithKpi =\n terminalNodeView === 'card' &&\n isTerminalSingleCardView &&\n derivedKpiStrip !== null;\n /** KPI + ranked list: visible for terminal nodes (card/details). Hidden for intermediate drill levels. */\n const showKpiStrip = Boolean(\n showChart && derivedKpiStrip && (showLeaf || isTerminalSingleCardView)\n );\n const showLeafDetailsBody = Boolean(showChart && showLeaf);\n const leafDetailsBodyHeight =\n treemapLayout.leafDetailsBodyHeight ??\n Math.max(180, treemapLayout.heightWithBreadcrumb - 140);\n const treemapHeight = isTerminalSingleCardView\n ? (treemapLayout.terminalSingleCardHeight ??\n treemapLayout.heightWithBreadcrumb)\n : data?.previous?.length > 0\n ? treemapLayout.heightWithBreadcrumb\n : treemapLayout.heightWithoutBreadcrumb;\n const hasTreemapData = (data?.current?.length ?? 0) > 0;\n\n const headerIconPx = resolveIconSize(iconSizeProp, {\n baseIconSize: headerInfoIconSize,\n role: 'header',\n fontSize: 14,\n minDim: 24,\n effectiveDim: headerInfoIconSize,\n });\n const headerIconColorResolved = resolveIconColor(\n iconColorProp,\n '#888888',\n 'header'\n );\n\n return (\n <Stack width=\"100%\">\n <Box\n sx={{\n width: '100%',\n mb: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n }}\n >\n <Typography variant=\"h6\" fontWeight={700}>\n {title}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" gap={1}>\n {isFetching ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n Updating…\n </Typography>\n ) : null}\n <Tooltip title={infoTooltip} arrow>\n <IconButton\n size=\"small\"\n aria-label=\"Zone performance info\"\n edge=\"end\"\n >\n <Icon\n icon={icons.headerInfo}\n width={headerIconPx}\n height={headerIconPx}\n color={headerIconColorResolved}\n />\n </IconButton>\n </Tooltip>\n </Stack>\n </Box>\n\n {data?.previous?.length > 0 && headerData ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{\n px: 1.25,\n py: 1,\n mb: 0,\n borderRadius: '10px 10px 0 0',\n color: zoneBarHeaderFg,\n backgroundColor: zoneBarColor,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Button\n size=\"small\"\n onClick={handleClose}\n startIcon={\n <Icon\n icon=\"mdi:chevron-left\"\n width={16}\n height={16}\n color={zoneBarColor}\n />\n }\n sx={{\n minWidth: 0,\n color: zoneBarColor,\n bgcolor: '#fff',\n px: 1,\n borderRadius: 999,\n '&:hover': { bgcolor: '#F5F5F5' },\n }}\n >\n Back\n </Button>\n <LabelTag textColor={zoneBarHeaderFg} />\n </Stack>\n <Typography\n variant=\"h6\"\n sx={{ color: zoneBarHeaderFg, fontWeight: 700 }}\n >\n ({formatPercentage(Number(headerData?.originalValue ?? 0))})\n </Typography>\n </Stack>\n ) : null}\n\n {/* KPI + ranked list only in drilled zone (below zone-colored header, above treemap) */}\n {isDrilledIntoZone && showKpiStrip && derivedKpiStrip ? (\n <FootfallHeatMapKpiRankedBlock\n strip={derivedKpiStrip}\n presentation={kpiStripPresentation}\n stackSx={{\n mb: showLeafDetailsBody ? 0 : 2,\n px: 2,\n pt: 2,\n bgcolor: '#fff',\n border: '1px solid #E8E8E8',\n borderTop: 'none',\n borderBottom: showLeafDetailsBody ? 'none' : undefined,\n borderRadius: showLeafDetailsBody ? 0 : '0 0 8px 8px',\n }}\n />\n ) : null}\n\n {showLeafDetailsBody ? (\n <Box\n sx={\n [\n {\n mb: 2,\n bgcolor: '#fff',\n border: '1px solid #E8E8E8',\n borderTop: 'none',\n borderRadius: '0 0 8px 8px',\n minHeight: leafDetailsBodyHeight,\n },\n ...(treemapLayout.leafDetailsBodySx\n ? [treemapLayout.leafDetailsBodySx]\n : []),\n ] as SxProps<Theme>\n }\n />\n ) : null}\n\n {showLeaf ? null : showChart ? (\n hideTreemapForTerminalCardWithKpi ? null : hasTreemapData ? (\n <ResponsiveContainer width=\"100%\" height={treemapHeight}>\n <Treemap\n data={data?.current ?? []}\n dataKey=\"value\"\n stroke={treemapLayout.stroke}\n fill={treemapLayout.fill}\n content={renderCustomizedContent as never}\n isAnimationActive={false}\n aspectRatio={treemapLayout.aspectRatio}\n animationDuration={0}\n style={{ borderRadius: '12px' }}\n />\n </ResponsiveContainer>\n ) : (\n <ChartEmptyState\n minHeight={treemapHeight}\n {...emptyStatePlaceholderProps}\n />\n )\n ) : (\n <ChartEmptyState minHeight={400} {...emptyStatePlaceholderProps} />\n )}\n </Stack>\n );\n}\n\nexport default FootFallHeatMapView;\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\nimport type { ChartEmptyStateProps } from '../../utils/ChartEmptyState';\nimport type {\n FootFallHeatMapTreemapColorCustomization,\n TreemapNode,\n ZoneAnalyticsFlatItem,\n ZoneAnalyticsHierarchy,\n} from './footfallHeatMapTree';\n\nexport const DEFAULT_FOOTFALL_TILE_ICONS = {\n visitors: 'fluent:people-community-16-filled',\n dwell: 'clarity:clock-solid',\n headerInfo: 'mdi:information-outline',\n} as const;\n\nexport type FootFallHeatMapTileIconRole = 'visitors' | 'dwell' | 'header';\n\nexport type FootFallHeatMapIconSizeContext = {\n /** Auto baseline from tile geometry (px). */\n baseIconSize: number;\n role: FootFallHeatMapTileIconRole;\n fontSize: number;\n minDim: number;\n effectiveDim: number;\n};\n\n/** Pixel size or scale from `baseIconSize` / geometry. */\nexport type FootFallHeatMapIconSize =\n | 'auto'\n | number\n | ((ctx: FootFallHeatMapIconSizeContext) => number);\n\n/** `tile` = match tile fill color; otherwise CSS color string or resolver. */\nexport type FootFallHeatMapIconColor =\n | 'tile'\n | string\n | ((ctx: { tileColor: string; role: FootFallHeatMapTileIconRole }) => string);\n\nexport type FootFallHeatMapIcons = {\n /** Iconify id for the visitor count chip in each tile. */\n visitors?: string;\n /** Iconify id for the dwell time chip. */\n dwell?: string;\n /** Iconify id for the title-row info button. */\n headerInfo?: string;\n};\n\n/**\n * Optional `sx` for visitor/dwell **metric chips** inside each treemap `foreignObject` tile\n * (replaces brittle `& foreignObject > .MuiStack-root …` overrides on a parent wrapper).\n */\nexport type FootFallHeatMapTileMetricsCustomization = {\n /** Merged onto the **row** `Stack` that wraps both metric pills (below title / %). */\n metricsRowStackSx?: SxProps<Theme>;\n /** Merged onto each **pill** `Stack` (visitors + dwell) after built-in chip styles. */\n metricPillStackSx?: SxProps<Theme>;\n /** Merged onto the **numeric Typography** inside each pill after built-in styles. */\n metricPillValueTypographySx?: SxProps<Theme>;\n /** Merged onto the **icon circle `Box`** inside each pill after built-in styles. */\n metricPillIconBoxSx?: SxProps<Theme>;\n};\n\nexport type FootFallHeatMapTreemapLayout = {\n /** Pixel height when a breadcrumb strip is visible above the chart. */\n heightWithBreadcrumb?: number;\n /** Pixel height when there is no breadcrumb. */\n heightWithoutBreadcrumb?: number;\n /** Optional pixel height for terminal single-card view (default falls back to `heightWithBreadcrumb`). */\n terminalSingleCardHeight?: number;\n /** Optional pixel height for the blank body below terminal details strip (default: derived from treemap height). */\n leafDetailsBodyHeight?: number;\n /** Recharts treemap aspect ratio (width/height per sector logic). */\n aspectRatio?: number;\n stroke?: string;\n fill?: string;\n /** MUI `sx` merged onto the blank terminal-details body below the KPI strip. */\n leafDetailsBodySx?: SxProps<Theme>;\n /** Per-tile visitor/dwell metric chip styling (merged on real `Stack` / `Typography` / `Box` nodes). */\n tileMetrics?: FootFallHeatMapTileMetricsCustomization;\n /**\n * Treemap tile **fill** tuning: vivid HSL pipeline from **`hashColor(seed)`**, or a full **`tileColorFromSeed`** override.\n * Wired into default **`buildTreemapNodes`** and passed as **`options.tileColorFromSeed`** to **`tree.buildNodes`**.\n */\n tileColors?: FootFallHeatMapTreemapColorCustomization;\n};\n\nexport type FootFallHeatMapTreeOptions = {\n /** Starting hierarchy level shown in treemap for hierarchical payloads. */\n startFromLevel?: 'Country' | 'Region' | 'State' | 'City';\n /**\n * Optional path to a specific hierarchy node to render first.\n * Example: `'India/North'` or `['India', 'North']`.\n * When provided, this takes precedence over `startFromLevel`.\n */\n startFromPath?: string | string[];\n /**\n * `children` (default): render selected node's immediate children.\n * `self`: render only the selected node tile.\n */\n startFromPathMode?: 'children' | 'self';\n /**\n * Behavior at terminal node (no deeper hierarchy, or final Stores level).\n * - `details` (default): compact KPI + segmented detail view (treemap cleared; optional details body below).\n * - `card`: keep drilling into a single treemap tile when there is no zone KPI strip; when a KPI strip is\n * derived for the terminal zone, the duplicate treemap is omitted so only breadcrumb + KPI strip remain.\n */\n terminalNodeView?: 'card' | 'details';\n /** Sort metric when building node weights from API payloads. */\n sortBy?: 'walkins' | 'dwell';\n /**\n * When true, if the root (or a drill level) has exactly one child, the treemap jumps into that child automatically.\n * Default **false** so **Region → State → City** (and other levels) stay visible instead of skipping straight to cities.\n */\n collapseSingleChildLevels?: boolean;\n /**\n * Replace default hierarchy/flat parsing. Return root-level `TreemapNode[]`\n * (each node may nest `list` children).\n */\n buildNodes?: (\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[] | null,\n options: {\n sortBy: 'walkins' | 'dwell';\n /** From **`treemap.tileColors`** — use for tile `color` fields (same resolver as built-in tree). */\n tileColorFromSeed?: (seed: string) => string;\n }\n ) => TreemapNode[];\n};\n\n/** KPI numbers used for the summary row and passed to `summaryCards`. */\nexport type FootFallHeatMapSummaryKpis = {\n storeCount: number;\n overallVisitors: number;\n};\n\n/** One summary KPI card above the segmented bar (Iconify icon + title + value). */\nexport type FootFallHeatMapKpiSummaryCardItem = {\n id: string;\n title: string;\n value: number;\n /** Iconify id. Default `mdi:chart-box-outline`. */\n icon?: string;\n /** Merged after shared `statCardSx`. */\n sx?: SxProps<Theme>;\n /** Per-card icon color; falls back to `statCardIconColor`. */\n iconColor?: string;\n};\n\nexport type FootFallHeatMapKpiStripSegmentTooltipRenderContext = {\n segment: {\n id: string;\n label: string;\n value: number;\n color?: string;\n };\n segmentIndex: number;\n itemLabel: string;\n itemValue: number;\n};\n\n/**\n * Optional styling for the zone KPI block: summary stat cards, outer panel, segmented bar, and tooltips.\n * Segment colors cycle by index when the palette is shorter than the number of segments.\n */\nexport type FootFallHeatMapKpiStripPresentation = {\n /** Override segment fills; cycles when fewer entries than segments. */\n segmentColors?: readonly string[];\n /** Bar height in px. */\n barHeight?: number;\n /** Horizontal padding inside the track in px (inset from rounded caps). */\n trackInsetPx?: number;\n /** Track background behind segments. */\n trackBackgroundColor?: string;\n\n /** Merged onto the outer KPI panel (container under the breadcrumb). Applied after built-in layout styles. */\n kpiContainerSx?: SxProps<Theme>;\n /** Merged onto the summary KPI cards row `Stack` (direction, spacing, wrap). */\n summaryRowSx?: SxProps<Theme>;\n /** Merged onto each summary stat card (`Paper`). */\n statCardSx?: SxProps<Theme>;\n /** Merged onto the ranked-bar-list items `Stack` (spacing between rows, padding). */\n rankedListStackSx?: SxProps<Theme>;\n /** Icon color for both stat cards. Default `#1565C0`. */\n statCardIconColor?: string;\n /** Zone / row title next to the segmented bar. */\n segmentTitleSx?: SxProps<Theme>;\n /** Total value on the right of the segment row. */\n segmentValueSx?: SxProps<Theme>;\n /** Merged onto the segment tooltip card (popover). */\n segmentTooltipCardSx?: SxProps<Theme>;\n /**\n * Full custom renderer for segmented bar tooltips.\n * When provided, default tooltip card layout is skipped.\n */\n renderSegmentTooltip?: (\n context: FootFallHeatMapKpiStripSegmentTooltipRenderContext\n ) => ReactNode;\n\n /**\n * Build any number of summary KPI cards from live zone metrics. When the returned array is **non-empty**,\n * it replaces the default “No. of Stores” / “Overall Visitors” pair. Return `[]` to hide all summary cards.\n */\n summaryCards?: (\n kpi: FootFallHeatMapSummaryKpis\n ) => readonly FootFallHeatMapKpiSummaryCardItem[];\n};\n\nexport type FootFallHeatMapViewProps = {\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[] | null;\n isLoading?: boolean;\n isFetching?: boolean;\n error?: unknown;\n title?: string;\n /** Tooltip on the header info icon. */\n infoTooltip?: string;\n /** Shown in the drill breadcrumb after `/` (e.g. store name). */\n brandLabel?: string;\n\n icons?: FootFallHeatMapIcons;\n iconSize?: FootFallHeatMapIconSize;\n iconColor?: FootFallHeatMapIconColor;\n /** Info button icon width/height in px when `iconSize` is `auto` (header role). */\n headerInfoIconSize?: number;\n\n treemap?: FootFallHeatMapTreemapLayout;\n tree?: FootFallHeatMapTreeOptions;\n /**\n * KPI zone UI: optional **`summaryCards(kpi)`** for any number of summary stat cards; segmented bar; outer\n * panel; `statCardSx` / `statCardIconColor`; segment row + tooltip styling.\n */\n kpiStrip?: FootFallHeatMapKpiStripPresentation;\n emptyStatePlaceholderProps?: ChartEmptyStateProps;\n /** Callback fired when the navigation path changes (drill-down or back) */\n onPathChange?: (path: string[]) => void;\n};\n","/**\n * Internal: KPI strip + single segmented bar for the **active zone** (same layout at every drill level).\n * Not part of the public footfall-heat-map API.\n */\n\nimport type {\n RankedBarListItem,\n RankedBarListSegment,\n} from '../RankedBarList/RankedBarList.types';\n\nimport type { TreemapNode, ZoneKpiStripPayload } from './footfallHeatMapTree';\n\nconst ZONE_SEGMENT_COLORS = [\n '#E5735F',\n '#7EB0C2',\n '#F4C20D',\n '#6D6ED7',\n] as const;\nconst DEFAULT_SEGMENT_LABELS: [string, string, string, string] = [\n 'Walk-by',\n 'Browsing',\n 'Engaged',\n 'Converted',\n];\n\nfunction parseVisitorCount(raw: string | number | undefined): number {\n if (typeof raw === 'number' && Number.isFinite(raw)) return raw;\n if (typeof raw === 'string') {\n const n = Number(String(raw).replace(/[^\\d.]/g, ''));\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n}\n\nfunction defaultFourParts(total: number): [number, number, number, number] {\n if (total <= 0) return [0, 0, 0, 0];\n const a = Math.round(total * 0.38);\n const b = Math.round(total * 0.32);\n const c = Math.round(total * 0.2);\n const d = total - a - b - c;\n return [a, b, c, d];\n}\n\nfunction rowFromExplicitStrip(\n zoneName: string,\n strip: ZoneKpiStripPayload\n): RankedBarListItem {\n const id = `zone-strip-${encodeURIComponent(zoneName)}`;\n const segments: RankedBarListSegment[] = strip.segments.map((s, i) => ({\n id: `${id}-seg-${i}`,\n label: s.label,\n value: s.value,\n color: ZONE_SEGMENT_COLORS[i],\n }));\n const value = strip.segments.reduce((sum, s) => sum + s.value, 0);\n return { id, label: zoneName, value, segments };\n}\n\nfunction rowFromHeuristicLabel(\n zoneName: string,\n total: number\n): RankedBarListItem {\n const [a, b, c, d] = defaultFourParts(total);\n const id = `zone-heuristic-${encodeURIComponent(zoneName)}`;\n const segments: RankedBarListSegment[] = [a, b, c, d].map((value, i) => ({\n id: `${id}-seg-${i}`,\n label: DEFAULT_SEGMENT_LABELS[i],\n value,\n color: ZONE_SEGMENT_COLORS[i],\n }));\n return { id, label: zoneName, value: a + b + c + d, segments };\n}\n\nexport type FootfallHeatMapDerivedStrip = {\n summaryKpis: { storeCount: number; overallVisitors: number };\n rankedBarList: {\n title: string;\n items: RankedBarListItem[];\n listHeaderLabel: string;\n valueColumnHeader: string;\n };\n};\n\n/**\n * @param activeZone — Last node in the drill path (the zone you are inside). `undefined` at root.\n * @param childTiles — Sibling tiles shown in the treemap (`data.current`).\n */\nexport function deriveFootfallHeatMapKpiStrip(\n activeZone: TreemapNode | undefined,\n childTiles: TreemapNode[]\n): FootfallHeatMapDerivedStrip | null {\n if (activeZone) {\n const childRowsSource = (activeZone.list ?? []).filter(\n n => parseVisitorCount(n.overallData?.count) > 0\n );\n if (childRowsSource.length > 0) {\n const items = childRowsSource.map(node =>\n rowFromHeuristicLabel(\n node.name,\n parseVisitorCount(node.overallData?.count)\n )\n );\n const overallVisitorsFromChildren = childRowsSource.reduce(\n (sum, node) => sum + parseVisitorCount(node.overallData?.count),\n 0\n );\n const fallbackVisitors = parseVisitorCount(activeZone.overallData?.count);\n const overallVisitors =\n overallVisitorsFromChildren > 0\n ? overallVisitorsFromChildren\n : fallbackVisitors;\n const fromExplicitStoreCount = activeZone.zoneKpiStrip?.storeCount;\n const storeCount =\n fromExplicitStoreCount && fromExplicitStoreCount > 0\n ? fromExplicitStoreCount\n : childRowsSource.length;\n\n return {\n summaryKpis: {\n storeCount,\n overallVisitors:\n activeZone.zoneKpiStrip?.overallVisitors ?? overallVisitors,\n },\n rankedBarList: {\n title: `${activeZone.name} store performance`,\n items,\n listHeaderLabel: 'Store',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n if (activeZone.zoneKpiStrip) {\n const zs = activeZone.zoneKpiStrip;\n return {\n summaryKpis: {\n storeCount: zs.storeCount,\n overallVisitors: zs.overallVisitors,\n },\n rankedBarList: {\n title: 'Zone breakdown',\n items: [rowFromExplicitStrip(activeZone.name, zs)],\n listHeaderLabel: 'Zone',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n const fromNode = parseVisitorCount(activeZone.overallData?.count);\n const fromChildren = childTiles.reduce(\n (s, n) => s + parseVisitorCount(n.overallData?.count),\n 0\n );\n const overallVisitors = fromNode > 0 ? fromNode : fromChildren;\n const storeCount = childTiles.length;\n\n return {\n summaryKpis: { storeCount, overallVisitors },\n rankedBarList: {\n title: 'Zone breakdown',\n items: [rowFromHeuristicLabel(activeZone.name, overallVisitors)],\n listHeaderLabel: 'Zone',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n if (!childTiles.length) return null;\n\n const overallVisitors = childTiles.reduce(\n (s, n) => s + parseVisitorCount(n.overallData?.count),\n 0\n );\n const storeCount = childTiles.length;\n\n return {\n summaryKpis: { storeCount, overallVisitors },\n rankedBarList: {\n title: 'Footfall overview',\n items: [rowFromHeuristicLabel('Overview', overallVisitors)],\n listHeaderLabel: 'Scope',\n valueColumnHeader: 'Visitors',\n },\n };\n}\n","/**\n * Treemap data helpers for FootFallHeatMap.\n * Recharts expects nested `children`; our tree uses `list` internally.\n */\n\nexport type ZoneAnalyticsHierarchy = {\n Country?: Record<string, unknown>;\n Region?: Record<string, unknown>;\n State?: Record<string, unknown>;\n City?: Record<string, unknown>;\n};\n\nexport type ZoneAnalyticsFlatItem = {\n category_id: number;\n category_name: string;\n percentage: number;\n visitor_count: number;\n avg_dwell_time: string;\n /** Optional; same shape as hierarchy `zone_kpi_strip` when this row should drive the strip alone. */\n zone_kpi_strip?: Record<string, unknown>;\n};\n\nexport type ZoneAnalyticsMetrics = {\n overall_visits?: number;\n trend?: { direction?: 'up' | 'down'; percentage?: number };\n unique_customer_walkins?: number;\n walkins_trend?: { direction?: 'up' | 'down'; percentage?: number };\n first_visit_count?: number;\n first_visit_trend?: { direction?: 'up' | 'down'; percentage?: number };\n avg_wait_time_per_visitor?: string;\n wait_time_trend?: { direction?: 'up' | 'down'; percentage?: number };\n attended_customers?: number;\n attended_trend?: { direction?: 'up' | 'down'; percentage?: number };\n unattended_customers?: number;\n unattended_trend?: { direction?: 'up' | 'down'; percentage?: number };\n avg_dwell_time?: string;\n dwell_time_trend?: { direction?: 'up' | 'down'; percentage?: number };\n};\n\n/** Optional per-zone KPI + 3-segment bar from API (`zone_kpi_strip` on hierarchy nodes). Same layout at every level; values vary by zone. */\nexport type ZoneKpiStripPayload = {\n storeCount: number;\n overallVisitors: number;\n segments: [\n { label: string; value: number },\n { label: string; value: number },\n { label: string; value: number },\n ];\n};\n\nexport type TreemapNode = {\n name: string;\n value: number;\n originalValue: number;\n color: string;\n overallData: {\n count: number | string;\n dwell: string;\n };\n list: TreemapNode[];\n /** Set when passing to Recharts Treemap (uses `children` for nesting). */\n children?: TreemapNode[];\n leafMetrics?: ZoneAnalyticsMetrics;\n /** When set, KPI strip + single segmented row use these values for this zone (when it is the active drill context). */\n zoneKpiStrip?: ZoneKpiStripPayload;\n _childContainerKey?: string;\n _raw?: number;\n};\n\n/** Recharts Treemap reads `children`, not `list`. */\nexport function toRechartsTreemapData(nodes: TreemapNode[]): TreemapNode[] {\n return nodes.map(n => ({\n ...n,\n children: n.list?.length ? toRechartsTreemapData(n.list) : undefined,\n })) as TreemapNode[];\n}\n\nexport function preprocessData(data: TreemapNode[]): TreemapNode[] {\n if (!data || !Array.isArray(data)) return [];\n\n const processedData = [...data];\n\n const totalValue = processedData.reduce((sum, item) => sum + item.value, 0);\n const threshold = totalValue * 0.05;\n\n return processedData.map(item => ({\n ...item,\n originalValue: item.value,\n value: Math.max(item.value, threshold),\n }));\n}\n\nexport function skipSingleBranchLevels(nodes: TreemapNode[]): TreemapNode[] {\n let currentNodes = preprocessData(nodes);\n let safetyCounter = 0;\n\n while (\n currentNodes.length === 1 &&\n Array.isArray(currentNodes[0]?.list) &&\n currentNodes[0].list.length > 0 &&\n safetyCounter < 10\n ) {\n currentNodes = preprocessData(currentNodes[0].list);\n safetyCounter += 1;\n }\n\n return currentNodes;\n}\n\nexport function parseMinutes(avgDwellTime?: string): number {\n if (!avgDwellTime) return 0;\n\n const m = String(avgDwellTime)\n .trim()\n .match(/([\\d.]+)/);\n\n return m ? Number(m[1]) : 0;\n}\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nexport function getChildContainer(\n node: unknown\n): { key: string; container: Record<string, unknown> } | null {\n if (!isPlainObject(node)) return null;\n\n /** Prefer geographic / org levels in order so Region → State → City stay distinct in the treemap. */\n const preferred = ['Region', 'State', 'City', 'Stores', 'Zones'];\n for (const k of preferred) {\n if (isPlainObject(node[k]))\n return { key: k, container: node[k] as Record<string, unknown> };\n }\n\n for (const [k, v] of Object.entries(node)) {\n if (\n [\n 'total_footfall',\n 'avg_dwell_time',\n 'data',\n 'zone_kpi_strip',\n 'zoneKpiStrip',\n ].includes(k)\n )\n continue;\n if (isPlainObject(v)) return { key: k, container: v };\n }\n\n return null;\n}\n\nexport function metricForNode(\n node: unknown,\n sortBy: 'walkins' | 'dwell'\n): number {\n if (!node) return 0;\n const n = node as Record<string, unknown>;\n const data = n.data as Record<string, unknown> | undefined;\n if (data?.overall_visits != null) {\n return sortBy === 'walkins'\n ? Number(data.overall_visits)\n : parseMinutes(data.avg_dwell_time as string);\n }\n\n if (n.total_footfall != null) {\n return sortBy === 'walkins'\n ? Number(n.total_footfall)\n : parseMinutes(n.avg_dwell_time as string);\n }\n\n if (n.visitor_count != null) {\n return sortBy === 'walkins'\n ? Number(n.visitor_count)\n : parseMinutes(n.avg_dwell_time as string);\n }\n\n return 0;\n}\n\n/** Read optional `zone_kpi_strip` / `zoneKpiStrip` from a hierarchy or flat API node. */\nexport function parseZoneKpiStripFromRaw(\n node: Record<string, unknown>\n): ZoneKpiStripPayload | undefined {\n const raw = node.zone_kpi_strip ?? node.zoneKpiStrip;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n const r = raw as Record<string, unknown>;\n const storeCount = Number(r.store_count ?? r.storeCount);\n const overallVisitors = Number(r.overall_visitors ?? r.overallVisitors);\n const segRaw = r.segments;\n if (!Array.isArray(segRaw) || segRaw.length !== 3) return undefined;\n const triple = segRaw.map((item, i) => {\n const o = item as Record<string, unknown>;\n return {\n label: String(o.label ?? `Segment ${i + 1}`),\n value: Number(o.value ?? 0),\n };\n });\n if (\n !Number.isFinite(storeCount) ||\n !Number.isFinite(overallVisitors) ||\n triple.some(t => !Number.isFinite(t.value))\n ) {\n return undefined;\n }\n return {\n storeCount,\n overallVisitors,\n segments: [triple[0], triple[1], triple[2]],\n };\n}\n\nexport function hashColor(seed: string): string {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) >>> 0;\n\n const r = 80 + (h & 0x7f);\n const g = 80 + ((h >> 7) & 0x7f);\n const b = 80 + ((h >> 14) & 0x7f);\n\n const toHex = (x: number) => x.toString(16).padStart(2, '0');\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex.trim());\n if (!m) return null;\n\n return {\n r: parseInt(m[1], 16),\n g: parseInt(m[2], 16),\n b: parseInt(m[3], 16),\n };\n}\n\nfunction rgbToHsl(\n r: number,\n g: number,\n b: number\n): { h: number; s: number; l: number } {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rn:\n h = (gn - bn) / d + (gn < bn ? 6 : 0);\n break;\n case gn:\n h = (bn - rn) / d + 2;\n break;\n default:\n h = (rn - gn) / d + 4;\n }\n h /= 6;\n }\n\n return { h, s, l };\n}\n\nfunction hslToRgb(\n h: number,\n s: number,\n l: number\n): {\n r: number;\n g: number;\n b: number;\n} {\n let r: number;\n let g: number;\n let b: number;\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const hue2rgb = (t: number) => {\n let x = t;\n if (x < 0) x += 1;\n if (x > 1) x -= 1;\n if (x < 1 / 6) return p + (q - p) * 6 * x;\n if (x < 1 / 2) return q;\n if (x < 2 / 3) return p + (q - p) * (2 / 3 - x) * 6;\n\n return p;\n };\n r = hue2rgb(h + 1 / 3);\n g = hue2rgb(h);\n b = hue2rgb(h - 1 / 3);\n }\n\n return {\n r: Math.round(Math.min(255, Math.max(0, r * 255))),\n g: Math.round(Math.min(255, Math.max(0, g * 255))),\n b: Math.round(Math.min(255, Math.max(0, b * 255))),\n };\n}\n\n/**\n * Optional treemap tile fill: **vivid** HSL tuning from **`hashColor(seed)`**, or a full **`tileColorFromSeed`** override.\n * Pass **`treemap.tileColors`** on **`FootFallHeatMapView`**, or use **`createTreemapTileColorResolver`** inside **`tree.buildNodes`**.\n */\nexport type FootFallHeatMapTreemapColorCustomization = {\n /** Replace the built-in vivid / hash pipeline entirely. */\n tileColorFromSeed?: (seed: string) => string;\n /** Multiply base saturation after conversion to HSL. @default **1.48** */\n saturationBoost?: number;\n /** Added after boost; result is clamped to **1**. @default **0.1** */\n saturationFloor?: number;\n /** Clamp lightness lower bound (**0–1**). @default **0.38** */\n lightnessClampMin?: number;\n /** Clamp lightness upper bound (**0–1**). @default **0.55** */\n lightnessClampMax?: number;\n /** Scale base lightness from hash before clamp. @default **0.96** */\n lightnessScale?: number;\n /** Offset after scale. @default **0.02** */\n lightnessOffset?: number;\n};\n\n/**\n * - **`undefined` / `null`** → **`hashColor`** only.\n * - **`{ tileColorFromSeed }`** → use that resolver.\n * - **Any other object** (including **`{}`**) → vivid HSL pipeline with defaults merged from **`customization`**.\n */\nexport function createTreemapTileColorResolver(\n customization?: FootFallHeatMapTreemapColorCustomization | null\n): (seed: string) => string {\n if (customization?.tileColorFromSeed) {\n return customization.tileColorFromSeed;\n }\n if (customization == null) {\n return (seed: string) => hashColor(seed);\n }\n\n const saturationBoost = customization.saturationBoost ?? 1.48;\n const saturationFloor = customization.saturationFloor ?? 0.1;\n const lightnessClampMin = customization.lightnessClampMin ?? 0.38;\n const lightnessClampMax = customization.lightnessClampMax ?? 0.55;\n const lightnessScale = customization.lightnessScale ?? 0.96;\n const lightnessOffset = customization.lightnessOffset ?? 0.02;\n\n return (seed: string) => {\n const base = hashColor(seed);\n const rgb = hexToRgb(base);\n if (!rgb) return base;\n const { h, s: s0, l: l0 } = rgbToHsl(rgb.r, rgb.g, rgb.b);\n const s = Math.min(1, s0 * saturationBoost + saturationFloor);\n const l = Math.min(\n lightnessClampMax,\n Math.max(lightnessClampMin, l0 * lightnessScale + lightnessOffset)\n );\n const out = hslToRgb(h, s, l);\n const hx = (n: number) => n.toString(16).padStart(2, '0');\n\n return `#${hx(out.r)}${hx(out.g)}${hx(out.b)}`;\n };\n}\n\nexport function buildTreemapNodes({\n container,\n sortBy,\n pathKey,\n tileColorFromSeed,\n}: {\n container: Record<string, unknown>;\n sortBy: 'walkins' | 'dwell';\n pathKey: string;\n /** When set, used for `color`; otherwise **`hashColor(\\`${pathKey}/${name}\\`)`**. */\n tileColorFromSeed?: (seed: string) => string;\n}): TreemapNode[] {\n const entries = Object.entries(container);\n const total =\n entries.reduce((sum, [, v]) => sum + metricForNode(v, sortBy), 0) || 1;\n\n return entries.map(([name, node]): TreemapNode => {\n const raw = metricForNode(node, sortBy);\n const percentage = (raw / total) * 100;\n const seed = `${pathKey}/${name}`;\n const color = tileColorFromSeed ? tileColorFromSeed(seed) : hashColor(seed);\n\n const childContainer = getChildContainer(node);\n const n = node as Record<string, unknown>;\n const leafMetrics: ZoneAnalyticsMetrics | undefined = n?.data\n ? (n.data as ZoneAnalyticsMetrics)\n : undefined;\n const dataMetrics = n?.data as ZoneAnalyticsMetrics | undefined;\n const countRaw =\n n?.total_footfall ?? n?.visitor_count ?? dataMetrics?.overall_visits ?? 0;\n const zoneKpiStrip = parseZoneKpiStripFromRaw(n);\n\n return {\n name,\n value: percentage,\n originalValue: percentage,\n color,\n overallData: {\n count:\n typeof countRaw === 'number' || typeof countRaw === 'string'\n ? countRaw\n : 0,\n dwell:\n (n?.avg_dwell_time as string) ?? dataMetrics?.avg_dwell_time ?? '0m',\n },\n list: childContainer\n ? buildTreemapNodes({\n container: childContainer.container,\n sortBy,\n pathKey: `${pathKey}/${name}`,\n tileColorFromSeed,\n })\n : [],\n leafMetrics,\n zoneKpiStrip,\n _childContainerKey: childContainer?.key,\n _raw: raw,\n };\n });\n}\n\nexport function getNestedList(\n payload: TreemapNode & { children?: TreemapNode[] }\n): TreemapNode[] | undefined {\n if (payload.list?.length) return payload.list;\n if (payload.children?.length) return payload.children;\n return undefined;\n}\n","import Grid from '@mui/material/Grid';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { ZoneAnalyticsMetrics } from './footfallHeatMapTree';\n\ntype KpiRow = {\n id: number;\n title: string;\n value: string | number;\n};\n\nfunction metricsToRows(metrics: ZoneAnalyticsMetrics): KpiRow[] {\n return [\n { id: 1, title: 'Overall Visits', value: metrics.overall_visits ?? 0 },\n {\n id: 2,\n title: 'Unique Visitors',\n value: metrics.unique_customer_walkins ?? 0,\n },\n {\n id: 3,\n title: 'First Visit Count',\n value: metrics.first_visit_count ?? 0,\n },\n {\n id: 4,\n title: 'Average Wait Time',\n value: metrics.avg_wait_time_per_visitor ?? '0m',\n },\n {\n id: 5,\n title: 'Attended Customers',\n value: metrics.attended_customers ?? 0,\n },\n {\n id: 6,\n title: 'Unattended Customers',\n value: metrics.unattended_customers ?? 0,\n },\n {\n id: 7,\n title: 'Avg. Dwell Time (Mins)',\n value: metrics.avg_dwell_time ?? '0m',\n },\n ];\n}\n\n/** Zone KPI grid using MUI layout. */\nconst ZoneWiseKpiCards = ({ metrics }: { metrics: ZoneAnalyticsMetrics }) => {\n const rows = metricsToRows(metrics);\n\n return (\n <Grid container spacing={3} sx={{ marginTop: '10px', paddingX: '6px' }}>\n {rows.map(item => (\n <Grid\n key={item.id}\n size={{\n xs: 12,\n sm: 6,\n md: 3,\n }}\n >\n <Paper\n elevation={0}\n sx={{\n p: 2,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#FAFAFA',\n height: '100%',\n }}\n >\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n fontWeight={600}\n >\n {item.title}\n </Typography>\n <Stack mt={1}>\n <Typography variant=\"h6\" fontWeight={700}>\n {item.value}\n </Typography>\n </Stack>\n </Paper>\n </Grid>\n ))}\n </Grid>\n );\n};\n\nexport default ZoneWiseKpiCards;\n","import type { ChartWidgetInfoPopoverContent } from '../../ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\nexport const DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n {\n title: 'Peak Billing Hours',\n description:\n 'Hourly billing-counter volume for the selected window. Switch tabs to compare visits, average queue time, or alerts.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'See which hours drive the most counter traffic.',\n 'Align staffing with peaks and quiet periods.',\n 'Compare metrics across the segmented views.',\n ],\n };\n","import type { ChartWidgetSegmentedTab } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type { PeakBillingHoursPoint } from './PeakBillingHours.types';\n\nexport const peakBillingHoursDefaultTabs: ChartWidgetSegmentedTab[] = [\n { id: 'visits', label: 'Billing Counter Visits' },\n { id: 'queue', label: 'Avg. Queue Time' },\n { id: 'alerts', label: 'Alerts Generated' },\n];\n\n/** Matches the **Billing Counter Visits** demo (last 7 days style). */\nexport const peakBillingHoursVisitsMock: PeakBillingHoursPoint[] = [\n { label: '12pm', value: 42 },\n { label: '10am', value: 32 },\n { label: '1pm', value: 29 },\n { label: '11am', value: 25 },\n { label: '8am', value: 23 },\n { label: '7am', value: 19 },\n { label: '9am', value: 12 },\n { label: '2pm', value: 0 },\n { label: '3pm', value: 0 },\n { label: '4pm', value: 0 },\n { label: '5pm', value: 0 },\n { label: '6pm', value: 0 },\n { label: '7pm', value: 0 },\n { label: '8pm', value: 0 },\n];\n\nfunction scaledRow(\n row: PeakBillingHoursPoint,\n factor: number,\n bias: number\n): PeakBillingHoursPoint {\n const v = Math.max(0, Math.round(row.value * factor + bias));\n return { label: row.label, value: v };\n}\n\nexport const peakBillingHoursMockSeriesByTabId: Record<\n string,\n PeakBillingHoursPoint[]\n> = {\n visits: peakBillingHoursVisitsMock,\n queue: peakBillingHoursVisitsMock.map(r =>\n scaledRow(r, 0.35, r.value > 0 ? 2 : 0)\n ),\n alerts: peakBillingHoursVisitsMock.map(r =>\n scaledRow(r, 0.12, r.value > 0 ? 1 : 0)\n ),\n};\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n LabelList,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport {\n BILLING_COUNTER_LINE_PRIMARY,\n BILLING_COUNTER_TABS_TRACK_BG,\n} from '../../BillingCounterAnalytics/billingCounterAnalytics.chartTokens';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { mergeSx } from '../../BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\nimport { ChartWidgetInfoButton } from '../../ChartWidgetInfoButton';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport { DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER } from './peakBillingHours.defaultInfoPopover';\nimport {\n PeakBillingHoursCustomizationProvider,\n usePeakBillingHoursCustomization,\n} from './PeakBillingHoursCustomizationContext';\nimport type {\n PeakBillingHoursProps,\n PeakBillingHoursTooltipRenderContext,\n} from './PeakBillingHours.types';\nimport { PeakBillingHoursTooltip } from './PeakBillingHoursTooltip';\n\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_CHART_AXIS_TICK_FILL = '#64748B' as const;\n\ninterface BarValueLabelProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction PeakBarTopLabel(\n props: BarValueLabelProps & {\n fill: string;\n fontSize: number;\n fontWeight: number;\n }\n): React.ReactElement | null {\n const { x, y, width, value, fill, fontSize, fontWeight } = props;\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 6;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={fontSize}\n fontWeight={fontWeight}\n textAnchor=\"middle\"\n >\n {String(Math.round(n))}\n </text>\n );\n}\n\nfunction BarPlot({\n data,\n yAxisDomain,\n yAxisTicks,\n activeTabId,\n renderTooltip,\n chartMargin,\n yAxisTickDx = -6,\n yAxisTickStyle,\n xAxisTickDx = 0,\n xAxisTickStyle,\n}: {\n data: { label: string; value: number }[];\n yAxisDomain: [number, number];\n yAxisTicks: number[];\n activeTabId: string;\n renderTooltip?: PeakBillingHoursProps['renderTooltip'];\n chartMargin?: PeakBillingHoursProps['chartMargin'];\n yAxisTickDx?: number;\n yAxisTickStyle?: PeakBillingHoursProps['yAxisTickStyle'];\n xAxisTickDx?: number;\n xAxisTickStyle?: PeakBillingHoursProps['xAxisTickStyle'];\n}): React.ReactElement {\n const { barChart: bc } = usePeakBillingHoursCustomization();\n const height = bc?.heightPx ?? 320;\n const barColor = bc?.barColor ?? BILLING_COUNTER_LINE_PRIMARY;\n const barRadius = bc?.barRadius ?? 0;\n const gridStroke =\n bc?.gridStroke ?? OLY_DEFAULT_COMPOSED_CHART_CHROME.cartesianGridStroke;\n const dash = bc?.gridStrokeDasharray ?? '3 3';\n const m = chartMargin ?? {\n top: bc?.margin?.top ?? 28,\n right: bc?.margin?.right ?? 12,\n bottom: bc?.margin?.bottom ?? 8,\n left: bc?.margin?.left ?? 4,\n };\n const xFill = bc?.xAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yFill = bc?.yAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yWidth = bc?.yAxisWidth ?? 32;\n const labelFill = bc?.barValueLabelFill ?? '#374151';\n const labelFs = bc?.barValueLabelFontSizePx ?? 12;\n const hoverBandFill = bc?.hoverBandFill ?? 'rgba(226, 232, 240, 0.75)';\n const categoryGap = bc?.barCategoryGap ?? '18%';\n const barGap = bc?.barGap ?? 4;\n\n const radiusTuple: [number, number, number, number] = [\n barRadius,\n barRadius,\n barRadius,\n barRadius,\n ];\n\n return (\n <Box sx={{ width: '100%', height, mt: 0.5 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n data={data}\n margin={m}\n barCategoryGap={categoryGap}\n barGap={barGap}\n >\n <CartesianGrid\n strokeDasharray={dash}\n vertical={false}\n stroke={gridStroke}\n />\n <XAxis\n dataKey=\"label\"\n dx={xAxisTickDx}\n tick={{ fill: xFill, fontSize: 11, ...xAxisTickStyle }}\n tickLine={false}\n axisLine={{\n stroke: OLY_DEFAULT_COMPOSED_CHART_CHROME.axisTickLineStroke,\n }}\n interval={0}\n height={36}\n />\n <YAxis\n domain={yAxisDomain}\n ticks={yAxisTicks}\n dx={yAxisTickDx}\n tick={{ fill: yFill, fontSize: 11, ...yAxisTickStyle }}\n tickLine={false}\n axisLine={false}\n width={yWidth}\n />\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n data,\n activeTabId,\n } satisfies PeakBillingHoursTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return <PeakBillingHoursTooltip {...tooltipProps} />;\n }}\n cursor={{\n fill: hoverBandFill,\n stroke: 'transparent',\n strokeWidth: 0,\n }}\n allowEscapeViewBox={{ x: false, y: true }}\n />\n <Bar\n dataKey=\"value\"\n name=\"Visits\"\n fill={barColor}\n radius={radiusTuple}\n isAnimationActive={false}\n maxBarSize={48}\n >\n <LabelList\n dataKey=\"value\"\n content={(props: unknown) => (\n <PeakBarTopLabel\n {...(props as BarValueLabelProps)}\n fill={labelFill}\n fontSize={labelFs}\n fontWeight={500}\n />\n )}\n />\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Peak billing hours card: title + subtitle, info control, violet segmented tabs (intrinsic),\n * vertical bar chart with square tops, value labels, and panel tooltip.\n */\nexport function PeakBillingHours({\n title = 'Peak Billing Hours',\n subtitle = '(Last 7 days)',\n tabs,\n activeTabId,\n onTabChange,\n data,\n isLoading = false,\n seriesByTabId,\n chartMargin,\n yAxisTickDx = -6,\n yAxisTickStyle,\n xAxisTickDx = 0,\n xAxisTickStyle,\n yAxisDomain = [0, 50],\n yAxisTicks = [0, 10, 20, 30, 40, 50],\n infoPopover,\n renderTooltip,\n emptyStatePlaceholderProps,\n customization,\n}: PeakBillingHoursProps): React.ReactElement {\n const chartData = React.useMemo(() => {\n if (seriesByTabId) {\n return seriesByTabId[activeTabId] ?? [];\n }\n return data ?? [];\n }, [seriesByTabId, data, activeTabId]);\n\n const resolvedInfo =\n infoPopover === undefined\n ? DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER\n : infoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const st = customization?.segmentedTabs;\n const titleSx = mergeSx(\n {\n fontWeight: 700,\n fontSize: { xs: '1rem', sm: '1.05rem' },\n color: '#0f172a',\n display: 'inline',\n },\n customization?.header?.titleSx\n );\n const subtitleSx = mergeSx(\n {\n display: 'inline',\n ml: 0.75,\n color: '#6B7280',\n fontSize: '0.9375rem',\n fontWeight: 400,\n },\n customization?.header?.subtitleSx\n );\n\n return (\n <PeakBillingHoursCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack spacing={1.75} sx={{ width: '100%' }}>\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n flexWrap=\"wrap\"\n >\n <Box component=\"div\" sx={{ minWidth: 0 }}>\n <Typography component=\"span\" sx={titleSx}>\n {title}\n </Typography>\n <Typography component=\"span\" sx={subtitleSx}>\n {subtitle}\n </Typography>\n </Box>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ flexShrink: 0 }}\n >\n {resolvedInfo ? (\n <>\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n popover={resolvedInfo}\n ariaLabel=\"Peak billing hours information\"\n />\n </>\n ) : null}\n </Stack>\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Peak billing metric\"\n trackBackgroundColor={\n st?.trackBackgroundColor ?? BILLING_COUNTER_TABS_TRACK_BG\n }\n activeTabBackground={\n st?.activeTabBackground ?? BILLING_COUNTER_LINE_PRIMARY\n }\n activeTabColor={st?.activeTabColor ?? '#ffffff'}\n inactiveTabColor={st?.inactiveTabColor ?? '#525252'}\n activeTabBoxShadow={st?.activeTabBoxShadow ?? 'none'}\n fullWidth={st?.fullWidth ?? true}\n tabFontSize={st?.tabFontSize ?? 14}\n rootSx={st?.rootSx}\n tabLayout={st?.tabLayout ?? 'equalWidth'}\n activeTabFontWeight={st?.activeTabFontWeight ?? 700}\n inactiveTabFontWeight={st?.inactiveTabFontWeight ?? 600}\n />\n\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height={320} />\n ) : chartData.length > 0 ? (\n <BarPlot\n data={chartData}\n yAxisDomain={yAxisDomain}\n yAxisTicks={yAxisTicks}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n chartMargin={chartMargin}\n yAxisTickDx={yAxisTickDx}\n yAxisTickStyle={yAxisTickStyle}\n xAxisTickDx={xAxisTickDx}\n xAxisTickStyle={xAxisTickStyle}\n />\n ) : (\n <ChartEmptyState\n minHeight={320}\n {...emptyStatePlaceholderProps}\n />\n )}\n </Stack>\n </CardContent>\n </Card>\n </PeakBillingHoursCustomizationProvider>\n );\n}\n\nexport default PeakBillingHours;\n","import * as React from 'react';\nimport type { PeakBillingHoursCustomization } from './peakBillingHours.customization.types';\n\nconst PeakBillingHoursCustomizationContext =\n React.createContext<PeakBillingHoursCustomization>({});\n\nexport type PeakBillingHoursCustomizationProviderProps = {\n value: PeakBillingHoursCustomization;\n children: React.ReactNode;\n};\n\nexport function PeakBillingHoursCustomizationProvider({\n value,\n children,\n}: PeakBillingHoursCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <PeakBillingHoursCustomizationContext.Provider value={memo}>\n {children}\n </PeakBillingHoursCustomizationContext.Provider>\n );\n}\n\nexport function usePeakBillingHoursCustomization(): PeakBillingHoursCustomization {\n return React.useContext(PeakBillingHoursCustomizationContext);\n}\n","import * as React from 'react';\nimport type { TooltipContentProps } from 'recharts';\nimport { mergeCss } from '../../BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge';\nimport { usePeakBillingHoursCustomization } from './PeakBillingHoursCustomizationContext';\n\nfunction formatTooltipValue(n: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(\n Math.round(n)\n );\n}\n\nexport function PeakBillingHoursTooltip(\n props: TooltipContentProps\n): React.ReactElement | null {\n const { active, payload, label } = props;\n const { barChart: bc } = usePeakBillingHoursCustomization();\n const tt = bc?.tooltip;\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const raw = payload[0]?.value;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN;\n if (!Number.isFinite(num)) {\n return null;\n }\n\n const labelText = label !== undefined && label !== null ? String(label) : '—';\n\n const borderColor = tt?.borderColor ?? '#E5E7EB';\n const radius = tt?.borderRadiusPx ?? 0;\n const shadow = tt?.boxShadow ?? '0 4px 14px rgba(15, 23, 42, 0.12)';\n const topBg = tt?.topBarBackground ?? '#E5E7EB';\n const topH = tt?.topBarHeightPx ?? 8;\n const bodyBg = tt?.bodyBackground ?? '#FFFFFF';\n const fs = tt?.fontSizePx ?? 13;\n const gap = tt?.lineGapPx ?? 6;\n const dateP = tt?.dateLabelPrefix ?? 'Date: ';\n const totalP = tt?.totalLabelPrefix ?? 'Total: ';\n const prefixFw = tt?.prefixFontWeight ?? 400;\n const valueFw = tt?.valueFontWeight ?? 700;\n\n const uniformText =\n tt?.textColor != null &&\n tt?.prefixColor === undefined &&\n tt?.valueColor === undefined;\n const prefixCol = uniformText ? tt.textColor : (tt?.prefixColor ?? '#6B7280');\n const valueCol = uniformText ? tt.textColor : (tt?.valueColor ?? '#111827');\n\n const rowStyle: React.CSSProperties = {\n fontSize: fs,\n lineHeight: 1.35,\n margin: 0,\n };\n\n const bodyStyle = mergeCss(\n {\n boxSizing: 'border-box',\n backgroundColor: bodyBg,\n padding: '10px 12px',\n },\n tt?.bodyStyle\n );\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n minWidth: 160,\n maxWidth: 280,\n }}\n >\n <div\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: bodyBg,\n boxShadow: shadow,\n }}\n >\n <div\n style={{\n height: topH,\n backgroundColor: topBg,\n flexShrink: 0,\n }}\n aria-hidden\n />\n <div style={bodyStyle}>\n <div style={rowStyle}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {dateP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {labelText}\n </span>\n </div>\n <div style={{ ...rowStyle, marginTop: gap }}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {totalP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {formatTooltipValue(num)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import CssBaseline from '@mui/material/CssBaseline';\nimport {\n ThemeProvider,\n createTheme,\n responsiveFontSizes,\n} from '@mui/material/styles';\nimport React from 'react';\nimport type {\n FalconThemeMode,\n FalconThemeProviderProps,\n} from './FalconThemeProvider.types';\n\n// ─── Brand palette ────────────────────────────────────────────────────────────\n\nconst lightColor = '51, 48, 60';\nconst darkColor = '228, 230, 244';\nconst darkPaperBg = '#2F3349';\n\nfunction buildPalette(mode: FalconThemeMode) {\n const mainColor = mode === 'light' ? lightColor : darkColor;\n\n return {\n mode,\n primary: {\n light: 'rgba(103, 80, 164, 0.02)',\n main: '#d8c5f9',\n dark: '#8710D8',\n contrastText: '#FFF',\n },\n secondary: {\n light: '#EFEFEF',\n main: '#1D192B',\n dark: '#949699',\n contrastText: '#FFF',\n },\n error: {\n light: '#ED6F70',\n main: '#EA5455',\n dark: '#CE4A4B',\n contrastText: '#FFF',\n },\n warning: {\n light: '#FFAB5A',\n main: '#FF9F43',\n dark: '#E08C3B',\n contrastText: '#FFF',\n },\n info: {\n light: '#1FD5EB',\n main: '#00CFE8',\n dark: '#00B6CC',\n contrastText: '#FFF',\n },\n success: {\n light: '#42CE80',\n main: '#28C76F',\n dark: '#23AF62',\n contrastText: '#FFF',\n },\n text: {\n primary: `rgba(${mainColor}, 0.87)`,\n secondary: `rgba(${mainColor}, 0.6)`,\n disabled: `rgba(${mainColor}, 0.38)`,\n },\n divider: `rgba(${mainColor}, 0.12)`,\n background: {\n paper: mode === 'light' ? '#F2EBFF' : darkPaperBg,\n default: mode === 'light' ? '#F8F7FA' : '#25293C',\n },\n action: {\n active: `rgba(${mainColor}, 0.54)`,\n hover: `rgba(${mainColor}, 0.04)`,\n selected: `rgba(${mainColor}, 0.08)`,\n disabled: `rgba(${mainColor}, 0.26)`,\n disabledBackground: `rgba(${mainColor}, 0.12)`,\n focus: `rgba(${mainColor}, 0.12)`,\n },\n };\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const FalconThemeProvider = ({\n children,\n mode: modeProp,\n settings,\n}: FalconThemeProviderProps) => {\n const mode: FalconThemeMode = settings?.mode ?? modeProp ?? 'light';\n const direction = settings?.direction ?? 'ltr';\n\n const theme = responsiveFontSizes(\n createTheme({\n direction,\n palette: buildPalette(mode),\n shape: { borderRadius: 6 },\n typography: { fontFamily: '\"Inter\", \"Public Sans\", sans-serif' },\n mixins: { toolbar: { minHeight: 64 } },\n })\n );\n\n return (\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n );\n};\n"],"mappings":"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","names":["Box","Button","Typography","TextField","jsx","jsx","jsxs","Box","Typography","Button","Box","Button","Typography","jsx","jsxs","Icon","Box","ClickAwayListener","IconButton","Popper","Stack","Typography","React","Fragment","jsx","jsxs","jsx","Icon","Box","Typography","jsx","jsxs","Icon","Box","Button","Checkbox","ClickAwayListener","InputAdornment","Popper","Stack","TextField","Typography","useTheme","React","jsx","jsxs","defaultTriggerBg","Icon","Box","IconButton","Stack","Typography","React","Fragment","jsx","jsxs","Box","Typography","Stack","IconButton","Icon","Box","Stack","React","React","jsx","mergeSx","jsx","jsxs","mergeSx","Box","Stack","Box","React","jsx","jsxs","Icon","Box","Paper","Stack","Tooltip","Typography","useLayoutEffect","useRef","useState","useEffect","useRef","useState","jsx","jsxs","defaultIconColor","useRef","useState","useLayoutEffect","Tooltip","Typography","cardMinHeightPx","cardMaxHeightPx","Paper","Box","Icon","Stack","jsx","Icon","Box","Typography","IconButton","useMemo","useState","Fragment","jsx","jsxs","match","useState","Box","Button","Checkbox","Typography","styled","Paper","Stack","Icon","jsx","jsxs","useState","Box","Button","Checkbox","FormControlLabel","InputAdornment","TextField","Typography","styled","Paper","Stack","Icon","Fragment","jsx","jsxs","RootPaper","Title","CheckboxLabel","CloseButton","ExportMainButton","Autocomplete","TextField","jsx","Box","Typography","Icon","jsx","jsxs","formatValue","Box","Stack","jsx","Stack","Box","Box","Stack","Typography","useTheme","jsx","jsxs","Icon","Box","Divider","Stack","jsx","jsxs","jsx","jsxs","Stack","styled","jsx","Box","useState","jsx","Box","Typography","jsx","jsxs","Button","Popover","useState","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","Box","Divider","Stack","Typography","React","Tooltip","Fragment","jsx","jsxs","mergeCss","Box","Stack","Typography","Divider","Tooltip","Icon","Box","Divider","Skeleton","Stack","Typography","React","Bar","BarChart","CartesianGrid","Cell","LabelList","Tooltip","XAxis","YAxis","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","mergeCss","sxChain","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","defaultChartColors","formatBarLabel","toNum","Icon","MultiLineTick","Box","Stack","Typography","Divider","Skeleton","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Bar","Cell","LabelList","Box","Divider","Skeleton","Stack","Typography","React","Bar","CartesianGrid","Cell","LabelList","Tooltip","XAxis","YAxis","React","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","mergeCss","sxChain","formatBarLabel","MultiLineTick","formatYAxisTickDefault","toNum","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","topReserveForBarLabels","topReserveNoBarLabels","defaultChartColors","Box","Stack","Typography","Divider","Skeleton","CartesianGrid","XAxis","YAxis","Tooltip","Bar","Cell","LabelList","Box","Stack","useTheme","Typography","React","Cell","Tooltip","Fragment","jsx","jsxs","resolveCardMaxWidth","useTheme","Box","Stack","Typography","Tooltip","Cell","Box","Divider","Skeleton","Stack","Typography","React","Bar","CartesianGrid","ComposedChart","LabelList","Line","Tooltip","XAxis","YAxis","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","tooltipDatumFromPayload","mergeCss","sxChain","formatBarLabel","MultiLineTick","formatYAxisTickDefault","toNum","BarTopLabel","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","topReserveForBarLabels","topReserveNoBarLabels","defaultChartColors","Box","Stack","Typography","Divider","Skeleton","ComposedChart","CartesianGrid","XAxis","YAxis","Tooltip","Bar","LabelList","Line","Box","Card","Stack","Typography","React","CartesianGrid","Line","ResponsiveContainer","Tooltip","XAxis","YAxis","mergeCss","mergeSx","React","jsx","jsx","jsxs","mergeCss","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_CHROME","Box","ResponsiveContainer","CartesianGrid","XAxis","YAxis","Tooltip","Line","mergeSx","Card","Stack","Typography","Box","Card","CardContent","Stack","Typography","useMediaQuery","React","Stack","useTheme","React","CartesianGrid","ResponsiveContainer","Tooltip","XAxis","YAxis","React","jsx","jsxs","Fragment","jsx","jsxs","useTheme","Stack","ResponsiveContainer","CartesianGrid","XAxis","YAxis","Tooltip","Box","Stack","Typography","React","Cell","Pie","PieChart","ResponsiveContainer","Tooltip","Fragment","jsx","jsxs","Box","Stack","Typography","mergeSx","ResponsiveContainer","PieChart","Pie","Cell","Tooltip","Box","Stack","Tooltip","Typography","React","jsx","jsxs","segmentTooltipPopperSx","defaultSegmentTooltipCardSx","Box","Stack","Typography","Tooltip","mergeSx","jsx","jsxs","useMediaQuery","mergeSx","Card","CardContent","Stack","Typography","Box","Icon","Box","Button","IconButton","Paper","Skeleton","Stack","Tooltip","Typography","React","useEffect","useMemo","useState","ResponsiveContainer","overallVisitors","storeCount","Fragment","jsx","jsxs","Paper","Stack","Icon","Typography","Box","Tooltip","useMemo","useState","useEffect","p","Skeleton","IconButton","Button","ResponsiveContainer","Grid","Paper","Stack","Typography","jsx","jsxs","Box","Card","CardContent","Skeleton","Stack","Typography","React","Bar","BarChart","CartesianGrid","LabelList","ResponsiveContainer","Tooltip","XAxis","YAxis","React","jsx","jsx","jsxs","formatTooltipValue","mergeCss","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_CHROME","OLY_DEFAULT_CHART_AXIS_TICK_FILL","toNum","Box","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Bar","LabelList","mergeSx","Card","CardContent","Stack","Typography","Skeleton","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/components/inputs/AddCommentInput/AddCommentInput.tsx","../src/components/dialogs/AdvancedFiltersDialog/AdvancedFiltersDialog.tsx","../src/components/inputs/FalconMultiSelect/FalconMultiSelect.tsx","../src/components/buttons/ButtonWithIcon/ButtonWithIcon.tsx","../src/components/buttons/ChartWidgetInfoButton/ChartWidgetInfoButton.tsx","../src/components/utils/ChartWidgetHeaderSeparator/ChartWidgetHeaderSeparator.tsx","../src/components/utils/ChartEmptyState/ChartEmptyState.tsx","../src/components/filters/WidgetHeaderFilter/WidgetHeaderFilter.tsx","../src/components/widgets/RankedBarList/RankedBarList.tsx","../src/components/filters/TimePeriodFilter/TimePeriodFilter.tsx","../src/components/charts/QueueTimeBreakdown/QueueTimeBreakdownCustomizationContext.tsx","../src/components/charts/QueueTimeBreakdown/queueTimeBreakdown.rechartsTooltip.ts","../src/components/charts/QueueTimeBreakdown/queueTimeBreakdownCustomization.merge.ts","../src/components/tabs/ChartWidgetSegmentedTabs/ChartWidgetSegmentedTabs.tsx","../src/components/card/KpiStatCard/KpiStatCard.tsx","../src/components/card/KpiStatCard/useAnimatedMetric.ts","../src/components/card/JourneyStatCard/JourneyStatCard.tsx","../src/components/card/JourneyMetricCard/JourneyMetricCard.tsx","../src/components/buttons/FalconButton/FalconButton.tsx","../src/components/display/FalconAuditTimeline/FalconAuditTimeline.tsx","../src/components/dialogs/FalconExportDialog/FalconExportDialog.tsx","../src/components/dialogs/FalconExportReportDialog/FalconExportReportDialog.tsx","../src/components/filters/FalconDIstrictFilter/FalconDIstrictFilter.tsx","../src/components/display/FalconStatBanner/FalconStatBanner.tsx","../src/components/display/FalconStatBanner/FalconStatBannerGroup.tsx","../src/components/buttons/FalconGrayButton/FalconGrayButton.tsx","../src/components/data/FalconPagination/FalconPagination.tsx","../src/components/inputs/FalconSelect/FalconSelect.tsx","../src/components/form-controls/FalconSingleSwitch/FalconSingleSwitch.tsx","../src/components/data/FalconTable/FalconTable.tsx","../src/components/filters/FalconTicketColumsFilter/FalconTicketColumsFilter.tsx","../src/components/filters/FalconTicketFilter/FalconTicketFilter.tsx","../src/components/filters/timePeriodFilter.infoPopover.ts","../src/components/display/HeatMapChartLegend/HeatMapChartLegend.tsx","../src/components/display/ProgressBarNumber/ProgressBarNumber.tsx","../src/components/widgets/FootfallByAgeGroups/FootfallByAgeGroups.tsx","../src/components/_chart/resolveChartCardMaxWidth.ts","../src/components/widgets/FootfallByGender/FootfallByGender.tsx","../src/components/widgets/PasserbyConversion/PasserbyConversion.tsx","../src/components/_chart/useChartPlotScrollToEnd.ts","../src/components/widgets/WalkinAnalysis/WalkinAnalysis.tsx","../src/components/widgets/WalkinTraffic/WalkinTraffic.tsx","../src/components/charts/BillingCounterAnalytics/billingCounterAnalytics.chartTokens.ts","../src/components/charts/BillingCounterAnalytics/billingCounterAnalytics.defaultInfoPopover.ts","../src/components/charts/BillingCounterAnalytics/billingCounterAnalytics.mock.ts","../src/components/charts/BillingCounterAnalytics/BillingCounterAnalytics.tsx","../src/components/charts/BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge.ts","../src/components/charts/BillingCounterAnalytics/BillingCounterAnalyticsCustomizationContext.tsx","../src/components/charts/BillingCounterAnalytics/BillingCounterAnalyticsTooltip.tsx","../src/components/charts/QueueTimeBreakdown/queueTimeBreakdown.chartTokens.ts","../src/components/charts/QueueTimeBreakdown/QueueTimeBreakdown.tsx","../src/components/charts/QueueTimeBreakdown/QueueTimeBreakdown.types.ts","../src/components/charts/QueueTimeBreakdown/QueueTimeBreakdownArea.tsx","../src/components/charts/QueueTimeBreakdown/QueueTimeBreakdownAreaTooltip.tsx","../src/components/charts/QueueTimeBreakdown/QueueTimeBreakdownDonut.tsx","../src/components/charts/QueueTimeBreakdown/QueueTimeBreakdownStackedBar.tsx","../src/components/charts/QueueTimeBreakdown/queueTimeBreakdown.mock.ts","../src/components/widgets/FootFallHeatMap/FootFallHeatMapView.tsx","../src/components/widgets/FootFallHeatMap/FootFallHeatMapView.types.ts","../src/components/widgets/FootFallHeatMap/footfallHeatMapDerivedStrip.ts","../src/components/widgets/FootFallHeatMap/footfallHeatMapTree.ts","../src/components/widgets/FootFallHeatMap/ZoneWiseKpiCards.tsx","../src/components/widgets/PeakBillingHours/peakBillingHours.defaultInfoPopover.ts","../src/components/widgets/PeakBillingHours/peakBillingHours.mock.ts","../src/components/widgets/PeakBillingHours/PeakBillingHours.tsx","../src/components/widgets/PeakBillingHours/PeakBillingHoursCustomizationContext.tsx","../src/components/widgets/PeakBillingHours/PeakBillingHoursTooltip.tsx","../src/components/widgets/CustomerJourneyAnalysis/CustomerJourneyAnalysis.tsx","../src/components/FalconThemeProvider/FalconThemeProvider.tsx"],"sourcesContent":["import { Button, InputAdornment, TextField } from '@mui/material';\nimport type { ChangeEvent } from 'react';\nimport type { AddCommentInputProps } from './AddCommentInput.types';\n\nexport const AddCommentInput = ({\n value,\n setValue,\n handleAddComment,\n placeholder = 'Write Comment here',\n buttonLabel = 'Add Comment',\n}: AddCommentInputProps) => {\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value);\n };\n\n return (\n <TextField\n label=\"\"\n fullWidth\n sx={{ width: '550px', maxWidth: '100%' }}\n value={value}\n placeholder={placeholder}\n onChange={handleChange}\n type=\"text\"\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <Button\n variant=\"contained\"\n sx={{\n background: '#000',\n color: '#fff',\n position: 'absolute',\n right: 0,\n top: 0,\n padding: '16px',\n cursor: 'pointer',\n borderRadius: '0 5px 5px 0',\n }}\n onClick={handleAddComment}\n onMouseDown={e => e.preventDefault()}\n >\n {buttonLabel}\n </Button>\n </InputAdornment>\n ),\n }}\n />\n );\n};\n","import { Close as CloseIcon } from '@mui/icons-material';\nimport {\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n} from '@mui/material';\nimport { FalconMultiSelect } from '../../inputs/FalconMultiSelect';\nimport type { AdvancedFiltersDialogProps } from './AdvancedFiltersDialog.types';\n\nconst defaultLocationOptions = [\n { id: 1, label: 'Location A' },\n { id: 2, label: 'Location B' },\n];\n\nconst defaultBusinessAreaOptions = [\n { id: 1, label: 'Retail' },\n { id: 2, label: 'Healthcare' },\n];\n\nexport const AdvancedFiltersDialog = ({\n open,\n onClose,\n locationOptions = defaultLocationOptions.map(option => ({\n id: option.id,\n name: option.label,\n })),\n businessAreaOptions = defaultBusinessAreaOptions.map(option => ({\n id: option.id,\n name: option.label,\n })),\n selectedLocations = [],\n selectedBusinessAreas = [],\n onLocationsChange = () => {},\n onBusinessAreasChange = () => {},\n onApply,\n onCancel,\n}: AdvancedFiltersDialogProps) => {\n const handleApply = () => {\n onApply?.();\n onClose();\n };\n\n const handleCancel = () => {\n onCancel?.();\n onClose();\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Typography variant=\"h6\">Advanced Filters</Typography>\n <IconButton onClick={onClose} size=\"small\" aria-label=\"Close\">\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n <FalconMultiSelect\n label=\"Locations\"\n list={locationOptions}\n data={selectedLocations}\n setData={onLocationsChange}\n />\n <FalconMultiSelect\n label=\"Business Areas\"\n list={businessAreaOptions}\n data={selectedBusinessAreas}\n setData={onBusinessAreasChange}\n />\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleCancel}>Cancel</Button>\n <Button variant=\"contained\" onClick={handleApply}>\n Apply\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import { Icon } from '@iconify/react';\nimport { Stack, Typography } from '@mui/material';\nimport Autocomplete, {\n AutocompleteCloseReason,\n autocompleteClasses,\n} from '@mui/material/Autocomplete';\nimport Box from '@mui/material/Box';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport Checkbox from '@mui/material/Checkbox';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Popper from '@mui/material/Popper';\nimport TextField from '@mui/material/TextField';\nimport { styled } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n FalconMultiSelectOption,\n FalconMultiSelectProps,\n} from './FalconMultiSelect.types';\n\nexport const FalconMultiSelect = ({\n // core\n label,\n data,\n setData,\n list,\n // trigger\n triggerBg = '#EFEFEF',\n triggerColor,\n triggerMinWidth = 250,\n triggerBorderRadius = '6px',\n triggerSx,\n // popper panel\n popperWidth = 300,\n popperBorderColor = '#e1e4e8',\n popperBorderColorDark = '#30363d',\n popperBg = '#fff',\n popperBgDark = '#1c2128',\n popperColor = '#24292e',\n popperColorDark = '#c9d1d9',\n // options\n optionBorderColor = '#D6D6D6',\n optionHeight = 60,\n checkboxColor = 'green',\n checkboxCheckedColor = '#6750A4',\n // search\n searchLabel = 'Search State',\n searchIconColor = '#49454F',\n // buttons\n applyBg = '#333',\n applyColor = 'white',\n applyLabel = 'Apply',\n clearColor = 'black',\n clearLabel = 'Clear',\n}: FalconMultiSelectProps) => {\n const [checked, setChecked] = React.useState<FalconMultiSelectOption[]>(\n data ?? []\n );\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [pendingValue, setPendingValue] = React.useState<\n FalconMultiSelectOption[]\n >([]);\n\n const open = Boolean(anchorEl);\n const id = open ? 'falcon-multiselect' : undefined;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n setPendingValue(checked);\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n if (anchorEl) anchorEl.focus();\n setAnchorEl(null);\n };\n\n const handleApply = () => {\n setData(checked);\n handleClose();\n };\n\n const handleClear = () => {\n setChecked([]);\n setData([]);\n handleClose();\n };\n\n const handleToggle = (option: FalconMultiSelectOption) => {\n setChecked(prev => {\n const exists = prev.some(x => x.id === option.id);\n return exists ? prev.filter(x => x.id !== option.id) : [...prev, option];\n });\n };\n\n const triggerLabel =\n checked.length === 0\n ? `Filter by ${label}`\n : checked.length === 1\n ? checked[0].name\n : `${checked[0].name}, ${checked[1].name}${checked.length > 2 ? '…' : ''}`;\n\n return (\n <React.Fragment>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={2}\n onClick={handleClick}\n sx={{\n minWidth: triggerMinWidth,\n background: triggerBg,\n borderRadius: triggerBorderRadius,\n cursor: 'pointer',\n padding: '12px',\n ...(triggerColor ? { color: triggerColor } : {}),\n ...triggerSx,\n }}\n >\n <Typography\n variant=\"body2\"\n sx={triggerColor ? { color: triggerColor } : undefined}\n >\n {triggerLabel}\n </Typography>\n <Icon\n icon={open ? 'tabler:chevron-up' : 'tabler:chevron-down'}\n color={triggerColor}\n />\n </Stack>\n\n <StyledPopper\n id={id}\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n ownerState={{\n popperWidth,\n popperBorderColor,\n popperBorderColorDark,\n popperBg,\n popperBgDark,\n popperColor,\n popperColorDark,\n }}\n >\n <ClickAwayListener onClickAway={handleClose}>\n <div>\n <Autocomplete\n open\n multiple\n onClose={(\n _: React.SyntheticEvent,\n reason: AutocompleteCloseReason\n ) => {\n if (reason === 'escape') handleClose();\n }}\n value={pendingValue}\n onChange={(_, newValue) => setPendingValue(newValue)}\n disableCloseOnSelect\n slots={{ popper: PopperComponent }}\n noOptionsText=\"No labels\"\n options={list}\n getOptionLabel={option => option.name}\n isOptionEqualToValue={(option, val) => option.id === val.id}\n renderOption={(props, option) => (\n <li\n {...props}\n key={option.id}\n style={{\n height: optionHeight,\n border: `1px solid ${optionBorderColor}`,\n margin: '16px 12px',\n flexShrink: 0,\n borderRadius: 6,\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <Box\n sx={{\n flexGrow: 3,\n borderRadius: '3px',\n ml: 1,\n mt: '1px',\n justifyContent: 'start',\n alignItems: 'center',\n width: '80%',\n fontSize: '13px',\n }}\n >\n {option.name}\n </Box>\n <Box\n component=\"span\"\n sx={{\n flexShrink: 0,\n borderRadius: '3px',\n mr: 1,\n mt: '2px',\n flexGrow: 1,\n justifyContent: 'end',\n width: '20%',\n alignItems: 'center',\n }}\n >\n <Checkbox\n slotProps={{ input: { 'aria-label': option.name } }}\n checked={checked.some(x => x.id === option.id)}\n onChange={() => handleToggle(option)}\n sx={{\n color: checkboxColor,\n '&.Mui-checked': { color: checkboxCheckedColor },\n }}\n />\n </Box>\n </li>\n )}\n renderInput={params => (\n <Box\n sx={{\n position: 'relative',\n '& > :not(style)': { width: '100%' },\n }}\n >\n <TextField\n label={searchLabel}\n variant=\"filled\"\n sx={{\n width: '100%',\n margin: '10px',\n '& > :not(style)': { width: '94%' },\n }}\n ref={params.InputProps.ref}\n slotProps={{ htmlInput: params.inputProps }}\n />\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ position: 'absolute', left: 110, top: 30 }}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.76 13.27L20.49 19L19 20.49L13.27 14.76C12.2 15.53 10.91 16 9.5 16C5.91 16 3 13.09 3 9.5C3 5.91 5.91 3 9.5 3C13.09 3 16 5.91 16 9.5C16 10.91 15.53 12.2 14.76 13.27ZM9.5 5C7.01 5 5 7.01 5 9.5C5 11.99 7.01 14 9.5 14C11.99 14 14 11.99 14 9.5C14 7.01 11.99 5 9.5 5Z\"\n fill={searchIconColor}\n />\n </svg>\n </Box>\n )}\n />\n\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n m: '8px',\n height: 110,\n }}\n >\n <ActionButton\n onClick={handleApply}\n sx={{\n height: '42px',\n borderRadius: '3px',\n background: applyBg,\n margin: '5px 0 10px 0',\n color: applyColor,\n }}\n >\n {applyLabel}\n </ActionButton>\n <ActionButton\n onClick={handleClear}\n sx={{\n height: '42px',\n borderRadius: '3px',\n mb: '8px',\n color: clearColor,\n }}\n >\n {clearLabel}\n </ActionButton>\n </Box>\n </div>\n </ClickAwayListener>\n </StyledPopper>\n </React.Fragment>\n );\n};\n\n// ─── Internal types ──────────────────────────────────────────────────────────\n\ninterface PopperComponentProps {\n anchorEl?: unknown;\n disablePortal?: boolean;\n open: boolean;\n}\n\ninterface StyledPopperOwnerState {\n popperWidth: number | string;\n popperBorderColor: string;\n popperBorderColorDark: string;\n popperBg: string;\n popperBgDark: string;\n popperColor: string;\n popperColorDark: string;\n}\n\n// ─── Styled components ───────────────────────────────────────────────────────\n\nconst StyledAutocompletePopper = styled('div')(({ theme }) => ({\n [`& .${autocompleteClasses.paper}`]: {\n boxShadow: 'none',\n color: 'inherit',\n fontSize: 13,\n },\n [`& .${autocompleteClasses.listbox}`]: {\n backgroundColor: theme.palette.mode === 'light' ? '#fff' : '#1c2128',\n padding: 0,\n [`& .${autocompleteClasses.option}`]: {\n minHeight: 'auto',\n alignItems: 'flex-start',\n padding: 8,\n borderBottom: `1px solid ${theme.palette.mode === 'light' ? '#eaecef' : '#30363d'}`,\n '&[aria-selected=\"true\"]': { backgroundColor: 'transparent' },\n [`&.${autocompleteClasses.focused}, &.${autocompleteClasses.focused}[aria-selected=\"true\"]`]:\n {\n backgroundColor: theme.palette.action.hover,\n },\n },\n },\n [`&.${autocompleteClasses.popperDisablePortal}`]: { position: 'relative' },\n}));\n\nfunction PopperComponent({\n disablePortal: _d,\n anchorEl: _a,\n open: _o,\n ...other\n}: PopperComponentProps) {\n return <StyledAutocompletePopper {...other} />;\n}\n\nconst StyledPopper = styled(Popper, {\n shouldForwardProp: prop => prop !== 'ownerState',\n})<{ ownerState: StyledPopperOwnerState }>(({ theme, ownerState }) => ({\n border: `1px solid ${theme.palette.mode === 'light' ? ownerState.popperBorderColor : ownerState.popperBorderColorDark}`,\n boxShadow: `0 8px 24px ${theme.palette.mode === 'light' ? 'rgba(149, 157, 165, 0.2)' : 'rgb(1, 4, 9)'}`,\n borderRadius: 6,\n width: ownerState.popperWidth,\n zIndex: theme.zIndex.modal,\n fontSize: 13,\n color:\n theme.palette.mode === 'light'\n ? ownerState.popperColor\n : ownerState.popperColorDark,\n backgroundColor:\n theme.palette.mode === 'light'\n ? ownerState.popperBg\n : ownerState.popperBgDark,\n}));\n\nconst ActionButton = styled(ButtonBase)(() => ({\n fontSize: 13,\n width: '100%',\n textAlign: 'left',\n paddingBottom: 8,\n fontWeight: 600,\n '& span': { width: '100%' },\n '& svg': { width: 16, height: 16 },\n}));\n","import { Box, Button, Typography } from '@mui/material';\nimport type { ButtonWithIconProps } from './ButtonWithIcon.types';\n\nexport const ButtonWithIcon = ({\n size = 'large',\n variant = 'contained',\n children,\n icon,\n ...props\n}: ButtonWithIconProps) => (\n <Button\n fullWidth\n size={size}\n variant={variant}\n sx={{\n minWidth: '200px',\n maxWidth: '250px',\n backgroundColor: 'white',\n color: 'black',\n }}\n {...props}\n >\n <Box\n display=\"flex\"\n gap={1}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Typography variant=\"inherit\">{children}</Typography>\n {icon && (\n <Box mt={0.25} ml={0.5}>\n {icon}\n </Box>\n )}\n </Box>\n </Button>\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport IconButton from '@mui/material/IconButton';\nimport Popper, { type PopperPlacementType } from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from './ChartWidgetInfoButton.types';\n\nconst defaultIconColor = '#6750A4';\nconst defaultTriggerBg = '#EFEFEF';\nconst defaultTriggerHoverBg = '#E5E5E5';\nconst defaultButtonSize = 30;\nconst defaultIconSize = 22;\nconst defaultPopoverWidth = 320;\nconst compactButtonSize = 22;\nconst compactIconSize = 15;\nconst compactPopoverWidth = 240;\nconst popperBorder = '#e1e4e8';\nconst popperBorderDark = '#30363d';\n\n/** Triangle + track sized from trigger so legend-sized buttons get a smaller, proportional caret. */\nfunction resolveCaretMetrics(triggerWidth: number): {\n caretInset: number;\n trackW: number;\n halfOuter: number;\n halfInner: number;\n triH: number;\n stripH: number;\n} {\n const compact = triggerWidth <= 26;\n const halfOuter = compact ? 6 : 9;\n const halfInner = halfOuter - 1;\n const triH = compact ? 7 : 10;\n const stripH = triH;\n const minTrack = halfOuter * 2 + 4;\n const trackW = Math.max(triggerWidth, minTrack);\n /** Inset of the caret track from the popper’s start/end edge that aligns with the anchor (see `caretHorizontalAxis`). */\n const caretInset = Math.max(0, (triggerWidth - trackW) / 2);\n return { caretInset, trackW, halfOuter, halfInner, triH, stripH };\n}\n\n/** Popper flips to `top-*` when there is no room below; caret must attach on the edge that faces the anchor. */\nfunction popoverCaretPointsDown(placement: PopperPlacementType): boolean {\n return placement.startsWith('top');\n}\n\n/**\n * Maps Popper placement to where the caret sits on the panel width.\n * `bottom-end` / `top-end` → anchor’s end edge; `*-start` → start edge; `top`/`bottom` → centered under anchor.\n */\nfunction caretHorizontalAxis(\n placement: PopperPlacementType\n): 'end' | 'start' | 'center' {\n if (placement === 'bottom' || placement === 'top') {\n return 'center';\n }\n if (placement.endsWith('-start')) {\n return 'start';\n }\n if (placement.endsWith('-end')) {\n return 'end';\n }\n /* `auto`, side placements: keep caret readable */\n if (placement.startsWith('left') || placement.startsWith('right')) {\n return 'center';\n }\n return 'end';\n}\n\nfunction PopoverCaret({\n metrics,\n border,\n paperBg,\n pointsDown,\n placement,\n}: {\n metrics: ReturnType<typeof resolveCaretMetrics>;\n border: string;\n paperBg: string;\n /** `true` when placement is `top-*` (panel above the button; arrow on bottom of panel). */\n pointsDown: boolean;\n placement: PopperPlacementType;\n}) {\n const { caretInset, trackW, halfOuter, halfInner, triH, stripH } = metrics;\n const horizontal = caretHorizontalAxis(placement);\n\n const trackPositionSx =\n horizontal === 'center'\n ? {\n insetInlineStart: '50%',\n marginInlineStart: `${-trackW / 2}px`,\n width: trackW,\n }\n : horizontal === 'start'\n ? { insetInlineStart: caretInset, width: trackW }\n : { insetInlineEnd: caretInset, width: trackW };\n\n return (\n <Box\n aria-hidden\n sx={{\n position: 'relative',\n zIndex: 3,\n height: stripH,\n width: '100%',\n flexShrink: 0,\n pointerEvents: 'none',\n }}\n >\n <Box\n sx={{\n position: 'absolute',\n ...trackPositionSx,\n ...(pointsDown ? { top: 0 } : { bottom: 0 }),\n height: stripH,\n zIndex: 2,\n ...(pointsDown\n ? {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n top: 0,\n transform: 'translateX(-50%)',\n borderLeft: `${halfOuter}px solid transparent`,\n borderRight: `${halfOuter}px solid transparent`,\n borderTop: `${triH}px solid ${border}`,\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n top: '-2px',\n transform: 'translateX(-50%)',\n borderLeft: `${halfInner}px solid transparent`,\n borderRight: `${halfInner}px solid transparent`,\n borderTop: `${triH}px solid ${paperBg}`,\n },\n }\n : {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n bottom: 0,\n transform: 'translateX(-50%)',\n borderLeft: `${halfOuter}px solid transparent`,\n borderRight: `${halfOuter}px solid transparent`,\n borderBottom: `${triH}px solid ${border}`,\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: '50%',\n bottom: '-2px',\n transform: 'translateX(-50%)',\n borderLeft: `${halfInner}px solid transparent`,\n borderRight: `${halfInner}px solid transparent`,\n borderBottom: `${triH}px solid ${paperBg}`,\n },\n }),\n }}\n />\n </Box>\n );\n}\n\nfunction InfoPopoverPanel({\n content,\n width,\n isDark,\n triggerWidth,\n placement,\n compact,\n}: {\n content: ChartWidgetInfoPopoverContent;\n width: number;\n isDark: boolean;\n /** Matches the anchor button width so the caret lines up with the icon center (right-aligned popper). */\n triggerWidth: number;\n /** Actual Popper placement (may flip when there is no space below). */\n placement: PopperPlacementType;\n /** Smaller padding and type scale (see `ChartWidgetInfoButton` `density=\"compact\"`). */\n compact: boolean;\n}) {\n const helpTitle = content.helpTitle ?? 'How does it help?';\n const border = isDark ? popperBorderDark : popperBorder;\n const paperBg = isDark ? '#1c2128' : '#fff';\n const textPrimary = isDark ? '#f0f6fc' : '#1a1a1a';\n const textSecondary = isDark ? '#8b949e' : '#424242';\n\n const panelShadow = isDark\n ? '0 10px 24px rgb(1, 4, 9)'\n : '0 10px 24px rgba(15, 23, 42, 0.14)';\n\n const metrics = resolveCaretMetrics(triggerWidth);\n const caretDown = popoverCaretPointsDown(placement);\n\n const titleFs = compact ? 13 : 16;\n const bodyFs = compact ? 12 : 14;\n const helpFs = compact ? 12 : 14;\n const stackSpacing = compact ? 1 : 1.75;\n const paperPadding = compact ? 1.5 : 2.25;\n\n const paper = (\n <Box\n sx={{\n position: 'relative',\n zIndex: 1,\n width: '100%',\n ...(caretDown ? { mb: '-2px' } : { mt: '-2px' }),\n border: `1px solid ${border}`,\n borderRadius: compact ? 1.5 : 2,\n bgcolor: paperBg,\n p: paperPadding,\n boxShadow: panelShadow,\n }}\n >\n <Stack spacing={stackSpacing} sx={{ position: 'relative', zIndex: 1 }}>\n <Typography\n component=\"h3\"\n sx={{\n fontWeight: 700,\n fontSize: titleFs,\n lineHeight: 1.35,\n color: textPrimary,\n }}\n >\n {content.title}\n </Typography>\n <Typography\n sx={{\n fontSize: bodyFs,\n lineHeight: 1.5,\n color: textSecondary,\n }}\n >\n {content.description}\n </Typography>\n <Typography\n sx={{\n fontWeight: 700,\n fontSize: helpFs,\n lineHeight: 1.35,\n color: textPrimary,\n pt: compact ? 0 : 0.25,\n }}\n >\n {helpTitle}\n </Typography>\n <Box\n component=\"ul\"\n sx={{\n m: 0,\n pl: compact ? 2 : 2.5,\n color: textSecondary,\n fontSize: bodyFs,\n lineHeight: 1.55,\n listStyleType: 'disc',\n listStylePosition: 'outside',\n '& li': {\n display: 'list-item',\n mb: compact ? 0.5 : 0.75,\n '&:last-of-type': { mb: 0 },\n },\n }}\n >\n {content.helpBullets.map(item => (\n <Typography\n key={item}\n component=\"li\"\n sx={{\n fontSize: bodyFs,\n lineHeight: 1.55,\n display: 'list-item',\n }}\n >\n {item}\n </Typography>\n ))}\n </Box>\n </Stack>\n </Box>\n );\n\n const caret = (\n <PopoverCaret\n metrics={metrics}\n border={border}\n paperBg={paperBg}\n pointsDown={caretDown}\n placement={placement}\n />\n );\n\n return (\n <Box sx={{ position: 'relative', width }}>\n {caretDown ? (\n <>\n {paper}\n {caret}\n </>\n ) : (\n <>\n {caret}\n {paper}\n </>\n )}\n </Box>\n );\n}\n\nconst hoverCloseDelayMs = 120;\n\nexport const ChartWidgetInfoButton = ({\n onClick,\n ariaLabel = 'More information',\n sx,\n iconColor = defaultIconColor,\n buttonBg = defaultTriggerBg,\n buttonHoverBg = defaultTriggerHoverBg,\n iconSize: iconSizeProp,\n buttonSize: buttonSizeProp,\n popover,\n popoverWidth: popoverWidthProp,\n density = 'default',\n}: ChartWidgetInfoButtonProps) => {\n const isCompact = density === 'compact';\n const buttonSize =\n buttonSizeProp ?? (isCompact ? compactButtonSize : defaultButtonSize);\n const iconSize =\n iconSizeProp ?? (isCompact ? compactIconSize : defaultIconSize);\n const popoverWidth =\n popoverWidthProp ?? (isCompact ? compactPopoverWidth : defaultPopoverWidth);\n const theme = useTheme();\n const isDark = theme.palette.mode === 'dark';\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const open = Boolean(anchorEl) && Boolean(popover);\n\n const clearCloseTimer = React.useCallback(() => {\n if (closeTimerRef.current !== null) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n React.useEffect(() => () => clearCloseTimer(), [clearCloseTimer]);\n\n const scheduleClose = React.useCallback(() => {\n clearCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setAnchorEl(null);\n closeTimerRef.current = null;\n }, hoverCloseDelayMs);\n }, [clearCloseTimer]);\n\n const handleButtonMouseEnter = (\n event: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!popover) return;\n clearCloseTimer();\n setAnchorEl(event.currentTarget);\n };\n\n const handleButtonMouseLeave = () => {\n if (!popover) return;\n scheduleClose();\n };\n\n const handlePopperMouseEnter = () => {\n clearCloseTimer();\n };\n\n const handlePopperMouseLeave = () => {\n scheduleClose();\n };\n\n const handleToggle = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.();\n if (!popover) return;\n clearCloseTimer();\n setAnchorEl(prev => (prev ? null : event.currentTarget));\n };\n\n const handleClose = () => {\n clearCloseTimer();\n setAnchorEl(null);\n };\n\n return (\n <Box sx={{ flexShrink: 0, position: 'relative', display: 'inline-flex' }}>\n <IconButton\n type=\"button\"\n size=\"small\"\n onClick={handleToggle}\n onMouseEnter={handleButtonMouseEnter}\n onMouseLeave={handleButtonMouseLeave}\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup={popover ? 'dialog' : undefined}\n sx={{\n flexShrink: 0,\n bgcolor: buttonBg,\n width: buttonSize,\n height: buttonSize,\n minWidth: buttonSize,\n p: 0,\n border: 'none',\n borderRadius: '50%',\n '&:hover': { bgcolor: buttonHoverBg },\n ...sx,\n }}\n >\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n lineHeight: 0,\n pointerEvents: 'none',\n }}\n >\n <Icon\n icon=\"bi:info\"\n width={iconSize}\n height={iconSize}\n color={iconColor}\n />\n </Box>\n </IconButton>\n\n {popover ? (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-end\"\n sx={{ zIndex: theme.zIndex.modal }}\n modifiers={[\n {\n name: 'offset',\n options: { offset: [0, 4] },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: [\n 'bottom-start',\n 'bottom',\n 'top-end',\n 'top-start',\n 'top',\n ],\n },\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 12,\n altAxis: true,\n },\n },\n ]}\n >\n {({ placement }) => (\n <ClickAwayListener onClickAway={handleClose}>\n <Box\n onMouseEnter={handlePopperMouseEnter}\n onMouseLeave={handlePopperMouseLeave}\n >\n <InfoPopoverPanel\n content={popover}\n width={popoverWidth}\n isDark={isDark}\n triggerWidth={buttonSize}\n placement={placement ?? 'bottom-end'}\n compact={isCompact}\n />\n </Box>\n </ClickAwayListener>\n )}\n </Popper>\n ) : null}\n </Box>\n );\n};\n","import Divider from '@mui/material/Divider';\n\nexport const ChartWidgetHeaderSeparator = () => (\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{\n alignSelf: 'center',\n borderColor: '#E0E0E0',\n height: 40,\n my: 0.5,\n }}\n />\n);\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { ChartEmptyStateProps } from './ChartEmptyState.types';\n\nfunction mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) return undefined;\n if (flat.length === 1) return flat[0];\n return flat.flat() as SxProps<Theme>;\n}\n\n/**\n * A reusable empty state / placeholder component specifically for charts.\n */\nexport function ChartEmptyState({\n minHeight = 300,\n icon = 'mdi:chart-box-outline',\n iconSize = 40,\n iconColor = '#9CA3AF',\n title = 'No Data Available',\n subtitle = \"There's no data to display in this chart yet\",\n gap = 1,\n containerSx,\n titleSx,\n subtitleSx,\n titleWeight = 700,\n subtitleWeight = 400,\n direction = 'column',\n}: ChartEmptyStateProps): React.ReactElement {\n return (\n <Box\n sx={mergeSx(\n {\n display: 'flex',\n minHeight,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: direction,\n gap,\n },\n containerSx\n )}\n >\n {icon && (\n <Icon\n icon={icon}\n width={iconSize}\n height={iconSize}\n color={iconColor}\n />\n )}\n {title && (\n <Typography\n sx={mergeSx(\n {\n fontSize: '18px',\n fontWeight: titleWeight,\n color: '#374151',\n lineHeight: 1.2,\n textAlign: 'center',\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography\n sx={mergeSx(\n {\n fontSize: '14px',\n fontWeight: subtitleWeight,\n color: '#6B7280',\n textAlign: 'center',\n },\n subtitleSx\n )}\n >\n {subtitle}\n </Typography>\n )}\n </Box>\n );\n}\n\nexport default ChartEmptyState;\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { WidgetHeaderFilterProps } from './WidgetHeaderFilter.types';\n\nconst defaultTriggerBg = '#F3F3F3';\n/** Default trigger width (px). Override with **`triggerMinWidth`** for wider filters or dense layouts. */\nconst defaultTriggerMinWidth = 160;\nconst defaultTriggerBorderRadius = '10px';\n/** Fixed panel width when `popperMatchTrigger={false}` and `popperWidth` is omitted (Falcon multi-select default). */\nconst defaultFixedPopperWidth = 300;\n\n/** When `popperMatchTrigger` is true, the list matches the trigger width (see Popper modifiers below). */\nconst headerFilterPopperModifiersMatchTrigger: NonNullable<\n React.ComponentProps<typeof Popper>['modifiers']\n> = [\n { name: 'offset', options: { offset: [0, 2] } },\n {\n name: 'sameWidth',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn({ state }) {\n state.styles.popper.width = `${state.rects.reference.width}px`;\n },\n effect({ state }) {\n const { reference, popper } = state.elements;\n if (reference instanceof HTMLElement) {\n popper.style.width = `${reference.getBoundingClientRect().width}px`;\n }\n },\n },\n];\n\nconst headerFilterPopperModifiersOffsetOnly: NonNullable<\n React.ComponentProps<typeof Popper>['modifiers']\n> = [{ name: 'offset', options: { offset: [0, 2] } }];\n\ntype FilterOption = { id: number; name: string };\n\nfunction selectionSummary(selected: FilterOption[]): string {\n if (selected.length === 0) return 'All';\n if (selected.length === 1) return selected[0].name;\n return `${selected[0].name}, ${selected[1].name}${selected.length > 2 ? '…' : ''}`;\n}\n\nfunction multiSelectionSummary(selected: FilterOption[]): string {\n if (selected.length === 0) return 'All';\n if (selected.length === 1) return selected[0].name;\n return `${selected.length} Stores`;\n}\n\n/**\n * Widget header filter styled like the provided mock:\n * two-line trigger + simple dropdown list.\n */\nexport const WidgetHeaderFilter = ({\n label,\n list,\n groupedList,\n data,\n setData,\n triggerBg = defaultTriggerBg,\n triggerColor,\n triggerMinWidth = defaultTriggerMinWidth,\n triggerBorderRadius = defaultTriggerBorderRadius,\n triggerSx,\n popperMatchTrigger = true,\n popperWidth,\n popperSx,\n popperBorderColor = '#e1e4e8',\n popperBorderColorDark = '#30363d',\n popperBg = '#fff',\n popperBgDark = '#1c2128',\n popperColor = '#24292e',\n popperColorDark = '#c9d1d9',\n multiSelect = false,\n searchPlaceholder = 'Search',\n applyLabel = 'Apply',\n cancelLabel = 'Cancel',\n checkboxColor = '#5B5B69',\n checkboxCheckedColor = '#6750A4',\n groupHeaderBg = 'rgba(0,0,0,0.03)',\n groupHeaderColor = '#111827',\n groupHeaderFontSize = 14,\n optionTextColor = '#111827',\n searchIconColor = '#49454F',\n searchTextColor = '#111827',\n searchPlaceholderColor = '#6B7280',\n applyBg = '#6750A4',\n applyColor = '#FFFFFF',\n cancelBg = 'transparent',\n cancelColor = '#374151',\n cancelBorderColor = '#9CA3AF',\n triggerLabelSx,\n triggerValueSx,\n listItemSx,\n}: WidgetHeaderFilterProps) => {\n const theme = useTheme();\n const isDark = theme.palette.mode === 'dark';\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [draftSelection, setDraftSelection] =\n React.useState<FilterOption[]>(data);\n const [query, setQuery] = React.useState('');\n\n const open = Boolean(anchorEl);\n const matchTriggerWidth = multiSelect ? true : popperMatchTrigger;\n const fixedPopperWidth = popperWidth ?? defaultFixedPopperWidth;\n\n const valueLine = multiSelect\n ? multiSelectionSummary(data)\n : selectionSummary(data);\n const triggerTextColor = triggerColor ?? '#1a1a1a';\n const triggerChevronColor = triggerColor ?? '#101010';\n\n const handleOpen = (event: React.MouseEvent<HTMLElement>) => {\n if (multiSelect) {\n setDraftSelection(data);\n setQuery('');\n }\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSelect = (option: FilterOption) => {\n setData([option]);\n handleClose();\n };\n\n const toggleOption = (option: FilterOption) => {\n setDraftSelection(prev => {\n const exists = prev.some(item => item.id === option.id);\n return exists\n ? prev.filter(item => item.id !== option.id)\n : [...prev, option];\n });\n };\n\n const handleApply = () => {\n setData(draftSelection);\n handleClose();\n };\n\n const filteredList = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return list;\n return list.filter(option => option.name.toLowerCase().includes(q));\n }, [list, query]);\n\n const filteredGroupedList = React.useMemo(() => {\n if (!groupedList) return [];\n const q = query.trim().toLowerCase();\n return groupedList\n .map(group => ({\n title: group.title,\n options: q\n ? group.options.filter(option =>\n option.name.toLowerCase().includes(q)\n )\n : group.options,\n }))\n .filter(group => group.options.length > 0);\n }, [groupedList, query]);\n\n return (\n <Box sx={{ flexShrink: 0, position: 'relative' }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n spacing={1.5}\n onClick={handleOpen}\n sx={{\n minWidth: triggerMinWidth,\n background: triggerBg,\n borderRadius: triggerBorderRadius,\n cursor: 'pointer',\n px: multiSelect ? 1.25 : 1.75,\n py: multiSelect ? 0.5 : 0.65,\n border: '1px solid #D8D8E5',\n color: triggerTextColor,\n ...triggerSx,\n }}\n >\n <Stack spacing={0.125} sx={{ flex: 1, minWidth: 0, textAlign: 'left' }}>\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n fontWeight: 700,\n fontSize: multiSelect ? 12 : 13,\n lineHeight: 1.2,\n },\n ...(triggerLabelSx ? [triggerLabelSx] : []),\n ] as SxProps<Theme>\n }\n >\n {label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n fontWeight: 500,\n fontSize: multiSelect ? 13 : 14,\n lineHeight: 1.2,\n },\n ...(triggerValueSx ? [triggerValueSx] : []),\n ] as SxProps<Theme>\n }\n >\n {valueLine}\n </Typography>\n </Stack>\n <Icon\n icon={open ? 'tabler:chevron-up' : 'tabler:chevron-down'}\n width={multiSelect ? 16 : 18}\n height={multiSelect ? 16 : 18}\n color={triggerChevronColor}\n style={{ flexShrink: 0 }}\n />\n </Stack>\n\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n sx={{ zIndex: theme.zIndex.modal }}\n modifiers={\n matchTriggerWidth\n ? headerFilterPopperModifiersMatchTrigger\n : headerFilterPopperModifiersOffsetOnly\n }\n >\n <ClickAwayListener onClickAway={handleClose}>\n <Paper\n elevation={8}\n sx={{\n width: matchTriggerWidth ? '100%' : fixedPopperWidth,\n border: `1px solid ${isDark ? popperBorderColorDark : popperBorderColor}`,\n borderRadius: 1.5,\n bgcolor: isDark ? popperBgDark : popperBg,\n color: isDark ? popperColorDark : popperColor,\n overflow: 'hidden',\n boxShadow:\n theme.palette.mode === 'light'\n ? '0 10px 24px rgba(15, 23, 42, 0.14)'\n : '0 10px 24px rgb(1, 4, 9)',\n ...popperSx,\n }}\n >\n <List disablePadding>\n {multiSelect ? (\n <React.Fragment>\n <Box sx={{ px: 1.25, pt: 1.25, pb: 0.75 }}>\n <TextField\n fullWidth\n size=\"small\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n sx={{\n '& .MuiInputBase-input': {\n color: searchTextColor,\n },\n '& .MuiInputBase-input::placeholder': {\n color: searchPlaceholderColor,\n opacity: 1,\n },\n }}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <Icon\n icon=\"tabler:search\"\n width={18}\n height={18}\n color={searchIconColor}\n />\n </InputAdornment>\n ),\n },\n }}\n />\n </Box>\n <Box sx={{ maxHeight: 220, overflowY: 'auto' }}>\n {filteredGroupedList.length > 0\n ? filteredGroupedList.map(group => (\n <React.Fragment key={`group-${group.title}`}>\n <Box\n sx={{\n px: 1.25,\n py: 0.7,\n bgcolor: groupHeaderBg,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n }}\n >\n <Typography\n sx={{\n fontSize: groupHeaderFontSize,\n fontWeight: 700,\n color: groupHeaderColor,\n }}\n >\n {group.title}\n </Typography>\n </Box>\n {group.options.map(option => {\n const checked = draftSelection.some(\n item => item.id === option.id\n );\n return (\n <ListItemButton\n key={option.id}\n onClick={() => toggleOption(option)}\n dense\n sx={\n [\n {\n py: 0.45,\n px: 1.25,\n minHeight: 36,\n borderBottom:\n '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': {\n borderBottom: 'none',\n },\n '&:hover': {\n bgcolor: 'rgba(0,0,0,0.03)',\n },\n },\n ...(listItemSx ? [listItemSx] : []),\n ] as SxProps<Theme>\n }\n >\n <Checkbox\n checked={checked}\n disableRipple\n size=\"small\"\n sx={{\n mr: 0.75,\n color: checkboxColor,\n '&.Mui-checked': {\n color: checkboxCheckedColor,\n },\n }}\n />\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n lineHeight: 1.2,\n fontWeight: 500,\n color: optionTextColor,\n },\n }}\n />\n </ListItemButton>\n );\n })}\n </React.Fragment>\n ))\n : filteredList.map(option => {\n const checked = draftSelection.some(\n item => item.id === option.id\n );\n return (\n <ListItemButton\n key={option.id}\n onClick={() => toggleOption(option)}\n dense\n sx={\n [\n {\n py: 0.45,\n px: 1.25,\n minHeight: 36,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': { borderBottom: 'none' },\n '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' },\n },\n ...(listItemSx ? [listItemSx] : []),\n ] as SxProps<Theme>\n }\n >\n <Checkbox\n checked={checked}\n disableRipple\n size=\"small\"\n sx={{\n mr: 0.75,\n color: checkboxColor,\n '&.Mui-checked': {\n color: checkboxCheckedColor,\n },\n }}\n />\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n lineHeight: 1.2,\n fontWeight: 500,\n color: optionTextColor,\n },\n }}\n />\n </ListItemButton>\n );\n })}\n </Box>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ px: 1.25, py: 1, borderTop: '1px solid #E5E7EB' }}\n >\n <Button\n variant=\"outlined\"\n fullWidth\n onClick={handleClose}\n sx={{\n textTransform: 'none',\n fontWeight: 600,\n minHeight: 34,\n py: 0.4,\n bgcolor: cancelBg,\n color: cancelColor,\n borderColor: cancelBorderColor,\n '&:hover': {\n bgcolor: cancelBg,\n borderColor: cancelBorderColor,\n },\n }}\n >\n {cancelLabel}\n </Button>\n <Button\n variant=\"contained\"\n fullWidth\n onClick={handleApply}\n sx={{\n textTransform: 'none',\n fontWeight: 700,\n minHeight: 34,\n py: 0.4,\n bgcolor: applyBg,\n color: applyColor,\n '&:hover': { bgcolor: applyBg },\n }}\n >\n {applyLabel}\n </Button>\n </Stack>\n </React.Fragment>\n ) : (\n list.map(option => (\n <ListItemButton\n key={option.id}\n onClick={() => handleSelect(option)}\n dense\n sx={\n [\n {\n py: 0.75,\n px: 2,\n minHeight: 36,\n borderBottom: '1px solid rgba(0,0,0,0.06)',\n '&:last-of-type': { borderBottom: 'none' },\n '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' },\n },\n ...(listItemSx ? [listItemSx] : []),\n ] as SxProps<Theme>\n }\n >\n <ListItemText\n primary={option.name}\n slotProps={{\n primary: {\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1.3,\n },\n }}\n />\n </ListItemButton>\n ))\n )}\n </List>\n </Paper>\n </ClickAwayListener>\n </Popper>\n </Box>\n );\n};\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n RankedBarListItem,\n RankedBarListProps,\n RankedBarListSegment,\n RankedBarListSegmentTooltipRenderContext,\n} from './RankedBarList.types';\n\nconst defaultBarColor = '#8963F0';\nconst defaultTrackColor = '#E8E8E8';\n\nfunction defaultFormatSegmentTooltip(\n segment: RankedBarListSegment,\n _row: RankedBarListItem\n): string {\n return `${segment.label} : ${segment.value}`;\n}\n\n/** MUI Popper surface: no padding so the custom card controls layout. */\nconst segmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst defaultSegmentTooltipCardSx: SxProps<Theme> = {\n maxWidth: 280,\n bgcolor: '#fff',\n borderRadius: 1,\n border: '1px solid #E8E8E8',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n overflow: 'hidden',\n};\n\nfunction SegmentTooltipTitle({\n segment,\n row,\n formatSegmentTooltip,\n segmentTooltipSx,\n}: {\n segment: RankedBarListSegment;\n row: RankedBarListItem;\n formatSegmentTooltip: (\n segment: RankedBarListSegment,\n row: RankedBarListItem\n ) => string;\n segmentTooltipSx?: SxProps<Theme>;\n}): React.ReactElement {\n const customText = formatSegmentTooltip(segment, row);\n const defaultPattern = `${segment.label} : ${segment.value}`;\n const useStructured = customText === defaultPattern;\n\n const cardSx = segmentTooltipSx\n ? ([defaultSegmentTooltipCardSx, segmentTooltipSx] as SxProps<Theme>)\n : defaultSegmentTooltipCardSx;\n\n return (\n <Box sx={cardSx}>\n <Box sx={{ height: 3, bgcolor: 'grey.200', width: '100%' }} />\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 0.5,\n rowGap: 0.5,\n px: 1.5,\n py: 1.25,\n }}\n >\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: segment.color,\n flexShrink: 0,\n }}\n />\n {useStructured ? (\n <>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.label}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {' : '}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.value}\n </Typography>\n </>\n ) : (\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {customText}\n </Typography>\n )}\n </Box>\n </Box>\n );\n}\n\nfunction resolveCardMaxWidth(\n cardMaxWidth: RankedBarListProps['cardMaxWidth'],\n fullWidth: boolean | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (fullWidth) {\n return '100%';\n }\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return `${cardMaxWidth}px`;\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? `${cardMaxWidth.xs}px`\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? `${cardMaxWidth.sm}px`\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? `${cardMaxWidth.md}px`\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n\nfunction RankedBarRowTrack({\n pct,\n row,\n barColor,\n barTrackColor,\n barHeight,\n isBarWidthAnimationActive,\n formatSegmentTooltip,\n renderSegmentTooltip,\n segmentTooltipSx,\n}: {\n pct: number;\n row: RankedBarListItem;\n barColor: string;\n barTrackColor: string;\n barHeight: number;\n isBarWidthAnimationActive: boolean;\n formatSegmentTooltip: (\n segment: RankedBarListSegment,\n row: RankedBarListItem\n ) => string;\n renderSegmentTooltip?: RankedBarListProps['renderSegmentTooltip'];\n segmentTooltipSx?: SxProps<Theme>;\n}): React.ReactElement {\n const segments = row.segments;\n const segSum = segments?.reduce((acc, s) => acc + s.value, 0) ?? 0;\n const useStack = Boolean(segments?.length) && segSum > 0;\n\n const widthTransition = isBarWidthAnimationActive\n ? (theme: Theme) =>\n theme.transitions.create('width', {\n duration: theme.transitions.duration.shorter,\n })\n : 'none';\n\n /** Theme `borderRadius: 2` can exceed bar height and causes uneven corner clamping between slices. */\n const endCapRadius = `${Math.max(1, Math.floor(barHeight / 2))}px`;\n\n return (\n <Box\n sx={{\n height: barHeight,\n borderRadius: endCapRadius,\n bgcolor: barTrackColor,\n overflow: 'hidden',\n width: '100%',\n }}\n >\n {useStack && segments ? (\n <Box\n sx={{\n height: barHeight,\n width: `${pct}%`,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'stretch',\n alignContent: 'stretch',\n minWidth: 0,\n transition: widthTransition,\n }}\n >\n {segments.map((seg, i) => (\n <Tooltip\n key={seg.id}\n title={(() => {\n if (renderSegmentTooltip) {\n const custom = renderSegmentTooltip({\n segment: seg,\n row,\n } satisfies RankedBarListSegmentTooltipRenderContext);\n return custom == null ? '' : custom;\n }\n return (\n <SegmentTooltipTitle\n segment={seg}\n row={row}\n formatSegmentTooltip={formatSegmentTooltip}\n segmentTooltipSx={segmentTooltipSx}\n />\n );\n })()}\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: segmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n flexGrow: seg.value,\n flexShrink: 1,\n flexBasis: 0,\n minWidth: 2,\n height: barHeight,\n minHeight: barHeight,\n maxHeight: barHeight,\n boxSizing: 'border-box',\n lineHeight: 0,\n bgcolor: seg.color,\n cursor: 'default',\n ...(i === 0\n ? {\n borderTopLeftRadius: endCapRadius,\n borderBottomLeftRadius: endCapRadius,\n }\n : {}),\n ...(i === segments.length - 1\n ? {\n borderTopRightRadius: endCapRadius,\n borderBottomRightRadius: endCapRadius,\n }\n : {}),\n }}\n />\n </Tooltip>\n ))}\n </Box>\n ) : (\n <Box\n sx={{\n height: '100%',\n width: `${pct}%`,\n borderRadius: endCapRadius,\n bgcolor: barColor,\n transition: widthTransition,\n }}\n />\n )}\n </Box>\n );\n}\n\n/**\n * Ranked list widget: title row, optional header actions, scrollable list of labels with\n * horizontal bars sized by numeric value (highest value = full bar width).\n */\nexport const RankedBarList = ({\n title,\n items,\n sortByValueDescending = true,\n maxValue: maxValueProp,\n listHeaderLabel = 'Cameras (High to Low)',\n valueColumnHeader = 'No. of Alerts',\n showSortControl: showSortControlProp = true,\n onSortClick,\n headerActions,\n barColor = defaultBarColor,\n barTrackColor = defaultTrackColor,\n barHeight = 7,\n formatSegmentTooltip = defaultFormatSegmentTooltip,\n renderSegmentTooltip,\n segmentTooltipSx,\n listMaxHeight = 280,\n fullWidth,\n fillHeight,\n cardMaxWidth,\n cardSx,\n emptyStatePlaceholderProps,\n isBarWidthAnimationActive = true,\n scrollListToTopOnItemsChange = true,\n customization,\n}: RankedBarListProps) => {\n const showSortControl = customization?.showSortControl ?? showSortControlProp;\n\n const listScrollRef = React.useRef<HTMLDivElement>(null);\n\n const itemsSignature = React.useMemo(\n () =>\n items\n .map(i => {\n const seg =\n i.segments?.map(s => `${s.id}:${s.value}`).join('|') ?? '';\n return `${i.id}:${i.value}:${seg}`;\n })\n .join('\\0'),\n [items]\n );\n\n React.useLayoutEffect(() => {\n if (!scrollListToTopOnItemsChange) {\n return;\n }\n const el = listScrollRef.current;\n if (!el) {\n return;\n }\n el.scrollTop = 0;\n }, [itemsSignature, scrollListToTopOnItemsChange]);\n\n const rows = React.useMemo(() => {\n const copy = [...items];\n if (sortByValueDescending) {\n copy.sort((a, b) => b.value - a.value);\n }\n return copy;\n }, [items, sortByValueDescending]);\n\n const maxValue = React.useMemo(() => {\n if (maxValueProp !== undefined && maxValueProp > 0) {\n return maxValueProp;\n }\n const m = rows.reduce((acc, r) => Math.max(acc, r.value), 0);\n return m > 0 ? m : 1;\n }, [maxValueProp, rows]);\n\n return (\n <Box\n sx={{\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n minWidth: 0,\n maxWidth: resolveCardMaxWidth(cardMaxWidth, fullWidth),\n boxSizing: 'border-box',\n ...(fillHeight\n ? {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n }\n : {}),\n ...cardSx,\n }}\n >\n <Stack\n spacing={2}\n sx={\n fillHeight ? { flex: 1, minHeight: 0, overflow: 'hidden' } : undefined\n }\n >\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n sx={fillHeight ? { flexShrink: 0 } : undefined}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={\n [\n {\n fontWeight: 700,\n color: 'text.primary',\n pr: 1,\n fontSize: { xs: 16, sm: 18 },\n },\n ...(customization?.titleSx != null\n ? [customization.titleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0 }}>{headerActions}</Box>\n ) : null}\n </Stack>\n\n <Box\n sx={{\n border: '1px solid #E8E8E8',\n borderRadius: 2,\n bgcolor: '#FAFAFA',\n overflow: 'hidden',\n ...(fillHeight\n ? {\n flex: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n }\n : {}),\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{\n px: 2,\n py: 1.25,\n borderBottom: '1px solid rgba(0,0,0,0.08)',\n bgcolor: '#fff',\n flexShrink: 0,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 600, color: 'text.primary', fontSize: 13 },\n ...(customization?.listHeaderSx != null\n ? [customization.listHeaderSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {listHeaderLabel}\n </Typography>\n {showSortControl ? (\n <IconButton\n size=\"small\"\n aria-label=\"Sort\"\n onClick={onSortClick}\n sx={{ p: 0.35, color: 'text.secondary' }}\n >\n <Icon icon=\"tabler:arrows-sort\" width={18} height={18} />\n </IconButton>\n ) : null}\n </Stack>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 600, color: 'text.secondary', fontSize: 12 },\n ...(customization?.listHeaderSx != null\n ? [customization.listHeaderSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {valueColumnHeader}\n </Typography>\n </Stack>\n\n <Box\n ref={listScrollRef}\n sx={{\n ...(fillHeight\n ? {\n flex: 1,\n minHeight: 0,\n maxHeight: 'none',\n }\n : { maxHeight: listMaxHeight }),\n overflowY: 'auto',\n bgcolor: '#fff',\n }}\n >\n {rows.length === 0 ? (\n <ChartEmptyState\n minHeight={220}\n {...emptyStatePlaceholderProps}\n />\n ) : (\n rows.map((row, index) => {\n const pct = Math.min(\n 100,\n Math.max(0, (row.value / maxValue) * 100)\n );\n return (\n <Box\n key={row.id}\n sx={{\n px: 2,\n py: 1.5,\n borderBottom:\n index < rows.length - 1\n ? '1px solid rgba(0,0,0,0.06)'\n : 'none',\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{ mb: 0.75 }}\n >\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: 'text.primary',\n fontWeight: 500,\n fontSize: 14,\n },\n ...(customization?.rowTypographySx != null\n ? [customization.rowTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {row.label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: 'text.primary',\n fontWeight: 600,\n fontSize: 14,\n minWidth: 28,\n textAlign: 'right',\n },\n ...(customization?.valueTypographySx != null\n ? [customization.valueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {row.value}\n </Typography>\n </Stack>\n <RankedBarRowTrack\n pct={pct}\n row={row}\n barColor={barColor}\n barTrackColor={barTrackColor}\n barHeight={barHeight}\n isBarWidthAnimationActive={isBarWidthAnimationActive}\n formatSegmentTooltip={formatSegmentTooltip}\n renderSegmentTooltip={renderSegmentTooltip}\n segmentTooltipSx={segmentTooltipSx}\n />\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n </Stack>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { ChartWidgetInfoButton } from '../../buttons/ChartWidgetInfoButton';\nimport type {\n ChartWidgetInfoButtonProps,\n ChartWidgetInfoPopoverContent,\n} from '../../buttons/ChartWidgetInfoButton/ChartWidgetInfoButton.types';\nimport { useQueueTimeBreakdownCustomization } from '../../charts/QueueTimeBreakdown/QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from '../../charts/QueueTimeBreakdown/QueueTimeBreakdown.types';\nimport { mergeSx } from '../../charts/QueueTimeBreakdown/queueTimeBreakdownCustomization.merge';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\n\nfunction mergeInfoButtonPresentation(\n fromTheme: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> | undefined,\n fromProps: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> | undefined\n): Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>> {\n return {\n ...fromTheme,\n ...fromProps,\n sx: mergeSx(fromTheme?.sx, fromProps?.sx),\n };\n}\n\nexport type TimePeriodFilterProps = {\n selectedFilter: QueueTimeChartFilter;\n onFilterChange: React.Dispatch<React.SetStateAction<QueueTimeChartFilter>>;\n /**\n * Info popover beside D/W/M/Y. Pass **`ChartWidgetInfoPopoverContent`** to show separator +\n * **ChartWidgetInfoButton**. Omit or **`null`** hides them (no implicit copy). For standalone use,\n * prefer **`TIME_PERIOD_FILTER_INFO_POPOVER`** (neutral D/W/M/Y). **`TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN`**\n * is for **QueueTimeBreakdown** only — that card injects it when **`infoPopover`** is omitted; do not\n * use the breakdown preset on **TimePeriodFilter** outside that widget.\n */\n infoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Presentation for **ChartWidgetInfoButton** (ignored when **infoPopover** is omitted or **`null`**).\n * Overrides the same fields from **customization.periodFilter.infoButtonProps** when both are set.\n */\n infoButtonProps?: Partial<Omit<ChartWidgetInfoButtonProps, 'popover'>>;\n /** Overrides the same keys from **customization.periodFilter.rootSx** when both are set. */\n sx?: SxProps<Theme>;\n};\n\nconst PERIODS = ['Day', 'Week', 'Month', 'Year'] as const;\n\nfunction periodLetter(period: (typeof PERIODS)[number]): string {\n switch (period) {\n case 'Day':\n return 'D';\n case 'Week':\n return 'W';\n case 'Month':\n return 'M';\n case 'Year':\n return 'Y';\n default:\n return '';\n }\n}\n\n/**\n * Day / Week / Month / Year segmented control — square D/W/M/Y cells, optional info button.\n * Layout-neutral: no title or page-level alignment; wrap in your own **Stack** / **Box** or pass **sx**.\n *\n * Theme **customization.periodFilter** supports colours, **toggleGroupSx**, **toggleButtonSx**,\n * **infoStackSx**, and **infoButtonProps**; component **infoButtonProps** override theme **infoButtonProps** for overlapping keys.\n *\n * Source: **`packages/falcon-ui/src/components/filters/TimePeriodFilter/`** (see **`components/tabs/`** for a similar package layout).\n */\nexport function TimePeriodFilter({\n selectedFilter,\n onFilterChange,\n infoPopover,\n infoButtonProps,\n sx,\n}: TimePeriodFilterProps): React.ReactElement {\n const { periodFilter: pf } = useQueueTimeBreakdownCustomization();\n const SEGMENT_PX = pf?.segmentSizePx ?? 36;\n const borderRadius = pf?.borderRadiusPx ?? 8;\n const fontSize = pf?.fontSizePx ?? 13;\n const borderCol = pf?.borderColor ?? '#E5E7EB';\n const trackBg = pf?.trackBackground ?? '#F3F4F6';\n const dividerCol = pf?.dividerColor ?? borderCol;\n const inactiveColor = pf?.inactiveColor ?? '#0f172a';\n const activeBg = pf?.activeBackground ?? '#000000';\n const activeColor = pf?.activeColor ?? '#ffffff';\n const hoverBg = pf?.inactiveHoverBackground ?? 'rgba(15, 23, 42, 0.06)';\n\n const handleChange = (\n _event: React.MouseEvent<HTMLElement>,\n next: QueueTimeChartFilter | null\n ): void => {\n if (next !== null) {\n onFilterChange(next);\n }\n };\n\n const resolvedInfoPopover: ChartWidgetInfoPopoverContent | null =\n infoPopover ?? null;\n\n const mergedInfoButton = React.useMemo(\n () =>\n mergeInfoButtonPresentation(pf?.infoButtonProps, infoButtonProps ?? {}),\n [pf?.infoButtonProps, infoButtonProps]\n );\n\n return (\n <Box\n sx={mergeSx(\n {\n display: 'inline-flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 1.5,\n rowGap: 1,\n },\n pf?.rootSx,\n sx\n )}\n >\n <ToggleButtonGroup\n exclusive\n value={selectedFilter}\n onChange={handleChange}\n aria-label=\"Time period\"\n sx={mergeSx(\n {\n display: 'inline-flex',\n width: 'auto',\n border: `1px solid ${borderCol}`,\n borderRadius: `${borderRadius}px`,\n overflow: 'hidden',\n bgcolor: trackBg,\n '& .MuiToggleButtonGroup-grouped': {\n border: 0,\n borderRadius: 0,\n margin: 0,\n },\n '& .MuiToggleButton-root': {\n boxSizing: 'border-box',\n width: SEGMENT_PX,\n height: SEGMENT_PX,\n minWidth: SEGMENT_PX,\n maxWidth: SEGMENT_PX,\n px: 0,\n py: 0,\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 700,\n fontSize: `${fontSize}px`,\n lineHeight: 1,\n textTransform: 'none',\n color: inactiveColor,\n bgcolor: 'transparent',\n border: 'none',\n '&:not(:first-of-type)': {\n borderLeft: `1px solid ${dividerCol}`,\n },\n '&:hover': {\n bgcolor: hoverBg,\n },\n '&.Mui-selected': {\n bgcolor: activeBg,\n color: activeColor,\n '&:hover': {\n bgcolor: activeBg,\n },\n },\n },\n },\n pf?.toggleGroupSx\n )}\n >\n {PERIODS.map(period => (\n <ToggleButton\n key={period}\n value={period}\n disableRipple\n sx={mergeSx(pf?.toggleButtonSx)}\n >\n {periodLetter(period)}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n {resolvedInfoPopover ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={mergeSx({ flexShrink: 0 }, pf?.infoStackSx)}\n >\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n {...mergedInfoButton}\n popover={resolvedInfoPopover}\n ariaLabel={mergedInfoButton.ariaLabel ?? 'Time period information'}\n />\n </Stack>\n ) : null}\n </Box>\n );\n}\n","import * as React from 'react';\nimport type { QueueTimeBreakdownCustomization } from './queueTimeBreakdown.customization.types';\n\nconst QueueTimeBreakdownCustomizationContext =\n React.createContext<QueueTimeBreakdownCustomization>({});\n\nexport type QueueTimeBreakdownCustomizationProviderProps = {\n value: QueueTimeBreakdownCustomization;\n children: React.ReactNode;\n};\n\nexport function QueueTimeBreakdownCustomizationProvider({\n value,\n children,\n}: QueueTimeBreakdownCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <QueueTimeBreakdownCustomizationContext.Provider value={memo}>\n {children}\n </QueueTimeBreakdownCustomizationContext.Provider>\n );\n}\n\nexport function useQueueTimeBreakdownCustomization(): QueueTimeBreakdownCustomization {\n return React.useContext(QueueTimeBreakdownCustomizationContext);\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * Shared Recharts `<Tooltip />` look for QueueTimeBreakdown (donut / stacked bar):\n * light panel, rounded corners — matches dashboard light tooltip reference.\n */\nexport const queueRechartsTooltipContentStyle: CSSProperties = {\n backgroundColor: '#F4F4F5',\n border: '1px solid #E4E4E7',\n borderRadius: 8,\n padding: '8px 12px',\n fontSize: 12,\n lineHeight: 1.45,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.1)',\n};\n\nexport const queueRechartsTooltipItemStyle: CSSProperties = {\n color: '#3f3f46',\n fontSize: 12,\n padding: '4px 0',\n};\n\n/** Category line when Recharts renders a label (stacked bar / donut). */\nexport const queueRechartsTooltipLabelStyleCategory: CSSProperties = {\n color: '#71717A',\n fontSize: 12,\n fontWeight: 600,\n marginBottom: 8,\n paddingBottom: 8,\n borderBottom: '1px solid #D4D4D8',\n};\n\nexport const queueRechartsTooltipLabelStyleMuted: CSSProperties = {\n color: '#71717A',\n fontSize: 12,\n fontWeight: 600,\n};\n","import type { CSSProperties } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type {\n QueueTimeAreaTooltipTheme,\n QueueTimeRechartsTooltipTheme,\n} from './queueTimeBreakdown.customization.types';\nimport {\n queueRechartsTooltipContentStyle,\n queueRechartsTooltipItemStyle,\n queueRechartsTooltipLabelStyleMuted,\n} from './queueTimeBreakdown.rechartsTooltip';\n\nexport function mergeCss(a: CSSProperties, b?: CSSProperties): CSSProperties {\n if (!b) {\n return { ...a };\n }\n return { ...a, ...b };\n}\n\nexport function mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) {\n return undefined;\n }\n if (flat.length === 1) {\n return flat[0];\n }\n return flat.flat() as SxProps<Theme>;\n}\n\nexport function mergeRechartsTooltipStyles(\n overrides?: QueueTimeRechartsTooltipTheme\n): {\n contentStyle: CSSProperties;\n itemStyle: CSSProperties;\n labelStyle: CSSProperties;\n wrapperStyle: CSSProperties;\n} {\n return {\n contentStyle: mergeCss(\n queueRechartsTooltipContentStyle,\n overrides?.contentStyle\n ),\n itemStyle: mergeCss(queueRechartsTooltipItemStyle, overrides?.itemStyle),\n labelStyle: mergeCss(\n queueRechartsTooltipLabelStyleMuted,\n overrides?.labelStyle\n ),\n wrapperStyle: mergeCss({ outline: 'none' }, overrides?.wrapperStyle),\n };\n}\n\nconst defaultAreaTooltipBase: Required<QueueTimeAreaTooltipTheme> = {\n container: {\n background: '#F4F4F5',\n border: '1px solid #E4E4E7',\n borderRadius: 8,\n width: 'max-content',\n maxWidth: 220,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.1)',\n overflow: 'hidden',\n fontSize: 11,\n fontFamily: 'inherit',\n },\n header: {\n background: '#EBEBED',\n padding: '6px 8px',\n color: '#71717A',\n fontWeight: 600,\n borderBottom: '1px solid #D4D4D8',\n },\n body: { padding: '6px 8px' },\n row: {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '3px 0',\n whiteSpace: 'nowrap',\n },\n dot: {\n width: 7,\n height: 7,\n borderRadius: '50%',\n flexShrink: 0,\n },\n label: { color: '#71717A' },\n value: { fontWeight: 600, color: '#18181B' },\n};\n\nexport function mergeAreaTooltipStyles(\n overrides?: QueueTimeAreaTooltipTheme\n): Required<QueueTimeAreaTooltipTheme> {\n return {\n container: mergeCss(defaultAreaTooltipBase.container, overrides?.container),\n header: mergeCss(defaultAreaTooltipBase.header, overrides?.header),\n body: mergeCss(defaultAreaTooltipBase.body, overrides?.body),\n row: mergeCss(defaultAreaTooltipBase.row, overrides?.row),\n dot: mergeCss(defaultAreaTooltipBase.dot, overrides?.dot),\n label: mergeCss(defaultAreaTooltipBase.label, overrides?.label),\n value: mergeCss(defaultAreaTooltipBase.value, overrides?.value),\n };\n}\n","import Box from '@mui/material/Box';\nimport * as React from 'react';\nimport type { ChartWidgetSegmentedTabsProps } from './ChartWidgetSegmentedTabs.types';\n\ntype IndicatorRect = {\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\nconst defaultIndicator: IndicatorRect = {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n};\n\n/**\n * Pill-style segmented control for chart cards (e.g. Walk-in scope tabs, billing analytics).\n *\n * **Defaults** match the classic walk-in look: grey track, **white** selected pill, dark text, light shadow.\n * Override **`trackBackgroundColor`**, **`activeTabBackground`**, **`activeTabColor`**, **`inactiveTabColor`**, and\n * **`activeTabBoxShadow`** for other themes (e.g. violet selected pill + white text, **`activeTabBoxShadow: 'none'`**).\n *\n * Use **`tabLayout=\"equalWidth\"`** when the track is full width and each tab should grow to **fill** the bar;\n * default **`intrinsic`** keeps label-sized pills aligned to the **start** (walk-in style).\n *\n * The active segment uses a **sliding pill** (animated with **`tabIndicatorTransitionMs`**).\n */\nexport const ChartWidgetSegmentedTabs = ({\n tabs,\n activeTabId,\n onTabChange,\n ariaLabel = 'Scope',\n fullWidth = true,\n tabFontSize = 14,\n rootSx,\n trackBackgroundColor = '#ECECEC',\n activeTabBackground = '#fff',\n activeTabColor = '#2a2a2a',\n inactiveTabColor = '#2a2a2a',\n activeTabBoxShadow = '0 1px 2px rgba(0,0,0,0.08)',\n tabLayout = 'intrinsic',\n activeTabFontWeight = 700,\n inactiveTabFontWeight = 600,\n tabIndicatorTransitionMs = 260,\n}: ChartWidgetSegmentedTabsProps) => {\n const trackRef = React.useRef<HTMLDivElement>(null);\n const tabRefs = React.useRef<(HTMLDivElement | null)[]>([]);\n const [indicator, setIndicator] =\n React.useState<IndicatorRect>(defaultIndicator);\n\n const activeIndex = React.useMemo(() => {\n const i = tabs.findIndex(t => t.id === activeTabId);\n return i >= 0 ? i : 0;\n }, [tabs, activeTabId]);\n\n const updateIndicator = React.useCallback(() => {\n const track = trackRef.current;\n const tabEl = tabRefs.current[activeIndex];\n if (!track || !tabEl) {\n return;\n }\n const trackRect = track.getBoundingClientRect();\n const tabRect = tabEl.getBoundingClientRect();\n setIndicator({\n left: tabRect.left - trackRect.left,\n top: tabRect.top - trackRect.top,\n width: tabRect.width,\n height: tabRect.height,\n });\n }, [activeIndex]);\n\n React.useLayoutEffect(() => {\n updateIndicator();\n }, [updateIndicator, tabs, activeTabId, tabLayout, fullWidth]);\n\n React.useLayoutEffect(() => {\n const track = trackRef.current;\n if (!track) {\n return;\n }\n const ro = new ResizeObserver(() => {\n updateIndicator();\n });\n ro.observe(track);\n return () => {\n ro.disconnect();\n };\n }, [updateIndicator]);\n\n return (\n <Box\n ref={trackRef}\n sx={{\n position: 'relative',\n display: 'flex',\n p: 0.5,\n borderRadius: 999,\n bgcolor: trackBackgroundColor,\n gap: 0.5,\n flexWrap: tabLayout === 'equalWidth' ? 'nowrap' : 'wrap',\n boxSizing: 'border-box',\n ...(fullWidth\n ? { alignSelf: 'stretch', width: '100%' }\n : {\n alignSelf: 'flex-start',\n width: 'fit-content',\n maxWidth: '100%',\n }),\n ...rootSx,\n }}\n role=\"tablist\"\n aria-label={ariaLabel}\n >\n {indicator.width > 0 ? (\n <Box\n aria-hidden\n sx={{\n position: 'absolute',\n left: indicator.left,\n top: indicator.top,\n width: indicator.width,\n height: indicator.height,\n borderRadius: 999,\n bgcolor: activeTabBackground,\n boxShadow: activeTabBoxShadow,\n transition: `left ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), top ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), width ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1), height ${tabIndicatorTransitionMs}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n ) : null}\n {tabs.map((tab, index) => {\n const selected = tab.id === activeTabId;\n return (\n <Box\n key={tab.id}\n ref={(el: HTMLDivElement | null) => {\n tabRefs.current[index] = el;\n }}\n role=\"tab\"\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n onClick={() => onTabChange(tab.id)}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onTabChange(tab.id);\n }\n }}\n sx={{\n position: 'relative',\n zIndex: 1,\n px: 2.25,\n py: 0.85,\n borderRadius: 999,\n cursor: 'pointer',\n userSelect: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n bgcolor: 'transparent',\n fontWeight: selected\n ? activeTabFontWeight\n : inactiveTabFontWeight,\n fontSize: tabFontSize,\n color: selected ? activeTabColor : inactiveTabColor,\n transition: theme =>\n theme.transitions.create(['color'], {\n duration: theme.transitions.duration.shorter,\n }),\n ...(tabLayout === 'equalWidth'\n ? {\n flex: '1 1 0',\n minWidth: 0,\n }\n : {}),\n }}\n >\n {tabLayout === 'equalWidth' ? (\n <Box\n component=\"span\"\n sx={{\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n width: '100%',\n }}\n >\n {tab.label}\n </Box>\n ) : (\n tab.label\n )}\n </Box>\n );\n })}\n </Box>\n );\n};\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport type { TypographyProps } from '@mui/material/Typography';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { ChartWidgetInfoButton } from '../../buttons/ChartWidgetInfoButton';\nimport type { KpiStatCardProps } from './KpiStatCard.types';\nimport { useAnimatedMetric } from './useAnimatedMetric';\n\nconst defaultInlineIconSize = 48;\n/** Decorative icon inside the detailed card badge (px). */\nconst defaultDetailedIconSize = 30;\n/** Width/height of the top-right icon backdrop (px). */\nconst defaultIconBackdropSize = 48;\nconst defaultIconColor = '#5c6bc0';\n\n/** @default when `metricColor` omitted */\nconst defaultMetricColor = '#000000';\n\n/** Detailed card defaults (px). */\nconst defaultCardWidthPx = 247;\nconst defaultCardPaddingPx = 12;\nconst defaultBlockGapPx = 8;\nconst defaultInlineCardMinHeightPx = 96;\nconst defaultDetailedCardMinHeightPx = 118;\n\n/** Row trend defaults (px). */\nconst defaultRowTrendFontSizePx = 12;\nconst defaultRowTrendIconSizePx = 16;\n\nfunction formatValue(value: string | number): string {\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n return value;\n}\n\ntype KpiMetricValueDisplayProps = {\n value: string | number;\n metricColor: string;\n animateValue: boolean;\n valueAnimationDurationMs: number;\n valueAnimationUseGrouping: boolean;\n valueAnimationLocale?: string;\n layout: 'inline' | 'detailed';\n valueTypographySx?: SxProps<Theme>;\n};\n\nfunction KpiMetricValueDisplay({\n value,\n metricColor,\n animateValue,\n valueAnimationDurationMs,\n valueAnimationUseGrouping,\n valueAnimationLocale,\n layout,\n valueTypographySx,\n}: KpiMetricValueDisplayProps) {\n const isNumeric = typeof value === 'number' && Number.isFinite(value);\n const animated = useAnimatedMetric(\n isNumeric ? value : 0,\n isNumeric && animateValue,\n valueAnimationDurationMs\n );\n\n const displayText =\n isNumeric && animateValue\n ? Math.round(animated).toLocaleString(valueAnimationLocale, {\n useGrouping: valueAnimationUseGrouping,\n })\n : formatValue(value);\n\n const tooltipText = formatValue(value);\n\n if (layout === 'inline') {\n return (\n <OverflowTooltipTypography\n tooltip={tooltipText}\n variant=\"h5\"\n fontWeight={700}\n lineHeight={1.2}\n sx={\n [\n { color: metricColor, width: '100%' },\n ...(valueTypographySx != null ? [valueTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {displayText}\n </OverflowTooltipTypography>\n );\n }\n\n return (\n <OverflowTooltipTypography\n tooltip={tooltipText}\n variant=\"h4\"\n fontWeight={700}\n sx={\n [\n {\n color: metricColor,\n fontSize: { xs: 26, sm: 30 },\n minWidth: 0,\n flex: '0 1 auto',\n },\n ...(valueTypographySx != null ? [valueTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {displayText}\n </OverflowTooltipTypography>\n );\n}\n\ntype OverflowTooltipTypographyProps = TypographyProps & { tooltip: string };\n\n/**\n * Shows {@link Tooltip} with full text only when the line is truncated (ellipsis).\n */\nfunction OverflowTooltipTypography({\n tooltip,\n ...typographyProps\n}: OverflowTooltipTypographyProps) {\n const ref = useRef<HTMLElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) {\n return;\n }\n const update = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth + 0.5);\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => {\n ro.disconnect();\n };\n }, [tooltip, typographyProps.children]);\n\n return (\n <Tooltip\n title={tooltip}\n disableHoverListener={!isTruncated}\n placement=\"top-start\"\n enterDelay={400}\n >\n <Typography ref={ref} noWrap {...typographyProps} />\n </Tooltip>\n );\n}\n\nexport const KpiStatCard = (props: KpiStatCardProps) => {\n const {\n title,\n value,\n icon,\n iconColor = defaultIconColor,\n sx,\n customization,\n } = props;\n const displayValue = value ?? '-';\n const labelTypographySx = customization?.labelTypographySx;\n const valueTypographySx = customization?.valueTypographySx;\n const trendComparisonTypographySx =\n customization?.trendComparisonTypographySx;\n const stackedComparisonTypographySx =\n customization?.stackedComparisonTypographySx;\n const metricColor = props.metricColor ?? defaultMetricColor;\n const animateValue = props.animateValue ?? true;\n const valueAnimationDurationMs = props.valueAnimationDurationMs ?? 1000;\n const valueAnimationUseGrouping = props.valueAnimationUseGrouping ?? true;\n const { valueAnimationLocale } = props;\n const iconSize =\n props.iconSize ??\n (props.variant === 'inline'\n ? defaultInlineIconSize\n : defaultDetailedIconSize);\n\n if (props.variant === 'inline') {\n const { cardMinHeightPx = defaultInlineCardMinHeightPx, cardMaxHeightPx } =\n props;\n return (\n <Paper\n elevation={0}\n sx={{\n p: 2,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 2,\n minHeight: cardMinHeightPx,\n ...(cardMaxHeightPx != null\n ? { maxHeight: cardMaxHeightPx, overflow: 'auto' as const }\n : {}),\n ...sx,\n }}\n >\n <Box\n sx={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Icon\n icon={icon}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n />\n </Box>\n <Stack\n spacing={0.5}\n alignItems=\"flex-start\"\n justifyContent=\"center\"\n sx={{ flex: 1, minWidth: 0 }}\n >\n <OverflowTooltipTypography\n tooltip={title}\n variant=\"subtitle2\"\n fontWeight={700}\n color=\"text.primary\"\n sx={\n [\n { width: '100%' },\n ...(labelTypographySx != null ? [labelTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </OverflowTooltipTypography>\n <KpiMetricValueDisplay\n value={displayValue}\n metricColor={metricColor}\n animateValue={animateValue}\n valueAnimationDurationMs={valueAnimationDurationMs}\n valueAnimationUseGrouping={valueAnimationUseGrouping}\n valueAnimationLocale={valueAnimationLocale}\n layout=\"inline\"\n valueTypographySx={valueTypographySx}\n />\n </Stack>\n </Paper>\n );\n }\n\n const {\n trend,\n infoPopover,\n infoPlacement = 'value',\n iconBackdropColor = '#EDE7F6',\n iconBackdropShape = 'rounded',\n trendColor,\n titleColor = 'text.secondary',\n cardWidthPx = defaultCardWidthPx,\n cardPaddingPx = defaultCardPaddingPx,\n blockGapPx = defaultBlockGapPx,\n cardMinHeightPx = defaultDetailedCardMinHeightPx,\n cardMaxHeightPx,\n iconBackdropSizePx = defaultIconBackdropSize,\n rowTrendFontSizePx = defaultRowTrendFontSizePx,\n rowTrendIconSizePx = defaultRowTrendIconSizePx,\n rowTrendComparisonColor,\n } = props;\n\n const resolvedTrendColor =\n trendColor ?? (trend?.direction === 'down' ? '#d32f2f' : '#2e7d32');\n const trendLayout = trend?.layout ?? 'row';\n const stackedHighlightColor = trend?.comparisonColor ?? '#5E35B1';\n const stackedPrefixColor = trend?.comparisonPrefixColor ?? 'text.secondary';\n const rowComparisonColor = rowTrendComparisonColor ?? 'text.secondary';\n\n const trendPercentLabel = trend?.percentLabel ?? '0%';\n const trendComparisonText = trend?.comparisonText ?? 'vs yesterday';\n const trendDirection = trend?.direction;\n\n const stackedSplit =\n trendLayout === 'stacked' &&\n typeof trend?.comparisonPrefix === 'string' &&\n trend?.comparisonPrefix.length > 0 &&\n typeof trend?.comparisonHighlight === 'string' &&\n trend?.comparisonHighlight.length > 0;\n\n const infoButton = infoPopover ? (\n <ChartWidgetInfoButton\n density=\"compact\"\n popover={infoPopover}\n ariaLabel={`${title} more information`}\n sx={{ flexShrink: 0 }}\n />\n ) : null;\n\n return (\n <Paper\n elevation={0}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n boxSizing: 'border-box',\n width: cardWidthPx,\n maxWidth: '100%',\n p: `${cardPaddingPx}px`,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n boxShadow: '0 1px 3px rgba(0,0,0,0.06)',\n position: 'relative',\n overflow: cardMaxHeightPx != null ? 'auto' : 'hidden',\n minHeight: cardMinHeightPx,\n ...(cardMaxHeightPx != null ? { maxHeight: cardMaxHeightPx } : {}),\n ...sx,\n }}\n >\n <Stack\n spacing={`${blockGapPx}px`}\n alignItems=\"stretch\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n {props.slotHeader ? (\n <Box sx={{ width: '100%' }}>{props.slotHeader}</Box>\n ) : null}\n\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Stack\n spacing={`${blockGapPx}px`}\n alignItems=\"flex-start\"\n sx={{ flex: 1, minWidth: 0, pr: 7 }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n useFlexGap\n sx={{ minWidth: 0, alignSelf: 'stretch', maxWidth: '100%' }}\n >\n <OverflowTooltipTypography\n tooltip={title}\n variant=\"body2\"\n fontWeight={600}\n sx={\n [\n {\n color: titleColor,\n minWidth: 0,\n flex: '0 1 auto',\n },\n ...(labelTypographySx != null ? [labelTypographySx] : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </OverflowTooltipTypography>\n {infoPlacement === 'title' ? infoButton : null}\n </Stack>\n\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n useFlexGap\n sx={{ minWidth: 0, alignSelf: 'stretch', maxWidth: '100%' }}\n >\n <KpiMetricValueDisplay\n value={displayValue}\n metricColor={metricColor}\n animateValue={animateValue}\n valueAnimationDurationMs={valueAnimationDurationMs}\n valueAnimationUseGrouping={valueAnimationUseGrouping}\n valueAnimationLocale={valueAnimationLocale}\n layout=\"detailed\"\n valueTypographySx={valueTypographySx}\n />\n {infoPlacement === 'value' ? infoButton : null}\n </Stack>\n\n {trendLayout === 'stacked' ? (\n stackedSplit ? (\n <Typography\n variant=\"body2\"\n component=\"div\"\n sx={\n [\n {\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Typography\n component=\"span\"\n variant=\"body2\"\n sx={\n [\n { fontWeight: 400, color: stackedPrefixColor },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonPrefix}\n </Typography>\n <Typography\n component=\"span\"\n variant=\"body2\"\n sx={\n [\n { fontWeight: 400, color: stackedHighlightColor },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonHighlight}\n </Typography>\n </Typography>\n ) : typeof trend.comparisonText === 'string' ? (\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color: trend.comparisonColor ?? 'text.secondary',\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonText}\n </Typography>\n ) : trend.comparisonText != null ? (\n <Box\n sx={\n [\n {\n typography: 'body2',\n color: trend.comparisonColor ?? 'text.secondary',\n fontWeight: 400,\n lineHeight: 1.4,\n minWidth: 0,\n alignSelf: 'stretch',\n '& strong': { fontWeight: 600 },\n },\n ...(stackedComparisonTypographySx != null\n ? [stackedComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trend.comparisonText}\n </Box>\n ) : null\n ) : (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.75}\n flexWrap=\"nowrap\"\n useFlexGap\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Typography\n component=\"span\"\n fontWeight={600}\n sx={{\n color: resolvedTrendColor,\n flexShrink: 0,\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n }}\n >\n {trendPercentLabel}\n </Typography>\n {trendDirection && (\n <Box sx={{ flexShrink: 0, lineHeight: 0, display: 'flex' }}>\n <Icon\n icon={\n trendDirection === 'down'\n ? 'mdi:trending-down'\n : 'mdi:trending-up'\n }\n width={rowTrendIconSizePx}\n height={rowTrendIconSizePx}\n style={{ color: resolvedTrendColor }}\n />\n </Box>\n )}\n {typeof trendComparisonText === 'string' ? (\n <OverflowTooltipTypography\n tooltip={trendComparisonText}\n component=\"span\"\n fontWeight={700}\n sx={\n [\n {\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n color: rowComparisonColor,\n minWidth: 0,\n flex: '1 1 auto',\n },\n ...(trendComparisonTypographySx != null\n ? [trendComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trendComparisonText}\n </OverflowTooltipTypography>\n ) : (\n <Box\n sx={\n [\n {\n fontSize: `${rowTrendFontSizePx}px`,\n lineHeight: 1.35,\n fontWeight: 700,\n color: rowComparisonColor,\n minWidth: 0,\n flex: '1 1 auto',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n '& strong': {\n fontWeight: 700,\n color: rowComparisonColor,\n fontSize: 'inherit',\n },\n },\n ...(trendComparisonTypographySx != null\n ? [trendComparisonTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {trendComparisonText}\n </Box>\n )}\n </Stack>\n )}\n </Stack>\n </Stack>\n </Stack>\n\n <Box\n sx={{\n position: 'absolute',\n top: cardPaddingPx,\n right: cardPaddingPx,\n width: iconBackdropSizePx,\n height: iconBackdropSizePx,\n borderRadius: iconBackdropShape === 'round' ? '50%' : 2,\n bgcolor: iconBackdropColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n zIndex: 1,\n }}\n >\n <Icon\n icon={icon}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n />\n </Box>\n </Paper>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * Ease-out cubic for a natural deceleration (similar to many count-up UIs).\n */\nfunction easeOutCubic(t: number): number {\n return 1 - (1 - t) ** 3;\n}\n\n/**\n * Animates a numeric metric when `target` changes. First paint uses `target` with no tween\n * (avoids flashing from 0 on mount). Opt out with `enabled: false`.\n */\nexport function useAnimatedMetric(\n target: number,\n enabled: boolean,\n durationMs: number\n): number {\n const [display, setDisplay] = useState(target);\n const displayRef = useRef(target);\n const didMountRef = useRef(false);\n const rafRef = useRef(0);\n\n useEffect(() => {\n const cancelRaf = () => {\n if (rafRef.current !== 0) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = 0;\n }\n };\n\n if (!enabled || !Number.isFinite(target)) {\n cancelRaf();\n displayRef.current = target;\n setDisplay(target);\n return;\n }\n\n if (!didMountRef.current) {\n didMountRef.current = true;\n displayRef.current = target;\n setDisplay(target);\n return;\n }\n\n const from = displayRef.current;\n if (from === target) {\n return;\n }\n\n cancelRaf();\n const start = performance.now();\n let cancelled = false;\n\n const step = (now: number) => {\n if (cancelled) {\n return;\n }\n const elapsed = now - start;\n const t = Math.min(1, elapsed / durationMs);\n const eased = easeOutCubic(t);\n const next = from + (target - from) * eased;\n displayRef.current = next;\n setDisplay(next);\n if (t < 1) {\n rafRef.current = requestAnimationFrame(step);\n } else {\n displayRef.current = target;\n setDisplay(target);\n rafRef.current = 0;\n }\n };\n\n rafRef.current = requestAnimationFrame(step);\n\n return () => {\n cancelled = true;\n cancelRaf();\n };\n }, [target, enabled, durationMs]);\n\n return display;\n}\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { JourneyStatCardProps } from './JourneyStatCard.types';\n\n/**\n * Coloured stat card used in the Customer Journey funnel strip.\n * Shows a large icon, an uppercase label, and a bold numeric value\n * on a solid background.\n *\n * Designed to sit flush inside a clipped container (borderRadius: 0 by default).\n * For standalone use, set borderRadius={2} and showOuterCard={true}.\n */\nexport function JourneyStatCard({\n icon,\n iconSize = 52,\n iconColor = '#ffffff',\n iconStyle,\n bg,\n label,\n labelColor = 'rgba(255,255,255,0.9)',\n labelFontSize = 13,\n labelFontWeight = 400,\n value,\n valueColor = '#ffffff',\n valueFontSize = 40,\n valueFontWeight = 700,\n borderRadius = 0,\n padding = '28px 20px',\n minHeight = 200,\n isLoading = false,\n showOuterCard = false,\n outerCard,\n sx,\n}: JourneyStatCardProps) {\n const resolvedSx: SxProps<Theme> = [\n {\n flex: 1,\n bgcolor: bg,\n borderRadius,\n p: padding as SxProps<Theme>,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 0,\n minWidth: 0,\n minHeight,\n boxSizing: 'border-box',\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const outerCardSx: SxProps<Theme> = [\n {\n bgcolor: outerCard?.bg ?? '#ffffff',\n border: outerCard?.border ?? '1px solid #E8E8E8',\n borderRadius: outerCard?.borderRadius ?? 2,\n p: outerCard?.padding ?? '20px',\n boxShadow: outerCard?.boxShadow ?? 'none',\n display: 'flex',\n flexDirection: 'column',\n boxSizing: 'border-box',\n },\n ...(Array.isArray(outerCard?.sx)\n ? outerCard.sx\n : outerCard?.sx\n ? [outerCard.sx]\n : []),\n ];\n\n const cardContent = isLoading ? (\n <Box sx={resolvedSx}>\n <Skeleton\n variant=\"circular\"\n width={iconSize}\n height={iconSize}\n sx={{ bgcolor: 'rgba(255,255,255,0.25)', mb: 2 }}\n />\n <Skeleton\n variant=\"text\"\n width={72}\n sx={{\n bgcolor: 'rgba(255,255,255,0.25)',\n fontSize: labelFontSize,\n mb: 0.5,\n }}\n />\n <Skeleton\n variant=\"text\"\n width={52}\n sx={{ bgcolor: 'rgba(255,255,255,0.25)', fontSize: valueFontSize }}\n />\n </Box>\n ) : (\n <Box sx={resolvedSx}>\n {/* Icon */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 0,\n flexShrink: 0,\n mb: '14px',\n }}\n >\n <Icon\n icon={icon}\n width={iconSize}\n height={iconSize}\n color={iconColor}\n style={iconStyle}\n />\n </Box>\n\n {/* Label + Value */}\n <Stack\n spacing={0}\n alignItems=\"center\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Typography\n sx={{\n fontSize: labelFontSize,\n fontWeight: labelFontWeight,\n color: labelColor,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n textAlign: 'center',\n lineHeight: 1.4,\n mb: '4px',\n }}\n >\n {label}\n </Typography>\n\n <Typography\n sx={{\n fontSize: valueFontSize,\n fontWeight: valueFontWeight,\n color: valueColor,\n lineHeight: 1.1,\n textAlign: 'center',\n }}\n >\n {typeof value === 'number' ? value.toLocaleString() : value}\n </Typography>\n </Stack>\n </Box>\n );\n\n if (showOuterCard) {\n return <Box sx={outerCardSx}>{cardContent}</Box>;\n }\n\n return cardContent;\n}\n","import Box from '@mui/material/Box';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { JourneyMetricCardProps } from './JourneyMetricCard.types';\n\n/**\n * Minimal metric card: a small label line followed by a large bold value.\n * Used inside `CustomerJourneyAnalysis` for the 2×2 conversion / average grid,\n * but works as a standalone card in any layout.\n */\nexport function JourneyMetricCard({\n label,\n labelColor = '#6B7280',\n labelFontSize = 13,\n labelFontWeight = 400,\n value,\n valueColor = '#111827',\n valueFontSize = 28,\n valueFontWeight = 700,\n textAlign = 'center',\n isLoading = false,\n sx,\n}: JourneyMetricCardProps) {\n const resolvedSx: SxProps<Theme> = [\n {\n display: 'flex',\n flexDirection: 'column',\n alignItems:\n textAlign === 'center'\n ? 'center'\n : textAlign === 'right'\n ? 'flex-end'\n : 'flex-start',\n justifyContent: 'center',\n gap: 0.5,\n p: { xs: 1.5, sm: 2 },\n minWidth: 0,\n textAlign,\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n if (isLoading) {\n return (\n <Box sx={resolvedSx}>\n <Skeleton variant=\"text\" width={120} sx={{ fontSize: labelFontSize }} />\n <Skeleton variant=\"text\" width={64} sx={{ fontSize: valueFontSize }} />\n </Box>\n );\n }\n\n return (\n <Box sx={resolvedSx}>\n <Stack\n spacing={0.5}\n alignItems=\"inherit\"\n sx={{ width: '100%', minWidth: 0 }}\n >\n <Typography\n sx={{\n fontSize: labelFontSize,\n fontWeight: labelFontWeight,\n color: labelColor,\n lineHeight: 1.3,\n }}\n >\n {label}\n </Typography>\n <Typography\n sx={{\n fontSize: valueFontSize,\n fontWeight: valueFontWeight,\n color: valueColor,\n lineHeight: 1.2,\n }}\n >\n {value}\n </Typography>\n </Stack>\n </Box>\n );\n}\n","import { Button as MuiButton, CircularProgress } from '@mui/material';\nimport type { FalconButtonProps } from './FalconButton.types';\n\nexport const FalconButton = ({\n loading = false,\n disabled,\n children,\n size = 'large',\n variant = 'contained',\n type = 'submit',\n fullWidth = true,\n className = 'falcon-btn',\n ...props\n}: FalconButtonProps) => (\n <MuiButton\n disabled={disabled || loading}\n size={size}\n variant={variant}\n type={type}\n fullWidth={fullWidth}\n className={className}\n {...props}\n >\n {loading ? <CircularProgress size={16} color=\"inherit\" /> : children}\n </MuiButton>\n);\n","import { Icon } from '@iconify/react';\nimport { Box, Card, Typography, IconButton } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport React, { useMemo, useState } from 'react';\n\nimport {\n AuditRunItem,\n FalconAuditTimelineProps,\n MonthData,\n} from './FalconAuditTimeline.types';\n\nconst defaultMonths: MonthData[] = [\n { label: 'Jan', count: 0 },\n { label: 'Feb', count: 0 },\n { label: 'Mar', count: 2 },\n { label: 'Apr', count: 2 },\n { label: 'May', count: 2 },\n { label: 'Jun', count: 2 },\n { label: 'Jul', count: 2 },\n { label: 'Aug', count: 2 },\n { label: 'Sep', count: 2 },\n { label: 'Oct', count: 2 },\n { label: 'Nov', count: 2 },\n { label: 'Dec', count: 2 },\n];\n\n/** Stable string key that uniquely identifies a month bucket. */\nconst getMonthKey = (m: MonthData) =>\n m.year !== undefined ? `${m.label}-${m.year}` : m.label;\n\nconst getOrdinalStr = (n: number) => {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n return n + (s[(v - 20) % 10] || s[v] || s[0]);\n};\n\nconst RenderIcon = ({\n icon,\n defaultIcon,\n style,\n}: {\n icon?: string | React.ReactNode;\n defaultIcon: string;\n style?: React.CSSProperties;\n}) => {\n if (!icon) return <Icon icon={defaultIcon} style={style} />;\n if (typeof icon === 'string') return <Icon icon={icon} style={style} />;\n return <>{icon}</>;\n};\n\nconst MonthButton: React.FC<{\n month: MonthData;\n isSelected: boolean;\n onClick: () => void;\n brandFont: string;\n primaryColor: string;\n inactiveMonthBg: string;\n monthFontSize: string;\n monthFontWeight: string | number;\n calendarIcon?: string | React.ReactNode;\n}> = ({\n month,\n isSelected,\n onClick,\n brandFont,\n primaryColor,\n inactiveMonthBg,\n monthFontSize,\n monthFontWeight,\n calendarIcon,\n}) => (\n <Box\n onClick={onClick}\n sx={{\n minWidth: '89px !important',\n height: '29.5px !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n gap: '6px !important',\n borderRadius: '10px !important',\n padding: '0px 12px !important',\n background: isSelected\n ? `${primaryColor} !important`\n : `${inactiveMonthBg} !important`,\n cursor: 'pointer !important',\n boxSizing: 'border-box !important',\n flexShrink: 0,\n transition: 'all 0.2s ease',\n }}\n >\n <RenderIcon\n icon={calendarIcon}\n defaultIcon=\"tabler:calendar\"\n style={{\n width: '14px',\n height: '14px',\n color: isSelected ? '#FFFFFF' : '#6B7280',\n }}\n />\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${monthFontWeight} !important`,\n fontSize: `${monthFontSize} !important`,\n lineHeight: '16.5px !important',\n letterSpacing: '0.06px !important',\n color: isSelected ? '#FFFFFF !important' : '#6B7280 !important',\n whiteSpace: 'nowrap',\n }}\n >\n {month.label}\n </Typography>\n <Box\n sx={{\n width: '19px !important',\n height: '18px !important',\n borderRadius: '4px !important',\n background: isSelected\n ? 'rgba(255, 255, 255, 0.2) !important'\n : '#FFFFFF !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n }}\n >\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${monthFontWeight} !important`,\n fontSize: '10px !important',\n lineHeight: '100% !important',\n letterSpacing: '0.17px !important',\n color: isSelected ? '#FFFFFF !important' : '#6B7280 !important',\n }}\n >\n {month.count}\n </Typography>\n </Box>\n </Box>\n);\n\nconst TimelineEventCard: React.FC<{\n date: string;\n ordinal: string;\n status: 'completed' | 'upcoming';\n onClick?: () => void;\n onExportClick?: (e: React.MouseEvent) => void;\n brandFont: string;\n interFont: string;\n completedColor: string;\n upcomingColor: string;\n eventCardBg: string;\n eventDateSize: string;\n eventDateWeight: string | number;\n ordinalSize: string;\n ordinalWeight: string | number;\n exportIcon?: string | React.ReactNode;\n exportButtonText?: string;\n upcomingButtonText?: string;\n}> = ({\n date,\n ordinal,\n status,\n onClick,\n onExportClick,\n brandFont,\n interFont,\n completedColor,\n upcomingColor,\n eventCardBg,\n eventDateSize,\n eventDateWeight,\n ordinalSize,\n ordinalWeight,\n exportIcon,\n exportButtonText = 'Export Report',\n upcomingButtonText = 'Upcoming',\n}) => (\n <Box\n onClick={onClick}\n sx={{\n width: '130px !important',\n height: '67px !important',\n display: 'flex !important',\n flexDirection: 'column !important',\n justifyContent: 'space-between !important',\n gap: '6px !important',\n borderRadius: '10px !important',\n border: '1px solid #E5E7EB !important',\n background: `${eventCardBg} !important`,\n padding: '8px 10px !important',\n boxSizing: 'border-box !important',\n flexShrink: 0,\n }}\n >\n <Box\n sx={{\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'space-between !important',\n width: '100% !important',\n }}\n >\n <Box\n sx={{\n display: 'flex !important',\n alignItems: 'center !important',\n gap: '6px !important',\n }}\n >\n <Box\n sx={{\n width: '8px !important',\n height: '8px !important',\n borderRadius: '50% !important',\n background:\n status === 'completed'\n ? `${completedColor} !important`\n : `${upcomingColor} !important`,\n }}\n />\n <Typography\n sx={{\n fontFamily: `${interFont} !important`,\n fontWeight: `${eventDateWeight} !important`,\n fontSize: `${eventDateSize} !important`,\n lineHeight: '16.5px !important',\n color: '#0A0A0A !important',\n }}\n >\n {date}\n </Typography>\n </Box>\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${ordinalWeight} !important`,\n fontSize: `${ordinalSize} !important`,\n lineHeight: '13.5px !important',\n letterSpacing: '0.17px !important',\n color: '#6B7280 !important',\n }}\n >\n {ordinal}\n </Typography>\n </Box>\n {status === 'completed' ? (\n <Box\n onClick={e => {\n if (onExportClick) {\n e.stopPropagation();\n onExportClick(e);\n }\n }}\n sx={{\n width: '100% !important',\n height: '28px !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n gap: '4px !important',\n borderRadius: '6px !important',\n border: '1px solid #D1D5DC !important',\n background: '#FFFFFF !important',\n padding: '4px 6px !important',\n boxSizing: 'border-box !important',\n cursor: 'pointer !important',\n }}\n >\n <RenderIcon\n icon={exportIcon}\n defaultIcon=\"tabler:upload\"\n style={{ width: '14px', height: '14px', color: '#222222' }}\n />\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '600 !important',\n fontSize: '10px !important',\n lineHeight: '20px !important',\n color: '#222222 !important',\n whiteSpace: 'nowrap',\n }}\n >\n {exportButtonText}\n </Typography>\n </Box>\n ) : (\n <Box\n sx={{\n width: '100% !important',\n height: '28px !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n borderRadius: '6px !important',\n border: '1px solid #EFEFEF !important',\n background: '#EFEFEF !important',\n padding: '4px 6px !important',\n boxSizing: 'border-box !important',\n }}\n >\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '600 !important',\n fontSize: '10px !important',\n lineHeight: '20px !important',\n color: '#222222 !important',\n whiteSpace: 'nowrap',\n }}\n >\n {upcomingButtonText}\n </Typography>\n </Box>\n )}\n </Box>\n);\n\nexport const FalconAuditTimeline: React.FC<FalconAuditTimelineProps> = ({\n title = 'Audit Timeline',\n months = defaultMonths,\n auditRuns,\n initialSelectedMonth = 'Mar',\n initialSelectedYear,\n onMonthChange,\n year = 2026,\n onPrevYearClick,\n onNextYearClick,\n onExportReportClick,\n emptyStateMessage = 'No Audit Scheduled',\n exportButtonText = 'Export Report',\n upcomingButtonText = 'Upcoming',\n showTitle = true,\n showYearSelector = true,\n brandFont = '\"Neue Haas Grotesk Display Pro\", Arial, sans-serif',\n interFont = '\"Inter\", Arial, sans-serif',\n headerFontSize = '20px',\n headerFontWeight = '700',\n headerColor = '#101828',\n monthFontSize = '12px',\n monthFontWeight = '600',\n eventDateSize = '11px',\n eventDateWeight = '700',\n borderRadius = '14px',\n borderWidth = '1px',\n borderColor = '#E5E7EB',\n boxShadow = 'none',\n primaryColor = '#5B21B6',\n completedColor = '#00A63E',\n upcomingColor = '#D08700',\n inactiveMonthBg = '#F3F4F6',\n eventCardBg = '#F9FAFB',\n calendarIcon,\n chevronLeftIcon,\n chevronRightIcon,\n exportIcon,\n eventsMaxHeight = '280px',\n cardMaxWidth = '1324px',\n hideScrollbar = false,\n scrollbarWidth = '6px',\n scrollbarThumbColor = '#D1D5DB',\n scrollbarTrackColor = 'transparent',\n timeControlsRowSx,\n}) => {\n const getInitialKey = () => {\n if (initialSelectedYear !== undefined) {\n const match = months.find(\n m => m.label === initialSelectedMonth && m.year === initialSelectedYear\n );\n if (match) return getMonthKey(match);\n }\n const match = months.find(m => m.label === initialSelectedMonth);\n return match\n ? getMonthKey(match)\n : getMonthKey(months[0] ?? { label: initialSelectedMonth, count: 0 });\n };\n\n const [selectedKey, setSelectedKey] = useState<string>(getInitialKey);\n\n const activeMonth = months.find(m => getMonthKey(m) === selectedKey);\n\n const handleMonthChange = (m: MonthData) => {\n const key = getMonthKey(m);\n setSelectedKey(key);\n if (onMonthChange) {\n onMonthChange(m.label, m.year);\n }\n };\n\n // Year shown in the selector: prefer the selected month's year, fall back to prop\n const displayYear = activeMonth?.year ?? year;\n\n // Audit runs for the active month\n const activeRuns: AuditRunItem[] = useMemo(() => {\n if (!auditRuns || !activeMonth) return [];\n return auditRuns.filter(\n r =>\n r.month === activeMonth.label &&\n (activeMonth.year === undefined ||\n r.year === undefined ||\n r.year === activeMonth.year)\n );\n }, [auditRuns, activeMonth]);\n\n const isZeroCount = activeMonth && activeMonth.count === 0;\n\n const renderEventCards = () => {\n if (!activeMonth || activeMonth.count === 0) {\n return (\n <Box\n sx={{\n width: '100% !important',\n maxWidth: '1292px !important',\n height: '49px !important',\n borderRadius: '10px !important',\n border: '1px solid #E5E7EB !important',\n background: `${eventCardBg} !important`,\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n padding: '8px 14px !important',\n gap: '6px !important',\n boxSizing: 'border-box !important',\n }}\n >\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '600 !important',\n fontSize: '11px !important',\n lineHeight: '13.5px !important',\n letterSpacing: '0.17px !important',\n color: '#6B7280 !important',\n }}\n >\n {emptyStateMessage}\n </Typography>\n </Box>\n );\n }\n\n // Render from real auditRuns when available\n if (auditRuns) {\n if (activeRuns.length === 0) {\n return (\n <Box\n sx={{\n width: '100% !important',\n maxWidth: '1292px !important',\n height: '49px !important',\n borderRadius: '10px !important',\n border: '1px solid #E5E7EB !important',\n background: `${eventCardBg} !important`,\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'center !important',\n padding: '8px 14px !important',\n boxSizing: 'border-box !important',\n }}\n >\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '600 !important',\n fontSize: '11px !important',\n lineHeight: '13.5px !important',\n letterSpacing: '0.17px !important',\n color: '#6B7280 !important',\n }}\n >\n {emptyStateMessage}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Box\n sx={{\n display: 'flex !important',\n alignItems: 'flex-start !important',\n gap: '8px !important',\n width: '100% !important',\n flexWrap: 'wrap',\n overflowY: 'auto',\n maxHeight: eventsMaxHeight,\n paddingRight: hideScrollbar ? 0 : '4px',\n scrollbarWidth: hideScrollbar ? 'none' : 'auto',\n '&::-webkit-scrollbar': {\n width: hideScrollbar ? 0 : scrollbarWidth,\n display: hideScrollbar ? 'none' : undefined,\n },\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: scrollbarThumbColor,\n borderRadius: '999px',\n },\n '&::-webkit-scrollbar-track': {\n backgroundColor: scrollbarTrackColor,\n },\n }}\n >\n {activeRuns.map((run, idx) => (\n <TimelineEventCard\n key={run.run_number}\n date={run.date}\n ordinal={run.label ?? getOrdinalStr(idx + 1)}\n status={run.status === 'done' ? 'completed' : 'upcoming'}\n onExportClick={\n onExportReportClick\n ? e => onExportReportClick(e, run.date)\n : undefined\n }\n brandFont={brandFont}\n interFont={interFont}\n completedColor={completedColor}\n upcomingColor={upcomingColor}\n eventCardBg={eventCardBg}\n eventDateSize={eventDateSize}\n eventDateWeight={eventDateWeight}\n ordinalSize=\"9px\"\n ordinalWeight=\"500\"\n exportIcon={exportIcon}\n exportButtonText={exportButtonText}\n upcomingButtonText={upcomingButtonText}\n />\n ))}\n </Box>\n );\n }\n\n // Legacy fallback: hardcoded two cards per month\n const monthIndex = months.findIndex(m => getMonthKey(m) === selectedKey);\n const precedingEvents = Math.max(0, monthIndex - 2) * 2;\n const isFirstActiveMonth =\n monthIndex === months.findIndex(m => m.count > 0);\n\n return (\n <Box\n sx={{\n display: 'flex !important',\n alignItems: 'center !important',\n gap: '8px !important',\n width: '100% !important',\n }}\n >\n <TimelineEventCard\n date={`${activeMonth.label} 5`}\n ordinal={getOrdinalStr(precedingEvents + 1)}\n status={isFirstActiveMonth ? 'completed' : 'upcoming'}\n onExportClick={\n onExportReportClick\n ? e => onExportReportClick(e, `${activeMonth.label} 5`)\n : undefined\n }\n brandFont={brandFont}\n interFont={interFont}\n completedColor={completedColor}\n upcomingColor={upcomingColor}\n eventCardBg={eventCardBg}\n eventDateSize={eventDateSize}\n eventDateWeight={eventDateWeight}\n ordinalSize=\"9px\"\n ordinalWeight=\"500\"\n exportIcon={exportIcon}\n exportButtonText={exportButtonText}\n upcomingButtonText={upcomingButtonText}\n />\n <TimelineEventCard\n date={`${activeMonth.label} 20`}\n ordinal={getOrdinalStr(precedingEvents + 2)}\n status=\"upcoming\"\n brandFont={brandFont}\n interFont={interFont}\n completedColor={completedColor}\n upcomingColor={upcomingColor}\n eventCardBg={eventCardBg}\n eventDateSize={eventDateSize}\n eventDateWeight={eventDateWeight}\n ordinalSize=\"9px\"\n ordinalWeight=\"500\"\n exportIcon={exportIcon}\n exportButtonText={exportButtonText}\n upcomingButtonText={upcomingButtonText}\n />\n </Box>\n );\n };\n\n return (\n <Card\n sx={{\n width: '100% !important',\n maxWidth: `${cardMaxWidth} !important`,\n height: 'auto !important',\n minHeight: isZeroCount ? '166px !important' : '200px !important',\n padding: '16px !important',\n borderRadius: `${borderRadius} !important`,\n border: `${borderWidth} solid ${borderColor} !important`,\n background: '#FFFFFF !important',\n display: 'flex !important',\n flexDirection: 'column !important',\n gap: '14px !important',\n boxShadow: `${boxShadow} !important`,\n boxSizing: 'border-box !important',\n }}\n >\n {showTitle && (\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${headerFontWeight} !important`,\n fontSize: `${headerFontSize} !important`,\n lineHeight: '27px !important',\n color: `${headerColor} !important`,\n }}\n >\n {title}\n </Typography>\n )}\n\n <Box\n sx={\n [\n {\n display: 'flex !important',\n alignItems: 'center !important',\n gap: '8px !important',\n overflowX: 'auto',\n overflowY: 'hidden',\n paddingBottom: '2px',\n },\n ...(timeControlsRowSx ? [timeControlsRowSx] : []),\n ] as SxProps<Theme>\n }\n >\n {showYearSelector && (\n <Box\n sx={{\n minWidth: '124px !important',\n height: '29px !important',\n display: 'flex !important',\n alignItems: 'center !important',\n justifyContent: 'space-between !important',\n borderRadius: '100px !important',\n background: `${primaryColor}14 !important`,\n padding: '0px 8px !important',\n boxSizing: 'border-box !important',\n flexShrink: 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={onPrevYearClick}\n sx={{ padding: '2px !important' }}\n >\n <RenderIcon\n icon={chevronLeftIcon}\n defaultIcon=\"tabler:chevron-left\"\n style={{ fontSize: '14px', color: '#0A0A0A' }}\n />\n </IconButton>\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '700 !important',\n fontSize: '11px !important',\n lineHeight: '16.5px !important',\n letterSpacing: '0.06px !important',\n color: '#0A0A0A !important',\n whiteSpace: 'nowrap',\n }}\n >\n Year {displayYear}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={onNextYearClick}\n sx={{ padding: '2px !important' }}\n >\n <RenderIcon\n icon={chevronRightIcon}\n defaultIcon=\"tabler:chevron-right\"\n style={{ fontSize: '14px', color: '#0A0A0A' }}\n />\n </IconButton>\n </Box>\n )}\n\n {months.map(month => (\n <MonthButton\n key={getMonthKey(month)}\n month={month}\n isSelected={getMonthKey(month) === selectedKey}\n onClick={() => handleMonthChange(month)}\n brandFont={brandFont}\n primaryColor={primaryColor}\n inactiveMonthBg={inactiveMonthBg}\n monthFontSize={monthFontSize}\n monthFontWeight={monthFontWeight}\n calendarIcon={calendarIcon}\n />\n ))}\n </Box>\n\n {renderEventCards()}\n </Card>\n );\n};\n","import React, { useState } from 'react';\nimport {\n Box,\n Button,\n Checkbox,\n FormControlLabel,\n Typography,\n styled,\n Paper,\n Stack,\n Popover,\n} from '@mui/material';\nimport { Icon } from '@iconify/react';\nimport { FalconExportDialogProps } from './FalconExportDialog.types';\n\n// STYLED COMPONENTS\nconst RootPaper = styled(Paper)(() => ({\n width: 600,\n minHeight: 'auto',\n height: 'auto',\n borderRadius: 16,\n padding: '30px',\n background: '#FFFFFF',\n display: 'flex',\n flexDirection: 'column',\n boxSizing: 'border-box',\n boxShadow: '0px 4px 10px rgba(0, 0, 0, 0.05)',\n justifyContent: 'flex-start',\n alignItems: 'initial',\n}));\n\nconst Title = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '30px !important',\n lineHeight: '100%',\n color: '#000000',\n textAlign: 'center',\n letterSpacing: '0%',\n marginBottom: 0,\n}));\n\nconst DateBox = styled(Box)(() => ({\n width: 259,\n height: 54,\n borderRadius: 6,\n background: '#FFFFFF',\n border: '1px solid #D6D6D6',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: '0 14px',\n boxSizing: 'border-box',\n position: 'relative',\n}));\n\nconst DateLabel = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '100%',\n color: '#8F90A6',\n letterSpacing: '0.5px',\n marginBottom: 4,\n}));\n\nconst DateValue = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '100%',\n color: '#555770',\n letterSpacing: '0.5px',\n}));\n\nconst CheckboxLabel = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '20px',\n color: '#000000',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n}));\n\nconst CloseButton = styled(Button)(() => ({\n width: 124,\n height: 42,\n borderRadius: 8,\n background: '#E0E0E0 !important',\n color: '#333333 !important',\n fontFamily: 'Roboto',\n fontWeight: '600 !important',\n fontSize: '14px !important',\n lineHeight: '20px',\n textTransform: 'none',\n padding: '10px 24px',\n boxShadow: 'none !important',\n '&:hover': {\n background: '#E0E0E0 !important',\n boxShadow: 'none !important',\n },\n}));\n\nconst ExportMainButton = styled(Button)(() => ({\n width: 402,\n height: 42,\n borderRadius: 8,\n background: '#401070 !important',\n color: '#FFFFFF !important',\n fontFamily: 'Roboto',\n fontWeight: '600 !important',\n fontSize: '14px !important',\n lineHeight: '20px',\n textTransform: 'none',\n padding: '4px 40px',\n boxShadow: 'none !important',\n '&:hover': {\n background: '#401070 !important',\n boxShadow: 'none !important',\n },\n}));\n\n// DATE PICKER STYLED COMPONENTS\nconst PickerPaper = styled(Paper)(() => ({\n width: 316.5,\n borderRadius: 5,\n padding: 24,\n background: '#FFFFFF',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0px 8px 30px rgba(0, 0, 0, 0.1)',\n boxSizing: 'border-box',\n}));\n\nconst PickerHeader = styled(Box)(() => ({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 20,\n}));\n\nconst HeaderText = styled(Typography)(() => ({\n fontFamily: '\"Neue Haas Grotesk Display Pro\", sans-serif',\n fontWeight: 700,\n fontSize: '14px',\n lineHeight: '18.36px',\n color: '#1B1B1B',\n}));\n\nconst DayLabel = styled(Typography)(() => ({\n fontFamily: '\"Neue Haas Grotesk Display Pro\", sans-serif',\n fontWeight: 600,\n fontSize: '14px',\n lineHeight: '18.36px',\n color: '#6C6C6C',\n textAlign: 'center',\n width: '100%',\n}));\n\nconst DateCell = styled(Box, {\n shouldForwardProp: prop => prop !== 'isCurrentMonth' && prop !== 'isSelected',\n})<{ isCurrentMonth?: boolean; isSelected?: boolean }>(\n ({ isCurrentMonth, isSelected }) => ({\n fontFamily: '\"Neue Haas Grotesk Display Pro\", sans-serif',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18.36px',\n color: isSelected ? '#FFFFFF' : isCurrentMonth ? '#1B1B1B' : '#C6C6C6',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n cursor: 'pointer',\n borderRadius: '50%',\n backgroundColor: isSelected ? '#401070' : 'transparent',\n '&:hover': {\n backgroundColor: isSelected ? '#401070' : '#F5F5F5',\n },\n })\n);\n\nconst PickerCancelButton = styled(Button)(() => ({\n textTransform: 'none',\n borderRadius: 4,\n height: 32,\n width: 80,\n padding: '6px 0',\n fontSize: '12px',\n fontWeight: 600,\n boxShadow: 'none !important',\n}));\n\nconst PickerApplyButton = styled(Button)(() => ({\n textTransform: 'none',\n borderRadius: 4,\n height: 32,\n width: 80,\n padding: '6px 0',\n fontSize: '12px',\n fontWeight: 600,\n boxShadow: 'none !important',\n}));\n\n// COMPONENT IMPLEMENTATION\nexport const FalconExportDialog: React.FC<FalconExportDialogProps> = ({\n title = 'Export Report',\n fromDateTitle = 'From',\n fromDateValue: initialFromDate = '',\n toDateTitle = 'To',\n toDateValue: initialToDate = '',\n onClose,\n onExport,\n exportButtonText = 'Export',\n closeButtonText = 'Close',\n initialExportCsv = true,\n initialExportPdf = false,\n calendarIcon = 'solar:calendar-bold',\n primaryColor = '#401070',\n secondaryColor = '#DFDFE0',\n titleColor = '#000000',\n brandFont = '\"Neue Haas Grotesk Display Pro\", Arial, sans-serif',\n robotoFont = '\"Roboto\", Arial, sans-serif',\n titleFontSize = '30px',\n titleFontWeight = 600,\n labelFontSize = '14px',\n labelFontWeight = 600,\n valueFontSize = '14px',\n valueFontWeight = 600,\n borderRadius = 16,\n boxShadow = '0px 4px 10px rgba(0, 0, 0, 0.05)',\n exportButtonWidth = 402,\n exportButtonHeight = 42,\n closeButtonWidth = 124,\n closeButtonHeight = 42,\n dateBoxWidth = 259,\n dateBoxHeight = 44,\n exportCsvText = 'Export CSV',\n exportPdfText = 'Export PDF',\n calendarPrimaryColor,\n calendarSelectedTextColor = '#FFFFFF',\n calendarBackgroundColor = '#FFFFFF',\n calendarHeaderColor = '#000000',\n calendarDayLabelColor = '#A5A5A5',\n calendarDateColor = '#0A0A0A',\n checkboxColor,\n exportButtonHoverBg,\n closeButtonHoverBg,\n calendarApplyButtonBg,\n calendarApplyButtonHoverBg,\n calendarCancelButtonBg = '#F3F4F6',\n calendarCancelButtonHoverBg = '#E5E7EB',\n}) => {\n const [exportCsv, setExportCsv] = useState(initialExportCsv);\n const [exportPdf, setExportPdf] = useState(initialExportPdf);\n\n const activePrimaryColor = primaryColor;\n const activeCalendarPrimary = calendarPrimaryColor || activePrimaryColor;\n const activeCheckboxColor = checkboxColor || '#7C3AED';\n const [fromDate, setFromDate] = useState(initialFromDate);\n const [toDate, setToDate] = useState(initialToDate);\n\n // Calendar View States\n const [viewMonth, setViewMonth] = useState(6);\n const [viewYear, setViewYear] = useState(2025);\n const [selectedDay, setSelectedDay] = useState<number | null>(15);\n\n const months = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n\n const handleNextMonth = () => {\n if (viewMonth === 11) {\n if (viewYear < 2050) {\n setViewMonth(0);\n setViewYear(prev => prev + 1);\n }\n } else {\n setViewMonth(prev => prev + 1);\n }\n };\n\n const handlePrevMonth = () => {\n if (viewMonth === 0) {\n if (viewYear > 2000) {\n setViewMonth(11);\n setViewYear(prev => prev - 1);\n }\n } else {\n setViewMonth(prev => prev - 1);\n }\n };\n\n const handlePrevYear = () => {\n if (viewYear > 2000) setViewYear(prev => prev - 1);\n };\n\n const handleNextYear = () => {\n if (viewYear < 2050) setViewYear(prev => prev + 1);\n };\n\n // Popover States\n const [fromAnchorEl, setFromAnchorEl] = useState<HTMLElement | null>(null);\n const [toAnchorEl, setToAnchorEl] = useState<HTMLElement | null>(null);\n\n const handleExport = () => {\n if (onExport) {\n onExport({ csv: exportCsv, pdf: exportPdf });\n }\n };\n\n const renderCalendar = (\n onCancel: () => void,\n onApply: (day: number) => void\n ) => (\n <PickerPaper sx={{ background: `${calendarBackgroundColor} !important` }}>\n <PickerHeader>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Icon\n icon=\"mdi:chevron-left\"\n width={20}\n color={activeCalendarPrimary}\n style={{ cursor: 'pointer' }}\n onClick={handlePrevMonth}\n />\n <HeaderText\n sx={{\n color: `${calendarHeaderColor} !important`,\n fontFamily: `${brandFont} !important`,\n }}\n >\n {months[viewMonth]}\n </HeaderText>\n <Icon\n icon=\"mdi:chevron-right\"\n width={20}\n color={activeCalendarPrimary}\n style={{ cursor: 'pointer' }}\n onClick={handleNextMonth}\n />\n </Stack>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Icon\n icon=\"mdi:chevron-left\"\n width={20}\n color={activeCalendarPrimary}\n style={{ cursor: 'pointer' }}\n onClick={handlePrevYear}\n />\n <HeaderText\n sx={{\n color: `${calendarHeaderColor} !important`,\n fontFamily: `${brandFont} !important`,\n }}\n >\n {viewYear}\n </HeaderText>\n <Icon\n icon=\"mdi:chevron-right\"\n width={20}\n color={activeCalendarPrimary}\n style={{ cursor: 'pointer' }}\n onClick={handleNextYear}\n />\n </Stack>\n </PickerHeader>\n\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: '4px',\n width: '100%',\n justifyItems: 'center',\n alignItems: 'center',\n }}\n >\n {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((day, index) => (\n <Box\n key={index}\n sx={{ width: '100%', display: 'flex', justifyContent: 'center' }}\n >\n <DayLabel\n sx={{\n color: `${calendarDayLabelColor} !important`,\n fontFamily: `${brandFont} !important`,\n }}\n >\n {day}\n </DayLabel>\n </Box>\n ))}\n {(() => {\n const firstDay = new Date(viewYear, viewMonth, 1).getDay();\n const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();\n const daysInPrevMonth = new Date(viewYear, viewMonth, 0).getDate();\n const days = [];\n\n // Previous month days filler\n for (let i = firstDay - 1; i >= 0; i--) {\n days.push({\n date: daysInPrevMonth - i,\n isCurrent: false,\n type: 'prev',\n });\n }\n\n // Current month days\n for (let i = 1; i <= daysInMonth; i++) {\n days.push({\n date: i,\n isCurrent: true,\n type: 'current',\n });\n }\n\n // Next month days filler to complete 35 or 42 cells\n const totalCellsNeeded = days.length > 35 ? 42 : 35;\n const remaining = totalCellsNeeded - days.length;\n for (let i = 1; i <= remaining; i++) {\n days.push({\n date: i,\n isCurrent: false,\n type: 'next',\n });\n }\n\n return days.map((dayObj, index) => {\n const isSelected = dayObj.isCurrent && dayObj.date === selectedDay;\n\n return (\n <Box\n key={index}\n sx={{\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n <DateCell\n isCurrentMonth={dayObj.isCurrent}\n isSelected={isSelected}\n sx={{\n fontFamily: `${brandFont} !important`,\n color: isSelected\n ? `${calendarSelectedTextColor} !important`\n : `${calendarDateColor} !important`,\n background: isSelected\n ? `${activeCalendarPrimary} !important`\n : 'transparent',\n opacity: dayObj.isCurrent ? 1 : 0.4,\n }}\n onClick={() => {\n if (dayObj.isCurrent) {\n setSelectedDay(dayObj.date);\n } else if (dayObj.type === 'prev') {\n handlePrevMonth();\n setSelectedDay(dayObj.date);\n } else if (dayObj.type === 'next') {\n handleNextMonth();\n setSelectedDay(dayObj.date);\n }\n }}\n >\n {dayObj.date}\n </DateCell>\n </Box>\n );\n });\n })()}\n </Box>\n\n <Stack\n direction=\"row\"\n justifyContent=\"flex-end\"\n spacing=\"12px\"\n sx={{ mt: '24px !important' }}\n >\n <PickerCancelButton\n onClick={onCancel}\n sx={{\n fontFamily: `${robotoFont} !important`,\n color: '#555770 !important',\n background: `${calendarCancelButtonBg} !important`,\n '&:hover': {\n background: `${calendarCancelButtonHoverBg} !important`,\n },\n }}\n >\n Cancel\n </PickerCancelButton>\n <PickerApplyButton\n onClick={() => selectedDay !== null && onApply(selectedDay)}\n sx={{\n fontFamily: `${robotoFont} !important`,\n background: `${calendarApplyButtonBg || activeCalendarPrimary} !important`,\n color: `${calendarSelectedTextColor} !important`,\n '&:hover': {\n background: `${calendarApplyButtonHoverBg || calendarApplyButtonBg || activeCalendarPrimary} !important`,\n },\n }}\n >\n Apply\n </PickerApplyButton>\n </Stack>\n </PickerPaper>\n );\n\n return (\n <RootPaper\n elevation={0}\n sx={{\n borderRadius:\n typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius,\n boxShadow: boxShadow,\n }}\n >\n <Title\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${titleFontWeight} !important`,\n fontSize: `${titleFontSize} !important`,\n color: `${titleColor} !important`,\n }}\n >\n {title}\n </Title>\n\n <Stack\n spacing=\"0\"\n alignItems=\"flex-start\"\n sx={{ pt: '24px', width: '100%' }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '24px',\n width: 538,\n }}\n >\n <Stack direction=\"row\" spacing=\"20px\">\n <DateBox\n onClick={e => setFromAnchorEl(e.currentTarget)}\n sx={{\n cursor: 'pointer',\n width:\n typeof dateBoxWidth === 'number'\n ? `${dateBoxWidth}px`\n : dateBoxWidth,\n height:\n typeof dateBoxHeight === 'number'\n ? `${dateBoxHeight}px`\n : dateBoxHeight,\n }}\n >\n <DateLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {fromDateTitle}\n </DateLabel>\n <DateValue\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${valueFontWeight} !important`,\n fontSize: `${valueFontSize} !important`,\n }}\n >\n {fromDate || (\n <span style={{ color: '#8F90A6', fontWeight: 500 }}>\n Select Date\n </span>\n )}\n </DateValue>\n <Box\n sx={{\n position: 'absolute',\n right: 14,\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n <Icon\n color=\"#555770\"\n height={20}\n icon={calendarIcon}\n width={18}\n />\n </Box>\n </DateBox>\n\n <DateBox\n onClick={e => setToAnchorEl(e.currentTarget)}\n sx={{\n cursor: 'pointer',\n width:\n typeof dateBoxWidth === 'number'\n ? `${dateBoxWidth}px`\n : dateBoxWidth,\n height:\n typeof dateBoxHeight === 'number'\n ? `${dateBoxHeight}px`\n : dateBoxHeight,\n }}\n >\n <DateLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {toDateTitle}\n </DateLabel>\n <DateValue\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${valueFontWeight} !important`,\n fontSize: `${valueFontSize} !important`,\n }}\n >\n {toDate || (\n <span style={{ color: '#8F90A6', fontWeight: 500 }}>\n Select Date\n </span>\n )}\n </DateValue>\n <Box\n sx={{\n position: 'absolute',\n right: 14,\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n <Icon\n color=\"#555770\"\n height={20}\n icon={calendarIcon}\n width={18}\n />\n </Box>\n </DateBox>\n </Stack>\n\n <Stack\n direction=\"row\"\n spacing=\"24px\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%' }}\n >\n <FormControlLabel\n control={\n <Checkbox\n checked={exportCsv}\n onChange={e => setExportCsv(e.target.checked)}\n sx={{\n color: '#49454F',\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n border: 'none !important',\n },\n }}\n />\n }\n label={\n <CheckboxLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {exportCsvText}{' '}\n <img src=\"/icons/csv.png\" alt=\"csv icon\" width={20} />\n </CheckboxLabel>\n }\n />\n <FormControlLabel\n control={\n <Checkbox\n checked={exportPdf}\n onChange={e => setExportPdf(e.target.checked)}\n sx={{\n color: '#49454F',\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n border: 'none !important',\n },\n }}\n />\n }\n label={\n <CheckboxLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {exportPdfText}{' '}\n <img src=\"/icons/pdf.png\" alt=\"pdf icon\" width={20} />\n </CheckboxLabel>\n }\n />\n </Stack>\n </Box>\n\n <Stack\n direction=\"row\"\n spacing=\"12px\"\n sx={{\n mt: '24px !important',\n width: '100%',\n justifyContent: 'flex-start',\n }}\n >\n <CloseButton\n onClick={onClose}\n variant=\"contained\"\n sx={{\n background: `${secondaryColor} !important`,\n fontFamily: `${robotoFont} !important`,\n width:\n typeof closeButtonWidth === 'number'\n ? `${closeButtonWidth}px`\n : closeButtonWidth,\n height:\n typeof closeButtonHeight === 'number'\n ? `${closeButtonHeight}px`\n : closeButtonHeight,\n '&:hover': {\n background: `${closeButtonHoverBg || secondaryColor} !important`,\n },\n }}\n >\n {closeButtonText}\n </CloseButton>\n <ExportMainButton\n onClick={handleExport}\n variant=\"contained\"\n sx={{\n background: `${primaryColor} !important`,\n fontFamily: `${robotoFont} !important`,\n width:\n typeof exportButtonWidth === 'number'\n ? `${exportButtonWidth}px`\n : exportButtonWidth,\n height:\n typeof exportButtonHeight === 'number'\n ? `${exportButtonHeight}px`\n : exportButtonHeight,\n '&:hover': {\n background: `${exportButtonHoverBg || primaryColor} !important`,\n },\n }}\n >\n {exportButtonText}\n </ExportMainButton>\n </Stack>\n </Stack>\n\n <Popover\n open={Boolean(fromAnchorEl)}\n anchorEl={fromAnchorEl}\n onClose={() => setFromAnchorEl(null)}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n PaperProps={{\n sx: {\n borderRadius: 5,\n boxShadow: 'none',\n background: 'transparent',\n mt: 1,\n },\n }}\n >\n {renderCalendar(\n () => setFromAnchorEl(null),\n day => {\n const newDateStr = `${day} ${months[viewMonth]} ${viewYear}`;\n if (toDate) {\n const [toDayStr, toMonthStr, toYearStr] = toDate.split(' ');\n const currentToDate = new Date(\n parseInt(toYearStr),\n months.indexOf(toMonthStr),\n parseInt(toDayStr)\n );\n const newFromDate = new Date(viewYear, viewMonth, day);\n if (newFromDate > currentToDate) {\n setToDate(newDateStr);\n }\n }\n setFromDate(newDateStr);\n setFromAnchorEl(null);\n }\n )}\n </Popover>\n\n <Popover\n open={Boolean(toAnchorEl)}\n anchorEl={toAnchorEl}\n onClose={() => setToAnchorEl(null)}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n PaperProps={{\n sx: {\n borderRadius: 5,\n boxShadow: 'none',\n background: 'transparent',\n mt: 1,\n },\n }}\n >\n {renderCalendar(\n () => setToAnchorEl(null),\n day => {\n const newDateStr = `${day} ${months[viewMonth]} ${viewYear}`;\n if (fromDate) {\n const [fromDayStr, fromMonthStr, fromYearStr] =\n fromDate.split(' ');\n const currentFromDate = new Date(\n parseInt(fromYearStr),\n months.indexOf(fromMonthStr),\n parseInt(fromDayStr)\n );\n const newToDate = new Date(viewYear, viewMonth, day);\n if (newToDate < currentFromDate) {\n setFromDate(newDateStr);\n }\n }\n setToDate(newDateStr);\n setToAnchorEl(null);\n }\n )}\n </Popover>\n </RootPaper>\n );\n};\n\nexport default FalconExportDialog;\n","import React, { useState } from 'react';\nimport {\n Box,\n Button,\n Checkbox,\n FormControlLabel,\n InputAdornment,\n TextField,\n Typography,\n styled,\n Paper,\n Stack,\n} from '@mui/material';\nimport { Icon } from '@iconify/react';\nimport {\n FalconExportReportDialogProps,\n FilterOption,\n} from './FalconExportReportDialog.types';\n\n// STYLED COMPONENTS\nconst RootPaper = styled(Paper)(() => ({\n width: 600,\n minHeight: 'auto',\n height: 'auto',\n borderRadius: 16,\n padding: '30px',\n background: '#FFFFFF',\n display: 'flex',\n flexDirection: 'column',\n boxSizing: 'border-box',\n boxShadow: '0px 4px 10px rgba(0, 0, 0, 0.05)',\n justifyContent: 'flex-start',\n alignItems: 'initial',\n}));\n\nconst Title = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '30px !important',\n lineHeight: '100%',\n color: '#000000',\n textAlign: 'center',\n letterSpacing: '0%',\n marginBottom: 0,\n}));\n\nconst CheckboxLabel = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '20px',\n color: '#000000',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n}));\n\nconst CloseButton = styled(Button)(() => ({\n width: 124,\n height: 42,\n borderRadius: 8,\n background: '#DFDFE0 !important',\n color: '#333333 !important',\n fontFamily: 'Roboto',\n fontWeight: '600 !important',\n fontSize: '14px !important',\n lineHeight: '20px',\n textTransform: 'none',\n padding: '10px 24px',\n boxShadow: 'none !important',\n '&:hover': {\n background: '#DFDFE0 !important',\n boxShadow: 'none !important',\n },\n}));\n\nconst ExportMainButton = styled(Button)(() => ({\n width: 402,\n height: 42,\n borderRadius: 8,\n background: '#401070 !important',\n color: '#FFFFFF !important',\n fontFamily: 'Roboto',\n fontWeight: '600 !important',\n fontSize: '14px !important',\n lineHeight: '20px',\n textTransform: 'none',\n padding: '4px 40px',\n boxShadow: 'none !important',\n '&:hover': {\n background: '#401070 !important',\n boxShadow: 'none !important',\n },\n}));\n\n// FILTER DROPDOWN PANEL\nconst DropdownSearchField = styled(TextField)(() => ({\n '& .MuiOutlinedInput-root': {\n height: '40px',\n borderRadius: '0',\n backgroundColor: '#FFFFFF',\n '& fieldset': { border: 'none' },\n },\n '& .MuiInputBase-input': {\n fontFamily: 'Roboto, sans-serif',\n fontWeight: 400,\n fontSize: '16px',\n lineHeight: '24px',\n letterSpacing: '0.5px',\n color: '#000000',\n padding: '0 8px',\n '&::placeholder': { color: '#8F90A6', opacity: 1 },\n },\n}));\n\nconst FilterDropdownPanel = styled(Box)(() => ({\n position: 'fixed',\n borderBottomLeftRadius: '16px',\n borderBottomRightRadius: '16px',\n backgroundColor: '#FFFFFF',\n boxShadow: '0px 4px 20px rgba(0,0,0,0.18)',\n zIndex: 1400,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n minWidth: '200px !important',\n}));\n\n// FILTER\nconst FilterContainer = styled(Box)(() => ({\n width: 538,\n display: 'flex',\n flexDirection: 'column',\n gap: 24,\n paddingTop: 0,\n}));\n\nconst FilterCard = styled(Box)(() => ({\n width: 538,\n borderRadius: 12,\n padding: 14,\n background: '#0000000A',\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n boxSizing: 'border-box',\n}));\n\nconst FilterTitle = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: '600 !important',\n fontSize: '16px !important',\n lineHeight: '20px !important',\n letterSpacing: '-0.15px !important',\n color: '#0A0A0A',\n}));\n\nconst FilterDropdownCard = styled(Box)(() => ({\n width: 160,\n height: 45,\n borderRadius: 8,\n padding: '6px 14px',\n border: '1px solid #D6D6D6',\n background: '#FFFFFF',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n boxSizing: 'border-box',\n cursor: 'pointer',\n}));\n\nconst FilterDropdownLabel = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '14px !important',\n lineHeight: '100%',\n letterSpacing: '0px',\n color: '#8F90A6',\n}));\n\nconst FilterDropdownValue = styled(Typography)(() => ({\n fontFamily: 'Neue Haas Grotesk Display Pro',\n fontWeight: 600,\n fontSize: '13px !important',\n lineHeight: '100%',\n letterSpacing: '0px',\n color: '#555770',\n}));\n\nconst DEFAULT_FILTERS: FilterOption[] = [\n {\n label: 'North',\n selected: 4,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n {\n label: 'South',\n selected: 3,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n {\n label: 'West',\n selected: 2,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n {\n label: 'East',\n selected: 0,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n {\n label: 'Central',\n selected: 1,\n stores: [\n 'All',\n 'Phenix Store',\n 'Aero Boutique',\n 'Urban Threads',\n 'Eco Essentials',\n 'Tech Haven',\n 'Culinary Delights',\n 'Home Harmony',\n 'Crafted Comforts',\n 'Gourmet Gadgets',\n ],\n },\n];\n\nexport const FalconExportReportDialog: React.FC<\n FalconExportReportDialogProps\n> = ({\n title = 'Export Report',\n onClose,\n onExport,\n filters = DEFAULT_FILTERS,\n filterStoreMapping = {},\n exportButtonText = 'Export',\n closeButtonText = 'Close',\n initialExportCsv = true,\n initialExportPdf = false,\n primaryColor = '#401070',\n secondaryColor = '#DFDFE0',\n titleColor = '#000000',\n brandFont = '\"Neue Haas Grotesk Display Pro\", Arial, sans-serif',\n robotoFont = '\"Roboto\", Arial, sans-serif',\n titleFontSize = '30px',\n titleFontWeight = 600,\n filterTitleFontSize = '16px',\n filterTitleFontWeight = 600,\n labelFontSize = '14px',\n labelFontWeight = 600,\n valueFontSize = '13px',\n valueFontWeight = 600,\n borderRadius = 16,\n boxShadow = '0px 4px 10px rgba(0, 0, 0, 0.05)',\n exportButtonWidth = 402,\n exportButtonHeight = 42,\n closeButtonWidth = 124,\n closeButtonHeight = 42,\n filterBoxWidth = 160,\n filterBoxHeight = 45,\n exportCsvText = 'Export CSV',\n exportPdfText = 'Export PDF',\n dropdownBackgroundColor = '#FFFFFF',\n dropdownTextColor = '#1C1B1F',\n dropdownItemFontFamily = '\"Roboto\", sans-serif',\n dropdownItemFontSize = '14px',\n dropdownHoverColor = '#F3F4F6',\n checkboxColor,\n exportButtonHoverBg,\n closeButtonHoverBg,\n dropdownApplyButtonBg,\n dropdownApplyButtonHoverBg,\n dropdownClearButtonBg = '#FFFFFF',\n dropdownClearButtonHoverBg = '#F9FAFB',\n}) => {\n const [exportCsv, setExportCsv] = useState(initialExportCsv);\n const [exportPdf, setExportPdf] = useState(initialExportPdf);\n\n const activePrimaryColor = primaryColor;\n const activeCheckboxColor = checkboxColor || '#7C3AED';\n\n // Filter dropdown states\n const [openFilterLabel, setOpenFilterLabel] = useState<string | null>(null);\n const [filterAnchorEl, setFilterAnchorEl] = useState<HTMLElement | null>(\n null\n );\n const [filterSearch, setFilterSearch] = useState('');\n const [filterSelections, setFilterSelections] = useState<\n Record<string, Set<string>>\n >(() => {\n const init: Record<string, Set<string>> = {};\n filters.forEach(f => {\n const stores = f.stores ?? filterStoreMapping[f.label] ?? [];\n init[f.label] = new Set(stores.slice(0, f.selected));\n });\n return init;\n });\n const [pendingFilterSelections, setPendingFilterSelections] = useState<\n Set<string>\n >(new Set());\n\n const openFilterDropdown = (label: string, el: HTMLElement) => {\n setOpenFilterLabel(label);\n setFilterAnchorEl(el);\n setFilterSearch('');\n setPendingFilterSelections(new Set(filterSelections[label] ?? []));\n };\n\n const closeFilterDropdown = () => {\n setOpenFilterLabel(null);\n setFilterAnchorEl(null);\n setFilterSearch('');\n };\n\n const togglePendingFilter = (store: string) => {\n setPendingFilterSelections(prev => {\n const next = new Set(prev);\n if (next.has(store)) {\n next.delete(store);\n } else {\n next.add(store);\n }\n return next;\n });\n };\n\n const applyFilterDropdown = () => {\n if (!openFilterLabel) return;\n setFilterSelections(prev => ({\n ...prev,\n [openFilterLabel]: new Set(pendingFilterSelections),\n }));\n closeFilterDropdown();\n };\n\n const getFilterStores = (label: string): string[] => {\n const filter = filters.find(f => f.label === label);\n return filter?.stores ?? filterStoreMapping[label] ?? [];\n };\n\n const getFilterCount = (label: string) => filterSelections[label]?.size ?? 0;\n\n const handleExport = () => {\n if (onExport) {\n onExport({ csv: exportCsv, pdf: exportPdf });\n }\n };\n\n const totalStoresSelected = filters.reduce(\n (acc, f) => acc + getFilterCount(f.label),\n 0\n );\n\n return (\n <RootPaper\n elevation={0}\n sx={{\n borderRadius:\n typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius,\n boxShadow: boxShadow,\n }}\n >\n <Title\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${titleFontWeight} !important`,\n fontSize: `${titleFontSize} !important`,\n color: `${titleColor} !important`,\n }}\n >\n {title}\n </Title>\n\n <Stack\n spacing=\"0\"\n alignItems=\"flex-start\"\n sx={{ pt: '24px', width: '100%' }}\n >\n <FilterContainer>\n <FilterCard>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <FilterTitle\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${filterTitleFontWeight} !important`,\n fontSize: `${filterTitleFontSize} !important`,\n }}\n >\n Filter\n </FilterTitle>\n <Typography\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: '400 !important',\n fontSize: '16px !important',\n lineHeight: '20px !important',\n letterSpacing: '-0.15px !important',\n color: '#515151',\n }}\n >\n {totalStoresSelected} Stores Selected\n </Typography>\n </Box>\n <Box\n sx={{\n width: '510px !important',\n margin: '0 auto',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '12px',\n justifyContent: 'flex-start',\n }}\n >\n {filters.map((filter, index) => (\n <FilterDropdownCard\n key={index}\n onClick={e =>\n openFilterDropdown(\n filter.label,\n e.currentTarget as HTMLElement\n )\n }\n sx={{\n width:\n typeof filterBoxWidth === 'number'\n ? `${filterBoxWidth}px`\n : filterBoxWidth,\n height:\n typeof filterBoxHeight === 'number'\n ? `${filterBoxHeight}px`\n : filterBoxHeight,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n }}\n >\n <FilterDropdownLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {filter.label}:\n </FilterDropdownLabel>\n <FilterDropdownValue\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${valueFontWeight} !important`,\n fontSize: `${valueFontSize} !important`,\n }}\n >\n {getFilterCount(filter.label)} selected\n </FilterDropdownValue>\n </Box>\n <Icon\n icon=\"mdi:chevron-down\"\n width={19}\n height={19}\n color=\"#555770\"\n style={{ flexShrink: 0 }}\n />\n </FilterDropdownCard>\n ))}\n\n {/* Filter Dropdown Panel */}\n {openFilterLabel &&\n filterAnchorEl &&\n (() => {\n const rect = filterAnchorEl.getBoundingClientRect();\n const allStores = getFilterStores(openFilterLabel);\n const filtered = allStores.filter(s =>\n s.toLowerCase().includes(filterSearch.toLowerCase())\n );\n return (\n <>\n <Box\n onClick={closeFilterDropdown}\n sx={{ position: 'fixed', inset: 0, zIndex: 1399 }}\n />\n <FilterDropdownPanel\n sx={{\n top: rect.bottom,\n left: rect.left,\n width: '200px !important',\n backgroundColor: `${dropdownBackgroundColor} !important`,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n borderBottom: '1px solid #E5E7EB',\n px: '12px',\n }}\n >\n <DropdownSearchField\n fullWidth\n placeholder=\"Search Store\"\n value={filterSearch}\n onChange={e => setFilterSearch(e.target.value)}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <Icon\n icon=\"tabler:search\"\n width={18}\n height={18}\n color=\"#8F90A6\"\n />\n </InputAdornment>\n ),\n }}\n />\n </Box>\n <Box\n sx={{\n maxHeight: '200px',\n overflowY: 'auto',\n '&::-webkit-scrollbar': { display: 'none' },\n msOverflowStyle: 'none',\n scrollbarWidth: 'none',\n }}\n >\n {filtered.map(store => (\n <Box\n key={store}\n onClick={() => togglePendingFilter(store)}\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n px: '16px',\n py: '8px',\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: `${dropdownHoverColor} !important`,\n },\n }}\n >\n <Checkbox\n size=\"small\"\n checked={pendingFilterSelections.has(store)}\n disableRipple\n sx={{\n p: 0,\n width: 18,\n height: 18,\n color: `${activeCheckboxColor} !important`,\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: '18px',\n border: 'none !important',\n },\n }}\n />\n <Typography\n sx={{\n fontFamily: `${dropdownItemFontFamily} !important`,\n fontWeight: 400,\n fontSize: `${dropdownItemFontSize} !important`,\n color: `${dropdownTextColor} !important`,\n }}\n >\n {store}\n </Typography>\n </Box>\n ))}\n </Box>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n px: '14px',\n py: '12px',\n borderTop: '1px solid #E5E7EB',\n }}\n >\n <Button\n onClick={() => {\n setPendingFilterSelections(new Set());\n if (openFilterLabel) {\n setFilterSelections(prev => ({\n ...prev,\n [openFilterLabel]: new Set(),\n }));\n closeFilterDropdown();\n }\n }}\n sx={{\n width: '80px',\n height: '34px',\n fontFamily: 'Roboto, sans-serif',\n fontWeight: 500,\n fontSize: '12px',\n color: '#333333',\n backgroundColor: `${dropdownClearButtonBg} !important`,\n border: '1px solid #8F90A6',\n textTransform: 'none',\n borderRadius: '4px',\n '&:hover': {\n backgroundColor: `${dropdownClearButtonHoverBg} !important`,\n },\n }}\n >\n Clear\n </Button>\n <Button\n onClick={applyFilterDropdown}\n sx={{\n width: '80px',\n height: '34px',\n fontFamily: 'Roboto, sans-serif',\n fontWeight: 500,\n fontSize: '12px',\n color: '#FFFFFF',\n backgroundColor: `${dropdownApplyButtonBg || activePrimaryColor} !important`,\n textTransform: 'none',\n borderRadius: '4px',\n '&:hover': {\n backgroundColor: `${dropdownApplyButtonHoverBg || dropdownApplyButtonBg || activePrimaryColor} !important`,\n },\n }}\n >\n Apply\n </Button>\n </Box>\n </FilterDropdownPanel>\n </>\n );\n })()}\n </Box>\n </FilterCard>\n\n <Stack\n direction=\"row\"\n spacing=\"24px\"\n justifyContent=\"flex-start\"\n sx={{ width: '100%' }}\n >\n <FormControlLabel\n control={\n <Checkbox\n checked={exportCsv}\n onChange={e => setExportCsv(e.target.checked)}\n sx={{\n color: '#49454F',\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n border: 'none !important',\n },\n }}\n />\n }\n label={\n <CheckboxLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {exportCsvText}{' '}\n <img src=\"/icons/csv.png\" alt=\"csv icon\" width={20} />\n </CheckboxLabel>\n }\n />\n <FormControlLabel\n control={\n <Checkbox\n checked={exportPdf}\n onChange={e => setExportPdf(e.target.checked)}\n sx={{\n color: '#49454F',\n '&.Mui-checked': {\n color: `${activeCheckboxColor} !important`,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n border: 'none !important',\n },\n }}\n />\n }\n label={\n <CheckboxLabel\n sx={{\n fontFamily: `${brandFont} !important`,\n fontWeight: `${labelFontWeight} !important`,\n fontSize: `${labelFontSize} !important`,\n }}\n >\n {exportPdfText}{' '}\n <img src=\"/icons/pdf.png\" alt=\"pdf icon\" width={20} />\n </CheckboxLabel>\n }\n />\n </Stack>\n </FilterContainer>\n\n <Stack\n direction=\"row\"\n spacing=\"12px\"\n sx={{\n mt: '24px !important',\n width: '100%',\n justifyContent: 'flex-start',\n }}\n >\n <CloseButton\n onClick={onClose}\n variant=\"contained\"\n sx={{\n background: `${secondaryColor} !important`,\n fontFamily: `${robotoFont} !important`,\n width:\n typeof closeButtonWidth === 'number'\n ? `${closeButtonWidth}px`\n : closeButtonWidth,\n height:\n typeof closeButtonHeight === 'number'\n ? `${closeButtonHeight}px`\n : closeButtonHeight,\n '&:hover': {\n background: `${closeButtonHoverBg || secondaryColor} !important`,\n },\n }}\n >\n {closeButtonText}\n </CloseButton>\n <ExportMainButton\n onClick={handleExport}\n variant=\"contained\"\n sx={{\n background: `${primaryColor} !important`,\n fontFamily: `${robotoFont} !important`,\n width:\n typeof exportButtonWidth === 'number'\n ? `${exportButtonWidth}px`\n : exportButtonWidth,\n height:\n typeof exportButtonHeight === 'number'\n ? `${exportButtonHeight}px`\n : exportButtonHeight,\n '&:hover': {\n background: `${exportButtonHoverBg || primaryColor} !important`,\n },\n }}\n >\n {exportButtonText}\n </ExportMainButton>\n </Stack>\n </Stack>\n </RootPaper>\n );\n};\n","import { Autocomplete, TextField } from '@mui/material';\nimport type { FalconDIstrictFilterProps } from './FalconDIstrictFilter.types';\n\n/** District filter — full implementation can be migrated from apps/docs. */\nexport const FalconDIstrictFilter = ({\n label = 'District',\n options = [],\n value = [],\n onChange,\n}: FalconDIstrictFilterProps) => (\n <Autocomplete\n multiple\n options={options}\n value={value}\n onChange={(_, newValue) => onChange?.(newValue)}\n getOptionLabel={opt =>\n typeof opt === 'object' && opt !== null ? opt.label : ''\n }\n isOptionEqualToValue={(a, b) => a.id === b.id}\n renderInput={params => (\n <TextField {...params} label={label} placeholder=\"Select districts\" />\n )}\n />\n);\n","import { Box, Typography } from '@mui/material';\nimport { Icon } from '@iconify/react';\nimport type { FalconStatBannerProps } from './FalconStatBanner.types';\n\nconst TREND_UP_COLOR = '#6D9F92';\nconst TREND_DOWN_COLOR = '#ED1C24';\n\nconst formatValue = (value: string | number): string =>\n typeof value === 'number' ? value.toLocaleString() : value;\n\nexport const FalconStatBanner = ({\n label,\n value,\n color = '#1BA9B5',\n textColor = '#fff',\n width = '100%',\n height,\n fontSize = '1rem',\n fontWeight = 600,\n trend,\n trendPlacement = 'inline',\n sx,\n className,\n}: FalconStatBannerProps) => {\n const accentColor =\n trend?.direction === 'up' ? TREND_UP_COLOR : TREND_DOWN_COLOR;\n\n const badgeBg = trend?.badgeBg ?? '#fff';\n const badgeColor = trend?.badgeColor ?? accentColor;\n const badgeIconBg = trend?.badgeIconBg ?? accentColor;\n const badgeIconColor = trend?.badgeIconColor ?? '#fff';\n\n const showTrend = Boolean(trend?.label);\n const isEnd = showTrend && trendPlacement === 'end';\n\n return (\n <Box\n className={className}\n sx={{\n width,\n bgcolor: color,\n borderRadius: '50px',\n px: 4,\n display: 'flex',\n alignItems: 'center',\n justifyContent: isEnd ? 'space-between' : 'center',\n gap: showTrend ? 2 : 0,\n ...(height ? { height } : { py: 1.5 }),\n ...sx,\n }}\n >\n <Typography\n variant=\"body1\"\n sx={{ color: textColor, fontSize, lineHeight: 1.4 }}\n >\n {label}:{' '}\n <Box component=\"span\" sx={{ fontWeight }}>\n {formatValue(value)}\n </Box>\n </Typography>\n\n {showTrend && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n bgcolor: badgeBg,\n borderRadius: '50px',\n px: 2,\n py: 0.75,\n flexShrink: 0,\n }}\n >\n <Typography\n variant=\"body2\"\n sx={{\n color: badgeColor,\n fontSize: '0.8rem',\n fontWeight: 600,\n lineHeight: 1,\n }}\n >\n {trend!.label}\n </Typography>\n <Box\n sx={{\n width: 18,\n height: 18,\n borderRadius: '50%',\n bgcolor: badgeIconBg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <Icon\n icon={\n trend!.direction === 'up' ? 'mdi:arrow-up' : 'mdi:arrow-down'\n }\n color={badgeIconColor}\n width={11}\n height={11}\n />\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import { Box, Stack } from '@mui/material';\nimport { FalconStatBanner } from './FalconStatBanner';\nimport type { FalconStatBannerGroupProps } from './FalconStatBannerGroup.types';\n\nexport const FalconStatBannerGroup = ({\n banners,\n spacing = 2,\n sx,\n}: FalconStatBannerGroupProps) => (\n <Stack direction=\"row\" spacing={spacing} sx={{ width: '100%', ...sx }}>\n {banners.map(({ width, ...bannerProps }, index) => (\n <Box\n key={index}\n sx={width ? { width, flexShrink: 0 } : { flex: 1, minWidth: 0 }}\n >\n <FalconStatBanner width=\"100%\" {...bannerProps} />\n </Box>\n ))}\n </Stack>\n);\n","import { Box, Stack, Typography, useTheme } from '@mui/material';\nimport type { FalconGrayButtonProps } from './FalconGrayButton.types';\n\nexport const FalconGrayButton = ({\n text,\n Icon,\n onClick,\n}: FalconGrayButtonProps) => {\n const theme = useTheme();\n return (\n <Box\n sx={{\n cursor: onClick ? 'pointer' : 'default',\n padding: 4,\n borderRadius: '8px',\n background: theme.palette.secondary?.light ?? '#f0f0f0',\n }}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n >\n <Stack\n direction=\"row\"\n justifyContent=\"center\"\n gap={4}\n alignItems=\"center\"\n >\n {Icon}\n <Typography fontSize={12} align=\"center\" fontWeight=\"bold\">\n {text}\n </Typography>\n </Stack>\n </Box>\n );\n};\n","import { Box, Divider, Stack } from '@mui/material';\nimport type { FalconPaginationProps } from './FalconPagination.types';\n\nconst selectStyle = {\n border: 'none',\n backgroundColor: 'transparent',\n padding: '5px 10px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#555770',\n cursor: 'pointer',\n outline: 'none',\n} as const;\n\nconst optionStyle = { padding: '5px 10px' } as const;\n\nconst btnStyle = {\n border: 'none',\n backgroundColor: 'transparent',\n padding: '5px 10px',\n cursor: 'pointer',\n outline: 'none',\n} as const;\n\nexport const FalconPagination = ({\n pageNo,\n setPageNo,\n perPage,\n setPerPage,\n totalItems,\n perPageOptions = [12, 24, 36],\n}: FalconPaginationProps) => {\n const totalPage = Math.ceil(totalItems / perPage) || 1;\n\n return (\n <Stack\n spacing={2}\n alignItems=\"center\"\n direction=\"row\"\n width=\"100%\"\n bgcolor=\"#F0F0F0\"\n >\n <Box>\n <select\n style={selectStyle}\n value={perPage}\n onChange={e => setPerPage(Number(e.target.value))}\n aria-label=\"Items per page\"\n >\n {perPageOptions.map(n => (\n <option key={n} style={optionStyle} value={n}>\n {n}\n </option>\n ))}\n </select>\n </Box>\n <Divider orientation=\"vertical\" flexItem />\n\n <Box sx={{ flex: 1 }}>\n <Box sx={{ color: '#525252', fontFamily: 'roboto' }}>\n {perPage * (pageNo - 1) + 1} -{' '}\n {Math.min(perPage * pageNo, totalItems)} of {totalItems} items\n </Box>\n </Box>\n <Divider orientation=\"vertical\" flexItem />\n\n <Stack alignItems=\"center\" direction=\"row\" gap={1}>\n <Box>\n <select\n style={selectStyle}\n value={pageNo}\n onChange={e => setPageNo(Number(e.target.value))}\n aria-label=\"Page number\"\n >\n {Array.from({ length: totalPage }, (_, i) => (\n <option key={i} style={optionStyle} value={i + 1}>\n {i + 1}\n </option>\n ))}\n </select>\n </Box>\n <Box sx={{ color: '#525252', fontFamily: 'roboto' }}>\n of {totalPage} pages\n </Box>\n </Stack>\n\n <Divider orientation=\"vertical\" flexItem />\n\n <Stack direction=\"row\" gap={1}>\n <button\n type=\"button\"\n disabled={pageNo === 1}\n onClick={() => setPageNo(pageNo - 1)}\n style={btnStyle}\n aria-label=\"Previous page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path d=\"M10 12L5 8L10 4V12Z\" fill=\"#161616\" />\n </svg>\n </button>\n <button\n type=\"button\"\n disabled={pageNo === totalPage}\n onClick={() => setPageNo(pageNo + 1)}\n style={btnStyle}\n aria-label=\"Next page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path d=\"M6 4L11 8L6 12V4Z\" fill=\"#161616\" />\n </svg>\n </button>\n </Stack>\n </Stack>\n );\n};\n","import {\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n SelectChangeEvent,\n} from '@mui/material';\nimport type { FalconSelectProps } from './FalconSelect.types';\n\nfunction normalizeOptions(\n options: string[] | { value: string; label: string }[]\n): { value: string; label: string }[] {\n return options.map(opt =>\n typeof opt === 'string' ? { value: opt.toLowerCase(), label: opt } : opt\n );\n}\n\nexport const FalconSelect = ({\n label,\n value,\n onChange,\n options,\n disabled = false,\n clearable = true,\n}: FalconSelectProps) => {\n const items = normalizeOptions(options);\n const handleChange = (event: SelectChangeEvent<string>) => {\n const v = event.target.value as string;\n onChange(v !== '' ? v : '');\n };\n\n return (\n <FormControl variant=\"filled\" fullWidth color=\"primary\">\n <InputLabel id={`falcon-select-${label}-label`}>\n Select {label} *\n </InputLabel>\n <Select\n disabled={disabled}\n value={value?.toLowerCase() ?? ''}\n label={`Select ${label}`}\n onChange={handleChange}\n labelId={`falcon-select-${label}-label`}\n id={`falcon-select-${label}`}\n >\n {clearable && (\n <MenuItem value=\"\">\n <em>--Clear--</em>\n </MenuItem>\n )}\n {items.map((item, i) => (\n <MenuItem key={i} value={item.value}>\n {item.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n","import Stack from '@mui/material/Stack';\nimport Switch from '@mui/material/Switch';\nimport { styled } from '@mui/material/styles';\nimport type { FalconSingleSwitchProps } from './FalconSingleSwitch.types';\n\nconst AntSwitch = styled(Switch)(() => ({\n width: 28,\n height: 16,\n padding: 0,\n display: 'flex',\n '&:active': {\n '& .MuiSwitch-thumb': { width: 15 },\n '& .MuiSwitch-switchBase.Mui-checked': { transform: 'translateX(9px)' },\n },\n '& .MuiSwitch-switchBase': {\n padding: 2,\n '&.Mui-checked': {\n transform: 'translateX(12px)',\n color: '#fff',\n '& + .MuiSwitch-track': { opacity: 1 },\n },\n },\n '& .MuiSwitch-thumb': {\n boxShadow: '0 2px 4px 0 rgb(0 35 11 / 20%)',\n width: 12,\n height: 12,\n borderRadius: 6,\n },\n '& .MuiSwitch-track': {\n borderRadius: 8,\n opacity: 1,\n backgroundColor: 'rgba(0,0,0,.25)',\n boxSizing: 'border-box',\n },\n}));\n\nexport const FalconSingleSwitch = ({\n color,\n setStatus,\n value = false,\n onChange,\n}: FalconSingleSwitchProps) => {\n const handleChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n checked: boolean\n ) => {\n setStatus?.(checked);\n onChange?.(event, checked);\n };\n\n return (\n <Stack direction=\"row\" margin={2} spacing={1} alignItems=\"center\">\n <AntSwitch\n checked={value}\n onChange={handleChange}\n color={color}\n size=\"medium\"\n inputProps={{ 'aria-label': 'toggle' }}\n />\n </Stack>\n );\n};\n","import { Box } from '@mui/material';\nimport { DataGrid } from '@mui/x-data-grid';\nimport { useState } from 'react';\nimport type { FalconTableProps } from './FalconTable.types';\n\nexport const FalconTable = <T extends Record<string, unknown>>({\n rows,\n getRowId,\n columns,\n pageSizeOptions = [7, 10, 25, 50],\n}: FalconTableProps<T>) => {\n const [paginationModel, setPaginationModel] = useState({\n page: 0,\n pageSize: 7,\n });\n\n return (\n <Box\n sx={{\n border: '2px solid #F2F2F2',\n padding: '16px',\n borderRadius: '12px',\n }}\n >\n <DataGrid\n autoHeight\n sx={{\n minHeight: '48px',\n '& .MuiDataGrid-columnHeaders': {\n borderBottom: '0px',\n borderRadius: '6px !important',\n },\n '& .MuiDataGrid-columnHeaderTitle': {\n color: '#7A7A7A !important',\n },\n }}\n rows={rows ?? []}\n getRowId={getRowId}\n columns={columns}\n disableRowSelectionOnClick\n pageSizeOptions={pageSizeOptions}\n paginationModel={paginationModel}\n onPaginationModelChange={setPaginationModel}\n />\n </Box>\n );\n};\n","import { Box, Typography } from '@mui/material';\nimport type { FalconTicketColumsFilterProps } from './FalconTicketColumsFilter.types';\n\n/** Column filter UI — full implementation can be migrated from apps/docs. */\nexport const FalconTicketColumsFilter = ({\n columns = [],\n selected = [],\n onSelectionChange,\n}: FalconTicketColumsFilterProps) => (\n <Box sx={{ p: 2, minWidth: 280 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n Select columns\n </Typography>\n {columns.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No columns configured. Pass columns prop.\n </Typography>\n ) : (\n <Typography variant=\"body2\">\n {selected.length} of {columns.length} selected\n </Typography>\n )}\n {onSelectionChange && (\n <Typography variant=\"caption\" display=\"block\" sx={{ mt: 1 }}>\n (Column checkboxes to be wired from app)\n </Typography>\n )}\n </Box>\n);\n","import { Button, Popover } from '@mui/material';\nimport { useState } from 'react';\nimport type { FalconTicketFilterProps } from './FalconTicketFilter.types';\n\nexport const FalconTicketFilter = ({\n children,\n label = 'FILTERS',\n open: controlledOpen,\n onOpenChange,\n}: FalconTicketFilterProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const open = controlledOpen ?? internalOpen;\n const setOpen = onOpenChange ?? setInternalOpen;\n\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n setOpen(true);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n setOpen(false);\n };\n\n return (\n <>\n <Button onClick={handleClick} variant=\"outlined\" size=\"medium\">\n {label}\n </Button>\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <div style={{ padding: 16, minWidth: 280 }}>{children}</div>\n </Popover>\n </>\n );\n};\n","import type { ChartWidgetInfoPopoverContent } from '../buttons/ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\n/**\n * Ready-made **`ChartWidgetInfoPopoverContent`** for **TimePeriodFilter** (D / W / M / Y) when you want\n * generic help — **not** tied to **QueueTimeBreakdown** or any other specific card.\n *\n * **Use this when:** you show the period control next to charts or KPIs on any page and need a short\n * explanation of what the control does and why it matters, without duplicating copy in your app.\n *\n * **What it contains (for authors / Storybook):**\n * - **`title`:** “Time period” — names the control.\n * - **`description`:** Explains that switching day / week / month / year changes grouping or how the time axis is labelled.\n * - **`helpTitle`:** “How does it help?”\n * - **`helpBullets`:** (1) Align the view with your reporting window; (2) Keep period in sync with other controls on the page.\n *\n * Pass as **`infoPopover={TIME_PERIOD_FILTER_INFO_POPOVER}`** on **TimePeriodFilter**, or use your own\n * **`ChartWidgetInfoPopoverContent`** if you need product-specific wording.\n */\nexport const TIME_PERIOD_FILTER_INFO_POPOVER: ChartWidgetInfoPopoverContent = {\n title: 'Time period',\n description:\n 'Switch between day, week, month, and year to change how data is grouped or how the time axis is labelled.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'Match the view to your reporting window (e.g. weekly reviews vs monthly rollups).',\n 'Use the same period across controls on the page so everything stays in sync.',\n ],\n};\n\n/**\n * Info copy aligned with the **QueueTimeBreakdown** composite card (header next to D/W/M/Y).\n * **QueueTimeBreakdown** uses this when **`infoPopover`** is omitted on the card.\n * Use **`TIME_PERIOD_FILTER_INFO_POPOVER`** instead when the filter is not on that card.\n */\nexport const TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN: ChartWidgetInfoPopoverContent =\n {\n title: 'Queue Time Breakdown',\n description:\n 'Shows how visitors distribute across queue-time buckets for each row, compares today vs yesterday in the donuts, and plots the trend for the selected period (day, week, month, year).',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'See which stores or zones keep people longer in each time band.',\n 'Switch D / W / M / Y to align the area chart with your reporting window.',\n 'Compare donut slices to spot day-over-day shifts in bucket mix.',\n ],\n };\n\n/** @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER}. */\nexport const CHART_PERIOD_FILTER_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER;\n\n/** @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN}. */\nexport const QUEUE_TIME_BREAKDOWN_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN;\n\n/**\n * @deprecated Use {@link TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN}.\n */\nexport const DEFAULT_QUEUE_TIME_BREAKDOWN_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN;\n","import type { HeatMapChartLegendProps } from './HeatMapChartLegend.types';\n\nexport const HeatMapChartLegend = ({\n title,\n items,\n gradientId,\n gradientStops,\n}: HeatMapChartLegendProps) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n marginBottom: '16px',\n fontFamily: 'sans-serif',\n }}\n >\n <span\n style={{\n fontSize: '12px',\n fontWeight: 700,\n color: '#374151',\n minWidth: '80px',\n textAlign: 'right',\n }}\n >\n {title}\n </span>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n flex: 1,\n maxWidth: '600px',\n }}\n >\n <svg\n width=\"100%\"\n height=\"32\"\n style={{ filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1))' }}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n {gradientStops.map((stop, index) => (\n <stop\n key={index}\n offset={stop.offset}\n stopColor={stop.color}\n stopOpacity=\"1\"\n />\n ))}\n </linearGradient>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill={`url(#${gradientId})`} />\n </svg>\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: '16px',\n paddingRight: '16px',\n }}\n >\n {items.map((item, index) => (\n <span\n key={index}\n style={{\n fontSize: '9px',\n fontWeight: 600,\n color: 'white',\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.5)',\n letterSpacing: '0.025em',\n }}\n >\n {item.label}\n </span>\n ))}\n </div>\n </div>\n </div>\n);\n","import type { ProgressBarNumberProps } from './ProgressBarNumber.types';\n\nconst FullProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeWidth={4}\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nconst HalfProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeWidth={4}\n strokeDasharray={85}\n strokeDashoffset={130}\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nconst NoProgress = ({\n number,\n numColor,\n}: Omit<ProgressBarNumberProps, 'progress'>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={56}\n height={56}\n viewBox=\"0 0 56 56\"\n fill=\"none\"\n >\n <circle\n cx={28}\n cy={28}\n r={26}\n fill=\"#D9D9D9\"\n stroke=\"#222222\"\n strokeOpacity=\"0.1\"\n strokeWidth=\"4\"\n />\n <text x={28} y={36} fontSize={24} textAnchor=\"middle\" fill={numColor}>\n {number}\n </text>\n </svg>\n);\n\nexport const ProgressBarNumber = ({\n number,\n progress,\n numColor,\n}: ProgressBarNumberProps) => {\n if (progress === 0) {\n return <NoProgress number={number} numColor={numColor} />;\n }\n if (progress === 50) {\n return <HalfProgress number={number} numColor={numColor} />;\n }\n if (progress === 100) {\n return <FullProgress number={number} numColor={numColor} />;\n }\n return <div>Invalid Progress</div>;\n};\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n LabelList,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootfallByAgeGroupsProps,\n FootfallByAgeGroupsRow,\n FootfallByAgeGroupsSeries,\n FootfallByAgeGroupsTooltipRenderContext,\n FootfallByAgeGroupsTooltipStyles,\n} from './FootfallByAgeGroups.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_BY_AGE_CHART_MARGIN = {\n top: 16,\n right: 8,\n left: 6,\n bottom: 0,\n} as const;\nconst OLY_DEFAULT_FOOTFALL_BY_AGE_STACK_TOTAL_LABEL_FILL = '#28293D' as const;\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\n/** Merge MUI \\`sx\\` with a base object (supports array / function overrides). */\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction rowTotal(\n row: FootfallByAgeGroupsRow,\n series: FootfallByAgeGroupsSeries[]\n): number {\n return series.reduce((acc, s) => {\n const v = row[s.dataKey];\n return acc + (typeof v === 'number' ? v : Number(v) || 0);\n }, 0);\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}K`;\n }\n return String(value);\n}\n\ntype SVGTextAnchor = 'inherit' | 'start' | 'middle' | 'end';\n\ntype MultiLineTickProps = {\n x?: number;\n y?: number;\n payload?: { value: string };\n angle?: number;\n dx?: number;\n style?: Record<string, string | number>;\n textAnchor?: SVGTextAnchor;\n fontSize?: number;\n};\n\nfunction MultiLineTick({\n x = 0,\n y = 0,\n payload,\n angle = -38,\n dx = 0,\n style,\n textAnchor = 'end',\n fontSize = 12,\n}: MultiLineTickProps): React.ReactElement | null {\n if (!payload?.value) return null;\n const lines = String(payload.value).split('\\n');\n const lineHeight = fontSize * 1.3;\n const isHorizontal = angle === 0;\n const anchor: SVGTextAnchor = isHorizontal ? 'middle' : textAnchor;\n const dy0 = isHorizontal ? lineHeight * 0.35 : 4;\n\n return (\n <g transform={`translate(${x + dx},${y})`}>\n <text\n transform={`rotate(${angle})`}\n textAnchor={anchor}\n fontSize={fontSize}\n fill=\"#666\"\n {...style}\n >\n {lines.map((line, i) => (\n <tspan key={i} x={0} dy={i === 0 ? dy0 : lineHeight}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n\ntype FootfallAgeTooltipProps = TooltipContentProps & {\n series: FootfallByAgeGroupsSeries[];\n categoryLabel: string;\n overallLabel: string;\n tooltipStyles?: FootfallByAgeGroupsTooltipStyles;\n};\n\nfunction FootfallAgeTooltip({\n active,\n payload,\n label,\n series,\n categoryLabel,\n overallLabel,\n tooltipStyles,\n}: FootfallAgeTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const total = payload.reduce((sum: number, entry: TooltipPayloadEntry) => {\n const v = entry.value;\n const n = typeof v === 'number' ? v : Number(v);\n return sum + (Number.isFinite(n) ? n : 0);\n }, 0);\n\n const ts = tooltipStyles;\n const sectionBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: '8px',\n };\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: 'white',\n borderRadius: '8px',\n padding: '16px',\n minWidth: '180px',\n maxWidth: '260px',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n { ...sectionBase, marginBottom: '8px' },\n ts?.sectionRow\n )}\n >\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {categoryLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {label}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {overallLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {total.toLocaleString()}\n </div>\n </div>\n {series.map((s: FootfallByAgeGroupsSeries) => {\n const entry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === s.dataKey\n );\n const raw = entry?.value;\n const value = typeof raw === 'number' ? raw : Number(raw ?? 0);\n return (\n <div style={mergeCss(sectionBase, ts?.sectionRow)} key={s.dataKey}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: s.color,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 700,\n },\n ts?.seriesName\n )}\n >\n {s.label}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {value.toLocaleString()}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/** Props passed by Recharts `LabelList` `content` renderer. */\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n index?: number;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction StackTotalLabel({\n series,\n rows,\n x,\n y,\n width,\n height,\n index,\n stackTotalFill,\n}: RechartsBarLabelListProps & {\n series: FootfallByAgeGroupsSeries[];\n rows: FootfallByAgeGroupsRow[];\n stackTotalFill: string;\n}) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n const nh = toNum(height);\n if (\n index === undefined ||\n nx === undefined ||\n ny === undefined ||\n nw === undefined ||\n nh === undefined\n ) {\n return null;\n }\n const row = rows[index];\n if (!row) return null;\n const total = rowTotal(row, series);\n const cx = nx + nw / 2;\n const cy = ny - 10;\n return (\n <text\n x={cx}\n y={cy}\n fill={stackTotalFill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(total)}\n </text>\n );\n}\n\n/**\n * Stacked bar chart for footfall (or counts) by age groups per category, with hover dimming, optional horizontal scroll, and a custom tooltip.\n */\nconst defaultMinWidthPerCategory = 56;\n/** Default Recharts \\`maxBarSize\\` cap (slimmer than category min width when bands are wide). */\nconst defaultMaxBarThickness = 36;\n/** Left/right space for Y-axis ticks and padding inside the scrollable plot. */\nconst chartWidthAxisGutter = 72;\n\nconst defaultChartMargin = OLY_DEFAULT_FOOTFALL_BY_AGE_CHART_MARGIN;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n stackTotalLabelFill: OLY_DEFAULT_FOOTFALL_BY_AGE_STACK_TOTAL_LABEL_FILL,\n} as const;\n\nexport function FootfallByAgeGroups({\n title,\n data,\n series,\n isLoading = false,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barCategoryGap: barCategoryGapProp,\n barRadius = 0,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipCategoryLabel = 'Time',\n tooltipOverallLabel = 'Overall',\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n chartMargin: chartMarginProp,\n yAxisTickDx = -8,\n yAxisTickStyle,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n dimmedStackOpacity = 0.35,\n barStackId = 'footfall-by-age-groups',\n xAxisTickAngle = 0,\n xAxisTickDx = 0,\n xAxisTickStyle,\n}: FootfallByAgeGroupsProps) {\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n\n const handleMouseEnter = React.useCallback((_: unknown, index: number) => {\n setActiveIndex(index);\n }, []);\n\n const handleMouseLeave = React.useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo(\n () => data.map(row => ({ ...row })),\n [data]\n );\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row =>\n series.some(s => {\n const raw = row[s.dataKey];\n const value =\n typeof raw === 'number'\n ? raw\n : raw === null || raw === undefined\n ? 0\n : Number(raw);\n return Number.isFinite(value) && value > 0;\n })\n ),\n [processedData, series]\n );\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n /**\n * Explicit pixel width so Recharts lays out correctly inside `overflow-x: auto` (ResponsiveContainer + % widths clip in flex/Storybook).\n * When category scroll is active: at least category minimum or the visible viewport, whichever is wider.\n */\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n // Auto-size barCategoryGap so the bar fills resolvedMaxBarSize regardless of chart width.\n // barCategoryGap = (bandSize - targetBarWidth) / 2 (single stacked bar per category)\n const resolvedBarCategoryGapPx = React.useMemo(() => {\n if (barCategoryGapProp !== undefined) return barCategoryGapProp;\n const effectiveWidth = chartWidthPx > 0 ? chartWidthPx : containerWidth;\n if (effectiveWidth <= 0) return 4;\n const n = Math.max(processedData.length, 1);\n const plotWidth = effectiveWidth - chartWidthAxisGutter;\n const bandSize = plotWidth / n;\n return Math.max(0, (bandSize - resolvedMaxBarSize) / 2);\n }, [\n barCategoryGapProp,\n chartWidthPx,\n containerWidth,\n processedData.length,\n resolvedMaxBarSize,\n ]);\n\n const barOpacity = (index: number) =>\n activeIndex === null || activeIndex === index ? 1 : dimmedStackOpacity;\n\n const lastSeriesIndex = series.length - 1;\n\n const chartMargin = React.useMemo(\n () => chartMarginProp ?? defaultChartMargin,\n [chartMarginProp]\n );\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend && !isLoading && hasMeaningfulData && series.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {series.map(s => (\n <Stack\n key={s.dataKey}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: s.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {s.legendLabel ?? s.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height=\"100%\" />\n ) : hasMeaningfulData ? (\n <BarChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n barCategoryGap={resolvedBarCategoryGapPx}\n onMouseLeave={handleMouseLeave}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n interval={0}\n height={68}\n tickMargin={10}\n tick={\n <MultiLineTick\n angle={xAxisTickAngle}\n dx={xAxisTickDx}\n style={xAxisTickStyle}\n />\n }\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n dx={yAxisTickDx}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400, ...yAxisTickStyle }}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n allowEscapeViewBox={{ x: true, y: true }}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n series,\n } satisfies FootfallByAgeGroupsTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <FootfallAgeTooltip\n {...tooltipProps}\n series={series}\n categoryLabel={tooltipCategoryLabel}\n overallLabel={tooltipOverallLabel}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n {series.map((s, i) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label}\n stackId={barStackId}\n fill={s.color}\n radius={i === lastSeriesIndex ? barRadius : 0}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`${s.dataKey}-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {i === lastSeriesIndex ? (\n <LabelList\n content={(labelProps: RechartsBarLabelListProps) => (\n <StackTotalLabel\n {...labelProps}\n series={series}\n rows={processedData}\n stackTotalFill={chartColors.stackTotalLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n ))}\n </BarChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","/** Shared max-width rules for chart cards (WalkinAnalysis-style). */\nexport type ChartCardMaxWidth =\n | number\n | string\n | {\n xs?: number | string;\n sm?: number | string;\n md?: number | string;\n };\n\nexport function resolveChartCardMaxWidth(\n cardMaxWidth: ChartCardMaxWidth | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return `${cardMaxWidth}px`;\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? `${cardMaxWidth.xs}px`\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? `${cardMaxWidth.sm}px`\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? `${cardMaxWidth.md}px`\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n","import { Icon } from '@iconify/react';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n LabelList,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootfallByGenderChartColors,\n FootfallByGenderHorizontalScroll,\n FootfallByGenderProps,\n FootfallByGenderRow,\n FootfallByGenderTooltipRenderContext,\n FootfallByGenderTooltipStyles,\n} from './FootfallByGender.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_CHART_MARGIN = {\n top: 16,\n right: 8,\n left: 4,\n bottom: 0,\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_SERIES_COLORS = {\n male: '#7266E9',\n female: '#E85D4C',\n} as const;\nconst OLY_DEFAULT_FOOTFALL_GENDER_BAR_VALUE_LABEL_FILL = '#4B5563' as const;\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nconst defaultSeriesLabels = { male: 'Male', female: 'Female' } as const;\nconst defaultSeriesColors = OLY_DEFAULT_FOOTFALL_GENDER_SERIES_COLORS;\n\nconst defaultMinWidthPerCategory = 72;\nconst defaultMaxBarThickness = 32;\nconst chartWidthAxisGutter = 88;\n\nconst defaultChartMargin = OLY_DEFAULT_FOOTFALL_GENDER_CHART_MARGIN;\n\nconst defaultChartColors: FootfallByGenderChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n barValueLabelFill: OLY_DEFAULT_FOOTFALL_GENDER_BAR_VALUE_LABEL_FILL,\n};\n\nconst topReserveForBarLabels = 58;\nconst topReserveNoBarLabels = 28;\nconst topReserveForGrowthBadges = 90;\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n index?: number;\n value?: number | string;\n}\n\nfunction toNum(v: number | string | undefined): number | undefined {\n if (v === undefined) return undefined;\n return typeof v === 'number' ? v : Number(v);\n}\n\ninterface GrowthBadgeLabelProps extends RechartsBarLabelListProps {\n rows: FootfallByGenderRow[];\n barGap: number;\n series: 'male' | 'female';\n badgeWidth?: number;\n badgeHeight?: number;\n badgeOffsetY?: number;\n}\n\nfunction GrowthBadgeLabel({\n x,\n y,\n width,\n index,\n rows,\n barGap,\n series,\n badgeWidth = 45,\n badgeHeight = 38,\n badgeOffsetY = 35,\n}: GrowthBadgeLabelProps): React.ReactElement | null {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (\n index === undefined ||\n nx === undefined ||\n ny === undefined ||\n nw === undefined\n ) {\n return null;\n }\n\n const row = rows[index];\n if (!row || !Number.isFinite(row.ffGrowthPercent)) return null;\n\n // Only render from whichever bar is taller; male wins ties.\n const maleTaller = row.male >= row.female;\n if (series === 'male' && !maleTaller) return null;\n if (series === 'female' && maleTaller) return null;\n\n const pct = row.ffGrowthPercent as number;\n const isPositive = pct >= 0;\n const color = isPositive ? '#6D9F92' : '#ED1C24';\n const iconName = isPositive ? 'mdi:arrow-up' : 'mdi:arrow-down';\n const label = `${isPositive ? '+' : ''}${pct.toFixed(1)}%`;\n\n const centerX = series === 'male' ? nx + nw + barGap / 2 : nx - barGap / 2;\n const foX = centerX - badgeWidth / 2;\n const foY = ny - badgeOffsetY - badgeHeight;\n\n return (\n <foreignObject\n x={foX}\n y={foY}\n width={badgeWidth}\n height={badgeHeight}\n style={{ overflow: 'visible' }}\n >\n <div\n {...({ xmlns: 'http://www.w3.org/1999/xhtml' } as object)}\n style={{\n width: `${badgeWidth}px`,\n height: `${badgeHeight}px`,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '2px',\n background: '#F3F4F6',\n borderRadius: '6px',\n boxShadow: '0 1px 3px rgba(0,0,0,0.08)',\n border: '1px solid #E5E7EB',\n boxSizing: 'border-box',\n padding: '3px 4px',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: color,\n flexShrink: 0,\n }}\n >\n <Icon icon={iconName} color=\"#fff\" width={8} height={8} />\n </div>\n <span\n style={{\n fontSize: '9px',\n fontWeight: 700,\n color,\n whiteSpace: 'nowrap',\n lineHeight: 1,\n }}\n >\n {label}\n </span>\n </div>\n </foreignObject>\n );\n}\n\ntype SVGTextAnchor = 'inherit' | 'start' | 'middle' | 'end';\n\ntype MultiLineTickProps = {\n x?: number;\n y?: number;\n payload?: { value: string };\n angle?: number;\n dx?: number;\n style?: Record<string, string | number>;\n textAnchor?: SVGTextAnchor;\n fontSize?: number;\n};\n\nfunction MultiLineTick({\n x = 0,\n y = 0,\n payload,\n angle = -38,\n dx = 0,\n style,\n textAnchor = 'end',\n fontSize = 12,\n}: MultiLineTickProps): React.ReactElement | null {\n if (!payload?.value) return null;\n const lines = String(payload.value).split('\\n');\n const lineHeight = fontSize * 1.3;\n const isHorizontal = angle === 0;\n const anchor: SVGTextAnchor = isHorizontal ? 'middle' : textAnchor;\n const dy0 = isHorizontal ? lineHeight * 0.35 : 4;\n\n return (\n <g transform={`translate(${x + dx},${y})`}>\n <text\n transform={`rotate(${angle})`}\n textAnchor={anchor}\n fontSize={fontSize}\n fill=\"#666\"\n {...style}\n >\n {lines.map((line, i) => (\n <tspan key={i} x={0} dy={i === 0 ? dy0 : lineHeight}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ntype GenderTooltipProps = TooltipContentProps & {\n categoryLabel: string;\n overallLabel: string;\n seriesLabels: { male: string; female: string };\n seriesColors: { male: string; female: string };\n tooltipStyles?: FootfallByGenderTooltipStyles;\n};\n\nfunction GenderTooltip({\n active,\n payload,\n label,\n categoryLabel,\n overallLabel,\n seriesLabels,\n seriesColors,\n tooltipStyles,\n}: GenderTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const maleEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === 'male'\n );\n const femaleEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === 'female'\n );\n const male = Number(maleEntry?.value ?? 0);\n const female = Number(femaleEntry?.value ?? 0);\n const total = male + female;\n\n const ts = tooltipStyles;\n const sectionBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: '8px',\n };\n\n return (\n <div\n style={mergeCss(\n {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'stretch',\n },\n ts?.wrapper\n )}\n >\n <div\n style={{\n position: 'absolute',\n left: -6,\n top: 18,\n width: 0,\n height: 0,\n borderTop: '6px solid transparent',\n borderBottom: '6px solid transparent',\n borderRight: '7px solid #fff',\n zIndex: 1,\n filter: 'drop-shadow(-1px 0 0 #E8E8E8)',\n }}\n aria-hidden\n />\n <div\n style={mergeCss(\n {\n position: 'relative',\n zIndex: 2,\n backgroundColor: 'white',\n borderRadius: '8px',\n padding: '10px 12px 10px',\n width: 'max-content',\n maxWidth: 200,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n { ...sectionBase, marginBottom: '8px' },\n ts?.sectionRow\n )}\n >\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {categoryLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {label}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.metaLabel\n )}\n >\n {overallLabel}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.metaValue\n )}\n >\n {total.toLocaleString()}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: seriesColors.male,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.seriesName\n )}\n >\n {seriesLabels.male}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {male.toLocaleString()}\n </div>\n </div>\n <div style={mergeCss(sectionBase, ts?.sectionRow)}>\n <div\n style={mergeCss(\n {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: seriesColors.female,\n },\n ts?.seriesDot\n )}\n />\n <div\n style={mergeCss(\n {\n color: '#0F0F0F',\n fontSize: '11px',\n fontWeight: 500,\n },\n ts?.seriesName\n )}\n >\n {seriesLabels.female}:{' '}\n </div>\n <div\n style={mergeCss(\n { color: '#5A5A5A', fontSize: '11px', fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {female.toLocaleString()}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction resolveCategoryScroll(\n minWidthPerCategory: number,\n horizontalScroll: FootfallByGenderHorizontalScroll,\n categoryCount: number\n): boolean {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScroll === 'off') {\n return false;\n }\n if (horizontalScroll === 'on') {\n return true;\n }\n return categoryCount > 1;\n}\n\n/**\n * Grouped bar chart: two series (male / female) per category, with hover dimming and a custom tooltip.\n */\nexport function FootfallByGender({\n title,\n data,\n isLoading = false,\n seriesLabels: seriesLabelsProp,\n seriesColors: seriesColorsProp,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barGap = 0,\n barCategoryGap: barCategoryGapProp,\n barRadius = 0,\n showLegend = true,\n showBarValueLabels = true,\n showGrowthBadges = false,\n dimmedBarOpacity = 0.3,\n hoveredBarOpacity = 0.9,\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendOverlaySx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartViewportSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipCategoryLabel = 'Region',\n tooltipOverallLabel = 'Overall Walk-ins',\n tooltipStyles,\n renderTooltip,\n chartMargin: chartMarginProp,\n yAxisTickDx = -6,\n yAxisTickStyle,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n yAxisTickFormatter,\n xAxisTickAngle = 0,\n xAxisTickDx = 0,\n xAxisTickStyle,\n barValueLabelAngle = 0,\n growthBadgeWidth = 45,\n growthBadgeHeight = 38,\n growthBadgeOffsetY = 35,\n}: FootfallByGenderProps) {\n const seriesLabels = { ...defaultSeriesLabels, ...seriesLabelsProp };\n const seriesColors = { ...defaultSeriesColors, ...seriesColorsProp };\n\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n\n const handleMouseEnter = React.useCallback((_: unknown, index: number) => {\n setActiveIndex(index);\n }, []);\n\n const handleMouseLeave = React.useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo((): FootfallByGenderRow[] => {\n return data.map(row => ({ ...row }));\n }, [data]);\n\n const hasMaleBar = React.useMemo(\n () => processedData.some(r => typeof r.male === 'number' && r.male > 0),\n [processedData]\n );\n const hasFemaleBar = React.useMemo(\n () => processedData.some(r => typeof r.female === 'number' && r.female > 0),\n [processedData]\n );\n const showMaleLegend = React.useMemo(\n () => processedData.some(r => typeof r.male === 'number'),\n [processedData]\n );\n const showFemaleLegend = React.useMemo(\n () => processedData.some(r => typeof r.female === 'number'),\n [processedData]\n );\n const visibleBarCount = (hasMaleBar ? 1 : 0) + (hasFemaleBar ? 1 : 0) || 1;\n\n const hasGrowthBadges = React.useMemo(\n () =>\n showGrowthBadges &&\n processedData.some(r => Number.isFinite(r.ffGrowthPercent)),\n [showGrowthBadges, processedData]\n );\n\n const categoryScrollActive = React.useMemo(\n () =>\n resolveCategoryScroll(\n minWidthPerCategory,\n horizontalScrollProp,\n processedData.length\n ),\n [horizontalScrollProp, minWidthPerCategory, processedData.length]\n );\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n // Recharts v2 applies barCategoryGap on BOTH sides of the band:\n // originalSize = (bandSize - 2 × barCategoryGap - barGap × (len-1)) / len\n // For bars of width `targetBarWidth` with no inner gap between Male and Female\n // we need originalSize === targetBarWidth, so:\n // barCategoryGap = (bandSize - 2 × targetBarWidth - barGap) / 2\n // For dense charts where bandSize is already small, clamp to 0.\n const targetBarWidth = maxBarSizeProp ?? defaultMaxBarThickness;\n\n const resolvedBarCategoryGapPx = React.useMemo(() => {\n const effectiveWidth = chartWidthPx > 0 ? chartWidthPx : containerWidth;\n if (effectiveWidth <= 0) return 4;\n const n = Math.max(processedData.length, 1);\n const plotWidth = effectiveWidth - chartWidthAxisGutter;\n const bandSize = plotWidth / n;\n const gapBetweenBars = visibleBarCount > 1 ? barGap : 0;\n return Math.max(\n 0,\n (bandSize - targetBarWidth * visibleBarCount - gapBetweenBars) / 2\n );\n }, [\n processedData.length,\n chartWidthPx,\n containerWidth,\n barGap,\n targetBarWidth,\n visibleBarCount,\n ]);\n\n // maxBarSize must be ≥ targetBarWidth so it doesn't cause Recharts to\n // center each bar inside its originalSize slot (which creates a visible gap).\n const resolvedMaxBarSize = targetBarWidth;\n\n const chartMargin = React.useMemo(() => {\n let top: number;\n if (hasGrowthBadges) top = topReserveForGrowthBadges;\n else if (showBarValueLabels) top = topReserveForBarLabels;\n else top = topReserveNoBarLabels;\n if (chartMarginProp) return chartMarginProp;\n return { ...defaultChartMargin, top };\n }, [hasGrowthBadges, showBarValueLabels, chartMarginProp]);\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const yAxisTick = yAxisTickFormatter ?? formatYAxisTickDefault;\n\n const barOpacity = (index: number) =>\n activeIndex === null || activeIndex === index\n ? hoveredBarOpacity\n : dimmedBarOpacity;\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n },\n chartViewportSx\n )}\n >\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n height: '100%',\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height=\"100%\" />\n ) : processedData.length > 0 ? (\n <BarChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n barGap={barGap}\n barCategoryGap={barCategoryGapProp ?? resolvedBarCategoryGapPx}\n maxBarSize={resolvedMaxBarSize}\n onMouseLeave={handleMouseLeave}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n interval={0}\n height={68}\n tickMargin={10}\n tick={\n <MultiLineTick\n angle={xAxisTickAngle}\n dx={xAxisTickDx}\n style={xAxisTickStyle}\n />\n }\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n width={52}\n dx={yAxisTickDx}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400, ...yAxisTickStyle }}\n tickFormatter={yAxisTick}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n allowEscapeViewBox={{ x: true, y: true }}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n } satisfies FootfallByGenderTooltipRenderContext);\n return customTooltip == null ? null : (\n <>{customTooltip}</>\n );\n }\n return (\n <GenderTooltip\n {...tooltipProps}\n categoryLabel={tooltipCategoryLabel}\n overallLabel={tooltipOverallLabel}\n seriesLabels={seriesLabels}\n seriesColors={seriesColors}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n {hasMaleBar ? (\n <Bar\n dataKey=\"male\"\n name={seriesLabels.male}\n fill={seriesColors.male}\n barSize={resolvedMaxBarSize}\n radius={barRadius}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`m-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n dataKey=\"male\"\n position=\"top\"\n offset={10}\n fill={chartColors.barValueLabelFill}\n fontSize={12}\n fontWeight={500}\n angle={barValueLabelAngle}\n formatter={label => formatBarLabel(Number(label))}\n />\n ) : null}\n {hasGrowthBadges ? (\n <LabelList\n dataKey=\"male\"\n content={labelProps => (\n <GrowthBadgeLabel\n {...(labelProps as RechartsBarLabelListProps)}\n rows={processedData}\n barGap={barGap}\n series=\"male\"\n badgeWidth={growthBadgeWidth}\n badgeHeight={growthBadgeHeight}\n badgeOffsetY={growthBadgeOffsetY}\n />\n )}\n />\n ) : null}\n </Bar>\n ) : null}\n {hasFemaleBar ? (\n <Bar\n dataKey=\"female\"\n name={seriesLabels.female}\n fill={seriesColors.female}\n barSize={resolvedMaxBarSize}\n radius={barRadius}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {processedData.map((row, index) => (\n <Cell\n key={`f-${row.name}-${index}`}\n fillOpacity={barOpacity(index)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n dataKey=\"female\"\n position=\"top\"\n offset={10}\n fill={chartColors.barValueLabelFill}\n fontSize={12}\n fontWeight={500}\n angle={barValueLabelAngle}\n formatter={label => formatBarLabel(Number(label))}\n />\n ) : null}\n {hasGrowthBadges ? (\n <LabelList\n dataKey=\"female\"\n content={labelProps => (\n <GrowthBadgeLabel\n {...(labelProps as RechartsBarLabelListProps)}\n rows={processedData}\n barGap={barGap}\n series=\"female\"\n badgeWidth={growthBadgeWidth}\n badgeHeight={growthBadgeHeight}\n badgeOffsetY={growthBadgeOffsetY}\n />\n )}\n />\n ) : null}\n </Bar>\n ) : null}\n </BarChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n {showLegend && !isLoading && processedData.length > 0 ? (\n <Box\n component=\"ul\"\n sx={sxChain(\n {\n position: 'absolute',\n top: 6,\n right: 10,\n zIndex: 2,\n listStyle: 'none',\n m: 0,\n p: 0,\n pl: 1,\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n pointerEvents: 'none',\n },\n legendOverlaySx\n )}\n >\n {showMaleLegend ? (\n <Box\n component=\"li\"\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n },\n legendItemSx\n )}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n borderRadius: '3px',\n bgcolor: seriesColors.male,\n flexShrink: 0,\n },\n legendSwatchSx\n )}\n />\n <Typography\n component=\"span\"\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {seriesLabels.male}\n </Typography>\n </Box>\n ) : null}\n {showFemaleLegend ? (\n <Box\n component=\"li\"\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n },\n legendItemSx\n )}\n >\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n borderRadius: '3px',\n bgcolor: seriesColors.female,\n flexShrink: 0,\n },\n legendSwatchSx\n )}\n />\n <Typography\n component=\"span\"\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {seriesLabels.female}\n </Typography>\n </Box>\n ) : null}\n </Box>\n ) : null}\n </Box>\n </Stack>\n </Box>\n );\n}\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n CartesianGrid,\n Cell,\n ComposedChart,\n LabelList,\n Line,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { useChartPlotScrollToEnd } from '../../_chart/useChartPlotScrollToEnd';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n PasserbyConversionChartColors,\n PasserbyConversionProps,\n PasserbyConversionRow,\n PasserbyConversionTooltipRenderContext,\n PasserbyConversionTooltipStyles,\n} from './PasserbyConversion.types';\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_PASSERBY_CHART_MARGIN = {\n top: 16,\n right: 8,\n left: 6,\n bottom: 0,\n} as const;\nconst OLY_DEFAULT_PASSERBY_CHART_SERIES_COLORS = {\n passerbyBarFill: '#FFCC4D',\n walkInsBarFill: '#008099',\n conversionLineStroke: '#6B4C84',\n barValueLabelFill: '#374151',\n} as const;\n\nconst PASSERBY_KEY = 'passerby';\nconst WALKINS_KEY = 'walkIns';\nconst CONVERSION_KEY = 'conversion';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\ntype SVGTextAnchor = 'inherit' | 'start' | 'middle' | 'end';\n\ntype MultiLineTickProps = {\n x?: number;\n y?: number;\n payload?: { value: string };\n angle?: number;\n dx?: number;\n style?: Record<string, string | number>;\n textAnchor?: SVGTextAnchor;\n fontSize?: number;\n};\n\nfunction MultiLineTick({\n x = 0,\n y = 0,\n payload,\n angle = -42,\n dx = 0,\n style,\n textAnchor = 'end',\n fontSize = 12,\n}: MultiLineTickProps): React.ReactElement | null {\n if (!payload?.value) return null;\n const lines = String(payload.value).split('\\n');\n const lineHeight = fontSize * 1.3;\n const isHorizontal = angle === 0;\n const anchor: SVGTextAnchor = isHorizontal ? 'middle' : textAnchor;\n const dy0 = isHorizontal ? lineHeight * 0.35 : 4;\n\n return (\n <g transform={`translate(${x + dx},${y})`}>\n <text\n transform={`rotate(${angle})`}\n textAnchor={anchor}\n fontSize={fontSize}\n fill=\"#666\"\n {...style}\n >\n {lines.map((line, i) => (\n <tspan key={i} x={0} dy={i === 0 ? dy0 : lineHeight}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction BarTopLabel({\n x,\n y,\n width,\n value,\n fill,\n}: RechartsBarLabelListProps & { fill: string }) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 10;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(n)}\n </text>\n );\n}\n\nfunction tooltipDatumFromPayload(\n payload: TooltipContentProps['payload']\n): PasserbyConversionRow | undefined {\n const raw = payload?.[0]?.payload;\n if (\n raw &&\n typeof raw === 'object' &&\n PASSERBY_KEY in raw &&\n WALKINS_KEY in raw\n ) {\n return raw as PasserbyConversionRow;\n }\n return undefined;\n}\n\ntype ConversionTooltipProps = TooltipContentProps & {\n timeLabel: string;\n overallLabel: string;\n walkInsLabel: string;\n passerbyLabel: string;\n conversionLabel: string;\n formatConversion: (value: number) => string;\n colors: { walkIns: string; passerby: string; conversion: string };\n showConversionRow: boolean;\n tooltipStyles?: PasserbyConversionTooltipStyles;\n};\n\nfunction ConversionTooltip({\n active,\n payload,\n label,\n timeLabel,\n overallLabel,\n walkInsLabel,\n passerbyLabel,\n conversionLabel,\n formatConversion,\n colors,\n showConversionRow,\n tooltipStyles,\n}: ConversionTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const datum = tooltipDatumFromPayload(payload);\n const passerbyEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === PASSERBY_KEY\n );\n const walkEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === WALKINS_KEY\n );\n const passerby = Number(passerbyEntry?.value ?? 0);\n const walkIns = Number(walkEntry?.value ?? 0);\n const overall = passerby + walkIns;\n\n const timeDisplay =\n datum?.timeSlotLabel !== undefined && datum.timeSlotLabel !== ''\n ? datum.timeSlotLabel\n : String(label);\n\n const convRaw = datum?.conversion;\n const conversion =\n typeof convRaw === 'number' && Number.isFinite(convRaw) ? convRaw : NaN;\n const showConv = showConversionRow && Number.isFinite(conversion);\n\n const ts = tooltipStyles;\n const rowBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 6,\n rowGap: 2,\n marginBottom: 8,\n };\n const labelStyle = mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 700 },\n ts?.label\n );\n const valueStyle = mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.value\n );\n const dotBase = mergeCss(\n {\n width: 10,\n height: 10,\n borderRadius: '50%',\n flexShrink: 0,\n },\n ts?.seriesDot\n );\n\n return (\n <div\n style={mergeCss(\n {\n backgroundColor: '#fff',\n borderRadius: 8,\n padding: '12px 14px',\n width: 'max-content',\n maxWidth: 220,\n minWidth: 0,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{timeLabel}:</span>\n <span style={valueStyle}>{timeDisplay}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{overallLabel}:</span>\n <span style={valueStyle}>{overall.toLocaleString()}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.walkIns })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {walkInsLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {walkIns.toLocaleString()}\n </span>\n </div>\n <div\n style={mergeCss(\n { ...rowBase, marginBottom: showConv ? 8 : 0 },\n ts?.row\n )}\n >\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.passerby })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {passerbyLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {passerby.toLocaleString()}\n </span>\n </div>\n {showConv ? (\n <div style={mergeCss({ ...rowBase, marginBottom: 0 }, ts?.row)}>\n <span\n style={mergeCss({ ...dotBase, backgroundColor: colors.conversion })}\n />\n <span\n style={mergeCss(\n { color: '#0F0F0F', fontSize: 11, fontWeight: 500 },\n ts?.seriesName\n )}\n >\n {conversionLabel}:\n </span>\n <span\n style={mergeCss(\n { color: '#5A5A5A', fontSize: 11, fontWeight: 400 },\n ts?.seriesValue\n )}\n >\n {formatConversion(conversion)}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst defaultMinWidthPerCategory = 56;\nconst defaultMaxBarThickness = 28;\nconst chartWidthAxisGutter = 108;\n\nconst defaultChartMargin = OLY_DEFAULT_PASSERBY_CHART_MARGIN;\n\nconst topReserveForBarLabels = 52;\nconst topReserveNoBarLabels = 22;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n ...OLY_DEFAULT_PASSERBY_CHART_SERIES_COLORS,\n} as const;\n\nfunction defaultFormatTooltipConversion(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nexport function PasserbyConversion({\n title,\n data,\n isLoading = false,\n timeSlots,\n fillMissingTimeSlots = true,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n passerbySeriesName = 'Passerby',\n walkInsSeriesName = 'Walk-ins',\n conversionSeriesName = 'Conversion',\n lineType = 'natural',\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barGap = 0,\n barCategoryGap: barCategoryGapProp,\n barRadius = [2, 2, 0, 0],\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipTimeLabel = 'Time',\n tooltipOverallLabel = 'Overall',\n tooltipWalkInsLabel,\n tooltipPasserbyLabel,\n tooltipConversionLabel = 'Conversion(%)',\n formatTooltipConversion = defaultFormatTooltipConversion,\n conversionAxisLabel,\n yAxisTickFormatter,\n conversionAxisTickFormatter,\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n showConversionLine: showConversionLineProp,\n showBarValueLabels = true,\n chartMargin: chartMarginProp,\n yAxisTickDx = -8,\n yAxisTickStyle,\n conversionAxisTickDx = 0,\n conversionAxisTickStyle,\n rightYAxisTickDx,\n rightYAxisTickStyle,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n scrollChartToEndOnDataChange = true,\n xAxisTickAngle = 0,\n xAxisTickDx = 0,\n xAxisTickStyle,\n}: PasserbyConversionProps) {\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n\n const handleBarMouseEnter = React.useCallback((_: unknown, index: number) => {\n setActiveIndex(index);\n }, []);\n\n const handleChartMouseLeave = React.useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n const processedData = React.useMemo(() => {\n const clone = data.map(row => ({ ...row }));\n if (!timeSlots || !fillMissingTimeSlots) {\n return clone;\n }\n const byName = new Map(clone.map(r => [r.name, r] as const));\n return timeSlots.map(slot => {\n const existing = byName.get(slot.name);\n if (existing) return existing;\n return {\n name: slot.name,\n timeSlotLabel: slot.timeSlotLabel ?? slot.name,\n passerby: 0,\n walkIns: 0,\n conversion: null,\n };\n });\n }, [data, timeSlots, fillMissingTimeSlots]);\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row => {\n const conversionValue =\n typeof row.conversion === 'number' && Number.isFinite(row.conversion)\n ? row.conversion\n : 0;\n return row.passerby > 0 || row.walkIns > 0 || conversionValue !== 0;\n }),\n [processedData]\n );\n\n const hasConversionData = React.useMemo(\n () =>\n processedData.some(\n r => typeof r.conversion === 'number' && Number.isFinite(r.conversion)\n ),\n [processedData]\n );\n\n const showConversionLine =\n showConversionLineProp !== undefined\n ? showConversionLineProp\n : hasConversionData;\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useChartPlotScrollToEnd(scrollRef, {\n enabled: scrollChartToEndOnDataChange,\n categoryScrollActive,\n dataLength: processedData.length,\n dataVersion: processedData,\n });\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n // Recharts v2 applies barCategoryGap on BOTH sides of the band:\n // originalSize = (bandSize - 2 × barCategoryGap - barGap × (len-1)) / len\n // For bars of width `targetBarWidth` with no inner gap between Passerby and\n // Walk-ins we need originalSize === targetBarWidth, so:\n // barCategoryGap = (bandSize - 2 × targetBarWidth - barGap) / 2\n // For dense charts where bandSize is already small, clamp to 0.\n const targetBarWidth = maxBarSizeProp ?? defaultMaxBarThickness;\n\n // Actual horizontal chrome that eats into plot width:\n // left margin (4) + left YAxis (44) + (right YAxis 44 when conversion line shown)\n // + right margin (52 with conversion line, 8 without).\n // Underestimating this caused Recharts' real bandSize to be smaller than ours,\n // which in turn made the resolved `barCategoryGap` too large and bars to shrink\n // below `maxBarSize` — so the `n=1` and `n=2` cases produced different widths.\n const resolvedPlotGutterPx = React.useMemo(() => {\n const leftAxisWidth = 44;\n const rightAxisWidth = showConversionLine ? 44 : 0;\n const leftMargin = chartMarginProp?.left ?? defaultChartMargin.left;\n const rightMargin =\n chartMarginProp?.right ??\n (showConversionLine ? 52 : defaultChartMargin.right);\n return leftMargin + leftAxisWidth + rightAxisWidth + rightMargin;\n }, [showConversionLine, chartMarginProp]);\n\n const resolvedBarCategoryGapPx = React.useMemo(() => {\n const effectiveWidth = chartWidthPx > 0 ? chartWidthPx : containerWidth;\n if (effectiveWidth <= 0) return 4;\n const n = Math.max(processedData.length, 1);\n const plotWidth = effectiveWidth - resolvedPlotGutterPx;\n const bandSize = plotWidth / n;\n const numericBarGap = typeof barGap === 'number' ? barGap : 0;\n return Math.max(0, (bandSize - targetBarWidth * 2 - numericBarGap) / 2);\n }, [\n processedData.length,\n chartWidthPx,\n containerWidth,\n barGap,\n targetBarWidth,\n resolvedPlotGutterPx,\n ]);\n\n const resolvedMaxBarSize = targetBarWidth;\n\n const chartColors = React.useMemo(\n (): Required<PasserbyConversionChartColors> => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n const right = showConversionLine ? 52 : defaultChartMargin.right;\n if (chartMarginProp) return chartMarginProp;\n return { ...defaultChartMargin, top, right };\n }, [showBarValueLabels, showConversionLine, chartMarginProp]);\n\n const yTickLeft = yAxisTickFormatter ?? formatYAxisTickDefault;\n const yTickRight = conversionAxisTickFormatter ?? formatYAxisTickDefault;\n\n const barFillOpacity = React.useCallback(\n (index: number) =>\n activeIndex === null || activeIndex === index ? 1 : 0.38,\n [activeIndex]\n );\n\n const resolvedWalkInsTooltipLabel = tooltipWalkInsLabel ?? walkInsSeriesName;\n const resolvedPasserbyTooltipLabel =\n tooltipPasserbyLabel ?? passerbySeriesName;\n\n const legendItems = React.useMemo(() => {\n const items: {\n key: string;\n label: string;\n color: string;\n isLine?: boolean;\n }[] = [\n {\n key: 'walkins',\n label: walkInsSeriesName,\n color: chartColors.walkInsBarFill,\n },\n {\n key: 'passerby',\n label: passerbySeriesName,\n color: chartColors.passerbyBarFill,\n },\n ];\n if (showConversionLine) {\n items.push({\n key: 'conversion',\n label: conversionSeriesName,\n color: chartColors.conversionLineStroke,\n isLine: true,\n });\n }\n return items;\n }, [\n passerbySeriesName,\n walkInsSeriesName,\n conversionSeriesName,\n chartColors.walkInsBarFill,\n chartColors.passerbyBarFill,\n chartColors.conversionLineStroke,\n showConversionLine,\n ]);\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n width: '100%',\n minWidth: 0,\n },\n titleRowSx\n )}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'left',\n flex: 1,\n minWidth: 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0, display: 'flex', alignItems: 'center' }}>\n {headerActions}\n </Box>\n ) : null}\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend &&\n !isLoading &&\n hasMeaningfulData &&\n legendItems.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {legendItems.map(item => (\n <Stack\n key={item.key}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n {item.isLine ? (\n <Box\n sx={sxChain(\n {\n width: 16,\n height: 3,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: 0.5,\n alignSelf: 'center',\n },\n legendSwatchSx\n )}\n />\n ) : (\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n )}\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {item.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height=\"100%\" />\n ) : hasMeaningfulData ? (\n <ComposedChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n barGap={barGap}\n barCategoryGap={barCategoryGapProp ?? resolvedBarCategoryGapPx}\n style={{ overflow: 'visible' }}\n onMouseLeave={handleChartMouseLeave}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n xAxisId=\"bottom\"\n interval={0}\n height={68}\n tickMargin={10}\n tick={\n <MultiLineTick\n angle={xAxisTickAngle}\n dx={xAxisTickDx}\n style={xAxisTickStyle}\n />\n }\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n yAxisId=\"left\"\n dx={yAxisTickDx}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400, ...yAxisTickStyle }}\n tickFormatter={yTickLeft}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n width={44}\n />\n {showConversionLine ? (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n dx={rightYAxisTickDx ?? conversionAxisTickDx}\n tickSize={8}\n tick={{\n fontSize: 12,\n fontWeight: 400,\n ...(rightYAxisTickStyle ?? conversionAxisTickStyle),\n }}\n tickFormatter={yTickRight}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n width={44}\n {...(conversionAxisLabel\n ? {\n label: {\n value: conversionAxisLabel,\n angle: 90,\n position: 'insideRight' as const,\n offset: 8,\n style: {\n fill: '#424242',\n fontSize: 11,\n fontWeight: 500,\n textAnchor: 'middle' as const,\n },\n },\n }\n : {})}\n />\n ) : null}\n <Tooltip\n cursor={false}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n showConversionLine,\n } satisfies PasserbyConversionTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <ConversionTooltip\n {...tooltipProps}\n timeLabel={tooltipTimeLabel}\n overallLabel={tooltipOverallLabel}\n walkInsLabel={resolvedWalkInsTooltipLabel}\n passerbyLabel={resolvedPasserbyTooltipLabel}\n conversionLabel={tooltipConversionLabel}\n formatConversion={formatTooltipConversion}\n colors={{\n walkIns: chartColors.walkInsBarFill,\n passerby: chartColors.passerbyBarFill,\n conversion: chartColors.conversionLineStroke,\n }}\n showConversionRow={showConversionLine}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n <Bar\n yAxisId=\"left\"\n xAxisId=\"bottom\"\n dataKey={PASSERBY_KEY}\n name={passerbySeriesName}\n fill={chartColors.passerbyBarFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={barRadius}\n onMouseEnter={handleBarMouseEnter}\n >\n {processedData.map((_, i) => (\n <Cell\n key={`pb-${i}`}\n fill={chartColors.passerbyBarFill}\n fillOpacity={barFillOpacity(i)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n <Bar\n yAxisId=\"left\"\n xAxisId=\"bottom\"\n dataKey={WALKINS_KEY}\n name={walkInsSeriesName}\n fill={chartColors.walkInsBarFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={barRadius}\n onMouseEnter={handleBarMouseEnter}\n >\n {processedData.map((_, i) => (\n <Cell\n key={`wi-${i}`}\n fill={chartColors.walkInsBarFill}\n fillOpacity={barFillOpacity(i)}\n />\n ))}\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n {showConversionLine ? (\n <Line\n yAxisId=\"right\"\n xAxisId=\"bottom\"\n type={lineType}\n dataKey={CONVERSION_KEY}\n name={conversionSeriesName}\n stroke={chartColors.conversionLineStroke}\n strokeWidth={2}\n dot={{\n r: 3,\n fill: chartColors.conversionLineStroke,\n strokeWidth: 0,\n }}\n connectNulls={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n />\n ) : null}\n </ComposedChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","import * as React from 'react';\n\n/**\n * When the plot is wider than the viewport (`overflow-x: auto`), scrolls horizontally\n * to the end after data updates so the latest categories stay in view.\n */\nexport function useChartPlotScrollToEnd(\n scrollRef: React.RefObject<HTMLElement | null>,\n options: {\n enabled: boolean;\n categoryScrollActive: boolean;\n dataLength: number;\n /** Triggers when row content changes (e.g. pass `processedData`). */\n dataVersion: unknown;\n }\n): void {\n const { enabled, categoryScrollActive, dataLength, dataVersion } = options;\n\n React.useLayoutEffect(() => {\n if (!enabled) {\n return;\n }\n if (!categoryScrollActive) {\n return;\n }\n if (dataLength === 0) {\n return;\n }\n const el = scrollRef.current;\n if (!el) {\n return;\n }\n const scrollToEnd = (): void => {\n el.scrollLeft = Math.max(0, el.scrollWidth - el.clientWidth);\n };\n scrollToEnd();\n requestAnimationFrame(scrollToEnd);\n }, [enabled, categoryScrollActive, dataLength, dataVersion, scrollRef]);\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type {\n WalkinAnalysisCardMaxWidth,\n WalkinAnalysisPieSize,\n WalkinAnalysisProps,\n WalkinAnalysisSlice,\n WalkinAnalysisTooltipRenderContext,\n WalkinAnalysisTypography,\n} from './WalkinAnalysis.types';\n\nconst OLY_LIFESTYLE_STRONG_TITLE_COLOR = '#0f172a' as const;\nconst OLY_LIFESTYLE_LEGEND_VALUE_COLOR = '#64748B' as const;\n\nconst walkinPieSizeDefaults = { xs: 180, sm: 220, md: 260 } as const;\n\nfunction px(n: number): string {\n return `${n}px`;\n}\n\nfunction resolveFontSize(\n value: number | string | undefined,\n fallbackPx: number\n): number | string {\n if (value === undefined) return fallbackPx;\n if (typeof value === 'number') return value;\n return value;\n}\n\nfunction resolveCardMaxWidth(\n cardMaxWidth: WalkinAnalysisCardMaxWidth | undefined\n):\n | number\n | string\n | { xs?: number | string; sm?: number | string; md?: number | string } {\n if (cardMaxWidth === undefined) {\n return { xs: '100%', sm: 640 };\n }\n if (typeof cardMaxWidth === 'number') {\n return px(cardMaxWidth);\n }\n if (typeof cardMaxWidth === 'string') {\n return cardMaxWidth;\n }\n return {\n xs:\n cardMaxWidth.xs !== undefined\n ? typeof cardMaxWidth.xs === 'number'\n ? px(cardMaxWidth.xs)\n : cardMaxWidth.xs\n : '100%',\n sm:\n cardMaxWidth.sm !== undefined\n ? typeof cardMaxWidth.sm === 'number'\n ? px(cardMaxWidth.sm)\n : cardMaxWidth.sm\n : 640,\n ...(cardMaxWidth.md !== undefined\n ? {\n md:\n typeof cardMaxWidth.md === 'number'\n ? px(cardMaxWidth.md)\n : cardMaxWidth.md,\n }\n : {}),\n };\n}\n\nfunction useWalkinResolvedPieSize(\n pieSize: WalkinAnalysisPieSize | undefined\n): number {\n const theme = useTheme();\n const mdUp = useMediaQuery(theme.breakpoints.up('md'));\n const smUp = useMediaQuery(theme.breakpoints.up('sm'));\n\n if (typeof pieSize === 'number') {\n return pieSize;\n }\n const merged = {\n xs: pieSize?.xs ?? walkinPieSizeDefaults.xs,\n sm: pieSize?.sm ?? walkinPieSizeDefaults.sm,\n md: pieSize?.md ?? walkinPieSizeDefaults.md,\n };\n if (mdUp) return merged.md;\n if (smUp) return merged.sm;\n return merged.xs;\n}\n\nconst numberFormatter = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 0,\n});\n\n/** Recharts `Pie` row: positive counts only (zero-count slices stay in the legend only). */\ntype WalkinPieDatum = Pick<\n WalkinAnalysisSlice,\n 'id' | 'label' | 'color' | 'segmentPercentColor'\n> & { value: number };\n\nfunction walkinSlicesToPieData(\n slices: WalkinAnalysisSlice[]\n): WalkinPieDatum[] {\n return slices\n .filter(s => s.count > 0)\n .map(s => ({\n id: s.id,\n label: s.label,\n value: s.count,\n color: s.color,\n segmentPercentColor: s.segmentPercentColor,\n }));\n}\n\ntype WalkinPieTooltipProps = TooltipContentProps & {\n sliceTotal: number;\n titleFontSize: number | string;\n valueFontSize: number | string;\n};\n\nfunction WalkinPieTooltip({\n active,\n payload,\n sliceTotal,\n titleFontSize,\n valueFontSize,\n}: WalkinPieTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length) {\n return null;\n }\n const first = payload[0] as TooltipPayloadEntry;\n const datum = first.payload as WalkinPieDatum | undefined;\n if (!datum || typeof datum.value !== 'number') {\n return null;\n }\n const pct = sliceTotal > 0 ? Math.round((datum.value / sliceTotal) * 100) : 0;\n return (\n <Box\n sx={{\n bgcolor: '#fff',\n borderRadius: 1,\n px: 1.5,\n py: 1.25,\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n border: '1px solid #E8E8E8',\n minWidth: 168,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 0.75 }}>\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: 0.5,\n bgcolor: datum.color,\n flexShrink: 0,\n }}\n />\n <Typography\n sx={{\n fontSize: titleFontSize,\n fontWeight: 700,\n color: OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n lineHeight: 1.3,\n }}\n >\n {datum.label}\n </Typography>\n </Stack>\n <Typography\n variant=\"body2\"\n sx={{\n color: OLY_LIFESTYLE_LEGEND_VALUE_COLOR,\n fontSize: valueFontSize,\n }}\n >\n {numberFormatter.format(datum.value)} ({pct}%)\n </Typography>\n </Box>\n );\n}\n\nfunction WalkinPiePercentLabel(props: {\n cx?: number;\n cy?: number;\n midAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n percent?: number;\n payload?: WalkinPieDatum;\n fontSize: number | string;\n}): React.ReactElement | null {\n const {\n cx: cxProp,\n cy: cyProp,\n midAngle: midProp,\n innerRadius: innerProp,\n outerRadius: outerProp,\n percent: percentProp,\n payload,\n fontSize,\n } = props;\n const cx = cxProp ?? 0;\n const cy = cyProp ?? 0;\n const midAngle = midProp ?? 0;\n const innerRadius = innerProp ?? 0;\n const outerRadius = outerProp ?? 0;\n const percent = percentProp ?? 0;\n const rounded = Math.round(percent * 100);\n if (rounded <= 0) {\n return null;\n }\n const labelRadius = innerRadius + (outerRadius - innerRadius) * 0.58;\n const rad = (-midAngle * Math.PI) / 180;\n const x = cx + labelRadius * Math.cos(rad);\n const y = cy + labelRadius * Math.sin(rad);\n return (\n <text\n x={x}\n y={y}\n fill={payload?.segmentPercentColor ?? '#fff'}\n fontSize={fontSize}\n fontWeight={600}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n >\n {rounded}%\n </text>\n );\n}\n\nfunction WalkinPieChart({\n slices,\n size,\n typography,\n activeTabId,\n renderTooltip,\n emptyStatePlaceholderProps,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n}: {\n slices: WalkinAnalysisSlice[];\n size: number;\n typography: WalkinAnalysisTypography | undefined;\n activeTabId: string;\n renderTooltip?: WalkinAnalysisProps['renderTooltip'];\n emptyStatePlaceholderProps?: WalkinAnalysisProps['emptyStatePlaceholderProps'];\n isChartAnimationActive?: boolean;\n chartAnimationDuration?: number;\n}) {\n const total = slices.reduce((sum, s) => sum + s.count, 0);\n const pieData = React.useMemo(() => walkinSlicesToPieData(slices), [slices]);\n\n const piePercentSize = resolveFontSize(typography?.piePercent, 14);\n const tooltipTitleSize = resolveFontSize(typography?.tooltipTitle, 13);\n const tooltipValueSize = resolveFontSize(typography?.tooltipValue, 12);\n\n if (total <= 0) {\n return <ChartEmptyState minHeight={size} {...emptyStatePlaceholderProps} />;\n }\n\n const outerRadius = size * 0.42;\n\n return (\n <Box\n role=\"img\"\n aria-label=\"Walk-in analysis pie chart\"\n sx={{\n width: size,\n height: size,\n lineHeight: 0,\n '& .recharts-surface:focus': { outline: 'none' },\n }}\n >\n <ResponsiveContainer width={size} height={size}>\n <PieChart key={activeTabId}>\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n slices,\n total,\n activeTabId,\n } satisfies WalkinAnalysisTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <WalkinPieTooltip\n {...tooltipProps}\n sliceTotal={total}\n titleFontSize={tooltipTitleSize}\n valueFontSize={tooltipValueSize}\n />\n );\n }}\n wrapperStyle={{ outline: 'none', zIndex: 2 }}\n />\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"label\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={0}\n outerRadius={outerRadius}\n startAngle={90}\n endAngle={450}\n paddingAngle={0}\n stroke=\"none\"\n labelLine={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n label={labelProps => (\n <WalkinPiePercentLabel\n {...labelProps}\n fontSize={piePercentSize}\n />\n )}\n >\n {pieData.map(entry => (\n <Cell key={entry.id} fill={entry.color} stroke=\"none\" />\n ))}\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Walk-in style analysis card: title row (optional `headerActions`), tabs, Recharts pie, legend.\n * Pie and legend are driven by `slices` (`label`, `count`, `color`, optional legend / segment % colors).\n */\nexport const WalkinAnalysis = ({\n title,\n tabs,\n activeTabId,\n onTabChange,\n segmentedTabsFullWidth,\n segmentedTabsSx,\n slices,\n headerActions,\n cardSx,\n cardMaxWidth,\n pieSize,\n typography,\n customization,\n emptyStatePlaceholderProps,\n renderTooltip,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n}: WalkinAnalysisProps) => {\n const resolvedPieSize = useWalkinResolvedPieSize(pieSize);\n const total = slices.reduce((sum, s) => sum + s.count, 0);\n\n return (\n <Box\n sx={{\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n ...cardSx,\n }}\n >\n <Stack spacing={2.5}>\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n {...(customization?.titleRowStackSx != null\n ? {\n sx: [customization.titleRowStackSx] as SxProps<Theme>,\n }\n : {})}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={\n [\n {\n fontWeight: 700,\n color: OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n pr: 1,\n ...(typography?.title != null\n ? { fontSize: typography.title }\n : {}),\n },\n ...(customization?.titleSx != null\n ? [customization.titleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {title}\n </Typography>\n {headerActions ? (\n <Box sx={{ flexShrink: 0 }}>{headerActions}</Box>\n ) : null}\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Analysis scope\"\n fullWidth={segmentedTabsFullWidth}\n tabFontSize={typography?.tabs}\n rootSx={segmentedTabsSx}\n />\n\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n spacing={3}\n alignItems=\"center\"\n justifyContent=\"flex-start\"\n sx={\n [\n { width: '100%' },\n ...(customization?.chartLegendRowSx != null\n ? [customization.chartLegendRowSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Box\n sx={\n [\n { flexShrink: 0, lineHeight: 0 },\n ...(customization?.pieChartBoxSx != null\n ? [customization.pieChartBoxSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <WalkinPieChart\n slices={slices}\n size={resolvedPieSize}\n typography={typography}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n emptyStatePlaceholderProps={emptyStatePlaceholderProps}\n isChartAnimationActive={isChartAnimationActive}\n chartAnimationDuration={chartAnimationDuration}\n />\n </Box>\n <Stack\n spacing={2}\n sx={\n [\n {\n flex: 1,\n minWidth: 0,\n alignSelf: { xs: 'stretch', sm: 'auto' },\n width: { xs: '100%', sm: 'auto' },\n },\n ...(customization?.legendColumnStackSx != null\n ? [customization.legendColumnStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {slices.map(slice => {\n const pct =\n total > 0 ? Math.round((slice.count / total) * 100) : 0;\n return (\n <Stack key={slice.id} spacing={0.75}>\n <Typography\n sx={\n [\n {\n fontStyle: 'italic',\n fontWeight: 700,\n color:\n slice.legendLabelColor ??\n OLY_LIFESTYLE_STRONG_TITLE_COLOR,\n fontSize: resolveFontSize(\n typography?.legendLabel,\n 13\n ),\n },\n ...(customization?.legendTypographySx != null\n ? [customization.legendTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {slice.label}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Box\n sx={{\n width: 14,\n height: 14,\n borderRadius: 0.5,\n bgcolor: slice.color,\n flexShrink: 0,\n }}\n />\n <Typography\n variant=\"body2\"\n sx={\n [\n {\n color:\n slice.legendValueColor ??\n OLY_LIFESTYLE_LEGEND_VALUE_COLOR,\n fontSize: resolveFontSize(\n typography?.legendValue,\n 12\n ),\n },\n ...(customization?.legendTypographySx != null\n ? [customization.legendTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {numberFormatter.format(slice.count)} ({pct}%)\n </Typography>\n {slice.legendInfo ? (\n <Box sx={{ display: 'inline-flex', flexShrink: 0 }}>\n {slice.legendInfo}\n </Box>\n ) : null}\n </Stack>\n </Stack>\n );\n })}\n </Stack>\n </Stack>\n </Stack>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { TooltipContentProps, TooltipPayloadEntry } from 'recharts';\nimport {\n Bar,\n CartesianGrid,\n ComposedChart,\n LabelList,\n Line,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { resolveChartCardMaxWidth } from '../../_chart/resolveChartCardMaxWidth';\nimport { useChartPlotScrollToEnd } from '../../_chart/useChartPlotScrollToEnd';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n WalkinTrafficProps,\n WalkinTrafficRow,\n WalkinTrafficTooltipRenderContext,\n WalkinTrafficTooltipStyles,\n} from './WalkinTraffic.types';\n\nconst defaultFfGrowthTooltipFooterNote =\n \"*This FF Growth % compares today's hourly FF with the same hours on this date last year.\";\n\nconst OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX = 430 as const;\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_WALKIN_TRAFFIC_CHART_MARGIN = {\n top: 16,\n right: 8,\n left: 6,\n bottom: 0,\n} as const;\nconst OLY_DEFAULT_WALKIN_TRAFFIC_CHART_SERIES_COLORS = {\n barFill: '#0086A9',\n lineStroke: '#4B5563',\n barValueLabelFill: '#374151',\n} as const;\n\nfunction hasFooterText(note: string | null | undefined): note is string {\n return typeof note === 'string' && note.trim().length > 0;\n}\n\nfunction tooltipDatumFromPayload(\n payload: TooltipContentProps['payload']\n): WalkinTrafficRow | undefined {\n const raw = payload?.[0]?.payload;\n if (raw && typeof raw === 'object' && 'walkIns' in raw) {\n return raw as WalkinTrafficRow;\n }\n return undefined;\n}\n\nfunction GrowthDirectionIcon({ direction }: { direction: 'up' | 'down' }) {\n const bg = direction === 'up' ? '#22C55E' : '#EF4444';\n const glyph = direction === 'up' ? '▲' : '▼';\n return (\n <span\n style={{\n display: 'inline-flex',\n width: 16,\n height: 16,\n borderRadius: '50%',\n backgroundColor: bg,\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: 6,\n flexShrink: 0,\n }}\n aria-hidden\n >\n <span\n style={{\n color: '#fff',\n fontSize: 8,\n lineHeight: 1,\n transform: direction === 'up' ? undefined : 'translateY(0.5px)',\n }}\n >\n {glyph}\n </span>\n </span>\n );\n}\n\nconst BAR_KEY = 'walkIns';\nconst TREND_KEY = 'trend';\n\nfunction mergeCss(\n base: React.CSSProperties,\n override?: React.CSSProperties\n): React.CSSProperties {\n return override ? { ...base, ...override } : base;\n}\n\nfunction sxChain(\n base: SxProps<Theme>,\n ...extra: (SxProps<Theme> | undefined)[]\n): SxProps<Theme> {\n const flat = extra\n .filter((x): x is SxProps<Theme> => x !== undefined)\n .flatMap(x => (Array.isArray(x) ? x : [x]));\n return [base, ...flat];\n}\n\nfunction formatBarLabel(value: number): string {\n if (value > 1000) {\n return `${(value / 1000).toFixed(1)}k`;\n }\n return String(value);\n}\n\ntype SVGTextAnchor = 'inherit' | 'start' | 'middle' | 'end';\n\ntype MultiLineTickProps = {\n x?: number;\n y?: number;\n payload?: { value: string };\n angle?: number;\n dx?: number;\n style?: Record<string, string | number>;\n textAnchor?: SVGTextAnchor;\n fontSize?: number;\n};\n\nfunction MultiLineTick({\n x = 0,\n y = 0,\n payload,\n angle = -42,\n dx = 0,\n style,\n textAnchor = 'end',\n fontSize = 12,\n}: MultiLineTickProps): React.ReactElement | null {\n if (!payload?.value) return null;\n const lines = String(payload.value).split('\\n');\n const lineHeight = fontSize * 1.3;\n const isHorizontal = angle === 0;\n const anchor: SVGTextAnchor = isHorizontal ? 'middle' : textAnchor;\n const dy0 = isHorizontal ? lineHeight * 0.35 : 4;\n\n return (\n <g transform={`translate(${x + dx},${y})`}>\n <text\n transform={`rotate(${angle})`}\n textAnchor={anchor}\n fontSize={fontSize}\n fill=\"#666\"\n {...style}\n >\n {lines.map((line, i) => (\n <tspan key={i} x={0} dy={i === 0 ? dy0 : lineHeight}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n\nfunction formatYAxisTickDefault(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n const abs = Math.abs(value);\n if (abs >= 1000) {\n const k = value / 1000;\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1);\n return `${text}k`;\n }\n return String(value);\n}\n\ninterface RechartsBarLabelListProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction BarTopLabel({\n x,\n y,\n width,\n value,\n fill,\n}: RechartsBarLabelListProps & { fill: string }) {\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 10;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={12}\n fontWeight={500}\n textAnchor=\"middle\"\n >\n {formatBarLabel(n)}\n </text>\n );\n}\n\ntype TrafficTooltipProps = TooltipContentProps & {\n tooltipTitle: string;\n timeLabel: string;\n currentYearLabel: string;\n lastYearLabel: string;\n growthLabel: string;\n footerNote: string | null | undefined;\n showTrendLine: boolean;\n accentColor: string;\n tooltipStyles?: WalkinTrafficTooltipStyles;\n};\n\nfunction TrafficTooltip({\n active,\n payload,\n label,\n tooltipTitle,\n timeLabel,\n currentYearLabel,\n lastYearLabel,\n growthLabel,\n footerNote,\n showTrendLine,\n accentColor,\n tooltipStyles,\n}: TrafficTooltipProps): React.ReactElement | null {\n if (!active || !payload?.length || label === undefined) {\n return null;\n }\n\n const datum = tooltipDatumFromPayload(payload);\n\n const barEntry = payload.find(\n (p: TooltipPayloadEntry) => String(p.dataKey) === BAR_KEY\n );\n const lineEntry = showTrendLine\n ? payload.find((p: TooltipPayloadEntry) => String(p.dataKey) === TREND_KEY)\n : undefined;\n\n const walk = Number(barEntry?.value ?? 0);\n const trendRaw = lineEntry?.value;\n const trend =\n typeof trendRaw === 'number'\n ? trendRaw\n : trendRaw === null || trendRaw === undefined\n ? NaN\n : Number(trendRaw);\n\n const timeDisplay =\n datum?.timeSlotLabel !== undefined && datum.timeSlotLabel !== ''\n ? datum.timeSlotLabel\n : String(label);\n\n const growthRaw = datum?.ffGrowthPercent;\n const growth =\n typeof growthRaw === 'number' && Number.isFinite(growthRaw)\n ? growthRaw\n : NaN;\n const showGrowthRow = Number.isFinite(growth);\n const growthDirection: 'up' | 'down' | null = !showGrowthRow\n ? null\n : growth > 0\n ? 'up'\n : growth < 0\n ? 'down'\n : null;\n\n const showFooter = hasFooterText(footerNote) && showGrowthRow;\n const footerText =\n showFooter && typeof footerNote === 'string' ? footerNote.trim() : '';\n\n const ts = tooltipStyles;\n const rowBase: React.CSSProperties = {\n display: 'flex',\n alignItems: 'baseline',\n flexWrap: 'wrap',\n columnGap: 4,\n rowGap: 2,\n marginBottom: 6,\n };\n\n const labelStyle = mergeCss(\n { color: '#1a1a1a', fontSize: 11, fontWeight: 700 },\n ts?.label\n );\n const valueStyle = mergeCss(\n { color: '#757575', fontSize: 11, fontWeight: 400 },\n ts?.value\n );\n\n return (\n <div\n style={mergeCss(\n {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'stretch',\n },\n ts?.wrapper\n )}\n >\n <div\n style={{\n position: 'absolute',\n left: -6,\n top: 18,\n width: 0,\n height: 0,\n borderTop: '6px solid transparent',\n borderBottom: '6px solid transparent',\n borderRight: '7px solid #fff',\n zIndex: 1,\n filter: 'drop-shadow(-1px 0 0 #E8E8E8)',\n }}\n aria-hidden\n />\n <div\n style={mergeCss(\n {\n position: 'relative',\n zIndex: 2,\n backgroundColor: '#fff',\n borderRadius: 8,\n padding: '10px 12px 10px',\n width: 'max-content',\n maxWidth: 200,\n minWidth: 0,\n boxSizing: 'border-box',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n border: '1px solid #E8E8E8',\n },\n ts?.container\n )}\n >\n <div\n style={mergeCss(\n {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n marginBottom: 8,\n },\n ts?.header\n )}\n >\n <span\n style={mergeCss(\n {\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: accentColor,\n flexShrink: 0,\n },\n ts?.headerDot\n )}\n />\n <span\n style={mergeCss(\n {\n color: '#1a1a1a',\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.25,\n },\n ts?.headerTitle\n )}\n >\n {tooltipTitle}\n </span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{timeLabel}:</span>\n <span style={valueStyle}>{timeDisplay}</span>\n </div>\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{currentYearLabel}:</span>\n <span style={valueStyle}>\n {Number.isFinite(walk) ? walk.toLocaleString() : '—'}\n </span>\n </div>\n {showTrendLine && Number.isFinite(trend) ? (\n <div style={mergeCss(rowBase, ts?.row)}>\n <span style={labelStyle}>{lastYearLabel}:</span>\n <span style={valueStyle}>{trend.toLocaleString()}</span>\n </div>\n ) : null}\n {showGrowthRow ? (\n <div\n style={mergeCss(\n {\n ...rowBase,\n alignItems: 'center',\n marginBottom: showFooter ? 8 : 0,\n },\n ts?.row\n )}\n >\n <span style={labelStyle}>{growthLabel}:</span>\n <span style={valueStyle}>\n {`${Number.isInteger(growth) ? String(growth) : growth.toFixed(1)}%`}\n </span>\n {growthDirection ? (\n <GrowthDirectionIcon direction={growthDirection} />\n ) : null}\n </div>\n ) : null}\n {showFooter ? (\n <p\n style={mergeCss(\n {\n margin: 0,\n paddingTop: 8,\n borderTop: '1px solid #ECECEC',\n color: '#8A8A8A',\n fontSize: 9,\n fontStyle: 'italic',\n lineHeight: 1.4,\n },\n ts?.footer\n )}\n >\n {footerText}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n\nconst defaultMinWidthPerCategory = 52;\nconst defaultMaxBarThickness = 36;\nconst chartWidthAxisGutter = 72;\n\nconst defaultChartMargin = OLY_DEFAULT_WALKIN_TRAFFIC_CHART_MARGIN;\n\nconst topReserveForBarLabels = 52;\nconst topReserveNoBarLabels = 22;\n\nconst defaultChartColors = {\n ...OLY_DEFAULT_COMPOSED_CHART_CHROME,\n ...OLY_DEFAULT_WALKIN_TRAFFIC_CHART_SERIES_COLORS,\n} as const;\n\nexport function WalkinTraffic({\n title,\n data,\n isLoading = false,\n chartHeight = OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX,\n barSeriesName = 'Walk-ins',\n lineSeriesName = 'Trend',\n lineType = 'natural',\n minWidthPerCategory = defaultMinWidthPerCategory,\n horizontalScroll: horizontalScrollProp = 'auto',\n maxBarSize: maxBarSizeProp,\n barCategoryGap: barCategoryGapProp,\n barRadius = [2, 2, 0, 0],\n cardMaxWidth,\n cardSx,\n titleRowSx,\n titleSx,\n dividerSx,\n legendRowSx,\n legendItemSx,\n legendSwatchSx,\n legendLabelSx,\n chartScrollAreaSx,\n stackSx,\n emptyStateSx,\n headerActions,\n tooltipTitle = 'Overall Walk-in Traffic',\n tooltipTimeLabel,\n tooltipCurrentYearLabel = 'This year',\n tooltipLastYearLabel = 'Last year',\n tooltipGrowthLabel = 'FF Growth%',\n tooltipFooterNote: tooltipFooterNoteProp,\n tooltipHourLabel,\n tooltipStyles,\n renderTooltip,\n showLegend = true,\n showTrendLine: showTrendLineProp,\n showLineInLegend = false,\n showBarValueLabels = true,\n chartMargin: chartMarginProp,\n yAxisTickDx = -8,\n yAxisTickStyle,\n chartColors: chartColorsProp,\n emptyStatePlaceholderProps,\n yAxisTickFormatter,\n isChartAnimationActive = true,\n chartAnimationDuration = 400,\n scrollChartToEndOnDataChange = true,\n xAxisTickAngle = 0,\n xAxisTickDx = 0,\n xAxisTickStyle,\n}: WalkinTrafficProps) {\n const tooltipFooterNote =\n tooltipFooterNoteProp === undefined\n ? defaultFfGrowthTooltipFooterNote\n : tooltipFooterNoteProp;\n\n const processedData = React.useMemo(\n () => data.map(row => ({ ...row })),\n [data]\n );\n\n const hasMeaningfulData = React.useMemo(\n () =>\n processedData.some(row => {\n const trendValue =\n typeof row.trend === 'number' && Number.isFinite(row.trend)\n ? row.trend\n : 0;\n return row.walkIns > 0 || trendValue !== 0;\n }),\n [processedData]\n );\n\n const hasTrendData = React.useMemo(\n () =>\n processedData.some(\n r => typeof r.trend === 'number' && Number.isFinite(r.trend)\n ),\n [processedData]\n );\n\n const showTrendLine =\n showTrendLineProp !== undefined ? showTrendLineProp : hasTrendData;\n\n const resolvedMaxBarSize = React.useMemo(() => {\n if (maxBarSizeProp !== undefined) {\n return maxBarSizeProp;\n }\n const categoryCap =\n minWidthPerCategory > 0\n ? minWidthPerCategory\n : defaultMinWidthPerCategory;\n return Math.min(categoryCap, defaultMaxBarThickness);\n }, [maxBarSizeProp, minWidthPerCategory]);\n\n const categoryScrollActive = React.useMemo(() => {\n if (minWidthPerCategory <= 0) {\n return false;\n }\n if (horizontalScrollProp === 'off') {\n return false;\n }\n if (horizontalScrollProp === 'on') {\n return true;\n }\n return processedData.length > 1;\n }, [horizontalScrollProp, minWidthPerCategory, processedData.length]);\n\n const chartInnerMinWidthPx = React.useMemo(() => {\n if (!categoryScrollActive) {\n return undefined;\n }\n const n = Math.max(processedData.length, 1);\n return chartWidthAxisGutter + n * minWidthPerCategory;\n }, [categoryScrollActive, processedData.length, minWidthPerCategory]);\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const measure = () => {\n setContainerWidth(el.clientWidth);\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useChartPlotScrollToEnd(scrollRef, {\n enabled: scrollChartToEndOnDataChange,\n categoryScrollActive,\n dataLength: processedData.length,\n dataVersion: processedData,\n });\n\n const chartWidthPx = React.useMemo(() => {\n if (chartInnerMinWidthPx === undefined) {\n return containerWidth > 0 ? containerWidth : 400;\n }\n if (containerWidth === 0) {\n return chartInnerMinWidthPx;\n }\n return Math.max(chartInnerMinWidthPx, containerWidth);\n }, [chartInnerMinWidthPx, containerWidth]);\n\n // Auto-size barCategoryGap so the bar fills resolvedMaxBarSize regardless of chart width.\n // barCategoryGap = (bandSize - targetBarWidth) / 2 (single bar per category, no inner gap)\n const resolvedBarCategoryGapPx = React.useMemo(() => {\n if (barCategoryGapProp !== undefined) return barCategoryGapProp;\n const effectiveWidth = chartWidthPx > 0 ? chartWidthPx : containerWidth;\n if (effectiveWidth <= 0) return 4;\n const n = Math.max(processedData.length, 1);\n const plotWidth = effectiveWidth - chartWidthAxisGutter;\n const bandSize = plotWidth / n;\n return Math.max(0, (bandSize - resolvedMaxBarSize) / 2);\n }, [\n barCategoryGapProp,\n chartWidthPx,\n containerWidth,\n processedData.length,\n resolvedMaxBarSize,\n ]);\n\n const chartMargin = React.useMemo(() => {\n const top = showBarValueLabels\n ? topReserveForBarLabels\n : topReserveNoBarLabels;\n if (chartMarginProp) return chartMarginProp;\n return { ...defaultChartMargin, top };\n }, [showBarValueLabels, chartMarginProp]);\n\n const chartColors = React.useMemo(\n () => ({\n ...defaultChartColors,\n ...chartColorsProp,\n }),\n [chartColorsProp]\n );\n\n const yTick = yAxisTickFormatter ?? formatYAxisTickDefault;\n\n const resolvedTooltipTimeLabel =\n tooltipTimeLabel ?? tooltipHourLabel ?? 'Time';\n\n const legendItems = React.useMemo(() => {\n const items: {\n key: string;\n label: string;\n color: string;\n isLine?: boolean;\n }[] = [\n {\n key: 'bar',\n label: barSeriesName,\n color: chartColors.barFill,\n },\n ];\n if (showTrendLine && showLineInLegend) {\n items.push({\n key: 'line',\n label: lineSeriesName,\n color: chartColors.lineStroke,\n isLine: true,\n });\n }\n return items;\n }, [\n barSeriesName,\n chartColors.barFill,\n chartColors.lineStroke,\n lineSeriesName,\n showLineInLegend,\n showTrendLine,\n ]);\n\n return (\n <Box\n sx={sxChain(\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n maxWidth: resolveChartCardMaxWidth(cardMaxWidth),\n boxSizing: 'border-box',\n height: '100%',\n position: 'relative',\n },\n cardSx\n )}\n >\n <Stack spacing={2} sx={sxChain({ minWidth: 0 }, stackSx)}>\n <Box\n sx={sxChain(\n {\n position: 'relative',\n width: '100%',\n },\n titleRowSx\n )}\n >\n {headerActions ? (\n <Box\n sx={{\n position: 'absolute',\n right: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={sxChain(\n {\n fontWeight: 600,\n color: '#1a1a1a',\n textAlign: 'center',\n width: '100%',\n px: headerActions ? 5 : 0,\n },\n titleSx\n )}\n >\n {title}\n </Typography>\n </Box>\n <Divider sx={sxChain({ borderColor: '#D8D9E4' }, dividerSx)} />\n {showLegend &&\n !isLoading &&\n hasMeaningfulData &&\n legendItems.length > 0 ? (\n <Box\n sx={sxChain(\n {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: { xs: 2, sm: 3 },\n rowGap: 1,\n py: 0.5,\n px: { xs: 0, sm: 1 },\n },\n legendRowSx\n )}\n >\n {legendItems.map(item => (\n <Stack\n key={item.key}\n direction=\"row\"\n alignItems=\"center\"\n sx={sxChain({ gap: 1 }, legendItemSx)}\n >\n {item.isLine ? (\n <Box\n sx={sxChain(\n {\n width: 16,\n height: 3,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: 0.5,\n alignSelf: 'center',\n },\n legendSwatchSx\n )}\n />\n ) : (\n <Box\n sx={sxChain(\n {\n width: 12,\n height: 12,\n flexShrink: 0,\n bgcolor: item.color,\n borderRadius: '2px',\n },\n legendSwatchSx\n )}\n />\n )}\n <Typography\n sx={sxChain(\n {\n fontSize: 12,\n fontWeight: 700,\n color: '#424242',\n lineHeight: 1.25,\n },\n legendLabelSx\n )}\n >\n {item.label}\n </Typography>\n </Stack>\n ))}\n </Box>\n ) : null}\n <Box\n ref={scrollRef}\n sx={sxChain(\n {\n width: '100%',\n minWidth: 0,\n height: chartHeight,\n minHeight: 200,\n overflowX: categoryScrollActive ? 'auto' : 'hidden',\n overflowY: 'hidden',\n WebkitOverflowScrolling: 'touch',\n },\n chartScrollAreaSx\n )}\n >\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height=\"100%\" />\n ) : hasMeaningfulData ? (\n <ComposedChart\n width={chartWidthPx}\n height={chartHeight}\n data={processedData}\n margin={chartMargin}\n maxBarSize={resolvedMaxBarSize}\n barCategoryGap={resolvedBarCategoryGapPx}\n style={{ overflow: 'visible' }}\n >\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal\n vertical={false}\n stroke={chartColors.cartesianGridStroke}\n />\n <XAxis\n dataKey=\"name\"\n interval={0}\n height={68}\n tickMargin={10}\n tick={\n <MultiLineTick\n angle={xAxisTickAngle}\n dx={xAxisTickDx}\n style={xAxisTickStyle}\n />\n }\n axisLine={{ stroke: chartColors.xAxisLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <YAxis\n dx={yAxisTickDx}\n tickSize={8}\n tick={{ fontSize: 12, fontWeight: 400, ...yAxisTickStyle }}\n tickFormatter={yTick}\n axisLine={{ stroke: chartColors.axisTickLineStroke }}\n tickLine={{ stroke: chartColors.axisTickLineStroke }}\n />\n <Tooltip\n cursor={false}\n wrapperStyle={{ outline: 'none', zIndex: 10 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n rows: processedData,\n showTrendLine,\n } satisfies WalkinTrafficTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return (\n <TrafficTooltip\n {...tooltipProps}\n tooltipTitle={tooltipTitle}\n timeLabel={resolvedTooltipTimeLabel}\n currentYearLabel={tooltipCurrentYearLabel}\n lastYearLabel={tooltipLastYearLabel}\n growthLabel={tooltipGrowthLabel}\n footerNote={tooltipFooterNote}\n showTrendLine={showTrendLine}\n accentColor={chartColors.barFill}\n tooltipStyles={tooltipStyles}\n />\n );\n }}\n />\n <Bar\n dataKey={BAR_KEY}\n name={barSeriesName}\n fill={chartColors.barFill}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n radius={barRadius}\n >\n {showBarValueLabels ? (\n <LabelList\n content={props => (\n <BarTopLabel\n {...(props as RechartsBarLabelListProps)}\n fill={chartColors.barValueLabelFill}\n />\n )}\n />\n ) : null}\n </Bar>\n {showTrendLine ? (\n <Line\n type={lineType}\n dataKey={TREND_KEY}\n name={lineSeriesName}\n stroke={chartColors.lineStroke}\n strokeWidth={2}\n dot={false}\n connectNulls={false}\n isAnimationActive={isChartAnimationActive}\n animationDuration={chartAnimationDuration}\n />\n ) : null}\n </ComposedChart>\n ) : (\n <Box\n sx={sxChain(\n {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n emptyStateSx\n )}\n >\n <ChartEmptyState\n minHeight={chartHeight}\n {...emptyStatePlaceholderProps}\n />\n </Box>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n","/** Primary line + tooltip fill (violet). */\nexport const BILLING_COUNTER_LINE_PRIMARY = '#7C3AED' as const;\n\n/** Default pill track behind segmented tabs. */\nexport const BILLING_COUNTER_TABS_TRACK_BG = '#E8E8E8' as const;\n","import type { ChartWidgetInfoPopoverContent } from '../../buttons/ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\nexport const DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n {\n title: 'Billing Counter Analytics',\n description:\n 'Trend lines for billing-counter visits, average queue time, and alerts. Switch tabs to compare metrics over the same date range.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'Track daily load at billing counters and spot spikes.',\n 'Monitor queue-time trends to adjust staffing.',\n 'See when alert volume rises relative to traffic.',\n ],\n };\n","import type { ChartWidgetSegmentedTab } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type { BillingCounterAnalyticsPoint } from './BillingCounterAnalytics.types';\n\nexport const billingCounterDefaultTabs: ChartWidgetSegmentedTab[] = [\n { id: 'visits', label: 'Billing Counter Visits' },\n { id: 'queue', label: 'Avg. Queue Time' },\n { id: 'alerts', label: 'Alerts Generated' },\n];\n\nconst X_LABELS = [\n 'Jan 12',\n 'Jan 13',\n 'Jan 14',\n 'Jan 15',\n 'Jan 16',\n 'Jan 17',\n 'Jan 18',\n 'Jan 19',\n 'Jan 20',\n 'Jan 21',\n 'Jan 22',\n 'Jan 23',\n 'Today',\n] as const;\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.min(hi, Math.max(lo, n));\n}\n\nfunction seriesForTab(\n phase: number,\n scale: number,\n bias: number\n): BillingCounterAnalyticsPoint[] {\n return X_LABELS.map((label, i) => {\n const wobble = Math.sin((i + phase) * 0.55) * scale;\n const ramp = i * 2.2;\n const raw = 52 + wobble + ramp * 0.15 + bias;\n return {\n label,\n value: clamp(Math.round(raw), 18, 98),\n };\n });\n}\n\n/** Demo datasets aligned with **billingCounterDefaultTabs** ids. */\nexport const billingCounterMockSeriesByTabId: Record<\n string,\n BillingCounterAnalyticsPoint[]\n> = {\n visits: seriesForTab(0, 22, 0),\n queue: seriesForTab(2.1, 18, -8),\n alerts: seriesForTab(4.2, 28, -18),\n};\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\nimport { ChartWidgetInfoButton } from '../../buttons/ChartWidgetInfoButton';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport {\n BILLING_COUNTER_LINE_PRIMARY,\n BILLING_COUNTER_TABS_TRACK_BG,\n} from './billingCounterAnalytics.chartTokens';\nimport { DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER } from './billingCounterAnalytics.defaultInfoPopover';\nimport { mergeSx } from './billingCounterAnalyticsCustomization.merge';\nimport {\n BillingCounterAnalyticsCustomizationProvider,\n useBillingCounterAnalyticsCustomization,\n} from './BillingCounterAnalyticsCustomizationContext';\nimport type {\n BillingCounterAnalyticsProps,\n BillingCounterAnalyticsTooltipRenderContext,\n} from './BillingCounterAnalytics.types';\nimport { BillingCounterAnalyticsTooltip } from './BillingCounterAnalyticsTooltip';\n\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_CHART_AXIS_TICK_FILL = '#64748B' as const;\n\nfunction LinePlot({\n data,\n yAxisDomain,\n yAxisTicks,\n activeTabId,\n renderTooltip,\n}: {\n data: { label: string; value: number }[];\n yAxisDomain: [number, number];\n yAxisTicks: number[];\n activeTabId: string;\n renderTooltip?: BillingCounterAnalyticsProps['renderTooltip'];\n}): React.ReactElement {\n const { lineChart: lc } = useBillingCounterAnalyticsCustomization();\n const height = lc?.heightPx ?? 300;\n const lineColor = lc?.lineColor ?? BILLING_COUNTER_LINE_PRIMARY;\n const strokeW = lc?.lineStrokeWidth ?? 2;\n const gridStroke =\n lc?.gridStroke ?? OLY_DEFAULT_COMPOSED_CHART_CHROME.cartesianGridStroke;\n const dash = lc?.gridStrokeDasharray ?? '3 3';\n const m = {\n top: lc?.margin?.top ?? 12,\n right: lc?.margin?.right ?? 16,\n bottom: lc?.margin?.bottom ?? 8,\n left: lc?.margin?.left ?? 4,\n };\n const xFill = lc?.xAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yFill = lc?.yAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yWidth = lc?.yAxisWidth ?? 36;\n const cursorStroke = lc?.cursorStroke ?? '#9CA3AF';\n const cursorDash = lc?.cursorStrokeDasharray ?? '4 4';\n const lineType = lc?.lineType ?? 'linear';\n\n return (\n <Box sx={{ width: '100%', height, mt: 0.5 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={data} margin={m}>\n <CartesianGrid\n strokeDasharray={dash}\n vertical={false}\n stroke={gridStroke}\n />\n <XAxis\n dataKey=\"label\"\n tick={{ fill: xFill, fontSize: 11 }}\n tickLine={false}\n axisLine={{\n stroke: OLY_DEFAULT_COMPOSED_CHART_CHROME.axisTickLineStroke,\n }}\n interval={0}\n height={40}\n />\n <YAxis\n domain={yAxisDomain}\n ticks={yAxisTicks}\n tick={{ fill: yFill, fontSize: 11 }}\n tickLine={false}\n axisLine={false}\n width={yWidth}\n />\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n data,\n activeTabId,\n } satisfies BillingCounterAnalyticsTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return <BillingCounterAnalyticsTooltip {...tooltipProps} />;\n }}\n cursor={{ stroke: cursorStroke, strokeDasharray: cursorDash }}\n allowEscapeViewBox={{ x: false, y: true }}\n />\n <Line\n type={lineType}\n dataKey=\"value\"\n stroke={lineColor}\n strokeWidth={strokeW}\n strokeLinejoin=\"miter\"\n strokeLinecap=\"butt\"\n dot={false}\n activeDot={{\n r: 5,\n fill: lineColor,\n stroke: '#ffffff',\n strokeWidth: 2,\n }}\n isAnimationActive={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Billing counter analytics card: title row (optional info), pill tabs, Recharts line chart with violet styling.\n */\nexport function BillingCounterAnalytics({\n title = 'Billing Counter Analytics',\n tabs,\n activeTabId,\n onTabChange,\n data,\n seriesByTabId,\n yAxisDomain = [0, 100],\n yAxisTicks = [20, 40, 60, 80, 100],\n infoPopover,\n renderTooltip,\n emptyStatePlaceholderProps,\n customization,\n}: BillingCounterAnalyticsProps): React.ReactElement {\n const chartData = React.useMemo(() => {\n if (seriesByTabId) {\n return seriesByTabId[activeTabId] ?? [];\n }\n return data ?? [];\n }, [seriesByTabId, data, activeTabId]);\n\n const resolvedInfo =\n infoPopover === undefined\n ? DEFAULT_BILLING_COUNTER_ANALYTICS_INFO_POPOVER\n : infoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const st = customization?.segmentedTabs;\n const titleSx = mergeSx(\n {\n fontWeight: 700,\n fontSize: { xs: '1rem', sm: '1.05rem' },\n color: '#0f172a',\n },\n customization?.header?.titleSx\n );\n\n return (\n <BillingCounterAnalyticsCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack spacing={1.75} sx={{ width: '100%' }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={2}\n flexWrap=\"wrap\"\n >\n <Typography sx={titleSx}>{title}</Typography>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ flexShrink: 0 }}\n >\n {resolvedInfo ? (\n <>\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n popover={resolvedInfo}\n ariaLabel=\"Billing counter analytics information\"\n />\n </>\n ) : null}\n </Stack>\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Billing counter metric\"\n trackBackgroundColor={\n st?.trackBackgroundColor ?? BILLING_COUNTER_TABS_TRACK_BG\n }\n activeTabBackground={\n st?.activeTabBackground ?? BILLING_COUNTER_LINE_PRIMARY\n }\n activeTabColor={st?.activeTabColor ?? '#ffffff'}\n inactiveTabColor={st?.inactiveTabColor ?? '#525252'}\n activeTabBoxShadow={st?.activeTabBoxShadow ?? 'none'}\n fullWidth={st?.fullWidth ?? true}\n tabFontSize={st?.tabFontSize ?? 14}\n rootSx={st?.rootSx}\n tabLayout={st?.tabLayout ?? 'equalWidth'}\n activeTabFontWeight={st?.activeTabFontWeight ?? 700}\n inactiveTabFontWeight={st?.inactiveTabFontWeight ?? 600}\n />\n\n {chartData.length > 0 ? (\n <LinePlot\n data={chartData}\n yAxisDomain={yAxisDomain}\n yAxisTicks={yAxisTicks}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n />\n ) : (\n <ChartEmptyState\n minHeight={300}\n {...emptyStatePlaceholderProps}\n />\n )}\n </Stack>\n </CardContent>\n </Card>\n </BillingCounterAnalyticsCustomizationProvider>\n );\n}\n\nexport default BillingCounterAnalytics;\n","import type { CSSProperties } from 'react';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport function mergeCss(a: CSSProperties, b?: CSSProperties): CSSProperties {\n if (!b) {\n return { ...a };\n }\n return { ...a, ...b };\n}\n\nexport function mergeSx(\n ...parts: Array<SxProps<Theme> | undefined>\n): SxProps<Theme> | undefined {\n const flat = parts.filter(Boolean) as SxProps<Theme>[];\n if (flat.length === 0) {\n return undefined;\n }\n if (flat.length === 1) {\n return flat[0];\n }\n return flat.flat() as SxProps<Theme>;\n}\n","import * as React from 'react';\nimport type { BillingCounterAnalyticsCustomization } from './billingCounterAnalytics.customization.types';\n\nconst BillingCounterAnalyticsCustomizationContext =\n React.createContext<BillingCounterAnalyticsCustomization>({});\n\nexport type BillingCounterAnalyticsCustomizationProviderProps = {\n value: BillingCounterAnalyticsCustomization;\n children: React.ReactNode;\n};\n\nexport function BillingCounterAnalyticsCustomizationProvider({\n value,\n children,\n}: BillingCounterAnalyticsCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <BillingCounterAnalyticsCustomizationContext.Provider value={memo}>\n {children}\n </BillingCounterAnalyticsCustomizationContext.Provider>\n );\n}\n\nexport function useBillingCounterAnalyticsCustomization(): BillingCounterAnalyticsCustomization {\n return React.useContext(BillingCounterAnalyticsCustomizationContext);\n}\n","import * as React from 'react';\nimport type { TooltipContentProps } from 'recharts';\nimport { mergeCss } from './billingCounterAnalyticsCustomization.merge';\nimport { useBillingCounterAnalyticsCustomization } from './BillingCounterAnalyticsCustomizationContext';\n\nfunction formatTooltipValue(n: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(\n Math.round(n)\n );\n}\n\nexport function BillingCounterAnalyticsTooltip(\n props: TooltipContentProps\n): React.ReactElement | null {\n const { active, payload, label } = props;\n const { lineChart: lc } = useBillingCounterAnalyticsCustomization();\n const tt = lc?.tooltip;\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const raw = payload[0]?.value;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN;\n if (!Number.isFinite(num)) {\n return null;\n }\n\n const labelText = label !== undefined && label !== null ? String(label) : '—';\n\n const borderColor = tt?.borderColor ?? '#E5E7EB';\n const radius = tt?.borderRadiusPx ?? 6;\n const shadow = tt?.boxShadow ?? '0 4px 14px rgba(15, 23, 42, 0.12)';\n const topBg = tt?.topBarBackground ?? '#E5E7EB';\n const topH = tt?.topBarHeightPx ?? 8;\n const bodyBg = tt?.bodyBackground ?? '#FFFFFF';\n const fs = tt?.fontSizePx ?? 13;\n const gap = tt?.lineGapPx ?? 6;\n const dateP = tt?.dateLabelPrefix ?? 'Date: ';\n const totalP = tt?.totalLabelPrefix ?? 'Total: ';\n const prefixFw = tt?.prefixFontWeight ?? 400;\n const valueFw = tt?.valueFontWeight ?? 700;\n\n const uniformText =\n tt?.textColor != null &&\n tt?.prefixColor === undefined &&\n tt?.valueColor === undefined;\n const prefixCol = uniformText ? tt.textColor : (tt?.prefixColor ?? '#6B7280');\n const valueCol = uniformText ? tt.textColor : (tt?.valueColor ?? '#111827');\n\n const rowStyle: React.CSSProperties = {\n fontSize: fs,\n lineHeight: 1.35,\n margin: 0,\n };\n\n const bodyStyle = mergeCss(\n {\n boxSizing: 'border-box',\n backgroundColor: bodyBg,\n padding: '10px 12px',\n },\n tt?.bodyStyle\n );\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n minWidth: 160,\n maxWidth: 280,\n }}\n >\n <div\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: bodyBg,\n boxShadow: shadow,\n }}\n >\n <div\n style={{\n height: topH,\n backgroundColor: topBg,\n flexShrink: 0,\n }}\n aria-hidden\n />\n <div style={bodyStyle}>\n <div style={rowStyle}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {dateP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {labelText}\n </span>\n </div>\n <div style={{ ...rowStyle, marginTop: gap }}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {totalP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {formatTooltipValue(num)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Shared queue-time visualization palette (stacked bar, donut, area).\n * Four violet shades, light → dark (segment index order) — pill bar / donut / area.\n */\nexport const QUEUE_CHART_COLORS = [\n '#E9E5FF',\n '#C4B5FD',\n '#8B5CF6',\n '#6D28D9',\n] as const;\n\n/** Thin horizontal stacked bar height (px); pill radius uses half of this. */\nexport const QUEUE_STACKED_BAR_THICKNESS_PX = 8;\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport * as React from 'react';\nimport { ChartWidgetInfoButton } from '../../buttons/ChartWidgetInfoButton';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { TimePeriodFilter } from '../../filters/TimePeriodFilter';\nimport { TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN } from '../../filters/timePeriodFilter.infoPopover';\nimport type {\n QueueTimeBreakdownProps,\n QueueTimeChartFilter,\n} from './QueueTimeBreakdown.types';\nimport { QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC } from './QueueTimeBreakdown.types';\nimport QueueTimeBreakdownArea, {\n getQueueTimeBreakdownAreaSeriesData,\n getQueueTimeBreakdownAreaXAxisData,\n} from './QueueTimeBreakdownArea';\nimport { QueueTimeBreakdownCustomizationProvider } from './QueueTimeBreakdownCustomizationContext';\nimport { QueueTimeBreakdownDonut } from './QueueTimeBreakdownDonut';\nimport { QueueTimeBreakdownStackedBar } from './QueueTimeBreakdownStackedBar';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\nimport { mergeSx } from './queueTimeBreakdownCustomization.merge';\n\nfunction defaultBucketLegendFromPalette(palette: readonly string[]) {\n return [\n { percent: '12%', label: '> 16mins', color: palette[0 % palette.length] },\n { percent: '22%', label: '7 - 15mins', color: palette[1 % palette.length] },\n { percent: '36%', label: '3 - 6mins', color: palette[2 % palette.length] },\n { percent: '16%', label: '1 - 2mins', color: palette[3 % palette.length] },\n ] as const;\n}\n\n/**\n * Queue time breakdown dashboard widget: stacked bars, queue buckets, donut comparison, area chart (Recharts).\n */\nexport function QueueTimeBreakdown({\n data,\n Donut_data,\n donutYesterdayData,\n headerImageSrc,\n headlineTotal = '14,123',\n headlineSubtitle = 'Queue Time Breakdown Of All Visitors',\n dataComparisonTitle = 'Data Comparison:',\n queueBucketLegend,\n title = 'Queue Time Breakdown',\n infoPopover,\n headlineInfoPopover,\n renderAreaTooltip,\n renderDonutTooltip,\n renderStackedBarTooltip,\n customization,\n}: QueueTimeBreakdownProps): React.ReactElement {\n const isSmallScreen = useMediaQuery('(max-width:600px)');\n const [filter, setFilter] = React.useState<QueueTimeChartFilter>('Day');\n const yesterdayDonut = donutYesterdayData ?? Donut_data;\n const hasComparisonData = React.useMemo(() => {\n const values = [...Donut_data, ...yesterdayDonut];\n return values.some(value => Number.isFinite(value) && value > 0);\n }, [Donut_data, yesterdayDonut]);\n const hasBarData = React.useMemo(\n () => data.some(row => row.data.some(seg => (seg.data[0] ?? 0) > 0)),\n [data]\n );\n const palette =\n customization?.chartPalette && customization.chartPalette.length > 0\n ? customization.chartPalette\n : QUEUE_CHART_COLORS;\n const legend = queueBucketLegend ?? defaultBucketLegendFromPalette(palette);\n const resolvedHeaderImageSrc =\n headerImageSrc === undefined\n ? QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC\n : headerImageSrc;\n const resolvedPeriodInfoPopover =\n infoPopover === undefined\n ? TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN\n : infoPopover;\n const resolvedHeadlineInfoPopover =\n headlineInfoPopover === undefined\n ? resolvedPeriodInfoPopover\n : headlineInfoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const periodTitleSx = mergeSx(\n { fontWeight: 700, color: '#0f172a' },\n customization?.periodFilter?.titleSx\n );\n\n return (\n <QueueTimeBreakdownCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent sx={mergeSx(customization?.rootCard?.cardContentSx)}>\n <Stack width=\"100%\" direction=\"column\" gap={3} mb={4}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n gap={2}\n width=\"100%\"\n >\n <Typography\n variant={isSmallScreen ? 'subtitle2' : 'body1'}\n sx={periodTitleSx}\n >\n {title}\n </Typography>\n <TimePeriodFilter\n selectedFilter={filter}\n onFilterChange={setFilter}\n infoPopover={resolvedPeriodInfoPopover}\n />\n </Stack>\n <Box>\n <Grid container spacing={3}>\n <Grid size={{ md: 6, xs: 12 }}>\n <Stack\n gap={1}\n sx={mergeSx(customization?.leftColumn?.columnStackSx)}\n >\n <Stack>\n <Stack\n direction=\"row\"\n gap={4}\n justifyContent=\"start\"\n alignItems=\"center\"\n >\n {resolvedHeaderImageSrc ? (\n <Box\n component=\"img\"\n src={resolvedHeaderImageSrc}\n alt=\"\"\n width={52}\n height={52}\n sx={{ objectFit: 'contain' }}\n />\n ) : null}\n <Stack>\n <Typography\n sx={mergeSx(\n {\n fontSize: '20px',\n fontWeight: 600,\n color: '#222222',\n },\n customization?.header?.headlineSx\n )}\n >\n {headlineTotal}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" gap={1}>\n <Typography\n sx={mergeSx(\n {\n fontSize: '11px',\n fontWeight: 400,\n color: '#222222',\n },\n customization?.header?.subtitleSx\n )}\n >\n {headlineSubtitle}\n </Typography>\n {resolvedHeadlineInfoPopover ? (\n <ChartWidgetInfoButton\n density=\"compact\"\n popover={resolvedHeadlineInfoPopover}\n ariaLabel=\"Queue time breakdown information\"\n />\n ) : null}\n </Stack>\n </Stack>\n </Stack>\n </Stack>\n <Stack\n sx={mergeSx(customization?.leftColumn?.barRowsStackSx)}\n >\n {data.map(item => (\n <QueueTimeBreakdownStackedBar\n key={item.name}\n row={item}\n legendRows={legend}\n renderTooltip={renderStackedBarTooltip}\n />\n ))}\n </Stack>\n </Stack>\n <Typography\n sx={mergeSx(\n {\n marginTop: '10px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#222222',\n },\n customization?.dataComparison?.titleSx\n )}\n >\n {dataComparisonTitle}\n </Typography>\n <Card\n elevation={0}\n sx={mergeSx(\n {\n cursor: 'pointer',\n marginTop: '10px',\n bgcolor: '#FFFFFF',\n border: '1px solid #E5E7EB',\n borderRadius: 2,\n },\n customization?.dataComparison?.cardSx\n )}\n >\n <CardContent sx={{ padding: '4px 8px' }}>\n {hasComparisonData ? (\n <Stack\n direction=\"row\"\n justifyContent=\"space-evenly\"\n alignItems=\"center\"\n >\n <Stack width=\"50%\">\n <QueueTimeBreakdownDonut\n averageData={Donut_data}\n chartFilter={filter}\n LabelName=\"Today\"\n renderTooltip={renderDonutTooltip}\n />\n </Stack>\n <Box\n component=\"span\"\n sx={mergeSx(\n {\n height: '180px',\n width: '2px',\n backgroundColor: '#D8D9E4',\n display: 'inline-block',\n },\n customization?.dataComparison?.dividerSx\n )}\n />\n <Stack width=\"50%\">\n <QueueTimeBreakdownDonut\n averageData={yesterdayDonut}\n chartFilter={filter}\n LabelName=\"Yesterday\"\n renderTooltip={renderDonutTooltip}\n />\n </Stack>\n </Stack>\n ) : (\n <ChartEmptyState minHeight={220} />\n )}\n </CardContent>\n </Card>\n </Grid>\n\n <Grid size={{ md: 6, xs: 12 }}>\n <Card\n elevation={0}\n sx={mergeSx(\n {\n cursor: 'pointer',\n borderRadius: '8px',\n border: '1px solid #E5E7EB',\n bgcolor: '#FFFFFF',\n height: '100%',\n },\n customization?.areaChart?.cardSx\n )}\n >\n <CardContent\n sx={mergeSx(\n { padding: '10px 8px' },\n customization?.areaChart?.cardContentSx\n )}\n >\n {hasBarData ? (\n <QueueTimeBreakdownArea\n series={getQueueTimeBreakdownAreaSeriesData(filter)}\n xAxis={getQueueTimeBreakdownAreaXAxisData(filter)}\n renderTooltip={renderAreaTooltip}\n />\n ) : (\n <ChartEmptyState minHeight={330} />\n )}\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n </Box>\n </Stack>\n </CardContent>\n </Card>\n </QueueTimeBreakdownCustomizationProvider>\n );\n}\n\nexport default QueueTimeBreakdown;\n\nexport { generateMockPerformanceData } from './queueTimeBreakdown.mock';\n","import type { ChartWidgetInfoPopoverContent } from '../../buttons/ChartWidgetInfoButton/ChartWidgetInfoButton.types';\nimport type { QueueTimeBreakdownCustomization } from './queueTimeBreakdown.customization.types';\nimport type { QueueTimeBreakdownAreaProps } from './QueueTimeBreakdownArea';\nimport type { QueueTimeBreakdownDonutProps } from './QueueTimeBreakdownDonut';\nimport type { QueueTimeBreakdownStackedBarProps } from './QueueTimeBreakdownStackedBar';\n\nexport type { QueueTimeBreakdownCustomization };\n\n/**\n * Header illustration for the queue breakdown card.\n * Default GIF path (place under app **`public`** or override with **`headerImageSrc`**).\n */\nexport const QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC =\n '/images/icon/DwellBreakdownIcon.gif' as const;\n\n/** One series slice for Apex stacked horizontal bars. */\nexport type QueueTimeStackedSeriesItem = {\n name: string;\n data: number[];\n};\n\n/** One row of stacked-bar data (e.g. per store). */\nexport type QueueTimeBreakdownBarRow = {\n name: string;\n data: QueueTimeStackedSeriesItem[];\n total: number;\n};\n\nexport type QueueTimeChartFilter = 'Day' | 'Week' | 'Month' | 'Year';\n\n/** Optional legend chip under the stacked bars (percent + label + color). */\nexport type QueueBucketLegendItem = {\n percent: string;\n label: string;\n color: string;\n};\n\nexport type QueueTimeBreakdownProps = {\n /** Stacked horizontal bar rows. */\n data: QueueTimeBreakdownBarRow[];\n /** Donut slice values (e.g. today). */\n Donut_data: number[];\n /** Optional second donut; defaults to Donut_data for both sides. */\n donutYesterdayData?: number[];\n total_visitor_today?: number;\n overall_visitor_per_hour?: number;\n overall_visitor_per_min?: number;\n top_store?: string;\n /**\n * Header illustration URL. Defaults to {@link QUEUE_TIME_BREAKDOWN_DEFAULT_HEADER_IMAGE_SRC}\n * (same asset as the queue-time dashboard widget). Pass `''` to hide the icon.\n */\n headerImageSrc?: string;\n /** Main KPI number shown next to the icon. */\n headlineTotal?: string;\n /** Subtitle under the headline. */\n headlineSubtitle?: string;\n /** Row title above the donut comparison card. */\n dataComparisonTitle?: string;\n /** Legend under the stacked bars; defaults to four queue buckets. */\n queueBucketLegend?: QueueBucketLegendItem[];\n /** Card / widget title. */\n title?: string;\n /**\n * Header info popover (next to D/W/M/Y). When omitted, the widget uses\n * **`TIME_PERIOD_FILTER_INFO_POPOVER_BREAKDOWN`**. Pass **`null`** to hide the separator and\n * **`ChartWidgetInfoButton`**. Standalone **`TimePeriodFilter`** does not inject popover copy implicitly.\n */\n infoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Info popover shown beside the headline subtitle (\"Avg. Queue Time Breakdown...\").\n * Defaults to the same content used by `infoPopover` when omitted.\n * Pass `null` to hide the subtitle info button.\n */\n headlineInfoPopover?: ChartWidgetInfoPopoverContent | null;\n /**\n * Full custom tooltip renderer for the area chart.\n */\n renderAreaTooltip?: QueueTimeBreakdownAreaProps['renderTooltip'];\n /**\n * Full custom tooltip renderer for both donut charts.\n */\n renderDonutTooltip?: QueueTimeBreakdownDonutProps['renderTooltip'];\n /**\n * Full custom tooltip renderer for each stacked bar row.\n */\n renderStackedBarTooltip?: QueueTimeBreakdownStackedBarProps['renderTooltip'];\n /** Visual / layout overrides for all sub-widgets (tooltips, palette, D/W/M/Y control, etc.). */\n customization?: QueueTimeBreakdownCustomization;\n};\n","import { Stack } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport type { QueueTimeChartFilter } from './QueueTimeBreakdown.types';\nimport {\n QueueTimeBreakdownAreaTooltip,\n type QueueTimeBreakdownAreaTooltipProps,\n} from './QueueTimeBreakdownAreaTooltip';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\n\nexport type QueueTimeAreaSeriesPoint = {\n name: string;\n data: number[];\n};\n\nexport type QueueTimeBreakdownAreaProps = {\n series: QueueTimeAreaSeriesPoint[];\n xAxis: string[];\n renderTooltip?: (\n context: QueueTimeBreakdownAreaTooltipRenderContext\n ) => ReactNode;\n};\n\nexport type QueueTimeBreakdownAreaTooltipRenderContext = {\n tooltipProps: TooltipContentProps;\n chartData: Record<string, string | number>[];\n series: QueueTimeAreaSeriesPoint[];\n xAxis: string[];\n};\n\nfunction mergeAreaData(\n seriesList: QueueTimeAreaSeriesPoint[],\n categories: string[]\n): Record<string, string | number>[] {\n return categories.map((cat, i) => {\n const row: Record<string, string | number> = { name: cat };\n seriesList.forEach(s => {\n row[s.name] = s.data[i] ?? 0;\n });\n return row;\n });\n}\n\nconst defaultMargin = { top: 8, right: 8, bottom: 8, left: 8 };\n\nconst QueueTimeBreakdownArea = ({\n series,\n xAxis,\n renderTooltip,\n}: QueueTimeBreakdownAreaProps): React.ReactElement => {\n const theme = useTheme();\n const { chartPalette, areaChart: ac } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const chartData = React.useMemo(\n () => mergeAreaData(series, xAxis),\n [series, xAxis]\n );\n const stackH = ac?.stackHeightPx ?? 330;\n const chartH = ac?.chartHeightPx ?? 350;\n const margin = React.useMemo(\n () => ({ ...defaultMargin, ...ac?.margin }),\n [ac?.margin]\n );\n const gridStroke = ac?.gridStroke ?? theme.palette.divider;\n const yLabel = ac?.yAxisLabel ?? 'No of Visitors';\n\n const allZero = React.useMemo(() => {\n if (chartData.length === 0) return true;\n return chartData.every(row =>\n series.every(s => {\n const val = row[s.name];\n return (typeof val === 'number' ? val : Number(val)) === 0;\n })\n );\n }, [chartData, series]);\n\n const yDomain = allZero\n ? ([0, 16000] as [number, number])\n : ([0, 'auto'] as [number, string]);\n const yTickCount = allZero ? 5 : undefined;\n\n return (\n <Stack justifyContent=\"center\" height={stackH}>\n <ResponsiveContainer width=\"100%\" height={chartH}>\n <AreaChart data={chartData} margin={margin}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke={gridStroke}\n vertical={false}\n />\n <XAxis\n dataKey=\"name\"\n tick={{ fill: theme.palette.text.secondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n />\n <YAxis\n domain={yDomain}\n tickCount={yTickCount}\n tick={{ fill: theme.palette.text.secondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n tickFormatter={v => {\n const n = typeof v === 'number' ? v : Number(v);\n const safe = Number.isFinite(n) ? n : 0;\n return safe > 1000 ? `${Math.ceil(safe / 1000)}k` : String(safe);\n }}\n label={{\n value: yLabel,\n angle: -90,\n position: 'insideLeft',\n style: { fill: theme.palette.text.secondary, fontSize: 11 },\n }}\n />\n {series.map((s, i) => (\n <Area\n key={s.name}\n type=\"monotone\"\n dataKey={s.name}\n stackId=\"queueArea\"\n stroke={palette[i % palette.length]}\n fill={palette[i % palette.length]}\n fillOpacity={1}\n strokeWidth={0}\n />\n ))}\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const custom = renderTooltip({\n tooltipProps,\n chartData,\n series,\n xAxis,\n });\n return custom == null ? null : <>{custom}</>;\n }\n const { active, payload, label } = tooltipProps;\n return (\n <QueueTimeBreakdownAreaTooltip\n active={active}\n label={label}\n payload={\n payload as QueueTimeBreakdownAreaTooltipProps['payload']\n }\n styleOverrides={ac?.areaTooltip}\n />\n );\n }}\n cursor={{\n stroke: ac?.cursorStroke ?? '#D4D4D8',\n strokeWidth: ac?.cursorStrokeWidth ?? 1,\n }}\n wrapperStyle={{ outline: 'none' }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </Stack>\n );\n};\n\nexport default QueueTimeBreakdownArea;\n\nconst xDays = [\n 'April 1',\n 'April 2',\n 'April 3',\n 'April 4',\n 'April 5',\n 'April 6',\n 'Today',\n];\nconst xWeeks = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\nconst xMonths = ['Jan', 'Feb', 'Mar', 'Apr'];\nconst xYears = ['2018', '2019', '2020', '2021', '2022', '2023', '2024'];\n\nexport function getQueueTimeBreakdownAreaXAxisData(\n type: QueueTimeChartFilter\n): string[] {\n switch (type) {\n case 'Day':\n return xDays;\n case 'Week':\n return xWeeks;\n case 'Month':\n return xMonths;\n case 'Year':\n return xYears;\n default:\n return xDays;\n }\n}\n\nexport function getQueueTimeBreakdownAreaSeriesData(\n type: QueueTimeChartFilter\n): QueueTimeAreaSeriesPoint[] {\n const axis = getQueueTimeBreakdownAreaXAxisData(type);\n const areas = ['1-15 mins', '16-30 mins', '30-45 mins', '> 45 mins'] as const;\n const out: QueueTimeAreaSeriesPoint[] = [];\n\n areas.forEach(area => {\n const data: number[] = [];\n const range =\n area === '1-15 mins'\n ? 500\n : area === '16-30 mins'\n ? 1000\n : area === '30-45 mins'\n ? 2000\n : 1500;\n for (let i = 0; i < axis.length; i += 1) {\n data.push(range + i * 100 * Math.floor(Math.random() * 10));\n }\n out.push({ name: area, data });\n });\n\n return out;\n}\n","import * as React from 'react';\nimport type { QueueTimeAreaTooltipTheme } from './queueTimeBreakdown.customization.types';\nimport { mergeAreaTooltipStyles } from './queueTimeBreakdownCustomization.merge';\n\n/** Normalized row after Recharts payload cast. */\ntype TooltipRow = {\n value?: unknown;\n name?: unknown;\n color?: string;\n dataKey?: unknown;\n};\n\nexport type QueueTimeBreakdownAreaTooltipProps = {\n active?: boolean;\n payload?: ReadonlyArray<TooltipRow>;\n label?: unknown;\n /** Merged with built-in defaults; set via `QueueTimeBreakdown` `customization.areaChart.areaTooltip`. */\n styleOverrides?: QueueTimeAreaTooltipTheme;\n};\n\nfunction numberFromTooltipValue(v: unknown): number {\n if (typeof v === 'number' && Number.isFinite(v)) {\n return v;\n }\n if (typeof v === 'string') {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n }\n if (Array.isArray(v) && v.length > 0) {\n const first = v[0];\n if (typeof first === 'number' && Number.isFinite(first)) {\n return first;\n }\n }\n return 0;\n}\n\nfunction formatVisitorValue(n: number): string {\n if (!Number.isFinite(n)) {\n return '';\n }\n if (Math.abs(n) >= 1000) {\n return `${(n / 1000).toFixed(1)}k`;\n }\n return String(Math.round(n));\n}\n\n/**\n * Area chart tooltip — header strip + rows: dot · label : value.\n * Styles are customizable via `styleOverrides` (see `QueueTimeAreaTooltipTheme`).\n */\nexport function QueueTimeBreakdownAreaTooltip({\n active,\n payload,\n label,\n styleOverrides,\n}: QueueTimeBreakdownAreaTooltipProps): React.ReactElement | null {\n const s = React.useMemo(\n () => mergeAreaTooltipStyles(styleOverrides),\n [styleOverrides]\n );\n\n if (!active || payload == null || payload.length === 0) {\n return null;\n }\n\n return (\n <div style={s.container}>\n <div style={s.header}>{label != null ? String(label) : ''}</div>\n <div style={s.body}>\n {payload.map((entry, i) => {\n const name =\n typeof entry.name === 'string'\n ? entry.name\n : entry.name != null\n ? String(entry.name)\n : '';\n const safe = numberFromTooltipValue(entry.value);\n const color =\n typeof entry.color === 'string' ? entry.color : '#8B5CF6';\n const key =\n entry.dataKey != null ? String(entry.dataKey) : `row-${i}`;\n return (\n <div key={key} style={s.row}>\n <span\n style={{\n ...s.dot,\n backgroundColor: color,\n }}\n />\n <span style={s.label}>{`${name} :`}</span>\n <span style={s.value}>{formatVisitorValue(safe)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport type { QueueTimeChartFilter } from './QueueTimeBreakdown.types';\nimport { QUEUE_CHART_COLORS } from './queueTimeBreakdown.chartTokens';\nimport {\n mergeRechartsTooltipStyles,\n mergeSx,\n} from './queueTimeBreakdownCustomization.merge';\n\nconst RADIAN = Math.PI / 180;\n\nfunction DefaultDonutTooltip({\n tooltipProps,\n pieData,\n palette,\n}: {\n tooltipProps: TooltipContentProps;\n pieData: PieDatum[];\n total: number;\n palette: readonly string[];\n}): React.ReactElement | null {\n const { active, payload } = tooltipProps;\n if (!active || !payload?.length) {\n return null;\n }\n const entry = payload[0];\n const name = entry?.name ?? '';\n const rawValue = entry?.value;\n const value =\n typeof rawValue === 'number' ? rawValue : (Number(rawValue) ?? 0);\n const colorIndex = pieData.findIndex(d => d.name === name);\n const color = palette[colorIndex % palette.length];\n\n return (\n <Box\n sx={{\n pointerEvents: 'none',\n backgroundColor: '#FFFFFF',\n border: '1px solid #E5E7EB',\n borderRadius: 1.5,\n boxShadow: '0 4px 14px rgba(15, 23, 42, 0.12)',\n zIndex: 9999,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ height: 3, bgcolor: '#E5E7EB', width: '100%' }} />\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n sx={{ px: '10px', py: '6px' }}\n >\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: color,\n flexShrink: 0,\n }}\n />\n <Stack direction=\"row\" spacing={0.5} alignItems=\"baseline\">\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 500,\n color: '#6B7280',\n lineHeight: 1,\n }}\n >\n {name}:\n </Typography>\n <Typography\n sx={{\n fontSize: 14,\n fontWeight: 700,\n color: '#374151',\n lineHeight: 1,\n }}\n >\n {value.toLocaleString()}\n </Typography>\n </Stack>\n </Stack>\n </Box>\n );\n}\n\n/** Recharts `Pie` label payload (subset we need). */\ntype PieSectorLabelPayload = {\n cx?: number;\n cy?: number;\n midAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n percent?: number;\n index?: number;\n};\n\ntype DonutInnerLabelExtra = {\n lightSliceFill?: string;\n darkSliceFill?: string;\n};\n\n/** Percent text at mid-annulus so it reads inside the donut ring (not outside). */\nfunction DonutInnerPercentLabel(\n props: Readonly<PieSectorLabelPayload & DonutInnerLabelExtra>\n): React.ReactElement | null {\n const {\n cx,\n cy,\n midAngle,\n innerRadius,\n outerRadius,\n percent,\n index = 0,\n lightSliceFill = '#5B21B6',\n darkSliceFill = '#FFFFFF',\n } = props;\n if (\n cx == null ||\n cy == null ||\n midAngle == null ||\n innerRadius == null ||\n outerRadius == null ||\n percent == null\n ) {\n return null;\n }\n const p = percent;\n if (p < 0.025) {\n return null;\n }\n const midR = innerRadius + (outerRadius - innerRadius) / 2;\n const x = cx + midR * Math.cos(-midAngle * RADIAN);\n const y = cy + midR * Math.sin(-midAngle * RADIAN);\n const text = `${(p * 100).toFixed(0)}%`;\n const lightSlice = index < 2;\n const fill = lightSlice ? lightSliceFill : darkSliceFill;\n\n return (\n <text\n x={x}\n y={y}\n fill={fill}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={11}\n fontWeight={600}\n style={{\n pointerEvents: 'none',\n textShadow: lightSlice ? 'none' : '0 1px 2px rgba(0,0,0,0.45)',\n }}\n >\n {text}\n </text>\n );\n}\n\nconst DEFAULT_LABELS = [\n '0-20 years old (male)',\n '21-45 years old (male)',\n '46-60 years old (male)',\n '60+ years old (male)',\n] as const;\n\nexport type QueueTimeBreakdownDonutProps = {\n chartFilter: QueueTimeChartFilter;\n averageData: number[];\n LabelName: string;\n labels?: readonly string[];\n renderTooltip?: (\n context: QueueTimeBreakdownDonutTooltipRenderContext\n ) => ReactNode;\n};\n\ntype PieDatum = { name: string; value: number };\n\nexport type QueueTimeBreakdownDonutTooltipRenderContext = {\n tooltipProps: TooltipContentProps;\n pieData: PieDatum[];\n total: number;\n chartFilter: QueueTimeChartFilter;\n labelName: string;\n};\n\nexport function QueueTimeBreakdownDonut({\n chartFilter,\n averageData,\n LabelName,\n labels = DEFAULT_LABELS,\n renderTooltip,\n}: QueueTimeBreakdownDonutProps): React.ReactElement {\n const { chartPalette, donut: dn } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n const tt = React.useMemo(\n () => mergeRechartsTooltipStyles(dn?.tooltip),\n [dn?.tooltip]\n );\n const innerR = dn?.innerRadius ?? 58;\n const outerR = dn?.outerRadius ?? 88;\n const padAngle = dn?.paddingAngle ?? 0;\n const chartH = dn?.chartHeightPx ?? 220;\n\n const pieData: PieDatum[] = React.useMemo(() => {\n return labels.map((name, i) => ({\n name,\n value: Math.max(0, averageData[i] ?? 0),\n }));\n }, [averageData, labels]);\n\n const total = pieData.reduce((s, d) => s + d.value, 0) || 1;\n\n return (\n <Box\n sx={mergeSx(\n { position: 'relative', width: '100%', minHeight: 200 },\n dn?.containerSx\n )}\n >\n <ResponsiveContainer width=\"100%\" height={chartH}>\n <PieChart key={chartFilter}>\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={innerR}\n outerRadius={outerR}\n paddingAngle={padAngle}\n labelLine={false}\n label={(props: PieSectorLabelPayload) => (\n <DonutInnerPercentLabel\n {...props}\n lightSliceFill={dn?.innerPercentOnLightSliceFill}\n darkSliceFill={dn?.innerPercentOnDarkSliceFill}\n />\n )}\n >\n {pieData.map((_, index) => (\n <Cell\n key={`cell-${index}`}\n fill={palette[index % palette.length]}\n stroke=\"none\"\n />\n ))}\n </Pie>\n <Tooltip\n contentStyle={tt.contentStyle}\n itemStyle={tt.itemStyle}\n labelStyle={tt.labelStyle}\n wrapperStyle={{ ...tt.wrapperStyle, zIndex: 9999 }}\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const custom = renderTooltip({\n tooltipProps,\n pieData,\n total,\n chartFilter,\n labelName: LabelName,\n });\n return custom == null ? null : <>{custom}</>;\n }\n return (\n <DefaultDonutTooltip\n tooltipProps={tooltipProps}\n pieData={pieData}\n total={total}\n palette={palette}\n />\n );\n }}\n formatter={\n renderTooltip\n ? undefined\n : (value, name) => {\n const v =\n value == null\n ? 0\n : typeof value === 'number'\n ? value\n : Number(value);\n const safe = Number.isFinite(v) ? v : 0;\n const label =\n typeof name === 'string' ? name : String(name ?? '');\n return [`${((safe / total) * 100).toFixed(0)}%`, label];\n }\n }\n />\n </PieChart>\n </ResponsiveContainer>\n <Box\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n textAlign: 'center',\n }}\n >\n <Typography\n sx={mergeSx(\n { fontSize: '13px', fontWeight: 600, color: '#373d3f' },\n dn?.centerLabelSx\n )}\n >\n {LabelName}\n </Typography>\n </Box>\n </Box>\n );\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\nimport * as React from 'react';\nimport type {\n QueueBucketLegendItem,\n QueueTimeBreakdownBarRow,\n} from './QueueTimeBreakdown.types';\nimport { useQueueTimeBreakdownCustomization } from './QueueTimeBreakdownCustomizationContext';\nimport {\n QUEUE_CHART_COLORS,\n QUEUE_STACKED_BAR_THICKNESS_PX,\n} from './queueTimeBreakdown.chartTokens';\nimport { mergeSx } from './queueTimeBreakdownCustomization.merge';\n\nconst segmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst defaultSegmentTooltipCardSx: SxProps<Theme> = {\n minWidth: 160,\n bgcolor: '#fff',\n borderRadius: 1.5,\n border: '1px solid #E5E7EB',\n boxShadow: '0 4px 14px rgba(15, 23, 42, 0.12)',\n overflow: 'hidden',\n pointerEvents: 'none',\n zIndex: 9999,\n};\n\nfunction SegmentTooltip({\n name,\n value,\n color,\n}: {\n name: string;\n value: number;\n pct: string;\n color: string;\n}): React.ReactElement {\n return (\n <Box sx={defaultSegmentTooltipCardSx}>\n <Box sx={{ height: 3, bgcolor: '#E5E7EB', width: '100%' }} />\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n sx={{ px: '10px', py: '6px' }}\n >\n <Box\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: color,\n flexShrink: 0,\n }}\n />\n <Stack direction=\"row\" spacing={0.5} alignItems=\"baseline\">\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 500,\n color: '#6B7280',\n lineHeight: 1,\n }}\n >\n {name}:\n </Typography>\n <Typography\n sx={{\n fontSize: 14,\n fontWeight: 700,\n color: '#374151',\n lineHeight: 1,\n }}\n >\n {value.toLocaleString()}\n </Typography>\n </Stack>\n </Stack>\n </Box>\n );\n}\n\nexport type QueueTimeBreakdownStackedBarProps = {\n row: QueueTimeBreakdownBarRow;\n /** One entry per segment: percent line + range line (aligned under each slice). */\n legendRows: readonly QueueBucketLegendItem[];\n renderTooltip?: (\n context: QueueTimeBreakdownStackedBarTooltipRenderContext\n ) => ReactNode;\n};\n\nexport type QueueTimeBreakdownStackedBarTooltipRenderContext = {\n row: QueueTimeBreakdownBarRow;\n segmentIndex: number;\n percent: number;\n count: number;\n color: string;\n};\n\n/**\n * Custom horizontal 100% stacked bar — slim pill with rounded ends.\n * Segments are individually hoverable with MUI tooltips.\n */\nexport function QueueTimeBreakdownStackedBar({\n row,\n legendRows,\n renderTooltip,\n}: QueueTimeBreakdownStackedBarProps): React.ReactElement {\n const { chartPalette, stackedBar: sb } = useQueueTimeBreakdownCustomization();\n const palette =\n chartPalette && chartPalette.length > 0 ? chartPalette : QUEUE_CHART_COLORS;\n\n const rawValues = React.useMemo(\n () => row.data.map(seg => Math.max(0, seg.data[0] ?? 0)),\n [row.data]\n );\n const total = React.useMemo(\n () => rawValues.reduce((a, b) => a + b, 0) || 1,\n [rawValues]\n );\n const pcts = React.useMemo(\n () => rawValues.map(v => (v / total) * 100),\n [rawValues, total]\n );\n\n const h = sb?.barThicknessPx ?? Math.max(14, QUEUE_STACKED_BAR_THICKNESS_PX);\n const isAllZero = rawValues.every(v => v === 0);\n const emptySegments =\n legendRows.length > 0\n ? legendRows\n : row.data.map((d, i) => ({\n label: d.name,\n percent: '0%',\n color: palette[i % palette.length],\n }));\n\n return (\n <Stack spacing={0} sx={{ width: '100%', mb: 1.5 }}>\n <Box\n sx={{\n width: '100%',\n height: h,\n display: 'flex',\n overflow: 'hidden',\n borderRadius: 0,\n }}\n >\n {isAllZero ? (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n bgcolor: '#E5E7EB',\n }}\n />\n ) : (\n pcts.map((p, i) => {\n if (p <= 0) return null;\n const color = palette[i % palette.length];\n const segName = legendRows[i]?.label ?? row.data[i]?.name ?? '';\n const count = rawValues[i];\n const pctStr = p.toFixed(1);\n\n return (\n <Tooltip\n key={`seg-${row.name}-${i}`}\n title={\n renderTooltip ? (\n renderTooltip({\n row,\n segmentIndex: i,\n percent: p,\n count,\n color,\n })\n ) : (\n <SegmentTooltip\n name={segName}\n value={count}\n pct={pctStr}\n color={color}\n />\n )\n }\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: segmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n width: `${p}%`,\n height: '100%',\n bgcolor: color,\n cursor: 'pointer',\n transition: 'opacity 0.2s',\n '&:hover': {\n opacity: 0.85,\n },\n }}\n />\n </Tooltip>\n );\n })\n )}\n </Box>\n\n <Box\n sx={mergeSx(\n {\n display: 'flex',\n flexDirection: 'row',\n width: '100%',\n mt: 2,\n alignItems: 'flex-start',\n },\n sb?.labelRowContainerSx\n )}\n >\n {isAllZero\n ? emptySegments.map((seg, i) => {\n const labelText = seg.label ?? row.data[i]?.name ?? '';\n const sharePct = 100 / emptySegments.length;\n\n return (\n <Box\n key={`empty-lbl-${row.name}-${i}`}\n sx={mergeSx(\n {\n flex: `0 0 ${sharePct}%`,\n minWidth: 0,\n maxWidth: `${sharePct}%`,\n px: 0.75,\n textAlign: 'center',\n overflow: 'hidden',\n },\n sb?.segmentBoxSx\n )}\n >\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(13px, 1.2vw, 20px)',\n fontWeight: 700,\n color: '#7A7F87',\n lineHeight: 1.15,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelPercentSx\n )}\n >\n 0 (0%)\n </Typography>\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(9px, 0.9vw, 11px)',\n fontWeight: 600,\n color: '#7A7F87',\n lineHeight: 1.25,\n mt: 0.4,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelRangeSx\n )}\n >\n {labelText}\n </Typography>\n </Box>\n );\n })\n : pcts.map((p, i) => {\n const leg = legendRows[i];\n const labelText = leg?.label ?? row.data[i]?.name ?? '';\n const countValue = rawValues[i];\n const sharePct = 100 / pcts.length;\n\n let displayText: string;\n if (countValue <= 0) {\n displayText = '0';\n } else {\n const pctText = leg?.percent ?? `${Math.round(p)}%`;\n const countText = new Intl.NumberFormat('en-US').format(\n countValue\n );\n displayText = `${countText} (${pctText})`;\n }\n\n return (\n <Box\n key={`lbl-${row.name}-${i}`}\n title={`${displayText} ${labelText}`.trim()}\n sx={mergeSx(\n {\n flex: `0 0 ${sharePct}%`,\n minWidth: 0,\n maxWidth: `${sharePct}%`,\n px: 0.75,\n textAlign: 'center',\n overflow: 'hidden',\n },\n sb?.segmentBoxSx\n )}\n >\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(13px, 1.2vw, 20px)',\n fontWeight: 700,\n color: '#7A7F87',\n lineHeight: 1.15,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelPercentSx\n )}\n >\n {displayText}\n </Typography>\n <Typography\n sx={mergeSx(\n {\n fontSize: 'clamp(9px, 0.9vw, 11px)',\n fontWeight: 600,\n color: '#7A7F87',\n lineHeight: 1.25,\n mt: 0.4,\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n sb?.labelRangeSx\n )}\n >\n {labelText}\n </Typography>\n </Box>\n );\n })}\n </Box>\n </Stack>\n );\n}\n","import type { QueueTimeBreakdownBarRow } from './QueueTimeBreakdown.types';\n\nconst ageGroups = [\n '0-20 years old (male)',\n '21-45 years old (male)',\n '46-60 years old (male)',\n '60+ years old (male)',\n] as const;\n\nconst storeList = ['Max Indonesia'] as const;\n\n/** Demo data for Storybook / prototyping. */\nexport function generateMockPerformanceData(): QueueTimeBreakdownBarRow[] {\n const data: QueueTimeBreakdownBarRow[] = [];\n\n storeList.forEach(store => {\n data.push({\n name: store,\n data: ageGroups.map(age => ({\n name: age,\n data: [Math.floor(Math.random() * 1000)],\n })),\n total: Math.floor(Math.random() * 10000),\n });\n });\n\n return data;\n}\n","'use client';\n\nimport { Icon } from '@iconify/react';\nimport {\n Box,\n Button,\n IconButton,\n Paper,\n Skeleton,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { ResponsiveContainer, Treemap } from 'recharts';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport type {\n FootFallHeatMapIconColor,\n FootFallHeatMapIconSize,\n FootFallHeatMapIconSizeContext,\n FootFallHeatMapKpiStripPresentation,\n FootFallHeatMapKpiStripSegmentTooltipRenderContext,\n FootFallHeatMapTileIconRole,\n FootFallHeatMapViewProps,\n} from './FootFallHeatMapView.types';\nimport { DEFAULT_FOOTFALL_TILE_ICONS } from './FootFallHeatMapView.types';\nimport {\n deriveFootfallHeatMapKpiStrip,\n type FootfallHeatMapDerivedStrip,\n} from './footfallHeatMapDerivedStrip';\nimport {\n buildTreemapNodes,\n createTreemapTileColorResolver,\n getNestedList,\n hashColor,\n parseMinutes,\n parseZoneKpiStripFromRaw,\n preprocessData,\n skipSingleBranchLevels,\n type TreemapNode,\n type ZoneAnalyticsFlatItem,\n type ZoneAnalyticsHierarchy,\n} from './footfallHeatMapTree';\n\nexport type {\n FootFallHeatMapKpiStripPresentation,\n FootFallHeatMapKpiSummaryCardItem,\n FootFallHeatMapSummaryKpis,\n FootFallHeatMapViewProps,\n} from './FootFallHeatMapView.types';\n\ninterface DataShape {\n previous: TreemapNode[][];\n current: TreemapNode[];\n}\n\ntype RankedStripItem =\n FootfallHeatMapDerivedStrip['rankedBarList']['items'][number];\ntype RankedStripSegment = NonNullable<RankedStripItem['segments']>[number];\n\nfunction toDisplayNumber(value: number): string {\n if (!Number.isFinite(value)) return '0';\n return new Intl.NumberFormat('en-IN').format(value);\n}\n\nfunction resolveSegmentFill(\n presentation: FootFallHeatMapKpiStripPresentation | undefined,\n segmentIndex: number,\n dataColor: string | undefined\n): string {\n const palette = presentation?.segmentColors;\n if (palette && palette.length > 0) {\n return palette[segmentIndex % palette.length] ?? dataColor ?? '#90A4AE';\n }\n return dataColor ?? '#90A4AE';\n}\n\nfunction InlineStatCard({\n icon,\n title,\n value,\n sx,\n iconColor = '#1565C0',\n}: {\n icon: string;\n title: string;\n value: number;\n sx?: SxProps<Theme>;\n iconColor?: string;\n}) {\n return (\n <Paper\n elevation={0}\n sx={\n [\n {\n bgcolor: '#fff',\n border: '1px solid #E0E0E0',\n borderRadius: 2,\n p: 1.5,\n minWidth: 180,\n flex: '1 1 240px',\n maxWidth: 340,\n },\n ...(sx ? [sx] : []),\n ] as SxProps<Theme>\n }\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.5}>\n <Icon\n icon={icon}\n width={28}\n height={28}\n color={iconColor}\n style={{ flexShrink: 0 }}\n />\n <Stack spacing={0.15}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 500, color: 'text.primary' }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"h6\"\n sx={{ lineHeight: 1.1, fontWeight: 700, color: 'text.primary' }}\n >\n {toDisplayNumber(value)}\n </Typography>\n </Stack>\n </Stack>\n </Paper>\n );\n}\n\nfunction InlineSegmentStrip({\n item,\n scaleTotal,\n presentation,\n}: {\n item: RankedStripItem;\n scaleTotal: number;\n presentation?: FootFallHeatMapKpiStripPresentation;\n}) {\n const segments = item.segments ?? [];\n const lastIdx = segments.length - 1;\n const segmentTotal = segments.reduce((sum, seg) => sum + seg.value, 0);\n const total = item.value > 0 ? item.value : segmentTotal;\n const scaleBase = scaleTotal > 0 ? scaleTotal : total;\n const filledPercent = Math.max(\n 0,\n Math.min(100, scaleBase > 0 ? (total / scaleBase) * 100 : 0)\n );\n const barHeight = presentation?.barHeight ?? 12;\n const trackInsetPx = presentation?.trackInsetPx ?? 3;\n const trackBg = presentation?.trackBackgroundColor ?? '#ECEFF3';\n return (\n <Stack spacing={0.75}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={1}\n >\n <Typography\n variant=\"subtitle2\"\n sx={\n [\n { fontWeight: 700 },\n ...(presentation?.segmentTitleSx\n ? [presentation.segmentTitleSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {item.label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={\n [\n { fontWeight: 700, color: 'text.secondary' },\n ...(presentation?.segmentValueSx\n ? [presentation.segmentValueSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {toDisplayNumber(item.value)}\n </Typography>\n </Stack>\n <Box\n sx={{\n width: '100%',\n height: barHeight,\n borderRadius: 999,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'stretch',\n backgroundColor: trackBg,\n px: `${trackInsetPx}px`,\n boxSizing: 'border-box',\n }}\n >\n {segments.map((segment, idx) => {\n const widthPercent =\n total > 0 ? (segment.value / total) * filledPercent : 0;\n const isLast = idx === lastIdx;\n const fill = resolveSegmentFill(presentation, idx, segment.color);\n return (\n <Tooltip\n key={segment.id}\n title={(() => {\n if (presentation?.renderSegmentTooltip) {\n const custom = presentation.renderSegmentTooltip({\n segment,\n segmentIndex: idx,\n itemLabel: item.label,\n itemValue: item.value,\n } satisfies FootFallHeatMapKpiStripSegmentTooltipRenderContext);\n return custom == null ? '' : custom;\n }\n return (\n <InlineSegmentTooltipCard\n segment={segment}\n dotColor={fill}\n cardSx={presentation?.segmentTooltipCardSx}\n />\n );\n })()}\n enterTouchDelay={0}\n slotProps={{\n tooltip: {\n sx: inlineSegmentTooltipPopperSx,\n },\n }}\n >\n <Box\n sx={{\n width: `${Math.max(0, widthPercent)}%`,\n backgroundColor: fill,\n minWidth: segment.value > 0 ? 3 : 0,\n cursor: 'pointer',\n borderTopLeftRadius: idx === 0 ? 999 : 0,\n borderBottomLeftRadius: idx === 0 ? 999 : 0,\n borderTopRightRadius: isLast ? 999 : 0,\n borderBottomRightRadius: isLast ? 999 : 0,\n }}\n />\n </Tooltip>\n );\n })}\n </Box>\n </Stack>\n );\n}\n\n/** Match the segmented tooltip shell used in RankedBarList. */\nconst inlineSegmentTooltipPopperSx: SxProps<Theme> = {\n p: 0,\n m: 0,\n bgcolor: 'transparent',\n boxShadow: 'none',\n border: 'none',\n maxWidth: 'none',\n};\n\nconst inlineSegmentTooltipCardSx: SxProps<Theme> = {\n maxWidth: 280,\n bgcolor: '#fff',\n borderRadius: 1,\n border: '1px solid #E8E8E8',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n overflow: 'hidden',\n};\n\nfunction InlineSegmentTooltipCard({\n segment,\n dotColor,\n cardSx,\n}: {\n segment: RankedStripSegment;\n dotColor: string;\n cardSx?: SxProps<Theme>;\n}): React.ReactElement {\n const tooltipSurfaceSx = cardSx\n ? ([inlineSegmentTooltipCardSx, cardSx] as SxProps<Theme>)\n : inlineSegmentTooltipCardSx;\n return (\n <Box sx={tooltipSurfaceSx}>\n <Box sx={{ height: 3, bgcolor: 'grey.200', width: '100%' }} />\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n columnGap: 0.5,\n rowGap: 0.5,\n px: 1.5,\n py: 1.25,\n }}\n >\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: dotColor,\n flexShrink: 0,\n }}\n />\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {segment.label}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {' : '}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1.35,\n color: 'text.primary',\n }}\n >\n {toDisplayNumber(segment.value)}\n </Typography>\n </Box>\n </Box>\n );\n}\n\nfunction FootfallHeatMapKpiRankedBlock({\n strip,\n stackSx,\n presentation,\n}: {\n strip: FootfallHeatMapDerivedStrip;\n stackSx?: SxProps<Theme>;\n presentation?: FootFallHeatMapKpiStripPresentation;\n}) {\n const { summaryKpis, rankedBarList } = strip;\n const scaleTotal = Math.max(\n summaryKpis.overallVisitors,\n ...rankedBarList.items.map(item => item.value)\n );\n const statIcon = presentation?.statCardIconColor ?? '#1565C0';\n const customSummary = presentation?.summaryCards?.(summaryKpis);\n const useCustomSummary = customSummary !== undefined;\n\n return (\n <Stack\n spacing={2}\n sx={\n [\n { width: '100%' },\n ...(stackSx ? [stackSx] : []),\n ...(presentation?.kpiContainerSx\n ? [presentation.kpiContainerSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {useCustomSummary && customSummary.length === 0 ? null : (\n <Stack\n direction=\"row\"\n spacing={1.5}\n flexWrap=\"wrap\"\n useFlexGap\n sx={\n presentation?.summaryRowSx\n ? ([presentation.summaryRowSx] as SxProps<Theme>)\n : undefined\n }\n >\n {useCustomSummary\n ? customSummary.map(card => (\n <InlineStatCard\n key={card.id}\n icon={card.icon ?? 'mdi:chart-box-outline'}\n title={card.title}\n value={card.value}\n sx={\n [presentation?.statCardSx, card.sx].filter(\n Boolean\n ) as SxProps<Theme>\n }\n iconColor={card.iconColor ?? statIcon}\n />\n ))\n : [\n <InlineStatCard\n key=\"default-stores\"\n icon=\"mdi:store-marker-outline\"\n title=\"No. of Stores\"\n value={summaryKpis.storeCount}\n sx={presentation?.statCardSx}\n iconColor={statIcon}\n />,\n <InlineStatCard\n key=\"default-visitors\"\n icon=\"fluent:people-community-16-filled\"\n title=\"Overall Visitors\"\n value={summaryKpis.overallVisitors}\n sx={presentation?.statCardSx}\n iconColor={statIcon}\n />,\n ]}\n </Stack>\n )}\n <Stack\n spacing={1.25}\n sx={\n [\n { pt: 0.5, pb: 1 },\n ...(presentation?.rankedListStackSx\n ? [presentation.rankedListStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {rankedBarList.items.map(item => (\n <InlineSegmentStrip\n key={item.id}\n item={item}\n scaleTotal={scaleTotal}\n presentation={presentation}\n />\n ))}\n </Stack>\n </Stack>\n );\n}\n\ntype HierarchyLevel = 'Country' | 'Region' | 'State' | 'City';\nconst HIERARCHY_LEVELS: readonly HierarchyLevel[] = [\n 'Country',\n 'Region',\n 'State',\n 'City',\n] as const;\n\nfunction collectNodesAtDepth(\n nodes: TreemapNode[],\n depth: number\n): TreemapNode[] {\n if (depth <= 0) return nodes;\n return nodes.flatMap(node => collectNodesAtDepth(node.list ?? [], depth - 1));\n}\n\nfunction normalizeNodePercentages(nodes: TreemapNode[]): TreemapNode[] {\n const totalRaw = nodes.reduce((sum, node) => sum + (node._raw ?? 0), 0) || 1;\n return nodes.map(node => {\n const raw = node._raw ?? 0;\n const pct = (raw / totalRaw) * 100;\n return {\n ...node,\n value: pct,\n originalValue: pct,\n };\n });\n}\n\nfunction parseStartPath(path?: string | string[] | null): string[] {\n if (!path) return [];\n const raw = Array.isArray(path) ? path : String(path).split('/');\n return raw.map(segment => String(segment).trim()).filter(Boolean);\n}\n\nfunction scopeNodesByPath(\n rootNodes: TreemapNode[],\n startFromPath?: string | string[] | null,\n mode: 'children' | 'self' = 'children'\n): TreemapNode[] | null {\n const segments = parseStartPath(startFromPath);\n if (segments.length === 0) return null;\n\n let current = rootNodes;\n let matched: TreemapNode | undefined;\n\n for (const segment of segments) {\n const key = segment.toLowerCase();\n matched = current.find(\n node => String(node.name).trim().toLowerCase() === key\n );\n if (!matched) return null;\n current = matched.list ?? [];\n }\n\n if (!matched) return null;\n\n if (mode === 'self') {\n return normalizeNodePercentages([matched]);\n }\n\n if ((matched.list ?? []).length > 0) {\n return normalizeNodePercentages(matched.list);\n }\n\n return normalizeNodePercentages([matched]);\n}\n\nfunction buildRootNodesFromInitial(\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[],\n sortBy: 'walkins' | 'dwell',\n startFromLevel: HierarchyLevel,\n startFromPath: string | string[] | undefined,\n startFromPathMode: 'children' | 'self',\n tileColorFromSeed: (seed: string) => string\n): TreemapNode[] {\n if (Array.isArray(initialData)) {\n const items = initialData as ZoneAnalyticsFlatItem[];\n const total =\n items.reduce(\n (sum, it) =>\n sum +\n (sortBy === 'walkins'\n ? it.visitor_count\n : parseMinutes(it.avg_dwell_time)),\n 0\n ) || 1;\n\n return items.map(it => {\n const raw =\n sortBy === 'walkins'\n ? it.visitor_count\n : parseMinutes(it.avg_dwell_time);\n const percentage = (raw / total) * 100;\n\n return {\n name: it.category_name,\n value: percentage,\n originalValue: percentage,\n color: tileColorFromSeed(`flat/${it.category_id}`),\n overallData: { count: it.visitor_count, dwell: it.avg_dwell_time },\n list: [],\n leafMetrics: undefined,\n zoneKpiStrip: parseZoneKpiStripFromRaw(\n it as unknown as Record<string, unknown>\n ),\n _raw: raw,\n };\n });\n }\n\n const hierarchical = initialData as ZoneAnalyticsHierarchy;\n const topContainer =\n (hierarchical?.Country && {\n key: 'Country' as const,\n container: hierarchical.Country,\n }) ||\n (hierarchical?.Region && {\n key: 'Region' as const,\n container: hierarchical.Region,\n }) ||\n (hierarchical?.State && {\n key: 'State' as const,\n container: hierarchical.State,\n }) ||\n (hierarchical?.City && {\n key: 'City' as const,\n container: hierarchical.City,\n }) ||\n null;\n\n if (!topContainer) return [];\n\n const builtRoot = buildTreemapNodes({\n container: topContainer.container as Record<string, unknown>,\n sortBy,\n pathKey: topContainer.key,\n tileColorFromSeed,\n });\n\n const scopedNodes = scopeNodesByPath(\n builtRoot,\n startFromPath,\n startFromPathMode\n );\n if (scopedNodes) return scopedNodes;\n\n const topIdx = HIERARCHY_LEVELS.indexOf(topContainer.key);\n const startIdx = HIERARCHY_LEVELS.indexOf(startFromLevel);\n if (topIdx === -1 || startIdx === -1 || startIdx <= topIdx) {\n return builtRoot;\n }\n\n const depthDelta = startIdx - topIdx;\n const collected = collectNodesAtDepth(builtRoot, depthDelta);\n return normalizeNodePercentages(collected);\n}\n\nfunction resolveIconSize(\n prop: FootFallHeatMapIconSize | undefined,\n ctx: FootFallHeatMapIconSizeContext\n): number {\n if (prop === undefined || prop === 'auto') {\n return Math.max(8, ctx.baseIconSize);\n }\n if (typeof prop === 'number') {\n return Math.max(8, prop);\n }\n return Math.max(8, prop(ctx));\n}\n\nfunction resolveIconColor(\n prop: FootFallHeatMapIconColor | undefined,\n tileColor: string,\n role: FootFallHeatMapTileIconRole\n): string {\n const p = prop ?? 'tile';\n if (p === 'tile') {\n if (role === 'header') return '#757575';\n return tileColor;\n }\n if (typeof p === 'string') return p;\n return p({ tileColor, role });\n}\n\n/**\n * In-store zone treemap with drill-down and leaf KPIs. Pass `initialData` from your API or mocks.\n */\nexport function FootFallHeatMapView({\n initialData,\n isLoading = false,\n isFetching = false,\n error,\n title = 'In-Store Zone Performance',\n infoTooltip = 'How different sections or product zones perform by traffic share. Block size = share of activity.',\n brandLabel = 'Reliance Digital',\n icons: iconsProp,\n iconSize: iconSizeProp,\n iconColor: iconColorProp,\n headerInfoIconSize = 22,\n treemap: treemapProp,\n tree: treeProp,\n kpiStrip: kpiStripPresentation,\n emptyStatePlaceholderProps,\n onPathChange,\n}: FootFallHeatMapViewProps) {\n const sortBy = treeProp?.sortBy ?? 'walkins';\n const startFromLevel = treeProp?.startFromLevel ?? 'Region';\n const startFromPath = treeProp?.startFromPath;\n const startFromPathMode = treeProp?.startFromPathMode ?? 'children';\n const terminalNodeView = treeProp?.terminalNodeView ?? 'details';\n const collapseSingleChildLevels =\n treeProp?.collapseSingleChildLevels ?? false;\n const customBuildNodes = treeProp?.buildNodes;\n const icons = { ...DEFAULT_FOOTFALL_TILE_ICONS, ...iconsProp };\n const treemapLayout = {\n heightWithBreadcrumb: treemapProp?.heightWithBreadcrumb ?? 400,\n heightWithoutBreadcrumb: treemapProp?.heightWithoutBreadcrumb ?? 450,\n terminalSingleCardHeight: treemapProp?.terminalSingleCardHeight,\n leafDetailsBodyHeight: treemapProp?.leafDetailsBodyHeight,\n leafDetailsBodySx: treemapProp?.leafDetailsBodySx,\n aspectRatio: treemapProp?.aspectRatio ?? 4 / 3,\n stroke: treemapProp?.stroke ?? '#ffffff',\n fill: treemapProp?.fill ?? '#ffffff',\n tileMetrics: treemapProp?.tileMetrics,\n tileColors: treemapProp?.tileColors,\n };\n const tileMetrics = treemapLayout.tileMetrics;\n const tileColorFromSeed = useMemo(\n () => createTreemapTileColorResolver(treemapLayout.tileColors),\n [treemapLayout.tileColors]\n );\n const [data, setData] = useState<DataShape>({\n previous: [],\n current: [],\n });\n const [showLeaf, setShowLeaf] = useState(false);\n const [trackingDetails, setTrackingDetails] = useState<TreemapNode[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!initialData) {\n setData({ previous: [], current: [] });\n setShowLeaf(false);\n setTrackingDetails([]);\n return;\n }\n\n setLoading(true);\n const built = customBuildNodes\n ? customBuildNodes(initialData, { sortBy, tileColorFromSeed })\n : buildRootNodesFromInitial(\n initialData,\n sortBy,\n startFromLevel,\n startFromPath,\n startFromPathMode,\n tileColorFromSeed\n );\n const rootNodes = collapseSingleChildLevels\n ? skipSingleBranchLevels(built)\n : preprocessData(built);\n setData({ previous: [], current: rootNodes });\n setShowLeaf(false);\n setTrackingDetails([]);\n setLoading(false);\n }, [\n initialData,\n sortBy,\n customBuildNodes,\n collapseSingleChildLevels,\n startFromLevel,\n startFromPath,\n startFromPathMode,\n tileColorFromSeed,\n ]);\n\n const derivedKpiStrip = useMemo(() => {\n if (isLoading || loading || !initialData) return null;\n const activeZoneForStrip: TreemapNode | undefined =\n trackingDetails.length > 0\n ? trackingDetails[trackingDetails.length - 1]\n : undefined;\n return deriveFootfallHeatMapKpiStrip(\n activeZoneForStrip,\n data.current ?? []\n );\n }, [isLoading, loading, initialData, trackingDetails, data]);\n\n const formatPercentage = (value: number) => {\n if (typeof value !== 'number') return '0%';\n const formatted = value.toFixed(2);\n const trimmed = formatted.replace(/\\.?0+$/, '');\n return `${trimmed}%`;\n };\n\n const renderCustomizedContent = (\n props: Record<string, unknown>\n ): React.ReactElement => {\n const x = props.x as number;\n const y = props.y as number;\n const width = props.width as number;\n const height = props.height as number;\n const name = props.name as string;\n const index = props.index as number;\n const payload =\n (props?.payload as TreemapNode & { payload?: TreemapNode }) ?? props;\n const inner = (payload as { payload?: TreemapNode }).payload ?? payload;\n const originalValue =\n (inner as TreemapNode)?.originalValue ??\n data?.current[index]?.originalValue;\n const tileColor =\n (inner as TreemapNode)?.color ??\n (props?.color as string) ??\n (props?.fill as string) ??\n hashColor(String(name ?? index ?? ''));\n\n const handleClick = () => {\n const p = inner as TreemapNode;\n setTrackingDetails(pre => {\n const expectedDepth = data.previous.length;\n const normalizedPath = pre.slice(0, expectedDepth);\n const nextDetails = [...normalizedPath, p];\n onPathChange?.(\n nextDetails.map(t => String(t?.name ?? '').trim()).filter(Boolean)\n );\n return nextDetails;\n });\n\n const nested = getNestedList(p);\n const hasNestedChildren = Boolean(nested?.length);\n const isStoresLevel = p?._childContainerKey === 'Stores';\n const shouldShowDetails =\n terminalNodeView === 'details' && (!hasNestedChildren || isStoresLevel);\n const shouldDrillDeeper = hasNestedChildren && !shouldShowDetails;\n\n if (shouldDrillDeeper) {\n setShowLeaf(false);\n setData({\n previous: [[...data.current], ...data.previous],\n current: collapseSingleChildLevels\n ? skipSingleBranchLevels(nested ?? [])\n : preprocessData(nested ?? []),\n });\n return;\n }\n\n if (shouldShowDetails) {\n setShowLeaf(true);\n setData({\n previous: [[...data.current], ...data.previous],\n current: [],\n });\n return;\n }\n\n const alreadyFocusedTerminalTile =\n !hasNestedChildren &&\n data.current.length === 1 &&\n String(data.current[0]?.name ?? '') === String(p?.name ?? '');\n if (alreadyFocusedTerminalTile) return;\n\n setShowLeaf(false);\n setData({\n previous: [[...data.current], ...data.previous],\n current: preprocessData([p]),\n });\n };\n\n const minDim = Math.min(width, height);\n const effectiveDim = Math.sqrt(width * height);\n const isLarge = minDim > 200;\n const isSmall = minDim <= 120;\n\n const fontSize = Math.max(11, Math.min(24, Math.floor(effectiveDim * 0.1)));\n const baseIconSize = Math.max(10, fontSize - 2);\n const padding = Math.max(0.5, Math.min(3, minDim * 0.015));\n\n const sizeCtx = (\n role: FootFallHeatMapTileIconRole\n ): FootFallHeatMapIconSizeContext => ({\n baseIconSize,\n role,\n fontSize,\n minDim,\n effectiveDim,\n });\n\n const visitorsIconPx = resolveIconSize(iconSizeProp, sizeCtx('visitors'));\n const dwellIconPx = resolveIconSize(iconSizeProp, sizeCtx('dwell'));\n const visitorsIconColor = resolveIconColor(\n iconColorProp,\n tileColor,\n 'visitors'\n );\n const dwellIconColor = resolveIconColor(iconColorProp, tileColor, 'dwell');\n\n const p = inner as TreemapNode;\n\n return (\n <foreignObject\n x={x}\n y={y}\n width={width}\n height={height}\n style={{ borderRadius: '12px', overflow: 'hidden' }}\n >\n <Stack\n onClick={handleClick}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') handleClick();\n }}\n role=\"button\"\n tabIndex={0}\n sx={{\n backgroundColor: tileColor,\n color: '#FFFFFF',\n p: padding,\n textAlign: 'center',\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: isSmall\n ? width > height\n ? 'row'\n : 'column'\n : 'column',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n overflow: 'hidden',\n border: '1px solid #FFFFFF',\n gap: isSmall ? 1 : 2,\n borderRadius: '12px',\n transition: 'transform 0.5s ease-in-out',\n '&:hover': {\n transform: 'scale(1.10)',\n },\n }}\n >\n <Stack\n direction={isSmall ? 'row' : 'column'}\n justifyContent=\"center\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n sx={{\n mb: isSmall ? 0.5 : 1,\n }}\n >\n <Typography\n sx={{\n fontSize: `${fontSize}px!important`,\n fontWeight: 500,\n fontFamily: 'Noto Sans, sans-serif',\n color: '#fff',\n maxWidth: '100%',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n lineHeight: 1.2,\n textAlign: 'center',\n }}\n title={name}\n >\n {name}\n </Typography>\n <Typography\n sx={{\n fontSize: `${fontSize}px!important`,\n fontWeight: '700',\n textAlign: 'center',\n color: '#fff',\n }}\n >\n {formatPercentage(Number(originalValue))}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n sx={\n [\n {\n gap: isSmall ? 0.5 : 1,\n },\n ...(tileMetrics?.metricsRowStackSx != null\n ? [tileMetrics.metricsRowStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n sx={\n [\n {\n backgroundColor: '#f4f4f4',\n color: '#333',\n px: isLarge ? 2 : 1,\n py: isLarge ? 1 : 0.3,\n borderRadius: 10,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n },\n ...(tileMetrics?.metricPillStackSx != null\n ? [tileMetrics.metricPillStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Box\n sx={\n [\n {\n backgroundColor: '#ffff',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n ...(tileMetrics?.metricPillIconBoxSx != null\n ? [tileMetrics.metricPillIconBoxSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Icon\n icon={icons.visitors}\n color={visitorsIconColor}\n fontSize={visitorsIconPx}\n />\n </Box>\n <Typography\n sx={\n [\n {\n fontSize: `${Math.max(8, fontSize * 0.6)}px !important`,\n fontWeight: 600,\n fontFamily: 'Noto Sans, sans-serif',\n whiteSpace: 'nowrap',\n },\n ...(tileMetrics?.metricPillValueTypographySx != null\n ? [tileMetrics.metricPillValueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {p?.overallData ? p?.overallData.count : ''}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={0.5}\n sx={\n [\n {\n backgroundColor: '#f4f4f4',\n color: '#333',\n px: isLarge ? 2 : 1,\n py: isLarge ? 1 : 0.3,\n borderRadius: 10,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n },\n ...(tileMetrics?.metricPillStackSx != null\n ? [tileMetrics.metricPillStackSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Box\n sx={\n [\n {\n backgroundColor: '#ffff',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n ...(tileMetrics?.metricPillIconBoxSx != null\n ? [tileMetrics.metricPillIconBoxSx]\n : []),\n ] as SxProps<Theme>\n }\n >\n <Icon\n icon={icons.dwell}\n color={dwellIconColor}\n fontSize={dwellIconPx}\n />\n </Box>\n <Typography\n sx={\n [\n {\n fontSize: `${Math.max(8, fontSize * 0.6)}px !important`,\n fontWeight: 600,\n fontFamily: 'Noto Sans, sans-serif',\n whiteSpace: 'nowrap',\n },\n ...(tileMetrics?.metricPillValueTypographySx != null\n ? [tileMetrics.metricPillValueTypographySx]\n : []),\n ] as SxProps<Theme>\n }\n >\n {p?.overallData ? p?.overallData.dwell : ''}\n </Typography>\n </Stack>\n </Stack>\n </Stack>\n </foreignObject>\n );\n };\n\n const handleClose = () => {\n setShowLeaf(false);\n const history = trackingDetails.slice(0, -1);\n setTrackingDetails(history);\n onPathChange?.(\n history.map(t => String(t?.name ?? '').trim()).filter(Boolean)\n );\n const obj1 = {\n current: data.previous[0] ?? [],\n previous: data.previous.slice(1),\n };\n setData(obj1);\n };\n\n const LabelTag = ({ textColor = '#f0f0f0' }: { textColor?: string }) => {\n const pathSegments = trackingDetails\n .map(t => String(t?.name ?? '').trim())\n .filter(Boolean);\n const breadcrumbSegments = Array.from(new Set([...pathSegments].reverse()));\n\n return (\n <Stack direction=\"row\" alignItems=\"baseline\" flexWrap=\"wrap\" gap={1.5}>\n {breadcrumbSegments.length === 0 ? (\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: '12px !important',\n },\n }}\n fontSize={'26px !important'}\n fontWeight={600}\n color={textColor}\n >\n {brandLabel}\n </Typography>\n ) : (\n <>\n {breadcrumbSegments.map((seg, i) => (\n <React.Fragment key={`${seg}-${i}`}>\n {i > 0 ? (\n <Typography\n component=\"span\"\n fontSize={'15px !important'}\n fontWeight={400}\n color={textColor}\n sx={{ px: 0.25 }}\n >\n /\n </Typography>\n ) : null}\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: i === 0 ? '12px !important' : '11px !important',\n },\n }}\n fontSize={i === 0 ? '26px !important' : '15px !important'}\n fontWeight={i === 0 ? 600 : 500}\n color={textColor}\n >\n {seg}\n </Typography>\n </React.Fragment>\n ))}\n {brandLabel ? (\n <>\n <Typography\n component=\"span\"\n fontSize={'15px !important'}\n fontWeight={400}\n color={textColor}\n >\n /\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n '@media (max-width:500px)': {\n fontSize: '11px !important',\n },\n }}\n fontSize={'15px !important'}\n fontWeight={500}\n color={textColor}\n >\n {brandLabel}\n </Typography>\n </>\n ) : null}\n </>\n )}\n </Stack>\n );\n };\n\n const is500Error =\n error !== null &&\n error !== undefined &&\n typeof error === 'object' &&\n 'status' in error &&\n (error as { status: number }).status === 500;\n\n if (is500Error) {\n return (\n <Box sx={{ p: 4, textAlign: 'center' }}>\n <Typography color=\"error\">\n Something went wrong (500). Try again later.\n </Typography>\n </Box>\n );\n }\n\n if (isLoading || loading) {\n return (\n <Skeleton\n variant=\"rectangular\"\n width=\"100%\"\n height={400}\n sx={{ borderRadius: '10px' }}\n />\n );\n }\n\n const showChart = !isLoading && initialData && !loading;\n\n const headerDataForBreadcrumb =\n trackingDetails.length > 0 ? trackingDetails.at(-1) : undefined;\n const headerData = headerDataForBreadcrumb;\n const isDrilledIntoZone = Boolean(\n showChart &&\n data?.previous &&\n data.previous.length > 0 &&\n headerDataForBreadcrumb\n );\n\n const zoneBarColor = headerData?.color ?? '#0A4FCB';\n /** Breadcrumb + % always white on the zone-colored drill bar (design). */\n const zoneBarHeaderFg = '#fff';\n\n const isTerminalSingleCardView = Boolean(\n showChart &&\n !showLeaf &&\n trackingDetails.length > 0 &&\n data.current.length === 1 &&\n !(getNestedList(data.current[0])?.length ?? 0)\n );\n /**\n * `terminalNodeView: \"card\"` keeps a single treemap tile at the leaf — but the zone KPI strip above\n * already shows the same zone name, share %, and breakdown. Omit the treemap to avoid a duplicate\n * “full chart” block (Story: Hierarchical (Terminal card reduced height)).\n */\n const hideTreemapForTerminalCardWithKpi =\n terminalNodeView === 'card' &&\n isTerminalSingleCardView &&\n derivedKpiStrip !== null;\n /** KPI + ranked list: visible for terminal nodes (card/details). Hidden for intermediate drill levels. */\n const showKpiStrip = Boolean(\n showChart && derivedKpiStrip && (showLeaf || isTerminalSingleCardView)\n );\n const showLeafDetailsBody = Boolean(showChart && showLeaf);\n const leafDetailsBodyHeight =\n treemapLayout.leafDetailsBodyHeight ??\n Math.max(180, treemapLayout.heightWithBreadcrumb - 140);\n const treemapHeight = isTerminalSingleCardView\n ? (treemapLayout.terminalSingleCardHeight ??\n treemapLayout.heightWithBreadcrumb)\n : data?.previous?.length > 0\n ? treemapLayout.heightWithBreadcrumb\n : treemapLayout.heightWithoutBreadcrumb;\n const hasTreemapData = (data?.current?.length ?? 0) > 0;\n\n const headerIconPx = resolveIconSize(iconSizeProp, {\n baseIconSize: headerInfoIconSize,\n role: 'header',\n fontSize: 14,\n minDim: 24,\n effectiveDim: headerInfoIconSize,\n });\n const headerIconColorResolved = resolveIconColor(\n iconColorProp,\n '#888888',\n 'header'\n );\n\n return (\n <Stack width=\"100%\">\n <Box\n sx={{\n width: '100%',\n mb: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n }}\n >\n <Typography variant=\"h6\" fontWeight={700}>\n {title}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\" gap={1}>\n {isFetching ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n Updating…\n </Typography>\n ) : null}\n <Tooltip title={infoTooltip} arrow>\n <IconButton\n size=\"small\"\n aria-label=\"Zone performance info\"\n edge=\"end\"\n >\n <Icon\n icon={icons.headerInfo}\n width={headerIconPx}\n height={headerIconPx}\n color={headerIconColorResolved}\n />\n </IconButton>\n </Tooltip>\n </Stack>\n </Box>\n\n {data?.previous?.length > 0 && headerData ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{\n px: 1.25,\n py: 1,\n mb: 0,\n borderRadius: '10px 10px 0 0',\n color: zoneBarHeaderFg,\n backgroundColor: zoneBarColor,\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <Button\n size=\"small\"\n onClick={handleClose}\n startIcon={\n <Icon\n icon=\"mdi:chevron-left\"\n width={16}\n height={16}\n color={zoneBarColor}\n />\n }\n sx={{\n minWidth: 0,\n color: zoneBarColor,\n bgcolor: '#fff',\n px: 1,\n borderRadius: 999,\n '&:hover': { bgcolor: '#F5F5F5' },\n }}\n >\n Back\n </Button>\n <LabelTag textColor={zoneBarHeaderFg} />\n </Stack>\n <Typography\n variant=\"h6\"\n sx={{ color: zoneBarHeaderFg, fontWeight: 700 }}\n >\n ({formatPercentage(Number(headerData?.originalValue ?? 0))})\n </Typography>\n </Stack>\n ) : null}\n\n {/* KPI + ranked list only in drilled zone (below zone-colored header, above treemap) */}\n {isDrilledIntoZone && showKpiStrip && derivedKpiStrip ? (\n <FootfallHeatMapKpiRankedBlock\n strip={derivedKpiStrip}\n presentation={kpiStripPresentation}\n stackSx={{\n mb: showLeafDetailsBody ? 0 : 2,\n px: 2,\n pt: 2,\n bgcolor: '#fff',\n border: '1px solid #E8E8E8',\n borderTop: 'none',\n borderBottom: showLeafDetailsBody ? 'none' : undefined,\n borderRadius: showLeafDetailsBody ? 0 : '0 0 8px 8px',\n }}\n />\n ) : null}\n\n {showLeafDetailsBody ? (\n <Box\n sx={\n [\n {\n mb: 2,\n bgcolor: '#fff',\n border: '1px solid #E8E8E8',\n borderTop: 'none',\n borderRadius: '0 0 8px 8px',\n minHeight: leafDetailsBodyHeight,\n },\n ...(treemapLayout.leafDetailsBodySx\n ? [treemapLayout.leafDetailsBodySx]\n : []),\n ] as SxProps<Theme>\n }\n />\n ) : null}\n\n {showLeaf ? null : showChart ? (\n hideTreemapForTerminalCardWithKpi ? null : hasTreemapData ? (\n <ResponsiveContainer width=\"100%\" height={treemapHeight}>\n <Treemap\n data={data?.current ?? []}\n dataKey=\"value\"\n stroke={treemapLayout.stroke}\n fill={treemapLayout.fill}\n content={renderCustomizedContent as never}\n isAnimationActive={false}\n aspectRatio={treemapLayout.aspectRatio}\n animationDuration={0}\n style={{ borderRadius: '12px' }}\n />\n </ResponsiveContainer>\n ) : (\n <ChartEmptyState\n minHeight={treemapHeight}\n {...emptyStatePlaceholderProps}\n />\n )\n ) : (\n <ChartEmptyState minHeight={400} {...emptyStatePlaceholderProps} />\n )}\n </Stack>\n );\n}\n\nexport default FootFallHeatMapView;\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\nimport type { ChartEmptyStateProps } from '../../utils/ChartEmptyState';\nimport type {\n FootFallHeatMapTreemapColorCustomization,\n TreemapNode,\n ZoneAnalyticsFlatItem,\n ZoneAnalyticsHierarchy,\n} from './footfallHeatMapTree';\n\nexport const DEFAULT_FOOTFALL_TILE_ICONS = {\n visitors: 'fluent:people-community-16-filled',\n dwell: 'clarity:clock-solid',\n headerInfo: 'mdi:information-outline',\n} as const;\n\nexport type FootFallHeatMapTileIconRole = 'visitors' | 'dwell' | 'header';\n\nexport type FootFallHeatMapIconSizeContext = {\n /** Auto baseline from tile geometry (px). */\n baseIconSize: number;\n role: FootFallHeatMapTileIconRole;\n fontSize: number;\n minDim: number;\n effectiveDim: number;\n};\n\n/** Pixel size or scale from `baseIconSize` / geometry. */\nexport type FootFallHeatMapIconSize =\n | 'auto'\n | number\n | ((ctx: FootFallHeatMapIconSizeContext) => number);\n\n/** `tile` = match tile fill color; otherwise CSS color string or resolver. */\nexport type FootFallHeatMapIconColor =\n | 'tile'\n | string\n | ((ctx: { tileColor: string; role: FootFallHeatMapTileIconRole }) => string);\n\nexport type FootFallHeatMapIcons = {\n /** Iconify id for the visitor count chip in each tile. */\n visitors?: string;\n /** Iconify id for the dwell time chip. */\n dwell?: string;\n /** Iconify id for the title-row info button. */\n headerInfo?: string;\n};\n\n/**\n * Optional `sx` for visitor/dwell **metric chips** inside each treemap `foreignObject` tile\n * (replaces brittle `& foreignObject > .MuiStack-root …` overrides on a parent wrapper).\n */\nexport type FootFallHeatMapTileMetricsCustomization = {\n /** Merged onto the **row** `Stack` that wraps both metric pills (below title / %). */\n metricsRowStackSx?: SxProps<Theme>;\n /** Merged onto each **pill** `Stack` (visitors + dwell) after built-in chip styles. */\n metricPillStackSx?: SxProps<Theme>;\n /** Merged onto the **numeric Typography** inside each pill after built-in styles. */\n metricPillValueTypographySx?: SxProps<Theme>;\n /** Merged onto the **icon circle `Box`** inside each pill after built-in styles. */\n metricPillIconBoxSx?: SxProps<Theme>;\n};\n\nexport type FootFallHeatMapTreemapLayout = {\n /** Pixel height when a breadcrumb strip is visible above the chart. */\n heightWithBreadcrumb?: number;\n /** Pixel height when there is no breadcrumb. */\n heightWithoutBreadcrumb?: number;\n /** Optional pixel height for terminal single-card view (default falls back to `heightWithBreadcrumb`). */\n terminalSingleCardHeight?: number;\n /** Optional pixel height for the blank body below terminal details strip (default: derived from treemap height). */\n leafDetailsBodyHeight?: number;\n /** Recharts treemap aspect ratio (width/height per sector logic). */\n aspectRatio?: number;\n stroke?: string;\n fill?: string;\n /** MUI `sx` merged onto the blank terminal-details body below the KPI strip. */\n leafDetailsBodySx?: SxProps<Theme>;\n /** Per-tile visitor/dwell metric chip styling (merged on real `Stack` / `Typography` / `Box` nodes). */\n tileMetrics?: FootFallHeatMapTileMetricsCustomization;\n /**\n * Treemap tile **fill** tuning: vivid HSL pipeline from **`hashColor(seed)`**, or a full **`tileColorFromSeed`** override.\n * Wired into default **`buildTreemapNodes`** and passed as **`options.tileColorFromSeed`** to **`tree.buildNodes`**.\n */\n tileColors?: FootFallHeatMapTreemapColorCustomization;\n};\n\nexport type FootFallHeatMapTreeOptions = {\n /** Starting hierarchy level shown in treemap for hierarchical payloads. */\n startFromLevel?: 'Country' | 'Region' | 'State' | 'City';\n /**\n * Optional path to a specific hierarchy node to render first.\n * Example: `'India/North'` or `['India', 'North']`.\n * When provided, this takes precedence over `startFromLevel`.\n */\n startFromPath?: string | string[];\n /**\n * `children` (default): render selected node's immediate children.\n * `self`: render only the selected node tile.\n */\n startFromPathMode?: 'children' | 'self';\n /**\n * Behavior at terminal node (no deeper hierarchy, or final Stores level).\n * - `details` (default): compact KPI + segmented detail view (treemap cleared; optional details body below).\n * - `card`: keep drilling into a single treemap tile when there is no zone KPI strip; when a KPI strip is\n * derived for the terminal zone, the duplicate treemap is omitted so only breadcrumb + KPI strip remain.\n */\n terminalNodeView?: 'card' | 'details';\n /** Sort metric when building node weights from API payloads. */\n sortBy?: 'walkins' | 'dwell';\n /**\n * When true, if the root (or a drill level) has exactly one child, the treemap jumps into that child automatically.\n * Default **false** so **Region → State → City** (and other levels) stay visible instead of skipping straight to cities.\n */\n collapseSingleChildLevels?: boolean;\n /**\n * Replace default hierarchy/flat parsing. Return root-level `TreemapNode[]`\n * (each node may nest `list` children).\n */\n buildNodes?: (\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[] | null,\n options: {\n sortBy: 'walkins' | 'dwell';\n /** From **`treemap.tileColors`** — use for tile `color` fields (same resolver as built-in tree). */\n tileColorFromSeed?: (seed: string) => string;\n }\n ) => TreemapNode[];\n};\n\n/** KPI numbers used for the summary row and passed to `summaryCards`. */\nexport type FootFallHeatMapSummaryKpis = {\n storeCount: number;\n overallVisitors: number;\n};\n\n/** One summary KPI card above the segmented bar (Iconify icon + title + value). */\nexport type FootFallHeatMapKpiSummaryCardItem = {\n id: string;\n title: string;\n value: number;\n /** Iconify id. Default `mdi:chart-box-outline`. */\n icon?: string;\n /** Merged after shared `statCardSx`. */\n sx?: SxProps<Theme>;\n /** Per-card icon color; falls back to `statCardIconColor`. */\n iconColor?: string;\n};\n\nexport type FootFallHeatMapKpiStripSegmentTooltipRenderContext = {\n segment: {\n id: string;\n label: string;\n value: number;\n color?: string;\n };\n segmentIndex: number;\n itemLabel: string;\n itemValue: number;\n};\n\n/**\n * Optional styling for the zone KPI block: summary stat cards, outer panel, segmented bar, and tooltips.\n * Segment colors cycle by index when the palette is shorter than the number of segments.\n */\nexport type FootFallHeatMapKpiStripPresentation = {\n /** Override segment fills; cycles when fewer entries than segments. */\n segmentColors?: readonly string[];\n /** Bar height in px. */\n barHeight?: number;\n /** Horizontal padding inside the track in px (inset from rounded caps). */\n trackInsetPx?: number;\n /** Track background behind segments. */\n trackBackgroundColor?: string;\n\n /** Merged onto the outer KPI panel (container under the breadcrumb). Applied after built-in layout styles. */\n kpiContainerSx?: SxProps<Theme>;\n /** Merged onto the summary KPI cards row `Stack` (direction, spacing, wrap). */\n summaryRowSx?: SxProps<Theme>;\n /** Merged onto each summary stat card (`Paper`). */\n statCardSx?: SxProps<Theme>;\n /** Merged onto the ranked-bar-list items `Stack` (spacing between rows, padding). */\n rankedListStackSx?: SxProps<Theme>;\n /** Icon color for both stat cards. Default `#1565C0`. */\n statCardIconColor?: string;\n /** Zone / row title next to the segmented bar. */\n segmentTitleSx?: SxProps<Theme>;\n /** Total value on the right of the segment row. */\n segmentValueSx?: SxProps<Theme>;\n /** Merged onto the segment tooltip card (popover). */\n segmentTooltipCardSx?: SxProps<Theme>;\n /**\n * Full custom renderer for segmented bar tooltips.\n * When provided, default tooltip card layout is skipped.\n */\n renderSegmentTooltip?: (\n context: FootFallHeatMapKpiStripSegmentTooltipRenderContext\n ) => ReactNode;\n\n /**\n * Build any number of summary KPI cards from live zone metrics. When the returned array is **non-empty**,\n * it replaces the default “No. of Stores” / “Overall Visitors” pair. Return `[]` to hide all summary cards.\n */\n summaryCards?: (\n kpi: FootFallHeatMapSummaryKpis\n ) => readonly FootFallHeatMapKpiSummaryCardItem[];\n};\n\nexport type FootFallHeatMapViewProps = {\n initialData: ZoneAnalyticsHierarchy | ZoneAnalyticsFlatItem[] | null;\n isLoading?: boolean;\n isFetching?: boolean;\n error?: unknown;\n title?: string;\n /** Tooltip on the header info icon. */\n infoTooltip?: string;\n /** Shown in the drill breadcrumb after `/` (e.g. store name). */\n brandLabel?: string;\n\n icons?: FootFallHeatMapIcons;\n iconSize?: FootFallHeatMapIconSize;\n iconColor?: FootFallHeatMapIconColor;\n /** Info button icon width/height in px when `iconSize` is `auto` (header role). */\n headerInfoIconSize?: number;\n\n treemap?: FootFallHeatMapTreemapLayout;\n tree?: FootFallHeatMapTreeOptions;\n /**\n * KPI zone UI: optional **`summaryCards(kpi)`** for any number of summary stat cards; segmented bar; outer\n * panel; `statCardSx` / `statCardIconColor`; segment row + tooltip styling.\n */\n kpiStrip?: FootFallHeatMapKpiStripPresentation;\n emptyStatePlaceholderProps?: ChartEmptyStateProps;\n /** Callback fired when the navigation path changes (drill-down or back) */\n onPathChange?: (path: string[]) => void;\n};\n","/**\n * Internal: KPI strip + single segmented bar for the **active zone** (same layout at every drill level).\n * Not part of the public footfall-heat-map API.\n */\n\nimport type {\n RankedBarListItem,\n RankedBarListSegment,\n} from '../RankedBarList/RankedBarList.types';\n\nimport type { TreemapNode, ZoneKpiStripPayload } from './footfallHeatMapTree';\n\nconst ZONE_SEGMENT_COLORS = [\n '#E5735F',\n '#7EB0C2',\n '#F4C20D',\n '#6D6ED7',\n] as const;\nconst DEFAULT_SEGMENT_LABELS: [string, string, string, string] = [\n 'Walk-by',\n 'Browsing',\n 'Engaged',\n 'Converted',\n];\n\nfunction parseVisitorCount(raw: string | number | undefined): number {\n if (typeof raw === 'number' && Number.isFinite(raw)) return raw;\n if (typeof raw === 'string') {\n const n = Number(String(raw).replace(/[^\\d.]/g, ''));\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n}\n\nfunction defaultFourParts(total: number): [number, number, number, number] {\n if (total <= 0) return [0, 0, 0, 0];\n const a = Math.round(total * 0.38);\n const b = Math.round(total * 0.32);\n const c = Math.round(total * 0.2);\n const d = total - a - b - c;\n return [a, b, c, d];\n}\n\nfunction rowFromExplicitStrip(\n zoneName: string,\n strip: ZoneKpiStripPayload\n): RankedBarListItem {\n const id = `zone-strip-${encodeURIComponent(zoneName)}`;\n const segments: RankedBarListSegment[] = strip.segments.map((s, i) => ({\n id: `${id}-seg-${i}`,\n label: s.label,\n value: s.value,\n color: ZONE_SEGMENT_COLORS[i],\n }));\n const value = strip.segments.reduce((sum, s) => sum + s.value, 0);\n return { id, label: zoneName, value, segments };\n}\n\nfunction rowFromHeuristicLabel(\n zoneName: string,\n total: number\n): RankedBarListItem {\n const [a, b, c, d] = defaultFourParts(total);\n const id = `zone-heuristic-${encodeURIComponent(zoneName)}`;\n const segments: RankedBarListSegment[] = [a, b, c, d].map((value, i) => ({\n id: `${id}-seg-${i}`,\n label: DEFAULT_SEGMENT_LABELS[i],\n value,\n color: ZONE_SEGMENT_COLORS[i],\n }));\n return { id, label: zoneName, value: a + b + c + d, segments };\n}\n\nexport type FootfallHeatMapDerivedStrip = {\n summaryKpis: { storeCount: number; overallVisitors: number };\n rankedBarList: {\n title: string;\n items: RankedBarListItem[];\n listHeaderLabel: string;\n valueColumnHeader: string;\n };\n};\n\n/**\n * @param activeZone — Last node in the drill path (the zone you are inside). `undefined` at root.\n * @param childTiles — Sibling tiles shown in the treemap (`data.current`).\n */\nexport function deriveFootfallHeatMapKpiStrip(\n activeZone: TreemapNode | undefined,\n childTiles: TreemapNode[]\n): FootfallHeatMapDerivedStrip | null {\n if (activeZone) {\n const childRowsSource = (activeZone.list ?? []).filter(\n n => parseVisitorCount(n.overallData?.count) > 0\n );\n if (childRowsSource.length > 0) {\n const items = childRowsSource.map(node =>\n rowFromHeuristicLabel(\n node.name,\n parseVisitorCount(node.overallData?.count)\n )\n );\n const overallVisitorsFromChildren = childRowsSource.reduce(\n (sum, node) => sum + parseVisitorCount(node.overallData?.count),\n 0\n );\n const fallbackVisitors = parseVisitorCount(activeZone.overallData?.count);\n const overallVisitors =\n overallVisitorsFromChildren > 0\n ? overallVisitorsFromChildren\n : fallbackVisitors;\n const fromExplicitStoreCount = activeZone.zoneKpiStrip?.storeCount;\n const storeCount =\n fromExplicitStoreCount && fromExplicitStoreCount > 0\n ? fromExplicitStoreCount\n : childRowsSource.length;\n\n return {\n summaryKpis: {\n storeCount,\n overallVisitors:\n activeZone.zoneKpiStrip?.overallVisitors ?? overallVisitors,\n },\n rankedBarList: {\n title: `${activeZone.name} store performance`,\n items,\n listHeaderLabel: 'Store',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n if (activeZone.zoneKpiStrip) {\n const zs = activeZone.zoneKpiStrip;\n return {\n summaryKpis: {\n storeCount: zs.storeCount,\n overallVisitors: zs.overallVisitors,\n },\n rankedBarList: {\n title: 'Zone breakdown',\n items: [rowFromExplicitStrip(activeZone.name, zs)],\n listHeaderLabel: 'Zone',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n const fromNode = parseVisitorCount(activeZone.overallData?.count);\n const fromChildren = childTiles.reduce(\n (s, n) => s + parseVisitorCount(n.overallData?.count),\n 0\n );\n const overallVisitors = fromNode > 0 ? fromNode : fromChildren;\n const storeCount = childTiles.length;\n\n return {\n summaryKpis: { storeCount, overallVisitors },\n rankedBarList: {\n title: 'Zone breakdown',\n items: [rowFromHeuristicLabel(activeZone.name, overallVisitors)],\n listHeaderLabel: 'Zone',\n valueColumnHeader: 'Visitors',\n },\n };\n }\n\n if (!childTiles.length) return null;\n\n const overallVisitors = childTiles.reduce(\n (s, n) => s + parseVisitorCount(n.overallData?.count),\n 0\n );\n const storeCount = childTiles.length;\n\n return {\n summaryKpis: { storeCount, overallVisitors },\n rankedBarList: {\n title: 'Footfall overview',\n items: [rowFromHeuristicLabel('Overview', overallVisitors)],\n listHeaderLabel: 'Scope',\n valueColumnHeader: 'Visitors',\n },\n };\n}\n","/**\n * Treemap data helpers for FootFallHeatMap.\n * Recharts expects nested `children`; our tree uses `list` internally.\n */\n\nexport type ZoneAnalyticsHierarchy = {\n Country?: Record<string, unknown>;\n Region?: Record<string, unknown>;\n State?: Record<string, unknown>;\n City?: Record<string, unknown>;\n};\n\nexport type ZoneAnalyticsFlatItem = {\n category_id: number;\n category_name: string;\n percentage: number;\n visitor_count: number;\n avg_dwell_time: string;\n /** Optional; same shape as hierarchy `zone_kpi_strip` when this row should drive the strip alone. */\n zone_kpi_strip?: Record<string, unknown>;\n};\n\nexport type ZoneAnalyticsMetrics = {\n overall_visits?: number;\n trend?: { direction?: 'up' | 'down'; percentage?: number };\n unique_customer_walkins?: number;\n walkins_trend?: { direction?: 'up' | 'down'; percentage?: number };\n first_visit_count?: number;\n first_visit_trend?: { direction?: 'up' | 'down'; percentage?: number };\n avg_wait_time_per_visitor?: string;\n wait_time_trend?: { direction?: 'up' | 'down'; percentage?: number };\n attended_customers?: number;\n attended_trend?: { direction?: 'up' | 'down'; percentage?: number };\n unattended_customers?: number;\n unattended_trend?: { direction?: 'up' | 'down'; percentage?: number };\n avg_dwell_time?: string;\n dwell_time_trend?: { direction?: 'up' | 'down'; percentage?: number };\n};\n\n/** Optional per-zone KPI + 3-segment bar from API (`zone_kpi_strip` on hierarchy nodes). Same layout at every level; values vary by zone. */\nexport type ZoneKpiStripPayload = {\n storeCount: number;\n overallVisitors: number;\n segments: [\n { label: string; value: number },\n { label: string; value: number },\n { label: string; value: number },\n ];\n};\n\nexport type TreemapNode = {\n name: string;\n value: number;\n originalValue: number;\n color: string;\n overallData: {\n count: number | string;\n dwell: string;\n };\n list: TreemapNode[];\n /** Set when passing to Recharts Treemap (uses `children` for nesting). */\n children?: TreemapNode[];\n leafMetrics?: ZoneAnalyticsMetrics;\n /** When set, KPI strip + single segmented row use these values for this zone (when it is the active drill context). */\n zoneKpiStrip?: ZoneKpiStripPayload;\n _childContainerKey?: string;\n _raw?: number;\n};\n\n/** Recharts Treemap reads `children`, not `list`. */\nexport function toRechartsTreemapData(nodes: TreemapNode[]): TreemapNode[] {\n return nodes.map(n => ({\n ...n,\n children: n.list?.length ? toRechartsTreemapData(n.list) : undefined,\n })) as TreemapNode[];\n}\n\nexport function preprocessData(data: TreemapNode[]): TreemapNode[] {\n if (!data || !Array.isArray(data)) return [];\n\n const processedData = [...data];\n\n const totalValue = processedData.reduce((sum, item) => sum + item.value, 0);\n const threshold = totalValue * 0.05;\n\n return processedData.map(item => ({\n ...item,\n originalValue: item.value,\n value: Math.max(item.value, threshold),\n }));\n}\n\nexport function skipSingleBranchLevels(nodes: TreemapNode[]): TreemapNode[] {\n let currentNodes = preprocessData(nodes);\n let safetyCounter = 0;\n\n while (\n currentNodes.length === 1 &&\n Array.isArray(currentNodes[0]?.list) &&\n currentNodes[0].list.length > 0 &&\n safetyCounter < 10\n ) {\n currentNodes = preprocessData(currentNodes[0].list);\n safetyCounter += 1;\n }\n\n return currentNodes;\n}\n\nexport function parseMinutes(avgDwellTime?: string): number {\n if (!avgDwellTime) return 0;\n\n const m = String(avgDwellTime)\n .trim()\n .match(/([\\d.]+)/);\n\n return m ? Number(m[1]) : 0;\n}\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nexport function getChildContainer(\n node: unknown\n): { key: string; container: Record<string, unknown> } | null {\n if (!isPlainObject(node)) return null;\n\n /** Prefer geographic / org levels in order so Region → State → City stay distinct in the treemap. */\n const preferred = ['Region', 'State', 'City', 'Stores', 'Zones'];\n for (const k of preferred) {\n if (isPlainObject(node[k]))\n return { key: k, container: node[k] as Record<string, unknown> };\n }\n\n for (const [k, v] of Object.entries(node)) {\n if (\n [\n 'total_footfall',\n 'avg_dwell_time',\n 'data',\n 'zone_kpi_strip',\n 'zoneKpiStrip',\n ].includes(k)\n )\n continue;\n if (isPlainObject(v)) return { key: k, container: v };\n }\n\n return null;\n}\n\nexport function metricForNode(\n node: unknown,\n sortBy: 'walkins' | 'dwell'\n): number {\n if (!node) return 0;\n const n = node as Record<string, unknown>;\n const data = n.data as Record<string, unknown> | undefined;\n if (data?.overall_visits != null) {\n return sortBy === 'walkins'\n ? Number(data.overall_visits)\n : parseMinutes(data.avg_dwell_time as string);\n }\n\n if (n.total_footfall != null) {\n return sortBy === 'walkins'\n ? Number(n.total_footfall)\n : parseMinutes(n.avg_dwell_time as string);\n }\n\n if (n.visitor_count != null) {\n return sortBy === 'walkins'\n ? Number(n.visitor_count)\n : parseMinutes(n.avg_dwell_time as string);\n }\n\n return 0;\n}\n\n/** Read optional `zone_kpi_strip` / `zoneKpiStrip` from a hierarchy or flat API node. */\nexport function parseZoneKpiStripFromRaw(\n node: Record<string, unknown>\n): ZoneKpiStripPayload | undefined {\n const raw = node.zone_kpi_strip ?? node.zoneKpiStrip;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n const r = raw as Record<string, unknown>;\n const storeCount = Number(r.store_count ?? r.storeCount);\n const overallVisitors = Number(r.overall_visitors ?? r.overallVisitors);\n const segRaw = r.segments;\n if (!Array.isArray(segRaw) || segRaw.length !== 3) return undefined;\n const triple = segRaw.map((item, i) => {\n const o = item as Record<string, unknown>;\n return {\n label: String(o.label ?? `Segment ${i + 1}`),\n value: Number(o.value ?? 0),\n };\n });\n if (\n !Number.isFinite(storeCount) ||\n !Number.isFinite(overallVisitors) ||\n triple.some(t => !Number.isFinite(t.value))\n ) {\n return undefined;\n }\n return {\n storeCount,\n overallVisitors,\n segments: [triple[0], triple[1], triple[2]],\n };\n}\n\nexport function hashColor(seed: string): string {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) >>> 0;\n\n const r = 80 + (h & 0x7f);\n const g = 80 + ((h >> 7) & 0x7f);\n const b = 80 + ((h >> 14) & 0x7f);\n\n const toHex = (x: number) => x.toString(16).padStart(2, '0');\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex.trim());\n if (!m) return null;\n\n return {\n r: parseInt(m[1], 16),\n g: parseInt(m[2], 16),\n b: parseInt(m[3], 16),\n };\n}\n\nfunction rgbToHsl(\n r: number,\n g: number,\n b: number\n): { h: number; s: number; l: number } {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rn:\n h = (gn - bn) / d + (gn < bn ? 6 : 0);\n break;\n case gn:\n h = (bn - rn) / d + 2;\n break;\n default:\n h = (rn - gn) / d + 4;\n }\n h /= 6;\n }\n\n return { h, s, l };\n}\n\nfunction hslToRgb(\n h: number,\n s: number,\n l: number\n): {\n r: number;\n g: number;\n b: number;\n} {\n let r: number;\n let g: number;\n let b: number;\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const hue2rgb = (t: number) => {\n let x = t;\n if (x < 0) x += 1;\n if (x > 1) x -= 1;\n if (x < 1 / 6) return p + (q - p) * 6 * x;\n if (x < 1 / 2) return q;\n if (x < 2 / 3) return p + (q - p) * (2 / 3 - x) * 6;\n\n return p;\n };\n r = hue2rgb(h + 1 / 3);\n g = hue2rgb(h);\n b = hue2rgb(h - 1 / 3);\n }\n\n return {\n r: Math.round(Math.min(255, Math.max(0, r * 255))),\n g: Math.round(Math.min(255, Math.max(0, g * 255))),\n b: Math.round(Math.min(255, Math.max(0, b * 255))),\n };\n}\n\n/**\n * Optional treemap tile fill: **vivid** HSL tuning from **`hashColor(seed)`**, or a full **`tileColorFromSeed`** override.\n * Pass **`treemap.tileColors`** on **`FootFallHeatMapView`**, or use **`createTreemapTileColorResolver`** inside **`tree.buildNodes`**.\n */\nexport type FootFallHeatMapTreemapColorCustomization = {\n /** Replace the built-in vivid / hash pipeline entirely. */\n tileColorFromSeed?: (seed: string) => string;\n /** Multiply base saturation after conversion to HSL. @default **1.48** */\n saturationBoost?: number;\n /** Added after boost; result is clamped to **1**. @default **0.1** */\n saturationFloor?: number;\n /** Clamp lightness lower bound (**0–1**). @default **0.38** */\n lightnessClampMin?: number;\n /** Clamp lightness upper bound (**0–1**). @default **0.55** */\n lightnessClampMax?: number;\n /** Scale base lightness from hash before clamp. @default **0.96** */\n lightnessScale?: number;\n /** Offset after scale. @default **0.02** */\n lightnessOffset?: number;\n};\n\n/**\n * - **`undefined` / `null`** → **`hashColor`** only.\n * - **`{ tileColorFromSeed }`** → use that resolver.\n * - **Any other object** (including **`{}`**) → vivid HSL pipeline with defaults merged from **`customization`**.\n */\nexport function createTreemapTileColorResolver(\n customization?: FootFallHeatMapTreemapColorCustomization | null\n): (seed: string) => string {\n if (customization?.tileColorFromSeed) {\n return customization.tileColorFromSeed;\n }\n if (customization == null) {\n return (seed: string) => hashColor(seed);\n }\n\n const saturationBoost = customization.saturationBoost ?? 1.48;\n const saturationFloor = customization.saturationFloor ?? 0.1;\n const lightnessClampMin = customization.lightnessClampMin ?? 0.38;\n const lightnessClampMax = customization.lightnessClampMax ?? 0.55;\n const lightnessScale = customization.lightnessScale ?? 0.96;\n const lightnessOffset = customization.lightnessOffset ?? 0.02;\n\n return (seed: string) => {\n const base = hashColor(seed);\n const rgb = hexToRgb(base);\n if (!rgb) return base;\n const { h, s: s0, l: l0 } = rgbToHsl(rgb.r, rgb.g, rgb.b);\n const s = Math.min(1, s0 * saturationBoost + saturationFloor);\n const l = Math.min(\n lightnessClampMax,\n Math.max(lightnessClampMin, l0 * lightnessScale + lightnessOffset)\n );\n const out = hslToRgb(h, s, l);\n const hx = (n: number) => n.toString(16).padStart(2, '0');\n\n return `#${hx(out.r)}${hx(out.g)}${hx(out.b)}`;\n };\n}\n\nexport function buildTreemapNodes({\n container,\n sortBy,\n pathKey,\n tileColorFromSeed,\n}: {\n container: Record<string, unknown>;\n sortBy: 'walkins' | 'dwell';\n pathKey: string;\n /** When set, used for `color`; otherwise **`hashColor(\\`${pathKey}/${name}\\`)`**. */\n tileColorFromSeed?: (seed: string) => string;\n}): TreemapNode[] {\n const entries = Object.entries(container);\n const total =\n entries.reduce((sum, [, v]) => sum + metricForNode(v, sortBy), 0) || 1;\n\n return entries.map(([name, node]): TreemapNode => {\n const raw = metricForNode(node, sortBy);\n const percentage = (raw / total) * 100;\n const seed = `${pathKey}/${name}`;\n const color = tileColorFromSeed ? tileColorFromSeed(seed) : hashColor(seed);\n\n const childContainer = getChildContainer(node);\n const n = node as Record<string, unknown>;\n const leafMetrics: ZoneAnalyticsMetrics | undefined = n?.data\n ? (n.data as ZoneAnalyticsMetrics)\n : undefined;\n const dataMetrics = n?.data as ZoneAnalyticsMetrics | undefined;\n const countRaw =\n n?.total_footfall ?? n?.visitor_count ?? dataMetrics?.overall_visits ?? 0;\n const zoneKpiStrip = parseZoneKpiStripFromRaw(n);\n\n return {\n name,\n value: percentage,\n originalValue: percentage,\n color,\n overallData: {\n count:\n typeof countRaw === 'number' || typeof countRaw === 'string'\n ? countRaw\n : 0,\n dwell:\n (n?.avg_dwell_time as string) ?? dataMetrics?.avg_dwell_time ?? '0m',\n },\n list: childContainer\n ? buildTreemapNodes({\n container: childContainer.container,\n sortBy,\n pathKey: `${pathKey}/${name}`,\n tileColorFromSeed,\n })\n : [],\n leafMetrics,\n zoneKpiStrip,\n _childContainerKey: childContainer?.key,\n _raw: raw,\n };\n });\n}\n\nexport function getNestedList(\n payload: TreemapNode & { children?: TreemapNode[] }\n): TreemapNode[] | undefined {\n if (payload.list?.length) return payload.list;\n if (payload.children?.length) return payload.children;\n return undefined;\n}\n","import Grid from '@mui/material/Grid';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { ZoneAnalyticsMetrics } from './footfallHeatMapTree';\n\ntype KpiRow = {\n id: number;\n title: string;\n value: string | number;\n};\n\nfunction metricsToRows(metrics: ZoneAnalyticsMetrics): KpiRow[] {\n return [\n { id: 1, title: 'Overall Visits', value: metrics.overall_visits ?? 0 },\n {\n id: 2,\n title: 'Unique Visitors',\n value: metrics.unique_customer_walkins ?? 0,\n },\n {\n id: 3,\n title: 'First Visit Count',\n value: metrics.first_visit_count ?? 0,\n },\n {\n id: 4,\n title: 'Average Wait Time',\n value: metrics.avg_wait_time_per_visitor ?? '0m',\n },\n {\n id: 5,\n title: 'Attended Customers',\n value: metrics.attended_customers ?? 0,\n },\n {\n id: 6,\n title: 'Unattended Customers',\n value: metrics.unattended_customers ?? 0,\n },\n {\n id: 7,\n title: 'Avg. Dwell Time (Mins)',\n value: metrics.avg_dwell_time ?? '0m',\n },\n ];\n}\n\n/** Zone KPI grid using MUI layout. */\nconst ZoneWiseKpiCards = ({ metrics }: { metrics: ZoneAnalyticsMetrics }) => {\n const rows = metricsToRows(metrics);\n\n return (\n <Grid container spacing={3} sx={{ marginTop: '10px', paddingX: '6px' }}>\n {rows.map(item => (\n <Grid\n key={item.id}\n size={{\n xs: 12,\n sm: 6,\n md: 3,\n }}\n >\n <Paper\n elevation={0}\n sx={{\n p: 2,\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#FAFAFA',\n height: '100%',\n }}\n >\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n fontWeight={600}\n >\n {item.title}\n </Typography>\n <Stack mt={1}>\n <Typography variant=\"h6\" fontWeight={700}>\n {item.value}\n </Typography>\n </Stack>\n </Paper>\n </Grid>\n ))}\n </Grid>\n );\n};\n\nexport default ZoneWiseKpiCards;\n","import type { ChartWidgetInfoPopoverContent } from '../../buttons/ChartWidgetInfoButton/ChartWidgetInfoButton.types';\n\nexport const DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER: ChartWidgetInfoPopoverContent =\n {\n title: 'Peak Billing Hours',\n description:\n 'Hourly billing-counter volume for the selected window. Switch tabs to compare visits, average queue time, or alerts.',\n helpTitle: 'How does it help?',\n helpBullets: [\n 'See which hours drive the most counter traffic.',\n 'Align staffing with peaks and quiet periods.',\n 'Compare metrics across the segmented views.',\n ],\n };\n","import type { ChartWidgetSegmentedTab } from '../../tabs/ChartWidgetSegmentedTabs';\nimport type { PeakBillingHoursPoint } from './PeakBillingHours.types';\n\nexport const peakBillingHoursDefaultTabs: ChartWidgetSegmentedTab[] = [\n { id: 'visits', label: 'Billing Counter Visits' },\n { id: 'queue', label: 'Avg. Queue Time' },\n { id: 'alerts', label: 'Alerts Generated' },\n];\n\n/** Matches the **Billing Counter Visits** demo (last 7 days style). */\nexport const peakBillingHoursVisitsMock: PeakBillingHoursPoint[] = [\n { label: '12pm', value: 42 },\n { label: '10am', value: 32 },\n { label: '1pm', value: 29 },\n { label: '11am', value: 25 },\n { label: '8am', value: 23 },\n { label: '7am', value: 19 },\n { label: '9am', value: 12 },\n { label: '2pm', value: 0 },\n { label: '3pm', value: 0 },\n { label: '4pm', value: 0 },\n { label: '5pm', value: 0 },\n { label: '6pm', value: 0 },\n { label: '7pm', value: 0 },\n { label: '8pm', value: 0 },\n];\n\nfunction scaledRow(\n row: PeakBillingHoursPoint,\n factor: number,\n bias: number\n): PeakBillingHoursPoint {\n const v = Math.max(0, Math.round(row.value * factor + bias));\n return { label: row.label, value: v };\n}\n\nexport const peakBillingHoursMockSeriesByTabId: Record<\n string,\n PeakBillingHoursPoint[]\n> = {\n visits: peakBillingHoursVisitsMock,\n queue: peakBillingHoursVisitsMock.map(r =>\n scaledRow(r, 0.35, r.value > 0 ? 2 : 0)\n ),\n alerts: peakBillingHoursVisitsMock.map(r =>\n scaledRow(r, 0.12, r.value > 0 ? 1 : 0)\n ),\n};\n","import Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport * as React from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n LabelList,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport {\n BILLING_COUNTER_LINE_PRIMARY,\n BILLING_COUNTER_TABS_TRACK_BG,\n} from '../../charts/BillingCounterAnalytics/billingCounterAnalytics.chartTokens';\nimport { ChartEmptyState } from '../../utils/ChartEmptyState';\nimport { mergeSx } from '../../charts/BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge';\nimport { ChartWidgetHeaderSeparator } from '../../utils/ChartWidgetHeaderSeparator';\nimport { ChartWidgetInfoButton } from '../../buttons/ChartWidgetInfoButton';\nimport { ChartWidgetSegmentedTabs } from '../../tabs/ChartWidgetSegmentedTabs';\nimport { DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER } from './peakBillingHours.defaultInfoPopover';\nimport {\n PeakBillingHoursCustomizationProvider,\n usePeakBillingHoursCustomization,\n} from './PeakBillingHoursCustomizationContext';\nimport type {\n PeakBillingHoursProps,\n PeakBillingHoursTooltipRenderContext,\n} from './PeakBillingHours.types';\nimport { PeakBillingHoursTooltip } from './PeakBillingHoursTooltip';\n\nconst OLY_DEFAULT_COMPOSED_CHART_CHROME = {\n cartesianGridStroke: '#D3D6DF',\n xAxisLineStroke: '#7566FC',\n axisTickLineStroke: '#E5E7EB',\n} as const;\nconst OLY_DEFAULT_CHART_AXIS_TICK_FILL = '#64748B' as const;\n\ninterface BarValueLabelProps {\n x?: number | string;\n y?: number | string;\n width?: number | string;\n height?: number | string;\n value?: number | string | null;\n}\n\nfunction toNum(n: number | string | undefined): number | undefined {\n if (n === undefined) return undefined;\n return typeof n === 'number' ? n : Number(n);\n}\n\nfunction PeakBarTopLabel(\n props: BarValueLabelProps & {\n fill: string;\n fontSize: number;\n fontWeight: number;\n }\n): React.ReactElement | null {\n const { x, y, width, value, fill, fontSize, fontWeight } = props;\n const nx = toNum(x);\n const ny = toNum(y);\n const nw = toNum(width);\n if (nx === undefined || ny === undefined || nw === undefined) {\n return null;\n }\n const n =\n value === null || value === undefined\n ? NaN\n : typeof value === 'number'\n ? value\n : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return null;\n }\n const cx = nx + nw / 2;\n const cy = ny - 6;\n return (\n <text\n x={cx}\n y={cy}\n fill={fill}\n fontSize={fontSize}\n fontWeight={fontWeight}\n textAnchor=\"middle\"\n >\n {String(Math.round(n))}\n </text>\n );\n}\n\nfunction BarPlot({\n data,\n yAxisDomain,\n yAxisTicks,\n activeTabId,\n renderTooltip,\n chartMargin,\n yAxisTickDx = -6,\n yAxisTickStyle,\n xAxisTickDx = 0,\n xAxisTickStyle,\n}: {\n data: { label: string; value: number }[];\n yAxisDomain: [number, number];\n yAxisTicks: number[];\n activeTabId: string;\n renderTooltip?: PeakBillingHoursProps['renderTooltip'];\n chartMargin?: PeakBillingHoursProps['chartMargin'];\n yAxisTickDx?: number;\n yAxisTickStyle?: PeakBillingHoursProps['yAxisTickStyle'];\n xAxisTickDx?: number;\n xAxisTickStyle?: PeakBillingHoursProps['xAxisTickStyle'];\n}): React.ReactElement {\n const { barChart: bc } = usePeakBillingHoursCustomization();\n const height = bc?.heightPx ?? 320;\n const barColor = bc?.barColor ?? BILLING_COUNTER_LINE_PRIMARY;\n const barRadius = bc?.barRadius ?? 0;\n const gridStroke =\n bc?.gridStroke ?? OLY_DEFAULT_COMPOSED_CHART_CHROME.cartesianGridStroke;\n const dash = bc?.gridStrokeDasharray ?? '3 3';\n const m = chartMargin ?? {\n top: bc?.margin?.top ?? 28,\n right: bc?.margin?.right ?? 12,\n bottom: bc?.margin?.bottom ?? 8,\n left: bc?.margin?.left ?? 4,\n };\n const xFill = bc?.xAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yFill = bc?.yAxisTickFill ?? OLY_DEFAULT_CHART_AXIS_TICK_FILL;\n const yWidth = bc?.yAxisWidth ?? 32;\n const labelFill = bc?.barValueLabelFill ?? '#374151';\n const labelFs = bc?.barValueLabelFontSizePx ?? 12;\n const hoverBandFill = bc?.hoverBandFill ?? 'rgba(226, 232, 240, 0.75)';\n const categoryGap = bc?.barCategoryGap ?? '18%';\n const barGap = bc?.barGap ?? 4;\n\n const radiusTuple: [number, number, number, number] = [\n barRadius,\n barRadius,\n barRadius,\n barRadius,\n ];\n\n return (\n <Box sx={{ width: '100%', height, mt: 0.5 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n data={data}\n margin={m}\n barCategoryGap={categoryGap}\n barGap={barGap}\n >\n <CartesianGrid\n strokeDasharray={dash}\n vertical={false}\n stroke={gridStroke}\n />\n <XAxis\n dataKey=\"label\"\n dx={xAxisTickDx}\n tick={{ fill: xFill, fontSize: 11, ...xAxisTickStyle }}\n tickLine={false}\n axisLine={{\n stroke: OLY_DEFAULT_COMPOSED_CHART_CHROME.axisTickLineStroke,\n }}\n interval={0}\n height={36}\n />\n <YAxis\n domain={yAxisDomain}\n ticks={yAxisTicks}\n dx={yAxisTickDx}\n tick={{ fill: yFill, fontSize: 11, ...yAxisTickStyle }}\n tickLine={false}\n axisLine={false}\n width={yWidth}\n />\n <Tooltip\n content={(tooltipProps: TooltipContentProps) => {\n if (renderTooltip) {\n const customTooltip = renderTooltip({\n tooltipProps,\n data,\n activeTabId,\n } satisfies PeakBillingHoursTooltipRenderContext);\n return customTooltip == null ? null : <>{customTooltip}</>;\n }\n return <PeakBillingHoursTooltip {...tooltipProps} />;\n }}\n cursor={{\n fill: hoverBandFill,\n stroke: 'transparent',\n strokeWidth: 0,\n }}\n allowEscapeViewBox={{ x: false, y: true }}\n />\n <Bar\n dataKey=\"value\"\n name=\"Visits\"\n fill={barColor}\n radius={radiusTuple}\n isAnimationActive={false}\n maxBarSize={48}\n >\n <LabelList\n dataKey=\"value\"\n content={(props: unknown) => (\n <PeakBarTopLabel\n {...(props as BarValueLabelProps)}\n fill={labelFill}\n fontSize={labelFs}\n fontWeight={500}\n />\n )}\n />\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </Box>\n );\n}\n\n/**\n * Peak billing hours card: title + subtitle, info control, violet segmented tabs (intrinsic),\n * vertical bar chart with square tops, value labels, and panel tooltip.\n */\nexport function PeakBillingHours({\n title = 'Peak Billing Hours',\n subtitle = '(Last 7 days)',\n tabs,\n activeTabId,\n onTabChange,\n data,\n isLoading = false,\n seriesByTabId,\n chartMargin,\n yAxisTickDx = -6,\n yAxisTickStyle,\n xAxisTickDx = 0,\n xAxisTickStyle,\n yAxisDomain = [0, 50],\n yAxisTicks = [0, 10, 20, 30, 40, 50],\n infoPopover,\n renderTooltip,\n emptyStatePlaceholderProps,\n customization,\n}: PeakBillingHoursProps): React.ReactElement {\n const chartData = React.useMemo(() => {\n if (seriesByTabId) {\n return seriesByTabId[activeTabId] ?? [];\n }\n return data ?? [];\n }, [seriesByTabId, data, activeTabId]);\n\n const resolvedInfo =\n infoPopover === undefined\n ? DEFAULT_PEAK_BILLING_HOURS_INFO_POPOVER\n : infoPopover;\n\n const rootSx = mergeSx(\n {\n bgcolor: '#FFFFFF',\n borderRadius: 2,\n boxShadow: '0 1px 3px rgba(15, 23, 42, 0.08)',\n },\n customization?.rootCard?.sx\n );\n\n const st = customization?.segmentedTabs;\n const titleSx = mergeSx(\n {\n fontWeight: 700,\n fontSize: { xs: '1rem', sm: '1.05rem' },\n color: '#0f172a',\n display: 'inline',\n },\n customization?.header?.titleSx\n );\n const subtitleSx = mergeSx(\n {\n display: 'inline',\n ml: 0.75,\n color: '#6B7280',\n fontSize: '0.9375rem',\n fontWeight: 400,\n },\n customization?.header?.subtitleSx\n );\n\n return (\n <PeakBillingHoursCustomizationProvider value={customization ?? {}}>\n <Card elevation={customization?.rootCard?.elevation ?? 0} sx={rootSx}>\n <CardContent>\n <Stack spacing={1.75} sx={{ width: '100%' }}>\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n flexWrap=\"wrap\"\n >\n <Box component=\"div\" sx={{ minWidth: 0 }}>\n <Typography component=\"span\" sx={titleSx}>\n {title}\n </Typography>\n <Typography component=\"span\" sx={subtitleSx}>\n {subtitle}\n </Typography>\n </Box>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.5}\n sx={{ flexShrink: 0 }}\n >\n {resolvedInfo ? (\n <>\n <ChartWidgetHeaderSeparator />\n <ChartWidgetInfoButton\n popover={resolvedInfo}\n ariaLabel=\"Peak billing hours information\"\n />\n </>\n ) : null}\n </Stack>\n </Stack>\n\n <ChartWidgetSegmentedTabs\n tabs={tabs}\n activeTabId={activeTabId}\n onTabChange={onTabChange}\n ariaLabel=\"Peak billing metric\"\n trackBackgroundColor={\n st?.trackBackgroundColor ?? BILLING_COUNTER_TABS_TRACK_BG\n }\n activeTabBackground={\n st?.activeTabBackground ?? BILLING_COUNTER_LINE_PRIMARY\n }\n activeTabColor={st?.activeTabColor ?? '#ffffff'}\n inactiveTabColor={st?.inactiveTabColor ?? '#525252'}\n activeTabBoxShadow={st?.activeTabBoxShadow ?? 'none'}\n fullWidth={st?.fullWidth ?? true}\n tabFontSize={st?.tabFontSize ?? 14}\n rootSx={st?.rootSx}\n tabLayout={st?.tabLayout ?? 'equalWidth'}\n activeTabFontWeight={st?.activeTabFontWeight ?? 700}\n inactiveTabFontWeight={st?.inactiveTabFontWeight ?? 600}\n />\n\n {isLoading ? (\n <Skeleton variant=\"rounded\" width=\"100%\" height={320} />\n ) : chartData.length > 0 ? (\n <BarPlot\n data={chartData}\n yAxisDomain={yAxisDomain}\n yAxisTicks={yAxisTicks}\n activeTabId={activeTabId}\n renderTooltip={renderTooltip}\n chartMargin={chartMargin}\n yAxisTickDx={yAxisTickDx}\n yAxisTickStyle={yAxisTickStyle}\n xAxisTickDx={xAxisTickDx}\n xAxisTickStyle={xAxisTickStyle}\n />\n ) : (\n <ChartEmptyState\n minHeight={320}\n {...emptyStatePlaceholderProps}\n />\n )}\n </Stack>\n </CardContent>\n </Card>\n </PeakBillingHoursCustomizationProvider>\n );\n}\n\nexport default PeakBillingHours;\n","import * as React from 'react';\nimport type { PeakBillingHoursCustomization } from './peakBillingHours.customization.types';\n\nconst PeakBillingHoursCustomizationContext =\n React.createContext<PeakBillingHoursCustomization>({});\n\nexport type PeakBillingHoursCustomizationProviderProps = {\n value: PeakBillingHoursCustomization;\n children: React.ReactNode;\n};\n\nexport function PeakBillingHoursCustomizationProvider({\n value,\n children,\n}: PeakBillingHoursCustomizationProviderProps): React.ReactElement {\n const memo = React.useMemo(() => value, [value]);\n return (\n <PeakBillingHoursCustomizationContext.Provider value={memo}>\n {children}\n </PeakBillingHoursCustomizationContext.Provider>\n );\n}\n\nexport function usePeakBillingHoursCustomization(): PeakBillingHoursCustomization {\n return React.useContext(PeakBillingHoursCustomizationContext);\n}\n","import * as React from 'react';\nimport type { TooltipContentProps } from 'recharts';\nimport { mergeCss } from '../../charts/BillingCounterAnalytics/billingCounterAnalyticsCustomization.merge';\nimport { usePeakBillingHoursCustomization } from './PeakBillingHoursCustomizationContext';\n\nfunction formatTooltipValue(n: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(\n Math.round(n)\n );\n}\n\nexport function PeakBillingHoursTooltip(\n props: TooltipContentProps\n): React.ReactElement | null {\n const { active, payload, label } = props;\n const { barChart: bc } = usePeakBillingHoursCustomization();\n const tt = bc?.tooltip;\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const raw = payload[0]?.value;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN;\n if (!Number.isFinite(num)) {\n return null;\n }\n\n const labelText = label !== undefined && label !== null ? String(label) : '—';\n\n const borderColor = tt?.borderColor ?? '#E5E7EB';\n const radius = tt?.borderRadiusPx ?? 0;\n const shadow = tt?.boxShadow ?? '0 4px 14px rgba(15, 23, 42, 0.12)';\n const topBg = tt?.topBarBackground ?? '#E5E7EB';\n const topH = tt?.topBarHeightPx ?? 8;\n const bodyBg = tt?.bodyBackground ?? '#FFFFFF';\n const fs = tt?.fontSizePx ?? 13;\n const gap = tt?.lineGapPx ?? 6;\n const dateP = tt?.dateLabelPrefix ?? 'Date: ';\n const totalP = tt?.totalLabelPrefix ?? 'Total: ';\n const prefixFw = tt?.prefixFontWeight ?? 400;\n const valueFw = tt?.valueFontWeight ?? 700;\n\n const uniformText =\n tt?.textColor != null &&\n tt?.prefixColor === undefined &&\n tt?.valueColor === undefined;\n const prefixCol = uniformText ? tt.textColor : (tt?.prefixColor ?? '#6B7280');\n const valueCol = uniformText ? tt.textColor : (tt?.valueColor ?? '#111827');\n\n const rowStyle: React.CSSProperties = {\n fontSize: fs,\n lineHeight: 1.35,\n margin: 0,\n };\n\n const bodyStyle = mergeCss(\n {\n boxSizing: 'border-box',\n backgroundColor: bodyBg,\n padding: '10px 12px',\n },\n tt?.bodyStyle\n );\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n minWidth: 160,\n maxWidth: 280,\n }}\n >\n <div\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: bodyBg,\n boxShadow: shadow,\n }}\n >\n <div\n style={{\n height: topH,\n backgroundColor: topBg,\n flexShrink: 0,\n }}\n aria-hidden\n />\n <div style={bodyStyle}>\n <div style={rowStyle}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {dateP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {labelText}\n </span>\n </div>\n <div style={{ ...rowStyle, marginTop: gap }}>\n <span style={{ color: prefixCol, fontWeight: prefixFw }}>\n {totalP}\n </span>\n <span style={{ color: valueCol, fontWeight: valueFw }}>\n {formatTooltipValue(num)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport * as React from 'react';\nimport { JourneyMetricCard } from '../../card/JourneyMetricCard';\nimport { JourneyStatCard } from '../../card/JourneyStatCard';\nimport type {\n CustomerJourneyAnalysisProps,\n JourneyMetricConfig,\n JourneyStatConfig,\n} from './CustomerJourneyAnalysis.types';\n\n// ─── Default values ───────────────────────────────────────────────────────────\n\nconst DEFAULT_WALK_INS_BG = '#5B8DEF';\nconst DEFAULT_TRIAL_VISITS_BG = '#F59E42';\nconst DEFAULT_BILLING_VISITS_BG = '#6EBE7A';\nconst DEFAULT_STAT_ICON_COLOR = '#ffffff';\nconst DEFAULT_STAT_LABEL_COLOR = 'rgba(255,255,255,0.9)';\nconst DEFAULT_STAT_VALUE_COLOR = '#ffffff';\nconst DEFAULT_METRIC_LABEL_COLOR = '#6B7280';\nconst DEFAULT_METRIC_VALUE_COLOR = '#1E293B';\nconst DEFAULT_STAT_STRIP_INNER_RADIUS = '18px';\n\nfunction defaultFormatConversion(value: number): string {\n return `${Math.round(value * 10) / 10}%`;\n}\n\nfunction defaultFormatAverage(value: number): string {\n return String(Math.round(value * 10) / 10);\n}\n\n// ─── Helper: merge stat config ────────────────────────────────────────────────\n\nfunction resolveStatConfig(\n shared: JourneyStatConfig | undefined,\n perCard: JourneyStatConfig | undefined,\n colorFallback: string,\n iconFallback: string,\n props: {\n statIconColor?: string;\n statIconStyle?: React.CSSProperties;\n statShowOuterCard?: boolean;\n statLabelColor?: string;\n statValueColor?: string;\n statLabelFontSize?: number;\n statLabelFontWeight?: number;\n statValueFontSize?: number;\n statValueFontWeight?: number;\n statIconSize?: number;\n statMinHeight?: number;\n }\n): JourneyStatConfig {\n return {\n bg: perCard?.bg ?? shared?.bg ?? colorFallback,\n icon: perCard?.icon ?? shared?.icon ?? iconFallback,\n iconSize: perCard?.iconSize ?? shared?.iconSize ?? props.statIconSize ?? 52,\n iconColor:\n perCard?.iconColor ??\n shared?.iconColor ??\n props.statIconColor ??\n DEFAULT_STAT_ICON_COLOR,\n iconStyle: perCard?.iconStyle ?? shared?.iconStyle ?? props.statIconStyle,\n showOuterCard:\n perCard?.showOuterCard ??\n shared?.showOuterCard ??\n props.statShowOuterCard ??\n false,\n outerCard: perCard?.outerCard ?? shared?.outerCard,\n labelColor:\n perCard?.labelColor ??\n shared?.labelColor ??\n props.statLabelColor ??\n DEFAULT_STAT_LABEL_COLOR,\n labelFontSize:\n perCard?.labelFontSize ??\n shared?.labelFontSize ??\n props.statLabelFontSize ??\n 13,\n labelFontWeight:\n perCard?.labelFontWeight ??\n shared?.labelFontWeight ??\n props.statLabelFontWeight ??\n 600,\n valueColor:\n perCard?.valueColor ??\n shared?.valueColor ??\n props.statValueColor ??\n DEFAULT_STAT_VALUE_COLOR,\n valueFontSize:\n perCard?.valueFontSize ??\n shared?.valueFontSize ??\n props.statValueFontSize ??\n 40,\n valueFontWeight:\n perCard?.valueFontWeight ??\n shared?.valueFontWeight ??\n props.statValueFontWeight ??\n 700,\n borderRadius: perCard?.borderRadius ?? shared?.borderRadius ?? 0,\n minHeight:\n perCard?.minHeight ?? shared?.minHeight ?? props.statMinHeight ?? 166,\n sx: perCard?.sx ?? shared?.sx,\n };\n}\n\n// ─── Helper: merge metric config ──────────────────────────────────────────────\n\nfunction resolveMetricConfig(\n shared: JourneyMetricConfig | undefined,\n perCard: JourneyMetricConfig | undefined,\n props: {\n metricLabelColor?: string;\n metricValueColor?: string;\n metricLabelFontSize?: number;\n metricLabelFontWeight?: number;\n metricValueFontSize?: number;\n metricValueFontWeight?: number;\n }\n): JourneyMetricConfig {\n return {\n labelColor:\n perCard?.labelColor ??\n shared?.labelColor ??\n props.metricLabelColor ??\n DEFAULT_METRIC_LABEL_COLOR,\n labelFontSize:\n perCard?.labelFontSize ??\n shared?.labelFontSize ??\n props.metricLabelFontSize ??\n 13,\n labelFontWeight:\n perCard?.labelFontWeight ??\n shared?.labelFontWeight ??\n props.metricLabelFontWeight ??\n 600,\n valueColor:\n perCard?.valueColor ??\n shared?.valueColor ??\n props.metricValueColor ??\n DEFAULT_METRIC_VALUE_COLOR,\n valueFontSize:\n perCard?.valueFontSize ??\n shared?.valueFontSize ??\n props.metricValueFontSize ??\n 28,\n valueFontWeight:\n perCard?.valueFontWeight ??\n shared?.valueFontWeight ??\n props.metricValueFontWeight ??\n 700,\n textAlign: perCard?.textAlign ?? shared?.textAlign ?? 'center',\n sx: perCard?.sx ?? shared?.sx,\n };\n}\n\nfunction mergeSx(...items: Array<SxProps<Theme> | undefined>): SxProps<Theme> {\n return items.flatMap(item =>\n Array.isArray(item) ? item : item ? [item] : []\n );\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function CustomerJourneyAnalysis({\n // Data\n walkIns,\n trialVisits,\n billingVisits,\n walkInToBillingConversion,\n trialToBillingConversion,\n avgTrialsPerWalkIn,\n avgBillingPerTrial,\n\n // Labels\n title = 'Customer Journey Analysis',\n titleFontSize,\n titleFontWeight = 700,\n titleColor = '#0f172a',\n walkInsLabel = 'Walk-ins',\n trialVisitsLabel = 'Trial Visits',\n billingVisitsLabel = 'Billing Visits',\n walkInToBillingLabel = 'Walk-in → Billing Conversion',\n trialToBillingLabel = 'Trial → Billing Conversion',\n avgTrialsPerWalkInLabel = 'Avg. Trials per Walk-in',\n avgBillingPerTrialLabel = 'Avg. Billing per Trial',\n\n // Icons\n walkInsIcon = 'tabler:users',\n trialVisitsIcon = 'mynaui:door-open',\n billingVisitsIcon = 'mingcute:shopping-bag-3-line',\n\n // Per-card configs\n walkInsCardConfig,\n trialVisitsCardConfig,\n billingVisitsCardConfig,\n statCardDefaults,\n walkInToBillingMetricConfig,\n trialToBillingMetricConfig,\n avgTrialsPerWalkInMetricConfig,\n avgBillingPerTrialMetricConfig,\n metricCardDefaults,\n\n // Color shortcuts\n walkInsBg = DEFAULT_WALK_INS_BG,\n trialVisitsBg = DEFAULT_TRIAL_VISITS_BG,\n billingVisitsBg = DEFAULT_BILLING_VISITS_BG,\n statIconColor,\n statIconStyle,\n statShowOuterCard,\n statLabelColor,\n statValueColor,\n metricLabelColor,\n metricValueColor,\n metricsCardBg = '#F9FAFB',\n metricsCardBorderRadius = '10px',\n metricsGap = '12px',\n metricsPadding = 0,\n\n // Typography shortcuts\n statLabelFontSize,\n statLabelFontWeight,\n statValueFontSize,\n statValueFontWeight,\n statIconSize,\n metricLabelFontSize,\n metricLabelFontWeight,\n metricValueFontSize,\n metricValueFontWeight,\n\n // Layout\n statCardGap = 0,\n statStripBg = '#ffffff',\n statStripPadding = '10px 12px',\n statStripBorder = '1px solid #E5E7EB',\n statStripBorderRadius = '20px',\n statStripBoxShadow = 'none',\n statStripInnerBorderRadius = DEFAULT_STAT_STRIP_INNER_RADIUS,\n statStripInnerBoxShadow,\n sectionFlex = [1, 1],\n statSectionFlex,\n metricsSectionFlex,\n bodyBreakpoint = 'md',\n bodyGap = 3,\n statMinHeight,\n statCardFlexes = [1, 1.35, 1],\n\n // State\n isLoading = false,\n\n // Formatters\n formatConversion = defaultFormatConversion,\n formatAverage = defaultFormatAverage,\n\n // Header\n headerActions,\n\n // SX\n cardSx,\n statStripSx,\n metricsSx,\n}: CustomerJourneyAnalysisProps) {\n const colorProps = {\n statIconColor,\n statIconStyle,\n statShowOuterCard,\n statLabelColor,\n statValueColor,\n metricLabelColor,\n metricValueColor,\n statLabelFontSize,\n statLabelFontWeight,\n statValueFontSize,\n statValueFontWeight,\n statIconSize,\n metricLabelFontSize,\n metricLabelFontWeight,\n metricValueFontSize,\n metricValueFontWeight,\n statMinHeight,\n };\n\n const wiConfig = resolveStatConfig(\n statCardDefaults,\n walkInsCardConfig,\n walkInsBg,\n walkInsIcon,\n colorProps\n );\n const tvConfig = resolveStatConfig(\n statCardDefaults,\n trialVisitsCardConfig,\n trialVisitsBg,\n trialVisitsIcon,\n colorProps\n );\n const bvConfig = resolveStatConfig(\n statCardDefaults,\n billingVisitsCardConfig,\n billingVisitsBg,\n billingVisitsIcon,\n colorProps\n );\n\n const metricColorProps = {\n metricLabelColor,\n metricValueColor,\n metricLabelFontSize,\n metricLabelFontWeight,\n metricValueFontSize,\n metricValueFontWeight,\n };\n const m1Config = resolveMetricConfig(\n metricCardDefaults,\n walkInToBillingMetricConfig,\n metricColorProps\n );\n const m2Config = resolveMetricConfig(\n metricCardDefaults,\n trialToBillingMetricConfig,\n metricColorProps\n );\n const m3Config = resolveMetricConfig(\n metricCardDefaults,\n avgTrialsPerWalkInMetricConfig,\n metricColorProps\n );\n const m4Config = resolveMetricConfig(\n metricCardDefaults,\n avgBillingPerTrialMetricConfig,\n metricColorProps\n );\n\n const outerSx: SxProps<Theme> = [\n {\n p: { xs: 2, sm: 3 },\n borderRadius: 2,\n border: '1px solid #E8E8E8',\n bgcolor: '#fff',\n width: '100%',\n boxSizing: 'border-box',\n },\n ...(Array.isArray(cardSx) ? cardSx : cardSx ? [cardSx] : []),\n ];\n\n const stripSx: SxProps<Theme> = [\n {\n flex: statSectionFlex ?? sectionFlex[0],\n bgcolor: statStripBg,\n border: statStripBorder,\n borderRadius: statStripBorderRadius,\n boxShadow: statStripBoxShadow,\n p: statStripPadding,\n boxSizing: 'border-box',\n minWidth: 0,\n },\n ...(Array.isArray(statStripSx)\n ? statStripSx\n : statStripSx\n ? [statStripSx]\n : []),\n ];\n\n const statCardsRowSx: SxProps<Theme> = {\n display: 'flex',\n flexDirection: 'row',\n gap: statCardGap,\n alignItems: 'stretch',\n minWidth: 0,\n overflow: 'hidden',\n borderRadius: statStripInnerBorderRadius,\n boxShadow:\n statStripInnerBoxShadow ??\n (statCardGap === 0 ? '0 2px 8px rgba(15, 23, 42, 0.08)' : 'none'),\n };\n\n const metricsBoxSx: SxProps<Theme> = [\n {\n flex: metricsSectionFlex ?? sectionFlex[1],\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n },\n ...(Array.isArray(metricsSx) ? metricsSx : metricsSx ? [metricsSx] : []),\n ];\n\n const bodyDirection = { xs: 'column', [bodyBreakpoint]: 'row' } as const;\n\n return (\n <Box sx={outerSx}>\n <Stack spacing={2}>\n {/* ── Title row ── */}\n <Stack\n direction=\"row\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n gap={2}\n >\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={{\n fontWeight: titleFontWeight,\n color: titleColor,\n lineHeight: 1.3,\n ...(titleFontSize != null ? { fontSize: titleFontSize } : {}),\n }}\n >\n {title}\n </Typography>\n {headerActions != null ? (\n <Box\n sx={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n {headerActions}\n </Box>\n ) : null}\n </Stack>\n\n {/* ── Body ── */}\n <Stack direction={bodyDirection} spacing={bodyGap} alignItems=\"stretch\">\n {/* Left: coloured stat strip */}\n <Box sx={stripSx}>\n <Box sx={statCardsRowSx}>\n <JourneyStatCard\n icon={wiConfig.icon!}\n iconSize={wiConfig.iconSize}\n iconColor={wiConfig.iconColor}\n iconStyle={wiConfig.iconStyle}\n showOuterCard={wiConfig.showOuterCard}\n outerCard={wiConfig.outerCard}\n bg={wiConfig.bg!}\n label={walkInsLabel}\n labelColor={wiConfig.labelColor}\n labelFontSize={wiConfig.labelFontSize}\n labelFontWeight={wiConfig.labelFontWeight}\n value={walkIns}\n valueColor={wiConfig.valueColor}\n valueFontSize={wiConfig.valueFontSize}\n valueFontWeight={wiConfig.valueFontWeight}\n borderRadius={wiConfig.borderRadius}\n minHeight={wiConfig.minHeight}\n isLoading={isLoading}\n sx={mergeSx(\n {\n flex: statCardFlexes[0],\n borderRadius: `${statStripInnerBorderRadius} 0 0 ${statStripInnerBorderRadius}`,\n },\n wiConfig.sx\n )}\n />\n <JourneyStatCard\n icon={tvConfig.icon!}\n iconSize={tvConfig.iconSize}\n iconColor={tvConfig.iconColor}\n iconStyle={tvConfig.iconStyle}\n showOuterCard={tvConfig.showOuterCard}\n outerCard={tvConfig.outerCard}\n bg={tvConfig.bg!}\n label={trialVisitsLabel}\n labelColor={tvConfig.labelColor}\n labelFontSize={tvConfig.labelFontSize}\n labelFontWeight={tvConfig.labelFontWeight}\n value={trialVisits}\n valueColor={tvConfig.valueColor}\n valueFontSize={tvConfig.valueFontSize}\n valueFontWeight={tvConfig.valueFontWeight}\n borderRadius={tvConfig.borderRadius}\n minHeight={tvConfig.minHeight}\n isLoading={isLoading}\n sx={mergeSx({ flex: statCardFlexes[1] }, tvConfig.sx)}\n />\n <JourneyStatCard\n icon={bvConfig.icon!}\n iconSize={bvConfig.iconSize}\n iconColor={bvConfig.iconColor}\n iconStyle={bvConfig.iconStyle}\n showOuterCard={bvConfig.showOuterCard}\n outerCard={bvConfig.outerCard}\n bg={bvConfig.bg!}\n label={billingVisitsLabel}\n labelColor={bvConfig.labelColor}\n labelFontSize={bvConfig.labelFontSize}\n labelFontWeight={bvConfig.labelFontWeight}\n value={billingVisits}\n valueColor={bvConfig.valueColor}\n valueFontSize={bvConfig.valueFontSize}\n valueFontWeight={bvConfig.valueFontWeight}\n borderRadius={bvConfig.borderRadius}\n minHeight={bvConfig.minHeight}\n isLoading={isLoading}\n sx={mergeSx(\n {\n flex: statCardFlexes[2],\n borderRadius: `0 ${statStripInnerBorderRadius} ${statStripInnerBorderRadius} 0`,\n },\n bvConfig.sx\n )}\n />\n </Box>\n </Box>\n\n {/* Right: 2×2 metrics card grid */}\n <Box sx={metricsBoxSx}>\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gridTemplateRows: 'repeat(2, minmax(0, 1fr))',\n gap: metricsGap,\n p: metricsPadding,\n flex: 1,\n minHeight: 0,\n boxSizing: 'border-box',\n }}\n >\n {[\n {\n cfg: m1Config,\n label: walkInToBillingLabel,\n value: formatConversion(walkInToBillingConversion),\n },\n {\n cfg: m2Config,\n label: trialToBillingLabel,\n value: formatConversion(trialToBillingConversion),\n },\n {\n cfg: m3Config,\n label: avgTrialsPerWalkInLabel,\n value: formatAverage(avgTrialsPerWalkIn),\n },\n {\n cfg: m4Config,\n label: avgBillingPerTrialLabel,\n value: formatAverage(avgBillingPerTrial),\n },\n ].map(({ cfg, label, value }) => (\n <Box\n key={label}\n sx={{\n bgcolor: metricsCardBg,\n borderRadius: metricsCardBorderRadius,\n display: 'flex',\n height: '100%',\n minWidth: 0,\n }}\n >\n <JourneyMetricCard\n label={label}\n value={value}\n labelColor={cfg.labelColor}\n labelFontSize={cfg.labelFontSize}\n labelFontWeight={cfg.labelFontWeight}\n valueColor={cfg.valueColor}\n valueFontSize={cfg.valueFontSize}\n valueFontWeight={cfg.valueFontWeight}\n textAlign={cfg.textAlign}\n isLoading={isLoading}\n sx={[\n { flex: 1 },\n ...(Array.isArray(cfg.sx)\n ? cfg.sx\n : cfg.sx\n ? [cfg.sx]\n : []),\n ]}\n />\n </Box>\n ))}\n </Box>\n </Box>\n </Stack>\n </Stack>\n </Box>\n );\n}\n","import CssBaseline from '@mui/material/CssBaseline';\nimport {\n ThemeProvider,\n createTheme,\n responsiveFontSizes,\n} from '@mui/material/styles';\nimport React from 'react';\nimport type {\n FalconThemeMode,\n FalconThemeProviderProps,\n} from './FalconThemeProvider.types';\n\n// ─── Brand palette ────────────────────────────────────────────────────────────\n\nconst lightColor = '51, 48, 60';\nconst darkColor = '228, 230, 244';\nconst darkPaperBg = '#2F3349';\n\nfunction buildPalette(mode: FalconThemeMode) {\n const mainColor = mode === 'light' ? lightColor : darkColor;\n\n return {\n mode,\n primary: {\n light: 'rgba(103, 80, 164, 0.02)',\n main: '#d8c5f9',\n dark: '#8710D8',\n contrastText: '#FFF',\n },\n secondary: {\n light: '#EFEFEF',\n main: '#1D192B',\n dark: '#949699',\n contrastText: '#FFF',\n },\n error: {\n light: '#ED6F70',\n main: '#EA5455',\n dark: '#CE4A4B',\n contrastText: '#FFF',\n },\n warning: {\n light: '#FFAB5A',\n main: '#FF9F43',\n dark: '#E08C3B',\n contrastText: '#FFF',\n },\n info: {\n light: '#1FD5EB',\n main: '#00CFE8',\n dark: '#00B6CC',\n contrastText: '#FFF',\n },\n success: {\n light: '#42CE80',\n main: '#28C76F',\n dark: '#23AF62',\n contrastText: '#FFF',\n },\n text: {\n primary: `rgba(${mainColor}, 0.87)`,\n secondary: `rgba(${mainColor}, 0.6)`,\n disabled: `rgba(${mainColor}, 0.38)`,\n },\n divider: `rgba(${mainColor}, 0.12)`,\n background: {\n paper: mode === 'light' ? '#F2EBFF' : darkPaperBg,\n default: mode === 'light' ? '#F8F7FA' : '#25293C',\n },\n action: {\n active: `rgba(${mainColor}, 0.54)`,\n hover: `rgba(${mainColor}, 0.04)`,\n selected: `rgba(${mainColor}, 0.08)`,\n disabled: `rgba(${mainColor}, 0.26)`,\n disabledBackground: `rgba(${mainColor}, 0.12)`,\n focus: `rgba(${mainColor}, 0.12)`,\n },\n };\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const FalconThemeProvider = ({\n children,\n mode: modeProp,\n settings,\n}: FalconThemeProviderProps) => {\n const mode: FalconThemeMode = settings?.mode ?? modeProp ?? 'light';\n const direction = settings?.direction ?? 'ltr';\n\n const theme = responsiveFontSizes(\n createTheme({\n direction,\n palette: buildPalette(mode),\n shape: { borderRadius: 6 },\n typography: { fontFamily: '\"Inter\", \"Public Sans\", sans-serif' },\n mixins: { toolbar: { minHeight: 64 } },\n })\n );\n\n return (\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n );\n};\n"],"mappings":"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","names":["Box","Button","Typography","TextField","jsx","jsx","jsxs","Box","Typography","Button","Box","Button","Typography","jsx","jsxs","Icon","Box","ClickAwayListener","IconButton","Popper","Stack","Typography","React","Fragment","jsx","jsxs","jsx","Icon","Box","Typography","jsx","jsxs","Icon","Box","Button","Checkbox","ClickAwayListener","InputAdornment","Popper","Stack","TextField","Typography","useTheme","React","jsx","jsxs","defaultTriggerBg","Icon","Box","IconButton","Stack","Typography","React","Fragment","jsx","jsxs","Box","Typography","Stack","IconButton","Icon","Box","Stack","React","React","jsx","mergeSx","jsx","jsxs","mergeSx","Box","Stack","Box","React","jsx","jsxs","Icon","Box","Paper","Stack","Tooltip","Typography","useLayoutEffect","useRef","useState","useEffect","useRef","useState","jsx","jsxs","defaultIconColor","useRef","useState","useLayoutEffect","Tooltip","Typography","cardMinHeightPx","cardMaxHeightPx","Paper","Box","Icon","Stack","Icon","Box","Stack","Typography","jsx","jsxs","Box","Skeleton","Stack","Typography","jsx","jsxs","jsx","Icon","Box","Typography","IconButton","useMemo","useState","Fragment","jsx","jsxs","match","useState","Box","Button","Checkbox","Typography","styled","Paper","Stack","Icon","jsx","jsxs","useState","Box","Button","Checkbox","FormControlLabel","InputAdornment","TextField","Typography","styled","Paper","Stack","Icon","Fragment","jsx","jsxs","RootPaper","Title","CheckboxLabel","CloseButton","ExportMainButton","Autocomplete","TextField","jsx","Box","Typography","Icon","jsx","jsxs","formatValue","Box","Stack","jsx","Stack","Box","Box","Stack","Typography","useTheme","jsx","jsxs","Icon","Box","Divider","Stack","jsx","jsxs","jsx","jsxs","Stack","styled","jsx","Box","useState","jsx","Box","Typography","jsx","jsxs","Button","Popover","useState","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","Box","Divider","Skeleton","Stack","Typography","React","Tooltip","Fragment","jsx","jsxs","mergeCss","Box","Stack","Typography","Divider","Skeleton","Tooltip","Icon","Box","Divider","Skeleton","Stack","Typography","React","Bar","BarChart","CartesianGrid","Cell","LabelList","Tooltip","XAxis","YAxis","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","mergeCss","sxChain","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","defaultChartColors","formatBarLabel","toNum","Icon","MultiLineTick","Box","Stack","Typography","Divider","Skeleton","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Bar","Cell","LabelList","Box","Divider","Skeleton","Stack","Typography","React","Bar","CartesianGrid","Cell","LabelList","Tooltip","XAxis","YAxis","React","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","mergeCss","sxChain","formatBarLabel","MultiLineTick","formatYAxisTickDefault","toNum","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","topReserveForBarLabels","topReserveNoBarLabels","defaultChartColors","Box","Stack","Typography","Divider","Skeleton","CartesianGrid","XAxis","YAxis","Tooltip","Bar","Cell","LabelList","Box","Stack","useTheme","Typography","React","Cell","Tooltip","Fragment","jsx","jsxs","resolveCardMaxWidth","useTheme","Box","Stack","Typography","Tooltip","Cell","Box","Divider","Skeleton","Stack","Typography","React","Bar","CartesianGrid","ComposedChart","LabelList","Line","Tooltip","XAxis","YAxis","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_HEIGHT_PX","OLY_DEFAULT_COMPOSED_CHART_CHROME","tooltipDatumFromPayload","mergeCss","sxChain","formatBarLabel","MultiLineTick","formatYAxisTickDefault","toNum","BarTopLabel","defaultMinWidthPerCategory","defaultMaxBarThickness","chartWidthAxisGutter","defaultChartMargin","topReserveForBarLabels","topReserveNoBarLabels","defaultChartColors","Box","Stack","Typography","Divider","Skeleton","ComposedChart","CartesianGrid","XAxis","YAxis","Tooltip","Bar","LabelList","Line","Box","Card","Stack","Typography","React","CartesianGrid","Line","ResponsiveContainer","Tooltip","XAxis","YAxis","mergeCss","mergeSx","React","jsx","jsx","jsxs","mergeCss","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_CHROME","Box","ResponsiveContainer","CartesianGrid","XAxis","YAxis","Tooltip","Line","mergeSx","Card","Stack","Typography","Box","Card","CardContent","Stack","Typography","useMediaQuery","React","Stack","useTheme","React","CartesianGrid","ResponsiveContainer","Tooltip","XAxis","YAxis","React","jsx","jsxs","Fragment","jsx","jsxs","useTheme","Stack","ResponsiveContainer","CartesianGrid","XAxis","YAxis","Tooltip","Box","Stack","Typography","React","Cell","Pie","PieChart","ResponsiveContainer","Tooltip","Fragment","jsx","jsxs","Box","Stack","Typography","mergeSx","ResponsiveContainer","PieChart","Pie","Cell","Tooltip","Box","Stack","Tooltip","Typography","React","jsx","jsxs","segmentTooltipPopperSx","defaultSegmentTooltipCardSx","Box","Stack","Typography","Tooltip","mergeSx","jsx","jsxs","useMediaQuery","mergeSx","Card","CardContent","Stack","Typography","Box","Icon","Box","Button","IconButton","Paper","Skeleton","Stack","Tooltip","Typography","React","useEffect","useMemo","useState","ResponsiveContainer","overallVisitors","storeCount","Fragment","jsx","jsxs","Paper","Stack","Icon","Typography","Box","Tooltip","useMemo","useState","useEffect","p","Skeleton","IconButton","Button","ResponsiveContainer","Grid","Paper","Stack","Typography","jsx","jsxs","Box","Card","CardContent","Skeleton","Stack","Typography","React","Bar","BarChart","CartesianGrid","LabelList","ResponsiveContainer","Tooltip","XAxis","YAxis","React","jsx","jsx","jsxs","formatTooltipValue","mergeCss","Fragment","jsx","jsxs","OLY_DEFAULT_COMPOSED_CHART_CHROME","OLY_DEFAULT_CHART_AXIS_TICK_FILL","toNum","Box","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Bar","LabelList","mergeSx","Card","CardContent","Stack","Typography","Skeleton","Box","Stack","Typography","jsx","jsxs","mergeSx","Box","Stack","Typography","jsx","jsxs"]}