@neeyo/mantine-datatable 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/index.d.ts +1112 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles.css +49 -0
- package/dist/styles.layer.css +49 -0
- package/package.json +113 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../package/index.ts","../package/DataTable.tsx","../package/cssVariables.ts","../package/DataTableDragToggleProvider.tsx","../package/DataTableColumns.context.ts","../package/DataTableEmptyRow.tsx","../package/DataTableEmptyState.tsx","../package/icons/IconDatabaseOff.tsx","../package/DataTableFooter.tsx","../package/DataTableFooterCell.tsx","../package/hooks/useColumnResize.ts","../package/hooks/useDataTableColumnPinning.ts","../package/utils.ts","../package/hooks/useDataTableColumnReorder.ts","../package/hooks/useDataTableColumnResize.ts","../package/hooks/useDataTableColumns.ts","../package/hooks/useDataTableColumnToggle.ts","../package/hooks/useDataTableInjectCssVariables.ts","../package/hooks/useIsomorphicLayoutEffect.ts","../package/hooks/useStableValue.ts","../package/hooks/useDataTablePinnedColumns.ts","../package/hooks/useLastSelectionChangeIndex.ts","../package/hooks/useMediaQueries.ts","../package/hooks/useMediaQueriesStringOrFunction.ts","../package/hooks/useMediaQueryStringOrFunction.ts","../package/hooks/useRowExpansion.ts","../package/hooks/useRowExpansionStatus.ts","../package/utilityClasses.ts","../package/DataTableFooterSelectorPlaceholderCell.tsx","../package/DataTableHeader.tsx","../package/DataTableColumnGroupHeaderCell.tsx","../package/DataTableHeaderCell.tsx","../package/DataTableHeaderCellFilter.tsx","../package/icons/IconFilter.tsx","../package/icons/IconFilterFilled.tsx","../package/DataTablePinnableDropdown.tsx","../package/icons/IconArrowLeft.tsx","../package/icons/IconArrowRight.tsx","../package/icons/IconPin.tsx","../package/icons/IconX.tsx","../package/DataTableResizableHeaderHandle.tsx","../package/icons/IconArrowsVertical.tsx","../package/icons/IconArrowUp.tsx","../package/icons/IconGripVertical.tsx","../package/DataTableHeaderSelectorCell.tsx","../package/DataTableLoader.tsx","../package/DataTablePagination.tsx","../package/DataTablePageSizeSelector.tsx","../package/icons/IconSelector.tsx","../package/DataTableRow.tsx","../package/DataTableRowCell.tsx","../package/DataTableRowExpansion.tsx","../package/DataTableRowSelectorCell.tsx","../package/DataTableScrollArea.tsx","../package/DataTableDraggableRow.tsx"],"sourcesContent":["'use client';\n\nexport { DataTable } from './DataTable';\nexport { DataTableDraggableRow } from './DataTableDraggableRow';\nexport * from './hooks/useDataTableColumns';\nexport * from './types';\nexport * from './utils';\n","import { Box, type MantineSize, Table } from '@mantine/core';\nimport { useMergedRef } from '@mantine/hooks';\nimport clsx from 'clsx';\nimport type { RefObject } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { getTableCssVariables } from './cssVariables';\nimport { DataTableColumnsProvider } from './DataTableDragToggleProvider';\nimport { DataTableEmptyRow } from './DataTableEmptyRow';\nimport { DataTableEmptyState } from './DataTableEmptyState';\nimport { DataTableFooter } from './DataTableFooter';\nimport { DataTableHeader } from './DataTableHeader';\nimport { DataTableLoader } from './DataTableLoader';\nimport { DataTablePagination } from './DataTablePagination';\nimport { DataTableRow } from './DataTableRow';\nimport { DataTableScrollArea } from './DataTableScrollArea';\nimport {\n useDataTableColumns,\n useDataTableInjectCssVariables,\n useDataTablePinnedColumns,\n useLastSelectionChangeIndex,\n useRowExpansion,\n} from './hooks';\nimport type { DataTableProps } from './types';\nimport { TEXT_SELECTION_DISABLED } from './utilityClasses';\nimport { differenceBy, flattenColumns, getRecordId, uniqBy } from './utils';\n\nexport function DataTable<T>({\n withTableBorder,\n borderRadius,\n textSelectionDisabled,\n height = '100%',\n minHeight,\n maxHeight,\n shadow,\n verticalAlign = 'center',\n fetching,\n columns,\n storeColumnsKey,\n groups,\n pinFirstColumn,\n pinLastColumn,\n defaultColumnProps,\n defaultColumnRender,\n idAccessor = 'id',\n records,\n selectionTrigger = 'checkbox',\n selectedRecords,\n onSelectedRecordsChange,\n selectionColumnClassName,\n selectionColumnStyle,\n isRecordSelectable,\n selectionCheckboxProps,\n allRecordsSelectionCheckboxProps = { 'aria-label': 'Select all records' },\n getRecordSelectionCheckboxProps = (_, index) => ({ 'aria-label': `Select record ${index + 1}` }),\n sortStatus,\n sortIcons,\n onSortStatusChange,\n horizontalSpacing,\n page,\n onPageChange,\n totalRecords,\n recordsPerPage,\n onRecordsPerPageChange,\n recordsPerPageOptions,\n recordsPerPageLabel = 'Records per page',\n paginationWithEdges,\n paginationWithControls,\n paginationActiveTextColor,\n paginationActiveBackgroundColor,\n paginationSize = 'sm',\n paginationText = ({ from, to, totalRecords }) => `${from} - ${to} / ${totalRecords}`,\n paginationWrapBreakpoint = 'sm',\n getPaginationControlProps = (control) => {\n if (control === 'previous') {\n return { 'aria-label': 'Previous page' };\n } else if (control === 'next') {\n return { 'aria-label': 'Next page' };\n }\n return {};\n },\n getPaginationItemProps,\n renderPagination,\n loaderBackgroundBlur,\n customLoader,\n loaderSize,\n loaderType,\n loaderColor,\n loadingText = '...',\n emptyState,\n noRecordsText = 'No records',\n noRecordsIcon,\n highlightOnHover,\n striped,\n noHeader,\n onRowClick,\n onRowDoubleClick,\n onRowContextMenu,\n onCellClick,\n onCellDoubleClick,\n onCellContextMenu,\n onScroll,\n onScrollToTop,\n onScrollToBottom,\n onScrollToLeft,\n onScrollToRight,\n c,\n backgroundColor,\n borderColor,\n rowBorderColor,\n stripedColor,\n highlightOnHoverColor,\n rowColor,\n rowBackgroundColor,\n rowExpansion,\n rowClassName,\n rowStyle,\n customRowAttributes,\n scrollViewportRef,\n scrollAreaProps,\n tableRef,\n bodyRef,\n m,\n my,\n mx,\n mt,\n mb,\n ml,\n mr,\n className,\n classNames,\n style,\n styles,\n rowFactory,\n tableWrapper,\n ...otherProps\n}: DataTableProps<T>) {\n const flatColumns = useMemo(() => {\n return groups ? flattenColumns(groups) : columns!;\n }, [columns, groups]);\n\n const { refs, onScroll: handleScrollPositionChange } = useDataTableInjectCssVariables({\n scrollCallbacks: {\n onScroll,\n onScrollToTop,\n onScrollToBottom,\n onScrollToLeft,\n onScrollToRight,\n },\n withRowBorders: otherProps.withRowBorders,\n });\n\n const dragToggle = useDataTableColumns({\n key: storeColumnsKey,\n columns: flatColumns,\n headerRef: refs.header as RefObject<HTMLTableSectionElement | null>,\n scrollViewportRef: refs.scrollViewport as RefObject<HTMLElement | null>,\n });\n\n // Use the columns enriched with order/visibility/width from the hook so\n // resize widths actually reach the rendered <th>/<td> cells.\n const effectiveColumns = dragToggle.effectiveColumns;\n\n const mergedTableRef = useMergedRef(refs.table, tableRef);\n const mergedViewportRef = useMergedRef(refs.scrollViewport, scrollViewportRef);\n const internalBodyRef = useRef<HTMLTableSectionElement>(null);\n const mergedBodyRef = useMergedRef(internalBodyRef, bodyRef);\n const rowExpansionInfo = useRowExpansion<T>({ rowExpansion, records, idAccessor });\n\n const { pinnedMap, hasLeftPinned, hasRightPinned } = useDataTablePinnedColumns({\n columns: effectiveColumns,\n theadRef: refs.header as RefObject<HTMLTableSectionElement | null>,\n tbodyRef: internalBodyRef,\n selectionColumnHeaderRef: refs.selectionColumnHeader as RefObject<HTMLTableCellElement | null>,\n selectionVisible: !!selectedRecords,\n pinFirstColumn,\n pinLastColumn,\n });\n\n // Track when we should reset scroll due to pagination, but defer until data is rendered\n const resetScrollPending = useRef(false);\n const prevPageRef = useRef(page);\n const recordsAtPageChangeRef = useRef<typeof records | undefined>(records);\n\n const handlePageChange = useCallback(\n (newPage: number) => {\n resetScrollPending.current = true;\n recordsAtPageChangeRef.current = records;\n onPageChange!(newPage);\n },\n [onPageChange, records]\n );\n\n // Handle externally-driven page changes\n useEffect(() => {\n if (prevPageRef.current !== page) {\n resetScrollPending.current = true;\n recordsAtPageChangeRef.current = records;\n prevPageRef.current = page;\n }\n }, [page, records]);\n\n const recordsLength = records?.length;\n\n // Reset scroll position when changing pages (sync) or when records change (async)\n useLayoutEffect(() => {\n if (!resetScrollPending.current) return;\n if (fetching) return;\n if (records === recordsAtPageChangeRef.current) return;\n\n const viewport = refs.scrollViewport.current;\n if (!viewport) return;\n\n const raf = requestAnimationFrame(() => {\n viewport.scrollTo({ top: 0, left: 0 });\n resetScrollPending.current = false;\n });\n\n return () => cancelAnimationFrame(raf);\n }, [fetching, records, refs.scrollViewport]);\n\n const recordIds = records?.map((record) => getRecordId(record, idAccessor));\n const selectionColumnVisible = !!selectedRecords;\n const selectedRecordIds = selectedRecords?.map((record) => getRecordId(record, idAccessor));\n const hasRecordsAndSelectedRecords =\n recordIds !== undefined && selectedRecordIds !== undefined && selectedRecordIds.length > 0;\n\n const selectableRecords = isRecordSelectable ? records?.filter(isRecordSelectable) : records;\n const selectableRecordIds = selectableRecords?.map((record) => getRecordId(record, idAccessor));\n\n const allSelectableRecordsSelected =\n hasRecordsAndSelectedRecords && selectableRecordIds!.every((id) => selectedRecordIds.includes(id));\n const someRecordsSelected =\n hasRecordsAndSelectedRecords && selectableRecordIds!.some((id) => selectedRecordIds.includes(id));\n\n const handleHeaderSelectionChange = useCallback(() => {\n if (selectedRecords && onSelectedRecordsChange) {\n onSelectedRecordsChange(\n allSelectableRecordsSelected\n ? selectedRecords.filter((record) => !selectableRecordIds!.includes(getRecordId(record, idAccessor)))\n : uniqBy([...selectedRecords, ...selectableRecords!], (record) => getRecordId(record, idAccessor))\n );\n }\n }, [\n allSelectableRecordsSelected,\n idAccessor,\n onSelectedRecordsChange,\n selectableRecordIds,\n selectableRecords,\n selectedRecords,\n ]);\n\n const { lastSelectionChangeIndex, setLastSelectionChangeIndex } = useLastSelectionChangeIndex(recordIds);\n const selectorCellShadowVisible = selectionColumnVisible && !hasLeftPinned;\n\n const marginProperties = { m, my, mx, mt, mb, ml, mr };\n\n const TableWrapper = useCallback(\n ({ children }: { children: React.ReactNode }) => {\n if (tableWrapper) return tableWrapper({ children });\n return children;\n },\n [tableWrapper]\n );\n\n return (\n <DataTableColumnsProvider {...dragToggle} pinnedMap={pinnedMap}>\n <Box\n ref={refs.root}\n {...marginProperties}\n className={clsx(\n 'mantine-datatable',\n { 'mantine-datatable-with-border': withTableBorder },\n className,\n classNames?.root\n )}\n style={[\n (theme) => ({\n ...getTableCssVariables({\n theme,\n c,\n backgroundColor,\n borderColor,\n rowBorderColor,\n stripedColor,\n highlightOnHoverColor,\n }),\n borderRadius: theme.radius[borderRadius as MantineSize] || borderRadius,\n boxShadow: theme.shadows[shadow as MantineSize] || shadow,\n height,\n minHeight,\n maxHeight,\n }),\n style,\n styles?.root,\n {\n position: 'relative',\n },\n ]}\n >\n <DataTableScrollArea\n viewportRef={mergedViewportRef}\n leftShadowBehind={selectionColumnVisible || hasLeftPinned}\n rightShadowBehind={hasRightPinned}\n onScrollPositionChange={handleScrollPositionChange}\n scrollAreaProps={scrollAreaProps}\n >\n <TableWrapper>\n <Table\n ref={mergedTableRef}\n horizontalSpacing={horizontalSpacing}\n className={clsx(\n 'mantine-datatable-table',\n {\n [TEXT_SELECTION_DISABLED]: textSelectionDisabled,\n 'mantine-datatable-vertical-align-top': verticalAlign === 'top',\n 'mantine-datatable-vertical-align-bottom': verticalAlign === 'bottom',\n 'mantine-datatable-selection-column-visible': selectionColumnVisible,\n 'mantine-datatable-resizable-columns': dragToggle.hasResizableColumns,\n 'mantine-datatable-resize-locked': dragToggle.isLocked,\n 'mantine-datatable-resizing': dragToggle.isResizing,\n },\n classNames?.table\n )}\n style={{\n ...styles?.table,\n ...(dragToggle.isLocked ? { tableLayout: 'fixed' } : null),\n ...(dragToggle.tableWidth != null ? { width: `${dragToggle.tableWidth}px` } : null),\n }}\n data-striped={(recordsLength && striped) || undefined}\n data-highlight-on-hover={highlightOnHover || undefined}\n {...otherProps}\n >\n {noHeader ? null : (\n <DataTableColumnsProvider {...dragToggle} pinnedMap={pinnedMap}>\n <DataTableHeader<T>\n ref={refs.header}\n selectionColumnHeaderRef={refs.selectionColumnHeader}\n className={classNames?.header}\n style={styles?.header}\n columns={effectiveColumns}\n defaultColumnProps={defaultColumnProps}\n groups={groups}\n pinnedMap={pinnedMap}\n sortStatus={sortStatus}\n sortIcons={sortIcons}\n onSortStatusChange={onSortStatusChange}\n selectionTrigger={selectionTrigger}\n selectionVisible={selectionColumnVisible}\n selectionChecked={allSelectableRecordsSelected}\n selectionIndeterminate={someRecordsSelected && !allSelectableRecordsSelected}\n onSelectionChange={handleHeaderSelectionChange}\n selectionCheckboxProps={{ ...selectionCheckboxProps, ...allRecordsSelectionCheckboxProps }}\n selectorCellShadowVisible={selectorCellShadowVisible}\n selectionColumnClassName={selectionColumnClassName}\n selectionColumnStyle={selectionColumnStyle}\n withColumnBorders={otherProps.withColumnBorders}\n />\n </DataTableColumnsProvider>\n )}\n <tbody ref={mergedBodyRef}>\n {recordsLength ? (\n records.map((record, index) => {\n const recordId = getRecordId(record, idAccessor);\n const isSelected = selectedRecordIds?.includes(recordId) || false;\n\n let handleSelectionChange: React.MouseEventHandler | undefined;\n\n if (onSelectedRecordsChange && selectedRecords) {\n handleSelectionChange = (e) => {\n if (e.nativeEvent.shiftKey && lastSelectionChangeIndex !== null) {\n const targetRecords = records.filter(\n index > lastSelectionChangeIndex\n ? (rec, idx) =>\n idx >= lastSelectionChangeIndex &&\n idx <= index &&\n (isRecordSelectable ? isRecordSelectable(rec, idx) : true)\n : (rec, idx) =>\n idx >= index &&\n idx <= lastSelectionChangeIndex &&\n (isRecordSelectable ? isRecordSelectable(rec, idx) : true)\n );\n onSelectedRecordsChange(\n isSelected\n ? differenceBy(selectedRecords, targetRecords, (r) => getRecordId(r, idAccessor))\n : uniqBy([...selectedRecords, ...targetRecords], (r) => getRecordId(r, idAccessor))\n );\n } else {\n onSelectedRecordsChange(\n isSelected\n ? selectedRecords.filter((rec) => getRecordId(rec, idAccessor) !== recordId)\n : uniqBy([...selectedRecords, record], (rec) => getRecordId(rec, idAccessor))\n );\n }\n setLastSelectionChangeIndex(index);\n };\n }\n\n return (\n <DataTableRow<T>\n key={recordId as React.Key}\n record={record}\n index={index}\n columns={effectiveColumns}\n defaultColumnProps={defaultColumnProps}\n pinnedMap={pinnedMap}\n defaultColumnRender={defaultColumnRender}\n selectionTrigger={selectionTrigger}\n selectionVisible={selectionColumnVisible}\n selectionChecked={isSelected}\n onSelectionChange={handleSelectionChange}\n isRecordSelectable={isRecordSelectable}\n selectionCheckboxProps={selectionCheckboxProps}\n getSelectionCheckboxProps={getRecordSelectionCheckboxProps}\n onClick={onRowClick}\n onDoubleClick={onRowDoubleClick}\n onCellClick={onCellClick}\n onCellDoubleClick={onCellDoubleClick}\n onContextMenu={onRowContextMenu}\n onCellContextMenu={onCellContextMenu}\n expansion={rowExpansionInfo}\n color={rowColor}\n backgroundColor={rowBackgroundColor}\n className={rowClassName}\n style={rowStyle}\n customAttributes={customRowAttributes}\n selectorCellShadowVisible={selectorCellShadowVisible}\n selectionColumnClassName={selectionColumnClassName}\n selectionColumnStyle={selectionColumnStyle}\n idAccessor={idAccessor as string}\n rowFactory={rowFactory}\n />\n );\n })\n ) : (\n <DataTableEmptyRow />\n )}\n </tbody>\n\n {effectiveColumns.some(({ footer }) => footer) && (\n <DataTableFooter<T>\n ref={refs.footer}\n className={classNames?.footer}\n style={styles?.footer}\n columns={effectiveColumns}\n defaultColumnProps={defaultColumnProps}\n pinnedMap={pinnedMap}\n selectionVisible={selectionColumnVisible}\n selectorCellShadowVisible={selectorCellShadowVisible}\n />\n )}\n </Table>\n </TableWrapper>\n </DataTableScrollArea>\n {!!(page && recordsLength) && (\n <DataTablePagination\n className={classNames?.pagination}\n style={styles?.pagination}\n horizontalSpacing={horizontalSpacing}\n fetching={fetching}\n page={page}\n onPageChange={handlePageChange}\n totalRecords={totalRecords}\n recordsPerPage={recordsPerPage}\n onRecordsPerPageChange={onRecordsPerPageChange}\n recordsPerPageOptions={recordsPerPageOptions}\n recordsPerPageLabel={recordsPerPageLabel}\n paginationWithEdges={paginationWithEdges}\n paginationWithControls={paginationWithControls}\n paginationActiveTextColor={paginationActiveTextColor}\n paginationActiveBackgroundColor={paginationActiveBackgroundColor}\n paginationSize={paginationSize}\n paginationText={paginationText}\n paginationWrapBreakpoint={paginationWrapBreakpoint}\n getPaginationControlProps={getPaginationControlProps}\n getPaginationItemProps={getPaginationItemProps}\n noRecordsText={noRecordsText}\n loadingText={loadingText}\n recordsLength={recordsLength}\n renderPagination={renderPagination}\n />\n )}\n <DataTableLoader\n fetching={fetching}\n backgroundBlur={loaderBackgroundBlur}\n customContent={customLoader}\n size={loaderSize}\n type={loaderType}\n color={loaderColor}\n />\n <DataTableEmptyState icon={noRecordsIcon} text={noRecordsText} active={!fetching && !recordsLength}>\n {emptyState}\n </DataTableEmptyState>\n </Box>\n </DataTableColumnsProvider>\n );\n}\n","import { type MantineColor, type MantineTheme, parseThemeColor } from '@mantine/core';\nimport type { DataTableProps } from './types';\n\nexport function getColor(\n color: MantineColor | undefined | { light: MantineColor; dark: MantineColor },\n theme: MantineTheme,\n colorScheme: 'light' | 'dark'\n) {\n return color\n ? parseThemeColor({\n color: typeof color === 'object' ? color[colorScheme] : color,\n theme,\n }).value\n : undefined;\n}\n\nexport function getTableCssVariables({\n theme,\n c,\n backgroundColor,\n borderColor,\n rowBorderColor,\n stripedColor,\n highlightOnHoverColor,\n}: Pick<\n DataTableProps,\n 'c' | 'backgroundColor' | 'borderColor' | 'rowBorderColor' | 'stripedColor' | 'highlightOnHoverColor'\n> & {\n theme: MantineTheme;\n}) {\n return {\n '--mantine-datatable-color-light': getColor(c, theme, 'light'),\n '--mantine-datatable-color-dark': getColor(c, theme, 'dark'),\n\n '--mantine-datatable-background-color-light': getColor(backgroundColor, theme, 'light'),\n '--mantine-datatable-background-color-dark': getColor(backgroundColor, theme, 'dark'),\n\n '--mantine-datatable-border-color-light': getColor(borderColor, theme, 'light'),\n '--mantine-datatable-border-color-dark': getColor(borderColor, theme, 'dark'),\n\n '--mantine-datatable-row-border-color-light': getColor(rowBorderColor, theme, 'light'),\n '--mantine-datatable-row-border-color-dark': getColor(rowBorderColor, theme, 'dark'),\n\n '--mantine-datatable-striped-color-light': getColor(stripedColor, theme, 'light'),\n '--mantine-datatable-striped-color-dark': getColor(stripedColor, theme, 'dark'),\n\n '--mantine-datatable-highlight-on-hover-color-light': getColor(highlightOnHoverColor, theme, 'light'),\n '--mantine-datatable-highlight-on-hover-color-dark': getColor(highlightOnHoverColor, theme, 'dark'),\n };\n}\n\nexport function getPaginationCssVariables({\n theme,\n paginationActiveTextColor,\n paginationActiveBackgroundColor,\n}: Pick<DataTableProps, 'paginationActiveTextColor' | 'paginationActiveBackgroundColor'> & {\n theme: MantineTheme;\n}) {\n return {\n '--mantine-datatable-pagination-active-text-color-light': getColor(paginationActiveTextColor, theme, 'light'),\n '--mantine-datatable-pagination-active-text-color-dark': getColor(paginationActiveTextColor, theme, 'dark'),\n\n '--mantine-datatable-pagination-active-background-color-light': getColor(\n paginationActiveBackgroundColor,\n theme,\n 'light'\n ),\n '--mantine-datatable-pagination-active-background-color-dark': getColor(\n paginationActiveBackgroundColor,\n theme,\n 'dark'\n ),\n };\n}\n\nexport function getRowCssVariables({\n theme,\n color,\n backgroundColor,\n}: {\n theme: MantineTheme;\n color: MantineColor | undefined | { light: MantineColor; dark: MantineColor };\n backgroundColor: MantineColor | undefined | { light: MantineColor; dark: MantineColor };\n}) {\n return {\n '--mantine-datatable-row-color-light': getColor(color, theme, 'light'),\n '--mantine-datatable-row-color-dark': getColor(color, theme, 'dark'),\n '--mantine-datatable-row-background-color-light': getColor(backgroundColor, theme, 'light'),\n '--mantine-datatable-row-background-color-dark': getColor(backgroundColor, theme, 'dark'),\n };\n}\n","'use client';\n\nimport { type Dispatch, type PropsWithChildren, type SetStateAction, useState } from 'react';\nimport { DataTableColumnsContextProvider } from './DataTableColumns.context';\nimport type { DataTableColumnPinning, DataTableColumnToggle, PinnedColumnInfo } from './hooks';\n\ntype DataTableColumnsProviderProps = PropsWithChildren<{\n columnsOrder: string[];\n setColumnsOrder: (order: string[]) => void;\n resetColumnsOrder: () => void;\n\n columnsToggle: DataTableColumnToggle[];\n setColumnsToggle: (toggle: DataTableColumnToggle[]) => void;\n resetColumnsToggle: () => void;\n\n columnsPinning: DataTableColumnPinning[];\n setColumnsPinning: Dispatch<SetStateAction<DataTableColumnPinning[]>>;\n resetColumnsPinning: () => void;\n\n setColumnWidth: (accessor: string, width: string | number) => void;\n setMultipleColumnWidths: (updates: Array<{ accessor: string; width: string | number }>) => void;\n resetColumnsWidth: () => void;\n\n beginResize: () => void;\n endResize: () => void;\n\n pinnedMap: Map<string, PinnedColumnInfo>;\n}>;\n\nexport const DataTableColumnsProvider = (props: DataTableColumnsProviderProps) => {\n const {\n children,\n columnsOrder,\n setColumnsOrder,\n columnsToggle,\n setColumnsToggle,\n columnsPinning,\n setColumnsPinning,\n\n resetColumnsOrder,\n resetColumnsToggle,\n resetColumnsPinning,\n\n setColumnWidth,\n setMultipleColumnWidths,\n resetColumnsWidth,\n\n beginResize,\n endResize,\n\n pinnedMap,\n } = props;\n\n const [sourceColumn, setSourceColumn] = useState('');\n const [targetColumn, setTargetColumn] = useState('');\n\n const swapColumns = () => {\n if (!columnsOrder || !setColumnsOrder || !sourceColumn || !targetColumn) {\n return;\n }\n\n const sourceInfo = pinnedMap.get(sourceColumn);\n const targetInfo = pinnedMap.get(targetColumn);\n if (sourceInfo?.logicalSide !== targetInfo?.logicalSide) return;\n\n const sourceIndex = columnsOrder.indexOf(sourceColumn);\n const targetIndex = columnsOrder.indexOf(targetColumn);\n\n if (sourceIndex !== -1 && targetIndex !== -1) {\n const newOrder = [...columnsOrder];\n const [removed] = newOrder.splice(sourceIndex, 1);\n newOrder.splice(targetIndex, 0, removed);\n setColumnsOrder(newOrder);\n }\n };\n\n return (\n <DataTableColumnsContextProvider\n value={{\n sourceColumn,\n setSourceColumn,\n targetColumn,\n setTargetColumn,\n columnsToggle,\n setColumnsToggle,\n columnsPinning,\n setColumnsPinning,\n swapColumns,\n resetColumnsOrder,\n resetColumnsToggle,\n resetColumnsPinning,\n\n setColumnWidth,\n setMultipleColumnWidths,\n resetColumnsWidth,\n\n beginResize,\n endResize,\n }}\n >\n {children}\n </DataTableColumnsContextProvider>\n );\n};\n","import { createSafeContext } from '@mantine/core';\nimport type { Dispatch, SetStateAction } from 'react';\nimport type { DataTableColumnPinning, DataTableColumnToggle } from './hooks';\n\ninterface DataTableColumnsContext {\n // accessor of the column which is currently dragged\n sourceColumn: string;\n setSourceColumn: Dispatch<SetStateAction<string>>;\n\n // accessor of the column which is currently hovered\n targetColumn: string;\n setTargetColumn: Dispatch<SetStateAction<string>>;\n\n // swap the source column with the target column\n swapColumns: () => void;\n\n // reset to the default columns order\n resetColumnsOrder: () => void;\n\n columnsToggle: DataTableColumnToggle[];\n setColumnsToggle: (toggle: DataTableColumnToggle[]) => void;\n resetColumnsToggle: () => void;\n\n columnsPinning: DataTableColumnPinning[];\n setColumnsPinning: Dispatch<SetStateAction<DataTableColumnPinning[]>>;\n resetColumnsPinning: () => void;\n\n setColumnWidth: (accessor: string, width: string | number) => void;\n setMultipleColumnWidths: (updates: Array<{ accessor: string; width: string | number }>) => void;\n resetColumnsWidth: () => void;\n\n // Drag lifecycle: snapshot DOM widths, lock the table, then persist on release\n beginResize: () => void;\n endResize: () => void;\n}\n\nexport const [DataTableColumnsContextProvider, useDataTableColumnsContext] = createSafeContext<DataTableColumnsContext>(\n 'useDataTableColumnsContext must be used within DataTableColumnProvider'\n);\n","export function DataTableEmptyRow() {\n return (\n <tr className=\"mantine-datatable-empty-row\">\n <td />\n </tr>\n );\n}\n","import { Center, Text } from '@mantine/core';\nimport { IconDatabaseOff } from './icons/IconDatabaseOff';\n\ntype DataTableEmptyStateProps = React.PropsWithChildren<{\n icon: React.ReactNode | undefined;\n text: string;\n active: boolean;\n}>;\n\nexport function DataTableEmptyState({ icon, text, active, children }: DataTableEmptyStateProps) {\n return (\n <Center className=\"mantine-datatable-empty-state\" data-active={active || undefined}>\n {children || (\n <>\n {icon || (\n <div className=\"mantine-datatable-empty-state-icon\">\n <IconDatabaseOff />\n </div>\n )}\n <Text component=\"div\" size=\"sm\" c=\"dimmed\">\n {text}\n </Text>\n </>\n )}\n </Center>\n );\n}\n","export function IconDatabaseOff() {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12.983 8.978c3.955 -.182 7.017 -1.446 7.017 -2.978c0 -1.657 -3.582 -3 -8 -3c-1.661 0 -3.204 .19 -4.483 .515m-2.783 1.228c-.471 .382 -.734 .808 -.734 1.257c0 1.22 1.944 2.271 4.734 2.74\" />\n <path d=\"M4 6v6c0 1.657 3.582 3 8 3c.986 0 1.93 -.067 2.802 -.19m3.187 -.82c1.251 -.53 2.011 -1.228 2.011 -1.99v-6\" />\n <path d=\"M4 12v6c0 1.657 3.582 3 8 3c3.217 0 5.991 -.712 7.261 -1.74m.739 -3.26v-4\" />\n <path d=\"M3 3l18 18\" />\n </svg>\n );\n}\n","import { type MantineStyleProp, TableTfoot, TableTr } from '@mantine/core';\nimport clsx from 'clsx';\nimport { DataTableFooterCell } from './DataTableFooterCell';\nimport { DataTableFooterSelectorPlaceholderCell } from './DataTableFooterSelectorPlaceholderCell';\nimport type { PinnedColumnInfo } from './hooks';\nimport type { DataTableColumn, DataTableDefaultColumnProps } from './types';\n\ntype DataTableFooterProps<T> = {\n className: string | undefined;\n style: MantineStyleProp | undefined;\n columns: DataTableColumn<T>[];\n defaultColumnProps: DataTableDefaultColumnProps<T> | undefined;\n pinnedMap: Map<string, PinnedColumnInfo>;\n selectionVisible: boolean;\n selectorCellShadowVisible: boolean;\n ref: React.Ref<HTMLTableSectionElement>;\n};\n\nexport function DataTableFooter<T>({\n className,\n style,\n columns,\n defaultColumnProps,\n pinnedMap,\n selectionVisible,\n selectorCellShadowVisible,\n ref,\n}: DataTableFooterProps<T>) {\n return (\n <TableTfoot ref={ref} className={clsx('mantine-datatable-footer', className)} style={style}>\n <TableTr>\n {selectionVisible && <DataTableFooterSelectorPlaceholderCell shadowVisible={selectorCellShadowVisible} />}\n {columns.map(({ hidden, ...columnProps }) => {\n if (hidden) return null;\n\n const {\n accessor,\n visibleMediaQuery,\n textAlign,\n width,\n footer,\n footerClassName,\n footerStyle,\n noWrap,\n ellipsis,\n } = { ...defaultColumnProps, ...columnProps };\n\n return (\n <DataTableFooterCell<T>\n key={accessor as React.Key}\n pinnedInfo={pinnedMap.get(String(accessor))}\n className={footerClassName}\n style={footerStyle}\n visibleMediaQuery={visibleMediaQuery}\n textAlign={textAlign}\n width={width}\n title={footer}\n noWrap={noWrap}\n ellipsis={ellipsis}\n />\n );\n })}\n </TableTr>\n </TableTfoot>\n );\n}\n","import { type MantineStyleProp, type MantineTheme, TableTh } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { PinnedColumnInfo } from './hooks';\nimport { useMediaQueryStringOrFunction } from './hooks';\nimport type { DataTableColumn } from './types';\nimport { ELLIPSIS, NOWRAP, TEXT_ALIGN_CENTER, TEXT_ALIGN_LEFT, TEXT_ALIGN_RIGHT } from './utilityClasses';\n\ntype DataTableFooterCellProps<T> = {\n className: string | undefined;\n style: MantineStyleProp | undefined;\n pinnedInfo: PinnedColumnInfo | undefined;\n visibleMediaQuery: string | ((theme: MantineTheme) => string) | undefined;\n title: React.ReactNode | undefined;\n} & Pick<DataTableColumn<T>, 'noWrap' | 'ellipsis' | 'textAlign' | 'width'>;\n\nexport function DataTableFooterCell<T>({\n className,\n style,\n pinnedInfo,\n visibleMediaQuery,\n title,\n noWrap,\n ellipsis,\n textAlign,\n width,\n}: DataTableFooterCellProps<T>) {\n if (!useMediaQueryStringOrFunction(visibleMediaQuery)) return null;\n return (\n <TableTh\n data-pinned={pinnedInfo?.position}\n data-pinned-shadow={pinnedInfo?.isBoundary ? pinnedInfo.position : undefined}\n className={clsx(\n {\n [NOWRAP]: noWrap || ellipsis,\n [ELLIPSIS]: ellipsis,\n [TEXT_ALIGN_LEFT]: textAlign === 'left',\n [TEXT_ALIGN_CENTER]: textAlign === 'center',\n [TEXT_ALIGN_RIGHT]: textAlign === 'right',\n },\n className\n )}\n style={[\n {\n width,\n minWidth: width,\n maxWidth: width,\n },\n style,\n pinnedInfo && {\n position: 'sticky',\n [pinnedInfo.position]: pinnedInfo.offset,\n overflow: 'visible',\n },\n ]}\n >\n {title}\n </TableTh>\n );\n}\n","import { useCallback, useRef, useState } from 'react';\n\ninterface UseColumnResizeProps {\n onColumnResize: (updates: Array<{ accessor: string; width: string | number }>) => void;\n minColumnWidth?: number;\n}\n\ninterface ResizeState {\n isResizing: boolean;\n startX: number;\n originalWidths: { current: number; next: number };\n currentAccessor: string;\n nextAccessor: string | null;\n}\n\nexport const useColumnResize = ({ onColumnResize, minColumnWidth = 50 }: UseColumnResizeProps) => {\n const [resizeState, setResizeState] = useState<ResizeState | null>(null);\n const currentColumnRef = useRef<HTMLTableCellElement | null>(null);\n const nextColumnRef = useRef<HTMLTableCellElement | null>(null);\n\n const startResize = useCallback(\n (event: React.MouseEvent, currentColumn: HTMLTableCellElement, currentAccessor: string) => {\n event.preventDefault();\n event.stopPropagation();\n\n const nextColumn = currentColumn.nextElementSibling as HTMLTableCellElement | null;\n if (!nextColumn) {\n return false;\n }\n\n const nextAccessor = nextColumn.getAttribute('data-accessor');\n if (!nextAccessor) {\n return false;\n }\n\n const currentWidth = currentColumn.getBoundingClientRect().width;\n const nextWidth = nextColumn.getBoundingClientRect().width;\n\n currentColumnRef.current = currentColumn;\n nextColumnRef.current = nextColumn;\n\n setResizeState({\n isResizing: true,\n startX: event.clientX,\n originalWidths: { current: currentWidth, next: nextWidth },\n currentAccessor,\n nextAccessor,\n });\n\n // Global styles for better UX\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n\n return true;\n },\n []\n );\n\n const updateResize = useCallback(\n (clientX: number) => {\n if (!resizeState || !currentColumnRef.current || !nextColumnRef.current) return;\n\n const deltaX = clientX - resizeState.startX;\n\n // Calculate the actual delta we can apply based on constraints\n const actualDelta = Math.min(\n deltaX,\n resizeState.originalWidths.next - minColumnWidth // Don't shrink next below minimum\n );\n\n const finalCurrentWidth = resizeState.originalWidths.current + actualDelta;\n const finalNextWidth = resizeState.originalWidths.next - actualDelta;\n\n // Apply to DOM for immediate visual feedback\n currentColumnRef.current.style.width = `${finalCurrentWidth}px`;\n nextColumnRef.current.style.width = `${finalNextWidth}px`;\n\n return { finalCurrentWidth, finalNextWidth };\n },\n [resizeState, minColumnWidth]\n );\n\n const endResize = useCallback(() => {\n if (!resizeState || !currentColumnRef.current || !nextColumnRef.current) return;\n\n // Reset global styles\n document.body.style.cursor = 'initial';\n document.body.style.userSelect = 'initial';\n\n // Get final widths\n const currentWidth = currentColumnRef.current.getBoundingClientRect().width;\n const nextWidth = nextColumnRef.current.getBoundingClientRect().width;\n\n // Update through callback\n const updates = [{ accessor: resizeState.currentAccessor, width: `${currentWidth}px` }];\n\n if (resizeState.nextAccessor) {\n updates.push({ accessor: resizeState.nextAccessor, width: `${nextWidth}px` });\n }\n\n onColumnResize(updates);\n\n // Clean up\n setResizeState(null);\n currentColumnRef.current = null;\n nextColumnRef.current = null;\n }, [resizeState, onColumnResize]);\n\n const cancelResize = useCallback(() => {\n if (!resizeState) return;\n\n // Reset global styles\n document.body.style.cursor = 'initial';\n document.body.style.userSelect = 'initial';\n\n // Reset column widths to original values\n if (currentColumnRef.current) {\n currentColumnRef.current.style.width = `${resizeState.originalWidths.current}px`;\n }\n if (nextColumnRef.current) {\n nextColumnRef.current.style.width = `${resizeState.originalWidths.next}px`;\n }\n\n // Clean up\n setResizeState(null);\n currentColumnRef.current = null;\n nextColumnRef.current = null;\n }, [resizeState]);\n\n const resetColumnWidths = useCallback(\n (currentAccessor: string, nextAccessor?: string) => {\n const updates = [{ accessor: currentAccessor, width: 'initial' }];\n if (nextAccessor) {\n updates.push({ accessor: nextAccessor, width: 'initial' });\n }\n onColumnResize(updates);\n },\n [onColumnResize]\n );\n\n return {\n isResizing: !!resizeState,\n startResize,\n updateResize,\n endResize,\n cancelResize,\n resetColumnWidths,\n };\n};\n","import { useLocalStorage } from '@mantine/hooks';\nimport { useEffect, useMemo } from 'react';\nimport type { DataTableColumn } from '../types/DataTableColumn';\nimport { hasStringAccessor, sanitizeStoredArray } from '../utils';\n\nexport type DataTableColumnPinning = {\n accessor: string;\n defaultPinned: 'left' | 'right' | undefined;\n pinnable: boolean;\n pinned: 'left' | 'right' | undefined;\n};\n\n/**\n * Hook to handle column pinning with localStorage persistence.\n * @see https://documatrix.github.io/mantine-datatable/examples/interactive-column-pinning/\n */\nexport function useDataTableColumnPinning<T>({\n key,\n columns = [],\n getInitialValueInEffect = true,\n}: {\n /**\n * The key to use in localStorage to store the columns pinning state.\n */\n key: string | undefined;\n /**\n * Columns definitions.\n */\n columns: DataTableColumn<T>[];\n /**\n * If set to true, value will be updated in useEffect after mount.\n * @default true\n */\n getInitialValueInEffect?: boolean;\n}) {\n // Default columns pinning state\n const defaultColumnsPinning = useMemo(\n () =>\n columns.map((column) => ({\n accessor: column.accessor as string,\n defaultPinned: column.pinned,\n pinnable: !!column.pinnable,\n pinned: column.pinned,\n })),\n [columns]\n );\n\n const [storedColumnsPinning, _setColumnsPinning] = useLocalStorage<DataTableColumnPinning[]>({\n key: key ? `${key}-columns-pinning` : '',\n defaultValue: key ? defaultColumnsPinning : undefined,\n getInitialValueInEffect,\n });\n\n // Guard against malformed persisted state (e.g. a non-array value propagated\n // across tabs via the `storage` event) before any `.map()` / `.forEach()` call.\n const columnsPinning = sanitizeStoredArray<DataTableColumnPinning>(\n storedColumnsPinning,\n defaultColumnsPinning,\n hasStringAccessor\n );\n\n function setColumnsPinning(\n pinning: DataTableColumnPinning[] | ((prev: DataTableColumnPinning[]) => DataTableColumnPinning[])\n ) {\n if (!key) return;\n if (typeof pinning === 'function') {\n _setColumnsPinning((prev) => pinning(prev ?? defaultColumnsPinning));\n } else {\n _setColumnsPinning(pinning);\n }\n }\n\n // Align stored pinning state with current column definitions: drop accessors\n // that no longer exist, append accessors added since last persisted state.\n const alignedColumnsPinning = useMemo(() => {\n if (!columnsPinning) return defaultColumnsPinning;\n const aligned: DataTableColumnPinning[] = [];\n columnsPinning.forEach((col) => {\n if (columns.find((c) => c.accessor === col.accessor)) {\n aligned.push(col);\n }\n });\n columns.forEach((col) => {\n if (!aligned.find((c) => c.accessor === col.accessor)) {\n aligned.push({\n accessor: col.accessor as string,\n defaultPinned: col.pinned,\n pinnable: !!col.pinnable,\n pinned: col.pinned,\n });\n }\n });\n return aligned;\n }, [columnsPinning, columns, defaultColumnsPinning]);\n\n // Persist alignment in an effect — never set state during render\n useEffect(() => {\n if (!key) return;\n if (!columnsPinning) return;\n if (JSON.stringify(alignedColumnsPinning) !== JSON.stringify(columnsPinning)) {\n _setColumnsPinning(alignedColumnsPinning);\n }\n }, [key, alignedColumnsPinning, columnsPinning, _setColumnsPinning]);\n\n const resetColumnsPinning = () => {\n setColumnsPinning(defaultColumnsPinning);\n };\n\n if (!key) {\n return {\n columnsPinning: defaultColumnsPinning,\n setColumnsPinning,\n resetColumnsPinning,\n } as const;\n }\n\n return {\n columnsPinning: alignedColumnsPinning,\n setColumnsPinning,\n resetColumnsPinning,\n } as const;\n}\n","import type { DropResult } from '@hello-pangea/dnd';\nimport type { DataTableColumn, DataTableColumnGroup } from './types';\n\n/**\n * Utility function that returns a humanized version of a string, e.g. \"camelCase\" -> \"Camel Case\"\n */\nexport function humanize(value: string) {\n const str = value\n .replace(/([a-z\\d])([A-Z]+)/g, '$1 $2')\n .replace(/\\W|_/g, ' ')\n .trim()\n .toLowerCase();\n return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n\n/**\n * Sanitizes a value read from `localStorage` before the column hooks call array\n * methods on it.\n *\n * Persisted column state is synchronized across browser tabs through the native\n * `storage` event (e.g. when a tab is duplicated). A malformed or unexpected\n * value — written by another tab, by a different DataTable instance sharing the\n * same `storeColumnsKey`, or by manual tampering — is delivered verbatim to\n * every listening table. Without this guard such a value flows straight into\n * `.map()` / `.forEach()` and crashes the app with\n * `TypeError: <x>.map is not a function`.\n *\n * Returns `value` when it is an array whose items all pass the optional\n * `isValidItem` predicate; otherwise returns `fallback`.\n */\nexport function sanitizeStoredArray<T>(value: unknown, fallback: T[], isValidItem?: (item: unknown) => boolean): T[] {\n if (!Array.isArray(value)) return fallback;\n if (isValidItem && !value.every(isValidItem)) return fallback;\n return value as T[];\n}\n\n/**\n * Predicate matching the `{ accessor: string, ... }` shape persisted for column\n * toggle and pinning state.\n */\nexport function hasStringAccessor(item: unknown): boolean {\n return typeof item === 'object' && item !== null && typeof (item as { accessor?: unknown }).accessor === 'string';\n}\n\n/**\n * Utility function that returns an array of values that are present in the first array but not in the second\n */\nexport function differenceBy<T>(arr1: T[], arr2: T[], iteratee: (value: T) => unknown) {\n return arr1.filter((c) => !arr2.map(iteratee).includes(iteratee(c)));\n}\n\n/**\n * Utility function that returns an array of unique values from a given array\n */\nexport function uniqBy<T>(arr: T[], iteratee: (value: T) => unknown) {\n return arr.filter((x, i, self) => i === self.findIndex((y) => iteratee(x) === iteratee(y)));\n}\n\n/**\n * Utility function that returns the value at a given path in an object\n */\nexport function getValueAtPath<T>(obj: T, path: keyof T | (string & NonNullable<unknown>)) {\n if (!path) return undefined;\n const pathArray = (path as string).match(/([^[.\\]])+/g) as string[];\n return pathArray.reduce((prevObj: unknown, key) => prevObj && (prevObj as Record<string, unknown>)[key], obj);\n}\n\n/**\n * Utility function that returns the record id using idAccessor\n */\nexport function getRecordId<T>(\n record: T,\n idAccessor: keyof T | (string & NonNullable<unknown>) | ((record: T) => React.Key)\n) {\n return typeof idAccessor === 'string'\n ? getValueAtPath(record, idAccessor)\n : (idAccessor as (record: T) => React.Key)(record);\n}\n\n/**\n * Utility function that reorders an array of records by a given field used for drag'n'drop functionality.\n * @see https://github.com/hello-pangea/dnd\n */\nexport function reorderRecords<T>(dropResult: DropResult, records: T[]): T[] {\n const draft = structuredClone(records);\n const prev = draft[dropResult.source.index];\n\n if (dropResult.destination) {\n draft.splice(dropResult.source.index, 1);\n draft.splice(dropResult.destination.index, 0, prev);\n }\n\n return draft;\n}\n\n/**\n * Utility function that swaps elements of an array, by a given result from drag'n'drop functionality.\n * @see https://github.com/hello-pangea/dnd\n */\nexport function swapRecords<T>(dropResult: DropResult, records: T[]): T[] {\n const draft = structuredClone(records);\n\n const destination = dropResult.destination;\n\n if (!destination) return draft;\n\n const sourceEl = draft[dropResult.source.index];\n const destEl = draft[destination.index];\n\n draft.splice(destination.index, 1, sourceEl);\n draft.splice(dropResult.source.index, 1, destEl);\n\n return draft;\n}\n\n/**\n * Calculates the maximum depth of nested column groups\n */\nexport function getMaxGroupDepth<T>(groups: readonly DataTableColumnGroup<T>[]): number {\n if (!groups || groups.length === 0) return 0;\n\n return Math.max(\n ...groups.map((group) => {\n if (group.groups && group.groups.length > 0) {\n return 1 + getMaxGroupDepth(group.groups);\n }\n return 1;\n })\n );\n}\n\n/**\n * Flattens nested column groups to extract all columns at the deepest level\n */\nexport function flattenColumns<T>(groups: DataTableColumnGroup<T>[]): DataTableColumn<T>[] {\n const columns: DataTableColumn<T>[] = [];\n\n for (const group of groups) {\n if (group.columns && group.columns.length > 0) {\n columns.push(...group.columns.filter((col) => col != null));\n } else if (group.groups && group.groups.length > 0) {\n columns.push(...flattenColumns(group.groups));\n }\n }\n\n return columns.filter((col) => col != null);\n}\n\n/**\n * Calculates the column span for a group based on visible columns\n */\nexport function calculateColSpan<T>(group: DataTableColumnGroup<T>, visibles?: (boolean | undefined)[]): number {\n if (group.columns && group.columns.length > 0) {\n return group.columns.filter((column, index) => {\n if (column.hidden) return false;\n return visibles ? visibles[index] !== false : true;\n }).length;\n }\n\n if (group.groups && group.groups.length > 0) {\n return group.groups.reduce((sum, subGroup) => {\n return sum + calculateColSpan(subGroup, visibles);\n }, 0);\n }\n\n return 0;\n}\n\n/**\n * Gets all groups at a specific depth level\n */\nexport function getGroupsAtDepth<T>(\n groups: readonly DataTableColumnGroup<T>[],\n targetDepth: number,\n currentDepth: number = 0\n): DataTableColumnGroup<T>[] {\n if (currentDepth === targetDepth) {\n return [...groups];\n }\n\n const result: DataTableColumnGroup<T>[] = [];\n for (const group of groups) {\n if (group.groups && group.groups.length > 0) {\n result.push(...getGroupsAtDepth(group.groups, targetDepth, currentDepth + 1));\n }\n }\n\n return result;\n}\n\n/**\n * Checks if a group needs a right border based on its position and context\n */\nexport function needsRightBorder(\n isLastGroup: boolean,\n hasMoreColumnsAfter: boolean,\n withColumnBorders: boolean\n): boolean {\n if (!withColumnBorders) return false;\n return !isLastGroup || hasMoreColumnsAfter;\n}\n","import { useLocalStorage } from '@mantine/hooks';\nimport { useEffect, useMemo } from 'react';\nimport type { DataTableColumn } from '../types/DataTableColumn';\nimport { sanitizeStoredArray } from '../utils';\n\n/**\n * Hook to handle column reordering with localStorage persistence.\n * @see https://documatrix.github.io/mantine-datatable/examples/column-dragging-and-toggling/\n */\nexport function useDataTableColumnReorder<T>({\n key,\n columns = [],\n getInitialValueInEffect = true,\n}: {\n /**\n * The key to use in localStorage to store the columns order.\n */\n key: string | undefined;\n /**\n * Columns definitions.\n */\n columns: DataTableColumn<T>[];\n /**\n * If set to true, value will be updated in useEffect after mount.\n * @default true\n */\n getInitialValueInEffect?: boolean;\n}) {\n // Default columns order is the order of the columns in the array\n const defaultColumnsOrder = useMemo(\n () => (columns ? (columns.map((column) => column.accessor) as string[]) : []),\n [columns]\n );\n\n const [storedColumnsOrder, _setColumnsOrder] = useLocalStorage<string[]>({\n key: key ? `${key}-columns-order` : '',\n defaultValue: key ? defaultColumnsOrder : undefined,\n getInitialValueInEffect,\n });\n\n // Guard against malformed persisted state (e.g. a non-array value propagated\n // across tabs via the `storage` event) before any `.map()` / `.forEach()` call.\n const columnsOrder = sanitizeStoredArray<string>(\n storedColumnsOrder,\n defaultColumnsOrder as string[],\n (item) => typeof item === 'string'\n );\n\n function setColumnsOrder(order: string[]) {\n if (key) {\n _setColumnsOrder(order);\n }\n }\n\n // Align stored order with current column definitions: drop accessors that no\n // longer exist, append accessors added since last persisted state.\n const alignedColumnsOrder = useMemo(() => {\n if (!columnsOrder) return defaultColumnsOrder;\n const aligned: string[] = [];\n columnsOrder.forEach((col) => {\n if (columns.find((c) => c.accessor === col)) {\n aligned.push(col);\n }\n });\n columns.forEach((col) => {\n if (!aligned.includes(col.accessor as string)) {\n aligned.push(col.accessor as string);\n }\n });\n return aligned;\n }, [columnsOrder, columns, defaultColumnsOrder]);\n\n // Persist alignment in an effect — never set state during render\n useEffect(() => {\n if (!key) return;\n if (!columnsOrder) return;\n if (JSON.stringify(alignedColumnsOrder) !== JSON.stringify(columnsOrder)) {\n _setColumnsOrder(alignedColumnsOrder);\n }\n }, [key, alignedColumnsOrder, columnsOrder, _setColumnsOrder]);\n\n const resetColumnsOrder = () => {\n setColumnsOrder(defaultColumnsOrder);\n };\n\n if (!key) {\n return {\n columnsOrder,\n setColumnsOrder,\n resetColumnsOrder,\n } as const;\n }\n\n return {\n columnsOrder: alignedColumnsOrder,\n setColumnsOrder,\n resetColumnsOrder,\n } as const;\n}\n","import { useLocalStorage } from '@mantine/hooks';\nimport { type RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DataTableColumn } from '../types/DataTableColumn';\nimport { sanitizeStoredArray } from '../utils';\n\ntype DataTableColumnWidth = Record<string, string | number>;\n\n/**\n * Hook to handle column resizing with localStorage persistence.\n *\n * Strategy (mirrors `mantine-list-view-table`):\n * 1. Until the user grabs a handle, the table stays in `table-layout: auto`\n * so declarative widths — including `width: '0%'` on actions columns —\n * work as documented.\n * 2. On mousedown we snapshot every header cell into pixel widths and switch\n * to `table-layout: fixed` so pixel widths are honored strictly during\n * the drag and afterwards.\n * 3. The lock stays in place until `resetColumnsWidth` is called.\n *\n * @see https://documatrix.github.io/mantine-datatable/examples/column-resizing/\n */\nexport function useDataTableColumnResize<T>({\n key,\n columns = [],\n getInitialValueInEffect = true,\n headerRef,\n}: {\n /** The key to use in localStorage to store the columns width. */\n key: string | undefined;\n /** Columns definitions. */\n columns: DataTableColumn<T>[];\n /**\n * If set to true, value will be updated in useEffect after mount.\n * @default true\n */\n getInitialValueInEffect?: boolean;\n /** Reference to the table header element for measuring column widths. */\n headerRef?: RefObject<HTMLTableSectionElement | null>;\n /**\n * Reference to the scroll viewport for calculating overflow.\n * Kept for backwards compatibility; no longer used internally.\n */\n scrollViewportRef?: RefObject<HTMLElement | null>;\n}) {\n const hasResizableColumns = useMemo(() => {\n return columns.some((c) => c.resizable && !c.hidden && c.accessor !== '__selection__');\n }, [columns]);\n\n const getDefaultColumnsWidth = useCallback(() => {\n return columns\n .filter((column) => column.accessor !== '__selection__')\n .map((column) => ({ [column.accessor]: column.width ?? 'auto' }));\n }, [columns]);\n\n // Honor caller's `getInitialValueInEffect`: when false the read is synchronous\n // and we can seed `effectiveColumnsWidth` directly; when true the value lands\n // after mount and the hydration effect below picks it up.\n const [rawStoredColumnsWidth, setStoredColumnsWidth] = useLocalStorage<DataTableColumnWidth[]>({\n key: key ? `${key}-columns-width` : '',\n defaultValue: key ? getDefaultColumnsWidth() : undefined,\n getInitialValueInEffect,\n });\n\n // Guard against malformed persisted state (e.g. a non-array value propagated\n // across tabs via the `storage` event) before any `.map()` / `.filter()` call.\n const storedColumnsWidth = sanitizeStoredArray<DataTableColumnWidth>(\n rawStoredColumnsWidth,\n [],\n (item) => typeof item === 'object' && item !== null\n );\n\n const [effectiveColumnsWidth, setEffectiveColumnsWidth] = useState<DataTableColumnWidth[]>(() => {\n if (key && storedColumnsWidth.length > 0) {\n return storedColumnsWidth;\n }\n return getDefaultColumnsWidth();\n });\n\n // True only during an active drag — drives cursor / user-select styling\n const [isResizing, setIsResizing] = useState(false);\n\n // Marks effective widths as user-changed so the persistence effect knows to\n // sync them to localStorage. Hydration / column re-alignment never set this.\n const dirtyRef = useRef(false);\n\n // Sync stored → effective whenever the persisted value lands or changes\n // (covers `getInitialValueInEffect: true`, cross-tab updates, etc.).\n // Idempotent: when values are unchanged React bails out of the re-render.\n useEffect(() => {\n if (!key) return;\n if (!storedColumnsWidth || storedColumnsWidth.length === 0) return;\n\n setEffectiveColumnsWidth(storedColumnsWidth);\n }, [key, storedColumnsWidth]);\n\n // Re-align effective state with the current column set: drop entries for\n // removed accessors, add defaults for newly introduced columns. Bails out\n // when nothing actually changed to avoid extra renders.\n useEffect(() => {\n setEffectiveColumnsWidth((prev) => {\n const validAccessors = new Set(\n columns.filter((c) => c.accessor !== '__selection__').map((c) => String(c.accessor))\n );\n const filtered = prev.filter((entry) => validAccessors.has(Object.keys(entry)[0]));\n const present = new Set(filtered.map((entry) => Object.keys(entry)[0]));\n let added = false;\n for (const column of columns) {\n if (column.accessor === '__selection__') continue;\n const accessor = String(column.accessor);\n if (present.has(accessor)) continue;\n filtered.push({ [accessor]: column.width ?? 'auto' });\n added = true;\n }\n const removed = filtered.length !== prev.length || added;\n return removed ? filtered : prev;\n });\n }, [columns]);\n\n const updateColumnWidths = useCallback((updates: Array<{ accessor: string; width: string | number }>) => {\n const filtered = updates.filter((u) => u.accessor !== '__selection__');\n if (filtered.length === 0) return;\n\n dirtyRef.current = true;\n setEffectiveColumnsWidth((prev) =>\n prev.map((col) => {\n const accessor = Object.keys(col)[0];\n const update = filtered.find((u) => u.accessor === accessor);\n return update ? { [accessor]: update.width } : col;\n })\n );\n }, []);\n\n // Persist user-initiated width changes — but only when no drag is in flight.\n // `localStorage.setItem` is synchronous and writing it on every mousemove\n // would block the main thread and visibly hurt drag smoothness.\n useEffect(() => {\n if (!key || !dirtyRef.current) return;\n if (isResizing) return;\n dirtyRef.current = false;\n setStoredColumnsWidth(effectiveColumnsWidth);\n }, [key, effectiveColumnsWidth, isResizing, setStoredColumnsWidth]);\n\n const setColumnWidth = useCallback(\n (accessor: string, width: string | number) => {\n updateColumnWidths([{ accessor, width }]);\n },\n [updateColumnWidths]\n );\n\n const setMultipleColumnWidths = useCallback(\n (updates: Array<{ accessor: string; width: string | number }>) => {\n updateColumnWidths(updates);\n },\n [updateColumnWidths]\n );\n\n /**\n * Snapshot every header cell width into the React state. Called the moment\n * the user grabs a handle. Idempotent: if all cells are already pixel-locked\n * the snapshot reads back the same values.\n */\n const beginResize = useCallback(() => {\n setIsResizing(true);\n\n const thead = headerRef?.current;\n if (!thead) return;\n\n const cells = Array.from(thead.querySelectorAll<HTMLTableCellElement>('th[data-accessor]'));\n if (cells.length === 0) return;\n\n const snapshot: DataTableColumnWidth[] = [];\n\n for (const cell of cells) {\n const accessor = cell.getAttribute('data-accessor');\n if (!accessor) continue;\n if (accessor === '__selection__') continue;\n const width = Math.round(cell.getBoundingClientRect().width);\n snapshot.push({ [accessor]: `${width}px` });\n }\n\n dirtyRef.current = true;\n setEffectiveColumnsWidth(snapshot);\n }, [headerRef]);\n\n /** Clear the active-drag flag. Persistence runs from the effect once `isResizing` flips off. */\n const endResize = useCallback(() => {\n setIsResizing(false);\n }, []);\n\n const resetColumnsWidth = useCallback(() => {\n const defaults = getDefaultColumnsWidth();\n dirtyRef.current = true;\n setEffectiveColumnsWidth(defaults);\n setIsResizing(false);\n }, [getDefaultColumnsWidth]);\n\n const allResizableWidthsInitial = useMemo(() => {\n if (!hasResizableColumns) return false;\n const resizable = columns.filter((c) => c.resizable && !c.hidden && c.accessor !== '__selection__');\n return effectiveColumnsWidth\n .filter((cw) => {\n const accessor = Object.keys(cw)[0];\n return resizable.some((c) => c.accessor === accessor);\n })\n .every((cw) => {\n const w = Object.values(cw)[0];\n return w === 'auto' || w === 'initial';\n });\n }, [hasResizableColumns, columns, effectiveColumnsWidth]);\n\n // No-op kept for backwards compatibility — measurement is now lazy\n const measureAndSetColumnWidths = useCallback(() => {\n /* noop */\n }, []);\n\n return {\n columnsWidth: effectiveColumnsWidth,\n setColumnsWidth: updateColumnWidths,\n setColumnWidth,\n setMultipleColumnWidths,\n resetColumnsWidth,\n hasResizableColumns,\n allResizableWidthsInitial,\n measureAndSetColumnWidths,\n isResizing,\n beginResize,\n endResize,\n } as const;\n}\n","import { type RefObject, useMemo } from 'react';\nimport type { DataTableColumn } from '../types/DataTableColumn';\nimport { type DataTableColumnPinning, useDataTableColumnPinning } from './useDataTableColumnPinning';\nimport { useDataTableColumnReorder } from './useDataTableColumnReorder';\nimport { useDataTableColumnResize } from './useDataTableColumnResize';\nimport { type DataTableColumnToggle, useDataTableColumnToggle } from './useDataTableColumnToggle';\n\nexport type { DataTableColumnPinning, DataTableColumnToggle };\n\n/**\n * Hook to handle column features such as drag-and-drop reordering, visibility toggling and resizing.\n * @see https://documatrix.github.io/mantine-datatable/examples/column-dragging-and-toggling/\n */\nexport const useDataTableColumns = <T>({\n key,\n columns = [],\n getInitialValueInEffect = true,\n headerRef,\n scrollViewportRef,\n}: {\n /**\n * The key to use in localStorage to store the columns order and toggle state.\n */\n key: string | undefined;\n /**\n * Columns definitions.\n */\n columns: DataTableColumn<T>[];\n /**\n * If set to true, value will be updated in useEffect after mount.\n * @default true\n */\n getInitialValueInEffect?: boolean;\n /**\n * Reference to the table header element for measuring column widths.\n */\n headerRef?: RefObject<HTMLTableSectionElement | null>;\n /**\n * Reference to the scroll viewport for calculating overflow.\n */\n scrollViewportRef?: RefObject<HTMLElement | null>;\n}) => {\n // Use specialized hooks for each feature\n const { columnsOrder, setColumnsOrder, resetColumnsOrder } = useDataTableColumnReorder({\n key,\n columns,\n getInitialValueInEffect,\n });\n\n const { columnsToggle, setColumnsToggle, resetColumnsToggle } = useDataTableColumnToggle({\n key,\n columns,\n getInitialValueInEffect,\n });\n\n const { columnsPinning, setColumnsPinning, resetColumnsPinning } = useDataTableColumnPinning({\n key,\n columns,\n getInitialValueInEffect,\n });\n\n const {\n columnsWidth,\n setColumnsWidth,\n setColumnWidth,\n setMultipleColumnWidths,\n resetColumnsWidth,\n hasResizableColumns,\n allResizableWidthsInitial,\n measureAndSetColumnWidths,\n isResizing,\n beginResize,\n endResize,\n } = useDataTableColumnResize({\n key,\n columns,\n getInitialValueInEffect,\n headerRef,\n scrollViewportRef,\n });\n\n // Compute effective columns based on order, toggle, pinning, and width.\n // Width is applied unconditionally — even without a `storeColumnsKey` —\n // so that `setMultipleColumnWidths` updates from the resize handle\n // actually flow back into the rendered cell `style.width`.\n const effectiveColumns = useMemo(() => {\n let result: DataTableColumn<T>[];\n if (columnsOrder) {\n result = columnsOrder\n .map((order) => columns.find((column) => column.accessor === order))\n .map((column) => {\n // Effective pinned value:\n // - If pinnable: true → use state from columnsPinning.pinned (interactive)\n // - Otherwise → use static column.pinned\n const pinningState = columnsPinning.find((p) => p.accessor === column?.accessor);\n const effectivePinned = column?.pinnable ? pinningState?.pinned : column?.pinned;\n return {\n ...column,\n hidden: column?.hidden || !columnsToggle.find((toggle) => toggle.accessor === column?.accessor)?.toggled,\n pinned: effectivePinned,\n };\n }) as DataTableColumn<T>[];\n } else {\n result = columns;\n }\n\n // Reorder columns by pinning: left-pinned → unpinned → right-pinned\n const leftPinned = result.filter((c) => c.pinned === 'left');\n const unpinned = result.filter((c) => !c.pinned);\n const rightPinned = result.filter((c) => c.pinned === 'right');\n const reordered = [...leftPinned, ...unpinned, ...rightPinned];\n\n return reordered.map((column) => {\n if (column?.accessor === '__selection__') return column;\n const accessor = column?.accessor as string;\n const widthEntry = columnsWidth.find((entry) => accessor in entry);\n if (!widthEntry) return column;\n const width = widthEntry[accessor];\n // Treat 'auto' / 'initial' as \"no override\" so declarative widths win\n if (width === undefined || width === 'auto' || width === 'initial') return column;\n return { ...column, width };\n });\n }, [columns, columnsOrder, columnsToggle, columnsPinning, columnsWidth]);\n\n // Lock the table layout to `fixed` only when *every* visible column has a\n // pixel width. Mixed states (some 'auto', some pixels) stay in auto layout\n // so the browser keeps the auto cells visible — the user can re-resize to\n // produce a complete pixel snapshot.\n // Recomputes on column visibility changes too, so resize + toggle stays\n // consistent.\n const isLocked = useMemo(() => {\n const visible = effectiveColumns.filter((c) => !c.hidden && c.accessor !== '__selection__');\n if (visible.length === 0) return false;\n return visible.every((c) => typeof c.width === 'string' && /px$/.test(c.width));\n }, [effectiveColumns]);\n\n const tableWidth = useMemo(() => {\n if (!isLocked) return null;\n let sum = 0;\n for (const col of effectiveColumns) {\n if (col.hidden || col.accessor === '__selection__') continue;\n const w = col.width;\n if (typeof w !== 'string') continue;\n const n = parseInt(w, 10);\n if (Number.isNaN(n)) continue;\n sum += n;\n }\n return sum > 0 ? sum : null;\n }, [isLocked, effectiveColumns]);\n\n return {\n effectiveColumns: effectiveColumns as DataTableColumn<T>[],\n\n // Order handling\n setColumnsOrder,\n columnsOrder: columnsOrder as string[],\n resetColumnsOrder,\n\n // Toggle handling\n columnsToggle: columnsToggle as DataTableColumnToggle[],\n setColumnsToggle,\n resetColumnsToggle,\n\n // Pinning handling\n columnsPinning: columnsPinning as DataTableColumnPinning[],\n setColumnsPinning,\n resetColumnsPinning,\n\n // Resize handling\n columnsWidth,\n setColumnsWidth,\n setColumnWidth,\n setMultipleColumnWidths,\n resetColumnsWidth,\n hasResizableColumns,\n allResizableWidthsInitial,\n measureAndSetColumnWidths,\n isResizing,\n isLocked,\n tableWidth,\n beginResize,\n endResize,\n } as const;\n};\n","import { useLocalStorage } from '@mantine/hooks';\nimport { useEffect, useMemo } from 'react';\nimport type { DataTableColumn } from '../types/DataTableColumn';\nimport { hasStringAccessor, sanitizeStoredArray } from '../utils';\n\nexport type DataTableColumnToggle = {\n accessor: string;\n defaultToggle: boolean;\n toggleable: boolean;\n toggled: boolean;\n};\n\n/**\n * Hook to handle column visibility toggling with localStorage persistence.\n * @see https://documatrix.github.io/mantine-datatable/examples/column-dragging-and-toggling/\n */\nexport function useDataTableColumnToggle<T>({\n key,\n columns = [],\n getInitialValueInEffect = true,\n}: {\n /**\n * The key to use in localStorage to store the columns toggle state.\n */\n key: string | undefined;\n /**\n * Columns definitions.\n */\n columns: DataTableColumn<T>[];\n /**\n * If set to true, value will be updated in useEffect after mount.\n * @default true\n */\n getInitialValueInEffect?: boolean;\n}) {\n // Default columns toggle state\n const defaultColumnsToggle = useMemo(\n () =>\n columns?.map((column) => ({\n accessor: column.accessor as string,\n defaultToggle: column.defaultToggle || true,\n toggleable: column.toggleable as boolean,\n toggled: column.defaultToggle === undefined ? true : column.defaultToggle,\n })) as DataTableColumnToggle[],\n [columns]\n );\n\n const [storedColumnsToggle, _setColumnsToggle] = useLocalStorage<DataTableColumnToggle[]>({\n key: key ? `${key}-columns-toggle` : '',\n defaultValue: key ? defaultColumnsToggle : undefined,\n getInitialValueInEffect,\n });\n\n // Guard against malformed persisted state (e.g. a non-array value propagated\n // across tabs via the `storage` event) before any `.map()` / `.forEach()` call.\n const columnsToggle = sanitizeStoredArray<DataTableColumnToggle>(\n storedColumnsToggle,\n defaultColumnsToggle,\n hasStringAccessor\n );\n\n function setColumnsToggle(toggle: DataTableColumnToggle[]) {\n if (key) {\n _setColumnsToggle(toggle);\n }\n }\n\n // Align stored toggle state with current column definitions: drop accessors\n // that no longer exist, append accessors added since last persisted state.\n const alignedColumnsToggle = useMemo(() => {\n if (!columnsToggle) return defaultColumnsToggle;\n const aligned: DataTableColumnToggle[] = [];\n columnsToggle.forEach((col) => {\n if (columns.find((c) => c.accessor === col.accessor)) {\n aligned.push(col);\n }\n });\n columns.forEach((col) => {\n if (!aligned.find((c) => c.accessor === col.accessor)) {\n aligned.push({\n accessor: col.accessor as string,\n defaultToggle: col.defaultToggle || true,\n toggleable: col.toggleable as boolean,\n toggled: col.defaultToggle === undefined ? true : col.defaultToggle,\n });\n }\n });\n return aligned;\n }, [columnsToggle, columns, defaultColumnsToggle]);\n\n // Persist alignment in an effect — never set state during render\n useEffect(() => {\n if (!key) return;\n if (!columnsToggle) return;\n if (JSON.stringify(alignedColumnsToggle) !== JSON.stringify(columnsToggle)) {\n _setColumnsToggle(alignedColumnsToggle);\n }\n }, [key, alignedColumnsToggle, columnsToggle, _setColumnsToggle]);\n\n const resetColumnsToggle = () => {\n setColumnsToggle(defaultColumnsToggle);\n };\n\n if (!key) {\n return {\n columnsToggle,\n setColumnsToggle,\n resetColumnsToggle,\n } as const;\n }\n\n return {\n columnsToggle: alignedColumnsToggle,\n setColumnsToggle,\n resetColumnsToggle,\n } as const;\n}\n","import { rem } from '@mantine/core';\nimport { useCallback, useEffect, useRef } from 'react';\nimport type { DataTableScrollProps } from '../types/DataTableScrollProps';\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\nimport { useStableValue } from './useStableValue';\n\nconst VAR_HEADER_HEIGHT = '--mantine-datatable-header-height';\nconst VAR_FOOTER_HEIGHT = '--mantine-datatable-footer-height';\nconst VAR_SELECTION_COLUMN_WIDTH = '--mantine-datatable-selection-column-width';\nconst VAR_LAST_ROW_BORDER_BOTTOM = '--mantine-datatable-last-row-border-bottom';\n\ninterface UseDataTableInjectCssVariablesOpts {\n scrollCallbacks: DataTableScrollProps;\n withRowBorders: boolean | undefined;\n}\n\ntype OnScroll = NonNullable<DataTableScrollProps['onScroll']>;\n\ntype Rect = {\n width: number;\n height: number;\n};\n\ntype Pos = 'top' | 'bottom' | 'left' | 'right';\n\nfunction setCssVar(root: HTMLDivElement | null, name: string, value: string) {\n root?.style.setProperty(name, value);\n}\n\nfunction getRect(entry: ResizeObserverEntry): Rect {\n const boxSize = entry.borderBoxSize?.[0] || entry.contentBoxSize?.[0];\n if (boxSize) {\n return {\n width: boxSize.inlineSize,\n height: boxSize.blockSize,\n };\n } else {\n return { width: entry.contentRect.width, height: entry.contentRect.height };\n }\n}\n\nfunction observe(elem: HTMLElement | null, onChange: (rect: Rect) => unknown, onCancel: () => unknown) {\n if (elem) {\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n onChange(getRect(entry));\n }\n });\n observer.observe(elem);\n return () => {\n observer.disconnect();\n onCancel();\n };\n }\n}\n\nexport function useDataTableInjectCssVariables({\n scrollCallbacks,\n withRowBorders,\n}: UseDataTableInjectCssVariablesOpts) {\n const refs = {\n root: useRef<HTMLDivElement>(null),\n table: useRef<HTMLTableElement>(null),\n scrollViewport: useRef<HTMLElement>(null),\n header: useRef<HTMLTableSectionElement>(null),\n footer: useRef<HTMLTableSectionElement>(null),\n selectionColumnHeader: useRef<HTMLTableCellElement>(null),\n };\n const { root, table, scrollViewport, header, footer, selectionColumnHeader } = refs;\n\n const stableDependencies = useStableValue({ withRowBorders });\n const stableScrollCallbacks = useStableValue(scrollCallbacks);\n const processScrollingRef = useRef<() => void>(() => void 0);\n const processLastRowBottomBorderRef = useRef<() => void>(() => void 0);\n // biome-ignore lint/correctness/useExhaustiveDependencies: stable refs only\n const onScroll = useCallback<OnScroll>((ev) => {\n stableScrollCallbacks.current.onScroll?.(ev);\n processScrollingRef.current();\n }, []);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: refs are stable\n useEffect(() => {\n return observe(\n header.current,\n (rect) => {\n setCssVar(root.current, VAR_HEADER_HEIGHT, `${rect.height}px`);\n },\n () => setCssVar(root.current, VAR_HEADER_HEIGHT, '0')\n );\n }, [header.current]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: refs are stable\n useEffect(() => {\n return observe(\n footer.current,\n (rect) => {\n setCssVar(root.current, VAR_FOOTER_HEIGHT, `${rect.height}px`);\n },\n () => setCssVar(root.current, VAR_FOOTER_HEIGHT, '0')\n );\n }, [footer.current]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: refs are stable\n useEffect(() => {\n return observe(\n selectionColumnHeader.current,\n (rect) => {\n setCssVar(root.current, VAR_SELECTION_COLUMN_WIDTH, `${rect.width}px`);\n },\n () => setCssVar(root.current, VAR_SELECTION_COLUMN_WIDTH, '0')\n );\n }, [selectionColumnHeader.current]);\n\n useIsomorphicLayoutEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n const scrollPosition: Record<Pos, boolean> = {\n top: true,\n bottom: true,\n left: true,\n right: true,\n };\n let tableRect: Rect = { width: 0, height: 0 };\n let scrollRect: Rect = { width: 0, height: 0 };\n\n function setScrolledTo(pos: Pos, value: boolean) {\n const old = scrollPosition[pos];\n scrollPosition[pos] = value;\n setCssVar(root.current, `--mantine-datatable-${pos}-shadow-opacity`, value ? '0' : '1');\n return old;\n }\n\n function processFooterPosition() {\n const diff = tableRect.height - scrollRect.height;\n const relative = diff < 0;\n setCssVar(root.current, '--mantine-datatable-footer-position', relative ? 'relative' : 'sticky');\n setCssVar(root.current, '--mantine-datatable-footer-bottom', relative ? `${diff}px` : '0');\n }\n\n function processLastRowBottomBorder() {\n if (stableDependencies.current.withRowBorders && tableRect.height < scrollRect.height) {\n setCssVar(\n root.current,\n VAR_LAST_ROW_BORDER_BOTTOM,\n `${rem('1px')} solid var(--mantine-datatable-border-color)`\n );\n } else {\n setCssVar(root.current, VAR_LAST_ROW_BORDER_BOTTOM, 'unset');\n }\n }\n processLastRowBottomBorderRef.current = processLastRowBottomBorder;\n\n function processScrolling() {\n const callbacks = stableScrollCallbacks.current;\n const viewport = scrollViewport.current;\n const scrollTop = viewport?.scrollTop ?? 0;\n const scrollLeft = viewport?.scrollLeft ?? 0;\n\n const newScrolledToTop = scrollTop === 0;\n const newScrolledToBottom = tableRect.height - scrollTop - scrollRect.height < 1;\n const scrolledToTop = setScrolledTo('top', newScrolledToTop);\n const scrolledToBottom = setScrolledTo('bottom', newScrolledToBottom);\n if (newScrolledToTop && newScrolledToTop !== scrolledToTop) callbacks.onScrollToTop?.();\n if (newScrolledToBottom && newScrolledToBottom !== scrolledToBottom) callbacks.onScrollToBottom?.();\n\n // In RTL mode, scrollLeft behavior varies by browser:\n // - Chrome/Edge: starts at 0, goes negative when scrolling left (towards visual left)\n // - Firefox: starts at 0, goes negative when scrolling left\n // - Safari: starts at 0, goes negative when scrolling left\n // The key insight: in RTL, scrollLeft=0 means we're at the RIGHT edge (visual start)\n // and negative/max values mean we're at the LEFT edge (visual end)\n const isRtl = viewport ? getComputedStyle(viewport).direction === 'rtl' : false;\n const maxScrollLeft = (viewport?.scrollWidth ?? 0) - scrollRect.width;\n\n let newScrolledToLeft: boolean;\n let newScrolledToRight: boolean;\n\n if (isRtl) {\n // In RTL with modern browsers, scrollLeft is 0 at right edge, negative when scrolling left\n const absScrollLeft = Math.abs(scrollLeft);\n // At right edge (RTL start): absScrollLeft ≈ 0, so scrolledToRight = true (no right shadow)\n // At left edge (RTL end): absScrollLeft ≈ maxScrollLeft, so scrolledToLeft = true (no left shadow)\n newScrolledToRight = absScrollLeft < 1;\n newScrolledToLeft = maxScrollLeft - absScrollLeft < 1;\n } else {\n newScrolledToLeft = scrollLeft < 1;\n newScrolledToRight = tableRect.width - scrollLeft - scrollRect.width < 1;\n }\n\n const scrolledToLeft = setScrolledTo('left', newScrolledToLeft);\n const scrolledToRight = setScrolledTo('right', newScrolledToRight);\n if (newScrolledToLeft && newScrolledToLeft !== scrolledToLeft) callbacks.onScrollToLeft?.();\n if (newScrolledToRight && newScrolledToRight !== scrolledToRight) callbacks.onScrollToRight?.();\n }\n processScrollingRef.current = processScrolling;\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n switch (entry.target.tagName) {\n case 'TABLE': {\n tableRect = getRect(entry);\n break;\n }\n case 'DIV': {\n scrollRect = getRect(entry);\n break;\n }\n }\n }\n processScrolling();\n processFooterPosition();\n processLastRowBottomBorder();\n });\n\n observer.observe(table.current!);\n observer.observe(scrollViewport.current!);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n processLastRowBottomBorderRef.current();\n }, [withRowBorders]);\n\n return {\n refs,\n onScroll,\n };\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","import { useRef } from 'react';\n\nexport interface ReadonlyRef<T> {\n readonly current: T;\n}\n\nexport function useStableValue<T>(value: T): ReadonlyRef<T> {\n const ref = useRef<T>(value);\n ref.current = value;\n return ref;\n}\n","import { type RefObject, useCallback, useEffect, useState } from 'react';\nimport type { DataTableColumn } from '../types';\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\nexport type PinnedColumnInfo = {\n position: 'left' | 'right';\n logicalSide: 'left' | 'right';\n offset: number;\n isBoundary: boolean;\n};\n\nexport function useDataTablePinnedColumns<T>({\n columns,\n theadRef,\n tbodyRef,\n selectionColumnHeaderRef,\n selectionVisible,\n pinFirstColumn,\n pinLastColumn,\n}: {\n columns: DataTableColumn<T>[];\n theadRef: RefObject<HTMLTableSectionElement | null>;\n tbodyRef: RefObject<HTMLTableSectionElement | null>;\n selectionColumnHeaderRef: RefObject<HTMLTableCellElement | null>;\n selectionVisible: boolean;\n pinFirstColumn?: boolean;\n pinLastColumn?: boolean;\n}): {\n pinnedMap: Map<string, PinnedColumnInfo>;\n hasLeftPinned: boolean;\n hasRightPinned: boolean;\n} {\n const [pinnedMap, setPinnedMap] = useState<Map<string, PinnedColumnInfo>>(new Map());\n\n // Skip all measurement work when no pinning is configured. Otherwise every\n // render fires a layout-forcing recalculate and tears down/recreates the\n // ResizeObserver — needless thrash that interferes with consumers observing\n // the same DOM (e.g. AutoAnimate on the same tbody). The flag is recomputed\n // inside each hook closure so we don't change the shape of the deps arrays.\n const recalculate = useCallback(() => {\n if (!pinFirstColumn && !pinLastColumn && !columns.some((c) => c.pinned)) return;\n const measurementSection = theadRef.current ?? tbodyRef.current;\n if (!measurementSection) return;\n\n const isTheadSource = !!theadRef.current;\n const measurementRow = isTheadSource\n ? measurementSection.querySelector<HTMLTableRowElement>('tr:last-of-type')\n : measurementSection.querySelector<HTMLTableRowElement>('tr:first-of-type');\n if (!measurementRow) return;\n\n const isRtl = getComputedStyle(measurementSection).direction === 'rtl';\n\n const widths = new Map<string, number>();\n\n if (isTheadSource) {\n measurementRow.querySelectorAll<HTMLElement>('th[data-accessor]').forEach((th) => {\n const accessor = th.dataset.accessor;\n if (accessor) {\n const w = th.getBoundingClientRect().width;\n if (w > 0) widths.set(accessor, w);\n }\n });\n } else {\n const visibleCols = columns.filter((c) => !c.hidden);\n const tds = measurementRow.querySelectorAll<HTMLElement>(\n 'td:not(.mantine-datatable-row-selector-cell):not(.mantine-datatable-row-expansion-cell)'\n );\n tds.forEach((td, i) => {\n if (visibleCols[i]) {\n const w = td.getBoundingClientRect().width;\n if (w > 0) widths.set(String(visibleCols[i].accessor), w);\n }\n });\n }\n\n let selectionWidth = 0;\n if (selectionVisible) {\n const selCell =\n selectionColumnHeaderRef.current ??\n measurementSection.querySelector<HTMLElement>(\n isTheadSource ? '.mantine-datatable-header-selector-cell' : '.mantine-datatable-row-selector-cell'\n );\n if (selCell) selectionWidth = selCell.getBoundingClientRect().width;\n }\n\n const renderedAccessors = columns\n .filter((c) => !c.hidden && widths.has(String(c.accessor)))\n .map((c) => String(c.accessor));\n\n const resolvedPinned = new Map<string, 'left' | 'right'>();\n for (const col of columns) {\n const acc = String(col.accessor);\n if (!renderedAccessors.includes(acc)) continue;\n\n if (col.pinned) {\n resolvedPinned.set(acc, col.pinned);\n } else if (pinFirstColumn && acc === renderedAccessors[0] && !resolvedPinned.has(acc)) {\n resolvedPinned.set(acc, 'left');\n } else if (pinLastColumn && acc === renderedAccessors[renderedAccessors.length - 1] && !resolvedPinned.has(acc)) {\n resolvedPinned.set(acc, 'right');\n }\n }\n\n const leftPinned = renderedAccessors.filter((acc) => resolvedPinned.get(acc) === 'left');\n const rightPinned = renderedAccessors.filter((acc) => resolvedPinned.get(acc) === 'right');\n\n const newMap = new Map<string, PinnedColumnInfo>();\n\n let leftOffset = selectionWidth;\n leftPinned.forEach((acc, i) => {\n newMap.set(acc, {\n position: isRtl ? 'right' : 'left',\n logicalSide: 'left',\n offset: leftOffset,\n isBoundary: i === leftPinned.length - 1,\n });\n leftOffset += widths.get(acc) || 0;\n });\n\n let rightOffset = -0.4; // Webkit subpixel gap fix (see old CSS: right: rem(-0.4px))\n const rightReversed = [...rightPinned].reverse();\n rightReversed.forEach((acc, i) => {\n newMap.set(acc, {\n position: isRtl ? 'left' : 'right',\n logicalSide: 'right',\n offset: rightOffset,\n isBoundary: i === rightReversed.length - 1,\n });\n rightOffset += widths.get(acc) || 0;\n });\n\n setPinnedMap((prev) => {\n if (prev.size !== newMap.size) return newMap;\n for (const [k, v] of newMap) {\n const pv = prev.get(k);\n if (\n !pv ||\n pv.position !== v.position ||\n pv.logicalSide !== v.logicalSide ||\n pv.offset !== v.offset ||\n pv.isBoundary !== v.isBoundary\n ) {\n return newMap;\n }\n }\n return prev;\n });\n }, [columns, selectionVisible, theadRef, tbodyRef, selectionColumnHeaderRef, pinFirstColumn, pinLastColumn]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: `pinFirstColumn`, `pinLastColumn` and `columns` are captured transitively via `recalculate` — keep the deps array shape (3 items) stable so HMR can't trip \"deps array changed size\".\n useEffect(() => {\n if (!pinFirstColumn && !pinLastColumn && !columns.some((c) => c.pinned)) return;\n const section = theadRef.current ?? tbodyRef.current;\n if (!section) return;\n\n const isTheadSource = !!theadRef.current;\n const row = isTheadSource ? section.querySelector('tr:last-of-type') : section.querySelector('tr:first-of-type');\n if (!row) return;\n\n const observer = new ResizeObserver(recalculate);\n row.querySelectorAll(isTheadSource ? 'th' : 'td').forEach((cell) => {\n observer.observe(cell);\n });\n\n return () => observer.disconnect();\n }, [theadRef, tbodyRef, recalculate]);\n\n useIsomorphicLayoutEffect(recalculate, [recalculate]);\n\n const hasLeftPinned = [...pinnedMap.values()].some((info) => info.logicalSide === 'left');\n const hasRightPinned = [...pinnedMap.values()].some((info) => info.logicalSide === 'right');\n\n return { pinnedMap, hasLeftPinned, hasRightPinned };\n}\n","import { useEffect, useState } from 'react';\n\nexport function useLastSelectionChangeIndex(recordIds: unknown[] | undefined) {\n const [lastSelectionChangeIndex, setLastSelectionChangeIndex] = useState<number | null>(null);\n const recordIdsString = recordIds?.join(':') || '';\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset when recordIds change\n useEffect(() => {\n setLastSelectionChangeIndex(null);\n }, [recordIdsString]);\n\n return { lastSelectionChangeIndex, setLastSelectionChangeIndex };\n}\n","// Modified from https://github.com/mantinedev/mantine/blob/8c12a76c56da51af34213f18dd67c8b72a0ddb44/src/mantine-hooks/src/use-media-query/use-media-query.ts\n\nimport { useEffect, useRef, useState } from 'react';\n\nexport interface UseMediaQueryOptions {\n getInitialValueInEffect: boolean;\n}\n\n/**\n * Older versions of Safari (shipped with Catalina and before) do not support addEventListener on matchMedia\n * https://stackoverflow.com/questions/56466261/matchmedia-addlistener-marked-as-deprecated-addeventlistener-equivalent\n * */\nfunction attachMediaListeners(queries: MediaQueryList[], callback: (matches: boolean[]) => void) {\n const callbackWrapper = () => {\n callback(queries.map((query) => query.matches));\n };\n const subscriptions = queries.map((query) => {\n try {\n query.addEventListener('change', callbackWrapper);\n return () => query.removeEventListener('change', callbackWrapper);\n } catch {\n query.addListener(callbackWrapper);\n return () => query.removeListener(callbackWrapper);\n }\n });\n return () => {\n subscriptions.forEach((unsubscribe) => {\n unsubscribe();\n });\n };\n}\n\nfunction getInitialValue(queries: string[], initialValues?: boolean[]) {\n if (initialValues) {\n return initialValues;\n }\n\n if (typeof window !== 'undefined' && 'matchMedia' in window) {\n return queries.map((query) => window.matchMedia(query).matches);\n }\n\n return queries.map(() => false);\n}\n\nexport function useMediaQueries(\n queries: string[],\n initialValues?: boolean[],\n { getInitialValueInEffect }: UseMediaQueryOptions = {\n getInitialValueInEffect: true,\n }\n) {\n const [matches, setMatches] = useState(\n getInitialValueInEffect ? initialValues : getInitialValue(queries, initialValues)\n );\n const queryRef = useRef<MediaQueryList[]>(null);\n\n useEffect(() => {\n if ('matchMedia' in window) {\n queryRef.current = queries.map((query) => window.matchMedia(query));\n setMatches(queryRef.current.map((queryResult) => queryResult.matches));\n return attachMediaListeners(queryRef.current, (event) => {\n setMatches(event);\n });\n }\n\n return undefined;\n }, [queries]);\n\n return matches;\n}\n","import { type MantineTheme, useMantineTheme } from '@mantine/core';\nimport { useMemo } from 'react';\nimport { useMediaQueries } from './useMediaQueries';\n\nexport function useMediaQueriesStringOrFunction(queries: (string | ((theme: MantineTheme) => string) | undefined)[]) {\n const theme = useMantineTheme();\n const values = useMemo(\n () => queries.map((query) => (typeof query === 'function' ? query(theme) : query) ?? ''),\n [queries, theme]\n );\n const defaults = useMemo(() => queries.map(() => true), [queries]);\n return useMediaQueries(values, defaults);\n}\n","import { type MantineTheme, useMantineTheme } from '@mantine/core';\nimport { useMediaQuery } from '@mantine/hooks';\n\nexport function useMediaQueryStringOrFunction(mediaQuery: string | ((theme: MantineTheme) => string) | undefined) {\n const theme = useMantineTheme();\n const mediaQueryValue = typeof mediaQuery === 'function' ? mediaQuery(theme) : mediaQuery;\n return useMediaQuery(mediaQueryValue || '', true);\n}\n","import { useState } from 'react';\nimport type { DataTableRowExpansionProps } from '../types/DataTableRowExpansionProps';\nimport { getRecordId } from '../utils';\n\nexport function useRowExpansion<T>({\n rowExpansion,\n records,\n idAccessor,\n}: {\n rowExpansion?: DataTableRowExpansionProps<T>;\n records: T[] | undefined;\n idAccessor: (keyof T | (string & NonNullable<unknown>)) | ((record: T) => React.Key);\n}) {\n let initiallyExpandedRecordIds: unknown[] = [];\n if (rowExpansion && records) {\n const { trigger, allowMultiple, initiallyExpanded } = rowExpansion;\n if (records && trigger === 'always') {\n initiallyExpandedRecordIds = records.map((r) => getRecordId(r, idAccessor));\n } else if (initiallyExpanded) {\n initiallyExpandedRecordIds = records\n .filter((record, index) => initiallyExpanded({ record, index }))\n .map((r) => getRecordId(r, idAccessor));\n if (!allowMultiple) {\n initiallyExpandedRecordIds = [initiallyExpandedRecordIds[0]];\n }\n }\n }\n\n let expandedRecordIds: unknown[];\n let setExpandedRecordIds: ((expandedRecordIds: unknown[]) => void) | undefined;\n const expandedRecordIdsState = useState<unknown[]>(initiallyExpandedRecordIds);\n\n if (rowExpansion) {\n const { expandable, trigger, allowMultiple, collapseProps, content } = rowExpansion;\n if (rowExpansion.expanded) {\n ({ recordIds: expandedRecordIds, onRecordIdsChange: setExpandedRecordIds } = rowExpansion.expanded);\n } else {\n [expandedRecordIds, setExpandedRecordIds] = expandedRecordIdsState;\n }\n\n const collapseRow = (record: T) =>\n setExpandedRecordIds?.(expandedRecordIds.filter((id) => id !== getRecordId(record, idAccessor)));\n\n return {\n expandOnClick: trigger !== 'always' && trigger !== 'never',\n isRowExpanded: (record: T) =>\n trigger === 'always' ? true : expandedRecordIds.includes(getRecordId(record, idAccessor)),\n isExpandable: ({ record, index }: { record: T; index: number }) => {\n if (!expandable) {\n return true;\n }\n return expandable({ record, index });\n },\n expandRow: (record: T) => {\n const recordId = getRecordId(record, idAccessor);\n setExpandedRecordIds?.(allowMultiple ? [...expandedRecordIds, recordId] : [recordId]);\n },\n collapseRow,\n collapseProps,\n content:\n ({ record, index }: { record: T; index: number }) =>\n () =>\n content({ record, index, collapse: () => collapseRow(record) }),\n };\n }\n}\n","import { useTimeout } from '@mantine/hooks';\nimport { useEffect, useState } from 'react';\n\nexport function useRowExpansionStatus(open: boolean, transitionDuration?: number) {\n const [expanded, setExpanded] = useState(open);\n const [visible, setVisible] = useState(open);\n\n const expand = useTimeout(() => setExpanded(true), 0);\n const hide = useTimeout(() => setVisible(false), transitionDuration || 200);\n\n useEffect(() => {\n if (open) {\n hide.clear();\n setVisible(true);\n expand.start();\n } else {\n expand.clear();\n setExpanded(false);\n hide.start();\n }\n }, [expand, hide, open]);\n\n return { expanded, visible };\n}\n","export const NOWRAP = 'mantine-datatable-nowrap';\nexport const ELLIPSIS = 'mantine-datatable-ellipsis';\nexport const POINTER_CURSOR = 'mantine-datatable-pointer-cursor';\nexport const CONTEXT_MENU_CURSOR = 'mantine-datatable-context-menu-cursor';\nexport const TEXT_SELECTION_DISABLED = 'mantine-datatable-text-selection-disabled';\nexport const TEXT_ALIGN_LEFT = 'mantine-datatable-text-align-left';\nexport const TEXT_ALIGN_CENTER = 'mantine-datatable-text-align-center';\nexport const TEXT_ALIGN_RIGHT = 'mantine-datatable-text-align-right';\n","import { TableTh } from '@mantine/core';\n\ntype DataTableFooterSelectorPlaceholderCellProps = {\n shadowVisible: boolean;\n};\n\nexport function DataTableFooterSelectorPlaceholderCell({ shadowVisible }: DataTableFooterSelectorPlaceholderCellProps) {\n return (\n <TableTh\n className=\"mantine-datatable-footer-selector-placeholder-cell\"\n data-shadow-visible={shadowVisible || undefined}\n />\n );\n}\n","import {\n Checkbox,\n type CheckboxProps,\n Group,\n type MantineStyleProp,\n Popover,\n PopoverDropdown,\n PopoverTarget,\n Stack,\n TableThead,\n TableTr,\n} from '@mantine/core';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport { DataTableColumnGroupHeaderCell } from './DataTableColumnGroupHeaderCell';\nimport { useDataTableColumnsContext } from './DataTableColumns.context';\nimport { DataTableHeaderCell } from './DataTableHeaderCell';\nimport { DataTableHeaderSelectorCell } from './DataTableHeaderSelectorCell';\nimport type { DataTableColumnToggle, PinnedColumnInfo } from './hooks';\nimport type { DataTableColumn, DataTableColumnGroup, DataTableSelectionTrigger, DataTableSortProps } from './types';\nimport { getGroupsAtDepth, getMaxGroupDepth, humanize } from './utils';\n\ntype DataTableHeaderProps<T> = {\n selectionColumnHeaderRef: React.ForwardedRef<HTMLTableCellElement>;\n className: string | undefined;\n style?: MantineStyleProp;\n sortStatus: DataTableSortProps<T>['sortStatus'];\n sortIcons: DataTableSortProps<T>['sortIcons'];\n onSortStatusChange: DataTableSortProps<T>['onSortStatusChange'];\n columns: DataTableColumn<T>[];\n defaultColumnProps: Omit<DataTableColumn<T>, 'accessor'> | undefined;\n groups: readonly DataTableColumnGroup<T>[] | undefined;\n pinnedMap: Map<string, PinnedColumnInfo>;\n selectionTrigger: DataTableSelectionTrigger;\n selectionVisible: boolean;\n selectionChecked: boolean;\n selectionIndeterminate: boolean;\n onSelectionChange: (() => void) | undefined;\n selectionCheckboxProps: CheckboxProps;\n selectorCellShadowVisible: boolean;\n selectionColumnClassName: string | undefined;\n selectionColumnStyle: MantineStyleProp;\n withColumnBorders?: boolean;\n ref: React.Ref<HTMLTableSectionElement>;\n};\n\nfunction getGroupPinnedInfo<T>(\n group: DataTableColumnGroup<T>,\n pinnedMap: Map<string, PinnedColumnInfo>\n): PinnedColumnInfo | undefined {\n const leafColumns = group.columns ?? [];\n const leafAccessors = leafColumns.filter((c) => !c.hidden).map((c) => String(c.accessor));\n\n const pinnedInfos = leafAccessors.map((acc) => pinnedMap.get(acc)).filter(Boolean) as PinnedColumnInfo[];\n\n if (pinnedInfos.length === 0 || pinnedInfos.length !== leafAccessors.length) return undefined;\n\n const logicalSides = new Set(pinnedInfos.map((p) => p.logicalSide));\n if (logicalSides.size > 1) return undefined;\n\n const logicalSide = [...logicalSides][0];\n const targetAcc = logicalSide === 'left' ? leafAccessors[0] : leafAccessors[leafAccessors.length - 1];\n const info = pinnedMap.get(targetAcc);\n if (!info) return undefined;\n\n const boundaryAcc = logicalSide === 'left' ? leafAccessors[leafAccessors.length - 1] : leafAccessors[0];\n const boundaryInfo = pinnedMap.get(boundaryAcc);\n return { ...info, isBoundary: boundaryInfo?.isBoundary ?? false };\n}\n\nexport function DataTableHeader<T>({\n selectionColumnHeaderRef,\n className,\n style,\n sortStatus,\n sortIcons,\n onSortStatusChange,\n columns,\n defaultColumnProps,\n groups,\n pinnedMap,\n selectionTrigger,\n selectionVisible,\n selectionChecked,\n selectionIndeterminate,\n onSelectionChange,\n selectionCheckboxProps,\n selectorCellShadowVisible,\n selectionColumnClassName,\n selectionColumnStyle,\n withColumnBorders = false,\n ref,\n}: DataTableHeaderProps<T>) {\n const maxGroupDepth = groups ? getMaxGroupDepth(groups) : 0;\n const totalHeaderRows = maxGroupDepth > 0 ? maxGroupDepth + 1 : 1;\n\n const allRecordsSelectorCell = selectionVisible ? (\n <DataTableHeaderSelectorCell\n ref={selectionColumnHeaderRef}\n className={selectionColumnClassName}\n style={selectionColumnStyle}\n trigger={selectionTrigger}\n shadowVisible={selectorCellShadowVisible}\n checked={selectionChecked}\n indeterminate={selectionIndeterminate}\n checkboxProps={selectionCheckboxProps}\n onChange={onSelectionChange}\n rowSpan={groups ? totalHeaderRows : undefined}\n />\n ) : null;\n\n const { columnsToggle, setColumnsToggle } = useDataTableColumnsContext();\n const [columnsPopoverOpened, setColumnsPopoverOpened] = useState<boolean>(false);\n const someColumnsToggleable = columns.some((column) => column.toggleable);\n\n const columnToggleCheckboxLabels = someColumnsToggleable\n ? Object.fromEntries(columns.map(({ accessor, title }) => [accessor, title ?? humanize(String(accessor))]))\n : undefined;\n\n const content = (\n <TableThead\n className={clsx('mantine-datatable-header', className)}\n style={style}\n ref={ref}\n onContextMenu={\n someColumnsToggleable\n ? (e) => {\n e.preventDefault();\n setColumnsPopoverOpened((columnsPopoverOpened) => !columnsPopoverOpened);\n }\n : undefined\n }\n >\n {groups &&\n Array.from({ length: maxGroupDepth }, (_, depthIndex) => {\n const groupsAtDepth = getGroupsAtDepth(groups, depthIndex);\n\n return (\n <TableTr key={`group-depth-${depthIndex}`}>\n {depthIndex === 0 && allRecordsSelectorCell}\n {groupsAtDepth.map((group, index) => {\n return (\n <DataTableColumnGroupHeaderCell\n key={group.id}\n group={group}\n pinnedInfo={getGroupPinnedInfo(group, pinnedMap)}\n maxDepth={maxGroupDepth}\n currentDepth={depthIndex}\n previousGroups={groupsAtDepth.slice(0, index)}\n isLastGroup={index === groupsAtDepth.length - 1}\n withColumnBorders={withColumnBorders}\n totalTableColumns={columns.length}\n />\n );\n })}\n </TableTr>\n );\n })}\n\n <TableTr>\n {!groups && allRecordsSelectorCell}\n\n {columns.map(({ hidden, ...columnProps }, index) => {\n if (hidden) return null;\n\n const {\n accessor,\n visibleMediaQuery,\n textAlign,\n width,\n title,\n sortable,\n draggable,\n toggleable,\n pinnable,\n resizable,\n titleClassName,\n titleStyle,\n filter,\n filterPopoverProps,\n filterPopoverDisableClickOutside,\n filtering,\n sortKey,\n } = { ...defaultColumnProps, ...columnProps };\n\n return (\n <DataTableHeaderCell<T>\n key={accessor as React.Key}\n accessor={accessor}\n pinnedInfo={pinnedMap.get(String(accessor))}\n className={titleClassName}\n style={titleStyle}\n visibleMediaQuery={visibleMediaQuery}\n textAlign={textAlign}\n width={width}\n title={title}\n sortable={sortable}\n draggable={draggable}\n toggleable={toggleable}\n pinnable={pinnable}\n // we won't display the resize handle for the last column to avoid overflow render issues\n resizable={resizable && index < columns.length - 1}\n sortStatus={sortStatus}\n sortIcons={sortIcons}\n sortKey={sortKey}\n onSortStatusChange={onSortStatusChange}\n filter={filter}\n filterPopoverProps={filterPopoverProps}\n filterPopoverDisableClickOutside={filterPopoverDisableClickOutside}\n filtering={filtering}\n />\n );\n })}\n </TableTr>\n </TableThead>\n );\n\n return someColumnsToggleable ? (\n <Popover position=\"bottom\" withArrow shadow=\"md\" opened={columnsPopoverOpened} onChange={setColumnsPopoverOpened}>\n <PopoverTarget>{content}</PopoverTarget>\n <PopoverDropdown>\n <Stack>\n {columnsToggle\n .filter((column) => column.toggleable)\n .map((column: DataTableColumnToggle) => {\n return (\n <Group key={column.accessor}>\n <Checkbox\n classNames={{ label: 'mantine-datatable-header-column-toggle-checkbox-label' }}\n size=\"xs\"\n label={columnToggleCheckboxLabels![column.accessor]}\n checked={column.toggled}\n onChange={(e) => {\n setColumnsToggle(\n columnsToggle.map((c: DataTableColumnToggle) => {\n if (c.accessor === column.accessor) {\n return { ...c, toggled: e.currentTarget.checked };\n }\n return c;\n })\n );\n }}\n />\n </Group>\n );\n })}\n </Stack>\n </PopoverDropdown>\n </Popover>\n ) : (\n content\n );\n}\n","import { TableTh } from '@mantine/core';\nimport clsx from 'clsx';\nimport { useMemo } from 'react';\nimport type { PinnedColumnInfo } from './hooks';\nimport { useMediaQueriesStringOrFunction } from './hooks';\nimport type { DataTableColumnGroup } from './types';\nimport { TEXT_ALIGN_CENTER, TEXT_ALIGN_LEFT, TEXT_ALIGN_RIGHT } from './utilityClasses';\nimport { calculateColSpan, flattenColumns, humanize, needsRightBorder } from './utils';\n\ntype DataTableColumnGroupHeaderCellProps<T> = {\n group: DataTableColumnGroup<T>;\n pinnedInfo: PinnedColumnInfo | undefined;\n maxDepth: number;\n currentDepth: number;\n previousGroups: readonly DataTableColumnGroup<T>[];\n isLastGroup: boolean;\n withColumnBorders?: boolean;\n totalTableColumns: number;\n};\n\nexport function DataTableColumnGroupHeaderCell<T>({\n group: { id, columns, groups, title, textAlign, className, style },\n pinnedInfo,\n maxDepth,\n currentDepth,\n previousGroups,\n isLastGroup,\n withColumnBorders = false,\n totalTableColumns,\n}: DataTableColumnGroupHeaderCellProps<T>) {\n const allColumns = useMemo(() => {\n if (columns && columns.length > 0) {\n return columns;\n }\n if (groups && groups.length > 0) {\n return flattenColumns([{ id, columns, groups }]);\n }\n return [];\n }, [columns, groups, id]);\n\n const queries = useMemo(() => allColumns.map(({ visibleMediaQuery }) => visibleMediaQuery), [allColumns]);\n const visibles = useMediaQueriesStringOrFunction(queries);\n\n const colSpan = useMemo(() => {\n return calculateColSpan({ id, columns, groups }, visibles);\n }, [id, columns, groups, visibles]);\n\n const columnsBeforeGroup = useMemo(() => {\n return previousGroups.reduce((sum, g) => sum + calculateColSpan(g, visibles), 0);\n }, [previousGroups, visibles]);\n\n const hasSubGroups = groups && groups.length > 0;\n const rowSpan = hasSubGroups ? 1 : maxDepth - currentDepth;\n\n const hasMoreColumns = columnsBeforeGroup + colSpan < totalTableColumns;\n const needsBorder = needsRightBorder(isLastGroup, hasMoreColumns, withColumnBorders);\n\n return colSpan > 0 ? (\n <TableTh\n colSpan={colSpan}\n rowSpan={rowSpan > 1 ? rowSpan : undefined}\n data-pinned={pinnedInfo?.position}\n data-pinned-shadow={pinnedInfo?.isBoundary ? pinnedInfo.position : undefined}\n className={clsx(\n 'mantine-datatable-column-group-header-cell',\n {\n [TEXT_ALIGN_LEFT]: textAlign === 'left',\n [TEXT_ALIGN_CENTER]: textAlign === 'center',\n [TEXT_ALIGN_RIGHT]: textAlign === 'right',\n 'mantine-datatable-column-group-header-cell--needs-border': needsBorder,\n },\n className\n )}\n style={[\n style,\n pinnedInfo && {\n position: 'sticky',\n [pinnedInfo.position]: pinnedInfo.offset,\n overflow: 'visible',\n },\n ]}\n >\n {title ?? humanize(id)}\n </TableTh>\n ) : null;\n}\n","import { ActionIcon, Box, Center, Flex, Group, type MantineStyleProp, type MantineTheme, TableTh } from '@mantine/core';\nimport clsx from 'clsx';\nimport { useRef, useState } from 'react';\nimport { useDataTableColumnsContext } from './DataTableColumns.context';\nimport { DataTableHeaderCellFilter } from './DataTableHeaderCellFilter';\nimport { DataTablePinnableDropdown } from './DataTablePinnableDropdown';\nimport { DataTableResizableHeaderHandle } from './DataTableResizableHeaderHandle';\nimport type { PinnedColumnInfo } from './hooks';\nimport { useMediaQueryStringOrFunction } from './hooks';\nimport { IconArrowsVertical } from './icons/IconArrowsVertical';\nimport { IconArrowUp } from './icons/IconArrowUp';\nimport { IconGripVertical } from './icons/IconGripVertical';\nimport { IconX } from './icons/IconX';\nimport type { DataTableColumn, DataTableSortProps } from './types';\nimport { ELLIPSIS, NOWRAP, TEXT_ALIGN_CENTER, TEXT_ALIGN_LEFT, TEXT_ALIGN_RIGHT } from './utilityClasses';\nimport { humanize } from './utils';\n\ntype DataTableHeaderCellProps<T> = {\n className: string | undefined;\n style: MantineStyleProp | undefined;\n pinnedInfo: PinnedColumnInfo | undefined;\n visibleMediaQuery: string | ((theme: MantineTheme) => string) | undefined;\n title: React.ReactNode | undefined;\n sortStatus: DataTableSortProps<T>['sortStatus'];\n sortIcons: DataTableSortProps<T>['sortIcons'];\n onSortStatusChange: DataTableSortProps<T>['onSortStatusChange'];\n} & Pick<\n DataTableColumn<T>,\n | 'accessor'\n | 'sortable'\n | 'draggable'\n | 'toggleable'\n | 'pinnable'\n | 'resizable'\n | 'textAlign'\n | 'width'\n | 'filter'\n | 'filterPopoverProps'\n | 'filterPopoverDisableClickOutside'\n | 'filtering'\n | 'sortKey'\n>;\n\nexport function DataTableHeaderCell<T>({\n className,\n style,\n pinnedInfo,\n accessor,\n visibleMediaQuery,\n title,\n sortable,\n draggable,\n toggleable,\n pinnable,\n resizable,\n sortIcons,\n textAlign,\n width,\n sortStatus,\n onSortStatusChange,\n filter,\n filterPopoverProps,\n filterPopoverDisableClickOutside,\n filtering,\n sortKey,\n}: DataTableHeaderCellProps<T>) {\n const {\n setSourceColumn,\n setTargetColumn,\n swapColumns,\n columnsToggle,\n setColumnsToggle,\n columnsPinning,\n setColumnsPinning,\n } = useDataTableColumnsContext();\n const [dragOver, setDragOver] = useState<boolean>(false);\n const columnRef = useRef<HTMLTableCellElement | null>(null);\n\n // Get current pinning state for this column\n const pinningState = columnsPinning?.find((p) => p.accessor === accessor);\n const currentPinned = pinningState?.pinned;\n\n if (!useMediaQueryStringOrFunction(visibleMediaQuery)) return null;\n const text = title ?? humanize(accessor as string);\n const tooltip = typeof text === 'string' ? text : undefined;\n\n const sortAction =\n sortable && onSortStatusChange\n ? (e?: React.BaseSyntheticEvent) => {\n if (e?.defaultPrevented) return;\n\n onSortStatusChange({\n sortKey,\n columnAccessor: accessor,\n direction:\n sortStatus?.columnAccessor === accessor\n ? sortStatus.direction === 'asc'\n ? 'desc'\n : 'asc'\n : (sortStatus?.direction ?? 'asc'),\n });\n }\n : undefined;\n\n const handleColumnDragStart = (e: React.DragEvent) => {\n e.stopPropagation();\n setSourceColumn(accessor as string);\n setDragOver(false);\n };\n\n const handleColumnDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setTargetColumn(accessor as string);\n setDragOver(true);\n };\n\n const handleColumnDrop = () => {\n setTargetColumn(accessor as string);\n setDragOver(false);\n swapColumns();\n };\n\n const handleColumnDragEnter = () => {\n setDragOver(true);\n };\n\n const handleColumnDragLeave = () => {\n setDragOver(false);\n };\n\n const handleColumnToggle = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n\n setColumnsToggle(\n columnsToggle.map((c) => {\n if (c.accessor === accessor) {\n return { ...c, toggled: false };\n }\n return c;\n })\n );\n };\n\n const handlePinChange = (pinned: 'left' | 'right' | undefined) => {\n setColumnsPinning((prev) =>\n prev.map((p) => {\n if (p.accessor === accessor) {\n return { ...p, pinned };\n }\n return p;\n })\n );\n };\n\n return (\n <TableTh\n data-accessor={accessor}\n data-pinned={pinnedInfo?.position}\n data-pinned-shadow={pinnedInfo?.isBoundary ? pinnedInfo.position : undefined}\n className={clsx(\n {\n 'mantine-datatable-header-cell-sortable': sortable,\n 'mantine-datatable-header-cell-toggleable': toggleable,\n 'mantine-datatable-header-cell-pinnable': pinnable,\n 'mantine-datatable-header-cell-resizable': resizable,\n },\n className\n )}\n style={[\n {\n width,\n ...(!resizable ? { minWidth: width, maxWidth: width } : {}),\n },\n style,\n pinnedInfo && {\n position: 'sticky',\n [pinnedInfo.position]: pinnedInfo.offset,\n overflow: 'visible',\n },\n ]}\n role={sortable ? 'button' : undefined}\n tabIndex={sortable ? 0 : undefined}\n onClick={sortAction}\n onKeyDown={(e) => e.key === 'Enter' && sortAction?.()}\n ref={columnRef}\n >\n <Group className=\"mantine-datatable-header-cell-sortable-group\" justify=\"space-between\" wrap=\"nowrap\">\n <Flex\n align=\"center\"\n w=\"100%\"\n className={clsx({\n 'mantine-datatable-header-cell-draggable': draggable,\n 'mantine-datatable-header-cell-drag-over': dragOver,\n })}\n draggable={draggable}\n onDragStart={draggable ? handleColumnDragStart : undefined}\n onDragEnter={draggable ? handleColumnDragEnter : undefined}\n onDragOver={draggable ? handleColumnDragOver : undefined}\n onDrop={draggable ? handleColumnDrop : undefined}\n onDragLeave={draggable ? handleColumnDragLeave : undefined}\n >\n {draggable ? (\n <Center role=\"img\" aria-label=\"Drag column\">\n <ActionIcon\n className=\"mantine-datatable-header-cell-draggable-action-icon\"\n variant=\"subtle\"\n size=\"xs\"\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n }}\n >\n <IconGripVertical />\n </ActionIcon>\n </Center>\n ) : null}\n <Box\n className={clsx(\n 'mantine-datatable-header-cell-sortable-text',\n {\n [TEXT_ALIGN_LEFT]: textAlign === 'left',\n [TEXT_ALIGN_CENTER]: textAlign === 'center',\n [TEXT_ALIGN_RIGHT]: textAlign === 'right',\n },\n NOWRAP,\n ELLIPSIS\n )}\n title={tooltip}\n >\n {text}\n </Box>\n </Flex>\n {pinnable ? <DataTablePinnableDropdown currentPinned={currentPinned} onPinChange={handlePinChange} /> : null}\n {toggleable ? (\n <Center className=\"mantine-datatable-header-cell-toggleable-icon\" role=\"img\" aria-label=\"Toggle column\">\n <ActionIcon size=\"xs\" variant=\"light\" onClick={handleColumnToggle}>\n <IconX />\n </ActionIcon>\n </Center>\n ) : null}\n {sortable || sortStatus?.columnAccessor === accessor ? (\n sortStatus?.columnAccessor === accessor ? (\n <Center\n className={clsx('mantine-datatable-header-cell-sortable-icon', {\n 'mantine-datatable-header-cell-sortable-icon-reversed': sortStatus.direction === 'desc',\n })}\n role=\"img\"\n aria-label={`Sorted ${sortStatus.direction === 'desc' ? 'descending' : 'ascending'}`}\n >\n {sortIcons?.sorted || <IconArrowUp />}\n </Center>\n ) : (\n <Center className=\"mantine-datatable-header-cell-sortable-unsorted-icon\" role=\"img\" aria-label=\"Not sorted\">\n {sortIcons?.unsorted || <IconArrowsVertical />}\n </Center>\n )\n ) : null}\n {filter ? (\n <DataTableHeaderCellFilter\n filterPopoverProps={filterPopoverProps}\n isActive={!!filtering}\n filterPopoverDisableClickOutside={filterPopoverDisableClickOutside}\n >\n {filter}\n </DataTableHeaderCellFilter>\n ) : null}\n </Group>\n {resizable && accessor !== '__selection__' ? (\n <DataTableResizableHeaderHandle accessor={accessor as string} columnRef={columnRef} />\n ) : null}\n </TableTh>\n );\n}\n","import { ActionIcon, Popover, PopoverDropdown, PopoverTarget } from '@mantine/core';\nimport { useClickOutside, useDisclosure } from '@mantine/hooks';\nimport type { RefObject } from 'react';\nimport { IconFilter } from './icons/IconFilter';\nimport { IconFilterFilled } from './icons/IconFilterFilled';\nimport type { DataTableColumn } from './types';\n\ntype DataTableHeaderCellFilterProps<T> = {\n children: DataTableColumn<T>['filter'];\n filterPopoverProps: DataTableColumn<T>['filterPopoverProps'];\n filterPopoverDisableClickOutside?: DataTableColumn<T>['filterPopoverDisableClickOutside'];\n isActive: boolean;\n};\n\nexport function DataTableHeaderCellFilter<T>({\n children,\n isActive,\n filterPopoverProps,\n filterPopoverDisableClickOutside,\n}: DataTableHeaderCellFilterProps<T>) {\n const [isOpen, { close, toggle }] = useDisclosure(false);\n const Icon = isActive ? IconFilterFilled : IconFilter;\n let ref: RefObject<HTMLDivElement | null> | undefined = useClickOutside(close);\n if (filterPopoverDisableClickOutside) ref = undefined;\n\n return (\n // Keep the expanded props before the open/close, or they could be overridden by the client\n <Popover withArrow shadow=\"md\" trapFocus {...filterPopoverProps} opened={isOpen} onClose={close} onDismiss={close}>\n <PopoverTarget>\n <ActionIcon\n className=\"mantine-datatable-header-cell-filter-action-icon\"\n data-active={isActive || undefined}\n size=\"sm\"\n variant=\"default\"\n onClick={(e) => {\n e.preventDefault();\n toggle();\n }}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <Icon />\n </ActionIcon>\n </PopoverTarget>\n <PopoverDropdown ref={ref} onClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()}>\n {typeof children === 'function' ? children({ close }) : children}\n </PopoverDropdown>\n </Popover>\n );\n}\n","export function IconFilter() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z\" />\n </svg>\n );\n}\n","export function IconFilterFilled() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M20 3h-16a1 1 0 0 0 -1 1v2.227l.008 .223a3 3 0 0 0 .772 1.795l4.22 4.641v8.114a1 1 0 0 0 1.316 .949l6 -2l.108 -.043a1 1 0 0 0 .576 -.906v-6.586l4.121 -4.12a3 3 0 0 0 .879 -2.123v-2.171a1 1 0 0 0 -1 -1z\"\n strokeWidth=\"0\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","'use client';\n\nimport { ActionIcon, Center, Group, Popover } from '@mantine/core';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useIsomorphicLayoutEffect } from './hooks/useIsomorphicLayoutEffect';\nimport { IconArrowLeft } from './icons/IconArrowLeft';\nimport { IconArrowRight } from './icons/IconArrowRight';\nimport { IconPin } from './icons/IconPin';\nimport { IconX } from './icons/IconX';\n\ntype DataTablePinnableDropdownProps = {\n currentPinned: 'left' | 'right' | undefined;\n onPinChange: (pinned: 'left' | 'right' | undefined) => void;\n};\n\nexport function DataTablePinnableDropdown({ currentPinned, onPinChange }: DataTablePinnableDropdownProps) {\n const [opened, setOpened] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isRtl, setIsRtl] = useState(false);\n\n // Detect RTL from DOM - more reliable than useDirection() which may not see local DirectionProvider\n const detectDirection = useCallback(() => {\n if (containerRef.current) {\n const computedDir = getComputedStyle(containerRef.current).direction;\n setIsRtl(computedDir === 'rtl');\n }\n }, []);\n\n // Use layout effect for synchronous detection (no flash)\n useIsomorphicLayoutEffect(() => {\n detectDirection();\n }, [detectDirection]);\n\n // Re-detect on open (in case direction changed)\n useEffect(() => {\n if (opened) {\n detectDirection();\n }\n }, [opened, detectDirection]);\n\n // In RTL mode, visual arrows should map to opposite logical sides:\n // - Left arrow (visually pointing left) → physical left edge → 'right' in RTL\n // - Right arrow (visually pointing right) → physical right edge → 'left' in RTL\n const leftArrowPinValue: 'left' | 'right' = isRtl ? 'right' : 'left';\n const rightArrowPinValue: 'left' | 'right' = isRtl ? 'left' : 'right';\n\n // For highlighting: check if current pinned matches what this arrow would set\n const isLeftArrowActive = currentPinned === leftArrowPinValue;\n const isRightArrowActive = currentPinned === rightArrowPinValue;\n\n return (\n <Popover opened={opened} onChange={setOpened} position=\"bottom\" withArrow shadow=\"sm\">\n <Popover.Target>\n <Center\n ref={containerRef}\n className=\"mantine-datatable-header-cell-pinnable-icon\"\n role=\"button\"\n aria-label=\"Pin column\"\n onMouseEnter={() => setOpened(true)}\n onMouseLeave={() => setOpened(false)}\n >\n <ActionIcon size=\"xs\" variant=\"light\" onClick={(e) => e.stopPropagation()}>\n <IconPin />\n </ActionIcon>\n </Center>\n </Popover.Target>\n\n <Popover.Dropdown\n onClick={(e) => e.stopPropagation()}\n onMouseEnter={() => setOpened(true)}\n onMouseLeave={() => setOpened(false)}\n className=\"mantine-datatable-pinnable-dropdown\"\n >\n <Group gap={4}>\n <ActionIcon\n size=\"sm\"\n variant={isLeftArrowActive ? 'filled' : 'light'}\n onClick={() => onPinChange(isLeftArrowActive ? undefined : leftArrowPinValue)}\n aria-label=\"Pin left\"\n >\n <IconArrowLeft />\n </ActionIcon>\n <ActionIcon\n size=\"sm\"\n variant={isRightArrowActive ? 'filled' : 'light'}\n onClick={() => onPinChange(isRightArrowActive ? undefined : rightArrowPinValue)}\n aria-label=\"Pin right\"\n >\n <IconArrowRight />\n </ActionIcon>\n {currentPinned && (\n <ActionIcon size=\"sm\" variant=\"light\" color=\"red\" onClick={() => onPinChange(undefined)} aria-label=\"Unpin\">\n <IconX />\n </ActionIcon>\n )}\n </Group>\n </Popover.Dropdown>\n </Popover>\n );\n}\n","export function IconArrowLeft() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M5 12l14 0\" />\n <path d=\"M5 12l6 6\" />\n <path d=\"M5 12l6 -6\" />\n </svg>\n );\n}\n","export function IconArrowRight() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M5 12l14 0\" />\n <path d=\"M19 12l-6 6\" />\n <path d=\"M19 12l-6 -6\" />\n </svg>\n );\n}\n","export function IconPin() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M9 4v6l-2 4v2h10v-2l-2-4v-6\" />\n <path d=\"M12 16v5\" />\n <path d=\"M8 4h8\" />\n </svg>\n );\n}\n","export function IconX() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M18 6l-12 12\" />\n <path d=\"M6 6l12 12\" />\n </svg>\n );\n}\n","import { useDirection } from '@mantine/core';\nimport type { RefObject } from 'react';\nimport { useCallback, useRef, useState } from 'react';\nimport { useDataTableColumnsContext } from './DataTableColumns.context';\n\ntype DataTableResizableHeaderHandleProps = {\n accessor: string;\n columnRef: RefObject<HTMLTableCellElement | null>;\n};\n\nconst MIN_COLUMN_WIDTH = 50;\n\nexport const DataTableResizableHeaderHandle = (props: DataTableResizableHeaderHandleProps) => {\n const { accessor, columnRef } = props;\n const [isResizing, setIsResizing] = useState(false);\n const startXRef = useRef<number>(0);\n const originalWidthsRef = useRef<{ current: number; next: number }>({ current: 0, next: 0 });\n\n const { dir } = useDirection();\n const isRTL = dir === 'rtl';\n\n const { setMultipleColumnWidths, beginResize, endResize } = useDataTableColumnsContext();\n\n const handleMouseDown = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!columnRef.current) return;\n\n const currentColumn = columnRef.current;\n\n // Find the next resizable data column (skip selection column)\n let nextColumn = currentColumn.nextElementSibling as HTMLTableCellElement | null;\n while (nextColumn) {\n const nextAccessor = nextColumn.getAttribute('data-accessor');\n if (nextAccessor && nextAccessor !== '__selection__') {\n break;\n }\n nextColumn = nextColumn.nextElementSibling as HTMLTableCellElement | null;\n }\n\n if (!nextColumn) {\n return;\n }\n\n const nextAccessor = nextColumn.getAttribute('data-accessor');\n if (!nextAccessor) {\n return;\n }\n\n // Capture pixel widths BEFORE switching the table to fixed layout —\n // these are the natural rendered widths the user is starting from.\n const startCurrentWidth = currentColumn.offsetWidth;\n const startNextWidth = nextColumn.offsetWidth;\n\n // Snapshot every header cell into pixel widths and switch to fixed layout\n beginResize();\n\n setIsResizing(true);\n startXRef.current = event.clientX;\n originalWidthsRef.current = {\n current: startCurrentWidth,\n next: startNextWidth,\n };\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n let deltaX = moveEvent.clientX - startXRef.current;\n if (isRTL) deltaX = -deltaX;\n\n const maxShrinkCurrent = originalWidthsRef.current.current - MIN_COLUMN_WIDTH;\n const maxShrinkNext = originalWidthsRef.current.next - MIN_COLUMN_WIDTH;\n\n const constrainedDelta = Math.max(-maxShrinkCurrent, Math.min(deltaX, maxShrinkNext));\n\n const finalCurrentWidth = originalWidthsRef.current.current + constrainedDelta;\n const finalNextWidth = originalWidthsRef.current.next - constrainedDelta;\n\n // State-driven update: pushes the new widths through `effectiveColumns`\n // and keeps React in sync with the DOM. With table-layout: fixed the\n // browser honors the new pixel widths precisely.\n setMultipleColumnWidths([\n { accessor, width: `${finalCurrentWidth}px` },\n { accessor: nextAccessor, width: `${finalNextWidth}px` },\n ]);\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n\n document.body.style.cursor = 'initial';\n document.body.style.userSelect = 'initial';\n\n endResize();\n\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n },\n [accessor, columnRef, isRTL, setMultipleColumnWidths, beginResize, endResize]\n );\n\n const handleDoubleClick = useCallback(() => {\n if (!columnRef.current) return;\n\n const currentColumn = columnRef.current;\n const nextColumn = currentColumn.nextElementSibling as HTMLTableCellElement | null;\n\n const updates = [{ accessor, width: 'auto' }];\n\n if (nextColumn) {\n const nextAccessor = nextColumn.getAttribute('data-accessor');\n if (nextAccessor && nextAccessor !== '__selection__') {\n updates.push({ accessor: nextAccessor, width: 'auto' });\n }\n }\n\n setMultipleColumnWidths(updates);\n }, [accessor, columnRef, setMultipleColumnWidths]);\n\n return (\n <div\n className=\"mantine-datatable-header-resizable-handle\"\n style={{\n cursor: isResizing ? 'col-resize' : undefined,\n }}\n onMouseDown={handleMouseDown}\n onDoubleClick={handleDoubleClick}\n onClick={(event) => event.stopPropagation()} // Prevent column sorting\n title=\"Drag to resize column, double-click to reset\"\n />\n );\n};\n","export function IconArrowsVertical() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M8 7l4 -4l4 4\" />\n <path d=\"M8 17l4 4l4 -4\" />\n <path d=\"M12 3l0 18\" />\n </svg>\n );\n}\n","export function IconArrowUp() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 5l0 14\" />\n <path d=\"M16 9l-4 -4\" />\n <path d=\"M8 9l4 -4\" />\n </svg>\n );\n}\n","export function IconGripVertical() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M9 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\" />\n <path d=\"M9 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\" />\n <path d=\"M9 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\" />\n <path d=\"M15 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\" />\n <path d=\"M15 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\" />\n <path d=\"M15 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\" />\n </svg>\n );\n}\n","import type { MantineStyleProp } from '@mantine/core';\nimport { Checkbox, type CheckboxProps, TableTh } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { DataTableSelectionTrigger } from './types';\nimport { POINTER_CURSOR } from './utilityClasses';\n\ntype DataTableHeaderSelectorCellProps = {\n className: string | undefined;\n style: MantineStyleProp | undefined;\n trigger: DataTableSelectionTrigger;\n shadowVisible: boolean;\n checked: boolean;\n indeterminate: boolean;\n checkboxProps: CheckboxProps;\n onChange: (() => void) | undefined;\n rowSpan: number | undefined;\n ref: React.Ref<HTMLTableCellElement>;\n};\n\nexport function DataTableHeaderSelectorCell({\n className,\n style,\n trigger,\n shadowVisible,\n checked,\n indeterminate,\n checkboxProps,\n onChange,\n rowSpan,\n ref,\n}: DataTableHeaderSelectorCellProps) {\n const enabled = !checkboxProps.disabled;\n\n return (\n <TableTh\n ref={ref}\n className={clsx(\n 'mantine-datatable-header-selector-cell',\n { [POINTER_CURSOR]: trigger === 'cell' && enabled },\n className\n )}\n style={style}\n rowSpan={rowSpan}\n data-shadow-visible={shadowVisible || undefined}\n data-accessor=\"__selection__\"\n onClick={trigger === 'cell' && enabled ? onChange : undefined}\n >\n <Checkbox\n classNames={enabled ? { input: POINTER_CURSOR } : undefined}\n checked={checked}\n indeterminate={indeterminate}\n onChange={onChange}\n {...checkboxProps}\n disabled={!(onChange || checkboxProps.onChange) || checkboxProps.disabled}\n />\n </TableTh>\n );\n}\n","import { Center, Loader, type MantineColor, type MantineLoader, type MantineSize } from '@mantine/core';\nimport clsx from 'clsx';\n\ntype DataTableLoaderProps = {\n fetching: boolean | undefined;\n customContent: React.ReactNode | undefined;\n backgroundBlur: number | undefined;\n size: MantineSize | (string & NonNullable<unknown>) | number | undefined;\n type: MantineLoader | undefined;\n color: MantineColor | undefined;\n};\n\nexport function DataTableLoader({ fetching, customContent, backgroundBlur, size, type, color }: DataTableLoaderProps) {\n return (\n <Center\n className={clsx('mantine-datatable-loader', { 'mantine-datatable-loader-fetching': fetching })}\n style={[{ backdropFilter: backgroundBlur ? `blur(${backgroundBlur}px)` : undefined }]}\n >\n {fetching && (customContent || <Loader size={size} type={type} color={color} />)}\n </Center>\n );\n}\n","import { Box, type MantineSpacing, type MantineStyleProp, Pagination, rem, Text } from '@mantine/core';\nimport clsx from 'clsx';\nimport { getPaginationCssVariables } from './cssVariables';\nimport { DataTablePageSizeSelector } from './DataTablePageSizeSelector';\nimport { useMediaQueryStringOrFunction } from './hooks';\nimport type { DataTablePaginationProps } from './types';\nimport type { DataTablePaginationRenderContext } from './types/DataTablePaginationRenderContext';\nimport type { WithOptionalProperty, WithRequiredProperty } from './types/utils';\n\ntype DataTablePaginationComponentProps = WithOptionalProperty<\n WithRequiredProperty<\n DataTablePaginationProps,\n 'loadingText' | 'paginationSize' | 'recordsPerPageLabel' | 'paginationWrapBreakpoint' | 'getPaginationControlProps'\n >,\n 'onRecordsPerPageChange' | 'recordsPerPageOptions' | 'renderPagination'\n> & {\n className: string | undefined;\n style: MantineStyleProp | undefined;\n fetching: boolean | undefined;\n recordsLength: number | undefined;\n horizontalSpacing: MantineSpacing | undefined;\n noRecordsText: string;\n};\n\nexport function DataTablePagination({\n className,\n style,\n fetching,\n page,\n onPageChange,\n paginationWithEdges,\n paginationWithControls,\n paginationActiveTextColor,\n paginationActiveBackgroundColor,\n paginationSize,\n loadingText,\n noRecordsText,\n paginationText,\n totalRecords,\n recordsPerPage,\n onRecordsPerPageChange,\n recordsPerPageLabel,\n recordsPerPageOptions,\n recordsLength,\n horizontalSpacing,\n paginationWrapBreakpoint,\n getPaginationControlProps,\n getPaginationItemProps,\n renderPagination,\n}: DataTablePaginationComponentProps) {\n let paginationTextValue: React.ReactNode;\n if (totalRecords) {\n const from = (page - 1) * recordsPerPage + 1;\n const to = from + (recordsLength || 0) - 1;\n paginationTextValue = paginationText!({ from, to, totalRecords });\n } else {\n paginationTextValue = fetching ? loadingText : noRecordsText;\n }\n\n const totalPages = totalRecords && recordsPerPage ? Math.max(1, Math.ceil(totalRecords / recordsPerPage)) : 1;\n\n const from = totalRecords ? (page - 1) * (recordsPerPage ?? 0) + 1 : undefined;\n const to = totalRecords ? (from ?? 1) + (recordsLength ?? 0) - 1 : undefined;\n\n const isAbovePaginationWrapBreakpoint = useMediaQueryStringOrFunction(\n ({ breakpoints }) =>\n `(min-width: ${\n typeof paginationWrapBreakpoint === 'number'\n ? `${rem(paginationWrapBreakpoint)}rem`\n : breakpoints[paginationWrapBreakpoint] || paginationWrapBreakpoint\n })`\n );\n\n const isWrapped = !isAbovePaginationWrapBreakpoint;\n\n const Controls: DataTablePaginationRenderContext['Controls'] = {\n Text: (props) => (\n <Text component=\"div\" className=\"mantine-datatable-pagination-text\" size={paginationSize} {...props}>\n {paginationTextValue}\n </Text>\n ),\n PageSizeSelector: (props) =>\n recordsPerPageOptions ? (\n <DataTablePageSizeSelector\n activeTextColor={paginationActiveTextColor}\n activeBackgroundColor={paginationActiveBackgroundColor}\n size={paginationSize}\n label={recordsPerPageLabel}\n values={recordsPerPageOptions}\n value={recordsPerPage!}\n onChange={onRecordsPerPageChange!}\n {...props}\n />\n ) : null,\n Pagination: (props) => (\n <Pagination\n classNames={{\n root: clsx('mantine-datatable-pagination-pages', {\n 'mantine-datatable-pagination-pages-fetching': fetching || !recordsLength,\n }),\n control: 'mantine-datatable-pagination-pages-control',\n }}\n style={\n paginationActiveTextColor || paginationActiveBackgroundColor\n ? (theme) =>\n getPaginationCssVariables({\n theme,\n paginationActiveTextColor,\n paginationActiveBackgroundColor,\n })\n : undefined\n }\n withEdges={paginationWithEdges}\n withControls={paginationWithControls}\n value={page}\n onChange={onPageChange}\n size={paginationSize}\n total={totalPages}\n getControlProps={getPaginationControlProps}\n getItemProps={getPaginationItemProps}\n {...props}\n />\n ),\n };\n\n const ctx: DataTablePaginationRenderContext = {\n state: {\n paginationSize,\n page,\n totalPages,\n totalRecords,\n recordsPerPage,\n recordsLength,\n fetching,\n from,\n to,\n isWrapped,\n },\n actions: {\n setPage: (n) => onPageChange?.(n),\n setRecordsPerPage: onRecordsPerPageChange ? (n) => onRecordsPerPageChange(n) : undefined,\n },\n Controls,\n };\n\n return (\n <Box\n px={horizontalSpacing ?? 'xs'}\n py=\"xs\"\n className={clsx('mantine-datatable-pagination', className)}\n style={[{ flexDirection: isWrapped ? 'column' : 'row' }, style]}\n >\n {typeof renderPagination === 'function' ? (\n renderPagination(ctx)\n ) : (\n <>\n <Controls.Text />\n <Controls.PageSizeSelector />\n <Controls.Pagination />\n </>\n )}\n </Box>\n );\n}\n","import type { MantineColor } from '@mantine/core';\nimport { Button, Group, type MantineSize, Menu, MenuDropdown, MenuItem, MenuTarget, rem, Text } from '@mantine/core';\nimport clsx from 'clsx';\nimport { getPaginationCssVariables } from './cssVariables';\nimport { IconSelector } from './icons/IconSelector';\n\ntype DataTablePageSizeSelectorComponentProps = {\n size: MantineSize;\n label: string;\n values: number[];\n value: number;\n activeTextColor: MantineColor | { dark: MantineColor; light: MantineColor } | undefined;\n activeBackgroundColor: MantineColor | { dark: MantineColor; light: MantineColor } | undefined;\n onChange: (value: number) => void;\n};\n\nconst HEIGHT: Record<MantineSize, string> = { xs: rem(22), sm: rem(26), md: rem(32), lg: rem(38), xl: rem(44) };\n\nexport function DataTablePageSizeSelector({\n size,\n label,\n values,\n value,\n activeTextColor,\n activeBackgroundColor,\n onChange,\n}: DataTablePageSizeSelectorComponentProps) {\n return (\n <Group gap=\"xs\">\n <Text component=\"div\" size={size}>\n {label}\n </Text>\n <Menu withinPortal withArrow offset={2} classNames={{ arrow: 'mantine-datatable-page-size-selector-menu-arrow' }}>\n <MenuTarget>\n <Button\n size={size}\n variant=\"default\"\n classNames={{ section: 'mantine-datatable-page-size-selector-button-icon' }}\n rightSection={<IconSelector />}\n style={[\n { fontWeight: 'normal' },\n (theme) => ({\n height: HEIGHT[size],\n paddingLeft: theme.spacing[size],\n paddingRight: theme.spacing[size],\n }),\n ]}\n >\n {value}\n </Button>\n </MenuTarget>\n <MenuDropdown>\n {values.map((v) => {\n const isCurrent = v === value;\n return (\n <MenuItem\n key={v}\n className={clsx({ 'mantine-datatable-page-size-selector-active': isCurrent })}\n style={[\n { height: HEIGHT[size] },\n isCurrent && (activeTextColor || activeBackgroundColor)\n ? (theme) =>\n getPaginationCssVariables({\n theme,\n paginationActiveTextColor: activeTextColor,\n paginationActiveBackgroundColor: activeBackgroundColor,\n })\n : undefined,\n ]}\n disabled={isCurrent}\n onClick={() => onChange(v)}\n >\n <Text component=\"div\" size={size}>\n {v}\n </Text>\n </MenuItem>\n );\n })}\n </MenuDropdown>\n </Menu>\n </Group>\n );\n}\n","export function IconSelector() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M8 9l4 -4l4 4\" />\n <path d=\"M16 15l-4 4l-4 -4\" />\n </svg>\n );\n}\n","import type { MantineTheme } from '@mantine/core';\nimport { type CheckboxProps, type MantineColor, type MantineStyleProp, TableTr } from '@mantine/core';\nimport clsx from 'clsx';\nimport { getRowCssVariables } from './cssVariables';\nimport { DataTableRowCell } from './DataTableRowCell';\nimport { DataTableRowExpansion } from './DataTableRowExpansion';\nimport { DataTableRowSelectorCell } from './DataTableRowSelectorCell';\nimport type { PinnedColumnInfo, useRowExpansion } from './hooks';\nimport type {\n DataTableCellClickHandler,\n DataTableColumn,\n DataTableDefaultColumnProps,\n DataTableProps,\n DataTableRowClickHandler,\n DataTableSelectionTrigger,\n} from './types';\nimport { CONTEXT_MENU_CURSOR, POINTER_CURSOR } from './utilityClasses';\n\ntype DataTableRowProps<T> = {\n record: T;\n index: number;\n columns: DataTableColumn<T>[];\n defaultColumnProps: DataTableDefaultColumnProps<T> | undefined;\n pinnedMap: Map<string, PinnedColumnInfo>;\n defaultColumnRender:\n | ((record: T, index: number, accessor: keyof T | (string & NonNullable<unknown>)) => React.ReactNode)\n | undefined;\n selectionTrigger: DataTableSelectionTrigger;\n selectionVisible: boolean;\n selectionChecked: boolean;\n onSelectionChange: React.MouseEventHandler | undefined;\n isRecordSelectable: ((record: T, index: number) => boolean) | undefined;\n selectionCheckboxProps: CheckboxProps | undefined;\n getSelectionCheckboxProps: (record: T, index: number) => CheckboxProps;\n onClick: DataTableRowClickHandler<T> | undefined;\n onDoubleClick: DataTableRowClickHandler<T> | undefined;\n onContextMenu: DataTableRowClickHandler<T> | undefined;\n onCellClick: DataTableCellClickHandler<T> | undefined;\n onCellDoubleClick: DataTableCellClickHandler<T> | undefined;\n onCellContextMenu: DataTableCellClickHandler<T> | undefined;\n expansion: ReturnType<typeof useRowExpansion<T>>;\n customAttributes?: (record: T, index: number) => Record<string, unknown>;\n color:\n | ((record: T, index: number) => MantineColor | undefined | { light: MantineColor; dark: MantineColor })\n | undefined;\n backgroundColor:\n | ((record: T, index: number) => MantineColor | undefined | { light: MantineColor; dark: MantineColor })\n | undefined;\n className?: string | ((record: T, index: number) => string | undefined);\n style?: (record: T, index: number) => MantineStyleProp | undefined;\n selectorCellShadowVisible: boolean;\n selectionColumnClassName: string | undefined;\n selectionColumnStyle: MantineStyleProp | undefined;\n idAccessor: string;\n} & Pick<DataTableProps<T>, 'rowFactory'>;\n\nexport function DataTableRow<T>({\n record,\n index,\n columns,\n defaultColumnProps,\n pinnedMap,\n defaultColumnRender,\n selectionTrigger,\n selectionVisible,\n selectionChecked,\n onSelectionChange,\n isRecordSelectable,\n selectionCheckboxProps,\n getSelectionCheckboxProps,\n onClick,\n onDoubleClick,\n onContextMenu,\n onCellClick,\n onCellDoubleClick,\n onCellContextMenu,\n expansion,\n customAttributes,\n color,\n backgroundColor,\n className,\n style,\n selectorCellShadowVisible,\n selectionColumnClassName,\n selectionColumnStyle,\n rowFactory,\n}: Readonly<DataTableRowProps<T>>) {\n const cols = (\n <>\n {selectionVisible && (\n <DataTableRowSelectorCell<T>\n className={selectionColumnClassName}\n style={selectionColumnStyle}\n record={record}\n index={index}\n trigger={selectionTrigger}\n withRightShadow={selectorCellShadowVisible}\n checked={selectionChecked}\n disabled={!onSelectionChange || (isRecordSelectable ? !isRecordSelectable(record, index) : false)}\n onChange={onSelectionChange}\n checkboxProps={selectionCheckboxProps}\n getCheckboxProps={getSelectionCheckboxProps}\n />\n )}\n\n {columns.map(({ hidden, hiddenContent, ...columnProps }, columnIndex) => {\n if (hidden || hiddenContent) return null;\n\n const {\n accessor,\n visibleMediaQuery,\n textAlign,\n noWrap,\n ellipsis,\n width,\n render,\n cellsClassName,\n cellsStyle,\n customCellAttributes,\n } = { ...defaultColumnProps, ...columnProps };\n\n return (\n <DataTableRowCell<T>\n key={accessor as React.Key}\n pinnedInfo={pinnedMap.get(String(accessor))}\n className={typeof cellsClassName === 'function' ? cellsClassName(record, index) : cellsClassName}\n style={cellsStyle?.(record, index)}\n visibleMediaQuery={visibleMediaQuery}\n record={record}\n index={index}\n onClick={\n onCellClick\n ? (event) => onCellClick({ event, record, index, column: columnProps, columnIndex })\n : undefined\n }\n onDoubleClick={\n onCellDoubleClick\n ? (event) => onCellDoubleClick({ event, record, index, column: columnProps, columnIndex })\n : undefined\n }\n onContextMenu={\n onCellContextMenu\n ? (event) => onCellContextMenu({ event, record, index, column: columnProps, columnIndex })\n : undefined\n }\n accessor={accessor}\n textAlign={textAlign}\n noWrap={noWrap}\n ellipsis={ellipsis}\n width={width}\n render={render}\n defaultRender={defaultColumnRender}\n customCellAttributes={customCellAttributes}\n />\n );\n })}\n </>\n );\n\n const expandedElement = expansion && (\n <DataTableRowExpansion\n colSpan={columns.filter(({ hidden }) => !hidden).length + (selectionVisible ? 1 : 0)}\n open={expansion.isRowExpanded(record)}\n content={expansion.content({ record, index })}\n collapseProps={expansion.collapseProps}\n />\n );\n\n const rowProps = getRowProps({\n record,\n index,\n selectionChecked,\n onClick,\n onDoubleClick,\n onContextMenu,\n expansion,\n customAttributes,\n color,\n backgroundColor,\n className,\n style,\n });\n\n if (rowFactory) {\n return rowFactory({\n record,\n index,\n rowProps,\n children: cols,\n expandedElement,\n });\n }\n\n return (\n <>\n <TableTr {...rowProps}>{cols}</TableTr>\n {expandedElement}\n </>\n );\n}\n\ntype GetRowPropsArgs<T> = Readonly<\n Pick<\n DataTableRowProps<T>,\n | 'record'\n | 'index'\n | 'selectionChecked'\n | 'onClick'\n | 'onDoubleClick'\n | 'onContextMenu'\n | 'expansion'\n | 'customAttributes'\n | 'color'\n | 'backgroundColor'\n | 'className'\n | 'style'\n >\n>;\n\nexport function getRowProps<T>({\n record,\n index,\n selectionChecked,\n onClick,\n onDoubleClick,\n onContextMenu,\n expansion,\n customAttributes,\n color,\n backgroundColor,\n className,\n style,\n}: GetRowPropsArgs<T>) {\n return {\n className: clsx(\n 'mantine-datatable-row',\n {\n [POINTER_CURSOR]:\n onClick || onDoubleClick || (expansion?.isExpandable({ record, index }) && expansion?.expandOnClick),\n },\n { [CONTEXT_MENU_CURSOR]: onContextMenu },\n typeof className === 'function' ? className(record, index) : className\n ),\n\n 'data-selected': selectionChecked || undefined,\n\n onClick: (e: React.MouseEvent<HTMLTableRowElement, MouseEvent>) => {\n if (expansion) {\n const { isExpandable, isRowExpanded, expandOnClick, expandRow, collapseRow } = expansion;\n if (isExpandable({ record, index }) && expandOnClick) {\n if (isRowExpanded(record)) {\n collapseRow(record);\n } else {\n expandRow(record);\n }\n }\n }\n onClick?.({ event: e, record, index });\n },\n onDoubleClick: onDoubleClick\n ? (e: React.MouseEvent<HTMLTableRowElement, MouseEvent>) => onDoubleClick({ event: e, record, index })\n : undefined,\n onContextMenu: onContextMenu\n ? (e: React.MouseEvent<HTMLTableRowElement, MouseEvent>) => onContextMenu({ event: e, record, index })\n : undefined,\n style: [\n color || backgroundColor\n ? (theme: MantineTheme) => {\n const colorValue = color?.(record, index);\n const backgroundColorValue = backgroundColor?.(record, index);\n return getRowCssVariables({ theme, color: colorValue, backgroundColor: backgroundColorValue });\n }\n : undefined,\n style?.(record, index),\n ],\n ...(customAttributes?.(record, index) ?? {}),\n };\n}\n","import { type MantineStyleProp, TableTd } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { PinnedColumnInfo } from './hooks';\nimport { useMediaQueryStringOrFunction } from './hooks';\nimport type { DataTableColumn } from './types';\nimport {\n CONTEXT_MENU_CURSOR,\n ELLIPSIS,\n NOWRAP,\n POINTER_CURSOR,\n TEXT_ALIGN_CENTER,\n TEXT_ALIGN_LEFT,\n TEXT_ALIGN_RIGHT,\n} from './utilityClasses';\nimport { getValueAtPath } from './utils';\n\ntype DataTableRowCellProps<T> = {\n className: string | undefined;\n style: MantineStyleProp | undefined;\n pinnedInfo: PinnedColumnInfo | undefined;\n record: T;\n index: number;\n defaultRender:\n | ((record: T, index: number, accessor: keyof T | (string & NonNullable<unknown>)) => React.ReactNode)\n | undefined;\n onClick: React.MouseEventHandler<HTMLTableCellElement> | undefined;\n onDoubleClick: React.MouseEventHandler<HTMLTableCellElement> | undefined;\n onContextMenu: React.MouseEventHandler<HTMLTableCellElement> | undefined;\n} & Pick<\n DataTableColumn<T>,\n 'accessor' | 'visibleMediaQuery' | 'textAlign' | 'width' | 'noWrap' | 'ellipsis' | 'render' | 'customCellAttributes'\n>;\n\nexport function DataTableRowCell<T>({\n className,\n style,\n pinnedInfo,\n visibleMediaQuery,\n record,\n index,\n onClick,\n onDoubleClick,\n onContextMenu,\n noWrap,\n ellipsis,\n textAlign,\n width,\n accessor,\n render,\n defaultRender,\n customCellAttributes,\n}: DataTableRowCellProps<T>) {\n if (!useMediaQueryStringOrFunction(visibleMediaQuery)) return null;\n return (\n <TableTd\n data-pinned={pinnedInfo?.position}\n data-pinned-shadow={pinnedInfo?.isBoundary ? pinnedInfo.position : undefined}\n className={clsx(\n {\n [NOWRAP]: noWrap || ellipsis,\n [ELLIPSIS]: ellipsis,\n [POINTER_CURSOR]: onClick || onDoubleClick,\n [CONTEXT_MENU_CURSOR]: onContextMenu,\n [TEXT_ALIGN_LEFT]: textAlign === 'left',\n [TEXT_ALIGN_CENTER]: textAlign === 'center',\n [TEXT_ALIGN_RIGHT]: textAlign === 'right',\n },\n className\n )}\n style={[\n {\n width,\n minWidth: width,\n maxWidth: width,\n },\n style,\n pinnedInfo && {\n position: 'sticky',\n [pinnedInfo.position]: pinnedInfo.offset,\n overflow: 'visible',\n },\n ]}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onContextMenu={onContextMenu}\n {...customCellAttributes?.(record, index)}\n >\n {render\n ? render(record, index)\n : defaultRender\n ? defaultRender(record, index, accessor)\n : (getValueAtPath(record, accessor) as React.ReactNode)}\n </TableTd>\n );\n}\n","import { Collapse, TableTd, TableTr } from '@mantine/core';\nimport { useRowExpansionStatus } from './hooks';\nimport type { DataTableRowExpansionCollapseProps } from './types';\n\ntype DataTableRowExpansionProps = {\n open: boolean;\n colSpan: number;\n content: () => React.ReactNode;\n collapseProps: DataTableRowExpansionCollapseProps | undefined;\n};\n\nexport function DataTableRowExpansion({ open, colSpan, content, collapseProps }: DataTableRowExpansionProps) {\n const { expanded, visible } = useRowExpansionStatus(open, collapseProps?.transitionDuration);\n\n return visible ? (\n <>\n {/* add an empty row to maintain striped rows consistency */}\n <TableTr />\n <TableTr>\n <TableTd className=\"mantine-datatable-row-expansion-cell\" colSpan={colSpan}>\n <Collapse expanded={expanded} {...collapseProps}>\n <div className=\"mantine-datatable-row-expansion-cell-content\">{content()}</div>\n </Collapse>\n </TableTd>\n </TableTr>\n </>\n ) : null;\n}\n","import type { MantineStyleProp } from '@mantine/core';\nimport { Checkbox, type CheckboxProps, TableTd } from '@mantine/core';\nimport clsx from 'clsx';\nimport type { DataTableSelectionTrigger } from './types';\nimport { POINTER_CURSOR } from './utilityClasses';\n\ntype DataTableRowSelectorCellProps<T> = {\n className: string | undefined;\n style: MantineStyleProp | undefined;\n record: T;\n index: number;\n trigger: DataTableSelectionTrigger;\n withRightShadow: boolean;\n checked: boolean;\n disabled: boolean;\n onChange: React.MouseEventHandler | undefined;\n checkboxProps: CheckboxProps | undefined;\n getCheckboxProps: (record: T, index: number) => CheckboxProps;\n};\n\nexport function DataTableRowSelectorCell<T>({\n className,\n style,\n record,\n index,\n trigger,\n onChange,\n withRightShadow,\n checkboxProps,\n getCheckboxProps,\n ...otherProps\n}: Readonly<DataTableRowSelectorCellProps<T>>) {\n const allCheckboxProps = { ...checkboxProps, ...getCheckboxProps(record, index) };\n const enabled = !otherProps.disabled && !allCheckboxProps.disabled;\n\n const handleClick: React.MouseEventHandler = (e) => {\n e.stopPropagation();\n if (trigger === 'cell' && enabled) {\n onChange?.(e);\n }\n };\n\n return (\n <TableTd\n className={clsx(\n 'mantine-datatable-row-selector-cell',\n { [POINTER_CURSOR]: trigger === 'cell' && enabled },\n className\n )}\n style={style}\n data-shadow-visible={withRightShadow || undefined}\n onClick={handleClick}\n >\n <Checkbox\n classNames={enabled ? { input: POINTER_CURSOR } : undefined}\n onChange={onChange as unknown as React.ChangeEventHandler}\n {...otherProps}\n {...allCheckboxProps}\n />\n </TableTd>\n );\n}\n","import { Box, ScrollArea, type ScrollAreaProps } from '@mantine/core';\nimport clsx from 'clsx';\n\ntype DataTableScrollAreaProps = React.PropsWithChildren<{\n leftShadowBehind: boolean;\n rightShadowBehind: boolean | undefined;\n onScrollPositionChange: ScrollAreaProps['onScrollPositionChange'];\n viewportRef: React.Ref<HTMLDivElement>;\n scrollAreaProps: Omit<ScrollAreaProps, 'classNames' | 'styles' | 'onScrollPositionChange'> | undefined;\n}>;\n\nexport function DataTableScrollArea({\n leftShadowBehind,\n rightShadowBehind,\n onScrollPositionChange,\n children,\n viewportRef,\n scrollAreaProps,\n}: DataTableScrollAreaProps) {\n return (\n <ScrollArea\n {...scrollAreaProps}\n viewportRef={viewportRef}\n classNames={{\n root: 'mantine-datatable-scroll-area',\n scrollbar: 'mantine-datatable-scroll-area-scrollbar',\n thumb: 'mantine-datatable-scroll-area-thumb',\n corner: 'mantine-datatable-scroll-area-corner',\n }}\n onScrollPositionChange={onScrollPositionChange}\n >\n {children}\n <Box className={clsx('mantine-datatable-scroll-area-shadow', 'mantine-datatable-scroll-area-top-shadow')} />\n <div\n className={clsx('mantine-datatable-scroll-area-shadow', 'mantine-datatable-scroll-area-left-shadow', {\n 'mantine-datatable-scroll-area-shadow-behind': leftShadowBehind,\n })}\n />\n <div\n className={clsx('mantine-datatable-scroll-area-shadow', 'mantine-datatable-scroll-area-right-shadow', {\n 'mantine-datatable-scroll-area-shadow-behind': rightShadowBehind,\n })}\n />\n <Box className={clsx('mantine-datatable-scroll-area-shadow', 'mantine-datatable-scroll-area-bottom-shadow')} />\n </ScrollArea>\n );\n}\n","import { TableTr } from '@mantine/core';\nimport { useMergedRef } from '@mantine/hooks';\nimport type { Ref } from 'react';\nimport { useEffect, useRef } from 'react';\nimport type { DataTableDraggableRowProps } from './types';\n\nexport function DataTableDraggableRow({\n className,\n children,\n isDragging,\n ref: refProp,\n ...otherProps\n}: DataTableDraggableRowProps & {\n ref?: Ref<HTMLTableRowElement>;\n}) {\n const ref = useRef<HTMLTableRowElement>(null);\n const mergedRef = useMergedRef(ref, refProp);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-measure cells when children change\n useEffect(() => {\n // a simple fix to keep column width as in table\n if (!ref.current) return;\n if (!isDragging) return;\n\n const tbody = ref.current.parentElement!;\n const table = tbody.parentElement!;\n const thead = table.children[0];\n const headerRow = thead.children[0];\n\n for (let index = 0; index < headerRow.children.length; index++) {\n const headerCell = headerRow.children[index];\n const headerCellDimensions = headerCell.getBoundingClientRect();\n\n const cell = ref.current.children[index] as HTMLTableCellElement;\n\n cell.style.height = `${headerCellDimensions.height}px`;\n cell.style.width = `${headerCellDimensions.width}px`;\n cell.style.minWidth = `${headerCellDimensions.width}px`;\n cell.style.maxWidth = `${headerCellDimensions.width}px`;\n }\n }, [isDragging, children]);\n\n return (\n <TableTr data-is-dragging={isDragging} ref={mergedRef} {...otherProps} className={className}>\n {children}\n </TableTr>\n );\n}\n"],"mappings":"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","names":["index_exports","__export","DataTable","DataTableDraggableRow","calculateColSpan","differenceBy","flattenColumns","getGroupsAtDepth","getMaxGroupDepth","getRecordId","getValueAtPath","hasStringAccessor","humanize","needsRightBorder","reorderRecords","sanitizeStoredArray","swapRecords","uniqBy","useDataTableColumns","__toCommonJS","import_core","import_hooks","import_clsx","import_react","import_core","getColor","color","theme","colorScheme","getTableCssVariables","c","backgroundColor","borderColor","rowBorderColor","stripedColor","highlightOnHoverColor","getPaginationCssVariables","paginationActiveTextColor","paginationActiveBackgroundColor","getRowCssVariables","import_react","import_core","DataTableColumnsContextProvider","useDataTableColumnsContext","import_jsx_runtime","DataTableColumnsProvider","props","children","columnsOrder","setColumnsOrder","columnsToggle","setColumnsToggle","columnsPinning","setColumnsPinning","resetColumnsOrder","resetColumnsToggle","resetColumnsPinning","setColumnWidth","setMultipleColumnWidths","resetColumnsWidth","beginResize","endResize","pinnedMap","sourceColumn","setSourceColumn","targetColumn","setTargetColumn","DataTableColumnsContextProvider","sourceInfo","targetInfo","sourceIndex","targetIndex","newOrder","removed","import_jsx_runtime","DataTableEmptyRow","import_core","import_jsx_runtime","IconDatabaseOff","import_jsx_runtime","DataTableEmptyState","icon","text","active","children","IconDatabaseOff","import_core","import_clsx","import_core","import_clsx","import_react","import_hooks","import_react","humanize","value","str","sanitizeStoredArray","fallback","isValidItem","hasStringAccessor","item","differenceBy","arr1","arr2","iteratee","c","uniqBy","arr","x","i","self","y","getValueAtPath","obj","path","prevObj","key","getRecordId","record","idAccessor","reorderRecords","dropResult","records","draft","prev","swapRecords","destination","sourceEl","destEl","getMaxGroupDepth","groups","group","flattenColumns","columns","col","calculateColSpan","visibles","column","index","sum","subGroup","getGroupsAtDepth","targetDepth","currentDepth","result","needsRightBorder","isLastGroup","hasMoreColumnsAfter","withColumnBorders","useDataTableColumnPinning","key","columns","getInitialValueInEffect","defaultColumnsPinning","column","storedColumnsPinning","_setColumnsPinning","columnsPinning","sanitizeStoredArray","hasStringAccessor","setColumnsPinning","pinning","prev","alignedColumnsPinning","aligned","col","c","resetColumnsPinning","import_hooks","import_react","useDataTableColumnReorder","key","columns","getInitialValueInEffect","defaultColumnsOrder","column","storedColumnsOrder","_setColumnsOrder","columnsOrder","sanitizeStoredArray","item","setColumnsOrder","order","alignedColumnsOrder","aligned","col","c","resetColumnsOrder","import_hooks","import_react","useDataTableColumnResize","key","columns","getInitialValueInEffect","headerRef","hasResizableColumns","c","getDefaultColumnsWidth","column","rawStoredColumnsWidth","setStoredColumnsWidth","storedColumnsWidth","sanitizeStoredArray","item","effectiveColumnsWidth","setEffectiveColumnsWidth","isResizing","setIsResizing","dirtyRef","prev","validAccessors","filtered","entry","present","added","accessor","updateColumnWidths","updates","u","col","update","setColumnWidth","width","setMultipleColumnWidths","beginResize","thead","cells","snapshot","cell","endResize","resetColumnsWidth","defaults","allResizableWidthsInitial","resizable","cw","measureAndSetColumnWidths","import_react","import_hooks","import_react","useDataTableColumnToggle","key","columns","getInitialValueInEffect","defaultColumnsToggle","column","storedColumnsToggle","_setColumnsToggle","columnsToggle","sanitizeStoredArray","hasStringAccessor","setColumnsToggle","toggle","alignedColumnsToggle","aligned","col","c","resetColumnsToggle","useDataTableColumns","key","columns","getInitialValueInEffect","headerRef","scrollViewportRef","columnsOrder","setColumnsOrder","resetColumnsOrder","useDataTableColumnReorder","columnsToggle","setColumnsToggle","resetColumnsToggle","useDataTableColumnToggle","columnsPinning","setColumnsPinning","resetColumnsPinning","useDataTableColumnPinning","columnsWidth","setColumnsWidth","setColumnWidth","setMultipleColumnWidths","resetColumnsWidth","hasResizableColumns","allResizableWidthsInitial","measureAndSetColumnWidths","isResizing","beginResize","endResize","useDataTableColumnResize","effectiveColumns","result","order","column","pinningState","p","effectivePinned","toggle","leftPinned","c","unpinned","rightPinned","accessor","widthEntry","entry","width","isLocked","visible","tableWidth","sum","col","w","n","import_core","import_react","import_react","useIsomorphicLayoutEffect","import_react","useStableValue","value","ref","VAR_HEADER_HEIGHT","VAR_FOOTER_HEIGHT","VAR_SELECTION_COLUMN_WIDTH","VAR_LAST_ROW_BORDER_BOTTOM","setCssVar","root","name","value","getRect","entry","boxSize","observe","elem","onChange","onCancel","observer","entries","useDataTableInjectCssVariables","scrollCallbacks","withRowBorders","refs","table","scrollViewport","header","footer","selectionColumnHeader","stableDependencies","useStableValue","stableScrollCallbacks","processScrollingRef","processLastRowBottomBorderRef","onScroll","ev","rect","useIsomorphicLayoutEffect","scrollPosition","tableRect","scrollRect","setScrolledTo","pos","old","processFooterPosition","diff","relative","processLastRowBottomBorder","processScrolling","callbacks","viewport","scrollTop","scrollLeft","newScrolledToTop","newScrolledToBottom","scrolledToTop","scrolledToBottom","isRtl","maxScrollLeft","newScrolledToLeft","newScrolledToRight","absScrollLeft","scrolledToLeft","scrolledToRight","import_react","useDataTablePinnedColumns","columns","theadRef","tbodyRef","selectionColumnHeaderRef","selectionVisible","pinFirstColumn","pinLastColumn","pinnedMap","setPinnedMap","recalculate","c","measurementSection","isTheadSource","measurementRow","isRtl","widths","th","accessor","w","visibleCols","td","i","selectionWidth","selCell","renderedAccessors","resolvedPinned","col","acc","leftPinned","rightPinned","newMap","leftOffset","rightOffset","rightReversed","prev","k","v","pv","section","row","observer","cell","useIsomorphicLayoutEffect","hasLeftPinned","info","hasRightPinned","import_react","useLastSelectionChangeIndex","recordIds","lastSelectionChangeIndex","setLastSelectionChangeIndex","recordIdsString","import_react","attachMediaListeners","queries","callback","callbackWrapper","query","subscriptions","unsubscribe","getInitialValue","initialValues","useMediaQueries","getInitialValueInEffect","matches","setMatches","queryRef","queryResult","event","import_core","import_react","useMediaQueriesStringOrFunction","queries","theme","values","query","defaults","useMediaQueries","import_core","import_hooks","useMediaQueryStringOrFunction","mediaQuery","theme","mediaQueryValue","import_react","useRowExpansion","rowExpansion","records","idAccessor","initiallyExpandedRecordIds","trigger","allowMultiple","initiallyExpanded","r","getRecordId","record","index","expandedRecordIds","setExpandedRecordIds","expandedRecordIdsState","expandable","collapseProps","content","collapseRow","id","recordId","import_hooks","import_react","useRowExpansionStatus","open","transitionDuration","expanded","setExpanded","visible","setVisible","expand","hide","NOWRAP","ELLIPSIS","POINTER_CURSOR","CONTEXT_MENU_CURSOR","TEXT_SELECTION_DISABLED","TEXT_ALIGN_LEFT","TEXT_ALIGN_CENTER","TEXT_ALIGN_RIGHT","import_jsx_runtime","DataTableFooterCell","className","style","pinnedInfo","visibleMediaQuery","title","noWrap","ellipsis","textAlign","width","useMediaQueryStringOrFunction","clsx","NOWRAP","ELLIPSIS","TEXT_ALIGN_LEFT","TEXT_ALIGN_CENTER","TEXT_ALIGN_RIGHT","import_core","import_jsx_runtime","DataTableFooterSelectorPlaceholderCell","shadowVisible","import_jsx_runtime","DataTableFooter","className","style","columns","defaultColumnProps","pinnedMap","selectionVisible","selectorCellShadowVisible","ref","clsx","DataTableFooterSelectorPlaceholderCell","hidden","columnProps","accessor","visibleMediaQuery","textAlign","width","footer","footerClassName","footerStyle","noWrap","ellipsis","DataTableFooterCell","import_core","import_clsx","import_react","import_core","import_clsx","import_react","import_jsx_runtime","DataTableColumnGroupHeaderCell","id","columns","groups","title","textAlign","className","style","pinnedInfo","maxDepth","currentDepth","previousGroups","isLastGroup","withColumnBorders","totalTableColumns","allColumns","flattenColumns","queries","visibleMediaQuery","visibles","useMediaQueriesStringOrFunction","colSpan","calculateColSpan","columnsBeforeGroup","sum","g","rowSpan","hasMoreColumns","needsBorder","needsRightBorder","clsx","TEXT_ALIGN_LEFT","TEXT_ALIGN_CENTER","TEXT_ALIGN_RIGHT","humanize","import_core","import_clsx","import_react","import_core","import_hooks","import_jsx_runtime","IconFilter","import_jsx_runtime","IconFilterFilled","import_jsx_runtime","DataTableHeaderCellFilter","children","isActive","filterPopoverProps","filterPopoverDisableClickOutside","isOpen","close","toggle","Icon","IconFilterFilled","IconFilter","ref","e","import_core","import_react","import_jsx_runtime","IconArrowLeft","import_jsx_runtime","IconArrowRight","import_jsx_runtime","IconPin","import_jsx_runtime","IconX","import_jsx_runtime","DataTablePinnableDropdown","currentPinned","onPinChange","opened","setOpened","containerRef","isRtl","setIsRtl","detectDirection","computedDir","useIsomorphicLayoutEffect","leftArrowPinValue","rightArrowPinValue","isLeftArrowActive","isRightArrowActive","e","IconPin","IconArrowLeft","IconArrowRight","IconX","import_core","import_react","import_jsx_runtime","MIN_COLUMN_WIDTH","DataTableResizableHeaderHandle","props","accessor","columnRef","isResizing","setIsResizing","startXRef","originalWidthsRef","dir","isRTL","setMultipleColumnWidths","beginResize","endResize","useDataTableColumnsContext","handleMouseDown","event","currentColumn","nextColumn","nextAccessor","startCurrentWidth","startNextWidth","handleMouseMove","moveEvent","deltaX","maxShrinkCurrent","maxShrinkNext","constrainedDelta","finalCurrentWidth","finalNextWidth","handleMouseUp","handleDoubleClick","updates","import_jsx_runtime","IconArrowsVertical","import_jsx_runtime","IconArrowUp","import_jsx_runtime","IconGripVertical","import_jsx_runtime","DataTableHeaderCell","className","style","pinnedInfo","accessor","visibleMediaQuery","title","sortable","draggable","toggleable","pinnable","resizable","sortIcons","textAlign","width","sortStatus","onSortStatusChange","filter","filterPopoverProps","filterPopoverDisableClickOutside","filtering","sortKey","setSourceColumn","setTargetColumn","swapColumns","columnsToggle","setColumnsToggle","columnsPinning","setColumnsPinning","useDataTableColumnsContext","dragOver","setDragOver","columnRef","currentPinned","p","useMediaQueryStringOrFunction","text","humanize","tooltip","sortAction","e","handleColumnDragStart","handleColumnDragOver","handleColumnDrop","handleColumnDragEnter","handleColumnDragLeave","handleColumnToggle","c","handlePinChange","pinned","prev","clsx","IconGripVertical","TEXT_ALIGN_LEFT","TEXT_ALIGN_CENTER","TEXT_ALIGN_RIGHT","NOWRAP","ELLIPSIS","DataTablePinnableDropdown","IconX","IconArrowUp","IconArrowsVertical","DataTableHeaderCellFilter","DataTableResizableHeaderHandle","import_core","import_clsx","import_jsx_runtime","DataTableHeaderSelectorCell","className","style","trigger","shadowVisible","checked","indeterminate","checkboxProps","onChange","rowSpan","ref","enabled","clsx","POINTER_CURSOR","import_jsx_runtime","getGroupPinnedInfo","group","pinnedMap","leafAccessors","c","pinnedInfos","acc","logicalSides","p","logicalSide","targetAcc","info","boundaryAcc","boundaryInfo","DataTableHeader","selectionColumnHeaderRef","className","style","sortStatus","sortIcons","onSortStatusChange","columns","defaultColumnProps","groups","selectionTrigger","selectionVisible","selectionChecked","selectionIndeterminate","onSelectionChange","selectionCheckboxProps","selectorCellShadowVisible","selectionColumnClassName","selectionColumnStyle","withColumnBorders","ref","maxGroupDepth","getMaxGroupDepth","totalHeaderRows","allRecordsSelectorCell","DataTableHeaderSelectorCell","columnsToggle","setColumnsToggle","useDataTableColumnsContext","columnsPopoverOpened","setColumnsPopoverOpened","someColumnsToggleable","column","columnToggleCheckboxLabels","accessor","title","humanize","content","clsx","e","_","depthIndex","groupsAtDepth","getGroupsAtDepth","index","DataTableColumnGroupHeaderCell","hidden","columnProps","visibleMediaQuery","textAlign","width","sortable","draggable","toggleable","pinnable","resizable","titleClassName","titleStyle","filter","filterPopoverProps","filterPopoverDisableClickOutside","filtering","sortKey","DataTableHeaderCell","import_core","import_clsx","import_jsx_runtime","DataTableLoader","fetching","customContent","backgroundBlur","size","type","color","clsx","import_core","import_clsx","import_core","import_clsx","import_jsx_runtime","IconSelector","import_jsx_runtime","HEIGHT","DataTablePageSizeSelector","size","label","values","value","activeTextColor","activeBackgroundColor","onChange","IconSelector","theme","v","isCurrent","clsx","getPaginationCssVariables","import_jsx_runtime","DataTablePagination","className","style","fetching","page","onPageChange","paginationWithEdges","paginationWithControls","paginationActiveTextColor","paginationActiveBackgroundColor","paginationSize","loadingText","noRecordsText","paginationText","totalRecords","recordsPerPage","onRecordsPerPageChange","recordsPerPageLabel","recordsPerPageOptions","recordsLength","horizontalSpacing","paginationWrapBreakpoint","getPaginationControlProps","getPaginationItemProps","renderPagination","paginationTextValue","from","to","totalPages","isWrapped","useMediaQueryStringOrFunction","breakpoints","Controls","props","DataTablePageSizeSelector","clsx","theme","getPaginationCssVariables","ctx","n","import_core","import_clsx","import_core","import_clsx","import_jsx_runtime","DataTableRowCell","className","style","pinnedInfo","visibleMediaQuery","record","index","onClick","onDoubleClick","onContextMenu","noWrap","ellipsis","textAlign","width","accessor","render","defaultRender","customCellAttributes","useMediaQueryStringOrFunction","clsx","NOWRAP","ELLIPSIS","POINTER_CURSOR","CONTEXT_MENU_CURSOR","TEXT_ALIGN_LEFT","TEXT_ALIGN_CENTER","TEXT_ALIGN_RIGHT","getValueAtPath","import_core","import_jsx_runtime","DataTableRowExpansion","open","colSpan","content","collapseProps","expanded","visible","useRowExpansionStatus","import_core","import_clsx","import_jsx_runtime","DataTableRowSelectorCell","className","style","record","index","trigger","onChange","withRightShadow","checkboxProps","getCheckboxProps","otherProps","allCheckboxProps","enabled","handleClick","e","clsx","POINTER_CURSOR","import_jsx_runtime","DataTableRow","record","index","columns","defaultColumnProps","pinnedMap","defaultColumnRender","selectionTrigger","selectionVisible","selectionChecked","onSelectionChange","isRecordSelectable","selectionCheckboxProps","getSelectionCheckboxProps","onClick","onDoubleClick","onContextMenu","onCellClick","onCellDoubleClick","onCellContextMenu","expansion","customAttributes","color","backgroundColor","className","style","selectorCellShadowVisible","selectionColumnClassName","selectionColumnStyle","rowFactory","cols","DataTableRowSelectorCell","hidden","hiddenContent","columnProps","columnIndex","accessor","visibleMediaQuery","textAlign","noWrap","ellipsis","width","render","cellsClassName","cellsStyle","customCellAttributes","DataTableRowCell","event","expandedElement","DataTableRowExpansion","rowProps","getRowProps","clsx","POINTER_CURSOR","CONTEXT_MENU_CURSOR","e","isExpandable","isRowExpanded","expandOnClick","expandRow","collapseRow","theme","colorValue","backgroundColorValue","getRowCssVariables","import_core","import_clsx","import_jsx_runtime","DataTableScrollArea","leftShadowBehind","rightShadowBehind","onScrollPositionChange","children","viewportRef","scrollAreaProps","clsx","import_jsx_runtime","DataTable","withTableBorder","borderRadius","textSelectionDisabled","height","minHeight","maxHeight","shadow","verticalAlign","fetching","columns","storeColumnsKey","groups","pinFirstColumn","pinLastColumn","defaultColumnProps","defaultColumnRender","idAccessor","records","selectionTrigger","selectedRecords","onSelectedRecordsChange","selectionColumnClassName","selectionColumnStyle","isRecordSelectable","selectionCheckboxProps","allRecordsSelectionCheckboxProps","getRecordSelectionCheckboxProps","_","index","sortStatus","sortIcons","onSortStatusChange","horizontalSpacing","page","onPageChange","totalRecords","recordsPerPage","onRecordsPerPageChange","recordsPerPageOptions","recordsPerPageLabel","paginationWithEdges","paginationWithControls","paginationActiveTextColor","paginationActiveBackgroundColor","paginationSize","paginationText","from","to","paginationWrapBreakpoint","getPaginationControlProps","control","getPaginationItemProps","renderPagination","loaderBackgroundBlur","customLoader","loaderSize","loaderType","loaderColor","loadingText","emptyState","noRecordsText","noRecordsIcon","highlightOnHover","striped","noHeader","onRowClick","onRowDoubleClick","onRowContextMenu","onCellClick","onCellDoubleClick","onCellContextMenu","onScroll","onScrollToTop","onScrollToBottom","onScrollToLeft","onScrollToRight","c","backgroundColor","borderColor","rowBorderColor","stripedColor","highlightOnHoverColor","rowColor","rowBackgroundColor","rowExpansion","rowClassName","rowStyle","customRowAttributes","scrollViewportRef","scrollAreaProps","tableRef","bodyRef","m","my","mx","mt","mb","ml","mr","className","classNames","style","styles","rowFactory","tableWrapper","otherProps","flatColumns","flattenColumns","refs","handleScrollPositionChange","useDataTableInjectCssVariables","dragToggle","useDataTableColumns","effectiveColumns","mergedTableRef","mergedViewportRef","internalBodyRef","mergedBodyRef","rowExpansionInfo","useRowExpansion","pinnedMap","hasLeftPinned","hasRightPinned","useDataTablePinnedColumns","resetScrollPending","prevPageRef","recordsAtPageChangeRef","handlePageChange","newPage","recordsLength","viewport","raf","recordIds","record","getRecordId","selectionColumnVisible","selectedRecordIds","hasRecordsAndSelectedRecords","selectableRecords","selectableRecordIds","allSelectableRecordsSelected","id","someRecordsSelected","handleHeaderSelectionChange","uniqBy","lastSelectionChangeIndex","setLastSelectionChangeIndex","useLastSelectionChangeIndex","selectorCellShadowVisible","marginProperties","TableWrapper","children","DataTableColumnsProvider","clsx","theme","getTableCssVariables","DataTableScrollArea","TEXT_SELECTION_DISABLED","DataTableHeader","recordId","isSelected","handleSelectionChange","e","targetRecords","rec","idx","differenceBy","r","DataTableRow","DataTableEmptyRow","footer","DataTableFooter","DataTablePagination","DataTableLoader","DataTableEmptyState","import_core","import_hooks","import_react","import_jsx_runtime","DataTableDraggableRow","className","children","isDragging","refProp","otherProps","ref","mergedRef","headerRow","index","headerCellDimensions","cell"]}
|