mgh-components 1.1.1 → 1.1.2

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.esm.js","sources":["../src/hooks/useResponsive.ts","../src/components/CustomNoRowsOverlay/CustomNoRowsOverlay.tsx","../src/components/MGHDataGrid/MGHDataGrid.tsx","../src/components/CustomGridToolbarExport/CustomGridToolbarExport.tsx","../src/components/Confirm-Dialog/confirm-dialog.tsx","../src/components/Exporting/Exporting-Dialog.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"],"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 {\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 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 { 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","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 * 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 MGHGridValidRowModel,\n} from './MGHGrid.types';\nimport {\n AGGREGATION_FOOTER_ID,\n BUILT_IN_AGGREGATION_FUNCTIONS,\n CHECKBOX_COLUMN_WIDTH,\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_FIELD,\n DETAIL_TOGGLE_COLUMN_WIDTH,\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 isInternalField,\n isNil,\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\nconst CHECKBOX_COLUMN: MGHGridColDef = normalizeColumn({\n field: CHECKBOX_FIELD,\n headerName: '',\n width: CHECKBOX_COLUMN_WIDTH,\n minWidth: CHECKBOX_COLUMN_WIDTH,\n maxWidth: CHECKBOX_COLUMN_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\nconst DETAIL_TOGGLE_COLUMN: MGHGridColDef = normalizeColumn({\n field: DETAIL_PANEL_TOGGLE_FIELD,\n headerName: '',\n width: DETAIL_TOGGLE_COLUMN_WIDTH,\n minWidth: DETAIL_TOGGLE_COLUMN_WIDTH,\n maxWidth: DETAIL_TOGGLE_COLUMN_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\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\nconst sanitizeStyle = (style: React.CSSProperties | undefined): React.CSSProperties | undefined => {\n if (!style) return undefined;\n const out: Record<string, any> = {};\n Object.keys(style).forEach((key) => {\n if (key.indexOf('&') !== -1 || key.indexOf(':') !== -1 || key.indexOf(' ') !== -1) return;\n const value = (style as any)[key];\n if (value === null || value === undefined || typeof value === 'object' || typeof value === 'function') 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);\n if (getDetailPanelContent) internal.push(DETAIL_TOGGLE_COLUMN);\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 const smDown = viewportWidth > 0 && viewportWidth < 600;\n\n const grid = (\n <div\n ref={rootRef}\n 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 style={cardStyles}\n >\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)} style={boxStyles}>\n {grid}\n </div>\n </div>\n </MGHGridContext.Provider>\n );\n}\n\nMGHGrid.displayName = 'MGHGrid';\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","MGHDataGrid","header","rows","columns","onRowClick","onRowDoubleClick","pagination","pageSize","slots","slotProps","toolbarProps","initialState","pageSizeOptions","cardSx","flexGrow","boxSx","columnVisibilityModel","onColumnVisibilityModelChange","columnVisibilityStorageKey","columnOrderStorageKey","disableDensitySelector","disableRowSelectionOnClick","disableColumnFilter","disableColumnMenu","disableColumnSelector","checkboxSelectionVisibleOnly","renderHeaderEndContent","renderHeaderCenterContent","noRowsText","checkboxSelection","onRowSelectionModelChange","rowSelectionModel","getRowClassName","getDetailPanelContent","getDetailPanelHeight","loading","isRowSelectable","getRowHeight","showToolbar","hideFooterRowCount","onColumnOrderChange","defaultGroupingExpansionDepth","pinnedRows","keepNonExistentRowsSelected","smDown","persistedColumnVisibilityModel","useMemo","undefined","persistedOrderedFields","normalizeOrderedFields","orderedFields","length","columnFields","Set","map","column","field","filter","has","resolvedColumnVisibilityModel","handleColumnVisibilityModelChange","useCallback","model","details","handleColumnOrderChange","params","event","api","getAllColumns","mergedInitialState","density","paginationModel","filterModel","items","quickFilterExcludeHiddenColumns","Card","pr","CardHeader","title","gap","flexWrap","flexDirection","DataGridPremium","noRowsOverlay","toolbar","MGHGridToolbar","cursor","disableRowSelectionExcludeModel","showColumnsButton","showFilterButton","showExportButton","showQuickFilter","renderOtherButtons","renderDateRange","customMenuItem","showCsvOption","Toolbar","style","Tooltip","ColumnsPanelTrigger","render","ToolbarButton","GridViewColumnIcon","fontSize","FilterPanelTrigger","props","state","color","Badge","badgeContent","filterCount","variant","GridFilterListIcon","CustomGridToolbarExport","DataGridQuickFilter","csvOptions","allColumns","excelOptions","printOptions","other","GridToolbarExportContainer","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","input","startAdornment","InputAdornment","position","endAdornment","QuickFilterClear","edge","material","marginRight","GridCloseIcon","ConfirmDialog","content","action","open","onClose","Dialog","fullWidth","DialogTitle","pb","DialogContent","typography","DialogActions","Button","onClick","ExportingDialog","Fragment","p","textAlign","Typography","CircularProgress","Iconify","forwardRef","icon","Icon","StyledLabel","lightMode","filledVariant","outlinedVariant","softVariant","defaultStyle","common","white","grey","backgroundColor","primary","border","secondary","alpha","colorStyle","contrastText","main","minWidth","lineHeight","borderRadius","whiteSpace","textTransform","padding","spacing","pxToRem","fontWeight","fontWeightBold","duration","shorter","Label","children","startIcon","endIcon","iconStyles","objectFit","pl","mr","ml","GROUPING_COLUMN_FIELD","CHECKBOX_FIELD","DETAIL_PANEL_TOGGLE_FIELD","AGGREGATION_FOOTER_ID","INTERNAL_FIELDS","DENSITY_FACTORS","compact","standard","comfortable","DEFAULT_ROW_HEIGHT","DEFAULT_HEADER_HEIGHT","DEFAULT_COLUMN_MIN_WIDTH","isInternalField","isNil","isEmptyValue","Array","isArray","clamp","min","max","Math","cx","classNames","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","raw","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","disableExport","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","useMGHGridApiContext","useMGHGridLocaleText","localeText","useMGHGridApiRef","useRef","useLatestRef","current","useControlledState","controlled","defaultValue","onChange","isControlled","internal","setInternal","useState","valueRef","controlledRef","onChangeRef","next","resolved","Object","is","idCounter","buildExportTable","resolveExportColumns","all","fields","byField","Map","c","f","get","getVisibleColumns","getRowsToExport","getSortedRowIds","getRow","push","headers","sanitizeFileName","fallback","extension","base","trim","endsWith","defaultFileBase","replace","escapeCsvCell","delimiter","test","getDataAsCsv","includeHeaders","table","lines","h","cells","useRawValues","UTF8_BOM","fromCharCode","CRC_TABLE","Uint32Array","k","textEncoder","TextEncoder","encodeUtf8","encode","utf8","unescape","encodeURIComponent","out","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","depth","parentId","path","buckets","getGroupingValue","groupingValueGetter","keyStr","node","parent","groupingField","groupingKey","groupingLabel","childGroups","leaves","descendants","nodes","collectTreeLeaves","roots","root","aggregateRows","aggregationModel","functions","result","keys","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","active","IconButton","TextInput","Select","Field","htmlFor","Checkbox","indeterminate","forwardedRef","innerRef","setRef","Spinner","role","Popover","anchorEl","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","target","contains","some","closest","handleKeyDown","querySelector","focus","stop","stopPropagation","createPortal","tabIndex","visibility","onDoubleClick","onMouseDown","onKeyDown","Menu","first","querySelectorAll","preventDefault","currentIndex","activeElement","MenuItem","selected","disabled","hideMenu","MenuDivider","MenuSection","MGHGridColumnsButton","isOpen","preferencePanel","openedPanelValue","hidePreferences","showPreferences","currentTarget","MGHGridFiltersButton","MGHGridDensitySelector","setAnchor","o","setDensity","MGHGridExportMenuItem","MGHGridExportMenu","showExcelOption","showPrintOption","rootProps","customItems","Children","child","isValidElement","cloneElement","resolvedPrintOptions","exportDataAsCsv","exportDataAsExcel","exportDataAsPrint","MGHGridQuickFilter","debounceMs","alwaysExpanded","externalValue","quickFilterValues","setText","setExpanded","timer","delay","quickFilterDebounceMs","lastExternal","clearTimeout","commit","split","setQuickFilterValues","clear","isExpanded","expand","handleChange","onBlur","blur","showDensitySelector","quickFilterPlaceholder","showColumns","showFilters","showDensity","MGHGridPagination","page","rowCount","pageCount","setPageSize","setPage","MGHGridFooter","selectedCount","showSelected","hideFooterSelectedRowCount","showPagination","hideFooterPagination","showRowCount","MGHGridColumnsPanel","visibleColumns","visibleFields","search","setSearch","filtered","setAll","visible","setColumnVisibilityModel","checked","setColumnVisibility","useDebouncedValue","onCommit","setLocal","TextValueInput","MultiValueInput","joined","multiple","selectedOptions","FilterValueInput","operator","InputComponent","Component","applyValue","createFilterItem","MGHGridFilterPanel","filterableColumns","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","setAggregationModel","MGHGridNoRowsOverlay","imageSrc","MGHGridLoadingOverlay","MGHGridActionsCellItem","showInMenu","ActionsCell","actions","moreLabel","inline","inMenu","EMPTY_ARRAY","EMPTY_OBJECT","EMPTY_MAP","DEFAULT_SORTING_ORDER","DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_FILTER_MODEL","CHECKBOX_COLUMN","disableReorder","DETAIL_TOGGLE_COLUMN","sanitizeStyle","toDateInputValue","pad","padStart","MGHGrid","columnsProp","disableCard","cardClassName","boxClassName","cardStyle","boxStyle","themeVars","localeTextProp","rowHeight","rowHeightProp","columnHeaderHeight","autoHeight","disableVirtualization","densityProp","onDensityChange","paginationModelProp","onPaginationModelChange","hideFooter","sortModelProp","onSortModelChange","sortingOrder","disableMultipleColumnsSorting","filterModelProp","onFilterModelChange","columnVisibilityModelProp","columnWidthStorageKey","pinnedColumnsStorageKey","onColumnWidthChange","disableColumnResize","disableColumnReorder","pinnedColumns","pinnedColumnsProp","onPinnedColumnsChange","disableMultipleRowSelection","rowSelectionModelProp","onCellClick","onCellDoubleClick","detailPanelExpandedRowIds","detailPanelExpandedRowIdsProp","onDetailPanelExpandedRowIdsChange","rowGroupingModelProp","onRowGroupingModelChange","groupingColDef","isGroupExpandedByDefault","aggregationModelProp","onAggregationModelChange","aggregationFunctionsProp","aggregationPosition","processRowUpdate","onProcessRowUpdateError","onCellEditStop","isCellEditable","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","scroll","scroller","scrollLeft","scrollTop","getScrollPosition","rootElementRef","persisted","order","sorting","rowGrouping","controlledExpandedDetail","detailPanel","expandedRowIds","controlledSelection","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","selector","preventScroll","visibleTop","visibleBottom","scrollIntoView","block","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","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","FooterSlot","footer","NoRowsOverlaySlot","LoadingOverlaySlot","loadingOverlay","mergedToolbarProps","noRowsProps","loadingProps","showNoRows","menuColumn","cardStyles","boxStyles","rootStyles","grid","tagName","pageRows","onScroll","renderBodyRows","detailHeight","detailContent","detailAuto","rowAuto","Provider"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/hooks/useResponsive.ts","../src/components/CustomNoRowsOverlay/CustomNoRowsOverlay.tsx","../src/components/MGHDataGrid/MGHDataGrid.tsx","../src/components/CustomGridToolbarExport/CustomGridToolbarExport.tsx","../src/components/Confirm-Dialog/confirm-dialog.tsx","../src/components/Exporting/Exporting-Dialog.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"],"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 {\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 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 { 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","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"],"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","MGHDataGrid","header","rows","columns","onRowClick","onRowDoubleClick","pagination","pageSize","slots","slotProps","toolbarProps","initialState","pageSizeOptions","cardSx","flexGrow","boxSx","columnVisibilityModel","onColumnVisibilityModelChange","columnVisibilityStorageKey","columnOrderStorageKey","disableDensitySelector","disableRowSelectionOnClick","disableColumnFilter","disableColumnMenu","disableColumnSelector","checkboxSelectionVisibleOnly","renderHeaderEndContent","renderHeaderCenterContent","noRowsText","checkboxSelection","onRowSelectionModelChange","rowSelectionModel","getRowClassName","getDetailPanelContent","getDetailPanelHeight","loading","isRowSelectable","getRowHeight","showToolbar","hideFooterRowCount","onColumnOrderChange","defaultGroupingExpansionDepth","pinnedRows","keepNonExistentRowsSelected","smDown","persistedColumnVisibilityModel","useMemo","undefined","persistedOrderedFields","normalizeOrderedFields","orderedFields","length","columnFields","Set","map","column","field","filter","has","resolvedColumnVisibilityModel","handleColumnVisibilityModelChange","useCallback","model","details","handleColumnOrderChange","params","event","api","getAllColumns","mergedInitialState","density","paginationModel","filterModel","items","quickFilterExcludeHiddenColumns","Card","pr","CardHeader","title","gap","flexWrap","flexDirection","DataGridPremium","noRowsOverlay","toolbar","MGHGridToolbar","cursor","disableRowSelectionExcludeModel","showColumnsButton","showFilterButton","showExportButton","showQuickFilter","renderOtherButtons","renderDateRange","customMenuItem","showCsvOption","Toolbar","style","Tooltip","ColumnsPanelTrigger","render","ToolbarButton","GridViewColumnIcon","fontSize","FilterPanelTrigger","props","state","color","Badge","badgeContent","filterCount","variant","GridFilterListIcon","CustomGridToolbarExport","DataGridQuickFilter","csvOptions","allColumns","excelOptions","printOptions","other","GridToolbarExportContainer","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","input","startAdornment","InputAdornment","position","endAdornment","QuickFilterClear","edge","material","marginRight","GridCloseIcon","ConfirmDialog","content","action","open","onClose","Dialog","fullWidth","DialogTitle","pb","DialogContent","typography","DialogActions","Button","onClick","ExportingDialog","Fragment","p","textAlign","Typography","CircularProgress","Iconify","forwardRef","icon","Icon","StyledLabel","lightMode","filledVariant","outlinedVariant","softVariant","defaultStyle","common","white","grey","backgroundColor","primary","border","secondary","alpha","colorStyle","contrastText","main","minWidth","lineHeight","borderRadius","whiteSpace","textTransform","padding","spacing","pxToRem","fontWeight","fontWeightBold","duration","shorter","Label","children","startIcon","endIcon","iconStyles","objectFit","pl","mr","ml","GROUPING_COLUMN_FIELD","CHECKBOX_FIELD","DETAIL_PANEL_TOGGLE_FIELD","AGGREGATION_FOOTER_ID","INTERNAL_FIELDS","DENSITY_FACTORS","compact","standard","comfortable","DEFAULT_ROW_HEIGHT","DEFAULT_HEADER_HEIGHT","DEFAULT_COLUMN_MIN_WIDTH","isInternalField","isNil","isEmptyValue","Array","isArray","clamp","min","max","Math","cx","classNames","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","raw","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","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","useMGHGridApiContext","useMGHGridLocaleText","localeText","useMGHGridApiRef","useRef","useLatestRef","current","useControlledState","controlled","defaultValue","onChange","isControlled","internal","setInternal","useState","valueRef","controlledRef","onChangeRef","next","resolved","is","idCounter","buildExportTable","resolveExportColumns","all","fields","byField","Map","c","f","get","getVisibleColumns","getRowsToExport","getSortedRowIds","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","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","active","IconButton","TextInput","Select","Field","htmlFor","Checkbox","indeterminate","forwardedRef","innerRef","setRef","Spinner","role","Popover","anchorEl","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","target","contains","some","closest","handleKeyDown","querySelector","focus","stop","stopPropagation","createPortal","tabIndex","visibility","onDoubleClick","onMouseDown","onKeyDown","Menu","first","querySelectorAll","preventDefault","currentIndex","activeElement","MenuItem","selected","disabled","hideMenu","MenuDivider","MenuSection","MGHGridColumnsButton","isOpen","preferencePanel","openedPanelValue","hidePreferences","showPreferences","currentTarget","MGHGridFiltersButton","MGHGridDensitySelector","setAnchor","o","setDensity","MGHGridExportMenuItem","MGHGridExportMenu","showExcelOption","showPrintOption","rootProps","customItems","Children","child","isValidElement","cloneElement","resolvedPrintOptions","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","showFilters","showDensity","MGHGridPagination","page","rowCount","pageCount","setPageSize","setPage","MGHGridFooter","selectedCount","showSelected","hideFooterSelectedRowCount","showPagination","hideFooterPagination","showRowCount","MGHGridColumnsPanel","visibleColumns","visibleFields","search","setSearch","filtered","setAll","visible","setColumnVisibilityModel","checked","setColumnVisibility","useDebouncedValue","onCommit","setLocal","TextValueInput","MultiValueInput","joined","multiple","selectedOptions","FilterValueInput","operator","InputComponent","Component","applyValue","createFilterItem","MGHGridFilterPanel","filterableColumns","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","setAggregationModel","MGHGridNoRowsOverlay","imageSrc","MGHGridLoadingOverlay","MGHGridActionsCellItem","showInMenu","ActionsCell","actions","moreLabel","inline","inMenu","EMPTY_ARRAY","EMPTY_OBJECT","EMPTY_MAP","DEFAULT_SORTING_ORDER","DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_FILTER_MODEL","sanitizeStyle","toDateInputValue","pad","padStart","MGHGrid","columnsProp","disableCard","cardClassName","boxClassName","cardStyle","boxStyle","themeVars","localeTextProp","rowHeight","rowHeightProp","columnHeaderHeight","autoHeight","disableVirtualization","densityProp","onDensityChange","paginationModelProp","onPaginationModelChange","hideFooter","sortModelProp","onSortModelChange","sortingOrder","disableMultipleColumnsSorting","filterModelProp","onFilterModelChange","columnVisibilityModelProp","columnWidthStorageKey","pinnedColumnsStorageKey","onColumnWidthChange","disableColumnResize","disableColumnReorder","pinnedColumns","pinnedColumnsProp","onPinnedColumnsChange","disableMultipleRowSelection","rowSelectionModelProp","onCellClick","onCellDoubleClick","detailPanelExpandedRowIds","detailPanelExpandedRowIdsProp","onDetailPanelExpandedRowIdsChange","rowGroupingModelProp","onRowGroupingModelChange","groupingColDef","isGroupExpandedByDefault","aggregationModelProp","onAggregationModelChange","aggregationFunctionsProp","aggregationPosition","processRowUpdate","onProcessRowUpdateError","onCellEditStop","isCellEditable","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","scroll","scroller","scrollLeft","scrollTop","getScrollPosition","rootElementRef","persisted","order","sorting","rowGrouping","controlledExpandedDetail","detailPanel","expandedRowIds","controlledSelection","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","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","FooterSlot","footer","NoRowsOverlaySlot","LoadingOverlaySlot","loadingOverlay","mergedToolbarProps","noRowsProps","loadingProps","showNoRows","menuColumn","cardStyles","boxStyles","rootStyles","scopedCss","css","grid","tagName","pageRows","onScroll","renderBodyRows","detailHeight","detailContent","detailAuto","rowAuto","Provider"],"mappings":"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"}