mgh-components 1.1.2 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/hooks/useResponsive.ts","../src/components/CustomNoRowsOverlay/CustomNoRowsOverlay.tsx","../src/components/MGHDataGrid/MGHDataGrid.tsx","../src/components/iconify/iconify.tsx","../src/components/Label/styles.ts","../src/components/Label/Label.tsx","../src/components/MGHGrid/utils.ts","../src/components/MGHGrid/MGHGrid.styles.ts","../src/components/MGHGrid/context.tsx","../src/components/MGHGrid/hooks.ts","../src/components/MGHGrid/export.ts","../src/components/MGHGrid/grouping.ts","../src/components/MGHGrid/icons.tsx","../src/components/MGHGrid/components/primitives.tsx","../src/components/MGHGrid/components/Toolbar.tsx","../src/components/MGHGrid/components/Footer.tsx","../src/components/MGHGrid/components/ColumnsPanel.tsx","../src/components/MGHGrid/components/FilterPanel.tsx","../src/components/MGHGrid/components/ColumnMenu.tsx","../src/components/MGHGrid/components/Overlays.tsx","../src/components/MGHGrid/components/ActionsCell.tsx","../src/components/MGHGrid/MGHGrid.tsx","../src/components/Confirm-Dialog/confirm-dialog.tsx","../src/components/CustomGridToolbarExport/CustomGridToolbarExport.tsx","../src/components/Exporting/Exporting-Dialog.tsx"],"sourcesContent":["import useMediaQuery from '@mui/material/useMediaQuery';\nimport { useTheme, Breakpoint } from '@mui/material/styles';\n\n// ----------------------------------------------------------------------\n\ntype ReturnType = boolean;\n\nexport type Query = 'up' | 'down' | 'between' | 'only';\n\nexport type Value = Breakpoint | number;\n\nexport function useResponsive(query: Query, start?: Value, end?: Value): ReturnType {\n const theme = useTheme();\n\n const mediaUp = useMediaQuery(theme.breakpoints.up(start as Value));\n\n const mediaDown = useMediaQuery(theme.breakpoints.down(start as Value));\n\n const mediaBetween = useMediaQuery(theme.breakpoints.between(start as Value, end as Value));\n\n const mediaOnly = useMediaQuery(theme.breakpoints.only(start as Breakpoint));\n\n if (query === 'up') {\n return mediaUp;\n }\n\n if (query === 'down') {\n return mediaDown;\n }\n\n if (query === 'between') {\n return mediaBetween;\n }\n\n return mediaOnly;\n}\n\n// ----------------------------------------------------------------------\n\ntype BreakpointOrNull = Breakpoint | null;\n\nexport function useWidth() {\n const theme = useTheme();\n\n const keys = [...theme.breakpoints.keys].reverse();\n\n return (\n keys.reduce((output: BreakpointOrNull, key: Breakpoint) => {\n const matches = useMediaQuery(theme.breakpoints.up(key));\n\n return !output && matches ? key : output;\n }, null) || 'xs'\n );\n}\n","import styled from '@emotion/styled';\n\nimport { Box } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport { NoRowsOverlayPropsOverrides } from '@mui/x-data-grid-premium';\n// import { NoRowsOverlayPropsOverrides } from '@mui/x-data-grid-premium';\n\nimport React from 'react';\n// import { NoRowsOverlayPropsOverrides } from './CustomNoRowsOverlay.types';\n\n/// ---------------------------------------------------------------------------------------\n\ndeclare module '@mui/x-data-grid-premium' {\n export interface NoRowsOverlayPropsOverrides {\n text: string;\n useSettingsContext?: () => { themeMode?: string };\n }\n}\n\n/// ---------------------------------------------------------------------------------------\n\nexport default function CustomNoRowsOverlay({ text, useSettingsContext }: NoRowsOverlayPropsOverrides) {\n const theme = useTheme();\n const themeMode = useSettingsContext?.()?.themeMode ?? theme.palette.mode ?? 'light';\n\n const StyledGridOverlay = styled('div')(() => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n '& .ant-empty-img-1': {\n fill: themeMode === 'light' ? '#aeb8c2' : '#262626',\n },\n '& .ant-empty-img-2': {\n fill: themeMode === 'light' ? '#f5f5f7' : '#595959',\n },\n '& .ant-empty-img-3': {\n fill: themeMode === 'light' ? '#dce0e6' : '#434343',\n },\n '& .ant-empty-img-4': {\n fill: themeMode === 'light' ? '#fff' : '#1c1c1c',\n },\n '& .ant-empty-img-5': {\n fillOpacity: themeMode === 'light' ? '0.8' : '0.08',\n fill: themeMode === 'light' ? '#f5f5f5' : '#fff',\n },\n }));\n return (\n <StyledGridOverlay>\n <Box\n component=\"img\"\n alt=\"empty content\"\n src=\"/assets/icons/empty/ic_content.svg\"\n sx={{ width: 50, maxWidth: 160 }}\n />\n <Box sx={{ mb: 0 }}>{text}</Box>\n </StyledGridOverlay>\n );\n}\n","import React, { JSX } from 'react';\nimport dayjs from 'dayjs';\n\nimport { DateRange } from '@mui/x-date-pickers-pro';\n// `GridInitialStatePremium` itself only lives under an internal (non-exported) subpath; the\n// package re-exports it under this name from its public entry point instead.\nimport { GridInitialState as GridInitialStatePremium } from '@mui/x-data-grid-premium';\nimport { Box, Card, Theme, Badge, styled, SxProps, Tooltip, TextField, CardHeader, InputAdornment } from '@mui/material';\nimport {\n Toolbar,\n GridColDef,\n QuickFilter,\n GridRowParams,\n ToolbarButton,\n GridCloseIcon,\n GridSearchIcon,\n DataGridPremium,\n GridToolbarProps,\n QuickFilterClear,\n GridEventListener,\n GridSlotsComponent,\n FilterPanelTrigger,\n GridViewColumnIcon,\n GridFilterListIcon,\n QuickFilterControl,\n QuickFilterTrigger,\n GridCallbackDetails,\n ColumnsPanelTrigger,\n GridRowHeightParams,\n GridCsvExportOptions,\n GridRowSelectionModel,\n GridCsvExportMenuItem,\n ToolbarPropsOverrides,\n GridRowClassNameParams,\n GridExcelExportOptions,\n GridPrintExportOptions,\n GridExcelExportMenuItem,\n GridPrintExportMenuItem,\n GridSlotsComponentsProps,\n GridExportDisplayOptions,\n GridRowHeightReturnValue,\n GridColumnVisibilityModel,\n GridToolbarExportContainer,\n GridPinnedRowsProp,\n} from '@mui/x-data-grid-premium';\nimport { useResponsive } from '../../hooks/useResponsive';\nimport CustomNoRowsOverlay from '../CustomNoRowsOverlay/CustomNoRowsOverlay';\n\ninterface CustomToolbarProps {\n dateValues: React.SetStateAction<DateRange<dayjs.Dayjs>>;\n setDateValues: React.Dispatch<React.SetStateAction<DateRange<dayjs.Dayjs>>>;\n renderDateRange?: React.ReactNode;\n customMenuItem?: JSX.Element[];\n currentParentFolderKey?: number | null;\n types?: any;\n typeKey?: number;\n setTypeKey?: React.Dispatch<React.SetStateAction<number>>;\n userData?: unknown;\n exporting?: boolean;\n setExporting?: React.Dispatch<React.SetStateAction<boolean>>;\n}\n\ninterface MGHDataGridProps {\n rows: any[];\n columns: GridColDef[];\n onRowClick?: GridEventListener<'rowClick'>;\n onRowDoubleClick?: GridEventListener<'rowDoubleClick'>;\n header: string;\n pagination?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n slots?: Partial<GridSlotsComponent>;\n slotProps?: GridSlotsComponentsProps & {\n toolbar?: Partial<GridToolbarProps & ToolbarPropsOverrides & CustomToolbarProps>;\n };\n toolbarProps?: any;\n initialState?: GridInitialStatePremium;\n sx?: SxProps<Theme>;\n cardSx?: SxProps<Theme>;\n boxSx?: SxProps<Theme>;\n columnVisibilityModel?: GridColumnVisibilityModel;\n onColumnVisibilityModelChange?: (model: GridColumnVisibilityModel, details: GridCallbackDetails) => void;\n columnVisibilityStorageKey?: string;\n columnOrderStorageKey?: string;\n disableDensitySelector?: boolean;\n disableRowSelectionOnClick?: boolean;\n disableColumnFilter?: boolean;\n disableColumnMenu?: boolean;\n disableColumnSelector?: boolean;\n renderHeaderEndContent?: JSX.Element;\n renderHeaderCenterContent?: JSX.Element;\n noRowsText?: string;\n checkboxSelection?: boolean;\n checkboxSelectionVisibleOnly?: boolean;\n onRowSelectionModelChange?:\n | ((rowSelectionModel: GridRowSelectionModel, details: GridCallbackDetails<any>) => void)\n | undefined;\n rowSelectionModel?: GridRowSelectionModel | undefined;\n getRowClassName?: ((params: GridRowClassNameParams<any>) => string) | undefined;\n getDetailPanelContent?: (params: GridRowParams<any>) => React.ReactNode;\n getDetailPanelHeight?: () => number;\n loading?: boolean;\n isRowSelectable?: (params: GridRowParams<any>) => boolean;\n getRowHeight?: ((params: GridRowHeightParams) => GridRowHeightReturnValue) | undefined;\n showToolbar?: boolean;\n hideFooterRowCount?: boolean;\n onColumnOrderChange?: GridEventListener<'columnOrderChange'> | undefined;\n defaultGroupingExpansionDepth?: number;\n pinnedRows?: GridPinnedRowsProp;\n keepNonExistentRowsSelected?: boolean;\n}\n\nconst canUseLocalStorage = () => typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nconst readLocalStorage = <T,>(key: string): T | null => {\n if (!canUseLocalStorage()) {\n return null;\n }\n try {\n const value = window.localStorage.getItem(key);\n return value ? (JSON.parse(value) as T) : null;\n } catch {\n return null;\n }\n};\n\nconst writeLocalStorage = (key: string, value: unknown) => {\n if (!canUseLocalStorage()) {\n return;\n }\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n return;\n }\n};\n\nconst normalizeOrderedFields = (orderedFields: string[] | null, columns: GridColDef[]) => {\n if (!orderedFields || orderedFields.length === 0) {\n return undefined;\n }\n const columnFields = new Set(columns.map((column) => column.field));\n return orderedFields.filter((field) => columnFields.has(field));\n};\n\nexport default function MGHDataGrid({\n header,\n rows,\n columns,\n onRowClick,\n onRowDoubleClick,\n pagination = true,\n pageSize = 25,\n slots = {},\n slotProps = {},\n toolbarProps = {},\n initialState = {},\n pageSizeOptions = [10, 25, 50, 100],\n sx = {},\n cardSx = { flexGrow: 1 },\n boxSx = { flexGrow: 1 },\n columnVisibilityModel,\n onColumnVisibilityModelChange,\n columnVisibilityStorageKey,\n columnOrderStorageKey,\n disableDensitySelector = false,\n disableRowSelectionOnClick = true,\n disableColumnFilter = false,\n disableColumnMenu = false,\n disableColumnSelector = false,\n checkboxSelectionVisibleOnly = false,\n renderHeaderEndContent,\n renderHeaderCenterContent,\n noRowsText = 'No data found within selected parameters.',\n checkboxSelection = false,\n onRowSelectionModelChange = undefined,\n rowSelectionModel = undefined,\n getRowClassName = undefined,\n getDetailPanelContent,\n getDetailPanelHeight,\n loading = false,\n isRowSelectable = undefined,\n getRowHeight,\n showToolbar = true,\n hideFooterRowCount = false,\n onColumnOrderChange = undefined,\n defaultGroupingExpansionDepth = undefined,\n pinnedRows = undefined,\n keepNonExistentRowsSelected = true,\n}: MGHDataGridProps) {\n const smDown = useResponsive('down', 'sm');\n const persistedColumnVisibilityModel = React.useMemo(() => {\n if (!columnVisibilityStorageKey) {\n return undefined;\n }\n return readLocalStorage<GridColumnVisibilityModel>(columnVisibilityStorageKey) ?? undefined;\n }, [columnVisibilityStorageKey]);\n\n const persistedOrderedFields = React.useMemo(() => {\n if (!columnOrderStorageKey) {\n return undefined;\n }\n const storedOrder = readLocalStorage<string[]>(columnOrderStorageKey);\n return normalizeOrderedFields(storedOrder, columns);\n }, [columnOrderStorageKey, columns]);\n\n const resolvedColumnVisibilityModel =\n columnVisibilityModel !== undefined ? columnVisibilityModel : persistedColumnVisibilityModel;\n\n const handleColumnVisibilityModelChange = React.useCallback(\n (model: GridColumnVisibilityModel, details: GridCallbackDetails) => {\n if (columnVisibilityStorageKey) {\n writeLocalStorage(columnVisibilityStorageKey, model);\n }\n onColumnVisibilityModelChange?.(model, details);\n },\n [columnVisibilityStorageKey, onColumnVisibilityModelChange]\n );\n\n const handleColumnOrderChange = React.useCallback<GridEventListener<'columnOrderChange'>>(\n (params, event, details) => {\n if (columnOrderStorageKey) {\n const orderedFields = details.api.getAllColumns().map((column) => column.field);\n writeLocalStorage(columnOrderStorageKey, orderedFields);\n }\n onColumnOrderChange?.(params, event, details);\n },\n [columnOrderStorageKey, onColumnOrderChange]\n );\n\n const mergedInitialState: GridInitialStatePremium = {\n density: 'compact',\n pagination: { paginationModel: { pageSize } },\n filter: {\n filterModel: {\n items: [],\n quickFilterExcludeHiddenColumns: false,\n },\n },\n ...initialState,\n columns: {\n ...initialState?.columns,\n columnVisibilityModel: resolvedColumnVisibilityModel ?? initialState?.columns?.columnVisibilityModel,\n orderedFields: persistedOrderedFields ?? initialState?.columns?.orderedFields,\n },\n };\n\n return (\n <Card sx={{ height: 'auto', ...cardSx }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', pr: 1 }}>\n <CardHeader title={header} sx={{ mb: 2 }} />\n {renderHeaderCenterContent}\n <Box\n sx={{\n display: 'flex',\n gap: smDown ? 1 : 2,\n alignItems: 'center',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n }}\n >\n {renderHeaderEndContent}\n </Box>\n </Box>\n <Box component=\"div\" sx={{ display: 'flex', flexDirection: 'column', flexGrow: 1, ...boxSx }}>\n <DataGridPremium\n loading={loading}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n rows={rows}\n columns={columns}\n pagination={pagination}\n disableDensitySelector={disableDensitySelector}\n disableRowSelectionOnClick={disableRowSelectionOnClick}\n disableColumnFilter={disableColumnFilter}\n disableColumnMenu={disableColumnMenu}\n disableColumnSelector={disableColumnSelector}\n slots={{ noRowsOverlay: CustomNoRowsOverlay, toolbar: MGHGridToolbar, ...slots }}\n slotProps={{ noRowsOverlay: { text: noRowsText }, toolbar: toolbarProps, ...slotProps }}\n initialState={mergedInitialState}\n pageSizeOptions={pageSizeOptions}\n sx={{\n '& .MuiDataGrid-row:hover': {\n cursor: onRowClick || onRowDoubleClick ? 'pointer' : 'default',\n },\n ...sx,\n }}\n \n onColumnVisibilityModelChange={handleColumnVisibilityModelChange}\n checkboxSelection={checkboxSelection}\n onRowSelectionModelChange={onRowSelectionModelChange}\n rowSelectionModel={rowSelectionModel}\n isRowSelectable={isRowSelectable}\n getRowClassName={getRowClassName}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n checkboxSelectionVisibleOnly={checkboxSelectionVisibleOnly}\n disableRowSelectionExcludeModel\n showToolbar={showToolbar}\n hideFooterRowCount={hideFooterRowCount}\n getRowHeight={getRowHeight}\n onColumnOrderChange={handleColumnOrderChange}\n defaultGroupingExpansionDepth={defaultGroupingExpansionDepth}\n pinnedRows={pinnedRows}\n keepNonExistentRowsSelected={keepNonExistentRowsSelected}\n />\n </Box>\n </Card>\n );\n}\n\ninterface MGHGridToolbarProps {\n showColumnsButton?: boolean;\n showFilterButton?: boolean;\n showExportButton?: boolean;\n showQuickFilter?: boolean;\n renderOtherButtons?: JSX.Element;\n renderDateRange?: JSX.Element;\n customMenuItem?: JSX.Element[];\n showCsvOption?: boolean;\n}\nexport function MGHGridToolbar({\n showColumnsButton = true,\n showFilterButton = true,\n showExportButton = true,\n showQuickFilter = true,\n renderOtherButtons,\n renderDateRange,\n customMenuItem,\n showCsvOption = true,\n}: MGHGridToolbarProps) {\n return (\n <Toolbar style={{ display: 'flex', justifyContent: 'space-between' }}>\n <div>\n {showColumnsButton && (\n <Tooltip title=\"Columns\">\n <ColumnsPanelTrigger render={<ToolbarButton />}>\n <GridViewColumnIcon fontSize=\"small\" />\n </ColumnsPanelTrigger>\n </Tooltip>\n )}\n {showFilterButton && (\n <Tooltip title=\"Filters\">\n <FilterPanelTrigger\n render={(props, state) => (\n <ToolbarButton {...props} color=\"default\">\n <Badge badgeContent={state.filterCount} color=\"primary\" variant=\"dot\">\n <GridFilterListIcon fontSize=\"small\" />\n </Badge>\n </ToolbarButton>\n )}\n />\n </Tooltip>\n )}\n {showExportButton && (\n <CustomGridToolbarExport customMenuItem={customMenuItem} showCsvOption={showCsvOption} />\n )}\n </div>\n\n {renderDateRange}\n\n <div>\n {renderOtherButtons}\n {showQuickFilter && <DataGridQuickFilter />}\n </div>\n </Toolbar>\n );\n}\n\ninterface ExportContainerProps {\n csvOptions?: GridCsvExportOptions & GridExportDisplayOptions;\n excelOptions?: GridExcelExportOptions & GridExportDisplayOptions;\n printOptions?: GridPrintExportOptions & GridExportDisplayOptions;\n customMenuItem?: JSX.Element[] | undefined;\n showCsvOption?: boolean;\n}\nexport const CustomGridToolbarExport = ({\n csvOptions = { allColumns: true },\n excelOptions = { allColumns: true },\n printOptions,\n customMenuItem,\n showCsvOption = true,\n ...other\n}: ExportContainerProps) => (\n <GridToolbarExportContainer {...other}>\n {customMenuItem?.map((el) => el)}\n {showCsvOption && <GridCsvExportMenuItem options={csvOptions} />}\n <GridExcelExportMenuItem options={excelOptions} />\n <GridPrintExportMenuItem options={printOptions} />\n </GridToolbarExportContainer>\n);\n\nexport function DataGridQuickFilter() {\n type OwnerState = {\n expanded: boolean;\n };\n\n const StyledQuickFilter = styled(QuickFilter)({\n display: 'grid',\n alignItems: 'center',\n });\n\n const StyledToolbarButton = styled(ToolbarButton)<{ ownerState: OwnerState }>(({ theme, ownerState }) => ({\n gridArea: '1 / 1',\n width: 'min-content',\n height: 'min-content',\n zIndex: 1,\n opacity: ownerState.expanded ? 0 : 1,\n pointerEvents: ownerState.expanded ? 'none' : 'auto',\n transition: theme.transitions.create(['opacity']),\n }));\n\n const StyledTextField = styled(TextField)<{\n ownerState: OwnerState;\n }>(({ theme, ownerState }) => ({\n gridArea: '1 / 1',\n overflowX: 'clip',\n width: ownerState.expanded ? 260 : 'var(--trigger-width)',\n opacity: ownerState.expanded ? 1 : 0,\n transition: theme.transitions.create(['width', 'opacity']),\n }));\n\n return (\n <StyledQuickFilter>\n <QuickFilterTrigger\n render={(triggerProps, state) => (\n <Tooltip title=\"Search\" enterDelay={0}>\n <StyledToolbarButton\n {...triggerProps}\n ownerState={{ expanded: state.expanded }}\n color=\"default\"\n aria-disabled={state.expanded}\n >\n <GridSearchIcon fontSize=\"small\" />\n </StyledToolbarButton>\n </Tooltip>\n )}\n />\n <QuickFilterControl\n render={({ ref, ...controlProps }, state) => (\n <StyledTextField\n {...controlProps}\n ownerState={{ expanded: state.expanded }}\n inputRef={ref}\n aria-label=\"Search\"\n placeholder=\"Search...\"\n size=\"small\"\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <GridSearchIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: state.value ? (\n <InputAdornment position=\"end\">\n <QuickFilterClear\n edge=\"end\"\n size=\"small\"\n aria-label=\"Clear search\"\n material={{ sx: { marginRight: -0.75 } }}\n >\n <GridCloseIcon fontSize=\"small\" />\n </QuickFilterClear>\n </InputAdornment>\n ) : null,\n ...controlProps.slotProps?.input,\n },\n ...controlProps.slotProps,\n }}\n />\n )}\n />\n </StyledQuickFilter>\n );\n}\n","import { forwardRef } from 'react';\nimport { Icon } from '@iconify/react';\n\nimport { IconifyProps } from './types';\nimport React from 'react';\n\n// ----------------------------------------------------------------------\n\ninterface Props {\n icon: IconifyProps;\n width?: number;\n height?: number;\n sx?: any;\n}\n\nconst Iconify = forwardRef<SVGElement, Props>(({ icon, width = 20, sx, ...other }, ref) => (\n <Icon icon={icon} style={{ width: 20, height: width ?? 20, ...sx }} />\n));\n\nexport default Iconify;\n","import type { ComponentProps, ComponentType } from 'react';\nimport Box from '@mui/material/Box';\nimport { alpha, styled, useTheme } from '@mui/material/styles';\nimport { LabelColor, LabelVariant } from './types';\n\n// ----------------------------------------------------------------------\n\ninterface StyledLabelOwnerState {\n color: LabelColor;\n variant: LabelVariant;\n}\n\n// Explicitly annotated so TS doesn't need to synthesize (and re-print) an anonymous type that\n// references @mui/system's install path — under pnpm that path is store-relative and triggers\n// TS2742 (\"inferred type cannot be named without a reference to ...\") during declaration emit.\nexport const StyledLabel = styled(Box)(({\n // theme,\n ownerState,\n}: {\n // theme: Theme;\n ownerState: StyledLabelOwnerState;\n}) => {\n const theme = useTheme();\n\n const lightMode = theme.palette.mode === 'light';\n\n const filledVariant = ownerState.variant === 'filled';\n\n const outlinedVariant = ownerState.variant === 'outlined';\n\n const softVariant = ownerState.variant === 'soft';\n\n const defaultStyle = {\n ...(ownerState.color === 'default' && {\n // FILLED\n ...(filledVariant && {\n color: lightMode ? theme.palette.common.white : theme.palette.grey[800],\n backgroundColor: theme.palette.text.primary,\n }),\n // OUTLINED\n ...(outlinedVariant && {\n backgroundColor: 'transparent',\n color: theme.palette.text.primary,\n border: `2px solid ${theme.palette.text.primary}`,\n }),\n // SOFT\n ...(softVariant && {\n color: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.grey[500], 0.16),\n }),\n }),\n };\n\n const colorStyle = {\n ...(ownerState.color !== 'default' && {\n // FILLED\n ...(filledVariant && {\n color: theme.palette[ownerState.color].contrastText,\n backgroundColor: theme.palette[ownerState.color].main,\n }),\n // OUTLINED\n ...(outlinedVariant && {\n backgroundColor: 'transparent',\n color: theme.palette[ownerState.color].main,\n border: `2px solid ${theme.palette[ownerState.color].main}`,\n }),\n // SOFT\n ...(softVariant && {\n color: theme.palette[ownerState.color][lightMode ? 'dark' : 'light'],\n backgroundColor: alpha(theme.palette[ownerState.color].main, 0.16),\n }),\n }),\n };\n\n return {\n height: 24,\n minWidth: 24,\n lineHeight: 0,\n borderRadius: 6,\n cursor: 'default',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n display: 'inline-flex',\n justifyContent: 'center',\n textTransform: 'capitalize',\n padding: theme.spacing(0, 0.75),\n fontSize: theme.typography.pxToRem(12),\n fontWeight: theme.typography.fontWeightBold,\n transition: theme.transitions.create('all', {\n duration: theme.transitions.duration.shorter,\n }),\n ...defaultStyle,\n ...colorStyle,\n };\n}) as ComponentType<ComponentProps<typeof Box> & { ownerState: StyledLabelOwnerState }>;\n","import { forwardRef } from 'react';\n\nimport Box from '@mui/material/Box';\nimport { LabelProps } from './types';\nimport { StyledLabel } from './styles';\nimport React from 'react';\n\n// ----------------------------------------------------------------------\n\nconst Label = forwardRef<HTMLSpanElement, LabelProps>(\n ({ children, color = 'default', variant = 'soft', startIcon, endIcon, sx, ...other }, ref) => {\n // const theme = useTheme();\n\n const iconStyles = {\n width: 16,\n height: 16,\n '& svg, img': { width: 1, height: 1, objectFit: 'cover' },\n };\n\n return (\n <StyledLabel\n ref={ref}\n // component=\"span\"\n ownerState={{ color, variant }}\n sx={{\n ...(startIcon && { pl: 0.75 }),\n ...(endIcon && { pr: 0.75 }),\n ...sx,\n }}\n // theme={theme}\n {...other}\n >\n {startIcon && <Box sx={{ mr: 0.75, ...iconStyles }}> {startIcon} </Box>}\n\n {children}\n\n {endIcon && <Box sx={{ ml: 0.75, ...iconStyles }}> {endIcon} </Box>}\n </StyledLabel>\n );\n }\n);\n\nexport default Label;\n","import dayjs from 'dayjs';\nimport {\n MGHGridAggregationFunction,\n MGHGridApi,\n MGHGridColDef,\n MGHGridColType,\n MGHGridComparatorFn,\n MGHGridFilterItem,\n MGHGridFilterOperator,\n MGHGridLocaleText,\n MGHGridRowId,\n MGHGridRowSelectionModel,\n MGHGridRowSelectionModelInput,\n MGHGridValidRowModel,\n MGHGridValueOption,\n MGHGridValueOptionObject,\n} from './MGHGrid.types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * ----------------------------------------------------------------------------------------------- */\n\nexport const GROUPING_COLUMN_FIELD = '__row_group_by_columns_group__';\nexport const CHECKBOX_FIELD = '__check__';\nexport const DETAIL_PANEL_TOGGLE_FIELD = '__detail_panel_toggle__';\nexport const AGGREGATION_FOOTER_ID = '__aggregation_footer__';\nexport const INTERNAL_FIELDS = new Set<string>([CHECKBOX_FIELD, DETAIL_PANEL_TOGGLE_FIELD]);\n\nexport const DENSITY_FACTORS = { compact: 0.7, standard: 1, comfortable: 1.3 } as const;\nexport const DEFAULT_ROW_HEIGHT = 52;\nexport const DEFAULT_HEADER_HEIGHT = 56;\nexport const DEFAULT_COLUMN_WIDTH = 100;\nexport const DEFAULT_COLUMN_MIN_WIDTH = 50;\nexport const CHECKBOX_COLUMN_WIDTH = 50;\nexport const DETAIL_TOGGLE_COLUMN_WIDTH = 50;\nexport const GROUPING_COLUMN_WIDTH = 220;\n\nexport const isInternalField = (field: string) => INTERNAL_FIELDS.has(field) || field === GROUPING_COLUMN_FIELD;\n\n/* -------------------------------------------------------------------------------------------------\n * Generic helpers\n * ----------------------------------------------------------------------------------------------- */\n\nexport const isNil = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isEmptyValue = (value: unknown) => isNil(value) || value === '' || (Array.isArray(value) && value.length === 0);\n\nexport const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max);\n\nexport const cx = (...classNames: Array<string | false | null | undefined>) => classNames.filter(Boolean).join(' ');\n\nexport const arraysEqual = <T>(a: T[] | undefined, b: T[] | undefined) => {\n if (a === b) return true;\n if (!a || !b || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\nexport const moveItem = <T>(list: T[], from: number, to: number): T[] => {\n const next = list.slice();\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item);\n return next;\n};\n\nexport const uniqueId = (() => {\n let counter = 0;\n return (prefix = 'mgh') => {\n counter += 1;\n return `${prefix}-${counter}`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * Local storage\n * ----------------------------------------------------------------------------------------------- */\n\nexport const canUseLocalStorage = () => typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport const readLocalStorage = <T>(key: string): T | null => {\n if (!canUseLocalStorage()) return null;\n try {\n const value = window.localStorage.getItem(key);\n return value ? (JSON.parse(value) as T) : null;\n } catch {\n return null;\n }\n};\n\nexport const writeLocalStorage = (key: string, value: unknown) => {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n /* ignore quota / privacy errors */\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Rows\n * ----------------------------------------------------------------------------------------------- */\n\nexport const getRowIdFromRow = <R extends MGHGridValidRowModel>(row: R, getRowId?: (row: R) => MGHGridRowId) =>\n getRowId ? getRowId(row) : (row.id as MGHGridRowId);\n\nexport const normalizeSelectionModel = (\n input: MGHGridRowSelectionModelInput | undefined,\n allIds?: MGHGridRowId[]\n): MGHGridRowSelectionModel => {\n if (!input) return { type: 'include', ids: new Set() };\n if (Array.isArray(input)) return { type: 'include', ids: new Set(input) };\n if (input instanceof Set) return { type: 'include', ids: new Set(input) };\n if (input.type === 'exclude' && allIds) {\n const ids = new Set<MGHGridRowId>();\n allIds.forEach((id) => {\n if (!input.ids.has(id)) ids.add(id);\n });\n return { type: 'include', ids };\n }\n return { type: 'include', ids: new Set(input.ids) };\n};\n\nexport const selectionModelsEqual = (a: MGHGridRowSelectionModel, b: MGHGridRowSelectionModel) => {\n if (a.ids.size !== b.ids.size) return false;\n let equal = true;\n a.ids.forEach((id) => {\n if (!b.ids.has(id)) equal = false;\n });\n return equal;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dates\n * ----------------------------------------------------------------------------------------------- */\n\nexport const toDate = (value: unknown): Date | null => {\n if (isNil(value) || value === '') return null;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;\n if (dayjs.isDayjs(value)) return value.isValid() ? value.toDate() : null;\n if (typeof value === 'number') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n if (typeof value === 'string') {\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed.toDate() : null;\n }\n return null;\n};\n\nexport const formatDate = (value: unknown, withTime: boolean) => {\n const date = toDate(value);\n if (!date) return '';\n return dayjs(date).format(withTime ? 'M/D/YYYY h:mm A' : 'M/D/YYYY');\n};\n\nconst startOfUnit = (date: Date, withTime: boolean) =>\n withTime ? dayjs(date).startOf('minute').valueOf() : dayjs(date).startOf('day').valueOf();\n\n/* -------------------------------------------------------------------------------------------------\n * Value options (singleSelect)\n * ----------------------------------------------------------------------------------------------- */\n\nexport const isValueOptionObject = (option: MGHGridValueOption): option is MGHGridValueOptionObject =>\n typeof option === 'object' && option !== null;\n\nexport const getOptionValue = (col: MGHGridColDef, option: MGHGridValueOption) =>\n col.getOptionValue ? col.getOptionValue(option) : isValueOptionObject(option) ? option.value : option;\n\nexport const getOptionLabel = (col: MGHGridColDef, option: MGHGridValueOption) =>\n col.getOptionLabel ? col.getOptionLabel(option) : isValueOptionObject(option) ? option.label : String(option);\n\nexport const resolveValueOptions = (col: MGHGridColDef, row?: MGHGridValidRowModel, id?: MGHGridRowId) => {\n if (!col.valueOptions) return [] as MGHGridValueOption[];\n return typeof col.valueOptions === 'function' ? col.valueOptions({ field: col.field, row, id }) : col.valueOptions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Cell values\n * ----------------------------------------------------------------------------------------------- */\n\nexport const getCellValue = (row: MGHGridValidRowModel, col: MGHGridColDef, api: MGHGridApi) => {\n const raw = row ? row[col.field] : undefined;\n return col.valueGetter ? col.valueGetter(raw, row, col, api) : raw;\n};\n\nexport const getGroupingValue = (row: MGHGridValidRowModel, col: MGHGridColDef, api: MGHGridApi) => {\n if (col.groupingValueGetter) return col.groupingValueGetter(row[col.field], row, col, api);\n return getCellValue(row, col, api);\n};\n\nexport const defaultFormatValue = (value: any, col: MGHGridColDef, row?: MGHGridValidRowModel, id?: MGHGridRowId) => {\n if (isNil(value)) return '';\n switch (col.type) {\n case 'date':\n return formatDate(value, false);\n case 'dateTime':\n return formatDate(value, true);\n case 'boolean':\n return value ? 'Yes' : 'No';\n case 'singleSelect': {\n const options = resolveValueOptions(col, row, id);\n const match = options.find((option) => getOptionValue(col, option) === value);\n return match !== undefined ? getOptionLabel(col, match) : String(value);\n }\n case 'number':\n return typeof value === 'number' ? (Number.isFinite(value) ? String(value) : '') : String(value);\n default:\n if (value instanceof Date) return formatDate(value, true);\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n};\n\nexport const getFormattedValue = (\n value: any,\n row: MGHGridValidRowModel,\n col: MGHGridColDef,\n api: MGHGridApi,\n id?: MGHGridRowId\n) => {\n if (col.valueFormatter) return col.valueFormatter(value, row, col, api);\n return defaultFormatValue(value, col, row, id);\n};\n\nexport const formattedValueToString = (formatted: any): string => {\n if (isNil(formatted)) return '';\n if (typeof formatted === 'string') return formatted;\n if (typeof formatted === 'number' || typeof formatted === 'boolean') return String(formatted);\n if (formatted instanceof Date) return formatDate(formatted, true);\n if (typeof formatted === 'object' && 'props' in formatted) return '';\n return String(formatted);\n};\n\nexport const parseEditValue = (raw: any, col: MGHGridColDef) => {\n switch (col.type) {\n case 'number': {\n if (raw === '' || isNil(raw)) return null;\n const n = Number(raw);\n return Number.isNaN(n) ? raw : n;\n }\n case 'boolean':\n return Boolean(raw);\n case 'date':\n case 'dateTime': {\n if (raw === '' || isNil(raw)) return null;\n const d = toDate(raw);\n return d ?? raw;\n }\n default:\n return raw;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Sorting\n * ----------------------------------------------------------------------------------------------- */\n\nconst collator = typeof Intl !== 'undefined' ? new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }) : null;\n\nconst nilFirst = (v1: any, v2: any): number | null => {\n const n1 = isNil(v1) || v1 === '';\n const n2 = isNil(v2) || v2 === '';\n if (n1 && n2) return 0;\n if (n1) return -1;\n if (n2) return 1;\n return null;\n};\n\nexport const numberComparator: MGHGridComparatorFn = (v1, v2) => {\n const nil = nilFirst(v1, v2);\n if (nil !== null) return nil;\n return Number(v1) - Number(v2);\n};\n\nexport const stringComparator: MGHGridComparatorFn = (v1, v2) => {\n const nil = nilFirst(v1, v2);\n if (nil !== null) return nil;\n const s1 = String(v1);\n const s2 = String(v2);\n if (collator) return collator.compare(s1, s2);\n return s1 < s2 ? -1 : s1 > s2 ? 1 : 0;\n};\n\nexport const stringOrNumberComparator: MGHGridComparatorFn = (v1, v2, p1, p2) => {\n if (typeof v1 === 'number' && typeof v2 === 'number') return numberComparator(v1, v2, p1, p2);\n return stringComparator(v1, v2, p1, p2);\n};\n\nexport const dateComparator: MGHGridComparatorFn = (v1, v2) => {\n const d1 = toDate(v1);\n const d2 = toDate(v2);\n const nil = nilFirst(d1, d2);\n if (nil !== null) return nil;\n return (d1 as Date).getTime() - (d2 as Date).getTime();\n};\n\nexport const booleanComparator: MGHGridComparatorFn = (v1, v2) => {\n const nil = nilFirst(v1, v2);\n if (nil !== null) return nil;\n return Number(Boolean(v1)) - Number(Boolean(v2));\n};\n\nexport const getDefaultComparator = (type: MGHGridColType | undefined): MGHGridComparatorFn => {\n switch (type) {\n case 'number':\n return numberComparator;\n case 'date':\n case 'dateTime':\n return dateComparator;\n case 'boolean':\n return booleanComparator;\n default:\n return stringOrNumberComparator;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Filter operators\n * ----------------------------------------------------------------------------------------------- */\n\nconst lower = (value: unknown) => (isNil(value) ? '' : String(value).toLowerCase());\n\nconst hasValue = (item: MGHGridFilterItem) => !isEmptyValue(item.value);\n\nexport const stringFilterOperators: MGHGridFilterOperator[] = [\n {\n value: 'contains',\n label: 'contains',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value).indexOf(needle) !== -1;\n },\n },\n {\n value: 'doesNotContain',\n label: 'does not contain',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value).indexOf(needle) === -1;\n },\n },\n {\n value: 'equals',\n label: 'equals',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value) === needle;\n },\n },\n {\n value: 'doesNotEqual',\n label: 'does not equal',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value) !== needle;\n },\n },\n {\n value: 'startsWith',\n label: 'starts with',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value).indexOf(needle) === 0;\n },\n },\n {\n value: 'endsWith',\n label: 'ends with',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => {\n const s = lower(value);\n return s.length >= needle.length && s.lastIndexOf(needle) === s.length - needle.length;\n };\n },\n },\n {\n value: 'isEmpty',\n label: 'is empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => isEmptyValue(value),\n },\n {\n value: 'isNotEmpty',\n label: 'is not empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => !isEmptyValue(value),\n },\n {\n value: 'isAnyOf',\n label: 'is any of',\n inputType: 'multiselect',\n getApplyFilterFn: (item) => {\n if (!Array.isArray(item.value) || item.value.length === 0) return null;\n const set = new Set(item.value.map(lower));\n return (value) => set.has(lower(value));\n },\n },\n];\n\nconst numberOperator = (\n value: string,\n label: string,\n compare: (cell: number, filter: number) => boolean\n): MGHGridFilterOperator => ({\n value,\n label,\n inputType: 'number',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const filterValue = Number(item.value);\n if (Number.isNaN(filterValue)) return null;\n return (cell) => {\n if (isNil(cell) || cell === '') return false;\n const n = Number(cell);\n return !Number.isNaN(n) && compare(n, filterValue);\n };\n },\n});\n\nexport const numberFilterOperators: MGHGridFilterOperator[] = [\n numberOperator('=', '=', (a, b) => a === b),\n numberOperator('!=', '!=', (a, b) => a !== b),\n numberOperator('>', '>', (a, b) => a > b),\n numberOperator('>=', '>=', (a, b) => a >= b),\n numberOperator('<', '<', (a, b) => a < b),\n numberOperator('<=', '<=', (a, b) => a <= b),\n {\n value: 'isEmpty',\n label: 'is empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => isEmptyValue(value),\n },\n {\n value: 'isNotEmpty',\n label: 'is not empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => !isEmptyValue(value),\n },\n {\n value: 'isAnyOf',\n label: 'is any of',\n inputType: 'multiselect',\n getApplyFilterFn: (item) => {\n if (!Array.isArray(item.value) || item.value.length === 0) return null;\n const set = new Set(item.value.map((v: any) => Number(v)));\n return (value) => !isNil(value) && set.has(Number(value));\n },\n },\n];\n\nconst dateOperator = (\n value: string,\n label: string,\n withTime: boolean,\n compare: (cell: number, filter: number) => boolean\n): MGHGridFilterOperator => ({\n value,\n label,\n inputType: withTime ? 'datetime-local' : 'date',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const filterDate = toDate(item.value);\n if (!filterDate) return null;\n const filterTime = startOfUnit(filterDate, withTime);\n return (cell) => {\n const cellDate = toDate(cell);\n if (!cellDate) return false;\n return compare(startOfUnit(cellDate, withTime), filterTime);\n };\n },\n});\n\nexport const getDateFilterOperators = (withTime: boolean): MGHGridFilterOperator[] => [\n dateOperator('is', 'is', withTime, (a, b) => a === b),\n dateOperator('not', 'is not', withTime, (a, b) => a !== b),\n dateOperator('after', 'is after', withTime, (a, b) => a > b),\n dateOperator('onOrAfter', 'is on or after', withTime, (a, b) => a >= b),\n dateOperator('before', 'is before', withTime, (a, b) => a < b),\n dateOperator('onOrBefore', 'is on or before', withTime, (a, b) => a <= b),\n {\n value: 'isEmpty',\n label: 'is empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => toDate(value) === null,\n },\n {\n value: 'isNotEmpty',\n label: 'is not empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => toDate(value) !== null,\n },\n];\n\nexport const booleanFilterOperators: MGHGridFilterOperator[] = [\n {\n value: 'is',\n label: 'is',\n inputType: 'boolean',\n getApplyFilterFn: (item) => {\n if (isNil(item.value) || item.value === '' || item.value === 'any') return null;\n const expected = item.value === true || item.value === 'true';\n return (value) => Boolean(value) === expected;\n },\n },\n];\n\nexport const singleSelectFilterOperators: MGHGridFilterOperator[] = [\n {\n value: 'is',\n label: 'is',\n inputType: 'select',\n getApplyFilterFn: (item) => {\n if (isNil(item.value) || item.value === '') return null;\n return (value) => String(value) === String(item.value);\n },\n },\n {\n value: 'not',\n label: 'is not',\n inputType: 'select',\n getApplyFilterFn: (item) => {\n if (isNil(item.value) || item.value === '') return null;\n return (value) => String(value) !== String(item.value);\n },\n },\n {\n value: 'isAnyOf',\n label: 'is any of',\n inputType: 'multiselect',\n getApplyFilterFn: (item) => {\n if (!Array.isArray(item.value) || item.value.length === 0) return null;\n const set = new Set(item.value.map(String));\n return (value) => set.has(String(value));\n },\n },\n];\n\nexport const getDefaultFilterOperators = (type: MGHGridColType | undefined): MGHGridFilterOperator[] => {\n switch (type) {\n case 'number':\n return numberFilterOperators;\n case 'date':\n return getDateFilterOperators(false);\n case 'dateTime':\n return getDateFilterOperators(true);\n case 'boolean':\n return booleanFilterOperators;\n case 'singleSelect':\n return singleSelectFilterOperators;\n case 'actions':\n return [];\n default:\n return stringFilterOperators;\n }\n};\n\nexport const getColumnFilterOperators = (col: MGHGridColDef) => col.filterOperators ?? getDefaultFilterOperators(col.type);\n\n/* -------------------------------------------------------------------------------------------------\n * Column normalisation\n * ----------------------------------------------------------------------------------------------- */\n\nexport const normalizeColumn = <R extends MGHGridValidRowModel>(col: MGHGridColDef<R>): MGHGridColDef<R> => {\n const type = col.type ?? 'string';\n const isNumber = type === 'number';\n const isBoolean = type === 'boolean';\n const isActions = type === 'actions';\n return {\n ...col,\n type,\n headerName: col.headerName ?? col.field,\n width: col.width ?? (isActions ? 100 : isBoolean ? 100 : DEFAULT_COLUMN_WIDTH),\n minWidth: col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH,\n align: col.align ?? (isNumber ? 'right' : isBoolean || isActions ? 'center' : 'left'),\n headerAlign: col.headerAlign ?? col.align ?? (isNumber ? 'right' : isBoolean || isActions ? 'center' : 'left'),\n sortable: isActions ? false : (col.sortable ?? true),\n filterable: isActions ? false : (col.filterable ?? true),\n hideable: col.hideable ?? true,\n resizable: col.resizable ?? true,\n pinnable: col.pinnable ?? true,\n groupable: isActions ? false : (col.groupable ?? true),\n aggregable: isActions ? false : (col.aggregable ?? true),\n editable: col.editable ?? false,\n disableColumnMenu: col.disableColumnMenu ?? isActions,\n disableExport: col.disableExport ?? isActions,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Internal (auto-generated) columns\n * ----------------------------------------------------------------------------------------------- */\n\nconst internalColumn = (field: string, width: number): MGHGridColDef =>\n normalizeColumn({\n field,\n headerName: '',\n width,\n minWidth: width,\n maxWidth: width,\n sortable: false,\n filterable: false,\n hideable: false,\n resizable: false,\n pinnable: false,\n groupable: false,\n aggregable: false,\n disableColumnMenu: true,\n disableExport: true,\n disableReorder: true,\n align: 'center',\n headerAlign: 'center',\n });\n\n/** Definition of the checkbox-selection column (equivalent of MUI's GRID_CHECKBOX_SELECTION_COL_DEF). */\nexport const CHECKBOX_COLUMN_DEF: MGHGridColDef = internalColumn(CHECKBOX_FIELD, CHECKBOX_COLUMN_WIDTH);\n/** Definition of the detail-panel toggle column (equivalent of MUI's GRID_DETAIL_PANEL_TOGGLE_COL_DEF). */\nexport const DETAIL_PANEL_TOGGLE_COLUMN_DEF: MGHGridColDef = internalColumn(\n DETAIL_PANEL_TOGGLE_FIELD,\n DETAIL_TOGGLE_COLUMN_WIDTH\n);\n\n/* -------------------------------------------------------------------------------------------------\n * sx -> scoped CSS\n * ----------------------------------------------------------------------------------------------- */\n\nconst UNITLESS_PROPERTIES = new Set([\n 'animationIterationCount',\n 'borderImageOutset',\n 'borderImageSlice',\n 'borderImageWidth',\n 'boxFlex',\n 'boxFlexGroup',\n 'boxOrdinalGroup',\n 'columnCount',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flexPositive',\n 'flexShrink',\n 'flexNegative',\n 'flexOrder',\n 'gridArea',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowSpan',\n 'gridRowStart',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnSpan',\n 'gridColumnStart',\n 'fontWeight',\n 'lineClamp',\n 'lineHeight',\n 'opacity',\n 'order',\n 'orphans',\n 'tabSize',\n 'widows',\n 'zIndex',\n 'zoom',\n 'fillOpacity',\n 'floodOpacity',\n 'stopOpacity',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeWidth',\n]);\n\n/** Keys that are CSS selectors / at-rules rather than CSS properties. */\nexport const isSelectorKey = (key: string) => /[&.:#>\\[\\s*~+,@]/.test(key);\n\nconst toKebabCase = (property: string) => {\n if (property.indexOf('--') === 0) return property;\n const kebab = property.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n return kebab.indexOf('ms-') === 0 ? `-${kebab}` : kebab;\n};\n\nconst formatCssValue = (property: string, value: string | number) =>\n typeof value === 'number' && value !== 0 && !UNITLESS_PROPERTIES.has(property) && property.indexOf('--') !== 0\n ? `${value}px`\n : String(value);\n\nconst serializeDeclarations = (block: Record<string, unknown>) =>\n Object.keys(block)\n .filter((key) => {\n const value = block[key];\n return !isSelectorKey(key) && (typeof value === 'string' || typeof value === 'number');\n })\n .map((key) => `${toKebabCase(key)}:${formatCssValue(key, block[key] as string | number)}`)\n .join(';');\n\nconst scopeSelector = (scope: string, selector: string) =>\n selector\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => (part.indexOf('&') !== -1 ? part.replace(/&/g, scope) : `${scope} ${part}`))\n .join(',');\n\n/**\n * Compiles the nested-selector part of an `sx`-like object into CSS scoped under `scope`.\n * Top-level plain properties are ignored here (they are applied as inline styles instead).\n */\nexport const buildScopedCss = (scope: string, sx: Record<string, unknown> | undefined, out: string[] = []): string[] => {\n if (!sx) return out;\n Object.keys(sx).forEach((key) => {\n const value = sx[key];\n if (!value || typeof value !== 'object') return;\n const block = value as Record<string, unknown>;\n if (key.charAt(0) === '@') {\n const inner: string[] = [];\n const declarations = serializeDeclarations(block);\n if (declarations) inner.push(`${scope}{${declarations}}`);\n buildScopedCss(scope, block, inner);\n if (inner.length) out.push(`${key}{${inner.join('')}}`);\n return;\n }\n const selector = scopeSelector(scope, key);\n const declarations = serializeDeclarations(block);\n if (declarations) out.push(`${selector}{${declarations}}`);\n buildScopedCss(selector, block, out);\n });\n return out;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Aggregation\n * ----------------------------------------------------------------------------------------------- */\n\nconst numericValues = (values: any[]) =>\n values.map((v) => (typeof v === 'number' ? v : Number(v))).filter((n) => !Number.isNaN(n) && n !== null);\n\nexport const BUILT_IN_AGGREGATION_FUNCTIONS: Record<string, MGHGridAggregationFunction> = {\n sum: {\n label: 'sum',\n columnTypes: ['number'],\n apply: ({ values }) => {\n const nums = numericValues(values.filter((v) => !isNil(v) && v !== ''));\n if (nums.length === 0) return null;\n return nums.reduce((acc, n) => acc + n, 0);\n },\n },\n avg: {\n label: 'avg',\n columnTypes: ['number'],\n apply: ({ values }) => {\n const nums = numericValues(values.filter((v) => !isNil(v) && v !== ''));\n if (nums.length === 0) return null;\n return nums.reduce((acc, n) => acc + n, 0) / nums.length;\n },\n },\n min: {\n label: 'min',\n columnTypes: ['number', 'date', 'dateTime'],\n apply: ({ values }) => {\n const defined = values.filter((v) => !isNil(v) && v !== '');\n if (defined.length === 0) return null;\n if (defined.every((v) => typeof v === 'number')) return Math.min(...(defined as number[]));\n const dates = defined.map(toDate);\n if (dates.every((d) => d !== null)) {\n return new Date(Math.min(...dates.map((d) => (d as Date).getTime())));\n }\n return defined.slice().sort((a, b) => stringComparator(a, b, null as any, null as any))[0];\n },\n },\n max: {\n label: 'max',\n columnTypes: ['number', 'date', 'dateTime'],\n apply: ({ values }) => {\n const defined = values.filter((v) => !isNil(v) && v !== '');\n if (defined.length === 0) return null;\n if (defined.every((v) => typeof v === 'number')) return Math.max(...(defined as number[]));\n const dates = defined.map(toDate);\n if (dates.every((d) => d !== null)) {\n return new Date(Math.max(...dates.map((d) => (d as Date).getTime())));\n }\n const sorted = defined.slice().sort((a, b) => stringComparator(a, b, null as any, null as any));\n return sorted[sorted.length - 1];\n },\n },\n size: {\n label: 'size',\n apply: ({ values }) => values.length,\n },\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Locale\n * ----------------------------------------------------------------------------------------------- */\n\nexport const DEFAULT_LOCALE_TEXT: MGHGridLocaleText = {\n noRowsLabel: 'No rows',\n loadingLabel: 'Loading…',\n toolbarColumns: 'Columns',\n toolbarFilters: 'Filters',\n toolbarExport: 'Export',\n toolbarDensity: 'Density',\n toolbarQuickFilterPlaceholder: 'Search...',\n toolbarQuickFilterLabel: 'Search',\n toolbarExportCSV: 'Download as CSV',\n toolbarExportExcel: 'Download as Excel',\n toolbarExportPrint: 'Print',\n densityCompact: 'Compact',\n densityStandard: 'Standard',\n densityComfortable: 'Comfortable',\n columnsPanelSearchPlaceholder: 'Search',\n columnsPanelShowAll: 'Show all',\n columnsPanelHideAll: 'Hide all',\n columnsPanelReset: 'Reset',\n filterPanelAddFilter: 'Add filter',\n filterPanelRemoveAll: 'Remove all',\n filterPanelDeleteIcon: 'Delete',\n filterPanelColumns: 'Columns',\n filterPanelOperator: 'Operator',\n filterPanelValue: 'Value',\n filterPanelInputPlaceholder: 'Filter value',\n filterPanelLogicOperator: 'Logic operator',\n filterPanelOperatorAnd: 'And',\n filterPanelOperatorOr: 'Or',\n columnMenuSortAsc: 'Sort by ASC',\n columnMenuSortDesc: 'Sort by DESC',\n columnMenuUnsort: 'Unsort',\n columnMenuFilter: 'Filter',\n columnMenuHideColumn: 'Hide column',\n columnMenuManageColumns: 'Manage columns',\n columnMenuPinLeft: 'Pin to left',\n columnMenuPinRight: 'Pin to right',\n columnMenuUnpin: 'Unpin',\n columnMenuGroup: (name) => `Group by ${name}`,\n columnMenuUngroup: (name) => `Stop grouping by ${name}`,\n columnMenuAggregation: 'Aggregation',\n aggregationMenuItemHeader: 'Aggregation',\n aggregationFunctionLabelNone: 'none',\n aggregationFunctionLabelSum: 'sum',\n aggregationFunctionLabelAvg: 'avg',\n aggregationFunctionLabelMin: 'min',\n aggregationFunctionLabelMax: 'max',\n aggregationFunctionLabelSize: 'size',\n footerRowSelected: (count) => (count === 1 ? '1 row selected' : `${count.toLocaleString()} rows selected`),\n footerTotalRows: 'Total Rows:',\n footerPaginationRowsPerPage: 'Rows per page:',\n footerPaginationDisplayedRows: (from, to, count) => `${from}–${to} of ${count.toLocaleString()}`,\n footerPaginationFirstPage: 'First page',\n footerPaginationPreviousPage: 'Previous page',\n footerPaginationNextPage: 'Next page',\n footerPaginationLastPage: 'Last page',\n checkboxSelectionHeaderName: 'Checkbox selection',\n checkboxSelectionSelectAllRows: 'Select all rows',\n checkboxSelectionUnselectAllRows: 'Unselect all rows',\n checkboxSelectionSelectRow: 'Select row',\n checkboxSelectionUnselectRow: 'Unselect row',\n booleanCellTrueLabel: 'yes',\n booleanCellFalseLabel: 'no',\n detailPanelToggle: 'Detail panel toggle',\n expandDetailPanel: 'Expand',\n collapseDetailPanel: 'Collapse',\n groupingColumnHeaderName: 'Group',\n groupColumn: (name) => `Group by ${name}`,\n unGroupColumn: (name) => `Stop grouping by ${name}`,\n actionsCellMore: 'more',\n columnHeaderSortIconLabel: 'Sort',\n columnMenuLabel: 'Menu',\n clearSearch: 'Clear search',\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Text measurement (used for autosize)\n * ----------------------------------------------------------------------------------------------- */\n\nlet measureContext: CanvasRenderingContext2D | null | undefined;\n\nexport const measureText = (text: string, font: string) => {\n if (typeof document === 'undefined') return text.length * 8;\n if (measureContext === undefined) {\n const canvas = document.createElement('canvas');\n measureContext = canvas.getContext('2d');\n }\n if (!measureContext) return text.length * 8;\n measureContext.font = font;\n return measureContext.measureText(text).width;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Downloads\n * ----------------------------------------------------------------------------------------------- */\n\nexport const downloadBlob = (blob: Blob, fileName: string) => {\n if (typeof document === 'undefined') return;\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n window.setTimeout(() => {\n document.body.removeChild(anchor);\n URL.revokeObjectURL(url);\n }, 0);\n};\n","import React from 'react';\n\nexport const MGH_GRID_STYLE_ID = 'mgh-grid-styles';\n\n/**\n * Stylesheet for MGHGrid. It is injected once into <head> the first time a grid mounts,\n * so consumers do not need a CSS loader. All colours are CSS variables so the look can be\n * customised globally (by redefining `--mgh-grid-*` on `.mgh-grid-card`) or per instance\n * through the `themeVars` prop.\n */\nexport const MGH_GRID_CSS = `\n.mgh-grid-card {\n --mgh-grid-font-family: inherit;\n --mgh-grid-font-size: 14px;\n --mgh-grid-radius: 16px;\n --mgh-grid-inner-radius: 4px;\n --mgh-grid-paper: #ffffff;\n --mgh-grid-bg: #ffffff;\n --mgh-grid-fg: rgba(0, 0, 0, 0.87);\n --mgh-grid-fg-secondary: rgba(0, 0, 0, 0.6);\n --mgh-grid-fg-disabled: rgba(0, 0, 0, 0.38);\n --mgh-grid-border: rgba(224, 224, 224, 1);\n --mgh-grid-header-bg: #ffffff;\n --mgh-grid-header-fg: rgba(0, 0, 0, 0.87);\n --mgh-grid-hover: rgba(0, 0, 0, 0.04);\n --mgh-grid-hover-strong: rgba(0, 0, 0, 0.08);\n --mgh-grid-selected: rgba(25, 118, 210, 0.08);\n --mgh-grid-selected-hover: rgba(25, 118, 210, 0.12);\n --mgh-grid-primary: #1976d2;\n --mgh-grid-primary-contrast: #ffffff;\n --mgh-grid-focus: #1976d2;\n --mgh-grid-shadow: 0 0 2px rgba(145, 158, 171, 0.2), 0 12px 24px -4px rgba(145, 158, 171, 0.12);\n --mgh-grid-popover-shadow: 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12);\n --mgh-grid-overlay: rgba(255, 255, 255, 0.6);\n --mgh-grid-input-bg: transparent;\n --mgh-grid-input-border: rgba(0, 0, 0, 0.23);\n --mgh-grid-pinned-shadow: rgba(0, 0, 0, 0.12);\n --mgh-grid-group-bg: rgba(0, 0, 0, 0.02);\n --mgh-grid-footer-bg: rgba(0, 0, 0, 0.02);\n --mgh-grid-badge: #1976d2;\n --mgh-grid-scrollbar: rgba(0, 0, 0, 0.3);\n\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n background: var(--mgh-grid-paper);\n color: var(--mgh-grid-fg);\n border-radius: var(--mgh-grid-radius);\n box-shadow: var(--mgh-grid-shadow);\n font-family: var(--mgh-grid-font-family);\n font-size: var(--mgh-grid-font-size);\n line-height: 1.5;\n overflow: hidden;\n box-sizing: border-box;\n}\n.mgh-grid-card[data-mgh-theme=\"dark\"] {\n --mgh-grid-paper: #212b36;\n --mgh-grid-bg: #212b36;\n --mgh-grid-fg: #ffffff;\n --mgh-grid-fg-secondary: rgba(255, 255, 255, 0.7);\n --mgh-grid-fg-disabled: rgba(255, 255, 255, 0.5);\n --mgh-grid-border: rgba(81, 81, 81, 1);\n --mgh-grid-header-bg: #212b36;\n --mgh-grid-header-fg: #ffffff;\n --mgh-grid-hover: rgba(255, 255, 255, 0.08);\n --mgh-grid-hover-strong: rgba(255, 255, 255, 0.16);\n --mgh-grid-selected: rgba(144, 202, 249, 0.16);\n --mgh-grid-selected-hover: rgba(144, 202, 249, 0.24);\n --mgh-grid-primary: #90caf9;\n --mgh-grid-primary-contrast: rgba(0, 0, 0, 0.87);\n --mgh-grid-focus: #90caf9;\n --mgh-grid-shadow: 0 0 2px rgba(0, 0, 0, 0.2), 0 12px 24px -4px rgba(0, 0, 0, 0.12);\n --mgh-grid-overlay: rgba(33, 43, 54, 0.6);\n --mgh-grid-input-border: rgba(255, 255, 255, 0.23);\n --mgh-grid-pinned-shadow: rgba(0, 0, 0, 0.5);\n --mgh-grid-group-bg: rgba(255, 255, 255, 0.03);\n --mgh-grid-footer-bg: rgba(255, 255, 255, 0.03);\n --mgh-grid-badge: #90caf9;\n --mgh-grid-scrollbar: rgba(255, 255, 255, 0.3);\n}\n/* Only our own elements get the border-box reset. A blanket descendant reset would leak into\n consumer content rendered through slots (e.g. MUI TextField inputs rely on content-box). */\n[class*=\"mgh-grid\"], [class*=\"mgh-grid\"]::before, [class*=\"mgh-grid\"]::after { box-sizing: border-box; }\n.mgh-grid-card--plain { box-shadow: none; border-radius: 0; background: transparent; }\n\n/* ---- card header ---- */\n/* Title stays on its row; only the end-content group wraps internally (like the legacy MUI card). */\n.mgh-grid-card-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 16px 16px 16px 0; flex-wrap: nowrap; }\n.mgh-grid-card-title { flex: 0 0 auto; padding: 8px 24px; margin: 0; font-size: 1.125rem; font-weight: 700; line-height: 1.5556; }\n.mgh-grid-card-header-center { flex: 0 1 auto; min-width: 0; display: flex; align-items: center; }\n.mgh-grid-card-header-end { flex: 1 1 auto; min-width: 0; margin-left: auto; display: flex; align-items: center; gap: 16px; flex-wrap: wrap; justify-content: flex-end; }\n@media (max-width: 599.95px) {\n .mgh-grid-card-header { flex-wrap: wrap; }\n .mgh-grid-card-header-end { gap: 8px; }\n}\n\n/* ---- box + root ---- */\n.mgh-grid-box { display: flex; flex-direction: column; flex-grow: 1; min-height: 0; min-width: 0; }\n.mgh-grid {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n min-width: 0;\n border: 1px solid var(--mgh-grid-border);\n border-radius: var(--mgh-grid-inner-radius);\n background: var(--mgh-grid-bg);\n color: var(--mgh-grid-fg);\n outline: none;\n}\n.mgh-grid--auto-height { flex: 0 0 auto; }\n\n/* ---- toolbar ---- */\n.mgh-grid-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 45px; padding: 4px 8px; border-bottom: 1px solid var(--mgh-grid-border); flex-wrap: wrap; }\n.mgh-grid-toolbar-group { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }\n.mgh-grid-toolbar-center { display: flex; align-items: center; flex: 1 1 auto; justify-content: center; }\n\n/* ---- buttons ---- */\n.mgh-grid-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; border: 0; margin: 0; background: transparent; color: var(--mgh-grid-fg-secondary); font: inherit; font-size: 0.8125rem; font-weight: 500; line-height: 1.75; letter-spacing: .02em; padding: 4px 8px; border-radius: 4px; cursor: pointer; user-select: none; transition: background-color .15s, color .15s; text-transform: none; white-space: nowrap; }\n.mgh-grid-btn:hover { background: var(--mgh-grid-hover); color: var(--mgh-grid-fg); }\n.mgh-grid-btn:focus-visible { outline: 2px solid var(--mgh-grid-focus); outline-offset: 1px; }\n.mgh-grid-btn:disabled { color: var(--mgh-grid-fg-disabled); cursor: default; background: transparent; }\n.mgh-grid-btn--icon { padding: 6px; border-radius: 50%; width: 32px; height: 32px; }\n.mgh-grid-btn--icon.mgh-grid-btn--small { width: 26px; height: 26px; padding: 3px; }\n.mgh-grid-btn--icon.mgh-grid-btn--small .mgh-grid-icon { width: 18px; height: 18px; }\n.mgh-grid-btn--primary { color: var(--mgh-grid-primary); }\n.mgh-grid-btn--primary:hover { background: var(--mgh-grid-selected); color: var(--mgh-grid-primary); }\n.mgh-grid-btn--contained { background: var(--mgh-grid-primary); color: var(--mgh-grid-primary-contrast); }\n.mgh-grid-btn--contained:hover { background: var(--mgh-grid-primary); color: var(--mgh-grid-primary-contrast); filter: brightness(0.92); }\n.mgh-grid-btn--active { color: var(--mgh-grid-primary); }\n\n/* ---- badge ---- */\n.mgh-grid-badge { position: relative; display: inline-flex; }\n.mgh-grid-badge-dot { position: absolute; top: 0; right: 0; min-width: 8px; height: 8px; border-radius: 4px; background: var(--mgh-grid-badge); transform: translate(50%, -50%); }\n.mgh-grid-badge-count { position: absolute; top: 0; right: 0; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--mgh-grid-badge); color: var(--mgh-grid-primary-contrast); font-size: 10px; font-weight: 600; line-height: 16px; text-align: center; transform: translate(50%, -50%); }\n\n/* ---- inputs ---- */\n.mgh-grid-input, .mgh-grid-select { font: inherit; font-size: 0.875rem; color: var(--mgh-grid-fg); background: var(--mgh-grid-input-bg); border: 1px solid var(--mgh-grid-input-border); border-radius: 6px; padding: 6px 10px; height: 36px; min-width: 0; outline: none; transition: border-color .15s, box-shadow .15s; }\n.mgh-grid-input:hover, .mgh-grid-select:hover { border-color: var(--mgh-grid-fg); }\n.mgh-grid-input:focus, .mgh-grid-select:focus { border-color: var(--mgh-grid-focus); box-shadow: 0 0 0 1px var(--mgh-grid-focus); }\n.mgh-grid-input::placeholder { color: var(--mgh-grid-fg-disabled); }\n.mgh-grid-input--small, .mgh-grid-select--small { height: 32px; padding: 4px 8px; font-size: 0.8125rem; }\n.mgh-grid-select { appearance: none; -webkit-appearance: none; padding-right: 28px; background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23888'><path d='M7 10l5 5 5-5z'/></svg>\"); background-repeat: no-repeat; background-position: right 6px center; background-size: 18px; cursor: pointer; }\n.mgh-grid-select option { color: initial; background: initial; }\n.mgh-grid-card[data-mgh-theme=\"dark\"] .mgh-grid-select option, .mgh-grid-popover[data-mgh-theme=\"dark\"] .mgh-grid-select option { color: #fff; background: #212b36; }\n.mgh-grid-select[multiple] { height: auto; min-height: 36px; background-image: none; padding-right: 10px; }\n.mgh-grid-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n.mgh-grid-field-label { font-size: 0.75rem; color: var(--mgh-grid-fg-secondary); }\n.mgh-grid-input-adorned { position: relative; display: flex; align-items: center; }\n.mgh-grid-input-adorned .mgh-grid-input { width: 100%; padding-left: 34px; }\n.mgh-grid-input-adorned--clearable .mgh-grid-input { padding-right: 34px; }\n.mgh-grid-input-adornment { position: absolute; left: 10px; display: inline-flex; color: var(--mgh-grid-fg-secondary); pointer-events: none; }\n.mgh-grid-input-adornment--end { left: auto; right: 4px; pointer-events: auto; }\n\n/* ---- checkbox ---- */\n.mgh-grid-checkbox { appearance: none; -webkit-appearance: none; width: 18px; height: 18px; margin: 0; border: 2px solid var(--mgh-grid-fg-secondary); border-radius: 3px; background: transparent; cursor: pointer; display: inline-grid; place-content: center; position: relative; flex: 0 0 auto; transition: background-color .12s, border-color .12s; }\n.mgh-grid-checkbox:hover { border-color: var(--mgh-grid-fg); }\n.mgh-grid-checkbox:focus-visible { outline: 2px solid var(--mgh-grid-focus); outline-offset: 2px; }\n.mgh-grid-checkbox:checked, .mgh-grid-checkbox:indeterminate { background: var(--mgh-grid-primary); border-color: var(--mgh-grid-primary); }\n.mgh-grid-checkbox:checked::after { content: \"\"; width: 5px; height: 10px; border: solid var(--mgh-grid-primary-contrast); border-width: 0 2px 2px 0; transform: translateY(-1px) rotate(45deg); }\n.mgh-grid-checkbox:indeterminate::after { content: \"\"; width: 10px; height: 2px; background: var(--mgh-grid-primary-contrast); }\n.mgh-grid-checkbox:disabled { opacity: 0.4; cursor: default; }\n.mgh-grid-checkbox-label { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; font-size: 0.875rem; padding: 6px 4px; border-radius: 4px; }\n.mgh-grid-checkbox-label:hover { background: var(--mgh-grid-hover); }\n\n/* ---- quick filter ---- */\n.mgh-grid-quick-filter { display: grid; align-items: center; }\n.mgh-grid-quick-filter-trigger { grid-area: 1 / 1; z-index: 1; transition: opacity .2s; }\n.mgh-grid-quick-filter--expanded .mgh-grid-quick-filter-trigger { opacity: 0; pointer-events: none; }\n.mgh-grid-quick-filter-control { grid-area: 1 / 1; width: 32px; opacity: 0; overflow: hidden; transition: width .2s, opacity .2s; }\n.mgh-grid-quick-filter--expanded .mgh-grid-quick-filter-control { width: 260px; opacity: 1; }\n@media (max-width: 599.95px) { .mgh-grid-quick-filter--expanded .mgh-grid-quick-filter-control { width: 180px; } }\n\n/* ---- main / scroller ---- */\n.mgh-grid-main { position: relative; display: flex; flex: 1 1 auto; min-height: 0; min-width: 0; overflow: hidden; }\n.mgh-grid--auto-height .mgh-grid-main { flex: 0 0 auto; }\n.mgh-grid-scroller { position: relative; flex: 1 1 auto; min-height: 0; min-width: 0; overflow: auto; outline: none; scrollbar-width: thin; }\n.mgh-grid--auto-height .mgh-grid-scroller { overflow-y: hidden; }\n.mgh-grid-scroller::-webkit-scrollbar { width: 10px; height: 10px; }\n.mgh-grid-scroller::-webkit-scrollbar-thumb { background: var(--mgh-grid-scrollbar); border-radius: 5px; border: 2px solid transparent; background-clip: content-box; }\n\n/* ---- column headers ---- */\n.mgh-grid-columns { position: sticky; top: 0; z-index: 3; background: var(--mgh-grid-header-bg); border-bottom: 1px solid var(--mgh-grid-border); min-width: 100%; width: max-content; }\n.mgh-grid-header-row { display: flex; min-width: 100%; }\n.mgh-grid-header-cell { position: relative; display: flex; align-items: center; flex: 0 0 auto; height: var(--mgh-grid-header-height); padding: 0 10px; font-weight: 600; font-size: 0.875rem; color: var(--mgh-grid-header-fg); background: var(--mgh-grid-header-bg); white-space: nowrap; overflow: hidden; user-select: none; outline: none; }\n.mgh-grid-header-cell--sortable { cursor: pointer; }\n.mgh-grid-header-cell:focus-visible { outline: 2px solid var(--mgh-grid-focus); outline-offset: -2px; }\n.mgh-grid-header-cell--align-center { justify-content: center; }\n.mgh-grid-header-cell--align-right { justify-content: flex-end; }\n.mgh-grid-header-cell--align-right .mgh-grid-header-title-container { flex-direction: row-reverse; }\n.mgh-grid-header-title-container { display: flex; align-items: center; gap: 2px; min-width: 0; flex: 1 1 auto; overflow: hidden; }\n.mgh-grid-header-cell--align-center .mgh-grid-header-title-container { flex: 0 1 auto; }\n.mgh-grid-header-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.mgh-grid-sort-icon { display: inline-flex; align-items: center; color: var(--mgh-grid-fg-secondary); opacity: 0; transition: opacity .15s; flex: 0 0 auto; }\n.mgh-grid-header-cell:hover .mgh-grid-sort-icon, .mgh-grid-sort-icon--active { opacity: 1; }\n.mgh-grid-sort-index { font-size: 10px; margin-left: -2px; color: var(--mgh-grid-fg-secondary); }\n.mgh-grid-header-menu-btn { position: absolute; right: 2px; opacity: 0; transition: opacity .15s; background: var(--mgh-grid-header-bg); }\n.mgh-grid-header-cell--align-right .mgh-grid-header-menu-btn { right: auto; left: 2px; }\n.mgh-grid-header-cell:hover .mgh-grid-header-menu-btn, .mgh-grid-header-menu-btn--open, .mgh-grid-header-cell:focus-within .mgh-grid-header-menu-btn { opacity: 1; }\n.mgh-grid-header-cell--menu-open { background: var(--mgh-grid-hover); }\n.mgh-grid-resize-handle { position: absolute; top: 0; right: -4px; width: 9px; height: 100%; cursor: col-resize; z-index: 2; display: flex; justify-content: center; touch-action: none; }\n.mgh-grid-resize-handle::after { content: \"\"; width: 1px; height: 60%; margin-top: 20%; background: var(--mgh-grid-border); transition: background .15s, width .15s; }\n.mgh-grid-resize-handle:hover::after, .mgh-grid-resize-handle--active::after { background: var(--mgh-grid-primary); width: 2px; }\n.mgh-grid-header-cell--last .mgh-grid-resize-handle { right: 0; }\n.mgh-grid-header-cell--dragging { opacity: 0.5; }\n.mgh-grid-header-cell--drop-left::before, .mgh-grid-header-cell--drop-right::before { content: \"\"; position: absolute; top: 4px; bottom: 4px; width: 2px; background: var(--mgh-grid-primary); z-index: 3; }\n.mgh-grid-header-cell--drop-left::before { left: 0; }\n.mgh-grid-header-cell--drop-right::before { right: 0; }\n.mgh-grid-header-filler { flex: 1 1 auto; background: var(--mgh-grid-header-bg); }\n\n/* ---- pinned cells ---- */\n.mgh-grid-cell--pinned-left, .mgh-grid-header-cell--pinned-left { position: sticky; z-index: 2; background-color: var(--mgh-grid-bg); }\n.mgh-grid-cell--pinned-right, .mgh-grid-header-cell--pinned-right { position: sticky; z-index: 2; background-color: var(--mgh-grid-bg); }\n.mgh-grid-header-cell--pinned-left, .mgh-grid-header-cell--pinned-right { z-index: 4; background-color: var(--mgh-grid-header-bg); }\n.mgh-grid-cell--pinned-left-last, .mgh-grid-header-cell--pinned-left-last { box-shadow: 2px 0 4px -2px var(--mgh-grid-pinned-shadow); }\n.mgh-grid-cell--pinned-right-first, .mgh-grid-header-cell--pinned-right-first { box-shadow: -2px 0 4px -2px var(--mgh-grid-pinned-shadow); }\n.mgh-grid--no-pinned-shadow .mgh-grid-cell--pinned-left-last, .mgh-grid--no-pinned-shadow .mgh-grid-header-cell--pinned-left-last { box-shadow: none; }\n\n/* ---- body & rows ---- */\n.mgh-grid-body { position: relative; min-width: 100%; width: max-content; }\n.mgh-grid-body--flow { display: flex; flex-direction: column; }\n.mgh-grid-row-block { min-width: 100%; }\n.mgh-grid-body--virtual .mgh-grid-row-block { position: absolute; left: 0; }\n.mgh-grid-row { display: flex; min-width: 100%; border-bottom: 1px solid var(--mgh-grid-border); background: var(--mgh-grid-bg); position: relative; }\n.mgh-grid-row--auto-height { align-items: stretch; }\n.mgh-grid-row:hover { background: var(--mgh-grid-hover); }\n.mgh-grid-row--selected { background: var(--mgh-grid-selected); }\n.mgh-grid-row--selected:hover { background: var(--mgh-grid-selected-hover); }\n.mgh-grid-row--clickable { cursor: pointer; }\n.mgh-grid-row--group { background: var(--mgh-grid-group-bg); }\n.mgh-grid-row--pinned { background: var(--mgh-grid-bg); }\n.mgh-grid-row--footer { background: var(--mgh-grid-footer-bg); font-weight: 600; }\n.mgh-grid-row:hover .mgh-grid-cell--pinned-left, .mgh-grid-row:hover .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-hover), var(--mgh-grid-hover)); }\n.mgh-grid-row--selected .mgh-grid-cell--pinned-left, .mgh-grid-row--selected .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-selected), var(--mgh-grid-selected)); }\n.mgh-grid-row--selected:hover .mgh-grid-cell--pinned-left, .mgh-grid-row--selected:hover .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-selected-hover), var(--mgh-grid-selected-hover)); }\n.mgh-grid-row--group .mgh-grid-cell--pinned-left, .mgh-grid-row--group .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-group-bg), var(--mgh-grid-group-bg)); }\n.mgh-grid-row--footer .mgh-grid-cell--pinned-left, .mgh-grid-row--footer .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-footer-bg), var(--mgh-grid-footer-bg)); }\n.mgh-grid-row-filler { flex: 1 1 auto; }\n\n.mgh-grid-cell { display: flex; align-items: center; flex: 0 0 auto; padding: 0 10px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: 0.875rem; outline: none; min-height: 100%; }\n.mgh-grid-cell > .mgh-grid-cell-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.mgh-grid-row--auto-height .mgh-grid-cell { white-space: normal; align-items: flex-start; padding-top: 8px; padding-bottom: 8px; }\n.mgh-grid-row--auto-height .mgh-grid-cell > .mgh-grid-cell-text { white-space: normal; word-break: break-word; }\n.mgh-grid-cell--align-center { justify-content: center; }\n.mgh-grid-cell--align-right { justify-content: flex-end; }\n.mgh-grid-cell--focused { outline: 1px solid var(--mgh-grid-focus); outline-offset: -1px; }\n.mgh-grid-cell--editable { cursor: text; }\n.mgh-grid-cell--editing { padding: 0 4px; outline: 2px solid var(--mgh-grid-focus); outline-offset: -2px; background: var(--mgh-grid-bg); }\n.mgh-grid-cell--editing .mgh-grid-input, .mgh-grid-cell--editing .mgh-grid-select { width: 100%; height: calc(100% - 6px); border: 0; box-shadow: none; padding: 0 6px; background: transparent; }\n.mgh-grid-cell--checkbox, .mgh-grid-header-cell--checkbox, .mgh-grid-cell--detail-toggle, .mgh-grid-header-cell--detail-toggle { justify-content: center; padding: 0; }\n.mgh-grid-cell--boolean .mgh-grid-icon { color: var(--mgh-grid-fg-secondary); }\n.mgh-grid-cell--actions { gap: 2px; justify-content: center; }\n.mgh-grid-cell--aggregation { flex-direction: column; align-items: stretch; justify-content: center; line-height: 1.2; }\n.mgh-grid-cell--aggregation.mgh-grid-cell--align-right { align-items: flex-end; }\n.mgh-grid-cell--aggregation.mgh-grid-cell--align-center { align-items: center; }\n.mgh-grid-aggregation-label { font-size: 0.65rem; font-weight: 500; text-transform: uppercase; color: var(--mgh-grid-fg-secondary); letter-spacing: .04em; }\n.mgh-grid-group-cell { display: flex; align-items: center; gap: 4px; min-width: 0; }\n.mgh-grid-group-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }\n.mgh-grid-group-count { color: var(--mgh-grid-fg-secondary); margin-left: 2px; }\n.mgh-grid-group-toggle { flex: 0 0 auto; }\n.mgh-grid-group-toggle .mgh-grid-icon { transition: transform .15s; }\n.mgh-grid-group-toggle--expanded .mgh-grid-icon { transform: rotate(90deg); }\n.mgh-grid-detail-toggle .mgh-grid-icon { transition: transform .15s; }\n.mgh-grid-detail-toggle--expanded .mgh-grid-icon { transform: rotate(180deg); }\n\n/* ---- pinned rows ---- */\n.mgh-grid-pinned-rows { position: sticky; z-index: 2; min-width: 100%; width: max-content; background: var(--mgh-grid-bg); }\n.mgh-grid-pinned-rows--top { box-shadow: 0 2px 4px -2px var(--mgh-grid-pinned-shadow); }\n.mgh-grid-pinned-rows--bottom { bottom: 0; box-shadow: 0 -2px 4px -2px var(--mgh-grid-pinned-shadow); }\n.mgh-grid-pinned-rows--bottom .mgh-grid-row { border-bottom: 0; border-top: 1px solid var(--mgh-grid-border); }\n\n/* ---- detail panel ---- */\n.mgh-grid-detail-panel { position: sticky; left: 0; overflow: auto; border-bottom: 1px solid var(--mgh-grid-border); background: var(--mgh-grid-bg); z-index: 1; }\n\n/* ---- overlays ---- */\n.mgh-grid-overlay { position: absolute; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 8px; z-index: 5; color: var(--mgh-grid-fg-secondary); font-size: 0.875rem; pointer-events: none; }\n.mgh-grid-overlay--loading { background: var(--mgh-grid-overlay); pointer-events: auto; }\n.mgh-grid-no-rows { display: flex; align-items: center; justify-content: center; gap: 8px; height: 100%; text-align: center; padding: 16px; }\n.mgh-grid-no-rows img, .mgh-grid-no-rows .mgh-grid-icon { width: 50px; height: 50px; color: var(--mgh-grid-fg-disabled); }\n.mgh-grid-spinner { width: 36px; height: 36px; border-radius: 50%; border: 3px solid var(--mgh-grid-selected); border-top-color: var(--mgh-grid-primary); animation: mgh-grid-spin .8s linear infinite; }\n@keyframes mgh-grid-spin { to { transform: rotate(360deg); } }\n\n/* ---- footer ---- */\n.mgh-grid-footer { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 52px; padding: 0 8px 0 16px; border-top: 1px solid var(--mgh-grid-border); font-size: 0.875rem; color: var(--mgh-grid-fg-secondary); flex-wrap: wrap; }\n.mgh-grid-footer-left { display: flex; align-items: center; gap: 16px; }\n.mgh-grid-pagination { display: flex; align-items: center; gap: 8px; margin-left: auto; flex-wrap: wrap; }\n.mgh-grid-pagination-select { height: 32px; padding: 2px 24px 2px 8px; font-size: 0.875rem; border-color: transparent; }\n.mgh-grid-pagination-select:hover { border-color: transparent; background-color: var(--mgh-grid-hover); }\n.mgh-grid-pagination-actions { display: inline-flex; align-items: center; }\n\n/* ---- popover / menu / panels ---- */\n.mgh-grid-popover {\n --mgh-grid-font-family: inherit; --mgh-grid-font-size: 14px; --mgh-grid-paper: #ffffff; --mgh-grid-bg: #fff; --mgh-grid-fg: rgba(0,0,0,.87); --mgh-grid-fg-secondary: rgba(0,0,0,.6); --mgh-grid-fg-disabled: rgba(0,0,0,.38); --mgh-grid-border: rgba(224,224,224,1); --mgh-grid-hover: rgba(0,0,0,.04); --mgh-grid-selected: rgba(25,118,210,.08); --mgh-grid-primary: #1976d2; --mgh-grid-primary-contrast: #fff; --mgh-grid-focus: #1976d2; --mgh-grid-input-bg: transparent; --mgh-grid-input-border: rgba(0,0,0,.23); --mgh-grid-popover-shadow: 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12);\n position: fixed; z-index: 1300; background: var(--mgh-grid-paper); color: var(--mgh-grid-fg); border-radius: 8px; box-shadow: var(--mgh-grid-popover-shadow); font-family: var(--mgh-grid-font-family); font-size: var(--mgh-grid-font-size); line-height: 1.5; outline: none; max-height: calc(100vh - 16px); overflow: auto; animation: mgh-grid-pop .12s ease-out;\n}\n.mgh-grid-popover[data-mgh-theme=\"dark\"] { --mgh-grid-paper: #212b36; --mgh-grid-bg: #212b36; --mgh-grid-fg: #fff; --mgh-grid-fg-secondary: rgba(255,255,255,.7); --mgh-grid-fg-disabled: rgba(255,255,255,.5); --mgh-grid-border: rgba(81,81,81,1); --mgh-grid-hover: rgba(255,255,255,.08); --mgh-grid-selected: rgba(144,202,249,.16); --mgh-grid-primary: #90caf9; --mgh-grid-primary-contrast: rgba(0,0,0,.87); --mgh-grid-focus: #90caf9; --mgh-grid-input-border: rgba(255,255,255,.23); }\n@keyframes mgh-grid-pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }\n.mgh-grid-menu { list-style: none; margin: 0; padding: 6px 0; min-width: 180px; }\n.mgh-grid-menu-item { display: flex; align-items: center; gap: 12px; padding: 6px 16px; min-height: 36px; font-size: 0.875rem; cursor: pointer; white-space: nowrap; color: var(--mgh-grid-fg); background: transparent; border: 0; width: 100%; text-align: left; font-family: inherit; outline: none; }\n.mgh-grid-menu-item:hover, .mgh-grid-menu-item:focus-visible { background: var(--mgh-grid-hover); }\n.mgh-grid-menu-item--disabled { color: var(--mgh-grid-fg-disabled); cursor: default; pointer-events: none; }\n.mgh-grid-menu-item--selected { background: var(--mgh-grid-selected); }\n.mgh-grid-menu-item .mgh-grid-icon { color: var(--mgh-grid-fg-secondary); flex: 0 0 auto; }\n.mgh-grid-menu-divider { height: 1px; margin: 6px 0; background: var(--mgh-grid-border); border: 0; }\n.mgh-grid-menu-header { padding: 6px 16px 2px; font-size: 0.75rem; color: var(--mgh-grid-fg-secondary); text-transform: uppercase; letter-spacing: .04em; }\n.mgh-grid-menu-section { padding: 4px 16px 8px; display: flex; flex-direction: column; gap: 4px; }\n.mgh-grid-panel { display: flex; flex-direction: column; min-width: 300px; max-width: min(640px, calc(100vw - 16px)); }\n.mgh-grid-panel-header { padding: 12px 12px 4px; }\n.mgh-grid-panel-content { padding: 4px 12px; overflow: auto; max-height: 360px; }\n.mgh-grid-panel-footer { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 12px; }\n.mgh-grid-columns-list { display: flex; flex-direction: column; }\n.mgh-grid-filter-row { display: grid; grid-template-columns: 32px minmax(120px, 1fr) minmax(120px, 1fr) minmax(140px, 1.3fr); gap: 8px; align-items: end; margin-bottom: 8px; }\n.mgh-grid-filter-row--first { grid-template-columns: 32px minmax(120px, 1fr) minmax(120px, 1fr) minmax(140px, 1.3fr); }\n.mgh-grid-filter-row--with-logic { grid-template-columns: 32px 80px minmax(120px, 1fr) minmax(120px, 1fr) minmax(140px, 1.3fr); }\n.mgh-grid-filter-row .mgh-grid-btn--icon { margin-bottom: 4px; }\n.mgh-grid-filter-empty { padding: 8px 4px; color: var(--mgh-grid-fg-secondary); font-size: 0.875rem; }\n@media (max-width: 599.95px) { .mgh-grid-filter-row, .mgh-grid-filter-row--with-logic { grid-template-columns: 1fr; } }\n\n/* ---- misc ---- */\n.mgh-grid-tooltip-anchor { display: inline-flex; }\n.mgh-grid-visually-hidden { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); border: 0; }\n@media print { .mgh-grid-toolbar, .mgh-grid-footer { display: none !important; } }\n`;\n\nlet injected = false;\n\nconst injectStyles = () => {\n if (injected || typeof document === 'undefined') return;\n if (document.getElementById(MGH_GRID_STYLE_ID)) {\n injected = true;\n return;\n }\n const style = document.createElement('style');\n style.id = MGH_GRID_STYLE_ID;\n style.setAttribute('data-mgh-grid', 'true');\n style.textContent = MGH_GRID_CSS;\n document.head.appendChild(style);\n injected = true;\n};\n\nconst useInsertion: typeof React.useLayoutEffect =\n (React as any).useInsertionEffect ?? (typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect);\n\n/** Injects the MGHGrid stylesheet once per document. Safe on the server (no-op). */\nexport const useMGHGridStyles = () => {\n useInsertion(() => {\n injectStyles();\n }, []);\n};\n","import React from 'react';\nimport {\n MGHGridAggregationFunction,\n MGHGridApi,\n MGHGridColDef,\n MGHGridLocaleText,\n MGHGridState,\n MGHGridThemeMode,\n MGHGridValidRowModel,\n} from './MGHGrid.types';\n\nexport interface MGHGridRootProps {\n header?: React.ReactNode;\n pagination: boolean;\n pageSizeOptions: number[];\n hideFooterPagination: boolean;\n hideFooterRowCount: boolean;\n hideFooterSelectedRowCount: boolean;\n disableColumnFilter: boolean;\n disableColumnSelector: boolean;\n disableDensitySelector: boolean;\n disableColumnPinning: boolean;\n disableColumnSorting: boolean;\n disableMultipleColumnsSorting: boolean;\n disableMultipleColumnsFiltering: boolean;\n disableRowGrouping: boolean;\n disableAggregation: boolean;\n checkboxSelection: boolean;\n aggregationFunctions: Record<string, MGHGridAggregationFunction>;\n quickFilterDebounceMs: number;\n}\n\nexport interface MGHGridContextValue {\n api: MGHGridApi;\n state: MGHGridState;\n localeText: MGHGridLocaleText;\n themeMode: MGHGridThemeMode;\n rootProps: MGHGridRootProps;\n /** All user columns (ordered, including hidden). */\n columns: MGHGridColDef[];\n /** Visible user columns. */\n visibleColumns: MGHGridColDef[];\n}\n\nexport const MGHGridContext = React.createContext<MGHGridContextValue | null>(null);\nMGHGridContext.displayName = 'MGHGridContext';\n\nexport const useMGHGridContext = () => {\n const ctx = React.useContext(MGHGridContext);\n if (!ctx) {\n throw new Error('MGHGrid: this component must be rendered inside an <MGHGrid /> (e.g. through a slot).');\n }\n return ctx;\n};\n\n/** Access the grid API from custom toolbars, menu items, cells, etc. */\nexport const useMGHGridApiContext = <R extends MGHGridValidRowModel = any>() => useMGHGridContext().api as MGHGridApi<R>;\n\nexport const useMGHGridLocaleText = () => useMGHGridContext().localeText;\n\n/** Creates a ref to hold the grid API; pass it to `<MGHGrid apiRef={apiRef} />`. */\nexport const useMGHGridApiRef = <R extends MGHGridValidRowModel = any>() =>\n React.useRef<MGHGridApi<R> | null>(null) as React.MutableRefObject<MGHGridApi<R> | null>;\n","import React from 'react';\n\n/** Keeps a ref always pointing at the latest value (assigned during render). */\nexport function useLatestRef<T>(value: T) {\n const ref = React.useRef(value);\n ref.current = value;\n return ref;\n}\n\n/** Returns a stable function that always calls the latest `fn`. */\nexport function useEventCallback<T extends (...args: any[]) => any>(fn: T): T {\n const ref = useLatestRef(fn);\n return React.useCallback(((...args: any[]) => ref.current(...args)) as T, []);\n}\n\n/**\n * Controlled / uncontrolled state helper. When `controlled` is defined the internal state is\n * ignored and every change is reported through `onChange` only.\n */\nexport function useControlledState<T>(\n controlled: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void\n): [T, (next: T | ((prev: T) => T)) => void] {\n const isControlled = controlled !== undefined;\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const value = isControlled ? (controlled as T) : internal;\n const valueRef = useLatestRef(value);\n const controlledRef = useLatestRef(isControlled);\n const onChangeRef = useLatestRef(onChange);\n\n const setValue = React.useCallback((next: T | ((prev: T) => T)) => {\n const resolved = typeof next === 'function' ? (next as (prev: T) => T)(valueRef.current) : next;\n if (Object.is(resolved, valueRef.current)) return;\n valueRef.current = resolved;\n if (!controlledRef.current) setInternal(resolved);\n onChangeRef.current?.(resolved);\n }, []);\n\n return [value, setValue];\n}\n\nexport interface ElementSize {\n width: number;\n height: number;\n}\n\n/** Observes the client size of an element. */\nexport function useElementSize<T extends HTMLElement>(ref: React.RefObject<T | null>, enabled = true): ElementSize {\n const [size, setSize] = React.useState<ElementSize>({ width: 0, height: 0 });\n\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return undefined;\n const update = () => {\n const width = el.clientWidth;\n const height = el.clientHeight;\n setSize((prev) => (prev.width === width && prev.height === height ? prev : { width, height }));\n };\n update();\n if (typeof ResizeObserver === 'undefined') {\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref, enabled]);\n\n return size;\n}\n\n/** `window.matchMedia` as a hook. Always false on the server. */\nexport function useMediaQuery(query: string) {\n const getMatch = () =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function' ? window.matchMedia(query).matches : false;\n const [matches, setMatches] = React.useState(getMatch);\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return undefined;\n const media = window.matchMedia(query);\n const listener = () => setMatches(media.matches);\n listener();\n if (media.addEventListener) {\n media.addEventListener('change', listener);\n return () => media.removeEventListener('change', listener);\n }\n media.addListener(listener);\n return () => media.removeListener(listener);\n }, [query]);\n\n return matches;\n}\n\n/** Debounced version of a callback. The returned function is stable. */\nexport function useDebouncedCallback<T extends (...args: any[]) => void>(fn: T, delay: number) {\n const fnRef = useLatestRef(fn);\n const timerRef = React.useRef<number | null>(null);\n\n React.useEffect(\n () => () => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n },\n []\n );\n\n return React.useCallback(\n (...args: Parameters<T>) => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => {\n timerRef.current = null;\n fnRef.current(...args);\n }, delay);\n },\n [delay]\n );\n}\n\nexport function useForceUpdate() {\n const [, setTick] = React.useState(0);\n return React.useCallback(() => setTick((t) => t + 1), []);\n}\n\nlet idCounter = 0;\n/** Stable unique id per component instance (React.useId fallback for older Reacts). */\nexport function useStableId(prefix: string) {\n const reactUseId = (React as any).useId as undefined | (() => string);\n if (reactUseId) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const id = reactUseId();\n return `${prefix}-${id.replace(/:/g, '')}`;\n }\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const ref = React.useRef<string | null>(null);\n if (ref.current === null) {\n idCounter += 1;\n ref.current = `${prefix}-${idCounter}`;\n }\n return ref.current;\n}\n","import {\n MGHGridApi,\n MGHGridColDef,\n MGHGridCsvExportOptions,\n MGHGridExcelExportOptions,\n MGHGridExportOptions,\n MGHGridPrintExportOptions,\n MGHGridRowId,\n} from './MGHGrid.types';\nimport {\n downloadBlob,\n formattedValueToString,\n getCellValue,\n getFormattedValue,\n isInternalField,\n isNil,\n toDate,\n} from './utils';\n\n/* -------------------------------------------------------------------------------------------------\n * Shared: resolve the columns & rows to export\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface ExportCell {\n raw: any;\n formatted: string;\n col: MGHGridColDef;\n}\n\nexport interface ExportTable {\n columns: MGHGridColDef[];\n headers: string[];\n rows: ExportCell[][];\n}\n\nexport const resolveExportColumns = (api: MGHGridApi, options: MGHGridExportOptions): MGHGridColDef[] => {\n const all = api.getAllColumns();\n let columns: MGHGridColDef[];\n if (options.fields) {\n const byField = new Map<string, MGHGridColDef>();\n all.forEach((c) => byField.set(c.field, c));\n columns = options.fields.map((f) => byField.get(f)).filter(Boolean) as MGHGridColDef[];\n } else if (options.allColumns) {\n columns = all;\n } else {\n columns = api.getVisibleColumns();\n }\n return columns.filter((c) => !c.disableExport && !isInternalField(c.field) && c.type !== 'actions');\n};\n\nexport const buildExportTable = (api: MGHGridApi, options: MGHGridExportOptions): ExportTable => {\n const columns = resolveExportColumns(api, options);\n const ids: MGHGridRowId[] = options.getRowsToExport ? options.getRowsToExport({ api }) : api.getSortedRowIds();\n const rows: ExportCell[][] = [];\n ids.forEach((id) => {\n const row = api.getRow(id);\n if (!row) return;\n rows.push(\n columns.map((col) => {\n const raw = getCellValue(row, col, api);\n const formatted = formattedValueToString(getFormattedValue(raw, row, col, api, id));\n return { raw, formatted, col };\n })\n );\n });\n return { columns, headers: columns.map((c) => c.headerName ?? c.field), rows };\n};\n\nconst sanitizeFileName = (name: string | undefined, fallback: string, extension: string) => {\n const base = (name && name.trim()) || fallback;\n return base.toLowerCase().endsWith(`.${extension}`) ? base : `${base}.${extension}`;\n};\n\nconst defaultFileBase = () => {\n const title = typeof document !== 'undefined' && document.title ? document.title.trim() : '';\n return (title || 'export').replace(/[\\\\/:*?\"<>|]+/g, '-');\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CSV\n * ----------------------------------------------------------------------------------------------- */\n\nconst escapeCsvCell = (value: string, delimiter: string) => {\n let text = value;\n // Guard against formula injection when opening in spreadsheet software.\n if (/^[=+\\-@\\t\\r]/.test(text)) text = `'${text}`;\n if (text.indexOf('\"') !== -1 || text.indexOf(delimiter) !== -1 || /[\\r\\n]/.test(text)) {\n return `\"${text.replace(/\"/g, '\"\"')}\"`;\n }\n return text;\n};\n\nexport const getDataAsCsv = (api: MGHGridApi, options: MGHGridCsvExportOptions = {}) => {\n const delimiter = options.delimiter ?? ',';\n const includeHeaders = options.includeHeaders ?? true;\n const table = buildExportTable(api, options);\n const lines: string[] = [];\n if (includeHeaders) {\n lines.push(table.headers.map((h) => escapeCsvCell(h, delimiter)).join(delimiter));\n }\n table.rows.forEach((cells) => {\n lines.push(\n cells\n .map((cell) => {\n const text = options.useRawValues ? (isNil(cell.raw) ? '' : String(cell.raw)) : cell.formatted;\n return escapeCsvCell(text, delimiter);\n })\n .join(delimiter)\n );\n });\n return lines.join('\\r\\n');\n};\n\nconst UTF8_BOM = String.fromCharCode(0xfeff);\n\nexport const exportDataAsCsv = (api: MGHGridApi, options: MGHGridCsvExportOptions = {}) => {\n const csv = getDataAsCsv(api, options);\n const bom = options.utf8WithBom ? UTF8_BOM : '';\n const blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' });\n downloadBlob(blob, sanitizeFileName(options.fileName, defaultFileBase(), 'csv'));\n};\n\n/* -------------------------------------------------------------------------------------------------\n * XLSX (minimal OOXML writer + store-only ZIP, no dependencies)\n * ----------------------------------------------------------------------------------------------- */\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n += 1) {\n let c = n;\n for (let k = 0; k < 8; k += 1) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[n] = c >>> 0;\n }\n return table;\n})();\n\nconst crc32 = (bytes: Uint8Array) => {\n let crc = 0xffffffff;\n for (let i = 0; i < bytes.length; i += 1) {\n crc = CRC_TABLE[(crc ^ bytes[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n};\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\n\nconst encodeUtf8 = (text: string): Uint8Array => {\n if (textEncoder) return textEncoder.encode(text);\n // Fallback for very old environments.\n const utf8 = unescape(encodeURIComponent(text));\n const out = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i += 1) out[i] = utf8.charCodeAt(i);\n return out;\n};\n\ninterface ZipEntry {\n name: string;\n data: Uint8Array;\n}\n\nconst concatBytes = (chunks: Uint8Array[]) => {\n const total = chunks.reduce((acc, c) => acc + c.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n chunks.forEach((c) => {\n out.set(c, offset);\n offset += c.length;\n });\n return out;\n};\n\nconst zipStore = (entries: ZipEntry[]): Uint8Array => {\n const localChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let offset = 0;\n // 1980-01-01 00:00 in DOS date/time format.\n const dosTime = 0;\n const dosDate = (1 << 5) | 1;\n\n entries.forEach((entry) => {\n const nameBytes = encodeUtf8(entry.name);\n const crc = crc32(entry.data);\n const size = entry.data.length;\n\n const local = new Uint8Array(30 + nameBytes.length);\n const lv = new DataView(local.buffer);\n lv.setUint32(0, 0x04034b50, true);\n lv.setUint16(4, 20, true);\n lv.setUint16(6, 0x0800, true); // UTF-8 names\n lv.setUint16(8, 0, true); // store\n lv.setUint16(10, dosTime, true);\n lv.setUint16(12, dosDate, true);\n lv.setUint32(14, crc, true);\n lv.setUint32(18, size, true);\n lv.setUint32(22, size, true);\n lv.setUint16(26, nameBytes.length, true);\n lv.setUint16(28, 0, true);\n local.set(nameBytes, 30);\n\n const central = new Uint8Array(46 + nameBytes.length);\n const cv = new DataView(central.buffer);\n cv.setUint32(0, 0x02014b50, true);\n cv.setUint16(4, 20, true);\n cv.setUint16(6, 20, true);\n cv.setUint16(8, 0x0800, true);\n cv.setUint16(10, 0, true);\n cv.setUint16(12, dosTime, true);\n cv.setUint16(14, dosDate, true);\n cv.setUint32(16, crc, true);\n cv.setUint32(20, size, true);\n cv.setUint32(24, size, true);\n cv.setUint16(28, nameBytes.length, true);\n cv.setUint16(30, 0, true);\n cv.setUint16(32, 0, true);\n cv.setUint16(34, 0, true);\n cv.setUint16(36, 0, true);\n cv.setUint32(38, 0, true);\n cv.setUint32(42, offset, true);\n central.set(nameBytes, 46);\n\n localChunks.push(local, entry.data);\n centralChunks.push(central);\n offset += local.length + size;\n });\n\n const centralDirectory = concatBytes(centralChunks);\n const eocd = new Uint8Array(22);\n const ev = new DataView(eocd.buffer);\n ev.setUint32(0, 0x06054b50, true);\n ev.setUint16(4, 0, true);\n ev.setUint16(6, 0, true);\n ev.setUint16(8, entries.length, true);\n ev.setUint16(10, entries.length, true);\n ev.setUint32(12, centralDirectory.length, true);\n ev.setUint32(16, offset, true);\n ev.setUint16(20, 0, true);\n\n return concatBytes(localChunks.concat([centralDirectory, eocd]));\n};\n\n// Characters that are illegal in XML 1.0 (built without literal control characters in source).\nconst INVALID_XML_CHARS = new RegExp(\n '[' +\n String.fromCharCode(0x00) +\n '-' +\n String.fromCharCode(0x08) +\n String.fromCharCode(0x0b) +\n String.fromCharCode(0x0c) +\n String.fromCharCode(0x0e) +\n '-' +\n String.fromCharCode(0x1f) +\n String.fromCharCode(0xfffe) +\n String.fromCharCode(0xffff) +\n ']',\n 'g'\n);\nconst stripInvalidXml = (text: string) => text.replace(INVALID_XML_CHARS, '');\n\nconst escapeXml = (text: string) =>\n stripInvalidXml(text)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\nconst columnLetter = (index: number) => {\n let n = index + 1;\n let letters = '';\n while (n > 0) {\n const rem = (n - 1) % 26;\n letters = String.fromCharCode(65 + rem) + letters;\n n = Math.floor((n - 1) / 26);\n }\n return letters;\n};\n\nconst sanitizeSheetName = (name: string | undefined) => {\n const cleaned = (name || 'Sheet1').replace(/[\\[\\]:*?/\\\\]/g, ' ').trim() || 'Sheet1';\n return cleaned.length > 31 ? cleaned.slice(0, 31) : cleaned;\n};\n\nconst XML_HEADER = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n\nconst buildSheetXml = (table: ExportTable, includeHeaders: boolean, columnWidths: number[]) => {\n const rowsXml: string[] = [];\n let rowIndex = 1;\n\n const inlineString = (ref: string, text: string, style?: number) =>\n `<c r=\"${ref}\" t=\"inlineStr\"${style ? ` s=\"${style}\"` : ''}><is><t xml:space=\"preserve\">${escapeXml(\n text\n )}</t></is></c>`;\n\n if (includeHeaders) {\n const cells = table.headers.map((h, i) => inlineString(`${columnLetter(i)}${rowIndex}`, h, 1)).join('');\n rowsXml.push(`<row r=\"${rowIndex}\">${cells}</row>`);\n rowIndex += 1;\n }\n\n table.rows.forEach((cells) => {\n const xmlCells = cells\n .map((cell, i) => {\n const ref = `${columnLetter(i)}${rowIndex}`;\n const type = cell.col.type;\n if (isNil(cell.raw) || cell.raw === '') return '';\n if (type === 'number' && typeof cell.raw === 'number' && Number.isFinite(cell.raw)) {\n return `<c r=\"${ref}\"><v>${cell.raw}</v></c>`;\n }\n if (type === 'boolean') {\n return `<c r=\"${ref}\" t=\"b\"><v>${cell.raw ? 1 : 0}</v></c>`;\n }\n if ((type === 'date' || type === 'dateTime') && toDate(cell.raw)) {\n // Excel serial date (days since 1899-12-30), written in local time with a date style.\n const d = toDate(cell.raw) as Date;\n const utc = Date.UTC(\n d.getFullYear(),\n d.getMonth(),\n d.getDate(),\n d.getHours(),\n d.getMinutes(),\n d.getSeconds()\n );\n const serial = utc / 86400000 + 25569;\n return `<c r=\"${ref}\" s=\"${type === 'dateTime' ? 3 : 2}\"><v>${serial}</v></c>`;\n }\n return inlineString(ref, cell.formatted);\n })\n .join('');\n rowsXml.push(`<row r=\"${rowIndex}\">${xmlCells}</row>`);\n rowIndex += 1;\n });\n\n const lastCol = columnLetter(Math.max(table.columns.length - 1, 0));\n const lastRow = Math.max(rowIndex - 1, 1);\n const cols = columnWidths.map((w, i) => `<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${w}\" customWidth=\"1\"/>`).join('');\n\n return (\n XML_HEADER +\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ' +\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n `<dimension ref=\"A1:${lastCol}${lastRow}\"/>` +\n '<sheetViews><sheetView workbookViewId=\"0\">' +\n (includeHeaders ? '<pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\"/>' : '') +\n '</sheetView></sheetViews>' +\n '<sheetFormatPr defaultRowHeight=\"15\"/>' +\n (cols ? `<cols>${cols}</cols>` : '') +\n `<sheetData>${rowsXml.join('')}</sheetData>` +\n (includeHeaders && table.rows.length > 0 ? `<autoFilter ref=\"A1:${lastCol}${lastRow}\"/>` : '') +\n '</worksheet>'\n );\n};\n\nconst STYLES_XML =\n XML_HEADER +\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n '<numFmts count=\"2\"><numFmt numFmtId=\"164\" formatCode=\"m/d/yyyy\"/><numFmt numFmtId=\"165\" formatCode=\"m/d/yyyy h:mm AM/PM\"/></numFmts>' +\n '<fonts count=\"2\"><font><sz val=\"11\"/><name val=\"Calibri\"/></font><font><b/><sz val=\"11\"/><name val=\"Calibri\"/></font></fonts>' +\n '<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>' +\n '<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n '<cellXfs count=\"4\">' +\n '<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>' +\n '<xf numFmtId=\"0\" fontId=\"1\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"/>' +\n '<xf numFmtId=\"164\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>' +\n '<xf numFmtId=\"165\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>' +\n '</cellXfs>' +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>' +\n '</styleSheet>';\n\nconst CONTENT_TYPES_XML =\n XML_HEADER +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' +\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>' +\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>' +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\n '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>' +\n '</Types>';\n\nconst ROOT_RELS_XML =\n XML_HEADER +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>' +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n '<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>' +\n '</Relationships>';\n\nconst WORKBOOK_RELS_XML =\n XML_HEADER +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>' +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>' +\n '</Relationships>';\n\nconst buildWorkbookXml = (sheetName: string) =>\n XML_HEADER +\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ' +\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n `<sheets><sheet name=\"${escapeXml(sheetName)}\" sheetId=\"1\" r:id=\"rId1\"/></sheets>` +\n '</workbook>';\n\nconst buildCoreXml = () => {\n const now = new Date().toISOString();\n return (\n XML_HEADER +\n '<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" ' +\n 'xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" ' +\n 'xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' +\n '<dc:creator>MGH Grid</dc:creator>' +\n `<dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>` +\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>` +\n '</cp:coreProperties>'\n );\n};\n\nconst APP_XML =\n XML_HEADER +\n '<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" ' +\n 'xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' +\n '<Application>MGH Grid</Application></Properties>';\n\nexport const buildXlsx = (api: MGHGridApi, options: MGHGridExcelExportOptions = {}): Uint8Array => {\n const includeHeaders = options.includeHeaders ?? true;\n const table = buildExportTable(api, options);\n const widths = table.columns.map((col, i) => {\n const explicit = options.columnsStyles?.[col.field]?.width;\n if (explicit) return explicit;\n let max = table.headers[i].length;\n for (let r = 0; r < Math.min(table.rows.length, 500); r += 1) {\n const len = table.rows[r][i].formatted.length;\n if (len > max) max = len;\n }\n return Math.min(Math.max(max + 2, 8), 60);\n });\n const sheetName = sanitizeSheetName(options.sheetName);\n const entries: ZipEntry[] = [\n { name: '[Content_Types].xml', data: encodeUtf8(CONTENT_TYPES_XML) },\n { name: '_rels/.rels', data: encodeUtf8(ROOT_RELS_XML) },\n { name: 'docProps/core.xml', data: encodeUtf8(buildCoreXml()) },\n { name: 'docProps/app.xml', data: encodeUtf8(APP_XML) },\n { name: 'xl/workbook.xml', data: encodeUtf8(buildWorkbookXml(sheetName)) },\n { name: 'xl/_rels/workbook.xml.rels', data: encodeUtf8(WORKBOOK_RELS_XML) },\n { name: 'xl/styles.xml', data: encodeUtf8(STYLES_XML) },\n { name: 'xl/worksheets/sheet1.xml', data: encodeUtf8(buildSheetXml(table, includeHeaders, widths)) },\n ];\n return zipStore(entries);\n};\n\nexport const exportDataAsExcel = async (api: MGHGridApi, options: MGHGridExcelExportOptions = {}) => {\n const bytes = buildXlsx(api, options);\n const blob = new Blob([bytes as BlobPart], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n downloadBlob(blob, sanitizeFileName(options.fileName, defaultFileBase(), 'xlsx'));\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Print\n * ----------------------------------------------------------------------------------------------- */\n\nconst escapeHtml = (text: string) =>\n text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nexport const exportDataAsPrint = (api: MGHGridApi, options: MGHGridPrintExportOptions = {}) => {\n if (typeof document === 'undefined') return;\n const includeHeaders = options.includeHeaders ?? true;\n const table = buildExportTable(api, options);\n const title = options.title ?? options.fileName ?? document.title ?? '';\n\n const headerHtml = includeHeaders\n ? `<thead><tr>${table.headers\n .map((h, i) => `<th class=\"${table.columns[i].align ?? 'left'}\">${escapeHtml(h)}</th>`)\n .join('')}</tr></thead>`\n : '';\n const bodyHtml = `<tbody>${table.rows\n .map(\n (cells) =>\n `<tr>${cells\n .map((cell) => `<td class=\"${cell.col.align ?? 'left'}\">${escapeHtml(cell.formatted)}</td>`)\n .join('')}</tr>`\n )\n .join('')}</tbody>`;\n\n const html =\n '<!doctype html><html><head><meta charset=\"utf-8\" />' +\n `<title>${escapeHtml(title)}</title>` +\n '<style>' +\n 'body{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;font-size:12px;color:#111;margin:16px;}' +\n 'h1{font-size:16px;margin:0 0 12px;}' +\n 'table{border-collapse:collapse;width:100%;}' +\n 'th,td{border:1px solid #ccc;padding:4px 8px;text-align:left;vertical-align:top;}' +\n 'th{background:#f3f3f3;font-weight:600;}' +\n 'td.right,th.right{text-align:right;} td.center,th.center{text-align:center;}' +\n 'tr{page-break-inside:avoid;} thead{display:table-header-group;}' +\n (options.pageStyle ?? '') +\n '</style></head><body>' +\n (title ? `<h1>${escapeHtml(title)}</h1>` : '') +\n `<table>${headerHtml}${bodyHtml}</table>` +\n '</body></html>';\n\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n iframe.style.opacity = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n window.setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n iframe.onload = () => {\n const win = iframe.contentWindow;\n if (!win) {\n cleanup();\n return;\n }\n try {\n win.focus();\n win.onafterprint = cleanup;\n win.print();\n } catch {\n cleanup();\n }\n };\n\n const doc = iframe.contentDocument || iframe.contentWindow?.document;\n if (doc) {\n doc.open();\n doc.write(html);\n doc.close();\n } else {\n iframe.srcdoc = html;\n }\n};\n","import {\n MGHGridAggregationFunction,\n MGHGridAggregationModel,\n MGHGridApi,\n MGHGridColDef,\n MGHGridGroupNode,\n MGHGridLeafNode,\n MGHGridRowId,\n MGHGridValidRowModel,\n} from './MGHGrid.types';\nimport { formattedValueToString, getCellValue, getFormattedValue, getGroupingValue, isNil } from './utils';\n\nexport interface RowEntry<R extends MGHGridValidRowModel = any> {\n id: MGHGridRowId;\n row: R;\n}\n\n/** Internal tree node used while grouping. */\nexport interface GroupTreeNode<R extends MGHGridValidRowModel = any> {\n id: MGHGridRowId;\n depth: number;\n parent: MGHGridRowId | null;\n groupingField: string;\n groupingKey: any;\n groupingLabel: string;\n childGroups: GroupTreeNode<R>[];\n /** Direct leaf children (only populated at the deepest level). */\n leaves: RowEntry<R>[];\n /** Every descendant leaf, in display order after sorting. */\n descendants: RowEntry<R>[];\n}\n\nexport interface DisplayRow<R extends MGHGridValidRowModel = any> {\n id: MGHGridRowId;\n type: 'leaf' | 'group';\n row: R | null;\n node: MGHGridLeafNode | MGHGridGroupNode;\n depth: number;\n group?: GroupTreeNode<R>;\n}\n\nexport const GROUP_ID_PREFIX = 'auto-generated-row-';\n\nconst keyToString = (key: any) => (isNil(key) ? '' : key instanceof Date ? String(key.getTime()) : String(key));\n\nexport const buildGroupTree = <R extends MGHGridValidRowModel>(\n entries: RowEntry<R>[],\n groupingFields: string[],\n columnsByField: Map<string, MGHGridColDef<R>>,\n api: MGHGridApi<R>,\n emptyLabel = '(empty)'\n): GroupTreeNode<R>[] => {\n const build = (items: RowEntry<R>[], depth: number, parentId: MGHGridRowId | null, path: string): GroupTreeNode<R>[] => {\n const field = groupingFields[depth];\n const col = columnsByField.get(field);\n if (!col) return [];\n const buckets = new Map<string, GroupTreeNode<R>>();\n items.forEach((entry) => {\n const key = getGroupingValue(entry.row, col, api);\n const keyStr = keyToString(key);\n let node = buckets.get(keyStr);\n if (!node) {\n const label = formattedValueToString(getFormattedValue(key, entry.row, col, api, entry.id)) || emptyLabel;\n const id = `${GROUP_ID_PREFIX}${path}${field}/${keyStr}`;\n node = {\n id,\n depth,\n parent: parentId,\n groupingField: field,\n groupingKey: key,\n groupingLabel: label,\n childGroups: [],\n leaves: [],\n descendants: [],\n };\n buckets.set(keyStr, node);\n }\n node.leaves.push(entry);\n });\n const nodes: GroupTreeNode<R>[] = [];\n buckets.forEach((node) => {\n if (depth < groupingFields.length - 1) {\n node.childGroups = build(\n node.leaves,\n depth + 1,\n node.id,\n `${path}${field}/${keyToString(node.groupingKey)}|`\n );\n node.descendants = node.leaves;\n node.leaves = [];\n } else {\n node.descendants = node.leaves;\n }\n nodes.push(node);\n });\n return nodes;\n };\n return build(entries, 0, null, '');\n};\n\nexport type GroupComparator<R extends MGHGridValidRowModel = any> = (a: GroupTreeNode<R>, b: GroupTreeNode<R>) => number;\n\n/** Sorts groups (with the given comparator) and leaves (with the given sorter), recursively. */\nexport const sortGroupTree = <R extends MGHGridValidRowModel>(\n roots: GroupTreeNode<R>[],\n compareGroups: ((depth: number) => GroupComparator<R> | null) | null,\n sortLeaves: (leaves: RowEntry<R>[]) => RowEntry<R>[]\n): GroupTreeNode<R>[] => {\n const sortLevel = (nodes: GroupTreeNode<R>[], depth: number): GroupTreeNode<R>[] => {\n const comparator = compareGroups ? compareGroups(depth) : null;\n const sorted = comparator\n ? nodes\n .map((node, index) => ({ node, index }))\n .sort((a, b) => comparator(a.node, b.node) || a.index - b.index)\n .map((item) => item.node)\n : nodes;\n sorted.forEach((node) => {\n if (node.childGroups.length > 0) {\n node.childGroups = sortLevel(node.childGroups, depth + 1);\n const descendants: RowEntry<R>[] = [];\n node.childGroups.forEach((child) => child.descendants.forEach((d) => descendants.push(d)));\n node.descendants = descendants;\n } else {\n node.leaves = sortLeaves(node.leaves);\n node.descendants = node.leaves;\n }\n });\n return sorted;\n };\n return sortLevel(roots, 0);\n};\n\nexport const collectTreeLeaves = <R extends MGHGridValidRowModel>(roots: GroupTreeNode<R>[]): RowEntry<R>[] => {\n const out: RowEntry<R>[] = [];\n roots.forEach((root) => root.descendants.forEach((d) => out.push(d)));\n return out;\n};\n\nexport const toGroupNode = <R extends MGHGridValidRowModel>(\n node: GroupTreeNode<R>,\n isExpanded: boolean\n): MGHGridGroupNode => ({\n type: 'group',\n id: node.id,\n depth: node.depth,\n parent: node.parent,\n groupingField: node.groupingField,\n groupingKey: node.groupingKey,\n groupingLabel: node.groupingLabel,\n children: node.childGroups.length > 0 ? node.childGroups.map((c) => c.id) : node.leaves.map((l) => l.id),\n leafIds: node.descendants.map((d) => d.id),\n isExpanded,\n});\n\n/** Flattens the tree into display rows, honouring expansion state. Also fills `nodesById` with every node. */\nexport const flattenGroupTree = <R extends MGHGridValidRowModel>(\n roots: GroupTreeNode<R>[],\n isExpanded: (node: GroupTreeNode<R>) => boolean,\n nodesById: Map<MGHGridRowId, MGHGridLeafNode | MGHGridGroupNode>,\n groupsById: Map<MGHGridRowId, GroupTreeNode<R>>\n): DisplayRow<R>[] => {\n const out: DisplayRow<R>[] = [];\n const visit = (nodes: GroupTreeNode<R>[], visible: boolean) => {\n nodes.forEach((node) => {\n const expanded = isExpanded(node);\n const groupNode = toGroupNode(node, expanded);\n nodesById.set(node.id, groupNode);\n groupsById.set(node.id, node);\n if (visible)\n out.push({ id: node.id, type: 'group', row: null, node: groupNode, depth: node.depth, group: node });\n const childVisible = visible && expanded;\n if (node.childGroups.length > 0) {\n visit(node.childGroups, childVisible);\n } else {\n node.leaves.forEach((leaf) => {\n const leafNode: MGHGridLeafNode = { type: 'leaf', id: leaf.id, depth: node.depth + 1, parent: node.id };\n nodesById.set(leaf.id, leafNode);\n if (childVisible)\n out.push({ id: leaf.id, type: 'leaf', row: leaf.row, node: leafNode, depth: node.depth + 1 });\n });\n }\n });\n };\n visit(roots, true);\n return out;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Aggregation\n * ----------------------------------------------------------------------------------------------- */\n\nexport const aggregateRows = <R extends MGHGridValidRowModel>(\n rows: R[],\n aggregationModel: MGHGridAggregationModel,\n columnsByField: Map<string, MGHGridColDef<R>>,\n functions: Record<string, MGHGridAggregationFunction>,\n api: MGHGridApi<R>\n): Record<string, { value: any; fn: string }> => {\n const result: Record<string, { value: any; fn: string }> = {};\n Object.keys(aggregationModel).forEach((field) => {\n const fnName = aggregationModel[field];\n const fn = functions[fnName];\n const col = columnsByField.get(field);\n if (!fn || !col || col.aggregable === false) return;\n const values = rows.map((row) => getCellValue(row, col, api));\n result[field] = { value: fn.apply({ values, field }), fn: fnName };\n });\n return result;\n};\n","import React from 'react';\n\n/* Small inline SVG icon set (Material Design icon paths, Apache-2.0). No external dependencies. */\n\nexport interface MGHGridIconProps extends React.SVGProps<SVGSVGElement> {\n size?: number;\n}\n\nconst createIcon = (path: React.ReactNode, displayName: string) => {\n const Icon = React.forwardRef<SVGSVGElement, MGHGridIconProps>(({ size = 20, className, style, ...rest }, ref) => (\n <svg\n ref={ref}\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n fill=\"currentColor\"\n focusable=\"false\"\n aria-hidden=\"true\"\n className={['mgh-grid-icon', className].filter(Boolean).join(' ')}\n style={style}\n {...rest}\n >\n {path}\n </svg>\n ));\n Icon.displayName = displayName;\n return Icon;\n};\n\nexport const ViewColumnIcon = createIcon(\n <path d=\"M14.67 5v14H9.33V5h5.34zm1 14H21V5h-5.33v14zm-7.34 0V5H3v14h5.33z\" />,\n 'ViewColumnIcon'\n);\nexport const FilterListIcon = createIcon(<path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\" />, 'FilterListIcon');\nexport const SearchIcon = createIcon(\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />,\n 'SearchIcon'\n);\nexport const CloseIcon = createIcon(\n <path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />,\n 'CloseIcon'\n);\nexport const DownloadIcon = createIcon(\n <path d=\"M19 12v7H5v-7H3v7c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zm-6 .67 2.59-2.58L17 11.5l-5 5-5-5 1.41-1.41L11 12.67V3h2z\" />,\n 'DownloadIcon'\n);\nexport const ArrowUpwardIcon = createIcon(\n <path d=\"m4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />,\n 'ArrowUpwardIcon'\n);\nexport const ArrowDownwardIcon = createIcon(\n <path d=\"m20 12-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\" />,\n 'ArrowDownwardIcon'\n);\nexport const MoreVertIcon = createIcon(\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />,\n 'MoreVertIcon'\n);\nexport const CheckIcon = createIcon(<path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />, 'CheckIcon');\nexport const ExpandMoreIcon = createIcon(<path d=\"M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z\" />, 'ExpandMoreIcon');\nexport const ChevronRightIcon = createIcon(<path d=\"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />, 'ChevronRightIcon');\nexport const ChevronLeftIcon = createIcon(<path d=\"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />, 'ChevronLeftIcon');\nexport const FirstPageIcon = createIcon(\n <path d=\"M18.41 16.59 13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\" />,\n 'FirstPageIcon'\n);\nexport const LastPageIcon = createIcon(\n <path d=\"M5.59 7.41 10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\" />,\n 'LastPageIcon'\n);\nexport const PushPinIcon = createIcon(\n <path d=\"M16 9V4h1c.55 0 1-.45 1-1s-.45-1-1-1H7c-.55 0-1 .45-1 1s.45 1 1 1h1v5c0 1.66-1.34 3-3 3v2h5.97v7l1 1 1-1v-7H19v-2c-1.66 0-3-1.34-3-3z\" />,\n 'PushPinIcon'\n);\nexport const DeleteIcon = createIcon(\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />,\n 'DeleteIcon'\n);\nexport const AddIcon = createIcon(<path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />, 'AddIcon');\nexport const DensitySmallIcon = createIcon(\n <path d=\"M3 2h18v2H3zm0 18h18v2H3zm0-6h18v2H3zm0-6h18v2H3z\" />,\n 'DensitySmallIcon'\n);\nexport const DensityMediumIcon = createIcon(<path d=\"M3 3h18v2H3zm0 16h18v2H3zm0-8h18v2H3z\" />, 'DensityMediumIcon');\nexport const DensityLargeIcon = createIcon(<path d=\"M3 3h18v2H3zm0 16h18v2H3z\" />, 'DensityLargeIcon');\nexport const DragIndicatorIcon = createIcon(\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />,\n 'DragIndicatorIcon'\n);\nexport const PrintIcon = createIcon(\n <path d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\" />,\n 'PrintIcon'\n);\nexport const TableChartIcon = createIcon(\n <path d=\"M10 10.02h5V21h-5zM17 21h3c1.1 0 2-.9 2-2v-9h-5v11zm3-18H5c-1.1 0-2 .9-2 2v3h19V5c0-1.1-.9-2-2-2zM3 19c0 1.1.9 2 2 2h3V10H3v9z\" />,\n 'TableChartIcon'\n);\nexport const DescriptionIcon = createIcon(\n <path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\" />,\n 'DescriptionIcon'\n);\nexport const VisibilityOffIcon = createIcon(\n <path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46A11.804 11.804 0 0 0 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\" />,\n 'VisibilityOffIcon'\n);\nexport const FunctionsIcon = createIcon(<path d=\"M18 4H6v2l6.5 6L6 18v2h12v-3h-7l5-5-5-5h7z\" />, 'FunctionsIcon');\nexport const WorkspacesIcon = createIcon(\n <path d=\"M6 13c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm6-10C9.8 3 8 4.8 8 7s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm6 10c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4z\" />,\n 'WorkspacesIcon'\n);\nexport const EmptyBoxIcon = createIcon(\n <>\n <path\n d=\"M20 6h-2.18c.11-.31.18-.65.18-1a2.996 2.996 0 0 0-5.5-1.65l-.5.67-.5-.68C10.96 2.54 10.05 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2z\"\n opacity=\".25\"\n />\n <path d=\"M4 8h16v11H4z\" opacity=\".15\" />\n </>,\n 'EmptyBoxIcon'\n);\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { MGHGridThemeMode } from '../MGHGrid.types';\nimport { clamp, cx } from '../utils';\n\n/* -------------------------------------------------------------------------------------------------\n * Button / IconButton\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'text' | 'primary' | 'contained';\n size?: 'small' | 'medium';\n startIcon?: React.ReactNode;\n endIcon?: React.ReactNode;\n active?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n { variant = 'text', size = 'medium', startIcon, endIcon, active, className, children, type = 'button', ...rest },\n ref\n ) => (\n <button\n ref={ref}\n type={type}\n className={cx(\n 'mgh-grid-btn',\n variant === 'primary' && 'mgh-grid-btn--primary',\n variant === 'contained' && 'mgh-grid-btn--contained',\n size === 'small' && 'mgh-grid-btn--small',\n active && 'mgh-grid-btn--active',\n className\n )}\n {...rest}\n >\n {startIcon}\n {children}\n {endIcon}\n </button>\n )\n);\nButton.displayName = 'MGHGridButton';\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n size?: 'small' | 'medium';\n active?: boolean;\n /** Tooltip (native title) and aria-label. */\n label?: string;\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ size = 'medium', active, label, className, children, type = 'button', ...rest }, ref) => (\n <button\n ref={ref}\n type={type}\n title={label}\n aria-label={label}\n className={cx(\n 'mgh-grid-btn mgh-grid-btn--icon',\n size === 'small' && 'mgh-grid-btn--small',\n active && 'mgh-grid-btn--active',\n className\n )}\n {...rest}\n >\n {children}\n </button>\n )\n);\nIconButton.displayName = 'MGHGridIconButton';\n\n/* -------------------------------------------------------------------------------------------------\n * Badge\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface BadgeProps {\n count?: number;\n variant?: 'dot' | 'count';\n children: React.ReactNode;\n}\n\nexport const Badge = ({ count = 0, variant = 'dot', children }: BadgeProps) => (\n <span className=\"mgh-grid-badge\">\n {children}\n {count > 0 &&\n (variant === 'dot' ? (\n <span className=\"mgh-grid-badge-dot\" />\n ) : (\n <span className=\"mgh-grid-badge-count\">{count > 99 ? '99+' : count}</span>\n ))}\n </span>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Inputs\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface TextInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n size?: 'small' | 'medium';\n}\n\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>(\n ({ size = 'medium', className, ...rest }, ref) => (\n <input\n ref={ref}\n className={cx('mgh-grid-input', size === 'small' && 'mgh-grid-input--small', className)}\n {...rest}\n />\n )\n);\nTextInput.displayName = 'MGHGridTextInput';\n\nexport interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n size?: 'small' | 'medium';\n}\n\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(({ size = 'medium', className, ...rest }, ref) => (\n <select ref={ref} className={cx('mgh-grid-select', size === 'small' && 'mgh-grid-select--small', className)} {...rest} />\n));\nSelect.displayName = 'MGHGridSelect';\n\nexport interface FieldProps {\n label?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n htmlFor?: string;\n}\n\nexport const Field = ({ label, children, className, htmlFor }: FieldProps) => (\n <div className={cx('mgh-grid-field', className)}>\n {label && (\n <label className=\"mgh-grid-field-label\" htmlFor={htmlFor}>\n {label}\n </label>\n )}\n {children}\n </div>\n);\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n indeterminate?: boolean;\n label?: string;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ indeterminate = false, label, className, ...rest }, forwardedRef) => {\n const innerRef = React.useRef<HTMLInputElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) (forwardedRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n },\n [forwardedRef]\n );\n React.useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n return (\n <input\n ref={setRef}\n type=\"checkbox\"\n title={label}\n aria-label={label}\n className={cx('mgh-grid-checkbox', className)}\n {...rest}\n />\n );\n }\n);\nCheckbox.displayName = 'MGHGridCheckbox';\n\n/* -------------------------------------------------------------------------------------------------\n * Spinner\n * ----------------------------------------------------------------------------------------------- */\n\nexport const Spinner = ({ className }: { className?: string }) => (\n <div className={cx('mgh-grid-spinner', className)} role=\"progressbar\" aria-label=\"Loading\" />\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover (portal, anchored)\n * ----------------------------------------------------------------------------------------------- */\n\nexport type PopoverPlacement = 'bottom-start' | 'bottom-end' | 'bottom' | 'right-start';\n\nexport interface PopoverProps {\n open: boolean;\n anchorEl: HTMLElement | null | undefined;\n onClose: (reason: 'backdrop' | 'escape') => void;\n children: React.ReactNode;\n placement?: PopoverPlacement;\n themeMode?: MGHGridThemeMode;\n className?: string;\n style?: React.CSSProperties;\n offset?: number;\n role?: string;\n autoFocus?: boolean;\n /** Additional elements considered \"inside\" for outside-click detection. */\n ignoreOutsideClickOn?: Array<React.RefObject<HTMLElement | null>>;\n}\n\nexport function Popover({\n open,\n anchorEl,\n onClose,\n children,\n placement = 'bottom-start',\n themeMode = 'light',\n className,\n style,\n offset = 4,\n role = 'dialog',\n autoFocus = false,\n ignoreOutsideClickOn,\n}: PopoverProps) {\n const ref = React.useRef<HTMLDivElement | null>(null);\n const [position, setPosition] = React.useState<{ top: number; left: number; ready: boolean }>({\n top: 0,\n left: 0,\n ready: false,\n });\n\n const update = React.useCallback(() => {\n const el = ref.current;\n if (!el) return;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n let top: number;\n let left: number;\n if (anchorEl && anchorEl.isConnected) {\n const a = anchorEl.getBoundingClientRect();\n if (placement === 'right-start') {\n top = a.top;\n left = a.right + offset;\n if (left + w > vw - 8) left = a.left - offset - w;\n } else {\n top = a.bottom + offset;\n if (top + h > vh - 8 && a.top - offset - h >= 8) top = a.top - offset - h;\n left =\n placement === 'bottom-end'\n ? a.right - w\n : placement === 'bottom'\n ? a.left + a.width / 2 - w / 2\n : a.left;\n }\n } else {\n top = vh / 2 - h / 2;\n left = vw / 2 - w / 2;\n }\n top = clamp(top, 8, Math.max(8, vh - h - 8));\n left = clamp(left, 8, Math.max(8, vw - w - 8));\n setPosition((prev) => (prev.ready && prev.top === top && prev.left === left ? prev : { top, left, ready: true }));\n }, [anchorEl, placement, offset]);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPosition((prev) => (prev.ready ? { ...prev, ready: false } : prev));\n return undefined;\n }\n update();\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n let observer: ResizeObserver | null = null;\n if (typeof ResizeObserver !== 'undefined' && ref.current) {\n observer = new ResizeObserver(() => update());\n observer.observe(ref.current);\n }\n return () => {\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n observer?.disconnect();\n };\n }, [open, update]);\n\n React.useEffect(() => {\n if (!open) return undefined;\n const handlePointerDown = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n if (ref.current?.contains(target)) return;\n if (anchorEl?.contains(target)) return;\n if (ignoreOutsideClickOn?.some((r) => r.current?.contains(target))) return;\n // Clicks inside other popovers (nested menus) should not close this one.\n if ((target as HTMLElement).closest?.('.mgh-grid-popover')) return;\n onClose('backdrop');\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose('escape');\n };\n document.addEventListener('mousedown', handlePointerDown, true);\n document.addEventListener('touchstart', handlePointerDown, true);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handlePointerDown, true);\n document.removeEventListener('touchstart', handlePointerDown, true);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open, onClose, anchorEl, ignoreOutsideClickOn]);\n\n React.useEffect(() => {\n if (open && autoFocus && ref.current) {\n const focusable = ref.current.querySelector<HTMLElement>(\n 'input, select, textarea, button, [tabindex]:not([tabindex=\"-1\"])'\n );\n (focusable ?? ref.current).focus();\n }\n }, [open, autoFocus]);\n\n if (!open || typeof document === 'undefined') return null;\n\n const stop = (event: React.SyntheticEvent) => event.stopPropagation();\n\n return createPortal(\n <div\n ref={ref}\n role={role}\n tabIndex={-1}\n className={cx('mgh-grid-popover', className)}\n data-mgh-theme={themeMode}\n style={{\n top: position.top,\n left: position.left,\n visibility: position.ready ? 'visible' : 'hidden',\n ...style,\n }}\n onClick={stop}\n onDoubleClick={stop}\n onMouseDown={stop}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onClose('escape');\n return;\n }\n event.stopPropagation();\n }}\n >\n {children}\n </div>,\n document.body\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Menu\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface MenuProps extends React.HTMLAttributes<HTMLUListElement> {\n children: React.ReactNode;\n}\n\nexport const Menu = ({ children, className, onKeyDown, ...rest }: MenuProps) => {\n const ref = React.useRef<HTMLUListElement | null>(null);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLUListElement>) => {\n onKeyDown?.(event);\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp' && event.key !== 'Home' && event.key !== 'End') return;\n const items = Array.from(\n ref.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])') ?? []\n );\n if (items.length === 0) return;\n event.preventDefault();\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n let next = 0;\n if (event.key === 'ArrowDown') next = currentIndex < 0 ? 0 : (currentIndex + 1) % items.length;\n else if (event.key === 'ArrowUp')\n next = currentIndex < 0 ? items.length - 1 : (currentIndex - 1 + items.length) % items.length;\n else if (event.key === 'Home') next = 0;\n else next = items.length - 1;\n items[next].focus();\n };\n\n React.useEffect(() => {\n const first = ref.current?.querySelector<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])');\n first?.focus();\n }, []);\n\n return (\n <ul ref={ref} role=\"menu\" className={cx('mgh-grid-menu', className)} onKeyDown={handleKeyDown} {...rest}>\n {children}\n </ul>\n );\n};\n\nexport interface MenuItemProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n icon?: React.ReactNode;\n selected?: boolean;\n /** Injected by menus that should close after the click. */\n hideMenu?: () => void;\n}\n\nexport const MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({ icon, selected, disabled, className, children, onClick, hideMenu, ...rest }, ref) => (\n <li role=\"none\">\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n aria-disabled={disabled || undefined}\n disabled={disabled}\n tabIndex={-1}\n className={cx(\n 'mgh-grid-menu-item',\n disabled && 'mgh-grid-menu-item--disabled',\n selected && 'mgh-grid-menu-item--selected',\n className\n )}\n onClick={(event) => {\n if (disabled) return;\n onClick?.(event);\n hideMenu?.();\n }}\n {...rest}\n >\n {icon}\n <span>{children}</span>\n </button>\n </li>\n )\n);\nMenuItem.displayName = 'MGHGridMenuItem';\n\nexport const MenuDivider = () => <li role=\"separator\" className=\"mgh-grid-menu-divider\" />;\n\nexport const MenuHeader = ({ children }: { children: React.ReactNode }) => (\n <li role=\"presentation\" className=\"mgh-grid-menu-header\">\n {children}\n </li>\n);\n\nexport const MenuSection = ({ children }: { children: React.ReactNode }) => (\n <li role=\"presentation\" className=\"mgh-grid-menu-section\">\n {children}\n </li>\n);\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport {\n MGHGridCsvExportOptions,\n MGHGridExcelExportOptions,\n MGHGridPrintExportOptions,\n MGHGridToolbarProps,\n} from '../MGHGrid.types';\nimport {\n CloseIcon,\n DensityLargeIcon,\n DensityMediumIcon,\n DensitySmallIcon,\n DescriptionIcon,\n DownloadIcon,\n FilterListIcon,\n PrintIcon,\n SearchIcon,\n TableChartIcon,\n ViewColumnIcon,\n} from '../icons';\nimport { cx } from '../utils';\nimport { Badge, IconButton, Menu, MenuItem, MenuItemProps, Popover, TextInput } from './primitives';\n\n/* -------------------------------------------------------------------------------------------------\n * Buttons\n * ----------------------------------------------------------------------------------------------- */\n\nexport function MGHGridColumnsButton() {\n const { api, state, localeText } = useMGHGridContext();\n const isOpen = state.preferencePanel.open && state.preferencePanel.openedPanelValue === 'columns';\n return (\n <IconButton\n label={localeText.toolbarColumns}\n active={isOpen}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n onClick={(event) => (isOpen ? api.hidePreferences() : api.showPreferences('columns', event.currentTarget))}\n >\n <ViewColumnIcon />\n </IconButton>\n );\n}\n\nexport function MGHGridFiltersButton() {\n const { api, state, localeText } = useMGHGridContext();\n const isOpen = state.preferencePanel.open && state.preferencePanel.openedPanelValue === 'filters';\n return (\n <IconButton\n label={localeText.toolbarFilters}\n active={isOpen}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n onClick={(event) => (isOpen ? api.hidePreferences() : api.showPreferences('filters', event.currentTarget))}\n >\n <Badge count={state.filterCount} variant=\"dot\">\n <FilterListIcon />\n </Badge>\n </IconButton>\n );\n}\n\nexport function MGHGridDensitySelector() {\n const { api, state, localeText, themeMode } = useMGHGridContext();\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null);\n const options = [\n { value: 'compact', label: localeText.densityCompact, icon: <DensitySmallIcon /> },\n { value: 'standard', label: localeText.densityStandard, icon: <DensityMediumIcon /> },\n { value: 'comfortable', label: localeText.densityComfortable, icon: <DensityLargeIcon /> },\n ] as const;\n const current = options.find((o) => o.value === state.density) ?? options[1];\n return (\n <>\n <IconButton\n label={localeText.toolbarDensity}\n active={Boolean(anchor)}\n aria-haspopup=\"menu\"\n onClick={(event) => setAnchor((prev) => (prev ? null : event.currentTarget))}\n >\n {current.icon}\n </IconButton>\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n themeMode={themeMode}\n role=\"menu\"\n >\n <Menu>\n {options.map((option) => (\n <MenuItem\n key={option.value}\n icon={option.icon}\n selected={option.value === state.density}\n onClick={() => api.setDensity(option.value)}\n hideMenu={() => setAnchor(null)}\n >\n {option.label}\n </MenuItem>\n ))}\n </Menu>\n </Popover>\n </>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Export menu\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface MGHGridExportMenuItemProps extends MenuItemProps {\n /** Injected by MGHGridExportMenu; call it to close the menu after your action. */\n hideMenu?: () => void;\n}\n\n/** Menu item for custom export actions. Drop-in for MUI's GridExportMenuItemProps pattern. */\nexport const MGHGridExportMenuItem = MenuItem as React.ForwardRefExoticComponent<\n MGHGridExportMenuItemProps & React.RefAttributes<HTMLButtonElement>\n>;\n\nexport interface MGHGridExportMenuProps {\n csvOptions?: MGHGridCsvExportOptions;\n excelOptions?: MGHGridExcelExportOptions;\n printOptions?: MGHGridPrintExportOptions;\n showCsvOption?: boolean;\n showExcelOption?: boolean;\n showPrintOption?: boolean;\n customMenuItem?: React.ReactNode;\n}\n\nexport function MGHGridExportMenu({\n csvOptions = { allColumns: true },\n excelOptions = { allColumns: true },\n printOptions,\n showCsvOption = true,\n showExcelOption = true,\n showPrintOption = true,\n customMenuItem,\n}: MGHGridExportMenuProps) {\n const { api, localeText, themeMode, rootProps } = useMGHGridContext();\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null);\n const hideMenu = () => setAnchor(null);\n\n const customItems = React.Children.map(customMenuItem, (child) =>\n React.isValidElement(child) ? React.cloneElement(child as React.ReactElement<any>, { hideMenu }) : child\n );\n\n const resolvedPrintOptions: MGHGridPrintExportOptions = {\n title: typeof rootProps.header === 'string' ? rootProps.header : undefined,\n ...printOptions,\n };\n\n return (\n <>\n <IconButton\n label={localeText.toolbarExport}\n active={Boolean(anchor)}\n aria-haspopup=\"menu\"\n onClick={(event) => setAnchor((prev) => (prev ? null : event.currentTarget))}\n >\n <DownloadIcon />\n </IconButton>\n <Popover open={Boolean(anchor)} anchorEl={anchor} onClose={hideMenu} themeMode={themeMode} role=\"menu\">\n <Menu>\n {customItems}\n {showCsvOption && (\n <MenuItem\n icon={<DescriptionIcon />}\n onClick={() => api.exportDataAsCsv(csvOptions)}\n hideMenu={hideMenu}\n >\n {localeText.toolbarExportCSV}\n </MenuItem>\n )}\n {showExcelOption && (\n <MenuItem\n icon={<TableChartIcon />}\n onClick={() => {\n void api.exportDataAsExcel(excelOptions);\n }}\n hideMenu={hideMenu}\n >\n {localeText.toolbarExportExcel}\n </MenuItem>\n )}\n {showPrintOption && (\n <MenuItem\n icon={<PrintIcon />}\n onClick={() => api.exportDataAsPrint(resolvedPrintOptions)}\n hideMenu={hideMenu}\n >\n {localeText.toolbarExportPrint}\n </MenuItem>\n )}\n </Menu>\n </Popover>\n </>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Quick filter\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface MGHGridQuickFilterProps {\n placeholder?: string;\n debounceMs?: number;\n /** Always show the expanded input. */\n alwaysExpanded?: boolean;\n}\n\nexport function MGHGridQuickFilter({ placeholder, debounceMs, alwaysExpanded = false }: MGHGridQuickFilterProps) {\n const { api, state, localeText, rootProps } = useMGHGridContext();\n const externalValue = (state.quickFilterValues ?? []).join(' ');\n const [text, setText] = React.useState(externalValue);\n const [expanded, setExpanded] = React.useState(alwaysExpanded || externalValue !== '');\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const timer = React.useRef<number | null>(null);\n const delay = debounceMs ?? rootProps.quickFilterDebounceMs;\n\n // Sync when the model is changed from outside (e.g. api.setQuickFilterValues).\n const lastExternal = React.useRef(externalValue);\n React.useEffect(() => {\n if (externalValue !== lastExternal.current) {\n lastExternal.current = externalValue;\n setText(externalValue);\n if (externalValue !== '') setExpanded(true);\n }\n }, [externalValue]);\n\n React.useEffect(\n () => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n },\n []\n );\n\n const commit = (value: string) => {\n const values = value.split(/\\s+/).filter((v) => v !== '');\n lastExternal.current = values.join(' ');\n api.setQuickFilterValues(values);\n };\n\n const handleChange = (value: string) => {\n setText(value);\n if (timer.current !== null) window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => commit(value), delay);\n };\n\n const clear = () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n setText('');\n commit('');\n inputRef.current?.focus();\n };\n\n const expand = () => {\n setExpanded(true);\n window.setTimeout(() => inputRef.current?.focus(), 0);\n };\n\n const isExpanded = alwaysExpanded || expanded;\n\n return (\n <div className={cx('mgh-grid-quick-filter', isExpanded && 'mgh-grid-quick-filter--expanded')}>\n <IconButton\n className=\"mgh-grid-quick-filter-trigger\"\n label={localeText.toolbarQuickFilterLabel}\n aria-disabled={isExpanded}\n tabIndex={isExpanded ? -1 : 0}\n onClick={expand}\n >\n <SearchIcon />\n </IconButton>\n <div\n className={cx(\n 'mgh-grid-quick-filter-control mgh-grid-input-adorned',\n text && 'mgh-grid-input-adorned--clearable'\n )}\n >\n <span className=\"mgh-grid-input-adornment\">\n <SearchIcon size={18} />\n </span>\n <TextInput\n ref={inputRef}\n size=\"small\"\n type=\"search\"\n value={text}\n tabIndex={isExpanded ? 0 : -1}\n placeholder={placeholder ?? localeText.toolbarQuickFilterPlaceholder}\n aria-label={localeText.toolbarQuickFilterLabel}\n onChange={(event) => handleChange(event.target.value)}\n onBlur={() => {\n if (!alwaysExpanded && text.trim() === '') setExpanded(false);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n if (text) clear();\n else if (!alwaysExpanded) {\n setExpanded(false);\n inputRef.current?.blur();\n }\n }\n if (event.key === 'Enter') {\n if (timer.current !== null) window.clearTimeout(timer.current);\n commit(text);\n }\n }}\n />\n {text && (\n <span className=\"mgh-grid-input-adornment mgh-grid-input-adornment--end\">\n <IconButton size=\"small\" label={localeText.clearSearch} onClick={clear} tabIndex={-1}>\n <CloseIcon />\n </IconButton>\n </span>\n )}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Default toolbar\n * ----------------------------------------------------------------------------------------------- */\n\nexport function MGHGridToolbar({\n showColumnsButton = true,\n showFilterButton = true,\n showExportButton = true,\n showQuickFilter = true,\n showDensitySelector = false,\n showCsvOption = true,\n showExcelOption = true,\n showPrintOption = true,\n csvOptions,\n excelOptions,\n printOptions,\n renderOtherButtons,\n renderDateRange,\n customMenuItem,\n quickFilterPlaceholder,\n quickFilterDebounceMs,\n}: MGHGridToolbarProps) {\n const { rootProps } = useMGHGridContext();\n const showColumns = showColumnsButton && !rootProps.disableColumnSelector;\n const showFilters = showFilterButton && !rootProps.disableColumnFilter;\n const showDensity = showDensitySelector && !rootProps.disableDensitySelector;\n\n return (\n <div className=\"mgh-grid-toolbar\" role=\"toolbar\">\n <div className=\"mgh-grid-toolbar-group\">\n {showColumns && <MGHGridColumnsButton />}\n {showFilters && <MGHGridFiltersButton />}\n {showDensity && <MGHGridDensitySelector />}\n {showExportButton && (\n <MGHGridExportMenu\n csvOptions={csvOptions}\n excelOptions={excelOptions}\n printOptions={printOptions}\n showCsvOption={showCsvOption}\n showExcelOption={showExcelOption}\n showPrintOption={showPrintOption}\n customMenuItem={customMenuItem}\n />\n )}\n </div>\n {renderDateRange && <div className=\"mgh-grid-toolbar-center\">{renderDateRange}</div>}\n <div className=\"mgh-grid-toolbar-group\">\n {renderOtherButtons}\n {showQuickFilter && (\n <MGHGridQuickFilter placeholder={quickFilterPlaceholder} debounceMs={quickFilterDebounceMs} />\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport { ChevronLeftIcon, ChevronRightIcon, FirstPageIcon, LastPageIcon } from '../icons';\nimport { IconButton, Select } from './primitives';\n\nexport function MGHGridPagination() {\n const { api, state, localeText, rootProps } = useMGHGridContext();\n const { page, pageSize } = state.paginationModel;\n const count = state.rowCount;\n const pageCount = state.pageCount;\n const from = count === 0 ? 0 : page * pageSize + 1;\n const to = Math.min(count, (page + 1) * pageSize);\n const options =\n rootProps.pageSizeOptions.indexOf(pageSize) === -1\n ? rootProps.pageSizeOptions.concat([pageSize]).sort((a, b) => a - b)\n : rootProps.pageSizeOptions;\n\n return (\n <div className=\"mgh-grid-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n <span>{localeText.footerPaginationRowsPerPage}</span>\n <Select\n className=\"mgh-grid-pagination-select\"\n value={pageSize}\n aria-label={localeText.footerPaginationRowsPerPage}\n onChange={(event) => api.setPageSize(Number(event.target.value))}\n >\n {options.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </Select>\n <span>{localeText.footerPaginationDisplayedRows(from, to, count)}</span>\n <div className=\"mgh-grid-pagination-actions\">\n <IconButton label={localeText.footerPaginationFirstPage} disabled={page <= 0} onClick={() => api.setPage(0)}>\n <FirstPageIcon />\n </IconButton>\n <IconButton\n label={localeText.footerPaginationPreviousPage}\n disabled={page <= 0}\n onClick={() => api.setPage(page - 1)}\n >\n <ChevronLeftIcon />\n </IconButton>\n <IconButton\n label={localeText.footerPaginationNextPage}\n disabled={page >= pageCount - 1}\n onClick={() => api.setPage(page + 1)}\n >\n <ChevronRightIcon />\n </IconButton>\n <IconButton\n label={localeText.footerPaginationLastPage}\n disabled={page >= pageCount - 1}\n onClick={() => api.setPage(Math.max(pageCount - 1, 0))}\n >\n <LastPageIcon />\n </IconButton>\n </div>\n </div>\n );\n}\n\nexport function MGHGridFooter() {\n const { state, localeText, rootProps } = useMGHGridContext();\n const selectedCount = state.rowSelectionModel.ids.size;\n const showSelected = selectedCount > 0 && !rootProps.hideFooterSelectedRowCount;\n const showPagination = rootProps.pagination && !rootProps.hideFooterPagination;\n const showRowCount = !showPagination && !rootProps.hideFooterRowCount;\n\n return (\n <div className=\"mgh-grid-footer\">\n <div className=\"mgh-grid-footer-left\">\n {showSelected && <span>{localeText.footerRowSelected(selectedCount)}</span>}\n </div>\n {showRowCount && (\n <span>\n {localeText.footerTotalRows} {state.rowCount.toLocaleString()}\n </span>\n )}\n {showPagination && <MGHGridPagination />}\n </div>\n );\n}\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport { SearchIcon } from '../icons';\nimport { Button, Checkbox, TextInput } from './primitives';\n\nexport function MGHGridColumnsPanel() {\n const { api, state, localeText, columns, visibleColumns } = useMGHGridContext();\n const visibleFields = React.useMemo(() => new Set(visibleColumns.map((col) => col.field)), [visibleColumns]);\n const [search, setSearch] = React.useState('');\n const model = state.columnVisibilityModel;\n\n const hideable = columns.filter((col) => col.hideable !== false);\n const needle = search.trim().toLowerCase();\n const filtered = needle\n ? hideable.filter((col) => (col.headerName ?? col.field).toLowerCase().indexOf(needle) !== -1)\n : hideable;\n\n const setAll = (visible: boolean) => {\n const next = { ...model };\n hideable.forEach((col) => {\n next[col.field] = visible;\n });\n api.setColumnVisibilityModel(next);\n };\n\n return (\n <div className=\"mgh-grid-panel\" role=\"group\" aria-label={localeText.toolbarColumns}>\n <div className=\"mgh-grid-panel-header\">\n <div className=\"mgh-grid-input-adorned\">\n <span className=\"mgh-grid-input-adornment\">\n <SearchIcon size={18} />\n </span>\n <TextInput\n autoFocus\n size=\"small\"\n value={search}\n placeholder={localeText.columnsPanelSearchPlaceholder}\n aria-label={localeText.columnsPanelSearchPlaceholder}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n </div>\n <div className=\"mgh-grid-panel-content\">\n <div className=\"mgh-grid-columns-list\">\n {filtered.map((col) => {\n const visible = visibleFields.has(col.field);\n return (\n <label key={col.field} className=\"mgh-grid-checkbox-label\">\n <Checkbox checked={visible} onChange={() => api.setColumnVisibility(col.field, !visible)} />\n <span>{col.headerName ?? col.field}</span>\n </label>\n );\n })}\n {filtered.length === 0 && <div className=\"mgh-grid-filter-empty\">No columns</div>}\n </div>\n </div>\n <div className=\"mgh-grid-panel-footer\">\n <Button variant=\"primary\" size=\"small\" onClick={() => setAll(true)}>\n {localeText.columnsPanelShowAll}\n </Button>\n <Button variant=\"primary\" size=\"small\" onClick={() => setAll(false)}>\n {localeText.columnsPanelHideAll}\n </Button>\n <Button size=\"small\" onClick={() => api.setColumnVisibilityModel({})}>\n {localeText.columnsPanelReset}\n </Button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport { MGHGridColDef, MGHGridFilterItem, MGHGridFilterOperator } from '../MGHGrid.types';\nimport { AddIcon, DeleteIcon } from '../icons';\nimport { getColumnFilterOperators, getOptionLabel, getOptionValue, resolveValueOptions, uniqueId } from '../utils';\nimport { Button, Field, IconButton, Select, TextInput } from './primitives';\n\ninterface FilterValueInputProps {\n item: MGHGridFilterItem;\n column: MGHGridColDef;\n operator: MGHGridFilterOperator | undefined;\n onChange: (value: any) => void;\n placeholder: string;\n}\n\nconst useDebouncedValue = (value: any, onCommit: (value: any) => void, delay = 250) => {\n const [local, setLocal] = React.useState(value ?? '');\n const timer = React.useRef<number | null>(null);\n React.useEffect(() => {\n setLocal(value ?? '');\n }, [value]);\n const update = (next: any) => {\n setLocal(next);\n if (timer.current !== null) window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => onCommit(next), delay);\n };\n React.useEffect(\n () => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n },\n []\n );\n return [local, update] as const;\n};\n\nfunction TextValueInput({ item, onChange, placeholder, type }: FilterValueInputProps & { type: string }) {\n const [local, update] = useDebouncedValue(item.value, onChange);\n return (\n <TextInput\n size=\"small\"\n type={type}\n value={local}\n placeholder={placeholder}\n aria-label={placeholder}\n onChange={(event) => update(event.target.value)}\n />\n );\n}\n\nfunction MultiValueInput({ item, column, onChange, placeholder }: FilterValueInputProps) {\n const joined = Array.isArray(item.value) ? item.value.join(', ') : (item.value ?? '');\n const [local, update] = useDebouncedValue(joined, (text: string) =>\n onChange(\n String(text)\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v !== '')\n )\n );\n if (column.type === 'singleSelect') {\n const options = resolveValueOptions(column);\n const selected: string[] = Array.isArray(item.value) ? item.value.map(String) : [];\n return (\n <Select\n multiple\n size=\"small\"\n value={selected}\n aria-label={placeholder}\n onChange={(event) => {\n const values = Array.from(event.target.selectedOptions).map((option) => {\n const match = options.find((o) => String(getOptionValue(column, o)) === option.value);\n return match !== undefined ? getOptionValue(column, match) : option.value;\n });\n onChange(values);\n }}\n >\n {options.map((option) => {\n const value = getOptionValue(column, option);\n return (\n <option key={String(value)} value={String(value)}>\n {getOptionLabel(column, option)}\n </option>\n );\n })}\n </Select>\n );\n }\n return (\n <TextInput\n size=\"small\"\n value={local}\n placeholder=\"Comma separated values\"\n aria-label={placeholder}\n onChange={(event) => update(event.target.value)}\n />\n );\n}\n\nfunction FilterValueInput(props: FilterValueInputProps) {\n const { item, column, operator, onChange, placeholder } = props;\n const { api } = useMGHGridContext();\n const inputType = operator?.inputType ?? 'text';\n\n if (operator?.InputComponent) {\n const Component = operator.InputComponent;\n return <Component item={item} column={column} applyValue={(next) => onChange(next.value)} api={api} />;\n }\n\n switch (inputType) {\n case 'none':\n return <div />;\n case 'boolean':\n return (\n <Select\n size=\"small\"\n value={item.value === undefined || item.value === null ? '' : String(item.value)}\n aria-label={placeholder}\n onChange={(event) => onChange(event.target.value === '' ? undefined : event.target.value)}\n >\n <option value=\"\">any</option>\n <option value=\"true\">yes</option>\n <option value=\"false\">no</option>\n </Select>\n );\n case 'select': {\n const options = resolveValueOptions(column);\n return (\n <Select\n size=\"small\"\n value={item.value === undefined || item.value === null ? '' : String(item.value)}\n aria-label={placeholder}\n onChange={(event) => {\n const match = options.find((o) => String(getOptionValue(column, o)) === event.target.value);\n onChange(\n event.target.value === ''\n ? undefined\n : match !== undefined\n ? getOptionValue(column, match)\n : event.target.value\n );\n }}\n >\n <option value=\"\" />\n {options.map((option) => {\n const value = getOptionValue(column, option);\n return (\n <option key={String(value)} value={String(value)}>\n {getOptionLabel(column, option)}\n </option>\n );\n })}\n </Select>\n );\n }\n case 'multiselect':\n return <MultiValueInput {...props} />;\n case 'number':\n return <TextValueInput {...props} type=\"number\" />;\n case 'date':\n return <TextValueInput {...props} type=\"date\" />;\n case 'datetime-local':\n return <TextValueInput {...props} type=\"datetime-local\" />;\n default:\n return <TextValueInput {...props} type=\"text\" />;\n }\n}\n\nconst createFilterItem = (column: MGHGridColDef | undefined): MGHGridFilterItem => ({\n id: uniqueId('filter'),\n field: column?.field ?? '',\n operator: column ? (getColumnFilterOperators(column)[0]?.value ?? 'contains') : 'contains',\n value: undefined,\n});\n\nexport function MGHGridFilterPanel() {\n const { api, state, localeText, columns, rootProps } = useMGHGridContext();\n const filterableColumns = React.useMemo(() => columns.filter((col) => col.filterable !== false), [columns]);\n const byField = React.useMemo(() => {\n const map = new Map<string, MGHGridColDef>();\n filterableColumns.forEach((col) => map.set(col.field, col));\n return map;\n }, [filterableColumns]);\n\n const items = state.filterModel.items;\n const logicOperator = state.filterModel.logicOperator ?? 'and';\n const targetField = state.preferencePanel.targetField;\n\n // Ensure at least one (possibly empty) item is displayed when the panel opens, like MUI does.\n const seeded = React.useRef(false);\n React.useEffect(() => {\n if (seeded.current) return;\n seeded.current = true;\n if (targetField && byField.has(targetField)) {\n const existing = items.find((item) => item.field === targetField);\n if (!existing) api.upsertFilterItem(createFilterItem(byField.get(targetField)));\n } else if (items.length === 0 && filterableColumns.length > 0) {\n api.upsertFilterItem(createFilterItem(filterableColumns[0]));\n }\n }, [api, byField, filterableColumns, items, targetField]);\n\n const updateItem = (item: MGHGridFilterItem, patch: Partial<MGHGridFilterItem>) => {\n api.upsertFilterItem({ ...item, ...patch });\n };\n\n const addItem = () => {\n api.upsertFilterItem(createFilterItem(filterableColumns[0]));\n };\n\n const canAddMore = !rootProps.disableMultipleColumnsFiltering || items.length === 0;\n\n return (\n <div className=\"mgh-grid-panel\" role=\"group\" aria-label={localeText.toolbarFilters}>\n <div className=\"mgh-grid-panel-content\" style={{ paddingTop: 12 }}>\n {items.length === 0 && <div className=\"mgh-grid-filter-empty\">No filters</div>}\n {items.map((item, index) => {\n const column = byField.get(item.field) ?? filterableColumns[0];\n const operators = column ? getColumnFilterOperators(column) : [];\n const operator = operators.find((op) => op.value === item.operator) ?? operators[0];\n const showLogic = items.length > 1;\n return (\n <div\n key={String(item.id ?? index)}\n className={\n showLogic ? 'mgh-grid-filter-row mgh-grid-filter-row--with-logic' : 'mgh-grid-filter-row'\n }\n >\n <IconButton\n size=\"small\"\n label={localeText.filterPanelDeleteIcon}\n onClick={() => api.deleteFilterItem(item)}\n >\n <DeleteIcon />\n </IconButton>\n {showLogic && (\n <Field label={index === 1 ? localeText.filterPanelLogicOperator : ' '}>\n {index === 0 ? (\n <div style={{ height: 32 }} />\n ) : (\n <Select\n size=\"small\"\n value={logicOperator}\n disabled={index > 1}\n aria-label={localeText.filterPanelLogicOperator}\n onChange={(event) =>\n api.setFilterLogicOperator(event.target.value as 'and' | 'or')\n }\n >\n <option value=\"and\">{localeText.filterPanelOperatorAnd}</option>\n <option value=\"or\">{localeText.filterPanelOperatorOr}</option>\n </Select>\n )}\n </Field>\n )}\n <Field label={localeText.filterPanelColumns}>\n <Select\n size=\"small\"\n value={column?.field ?? ''}\n aria-label={localeText.filterPanelColumns}\n onChange={(event) => {\n const nextColumn = byField.get(event.target.value);\n const nextOperators = nextColumn ? getColumnFilterOperators(nextColumn) : [];\n const keepOperator = nextOperators.some((op) => op.value === item.operator);\n updateItem(item, {\n field: event.target.value,\n operator: keepOperator ? item.operator : (nextOperators[0]?.value ?? 'contains'),\n value: undefined,\n });\n }}\n >\n {filterableColumns.map((col) => (\n <option key={col.field} value={col.field}>\n {col.headerName ?? col.field}\n </option>\n ))}\n </Select>\n </Field>\n <Field label={localeText.filterPanelOperator}>\n <Select\n size=\"small\"\n value={operator?.value ?? ''}\n aria-label={localeText.filterPanelOperator}\n onChange={(event) => {\n const nextOperator = operators.find((op) => op.value === event.target.value);\n const nextIsMulti = nextOperator?.inputType === 'multiselect';\n const currentIsMulti = operator?.inputType === 'multiselect';\n updateItem(item, {\n operator: event.target.value,\n value: nextIsMulti !== currentIsMulti ? undefined : item.value,\n });\n }}\n >\n {operators.map((op) => (\n <option key={op.value} value={op.value}>\n {op.label ?? op.value}\n </option>\n ))}\n </Select>\n </Field>\n <Field label={localeText.filterPanelValue}>\n {column ? (\n <FilterValueInput\n item={item}\n column={column}\n operator={operator}\n placeholder={localeText.filterPanelInputPlaceholder}\n onChange={(value) => updateItem(item, { value })}\n />\n ) : (\n <div />\n )}\n </Field>\n </div>\n );\n })}\n </div>\n <div className=\"mgh-grid-panel-footer\">\n <Button\n variant=\"primary\"\n size=\"small\"\n startIcon={<AddIcon size={18} />}\n onClick={addItem}\n disabled={!canAddMore}\n >\n {localeText.filterPanelAddFilter}\n </Button>\n <Button\n size=\"small\"\n startIcon={<DeleteIcon size={18} />}\n disabled={items.length === 0}\n onClick={() => api.setFilterModel({ ...state.filterModel, items: [] })}\n >\n {localeText.filterPanelRemoveAll}\n </Button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport { MGHGridColDef, MGHGridThemeMode } from '../MGHGrid.types';\nimport {\n ArrowDownwardIcon,\n ArrowUpwardIcon,\n FilterListIcon,\n FunctionsIcon,\n PushPinIcon,\n ViewColumnIcon,\n VisibilityOffIcon,\n WorkspacesIcon,\n} from '../icons';\nimport { GROUPING_COLUMN_FIELD } from '../utils';\nimport { Menu, MenuDivider, MenuItem, MenuSection, Popover, Select } from './primitives';\n\nexport interface MGHGridColumnMenuProps {\n column: MGHGridColDef;\n anchorEl: HTMLElement | null;\n open: boolean;\n onClose: () => void;\n themeMode: MGHGridThemeMode;\n /** Anchor for panels opened from the menu (usually the toolbar button or the header cell). */\n panelAnchorEl?: HTMLElement | null;\n}\n\nexport function MGHGridColumnMenu({ column, anchorEl, open, onClose, themeMode, panelAnchorEl }: MGHGridColumnMenuProps) {\n const { api, state, localeText, rootProps } = useMGHGridContext();\n const field = column.field;\n const isGroupingColumn = field === GROUPING_COLUMN_FIELD;\n const sortItem = state.sortModel.find((item) => item.field === field);\n const pinned = api.isColumnPinned(field);\n const isGrouped = state.rowGroupingModel.indexOf(field) !== -1;\n const aggregation = state.aggregationModel[field];\n\n const canSort = column.sortable !== false && !rootProps.disableColumnSorting;\n const canFilter = column.filterable !== false && !rootProps.disableColumnFilter && !isGroupingColumn;\n const canHide = column.hideable !== false;\n const canPin = column.pinnable !== false && !rootProps.disableColumnPinning;\n const canGroup = column.groupable !== false && !rootProps.disableRowGrouping && !isGroupingColumn;\n const aggregationFunctions = Object.keys(rootProps.aggregationFunctions).filter((name) => {\n const fn = rootProps.aggregationFunctions[name];\n if (column.availableAggregationFunctions && column.availableAggregationFunctions.indexOf(name) === -1) return false;\n if (fn.columnTypes && column.type && fn.columnTypes.indexOf(column.type) === -1) return false;\n return true;\n });\n const canAggregate =\n column.aggregable !== false && !rootProps.disableAggregation && !isGroupingColumn && aggregationFunctions.length > 0;\n\n const anchorForPanel = panelAnchorEl ?? anchorEl;\n const name = column.headerName ?? column.field;\n\n return (\n <Popover open={open} anchorEl={anchorEl} onClose={onClose} themeMode={themeMode} placement=\"bottom-end\" role=\"menu\">\n <Menu aria-label={localeText.columnMenuLabel}>\n {canSort && (\n <>\n <MenuItem\n icon={<ArrowUpwardIcon />}\n selected={sortItem?.sort === 'asc'}\n onClick={() => api.sortColumn(field, 'asc')}\n hideMenu={onClose}\n >\n {localeText.columnMenuSortAsc}\n </MenuItem>\n <MenuItem\n icon={<ArrowDownwardIcon />}\n selected={sortItem?.sort === 'desc'}\n onClick={() => api.sortColumn(field, 'desc')}\n hideMenu={onClose}\n >\n {localeText.columnMenuSortDesc}\n </MenuItem>\n {sortItem && (\n <MenuItem\n icon={<span style={{ width: 20 }} />}\n onClick={() => api.sortColumn(field, null)}\n hideMenu={onClose}\n >\n {localeText.columnMenuUnsort}\n </MenuItem>\n )}\n </>\n )}\n {canFilter && (\n <>\n {canSort && <MenuDivider />}\n <MenuItem\n icon={<FilterListIcon />}\n onClick={() => api.showFilterPanel(field, anchorForPanel)}\n hideMenu={onClose}\n >\n {localeText.columnMenuFilter}\n </MenuItem>\n </>\n )}\n {(canHide || !rootProps.disableColumnSelector) && (\n <>\n {(canSort || canFilter) && <MenuDivider />}\n {canHide && (\n <MenuItem\n icon={<VisibilityOffIcon />}\n onClick={() => api.setColumnVisibility(field, false)}\n hideMenu={onClose}\n >\n {localeText.columnMenuHideColumn}\n </MenuItem>\n )}\n {!rootProps.disableColumnSelector && (\n <MenuItem\n icon={<ViewColumnIcon />}\n onClick={() => api.showPreferences('columns', anchorForPanel)}\n hideMenu={onClose}\n >\n {localeText.columnMenuManageColumns}\n </MenuItem>\n )}\n </>\n )}\n {canPin && (\n <>\n <MenuDivider />\n {pinned !== 'left' && (\n <MenuItem\n icon={<PushPinIcon style={{ transform: 'rotate(30deg)' }} />}\n onClick={() => api.pinColumn(field, 'left')}\n hideMenu={onClose}\n >\n {localeText.columnMenuPinLeft}\n </MenuItem>\n )}\n {pinned !== 'right' && (\n <MenuItem\n icon={<PushPinIcon style={{ transform: 'rotate(-30deg)' }} />}\n onClick={() => api.pinColumn(field, 'right')}\n hideMenu={onClose}\n >\n {localeText.columnMenuPinRight}\n </MenuItem>\n )}\n {pinned && (\n <MenuItem\n icon={<span style={{ width: 20 }} />}\n onClick={() => api.unpinColumn(field)}\n hideMenu={onClose}\n >\n {localeText.columnMenuUnpin}\n </MenuItem>\n )}\n </>\n )}\n {canGroup && (\n <>\n <MenuDivider />\n <MenuItem\n icon={<WorkspacesIcon />}\n onClick={() =>\n isGrouped ? api.removeRowGroupingCriteria(field) : api.addRowGroupingCriteria(field)\n }\n hideMenu={onClose}\n >\n {isGrouped ? localeText.columnMenuUngroup(name) : localeText.columnMenuGroup(name)}\n </MenuItem>\n </>\n )}\n {canAggregate && (\n <>\n <MenuDivider />\n <MenuSection>\n <label\n className=\"mgh-grid-field-label\"\n style={{ display: 'flex', alignItems: 'center', gap: 6 }}\n >\n <FunctionsIcon size={16} /> {localeText.columnMenuAggregation}\n </label>\n <Select\n size=\"small\"\n value={aggregation ?? ''}\n aria-label={localeText.columnMenuAggregation}\n onChange={(event) => {\n const next = { ...state.aggregationModel };\n if (event.target.value === '') delete next[field];\n else next[field] = event.target.value;\n api.setAggregationModel(next);\n }}\n >\n <option value=\"\">{localeText.aggregationFunctionLabelNone}</option>\n {aggregationFunctions.map((fnName) => (\n <option key={fnName} value={fnName}>\n {rootProps.aggregationFunctions[fnName].label ?? fnName}\n </option>\n ))}\n </Select>\n </MenuSection>\n </>\n )}\n </Menu>\n </Popover>\n );\n}\n","import React from 'react';\nimport { MGHGridLoadingOverlayProps, MGHGridNoRowsOverlayProps } from '../MGHGrid.types';\nimport { EmptyBoxIcon } from '../icons';\nimport { Spinner } from './primitives';\n\n/** Default \"no rows\" overlay. Mirrors the legacy CustomNoRowsOverlay but has no MUI dependency. */\nexport function MGHGridNoRowsOverlay({ text = 'No rows', imageSrc }: MGHGridNoRowsOverlayProps) {\n return (\n <div className=\"mgh-grid-no-rows\" role=\"status\">\n {imageSrc ? <img alt=\"\" src={imageSrc} /> : <EmptyBoxIcon size={50} />}\n <div>{text}</div>\n </div>\n );\n}\n\nexport function MGHGridLoadingOverlay({ text }: MGHGridLoadingOverlayProps) {\n return (\n <>\n <Spinner />\n {text && <div>{text}</div>}\n </>\n );\n}\n","import React from 'react';\nimport { MGHGridThemeMode } from '../MGHGrid.types';\nimport { MoreVertIcon } from '../icons';\nimport { IconButton, Menu, MenuItem, Popover } from './primitives';\n\nexport interface MGHGridActionsCellItemProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n icon?: React.ReactElement;\n label: string;\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Render the action inside the \"more\" menu instead of inline. */\n showInMenu?: boolean;\n disabled?: boolean;\n}\n\n/** Drop-in replacement for MUI's GridActionsCellItem. Use it from `colDef.getActions`. */\nexport function MGHGridActionsCellItem({\n icon,\n label,\n onClick,\n showInMenu,\n disabled,\n className,\n ...rest\n}: MGHGridActionsCellItemProps) {\n return (\n <IconButton\n size=\"small\"\n label={label}\n disabled={disabled}\n className={className}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n }}\n {...rest}\n >\n {icon}\n </IconButton>\n );\n}\nMGHGridActionsCellItem.displayName = 'MGHGridActionsCellItem';\n\ninterface ActionsCellProps {\n actions: React.ReactElement[];\n themeMode: MGHGridThemeMode;\n moreLabel: string;\n}\n\nexport function ActionsCell({ actions, themeMode, moreLabel }: ActionsCellProps) {\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null);\n const inline: React.ReactElement[] = [];\n const inMenu: React.ReactElement[] = [];\n actions.forEach((action) => {\n if (!React.isValidElement(action)) return;\n if ((action.props as MGHGridActionsCellItemProps)?.showInMenu) inMenu.push(action);\n else inline.push(action);\n });\n\n return (\n <>\n {inline.map((action, index) => (\n <React.Fragment key={action.key ?? index}>{action}</React.Fragment>\n ))}\n {inMenu.length > 0 && (\n <>\n <IconButton\n size=\"small\"\n label={moreLabel}\n active={Boolean(anchor)}\n onClick={(event) => {\n event.stopPropagation();\n setAnchor((prev) => (prev ? null : event.currentTarget));\n }}\n >\n <MoreVertIcon />\n </IconButton>\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n themeMode={themeMode}\n placement=\"bottom-end\"\n role=\"menu\"\n >\n <Menu>\n {inMenu.map((action, index) => {\n const props = action.props as MGHGridActionsCellItemProps;\n return (\n <MenuItem\n key={action.key ?? index}\n icon={props.icon}\n disabled={props.disabled}\n onClick={(event) => {\n props.onClick?.(event);\n setAnchor(null);\n }}\n >\n {props.label}\n </MenuItem>\n );\n })}\n </Menu>\n </Popover>\n </>\n )}\n </>\n );\n}\n","import React from 'react';\nimport {\n MGHGridAggregationModel,\n MGHGridApi,\n MGHGridApplyFilterFn,\n MGHGridCallbackDetails,\n MGHGridCellParams,\n MGHGridColDef,\n MGHGridColumnVisibilityModel,\n MGHGridDensity,\n MGHGridFilterItem,\n MGHGridFilterModel,\n MGHGridGroupNode,\n MGHGridLeafNode,\n MGHGridLocaleText,\n MGHGridPaginationModel,\n MGHGridPinnedColumns,\n MGHGridPinnedSide,\n MGHGridPreferencePanelState,\n MGHGridProps,\n MGHGridRowGroupingModel,\n MGHGridRowId,\n MGHGridRowNode,\n MGHGridRowParams,\n MGHGridRowSelectionModel,\n MGHGridSortDirection,\n MGHGridSortModel,\n MGHGridState,\n MGHGridSxProps,\n MGHGridValidRowModel,\n} from './MGHGrid.types';\nimport {\n AGGREGATION_FOOTER_ID,\n BUILT_IN_AGGREGATION_FUNCTIONS,\n CHECKBOX_COLUMN_DEF,\n CHECKBOX_FIELD,\n DEFAULT_COLUMN_MIN_WIDTH,\n DEFAULT_HEADER_HEIGHT,\n DEFAULT_LOCALE_TEXT,\n DEFAULT_ROW_HEIGHT,\n DENSITY_FACTORS,\n DETAIL_PANEL_TOGGLE_COLUMN_DEF,\n DETAIL_PANEL_TOGGLE_FIELD,\n GROUPING_COLUMN_FIELD,\n GROUPING_COLUMN_WIDTH,\n clamp,\n cx,\n defaultFormatValue,\n formattedValueToString,\n getCellValue,\n getColumnFilterOperators,\n getDefaultComparator,\n getFormattedValue,\n getOptionLabel,\n getOptionValue,\n getRowIdFromRow,\n buildScopedCss,\n isInternalField,\n isNil,\n isSelectorKey,\n measureText,\n moveItem,\n normalizeColumn,\n normalizeSelectionModel,\n parseEditValue,\n readLocalStorage,\n resolveValueOptions,\n selectionModelsEqual,\n toDate,\n writeLocalStorage,\n} from './utils';\nimport { useMGHGridStyles } from './MGHGrid.styles';\nimport { MGHGridContext, MGHGridContextValue, MGHGridRootProps } from './context';\nimport { useControlledState, useElementSize, useForceUpdate, useLatestRef, useStableId } from './hooks';\nimport { exportDataAsCsv, exportDataAsExcel, exportDataAsPrint, getDataAsCsv } from './export';\nimport {\n DisplayRow,\n GroupTreeNode,\n RowEntry,\n aggregateRows,\n buildGroupTree,\n collectTreeLeaves,\n flattenGroupTree,\n sortGroupTree,\n} from './grouping';\nimport {\n ArrowDownwardIcon,\n ArrowUpwardIcon,\n CheckIcon,\n ChevronRightIcon,\n CloseIcon,\n ExpandMoreIcon,\n MoreVertIcon,\n} from './icons';\nimport { Checkbox, IconButton, Popover, Select, TextInput } from './components/primitives';\nimport { MGHGridToolbar } from './components/Toolbar';\nimport { MGHGridFooter } from './components/Footer';\nimport { MGHGridColumnsPanel } from './components/ColumnsPanel';\nimport { MGHGridFilterPanel } from './components/FilterPanel';\nimport { MGHGridColumnMenu } from './components/ColumnMenu';\nimport { MGHGridLoadingOverlay, MGHGridNoRowsOverlay } from './components/Overlays';\nimport { ActionsCell } from './components/ActionsCell';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants & helpers\n * ----------------------------------------------------------------------------------------------- */\n\nconst EMPTY_ARRAY: any[] = [];\nconst EMPTY_OBJECT: Record<string, any> = {};\nconst EMPTY_MAP = new Map<any, any>();\nconst DEFAULT_SORTING_ORDER: MGHGridSortDirection[] = ['asc', 'desc', null];\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\nconst DEFAULT_FILTER_MODEL: MGHGridFilterModel = { items: [], quickFilterExcludeHiddenColumns: false };\nconst OVERSCAN_ROWS = 6;\nconst DEFAULT_DETAIL_PANEL_HEIGHT = 500;\n\ninterface ColumnLayout {\n col: MGHGridColDef;\n width: number;\n pinned: MGHGridPinnedSide | null;\n /** Sticky offset (left or right) for pinned columns. */\n offset: number;\n /** X position from the start of the row. */\n x: number;\n isLastLeft: boolean;\n isFirstRight: boolean;\n}\n\ntype RenderRowKind = 'leaf' | 'group' | 'pinnedRow' | 'footer';\n\ninterface RenderRow<R extends MGHGridValidRowModel = any> {\n id: MGHGridRowId;\n kind: RenderRowKind;\n row: R | null;\n node: MGHGridRowNode;\n depth: number;\n group?: GroupTreeNode<R>;\n aggregates?: Record<string, { value: any; fn: string }>;\n}\n\ninterface CellCoords {\n id: MGHGridRowId;\n field: string;\n}\n\n/** Keeps only the inline-applicable part of an sx-like object (nested selectors are compiled to CSS). */\nconst sanitizeStyle = (style: MGHGridSxProps | undefined): React.CSSProperties | undefined => {\n if (!style) return undefined;\n const out: Record<string, any> = {};\n Object.keys(style).forEach((key) => {\n if (isSelectorKey(key)) return;\n const value = (style as any)[key];\n if (typeof value !== 'string' && typeof value !== 'number') return;\n out[key] = value;\n });\n return out;\n};\n\nconst computeWidths = (cols: MGHGridColDef[], available: number, overrides: Record<string, number>) => {\n const result: Array<number | null> = cols.map((col) => {\n const min = col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH;\n const max = col.maxWidth ?? Infinity;\n const override = overrides[col.field];\n if (override) return clamp(override, min, max);\n if (col.flex && col.flex > 0) return null;\n return clamp(col.width ?? 100, min, max);\n });\n const pool: number[] = [];\n let fixedTotal = 0;\n result.forEach((w, i) => {\n if (w === null) pool.push(i);\n else fixedTotal += w;\n });\n if (pool.length > 0) {\n let remainingSpace = Math.max(0, available - fixedTotal);\n let remainingFlex = pool.reduce((acc, i) => acc + (cols[i].flex as number), 0);\n let active = pool.slice();\n let changed = true;\n while (changed && active.length > 0) {\n changed = false;\n for (let k = 0; k < active.length; k += 1) {\n const i = active[k];\n const col = cols[i];\n const min = col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH;\n const max = col.maxWidth ?? Infinity;\n const share = remainingFlex > 0 ? (remainingSpace * (col.flex as number)) / remainingFlex : 0;\n if (share < min || share > max) {\n const fixed = share < min ? min : max;\n result[i] = fixed;\n remainingSpace = Math.max(0, remainingSpace - fixed);\n remainingFlex -= col.flex as number;\n active = active.filter((idx) => idx !== i);\n changed = true;\n break;\n }\n }\n }\n active.forEach((i) => {\n const col = cols[i];\n result[i] =\n remainingFlex > 0\n ? Math.floor((remainingSpace * (col.flex as number)) / remainingFlex)\n : (col.minWidth ?? 50);\n });\n }\n return result as number[];\n};\n\nconst toDateInputValue = (value: any, withTime: boolean) => {\n const date = toDate(value);\n if (!date) return '';\n const pad = (n: number) => String(n).padStart(2, '0');\n const base = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n return withTime ? `${base}T${pad(date.getHours())}:${pad(date.getMinutes())}` : base;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Component\n * ----------------------------------------------------------------------------------------------- */\n\nexport default function MGHGrid<R extends MGHGridValidRowModel = any>(props: MGHGridProps<R>) {\n const {\n rows,\n columns: columnsProp,\n getRowId,\n loading = false,\n header,\n renderHeaderEndContent,\n renderHeaderCenterContent,\n disableCard = false,\n className,\n cardClassName,\n boxClassName,\n cardStyle,\n cardSx,\n boxStyle,\n boxSx,\n style,\n sx,\n themeMode = 'light',\n themeVars,\n showToolbar = true,\n toolbarProps,\n slots = EMPTY_OBJECT,\n slotProps = EMPTY_OBJECT,\n noRowsText = 'No data found within selected parameters.',\n localeText: localeTextProp,\n rowHeight: rowHeightProp = DEFAULT_ROW_HEIGHT,\n columnHeaderHeight = DEFAULT_HEADER_HEIGHT,\n getRowHeight,\n autoHeight = false,\n disableVirtualization = false,\n density: densityProp,\n onDensityChange,\n disableDensitySelector = false,\n pagination = true,\n pageSize = 25,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n paginationModel: paginationModelProp,\n onPaginationModelChange,\n hideFooter = false,\n hideFooterPagination = false,\n hideFooterRowCount = false,\n hideFooterSelectedRowCount = false,\n sortModel: sortModelProp,\n onSortModelChange,\n sortingOrder = DEFAULT_SORTING_ORDER,\n disableMultipleColumnsSorting = false,\n disableColumnSorting = false,\n filterModel: filterModelProp,\n onFilterModelChange,\n disableColumnFilter = false,\n disableMultipleColumnsFiltering = false,\n quickFilterDebounceMs = 150,\n columnVisibilityModel: columnVisibilityModelProp,\n onColumnVisibilityModelChange,\n columnVisibilityStorageKey,\n columnOrderStorageKey,\n columnWidthStorageKey,\n pinnedColumnsStorageKey,\n onColumnOrderChange,\n onColumnWidthChange,\n disableColumnMenu = false,\n disableColumnSelector = false,\n disableColumnResize = false,\n disableColumnReorder = false,\n disableColumnPinning = false,\n pinnedColumns: pinnedColumnsProp,\n onPinnedColumnsChange,\n checkboxSelection = false,\n checkboxSelectionVisibleOnly = false,\n disableRowSelectionOnClick = true,\n disableMultipleRowSelection = false,\n rowSelectionModel: rowSelectionModelProp,\n onRowSelectionModelChange,\n isRowSelectable,\n keepNonExistentRowsSelected = true,\n getRowClassName,\n onRowClick,\n onRowDoubleClick,\n onCellClick,\n onCellDoubleClick,\n pinnedRows,\n getDetailPanelContent,\n getDetailPanelHeight,\n detailPanelExpandedRowIds: detailPanelExpandedRowIdsProp,\n onDetailPanelExpandedRowIdsChange,\n rowGroupingModel: rowGroupingModelProp,\n onRowGroupingModelChange,\n defaultGroupingExpansionDepth = 0,\n groupingColDef,\n disableRowGrouping = false,\n isGroupExpandedByDefault,\n aggregationModel: aggregationModelProp,\n onAggregationModelChange,\n aggregationFunctions: aggregationFunctionsProp,\n disableAggregation = false,\n aggregationPosition = 'both',\n processRowUpdate,\n onProcessRowUpdateError,\n onCellEditStop,\n isCellEditable,\n initialState,\n apiRef,\n onStateChange,\n } = props;\n\n useMGHGridStyles();\n\n const gridId = useStableId('mgh-grid');\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const scrollerRef = React.useRef<HTMLDivElement | null>(null);\n const toolbarRef = React.useRef<HTMLDivElement | null>(null);\n const forceUpdate = useForceUpdate();\n\n const localeText = React.useMemo<MGHGridLocaleText>(\n () => ({ ...DEFAULT_LOCALE_TEXT, ...localeTextProp }),\n [localeTextProp]\n );\n\n /* ------------------------------------------------------------------ latest ref + api shell */\n\n const latest = React.useRef<any>({});\n const getDetails = React.useCallback((): MGHGridCallbackDetails => ({ api: latest.current.api }), []);\n\n const apiObject = React.useMemo<MGHGridApi<R>>(() => {\n const L = () => latest.current;\n const apiImpl: MGHGridApi<R> = {\n getRow: (id) => L().rowsById.get(id) ?? null,\n getRowModels: () => new Map(L().rowsById),\n getAllRowIds: () => L().rowEntries.map((e: RowEntry<R>) => e.id),\n getRowNode: (id) => L().nodesById.get(id) ?? null,\n getSortedRows: () => L().sortedLeaves.map((e: RowEntry<R>) => e.row),\n getSortedRowIds: () => L().sortedLeaves.map((e: RowEntry<R>) => e.id),\n getVisibleRows: () =>\n L()\n .pagedRows.filter((dr: DisplayRow<R>) => dr.type === 'leaf' && dr.row)\n .map((dr: DisplayRow<R>) => ({ id: dr.id, model: dr.row as R })),\n getRowIndexRelativeToVisibleRows: (id) => L().pagedRows.findIndex((dr: DisplayRow<R>) => dr.id === id),\n updateRows: (updates) => {\n updates.forEach((update) => {\n const id = getRowIdFromRow(update as R, L().getRowId);\n const existing = L().rowsById.get(id);\n if (existing) L().setRowOverride(id, { ...existing, ...update });\n });\n },\n\n getAllColumns: () => L().orderedUserColumns,\n getVisibleColumns: () => L().visibleUserColumns,\n getColumn: (field) => L().getColumn(field),\n getColumnIndex: (field, useVisibleColumns = true) =>\n (useVisibleColumns ? L().visibleUserColumns : L().orderedUserColumns).findIndex(\n (c: MGHGridColDef) => c.field === field\n ),\n getColumnVisibilityModel: () => L().columnVisibilityModel,\n setColumnVisibility: (field, isVisible) =>\n L().setColumnVisibilityModel({ ...L().columnVisibilityModel, [field]: isVisible }),\n setColumnVisibilityModel: (model) => L().setColumnVisibilityModel(model),\n setColumnWidth: (field, width) => L().setColumnWidth(field, width),\n setColumnIndex: (field, targetIndex) => L().setColumnIndex(field, targetIndex),\n autosizeColumns: (options) => L().autosizeColumns(options),\n pinColumn: (field, side) => L().pinColumn(field, side),\n unpinColumn: (field) => L().unpinColumn(field),\n isColumnPinned: (field) => L().isColumnPinned(field),\n getPinnedColumns: () => L().pinnedColumns,\n setPinnedColumns: (model) => L().setPinnedColumns(model),\n\n getSortModel: () => L().sortModel,\n setSortModel: (model) => L().setSortModel(model),\n sortColumn: (field, direction, allowMultipleSorting) => L().sortColumn(field, direction, allowMultipleSorting),\n\n getFilterModel: () => L().filterModel,\n setFilterModel: (model) => L().setFilterModel(model),\n upsertFilterItem: (item) => L().upsertFilterItems([item]),\n upsertFilterItems: (items) => L().upsertFilterItems(items),\n deleteFilterItem: (item) => L().deleteFilterItem(item),\n setFilterLogicOperator: (operator) => L().setFilterModel({ ...L().filterModel, logicOperator: operator }),\n setQuickFilterValues: (values) => L().setFilterModel({ ...L().filterModel, quickFilterValues: values }),\n showFilterPanel: (targetColumnField, anchorEl) => L().showPreferences('filters', anchorEl, targetColumnField),\n hideFilterPanel: () => L().hidePreferences(),\n showPreferences: (panel, anchorEl, targetField) => L().showPreferences(panel, anchorEl, targetField),\n hidePreferences: () => L().hidePreferences(),\n\n getSelectedRows: () => {\n const map = new Map<MGHGridRowId, R>();\n L().selectedIds.forEach((id: MGHGridRowId) => {\n const row = L().rowsById.get(id);\n if (row) map.set(id, row);\n });\n return map;\n },\n getRowSelectionModel: () => ({ type: 'include', ids: L().selectedIds }),\n setRowSelectionModel: (model) => {\n const normalized = normalizeSelectionModel(\n model,\n L().rowEntries.map((e: RowEntry<R>) => e.id)\n );\n L().setSelectedIds(normalized.ids);\n },\n selectRow: (id, isSelected = true, resetSelection = false) => L().selectRows([id], isSelected, resetSelection),\n selectRows: (ids, isSelected = true, resetSelection = false) => L().selectRows(ids, isSelected, resetSelection),\n isRowSelected: (id) => L().selectedIds.has(id),\n isRowSelectable: (id) => L().isRowSelectableFn(id, L().rowsById.get(id)),\n\n setPage: (nextPage) => L().setPaginationModel({ ...L().paginationModel, page: Math.max(0, nextPage) }),\n setPageSize: (nextPageSize) => L().setPaginationModel({ page: 0, pageSize: Math.max(1, nextPageSize) }),\n setPaginationModel: (model) => L().setPaginationModel(model),\n\n setDensity: (value) => L().setDensity(value),\n\n getDataAsCsv: (options) => getDataAsCsv(apiImpl, options),\n exportDataAsCsv: (options) => exportDataAsCsv(apiImpl, options),\n exportDataAsExcel: (options) => exportDataAsExcel(apiImpl, options),\n exportDataAsPrint: (options) => exportDataAsPrint(apiImpl, options),\n\n toggleDetailPanel: (id) => L().toggleDetailPanel(id),\n setExpandedDetailPanels: (ids) => L().setExpandedDetailPanels(new Set(ids)),\n getExpandedDetailPanels: () => Array.from(L().expandedDetailPanels as Set<MGHGridRowId>),\n\n getRowGroupingModel: () => L().rowGroupingModel,\n setRowGroupingModel: (model) => L().setRowGroupingModel(model),\n addRowGroupingCriteria: (field, groupingIndex) => {\n const current: string[] = L().rowGroupingModel.filter((f: string) => f !== field);\n if (groupingIndex === undefined) current.push(field);\n else current.splice(clamp(groupingIndex, 0, current.length), 0, field);\n L().setRowGroupingModel(current);\n },\n removeRowGroupingCriteria: (field) =>\n L().setRowGroupingModel(L().rowGroupingModel.filter((f: string) => f !== field)),\n setRowChildrenExpansion: (id, isExpanded) => L().setRowChildrenExpansion(id, isExpanded),\n getRowGroupChildren: ({ groupId }) => {\n const group = L().groupsById.get(groupId) as GroupTreeNode<R> | undefined;\n return group ? group.descendants.map((d) => d.id) : [];\n },\n\n getAggregationModel: () => L().aggregationModel,\n setAggregationModel: (model) => L().setAggregationModel(model),\n\n startCellEditMode: ({ id, field }) => L().startCellEditMode(id, field),\n stopCellEditMode: ({ id, field, ignoreModifications }) =>\n L().stopCellEditMode(id, field, ignoreModifications, 'api'),\n getCellMode: (id, field) => {\n const editing = L().editingCell as CellCoords | null;\n return editing && editing.id === id && editing.field === field ? 'edit' : 'view';\n },\n setEditCellValue: ({ id, field, value }) => {\n const editing = L().editingCell as CellCoords | null;\n if (editing && editing.id === id && editing.field === field) L().setEditValue(value);\n },\n\n getCellValue: (id, field) => {\n const row = L().rowsById.get(id);\n const col = L().getColumn(field);\n return row && col ? getCellValue(row, col, apiImpl) : undefined;\n },\n getCellParams: (id, field) => {\n const row = L().rowsById.get(id);\n return L().buildCellParams(\n id,\n field,\n row,\n L().nodesById.get(id) ?? { type: 'leaf', id, depth: 0, parent: null }\n );\n },\n setCellFocus: (id, field) => {\n pendingFocusRef.current = true;\n L().setFocusedCell({ id, field });\n },\n\n scrollToIndexes: (params) => L().scrollToIndexes(params),\n scroll: ({ left, top }) => {\n const scroller = scrollerRef.current;\n if (!scroller) return;\n if (left !== undefined) scroller.scrollLeft = left;\n if (top !== undefined) scroller.scrollTop = top;\n },\n getScrollPosition: () => ({\n left: scrollerRef.current?.scrollLeft ?? 0,\n top: scrollerRef.current?.scrollTop ?? 0,\n }),\n\n get state() {\n return L().state as MGHGridState;\n },\n forceUpdate: () => L().forceUpdate(),\n rootElementRef: rootRef,\n };\n return apiImpl;\n }, []);\n if (!latest.current.api) latest.current.api = apiObject;\n\n /* ------------------------------------------------------------------ persisted state */\n\n const persisted = React.useMemo(\n () => ({\n visibility: columnVisibilityStorageKey\n ? readLocalStorage<MGHGridColumnVisibilityModel>(columnVisibilityStorageKey)\n : null,\n order: columnOrderStorageKey ? readLocalStorage<string[]>(columnOrderStorageKey) : null,\n widths: columnWidthStorageKey ? readLocalStorage<Record<string, number>>(columnWidthStorageKey) : null,\n pinned: pinnedColumnsStorageKey ? readLocalStorage<MGHGridPinnedColumns>(pinnedColumnsStorageKey) : null,\n }),\n [columnVisibilityStorageKey, columnOrderStorageKey, columnWidthStorageKey, pinnedColumnsStorageKey]\n );\n\n /* ------------------------------------------------------------------ models */\n\n const [sortModel, setSortModel] = useControlledState<MGHGridSortModel>(\n sortModelProp,\n initialState?.sorting?.sortModel ?? EMPTY_ARRAY,\n (model) => onSortModelChange?.(model, getDetails())\n );\n\n const [filterModel, setFilterModel] = useControlledState<MGHGridFilterModel>(\n filterModelProp,\n initialState?.filter?.filterModel ?? DEFAULT_FILTER_MODEL,\n (model) => onFilterModelChange?.(model, getDetails())\n );\n\n const [paginationModel, setPaginationModel] = useControlledState<MGHGridPaginationModel>(\n paginationModelProp,\n {\n page: initialState?.pagination?.paginationModel?.page ?? 0,\n pageSize: initialState?.pagination?.paginationModel?.pageSize ?? pageSize,\n },\n (model) => onPaginationModelChange?.(model, getDetails())\n );\n\n const [columnVisibilityModel, setColumnVisibilityModel] = useControlledState<MGHGridColumnVisibilityModel>(\n columnVisibilityModelProp,\n persisted.visibility ?? initialState?.columns?.columnVisibilityModel ?? EMPTY_OBJECT,\n (model) => {\n if (columnVisibilityStorageKey) writeLocalStorage(columnVisibilityStorageKey, model);\n onColumnVisibilityModelChange?.(model, getDetails());\n }\n );\n\n const [density, setDensity] = useControlledState<MGHGridDensity>(\n densityProp,\n initialState?.density ?? 'compact',\n (value) => onDensityChange?.(value, getDetails())\n );\n\n const [pinnedColumns, setPinnedColumns] = useControlledState<MGHGridPinnedColumns>(\n pinnedColumnsProp,\n persisted.pinned ?? initialState?.pinnedColumns ?? EMPTY_OBJECT,\n (model) => {\n if (pinnedColumnsStorageKey) writeLocalStorage(pinnedColumnsStorageKey, model);\n onPinnedColumnsChange?.(model, getDetails());\n }\n );\n\n const [rowGroupingModel, setRowGroupingModel] = useControlledState<MGHGridRowGroupingModel>(\n rowGroupingModelProp,\n initialState?.rowGrouping?.model ?? EMPTY_ARRAY,\n (model) => onRowGroupingModelChange?.(model, getDetails())\n );\n\n const [aggregationModel, setAggregationModel] = useControlledState<MGHGridAggregationModel>(\n aggregationModelProp,\n initialState?.aggregation?.model ?? EMPTY_OBJECT,\n (model) => onAggregationModelChange?.(model, getDetails())\n );\n\n const controlledExpandedDetail = React.useMemo(\n () => (detailPanelExpandedRowIdsProp ? new Set<MGHGridRowId>(detailPanelExpandedRowIdsProp) : undefined),\n [detailPanelExpandedRowIdsProp]\n );\n const [expandedDetailPanels, setExpandedDetailPanels] = useControlledState<Set<MGHGridRowId>>(\n controlledExpandedDetail,\n React.useMemo(() => new Set<MGHGridRowId>(initialState?.detailPanel?.expandedRowIds ?? []), []),\n (ids) => onDetailPanelExpandedRowIdsChange?.(Array.from(ids), getDetails())\n );\n\n const controlledSelection = React.useMemo(\n () => (rowSelectionModelProp !== undefined ? normalizeSelectionModel(rowSelectionModelProp).ids : undefined),\n [rowSelectionModelProp]\n );\n const [selectedIds, setSelectedIds] = useControlledState<Set<MGHGridRowId>>(\n controlledSelection,\n React.useMemo(() => new Set<MGHGridRowId>(), []),\n (ids) => onRowSelectionModelChange?.({ type: 'include', ids }, getDetails())\n );\n\n /* ------------------------------------------------------------------ internal state */\n\n const [orderedFields, setOrderedFields] = React.useState<string[] | null>(\n () => persisted.order ?? initialState?.columns?.orderedFields ?? null\n );\n const [columnWidths, setColumnWidths] = React.useState<Record<string, number>>(() => {\n if (persisted.widths) return persisted.widths;\n const dims = initialState?.columns?.dimensions;\n if (!dims) return {};\n const out: Record<string, number> = {};\n Object.keys(dims).forEach((field) => {\n if (dims[field].width) out[field] = dims[field].width as number;\n });\n return out;\n });\n const [groupExpansion, setGroupExpansion] = React.useState<Map<MGHGridRowId, boolean>>(() => new Map());\n const [editingCell, setEditingCell] = React.useState<CellCoords | null>(null);\n const [editValue, setEditValue] = React.useState<any>(undefined);\n const [focusedCell, setFocusedCell] = React.useState<CellCoords | null>(null);\n const pendingFocusRef = React.useRef(false);\n const [preferencePanel, setPreferencePanel] = React.useState<\n MGHGridPreferencePanelState & { anchorEl: HTMLElement | null }\n >({\n open: false,\n anchorEl: null,\n });\n const [columnMenu, setColumnMenu] = React.useState<{ field: string; anchorEl: HTMLElement } | null>(null);\n const [resizingField, setResizingField] = React.useState<string | null>(null);\n const [drag, setDrag] = React.useState<{ field: string; overField: string | null; side: 'left' | 'right' } | null>(null);\n const [scrollTop, setScrollTop] = React.useState(0);\n const scrollRaf = React.useRef(0);\n const lastClickedIdRef = React.useRef<MGHGridRowId | null>(null);\n\n // Row updates (editing / api.updateRows) are kept until the `rows` prop identity changes.\n const [overrideState, setOverrideState] = React.useState<{ rows: R[]; map: Map<MGHGridRowId, R> }>(() => ({\n rows,\n map: new Map(),\n }));\n const rowOverrides: Map<MGHGridRowId, R> = overrideState.rows === rows ? overrideState.map : EMPTY_MAP;\n const setRowOverride = React.useCallback(\n (id: MGHGridRowId, row: R) => {\n setOverrideState((prev) => {\n const map = new Map(prev.rows === rows ? prev.map : []);\n map.set(id, row);\n return { rows, map };\n });\n },\n [rows]\n );\n\n /* ------------------------------------------------------------------ sizes */\n\n const { width: viewportWidth, height: viewportHeight } = useElementSize(scrollerRef);\n const densityFactor = DENSITY_FACTORS[density] ?? 1;\n const rowHeight = Math.round(rowHeightProp * densityFactor);\n const headerHeight = Math.round(columnHeaderHeight * densityFactor);\n\n /* ------------------------------------------------------------------ rows */\n\n const rowEntries = React.useMemo<RowEntry<R>[]>(() => {\n const out: RowEntry<R>[] = [];\n rows.forEach((raw) => {\n const id = getRowIdFromRow(raw, getRowId);\n if (id === undefined || id === null) return;\n out.push({ id, row: rowOverrides.get(id) ?? raw });\n });\n return out;\n }, [rows, getRowId, rowOverrides]);\n\n const rowsById = React.useMemo(() => {\n const map = new Map<MGHGridRowId, R>();\n rowEntries.forEach((entry) => map.set(entry.id, entry.row));\n (pinnedRows?.top ?? []).forEach((row) => map.set(getRowIdFromRow(row, getRowId), row));\n (pinnedRows?.bottom ?? []).forEach((row) => map.set(getRowIdFromRow(row, getRowId), row));\n return map;\n }, [rowEntries, pinnedRows, getRowId]);\n\n /* ------------------------------------------------------------------ columns */\n\n const userColumns = React.useMemo(() => columnsProp.map((col) => normalizeColumn(col)), [columnsProp]);\n\n const columnsByField = React.useMemo(() => {\n const map = new Map<string, MGHGridColDef<R>>();\n userColumns.forEach((col) => map.set(col.field, col));\n return map;\n }, [userColumns]);\n\n const groupingFields = React.useMemo(\n () => (disableRowGrouping ? [] : rowGroupingModel.filter((field) => columnsByField.has(field))),\n [rowGroupingModel, columnsByField, disableRowGrouping]\n );\n const groupingActive = groupingFields.length > 0;\n\n const groupingColumn = React.useMemo<MGHGridColDef<R> | null>(() => {\n if (!groupingActive) return null;\n const single = groupingFields.length === 1 ? columnsByField.get(groupingFields[0]) : undefined;\n return normalizeColumn<R>({\n field: GROUPING_COLUMN_FIELD,\n headerName: single ? (single.headerName ?? single.field) : localeText.groupingColumnHeaderName,\n width: GROUPING_COLUMN_WIDTH,\n minWidth: 120,\n sortable: true,\n filterable: false,\n hideable: false,\n groupable: false,\n aggregable: false,\n editable: false,\n disableExport: true,\n disableReorder: true,\n ...(groupingColDef as any),\n });\n }, [groupingActive, groupingFields, columnsByField, localeText.groupingColumnHeaderName, groupingColDef]);\n\n const orderedUserColumns = React.useMemo(() => {\n if (!orderedFields || orderedFields.length === 0) return userColumns;\n const seen = new Set<string>();\n const out: MGHGridColDef<R>[] = [];\n orderedFields.forEach((field) => {\n const col = columnsByField.get(field);\n if (col && !seen.has(field)) {\n seen.add(field);\n out.push(col);\n }\n });\n userColumns.forEach((col) => {\n if (!seen.has(col.field)) out.push(col);\n });\n return out;\n }, [orderedFields, userColumns, columnsByField]);\n\n const isColumnVisible = React.useCallback(\n (field: string) => {\n const value = columnVisibilityModel[field];\n if (value === false) return false;\n if (value === undefined && groupingFields.indexOf(field) !== -1) return false;\n return true;\n },\n [columnVisibilityModel, groupingFields]\n );\n\n const visibleUserColumns = React.useMemo(\n () => orderedUserColumns.filter((col) => isColumnVisible(col.field)),\n [orderedUserColumns, isColumnVisible]\n );\n\n const layout = React.useMemo(() => {\n const internal: MGHGridColDef[] = [];\n if (checkboxSelection) internal.push(CHECKBOX_COLUMN_DEF);\n if (getDetailPanelContent) internal.push(DETAIL_PANEL_TOGGLE_COLUMN_DEF);\n const leftFields = disableColumnPinning ? [] : (pinnedColumns.left ?? []).filter((f) => f !== GROUPING_COLUMN_FIELD);\n const rightFields = disableColumnPinning\n ? []\n : (pinnedColumns.right ?? []).filter((f) => f !== GROUPING_COLUMN_FIELD);\n const visibleByField = new Map<string, MGHGridColDef>();\n visibleUserColumns.forEach((col) => visibleByField.set(col.field, col));\n const left: MGHGridColDef[] = internal.slice();\n if (groupingColumn) left.push(groupingColumn);\n leftFields.forEach((f) => {\n const col = visibleByField.get(f);\n if (col) left.push(col);\n });\n const right: MGHGridColDef[] = [];\n rightFields.forEach((f) => {\n const col = visibleByField.get(f);\n if (col && leftFields.indexOf(f) === -1) right.push(col);\n });\n const center = visibleUserColumns.filter(\n (col) => leftFields.indexOf(col.field) === -1 && rightFields.indexOf(col.field) === -1\n );\n const ordered = left.concat(center, right);\n const widths = computeWidths(ordered, viewportWidth, columnWidths);\n const hasPinning = left.length > internal.length + (groupingColumn ? 1 : 0) || right.length > 0;\n const columns: ColumnLayout[] = [];\n let x = 0;\n let leftOffset = 0;\n ordered.forEach((col, i) => {\n const width = widths[i];\n const isLeft = i < left.length;\n const isRight = i >= left.length + center.length;\n columns.push({\n col,\n width,\n pinned: isLeft ? 'left' : isRight ? 'right' : null,\n offset: isLeft ? leftOffset : 0,\n x,\n isLastLeft: isLeft && i === left.length - 1,\n isFirstRight: isRight && i === left.length + center.length,\n });\n if (isLeft) leftOffset += width;\n x += width;\n });\n let rightOffset = 0;\n for (let i = columns.length - 1; i >= 0; i -= 1) {\n if (columns[i].pinned !== 'right') break;\n columns[i].offset = rightOffset;\n rightOffset += columns[i].width;\n }\n return { columns, totalWidth: x, hasPinning, leftCount: left.length, rightCount: right.length };\n }, [\n checkboxSelection,\n getDetailPanelContent,\n pinnedColumns,\n disableColumnPinning,\n visibleUserColumns,\n groupingColumn,\n viewportWidth,\n columnWidths,\n ]);\n\n const allDisplayColumnsByField = React.useMemo(() => {\n const map = new Map<string, MGHGridColDef>();\n layout.columns.forEach((c) => map.set(c.col.field, c.col));\n if (groupingColumn) map.set(GROUPING_COLUMN_FIELD, groupingColumn);\n return map;\n }, [layout.columns, groupingColumn]);\n\n const getColumn = React.useCallback(\n (field: string): MGHGridColDef<R> | undefined =>\n columnsByField.get(field) ?? (allDisplayColumnsByField.get(field) as any),\n [columnsByField, allDisplayColumnsByField]\n );\n\n /* ------------------------------------------------------------------ filtering */\n\n const activeFilters = React.useMemo(() => {\n const out: Array<{ col: MGHGridColDef<R>; fn: MGHGridApplyFilterFn<R> }> = [];\n filterModel.items.forEach((item) => {\n const col = columnsByField.get(item.field);\n if (!col || col.filterable === false) return;\n const operator = getColumnFilterOperators(col).find((op) => op.value === item.operator);\n if (!operator) return;\n const fn = operator.getApplyFilterFn(item, col);\n if (fn) out.push({ col, fn });\n });\n return out;\n }, [filterModel.items, columnsByField]);\n\n const quickFilterValues = React.useMemo(\n () => (filterModel.quickFilterValues ?? []).map((v) => String(v).trim()).filter((v) => v !== ''),\n [filterModel.quickFilterValues]\n );\n\n const quickFilterColumns = React.useMemo(() => {\n const base = filterModel.quickFilterExcludeHiddenColumns ? visibleUserColumns : orderedUserColumns;\n return base.filter((col) => col.filterable !== false && col.type !== 'actions');\n }, [filterModel.quickFilterExcludeHiddenColumns, visibleUserColumns, orderedUserColumns]);\n\n const filteredEntries = React.useMemo(() => {\n if (activeFilters.length === 0 && quickFilterValues.length === 0) return rowEntries;\n const logicAnd = (filterModel.logicOperator ?? 'and') === 'and';\n const quickAnd = (filterModel.quickFilterLogicOperator ?? 'and') === 'and';\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const quickFns = quickFilterValues.map((needle) => {\n const lowered = needle.toLowerCase();\n const perColumn = quickFilterColumns.map((col) => {\n if (col.getApplyQuickFilterFn) {\n const custom = col.getApplyQuickFilterFn(needle, col, apiRefLocal);\n return custom ? { col, fn: custom } : null;\n }\n const fn: MGHGridApplyFilterFn<R> = (value, row) => {\n if (isNil(value)) return false;\n const formatted = formattedValueToString(getFormattedValue(value, row, col, apiRefLocal)).toLowerCase();\n if (formatted.indexOf(lowered) !== -1) return true;\n const raw = typeof value === 'object' ? '' : String(value).toLowerCase();\n return raw.indexOf(lowered) !== -1;\n };\n return { col, fn };\n });\n const active = perColumn.filter(Boolean) as Array<{ col: MGHGridColDef<R>; fn: MGHGridApplyFilterFn<R> }>;\n return (row: R) => active.some(({ col, fn }) => fn(getCellValue(row, col, apiRefLocal), row, col, apiRefLocal));\n });\n return rowEntries.filter(({ row }) => {\n if (activeFilters.length > 0) {\n const results = activeFilters.map(({ col, fn }) =>\n fn(getCellValue(row, col, apiRefLocal), row, col, apiRefLocal)\n );\n const pass = logicAnd ? results.every(Boolean) : results.some(Boolean);\n if (!pass) return false;\n }\n if (quickFns.length > 0) {\n const results = quickFns.map((fn) => fn(row));\n return quickAnd ? results.every(Boolean) : results.some(Boolean);\n }\n return true;\n });\n }, [\n rowEntries,\n activeFilters,\n quickFilterValues,\n quickFilterColumns,\n filterModel.logicOperator,\n filterModel.quickFilterLogicOperator,\n ]);\n\n /* ------------------------------------------------------------------ sorting */\n\n const compareEntries = React.useMemo(() => {\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const sorters = sortModel\n .filter((item) => item.sort && item.field !== GROUPING_COLUMN_FIELD)\n .map((item) => {\n const col = columnsByField.get(item.field);\n if (!col || col.sortable === false) return null;\n return {\n col,\n dir: item.sort === 'desc' ? -1 : 1,\n comparator: col.sortComparator ?? getDefaultComparator(col.type),\n };\n })\n .filter(Boolean) as Array<{ col: MGHGridColDef<R>; dir: number; comparator: any }>;\n if (sorters.length === 0) return null;\n return (a: RowEntry<R>, b: RowEntry<R>) => {\n for (let i = 0; i < sorters.length; i += 1) {\n const { col, dir, comparator } = sorters[i];\n const v1 = getCellValue(a.row, col, apiRefLocal);\n const v2 = getCellValue(b.row, col, apiRefLocal);\n const result = comparator(\n v1,\n v2,\n { id: a.id, field: col.field, value: v1, row: a.row, api: apiRefLocal },\n { id: b.id, field: col.field, value: v2, row: b.row, api: apiRefLocal }\n );\n if (result !== 0) return result * dir;\n }\n return 0;\n };\n }, [sortModel, columnsByField]);\n\n const sortEntries = React.useCallback(\n (entries: RowEntry<R>[]) => {\n if (!compareEntries) return entries;\n return entries\n .map((entry, index) => ({ entry, index }))\n .sort((a, b) => compareEntries(a.entry, b.entry) || a.index - b.index)\n .map((item) => item.entry);\n },\n [compareEntries]\n );\n\n /* ------------------------------------------------------------------ grouping + display rows */\n\n const aggregationFunctions = React.useMemo(\n () => ({ ...BUILT_IN_AGGREGATION_FUNCTIONS, ...aggregationFunctionsProp }),\n [aggregationFunctionsProp]\n );\n const aggregationActive = !disableAggregation && Object.keys(aggregationModel).length > 0;\n\n const isGroupExpanded = React.useCallback(\n (node: GroupTreeNode<R>) => {\n const override = groupExpansion.get(node.id);\n if (override !== undefined) return override;\n if (isGroupExpandedByDefault) {\n return isGroupExpandedByDefault({\n type: 'group',\n id: node.id,\n depth: node.depth,\n parent: node.parent,\n groupingField: node.groupingField,\n groupingKey: node.groupingKey,\n groupingLabel: node.groupingLabel,\n children: [],\n leafIds: [],\n isExpanded: false,\n });\n }\n return defaultGroupingExpansionDepth === -1 || node.depth < defaultGroupingExpansionDepth;\n },\n [groupExpansion, isGroupExpandedByDefault, defaultGroupingExpansionDepth]\n );\n\n const processed = React.useMemo(() => {\n const nodesById = new Map<MGHGridRowId, MGHGridLeafNode | MGHGridGroupNode>();\n const groupsById = new Map<MGHGridRowId, GroupTreeNode<R>>();\n if (!groupingActive) {\n const sorted = sortEntries(filteredEntries);\n const displayRows: DisplayRow<R>[] = sorted.map((entry) => {\n const node: MGHGridLeafNode = { type: 'leaf', id: entry.id, depth: 0, parent: null };\n nodesById.set(entry.id, node);\n return { id: entry.id, type: 'leaf', row: entry.row, node, depth: 0 };\n });\n return { displayRows, sortedLeaves: sorted, nodesById, groupsById, tree: [] as GroupTreeNode<R>[] };\n }\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n let tree = buildGroupTree(filteredEntries, groupingFields, columnsByField, apiRefLocal);\n const groupingSort = sortModel.find((item) => item.field === GROUPING_COLUMN_FIELD && item.sort);\n const compareGroups = (depth: number) => {\n const field = groupingFields[depth];\n const col = columnsByField.get(field);\n if (!col) return null;\n const sortItem = groupingSort ?? sortModel.find((item) => item.field === field && item.sort);\n if (!sortItem) return null;\n const comparator = col.sortComparator ?? getDefaultComparator(col.type);\n const dir = sortItem.sort === 'desc' ? -1 : 1;\n return (a: GroupTreeNode<R>, b: GroupTreeNode<R>) =>\n comparator(\n a.groupingKey,\n b.groupingKey,\n { id: a.id, field, value: a.groupingKey, row: a.descendants[0]?.row, api: apiRefLocal },\n { id: b.id, field, value: b.groupingKey, row: b.descendants[0]?.row, api: apiRefLocal }\n ) * dir;\n };\n tree = sortGroupTree(tree, compareGroups, sortEntries);\n const displayRows = flattenGroupTree(tree, isGroupExpanded, nodesById, groupsById);\n return { displayRows, sortedLeaves: collectTreeLeaves(tree), nodesById, groupsById, tree };\n }, [groupingActive, filteredEntries, sortEntries, groupingFields, columnsByField, sortModel, isGroupExpanded]);\n\n const { displayRows, sortedLeaves, nodesById, groupsById } = processed;\n\n /* ------------------------------------------------------------------ pagination */\n\n const totalDisplayRows = displayRows.length;\n const pageCount = pagination ? Math.max(1, Math.ceil(totalDisplayRows / Math.max(paginationModel.pageSize, 1))) : 1;\n const page = pagination ? clamp(paginationModel.page, 0, pageCount - 1) : 0;\n\n React.useEffect(() => {\n if (pagination && paginationModel.page !== page) {\n setPaginationModel({ ...paginationModel, page });\n }\n }, [pagination, paginationModel, page, setPaginationModel]);\n\n const pagedRows = React.useMemo(\n () =>\n pagination\n ? displayRows.slice(page * paginationModel.pageSize, (page + 1) * paginationModel.pageSize)\n : displayRows,\n [displayRows, pagination, page, paginationModel.pageSize]\n );\n\n /* ------------------------------------------------------------------ aggregation values */\n\n const footerAggregates = React.useMemo(() => {\n if (!aggregationActive || aggregationPosition === 'inline') return null;\n const rowsForFooter = sortedLeaves.map((entry) => entry.row);\n return aggregateRows(rowsForFooter, aggregationModel, columnsByField, aggregationFunctions, latest.current.api);\n }, [aggregationActive, aggregationPosition, sortedLeaves, aggregationModel, columnsByField, aggregationFunctions]);\n\n const groupAggregatesCache = React.useMemo(\n () => new Map<MGHGridRowId, Record<string, { value: any; fn: string }>>(),\n [pagedRows, aggregationModel, aggregationFunctions]\n );\n const getGroupAggregates = (group: GroupTreeNode<R>) => {\n if (!aggregationActive || aggregationPosition === 'footer') return undefined;\n let cached = groupAggregatesCache.get(group.id);\n if (!cached) {\n cached = aggregateRows(\n group.descendants.map((d) => d.row),\n aggregationModel,\n columnsByField,\n aggregationFunctions,\n latest.current.api\n );\n groupAggregatesCache.set(group.id, cached);\n }\n return cached;\n };\n\n /* ------------------------------------------------------------------ row heights + virtualization */\n\n const heights = React.useMemo(() => {\n const rowHeights: number[] = [];\n const detailHeights: number[] = [];\n const offsets: number[] = [];\n let total = 0;\n let hasAuto = autoHeight || disableVirtualization;\n pagedRows.forEach((dr) => {\n let h = rowHeight;\n if (getRowHeight && dr.type === 'leaf' && dr.row) {\n const result = getRowHeight({ id: dr.id, model: dr.row, densityFactor });\n if (result === 'auto') hasAuto = true;\n else if (typeof result === 'number' && result > 0) h = result;\n }\n let d = 0;\n if (dr.type === 'leaf' && getDetailPanelContent && expandedDetailPanels.has(dr.id) && dr.row) {\n const dh = getDetailPanelHeight\n ? getDetailPanelHeight({ id: dr.id, row: dr.row })\n : DEFAULT_DETAIL_PANEL_HEIGHT;\n if (dh === 'auto') hasAuto = true;\n else d = dh;\n }\n rowHeights.push(h);\n detailHeights.push(d);\n offsets.push(total);\n total += h + d;\n });\n return { rowHeights, detailHeights, offsets, total, hasAuto };\n }, [\n pagedRows,\n rowHeight,\n getRowHeight,\n densityFactor,\n getDetailPanelContent,\n getDetailPanelHeight,\n expandedDetailPanels,\n autoHeight,\n disableVirtualization,\n ]);\n\n const virtual = !heights.hasAuto;\n\n const virtualRange = React.useMemo(() => {\n const count = pagedRows.length;\n if (!virtual || count === 0) return { start: 0, end: count };\n const overscan = OVERSCAN_ROWS * rowHeight;\n const viewTop = Math.max(0, scrollTop - headerHeight - overscan);\n const viewBottom = scrollTop + Math.max(viewportHeight, rowHeight) + overscan;\n const { offsets } = heights;\n let lo = 0;\n let hi = count - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (offsets[mid] + heights.rowHeights[mid] + heights.detailHeights[mid] < viewTop) lo = mid + 1;\n else hi = mid;\n }\n const start = lo;\n let end = start;\n while (end < count && offsets[end] < viewBottom) end += 1;\n return { start, end };\n }, [virtual, pagedRows.length, scrollTop, viewportHeight, rowHeight, headerHeight, heights]);\n\n const handleScroll = React.useCallback(() => {\n if (!latest.current.virtual) return;\n if (scrollRaf.current) return;\n scrollRaf.current = window.requestAnimationFrame(() => {\n scrollRaf.current = 0;\n if (scrollerRef.current) setScrollTop(scrollerRef.current.scrollTop);\n });\n }, []);\n\n React.useEffect(\n () => () => {\n if (scrollRaf.current) window.cancelAnimationFrame(scrollRaf.current);\n },\n []\n );\n\n /* ------------------------------------------------------------------ selection */\n\n const isRowSelectableFn = React.useCallback(\n (id: MGHGridRowId, row: R | null | undefined) => {\n if (!row) return false;\n if (!isRowSelectable) return true;\n return isRowSelectable({ id, row, columns: orderedUserColumns, api: latest.current.api });\n },\n [isRowSelectable, orderedUserColumns]\n );\n\n const selectionCandidates = React.useMemo(() => {\n const source: RowEntry<R>[] = checkboxSelectionVisibleOnly\n ? (pagedRows\n .filter((dr) => dr.type === 'leaf' && dr.row)\n .map((dr) => ({ id: dr.id, row: dr.row as R })) as RowEntry<R>[])\n : sortedLeaves;\n return source.filter((entry) => isRowSelectableFn(entry.id, entry.row)).map((entry) => entry.id);\n }, [checkboxSelectionVisibleOnly, pagedRows, sortedLeaves, isRowSelectableFn]);\n\n const selectedCandidateCount = React.useMemo(\n () => selectionCandidates.reduce<number>((acc, id) => acc + (selectedIds.has(id) ? 1 : 0), 0),\n [selectionCandidates, selectedIds]\n );\n const allCandidatesSelected = selectionCandidates.length > 0 && selectedCandidateCount === selectionCandidates.length;\n const someCandidatesSelected = selectedCandidateCount > 0 && !allCandidatesSelected;\n\n const updateSelection = React.useCallback(\n (updater: (prev: Set<MGHGridRowId>) => Set<MGHGridRowId>) => {\n setSelectedIds((prev) => {\n const next = updater(prev);\n return selectionModelsEqual({ type: 'include', ids: prev }, { type: 'include', ids: next }) ? prev : next;\n });\n },\n [setSelectedIds]\n );\n\n const selectRows = React.useCallback(\n (ids: MGHGridRowId[], isSelected = true, resetSelection = false) => {\n updateSelection((prev) => {\n const next = resetSelection ? new Set<MGHGridRowId>() : new Set(prev);\n ids.forEach((id) => {\n if (isSelected) {\n if (isRowSelectableFn(id, rowsById.get(id))) next.add(id);\n } else next.delete(id);\n });\n if (disableMultipleRowSelection && next.size > 1) {\n const lastId = ids[ids.length - 1];\n return new Set<MGHGridRowId>(isSelected && next.has(lastId) ? [lastId] : []);\n }\n return next;\n });\n },\n [updateSelection, isRowSelectableFn, rowsById, disableMultipleRowSelection]\n );\n\n React.useEffect(() => {\n if (keepNonExistentRowsSelected || selectedIds.size === 0) return;\n let changed = false;\n const next = new Set<MGHGridRowId>();\n selectedIds.forEach((id) => {\n if (rowsById.has(id)) next.add(id);\n else changed = true;\n });\n if (changed) setSelectedIds(next);\n }, [rowsById, keepNonExistentRowsSelected, selectedIds, setSelectedIds]);\n\n const toggleAllCandidates = () => {\n if (allCandidatesSelected) selectRows(selectionCandidates, false);\n else selectRows(selectionCandidates, true);\n };\n\n const handleRowSelectionClick = (renderRow: RenderRow<R>, event: React.MouseEvent) => {\n if (renderRow.kind === 'group' && renderRow.group) {\n const leafIds = renderRow.group.descendants.map((d) => d.id);\n const allSelected = leafIds.every((id) => selectedIds.has(id));\n selectRows(leafIds, !allSelected, false);\n return;\n }\n if (renderRow.kind !== 'leaf') return;\n const id = renderRow.id;\n if (!isRowSelectableFn(id, renderRow.row)) return;\n const multiple = !disableMultipleRowSelection;\n if (event.shiftKey && multiple && lastClickedIdRef.current !== null) {\n const ids = pagedRows.filter((dr) => dr.type === 'leaf').map((dr) => dr.id);\n const from = ids.indexOf(lastClickedIdRef.current);\n const to = ids.indexOf(id);\n if (from !== -1 && to !== -1) {\n const [a, b] = from < to ? [from, to] : [to, from];\n selectRows(ids.slice(a, b + 1), true, !checkboxSelection && !event.ctrlKey && !event.metaKey);\n return;\n }\n }\n lastClickedIdRef.current = id;\n const isSelected = selectedIds.has(id);\n const resetSelection = !checkboxSelection && !event.ctrlKey && !event.metaKey;\n if (resetSelection) {\n if (isSelected && selectedIds.size === 1) selectRows([id], false, true);\n else selectRows([id], true, true);\n } else {\n selectRows([id], !isSelected, false);\n }\n };\n\n /* ------------------------------------------------------------------ sorting helpers */\n\n const sortColumn = (field: string, direction?: MGHGridSortDirection, allowMultiple = false) => {\n const col = getColumn(field);\n if (!col || col.sortable === false || disableColumnSorting) return;\n const current = sortModel.find((item) => item.field === field);\n let next: MGHGridSortDirection;\n if (direction === undefined) {\n const order = col.sortingOrder ?? sortingOrder;\n const index = order.indexOf(current?.sort ?? null);\n next = order[(index + 1) % order.length];\n } else {\n next = direction;\n }\n let model: MGHGridSortModel;\n if (allowMultiple && !disableMultipleColumnsSorting) {\n model = sortModel.filter((item) => item.field !== field);\n if (next)\n model = current\n ? sortModel.map((item) => (item.field === field ? { field, sort: next } : item))\n : model.concat([{ field, sort: next }]);\n } else {\n model = next ? [{ field, sort: next }] : [];\n }\n setSortModel(model);\n };\n\n /* ------------------------------------------------------------------ column helpers */\n\n const persistOrder = (fields: string[]) => {\n if (columnOrderStorageKey) writeLocalStorage(columnOrderStorageKey, fields);\n };\n\n const persistWidths = (widths: Record<string, number>) => {\n if (columnWidthStorageKey) writeLocalStorage(columnWidthStorageKey, widths);\n };\n\n const setColumnIndex = (field: string, targetIndex: number, event: React.DragEvent | null = null) => {\n const fields = orderedUserColumns.map((c) => c.field);\n const oldIndex = fields.indexOf(field);\n if (oldIndex === -1) return;\n const next = moveItem(fields, oldIndex, clamp(targetIndex, 0, fields.length - 1));\n setOrderedFields(next);\n persistOrder(next);\n const col = columnsByField.get(field);\n if (col) onColumnOrderChange?.({ column: col, targetIndex, oldIndex }, event, getDetails());\n };\n\n const setColumnWidth = (field: string, width: number) => {\n const col = getColumn(field);\n if (!col) return;\n const clamped = clamp(width, col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH, col.maxWidth ?? Infinity);\n setColumnWidths((prev) => {\n const next = { ...prev, [field]: clamped };\n persistWidths(next);\n return next;\n });\n onColumnWidthChange?.({ colDef: col, width: clamped }, getDetails());\n };\n\n const autosizeColumns = (options: { columns?: string[]; includeHeaders?: boolean; expand?: boolean } = {}) => {\n const includeHeaders = options.includeHeaders ?? true;\n const targets = layout.columns.filter(\n (lc) => !isInternalField(lc.col.field) && (!options.columns || options.columns.indexOf(lc.col.field) !== -1)\n );\n if (targets.length === 0) return;\n const root = rootRef.current;\n const computed = root && typeof window !== 'undefined' ? window.getComputedStyle(root) : null;\n const fontFamily = computed?.fontFamily || 'sans-serif';\n const cellFont = `400 14px ${fontFamily}`;\n const headerFont = `600 14px ${fontFamily}`;\n const sample = sortedLeaves.slice(0, 500);\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const next = { ...columnWidths };\n targets.forEach(({ col }) => {\n let max = includeHeaders ? measureText(col.headerName ?? col.field, headerFont) + 64 : 0;\n sample.forEach((entry) => {\n const value = getCellValue(entry.row, col, apiRefLocal);\n const text = formattedValueToString(getFormattedValue(value, entry.row, col, apiRefLocal, entry.id));\n const w = measureText(text, cellFont) + 24;\n if (w > max) max = w;\n });\n next[col.field] = clamp(Math.ceil(max), col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH, col.maxWidth ?? Infinity);\n });\n setColumnWidths(next);\n persistWidths(next);\n };\n\n const pinColumn = (field: string, side: MGHGridPinnedSide) => {\n if (disableColumnPinning) return;\n const left = (pinnedColumns.left ?? []).filter((f) => f !== field);\n const right = (pinnedColumns.right ?? []).filter((f) => f !== field);\n if (side === 'left') left.push(field);\n else right.unshift(field);\n setPinnedColumns({ left, right });\n };\n\n const unpinColumn = (field: string) => {\n setPinnedColumns({\n left: (pinnedColumns.left ?? []).filter((f) => f !== field),\n right: (pinnedColumns.right ?? []).filter((f) => f !== field),\n });\n };\n\n const isColumnPinned = (field: string): MGHGridPinnedSide | false => {\n if (disableColumnPinning) return false;\n if ((pinnedColumns.left ?? []).indexOf(field) !== -1) return 'left';\n if ((pinnedColumns.right ?? []).indexOf(field) !== -1) return 'right';\n return false;\n };\n\n /* ------------------------------------------------------------------ filter helpers */\n\n const upsertFilterItems = (items: MGHGridFilterItem[]) => {\n let nextItems = filterModel.items.slice();\n items.forEach((item) => {\n const withId =\n item.id === undefined ? { ...item, id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}` } : item;\n const index = nextItems.findIndex((existing) => existing.id !== undefined && existing.id === withId.id);\n if (index === -1) nextItems.push(withId);\n else nextItems[index] = withId;\n });\n if (disableMultipleColumnsFiltering && nextItems.length > 1) nextItems = nextItems.slice(-1);\n setFilterModel({ ...filterModel, items: nextItems });\n };\n\n const deleteFilterItem = (item: MGHGridFilterItem) => {\n setFilterModel({\n ...filterModel,\n items: filterModel.items.filter((existing) =>\n item.id !== undefined ? existing.id !== item.id : existing !== item\n ),\n });\n };\n\n const showPreferences = (panel: 'columns' | 'filters', anchorEl?: HTMLElement | null, targetField?: string) => {\n setColumnMenu(null);\n setPreferencePanel({\n open: true,\n openedPanelValue: panel,\n targetField,\n anchorEl: anchorEl ?? toolbarRef.current ?? rootRef.current,\n });\n };\n\n const hidePreferences = React.useCallback(() => {\n setPreferencePanel((prev) => (prev.open ? { open: false, anchorEl: null } : prev));\n }, []);\n\n /* ------------------------------------------------------------------ editing */\n\n const isCellEditableFn = (params: MGHGridCellParams<R>) => {\n if (!params.colDef.editable) return false;\n if (params.rowNode.type !== 'leaf') return false;\n return isCellEditable ? isCellEditable(params) : true;\n };\n\n const startCellEditMode = (id: MGHGridRowId, field: string) => {\n const row = rowsById.get(id);\n const col = getColumn(field);\n if (!row || !col) return;\n const params = buildCellParams(id, field, row, nodesById.get(id) ?? { type: 'leaf', id, depth: 0, parent: null });\n if (!isCellEditableFn(params)) return;\n setEditingCell({ id, field });\n setEditValue(params.value);\n setFocusedCell({ id, field });\n };\n\n const applyRowUpdate = (id: MGHGridRowId, newRow: R, oldRow: R) => {\n if (processRowUpdate) {\n Promise.resolve()\n .then(() => processRowUpdate(newRow, oldRow, { rowId: id }))\n .then((result) => setRowOverride(id, (result ?? newRow) as R))\n .catch((error) => {\n if (onProcessRowUpdateError) onProcessRowUpdateError(error);\n else console.error('MGHGrid: processRowUpdate failed', error);\n });\n } else {\n setRowOverride(id, newRow);\n }\n };\n\n const stopCellEditMode = (\n id: MGHGridRowId,\n field: string,\n ignoreModifications = false,\n reason: 'enterKeyDown' | 'escapeKeyDown' | 'cellFocusOut' | 'tabKeyDown' | 'api' = 'api'\n ) => {\n if (!editingCell || editingCell.id !== id || editingCell.field !== field) return;\n const row = rowsById.get(id);\n const col = getColumn(field);\n setEditingCell(null);\n if (!row || !col) return;\n if (!ignoreModifications) {\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const parsed = col.valueParser\n ? col.valueParser(editValue, row, col, apiRefLocal)\n : parseEditValue(editValue, col);\n const currentValue = getCellValue(row, col, apiRefLocal);\n if (!Object.is(parsed, currentValue)) {\n const newRow = col.valueSetter\n ? col.valueSetter(parsed, row, col, apiRefLocal)\n : ({ ...row, [field]: parsed } as R);\n applyRowUpdate(id, newRow, row);\n }\n }\n onCellEditStop?.({ id, field, row, reason }, getDetails());\n pendingFocusRef.current = true;\n setFocusedCell({ id, field });\n };\n\n /* ------------------------------------------------------------------ detail panel & grouping helpers */\n\n const toggleDetailPanel = (id: MGHGridRowId) => {\n setExpandedDetailPanels((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const setRowChildrenExpansion = (id: MGHGridRowId, isExpanded: boolean) => {\n setGroupExpansion((prev) => {\n const next = new Map(prev);\n next.set(id, isExpanded);\n return next;\n });\n };\n\n const groupingKey = groupingFields.join('|');\n const previousGroupingKey = React.useRef(groupingKey);\n React.useEffect(() => {\n if (previousGroupingKey.current === groupingKey) return;\n previousGroupingKey.current = groupingKey;\n setGroupExpansion(new Map());\n }, [groupingKey]);\n\n /* ------------------------------------------------------------------ cell params */\n\n const buildCellParams = (id: MGHGridRowId, field: string, row: R, node: MGHGridRowNode): MGHGridCellParams<R> => {\n const col = getColumn(field) as MGHGridColDef<R>;\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const value = getCellValue(row, col, apiRefLocal);\n const formattedValue = getFormattedValue(value, row, col, apiRefLocal, id);\n const hasFocus = Boolean(focusedCell && focusedCell.id === id && focusedCell.field === field);\n const cellMode = editingCell && editingCell.id === id && editingCell.field === field ? 'edit' : 'view';\n return {\n id,\n field,\n value,\n formattedValue,\n row,\n rowNode: node,\n colDef: col,\n api: apiRefLocal,\n hasFocus,\n tabIndex: hasFocus ? 0 : -1,\n cellMode,\n isEditable: Boolean(col.editable) && node.type === 'leaf',\n };\n };\n\n const buildRowParams = (id: MGHGridRowId, row: R): MGHGridRowParams<R> => ({\n id,\n row,\n columns: orderedUserColumns,\n api: latest.current.api,\n });\n\n /* ------------------------------------------------------------------ keyboard navigation */\n\n React.useEffect(() => {\n if (!pendingFocusRef.current || !focusedCell || !rootRef.current) return;\n pendingFocusRef.current = false;\n const selector = `[data-mgh-row-id=\"${String(focusedCell.id).replace(/\"/g, '\\\\\"')}\"] [data-mgh-field=\"${focusedCell.field.replace(/\"/g, '\\\\\"')}\"]`;\n const el = rootRef.current.querySelector<HTMLElement>(selector);\n if (el && document.activeElement !== el && !el.contains(document.activeElement)) el.focus({ preventScroll: true });\n }, [focusedCell, virtualRange.start, virtualRange.end]);\n\n const scrollToIndexes = (params: { rowIndex?: number; colIndex?: number }) => {\n const scroller = scrollerRef.current;\n if (!scroller) return false;\n if (params.rowIndex !== undefined && virtual) {\n const index = clamp(params.rowIndex, 0, Math.max(pagedRows.length - 1, 0));\n const top = heights.offsets[index] ?? 0;\n const bottom = top + (heights.rowHeights[index] ?? rowHeight);\n const visibleTop = scroller.scrollTop;\n const visibleBottom = scroller.scrollTop + scroller.clientHeight - headerHeight;\n if (top < visibleTop) scroller.scrollTop = top;\n else if (bottom > visibleBottom) scroller.scrollTop = bottom - (scroller.clientHeight - headerHeight);\n } else if (params.rowIndex !== undefined) {\n const el = scroller.querySelector(`[data-mgh-row-index=\"${params.rowIndex}\"]`) as HTMLElement | null | undefined;\n el?.scrollIntoView?.({ block: 'nearest' });\n }\n if (params.colIndex !== undefined) {\n const lc = layout.columns[clamp(params.colIndex, 0, layout.columns.length - 1)];\n if (lc && !lc.pinned) {\n const leftPinnedWidth = layout.columns\n .filter((c) => c.pinned === 'left')\n .reduce((acc, c) => acc + c.width, 0);\n const rightPinnedWidth = layout.columns\n .filter((c) => c.pinned === 'right')\n .reduce((acc, c) => acc + c.width, 0);\n const visibleLeft = scroller.scrollLeft + leftPinnedWidth;\n const visibleRight = scroller.scrollLeft + scroller.clientWidth - rightPinnedWidth;\n if (lc.x < visibleLeft) scroller.scrollLeft = lc.x - leftPinnedWidth;\n else if (lc.x + lc.width > visibleRight)\n scroller.scrollLeft = lc.x + lc.width - scroller.clientWidth + rightPinnedWidth;\n }\n }\n return true;\n };\n\n const moveFocus = (\n rowDelta: number,\n colDelta: number,\n absolute?: { row?: 'first' | 'last'; col?: 'first' | 'last' }\n ) => {\n if (pagedRows.length === 0 || layout.columns.length === 0) return;\n let rowIndex = focusedCell ? pagedRows.findIndex((dr) => dr.id === focusedCell.id) : -1;\n let colIndex = focusedCell ? layout.columns.findIndex((lc) => lc.col.field === focusedCell.field) : -1;\n if (rowIndex === -1) rowIndex = 0;\n if (colIndex === -1) colIndex = 0;\n if (absolute?.row === 'first') rowIndex = 0;\n else if (absolute?.row === 'last') rowIndex = pagedRows.length - 1;\n else rowIndex = clamp(rowIndex + rowDelta, 0, pagedRows.length - 1);\n if (absolute?.col === 'first') colIndex = 0;\n else if (absolute?.col === 'last') colIndex = layout.columns.length - 1;\n else colIndex = clamp(colIndex + colDelta, 0, layout.columns.length - 1);\n const target = { id: pagedRows[rowIndex].id, field: layout.columns[colIndex].col.field };\n pendingFocusRef.current = true;\n setFocusedCell(target);\n scrollToIndexes({ rowIndex, colIndex });\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (editingCell) return;\n const target = event.target as HTMLElement;\n if (\n target &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'SELECT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'BUTTON')\n ) {\n return;\n }\n const pageRows = Math.max(1, Math.floor(Math.max(viewportHeight - headerHeight, rowHeight) / rowHeight));\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n moveFocus(1, 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocus(-1, 0);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n moveFocus(0, -1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n moveFocus(0, 1);\n break;\n case 'PageDown':\n event.preventDefault();\n moveFocus(pageRows, 0);\n break;\n case 'PageUp':\n event.preventDefault();\n moveFocus(-pageRows, 0);\n break;\n case 'Home':\n event.preventDefault();\n moveFocus(0, 0, event.ctrlKey || event.metaKey ? { row: 'first', col: 'first' } : { col: 'first' });\n break;\n case 'End':\n event.preventDefault();\n moveFocus(0, 0, event.ctrlKey || event.metaKey ? { row: 'last', col: 'last' } : { col: 'last' });\n break;\n case 'Enter':\n case 'F2':\n if (focusedCell) {\n const node = nodesById.get(focusedCell.id);\n if (node?.type === 'group' && focusedCell.field === GROUPING_COLUMN_FIELD) {\n const group = groupsById.get(focusedCell.id);\n if (group) setRowChildrenExpansion(group.id, !isGroupExpanded(group));\n } else {\n event.preventDefault();\n startCellEditMode(focusedCell.id, focusedCell.field);\n }\n }\n break;\n case ' ':\n if (focusedCell && (checkboxSelection || !disableRowSelectionOnClick)) {\n const dr = pagedRows.find((r) => r.id === focusedCell.id);\n if (dr && dr.type === 'leaf' && dr.row) {\n event.preventDefault();\n selectRows([dr.id], !selectedIds.has(dr.id), false);\n }\n }\n break;\n case 'Escape':\n if (preferencePanel.open) hidePreferences();\n if (columnMenu) setColumnMenu(null);\n break;\n default:\n if (\n (event.ctrlKey || event.metaKey) &&\n event.key.toLowerCase() === 'a' &&\n checkboxSelection &&\n !disableMultipleRowSelection\n ) {\n event.preventDefault();\n selectRows(selectionCandidates, true);\n }\n }\n };\n\n /* ------------------------------------------------------------------ drag & drop (reorder) */\n\n const canReorder = (col: MGHGridColDef) => !disableColumnReorder && !col.disableReorder && !isInternalField(col.field);\n\n const handleDrop = (targetLc: ColumnLayout, event: React.DragEvent) => {\n event.preventDefault();\n const current = drag;\n setDrag(null);\n if (!current || current.field === targetLc.col.field) return;\n const sourceLc = layout.columns.find((lc) => lc.col.field === current.field);\n if (!sourceLc || sourceLc.pinned !== targetLc.pinned || !canReorder(targetLc.col)) return;\n const side = current.side;\n if (sourceLc.pinned) {\n const key = sourceLc.pinned;\n const list = (pinnedColumns[key] ?? []).slice();\n const from = list.indexOf(current.field);\n let to = list.indexOf(targetLc.col.field);\n if (from === -1 || to === -1) return;\n list.splice(from, 1);\n to = list.indexOf(targetLc.col.field);\n list.splice(side === 'right' ? to + 1 : to, 0, current.field);\n setPinnedColumns({ ...pinnedColumns, [key]: list });\n return;\n }\n const fields = orderedUserColumns.map((c) => c.field);\n const from = fields.indexOf(current.field);\n const without = fields.filter((f) => f !== current.field);\n let to = without.indexOf(targetLc.col.field);\n if (side === 'right') to += 1;\n without.splice(to, 0, current.field);\n setOrderedFields(without);\n persistOrder(without);\n const col = columnsByField.get(current.field);\n if (col) onColumnOrderChange?.({ column: col, targetIndex: to, oldIndex: from }, event, getDetails());\n };\n\n /* ------------------------------------------------------------------ resize */\n\n const resizeRef = React.useRef<{\n field: string;\n startX: number;\n startWidth: number;\n lastWidth: number;\n min: number;\n max: number;\n } | null>(null);\n\n const handleResizeStart = (lc: ColumnLayout, event: React.PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n resizeRef.current = {\n field: lc.col.field,\n startX: event.clientX,\n startWidth: lc.width,\n lastWidth: lc.width,\n min: lc.col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH,\n max: lc.col.maxWidth ?? Infinity,\n };\n setResizingField(lc.col.field);\n const onMove = (e: PointerEvent) => {\n const r = resizeRef.current;\n if (!r) return;\n const width = clamp(r.startWidth + (e.clientX - r.startX), r.min, r.max);\n r.lastWidth = width;\n setColumnWidths((prev) => (prev[r.field] === width ? prev : { ...prev, [r.field]: width }));\n };\n const onUp = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n const r = resizeRef.current;\n resizeRef.current = null;\n setResizingField(null);\n if (!r) return;\n const next = { ...(latest.current.columnWidths as Record<string, number>), [r.field]: r.lastWidth };\n setColumnWidths(next);\n persistWidths(next);\n const col = latest.current.getColumn(r.field);\n if (col && r.lastWidth !== r.startWidth)\n onColumnWidthChange?.({ colDef: col, width: r.lastWidth }, getDetails());\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n };\n\n /* ------------------------------------------------------------------ state snapshot & API */\n\n const filterCount = activeFilters.length;\n const rowCount = groupingActive ? totalDisplayRows : filteredEntries.length;\n\n const state = React.useMemo<MGHGridState>(\n () => ({\n sortModel,\n filterModel,\n paginationModel: { page, pageSize: paginationModel.pageSize },\n pageCount,\n rowCount,\n totalRowCount: rowEntries.length,\n columnVisibilityModel,\n orderedFields: orderedUserColumns.map((c) => c.field),\n columnWidths,\n pinnedColumns,\n density,\n densityFactor,\n rowSelectionModel: { type: 'include', ids: selectedIds },\n rowGroupingModel,\n aggregationModel,\n expandedDetailPanels,\n preferencePanel: {\n open: preferencePanel.open,\n openedPanelValue: preferencePanel.openedPanelValue,\n targetField: preferencePanel.targetField,\n },\n filterCount,\n quickFilterValues,\n }),\n [\n sortModel,\n filterModel,\n page,\n paginationModel.pageSize,\n pageCount,\n rowCount,\n rowEntries.length,\n columnVisibilityModel,\n orderedUserColumns,\n columnWidths,\n pinnedColumns,\n density,\n densityFactor,\n selectedIds,\n rowGroupingModel,\n aggregationModel,\n expandedDetailPanels,\n preferencePanel.open,\n preferencePanel.openedPanelValue,\n preferencePanel.targetField,\n filterCount,\n quickFilterValues,\n ]\n );\n\n latest.current = {\n api: apiObject,\n state,\n rowsById,\n rowEntries,\n nodesById,\n groupsById,\n sortedLeaves,\n pagedRows,\n getRowId,\n setRowOverride,\n orderedUserColumns,\n visibleUserColumns,\n getColumn,\n columnVisibilityModel,\n setColumnVisibilityModel,\n setColumnWidth,\n setColumnIndex,\n columnWidths,\n autosizeColumns,\n pinColumn,\n unpinColumn,\n isColumnPinned,\n pinnedColumns,\n setPinnedColumns,\n sortModel,\n setSortModel,\n sortColumn,\n filterModel,\n setFilterModel,\n upsertFilterItems,\n deleteFilterItem,\n showPreferences,\n hidePreferences,\n selectedIds,\n setSelectedIds,\n selectRows,\n isRowSelectableFn,\n paginationModel: { page, pageSize: paginationModel.pageSize },\n setPaginationModel,\n setDensity,\n toggleDetailPanel,\n expandedDetailPanels,\n setExpandedDetailPanels,\n rowGroupingModel,\n setRowGroupingModel,\n setRowChildrenExpansion,\n aggregationModel,\n setAggregationModel,\n startCellEditMode,\n stopCellEditMode,\n editingCell,\n setEditValue,\n buildCellParams,\n setFocusedCell,\n scrollToIndexes,\n forceUpdate,\n virtual,\n };\n\n if (apiRef) apiRef.current = apiObject;\n\n React.useEffect(() => {\n onStateChange?.(state, { api: apiObject });\n }, [state, onStateChange, apiObject]);\n\n /* ------------------------------------------------------------------ context */\n\n const rootProps = React.useMemo<MGHGridRootProps>(\n () => ({\n header,\n pagination,\n pageSizeOptions,\n hideFooterPagination,\n hideFooterRowCount,\n hideFooterSelectedRowCount,\n disableColumnFilter,\n disableColumnSelector,\n disableDensitySelector,\n disableColumnPinning,\n disableColumnSorting,\n disableMultipleColumnsSorting,\n disableMultipleColumnsFiltering,\n disableRowGrouping,\n disableAggregation,\n checkboxSelection,\n aggregationFunctions,\n quickFilterDebounceMs,\n }),\n [\n header,\n pagination,\n pageSizeOptions,\n hideFooterPagination,\n hideFooterRowCount,\n hideFooterSelectedRowCount,\n disableColumnFilter,\n disableColumnSelector,\n disableDensitySelector,\n disableColumnPinning,\n disableColumnSorting,\n disableMultipleColumnsSorting,\n disableMultipleColumnsFiltering,\n disableRowGrouping,\n disableAggregation,\n checkboxSelection,\n aggregationFunctions,\n quickFilterDebounceMs,\n ]\n );\n\n const contextValue = React.useMemo<MGHGridContextValue>(\n () => ({\n api: apiObject,\n state,\n localeText,\n themeMode,\n rootProps,\n columns: orderedUserColumns,\n visibleColumns: visibleUserColumns,\n }),\n [apiObject, state, localeText, themeMode, rootProps, orderedUserColumns, visibleUserColumns]\n );\n\n /* ------------------------------------------------------------------ rendering: cells */\n\n const renderEditor = (params: MGHGridCellParams<R>) => {\n const col = params.colDef;\n const commit = (reason: 'enterKeyDown' | 'cellFocusOut' | 'tabKeyDown') =>\n stopCellEditMode(params.id, params.field, false, reason);\n const cancel = () => stopCellEditMode(params.id, params.field, true, 'escapeKeyDown');\n const keyHandler = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n commit('enterKeyDown');\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n cancel();\n } else if (event.key === 'Tab') {\n commit('tabKeyDown');\n } else {\n event.stopPropagation();\n }\n };\n if (col.renderEditCell) {\n return col.renderEditCell({\n ...params,\n editValue,\n onValueChange: setEditValue,\n commit: () => commit('enterKeyDown'),\n cancel,\n });\n }\n const common = {\n autoFocus: true,\n onKeyDown: keyHandler,\n onBlur: () => commit('cellFocusOut'),\n onClick: (event: React.MouseEvent) => event.stopPropagation(),\n };\n switch (col.type) {\n case 'boolean':\n return (\n <Checkbox\n {...common}\n checked={Boolean(editValue)}\n onChange={(event) => setEditValue(event.target.checked)}\n />\n );\n case 'singleSelect': {\n const options = resolveValueOptions(col, params.row, params.id);\n return (\n <Select\n {...common}\n size=\"small\"\n value={editValue === undefined || editValue === null ? '' : String(editValue)}\n onChange={(event) => {\n const match = options.find((o) => String(getOptionValue(col, o)) === event.target.value);\n setEditValue(match !== undefined ? getOptionValue(col, match) : event.target.value);\n }}\n >\n <option value=\"\" />\n {options.map((option) => {\n const value = getOptionValue(col, option);\n return (\n <option key={String(value)} value={String(value)}>\n {getOptionLabel(col, option)}\n </option>\n );\n })}\n </Select>\n );\n }\n case 'number':\n return (\n <TextInput\n {...common}\n size=\"small\"\n type=\"number\"\n value={editValue === undefined || editValue === null ? '' : editValue}\n onChange={(event) => setEditValue(event.target.value)}\n />\n );\n case 'date':\n case 'dateTime':\n return (\n <TextInput\n {...common}\n size=\"small\"\n type={col.type === 'date' ? 'date' : 'datetime-local'}\n value={\n typeof editValue === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(editValue)\n ? editValue\n : toDateInputValue(editValue, col.type === 'dateTime')\n }\n onChange={(event) => setEditValue(event.target.value)}\n />\n );\n default:\n return (\n <TextInput\n {...common}\n size=\"small\"\n type=\"text\"\n value={editValue === undefined || editValue === null ? '' : String(editValue)}\n onChange={(event) => setEditValue(event.target.value)}\n />\n );\n }\n };\n\n const renderCellContent = (lc: ColumnLayout, renderRow: RenderRow<R>): React.ReactNode => {\n const { col } = lc;\n const field = col.field;\n\n if (field === CHECKBOX_FIELD) {\n if (renderRow.kind === 'group' && renderRow.group) {\n const leafIds = renderRow.group.descendants.map((d) => d.id);\n const selectedCount = leafIds.reduce<number>((acc, id) => acc + (selectedIds.has(id) ? 1 : 0), 0);\n return (\n <Checkbox\n checked={leafIds.length > 0 && selectedCount === leafIds.length}\n indeterminate={selectedCount > 0 && selectedCount < leafIds.length}\n label={localeText.checkboxSelectionSelectRow}\n onClick={(event) => event.stopPropagation()}\n onChange={() => selectRows(leafIds, selectedCount !== leafIds.length, false)}\n />\n );\n }\n if (renderRow.kind !== 'leaf') return null;\n const selectable = isRowSelectableFn(renderRow.id, renderRow.row);\n const checked = selectedIds.has(renderRow.id);\n return (\n <Checkbox\n checked={checked}\n disabled={!selectable}\n label={checked ? localeText.checkboxSelectionUnselectRow : localeText.checkboxSelectionSelectRow}\n tabIndex={-1}\n onClick={(event) => event.stopPropagation()}\n onChange={() => {\n lastClickedIdRef.current = renderRow.id;\n selectRows([renderRow.id], !checked, disableMultipleRowSelection);\n }}\n />\n );\n }\n\n if (field === DETAIL_PANEL_TOGGLE_FIELD) {\n if (renderRow.kind !== 'leaf' || !renderRow.row) return null;\n const expanded = expandedDetailPanels.has(renderRow.id);\n const content = getDetailPanelContent?.(buildRowParams(renderRow.id, renderRow.row));\n if (content === null || content === undefined || content === false) return null;\n return (\n <IconButton\n size=\"small\"\n className={cx('mgh-grid-detail-toggle', expanded && 'mgh-grid-detail-toggle--expanded')}\n label={expanded ? localeText.collapseDetailPanel : localeText.expandDetailPanel}\n aria-expanded={expanded}\n tabIndex={-1}\n onClick={(event) => {\n event.stopPropagation();\n toggleDetailPanel(renderRow.id);\n }}\n >\n <ExpandMoreIcon />\n </IconButton>\n );\n }\n\n if (field === GROUPING_COLUMN_FIELD) {\n if (renderRow.kind === 'group' && renderRow.group) {\n const group = renderRow.group;\n const expanded = isGroupExpanded(group);\n const hideCount = (groupingColDef as any)?.hideDescendantCount;\n return (\n <div className=\"mgh-grid-group-cell\" style={{ paddingLeft: renderRow.depth * 20 }}>\n <IconButton\n size=\"small\"\n className={cx('mgh-grid-group-toggle', expanded && 'mgh-grid-group-toggle--expanded')}\n label={expanded ? localeText.collapseDetailPanel : localeText.expandDetailPanel}\n aria-expanded={expanded}\n tabIndex={-1}\n onClick={(event) => {\n event.stopPropagation();\n setRowChildrenExpansion(group.id, !expanded);\n }}\n >\n <ChevronRightIcon />\n </IconButton>\n <span className=\"mgh-grid-group-label\" title={group.groupingLabel}>\n {group.groupingLabel}\n </span>\n {!hideCount && <span className=\"mgh-grid-group-count\">({group.descendants.length})</span>}\n </div>\n );\n }\n return null;\n }\n\n if (renderRow.kind === 'group' || renderRow.kind === 'footer') {\n const agg = renderRow.aggregates?.[field];\n if (!agg || isNil(agg.value)) return null;\n const fn = aggregationFunctions[agg.fn];\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const sampleRow = (renderRow.group?.descendants[0]?.row ?? latest.current.sortedLeaves[0]?.row ?? {}) as R;\n const formatted = fn?.valueFormatter\n ? fn.valueFormatter(agg.value)\n : col.valueFormatter\n ? col.valueFormatter(agg.value, sampleRow, col as MGHGridColDef<R>, apiRefLocal)\n : defaultFormatValue(agg.value, col);\n return (\n <>\n <span className=\"mgh-grid-aggregation-label\">{fn?.label ?? agg.fn}</span>\n <span className=\"mgh-grid-cell-text\">{formattedValueToString(formatted)}</span>\n </>\n );\n }\n\n if (!renderRow.row) return null;\n const params = buildCellParams(renderRow.id, field, renderRow.row, renderRow.node);\n\n if (params.cellMode === 'edit') return renderEditor(params);\n\n if (col.renderCell) return col.renderCell(params);\n\n if (col.type === 'actions') {\n const actions = col.getActions ? col.getActions(buildRowParams(renderRow.id, renderRow.row)) : [];\n return <ActionsCell actions={actions} themeMode={themeMode} moreLabel={localeText.actionsCellMore} />;\n }\n\n if (col.type === 'boolean') {\n if (isNil(params.value)) return null;\n return params.value ? (\n <CheckIcon aria-label={localeText.booleanCellTrueLabel} />\n ) : (\n <CloseIcon aria-label={localeText.booleanCellFalseLabel} />\n );\n }\n\n const formatted = params.formattedValue;\n if (formatted === null || formatted === undefined) return null;\n if (React.isValidElement(formatted)) return formatted;\n const text = formattedValueToString(formatted);\n return (\n <span className=\"mgh-grid-cell-text\" title={text.length > 20 ? text : undefined}>\n {text}\n </span>\n );\n };\n\n const cellStyle = (lc: ColumnLayout): React.CSSProperties => ({\n width: lc.width,\n minWidth: lc.width,\n maxWidth: lc.width,\n left: lc.pinned === 'left' ? lc.offset : undefined,\n right: lc.pinned === 'right' ? lc.offset : undefined,\n });\n\n const pinnedClasses = (lc: ColumnLayout, prefix: string) =>\n cx(\n lc.pinned === 'left' && `${prefix}--pinned-left`,\n lc.pinned === 'right' && `${prefix}--pinned-right`,\n lc.isLastLeft && layout.hasPinning && `${prefix}--pinned-left-last`,\n lc.isFirstRight && `${prefix}--pinned-right-first`\n );\n\n const renderCell = (lc: ColumnLayout, renderRow: RenderRow<R>, isAutoRow: boolean) => {\n const { col } = lc;\n const field = col.field;\n const isFocused = Boolean(focusedCell && focusedCell.id === renderRow.id && focusedCell.field === field);\n const isEditing = Boolean(editingCell && editingCell.id === renderRow.id && editingCell.field === field);\n const isAggregation =\n (renderRow.kind === 'group' || renderRow.kind === 'footer') && Boolean(renderRow.aggregates?.[field]);\n const params =\n renderRow.kind === 'leaf' && renderRow.row\n ? buildCellParams(renderRow.id, field, renderRow.row, renderRow.node)\n : null;\n const editable = params ? isCellEditableFn(params) : false;\n const customClass =\n params && col.cellClassName\n ? typeof col.cellClassName === 'function'\n ? col.cellClassName(params)\n : col.cellClassName\n : undefined;\n const isCheckbox = field === CHECKBOX_FIELD;\n const isDetailToggle = field === DETAIL_PANEL_TOGGLE_FIELD;\n return (\n <div\n key={field}\n role=\"gridcell\"\n data-mgh-field={field}\n data-mgh-colindex={layout.columns.indexOf(lc)}\n tabIndex={isFocused ? 0 : -1}\n aria-selected={renderRow.kind === 'leaf' ? selectedIds.has(renderRow.id) : undefined}\n className={cx(\n 'mgh-grid-cell',\n `mgh-grid-cell--align-${col.align ?? 'left'}`,\n pinnedClasses(lc, 'mgh-grid-cell'),\n isFocused && !isEditing && 'mgh-grid-cell--focused',\n isEditing && 'mgh-grid-cell--editing',\n editable && !isEditing && 'mgh-grid-cell--editable',\n col.type === 'boolean' && 'mgh-grid-cell--boolean',\n col.type === 'actions' && 'mgh-grid-cell--actions',\n isCheckbox && 'mgh-grid-cell--checkbox',\n isDetailToggle && 'mgh-grid-cell--detail-toggle',\n isAggregation && 'mgh-grid-cell--aggregation',\n customClass\n )}\n style={cellStyle(lc)}\n onMouseDown={() => {\n if (renderRow.kind === 'leaf' || renderRow.kind === 'group') {\n if (!isFocused) setFocusedCell({ id: renderRow.id, field });\n }\n }}\n onClick={(event) => {\n if (params && onCellClick) onCellClick(params, event, getDetails());\n }}\n onDoubleClick={(event) => {\n if (params) {\n onCellDoubleClick?.(params, event, getDetails());\n if (editable && !isEditing) {\n event.stopPropagation();\n startCellEditMode(renderRow.id, field);\n }\n }\n }}\n >\n {renderCellContent(lc, renderRow)}\n </div>\n );\n };\n\n /* ------------------------------------------------------------------ rendering: rows */\n\n const rowIsClickable = Boolean(onRowClick || onRowDoubleClick || !disableRowSelectionOnClick);\n\n const renderRowElement = (\n renderRow: RenderRow<R>,\n options: { height?: number; index: number; isFirst: boolean; isLast: boolean; isAuto: boolean }\n ) => {\n const isSelected = renderRow.kind === 'leaf' ? selectedIds.has(renderRow.id) : false;\n const customClass =\n renderRow.kind === 'leaf' && renderRow.row && getRowClassName\n ? getRowClassName({\n ...buildRowParams(renderRow.id, renderRow.row),\n indexRelativeToCurrentPage: options.index,\n isFirstVisible: options.isFirst,\n isLastVisible: options.isLast,\n rowNode: renderRow.node,\n })\n : undefined;\n return (\n <div\n role=\"row\"\n aria-rowindex={options.index + 2}\n aria-selected={renderRow.kind === 'leaf' ? isSelected : undefined}\n data-mgh-row-id={String(renderRow.id)}\n data-mgh-row-index={options.index}\n className={cx(\n 'mgh-grid-row',\n isSelected && 'mgh-grid-row--selected',\n rowIsClickable && renderRow.kind === 'leaf' && 'mgh-grid-row--clickable',\n renderRow.kind === 'group' && 'mgh-grid-row--group',\n renderRow.kind === 'pinnedRow' && 'mgh-grid-row--pinned',\n renderRow.kind === 'footer' && 'mgh-grid-row--footer',\n options.isAuto && 'mgh-grid-row--auto-height',\n customClass\n )}\n style={{\n width: layout.totalWidth,\n height: options.isAuto ? undefined : options.height,\n minHeight: options.isAuto ? rowHeight : undefined,\n }}\n onClick={(event) => {\n if (renderRow.kind === 'leaf' && renderRow.row) {\n if (!disableRowSelectionOnClick) handleRowSelectionClick(renderRow, event);\n onRowClick?.(buildRowParams(renderRow.id, renderRow.row), event, getDetails());\n } else if (renderRow.kind === 'group' && renderRow.group) {\n setRowChildrenExpansion(renderRow.group.id, !isGroupExpanded(renderRow.group));\n }\n }}\n onDoubleClick={(event) => {\n if (renderRow.kind === 'leaf' && renderRow.row) {\n onRowDoubleClick?.(buildRowParams(renderRow.id, renderRow.row), event, getDetails());\n }\n }}\n >\n {layout.columns.map((lc) => renderCell(lc, renderRow, options.isAuto))}\n <div className=\"mgh-grid-row-filler\" />\n </div>\n );\n };\n\n const toRenderRow = (dr: DisplayRow<R>): RenderRow<R> => ({\n id: dr.id,\n kind: dr.type,\n row: dr.row,\n node: dr.node,\n depth: dr.depth,\n group: dr.group,\n aggregates: dr.type === 'group' && dr.group ? getGroupAggregates(dr.group) : undefined,\n });\n\n const renderBodyRows = () => {\n const { start, end } = virtualRange;\n const items: React.ReactNode[] = [];\n for (let i = start; i < end; i += 1) {\n const dr = pagedRows[i];\n const renderRow = toRenderRow(dr);\n const detailHeight = heights.detailHeights[i];\n const isExpanded =\n dr.type === 'leaf' && Boolean(dr.row) && Boolean(getDetailPanelContent) && expandedDetailPanels.has(dr.id);\n const detailContent = isExpanded && dr.row ? getDetailPanelContent?.(buildRowParams(dr.id, dr.row)) : null;\n const detailAuto =\n isExpanded && dr.row && getDetailPanelHeight\n ? getDetailPanelHeight({ id: dr.id, row: dr.row }) === 'auto'\n : false;\n const rowAuto =\n !virtual &&\n (getRowHeight && dr.type === 'leaf' && dr.row\n ? getRowHeight({ id: dr.id, model: dr.row, densityFactor }) === 'auto'\n : false);\n items.push(\n <div\n key={String(dr.id)}\n className=\"mgh-grid-row-block\"\n style={virtual ? { top: heights.offsets[i], width: layout.totalWidth } : { width: layout.totalWidth }}\n >\n {renderRowElement(renderRow, {\n height: heights.rowHeights[i],\n index: i,\n isFirst: i === 0,\n isLast: i === pagedRows.length - 1,\n isAuto: rowAuto,\n })}\n {isExpanded && detailContent !== null && detailContent !== undefined && detailContent !== false && (\n <div\n className=\"mgh-grid-detail-panel\"\n style={{\n height: detailAuto ? undefined : detailHeight || undefined,\n width: viewportWidth || undefined,\n }}\n onClick={(event) => event.stopPropagation()}\n >\n {detailContent}\n </div>\n )}\n </div>\n );\n }\n return items;\n };\n\n const renderPinnedRows = (list: R[] | undefined, position: 'top' | 'bottom') => {\n const items: React.ReactNode[] = [];\n (list ?? []).forEach((row, index) => {\n const id = getRowIdFromRow(row, getRowId);\n const renderRow: RenderRow<R> = {\n id,\n kind: 'pinnedRow',\n row,\n node: { type: 'pinnedRow', id, depth: 0, parent: null, position },\n depth: 0,\n };\n items.push(\n <React.Fragment key={String(id)}>\n {renderRowElement(renderRow, {\n height: rowHeight,\n index: index,\n isFirst: false,\n isLast: false,\n isAuto: false,\n })}\n </React.Fragment>\n );\n });\n if (position === 'bottom' && footerAggregates) {\n const renderRow: RenderRow<R> = {\n id: AGGREGATION_FOOTER_ID,\n kind: 'footer',\n row: null,\n node: { type: 'footer', id: AGGREGATION_FOOTER_ID, depth: 0, parent: null },\n depth: 0,\n aggregates: footerAggregates,\n };\n items.push(\n <React.Fragment key={AGGREGATION_FOOTER_ID}>\n {renderRowElement(renderRow, {\n height: rowHeight,\n index: 0,\n isFirst: false,\n isLast: false,\n isAuto: false,\n })}\n </React.Fragment>\n );\n }\n return items;\n };\n\n /* ------------------------------------------------------------------ rendering: header */\n\n const renderHeaderCell = (lc: ColumnLayout, index: number) => {\n const { col } = lc;\n const field = col.field;\n const sortIndex = sortModel.findIndex((item) => item.field === field && item.sort);\n const sortItem = sortIndex !== -1 ? sortModel[sortIndex] : undefined;\n const sortable =\n (col.sortable !== false && !disableColumnSorting && !isInternalField(field)) ||\n (field === GROUPING_COLUMN_FIELD && col.sortable !== false);\n const showMenu =\n (!disableColumnMenu && !col.disableColumnMenu && !isInternalField(field)) ||\n (field === GROUPING_COLUMN_FIELD && !disableColumnMenu);\n const resizable =\n (!disableColumnResize && col.resizable !== false && !isInternalField(field)) ||\n (field === GROUPING_COLUMN_FIELD && !disableColumnResize);\n const draggable = canReorder(col);\n const isDragging = drag?.field === field;\n const isDropTarget = drag && drag.overField === field && drag.field !== field;\n const menuOpen = columnMenu?.field === field;\n const headerParams = { field, colDef: col as MGHGridColDef<R>, api: apiObject };\n const customClass = col.headerClassName\n ? typeof col.headerClassName === 'function'\n ? col.headerClassName(headerParams)\n : col.headerClassName\n : undefined;\n\n let content: React.ReactNode;\n if (field === CHECKBOX_FIELD) {\n content = disableMultipleRowSelection ? null : (\n <Checkbox\n checked={allCandidatesSelected}\n indeterminate={someCandidatesSelected}\n disabled={selectionCandidates.length === 0}\n label={\n allCandidatesSelected\n ? localeText.checkboxSelectionUnselectAllRows\n : localeText.checkboxSelectionSelectAllRows\n }\n onChange={toggleAllCandidates}\n onClick={(event) => event.stopPropagation()}\n />\n );\n } else if (field === DETAIL_PANEL_TOGGLE_FIELD) {\n content = null;\n } else {\n content = col.renderHeader ? (\n col.renderHeader(headerParams)\n ) : (\n <span className=\"mgh-grid-header-title\">{col.headerName ?? field}</span>\n );\n }\n\n return (\n <div\n key={field}\n role=\"columnheader\"\n aria-colindex={index + 1}\n aria-sort={sortItem ? (sortItem.sort === 'asc' ? 'ascending' : 'descending') : sortable ? 'none' : undefined}\n data-mgh-field={field}\n title={col.description}\n tabIndex={-1}\n draggable={draggable}\n className={cx(\n 'mgh-grid-header-cell',\n `mgh-grid-header-cell--align-${col.headerAlign ?? 'left'}`,\n pinnedClasses(lc, 'mgh-grid-header-cell'),\n sortable && 'mgh-grid-header-cell--sortable',\n field === CHECKBOX_FIELD && 'mgh-grid-header-cell--checkbox',\n field === DETAIL_PANEL_TOGGLE_FIELD && 'mgh-grid-header-cell--detail-toggle',\n index === layout.columns.length - 1 && 'mgh-grid-header-cell--last',\n isDragging && 'mgh-grid-header-cell--dragging',\n isDropTarget && drag?.side === 'left' && 'mgh-grid-header-cell--drop-left',\n isDropTarget && drag?.side === 'right' && 'mgh-grid-header-cell--drop-right',\n menuOpen && 'mgh-grid-header-cell--menu-open',\n customClass\n )}\n style={cellStyle(lc)}\n onClick={(event) => {\n if (!sortable || resizingField) return;\n sortColumn(field, undefined, event.shiftKey);\n }}\n onDragStart={(event) => {\n if (!draggable) return;\n event.dataTransfer.effectAllowed = 'move';\n try {\n event.dataTransfer.setData('text/plain', field);\n } catch {\n /* ignore */\n }\n setDrag({ field, overField: null, side: 'left' });\n }}\n onDragOver={(event) => {\n if (!drag || drag.field === field) return;\n const sourceLc = layout.columns.find((c) => c.col.field === drag.field);\n if (!sourceLc || sourceLc.pinned !== lc.pinned || !canReorder(col)) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = 'move';\n const rect = event.currentTarget.getBoundingClientRect();\n const side = event.clientX < rect.left + rect.width / 2 ? 'left' : 'right';\n if (drag.overField !== field || drag.side !== side) setDrag({ ...drag, overField: field, side });\n }}\n onDragLeave={() => {\n if (drag && drag.overField === field) setDrag({ ...drag, overField: null });\n }}\n onDrop={(event) => handleDrop(lc, event)}\n onDragEnd={() => setDrag(null)}\n >\n <div className=\"mgh-grid-header-title-container\">\n {content}\n {sortable && (\n <span\n className={cx('mgh-grid-sort-icon', sortItem && 'mgh-grid-sort-icon--active')}\n aria-hidden=\"true\"\n >\n {sortItem?.sort === 'desc' ? <ArrowDownwardIcon size={18} /> : <ArrowUpwardIcon size={18} />}\n {sortItem && sortModel.filter((s) => s.sort).length > 1 && (\n <span className=\"mgh-grid-sort-index\">{sortIndex + 1}</span>\n )}\n </span>\n )}\n </div>\n {showMenu && (\n <IconButton\n size=\"small\"\n className={cx('mgh-grid-header-menu-btn', menuOpen && 'mgh-grid-header-menu-btn--open')}\n label={localeText.columnMenuLabel}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n tabIndex={-1}\n onClick={(event) => {\n event.stopPropagation();\n setColumnMenu((prev) =>\n prev?.field === field ? null : { field, anchorEl: event.currentTarget }\n );\n }}\n onMouseDown={(event) => event.stopPropagation()}\n >\n <MoreVertIcon />\n </IconButton>\n )}\n {resizable && (\n <div\n className={cx('mgh-grid-resize-handle', resizingField === field && 'mgh-grid-resize-handle--active')}\n role=\"separator\"\n aria-orientation=\"vertical\"\n onPointerDown={(event) => handleResizeStart(lc, event)}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => {\n event.stopPropagation();\n autosizeColumns({ columns: [field] });\n }}\n draggable={false}\n onDragStart={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n />\n )}\n </div>\n );\n };\n\n /* ------------------------------------------------------------------ rendering: slots */\n\n const ToolbarSlot = slots.toolbar === null ? null : (slots.toolbar ?? MGHGridToolbar);\n const FooterSlot = slots.footer === null ? null : (slots.footer ?? MGHGridFooter);\n const NoRowsOverlaySlot = slots.noRowsOverlay ?? MGHGridNoRowsOverlay;\n const LoadingOverlaySlot = slots.loadingOverlay ?? MGHGridLoadingOverlay;\n const mergedToolbarProps = { ...toolbarProps, ...slotProps.toolbar };\n const noRowsProps = { text: noRowsText, ...slotProps.noRowsOverlay };\n const loadingProps = { ...slotProps.loadingOverlay };\n\n const showNoRows = !loading && pagedRows.length === 0;\n const menuColumn = columnMenu ? getColumn(columnMenu.field) : undefined;\n\n const cardStyles: React.CSSProperties = {\n height: 'auto',\n flexGrow: 1,\n ...sanitizeStyle(cardSx),\n ...sanitizeStyle(cardStyle),\n ...(themeVars as any),\n };\n const boxStyles: React.CSSProperties = { flexGrow: 1, ...sanitizeStyle(boxSx), ...sanitizeStyle(boxStyle) };\n const rootStyles: React.CSSProperties = {\n ...sanitizeStyle(sx),\n ...sanitizeStyle(style),\n ['--mgh-grid-header-height' as any]: `${headerHeight}px`,\n ['--mgh-grid-row-height' as any]: `${rowHeight}px`,\n };\n\n // Nested selectors from sx/style props become a <style> block scoped to this grid instance.\n const scopedCss = React.useMemo(() => {\n const css: string[] = [];\n buildScopedCss(`[data-mgh-grid-id=\"${gridId}\"]`, sx, css);\n buildScopedCss(`[data-mgh-grid-id=\"${gridId}\"]`, style, css);\n buildScopedCss(`[data-mgh-grid-card=\"${gridId}\"]`, cardSx, css);\n buildScopedCss(`[data-mgh-grid-card=\"${gridId}\"]`, cardStyle, css);\n buildScopedCss(`[data-mgh-grid-box=\"${gridId}\"]`, boxSx, css);\n buildScopedCss(`[data-mgh-grid-box=\"${gridId}\"]`, boxStyle, css);\n return css.join('\\n');\n }, [gridId, sx, style, cardSx, cardStyle, boxSx, boxStyle]);\n\n const smDown = viewportWidth > 0 && viewportWidth < 600;\n\n const grid = (\n <div\n ref={rootRef}\n id={gridId}\n data-mgh-grid-id={gridId}\n role=\"grid\"\n aria-rowcount={rowCount + 1}\n aria-colcount={layout.columns.length}\n aria-multiselectable={checkboxSelection && !disableMultipleRowSelection ? true : undefined}\n aria-busy={loading || undefined}\n className={cx(\n 'mgh-grid',\n autoHeight && 'mgh-grid--auto-height',\n !layout.hasPinning && 'mgh-grid--no-pinned-shadow',\n className\n )}\n style={rootStyles}\n onKeyDown={handleKeyDown}\n >\n {showToolbar && ToolbarSlot && (\n <div ref={toolbarRef}>\n <ToolbarSlot {...mergedToolbarProps} />\n </div>\n )}\n <div className=\"mgh-grid-main\">\n <div ref={scrollerRef} className=\"mgh-grid-scroller\" onScroll={handleScroll} tabIndex={-1}>\n <div className=\"mgh-grid-columns\" role=\"rowgroup\" style={{ width: layout.totalWidth }}>\n <div className=\"mgh-grid-header-row\" role=\"row\" aria-rowindex={1} style={{ height: headerHeight }}>\n {layout.columns.map((lc, index) => renderHeaderCell(lc, index))}\n <div className=\"mgh-grid-header-filler\" />\n </div>\n </div>\n {pinnedRows?.top && pinnedRows.top.length > 0 && (\n <div\n className=\"mgh-grid-pinned-rows mgh-grid-pinned-rows--top\"\n role=\"rowgroup\"\n style={{ top: headerHeight, width: layout.totalWidth }}\n >\n {renderPinnedRows(pinnedRows.top, 'top')}\n </div>\n )}\n <div\n className={cx('mgh-grid-body', virtual ? 'mgh-grid-body--virtual' : 'mgh-grid-body--flow')}\n role=\"rowgroup\"\n style={\n virtual\n ? { height: heights.total, width: layout.totalWidth }\n : { width: layout.totalWidth, minHeight: showNoRows || loading ? 120 : undefined }\n }\n >\n {renderBodyRows()}\n </div>\n {((pinnedRows?.bottom && pinnedRows.bottom.length > 0) || footerAggregates) && (\n <div\n className=\"mgh-grid-pinned-rows mgh-grid-pinned-rows--bottom\"\n role=\"rowgroup\"\n style={{ width: layout.totalWidth }}\n >\n {renderPinnedRows(pinnedRows?.bottom, 'bottom')}\n </div>\n )}\n </div>\n {loading && (\n <div className=\"mgh-grid-overlay mgh-grid-overlay--loading\" style={{ top: headerHeight }}>\n <LoadingOverlaySlot {...loadingProps} />\n </div>\n )}\n {showNoRows && (\n <div className=\"mgh-grid-overlay\" style={{ top: headerHeight }}>\n <NoRowsOverlaySlot {...noRowsProps} />\n </div>\n )}\n </div>\n {!hideFooter && FooterSlot && <FooterSlot {...slotProps.footer} />}\n\n <Popover\n open={preferencePanel.open}\n anchorEl={preferencePanel.anchorEl}\n onClose={hidePreferences}\n themeMode={themeMode}\n placement=\"bottom-start\"\n autoFocus\n >\n {preferencePanel.openedPanelValue === 'columns' ? <MGHGridColumnsPanel /> : <MGHGridFilterPanel />}\n </Popover>\n\n {menuColumn && columnMenu && (\n <MGHGridColumnMenu\n column={menuColumn}\n anchorEl={columnMenu.anchorEl}\n open\n onClose={() => setColumnMenu(null)}\n themeMode={themeMode}\n panelAnchorEl={toolbarRef.current}\n />\n )}\n </div>\n );\n\n return (\n <MGHGridContext.Provider value={contextValue}>\n <div\n className={cx('mgh-grid-card', disableCard && 'mgh-grid-card--plain', cardClassName)}\n data-mgh-theme={themeMode}\n data-mgh-grid-card={gridId}\n style={cardStyles}\n >\n {scopedCss && <style data-mgh-grid-sx={gridId}>{scopedCss}</style>}\n {!disableCard && (header !== undefined || renderHeaderCenterContent || renderHeaderEndContent) && (\n <div className=\"mgh-grid-card-header\">\n {header !== undefined && <h3 className=\"mgh-grid-card-title\">{header}</h3>}\n {renderHeaderCenterContent && (\n <div className=\"mgh-grid-card-header-center\">{renderHeaderCenterContent}</div>\n )}\n <div className=\"mgh-grid-card-header-end\" style={{ gap: smDown ? 8 : 16 }}>\n {renderHeaderEndContent}\n </div>\n </div>\n )}\n <div className={cx('mgh-grid-box', boxClassName)} data-mgh-grid-box={gridId} style={boxStyles}>\n {grid}\n </div>\n </div>\n </MGHGridContext.Provider>\n );\n}\n\nMGHGrid.displayName = 'MGHGrid';\n","import Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\n\nimport { ConfirmDialogProps } from './types';\nimport React from 'react';\n\n// ----------------------------------------------------------------------\n\nexport default function ConfirmDialog({ title, content, action, open, onClose, ...other }: ConfirmDialogProps) {\n return (\n <Dialog fullWidth maxWidth=\"xs\" open={open} onClose={onClose} {...other}>\n <DialogTitle sx={{ pb: 2 }}>{title}</DialogTitle>\n\n {content && <DialogContent sx={{ typography: 'body2' }}> {content} </DialogContent>}\n\n <DialogActions>\n <Button onClick={onClose}>Cancel</Button>\n {action}\n </DialogActions>\n </Dialog>\n );\n}\n","import {\n GridToolbarExportContainer,\n GridCsvExportMenuItem,\n GridExcelExportMenuItem,\n GridPrintExportMenuItem,\n} from '@mui/x-data-grid-premium';\nimport React from 'react';\nimport { ExportContainerProps } from './CustomGridToolbarExport.types';\n\n/// ---------------------------------------------------------------------------------------\n\nexport default function CustomGridToolbarExport({\n csvOptions = { allColumns: true },\n excelOptions = { allColumns: true },\n printOptions,\n // color,\n customMenuItem,\n ...other\n}: ExportContainerProps) {\n return (\n <GridToolbarExportContainer\n {...other}\n // color={color}\n >\n {customMenuItem}\n <GridCsvExportMenuItem options={csvOptions} />\n <GridExcelExportMenuItem options={excelOptions} />\n <GridPrintExportMenuItem options={printOptions} />\n </GridToolbarExportContainer>\n );\n}\n","import { JSX } from 'react';\n\nimport { Dialog, Typography, DialogContent, CircularProgress } from '@mui/material';\nimport React from 'react';\n\n/// ---------------------------------------------------------------------------------------\n\ninterface ExportingProps {\n open: boolean;\n text?: JSX.Element | string;\n}\nexport default function ExportingDialog({\n open,\n text = (\n <>\n Your export is currently being built. Some larger exports can take a couple of minutes to complete. <br />\n <br />\n Please do not close your browser or refresh the page.\n </>\n ),\n}: ExportingProps) {\n return (\n <Dialog open={open} fullWidth sx={{ p: 4 }}>\n <DialogContent sx={{ p: 4, textAlign: 'center' }}>\n <Typography variant=\"subtitle1\" sx={{ mb: 3 }}>\n {text}\n </Typography>\n <CircularProgress />\n </DialogContent>\n </Dialog>\n );\n}\n"],"names":["useResponsive","query","start","end","theme","useTheme","mediaUp","useMediaQuery","breakpoints","up","mediaDown","down","mediaBetween","between","mediaOnly","only","CustomNoRowsOverlay","text","useSettingsContext","themeMode","palette","mode","StyledGridOverlay","styled","display","alignItems","justifyContent","height","fill","fillOpacity","React","createElement","Box","component","alt","src","sx","width","maxWidth","mb","canUseLocalStorage","window","localStorage","readLocalStorage","key","value","getItem","JSON","parse","writeLocalStorage","setItem","stringify","MGHGridToolbar","showColumnsButton","showFilterButton","showExportButton","showQuickFilter","renderOtherButtons","renderDateRange","customMenuItem","showCsvOption","Toolbar","style","Tooltip","title","ColumnsPanelTrigger","render","ToolbarButton","GridViewColumnIcon","fontSize","FilterPanelTrigger","props","state","color","Badge","badgeContent","filterCount","variant","GridFilterListIcon","CustomGridToolbarExport","DataGridQuickFilter","csvOptions","allColumns","excelOptions","printOptions","other","GridToolbarExportContainer","map","el","GridCsvExportMenuItem","options","GridExcelExportMenuItem","GridPrintExportMenuItem","StyledQuickFilter","QuickFilter","StyledToolbarButton","ownerState","gridArea","zIndex","opacity","expanded","pointerEvents","transition","transitions","create","StyledTextField","TextField","overflowX","QuickFilterTrigger","triggerProps","enterDelay","GridSearchIcon","QuickFilterControl","ref","controlProps","inputRef","placeholder","size","slotProps","input","startAdornment","InputAdornment","position","endAdornment","QuickFilterClear","edge","material","marginRight","GridCloseIcon","Iconify","forwardRef","icon","Icon","StyledLabel","lightMode","filledVariant","outlinedVariant","softVariant","defaultStyle","common","white","grey","backgroundColor","primary","border","secondary","alpha","colorStyle","contrastText","main","minWidth","lineHeight","borderRadius","cursor","whiteSpace","textTransform","padding","spacing","typography","pxToRem","fontWeight","fontWeightBold","duration","shorter","Label","children","startIcon","endIcon","iconStyles","objectFit","pl","pr","mr","ml","GROUPING_COLUMN_FIELD","CHECKBOX_FIELD","DETAIL_PANEL_TOGGLE_FIELD","AGGREGATION_FOOTER_ID","INTERNAL_FIELDS","Set","DENSITY_FACTORS","compact","standard","comfortable","DEFAULT_ROW_HEIGHT","DEFAULT_HEADER_HEIGHT","DEFAULT_COLUMN_MIN_WIDTH","isInternalField","field","has","isNil","isEmptyValue","Array","isArray","length","clamp","min","max","Math","cx","classNames","filter","Boolean","join","uniqueId","counter","prefix","getRowIdFromRow","row","getRowId","id","normalizeSelectionModel","allIds","type","ids","forEach","add","toDate","Date","Number","isNaN","getTime","dayjs","isDayjs","isValid","d","parsed","formatDate","withTime","date","format","startOfUnit","startOf","valueOf","isValueOptionObject","option","getOptionValue","col","getOptionLabel","label","String","resolveValueOptions","valueOptions","getCellValue","api","raw","undefined","valueGetter","defaultFormatValue","match","find","isFinite","getFormattedValue","valueFormatter","formattedValueToString","formatted","collator","Intl","Collator","numeric","sensitivity","nilFirst","v1","v2","n1","n2","numberComparator","nil","stringComparator","s1","s2","compare","stringOrNumberComparator","p1","p2","dateComparator","d1","d2","booleanComparator","getDefaultComparator","lower","toLowerCase","hasValue","item","stringFilterOperators","inputType","getApplyFilterFn","needle","indexOf","s","lastIndexOf","requiresFilterValue","set","numberOperator","filterValue","cell","n","numberFilterOperators","a","b","v","dateOperator","filterDate","filterTime","cellDate","getDateFilterOperators","booleanFilterOperators","expected","singleSelectFilterOperators","getColumnFilterOperators","filterOperators","getDefaultFilterOperators","normalizeColumn","isNumber","isBoolean","isActions","headerName","align","headerAlign","sortable","filterable","hideable","resizable","pinnable","groupable","aggregable","editable","disableColumnMenu","disableExport","internalColumn","disableReorder","CHECKBOX_COLUMN_DEF","DETAIL_PANEL_TOGGLE_COLUMN_DEF","UNITLESS_PROPERTIES","isSelectorKey","test","serializeDeclarations","block","Object","keys","property","kebab","replace","m","toKebabCase","formatCssValue","buildScopedCss","scope","out","charAt","inner","declarations","push","selector","scopeSelector","split","part","trim","numericValues","values","BUILT_IN_AGGREGATION_FUNCTIONS","sum","columnTypes","apply","nums","reduce","acc","avg","defined","every","dates","slice","sort","sorted","DEFAULT_LOCALE_TEXT","noRowsLabel","loadingLabel","toolbarColumns","toolbarFilters","toolbarExport","toolbarDensity","toolbarQuickFilterPlaceholder","toolbarQuickFilterLabel","toolbarExportCSV","toolbarExportExcel","toolbarExportPrint","densityCompact","densityStandard","densityComfortable","columnsPanelSearchPlaceholder","columnsPanelShowAll","columnsPanelHideAll","columnsPanelReset","filterPanelAddFilter","filterPanelRemoveAll","filterPanelDeleteIcon","filterPanelColumns","filterPanelOperator","filterPanelValue","filterPanelInputPlaceholder","filterPanelLogicOperator","filterPanelOperatorAnd","filterPanelOperatorOr","columnMenuSortAsc","columnMenuSortDesc","columnMenuUnsort","columnMenuFilter","columnMenuHideColumn","columnMenuManageColumns","columnMenuPinLeft","columnMenuPinRight","columnMenuUnpin","columnMenuGroup","name","columnMenuUngroup","columnMenuAggregation","aggregationMenuItemHeader","aggregationFunctionLabelNone","aggregationFunctionLabelSum","aggregationFunctionLabelAvg","aggregationFunctionLabelMin","aggregationFunctionLabelMax","aggregationFunctionLabelSize","footerRowSelected","count","toLocaleString","footerTotalRows","footerPaginationRowsPerPage","footerPaginationDisplayedRows","from","to","footerPaginationFirstPage","footerPaginationPreviousPage","footerPaginationNextPage","footerPaginationLastPage","checkboxSelectionHeaderName","checkboxSelectionSelectAllRows","checkboxSelectionUnselectAllRows","checkboxSelectionSelectRow","checkboxSelectionUnselectRow","booleanCellTrueLabel","booleanCellFalseLabel","detailPanelToggle","expandDetailPanel","collapseDetailPanel","groupingColumnHeaderName","groupColumn","unGroupColumn","actionsCellMore","columnHeaderSortIconLabel","columnMenuLabel","clearSearch","measureContext","measureText","font","document","canvas","getContext","downloadBlob","blob","fileName","url","URL","createObjectURL","anchor","href","download","body","appendChild","click","setTimeout","removeChild","revokeObjectURL","MGH_GRID_STYLE_ID","MGH_GRID_CSS","injected","useInsertion","useInsertionEffect","useLayoutEffect","useEffect","useMGHGridStyles","injectStyles","getElementById","setAttribute","textContent","head","MGHGridContext","createContext","displayName","useMGHGridContext","ctx","useContext","Error","useLatestRef","useRef","current","useControlledState","controlled","defaultValue","onChange","isControlled","internal","setInternal","useState","valueRef","controlledRef","onChangeRef","useCallback","next","resolved","is","idCounter","buildExportTable","columns","resolveExportColumns","all","getAllColumns","fields","byField","Map","c","f","get","getVisibleColumns","getRowsToExport","getSortedRowIds","rows","getRow","headers","sanitizeFileName","fallback","extension","base","endsWith","defaultFileBase","escapeCsvCell","delimiter","getDataAsCsv","includeHeaders","table","lines","h","cells","useRawValues","UTF8_BOM","fromCharCode","CRC_TABLE","Uint32Array","k","textEncoder","TextEncoder","encodeUtf8","encode","utf8","unescape","encodeURIComponent","Uint8Array","i","charCodeAt","concatBytes","chunks","total","offset","zipStore","entries","localChunks","centralChunks","entry","nameBytes","crc","bytes","crc32","data","local","lv","DataView","buffer","setUint32","setUint16","central","cv","centralDirectory","eocd","ev","concat","INVALID_XML_CHARS","RegExp","escapeXml","stripInvalidXml","columnLetter","index","letters","rem","floor","XML_HEADER","buildSheetXml","columnWidths","rowsXml","rowIndex","inlineString","xmlCells","UTC","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","lastCol","lastRow","cols","w","STYLES_XML","CONTENT_TYPES_XML","ROOT_RELS_XML","WORKBOOK_RELS_XML","buildWorkbookXml","sheetName","buildCoreXml","now","toISOString","APP_XML","buildXlsx","widths","explicit","columnsStyles","r","len","cleaned","sanitizeSheetName","escapeHtml","keyToString","buildGroupTree","groupingFields","columnsByField","emptyLabel","build","items","depth","parentId","path","buckets","getGroupingValue","groupingValueGetter","keyStr","node","parent","groupingField","groupingKey","groupingLabel","childGroups","leaves","descendants","nodes","collectTreeLeaves","roots","root","aggregateRows","aggregationModel","functions","result","fnName","fn","createIcon","className","rest","viewBox","focusable","ViewColumnIcon","FilterListIcon","SearchIcon","CloseIcon","DownloadIcon","ArrowUpwardIcon","ArrowDownwardIcon","MoreVertIcon","CheckIcon","ExpandMoreIcon","ChevronRightIcon","ChevronLeftIcon","FirstPageIcon","LastPageIcon","PushPinIcon","DeleteIcon","AddIcon","DensitySmallIcon","DensityMediumIcon","DensityLargeIcon","DragIndicatorIcon","PrintIcon","TableChartIcon","DescriptionIcon","VisibilityOffIcon","FunctionsIcon","WorkspacesIcon","EmptyBoxIcon","Fragment","Button","active","IconButton","TextInput","Select","Field","htmlFor","Checkbox","indeterminate","forwardedRef","innerRef","setRef","Spinner","role","Popover","open","anchorEl","onClose","placement","autoFocus","ignoreOutsideClickOn","setPosition","top","left","ready","update","vw","innerWidth","vh","innerHeight","offsetWidth","offsetHeight","isConnected","getBoundingClientRect","right","bottom","prev","addEventListener","observer","ResizeObserver","observe","removeEventListener","disconnect","handlePointerDown","event","target","contains","some","closest","handleKeyDown","querySelector","focus","stop","stopPropagation","createPortal","tabIndex","visibility","onClick","onDoubleClick","onMouseDown","onKeyDown","Menu","first","querySelectorAll","preventDefault","currentIndex","activeElement","MenuItem","selected","disabled","hideMenu","MenuDivider","MenuSection","MGHGridColumnsButton","localeText","isOpen","preferencePanel","openedPanelValue","hidePreferences","showPreferences","currentTarget","MGHGridFiltersButton","MGHGridDensitySelector","setAnchor","o","density","setDensity","MGHGridExportMenuItem","MGHGridExportMenu","showExcelOption","showPrintOption","rootProps","customItems","Children","child","isValidElement","cloneElement","resolvedPrintOptions","header","exportDataAsCsv","exportDataAsExcel","exportDataAsPrint","MGHGridQuickFilter","debounceMs","alwaysExpanded","externalValue","quickFilterValues","setText","setExpanded","timer","delay","quickFilterDebounceMs","lastExternal","clearTimeout","commit","setQuickFilterValues","clear","isExpanded","expand","handleChange","onBlur","blur","showDensitySelector","quickFilterPlaceholder","showColumns","disableColumnSelector","showFilters","disableColumnFilter","showDensity","disableDensitySelector","MGHGridPagination","page","pageSize","paginationModel","rowCount","pageCount","pageSizeOptions","setPageSize","setPage","MGHGridFooter","selectedCount","rowSelectionModel","showSelected","hideFooterSelectedRowCount","showPagination","pagination","hideFooterPagination","showRowCount","hideFooterRowCount","MGHGridColumnsPanel","visibleColumns","visibleFields","useMemo","search","setSearch","model","columnVisibilityModel","filtered","setAll","visible","setColumnVisibilityModel","checked","setColumnVisibility","useDebouncedValue","onCommit","setLocal","TextValueInput","MultiValueInput","column","joined","multiple","selectedOptions","FilterValueInput","operator","InputComponent","Component","applyValue","createFilterItem","MGHGridFilterPanel","filterableColumns","filterModel","logicOperator","targetField","seeded","upsertFilterItem","updateItem","patch","canAddMore","disableMultipleColumnsFiltering","paddingTop","operators","op","showLogic","deleteFilterItem","setFilterLogicOperator","nextColumn","nextOperators","keepOperator","nextOperator","nextIsMulti","currentIsMulti","addItem","setFilterModel","MGHGridColumnMenu","panelAnchorEl","isGroupingColumn","sortItem","sortModel","pinned","isColumnPinned","isGrouped","rowGroupingModel","aggregation","canSort","disableColumnSorting","canFilter","canHide","canPin","disableColumnPinning","canGroup","disableRowGrouping","aggregationFunctions","availableAggregationFunctions","canAggregate","disableAggregation","anchorForPanel","sortColumn","showFilterPanel","transform","pinColumn","unpinColumn","removeRowGroupingCriteria","addRowGroupingCriteria","gap","setAggregationModel","MGHGridNoRowsOverlay","imageSrc","MGHGridLoadingOverlay","MGHGridActionsCellItem","showInMenu","ActionsCell","actions","moreLabel","inline","inMenu","action","EMPTY_ARRAY","EMPTY_OBJECT","EMPTY_MAP","DEFAULT_SORTING_ORDER","DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_FILTER_MODEL","quickFilterExcludeHiddenColumns","sanitizeStyle","toDateInputValue","pad","padStart","MGHGrid","columnsProp","loading","renderHeaderEndContent","renderHeaderCenterContent","disableCard","cardClassName","boxClassName","cardStyle","cardSx","boxStyle","boxSx","themeVars","showToolbar","toolbarProps","slots","noRowsText","localeTextProp","rowHeight","rowHeightProp","columnHeaderHeight","getRowHeight","autoHeight","disableVirtualization","densityProp","onDensityChange","paginationModelProp","onPaginationModelChange","hideFooter","sortModelProp","onSortModelChange","sortingOrder","disableMultipleColumnsSorting","filterModelProp","onFilterModelChange","columnVisibilityModelProp","onColumnVisibilityModelChange","columnVisibilityStorageKey","columnOrderStorageKey","columnWidthStorageKey","pinnedColumnsStorageKey","onColumnOrderChange","onColumnWidthChange","disableColumnResize","disableColumnReorder","pinnedColumns","pinnedColumnsProp","onPinnedColumnsChange","checkboxSelection","checkboxSelectionVisibleOnly","disableRowSelectionOnClick","disableMultipleRowSelection","rowSelectionModelProp","onRowSelectionModelChange","isRowSelectable","keepNonExistentRowsSelected","getRowClassName","onRowClick","onRowDoubleClick","onCellClick","onCellDoubleClick","pinnedRows","getDetailPanelContent","getDetailPanelHeight","detailPanelExpandedRowIds","detailPanelExpandedRowIdsProp","onDetailPanelExpandedRowIdsChange","rowGroupingModelProp","onRowGroupingModelChange","defaultGroupingExpansionDepth","groupingColDef","isGroupExpandedByDefault","aggregationModelProp","onAggregationModelChange","aggregationFunctionsProp","aggregationPosition","processRowUpdate","onProcessRowUpdateError","onCellEditStop","isCellEditable","initialState","apiRef","onStateChange","gridId","reactUseId","useId","useStableId","rootRef","scrollerRef","toolbarRef","forceUpdate","setTick","t","useForceUpdate","latest","getDetails","apiObject","L","apiImpl","rowsById","getRowModels","getAllRowIds","rowEntries","e","getRowNode","nodesById","getSortedRows","sortedLeaves","getVisibleRows","pagedRows","dr","getRowIndexRelativeToVisibleRows","findIndex","updateRows","updates","existing","setRowOverride","orderedUserColumns","visibleUserColumns","getColumn","getColumnIndex","useVisibleColumns","getColumnVisibilityModel","isVisible","setColumnWidth","setColumnIndex","targetIndex","autosizeColumns","side","getPinnedColumns","setPinnedColumns","getSortModel","setSortModel","direction","allowMultipleSorting","getFilterModel","upsertFilterItems","targetColumnField","hideFilterPanel","panel","getSelectedRows","selectedIds","getRowSelectionModel","setRowSelectionModel","normalized","setSelectedIds","selectRow","isSelected","resetSelection","selectRows","isRowSelected","isRowSelectableFn","nextPage","setPaginationModel","nextPageSize","csv","bom","utf8WithBom","Blob","async","headerHtml","bodyHtml","html","pageStyle","iframe","cleanup","parentNode","onload","win","contentWindow","onafterprint","print","doc","contentDocument","write","close","srcdoc","toggleDetailPanel","setExpandedDetailPanels","getExpandedDetailPanels","expandedDetailPanels","getRowGroupingModel","setRowGroupingModel","groupingIndex","splice","setRowChildrenExpansion","getRowGroupChildren","groupId","group","groupsById","getAggregationModel","startCellEditMode","stopCellEditMode","ignoreModifications","getCellMode","editing","editingCell","setEditCellValue","setEditValue","getCellParams","buildCellParams","setCellFocus","pendingFocusRef","setFocusedCell","scrollToIndexes","params","scroll","scroller","scrollLeft","scrollTop","getScrollPosition","rootElementRef","persisted","order","sorting","rowGrouping","controlledExpandedDetail","detailPanel","expandedRowIds","controlledSelection","orderedFields","setOrderedFields","setColumnWidths","dims","dimensions","groupExpansion","setGroupExpansion","setEditingCell","editValue","focusedCell","setPreferencePanel","columnMenu","setColumnMenu","resizingField","setResizingField","drag","setDrag","setScrollTop","scrollRaf","lastClickedIdRef","overrideState","setOverrideState","rowOverrides","viewportWidth","viewportHeight","enabled","setSize","clientWidth","clientHeight","useElementSize","densityFactor","round","headerHeight","userColumns","groupingActive","groupingColumn","single","seen","isColumnVisible","layout","leftFields","rightFields","visibleByField","center","ordered","computeWidths","available","overrides","Infinity","override","flex","pool","fixedTotal","remainingSpace","remainingFlex","changed","share","fixed","idx","hasPinning","x","leftOffset","isLeft","isRight","isLastLeft","isFirstRight","rightOffset","totalWidth","leftCount","rightCount","allDisplayColumnsByField","activeFilters","quickFilterColumns","filteredEntries","logicAnd","quickAnd","quickFilterLogicOperator","apiRefLocal","quickFns","lowered","getApplyQuickFilterFn","custom","results","compareEntries","sorters","dir","comparator","sortComparator","sortEntries","aggregationActive","isGroupExpanded","leafIds","processed","displayRows","tree","groupingSort","sortGroupTree","compareGroups","sortLeaves","sortLevel","flattenGroupTree","visit","groupNode","toGroupNode","l","childVisible","leaf","leafNode","totalDisplayRows","ceil","footerAggregates","rowsForFooter","groupAggregatesCache","getGroupAggregates","cached","heights","rowHeights","detailHeights","offsets","hasAuto","dh","virtual","virtualRange","overscan","viewTop","viewBottom","lo","hi","mid","handleScroll","requestAnimationFrame","cancelAnimationFrame","selectionCandidates","selectedCandidateCount","allCandidatesSelected","someCandidatesSelected","updateSelection","updater","selectionModelsEqual","equal","delete","lastId","toggleAllCandidates","allowMultiple","persistOrder","persistWidths","targets","lc","computed","getComputedStyle","fontFamily","cellFont","headerFont","sample","isCellEditableFn","colDef","rowNode","reason","valueParser","parseEditValue","currentValue","applyRowUpdate","newRow","oldRow","Promise","resolve","then","rowId","catch","error","console","valueSetter","previousGroupingKey","formattedValue","hasFocus","cellMode","isEditable","buildRowParams","preventScroll","visibleTop","visibleBottom","scrollIntoView","colIndex","leftPinnedWidth","rightPinnedWidth","visibleLeft","visibleRight","moveFocus","rowDelta","colDelta","absolute","canReorder","resizeRef","totalRowCount","clamped","oldIndex","moveItem","list","unshift","nextItems","withId","random","toString","contextValue","renderCellContent","renderRow","kind","selectable","content","hideCount","hideDescendantCount","paddingLeft","agg","aggregates","sampleRow","cancel","renderEditCell","onValueChange","renderEditor","renderCell","getActions","cellStyle","pinnedClasses","rowIsClickable","renderRowElement","customClass","indexRelativeToCurrentPage","isFirstVisible","isFirst","isLastVisible","isLast","isAuto","minHeight","handleRowSelectionClick","allSelected","shiftKey","ctrlKey","metaKey","isFocused","isEditing","isAggregation","cellClassName","isCheckbox","isDetailToggle","toRenderRow","renderPinnedRows","renderHeaderCell","sortIndex","showMenu","draggable","isDragging","isDropTarget","overField","menuOpen","headerParams","headerClassName","renderHeader","description","onDragStart","dataTransfer","effectAllowed","setData","onDragOver","sourceLc","dropEffect","rect","clientX","onDragLeave","onDrop","handleDrop","targetLc","without","onDragEnd","onPointerDown","handleResizeStart","startX","startWidth","lastWidth","onMove","onUp","ToolbarSlot","toolbar","FooterSlot","footer","NoRowsOverlaySlot","noRowsOverlay","LoadingOverlaySlot","loadingOverlay","mergedToolbarProps","noRowsProps","loadingProps","showNoRows","menuColumn","cardStyles","flexGrow","boxStyles","rootStyles","scopedCss","css","smDown","grid","tagName","pageRows","onScroll","renderBodyRows","detailHeight","detailContent","detailAuto","rowAuto","Provider","Dialog","fullWidth","DialogTitle","pb","DialogContent","DialogActions","p","textAlign","Typography","CircularProgress","persistedColumnVisibilityModel","persistedOrderedFields","normalizeOrderedFields","columnFields","resolvedColumnVisibilityModel","handleColumnVisibilityModelChange","details","handleColumnOrderChange","mergedInitialState","Card","CardHeader","flexWrap","flexDirection","DataGridPremium","disableRowSelectionExcludeModel","useMGHGridApiContext","useMGHGridApiRef","useMGHGridLocaleText"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/hooks/useResponsive.ts","../src/components/CustomNoRowsOverlay/CustomNoRowsOverlay.tsx","../src/components/MGHDataGrid/MGHDataGrid.tsx","../src/components/iconify/iconify.tsx","../src/components/Label/styles.ts","../src/components/Label/Label.tsx","../src/components/MGHGrid/utils.ts","../src/components/MGHGrid/MGHGrid.styles.ts","../src/components/MGHGrid/context.tsx","../src/components/MGHGrid/hooks.ts","../src/components/MGHGrid/export.ts","../src/components/MGHGrid/print.ts","../src/components/MGHGrid/grouping.ts","../src/components/MGHGrid/icons.tsx","../src/components/MGHGrid/components/primitives.tsx","../src/components/MGHGrid/components/Toolbar.tsx","../src/components/MGHGrid/components/Footer.tsx","../src/components/MGHGrid/components/ColumnsPanel.tsx","../src/components/MGHGrid/components/FilterPanel.tsx","../src/components/MGHGrid/components/ColumnMenu.tsx","../src/components/MGHGrid/components/Overlays.tsx","../src/components/MGHGrid/components/ActionsCell.tsx","../src/components/MGHGrid/MGHGrid.tsx","../src/components/MGHDateRangePicker/MGHDateRangePicker.styles.ts","../src/components/MGHDateRangePicker/icons.tsx","../src/components/MGHDateRangePicker/utils.ts","../src/components/MGHDateRangePicker/MGHDateRangeCalendar.tsx","../src/components/MGHDateRangePicker/MGHDateRangePicker.tsx","../src/components/Confirm-Dialog/confirm-dialog.tsx","../src/components/CustomGridToolbarExport/CustomGridToolbarExport.tsx","../src/components/Exporting/Exporting-Dialog.tsx"],"sourcesContent":["import useMediaQuery from '@mui/material/useMediaQuery';\nimport { useTheme, Breakpoint } from '@mui/material/styles';\n\n// ----------------------------------------------------------------------\n\ntype ReturnType = boolean;\n\nexport type Query = 'up' | 'down' | 'between' | 'only';\n\nexport type Value = Breakpoint | number;\n\nexport function useResponsive(query: Query, start?: Value, end?: Value): ReturnType {\n const theme = useTheme();\n\n const mediaUp = useMediaQuery(theme.breakpoints.up(start as Value));\n\n const mediaDown = useMediaQuery(theme.breakpoints.down(start as Value));\n\n const mediaBetween = useMediaQuery(theme.breakpoints.between(start as Value, end as Value));\n\n const mediaOnly = useMediaQuery(theme.breakpoints.only(start as Breakpoint));\n\n if (query === 'up') {\n return mediaUp;\n }\n\n if (query === 'down') {\n return mediaDown;\n }\n\n if (query === 'between') {\n return mediaBetween;\n }\n\n return mediaOnly;\n}\n\n// ----------------------------------------------------------------------\n\ntype BreakpointOrNull = Breakpoint | null;\n\nexport function useWidth() {\n const theme = useTheme();\n\n const keys = [...theme.breakpoints.keys].reverse();\n\n return (\n keys.reduce((output: BreakpointOrNull, key: Breakpoint) => {\n const matches = useMediaQuery(theme.breakpoints.up(key));\n\n return !output && matches ? key : output;\n }, null) || 'xs'\n );\n}\n","import styled from '@emotion/styled';\n\nimport { Box } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport { NoRowsOverlayPropsOverrides } from '@mui/x-data-grid-premium';\n// import { NoRowsOverlayPropsOverrides } from '@mui/x-data-grid-premium';\n\nimport React from 'react';\n// import { NoRowsOverlayPropsOverrides } from './CustomNoRowsOverlay.types';\n\n/// ---------------------------------------------------------------------------------------\n\ndeclare module '@mui/x-data-grid-premium' {\n export interface NoRowsOverlayPropsOverrides {\n text: string;\n useSettingsContext?: () => { themeMode?: string };\n }\n}\n\n/// ---------------------------------------------------------------------------------------\n\nexport default function CustomNoRowsOverlay({ text, useSettingsContext }: NoRowsOverlayPropsOverrides) {\n const theme = useTheme();\n const themeMode = useSettingsContext?.()?.themeMode ?? theme.palette.mode ?? 'light';\n\n const StyledGridOverlay = styled('div')(() => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n '& .ant-empty-img-1': {\n fill: themeMode === 'light' ? '#aeb8c2' : '#262626',\n },\n '& .ant-empty-img-2': {\n fill: themeMode === 'light' ? '#f5f5f7' : '#595959',\n },\n '& .ant-empty-img-3': {\n fill: themeMode === 'light' ? '#dce0e6' : '#434343',\n },\n '& .ant-empty-img-4': {\n fill: themeMode === 'light' ? '#fff' : '#1c1c1c',\n },\n '& .ant-empty-img-5': {\n fillOpacity: themeMode === 'light' ? '0.8' : '0.08',\n fill: themeMode === 'light' ? '#f5f5f5' : '#fff',\n },\n }));\n return (\n <StyledGridOverlay>\n <Box\n component=\"img\"\n alt=\"empty content\"\n src=\"/assets/icons/empty/ic_content.svg\"\n sx={{ width: 50, maxWidth: 160 }}\n />\n <Box sx={{ mb: 0 }}>{text}</Box>\n </StyledGridOverlay>\n );\n}\n","import React, { JSX } from 'react';\nimport dayjs from 'dayjs';\n\nimport { DateRange } from '@mui/x-date-pickers-pro';\n// `GridInitialStatePremium` itself only lives under an internal (non-exported) subpath; the\n// package re-exports it under this name from its public entry point instead.\nimport { GridInitialState as GridInitialStatePremium } from '@mui/x-data-grid-premium';\nimport { Box, Card, Theme, Badge, styled, SxProps, Tooltip, TextField, CardHeader, InputAdornment } from '@mui/material';\nimport {\n Toolbar,\n GridColDef,\n QuickFilter,\n GridRowParams,\n ToolbarButton,\n GridCloseIcon,\n GridSearchIcon,\n DataGridPremium,\n GridToolbarProps,\n QuickFilterClear,\n GridEventListener,\n GridSlotsComponent,\n FilterPanelTrigger,\n GridViewColumnIcon,\n GridFilterListIcon,\n QuickFilterControl,\n QuickFilterTrigger,\n GridCallbackDetails,\n ColumnsPanelTrigger,\n GridRowHeightParams,\n GridCsvExportOptions,\n GridRowSelectionModel,\n GridCsvExportMenuItem,\n ToolbarPropsOverrides,\n GridRowClassNameParams,\n GridExcelExportOptions,\n GridPrintExportOptions,\n GridExcelExportMenuItem,\n GridPrintExportMenuItem,\n GridSlotsComponentsProps,\n GridExportDisplayOptions,\n GridRowHeightReturnValue,\n GridColumnVisibilityModel,\n GridToolbarExportContainer,\n GridPinnedRowsProp,\n} from '@mui/x-data-grid-premium';\nimport { useResponsive } from '../../hooks/useResponsive';\nimport CustomNoRowsOverlay from '../CustomNoRowsOverlay/CustomNoRowsOverlay';\n\ninterface CustomToolbarProps {\n dateValues: React.SetStateAction<DateRange<dayjs.Dayjs>>;\n setDateValues: React.Dispatch<React.SetStateAction<DateRange<dayjs.Dayjs>>>;\n renderDateRange?: React.ReactNode;\n customMenuItem?: JSX.Element[];\n currentParentFolderKey?: number | null;\n types?: any;\n typeKey?: number;\n setTypeKey?: React.Dispatch<React.SetStateAction<number>>;\n userData?: unknown;\n exporting?: boolean;\n setExporting?: React.Dispatch<React.SetStateAction<boolean>>;\n}\n\ninterface MGHDataGridProps {\n rows: any[];\n columns: GridColDef[];\n onRowClick?: GridEventListener<'rowClick'>;\n onRowDoubleClick?: GridEventListener<'rowDoubleClick'>;\n header: string;\n pagination?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n slots?: Partial<GridSlotsComponent>;\n slotProps?: GridSlotsComponentsProps & {\n toolbar?: Partial<GridToolbarProps & ToolbarPropsOverrides & CustomToolbarProps>;\n };\n toolbarProps?: any;\n initialState?: GridInitialStatePremium;\n sx?: SxProps<Theme>;\n cardSx?: SxProps<Theme>;\n boxSx?: SxProps<Theme>;\n columnVisibilityModel?: GridColumnVisibilityModel;\n onColumnVisibilityModelChange?: (model: GridColumnVisibilityModel, details: GridCallbackDetails) => void;\n columnVisibilityStorageKey?: string;\n columnOrderStorageKey?: string;\n disableDensitySelector?: boolean;\n disableRowSelectionOnClick?: boolean;\n disableColumnFilter?: boolean;\n disableColumnMenu?: boolean;\n disableColumnSelector?: boolean;\n renderHeaderEndContent?: JSX.Element;\n renderHeaderCenterContent?: JSX.Element;\n noRowsText?: string;\n checkboxSelection?: boolean;\n checkboxSelectionVisibleOnly?: boolean;\n onRowSelectionModelChange?:\n | ((rowSelectionModel: GridRowSelectionModel, details: GridCallbackDetails<any>) => void)\n | undefined;\n rowSelectionModel?: GridRowSelectionModel | undefined;\n getRowClassName?: ((params: GridRowClassNameParams<any>) => string) | undefined;\n getDetailPanelContent?: (params: GridRowParams<any>) => React.ReactNode;\n getDetailPanelHeight?: () => number;\n loading?: boolean;\n isRowSelectable?: (params: GridRowParams<any>) => boolean;\n getRowHeight?: ((params: GridRowHeightParams) => GridRowHeightReturnValue) | undefined;\n showToolbar?: boolean;\n hideFooterRowCount?: boolean;\n onColumnOrderChange?: GridEventListener<'columnOrderChange'> | undefined;\n defaultGroupingExpansionDepth?: number;\n pinnedRows?: GridPinnedRowsProp;\n keepNonExistentRowsSelected?: boolean;\n}\n\nconst canUseLocalStorage = () => typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nconst readLocalStorage = <T,>(key: string): T | null => {\n if (!canUseLocalStorage()) {\n return null;\n }\n try {\n const value = window.localStorage.getItem(key);\n return value ? (JSON.parse(value) as T) : null;\n } catch {\n return null;\n }\n};\n\nconst writeLocalStorage = (key: string, value: unknown) => {\n if (!canUseLocalStorage()) {\n return;\n }\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n return;\n }\n};\n\nconst normalizeOrderedFields = (orderedFields: string[] | null, columns: GridColDef[]) => {\n if (!orderedFields || orderedFields.length === 0) {\n return undefined;\n }\n const columnFields = new Set(columns.map((column) => column.field));\n return orderedFields.filter((field) => columnFields.has(field));\n};\n\nexport default function MGHDataGrid({\n header,\n rows,\n columns,\n onRowClick,\n onRowDoubleClick,\n pagination = true,\n pageSize = 25,\n slots = {},\n slotProps = {},\n toolbarProps = {},\n initialState = {},\n pageSizeOptions = [10, 25, 50, 100],\n sx = {},\n cardSx = { flexGrow: 1 },\n boxSx = { flexGrow: 1 },\n columnVisibilityModel,\n onColumnVisibilityModelChange,\n columnVisibilityStorageKey,\n columnOrderStorageKey,\n disableDensitySelector = false,\n disableRowSelectionOnClick = true,\n disableColumnFilter = false,\n disableColumnMenu = false,\n disableColumnSelector = false,\n checkboxSelectionVisibleOnly = false,\n renderHeaderEndContent,\n renderHeaderCenterContent,\n noRowsText = 'No data found within selected parameters.',\n checkboxSelection = false,\n onRowSelectionModelChange = undefined,\n rowSelectionModel = undefined,\n getRowClassName = undefined,\n getDetailPanelContent,\n getDetailPanelHeight,\n loading = false,\n isRowSelectable = undefined,\n getRowHeight,\n showToolbar = true,\n hideFooterRowCount = false,\n onColumnOrderChange = undefined,\n defaultGroupingExpansionDepth = undefined,\n pinnedRows = undefined,\n keepNonExistentRowsSelected = true,\n}: MGHDataGridProps) {\n const smDown = useResponsive('down', 'sm');\n const persistedColumnVisibilityModel = React.useMemo(() => {\n if (!columnVisibilityStorageKey) {\n return undefined;\n }\n return readLocalStorage<GridColumnVisibilityModel>(columnVisibilityStorageKey) ?? undefined;\n }, [columnVisibilityStorageKey]);\n\n const persistedOrderedFields = React.useMemo(() => {\n if (!columnOrderStorageKey) {\n return undefined;\n }\n const storedOrder = readLocalStorage<string[]>(columnOrderStorageKey);\n return normalizeOrderedFields(storedOrder, columns);\n }, [columnOrderStorageKey, columns]);\n\n const resolvedColumnVisibilityModel =\n columnVisibilityModel !== undefined ? columnVisibilityModel : persistedColumnVisibilityModel;\n\n const handleColumnVisibilityModelChange = React.useCallback(\n (model: GridColumnVisibilityModel, details: GridCallbackDetails) => {\n if (columnVisibilityStorageKey) {\n writeLocalStorage(columnVisibilityStorageKey, model);\n }\n onColumnVisibilityModelChange?.(model, details);\n },\n [columnVisibilityStorageKey, onColumnVisibilityModelChange]\n );\n\n const handleColumnOrderChange = React.useCallback<GridEventListener<'columnOrderChange'>>(\n (params, event, details) => {\n if (columnOrderStorageKey) {\n const orderedFields = details.api.getAllColumns().map((column) => column.field);\n writeLocalStorage(columnOrderStorageKey, orderedFields);\n }\n onColumnOrderChange?.(params, event, details);\n },\n [columnOrderStorageKey, onColumnOrderChange]\n );\n\n const mergedInitialState: GridInitialStatePremium = {\n density: 'compact',\n pagination: { paginationModel: { pageSize } },\n filter: {\n filterModel: {\n items: [],\n quickFilterExcludeHiddenColumns: false,\n },\n },\n ...initialState,\n columns: {\n ...initialState?.columns,\n columnVisibilityModel: resolvedColumnVisibilityModel ?? initialState?.columns?.columnVisibilityModel,\n orderedFields: persistedOrderedFields ?? initialState?.columns?.orderedFields,\n },\n };\n\n return (\n <Card sx={{ height: 'auto', ...cardSx }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', pr: 1 }}>\n <CardHeader title={header} sx={{ mb: 2 }} />\n {renderHeaderCenterContent}\n <Box\n sx={{\n display: 'flex',\n gap: smDown ? 1 : 2,\n alignItems: 'center',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n }}\n >\n {renderHeaderEndContent}\n </Box>\n </Box>\n <Box component=\"div\" sx={{ display: 'flex', flexDirection: 'column', flexGrow: 1, ...boxSx }}>\n <DataGridPremium\n loading={loading}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n rows={rows}\n columns={columns}\n pagination={pagination}\n disableDensitySelector={disableDensitySelector}\n disableRowSelectionOnClick={disableRowSelectionOnClick}\n disableColumnFilter={disableColumnFilter}\n disableColumnMenu={disableColumnMenu}\n disableColumnSelector={disableColumnSelector}\n slots={{ noRowsOverlay: CustomNoRowsOverlay, toolbar: MGHGridToolbar, ...slots }}\n slotProps={{ noRowsOverlay: { text: noRowsText }, toolbar: toolbarProps, ...slotProps }}\n initialState={mergedInitialState}\n pageSizeOptions={pageSizeOptions}\n sx={{\n '& .MuiDataGrid-row:hover': {\n cursor: onRowClick || onRowDoubleClick ? 'pointer' : 'default',\n },\n ...sx,\n }}\n \n onColumnVisibilityModelChange={handleColumnVisibilityModelChange}\n checkboxSelection={checkboxSelection}\n onRowSelectionModelChange={onRowSelectionModelChange}\n rowSelectionModel={rowSelectionModel}\n isRowSelectable={isRowSelectable}\n getRowClassName={getRowClassName}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n checkboxSelectionVisibleOnly={checkboxSelectionVisibleOnly}\n disableRowSelectionExcludeModel\n showToolbar={showToolbar}\n hideFooterRowCount={hideFooterRowCount}\n getRowHeight={getRowHeight}\n onColumnOrderChange={handleColumnOrderChange}\n defaultGroupingExpansionDepth={defaultGroupingExpansionDepth}\n pinnedRows={pinnedRows}\n keepNonExistentRowsSelected={keepNonExistentRowsSelected}\n />\n </Box>\n </Card>\n );\n}\n\ninterface MGHGridToolbarProps {\n showColumnsButton?: boolean;\n showFilterButton?: boolean;\n showExportButton?: boolean;\n showQuickFilter?: boolean;\n renderOtherButtons?: JSX.Element;\n renderDateRange?: JSX.Element;\n customMenuItem?: JSX.Element[];\n showCsvOption?: boolean;\n}\nexport function MGHGridToolbar({\n showColumnsButton = true,\n showFilterButton = true,\n showExportButton = true,\n showQuickFilter = true,\n renderOtherButtons,\n renderDateRange,\n customMenuItem,\n showCsvOption = true,\n}: MGHGridToolbarProps) {\n return (\n <Toolbar style={{ display: 'flex', justifyContent: 'space-between' }}>\n <div>\n {showColumnsButton && (\n <Tooltip title=\"Columns\">\n <ColumnsPanelTrigger render={<ToolbarButton />}>\n <GridViewColumnIcon fontSize=\"small\" />\n </ColumnsPanelTrigger>\n </Tooltip>\n )}\n {showFilterButton && (\n <Tooltip title=\"Filters\">\n <FilterPanelTrigger\n render={(props, state) => (\n <ToolbarButton {...props} color=\"default\">\n <Badge badgeContent={state.filterCount} color=\"primary\" variant=\"dot\">\n <GridFilterListIcon fontSize=\"small\" />\n </Badge>\n </ToolbarButton>\n )}\n />\n </Tooltip>\n )}\n {showExportButton && (\n <CustomGridToolbarExport customMenuItem={customMenuItem} showCsvOption={showCsvOption} />\n )}\n </div>\n\n {renderDateRange}\n\n <div>\n {renderOtherButtons}\n {showQuickFilter && <DataGridQuickFilter />}\n </div>\n </Toolbar>\n );\n}\n\ninterface ExportContainerProps {\n csvOptions?: GridCsvExportOptions & GridExportDisplayOptions;\n excelOptions?: GridExcelExportOptions & GridExportDisplayOptions;\n printOptions?: GridPrintExportOptions & GridExportDisplayOptions;\n customMenuItem?: JSX.Element[] | undefined;\n showCsvOption?: boolean;\n}\nexport const CustomGridToolbarExport = ({\n csvOptions = { allColumns: true },\n excelOptions = { allColumns: true },\n printOptions,\n customMenuItem,\n showCsvOption = true,\n ...other\n}: ExportContainerProps) => (\n <GridToolbarExportContainer {...other}>\n {customMenuItem?.map((el) => el)}\n {showCsvOption && <GridCsvExportMenuItem options={csvOptions} />}\n <GridExcelExportMenuItem options={excelOptions} />\n <GridPrintExportMenuItem options={printOptions} />\n </GridToolbarExportContainer>\n);\n\nexport function DataGridQuickFilter() {\n type OwnerState = {\n expanded: boolean;\n };\n\n const StyledQuickFilter = styled(QuickFilter)({\n display: 'grid',\n alignItems: 'center',\n });\n\n const StyledToolbarButton = styled(ToolbarButton)<{ ownerState: OwnerState }>(({ theme, ownerState }) => ({\n gridArea: '1 / 1',\n width: 'min-content',\n height: 'min-content',\n zIndex: 1,\n opacity: ownerState.expanded ? 0 : 1,\n pointerEvents: ownerState.expanded ? 'none' : 'auto',\n transition: theme.transitions.create(['opacity']),\n }));\n\n const StyledTextField = styled(TextField)<{\n ownerState: OwnerState;\n }>(({ theme, ownerState }) => ({\n gridArea: '1 / 1',\n overflowX: 'clip',\n width: ownerState.expanded ? 260 : 'var(--trigger-width)',\n opacity: ownerState.expanded ? 1 : 0,\n transition: theme.transitions.create(['width', 'opacity']),\n }));\n\n return (\n <StyledQuickFilter>\n <QuickFilterTrigger\n render={(triggerProps, state) => (\n <Tooltip title=\"Search\" enterDelay={0}>\n <StyledToolbarButton\n {...triggerProps}\n ownerState={{ expanded: state.expanded }}\n color=\"default\"\n aria-disabled={state.expanded}\n >\n <GridSearchIcon fontSize=\"small\" />\n </StyledToolbarButton>\n </Tooltip>\n )}\n />\n <QuickFilterControl\n render={({ ref, ...controlProps }, state) => (\n <StyledTextField\n {...controlProps}\n ownerState={{ expanded: state.expanded }}\n inputRef={ref}\n aria-label=\"Search\"\n placeholder=\"Search...\"\n size=\"small\"\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <GridSearchIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: state.value ? (\n <InputAdornment position=\"end\">\n <QuickFilterClear\n edge=\"end\"\n size=\"small\"\n aria-label=\"Clear search\"\n material={{ sx: { marginRight: -0.75 } }}\n >\n <GridCloseIcon fontSize=\"small\" />\n </QuickFilterClear>\n </InputAdornment>\n ) : null,\n ...controlProps.slotProps?.input,\n },\n ...controlProps.slotProps,\n }}\n />\n )}\n />\n </StyledQuickFilter>\n );\n}\n","import { forwardRef } from 'react';\nimport { Icon } from '@iconify/react';\n\nimport { IconifyProps } from './types';\nimport React from 'react';\n\n// ----------------------------------------------------------------------\n\ninterface Props {\n icon: IconifyProps;\n width?: number;\n height?: number;\n sx?: any;\n}\n\nconst Iconify = forwardRef<SVGElement, Props>(({ icon, width = 20, sx, ...other }, ref) => (\n <Icon icon={icon} style={{ width: 20, height: width ?? 20, ...sx }} />\n));\n\nexport default Iconify;\n","import type { ComponentProps, ComponentType } from 'react';\nimport Box from '@mui/material/Box';\nimport { alpha, styled, useTheme } from '@mui/material/styles';\nimport { LabelColor, LabelVariant } from './types';\n\n// ----------------------------------------------------------------------\n\ninterface StyledLabelOwnerState {\n color: LabelColor;\n variant: LabelVariant;\n}\n\n// Explicitly annotated so TS doesn't need to synthesize (and re-print) an anonymous type that\n// references @mui/system's install path — under pnpm that path is store-relative and triggers\n// TS2742 (\"inferred type cannot be named without a reference to ...\") during declaration emit.\nexport const StyledLabel = styled(Box)(({\n // theme,\n ownerState,\n}: {\n // theme: Theme;\n ownerState: StyledLabelOwnerState;\n}) => {\n const theme = useTheme();\n\n const lightMode = theme.palette.mode === 'light';\n\n const filledVariant = ownerState.variant === 'filled';\n\n const outlinedVariant = ownerState.variant === 'outlined';\n\n const softVariant = ownerState.variant === 'soft';\n\n const defaultStyle = {\n ...(ownerState.color === 'default' && {\n // FILLED\n ...(filledVariant && {\n color: lightMode ? theme.palette.common.white : theme.palette.grey[800],\n backgroundColor: theme.palette.text.primary,\n }),\n // OUTLINED\n ...(outlinedVariant && {\n backgroundColor: 'transparent',\n color: theme.palette.text.primary,\n border: `2px solid ${theme.palette.text.primary}`,\n }),\n // SOFT\n ...(softVariant && {\n color: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.grey[500], 0.16),\n }),\n }),\n };\n\n const colorStyle = {\n ...(ownerState.color !== 'default' && {\n // FILLED\n ...(filledVariant && {\n color: theme.palette[ownerState.color].contrastText,\n backgroundColor: theme.palette[ownerState.color].main,\n }),\n // OUTLINED\n ...(outlinedVariant && {\n backgroundColor: 'transparent',\n color: theme.palette[ownerState.color].main,\n border: `2px solid ${theme.palette[ownerState.color].main}`,\n }),\n // SOFT\n ...(softVariant && {\n color: theme.palette[ownerState.color][lightMode ? 'dark' : 'light'],\n backgroundColor: alpha(theme.palette[ownerState.color].main, 0.16),\n }),\n }),\n };\n\n return {\n height: 24,\n minWidth: 24,\n lineHeight: 0,\n borderRadius: 6,\n cursor: 'default',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n display: 'inline-flex',\n justifyContent: 'center',\n textTransform: 'capitalize',\n padding: theme.spacing(0, 0.75),\n fontSize: theme.typography.pxToRem(12),\n fontWeight: theme.typography.fontWeightBold,\n transition: theme.transitions.create('all', {\n duration: theme.transitions.duration.shorter,\n }),\n ...defaultStyle,\n ...colorStyle,\n };\n}) as ComponentType<ComponentProps<typeof Box> & { ownerState: StyledLabelOwnerState }>;\n","import { forwardRef } from 'react';\n\nimport Box from '@mui/material/Box';\nimport { LabelProps } from './types';\nimport { StyledLabel } from './styles';\nimport React from 'react';\n\n// ----------------------------------------------------------------------\n\nconst Label = forwardRef<HTMLSpanElement, LabelProps>(\n ({ children, color = 'default', variant = 'soft', startIcon, endIcon, sx, ...other }, ref) => {\n // const theme = useTheme();\n\n const iconStyles = {\n width: 16,\n height: 16,\n '& svg, img': { width: 1, height: 1, objectFit: 'cover' },\n };\n\n return (\n <StyledLabel\n ref={ref}\n // component=\"span\"\n ownerState={{ color, variant }}\n sx={{\n ...(startIcon && { pl: 0.75 }),\n ...(endIcon && { pr: 0.75 }),\n ...sx,\n }}\n // theme={theme}\n {...other}\n >\n {startIcon && <Box sx={{ mr: 0.75, ...iconStyles }}> {startIcon} </Box>}\n\n {children}\n\n {endIcon && <Box sx={{ ml: 0.75, ...iconStyles }}> {endIcon} </Box>}\n </StyledLabel>\n );\n }\n);\n\nexport default Label;\n","import dayjs from 'dayjs';\nimport {\n MGHGridAggregationFunction,\n MGHGridApi,\n MGHGridColDef,\n MGHGridColType,\n MGHGridComparatorFn,\n MGHGridFilterItem,\n MGHGridFilterOperator,\n MGHGridLocaleText,\n MGHGridRowId,\n MGHGridRowSelectionModel,\n MGHGridRowSelectionModelInput,\n MGHGridValidRowModel,\n MGHGridValueOption,\n MGHGridValueOptionObject,\n} from './MGHGrid.types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * ----------------------------------------------------------------------------------------------- */\n\nexport const GROUPING_COLUMN_FIELD = '__row_group_by_columns_group__';\nexport const CHECKBOX_FIELD = '__check__';\nexport const DETAIL_PANEL_TOGGLE_FIELD = '__detail_panel_toggle__';\nexport const AGGREGATION_FOOTER_ID = '__aggregation_footer__';\nexport const INTERNAL_FIELDS = new Set<string>([CHECKBOX_FIELD, DETAIL_PANEL_TOGGLE_FIELD]);\n\nexport const DENSITY_FACTORS = { compact: 0.7, standard: 1, comfortable: 1.3 } as const;\nexport const DEFAULT_ROW_HEIGHT = 52;\nexport const DEFAULT_HEADER_HEIGHT = 56;\nexport const DEFAULT_COLUMN_WIDTH = 100;\nexport const DEFAULT_COLUMN_MIN_WIDTH = 50;\nexport const CHECKBOX_COLUMN_WIDTH = 50;\nexport const DETAIL_TOGGLE_COLUMN_WIDTH = 50;\nexport const GROUPING_COLUMN_WIDTH = 220;\n\nexport const isInternalField = (field: string) => INTERNAL_FIELDS.has(field) || field === GROUPING_COLUMN_FIELD;\n\n/* -------------------------------------------------------------------------------------------------\n * Generic helpers\n * ----------------------------------------------------------------------------------------------- */\n\nexport const isNil = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isEmptyValue = (value: unknown) => isNil(value) || value === '' || (Array.isArray(value) && value.length === 0);\n\nexport const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max);\n\nexport const cx = (...classNames: Array<string | false | null | undefined>) => classNames.filter(Boolean).join(' ');\n\nexport const arraysEqual = <T>(a: T[] | undefined, b: T[] | undefined) => {\n if (a === b) return true;\n if (!a || !b || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\nexport const moveItem = <T>(list: T[], from: number, to: number): T[] => {\n const next = list.slice();\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item);\n return next;\n};\n\nexport const uniqueId = (() => {\n let counter = 0;\n return (prefix = 'mgh') => {\n counter += 1;\n return `${prefix}-${counter}`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * Local storage\n * ----------------------------------------------------------------------------------------------- */\n\nexport const canUseLocalStorage = () => typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport const readLocalStorage = <T>(key: string): T | null => {\n if (!canUseLocalStorage()) return null;\n try {\n const value = window.localStorage.getItem(key);\n return value ? (JSON.parse(value) as T) : null;\n } catch {\n return null;\n }\n};\n\nexport const writeLocalStorage = (key: string, value: unknown) => {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n /* ignore quota / privacy errors */\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Rows\n * ----------------------------------------------------------------------------------------------- */\n\nexport const getRowIdFromRow = <R extends MGHGridValidRowModel>(row: R, getRowId?: (row: R) => MGHGridRowId) =>\n getRowId ? getRowId(row) : (row.id as MGHGridRowId);\n\nexport const normalizeSelectionModel = (\n input: MGHGridRowSelectionModelInput | undefined,\n allIds?: MGHGridRowId[]\n): MGHGridRowSelectionModel => {\n if (!input) return { type: 'include', ids: new Set() };\n if (Array.isArray(input)) return { type: 'include', ids: new Set(input) };\n if (input instanceof Set) return { type: 'include', ids: new Set(input) };\n if (input.type === 'exclude' && allIds) {\n const ids = new Set<MGHGridRowId>();\n allIds.forEach((id) => {\n if (!input.ids.has(id)) ids.add(id);\n });\n return { type: 'include', ids };\n }\n return { type: 'include', ids: new Set(input.ids) };\n};\n\nexport const selectionModelsEqual = (a: MGHGridRowSelectionModel, b: MGHGridRowSelectionModel) => {\n if (a.ids.size !== b.ids.size) return false;\n let equal = true;\n a.ids.forEach((id) => {\n if (!b.ids.has(id)) equal = false;\n });\n return equal;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dates\n * ----------------------------------------------------------------------------------------------- */\n\nexport const toDate = (value: unknown): Date | null => {\n if (isNil(value) || value === '') return null;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value;\n if (dayjs.isDayjs(value)) return value.isValid() ? value.toDate() : null;\n if (typeof value === 'number') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n if (typeof value === 'string') {\n const parsed = dayjs(value);\n return parsed.isValid() ? parsed.toDate() : null;\n }\n return null;\n};\n\nexport const formatDate = (value: unknown, withTime: boolean) => {\n const date = toDate(value);\n if (!date) return '';\n return dayjs(date).format(withTime ? 'M/D/YYYY h:mm A' : 'M/D/YYYY');\n};\n\nconst startOfUnit = (date: Date, withTime: boolean) =>\n withTime ? dayjs(date).startOf('minute').valueOf() : dayjs(date).startOf('day').valueOf();\n\n/* -------------------------------------------------------------------------------------------------\n * Value options (singleSelect)\n * ----------------------------------------------------------------------------------------------- */\n\nexport const isValueOptionObject = (option: MGHGridValueOption): option is MGHGridValueOptionObject =>\n typeof option === 'object' && option !== null;\n\nexport const getOptionValue = (col: MGHGridColDef, option: MGHGridValueOption) =>\n col.getOptionValue ? col.getOptionValue(option) : isValueOptionObject(option) ? option.value : option;\n\nexport const getOptionLabel = (col: MGHGridColDef, option: MGHGridValueOption) =>\n col.getOptionLabel ? col.getOptionLabel(option) : isValueOptionObject(option) ? option.label : String(option);\n\nexport const resolveValueOptions = (col: MGHGridColDef, row?: MGHGridValidRowModel, id?: MGHGridRowId) => {\n if (!col.valueOptions) return [] as MGHGridValueOption[];\n return typeof col.valueOptions === 'function' ? col.valueOptions({ field: col.field, row, id }) : col.valueOptions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Cell values\n * ----------------------------------------------------------------------------------------------- */\n\nexport const getCellValue = (row: MGHGridValidRowModel, col: MGHGridColDef, api: MGHGridApi) => {\n const raw = row ? row[col.field] : undefined;\n return col.valueGetter ? col.valueGetter(raw, row, col, api) : raw;\n};\n\nexport const getGroupingValue = (row: MGHGridValidRowModel, col: MGHGridColDef, api: MGHGridApi) => {\n if (col.groupingValueGetter) return col.groupingValueGetter(row[col.field], row, col, api);\n return getCellValue(row, col, api);\n};\n\nexport const defaultFormatValue = (value: any, col: MGHGridColDef, row?: MGHGridValidRowModel, id?: MGHGridRowId) => {\n if (isNil(value)) return '';\n switch (col.type) {\n case 'date':\n return formatDate(value, false);\n case 'dateTime':\n return formatDate(value, true);\n case 'boolean':\n return value ? 'Yes' : 'No';\n case 'singleSelect': {\n const options = resolveValueOptions(col, row, id);\n const match = options.find((option) => getOptionValue(col, option) === value);\n return match !== undefined ? getOptionLabel(col, match) : String(value);\n }\n case 'number':\n return typeof value === 'number' ? (Number.isFinite(value) ? String(value) : '') : String(value);\n default:\n if (value instanceof Date) return formatDate(value, true);\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n};\n\nexport const getFormattedValue = (\n value: any,\n row: MGHGridValidRowModel,\n col: MGHGridColDef,\n api: MGHGridApi,\n id?: MGHGridRowId\n) => {\n if (col.valueFormatter) return col.valueFormatter(value, row, col, api);\n return defaultFormatValue(value, col, row, id);\n};\n\nexport const formattedValueToString = (formatted: any): string => {\n if (isNil(formatted)) return '';\n if (typeof formatted === 'string') return formatted;\n if (typeof formatted === 'number' || typeof formatted === 'boolean') return String(formatted);\n if (formatted instanceof Date) return formatDate(formatted, true);\n if (typeof formatted === 'object' && 'props' in formatted) return '';\n return String(formatted);\n};\n\nexport const parseEditValue = (raw: any, col: MGHGridColDef) => {\n switch (col.type) {\n case 'number': {\n if (raw === '' || isNil(raw)) return null;\n const n = Number(raw);\n return Number.isNaN(n) ? raw : n;\n }\n case 'boolean':\n return Boolean(raw);\n case 'date':\n case 'dateTime': {\n if (raw === '' || isNil(raw)) return null;\n const d = toDate(raw);\n return d ?? raw;\n }\n default:\n return raw;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Sorting\n * ----------------------------------------------------------------------------------------------- */\n\nconst collator = typeof Intl !== 'undefined' ? new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }) : null;\n\nconst nilFirst = (v1: any, v2: any): number | null => {\n const n1 = isNil(v1) || v1 === '';\n const n2 = isNil(v2) || v2 === '';\n if (n1 && n2) return 0;\n if (n1) return -1;\n if (n2) return 1;\n return null;\n};\n\nexport const numberComparator: MGHGridComparatorFn = (v1, v2) => {\n const nil = nilFirst(v1, v2);\n if (nil !== null) return nil;\n return Number(v1) - Number(v2);\n};\n\nexport const stringComparator: MGHGridComparatorFn = (v1, v2) => {\n const nil = nilFirst(v1, v2);\n if (nil !== null) return nil;\n const s1 = String(v1);\n const s2 = String(v2);\n if (collator) return collator.compare(s1, s2);\n return s1 < s2 ? -1 : s1 > s2 ? 1 : 0;\n};\n\nexport const stringOrNumberComparator: MGHGridComparatorFn = (v1, v2, p1, p2) => {\n if (typeof v1 === 'number' && typeof v2 === 'number') return numberComparator(v1, v2, p1, p2);\n return stringComparator(v1, v2, p1, p2);\n};\n\nexport const dateComparator: MGHGridComparatorFn = (v1, v2) => {\n const d1 = toDate(v1);\n const d2 = toDate(v2);\n const nil = nilFirst(d1, d2);\n if (nil !== null) return nil;\n return (d1 as Date).getTime() - (d2 as Date).getTime();\n};\n\nexport const booleanComparator: MGHGridComparatorFn = (v1, v2) => {\n const nil = nilFirst(v1, v2);\n if (nil !== null) return nil;\n return Number(Boolean(v1)) - Number(Boolean(v2));\n};\n\nexport const getDefaultComparator = (type: MGHGridColType | undefined): MGHGridComparatorFn => {\n switch (type) {\n case 'number':\n return numberComparator;\n case 'date':\n case 'dateTime':\n return dateComparator;\n case 'boolean':\n return booleanComparator;\n default:\n return stringOrNumberComparator;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Filter operators\n * ----------------------------------------------------------------------------------------------- */\n\nconst lower = (value: unknown) => (isNil(value) ? '' : String(value).toLowerCase());\n\nconst hasValue = (item: MGHGridFilterItem) => !isEmptyValue(item.value);\n\nexport const stringFilterOperators: MGHGridFilterOperator[] = [\n {\n value: 'contains',\n label: 'contains',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value).indexOf(needle) !== -1;\n },\n },\n {\n value: 'doesNotContain',\n label: 'does not contain',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value).indexOf(needle) === -1;\n },\n },\n {\n value: 'equals',\n label: 'equals',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value) === needle;\n },\n },\n {\n value: 'doesNotEqual',\n label: 'does not equal',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value) !== needle;\n },\n },\n {\n value: 'startsWith',\n label: 'starts with',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => lower(value).indexOf(needle) === 0;\n },\n },\n {\n value: 'endsWith',\n label: 'ends with',\n inputType: 'text',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const needle = lower(item.value);\n return (value) => {\n const s = lower(value);\n return s.length >= needle.length && s.lastIndexOf(needle) === s.length - needle.length;\n };\n },\n },\n {\n value: 'isEmpty',\n label: 'is empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => isEmptyValue(value),\n },\n {\n value: 'isNotEmpty',\n label: 'is not empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => !isEmptyValue(value),\n },\n {\n value: 'isAnyOf',\n label: 'is any of',\n inputType: 'multiselect',\n getApplyFilterFn: (item) => {\n if (!Array.isArray(item.value) || item.value.length === 0) return null;\n const set = new Set(item.value.map(lower));\n return (value) => set.has(lower(value));\n },\n },\n];\n\nconst numberOperator = (\n value: string,\n label: string,\n compare: (cell: number, filter: number) => boolean\n): MGHGridFilterOperator => ({\n value,\n label,\n inputType: 'number',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const filterValue = Number(item.value);\n if (Number.isNaN(filterValue)) return null;\n return (cell) => {\n if (isNil(cell) || cell === '') return false;\n const n = Number(cell);\n return !Number.isNaN(n) && compare(n, filterValue);\n };\n },\n});\n\nexport const numberFilterOperators: MGHGridFilterOperator[] = [\n numberOperator('=', '=', (a, b) => a === b),\n numberOperator('!=', '!=', (a, b) => a !== b),\n numberOperator('>', '>', (a, b) => a > b),\n numberOperator('>=', '>=', (a, b) => a >= b),\n numberOperator('<', '<', (a, b) => a < b),\n numberOperator('<=', '<=', (a, b) => a <= b),\n {\n value: 'isEmpty',\n label: 'is empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => isEmptyValue(value),\n },\n {\n value: 'isNotEmpty',\n label: 'is not empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => !isEmptyValue(value),\n },\n {\n value: 'isAnyOf',\n label: 'is any of',\n inputType: 'multiselect',\n getApplyFilterFn: (item) => {\n if (!Array.isArray(item.value) || item.value.length === 0) return null;\n const set = new Set(item.value.map((v: any) => Number(v)));\n return (value) => !isNil(value) && set.has(Number(value));\n },\n },\n];\n\nconst dateOperator = (\n value: string,\n label: string,\n withTime: boolean,\n compare: (cell: number, filter: number) => boolean\n): MGHGridFilterOperator => ({\n value,\n label,\n inputType: withTime ? 'datetime-local' : 'date',\n getApplyFilterFn: (item) => {\n if (!hasValue(item)) return null;\n const filterDate = toDate(item.value);\n if (!filterDate) return null;\n const filterTime = startOfUnit(filterDate, withTime);\n return (cell) => {\n const cellDate = toDate(cell);\n if (!cellDate) return false;\n return compare(startOfUnit(cellDate, withTime), filterTime);\n };\n },\n});\n\nexport const getDateFilterOperators = (withTime: boolean): MGHGridFilterOperator[] => [\n dateOperator('is', 'is', withTime, (a, b) => a === b),\n dateOperator('not', 'is not', withTime, (a, b) => a !== b),\n dateOperator('after', 'is after', withTime, (a, b) => a > b),\n dateOperator('onOrAfter', 'is on or after', withTime, (a, b) => a >= b),\n dateOperator('before', 'is before', withTime, (a, b) => a < b),\n dateOperator('onOrBefore', 'is on or before', withTime, (a, b) => a <= b),\n {\n value: 'isEmpty',\n label: 'is empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => toDate(value) === null,\n },\n {\n value: 'isNotEmpty',\n label: 'is not empty',\n inputType: 'none',\n requiresFilterValue: false,\n getApplyFilterFn: () => (value) => toDate(value) !== null,\n },\n];\n\nexport const booleanFilterOperators: MGHGridFilterOperator[] = [\n {\n value: 'is',\n label: 'is',\n inputType: 'boolean',\n getApplyFilterFn: (item) => {\n if (isNil(item.value) || item.value === '' || item.value === 'any') return null;\n const expected = item.value === true || item.value === 'true';\n return (value) => Boolean(value) === expected;\n },\n },\n];\n\nexport const singleSelectFilterOperators: MGHGridFilterOperator[] = [\n {\n value: 'is',\n label: 'is',\n inputType: 'select',\n getApplyFilterFn: (item) => {\n if (isNil(item.value) || item.value === '') return null;\n return (value) => String(value) === String(item.value);\n },\n },\n {\n value: 'not',\n label: 'is not',\n inputType: 'select',\n getApplyFilterFn: (item) => {\n if (isNil(item.value) || item.value === '') return null;\n return (value) => String(value) !== String(item.value);\n },\n },\n {\n value: 'isAnyOf',\n label: 'is any of',\n inputType: 'multiselect',\n getApplyFilterFn: (item) => {\n if (!Array.isArray(item.value) || item.value.length === 0) return null;\n const set = new Set(item.value.map(String));\n return (value) => set.has(String(value));\n },\n },\n];\n\nexport const getDefaultFilterOperators = (type: MGHGridColType | undefined): MGHGridFilterOperator[] => {\n switch (type) {\n case 'number':\n return numberFilterOperators;\n case 'date':\n return getDateFilterOperators(false);\n case 'dateTime':\n return getDateFilterOperators(true);\n case 'boolean':\n return booleanFilterOperators;\n case 'singleSelect':\n return singleSelectFilterOperators;\n case 'actions':\n return [];\n default:\n return stringFilterOperators;\n }\n};\n\nexport const getColumnFilterOperators = (col: MGHGridColDef) => col.filterOperators ?? getDefaultFilterOperators(col.type);\n\n/* -------------------------------------------------------------------------------------------------\n * Column normalisation\n * ----------------------------------------------------------------------------------------------- */\n\nexport const normalizeColumn = <R extends MGHGridValidRowModel>(col: MGHGridColDef<R>): MGHGridColDef<R> => {\n const type = col.type ?? 'string';\n const isNumber = type === 'number';\n const isBoolean = type === 'boolean';\n const isActions = type === 'actions';\n return {\n ...col,\n type,\n headerName: col.headerName ?? col.field,\n width: col.width ?? (isActions ? 100 : isBoolean ? 100 : DEFAULT_COLUMN_WIDTH),\n minWidth: col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH,\n align: col.align ?? (isNumber ? 'right' : isBoolean || isActions ? 'center' : 'left'),\n headerAlign: col.headerAlign ?? col.align ?? (isNumber ? 'right' : isBoolean || isActions ? 'center' : 'left'),\n sortable: isActions ? false : (col.sortable ?? true),\n filterable: isActions ? false : (col.filterable ?? true),\n hideable: col.hideable ?? true,\n resizable: col.resizable ?? true,\n pinnable: col.pinnable ?? true,\n groupable: isActions ? false : (col.groupable ?? true),\n aggregable: isActions ? false : (col.aggregable ?? true),\n editable: col.editable ?? false,\n disableColumnMenu: col.disableColumnMenu ?? isActions,\n disableExport: col.disableExport ?? isActions,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Internal (auto-generated) columns\n * ----------------------------------------------------------------------------------------------- */\n\nconst internalColumn = (field: string, width: number): MGHGridColDef =>\n normalizeColumn({\n field,\n headerName: '',\n width,\n minWidth: width,\n maxWidth: width,\n sortable: false,\n filterable: false,\n hideable: false,\n resizable: false,\n pinnable: false,\n groupable: false,\n aggregable: false,\n disableColumnMenu: true,\n disableExport: true,\n disableReorder: true,\n align: 'center',\n headerAlign: 'center',\n });\n\n/** Definition of the checkbox-selection column (equivalent of MUI's GRID_CHECKBOX_SELECTION_COL_DEF). */\nexport const CHECKBOX_COLUMN_DEF: MGHGridColDef = internalColumn(CHECKBOX_FIELD, CHECKBOX_COLUMN_WIDTH);\n/** Definition of the detail-panel toggle column (equivalent of MUI's GRID_DETAIL_PANEL_TOGGLE_COL_DEF). */\nexport const DETAIL_PANEL_TOGGLE_COLUMN_DEF: MGHGridColDef = internalColumn(\n DETAIL_PANEL_TOGGLE_FIELD,\n DETAIL_TOGGLE_COLUMN_WIDTH\n);\n\n/* -------------------------------------------------------------------------------------------------\n * sx -> scoped CSS\n * ----------------------------------------------------------------------------------------------- */\n\nconst UNITLESS_PROPERTIES = new Set([\n 'animationIterationCount',\n 'borderImageOutset',\n 'borderImageSlice',\n 'borderImageWidth',\n 'boxFlex',\n 'boxFlexGroup',\n 'boxOrdinalGroup',\n 'columnCount',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flexPositive',\n 'flexShrink',\n 'flexNegative',\n 'flexOrder',\n 'gridArea',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowSpan',\n 'gridRowStart',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnSpan',\n 'gridColumnStart',\n 'fontWeight',\n 'lineClamp',\n 'lineHeight',\n 'opacity',\n 'order',\n 'orphans',\n 'tabSize',\n 'widows',\n 'zIndex',\n 'zoom',\n 'fillOpacity',\n 'floodOpacity',\n 'stopOpacity',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeWidth',\n]);\n\n/** Keys that are CSS selectors / at-rules rather than CSS properties. */\nexport const isSelectorKey = (key: string) => /[&.:#>\\[\\s*~+,@]/.test(key);\n\nconst toKebabCase = (property: string) => {\n if (property.indexOf('--') === 0) return property;\n const kebab = property.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n return kebab.indexOf('ms-') === 0 ? `-${kebab}` : kebab;\n};\n\nconst formatCssValue = (property: string, value: string | number) =>\n typeof value === 'number' && value !== 0 && !UNITLESS_PROPERTIES.has(property) && property.indexOf('--') !== 0\n ? `${value}px`\n : String(value);\n\nconst serializeDeclarations = (block: Record<string, unknown>) =>\n Object.keys(block)\n .filter((key) => {\n const value = block[key];\n return !isSelectorKey(key) && (typeof value === 'string' || typeof value === 'number');\n })\n .map((key) => `${toKebabCase(key)}:${formatCssValue(key, block[key] as string | number)}`)\n .join(';');\n\nconst scopeSelector = (scope: string, selector: string) =>\n selector\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => (part.indexOf('&') !== -1 ? part.replace(/&/g, scope) : `${scope} ${part}`))\n .join(',');\n\n/**\n * Compiles the nested-selector part of an `sx`-like object into CSS scoped under `scope`.\n * Top-level plain properties are ignored here (they are applied as inline styles instead).\n */\nexport const buildScopedCss = (scope: string, sx: Record<string, unknown> | undefined, out: string[] = []): string[] => {\n if (!sx) return out;\n Object.keys(sx).forEach((key) => {\n const value = sx[key];\n if (!value || typeof value !== 'object') return;\n const block = value as Record<string, unknown>;\n if (key.charAt(0) === '@') {\n const inner: string[] = [];\n const declarations = serializeDeclarations(block);\n if (declarations) inner.push(`${scope}{${declarations}}`);\n buildScopedCss(scope, block, inner);\n if (inner.length) out.push(`${key}{${inner.join('')}}`);\n return;\n }\n const selector = scopeSelector(scope, key);\n const declarations = serializeDeclarations(block);\n if (declarations) out.push(`${selector}{${declarations}}`);\n buildScopedCss(selector, block, out);\n });\n return out;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Aggregation\n * ----------------------------------------------------------------------------------------------- */\n\nconst numericValues = (values: any[]) =>\n values.map((v) => (typeof v === 'number' ? v : Number(v))).filter((n) => !Number.isNaN(n) && n !== null);\n\nexport const BUILT_IN_AGGREGATION_FUNCTIONS: Record<string, MGHGridAggregationFunction> = {\n sum: {\n label: 'sum',\n columnTypes: ['number'],\n apply: ({ values }) => {\n const nums = numericValues(values.filter((v) => !isNil(v) && v !== ''));\n if (nums.length === 0) return null;\n return nums.reduce((acc, n) => acc + n, 0);\n },\n },\n avg: {\n label: 'avg',\n columnTypes: ['number'],\n apply: ({ values }) => {\n const nums = numericValues(values.filter((v) => !isNil(v) && v !== ''));\n if (nums.length === 0) return null;\n return nums.reduce((acc, n) => acc + n, 0) / nums.length;\n },\n },\n min: {\n label: 'min',\n columnTypes: ['number', 'date', 'dateTime'],\n apply: ({ values }) => {\n const defined = values.filter((v) => !isNil(v) && v !== '');\n if (defined.length === 0) return null;\n if (defined.every((v) => typeof v === 'number')) return Math.min(...(defined as number[]));\n const dates = defined.map(toDate);\n if (dates.every((d) => d !== null)) {\n return new Date(Math.min(...dates.map((d) => (d as Date).getTime())));\n }\n return defined.slice().sort((a, b) => stringComparator(a, b, null as any, null as any))[0];\n },\n },\n max: {\n label: 'max',\n columnTypes: ['number', 'date', 'dateTime'],\n apply: ({ values }) => {\n const defined = values.filter((v) => !isNil(v) && v !== '');\n if (defined.length === 0) return null;\n if (defined.every((v) => typeof v === 'number')) return Math.max(...(defined as number[]));\n const dates = defined.map(toDate);\n if (dates.every((d) => d !== null)) {\n return new Date(Math.max(...dates.map((d) => (d as Date).getTime())));\n }\n const sorted = defined.slice().sort((a, b) => stringComparator(a, b, null as any, null as any));\n return sorted[sorted.length - 1];\n },\n },\n size: {\n label: 'size',\n apply: ({ values }) => values.length,\n },\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Locale\n * ----------------------------------------------------------------------------------------------- */\n\nexport const DEFAULT_LOCALE_TEXT: MGHGridLocaleText = {\n noRowsLabel: 'No rows',\n loadingLabel: 'Loading…',\n toolbarColumns: 'Columns',\n toolbarFilters: 'Filters',\n toolbarExport: 'Export',\n toolbarDensity: 'Density',\n toolbarQuickFilterPlaceholder: 'Search...',\n toolbarQuickFilterLabel: 'Search',\n toolbarExportCSV: 'Download as CSV',\n toolbarExportExcel: 'Download as Excel',\n toolbarExportPrint: 'Print',\n densityCompact: 'Compact',\n densityStandard: 'Standard',\n densityComfortable: 'Comfortable',\n columnsPanelSearchPlaceholder: 'Search',\n columnsPanelShowAll: 'Show all',\n columnsPanelHideAll: 'Hide all',\n columnsPanelReset: 'Reset',\n filterPanelAddFilter: 'Add filter',\n filterPanelRemoveAll: 'Remove all',\n filterPanelDeleteIcon: 'Delete',\n filterPanelColumns: 'Columns',\n filterPanelOperator: 'Operator',\n filterPanelValue: 'Value',\n filterPanelInputPlaceholder: 'Filter value',\n filterPanelLogicOperator: 'Logic operator',\n filterPanelOperatorAnd: 'And',\n filterPanelOperatorOr: 'Or',\n columnMenuSortAsc: 'Sort by ASC',\n columnMenuSortDesc: 'Sort by DESC',\n columnMenuUnsort: 'Unsort',\n columnMenuFilter: 'Filter',\n columnMenuHideColumn: 'Hide column',\n columnMenuManageColumns: 'Manage columns',\n columnMenuPinLeft: 'Pin to left',\n columnMenuPinRight: 'Pin to right',\n columnMenuUnpin: 'Unpin',\n columnMenuGroup: (name) => `Group by ${name}`,\n columnMenuUngroup: (name) => `Stop grouping by ${name}`,\n columnMenuAggregation: 'Aggregation',\n aggregationMenuItemHeader: 'Aggregation',\n aggregationFunctionLabelNone: 'none',\n aggregationFunctionLabelSum: 'sum',\n aggregationFunctionLabelAvg: 'avg',\n aggregationFunctionLabelMin: 'min',\n aggregationFunctionLabelMax: 'max',\n aggregationFunctionLabelSize: 'size',\n footerRowSelected: (count) => (count === 1 ? '1 row selected' : `${count.toLocaleString()} rows selected`),\n footerTotalRows: 'Total Rows:',\n footerPaginationRowsPerPage: 'Rows per page:',\n footerPaginationDisplayedRows: (from, to, count) => `${from}–${to} of ${count.toLocaleString()}`,\n footerPaginationFirstPage: 'First page',\n footerPaginationPreviousPage: 'Previous page',\n footerPaginationNextPage: 'Next page',\n footerPaginationLastPage: 'Last page',\n checkboxSelectionHeaderName: 'Checkbox selection',\n checkboxSelectionSelectAllRows: 'Select all rows',\n checkboxSelectionUnselectAllRows: 'Unselect all rows',\n checkboxSelectionSelectRow: 'Select row',\n checkboxSelectionUnselectRow: 'Unselect row',\n booleanCellTrueLabel: 'yes',\n booleanCellFalseLabel: 'no',\n detailPanelToggle: 'Detail panel toggle',\n expandDetailPanel: 'Expand',\n collapseDetailPanel: 'Collapse',\n groupingColumnHeaderName: 'Group',\n groupColumn: (name) => `Group by ${name}`,\n unGroupColumn: (name) => `Stop grouping by ${name}`,\n actionsCellMore: 'more',\n columnHeaderSortIconLabel: 'Sort',\n columnMenuLabel: 'Menu',\n clearSearch: 'Clear search',\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Text measurement (used for autosize)\n * ----------------------------------------------------------------------------------------------- */\n\nlet measureContext: CanvasRenderingContext2D | null | undefined;\n\nexport const measureText = (text: string, font: string) => {\n if (typeof document === 'undefined') return text.length * 8;\n if (measureContext === undefined) {\n const canvas = document.createElement('canvas');\n measureContext = canvas.getContext('2d');\n }\n if (!measureContext) return text.length * 8;\n measureContext.font = font;\n return measureContext.measureText(text).width;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Downloads\n * ----------------------------------------------------------------------------------------------- */\n\nexport const downloadBlob = (blob: Blob, fileName: string) => {\n if (typeof document === 'undefined') return;\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n window.setTimeout(() => {\n document.body.removeChild(anchor);\n URL.revokeObjectURL(url);\n }, 0);\n};\n","import React from 'react';\n\nexport const MGH_GRID_STYLE_ID = 'mgh-grid-styles';\n\n/**\n * Stylesheet for MGHGrid. It is injected once into <head> the first time a grid mounts,\n * so consumers do not need a CSS loader. All colours are CSS variables so the look can be\n * customised globally (by redefining `--mgh-grid-*` on `.mgh-grid-card`) or per instance\n * through the `themeVars` prop.\n */\nexport const MGH_GRID_CSS = `\n.mgh-grid-card {\n --mgh-grid-font-family: inherit;\n --mgh-grid-font-size: 14px;\n --mgh-grid-radius: 16px;\n --mgh-grid-inner-radius: 4px;\n --mgh-grid-paper: #ffffff;\n --mgh-grid-bg: #ffffff;\n --mgh-grid-fg: rgba(0, 0, 0, 0.87);\n --mgh-grid-fg-secondary: rgba(0, 0, 0, 0.6);\n --mgh-grid-fg-disabled: rgba(0, 0, 0, 0.38);\n --mgh-grid-border: rgba(224, 224, 224, 1);\n --mgh-grid-header-bg: #ffffff;\n --mgh-grid-header-fg: rgba(0, 0, 0, 0.87);\n --mgh-grid-hover: rgba(0, 0, 0, 0.04);\n --mgh-grid-hover-strong: rgba(0, 0, 0, 0.08);\n --mgh-grid-selected: rgba(25, 118, 210, 0.08);\n --mgh-grid-selected-hover: rgba(25, 118, 210, 0.12);\n --mgh-grid-primary: #1976d2;\n --mgh-grid-primary-contrast: #ffffff;\n --mgh-grid-focus: #1976d2;\n --mgh-grid-shadow: 0 0 2px rgba(145, 158, 171, 0.2), 0 12px 24px -4px rgba(145, 158, 171, 0.12);\n --mgh-grid-popover-shadow: 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12);\n --mgh-grid-overlay: rgba(255, 255, 255, 0.6);\n --mgh-grid-input-bg: transparent;\n --mgh-grid-input-border: rgba(0, 0, 0, 0.23);\n --mgh-grid-pinned-shadow: rgba(0, 0, 0, 0.12);\n --mgh-grid-group-bg: rgba(0, 0, 0, 0.02);\n --mgh-grid-footer-bg: rgba(0, 0, 0, 0.02);\n --mgh-grid-badge: #1976d2;\n --mgh-grid-scrollbar: rgba(0, 0, 0, 0.3);\n\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n background: var(--mgh-grid-paper);\n color: var(--mgh-grid-fg);\n border-radius: var(--mgh-grid-radius);\n box-shadow: var(--mgh-grid-shadow);\n font-family: var(--mgh-grid-font-family);\n font-size: var(--mgh-grid-font-size);\n line-height: 1.5;\n overflow: hidden;\n box-sizing: border-box;\n}\n.mgh-grid-card[data-mgh-theme=\"dark\"] {\n --mgh-grid-paper: #212b36;\n --mgh-grid-bg: #212b36;\n --mgh-grid-fg: #ffffff;\n --mgh-grid-fg-secondary: rgba(255, 255, 255, 0.7);\n --mgh-grid-fg-disabled: rgba(255, 255, 255, 0.5);\n --mgh-grid-border: rgba(81, 81, 81, 1);\n --mgh-grid-header-bg: #212b36;\n --mgh-grid-header-fg: #ffffff;\n --mgh-grid-hover: rgba(255, 255, 255, 0.08);\n --mgh-grid-hover-strong: rgba(255, 255, 255, 0.16);\n --mgh-grid-selected: rgba(144, 202, 249, 0.16);\n --mgh-grid-selected-hover: rgba(144, 202, 249, 0.24);\n --mgh-grid-primary: #90caf9;\n --mgh-grid-primary-contrast: rgba(0, 0, 0, 0.87);\n --mgh-grid-focus: #90caf9;\n --mgh-grid-shadow: 0 0 2px rgba(0, 0, 0, 0.2), 0 12px 24px -4px rgba(0, 0, 0, 0.12);\n --mgh-grid-overlay: rgba(33, 43, 54, 0.6);\n --mgh-grid-input-border: rgba(255, 255, 255, 0.23);\n --mgh-grid-pinned-shadow: rgba(0, 0, 0, 0.5);\n --mgh-grid-group-bg: rgba(255, 255, 255, 0.03);\n --mgh-grid-footer-bg: rgba(255, 255, 255, 0.03);\n --mgh-grid-badge: #90caf9;\n --mgh-grid-scrollbar: rgba(255, 255, 255, 0.3);\n}\n/* Only our own elements get the border-box reset. A blanket descendant reset would leak into\n consumer content rendered through slots (e.g. MUI TextField inputs rely on content-box). */\n[class*=\"mgh-grid\"], [class*=\"mgh-grid\"]::before, [class*=\"mgh-grid\"]::after { box-sizing: border-box; }\n.mgh-grid-card--plain { box-shadow: none; border-radius: 0; background: transparent; }\n\n/* ---- card header ---- */\n/* Title stays on its row; only the end-content group wraps internally (like the legacy MUI card). */\n.mgh-grid-card-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 16px 16px 16px 0; flex-wrap: nowrap; }\n.mgh-grid-card-title { flex: 0 0 auto; padding: 8px 24px; margin: 0; font-size: 1.125rem; font-weight: 700; line-height: 1.5556; }\n/* Children are auto-sized so space-between leaves equal gaps title|center|end (like the legacy MUI card).\n Only the end group shrinks (and wraps internally); the centre content keeps its natural width. */\n.mgh-grid-card-header-center { flex: 0 0 auto; min-width: 0; display: flex; align-items: center; justify-content: center; gap: 16px; flex-wrap: wrap; }\n.mgh-grid-card-header-end { flex: 0 1 auto; min-width: 0; display: flex; align-items: center; gap: 16px; flex-wrap: wrap; justify-content: flex-end; }\n.mgh-grid-card-header-end:first-child { margin-left: auto; }\n@media (max-width: 599.95px) {\n .mgh-grid-card-header { flex-wrap: wrap; }\n .mgh-grid-card-header-end { gap: 8px; }\n}\n\n/* ---- box + root ---- */\n.mgh-grid-box { display: flex; flex-direction: column; flex-grow: 1; min-height: 0; min-width: 0; }\n.mgh-grid {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n min-width: 0;\n border: 1px solid var(--mgh-grid-border);\n border-radius: var(--mgh-grid-inner-radius);\n background: var(--mgh-grid-bg);\n color: var(--mgh-grid-fg);\n outline: none;\n}\n.mgh-grid--auto-height { flex: 0 0 auto; }\n\n/* ---- toolbar ---- */\n.mgh-grid-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 45px; padding: 4px 8px; border-bottom: 1px solid var(--mgh-grid-border); flex-wrap: wrap; }\n.mgh-grid-toolbar-group { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }\n.mgh-grid-toolbar-center { display: flex; align-items: center; flex: 1 1 auto; justify-content: center; }\n\n/* ---- buttons ---- */\n.mgh-grid-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; border: 0; margin: 0; background: transparent; color: var(--mgh-grid-fg-secondary); font: inherit; font-size: 0.8125rem; font-weight: 500; line-height: 1.75; letter-spacing: .02em; padding: 4px 8px; border-radius: 4px; cursor: pointer; user-select: none; transition: background-color .15s, color .15s; text-transform: none; white-space: nowrap; }\n.mgh-grid-btn:hover { background: var(--mgh-grid-hover); color: var(--mgh-grid-fg); }\n.mgh-grid-btn:focus-visible { outline: 2px solid var(--mgh-grid-focus); outline-offset: 1px; }\n.mgh-grid-btn:disabled { color: var(--mgh-grid-fg-disabled); cursor: default; background: transparent; }\n.mgh-grid-btn--icon { padding: 6px; border-radius: 50%; width: 32px; height: 32px; }\n.mgh-grid-btn--icon.mgh-grid-btn--small { width: 26px; height: 26px; padding: 3px; }\n.mgh-grid-btn--icon.mgh-grid-btn--small .mgh-grid-icon { width: 18px; height: 18px; }\n.mgh-grid-btn--primary { color: var(--mgh-grid-primary); }\n.mgh-grid-btn--primary:hover { background: var(--mgh-grid-selected); color: var(--mgh-grid-primary); }\n.mgh-grid-btn--contained { background: var(--mgh-grid-primary); color: var(--mgh-grid-primary-contrast); }\n.mgh-grid-btn--contained:hover { background: var(--mgh-grid-primary); color: var(--mgh-grid-primary-contrast); filter: brightness(0.92); }\n.mgh-grid-btn--active { color: var(--mgh-grid-primary); }\n\n/* ---- badge ---- */\n.mgh-grid-badge { position: relative; display: inline-flex; }\n.mgh-grid-badge-dot { position: absolute; top: 0; right: 0; min-width: 8px; height: 8px; border-radius: 4px; background: var(--mgh-grid-badge); transform: translate(50%, -50%); }\n.mgh-grid-badge-count { position: absolute; top: 0; right: 0; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--mgh-grid-badge); color: var(--mgh-grid-primary-contrast); font-size: 10px; font-weight: 600; line-height: 16px; text-align: center; transform: translate(50%, -50%); }\n\n/* ---- inputs ---- */\n.mgh-grid-input, .mgh-grid-select { font: inherit; font-size: 0.875rem; color: var(--mgh-grid-fg); background: var(--mgh-grid-input-bg); border: 1px solid var(--mgh-grid-input-border); border-radius: 6px; padding: 6px 10px; height: 36px; min-width: 0; outline: none; transition: border-color .15s, box-shadow .15s; }\n.mgh-grid-input:hover, .mgh-grid-select:hover { border-color: var(--mgh-grid-fg); }\n.mgh-grid-input:focus, .mgh-grid-select:focus { border-color: var(--mgh-grid-focus); box-shadow: 0 0 0 1px var(--mgh-grid-focus); }\n.mgh-grid-input::placeholder { color: var(--mgh-grid-fg-disabled); }\n.mgh-grid-input--small, .mgh-grid-select--small { height: 32px; padding: 4px 8px; font-size: 0.8125rem; }\n.mgh-grid-select { appearance: none; -webkit-appearance: none; padding-right: 28px; background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23888'><path d='M7 10l5 5 5-5z'/></svg>\"); background-repeat: no-repeat; background-position: right 6px center; background-size: 18px; cursor: pointer; }\n.mgh-grid-select option { color: initial; background: initial; }\n.mgh-grid-card[data-mgh-theme=\"dark\"] .mgh-grid-select option, .mgh-grid-popover[data-mgh-theme=\"dark\"] .mgh-grid-select option { color: #fff; background: #212b36; }\n.mgh-grid-select[multiple] { height: auto; min-height: 36px; background-image: none; padding-right: 10px; }\n.mgh-grid-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n.mgh-grid-field-label { font-size: 0.75rem; color: var(--mgh-grid-fg-secondary); }\n.mgh-grid-input-adorned { position: relative; display: flex; align-items: center; }\n.mgh-grid-input-adorned .mgh-grid-input { width: 100%; padding-left: 34px; }\n.mgh-grid-input-adorned--clearable .mgh-grid-input { padding-right: 34px; }\n.mgh-grid-input-adornment { position: absolute; left: 10px; display: inline-flex; color: var(--mgh-grid-fg-secondary); pointer-events: none; }\n.mgh-grid-input-adornment--end { left: auto; right: 4px; pointer-events: auto; }\n\n/* ---- checkbox ---- */\n.mgh-grid-checkbox { appearance: none; -webkit-appearance: none; width: 18px; height: 18px; margin: 0; border: 2px solid var(--mgh-grid-fg-secondary); border-radius: 3px; background: transparent; cursor: pointer; display: inline-grid; place-content: center; position: relative; flex: 0 0 auto; transition: background-color .12s, border-color .12s; }\n.mgh-grid-checkbox:hover { border-color: var(--mgh-grid-fg); }\n.mgh-grid-checkbox:focus-visible { outline: 2px solid var(--mgh-grid-focus); outline-offset: 2px; }\n.mgh-grid-checkbox:checked, .mgh-grid-checkbox:indeterminate { background: var(--mgh-grid-primary); border-color: var(--mgh-grid-primary); }\n.mgh-grid-checkbox:checked::after { content: \"\"; width: 5px; height: 10px; border: solid var(--mgh-grid-primary-contrast); border-width: 0 2px 2px 0; transform: translateY(-1px) rotate(45deg); }\n.mgh-grid-checkbox:indeterminate::after { content: \"\"; width: 10px; height: 2px; background: var(--mgh-grid-primary-contrast); }\n.mgh-grid-checkbox:disabled { opacity: 0.4; cursor: default; }\n.mgh-grid-checkbox-label { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; font-size: 0.875rem; padding: 6px 4px; border-radius: 4px; }\n.mgh-grid-checkbox-label:hover { background: var(--mgh-grid-hover); }\n\n/* ---- quick filter ---- */\n.mgh-grid-quick-filter { display: grid; align-items: center; }\n.mgh-grid-quick-filter-trigger { grid-area: 1 / 1; z-index: 1; transition: opacity .2s; }\n.mgh-grid-quick-filter--expanded .mgh-grid-quick-filter-trigger { opacity: 0; pointer-events: none; }\n.mgh-grid-quick-filter-control { grid-area: 1 / 1; width: 32px; opacity: 0; overflow: hidden; transition: width .2s, opacity .2s; }\n.mgh-grid-quick-filter--expanded .mgh-grid-quick-filter-control { width: 260px; opacity: 1; }\n@media (max-width: 599.95px) { .mgh-grid-quick-filter--expanded .mgh-grid-quick-filter-control { width: 180px; } }\n\n/* ---- main / scroller ---- */\n.mgh-grid-main { position: relative; display: flex; flex: 1 1 auto; min-height: 0; min-width: 0; overflow: hidden; }\n.mgh-grid--auto-height .mgh-grid-main { flex: 0 0 auto; }\n.mgh-grid-scroller { position: relative; flex: 1 1 auto; min-height: 0; min-width: 0; overflow: auto; outline: none; scrollbar-width: thin; }\n.mgh-grid--auto-height .mgh-grid-scroller { overflow-y: hidden; }\n.mgh-grid-scroller::-webkit-scrollbar { width: 10px; height: 10px; }\n.mgh-grid-scroller::-webkit-scrollbar-thumb { background: var(--mgh-grid-scrollbar); border-radius: 5px; border: 2px solid transparent; background-clip: content-box; }\n\n/* ---- column headers ---- */\n.mgh-grid-columns { position: sticky; top: 0; z-index: 3; background: var(--mgh-grid-header-bg); border-bottom: 1px solid var(--mgh-grid-border); min-width: 100%; width: max-content; }\n.mgh-grid-header-row { display: flex; min-width: 100%; }\n.mgh-grid-header-cell { position: relative; display: flex; align-items: center; flex: 0 0 auto; height: var(--mgh-grid-header-height); padding: 0 10px; font-weight: 600; font-size: 0.875rem; color: var(--mgh-grid-header-fg); background: var(--mgh-grid-header-bg); white-space: nowrap; overflow: hidden; user-select: none; outline: none; }\n.mgh-grid-header-cell--sortable { cursor: pointer; }\n.mgh-grid-header-cell:focus-visible { outline: 2px solid var(--mgh-grid-focus); outline-offset: -2px; }\n.mgh-grid-header-cell--align-center { justify-content: center; }\n.mgh-grid-header-cell--align-right { justify-content: flex-end; }\n.mgh-grid-header-cell--align-right .mgh-grid-header-title-container { flex-direction: row-reverse; }\n.mgh-grid-header-title-container { display: flex; align-items: center; gap: 2px; min-width: 0; flex: 1 1 auto; overflow: hidden; }\n.mgh-grid-header-cell--align-center .mgh-grid-header-title-container { flex: 0 1 auto; }\n.mgh-grid-header-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.mgh-grid-sort-icon { display: inline-flex; align-items: center; color: var(--mgh-grid-fg-secondary); opacity: 0; transition: opacity .15s; flex: 0 0 auto; }\n.mgh-grid-header-cell:hover .mgh-grid-sort-icon, .mgh-grid-sort-icon--active { opacity: 1; }\n.mgh-grid-sort-index { font-size: 10px; margin-left: -2px; color: var(--mgh-grid-fg-secondary); }\n.mgh-grid-header-menu-btn { position: absolute; right: 2px; opacity: 0; transition: opacity .15s; background: var(--mgh-grid-header-bg); }\n.mgh-grid-header-cell--align-right .mgh-grid-header-menu-btn { right: auto; left: 2px; }\n.mgh-grid-header-cell:hover .mgh-grid-header-menu-btn, .mgh-grid-header-menu-btn--open, .mgh-grid-header-cell:focus-within .mgh-grid-header-menu-btn { opacity: 1; }\n.mgh-grid-header-cell--menu-open { background: var(--mgh-grid-hover); }\n.mgh-grid-resize-handle { position: absolute; top: 0; right: -4px; width: 9px; height: 100%; cursor: col-resize; z-index: 2; display: flex; justify-content: center; touch-action: none; }\n.mgh-grid-resize-handle::after { content: \"\"; width: 1px; height: 60%; margin-top: 20%; background: var(--mgh-grid-border); transition: background .15s, width .15s; }\n.mgh-grid-resize-handle:hover::after, .mgh-grid-resize-handle--active::after { background: var(--mgh-grid-primary); width: 2px; }\n.mgh-grid-header-cell--last .mgh-grid-resize-handle { right: 0; }\n.mgh-grid-header-cell--dragging { opacity: 0.5; }\n.mgh-grid-header-cell--drop-left::before, .mgh-grid-header-cell--drop-right::before { content: \"\"; position: absolute; top: 4px; bottom: 4px; width: 2px; background: var(--mgh-grid-primary); z-index: 3; }\n.mgh-grid-header-cell--drop-left::before { left: 0; }\n.mgh-grid-header-cell--drop-right::before { right: 0; }\n.mgh-grid-header-filler { flex: 1 1 auto; background: var(--mgh-grid-header-bg); }\n\n/* ---- pinned cells ---- */\n.mgh-grid-cell--pinned-left, .mgh-grid-header-cell--pinned-left { position: sticky; z-index: 2; background-color: var(--mgh-grid-bg); }\n.mgh-grid-cell--pinned-right, .mgh-grid-header-cell--pinned-right { position: sticky; z-index: 2; background-color: var(--mgh-grid-bg); }\n.mgh-grid-header-cell--pinned-left, .mgh-grid-header-cell--pinned-right { z-index: 4; background-color: var(--mgh-grid-header-bg); }\n.mgh-grid-cell--pinned-left-last, .mgh-grid-header-cell--pinned-left-last { box-shadow: 2px 0 4px -2px var(--mgh-grid-pinned-shadow); }\n.mgh-grid-cell--pinned-right-first, .mgh-grid-header-cell--pinned-right-first { box-shadow: -2px 0 4px -2px var(--mgh-grid-pinned-shadow); }\n.mgh-grid--no-pinned-shadow .mgh-grid-cell--pinned-left-last, .mgh-grid--no-pinned-shadow .mgh-grid-header-cell--pinned-left-last { box-shadow: none; }\n\n/* ---- body & rows ---- */\n.mgh-grid-body { position: relative; min-width: 100%; width: max-content; }\n.mgh-grid-body--flow { display: flex; flex-direction: column; }\n.mgh-grid-row-block { min-width: 100%; }\n.mgh-grid-body--virtual .mgh-grid-row-block { position: absolute; left: 0; }\n.mgh-grid-row { display: flex; min-width: 100%; border-bottom: 1px solid var(--mgh-grid-border); background: var(--mgh-grid-bg); position: relative; }\n.mgh-grid-row--auto-height { align-items: stretch; }\n.mgh-grid-row:hover { background: var(--mgh-grid-hover); }\n.mgh-grid-row--selected { background: var(--mgh-grid-selected); }\n.mgh-grid-row--selected:hover { background: var(--mgh-grid-selected-hover); }\n.mgh-grid-row--clickable { cursor: pointer; }\n.mgh-grid-row--group { background: var(--mgh-grid-group-bg); }\n.mgh-grid-row--pinned { background: var(--mgh-grid-bg); }\n.mgh-grid-row--footer { background: var(--mgh-grid-footer-bg); font-weight: 600; }\n.mgh-grid-row:hover .mgh-grid-cell--pinned-left, .mgh-grid-row:hover .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-hover), var(--mgh-grid-hover)); }\n.mgh-grid-row--selected .mgh-grid-cell--pinned-left, .mgh-grid-row--selected .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-selected), var(--mgh-grid-selected)); }\n.mgh-grid-row--selected:hover .mgh-grid-cell--pinned-left, .mgh-grid-row--selected:hover .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-selected-hover), var(--mgh-grid-selected-hover)); }\n.mgh-grid-row--group .mgh-grid-cell--pinned-left, .mgh-grid-row--group .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-group-bg), var(--mgh-grid-group-bg)); }\n.mgh-grid-row--footer .mgh-grid-cell--pinned-left, .mgh-grid-row--footer .mgh-grid-cell--pinned-right { background-image: linear-gradient(var(--mgh-grid-footer-bg), var(--mgh-grid-footer-bg)); }\n.mgh-grid-row-filler { flex: 1 1 auto; }\n\n.mgh-grid-cell { display: flex; align-items: center; flex: 0 0 auto; padding: 0 10px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: 0.875rem; outline: none; min-height: 100%; }\n.mgh-grid-cell > .mgh-grid-cell-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.mgh-grid-row--auto-height .mgh-grid-cell { white-space: normal; align-items: flex-start; padding-top: 8px; padding-bottom: 8px; }\n.mgh-grid-row--auto-height .mgh-grid-cell > .mgh-grid-cell-text { white-space: normal; word-break: break-word; }\n.mgh-grid-cell--align-center { justify-content: center; }\n.mgh-grid-cell--align-right { justify-content: flex-end; }\n.mgh-grid-cell--focused { outline: 1px solid var(--mgh-grid-focus); outline-offset: -1px; }\n.mgh-grid-cell--editable { cursor: text; }\n.mgh-grid-cell--editing { padding: 0 4px; outline: 2px solid var(--mgh-grid-focus); outline-offset: -2px; background: var(--mgh-grid-bg); }\n.mgh-grid-cell--editing .mgh-grid-input, .mgh-grid-cell--editing .mgh-grid-select { width: 100%; height: calc(100% - 6px); border: 0; box-shadow: none; padding: 0 6px; background: transparent; }\n.mgh-grid-cell--checkbox, .mgh-grid-header-cell--checkbox, .mgh-grid-cell--detail-toggle, .mgh-grid-header-cell--detail-toggle { justify-content: center; padding: 0; }\n.mgh-grid-cell--boolean .mgh-grid-icon { color: var(--mgh-grid-fg-secondary); }\n.mgh-grid-cell--actions { gap: 2px; justify-content: center; }\n.mgh-grid-cell--aggregation { flex-direction: column; align-items: stretch; justify-content: center; line-height: 1.2; }\n.mgh-grid-cell--aggregation.mgh-grid-cell--align-right { align-items: flex-end; }\n.mgh-grid-cell--aggregation.mgh-grid-cell--align-center { align-items: center; }\n.mgh-grid-aggregation-label { font-size: 0.65rem; font-weight: 500; text-transform: uppercase; color: var(--mgh-grid-fg-secondary); letter-spacing: .04em; }\n.mgh-grid-group-cell { display: flex; align-items: center; gap: 4px; min-width: 0; }\n.mgh-grid-group-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }\n.mgh-grid-group-count { color: var(--mgh-grid-fg-secondary); margin-left: 2px; }\n.mgh-grid-group-toggle { flex: 0 0 auto; }\n.mgh-grid-group-toggle .mgh-grid-icon { transition: transform .15s; }\n.mgh-grid-group-toggle--expanded .mgh-grid-icon { transform: rotate(90deg); }\n.mgh-grid-detail-toggle .mgh-grid-icon { transition: transform .15s; }\n.mgh-grid-detail-toggle--expanded .mgh-grid-icon { transform: rotate(180deg); }\n\n/* ---- pinned rows ---- */\n.mgh-grid-pinned-rows { position: sticky; z-index: 2; min-width: 100%; width: max-content; background: var(--mgh-grid-bg); }\n.mgh-grid-pinned-rows--top { box-shadow: 0 2px 4px -2px var(--mgh-grid-pinned-shadow); }\n.mgh-grid-pinned-rows--bottom { bottom: 0; box-shadow: 0 -2px 4px -2px var(--mgh-grid-pinned-shadow); }\n.mgh-grid-pinned-rows--bottom .mgh-grid-row { border-bottom: 0; border-top: 1px solid var(--mgh-grid-border); }\n\n/* ---- detail panel ---- */\n.mgh-grid-detail-panel { position: sticky; left: 0; overflow: auto; border-bottom: 1px solid var(--mgh-grid-border); background: var(--mgh-grid-bg); z-index: 1; }\n\n/* ---- overlays ---- */\n.mgh-grid-overlay { position: absolute; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 8px; z-index: 5; color: var(--mgh-grid-fg-secondary); font-size: 0.875rem; pointer-events: none; }\n.mgh-grid-overlay--loading { background: var(--mgh-grid-overlay); pointer-events: auto; }\n.mgh-grid-no-rows { display: flex; align-items: center; justify-content: center; gap: 8px; height: 100%; text-align: center; padding: 16px; }\n.mgh-grid-no-rows img, .mgh-grid-no-rows .mgh-grid-icon { width: 50px; height: 50px; color: var(--mgh-grid-fg-disabled); }\n.mgh-grid-spinner { width: 36px; height: 36px; border-radius: 50%; border: 3px solid var(--mgh-grid-selected); border-top-color: var(--mgh-grid-primary); animation: mgh-grid-spin .8s linear infinite; }\n@keyframes mgh-grid-spin { to { transform: rotate(360deg); } }\n\n/* ---- footer ---- */\n.mgh-grid-footer { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 52px; padding: 0 8px 0 16px; border-top: 1px solid var(--mgh-grid-border); font-size: 0.875rem; color: var(--mgh-grid-fg-secondary); flex-wrap: wrap; }\n.mgh-grid-footer-left { display: flex; align-items: center; gap: 16px; }\n.mgh-grid-pagination { display: flex; align-items: center; gap: 8px; margin-left: auto; flex-wrap: wrap; }\n.mgh-grid-pagination-select { height: 32px; padding: 2px 24px 2px 8px; font-size: 0.875rem; border-color: transparent; }\n.mgh-grid-pagination-select:hover { border-color: transparent; background-color: var(--mgh-grid-hover); }\n.mgh-grid-pagination-actions { display: inline-flex; align-items: center; }\n\n/* ---- popover / menu / panels ---- */\n.mgh-grid-popover {\n --mgh-grid-font-family: inherit; --mgh-grid-font-size: 14px; --mgh-grid-paper: #ffffff; --mgh-grid-bg: #fff; --mgh-grid-fg: rgba(0,0,0,.87); --mgh-grid-fg-secondary: rgba(0,0,0,.6); --mgh-grid-fg-disabled: rgba(0,0,0,.38); --mgh-grid-border: rgba(224,224,224,1); --mgh-grid-hover: rgba(0,0,0,.04); --mgh-grid-selected: rgba(25,118,210,.08); --mgh-grid-primary: #1976d2; --mgh-grid-primary-contrast: #fff; --mgh-grid-focus: #1976d2; --mgh-grid-input-bg: transparent; --mgh-grid-input-border: rgba(0,0,0,.23); --mgh-grid-popover-shadow: 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12);\n position: fixed; z-index: 1300; background: var(--mgh-grid-paper); color: var(--mgh-grid-fg); border-radius: 8px; box-shadow: var(--mgh-grid-popover-shadow); font-family: var(--mgh-grid-font-family); font-size: var(--mgh-grid-font-size); line-height: 1.5; outline: none; max-height: calc(100vh - 16px); overflow: auto; animation: mgh-grid-pop .12s ease-out;\n}\n.mgh-grid-popover[data-mgh-theme=\"dark\"] { --mgh-grid-paper: #212b36; --mgh-grid-bg: #212b36; --mgh-grid-fg: #fff; --mgh-grid-fg-secondary: rgba(255,255,255,.7); --mgh-grid-fg-disabled: rgba(255,255,255,.5); --mgh-grid-border: rgba(81,81,81,1); --mgh-grid-hover: rgba(255,255,255,.08); --mgh-grid-selected: rgba(144,202,249,.16); --mgh-grid-primary: #90caf9; --mgh-grid-primary-contrast: rgba(0,0,0,.87); --mgh-grid-focus: #90caf9; --mgh-grid-input-border: rgba(255,255,255,.23); }\n@keyframes mgh-grid-pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }\n.mgh-grid-menu { list-style: none; margin: 0; padding: 6px 0; min-width: 180px; }\n.mgh-grid-menu-item { display: flex; align-items: center; gap: 12px; padding: 6px 16px; min-height: 36px; font-size: 0.875rem; cursor: pointer; white-space: nowrap; color: var(--mgh-grid-fg); background: transparent; border: 0; width: 100%; text-align: left; font-family: inherit; outline: none; }\n.mgh-grid-menu-item:hover, .mgh-grid-menu-item:focus-visible { background: var(--mgh-grid-hover); }\n.mgh-grid-menu-item--disabled { color: var(--mgh-grid-fg-disabled); cursor: default; pointer-events: none; }\n.mgh-grid-menu-item--selected { background: var(--mgh-grid-selected); }\n.mgh-grid-menu-item .mgh-grid-icon { color: var(--mgh-grid-fg-secondary); flex: 0 0 auto; }\n.mgh-grid-menu-divider { height: 1px; margin: 6px 0; background: var(--mgh-grid-border); border: 0; }\n.mgh-grid-menu-header { padding: 6px 16px 2px; font-size: 0.75rem; color: var(--mgh-grid-fg-secondary); text-transform: uppercase; letter-spacing: .04em; }\n.mgh-grid-menu-section { padding: 4px 16px 8px; display: flex; flex-direction: column; gap: 4px; }\n.mgh-grid-panel { display: flex; flex-direction: column; min-width: 300px; max-width: min(640px, calc(100vw - 16px)); }\n.mgh-grid-panel-header { padding: 12px 12px 4px; }\n.mgh-grid-panel-content { padding: 4px 12px; overflow: auto; max-height: 360px; }\n.mgh-grid-panel-footer { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 12px; }\n.mgh-grid-columns-list { display: flex; flex-direction: column; }\n.mgh-grid-filter-row { display: grid; grid-template-columns: 32px minmax(120px, 1fr) minmax(120px, 1fr) minmax(140px, 1.3fr); gap: 8px; align-items: end; margin-bottom: 8px; }\n.mgh-grid-filter-row--first { grid-template-columns: 32px minmax(120px, 1fr) minmax(120px, 1fr) minmax(140px, 1.3fr); }\n.mgh-grid-filter-row--with-logic { grid-template-columns: 32px 80px minmax(120px, 1fr) minmax(120px, 1fr) minmax(140px, 1.3fr); }\n.mgh-grid-filter-row .mgh-grid-btn--icon { margin-bottom: 4px; }\n.mgh-grid-filter-empty { padding: 8px 4px; color: var(--mgh-grid-fg-secondary); font-size: 0.875rem; }\n@media (max-width: 599.95px) { .mgh-grid-filter-row, .mgh-grid-filter-row--with-logic { grid-template-columns: 1fr; } }\n\n/* ---- misc ---- */\n.mgh-grid-tooltip-anchor { display: inline-flex; }\n.mgh-grid-visually-hidden { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); border: 0; }\n@media print { .mgh-grid-toolbar, .mgh-grid-footer { display: none !important; } }\n`;\n\nlet injected = false;\n\nconst injectStyles = () => {\n if (injected || typeof document === 'undefined') return;\n if (document.getElementById(MGH_GRID_STYLE_ID)) {\n injected = true;\n return;\n }\n const style = document.createElement('style');\n style.id = MGH_GRID_STYLE_ID;\n style.setAttribute('data-mgh-grid', 'true');\n style.textContent = MGH_GRID_CSS;\n document.head.appendChild(style);\n injected = true;\n};\n\nconst useInsertion: typeof React.useLayoutEffect =\n (React as any).useInsertionEffect ?? (typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect);\n\n/** Injects the MGHGrid stylesheet once per document. Safe on the server (no-op). */\nexport const useMGHGridStyles = () => {\n useInsertion(() => {\n injectStyles();\n }, []);\n};\n","import React from 'react';\nimport {\n MGHGridAggregationFunction,\n MGHGridApi,\n MGHGridColDef,\n MGHGridLocaleText,\n MGHGridState,\n MGHGridThemeMode,\n MGHGridValidRowModel,\n} from './MGHGrid.types';\n\nexport interface MGHGridRootProps {\n header?: React.ReactNode;\n pagination: boolean;\n pageSizeOptions: number[];\n hideFooterPagination: boolean;\n hideFooterRowCount: boolean;\n hideFooterSelectedRowCount: boolean;\n disableColumnFilter: boolean;\n disableColumnSelector: boolean;\n disableDensitySelector: boolean;\n disableColumnPinning: boolean;\n disableColumnSorting: boolean;\n disableMultipleColumnsSorting: boolean;\n disableMultipleColumnsFiltering: boolean;\n disableRowGrouping: boolean;\n disableAggregation: boolean;\n checkboxSelection: boolean;\n aggregationFunctions: Record<string, MGHGridAggregationFunction>;\n quickFilterDebounceMs: number;\n}\n\nexport interface MGHGridContextValue {\n api: MGHGridApi;\n state: MGHGridState;\n localeText: MGHGridLocaleText;\n themeMode: MGHGridThemeMode;\n rootProps: MGHGridRootProps;\n /** All user columns (ordered, including hidden). */\n columns: MGHGridColDef[];\n /** Visible user columns. */\n visibleColumns: MGHGridColDef[];\n}\n\nexport const MGHGridContext = React.createContext<MGHGridContextValue | null>(null);\nMGHGridContext.displayName = 'MGHGridContext';\n\nexport const useMGHGridContext = () => {\n const ctx = React.useContext(MGHGridContext);\n if (!ctx) {\n throw new Error('MGHGrid: this component must be rendered inside an <MGHGrid /> (e.g. through a slot).');\n }\n return ctx;\n};\n\n/** Access the grid API from custom toolbars, menu items, cells, etc. */\nexport const useMGHGridApiContext = <R extends MGHGridValidRowModel = any>() => useMGHGridContext().api as MGHGridApi<R>;\n\nexport const useMGHGridLocaleText = () => useMGHGridContext().localeText;\n\n/** Creates a ref to hold the grid API; pass it to `<MGHGrid apiRef={apiRef} />`. */\nexport const useMGHGridApiRef = <R extends MGHGridValidRowModel = any>() =>\n React.useRef<MGHGridApi<R> | null>(null) as React.MutableRefObject<MGHGridApi<R> | null>;\n","import React from 'react';\n\n/** Keeps a ref always pointing at the latest value (assigned during render). */\nexport function useLatestRef<T>(value: T) {\n const ref = React.useRef(value);\n ref.current = value;\n return ref;\n}\n\n/** Returns a stable function that always calls the latest `fn`. */\nexport function useEventCallback<T extends (...args: any[]) => any>(fn: T): T {\n const ref = useLatestRef(fn);\n return React.useCallback(((...args: any[]) => ref.current(...args)) as T, []);\n}\n\n/**\n * Controlled / uncontrolled state helper. When `controlled` is defined the internal state is\n * ignored and every change is reported through `onChange` only.\n */\nexport function useControlledState<T>(\n controlled: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void\n): [T, (next: T | ((prev: T) => T)) => void] {\n const isControlled = controlled !== undefined;\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const value = isControlled ? (controlled as T) : internal;\n const valueRef = useLatestRef(value);\n const controlledRef = useLatestRef(isControlled);\n const onChangeRef = useLatestRef(onChange);\n\n const setValue = React.useCallback((next: T | ((prev: T) => T)) => {\n const resolved = typeof next === 'function' ? (next as (prev: T) => T)(valueRef.current) : next;\n if (Object.is(resolved, valueRef.current)) return;\n valueRef.current = resolved;\n if (!controlledRef.current) setInternal(resolved);\n onChangeRef.current?.(resolved);\n }, []);\n\n return [value, setValue];\n}\n\nexport interface ElementSize {\n width: number;\n height: number;\n}\n\n/** Observes the client size of an element. */\nexport function useElementSize<T extends HTMLElement>(ref: React.RefObject<T | null>, enabled = true): ElementSize {\n const [size, setSize] = React.useState<ElementSize>({ width: 0, height: 0 });\n\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return undefined;\n const update = () => {\n const width = el.clientWidth;\n const height = el.clientHeight;\n setSize((prev) => (prev.width === width && prev.height === height ? prev : { width, height }));\n };\n update();\n if (typeof ResizeObserver === 'undefined') {\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref, enabled]);\n\n return size;\n}\n\n/** `window.matchMedia` as a hook. Always false on the server. */\nexport function useMediaQuery(query: string) {\n const getMatch = () =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function' ? window.matchMedia(query).matches : false;\n const [matches, setMatches] = React.useState(getMatch);\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return undefined;\n const media = window.matchMedia(query);\n const listener = () => setMatches(media.matches);\n listener();\n if (media.addEventListener) {\n media.addEventListener('change', listener);\n return () => media.removeEventListener('change', listener);\n }\n media.addListener(listener);\n return () => media.removeListener(listener);\n }, [query]);\n\n return matches;\n}\n\n/** Debounced version of a callback. The returned function is stable. */\nexport function useDebouncedCallback<T extends (...args: any[]) => void>(fn: T, delay: number) {\n const fnRef = useLatestRef(fn);\n const timerRef = React.useRef<number | null>(null);\n\n React.useEffect(\n () => () => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n },\n []\n );\n\n return React.useCallback(\n (...args: Parameters<T>) => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => {\n timerRef.current = null;\n fnRef.current(...args);\n }, delay);\n },\n [delay]\n );\n}\n\nexport function useForceUpdate() {\n const [, setTick] = React.useState(0);\n return React.useCallback(() => setTick((t) => t + 1), []);\n}\n\nlet idCounter = 0;\n/** Stable unique id per component instance (React.useId fallback for older Reacts). */\nexport function useStableId(prefix: string) {\n const reactUseId = (React as any).useId as undefined | (() => string);\n if (reactUseId) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const id = reactUseId();\n return `${prefix}-${id.replace(/:/g, '')}`;\n }\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const ref = React.useRef<string | null>(null);\n if (ref.current === null) {\n idCounter += 1;\n ref.current = `${prefix}-${idCounter}`;\n }\n return ref.current;\n}\n","import {\n MGHGridApi,\n MGHGridColDef,\n MGHGridCsvExportOptions,\n MGHGridExcelExportOptions,\n MGHGridExportOptions,\n MGHGridPrintExportOptions,\n MGHGridRowId,\n} from './MGHGrid.types';\nimport {\n downloadBlob,\n formattedValueToString,\n getCellValue,\n getFormattedValue,\n isInternalField,\n isNil,\n toDate,\n} from './utils';\n\n/* -------------------------------------------------------------------------------------------------\n * Shared: resolve the columns & rows to export\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface ExportCell {\n raw: any;\n formatted: string;\n col: MGHGridColDef;\n}\n\nexport interface ExportTable {\n columns: MGHGridColDef[];\n headers: string[];\n rows: ExportCell[][];\n}\n\nexport const resolveExportColumns = (api: MGHGridApi, options: MGHGridExportOptions): MGHGridColDef[] => {\n const all = api.getAllColumns();\n let columns: MGHGridColDef[];\n if (options.fields) {\n const byField = new Map<string, MGHGridColDef>();\n all.forEach((c) => byField.set(c.field, c));\n columns = options.fields.map((f) => byField.get(f)).filter(Boolean) as MGHGridColDef[];\n } else if (options.allColumns) {\n columns = all;\n } else {\n columns = api.getVisibleColumns();\n }\n return columns.filter((c) => !c.disableExport && !isInternalField(c.field) && c.type !== 'actions');\n};\n\nexport const buildExportTable = (api: MGHGridApi, options: MGHGridExportOptions): ExportTable => {\n const columns = resolveExportColumns(api, options);\n const ids: MGHGridRowId[] = options.getRowsToExport ? options.getRowsToExport({ api }) : api.getSortedRowIds();\n const rows: ExportCell[][] = [];\n ids.forEach((id) => {\n const row = api.getRow(id);\n if (!row) return;\n rows.push(\n columns.map((col) => {\n const raw = getCellValue(row, col, api);\n const formatted = formattedValueToString(getFormattedValue(raw, row, col, api, id));\n return { raw, formatted, col };\n })\n );\n });\n return { columns, headers: columns.map((c) => c.headerName ?? c.field), rows };\n};\n\nconst sanitizeFileName = (name: string | undefined, fallback: string, extension: string) => {\n const base = (name && name.trim()) || fallback;\n return base.toLowerCase().endsWith(`.${extension}`) ? base : `${base}.${extension}`;\n};\n\nconst defaultFileBase = () => {\n const title = typeof document !== 'undefined' && document.title ? document.title.trim() : '';\n return (title || 'export').replace(/[\\\\/:*?\"<>|]+/g, '-');\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CSV\n * ----------------------------------------------------------------------------------------------- */\n\nconst escapeCsvCell = (value: string, delimiter: string) => {\n let text = value;\n // Guard against formula injection when opening in spreadsheet software.\n if (/^[=+\\-@\\t\\r]/.test(text)) text = `'${text}`;\n if (text.indexOf('\"') !== -1 || text.indexOf(delimiter) !== -1 || /[\\r\\n]/.test(text)) {\n return `\"${text.replace(/\"/g, '\"\"')}\"`;\n }\n return text;\n};\n\nexport const getDataAsCsv = (api: MGHGridApi, options: MGHGridCsvExportOptions = {}) => {\n const delimiter = options.delimiter ?? ',';\n const includeHeaders = options.includeHeaders ?? true;\n const table = buildExportTable(api, options);\n const lines: string[] = [];\n if (includeHeaders) {\n lines.push(table.headers.map((h) => escapeCsvCell(h, delimiter)).join(delimiter));\n }\n table.rows.forEach((cells) => {\n lines.push(\n cells\n .map((cell) => {\n const text = options.useRawValues ? (isNil(cell.raw) ? '' : String(cell.raw)) : cell.formatted;\n return escapeCsvCell(text, delimiter);\n })\n .join(delimiter)\n );\n });\n return lines.join('\\r\\n');\n};\n\nconst UTF8_BOM = String.fromCharCode(0xfeff);\n\nexport const exportDataAsCsv = (api: MGHGridApi, options: MGHGridCsvExportOptions = {}) => {\n const csv = getDataAsCsv(api, options);\n const bom = options.utf8WithBom ? UTF8_BOM : '';\n const blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' });\n downloadBlob(blob, sanitizeFileName(options.fileName, defaultFileBase(), 'csv'));\n};\n\n/* -------------------------------------------------------------------------------------------------\n * XLSX (minimal OOXML writer + store-only ZIP, no dependencies)\n * ----------------------------------------------------------------------------------------------- */\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n += 1) {\n let c = n;\n for (let k = 0; k < 8; k += 1) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[n] = c >>> 0;\n }\n return table;\n})();\n\nconst crc32 = (bytes: Uint8Array) => {\n let crc = 0xffffffff;\n for (let i = 0; i < bytes.length; i += 1) {\n crc = CRC_TABLE[(crc ^ bytes[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n};\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\n\nconst encodeUtf8 = (text: string): Uint8Array => {\n if (textEncoder) return textEncoder.encode(text);\n // Fallback for very old environments.\n const utf8 = unescape(encodeURIComponent(text));\n const out = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i += 1) out[i] = utf8.charCodeAt(i);\n return out;\n};\n\ninterface ZipEntry {\n name: string;\n data: Uint8Array;\n}\n\nconst concatBytes = (chunks: Uint8Array[]) => {\n const total = chunks.reduce((acc, c) => acc + c.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n chunks.forEach((c) => {\n out.set(c, offset);\n offset += c.length;\n });\n return out;\n};\n\nconst zipStore = (entries: ZipEntry[]): Uint8Array => {\n const localChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let offset = 0;\n // 1980-01-01 00:00 in DOS date/time format.\n const dosTime = 0;\n const dosDate = (1 << 5) | 1;\n\n entries.forEach((entry) => {\n const nameBytes = encodeUtf8(entry.name);\n const crc = crc32(entry.data);\n const size = entry.data.length;\n\n const local = new Uint8Array(30 + nameBytes.length);\n const lv = new DataView(local.buffer);\n lv.setUint32(0, 0x04034b50, true);\n lv.setUint16(4, 20, true);\n lv.setUint16(6, 0x0800, true); // UTF-8 names\n lv.setUint16(8, 0, true); // store\n lv.setUint16(10, dosTime, true);\n lv.setUint16(12, dosDate, true);\n lv.setUint32(14, crc, true);\n lv.setUint32(18, size, true);\n lv.setUint32(22, size, true);\n lv.setUint16(26, nameBytes.length, true);\n lv.setUint16(28, 0, true);\n local.set(nameBytes, 30);\n\n const central = new Uint8Array(46 + nameBytes.length);\n const cv = new DataView(central.buffer);\n cv.setUint32(0, 0x02014b50, true);\n cv.setUint16(4, 20, true);\n cv.setUint16(6, 20, true);\n cv.setUint16(8, 0x0800, true);\n cv.setUint16(10, 0, true);\n cv.setUint16(12, dosTime, true);\n cv.setUint16(14, dosDate, true);\n cv.setUint32(16, crc, true);\n cv.setUint32(20, size, true);\n cv.setUint32(24, size, true);\n cv.setUint16(28, nameBytes.length, true);\n cv.setUint16(30, 0, true);\n cv.setUint16(32, 0, true);\n cv.setUint16(34, 0, true);\n cv.setUint16(36, 0, true);\n cv.setUint32(38, 0, true);\n cv.setUint32(42, offset, true);\n central.set(nameBytes, 46);\n\n localChunks.push(local, entry.data);\n centralChunks.push(central);\n offset += local.length + size;\n });\n\n const centralDirectory = concatBytes(centralChunks);\n const eocd = new Uint8Array(22);\n const ev = new DataView(eocd.buffer);\n ev.setUint32(0, 0x06054b50, true);\n ev.setUint16(4, 0, true);\n ev.setUint16(6, 0, true);\n ev.setUint16(8, entries.length, true);\n ev.setUint16(10, entries.length, true);\n ev.setUint32(12, centralDirectory.length, true);\n ev.setUint32(16, offset, true);\n ev.setUint16(20, 0, true);\n\n return concatBytes(localChunks.concat([centralDirectory, eocd]));\n};\n\n// Characters that are illegal in XML 1.0 (built without literal control characters in source).\nconst INVALID_XML_CHARS = new RegExp(\n '[' +\n String.fromCharCode(0x00) +\n '-' +\n String.fromCharCode(0x08) +\n String.fromCharCode(0x0b) +\n String.fromCharCode(0x0c) +\n String.fromCharCode(0x0e) +\n '-' +\n String.fromCharCode(0x1f) +\n String.fromCharCode(0xfffe) +\n String.fromCharCode(0xffff) +\n ']',\n 'g'\n);\nconst stripInvalidXml = (text: string) => text.replace(INVALID_XML_CHARS, '');\n\nconst escapeXml = (text: string) =>\n stripInvalidXml(text)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\nconst columnLetter = (index: number) => {\n let n = index + 1;\n let letters = '';\n while (n > 0) {\n const rem = (n - 1) % 26;\n letters = String.fromCharCode(65 + rem) + letters;\n n = Math.floor((n - 1) / 26);\n }\n return letters;\n};\n\nconst sanitizeSheetName = (name: string | undefined) => {\n const cleaned = (name || 'Sheet1').replace(/[\\[\\]:*?/\\\\]/g, ' ').trim() || 'Sheet1';\n return cleaned.length > 31 ? cleaned.slice(0, 31) : cleaned;\n};\n\nconst XML_HEADER = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n\nconst buildSheetXml = (table: ExportTable, includeHeaders: boolean, columnWidths: number[]) => {\n const rowsXml: string[] = [];\n let rowIndex = 1;\n\n const inlineString = (ref: string, text: string, style?: number) =>\n `<c r=\"${ref}\" t=\"inlineStr\"${style ? ` s=\"${style}\"` : ''}><is><t xml:space=\"preserve\">${escapeXml(\n text\n )}</t></is></c>`;\n\n if (includeHeaders) {\n const cells = table.headers.map((h, i) => inlineString(`${columnLetter(i)}${rowIndex}`, h, 1)).join('');\n rowsXml.push(`<row r=\"${rowIndex}\">${cells}</row>`);\n rowIndex += 1;\n }\n\n table.rows.forEach((cells) => {\n const xmlCells = cells\n .map((cell, i) => {\n const ref = `${columnLetter(i)}${rowIndex}`;\n const type = cell.col.type;\n if (isNil(cell.raw) || cell.raw === '') return '';\n if (type === 'number' && typeof cell.raw === 'number' && Number.isFinite(cell.raw)) {\n return `<c r=\"${ref}\"><v>${cell.raw}</v></c>`;\n }\n if (type === 'boolean') {\n return `<c r=\"${ref}\" t=\"b\"><v>${cell.raw ? 1 : 0}</v></c>`;\n }\n if ((type === 'date' || type === 'dateTime') && toDate(cell.raw)) {\n // Excel serial date (days since 1899-12-30), written in local time with a date style.\n const d = toDate(cell.raw) as Date;\n const utc = Date.UTC(\n d.getFullYear(),\n d.getMonth(),\n d.getDate(),\n d.getHours(),\n d.getMinutes(),\n d.getSeconds()\n );\n const serial = utc / 86400000 + 25569;\n return `<c r=\"${ref}\" s=\"${type === 'dateTime' ? 3 : 2}\"><v>${serial}</v></c>`;\n }\n return inlineString(ref, cell.formatted);\n })\n .join('');\n rowsXml.push(`<row r=\"${rowIndex}\">${xmlCells}</row>`);\n rowIndex += 1;\n });\n\n const lastCol = columnLetter(Math.max(table.columns.length - 1, 0));\n const lastRow = Math.max(rowIndex - 1, 1);\n const cols = columnWidths.map((w, i) => `<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${w}\" customWidth=\"1\"/>`).join('');\n\n return (\n XML_HEADER +\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ' +\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n `<dimension ref=\"A1:${lastCol}${lastRow}\"/>` +\n '<sheetViews><sheetView workbookViewId=\"0\">' +\n (includeHeaders ? '<pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\"/>' : '') +\n '</sheetView></sheetViews>' +\n '<sheetFormatPr defaultRowHeight=\"15\"/>' +\n (cols ? `<cols>${cols}</cols>` : '') +\n `<sheetData>${rowsXml.join('')}</sheetData>` +\n (includeHeaders && table.rows.length > 0 ? `<autoFilter ref=\"A1:${lastCol}${lastRow}\"/>` : '') +\n '</worksheet>'\n );\n};\n\nconst STYLES_XML =\n XML_HEADER +\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n '<numFmts count=\"2\"><numFmt numFmtId=\"164\" formatCode=\"m/d/yyyy\"/><numFmt numFmtId=\"165\" formatCode=\"m/d/yyyy h:mm AM/PM\"/></numFmts>' +\n '<fonts count=\"2\"><font><sz val=\"11\"/><name val=\"Calibri\"/></font><font><b/><sz val=\"11\"/><name val=\"Calibri\"/></font></fonts>' +\n '<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>' +\n '<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n '<cellXfs count=\"4\">' +\n '<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>' +\n '<xf numFmtId=\"0\" fontId=\"1\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"/>' +\n '<xf numFmtId=\"164\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>' +\n '<xf numFmtId=\"165\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>' +\n '</cellXfs>' +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>' +\n '</styleSheet>';\n\nconst CONTENT_TYPES_XML =\n XML_HEADER +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' +\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>' +\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>' +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\n '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>' +\n '</Types>';\n\nconst ROOT_RELS_XML =\n XML_HEADER +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>' +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n '<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>' +\n '</Relationships>';\n\nconst WORKBOOK_RELS_XML =\n XML_HEADER +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>' +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>' +\n '</Relationships>';\n\nconst buildWorkbookXml = (sheetName: string) =>\n XML_HEADER +\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ' +\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n `<sheets><sheet name=\"${escapeXml(sheetName)}\" sheetId=\"1\" r:id=\"rId1\"/></sheets>` +\n '</workbook>';\n\nconst buildCoreXml = () => {\n const now = new Date().toISOString();\n return (\n XML_HEADER +\n '<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" ' +\n 'xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" ' +\n 'xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' +\n '<dc:creator>MGH Grid</dc:creator>' +\n `<dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>` +\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>` +\n '</cp:coreProperties>'\n );\n};\n\nconst APP_XML =\n XML_HEADER +\n '<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" ' +\n 'xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' +\n '<Application>MGH Grid</Application></Properties>';\n\nexport const buildXlsx = (api: MGHGridApi, options: MGHGridExcelExportOptions = {}): Uint8Array => {\n const includeHeaders = options.includeHeaders ?? true;\n const table = buildExportTable(api, options);\n const widths = table.columns.map((col, i) => {\n const explicit = options.columnsStyles?.[col.field]?.width;\n if (explicit) return explicit;\n let max = table.headers[i].length;\n for (let r = 0; r < Math.min(table.rows.length, 500); r += 1) {\n const len = table.rows[r][i].formatted.length;\n if (len > max) max = len;\n }\n return Math.min(Math.max(max + 2, 8), 60);\n });\n const sheetName = sanitizeSheetName(options.sheetName);\n const entries: ZipEntry[] = [\n { name: '[Content_Types].xml', data: encodeUtf8(CONTENT_TYPES_XML) },\n { name: '_rels/.rels', data: encodeUtf8(ROOT_RELS_XML) },\n { name: 'docProps/core.xml', data: encodeUtf8(buildCoreXml()) },\n { name: 'docProps/app.xml', data: encodeUtf8(APP_XML) },\n { name: 'xl/workbook.xml', data: encodeUtf8(buildWorkbookXml(sheetName)) },\n { name: 'xl/_rels/workbook.xml.rels', data: encodeUtf8(WORKBOOK_RELS_XML) },\n { name: 'xl/styles.xml', data: encodeUtf8(STYLES_XML) },\n { name: 'xl/worksheets/sheet1.xml', data: encodeUtf8(buildSheetXml(table, includeHeaders, widths)) },\n ];\n return zipStore(entries);\n};\n\nexport const exportDataAsExcel = async (api: MGHGridApi, options: MGHGridExcelExportOptions = {}) => {\n const bytes = buildXlsx(api, options);\n const blob = new Blob([bytes as BlobPart], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n downloadBlob(blob, sanitizeFileName(options.fileName, defaultFileBase(), 'xlsx'));\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Print\n * ----------------------------------------------------------------------------------------------- */\n\nconst escapeHtml = (text: string) =>\n text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\n/** Legacy value-based print (plain HTML table). The grid's `exportDataAsPrint` prints the live DOM instead. */\nexport const exportDataAsPrintTable = (api: MGHGridApi, options: MGHGridPrintExportOptions = {}) => {\n if (typeof document === 'undefined') return;\n const includeHeaders = options.includeHeaders ?? true;\n const table = buildExportTable(api, options);\n const title = options.title ?? options.fileName ?? document.title ?? '';\n\n const headerHtml = includeHeaders\n ? `<thead><tr>${table.headers\n .map((h, i) => `<th class=\"${table.columns[i].align ?? 'left'}\">${escapeHtml(h)}</th>`)\n .join('')}</tr></thead>`\n : '';\n const bodyHtml = `<tbody>${table.rows\n .map(\n (cells) =>\n `<tr>${cells\n .map((cell) => `<td class=\"${cell.col.align ?? 'left'}\">${escapeHtml(cell.formatted)}</td>`)\n .join('')}</tr>`\n )\n .join('')}</tbody>`;\n\n const html =\n '<!doctype html><html><head><meta charset=\"utf-8\" />' +\n `<title>${escapeHtml(title)}</title>` +\n '<style>' +\n 'body{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;font-size:12px;color:#111;margin:16px;}' +\n 'h1{font-size:16px;margin:0 0 12px;}' +\n 'table{border-collapse:collapse;width:100%;}' +\n 'th,td{border:1px solid #ccc;padding:4px 8px;text-align:left;vertical-align:top;}' +\n 'th{background:#f3f3f3;font-weight:600;}' +\n 'td.right,th.right{text-align:right;} td.center,th.center{text-align:center;}' +\n 'tr{page-break-inside:avoid;} thead{display:table-header-group;}' +\n (options.pageStyle ?? '') +\n '</style></head><body>' +\n (title ? `<h1>${escapeHtml(title)}</h1>` : '') +\n `<table>${headerHtml}${bodyHtml}</table>` +\n '</body></html>';\n\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n iframe.style.opacity = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n window.setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n iframe.onload = () => {\n const win = iframe.contentWindow;\n if (!win) {\n cleanup();\n return;\n }\n try {\n win.focus();\n win.onafterprint = cleanup;\n win.print();\n } catch {\n cleanup();\n }\n };\n\n const doc = iframe.contentDocument || iframe.contentWindow?.document;\n if (doc) {\n doc.open();\n doc.write(html);\n doc.close();\n } else {\n iframe.srcdoc = html;\n }\n};\n","import { MGHGridPrintExportOptions } from './MGHGrid.types';\n\n/**\n * Prints the grid \"as seen on screen\": the live DOM of the grid card is cloned into a hidden iframe\n * together with the page's stylesheets, so anything rendered by `renderCell` (images, chips,\n * links, custom components) prints exactly as displayed. The grid itself must already be rendered\n * in print mode (all rows, no virtualization) when this is called.\n */\n\nconst PRINT_CSS = `\n@page { margin: 10mm; }\nhtml, body { margin: 0; padding: 0; background: #fff; }\n.mgh-grid-print-title { margin: 0 0 12px; font: 600 16px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; }\n.mgh-grid-card { box-shadow: none !important; border-radius: 0 !important; height: auto !important; max-height: none !important; overflow: visible !important; background: transparent !important; }\n.mgh-grid-box { height: auto !important; max-height: none !important; flex: none !important; }\n.mgh-grid { height: auto !important; max-height: none !important; border-radius: 0 !important; }\n.mgh-grid-main, .mgh-grid-scroller { overflow: visible !important; height: auto !important; max-height: none !important; }\n.mgh-grid-columns, .mgh-grid-pinned-rows, .mgh-grid-detail-panel { position: static !important; box-shadow: none !important; }\n.mgh-grid-header-cell, .mgh-grid-cell { position: static !important; box-shadow: none !important; background-image: none !important; }\n.mgh-grid-detail-panel { width: auto !important; }\n.mgh-grid-body { min-height: 0 !important; }\n.mgh-grid-row, .mgh-grid-row-block, .mgh-grid-detail-panel { break-inside: avoid; page-break-inside: avoid; }\n.mgh-grid-columns { break-after: avoid; page-break-after: avoid; }\n.mgh-grid-header-menu-btn, .mgh-grid-resize-handle, .mgh-grid-overlay, .mgh-grid-sort-icon:not(.mgh-grid-sort-icon--active) { display: none !important; }\n.mgh-grid-popover { display: none !important; }\n`;\n\nconst collectStyles = (doc: Document) => {\n const styles: string[] = [];\n const links: string[] = [];\n Array.from(doc.styleSheets).forEach((sheet) => {\n try {\n const rules = Array.from(sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n');\n if (rules) styles.push(rules);\n } catch {\n // Cross-origin stylesheet: reference it instead of inlining.\n if (sheet.href) links.push(sheet.href);\n }\n });\n return { styles, links };\n};\n\nconst escapeHtml = (text: string) =>\n text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\n/** Copies live form-control state (cloneNode does not copy `checked` / `value`). */\nconst syncFormState = (source: HTMLElement, target: HTMLElement) => {\n const sourceInputs = Array.from(source.querySelectorAll('input, select, textarea'));\n const targetInputs = Array.from(target.querySelectorAll('input, select, textarea'));\n sourceInputs.forEach((el, i) => {\n const t = targetInputs[i];\n if (!t || t.tagName !== el.tagName) return;\n // Tag-name checks instead of `instanceof`: the elements may belong to different documents.\n if (el.tagName === 'INPUT') {\n const src = el as HTMLInputElement;\n const dst = t as HTMLInputElement;\n if (src.type === 'checkbox' || src.type === 'radio') {\n dst.checked = src.checked;\n if (src.checked) dst.setAttribute('checked', '');\n dst.indeterminate = src.indeterminate;\n } else {\n dst.value = src.value;\n dst.setAttribute('value', src.value);\n }\n } else if (el.tagName === 'SELECT') {\n (t as HTMLSelectElement).value = (el as HTMLSelectElement).value;\n } else if (el.tagName === 'TEXTAREA') {\n (t as HTMLTextAreaElement).value = (el as HTMLTextAreaElement).value;\n t.textContent = (el as HTMLTextAreaElement).value;\n }\n });\n // Canvases lose their bitmap when cloned: replace them with images.\n const sourceCanvases = Array.from(source.querySelectorAll('canvas'));\n const targetCanvases = Array.from(target.querySelectorAll('canvas'));\n sourceCanvases.forEach((canvas, i) => {\n const t = targetCanvases[i];\n if (!t) return;\n try {\n const img = t.ownerDocument.createElement('img');\n img.src = canvas.toDataURL();\n img.width = canvas.width;\n img.height = canvas.height;\n img.style.cssText = t.style.cssText;\n t.replaceWith(img);\n } catch {\n /* tainted canvas – leave as is */\n }\n });\n};\n\nconst waitForImages = (doc: Document, timeoutMs: number) =>\n new Promise<void>((resolve) => {\n const images = Array.from(doc.images).filter((img) => !img.complete);\n if (images.length === 0) {\n resolve();\n return;\n }\n let remaining = images.length;\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n resolve();\n };\n const timer = window.setTimeout(finish, timeoutMs);\n images.forEach((img) => {\n const onSettled = () => {\n remaining -= 1;\n if (remaining <= 0) {\n window.clearTimeout(timer);\n finish();\n }\n };\n img.addEventListener('load', onSettled, { once: true });\n img.addEventListener('error', onSettled, { once: true });\n });\n });\n\nexport interface PrintGridParams {\n /** The `.mgh-grid-card` element (already rendered in print mode). */\n cardElement: HTMLElement;\n options: MGHGridPrintExportOptions;\n /** Called once the print dialog has been handed off (or failed) so the grid can leave print mode. */\n onDone: () => void;\n}\n\nexport const printGridElement = (params: PrintGridParams) => {\n let done = false;\n const onDone = () => {\n if (done) return;\n done = true;\n params.onDone();\n };\n try {\n printGridElementUnsafe({ ...params, onDone });\n } catch (error) {\n console.error('MGHGrid: print failed', error);\n onDone();\n }\n};\n\nconst printGridElementUnsafe = ({ cardElement, options, onDone }: PrintGridParams) => {\n if (typeof document === 'undefined') {\n onDone();\n return;\n }\n const hideToolbar = options.hideToolbar ?? true;\n const hideFooter = options.hideFooter ?? false;\n const includeHeaders = options.includeHeaders ?? true;\n const copyStyles = options.copyStyles ?? true;\n\n const clone = cardElement.cloneNode(true) as HTMLElement;\n syncFormState(cardElement, clone);\n clone.querySelectorAll('.mgh-grid-card-header').forEach((el) => el.remove());\n if (hideToolbar) clone.querySelectorAll('.mgh-grid-toolbar').forEach((el) => el.remove());\n if (hideFooter) clone.querySelectorAll('.mgh-grid-footer').forEach((el) => el.remove());\n if (!includeHeaders) clone.querySelectorAll('.mgh-grid-columns').forEach((el) => el.remove());\n clone.classList.add('mgh-grid-card--plain');\n // Remove ids to avoid duplicates and drop inline sizing coming from cardStyle/boxStyle.\n clone.querySelectorAll('[id]').forEach((el) => el.removeAttribute('id'));\n clone.style.height = 'auto';\n clone.style.flexGrow = '0';\n\n const title = options.title ?? '';\n const { styles, links } = copyStyles ? collectStyles(document) : { styles: [], links: [] };\n\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.setAttribute('data-mgh-grid-print', 'true');\n iframe.style.cssText = 'position:fixed;right:0;bottom:0;width:0;height:0;border:0;opacity:0;pointer-events:none;';\n document.body.appendChild(iframe);\n\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n window.setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 500);\n onDone();\n };\n\n const win = iframe.contentWindow;\n const doc = iframe.contentDocument || win?.document;\n if (!win || !doc) {\n finish();\n return;\n }\n\n doc.open();\n doc.write(\n `<!doctype html><html><head><meta charset=\"utf-8\" /><title>${escapeHtml(title || document.title || 'Print')}</title>` +\n links.map((href) => `<link rel=\"stylesheet\" href=\"${escapeHtml(href)}\" />`).join('') +\n `</head><body></body></html>`\n );\n doc.close();\n\n styles.forEach((css) => {\n const style = doc.createElement('style');\n style.textContent = css;\n doc.head.appendChild(style);\n });\n const printStyle = doc.createElement('style');\n printStyle.textContent = PRINT_CSS + (options.pageStyle ?? '');\n doc.head.appendChild(printStyle);\n\n if (title) {\n const h1 = doc.createElement('h1');\n h1.className = 'mgh-grid-print-title';\n h1.textContent = title;\n doc.body.appendChild(h1);\n }\n doc.body.appendChild(doc.adoptNode(clone));\n\n const run = async () => {\n try {\n await waitForImages(doc, 4000);\n if (options.onBeforePrint) await options.onBeforePrint(doc);\n win.onafterprint = finish;\n win.focus();\n win.print();\n // Most browsers block on print(); if afterprint never fires, still restore the grid.\n window.setTimeout(finish, 1000);\n } catch {\n finish();\n }\n };\n void run();\n};\n","import {\n MGHGridAggregationFunction,\n MGHGridAggregationModel,\n MGHGridApi,\n MGHGridColDef,\n MGHGridGroupNode,\n MGHGridLeafNode,\n MGHGridRowId,\n MGHGridValidRowModel,\n} from './MGHGrid.types';\nimport { formattedValueToString, getCellValue, getFormattedValue, getGroupingValue, isNil } from './utils';\n\nexport interface RowEntry<R extends MGHGridValidRowModel = any> {\n id: MGHGridRowId;\n row: R;\n}\n\n/** Internal tree node used while grouping. */\nexport interface GroupTreeNode<R extends MGHGridValidRowModel = any> {\n id: MGHGridRowId;\n depth: number;\n parent: MGHGridRowId | null;\n groupingField: string;\n groupingKey: any;\n groupingLabel: string;\n childGroups: GroupTreeNode<R>[];\n /** Direct leaf children (only populated at the deepest level). */\n leaves: RowEntry<R>[];\n /** Every descendant leaf, in display order after sorting. */\n descendants: RowEntry<R>[];\n}\n\nexport interface DisplayRow<R extends MGHGridValidRowModel = any> {\n id: MGHGridRowId;\n type: 'leaf' | 'group';\n row: R | null;\n node: MGHGridLeafNode | MGHGridGroupNode;\n depth: number;\n group?: GroupTreeNode<R>;\n}\n\nexport const GROUP_ID_PREFIX = 'auto-generated-row-';\n\nconst keyToString = (key: any) => (isNil(key) ? '' : key instanceof Date ? String(key.getTime()) : String(key));\n\nexport const buildGroupTree = <R extends MGHGridValidRowModel>(\n entries: RowEntry<R>[],\n groupingFields: string[],\n columnsByField: Map<string, MGHGridColDef<R>>,\n api: MGHGridApi<R>,\n emptyLabel = '(empty)'\n): GroupTreeNode<R>[] => {\n const build = (items: RowEntry<R>[], depth: number, parentId: MGHGridRowId | null, path: string): GroupTreeNode<R>[] => {\n const field = groupingFields[depth];\n const col = columnsByField.get(field);\n if (!col) return [];\n const buckets = new Map<string, GroupTreeNode<R>>();\n items.forEach((entry) => {\n const key = getGroupingValue(entry.row, col, api);\n const keyStr = keyToString(key);\n let node = buckets.get(keyStr);\n if (!node) {\n const label = formattedValueToString(getFormattedValue(key, entry.row, col, api, entry.id)) || emptyLabel;\n const id = `${GROUP_ID_PREFIX}${path}${field}/${keyStr}`;\n node = {\n id,\n depth,\n parent: parentId,\n groupingField: field,\n groupingKey: key,\n groupingLabel: label,\n childGroups: [],\n leaves: [],\n descendants: [],\n };\n buckets.set(keyStr, node);\n }\n node.leaves.push(entry);\n });\n const nodes: GroupTreeNode<R>[] = [];\n buckets.forEach((node) => {\n if (depth < groupingFields.length - 1) {\n node.childGroups = build(\n node.leaves,\n depth + 1,\n node.id,\n `${path}${field}/${keyToString(node.groupingKey)}|`\n );\n node.descendants = node.leaves;\n node.leaves = [];\n } else {\n node.descendants = node.leaves;\n }\n nodes.push(node);\n });\n return nodes;\n };\n return build(entries, 0, null, '');\n};\n\nexport type GroupComparator<R extends MGHGridValidRowModel = any> = (a: GroupTreeNode<R>, b: GroupTreeNode<R>) => number;\n\n/** Sorts groups (with the given comparator) and leaves (with the given sorter), recursively. */\nexport const sortGroupTree = <R extends MGHGridValidRowModel>(\n roots: GroupTreeNode<R>[],\n compareGroups: ((depth: number) => GroupComparator<R> | null) | null,\n sortLeaves: (leaves: RowEntry<R>[]) => RowEntry<R>[]\n): GroupTreeNode<R>[] => {\n const sortLevel = (nodes: GroupTreeNode<R>[], depth: number): GroupTreeNode<R>[] => {\n const comparator = compareGroups ? compareGroups(depth) : null;\n const sorted = comparator\n ? nodes\n .map((node, index) => ({ node, index }))\n .sort((a, b) => comparator(a.node, b.node) || a.index - b.index)\n .map((item) => item.node)\n : nodes;\n sorted.forEach((node) => {\n if (node.childGroups.length > 0) {\n node.childGroups = sortLevel(node.childGroups, depth + 1);\n const descendants: RowEntry<R>[] = [];\n node.childGroups.forEach((child) => child.descendants.forEach((d) => descendants.push(d)));\n node.descendants = descendants;\n } else {\n node.leaves = sortLeaves(node.leaves);\n node.descendants = node.leaves;\n }\n });\n return sorted;\n };\n return sortLevel(roots, 0);\n};\n\nexport const collectTreeLeaves = <R extends MGHGridValidRowModel>(roots: GroupTreeNode<R>[]): RowEntry<R>[] => {\n const out: RowEntry<R>[] = [];\n roots.forEach((root) => root.descendants.forEach((d) => out.push(d)));\n return out;\n};\n\nexport const toGroupNode = <R extends MGHGridValidRowModel>(\n node: GroupTreeNode<R>,\n isExpanded: boolean\n): MGHGridGroupNode => ({\n type: 'group',\n id: node.id,\n depth: node.depth,\n parent: node.parent,\n groupingField: node.groupingField,\n groupingKey: node.groupingKey,\n groupingLabel: node.groupingLabel,\n children: node.childGroups.length > 0 ? node.childGroups.map((c) => c.id) : node.leaves.map((l) => l.id),\n leafIds: node.descendants.map((d) => d.id),\n isExpanded,\n});\n\n/** Flattens the tree into display rows, honouring expansion state. Also fills `nodesById` with every node. */\nexport const flattenGroupTree = <R extends MGHGridValidRowModel>(\n roots: GroupTreeNode<R>[],\n isExpanded: (node: GroupTreeNode<R>) => boolean,\n nodesById: Map<MGHGridRowId, MGHGridLeafNode | MGHGridGroupNode>,\n groupsById: Map<MGHGridRowId, GroupTreeNode<R>>\n): DisplayRow<R>[] => {\n const out: DisplayRow<R>[] = [];\n const visit = (nodes: GroupTreeNode<R>[], visible: boolean) => {\n nodes.forEach((node) => {\n const expanded = isExpanded(node);\n const groupNode = toGroupNode(node, expanded);\n nodesById.set(node.id, groupNode);\n groupsById.set(node.id, node);\n if (visible)\n out.push({ id: node.id, type: 'group', row: null, node: groupNode, depth: node.depth, group: node });\n const childVisible = visible && expanded;\n if (node.childGroups.length > 0) {\n visit(node.childGroups, childVisible);\n } else {\n node.leaves.forEach((leaf) => {\n const leafNode: MGHGridLeafNode = { type: 'leaf', id: leaf.id, depth: node.depth + 1, parent: node.id };\n nodesById.set(leaf.id, leafNode);\n if (childVisible)\n out.push({ id: leaf.id, type: 'leaf', row: leaf.row, node: leafNode, depth: node.depth + 1 });\n });\n }\n });\n };\n visit(roots, true);\n return out;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Aggregation\n * ----------------------------------------------------------------------------------------------- */\n\nexport const aggregateRows = <R extends MGHGridValidRowModel>(\n rows: R[],\n aggregationModel: MGHGridAggregationModel,\n columnsByField: Map<string, MGHGridColDef<R>>,\n functions: Record<string, MGHGridAggregationFunction>,\n api: MGHGridApi<R>\n): Record<string, { value: any; fn: string }> => {\n const result: Record<string, { value: any; fn: string }> = {};\n Object.keys(aggregationModel).forEach((field) => {\n const fnName = aggregationModel[field];\n const fn = functions[fnName];\n const col = columnsByField.get(field);\n if (!fn || !col || col.aggregable === false) return;\n const values = rows.map((row) => getCellValue(row, col, api));\n result[field] = { value: fn.apply({ values, field }), fn: fnName };\n });\n return result;\n};\n","import React from 'react';\n\n/* Small inline SVG icon set (Material Design icon paths, Apache-2.0). No external dependencies. */\n\nexport interface MGHGridIconProps extends React.SVGProps<SVGSVGElement> {\n size?: number;\n}\n\nconst createIcon = (path: React.ReactNode, displayName: string) => {\n const Icon = React.forwardRef<SVGSVGElement, MGHGridIconProps>(({ size = 20, className, style, ...rest }, ref) => (\n <svg\n ref={ref}\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n fill=\"currentColor\"\n focusable=\"false\"\n aria-hidden=\"true\"\n className={['mgh-grid-icon', className].filter(Boolean).join(' ')}\n style={style}\n {...rest}\n >\n {path}\n </svg>\n ));\n Icon.displayName = displayName;\n return Icon;\n};\n\nexport const ViewColumnIcon = createIcon(\n <path d=\"M14.67 5v14H9.33V5h5.34zm1 14H21V5h-5.33v14zm-7.34 0V5H3v14h5.33z\" />,\n 'ViewColumnIcon'\n);\nexport const FilterListIcon = createIcon(<path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\" />, 'FilterListIcon');\nexport const SearchIcon = createIcon(\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />,\n 'SearchIcon'\n);\nexport const CloseIcon = createIcon(\n <path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />,\n 'CloseIcon'\n);\nexport const DownloadIcon = createIcon(\n <path d=\"M19 12v7H5v-7H3v7c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zm-6 .67 2.59-2.58L17 11.5l-5 5-5-5 1.41-1.41L11 12.67V3h2z\" />,\n 'DownloadIcon'\n);\nexport const ArrowUpwardIcon = createIcon(\n <path d=\"m4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />,\n 'ArrowUpwardIcon'\n);\nexport const ArrowDownwardIcon = createIcon(\n <path d=\"m20 12-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\" />,\n 'ArrowDownwardIcon'\n);\nexport const MoreVertIcon = createIcon(\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />,\n 'MoreVertIcon'\n);\nexport const CheckIcon = createIcon(<path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />, 'CheckIcon');\nexport const ExpandMoreIcon = createIcon(<path d=\"M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z\" />, 'ExpandMoreIcon');\nexport const ChevronRightIcon = createIcon(<path d=\"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />, 'ChevronRightIcon');\nexport const ChevronLeftIcon = createIcon(<path d=\"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />, 'ChevronLeftIcon');\nexport const FirstPageIcon = createIcon(\n <path d=\"M18.41 16.59 13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\" />,\n 'FirstPageIcon'\n);\nexport const LastPageIcon = createIcon(\n <path d=\"M5.59 7.41 10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\" />,\n 'LastPageIcon'\n);\nexport const PushPinIcon = createIcon(\n <path d=\"M16 9V4h1c.55 0 1-.45 1-1s-.45-1-1-1H7c-.55 0-1 .45-1 1s.45 1 1 1h1v5c0 1.66-1.34 3-3 3v2h5.97v7l1 1 1-1v-7H19v-2c-1.66 0-3-1.34-3-3z\" />,\n 'PushPinIcon'\n);\nexport const DeleteIcon = createIcon(\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />,\n 'DeleteIcon'\n);\nexport const AddIcon = createIcon(<path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />, 'AddIcon');\nexport const DensitySmallIcon = createIcon(\n <path d=\"M3 2h18v2H3zm0 18h18v2H3zm0-6h18v2H3zm0-6h18v2H3z\" />,\n 'DensitySmallIcon'\n);\nexport const DensityMediumIcon = createIcon(<path d=\"M3 3h18v2H3zm0 16h18v2H3zm0-8h18v2H3z\" />, 'DensityMediumIcon');\nexport const DensityLargeIcon = createIcon(<path d=\"M3 3h18v2H3zm0 16h18v2H3z\" />, 'DensityLargeIcon');\nexport const DragIndicatorIcon = createIcon(\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />,\n 'DragIndicatorIcon'\n);\nexport const PrintIcon = createIcon(\n <path d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\" />,\n 'PrintIcon'\n);\nexport const TableChartIcon = createIcon(\n <path d=\"M10 10.02h5V21h-5zM17 21h3c1.1 0 2-.9 2-2v-9h-5v11zm3-18H5c-1.1 0-2 .9-2 2v3h19V5c0-1.1-.9-2-2-2zM3 19c0 1.1.9 2 2 2h3V10H3v9z\" />,\n 'TableChartIcon'\n);\nexport const DescriptionIcon = createIcon(\n <path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\" />,\n 'DescriptionIcon'\n);\nexport const VisibilityOffIcon = createIcon(\n <path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46A11.804 11.804 0 0 0 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\" />,\n 'VisibilityOffIcon'\n);\nexport const FunctionsIcon = createIcon(<path d=\"M18 4H6v2l6.5 6L6 18v2h12v-3h-7l5-5-5-5h7z\" />, 'FunctionsIcon');\nexport const WorkspacesIcon = createIcon(\n <path d=\"M6 13c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm6-10C9.8 3 8 4.8 8 7s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm6 10c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4z\" />,\n 'WorkspacesIcon'\n);\nexport const EmptyBoxIcon = createIcon(\n <>\n <path\n d=\"M20 6h-2.18c.11-.31.18-.65.18-1a2.996 2.996 0 0 0-5.5-1.65l-.5.67-.5-.68C10.96 2.54 10.05 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2z\"\n opacity=\".25\"\n />\n <path d=\"M4 8h16v11H4z\" opacity=\".15\" />\n </>,\n 'EmptyBoxIcon'\n);\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport { MGHGridThemeMode } from '../MGHGrid.types';\nimport { clamp, cx } from '../utils';\n\n/* -------------------------------------------------------------------------------------------------\n * Button / IconButton\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'text' | 'primary' | 'contained';\n size?: 'small' | 'medium';\n startIcon?: React.ReactNode;\n endIcon?: React.ReactNode;\n active?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n { variant = 'text', size = 'medium', startIcon, endIcon, active, className, children, type = 'button', ...rest },\n ref\n ) => (\n <button\n ref={ref}\n type={type}\n className={cx(\n 'mgh-grid-btn',\n variant === 'primary' && 'mgh-grid-btn--primary',\n variant === 'contained' && 'mgh-grid-btn--contained',\n size === 'small' && 'mgh-grid-btn--small',\n active && 'mgh-grid-btn--active',\n className\n )}\n {...rest}\n >\n {startIcon}\n {children}\n {endIcon}\n </button>\n )\n);\nButton.displayName = 'MGHGridButton';\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n size?: 'small' | 'medium';\n active?: boolean;\n /** Tooltip (native title) and aria-label. */\n label?: string;\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ size = 'medium', active, label, className, children, type = 'button', ...rest }, ref) => (\n <button\n ref={ref}\n type={type}\n title={label}\n aria-label={label}\n className={cx(\n 'mgh-grid-btn mgh-grid-btn--icon',\n size === 'small' && 'mgh-grid-btn--small',\n active && 'mgh-grid-btn--active',\n className\n )}\n {...rest}\n >\n {children}\n </button>\n )\n);\nIconButton.displayName = 'MGHGridIconButton';\n\n/* -------------------------------------------------------------------------------------------------\n * Badge\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface BadgeProps {\n count?: number;\n variant?: 'dot' | 'count';\n children: React.ReactNode;\n}\n\nexport const Badge = ({ count = 0, variant = 'dot', children }: BadgeProps) => (\n <span className=\"mgh-grid-badge\">\n {children}\n {count > 0 &&\n (variant === 'dot' ? (\n <span className=\"mgh-grid-badge-dot\" />\n ) : (\n <span className=\"mgh-grid-badge-count\">{count > 99 ? '99+' : count}</span>\n ))}\n </span>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Inputs\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface TextInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n size?: 'small' | 'medium';\n}\n\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>(\n ({ size = 'medium', className, ...rest }, ref) => (\n <input\n ref={ref}\n className={cx('mgh-grid-input', size === 'small' && 'mgh-grid-input--small', className)}\n {...rest}\n />\n )\n);\nTextInput.displayName = 'MGHGridTextInput';\n\nexport interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n size?: 'small' | 'medium';\n}\n\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(({ size = 'medium', className, ...rest }, ref) => (\n <select ref={ref} className={cx('mgh-grid-select', size === 'small' && 'mgh-grid-select--small', className)} {...rest} />\n));\nSelect.displayName = 'MGHGridSelect';\n\nexport interface FieldProps {\n label?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n htmlFor?: string;\n}\n\nexport const Field = ({ label, children, className, htmlFor }: FieldProps) => (\n <div className={cx('mgh-grid-field', className)}>\n {label && (\n <label className=\"mgh-grid-field-label\" htmlFor={htmlFor}>\n {label}\n </label>\n )}\n {children}\n </div>\n);\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n indeterminate?: boolean;\n label?: string;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ indeterminate = false, label, className, ...rest }, forwardedRef) => {\n const innerRef = React.useRef<HTMLInputElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) (forwardedRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n },\n [forwardedRef]\n );\n React.useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n return (\n <input\n ref={setRef}\n type=\"checkbox\"\n title={label}\n aria-label={label}\n className={cx('mgh-grid-checkbox', className)}\n {...rest}\n />\n );\n }\n);\nCheckbox.displayName = 'MGHGridCheckbox';\n\n/* -------------------------------------------------------------------------------------------------\n * Spinner\n * ----------------------------------------------------------------------------------------------- */\n\nexport const Spinner = ({ className }: { className?: string }) => (\n <div className={cx('mgh-grid-spinner', className)} role=\"progressbar\" aria-label=\"Loading\" />\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover (portal, anchored)\n * ----------------------------------------------------------------------------------------------- */\n\nexport type PopoverPlacement = 'bottom-start' | 'bottom-end' | 'bottom' | 'right-start';\n\nexport interface PopoverProps {\n open: boolean;\n anchorEl: HTMLElement | null | undefined;\n onClose: (reason: 'backdrop' | 'escape') => void;\n children: React.ReactNode;\n placement?: PopoverPlacement;\n themeMode?: MGHGridThemeMode;\n className?: string;\n style?: React.CSSProperties;\n offset?: number;\n role?: string;\n autoFocus?: boolean;\n /** Additional elements considered \"inside\" for outside-click detection. */\n ignoreOutsideClickOn?: Array<React.RefObject<HTMLElement | null>>;\n}\n\nexport function Popover({\n open,\n anchorEl,\n onClose,\n children,\n placement = 'bottom-start',\n themeMode = 'light',\n className,\n style,\n offset = 4,\n role = 'dialog',\n autoFocus = false,\n ignoreOutsideClickOn,\n}: PopoverProps) {\n const ref = React.useRef<HTMLDivElement | null>(null);\n const [position, setPosition] = React.useState<{ top: number; left: number; ready: boolean }>({\n top: 0,\n left: 0,\n ready: false,\n });\n\n const update = React.useCallback(() => {\n const el = ref.current;\n if (!el) return;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n let top: number;\n let left: number;\n if (anchorEl && anchorEl.isConnected) {\n const a = anchorEl.getBoundingClientRect();\n if (placement === 'right-start') {\n top = a.top;\n left = a.right + offset;\n if (left + w > vw - 8) left = a.left - offset - w;\n } else {\n top = a.bottom + offset;\n if (top + h > vh - 8 && a.top - offset - h >= 8) top = a.top - offset - h;\n left =\n placement === 'bottom-end'\n ? a.right - w\n : placement === 'bottom'\n ? a.left + a.width / 2 - w / 2\n : a.left;\n }\n } else {\n top = vh / 2 - h / 2;\n left = vw / 2 - w / 2;\n }\n top = clamp(top, 8, Math.max(8, vh - h - 8));\n left = clamp(left, 8, Math.max(8, vw - w - 8));\n setPosition((prev) => (prev.ready && prev.top === top && prev.left === left ? prev : { top, left, ready: true }));\n }, [anchorEl, placement, offset]);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPosition((prev) => (prev.ready ? { ...prev, ready: false } : prev));\n return undefined;\n }\n update();\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n let observer: ResizeObserver | null = null;\n if (typeof ResizeObserver !== 'undefined' && ref.current) {\n observer = new ResizeObserver(() => update());\n observer.observe(ref.current);\n }\n return () => {\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n observer?.disconnect();\n };\n }, [open, update]);\n\n React.useEffect(() => {\n if (!open) return undefined;\n const handlePointerDown = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n if (ref.current?.contains(target)) return;\n if (anchorEl?.contains(target)) return;\n if (ignoreOutsideClickOn?.some((r) => r.current?.contains(target))) return;\n // Clicks inside other popovers (nested menus) should not close this one.\n if ((target as HTMLElement).closest?.('.mgh-grid-popover')) return;\n onClose('backdrop');\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose('escape');\n };\n document.addEventListener('mousedown', handlePointerDown, true);\n document.addEventListener('touchstart', handlePointerDown, true);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handlePointerDown, true);\n document.removeEventListener('touchstart', handlePointerDown, true);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open, onClose, anchorEl, ignoreOutsideClickOn]);\n\n React.useEffect(() => {\n if (open && autoFocus && ref.current) {\n const focusable = ref.current.querySelector<HTMLElement>(\n 'input, select, textarea, button, [tabindex]:not([tabindex=\"-1\"])'\n );\n (focusable ?? ref.current).focus();\n }\n }, [open, autoFocus]);\n\n if (!open || typeof document === 'undefined') return null;\n\n const stop = (event: React.SyntheticEvent) => event.stopPropagation();\n\n return createPortal(\n <div\n ref={ref}\n role={role}\n tabIndex={-1}\n className={cx('mgh-grid-popover', className)}\n data-mgh-theme={themeMode}\n style={{\n top: position.top,\n left: position.left,\n visibility: position.ready ? 'visible' : 'hidden',\n ...style,\n }}\n onClick={stop}\n onDoubleClick={stop}\n onMouseDown={stop}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onClose('escape');\n return;\n }\n event.stopPropagation();\n }}\n >\n {children}\n </div>,\n document.body\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Menu\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface MenuProps extends React.HTMLAttributes<HTMLUListElement> {\n children: React.ReactNode;\n}\n\nexport const Menu = ({ children, className, onKeyDown, ...rest }: MenuProps) => {\n const ref = React.useRef<HTMLUListElement | null>(null);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLUListElement>) => {\n onKeyDown?.(event);\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp' && event.key !== 'Home' && event.key !== 'End') return;\n const items = Array.from(\n ref.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])') ?? []\n );\n if (items.length === 0) return;\n event.preventDefault();\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n let next = 0;\n if (event.key === 'ArrowDown') next = currentIndex < 0 ? 0 : (currentIndex + 1) % items.length;\n else if (event.key === 'ArrowUp')\n next = currentIndex < 0 ? items.length - 1 : (currentIndex - 1 + items.length) % items.length;\n else if (event.key === 'Home') next = 0;\n else next = items.length - 1;\n items[next].focus();\n };\n\n React.useEffect(() => {\n const first = ref.current?.querySelector<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])');\n first?.focus();\n }, []);\n\n return (\n <ul ref={ref} role=\"menu\" className={cx('mgh-grid-menu', className)} onKeyDown={handleKeyDown} {...rest}>\n {children}\n </ul>\n );\n};\n\nexport interface MenuItemProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n icon?: React.ReactNode;\n selected?: boolean;\n /** Injected by menus that should close after the click. */\n hideMenu?: () => void;\n}\n\nexport const MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({ icon, selected, disabled, className, children, onClick, hideMenu, ...rest }, ref) => (\n <li role=\"none\">\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n aria-disabled={disabled || undefined}\n disabled={disabled}\n tabIndex={-1}\n className={cx(\n 'mgh-grid-menu-item',\n disabled && 'mgh-grid-menu-item--disabled',\n selected && 'mgh-grid-menu-item--selected',\n className\n )}\n onClick={(event) => {\n if (disabled) return;\n onClick?.(event);\n hideMenu?.();\n }}\n {...rest}\n >\n {icon}\n <span>{children}</span>\n </button>\n </li>\n )\n);\nMenuItem.displayName = 'MGHGridMenuItem';\n\nexport const MenuDivider = () => <li role=\"separator\" className=\"mgh-grid-menu-divider\" />;\n\nexport const MenuHeader = ({ children }: { children: React.ReactNode }) => (\n <li role=\"presentation\" className=\"mgh-grid-menu-header\">\n {children}\n </li>\n);\n\nexport const MenuSection = ({ children }: { children: React.ReactNode }) => (\n <li role=\"presentation\" className=\"mgh-grid-menu-section\">\n {children}\n </li>\n);\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport {\n MGHGridCsvExportOptions,\n MGHGridExcelExportOptions,\n MGHGridPrintExportOptions,\n MGHGridToolbarProps,\n} from '../MGHGrid.types';\nimport {\n CloseIcon,\n DensityLargeIcon,\n DensityMediumIcon,\n DensitySmallIcon,\n DescriptionIcon,\n DownloadIcon,\n FilterListIcon,\n PrintIcon,\n SearchIcon,\n TableChartIcon,\n ViewColumnIcon,\n} from '../icons';\nimport { cx } from '../utils';\nimport { Badge, IconButton, Menu, MenuItem, MenuItemProps, Popover, TextInput } from './primitives';\n\n/* -------------------------------------------------------------------------------------------------\n * Buttons\n * ----------------------------------------------------------------------------------------------- */\n\nexport function MGHGridColumnsButton() {\n const { api, state, localeText } = useMGHGridContext();\n const isOpen = state.preferencePanel.open && state.preferencePanel.openedPanelValue === 'columns';\n return (\n <IconButton\n label={localeText.toolbarColumns}\n active={isOpen}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n onClick={(event) => (isOpen ? api.hidePreferences() : api.showPreferences('columns', event.currentTarget))}\n >\n <ViewColumnIcon />\n </IconButton>\n );\n}\n\nexport function MGHGridFiltersButton() {\n const { api, state, localeText } = useMGHGridContext();\n const isOpen = state.preferencePanel.open && state.preferencePanel.openedPanelValue === 'filters';\n return (\n <IconButton\n label={localeText.toolbarFilters}\n active={isOpen}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n onClick={(event) => (isOpen ? api.hidePreferences() : api.showPreferences('filters', event.currentTarget))}\n >\n <Badge count={state.filterCount} variant=\"dot\">\n <FilterListIcon />\n </Badge>\n </IconButton>\n );\n}\n\nexport function MGHGridDensitySelector() {\n const { api, state, localeText, themeMode } = useMGHGridContext();\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null);\n const options = [\n { value: 'compact', label: localeText.densityCompact, icon: <DensitySmallIcon /> },\n { value: 'standard', label: localeText.densityStandard, icon: <DensityMediumIcon /> },\n { value: 'comfortable', label: localeText.densityComfortable, icon: <DensityLargeIcon /> },\n ] as const;\n const current = options.find((o) => o.value === state.density) ?? options[1];\n return (\n <>\n <IconButton\n label={localeText.toolbarDensity}\n active={Boolean(anchor)}\n aria-haspopup=\"menu\"\n onClick={(event) => setAnchor((prev) => (prev ? null : event.currentTarget))}\n >\n {current.icon}\n </IconButton>\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n themeMode={themeMode}\n role=\"menu\"\n >\n <Menu>\n {options.map((option) => (\n <MenuItem\n key={option.value}\n icon={option.icon}\n selected={option.value === state.density}\n onClick={() => api.setDensity(option.value)}\n hideMenu={() => setAnchor(null)}\n >\n {option.label}\n </MenuItem>\n ))}\n </Menu>\n </Popover>\n </>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Export menu\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface MGHGridExportMenuItemProps extends MenuItemProps {\n /** Injected by MGHGridExportMenu; call it to close the menu after your action. */\n hideMenu?: () => void;\n}\n\n/** Menu item for custom export actions. Drop-in for MUI's GridExportMenuItemProps pattern. */\nexport const MGHGridExportMenuItem = MenuItem as React.ForwardRefExoticComponent<\n MGHGridExportMenuItemProps & React.RefAttributes<HTMLButtonElement>\n>;\n\nexport interface MGHGridExportMenuProps {\n csvOptions?: MGHGridCsvExportOptions;\n excelOptions?: MGHGridExcelExportOptions;\n printOptions?: MGHGridPrintExportOptions;\n showCsvOption?: boolean;\n showExcelOption?: boolean;\n showPrintOption?: boolean;\n customMenuItem?: React.ReactNode;\n}\n\nexport function MGHGridExportMenu({\n csvOptions = { allColumns: true },\n excelOptions = { allColumns: true },\n printOptions,\n showCsvOption = true,\n showExcelOption = true,\n showPrintOption = true,\n customMenuItem,\n}: MGHGridExportMenuProps) {\n const { api, localeText, themeMode, rootProps } = useMGHGridContext();\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null);\n const hideMenu = () => setAnchor(null);\n\n const customItems = React.Children.map(customMenuItem, (child) =>\n React.isValidElement(child) ? React.cloneElement(child as React.ReactElement<any>, { hideMenu }) : child\n );\n\n const resolvedPrintOptions: MGHGridPrintExportOptions = {\n title: typeof rootProps.header === 'string' ? rootProps.header : undefined,\n ...printOptions,\n };\n\n return (\n <>\n <IconButton\n label={localeText.toolbarExport}\n active={Boolean(anchor)}\n aria-haspopup=\"menu\"\n onClick={(event) => setAnchor((prev) => (prev ? null : event.currentTarget))}\n >\n <DownloadIcon />\n </IconButton>\n <Popover open={Boolean(anchor)} anchorEl={anchor} onClose={hideMenu} themeMode={themeMode} role=\"menu\">\n <Menu>\n {customItems}\n {showCsvOption && (\n <MenuItem\n icon={<DescriptionIcon />}\n onClick={() => api.exportDataAsCsv(csvOptions)}\n hideMenu={hideMenu}\n >\n {localeText.toolbarExportCSV}\n </MenuItem>\n )}\n {showExcelOption && (\n <MenuItem\n icon={<TableChartIcon />}\n onClick={() => {\n void api.exportDataAsExcel(excelOptions);\n }}\n hideMenu={hideMenu}\n >\n {localeText.toolbarExportExcel}\n </MenuItem>\n )}\n {showPrintOption && (\n <MenuItem\n icon={<PrintIcon />}\n onClick={() => api.exportDataAsPrint(resolvedPrintOptions)}\n hideMenu={hideMenu}\n >\n {localeText.toolbarExportPrint}\n </MenuItem>\n )}\n </Menu>\n </Popover>\n </>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Quick filter\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface MGHGridQuickFilterProps {\n placeholder?: string;\n debounceMs?: number;\n /** Always show the expanded input. */\n alwaysExpanded?: boolean;\n}\n\nexport function MGHGridQuickFilter({ placeholder, debounceMs, alwaysExpanded = false }: MGHGridQuickFilterProps) {\n const { api, state, localeText, rootProps } = useMGHGridContext();\n const externalValue = (state.quickFilterValues ?? []).join(' ');\n const [text, setText] = React.useState(externalValue);\n const [expanded, setExpanded] = React.useState(alwaysExpanded || externalValue !== '');\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const timer = React.useRef<number | null>(null);\n const delay = debounceMs ?? rootProps.quickFilterDebounceMs;\n\n // Sync when the model is changed from outside (e.g. api.setQuickFilterValues).\n const lastExternal = React.useRef(externalValue);\n React.useEffect(() => {\n if (externalValue !== lastExternal.current) {\n lastExternal.current = externalValue;\n setText(externalValue);\n if (externalValue !== '') setExpanded(true);\n }\n }, [externalValue]);\n\n React.useEffect(\n () => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n },\n []\n );\n\n const commit = (value: string) => {\n const values = value.split(/\\s+/).filter((v) => v !== '');\n lastExternal.current = values.join(' ');\n api.setQuickFilterValues(values);\n };\n\n const handleChange = (value: string) => {\n setText(value);\n if (timer.current !== null) window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => commit(value), delay);\n };\n\n const clear = () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n setText('');\n commit('');\n inputRef.current?.focus();\n };\n\n const expand = () => {\n setExpanded(true);\n window.setTimeout(() => inputRef.current?.focus(), 0);\n };\n\n const isExpanded = alwaysExpanded || expanded;\n\n return (\n <div className={cx('mgh-grid-quick-filter', isExpanded && 'mgh-grid-quick-filter--expanded')}>\n <IconButton\n className=\"mgh-grid-quick-filter-trigger\"\n label={localeText.toolbarQuickFilterLabel}\n aria-disabled={isExpanded}\n tabIndex={isExpanded ? -1 : 0}\n onClick={expand}\n >\n <SearchIcon />\n </IconButton>\n <div\n className={cx(\n 'mgh-grid-quick-filter-control mgh-grid-input-adorned',\n text && 'mgh-grid-input-adorned--clearable'\n )}\n >\n <span className=\"mgh-grid-input-adornment\">\n <SearchIcon size={18} />\n </span>\n <TextInput\n ref={inputRef}\n size=\"small\"\n type=\"search\"\n value={text}\n tabIndex={isExpanded ? 0 : -1}\n placeholder={placeholder ?? localeText.toolbarQuickFilterPlaceholder}\n aria-label={localeText.toolbarQuickFilterLabel}\n onChange={(event) => handleChange(event.target.value)}\n onBlur={() => {\n if (!alwaysExpanded && text.trim() === '') setExpanded(false);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n if (text) clear();\n else if (!alwaysExpanded) {\n setExpanded(false);\n inputRef.current?.blur();\n }\n }\n if (event.key === 'Enter') {\n if (timer.current !== null) window.clearTimeout(timer.current);\n commit(text);\n }\n }}\n />\n {text && (\n <span className=\"mgh-grid-input-adornment mgh-grid-input-adornment--end\">\n <IconButton size=\"small\" label={localeText.clearSearch} onClick={clear} tabIndex={-1}>\n <CloseIcon />\n </IconButton>\n </span>\n )}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Default toolbar\n * ----------------------------------------------------------------------------------------------- */\n\nexport function MGHGridToolbar({\n showColumnsButton = true,\n showFilterButton = true,\n showExportButton = true,\n showQuickFilter = true,\n showDensitySelector = false,\n showCsvOption = true,\n showExcelOption = true,\n showPrintOption = true,\n csvOptions,\n excelOptions,\n printOptions,\n renderOtherButtons,\n renderDateRange,\n customMenuItem,\n quickFilterPlaceholder,\n quickFilterDebounceMs,\n}: MGHGridToolbarProps) {\n const { rootProps } = useMGHGridContext();\n const showColumns = showColumnsButton && !rootProps.disableColumnSelector;\n const showFilters = showFilterButton && !rootProps.disableColumnFilter;\n const showDensity = showDensitySelector && !rootProps.disableDensitySelector;\n\n return (\n <div className=\"mgh-grid-toolbar\" role=\"toolbar\">\n <div className=\"mgh-grid-toolbar-group\">\n {showColumns && <MGHGridColumnsButton />}\n {showFilters && <MGHGridFiltersButton />}\n {showDensity && <MGHGridDensitySelector />}\n {showExportButton && (\n <MGHGridExportMenu\n csvOptions={csvOptions}\n excelOptions={excelOptions}\n printOptions={printOptions}\n showCsvOption={showCsvOption}\n showExcelOption={showExcelOption}\n showPrintOption={showPrintOption}\n customMenuItem={customMenuItem}\n />\n )}\n </div>\n {renderDateRange && <div className=\"mgh-grid-toolbar-center\">{renderDateRange}</div>}\n <div className=\"mgh-grid-toolbar-group\">\n {renderOtherButtons}\n {showQuickFilter && (\n <MGHGridQuickFilter placeholder={quickFilterPlaceholder} debounceMs={quickFilterDebounceMs} />\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport { ChevronLeftIcon, ChevronRightIcon, FirstPageIcon, LastPageIcon } from '../icons';\nimport { IconButton, Select } from './primitives';\n\nexport function MGHGridPagination() {\n const { api, state, localeText, rootProps } = useMGHGridContext();\n const { page, pageSize } = state.paginationModel;\n const count = state.rowCount;\n const pageCount = state.pageCount;\n const from = count === 0 ? 0 : page * pageSize + 1;\n const to = Math.min(count, (page + 1) * pageSize);\n const options =\n rootProps.pageSizeOptions.indexOf(pageSize) === -1\n ? rootProps.pageSizeOptions.concat([pageSize]).sort((a, b) => a - b)\n : rootProps.pageSizeOptions;\n\n return (\n <div className=\"mgh-grid-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n <span>{localeText.footerPaginationRowsPerPage}</span>\n <Select\n className=\"mgh-grid-pagination-select\"\n value={pageSize}\n aria-label={localeText.footerPaginationRowsPerPage}\n onChange={(event) => api.setPageSize(Number(event.target.value))}\n >\n {options.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </Select>\n <span>{localeText.footerPaginationDisplayedRows(from, to, count)}</span>\n <div className=\"mgh-grid-pagination-actions\">\n <IconButton label={localeText.footerPaginationFirstPage} disabled={page <= 0} onClick={() => api.setPage(0)}>\n <FirstPageIcon />\n </IconButton>\n <IconButton\n label={localeText.footerPaginationPreviousPage}\n disabled={page <= 0}\n onClick={() => api.setPage(page - 1)}\n >\n <ChevronLeftIcon />\n </IconButton>\n <IconButton\n label={localeText.footerPaginationNextPage}\n disabled={page >= pageCount - 1}\n onClick={() => api.setPage(page + 1)}\n >\n <ChevronRightIcon />\n </IconButton>\n <IconButton\n label={localeText.footerPaginationLastPage}\n disabled={page >= pageCount - 1}\n onClick={() => api.setPage(Math.max(pageCount - 1, 0))}\n >\n <LastPageIcon />\n </IconButton>\n </div>\n </div>\n );\n}\n\nexport function MGHGridFooter() {\n const { state, localeText, rootProps } = useMGHGridContext();\n const selectedCount = state.rowSelectionModel.ids.size;\n const showSelected = selectedCount > 0 && !rootProps.hideFooterSelectedRowCount;\n const showPagination = rootProps.pagination && !rootProps.hideFooterPagination;\n const showRowCount = !showPagination && !rootProps.hideFooterRowCount;\n\n return (\n <div className=\"mgh-grid-footer\">\n <div className=\"mgh-grid-footer-left\">\n {showSelected && <span>{localeText.footerRowSelected(selectedCount)}</span>}\n </div>\n {showRowCount && (\n <span>\n {localeText.footerTotalRows} {state.rowCount.toLocaleString()}\n </span>\n )}\n {showPagination && <MGHGridPagination />}\n </div>\n );\n}\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport { SearchIcon } from '../icons';\nimport { Button, Checkbox, TextInput } from './primitives';\n\nexport function MGHGridColumnsPanel() {\n const { api, state, localeText, columns, visibleColumns } = useMGHGridContext();\n const visibleFields = React.useMemo(() => new Set(visibleColumns.map((col) => col.field)), [visibleColumns]);\n const [search, setSearch] = React.useState('');\n const model = state.columnVisibilityModel;\n\n const hideable = columns.filter((col) => col.hideable !== false);\n const needle = search.trim().toLowerCase();\n const filtered = needle\n ? hideable.filter((col) => (col.headerName ?? col.field).toLowerCase().indexOf(needle) !== -1)\n : hideable;\n\n const setAll = (visible: boolean) => {\n const next = { ...model };\n hideable.forEach((col) => {\n next[col.field] = visible;\n });\n api.setColumnVisibilityModel(next);\n };\n\n return (\n <div className=\"mgh-grid-panel\" role=\"group\" aria-label={localeText.toolbarColumns}>\n <div className=\"mgh-grid-panel-header\">\n <div className=\"mgh-grid-input-adorned\">\n <span className=\"mgh-grid-input-adornment\">\n <SearchIcon size={18} />\n </span>\n <TextInput\n autoFocus\n size=\"small\"\n value={search}\n placeholder={localeText.columnsPanelSearchPlaceholder}\n aria-label={localeText.columnsPanelSearchPlaceholder}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n </div>\n <div className=\"mgh-grid-panel-content\">\n <div className=\"mgh-grid-columns-list\">\n {filtered.map((col) => {\n const visible = visibleFields.has(col.field);\n return (\n <label key={col.field} className=\"mgh-grid-checkbox-label\">\n <Checkbox checked={visible} onChange={() => api.setColumnVisibility(col.field, !visible)} />\n <span>{col.headerName ?? col.field}</span>\n </label>\n );\n })}\n {filtered.length === 0 && <div className=\"mgh-grid-filter-empty\">No columns</div>}\n </div>\n </div>\n <div className=\"mgh-grid-panel-footer\">\n <Button variant=\"primary\" size=\"small\" onClick={() => setAll(true)}>\n {localeText.columnsPanelShowAll}\n </Button>\n <Button variant=\"primary\" size=\"small\" onClick={() => setAll(false)}>\n {localeText.columnsPanelHideAll}\n </Button>\n <Button size=\"small\" onClick={() => api.setColumnVisibilityModel({})}>\n {localeText.columnsPanelReset}\n </Button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport { MGHGridColDef, MGHGridFilterItem, MGHGridFilterOperator } from '../MGHGrid.types';\nimport { AddIcon, DeleteIcon } from '../icons';\nimport { getColumnFilterOperators, getOptionLabel, getOptionValue, resolveValueOptions, uniqueId } from '../utils';\nimport { Button, Field, IconButton, Select, TextInput } from './primitives';\n\ninterface FilterValueInputProps {\n item: MGHGridFilterItem;\n column: MGHGridColDef;\n operator: MGHGridFilterOperator | undefined;\n onChange: (value: any) => void;\n placeholder: string;\n}\n\nconst useDebouncedValue = (value: any, onCommit: (value: any) => void, delay = 250) => {\n const [local, setLocal] = React.useState(value ?? '');\n const timer = React.useRef<number | null>(null);\n React.useEffect(() => {\n setLocal(value ?? '');\n }, [value]);\n const update = (next: any) => {\n setLocal(next);\n if (timer.current !== null) window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => onCommit(next), delay);\n };\n React.useEffect(\n () => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n },\n []\n );\n return [local, update] as const;\n};\n\nfunction TextValueInput({ item, onChange, placeholder, type }: FilterValueInputProps & { type: string }) {\n const [local, update] = useDebouncedValue(item.value, onChange);\n return (\n <TextInput\n size=\"small\"\n type={type}\n value={local}\n placeholder={placeholder}\n aria-label={placeholder}\n onChange={(event) => update(event.target.value)}\n />\n );\n}\n\nfunction MultiValueInput({ item, column, onChange, placeholder }: FilterValueInputProps) {\n const joined = Array.isArray(item.value) ? item.value.join(', ') : (item.value ?? '');\n const [local, update] = useDebouncedValue(joined, (text: string) =>\n onChange(\n String(text)\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v !== '')\n )\n );\n if (column.type === 'singleSelect') {\n const options = resolveValueOptions(column);\n const selected: string[] = Array.isArray(item.value) ? item.value.map(String) : [];\n return (\n <Select\n multiple\n size=\"small\"\n value={selected}\n aria-label={placeholder}\n onChange={(event) => {\n const values = Array.from(event.target.selectedOptions).map((option) => {\n const match = options.find((o) => String(getOptionValue(column, o)) === option.value);\n return match !== undefined ? getOptionValue(column, match) : option.value;\n });\n onChange(values);\n }}\n >\n {options.map((option) => {\n const value = getOptionValue(column, option);\n return (\n <option key={String(value)} value={String(value)}>\n {getOptionLabel(column, option)}\n </option>\n );\n })}\n </Select>\n );\n }\n return (\n <TextInput\n size=\"small\"\n value={local}\n placeholder=\"Comma separated values\"\n aria-label={placeholder}\n onChange={(event) => update(event.target.value)}\n />\n );\n}\n\nfunction FilterValueInput(props: FilterValueInputProps) {\n const { item, column, operator, onChange, placeholder } = props;\n const { api } = useMGHGridContext();\n const inputType = operator?.inputType ?? 'text';\n\n if (operator?.InputComponent) {\n const Component = operator.InputComponent;\n return <Component item={item} column={column} applyValue={(next) => onChange(next.value)} api={api} />;\n }\n\n switch (inputType) {\n case 'none':\n return <div />;\n case 'boolean':\n return (\n <Select\n size=\"small\"\n value={item.value === undefined || item.value === null ? '' : String(item.value)}\n aria-label={placeholder}\n onChange={(event) => onChange(event.target.value === '' ? undefined : event.target.value)}\n >\n <option value=\"\">any</option>\n <option value=\"true\">yes</option>\n <option value=\"false\">no</option>\n </Select>\n );\n case 'select': {\n const options = resolveValueOptions(column);\n return (\n <Select\n size=\"small\"\n value={item.value === undefined || item.value === null ? '' : String(item.value)}\n aria-label={placeholder}\n onChange={(event) => {\n const match = options.find((o) => String(getOptionValue(column, o)) === event.target.value);\n onChange(\n event.target.value === ''\n ? undefined\n : match !== undefined\n ? getOptionValue(column, match)\n : event.target.value\n );\n }}\n >\n <option value=\"\" />\n {options.map((option) => {\n const value = getOptionValue(column, option);\n return (\n <option key={String(value)} value={String(value)}>\n {getOptionLabel(column, option)}\n </option>\n );\n })}\n </Select>\n );\n }\n case 'multiselect':\n return <MultiValueInput {...props} />;\n case 'number':\n return <TextValueInput {...props} type=\"number\" />;\n case 'date':\n return <TextValueInput {...props} type=\"date\" />;\n case 'datetime-local':\n return <TextValueInput {...props} type=\"datetime-local\" />;\n default:\n return <TextValueInput {...props} type=\"text\" />;\n }\n}\n\nconst createFilterItem = (column: MGHGridColDef | undefined): MGHGridFilterItem => ({\n id: uniqueId('filter'),\n field: column?.field ?? '',\n operator: column ? (getColumnFilterOperators(column)[0]?.value ?? 'contains') : 'contains',\n value: undefined,\n});\n\nexport function MGHGridFilterPanel() {\n const { api, state, localeText, columns, rootProps } = useMGHGridContext();\n const filterableColumns = React.useMemo(() => columns.filter((col) => col.filterable !== false), [columns]);\n const byField = React.useMemo(() => {\n const map = new Map<string, MGHGridColDef>();\n filterableColumns.forEach((col) => map.set(col.field, col));\n return map;\n }, [filterableColumns]);\n\n const items = state.filterModel.items;\n const logicOperator = state.filterModel.logicOperator ?? 'and';\n const targetField = state.preferencePanel.targetField;\n\n // Ensure at least one (possibly empty) item is displayed when the panel opens, like MUI does.\n const seeded = React.useRef(false);\n React.useEffect(() => {\n if (seeded.current) return;\n seeded.current = true;\n if (targetField && byField.has(targetField)) {\n const existing = items.find((item) => item.field === targetField);\n if (!existing) api.upsertFilterItem(createFilterItem(byField.get(targetField)));\n } else if (items.length === 0 && filterableColumns.length > 0) {\n api.upsertFilterItem(createFilterItem(filterableColumns[0]));\n }\n }, [api, byField, filterableColumns, items, targetField]);\n\n const updateItem = (item: MGHGridFilterItem, patch: Partial<MGHGridFilterItem>) => {\n api.upsertFilterItem({ ...item, ...patch });\n };\n\n const addItem = () => {\n api.upsertFilterItem(createFilterItem(filterableColumns[0]));\n };\n\n const canAddMore = !rootProps.disableMultipleColumnsFiltering || items.length === 0;\n\n return (\n <div className=\"mgh-grid-panel\" role=\"group\" aria-label={localeText.toolbarFilters}>\n <div className=\"mgh-grid-panel-content\" style={{ paddingTop: 12 }}>\n {items.length === 0 && <div className=\"mgh-grid-filter-empty\">No filters</div>}\n {items.map((item, index) => {\n const column = byField.get(item.field) ?? filterableColumns[0];\n const operators = column ? getColumnFilterOperators(column) : [];\n const operator = operators.find((op) => op.value === item.operator) ?? operators[0];\n const showLogic = items.length > 1;\n return (\n <div\n key={String(item.id ?? index)}\n className={\n showLogic ? 'mgh-grid-filter-row mgh-grid-filter-row--with-logic' : 'mgh-grid-filter-row'\n }\n >\n <IconButton\n size=\"small\"\n label={localeText.filterPanelDeleteIcon}\n onClick={() => api.deleteFilterItem(item)}\n >\n <DeleteIcon />\n </IconButton>\n {showLogic && (\n <Field label={index === 1 ? localeText.filterPanelLogicOperator : ' '}>\n {index === 0 ? (\n <div style={{ height: 32 }} />\n ) : (\n <Select\n size=\"small\"\n value={logicOperator}\n disabled={index > 1}\n aria-label={localeText.filterPanelLogicOperator}\n onChange={(event) =>\n api.setFilterLogicOperator(event.target.value as 'and' | 'or')\n }\n >\n <option value=\"and\">{localeText.filterPanelOperatorAnd}</option>\n <option value=\"or\">{localeText.filterPanelOperatorOr}</option>\n </Select>\n )}\n </Field>\n )}\n <Field label={localeText.filterPanelColumns}>\n <Select\n size=\"small\"\n value={column?.field ?? ''}\n aria-label={localeText.filterPanelColumns}\n onChange={(event) => {\n const nextColumn = byField.get(event.target.value);\n const nextOperators = nextColumn ? getColumnFilterOperators(nextColumn) : [];\n const keepOperator = nextOperators.some((op) => op.value === item.operator);\n updateItem(item, {\n field: event.target.value,\n operator: keepOperator ? item.operator : (nextOperators[0]?.value ?? 'contains'),\n value: undefined,\n });\n }}\n >\n {filterableColumns.map((col) => (\n <option key={col.field} value={col.field}>\n {col.headerName ?? col.field}\n </option>\n ))}\n </Select>\n </Field>\n <Field label={localeText.filterPanelOperator}>\n <Select\n size=\"small\"\n value={operator?.value ?? ''}\n aria-label={localeText.filterPanelOperator}\n onChange={(event) => {\n const nextOperator = operators.find((op) => op.value === event.target.value);\n const nextIsMulti = nextOperator?.inputType === 'multiselect';\n const currentIsMulti = operator?.inputType === 'multiselect';\n updateItem(item, {\n operator: event.target.value,\n value: nextIsMulti !== currentIsMulti ? undefined : item.value,\n });\n }}\n >\n {operators.map((op) => (\n <option key={op.value} value={op.value}>\n {op.label ?? op.value}\n </option>\n ))}\n </Select>\n </Field>\n <Field label={localeText.filterPanelValue}>\n {column ? (\n <FilterValueInput\n item={item}\n column={column}\n operator={operator}\n placeholder={localeText.filterPanelInputPlaceholder}\n onChange={(value) => updateItem(item, { value })}\n />\n ) : (\n <div />\n )}\n </Field>\n </div>\n );\n })}\n </div>\n <div className=\"mgh-grid-panel-footer\">\n <Button\n variant=\"primary\"\n size=\"small\"\n startIcon={<AddIcon size={18} />}\n onClick={addItem}\n disabled={!canAddMore}\n >\n {localeText.filterPanelAddFilter}\n </Button>\n <Button\n size=\"small\"\n startIcon={<DeleteIcon size={18} />}\n disabled={items.length === 0}\n onClick={() => api.setFilterModel({ ...state.filterModel, items: [] })}\n >\n {localeText.filterPanelRemoveAll}\n </Button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useMGHGridContext } from '../context';\nimport { MGHGridColDef, MGHGridThemeMode } from '../MGHGrid.types';\nimport {\n ArrowDownwardIcon,\n ArrowUpwardIcon,\n FilterListIcon,\n FunctionsIcon,\n PushPinIcon,\n ViewColumnIcon,\n VisibilityOffIcon,\n WorkspacesIcon,\n} from '../icons';\nimport { GROUPING_COLUMN_FIELD } from '../utils';\nimport { Menu, MenuDivider, MenuItem, MenuSection, Popover, Select } from './primitives';\n\nexport interface MGHGridColumnMenuProps {\n column: MGHGridColDef;\n anchorEl: HTMLElement | null;\n open: boolean;\n onClose: () => void;\n themeMode: MGHGridThemeMode;\n /** Anchor for panels opened from the menu (usually the toolbar button or the header cell). */\n panelAnchorEl?: HTMLElement | null;\n}\n\nexport function MGHGridColumnMenu({ column, anchorEl, open, onClose, themeMode, panelAnchorEl }: MGHGridColumnMenuProps) {\n const { api, state, localeText, rootProps } = useMGHGridContext();\n const field = column.field;\n const isGroupingColumn = field === GROUPING_COLUMN_FIELD;\n const sortItem = state.sortModel.find((item) => item.field === field);\n const pinned = api.isColumnPinned(field);\n const isGrouped = state.rowGroupingModel.indexOf(field) !== -1;\n const aggregation = state.aggregationModel[field];\n\n const canSort = column.sortable !== false && !rootProps.disableColumnSorting;\n const canFilter = column.filterable !== false && !rootProps.disableColumnFilter && !isGroupingColumn;\n const canHide = column.hideable !== false;\n const canPin = column.pinnable !== false && !rootProps.disableColumnPinning;\n const canGroup = column.groupable !== false && !rootProps.disableRowGrouping && !isGroupingColumn;\n const aggregationFunctions = Object.keys(rootProps.aggregationFunctions).filter((name) => {\n const fn = rootProps.aggregationFunctions[name];\n if (column.availableAggregationFunctions && column.availableAggregationFunctions.indexOf(name) === -1) return false;\n if (fn.columnTypes && column.type && fn.columnTypes.indexOf(column.type) === -1) return false;\n return true;\n });\n const canAggregate =\n column.aggregable !== false && !rootProps.disableAggregation && !isGroupingColumn && aggregationFunctions.length > 0;\n\n const anchorForPanel = panelAnchorEl ?? anchorEl;\n const name = column.headerName ?? column.field;\n\n return (\n <Popover open={open} anchorEl={anchorEl} onClose={onClose} themeMode={themeMode} placement=\"bottom-end\" role=\"menu\">\n <Menu aria-label={localeText.columnMenuLabel}>\n {canSort && (\n <>\n <MenuItem\n icon={<ArrowUpwardIcon />}\n selected={sortItem?.sort === 'asc'}\n onClick={() => api.sortColumn(field, 'asc')}\n hideMenu={onClose}\n >\n {localeText.columnMenuSortAsc}\n </MenuItem>\n <MenuItem\n icon={<ArrowDownwardIcon />}\n selected={sortItem?.sort === 'desc'}\n onClick={() => api.sortColumn(field, 'desc')}\n hideMenu={onClose}\n >\n {localeText.columnMenuSortDesc}\n </MenuItem>\n {sortItem && (\n <MenuItem\n icon={<span style={{ width: 20 }} />}\n onClick={() => api.sortColumn(field, null)}\n hideMenu={onClose}\n >\n {localeText.columnMenuUnsort}\n </MenuItem>\n )}\n </>\n )}\n {canFilter && (\n <>\n {canSort && <MenuDivider />}\n <MenuItem\n icon={<FilterListIcon />}\n onClick={() => api.showFilterPanel(field, anchorForPanel)}\n hideMenu={onClose}\n >\n {localeText.columnMenuFilter}\n </MenuItem>\n </>\n )}\n {(canHide || !rootProps.disableColumnSelector) && (\n <>\n {(canSort || canFilter) && <MenuDivider />}\n {canHide && (\n <MenuItem\n icon={<VisibilityOffIcon />}\n onClick={() => api.setColumnVisibility(field, false)}\n hideMenu={onClose}\n >\n {localeText.columnMenuHideColumn}\n </MenuItem>\n )}\n {!rootProps.disableColumnSelector && (\n <MenuItem\n icon={<ViewColumnIcon />}\n onClick={() => api.showPreferences('columns', anchorForPanel)}\n hideMenu={onClose}\n >\n {localeText.columnMenuManageColumns}\n </MenuItem>\n )}\n </>\n )}\n {canPin && (\n <>\n <MenuDivider />\n {pinned !== 'left' && (\n <MenuItem\n icon={<PushPinIcon style={{ transform: 'rotate(30deg)' }} />}\n onClick={() => api.pinColumn(field, 'left')}\n hideMenu={onClose}\n >\n {localeText.columnMenuPinLeft}\n </MenuItem>\n )}\n {pinned !== 'right' && (\n <MenuItem\n icon={<PushPinIcon style={{ transform: 'rotate(-30deg)' }} />}\n onClick={() => api.pinColumn(field, 'right')}\n hideMenu={onClose}\n >\n {localeText.columnMenuPinRight}\n </MenuItem>\n )}\n {pinned && (\n <MenuItem\n icon={<span style={{ width: 20 }} />}\n onClick={() => api.unpinColumn(field)}\n hideMenu={onClose}\n >\n {localeText.columnMenuUnpin}\n </MenuItem>\n )}\n </>\n )}\n {canGroup && (\n <>\n <MenuDivider />\n <MenuItem\n icon={<WorkspacesIcon />}\n onClick={() =>\n isGrouped ? api.removeRowGroupingCriteria(field) : api.addRowGroupingCriteria(field)\n }\n hideMenu={onClose}\n >\n {isGrouped ? localeText.columnMenuUngroup(name) : localeText.columnMenuGroup(name)}\n </MenuItem>\n </>\n )}\n {canAggregate && (\n <>\n <MenuDivider />\n <MenuSection>\n <label\n className=\"mgh-grid-field-label\"\n style={{ display: 'flex', alignItems: 'center', gap: 6 }}\n >\n <FunctionsIcon size={16} /> {localeText.columnMenuAggregation}\n </label>\n <Select\n size=\"small\"\n value={aggregation ?? ''}\n aria-label={localeText.columnMenuAggregation}\n onChange={(event) => {\n const next = { ...state.aggregationModel };\n if (event.target.value === '') delete next[field];\n else next[field] = event.target.value;\n api.setAggregationModel(next);\n }}\n >\n <option value=\"\">{localeText.aggregationFunctionLabelNone}</option>\n {aggregationFunctions.map((fnName) => (\n <option key={fnName} value={fnName}>\n {rootProps.aggregationFunctions[fnName].label ?? fnName}\n </option>\n ))}\n </Select>\n </MenuSection>\n </>\n )}\n </Menu>\n </Popover>\n );\n}\n","import React from 'react';\nimport { MGHGridLoadingOverlayProps, MGHGridNoRowsOverlayProps } from '../MGHGrid.types';\nimport { EmptyBoxIcon } from '../icons';\nimport { Spinner } from './primitives';\n\n/** Default \"no rows\" overlay. Mirrors the legacy CustomNoRowsOverlay but has no MUI dependency. */\nexport function MGHGridNoRowsOverlay({ text = 'No rows', imageSrc }: MGHGridNoRowsOverlayProps) {\n return (\n <div className=\"mgh-grid-no-rows\" role=\"status\">\n {imageSrc ? <img alt=\"\" src={imageSrc} /> : <EmptyBoxIcon size={50} />}\n <div>{text}</div>\n </div>\n );\n}\n\nexport function MGHGridLoadingOverlay({ text }: MGHGridLoadingOverlayProps) {\n return (\n <>\n <Spinner />\n {text && <div>{text}</div>}\n </>\n );\n}\n","import React from 'react';\nimport { MGHGridThemeMode } from '../MGHGrid.types';\nimport { MoreVertIcon } from '../icons';\nimport { IconButton, Menu, MenuItem, Popover } from './primitives';\n\nexport interface MGHGridActionsCellItemProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n icon?: React.ReactElement;\n label: string;\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Render the action inside the \"more\" menu instead of inline. */\n showInMenu?: boolean;\n disabled?: boolean;\n}\n\n/** Drop-in replacement for MUI's GridActionsCellItem. Use it from `colDef.getActions`. */\nexport function MGHGridActionsCellItem({\n icon,\n label,\n onClick,\n showInMenu,\n disabled,\n className,\n ...rest\n}: MGHGridActionsCellItemProps) {\n return (\n <IconButton\n size=\"small\"\n label={label}\n disabled={disabled}\n className={className}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n }}\n {...rest}\n >\n {icon}\n </IconButton>\n );\n}\nMGHGridActionsCellItem.displayName = 'MGHGridActionsCellItem';\n\ninterface ActionsCellProps {\n actions: React.ReactElement[];\n themeMode: MGHGridThemeMode;\n moreLabel: string;\n}\n\nexport function ActionsCell({ actions, themeMode, moreLabel }: ActionsCellProps) {\n const [anchor, setAnchor] = React.useState<HTMLElement | null>(null);\n const inline: React.ReactElement[] = [];\n const inMenu: React.ReactElement[] = [];\n actions.forEach((action) => {\n if (!React.isValidElement(action)) return;\n if ((action.props as MGHGridActionsCellItemProps)?.showInMenu) inMenu.push(action);\n else inline.push(action);\n });\n\n return (\n <>\n {inline.map((action, index) => (\n <React.Fragment key={action.key ?? index}>{action}</React.Fragment>\n ))}\n {inMenu.length > 0 && (\n <>\n <IconButton\n size=\"small\"\n label={moreLabel}\n active={Boolean(anchor)}\n onClick={(event) => {\n event.stopPropagation();\n setAnchor((prev) => (prev ? null : event.currentTarget));\n }}\n >\n <MoreVertIcon />\n </IconButton>\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n themeMode={themeMode}\n placement=\"bottom-end\"\n role=\"menu\"\n >\n <Menu>\n {inMenu.map((action, index) => {\n const props = action.props as MGHGridActionsCellItemProps;\n return (\n <MenuItem\n key={action.key ?? index}\n icon={props.icon}\n disabled={props.disabled}\n onClick={(event) => {\n props.onClick?.(event);\n setAnchor(null);\n }}\n >\n {props.label}\n </MenuItem>\n );\n })}\n </Menu>\n </Popover>\n </>\n )}\n </>\n );\n}\n","import React from 'react';\nimport {\n MGHGridAggregationModel,\n MGHGridApi,\n MGHGridApplyFilterFn,\n MGHGridCallbackDetails,\n MGHGridCellParams,\n MGHGridColDef,\n MGHGridColumnVisibilityModel,\n MGHGridDensity,\n MGHGridFilterItem,\n MGHGridFilterModel,\n MGHGridGroupNode,\n MGHGridLeafNode,\n MGHGridLocaleText,\n MGHGridPaginationModel,\n MGHGridPinnedColumns,\n MGHGridPinnedSide,\n MGHGridPreferencePanelState,\n MGHGridPrintExportOptions,\n MGHGridProps,\n MGHGridRowGroupingModel,\n MGHGridRowId,\n MGHGridRowNode,\n MGHGridRowParams,\n MGHGridRowSelectionModel,\n MGHGridSortDirection,\n MGHGridSortModel,\n MGHGridState,\n MGHGridSxProps,\n MGHGridValidRowModel,\n} from './MGHGrid.types';\nimport {\n AGGREGATION_FOOTER_ID,\n BUILT_IN_AGGREGATION_FUNCTIONS,\n CHECKBOX_COLUMN_DEF,\n CHECKBOX_FIELD,\n DEFAULT_COLUMN_MIN_WIDTH,\n DEFAULT_HEADER_HEIGHT,\n DEFAULT_LOCALE_TEXT,\n DEFAULT_ROW_HEIGHT,\n DENSITY_FACTORS,\n DETAIL_PANEL_TOGGLE_COLUMN_DEF,\n DETAIL_PANEL_TOGGLE_FIELD,\n GROUPING_COLUMN_FIELD,\n GROUPING_COLUMN_WIDTH,\n clamp,\n cx,\n defaultFormatValue,\n formattedValueToString,\n getCellValue,\n getColumnFilterOperators,\n getDefaultComparator,\n getFormattedValue,\n getOptionLabel,\n getOptionValue,\n getRowIdFromRow,\n buildScopedCss,\n isInternalField,\n isNil,\n isSelectorKey,\n measureText,\n moveItem,\n normalizeColumn,\n normalizeSelectionModel,\n parseEditValue,\n readLocalStorage,\n resolveValueOptions,\n selectionModelsEqual,\n toDate,\n writeLocalStorage,\n} from './utils';\nimport { useMGHGridStyles } from './MGHGrid.styles';\nimport { MGHGridContext, MGHGridContextValue, MGHGridRootProps } from './context';\nimport { useControlledState, useElementSize, useForceUpdate, useLatestRef, useStableId } from './hooks';\nimport { exportDataAsCsv, exportDataAsExcel, getDataAsCsv } from './export';\nimport { printGridElement } from './print';\nimport {\n DisplayRow,\n GroupTreeNode,\n RowEntry,\n aggregateRows,\n buildGroupTree,\n collectTreeLeaves,\n flattenGroupTree,\n sortGroupTree,\n} from './grouping';\nimport {\n ArrowDownwardIcon,\n ArrowUpwardIcon,\n CheckIcon,\n ChevronRightIcon,\n CloseIcon,\n ExpandMoreIcon,\n MoreVertIcon,\n} from './icons';\nimport { Checkbox, IconButton, Popover, Select, TextInput } from './components/primitives';\nimport { MGHGridToolbar } from './components/Toolbar';\nimport { MGHGridFooter } from './components/Footer';\nimport { MGHGridColumnsPanel } from './components/ColumnsPanel';\nimport { MGHGridFilterPanel } from './components/FilterPanel';\nimport { MGHGridColumnMenu } from './components/ColumnMenu';\nimport { MGHGridLoadingOverlay, MGHGridNoRowsOverlay } from './components/Overlays';\nimport { ActionsCell } from './components/ActionsCell';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants & helpers\n * ----------------------------------------------------------------------------------------------- */\n\nconst EMPTY_ARRAY: any[] = [];\nconst EMPTY_OBJECT: Record<string, any> = {};\nconst EMPTY_MAP = new Map<any, any>();\nconst DEFAULT_SORTING_ORDER: MGHGridSortDirection[] = ['asc', 'desc', null];\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\nconst DEFAULT_FILTER_MODEL: MGHGridFilterModel = { items: [], quickFilterExcludeHiddenColumns: false };\nconst OVERSCAN_ROWS = 6;\nconst DEFAULT_DETAIL_PANEL_HEIGHT = 500;\n\ninterface ColumnLayout {\n col: MGHGridColDef;\n width: number;\n pinned: MGHGridPinnedSide | null;\n /** Sticky offset (left or right) for pinned columns. */\n offset: number;\n /** X position from the start of the row. */\n x: number;\n isLastLeft: boolean;\n isFirstRight: boolean;\n}\n\ntype RenderRowKind = 'leaf' | 'group' | 'pinnedRow' | 'footer';\n\ninterface RenderRow<R extends MGHGridValidRowModel = any> {\n id: MGHGridRowId;\n kind: RenderRowKind;\n row: R | null;\n node: MGHGridRowNode;\n depth: number;\n group?: GroupTreeNode<R>;\n aggregates?: Record<string, { value: any; fn: string }>;\n}\n\ninterface CellCoords {\n id: MGHGridRowId;\n field: string;\n}\n\n/** Keeps only the inline-applicable part of an sx-like object (nested selectors are compiled to CSS). */\nconst sanitizeStyle = (style: MGHGridSxProps | undefined): React.CSSProperties | undefined => {\n if (!style) return undefined;\n const out: Record<string, any> = {};\n Object.keys(style).forEach((key) => {\n if (isSelectorKey(key)) return;\n const value = (style as any)[key];\n if (typeof value !== 'string' && typeof value !== 'number') return;\n out[key] = value;\n });\n return out;\n};\n\nconst computeWidths = (cols: MGHGridColDef[], available: number, overrides: Record<string, number>) => {\n const result: Array<number | null> = cols.map((col) => {\n const min = col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH;\n const max = col.maxWidth ?? Infinity;\n const override = overrides[col.field];\n if (override) return clamp(override, min, max);\n if (col.flex && col.flex > 0) return null;\n return clamp(col.width ?? 100, min, max);\n });\n const pool: number[] = [];\n let fixedTotal = 0;\n result.forEach((w, i) => {\n if (w === null) pool.push(i);\n else fixedTotal += w;\n });\n if (pool.length > 0) {\n let remainingSpace = Math.max(0, available - fixedTotal);\n let remainingFlex = pool.reduce((acc, i) => acc + (cols[i].flex as number), 0);\n let active = pool.slice();\n let changed = true;\n while (changed && active.length > 0) {\n changed = false;\n for (let k = 0; k < active.length; k += 1) {\n const i = active[k];\n const col = cols[i];\n const min = col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH;\n const max = col.maxWidth ?? Infinity;\n const share = remainingFlex > 0 ? (remainingSpace * (col.flex as number)) / remainingFlex : 0;\n if (share < min || share > max) {\n const fixed = share < min ? min : max;\n result[i] = fixed;\n remainingSpace = Math.max(0, remainingSpace - fixed);\n remainingFlex -= col.flex as number;\n active = active.filter((idx) => idx !== i);\n changed = true;\n break;\n }\n }\n }\n active.forEach((i) => {\n const col = cols[i];\n result[i] =\n remainingFlex > 0\n ? Math.floor((remainingSpace * (col.flex as number)) / remainingFlex)\n : (col.minWidth ?? 50);\n });\n }\n return result as number[];\n};\n\nconst toDateInputValue = (value: any, withTime: boolean) => {\n const date = toDate(value);\n if (!date) return '';\n const pad = (n: number) => String(n).padStart(2, '0');\n const base = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n return withTime ? `${base}T${pad(date.getHours())}:${pad(date.getMinutes())}` : base;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Component\n * ----------------------------------------------------------------------------------------------- */\n\nexport default function MGHGrid<R extends MGHGridValidRowModel = any>(props: MGHGridProps<R>) {\n const {\n rows,\n columns: columnsProp,\n getRowId,\n loading = false,\n header,\n renderHeaderEndContent,\n renderHeaderCenterContent,\n disableCard = false,\n className,\n cardClassName,\n boxClassName,\n cardStyle,\n cardSx,\n boxStyle,\n boxSx,\n style,\n sx,\n themeMode = 'light',\n themeVars,\n showToolbar = true,\n toolbarProps,\n slots = EMPTY_OBJECT,\n slotProps = EMPTY_OBJECT,\n noRowsText = 'No data found within selected parameters.',\n localeText: localeTextProp,\n rowHeight: rowHeightProp = DEFAULT_ROW_HEIGHT,\n columnHeaderHeight = DEFAULT_HEADER_HEIGHT,\n getRowHeight,\n autoHeight = false,\n disableVirtualization = false,\n density: densityProp,\n onDensityChange,\n disableDensitySelector = false,\n pagination = true,\n pageSize = 25,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n paginationModel: paginationModelProp,\n onPaginationModelChange,\n hideFooter = false,\n hideFooterPagination = false,\n hideFooterRowCount = false,\n hideFooterSelectedRowCount = false,\n sortModel: sortModelProp,\n onSortModelChange,\n sortingOrder = DEFAULT_SORTING_ORDER,\n disableMultipleColumnsSorting = false,\n disableColumnSorting = false,\n filterModel: filterModelProp,\n onFilterModelChange,\n disableColumnFilter = false,\n disableMultipleColumnsFiltering = false,\n quickFilterDebounceMs = 150,\n columnVisibilityModel: columnVisibilityModelProp,\n onColumnVisibilityModelChange,\n columnVisibilityStorageKey,\n columnOrderStorageKey,\n columnWidthStorageKey,\n pinnedColumnsStorageKey,\n onColumnOrderChange,\n onColumnWidthChange,\n disableColumnMenu = false,\n disableColumnSelector = false,\n disableColumnResize = false,\n disableColumnReorder = false,\n disableColumnPinning = false,\n pinnedColumns: pinnedColumnsProp,\n onPinnedColumnsChange,\n checkboxSelection = false,\n checkboxSelectionVisibleOnly = false,\n disableRowSelectionOnClick = true,\n disableMultipleRowSelection = false,\n rowSelectionModel: rowSelectionModelProp,\n onRowSelectionModelChange,\n isRowSelectable,\n keepNonExistentRowsSelected = true,\n getRowClassName,\n onRowClick,\n onRowDoubleClick,\n onCellClick,\n onCellDoubleClick,\n pinnedRows,\n getDetailPanelContent,\n getDetailPanelHeight,\n detailPanelExpandedRowIds: detailPanelExpandedRowIdsProp,\n onDetailPanelExpandedRowIdsChange,\n rowGroupingModel: rowGroupingModelProp,\n onRowGroupingModelChange,\n defaultGroupingExpansionDepth = 0,\n groupingColDef,\n disableRowGrouping = false,\n isGroupExpandedByDefault,\n aggregationModel: aggregationModelProp,\n onAggregationModelChange,\n aggregationFunctions: aggregationFunctionsProp,\n disableAggregation = false,\n aggregationPosition = 'both',\n processRowUpdate,\n onProcessRowUpdateError,\n onCellEditStop,\n isCellEditable,\n initialState,\n apiRef,\n onStateChange,\n } = props;\n\n useMGHGridStyles();\n\n const gridId = useStableId('mgh-grid');\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const cardRef = React.useRef<HTMLDivElement | null>(null);\n const scrollerRef = React.useRef<HTMLDivElement | null>(null);\n const toolbarRef = React.useRef<HTMLDivElement | null>(null);\n const forceUpdate = useForceUpdate();\n\n const localeText = React.useMemo<MGHGridLocaleText>(\n () => ({ ...DEFAULT_LOCALE_TEXT, ...localeTextProp }),\n [localeTextProp]\n );\n\n /* ------------------------------------------------------------------ latest ref + api shell */\n\n const latest = React.useRef<any>({});\n const getDetails = React.useCallback((): MGHGridCallbackDetails => ({ api: latest.current.api }), []);\n\n const apiObject = React.useMemo<MGHGridApi<R>>(() => {\n const L = () => latest.current;\n const apiImpl: MGHGridApi<R> = {\n getRow: (id) => L().rowsById.get(id) ?? null,\n getRowModels: () => new Map(L().rowsById),\n getAllRowIds: () => L().rowEntries.map((e: RowEntry<R>) => e.id),\n getRowNode: (id) => L().nodesById.get(id) ?? null,\n getSortedRows: () => L().sortedLeaves.map((e: RowEntry<R>) => e.row),\n getSortedRowIds: () => L().sortedLeaves.map((e: RowEntry<R>) => e.id),\n getVisibleRows: () =>\n L()\n .pagedRows.filter((dr: DisplayRow<R>) => dr.type === 'leaf' && dr.row)\n .map((dr: DisplayRow<R>) => ({ id: dr.id, model: dr.row as R })),\n getRowIndexRelativeToVisibleRows: (id) => L().pagedRows.findIndex((dr: DisplayRow<R>) => dr.id === id),\n updateRows: (updates) => {\n updates.forEach((update) => {\n const id = getRowIdFromRow(update as R, L().getRowId);\n const existing = L().rowsById.get(id);\n if (existing) L().setRowOverride(id, { ...existing, ...update });\n });\n },\n\n getAllColumns: () => L().orderedUserColumns,\n getVisibleColumns: () => L().visibleUserColumns,\n getColumn: (field) => L().getColumn(field),\n getColumnIndex: (field, useVisibleColumns = true) =>\n (useVisibleColumns ? L().visibleUserColumns : L().orderedUserColumns).findIndex(\n (c: MGHGridColDef) => c.field === field\n ),\n getColumnVisibilityModel: () => L().columnVisibilityModel,\n setColumnVisibility: (field, isVisible) =>\n L().setColumnVisibilityModel({ ...L().columnVisibilityModel, [field]: isVisible }),\n setColumnVisibilityModel: (model) => L().setColumnVisibilityModel(model),\n setColumnWidth: (field, width) => L().setColumnWidth(field, width),\n setColumnIndex: (field, targetIndex) => L().setColumnIndex(field, targetIndex),\n autosizeColumns: (options) => L().autosizeColumns(options),\n pinColumn: (field, side) => L().pinColumn(field, side),\n unpinColumn: (field) => L().unpinColumn(field),\n isColumnPinned: (field) => L().isColumnPinned(field),\n getPinnedColumns: () => L().pinnedColumns,\n setPinnedColumns: (model) => L().setPinnedColumns(model),\n\n getSortModel: () => L().sortModel,\n setSortModel: (model) => L().setSortModel(model),\n sortColumn: (field, direction, allowMultipleSorting) => L().sortColumn(field, direction, allowMultipleSorting),\n\n getFilterModel: () => L().filterModel,\n setFilterModel: (model) => L().setFilterModel(model),\n upsertFilterItem: (item) => L().upsertFilterItems([item]),\n upsertFilterItems: (items) => L().upsertFilterItems(items),\n deleteFilterItem: (item) => L().deleteFilterItem(item),\n setFilterLogicOperator: (operator) => L().setFilterModel({ ...L().filterModel, logicOperator: operator }),\n setQuickFilterValues: (values) => L().setFilterModel({ ...L().filterModel, quickFilterValues: values }),\n showFilterPanel: (targetColumnField, anchorEl) => L().showPreferences('filters', anchorEl, targetColumnField),\n hideFilterPanel: () => L().hidePreferences(),\n showPreferences: (panel, anchorEl, targetField) => L().showPreferences(panel, anchorEl, targetField),\n hidePreferences: () => L().hidePreferences(),\n\n getSelectedRows: () => {\n const map = new Map<MGHGridRowId, R>();\n L().selectedIds.forEach((id: MGHGridRowId) => {\n const row = L().rowsById.get(id);\n if (row) map.set(id, row);\n });\n return map;\n },\n getRowSelectionModel: () => ({ type: 'include', ids: L().selectedIds }),\n setRowSelectionModel: (model) => {\n const normalized = normalizeSelectionModel(\n model,\n L().rowEntries.map((e: RowEntry<R>) => e.id)\n );\n L().setSelectedIds(normalized.ids);\n },\n selectRow: (id, isSelected = true, resetSelection = false) => L().selectRows([id], isSelected, resetSelection),\n selectRows: (ids, isSelected = true, resetSelection = false) => L().selectRows(ids, isSelected, resetSelection),\n isRowSelected: (id) => L().selectedIds.has(id),\n isRowSelectable: (id) => L().isRowSelectableFn(id, L().rowsById.get(id)),\n\n setPage: (nextPage) => L().setPaginationModel({ ...L().paginationModel, page: Math.max(0, nextPage) }),\n setPageSize: (nextPageSize) => L().setPaginationModel({ page: 0, pageSize: Math.max(1, nextPageSize) }),\n setPaginationModel: (model) => L().setPaginationModel(model),\n\n setDensity: (value) => L().setDensity(value),\n\n getDataAsCsv: (options) => getDataAsCsv(apiImpl, options),\n exportDataAsCsv: (options) => exportDataAsCsv(apiImpl, options),\n exportDataAsExcel: (options) => exportDataAsExcel(apiImpl, options),\n exportDataAsPrint: (options) => L().startPrint(options),\n\n toggleDetailPanel: (id) => L().toggleDetailPanel(id),\n setExpandedDetailPanels: (ids) => L().setExpandedDetailPanels(new Set(ids)),\n getExpandedDetailPanels: () => Array.from(L().expandedDetailPanels as Set<MGHGridRowId>),\n\n getRowGroupingModel: () => L().rowGroupingModel,\n setRowGroupingModel: (model) => L().setRowGroupingModel(model),\n addRowGroupingCriteria: (field, groupingIndex) => {\n const current: string[] = L().rowGroupingModel.filter((f: string) => f !== field);\n if (groupingIndex === undefined) current.push(field);\n else current.splice(clamp(groupingIndex, 0, current.length), 0, field);\n L().setRowGroupingModel(current);\n },\n removeRowGroupingCriteria: (field) =>\n L().setRowGroupingModel(L().rowGroupingModel.filter((f: string) => f !== field)),\n setRowChildrenExpansion: (id, isExpanded) => L().setRowChildrenExpansion(id, isExpanded),\n getRowGroupChildren: ({ groupId }) => {\n const group = L().groupsById.get(groupId) as GroupTreeNode<R> | undefined;\n return group ? group.descendants.map((d) => d.id) : [];\n },\n\n getAggregationModel: () => L().aggregationModel,\n setAggregationModel: (model) => L().setAggregationModel(model),\n\n startCellEditMode: ({ id, field }) => L().startCellEditMode(id, field),\n stopCellEditMode: ({ id, field, ignoreModifications }) =>\n L().stopCellEditMode(id, field, ignoreModifications, 'api'),\n getCellMode: (id, field) => {\n const editing = L().editingCell as CellCoords | null;\n return editing && editing.id === id && editing.field === field ? 'edit' : 'view';\n },\n setEditCellValue: ({ id, field, value }) => {\n const editing = L().editingCell as CellCoords | null;\n if (editing && editing.id === id && editing.field === field) L().setEditValue(value);\n },\n\n getCellValue: (id, field) => {\n const row = L().rowsById.get(id);\n const col = L().getColumn(field);\n return row && col ? getCellValue(row, col, apiImpl) : undefined;\n },\n getCellParams: (id, field) => {\n const row = L().rowsById.get(id);\n return L().buildCellParams(\n id,\n field,\n row,\n L().nodesById.get(id) ?? { type: 'leaf', id, depth: 0, parent: null }\n );\n },\n setCellFocus: (id, field) => {\n pendingFocusRef.current = true;\n L().setFocusedCell({ id, field });\n },\n\n scrollToIndexes: (params) => L().scrollToIndexes(params),\n scroll: ({ left, top }) => {\n const scroller = scrollerRef.current;\n if (!scroller) return;\n if (left !== undefined) scroller.scrollLeft = left;\n if (top !== undefined) scroller.scrollTop = top;\n },\n getScrollPosition: () => ({\n left: scrollerRef.current?.scrollLeft ?? 0,\n top: scrollerRef.current?.scrollTop ?? 0,\n }),\n\n get state() {\n return L().state as MGHGridState;\n },\n forceUpdate: () => L().forceUpdate(),\n rootElementRef: rootRef,\n };\n return apiImpl;\n }, []);\n if (!latest.current.api) latest.current.api = apiObject;\n\n /* ------------------------------------------------------------------ persisted state */\n\n const persisted = React.useMemo(\n () => ({\n visibility: columnVisibilityStorageKey\n ? readLocalStorage<MGHGridColumnVisibilityModel>(columnVisibilityStorageKey)\n : null,\n order: columnOrderStorageKey ? readLocalStorage<string[]>(columnOrderStorageKey) : null,\n widths: columnWidthStorageKey ? readLocalStorage<Record<string, number>>(columnWidthStorageKey) : null,\n pinned: pinnedColumnsStorageKey ? readLocalStorage<MGHGridPinnedColumns>(pinnedColumnsStorageKey) : null,\n }),\n [columnVisibilityStorageKey, columnOrderStorageKey, columnWidthStorageKey, pinnedColumnsStorageKey]\n );\n\n /* ------------------------------------------------------------------ models */\n\n const [sortModel, setSortModel] = useControlledState<MGHGridSortModel>(\n sortModelProp,\n initialState?.sorting?.sortModel ?? EMPTY_ARRAY,\n (model) => onSortModelChange?.(model, getDetails())\n );\n\n const [filterModel, setFilterModel] = useControlledState<MGHGridFilterModel>(\n filterModelProp,\n initialState?.filter?.filterModel ?? DEFAULT_FILTER_MODEL,\n (model) => onFilterModelChange?.(model, getDetails())\n );\n\n const [paginationModel, setPaginationModel] = useControlledState<MGHGridPaginationModel>(\n paginationModelProp,\n {\n page: initialState?.pagination?.paginationModel?.page ?? 0,\n pageSize: initialState?.pagination?.paginationModel?.pageSize ?? pageSize,\n },\n (model) => onPaginationModelChange?.(model, getDetails())\n );\n\n const [columnVisibilityModel, setColumnVisibilityModel] = useControlledState<MGHGridColumnVisibilityModel>(\n columnVisibilityModelProp,\n persisted.visibility ?? initialState?.columns?.columnVisibilityModel ?? EMPTY_OBJECT,\n (model) => {\n if (columnVisibilityStorageKey) writeLocalStorage(columnVisibilityStorageKey, model);\n onColumnVisibilityModelChange?.(model, getDetails());\n }\n );\n\n const [density, setDensity] = useControlledState<MGHGridDensity>(\n densityProp,\n initialState?.density ?? 'compact',\n (value) => onDensityChange?.(value, getDetails())\n );\n\n const [pinnedColumns, setPinnedColumns] = useControlledState<MGHGridPinnedColumns>(\n pinnedColumnsProp,\n persisted.pinned ?? initialState?.pinnedColumns ?? EMPTY_OBJECT,\n (model) => {\n if (pinnedColumnsStorageKey) writeLocalStorage(pinnedColumnsStorageKey, model);\n onPinnedColumnsChange?.(model, getDetails());\n }\n );\n\n const [rowGroupingModel, setRowGroupingModel] = useControlledState<MGHGridRowGroupingModel>(\n rowGroupingModelProp,\n initialState?.rowGrouping?.model ?? EMPTY_ARRAY,\n (model) => onRowGroupingModelChange?.(model, getDetails())\n );\n\n const [aggregationModel, setAggregationModel] = useControlledState<MGHGridAggregationModel>(\n aggregationModelProp,\n initialState?.aggregation?.model ?? EMPTY_OBJECT,\n (model) => onAggregationModelChange?.(model, getDetails())\n );\n\n const controlledExpandedDetail = React.useMemo(\n () => (detailPanelExpandedRowIdsProp ? new Set<MGHGridRowId>(detailPanelExpandedRowIdsProp) : undefined),\n [detailPanelExpandedRowIdsProp]\n );\n const [expandedDetailPanels, setExpandedDetailPanels] = useControlledState<Set<MGHGridRowId>>(\n controlledExpandedDetail,\n React.useMemo(() => new Set<MGHGridRowId>(initialState?.detailPanel?.expandedRowIds ?? []), []),\n (ids) => onDetailPanelExpandedRowIdsChange?.(Array.from(ids), getDetails())\n );\n\n const controlledSelection = React.useMemo(\n () => (rowSelectionModelProp !== undefined ? normalizeSelectionModel(rowSelectionModelProp).ids : undefined),\n [rowSelectionModelProp]\n );\n const [selectedIds, setSelectedIds] = useControlledState<Set<MGHGridRowId>>(\n controlledSelection,\n React.useMemo(() => new Set<MGHGridRowId>(), []),\n (ids) => onRowSelectionModelChange?.({ type: 'include', ids }, getDetails())\n );\n\n /* ------------------------------------------------------------------ internal state */\n\n const [orderedFields, setOrderedFields] = React.useState<string[] | null>(\n () => persisted.order ?? initialState?.columns?.orderedFields ?? null\n );\n const [columnWidths, setColumnWidths] = React.useState<Record<string, number>>(() => {\n if (persisted.widths) return persisted.widths;\n const dims = initialState?.columns?.dimensions;\n if (!dims) return {};\n const out: Record<string, number> = {};\n Object.keys(dims).forEach((field) => {\n if (dims[field].width) out[field] = dims[field].width as number;\n });\n return out;\n });\n const [groupExpansion, setGroupExpansion] = React.useState<Map<MGHGridRowId, boolean>>(() => new Map());\n const [editingCell, setEditingCell] = React.useState<CellCoords | null>(null);\n const [editValue, setEditValue] = React.useState<any>(undefined);\n const [focusedCell, setFocusedCell] = React.useState<CellCoords | null>(null);\n const pendingFocusRef = React.useRef(false);\n const [preferencePanel, setPreferencePanel] = React.useState<\n MGHGridPreferencePanelState & { anchorEl: HTMLElement | null }\n >({\n open: false,\n anchorEl: null,\n });\n const [columnMenu, setColumnMenu] = React.useState<{ field: string; anchorEl: HTMLElement } | null>(null);\n const [resizingField, setResizingField] = React.useState<string | null>(null);\n // While set, the grid renders every row (no pagination / virtualization) so the DOM can be printed.\n const [printState, setPrintState] = React.useState<MGHGridPrintExportOptions | null>(null);\n const printing = printState !== null;\n const [drag, setDrag] = React.useState<{ field: string; overField: string | null; side: 'left' | 'right' } | null>(null);\n const [scrollTop, setScrollTop] = React.useState(0);\n const scrollRaf = React.useRef(0);\n const lastClickedIdRef = React.useRef<MGHGridRowId | null>(null);\n\n // Row updates (editing / api.updateRows) are kept until the `rows` prop identity changes.\n const [overrideState, setOverrideState] = React.useState<{ rows: R[]; map: Map<MGHGridRowId, R> }>(() => ({\n rows,\n map: new Map(),\n }));\n const rowOverrides: Map<MGHGridRowId, R> = overrideState.rows === rows ? overrideState.map : EMPTY_MAP;\n const setRowOverride = React.useCallback(\n (id: MGHGridRowId, row: R) => {\n setOverrideState((prev) => {\n const map = new Map(prev.rows === rows ? prev.map : []);\n map.set(id, row);\n return { rows, map };\n });\n },\n [rows]\n );\n\n /* ------------------------------------------------------------------ sizes */\n\n const { width: viewportWidth, height: viewportHeight } = useElementSize(scrollerRef);\n const densityFactor = DENSITY_FACTORS[density] ?? 1;\n const rowHeight = Math.round(rowHeightProp * densityFactor);\n const headerHeight = Math.round(columnHeaderHeight * densityFactor);\n\n /* ------------------------------------------------------------------ rows */\n\n const rowEntries = React.useMemo<RowEntry<R>[]>(() => {\n const out: RowEntry<R>[] = [];\n rows.forEach((raw) => {\n const id = getRowIdFromRow(raw, getRowId);\n if (id === undefined || id === null) return;\n out.push({ id, row: rowOverrides.get(id) ?? raw });\n });\n return out;\n }, [rows, getRowId, rowOverrides]);\n\n const rowsById = React.useMemo(() => {\n const map = new Map<MGHGridRowId, R>();\n rowEntries.forEach((entry) => map.set(entry.id, entry.row));\n (pinnedRows?.top ?? []).forEach((row) => map.set(getRowIdFromRow(row, getRowId), row));\n (pinnedRows?.bottom ?? []).forEach((row) => map.set(getRowIdFromRow(row, getRowId), row));\n return map;\n }, [rowEntries, pinnedRows, getRowId]);\n\n /* ------------------------------------------------------------------ columns */\n\n const userColumns = React.useMemo(() => columnsProp.map((col) => normalizeColumn(col)), [columnsProp]);\n\n const columnsByField = React.useMemo(() => {\n const map = new Map<string, MGHGridColDef<R>>();\n userColumns.forEach((col) => map.set(col.field, col));\n return map;\n }, [userColumns]);\n\n const groupingFields = React.useMemo(\n () => (disableRowGrouping ? [] : rowGroupingModel.filter((field) => columnsByField.has(field))),\n [rowGroupingModel, columnsByField, disableRowGrouping]\n );\n const groupingActive = groupingFields.length > 0;\n\n const groupingColumn = React.useMemo<MGHGridColDef<R> | null>(() => {\n if (!groupingActive) return null;\n const single = groupingFields.length === 1 ? columnsByField.get(groupingFields[0]) : undefined;\n return normalizeColumn<R>({\n field: GROUPING_COLUMN_FIELD,\n headerName: single ? (single.headerName ?? single.field) : localeText.groupingColumnHeaderName,\n width: GROUPING_COLUMN_WIDTH,\n minWidth: 120,\n sortable: true,\n filterable: false,\n hideable: false,\n groupable: false,\n aggregable: false,\n editable: false,\n disableExport: true,\n disableReorder: true,\n ...(groupingColDef as any),\n });\n }, [groupingActive, groupingFields, columnsByField, localeText.groupingColumnHeaderName, groupingColDef]);\n\n const orderedUserColumns = React.useMemo(() => {\n if (!orderedFields || orderedFields.length === 0) return userColumns;\n const seen = new Set<string>();\n const out: MGHGridColDef<R>[] = [];\n orderedFields.forEach((field) => {\n const col = columnsByField.get(field);\n if (col && !seen.has(field)) {\n seen.add(field);\n out.push(col);\n }\n });\n userColumns.forEach((col) => {\n if (!seen.has(col.field)) out.push(col);\n });\n return out;\n }, [orderedFields, userColumns, columnsByField]);\n\n const isColumnVisible = React.useCallback(\n (field: string) => {\n const value = columnVisibilityModel[field];\n if (value === false) return false;\n if (value === undefined && groupingFields.indexOf(field) !== -1) return false;\n return true;\n },\n [columnVisibilityModel, groupingFields]\n );\n\n const visibleUserColumns = React.useMemo(() => {\n if (printState) {\n let cols = orderedUserColumns.filter((col) => isColumnVisible(col.field));\n if (printState.fields) {\n const wanted = new Set(printState.fields);\n cols = orderedUserColumns.filter((col) => wanted.has(col.field));\n } else if (printState.allColumns) {\n cols = orderedUserColumns;\n }\n return cols.filter((col) => !col.disableExport);\n }\n return orderedUserColumns.filter((col) => isColumnVisible(col.field));\n }, [orderedUserColumns, isColumnVisible, printState]);\n\n const layout = React.useMemo(() => {\n const internal: MGHGridColDef[] = [];\n if (checkboxSelection) internal.push(CHECKBOX_COLUMN_DEF);\n if (getDetailPanelContent) internal.push(DETAIL_PANEL_TOGGLE_COLUMN_DEF);\n const leftFields = disableColumnPinning ? [] : (pinnedColumns.left ?? []).filter((f) => f !== GROUPING_COLUMN_FIELD);\n const rightFields = disableColumnPinning\n ? []\n : (pinnedColumns.right ?? []).filter((f) => f !== GROUPING_COLUMN_FIELD);\n const visibleByField = new Map<string, MGHGridColDef>();\n visibleUserColumns.forEach((col) => visibleByField.set(col.field, col));\n const left: MGHGridColDef[] = internal.slice();\n if (groupingColumn) left.push(groupingColumn);\n leftFields.forEach((f) => {\n const col = visibleByField.get(f);\n if (col) left.push(col);\n });\n const right: MGHGridColDef[] = [];\n rightFields.forEach((f) => {\n const col = visibleByField.get(f);\n if (col && leftFields.indexOf(f) === -1) right.push(col);\n });\n const center = visibleUserColumns.filter(\n (col) => leftFields.indexOf(col.field) === -1 && rightFields.indexOf(col.field) === -1\n );\n const ordered = left.concat(center, right);\n const widths = computeWidths(ordered, viewportWidth, columnWidths);\n const hasPinning = left.length > internal.length + (groupingColumn ? 1 : 0) || right.length > 0;\n const columns: ColumnLayout[] = [];\n let x = 0;\n let leftOffset = 0;\n ordered.forEach((col, i) => {\n const width = widths[i];\n const isLeft = i < left.length;\n const isRight = i >= left.length + center.length;\n columns.push({\n col,\n width,\n pinned: isLeft ? 'left' : isRight ? 'right' : null,\n offset: isLeft ? leftOffset : 0,\n x,\n isLastLeft: isLeft && i === left.length - 1,\n isFirstRight: isRight && i === left.length + center.length,\n });\n if (isLeft) leftOffset += width;\n x += width;\n });\n let rightOffset = 0;\n for (let i = columns.length - 1; i >= 0; i -= 1) {\n if (columns[i].pinned !== 'right') break;\n columns[i].offset = rightOffset;\n rightOffset += columns[i].width;\n }\n return { columns, totalWidth: x, hasPinning, leftCount: left.length, rightCount: right.length };\n }, [\n checkboxSelection,\n getDetailPanelContent,\n pinnedColumns,\n disableColumnPinning,\n visibleUserColumns,\n groupingColumn,\n viewportWidth,\n columnWidths,\n ]);\n\n const allDisplayColumnsByField = React.useMemo(() => {\n const map = new Map<string, MGHGridColDef>();\n layout.columns.forEach((c) => map.set(c.col.field, c.col));\n if (groupingColumn) map.set(GROUPING_COLUMN_FIELD, groupingColumn);\n return map;\n }, [layout.columns, groupingColumn]);\n\n const getColumn = React.useCallback(\n (field: string): MGHGridColDef<R> | undefined =>\n columnsByField.get(field) ?? (allDisplayColumnsByField.get(field) as any),\n [columnsByField, allDisplayColumnsByField]\n );\n\n /* ------------------------------------------------------------------ filtering */\n\n const activeFilters = React.useMemo(() => {\n const out: Array<{ col: MGHGridColDef<R>; fn: MGHGridApplyFilterFn<R> }> = [];\n filterModel.items.forEach((item) => {\n const col = columnsByField.get(item.field);\n if (!col || col.filterable === false) return;\n const operator = getColumnFilterOperators(col).find((op) => op.value === item.operator);\n if (!operator) return;\n const fn = operator.getApplyFilterFn(item, col);\n if (fn) out.push({ col, fn });\n });\n return out;\n }, [filterModel.items, columnsByField]);\n\n const quickFilterValues = React.useMemo(\n () => (filterModel.quickFilterValues ?? []).map((v) => String(v).trim()).filter((v) => v !== ''),\n [filterModel.quickFilterValues]\n );\n\n const quickFilterColumns = React.useMemo(() => {\n const base = filterModel.quickFilterExcludeHiddenColumns ? visibleUserColumns : orderedUserColumns;\n return base.filter((col) => col.filterable !== false && col.type !== 'actions');\n }, [filterModel.quickFilterExcludeHiddenColumns, visibleUserColumns, orderedUserColumns]);\n\n const filteredEntries = React.useMemo(() => {\n if (activeFilters.length === 0 && quickFilterValues.length === 0) return rowEntries;\n const logicAnd = (filterModel.logicOperator ?? 'and') === 'and';\n const quickAnd = (filterModel.quickFilterLogicOperator ?? 'and') === 'and';\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const quickFns = quickFilterValues.map((needle) => {\n const lowered = needle.toLowerCase();\n const perColumn = quickFilterColumns.map((col) => {\n if (col.getApplyQuickFilterFn) {\n const custom = col.getApplyQuickFilterFn(needle, col, apiRefLocal);\n return custom ? { col, fn: custom } : null;\n }\n const fn: MGHGridApplyFilterFn<R> = (value, row) => {\n if (isNil(value)) return false;\n const formatted = formattedValueToString(getFormattedValue(value, row, col, apiRefLocal)).toLowerCase();\n if (formatted.indexOf(lowered) !== -1) return true;\n const raw = typeof value === 'object' ? '' : String(value).toLowerCase();\n return raw.indexOf(lowered) !== -1;\n };\n return { col, fn };\n });\n const active = perColumn.filter(Boolean) as Array<{ col: MGHGridColDef<R>; fn: MGHGridApplyFilterFn<R> }>;\n return (row: R) => active.some(({ col, fn }) => fn(getCellValue(row, col, apiRefLocal), row, col, apiRefLocal));\n });\n return rowEntries.filter(({ row }) => {\n if (activeFilters.length > 0) {\n const results = activeFilters.map(({ col, fn }) =>\n fn(getCellValue(row, col, apiRefLocal), row, col, apiRefLocal)\n );\n const pass = logicAnd ? results.every(Boolean) : results.some(Boolean);\n if (!pass) return false;\n }\n if (quickFns.length > 0) {\n const results = quickFns.map((fn) => fn(row));\n return quickAnd ? results.every(Boolean) : results.some(Boolean);\n }\n return true;\n });\n }, [\n rowEntries,\n activeFilters,\n quickFilterValues,\n quickFilterColumns,\n filterModel.logicOperator,\n filterModel.quickFilterLogicOperator,\n ]);\n\n /* ------------------------------------------------------------------ sorting */\n\n const compareEntries = React.useMemo(() => {\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const sorters = sortModel\n .filter((item) => item.sort && item.field !== GROUPING_COLUMN_FIELD)\n .map((item) => {\n const col = columnsByField.get(item.field);\n if (!col || col.sortable === false) return null;\n return {\n col,\n dir: item.sort === 'desc' ? -1 : 1,\n comparator: col.sortComparator ?? getDefaultComparator(col.type),\n };\n })\n .filter(Boolean) as Array<{ col: MGHGridColDef<R>; dir: number; comparator: any }>;\n if (sorters.length === 0) return null;\n return (a: RowEntry<R>, b: RowEntry<R>) => {\n for (let i = 0; i < sorters.length; i += 1) {\n const { col, dir, comparator } = sorters[i];\n const v1 = getCellValue(a.row, col, apiRefLocal);\n const v2 = getCellValue(b.row, col, apiRefLocal);\n const result = comparator(\n v1,\n v2,\n { id: a.id, field: col.field, value: v1, row: a.row, api: apiRefLocal },\n { id: b.id, field: col.field, value: v2, row: b.row, api: apiRefLocal }\n );\n if (result !== 0) return result * dir;\n }\n return 0;\n };\n }, [sortModel, columnsByField]);\n\n const sortEntries = React.useCallback(\n (entries: RowEntry<R>[]) => {\n if (!compareEntries) return entries;\n return entries\n .map((entry, index) => ({ entry, index }))\n .sort((a, b) => compareEntries(a.entry, b.entry) || a.index - b.index)\n .map((item) => item.entry);\n },\n [compareEntries]\n );\n\n /* ------------------------------------------------------------------ grouping + display rows */\n\n const aggregationFunctions = React.useMemo(\n () => ({ ...BUILT_IN_AGGREGATION_FUNCTIONS, ...aggregationFunctionsProp }),\n [aggregationFunctionsProp]\n );\n const aggregationActive = !disableAggregation && Object.keys(aggregationModel).length > 0;\n\n const isGroupExpanded = React.useCallback(\n (node: GroupTreeNode<R>) => {\n const override = groupExpansion.get(node.id);\n if (override !== undefined) return override;\n if (isGroupExpandedByDefault) {\n return isGroupExpandedByDefault({\n type: 'group',\n id: node.id,\n depth: node.depth,\n parent: node.parent,\n groupingField: node.groupingField,\n groupingKey: node.groupingKey,\n groupingLabel: node.groupingLabel,\n children: [],\n leafIds: [],\n isExpanded: false,\n });\n }\n return defaultGroupingExpansionDepth === -1 || node.depth < defaultGroupingExpansionDepth;\n },\n [groupExpansion, isGroupExpandedByDefault, defaultGroupingExpansionDepth]\n );\n\n const processed = React.useMemo(() => {\n const nodesById = new Map<MGHGridRowId, MGHGridLeafNode | MGHGridGroupNode>();\n const groupsById = new Map<MGHGridRowId, GroupTreeNode<R>>();\n if (!groupingActive) {\n const sorted = sortEntries(filteredEntries);\n const displayRows: DisplayRow<R>[] = sorted.map((entry) => {\n const node: MGHGridLeafNode = { type: 'leaf', id: entry.id, depth: 0, parent: null };\n nodesById.set(entry.id, node);\n return { id: entry.id, type: 'leaf', row: entry.row, node, depth: 0 };\n });\n return { displayRows, sortedLeaves: sorted, nodesById, groupsById, tree: [] as GroupTreeNode<R>[] };\n }\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n let tree = buildGroupTree(filteredEntries, groupingFields, columnsByField, apiRefLocal);\n const groupingSort = sortModel.find((item) => item.field === GROUPING_COLUMN_FIELD && item.sort);\n const compareGroups = (depth: number) => {\n const field = groupingFields[depth];\n const col = columnsByField.get(field);\n if (!col) return null;\n const sortItem = groupingSort ?? sortModel.find((item) => item.field === field && item.sort);\n if (!sortItem) return null;\n const comparator = col.sortComparator ?? getDefaultComparator(col.type);\n const dir = sortItem.sort === 'desc' ? -1 : 1;\n return (a: GroupTreeNode<R>, b: GroupTreeNode<R>) =>\n comparator(\n a.groupingKey,\n b.groupingKey,\n { id: a.id, field, value: a.groupingKey, row: a.descendants[0]?.row, api: apiRefLocal },\n { id: b.id, field, value: b.groupingKey, row: b.descendants[0]?.row, api: apiRefLocal }\n ) * dir;\n };\n tree = sortGroupTree(tree, compareGroups, sortEntries);\n const displayRows = flattenGroupTree(tree, isGroupExpanded, nodesById, groupsById);\n return { displayRows, sortedLeaves: collectTreeLeaves(tree), nodesById, groupsById, tree };\n }, [groupingActive, filteredEntries, sortEntries, groupingFields, columnsByField, sortModel, isGroupExpanded]);\n\n const { displayRows, sortedLeaves, nodesById, groupsById } = processed;\n\n /* ------------------------------------------------------------------ pagination */\n\n const totalDisplayRows = displayRows.length;\n const paginate = pagination && !printing;\n const pageCount = pagination ? Math.max(1, Math.ceil(totalDisplayRows / Math.max(paginationModel.pageSize, 1))) : 1;\n const page = pagination ? clamp(paginationModel.page, 0, pageCount - 1) : 0;\n\n React.useEffect(() => {\n if (pagination && paginationModel.page !== page) {\n setPaginationModel({ ...paginationModel, page });\n }\n }, [pagination, paginationModel, page, setPaginationModel]);\n\n const pagedRows = React.useMemo(\n () =>\n paginate\n ? displayRows.slice(page * paginationModel.pageSize, (page + 1) * paginationModel.pageSize)\n : displayRows,\n [displayRows, paginate, page, paginationModel.pageSize]\n );\n\n /* ------------------------------------------------------------------ aggregation values */\n\n const footerAggregates = React.useMemo(() => {\n if (!aggregationActive || aggregationPosition === 'inline') return null;\n const rowsForFooter = sortedLeaves.map((entry) => entry.row);\n return aggregateRows(rowsForFooter, aggregationModel, columnsByField, aggregationFunctions, latest.current.api);\n }, [aggregationActive, aggregationPosition, sortedLeaves, aggregationModel, columnsByField, aggregationFunctions]);\n\n const groupAggregatesCache = React.useMemo(\n () => new Map<MGHGridRowId, Record<string, { value: any; fn: string }>>(),\n [pagedRows, aggregationModel, aggregationFunctions]\n );\n const getGroupAggregates = (group: GroupTreeNode<R>) => {\n if (!aggregationActive || aggregationPosition === 'footer') return undefined;\n let cached = groupAggregatesCache.get(group.id);\n if (!cached) {\n cached = aggregateRows(\n group.descendants.map((d) => d.row),\n aggregationModel,\n columnsByField,\n aggregationFunctions,\n latest.current.api\n );\n groupAggregatesCache.set(group.id, cached);\n }\n return cached;\n };\n\n /* ------------------------------------------------------------------ row heights + virtualization */\n\n const heights = React.useMemo(() => {\n const rowHeights: number[] = [];\n const detailHeights: number[] = [];\n const offsets: number[] = [];\n let total = 0;\n let hasAuto = autoHeight || disableVirtualization || printing;\n pagedRows.forEach((dr) => {\n let h = rowHeight;\n if (getRowHeight && dr.type === 'leaf' && dr.row) {\n const result = getRowHeight({ id: dr.id, model: dr.row, densityFactor });\n if (result === 'auto') hasAuto = true;\n else if (typeof result === 'number' && result > 0) h = result;\n }\n let d = 0;\n if (dr.type === 'leaf' && getDetailPanelContent && expandedDetailPanels.has(dr.id) && dr.row) {\n const dh = getDetailPanelHeight\n ? getDetailPanelHeight({ id: dr.id, row: dr.row })\n : DEFAULT_DETAIL_PANEL_HEIGHT;\n if (dh === 'auto') hasAuto = true;\n else d = dh;\n }\n rowHeights.push(h);\n detailHeights.push(d);\n offsets.push(total);\n total += h + d;\n });\n return { rowHeights, detailHeights, offsets, total, hasAuto };\n }, [\n pagedRows,\n rowHeight,\n getRowHeight,\n densityFactor,\n getDetailPanelContent,\n getDetailPanelHeight,\n expandedDetailPanels,\n autoHeight,\n disableVirtualization,\n printing,\n ]);\n\n const virtual = !heights.hasAuto;\n\n /* ------------------------------------------------------------------ print */\n\n const startPrint = (options: MGHGridPrintExportOptions = {}) => {\n if (printState) return;\n const resolved: MGHGridPrintExportOptions = {\n title: typeof header === 'string' ? header : undefined,\n ...options,\n };\n if (!cardRef.current || typeof window === 'undefined') return;\n setPrintState(resolved);\n };\n\n React.useEffect(() => {\n if (!printState) return undefined;\n // The un-virtualized rows are already committed when this effect runs; a short timeout lets the\n // browser lay them out first. (A timeout rather than rAF so it also fires in hidden/background tabs.)\n const timer = window.setTimeout(() => {\n if (!cardRef.current) return;\n printGridElement({\n cardElement: cardRef.current,\n options: printState,\n onDone: () => setPrintState(null),\n });\n }, 50);\n return () => window.clearTimeout(timer);\n }, [printState]);\n\n const virtualRange = React.useMemo(() => {\n const count = pagedRows.length;\n if (!virtual || count === 0) return { start: 0, end: count };\n const overscan = OVERSCAN_ROWS * rowHeight;\n const viewTop = Math.max(0, scrollTop - headerHeight - overscan);\n const viewBottom = scrollTop + Math.max(viewportHeight, rowHeight) + overscan;\n const { offsets } = heights;\n let lo = 0;\n let hi = count - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (offsets[mid] + heights.rowHeights[mid] + heights.detailHeights[mid] < viewTop) lo = mid + 1;\n else hi = mid;\n }\n const start = lo;\n let end = start;\n while (end < count && offsets[end] < viewBottom) end += 1;\n return { start, end };\n }, [virtual, pagedRows.length, scrollTop, viewportHeight, rowHeight, headerHeight, heights]);\n\n const handleScroll = React.useCallback(() => {\n if (!latest.current.virtual) return;\n if (scrollRaf.current) return;\n scrollRaf.current = window.requestAnimationFrame(() => {\n scrollRaf.current = 0;\n if (scrollerRef.current) setScrollTop(scrollerRef.current.scrollTop);\n });\n }, []);\n\n React.useEffect(\n () => () => {\n if (scrollRaf.current) window.cancelAnimationFrame(scrollRaf.current);\n },\n []\n );\n\n /* ------------------------------------------------------------------ selection */\n\n const isRowSelectableFn = React.useCallback(\n (id: MGHGridRowId, row: R | null | undefined) => {\n if (!row) return false;\n if (!isRowSelectable) return true;\n return isRowSelectable({ id, row, columns: orderedUserColumns, api: latest.current.api });\n },\n [isRowSelectable, orderedUserColumns]\n );\n\n const selectionCandidates = React.useMemo(() => {\n const source: RowEntry<R>[] = checkboxSelectionVisibleOnly\n ? (pagedRows\n .filter((dr) => dr.type === 'leaf' && dr.row)\n .map((dr) => ({ id: dr.id, row: dr.row as R })) as RowEntry<R>[])\n : sortedLeaves;\n return source.filter((entry) => isRowSelectableFn(entry.id, entry.row)).map((entry) => entry.id);\n }, [checkboxSelectionVisibleOnly, pagedRows, sortedLeaves, isRowSelectableFn]);\n\n const selectedCandidateCount = React.useMemo(\n () => selectionCandidates.reduce<number>((acc, id) => acc + (selectedIds.has(id) ? 1 : 0), 0),\n [selectionCandidates, selectedIds]\n );\n const allCandidatesSelected = selectionCandidates.length > 0 && selectedCandidateCount === selectionCandidates.length;\n const someCandidatesSelected = selectedCandidateCount > 0 && !allCandidatesSelected;\n\n const updateSelection = React.useCallback(\n (updater: (prev: Set<MGHGridRowId>) => Set<MGHGridRowId>) => {\n setSelectedIds((prev) => {\n const next = updater(prev);\n return selectionModelsEqual({ type: 'include', ids: prev }, { type: 'include', ids: next }) ? prev : next;\n });\n },\n [setSelectedIds]\n );\n\n const selectRows = React.useCallback(\n (ids: MGHGridRowId[], isSelected = true, resetSelection = false) => {\n updateSelection((prev) => {\n const next = resetSelection ? new Set<MGHGridRowId>() : new Set(prev);\n ids.forEach((id) => {\n if (isSelected) {\n if (isRowSelectableFn(id, rowsById.get(id))) next.add(id);\n } else next.delete(id);\n });\n if (disableMultipleRowSelection && next.size > 1) {\n const lastId = ids[ids.length - 1];\n return new Set<MGHGridRowId>(isSelected && next.has(lastId) ? [lastId] : []);\n }\n return next;\n });\n },\n [updateSelection, isRowSelectableFn, rowsById, disableMultipleRowSelection]\n );\n\n React.useEffect(() => {\n if (keepNonExistentRowsSelected || selectedIds.size === 0) return;\n let changed = false;\n const next = new Set<MGHGridRowId>();\n selectedIds.forEach((id) => {\n if (rowsById.has(id)) next.add(id);\n else changed = true;\n });\n if (changed) setSelectedIds(next);\n }, [rowsById, keepNonExistentRowsSelected, selectedIds, setSelectedIds]);\n\n const toggleAllCandidates = () => {\n if (allCandidatesSelected) selectRows(selectionCandidates, false);\n else selectRows(selectionCandidates, true);\n };\n\n const handleRowSelectionClick = (renderRow: RenderRow<R>, event: React.MouseEvent) => {\n if (renderRow.kind === 'group' && renderRow.group) {\n const leafIds = renderRow.group.descendants.map((d) => d.id);\n const allSelected = leafIds.every((id) => selectedIds.has(id));\n selectRows(leafIds, !allSelected, false);\n return;\n }\n if (renderRow.kind !== 'leaf') return;\n const id = renderRow.id;\n if (!isRowSelectableFn(id, renderRow.row)) return;\n const multiple = !disableMultipleRowSelection;\n if (event.shiftKey && multiple && lastClickedIdRef.current !== null) {\n const ids = pagedRows.filter((dr) => dr.type === 'leaf').map((dr) => dr.id);\n const from = ids.indexOf(lastClickedIdRef.current);\n const to = ids.indexOf(id);\n if (from !== -1 && to !== -1) {\n const [a, b] = from < to ? [from, to] : [to, from];\n selectRows(ids.slice(a, b + 1), true, !checkboxSelection && !event.ctrlKey && !event.metaKey);\n return;\n }\n }\n lastClickedIdRef.current = id;\n const isSelected = selectedIds.has(id);\n const resetSelection = !checkboxSelection && !event.ctrlKey && !event.metaKey;\n if (resetSelection) {\n if (isSelected && selectedIds.size === 1) selectRows([id], false, true);\n else selectRows([id], true, true);\n } else {\n selectRows([id], !isSelected, false);\n }\n };\n\n /* ------------------------------------------------------------------ sorting helpers */\n\n const sortColumn = (field: string, direction?: MGHGridSortDirection, allowMultiple = false) => {\n const col = getColumn(field);\n if (!col || col.sortable === false || disableColumnSorting) return;\n const current = sortModel.find((item) => item.field === field);\n let next: MGHGridSortDirection;\n if (direction === undefined) {\n const order = col.sortingOrder ?? sortingOrder;\n const index = order.indexOf(current?.sort ?? null);\n next = order[(index + 1) % order.length];\n } else {\n next = direction;\n }\n let model: MGHGridSortModel;\n if (allowMultiple && !disableMultipleColumnsSorting) {\n model = sortModel.filter((item) => item.field !== field);\n if (next)\n model = current\n ? sortModel.map((item) => (item.field === field ? { field, sort: next } : item))\n : model.concat([{ field, sort: next }]);\n } else {\n model = next ? [{ field, sort: next }] : [];\n }\n setSortModel(model);\n };\n\n /* ------------------------------------------------------------------ column helpers */\n\n const persistOrder = (fields: string[]) => {\n if (columnOrderStorageKey) writeLocalStorage(columnOrderStorageKey, fields);\n };\n\n const persistWidths = (widths: Record<string, number>) => {\n if (columnWidthStorageKey) writeLocalStorage(columnWidthStorageKey, widths);\n };\n\n const setColumnIndex = (field: string, targetIndex: number, event: React.DragEvent | null = null) => {\n const fields = orderedUserColumns.map((c) => c.field);\n const oldIndex = fields.indexOf(field);\n if (oldIndex === -1) return;\n const next = moveItem(fields, oldIndex, clamp(targetIndex, 0, fields.length - 1));\n setOrderedFields(next);\n persistOrder(next);\n const col = columnsByField.get(field);\n if (col) onColumnOrderChange?.({ column: col, targetIndex, oldIndex }, event, getDetails());\n };\n\n const setColumnWidth = (field: string, width: number) => {\n const col = getColumn(field);\n if (!col) return;\n const clamped = clamp(width, col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH, col.maxWidth ?? Infinity);\n setColumnWidths((prev) => {\n const next = { ...prev, [field]: clamped };\n persistWidths(next);\n return next;\n });\n onColumnWidthChange?.({ colDef: col, width: clamped }, getDetails());\n };\n\n const autosizeColumns = (options: { columns?: string[]; includeHeaders?: boolean; expand?: boolean } = {}) => {\n const includeHeaders = options.includeHeaders ?? true;\n const targets = layout.columns.filter(\n (lc) => !isInternalField(lc.col.field) && (!options.columns || options.columns.indexOf(lc.col.field) !== -1)\n );\n if (targets.length === 0) return;\n const root = rootRef.current;\n const computed = root && typeof window !== 'undefined' ? window.getComputedStyle(root) : null;\n const fontFamily = computed?.fontFamily || 'sans-serif';\n const cellFont = `400 14px ${fontFamily}`;\n const headerFont = `600 14px ${fontFamily}`;\n const sample = sortedLeaves.slice(0, 500);\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const next = { ...columnWidths };\n targets.forEach(({ col }) => {\n let max = includeHeaders ? measureText(col.headerName ?? col.field, headerFont) + 64 : 0;\n sample.forEach((entry) => {\n const value = getCellValue(entry.row, col, apiRefLocal);\n const text = formattedValueToString(getFormattedValue(value, entry.row, col, apiRefLocal, entry.id));\n const w = measureText(text, cellFont) + 24;\n if (w > max) max = w;\n });\n next[col.field] = clamp(Math.ceil(max), col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH, col.maxWidth ?? Infinity);\n });\n setColumnWidths(next);\n persistWidths(next);\n };\n\n const pinColumn = (field: string, side: MGHGridPinnedSide) => {\n if (disableColumnPinning) return;\n const left = (pinnedColumns.left ?? []).filter((f) => f !== field);\n const right = (pinnedColumns.right ?? []).filter((f) => f !== field);\n if (side === 'left') left.push(field);\n else right.unshift(field);\n setPinnedColumns({ left, right });\n };\n\n const unpinColumn = (field: string) => {\n setPinnedColumns({\n left: (pinnedColumns.left ?? []).filter((f) => f !== field),\n right: (pinnedColumns.right ?? []).filter((f) => f !== field),\n });\n };\n\n const isColumnPinned = (field: string): MGHGridPinnedSide | false => {\n if (disableColumnPinning) return false;\n if ((pinnedColumns.left ?? []).indexOf(field) !== -1) return 'left';\n if ((pinnedColumns.right ?? []).indexOf(field) !== -1) return 'right';\n return false;\n };\n\n /* ------------------------------------------------------------------ filter helpers */\n\n const upsertFilterItems = (items: MGHGridFilterItem[]) => {\n let nextItems = filterModel.items.slice();\n items.forEach((item) => {\n const withId =\n item.id === undefined ? { ...item, id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}` } : item;\n const index = nextItems.findIndex((existing) => existing.id !== undefined && existing.id === withId.id);\n if (index === -1) nextItems.push(withId);\n else nextItems[index] = withId;\n });\n if (disableMultipleColumnsFiltering && nextItems.length > 1) nextItems = nextItems.slice(-1);\n setFilterModel({ ...filterModel, items: nextItems });\n };\n\n const deleteFilterItem = (item: MGHGridFilterItem) => {\n setFilterModel({\n ...filterModel,\n items: filterModel.items.filter((existing) =>\n item.id !== undefined ? existing.id !== item.id : existing !== item\n ),\n });\n };\n\n const showPreferences = (panel: 'columns' | 'filters', anchorEl?: HTMLElement | null, targetField?: string) => {\n setColumnMenu(null);\n setPreferencePanel({\n open: true,\n openedPanelValue: panel,\n targetField,\n anchorEl: anchorEl ?? toolbarRef.current ?? rootRef.current,\n });\n };\n\n const hidePreferences = React.useCallback(() => {\n setPreferencePanel((prev) => (prev.open ? { open: false, anchorEl: null } : prev));\n }, []);\n\n /* ------------------------------------------------------------------ editing */\n\n const isCellEditableFn = (params: MGHGridCellParams<R>) => {\n if (!params.colDef.editable) return false;\n if (params.rowNode.type !== 'leaf') return false;\n return isCellEditable ? isCellEditable(params) : true;\n };\n\n const startCellEditMode = (id: MGHGridRowId, field: string) => {\n const row = rowsById.get(id);\n const col = getColumn(field);\n if (!row || !col) return;\n const params = buildCellParams(id, field, row, nodesById.get(id) ?? { type: 'leaf', id, depth: 0, parent: null });\n if (!isCellEditableFn(params)) return;\n setEditingCell({ id, field });\n setEditValue(params.value);\n setFocusedCell({ id, field });\n };\n\n const applyRowUpdate = (id: MGHGridRowId, newRow: R, oldRow: R) => {\n if (processRowUpdate) {\n Promise.resolve()\n .then(() => processRowUpdate(newRow, oldRow, { rowId: id }))\n .then((result) => setRowOverride(id, (result ?? newRow) as R))\n .catch((error) => {\n if (onProcessRowUpdateError) onProcessRowUpdateError(error);\n else console.error('MGHGrid: processRowUpdate failed', error);\n });\n } else {\n setRowOverride(id, newRow);\n }\n };\n\n const stopCellEditMode = (\n id: MGHGridRowId,\n field: string,\n ignoreModifications = false,\n reason: 'enterKeyDown' | 'escapeKeyDown' | 'cellFocusOut' | 'tabKeyDown' | 'api' = 'api'\n ) => {\n if (!editingCell || editingCell.id !== id || editingCell.field !== field) return;\n const row = rowsById.get(id);\n const col = getColumn(field);\n setEditingCell(null);\n if (!row || !col) return;\n if (!ignoreModifications) {\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const parsed = col.valueParser\n ? col.valueParser(editValue, row, col, apiRefLocal)\n : parseEditValue(editValue, col);\n const currentValue = getCellValue(row, col, apiRefLocal);\n if (!Object.is(parsed, currentValue)) {\n const newRow = col.valueSetter\n ? col.valueSetter(parsed, row, col, apiRefLocal)\n : ({ ...row, [field]: parsed } as R);\n applyRowUpdate(id, newRow, row);\n }\n }\n onCellEditStop?.({ id, field, row, reason }, getDetails());\n pendingFocusRef.current = true;\n setFocusedCell({ id, field });\n };\n\n /* ------------------------------------------------------------------ detail panel & grouping helpers */\n\n const toggleDetailPanel = (id: MGHGridRowId) => {\n setExpandedDetailPanels((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const setRowChildrenExpansion = (id: MGHGridRowId, isExpanded: boolean) => {\n setGroupExpansion((prev) => {\n const next = new Map(prev);\n next.set(id, isExpanded);\n return next;\n });\n };\n\n const groupingKey = groupingFields.join('|');\n const previousGroupingKey = React.useRef(groupingKey);\n React.useEffect(() => {\n if (previousGroupingKey.current === groupingKey) return;\n previousGroupingKey.current = groupingKey;\n setGroupExpansion(new Map());\n }, [groupingKey]);\n\n /* ------------------------------------------------------------------ cell params */\n\n const buildCellParams = (id: MGHGridRowId, field: string, row: R, node: MGHGridRowNode): MGHGridCellParams<R> => {\n const col = getColumn(field) as MGHGridColDef<R>;\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const value = getCellValue(row, col, apiRefLocal);\n const formattedValue = getFormattedValue(value, row, col, apiRefLocal, id);\n const hasFocus = Boolean(focusedCell && focusedCell.id === id && focusedCell.field === field);\n const cellMode = editingCell && editingCell.id === id && editingCell.field === field ? 'edit' : 'view';\n return {\n id,\n field,\n value,\n formattedValue,\n row,\n rowNode: node,\n colDef: col,\n api: apiRefLocal,\n hasFocus,\n tabIndex: hasFocus ? 0 : -1,\n cellMode,\n isEditable: Boolean(col.editable) && node.type === 'leaf',\n };\n };\n\n const buildRowParams = (id: MGHGridRowId, row: R): MGHGridRowParams<R> => ({\n id,\n row,\n columns: orderedUserColumns,\n api: latest.current.api,\n });\n\n /* ------------------------------------------------------------------ keyboard navigation */\n\n React.useEffect(() => {\n if (!pendingFocusRef.current || !focusedCell || !rootRef.current) return;\n pendingFocusRef.current = false;\n const selector = `[data-mgh-row-id=\"${String(focusedCell.id).replace(/\"/g, '\\\\\"')}\"] [data-mgh-field=\"${focusedCell.field.replace(/\"/g, '\\\\\"')}\"]`;\n const el = rootRef.current.querySelector<HTMLElement>(selector);\n if (el && document.activeElement !== el && !el.contains(document.activeElement)) el.focus({ preventScroll: true });\n }, [focusedCell, virtualRange.start, virtualRange.end]);\n\n const scrollToIndexes = (params: { rowIndex?: number; colIndex?: number }) => {\n const scroller = scrollerRef.current;\n if (!scroller) return false;\n if (params.rowIndex !== undefined && virtual) {\n const index = clamp(params.rowIndex, 0, Math.max(pagedRows.length - 1, 0));\n const top = heights.offsets[index] ?? 0;\n const bottom = top + (heights.rowHeights[index] ?? rowHeight);\n const visibleTop = scroller.scrollTop;\n const visibleBottom = scroller.scrollTop + scroller.clientHeight - headerHeight;\n if (top < visibleTop) scroller.scrollTop = top;\n else if (bottom > visibleBottom) scroller.scrollTop = bottom - (scroller.clientHeight - headerHeight);\n } else if (params.rowIndex !== undefined) {\n const el = scroller.querySelector(`[data-mgh-row-index=\"${params.rowIndex}\"]`) as HTMLElement | null | undefined;\n el?.scrollIntoView?.({ block: 'nearest' });\n }\n if (params.colIndex !== undefined) {\n const lc = layout.columns[clamp(params.colIndex, 0, layout.columns.length - 1)];\n if (lc && !lc.pinned) {\n const leftPinnedWidth = layout.columns\n .filter((c) => c.pinned === 'left')\n .reduce((acc, c) => acc + c.width, 0);\n const rightPinnedWidth = layout.columns\n .filter((c) => c.pinned === 'right')\n .reduce((acc, c) => acc + c.width, 0);\n const visibleLeft = scroller.scrollLeft + leftPinnedWidth;\n const visibleRight = scroller.scrollLeft + scroller.clientWidth - rightPinnedWidth;\n if (lc.x < visibleLeft) scroller.scrollLeft = lc.x - leftPinnedWidth;\n else if (lc.x + lc.width > visibleRight)\n scroller.scrollLeft = lc.x + lc.width - scroller.clientWidth + rightPinnedWidth;\n }\n }\n return true;\n };\n\n const moveFocus = (\n rowDelta: number,\n colDelta: number,\n absolute?: { row?: 'first' | 'last'; col?: 'first' | 'last' }\n ) => {\n if (pagedRows.length === 0 || layout.columns.length === 0) return;\n let rowIndex = focusedCell ? pagedRows.findIndex((dr) => dr.id === focusedCell.id) : -1;\n let colIndex = focusedCell ? layout.columns.findIndex((lc) => lc.col.field === focusedCell.field) : -1;\n if (rowIndex === -1) rowIndex = 0;\n if (colIndex === -1) colIndex = 0;\n if (absolute?.row === 'first') rowIndex = 0;\n else if (absolute?.row === 'last') rowIndex = pagedRows.length - 1;\n else rowIndex = clamp(rowIndex + rowDelta, 0, pagedRows.length - 1);\n if (absolute?.col === 'first') colIndex = 0;\n else if (absolute?.col === 'last') colIndex = layout.columns.length - 1;\n else colIndex = clamp(colIndex + colDelta, 0, layout.columns.length - 1);\n const target = { id: pagedRows[rowIndex].id, field: layout.columns[colIndex].col.field };\n pendingFocusRef.current = true;\n setFocusedCell(target);\n scrollToIndexes({ rowIndex, colIndex });\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (editingCell) return;\n const target = event.target as HTMLElement;\n if (\n target &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'SELECT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'BUTTON')\n ) {\n return;\n }\n const pageRows = Math.max(1, Math.floor(Math.max(viewportHeight - headerHeight, rowHeight) / rowHeight));\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n moveFocus(1, 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocus(-1, 0);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n moveFocus(0, -1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n moveFocus(0, 1);\n break;\n case 'PageDown':\n event.preventDefault();\n moveFocus(pageRows, 0);\n break;\n case 'PageUp':\n event.preventDefault();\n moveFocus(-pageRows, 0);\n break;\n case 'Home':\n event.preventDefault();\n moveFocus(0, 0, event.ctrlKey || event.metaKey ? { row: 'first', col: 'first' } : { col: 'first' });\n break;\n case 'End':\n event.preventDefault();\n moveFocus(0, 0, event.ctrlKey || event.metaKey ? { row: 'last', col: 'last' } : { col: 'last' });\n break;\n case 'Enter':\n case 'F2':\n if (focusedCell) {\n const node = nodesById.get(focusedCell.id);\n if (node?.type === 'group' && focusedCell.field === GROUPING_COLUMN_FIELD) {\n const group = groupsById.get(focusedCell.id);\n if (group) setRowChildrenExpansion(group.id, !isGroupExpanded(group));\n } else {\n event.preventDefault();\n startCellEditMode(focusedCell.id, focusedCell.field);\n }\n }\n break;\n case ' ':\n if (focusedCell && (checkboxSelection || !disableRowSelectionOnClick)) {\n const dr = pagedRows.find((r) => r.id === focusedCell.id);\n if (dr && dr.type === 'leaf' && dr.row) {\n event.preventDefault();\n selectRows([dr.id], !selectedIds.has(dr.id), false);\n }\n }\n break;\n case 'Escape':\n if (preferencePanel.open) hidePreferences();\n if (columnMenu) setColumnMenu(null);\n break;\n default:\n if (\n (event.ctrlKey || event.metaKey) &&\n event.key.toLowerCase() === 'a' &&\n checkboxSelection &&\n !disableMultipleRowSelection\n ) {\n event.preventDefault();\n selectRows(selectionCandidates, true);\n }\n }\n };\n\n /* ------------------------------------------------------------------ drag & drop (reorder) */\n\n const canReorder = (col: MGHGridColDef) => !disableColumnReorder && !col.disableReorder && !isInternalField(col.field);\n\n const handleDrop = (targetLc: ColumnLayout, event: React.DragEvent) => {\n event.preventDefault();\n const current = drag;\n setDrag(null);\n if (!current || current.field === targetLc.col.field) return;\n const sourceLc = layout.columns.find((lc) => lc.col.field === current.field);\n if (!sourceLc || sourceLc.pinned !== targetLc.pinned || !canReorder(targetLc.col)) return;\n const side = current.side;\n if (sourceLc.pinned) {\n const key = sourceLc.pinned;\n const list = (pinnedColumns[key] ?? []).slice();\n const from = list.indexOf(current.field);\n let to = list.indexOf(targetLc.col.field);\n if (from === -1 || to === -1) return;\n list.splice(from, 1);\n to = list.indexOf(targetLc.col.field);\n list.splice(side === 'right' ? to + 1 : to, 0, current.field);\n setPinnedColumns({ ...pinnedColumns, [key]: list });\n return;\n }\n const fields = orderedUserColumns.map((c) => c.field);\n const from = fields.indexOf(current.field);\n const without = fields.filter((f) => f !== current.field);\n let to = without.indexOf(targetLc.col.field);\n if (side === 'right') to += 1;\n without.splice(to, 0, current.field);\n setOrderedFields(without);\n persistOrder(without);\n const col = columnsByField.get(current.field);\n if (col) onColumnOrderChange?.({ column: col, targetIndex: to, oldIndex: from }, event, getDetails());\n };\n\n /* ------------------------------------------------------------------ resize */\n\n const resizeRef = React.useRef<{\n field: string;\n startX: number;\n startWidth: number;\n lastWidth: number;\n min: number;\n max: number;\n } | null>(null);\n\n const handleResizeStart = (lc: ColumnLayout, event: React.PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n resizeRef.current = {\n field: lc.col.field,\n startX: event.clientX,\n startWidth: lc.width,\n lastWidth: lc.width,\n min: lc.col.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH,\n max: lc.col.maxWidth ?? Infinity,\n };\n setResizingField(lc.col.field);\n const onMove = (e: PointerEvent) => {\n const r = resizeRef.current;\n if (!r) return;\n const width = clamp(r.startWidth + (e.clientX - r.startX), r.min, r.max);\n r.lastWidth = width;\n setColumnWidths((prev) => (prev[r.field] === width ? prev : { ...prev, [r.field]: width }));\n };\n const onUp = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n const r = resizeRef.current;\n resizeRef.current = null;\n setResizingField(null);\n if (!r) return;\n const next = { ...(latest.current.columnWidths as Record<string, number>), [r.field]: r.lastWidth };\n setColumnWidths(next);\n persistWidths(next);\n const col = latest.current.getColumn(r.field);\n if (col && r.lastWidth !== r.startWidth)\n onColumnWidthChange?.({ colDef: col, width: r.lastWidth }, getDetails());\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n };\n\n /* ------------------------------------------------------------------ state snapshot & API */\n\n const filterCount = activeFilters.length;\n const rowCount = groupingActive ? totalDisplayRows : filteredEntries.length;\n\n const state = React.useMemo<MGHGridState>(\n () => ({\n sortModel,\n filterModel,\n paginationModel: { page, pageSize: paginationModel.pageSize },\n pageCount,\n rowCount,\n totalRowCount: rowEntries.length,\n columnVisibilityModel,\n orderedFields: orderedUserColumns.map((c) => c.field),\n columnWidths,\n pinnedColumns,\n density,\n densityFactor,\n rowSelectionModel: { type: 'include', ids: selectedIds },\n rowGroupingModel,\n aggregationModel,\n expandedDetailPanels,\n preferencePanel: {\n open: preferencePanel.open,\n openedPanelValue: preferencePanel.openedPanelValue,\n targetField: preferencePanel.targetField,\n },\n filterCount,\n quickFilterValues,\n }),\n [\n sortModel,\n filterModel,\n page,\n paginationModel.pageSize,\n pageCount,\n rowCount,\n rowEntries.length,\n columnVisibilityModel,\n orderedUserColumns,\n columnWidths,\n pinnedColumns,\n density,\n densityFactor,\n selectedIds,\n rowGroupingModel,\n aggregationModel,\n expandedDetailPanels,\n preferencePanel.open,\n preferencePanel.openedPanelValue,\n preferencePanel.targetField,\n filterCount,\n quickFilterValues,\n ]\n );\n\n latest.current = {\n api: apiObject,\n state,\n rowsById,\n rowEntries,\n nodesById,\n groupsById,\n sortedLeaves,\n pagedRows,\n getRowId,\n setRowOverride,\n orderedUserColumns,\n visibleUserColumns,\n getColumn,\n columnVisibilityModel,\n setColumnVisibilityModel,\n setColumnWidth,\n setColumnIndex,\n columnWidths,\n autosizeColumns,\n pinColumn,\n unpinColumn,\n isColumnPinned,\n pinnedColumns,\n setPinnedColumns,\n sortModel,\n setSortModel,\n sortColumn,\n filterModel,\n setFilterModel,\n upsertFilterItems,\n deleteFilterItem,\n showPreferences,\n hidePreferences,\n selectedIds,\n setSelectedIds,\n selectRows,\n isRowSelectableFn,\n paginationModel: { page, pageSize: paginationModel.pageSize },\n setPaginationModel,\n setDensity,\n toggleDetailPanel,\n expandedDetailPanels,\n setExpandedDetailPanels,\n rowGroupingModel,\n setRowGroupingModel,\n setRowChildrenExpansion,\n aggregationModel,\n setAggregationModel,\n startCellEditMode,\n stopCellEditMode,\n editingCell,\n setEditValue,\n buildCellParams,\n setFocusedCell,\n scrollToIndexes,\n forceUpdate,\n virtual,\n startPrint,\n };\n\n if (apiRef) apiRef.current = apiObject;\n\n React.useEffect(() => {\n onStateChange?.(state, { api: apiObject });\n }, [state, onStateChange, apiObject]);\n\n /* ------------------------------------------------------------------ context */\n\n const rootProps = React.useMemo<MGHGridRootProps>(\n () => ({\n header,\n pagination,\n pageSizeOptions,\n hideFooterPagination,\n hideFooterRowCount,\n hideFooterSelectedRowCount,\n disableColumnFilter,\n disableColumnSelector,\n disableDensitySelector,\n disableColumnPinning,\n disableColumnSorting,\n disableMultipleColumnsSorting,\n disableMultipleColumnsFiltering,\n disableRowGrouping,\n disableAggregation,\n checkboxSelection,\n aggregationFunctions,\n quickFilterDebounceMs,\n }),\n [\n header,\n pagination,\n pageSizeOptions,\n hideFooterPagination,\n hideFooterRowCount,\n hideFooterSelectedRowCount,\n disableColumnFilter,\n disableColumnSelector,\n disableDensitySelector,\n disableColumnPinning,\n disableColumnSorting,\n disableMultipleColumnsSorting,\n disableMultipleColumnsFiltering,\n disableRowGrouping,\n disableAggregation,\n checkboxSelection,\n aggregationFunctions,\n quickFilterDebounceMs,\n ]\n );\n\n const contextValue = React.useMemo<MGHGridContextValue>(\n () => ({\n api: apiObject,\n state,\n localeText,\n themeMode,\n rootProps,\n columns: orderedUserColumns,\n visibleColumns: visibleUserColumns,\n }),\n [apiObject, state, localeText, themeMode, rootProps, orderedUserColumns, visibleUserColumns]\n );\n\n /* ------------------------------------------------------------------ rendering: cells */\n\n const renderEditor = (params: MGHGridCellParams<R>) => {\n const col = params.colDef;\n const commit = (reason: 'enterKeyDown' | 'cellFocusOut' | 'tabKeyDown') =>\n stopCellEditMode(params.id, params.field, false, reason);\n const cancel = () => stopCellEditMode(params.id, params.field, true, 'escapeKeyDown');\n const keyHandler = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n commit('enterKeyDown');\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n cancel();\n } else if (event.key === 'Tab') {\n commit('tabKeyDown');\n } else {\n event.stopPropagation();\n }\n };\n if (col.renderEditCell) {\n return col.renderEditCell({\n ...params,\n editValue,\n onValueChange: setEditValue,\n commit: () => commit('enterKeyDown'),\n cancel,\n });\n }\n const common = {\n autoFocus: true,\n onKeyDown: keyHandler,\n onBlur: () => commit('cellFocusOut'),\n onClick: (event: React.MouseEvent) => event.stopPropagation(),\n };\n switch (col.type) {\n case 'boolean':\n return (\n <Checkbox\n {...common}\n checked={Boolean(editValue)}\n onChange={(event) => setEditValue(event.target.checked)}\n />\n );\n case 'singleSelect': {\n const options = resolveValueOptions(col, params.row, params.id);\n return (\n <Select\n {...common}\n size=\"small\"\n value={editValue === undefined || editValue === null ? '' : String(editValue)}\n onChange={(event) => {\n const match = options.find((o) => String(getOptionValue(col, o)) === event.target.value);\n setEditValue(match !== undefined ? getOptionValue(col, match) : event.target.value);\n }}\n >\n <option value=\"\" />\n {options.map((option) => {\n const value = getOptionValue(col, option);\n return (\n <option key={String(value)} value={String(value)}>\n {getOptionLabel(col, option)}\n </option>\n );\n })}\n </Select>\n );\n }\n case 'number':\n return (\n <TextInput\n {...common}\n size=\"small\"\n type=\"number\"\n value={editValue === undefined || editValue === null ? '' : editValue}\n onChange={(event) => setEditValue(event.target.value)}\n />\n );\n case 'date':\n case 'dateTime':\n return (\n <TextInput\n {...common}\n size=\"small\"\n type={col.type === 'date' ? 'date' : 'datetime-local'}\n value={\n typeof editValue === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(editValue)\n ? editValue\n : toDateInputValue(editValue, col.type === 'dateTime')\n }\n onChange={(event) => setEditValue(event.target.value)}\n />\n );\n default:\n return (\n <TextInput\n {...common}\n size=\"small\"\n type=\"text\"\n value={editValue === undefined || editValue === null ? '' : String(editValue)}\n onChange={(event) => setEditValue(event.target.value)}\n />\n );\n }\n };\n\n const renderCellContent = (lc: ColumnLayout, renderRow: RenderRow<R>): React.ReactNode => {\n const { col } = lc;\n const field = col.field;\n\n if (field === CHECKBOX_FIELD) {\n if (renderRow.kind === 'group' && renderRow.group) {\n const leafIds = renderRow.group.descendants.map((d) => d.id);\n const selectedCount = leafIds.reduce<number>((acc, id) => acc + (selectedIds.has(id) ? 1 : 0), 0);\n return (\n <Checkbox\n checked={leafIds.length > 0 && selectedCount === leafIds.length}\n indeterminate={selectedCount > 0 && selectedCount < leafIds.length}\n label={localeText.checkboxSelectionSelectRow}\n onClick={(event) => event.stopPropagation()}\n onChange={() => selectRows(leafIds, selectedCount !== leafIds.length, false)}\n />\n );\n }\n if (renderRow.kind !== 'leaf') return null;\n const selectable = isRowSelectableFn(renderRow.id, renderRow.row);\n const checked = selectedIds.has(renderRow.id);\n return (\n <Checkbox\n checked={checked}\n disabled={!selectable}\n label={checked ? localeText.checkboxSelectionUnselectRow : localeText.checkboxSelectionSelectRow}\n tabIndex={-1}\n onClick={(event) => event.stopPropagation()}\n onChange={() => {\n lastClickedIdRef.current = renderRow.id;\n selectRows([renderRow.id], !checked, disableMultipleRowSelection);\n }}\n />\n );\n }\n\n if (field === DETAIL_PANEL_TOGGLE_FIELD) {\n if (renderRow.kind !== 'leaf' || !renderRow.row) return null;\n const expanded = expandedDetailPanels.has(renderRow.id);\n const content = getDetailPanelContent?.(buildRowParams(renderRow.id, renderRow.row));\n if (content === null || content === undefined || content === false) return null;\n return (\n <IconButton\n size=\"small\"\n className={cx('mgh-grid-detail-toggle', expanded && 'mgh-grid-detail-toggle--expanded')}\n label={expanded ? localeText.collapseDetailPanel : localeText.expandDetailPanel}\n aria-expanded={expanded}\n tabIndex={-1}\n onClick={(event) => {\n event.stopPropagation();\n toggleDetailPanel(renderRow.id);\n }}\n >\n <ExpandMoreIcon />\n </IconButton>\n );\n }\n\n if (field === GROUPING_COLUMN_FIELD) {\n if (renderRow.kind === 'group' && renderRow.group) {\n const group = renderRow.group;\n const expanded = isGroupExpanded(group);\n const hideCount = (groupingColDef as any)?.hideDescendantCount;\n return (\n <div className=\"mgh-grid-group-cell\" style={{ paddingLeft: renderRow.depth * 20 }}>\n <IconButton\n size=\"small\"\n className={cx('mgh-grid-group-toggle', expanded && 'mgh-grid-group-toggle--expanded')}\n label={expanded ? localeText.collapseDetailPanel : localeText.expandDetailPanel}\n aria-expanded={expanded}\n tabIndex={-1}\n onClick={(event) => {\n event.stopPropagation();\n setRowChildrenExpansion(group.id, !expanded);\n }}\n >\n <ChevronRightIcon />\n </IconButton>\n <span className=\"mgh-grid-group-label\" title={group.groupingLabel}>\n {group.groupingLabel}\n </span>\n {!hideCount && <span className=\"mgh-grid-group-count\">({group.descendants.length})</span>}\n </div>\n );\n }\n return null;\n }\n\n if (renderRow.kind === 'group' || renderRow.kind === 'footer') {\n const agg = renderRow.aggregates?.[field];\n if (!agg || isNil(agg.value)) return null;\n const fn = aggregationFunctions[agg.fn];\n const apiRefLocal = latest.current.api as MGHGridApi<R>;\n const sampleRow = (renderRow.group?.descendants[0]?.row ?? latest.current.sortedLeaves[0]?.row ?? {}) as R;\n const formatted = fn?.valueFormatter\n ? fn.valueFormatter(agg.value)\n : col.valueFormatter\n ? col.valueFormatter(agg.value, sampleRow, col as MGHGridColDef<R>, apiRefLocal)\n : defaultFormatValue(agg.value, col);\n return (\n <>\n <span className=\"mgh-grid-aggregation-label\">{fn?.label ?? agg.fn}</span>\n <span className=\"mgh-grid-cell-text\">{formattedValueToString(formatted)}</span>\n </>\n );\n }\n\n if (!renderRow.row) return null;\n const params = buildCellParams(renderRow.id, field, renderRow.row, renderRow.node);\n\n if (params.cellMode === 'edit') return renderEditor(params);\n\n if (col.renderCell) return col.renderCell(params);\n\n if (col.type === 'actions') {\n const actions = col.getActions ? col.getActions(buildRowParams(renderRow.id, renderRow.row)) : [];\n return <ActionsCell actions={actions} themeMode={themeMode} moreLabel={localeText.actionsCellMore} />;\n }\n\n if (col.type === 'boolean') {\n if (isNil(params.value)) return null;\n return params.value ? (\n <CheckIcon aria-label={localeText.booleanCellTrueLabel} />\n ) : (\n <CloseIcon aria-label={localeText.booleanCellFalseLabel} />\n );\n }\n\n const formatted = params.formattedValue;\n if (formatted === null || formatted === undefined) return null;\n if (React.isValidElement(formatted)) return formatted;\n const text = formattedValueToString(formatted);\n return (\n <span className=\"mgh-grid-cell-text\" title={text.length > 20 ? text : undefined}>\n {text}\n </span>\n );\n };\n\n const cellStyle = (lc: ColumnLayout): React.CSSProperties => ({\n width: lc.width,\n minWidth: lc.width,\n maxWidth: lc.width,\n left: lc.pinned === 'left' ? lc.offset : undefined,\n right: lc.pinned === 'right' ? lc.offset : undefined,\n });\n\n const pinnedClasses = (lc: ColumnLayout, prefix: string) =>\n cx(\n lc.pinned === 'left' && `${prefix}--pinned-left`,\n lc.pinned === 'right' && `${prefix}--pinned-right`,\n lc.isLastLeft && layout.hasPinning && `${prefix}--pinned-left-last`,\n lc.isFirstRight && `${prefix}--pinned-right-first`\n );\n\n const renderCell = (lc: ColumnLayout, renderRow: RenderRow<R>, isAutoRow: boolean) => {\n const { col } = lc;\n const field = col.field;\n const isFocused = Boolean(focusedCell && focusedCell.id === renderRow.id && focusedCell.field === field);\n const isEditing = Boolean(editingCell && editingCell.id === renderRow.id && editingCell.field === field);\n const isAggregation =\n (renderRow.kind === 'group' || renderRow.kind === 'footer') && Boolean(renderRow.aggregates?.[field]);\n const params =\n renderRow.kind === 'leaf' && renderRow.row\n ? buildCellParams(renderRow.id, field, renderRow.row, renderRow.node)\n : null;\n const editable = params ? isCellEditableFn(params) : false;\n const customClass =\n params && col.cellClassName\n ? typeof col.cellClassName === 'function'\n ? col.cellClassName(params)\n : col.cellClassName\n : undefined;\n const isCheckbox = field === CHECKBOX_FIELD;\n const isDetailToggle = field === DETAIL_PANEL_TOGGLE_FIELD;\n return (\n <div\n key={field}\n role=\"gridcell\"\n data-mgh-field={field}\n data-mgh-colindex={layout.columns.indexOf(lc)}\n tabIndex={isFocused ? 0 : -1}\n aria-selected={renderRow.kind === 'leaf' ? selectedIds.has(renderRow.id) : undefined}\n className={cx(\n 'mgh-grid-cell',\n `mgh-grid-cell--align-${col.align ?? 'left'}`,\n pinnedClasses(lc, 'mgh-grid-cell'),\n isFocused && !isEditing && 'mgh-grid-cell--focused',\n isEditing && 'mgh-grid-cell--editing',\n editable && !isEditing && 'mgh-grid-cell--editable',\n col.type === 'boolean' && 'mgh-grid-cell--boolean',\n col.type === 'actions' && 'mgh-grid-cell--actions',\n isCheckbox && 'mgh-grid-cell--checkbox',\n isDetailToggle && 'mgh-grid-cell--detail-toggle',\n isAggregation && 'mgh-grid-cell--aggregation',\n customClass\n )}\n style={cellStyle(lc)}\n onMouseDown={() => {\n if (renderRow.kind === 'leaf' || renderRow.kind === 'group') {\n if (!isFocused) setFocusedCell({ id: renderRow.id, field });\n }\n }}\n onClick={(event) => {\n if (params && onCellClick) onCellClick(params, event, getDetails());\n }}\n onDoubleClick={(event) => {\n if (params) {\n onCellDoubleClick?.(params, event, getDetails());\n if (editable && !isEditing) {\n event.stopPropagation();\n startCellEditMode(renderRow.id, field);\n }\n }\n }}\n >\n {renderCellContent(lc, renderRow)}\n </div>\n );\n };\n\n /* ------------------------------------------------------------------ rendering: rows */\n\n const rowIsClickable = Boolean(onRowClick || onRowDoubleClick || !disableRowSelectionOnClick);\n\n const renderRowElement = (\n renderRow: RenderRow<R>,\n options: { height?: number; index: number; isFirst: boolean; isLast: boolean; isAuto: boolean }\n ) => {\n const isSelected = renderRow.kind === 'leaf' ? selectedIds.has(renderRow.id) : false;\n const customClass =\n renderRow.kind === 'leaf' && renderRow.row && getRowClassName\n ? getRowClassName({\n ...buildRowParams(renderRow.id, renderRow.row),\n indexRelativeToCurrentPage: options.index,\n isFirstVisible: options.isFirst,\n isLastVisible: options.isLast,\n rowNode: renderRow.node,\n })\n : undefined;\n return (\n <div\n role=\"row\"\n aria-rowindex={options.index + 2}\n aria-selected={renderRow.kind === 'leaf' ? isSelected : undefined}\n data-mgh-row-id={String(renderRow.id)}\n data-mgh-row-index={options.index}\n className={cx(\n 'mgh-grid-row',\n isSelected && 'mgh-grid-row--selected',\n rowIsClickable && renderRow.kind === 'leaf' && 'mgh-grid-row--clickable',\n renderRow.kind === 'group' && 'mgh-grid-row--group',\n renderRow.kind === 'pinnedRow' && 'mgh-grid-row--pinned',\n renderRow.kind === 'footer' && 'mgh-grid-row--footer',\n options.isAuto && 'mgh-grid-row--auto-height',\n customClass\n )}\n style={{\n width: layout.totalWidth,\n height: options.isAuto ? undefined : options.height,\n minHeight: options.isAuto ? rowHeight : undefined,\n }}\n onClick={(event) => {\n if (renderRow.kind === 'leaf' && renderRow.row) {\n if (!disableRowSelectionOnClick) handleRowSelectionClick(renderRow, event);\n onRowClick?.(buildRowParams(renderRow.id, renderRow.row), event, getDetails());\n } else if (renderRow.kind === 'group' && renderRow.group) {\n setRowChildrenExpansion(renderRow.group.id, !isGroupExpanded(renderRow.group));\n }\n }}\n onDoubleClick={(event) => {\n if (renderRow.kind === 'leaf' && renderRow.row) {\n onRowDoubleClick?.(buildRowParams(renderRow.id, renderRow.row), event, getDetails());\n }\n }}\n >\n {layout.columns.map((lc) => renderCell(lc, renderRow, options.isAuto))}\n <div className=\"mgh-grid-row-filler\" />\n </div>\n );\n };\n\n const toRenderRow = (dr: DisplayRow<R>): RenderRow<R> => ({\n id: dr.id,\n kind: dr.type,\n row: dr.row,\n node: dr.node,\n depth: dr.depth,\n group: dr.group,\n aggregates: dr.type === 'group' && dr.group ? getGroupAggregates(dr.group) : undefined,\n });\n\n const renderBodyRows = () => {\n const { start, end } = virtualRange;\n const items: React.ReactNode[] = [];\n for (let i = start; i < end; i += 1) {\n const dr = pagedRows[i];\n const renderRow = toRenderRow(dr);\n const detailHeight = heights.detailHeights[i];\n const isExpanded =\n dr.type === 'leaf' && Boolean(dr.row) && Boolean(getDetailPanelContent) && expandedDetailPanels.has(dr.id);\n const detailContent = isExpanded && dr.row ? getDetailPanelContent?.(buildRowParams(dr.id, dr.row)) : null;\n const detailAuto =\n isExpanded && dr.row && getDetailPanelHeight\n ? getDetailPanelHeight({ id: dr.id, row: dr.row }) === 'auto'\n : false;\n const rowAuto =\n !virtual &&\n (getRowHeight && dr.type === 'leaf' && dr.row\n ? getRowHeight({ id: dr.id, model: dr.row, densityFactor }) === 'auto'\n : false);\n items.push(\n <div\n key={String(dr.id)}\n className=\"mgh-grid-row-block\"\n style={virtual ? { top: heights.offsets[i], width: layout.totalWidth } : { width: layout.totalWidth }}\n >\n {renderRowElement(renderRow, {\n height: heights.rowHeights[i],\n index: i,\n isFirst: i === 0,\n isLast: i === pagedRows.length - 1,\n isAuto: rowAuto,\n })}\n {isExpanded && detailContent !== null && detailContent !== undefined && detailContent !== false && (\n <div\n className=\"mgh-grid-detail-panel\"\n style={{\n height: detailAuto ? undefined : detailHeight || undefined,\n width: viewportWidth || undefined,\n }}\n onClick={(event) => event.stopPropagation()}\n >\n {detailContent}\n </div>\n )}\n </div>\n );\n }\n return items;\n };\n\n const renderPinnedRows = (list: R[] | undefined, position: 'top' | 'bottom') => {\n const items: React.ReactNode[] = [];\n (list ?? []).forEach((row, index) => {\n const id = getRowIdFromRow(row, getRowId);\n const renderRow: RenderRow<R> = {\n id,\n kind: 'pinnedRow',\n row,\n node: { type: 'pinnedRow', id, depth: 0, parent: null, position },\n depth: 0,\n };\n items.push(\n <React.Fragment key={String(id)}>\n {renderRowElement(renderRow, {\n height: rowHeight,\n index: index,\n isFirst: false,\n isLast: false,\n isAuto: false,\n })}\n </React.Fragment>\n );\n });\n if (position === 'bottom' && footerAggregates) {\n const renderRow: RenderRow<R> = {\n id: AGGREGATION_FOOTER_ID,\n kind: 'footer',\n row: null,\n node: { type: 'footer', id: AGGREGATION_FOOTER_ID, depth: 0, parent: null },\n depth: 0,\n aggregates: footerAggregates,\n };\n items.push(\n <React.Fragment key={AGGREGATION_FOOTER_ID}>\n {renderRowElement(renderRow, {\n height: rowHeight,\n index: 0,\n isFirst: false,\n isLast: false,\n isAuto: false,\n })}\n </React.Fragment>\n );\n }\n return items;\n };\n\n /* ------------------------------------------------------------------ rendering: header */\n\n const renderHeaderCell = (lc: ColumnLayout, index: number) => {\n const { col } = lc;\n const field = col.field;\n const sortIndex = sortModel.findIndex((item) => item.field === field && item.sort);\n const sortItem = sortIndex !== -1 ? sortModel[sortIndex] : undefined;\n const sortable =\n (col.sortable !== false && !disableColumnSorting && !isInternalField(field)) ||\n (field === GROUPING_COLUMN_FIELD && col.sortable !== false);\n const showMenu =\n (!disableColumnMenu && !col.disableColumnMenu && !isInternalField(field)) ||\n (field === GROUPING_COLUMN_FIELD && !disableColumnMenu);\n const resizable =\n (!disableColumnResize && col.resizable !== false && !isInternalField(field)) ||\n (field === GROUPING_COLUMN_FIELD && !disableColumnResize);\n const draggable = canReorder(col);\n const isDragging = drag?.field === field;\n const isDropTarget = drag && drag.overField === field && drag.field !== field;\n const menuOpen = columnMenu?.field === field;\n const headerParams = { field, colDef: col as MGHGridColDef<R>, api: apiObject };\n const customClass = col.headerClassName\n ? typeof col.headerClassName === 'function'\n ? col.headerClassName(headerParams)\n : col.headerClassName\n : undefined;\n\n let content: React.ReactNode;\n if (field === CHECKBOX_FIELD) {\n content = disableMultipleRowSelection ? null : (\n <Checkbox\n checked={allCandidatesSelected}\n indeterminate={someCandidatesSelected}\n disabled={selectionCandidates.length === 0}\n label={\n allCandidatesSelected\n ? localeText.checkboxSelectionUnselectAllRows\n : localeText.checkboxSelectionSelectAllRows\n }\n onChange={toggleAllCandidates}\n onClick={(event) => event.stopPropagation()}\n />\n );\n } else if (field === DETAIL_PANEL_TOGGLE_FIELD) {\n content = null;\n } else {\n content = col.renderHeader ? (\n col.renderHeader(headerParams)\n ) : (\n <span className=\"mgh-grid-header-title\">{col.headerName ?? field}</span>\n );\n }\n\n return (\n <div\n key={field}\n role=\"columnheader\"\n aria-colindex={index + 1}\n aria-sort={sortItem ? (sortItem.sort === 'asc' ? 'ascending' : 'descending') : sortable ? 'none' : undefined}\n data-mgh-field={field}\n title={col.description}\n tabIndex={-1}\n draggable={draggable}\n className={cx(\n 'mgh-grid-header-cell',\n `mgh-grid-header-cell--align-${col.headerAlign ?? 'left'}`,\n pinnedClasses(lc, 'mgh-grid-header-cell'),\n sortable && 'mgh-grid-header-cell--sortable',\n field === CHECKBOX_FIELD && 'mgh-grid-header-cell--checkbox',\n field === DETAIL_PANEL_TOGGLE_FIELD && 'mgh-grid-header-cell--detail-toggle',\n index === layout.columns.length - 1 && 'mgh-grid-header-cell--last',\n isDragging && 'mgh-grid-header-cell--dragging',\n isDropTarget && drag?.side === 'left' && 'mgh-grid-header-cell--drop-left',\n isDropTarget && drag?.side === 'right' && 'mgh-grid-header-cell--drop-right',\n menuOpen && 'mgh-grid-header-cell--menu-open',\n customClass\n )}\n style={cellStyle(lc)}\n onClick={(event) => {\n if (!sortable || resizingField) return;\n sortColumn(field, undefined, event.shiftKey);\n }}\n onDragStart={(event) => {\n if (!draggable) return;\n event.dataTransfer.effectAllowed = 'move';\n try {\n event.dataTransfer.setData('text/plain', field);\n } catch {\n /* ignore */\n }\n setDrag({ field, overField: null, side: 'left' });\n }}\n onDragOver={(event) => {\n if (!drag || drag.field === field) return;\n const sourceLc = layout.columns.find((c) => c.col.field === drag.field);\n if (!sourceLc || sourceLc.pinned !== lc.pinned || !canReorder(col)) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = 'move';\n const rect = event.currentTarget.getBoundingClientRect();\n const side = event.clientX < rect.left + rect.width / 2 ? 'left' : 'right';\n if (drag.overField !== field || drag.side !== side) setDrag({ ...drag, overField: field, side });\n }}\n onDragLeave={() => {\n if (drag && drag.overField === field) setDrag({ ...drag, overField: null });\n }}\n onDrop={(event) => handleDrop(lc, event)}\n onDragEnd={() => setDrag(null)}\n >\n <div className=\"mgh-grid-header-title-container\">\n {content}\n {sortable && (\n <span\n className={cx('mgh-grid-sort-icon', sortItem && 'mgh-grid-sort-icon--active')}\n aria-hidden=\"true\"\n >\n {sortItem?.sort === 'desc' ? <ArrowDownwardIcon size={18} /> : <ArrowUpwardIcon size={18} />}\n {sortItem && sortModel.filter((s) => s.sort).length > 1 && (\n <span className=\"mgh-grid-sort-index\">{sortIndex + 1}</span>\n )}\n </span>\n )}\n </div>\n {showMenu && (\n <IconButton\n size=\"small\"\n className={cx('mgh-grid-header-menu-btn', menuOpen && 'mgh-grid-header-menu-btn--open')}\n label={localeText.columnMenuLabel}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n tabIndex={-1}\n onClick={(event) => {\n event.stopPropagation();\n setColumnMenu((prev) =>\n prev?.field === field ? null : { field, anchorEl: event.currentTarget }\n );\n }}\n onMouseDown={(event) => event.stopPropagation()}\n >\n <MoreVertIcon />\n </IconButton>\n )}\n {resizable && (\n <div\n className={cx('mgh-grid-resize-handle', resizingField === field && 'mgh-grid-resize-handle--active')}\n role=\"separator\"\n aria-orientation=\"vertical\"\n onPointerDown={(event) => handleResizeStart(lc, event)}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => {\n event.stopPropagation();\n autosizeColumns({ columns: [field] });\n }}\n draggable={false}\n onDragStart={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n />\n )}\n </div>\n );\n };\n\n /* ------------------------------------------------------------------ rendering: slots */\n\n const ToolbarSlot = slots.toolbar === null ? null : (slots.toolbar ?? MGHGridToolbar);\n const FooterSlot = slots.footer === null ? null : (slots.footer ?? MGHGridFooter);\n const NoRowsOverlaySlot = slots.noRowsOverlay ?? MGHGridNoRowsOverlay;\n const LoadingOverlaySlot = slots.loadingOverlay ?? MGHGridLoadingOverlay;\n const mergedToolbarProps = { ...toolbarProps, ...slotProps.toolbar };\n const noRowsProps = { text: noRowsText, ...slotProps.noRowsOverlay };\n const loadingProps = { ...slotProps.loadingOverlay };\n\n const showNoRows = !loading && pagedRows.length === 0;\n const menuColumn = columnMenu ? getColumn(columnMenu.field) : undefined;\n\n const cardStyles: React.CSSProperties = {\n height: 'auto',\n flexGrow: 1,\n ...sanitizeStyle(cardSx),\n ...sanitizeStyle(cardStyle),\n ...(themeVars as any),\n };\n const boxStyles: React.CSSProperties = { flexGrow: 1, ...sanitizeStyle(boxSx), ...sanitizeStyle(boxStyle) };\n const rootStyles: React.CSSProperties = {\n ...sanitizeStyle(sx),\n ...sanitizeStyle(style),\n ['--mgh-grid-header-height' as any]: `${headerHeight}px`,\n ['--mgh-grid-row-height' as any]: `${rowHeight}px`,\n };\n\n // Nested selectors from sx/style props become a <style> block scoped to this grid instance.\n const scopedCss = React.useMemo(() => {\n const css: string[] = [];\n buildScopedCss(`[data-mgh-grid-id=\"${gridId}\"]`, sx, css);\n buildScopedCss(`[data-mgh-grid-id=\"${gridId}\"]`, style, css);\n buildScopedCss(`[data-mgh-grid-card=\"${gridId}\"]`, cardSx, css);\n buildScopedCss(`[data-mgh-grid-card=\"${gridId}\"]`, cardStyle, css);\n buildScopedCss(`[data-mgh-grid-box=\"${gridId}\"]`, boxSx, css);\n buildScopedCss(`[data-mgh-grid-box=\"${gridId}\"]`, boxStyle, css);\n return css.join('\\n');\n }, [gridId, sx, style, cardSx, cardStyle, boxSx, boxStyle]);\n\n const smDown = viewportWidth > 0 && viewportWidth < 600;\n\n const grid = (\n <div\n ref={rootRef}\n id={gridId}\n data-mgh-grid-id={gridId}\n role=\"grid\"\n aria-rowcount={rowCount + 1}\n aria-colcount={layout.columns.length}\n aria-multiselectable={checkboxSelection && !disableMultipleRowSelection ? true : undefined}\n aria-busy={loading || undefined}\n className={cx(\n 'mgh-grid',\n (autoHeight || printing) && 'mgh-grid--auto-height',\n printing && 'mgh-grid--printing',\n !layout.hasPinning && 'mgh-grid--no-pinned-shadow',\n className\n )}\n style={rootStyles}\n onKeyDown={handleKeyDown}\n >\n {showToolbar && ToolbarSlot && (\n <div ref={toolbarRef}>\n <ToolbarSlot {...mergedToolbarProps} />\n </div>\n )}\n <div className=\"mgh-grid-main\">\n <div ref={scrollerRef} className=\"mgh-grid-scroller\" onScroll={handleScroll} tabIndex={-1}>\n <div className=\"mgh-grid-columns\" role=\"rowgroup\" style={{ width: layout.totalWidth }}>\n <div className=\"mgh-grid-header-row\" role=\"row\" aria-rowindex={1} style={{ height: headerHeight }}>\n {layout.columns.map((lc, index) => renderHeaderCell(lc, index))}\n <div className=\"mgh-grid-header-filler\" />\n </div>\n </div>\n {pinnedRows?.top && pinnedRows.top.length > 0 && (\n <div\n className=\"mgh-grid-pinned-rows mgh-grid-pinned-rows--top\"\n role=\"rowgroup\"\n style={{ top: headerHeight, width: layout.totalWidth }}\n >\n {renderPinnedRows(pinnedRows.top, 'top')}\n </div>\n )}\n <div\n className={cx('mgh-grid-body', virtual ? 'mgh-grid-body--virtual' : 'mgh-grid-body--flow')}\n role=\"rowgroup\"\n style={\n virtual\n ? { height: heights.total, width: layout.totalWidth }\n : { width: layout.totalWidth, minHeight: showNoRows || loading ? 120 : undefined }\n }\n >\n {renderBodyRows()}\n </div>\n {((pinnedRows?.bottom && pinnedRows.bottom.length > 0) || footerAggregates) && (\n <div\n className=\"mgh-grid-pinned-rows mgh-grid-pinned-rows--bottom\"\n role=\"rowgroup\"\n style={{ width: layout.totalWidth }}\n >\n {renderPinnedRows(pinnedRows?.bottom, 'bottom')}\n </div>\n )}\n </div>\n {loading && (\n <div className=\"mgh-grid-overlay mgh-grid-overlay--loading\" style={{ top: headerHeight }}>\n <LoadingOverlaySlot {...loadingProps} />\n </div>\n )}\n {showNoRows && (\n <div className=\"mgh-grid-overlay\" style={{ top: headerHeight }}>\n <NoRowsOverlaySlot {...noRowsProps} />\n </div>\n )}\n </div>\n {!hideFooter && FooterSlot && <FooterSlot {...slotProps.footer} />}\n\n <Popover\n open={preferencePanel.open}\n anchorEl={preferencePanel.anchorEl}\n onClose={hidePreferences}\n themeMode={themeMode}\n placement=\"bottom-start\"\n autoFocus\n >\n {preferencePanel.openedPanelValue === 'columns' ? <MGHGridColumnsPanel /> : <MGHGridFilterPanel />}\n </Popover>\n\n {menuColumn && columnMenu && (\n <MGHGridColumnMenu\n column={menuColumn}\n anchorEl={columnMenu.anchorEl}\n open\n onClose={() => setColumnMenu(null)}\n themeMode={themeMode}\n panelAnchorEl={toolbarRef.current}\n />\n )}\n </div>\n );\n\n return (\n <MGHGridContext.Provider value={contextValue}>\n <div\n ref={cardRef}\n className={cx('mgh-grid-card', disableCard && 'mgh-grid-card--plain', cardClassName)}\n data-mgh-theme={themeMode}\n data-mgh-grid-card={gridId}\n style={cardStyles}\n >\n {scopedCss && <style data-mgh-grid-sx={gridId}>{scopedCss}</style>}\n {!disableCard && (header !== undefined || renderHeaderCenterContent || renderHeaderEndContent) && (\n <div className=\"mgh-grid-card-header\">\n {header !== undefined && <h3 className=\"mgh-grid-card-title\">{header}</h3>}\n {renderHeaderCenterContent && (\n <div className=\"mgh-grid-card-header-center\">{renderHeaderCenterContent}</div>\n )}\n <div className=\"mgh-grid-card-header-end\" style={{ gap: smDown ? 8 : 16 }}>\n {renderHeaderEndContent}\n </div>\n </div>\n )}\n <div className={cx('mgh-grid-box', boxClassName)} data-mgh-grid-box={gridId} style={boxStyles}>\n {grid}\n </div>\n </div>\n </MGHGridContext.Provider>\n );\n}\n\nMGHGrid.displayName = 'MGHGrid';\n","import React from 'react';\n\nexport const MGH_DATE_RANGE_PICKER_STYLE_ID = 'mgh-drp-styles';\n\n/**\n * Stylesheet for MGHDateRangePicker. Injected once into <head> the first time a picker mounts.\n * Colours are CSS variables (`--mgh-drp-*`). When the picker is rendered inside an MGHGrid card\n * it inherits the grid palette (`--mgh-grid-*`) automatically.\n */\nexport const MGH_DATE_RANGE_PICKER_CSS = `\n.mgh-drp, .mgh-drp-popover, .mgh-drp-calendars {\n --mgh-drp-font-family: var(--mgh-grid-font-family, inherit);\n --mgh-drp-font-size: var(--mgh-grid-font-size, 14px);\n --mgh-drp-paper: var(--mgh-grid-paper, #ffffff);\n --mgh-drp-fg: var(--mgh-grid-fg, rgba(0, 0, 0, 0.87));\n --mgh-drp-fg-secondary: var(--mgh-grid-fg-secondary, rgba(0, 0, 0, 0.6));\n --mgh-drp-fg-disabled: var(--mgh-grid-fg-disabled, rgba(0, 0, 0, 0.38));\n --mgh-drp-border: var(--mgh-grid-border, rgba(224, 224, 224, 1));\n --mgh-drp-input-border: var(--mgh-grid-input-border, rgba(0, 0, 0, 0.23));\n --mgh-drp-hover: var(--mgh-grid-hover, rgba(0, 0, 0, 0.04));\n --mgh-drp-primary: var(--mgh-grid-primary, #1976d2);\n --mgh-drp-primary-contrast: var(--mgh-grid-primary-contrast, #ffffff);\n --mgh-drp-focus: var(--mgh-grid-focus, #1976d2);\n --mgh-drp-selected: var(--mgh-grid-selected, rgba(25, 118, 210, 0.12));\n --mgh-drp-preview: rgba(0, 0, 0, 0.06);\n --mgh-drp-error: #d32f2f;\n --mgh-drp-radius: 4px;\n --mgh-drp-popover-radius: 8px;\n --mgh-drp-popover-shadow: var(--mgh-grid-popover-shadow, 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12));\n --mgh-drp-day-size: 36px;\n --mgh-drp-day-margin: 2px;\n font-family: var(--mgh-drp-font-family);\n font-size: var(--mgh-drp-font-size);\n color: var(--mgh-drp-fg);\n line-height: 1.5;\n}\n/* Dark values also apply to a calendar nested inside a dark picker / popover, so the calendar's own\n defaults (declared above for standalone use) never reset the colours back to light. */\n.mgh-drp[data-mgh-theme=\"dark\"], .mgh-drp-popover[data-mgh-theme=\"dark\"], .mgh-drp-calendars[data-mgh-theme=\"dark\"],\n.mgh-drp[data-mgh-theme=\"dark\"] .mgh-drp-calendars, .mgh-drp-popover[data-mgh-theme=\"dark\"] .mgh-drp-calendars {\n --mgh-drp-paper: #212b36;\n --mgh-drp-fg: #ffffff;\n --mgh-drp-fg-secondary: rgba(255, 255, 255, 0.7);\n --mgh-drp-fg-disabled: rgba(255, 255, 255, 0.5);\n --mgh-drp-border: rgba(81, 81, 81, 1);\n --mgh-drp-input-border: rgba(255, 255, 255, 0.23);\n --mgh-drp-hover: rgba(255, 255, 255, 0.08);\n --mgh-drp-primary: #90caf9;\n --mgh-drp-primary-contrast: rgba(0, 0, 0, 0.87);\n --mgh-drp-focus: #90caf9;\n --mgh-drp-selected: rgba(144, 202, 249, 0.16);\n --mgh-drp-preview: rgba(255, 255, 255, 0.08);\n --mgh-drp-error: #f44336;\n}\n[class*=\"mgh-drp\"], [class*=\"mgh-drp\"]::before, [class*=\"mgh-drp\"]::after { box-sizing: border-box; }\n\n/* ---- root / multi-input layout ---- */\n.mgh-drp { display: inline-flex; flex-direction: column; vertical-align: top; min-width: 0; }\n.mgh-drp--full-width { display: flex; width: 100%; }\n.mgh-drp-fields { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }\n.mgh-drp-fields .mgh-drp-field { flex: 1 1 0; min-width: 0; }\n.mgh-drp-fields-separator { align-self: center; color: var(--mgh-drp-fg-secondary); padding: 0 2px; }\n\n/* ---- outlined text field (MUI TextField look-alike) ---- */\n.mgh-drp-field { position: relative; display: inline-flex; align-items: center; min-width: 0; width: 100%; border-radius: var(--mgh-drp-radius); color: var(--mgh-drp-fg); }\n.mgh-drp-field--medium { height: 56px; }\n.mgh-drp-field--small { height: 40px; }\n.mgh-drp-field:not(.mgh-drp-field--full-width) { width: 260px; }\n.mgh-drp-field--multi:not(.mgh-drp-field--full-width) { width: 170px; }\n.mgh-drp-field--full-width { width: 100%; }\n.mgh-drp-input { flex: 1 1 auto; min-width: 0; width: 100%; height: 100%; margin: 0; border: 0; outline: none; background: transparent; color: inherit; font: inherit; font-size: 1rem; letter-spacing: inherit; padding: 16.5px 14px; }\n.mgh-drp-field--small .mgh-drp-input { padding: 8.5px 14px; }\n.mgh-drp-field--adorned .mgh-drp-input { padding-right: 0; }\n.mgh-drp-input::placeholder { color: var(--mgh-drp-fg-disabled); opacity: 1; }\n.mgh-drp-input::-webkit-calendar-picker-indicator { display: none; }\n.mgh-drp-field--disabled .mgh-drp-input { color: var(--mgh-drp-fg-disabled); -webkit-text-fill-color: var(--mgh-drp-fg-disabled); }\n.mgh-drp-field--disabled { cursor: default; }\n.mgh-drp-field--clickable .mgh-drp-input { cursor: pointer; }\n.mgh-drp-adornment { display: flex; align-items: center; gap: 0; margin-right: 6px; flex: 0 0 auto; color: var(--mgh-drp-fg-secondary); }\n.mgh-drp-field--small .mgh-drp-adornment { margin-right: 4px; }\n\n/* notched outline */\n.mgh-drp-outline { position: absolute; inset: -5px 0 0 0; margin: 0; padding: 0 8px; pointer-events: none; border: 1px solid var(--mgh-drp-input-border); border-radius: inherit; min-width: 0; overflow: hidden; text-align: left; transition: border-color .15s; }\n.mgh-drp-outline legend { float: unset; width: auto; padding: 0; height: 11px; font-size: 0.75em; visibility: hidden; max-width: 0.01px; white-space: nowrap; transition: max-width 50ms cubic-bezier(0.0, 0, 0.2, 1) 0ms; overflow: hidden; display: block; line-height: 11px; }\n.mgh-drp-outline legend > span { padding-left: 5px; padding-right: 5px; display: inline-block; opacity: 0; visibility: visible; }\n.mgh-drp-field--shrink .mgh-drp-outline legend { max-width: 100%; transition: max-width 100ms cubic-bezier(0.0, 0, 0.2, 1) 50ms; }\n.mgh-drp-field--no-label .mgh-drp-outline legend { display: none; }\n.mgh-drp-field:hover:not(.mgh-drp-field--disabled) .mgh-drp-outline { border-color: var(--mgh-drp-fg); }\n.mgh-drp-field--focused .mgh-drp-outline, .mgh-drp-field--focused:hover .mgh-drp-outline { border-color: var(--mgh-drp-focus); border-width: 2px; }\n.mgh-drp-field--error .mgh-drp-outline, .mgh-drp-field--error:hover .mgh-drp-outline { border-color: var(--mgh-drp-error); }\n.mgh-drp-field--disabled .mgh-drp-outline { border-color: var(--mgh-drp-fg-disabled); }\n\n/* floating label */\n.mgh-drp-label { position: absolute; left: 0; top: 0; transform-origin: top left; transform: translate(14px, 16px) scale(1); color: var(--mgh-drp-fg-secondary); font-size: 1rem; line-height: 1.4375em; pointer-events: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: calc(100% - 24px); transition: color .15s, transform .15s cubic-bezier(0.0, 0, 0.2, 1), max-width .15s; z-index: 1; }\n.mgh-drp-field--small .mgh-drp-label { transform: translate(14px, 9px) scale(1); }\n.mgh-drp-field--shrink .mgh-drp-label, .mgh-drp-field--small.mgh-drp-field--shrink .mgh-drp-label { transform: translate(14px, -9px) scale(0.75); max-width: calc(133% - 32px); }\n.mgh-drp-field--focused .mgh-drp-label { color: var(--mgh-drp-focus); }\n.mgh-drp-field--error .mgh-drp-label { color: var(--mgh-drp-error); }\n.mgh-drp-field--disabled .mgh-drp-label { color: var(--mgh-drp-fg-disabled); }\n.mgh-drp-label-asterisk { margin-left: 2px; }\n\n.mgh-drp-helper { margin: 3px 14px 0; font-size: 0.75rem; line-height: 1.66; color: var(--mgh-drp-fg-secondary); }\n.mgh-drp-helper--error { color: var(--mgh-drp-error); }\n\n/* ---- buttons ---- */\n.mgh-drp-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; border: 0; margin: 0; background: transparent; color: var(--mgh-drp-fg-secondary); font: inherit; font-size: 0.8125rem; font-weight: 500; line-height: 1.75; letter-spacing: .02em; padding: 4px 8px; border-radius: 4px; cursor: pointer; user-select: none; transition: background-color .15s, color .15s; white-space: nowrap; text-transform: uppercase; }\n.mgh-drp-btn:hover { background: var(--mgh-drp-hover); color: var(--mgh-drp-fg); }\n.mgh-drp-btn:focus-visible { outline: 2px solid var(--mgh-drp-focus); outline-offset: 1px; }\n.mgh-drp-btn:disabled { color: var(--mgh-drp-fg-disabled); cursor: default; background: transparent; }\n.mgh-drp-btn--primary { color: var(--mgh-drp-primary); }\n.mgh-drp-btn--primary:hover { background: var(--mgh-drp-selected); color: var(--mgh-drp-primary); }\n.mgh-drp-btn--icon { padding: 8px; border-radius: 50%; width: 40px; height: 40px; text-transform: none; }\n.mgh-drp-btn--icon.mgh-drp-btn--small { width: 32px; height: 32px; padding: 4px; }\n.mgh-drp-icon { flex: 0 0 auto; }\n\n/* ---- popover ---- */\n.mgh-drp-popover { position: fixed; z-index: 1300; display: flex; flex-direction: column; background: var(--mgh-drp-paper); color: var(--mgh-drp-fg); border-radius: var(--mgh-drp-popover-radius); box-shadow: var(--mgh-drp-popover-shadow); outline: none; max-height: calc(100vh - 16px); max-width: calc(100vw - 16px); overflow: auto; animation: mgh-drp-pop .12s ease-out; }\n@keyframes mgh-drp-pop { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }\n.mgh-drp-layout { display: flex; flex-direction: row; align-items: stretch; }\n.mgh-drp-layout--with-toolbar { flex-direction: column; }\n.mgh-drp-layout-main { display: flex; flex-direction: row; align-items: stretch; }\n.mgh-drp-toolbar { padding: 16px 24px 0; }\n.mgh-drp-toolbar-title { font-size: 0.75rem; text-transform: uppercase; letter-spacing: .08em; color: var(--mgh-drp-fg-secondary); margin: 0 0 8px; }\n.mgh-drp-toolbar-range { display: flex; align-items: center; gap: 8px; font-size: 1.5rem; font-weight: 400; line-height: 1.334; }\n.mgh-drp-toolbar-range button { border: 0; background: transparent; padding: 0 2px; font: inherit; color: var(--mgh-drp-fg-secondary); cursor: pointer; border-radius: 4px; }\n.mgh-drp-toolbar-range button.mgh-drp-toolbar-range--active { color: var(--mgh-drp-fg); }\n.mgh-drp-toolbar-range button:hover { background: var(--mgh-drp-hover); }\n\n/* shortcuts (left column) */\n.mgh-drp-shortcuts { list-style: none; margin: 0; padding: 8px 0; min-width: 140px; max-height: 340px; overflow: auto; border-right: 1px solid var(--mgh-drp-border); display: flex; flex-direction: column; gap: 4px; padding-left: 8px; padding-right: 8px; }\n.mgh-drp-shortcut { display: inline-flex; align-items: center; height: 32px; padding: 0 12px; border-radius: 16px; border: 1px solid var(--mgh-drp-input-border); background: transparent; color: var(--mgh-drp-fg); font: inherit; font-size: 0.8125rem; cursor: pointer; white-space: nowrap; justify-content: flex-start; transition: background-color .15s; }\n.mgh-drp-shortcut:hover { background: var(--mgh-drp-hover); }\n.mgh-drp-shortcut:focus-visible { outline: 2px solid var(--mgh-drp-focus); outline-offset: 1px; }\n.mgh-drp-shortcut:disabled { color: var(--mgh-drp-fg-disabled); cursor: default; }\n.mgh-drp-shortcut--selected { background: var(--mgh-drp-selected); border-color: var(--mgh-drp-primary); color: var(--mgh-drp-primary); }\n\n/* ---- calendars ---- */\n.mgh-drp-calendars { display: flex; flex-direction: row; align-items: flex-start; }\n.mgh-drp-calendar { display: flex; flex-direction: column; width: calc(7 * (var(--mgh-drp-day-size) + 2 * var(--mgh-drp-day-margin)) + 24px); padding: 0 12px 8px; }\n.mgh-drp-calendar + .mgh-drp-calendar { border-left: 1px solid var(--mgh-drp-border); }\n.mgh-drp-calendar-header { display: flex; align-items: center; justify-content: space-between; min-height: 40px; margin: 12px 0 8px; padding: 0 4px; }\n.mgh-drp-calendar-label { flex: 1 1 auto; text-align: center; font-size: 1rem; font-weight: 500; }\n.mgh-drp-calendar-header .mgh-drp-btn--icon { color: var(--mgh-drp-fg-secondary); }\n.mgh-drp-calendar-nav-spacer { width: 40px; height: 40px; flex: 0 0 auto; }\n.mgh-drp-weekdays, .mgh-drp-week { display: flex; justify-content: center; }\n.mgh-drp-weekday { width: var(--mgh-drp-day-size); height: 40px; margin: 0 var(--mgh-drp-day-margin); display: flex; align-items: center; justify-content: center; font-size: 0.75rem; color: var(--mgh-drp-fg-secondary); font-weight: 400; }\n.mgh-drp-weeks { display: flex; flex-direction: column; min-height: calc(6 * (var(--mgh-drp-day-size) + 2 * var(--mgh-drp-day-margin))); }\n.mgh-drp-week { margin: var(--mgh-drp-day-margin) 0; }\n\n/* day cell: the outer wrapper carries the range highlight, the inner button the day itself */\n.mgh-drp-day-wrap { position: relative; width: calc(var(--mgh-drp-day-size) + 2 * var(--mgh-drp-day-margin)); height: var(--mgh-drp-day-size); display: flex; align-items: center; justify-content: center; }\n.mgh-drp-day-wrap--in-range { background: var(--mgh-drp-selected); }\n.mgh-drp-day-wrap--range-start { border-top-left-radius: 50%; border-bottom-left-radius: 50%; }\n.mgh-drp-day-wrap--range-end { border-top-right-radius: 50%; border-bottom-right-radius: 50%; }\n.mgh-drp-day-wrap--preview { border-top: 1px dashed var(--mgh-drp-fg-secondary); border-bottom: 1px dashed var(--mgh-drp-fg-secondary); }\n.mgh-drp-day-wrap--preview-start { border-left: 1px dashed var(--mgh-drp-fg-secondary); border-top-left-radius: 50%; border-bottom-left-radius: 50%; }\n.mgh-drp-day-wrap--preview-end { border-right: 1px dashed var(--mgh-drp-fg-secondary); border-top-right-radius: 50%; border-bottom-right-radius: 50%; }\n.mgh-drp-day-wrap--first-visible.mgh-drp-day-wrap--in-range:not(.mgh-drp-day-wrap--range-start) { border-top-left-radius: 50%; border-bottom-left-radius: 50%; }\n.mgh-drp-day-wrap--last-visible.mgh-drp-day-wrap--in-range:not(.mgh-drp-day-wrap--range-end) { border-top-right-radius: 50%; border-bottom-right-radius: 50%; }\n.mgh-drp-day-wrap--first-visible.mgh-drp-day-wrap--preview:not(.mgh-drp-day-wrap--preview-start) { border-top-left-radius: 50%; border-bottom-left-radius: 50%; border-left: 1px dashed var(--mgh-drp-fg-secondary); }\n.mgh-drp-day-wrap--last-visible.mgh-drp-day-wrap--preview:not(.mgh-drp-day-wrap--preview-end) { border-top-right-radius: 50%; border-bottom-right-radius: 50%; border-right: 1px dashed var(--mgh-drp-fg-secondary); }\n.mgh-drp-day { width: var(--mgh-drp-day-size); height: var(--mgh-drp-day-size); border-radius: 50%; border: 0; margin: 0; padding: 0; background: transparent; color: var(--mgh-drp-fg); font: inherit; font-size: 0.75rem; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; transition: background-color .15s, color .15s; position: relative; }\n.mgh-drp-day:hover { background: var(--mgh-drp-hover); }\n.mgh-drp-day:focus-visible { outline: 2px solid var(--mgh-drp-focus); outline-offset: -1px; }\n.mgh-drp-day--today:not(.mgh-drp-day--selected) { border: 1px solid var(--mgh-drp-fg-secondary); }\n.mgh-drp-day--outside { color: var(--mgh-drp-fg-secondary); opacity: .6; }\n.mgh-drp-day--hidden { visibility: hidden; pointer-events: none; }\n.mgh-drp-day--disabled, .mgh-drp-day--disabled:hover { color: var(--mgh-drp-fg-disabled); cursor: default; background: transparent; }\n.mgh-drp-day--selected, .mgh-drp-day--selected:hover { background: var(--mgh-drp-primary); color: var(--mgh-drp-primary-contrast); font-weight: 500; }\n.mgh-drp-day--selected:focus-visible { outline-offset: 2px; }\n.mgh-drp-calendar--read-only .mgh-drp-day, .mgh-drp-calendar--disabled .mgh-drp-day { cursor: default; }\n.mgh-drp-calendar--disabled .mgh-drp-day { color: var(--mgh-drp-fg-disabled); }\n.mgh-drp-calendar--disabled .mgh-drp-day--selected { opacity: .6; }\n\n/* ---- action bar ---- */\n.mgh-drp-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 8px; border-top: 1px solid var(--mgh-drp-border); }\n.mgh-drp-actions--spread { justify-content: space-between; }\n.mgh-drp-actions-group { display: flex; gap: 8px; }\n\n@media (max-width: 599.95px) {\n .mgh-drp-layout-main { flex-direction: column; }\n .mgh-drp-shortcuts { flex-direction: row; flex-wrap: wrap; border-right: 0; border-bottom: 1px solid var(--mgh-drp-border); max-height: none; }\n .mgh-drp-calendars { flex-direction: column; align-items: center; }\n .mgh-drp-calendar + .mgh-drp-calendar { border-left: 0; border-top: 1px solid var(--mgh-drp-border); }\n}\n`;\n\nlet injected = false;\n\nconst injectStyles = () => {\n if (injected || typeof document === 'undefined') return;\n if (document.getElementById(MGH_DATE_RANGE_PICKER_STYLE_ID)) {\n injected = true;\n return;\n }\n const style = document.createElement('style');\n style.id = MGH_DATE_RANGE_PICKER_STYLE_ID;\n style.setAttribute('data-mgh-drp', 'true');\n style.textContent = MGH_DATE_RANGE_PICKER_CSS;\n document.head.appendChild(style);\n injected = true;\n};\n\nconst useInsertion: typeof React.useLayoutEffect =\n (React as any).useInsertionEffect ?? (typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect);\n\n/** Injects the MGHDateRangePicker stylesheet once per document. Safe on the server (no-op). */\nexport const useMGHDateRangePickerStyles = () => {\n useInsertion(() => {\n injectStyles();\n }, []);\n};\n","import React from 'react';\n\n/* Inline SVG icons (Material Design icon paths, Apache-2.0). No external dependencies. */\n\nexport interface MGHDateRangeIconProps extends React.SVGProps<SVGSVGElement> {\n size?: number;\n}\n\nconst createIcon = (path: React.ReactNode, displayName: string) => {\n const Icon = React.forwardRef<SVGSVGElement, MGHDateRangeIconProps>(({ size = 24, className, style, ...rest }, ref) => (\n <svg\n ref={ref}\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n fill=\"currentColor\"\n focusable=\"false\"\n aria-hidden=\"true\"\n className={['mgh-drp-icon', className].filter(Boolean).join(' ')}\n style={style}\n {...rest}\n >\n {path}\n </svg>\n ));\n Icon.displayName = displayName;\n return Icon;\n};\n\nexport const DateRangeIcon = createIcon(\n <path d=\"M9 11H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2zm2-7h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V9h14v11z\" />,\n 'DateRangeIcon'\n);\nexport const ChevronLeftIcon = createIcon(\n <path d=\"M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z\" />,\n 'ChevronLeftIcon'\n);\nexport const ChevronRightIcon = createIcon(\n <path d=\"M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z\" />,\n 'ChevronRightIcon'\n);\nexport const CloseIcon = createIcon(\n <path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />,\n 'CloseIcon'\n);\n","import dayjs, { Dayjs } from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport type {\n MGHDateRange,\n MGHDateRangePosition,\n MGHDateRangeShortcut,\n MGHDateRangeValidationError,\n} from './MGHDateRangePicker.types';\n\ndayjs.extend(customParseFormat);\n\nexport const cx = (...classNames: Array<string | false | null | undefined>) => classNames.filter(Boolean).join(' ');\n\nexport const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max);\n\nexport const EMPTY_RANGE: MGHDateRange = [null, null];\n\n/** Coerces Dayjs / Date / ISO string / timestamp into a valid Dayjs (or null). */\nexport const toDayjs = (value: unknown): Dayjs | null => {\n if (value == null || value === '') return null;\n if (dayjs.isDayjs(value)) return value.isValid() ? value : null;\n if (value instanceof Date || typeof value === 'number' || typeof value === 'string') {\n const parsed = dayjs(value as Date | number | string);\n return parsed.isValid() ? parsed : null;\n }\n return null;\n};\n\nexport const isSameDay = (a: Dayjs | null | undefined, b: Dayjs | null | undefined) => !!a && !!b && a.isSame(b, 'day');\nexport const isBeforeDay = (a: Dayjs, b: Dayjs) => a.isBefore(b, 'day');\nexport const isAfterDay = (a: Dayjs, b: Dayjs) => a.isAfter(b, 'day');\nexport const isWithinRange = (day: Dayjs, start: Dayjs | null, end: Dayjs | null) =>\n !!start && !!end && !isBeforeDay(day, start) && !isAfterDay(day, end);\n\nexport const isRangeEqual = (a: MGHDateRange | undefined, b: MGHDateRange | undefined) => {\n if (a === b) return true;\n if (!a || !b) return false;\n const same = (x: Dayjs | null, y: Dayjs | null) => (x == null && y == null) || (!!x && !!y && x.isSame(y, 'day'));\n return same(a[0], b[0]) && same(a[1], b[1]);\n};\n\nexport const normalizeRange = (value: unknown): MGHDateRange => {\n if (!Array.isArray(value)) return EMPTY_RANGE;\n return [toDayjs(value[0]), toDayjs(value[1])];\n};\n\n/** Strict parse with the display format first, then a handful of forgiving fallbacks. */\nexport const parseDateText = (text: string, format: string): Dayjs | null => {\n const trimmed = text.trim();\n if (!trimmed) return null;\n const strict = dayjs(trimmed, format, true);\n if (strict.isValid()) return strict;\n const fallbacks = [\n format.replace(/MM/g, 'M').replace(/DD/g, 'D'),\n 'M/D/YYYY',\n 'M/D/YY',\n 'YYYY-MM-DD',\n 'MM-DD-YYYY',\n 'M-D-YYYY',\n ];\n for (const f of fallbacks) {\n const parsed = dayjs(trimmed, f, true);\n if (parsed.isValid()) return parsed;\n }\n return null;\n};\n\nexport const formatDate = (value: Dayjs | null, format: string) => (value && value.isValid() ? value.format(format) : '');\n\n/** Splits \"start – end\" text typed into the single-input field. */\nexport const splitRangeText = (text: string): [string, string] => {\n const parts = text.split(/\\s+[–—-]\\s+|\\s*–\\s*|\\s*—\\s*|\\s+to\\s+/i);\n if (parts.length >= 2) return [parts[0], parts.slice(1).join(' ')];\n return [text, ''];\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validation (mirrors MUI's DateRangeValidationError semantics)\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface DateValidationOptions {\n minDate?: Dayjs | null;\n maxDate?: Dayjs | null;\n disablePast?: boolean;\n disableFuture?: boolean;\n shouldDisableDate?: (day: Dayjs, position: MGHDateRangePosition) => boolean;\n}\n\nexport const validateDay = (\n day: Dayjs | null,\n position: MGHDateRangePosition,\n options: DateValidationOptions,\n now: Dayjs = dayjs()\n): MGHDateRangeValidationError => {\n if (day == null) return null;\n if (!day.isValid()) return 'invalidDate';\n if (options.disablePast && isBeforeDay(day, now)) return 'disablePast';\n if (options.disableFuture && isAfterDay(day, now)) return 'disableFuture';\n if (options.minDate && isBeforeDay(day, options.minDate)) return 'minDate';\n if (options.maxDate && isAfterDay(day, options.maxDate)) return 'maxDate';\n if (options.shouldDisableDate?.(day, position)) return 'shouldDisableDate';\n return null;\n};\n\nexport const validateRange = (\n value: MGHDateRange,\n options: DateValidationOptions\n): [MGHDateRangeValidationError, MGHDateRangeValidationError] => {\n const now = dayjs();\n const startError = validateDay(value[0], 'start', options, now);\n const endError = validateDay(value[1], 'end', options, now);\n if (!startError && !endError && value[0] && value[1] && isAfterDay(value[0], value[1])) {\n return ['invalidRange', 'invalidRange'];\n }\n return [startError, endError];\n};\n\nexport const isDayDisabled = (day: Dayjs, position: MGHDateRangePosition, options: DateValidationOptions) =>\n validateDay(day, position, options) != null;\n\n/* -------------------------------------------------------------------------------------------------\n * Calendar grid\n * ----------------------------------------------------------------------------------------------- */\n\nexport interface CalendarWeek {\n key: string;\n days: Array<{ day: Dayjs; outsideMonth: boolean }>;\n}\n\n/**\n * Builds the weeks of `month`. Weeks start on the locale's first day of the week (Sunday for `en`).\n * Pass `fixedWeekNumber` (usually 6) to always render the same number of rows.\n */\nexport const getMonthWeeks = (month: Dayjs, fixedWeekNumber?: number): CalendarWeek[] => {\n const firstOfMonth = month.startOf('month');\n const start = firstOfMonth.startOf('week');\n const weeksInMonth = Math.ceil(firstOfMonth.endOf('month').diff(start, 'day') / 7 + 1 / 7);\n const weekCount = fixedWeekNumber && fixedWeekNumber > 0 ? fixedWeekNumber : Math.max(weeksInMonth, 1);\n const weeks: CalendarWeek[] = [];\n for (let w = 0; w < weekCount; w += 1) {\n const weekStart = start.add(w * 7, 'day');\n weeks.push({\n key: weekStart.format('YYYY-MM-DD'),\n days: Array.from({ length: 7 }, (_, d) => {\n const day = weekStart.add(d, 'day');\n return { day, outsideMonth: !day.isSame(firstOfMonth, 'month') };\n }),\n });\n }\n return weeks;\n};\n\nexport const getWeekDayLabels = (formatter: (day: Dayjs) => string) => {\n const start = dayjs().startOf('week');\n return Array.from({ length: 7 }, (_, i) => {\n const day = start.add(i, 'day');\n return { key: day.format('dd'), label: formatter(day), full: day.format('dddd') };\n });\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Shortcuts (same shape as MUI's PickersShortcuts items)\n * ----------------------------------------------------------------------------------------------- */\n\nexport const MGH_DATE_RANGE_DEFAULT_SHORTCUTS: MGHDateRangeShortcut[] = [\n {\n label: 'This Week',\n getValue: () => {\n const today = dayjs();\n return [today.startOf('week'), today.endOf('week')];\n },\n },\n {\n label: 'Last Week',\n getValue: () => {\n const prev = dayjs().subtract(7, 'day');\n return [prev.startOf('week'), prev.endOf('week')];\n },\n },\n {\n label: 'Last 7 Days',\n getValue: () => {\n const today = dayjs();\n return [today.subtract(7, 'day'), today];\n },\n },\n {\n label: 'Current Month',\n getValue: () => {\n const today = dayjs();\n return [today.startOf('month'), today.endOf('month')];\n },\n },\n {\n label: 'Next Month',\n getValue: () => {\n const next = dayjs().add(1, 'month');\n return [next.startOf('month'), next.endOf('month')];\n },\n },\n { label: 'Reset', getValue: () => [null, null] },\n];\n","import React from 'react';\nimport dayjs, { Dayjs } from 'dayjs';\nimport type { MGHDateRange, MGHDateRangeCalendarProps, MGHDateRangePosition } from './MGHDateRangePicker.types';\nimport { useMGHDateRangePickerStyles } from './MGHDateRangePicker.styles';\nimport { ChevronLeftIcon, ChevronRightIcon } from './icons';\nimport {\n EMPTY_RANGE,\n cx,\n getMonthWeeks,\n getWeekDayLabels,\n isAfterDay,\n isBeforeDay,\n isDayDisabled,\n isSameDay,\n isWithinRange,\n normalizeRange,\n} from './utils';\n\nconst defaultDayOfWeekFormatter = (day: Dayjs) => day.format('dd').charAt(0).toUpperCase();\n\n/**\n * Pure-React port of MUI X's `DateRangeCalendar`: one to three months side by side with range\n * highlighting, hover preview, keyboard navigation and min/max/disabled-day validation.\n */\nexport function MGHDateRangeCalendar({\n value: valueProp,\n defaultValue,\n onChange,\n rangePosition: rangePositionProp,\n onRangePositionChange,\n calendars = 2,\n referenceDate,\n minDate,\n maxDate,\n disablePast,\n disableFuture,\n shouldDisableDate,\n disabled = false,\n readOnly = false,\n showDaysOutsideCurrentMonth = false,\n fixedWeekNumber,\n dayOfWeekFormatter = defaultDayOfWeekFormatter,\n disableHighlightToday = false,\n showRangePreview = true,\n autoFocus = false,\n onMonthChange,\n localeText,\n themeMode,\n className,\n style,\n}: MGHDateRangeCalendarProps) {\n useMGHDateRangePickerStyles();\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = React.useState<MGHDateRange>(() =>\n normalizeRange(defaultValue ?? EMPTY_RANGE)\n );\n const value = React.useMemo(\n () => (isControlled ? normalizeRange(valueProp) : internalValue),\n [isControlled, valueProp, internalValue]\n );\n const [start, end] = value;\n\n const [internalPosition, setInternalPosition] = React.useState<MGHDateRangePosition>('start');\n const rangePosition = rangePositionProp ?? internalPosition;\n const setRangePosition = React.useCallback(\n (position: MGHDateRangePosition) => {\n if (rangePositionProp === undefined) setInternalPosition(position);\n onRangePositionChange?.(position);\n },\n [rangePositionProp, onRangePositionChange]\n );\n\n const validation = React.useMemo(\n () => ({ minDate, maxDate, disablePast, disableFuture, shouldDisableDate }),\n [minDate, maxDate, disablePast, disableFuture, shouldDisableDate]\n );\n\n // Month displayed by the first calendar.\n const [currentMonth, setCurrentMonth] = React.useState<Dayjs>(() =>\n (start ?? end ?? referenceDate ?? dayjs()).startOf('month')\n );\n const visibleMonths = React.useMemo(\n () => Array.from({ length: calendars }, (_, i) => currentMonth.add(i, 'month')),\n [currentMonth, calendars]\n );\n const lastVisibleMonth = visibleMonths[visibleMonths.length - 1];\n\n const changeMonth = React.useCallback(\n (month: Dayjs) => {\n const next = month.startOf('month');\n setCurrentMonth((prev) => {\n if (prev.isSame(next, 'month')) return prev;\n onMonthChange?.(next);\n return next;\n });\n },\n [onMonthChange]\n );\n\n const ensureVisible = React.useCallback(\n (day: Dayjs) => {\n if (isBeforeDay(day, currentMonth.startOf('month'))) changeMonth(day);\n else if (isAfterDay(day, lastVisibleMonth.endOf('month'))) changeMonth(day.subtract(calendars - 1, 'month'));\n },\n [currentMonth, lastVisibleMonth, calendars, changeMonth]\n );\n\n // When a value arrives from outside (typed in the field / shortcut) scroll to it.\n const lastSeenRef = React.useRef<MGHDateRange>(value);\n React.useEffect(() => {\n const prev = lastSeenRef.current;\n lastSeenRef.current = value;\n const target = rangePosition === 'end' ? (end ?? start) : (start ?? end);\n if (!target) return;\n const changed = !isSameDay(prev[0], start) || !isSameDay(prev[1], end);\n if (changed) ensureVisible(target);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [start, end]);\n\n const canGoPrev = !minDate || currentMonth.isAfter(minDate, 'month');\n const canGoNext = !maxDate || lastVisibleMonth.isBefore(maxDate, 'month');\n\n /* ---- hover preview ---- */\n const [hoveredDay, setHoveredDay] = React.useState<Dayjs | null>(null);\n const preview = React.useMemo<MGHDateRange>(() => {\n if (!showRangePreview || !hoveredDay || disabled || readOnly) return EMPTY_RANGE;\n if (rangePosition === 'end' && start && !end) {\n return isBeforeDay(hoveredDay, start) ? EMPTY_RANGE : [start, hoveredDay];\n }\n if (rangePosition === 'start' && end && !start) {\n return isAfterDay(hoveredDay, end) ? EMPTY_RANGE : [hoveredDay, end];\n }\n return EMPTY_RANGE;\n }, [showRangePreview, hoveredDay, rangePosition, start, end, disabled, readOnly]);\n\n /* ---- selection (MUI semantics) ---- */\n const selectDay = React.useCallback(\n (day: Dayjs) => {\n if (disabled || readOnly) return;\n if (isDayDisabled(day, rangePosition, validation)) return;\n let next: MGHDateRange;\n let nextPosition: MGHDateRangePosition;\n if (rangePosition === 'start') {\n // Picking a start after the current end resets the end (MUI behaviour).\n next = [day, end && isAfterDay(day, end) ? null : end];\n nextPosition = 'end';\n } else if (start && isBeforeDay(day, start)) {\n // An \"end\" before the start becomes the new start; keep asking for the end.\n next = [day, null];\n nextPosition = 'end';\n } else {\n next = [start, day];\n nextPosition = 'start';\n }\n if (!isControlled) setInternalValue(next);\n onChange?.(next, day, rangePosition);\n setRangePosition(nextPosition);\n },\n [disabled, readOnly, rangePosition, validation, end, start, isControlled, onChange, setRangePosition]\n );\n\n /* ---- keyboard navigation (roving tabindex) ---- */\n const [focusedDay, setFocusedDay] = React.useState<Dayjs>(() => start ?? end ?? referenceDate ?? dayjs());\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const pendingFocusRef = React.useRef(autoFocus);\n\n const focusDay = React.useCallback((day: Dayjs) => {\n const key = day.format('YYYY-MM-DD');\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-day=\"${key}\"]`);\n el?.focus();\n }, []);\n\n React.useEffect(() => {\n if (!pendingFocusRef.current) return;\n pendingFocusRef.current = false;\n const target = focusedDay;\n ensureVisible(target);\n // Wait for a potential month change to render.\n const id = window.setTimeout(() => focusDay(target), 0);\n return () => window.clearTimeout(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const moveFocus = (day: Dayjs) => {\n setFocusedDay(day);\n ensureVisible(day);\n window.setTimeout(() => focusDay(day), 0);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>, day: Dayjs) => {\n let next: Dayjs | null = null;\n switch (event.key) {\n case 'ArrowLeft':\n next = day.subtract(1, 'day');\n break;\n case 'ArrowRight':\n next = day.add(1, 'day');\n break;\n case 'ArrowUp':\n next = day.subtract(7, 'day');\n break;\n case 'ArrowDown':\n next = day.add(7, 'day');\n break;\n case 'Home':\n next = day.startOf('week');\n break;\n case 'End':\n next = day.endOf('week');\n break;\n case 'PageUp':\n next = event.shiftKey ? day.subtract(1, 'year') : day.subtract(1, 'month');\n break;\n case 'PageDown':\n next = event.shiftKey ? day.add(1, 'year') : day.add(1, 'month');\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n selectDay(day);\n return;\n default:\n return;\n }\n event.preventDefault();\n if (next) moveFocus(next);\n };\n\n const weekDays = React.useMemo(() => getWeekDayLabels(dayOfWeekFormatter), [dayOfWeekFormatter]);\n const today = dayjs();\n const previewStart = preview[0];\n const previewEnd = preview[1];\n const isRangeComplete = !!start && !!end;\n\n const renderMonth = (month: Dayjs, index: number) => {\n const weeks = getMonthWeeks(month, fixedWeekNumber);\n const isFirst = index === 0;\n const isLast = index === visibleMonths.length - 1;\n const focusedInMonth = focusedDay.isSame(month, 'month') ? focusedDay : null;\n const tabbableDay =\n focusedInMonth ??\n (start && start.isSame(month, 'month') ? start : null) ??\n (end && end.isSame(month, 'month') ? end : null) ??\n (isFirst && !visibleMonths.some((m) => focusedDay.isSame(m, 'month')) ? month.startOf('month') : null);\n\n return (\n <div\n key={month.format('YYYY-MM')}\n className=\"mgh-drp-calendar\"\n role=\"group\"\n aria-label={month.format('MMMM YYYY')}\n >\n <div className=\"mgh-drp-calendar-header\">\n {isFirst ? (\n <button\n type=\"button\"\n className=\"mgh-drp-btn mgh-drp-btn--icon\"\n aria-label={localeText?.previousMonth ?? 'Previous month'}\n title={localeText?.previousMonth ?? 'Previous month'}\n disabled={disabled || !canGoPrev}\n onClick={() => changeMonth(currentMonth.subtract(1, 'month'))}\n >\n <ChevronLeftIcon />\n </button>\n ) : (\n <span className=\"mgh-drp-calendar-nav-spacer\" />\n )}\n <div className=\"mgh-drp-calendar-label\" aria-live=\"polite\">\n {month.format('MMMM YYYY')}\n </div>\n {isLast ? (\n <button\n type=\"button\"\n className=\"mgh-drp-btn mgh-drp-btn--icon\"\n aria-label={localeText?.nextMonth ?? 'Next month'}\n title={localeText?.nextMonth ?? 'Next month'}\n disabled={disabled || !canGoNext}\n onClick={() => changeMonth(currentMonth.add(1, 'month'))}\n >\n <ChevronRightIcon />\n </button>\n ) : (\n <span className=\"mgh-drp-calendar-nav-spacer\" />\n )}\n </div>\n <div className=\"mgh-drp-weekdays\" role=\"row\">\n {weekDays.map((wd) => (\n <span key={wd.key} className=\"mgh-drp-weekday\" role=\"columnheader\" aria-label={wd.full}>\n {wd.label}\n </span>\n ))}\n </div>\n <div className=\"mgh-drp-weeks\" role=\"grid\" aria-label={month.format('MMMM YYYY')}>\n {weeks.map((week) => (\n <div key={week.key} className=\"mgh-drp-week\" role=\"row\">\n {week.days.map(({ day, outsideMonth }, dayIndex) => {\n const hidden = outsideMonth && !showDaysOutsideCurrentMonth;\n const isStart = isSameDay(day, start);\n const isEnd = isSameDay(day, end);\n const selected = isStart || isEnd;\n const inRange = !hidden && isRangeComplete && isWithinRange(day, start, end);\n const inPreview =\n !hidden &&\n !!previewStart &&\n !!previewEnd &&\n isWithinRange(day, previewStart, previewEnd);\n const dayDisabled = disabled || isDayDisabled(day, rangePosition, validation);\n const isTabbable = !!tabbableDay && isSameDay(day, tabbableDay) && !hidden;\n const firstVisible = dayIndex === 0 || (!showDaysOutsideCurrentMonth && day.date() === 1);\n const lastVisible =\n dayIndex === 6 || (!showDaysOutsideCurrentMonth && day.date() === day.daysInMonth());\n return (\n <div\n key={day.format('YYYY-MM-DD')}\n role=\"gridcell\"\n aria-selected={selected || undefined}\n className={cx(\n 'mgh-drp-day-wrap',\n inRange && 'mgh-drp-day-wrap--in-range',\n inRange && isStart && 'mgh-drp-day-wrap--range-start',\n inRange && isEnd && 'mgh-drp-day-wrap--range-end',\n inPreview && 'mgh-drp-day-wrap--preview',\n inPreview && isSameDay(day, previewStart) && 'mgh-drp-day-wrap--preview-start',\n inPreview && isSameDay(day, previewEnd) && 'mgh-drp-day-wrap--preview-end',\n firstVisible && 'mgh-drp-day-wrap--first-visible',\n lastVisible && 'mgh-drp-day-wrap--last-visible'\n )}\n >\n <button\n type=\"button\"\n data-day={day.format('YYYY-MM-DD')}\n tabIndex={isTabbable ? 0 : -1}\n aria-label={day.format('dddd, MMMM D, YYYY')}\n aria-current={\n !disableHighlightToday && isSameDay(day, today) ? 'date' : undefined\n }\n aria-disabled={dayDisabled || undefined}\n disabled={hidden}\n className={cx(\n 'mgh-drp-day',\n hidden && 'mgh-drp-day--hidden',\n outsideMonth && !hidden && 'mgh-drp-day--outside',\n selected && 'mgh-drp-day--selected',\n !disableHighlightToday && isSameDay(day, today) && 'mgh-drp-day--today',\n dayDisabled && 'mgh-drp-day--disabled'\n )}\n onClick={() => selectDay(day)}\n onMouseEnter={() => setHoveredDay(day)}\n onMouseLeave={() =>\n setHoveredDay((prev) => (prev && isSameDay(prev, day) ? null : prev))\n }\n onFocus={() => setFocusedDay(day)}\n onKeyDown={(event) => handleKeyDown(event, day)}\n >\n {day.date()}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n };\n\n return (\n <div\n ref={rootRef}\n className={cx(\n 'mgh-drp-calendars',\n disabled && 'mgh-drp-calendar--disabled',\n readOnly && 'mgh-drp-calendar--read-only',\n className\n )}\n data-mgh-theme={themeMode}\n data-range-position={rangePosition}\n style={style}\n onMouseLeave={() => setHoveredDay(null)}\n >\n {visibleMonths.map(renderMonth)}\n </div>\n );\n}\n\nexport default MGHDateRangeCalendar;\n","import React from 'react';\nimport { createPortal } from 'react-dom';\nimport dayjs from 'dayjs';\nimport type {\n MGHDateRange,\n MGHDateRangeChangeContext,\n MGHDateRangePickerLocaleText,\n MGHDateRangePickerProps,\n MGHDateRangePosition,\n MGHDateRangeShortcut,\n MGHDateRangeValidationError,\n} from './MGHDateRangePicker.types';\nimport { useMGHDateRangePickerStyles } from './MGHDateRangePicker.styles';\nimport { MGHDateRangeCalendar } from './MGHDateRangeCalendar';\nimport { CloseIcon, DateRangeIcon } from './icons';\nimport {\n EMPTY_RANGE,\n clamp,\n cx,\n formatDate,\n isRangeEqual,\n normalizeRange,\n parseDateText,\n splitRangeText,\n validateRange,\n} from './utils';\n\nexport const MGH_DATE_RANGE_PICKER_DEFAULT_LOCALE_TEXT: MGHDateRangePickerLocaleText = {\n start: 'Start',\n end: 'End',\n fieldSeparator: '–',\n openPicker: 'Choose date range',\n clear: 'Clear',\n today: 'Today',\n cancel: 'Cancel',\n accept: 'OK',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n toolbarTitle: 'Select date range',\n};\n\nconst DEFAULT_FORMAT = 'MM/DD/YYYY';\n\n/* -------------------------------------------------------------------------------------------------\n * Anchored popover (portal)\n * ----------------------------------------------------------------------------------------------- */\n\ninterface PopoverProps {\n open: boolean;\n anchorEl: HTMLElement | null;\n placement: 'bottom-start' | 'bottom-end' | 'bottom';\n onDismiss: (reason: 'backdrop' | 'escape') => void;\n themeMode?: 'light' | 'dark';\n className?: string;\n style?: React.CSSProperties;\n labelledBy?: string;\n children: React.ReactNode;\n}\n\nfunction Popover({ open, anchorEl, placement, onDismiss, themeMode, className, style, labelledBy, children }: PopoverProps) {\n const ref = React.useRef<HTMLDivElement | null>(null);\n const [position, setPosition] = React.useState({ top: 0, left: 0, ready: false });\n\n const update = React.useCallback(() => {\n const el = ref.current;\n if (!el) return;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n let top: number;\n let left: number;\n if (anchorEl && anchorEl.isConnected) {\n const a = anchorEl.getBoundingClientRect();\n top = a.bottom + 4;\n if (top + h > vh - 8 && a.top - 4 - h >= 8) top = a.top - 4 - h;\n left = placement === 'bottom-end' ? a.right - w : placement === 'bottom' ? a.left + a.width / 2 - w / 2 : a.left;\n } else {\n top = vh / 2 - h / 2;\n left = vw / 2 - w / 2;\n }\n top = clamp(top, 8, Math.max(8, vh - h - 8));\n left = clamp(left, 8, Math.max(8, vw - w - 8));\n setPosition((prev) => (prev.ready && prev.top === top && prev.left === left ? prev : { top, left, ready: true }));\n }, [anchorEl, placement]);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPosition((prev) => (prev.ready ? { ...prev, ready: false } : prev));\n return undefined;\n }\n update();\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n let observer: ResizeObserver | null = null;\n if (typeof ResizeObserver !== 'undefined' && ref.current) {\n observer = new ResizeObserver(() => update());\n observer.observe(ref.current);\n }\n return () => {\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n observer?.disconnect();\n };\n }, [open, update]);\n\n React.useEffect(() => {\n if (!open) return undefined;\n const handlePointerDown = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n if (ref.current?.contains(target)) return;\n if (anchorEl?.contains(target)) return;\n onDismiss('backdrop');\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss('escape');\n };\n document.addEventListener('mousedown', handlePointerDown, true);\n document.addEventListener('touchstart', handlePointerDown, true);\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('mousedown', handlePointerDown, true);\n document.removeEventListener('touchstart', handlePointerDown, true);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open, onDismiss, anchorEl]);\n\n if (!open || typeof document === 'undefined') return null;\n\n return createPortal(\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={labelledBy}\n tabIndex={-1}\n className={cx('mgh-drp-popover', className)}\n data-mgh-theme={themeMode}\n style={{ top: position.top, left: position.left, visibility: position.ready ? 'visible' : 'hidden', ...style }}\n onMouseDown={(event) => event.stopPropagation()}\n >\n {children}\n </div>,\n document.body\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Outlined text field (MUI TextField look-alike, no dependency)\n * ----------------------------------------------------------------------------------------------- */\n\ninterface TextFieldProps {\n id: string;\n label?: React.ReactNode;\n value: string;\n placeholder?: string;\n size: 'small' | 'medium';\n fullWidth?: boolean;\n multi?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n error?: boolean;\n focused?: boolean;\n clickable?: boolean;\n name?: string;\n autoFocus?: boolean;\n inputRef?: React.Ref<HTMLInputElement>;\n adornment?: React.ReactNode;\n ariaLabel?: string;\n onChange: (text: string) => void;\n onFocus: () => void;\n onBlur: () => void;\n onClick?: () => void;\n onKeyDown?: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst TextField = React.forwardRef<HTMLDivElement, TextFieldProps>(function TextField(\n {\n id,\n label,\n value,\n placeholder,\n size,\n fullWidth,\n multi,\n disabled,\n readOnly,\n required,\n error,\n focused,\n clickable,\n name,\n autoFocus,\n inputRef,\n adornment,\n ariaLabel,\n onChange,\n onFocus,\n onBlur,\n onClick,\n onKeyDown,\n },\n ref\n) {\n const hasLabel = label != null && label !== '';\n const shrink = focused || value !== '' || !hasLabel;\n return (\n <div\n ref={ref}\n className={cx(\n 'mgh-drp-field',\n `mgh-drp-field--${size}`,\n fullWidth && 'mgh-drp-field--full-width',\n multi && 'mgh-drp-field--multi',\n shrink && 'mgh-drp-field--shrink',\n focused && 'mgh-drp-field--focused',\n disabled && 'mgh-drp-field--disabled',\n error && 'mgh-drp-field--error',\n clickable && 'mgh-drp-field--clickable',\n !hasLabel && 'mgh-drp-field--no-label',\n !!adornment && 'mgh-drp-field--adorned'\n )}\n onClick={onClick}\n >\n {hasLabel && (\n <label className=\"mgh-drp-label\" htmlFor={id}>\n {label}\n {required && (\n <span className=\"mgh-drp-label-asterisk\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n <input\n id={id}\n ref={inputRef}\n name={name}\n className=\"mgh-drp-input\"\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n spellCheck={false}\n value={value}\n placeholder={shrink ? placeholder : undefined}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n aria-label={ariaLabel}\n aria-invalid={error || undefined}\n onChange={(event) => onChange(event.target.value)}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n {adornment && <div className=\"mgh-drp-adornment\">{adornment}</div>}\n <fieldset aria-hidden=\"true\" className=\"mgh-drp-outline\">\n <legend>\n <span>\n {hasLabel ? label : ''}\n {hasLabel && required ? ' *' : ''}\n </span>\n </legend>\n </fieldset>\n </div>\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * MGHDateRangePicker\n * ----------------------------------------------------------------------------------------------- */\n\ntype FocusedInput = 'single' | 'start' | 'end' | null;\n\n/**\n * MUI-free port of MUI X Pro's `DateRangePicker` (desktop variant): an outlined text field with a\n * calendar button that opens a two-month range calendar, optional shortcuts and an action bar.\n * Values are dayjs `[start, end]` tuples so existing `DateRange<Dayjs>` state works unchanged.\n */\nexport const MGHDateRangePicker = React.forwardRef<HTMLDivElement, MGHDateRangePickerProps>(function MGHDateRangePicker(\n {\n value: valueProp,\n defaultValue,\n onChange,\n onAccept,\n onError,\n open: openProp,\n onOpen,\n onClose,\n rangePosition: rangePositionProp,\n onRangePositionChange,\n label,\n format = DEFAULT_FORMAT,\n fieldVariant = 'single',\n size = 'small',\n fullWidth = false,\n clearable = false,\n openOnClick,\n disableOpenPicker = false,\n closeOnSelect,\n shortcuts,\n actions = [],\n showToolbar = false,\n localeText: localeTextProp,\n calendars = 2,\n referenceDate,\n minDate,\n maxDate,\n disablePast,\n disableFuture,\n shouldDisableDate,\n disabled = false,\n readOnly = false,\n showDaysOutsideCurrentMonth,\n fixedWeekNumber,\n dayOfWeekFormatter,\n disableHighlightToday,\n showRangePreview,\n onMonthChange,\n name,\n id: idProp,\n placeholder: placeholderProp,\n required,\n error: errorProp,\n helperText,\n autoFocus,\n inputRef,\n themeMode,\n themeVars,\n className,\n style,\n popoverClassName,\n popoverStyle,\n placement = 'bottom-start',\n },\n ref\n) {\n useMGHDateRangePickerStyles();\n\n const localeText = React.useMemo(\n () => ({ ...MGH_DATE_RANGE_PICKER_DEFAULT_LOCALE_TEXT, ...localeTextProp }),\n [localeTextProp]\n );\n const datePlaceholder = localeText.datePlaceholder ?? format;\n const isMulti = fieldVariant === 'multi';\n const resolvedOpenOnClick = openOnClick ?? isMulti;\n const resolvedCloseOnSelect = closeOnSelect ?? !actions.includes('accept');\n\n const reactId = React.useId();\n const baseId = idProp ?? `mgh-drp-${reactId.replace(/:/g, '')}`;\n const startId = isMulti ? `${baseId}-start` : baseId;\n const endId = `${baseId}-end`;\n const dialogTitleId = `${baseId}-title`;\n\n /* ---- value ---- */\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = React.useState<MGHDateRange>(() =>\n normalizeRange(defaultValue ?? EMPTY_RANGE)\n );\n const value = React.useMemo(\n () => (isControlled ? normalizeRange(valueProp) : internalValue),\n [isControlled, valueProp, internalValue]\n );\n const [start, end] = value;\n\n const validation = React.useMemo(\n () => ({ minDate, maxDate, disablePast, disableFuture, shouldDisableDate }),\n [minDate, maxDate, disablePast, disableFuture, shouldDisableDate]\n );\n const validationError = React.useMemo(() => validateRange(value, validation), [value, validation]);\n const isValid = React.useCallback(\n (range: MGHDateRange) => validateRange(range, validation).every((e) => e == null),\n [validation]\n );\n\n const lastErrorRef = React.useRef<[MGHDateRangeValidationError, MGHDateRangeValidationError] | null>(null);\n React.useEffect(() => {\n const prev = lastErrorRef.current;\n if (prev && prev[0] === validationError[0] && prev[1] === validationError[1]) return;\n if (prev !== null || validationError[0] || validationError[1]) onError?.(validationError, value);\n lastErrorRef.current = validationError;\n }, [validationError, value, onError]);\n\n const setValue = React.useCallback(\n (next: MGHDateRange, shortcut?: MGHDateRangeShortcut) => {\n if (!isControlled) setInternalValue(next);\n const context: MGHDateRangeChangeContext = { validationError: validateRange(next, validation) };\n if (shortcut) context.shortcut = shortcut;\n onChange?.(next, context);\n },\n [isControlled, onChange, validation]\n );\n\n /* ---- range position ---- */\n const [internalPosition, setInternalPosition] = React.useState<MGHDateRangePosition>('start');\n const rangePosition = rangePositionProp ?? internalPosition;\n const setRangePosition = React.useCallback(\n (position: MGHDateRangePosition) => {\n if (rangePositionProp === undefined) setInternalPosition(position);\n onRangePositionChange?.(position);\n },\n [rangePositionProp, onRangePositionChange]\n );\n\n /* ---- open / close ---- */\n const isOpenControlled = openProp !== undefined;\n const [internalOpen, setInternalOpen] = React.useState(false);\n const open = isOpenControlled ? !!openProp : internalOpen;\n const valueAtOpenRef = React.useRef<MGHDateRange>(value);\n const lastAcceptedRef = React.useRef<MGHDateRange>(value);\n\n /** Fires `onAccept` only when the value differs from the last accepted one (MUI semantics). */\n const accept = React.useCallback(\n (next: MGHDateRange, force = false) => {\n if (!force && isRangeEqual(next, lastAcceptedRef.current)) return;\n lastAcceptedRef.current = next;\n onAccept?.(next);\n },\n [onAccept]\n );\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const toggleRef = React.useRef<HTMLButtonElement | null>(null);\n const restoreFocusRef = React.useRef<HTMLElement | null>(null);\n\n // Without an explicit `themeMode`, follow the closest `[data-mgh-theme]` ancestor (e.g. a dark MGHGrid card)\n // so the portaled popover matches the surface the field sits on.\n const [inheritedTheme, setInheritedTheme] = React.useState<'light' | 'dark' | undefined>(undefined);\n React.useEffect(() => {\n if (themeMode !== undefined) return;\n const attr = rootRef.current?.parentElement?.closest('[data-mgh-theme]')?.getAttribute('data-mgh-theme');\n setInheritedTheme(attr === 'dark' ? 'dark' : attr === 'light' ? 'light' : undefined);\n });\n const effectiveThemeMode = themeMode ?? inheritedTheme;\n\n const setRootRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref]\n );\n\n const openPicker = React.useCallback(\n (position?: MGHDateRangePosition) => {\n if (disabled || readOnly || open) return;\n valueAtOpenRef.current = value;\n restoreFocusRef.current = (document.activeElement as HTMLElement | null) ?? null;\n setRangePosition(position ?? (start && !end ? 'end' : 'start'));\n if (!isOpenControlled) setInternalOpen(true);\n onOpen?.();\n },\n [disabled, readOnly, open, value, start, end, setRangePosition, isOpenControlled, onOpen]\n );\n\n const closePicker = React.useCallback(() => {\n if (!open) return;\n if (!isOpenControlled) setInternalOpen(false);\n onClose?.();\n const target = toggleRef.current ?? restoreFocusRef.current;\n window.setTimeout(() => target?.focus?.(), 0);\n }, [open, isOpenControlled, onClose]);\n\n const acceptAndClose = React.useCallback(\n (next: MGHDateRange) => {\n accept(next, true);\n closePicker();\n },\n [accept, closePicker]\n );\n\n const handleDismiss = React.useCallback(() => {\n // Clicking away / Escape keeps whatever was picked (MUI fires onAccept when the value changed).\n accept(value);\n closePicker();\n }, [value, accept, closePicker]);\n\n const handleCalendarChange = React.useCallback(\n (next: MGHDateRange, _day: dayjs.Dayjs, position: MGHDateRangePosition) => {\n setValue(next);\n if (position === 'end' && next[0] && next[1] && resolvedCloseOnSelect) acceptAndClose(next);\n },\n [setValue, resolvedCloseOnSelect, acceptAndClose]\n );\n\n const handleShortcut = (shortcut: MGHDateRangeShortcut) => {\n const next = normalizeRange(shortcut.getValue({ isValid }));\n setValue(next, shortcut);\n setRangePosition('start');\n acceptAndClose(next);\n };\n\n const handleAction = (action: 'clear' | 'today' | 'cancel' | 'accept') => {\n switch (action) {\n case 'clear': {\n setValue(EMPTY_RANGE);\n setRangePosition('start');\n acceptAndClose(EMPTY_RANGE);\n break;\n }\n case 'today': {\n const today = dayjs().startOf('day');\n const next: MGHDateRange = [today, today];\n setValue(next);\n setRangePosition('start');\n if (resolvedCloseOnSelect) acceptAndClose(next);\n break;\n }\n case 'cancel': {\n if (!isRangeEqual(value, valueAtOpenRef.current)) setValue(valueAtOpenRef.current);\n closePicker();\n break;\n }\n case 'accept':\n default:\n acceptAndClose(value);\n }\n };\n\n /* ---- text fields ---- */\n const [focusedInput, setFocusedInput] = React.useState<FocusedInput>(null);\n const formatSingle = React.useCallback(\n (range: MGHDateRange) => {\n const [s, e] = range;\n if (!s && !e) return '';\n return `${s ? formatDate(s, format) : datePlaceholder} ${localeText.fieldSeparator} ${e ? formatDate(e, format) : datePlaceholder}`;\n },\n [format, datePlaceholder, localeText.fieldSeparator]\n );\n\n const [singleText, setSingleText] = React.useState(() => formatSingle(value));\n const [startText, setStartText] = React.useState(() => formatDate(start, format));\n const [endText, setEndText] = React.useState(() => formatDate(end, format));\n const [inputInvalid, setInputInvalid] = React.useState<{ single: boolean; start: boolean; end: boolean }>({\n single: false,\n start: false,\n end: false,\n });\n\n // Keep the text in sync with the value unless the user is typing in that input.\n React.useEffect(() => {\n if (focusedInput !== 'single') {\n setSingleText(formatSingle(value));\n setInputInvalid((prev) => (prev.single ? { ...prev, single: false } : prev));\n }\n if (focusedInput !== 'start') {\n setStartText(formatDate(start, format));\n setInputInvalid((prev) => (prev.start ? { ...prev, start: false } : prev));\n }\n if (focusedInput !== 'end') {\n setEndText(formatDate(end, format));\n setInputInvalid((prev) => (prev.end ? { ...prev, end: false } : prev));\n }\n }, [value, start, end, focusedInput, format, formatSingle]);\n\n const parseSegment = (text: string): { date: dayjs.Dayjs | null; invalid: boolean } => {\n const trimmed = text.trim();\n if (!trimmed || trimmed.toUpperCase() === datePlaceholder.toUpperCase()) return { date: null, invalid: false };\n const parsed = parseDateText(trimmed, format);\n return { date: parsed, invalid: parsed == null };\n };\n\n const handleSingleChange = (text: string) => {\n setSingleText(text);\n const [s, e] = splitRangeText(text);\n const ps = parseSegment(s);\n const pe = parseSegment(e);\n const invalid = ps.invalid || pe.invalid;\n setInputInvalid((prev) => ({ ...prev, single: invalid }));\n if (invalid) return;\n const next: MGHDateRange = [ps.date, pe.date];\n if (!isRangeEqual(next, value)) setValue(next);\n };\n\n const handleSideChange = (side: 'start' | 'end', text: string) => {\n if (side === 'start') setStartText(text);\n else setEndText(text);\n const parsed = parseSegment(text);\n setInputInvalid((prev) => ({ ...prev, [side]: parsed.invalid }));\n if (parsed.invalid) return;\n const next: MGHDateRange = side === 'start' ? [parsed.date, end] : [start, parsed.date];\n if (!isRangeEqual(next, value)) setValue(next);\n };\n\n const handleBlur = (input: Exclude<FocusedInput, null>) => {\n setFocusedInput((prev) => (prev === input ? null : prev));\n // Re-format on blur unless the text could not be parsed (keep it so the user sees the error).\n if (input === 'single' && !inputInvalid.single) setSingleText(formatSingle(value));\n if (input === 'start' && !inputInvalid.start) setStartText(formatDate(start, format));\n if (input === 'end' && !inputInvalid.end) setEndText(formatDate(end, format));\n // Leaving the field commits a typed value (like pressing Enter).\n if (!open) accept(value);\n };\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>, position: MGHDateRangePosition) => {\n if (event.key === 'ArrowDown' && !event.altKey) {\n event.preventDefault();\n openPicker(position);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n if (!open) accept(value);\n }\n };\n\n const clear = (event: React.MouseEvent) => {\n event.stopPropagation();\n setValue(EMPTY_RANGE);\n setRangePosition('start');\n accept(EMPTY_RANGE);\n };\n\n const hasValue = !!start || !!end;\n const hasValidationError = validationError.some((e) => e != null);\n const showError = !!errorProp || hasValidationError || inputInvalid.single || inputInvalid.start || inputInvalid.end;\n\n const openButton = !disableOpenPicker && (\n <button\n ref={toggleRef}\n type=\"button\"\n className={cx('mgh-drp-btn mgh-drp-btn--icon', size === 'small' && 'mgh-drp-btn--small')}\n aria-label={localeText.openPicker}\n title={localeText.openPicker}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n if (open) handleDismiss();\n else openPicker();\n }}\n >\n <DateRangeIcon size={size === 'small' ? 20 : 24} />\n </button>\n );\n\n const clearButton = clearable && hasValue && !disabled && !readOnly && (\n <button\n type=\"button\"\n className={cx('mgh-drp-btn mgh-drp-btn--icon', size === 'small' && 'mgh-drp-btn--small')}\n aria-label={localeText.clear}\n title={localeText.clear}\n onClick={clear}\n >\n <CloseIcon size={size === 'small' ? 18 : 20} />\n </button>\n );\n\n const themeStyle = React.useMemo(\n () => ({ ...(themeVars as React.CSSProperties | undefined), ...style }),\n [themeVars, style]\n );\n const popoverThemeStyle = React.useMemo(\n () => ({ ...(themeVars as React.CSSProperties | undefined), ...popoverStyle }),\n [themeVars, popoverStyle]\n );\n\n /* ---- shortcuts / actions / toolbar ---- */\n const shortcutItems = React.useMemo(\n () =>\n (shortcuts ?? []).map((shortcut, index) => {\n let shortcutValue: MGHDateRange = EMPTY_RANGE;\n try {\n shortcutValue = normalizeRange(shortcut.getValue({ isValid }));\n } catch {\n /* ignore */\n }\n return { shortcut, key: shortcut.id ?? `${shortcut.label}-${index}`, value: shortcutValue };\n }),\n [shortcuts, isValid]\n );\n\n const renderToolbar = () => (\n <div className=\"mgh-drp-toolbar\">\n <p className=\"mgh-drp-toolbar-title\" id={dialogTitleId}>\n {localeText.toolbarTitle}\n </p>\n <div className=\"mgh-drp-toolbar-range\">\n <button\n type=\"button\"\n className={cx(rangePosition === 'start' && 'mgh-drp-toolbar-range--active')}\n onClick={() => setRangePosition('start')}\n >\n {start ? formatDate(start, format) : localeText.start}\n </button>\n <span>{localeText.fieldSeparator}</span>\n <button\n type=\"button\"\n className={cx(rangePosition === 'end' && 'mgh-drp-toolbar-range--active')}\n onClick={() => setRangePosition('end')}\n >\n {end ? formatDate(end, format) : localeText.end}\n </button>\n </div>\n </div>\n );\n\n const renderActions = () =>\n actions.length > 0 && (\n <div className=\"mgh-drp-actions\">\n {actions.map((action) => (\n <button\n key={action}\n type=\"button\"\n className={cx('mgh-drp-btn', (action === 'accept' || action === 'today') && 'mgh-drp-btn--primary')}\n onClick={() => handleAction(action)}\n >\n {localeText[action]}\n </button>\n ))}\n </div>\n );\n\n const calendar = (\n <MGHDateRangeCalendar\n value={value}\n onChange={handleCalendarChange}\n rangePosition={rangePosition}\n onRangePositionChange={setRangePosition}\n calendars={calendars}\n referenceDate={referenceDate}\n minDate={minDate}\n maxDate={maxDate}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n showDaysOutsideCurrentMonth={showDaysOutsideCurrentMonth}\n fixedWeekNumber={fixedWeekNumber}\n dayOfWeekFormatter={dayOfWeekFormatter}\n disableHighlightToday={disableHighlightToday}\n showRangePreview={showRangePreview}\n onMonthChange={onMonthChange}\n localeText={localeText}\n themeMode={effectiveThemeMode}\n autoFocus\n />\n );\n\n /* ---- render ---- */\n const commonFieldProps = {\n size,\n fullWidth,\n disabled,\n readOnly,\n required,\n error: showError,\n };\n\n return (\n <div\n ref={setRootRef}\n className={cx('mgh-drp', fullWidth && 'mgh-drp--full-width', isMulti && 'mgh-drp--multi', className)}\n data-mgh-theme={effectiveThemeMode}\n style={themeStyle}\n >\n {isMulti ? (\n <div className=\"mgh-drp-fields\">\n <TextField\n {...commonFieldProps}\n multi\n id={startId}\n name={name ? `${name}-start` : undefined}\n label={localeText.start}\n value={startText}\n placeholder={placeholderProp ?? datePlaceholder}\n focused={focusedInput === 'start'}\n clickable={resolvedOpenOnClick}\n autoFocus={autoFocus}\n inputRef={inputRef}\n onChange={(text) => handleSideChange('start', text)}\n onFocus={() => {\n setFocusedInput('start');\n setRangePosition('start');\n }}\n onBlur={() => handleBlur('start')}\n onClick={() => resolvedOpenOnClick && openPicker('start')}\n onKeyDown={(event) => handleInputKeyDown(event, 'start')}\n />\n <span className=\"mgh-drp-fields-separator\" aria-hidden=\"true\">\n {localeText.fieldSeparator}\n </span>\n <TextField\n {...commonFieldProps}\n multi\n id={endId}\n name={name ? `${name}-end` : undefined}\n label={localeText.end}\n value={endText}\n placeholder={placeholderProp ?? datePlaceholder}\n focused={focusedInput === 'end'}\n clickable={resolvedOpenOnClick}\n adornment={\n <>\n {clearButton}\n {openButton}\n </>\n }\n onChange={(text) => handleSideChange('end', text)}\n onFocus={() => {\n setFocusedInput('end');\n setRangePosition('end');\n }}\n onBlur={() => handleBlur('end')}\n onClick={() => resolvedOpenOnClick && openPicker('end')}\n onKeyDown={(event) => handleInputKeyDown(event, 'end')}\n />\n </div>\n ) : (\n <TextField\n {...commonFieldProps}\n id={startId}\n name={name}\n label={label}\n value={singleText}\n placeholder={placeholderProp ?? `${datePlaceholder} ${localeText.fieldSeparator} ${datePlaceholder}`}\n focused={focusedInput === 'single'}\n clickable={resolvedOpenOnClick}\n autoFocus={autoFocus}\n inputRef={inputRef}\n ariaLabel={label == null ? localeText.toolbarTitle : undefined}\n adornment={\n <>\n {clearButton}\n {openButton}\n </>\n }\n onChange={handleSingleChange}\n onFocus={() => setFocusedInput('single')}\n onBlur={() => handleBlur('single')}\n onClick={() => resolvedOpenOnClick && openPicker()}\n onKeyDown={(event) => handleInputKeyDown(event, 'start')}\n />\n )}\n {helperText != null && helperText !== '' && (\n <div className={cx('mgh-drp-helper', showError && 'mgh-drp-helper--error')}>{helperText}</div>\n )}\n\n <Popover\n open={open}\n anchorEl={rootRef.current}\n placement={placement}\n onDismiss={handleDismiss}\n themeMode={effectiveThemeMode}\n className={popoverClassName}\n style={popoverThemeStyle}\n labelledBy={showToolbar ? dialogTitleId : undefined}\n >\n <div className={cx('mgh-drp-layout', showToolbar && 'mgh-drp-layout--with-toolbar')}>\n {showToolbar && renderToolbar()}\n <div className=\"mgh-drp-layout-main\">\n {shortcutItems.length > 0 && (\n <ul className=\"mgh-drp-shortcuts\" aria-label=\"Shortcuts\">\n {shortcutItems.map(({ shortcut, key, value: shortcutValue }) => (\n <li key={key}>\n <button\n type=\"button\"\n className={cx(\n 'mgh-drp-shortcut',\n hasValue &&\n isRangeEqual(shortcutValue, value) &&\n 'mgh-drp-shortcut--selected'\n )}\n disabled={disabled || readOnly}\n onClick={() => handleShortcut(shortcut)}\n >\n {shortcut.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n {calendar}\n </div>\n {renderActions()}\n </div>\n </Popover>\n </div>\n );\n});\n\nMGHDateRangePicker.displayName = 'MGHDateRangePicker';\n\nexport default MGHDateRangePicker;\n","import Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\n\nimport { ConfirmDialogProps } from './types';\nimport React from 'react';\n\n// ----------------------------------------------------------------------\n\nexport default function ConfirmDialog({ title, content, action, open, onClose, ...other }: ConfirmDialogProps) {\n return (\n <Dialog fullWidth maxWidth=\"xs\" open={open} onClose={onClose} {...other}>\n <DialogTitle sx={{ pb: 2 }}>{title}</DialogTitle>\n\n {content && <DialogContent sx={{ typography: 'body2' }}> {content} </DialogContent>}\n\n <DialogActions>\n <Button onClick={onClose}>Cancel</Button>\n {action}\n </DialogActions>\n </Dialog>\n );\n}\n","import {\n GridToolbarExportContainer,\n GridCsvExportMenuItem,\n GridExcelExportMenuItem,\n GridPrintExportMenuItem,\n} from '@mui/x-data-grid-premium';\nimport React from 'react';\nimport { ExportContainerProps } from './CustomGridToolbarExport.types';\n\n/// ---------------------------------------------------------------------------------------\n\nexport default function CustomGridToolbarExport({\n csvOptions = { allColumns: true },\n excelOptions = { allColumns: true },\n printOptions,\n // color,\n customMenuItem,\n ...other\n}: ExportContainerProps) {\n return (\n <GridToolbarExportContainer\n {...other}\n // color={color}\n >\n {customMenuItem}\n <GridCsvExportMenuItem options={csvOptions} />\n <GridExcelExportMenuItem options={excelOptions} />\n <GridPrintExportMenuItem options={printOptions} />\n </GridToolbarExportContainer>\n );\n}\n","import { JSX } from 'react';\n\nimport { Dialog, Typography, DialogContent, CircularProgress } from '@mui/material';\nimport React from 'react';\n\n/// ---------------------------------------------------------------------------------------\n\ninterface ExportingProps {\n open: boolean;\n text?: JSX.Element | string;\n}\nexport default function ExportingDialog({\n open,\n text = (\n <>\n Your export is currently being built. Some larger exports can take a couple of minutes to complete. <br />\n <br />\n Please do not close your browser or refresh the page.\n </>\n ),\n}: ExportingProps) {\n return (\n <Dialog open={open} fullWidth sx={{ p: 4 }}>\n <DialogContent sx={{ p: 4, textAlign: 'center' }}>\n <Typography variant=\"subtitle1\" sx={{ mb: 3 }}>\n {text}\n </Typography>\n <CircularProgress />\n </DialogContent>\n </Dialog>\n );\n}\n"],"names":["useResponsive","query","start","end","theme","useTheme","mediaUp","useMediaQuery","breakpoints","up","mediaDown","down","mediaBetween","between","mediaOnly","only","CustomNoRowsOverlay","text","useSettingsContext","themeMode","palette","mode","StyledGridOverlay","styled","display","alignItems","justifyContent","height","fill","fillOpacity","React","createElement","Box","component","alt","src","sx","width","maxWidth","mb","canUseLocalStorage","window","localStorage","readLocalStorage","key","value","getItem","JSON","parse","writeLocalStorage","setItem","stringify","MGHGridToolbar","showColumnsButton","showFilterButton","showExportButton","showQuickFilter","renderOtherButtons","renderDateRange","customMenuItem","showCsvOption","Toolbar","style","Tooltip","title","ColumnsPanelTrigger","render","ToolbarButton","GridViewColumnIcon","fontSize","FilterPanelTrigger","props","state","color","Badge","badgeContent","filterCount","variant","GridFilterListIcon","CustomGridToolbarExport","DataGridQuickFilter","csvOptions","allColumns","excelOptions","printOptions","other","GridToolbarExportContainer","map","el","GridCsvExportMenuItem","options","GridExcelExportMenuItem","GridPrintExportMenuItem","StyledQuickFilter","QuickFilter","StyledToolbarButton","ownerState","gridArea","zIndex","opacity","expanded","pointerEvents","transition","transitions","create","StyledTextField","TextField","overflowX","QuickFilterTrigger","triggerProps","enterDelay","GridSearchIcon","QuickFilterControl","ref","controlProps","inputRef","placeholder","size","slotProps","input","startAdornment","InputAdornment","position","endAdornment","QuickFilterClear","edge","material","marginRight","GridCloseIcon","Iconify","forwardRef","icon","Icon","StyledLabel","lightMode","filledVariant","outlinedVariant","softVariant","defaultStyle","common","white","grey","backgroundColor","primary","border","secondary","alpha","colorStyle","contrastText","main","minWidth","lineHeight","borderRadius","cursor","whiteSpace","textTransform","padding","spacing","typography","pxToRem","fontWeight","fontWeightBold","duration","shorter","Label","children","startIcon","endIcon","iconStyles","objectFit","pl","pr","mr","ml","GROUPING_COLUMN_FIELD","CHECKBOX_FIELD","DETAIL_PANEL_TOGGLE_FIELD","AGGREGATION_FOOTER_ID","INTERNAL_FIELDS","Set","DENSITY_FACTORS","compact","standard","comfortable","DEFAULT_ROW_HEIGHT","DEFAULT_HEADER_HEIGHT","DEFAULT_COLUMN_MIN_WIDTH","isInternalField","field","has","isNil","isEmptyValue","Array","isArray","length","clamp","min","max","Math","cx","classNames","filter","Boolean","join","uniqueId","counter","prefix","getRowIdFromRow","row","getRowId","id","normalizeSelectionModel","allIds","type","ids","forEach","add","toDate","Date","Number","isNaN","getTime","dayjs","isDayjs","isValid","d","parsed","formatDate","withTime","date","format","startOfUnit","startOf","valueOf","isValueOptionObject","option","getOptionValue","col","getOptionLabel","label","String","resolveValueOptions","valueOptions","getCellValue","api","raw","undefined","valueGetter","defaultFormatValue","match","find","isFinite","getFormattedValue","valueFormatter","formattedValueToString","formatted","collator","Intl","Collator","numeric","sensitivity","nilFirst","v1","v2","n1","n2","numberComparator","nil","stringComparator","s1","s2","compare","stringOrNumberComparator","p1","p2","dateComparator","d1","d2","booleanComparator","getDefaultComparator","lower","toLowerCase","hasValue","item","stringFilterOperators","inputType","getApplyFilterFn","needle","indexOf","s","lastIndexOf","requiresFilterValue","set","numberOperator","filterValue","cell","n","numberFilterOperators","a","b","v","dateOperator","filterDate","filterTime","cellDate","getDateFilterOperators","booleanFilterOperators","expected","singleSelectFilterOperators","getColumnFilterOperators","filterOperators","getDefaultFilterOperators","normalizeColumn","isNumber","isBoolean","isActions","headerName","align","headerAlign","sortable","filterable","hideable","resizable","pinnable","groupable","aggregable","editable","disableColumnMenu","disableExport","internalColumn","disableReorder","CHECKBOX_COLUMN_DEF","DETAIL_PANEL_TOGGLE_COLUMN_DEF","UNITLESS_PROPERTIES","isSelectorKey","test","serializeDeclarations","block","Object","keys","property","kebab","replace","m","toKebabCase","formatCssValue","buildScopedCss","scope","out","charAt","inner","declarations","push","selector","scopeSelector","split","part","trim","numericValues","values","BUILT_IN_AGGREGATION_FUNCTIONS","sum","columnTypes","apply","nums","reduce","acc","avg","defined","every","dates","slice","sort","sorted","DEFAULT_LOCALE_TEXT","noRowsLabel","loadingLabel","toolbarColumns","toolbarFilters","toolbarExport","toolbarDensity","toolbarQuickFilterPlaceholder","toolbarQuickFilterLabel","toolbarExportCSV","toolbarExportExcel","toolbarExportPrint","densityCompact","densityStandard","densityComfortable","columnsPanelSearchPlaceholder","columnsPanelShowAll","columnsPanelHideAll","columnsPanelReset","filterPanelAddFilter","filterPanelRemoveAll","filterPanelDeleteIcon","filterPanelColumns","filterPanelOperator","filterPanelValue","filterPanelInputPlaceholder","filterPanelLogicOperator","filterPanelOperatorAnd","filterPanelOperatorOr","columnMenuSortAsc","columnMenuSortDesc","columnMenuUnsort","columnMenuFilter","columnMenuHideColumn","columnMenuManageColumns","columnMenuPinLeft","columnMenuPinRight","columnMenuUnpin","columnMenuGroup","name","columnMenuUngroup","columnMenuAggregation","aggregationMenuItemHeader","aggregationFunctionLabelNone","aggregationFunctionLabelSum","aggregationFunctionLabelAvg","aggregationFunctionLabelMin","aggregationFunctionLabelMax","aggregationFunctionLabelSize","footerRowSelected","count","toLocaleString","footerTotalRows","footerPaginationRowsPerPage","footerPaginationDisplayedRows","from","to","footerPaginationFirstPage","footerPaginationPreviousPage","footerPaginationNextPage","footerPaginationLastPage","checkboxSelectionHeaderName","checkboxSelectionSelectAllRows","checkboxSelectionUnselectAllRows","checkboxSelectionSelectRow","checkboxSelectionUnselectRow","booleanCellTrueLabel","booleanCellFalseLabel","detailPanelToggle","expandDetailPanel","collapseDetailPanel","groupingColumnHeaderName","groupColumn","unGroupColumn","actionsCellMore","columnHeaderSortIconLabel","columnMenuLabel","clearSearch","measureContext","measureText","font","document","canvas","getContext","downloadBlob","blob","fileName","url","URL","createObjectURL","anchor","href","download","body","appendChild","click","setTimeout","removeChild","revokeObjectURL","MGH_GRID_STYLE_ID","MGH_GRID_CSS","injected","useInsertion","useInsertionEffect","useLayoutEffect","useEffect","useMGHGridStyles","injectStyles","getElementById","setAttribute","textContent","head","MGHGridContext","createContext","displayName","useMGHGridContext","ctx","useContext","Error","useLatestRef","useRef","current","useControlledState","controlled","defaultValue","onChange","isControlled","internal","setInternal","useState","valueRef","controlledRef","onChangeRef","useCallback","next","resolved","is","idCounter","buildExportTable","columns","resolveExportColumns","all","getAllColumns","fields","byField","Map","c","f","get","getVisibleColumns","getRowsToExport","getSortedRowIds","rows","getRow","headers","sanitizeFileName","fallback","extension","base","endsWith","defaultFileBase","escapeCsvCell","delimiter","getDataAsCsv","includeHeaders","table","lines","h","cells","useRawValues","UTF8_BOM","fromCharCode","CRC_TABLE","Uint32Array","k","textEncoder","TextEncoder","encodeUtf8","encode","utf8","unescape","encodeURIComponent","Uint8Array","i","charCodeAt","concatBytes","chunks","total","offset","zipStore","entries","localChunks","centralChunks","entry","nameBytes","crc","bytes","crc32","data","local","lv","DataView","buffer","setUint32","setUint16","central","cv","centralDirectory","eocd","ev","concat","INVALID_XML_CHARS","RegExp","escapeXml","stripInvalidXml","columnLetter","index","letters","rem","floor","XML_HEADER","buildSheetXml","columnWidths","rowsXml","rowIndex","inlineString","xmlCells","UTC","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","lastCol","lastRow","cols","w","STYLES_XML","CONTENT_TYPES_XML","ROOT_RELS_XML","WORKBOOK_RELS_XML","buildWorkbookXml","sheetName","buildCoreXml","now","toISOString","APP_XML","buildXlsx","widths","explicit","columnsStyles","r","len","cleaned","sanitizeSheetName","escapeHtml","printGridElement","params","done","onDone","printGridElementUnsafe","error","console","cardElement","hideToolbar","hideFooter","copyStyles","clone","cloneNode","syncFormState","source","target","sourceInputs","querySelectorAll","targetInputs","t","tagName","dst","checked","indeterminate","sourceCanvases","targetCanvases","img","ownerDocument","toDataURL","cssText","replaceWith","remove","classList","removeAttribute","flexGrow","styles","links","doc","styleSheets","sheet","rules","cssRules","rule","collectStyles","iframe","finished","finish","parentNode","win","contentWindow","contentDocument","open","write","close","css","printStyle","pageStyle","h1","className","adoptNode","async","waitForImages","timeoutMs","Promise","resolve","images","complete","remaining","timer","onSettled","clearTimeout","addEventListener","once","onBeforePrint","onafterprint","focus","print","run","keyToString","buildGroupTree","groupingFields","columnsByField","emptyLabel","build","items","depth","parentId","path","buckets","getGroupingValue","groupingValueGetter","keyStr","node","parent","groupingField","groupingKey","groupingLabel","childGroups","leaves","descendants","nodes","collectTreeLeaves","roots","root","aggregateRows","aggregationModel","functions","result","fnName","fn","createIcon","rest","viewBox","focusable","ViewColumnIcon","FilterListIcon","SearchIcon","CloseIcon","DownloadIcon","ArrowUpwardIcon","ArrowDownwardIcon","MoreVertIcon","CheckIcon","ExpandMoreIcon","ChevronRightIcon","ChevronLeftIcon","FirstPageIcon","LastPageIcon","PushPinIcon","DeleteIcon","AddIcon","DensitySmallIcon","DensityMediumIcon","DensityLargeIcon","DragIndicatorIcon","PrintIcon","TableChartIcon","DescriptionIcon","VisibilityOffIcon","FunctionsIcon","WorkspacesIcon","EmptyBoxIcon","Fragment","Button","active","IconButton","TextInput","Select","Field","htmlFor","Checkbox","forwardedRef","innerRef","setRef","Spinner","role","Popover","anchorEl","onClose","placement","autoFocus","ignoreOutsideClickOn","setPosition","top","left","ready","update","vw","innerWidth","vh","innerHeight","offsetWidth","offsetHeight","isConnected","getBoundingClientRect","right","bottom","prev","observer","ResizeObserver","observe","removeEventListener","disconnect","handlePointerDown","event","contains","some","closest","handleKeyDown","querySelector","stop","stopPropagation","createPortal","tabIndex","visibility","onClick","onDoubleClick","onMouseDown","onKeyDown","Menu","first","preventDefault","currentIndex","activeElement","MenuItem","selected","disabled","hideMenu","MenuDivider","MenuSection","MGHGridColumnsButton","localeText","isOpen","preferencePanel","openedPanelValue","hidePreferences","showPreferences","currentTarget","MGHGridFiltersButton","MGHGridDensitySelector","setAnchor","o","density","setDensity","MGHGridExportMenuItem","MGHGridExportMenu","showExcelOption","showPrintOption","rootProps","customItems","Children","child","isValidElement","cloneElement","resolvedPrintOptions","header","exportDataAsCsv","exportDataAsExcel","exportDataAsPrint","MGHGridQuickFilter","debounceMs","alwaysExpanded","externalValue","quickFilterValues","setText","setExpanded","delay","quickFilterDebounceMs","lastExternal","commit","setQuickFilterValues","clear","isExpanded","expand","handleChange","onBlur","blur","showDensitySelector","quickFilterPlaceholder","showColumns","disableColumnSelector","showFilters","disableColumnFilter","showDensity","disableDensitySelector","MGHGridPagination","page","pageSize","paginationModel","rowCount","pageCount","pageSizeOptions","setPageSize","setPage","MGHGridFooter","selectedCount","rowSelectionModel","showSelected","hideFooterSelectedRowCount","showPagination","pagination","hideFooterPagination","showRowCount","hideFooterRowCount","MGHGridColumnsPanel","visibleColumns","visibleFields","useMemo","search","setSearch","model","columnVisibilityModel","filtered","setAll","visible","setColumnVisibilityModel","setColumnVisibility","useDebouncedValue","onCommit","setLocal","TextValueInput","MultiValueInput","column","joined","multiple","selectedOptions","FilterValueInput","operator","InputComponent","Component","applyValue","createFilterItem","MGHGridFilterPanel","filterableColumns","filterModel","logicOperator","targetField","seeded","upsertFilterItem","updateItem","patch","canAddMore","disableMultipleColumnsFiltering","paddingTop","operators","op","showLogic","deleteFilterItem","setFilterLogicOperator","nextColumn","nextOperators","keepOperator","nextOperator","nextIsMulti","currentIsMulti","addItem","setFilterModel","MGHGridColumnMenu","panelAnchorEl","isGroupingColumn","sortItem","sortModel","pinned","isColumnPinned","isGrouped","rowGroupingModel","aggregation","canSort","disableColumnSorting","canFilter","canHide","canPin","disableColumnPinning","canGroup","disableRowGrouping","aggregationFunctions","availableAggregationFunctions","canAggregate","disableAggregation","anchorForPanel","sortColumn","showFilterPanel","transform","pinColumn","unpinColumn","removeRowGroupingCriteria","addRowGroupingCriteria","gap","setAggregationModel","MGHGridNoRowsOverlay","imageSrc","MGHGridLoadingOverlay","MGHGridActionsCellItem","showInMenu","ActionsCell","actions","moreLabel","inline","inMenu","action","EMPTY_ARRAY","EMPTY_OBJECT","EMPTY_MAP","DEFAULT_SORTING_ORDER","DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_FILTER_MODEL","quickFilterExcludeHiddenColumns","sanitizeStyle","toDateInputValue","pad","padStart","MGHGrid","columnsProp","loading","renderHeaderEndContent","renderHeaderCenterContent","disableCard","cardClassName","boxClassName","cardStyle","cardSx","boxStyle","boxSx","themeVars","showToolbar","toolbarProps","slots","noRowsText","localeTextProp","rowHeight","rowHeightProp","columnHeaderHeight","getRowHeight","autoHeight","disableVirtualization","densityProp","onDensityChange","paginationModelProp","onPaginationModelChange","sortModelProp","onSortModelChange","sortingOrder","disableMultipleColumnsSorting","filterModelProp","onFilterModelChange","columnVisibilityModelProp","onColumnVisibilityModelChange","columnVisibilityStorageKey","columnOrderStorageKey","columnWidthStorageKey","pinnedColumnsStorageKey","onColumnOrderChange","onColumnWidthChange","disableColumnResize","disableColumnReorder","pinnedColumns","pinnedColumnsProp","onPinnedColumnsChange","checkboxSelection","checkboxSelectionVisibleOnly","disableRowSelectionOnClick","disableMultipleRowSelection","rowSelectionModelProp","onRowSelectionModelChange","isRowSelectable","keepNonExistentRowsSelected","getRowClassName","onRowClick","onRowDoubleClick","onCellClick","onCellDoubleClick","pinnedRows","getDetailPanelContent","getDetailPanelHeight","detailPanelExpandedRowIds","detailPanelExpandedRowIdsProp","onDetailPanelExpandedRowIdsChange","rowGroupingModelProp","onRowGroupingModelChange","defaultGroupingExpansionDepth","groupingColDef","isGroupExpandedByDefault","aggregationModelProp","onAggregationModelChange","aggregationFunctionsProp","aggregationPosition","processRowUpdate","onProcessRowUpdateError","onCellEditStop","isCellEditable","initialState","apiRef","onStateChange","gridId","reactUseId","useId","useStableId","rootRef","cardRef","scrollerRef","toolbarRef","forceUpdate","setTick","useForceUpdate","latest","getDetails","apiObject","L","apiImpl","rowsById","getRowModels","getAllRowIds","rowEntries","e","getRowNode","nodesById","getSortedRows","sortedLeaves","getVisibleRows","pagedRows","dr","getRowIndexRelativeToVisibleRows","findIndex","updateRows","updates","existing","setRowOverride","orderedUserColumns","visibleUserColumns","getColumn","getColumnIndex","useVisibleColumns","getColumnVisibilityModel","isVisible","setColumnWidth","setColumnIndex","targetIndex","autosizeColumns","side","getPinnedColumns","setPinnedColumns","getSortModel","setSortModel","direction","allowMultipleSorting","getFilterModel","upsertFilterItems","targetColumnField","hideFilterPanel","panel","getSelectedRows","selectedIds","getRowSelectionModel","setRowSelectionModel","normalized","setSelectedIds","selectRow","isSelected","resetSelection","selectRows","isRowSelected","isRowSelectableFn","nextPage","setPaginationModel","nextPageSize","csv","bom","utf8WithBom","Blob","startPrint","toggleDetailPanel","setExpandedDetailPanels","getExpandedDetailPanels","expandedDetailPanels","getRowGroupingModel","setRowGroupingModel","groupingIndex","splice","setRowChildrenExpansion","getRowGroupChildren","groupId","group","groupsById","getAggregationModel","startCellEditMode","stopCellEditMode","ignoreModifications","getCellMode","editing","editingCell","setEditCellValue","setEditValue","getCellParams","buildCellParams","setCellFocus","pendingFocusRef","setFocusedCell","scrollToIndexes","scroll","scroller","scrollLeft","scrollTop","getScrollPosition","rootElementRef","persisted","order","sorting","rowGrouping","controlledExpandedDetail","detailPanel","expandedRowIds","controlledSelection","orderedFields","setOrderedFields","setColumnWidths","dims","dimensions","groupExpansion","setGroupExpansion","setEditingCell","editValue","focusedCell","setPreferencePanel","columnMenu","setColumnMenu","resizingField","setResizingField","printState","setPrintState","printing","drag","setDrag","setScrollTop","scrollRaf","lastClickedIdRef","overrideState","setOverrideState","rowOverrides","viewportWidth","viewportHeight","enabled","setSize","clientWidth","clientHeight","useElementSize","densityFactor","round","headerHeight","userColumns","groupingActive","groupingColumn","single","seen","isColumnVisible","wanted","layout","leftFields","rightFields","visibleByField","center","ordered","computeWidths","available","overrides","Infinity","override","flex","pool","fixedTotal","remainingSpace","remainingFlex","changed","share","fixed","idx","hasPinning","x","leftOffset","isLeft","isRight","isLastLeft","isFirstRight","rightOffset","totalWidth","leftCount","rightCount","allDisplayColumnsByField","activeFilters","quickFilterColumns","filteredEntries","logicAnd","quickAnd","quickFilterLogicOperator","apiRefLocal","quickFns","lowered","getApplyQuickFilterFn","custom","results","compareEntries","sorters","dir","comparator","sortComparator","sortEntries","aggregationActive","isGroupExpanded","leafIds","processed","displayRows","tree","groupingSort","sortGroupTree","compareGroups","sortLeaves","sortLevel","flattenGroupTree","visit","groupNode","toGroupNode","l","childVisible","leaf","leafNode","totalDisplayRows","paginate","ceil","footerAggregates","rowsForFooter","groupAggregatesCache","getGroupAggregates","cached","heights","rowHeights","detailHeights","offsets","hasAuto","dh","virtual","virtualRange","overscan","viewTop","viewBottom","lo","hi","mid","handleScroll","requestAnimationFrame","cancelAnimationFrame","selectionCandidates","selectedCandidateCount","allCandidatesSelected","someCandidatesSelected","updateSelection","updater","selectionModelsEqual","equal","delete","lastId","toggleAllCandidates","allowMultiple","persistOrder","persistWidths","targets","lc","computed","getComputedStyle","fontFamily","cellFont","headerFont","sample","isCellEditableFn","colDef","rowNode","reason","valueParser","parseEditValue","currentValue","applyRowUpdate","newRow","oldRow","then","rowId","catch","valueSetter","previousGroupingKey","formattedValue","hasFocus","cellMode","isEditable","buildRowParams","preventScroll","visibleTop","visibleBottom","scrollIntoView","colIndex","leftPinnedWidth","rightPinnedWidth","visibleLeft","visibleRight","moveFocus","rowDelta","colDelta","absolute","canReorder","resizeRef","totalRowCount","clamped","oldIndex","moveItem","list","unshift","nextItems","withId","random","toString","contextValue","renderCellContent","renderRow","kind","selectable","content","hideCount","hideDescendantCount","paddingLeft","agg","aggregates","sampleRow","cancel","renderEditCell","onValueChange","renderEditor","renderCell","getActions","cellStyle","pinnedClasses","rowIsClickable","renderRowElement","customClass","indexRelativeToCurrentPage","isFirstVisible","isFirst","isLastVisible","isLast","isAuto","minHeight","handleRowSelectionClick","allSelected","shiftKey","ctrlKey","metaKey","isFocused","isEditing","isAggregation","cellClassName","isCheckbox","isDetailToggle","toRenderRow","renderPinnedRows","renderHeaderCell","sortIndex","showMenu","draggable","isDragging","isDropTarget","overField","menuOpen","headerParams","headerClassName","renderHeader","description","onDragStart","dataTransfer","effectAllowed","setData","onDragOver","sourceLc","dropEffect","rect","clientX","onDragLeave","onDrop","handleDrop","targetLc","without","onDragEnd","onPointerDown","handleResizeStart","startX","startWidth","lastWidth","onMove","onUp","ToolbarSlot","toolbar","FooterSlot","footer","NoRowsOverlaySlot","noRowsOverlay","LoadingOverlaySlot","loadingOverlay","mergedToolbarProps","noRowsProps","loadingProps","showNoRows","menuColumn","cardStyles","boxStyles","rootStyles","scopedCss","smDown","grid","pageRows","onScroll","renderBodyRows","detailHeight","detailContent","detailAuto","rowAuto","Provider","MGH_DATE_RANGE_PICKER_STYLE_ID","MGH_DATE_RANGE_PICKER_CSS","useMGHDateRangePickerStyles","DateRangeIcon","extend","customParseFormat","EMPTY_RANGE","toDayjs","isSameDay","isSame","isBeforeDay","isBefore","isAfterDay","isAfter","isWithinRange","day","isRangeEqual","same","y","normalizeRange","parseDateText","trimmed","strict","fallbacks","validateDay","disablePast","disableFuture","minDate","maxDate","shouldDisableDate","validateRange","startError","endError","isDayDisabled","MGH_DATE_RANGE_DEFAULT_SHORTCUTS","getValue","today","endOf","subtract","defaultDayOfWeekFormatter","toUpperCase","MGHDateRangeCalendar","valueProp","rangePosition","rangePositionProp","onRangePositionChange","calendars","referenceDate","readOnly","showDaysOutsideCurrentMonth","fixedWeekNumber","dayOfWeekFormatter","disableHighlightToday","showRangePreview","onMonthChange","internalValue","setInternalValue","internalPosition","setInternalPosition","setRangePosition","validation","currentMonth","setCurrentMonth","visibleMonths","_","lastVisibleMonth","changeMonth","month","ensureVisible","lastSeenRef","canGoPrev","canGoNext","hoveredDay","setHoveredDay","preview","selectDay","nextPosition","focusedDay","setFocusedDay","focusDay","weekDays","formatter","full","getWeekDayLabels","previewStart","previewEnd","isRangeComplete","onMouseLeave","renderMonth","weeks","getMonthWeeks","firstOfMonth","weeksInMonth","diff","weekCount","weekStart","days","outsideMonth","tabbableDay","previousMonth","nextMonth","wd","week","dayIndex","hidden","isStart","isEnd","inRange","inPreview","dayDisabled","isTabbable","firstVisible","lastVisible","daysInMonth","onMouseEnter","onFocus","MGH_DATE_RANGE_PICKER_DEFAULT_LOCALE_TEXT","fieldSeparator","openPicker","accept","toolbarTitle","onDismiss","labelledBy","fullWidth","multi","required","focused","clickable","adornment","ariaLabel","hasLabel","shrink","inputMode","autoComplete","spellCheck","MGHDateRangePicker","onAccept","onError","openProp","onOpen","fieldVariant","clearable","openOnClick","disableOpenPicker","closeOnSelect","shortcuts","idProp","placeholderProp","errorProp","helperText","popoverClassName","popoverStyle","datePlaceholder","isMulti","resolvedOpenOnClick","resolvedCloseOnSelect","includes","reactId","baseId","startId","endId","dialogTitleId","validationError","range","lastErrorRef","setValue","shortcut","context","isOpenControlled","internalOpen","setInternalOpen","valueAtOpenRef","lastAcceptedRef","force","toggleRef","restoreFocusRef","inheritedTheme","setInheritedTheme","attr","parentElement","getAttribute","effectiveThemeMode","setRootRef","closePicker","acceptAndClose","handleDismiss","handleCalendarChange","_day","focusedInput","setFocusedInput","formatSingle","singleText","setSingleText","startText","setStartText","endText","setEndText","inputInvalid","setInputInvalid","parseSegment","invalid","handleSideChange","handleBlur","handleInputKeyDown","altKey","hasValidationError","showError","openButton","clearButton","themeStyle","popoverThemeStyle","shortcutItems","shortcutValue","calendar","commonFieldProps","parts","splitRangeText","ps","pe","handleShortcut","handleAction","Dialog","DialogTitle","pb","DialogContent","DialogActions","p","textAlign","Typography","CircularProgress","persistedColumnVisibilityModel","persistedOrderedFields","normalizeOrderedFields","columnFields","resolvedColumnVisibilityModel","handleColumnVisibilityModelChange","details","handleColumnOrderChange","mergedInitialState","Card","CardHeader","flexWrap","flexDirection","DataGridPremium","disableRowSelectionExcludeModel","exportDataAsPrintTable","headerHtml","bodyHtml","html","cleanup","onload","srcdoc","useMGHGridApiContext","useMGHGridApiRef","useMGHGridLocaleText"],"mappings":"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"}